@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.
- package/CHANGELOG.md +52 -61
- package/README.github.md +2 -2
- package/README.md +2 -2
- package/README.md.backup +284 -224
- package/README.npm.md +2 -2
- package/dist/cache/LRUCache.d.ts +3 -0
- package/dist/cache/LRUCache.d.ts.map +1 -1
- package/dist/cache/LRUCache.js +36 -26
- package/dist/config/env.d.ts +14 -4
- package/dist/config/env.d.ts.map +1 -1
- package/dist/config/env.js +20 -6
- package/dist/di/Container.d.ts +21 -0
- package/dist/di/Container.d.ts.map +1 -1
- package/dist/di/Container.js +250 -53
- package/dist/elements/BaseElement.d.ts.map +1 -1
- package/dist/elements/BaseElement.js +5 -10
- package/dist/elements/base/BaseElementManager.d.ts +22 -0
- package/dist/elements/base/BaseElementManager.d.ts.map +1 -1
- package/dist/elements/base/BaseElementManager.js +47 -7
- package/dist/elements/memories/Memory.d.ts +1 -0
- package/dist/elements/memories/Memory.d.ts.map +1 -1
- package/dist/elements/memories/Memory.js +12 -8
- package/dist/elements/memories/MemoryManager.d.ts.map +1 -1
- package/dist/elements/memories/MemoryManager.js +23 -42
- package/dist/elements/memories/MemorySearchIndex.js +2 -2
- package/dist/generated/version.d.ts +2 -2
- package/dist/generated/version.d.ts.map +1 -1
- package/dist/generated/version.js +3 -3
- package/dist/handlers/EnhancedIndexHandler.js +6 -6
- package/dist/handlers/element-crud/listElements.d.ts +2 -0
- package/dist/handlers/element-crud/listElements.d.ts.map +1 -1
- package/dist/handlers/element-crud/listElements.js +3 -1
- package/dist/handlers/mcp-aql/Gatekeeper.d.ts.map +1 -1
- package/dist/handlers/mcp-aql/Gatekeeper.js +23 -17
- package/dist/handlers/mcp-aql/MCPAQLHandler.d.ts +14 -0
- package/dist/handlers/mcp-aql/MCPAQLHandler.d.ts.map +1 -1
- package/dist/handlers/mcp-aql/MCPAQLHandler.js +110 -14
- package/dist/handlers/mcp-aql/OperationRouter.d.ts.map +1 -1
- package/dist/handlers/mcp-aql/OperationRouter.js +13 -1
- package/dist/handlers/mcp-aql/OperationSchema.d.ts +7 -0
- package/dist/handlers/mcp-aql/OperationSchema.d.ts.map +1 -1
- package/dist/handlers/mcp-aql/OperationSchema.js +52 -1
- package/dist/handlers/mcp-aql/evaluatePermission.d.ts +53 -0
- package/dist/handlers/mcp-aql/evaluatePermission.d.ts.map +1 -0
- package/dist/handlers/mcp-aql/evaluatePermission.js +132 -0
- package/dist/handlers/mcp-aql/policies/ToolClassification.d.ts.map +1 -1
- package/dist/handlers/mcp-aql/policies/ToolClassification.js +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -3
- package/dist/logging/LogHooks.js +11 -11
- package/dist/logging/LogManager.d.ts +0 -2
- package/dist/logging/LogManager.d.ts.map +1 -1
- package/dist/logging/LogManager.js +1 -3
- package/dist/logging/sinks/MemoryLogSink.d.ts +2 -0
- package/dist/logging/sinks/MemoryLogSink.d.ts.map +1 -1
- package/dist/logging/sinks/MemoryLogSink.js +12 -3
- package/dist/logging/types.d.ts +0 -2
- package/dist/logging/types.d.ts.map +1 -1
- package/dist/logging/types.js +1 -1
- package/dist/metrics/GatekeeperMetricsTracker.d.ts +32 -0
- package/dist/metrics/GatekeeperMetricsTracker.d.ts.map +1 -0
- package/dist/metrics/GatekeeperMetricsTracker.js +42 -0
- package/dist/metrics/MetricsManager.d.ts +47 -0
- package/dist/metrics/MetricsManager.d.ts.map +1 -0
- package/dist/metrics/MetricsManager.js +232 -0
- package/dist/metrics/OperationMetricsTracker.d.ts +32 -0
- package/dist/metrics/OperationMetricsTracker.d.ts.map +1 -0
- package/dist/metrics/OperationMetricsTracker.js +53 -0
- package/dist/metrics/collectors/DefaultElementProviderCollector.d.ts +27 -0
- package/dist/metrics/collectors/DefaultElementProviderCollector.d.ts.map +1 -0
- package/dist/metrics/collectors/DefaultElementProviderCollector.js +69 -0
- package/dist/metrics/collectors/FileLockManagerCollector.d.ts +16 -0
- package/dist/metrics/collectors/FileLockManagerCollector.d.ts.map +1 -0
- package/dist/metrics/collectors/FileLockManagerCollector.js +51 -0
- package/dist/metrics/collectors/GatekeeperMetricsCollector.d.ts +16 -0
- package/dist/metrics/collectors/GatekeeperMetricsCollector.d.ts.map +1 -0
- package/dist/metrics/collectors/GatekeeperMetricsCollector.js +76 -0
- package/dist/metrics/collectors/LRUCacheCollector.d.ts +18 -0
- package/dist/metrics/collectors/LRUCacheCollector.d.ts.map +1 -0
- package/dist/metrics/collectors/LRUCacheCollector.js +95 -0
- package/dist/metrics/collectors/OperationMetricsCollector.d.ts +16 -0
- package/dist/metrics/collectors/OperationMetricsCollector.d.ts.map +1 -0
- package/dist/metrics/collectors/OperationMetricsCollector.js +80 -0
- package/dist/metrics/collectors/OperationalTelemetryCollector.d.ts +17 -0
- package/dist/metrics/collectors/OperationalTelemetryCollector.d.ts.map +1 -0
- package/dist/metrics/collectors/OperationalTelemetryCollector.js +26 -0
- package/dist/metrics/collectors/PerformanceMonitorCollector.d.ts +14 -0
- package/dist/metrics/collectors/PerformanceMonitorCollector.d.ts.map +1 -0
- package/dist/metrics/collectors/PerformanceMonitorCollector.js +141 -0
- package/dist/metrics/collectors/SecurityMonitorCollector.d.ts +21 -0
- package/dist/metrics/collectors/SecurityMonitorCollector.d.ts.map +1 -0
- package/dist/metrics/collectors/SecurityMonitorCollector.js +56 -0
- package/dist/metrics/collectors/SecurityTelemetryCollector.d.ts +15 -0
- package/dist/metrics/collectors/SecurityTelemetryCollector.d.ts.map +1 -0
- package/dist/metrics/collectors/SecurityTelemetryCollector.js +112 -0
- package/dist/metrics/collectors/TriggerMetricsTrackerCollector.d.ts +16 -0
- package/dist/metrics/collectors/TriggerMetricsTrackerCollector.d.ts.map +1 -0
- package/dist/metrics/collectors/TriggerMetricsTrackerCollector.js +26 -0
- package/dist/metrics/collectors/index.d.ts +11 -0
- package/dist/metrics/collectors/index.d.ts.map +1 -0
- package/dist/metrics/collectors/index.js +11 -0
- package/dist/metrics/sinks/MemoryMetricsSink.d.ts +22 -0
- package/dist/metrics/sinks/MemoryMetricsSink.d.ts.map +1 -0
- package/dist/metrics/sinks/MemoryMetricsSink.js +121 -0
- package/dist/metrics/types.d.ts +98 -0
- package/dist/metrics/types.d.ts.map +1 -0
- package/dist/metrics/types.js +24 -0
- package/dist/portfolio/DefaultElementProvider.d.ts.map +1 -1
- package/dist/portfolio/DefaultElementProvider.js +1 -7
- package/dist/portfolio/EnhancedIndexManager.d.ts.map +1 -1
- package/dist/portfolio/EnhancedIndexManager.js +18 -18
- package/dist/portfolio/NLPScoringManager.d.ts.map +1 -1
- package/dist/portfolio/NLPScoringManager.js +5 -9
- package/dist/portfolio/PortfolioIndexManager.js +2 -2
- package/dist/portfolio/RelationshipManager.js +2 -2
- package/dist/portfolio/VerbTriggerManager.d.ts.map +1 -1
- package/dist/portfolio/VerbTriggerManager.js +5 -19
- package/dist/portfolio/config/IndexConfig.d.ts.map +1 -1
- package/dist/portfolio/config/IndexConfig.js +1 -12
- package/dist/portfolio/enhanced-index/ElementDefinitionBuilder.d.ts.map +1 -1
- package/dist/portfolio/enhanced-index/ElementDefinitionBuilder.js +3 -15
- package/dist/portfolio/enhanced-index/SemanticRelationshipService.d.ts.map +1 -1
- package/dist/portfolio/enhanced-index/SemanticRelationshipService.js +2 -16
- package/dist/portfolio/types/RelationshipTypes.d.ts.map +1 -1
- package/dist/portfolio/types/RelationshipTypes.js +3 -17
- package/dist/security/audit/config/suppressions.d.ts.map +1 -1
- package/dist/security/audit/config/suppressions.js +36 -8
- package/dist/security/constants.d.ts.map +1 -1
- package/dist/security/constants.js +10 -6
- package/dist/security/fileLockManager.d.ts.map +1 -1
- package/dist/security/fileLockManager.js +8 -6
- package/dist/security/secureYamlParser.d.ts.map +1 -1
- package/dist/security/secureYamlParser.js +1 -13
- package/dist/security/securityMonitor.d.ts +2 -1
- package/dist/security/securityMonitor.d.ts.map +1 -1
- package/dist/security/securityMonitor.js +14 -3
- package/dist/security/telemetry/SecurityTelemetry.d.ts +16 -0
- package/dist/security/telemetry/SecurityTelemetry.d.ts.map +1 -1
- package/dist/security/telemetry/SecurityTelemetry.js +30 -2
- package/dist/security/tokenManager.d.ts +3 -0
- package/dist/security/tokenManager.d.ts.map +1 -1
- package/dist/security/tokenManager.js +13 -5
- package/dist/security/validation/BackgroundValidator.d.ts.map +1 -1
- package/dist/security/validation/BackgroundValidator.js +7 -7
- package/dist/server/startup.d.ts.map +1 -1
- package/dist/server/startup.js +8 -24
- package/dist/server/tools/MCPAQLTools.js +4 -1
- package/dist/services/ActivationStore.d.ts.map +1 -1
- package/dist/services/ActivationStore.js +9 -3
- package/dist/services/FileWatchService.d.ts +1 -0
- package/dist/services/FileWatchService.d.ts.map +1 -1
- package/dist/services/FileWatchService.js +83 -48
- package/dist/services/MetadataService.d.ts.map +1 -1
- package/dist/services/MetadataService.js +7 -2
- package/dist/services/query/ElementQueryService.d.ts.map +1 -1
- package/dist/services/query/ElementQueryService.js +1 -41
- package/dist/services/query/PaginationService.d.ts.map +1 -1
- package/dist/services/query/PaginationService.js +1 -14
- package/dist/services/query/SortService.d.ts.map +1 -1
- package/dist/services/query/SortService.js +1 -6
- package/dist/services/validation/ValidationService.d.ts.map +1 -1
- package/dist/services/validation/ValidationService.js +3 -8
- package/dist/storage/ElementStorageLayer.d.ts.map +1 -1
- package/dist/storage/ElementStorageLayer.js +5 -2
- package/dist/storage/MemoryStorageLayer.d.ts.map +1 -1
- package/dist/storage/MemoryStorageLayer.js +5 -2
- package/dist/telemetry/OperationalTelemetry.js +2 -2
- package/dist/utils/EventDeduplicator.d.ts +44 -0
- package/dist/utils/EventDeduplicator.d.ts.map +1 -0
- package/dist/utils/EventDeduplicator.js +93 -0
- package/dist/utils/FileLock.d.ts.map +1 -1
- package/dist/utils/FileLock.js +1 -9
- package/dist/utils/PerformanceMonitor.d.ts.map +1 -1
- package/dist/utils/PerformanceMonitor.js +5 -5
- package/dist/utils/SlidingWindowRateLimiter.d.ts +13 -0
- package/dist/utils/SlidingWindowRateLimiter.d.ts.map +1 -0
- package/dist/utils/SlidingWindowRateLimiter.js +23 -0
- package/dist/web/console/IngestRoutes.d.ts +84 -0
- package/dist/web/console/IngestRoutes.d.ts.map +1 -0
- package/dist/web/console/IngestRoutes.js +252 -0
- package/dist/web/console/LeaderElection.d.ts +89 -0
- package/dist/web/console/LeaderElection.d.ts.map +1 -0
- package/dist/web/console/LeaderElection.js +205 -0
- package/dist/web/console/LeaderForwardingSink.d.ts +61 -0
- package/dist/web/console/LeaderForwardingSink.d.ts.map +1 -0
- package/dist/web/console/LeaderForwardingSink.js +197 -0
- package/dist/web/console/SessionNames.d.ts +46 -0
- package/dist/web/console/SessionNames.d.ts.map +1 -0
- package/dist/web/console/SessionNames.js +257 -0
- package/dist/web/console/UnifiedConsole.d.ts +64 -0
- package/dist/web/console/UnifiedConsole.d.ts.map +1 -0
- package/dist/web/console/UnifiedConsole.js +119 -0
- package/dist/web/contentPipeline.d.ts +58 -0
- package/dist/web/contentPipeline.d.ts.map +1 -0
- package/dist/web/contentPipeline.js +112 -0
- package/dist/web/portDiscovery.d.ts +58 -0
- package/dist/web/portDiscovery.d.ts.map +1 -0
- package/dist/web/portDiscovery.js +143 -0
- package/dist/web/public/app.js +148 -60
- package/dist/web/public/logs.js +638 -0
- package/dist/web/public/metrics.js +682 -0
- package/dist/web/public/permissions.js +394 -0
- package/dist/web/public/sessions.js +369 -0
- package/dist/web/routes/healthRoutes.d.ts +16 -0
- package/dist/web/routes/healthRoutes.d.ts.map +1 -0
- package/dist/web/routes/healthRoutes.js +29 -0
- package/dist/web/routes/logRoutes.d.ts +18 -0
- package/dist/web/routes/logRoutes.d.ts.map +1 -0
- package/dist/web/routes/logRoutes.js +126 -0
- package/dist/web/routes/metricsRoutes.d.ts +17 -0
- package/dist/web/routes/metricsRoutes.d.ts.map +1 -0
- package/dist/web/routes/metricsRoutes.js +90 -0
- package/dist/web/routes/permissionRoutes.d.ts +16 -0
- package/dist/web/routes/permissionRoutes.d.ts.map +1 -0
- package/dist/web/routes/permissionRoutes.js +133 -0
- package/dist/web/routes.d.ts.map +1 -1
- package/dist/web/routes.js +309 -339
- package/dist/web/server.d.ts +21 -1
- package/dist/web/server.d.ts.map +1 -1
- package/dist/web/server.js +42 -4
- package/dist/web/sinks/WebSSELogSink.d.ts +15 -0
- package/dist/web/sinks/WebSSELogSink.d.ts.map +1 -0
- package/dist/web/sinks/WebSSELogSink.js +22 -0
- package/dist/web/sinks/WebSSEMetricsSink.d.ts +16 -0
- package/dist/web/sinks/WebSSEMetricsSink.d.ts.map +1 -0
- package/dist/web/sinks/WebSSEMetricsSink.js +23 -0
- package/package.json +2 -2
- package/server.json +2 -2
- package/dist/constants/version.d.ts +0 -3
- package/dist/constants/version.d.ts.map +0 -1
- package/dist/constants/version.js +0 -4
- package/dist/logging/sinks/SSELogSink.d.ts +0 -35
- package/dist/logging/sinks/SSELogSink.d.ts.map +0 -1
- package/dist/logging/sinks/SSELogSink.js +0 -181
- package/dist/logging/viewer/viewerHtml.d.ts +0 -8
- package/dist/logging/viewer/viewerHtml.d.ts.map +0 -1
- package/dist/logging/viewer/viewerHtml.js +0 -204
- package/dist/web/public/public/app.js +0 -1878
|
@@ -138,15 +138,15 @@ export class EnhancedIndexManager {
|
|
|
138
138
|
logger.info('Loading Enhanced Index from cache file');
|
|
139
139
|
await this.loadIndex();
|
|
140
140
|
}
|
|
141
|
-
else {
|
|
142
|
-
logger.debug('Using cached Enhanced Index from memory');
|
|
143
|
-
}
|
|
144
141
|
const elapsed = Date.now() - startTime;
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
142
|
+
// Only log at info for non-trivial operations (actual loads/builds)
|
|
143
|
+
if (operation !== 'cached' || elapsed > 10) {
|
|
144
|
+
logger.info('Enhanced Index operation completed', {
|
|
145
|
+
operation,
|
|
146
|
+
elapsedMs: elapsed,
|
|
147
|
+
elements: this.index?.metadata?.total_elements || 0
|
|
148
|
+
});
|
|
149
|
+
}
|
|
150
150
|
if (elapsed > 1000) {
|
|
151
151
|
logger.warn('Enhanced Index operation took longer than expected', {
|
|
152
152
|
elapsedMs: elapsed,
|
|
@@ -599,11 +599,14 @@ export class EnhancedIndexManager {
|
|
|
599
599
|
stats.maxDuration = Math.max(stats.maxDuration, duration);
|
|
600
600
|
stats.minDuration = Math.min(stats.minDuration, duration);
|
|
601
601
|
stats.lastMetrics = { ...metrics, duration };
|
|
602
|
-
//
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
602
|
+
// Per-element telemetry aggregated in periodic Telemetry Report;
|
|
603
|
+
// only log slow operations (>50ms) individually
|
|
604
|
+
if (duration > 50) {
|
|
605
|
+
logger.debug(`Slow telemetry: ${operationName}`, {
|
|
606
|
+
duration,
|
|
607
|
+
...metrics,
|
|
608
|
+
});
|
|
609
|
+
}
|
|
607
610
|
// Schedule periodic reporting
|
|
608
611
|
this.scheduleTelemetryReport();
|
|
609
612
|
}
|
|
@@ -669,7 +672,6 @@ export class EnhancedIndexManager {
|
|
|
669
672
|
await this.fileOperations.writeFile(this.indexPath, yamlContent, {
|
|
670
673
|
source: 'EnhancedIndexManager.writeToFile'
|
|
671
674
|
});
|
|
672
|
-
logger.debug('Index saved to file', { path: this.indexPath });
|
|
673
675
|
}
|
|
674
676
|
catch (error) {
|
|
675
677
|
logger.error('Failed to save index', error);
|
|
@@ -703,8 +705,7 @@ export class EnhancedIndexManager {
|
|
|
703
705
|
logger.debug('Enhanced index not in memory but file is fresh, will load from file');
|
|
704
706
|
return false; // We can load the fresh file, no rebuild needed
|
|
705
707
|
}
|
|
706
|
-
// File is fresh and we have it in memory
|
|
707
|
-
logger.debug('Enhanced index is current, no rebuild needed');
|
|
708
|
+
// File is fresh and we have it in memory — no rebuild needed
|
|
708
709
|
return false;
|
|
709
710
|
}
|
|
710
711
|
catch (error) {
|
|
@@ -1030,7 +1031,6 @@ export class EnhancedIndexManager {
|
|
|
1030
1031
|
if (timeSinceLastCleanup < minCleanupInterval) {
|
|
1031
1032
|
return;
|
|
1032
1033
|
}
|
|
1033
|
-
logger.debug('Performing memory cleanup for Enhanced Index');
|
|
1034
1034
|
// Clear NLP scoring caches
|
|
1035
1035
|
if (this.nlpScoring) {
|
|
1036
1036
|
this.nlpScoring.clearCache?.();
|
|
@@ -1110,4 +1110,4 @@ export class EnhancedIndexManager {
|
|
|
1110
1110
|
}
|
|
1111
1111
|
}
|
|
1112
1112
|
}
|
|
1113
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRW5oYW5jZWRJbmRleE1hbmFnZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcG9ydGZvbGlvL0VuaGFuY2VkSW5kZXhNYW5hZ2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBbUJHO0FBRUgsT0FBTyxLQUFLLElBQUksTUFBTSxNQUFNLENBQUM7QUFDN0IsT0FBTyxFQUFFLElBQUksSUFBSSxRQUFRLEVBQUUsSUFBSSxJQUFJLFFBQVEsRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUM3RCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFFNUMsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ2pFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDRDQUE0QyxDQUFDO0FBSzlFLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNoRCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFHdkQsT0FBTyxFQUNMLGFBQWEsRUFDYixxQkFBcUIsRUFDckIseUJBQXlCLEVBQzFCLE1BQU0sb0NBQW9DLENBQUM7QUEwQzVDLE1BQU0sT0FBTyxvQkFBb0I7SUFDdkIsS0FBSyxHQUF5QixJQUFJLENBQUM7SUFDbkMsU0FBUyxDQUFTO0lBQ2xCLFVBQVUsR0FBZ0IsSUFBSSxDQUFDO0lBQy9CLE1BQU0sQ0FBUztJQUNmLFVBQVUsR0FBRyxLQUFLLENBQUMsQ0FBRSxnQ0FBZ0M7SUFDckQsVUFBVSxDQUFvQjtJQUM5QixZQUFZLENBQXFCO0lBQ2pDLG1CQUFtQixDQUFzQjtJQUN6QyxNQUFNLENBQXFCO0lBQ2xCLGFBQWEsQ0FBZ0I7SUFDN0IscUJBQXFCLENBQXdCO0lBQ3RELFFBQVEsQ0FBVztJQUNuQixxQkFBcUIsR0FBMEIsSUFBSSxDQUFDO0lBQ3BELGlCQUFpQixHQUFTLElBQUksSUFBSSxFQUFFLENBQUM7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RXhCLElBQUksQ0FBQztZQUNILE1BQU0sSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNwQyxDQUFDO1FBQUMsT0FBTyxNQUFNLEVBQUUsQ0FBQztZQUNoQiw4QkFBOEI7UUFDaEMsQ0FBQztRQUNELElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxFQUFFLENBQUM7UUFFOUIsSUFBSSxJQUFJLENBQUMsVUFBVSxJQUFJLE9BQVEsSUFBSSxDQUFDLFVBQWtCLENBQUMsT0FBTyxLQUFLLFVBQVUsRUFBRSxDQUFDO1lBQzdFLElBQUksQ0FBQyxVQUFrQixDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ3JDLENBQUM7UUFFRCw0QkFBNEI7UUFDNUIsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDbEIsTUFBTSxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsR0FBRSxDQUFDLENBQUMsQ0FBQztRQUNoRCxDQUFDO0lBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogRW5oYW5jZWQgSW5kZXggTWFuYWdlciAtIFBlcnNpc3RlbnQgWUFNTCBpbmRleCB3aXRoIGV4dGVuc2libGUgc2NoZW1hXG4gKlxuICogRmVhdHVyZXM6XG4gKiAtIEV4dGVuc2libGUgc2NoZW1hIHN1cHBvcnRpbmcgYXJiaXRyYXJ5IGVsZW1lbnQgdHlwZXMgYW5kIG1ldGFkYXRhXG4gKiAtIFBlcnNpc3RlbnQgWUFNTCBzdG9yYWdlIGZvciBodW1hbiByZWFkYWJpbGl0eVxuICogLSBJbmNyZW1lbnRhbCB1cGRhdGVzIHdpdGhvdXQgZnVsbCByZWdlbmVyYXRpb25cbiAqIC0gQmFja3dhcmQgY29tcGF0aWJsZSB3aXRoIHNjaGVtYSBldm9sdXRpb25cbiAqIC0gU2VydmVyLXNpZGUgc2VtYW50aWMgaW50ZWxsaWdlbmNlXG4gKlxuICogVGhpcyBtYW5hZ2VyIGNyZWF0ZXMgYW5kIG1haW50YWlucyBhIGNhcGFiaWxpdHkgaW5kZXggdGhhdCBlbmFibGVzOlxuICogLSBWZXJiLWJhc2VkIGFjdGlvbiB0cmlnZ2Vyc1xuICogLSBDcm9zcy1lbGVtZW50IHJlbGF0aW9uc2hpcHNcbiAqIC0gU2VtYW50aWMgc2NvcmluZyB3aXRoIEphY2NhcmQvZW50cm9weVxuICogLSBDb250ZXh0LWF3YXJlIGVsZW1lbnQgZGlzY292ZXJ5XG4gKlxuICogRklYRVMgSU1QTEVNRU5URUQgKElzc3VlICMxMDk5KTpcbiAqIC0gVXNlcyBjZW50cmFsaXplZCBlbGVtZW50IElEIHBhcnNpbmcgdXRpbGl0aWVzXG4gKiAtIENvbnNpc3RlbnQgSUQgZm9ybWF0IGhhbmRsaW5nIHRocm91Z2hvdXRcbiAqL1xuXG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgZHVtcCBhcyB5YW1sRHVtcCwgbG9hZCBhcyB5YW1sTG9hZCB9IGZyb20gJ2pzLXlhbWwnO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vdXRpbHMvbG9nZ2VyLmpzJztcbmltcG9ydCB7IFBvcnRmb2xpb0luZGV4TWFuYWdlciB9IGZyb20gJy4vUG9ydGZvbGlvSW5kZXhNYW5hZ2VyLmpzJztcbmltcG9ydCB7IFNlY3VyaXR5TW9uaXRvciB9IGZyb20gJy4uL3NlY3VyaXR5L3NlY3VyaXR5TW9uaXRvci5qcyc7XG5pbXBvcnQgeyBVbmljb2RlVmFsaWRhdG9yIH0gZnJvbSAnLi4vc2VjdXJpdHkvdmFsaWRhdG9ycy91bmljb2RlVmFsaWRhdG9yLmpzJztcbmltcG9ydCB7IE5MUFNjb3JpbmdNYW5hZ2VyIH0gZnJvbSAnLi9OTFBTY29yaW5nTWFuYWdlci5qcyc7XG5pbXBvcnQgeyBWZXJiVHJpZ2dlck1hbmFnZXIgfSBmcm9tICcuL1ZlcmJUcmlnZ2VyTWFuYWdlci5qcyc7XG5pbXBvcnQgeyBDb25maWdNYW5hZ2VyIH0gZnJvbSAnLi4vY29uZmlnL0NvbmZpZ01hbmFnZXIuanMnO1xuaW1wb3J0IHsgSW5kZXhDb25maWdNYW5hZ2VyIH0gZnJvbSAnLi9jb25maWcvSW5kZXhDb25maWcuanMnO1xuaW1wb3J0IHsgRmlsZUxvY2sgfSBmcm9tICcuLi91dGlscy9GaWxlTG9jay5qcyc7XG5pbXBvcnQgeyBwYXJzZUVsZW1lbnRJZCB9IGZyb20gJy4uL3V0aWxzL2VsZW1lbnRJZC5qcyc7XG5pbXBvcnQgeyBSZWxhdGlvbnNoaXBNYW5hZ2VyIH0gZnJvbSAnLi9SZWxhdGlvbnNoaXBNYW5hZ2VyLmpzJztcbmltcG9ydCB7IEZpbGVPcGVyYXRpb25zU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL0ZpbGVPcGVyYXRpb25zU2VydmljZS5qcyc7XG5pbXBvcnQge1xuICBNRU1PUllfTElNSVRTLFxuICBnZXRWYWxpZGF0ZWRCYXRjaFNpemUsXG4gIGdldFZhbGlkYXRlZEZsdXNoSW50ZXJ2YWxcbn0gZnJvbSAnLi4vY29uZmlnL3BlcmZvcm1hbmNlLWNvbnN0YW50cy5qcyc7XG5pbXBvcnQgeyBFbGVtZW50RGVmaW5pdGlvbkJ1aWxkZXIgfSBmcm9tICcuL2VuaGFuY2VkLWluZGV4L0VsZW1lbnREZWZpbml0aW9uQnVpbGRlci5qcyc7XG5pbXBvcnQge1xuICBBY3Rpb25UcmlnZ2VyRXh0cmFjdG9yLFxuICBUcmlnZ2VyRXh0cmFjdGlvbkNvbmZpZyxcbiAgVHJpZ2dlckV4dHJhY3Rpb25QYXR0ZXJuc1xufSBmcm9tICcuL2VuaGFuY2VkLWluZGV4L0FjdGlvblRyaWdnZXJFeHRyYWN0b3IuanMnO1xuaW1wb3J0IHsgVHJpZ2dlck1ldHJpY3NUcmFja2VyIH0gZnJvbSAnLi9lbmhhbmNlZC1pbmRleC9UcmlnZ2VyTWV0cmljc1RyYWNrZXIuanMnO1xuaW1wb3J0IHsgU2VtYW50aWNSZWxhdGlvbnNoaXBTZXJ2aWNlIH0gZnJvbSAnLi9lbmhhbmNlZC1pbmRleC9TZW1hbnRpY1JlbGF0aW9uc2hpcFNlcnZpY2UuanMnO1xuaW1wb3J0IHsgRW5oYW5jZWRJbmRleEhlbHBlcnMgfSBmcm9tICcuL2VuaGFuY2VkLWluZGV4L0VuaGFuY2VkSW5kZXhIZWxwZXJzLmpzJztcbmltcG9ydCB7XG4gIEVuaGFuY2VkSW5kZXgsXG4gIEluZGV4TWV0YWRhdGEsXG4gIEVsZW1lbnREZWZpbml0aW9uLFxuICBVc2VXaGVuUGF0dGVybixcbiAgUmVsYXRpb25zaGlwLFxuICBTZW1hbnRpY0RhdGEsXG4gIENvbnRleHRUcmFja2luZyxcbiAgS2V5d29yZFRyYWNraW5nLFxuICBSZWxhdGlvbnNoaXBUcmFja2luZyxcbiAgU2NvcmluZ0NvbmZpZyxcbiAgSW5kZXhPcHRpb25zLFxuICBFbGVtZW50UGF0aFxufSBmcm9tICcuL3R5cGVzL0luZGV4VHlwZXMuanMnO1xuXG4vLyBSZS1leHBvcnQgdHlwZXMgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHlcbmV4cG9ydCB0eXBlIHtcbiAgRW5oYW5jZWRJbmRleCxcbiAgSW5kZXhNZXRhZGF0YSxcbiAgRWxlbWVudERlZmluaXRpb24sXG4gIFVzZVdoZW5QYXR0ZXJuLFxuICBSZWxhdGlvbnNoaXAsXG4gIFNlbWFudGljRGF0YSxcbiAgQ29udGV4dFRyYWNraW5nLFxuICBLZXl3b3JkVHJhY2tpbmcsXG4gIFJlbGF0aW9uc2hpcFRyYWNraW5nLFxuICBTY29yaW5nQ29uZmlnLFxuICBJbmRleE9wdGlvbnMsXG4gIEVsZW1lbnRQYXRoXG59O1xuXG5cbmV4cG9ydCBjbGFzcyBFbmhhbmNlZEluZGV4TWFuYWdlciB7XG4gIHByaXZhdGUgaW5kZXg6IEVuaGFuY2VkSW5kZXggfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBpbmRleFBhdGg6IHN0cmluZztcbiAgcHJpdmF0ZSBsYXN0TG9hZGVkOiBEYXRlIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgVFRMX01TOiBudW1iZXI7XG4gIHByaXZhdGUgaXNCdWlsZGluZyA9IGZhbHNlOyAgLy8gVHJhY2sgaWYgaW5kZXggaXMgYmVpbmcgYnVpbHRcbiAgcHJpdmF0ZSBubHBTY29yaW5nOiBOTFBTY29yaW5nTWFuYWdlcjtcbiAgcHJpdmF0ZSB2ZXJiVHJpZ2dlcnM6IFZlcmJUcmlnZ2VyTWFuYWdlcjtcbiAgcHJpdmF0ZSByZWxhdGlvbnNoaXBNYW5hZ2VyOiBSZWxhdGlvbnNoaXBNYW5hZ2VyO1xuICBwcml2YXRlIGNvbmZpZzogSW5kZXhDb25maWdNYW5hZ2VyO1xuICBwcml2YXRlIHJlYWRvbmx5IGNvbmZpZ01hbmFnZXI6IENvbmZpZ01hbmFnZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgcG9ydGZvbGlvSW5kZXhNYW5hZ2VyOiBQb3J0Zm9saW9JbmRleE1hbmFnZXI7XG4gIHByaXZhdGUgZmlsZUxvY2s6IEZpbGVMb2NrO1xuICBwcml2YXRlIG1lbW9yeUNsZWFudXBJbnRlcnZhbDogTm9kZUpTLlRpbWVvdXQgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBsYXN0TWVtb3J5Q2xlYW51cDogRGF0ZSA9IG5ldyBEYXRlKCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgZWxlbWVudERlZmluaXRpb25CdWlsZGVyOiBFbGVtZW50RGVmaW5pdGlvbkJ1aWxkZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgYWN0aW9uVHJpZ2dlckV4dHJhY3RvcjogQWN0aW9uVHJpZ2dlckV4dHJhY3RvcjtcbiAgcHJpdmF0ZSByZWFkb25seSBtZXRyaWNzVHJhY2tlcjogVHJpZ2dlck1ldHJpY3NUcmFja2VyO1xuICBwcml2YXRlIHJlYWRvbmx5IHNlbWFudGljUmVsYXRpb25zaGlwU2VydmljZTogU2VtYW50aWNSZWxhdGlvbnNoaXBTZXJ2aWNlO1xuICBwcml2YXRlIHJlYWRvbmx5IGZpbGVPcGVyYXRpb25zOiBGaWxlT3BlcmF0aW9uc1NlcnZpY2U7XG5cbiAgLy8gVXNpbmcgY2VudHJhbGl6ZWQgY29uZmlndXJhdGlvbiBmb3IgbWV0cmljcyBiYXRjaGluZ1xuICBwcml2YXRlIHJlYWRvbmx5IE1FVFJJQ1NfQkFUQ0hfU0laRSA9IGdldFZhbGlkYXRlZEJhdGNoU2l6ZSgpO1xuICBwcml2YXRlIHJlYWRvbmx5IE1FVFJJQ1NfRkxVU0hfSU5URVJWQUwgPSBnZXRWYWxpZGF0ZWRGbHVzaEludGVydmFsKCk7XG5cbiAgLy8gQ2FjaGUgY29uZmlndXJhdGlvbiBjb25zdGFudHMgLSB1c2luZyBjZW50cmFsaXplZCBjb25maWd1cmF0aW9uXG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IE1BWF9NRVRSSUNTX0NBQ0hFX1NJWkUgPSBNRU1PUllfTElNSVRTLk1FVFJJQ1NfQ0FDSEUuTUFYX1NJWkU7XG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IE1BWF9NRVRSSUNTX0NBQ0hFX01FTU9SWV9NQiA9IE1FTU9SWV9MSU1JVFMuTUVUUklDU19DQUNIRS5NQVhfTUVNT1JZX01CO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBpbmRleENvbmZpZ01hbmFnZXI6IEluZGV4Q29uZmlnTWFuYWdlcixcbiAgICBjb25maWdNYW5hZ2VyOiBDb25maWdNYW5hZ2VyLFxuICAgIHBvcnRmb2xpb0luZGV4TWFuYWdlcjogUG9ydGZvbGlvSW5kZXhNYW5hZ2VyLFxuICAgIG5scFNjb3JpbmdNYW5hZ2VyOiBOTFBTY29yaW5nTWFuYWdlcixcbiAgICB2ZXJiVHJpZ2dlck1hbmFnZXI6IFZlcmJUcmlnZ2VyTWFuYWdlcixcbiAgICByZWxhdGlvbnNoaXBNYW5hZ2VyOiBSZWxhdGlvbnNoaXBNYW5hZ2VyLFxuICAgIGhlbHBlcnM6IEVuaGFuY2VkSW5kZXhIZWxwZXJzLFxuICAgIGZpbGVPcGVyYXRpb25zOiBGaWxlT3BlcmF0aW9uc1NlcnZpY2VcbiAgKSB7XG4gICAgY29uc3QgcG9ydGZvbGlvUGF0aCA9IHBhdGguam9pbihwcm9jZXNzLmVudi5IT01FIHx8ICcnLCAnLmRvbGxob3VzZScsICdwb3J0Zm9saW8nKTtcbiAgICB0aGlzLmluZGV4UGF0aCA9IHBhdGguam9pbihwb3J0Zm9saW9QYXRoLCAnY2FwYWJpbGl0eS1pbmRleC55YW1sJyk7XG5cbiAgICAvLyBJbml0aWFsaXplIGNvbmZpZ3VyYXRpb25cbiAgICB0aGlzLmNvbmZpZyA9IGluZGV4Q29uZmlnTWFuYWdlcjtcbiAgICB0aGlzLmNvbmZpZ01hbmFnZXIgPSBjb25maWdNYW5hZ2VyO1xuICAgIHRoaXMucG9ydGZvbGlvSW5kZXhNYW5hZ2VyID0gcG9ydGZvbGlvSW5kZXhNYW5hZ2VyO1xuICAgIHRoaXMuZmlsZU9wZXJhdGlvbnMgPSBmaWxlT3BlcmF0aW9ucztcbiAgICBjb25zdCBjb25maWcgPSB0aGlzLmNvbmZpZy5nZXRDb25maWcoKTtcbiAgICB0aGlzLlRUTF9NUyA9IGNvbmZpZy5pbmRleC50dGxNaW51dGVzICogNjAgKiAxMDAwO1xuXG4gICAgLy8gTG9hZCBlbmhhbmNlZCBpbmRleCBjb25maWcgZnJvbSBnbG9iYWwgQ29uZmlnTWFuYWdlclxuICAgIHRoaXMubG9hZEVuaGFuY2VkSW5kZXhDb25maWcoKTtcblxuICAgIC8vIEluaXRpYWxpemUgY29tcG9uZW50cyB3aXRoIGNvbmZpZ1xuICAgIHRoaXMubmxwU2NvcmluZyA9IG5scFNjb3JpbmdNYW5hZ2VyO1xuICAgIHRoaXMudmVyYlRyaWdnZXJzID0gdmVyYlRyaWdnZXJNYW5hZ2VyO1xuICAgIHRoaXMucmVsYXRpb25zaGlwTWFuYWdlciA9IHJlbGF0aW9uc2hpcE1hbmFnZXI7XG4gICAgdGhpcy5lbGVtZW50RGVmaW5pdGlvbkJ1aWxkZXIgPSBoZWxwZXJzLmVsZW1lbnREZWZpbml0aW9uQnVpbGRlcjtcbiAgICB0aGlzLnNlbWFudGljUmVsYXRpb25zaGlwU2VydmljZSA9IGhlbHBlcnMuc2VtYW50aWNSZWxhdGlvbnNoaXBTZXJ2aWNlO1xuICAgIHRoaXMuYWN0aW9uVHJpZ2dlckV4dHJhY3RvciA9IGhlbHBlcnMuY3JlYXRlQWN0aW9uVHJpZ2dlckV4dHJhY3Rvcih7XG4gICAgICBnZXRDb25maWc6ICgpID0+IEVuaGFuY2VkSW5kZXhNYW5hZ2VyLlZFUkJfRVhUUkFDVElPTl9DT05GSUcsXG4gICAgICBnZXRQYXR0ZXJuczogKCkgPT4gdGhpcy5nZXRUcmlnZ2VyUGF0dGVybnMoKVxuICAgIH0pO1xuICAgIHRoaXMubWV0cmljc1RyYWNrZXIgPSBoZWxwZXJzLmNyZWF0ZVRyaWdnZXJNZXRyaWNzVHJhY2tlcih7XG4gICAgICBiYXRjaFNpemU6IHRoaXMuTUVUUklDU19CQVRDSF9TSVpFLFxuICAgICAgZmx1c2hJbnRlcnZhbE1zOiB0aGlzLk1FVFJJQ1NfRkxVU0hfSU5URVJWQUwsXG4gICAgICBjYWNoZUxpbWl0czoge1xuICAgICAgICBtYXhTaXplOiBFbmhhbmNlZEluZGV4TWFuYWdlci5NQVhfTUVUUklDU19DQUNIRV9TSVpFLFxuICAgICAgICBtYXhNZW1vcnlNQjogRW5oYW5jZWRJbmRleE1hbmFnZXIuTUFYX01FVFJJQ1NfQ0FDSEVfTUVNT1JZX01CXG4gICAgICB9LFxuICAgICAgZ2V0SW5kZXg6ICgpID0+IHRoaXMuZ2V0SW5kZXgoKSxcbiAgICAgIHBlcnNpc3RJbmRleDogKGluZGV4KSA9PiB0aGlzLndyaXRlVG9GaWxlKGluZGV4KVxuICAgIH0pO1xuXG4gICAgLy8gSW5pdGlhbGl6ZSBmaWxlIGxvY2tcbiAgICB0aGlzLmZpbGVMb2NrID0gbmV3IEZpbGVMb2NrKHRoaXMuaW5kZXhQYXRoKTtcblxuICAgIGxvZ2dlci5kZWJ1ZygnRW5oYW5jZWRJbmRleE1hbmFnZXIgaW5pdGlhbGl6ZWQnLCB7XG4gICAgICBpbmRleFBhdGg6IHRoaXMuaW5kZXhQYXRoLFxuICAgICAgY29uZmlnOiB7XG4gICAgICAgIHR0bE1pbnV0ZXM6IGNvbmZpZy5pbmRleC50dGxNaW51dGVzLFxuICAgICAgICBtYXhFbGVtZW50czogY29uZmlnLnBlcmZvcm1hbmNlLm1heEVsZW1lbnRzRm9yRnVsbE1hdHJpeFxuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gU3RhcnQgYXV0b21hdGljIG1lbW9yeSBjbGVhbnVwIHRvIHByZXZlbnQgbGVha3NcbiAgICB0aGlzLnN0YXJ0TWVtb3J5Q2xlYW51cCgpO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGRpc3Bvc2UoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gQ2xlYXIgYWxsIHRpbWVyc1xuICAgIGlmICh0aGlzLm1lbW9yeUNsZWFudXBJbnRlcnZhbCkge1xuICAgICAgY2xlYXJJbnRlcnZhbCh0aGlzLm1lbW9yeUNsZWFudXBJbnRlcnZhbCk7XG4gICAgICB0aGlzLm1lbW9yeUNsZWFudXBJbnRlcnZhbCA9IG51bGw7XG4gICAgfVxuXG4gICAgLy8gRmx1c2ggcGVuZGluZyBtZXRyaWNzIGJlZm9yZSBkaXNwb3NhbFxuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLm1ldHJpY3NUcmFja2VyLmZsdXNoKCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci53YXJuKCdGYWlsZWQgdG8gZmx1c2ggbWV0cmljcyBiYXRjaCBkdXJpbmcgZGlzcG9zYWwnLCBlcnJvcik7XG4gICAgfVxuXG4gICAgdGhpcy5tZXRyaWNzVHJhY2tlci5kaXNwb3NlKCk7XG5cbiAgICAvLyBEaXNwb3NlIG9mIGZpbGUgbG9ja1xuICAgIGlmICh0aGlzLmZpbGVMb2NrKSB7XG4gICAgICB0aGlzLmZpbGVMb2NrLmRpc3Bvc2UoKTtcbiAgICB9XG5cbiAgICBsb2dnZXIuZGVidWcoJ0Rpc3Bvc2VkIEVuaGFuY2VkSW5kZXhNYW5hZ2VyIHRpbWVycyBhbmQgY2FjaGVzJyk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBjdXJyZW50IGluZGV4LCBsb2FkaW5nIG9yIGJ1aWxkaW5nIGFzIG5lZWRlZFxuICAgKi9cbiAgcHVibGljIGFzeW5jIGdldEluZGV4KG9wdGlvbnM6IEluZGV4T3B0aW9ucyA9IHt9KTogUHJvbWlzZTxFbmhhbmNlZEluZGV4PiB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIEFkZCBwZXJmb3JtYW5jZSB0cmFja2luZ1xuICAgICAgY29uc3Qgc3RhcnRUaW1lID0gRGF0ZS5ub3coKTtcbiAgICAgIGNvbnN0IG9wZXJhdGlvbiA9IG9wdGlvbnMuZm9yY2VSZWJ1aWxkID8gJ3JlYnVpbGQnIDpcbiAgICAgICAgICAgICAgICAgICAgICAgIXRoaXMuaW5kZXggPyAnbG9hZCcgOiAnY2FjaGVkJztcblxuICAgICAgaWYgKG9wdGlvbnMuZm9yY2VSZWJ1aWxkKSB7XG4gICAgICAgIGxvZ2dlci5pbmZvKCdGb3JjZSByZWJ1aWxkIHJlcXVlc3RlZCBmb3IgRW5oYW5jZWQgSW5kZXgnKTtcbiAgICAgICAgYXdhaXQgdGhpcy5idWlsZEluZGV4KG9wdGlvbnMpO1xuICAgICAgfSBlbHNlIGlmIChhd2FpdCB0aGlzLm5lZWRzUmVidWlsZCgpKSB7XG4gICAgICAgIGxvZ2dlci5pbmZvKCdFbmhhbmNlZCBJbmRleCBuZWVkcyByZWJ1aWxkJyk7XG4gICAgICAgIGF3YWl0IHRoaXMuYnVpbGRJbmRleChvcHRpb25zKTtcbiAgICAgIH0gZWxzZSBpZiAoIXRoaXMuaW5kZXgpIHtcbiAgICAgICAgLy8gVHJ5IHRvIGxvYWQgZnJvbSBmaWxlIGZpcnN0XG4gICAgICAgIGxvZ2dlci5pbmZvKCdMb2FkaW5nIEVuaGFuY2VkIEluZGV4IGZyb20gY2FjaGUgZmlsZScpO1xuICAgICAgICBhd2FpdCB0aGlzLmxvYWRJbmRleCgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbG9nZ2VyLmRlYnVnKCdVc2luZyBjYWNoZWQgRW5oYW5jZWQgSW5kZXggZnJvbSBtZW1vcnknKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZWxhcHNlZCA9IERhdGUubm93KCkgLSBzdGFydFRpbWU7XG4gICAgICBsb2dnZXIuaW5mbygnRW5oYW5jZWQgSW5kZXggb3BlcmF0aW9uIGNvbXBsZXRlZCcsIHtcbiAgICAgICAgb3BlcmF0aW9uLFxuICAgICAgICBlbGFwc2VkTXM6IGVsYXBzZWQsXG4gICAgICAgIGVsZW1lbnRzOiB0aGlzLmluZGV4Py5tZXRhZGF0YT8udG90YWxfZWxlbWVudHMgfHwgMFxuICAgICAgfSk7XG5cbiAgICAgIGlmIChlbGFwc2VkID4gMTAwMCkge1xuICAgICAgICBsb2dnZXIud2FybignRW5oYW5jZWQgSW5kZXggb3BlcmF0aW9uIHRvb2sgbG9uZ2VyIHRoYW4gZXhwZWN0ZWQnLCB7XG4gICAgICAgICAgZWxhcHNlZE1zOiBlbGFwc2VkLFxuICAgICAgICAgIG9wZXJhdGlvblxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXMuaW5kZXghO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoJ0ZhaWxlZCB0byBnZXQgRW5oYW5jZWQgSW5kZXgnLCBlcnJvcik7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTG9hZCBpbmRleCBmcm9tIFlBTUwgZmlsZVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBsb2FkSW5kZXgoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHlhbWxDb250ZW50ID0gYXdhaXQgdGhpcy5maWxlT3BlcmF0aW9ucy5yZWFkRmlsZSh0aGlzLmluZGV4UGF0aCwge1xuICAgICAgICBzb3VyY2U6ICdFbmhhbmNlZEluZGV4TWFuYWdlci5sb2FkSW5kZXgnXG4gICAgICB9KTtcblxuICAgICAgbGV0IGxvYWRlZERhdGE7XG4gICAgICB0cnkge1xuICAgICAgICBsb2FkZWREYXRhID0geWFtbExvYWQoeWFtbENvbnRlbnQpO1xuICAgICAgfSBjYXRjaCAoeWFtbEVycm9yKSB7XG4gICAgICAgIC8vIEhhbmRsZSBZQU1MIHBhcnNlIGVycm9ycyBncmFjZWZ1bGx5XG4gICAgICAgIGxvZ2dlci53YXJuKCdGYWlsZWQgdG8gcGFyc2UgWUFNTCwgcmVidWlsZGluZyBpbmRleCcsIHlhbWxFcnJvcik7XG4gICAgICAgIGF3YWl0IHRoaXMuYnVpbGRJbmRleCgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIEZJWDogQWRkIGRlZmVuc2l2ZSBjaGVja3MgZm9yIG1hbGZvcm1lZCBZQU1MIHdpdGggdW5kZWZpbmVkL251bGwgaW5kZXhcbiAgICAgIC8vIFByZXZpb3VzbHk6IEFzc3VtZWQgeWFtbExvYWQgYWx3YXlzIHJldHVybnMgdmFsaWQgZGF0YVxuICAgICAgLy8gTm93OiBWYWxpZGF0ZSBzdHJ1Y3R1cmUgZGVlcGx5IHRvIGVuc3VyZSBhbGwgcmVxdWlyZWQgZmllbGRzIGV4aXN0XG4gICAgICBpZiAoIWxvYWRlZERhdGEgfHwgdHlwZW9mIGxvYWRlZERhdGEgIT09ICdvYmplY3QnKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKCdMb2FkZWQgWUFNTCBpcyBudWxsIG9yIG5vdCBhbiBvYmplY3QsIHJlYnVpbGRpbmcgaW5kZXgnKTtcbiAgICAgICAgYXdhaXQgdGhpcy5idWlsZEluZGV4KCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gVmFsaWRhdGUgcmVxdWlyZWQgc3RydWN0dXJlXG4gICAgICBjb25zdCBpbmRleERhdGEgPSBsb2FkZWREYXRhIGFzIGFueTtcbiAgICAgIGlmICghaW5kZXhEYXRhLm1ldGFkYXRhIHx8ICFpbmRleERhdGEuZWxlbWVudHMgfHwgIWluZGV4RGF0YS5hY3Rpb25fdHJpZ2dlcnMpIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oJ0ludmFsaWQgaW5kZXggc3RydWN0dXJlIChtaXNzaW5nIG1ldGFkYXRhLCBlbGVtZW50cywgb3IgYWN0aW9uX3RyaWdnZXJzKSwgcmVidWlsZGluZycsIHtcbiAgICAgICAgICBoYXNNZXRhZGF0YTogISFpbmRleERhdGEubWV0YWRhdGEsXG4gICAgICAgICAgaGFzRWxlbWVudHM6ICEhaW5kZXhEYXRhLmVsZW1lbnRzLFxuICAgICAgICAgIGhhc0FjdGlvblRyaWdnZXJzOiAhIWluZGV4RGF0YS5hY3Rpb25fdHJpZ2dlcnNcbiAgICAgICAgfSk7XG4gICAgICAgIGF3YWl0IHRoaXMuYnVpbGRJbmRleCgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHRoaXMuaW5kZXggPSBsb2FkZWREYXRhIGFzIEVuaGFuY2VkSW5kZXg7XG4gICAgICB0aGlzLmxhc3RMb2FkZWQgPSBuZXcgRGF0ZSgpO1xuXG4gICAgICAvLyBGSVg6IEFkZCBkZWZlbnNpdmUgY2hlY2tzIGZvciBtYWxmb3JtZWQgWUFNTCB3aXRoIHVuZGVmaW5lZCBtZXRhZGF0YVxuICAgICAgLy8gUHJldmlvdXNseTogQXNzdW1lZCBtZXRhZGF0YSBhbHdheXMgZXhpc3RzLCBjYXVzaW5nIHRlc3QgZmFpbHVyZXNcbiAgICAgIC8vIE5vdzogU2FmZWx5IGhhbmRsZSBjYXNlcyB3aGVyZSBtZXRhZGF0YSBtaWdodCBiZSB1bmRlZmluZWRcbiAgICAgIGxvZ2dlci5pbmZvKCdFbmhhbmNlZCBpbmRleCBsb2FkZWQnLCB7XG4gICAgICAgIGVsZW1lbnRzOiB0aGlzLmluZGV4Py5tZXRhZGF0YT8udG90YWxfZWxlbWVudHMgPz8gMCxcbiAgICAgICAgdmVyc2lvbjogdGhpcy5pbmRleD8ubWV0YWRhdGE/LnZlcnNpb24gPz8gJ3Vua25vd24nXG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKChlcnJvciBhcyBhbnkpLmNvZGUgPT09ICdFTk9FTlQnKSB7XG4gICAgICAgIGxvZ2dlci5pbmZvKCdObyBleGlzdGluZyBpbmRleCBmb3VuZCwgd2lsbCBidWlsZCBuZXcgb25lJyk7XG4gICAgICAgIGF3YWl0IHRoaXMuYnVpbGRJbmRleCgpO1xuICAgICAgICByZXR1cm47IC8vIFJldHVybiBlYXJseSBzaW5jZSBidWlsZEluZGV4IHdpbGwgc2V0IHVwIHRoZSBpbmRleFxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbG9nZ2VyLmVycm9yKCdGYWlsZWQgdG8gbG9hZCBpbmRleCcsIGVycm9yKTtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkIG9yIHJlYnVpbGQgdGhlIGluZGV4IGZyb20gcG9ydGZvbGlvXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGJ1aWxkSW5kZXgob3B0aW9uczogSW5kZXhPcHRpb25zID0ge30pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyBVc2UgZmlsZSBsb2NraW5nIHRvIHByZXZlbnQgY29uY3VycmVudCBidWlsZHNcbiAgICBjb25zdCBjb25maWcgPSB0aGlzLmNvbmZpZy5nZXRDb25maWcoKTtcbiAgICBjb25zdCBsb2NrQWNxdWlyZWQgPSBhd2FpdCB0aGlzLmZpbGVMb2NrLmFjcXVpcmUoe1xuICAgICAgdGltZW91dDogY29uZmlnLmluZGV4LmxvY2tUaW1lb3V0TXMsXG4gICAgICBzdGFsZTogNjAwMDAgIC8vIDEgbWludXRlXG4gICAgfSk7XG5cbiAgICBpZiAoIWxvY2tBY3F1aXJlZCkge1xuICAgICAgbG9nZ2VyLndhcm4oJ0NvdWxkIG5vdCBhY3F1aXJlIGxvY2sgZm9yIGluZGV4IGJ1aWxkJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5pc0J1aWxkaW5nID0gdHJ1ZTtcbiAgICBjb25zdCBzdGFydFRpbWUgPSBEYXRlLm5vdygpO1xuXG4gICAgdHJ5IHtcbiAgICAgIC8vIEdldCBleGlzdGluZyBpbmRleCBmb3IgcHJlc2VydmF0aW9uIG9mIGN1c3RvbSBmaWVsZHNcbiAgICAgIGNvbnN0IGV4aXN0aW5nSW5kZXggPSBvcHRpb25zLnByZXNlcnZlQ3VzdG9tICYmIHRoaXMuaW5kZXggPyB0aGlzLmluZGV4IDogbnVsbDtcblxuICAgICAgLy8gSW5pdGlhbGl6ZSBuZXcgaW5kZXggc3RydWN0dXJlXG4gICAgICBjb25zdCBuZXdJbmRleDogRW5oYW5jZWRJbmRleCA9IHtcbiAgICAgICAgbWV0YWRhdGE6IHtcbiAgICAgICAgICB2ZXJzaW9uOiAnMi4wLjAnLFxuICAgICAgICAgIGNyZWF0ZWQ6IGV4aXN0aW5nSW5kZXg/Lm1ldGFkYXRhLmNyZWF0ZWQgfHwgbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgICAgICAgIGxhc3RfdXBkYXRlZDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgICAgICAgIHRvdGFsX2VsZW1lbnRzOiAwXG4gICAgICAgIH0sXG4gICAgICAgIGFjdGlvbl90cmlnZ2Vyczoge30sXG4gICAgICAgIGVsZW1lbnRzOiB7fVxuICAgICAgfTtcblxuICAgICAgLy8gR2V0IHBvcnRmb2xpbyBpbmRleCBmb3IgZWxlbWVudCBkaXNjb3ZlcnlcbiAgICAgIGNvbnN0IHBvcnRmb2xpb0RhdGEgPSBhd2FpdCB0aGlzLnBvcnRmb2xpb0luZGV4TWFuYWdlci5nZXRJbmRleCgpO1xuXG4gICAgICAvLyBQcm9jZXNzIGVhY2ggZWxlbWVudCB0eXBlXG4gICAgICBmb3IgKGNvbnN0IFtlbGVtZW50VHlwZSwgZW50cmllc10gb2YgcG9ydGZvbGlvRGF0YS5ieVR5cGUuZW50cmllcygpKSB7XG4gICAgICAgIGlmICghbmV3SW5kZXguZWxlbWVudHNbZWxlbWVudFR5cGVdKSB7XG4gICAgICAgICAgbmV3SW5kZXguZWxlbWVudHNbZWxlbWVudFR5cGVdID0ge307XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXMpIHtcbiAgICAgICAgICAvLyBTa2lwIGlmIG5vdCBpbiB1cGRhdGUgbGlzdCAod2hlbiBzcGVjaWZpZWQpXG4gICAgICAgICAgLy8gRklYOiBBZGQgZGVmZW5zaXZlIGNoZWNrIGZvciBlbnRyeS5tZXRhZGF0YVxuICAgICAgICAgIGNvbnN0IGVudHJ5TmFtZSA9IGVudHJ5Lm1ldGFkYXRhPy5uYW1lO1xuICAgICAgICAgIGlmICghZW50cnlOYW1lKSB7XG4gICAgICAgICAgICBsb2dnZXIud2FybignU2tpcHBpbmcgZW50cnkgd2l0aCB1bmRlZmluZWQgbWV0YWRhdGEubmFtZScpO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKG9wdGlvbnMudXBkYXRlT25seSAmJiAhb3B0aW9ucy51cGRhdGVPbmx5LmluY2x1ZGVzKGVudHJ5TmFtZSkpIHtcbiAgICAgICAgICAgIC8vIFByZXNlcnZlIGV4aXN0aW5nIGVudHJ5XG4gICAgICAgICAgICBpZiAoZXhpc3RpbmdJbmRleD8uZWxlbWVudHNbZWxlbWVudFR5cGVdPy5bZW50cnlOYW1lXSkge1xuICAgICAgICAgICAgICBuZXdJbmRleC5lbGVtZW50c1tlbGVtZW50VHlwZV1bZW50cnlOYW1lXSA9XG4gICAgICAgICAgICAgICAgZXhpc3RpbmdJbmRleC5lbGVtZW50c1tlbGVtZW50VHlwZV1bZW50cnlOYW1lXTtcbiAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgZWxlbWVudERlZiA9IHRoaXMuZWxlbWVudERlZmluaXRpb25CdWlsZGVyLmJ1aWxkKGVudHJ5LCBleGlzdGluZ0luZGV4KTtcbiAgICAgICAgICBuZXdJbmRleC5lbGVtZW50c1tlbGVtZW50VHlwZV1bZW50cnlOYW1lXSA9IGVsZW1lbnREZWY7XG4gICAgICAgICAgbmV3SW5kZXgubWV0YWRhdGEudG90YWxfZWxlbWVudHMrKztcblxuICAgICAgICAgIC8vIEV4dHJhY3QgYWN0aW9uIHRyaWdnZXJzXG4gICAgICAgICAgdGhpcy5leHRyYWN0QWN0aW9uVHJpZ2dlcnMoZWxlbWVudERlZiwgZW50cnlOYW1lLCBuZXdJbmRleC5hY3Rpb25fdHJpZ2dlcnMpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIENhbGN1bGF0ZSBzZW1hbnRpYyByZWxhdGlvbnNoaXBzIHVzaW5nIE5MUFxuICAgICAgYXdhaXQgdGhpcy5jYWxjdWxhdGVTZW1hbnRpY1JlbGF0aW9uc2hpcHMobmV3SW5kZXgpO1xuXG4gICAgICAvLyBEaXNjb3ZlciBhZGRpdGlvbmFsIHJlbGF0aW9uc2hpcCB0eXBlc1xuICAgICAgYXdhaXQgdGhpcy5yZWxhdGlvbnNoaXBNYW5hZ2VyLmRpc2NvdmVyUmVsYXRpb25zaGlwcyhuZXdJbmRleCk7XG5cbiAgICAgIC8vIFByZXNlcnZlIGV4dGVuc2lvbnMgZnJvbSBleGlzdGluZyBpbmRleFxuICAgICAgaWYgKGV4aXN0aW5nSW5kZXg/LmV4dGVuc2lvbnMpIHtcbiAgICAgICAgbmV3SW5kZXguZXh0ZW5zaW9ucyA9IGV4aXN0aW5nSW5kZXguZXh0ZW5zaW9ucztcbiAgICAgIH1cblxuICAgICAgLy8gU2F2ZSB0byBmaWxlXG4gICAgICBhd2FpdCB0aGlzLndyaXRlVG9GaWxlKG5ld0luZGV4KTtcblxuICAgICAgdGhpcy5pbmRleCA9IG5ld0luZGV4O1xuICAgICAgdGhpcy5sYXN0TG9hZGVkID0gbmV3IERhdGUoKTtcblxuICAgICAgY29uc3QgZHVyYXRpb24gPSBEYXRlLm5vdygpIC0gc3RhcnRUaW1lO1xuICAgICAgbG9nZ2VyLmluZm8oJ0VuaGFuY2VkIGluZGV4IGJ1aWx0Jywge1xuICAgICAgICBkdXJhdGlvbjogYCR7ZHVyYXRpb259bXNgLFxuICAgICAgICBlbGVtZW50czogbmV3SW5kZXgubWV0YWRhdGEudG90YWxfZWxlbWVudHMsXG4gICAgICAgIHRyaWdnZXJzOiBPYmplY3Qua2V5cyhuZXdJbmRleC5hY3Rpb25fdHJpZ2dlcnMpLmxlbmd0aFxuICAgICAgfSk7XG5cbiAgICAgIC8vIExvZyBzZWN1cml0eSBldmVudFxuICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICB0eXBlOiAnUE9SVEZPTElPX0NBQ0hFX0lOVkFMSURBVElPTicsXG4gICAgICAgIHNldmVyaXR5OiAnTE9XJyxcbiAgICAgICAgc291cmNlOiAnZW5oYW5jZWRfaW5kZXgnLFxuICAgICAgICBkZXRhaWxzOiBgSW5kZXggcmVidWlsdCB3aXRoICR7bmV3SW5kZXgubWV0YWRhdGEudG90YWxfZWxlbWVudHN9IGVsZW1lbnRzIGluICR7ZHVyYXRpb259bXNgXG4gICAgICB9KTtcblxuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLmlzQnVpbGRpbmcgPSBmYWxzZTtcbiAgICAgIGF3YWl0IHRoaXMuZmlsZUxvY2sucmVsZWFzZSgpO1xuICAgIH1cbiAgfVxuXG4gIC8vIENvbmZpZ3VyYXRpb24gZm9yIHZlcmIgZXh0cmFjdGlvbiAod2lsbCBiZSBvdmVycmlkZGVuIGJ5IENvbmZpZ01hbmFnZXIpXG4gIHByaXZhdGUgc3RhdGljIFZFUkJfRVhUUkFDVElPTl9DT05GSUc6IFRyaWdnZXJFeHRyYWN0aW9uQ29uZmlnID0ge1xuICAgIC8vIFNlY3VyaXR5IGxpbWl0cyBmb3IgRG9TIHByb3RlY3Rpb25cbiAgICBsaW1pdHM6IHtcbiAgICAgIG1heFRyaWdnZXJzUGVyRWxlbWVudDogNTAsICAvLyBNYXhpbXVtIHRyaWdnZXJzIHRvIGV4dHJhY3QgcGVyIGVsZW1lbnRcbiAgICAgIG1heFRyaWdnZXJMZW5ndGg6IDUwLCAgICAgICAgLy8gTWF4aW11bSBsZW5ndGggZm9yIGEgc2luZ2xlIHRyaWdnZXJcbiAgICAgIG1heEtleXdvcmRzVG9DaGVjazogMTAwLCAgICAgLy8gTWF4aW11bSBrZXl3b3JkcyB0byBwcm9jZXNzIGZvciB2ZXJiIGRldGVjdGlvblxuICAgIH0sXG5cbiAgICAvLyBDb21tb24gdmVyYiBwcmVmaXhlcyBicm9rZW4gZG93biBieSBjYXRlZ29yeSBmb3IgbWFpbnRhaW5hYmlsaXR5XG4gICAgdmVyYlByZWZpeGVzOiB7XG4gICAgICBhY3Rpb25zOiBbJ2NyZWF0ZScsICdidWlsZCcsICdtYWtlJywgJ2dlbmVyYXRlJywgJ3Byb2R1Y2UnLCAnd3JpdGUnLCAnY29tcG9zZSddLFxuICAgICAgYW5hbHlzaXM6IFsnYW5hbHl6ZScsICdyZXZpZXcnLCAnZXhhbWluZScsICdpbnZlc3RpZ2F0ZScsICdpbnNwZWN0JywgJ2V2YWx1YXRlJywgJ2Fzc2VzcyddLFxuICAgICAgZGVidWdnaW5nOiBbJ2RlYnVnJywgJ2ZpeCcsICd0cm91Ymxlc2hvb3QnLCAnc29sdmUnLCAncmVzb2x2ZScsICdyZXBhaXInLCAncGF0Y2gnXSxcbiAgICAgIG9wZXJhdGlvbnM6IFsncnVuJywgJ2V4ZWN1dGUnLCAnc3RhcnQnLCAnc3RvcCcsICdkZXBsb3knLCAnY29uZmlndXJlJywgJ2luc3RhbGwnXSxcbiAgICAgIG1vZGlmaWNhdGlvbjogWyd1cGRhdGUnLCAnbW9kaWZ5JywgJ2NoYW5nZScsICdlZGl0JywgJ2FsdGVyJywgJ3RyYW5zZm9ybScsICdyZWZhY3RvciddLFxuICAgICAgcmVtb3ZhbDogWydkZWxldGUnLCAncmVtb3ZlJywgJ2NsZWFyJywgJ2NsZWFuJywgJ3B1cmdlJywgJ2Rlc3Ryb3knLCAnZWxpbWluYXRlJ10sXG4gICAgICBpbmZvcm1hdGlvbjogWydleHBsYWluJywgJ2Rlc2NyaWJlJywgJ2RvY3VtZW50JywgJ3NlYXJjaCcsICdmaW5kJywgJ2NoZWNrJywgJ3ZhbGlkYXRlJ10sXG4gICAgICBvcHRpbWl6YXRpb246IFsnb3B0aW1pemUnLCAnaW1wcm92ZScsICdlbmhhbmNlJywgJ3N0cmVhbWxpbmUnLCAnYWNjZWxlcmF0ZSddLFxuICAgICAgdGVzdGluZzogWyd0ZXN0JywgJ3ZlcmlmeScsICd2YWxpZGF0ZScsICdjb25maXJtJywgJ2Fzc2VydCcsICdlbnN1cmUnXSxcbiAgICB9LFxuXG4gICAgLy8gQ29tbW9uIHZlcmIgc3VmZml4ZXMgdGhhdCBpbmRpY2F0ZSBhY3Rpb24gd29yZHNcbiAgICB2ZXJiU3VmZml4ZXM6IFsnaWZ5JywgJ2l6ZScsICdhdGUnLCAnZW4nLCAnZnknXSxcblxuICAgIC8vIE5vdW4gc3VmZml4ZXMgdGhhdCBpbmRpY2F0ZSBub24tdmVyYnMgKHRvIGZpbHRlciBvdXQpXG4gICAgbm91blN1ZmZpeGVzOiBbJ3Rpb24nLCAnc2lvbicsICdtZW50JywgJ25lc3MnLCAnYW5jZScsICdlbmNlJywgJ2l0eScsICdpc20nLCAnc2hpcCcsICdob29kJywgJ2RvbScsICdlcnknLCAnaW5nJ10sXG5cbiAgICAvLyBUZWxlbWV0cnkgc2V0dGluZ3NcbiAgICB0ZWxlbWV0cnk6IHtcbiAgICAgIGVuYWJsZWQ6IGZhbHNlLCAgLy8gV2lsbCBiZSBjb25maWd1cmFibGUgdmlhIGVudmlyb25tZW50IHZhcmlhYmxlXG4gICAgICBzYW1wbGVSYXRlOiAwLjEsIC8vIFNhbXBsZSAxMCUgb2Ygb3BlcmF0aW9ucyB3aGVuIGVuYWJsZWRcbiAgICAgIG1ldHJpY3NJbnRlcnZhbDogNjAwMDAsIC8vIFJlcG9ydCBtZXRyaWNzIGV2ZXJ5IDYwIHNlY29uZHNcbiAgICB9XG4gIH07XG5cbiAgLy8gUHJlLWNvbXBpbGVkIHJlZ2V4IHBhdHRlcm5zIGJ1aWx0IGZyb20gY29uZmlnIChjYW4gYmUgdXBkYXRlZCBmcm9tIENvbmZpZ01hbmFnZXIpXG4gIHByaXZhdGUgc3RhdGljIFZFUkJfUFJFRklYX1BBVFRFUk4gPSBuZXcgUmVnRXhwKFxuICAgIGBeKCR7T2JqZWN0LnZhbHVlcyhFbmhhbmNlZEluZGV4TWFuYWdlci5WRVJCX0VYVFJBQ1RJT05fQ09ORklHLnZlcmJQcmVmaXhlcylcbiAgICAgIC5mbGF0KClcbiAgICAgIC5qb2luKCd8Jyl9KWBcbiAgKTtcblxuICBwcml2YXRlIHN0YXRpYyBWRVJCX1NVRkZJWF9QQVRURVJOID0gbmV3IFJlZ0V4cChcbiAgICBgKCR7RW5oYW5jZWRJbmRleE1hbmFnZXIuVkVSQl9FWFRSQUNUSU9OX0NPTkZJRy52ZXJiU3VmZml4ZXMuam9pbignfCcpfSkkYFxuICApO1xuXG4gIHByaXZhdGUgc3RhdGljIE5PVU5fU1VGRklYX1BBVFRFUk4gPSBuZXcgUmVnRXhwKFxuICAgIGAoJHtFbmhhbmNlZEluZGV4TWFuYWdlci5WRVJCX0VYVFJBQ1RJT05fQ09ORklHLm5vdW5TdWZmaXhlcy5qb2luKCd8Jyl9KSRgXG4gICk7XG5cbiAgcHJpdmF0ZSBnZXRUcmlnZ2VyUGF0dGVybnMoKTogVHJpZ2dlckV4dHJhY3Rpb25QYXR0ZXJucyB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHZlcmJQcmVmaXhQYXR0ZXJuOiBFbmhhbmNlZEluZGV4TWFuYWdlci5WRVJCX1BSRUZJWF9QQVRURVJOLFxuICAgICAgdmVyYlN1ZmZpeFBhdHRlcm46IEVuaGFuY2VkSW5kZXhNYW5hZ2VyLlZFUkJfU1VGRklYX1BBVFRFUk4sXG4gICAgICBub3VuU3VmZml4UGF0dGVybjogRW5oYW5jZWRJbmRleE1hbmFnZXIuTk9VTl9TVUZGSVhfUEFUVEVSTlxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogRXh0cmFjdCBhY3Rpb24gdHJpZ2dlcnMgZnJvbSBlbGVtZW50IGRlZmluaXRpb25cbiAgICpcbiAgICogRklYOiBFbmhhbmNlZCB2ZXJiIGV4dHJhY3Rpb24gZnJvbSBtdWx0aXBsZSBzb3VyY2VzXG4gICAqIFByZXZpb3VzbHk6IE9ubHkgY2hlY2tlZCBlbGVtZW50RGVmLmFjdGlvbnMgd2hpY2ggcGVyc29uYXMgZG9uJ3QgaGF2ZVxuICAgKiBOb3c6IENoZWNrcyBzZWFyY2gudHJpZ2dlcnMgKHBlcnNvbmFzKSwgYWN0aW9ucyBmaWVsZCwgYW5kIGtleXdvcmRzXG4gICAqXG4gICAqIFNlY3VyaXR5IGltcHJvdmVtZW50czpcbiAgICogLSBBZGRlZCB0cmlnZ2VyIGNvdW50IGxpbWl0c1xuICAgKiAtIEFkZGVkIHRyaWdnZXIgbGVuZ3RoIHZhbGlkYXRpb25cbiAgICogLSBVc2luZyBTZXRzIGZvciBPKDEpIGR1cGxpY2F0ZSBjaGVja2luZ1xuICAgKiAtIFByZS1jb21waWxlZCByZWdleCBwYXR0ZXJuc1xuICAgKlxuICAgKiBGdXR1cmUgZW5oYW5jZW1lbnRzOlxuICAgKiAtIEJhY2tncm91bmQgZGVlcCBjb250ZW50IGFuYWx5c2lzIGZvciBkeW5hbWljIHZlcmIgZXh0cmFjdGlvblxuICAgKiAtIFRoaXMgY291bGQgc2NhbiBlbGVtZW50IGRlc2NyaXB0aW9ucyBhbmQgY29udGVudCB0byBmaW5kIGFjdGlvbiB3b3Jkc1xuICAgKiAtIFdvdWxkIHJ1biBhc3luY2hyb25vdXNseSB0byBhdm9pZCBibG9ja2luZyBtYWluIG9wZXJhdGlvbnNcbiAgICogLSBSZXN1bHRzIHdvdWxkIHByb2dyZXNzaXZlbHkgZW5oYW5jZSB0aGUgaW5kZXggb3ZlciB0aW1lXG4gICAqL1xuICBwcml2YXRlIGV4dHJhY3RBY3Rpb25UcmlnZ2VycyhcbiAgICBlbGVtZW50RGVmOiBFbGVtZW50RGVmaW5pdGlvbixcbiAgICBlbGVtZW50TmFtZTogc3RyaW5nLFxuICAgIHRyaWdnZXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT5cbiAgKTogdm9pZCB7XG4gICAgaWYgKCFlbGVtZW50RGVmKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgdGVsZW1ldHJ5U3RhcnRUaW1lID0gdGhpcy5zdGFydFRlbGVtZXRyeSgnZXh0cmFjdEFjdGlvblRyaWdnZXJzJyk7XG4gICAgY29uc3QgcmVzdWx0ID0gdGhpcy5hY3Rpb25UcmlnZ2VyRXh0cmFjdG9yLmV4dHJhY3QoZWxlbWVudERlZiwgZWxlbWVudE5hbWUpO1xuXG4gICAgZm9yIChjb25zdCB0cmlnZ2VyIG9mIHJlc3VsdC50cmlnZ2Vycykge1xuICAgICAgdGhpcy5hZGRUcmlnZ2VyTWFwcGluZyh0cmlnZ2VyLCBlbGVtZW50TmFtZSwgdHJpZ2dlcnMpO1xuICAgIH1cblxuICAgIHRoaXMucmVjb3JkVGVsZW1ldHJ5KCdleHRyYWN0QWN0aW9uVHJpZ2dlcnMnLCB0ZWxlbWV0cnlTdGFydFRpbWUsIHtcbiAgICAgIGVsZW1lbnROYW1lLFxuICAgICAgZWxlbWVudFR5cGU6IGVsZW1lbnREZWY/LmNvcmU/LnR5cGUsXG4gICAgICB0cmlnZ2Vyc0V4dHJhY3RlZDogcmVzdWx0LmV4dHJhY3RlZENvdW50LFxuICAgICAgdW5pcXVlVHJpZ2dlcnM6IHJlc3VsdC50cmlnZ2Vycy5sZW5ndGgsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQWRkIGEgdHJpZ2dlciB0byBlbGVtZW50IG1hcHBpbmdcbiAgICogUHJlc2VydmVzIG9yaWdpbmFsIGVsZW1lbnQgbmFtZSBjYXNpbmcgZm9yIHByb3BlciByZXNvbHV0aW9uXG4gICAqXG4gICAqIE5vdGU6IFRyaWdnZXJzIGFyZSBwZXJzaXN0ZWQgaW4gdGhlIGluZGV4IGZpbGUgdW5kZXIgYWN0aW9uX3RyaWdnZXJzXG4gICAqIFVzYWdlIG1ldHJpY3MgYXJlIHRyYWNrZWQgdmlhIHRyYWNrVHJpZ2dlclVzYWdlKCkgYW5kIGNhbiBiZSByZXRyaWV2ZWQgd2l0aCBnZXRUcmlnZ2VyTWV0cmljcygpXG4gICAqL1xuICBwcml2YXRlIGFkZFRyaWdnZXJNYXBwaW5nKFxuICAgIHZlcmI6IHN0cmluZyxcbiAgICBlbGVtZW50TmFtZTogc3RyaW5nLFxuICAgIHRyaWdnZXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT5cbiAgKTogdm9pZCB7XG4gICAgLy8gU3RvcmUgdmVyYiBpbiBsb3dlcmNhc2UgZm9yIGNvbnNpc3RlbnQgbG9va3VwXG4gICAgY29uc3Qgbm9ybWFsaXplZFZlcmIgPSB2ZXJiLnRvTG93ZXJDYXNlKCk7XG5cbiAgICBpZiAoIXRyaWdnZXJzW25vcm1hbGl6ZWRWZXJiXSkge1xuICAgICAgdHJpZ2dlcnNbbm9ybWFsaXplZFZlcmJdID0gW107XG4gICAgfVxuXG4gICAgLy8gUHJlc2VydmUgb3JpZ2luYWwgZWxlbWVudCBuYW1lIGNhc2luZyBmb3IgYWNjdXJhdGUgcmVzb2x1dGlvblxuICAgIC8vIFRoaXMgc3VwcG9ydHMgdmFyaW91cyBuYW1pbmcgY29udmVudGlvbnMgdXNlcnMgbWlnaHQgdXNlOlxuICAgIC8vIC0gbG93ZXJjYXNlOiBkZWJ1Zy1kZXRlY3RpdmVcbiAgICAvLyAtIGtlYmFiLWNhc2U6IERlYnVnLURldGVjdGl2ZVxuICAgIC8vIC0gc25ha2VfY2FzZTogZGVidWdfZGV0ZWN0aXZlXG4gICAgLy8gLSBDYW1lbENhc2U6IERlYnVnRGV0ZWN0aXZlXG4gICAgLy8gLSBDdXN0b206IERlQnVHLURlVGVjVGlWZVxuICAgIGlmICghdHJpZ2dlcnNbbm9ybWFsaXplZFZlcmJdLmluY2x1ZGVzKGVsZW1lbnROYW1lKSkge1xuICAgICAgdHJpZ2dlcnNbbm9ybWFsaXplZFZlcmJdLnB1c2goZWxlbWVudE5hbWUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBMb2FkIGVuaGFuY2VkIGluZGV4IGNvbmZpZ3VyYXRpb24gZnJvbSBDb25maWdNYW5hZ2VyXG4gICAqL1xuICBwcml2YXRlIGxvYWRFbmhhbmNlZEluZGV4Q29uZmlnKCk6IHZvaWQge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBjb25maWdNYW5hZ2VyID0gdGhpcy5jb25maWdNYW5hZ2VyO1xuICAgICAgY29uc3QgY29uZmlnID0gY29uZmlnTWFuYWdlci5nZXRDb25maWcoKTtcblxuICAgICAgLy8gVXBkYXRlIGxpbWl0cyBmcm9tIGNvbmZpZ1xuICAgICAgaWYgKGNvbmZpZy5lbGVtZW50cz8uZW5oYW5jZWRfaW5kZXgpIHtcbiAgICAgICAgY29uc3QgZW5oYW5jZWRDb25maWcgPSBjb25maWcuZWxlbWVudHMuZW5oYW5jZWRfaW5kZXg7XG5cbiAgICAgICAgLy8gVXBkYXRlIGxpbWl0c1xuICAgICAgICBpZiAoZW5oYW5jZWRDb25maWcubGltaXRzKSB7XG4gICAgICAgICAgRW5oYW5jZWRJbmRleE1hbmFnZXIuVkVSQl9FWFRSQUNUSU9OX0NPTkZJRy5saW1pdHMgPSB7XG4gICAgICAgICAgICAuLi5FbmhhbmNlZEluZGV4TWFuYWdlci5WRVJCX0VYVFJBQ1RJT05fQ09ORklHLmxpbWl0cyxcbiAgICAgICAgICAgIC4uLmVuaGFuY2VkQ29uZmlnLmxpbWl0c1xuICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICAvLyBVcGRhdGUgdGVsZW1ldHJ5IHNldHRpbmdzXG4gICAgICAgIGlmIChlbmhhbmNlZENvbmZpZy50ZWxlbWV0cnkpIHtcbiAgICAgICAgICBFbmhhbmNlZEluZGV4TWFuYWdlci5WRVJCX0VYVFJBQ1RJT05fQ09ORklHLnRlbGVtZXRyeSA9IHtcbiAgICAgICAgICAgIC4uLkVuaGFuY2VkSW5kZXhNYW5hZ2VyLlZFUkJfRVhUUkFDVElPTl9DT05GSUcudGVsZW1ldHJ5LFxuICAgICAgICAgICAgLi4uZW5oYW5jZWRDb25maWcudGVsZW1ldHJ5XG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEFkZCBjdXN0b20gdmVyYiBwYXR0ZXJucyBpZiBwcm92aWRlZFxuICAgICAgICBpZiAoZW5oYW5jZWRDb25maWcudmVyYlBhdHRlcm5zKSB7XG4gICAgICAgICAgY29uc3QgcGF0dGVybnMgPSBlbmhhbmNlZENvbmZpZy52ZXJiUGF0dGVybnM7XG5cbiAgICAgICAgICAvLyBBZGQgY3VzdG9tIHByZWZpeGVzXG4gICAgICAgICAgaWYgKHBhdHRlcm5zLmN1c3RvbVByZWZpeGVzICYmIHBhdHRlcm5zLmN1c3RvbVByZWZpeGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGNvbnN0IGFsbFByZWZpeGVzID0gW1xuICAgICAgICAgICAgICAuLi5PYmplY3QudmFsdWVzKEVuaGFuY2VkSW5kZXhNYW5hZ2VyLlZFUkJfRVhUUkFDVElPTl9DT05GSUcudmVyYlByZWZpeGVzKS5mbGF0KCksXG4gICAgICAgICAgICAgIC4uLnBhdHRlcm5zLmN1c3RvbVByZWZpeGVzXG4gICAgICAgICAgICBdO1xuICAgICAgICAgICAgRW5oYW5jZWRJbmRleE1hbmFnZXIuVkVSQl9QUkVGSVhfUEFUVEVSTiA9IHRoaXMuY29tcGlsZUFuZFZhbGlkYXRlUmVnZXgoXG4gICAgICAgICAgICAgIGBeKCR7YWxsUHJlZml4ZXMuam9pbignfCcpfSlgLFxuICAgICAgICAgICAgICAndmVyYiBwcmVmaXgnXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIEFkZCBjdXN0b20gc3VmZml4ZXNcbiAgICAgICAgICBpZiAocGF0dGVybnMuY3VzdG9tU3VmZml4ZXMgJiYgcGF0dGVybnMuY3VzdG9tU3VmZml4ZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgY29uc3QgYWxsU3VmZml4ZXMgPSBbXG4gICAgICAgICAgICAgIC4uLkVuaGFuY2VkSW5kZXhNYW5hZ2VyLlZFUkJfRVhUUkFDVElPTl9DT05GSUcudmVyYlN1ZmZpeGVzLFxuICAgICAgICAgICAgICAuLi5wYXR0ZXJucy5jdXN0b21TdWZmaXhlc1xuICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIEVuaGFuY2VkSW5kZXhNYW5hZ2VyLlZFUkJfU1VGRklYX1BBVFRFUk4gPSB0aGlzLmNvbXBpbGVBbmRWYWxpZGF0ZVJlZ2V4KFxuICAgICAgICAgICAgICBgKCR7YWxsU3VmZml4ZXMuam9pbignfCcpfSkkYCxcbiAgICAgICAgICAgICAgJ3ZlcmIgc3VmZml4J1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBBZGQgZXhjbHVkZWQgbm91bnNcbiAgICAgICAgICBpZiAocGF0dGVybnMuZXhjbHVkZWROb3VucyAmJiBwYXR0ZXJucy5leGNsdWRlZE5vdW5zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGNvbnN0IGFsbE5vdW5zID0gW1xuICAgICAgICAgICAgICAuLi5FbmhhbmNlZEluZGV4TWFuYWdlci5WRVJCX0VYVFJBQ1RJT05fQ09ORklHLm5vdW5TdWZmaXhlcyxcbiAgICAgICAgICAgICAgLi4ucGF0dGVybnMuZXhjbHVkZWROb3Vuc1xuICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIEVuaGFuY2VkSW5kZXhNYW5hZ2VyLk5PVU5fU1VGRklYX1BBVFRFUk4gPSB0aGlzLmNvbXBpbGVBbmRWYWxpZGF0ZVJlZ2V4KFxuICAgICAgICAgICAgICBgKCR7YWxsTm91bnMuam9pbignfCcpfSkkYCxcbiAgICAgICAgICAgICAgJ25vdW4gc3VmZml4J1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBWYWxpZGF0ZSBhbGwgcmVnZXggcGF0dGVybnMgYXQgc3RhcnR1cFxuICAgICAgICB0aGlzLnZhbGlkYXRlUmVnZXhQYXR0ZXJucygpO1xuXG4gICAgICAgIGxvZ2dlci5pbmZvKCdMb2FkZWQgZW5oYW5jZWQgaW5kZXggY29uZmlndXJhdGlvbicsIHtcbiAgICAgICAgICBsaW1pdHM6IEVuaGFuY2VkSW5kZXhNYW5hZ2VyLlZFUkJfRVhUUkFDVElPTl9DT05GSUcubGltaXRzLFxuICAgICAgICAgIHRlbGVtZXRyeUVuYWJsZWQ6IEVuaGFuY2VkSW5kZXhNYW5hZ2VyLlZFUkJfRVhUUkFDVElPTl9DT05GSUcudGVsZW1ldHJ5LmVuYWJsZWRcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci53YXJuKCdGYWlsZWQgdG8gbG9hZCBlbmhhbmNlZCBpbmRleCBjb25maWd1cmF0aW9uLCB1c2luZyBkZWZhdWx0cycsIHtcbiAgICAgICAgZXJyb3I6IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENvbXBpbGUgYW5kIHZhbGlkYXRlIGEgcmVnZXggcGF0dGVyblxuICAgKiBQcm92aWRlcyBjbGVhciBlcnJvciBtZXNzYWdlcyBpZiBwYXR0ZXJuIGlzIGludmFsaWRcbiAgICovXG4gIHByaXZhdGUgY29tcGlsZUFuZFZhbGlkYXRlUmVnZXgocGF0dGVybjogc3RyaW5nLCBuYW1lOiBzdHJpbmcpOiBSZWdFeHAge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZWdleCA9IG5ldyBSZWdFeHAocGF0dGVybik7XG5cbiAgICAgIC8vIFRlc3QgdGhlIHJlZ2V4IHdpdGggc2FtcGxlIGRhdGEgdG8gZW5zdXJlIGl0IHdvcmtzXG4gICAgICBjb25zdCB0ZXN0U3RyaW5ncyA9IFsndGVzdCcsICdkZWJ1ZycsICdjcmVhdGUnLCAnaWZ5JywgJ3Rpb24nXTtcbiAgICAgIGZvciAoY29uc3Qgc3RyIG9mIHRlc3RTdHJpbmdzKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgLy8gRXhlY3V0ZSB0ZXN0IHRvIHZhbGlkYXRlIHJlZ2V4IHBhdHRlcm4gKHJlc3VsdCBub3QgbmVlZGVkLCBqdXN0IGNoZWNraW5nIGZvciBlcnJvcnMpXG4gICAgICAgICAgdm9pZCByZWdleC50ZXN0KHN0cik7XG4gICAgICAgICAgLy8gUmVzZXQgbGFzdEluZGV4IGZvciBnbG9iYWwgcmVnZXhlcyB0byBlbnN1cmUgY29uc2lzdGVudCBiZWhhdmlvclxuICAgICAgICAgIGlmIChyZWdleC5nbG9iYWwpIHtcbiAgICAgICAgICAgIHJlZ2V4Lmxhc3RJbmRleCA9IDA7XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoICh0ZXN0RXJyb3IpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFJlZ2V4IHBhdHRlcm4gZmFpbHMgb24gdGVzdCBzdHJpbmcgJyR7c3RyfSc6ICR7dGVzdEVycm9yfWApO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZWdleDtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc3QgZXJyb3JNc2cgPSBgSW52YWxpZCAke25hbWV9IHBhdHRlcm46ICR7cGF0dGVybn1gO1xuICAgICAgbG9nZ2VyLmVycm9yKGVycm9yTXNnLCB7XG4gICAgICAgIGVycm9yOiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvciksXG4gICAgICAgIHBhdHRlcm5cbiAgICAgIH0pO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGVycm9yTXNnKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGUgYWxsIHJlZ2V4IHBhdHRlcm5zIGF0IHN0YXJ0dXBcbiAgICogRW5zdXJlcyBwYXR0ZXJucyBhcmUgdmFsaWQgYW5kIGNhbiBoYW5kbGUgZXhwZWN0ZWQgaW5wdXRcbiAgICovXG4gIHByaXZhdGUgdmFsaWRhdGVSZWdleFBhdHRlcm5zKCk6IHZvaWQge1xuICAgIGNvbnN0IHZhbGlkYXRpb25UZXN0cyA9IFtcbiAgICAgIHtcbiAgICAgICAgcGF0dGVybjogRW5oYW5jZWRJbmRleE1hbmFnZXIuVkVSQl9QUkVGSVhfUEFUVEVSTixcbiAgICAgICAgbmFtZTogJ1ZFUkJfUFJFRklYX1BBVFRFUk4nLFxuICAgICAgICBzaG91bGRNYXRjaDogWydkZWJ1ZycsICdjcmVhdGUnLCAnYW5hbHl6ZSddLFxuICAgICAgICBzaG91bGROb3RNYXRjaDogWyd4ZGVidWcnLCAnY3JlYXRlZCcsICcxMjNkZWJ1ZyddXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBwYXR0ZXJuOiBFbmhhbmNlZEluZGV4TWFuYWdlci5WRVJCX1NVRkZJWF9QQVRURVJOLFxuICAgICAgICBuYW1lOiAnVkVSQl9TVUZGSVhfUEFUVEVSTicsXG4gICAgICAgIHNob3VsZE1hdGNoOiBbJ3NpbXBsaWZ5JywgJ29yZ2FuaXplJywgJ2F1dG9tYXRlJ10sXG4gICAgICAgIHNob3VsZE5vdE1hdGNoOiBbJ3NpbXBsZScsICdvcmdhbicsICdhdXRvJ11cbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIHBhdHRlcm46IEVuaGFuY2VkSW5kZXhNYW5hZ2VyLk5PVU5fU1VGRklYX1BBVFRFUk4sXG4gICAgICAgIG5hbWU6ICdOT1VOX1NVRkZJWF9QQVRURVJOJyxcbiAgICAgICAgc2hvdWxkTWF0Y2g6IFsnZG9jdW1lbnRhdGlvbicsICdtYW5hZ2VtZW50JywgJ2hhcHBpbmVzcyddLFxuICAgICAgICBzaG91bGROb3RNYXRjaDogWydkb2N1bWVudCcsICdtYW5hZ2UnLCAnaGFwcHknXVxuICAgICAgfVxuICAgIF07XG5cbiAgICBmb3IgKGNvbnN0IHRlc3Qgb2YgdmFsaWRhdGlvblRlc3RzKSB7XG4gICAgICAvLyBWYWxpZGF0ZSBwYXR0ZXJuIGV4aXN0c1xuICAgICAgaWYgKCF0ZXN0LnBhdHRlcm4pIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3Rlc3QubmFtZX0gcGF0dGVybiBpcyBub3QgaW5pdGlhbGl6ZWRgKTtcbiAgICAgIH1cblxuICAgICAgLy8gVGVzdCBleHBlY3RlZCBtYXRjaGVzXG4gICAgICBmb3IgKGNvbnN0IHN0ciBvZiB0ZXN0LnNob3VsZE1hdGNoKSB7XG4gICAgICAgIGlmICghdGVzdC5wYXR0ZXJuLnRlc3Qoc3RyKSkge1xuICAgICAgICAgIGxvZ2dlci53YXJuKGBQYXR0ZXJuIHZhbGlkYXRpb24gd2FybmluZzogJHt0ZXN0Lm5hbWV9IHNob3VsZCBtYXRjaCAnJHtzdHJ9JyBidXQgZG9lc24ndGApO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFRlc3QgZXhwZWN0ZWQgbm9uLW1hdGNoZXNcbiAgICAgIGZvciAoY29uc3Qgc3RyIG9mIHRlc3Quc2hvdWxkTm90TWF0Y2gpIHtcbiAgICAgICAgaWYgKHRlc3QucGF0dGVybi50ZXN0KHN0cikpIHtcbiAgICAgICAgICBsb2dnZXIud2FybihgUGF0dGVybiB2YWxpZGF0aW9uIHdhcm5pbmc6ICR7dGVzdC5uYW1lfSBzaG91bGQgbm90IG1hdGNoICcke3N0cn0nIGJ1dCBkb2VzYCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBsb2dnZXIuZGVidWcoJ1JlZ2V4IHBhdHRlcm4gdmFsaWRhdGlvbiBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5Jyk7XG4gIH1cblxuICAvKipcbiAgICogVGVsZW1ldHJ5IHRyYWNraW5nIGluZnJhc3RydWN0dXJlXG4gICAqL1xuICBwcml2YXRlIHRlbGVtZXRyeU1ldHJpY3M6IE1hcDxzdHJpbmcsIGFueT4gPSBuZXcgTWFwKCk7XG4gIHByaXZhdGUgdGVsZW1ldHJ5VGltZXI6IE5vZGVKUy5UaW1lb3V0IHwgbnVsbCA9IG51bGw7XG5cbiAgLyoqXG4gICAqIFN0YXJ0IHRlbGVtZXRyeSB0cmFja2luZyBmb3IgYW4gb3BlcmF0aW9uXG4gICAqL1xuICBwcml2YXRlIHN0YXJ0VGVsZW1ldHJ5KF9vcGVyYXRpb25OYW1lOiBzdHJpbmcpOiBudW1iZXIgfCBudWxsIHtcbiAgICBpZiAoIXRoaXMuaXNUZWxlbWV0cnlFbmFibGVkKCkpIHJldHVybiBudWxsO1xuXG4gICAgLy8gU2FtcGxlIGJhc2VkIG9uIGNvbmZpZ3VyZWQgcmF0ZVxuICAgIGlmIChNYXRoLnJhbmRvbSgpID4gRW5oYW5jZWRJbmRleE1hbmFnZXIuVkVSQl9FWFRSQUNUSU9OX0NPTkZJRy50ZWxlbWV0cnkuc2FtcGxlUmF0ZSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIERhdGUubm93KCk7XG4gIH1cblxuICAvKipcbiAgICogUmVjb3JkIHRlbGVtZXRyeSBtZXRyaWNzIGZvciBhbiBvcGVyYXRpb25cbiAgICovXG4gIHByaXZhdGUgcmVjb3JkVGVsZW1ldHJ5KFxuICAgIG9wZXJhdGlvbk5hbWU6IHN0cmluZyxcbiAgICBzdGFydFRpbWU6IG51bWJlciB8IG51bGwsXG4gICAgbWV0cmljczogUmVjb3JkPHN0cmluZywgYW55PlxuICApOiB2b2lkIHtcbiAgICBpZiAoIXN0YXJ0VGltZSB8fCAhdGhpcy5pc1RlbGVtZXRyeUVuYWJsZWQoKSkgcmV0dXJuO1xuXG4gICAgY29uc3QgZHVyYXRpb24gPSBEYXRlLm5vdygpIC0gc3RhcnRUaW1lO1xuXG4gICAgLy8gQWdncmVnYXRlIG1ldHJpY3NcbiAgICBpZiAoIXRoaXMudGVsZW1ldHJ5TWV0cmljcy5oYXMob3BlcmF0aW9uTmFtZSkpIHtcbiAgICAgIHRoaXMudGVsZW1ldHJ5TWV0cmljcy5zZXQob3BlcmF0aW9uTmFtZSwge1xuICAgICAgICBjb3VudDogMCxcbiAgICAgICAgdG90YWxEdXJhdGlvbjogMCxcbiAgICAgICAgYXZnRHVyYXRpb246IDAsXG4gICAgICAgIG1heER1cmF0aW9uOiAwLFxuICAgICAgICBtaW5EdXJhdGlvbjogSW5maW5pdHksXG4gICAgICAgIGxhc3RNZXRyaWNzOiB7fSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGNvbnN0IHN0YXRzID0gdGhpcy50ZWxlbWV0cnlNZXRyaWNzLmdldChvcGVyYXRpb25OYW1lKTtcbiAgICBzdGF0cy5jb3VudCsrO1xuICAgIHN0YXRzLnRvdGFsRHVyYXRpb24gKz0gZHVyYXRpb247XG4gICAgc3RhdHMuYXZnRHVyYXRpb24gPSBzdGF0cy50b3RhbER1cmF0aW9uIC8gc3RhdHMuY291bnQ7XG4gICAgc3RhdHMubWF4RHVyYXRpb24gPSBNYXRoLm1heChzdGF0cy5tYXhEdXJhdGlvbiwgZHVyYXRpb24pO1xuICAgIHN0YXRzLm1pbkR1cmF0aW9uID0gTWF0aC5taW4oc3RhdHMubWluRHVyYXRpb24sIGR1cmF0aW9uKTtcbiAgICBzdGF0cy5sYXN0TWV0cmljcyA9IHsgLi4ubWV0cmljcywgZHVyYXRpb24gfTtcblxuICAgIC8vIExvZyBkZXRhaWxlZCBtZXRyaWNzIGluIGRlYnVnIG1vZGVcbiAgICBsb2dnZXIuZGVidWcoYFRlbGVtZXRyeTogJHtvcGVyYXRpb25OYW1lfWAsIHtcbiAgICAgIGR1cmF0aW9uLFxuICAgICAgLi4ubWV0cmljcyxcbiAgICB9KTtcblxuICAgIC8vIFNjaGVkdWxlIHBlcmlvZGljIHJlcG9ydGluZ1xuICAgIHRoaXMuc2NoZWR1bGVUZWxlbWV0cnlSZXBvcnQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiB0ZWxlbWV0cnkgaXMgZW5hYmxlZFxuICAgKi9cbiAgcHJpdmF0ZSBpc1RlbGVtZXRyeUVuYWJsZWQoKTogYm9vbGVhbiB7XG4gICAgLy8gQ2hlY2sgZW52aXJvbm1lbnQgdmFyaWFibGUgb3IgY29uZmlnXG4gICAgcmV0dXJuIHByb2Nlc3MuZW52LkRPTExIT1VTRV9URUxFTUVUUllfRU5BQkxFRCA9PT0gJ3RydWUnIHx8XG4gICAgICAgICAgIEVuaGFuY2VkSW5kZXhNYW5hZ2VyLlZFUkJfRVhUUkFDVElPTl9DT05GSUcudGVsZW1ldHJ5LmVuYWJsZWQ7XG4gIH1cblxuICAvKipcbiAgICogU2NoZWR1bGUgcGVyaW9kaWMgdGVsZW1ldHJ5IHJlcG9ydGluZ1xuICAgKi9cbiAgcHJpdmF0ZSBzY2hlZHVsZVRlbGVtZXRyeVJlcG9ydCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy50ZWxlbWV0cnlUaW1lcikgcmV0dXJuO1xuXG4gICAgdGhpcy50ZWxlbWV0cnlUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5yZXBvcnRUZWxlbWV0cnkoKTtcbiAgICAgIHRoaXMudGVsZW1ldHJ5VGltZXIgPSBudWxsO1xuICAgIH0sIEVuaGFuY2VkSW5kZXhNYW5hZ2VyLlZFUkJfRVhUUkFDVElPTl9DT05GSUcudGVsZW1ldHJ5Lm1ldHJpY3NJbnRlcnZhbCk7XG4gIH1cblxuICAvKipcbiAgICogUmVwb3J0IGFnZ3JlZ2F0ZWQgdGVsZW1ldHJ5IG1ldHJpY3NcbiAgICovXG4gIHByaXZhdGUgcmVwb3J0VGVsZW1ldHJ5KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnRlbGVtZXRyeU1ldHJpY3Muc2l6ZSA9PT0gMCkgcmV0dXJuO1xuXG4gICAgY29uc3QgcmVwb3J0ID0ge1xuICAgICAgdGltZXN0YW1wOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgICBtZXRyaWNzOiBPYmplY3QuZnJvbUVudHJpZXModGhpcy50ZWxlbWV0cnlNZXRyaWNzKSxcbiAgICB9O1xuXG4gICAgLy8gTG9nIHN1bW1hcnkgcmVwb3J0XG4gICAgbG9nZ2VyLmluZm8oJ1RlbGVtZXRyeSBSZXBvcnQnLCByZXBvcnQpO1xuXG4gICAgLy8gRnV0dXJlOiBTZW5kIHRvIHRlbGVtZXRyeSBlbmRwb2ludCBpZiBjb25maWd1cmVkXG4gICAgLy8gaWYgKHByb2Nlc3MuZW52LkRPTExIT1VTRV9URUxFTUVUUllfRU5EUE9JTlQpIHtcbiAgICAvLyAgIHRoaXMuc2VuZFRlbGVtZXRyeVRvRW5kcG9pbnQocmVwb3J0KTtcbiAgICAvLyB9XG5cbiAgICAvLyBDbGVhciBtZXRyaWNzIGFmdGVyIHJlcG9ydGluZ1xuICAgIHRoaXMudGVsZW1ldHJ5TWV0cmljcy5jbGVhcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIFdyaXRlIGluZGV4IGRhdGEgdG8gWUFNTCBmaWxlIG9uIGRpc2tcbiAgICogUHJpdmF0ZSBpbXBsZW1lbnRhdGlvbiBkZXRhaWxcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgd3JpdGVUb0ZpbGUoaW5kZXg6IEVuaGFuY2VkSW5kZXgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0cnkge1xuICAgICAgLy8gRW5zdXJlIGRpcmVjdG9yeSBleGlzdHNcbiAgICAgIGNvbnN0IGRpciA9IHBhdGguZGlybmFtZSh0aGlzLmluZGV4UGF0aCk7XG4gICAgICBhd2FpdCB0aGlzLmZpbGVPcGVyYXRpb25zLmNyZWF0ZURpcmVjdG9yeShkaXIpO1xuXG4gICAgICAvLyBDb252ZXJ0IHRvIFlBTUwgd2l0aCBuaWNlIGZvcm1hdHRpbmdcbiAgICAgIGNvbnN0IHlhbWxDb250ZW50ID0geWFtbER1bXAoaW5kZXgsIHtcbiAgICAgICAgaW5kZW50OiAyLFxuICAgICAgICBsaW5lV2lkdGg6IDEyMCxcbiAgICAgICAgbm9SZWZzOiB0cnVlLFxuICAgICAgICBzb3J0S2V5czogZmFsc2UgIC8vIFByZXNlcnZlIG91ciBsb2dpY2FsIG9yZGVyaW5nXG4gICAgICB9KTtcblxuICAgICAgLy8gVmFsaWRhdGUgVW5pY29kZSBiZWZvcmUgc2F2aW5nXG4gICAgICBjb25zdCB2YWxpZGF0aW9uID0gVW5pY29kZVZhbGlkYXRvci5ub3JtYWxpemUoeWFtbENvbnRlbnQpO1xuICAgICAgaWYgKHZhbGlkYXRpb24uZGV0ZWN0ZWRJc3N1ZXMgJiYgdmFsaWRhdGlvbi5kZXRlY3RlZElzc3Vlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5pY29kZSBpc3N1ZXMgaW4gaW5kZXg6ICR7dmFsaWRhdGlvbi5kZXRlY3RlZElzc3Vlcy5qb2luKCcsICcpfWApO1xuICAgICAgfVxuXG4gICAgICBhd2FpdCB0aGlzLmZpbGVPcGVyYXRpb25zLndyaXRlRmlsZSh0aGlzLmluZGV4UGF0aCwgeWFtbENvbnRlbnQsIHtcbiAgICAgICAgc291cmNlOiAnRW5oYW5jZWRJbmRleE1hbmFnZXIud3JpdGVUb0ZpbGUnXG4gICAgICB9KTtcblxuICAgICAgbG9nZ2VyLmRlYnVnKCdJbmRleCBzYXZlZCB0byBmaWxlJywgeyBwYXRoOiB0aGlzLmluZGV4UGF0aCB9KTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbG9nZ2VyLmVycm9yKCdGYWlsZWQgdG8gc2F2ZSBpbmRleCcsIGVycm9yKTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBpbmRleCBuZWVkcyByZWJ1aWxkaW5nXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIG5lZWRzUmVidWlsZCgpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICB0cnkge1xuICAgICAgLy8gQ2hlY2sgaWYgaW5kZXggZmlsZSBleGlzdHNcbiAgICAgIGNvbnN0IGluZGV4U3RhdHMgPSBhd2FpdCB0aGlzLmZpbGVPcGVyYXRpb25zLnN0YXQodGhpcy5pbmRleFBhdGgpLmNhdGNoKCgpID0+IG51bGwpO1xuICAgICAgaWYgKCFpbmRleFN0YXRzKSB7XG4gICAgICAgIGxvZ2dlci5pbmZvKCdFbmhhbmNlZCBpbmRleCBmaWxlIGRvZXMgbm90IGV4aXN0LCByZWJ1aWxkIG5lZWRlZCcpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgLy8gQ2hlY2sgZmlsZSBhZ2UgRklSU1QgLSB0aGlzIGlzIHRoZSBrZXkgZml4XG4gICAgICBjb25zdCBmaWxlQWdlID0gRGF0ZS5ub3coKSAtIGluZGV4U3RhdHMubXRpbWUuZ2V0VGltZSgpO1xuICAgICAgY29uc3QgdHRsTXMgPSB0aGlzLlRUTF9NUztcblxuICAgICAgaWYgKGZpbGVBZ2UgPiB0dGxNcykge1xuICAgICAgICBsb2dnZXIuaW5mbygnRW5oYW5jZWQgaW5kZXggZmlsZSBpcyBzdGFsZScsIHtcbiAgICAgICAgICBhZ2VNaW51dGVzOiBNYXRoLnJvdW5kKGZpbGVBZ2UgLyA2MDAwMCksXG4gICAgICAgICAgdHRsTWludXRlczogTWF0aC5yb3VuZCh0dGxNcyAvIDYwMDAwKVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRydWU7ICAvLyBGaWxlIGlzIHRvbyBvbGQsIHJlYnVpbGQgbmVlZGVkXG4gICAgICB9XG5cbiAgICAgIC8vIElmIHdlIHJlYWNoIGhlcmUsIGZpbGUgZXhpc3RzIGFuZCBpcyBmcmVzaFxuICAgICAgLy8gSWYgbm90IGluIG1lbW9yeSwgd2UgY2FuIGxvYWQgaXRcbiAgICAgIGlmICghdGhpcy5pbmRleCkge1xuICAgICAgICBsb2dnZXIuZGVidWcoJ0VuaGFuY2VkIGluZGV4IG5vdCBpbiBtZW1vcnkgYnV0IGZpbGUgaXMgZnJlc2gsIHdpbGwgbG9hZCBmcm9tIGZpbGUnKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlOyAvLyBXZSBjYW4gbG9hZCB0aGUgZnJlc2ggZmlsZSwgbm8gcmVidWlsZCBuZWVkZWRcbiAgICAgIH1cblxuICAgICAgLy8gRmlsZSBpcyBmcmVzaCBhbmQgd2UgaGF2ZSBpdCBpbiBtZW1vcnlcbiAgICAgIGxvZ2dlci5kZWJ1ZygnRW5oYW5jZWQgaW5kZXggaXMgY3VycmVudCwgbm8gcmVidWlsZCBuZWVkZWQnKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbG9nZ2VyLmVycm9yKCdFcnJvciBjaGVja2luZyBpZiByZWJ1aWxkIG5lZWRlZCcsIGVycm9yKTtcbiAgICAgIHJldHVybiB0cnVlOyAvLyBTYWZlciB0byByZWJ1aWxkIG9uIGVycm9yXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSBzcGVjaWZpYyBlbGVtZW50cyBpbiB0aGUgaW5kZXhcbiAgICovXG4gIHB1YmxpYyBhc3luYyB1cGRhdGVFbGVtZW50cyhlbGVtZW50TmFtZXM6IHN0cmluZ1tdLCBvcHRpb25zOiBJbmRleE9wdGlvbnMgPSB7fSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMuZ2V0SW5kZXgoe1xuICAgICAgLi4ub3B0aW9ucyxcbiAgICAgIHVwZGF0ZU9ubHk6IGVsZW1lbnROYW1lcyxcbiAgICAgIHByZXNlcnZlQ3VzdG9tOiB0cnVlXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQWRkIG9yIHVwZGF0ZSBhIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGVsZW1lbnRzXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgYWRkUmVsYXRpb25zaGlwKFxuICAgIGZyb21FbGVtZW50OiBzdHJpbmcsXG4gICAgdG9FbGVtZW50OiBzdHJpbmcsXG4gICAgcmVsYXRpb25zaGlwOiBSZWxhdGlvbnNoaXBcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgaW5kZXggPSBhd2FpdCB0aGlzLmdldEluZGV4KCk7XG5cbiAgICAvLyBGaW5kIHRoZSBlbGVtZW50XG4gICAgbGV0IGZvdW5kID0gZmFsc2U7XG4gICAgZm9yIChjb25zdCBbLCBlbGVtZW50c10gb2YgT2JqZWN0LmVudHJpZXMoaW5kZXguZWxlbWVudHMpKSB7XG4gICAgICBpZiAoZWxlbWVudHNbZnJvbUVsZW1lbnRdKSB7XG4gICAgICAgIGlmICghZWxlbWVudHNbZnJvbUVsZW1lbnRdLnJlbGF0aW9uc2hpcHMpIHtcbiAgICAgICAgICBlbGVtZW50c1tmcm9tRWxlbWVudF0ucmVsYXRpb25zaGlwcyA9IHt9O1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVsVHlwZSA9IHJlbGF0aW9uc2hpcC50eXBlIHx8ICdyZWxhdGVkX3RvJztcbiAgICAgICAgaWYgKCFlbGVtZW50c1tmcm9tRWxlbWVudF0ucmVsYXRpb25zaGlwc1tyZWxUeXBlXSkge1xuICAgICAgICAgIGVsZW1lbnRzW2Zyb21FbGVtZW50XS5yZWxhdGlvbnNoaXBzW3JlbFR5cGVdID0gW107XG4gICAgICAgIH1cblxuICAgICAgICAvLyBBZGQgb3IgdXBkYXRlIHJlbGF0aW9uc2hpcFxuICAgICAgICBjb25zdCBleGlzdGluZyA9IGVsZW1lbnRzW2Zyb21FbGVtZW50XS5yZWxhdGlvbnNoaXBzW3JlbFR5cGVdXG4gICAgICAgICAgLmZpbmRJbmRleChyID0+IHIuZWxlbWVudCA9PT0gdG9FbGVtZW50KTtcblxuICAgICAgICBpZiAoZXhpc3RpbmcgPj0gMCkge1xuICAgICAgICAgIGVsZW1lbnRzW2Zyb21FbGVtZW50XS5yZWxhdGlvbnNoaXBzW3JlbFR5cGVdW2V4aXN0aW5nXSA9IHJlbGF0aW9uc2hpcDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBlbGVtZW50c1tmcm9tRWxlbWVudF0ucmVsYXRpb25zaGlwc1tyZWxUeXBlXS5wdXNoKHJlbGF0aW9uc2hpcCk7XG4gICAgICAgIH1cblxuICAgICAgICBmb3VuZCA9IHRydWU7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChmb3VuZCkge1xuICAgICAgaW5kZXgubWV0YWRhdGEubGFzdF91cGRhdGVkID0gbmV3IERhdGUoKS50b0lTT1N0cmluZygpO1xuICAgICAgYXdhaXQgdGhpcy53cml0ZVRvRmlsZShpbmRleCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBjdXN0b20gZXh0ZW5zaW9uIGRhdGFcbiAgICovXG4gIHB1YmxpYyBhc3luYyBhZGRFeHRlbnNpb24oa2V5OiBzdHJpbmcsIGRhdGE6IGFueSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGluZGV4ID0gYXdhaXQgdGhpcy5nZXRJbmRleCgpO1xuXG4gICAgaWYgKCFpbmRleC5leHRlbnNpb25zKSB7XG4gICAgICBpbmRleC5leHRlbnNpb25zID0ge307XG4gICAgfVxuXG4gICAgaW5kZXguZXh0ZW5zaW9uc1trZXldID0gZGF0YTtcbiAgICBpbmRleC5tZXRhZGF0YS5sYXN0X3VwZGF0ZWQgPSBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCk7XG5cbiAgICBhd2FpdCB0aGlzLndyaXRlVG9GaWxlKGluZGV4KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQZXJzaXN0IHRoZSBjdXJyZW50IGluLW1lbW9yeSBpbmRleCB0byBkaXNrXG4gICAqIFB1YmxpYyBtZXRob2QgZm9yIHRlc3RzIGFuZCBleHRlcm5hbCBjYWxsZXJzIHRvIHNhdmUgY3VycmVudCBzdGF0ZVxuICAgKi9cbiAgcHVibGljIGFzeW5jIHBlcnNpc3QoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCF0aGlzLmluZGV4KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIGluZGV4IGxvYWRlZCB0byBwZXJzaXN0Jyk7XG4gICAgfVxuICAgIGF3YWl0IHRoaXMud3JpdGVUb0ZpbGUodGhpcy5pbmRleCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGVsZW1lbnRzIGJ5IGFjdGlvbiB2ZXJiXG4gICAqIFRyYWNrcyB1c2FnZSBtZXRyaWNzIGZvciB0cmlnZ2VyIG9wdGltaXphdGlvblxuICAgKi9cbiAgcHVibGljIGFzeW5jIGdldEVsZW1lbnRzQnlBY3Rpb24odmVyYjogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICAgIGNvbnN0IGluZGV4ID0gYXdhaXQgdGhpcy5nZXRJbmRleCgpO1xuXG4gICAgLy8gVHJhY2sgdHJpZ2dlciB1c2FnZSBtZXRyaWNzXG4gICAgYXdhaXQgdGhpcy50cmFja1RyaWdnZXJVc2FnZSh2ZXJiKTtcblxuICAgIHJldHVybiBpbmRleC5hY3Rpb25fdHJpZ2dlcnNbdmVyYl0gfHwgW107XG4gIH1cblxuICAvKipcbiAgICogVHJhY2sgdHJpZ2dlciB1c2FnZSBmb3Igb3B0aW1pemF0aW9uIG1ldHJpY3NcbiAgICogU3VwcG9ydHMgYmF0Y2hpbmcgZm9yIGhpZ2gtdm9sdW1lIHNjZW5hcmlvcyB0byByZWR1Y2UgZGlzayB3cml0ZXNcbiAgICpcbiAgICogQHBhcmFtIHRyaWdnZXIgLSBUaGUgdHJpZ2dlciB2ZXJiIHRvIHRyYWNrXG4gICAqIEBwYXJhbSBpbW1lZGlhdGUgLSBGb3JjZSBpbW1lZGlhdGUgd3JpdGUgKGJ5cGFzcyBiYXRjaGluZylcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgdHJhY2tUcmlnZ2VyVXNhZ2UodHJpZ2dlcjogc3RyaW5nLCBpbW1lZGlhdGU6IGJvb2xlYW4gPSBmYWxzZSk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLm1ldHJpY3NUcmFja2VyLnRyYWNrKHRyaWdnZXIsIGltbWVkaWF0ZSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci53YXJuKCdGYWlsZWQgdG8gdHJhY2sgdHJpZ2dlciB1c2FnZScsIHsgdHJpZ2dlciwgZXJyb3IgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEZsdXNoIGJhdGNoZWQgbWV0cmljcyB0byBkaXNrXG4gICAqIENvbWJpbmVzIG11bHRpcGxlIG1ldHJpYyB1cGRhdGVzIGludG8gYSBzaW5nbGUgZGlzayB3cml0ZSBmb3IgZWZmaWNpZW5jeVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBmbHVzaE1ldHJpY3NCYXRjaCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLm1ldHJpY3NUcmFja2VyLmZsdXNoKCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGNvbXByZWhlbnNpdmUgdHJpZ2dlciB1c2FnZSBtZXRyaWNzIGZvciBvcHRpbWl6YXRpb24gYW5hbHlzaXNcbiAgICpcbiAgICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZpbmcgdG8gc29ydGVkIGFycmF5IG9mIHRyaWdnZXIgbWV0cmljc1xuICAgKiBAcmV0dXJucyB7QXJyYXk8T2JqZWN0Pn0gbWV0cmljcyAtIEFycmF5IG9mIHRyaWdnZXIgbWV0cmljIG9iamVjdHMgc29ydGVkIGJ5IHVzYWdlIGZyZXF1ZW5jeSAoZGVzY2VuZGluZylcbiAgICogQHJldHVybnMge3N0cmluZ30gbWV0cmljc1tdLnRyaWdnZXIgLSBUaGUgdHJpZ2dlciB3b3JkL3ZlcmJcbiAgICogQHJldHVybnMge251bWJlcn0gbWV0cmljc1tdLnVzYWdlX2NvdW50IC0gVG90YWwgbnVtYmVyIG9mIHRpbWVzIHRoaXMgdHJpZ2dlciBoYXMgYmVlbiB1c2VkXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IG1ldHJpY3NbXS5sYXN0X3VzZWQgLSBJU08gdGltZXN0YW1wIG9mIG1vc3QgcmVjZW50IHVzYWdlXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IG1ldHJpY3NbXS5maXJzdF91c2VkIC0gSVNPIHRpbWVzdGFtcCBvZiBmaXJzdCByZWNvcmRlZCB1c2FnZVxuICAgKiBAcmV0dXJucyB7bnVtYmVyfSBtZXRyaWNzW10uZGFpbHlfYXZlcmFnZSAtIEF2ZXJhZ2UgZGFpbHkgdXNhZ2UgYmFzZWQgb24gaGlzdG9yaWNhbCBkYXRhXG4gICAqIEByZXR1cm5zIHsnaW5jcmVhc2luZyd8J3N0YWJsZSd8J2RlY3JlYXNpbmcnfSBtZXRyaWNzW10udHJlbmQgLSBVc2FnZSB0cmVuZCBiYXNlZCBvbiBsYXN0IDcgZGF5c1xuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBjb25zdCBtZXRyaWNzID0gYXdhaXQgaW5kZXhNYW5hZ2VyLmdldFRyaWdnZXJNZXRyaWNzKCk7XG4gICAqIC8vIFJldHVybnM6IFtcbiAgICogLy8gICB7IHRyaWdnZXI6ICdkZWJ1ZycsIHVzYWdlX2NvdW50OiA0NSwgdHJlbmQ6ICdpbmNyZWFzaW5nJywgLi4uIH0sXG4gICAqIC8vICAgeyB0cmlnZ2VyOiAnYW5hbHl6ZScsIHVzYWdlX2NvdW50OiAzMiwgdHJlbmQ6ICdzdGFibGUnLCAuLi4gfVxuICAgKiAvLyBdXG4gICAqXG4gICAqIEBwdWJsaWNcbiAgICogQHNpbmNlIDEuOS45XG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZ2V0VHJpZ2dlck1ldHJpY3MoKTogUHJvbWlzZTx7XG4gICAgdHJpZ2dlcjogc3RyaW5nO1xuICAgIHVzYWdlX2NvdW50OiBudW1iZXI7XG4gICAgbGFzdF91c2VkOiBzdHJpbmc7XG4gICAgZmlyc3RfdXNlZDogc3RyaW5nO1xuICAgIGRhaWx5X2F2ZXJhZ2U6IG51bWJlcjtcbiAgICB0cmVuZDogJ2luY3JlYXNpbmcnIHwgJ3N0YWJsZScgfCAnZGVjcmVhc2luZyc7XG4gIH1bXT4ge1xuICAgIGNvbnN0IGluZGV4ID0gYXdhaXQgdGhpcy5nZXRJbmRleCgpO1xuXG4gICAgaWYgKCFpbmRleC5tZXRhZGF0YS50cmlnZ2VyX21ldHJpY3MpIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICBjb25zdCBtZXRyaWNzID0gaW5kZXgubWV0YWRhdGEudHJpZ2dlcl9tZXRyaWNzO1xuICAgIGNvbnN0IHJlc3VsdHM6IGFueVtdID0gW107XG5cbiAgICAvLyBDYWxjdWxhdGUgbWV0cmljcyBmb3IgZWFjaCB0cmlnZ2VyXG4gICAgZm9yIChjb25zdCB0cmlnZ2VyIGluIG1ldHJpY3MudXNhZ2VfY291bnQpIHtcbiAgICAgIC8vIENhbGN1bGF0ZSBkYWlseSBhdmVyYWdlXG4gICAgICBsZXQgdG90YWxEYWlseVVzYWdlID0gMDtcbiAgICAgIGxldCBkYXlzV2l0aFVzYWdlID0gMDtcbiAgICAgIGNvbnN0IHJlY2VudFVzYWdlOiBudW1iZXJbXSA9IFtdO1xuXG4gICAgICAvLyBHZXQgbGFzdCA3IGRheXMgb2YgdXNhZ2UgZm9yIHRyZW5kIGFuYWx5c2lzXG4gICAgICBjb25zdCB0b2RheSA9IG5ldyBEYXRlKCk7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IDc7IGkrKykge1xuICAgICAgICBjb25zdCBkYXRlID0gbmV3IERhdGUodG9kYXkpO1xuICAgICAgICBkYXRlLnNldERhdGUoZGF0ZS5nZXREYXRlKCkgLSBpKTtcbiAgICAgICAgY29uc3QgZGF0ZVN0ciA9IGRhdGUudG9JU09TdHJpbmcoKS5zcGxpdCgnVCcpWzBdO1xuXG4gICAgICAgIGlmIChtZXRyaWNzLmRhaWx5X3VzYWdlW2RhdGVTdHJdICYmIG1ldHJpY3MuZGFpbHlfdXNhZ2VbZGF0ZVN0cl1bdHJpZ2dlcl0pIHtcbiAgICAgICAgICByZWNlbnRVc2FnZS5wdXNoKG1ldHJpY3MuZGFpbHlfdXNhZ2VbZGF0ZVN0cl1bdHJpZ2dlcl0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlY2VudFVzYWdlLnB1c2goMCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gQ2FsY3VsYXRlIHRyZW5kIChzaW1wbGUgY29tcGFyaXNvbiBvZiBmaXJzdCBhbmQgbGFzdCAzIGRheXMpXG4gICAgICBjb25zdCBmaXJzdEhhbGYgPSByZWNlbnRVc2FnZS5zbGljZSg0LCA3KS5yZWR1Y2UoKGEsIGIpID0+IGEgKyBiLCAwKTtcbiAgICAgIGNvbnN0IHNlY29uZEhhbGYgPSByZWNlbnRVc2FnZS5zbGljZSgwLCAzKS5yZWR1Y2UoKGEsIGIpID0+IGEgKyBiLCAwKTtcbiAgICAgIGxldCB0cmVuZDogJ2luY3JlYXNpbmcnIHwgJ3N0YWJsZScgfCAnZGVjcmVhc2luZycgPSAnc3RhYmxlJztcblxuICAgICAgaWYgKHNlY29uZEhhbGYgPiBmaXJzdEhhbGYgKiAxLjIpIHRyZW5kID0gJ2luY3JlYXNpbmcnO1xuICAgICAgZWxzZSBpZiAoc2Vjb25kSGFsZiA8IGZpcnN0SGFsZiAqIDAuOCkgdHJlbmQgPSAnZGVjcmVhc2luZyc7XG5cbiAgICAgIC8vIENhbGN1bGF0ZSBvdmVyYWxsIGRhaWx5IGF2ZXJhZ2VcbiAgICAgIGZvciAoY29uc3QgZGF0ZSBpbiBtZXRyaWNzLmRhaWx5X3VzYWdlKSB7XG4gICAgICAgIGlmIChtZXRyaWNzLmRhaWx5X3VzYWdlW2RhdGVdW3RyaWdnZXJdKSB7XG4gICAgICAgICAgdG90YWxEYWlseVVzYWdlICs9IG1ldHJpY3MuZGFpbHlfdXNhZ2VbZGF0ZV1bdHJpZ2dlcl07XG4gICAgICAgICAgZGF5c1dpdGhVc2FnZSsrO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJlc3VsdHMucHVzaCh7XG4gICAgICAgIHRyaWdnZXIsXG4gICAgICAgIHVzYWdlX2NvdW50OiBtZXRyaWNzLnVzYWdlX2NvdW50W3RyaWdnZXJdLFxuICAgICAgICBsYXN0X3VzZWQ6IG1ldHJpY3MubGFzdF91c2VkW3RyaWdnZXJdLFxuICAgICAgICBmaXJzdF91c2VkOiBtZXRyaWNzLmZpcnN0X3VzZWRbdHJpZ2dlcl0sXG4gICAgICAgIGRhaWx5X2F2ZXJhZ2U6IGRheXNXaXRoVXNhZ2UgPiAwID8gdG90YWxEYWlseVVzYWdlIC8gZGF5c1dpdGhVc2FnZSA6IDAsXG4gICAgICAgIHRyZW5kXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBTb3J0IGJ5IHVzYWdlIGNvdW50IChkZXNjZW5kaW5nKVxuICAgIHJldHVybiByZXN1bHRzLnNvcnQoKGEsIGIpID0+IGIudXNhZ2VfY291bnQgLSBhLnVzYWdlX2NvdW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeHBvcnQgdHJpZ2dlciBtZXRyaWNzIGZvciBleHRlcm5hbCBhbmFseXRpY3Mgc3lzdGVtc1xuICAgKiBQcm92aWRlcyBkYXRhIGluIGEgZm9ybWF0IHN1aXRhYmxlIGZvciBhbmFseXRpY3MgcGxhdGZvcm1zXG4gICAqXG4gICAqIEBwYXJhbSBmb3JtYXQgLSBFeHBvcnQgZm9ybWF0ICgnanNvbicgfCAnY3N2JyB8ICdwcm9tZXRoZXVzJylcbiAgICogQHJldHVybnMgRm9ybWF0dGVkIG1ldHJpY3MgZGF0YVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiAvLyBFeHBvcnQgZm9yIFByb21ldGhldXMgbW9uaXRvcmluZ1xuICAgKiBjb25zdCBwcm9tZXRoZXVzTWV0cmljcyA9IGF3YWl0IGluZGV4TWFuYWdlci5leHBvcnRNZXRyaWNzKCdwcm9tZXRoZXVzJyk7XG4gICAqXG4gICAqIC8vIEV4cG9ydCBhcyBDU1YgZm9yIGRhdGEgYW5hbHlzaXNcbiAgICogY29uc3QgY3N2RGF0YSA9IGF3YWl0IGluZGV4TWFuYWdlci5leHBvcnRNZXRyaWNzKCdjc3YnKTtcbiAgICovXG4gIHB1YmxpYyBhc3luYyBleHBvcnRNZXRyaWNzKGZvcm1hdDogJ2pzb24nIHwgJ2NzdicgfCAncHJvbWV0aGV1cycgPSAnanNvbicpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IG1ldHJpY3MgPSBhd2FpdCB0aGlzLmdldFRyaWdnZXJNZXRyaWNzKCk7XG5cbiAgICBzd2l0Y2ggKGZvcm1hdCkge1xuICAgICAgY2FzZSAnY3N2Jzoge1xuICAgICAgICAvLyBDU1YgaGVhZGVyXG4gICAgICAgIGxldCBjc3YgPSAndHJpZ2dlcix1c2FnZV9jb3VudCxsYXN0X3VzZWQsZmlyc3RfdXNlZCxkYWlseV9hdmVyYWdlLHRyZW5kXFxuJztcblxuICAgICAgICAvLyBDU1Ygcm93c1xuICAgICAgICBmb3IgKGNvbnN0IG1ldHJpYyBvZiBtZXRyaWNzKSB7XG4gICAgICAgICAgY3N2ICs9IGBcIiR7bWV0cmljLnRyaWdnZXJ9XCIsJHttZXRyaWMudXNhZ2VfY291bnR9LFwiJHttZXRyaWMubGFzdF91c2VkfVwiLFwiJHttZXRyaWMuZmlyc3RfdXNlZH1cIiwke21ldHJpYy5kYWlseV9hdmVyYWdlLnRvRml4ZWQoMil9LFwiJHttZXRyaWMudHJlbmR9XCJcXG5gO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGNzdjtcbiAgICAgIH1cblxuICAgICAgY2FzZSAncHJvbWV0aGV1cyc6IHtcbiAgICAgICAgbGV0IG91dHB1dCA9ICcnO1xuICAgICAgICBjb25zdCB0aW1lc3RhbXAgPSBEYXRlLm5vdygpO1xuXG4gICAgICAgIC8vIFByb21ldGhldXMgbWV0cmljcyBmb3JtYXRcbiAgICAgICAgb3V0cHV0ICs9ICcjIEhFTFAgZW5oYW5jZWRfaW5kZXhfdHJpZ2dlcl91c2FnZSBUb3RhbCB1c2FnZSBjb3VudCBmb3IgZWFjaCB0cmlnZ2VyXFxuJztcbiAgICAgICAgb3V0cHV0ICs9ICcjIFRZUEUgZW5oYW5jZWRfaW5kZXhfdHJpZ2dlcl91c2FnZSBjb3VudGVyXFxuJztcblxuICAgICAgICBmb3IgKGNvbnN0IG1ldHJpYyBvZiBtZXRyaWNzKSB7XG4gICAgICAgICAgb3V0cHV0ICs9IGBlbmhhbmNlZF9pbmRleF90cmlnZ2VyX3VzYWdle3RyaWdnZXI9XCIke21ldHJpYy50cmlnZ2VyfVwiLHRyZW5kPVwiJHttZXRyaWMudHJlbmR9XCJ9ICR7bWV0cmljLnVzYWdlX2NvdW50fSAke3RpbWVzdGFtcH1cXG5gO1xuICAgICAgICB9XG5cbiAgICAgICAgb3V0cHV0ICs9ICdcXG4jIEhFTFAgZW5oYW5jZWRfaW5kZXhfdHJpZ2dlcl9kYWlseV9hdmcgQXZlcmFnZSBkYWlseSB1c2FnZSBmb3IgZWFjaCB0cmlnZ2VyXFxuJztcbiAgICAgICAgb3V0cHV0ICs9ICcjIFRZUEUgZW5oYW5jZWRfaW5kZXhfdHJpZ2dlcl9kYWlseV9hdmcgZ2F1Z2VcXG4nO1xuXG4gICAgICAgIGZvciAoY29uc3QgbWV0cmljIG9mIG1ldHJpY3MpIHtcbiAgICAgICAgICBvdXRwdXQgKz0gYGVuaGFuY2VkX2luZGV4X3RyaWdnZXJfZGFpbHlfYXZne3RyaWdnZXI9XCIke21ldHJpYy50cmlnZ2VyfVwifSAke21ldHJpYy5kYWlseV9hdmVyYWdlLnRvRml4ZWQoMil9ICR7dGltZXN0YW1wfVxcbmA7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gb3V0cHV0O1xuICAgICAgfVxuXG4gICAgICBjYXNlICdqc29uJzpcbiAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICB0aW1lc3RhbXA6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgICAgICBtZXRyaWNzLFxuICAgICAgICAgIHN1bW1hcnk6IHtcbiAgICAgICAgICAgIHRvdGFsX3RyaWdnZXJzOiBtZXRyaWNzLmxlbmd0aCxcbiAgICAgICAgICAgIHRvdGFsX3VzYWdlOiBtZXRyaWNzLnJlZHVjZSgoc3VtLCBtKSA9PiBzdW0gKyBtLnVzYWdlX2NvdW50LCAwKSxcbiAgICAgICAgICAgIHRyZW5kaW5nX3VwOiBtZXRyaWNzLmZpbHRlcihtID0+IG0udHJlbmQgPT09ICdpbmNyZWFzaW5nJykubGVuZ3RoLFxuICAgICAgICAgICAgdHJlbmRpbmdfZG93bjogbWV0cmljcy5maWx0ZXIobSA9PiBtLnRyZW5kID09PSAnZGVjcmVhc2luZycpLmxlbmd0aFxuICAgICAgICAgIH1cbiAgICAgICAgfSwgbnVsbCwgMik7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNlYXJjaCBmb3IgZWxlbWVudHMgdXNpbmcgZW5oYW5jZWQgY3JpdGVyaWFcbiAgICovXG4gIHB1YmxpYyBhc3luYyBzZWFyY2hFbmhhbmNlZChjcml0ZXJpYToge1xuICAgIHZlcmJzPzogc3RyaW5nW107XG4gICAga2V5d29yZHM/OiBzdHJpbmdbXTtcbiAgICB0eXBlPzogc3RyaW5nO1xuICAgIGhhc1JlbGF0aW9uc2hpcHM/OiBib29sZWFuO1xuICB9KTogUHJvbWlzZTxFbGVtZW50RGVmaW5pdGlvbltdPiB7XG4gICAgY29uc3QgaW5kZXggPSBhd2FpdCB0aGlzLmdldEluZGV4KCk7XG4gICAgY29uc3QgcmVzdWx0czogRWxlbWVudERlZmluaXRpb25bXSA9IFtdO1xuXG4gICAgZm9yIChjb25zdCBbdHlwZSwgZWxlbWVudHNdIG9mIE9iamVjdC5lbnRyaWVzKGluZGV4LmVsZW1lbnRzKSkge1xuICAgICAgLy8gRmlsdGVyIGJ5IHR5cGUgaWYgc3BlY2lmaWVkXG4gICAgICBpZiAoY3JpdGVyaWEudHlwZSAmJiB0eXBlICE9PSBjcml0ZXJpYS50eXBlKSBjb250aW51ZTtcblxuICAgICAgZm9yIChjb25zdCBbLCBlbGVtZW50XSBvZiBPYmplY3QuZW50cmllcyhlbGVtZW50cykpIHtcbiAgICAgICAgbGV0IG1hdGNoZXMgPSB0cnVlO1xuXG4gICAgICAgIC8vIENoZWNrIHZlcmIgbWF0Y2hlc1xuICAgICAgICBpZiAoY3JpdGVyaWEudmVyYnMgJiYgZWxlbWVudC5hY3Rpb25zKSB7XG4gICAgICAgICAgY29uc3QgZWxlbWVudFZlcmJzID0gT2JqZWN0LnZhbHVlcyhlbGVtZW50LmFjdGlvbnMpLm1hcChhID0+IGEudmVyYik7XG4gICAgICAgICAgbWF0Y2hlcyA9IGNyaXRlcmlhLnZlcmJzLnNvbWUodiA9PiBlbGVtZW50VmVyYnMuaW5jbHVkZXModikpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2hlY2sga2V5d29yZCBtYXRjaGVzXG4gICAgICAgIGlmIChtYXRjaGVzICYmIGNyaXRlcmlhLmtleXdvcmRzICYmIGVsZW1lbnQuc2VhcmNoPy5rZXl3b3Jkcykge1xuICAgICAgICAgIG1hdGNoZXMgPSBjcml0ZXJpYS5rZXl3b3Jkcy5zb21lKGsgPT5cbiAgICAgICAgICAgIGVsZW1lbnQuc2VhcmNoIS5rZXl3b3JkcyEuaW5jbHVkZXMoaylcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2hlY2sgcmVsYXRpb25zaGlwIHJlcXVpcmVtZW50XG4gICAgICAgIGlmIChtYXRjaGVzICYmIGNyaXRlcmlhLmhhc1JlbGF0aW9uc2hpcHMpIHtcbiAgICAgICAgICBtYXRjaGVzID0gISFlbGVtZW50LnJlbGF0aW9uc2hpcHMgJiZcbiAgICAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyhlbGVtZW50LnJlbGF0aW9uc2hpcHMpLmxlbmd0aCA+IDA7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobWF0Y2hlcykge1xuICAgICAgICAgIHJlc3VsdHMucHVzaChlbGVtZW50KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiByZXN1bHRzO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBjYWxjdWxhdGVTZW1hbnRpY1JlbGF0aW9uc2hpcHMoaW5kZXg6IEVuaGFuY2VkSW5kZXgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBjb25maWcgPSB0aGlzLmNvbmZpZy5nZXRDb25maWcoKTtcbiAgICBhd2FpdCB0aGlzLnNlbWFudGljUmVsYXRpb25zaGlwU2VydmljZS5jYWxjdWxhdGUoaW5kZXgsIGNvbmZpZyk7XG4gIH1cblxuICBcblxuICBcblxuICAvKipcbiAgICogRmluZCBzaG9ydGVzdCBwYXRoIGJldHdlZW4gdHdvIGVsZW1lbnRzXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZmluZEVsZW1lbnRQYXRoKFxuICAgIGZyb21FbGVtZW50OiBzdHJpbmcsXG4gICAgdG9FbGVtZW50OiBzdHJpbmcsXG4gICAgb3B0aW9ucz86IHtcbiAgICAgIHJlbGF0aW9uc2hpcFR5cGVzPzogc3RyaW5nW107XG4gICAgICBtaW5TdHJlbmd0aD86IG51bWJlcjtcbiAgICAgIG1heERlcHRoPzogbnVtYmVyO1xuICAgIH1cbiAgKTogUHJvbWlzZTxFbGVtZW50UGF0aCB8IG51bGw+IHtcbiAgICBjb25zdCBpbmRleCA9IGF3YWl0IHRoaXMuZ2V0SW5kZXgoKTtcbiAgICByZXR1cm4gdGhpcy5yZWxhdGlvbnNoaXBNYW5hZ2VyLmZpbmRQYXRoKGZyb21FbGVtZW50LCB0b0VsZW1lbnQsIGluZGV4LCBvcHRpb25zIGFzIGFueSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGFsbCBlbGVtZW50cyBjb25uZWN0ZWQgdG8gYSBnaXZlbiBlbGVtZW50XG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZ2V0Q29ubmVjdGVkRWxlbWVudHMoXG4gICAgZWxlbWVudDogc3RyaW5nLFxuICAgIG9wdGlvbnM/OiB7XG4gICAgICBtYXhEZXB0aD86IG51bWJlcjtcbiAgICAgIHJlbGF0aW9uc2hpcFR5cGVzPzogc3RyaW5nW107XG4gICAgICBtaW5TdHJlbmd0aD86IG51bWJlcjtcbiAgICB9XG4gICk6IFByb21pc2U8TWFwPHN0cmluZywgRWxlbWVudFBhdGg+PiB7XG4gICAgY29uc3QgaW5kZXggPSBhd2FpdCB0aGlzLmdldEluZGV4KCk7XG4gICAgcmV0dXJuIHRoaXMucmVsYXRpb25zaGlwTWFuYWdlci5nZXRDb25uZWN0ZWRFbGVtZW50cyhlbGVtZW50LCBpbmRleCwgb3B0aW9ucyBhcyBhbnkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCByZWxhdGlvbnNoaXAgc3RhdGlzdGljc1xuICAgKi9cbiAgcHVibGljIGFzeW5jIGdldFJlbGF0aW9uc2hpcFN0YXRzKCk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgbnVtYmVyPj4ge1xuICAgIGNvbnN0IGluZGV4ID0gYXdhaXQgdGhpcy5nZXRJbmRleCgpO1xuICAgIHJldHVybiB0aGlzLnJlbGF0aW9uc2hpcE1hbmFnZXIuZ2V0UmVsYXRpb25zaGlwU3RhdHMoaW5kZXgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhbGwgcmVsYXRpb25zaGlwcyBmb3IgYW4gZWxlbWVudFxuICAgKi9cbiAgcHVibGljIGFzeW5jIGdldEVsZW1lbnRSZWxhdGlvbnNoaXBzKGVsZW1lbnRJZDogc3RyaW5nKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBSZWxhdGlvbnNoaXBbXT4+IHtcbiAgICBjb25zdCBpbmRleCA9IGF3YWl0IHRoaXMuZ2V0SW5kZXgoKTtcbiAgICAvLyBGSVg6IFVzZSBjZW50cmFsaXplZCBlbGVtZW50IElEIHBhcnNpbmdcbiAgICBjb25zdCBwYXJzZWQgPSBwYXJzZUVsZW1lbnRJZChlbGVtZW50SWQpO1xuICAgIGlmICghcGFyc2VkKSB7XG4gICAgICByZXR1cm4ge307XG4gICAgfVxuICAgIGNvbnN0IGVsZW1lbnQgPSBpbmRleC5lbGVtZW50c1twYXJzZWQudHlwZV0/LltwYXJzZWQubmFtZV07XG5cbiAgICBpZiAoIWVsZW1lbnQpIHtcbiAgICAgIHJldHVybiB7fTtcbiAgICB9XG5cbiAgICByZXR1cm4gZWxlbWVudC5yZWxhdGlvbnNoaXBzIHx8IHt9O1xuICB9XG5cbiAgLyoqXG4gICAqIENsZWFuIHVwIG1lbW9yeSBieSBjbGVhcmluZyBjYWNoZXMgYW5kIG9sZCBkYXRhXG4gICAqIEZJWDogQWRkZWQgdG8gcHJldmVudCBtZW1vcnkgbGVha3MgYXMgaWRlbnRpZmllZCBpbiBQUiByZXZpZXdcbiAgICovXG4gIHB1YmxpYyBjbGVhck1lbW9yeUNhY2hlKCk6IHZvaWQge1xuICAgIGNvbnN0IG5vdyA9IG5ldyBEYXRlKCk7XG4gICAgY29uc3QgdGltZVNpbmNlTGFzdENsZWFudXAgPSBub3cuZ2V0VGltZSgpIC0gdGhpcy5sYXN0TWVtb3J5Q2xlYW51cC5nZXRUaW1lKCk7XG5cbiAgICAvLyBPbmx5IGNsZWFudXAgaWYgaXQncyBiZWVuIG1vcmUgdGhhbiA1IG1pbnV0ZXNcbiAgICAvLyBGSVg6IFVzZSBjb25maWd1cmF0aW9uIGZvciBjbGVhbnVwIGludGVydmFsIGNoZWNrXG4gICAgY29uc3QgY29uZmlnID0gdGhpcy5jb25maWcuZ2V0Q29uZmlnKCk7XG4gICAgY29uc3QgbWluQ2xlYW51cEludGVydmFsID0gY29uZmlnLm1lbW9yeS5jbGVhbnVwSW50ZXJ2YWxNaW51dGVzICogNjAgKiAxMDAwO1xuICAgIGlmICh0aW1lU2luY2VMYXN0Q2xlYW51cCA8IG1pbkNsZWFudXBJbnRlcnZhbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxvZ2dlci5kZWJ1ZygnUGVyZm9ybWluZyBtZW1vcnkgY2xlYW51cCBmb3IgRW5oYW5jZWQgSW5kZXgnKTtcblxuICAgIC8vIENsZWFyIE5MUCBzY29yaW5nIGNhY2hlc1xuICAgIGlmICh0aGlzLm5scFNjb3JpbmcpIHtcbiAgICAgICh0aGlzLm5scFNjb3JpbmcgYXMgYW55KS5jbGVhckNhY2hlPy4oKTtcbiAgICB9XG5cbiAgICAvLyBDbGVhciB2ZXJiIHRyaWdnZXIgY2FjaGVzXG4gICAgaWYgKHRoaXMudmVyYlRyaWdnZXJzKSB7XG4gICAgICAodGhpcy52ZXJiVHJpZ2dlcnMgYXMgYW55KS5jbGVhckNhY2hlPy4oKTtcbiAgICB9XG5cbiAgICAvLyBDbGVhciByZWxhdGlvbnNoaXAgbWFuYWdlciBjYWNoZXNcbiAgICBpZiAodGhpcy5yZWxhdGlvbnNoaXBNYW5hZ2VyKSB7XG4gICAgICAodGhpcy5yZWxhdGlvbnNoaXBNYW5hZ2VyIGFzIGFueSkuY2xlYXJDYWNoZT8uKCk7XG4gICAgfVxuXG4gICAgLy8gSWYgaW5kZXggaXMgc3RhbGUsIGNsZWFyIGl0IGZyb20gbWVtb3J5XG4gICAgLy8gRklYOiBVc2UgY29uZmlndXJhdGlvbiBmb3Igc3RhbGUgaW5kZXggbXVsdGlwbGllclxuICAgIGlmICh0aGlzLmluZGV4ICYmIHRoaXMubGFzdExvYWRlZCkge1xuICAgICAgY29uc3QgaW5kZXhBZ2UgPSBub3cuZ2V0VGltZSgpIC0gdGhpcy5sYXN0TG9hZGVkLmdldFRpbWUoKTtcbiAgICAgIGNvbnN0IHN0YWxlVGhyZXNob2xkID0gdGhpcy5UVExfTVMgKiBjb25maWcubWVtb3J5LnN0YWxlSW5kZXhNdWx0aXBsaWVyO1xuICAgICAgaWYgKGluZGV4QWdlID4gc3RhbGVUaHJlc2hvbGQpIHtcbiAgICAgICAgbG9nZ2VyLmRlYnVnKCdDbGVhcmluZyBzdGFsZSBpbmRleCBmcm9tIG1lbW9yeScsIHtcbiAgICAgICAgICBpbmRleEFnZSxcbiAgICAgICAgICBzdGFsZVRocmVzaG9sZCxcbiAgICAgICAgICBtdWx0aXBsaWVyOiBjb25maWcubWVtb3J5LnN0YWxlSW5kZXhNdWx0aXBsaWVyXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmluZGV4ID0gbnVsbDtcbiAgICAgICAgdGhpcy5sYXN0TG9hZGVkID0gbnVsbDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmxhc3RNZW1vcnlDbGVhbnVwID0gbm93O1xuICB9XG5cbiAgLyoqXG4gICAqIFN0YXJ0IGF1dG9tYXRpYyBtZW1vcnkgY2xlYW51cFxuICAgKi9cbiAgLy8gRklYOiBVc2UgY29uZmlndXJhdGlvbiBmb3IgZGVmYXVsdCBjbGVhbnVwIGludGVydmFsXG4gIHB1YmxpYyBzdGFydE1lbW9yeUNsZWFudXAoaW50ZXJ2YWxNcz86IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IGNvbmZpZyA9IHRoaXMuY29uZmlnLmdldENvbmZpZygpO1xuICAgIGNvbnN0IGFjdHVhbEludGVydmFsID0gaW50ZXJ2YWxNcyB8fCBjb25maWcubWVtb3J5LmNsZWFudXBJbnRlcnZhbE1pbnV0ZXMgKiA2MCAqIDEwMDA7XG4gICAgaWYgKHRoaXMubWVtb3J5Q2xlYW51cEludGVydmFsKSB7XG4gICAgICBjbGVhckludGVydmFsKHRoaXMubWVtb3J5Q2xlYW51cEludGVydmFsKTtcbiAgICB9XG5cbiAgICB0aGlzLm1lbW9yeUNsZWFudXBJbnRlcnZhbCA9IHNldEludGVydmFsKCgpID0+IHtcbiAgICAgIHRoaXMuY2xlYXJNZW1vcnlDYWNoZSgpO1xuICAgIH0sIGFjdHVhbEludGVydmFsKTtcbiAgICBpZiAodHlwZW9mIHRoaXMubWVtb3J5Q2xlYW51cEludGVydmFsLnVucmVmID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aGlzLm1lbW9yeUNsZWFudXBJbnRlcnZhbC51bnJlZigpO1xuICAgIH1cblxuICAgIGxvZ2dlci5kZWJ1ZygnU3RhcnRlZCBhdXRvbWF0aWMgbWVtb3J5IGNsZWFudXAnLCB7IGludGVydmFsTXM6IGFjdHVhbEludGVydmFsIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0b3AgYXV0b21hdGljIG1lbW9yeSBjbGVhbnVwXG4gICAqL1xuICBwdWJsaWMgc3RvcE1lbW9yeUNsZWFudXAoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMubWVtb3J5Q2xlYW51cEludGVydmFsKSB7XG4gICAgICBjbGVhckludGVydmFsKHRoaXMubWVtb3J5Q2xlYW51cEludGVydmFsKTtcbiAgICAgIHRoaXMubWVtb3J5Q2xlYW51cEludGVydmFsID0gbnVsbDtcbiAgICAgIGxvZ2dlci5kZWJ1ZygnU3RvcHBlZCBhdXRvbWF0aWMgbWVtb3J5IGNsZWFudXAnKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2xlYW4gdXAgYWxsIHJlc291cmNlcyAoZm9yIHRlc3RpbmcgYW5kIHNodXRkb3duKVxuICAgKi9cbiAgcHVibGljIGFzeW5jIGNsZWFudXAoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5zdG9wTWVtb3J5Q2xlYW51cCgpO1xuICAgIHRoaXMuY2xlYXJNZW1vcnlDYWNoZSgpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMubWV0cmljc1RyYWNrZXIuZmx1c2goKTtcbiAgICB9IGNhdGNoIChfZXJyb3IpIHtcbiAgICAgIC8vIElnbm9yZSBjbGVhbnVwIGZsdXNoIGVycm9yc1xuICAgIH1cbiAgICB0aGlzLm1ldHJpY3NUcmFja2VyLmRpc3Bvc2UoKTtcblxuICAgIGlmICh0aGlzLm5scFNjb3JpbmcgJiYgdHlwZW9mICh0aGlzLm5scFNjb3JpbmcgYXMgYW55KS5kaXNwb3NlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAodGhpcy5ubHBTY29yaW5nIGFzIGFueSkuZGlzcG9zZSgpO1xuICAgIH1cblxuICAgIC8vIFJlbGVhc2UgZmlsZSBsb2NrIGlmIGhlbGRcbiAgICBpZiAodGhpcy5maWxlTG9jaykge1xuICAgICAgYXdhaXQgdGhpcy5maWxlTG9jay5yZWxlYXNlKCkuY2F0Y2goKCkgPT4ge30pO1xuICAgIH1cbiAgfVxufVxuIl19
|
|
1113
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRW5oYW5jZWRJbmRleE1hbmFnZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcG9ydGZvbGlvL0VuaGFuY2VkSW5kZXhNYW5hZ2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBbUJHO0FBRUgsT0FBTyxLQUFLLElBQUksTUFBTSxNQUFNLENBQUM7QUFDN0IsT0FBTyxFQUFFLElBQUksSUFBSSxRQUFRLEVBQUUsSUFBSSxJQUFJLFFBQVEsRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUM3RCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFFNUMsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ2pFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDRDQUE0QyxDQUFDO0FBSzlFLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNoRCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFHdkQsT0FBTyxFQUNMLGFBQWEsRUFDYixxQkFBcUIsRUFDckIseUJBQXlCLEVBQzFCLE1BQU0sb0NBQW9DLENBQUM7QUEwQzVDLE1BQU0sT0FBTyxvQkFBb0I7SUFDdkIsS0FBSyxHQUF5QixJQUFJLENBQUM7SUFDbkMsU0FBUyxDQUFTO0lBQ2xCLFVBQVUsR0FBZ0IsSUFBSSxDQUFDO0lBQy9CLE1BQU0sQ0FBUztJQUNmLFVBQVUsR0FBRyxLQUFLLENBQUMsQ0FBRSxnQ0FBZ0M7SUFDckQsVUFBVSxDQUFvQjtJQUM5QixZQUFZLENBQXFCO0lBQ2pDLG1CQUFtQixDQUFzQjtJQUN6QyxNQUFNLENBQXFCO0lBQ2xCLGFBQWEsQ0FBZ0I7SUFDN0IscUJBQXFCLENBQXdCO0lBQ3RELFFBQVEsQ0FBVztJQUNuQixxQkFBcUIsR0FBMEIsSUFBSSxDQUFDO0lBQ3BELGlCQUFpQixHQUFTLElBQUksSUFBSSxFQUFFLENBQUM7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Q0FBQztZQUNoQiw4QkFBOEI7UUFDaEMsQ0FBQztRQUNELElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxFQUFFLENBQUM7UUFFOUIsSUFBSSxJQUFJLENBQUMsVUFBVSxJQUFJLE9BQVEsSUFBSSxDQUFDLFVBQWtCLENBQUMsT0FBTyxLQUFLLFVBQVUsRUFBRSxDQUFDO1lBQzdFLElBQUksQ0FBQyxVQUFrQixDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ3JDLENBQUM7UUFFRCw0QkFBNEI7UUFDNUIsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDbEIsTUFBTSxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsR0FBRSxDQUFDLENBQUMsQ0FBQztRQUNoRCxDQUFDO0lBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogRW5oYW5jZWQgSW5kZXggTWFuYWdlciAtIFBlcnNpc3RlbnQgWUFNTCBpbmRleCB3aXRoIGV4dGVuc2libGUgc2NoZW1hXG4gKlxuICogRmVhdHVyZXM6XG4gKiAtIEV4dGVuc2libGUgc2NoZW1hIHN1cHBvcnRpbmcgYXJiaXRyYXJ5IGVsZW1lbnQgdHlwZXMgYW5kIG1ldGFkYXRhXG4gKiAtIFBlcnNpc3RlbnQgWUFNTCBzdG9yYWdlIGZvciBodW1hbiByZWFkYWJpbGl0eVxuICogLSBJbmNyZW1lbnRhbCB1cGRhdGVzIHdpdGhvdXQgZnVsbCByZWdlbmVyYXRpb25cbiAqIC0gQmFja3dhcmQgY29tcGF0aWJsZSB3aXRoIHNjaGVtYSBldm9sdXRpb25cbiAqIC0gU2VydmVyLXNpZGUgc2VtYW50aWMgaW50ZWxsaWdlbmNlXG4gKlxuICogVGhpcyBtYW5hZ2VyIGNyZWF0ZXMgYW5kIG1haW50YWlucyBhIGNhcGFiaWxpdHkgaW5kZXggdGhhdCBlbmFibGVzOlxuICogLSBWZXJiLWJhc2VkIGFjdGlvbiB0cmlnZ2Vyc1xuICogLSBDcm9zcy1lbGVtZW50IHJlbGF0aW9uc2hpcHNcbiAqIC0gU2VtYW50aWMgc2NvcmluZyB3aXRoIEphY2NhcmQvZW50cm9weVxuICogLSBDb250ZXh0LWF3YXJlIGVsZW1lbnQgZGlzY292ZXJ5XG4gKlxuICogRklYRVMgSU1QTEVNRU5URUQgKElzc3VlICMxMDk5KTpcbiAqIC0gVXNlcyBjZW50cmFsaXplZCBlbGVtZW50IElEIHBhcnNpbmcgdXRpbGl0aWVzXG4gKiAtIENvbnNpc3RlbnQgSUQgZm9ybWF0IGhhbmRsaW5nIHRocm91Z2hvdXRcbiAqL1xuXG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgZHVtcCBhcyB5YW1sRHVtcCwgbG9hZCBhcyB5YW1sTG9hZCB9IGZyb20gJ2pzLXlhbWwnO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vdXRpbHMvbG9nZ2VyLmpzJztcbmltcG9ydCB7IFBvcnRmb2xpb0luZGV4TWFuYWdlciB9IGZyb20gJy4vUG9ydGZvbGlvSW5kZXhNYW5hZ2VyLmpzJztcbmltcG9ydCB7IFNlY3VyaXR5TW9uaXRvciB9IGZyb20gJy4uL3NlY3VyaXR5L3NlY3VyaXR5TW9uaXRvci5qcyc7XG5pbXBvcnQgeyBVbmljb2RlVmFsaWRhdG9yIH0gZnJvbSAnLi4vc2VjdXJpdHkvdmFsaWRhdG9ycy91bmljb2RlVmFsaWRhdG9yLmpzJztcbmltcG9ydCB7IE5MUFNjb3JpbmdNYW5hZ2VyIH0gZnJvbSAnLi9OTFBTY29yaW5nTWFuYWdlci5qcyc7XG5pbXBvcnQgeyBWZXJiVHJpZ2dlck1hbmFnZXIgfSBmcm9tICcuL1ZlcmJUcmlnZ2VyTWFuYWdlci5qcyc7XG5pbXBvcnQgeyBDb25maWdNYW5hZ2VyIH0gZnJvbSAnLi4vY29uZmlnL0NvbmZpZ01hbmFnZXIuanMnO1xuaW1wb3J0IHsgSW5kZXhDb25maWdNYW5hZ2VyIH0gZnJvbSAnLi9jb25maWcvSW5kZXhDb25maWcuanMnO1xuaW1wb3J0IHsgRmlsZUxvY2sgfSBmcm9tICcuLi91dGlscy9GaWxlTG9jay5qcyc7XG5pbXBvcnQgeyBwYXJzZUVsZW1lbnRJZCB9IGZyb20gJy4uL3V0aWxzL2VsZW1lbnRJZC5qcyc7XG5pbXBvcnQgeyBSZWxhdGlvbnNoaXBNYW5hZ2VyIH0gZnJvbSAnLi9SZWxhdGlvbnNoaXBNYW5hZ2VyLmpzJztcbmltcG9ydCB7IEZpbGVPcGVyYXRpb25zU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL0ZpbGVPcGVyYXRpb25zU2VydmljZS5qcyc7XG5pbXBvcnQge1xuICBNRU1PUllfTElNSVRTLFxuICBnZXRWYWxpZGF0ZWRCYXRjaFNpemUsXG4gIGdldFZhbGlkYXRlZEZsdXNoSW50ZXJ2YWxcbn0gZnJvbSAnLi4vY29uZmlnL3BlcmZvcm1hbmNlLWNvbnN0YW50cy5qcyc7XG5pbXBvcnQgeyBFbGVtZW50RGVmaW5pdGlvbkJ1aWxkZXIgfSBmcm9tICcuL2VuaGFuY2VkLWluZGV4L0VsZW1lbnREZWZpbml0aW9uQnVpbGRlci5qcyc7XG5pbXBvcnQge1xuICBBY3Rpb25UcmlnZ2VyRXh0cmFjdG9yLFxuICBUcmlnZ2VyRXh0cmFjdGlvbkNvbmZpZyxcbiAgVHJpZ2dlckV4dHJhY3Rpb25QYXR0ZXJuc1xufSBmcm9tICcuL2VuaGFuY2VkLWluZGV4L0FjdGlvblRyaWdnZXJFeHRyYWN0b3IuanMnO1xuaW1wb3J0IHsgVHJpZ2dlck1ldHJpY3NUcmFja2VyIH0gZnJvbSAnLi9lbmhhbmNlZC1pbmRleC9UcmlnZ2VyTWV0cmljc1RyYWNrZXIuanMnO1xuaW1wb3J0IHsgU2VtYW50aWNSZWxhdGlvbnNoaXBTZXJ2aWNlIH0gZnJvbSAnLi9lbmhhbmNlZC1pbmRleC9TZW1hbnRpY1JlbGF0aW9uc2hpcFNlcnZpY2UuanMnO1xuaW1wb3J0IHsgRW5oYW5jZWRJbmRleEhlbHBlcnMgfSBmcm9tICcuL2VuaGFuY2VkLWluZGV4L0VuaGFuY2VkSW5kZXhIZWxwZXJzLmpzJztcbmltcG9ydCB7XG4gIEVuaGFuY2VkSW5kZXgsXG4gIEluZGV4TWV0YWRhdGEsXG4gIEVsZW1lbnREZWZpbml0aW9uLFxuICBVc2VXaGVuUGF0dGVybixcbiAgUmVsYXRpb25zaGlwLFxuICBTZW1hbnRpY0RhdGEsXG4gIENvbnRleHRUcmFja2luZyxcbiAgS2V5d29yZFRyYWNraW5nLFxuICBSZWxhdGlvbnNoaXBUcmFja2luZyxcbiAgU2NvcmluZ0NvbmZpZyxcbiAgSW5kZXhPcHRpb25zLFxuICBFbGVtZW50UGF0aFxufSBmcm9tICcuL3R5cGVzL0luZGV4VHlwZXMuanMnO1xuXG4vLyBSZS1leHBvcnQgdHlwZXMgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHlcbmV4cG9ydCB0eXBlIHtcbiAgRW5oYW5jZWRJbmRleCxcbiAgSW5kZXhNZXRhZGF0YSxcbiAgRWxlbWVudERlZmluaXRpb24sXG4gIFVzZVdoZW5QYXR0ZXJuLFxuICBSZWxhdGlvbnNoaXAsXG4gIFNlbWFudGljRGF0YSxcbiAgQ29udGV4dFRyYWNraW5nLFxuICBLZXl3b3JkVHJhY2tpbmcsXG4gIFJlbGF0aW9uc2hpcFRyYWNraW5nLFxuICBTY29yaW5nQ29uZmlnLFxuICBJbmRleE9wdGlvbnMsXG4gIEVsZW1lbnRQYXRoXG59O1xuXG5cbmV4cG9ydCBjbGFzcyBFbmhhbmNlZEluZGV4TWFuYWdlciB7XG4gIHByaXZhdGUgaW5kZXg6IEVuaGFuY2VkSW5kZXggfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBpbmRleFBhdGg6IHN0cmluZztcbiAgcHJpdmF0ZSBsYXN0TG9hZGVkOiBEYXRlIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgVFRMX01TOiBudW1iZXI7XG4gIHByaXZhdGUgaXNCdWlsZGluZyA9IGZhbHNlOyAgLy8gVHJhY2sgaWYgaW5kZXggaXMgYmVpbmcgYnVpbHRcbiAgcHJpdmF0ZSBubHBTY29yaW5nOiBOTFBTY29yaW5nTWFuYWdlcjtcbiAgcHJpdmF0ZSB2ZXJiVHJpZ2dlcnM6IFZlcmJUcmlnZ2VyTWFuYWdlcjtcbiAgcHJpdmF0ZSByZWxhdGlvbnNoaXBNYW5hZ2VyOiBSZWxhdGlvbnNoaXBNYW5hZ2VyO1xuICBwcml2YXRlIGNvbmZpZzogSW5kZXhDb25maWdNYW5hZ2VyO1xuICBwcml2YXRlIHJlYWRvbmx5IGNvbmZpZ01hbmFnZXI6IENvbmZpZ01hbmFnZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgcG9ydGZvbGlvSW5kZXhNYW5hZ2VyOiBQb3J0Zm9saW9JbmRleE1hbmFnZXI7XG4gIHByaXZhdGUgZmlsZUxvY2s6IEZpbGVMb2NrO1xuICBwcml2YXRlIG1lbW9yeUNsZWFudXBJbnRlcnZhbDogTm9kZUpTLlRpbWVvdXQgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBsYXN0TWVtb3J5Q2xlYW51cDogRGF0ZSA9IG5ldyBEYXRlKCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgZWxlbWVudERlZmluaXRpb25CdWlsZGVyOiBFbGVtZW50RGVmaW5pdGlvbkJ1aWxkZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgYWN0aW9uVHJpZ2dlckV4dHJhY3RvcjogQWN0aW9uVHJpZ2dlckV4dHJhY3RvcjtcbiAgcHJpdmF0ZSByZWFkb25seSBtZXRyaWNzVHJhY2tlcjogVHJpZ2dlck1ldHJpY3NUcmFja2VyO1xuICBwcml2YXRlIHJlYWRvbmx5IHNlbWFudGljUmVsYXRpb25zaGlwU2VydmljZTogU2VtYW50aWNSZWxhdGlvbnNoaXBTZXJ2aWNlO1xuICBwcml2YXRlIHJlYWRvbmx5IGZpbGVPcGVyYXRpb25zOiBGaWxlT3BlcmF0aW9uc1NlcnZpY2U7XG5cbiAgLy8gVXNpbmcgY2VudHJhbGl6ZWQgY29uZmlndXJhdGlvbiBmb3IgbWV0cmljcyBiYXRjaGluZ1xuICBwcml2YXRlIHJlYWRvbmx5IE1FVFJJQ1NfQkFUQ0hfU0laRSA9IGdldFZhbGlkYXRlZEJhdGNoU2l6ZSgpO1xuICBwcml2YXRlIHJlYWRvbmx5IE1FVFJJQ1NfRkxVU0hfSU5URVJWQUwgPSBnZXRWYWxpZGF0ZWRGbHVzaEludGVydmFsKCk7XG5cbiAgLy8gQ2FjaGUgY29uZmlndXJhdGlvbiBjb25zdGFudHMgLSB1c2luZyBjZW50cmFsaXplZCBjb25maWd1cmF0aW9uXG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IE1BWF9NRVRSSUNTX0NBQ0hFX1NJWkUgPSBNRU1PUllfTElNSVRTLk1FVFJJQ1NfQ0FDSEUuTUFYX1NJWkU7XG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IE1BWF9NRVRSSUNTX0NBQ0hFX01FTU9SWV9NQiA9IE1FTU9SWV9MSU1JVFMuTUVUUklDU19DQUNIRS5NQVhfTUVNT1JZX01CO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBpbmRleENvbmZpZ01hbmFnZXI6IEluZGV4Q29uZmlnTWFuYWdlcixcbiAgICBjb25maWdNYW5hZ2VyOiBDb25maWdNYW5hZ2VyLFxuICAgIHBvcnRmb2xpb0luZGV4TWFuYWdlcjogUG9ydGZvbGlvSW5kZXhNYW5hZ2VyLFxuICAgIG5scFNjb3JpbmdNYW5hZ2VyOiBOTFBTY29yaW5nTWFuYWdlcixcbiAgICB2ZXJiVHJpZ2dlck1hbmFnZXI6IFZlcmJUcmlnZ2VyTWFuYWdlcixcbiAgICByZWxhdGlvbnNoaXBNYW5hZ2VyOiBSZWxhdGlvbnNoaXBNYW5hZ2VyLFxuICAgIGhlbHBlcnM6IEVuaGFuY2VkSW5kZXhIZWxwZXJzLFxuICAgIGZpbGVPcGVyYXRpb25zOiBGaWxlT3BlcmF0aW9uc1NlcnZpY2VcbiAgKSB7XG4gICAgY29uc3QgcG9ydGZvbGlvUGF0aCA9IHBhdGguam9pbihwcm9jZXNzLmVudi5IT01FIHx8ICcnLCAnLmRvbGxob3VzZScsICdwb3J0Zm9saW8nKTtcbiAgICB0aGlzLmluZGV4UGF0aCA9IHBhdGguam9pbihwb3J0Zm9saW9QYXRoLCAnY2FwYWJpbGl0eS1pbmRleC55YW1sJyk7XG5cbiAgICAvLyBJbml0aWFsaXplIGNvbmZpZ3VyYXRpb25cbiAgICB0aGlzLmNvbmZpZyA9IGluZGV4Q29uZmlnTWFuYWdlcjtcbiAgICB0aGlzLmNvbmZpZ01hbmFnZXIgPSBjb25maWdNYW5hZ2VyO1xuICAgIHRoaXMucG9ydGZvbGlvSW5kZXhNYW5hZ2VyID0gcG9ydGZvbGlvSW5kZXhNYW5hZ2VyO1xuICAgIHRoaXMuZmlsZU9wZXJhdGlvbnMgPSBmaWxlT3BlcmF0aW9ucztcbiAgICBjb25zdCBjb25maWcgPSB0aGlzLmNvbmZpZy5nZXRDb25maWcoKTtcbiAgICB0aGlzLlRUTF9NUyA9IGNvbmZpZy5pbmRleC50dGxNaW51dGVzICogNjAgKiAxMDAwO1xuXG4gICAgLy8gTG9hZCBlbmhhbmNlZCBpbmRleCBjb25maWcgZnJvbSBnbG9iYWwgQ29uZmlnTWFuYWdlclxuICAgIHRoaXMubG9hZEVuaGFuY2VkSW5kZXhDb25maWcoKTtcblxuICAgIC8vIEluaXRpYWxpemUgY29tcG9uZW50cyB3aXRoIGNvbmZpZ1xuICAgIHRoaXMubmxwU2NvcmluZyA9IG5scFNjb3JpbmdNYW5hZ2VyO1xuICAgIHRoaXMudmVyYlRyaWdnZXJzID0gdmVyYlRyaWdnZXJNYW5hZ2VyO1xuICAgIHRoaXMucmVsYXRpb25zaGlwTWFuYWdlciA9IHJlbGF0aW9uc2hpcE1hbmFnZXI7XG4gICAgdGhpcy5lbGVtZW50RGVmaW5pdGlvbkJ1aWxkZXIgPSBoZWxwZXJzLmVsZW1lbnREZWZpbml0aW9uQnVpbGRlcjtcbiAgICB0aGlzLnNlbWFudGljUmVsYXRpb25zaGlwU2VydmljZSA9IGhlbHBlcnMuc2VtYW50aWNSZWxhdGlvbnNoaXBTZXJ2aWNlO1xuICAgIHRoaXMuYWN0aW9uVHJpZ2dlckV4dHJhY3RvciA9IGhlbHBlcnMuY3JlYXRlQWN0aW9uVHJpZ2dlckV4dHJhY3Rvcih7XG4gICAgICBnZXRDb25maWc6ICgpID0+IEVuaGFuY2VkSW5kZXhNYW5hZ2VyLlZFUkJfRVhUUkFDVElPTl9DT05GSUcsXG4gICAgICBnZXRQYXR0ZXJuczogKCkgPT4gdGhpcy5nZXRUcmlnZ2VyUGF0dGVybnMoKVxuICAgIH0pO1xuICAgIHRoaXMubWV0cmljc1RyYWNrZXIgPSBoZWxwZXJzLmNyZWF0ZVRyaWdnZXJNZXRyaWNzVHJhY2tlcih7XG4gICAgICBiYXRjaFNpemU6IHRoaXMuTUVUUklDU19CQVRDSF9TSVpFLFxuICAgICAgZmx1c2hJbnRlcnZhbE1zOiB0aGlzLk1FVFJJQ1NfRkxVU0hfSU5URVJWQUwsXG4gICAgICBjYWNoZUxpbWl0czoge1xuICAgICAgICBtYXhTaXplOiBFbmhhbmNlZEluZGV4TWFuYWdlci5NQVhfTUVUUklDU19DQUNIRV9TSVpFLFxuICAgICAgICBtYXhNZW1vcnlNQjogRW5oYW5jZWRJbmRleE1hbmFnZXIuTUFYX01FVFJJQ1NfQ0FDSEVfTUVNT1JZX01CXG4gICAgICB9LFxuICAgICAgZ2V0SW5kZXg6ICgpID0+IHRoaXMuZ2V0SW5kZXgoKSxcbiAgICAgIHBlcnNpc3RJbmRleDogKGluZGV4KSA9PiB0aGlzLndyaXRlVG9GaWxlKGluZGV4KVxuICAgIH0pO1xuXG4gICAgLy8gSW5pdGlhbGl6ZSBmaWxlIGxvY2tcbiAgICB0aGlzLmZpbGVMb2NrID0gbmV3IEZpbGVMb2NrKHRoaXMuaW5kZXhQYXRoKTtcblxuICAgIGxvZ2dlci5kZWJ1ZygnRW5oYW5jZWRJbmRleE1hbmFnZXIgaW5pdGlhbGl6ZWQnLCB7XG4gICAgICBpbmRleFBhdGg6IHRoaXMuaW5kZXhQYXRoLFxuICAgICAgY29uZmlnOiB7XG4gICAgICAgIHR0bE1pbnV0ZXM6IGNvbmZpZy5pbmRleC50dGxNaW51dGVzLFxuICAgICAgICBtYXhFbGVtZW50czogY29uZmlnLnBlcmZvcm1hbmNlLm1heEVsZW1lbnRzRm9yRnVsbE1hdHJpeFxuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gU3RhcnQgYXV0b21hdGljIG1lbW9yeSBjbGVhbnVwIHRvIHByZXZlbnQgbGVha3NcbiAgICB0aGlzLnN0YXJ0TWVtb3J5Q2xlYW51cCgpO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGRpc3Bvc2UoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gQ2xlYXIgYWxsIHRpbWVyc1xuICAgIGlmICh0aGlzLm1lbW9yeUNsZWFudXBJbnRlcnZhbCkge1xuICAgICAgY2xlYXJJbnRlcnZhbCh0aGlzLm1lbW9yeUNsZWFudXBJbnRlcnZhbCk7XG4gICAgICB0aGlzLm1lbW9yeUNsZWFudXBJbnRlcnZhbCA9IG51bGw7XG4gICAgfVxuXG4gICAgLy8gRmx1c2ggcGVuZGluZyBtZXRyaWNzIGJlZm9yZSBkaXNwb3NhbFxuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLm1ldHJpY3NUcmFja2VyLmZsdXNoKCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci53YXJuKCdGYWlsZWQgdG8gZmx1c2ggbWV0cmljcyBiYXRjaCBkdXJpbmcgZGlzcG9zYWwnLCBlcnJvcik7XG4gICAgfVxuXG4gICAgdGhpcy5tZXRyaWNzVHJhY2tlci5kaXNwb3NlKCk7XG5cbiAgICAvLyBEaXNwb3NlIG9mIGZpbGUgbG9ja1xuICAgIGlmICh0aGlzLmZpbGVMb2NrKSB7XG4gICAgICB0aGlzLmZpbGVMb2NrLmRpc3Bvc2UoKTtcbiAgICB9XG5cbiAgICBsb2dnZXIuZGVidWcoJ0Rpc3Bvc2VkIEVuaGFuY2VkSW5kZXhNYW5hZ2VyIHRpbWVycyBhbmQgY2FjaGVzJyk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBjdXJyZW50IGluZGV4LCBsb2FkaW5nIG9yIGJ1aWxkaW5nIGFzIG5lZWRlZFxuICAgKi9cbiAgcHVibGljIGFzeW5jIGdldEluZGV4KG9wdGlvbnM6IEluZGV4T3B0aW9ucyA9IHt9KTogUHJvbWlzZTxFbmhhbmNlZEluZGV4PiB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIEFkZCBwZXJmb3JtYW5jZSB0cmFja2luZ1xuICAgICAgY29uc3Qgc3RhcnRUaW1lID0gRGF0ZS5ub3coKTtcbiAgICAgIGNvbnN0IG9wZXJhdGlvbiA9IG9wdGlvbnMuZm9yY2VSZWJ1aWxkID8gJ3JlYnVpbGQnIDpcbiAgICAgICAgICAgICAgICAgICAgICAgIXRoaXMuaW5kZXggPyAnbG9hZCcgOiAnY2FjaGVkJztcblxuICAgICAgaWYgKG9wdGlvbnMuZm9yY2VSZWJ1aWxkKSB7XG4gICAgICAgIGxvZ2dlci5pbmZvKCdGb3JjZSByZWJ1aWxkIHJlcXVlc3RlZCBmb3IgRW5oYW5jZWQgSW5kZXgnKTtcbiAgICAgICAgYXdhaXQgdGhpcy5idWlsZEluZGV4KG9wdGlvbnMpO1xuICAgICAgfSBlbHNlIGlmIChhd2FpdCB0aGlzLm5lZWRzUmVidWlsZCgpKSB7XG4gICAgICAgIGxvZ2dlci5pbmZvKCdFbmhhbmNlZCBJbmRleCBuZWVkcyByZWJ1aWxkJyk7XG4gICAgICAgIGF3YWl0IHRoaXMuYnVpbGRJbmRleChvcHRpb25zKTtcbiAgICAgIH0gZWxzZSBpZiAoIXRoaXMuaW5kZXgpIHtcbiAgICAgICAgLy8gVHJ5IHRvIGxvYWQgZnJvbSBmaWxlIGZpcnN0XG4gICAgICAgIGxvZ2dlci5pbmZvKCdMb2FkaW5nIEVuaGFuY2VkIEluZGV4IGZyb20gY2FjaGUgZmlsZScpO1xuICAgICAgICBhd2FpdCB0aGlzLmxvYWRJbmRleCgpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBlbGFwc2VkID0gRGF0ZS5ub3coKSAtIHN0YXJ0VGltZTtcbiAgICAgIC8vIE9ubHkgbG9nIGF0IGluZm8gZm9yIG5vbi10cml2aWFsIG9wZXJhdGlvbnMgKGFjdHVhbCBsb2Fkcy9idWlsZHMpXG4gICAgICBpZiAob3BlcmF0aW9uICE9PSAnY2FjaGVkJyB8fCBlbGFwc2VkID4gMTApIHtcbiAgICAgICAgbG9nZ2VyLmluZm8oJ0VuaGFuY2VkIEluZGV4IG9wZXJhdGlvbiBjb21wbGV0ZWQnLCB7XG4gICAgICAgICAgb3BlcmF0aW9uLFxuICAgICAgICAgIGVsYXBzZWRNczogZWxhcHNlZCxcbiAgICAgICAgICBlbGVtZW50czogdGhpcy5pbmRleD8ubWV0YWRhdGE/LnRvdGFsX2VsZW1lbnRzIHx8IDBcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChlbGFwc2VkID4gMTAwMCkge1xuICAgICAgICBsb2dnZXIud2FybignRW5oYW5jZWQgSW5kZXggb3BlcmF0aW9uIHRvb2sgbG9uZ2VyIHRoYW4gZXhwZWN0ZWQnLCB7XG4gICAgICAgICAgZWxhcHNlZE1zOiBlbGFwc2VkLFxuICAgICAgICAgIG9wZXJhdGlvblxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXMuaW5kZXghO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoJ0ZhaWxlZCB0byBnZXQgRW5oYW5jZWQgSW5kZXgnLCBlcnJvcik7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTG9hZCBpbmRleCBmcm9tIFlBTUwgZmlsZVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBsb2FkSW5kZXgoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHlhbWxDb250ZW50ID0gYXdhaXQgdGhpcy5maWxlT3BlcmF0aW9ucy5yZWFkRmlsZSh0aGlzLmluZGV4UGF0aCwge1xuICAgICAgICBzb3VyY2U6ICdFbmhhbmNlZEluZGV4TWFuYWdlci5sb2FkSW5kZXgnXG4gICAgICB9KTtcblxuICAgICAgbGV0IGxvYWRlZERhdGE7XG4gICAgICB0cnkge1xuICAgICAgICBsb2FkZWREYXRhID0geWFtbExvYWQoeWFtbENvbnRlbnQpO1xuICAgICAgfSBjYXRjaCAoeWFtbEVycm9yKSB7XG4gICAgICAgIC8vIEhhbmRsZSBZQU1MIHBhcnNlIGVycm9ycyBncmFjZWZ1bGx5XG4gICAgICAgIGxvZ2dlci53YXJuKCdGYWlsZWQgdG8gcGFyc2UgWUFNTCwgcmVidWlsZGluZyBpbmRleCcsIHlhbWxFcnJvcik7XG4gICAgICAgIGF3YWl0IHRoaXMuYnVpbGRJbmRleCgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIEZJWDogQWRkIGRlZmVuc2l2ZSBjaGVja3MgZm9yIG1hbGZvcm1lZCBZQU1MIHdpdGggdW5kZWZpbmVkL251bGwgaW5kZXhcbiAgICAgIC8vIFByZXZpb3VzbHk6IEFzc3VtZWQgeWFtbExvYWQgYWx3YXlzIHJldHVybnMgdmFsaWQgZGF0YVxuICAgICAgLy8gTm93OiBWYWxpZGF0ZSBzdHJ1Y3R1cmUgZGVlcGx5IHRvIGVuc3VyZSBhbGwgcmVxdWlyZWQgZmllbGRzIGV4aXN0XG4gICAgICBpZiAoIWxvYWRlZERhdGEgfHwgdHlwZW9mIGxvYWRlZERhdGEgIT09ICdvYmplY3QnKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKCdMb2FkZWQgWUFNTCBpcyBudWxsIG9yIG5vdCBhbiBvYmplY3QsIHJlYnVpbGRpbmcgaW5kZXgnKTtcbiAgICAgICAgYXdhaXQgdGhpcy5idWlsZEluZGV4KCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gVmFsaWRhdGUgcmVxdWlyZWQgc3RydWN0dXJlXG4gICAgICBjb25zdCBpbmRleERhdGEgPSBsb2FkZWREYXRhIGFzIGFueTtcbiAgICAgIGlmICghaW5kZXhEYXRhLm1ldGFkYXRhIHx8ICFpbmRleERhdGEuZWxlbWVudHMgfHwgIWluZGV4RGF0YS5hY3Rpb25fdHJpZ2dlcnMpIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oJ0ludmFsaWQgaW5kZXggc3RydWN0dXJlIChtaXNzaW5nIG1ldGFkYXRhLCBlbGVtZW50cywgb3IgYWN0aW9uX3RyaWdnZXJzKSwgcmVidWlsZGluZycsIHtcbiAgICAgICAgICBoYXNNZXRhZGF0YTogISFpbmRleERhdGEubWV0YWRhdGEsXG4gICAgICAgICAgaGFzRWxlbWVudHM6ICEhaW5kZXhEYXRhLmVsZW1lbnRzLFxuICAgICAgICAgIGhhc0FjdGlvblRyaWdnZXJzOiAhIWluZGV4RGF0YS5hY3Rpb25fdHJpZ2dlcnNcbiAgICAgICAgfSk7XG4gICAgICAgIGF3YWl0IHRoaXMuYnVpbGRJbmRleCgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHRoaXMuaW5kZXggPSBsb2FkZWREYXRhIGFzIEVuaGFuY2VkSW5kZXg7XG4gICAgICB0aGlzLmxhc3RMb2FkZWQgPSBuZXcgRGF0ZSgpO1xuXG4gICAgICAvLyBGSVg6IEFkZCBkZWZlbnNpdmUgY2hlY2tzIGZvciBtYWxmb3JtZWQgWUFNTCB3aXRoIHVuZGVmaW5lZCBtZXRhZGF0YVxuICAgICAgLy8gUHJldmlvdXNseTogQXNzdW1lZCBtZXRhZGF0YSBhbHdheXMgZXhpc3RzLCBjYXVzaW5nIHRlc3QgZmFpbHVyZXNcbiAgICAgIC8vIE5vdzogU2FmZWx5IGhhbmRsZSBjYXNlcyB3aGVyZSBtZXRhZGF0YSBtaWdodCBiZSB1bmRlZmluZWRcbiAgICAgIGxvZ2dlci5pbmZvKCdFbmhhbmNlZCBpbmRleCBsb2FkZWQnLCB7XG4gICAgICAgIGVsZW1lbnRzOiB0aGlzLmluZGV4Py5tZXRhZGF0YT8udG90YWxfZWxlbWVudHMgPz8gMCxcbiAgICAgICAgdmVyc2lvbjogdGhpcy5pbmRleD8ubWV0YWRhdGE/LnZlcnNpb24gPz8gJ3Vua25vd24nXG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKChlcnJvciBhcyBhbnkpLmNvZGUgPT09ICdFTk9FTlQnKSB7XG4gICAgICAgIGxvZ2dlci5pbmZvKCdObyBleGlzdGluZyBpbmRleCBmb3VuZCwgd2lsbCBidWlsZCBuZXcgb25lJyk7XG4gICAgICAgIGF3YWl0IHRoaXMuYnVpbGRJbmRleCgpO1xuICAgICAgICByZXR1cm47IC8vIFJldHVybiBlYXJseSBzaW5jZSBidWlsZEluZGV4IHdpbGwgc2V0IHVwIHRoZSBpbmRleFxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbG9nZ2VyLmVycm9yKCdGYWlsZWQgdG8gbG9hZCBpbmRleCcsIGVycm9yKTtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkIG9yIHJlYnVpbGQgdGhlIGluZGV4IGZyb20gcG9ydGZvbGlvXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGJ1aWxkSW5kZXgob3B0aW9uczogSW5kZXhPcHRpb25zID0ge30pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyBVc2UgZmlsZSBsb2NraW5nIHRvIHByZXZlbnQgY29uY3VycmVudCBidWlsZHNcbiAgICBjb25zdCBjb25maWcgPSB0aGlzLmNvbmZpZy5nZXRDb25maWcoKTtcbiAgICBjb25zdCBsb2NrQWNxdWlyZWQgPSBhd2FpdCB0aGlzLmZpbGVMb2NrLmFjcXVpcmUoe1xuICAgICAgdGltZW91dDogY29uZmlnLmluZGV4LmxvY2tUaW1lb3V0TXMsXG4gICAgICBzdGFsZTogNjAwMDAgIC8vIDEgbWludXRlXG4gICAgfSk7XG5cbiAgICBpZiAoIWxvY2tBY3F1aXJlZCkge1xuICAgICAgbG9nZ2VyLndhcm4oJ0NvdWxkIG5vdCBhY3F1aXJlIGxvY2sgZm9yIGluZGV4IGJ1aWxkJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5pc0J1aWxkaW5nID0gdHJ1ZTtcbiAgICBjb25zdCBzdGFydFRpbWUgPSBEYXRlLm5vdygpO1xuXG4gICAgdHJ5IHtcbiAgICAgIC8vIEdldCBleGlzdGluZyBpbmRleCBmb3IgcHJlc2VydmF0aW9uIG9mIGN1c3RvbSBmaWVsZHNcbiAgICAgIGNvbnN0IGV4aXN0aW5nSW5kZXggPSBvcHRpb25zLnByZXNlcnZlQ3VzdG9tICYmIHRoaXMuaW5kZXggPyB0aGlzLmluZGV4IDogbnVsbDtcblxuICAgICAgLy8gSW5pdGlhbGl6ZSBuZXcgaW5kZXggc3RydWN0dXJlXG4gICAgICBjb25zdCBuZXdJbmRleDogRW5oYW5jZWRJbmRleCA9IHtcbiAgICAgICAgbWV0YWRhdGE6IHtcbiAgICAgICAgICB2ZXJzaW9uOiAnMi4wLjAnLFxuICAgICAgICAgIGNyZWF0ZWQ6IGV4aXN0aW5nSW5kZXg/Lm1ldGFkYXRhLmNyZWF0ZWQgfHwgbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgICAgICAgIGxhc3RfdXBkYXRlZDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgICAgICAgIHRvdGFsX2VsZW1lbnRzOiAwXG4gICAgICAgIH0sXG4gICAgICAgIGFjdGlvbl90cmlnZ2Vyczoge30sXG4gICAgICAgIGVsZW1lbnRzOiB7fVxuICAgICAgfTtcblxuICAgICAgLy8gR2V0IHBvcnRmb2xpbyBpbmRleCBmb3IgZWxlbWVudCBkaXNjb3ZlcnlcbiAgICAgIGNvbnN0IHBvcnRmb2xpb0RhdGEgPSBhd2FpdCB0aGlzLnBvcnRmb2xpb0luZGV4TWFuYWdlci5nZXRJbmRleCgpO1xuXG4gICAgICAvLyBQcm9jZXNzIGVhY2ggZWxlbWVudCB0eXBlXG4gICAgICBmb3IgKGNvbnN0IFtlbGVtZW50VHlwZSwgZW50cmllc10gb2YgcG9ydGZvbGlvRGF0YS5ieVR5cGUuZW50cmllcygpKSB7XG4gICAgICAgIGlmICghbmV3SW5kZXguZWxlbWVudHNbZWxlbWVudFR5cGVdKSB7XG4gICAgICAgICAgbmV3SW5kZXguZWxlbWVudHNbZWxlbWVudFR5cGVdID0ge307XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXMpIHtcbiAgICAgICAgICAvLyBTa2lwIGlmIG5vdCBpbiB1cGRhdGUgbGlzdCAod2hlbiBzcGVjaWZpZWQpXG4gICAgICAgICAgLy8gRklYOiBBZGQgZGVmZW5zaXZlIGNoZWNrIGZvciBlbnRyeS5tZXRhZGF0YVxuICAgICAgICAgIGNvbnN0IGVudHJ5TmFtZSA9IGVudHJ5Lm1ldGFkYXRhPy5uYW1lO1xuICAgICAgICAgIGlmICghZW50cnlOYW1lKSB7XG4gICAgICAgICAgICBsb2dnZXIud2FybignU2tpcHBpbmcgZW50cnkgd2l0aCB1bmRlZmluZWQgbWV0YWRhdGEubmFtZScpO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKG9wdGlvbnMudXBkYXRlT25seSAmJiAhb3B0aW9ucy51cGRhdGVPbmx5LmluY2x1ZGVzKGVudHJ5TmFtZSkpIHtcbiAgICAgICAgICAgIC8vIFByZXNlcnZlIGV4aXN0aW5nIGVudHJ5XG4gICAgICAgICAgICBpZiAoZXhpc3RpbmdJbmRleD8uZWxlbWVudHNbZWxlbWVudFR5cGVdPy5bZW50cnlOYW1lXSkge1xuICAgICAgICAgICAgICBuZXdJbmRleC5lbGVtZW50c1tlbGVtZW50VHlwZV1bZW50cnlOYW1lXSA9XG4gICAgICAgICAgICAgICAgZXhpc3RpbmdJbmRleC5lbGVtZW50c1tlbGVtZW50VHlwZV1bZW50cnlOYW1lXTtcbiAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgZWxlbWVudERlZiA9IHRoaXMuZWxlbWVudERlZmluaXRpb25CdWlsZGVyLmJ1aWxkKGVudHJ5LCBleGlzdGluZ0luZGV4KTtcbiAgICAgICAgICBuZXdJbmRleC5lbGVtZW50c1tlbGVtZW50VHlwZV1bZW50cnlOYW1lXSA9IGVsZW1lbnREZWY7XG4gICAgICAgICAgbmV3SW5kZXgubWV0YWRhdGEudG90YWxfZWxlbWVudHMrKztcblxuICAgICAgICAgIC8vIEV4dHJhY3QgYWN0aW9uIHRyaWdnZXJzXG4gICAgICAgICAgdGhpcy5leHRyYWN0QWN0aW9uVHJpZ2dlcnMoZWxlbWVudERlZiwgZW50cnlOYW1lLCBuZXdJbmRleC5hY3Rpb25fdHJpZ2dlcnMpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIENhbGN1bGF0ZSBzZW1hbnRpYyByZWxhdGlvbnNoaXBzIHVzaW5nIE5MUFxuICAgICAgYXdhaXQgdGhpcy5jYWxjdWxhdGVTZW1hbnRpY1JlbGF0aW9uc2hpcHMobmV3SW5kZXgpO1xuXG4gICAgICAvLyBEaXNjb3ZlciBhZGRpdGlvbmFsIHJlbGF0aW9uc2hpcCB0eXBlc1xuICAgICAgYXdhaXQgdGhpcy5yZWxhdGlvbnNoaXBNYW5hZ2VyLmRpc2NvdmVyUmVsYXRpb25zaGlwcyhuZXdJbmRleCk7XG5cbiAgICAgIC8vIFByZXNlcnZlIGV4dGVuc2lvbnMgZnJvbSBleGlzdGluZyBpbmRleFxuICAgICAgaWYgKGV4aXN0aW5nSW5kZXg/LmV4dGVuc2lvbnMpIHtcbiAgICAgICAgbmV3SW5kZXguZXh0ZW5zaW9ucyA9IGV4aXN0aW5nSW5kZXguZXh0ZW5zaW9ucztcbiAgICAgIH1cblxuICAgICAgLy8gU2F2ZSB0byBmaWxlXG4gICAgICBhd2FpdCB0aGlzLndyaXRlVG9GaWxlKG5ld0luZGV4KTtcblxuICAgICAgdGhpcy5pbmRleCA9IG5ld0luZGV4O1xuICAgICAgdGhpcy5sYXN0TG9hZGVkID0gbmV3IERhdGUoKTtcblxuICAgICAgY29uc3QgZHVyYXRpb24gPSBEYXRlLm5vdygpIC0gc3RhcnRUaW1lO1xuICAgICAgbG9nZ2VyLmluZm8oJ0VuaGFuY2VkIGluZGV4IGJ1aWx0Jywge1xuICAgICAgICBkdXJhdGlvbjogYCR7ZHVyYXRpb259bXNgLFxuICAgICAgICBlbGVtZW50czogbmV3SW5kZXgubWV0YWRhdGEudG90YWxfZWxlbWVudHMsXG4gICAgICAgIHRyaWdnZXJzOiBPYmplY3Qua2V5cyhuZXdJbmRleC5hY3Rpb25fdHJpZ2dlcnMpLmxlbmd0aFxuICAgICAgfSk7XG5cbiAgICAgIC8vIExvZyBzZWN1cml0eSBldmVudFxuICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICB0eXBlOiAnUE9SVEZPTElPX0NBQ0hFX0lOVkFMSURBVElPTicsXG4gICAgICAgIHNldmVyaXR5OiAnTE9XJyxcbiAgICAgICAgc291cmNlOiAnZW5oYW5jZWRfaW5kZXgnLFxuICAgICAgICBkZXRhaWxzOiBgSW5kZXggcmVidWlsdCB3aXRoICR7bmV3SW5kZXgubWV0YWRhdGEudG90YWxfZWxlbWVudHN9IGVsZW1lbnRzIGluICR7ZHVyYXRpb259bXNgXG4gICAgICB9KTtcblxuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLmlzQnVpbGRpbmcgPSBmYWxzZTtcbiAgICAgIGF3YWl0IHRoaXMuZmlsZUxvY2sucmVsZWFzZSgpO1xuICAgIH1cbiAgfVxuXG4gIC8vIENvbmZpZ3VyYXRpb24gZm9yIHZlcmIgZXh0cmFjdGlvbiAod2lsbCBiZSBvdmVycmlkZGVuIGJ5IENvbmZpZ01hbmFnZXIpXG4gIHByaXZhdGUgc3RhdGljIFZFUkJfRVhUUkFDVElPTl9DT05GSUc6IFRyaWdnZXJFeHRyYWN0aW9uQ29uZmlnID0ge1xuICAgIC8vIFNlY3VyaXR5IGxpbWl0cyBmb3IgRG9TIHByb3RlY3Rpb25cbiAgICBsaW1pdHM6IHtcbiAgICAgIG1heFRyaWdnZXJzUGVyRWxlbWVudDogNTAsICAvLyBNYXhpbXVtIHRyaWdnZXJzIHRvIGV4dHJhY3QgcGVyIGVsZW1lbnRcbiAgICAgIG1heFRyaWdnZXJMZW5ndGg6IDUwLCAgICAgICAgLy8gTWF4aW11bSBsZW5ndGggZm9yIGEgc2luZ2xlIHRyaWdnZXJcbiAgICAgIG1heEtleXdvcmRzVG9DaGVjazogMTAwLCAgICAgLy8gTWF4aW11bSBrZXl3b3JkcyB0byBwcm9jZXNzIGZvciB2ZXJiIGRldGVjdGlvblxuICAgIH0sXG5cbiAgICAvLyBDb21tb24gdmVyYiBwcmVmaXhlcyBicm9rZW4gZG93biBieSBjYXRlZ29yeSBmb3IgbWFpbnRhaW5hYmlsaXR5XG4gICAgdmVyYlByZWZpeGVzOiB7XG4gICAgICBhY3Rpb25zOiBbJ2NyZWF0ZScsICdidWlsZCcsICdtYWtlJywgJ2dlbmVyYXRlJywgJ3Byb2R1Y2UnLCAnd3JpdGUnLCAnY29tcG9zZSddLFxuICAgICAgYW5hbHlzaXM6IFsnYW5hbHl6ZScsICdyZXZpZXcnLCAnZXhhbWluZScsICdpbnZlc3RpZ2F0ZScsICdpbnNwZWN0JywgJ2V2YWx1YXRlJywgJ2Fzc2VzcyddLFxuICAgICAgZGVidWdnaW5nOiBbJ2RlYnVnJywgJ2ZpeCcsICd0cm91Ymxlc2hvb3QnLCAnc29sdmUnLCAncmVzb2x2ZScsICdyZXBhaXInLCAncGF0Y2gnXSxcbiAgICAgIG9wZXJhdGlvbnM6IFsncnVuJywgJ2V4ZWN1dGUnLCAnc3RhcnQnLCAnc3RvcCcsICdkZXBsb3knLCAnY29uZmlndXJlJywgJ2luc3RhbGwnXSxcbiAgICAgIG1vZGlmaWNhdGlvbjogWyd1cGRhdGUnLCAnbW9kaWZ5JywgJ2NoYW5nZScsICdlZGl0JywgJ2FsdGVyJywgJ3RyYW5zZm9ybScsICdyZWZhY3RvciddLFxuICAgICAgcmVtb3ZhbDogWydkZWxldGUnLCAncmVtb3ZlJywgJ2NsZWFyJywgJ2NsZWFuJywgJ3B1cmdlJywgJ2Rlc3Ryb3knLCAnZWxpbWluYXRlJ10sXG4gICAgICBpbmZvcm1hdGlvbjogWydleHBsYWluJywgJ2Rlc2NyaWJlJywgJ2RvY3VtZW50JywgJ3NlYXJjaCcsICdmaW5kJywgJ2NoZWNrJywgJ3ZhbGlkYXRlJ10sXG4gICAgICBvcHRpbWl6YXRpb246IFsnb3B0aW1pemUnLCAnaW1wcm92ZScsICdlbmhhbmNlJywgJ3N0cmVhbWxpbmUnLCAnYWNjZWxlcmF0ZSddLFxuICAgICAgdGVzdGluZzogWyd0ZXN0JywgJ3ZlcmlmeScsICd2YWxpZGF0ZScsICdjb25maXJtJywgJ2Fzc2VydCcsICdlbnN1cmUnXSxcbiAgICB9LFxuXG4gICAgLy8gQ29tbW9uIHZlcmIgc3VmZml4ZXMgdGhhdCBpbmRpY2F0ZSBhY3Rpb24gd29yZHNcbiAgICB2ZXJiU3VmZml4ZXM6IFsnaWZ5JywgJ2l6ZScsICdhdGUnLCAnZW4nLCAnZnknXSxcblxuICAgIC8vIE5vdW4gc3VmZml4ZXMgdGhhdCBpbmRpY2F0ZSBub24tdmVyYnMgKHRvIGZpbHRlciBvdXQpXG4gICAgbm91blN1ZmZpeGVzOiBbJ3Rpb24nLCAnc2lvbicsICdtZW50JywgJ25lc3MnLCAnYW5jZScsICdlbmNlJywgJ2l0eScsICdpc20nLCAnc2hpcCcsICdob29kJywgJ2RvbScsICdlcnknLCAnaW5nJ10sXG5cbiAgICAvLyBUZWxlbWV0cnkgc2V0dGluZ3NcbiAgICB0ZWxlbWV0cnk6IHtcbiAgICAgIGVuYWJsZWQ6IGZhbHNlLCAgLy8gV2lsbCBiZSBjb25maWd1cmFibGUgdmlhIGVudmlyb25tZW50IHZhcmlhYmxlXG4gICAgICBzYW1wbGVSYXRlOiAwLjEsIC8vIFNhbXBsZSAxMCUgb2Ygb3BlcmF0aW9ucyB3aGVuIGVuYWJsZWRcbiAgICAgIG1ldHJpY3NJbnRlcnZhbDogNjAwMDAsIC8vIFJlcG9ydCBtZXRyaWNzIGV2ZXJ5IDYwIHNlY29uZHNcbiAgICB9XG4gIH07XG5cbiAgLy8gUHJlLWNvbXBpbGVkIHJlZ2V4IHBhdHRlcm5zIGJ1aWx0IGZyb20gY29uZmlnIChjYW4gYmUgdXBkYXRlZCBmcm9tIENvbmZpZ01hbmFnZXIpXG4gIHByaXZhdGUgc3RhdGljIFZFUkJfUFJFRklYX1BBVFRFUk4gPSBuZXcgUmVnRXhwKFxuICAgIGBeKCR7T2JqZWN0LnZhbHVlcyhFbmhhbmNlZEluZGV4TWFuYWdlci5WRVJCX0VYVFJBQ1RJT05fQ09ORklHLnZlcmJQcmVmaXhlcylcbiAgICAgIC5mbGF0KClcbiAgICAgIC5qb2luKCd8Jyl9KWBcbiAgKTtcblxuICBwcml2YXRlIHN0YXRpYyBWRVJCX1NVRkZJWF9QQVRURVJOID0gbmV3IFJlZ0V4cChcbiAgICBgKCR7RW5oYW5jZWRJbmRleE1hbmFnZXIuVkVSQl9FWFRSQUNUSU9OX0NPTkZJRy52ZXJiU3VmZml4ZXMuam9pbignfCcpfSkkYFxuICApO1xuXG4gIHByaXZhdGUgc3RhdGljIE5PVU5fU1VGRklYX1BBVFRFUk4gPSBuZXcgUmVnRXhwKFxuICAgIGAoJHtFbmhhbmNlZEluZGV4TWFuYWdlci5WRVJCX0VYVFJBQ1RJT05fQ09ORklHLm5vdW5TdWZmaXhlcy5qb2luKCd8Jyl9KSRgXG4gICk7XG5cbiAgcHJpdmF0ZSBnZXRUcmlnZ2VyUGF0dGVybnMoKTogVHJpZ2dlckV4dHJhY3Rpb25QYXR0ZXJucyB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHZlcmJQcmVmaXhQYXR0ZXJuOiBFbmhhbmNlZEluZGV4TWFuYWdlci5WRVJCX1BSRUZJWF9QQVRURVJOLFxuICAgICAgdmVyYlN1ZmZpeFBhdHRlcm46IEVuaGFuY2VkSW5kZXhNYW5hZ2VyLlZFUkJfU1VGRklYX1BBVFRFUk4sXG4gICAgICBub3VuU3VmZml4UGF0dGVybjogRW5oYW5jZWRJbmRleE1hbmFnZXIuTk9VTl9TVUZGSVhfUEFUVEVSTlxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogRXh0cmFjdCBhY3Rpb24gdHJpZ2dlcnMgZnJvbSBlbGVtZW50IGRlZmluaXRpb25cbiAgICpcbiAgICogRklYOiBFbmhhbmNlZCB2ZXJiIGV4dHJhY3Rpb24gZnJvbSBtdWx0aXBsZSBzb3VyY2VzXG4gICAqIFByZXZpb3VzbHk6IE9ubHkgY2hlY2tlZCBlbGVtZW50RGVmLmFjdGlvbnMgd2hpY2ggcGVyc29uYXMgZG9uJ3QgaGF2ZVxuICAgKiBOb3c6IENoZWNrcyBzZWFyY2gudHJpZ2dlcnMgKHBlcnNvbmFzKSwgYWN0aW9ucyBmaWVsZCwgYW5kIGtleXdvcmRzXG4gICAqXG4gICAqIFNlY3VyaXR5IGltcHJvdmVtZW50czpcbiAgICogLSBBZGRlZCB0cmlnZ2VyIGNvdW50IGxpbWl0c1xuICAgKiAtIEFkZGVkIHRyaWdnZXIgbGVuZ3RoIHZhbGlkYXRpb25cbiAgICogLSBVc2luZyBTZXRzIGZvciBPKDEpIGR1cGxpY2F0ZSBjaGVja2luZ1xuICAgKiAtIFByZS1jb21waWxlZCByZWdleCBwYXR0ZXJuc1xuICAgKlxuICAgKiBGdXR1cmUgZW5oYW5jZW1lbnRzOlxuICAgKiAtIEJhY2tncm91bmQgZGVlcCBjb250ZW50IGFuYWx5c2lzIGZvciBkeW5hbWljIHZlcmIgZXh0cmFjdGlvblxuICAgKiAtIFRoaXMgY291bGQgc2NhbiBlbGVtZW50IGRlc2NyaXB0aW9ucyBhbmQgY29udGVudCB0byBmaW5kIGFjdGlvbiB3b3Jkc1xuICAgKiAtIFdvdWxkIHJ1biBhc3luY2hyb25vdXNseSB0byBhdm9pZCBibG9ja2luZyBtYWluIG9wZXJhdGlvbnNcbiAgICogLSBSZXN1bHRzIHdvdWxkIHByb2dyZXNzaXZlbHkgZW5oYW5jZSB0aGUgaW5kZXggb3ZlciB0aW1lXG4gICAqL1xuICBwcml2YXRlIGV4dHJhY3RBY3Rpb25UcmlnZ2VycyhcbiAgICBlbGVtZW50RGVmOiBFbGVtZW50RGVmaW5pdGlvbixcbiAgICBlbGVtZW50TmFtZTogc3RyaW5nLFxuICAgIHRyaWdnZXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT5cbiAgKTogdm9pZCB7XG4gICAgaWYgKCFlbGVtZW50RGVmKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgdGVsZW1ldHJ5U3RhcnRUaW1lID0gdGhpcy5zdGFydFRlbGVtZXRyeSgnZXh0cmFjdEFjdGlvblRyaWdnZXJzJyk7XG4gICAgY29uc3QgcmVzdWx0ID0gdGhpcy5hY3Rpb25UcmlnZ2VyRXh0cmFjdG9yLmV4dHJhY3QoZWxlbWVudERlZiwgZWxlbWVudE5hbWUpO1xuXG4gICAgZm9yIChjb25zdCB0cmlnZ2VyIG9mIHJlc3VsdC50cmlnZ2Vycykge1xuICAgICAgdGhpcy5hZGRUcmlnZ2VyTWFwcGluZyh0cmlnZ2VyLCBlbGVtZW50TmFtZSwgdHJpZ2dlcnMpO1xuICAgIH1cblxuICAgIHRoaXMucmVjb3JkVGVsZW1ldHJ5KCdleHRyYWN0QWN0aW9uVHJpZ2dlcnMnLCB0ZWxlbWV0cnlTdGFydFRpbWUsIHtcbiAgICAgIGVsZW1lbnROYW1lLFxuICAgICAgZWxlbWVudFR5cGU6IGVsZW1lbnREZWY/LmNvcmU/LnR5cGUsXG4gICAgICB0cmlnZ2Vyc0V4dHJhY3RlZDogcmVzdWx0LmV4dHJhY3RlZENvdW50LFxuICAgICAgdW5pcXVlVHJpZ2dlcnM6IHJlc3VsdC50cmlnZ2Vycy5sZW5ndGgsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQWRkIGEgdHJpZ2dlciB0byBlbGVtZW50IG1hcHBpbmdcbiAgICogUHJlc2VydmVzIG9yaWdpbmFsIGVsZW1lbnQgbmFtZSBjYXNpbmcgZm9yIHByb3BlciByZXNvbHV0aW9uXG4gICAqXG4gICAqIE5vdGU6IFRyaWdnZXJzIGFyZSBwZXJzaXN0ZWQgaW4gdGhlIGluZGV4IGZpbGUgdW5kZXIgYWN0aW9uX3RyaWdnZXJzXG4gICAqIFVzYWdlIG1ldHJpY3MgYXJlIHRyYWNrZWQgdmlhIHRyYWNrVHJpZ2dlclVzYWdlKCkgYW5kIGNhbiBiZSByZXRyaWV2ZWQgd2l0aCBnZXRUcmlnZ2VyTWV0cmljcygpXG4gICAqL1xuICBwcml2YXRlIGFkZFRyaWdnZXJNYXBwaW5nKFxuICAgIHZlcmI6IHN0cmluZyxcbiAgICBlbGVtZW50TmFtZTogc3RyaW5nLFxuICAgIHRyaWdnZXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT5cbiAgKTogdm9pZCB7XG4gICAgLy8gU3RvcmUgdmVyYiBpbiBsb3dlcmNhc2UgZm9yIGNvbnNpc3RlbnQgbG9va3VwXG4gICAgY29uc3Qgbm9ybWFsaXplZFZlcmIgPSB2ZXJiLnRvTG93ZXJDYXNlKCk7XG5cbiAgICBpZiAoIXRyaWdnZXJzW25vcm1hbGl6ZWRWZXJiXSkge1xuICAgICAgdHJpZ2dlcnNbbm9ybWFsaXplZFZlcmJdID0gW107XG4gICAgfVxuXG4gICAgLy8gUHJlc2VydmUgb3JpZ2luYWwgZWxlbWVudCBuYW1lIGNhc2luZyBmb3IgYWNjdXJhdGUgcmVzb2x1dGlvblxuICAgIC8vIFRoaXMgc3VwcG9ydHMgdmFyaW91cyBuYW1pbmcgY29udmVudGlvbnMgdXNlcnMgbWlnaHQgdXNlOlxuICAgIC8vIC0gbG93ZXJjYXNlOiBkZWJ1Zy1kZXRlY3RpdmVcbiAgICAvLyAtIGtlYmFiLWNhc2U6IERlYnVnLURldGVjdGl2ZVxuICAgIC8vIC0gc25ha2VfY2FzZTogZGVidWdfZGV0ZWN0aXZlXG4gICAgLy8gLSBDYW1lbENhc2U6IERlYnVnRGV0ZWN0aXZlXG4gICAgLy8gLSBDdXN0b206IERlQnVHLURlVGVjVGlWZVxuICAgIGlmICghdHJpZ2dlcnNbbm9ybWFsaXplZFZlcmJdLmluY2x1ZGVzKGVsZW1lbnROYW1lKSkge1xuICAgICAgdHJpZ2dlcnNbbm9ybWFsaXplZFZlcmJdLnB1c2goZWxlbWVudE5hbWUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBMb2FkIGVuaGFuY2VkIGluZGV4IGNvbmZpZ3VyYXRpb24gZnJvbSBDb25maWdNYW5hZ2VyXG4gICAqL1xuICBwcml2YXRlIGxvYWRFbmhhbmNlZEluZGV4Q29uZmlnKCk6IHZvaWQge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBjb25maWdNYW5hZ2VyID0gdGhpcy5jb25maWdNYW5hZ2VyO1xuICAgICAgY29uc3QgY29uZmlnID0gY29uZmlnTWFuYWdlci5nZXRDb25maWcoKTtcblxuICAgICAgLy8gVXBkYXRlIGxpbWl0cyBmcm9tIGNvbmZpZ1xuICAgICAgaWYgKGNvbmZpZy5lbGVtZW50cz8uZW5oYW5jZWRfaW5kZXgpIHtcbiAgICAgICAgY29uc3QgZW5oYW5jZWRDb25maWcgPSBjb25maWcuZWxlbWVudHMuZW5oYW5jZWRfaW5kZXg7XG5cbiAgICAgICAgLy8gVXBkYXRlIGxpbWl0c1xuICAgICAgICBpZiAoZW5oYW5jZWRDb25maWcubGltaXRzKSB7XG4gICAgICAgICAgRW5oYW5jZWRJbmRleE1hbmFnZXIuVkVSQl9FWFRSQUNUSU9OX0NPTkZJRy5saW1pdHMgPSB7XG4gICAgICAgICAgICAuLi5FbmhhbmNlZEluZGV4TWFuYWdlci5WRVJCX0VYVFJBQ1RJT05fQ09ORklHLmxpbWl0cyxcbiAgICAgICAgICAgIC4uLmVuaGFuY2VkQ29uZmlnLmxpbWl0c1xuICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICAvLyBVcGRhdGUgdGVsZW1ldHJ5IHNldHRpbmdzXG4gICAgICAgIGlmIChlbmhhbmNlZENvbmZpZy50ZWxlbWV0cnkpIHtcbiAgICAgICAgICBFbmhhbmNlZEluZGV4TWFuYWdlci5WRVJCX0VYVFJBQ1RJT05fQ09ORklHLnRlbGVtZXRyeSA9IHtcbiAgICAgICAgICAgIC4uLkVuaGFuY2VkSW5kZXhNYW5hZ2VyLlZFUkJfRVhUUkFDVElPTl9DT05GSUcudGVsZW1ldHJ5LFxuICAgICAgICAgICAgLi4uZW5oYW5jZWRDb25maWcudGVsZW1ldHJ5XG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEFkZCBjdXN0b20gdmVyYiBwYXR0ZXJucyBpZiBwcm92aWRlZFxuICAgICAgICBpZiAoZW5oYW5jZWRDb25maWcudmVyYlBhdHRlcm5zKSB7XG4gICAgICAgICAgY29uc3QgcGF0dGVybnMgPSBlbmhhbmNlZENvbmZpZy52ZXJiUGF0dGVybnM7XG5cbiAgICAgICAgICAvLyBBZGQgY3VzdG9tIHByZWZpeGVzXG4gICAgICAgICAgaWYgKHBhdHRlcm5zLmN1c3RvbVByZWZpeGVzICYmIHBhdHRlcm5zLmN1c3RvbVByZWZpeGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGNvbnN0IGFsbFByZWZpeGVzID0gW1xuICAgICAgICAgICAgICAuLi5PYmplY3QudmFsdWVzKEVuaGFuY2VkSW5kZXhNYW5hZ2VyLlZFUkJfRVhUUkFDVElPTl9DT05GSUcudmVyYlByZWZpeGVzKS5mbGF0KCksXG4gICAgICAgICAgICAgIC4uLnBhdHRlcm5zLmN1c3RvbVByZWZpeGVzXG4gICAgICAgICAgICBdO1xuICAgICAgICAgICAgRW5oYW5jZWRJbmRleE1hbmFnZXIuVkVSQl9QUkVGSVhfUEFUVEVSTiA9IHRoaXMuY29tcGlsZUFuZFZhbGlkYXRlUmVnZXgoXG4gICAgICAgICAgICAgIGBeKCR7YWxsUHJlZml4ZXMuam9pbignfCcpfSlgLFxuICAgICAgICAgICAgICAndmVyYiBwcmVmaXgnXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIEFkZCBjdXN0b20gc3VmZml4ZXNcbiAgICAgICAgICBpZiAocGF0dGVybnMuY3VzdG9tU3VmZml4ZXMgJiYgcGF0dGVybnMuY3VzdG9tU3VmZml4ZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgY29uc3QgYWxsU3VmZml4ZXMgPSBbXG4gICAgICAgICAgICAgIC4uLkVuaGFuY2VkSW5kZXhNYW5hZ2VyLlZFUkJfRVhUUkFDVElPTl9DT05GSUcudmVyYlN1ZmZpeGVzLFxuICAgICAgICAgICAgICAuLi5wYXR0ZXJucy5jdXN0b21TdWZmaXhlc1xuICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIEVuaGFuY2VkSW5kZXhNYW5hZ2VyLlZFUkJfU1VGRklYX1BBVFRFUk4gPSB0aGlzLmNvbXBpbGVBbmRWYWxpZGF0ZVJlZ2V4KFxuICAgICAgICAgICAgICBgKCR7YWxsU3VmZml4ZXMuam9pbignfCcpfSkkYCxcbiAgICAgICAgICAgICAgJ3ZlcmIgc3VmZml4J1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBBZGQgZXhjbHVkZWQgbm91bnNcbiAgICAgICAgICBpZiAocGF0dGVybnMuZXhjbHVkZWROb3VucyAmJiBwYXR0ZXJucy5leGNsdWRlZE5vdW5zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGNvbnN0IGFsbE5vdW5zID0gW1xuICAgICAgICAgICAgICAuLi5FbmhhbmNlZEluZGV4TWFuYWdlci5WRVJCX0VYVFJBQ1RJT05fQ09ORklHLm5vdW5TdWZmaXhlcyxcbiAgICAgICAgICAgICAgLi4ucGF0dGVybnMuZXhjbHVkZWROb3Vuc1xuICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIEVuaGFuY2VkSW5kZXhNYW5hZ2VyLk5PVU5fU1VGRklYX1BBVFRFUk4gPSB0aGlzLmNvbXBpbGVBbmRWYWxpZGF0ZVJlZ2V4KFxuICAgICAgICAgICAgICBgKCR7YWxsTm91bnMuam9pbignfCcpfSkkYCxcbiAgICAgICAgICAgICAgJ25vdW4gc3VmZml4J1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBWYWxpZGF0ZSBhbGwgcmVnZXggcGF0dGVybnMgYXQgc3RhcnR1cFxuICAgICAgICB0aGlzLnZhbGlkYXRlUmVnZXhQYXR0ZXJucygpO1xuXG4gICAgICAgIGxvZ2dlci5pbmZvKCdMb2FkZWQgZW5oYW5jZWQgaW5kZXggY29uZmlndXJhdGlvbicsIHtcbiAgICAgICAgICBsaW1pdHM6IEVuaGFuY2VkSW5kZXhNYW5hZ2VyLlZFUkJfRVhUUkFDVElPTl9DT05GSUcubGltaXRzLFxuICAgICAgICAgIHRlbGVtZXRyeUVuYWJsZWQ6IEVuaGFuY2VkSW5kZXhNYW5hZ2VyLlZFUkJfRVhUUkFDVElPTl9DT05GSUcudGVsZW1ldHJ5LmVuYWJsZWRcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci53YXJuKCdGYWlsZWQgdG8gbG9hZCBlbmhhbmNlZCBpbmRleCBjb25maWd1cmF0aW9uLCB1c2luZyBkZWZhdWx0cycsIHtcbiAgICAgICAgZXJyb3I6IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENvbXBpbGUgYW5kIHZhbGlkYXRlIGEgcmVnZXggcGF0dGVyblxuICAgKiBQcm92aWRlcyBjbGVhciBlcnJvciBtZXNzYWdlcyBpZiBwYXR0ZXJuIGlzIGludmFsaWRcbiAgICovXG4gIHByaXZhdGUgY29tcGlsZUFuZFZhbGlkYXRlUmVnZXgocGF0dGVybjogc3RyaW5nLCBuYW1lOiBzdHJpbmcpOiBSZWdFeHAge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZWdleCA9IG5ldyBSZWdFeHAocGF0dGVybik7XG5cbiAgICAgIC8vIFRlc3QgdGhlIHJlZ2V4IHdpdGggc2FtcGxlIGRhdGEgdG8gZW5zdXJlIGl0IHdvcmtzXG4gICAgICBjb25zdCB0ZXN0U3RyaW5ncyA9IFsndGVzdCcsICdkZWJ1ZycsICdjcmVhdGUnLCAnaWZ5JywgJ3Rpb24nXTtcbiAgICAgIGZvciAoY29uc3Qgc3RyIG9mIHRlc3RTdHJpbmdzKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgLy8gRXhlY3V0ZSB0ZXN0IHRvIHZhbGlkYXRlIHJlZ2V4IHBhdHRlcm4gKHJlc3VsdCBub3QgbmVlZGVkLCBqdXN0IGNoZWNraW5nIGZvciBlcnJvcnMpXG4gICAgICAgICAgdm9pZCByZWdleC50ZXN0KHN0cik7XG4gICAgICAgICAgLy8gUmVzZXQgbGFzdEluZGV4IGZvciBnbG9iYWwgcmVnZXhlcyB0byBlbnN1cmUgY29uc2lzdGVudCBiZWhhdmlvclxuICAgICAgICAgIGlmIChyZWdleC5nbG9iYWwpIHtcbiAgICAgICAgICAgIHJlZ2V4Lmxhc3RJbmRleCA9IDA7XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoICh0ZXN0RXJyb3IpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFJlZ2V4IHBhdHRlcm4gZmFpbHMgb24gdGVzdCBzdHJpbmcgJyR7c3RyfSc6ICR7dGVzdEVycm9yfWApO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZWdleDtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc3QgZXJyb3JNc2cgPSBgSW52YWxpZCAke25hbWV9IHBhdHRlcm46ICR7cGF0dGVybn1gO1xuICAgICAgbG9nZ2VyLmVycm9yKGVycm9yTXNnLCB7XG4gICAgICAgIGVycm9yOiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvciksXG4gICAgICAgIHBhdHRlcm5cbiAgICAgIH0pO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGVycm9yTXNnKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGUgYWxsIHJlZ2V4IHBhdHRlcm5zIGF0IHN0YXJ0dXBcbiAgICogRW5zdXJlcyBwYXR0ZXJucyBhcmUgdmFsaWQgYW5kIGNhbiBoYW5kbGUgZXhwZWN0ZWQgaW5wdXRcbiAgICovXG4gIHByaXZhdGUgdmFsaWRhdGVSZWdleFBhdHRlcm5zKCk6IHZvaWQge1xuICAgIGNvbnN0IHZhbGlkYXRpb25UZXN0cyA9IFtcbiAgICAgIHtcbiAgICAgICAgcGF0dGVybjogRW5oYW5jZWRJbmRleE1hbmFnZXIuVkVSQl9QUkVGSVhfUEFUVEVSTixcbiAgICAgICAgbmFtZTogJ1ZFUkJfUFJFRklYX1BBVFRFUk4nLFxuICAgICAgICBzaG91bGRNYXRjaDogWydkZWJ1ZycsICdjcmVhdGUnLCAnYW5hbHl6ZSddLFxuICAgICAgICBzaG91bGROb3RNYXRjaDogWyd4ZGVidWcnLCAnY3JlYXRlZCcsICcxMjNkZWJ1ZyddXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBwYXR0ZXJuOiBFbmhhbmNlZEluZGV4TWFuYWdlci5WRVJCX1NVRkZJWF9QQVRURVJOLFxuICAgICAgICBuYW1lOiAnVkVSQl9TVUZGSVhfUEFUVEVSTicsXG4gICAgICAgIHNob3VsZE1hdGNoOiBbJ3NpbXBsaWZ5JywgJ29yZ2FuaXplJywgJ2F1dG9tYXRlJ10sXG4gICAgICAgIHNob3VsZE5vdE1hdGNoOiBbJ3NpbXBsZScsICdvcmdhbicsICdhdXRvJ11cbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIHBhdHRlcm46IEVuaGFuY2VkSW5kZXhNYW5hZ2VyLk5PVU5fU1VGRklYX1BBVFRFUk4sXG4gICAgICAgIG5hbWU6ICdOT1VOX1NVRkZJWF9QQVRURVJOJyxcbiAgICAgICAgc2hvdWxkTWF0Y2g6IFsnZG9jdW1lbnRhdGlvbicsICdtYW5hZ2VtZW50JywgJ2hhcHBpbmVzcyddLFxuICAgICAgICBzaG91bGROb3RNYXRjaDogWydkb2N1bWVudCcsICdtYW5hZ2UnLCAnaGFwcHknXVxuICAgICAgfVxuICAgIF07XG5cbiAgICBmb3IgKGNvbnN0IHRlc3Qgb2YgdmFsaWRhdGlvblRlc3RzKSB7XG4gICAgICAvLyBWYWxpZGF0ZSBwYXR0ZXJuIGV4aXN0c1xuICAgICAgaWYgKCF0ZXN0LnBhdHRlcm4pIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3Rlc3QubmFtZX0gcGF0dGVybiBpcyBub3QgaW5pdGlhbGl6ZWRgKTtcbiAgICAgIH1cblxuICAgICAgLy8gVGVzdCBleHBlY3RlZCBtYXRjaGVzXG4gICAgICBmb3IgKGNvbnN0IHN0ciBvZiB0ZXN0LnNob3VsZE1hdGNoKSB7XG4gICAgICAgIGlmICghdGVzdC5wYXR0ZXJuLnRlc3Qoc3RyKSkge1xuICAgICAgICAgIGxvZ2dlci53YXJuKGBQYXR0ZXJuIHZhbGlkYXRpb24gd2FybmluZzogJHt0ZXN0Lm5hbWV9IHNob3VsZCBtYXRjaCAnJHtzdHJ9JyBidXQgZG9lc24ndGApO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFRlc3QgZXhwZWN0ZWQgbm9uLW1hdGNoZXNcbiAgICAgIGZvciAoY29uc3Qgc3RyIG9mIHRlc3Quc2hvdWxkTm90TWF0Y2gpIHtcbiAgICAgICAgaWYgKHRlc3QucGF0dGVybi50ZXN0KHN0cikpIHtcbiAgICAgICAgICBsb2dnZXIud2FybihgUGF0dGVybiB2YWxpZGF0aW9uIHdhcm5pbmc6ICR7dGVzdC5uYW1lfSBzaG91bGQgbm90IG1hdGNoICcke3N0cn0nIGJ1dCBkb2VzYCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBsb2dnZXIuZGVidWcoJ1JlZ2V4IHBhdHRlcm4gdmFsaWRhdGlvbiBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5Jyk7XG4gIH1cblxuICAvKipcbiAgICogVGVsZW1ldHJ5IHRyYWNraW5nIGluZnJhc3RydWN0dXJlXG4gICAqL1xuICBwcml2YXRlIHRlbGVtZXRyeU1ldHJpY3M6IE1hcDxzdHJpbmcsIGFueT4gPSBuZXcgTWFwKCk7XG4gIHByaXZhdGUgdGVsZW1ldHJ5VGltZXI6IE5vZGVKUy5UaW1lb3V0IHwgbnVsbCA9IG51bGw7XG5cbiAgLyoqXG4gICAqIFN0YXJ0IHRlbGVtZXRyeSB0cmFja2luZyBmb3IgYW4gb3BlcmF0aW9uXG4gICAqL1xuICBwcml2YXRlIHN0YXJ0VGVsZW1ldHJ5KF9vcGVyYXRpb25OYW1lOiBzdHJpbmcpOiBudW1iZXIgfCBudWxsIHtcbiAgICBpZiAoIXRoaXMuaXNUZWxlbWV0cnlFbmFibGVkKCkpIHJldHVybiBudWxsO1xuXG4gICAgLy8gU2FtcGxlIGJhc2VkIG9uIGNvbmZpZ3VyZWQgcmF0ZVxuICAgIGlmIChNYXRoLnJhbmRvbSgpID4gRW5oYW5jZWRJbmRleE1hbmFnZXIuVkVSQl9FWFRSQUNUSU9OX0NPTkZJRy50ZWxlbWV0cnkuc2FtcGxlUmF0ZSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIERhdGUubm93KCk7XG4gIH1cblxuICAvKipcbiAgICogUmVjb3JkIHRlbGVtZXRyeSBtZXRyaWNzIGZvciBhbiBvcGVyYXRpb25cbiAgICovXG4gIHByaXZhdGUgcmVjb3JkVGVsZW1ldHJ5KFxuICAgIG9wZXJhdGlvbk5hbWU6IHN0cmluZyxcbiAgICBzdGFydFRpbWU6IG51bWJlciB8IG51bGwsXG4gICAgbWV0cmljczogUmVjb3JkPHN0cmluZywgYW55PlxuICApOiB2b2lkIHtcbiAgICBpZiAoIXN0YXJ0VGltZSB8fCAhdGhpcy5pc1RlbGVtZXRyeUVuYWJsZWQoKSkgcmV0dXJuO1xuXG4gICAgY29uc3QgZHVyYXRpb24gPSBEYXRlLm5vdygpIC0gc3RhcnRUaW1lO1xuXG4gICAgLy8gQWdncmVnYXRlIG1ldHJpY3NcbiAgICBpZiAoIXRoaXMudGVsZW1ldHJ5TWV0cmljcy5oYXMob3BlcmF0aW9uTmFtZSkpIHtcbiAgICAgIHRoaXMudGVsZW1ldHJ5TWV0cmljcy5zZXQob3BlcmF0aW9uTmFtZSwge1xuICAgICAgICBjb3VudDogMCxcbiAgICAgICAgdG90YWxEdXJhdGlvbjogMCxcbiAgICAgICAgYXZnRHVyYXRpb246IDAsXG4gICAgICAgIG1heER1cmF0aW9uOiAwLFxuICAgICAgICBtaW5EdXJhdGlvbjogSW5maW5pdHksXG4gICAgICAgIGxhc3RNZXRyaWNzOiB7fSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGNvbnN0IHN0YXRzID0gdGhpcy50ZWxlbWV0cnlNZXRyaWNzLmdldChvcGVyYXRpb25OYW1lKTtcbiAgICBzdGF0cy5jb3VudCsrO1xuICAgIHN0YXRzLnRvdGFsRHVyYXRpb24gKz0gZHVyYXRpb247XG4gICAgc3RhdHMuYXZnRHVyYXRpb24gPSBzdGF0cy50b3RhbER1cmF0aW9uIC8gc3RhdHMuY291bnQ7XG4gICAgc3RhdHMubWF4RHVyYXRpb24gPSBNYXRoLm1heChzdGF0cy5tYXhEdXJhdGlvbiwgZHVyYXRpb24pO1xuICAgIHN0YXRzLm1pbkR1cmF0aW9uID0gTWF0aC5taW4oc3RhdHMubWluRHVyYXRpb24sIGR1cmF0aW9uKTtcbiAgICBzdGF0cy5sYXN0TWV0cmljcyA9IHsgLi4ubWV0cmljcywgZHVyYXRpb24gfTtcblxuICAgIC8vIFBlci1lbGVtZW50IHRlbGVtZXRyeSBhZ2dyZWdhdGVkIGluIHBlcmlvZGljIFRlbGVtZXRyeSBSZXBvcnQ7XG4gICAgLy8gb25seSBsb2cgc2xvdyBvcGVyYXRpb25zICg+NTBtcykgaW5kaXZpZHVhbGx5XG4gICAgaWYgKGR1cmF0aW9uID4gNTApIHtcbiAgICAgIGxvZ2dlci5kZWJ1ZyhgU2xvdyB0ZWxlbWV0cnk6ICR7b3BlcmF0aW9uTmFtZX1gLCB7XG4gICAgICAgIGR1cmF0aW9uLFxuICAgICAgICAuLi5tZXRyaWNzLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gU2NoZWR1bGUgcGVyaW9kaWMgcmVwb3J0aW5nXG4gICAgdGhpcy5zY2hlZHVsZVRlbGVtZXRyeVJlcG9ydCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIHRlbGVtZXRyeSBpcyBlbmFibGVkXG4gICAqL1xuICBwcml2YXRlIGlzVGVsZW1ldHJ5RW5hYmxlZCgpOiBib29sZWFuIHtcbiAgICAvLyBDaGVjayBlbnZpcm9ubWVudCB2YXJpYWJsZSBvciBjb25maWdcbiAgICByZXR1cm4gcHJvY2Vzcy5lbnYuRE9MTEhPVVNFX1RFTEVNRVRSWV9FTkFCTEVEID09PSAndHJ1ZScgfHxcbiAgICAgICAgICAgRW5oYW5jZWRJbmRleE1hbmFnZXIuVkVSQl9FWFRSQUNUSU9OX0NPTkZJRy50ZWxlbWV0cnkuZW5hYmxlZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTY2hlZHVsZSBwZXJpb2RpYyB0ZWxlbWV0cnkgcmVwb3J0aW5nXG4gICAqL1xuICBwcml2YXRlIHNjaGVkdWxlVGVsZW1ldHJ5UmVwb3J0KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnRlbGVtZXRyeVRpbWVyKSByZXR1cm47XG5cbiAgICB0aGlzLnRlbGVtZXRyeVRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLnJlcG9ydFRlbGVtZXRyeSgpO1xuICAgICAgdGhpcy50ZWxlbWV0cnlUaW1lciA9IG51bGw7XG4gICAgfSwgRW5oYW5jZWRJbmRleE1hbmFnZXIuVkVSQl9FWFRSQUNUSU9OX0NPTkZJRy50ZWxlbWV0cnkubWV0cmljc0ludGVydmFsKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXBvcnQgYWdncmVnYXRlZCB0ZWxlbWV0cnkgbWV0cmljc1xuICAgKi9cbiAgcHJpdmF0ZSByZXBvcnRUZWxlbWV0cnkoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMudGVsZW1ldHJ5TWV0cmljcy5zaXplID09PSAwKSByZXR1cm47XG5cbiAgICBjb25zdCByZXBvcnQgPSB7XG4gICAgICB0aW1lc3RhbXA6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgIG1ldHJpY3M6IE9iamVjdC5mcm9tRW50cmllcyh0aGlzLnRlbGVtZXRyeU1ldHJpY3MpLFxuICAgIH07XG5cbiAgICAvLyBMb2cgc3VtbWFyeSByZXBvcnRcbiAgICBsb2dnZXIuaW5mbygnVGVsZW1ldHJ5IFJlcG9ydCcsIHJlcG9ydCk7XG5cbiAgICAvLyBGdXR1cmU6IFNlbmQgdG8gdGVsZW1ldHJ5IGVuZHBvaW50IGlmIGNvbmZpZ3VyZWRcbiAgICAvLyBpZiAocHJvY2Vzcy5lbnYuRE9MTEhPVVNFX1RFTEVNRVRSWV9FTkRQT0lOVCkge1xuICAgIC8vICAgdGhpcy5zZW5kVGVsZW1ldHJ5VG9FbmRwb2ludChyZXBvcnQpO1xuICAgIC8vIH1cblxuICAgIC8vIENsZWFyIG1ldHJpY3MgYWZ0ZXIgcmVwb3J0aW5nXG4gICAgdGhpcy50ZWxlbWV0cnlNZXRyaWNzLmNsZWFyKCk7XG4gIH1cblxuICAvKipcbiAgICogV3JpdGUgaW5kZXggZGF0YSB0byBZQU1MIGZpbGUgb24gZGlza1xuICAgKiBQcml2YXRlIGltcGxlbWVudGF0aW9uIGRldGFpbFxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyB3cml0ZVRvRmlsZShpbmRleDogRW5oYW5jZWRJbmRleCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRyeSB7XG4gICAgICAvLyBFbnN1cmUgZGlyZWN0b3J5IGV4aXN0c1xuICAgICAgY29uc3QgZGlyID0gcGF0aC5kaXJuYW1lKHRoaXMuaW5kZXhQYXRoKTtcbiAgICAgIGF3YWl0IHRoaXMuZmlsZU9wZXJhdGlvbnMuY3JlYXRlRGlyZWN0b3J5KGRpcik7XG5cbiAgICAgIC8vIENvbnZlcnQgdG8gWUFNTCB3aXRoIG5pY2UgZm9ybWF0dGluZ1xuICAgICAgY29uc3QgeWFtbENvbnRlbnQgPSB5YW1sRHVtcChpbmRleCwge1xuICAgICAgICBpbmRlbnQ6IDIsXG4gICAgICAgIGxpbmVXaWR0aDogMTIwLFxuICAgICAgICBub1JlZnM6IHRydWUsXG4gICAgICAgIHNvcnRLZXlzOiBmYWxzZSAgLy8gUHJlc2VydmUgb3VyIGxvZ2ljYWwgb3JkZXJpbmdcbiAgICAgIH0pO1xuXG4gICAgICAvLyBWYWxpZGF0ZSBVbmljb2RlIGJlZm9yZSBzYXZpbmdcbiAgICAgIGNvbnN0IHZhbGlkYXRpb24gPSBVbmljb2RlVmFsaWRhdG9yLm5vcm1hbGl6ZSh5YW1sQ29udGVudCk7XG4gICAgICBpZiAodmFsaWRhdGlvbi5kZXRlY3RlZElzc3VlcyAmJiB2YWxpZGF0aW9uLmRldGVjdGVkSXNzdWVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmljb2RlIGlzc3VlcyBpbiBpbmRleDogJHt2YWxpZGF0aW9uLmRldGVjdGVkSXNzdWVzLmpvaW4oJywgJyl9YCk7XG4gICAgICB9XG5cbiAgICAgIGF3YWl0IHRoaXMuZmlsZU9wZXJhdGlvbnMud3JpdGVGaWxlKHRoaXMuaW5kZXhQYXRoLCB5YW1sQ29udGVudCwge1xuICAgICAgICBzb3VyY2U6ICdFbmhhbmNlZEluZGV4TWFuYWdlci53cml0ZVRvRmlsZSdcbiAgICAgIH0pO1xuXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci5lcnJvcignRmFpbGVkIHRvIHNhdmUgaW5kZXgnLCBlcnJvcik7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgaW5kZXggbmVlZHMgcmVidWlsZGluZ1xuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBuZWVkc1JlYnVpbGQoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIENoZWNrIGlmIGluZGV4IGZpbGUgZXhpc3RzXG4gICAgICBjb25zdCBpbmRleFN0YXRzID0gYXdhaXQgdGhpcy5maWxlT3BlcmF0aW9ucy5zdGF0KHRoaXMuaW5kZXhQYXRoKS5jYXRjaCgoKSA9PiBudWxsKTtcbiAgICAgIGlmICghaW5kZXhTdGF0cykge1xuICAgICAgICBsb2dnZXIuaW5mbygnRW5oYW5jZWQgaW5kZXggZmlsZSBkb2VzIG5vdCBleGlzdCwgcmVidWlsZCBuZWVkZWQnKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG5cbiAgICAgIC8vIENoZWNrIGZpbGUgYWdlIEZJUlNUIC0gdGhpcyBpcyB0aGUga2V5IGZpeFxuICAgICAgY29uc3QgZmlsZUFnZSA9IERhdGUubm93KCkgLSBpbmRleFN0YXRzLm10aW1lLmdldFRpbWUoKTtcbiAgICAgIGNvbnN0IHR0bE1zID0gdGhpcy5UVExfTVM7XG5cbiAgICAgIGlmIChmaWxlQWdlID4gdHRsTXMpIHtcbiAgICAgICAgbG9nZ2VyLmluZm8oJ0VuaGFuY2VkIGluZGV4IGZpbGUgaXMgc3RhbGUnLCB7XG4gICAgICAgICAgYWdlTWludXRlczogTWF0aC5yb3VuZChmaWxlQWdlIC8gNjAwMDApLFxuICAgICAgICAgIHR0bE1pbnV0ZXM6IE1hdGgucm91bmQodHRsTXMgLyA2MDAwMClcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0cnVlOyAgLy8gRmlsZSBpcyB0b28gb2xkLCByZWJ1aWxkIG5lZWRlZFxuICAgICAgfVxuXG4gICAgICAvLyBJZiB3ZSByZWFjaCBoZXJlLCBmaWxlIGV4aXN0cyBhbmQgaXMgZnJlc2hcbiAgICAgIC8vIElmIG5vdCBpbiBtZW1vcnksIHdlIGNhbiBsb2FkIGl0XG4gICAgICBpZiAoIXRoaXMuaW5kZXgpIHtcbiAgICAgICAgbG9nZ2VyLmRlYnVnKCdFbmhhbmNlZCBpbmRleCBub3QgaW4gbWVtb3J5IGJ1dCBmaWxlIGlzIGZyZXNoLCB3aWxsIGxvYWQgZnJvbSBmaWxlJyk7XG4gICAgICAgIHJldHVybiBmYWxzZTsgLy8gV2UgY2FuIGxvYWQgdGhlIGZyZXNoIGZpbGUsIG5vIHJlYnVpbGQgbmVlZGVkXG4gICAgICB9XG5cbiAgICAgIC8vIEZpbGUgaXMgZnJlc2ggYW5kIHdlIGhhdmUgaXQgaW4gbWVtb3J5IOKAlCBubyByZWJ1aWxkIG5lZWRlZFxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoJ0Vycm9yIGNoZWNraW5nIGlmIHJlYnVpbGQgbmVlZGVkJywgZXJyb3IpO1xuICAgICAgcmV0dXJuIHRydWU7IC8vIFNhZmVyIHRvIHJlYnVpbGQgb24gZXJyb3JcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlIHNwZWNpZmljIGVsZW1lbnRzIGluIHRoZSBpbmRleFxuICAgKi9cbiAgcHVibGljIGFzeW5jIHVwZGF0ZUVsZW1lbnRzKGVsZW1lbnROYW1lczogc3RyaW5nW10sIG9wdGlvbnM6IEluZGV4T3B0aW9ucyA9IHt9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5nZXRJbmRleCh7XG4gICAgICAuLi5vcHRpb25zLFxuICAgICAgdXBkYXRlT25seTogZWxlbWVudE5hbWVzLFxuICAgICAgcHJlc2VydmVDdXN0b206IHRydWVcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgb3IgdXBkYXRlIGEgcmVsYXRpb25zaGlwIGJldHdlZW4gZWxlbWVudHNcbiAgICovXG4gIHB1YmxpYyBhc3luYyBhZGRSZWxhdGlvbnNoaXAoXG4gICAgZnJvbUVsZW1lbnQ6IHN0cmluZyxcbiAgICB0b0VsZW1lbnQ6IHN0cmluZyxcbiAgICByZWxhdGlvbnNoaXA6IFJlbGF0aW9uc2hpcFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBpbmRleCA9IGF3YWl0IHRoaXMuZ2V0SW5kZXgoKTtcblxuICAgIC8vIEZpbmQgdGhlIGVsZW1lbnRcbiAgICBsZXQgZm91bmQgPSBmYWxzZTtcbiAgICBmb3IgKGNvbnN0IFssIGVsZW1lbnRzXSBvZiBPYmplY3QuZW50cmllcyhpbmRleC5lbGVtZW50cykpIHtcbiAgICAgIGlmIChlbGVtZW50c1tmcm9tRWxlbWVudF0pIHtcbiAgICAgICAgaWYgKCFlbGVtZW50c1tmcm9tRWxlbWVudF0ucmVsYXRpb25zaGlwcykge1xuICAgICAgICAgIGVsZW1lbnRzW2Zyb21FbGVtZW50XS5yZWxhdGlvbnNoaXBzID0ge307XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZWxUeXBlID0gcmVsYXRpb25zaGlwLnR5cGUgfHwgJ3JlbGF0ZWRfdG8nO1xuICAgICAgICBpZiAoIWVsZW1lbnRzW2Zyb21FbGVtZW50XS5yZWxhdGlvbnNoaXBzW3JlbFR5cGVdKSB7XG4gICAgICAgICAgZWxlbWVudHNbZnJvbUVsZW1lbnRdLnJlbGF0aW9uc2hpcHNbcmVsVHlwZV0gPSBbXTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEFkZCBvciB1cGRhdGUgcmVsYXRpb25zaGlwXG4gICAgICAgIGNvbnN0IGV4aXN0aW5nID0gZWxlbWVudHNbZnJvbUVsZW1lbnRdLnJlbGF0aW9uc2hpcHNbcmVsVHlwZV1cbiAgICAgICAgICAuZmluZEluZGV4KHIgPT4gci5lbGVtZW50ID09PSB0b0VsZW1lbnQpO1xuXG4gICAgICAgIGlmIChleGlzdGluZyA+PSAwKSB7XG4gICAgICAgICAgZWxlbWVudHNbZnJvbUVsZW1lbnRdLnJlbGF0aW9uc2hpcHNbcmVsVHlwZV1bZXhpc3RpbmddID0gcmVsYXRpb25zaGlwO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGVsZW1lbnRzW2Zyb21FbGVtZW50XS5yZWxhdGlvbnNoaXBzW3JlbFR5cGVdLnB1c2gocmVsYXRpb25zaGlwKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvdW5kID0gdHJ1ZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGZvdW5kKSB7XG4gICAgICBpbmRleC5tZXRhZGF0YS5sYXN0X3VwZGF0ZWQgPSBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCk7XG4gICAgICBhd2FpdCB0aGlzLndyaXRlVG9GaWxlKGluZGV4KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQWRkIGN1c3RvbSBleHRlbnNpb24gZGF0YVxuICAgKi9cbiAgcHVibGljIGFzeW5jIGFkZEV4dGVuc2lvbihrZXk6IHN0cmluZywgZGF0YTogYW55KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgaW5kZXggPSBhd2FpdCB0aGlzLmdldEluZGV4KCk7XG5cbiAgICBpZiAoIWluZGV4LmV4dGVuc2lvbnMpIHtcbiAgICAgIGluZGV4LmV4dGVuc2lvbnMgPSB7fTtcbiAgICB9XG5cbiAgICBpbmRleC5leHRlbnNpb25zW2tleV0gPSBkYXRhO1xuICAgIGluZGV4Lm1ldGFkYXRhLmxhc3RfdXBkYXRlZCA9IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKTtcblxuICAgIGF3YWl0IHRoaXMud3JpdGVUb0ZpbGUoaW5kZXgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFBlcnNpc3QgdGhlIGN1cnJlbnQgaW4tbWVtb3J5IGluZGV4IHRvIGRpc2tcbiAgICogUHVibGljIG1ldGhvZCBmb3IgdGVzdHMgYW5kIGV4dGVybmFsIGNhbGxlcnMgdG8gc2F2ZSBjdXJyZW50IHN0YXRlXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgcGVyc2lzdCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIXRoaXMuaW5kZXgpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTm8gaW5kZXggbG9hZGVkIHRvIHBlcnNpc3QnKTtcbiAgICB9XG4gICAgYXdhaXQgdGhpcy53cml0ZVRvRmlsZSh0aGlzLmluZGV4KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgZWxlbWVudHMgYnkgYWN0aW9uIHZlcmJcbiAgICogVHJhY2tzIHVzYWdlIG1ldHJpY3MgZm9yIHRyaWdnZXIgb3B0aW1pemF0aW9uXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZ2V0RWxlbWVudHNCeUFjdGlvbih2ZXJiOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gICAgY29uc3QgaW5kZXggPSBhd2FpdCB0aGlzLmdldEluZGV4KCk7XG5cbiAgICAvLyBUcmFjayB0cmlnZ2VyIHVzYWdlIG1ldHJpY3NcbiAgICBhd2FpdCB0aGlzLnRyYWNrVHJpZ2dlclVzYWdlKHZlcmIpO1xuXG4gICAgcmV0dXJuIGluZGV4LmFjdGlvbl90cmlnZ2Vyc1t2ZXJiXSB8fCBbXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUcmFjayB0cmlnZ2VyIHVzYWdlIGZvciBvcHRpbWl6YXRpb24gbWV0cmljc1xuICAgKiBTdXBwb3J0cyBiYXRjaGluZyBmb3IgaGlnaC12b2x1bWUgc2NlbmFyaW9zIHRvIHJlZHVjZSBkaXNrIHdyaXRlc1xuICAgKlxuICAgKiBAcGFyYW0gdHJpZ2dlciAtIFRoZSB0cmlnZ2VyIHZlcmIgdG8gdHJhY2tcbiAgICogQHBhcmFtIGltbWVkaWF0ZSAtIEZvcmNlIGltbWVkaWF0ZSB3cml0ZSAoYnlwYXNzIGJhdGNoaW5nKVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyB0cmFja1RyaWdnZXJVc2FnZSh0cmlnZ2VyOiBzdHJpbmcsIGltbWVkaWF0ZTogYm9vbGVhbiA9IGZhbHNlKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMubWV0cmljc1RyYWNrZXIudHJhY2sodHJpZ2dlciwgaW1tZWRpYXRlKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbG9nZ2VyLndhcm4oJ0ZhaWxlZCB0byB0cmFjayB0cmlnZ2VyIHVzYWdlJywgeyB0cmlnZ2VyLCBlcnJvciB9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRmx1c2ggYmF0Y2hlZCBtZXRyaWNzIHRvIGRpc2tcbiAgICogQ29tYmluZXMgbXVsdGlwbGUgbWV0cmljIHVwZGF0ZXMgaW50byBhIHNpbmdsZSBkaXNrIHdyaXRlIGZvciBlZmZpY2llbmN5XG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGZsdXNoTWV0cmljc0JhdGNoKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMubWV0cmljc1RyYWNrZXIuZmx1c2goKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgY29tcHJlaGVuc2l2ZSB0cmlnZ2VyIHVzYWdlIG1ldHJpY3MgZm9yIG9wdGltaXphdGlvbiBhbmFseXNpc1xuICAgKlxuICAgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmluZyB0byBzb3J0ZWQgYXJyYXkgb2YgdHJpZ2dlciBtZXRyaWNzXG4gICAqIEByZXR1cm5zIHtBcnJheTxPYmplY3Q+fSBtZXRyaWNzIC0gQXJyYXkgb2YgdHJpZ2dlciBtZXRyaWMgb2JqZWN0cyBzb3J0ZWQgYnkgdXNhZ2UgZnJlcXVlbmN5IChkZXNjZW5kaW5nKVxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSBtZXRyaWNzW10udHJpZ2dlciAtIFRoZSB0cmlnZ2VyIHdvcmQvdmVyYlxuICAgKiBAcmV0dXJucyB7bnVtYmVyfSBtZXRyaWNzW10udXNhZ2VfY291bnQgLSBUb3RhbCBudW1iZXIgb2YgdGltZXMgdGhpcyB0cmlnZ2VyIGhhcyBiZWVuIHVzZWRcbiAgICogQHJldHVybnMge3N0cmluZ30gbWV0cmljc1tdLmxhc3RfdXNlZCAtIElTTyB0aW1lc3RhbXAgb2YgbW9zdCByZWNlbnQgdXNhZ2VcbiAgICogQHJldHVybnMge3N0cmluZ30gbWV0cmljc1tdLmZpcnN0X3VzZWQgLSBJU08gdGltZXN0YW1wIG9mIGZpcnN0IHJlY29yZGVkIHVzYWdlXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9IG1ldHJpY3NbXS5kYWlseV9hdmVyYWdlIC0gQXZlcmFnZSBkYWlseSB1c2FnZSBiYXNlZCBvbiBoaXN0b3JpY2FsIGRhdGFcbiAgICogQHJldHVybnMgeydpbmNyZWFzaW5nJ3wnc3RhYmxlJ3wnZGVjcmVhc2luZyd9IG1ldHJpY3NbXS50cmVuZCAtIFVzYWdlIHRyZW5kIGJhc2VkIG9uIGxhc3QgNyBkYXlzXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGNvbnN0IG1ldHJpY3MgPSBhd2FpdCBpbmRleE1hbmFnZXIuZ2V0VHJpZ2dlck1ldHJpY3MoKTtcbiAgICogLy8gUmV0dXJuczogW1xuICAgKiAvLyAgIHsgdHJpZ2dlcjogJ2RlYnVnJywgdXNhZ2VfY291bnQ6IDQ1LCB0cmVuZDogJ2luY3JlYXNpbmcnLCAuLi4gfSxcbiAgICogLy8gICB7IHRyaWdnZXI6ICdhbmFseXplJywgdXNhZ2VfY291bnQ6IDMyLCB0cmVuZDogJ3N0YWJsZScsIC4uLiB9XG4gICAqIC8vIF1cbiAgICpcbiAgICogQHB1YmxpY1xuICAgKiBAc2luY2UgMS45LjlcbiAgICovXG4gIHB1YmxpYyBhc3luYyBnZXRUcmlnZ2VyTWV0cmljcygpOiBQcm9taXNlPHtcbiAgICB0cmlnZ2VyOiBzdHJpbmc7XG4gICAgdXNhZ2VfY291bnQ6IG51bWJlcjtcbiAgICBsYXN0X3VzZWQ6IHN0cmluZztcbiAgICBmaXJzdF91c2VkOiBzdHJpbmc7XG4gICAgZGFpbHlfYXZlcmFnZTogbnVtYmVyO1xuICAgIHRyZW5kOiAnaW5jcmVhc2luZycgfCAnc3RhYmxlJyB8ICdkZWNyZWFzaW5nJztcbiAgfVtdPiB7XG4gICAgY29uc3QgaW5kZXggPSBhd2FpdCB0aGlzLmdldEluZGV4KCk7XG5cbiAgICBpZiAoIWluZGV4Lm1ldGFkYXRhLnRyaWdnZXJfbWV0cmljcykge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIGNvbnN0IG1ldHJpY3MgPSBpbmRleC5tZXRhZGF0YS50cmlnZ2VyX21ldHJpY3M7XG4gICAgY29uc3QgcmVzdWx0czogYW55W10gPSBbXTtcblxuICAgIC8vIENhbGN1bGF0ZSBtZXRyaWNzIGZvciBlYWNoIHRyaWdnZXJcbiAgICBmb3IgKGNvbnN0IHRyaWdnZXIgaW4gbWV0cmljcy51c2FnZV9jb3VudCkge1xuICAgICAgLy8gQ2FsY3VsYXRlIGRhaWx5IGF2ZXJhZ2VcbiAgICAgIGxldCB0b3RhbERhaWx5VXNhZ2UgPSAwO1xuICAgICAgbGV0IGRheXNXaXRoVXNhZ2UgPSAwO1xuICAgICAgY29uc3QgcmVjZW50VXNhZ2U6IG51bWJlcltdID0gW107XG5cbiAgICAgIC8vIEdldCBsYXN0IDcgZGF5cyBvZiB1c2FnZSBmb3IgdHJlbmQgYW5hbHlzaXNcbiAgICAgIGNvbnN0IHRvZGF5ID0gbmV3IERhdGUoKTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgNzsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZSh0b2RheSk7XG4gICAgICAgIGRhdGUuc2V0RGF0ZShkYXRlLmdldERhdGUoKSAtIGkpO1xuICAgICAgICBjb25zdCBkYXRlU3RyID0gZGF0ZS50b0lTT1N0cmluZygpLnNwbGl0KCdUJylbMF07XG5cbiAgICAgICAgaWYgKG1ldHJpY3MuZGFpbHlfdXNhZ2VbZGF0ZVN0cl0gJiYgbWV0cmljcy5kYWlseV91c2FnZVtkYXRlU3RyXVt0cmlnZ2VyXSkge1xuICAgICAgICAgIHJlY2VudFVzYWdlLnB1c2gobWV0cmljcy5kYWlseV91c2FnZVtkYXRlU3RyXVt0cmlnZ2VyXSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVjZW50VXNhZ2UucHVzaCgwKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBDYWxjdWxhdGUgdHJlbmQgKHNpbXBsZSBjb21wYXJpc29uIG9mIGZpcnN0IGFuZCBsYXN0IDMgZGF5cylcbiAgICAgIGNvbnN0IGZpcnN0SGFsZiA9IHJlY2VudFVzYWdlLnNsaWNlKDQsIDcpLnJlZHVjZSgoYSwgYikgPT4gYSArIGIsIDApO1xuICAgICAgY29uc3Qgc2Vjb25kSGFsZiA9IHJlY2VudFVzYWdlLnNsaWNlKDAsIDMpLnJlZHVjZSgoYSwgYikgPT4gYSArIGIsIDApO1xuICAgICAgbGV0IHRyZW5kOiAnaW5jcmVhc2luZycgfCAnc3RhYmxlJyB8ICdkZWNyZWFzaW5nJyA9ICdzdGFibGUnO1xuXG4gICAgICBpZiAoc2Vjb25kSGFsZiA+IGZpcnN0SGFsZiAqIDEuMikgdHJlbmQgPSAnaW5jcmVhc2luZyc7XG4gICAgICBlbHNlIGlmIChzZWNvbmRIYWxmIDwgZmlyc3RIYWxmICogMC44KSB0cmVuZCA9ICdkZWNyZWFzaW5nJztcblxuICAgICAgLy8gQ2FsY3VsYXRlIG92ZXJhbGwgZGFpbHkgYXZlcmFnZVxuICAgICAgZm9yIChjb25zdCBkYXRlIGluIG1ldHJpY3MuZGFpbHlfdXNhZ2UpIHtcbiAgICAgICAgaWYgKG1ldHJpY3MuZGFpbHlfdXNhZ2VbZGF0ZV1bdHJpZ2dlcl0pIHtcbiAgICAgICAgICB0b3RhbERhaWx5VXNhZ2UgKz0gbWV0cmljcy5kYWlseV91c2FnZVtkYXRlXVt0cmlnZ2VyXTtcbiAgICAgICAgICBkYXlzV2l0aFVzYWdlKys7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmVzdWx0cy5wdXNoKHtcbiAgICAgICAgdHJpZ2dlcixcbiAgICAgICAgdXNhZ2VfY291bnQ6IG1ldHJpY3MudXNhZ2VfY291bnRbdHJpZ2dlcl0sXG4gICAgICAgIGxhc3RfdXNlZDogbWV0cmljcy5sYXN0X3VzZWRbdHJpZ2dlcl0sXG4gICAgICAgIGZpcnN0X3VzZWQ6IG1ldHJpY3MuZmlyc3RfdXNlZFt0cmlnZ2VyXSxcbiAgICAgICAgZGFpbHlfYXZlcmFnZTogZGF5c1dpdGhVc2FnZSA+IDAgPyB0b3RhbERhaWx5VXNhZ2UgLyBkYXlzV2l0aFVzYWdlIDogMCxcbiAgICAgICAgdHJlbmRcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIFNvcnQgYnkgdXNhZ2UgY291bnQgKGRlc2NlbmRpbmcpXG4gICAgcmV0dXJuIHJlc3VsdHMuc29ydCgoYSwgYikgPT4gYi51c2FnZV9jb3VudCAtIGEudXNhZ2VfY291bnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4cG9ydCB0cmlnZ2VyIG1ldHJpY3MgZm9yIGV4dGVybmFsIGFuYWx5dGljcyBzeXN0ZW1zXG4gICAqIFByb3ZpZGVzIGRhdGEgaW4gYSBmb3JtYXQgc3VpdGFibGUgZm9yIGFuYWx5dGljcyBwbGF0Zm9ybXNcbiAgICpcbiAgICogQHBhcmFtIGZvcm1hdCAtIEV4cG9ydCBmb3JtYXQgKCdqc29uJyB8ICdjc3YnIHwgJ3Byb21ldGhldXMnKVxuICAgKiBAcmV0dXJucyBGb3JtYXR0ZWQgbWV0cmljcyBkYXRhXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIC8vIEV4cG9ydCBmb3IgUHJvbWV0aGV1cyBtb25pdG9yaW5nXG4gICAqIGNvbnN0IHByb21ldGhldXNNZXRyaWNzID0gYXdhaXQgaW5kZXhNYW5hZ2VyLmV4cG9ydE1ldHJpY3MoJ3Byb21ldGhldXMnKTtcbiAgICpcbiAgICogLy8gRXhwb3J0IGFzIENTViBmb3IgZGF0YSBhbmFseXNpc1xuICAgKiBjb25zdCBjc3ZEYXRhID0gYXdhaXQgaW5kZXhNYW5hZ2VyLmV4cG9ydE1ldHJpY3MoJ2NzdicpO1xuICAgKi9cbiAgcHVibGljIGFzeW5jIGV4cG9ydE1ldHJpY3MoZm9ybWF0OiAnanNvbicgfCAnY3N2JyB8ICdwcm9tZXRoZXVzJyA9ICdqc29uJyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgbWV0cmljcyA9IGF3YWl0IHRoaXMuZ2V0VHJpZ2dlck1ldHJpY3MoKTtcblxuICAgIHN3aXRjaCAoZm9ybWF0KSB7XG4gICAgICBjYXNlICdjc3YnOiB7XG4gICAgICAgIC8vIENTViBoZWFkZXJcbiAgICAgICAgbGV0IGNzdiA9ICd0cmlnZ2VyLHVzYWdlX2NvdW50LGxhc3RfdXNlZCxmaXJzdF91c2VkLGRhaWx5X2F2ZXJhZ2UsdHJlbmRcXG4nO1xuXG4gICAgICAgIC8vIENTViByb3dzXG4gICAgICAgIGZvciAoY29uc3QgbWV0cmljIG9mIG1ldHJpY3MpIHtcbiAgICAgICAgICBjc3YgKz0gYFwiJHttZXRyaWMudHJpZ2dlcn1cIiwke21ldHJpYy51c2FnZV9jb3VudH0sXCIke21ldHJpYy5sYXN0X3VzZWR9XCIsXCIke21ldHJpYy5maXJzdF91c2VkfVwiLCR7bWV0cmljLmRhaWx5X2F2ZXJhZ2UudG9GaXhlZCgyKX0sXCIke21ldHJpYy50cmVuZH1cIlxcbmA7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gY3N2O1xuICAgICAgfVxuXG4gICAgICBjYXNlICdwcm9tZXRoZXVzJzoge1xuICAgICAgICBsZXQgb3V0cHV0ID0gJyc7XG4gICAgICAgIGNvbnN0IHRpbWVzdGFtcCA9IERhdGUubm93KCk7XG5cbiAgICAgICAgLy8gUHJvbWV0aGV1cyBtZXRyaWNzIGZvcm1hdFxuICAgICAgICBvdXRwdXQgKz0gJyMgSEVMUCBlbmhhbmNlZF9pbmRleF90cmlnZ2VyX3VzYWdlIFRvdGFsIHVzYWdlIGNvdW50IGZvciBlYWNoIHRyaWdnZXJcXG4nO1xuICAgICAgICBvdXRwdXQgKz0gJyMgVFlQRSBlbmhhbmNlZF9pbmRleF90cmlnZ2VyX3VzYWdlIGNvdW50ZXJcXG4nO1xuXG4gICAgICAgIGZvciAoY29uc3QgbWV0cmljIG9mIG1ldHJpY3MpIHtcbiAgICAgICAgICBvdXRwdXQgKz0gYGVuaGFuY2VkX2luZGV4X3RyaWdnZXJfdXNhZ2V7dHJpZ2dlcj1cIiR7bWV0cmljLnRyaWdnZXJ9XCIsdHJlbmQ9XCIke21ldHJpYy50cmVuZH1cIn0gJHttZXRyaWMudXNhZ2VfY291bnR9ICR7dGltZXN0YW1wfVxcbmA7XG4gICAgICAgIH1cblxuICAgICAgICBvdXRwdXQgKz0gJ1xcbiMgSEVMUCBlbmhhbmNlZF9pbmRleF90cmlnZ2VyX2RhaWx5X2F2ZyBBdmVyYWdlIGRhaWx5IHVzYWdlIGZvciBlYWNoIHRyaWdnZXJcXG4nO1xuICAgICAgICBvdXRwdXQgKz0gJyMgVFlQRSBlbmhhbmNlZF9pbmRleF90cmlnZ2VyX2RhaWx5X2F2ZyBnYXVnZVxcbic7XG5cbiAgICAgICAgZm9yIChjb25zdCBtZXRyaWMgb2YgbWV0cmljcykge1xuICAgICAgICAgIG91dHB1dCArPSBgZW5oYW5jZWRfaW5kZXhfdHJpZ2dlcl9kYWlseV9hdmd7dHJpZ2dlcj1cIiR7bWV0cmljLnRyaWdnZXJ9XCJ9ICR7bWV0cmljLmRhaWx5X2F2ZXJhZ2UudG9GaXhlZCgyKX0gJHt0aW1lc3RhbXB9XFxuYDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBvdXRwdXQ7XG4gICAgICB9XG5cbiAgICAgIGNhc2UgJ2pzb24nOlxuICAgICAgZGVmYXVsdDoge1xuICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgIHRpbWVzdGFtcDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgICAgICAgIG1ldHJpY3MsXG4gICAgICAgICAgc3VtbWFyeToge1xuICAgICAgICAgICAgdG90YWxfdHJpZ2dlcnM6IG1ldHJpY3MubGVuZ3RoLFxuICAgICAgICAgICAgdG90YWxfdXNhZ2U6IG1ldHJpY3MucmVkdWNlKChzdW0sIG0pID0+IHN1bSArIG0udXNhZ2VfY291bnQsIDApLFxuICAgICAgICAgICAgdHJlbmRpbmdfdXA6IG1ldHJpY3MuZmlsdGVyKG0gPT4gbS50cmVuZCA9PT0gJ2luY3JlYXNpbmcnKS5sZW5ndGgsXG4gICAgICAgICAgICB0cmVuZGluZ19kb3duOiBtZXRyaWNzLmZpbHRlcihtID0+IG0udHJlbmQgPT09ICdkZWNyZWFzaW5nJykubGVuZ3RoXG4gICAgICAgICAgfVxuICAgICAgICB9LCBudWxsLCAyKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2VhcmNoIGZvciBlbGVtZW50cyB1c2luZyBlbmhhbmNlZCBjcml0ZXJpYVxuICAgKi9cbiAgcHVibGljIGFzeW5jIHNlYXJjaEVuaGFuY2VkKGNyaXRlcmlhOiB7XG4gICAgdmVyYnM/OiBzdHJpbmdbXTtcbiAgICBrZXl3b3Jkcz86IHN0cmluZ1tdO1xuICAgIHR5cGU/OiBzdHJpbmc7XG4gICAgaGFzUmVsYXRpb25zaGlwcz86IGJvb2xlYW47XG4gIH0pOiBQcm9taXNlPEVsZW1lbnREZWZpbml0aW9uW10+IHtcbiAgICBjb25zdCBpbmRleCA9IGF3YWl0IHRoaXMuZ2V0SW5kZXgoKTtcbiAgICBjb25zdCByZXN1bHRzOiBFbGVtZW50RGVmaW5pdGlvbltdID0gW107XG5cbiAgICBmb3IgKGNvbnN0IFt0eXBlLCBlbGVtZW50c10gb2YgT2JqZWN0LmVudHJpZXMoaW5kZXguZWxlbWVudHMpKSB7XG4gICAgICAvLyBGaWx0ZXIgYnkgdHlwZSBpZiBzcGVjaWZpZWRcbiAgICAgIGlmIChjcml0ZXJpYS50eXBlICYmIHR5cGUgIT09IGNyaXRlcmlhLnR5cGUpIGNvbnRpbnVlO1xuXG4gICAgICBmb3IgKGNvbnN0IFssIGVsZW1lbnRdIG9mIE9iamVjdC5lbnRyaWVzKGVsZW1lbnRzKSkge1xuICAgICAgICBsZXQgbWF0Y2hlcyA9IHRydWU7XG5cbiAgICAgICAgLy8gQ2hlY2sgdmVyYiBtYXRjaGVzXG4gICAgICAgIGlmIChjcml0ZXJpYS52ZXJicyAmJiBlbGVtZW50LmFjdGlvbnMpIHtcbiAgICAgICAgICBjb25zdCBlbGVtZW50VmVyYnMgPSBPYmplY3QudmFsdWVzKGVsZW1lbnQuYWN0aW9ucykubWFwKGEgPT4gYS52ZXJiKTtcbiAgICAgICAgICBtYXRjaGVzID0gY3JpdGVyaWEudmVyYnMuc29tZSh2ID0+IGVsZW1lbnRWZXJicy5pbmNsdWRlcyh2KSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDaGVjayBrZXl3b3JkIG1hdGNoZXNcbiAgICAgICAgaWYgKG1hdGNoZXMgJiYgY3JpdGVyaWEua2V5d29yZHMgJiYgZWxlbWVudC5zZWFyY2g/LmtleXdvcmRzKSB7XG4gICAgICAgICAgbWF0Y2hlcyA9IGNyaXRlcmlhLmtleXdvcmRzLnNvbWUoayA9PlxuICAgICAgICAgICAgZWxlbWVudC5zZWFyY2ghLmtleXdvcmRzIS5pbmNsdWRlcyhrKVxuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDaGVjayByZWxhdGlvbnNoaXAgcmVxdWlyZW1lbnRcbiAgICAgICAgaWYgKG1hdGNoZXMgJiYgY3JpdGVyaWEuaGFzUmVsYXRpb25zaGlwcykge1xuICAgICAgICAgIG1hdGNoZXMgPSAhIWVsZW1lbnQucmVsYXRpb25zaGlwcyAmJlxuICAgICAgICAgICAgICAgICAgIE9iamVjdC5rZXlzKGVsZW1lbnQucmVsYXRpb25zaGlwcykubGVuZ3RoID4gMDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChtYXRjaGVzKSB7XG4gICAgICAgICAgcmVzdWx0cy5wdXNoKGVsZW1lbnQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdHM7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGNhbGN1bGF0ZVNlbWFudGljUmVsYXRpb25zaGlwcyhpbmRleDogRW5oYW5jZWRJbmRleCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGNvbmZpZyA9IHRoaXMuY29uZmlnLmdldENvbmZpZygpO1xuICAgIGF3YWl0IHRoaXMuc2VtYW50aWNSZWxhdGlvbnNoaXBTZXJ2aWNlLmNhbGN1bGF0ZShpbmRleCwgY29uZmlnKTtcbiAgfVxuXG4gIFxuXG4gIFxuXG4gIC8qKlxuICAgKiBGaW5kIHNob3J0ZXN0IHBhdGggYmV0d2VlbiB0d28gZWxlbWVudHNcbiAgICovXG4gIHB1YmxpYyBhc3luYyBmaW5kRWxlbWVudFBhdGgoXG4gICAgZnJvbUVsZW1lbnQ6IHN0cmluZyxcbiAgICB0b0VsZW1lbnQ6IHN0cmluZyxcbiAgICBvcHRpb25zPzoge1xuICAgICAgcmVsYXRpb25zaGlwVHlwZXM/OiBzdHJpbmdbXTtcbiAgICAgIG1pblN0cmVuZ3RoPzogbnVtYmVyO1xuICAgICAgbWF4RGVwdGg/OiBudW1iZXI7XG4gICAgfVxuICApOiBQcm9taXNlPEVsZW1lbnRQYXRoIHwgbnVsbD4ge1xuICAgIGNvbnN0IGluZGV4ID0gYXdhaXQgdGhpcy5nZXRJbmRleCgpO1xuICAgIHJldHVybiB0aGlzLnJlbGF0aW9uc2hpcE1hbmFnZXIuZmluZFBhdGgoZnJvbUVsZW1lbnQsIHRvRWxlbWVudCwgaW5kZXgsIG9wdGlvbnMgYXMgYW55KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYWxsIGVsZW1lbnRzIGNvbm5lY3RlZCB0byBhIGdpdmVuIGVsZW1lbnRcbiAgICovXG4gIHB1YmxpYyBhc3luYyBnZXRDb25uZWN0ZWRFbGVtZW50cyhcbiAgICBlbGVtZW50OiBzdHJpbmcsXG4gICAgb3B0aW9ucz86IHtcbiAgICAgIG1heERlcHRoPzogbnVtYmVyO1xuICAgICAgcmVsYXRpb25zaGlwVHlwZXM/OiBzdHJpbmdbXTtcbiAgICAgIG1pblN0cmVuZ3RoPzogbnVtYmVyO1xuICAgIH1cbiAgKTogUHJvbWlzZTxNYXA8c3RyaW5nLCBFbGVtZW50UGF0aD4+IHtcbiAgICBjb25zdCBpbmRleCA9IGF3YWl0IHRoaXMuZ2V0SW5kZXgoKTtcbiAgICByZXR1cm4gdGhpcy5yZWxhdGlvbnNoaXBNYW5hZ2VyLmdldENvbm5lY3RlZEVsZW1lbnRzKGVsZW1lbnQsIGluZGV4LCBvcHRpb25zIGFzIGFueSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHJlbGF0aW9uc2hpcCBzdGF0aXN0aWNzXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZ2V0UmVsYXRpb25zaGlwU3RhdHMoKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBudW1iZXI+PiB7XG4gICAgY29uc3QgaW5kZXggPSBhd2FpdCB0aGlzLmdldEluZGV4KCk7XG4gICAgcmV0dXJuIHRoaXMucmVsYXRpb25zaGlwTWFuYWdlci5nZXRSZWxhdGlvbnNoaXBTdGF0cyhpbmRleCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGFsbCByZWxhdGlvbnNoaXBzIGZvciBhbiBlbGVtZW50XG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZ2V0RWxlbWVudFJlbGF0aW9uc2hpcHMoZWxlbWVudElkOiBzdHJpbmcpOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIFJlbGF0aW9uc2hpcFtdPj4ge1xuICAgIGNvbnN0IGluZGV4ID0gYXdhaXQgdGhpcy5nZXRJbmRleCgpO1xuICAgIC8vIEZJWDogVXNlIGNlbnRyYWxpemVkIGVsZW1lbnQgSUQgcGFyc2luZ1xuICAgIGNvbnN0IHBhcnNlZCA9IHBhcnNlRWxlbWVudElkKGVsZW1lbnRJZCk7XG4gICAgaWYgKCFwYXJzZWQpIHtcbiAgICAgIHJldHVybiB7fTtcbiAgICB9XG4gICAgY29uc3QgZWxlbWVudCA9IGluZGV4LmVsZW1lbnRzW3BhcnNlZC50eXBlXT8uW3BhcnNlZC5uYW1lXTtcblxuICAgIGlmICghZWxlbWVudCkge1xuICAgICAgcmV0dXJuIHt9O1xuICAgIH1cblxuICAgIHJldHVybiBlbGVtZW50LnJlbGF0aW9uc2hpcHMgfHwge307XG4gIH1cblxuICAvKipcbiAgICogQ2xlYW4gdXAgbWVtb3J5IGJ5IGNsZWFyaW5nIGNhY2hlcyBhbmQgb2xkIGRhdGFcbiAgICogRklYOiBBZGRlZCB0byBwcmV2ZW50IG1lbW9yeSBsZWFrcyBhcyBpZGVudGlmaWVkIGluIFBSIHJldmlld1xuICAgKi9cbiAgcHVibGljIGNsZWFyTWVtb3J5Q2FjaGUoKTogdm9pZCB7XG4gICAgY29uc3Qgbm93ID0gbmV3IERhdGUoKTtcbiAgICBjb25zdCB0aW1lU2luY2VMYXN0Q2xlYW51cCA9IG5vdy5nZXRUaW1lKCkgLSB0aGlzLmxhc3RNZW1vcnlDbGVhbnVwLmdldFRpbWUoKTtcblxuICAgIC8vIE9ubHkgY2xlYW51cCBpZiBpdCdzIGJlZW4gbW9yZSB0aGFuIDUgbWludXRlc1xuICAgIC8vIEZJWDogVXNlIGNvbmZpZ3VyYXRpb24gZm9yIGNsZWFudXAgaW50ZXJ2YWwgY2hlY2tcbiAgICBjb25zdCBjb25maWcgPSB0aGlzLmNvbmZpZy5nZXRDb25maWcoKTtcbiAgICBjb25zdCBtaW5DbGVhbnVwSW50ZXJ2YWwgPSBjb25maWcubWVtb3J5LmNsZWFudXBJbnRlcnZhbE1pbnV0ZXMgKiA2MCAqIDEwMDA7XG4gICAgaWYgKHRpbWVTaW5jZUxhc3RDbGVhbnVwIDwgbWluQ2xlYW51cEludGVydmFsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gQ2xlYXIgTkxQIHNjb3JpbmcgY2FjaGVzXG4gICAgaWYgKHRoaXMubmxwU2NvcmluZykge1xuICAgICAgKHRoaXMubmxwU2NvcmluZyBhcyBhbnkpLmNsZWFyQ2FjaGU/LigpO1xuICAgIH1cblxuICAgIC8vIENsZWFyIHZlcmIgdHJpZ2dlciBjYWNoZXNcbiAgICBpZiAodGhpcy52ZXJiVHJpZ2dlcnMpIHtcbiAgICAgICh0aGlzLnZlcmJUcmlnZ2VycyBhcyBhbnkpLmNsZWFyQ2FjaGU/LigpO1xuICAgIH1cblxuICAgIC8vIENsZWFyIHJlbGF0aW9uc2hpcCBtYW5hZ2VyIGNhY2hlc1xuICAgIGlmICh0aGlzLnJlbGF0aW9uc2hpcE1hbmFnZXIpIHtcbiAgICAgICh0aGlzLnJlbGF0aW9uc2hpcE1hbmFnZXIgYXMgYW55KS5jbGVhckNhY2hlPy4oKTtcbiAgICB9XG5cbiAgICAvLyBJZiBpbmRleCBpcyBzdGFsZSwgY2xlYXIgaXQgZnJvbSBtZW1vcnlcbiAgICAvLyBGSVg6IFVzZSBjb25maWd1cmF0aW9uIGZvciBzdGFsZSBpbmRleCBtdWx0aXBsaWVyXG4gICAgaWYgKHRoaXMuaW5kZXggJiYgdGhpcy5sYXN0TG9hZGVkKSB7XG4gICAgICBjb25zdCBpbmRleEFnZSA9IG5vdy5nZXRUaW1lKCkgLSB0aGlzLmxhc3RMb2FkZWQuZ2V0VGltZSgpO1xuICAgICAgY29uc3Qgc3RhbGVUaHJlc2hvbGQgPSB0aGlzLlRUTF9NUyAqIGNvbmZpZy5tZW1vcnkuc3RhbGVJbmRleE11bHRpcGxpZXI7XG4gICAgICBpZiAoaW5kZXhBZ2UgPiBzdGFsZVRocmVzaG9sZCkge1xuICAgICAgICBsb2dnZXIuZGVidWcoJ0NsZWFyaW5nIHN0YWxlIGluZGV4IGZyb20gbWVtb3J5Jywge1xuICAgICAgICAgIGluZGV4QWdlLFxuICAgICAgICAgIHN0YWxlVGhyZXNob2xkLFxuICAgICAgICAgIG11bHRpcGxpZXI6IGNvbmZpZy5tZW1vcnkuc3RhbGVJbmRleE11bHRpcGxpZXJcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuaW5kZXggPSBudWxsO1xuICAgICAgICB0aGlzLmxhc3RMb2FkZWQgPSBudWxsO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMubGFzdE1lbW9yeUNsZWFudXAgPSBub3c7XG4gIH1cblxuICAvKipcbiAgICogU3RhcnQgYXV0b21hdGljIG1lbW9yeSBjbGVhbnVwXG4gICAqL1xuICAvLyBGSVg6IFVzZSBjb25maWd1cmF0aW9uIGZvciBkZWZhdWx0IGNsZWFudXAgaW50ZXJ2YWxcbiAgcHVibGljIHN0YXJ0TWVtb3J5Q2xlYW51cChpbnRlcnZhbE1zPzogbnVtYmVyKTogdm9pZCB7XG4gICAgY29uc3QgY29uZmlnID0gdGhpcy5jb25maWcuZ2V0Q29uZmlnKCk7XG4gICAgY29uc3QgYWN0dWFsSW50ZXJ2YWwgPSBpbnRlcnZhbE1zIHx8IGNvbmZpZy5tZW1vcnkuY2xlYW51cEludGVydmFsTWludXRlcyAqIDYwICogMTAwMDtcbiAgICBpZiAodGhpcy5tZW1vcnlDbGVhbnVwSW50ZXJ2YWwpIHtcbiAgICAgIGNsZWFySW50ZXJ2YWwodGhpcy5tZW1vcnlDbGVhbnVwSW50ZXJ2YWwpO1xuICAgIH1cblxuICAgIHRoaXMubWVtb3J5Q2xlYW51cEludGVydmFsID0gc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgICAgdGhpcy5jbGVhck1lbW9yeUNhY2hlKCk7XG4gICAgfSwgYWN0dWFsSW50ZXJ2YWwpO1xuICAgIGlmICh0eXBlb2YgdGhpcy5tZW1vcnlDbGVhbnVwSW50ZXJ2YWwudW5yZWYgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRoaXMubWVtb3J5Q2xlYW51cEludGVydmFsLnVucmVmKCk7XG4gICAgfVxuXG4gICAgbG9nZ2VyLmRlYnVnKCdTdGFydGVkIGF1dG9tYXRpYyBtZW1vcnkgY2xlYW51cCcsIHsgaW50ZXJ2YWxNczogYWN0dWFsSW50ZXJ2YWwgfSk7XG4gIH1cblxuICAvKipcbiAgICogU3RvcCBhdXRvbWF0aWMgbWVtb3J5IGNsZWFudXBcbiAgICovXG4gIHB1YmxpYyBzdG9wTWVtb3J5Q2xlYW51cCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5tZW1vcnlDbGVhbnVwSW50ZXJ2YWwpIHtcbiAgICAgIGNsZWFySW50ZXJ2YWwodGhpcy5tZW1vcnlDbGVhbnVwSW50ZXJ2YWwpO1xuICAgICAgdGhpcy5tZW1vcnlDbGVhbnVwSW50ZXJ2YWwgPSBudWxsO1xuICAgICAgbG9nZ2VyLmRlYnVnKCdTdG9wcGVkIGF1dG9tYXRpYyBtZW1vcnkgY2xlYW51cCcpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhbiB1cCBhbGwgcmVzb3VyY2VzIChmb3IgdGVzdGluZyBhbmQgc2h1dGRvd24pXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgY2xlYW51cCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLnN0b3BNZW1vcnlDbGVhbnVwKCk7XG4gICAgdGhpcy5jbGVhck1lbW9yeUNhY2hlKCk7XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5tZXRyaWNzVHJhY2tlci5mbHVzaCgpO1xuICAgIH0gY2F0Y2ggKF9lcnJvcikge1xuICAgICAgLy8gSWdub3JlIGNsZWFudXAgZmx1c2ggZXJyb3JzXG4gICAgfVxuICAgIHRoaXMubWV0cmljc1RyYWNrZXIuZGlzcG9zZSgpO1xuXG4gICAgaWYgKHRoaXMubmxwU2NvcmluZyAmJiB0eXBlb2YgKHRoaXMubmxwU2NvcmluZyBhcyBhbnkpLmRpc3Bvc2UgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICh0aGlzLm5scFNjb3JpbmcgYXMgYW55KS5kaXNwb3NlKCk7XG4gICAgfVxuXG4gICAgLy8gUmVsZWFzZSBmaWxlIGxvY2sgaWYgaGVsZFxuICAgIGlmICh0aGlzLmZpbGVMb2NrKSB7XG4gICAgICBhd2FpdCB0aGlzLmZpbGVMb2NrLnJlbGVhc2UoKS5jYXRjaCgoKSA9PiB7fSk7XG4gICAgfVxuICB9XG59XG4iXX0=
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"NLPScoringManager.d.ts","sourceRoot":"","sources":["../../src/portfolio/NLPScoringManager.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAIH,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAE7D;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,EAAE,MAAM,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,aAAa,CAAC;IAC1B,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE;QACZ,GAAG,EAAE,MAAM,CAAC;QACZ,QAAQ,EAAE,MAAM,CAAC;QACjB,IAAI,EAAE,MAAM,CAAC;KACd,CAAC;IACF,iBAAiB,EAAE;QACjB,GAAG,EAAE,MAAM,CAAC;QACZ,QAAQ,EAAE,MAAM,CAAC;QACjB,IAAI,EAAE,MAAM,CAAC;KACd,CAAC;CACH;AAED,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,KAAK,CAAkF;IAC/F,OAAO,CAAC,gBAAgB,CAAW;IACnC,OAAO,CAAC,MAAM,CAAgB;IAC9B,OAAO,CAAC,gBAAgB,CAAmB;IAC3C,OAAO,CAAC,eAAe,CAAC,CAAiB;gBAGvC,MAAM,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC,EAC/B,kBAAkB,GAAE,kBAA6C;IA0BnE;;;OAGG;IACH,OAAO,CAAC,gBAAgB;IAkBxB;;;;;;OAMG;IACI,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM;IAqB7D;;;;;;;OAOG;IACI,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IA2B7C;;;;OAIG;IACI,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,aAAa;
|
|
1
|
+
{"version":3,"file":"NLPScoringManager.d.ts","sourceRoot":"","sources":["../../src/portfolio/NLPScoringManager.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAIH,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAE7D;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,EAAE,MAAM,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,aAAa,CAAC;IAC1B,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE;QACZ,GAAG,EAAE,MAAM,CAAC;QACZ,QAAQ,EAAE,MAAM,CAAC;QACjB,IAAI,EAAE,MAAM,CAAC;KACd,CAAC;IACF,iBAAiB,EAAE;QACjB,GAAG,EAAE,MAAM,CAAC;QACZ,QAAQ,EAAE,MAAM,CAAC;QACjB,IAAI,EAAE,MAAM,CAAC;KACd,CAAC;CACH;AAED,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,KAAK,CAAkF;IAC/F,OAAO,CAAC,gBAAgB,CAAW;IACnC,OAAO,CAAC,MAAM,CAAgB;IAC9B,OAAO,CAAC,gBAAgB,CAAmB;IAC3C,OAAO,CAAC,eAAe,CAAC,CAAiB;gBAGvC,MAAM,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC,EAC/B,kBAAkB,GAAE,kBAA6C;IA0BnE;;;OAGG;IACH,OAAO,CAAC,gBAAgB;IAkBxB;;;;;;OAMG;IACI,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM;IAqB7D;;;;;;;OAOG;IACI,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IA2B7C;;;;OAIG;IACI,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,aAAa;IAkFlE;;;;OAIG;IACI,qBAAqB,CAC1B,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAC5B,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IAgC1C;;OAEG;IACI,WAAW,CAChB,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,EAC/B,IAAI,GAAE,MAAU,GACf,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,aAAa,CAAA;KAAE,CAAC;IAchD;;;;OAIG;IACI,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,GAAE,MAAW,GAAG,MAAM,EAAE;IA6BjE;;OAEG;IACH,OAAO,CAAC,UAAU;IAmClB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAQzB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAoBzB;;OAEG;IACI,UAAU,IAAI,IAAI;IASzB;;OAEG;IACI,aAAa,IAAI;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE;IAe7D,OAAO,IAAI,IAAI;CAMvB"}
|