@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
|
@@ -187,13 +187,6 @@ export class NLPScoringManager {
|
|
|
187
187
|
};
|
|
188
188
|
// Cache the result with LRU management
|
|
189
189
|
this.addToCache(cacheKey, result);
|
|
190
|
-
// Log scoring event for monitoring
|
|
191
|
-
logger.debug('NLP scoring completed', {
|
|
192
|
-
jaccard: result.jaccard.toFixed(3),
|
|
193
|
-
entropy: result.entropy.toFixed(3),
|
|
194
|
-
score: result.combinedScore.toFixed(3),
|
|
195
|
-
interpretation: result.interpretation
|
|
196
|
-
});
|
|
197
190
|
return result;
|
|
198
191
|
}
|
|
199
192
|
/**
|
|
@@ -332,9 +325,12 @@ export class NLPScoringManager {
|
|
|
332
325
|
* Clear the cache
|
|
333
326
|
*/
|
|
334
327
|
clearCache() {
|
|
328
|
+
const cleared = this.cache.size;
|
|
335
329
|
this.cache.clear();
|
|
336
330
|
this.cacheAccessOrder = [];
|
|
337
|
-
|
|
331
|
+
if (cleared > 0) {
|
|
332
|
+
logger.debug('NLP scoring cache cleared', { entriesCleared: cleared });
|
|
333
|
+
}
|
|
338
334
|
}
|
|
339
335
|
/**
|
|
340
336
|
* Get cache statistics
|
|
@@ -358,4 +354,4 @@ export class NLPScoringManager {
|
|
|
358
354
|
}
|
|
359
355
|
}
|
|
360
356
|
}
|
|
361
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTkxQU2NvcmluZ01hbmFnZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcG9ydGZvbGlvL05MUFNjb3JpbmdNYW5hZ2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7OztHQWNHO0FBRUgsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQzVDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDRDQUE0QyxDQUFDO0FBQzlFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBMkM3RCxNQUFNLE9BQU8saUJBQWlCO0lBQ3BCLEtBQUssQ0FBa0Y7SUFDdkYsZ0JBQWdCLENBQVcsQ0FBRSw2QkFBNkI7SUFDMUQsTUFBTSxDQUFnQjtJQUN0QixnQkFBZ0IsQ0FBbUI7SUFDbkMsZUFBZSxDQUFrQjtJQUV6QyxZQUNFLE1BQStCLEVBQy9CLHFCQUF5QyxJQUFJLGtCQUFrQixFQUFFO1FBRWpFLGtDQUFrQztRQUNsQyxNQUFNLFdBQVcsR0FBRyxrQkFBa0IsQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUVuRCxJQUFJLENBQUMsTUFBTSxHQUFHO1lBQ1osY0FBYyxFQUFFLFdBQVcsQ0FBQyxHQUFHLENBQUMsY0FBYztZQUM5QyxXQUFXLEVBQUUsV0FBVyxDQUFDLEdBQUcsQ0FBQyxrQkFBa0IsR0FBRyxFQUFFLEdBQUcsSUFBSTtZQUMzRCxZQUFZLEVBQUUsV0FBVyxDQUFDLE1BQU0sQ0FBQyxZQUFZO1lBQzdDLFlBQVksRUFBRSxXQUFXLENBQUMsR0FBRyxDQUFDLFlBQVk7WUFDMUMsaUJBQWlCLEVBQUUsV0FBVyxDQUFDLEdBQUcsQ0FBQyxpQkFBaUI7WUFDcEQsR0FBRyxNQUFNO1NBQ1YsQ0FBQztRQUVGLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQztRQUN2QixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsRUFBRSxDQUFDO1FBQzNCLElBQUks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LE9BQU8sRUFBRSxTQUFTLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQ3pGLENBQUM7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDSSxVQUFVO1FBQ2YsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNuQixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsRUFBRSxDQUFDO1FBQzNCLE1BQU0sQ0FBQyxLQUFLLENBQUMsMkJBQTJCLENBQUMsQ0FBQztJQUM1QyxDQUFDO0lBRUQ7O09BRUc7SUFDSSxhQUFhO1FBQ2xCLElBQUksTUFBTSxHQUFrQixJQUFJLENBQUM7UUFFakMsS0FBSyxNQUFNLEtBQUssSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUM7WUFDeEMsSUFBSSxNQUFNLEtBQUssSUFBSSxJQUFJLEtBQUssQ0FBQyxTQUFTLEdBQUcsTUFBTSxFQUFFLENBQUM7Z0JBQ2hELE1BQU0sR0FBRyxLQUFLLENBQUMsU0FBUyxDQUFDO1lBQzNCLENBQUM7UUFDSCxDQUFDO1FBRUQsT0FBTztZQUNMLElBQUksRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUk7WUFDckIsV0FBVyxFQUFFLE1BQU07U0FDcEIsQ0FBQztJQUNKLENBQUM7SUFFTSxPQUFPO1FBQ1osSUFBSSxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7WUFDekIsYUFBYSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQztZQUNwQyxJQUFJLENBQUMsZUFBZSxHQUFHLFNBQVMsQ0FBQztRQUNuQyxDQUFDO0lBQ0gsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBOTFAgU2NvcmluZyBNYW5hZ2VyIC0gSmFjY2FyZCBzaW1pbGFyaXR5IGFuZCBTaGFubm9uIGVudHJvcHkgZm9yIHNlbWFudGljIGFuYWx5c2lzXG4gKlxuICogSW1wbGVtZW50cyBpbnRlbGxpZ2VudCBkb2N1bWVudCBzaW1pbGFyaXR5IHNjb3JpbmcgdXNpbmc6XG4gKiAtIEphY2NhcmQgc2ltaWxhcml0eSBmb3Igdm9jYWJ1bGFyeSBvdmVybGFwXG4gKiAtIFNoYW5ub24gZW50cm9weSBmb3IgaW5mb3JtYXRpb24gZGVuc2l0eVxuICogLSBDb21iaW5lZCBzY29yaW5nIGZvciBtZWFuaW5nZnVsIHNlbWFudGljIHJlbGF0aW9uc2hpcHNcbiAqXG4gKiBLZXkgaW5zaWdodHMgZnJvbSBhbmFseXNpczpcbiAqIC0gSGlnaCBKYWNjYXJkICg+NjAlKSArIE1vZGVyYXRlIGVudHJvcHkgKDQuNS02LjApID0gU2FtZSB0ZWNobmljYWwgZG9tYWluXG4gKiAtIEhpZ2ggSmFjY2FyZCArIExvdyBlbnRyb3B5ICg8My4wKSA9IFN0b3Agd29yZCBwb2xsdXRpb24sIHN1cGVyZmljaWFsXG4gKiAtIExvdyBKYWNjYXJkICsgU2ltaWxhciBlbnRyb3B5ID0gRGlmZmVyZW50IGRvbWFpbnMsIGVxdWFsbHkgY29tcGxleFxuICpcbiAqIFBhcnQgb2YgRW5oYW5jZWQgQ2FwYWJpbGl0eSBJbmRleCAoIzEwODUpXG4gKi9cblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vdXRpbHMvbG9nZ2VyLmpzJztcbmltcG9ydCB7IFVuaWNvZGVWYWxpZGF0b3IgfSBmcm9tICcuLi9zZWN1cml0eS92YWxpZGF0b3JzL3VuaWNvZGVWYWxpZGF0b3IuanMnO1xuaW1wb3J0IHsgSW5kZXhDb25maWdNYW5hZ2VyIH0gZnJvbSAnLi9jb25maWcvSW5kZXhDb25maWcuanMnO1xuXG4vKipcbiAqIFNjb3JpbmcgcmVzdWx0IHdpdGggZGV0YWlsZWQgbWV0cmljc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFNjb3JpbmdSZXN1bHQge1xuICBqYWNjYXJkOiBudW1iZXI7ICAgICAgICAgICAvLyAwLjAgdG8gMS4wXG4gIGVudHJvcHk6IG51bWJlcjsgICAgICAgICAgIC8vIFR5cGljYWxseSAwIHRvIDggYml0cyBmb3IgdGV4dFxuICBjb21iaW5lZFNjb3JlOiBudW1iZXI7ICAgICAvLyAwLjAgdG8gMS4wXG4gIGludGVycHJldGF0aW9uOiBzdHJpbmc7ICAgIC8vIEh1bWFuLXJlYWRhYmxlIGV4cGxhbmF0aW9uXG4gIHRva2VuQ291bnQ6IG51bWJlcjsgICAgICAgIC8vIE51bWJlciBvZiB1bmlxdWUgdG9rZW5zXG4gIG92ZXJsYXBDb3VudDogbnVtYmVyOyAgICAgIC8vIE51bWJlciBvZiBvdmVybGFwcGluZyB0b2tlbnNcbn1cblxuLyoqXG4gKiBQYWlyd2lzZSBzaW1pbGFyaXR5IGJldHdlZW4gdHdvIGVsZW1lbnRzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGFpcndpc2VTaW1pbGFyaXR5IHtcbiAgZWxlbWVudDE6IHN0cmluZztcbiAgZWxlbWVudDI6IHN0cmluZztcbiAgc2ltaWxhcml0eTogU2NvcmluZ1Jlc3VsdDtcbiAgdGltZXN0YW1wOiBzdHJpbmc7XG59XG5cbi8qKlxuICogQ29uZmlndXJhdGlvbiBmb3Igc2NvcmluZyBhbGdvcml0aG1cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTY29yaW5nQ29uZmlnIHtcbiAgbWluVG9rZW5MZW5ndGg6IG51bWJlcjtcbiAgY2FjaGVFeHBpcnk6IG51bWJlcjtcbiAgbWF4Q2FjaGVTaXplOiBudW1iZXI7ICAvLyBNYXhpbXVtIGNhY2hlIGVudHJpZXMgZm9yIExSVSBldmljdGlvbiAgICAgIC8vIG1pbGxpc2Vjb25kc1xuICBlbnRyb3B5QmFuZHM6IHtcbiAgICBsb3c6IG51bWJlcjsgICAgICAgICAgIC8vIDwgMy4wIHR5cGljYWxseSAoaGlnaCByZXBldGl0aW9uL2NvbW1vbiB3b3JkcylcbiAgICBtb2RlcmF0ZTogbnVtYmVyOyAgICAgIC8vIDMuMCAtIDYuMCB0eXBpY2FsbHkgKGJhbGFuY2VkIHZvY2FidWxhcnkpXG4gICAgaGlnaDogbnVtYmVyOyAgICAgICAgICAvLyA+IDYuMCB0eXBpY2FsbHkgKGRpdmVyc2Ugc3BlY2lhbGl6ZWQgdGVybXMpXG4gIH07XG4gIGphY2NhcmRUaHJlc2hvbGRzOiB7XG4gICAgbG93OiBudW1iZXI7ICAgICAgICAgICAvLyA8IDAuMlxuICAgIG1vZGVyYXRlOiBudW1iZXI7ICAgICAgLy8gMC4yIC0gMC42XG4gICAgaGlnaDogbnVtYmVyOyAgICAgICAgICAvLyA+IDAuNlxuICB9O1xufVxuXG5leHBvcnQgY2xhc3MgTkxQU2NvcmluZ01hbmFnZXIge1xuICBwcml2YXRlIGNhY2hlOiBNYXA8c3RyaW5nLCB7IHJlc3VsdDogU2NvcmluZ1Jlc3VsdDsgdGltZXN0YW1wOiBudW1iZXI7IGxhc3RBY2Nlc3NlZDogbnVtYmVyIH0+O1xuICBwcml2YXRlIGNhY2hlQWNjZXNzT3JkZXI6IHN0cmluZ1tdOyAgLy8gVHJhY2sgYWNjZXNzIG9yZGVyIGZvciBMUlVcbiAgcHJpdmF0ZSBjb25maWc6IFNjb3JpbmdDb25maWc7XG4gIHByaXZhdGUgdW5pY29kZVZhbGlkYXRvcjogVW5pY29kZVZhbGlkYXRvcjtcbiAgcHJpdmF0ZSBjbGVhbnVwSW50ZXJ2YWw/OiBOb2RlSlMuVGltZW91dDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBjb25maWc/OiBQYXJ0aWFsPFNjb3JpbmdDb25maWc+LFxuICAgIGluZGV4Q29uZmlnTWFuYWdlcjogSW5kZXhDb25maWdNYW5hZ2VyID0gbmV3IEluZGV4Q29uZmlnTWFuYWdlcigpXG4gICkge1xuICAgIC8vIEdldCBjb25maWcgZnJvbSBjZW50cmFsIG1hbmFnZXJcbiAgICBjb25zdCBpbmRleENvbmZpZyA9IGluZGV4Q29uZmlnTWFuYWdlci5nZXRDb25maWcoKTtcblxuICAgIHRoaXMuY29uZmlnID0ge1xuICAgICAgbWluVG9rZW5MZW5ndGg6IGluZGV4Q29uZmlnLm5scC5taW5Ub2tlbkxlbmd0aCxcbiAgICAgIGNhY2hlRXhwaXJ5OiBpbmRleENvbmZpZy5ubHAuY2FjaGVFeHBpcnlNaW51dGVzICogNjAgKiAxMDAwLFxuICAgICAgbWF4Q2FjaGVTaXplOiBpbmRleENvbmZpZy5tZW1vcnkubWF4Q2FjaGVTaXplLFxuICAgICAgZW50cm9weUJhbmRzOiBpbmRleENvbmZpZy5ubHAuZW50cm9weUJhbmRzLFxuICAgICAgamFjY2FyZFRocmVzaG9sZHM6IGluZGV4Q29uZmlnLm5scC5qYWNjYXJkVGhyZXNob2xkcyxcbiAgICAgIC4uLmNvbmZpZ1xuICAgIH07XG5cbiAgICB0aGlzLmNhY2hlID0gbmV3IE1hcCgpO1xuICAgIHRoaXMuY2FjaGVBY2Nlc3NPcmRlciA9IFtdO1xuICAgIHRoaXMudW5pY29kZVZhbGlkYXRvciA9IG5ldyBVbmljb2RlVmFsaWRhdG9yKCk7XG5cbiAgICAvLyBQZXJpb2RpYyBjbGVhbnVwIG9mIGV4cGlyZWQgZW50cmllc1xuICAgIHRoaXMuY2xlYW51cEludGVydmFsID0gc2V0SW50ZXJ2YWwoKCkgPT4gdGhpcy5jbGVhbkV4cGlyZWRDYWNoZSgpLCA2MDAwMCk7IC8vIEV2ZXJ5IG1pbnV0ZVxuXG4gICAgaWYgKHR5cGVvZiB0aGlzLmNsZWFudXBJbnRlcnZhbC51bnJlZiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhpcy5jbGVhbnVwSW50ZXJ2YWwudW5yZWYoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2xlYW4gYW5kIHRva2VuaXplIHRleHQgZm9yIGFuYWx5c2lzXG4gICAqIFdvcmtzIHdpdGggYW55IGxhbmd1YWdlIC0gbm8gaGFyZGNvZGVkIHN0b3Agd29yZHNcbiAgICovXG4gIHByaXZhdGUgY2xlYW5BbmRUb2tlbml6ZSh0ZXh0OiBzdHJpbmcpOiBTZXQ8c3RyaW5nPiB7XG4gICAgLy8gTm9ybWFsaXplIFVuaWNvZGUgZm9yIHNlY3VyaXR5XG4gICAgY29uc3QgdmFsaWRhdGlvbiA9IFVuaWNvZGVWYWxpZGF0b3Iubm9ybWFsaXplKHRleHQpO1xuICAgIGlmICh2YWxpZGF0aW9uLmRldGVjdGVkSXNzdWVzICYmIHZhbGlkYXRpb24uZGV0ZWN0ZWRJc3N1ZXMubGVuZ3RoID4gMCkge1xuICAgICAgbG9nZ2VyLndhcm4oJ1VuaWNvZGUgaXNzdWVzIGluIE5MUCB0ZXh0JywgeyBpc3N1ZXM6IHZhbGlkYXRpb24uZGV0ZWN0ZWRJc3N1ZXMgfSk7XG4gICAgfVxuICAgIHRleHQgPSB2YWxpZGF0aW9uLm5vcm1hbGl6ZWRDb250ZW50O1xuXG4gICAgLy8gQ29udmVydCB0byBsb3dlcmNhc2UgYW5kIHNwbGl0IG9uIHdvcmQgYm91bmRhcmllc1xuICAgIC8vIEtlZXAgVW5pY29kZSBsZXR0ZXIgY2hhcmFjdGVycyBmb3IgbXVsdGlsaW5ndWFsIHN1cHBvcnRcbiAgICBjb25zdCB0b2tlbnMgPSB0ZXh0LnRvTG93ZXJDYXNlKClcbiAgICAgIC5yZXBsYWNlQWxsKC9bXlxccHtMfVxccHtOfVxcc18tXS9ndSwgJyAnKSAgLy8gVW5pY29kZS1hd2FyZToga2VlcCBsZXR0ZXJzLCBudW1iZXJzLCB1bmRlcnNjb3JlLCBoeXBoZW5cbiAgICAgIC5zcGxpdCgvXFxzKy8pXG4gICAgICAuZmlsdGVyKHRva2VuID0+IHRva2VuLmxlbmd0aCA+PSB0aGlzLmNvbmZpZy5taW5Ub2tlbkxlbmd0aCk7XG5cbiAgICByZXR1cm4gbmV3IFNldCh0b2tlbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGN1bGF0ZSBKYWNjYXJkIHNpbWlsYXJpdHkgYmV0d2VlbiB0d28gdGV4dCBzdHJpbmdzXG4gICAqXG4gICAqIEphY2NhcmQgPSB8QSDiiKkgQnwgLyB8QSDiiKogQnxcbiAgICpcbiAgICogUmV0dXJucyB2YWx1ZSBiZXR3ZWVuIDAgKG5vIG92ZXJsYXApIGFuZCAxIChpZGVudGljYWwpXG4gICAqL1xuICBwdWJsaWMgY2FsY3VsYXRlSmFjY2FyZCh0ZXh0MTogc3RyaW5nLCB0ZXh0Mjogc3RyaW5nKTogbnVtYmVyIHtcbiAgICBjb25zdCB0b2tlbnMxID0gdGhpcy5jbGVhbkFuZFRva2VuaXplKHRleHQxKTtcbiAgICBjb25zdCB0b2tlbnMyID0gdGhpcy5jbGVhbkFuZFRva2VuaXplKHRleHQyKTtcblxuICAgIGlmICh0b2tlbnMxLnNpemUgPT09IDAgJiYgdG9rZW5zMi5zaXplID09PSAwKSB7XG4gICAgICByZXR1cm4gMS4wOyAvLyBCb3RoIGVtcHR5ID0gaWRlbnRpY2FsXG4gICAgfVxuXG4gICAgaWYgKHRva2VuczEuc2l6ZSA9PT0gMCB8fCB0b2tlbnMyLnNpemUgPT09IDApIHtcbiAgICAgIHJldHVybiAwLjA7IC8vIE9uZSBlbXB0eSA9IG5vIHNpbWlsYXJpdHlcbiAgICB9XG5cbiAgICAvLyBDYWxjdWxhdGUgaW50ZXJzZWN0aW9uXG4gICAgY29uc3QgaW50ZXJzZWN0aW9uID0gbmV3IFNldChbLi4udG9rZW5zMV0uZmlsdGVyKHRva2VuID0+IHRva2VuczIuaGFzKHRva2VuKSkpO1xuXG4gICAgLy8gQ2FsY3VsYXRlIHVuaW9uXG4gICAgY29uc3QgdW5pb24gPSBuZXcgU2V0KFsuLi50b2tlbnMxLCAuLi50b2tlbnMyXSk7XG5cbiAgICByZXR1cm4gaW50ZXJzZWN0aW9uLnNpemUgLyB1bmlvbi5zaXplO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGN1bGF0ZSBTaGFubm9uIGVudHJvcHkgZm9yIHRleHRcbiAgICpcbiAgICogSChYKSA9IC3OoyBwKHgpICogbG9nMihwKHgpKVxuICAgKlxuICAgKiBNZWFzdXJlcyBpbmZvcm1hdGlvbiBkZW5zaXR5L3ZvY2FidWxhcnkgcmljaG5lc3NcbiAgICogSGlnaGVyIGVudHJvcHkgPSBtb3JlIGRpdmVyc2Ugdm9jYWJ1bGFyeVxuICAgKi9cbiAgcHVibGljIGNhbGN1bGF0ZUVudHJvcHkodGV4dDogc3RyaW5nKTogbnVtYmVyIHtcbiAgICBjb25zdCB0b2tlbnMgPSBBcnJheS5mcm9tKHRoaXMuY2xlYW5BbmRUb2tlbml6ZSh0ZXh0KSk7XG5cbiAgICBpZiAodG9rZW5zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIDA7XG4gICAgfVxuXG4gICAgLy8gQ2FsY3VsYXRlIHRva2VuIGZyZXF1ZW5jaWVzXG4gICAgY29uc3QgZnJlcXVlbmNpZXMgPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpO1xuICAgIGZvciAoY29uc3QgdG9rZW4gb2YgdG9rZW5zKSB7XG4gICAgICBmcmVxdWVuY2llcy5zZXQodG9rZW4sIChmcmVxdWVuY2llcy5nZXQodG9rZW4pIHx8IDApICsgMSk7XG4gICAgfVxuXG4gICAgLy8gQ2FsY3VsYXRlIHByb2JhYmlsaXRpZXMgYW5kIGVudHJvcHlcbiAgICBsZXQgZW50cm9weSA9IDA7XG4gICAgY29uc3QgdG90YWxUb2tlbnMgPSB0b2tlbnMubGVuZ3RoO1xuXG4gICAgZm9yIChjb25zdCBjb3VudCBvZiBmcmVxdWVuY2llcy52YWx1ZXMoKSkge1xuICAgICAgY29uc3QgcHJvYmFiaWxpdHkgPSBjb3VudCAvIHRvdGFsVG9rZW5zO1xuICAgICAgaWYgKHByb2JhYmlsaXR5ID4gMCkge1xuICAgICAgICBlbnRyb3B5IC09IHByb2JhYmlsaXR5ICogTWF0aC5sb2cyKHByb2JhYmlsaXR5KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZW50cm9weTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxjdWxhdGUgY29tYmluZWQgcmVsZXZhbmNlIHNjb3JlIHVzaW5nIEphY2NhcmQgYW5kIGVudHJvcHlcbiAgICpcbiAgICogSW50ZXJwcmV0cyB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gc2ltaWxhcml0eSBhbmQgY29tcGxleGl0eVxuICAgKi9cbiAgcHVibGljIHNjb3JlUmVsZXZhbmNlKHRleHQxOiBzdHJpbmcsIHRleHQyOiBzdHJpbmcpOiBTY29yaW5nUmVzdWx0IHtcbiAgICAvLyBDaGVjayBjYWNoZSBmaXJzdFxuICAgIGNvbnN0IGNhY2hlS2V5ID0gYCR7dGV4dDEuc3Vic3RyaW5nKDAsIDUwKX06Ojoke3RleHQyLnN1YnN0cmluZygwLCA1MCl9YDtcbiAgICBjb25zdCBjYWNoZWQgPSB0aGlzLmNhY2hlLmdldChjYWNoZUtleSk7XG5cbiAgICBpZiAoY2FjaGVkICYmIERhdGUubm93KCkgLSBjYWNoZWQudGltZXN0YW1wIDwgdGhpcy5jb25maWcuY2FjaGVFeHBpcnkpIHtcbiAgICAgIC8vIFVwZGF0ZSBhY2Nlc3Mgb3JkZXIgZm9yIExSVVxuICAgICAgY2FjaGVkLmxhc3RBY2Nlc3NlZCA9IERhdGUubm93KCk7XG4gICAgICB0aGlzLnVwZGF0ZUFjY2Vzc09yZGVyKGNhY2hlS2V5KTtcbiAgICAgIHJldHVybiBjYWNoZWQucmVzdWx0O1xuICAgIH1cblxuICAgIC8vIENhbGN1bGF0ZSBtZXRyaWNzXG4gICAgY29uc3QgamFjY2FyZCA9IHRoaXMuY2FsY3VsYXRlSmFjY2FyZCh0ZXh0MSwgdGV4dDIpO1xuICAgIGNvbnN0IGVudHJvcHkxID0gdGhpcy5jYWxjdWxhdGVFbnRyb3B5KHRleHQxKTtcbiAgICBjb25zdCBlbnRyb3B5MiA9IHRoaXMuY2FsY3VsYXRlRW50cm9weSh0ZXh0Mik7XG4gICAgY29uc3QgYXZnRW50cm9weSA9IChlbnRyb3B5MSArIGVudHJvcHkyKSAvIDI7XG5cbiAgICAvLyBHZXQgdG9rZW4gc2V0cyBmb3IgYWRkaXRpb25hbCBtZXRyaWNzXG4gICAgY29uc3QgdG9rZW5zMSA9IHRoaXMuY2xlYW5BbmRUb2tlbml6ZSh0ZXh0MSk7XG4gICAgY29uc3QgdG9rZW5zMiA9IHRoaXMuY2xlYW5BbmRUb2tlbml6ZSh0ZXh0Mik7XG4gICAgY29uc3QgaW50ZXJzZWN0aW9uID0gbmV3IFNldChbLi4udG9rZW5zMV0uZmlsdGVyKHRva2VuID0+IHRva2VuczIuaGFzKHRva2VuKSkpO1xuXG4gICAgLy8gSW50ZXJwcmV0IHRoZSBjb21iaW5hdGlvblxuICAgIGxldCBjb21iaW5lZFNjb3JlOiBudW1iZXI7XG4gICAgbGV0IGludGVycHJldGF0aW9uOiBzdHJpbmc7XG5cbiAgICAvLyBIaWdoIEphY2NhcmQgKyBNb2RlcmF0ZS1IaWdoIGVudHJvcHkgPSBFeGNlbGxlbnQgbWF0Y2ggKHNhbWUgZG9tYWluKVxuICAgIGlmIChqYWNjYXJkID49IHRoaXMuY29uZmlnLmphY2NhcmRUaHJlc2hvbGRzLmhpZ2ggJiZcbiAgICAgICAgYXZnRW50cm9weSA+PSB0aGlzLmNvbmZpZy5lbnRyb3B5QmFuZHMubG93KSB7XG4gICAgICAvLyBTY2FsZSBzY29yZSBiYXNlZCBvbiBlbnRyb3B5IHF1YWxpdHlcbiAgICAgIGNvbnN0IGVudHJvcHlRdWFsaXR5ID0gTWF0aC5taW4oMS4wLCAoYXZnRW50cm9weSAtIDIuMCkgLyA0LjApOyAvLyAwIGF0IGVudHJvcHk9MiwgMSBhdCBlbnRyb3B5PTYrXG4gICAgICBjb21iaW5lZFNjb3JlID0gMC43ICsgKGphY2NhcmQgLSAwLjYpICogMC41ICsgZW50cm9weVF1YWxpdHkgKiAwLjI7XG5cbiAgICAgIGlmIChhdmdFbnRyb3B5ID49IHRoaXMuY29uZmlnLmVudHJvcHlCYW5kcy5tb2RlcmF0ZSkge1xuICAgICAgICBpbnRlcnByZXRhdGlvbiA9ICdFeGNlbGxlbnQgbWF0Y2ggLSBzYW1lIHRlY2huaWNhbCBkb21haW4gd2l0aCByaWNoIHZvY2FidWxhcnknO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaW50ZXJwcmV0YXRpb24gPSAnR29vZCBtYXRjaCAtIGhpZ2ggb3ZlcmxhcCBidXQgc2ltcGxlciB2b2NhYnVsYXJ5JztcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gSGlnaCBKYWNjYXJkICsgVmVyeSBMb3cgZW50cm9weSA9IENvbW1vbiB3b3JkIHBvbGx1dGlvblxuICAgIGVsc2UgaWYgKGphY2NhcmQgPj0gdGhpcy5jb25maWcuamFjY2FyZFRocmVzaG9sZHMuaGlnaCAmJlxuICAgICAgICAgICAgIGF2Z0VudHJvcHkgPCAyLjApIHtcbiAgICAgIGNvbWJpbmVkU2NvcmUgPSAwLjMgKyBqYWNjYXJkICogMC4yOyAvLyBQZW5hbGl6ZSBoZWF2aWx5XG4gICAgICBpbnRlcnByZXRhdGlvbiA9ICdTdXBlcmZpY2lhbCBzaW1pbGFyaXR5IC0gbW9zdGx5IGNvbW1vbiB3b3Jkcyc7XG4gICAgfVxuICAgIC8vIE1vZGVyYXRlIEphY2NhcmQgKyBHb29kIGVudHJvcHkgPSBSZWxhdGVkIGNvbmNlcHRzXG4gICAgZWxzZSBpZiAoamFjY2FyZCA+PSB0aGlzLmNvbmZpZy5qYWNjYXJkVGhyZXNob2xkcy5tb2RlcmF0ZSAmJlxuICAgICAgICAgICAgIGF2Z0VudHJvcHkgPj0gdGhpcy5jb25maWcuZW50cm9weUJhbmRzLmxvdykge1xuICAgICAgY29tYmluZWRTY29yZSA9IDAuNCArIGphY2NhcmQgKiAwLjQgKyAoYXZnRW50cm9weSAvIDEwKSAqIDAuMjtcbiAgICAgIGludGVycHJldGF0aW9uID0gJ01vZGVyYXRlIG1hdGNoIC0gcmVsYXRlZCBjb25jZXB0cyB3aXRoIGdvb2QgY29tcGxleGl0eSc7XG4gICAgfVxuICAgIC8vIExvdyBKYWNjYXJkICsgU2ltaWxhciBlbnRyb3B5ID0gRGlmZmVyZW50IGRvbWFpbnNcbiAgICBlbHNlIGlmIChqYWNjYXJkIDwgdGhpcy5jb25maWcuamFjY2FyZFRocmVzaG9sZHMubG93ICYmXG4gICAgICAgICAgICAgTWF0aC5hYnMoZW50cm9weTEgLSBlbnRyb3B5MikgPCAxLjApIHtcbiAgICAgIGNvbWJpbmVkU2NvcmUgPSBqYWNjYXJkICogMC41O1xuICAgICAgaW50ZXJwcmV0YXRpb24gPSAnRGlmZmVyZW50IGRvbWFpbnMgd2l0aCBzaW1pbGFyIGNvbXBsZXhpdHknO1xuICAgIH1cbiAgICAvLyBMb3cgSmFjY2FyZCArIERpZmZlcmVudCBlbnRyb3B5ID0gVW5yZWxhdGVkXG4gICAgZWxzZSB7XG4gICAgICBjb21iaW5lZFNjb3JlID0gamFjY2FyZCAqIDAuMztcbiAgICAgIGludGVycHJldGF0aW9uID0gJ0xvdyByZWxldmFuY2UgLSBkaWZmZXJlbnQgdG9waWNzIGFuZCBjb21wbGV4aXR5JztcbiAgICB9XG5cbiAgICAvLyBFbnN1cmUgc2NvcmUgaXMgYmV0d2VlbiAwIGFuZCAxXG4gICAgY29tYmluZWRTY29yZSA9IE1hdGgubWF4KDAsIE1hdGgubWluKDEsIGNvbWJpbmVkU2NvcmUpKTtcblxuICAgIGNvbnN0IHJlc3VsdDogU2NvcmluZ1Jlc3VsdCA9IHtcbiAgICAgIGphY2NhcmQsXG4gICAgICBlbnRyb3B5OiBhdmdFbnRyb3B5LFxuICAgICAgY29tYmluZWRTY29yZSxcbiAgICAgIGludGVycHJldGF0aW9uLFxuICAgICAgdG9rZW5Db3VudDogdG9rZW5zMS5zaXplICsgdG9rZW5zMi5zaXplLFxuICAgICAgb3ZlcmxhcENvdW50OiBpbnRlcnNlY3Rpb24uc2l6ZVxuICAgIH07XG5cbiAgICAvLyBDYWNoZSB0aGUgcmVzdWx0IHdpdGggTFJVIG1hbmFnZW1lbnRcbiAgICB0aGlzLmFkZFRvQ2FjaGUoY2FjaGVLZXksIHJlc3VsdCk7XG5cbiAgICAvLyBMb2cgc2NvcmluZyBldmVudCBmb3IgbW9uaXRvcmluZ1xuICAgIGxvZ2dlci5kZWJ1ZygnTkxQIHNjb3JpbmcgY29tcGxldGVkJywge1xuICAgICAgamFjY2FyZDogcmVzdWx0LmphY2NhcmQudG9GaXhlZCgzKSxcbiAgICAgIGVudHJvcHk6IHJlc3VsdC5lbnRyb3B5LnRvRml4ZWQoMyksXG4gICAgICBzY29yZTogcmVzdWx0LmNvbWJpbmVkU2NvcmUudG9GaXhlZCgzKSxcbiAgICAgIGludGVycHJldGF0aW9uOiByZXN1bHQuaW50ZXJwcmV0YXRpb25cbiAgICB9KTtcblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogQnVpbGQgYSBwYWlyd2lzZSBzaW1pbGFyaXR5IG1hdHJpeCBmb3IgbXVsdGlwbGUgdGV4dHNcbiAgICpcbiAgICogVXNlZnVsIGZvciBjbHVzdGVyaW5nIGFuZCByZWxhdGlvbnNoaXAgZGlzY292ZXJ5XG4gICAqL1xuICBwdWJsaWMgYnVpbGRTaW1pbGFyaXR5TWF0cml4KFxuICAgIGVsZW1lbnRzOiBNYXA8c3RyaW5nLCBzdHJpbmc+XG4gICk6IE1hcDxzdHJpbmcsIE1hcDxzdHJpbmcsIFNjb3JpbmdSZXN1bHQ+PiB7XG4gICAgY29uc3QgbWF0cml4ID0gbmV3IE1hcDxzdHJpbmcsIE1hcDxzdHJpbmcsIFNjb3JpbmdSZXN1bHQ+PigpO1xuICAgIGNvbnN0IGtleXMgPSBBcnJheS5mcm9tKGVsZW1lbnRzLmtleXMoKSk7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGtleTEgPSBrZXlzW2ldO1xuICAgICAgY29uc3QgdGV4dDEgPSBlbGVtZW50cy5nZXQoa2V5MSkhO1xuXG4gICAgICBpZiAoIW1hdHJpeC5oYXMoa2V5MSkpIHtcbiAgICAgICAgbWF0cml4LnNldChrZXkxLCBuZXcgTWFwKCkpO1xuICAgICAgfVxuXG4gICAgICBmb3IgKGxldCBqID0gaSArIDE7IGogPCBrZXlzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgIGNvbnN0IGtleTIgPSBrZXlzW2pdO1xuICAgICAgICBjb25zdCB0ZXh0MiA9IGVsZW1lbnRzLmdldChrZXkyKSE7XG5cbiAgICAgICAgLy8gQ2FsY3VsYXRlIHNpbWlsYXJpdHlcbiAgICAgICAgY29uc3Qgc2ltaWxhcml0eSA9IHRoaXMuc2NvcmVSZWxldmFuY2UodGV4dDEsIHRleHQyKTtcblxuICAgICAgICAvLyBTdG9yZSBiaWRpcmVjdGlvbmFsbHlcbiAgICAgICAgbWF0cml4LmdldChrZXkxKSEuc2V0KGtleTIsIHNpbWlsYXJpdHkpO1xuXG4gICAgICAgIGlmICghbWF0cml4LmhhcyhrZXkyKSkge1xuICAgICAgICAgIG1hdHJpeC5zZXQoa2V5MiwgbmV3IE1hcCgpKTtcbiAgICAgICAgfVxuICAgICAgICBtYXRyaXguZ2V0KGtleTIpIS5zZXQoa2V5MSwgc2ltaWxhcml0eSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG1hdHJpeDtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kIG1vc3Qgc2ltaWxhciBlbGVtZW50cyB0byBhIGdpdmVuIHRleHRcbiAgICovXG4gIHB1YmxpYyBmaW5kU2ltaWxhcihcbiAgICB0YXJnZXRUZXh0OiBzdHJpbmcsXG4gICAgY2FuZGlkYXRlczogTWFwPHN0cmluZywgc3RyaW5nPixcbiAgICB0b3BLOiBudW1iZXIgPSA1XG4gICk6IEFycmF5PHsgbmFtZTogc3RyaW5nOyBzY29yZTogU2NvcmluZ1Jlc3VsdCB9PiB7XG4gICAgY29uc3Qgc2NvcmVzOiBBcnJheTx7IG5hbWU6IHN0cmluZzsgc2NvcmU6IFNjb3JpbmdSZXN1bHQgfT4gPSBbXTtcblxuICAgIGZvciAoY29uc3QgW25hbWUsIHRleHRdIG9mIGNhbmRpZGF0ZXMuZW50cmllcygpKSB7XG4gICAgICBjb25zdCBzY29yZSA9IHRoaXMuc2NvcmVSZWxldmFuY2UodGFyZ2V0VGV4dCwgdGV4dCk7XG4gICAgICBzY29yZXMucHVzaCh7IG5hbWUsIHNjb3JlIH0pO1xuICAgIH1cblxuICAgIC8vIFNvcnQgYnkgY29tYmluZWQgc2NvcmUgZGVzY2VuZGluZ1xuICAgIHNjb3Jlcy5zb3J0KChhLCBiKSA9PiBiLnNjb3JlLmNvbWJpbmVkU2NvcmUgLSBhLnNjb3JlLmNvbWJpbmVkU2NvcmUpO1xuXG4gICAgcmV0dXJuIHNjb3Jlcy5zbGljZSgwLCB0b3BLKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeHRyYWN0IGtleSB0ZXJtcyBmcm9tIHRleHQgYmFzZWQgb24gZW50cm9weSBjb250cmlidXRpb25cbiAgICpcbiAgICogVGVybXMgdGhhdCBjb250cmlidXRlIG1vc3QgdG8gZW50cm9weSBhcmUgbGlrZWx5IGltcG9ydGFudFxuICAgKi9cbiAgcHVibGljIGV4dHJhY3RLZXlUZXJtcyh0ZXh0OiBzdHJpbmcsIHRvcEs6IG51bWJlciA9IDEwKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IHRva2VucyA9IEFycmF5LmZyb20odGhpcy5jbGVhbkFuZFRva2VuaXplKHRleHQpKTtcblxuICAgIGlmICh0b2tlbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgLy8gQ2FsY3VsYXRlIHRva2VuIGZyZXF1ZW5jaWVzXG4gICAgY29uc3QgZnJlcXVlbmNpZXMgPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpO1xuICAgIGZvciAoY29uc3QgdG9rZW4gb2YgdG9rZW5zKSB7XG4gICAgICBmcmVxdWVuY2llcy5zZXQodG9rZW4sIChmcmVxdWVuY2llcy5nZXQodG9rZW4pIHx8IDApICsgMSk7XG4gICAgfVxuXG4gICAgLy8gQ2FsY3VsYXRlIGVudHJvcHkgY29udHJpYnV0aW9uIGZvciBlYWNoIHVuaXF1ZSB0b2tlblxuICAgIGNvbnN0IHRvdGFsVG9rZW5zID0gdG9rZW5zLmxlbmd0aDtcbiAgICBjb25zdCBjb250cmlidXRpb25zOiBBcnJheTx7IHRva2VuOiBzdHJpbmc7IGNvbnRyaWJ1dGlvbjogbnVtYmVyIH0+ID0gW107XG5cbiAgICBmb3IgKGNvbnN0IFt0b2tlbiwgY291bnRdIG9mIGZyZXF1ZW5jaWVzLmVudHJpZXMoKSkge1xuICAgICAgY29uc3QgcHJvYmFiaWxpdHkgPSBjb3VudCAvIHRvdGFsVG9rZW5zO1xuICAgICAgY29uc3QgY29udHJpYnV0aW9uID0gLXByb2JhYmlsaXR5ICogTWF0aC5sb2cyKHByb2JhYmlsaXR5KTtcbiAgICAgIGNvbnRyaWJ1dGlvbnMucHVzaCh7IHRva2VuLCBjb250cmlidXRpb24gfSk7XG4gICAgfVxuXG4gICAgLy8gU29ydCBieSBjb250cmlidXRpb24gZGVzY2VuZGluZ1xuICAgIGNvbnRyaWJ1dGlvbnMuc29ydCgoYSwgYikgPT4gYi5jb250cmlidXRpb24gLSBhLmNvbnRyaWJ1dGlvbik7XG5cbiAgICByZXR1cm4gY29udHJpYnV0aW9ucy5zbGljZSgwLCB0b3BLKS5tYXAoYyA9PiBjLnRva2VuKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgcmVzdWx0IHRvIGNhY2hlIHdpdGggTFJVIGV2aWN0aW9uXG4gICAqL1xuICBwcml2YXRlIGFkZFRvQ2FjaGUoa2V5OiBzdHJpbmcsIHJlc3VsdDogU2NvcmluZ1Jlc3VsdCk6IHZvaWQge1xuICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG5cbiAgICAvLyBDaGVjayBpZiB3ZSBuZWVkIHRvIGV2aWN0XG4gICAgaWYgKHRoaXMuY2FjaGUuc2l6ZSA+PSB0aGlzLmNvbmZpZy5tYXhDYWNoZVNpemUgJiYgIXRoaXMuY2FjaGUuaGFzKGtleSkpIHtcbiAgICAgIC8vIEZpbmQgbGVhc3QgcmVjZW50bHkgdXNlZCBlbnRyeVxuICAgICAgbGV0IGxydUtleTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gICAgICBsZXQgb2xkZXN0QWNjZXNzID0gbm93O1xuXG4gICAgICBmb3IgKGNvbnN0IFtrLCB2XSBvZiB0aGlzLmNhY2hlLmVudHJpZXMoKSkge1xuICAgICAgICBpZiAodi5sYXN0QWNjZXNzZWQgPCBvbGRlc3RBY2Nlc3MpIHtcbiAgICAgICAgICBvbGRlc3RBY2Nlc3MgPSB2Lmxhc3RBY2Nlc3NlZDtcbiAgICAgICAgICBscnVLZXkgPSBrO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChscnVLZXkpIHtcbiAgICAgICAgdGhpcy5jYWNoZS5kZWxldGUobHJ1S2V5KTtcbiAgICAgICAgY29uc3QgaWR4ID0gdGhpcy5jYWNoZUFjY2Vzc09yZGVyLmluZGV4T2YobHJ1S2V5KTtcbiAgICAgICAgaWYgKGlkeCA+IC0xKSB7XG4gICAgICAgICAgdGhpcy5jYWNoZUFjY2Vzc09yZGVyLnNwbGljZShpZHgsIDEpO1xuICAgICAgICB9XG4gICAgICAgIGxvZ2dlci5kZWJ1ZygnRXZpY3RlZCBMUlUgY2FjaGUgZW50cnknLCB7IGtleTogbHJ1S2V5LCBjYWNoZVNpemU6IHRoaXMuY2FjaGUuc2l6ZSB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBBZGQgbmV3IGVudHJ5XG4gICAgdGhpcy5jYWNoZS5zZXQoa2V5LCB7XG4gICAgICByZXN1bHQsXG4gICAgICB0aW1lc3RhbXA6IG5vdyxcbiAgICAgIGxhc3RBY2Nlc3NlZDogbm93XG4gICAgfSk7XG4gICAgdGhpcy51cGRhdGVBY2Nlc3NPcmRlcihrZXkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSBhY2Nlc3Mgb3JkZXIgZm9yIExSVSB0cmFja2luZ1xuICAgKi9cbiAgcHJpdmF0ZSB1cGRhdGVBY2Nlc3NPcmRlcihrZXk6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IGlkeCA9IHRoaXMuY2FjaGVBY2Nlc3NPcmRlci5pbmRleE9mKGtleSk7XG4gICAgaWYgKGlkeCA+IC0xKSB7XG4gICAgICB0aGlzLmNhY2hlQWNjZXNzT3JkZXIuc3BsaWNlKGlkeCwgMSk7XG4gICAgfVxuICAgIHRoaXMuY2FjaGVBY2Nlc3NPcmRlci5wdXNoKGtleSk7XG4gIH1cblxuICAvKipcbiAgICogQ2xlYW4gZXhwaXJlZCBjYWNoZSBlbnRyaWVzXG4gICAqL1xuICBwcml2YXRlIGNsZWFuRXhwaXJlZENhY2hlKCk6IHZvaWQge1xuICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gICAgbGV0IHJlbW92ZWQgPSAwO1xuXG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgdGhpcy5jYWNoZS5lbnRyaWVzKCkpIHtcbiAgICAgIGlmIChub3cgLSB2YWx1ZS50aW1lc3RhbXAgPiB0aGlzLmNvbmZpZy5jYWNoZUV4cGlyeSkge1xuICAgICAgICB0aGlzLmNhY2hlLmRlbGV0ZShrZXkpO1xuICAgICAgICBjb25zdCBpZHggPSB0aGlzLmNhY2hlQWNjZXNzT3JkZXIuaW5kZXhPZihrZXkpO1xuICAgICAgICBpZiAoaWR4ID4gLTEpIHtcbiAgICAgICAgICB0aGlzLmNhY2hlQWNjZXNzT3JkZXIuc3BsaWNlKGlkeCwgMSk7XG4gICAgICAgIH1cbiAgICAgICAgcmVtb3ZlZCsrO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChyZW1vdmVkID4gMCkge1xuICAgICAgbG9nZ2VyLmRlYnVnKCdDbGVhbmVkIGV4cGlyZWQgY2FjaGUgZW50cmllcycsIHsgcmVtb3ZlZCwgcmVtYWluaW5nOiB0aGlzLmNhY2hlLnNpemUgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENsZWFyIHRoZSBjYWNoZVxuICAgKi9cbiAgcHVibGljIGNsZWFyQ2FjaGUoKTogdm9pZCB7XG4gICAgdGhpcy5jYWNoZS5jbGVhcigpO1xuICAgIHRoaXMuY2FjaGVBY2Nlc3NPcmRlciA9IFtdO1xuICAgIGxvZ2dlci5kZWJ1ZygnTkxQIHNjb3JpbmcgY2FjaGUgY2xlYXJlZCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBjYWNoZSBzdGF0aXN0aWNzXG4gICAqL1xuICBwdWJsaWMgZ2V0Q2FjaGVTdGF0cygpOiB7IHNpemU6IG51bWJlcjsgb2xkZXN0RW50cnk6IG51bWJlciB8IG51bGwgfSB7XG4gICAgbGV0IG9sZGVzdDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG5cbiAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIHRoaXMuY2FjaGUudmFsdWVzKCkpIHtcbiAgICAgIGlmIChvbGRlc3QgPT09IG51bGwgfHwgZW50cnkudGltZXN0YW1wIDwgb2xkZXN0KSB7XG4gICAgICAgIG9sZGVzdCA9IGVudHJ5LnRpbWVzdGFtcDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgc2l6ZTogdGhpcy5jYWNoZS5zaXplLFxuICAgICAgb2xkZXN0RW50cnk6IG9sZGVzdFxuICAgIH07XG4gIH1cblxuICBwdWJsaWMgZGlzcG9zZSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5jbGVhbnVwSW50ZXJ2YWwpIHtcbiAgICAgIGNsZWFySW50ZXJ2YWwodGhpcy5jbGVhbnVwSW50ZXJ2YWwpO1xuICAgICAgdGhpcy5jbGVhbnVwSW50ZXJ2YWwgPSB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG59XG4iXX0=
|
|
357
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTkxQU2NvcmluZ01hbmFnZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcG9ydGZvbGlvL05MUFNjb3JpbmdNYW5hZ2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7OztHQWNHO0FBRUgsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQzVDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDRDQUE0QyxDQUFDO0FBQzlFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBMkM3RCxNQUFNLE9BQU8saUJBQWlCO0lBQ3BCLEtBQUssQ0FBa0Y7SUFDdkYsZ0JBQWdCLENBQVcsQ0FBRSw2QkFBNkI7SUFDMUQsTUFBTSxDQUFnQjtJQUN0QixnQkFBZ0IsQ0FBbUI7SUFDbkMsZUFBZSxDQUFrQjtJQUV6QyxZQUNFLE1BQStCLEVBQy9CLHFCQUF5QyxJQUFJLGtCQUFrQixFQUFFO1FBRWpFLGtDQUFrQztRQUNsQyxNQUFNLFdBQVcsR0FBRyxrQkFBa0IsQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUVuRCxJQUFJLENBQUMsTUFBTSxHQUFHO1lBQ1osY0FBYyxFQUFFLFdBQVcsQ0FBQyxHQUFHLENBQUMsY0FBYztZQUM5QyxXQUFXLEVBQUUsV0FBVyxDQUFDLEdBQUcsQ0FBQyxrQkFBa0IsR0FBRyxFQUFFLEdBQUcsSUFBSTtZQUMzRCxZQUFZLEVBQUUsV0FBVyxDQUFDLE1BQU0sQ0FBQyxZQUFZO1lBQzdDLFlBQVksRUFBRSxXQUFXLENBQUMsR0FBRyxDQUFDLFlBQVk7WUFDMUMsaUJBQWlCLEVBQUUsV0FBVyxDQUFDLEdBQUcsQ0FBQyxpQkFBaUI7WUFDcEQsR0FBRyxNQUFNO1NBQ1YsQ0FBQztRQUVGLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQztRQUN2QixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsRUFBRSxDQUFDO1FBQzNCLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLGdCQUFnQixFQUFFLENBQUM7UUFFL0Msc0NBQXNDO1FBQ3RDLElBQUksQ0FBQyxlQUFlLEdBQUcsV0FBVyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsZUFBZTtRQUUxRixJQUFJLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLLEtBQUssVUFBVSxFQUFFLENBQUM7WUFDckQsSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUMvQixDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7T0FHRztJQUNLLGdCQUFnQixDQUFDLElBQVk7UUFDbkMsaUNBQWlDO1FBQ2pDLE1BQU0sVUFBVSxHQUFHLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNwRCxJQUFJLFVBQVUsQ0FBQyxjQUFjLElBQUksVUFBVSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDdEUsTUFBTSxDQUFDLElBQUksQ0FBQyw0QkFBNEIsRUFBRSxFQUFFLE1BQU0sRUFBRSxVQUFVLENBQUMsY0FBYyxFQUFFLENBQUMsQ0FBQztRQUNuRixDQUFDO1FBQ0QsSUFBSSxHQUFHLFVBQVUsQ0FBQyxpQkFBaUIsQ0FBQztRQUVwQyxvREFBb0Q7UUFDcEQsMERBQTBEO1FBQzFELE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxXQUFXLEVBQUU7YUFDOUIsVUFBVSxDQUFDLHFCQUFxQixFQUFFLEdBQUcsQ0FBQyxDQUFFLDJEQUEyRDthQUNuRyxLQUFLLENBQUMsS0FBSyxDQUFDO2FBQ1osTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBRS9ELE9BQU8sSUFBSSxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDekIsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLGdCQUFnQixDQUFDLEtBQWEsRUFBRSxLQUFhO1FBQ2xELE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM3QyxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFN0MsSUFBSSxPQUFPLENBQUMsSUFBSSxLQUFLLENBQUMsSUFBSSxPQUFPLENBQUMsSUFBSSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQzdDLE9BQU8sR0FBRyxDQUFDLENBQUMseUJBQXlCO1FBQ3ZDLENBQUM7UUFFRCxJQUFJLE9BQU8sQ0FBQyxJQUFJLEtBQUssQ0FBQyxJQUFJLE9BQU8sQ0FBQyxJQUFJLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDN0MsT0FBTyxHQUFHLENBQUMsQ0FBQyw0QkFBNEI7UUFDMUMsQ0FBQztRQUVELHlCQUF5QjtRQUN6QixNQUFNLFlBQVksR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLEdBQUcsT0FBTyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFL0Usa0JBQWtCO1FBQ2xCLE1BQU0sS0FBSyxHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsR0FBRyxPQUFPLEVBQUUsR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDO1FBRWhELE9BQU8sWUFBWSxDQUFDLElBQUksR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDO0lBQ3hDLENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0ksZ0JBQWdCLENBQUMsSUFBWTtRQUNsQyxNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBRXZELElBQUksTUFBTSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUN4QixPQUFPLENBQUMsQ0FBQztRQUNYLENBQUM7UUFFRCw4QkFBOEI7UUFDOUIsTUFBTSxXQUFXLEdBQUcsSUFBSSxHQUFHLEVBQWtCLENBQUM7UUFDOUMsS0FBSyxNQUFNLEtBQUssSUFBSSxNQUFNLEVBQUUsQ0FBQztZQUMzQixXQUFXLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDNUQsQ0FBQztRQUVELHNDQUFzQztRQUN0QyxJQUFJLE9BQU8sR0FBRyxDQUFDLENBQUM7UUFDaEIsTUFBTSxXQUFXLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQztRQUVsQyxLQUFLLE1BQU0sS0FBSyxJQUFJLFdBQVcsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDO1lBQ3pDLE1BQU0sV0FBVyxHQUFHLEtBQUssR0FBRyxXQUFXLENBQUM7WUFDeEMsSUFBSSxXQUFXLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQ3BCLE9BQU8sSUFBSSxXQUFXLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUNsRCxDQUFDO1FBQ0gsQ0FBQztRQUVELE9BQU8sT0FBTyxDQUFDO0lBQ2pCLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ksY0FBYyxDQUFDLEtBQWEsRUFBRSxLQUFhO1FBQ2hELG9CQUFvQjtRQUNwQixNQUFNLFFBQVEsR0FBRyxHQUFHLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxNQUFNLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUM7UUFDekUsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7UUFFeEMsSUFBSSxNQUFNLElBQUksSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLE1BQU0sQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUN0RSw4QkFBOEI7WUFDOUIsTUFBTSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7WUFDakMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ2pDLE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQztRQUN2QixDQUFDO1FBRUQsb0JBQW9CO1FBQ3BCLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDcEQsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzlDLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM5QyxNQUFNLFVBQVUsR0FBRyxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUM7UUFFN0Msd0NBQXdDO1FBQ3hDLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM3QyxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDN0MsTUFBTSxZQUFZLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRS9FLDRCQUE0QjtRQUM1QixJQUFJLGFBQXFCLENBQUM7UUFDMUIsSUFBSSxjQUFzQixDQUFDO1FBRTNCLHVFQUF1RTtRQUN2RSxJQUFJLE9BQU8sSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLGlCQUFpQixDQUFDLElBQUk7WUFDN0MsVUFBVSxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQy9DLHVDQUF1QztZQUN2QyxNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLFVBQVUsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLGtDQUFrQztZQUNsRyxhQUFhLEdBQUcsR0FBRyxHQUFHLENBQUMsT0FBTyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxjQUFjLEdBQUcsR0FBRyxDQUFDO1lBRW5FLElBQUksVUFBVSxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLFFBQVEsRUFBRSxDQUFDO2dCQUNwRCxjQUFjLEdBQUcsOERBQThELENBQUM7WUFDbEYsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLGNBQWMsR0FBRyxrREFBa0QsQ0FBQztZQUN0RSxDQUFDO1FBQ0gsQ0FBQztRQUNELDBEQUEwRDthQUNyRCxJQUFJLE9BQU8sSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLGlCQUFpQixDQUFDLElBQUk7WUFDN0MsVUFBVSxHQUFHLEdBQUcsRUFBRSxDQUFDO1lBQzFCLGFBQWEsR0FBRyxHQUFHLEdBQUcsT0FBTyxHQUFHLEdBQUcsQ0FBQyxDQUFDLG1CQUFtQjtZQUN4RCxjQUFjLEdBQUcsOENBQThDLENBQUM7UUFDbEUsQ0FBQztRQUNELHFEQUFxRDthQUNoRCxJQUFJLE9BQU8sSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLGlCQUFpQixDQUFDLFFBQVE7WUFDakQsVUFBVSxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQ3BELGFBQWEsR0FBRyxHQUFHLEdBQUcsT0FBTyxHQUFHLEdBQUcsR0FBRyxDQUFDLFVBQVUsR0FBRyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUM7WUFDOUQsY0FBYyxHQUFHLHdEQUF3RCxDQUFDO1FBQzVFLENBQUM7UUFDRCxvREFBb0Q7YUFDL0MsSUFBSSxPQUFPLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHO1lBQzNDLElBQUksQ0FBQyxHQUFHLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDO1lBQzdDLGFBQWEsR0FBRyxPQUFPLEdBQUcsR0FBRyxDQUFDO1lBQzlCLGNBQWMsR0FBRywyQ0FBMkMsQ0FBQztRQUMvRCxDQUFDO1FBQ0QsOENBQThDO2FBQ3pDLENBQUM7WUFDSixhQUFhLEdBQUcsT0FBTyxHQUFHLEdBQUcsQ0FBQztZQUM5QixjQUFjLEdBQUcsaURBQWlELENBQUM7UUFDckUsQ0FBQztRQUVELGtDQUFrQztRQUNsQyxhQUFhLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsYUFBYSxDQUFDLENBQUMsQ0FBQztRQUV4RCxNQUFNLE1BQU0sR0FBa0I7WUFDNUIsT0FBTztZQUNQLE9BQU8sRUFBRSxVQUFVO1lBQ25CLGFBQWE7WUFDYixjQUFjO1lBQ2QsVUFBVSxFQUFFLE9BQU8sQ0FBQyxJQUFJLEdBQUcsT0FBTyxDQUFDLElBQUk7WUFDdkMsWUFBWSxFQUFFLFlBQVksQ0FBQyxJQUFJO1NBQ2hDLENBQUM7UUFFRix1Q0FBdUM7UUFDdkMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFFbEMsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztJQUVEOzs7O09BSUc7SUFDSSxxQkFBcUIsQ0FDMUIsUUFBNkI7UUFFN0IsTUFBTSxNQUFNLEdBQUcsSUFBSSxHQUFHLEVBQXNDLENBQUM7UUFDN0QsTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUV6QyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQ3JDLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNyQixNQUFNLEtBQUssR0FBRyxRQUFRLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBRSxDQUFDO1lBRWxDLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7Z0JBQ3RCLE1BQU0sQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLElBQUksR0FBRyxFQUFFLENBQUMsQ0FBQztZQUM5QixDQUFDO1lBRUQsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7Z0JBQ3pDLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDckIsTUFBTSxLQUFLLEdBQUcsUUFBUSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUUsQ0FBQztnQkFFbEMsdUJBQXVCO2dCQUN2QixNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQztnQkFFckQsd0JBQXdCO2dCQUN4QixNQUFNLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBRSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsVUFBVSxDQUFDLENBQUM7Z0JBRXhDLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7b0JBQ3RCLE1BQU0sQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLElBQUksR0FBRyxFQUFFLENBQUMsQ0FBQztnQkFDOUIsQ0FBQztnQkFDRCxNQUFNLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBRSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsVUFBVSxDQUFDLENBQUM7WUFDMUMsQ0FBQztRQUNILENBQUM7UUFFRCxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBRUQ7O09BRUc7SUFDSSxXQUFXLENBQ2hCLFVBQWtCLEVBQ2xCLFVBQStCLEVBQy9CLE9BQWUsQ0FBQztRQUVoQixNQUFNLE1BQU0sR0FBa0QsRUFBRSxDQUFDO1FBRWpFLEtBQUssTUFBTSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSSxVQUFVLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQztZQUNoRCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUNwRCxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7UUFDL0IsQ0FBQztRQUVELG9DQUFvQztRQUNwQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxhQUFhLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUVyRSxPQUFPLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQy9CLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ksZUFBZSxDQUFDLElBQVksRUFBRSxPQUFlLEVBQUU7UUFDcEQsTUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUV2RCxJQUFJLE1BQU0sQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDeEIsT0FBTyxFQUFFLENBQUM7UUFDWixDQUFDO1FBRUQsOEJBQThCO1FBQzlCLE1BQU0sV0FBVyxHQUFHLElBQUksR0FBRyxFQUFrQixDQUFDO1FBQzlDLEtBQUssTUFBTSxLQUFLLElBQUksTUFBTSxFQUFFLENBQUM7WUFDM0IsV0FBVyxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQzVELENBQUM7UUFFRCx1REFBdUQ7UUFDdkQsTUFBTSxXQUFXLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQztRQUNsQyxNQUFNLGFBQWEsR0FBbUQsRUFBRSxDQUFDO1FBRXpFLEtBQUssTUFBTSxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsSUFBSSxXQUFXLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQztZQUNuRCxNQUFNLFdBQVcsR0FBRyxLQUFLLEdBQUcsV0FBVyxDQUFDO1lBQ3hDLE1BQU0sWUFBWSxHQUFHLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDM0QsYUFBYSxDQUFDLElBQUksQ0FBQyxFQUFFLEtBQUssRUFBRSxZQUFZLEVBQUUsQ0FBQyxDQUFDO1FBQzlDLENBQUM7UUFFRCxrQ0FBa0M7UUFDbEMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxZQUFZLEdBQUcsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBRTlELE9BQU8sYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3hELENBQUM7SUFFRDs7T0FFRztJQUNLLFVBQVUsQ0FBQyxHQUFXLEVBQUUsTUFBcUI7UUFDbkQsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBRXZCLDRCQUE0QjtRQUM1QixJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsWUFBWSxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUN4RSxpQ0FBaUM7WUFDakMsSUFBSSxNQUFNLEdBQWtCLElBQUksQ0FBQztZQUNqQyxJQUFJLFlBQVksR0FBRyxHQUFHLENBQUM7WUFFdkIsS0FBSyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQztnQkFDMUMsSUFBSSxDQUFDLENBQUMsWUFBWSxHQUFHLFlBQVksRUFBRSxDQUFDO29CQUNsQyxZQUFZLEdBQUcsQ0FBQyxDQUFDLFlBQVksQ0FBQztvQkFDOUIsTUFBTSxHQUFHLENBQUMsQ0FBQztnQkFDYixDQUFDO1lBQ0gsQ0FBQztZQUVELElBQUksTUFBTSxFQUFFLENBQUM7Z0JBQ1gsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBQzFCLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBQ2xELElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUM7b0JBQ2IsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUM7Z0JBQ3ZDLENBQUM7Z0JBQ0QsTUFBTSxDQUFDLEtBQUssQ0FBQyx5QkFBeUIsRUFBRSxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztZQUN2RixDQUFDO1FBQ0gsQ0FBQztRQUVELGdCQUFnQjtRQUNoQixJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUU7WUFDbEIsTUFBTTtZQUNOLFNBQVMsRUFBRSxHQUFHO1lBQ2QsWUFBWSxFQUFFLEdBQUc7U0FDbEIsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzlCLENBQUM7SUFFRDs7T0FFRztJQUNLLGlCQUFpQixDQUFDLEdBQVc7UUFDbkMsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUMvQyxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ2IsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDdkMsQ0FBQztRQUNELElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDbEMsQ0FBQztJQUVEOztPQUVHO0lBQ0ssaUJBQWlCO1FBQ3ZCLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUN2QixJQUFJLE9BQU8sR0FBRyxDQUFDLENBQUM7UUFFaEIsS0FBSyxNQUFNLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQztZQUNoRCxJQUFJLEdBQUcsR0FBRyxLQUFLLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxFQUFFLENBQUM7Z0JBQ3BELElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUN2QixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUMvQyxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDO29CQUNiLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDO2dCQUN2QyxDQUFDO2dCQUNELE9BQU8sRUFBRSxDQUFDO1lBQ1osQ0FBQztRQUNILENBQUM7UUFFRCxJQUFJLE9BQU8sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUNoQixNQUFNLENBQUMsS0FBSyxDQUFDLCtCQUErQixFQUFFLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7UUFDekYsQ0FBQztJQUNILENBQUM7SUFFRDs7T0FFRztJQUNJLFVBQVU7UUFDZixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQztRQUNoQyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ25CLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxFQUFFLENBQUM7UUFDM0IsSUFBSSxPQUFPLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDaEIsTUFBTSxDQUFDLEtBQUssQ0FBQywyQkFBMkIsRUFBRSxFQUFFLGNBQWMsRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDO1FBQ3pFLENBQUM7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDSSxhQUFhO1FBQ2xCLElBQUksTUFBTSxHQUFrQixJQUFJLENBQUM7UUFFakMsS0FBSyxNQUFNLEtBQUssSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUM7WUFDeEMsSUFBSSxNQUFNLEtBQUssSUFBSSxJQUFJLEtBQUssQ0FBQyxTQUFTLEdBQUcsTUFBTSxFQUFFLENBQUM7Z0JBQ2hELE1BQU0sR0FBRyxLQUFLLENBQUMsU0FBUyxDQUFDO1lBQzNCLENBQUM7UUFDSCxDQUFDO1FBRUQsT0FBTztZQUNMLElBQUksRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUk7WUFDckIsV0FBVyxFQUFFLE1BQU07U0FDcEIsQ0FBQztJQUNKLENBQUM7SUFFTSxPQUFPO1FBQ1osSUFBSSxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7WUFDekIsYUFBYSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQztZQUNwQyxJQUFJLENBQUMsZUFBZSxHQUFHLFNBQVMsQ0FBQztRQUNuQyxDQUFDO0lBQ0gsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBOTFAgU2NvcmluZyBNYW5hZ2VyIC0gSmFjY2FyZCBzaW1pbGFyaXR5IGFuZCBTaGFubm9uIGVudHJvcHkgZm9yIHNlbWFudGljIGFuYWx5c2lzXG4gKlxuICogSW1wbGVtZW50cyBpbnRlbGxpZ2VudCBkb2N1bWVudCBzaW1pbGFyaXR5IHNjb3JpbmcgdXNpbmc6XG4gKiAtIEphY2NhcmQgc2ltaWxhcml0eSBmb3Igdm9jYWJ1bGFyeSBvdmVybGFwXG4gKiAtIFNoYW5ub24gZW50cm9weSBmb3IgaW5mb3JtYXRpb24gZGVuc2l0eVxuICogLSBDb21iaW5lZCBzY29yaW5nIGZvciBtZWFuaW5nZnVsIHNlbWFudGljIHJlbGF0aW9uc2hpcHNcbiAqXG4gKiBLZXkgaW5zaWdodHMgZnJvbSBhbmFseXNpczpcbiAqIC0gSGlnaCBKYWNjYXJkICg+NjAlKSArIE1vZGVyYXRlIGVudHJvcHkgKDQuNS02LjApID0gU2FtZSB0ZWNobmljYWwgZG9tYWluXG4gKiAtIEhpZ2ggSmFjY2FyZCArIExvdyBlbnRyb3B5ICg8My4wKSA9IFN0b3Agd29yZCBwb2xsdXRpb24sIHN1cGVyZmljaWFsXG4gKiAtIExvdyBKYWNjYXJkICsgU2ltaWxhciBlbnRyb3B5ID0gRGlmZmVyZW50IGRvbWFpbnMsIGVxdWFsbHkgY29tcGxleFxuICpcbiAqIFBhcnQgb2YgRW5oYW5jZWQgQ2FwYWJpbGl0eSBJbmRleCAoIzEwODUpXG4gKi9cblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vdXRpbHMvbG9nZ2VyLmpzJztcbmltcG9ydCB7IFVuaWNvZGVWYWxpZGF0b3IgfSBmcm9tICcuLi9zZWN1cml0eS92YWxpZGF0b3JzL3VuaWNvZGVWYWxpZGF0b3IuanMnO1xuaW1wb3J0IHsgSW5kZXhDb25maWdNYW5hZ2VyIH0gZnJvbSAnLi9jb25maWcvSW5kZXhDb25maWcuanMnO1xuXG4vKipcbiAqIFNjb3JpbmcgcmVzdWx0IHdpdGggZGV0YWlsZWQgbWV0cmljc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFNjb3JpbmdSZXN1bHQge1xuICBqYWNjYXJkOiBudW1iZXI7ICAgICAgICAgICAvLyAwLjAgdG8gMS4wXG4gIGVudHJvcHk6IG51bWJlcjsgICAgICAgICAgIC8vIFR5cGljYWxseSAwIHRvIDggYml0cyBmb3IgdGV4dFxuICBjb21iaW5lZFNjb3JlOiBudW1iZXI7ICAgICAvLyAwLjAgdG8gMS4wXG4gIGludGVycHJldGF0aW9uOiBzdHJpbmc7ICAgIC8vIEh1bWFuLXJlYWRhYmxlIGV4cGxhbmF0aW9uXG4gIHRva2VuQ291bnQ6IG51bWJlcjsgICAgICAgIC8vIE51bWJlciBvZiB1bmlxdWUgdG9rZW5zXG4gIG92ZXJsYXBDb3VudDogbnVtYmVyOyAgICAgIC8vIE51bWJlciBvZiBvdmVybGFwcGluZyB0b2tlbnNcbn1cblxuLyoqXG4gKiBQYWlyd2lzZSBzaW1pbGFyaXR5IGJldHdlZW4gdHdvIGVsZW1lbnRzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGFpcndpc2VTaW1pbGFyaXR5IHtcbiAgZWxlbWVudDE6IHN0cmluZztcbiAgZWxlbWVudDI6IHN0cmluZztcbiAgc2ltaWxhcml0eTogU2NvcmluZ1Jlc3VsdDtcbiAgdGltZXN0YW1wOiBzdHJpbmc7XG59XG5cbi8qKlxuICogQ29uZmlndXJhdGlvbiBmb3Igc2NvcmluZyBhbGdvcml0aG1cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTY29yaW5nQ29uZmlnIHtcbiAgbWluVG9rZW5MZW5ndGg6IG51bWJlcjtcbiAgY2FjaGVFeHBpcnk6IG51bWJlcjtcbiAgbWF4Q2FjaGVTaXplOiBudW1iZXI7ICAvLyBNYXhpbXVtIGNhY2hlIGVudHJpZXMgZm9yIExSVSBldmljdGlvbiAgICAgIC8vIG1pbGxpc2Vjb25kc1xuICBlbnRyb3B5QmFuZHM6IHtcbiAgICBsb3c6IG51bWJlcjsgICAgICAgICAgIC8vIDwgMy4wIHR5cGljYWxseSAoaGlnaCByZXBldGl0aW9uL2NvbW1vbiB3b3JkcylcbiAgICBtb2RlcmF0ZTogbnVtYmVyOyAgICAgIC8vIDMuMCAtIDYuMCB0eXBpY2FsbHkgKGJhbGFuY2VkIHZvY2FidWxhcnkpXG4gICAgaGlnaDogbnVtYmVyOyAgICAgICAgICAvLyA+IDYuMCB0eXBpY2FsbHkgKGRpdmVyc2Ugc3BlY2lhbGl6ZWQgdGVybXMpXG4gIH07XG4gIGphY2NhcmRUaHJlc2hvbGRzOiB7XG4gICAgbG93OiBudW1iZXI7ICAgICAgICAgICAvLyA8IDAuMlxuICAgIG1vZGVyYXRlOiBudW1iZXI7ICAgICAgLy8gMC4yIC0gMC42XG4gICAgaGlnaDogbnVtYmVyOyAgICAgICAgICAvLyA+IDAuNlxuICB9O1xufVxuXG5leHBvcnQgY2xhc3MgTkxQU2NvcmluZ01hbmFnZXIge1xuICBwcml2YXRlIGNhY2hlOiBNYXA8c3RyaW5nLCB7IHJlc3VsdDogU2NvcmluZ1Jlc3VsdDsgdGltZXN0YW1wOiBudW1iZXI7IGxhc3RBY2Nlc3NlZDogbnVtYmVyIH0+O1xuICBwcml2YXRlIGNhY2hlQWNjZXNzT3JkZXI6IHN0cmluZ1tdOyAgLy8gVHJhY2sgYWNjZXNzIG9yZGVyIGZvciBMUlVcbiAgcHJpdmF0ZSBjb25maWc6IFNjb3JpbmdDb25maWc7XG4gIHByaXZhdGUgdW5pY29kZVZhbGlkYXRvcjogVW5pY29kZVZhbGlkYXRvcjtcbiAgcHJpdmF0ZSBjbGVhbnVwSW50ZXJ2YWw/OiBOb2RlSlMuVGltZW91dDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBjb25maWc/OiBQYXJ0aWFsPFNjb3JpbmdDb25maWc+LFxuICAgIGluZGV4Q29uZmlnTWFuYWdlcjogSW5kZXhDb25maWdNYW5hZ2VyID0gbmV3IEluZGV4Q29uZmlnTWFuYWdlcigpXG4gICkge1xuICAgIC8vIEdldCBjb25maWcgZnJvbSBjZW50cmFsIG1hbmFnZXJcbiAgICBjb25zdCBpbmRleENvbmZpZyA9IGluZGV4Q29uZmlnTWFuYWdlci5nZXRDb25maWcoKTtcblxuICAgIHRoaXMuY29uZmlnID0ge1xuICAgICAgbWluVG9rZW5MZW5ndGg6IGluZGV4Q29uZmlnLm5scC5taW5Ub2tlbkxlbmd0aCxcbiAgICAgIGNhY2hlRXhwaXJ5OiBpbmRleENvbmZpZy5ubHAuY2FjaGVFeHBpcnlNaW51dGVzICogNjAgKiAxMDAwLFxuICAgICAgbWF4Q2FjaGVTaXplOiBpbmRleENvbmZpZy5tZW1vcnkubWF4Q2FjaGVTaXplLFxuICAgICAgZW50cm9weUJhbmRzOiBpbmRleENvbmZpZy5ubHAuZW50cm9weUJhbmRzLFxuICAgICAgamFjY2FyZFRocmVzaG9sZHM6IGluZGV4Q29uZmlnLm5scC5qYWNjYXJkVGhyZXNob2xkcyxcbiAgICAgIC4uLmNvbmZpZ1xuICAgIH07XG5cbiAgICB0aGlzLmNhY2hlID0gbmV3IE1hcCgpO1xuICAgIHRoaXMuY2FjaGVBY2Nlc3NPcmRlciA9IFtdO1xuICAgIHRoaXMudW5pY29kZVZhbGlkYXRvciA9IG5ldyBVbmljb2RlVmFsaWRhdG9yKCk7XG5cbiAgICAvLyBQZXJpb2RpYyBjbGVhbnVwIG9mIGV4cGlyZWQgZW50cmllc1xuICAgIHRoaXMuY2xlYW51cEludGVydmFsID0gc2V0SW50ZXJ2YWwoKCkgPT4gdGhpcy5jbGVhbkV4cGlyZWRDYWNoZSgpLCA2MDAwMCk7IC8vIEV2ZXJ5IG1pbnV0ZVxuXG4gICAgaWYgKHR5cGVvZiB0aGlzLmNsZWFudXBJbnRlcnZhbC51bnJlZiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhpcy5jbGVhbnVwSW50ZXJ2YWwudW5yZWYoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2xlYW4gYW5kIHRva2VuaXplIHRleHQgZm9yIGFuYWx5c2lzXG4gICAqIFdvcmtzIHdpdGggYW55IGxhbmd1YWdlIC0gbm8gaGFyZGNvZGVkIHN0b3Agd29yZHNcbiAgICovXG4gIHByaXZhdGUgY2xlYW5BbmRUb2tlbml6ZSh0ZXh0OiBzdHJpbmcpOiBTZXQ8c3RyaW5nPiB7XG4gICAgLy8gTm9ybWFsaXplIFVuaWNvZGUgZm9yIHNlY3VyaXR5XG4gICAgY29uc3QgdmFsaWRhdGlvbiA9IFVuaWNvZGVWYWxpZGF0b3Iubm9ybWFsaXplKHRleHQpO1xuICAgIGlmICh2YWxpZGF0aW9uLmRldGVjdGVkSXNzdWVzICYmIHZhbGlkYXRpb24uZGV0ZWN0ZWRJc3N1ZXMubGVuZ3RoID4gMCkge1xuICAgICAgbG9nZ2VyLndhcm4oJ1VuaWNvZGUgaXNzdWVzIGluIE5MUCB0ZXh0JywgeyBpc3N1ZXM6IHZhbGlkYXRpb24uZGV0ZWN0ZWRJc3N1ZXMgfSk7XG4gICAgfVxuICAgIHRleHQgPSB2YWxpZGF0aW9uLm5vcm1hbGl6ZWRDb250ZW50O1xuXG4gICAgLy8gQ29udmVydCB0byBsb3dlcmNhc2UgYW5kIHNwbGl0IG9uIHdvcmQgYm91bmRhcmllc1xuICAgIC8vIEtlZXAgVW5pY29kZSBsZXR0ZXIgY2hhcmFjdGVycyBmb3IgbXVsdGlsaW5ndWFsIHN1cHBvcnRcbiAgICBjb25zdCB0b2tlbnMgPSB0ZXh0LnRvTG93ZXJDYXNlKClcbiAgICAgIC5yZXBsYWNlQWxsKC9bXlxccHtMfVxccHtOfVxcc18tXS9ndSwgJyAnKSAgLy8gVW5pY29kZS1hd2FyZToga2VlcCBsZXR0ZXJzLCBudW1iZXJzLCB1bmRlcnNjb3JlLCBoeXBoZW5cbiAgICAgIC5zcGxpdCgvXFxzKy8pXG4gICAgICAuZmlsdGVyKHRva2VuID0+IHRva2VuLmxlbmd0aCA+PSB0aGlzLmNvbmZpZy5taW5Ub2tlbkxlbmd0aCk7XG5cbiAgICByZXR1cm4gbmV3IFNldCh0b2tlbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGN1bGF0ZSBKYWNjYXJkIHNpbWlsYXJpdHkgYmV0d2VlbiB0d28gdGV4dCBzdHJpbmdzXG4gICAqXG4gICAqIEphY2NhcmQgPSB8QSDiiKkgQnwgLyB8QSDiiKogQnxcbiAgICpcbiAgICogUmV0dXJucyB2YWx1ZSBiZXR3ZWVuIDAgKG5vIG92ZXJsYXApIGFuZCAxIChpZGVudGljYWwpXG4gICAqL1xuICBwdWJsaWMgY2FsY3VsYXRlSmFjY2FyZCh0ZXh0MTogc3RyaW5nLCB0ZXh0Mjogc3RyaW5nKTogbnVtYmVyIHtcbiAgICBjb25zdCB0b2tlbnMxID0gdGhpcy5jbGVhbkFuZFRva2VuaXplKHRleHQxKTtcbiAgICBjb25zdCB0b2tlbnMyID0gdGhpcy5jbGVhbkFuZFRva2VuaXplKHRleHQyKTtcblxuICAgIGlmICh0b2tlbnMxLnNpemUgPT09IDAgJiYgdG9rZW5zMi5zaXplID09PSAwKSB7XG4gICAgICByZXR1cm4gMS4wOyAvLyBCb3RoIGVtcHR5ID0gaWRlbnRpY2FsXG4gICAgfVxuXG4gICAgaWYgKHRva2VuczEuc2l6ZSA9PT0gMCB8fCB0b2tlbnMyLnNpemUgPT09IDApIHtcbiAgICAgIHJldHVybiAwLjA7IC8vIE9uZSBlbXB0eSA9IG5vIHNpbWlsYXJpdHlcbiAgICB9XG5cbiAgICAvLyBDYWxjdWxhdGUgaW50ZXJzZWN0aW9uXG4gICAgY29uc3QgaW50ZXJzZWN0aW9uID0gbmV3IFNldChbLi4udG9rZW5zMV0uZmlsdGVyKHRva2VuID0+IHRva2VuczIuaGFzKHRva2VuKSkpO1xuXG4gICAgLy8gQ2FsY3VsYXRlIHVuaW9uXG4gICAgY29uc3QgdW5pb24gPSBuZXcgU2V0KFsuLi50b2tlbnMxLCAuLi50b2tlbnMyXSk7XG5cbiAgICByZXR1cm4gaW50ZXJzZWN0aW9uLnNpemUgLyB1bmlvbi5zaXplO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGN1bGF0ZSBTaGFubm9uIGVudHJvcHkgZm9yIHRleHRcbiAgICpcbiAgICogSChYKSA9IC3OoyBwKHgpICogbG9nMihwKHgpKVxuICAgKlxuICAgKiBNZWFzdXJlcyBpbmZvcm1hdGlvbiBkZW5zaXR5L3ZvY2FidWxhcnkgcmljaG5lc3NcbiAgICogSGlnaGVyIGVudHJvcHkgPSBtb3JlIGRpdmVyc2Ugdm9jYWJ1bGFyeVxuICAgKi9cbiAgcHVibGljIGNhbGN1bGF0ZUVudHJvcHkodGV4dDogc3RyaW5nKTogbnVtYmVyIHtcbiAgICBjb25zdCB0b2tlbnMgPSBBcnJheS5mcm9tKHRoaXMuY2xlYW5BbmRUb2tlbml6ZSh0ZXh0KSk7XG5cbiAgICBpZiAodG9rZW5zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIDA7XG4gICAgfVxuXG4gICAgLy8gQ2FsY3VsYXRlIHRva2VuIGZyZXF1ZW5jaWVzXG4gICAgY29uc3QgZnJlcXVlbmNpZXMgPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpO1xuICAgIGZvciAoY29uc3QgdG9rZW4gb2YgdG9rZW5zKSB7XG4gICAgICBmcmVxdWVuY2llcy5zZXQodG9rZW4sIChmcmVxdWVuY2llcy5nZXQodG9rZW4pIHx8IDApICsgMSk7XG4gICAgfVxuXG4gICAgLy8gQ2FsY3VsYXRlIHByb2JhYmlsaXRpZXMgYW5kIGVudHJvcHlcbiAgICBsZXQgZW50cm9weSA9IDA7XG4gICAgY29uc3QgdG90YWxUb2tlbnMgPSB0b2tlbnMubGVuZ3RoO1xuXG4gICAgZm9yIChjb25zdCBjb3VudCBvZiBmcmVxdWVuY2llcy52YWx1ZXMoKSkge1xuICAgICAgY29uc3QgcHJvYmFiaWxpdHkgPSBjb3VudCAvIHRvdGFsVG9rZW5zO1xuICAgICAgaWYgKHByb2JhYmlsaXR5ID4gMCkge1xuICAgICAgICBlbnRyb3B5IC09IHByb2JhYmlsaXR5ICogTWF0aC5sb2cyKHByb2JhYmlsaXR5KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZW50cm9weTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxjdWxhdGUgY29tYmluZWQgcmVsZXZhbmNlIHNjb3JlIHVzaW5nIEphY2NhcmQgYW5kIGVudHJvcHlcbiAgICpcbiAgICogSW50ZXJwcmV0cyB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gc2ltaWxhcml0eSBhbmQgY29tcGxleGl0eVxuICAgKi9cbiAgcHVibGljIHNjb3JlUmVsZXZhbmNlKHRleHQxOiBzdHJpbmcsIHRleHQyOiBzdHJpbmcpOiBTY29yaW5nUmVzdWx0IHtcbiAgICAvLyBDaGVjayBjYWNoZSBmaXJzdFxuICAgIGNvbnN0IGNhY2hlS2V5ID0gYCR7dGV4dDEuc3Vic3RyaW5nKDAsIDUwKX06Ojoke3RleHQyLnN1YnN0cmluZygwLCA1MCl9YDtcbiAgICBjb25zdCBjYWNoZWQgPSB0aGlzLmNhY2hlLmdldChjYWNoZUtleSk7XG5cbiAgICBpZiAoY2FjaGVkICYmIERhdGUubm93KCkgLSBjYWNoZWQudGltZXN0YW1wIDwgdGhpcy5jb25maWcuY2FjaGVFeHBpcnkpIHtcbiAgICAgIC8vIFVwZGF0ZSBhY2Nlc3Mgb3JkZXIgZm9yIExSVVxuICAgICAgY2FjaGVkLmxhc3RBY2Nlc3NlZCA9IERhdGUubm93KCk7XG4gICAgICB0aGlzLnVwZGF0ZUFjY2Vzc09yZGVyKGNhY2hlS2V5KTtcbiAgICAgIHJldHVybiBjYWNoZWQucmVzdWx0O1xuICAgIH1cblxuICAgIC8vIENhbGN1bGF0ZSBtZXRyaWNzXG4gICAgY29uc3QgamFjY2FyZCA9IHRoaXMuY2FsY3VsYXRlSmFjY2FyZCh0ZXh0MSwgdGV4dDIpO1xuICAgIGNvbnN0IGVudHJvcHkxID0gdGhpcy5jYWxjdWxhdGVFbnRyb3B5KHRleHQxKTtcbiAgICBjb25zdCBlbnRyb3B5MiA9IHRoaXMuY2FsY3VsYXRlRW50cm9weSh0ZXh0Mik7XG4gICAgY29uc3QgYXZnRW50cm9weSA9IChlbnRyb3B5MSArIGVudHJvcHkyKSAvIDI7XG5cbiAgICAvLyBHZXQgdG9rZW4gc2V0cyBmb3IgYWRkaXRpb25hbCBtZXRyaWNzXG4gICAgY29uc3QgdG9rZW5zMSA9IHRoaXMuY2xlYW5BbmRUb2tlbml6ZSh0ZXh0MSk7XG4gICAgY29uc3QgdG9rZW5zMiA9IHRoaXMuY2xlYW5BbmRUb2tlbml6ZSh0ZXh0Mik7XG4gICAgY29uc3QgaW50ZXJzZWN0aW9uID0gbmV3IFNldChbLi4udG9rZW5zMV0uZmlsdGVyKHRva2VuID0+IHRva2VuczIuaGFzKHRva2VuKSkpO1xuXG4gICAgLy8gSW50ZXJwcmV0IHRoZSBjb21iaW5hdGlvblxuICAgIGxldCBjb21iaW5lZFNjb3JlOiBudW1iZXI7XG4gICAgbGV0IGludGVycHJldGF0aW9uOiBzdHJpbmc7XG5cbiAgICAvLyBIaWdoIEphY2NhcmQgKyBNb2RlcmF0ZS1IaWdoIGVudHJvcHkgPSBFeGNlbGxlbnQgbWF0Y2ggKHNhbWUgZG9tYWluKVxuICAgIGlmIChqYWNjYXJkID49IHRoaXMuY29uZmlnLmphY2NhcmRUaHJlc2hvbGRzLmhpZ2ggJiZcbiAgICAgICAgYXZnRW50cm9weSA+PSB0aGlzLmNvbmZpZy5lbnRyb3B5QmFuZHMubG93KSB7XG4gICAgICAvLyBTY2FsZSBzY29yZSBiYXNlZCBvbiBlbnRyb3B5IHF1YWxpdHlcbiAgICAgIGNvbnN0IGVudHJvcHlRdWFsaXR5ID0gTWF0aC5taW4oMS4wLCAoYXZnRW50cm9weSAtIDIuMCkgLyA0LjApOyAvLyAwIGF0IGVudHJvcHk9MiwgMSBhdCBlbnRyb3B5PTYrXG4gICAgICBjb21iaW5lZFNjb3JlID0gMC43ICsgKGphY2NhcmQgLSAwLjYpICogMC41ICsgZW50cm9weVF1YWxpdHkgKiAwLjI7XG5cbiAgICAgIGlmIChhdmdFbnRyb3B5ID49IHRoaXMuY29uZmlnLmVudHJvcHlCYW5kcy5tb2RlcmF0ZSkge1xuICAgICAgICBpbnRlcnByZXRhdGlvbiA9ICdFeGNlbGxlbnQgbWF0Y2ggLSBzYW1lIHRlY2huaWNhbCBkb21haW4gd2l0aCByaWNoIHZvY2FidWxhcnknO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaW50ZXJwcmV0YXRpb24gPSAnR29vZCBtYXRjaCAtIGhpZ2ggb3ZlcmxhcCBidXQgc2ltcGxlciB2b2NhYnVsYXJ5JztcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gSGlnaCBKYWNjYXJkICsgVmVyeSBMb3cgZW50cm9weSA9IENvbW1vbiB3b3JkIHBvbGx1dGlvblxuICAgIGVsc2UgaWYgKGphY2NhcmQgPj0gdGhpcy5jb25maWcuamFjY2FyZFRocmVzaG9sZHMuaGlnaCAmJlxuICAgICAgICAgICAgIGF2Z0VudHJvcHkgPCAyLjApIHtcbiAgICAgIGNvbWJpbmVkU2NvcmUgPSAwLjMgKyBqYWNjYXJkICogMC4yOyAvLyBQZW5hbGl6ZSBoZWF2aWx5XG4gICAgICBpbnRlcnByZXRhdGlvbiA9ICdTdXBlcmZpY2lhbCBzaW1pbGFyaXR5IC0gbW9zdGx5IGNvbW1vbiB3b3Jkcyc7XG4gICAgfVxuICAgIC8vIE1vZGVyYXRlIEphY2NhcmQgKyBHb29kIGVudHJvcHkgPSBSZWxhdGVkIGNvbmNlcHRzXG4gICAgZWxzZSBpZiAoamFjY2FyZCA+PSB0aGlzLmNvbmZpZy5qYWNjYXJkVGhyZXNob2xkcy5tb2RlcmF0ZSAmJlxuICAgICAgICAgICAgIGF2Z0VudHJvcHkgPj0gdGhpcy5jb25maWcuZW50cm9weUJhbmRzLmxvdykge1xuICAgICAgY29tYmluZWRTY29yZSA9IDAuNCArIGphY2NhcmQgKiAwLjQgKyAoYXZnRW50cm9weSAvIDEwKSAqIDAuMjtcbiAgICAgIGludGVycHJldGF0aW9uID0gJ01vZGVyYXRlIG1hdGNoIC0gcmVsYXRlZCBjb25jZXB0cyB3aXRoIGdvb2QgY29tcGxleGl0eSc7XG4gICAgfVxuICAgIC8vIExvdyBKYWNjYXJkICsgU2ltaWxhciBlbnRyb3B5ID0gRGlmZmVyZW50IGRvbWFpbnNcbiAgICBlbHNlIGlmIChqYWNjYXJkIDwgdGhpcy5jb25maWcuamFjY2FyZFRocmVzaG9sZHMubG93ICYmXG4gICAgICAgICAgICAgTWF0aC5hYnMoZW50cm9weTEgLSBlbnRyb3B5MikgPCAxLjApIHtcbiAgICAgIGNvbWJpbmVkU2NvcmUgPSBqYWNjYXJkICogMC41O1xuICAgICAgaW50ZXJwcmV0YXRpb24gPSAnRGlmZmVyZW50IGRvbWFpbnMgd2l0aCBzaW1pbGFyIGNvbXBsZXhpdHknO1xuICAgIH1cbiAgICAvLyBMb3cgSmFjY2FyZCArIERpZmZlcmVudCBlbnRyb3B5ID0gVW5yZWxhdGVkXG4gICAgZWxzZSB7XG4gICAgICBjb21iaW5lZFNjb3JlID0gamFjY2FyZCAqIDAuMztcbiAgICAgIGludGVycHJldGF0aW9uID0gJ0xvdyByZWxldmFuY2UgLSBkaWZmZXJlbnQgdG9waWNzIGFuZCBjb21wbGV4aXR5JztcbiAgICB9XG5cbiAgICAvLyBFbnN1cmUgc2NvcmUgaXMgYmV0d2VlbiAwIGFuZCAxXG4gICAgY29tYmluZWRTY29yZSA9IE1hdGgubWF4KDAsIE1hdGgubWluKDEsIGNvbWJpbmVkU2NvcmUpKTtcblxuICAgIGNvbnN0IHJlc3VsdDogU2NvcmluZ1Jlc3VsdCA9IHtcbiAgICAgIGphY2NhcmQsXG4gICAgICBlbnRyb3B5OiBhdmdFbnRyb3B5LFxuICAgICAgY29tYmluZWRTY29yZSxcbiAgICAgIGludGVycHJldGF0aW9uLFxuICAgICAgdG9rZW5Db3VudDogdG9rZW5zMS5zaXplICsgdG9rZW5zMi5zaXplLFxuICAgICAgb3ZlcmxhcENvdW50OiBpbnRlcnNlY3Rpb24uc2l6ZVxuICAgIH07XG5cbiAgICAvLyBDYWNoZSB0aGUgcmVzdWx0IHdpdGggTFJVIG1hbmFnZW1lbnRcbiAgICB0aGlzLmFkZFRvQ2FjaGUoY2FjaGVLZXksIHJlc3VsdCk7XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkIGEgcGFpcndpc2Ugc2ltaWxhcml0eSBtYXRyaXggZm9yIG11bHRpcGxlIHRleHRzXG4gICAqXG4gICAqIFVzZWZ1bCBmb3IgY2x1c3RlcmluZyBhbmQgcmVsYXRpb25zaGlwIGRpc2NvdmVyeVxuICAgKi9cbiAgcHVibGljIGJ1aWxkU2ltaWxhcml0eU1hdHJpeChcbiAgICBlbGVtZW50czogTWFwPHN0cmluZywgc3RyaW5nPlxuICApOiBNYXA8c3RyaW5nLCBNYXA8c3RyaW5nLCBTY29yaW5nUmVzdWx0Pj4ge1xuICAgIGNvbnN0IG1hdHJpeCA9IG5ldyBNYXA8c3RyaW5nLCBNYXA8c3RyaW5nLCBTY29yaW5nUmVzdWx0Pj4oKTtcbiAgICBjb25zdCBrZXlzID0gQXJyYXkuZnJvbShlbGVtZW50cy5rZXlzKCkpO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBrZXkxID0ga2V5c1tpXTtcbiAgICAgIGNvbnN0IHRleHQxID0gZWxlbWVudHMuZ2V0KGtleTEpITtcblxuICAgICAgaWYgKCFtYXRyaXguaGFzKGtleTEpKSB7XG4gICAgICAgIG1hdHJpeC5zZXQoa2V5MSwgbmV3IE1hcCgpKTtcbiAgICAgIH1cblxuICAgICAgZm9yIChsZXQgaiA9IGkgKyAxOyBqIDwga2V5cy5sZW5ndGg7IGorKykge1xuICAgICAgICBjb25zdCBrZXkyID0ga2V5c1tqXTtcbiAgICAgICAgY29uc3QgdGV4dDIgPSBlbGVtZW50cy5nZXQoa2V5MikhO1xuXG4gICAgICAgIC8vIENhbGN1bGF0ZSBzaW1pbGFyaXR5XG4gICAgICAgIGNvbnN0IHNpbWlsYXJpdHkgPSB0aGlzLnNjb3JlUmVsZXZhbmNlKHRleHQxLCB0ZXh0Mik7XG5cbiAgICAgICAgLy8gU3RvcmUgYmlkaXJlY3Rpb25hbGx5XG4gICAgICAgIG1hdHJpeC5nZXQoa2V5MSkhLnNldChrZXkyLCBzaW1pbGFyaXR5KTtcblxuICAgICAgICBpZiAoIW1hdHJpeC5oYXMoa2V5MikpIHtcbiAgICAgICAgICBtYXRyaXguc2V0KGtleTIsIG5ldyBNYXAoKSk7XG4gICAgICAgIH1cbiAgICAgICAgbWF0cml4LmdldChrZXkyKSEuc2V0KGtleTEsIHNpbWlsYXJpdHkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBtYXRyaXg7XG4gIH1cblxuICAvKipcbiAgICogRmluZCBtb3N0IHNpbWlsYXIgZWxlbWVudHMgdG8gYSBnaXZlbiB0ZXh0XG4gICAqL1xuICBwdWJsaWMgZmluZFNpbWlsYXIoXG4gICAgdGFyZ2V0VGV4dDogc3RyaW5nLFxuICAgIGNhbmRpZGF0ZXM6IE1hcDxzdHJpbmcsIHN0cmluZz4sXG4gICAgdG9wSzogbnVtYmVyID0gNVxuICApOiBBcnJheTx7IG5hbWU6IHN0cmluZzsgc2NvcmU6IFNjb3JpbmdSZXN1bHQgfT4ge1xuICAgIGNvbnN0IHNjb3JlczogQXJyYXk8eyBuYW1lOiBzdHJpbmc7IHNjb3JlOiBTY29yaW5nUmVzdWx0IH0+ID0gW107XG5cbiAgICBmb3IgKGNvbnN0IFtuYW1lLCB0ZXh0XSBvZiBjYW5kaWRhdGVzLmVudHJpZXMoKSkge1xuICAgICAgY29uc3Qgc2NvcmUgPSB0aGlzLnNjb3JlUmVsZXZhbmNlKHRhcmdldFRleHQsIHRleHQpO1xuICAgICAgc2NvcmVzLnB1c2goeyBuYW1lLCBzY29yZSB9KTtcbiAgICB9XG5cbiAgICAvLyBTb3J0IGJ5IGNvbWJpbmVkIHNjb3JlIGRlc2NlbmRpbmdcbiAgICBzY29yZXMuc29ydCgoYSwgYikgPT4gYi5zY29yZS5jb21iaW5lZFNjb3JlIC0gYS5zY29yZS5jb21iaW5lZFNjb3JlKTtcblxuICAgIHJldHVybiBzY29yZXMuc2xpY2UoMCwgdG9wSyk7XG4gIH1cblxuICAvKipcbiAgICogRXh0cmFjdCBrZXkgdGVybXMgZnJvbSB0ZXh0IGJhc2VkIG9uIGVudHJvcHkgY29udHJpYnV0aW9uXG4gICAqXG4gICAqIFRlcm1zIHRoYXQgY29udHJpYnV0ZSBtb3N0IHRvIGVudHJvcHkgYXJlIGxpa2VseSBpbXBvcnRhbnRcbiAgICovXG4gIHB1YmxpYyBleHRyYWN0S2V5VGVybXModGV4dDogc3RyaW5nLCB0b3BLOiBudW1iZXIgPSAxMCk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCB0b2tlbnMgPSBBcnJheS5mcm9tKHRoaXMuY2xlYW5BbmRUb2tlbml6ZSh0ZXh0KSk7XG5cbiAgICBpZiAodG9rZW5zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIC8vIENhbGN1bGF0ZSB0b2tlbiBmcmVxdWVuY2llc1xuICAgIGNvbnN0IGZyZXF1ZW5jaWVzID0gbmV3IE1hcDxzdHJpbmcsIG51bWJlcj4oKTtcbiAgICBmb3IgKGNvbnN0IHRva2VuIG9mIHRva2Vucykge1xuICAgICAgZnJlcXVlbmNpZXMuc2V0KHRva2VuLCAoZnJlcXVlbmNpZXMuZ2V0KHRva2VuKSB8fCAwKSArIDEpO1xuICAgIH1cblxuICAgIC8vIENhbGN1bGF0ZSBlbnRyb3B5IGNvbnRyaWJ1dGlvbiBmb3IgZWFjaCB1bmlxdWUgdG9rZW5cbiAgICBjb25zdCB0b3RhbFRva2VucyA9IHRva2Vucy5sZW5ndGg7XG4gICAgY29uc3QgY29udHJpYnV0aW9uczogQXJyYXk8eyB0b2tlbjogc3RyaW5nOyBjb250cmlidXRpb246IG51bWJlciB9PiA9IFtdO1xuXG4gICAgZm9yIChjb25zdCBbdG9rZW4sIGNvdW50XSBvZiBmcmVxdWVuY2llcy5lbnRyaWVzKCkpIHtcbiAgICAgIGNvbnN0IHByb2JhYmlsaXR5ID0gY291bnQgLyB0b3RhbFRva2VucztcbiAgICAgIGNvbnN0IGNvbnRyaWJ1dGlvbiA9IC1wcm9iYWJpbGl0eSAqIE1hdGgubG9nMihwcm9iYWJpbGl0eSk7XG4gICAgICBjb250cmlidXRpb25zLnB1c2goeyB0b2tlbiwgY29udHJpYnV0aW9uIH0pO1xuICAgIH1cblxuICAgIC8vIFNvcnQgYnkgY29udHJpYnV0aW9uIGRlc2NlbmRpbmdcbiAgICBjb250cmlidXRpb25zLnNvcnQoKGEsIGIpID0+IGIuY29udHJpYnV0aW9uIC0gYS5jb250cmlidXRpb24pO1xuXG4gICAgcmV0dXJuIGNvbnRyaWJ1dGlvbnMuc2xpY2UoMCwgdG9wSykubWFwKGMgPT4gYy50b2tlbik7XG4gIH1cblxuICAvKipcbiAgICogQWRkIHJlc3VsdCB0byBjYWNoZSB3aXRoIExSVSBldmljdGlvblxuICAgKi9cbiAgcHJpdmF0ZSBhZGRUb0NhY2hlKGtleTogc3RyaW5nLCByZXN1bHQ6IFNjb3JpbmdSZXN1bHQpOiB2b2lkIHtcbiAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuXG4gICAgLy8gQ2hlY2sgaWYgd2UgbmVlZCB0byBldmljdFxuICAgIGlmICh0aGlzLmNhY2hlLnNpemUgPj0gdGhpcy5jb25maWcubWF4Q2FjaGVTaXplICYmICF0aGlzLmNhY2hlLmhhcyhrZXkpKSB7XG4gICAgICAvLyBGaW5kIGxlYXN0IHJlY2VudGx5IHVzZWQgZW50cnlcbiAgICAgIGxldCBscnVLZXk6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICAgICAgbGV0IG9sZGVzdEFjY2VzcyA9IG5vdztcblxuICAgICAgZm9yIChjb25zdCBbaywgdl0gb2YgdGhpcy5jYWNoZS5lbnRyaWVzKCkpIHtcbiAgICAgICAgaWYgKHYubGFzdEFjY2Vzc2VkIDwgb2xkZXN0QWNjZXNzKSB7XG4gICAgICAgICAgb2xkZXN0QWNjZXNzID0gdi5sYXN0QWNjZXNzZWQ7XG4gICAgICAgICAgbHJ1S2V5ID0gaztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAobHJ1S2V5KSB7XG4gICAgICAgIHRoaXMuY2FjaGUuZGVsZXRlKGxydUtleSk7XG4gICAgICAgIGNvbnN0IGlkeCA9IHRoaXMuY2FjaGVBY2Nlc3NPcmRlci5pbmRleE9mKGxydUtleSk7XG4gICAgICAgIGlmIChpZHggPiAtMSkge1xuICAgICAgICAgIHRoaXMuY2FjaGVBY2Nlc3NPcmRlci5zcGxpY2UoaWR4LCAxKTtcbiAgICAgICAgfVxuICAgICAgICBsb2dnZXIuZGVidWcoJ0V2aWN0ZWQgTFJVIGNhY2hlIGVudHJ5JywgeyBrZXk6IGxydUtleSwgY2FjaGVTaXplOiB0aGlzLmNhY2hlLnNpemUgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQWRkIG5ldyBlbnRyeVxuICAgIHRoaXMuY2FjaGUuc2V0KGtleSwge1xuICAgICAgcmVzdWx0LFxuICAgICAgdGltZXN0YW1wOiBub3csXG4gICAgICBsYXN0QWNjZXNzZWQ6IG5vd1xuICAgIH0pO1xuICAgIHRoaXMudXBkYXRlQWNjZXNzT3JkZXIoa2V5KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGUgYWNjZXNzIG9yZGVyIGZvciBMUlUgdHJhY2tpbmdcbiAgICovXG4gIHByaXZhdGUgdXBkYXRlQWNjZXNzT3JkZXIoa2V5OiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBpZHggPSB0aGlzLmNhY2hlQWNjZXNzT3JkZXIuaW5kZXhPZihrZXkpO1xuICAgIGlmIChpZHggPiAtMSkge1xuICAgICAgdGhpcy5jYWNoZUFjY2Vzc09yZGVyLnNwbGljZShpZHgsIDEpO1xuICAgIH1cbiAgICB0aGlzLmNhY2hlQWNjZXNzT3JkZXIucHVzaChrZXkpO1xuICB9XG5cbiAgLyoqXG4gICAqIENsZWFuIGV4cGlyZWQgY2FjaGUgZW50cmllc1xuICAgKi9cbiAgcHJpdmF0ZSBjbGVhbkV4cGlyZWRDYWNoZSgpOiB2b2lkIHtcbiAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICAgIGxldCByZW1vdmVkID0gMDtcblxuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIHRoaXMuY2FjaGUuZW50cmllcygpKSB7XG4gICAgICBpZiAobm93IC0gdmFsdWUudGltZXN0YW1wID4gdGhpcy5jb25maWcuY2FjaGVFeHBpcnkpIHtcbiAgICAgICAgdGhpcy5jYWNoZS5kZWxldGUoa2V5KTtcbiAgICAgICAgY29uc3QgaWR4ID0gdGhpcy5jYWNoZUFjY2Vzc09yZGVyLmluZGV4T2Yoa2V5KTtcbiAgICAgICAgaWYgKGlkeCA+IC0xKSB7XG4gICAgICAgICAgdGhpcy5jYWNoZUFjY2Vzc09yZGVyLnNwbGljZShpZHgsIDEpO1xuICAgICAgICB9XG4gICAgICAgIHJlbW92ZWQrKztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAocmVtb3ZlZCA+IDApIHtcbiAgICAgIGxvZ2dlci5kZWJ1ZygnQ2xlYW5lZCBleHBpcmVkIGNhY2hlIGVudHJpZXMnLCB7IHJlbW92ZWQsIHJlbWFpbmluZzogdGhpcy5jYWNoZS5zaXplIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhciB0aGUgY2FjaGVcbiAgICovXG4gIHB1YmxpYyBjbGVhckNhY2hlKCk6IHZvaWQge1xuICAgIGNvbnN0IGNsZWFyZWQgPSB0aGlzLmNhY2hlLnNpemU7XG4gICAgdGhpcy5jYWNoZS5jbGVhcigpO1xuICAgIHRoaXMuY2FjaGVBY2Nlc3NPcmRlciA9IFtdO1xuICAgIGlmIChjbGVhcmVkID4gMCkge1xuICAgICAgbG9nZ2VyLmRlYnVnKCdOTFAgc2NvcmluZyBjYWNoZSBjbGVhcmVkJywgeyBlbnRyaWVzQ2xlYXJlZDogY2xlYXJlZCB9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0IGNhY2hlIHN0YXRpc3RpY3NcbiAgICovXG4gIHB1YmxpYyBnZXRDYWNoZVN0YXRzKCk6IHsgc2l6ZTogbnVtYmVyOyBvbGRlc3RFbnRyeTogbnVtYmVyIHwgbnVsbCB9IHtcbiAgICBsZXQgb2xkZXN0OiBudW1iZXIgfCBudWxsID0gbnVsbDtcblxuICAgIGZvciAoY29uc3QgZW50cnkgb2YgdGhpcy5jYWNoZS52YWx1ZXMoKSkge1xuICAgICAgaWYgKG9sZGVzdCA9PT0gbnVsbCB8fCBlbnRyeS50aW1lc3RhbXAgPCBvbGRlc3QpIHtcbiAgICAgICAgb2xkZXN0ID0gZW50cnkudGltZXN0YW1wO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBzaXplOiB0aGlzLmNhY2hlLnNpemUsXG4gICAgICBvbGRlc3RFbnRyeTogb2xkZXN0XG4gICAgfTtcbiAgfVxuXG4gIHB1YmxpYyBkaXNwb3NlKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmNsZWFudXBJbnRlcnZhbCkge1xuICAgICAgY2xlYXJJbnRlcnZhbCh0aGlzLmNsZWFudXBJbnRlcnZhbCk7XG4gICAgICB0aGlzLmNsZWFudXBJbnRlcnZhbCA9IHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
|
|
@@ -288,7 +288,7 @@ export class PortfolioIndexManager {
|
|
|
288
288
|
*/
|
|
289
289
|
async performBuild() {
|
|
290
290
|
const startTime = Date.now();
|
|
291
|
-
logger.
|
|
291
|
+
logger.debug('Building portfolio index...');
|
|
292
292
|
try {
|
|
293
293
|
const portfolioManager = this.portfolioManager;
|
|
294
294
|
// Initialize empty index
|
|
@@ -733,4 +733,4 @@ export class PortfolioIndexManager {
|
|
|
733
733
|
this.buildPromise = null;
|
|
734
734
|
}
|
|
735
735
|
}
|
|
736
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUG9ydGZvbGlvSW5kZXhNYW5hZ2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3BvcnRmb2xpby9Qb3J0Zm9saW9JbmRleE1hbmFnZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxLQUFLLElBQUksTUFBTSxNQUFNLENBQUM7QUFDN0IsT0FBTyxLQUFLLElBQUksTUFBTSxTQUFTLENBQUM7QUFDaEMsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQzVDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFFekMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDbkUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sNENBQTRDLENBQUM7QUFDOUUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ2pFLE9BQU8sRUFBRSxZQUFZLEVBQUUsYUFBYSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUE4RHZFLE1BQU0sT0FBTyxxQkFBcUI7SUFjYjtJQWJYLEtBQUssR0FBMEIsSUFBSSxDQUFDO0lBQ3BDLFNBQVMsR0FBZ0IsSUFBSSxDQUFDO0lBQ3JCLE1BQU0sQ0FBUztJQUNmLGdCQUFnQixDQUFtQjtJQUNuQyxjQUFjLENBQXlCO0lBQ2hELFVBQVUsR0FBRyxLQUFLLENBQUM7SUFDbkIsWUFBWSxHQUF5QixJQUFJLENBQUM7SUFFbEQsMENBQTBDO0lBQ3pCLFdBQVcsR0FBRyxDQUFDLENBQUM7SUFDaEIsY0FBYyxHQUFHLEdBQUcsQ0FBQztJQUV0QyxZQUNtQixrQkFBc0MsRUFDdkQsZ0JBQWtDLEVBQ2xDLGNBQXNDO1FBRnJCLHVCQUFrQixHQUFsQixrQkFBa0IsQ0FBb0I7UUFJdkQsTUFBTSxDQUFDLEtBQUssQ0FBQywrQkFBK0IsQ0FBQyxDQUFDO1FBQzlDLElBQUksQ0FBQyxNQUFN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UUFDeEIsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7SUFDM0IsQ0FBQztDQUdGIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBQb3J0Zm9saW8gSW5kZXggTWFuYWdlciAtIE1hcHMgZWxlbWVudCBuYW1lcyB0byBmaWxlIHBhdGhzXG4gKiBcbiAqIFNvbHZlcyBjcml0aWNhbCBpc3N1ZXM6XG4gKiAxLiBzdWJtaXRfY29sbGVjdGlvbl9jb250ZW50IGNhbid0IGZpbmQgZWxlbWVudHMgYnkgbWV0YWRhdGEgbmFtZSAoZS5nLiwgXCJTYWZlIFJvdW5kdHJpcCBUZXN0ZXJcIiAtPiBcInNhZmUtcm91bmR0cmlwLXRlc3Rlci5tZFwiKVxuICogMi4gc2VhcmNoX2NvbGxlY3Rpb24gZG9lc24ndCBzZWFyY2ggbG9jYWwgcG9ydGZvbGlvIGNvbnRlbnRcbiAqIFxuICogRmVhdHVyZXM6XG4gKiAtIEluLW1lbW9yeSBpbmRleCBtYXBwaW5nIG1ldGFkYXRhLm5hbWUg4oaSIGZpbGUgcGF0aFxuICogLSBLZXl3b3Jkcy90YWdzIOKGkiBmaWxlIHBhdGhzIG1hcHBpbmdcbiAqIC0gRWxlbWVudCB0eXBlIOKGkiBmaWxlIHBhdGhzIG1hcHBpbmdcbiAqIC0gRmFzdCBPKDEpIGxvb2t1cHMgd2l0aCBNYXBzXG4gKiAtIExhenkgbG9hZGluZyB3aXRoIDUtbWludXRlIFRUTCBjYWNoZVxuICogLSBVbmljb2RlIG5vcm1hbGl6YXRpb24gZm9yIHNlY3VyaXR5XG4gKiAtIEVycm9yIGhhbmRsaW5nIGFuZCBsb2dnaW5nXG4gKi9cblxuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCAqIGFzIHlhbWwgZnJvbSAnanMteWFtbCc7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi91dGlscy9sb2dnZXIuanMnO1xuaW1wb3J0IHsgRWxlbWVudFR5cGUgfSBmcm9tICcuL3R5cGVzLmpzJztcbmltcG9ydCB7IFBvcnRmb2xpb01hbmFnZXIgfSBmcm9tICcuL1BvcnRmb2xpb01hbmFnZXIuanMnO1xuaW1wb3J0IHsgU2VjdXJlWWFtbFBhcnNlciB9IGZyb20gJy4uL3NlY3VyaXR5L3NlY3VyZVlhbWxQYXJzZXIuanMnO1xuaW1wb3J0IHsgVW5pY29kZVZhbGlkYXRvciB9IGZyb20gJy4uL3NlY3VyaXR5L3ZhbGlkYXRvcnMvdW5pY29kZVZhbGlkYXRvci5qcyc7XG5pbXBvcnQgeyBTZWN1cml0eU1vbml0b3IgfSBmcm9tICcuLi9zZWN1cml0eS9zZWN1cml0eU1vbml0b3IuanMnO1xuaW1wb3J0IHsgRXJyb3JIYW5kbGVyLCBFcnJvckNhdGVnb3J5IH0gZnJvbSAnLi4vdXRpbHMvRXJyb3JIYW5kbGVyLmpzJztcbmltcG9ydCB7IEluZGV4Q29uZmlnTWFuYWdlciB9IGZyb20gJy4vY29uZmlnL0luZGV4Q29uZmlnLmpzJztcbmltcG9ydCB7IElGaWxlT3BlcmF0aW9uc1NlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9GaWxlT3BlcmF0aW9uc1NlcnZpY2UuanMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEluZGV4RW50cnkge1xuICBmaWxlUGF0aDogc3RyaW5nO1xuICBlbGVtZW50VHlwZTogRWxlbWVudFR5cGU7XG4gIG1ldGFkYXRhOiB7XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuICAgIHZlcnNpb24/OiBzdHJpbmc7XG4gICAgYXV0aG9yPzogc3RyaW5nO1xuICAgIHRhZ3M/OiBzdHJpbmdbXTtcbiAgICBrZXl3b3Jkcz86IHN0cmluZ1tdO1xuICAgIHRyaWdnZXJzPzogc3RyaW5nW107XG4gICAgY2F0ZWdvcnk/OiBzdHJpbmc7XG4gICAgY3JlYXRlZD86IHN0cmluZztcbiAgICB1cGRhdGVkPzogc3RyaW5nO1xuICAgIC8qKiBBZ2VudCBWMiBgYWN0aXZhdGVzYCBmaWVsZCDigJQgbWFwcyBlbGVtZW50IHR5cGVzIHRvIGVsZW1lbnQgbmFtZXMuXG4gICAgICogIFVzZXMgUmVjb3JkPHN0cmluZywgc3RyaW5nW10+IGludGVudGlvbmFsbHkgKG5vdCBBZ2VudEFjdGl2YXRlcykgdG9cbiAgICAgKiAgYXZvaWQgY291cGxpbmcgdGhlIGluZGV4IGxheWVyIHRvIGFnZW50LXNwZWNpZmljIHR5cGVzIGFuZCB0byBzdXBwb3J0XG4gICAgICogIGZ1dHVyZSBlbGVtZW50IHR5cGVzIHdpdGhvdXQgaW5kZXggY2hhbmdlcy4gKi9cbiAgICBhY3RpdmF0ZXM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT47XG4gIH07XG4gIGxhc3RNb2RpZmllZDogRGF0ZTtcbiAgZmlsZW5hbWU6IHN0cmluZzsgLy8gQmFzZSBmaWxlbmFtZSB3aXRob3V0IGV4dGVuc2lvblxufVxuXG4vLyBFeHRlbmRlZCBpbnRlcmZhY2UgZm9yIHNoYXJkZWQgbWVtb3J5IGVudHJpZXNcbmV4cG9ydCBpbnRlcmZhY2UgU2hhcmRlZE1lbW9yeUluZGV4RW50cnkgZXh0ZW5kcyBJbmRleEVudHJ5IHtcbiAgc2hhcmRJbmZvOiB7XG4gICAgc2hhcmRDb3VudDogbnVtYmVyO1xuICAgIHNoYXJkRGlyOiBzdHJpbmc7XG4gICAgbWV0YWRhdGFGaWxlOiBzdHJpbmc7XG4gIH07XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUG9ydGZvbGlvSW5kZXgge1xuICBieU5hbWU6IE1hcDxzdHJpbmcsIEluZGV4RW50cnk+O1xuICBieUZpbGVuYW1lOiBNYXA8c3RyaW5nLCBJbmRleEVudHJ5PjtcbiAgYnlUeXBlOiBNYXA8RWxlbWVudFR5cGUsIEluZGV4RW50cnlbXT47XG4gIGJ5S2V5d29yZDogTWFwPHN0cmluZywgSW5kZXhFbnRyeVtdPjtcbiAgYnlUYWc6IE1hcDxzdHJpbmcsIEluZGV4RW50cnlbXT47XG4gIGJ5VHJpZ2dlcjogTWFwPHN0cmluZywgSW5kZXhFbnRyeVtdPjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTZWFyY2hPcHRpb25zIHtcbiAgZWxlbWVudFR5cGU/OiBFbGVtZW50VHlwZTtcbiAgZnV6enlNYXRjaD86IGJvb2xlYW47XG4gIG1heFJlc3VsdHM/OiBudW1iZXI7XG4gIGluY2x1ZGVLZXl3b3Jkcz86IGJvb2xlYW47XG4gIGluY2x1ZGVUYWdzPzogYm9vbGVhbjtcbiAgaW5jbHVkZVRyaWdnZXJzPzogYm9vbGVhbjtcbiAgaW5jbHVkZURlc2NyaXB0aW9ucz86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2VhcmNoUmVzdWx0IHtcbiAgZW50cnk6IEluZGV4RW50cnk7XG4gIG1hdGNoVHlwZTogJ25hbWUnIHwgJ2ZpbGVuYW1lJyB8ICdrZXl3b3JkJyB8ICd0YWcnIHwgJ3RyaWdnZXInIHwgJ2Rlc2NyaXB0aW9uJztcbiAgc2NvcmU6IG51bWJlcjsgLy8gRm9yIGZ1dHVyZSByYW5raW5nXG59XG5cbmV4cG9ydCBjbGFzcyBQb3J0Zm9saW9JbmRleE1hbmFnZXIge1xuICBwcml2YXRlIGluZGV4OiBQb3J0Zm9saW9JbmRleCB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGxhc3RCdWlsdDogRGF0ZSB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHJlYWRvbmx5IFRUTF9NUzogbnVtYmVyO1xuICBwcml2YXRlIHJlYWRvbmx5IHBvcnRmb2xpb01hbmFnZXI6IFBvcnRmb2xpb01hbmFnZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgZmlsZU9wZXJhdGlvbnM6IElGaWxlT3BlcmF0aW9uc1NlcnZpY2U7XG4gIHByaXZhdGUgaXNCdWlsZGluZyA9IGZhbHNlO1xuICBwcml2YXRlIGJ1aWxkUHJvbWlzZTogUHJvbWlzZTx2b2lkPiB8IG51bGwgPSBudWxsO1xuXG4gIC8vIFJldHJ5IGNvbmZpZ3VyYXRpb24gZm9yIGZpbGUgb3BlcmF0aW9uc1xuICBwcml2YXRlIHJlYWRvbmx5IE1BWF9SRVRSSUVTID0gMztcbiAgcHJpdmF0ZSByZWFkb25seSBSRVRSWV9ERUxBWV9NUyA9IDEwMDtcblxuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBpbmRleENvbmZpZ01hbmFnZXI6IEluZGV4Q29uZmlnTWFuYWdlcixcbiAgICBwb3J0Zm9saW9NYW5hZ2VyOiBQb3J0Zm9saW9NYW5hZ2VyLFxuICAgIGZpbGVPcGVyYXRpb25zOiBJRmlsZU9wZXJhdGlvbnNTZXJ2aWNlXG4gICkge1xuICAgIGxvZ2dlci5kZWJ1ZygnUG9ydGZvbGlvSW5kZXhNYW5hZ2VyIGNyZWF0ZWQnKTtcbiAgICB0aGlzLlRUTF9NUyA9IHRoaXMuaW5kZXhDb25maWdNYW5hZ2VyLmdldENvbmZpZygpLmluZGV4LnR0bE1pbnV0ZXMgKiA2MCAqIDEwMDA7XG4gICAgdGhpcy5wb3J0Zm9saW9NYW5hZ2VyID0gcG9ydGZvbGlvTWFuYWdlcjtcbiAgICB0aGlzLmZpbGVPcGVyYXRpb25zID0gZmlsZU9wZXJhdGlvbnM7XG4gIH1cblxuICAvKipcbiAgICogUmV0cnkgd3JhcHBlciBmb3IgZmlsZSBzeXN0ZW0gb3BlcmF0aW9uc1xuICAgKiBIYW5kbGVzIHRyYW5zaWVudCBmaWxlIHN5c3RlbSBlcnJvcnMgd2l0aCBleHBvbmVudGlhbCBiYWNrb2ZmXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHJldHJ5RmlsZU9wZXJhdGlvbjxUPihcbiAgICBvcGVyYXRpb246ICgpID0+IFByb21pc2U8VD4sXG4gICAgY29udGV4dDogc3RyaW5nLFxuICAgIHJldHJpZXM6IG51bWJlciA9IHRoaXMuTUFYX1JFVFJJRVNcbiAgKTogUHJvbWlzZTxUIHwgbnVsbD4ge1xuICAgIGZvciAobGV0IGF0dGVtcHQgPSAxOyBhdHRlbXB0IDw9IHJldHJpZXM7IGF0dGVtcHQrKykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IG9wZXJhdGlvbigpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc3QgaXNMYXN0QXR0ZW1wdCA9IGF0dGVtcHQgPT09IHJldHJpZXM7XG4gICAgICAgIGNvbnN0IGVycm9yTWVzc2FnZSA9IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKTtcblxuICAgICAgICAvLyBDaGVjayBpZiBlcnJvciBpcyByZXRyeWFibGUgKHRyYW5zaWVudCBmaWxlIHN5c3RlbSBlcnJvcnMpXG4gICAgICAgIGNvbnN0IGlzUmV0cnlhYmxlID0gZXJyb3JNZXNzYWdlLmluY2x1ZGVzKCdFQlVTWScpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvck1lc3NhZ2UuaW5jbHVkZXMoJ0VBR0FJTicpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvck1lc3NhZ2UuaW5jbHVkZXMoJ0VOT0VOVCcpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvck1lc3NhZ2UuaW5jbHVkZXMoJ0VUSU1FRE9VVCcpO1xuXG4gICAgICAgIGlmIChpc0xhc3RBdHRlbXB0IHx8ICFpc1JldHJ5YWJsZSkge1xuICAgICAgICAgIGxvZ2dlci53YXJuKGBGaWxlIG9wZXJhdGlvbiBmYWlsZWQgYWZ0ZXIgJHthdHRlbXB0fSBhdHRlbXB0czogJHtjb250ZXh0fWAsIHtcbiAgICAgICAgICAgIGVycm9yOiBlcnJvck1lc3NhZ2UsXG4gICAgICAgICAgICBhdHRlbXB0LFxuICAgICAgICAgICAgY29udGV4dFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRXhwb25lbnRpYWwgYmFja29mZlxuICAgICAgICBjb25zdCBkZWxheSA9IHRoaXMuUkVUUllfREVMQVlfTVMgKiBNYXRoLnBvdygyLCBhdHRlbXB0IC0gMSk7XG4gICAgICAgIGxvZ2dlci5kZWJ1ZyhgUmV0cnlpbmcgZmlsZSBvcGVyYXRpb246ICR7Y29udGV4dH1gLCB7XG4gICAgICAgICAgYXR0ZW1wdCxcbiAgICAgICAgICBuZXh0RGVsYXk6IGRlbGF5LFxuICAgICAgICAgIGVycm9yOiBlcnJvck1lc3NhZ2VcbiAgICAgICAgfSk7XG5cbiAgICAgICAgYXdhaXQgbmV3IFByb21pc2UocmVzb2x2ZSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIGRlbGF5KSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgY3VycmVudCBpbmRleCwgYnVpbGRpbmcgaXQgaWYgbmVjZXNzYXJ5XG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZ2V0SW5kZXgoKTogUHJvbWlzZTxQb3J0Zm9saW9JbmRleD4ge1xuICAgIC8vIENoZWNrIGlmIHdlIG5lZWQgdG8gcmVidWlsZFxuICAgIGlmICh0aGlzLm5lZWRzUmVidWlsZCgpKSB7XG4gICAgICBhd2FpdCB0aGlzLmJ1aWxkSW5kZXgoKTtcbiAgICB9XG4gICAgXG4gICAgcmV0dXJuIHRoaXMuaW5kZXghO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlYXJjaCB0aGUgcG9ydGZvbGlvIGluZGV4IGJ5IG5hbWUgd2l0aCBmdXp6eSBtYXRjaGluZ1xuICAgKi9cbiAgcHVibGljIGFzeW5jIGZpbmRCeU5hbWUobmFtZTogc3RyaW5nLCBvcHRpb25zOiBTZWFyY2hPcHRpb25zID0ge30pOiBQcm9taXNlPEluZGV4RW50cnkgfCBudWxsPiB7XG4gICAgY29uc3QgaW5kZXggPSBhd2FpdCB0aGlzLmdldEluZGV4KCk7XG4gICAgXG4gICAgLy8gTm9ybWFsaXplIGlucHV0IGZvciBzZWN1cml0eVxuICAgIGNvbnN0IG5vcm1hbGl6ZWROYW1lID0gVW5pY29kZVZhbGlkYXRvci5ub3JtYWxpemUobmFtZSk7XG4gICAgaWYgKCFub3JtYWxpemVkTmFtZS5pc1ZhbGlkKSB7XG4gICAgICBsb2dnZXIud2FybignSW52YWxpZCBVbmljb2RlIGluIHNlYXJjaCBuYW1lJywge1xuICAgICAgICBpc3N1ZXM6IG5vcm1hbGl6ZWROYW1lLmRldGVjdGVkSXNzdWVzXG4gICAgICB9KTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBcbiAgICBjb25zdCBzYWZlTmFtZSA9IG5vcm1hbGl6ZWROYW1lLm5vcm1hbGl6ZWRDb250ZW50O1xuICAgIFxuICAgIC8vIFRyeSBleGFjdCBtYXRjaCBmaXJzdCAoY2FzZSBpbnNlbnNpdGl2ZSlcbiAgICBjb25zdCBleGFjdE1hdGNoID0gaW5kZXguYnlOYW1lLmdldChzYWZlTmFtZS50b0xvd2VyQ2FzZSgpKTtcbiAgICBpZiAoZXhhY3RNYXRjaCkge1xuICAgICAgbG9nZ2VyLmRlYnVnKCdGb3VuZCBleGFjdCBuYW1lIG1hdGNoJywgeyBuYW1lOiBzYWZlTmFtZSwgZmlsZVBhdGg6IGV4YWN0TWF0Y2guZmlsZVBhdGggfSk7XG4gICAgICByZXR1cm4gZXhhY3RNYXRjaDtcbiAgICB9XG4gICAgXG4gICAgLy8gVHJ5IGZpbGVuYW1lIG1hdGNoXG4gICAgY29uc3QgZmlsZW5hbWVNYXRjaCA9IGluZGV4LmJ5RmlsZW5hbWUuZ2V0KHNhZmVOYW1lLnRvTG93ZXJDYXNlKCkpO1xuICAgIGlmIChmaWxlbmFtZU1hdGNoKSB7XG4gICAgICBsb2dnZXIuZGVidWcoJ0ZvdW5kIGZpbGVuYW1lIG1hdGNoJywgeyBuYW1lOiBzYWZlTmFtZSwgZmlsZVBhdGg6IGZpbGVuYW1lTWF0Y2guZmlsZVBhdGggfSk7XG4gICAgICByZXR1cm4gZmlsZW5hbWVNYXRjaDtcbiAgICB9XG4gICAgXG4gICAgLy8gVHJ5IGZ1enp5IG1hdGNoaW5nIGlmIGVuYWJsZWRcbiAgICBpZiAob3B0aW9ucy5mdXp6eU1hdGNoICE9PSBmYWxzZSkge1xuICAgICAgY29uc3QgZnV6enlNYXRjaCA9IHRoaXMuZmluZEZ1enp5TWF0Y2goc2FmZU5hbWUsIGluZGV4LCBvcHRpb25zKTtcbiAgICAgIGlmIChmdXp6eU1hdGNoKSB7XG4gICAgICAgIGxvZ2dlci5kZWJ1ZygnRm91bmQgZnV6enkgbWF0Y2gnLCB7IFxuICAgICAgICAgIG5hbWU6IHNhZmVOYW1lLCBcbiAgICAgICAgICBtYXRjaE5hbWU6IGZ1enp5TWF0Y2gubWV0YWRhdGEubmFtZSxcbiAgICAgICAgICBmaWxlUGF0aDogZnV6enlNYXRjaC5maWxlUGF0aCBcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBmdXp6eU1hdGNoO1xuICAgICAgfVxuICAgIH1cbiAgICBcbiAgICBsb2dnZXIuZGVidWcoJ05vIG1hdGNoIGZvdW5kIGZvciBuYW1lJywgeyBuYW1lOiBzYWZlTmFtZSB9KTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZWFyY2ggdGhlIHBvcnRmb2xpbyB3aXRoIGNvbXByZWhlbnNpdmUgdGV4dCBzZWFyY2hcbiAgICovXG4gIHB1YmxpYyBhc3luYyBzZWFyY2gocXVlcnk6IHN0cmluZywgb3B0aW9uczogU2VhcmNoT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxTZWFyY2hSZXN1bHRbXT4ge1xuICAgIGNvbnN0IGluZGV4ID0gYXdhaXQgdGhpcy5nZXRJbmRleCgpO1xuICAgIFxuICAgIC8vIE5vcm1hbGl6ZSBxdWVyeSBmb3Igc2VjdXJpdHlcbiAgICBjb25zdCBub3JtYWxpemVkUXVlcnkgPSBVbmljb2RlVmFsaWRhdG9yLm5vcm1hbGl6ZShxdWVyeSk7XG4gICAgaWYgKCFub3JtYWxpemVkUXVlcnkuaXNWYWxpZCkge1xuICAgICAgbG9nZ2VyLndhcm4oJ0ludmFsaWQgVW5pY29kZSBpbiBzZWFyY2ggcXVlcnknLCB7XG4gICAgICAgIGlzc3Vlczogbm9ybWFsaXplZFF1ZXJ5LmRldGVjdGVkSXNzdWVzXG4gICAgICB9KTtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gICAgXG4gICAgY29uc3Qgc2FmZVF1ZXJ5ID0gbm9ybWFsaXplZFF1ZXJ5Lm5vcm1hbGl6ZWRDb250ZW50LnRvTG93ZXJDYXNlKCkudHJpbSgpO1xuICAgIGNvbnN0IHF1ZXJ5VG9rZW5zID0gc2FmZVF1ZXJ5LnNwbGl0KC9cXHMrLykuZmlsdGVyKHRva2VuID0+IHRva2VuLmxlbmd0aCA+IDApO1xuICAgIFxuICAgIGlmIChxdWVyeVRva2Vucy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gICAgXG4gICAgY29uc3QgcmVzdWx0czogU2VhcmNoUmVzdWx0W10gPSBbXTtcbiAgICBjb25zdCBzZWVuUGF0aHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICBjb25zdCBtYXhSZXN1bHRzID0gb3B0aW9ucy5tYXhSZXN1bHRzIHx8IDIwO1xuICAgIFxuICAgIC8vIEhlbHBlciB0byBhZGQgdW5pcXVlIHJlc3VsdHNcbiAgICBjb25zdCBhZGRSZXN1bHQgPSAoZW50cnk6IEluZGV4RW50cnksIG1hdGNoVHlwZTogU2VhcmNoUmVzdWx0WydtYXRjaFR5cGUnXSwgc2NvcmU6IG51bWJlciA9IDEpID0+IHtcbiAgICAgIGlmICghc2VlblBhdGhzLmhhcyhlbnRyeS5maWxlUGF0aCkgJiYgcmVzdWx0cy5sZW5ndGggPCBtYXhSZXN1bHRzKSB7XG4gICAgICAgIC8vIEZpbHRlciBieSBlbGVtZW50IHR5cGUgaWYgc3BlY2lmaWVkXG4gICAgICAgIGlmIChvcHRpb25zLmVsZW1lbnRUeXBlICYmIGVudHJ5LmVsZW1lbnRUeXBlICE9PSBvcHRpb25zLmVsZW1lbnRUeXBlKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBzZWVuUGF0aHMuYWRkKGVudHJ5LmZpbGVQYXRoKTtcbiAgICAgICAgcmVzdWx0cy5wdXNoKHsgZW50cnksIG1hdGNoVHlwZSwgc2NvcmUgfSk7XG4gICAgICB9XG4gICAgfTtcbiAgICBcbiAgICAvLyAxLiBTZWFyY2ggYnkgbmFtZSAoaGlnaGVzdCBwcmlvcml0eSlcbiAgICBmb3IgKGNvbnN0IFtuYW1lLCBlbnRyeV0gb2YgaW5kZXguYnlOYW1lKSB7XG4gICAgICBpZiAodGhpcy5tYXRjaGVzUXVlcnkobmFtZSwgcXVlcnlUb2tlbnMpKSB7XG4gICAgICAgIGFkZFJlc3VsdChlbnRyeSwgJ25hbWUnLCAzKTtcbiAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgLy8gMi4gU2VhcmNoIGJ5IGZpbGVuYW1lXG4gICAgZm9yIChjb25zdCBbZmlsZW5hbWUsIGVudHJ5XSBvZiBpbmRleC5ieUZpbGVuYW1lKSB7XG4gICAgICBpZiAodGhpcy5tYXRjaGVzUXVlcnkoZmlsZW5hbWUsIHF1ZXJ5VG9rZW5zKSkge1xuICAgICAgICBhZGRSZXN1bHQoZW50cnksICdmaWxlbmFtZScsIDIuNSk7XG4gICAgICB9XG4gICAgfVxuICAgIFxuICAgIC8vIDMuIFNlYXJjaCBieSBrZXl3b3Jkc1xuICAgIGlmIChvcHRpb25zLmluY2x1ZGVLZXl3b3JkcyAhPT0gZmFsc2UpIHtcbiAgICAgIGZvciAoY29uc3QgW2tleXdvcmQsIGVudHJpZXNdIG9mIGluZGV4LmJ5S2V5d29yZCkge1xuICAgICAgICBpZiAodGhpcy5tYXRjaGVzUXVlcnkoa2V5d29yZCwgcXVlcnlUb2tlbnMpKSB7XG4gICAgICAgICAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSB7XG4gICAgICAgICAgICBhZGRSZXN1bHQoZW50cnksICdrZXl3b3JkJywgMik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIFxuICAgIC8vIDQuIFNlYXJjaCBieSB0YWdzXG4gICAgaWYgKG9wdGlvbnMuaW5jbHVkZVRhZ3MgIT09IGZhbHNlKSB7XG4gICAgICBmb3IgKGNvbnN0IFt0YWcsIGVudHJpZXNdIG9mIGluZGV4LmJ5VGFnKSB7XG4gICAgICAgIGlmICh0aGlzLm1hdGNoZXNRdWVyeSh0YWcsIHF1ZXJ5VG9rZW5zKSkge1xuICAgICAgICAgIGZvciAoY29uc3QgZW50cnkgb2YgZW50cmllcykge1xuICAgICAgICAgICAgYWRkUmVzdWx0KGVudHJ5LCAndGFnJywgMik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIFxuICAgIC8vIDUuIFNlYXJjaCBieSB0cmlnZ2Vyc1xuICAgIGlmIChvcHRpb25zLmluY2x1ZGVUcmlnZ2VycyAhPT0gZmFsc2UpIHtcbiAgICAgIGZvciAoY29uc3QgW3RyaWdnZXIsIGVudHJpZXNdIG9mIGluZGV4LmJ5VHJpZ2dlcikge1xuICAgICAgICBpZiAodGhpcy5tYXRjaGVzUXVlcnkodHJpZ2dlciwgcXVlcnlUb2tlbnMpKSB7XG4gICAgICAgICAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSB7XG4gICAgICAgICAgICBhZGRSZXN1bHQoZW50cnksICd0cmlnZ2VyJywgMS44KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgLy8gNi4gU2VhcmNoIGJ5IGRlc2NyaXB0aW9uXG4gICAgaWYgKG9wdGlvbnMuaW5jbHVkZURlc2NyaXB0aW9ucyAhPT0gZmFsc2UpIHtcbiAgICAgIGZvciAoY29uc3QgWywgZW50cnldIG9mIGluZGV4LmJ5TmFtZSkge1xuICAgICAgICBpZiAoZW50cnkubWV0YWRhdGEuZGVzY3JpcHRpb24gJiYgXG4gICAgICAgICAgICB0aGlzLm1hdGNoZXNRdWVyeShlbnRyeS5tZXRhZGF0YS5kZXNjcmlwdGlvbi50b0xvd2VyQ2FzZSgpLCBxdWVyeVRva2VucykpIHtcbiAgICAgICAgICBhZGRSZXN1bHQoZW50cnksICdkZXNjcmlwdGlvbicsIDEuNSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgLy8gU29ydCBieSBzY29yZSAoZGVzY2VuZGluZylcbiAgICByZXN1bHRzLnNvcnQoKGEsIGIpID0+IGIuc2NvcmUgLSBhLnNjb3JlKTtcbiAgICBcbiAgICBsb2dnZXIuZGVidWcoJ1BvcnRmb2xpbyBzZWFyY2ggY29tcGxldGVkJywge1xuICAgICAgcXVlcnk6IHNhZmVRdWVyeSxcbiAgICAgIHJlc3VsdENvdW50OiByZXN1bHRzLmxlbmd0aCxcbiAgICAgIHRvdGFsSW5kZXhlZDogaW5kZXguYnlOYW1lLnNpemVcbiAgICB9KTtcbiAgICBcbiAgICByZXR1cm4gcmVzdWx0cztcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYWxsIGVsZW1lbnRzIG9mIGEgc3BlY2lmaWMgdHlwZVxuICAgKi9cbiAgcHVibGljIGFzeW5jIGdldEVsZW1lbnRzQnlUeXBlKGVsZW1lbnRUeXBlOiBFbGVtZW50VHlwZSk6IFByb21pc2U8SW5kZXhFbnRyeVtdPiB7XG4gICAgY29uc3QgaW5kZXggPSBhd2FpdCB0aGlzLmdldEluZGV4KCk7XG4gICAgcmV0dXJuIGluZGV4LmJ5VHlwZS5nZXQoZWxlbWVudFR5cGUpIHx8IFtdO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBzdGF0aXN0aWNzIGFib3V0IHRoZSBpbmRleFxuICAgKi9cbiAgcHVibGljIGFzeW5jIGdldFN0YXRzKCk6IFByb21pc2U8e1xuICAgIHRvdGFsRWxlbWVudHM6IG51bWJlcjtcbiAgICBlbGVtZW50c0J5VHlwZTogUmVjb3JkPEVsZW1lbnRUeXBlLCBudW1iZXI+O1xuICAgIGxhc3RCdWlsdDogRGF0ZSB8IG51bGw7XG4gICAgaXNTdGFsZTogYm9vbGVhbjtcbiAgfT4ge1xuICAgIGNvbnN0IGluZGV4ID0gYXdhaXQgdGhpcy5nZXRJbmRleCgpO1xuICAgIGNvbnN0IHN0YXRzID0ge1xuICAgICAgdG90YWxFbGVtZW50czogaW5kZXguYnlOYW1lLnNpemUsXG4gICAgICBlbGVtZW50c0J5VHlwZToge30gYXMgUmVjb3JkPEVsZW1lbnRUeXBlLCBudW1iZXI+LFxuICAgICAgbGFzdEJ1aWx0OiB0aGlzLmxhc3RCdWlsdCxcbiAgICAgIGlzU3RhbGU6IHRoaXMubmVlZHNSZWJ1aWxkKClcbiAgICB9O1xuICAgIFxuICAgIGZvciAoY29uc3QgZWxlbWVudFR5cGUgb2YgT2JqZWN0LnZhbHVlcyhFbGVtZW50VHlwZSkpIHtcbiAgICAgIHN0YXRzLmVsZW1lbnRzQnlUeXBlW2VsZW1lbnRUeXBlXSA9IChpbmRleC5ieVR5cGUuZ2V0KGVsZW1lbnRUeXBlKSB8fCBbXSkubGVuZ3RoO1xuICAgIH1cbiAgICBcbiAgICByZXR1cm4gc3RhdHM7XG4gIH1cblxuICAvKipcbiAgICogRm9yY2UgcmVidWlsZCB0aGUgaW5kZXhcbiAgICovXG4gIHB1YmxpYyBhc3luYyByZWJ1aWxkSW5kZXgoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5pbmRleCA9IG51bGw7XG4gICAgdGhpcy5sYXN0QnVpbHQgPSBudWxsO1xuICAgIGF3YWl0IHRoaXMuYnVpbGRJbmRleCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIHRoZSBpbmRleCBuZWVkcyByZWJ1aWxkaW5nXG4gICAqL1xuICBwcml2YXRlIG5lZWRzUmVidWlsZCgpOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMuaW5kZXggfHwgIXRoaXMubGFzdEJ1aWx0KSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgXG4gICAgY29uc3QgYWdlID0gRGF0ZS5ub3coKSAtIHRoaXMubGFzdEJ1aWx0LmdldFRpbWUoKTtcbiAgICByZXR1cm4gYWdlID4gdGhpcy5UVExfTVM7XG4gIH1cblxuICAvKipcbiAgICogQnVpbGQgdGhlIGluZGV4IGJ5IHNjYW5uaW5nIGFsbCBwb3J0Zm9saW8gZGlyZWN0b3JpZXNcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgYnVpbGRJbmRleCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyBQcmV2ZW50IGNvbmN1cnJlbnQgYnVpbGRzXG4gICAgaWYgKHRoaXMuaXNCdWlsZGluZykge1xuICAgICAgaWYgKHRoaXMuYnVpbGRQcm9taXNlKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuYnVpbGRQcm9taXNlO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBcbiAgICB0aGlzLmlzQnVpbGRpbmcgPSB0cnVlO1xuICAgIFxuICAgIHRoaXMuYnVpbGRQcm9taXNlID0gdGhpcy5wZXJmb3JtQnVpbGQoKTtcbiAgICBcbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5idWlsZFByb21pc2U7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMuaXNCdWlsZGluZyA9IGZhbHNlO1xuICAgICAgdGhpcy5idWlsZFByb21pc2UgPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBQZXJmb3JtIHRoZSBhY3R1YWwgaW5kZXggYnVpbGRpbmdcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcGVyZm9ybUJ1aWxkKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHN0YXJ0VGltZSA9IERhdGUubm93KCk7XG4gICAgbG9nZ2VyLmluZm8oJ0J1aWxkaW5nIHBvcnRmb2xpbyBpbmRleC4uLicpO1xuICAgIFxuICAgIHRyeSB7XG4gICAgICBjb25zdCBwb3J0Zm9saW9NYW5hZ2VyID0gdGhpcy5wb3J0Zm9saW9NYW5hZ2VyO1xuXG4gICAgICAvLyBJbml0aWFsaXplIGVtcHR5IGluZGV4XG4gICAgICBjb25zdCBuZXdJbmRleDogUG9ydGZvbGlvSW5kZXggPSB7XG4gICAgICAgIGJ5TmFtZTogbmV3IE1hcCgpLFxuICAgICAgICBieUZpbGVuYW1lOiBuZXcgTWFwKCksXG4gICAgICAgIGJ5VHlwZTogbmV3IE1hcCgpLFxuICAgICAgICBieUtleXdvcmQ6IG5ldyBNYXAoKSxcbiAgICAgICAgYnlUYWc6IG5ldyBNYXAoKSxcbiAgICAgICAgYnlUcmlnZ2VyOiBuZXcgTWFwKClcbiAgICAgIH07XG4gICAgICBcbiAgICAgIC8vIEluaXRpYWxpemUgdHlwZSBtYXBzXG4gICAgICBmb3IgKGNvbnN0IGVsZW1lbnRUeXBlIG9mIE9iamVjdC52YWx1ZXMoRWxlbWVudFR5cGUpKSB7XG4gICAgICAgIG5ld0luZGV4LmJ5VHlwZS5zZXQoZWxlbWVudFR5cGUsIFtdKTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgbGV0IHRvdGFsRmlsZXMgPSAwO1xuICAgICAgbGV0IHByb2Nlc3NlZEZpbGVzID0gMDtcbiAgICAgIFxuICAgICAgLy8gU2NhbiBlYWNoIGVsZW1lbnQgdHlwZVxuICAgICAgZm9yIChjb25zdCBlbGVtZW50VHlwZSBvZiBPYmplY3QudmFsdWVzKEVsZW1lbnRUeXBlKSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IGVsZW1lbnREaXIgPSBwb3J0Zm9saW9NYW5hZ2VyLmdldEVsZW1lbnREaXIoZWxlbWVudFR5cGUpO1xuXG4gICAgICAgICAgLy8gQ2hlY2sgaWYgZGlyZWN0b3J5IGV4aXN0c1xuICAgICAgICAgIGNvbnN0IGRpckV4aXN0cyA9IGF3YWl0IHRoaXMuZmlsZU9wZXJhdGlvbnMuZXhpc3RzKGVsZW1lbnREaXIpO1xuICAgICAgICAgIGlmICghZGlyRXhpc3RzKSB7XG4gICAgICAgICAgICBsb2dnZXIuZGVidWcoYEVsZW1lbnQgZGlyZWN0b3J5IGRvZXNuJ3QgZXhpc3Q6ICR7ZWxlbWVudERpcn1gKTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIEZJWCAjMTE4ODogU3BlY2lhbCBoYW5kbGluZyBmb3IgbWVtb3JpZXMgLSBzY2FuIC55YW1sIGZpbGVzIGluIGRhdGUgZm9sZGVyc1xuICAgICAgICAgIGlmIChlbGVtZW50VHlwZSA9PT0gRWxlbWVudFR5cGUuTUVNT1JZKSB7XG4gICAgICAgICAgICAvLyBNZW1vcmllcyBhcmUgc3RvcmVkIGluIGRhdGUgZm9sZGVycyAoWVlZWS1NTS1ERCkgYXMgLnlhbWwgZmlsZXNcbiAgICAgICAgICAgIGNvbnN0IGVudHJ5TmFtZXMgPSBhd2FpdCB0aGlzLmZpbGVPcGVyYXRpb25zLmxpc3REaXJlY3RvcnkoZWxlbWVudERpcik7XG5cbiAgICAgICAgICAgIC8vIFNlcGFyYXRlIGRpcmVjdG9yaWVzIGZyb20gZmlsZXNcbiAgICAgICAgICAgIGNvbnN0IGRpcmVjdG9yaWVzOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICAgICAgY29uc3Qgcm9vdFlhbWxGaWxlczogc3RyaW5nW10gPSBbXTtcblxuICAgICAgICAgICAgZm9yIChjb25zdCBlbnRyeU5hbWUgb2YgZW50cnlOYW1lcykge1xuICAgICAgICAgICAgICBjb25zdCBlbnRyeVBhdGggPSBwYXRoLmpvaW4oZWxlbWVudERpciwgZW50cnlOYW1lKTtcbiAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBjb25zdCBlbnRyeVN0YXQgPSBhd2FpdCB0aGlzLmZpbGVPcGVyYXRpb25zLnN0YXQoZW50cnlQYXRoKTtcbiAgICAgICAgICAgICAgICBpZiAoZW50cnlTdGF0LmlzRGlyZWN0b3J5KCkpIHtcbiAgICAgICAgICAgICAgICAgIGRpcmVjdG9yaWVzLnB1c2goZW50cnlOYW1lKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGVudHJ5TmFtZS5lbmRzV2l0aCgnLnlhbWwnKSkge1xuICAgICAgICAgICAgICAgICAgcm9vdFlhbWxGaWxlcy5wdXNoKGVudHJ5TmFtZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgICAgICAvLyBTa2lwIGVudHJpZXMgd2UgY2FuJ3Qgc3RhdFxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZvciAoY29uc3QgZmlsZSBvZiByb290WWFtbEZpbGVzKSB7XG4gICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLmpvaW4oZWxlbWVudERpciwgZmlsZSk7XG4gICAgICAgICAgICAgICAgY29uc3QgZW50cnkgPSBhd2FpdCB0aGlzLmNyZWF0ZU1lbW9yeUluZGV4RW50cnkoZmlsZVBhdGgsIGVsZW1lbnRUeXBlKTtcblxuICAgICAgICAgICAgICAgIGlmIChlbnRyeSkge1xuICAgICAgICAgICAgICAgICAgdGhpcy5hZGRUb0luZGV4KG5ld0luZGV4LCBlbnRyeSk7XG4gICAgICAgICAgICAgICAgICBwcm9jZXNzZWRGaWxlcysrO1xuICAgICAgICAgICAgICAgICAgdG90YWxGaWxlcysrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICBsb2dnZXIud2FybihgRmFpbGVkIHRvIGluZGV4IHJvb3QgbWVtb3J5IGZpbGVgLCB7XG4gICAgICAgICAgICAgICAgICBmaWxlLFxuICAgICAgICAgICAgICAgICAgcGF0aDogcGF0aC5qb2luKGVsZW1lbnREaXIsIGZpbGUpLFxuICAgICAgICAgICAgICAgICAgbG9jYXRpb246ICdyb290JyxcbiAgICAgICAgICAgICAgICAgIGVycm9yOiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvciksXG4gICAgICAgICAgICAgICAgICBlcnJvclR5cGU6IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5jb25zdHJ1Y3Rvci5uYW1lIDogdHlwZW9mIGVycm9yXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gVGhlbiBwcm9jZXNzIGRhdGUgZm9sZGVyc1xuICAgICAgICAgICAgY29uc3QgZGF0ZUZvbGRlcnMgPSBkaXJlY3Rvcmllcy5maWx0ZXIobmFtZSA9PiAvXlxcZHs0fS1cXGR7Mn0tXFxkezJ9JC8udGVzdChuYW1lKSk7XG5cbiAgICAgICAgICAgIGZvciAoY29uc3QgZGF0ZUZvbGRlciBvZiBkYXRlRm9sZGVycykge1xuICAgICAgICAgICAgICBjb25zdCBmb2xkZXJQYXRoID0gcGF0aC5qb2luKGVsZW1lbnREaXIsIGRhdGVGb2xkZXIpO1xuICAgICAgICAgICAgICBjb25zdCBmb2xkZXJFbnRyeU5hbWVzID0gYXdhaXQgdGhpcy5maWxlT3BlcmF0aW9ucy5saXN0RGlyZWN0b3J5KGZvbGRlclBhdGgpO1xuXG4gICAgICAgICAgICAgIC8vIFNlcGFyYXRlIGRpcmVjdG9yaWVzIGZyb20gZmlsZXMgaW4gZGF0ZSBmb2xkZXJcbiAgICAgICAgICAgICAgY29uc3Qgc3ViRGlyczogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgICAgICAgY29uc3QgeWFtbEZpbGVzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgICAgICAgICAgIGZvciAoY29uc3QgZm9sZGVyRW50cnlOYW1lIG9mIGZvbGRlckVudHJ5TmFtZXMpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBmb2xkZXJFbnRyeVBhdGggPSBwYXRoLmpvaW4oZm9sZGVyUGF0aCwgZm9sZGVyRW50cnlOYW1lKTtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgY29uc3QgZm9sZGVyRW50cnlTdGF0ID0gYXdhaXQgdGhpcy5maWxlT3BlcmF0aW9ucy5zdGF0KGZvbGRlckVudHJ5UGF0aCk7XG4gICAgICAgICAgICAgICAgICBpZiAoZm9sZGVyRW50cnlTdGF0LmlzRGlyZWN0b3J5KCkpIHtcbiAgICAgICAgICAgICAgICAgICAgc3ViRGlycy5wdXNoKGZvbGRlckVudHJ5TmFtZSk7XG4gICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGZvbGRlckVudHJ5TmFtZS5lbmRzV2l0aCgnLnlhbWwnKSkge1xuICAgICAgICAgICAgICAgICAgICB5YW1sRmlsZXMucHVzaChmb2xkZXJFbnRyeU5hbWUpO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgICAgICAgLy8gU2tpcCBlbnRyaWVzIHdlIGNhbid0IHN0YXRcbiAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGZvciAoY29uc3QgZmlsZSBvZiB5YW1sRmlsZXMpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLmpvaW4oZm9sZGVyUGF0aCwgZmlsZSk7XG4gICAgICAgICAgICAgICAgICBjb25zdCBlbnRyeSA9IGF3YWl0IHRoaXMuY3JlYXRlTWVtb3J5SW5kZXhFbnRyeShmaWxlUGF0aCwgZWxlbWVudFR5cGUpO1xuXG4gICAgICAgICAgICAgICAgICBpZiAoZW50cnkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRUb0luZGV4KG5ld0luZGV4LCBlbnRyeSk7XG4gICAgICAgICAgICAgICAgICAgIHByb2Nlc3NlZEZpbGVzKys7XG4gICAgICAgICAgICAgICAgICAgIHRvdGFsRmlsZXMrKztcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgbG9nZ2VyLndhcm4oYEZhaWxlZCB0byBpbmRleCBkYXRlIGZvbGRlciBtZW1vcnkgZmlsZWAsIHtcbiAgICAgICAgICAgICAgICAgICAgZmlsZSxcbiAgICAgICAgICAgICAgICAgICAgcGF0aDogcGF0aC5qb2luKGZvbGRlclBhdGgsIGZpbGUpLFxuICAgICAgICAgICAgICAgICAgICBkYXRlRm9sZGVyLFxuICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbjogJ2RhdGUtZm9sZGVyJyxcbiAgICAgICAgICAgICAgICAgICAgZXJyb3I6IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKSxcbiAgICAgICAgICAgICAgICAgICAgZXJyb3JUeXBlOiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IuY29uc3RydWN0b3IubmFtZSA6IHR5cGVvZiBlcnJvclxuICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgLy8gRklYICMxMTg4OiBQcm9jZXNzIHN1YmRpcmVjdG9yaWVzIGZvciBzaGFyZGVkIG1lbW9yaWVzXG4gICAgICAgICAgICAgIC8vIExhcmdlIG1lbW9yaWVzIGFyZSBzdG9yZWQgYXMgc2hhcmRzIGluIG5hbWVkIHN1YmRpcmVjdG9yaWVzXG4gICAgICAgICAgICAgIGZvciAoY29uc3Qgc3ViRGlyIG9mIHN1YkRpcnMpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBzdWJEaXJQYXRoID0gcGF0aC5qb2luKGZvbGRlclBhdGgsIHN1YkRpcik7XG4gICAgICAgICAgICAgICAgY29uc3Qgc2hhcmRGaWxlcyA9IGF3YWl0IHRoaXMuZmlsZU9wZXJhdGlvbnMubGlzdERpcmVjdG9yeShzdWJEaXJQYXRoKTtcbiAgICAgICAgICAgICAgICBjb25zdCBzaGFyZFlhbWxGaWxlcyA9IHNoYXJkRmlsZXMuZmlsdGVyKGZpbGUgPT4gZmlsZS5lbmRzV2l0aCgnLnlhbWwnKSk7XG5cbiAgICAgICAgICAgICAgICAvLyBGb3Igc2hhcmRlZCBtZW1vcmllcywgbG9vayBmb3IgbWV0YWRhdGEueWFtbCBvciB0aGUgbWFpbiBmaWxlXG4gICAgICAgICAgICAgICAgLy8gSWYgbm90IGZvdW5kLCB1c2UgdGhlIGZpcnN0IHNoYXJkIGFzIHJlcHJlc2VudGF0aXZlXG4gICAgICAgICAgICAgICAgbGV0IG1ldGFkYXRhRmlsZSA9IHNoYXJkWWFtbEZpbGVzLmZpbmQoZiA9PiBmID09PSAnbWV0YWRhdGEueWFtbCcpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXJkWWFtbEZpbGVzLmZpbmQoZiA9PiBmID09PSBgJHtzdWJEaXJ9LnlhbWxgKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFyZFlhbWxGaWxlc1swXTtcblxuICAgICAgICAgICAgICAgIGlmIChtZXRhZGF0YUZpbGUpIHtcbiAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5qb2luKHN1YkRpclBhdGgsIG1ldGFkYXRhRmlsZSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGVudHJ5ID0gYXdhaXQgdGhpcy5jcmVhdGVNZW1vcnlJbmRleEVudHJ5KGZpbGVQYXRoLCBlbGVtZW50VHlwZSk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGVudHJ5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgLy8gTWFyayBhcyBzaGFyZGVkIG1lbW9yeSBpbiBtZXRhZGF0YVxuICAgICAgICAgICAgICAgICAgICAgIGVudHJ5Lm1ldGFkYXRhLmtleXdvcmRzID0gZW50cnkubWV0YWRhdGEua2V5d29yZHMgfHwgW107XG4gICAgICAgICAgICAgICAgICAgICAgaWYgKCFlbnRyeS5tZXRhZGF0YS5rZXl3b3Jkcy5pbmNsdWRlcygnc2hhcmRlZCcpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbnRyeS5tZXRhZGF0YS5rZXl3b3Jkcy5wdXNoKCdzaGFyZGVkJyk7XG4gICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgLy8gQ3JlYXRlIHByb3Blcmx5IHR5cGVkIHNoYXJkZWQgZW50cnlcbiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaGFyZGVkRW50cnk6IFNoYXJkZWRNZW1vcnlJbmRleEVudHJ5ID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgLi4uZW50cnksXG4gICAgICAgICAgICAgICAgICAgICAgICBzaGFyZEluZm86IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmRDb3VudDogc2hhcmRZYW1sRmlsZXMubGVuZ3RoLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFyZERpcjogcGF0aC5qb2luKGRhdGVGb2xkZXIsIHN1YkRpciksXG4gICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhRmlsZTogbWV0YWRhdGFGaWxlXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkVG9JbmRleChuZXdJbmRleCwgc2hhcmRlZEVudHJ5KTtcbiAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzZWRGaWxlcysrO1xuICAgICAgICAgICAgICAgICAgICAgIHRvdGFsRmlsZXMrKztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLndhcm4oYEZhaWxlZCB0byBpbmRleCBzaGFyZGVkIG1lbW9yeWAsIHtcbiAgICAgICAgICAgICAgICAgICAgICBzdWJEaXIsXG4gICAgICAgICAgICAgICAgICAgICAgZGF0ZUZvbGRlcixcbiAgICAgICAgICAgICAgICAgICAgICBwYXRoOiBwYXRoLmpvaW4oc3ViRGlyUGF0aCwgbWV0YWRhdGFGaWxlKSxcbiAgICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YUZpbGUsXG4gICAgICAgICAgICAgICAgICAgICAgc2hhcmRDb3VudDogc2hhcmRZYW1sRmlsZXMubGVuZ3RoLFxuICAgICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uOiAnc2hhcmRlZC1zdWJkaXJlY3RvcnknLFxuICAgICAgICAgICAgICAgICAgICAgIGVycm9yOiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvciksXG4gICAgICAgICAgICAgICAgICAgICAgZXJyb3JUeXBlOiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IuY29uc3RydWN0b3IubmFtZSA6IHR5cGVvZiBlcnJvcixcbiAgICAgICAgICAgICAgICAgICAgICBzaGFyZEZpbGVzOiBzaGFyZFlhbWxGaWxlcy5zbGljZSgwLCA1KSAvLyBMb2cgZmlyc3QgNSBzaGFyZCBmaWxlcyBmb3IgY29udGV4dFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gU3RhbmRhcmQgaGFuZGxpbmcgZm9yIG90aGVyIGVsZW1lbnQgdHlwZXMgKC5tZCBmaWxlcyBpbiByb290KVxuICAgICAgICAgICAgY29uc3QgZmlsZXMgPSBhd2FpdCB0aGlzLmZpbGVPcGVyYXRpb25zLmxpc3REaXJlY3RvcnkoZWxlbWVudERpcik7XG4gICAgICAgICAgICBjb25zdCBtZEZpbGVzID0gZmlsZXMuZmlsdGVyKGZpbGUgPT4gZmlsZS5lbmRzV2l0aCgnLm1kJykpO1xuICAgICAgICAgICAgdG90YWxGaWxlcyArPSBtZEZpbGVzLmxlbmd0aDtcblxuICAgICAgICAgICAgZm9yIChjb25zdCBmaWxlIG9mIG1kRmlsZXMpIHtcbiAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGguam9pbihlbGVtZW50RGlyLCBmaWxlKTtcbiAgICAgICAgICAgICAgICBjb25zdCBlbnRyeSA9IGF3YWl0IHRoaXMuY3JlYXRlSW5kZXhFbnRyeShmaWxlUGF0aCwgZWxlbWVudFR5cGUpO1xuXG4gICAgICAgICAgICAgICAgaWYgKGVudHJ5KSB7XG4gICAgICAgICAgICAgICAgICB0aGlzLmFkZFRvSW5kZXgobmV3SW5kZXgsIGVudHJ5KTtcbiAgICAgICAgICAgICAgICAgIHByb2Nlc3NlZEZpbGVzKys7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuKGBGYWlsZWQgdG8gaW5kZXggZmlsZTogJHtmaWxlfWAsIHtcbiAgICAgICAgICAgICAgICAgIGVsZW1lbnRUeXBlLFxuICAgICAgICAgICAgICAgICAgZXJyb3I6IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGxvZ2dlci5lcnJvcihgRmFpbGVkIHRvIHNjYW4gZWxlbWVudCB0eXBlOiAke2VsZW1lbnRUeXBlfWAsIHtcbiAgICAgICAgICAgIGVycm9yOiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcilcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBVcGRhdGUgaW5zdGFuY2Ugc3RhdGVcbiAgICAgIHRoaXMuaW5kZXggPSBuZXdJbmRleDtcbiAgICAgIHRoaXMubGFzdEJ1aWx0ID0gbmV3IERhdGUoKTtcbiAgICAgIFxuICAgICAgY29uc3QgZHVyYXRpb24gPSBEYXRlLm5vdygpIC0gc3RhcnRUaW1lO1xuICAgICAgbG9nZ2VyLmluZm8oJ1BvcnRmb2xpbyBpbmRleCBidWlsdCBzdWNjZXNzZnVsbHknLCB7XG4gICAgICAgIHRvdGFsRmlsZXMsXG4gICAgICAgIHByb2Nlc3NlZEZpbGVzLFxuICAgICAgICBkdXJhdGlvbjogYCR7ZHVyYXRpb259bXNgLFxuICAgICAgICB1bmlxdWVOYW1lczogbmV3SW5kZXguYnlOYW1lLnNpemUsXG4gICAgICAgIHVuaXF1ZUtleXdvcmRzOiBuZXdJbmRleC5ieUtleXdvcmQuc2l6ZSxcbiAgICAgICAgdW5pcXVlVGFnczogbmV3SW5kZXguYnlUYWcuc2l6ZVxuICAgICAgfSk7XG4gICAgICBcbiAgICAgIC8vIExvZyBzZWN1cml0eSBldmVudCBmb3IgYXVkaXQgdHJhaWxcbiAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgdHlwZTogJ1BPUlRGT0xJT19JTklUSUFMSVpBVElPTicsXG4gICAgICAgIHNldmVyaXR5OiAnTE9XJyxcbiAgICAgICAgc291cmNlOiAnUG9ydGZvbGlvSW5kZXhNYW5hZ2VyLnBlcmZvcm1CdWlsZCcsXG4gICAgICAgIGRldGFpbHM6IGBQb3J0Zm9saW8gaW5kZXggcmVidWlsdCB3aXRoICR7cHJvY2Vzc2VkRmlsZXN9IGVsZW1lbnRzIGluICR7ZHVyYXRpb259bXNgXG4gICAgICB9KTtcbiAgICAgIFxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBFcnJvckhhbmRsZXIubG9nRXJyb3IoJ1BvcnRmb2xpb0luZGV4TWFuYWdlci5wZXJmb3JtQnVpbGQnLCBlcnJvcik7XG4gICAgICB0aHJvdyBFcnJvckhhbmRsZXIud3JhcEVycm9yKGVycm9yLCAnRmFpbGVkIHRvIGJ1aWxkIHBvcnRmb2xpbyBpbmRleCcsIEVycm9yQ2F0ZWdvcnkuU1lTVEVNX0VSUk9SKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGFuIGluZGV4IGVudHJ5IGZyb20gYSBmaWxlXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGNyZWF0ZUluZGV4RW50cnkoZmlsZVBhdGg6IHN0cmluZywgZWxlbWVudFR5cGU6IEVsZW1lbnRUeXBlKTogUHJvbWlzZTxJbmRleEVudHJ5IHwgbnVsbD4ge1xuICAgIHRyeSB7XG4gICAgICAvLyBHZXQgZmlsZSBzdGF0c1xuICAgICAgY29uc3Qgc3RhdHMgPSBhd2FpdCB0aGlzLmZpbGVPcGVyYXRpb25zLnN0YXQoZmlsZVBhdGgpO1xuXG4gICAgICAvLyBSZWFkIGZpbGUgY29udGVudFxuICAgICAgY29uc3QgY29udGVudCA9IGF3YWl0IHRoaXMuZmlsZU9wZXJhdGlvbnMucmVhZEZpbGUoZmlsZVBhdGgsIHsgc291cmNlOiAnUG9ydGZvbGlvSW5kZXhNYW5hZ2VyLmNyZWF0ZUluZGV4RW50cnknIH0pO1xuXG4gICAgICAvLyBQYXJzZSBmcm9udG1hdHRlciBzZWN1cmVseVxuICAgICAgLy8gU0VDVVJJVFkgTk9URTogUG9ydGZvbGlvIGZpbGVzIGFyZSBsb2NhbGx5IHRydXN0ZWQgY29udGVudCB0aGF0IHVzZXJzXG4gICAgICAvLyBoYXZlIGRlbGliZXJhdGVseSBjcmVhdGVkIG9yIGluc3RhbGxlZC4gU2VjdXJpdHkgdmFsaWRhdGlvbiBzaG91bGQgZm9jdXNcbiAgICAgIC8vIG9uIEJFSEFWSU9SQUwgYW5hbHlzaXMgZHVyaW5nIGltcG9ydC9pbnN0YWxsYXRpb24sIG5vdCBzdXBlcmZpY2lhbCB3b3JkXG4gICAgICAvLyBtYXRjaGluZyBpbiBkZXNjcmlwdGlvbnMuIEEgbWFsaWNpb3VzIGFjdG9yIHdvdWxkIG5ldmVyIGxhYmVsIHRoZWlyXG4gICAgICAvLyBleHBsb2l0IGFzIFwiZGFuZ2Vyb3VzXCIgLSB0aGV5J2QgY2FsbCBpdCBcImhlbHBmdWwgdXRpbGl0eVwiLlxuICAgICAgLy8gRnV0dXJlOiBBZGQgYmVoYXZpb3JhbCBhbmFseXNpcyBvbiBpbXBvcnQsIG5vdCBkdXJpbmcgaW5kZXhpbmcuXG4gICAgICBjb25zdCBwYXJzZWQgPSBTZWN1cmVZYW1sUGFyc2VyLnBhcnNlKGNvbnRlbnQsIHtcbiAgICAgICAgdmFsaWRhdGVDb250ZW50OiBmYWxzZSwgIC8vIERvbid0IHNjYW4gZm9yIHdvcmRzIGluIHRydXN0ZWQgbG9jYWwgZmlsZXNcbiAgICAgICAgdmFsaWRhdGVGaWVsZHM6IGZhbHNlICAgIC8vIFBvcnRmb2xpbyBmaWxlcyBhcmUgcHJlLXRydXN0ZWQgYnkgdXNlciBjaG9pY2VcbiAgICAgIH0pO1xuICAgICAgXG4gICAgICAvLyBFeHRyYWN0IGJhc2UgZmlsZW5hbWVcbiAgICAgIGNvbnN0IGZpbGVuYW1lID0gcGF0aC5iYXNlbmFtZShmaWxlUGF0aCwgJy5tZCcpO1xuICAgICAgXG4gICAgICAvLyBCdWlsZCBtZXRhZGF0YSB3aXRoIGRlZmF1bHRzXG4gICAgICBjb25zdCBtZXRhZGF0YSA9IHtcbiAgICAgICAgbmFtZTogcGFyc2VkLmRhdGEubmFtZSB8fCBmaWxlbmFtZSxcbiAgICAgICAgZGVzY3JpcHRpb246IHBhcnNlZC5kYXRhLmRlc2NyaXB0aW9uLFxuICAgICAgICB2ZXJzaW9uOiBwYXJzZWQuZGF0YS52ZXJzaW9uLFxuICAgICAgICBhdXRob3I6IHBhcnNlZC5kYXRhLmF1dGhvcixcbiAgICAgICAgdGFnczogQXJyYXkuaXNBcnJheShwYXJzZWQuZGF0YS50YWdzKSA/IHBhcnNlZC5kYXRhLnRhZ3MgOiBbXSxcbiAgICAgICAga2V5d29yZHM6IEFycmF5LmlzQXJyYXkocGFyc2VkLmRhdGEua2V5d29yZHMpID8gcGFyc2VkLmRhdGEua2V5d29yZHMgOiBbXSxcbiAgICAgICAgdHJpZ2dlcnM6IEFycmF5LmlzQXJyYXkocGFyc2VkLmRhdGEudHJpZ2dlcnMpID8gcGFyc2VkLmRhdGEudHJpZ2dlcnMgOiBbXSxcbiAgICAgICAgY2F0ZWdvcnk6IHBhcnNlZC5kYXRhLmNhdGVnb3J5LFxuICAgICAgICBjcmVhdGVkOiBwYXJzZWQuZGF0YS5jcmVhdGVkIHx8IHBhcnNlZC5kYXRhLmNyZWF0ZWRfZGF0ZSxcbiAgICAgICAgdXBkYXRlZDogcGFyc2VkLmRhdGEudXBkYXRlZCB8fCBwYXJzZWQuZGF0YS51cGRhdGVkX2RhdGUsXG4gICAgICAgIC8vIElzc3VlICM3NDk6IENhcnJ5IGFnZW50IGBhY3RpdmF0ZXNgIHRocm91Z2ggdG8gaW5kZXggYnVpbGRlciBmb3IgcmVsYXRpb25zaGlwIGV4dHJhY3Rpb25cbiAgICAgICAgLi4uKHBhcnNlZC5kYXRhLmFjdGl2YXRlcyAmJiB0eXBlb2YgcGFyc2VkLmRhdGEuYWN0aXZhdGVzID09PSAnb2JqZWN0J1xuICAgICAgICAgID8geyBhY3RpdmF0ZXM6IHBhcnNlZC5kYXRhLmFjdGl2YXRlcyBhcyBSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT4gfVxuICAgICAgICAgIDoge30pXG4gICAgICB9O1xuXG4gICAgICBjb25zdCBlbnRyeTogSW5kZXhFbnRyeSA9IHtcbiAgICAgICAgZmlsZVBhdGgsXG4gICAgICAgIGVsZW1lbnRUeXBlLFxuICAgICAgICBtZXRhZGF0YSxcbiAgICAgICAgbGFzdE1vZGlmaWVkOiBzdGF0cy5tdGltZSxcbiAgICAgICAgZmlsZW5hbWVcbiAgICAgIH07XG4gICAgICBcbiAgICAgIHJldHVybiBlbnRyeTtcbiAgICAgIFxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2dnZXIuZGVidWcoYEZhaWxlZCB0byBjcmVhdGUgaW5kZXggZW50cnkgZm9yOiAke2ZpbGVQYXRofWAsIHtcbiAgICAgICAgZXJyb3I6IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKVxuICAgICAgfSk7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGFuIGluZGV4IGVudHJ5IGZyb20gYSBtZW1vcnkgWUFNTCBmaWxlXG4gICAqIEZJWCAjMTE4ODogU3BlY2lhbCBoYW5kbGluZyBmb3IgbWVtb3J5IGZpbGVzIHdpdGggZGlmZmVyZW50IHN0cnVjdHVyZVxuICAgKiBGSVggIzExOTY6IFVzZSB5YW1sLmxvYWQgZm9yIHB1cmUgWUFNTCBmaWxlcywgbm90IFNlY3VyZVlhbWxQYXJzZXIgKHdoaWNoIGV4cGVjdHMgTWFya2Rvd24gZnJvbnRtYXR0ZXIpXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGNyZWF0ZU1lbW9yeUluZGV4RW50cnkoZmlsZVBhdGg6IHN0cmluZywgZWxlbWVudFR5cGU6IEVsZW1lbnRUeXBlKTogUHJvbWlzZTxJbmRleEVudHJ5IHwgbnVsbD4ge1xuICAgIHRyeSB7XG4gICAgICAvLyBHZXQgZmlsZSBzdGF0c1xuICAgICAgY29uc3Qgc3RhdHMgPSBhd2FpdCB0aGlzLmZpbGVPcGVyYXRpb25zLnN0YXQoZmlsZVBhdGgpO1xuXG4gICAgICAvLyBSZWFkIGZpbGUgY29udGVudFxuICAgICAgY29uc3QgY29udGVudCA9IGF3YWl0IHRoaXMuZmlsZU9wZXJhdGlvbnMucmVhZEZpbGUoZmlsZVBhdGgsIHsgc291cmNlOiAnUG9ydGZvbGlvSW5kZXhNYW5hZ2VyLmNyZWF0ZU1lbW9yeUluZGV4RW50cnknIH0pO1xuXG4gICAgICAvLyBGSVggIzExOTY6IFBhcnNlIHB1cmUgWUFNTCB1c2luZyB5YW1sLmxvYWQoKVxuICAgICAgLy8gTWVtb3J5IGZpbGVzIGFyZSBwdXJlIFlBTUwgd2l0aG91dCBmcm9udG1hdHRlciBtYXJrZXJzLCBzbyB3ZSBjYW4ndCB1c2UgU2VjdXJlWWFtbFBhcnNlclxuICAgICAgLy8gKHdoaWNoIGlzIGRlc2lnbmVkIGZvciBNYXJrZG93biBmaWxlcyB3aXRoIFlBTUwgZnJvbnRtYXR0ZXIgYmV0d2VlbiAtLS0gbWFya2VycylcbiAgICAgIC8vIFVzaW5nIEZBSUxTQUZFX1NDSEVNQSBmb3Igc2VjdXJpdHkgKHNhbWUgYXMgTWVtb3J5TWFuYWdlciB1c2VzKVxuXG4gICAgICAvLyBTZWN1cml0eSB2YWxpZGF0aW9uOiBDaGVjayBjb250ZW50IHNpemUgYmVmb3JlIHBhcnNpbmdcbiAgICAgIGlmIChjb250ZW50Lmxlbmd0aCA+IDEwNDg1NzYpIHsgLy8gMU1CIGxpbWl0XG4gICAgICAgIGxvZ2dlci53YXJuKGBMYXJnZSBtZW1vcnkgZmlsZSBkZXRlY3RlZCwgc2tpcHBpbmc6ICR7ZmlsZVBhdGh9YCk7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgICBjb25zdCByYXdQYXJzZWQgPSB5YW1sLmxvYWQoY29udGVudCwge1xuICAgICAgICBzY2hlbWE6IHlhbWwuRkFJTFNBRkVfU0NIRU1BXG4gICAgICB9KTtcblxuICAgICAgLy8gVHlwZSBzYWZldHk6IEVuc3VyZSBwYXJzZWQgcmVzdWx0IGlzIGEgdmFsaWQgb2JqZWN0XG4gICAgICBpZiAoIXJhd1BhcnNlZCB8fCB0eXBlb2YgcmF3UGFyc2VkICE9PSAnb2JqZWN0JyB8fCBBcnJheS5pc0FycmF5KHJhd1BhcnNlZCkpIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oYEludmFsaWQgWUFNTCBzdHJ1Y3R1cmUgaW4gbWVtb3J5IGZpbGU6ICR7ZmlsZVBhdGh9YCk7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBwYXJzZWQgPSByYXdQYXJzZWQgYXMgUmVjb3JkPHN0cmluZywgYW55PjtcblxuICAgICAgLy8gRXh0cmFjdCBiYXNlIGZpbGVuYW1lXG4gICAgICBjb25zdCBmaWxlbmFtZSA9IHBhdGguYmFzZW5hbWUoZmlsZVBhdGgsICcueWFtbCcpO1xuXG4gICAgICAvLyBNZW1vcnkgZmlsZXMgY2FuIGhhdmUgbWV0YWRhdGEgYXQgdG9wIGxldmVsIE9SIG5lc3RlZCB1bmRlciAnbWV0YWRhdGEnIGtleVxuICAgICAgLy8gRklYICMxMTk2OiBNZXJnZSBib3RoIGxldmVscywgcHJlZmVycmluZyBuZXN0ZWQgbWV0YWRhdGEgYmxvY2sgb3ZlciB0b3AtbGV2ZWxcbiAgICAgIC8vIFRoaXMgaGFuZGxlcyBtaXhlZCBzdHJ1Y3R1cmVzIHdoZXJlIHNvbWUgZmllbGRzIGFyZSB0b3AtbGV2ZWwgYW5kIG90aGVycyBhcmUgbmVzdGVkXG4gICAgICBjb25zdCBtZXRhZGF0YVNvdXJjZSA9IHBhcnNlZC5tZXRhZGF0YVxuICAgICAgICA/IHsgLi4ucGFyc2VkLCAuLi5wYXJzZWQubWV0YWRhdGEgfSAgLy8gTWVyZ2UgdG9wLWxldmVsIHdpdGggbmVzdGVkLCBuZXN0ZWQgd2luc1xuICAgICAgICA6IHBhcnNlZDsgIC8vIE5vIG5lc3RlZCBtZXRhZGF0YSwgdXNlIHRvcC1sZXZlbCBvbmx5XG5cbiAgICAgIC8vIEJ1aWxkIG1ldGFkYXRhIHdpdGggbWVtb3J5LXNwZWNpZmljIGRlZmF1bHRzXG4gICAgICBjb25zdCBtZXRhZGF0YSA9IHtcbiAgICAgICAgbmFtZTogbWV0YWRhdGFTb3VyY2UubmFtZSB8fCBmaWxlbmFtZS5yZXBsYWNlQWxsKCctJywgJyAnKSxcbiAgICAgICAgZGVzY3JpcHRpb246IG1ldGFkYXRhU291cmNlLmRlc2NyaXB0aW9uIHx8ICdNZW1vcnkgZWxlbWVudCcsXG4gICAgICAgIHZlcnNpb246IG1ldGFkYXRhU291cmNlLnZlcnNpb24gfHwgJzEuMC4wJyxcbiAgICAgICAgYXV0aG9yOiBtZXRhZGF0YVNvdXJjZS5hdXRob3IsXG4gICAgICAgIHRhZ3M6IEFycmF5LmlzQXJyYXkobWV0YWRhdGFTb3VyY2UudGFncykgPyBtZXRhZGF0YVNvdXJjZS50YWdzIDogW10sXG4gICAgICAgIGtleXdvcmRzOiBBcnJheS5pc0FycmF5KG1ldGFkYXRhU291cmNlLmtleXdvcmRzKSA/IG1ldGFkYXRhU291cmNlLmtleXdvcmRzIDogW10sXG4gICAgICAgIHRyaWdnZXJzOiBBcnJheS5pc0FycmF5KG1ldGFkYXRhU291cmNlLnRyaWdnZXJzKSA/IG1ldGFkYXRhU291cmNlLnRyaWdnZXJzIDogW10sXG4gICAgICAgIGNhdGVnb3J5OiBtZXRhZGF0YVNvdXJjZS5jYXRlZ29yeSxcbiAgICAgICAgY3JlYXRlZDogbWV0YWRhdGFTb3VyY2UuY3JlYXRlZCB8fCBtZXRhZGF0YVNvdXJjZS5jcmVhdGVkX2RhdGUsXG4gICAgICAgIHVwZGF0ZWQ6IG1ldGFkYXRhU291cmNlLnVwZGF0ZWQgfHwgbWV0YWRhdGFTb3VyY2UudXBkYXRlZF9kYXRlIHx8IG1ldGFkYXRhU291cmNlLm1vZGlmaWVkXG4gICAgICB9O1xuXG4gICAgICBjb25zdCBlbnRyeTogSW5kZXhFbnRyeSA9IHtcbiAgICAgICAgZmlsZVBhdGgsXG4gICAgICAgIGVsZW1lbnRUeXBlLFxuICAgICAgICBtZXRhZGF0YSxcbiAgICAgICAgbGFzdE1vZGlmaWVkOiBzdGF0cy5tdGltZSxcbiAgICAgICAgZmlsZW5hbWVcbiAgICAgIH07XG5cbiAgICAgIHJldHVybiBlbnRyeTtcblxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2dnZXIuZGVidWcoYEZhaWxlZCB0byBjcmVhdGUgbWVtb3J5IGluZGV4IGVudHJ5IGZvcjogJHtmaWxlUGF0aH1gLCB7XG4gICAgICAgIGVycm9yOiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcilcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBlbnRyeSB0byBhbGwgcmVsZXZhbnQgaW5kZXggbWFwc1xuICAgKi9cbiAgcHJpdmF0ZSBhZGRUb0luZGV4KGluZGV4OiBQb3J0Zm9saW9JbmRleCwgZW50cnk6IEluZGV4RW50cnkpOiB2b2lkIHtcbiAgICAvLyBOb3JtYWxpemUga2V5cyBmb3IgY2FzZS1pbnNlbnNpdGl2ZSBsb29rdXBcbiAgICBjb25zdCBub3JtYWxpemVkTmFtZSA9IGVudHJ5Lm1ldGFkYXRhLm5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICBjb25zdCBub3JtYWxpemVkRmlsZW5hbWUgPSBlbnRyeS5maWxlbmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgIFxuICAgIC8vIEFkZCB0byBuYW1lIG1hcFxuICAgIGluZGV4LmJ5TmFtZS5zZXQobm9ybWFsaXplZE5hbWUsIGVudHJ5KTtcbiAgICBcbiAgICAvLyBBZGQgdG8gZmlsZW5hbWUgbWFwXG4gICAgaW5kZXguYnlGaWxlbmFtZS5zZXQobm9ybWFsaXplZEZpbGVuYW1lLCBlbnRyeSk7XG4gICAgXG4gICAgLy8gQWRkIHRvIHR5cGUgbWFwXG4gICAgY29uc3QgdHlwZUVudHJpZXMgPSBpbmRleC5ieVR5cGUuZ2V0KGVudHJ5LmVsZW1lbnRUeXBlKSB8fCBbXTtcbiAgICB0eXBlRW50cmllcy5wdXNoKGVudHJ5KTtcbiAgICBpbmRleC5ieVR5cGUuc2V0KGVudHJ5LmVsZW1lbnRUeXBlLCB0eXBlRW50cmllcyk7XG4gICAgXG4gICAgLy8gQWRkIGtleXdvcmRzXG4gICAgZm9yIChjb25zdCBrZXl3b3JkIG9mIGVudHJ5Lm1ldGFkYXRhLmtleXdvcmRzIHx8IFtdKSB7XG4gICAgICBjb25zdCBub3JtYWxpemVkS2V5d29yZCA9IGtleXdvcmQudG9Mb3dlckNhc2UoKTtcbiAgICAgIGNvbnN0IGtleXdvcmRFbnRyaWVzID0gaW5kZXguYnlLZXl3b3JkLmdldChub3JtYWxpemVkS2V5d29yZCkgfHwgW107XG4gICAgICBrZXl3b3JkRW50cmllcy5wdXNoKGVudHJ5KTtcbiAgICAgIGluZGV4LmJ5S2V5d29yZC5zZXQobm9ybWFsaXplZEtleXdvcmQsIGtleXdvcmRFbnRyaWVzKTtcbiAgICB9XG4gICAgXG4gICAgLy8gQWRkIHRhZ3NcbiAgICBmb3IgKGNvbnN0IHRhZyBvZiBlbnRyeS5tZXRhZGF0YS50YWdzIHx8IFtdKSB7XG4gICAgICBjb25zdCBub3JtYWxpemVkVGFnID0gdGFnLnRvTG93ZXJDYXNlKCk7XG4gICAgICBjb25zdCB0YWdFbnRyaWVzID0gaW5kZXguYnlUYWcuZ2V0KG5vcm1hbGl6ZWRUYWcpIHx8IFtdO1xuICAgICAgdGFnRW50cmllcy5wdXNoKGVudHJ5KTtcbiAgICAgIGluZGV4LmJ5VGFnLnNldChub3JtYWxpemVkVGFnLCB0YWdFbnRyaWVzKTtcbiAgICB9XG4gICAgXG4gICAgLy8gQWRkIHRyaWdnZXJzXG4gICAgZm9yIChjb25zdCB0cmlnZ2VyIG9mIGVudHJ5Lm1ldGFkYXRhLnRyaWdnZXJzIHx8IFtdKSB7XG4gICAgICBjb25zdCBub3JtYWxpemVkVHJpZ2dlciA9IHRyaWdnZXIudG9Mb3dlckNhc2UoKTtcbiAgICAgIGNvbnN0IHRyaWdnZXJFbnRyaWVzID0gaW5kZXguYnlUcmlnZ2VyLmdldChub3JtYWxpemVkVHJpZ2dlcikgfHwgW107XG4gICAgICB0cmlnZ2VyRW50cmllcy5wdXNoKGVudHJ5KTtcbiAgICAgIGluZGV4LmJ5VHJpZ2dlci5zZXQobm9ybWFsaXplZFRyaWdnZXIsIHRyaWdnZXJFbnRyaWVzKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRmluZCBmdXp6eSBtYXRjaGVzIGZvciBhIG5hbWVcbiAgICovXG4gIHByaXZhdGUgZmluZEZ1enp5TWF0Y2goc2VhcmNoTmFtZTogc3RyaW5nLCBpbmRleDogUG9ydGZvbGlvSW5kZXgsIG9wdGlvbnM6IFNlYXJjaE9wdGlvbnMpOiBJbmRleEVudHJ5IHwgbnVsbCB7XG4gICAgY29uc3Qgc2VhcmNoID0gc2VhcmNoTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgIGxldCBiZXN0TWF0Y2g6IEluZGV4RW50cnkgfCBudWxsID0gbnVsbDtcbiAgICBsZXQgYmVzdFNjb3JlID0gMDtcbiAgICBcbiAgICAvLyBTZWFyY2ggbmFtZXMgd2l0aCBwYXJ0aWFsIG1hdGNoaW5nXG4gICAgZm9yIChjb25zdCBbbmFtZSwgZW50cnldIG9mIGluZGV4LmJ5TmFtZSkge1xuICAgICAgaWYgKG9wdGlvbnMuZWxlbWVudFR5cGUgJiYgZW50cnkuZWxlbWVudFR5cGUgIT09IG9wdGlvbnMuZWxlbWVudFR5cGUpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBcbiAgICAgIGNvbnN0IHNjb3JlID0gdGhpcy5jYWxjdWxhdGVTaW1pbGFyaXR5KHNlYXJjaCwgbmFtZSk7XG4gICAgICBpZiAoc2NvcmUgPiBiZXN0U2NvcmUgJiYgc2NvcmUgPiAwLjMpIHsgLy8gTWluaW11bSBzaW1pbGFyaXR5IHRocmVzaG9sZFxuICAgICAgICBiZXN0U2NvcmUgPSBzY29yZTtcbiAgICAgICAgYmVzdE1hdGNoID0gZW50cnk7XG4gICAgICB9XG4gICAgfVxuICAgIFxuICAgIC8vIEFsc28gY2hlY2sgZmlsZW5hbWVzXG4gICAgZm9yIChjb25zdCBbZmlsZW5hbWUsIGVudHJ5XSBvZiBpbmRleC5ieUZpbGVuYW1lKSB7XG4gICAgICBpZiAob3B0aW9ucy5lbGVtZW50VHlwZSAmJiBlbnRyeS5lbGVtZW50VHlwZSAhPT0gb3B0aW9ucy5lbGVtZW50VHlwZSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgY29uc3Qgc2NvcmUgPSB0aGlzLmNhbGN1bGF0ZVNpbWlsYXJpdHkoc2VhcmNoLCBmaWxlbmFtZSk7XG4gICAgICBpZiAoc2NvcmUgPiBiZXN0U2NvcmUgJiYgc2NvcmUgPiAwLjMpIHtcbiAgICAgICAgYmVzdFNjb3JlID0gc2NvcmU7XG4gICAgICAgIGJlc3RNYXRjaCA9IGVudHJ5O1xuICAgICAgfVxuICAgIH1cbiAgICBcbiAgICByZXR1cm4gYmVzdE1hdGNoO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGN1bGF0ZSBzaW1pbGFyaXR5IGJldHdlZW4gdHdvIHN0cmluZ3NcbiAgICovXG4gIHByaXZhdGUgY2FsY3VsYXRlU2ltaWxhcml0eShhOiBzdHJpbmcsIGI6IHN0cmluZyk6IG51bWJlciB7XG4gICAgLy8gU2ltcGxlIHNpbWlsYXJpdHkgYmFzZWQgb24gc3Vic3RyaW5nIGNvbnRhaW5tZW50IGFuZCBsZW5ndGhcbiAgICBpZiAoYSA9PT0gYikgcmV0dXJuIDEuMDtcbiAgICBpZiAoYS5pbmNsdWRlcyhiKSB8fCBiLmluY2x1ZGVzKGEpKSByZXR1cm4gMC44O1xuICAgIFxuICAgIC8vIENoZWNrIGZvciB3b3JkIG92ZXJsYXBcbiAgICBjb25zdCB3b3Jkc0EgPSBhLnNwbGl0KC9cXHMrLyk7XG4gICAgY29uc3Qgd29yZHNCID0gYi5zcGxpdCgvXFxzKy8pO1xuICAgIGNvbnN0IGNvbW1vbldvcmRzID0gd29yZHNBLmZpbHRlcih3b3JkID0+IHdvcmRzQi5pbmNsdWRlcyh3b3JkKSk7XG4gICAgXG4gICAgaWYgKGNvbW1vbldvcmRzLmxlbmd0aCA+IDApIHtcbiAgICAgIHJldHVybiBjb21tb25Xb3Jkcy5sZW5ndGggLyBNYXRoLm1heCh3b3Jkc0EubGVuZ3RoLCB3b3Jkc0IubGVuZ3RoKTtcbiAgICB9XG4gICAgXG4gICAgcmV0dXJuIDA7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgYW55IHF1ZXJ5IHRva2VucyBtYXRjaCB0aGUgdGV4dFxuICAgKi9cbiAgcHJpdmF0ZSBtYXRjaGVzUXVlcnkodGV4dDogc3RyaW5nLCBxdWVyeVRva2Vuczogc3RyaW5nW10pOiBib29sZWFuIHtcbiAgICByZXR1cm4gcXVlcnlUb2tlbnMuc29tZSh0b2tlbiA9PiB0ZXh0LmluY2x1ZGVzKHRva2VuKSk7XG4gIH1cblxuICAvKipcbiAgICogRGlzcG9zZSBpbnRlcm5hbCBzdGF0ZSB0byByZWxlYXNlIHJlc291cmNlcyAodXNlZCBkdXJpbmcgc2h1dGRvd24vdGVzdHMpLlxuICAgKi9cbiAgcHVibGljIGRpc3Bvc2UoKTogdm9pZCB7XG4gICAgdGhpcy5pbmRleCA9IG51bGw7XG4gICAgdGhpcy5sYXN0QnVpbHQgPSBudWxsO1xuICAgIHRoaXMuaXNCdWlsZGluZyA9IGZhbHNlO1xuICAgIHRoaXMuYnVpbGRQcm9taXNlID0gbnVsbDtcbiAgfVxuXG5cbn1cbiJdfQ==
|
|
736
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUG9ydGZvbGlvSW5kZXhNYW5hZ2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3BvcnRmb2xpby9Qb3J0Zm9saW9JbmRleE1hbmFnZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxLQUFLLElBQUksTUFBTSxNQUFNLENBQUM7QUFDN0IsT0FBTyxLQUFLLElBQUksTUFBTSxTQUFTLENBQUM7QUFDaEMsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQzVDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFFekMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDbkUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sNENBQTRDLENBQUM7QUFDOUUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ2pFLE9BQU8sRUFBRSxZQUFZLEVBQUUsYUFBYSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUE4RHZFLE1BQU0sT0FBTyxxQkFBcUI7SUFjYjtJQWJYLEtBQUssR0FBMEIsSUFBSSxDQUFDO0lBQ3BDLFNBQVMsR0FBZ0IsSUFBSSxDQUFDO0lBQ3JCLE1BQU0sQ0FBUztJQUNmLGdCQUFnQixDQUFtQjtJQUNuQyxjQUFjLENBQXlCO0lBQ2hELFVBQVUsR0FBRyxLQUFLLENBQUM7SUFDbkIsWUFBWSxHQUF5QixJQUFJLENBQUM7SUFFbEQsMENBQTBDO0lBQ3pCLFdBQVcsR0FBRyxDQUFDLENBQUM7SUFDaEIsY0FBYyxHQUFHLEdBQUcsQ0FBQztJQUV0QyxZQUNtQixrQkFBc0MsRUFDdkQsZ0JBQWtDLEVBQ2xDLGNBQXNDO1FBRnJCLHVCQUFrQixHQUFsQixrQkFBa0IsQ0FBb0I7UUFJdkQsTUFBTSxDQUFDLEtBQUssQ0FBQywrQkFBK0IsQ0FBQyxDQUFDO1FBQzlDLElBQUksQ0FBQyxNQUFN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UUFDeEIsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7SUFDM0IsQ0FBQztDQUdGIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBQb3J0Zm9saW8gSW5kZXggTWFuYWdlciAtIE1hcHMgZWxlbWVudCBuYW1lcyB0byBmaWxlIHBhdGhzXG4gKiBcbiAqIFNvbHZlcyBjcml0aWNhbCBpc3N1ZXM6XG4gKiAxLiBzdWJtaXRfY29sbGVjdGlvbl9jb250ZW50IGNhbid0IGZpbmQgZWxlbWVudHMgYnkgbWV0YWRhdGEgbmFtZSAoZS5nLiwgXCJTYWZlIFJvdW5kdHJpcCBUZXN0ZXJcIiAtPiBcInNhZmUtcm91bmR0cmlwLXRlc3Rlci5tZFwiKVxuICogMi4gc2VhcmNoX2NvbGxlY3Rpb24gZG9lc24ndCBzZWFyY2ggbG9jYWwgcG9ydGZvbGlvIGNvbnRlbnRcbiAqIFxuICogRmVhdHVyZXM6XG4gKiAtIEluLW1lbW9yeSBpbmRleCBtYXBwaW5nIG1ldGFkYXRhLm5hbWUg4oaSIGZpbGUgcGF0aFxuICogLSBLZXl3b3Jkcy90YWdzIOKGkiBmaWxlIHBhdGhzIG1hcHBpbmdcbiAqIC0gRWxlbWVudCB0eXBlIOKGkiBmaWxlIHBhdGhzIG1hcHBpbmdcbiAqIC0gRmFzdCBPKDEpIGxvb2t1cHMgd2l0aCBNYXBzXG4gKiAtIExhenkgbG9hZGluZyB3aXRoIDUtbWludXRlIFRUTCBjYWNoZVxuICogLSBVbmljb2RlIG5vcm1hbGl6YXRpb24gZm9yIHNlY3VyaXR5XG4gKiAtIEVycm9yIGhhbmRsaW5nIGFuZCBsb2dnaW5nXG4gKi9cblxuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCAqIGFzIHlhbWwgZnJvbSAnanMteWFtbCc7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi91dGlscy9sb2dnZXIuanMnO1xuaW1wb3J0IHsgRWxlbWVudFR5cGUgfSBmcm9tICcuL3R5cGVzLmpzJztcbmltcG9ydCB7IFBvcnRmb2xpb01hbmFnZXIgfSBmcm9tICcuL1BvcnRmb2xpb01hbmFnZXIuanMnO1xuaW1wb3J0IHsgU2VjdXJlWWFtbFBhcnNlciB9IGZyb20gJy4uL3NlY3VyaXR5L3NlY3VyZVlhbWxQYXJzZXIuanMnO1xuaW1wb3J0IHsgVW5pY29kZVZhbGlkYXRvciB9IGZyb20gJy4uL3NlY3VyaXR5L3ZhbGlkYXRvcnMvdW5pY29kZVZhbGlkYXRvci5qcyc7XG5pbXBvcnQgeyBTZWN1cml0eU1vbml0b3IgfSBmcm9tICcuLi9zZWN1cml0eS9zZWN1cml0eU1vbml0b3IuanMnO1xuaW1wb3J0IHsgRXJyb3JIYW5kbGVyLCBFcnJvckNhdGVnb3J5IH0gZnJvbSAnLi4vdXRpbHMvRXJyb3JIYW5kbGVyLmpzJztcbmltcG9ydCB7IEluZGV4Q29uZmlnTWFuYWdlciB9IGZyb20gJy4vY29uZmlnL0luZGV4Q29uZmlnLmpzJztcbmltcG9ydCB7IElGaWxlT3BlcmF0aW9uc1NlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9GaWxlT3BlcmF0aW9uc1NlcnZpY2UuanMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEluZGV4RW50cnkge1xuICBmaWxlUGF0aDogc3RyaW5nO1xuICBlbGVtZW50VHlwZTogRWxlbWVudFR5cGU7XG4gIG1ldGFkYXRhOiB7XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuICAgIHZlcnNpb24/OiBzdHJpbmc7XG4gICAgYXV0aG9yPzogc3RyaW5nO1xuICAgIHRhZ3M/OiBzdHJpbmdbXTtcbiAgICBrZXl3b3Jkcz86IHN0cmluZ1tdO1xuICAgIHRyaWdnZXJzPzogc3RyaW5nW107XG4gICAgY2F0ZWdvcnk/OiBzdHJpbmc7XG4gICAgY3JlYXRlZD86IHN0cmluZztcbiAgICB1cGRhdGVkPzogc3RyaW5nO1xuICAgIC8qKiBBZ2VudCBWMiBgYWN0aXZhdGVzYCBmaWVsZCDigJQgbWFwcyBlbGVtZW50IHR5cGVzIHRvIGVsZW1lbnQgbmFtZXMuXG4gICAgICogIFVzZXMgUmVjb3JkPHN0cmluZywgc3RyaW5nW10+IGludGVudGlvbmFsbHkgKG5vdCBBZ2VudEFjdGl2YXRlcykgdG9cbiAgICAgKiAgYXZvaWQgY291cGxpbmcgdGhlIGluZGV4IGxheWVyIHRvIGFnZW50LXNwZWNpZmljIHR5cGVzIGFuZCB0byBzdXBwb3J0XG4gICAgICogIGZ1dHVyZSBlbGVtZW50IHR5cGVzIHdpdGhvdXQgaW5kZXggY2hhbmdlcy4gKi9cbiAgICBhY3RpdmF0ZXM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT47XG4gIH07XG4gIGxhc3RNb2RpZmllZDogRGF0ZTtcbiAgZmlsZW5hbWU6IHN0cmluZzsgLy8gQmFzZSBmaWxlbmFtZSB3aXRob3V0IGV4dGVuc2lvblxufVxuXG4vLyBFeHRlbmRlZCBpbnRlcmZhY2UgZm9yIHNoYXJkZWQgbWVtb3J5IGVudHJpZXNcbmV4cG9ydCBpbnRlcmZhY2UgU2hhcmRlZE1lbW9yeUluZGV4RW50cnkgZXh0ZW5kcyBJbmRleEVudHJ5IHtcbiAgc2hhcmRJbmZvOiB7XG4gICAgc2hhcmRDb3VudDogbnVtYmVyO1xuICAgIHNoYXJkRGlyOiBzdHJpbmc7XG4gICAgbWV0YWRhdGFGaWxlOiBzdHJpbmc7XG4gIH07XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUG9ydGZvbGlvSW5kZXgge1xuICBieU5hbWU6IE1hcDxzdHJpbmcsIEluZGV4RW50cnk+O1xuICBieUZpbGVuYW1lOiBNYXA8c3RyaW5nLCBJbmRleEVudHJ5PjtcbiAgYnlUeXBlOiBNYXA8RWxlbWVudFR5cGUsIEluZGV4RW50cnlbXT47XG4gIGJ5S2V5d29yZDogTWFwPHN0cmluZywgSW5kZXhFbnRyeVtdPjtcbiAgYnlUYWc6IE1hcDxzdHJpbmcsIEluZGV4RW50cnlbXT47XG4gIGJ5VHJpZ2dlcjogTWFwPHN0cmluZywgSW5kZXhFbnRyeVtdPjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTZWFyY2hPcHRpb25zIHtcbiAgZWxlbWVudFR5cGU/OiBFbGVtZW50VHlwZTtcbiAgZnV6enlNYXRjaD86IGJvb2xlYW47XG4gIG1heFJlc3VsdHM/OiBudW1iZXI7XG4gIGluY2x1ZGVLZXl3b3Jkcz86IGJvb2xlYW47XG4gIGluY2x1ZGVUYWdzPzogYm9vbGVhbjtcbiAgaW5jbHVkZVRyaWdnZXJzPzogYm9vbGVhbjtcbiAgaW5jbHVkZURlc2NyaXB0aW9ucz86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2VhcmNoUmVzdWx0IHtcbiAgZW50cnk6IEluZGV4RW50cnk7XG4gIG1hdGNoVHlwZTogJ25hbWUnIHwgJ2ZpbGVuYW1lJyB8ICdrZXl3b3JkJyB8ICd0YWcnIHwgJ3RyaWdnZXInIHwgJ2Rlc2NyaXB0aW9uJztcbiAgc2NvcmU6IG51bWJlcjsgLy8gRm9yIGZ1dHVyZSByYW5raW5nXG59XG5cbmV4cG9ydCBjbGFzcyBQb3J0Zm9saW9JbmRleE1hbmFnZXIge1xuICBwcml2YXRlIGluZGV4OiBQb3J0Zm9saW9JbmRleCB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGxhc3RCdWlsdDogRGF0ZSB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHJlYWRvbmx5IFRUTF9NUzogbnVtYmVyO1xuICBwcml2YXRlIHJlYWRvbmx5IHBvcnRmb2xpb01hbmFnZXI6IFBvcnRmb2xpb01hbmFnZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgZmlsZU9wZXJhdGlvbnM6IElGaWxlT3BlcmF0aW9uc1NlcnZpY2U7XG4gIHByaXZhdGUgaXNCdWlsZGluZyA9IGZhbHNlO1xuICBwcml2YXRlIGJ1aWxkUHJvbWlzZTogUHJvbWlzZTx2b2lkPiB8IG51bGwgPSBudWxsO1xuXG4gIC8vIFJldHJ5IGNvbmZpZ3VyYXRpb24gZm9yIGZpbGUgb3BlcmF0aW9uc1xuICBwcml2YXRlIHJlYWRvbmx5IE1BWF9SRVRSSUVTID0gMztcbiAgcHJpdmF0ZSByZWFkb25seSBSRVRSWV9ERUxBWV9NUyA9IDEwMDtcblxuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBpbmRleENvbmZpZ01hbmFnZXI6IEluZGV4Q29uZmlnTWFuYWdlcixcbiAgICBwb3J0Zm9saW9NYW5hZ2VyOiBQb3J0Zm9saW9NYW5hZ2VyLFxuICAgIGZpbGVPcGVyYXRpb25zOiBJRmlsZU9wZXJhdGlvbnNTZXJ2aWNlXG4gICkge1xuICAgIGxvZ2dlci5kZWJ1ZygnUG9ydGZvbGlvSW5kZXhNYW5hZ2VyIGNyZWF0ZWQnKTtcbiAgICB0aGlzLlRUTF9NUyA9IHRoaXMuaW5kZXhDb25maWdNYW5hZ2VyLmdldENvbmZpZygpLmluZGV4LnR0bE1pbnV0ZXMgKiA2MCAqIDEwMDA7XG4gICAgdGhpcy5wb3J0Zm9saW9NYW5hZ2VyID0gcG9ydGZvbGlvTWFuYWdlcjtcbiAgICB0aGlzLmZpbGVPcGVyYXRpb25zID0gZmlsZU9wZXJhdGlvbnM7XG4gIH1cblxuICAvKipcbiAgICogUmV0cnkgd3JhcHBlciBmb3IgZmlsZSBzeXN0ZW0gb3BlcmF0aW9uc1xuICAgKiBIYW5kbGVzIHRyYW5zaWVudCBmaWxlIHN5c3RlbSBlcnJvcnMgd2l0aCBleHBvbmVudGlhbCBiYWNrb2ZmXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHJldHJ5RmlsZU9wZXJhdGlvbjxUPihcbiAgICBvcGVyYXRpb246ICgpID0+IFByb21pc2U8VD4sXG4gICAgY29udGV4dDogc3RyaW5nLFxuICAgIHJldHJpZXM6IG51bWJlciA9IHRoaXMuTUFYX1JFVFJJRVNcbiAgKTogUHJvbWlzZTxUIHwgbnVsbD4ge1xuICAgIGZvciAobGV0IGF0dGVtcHQgPSAxOyBhdHRlbXB0IDw9IHJldHJpZXM7IGF0dGVtcHQrKykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IG9wZXJhdGlvbigpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc3QgaXNMYXN0QXR0ZW1wdCA9IGF0dGVtcHQgPT09IHJldHJpZXM7XG4gICAgICAgIGNvbnN0IGVycm9yTWVzc2FnZSA9IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKTtcblxuICAgICAgICAvLyBDaGVjayBpZiBlcnJvciBpcyByZXRyeWFibGUgKHRyYW5zaWVudCBmaWxlIHN5c3RlbSBlcnJvcnMpXG4gICAgICAgIGNvbnN0IGlzUmV0cnlhYmxlID0gZXJyb3JNZXNzYWdlLmluY2x1ZGVzKCdFQlVTWScpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvck1lc3NhZ2UuaW5jbHVkZXMoJ0VBR0FJTicpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvck1lc3NhZ2UuaW5jbHVkZXMoJ0VOT0VOVCcpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvck1lc3NhZ2UuaW5jbHVkZXMoJ0VUSU1FRE9VVCcpO1xuXG4gICAgICAgIGlmIChpc0xhc3RBdHRlbXB0IHx8ICFpc1JldHJ5YWJsZSkge1xuICAgICAgICAgIGxvZ2dlci53YXJuKGBGaWxlIG9wZXJhdGlvbiBmYWlsZWQgYWZ0ZXIgJHthdHRlbXB0fSBhdHRlbXB0czogJHtjb250ZXh0fWAsIHtcbiAgICAgICAgICAgIGVycm9yOiBlcnJvck1lc3NhZ2UsXG4gICAgICAgICAgICBhdHRlbXB0LFxuICAgICAgICAgICAgY29udGV4dFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRXhwb25lbnRpYWwgYmFja29mZlxuICAgICAgICBjb25zdCBkZWxheSA9IHRoaXMuUkVUUllfREVMQVlfTVMgKiBNYXRoLnBvdygyLCBhdHRlbXB0IC0gMSk7XG4gICAgICAgIGxvZ2dlci5kZWJ1ZyhgUmV0cnlpbmcgZmlsZSBvcGVyYXRpb246ICR7Y29udGV4dH1gLCB7XG4gICAgICAgICAgYXR0ZW1wdCxcbiAgICAgICAgICBuZXh0RGVsYXk6IGRlbGF5LFxuICAgICAgICAgIGVycm9yOiBlcnJvck1lc3NhZ2VcbiAgICAgICAgfSk7XG5cbiAgICAgICAgYXdhaXQgbmV3IFByb21pc2UocmVzb2x2ZSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIGRlbGF5KSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgY3VycmVudCBpbmRleCwgYnVpbGRpbmcgaXQgaWYgbmVjZXNzYXJ5XG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZ2V0SW5kZXgoKTogUHJvbWlzZTxQb3J0Zm9saW9JbmRleD4ge1xuICAgIC8vIENoZWNrIGlmIHdlIG5lZWQgdG8gcmVidWlsZFxuICAgIGlmICh0aGlzLm5lZWRzUmVidWlsZCgpKSB7XG4gICAgICBhd2FpdCB0aGlzLmJ1aWxkSW5kZXgoKTtcbiAgICB9XG4gICAgXG4gICAgcmV0dXJuIHRoaXMuaW5kZXghO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlYXJjaCB0aGUgcG9ydGZvbGlvIGluZGV4IGJ5IG5hbWUgd2l0aCBmdXp6eSBtYXRjaGluZ1xuICAgKi9cbiAgcHVibGljIGFzeW5jIGZpbmRCeU5hbWUobmFtZTogc3RyaW5nLCBvcHRpb25zOiBTZWFyY2hPcHRpb25zID0ge30pOiBQcm9taXNlPEluZGV4RW50cnkgfCBudWxsPiB7XG4gICAgY29uc3QgaW5kZXggPSBhd2FpdCB0aGlzLmdldEluZGV4KCk7XG4gICAgXG4gICAgLy8gTm9ybWFsaXplIGlucHV0IGZvciBzZWN1cml0eVxuICAgIGNvbnN0IG5vcm1hbGl6ZWROYW1lID0gVW5pY29kZVZhbGlkYXRvci5ub3JtYWxpemUobmFtZSk7XG4gICAgaWYgKCFub3JtYWxpemVkTmFtZS5pc1ZhbGlkKSB7XG4gICAgICBsb2dnZXIud2FybignSW52YWxpZCBVbmljb2RlIGluIHNlYXJjaCBuYW1lJywge1xuICAgICAgICBpc3N1ZXM6IG5vcm1hbGl6ZWROYW1lLmRldGVjdGVkSXNzdWVzXG4gICAgICB9KTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBcbiAgICBjb25zdCBzYWZlTmFtZSA9IG5vcm1hbGl6ZWROYW1lLm5vcm1hbGl6ZWRDb250ZW50O1xuICAgIFxuICAgIC8vIFRyeSBleGFjdCBtYXRjaCBmaXJzdCAoY2FzZSBpbnNlbnNpdGl2ZSlcbiAgICBjb25zdCBleGFjdE1hdGNoID0gaW5kZXguYnlOYW1lLmdldChzYWZlTmFtZS50b0xvd2VyQ2FzZSgpKTtcbiAgICBpZiAoZXhhY3RNYXRjaCkge1xuICAgICAgbG9nZ2VyLmRlYnVnKCdGb3VuZCBleGFjdCBuYW1lIG1hdGNoJywgeyBuYW1lOiBzYWZlTmFtZSwgZmlsZVBhdGg6IGV4YWN0TWF0Y2guZmlsZVBhdGggfSk7XG4gICAgICByZXR1cm4gZXhhY3RNYXRjaDtcbiAgICB9XG4gICAgXG4gICAgLy8gVHJ5IGZpbGVuYW1lIG1hdGNoXG4gICAgY29uc3QgZmlsZW5hbWVNYXRjaCA9IGluZGV4LmJ5RmlsZW5hbWUuZ2V0KHNhZmVOYW1lLnRvTG93ZXJDYXNlKCkpO1xuICAgIGlmIChmaWxlbmFtZU1hdGNoKSB7XG4gICAgICBsb2dnZXIuZGVidWcoJ0ZvdW5kIGZpbGVuYW1lIG1hdGNoJywgeyBuYW1lOiBzYWZlTmFtZSwgZmlsZVBhdGg6IGZpbGVuYW1lTWF0Y2guZmlsZVBhdGggfSk7XG4gICAgICByZXR1cm4gZmlsZW5hbWVNYXRjaDtcbiAgICB9XG4gICAgXG4gICAgLy8gVHJ5IGZ1enp5IG1hdGNoaW5nIGlmIGVuYWJsZWRcbiAgICBpZiAob3B0aW9ucy5mdXp6eU1hdGNoICE9PSBmYWxzZSkge1xuICAgICAgY29uc3QgZnV6enlNYXRjaCA9IHRoaXMuZmluZEZ1enp5TWF0Y2goc2FmZU5hbWUsIGluZGV4LCBvcHRpb25zKTtcbiAgICAgIGlmIChmdXp6eU1hdGNoKSB7XG4gICAgICAgIGxvZ2dlci5kZWJ1ZygnRm91bmQgZnV6enkgbWF0Y2gnLCB7IFxuICAgICAgICAgIG5hbWU6IHNhZmVOYW1lLCBcbiAgICAgICAgICBtYXRjaE5hbWU6IGZ1enp5TWF0Y2gubWV0YWRhdGEubmFtZSxcbiAgICAgICAgICBmaWxlUGF0aDogZnV6enlNYXRjaC5maWxlUGF0aCBcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBmdXp6eU1hdGNoO1xuICAgICAgfVxuICAgIH1cbiAgICBcbiAgICBsb2dnZXIuZGVidWcoJ05vIG1hdGNoIGZvdW5kIGZvciBuYW1lJywgeyBuYW1lOiBzYWZlTmFtZSB9KTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZWFyY2ggdGhlIHBvcnRmb2xpbyB3aXRoIGNvbXByZWhlbnNpdmUgdGV4dCBzZWFyY2hcbiAgICovXG4gIHB1YmxpYyBhc3luYyBzZWFyY2gocXVlcnk6IHN0cmluZywgb3B0aW9uczogU2VhcmNoT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxTZWFyY2hSZXN1bHRbXT4ge1xuICAgIGNvbnN0IGluZGV4ID0gYXdhaXQgdGhpcy5nZXRJbmRleCgpO1xuICAgIFxuICAgIC8vIE5vcm1hbGl6ZSBxdWVyeSBmb3Igc2VjdXJpdHlcbiAgICBjb25zdCBub3JtYWxpemVkUXVlcnkgPSBVbmljb2RlVmFsaWRhdG9yLm5vcm1hbGl6ZShxdWVyeSk7XG4gICAgaWYgKCFub3JtYWxpemVkUXVlcnkuaXNWYWxpZCkge1xuICAgICAgbG9nZ2VyLndhcm4oJ0ludmFsaWQgVW5pY29kZSBpbiBzZWFyY2ggcXVlcnknLCB7XG4gICAgICAgIGlzc3Vlczogbm9ybWFsaXplZFF1ZXJ5LmRldGVjdGVkSXNzdWVzXG4gICAgICB9KTtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gICAgXG4gICAgY29uc3Qgc2FmZVF1ZXJ5ID0gbm9ybWFsaXplZFF1ZXJ5Lm5vcm1hbGl6ZWRDb250ZW50LnRvTG93ZXJDYXNlKCkudHJpbSgpO1xuICAgIGNvbnN0IHF1ZXJ5VG9rZW5zID0gc2FmZVF1ZXJ5LnNwbGl0KC9cXHMrLykuZmlsdGVyKHRva2VuID0+IHRva2VuLmxlbmd0aCA+IDApO1xuICAgIFxuICAgIGlmIChxdWVyeVRva2Vucy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gICAgXG4gICAgY29uc3QgcmVzdWx0czogU2VhcmNoUmVzdWx0W10gPSBbXTtcbiAgICBjb25zdCBzZWVuUGF0aHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICBjb25zdCBtYXhSZXN1bHRzID0gb3B0aW9ucy5tYXhSZXN1bHRzIHx8IDIwO1xuICAgIFxuICAgIC8vIEhlbHBlciB0byBhZGQgdW5pcXVlIHJlc3VsdHNcbiAgICBjb25zdCBhZGRSZXN1bHQgPSAoZW50cnk6IEluZGV4RW50cnksIG1hdGNoVHlwZTogU2VhcmNoUmVzdWx0WydtYXRjaFR5cGUnXSwgc2NvcmU6IG51bWJlciA9IDEpID0+IHtcbiAgICAgIGlmICghc2VlblBhdGhzLmhhcyhlbnRyeS5maWxlUGF0aCkgJiYgcmVzdWx0cy5sZW5ndGggPCBtYXhSZXN1bHRzKSB7XG4gICAgICAgIC8vIEZpbHRlciBieSBlbGVtZW50IHR5cGUgaWYgc3BlY2lmaWVkXG4gICAgICAgIGlmIChvcHRpb25zLmVsZW1lbnRUeXBlICYmIGVudHJ5LmVsZW1lbnRUeXBlICE9PSBvcHRpb25zLmVsZW1lbnRUeXBlKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBzZWVuUGF0aHMuYWRkKGVudHJ5LmZpbGVQYXRoKTtcbiAgICAgICAgcmVzdWx0cy5wdXNoKHsgZW50cnksIG1hdGNoVHlwZSwgc2NvcmUgfSk7XG4gICAgICB9XG4gICAgfTtcbiAgICBcbiAgICAvLyAxLiBTZWFyY2ggYnkgbmFtZSAoaGlnaGVzdCBwcmlvcml0eSlcbiAgICBmb3IgKGNvbnN0IFtuYW1lLCBlbnRyeV0gb2YgaW5kZXguYnlOYW1lKSB7XG4gICAgICBpZiAodGhpcy5tYXRjaGVzUXVlcnkobmFtZSwgcXVlcnlUb2tlbnMpKSB7XG4gICAgICAgIGFkZFJlc3VsdChlbnRyeSwgJ25hbWUnLCAzKTtcbiAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgLy8gMi4gU2VhcmNoIGJ5IGZpbGVuYW1lXG4gICAgZm9yIChjb25zdCBbZmlsZW5hbWUsIGVudHJ5XSBvZiBpbmRleC5ieUZpbGVuYW1lKSB7XG4gICAgICBpZiAodGhpcy5tYXRjaGVzUXVlcnkoZmlsZW5hbWUsIHF1ZXJ5VG9rZW5zKSkge1xuICAgICAgICBhZGRSZXN1bHQoZW50cnksICdmaWxlbmFtZScsIDIuNSk7XG4gICAgICB9XG4gICAgfVxuICAgIFxuICAgIC8vIDMuIFNlYXJjaCBieSBrZXl3b3Jkc1xuICAgIGlmIChvcHRpb25zLmluY2x1ZGVLZXl3b3JkcyAhPT0gZmFsc2UpIHtcbiAgICAgIGZvciAoY29uc3QgW2tleXdvcmQsIGVudHJpZXNdIG9mIGluZGV4LmJ5S2V5d29yZCkge1xuICAgICAgICBpZiAodGhpcy5tYXRjaGVzUXVlcnkoa2V5d29yZCwgcXVlcnlUb2tlbnMpKSB7XG4gICAgICAgICAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSB7XG4gICAgICAgICAgICBhZGRSZXN1bHQoZW50cnksICdrZXl3b3JkJywgMik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIFxuICAgIC8vIDQuIFNlYXJjaCBieSB0YWdzXG4gICAgaWYgKG9wdGlvbnMuaW5jbHVkZVRhZ3MgIT09IGZhbHNlKSB7XG4gICAgICBmb3IgKGNvbnN0IFt0YWcsIGVudHJpZXNdIG9mIGluZGV4LmJ5VGFnKSB7XG4gICAgICAgIGlmICh0aGlzLm1hdGNoZXNRdWVyeSh0YWcsIHF1ZXJ5VG9rZW5zKSkge1xuICAgICAgICAgIGZvciAoY29uc3QgZW50cnkgb2YgZW50cmllcykge1xuICAgICAgICAgICAgYWRkUmVzdWx0KGVudHJ5LCAndGFnJywgMik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIFxuICAgIC8vIDUuIFNlYXJjaCBieSB0cmlnZ2Vyc1xuICAgIGlmIChvcHRpb25zLmluY2x1ZGVUcmlnZ2VycyAhPT0gZmFsc2UpIHtcbiAgICAgIGZvciAoY29uc3QgW3RyaWdnZXIsIGVudHJpZXNdIG9mIGluZGV4LmJ5VHJpZ2dlcikge1xuICAgICAgICBpZiAodGhpcy5tYXRjaGVzUXVlcnkodHJpZ2dlciwgcXVlcnlUb2tlbnMpKSB7XG4gICAgICAgICAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSB7XG4gICAgICAgICAgICBhZGRSZXN1bHQoZW50cnksICd0cmlnZ2VyJywgMS44KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgLy8gNi4gU2VhcmNoIGJ5IGRlc2NyaXB0aW9uXG4gICAgaWYgKG9wdGlvbnMuaW5jbHVkZURlc2NyaXB0aW9ucyAhPT0gZmFsc2UpIHtcbiAgICAgIGZvciAoY29uc3QgWywgZW50cnldIG9mIGluZGV4LmJ5TmFtZSkge1xuICAgICAgICBpZiAoZW50cnkubWV0YWRhdGEuZGVzY3JpcHRpb24gJiYgXG4gICAgICAgICAgICB0aGlzLm1hdGNoZXNRdWVyeShlbnRyeS5tZXRhZGF0YS5kZXNjcmlwdGlvbi50b0xvd2VyQ2FzZSgpLCBxdWVyeVRva2VucykpIHtcbiAgICAgICAgICBhZGRSZXN1bHQoZW50cnksICdkZXNjcmlwdGlvbicsIDEuNSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgLy8gU29ydCBieSBzY29yZSAoZGVzY2VuZGluZylcbiAgICByZXN1bHRzLnNvcnQoKGEsIGIpID0+IGIuc2NvcmUgLSBhLnNjb3JlKTtcbiAgICBcbiAgICBsb2dnZXIuZGVidWcoJ1BvcnRmb2xpbyBzZWFyY2ggY29tcGxldGVkJywge1xuICAgICAgcXVlcnk6IHNhZmVRdWVyeSxcbiAgICAgIHJlc3VsdENvdW50OiByZXN1bHRzLmxlbmd0aCxcbiAgICAgIHRvdGFsSW5kZXhlZDogaW5kZXguYnlOYW1lLnNpemVcbiAgICB9KTtcbiAgICBcbiAgICByZXR1cm4gcmVzdWx0cztcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYWxsIGVsZW1lbnRzIG9mIGEgc3BlY2lmaWMgdHlwZVxuICAgKi9cbiAgcHVibGljIGFzeW5jIGdldEVsZW1lbnRzQnlUeXBlKGVsZW1lbnRUeXBlOiBFbGVtZW50VHlwZSk6IFByb21pc2U8SW5kZXhFbnRyeVtdPiB7XG4gICAgY29uc3QgaW5kZXggPSBhd2FpdCB0aGlzLmdldEluZGV4KCk7XG4gICAgcmV0dXJuIGluZGV4LmJ5VHlwZS5nZXQoZWxlbWVudFR5cGUpIHx8IFtdO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBzdGF0aXN0aWNzIGFib3V0IHRoZSBpbmRleFxuICAgKi9cbiAgcHVibGljIGFzeW5jIGdldFN0YXRzKCk6IFByb21pc2U8e1xuICAgIHRvdGFsRWxlbWVudHM6IG51bWJlcjtcbiAgICBlbGVtZW50c0J5VHlwZTogUmVjb3JkPEVsZW1lbnRUeXBlLCBudW1iZXI+O1xuICAgIGxhc3RCdWlsdDogRGF0ZSB8IG51bGw7XG4gICAgaXNTdGFsZTogYm9vbGVhbjtcbiAgfT4ge1xuICAgIGNvbnN0IGluZGV4ID0gYXdhaXQgdGhpcy5nZXRJbmRleCgpO1xuICAgIGNvbnN0IHN0YXRzID0ge1xuICAgICAgdG90YWxFbGVtZW50czogaW5kZXguYnlOYW1lLnNpemUsXG4gICAgICBlbGVtZW50c0J5VHlwZToge30gYXMgUmVjb3JkPEVsZW1lbnRUeXBlLCBudW1iZXI+LFxuICAgICAgbGFzdEJ1aWx0OiB0aGlzLmxhc3RCdWlsdCxcbiAgICAgIGlzU3RhbGU6IHRoaXMubmVlZHNSZWJ1aWxkKClcbiAgICB9O1xuICAgIFxuICAgIGZvciAoY29uc3QgZWxlbWVudFR5cGUgb2YgT2JqZWN0LnZhbHVlcyhFbGVtZW50VHlwZSkpIHtcbiAgICAgIHN0YXRzLmVsZW1lbnRzQnlUeXBlW2VsZW1lbnRUeXBlXSA9IChpbmRleC5ieVR5cGUuZ2V0KGVsZW1lbnRUeXBlKSB8fCBbXSkubGVuZ3RoO1xuICAgIH1cbiAgICBcbiAgICByZXR1cm4gc3RhdHM7XG4gIH1cblxuICAvKipcbiAgICogRm9yY2UgcmVidWlsZCB0aGUgaW5kZXhcbiAgICovXG4gIHB1YmxpYyBhc3luYyByZWJ1aWxkSW5kZXgoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5pbmRleCA9IG51bGw7XG4gICAgdGhpcy5sYXN0QnVpbHQgPSBudWxsO1xuICAgIGF3YWl0IHRoaXMuYnVpbGRJbmRleCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIHRoZSBpbmRleCBuZWVkcyByZWJ1aWxkaW5nXG4gICAqL1xuICBwcml2YXRlIG5lZWRzUmVidWlsZCgpOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMuaW5kZXggfHwgIXRoaXMubGFzdEJ1aWx0KSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgXG4gICAgY29uc3QgYWdlID0gRGF0ZS5ub3coKSAtIHRoaXMubGFzdEJ1aWx0LmdldFRpbWUoKTtcbiAgICByZXR1cm4gYWdlID4gdGhpcy5UVExfTVM7XG4gIH1cblxuICAvKipcbiAgICogQnVpbGQgdGhlIGluZGV4IGJ5IHNjYW5uaW5nIGFsbCBwb3J0Zm9saW8gZGlyZWN0b3JpZXNcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgYnVpbGRJbmRleCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyBQcmV2ZW50IGNvbmN1cnJlbnQgYnVpbGRzXG4gICAgaWYgKHRoaXMuaXNCdWlsZGluZykge1xuICAgICAgaWYgKHRoaXMuYnVpbGRQcm9taXNlKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuYnVpbGRQcm9taXNlO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBcbiAgICB0aGlzLmlzQnVpbGRpbmcgPSB0cnVlO1xuICAgIFxuICAgIHRoaXMuYnVpbGRQcm9taXNlID0gdGhpcy5wZXJmb3JtQnVpbGQoKTtcbiAgICBcbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5idWlsZFByb21pc2U7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMuaXNCdWlsZGluZyA9IGZhbHNlO1xuICAgICAgdGhpcy5idWlsZFByb21pc2UgPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBQZXJmb3JtIHRoZSBhY3R1YWwgaW5kZXggYnVpbGRpbmdcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcGVyZm9ybUJ1aWxkKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHN0YXJ0VGltZSA9IERhdGUubm93KCk7XG4gICAgbG9nZ2VyLmRlYnVnKCdCdWlsZGluZyBwb3J0Zm9saW8gaW5kZXguLi4nKTtcbiAgICBcbiAgICB0cnkge1xuICAgICAgY29uc3QgcG9ydGZvbGlvTWFuYWdlciA9IHRoaXMucG9ydGZvbGlvTWFuYWdlcjtcblxuICAgICAgLy8gSW5pdGlhbGl6ZSBlbXB0eSBpbmRleFxuICAgICAgY29uc3QgbmV3SW5kZXg6IFBvcnRmb2xpb0luZGV4ID0ge1xuICAgICAgICBieU5hbWU6IG5ldyBNYXAoKSxcbiAgICAgICAgYnlGaWxlbmFtZTogbmV3IE1hcCgpLFxuICAgICAgICBieVR5cGU6IG5ldyBNYXAoKSxcbiAgICAgICAgYnlLZXl3b3JkOiBuZXcgTWFwKCksXG4gICAgICAgIGJ5VGFnOiBuZXcgTWFwKCksXG4gICAgICAgIGJ5VHJpZ2dlcjogbmV3IE1hcCgpXG4gICAgICB9O1xuICAgICAgXG4gICAgICAvLyBJbml0aWFsaXplIHR5cGUgbWFwc1xuICAgICAgZm9yIChjb25zdCBlbGVtZW50VHlwZSBvZiBPYmplY3QudmFsdWVzKEVsZW1lbnRUeXBlKSkge1xuICAgICAgICBuZXdJbmRleC5ieVR5cGUuc2V0KGVsZW1lbnRUeXBlLCBbXSk7XG4gICAgICB9XG4gICAgICBcbiAgICAgIGxldCB0b3RhbEZpbGVzID0gMDtcbiAgICAgIGxldCBwcm9jZXNzZWRGaWxlcyA9IDA7XG4gICAgICBcbiAgICAgIC8vIFNjYW4gZWFjaCBlbGVtZW50IHR5cGVcbiAgICAgIGZvciAoY29uc3QgZWxlbWVudFR5cGUgb2YgT2JqZWN0LnZhbHVlcyhFbGVtZW50VHlwZSkpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBlbGVtZW50RGlyID0gcG9ydGZvbGlvTWFuYWdlci5nZXRFbGVtZW50RGlyKGVsZW1lbnRUeXBlKTtcblxuICAgICAgICAgIC8vIENoZWNrIGlmIGRpcmVjdG9yeSBleGlzdHNcbiAgICAgICAgICBjb25zdCBkaXJFeGlzdHMgPSBhd2FpdCB0aGlzLmZpbGVPcGVyYXRpb25zLmV4aXN0cyhlbGVtZW50RGlyKTtcbiAgICAgICAgICBpZiAoIWRpckV4aXN0cykge1xuICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGBFbGVtZW50IGRpcmVjdG9yeSBkb2Vzbid0IGV4aXN0OiAke2VsZW1lbnREaXJ9YCk7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBGSVggIzExODg6IFNwZWNpYWwgaGFuZGxpbmcgZm9yIG1lbW9yaWVzIC0gc2NhbiAueWFtbCBmaWxlcyBpbiBkYXRlIGZvbGRlcnNcbiAgICAgICAgICBpZiAoZWxlbWVudFR5cGUgPT09IEVsZW1lbnRUeXBlLk1FTU9SWSkge1xuICAgICAgICAgICAgLy8gTWVtb3JpZXMgYXJlIHN0b3JlZCBpbiBkYXRlIGZvbGRlcnMgKFlZWVktTU0tREQpIGFzIC55YW1sIGZpbGVzXG4gICAgICAgICAgICBjb25zdCBlbnRyeU5hbWVzID0gYXdhaXQgdGhpcy5maWxlT3BlcmF0aW9ucy5saXN0RGlyZWN0b3J5KGVsZW1lbnREaXIpO1xuXG4gICAgICAgICAgICAvLyBTZXBhcmF0ZSBkaXJlY3RvcmllcyBmcm9tIGZpbGVzXG4gICAgICAgICAgICBjb25zdCBkaXJlY3Rvcmllczogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgICAgIGNvbnN0IHJvb3RZYW1sRmlsZXM6IHN0cmluZ1tdID0gW107XG5cbiAgICAgICAgICAgIGZvciAoY29uc3QgZW50cnlOYW1lIG9mIGVudHJ5TmFtZXMpIHtcbiAgICAgICAgICAgICAgY29uc3QgZW50cnlQYXRoID0gcGF0aC5qb2luKGVsZW1lbnREaXIsIGVudHJ5TmFtZSk7XG4gICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZW50cnlTdGF0ID0gYXdhaXQgdGhpcy5maWxlT3BlcmF0aW9ucy5zdGF0KGVudHJ5UGF0aCk7XG4gICAgICAgICAgICAgICAgaWYgKGVudHJ5U3RhdC5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICAgICAgICAgICAgICBkaXJlY3Rvcmllcy5wdXNoKGVudHJ5TmFtZSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChlbnRyeU5hbWUuZW5kc1dpdGgoJy55YW1sJykpIHtcbiAgICAgICAgICAgICAgICAgIHJvb3RZYW1sRmlsZXMucHVzaChlbnRyeU5hbWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAgICAgLy8gU2tpcCBlbnRyaWVzIHdlIGNhbid0IHN0YXRcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGZpbGUgb2Ygcm9vdFlhbWxGaWxlcykge1xuICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5qb2luKGVsZW1lbnREaXIsIGZpbGUpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGVudHJ5ID0gYXdhaXQgdGhpcy5jcmVhdGVNZW1vcnlJbmRleEVudHJ5KGZpbGVQYXRoLCBlbGVtZW50VHlwZSk7XG5cbiAgICAgICAgICAgICAgICBpZiAoZW50cnkpIHtcbiAgICAgICAgICAgICAgICAgIHRoaXMuYWRkVG9JbmRleChuZXdJbmRleCwgZW50cnkpO1xuICAgICAgICAgICAgICAgICAgcHJvY2Vzc2VkRmlsZXMrKztcbiAgICAgICAgICAgICAgICAgIHRvdGFsRmlsZXMrKztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLndhcm4oYEZhaWxlZCB0byBpbmRleCByb290IG1lbW9yeSBmaWxlYCwge1xuICAgICAgICAgICAgICAgICAgZmlsZSxcbiAgICAgICAgICAgICAgICAgIHBhdGg6IHBhdGguam9pbihlbGVtZW50RGlyLCBmaWxlKSxcbiAgICAgICAgICAgICAgICAgIGxvY2F0aW9uOiAncm9vdCcsXG4gICAgICAgICAgICAgICAgICBlcnJvcjogZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpLFxuICAgICAgICAgICAgICAgICAgZXJyb3JUeXBlOiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IuY29uc3RydWN0b3IubmFtZSA6IHR5cGVvZiBlcnJvclxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFRoZW4gcHJvY2VzcyBkYXRlIGZvbGRlcnNcbiAgICAgICAgICAgIGNvbnN0IGRhdGVGb2xkZXJzID0gZGlyZWN0b3JpZXMuZmlsdGVyKG5hbWUgPT4gL15cXGR7NH0tXFxkezJ9LVxcZHsyfSQvLnRlc3QobmFtZSkpO1xuXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGRhdGVGb2xkZXIgb2YgZGF0ZUZvbGRlcnMpIHtcbiAgICAgICAgICAgICAgY29uc3QgZm9sZGVyUGF0aCA9IHBhdGguam9pbihlbGVtZW50RGlyLCBkYXRlRm9sZGVyKTtcbiAgICAgICAgICAgICAgY29uc3QgZm9sZGVyRW50cnlOYW1lcyA9IGF3YWl0IHRoaXMuZmlsZU9wZXJhdGlvbnMubGlzdERpcmVjdG9yeShmb2xkZXJQYXRoKTtcblxuICAgICAgICAgICAgICAvLyBTZXBhcmF0ZSBkaXJlY3RvcmllcyBmcm9tIGZpbGVzIGluIGRhdGUgZm9sZGVyXG4gICAgICAgICAgICAgIGNvbnN0IHN1YkRpcnM6IHN0cmluZ1tdID0gW107XG4gICAgICAgICAgICAgIGNvbnN0IHlhbWxGaWxlczogc3RyaW5nW10gPSBbXTtcblxuICAgICAgICAgICAgICBmb3IgKGNvbnN0IGZvbGRlckVudHJ5TmFtZSBvZiBmb2xkZXJFbnRyeU5hbWVzKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZm9sZGVyRW50cnlQYXRoID0gcGF0aC5qb2luKGZvbGRlclBhdGgsIGZvbGRlckVudHJ5TmFtZSk7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGZvbGRlckVudHJ5U3RhdCA9IGF3YWl0IHRoaXMuZmlsZU9wZXJhdGlvbnMuc3RhdChmb2xkZXJFbnRyeVBhdGgpO1xuICAgICAgICAgICAgICAgICAgaWYgKGZvbGRlckVudHJ5U3RhdC5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICAgICAgICAgICAgICAgIHN1YkRpcnMucHVzaChmb2xkZXJFbnRyeU5hbWUpO1xuICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChmb2xkZXJFbnRyeU5hbWUuZW5kc1dpdGgoJy55YW1sJykpIHtcbiAgICAgICAgICAgICAgICAgICAgeWFtbEZpbGVzLnB1c2goZm9sZGVyRW50cnlOYW1lKTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgICAgICAgIC8vIFNraXAgZW50cmllcyB3ZSBjYW4ndCBzdGF0XG4gICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBmb3IgKGNvbnN0IGZpbGUgb2YgeWFtbEZpbGVzKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5qb2luKGZvbGRlclBhdGgsIGZpbGUpO1xuICAgICAgICAgICAgICAgICAgY29uc3QgZW50cnkgPSBhd2FpdCB0aGlzLmNyZWF0ZU1lbW9yeUluZGV4RW50cnkoZmlsZVBhdGgsIGVsZW1lbnRUeXBlKTtcblxuICAgICAgICAgICAgICAgICAgaWYgKGVudHJ5KSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkVG9JbmRleChuZXdJbmRleCwgZW50cnkpO1xuICAgICAgICAgICAgICAgICAgICBwcm9jZXNzZWRGaWxlcysrO1xuICAgICAgICAgICAgICAgICAgICB0b3RhbEZpbGVzKys7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuKGBGYWlsZWQgdG8gaW5kZXggZGF0ZSBmb2xkZXIgbWVtb3J5IGZpbGVgLCB7XG4gICAgICAgICAgICAgICAgICAgIGZpbGUsXG4gICAgICAgICAgICAgICAgICAgIHBhdGg6IHBhdGguam9pbihmb2xkZXJQYXRoLCBmaWxlKSxcbiAgICAgICAgICAgICAgICAgICAgZGF0ZUZvbGRlcixcbiAgICAgICAgICAgICAgICAgICAgbG9jYXRpb246ICdkYXRlLWZvbGRlcicsXG4gICAgICAgICAgICAgICAgICAgIGVycm9yOiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvciksXG4gICAgICAgICAgICAgICAgICAgIGVycm9yVHlwZTogZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLmNvbnN0cnVjdG9yLm5hbWUgOiB0eXBlb2YgZXJyb3JcbiAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIC8vIEZJWCAjMTE4ODogUHJvY2VzcyBzdWJkaXJlY3RvcmllcyBmb3Igc2hhcmRlZCBtZW1vcmllc1xuICAgICAgICAgICAgICAvLyBMYXJnZSBtZW1vcmllcyBhcmUgc3RvcmVkIGFzIHNoYXJkcyBpbiBuYW1lZCBzdWJkaXJlY3Rvcmllc1xuICAgICAgICAgICAgICBmb3IgKGNvbnN0IHN1YkRpciBvZiBzdWJEaXJzKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc3ViRGlyUGF0aCA9IHBhdGguam9pbihmb2xkZXJQYXRoLCBzdWJEaXIpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHNoYXJkRmlsZXMgPSBhd2FpdCB0aGlzLmZpbGVPcGVyYXRpb25zLmxpc3REaXJlY3Rvcnkoc3ViRGlyUGF0aCk7XG4gICAgICAgICAgICAgICAgY29uc3Qgc2hhcmRZYW1sRmlsZXMgPSBzaGFyZEZpbGVzLmZpbHRlcihmaWxlID0+IGZpbGUuZW5kc1dpdGgoJy55YW1sJykpO1xuXG4gICAgICAgICAgICAgICAgLy8gRm9yIHNoYXJkZWQgbWVtb3JpZXMsIGxvb2sgZm9yIG1ldGFkYXRhLnlhbWwgb3IgdGhlIG1haW4gZmlsZVxuICAgICAgICAgICAgICAgIC8vIElmIG5vdCBmb3VuZCwgdXNlIHRoZSBmaXJzdCBzaGFyZCBhcyByZXByZXNlbnRhdGl2ZVxuICAgICAgICAgICAgICAgIGxldCBtZXRhZGF0YUZpbGUgPSBzaGFyZFlhbWxGaWxlcy5maW5kKGYgPT4gZiA9PT0gJ21ldGFkYXRhLnlhbWwnKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFyZFlhbWxGaWxlcy5maW5kKGYgPT4gZiA9PT0gYCR7c3ViRGlyfS55YW1sYCkgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmRZYW1sRmlsZXNbMF07XG5cbiAgICAgICAgICAgICAgICBpZiAobWV0YWRhdGFGaWxlKSB7XG4gICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGguam9pbihzdWJEaXJQYXRoLCBtZXRhZGF0YUZpbGUpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBlbnRyeSA9IGF3YWl0IHRoaXMuY3JlYXRlTWVtb3J5SW5kZXhFbnRyeShmaWxlUGF0aCwgZWxlbWVudFR5cGUpO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChlbnRyeSkge1xuICAgICAgICAgICAgICAgICAgICAgIC8vIE1hcmsgYXMgc2hhcmRlZCBtZW1vcnkgaW4gbWV0YWRhdGFcbiAgICAgICAgICAgICAgICAgICAgICBlbnRyeS5tZXRhZGF0YS5rZXl3b3JkcyA9IGVudHJ5Lm1ldGFkYXRhLmtleXdvcmRzIHx8IFtdO1xuICAgICAgICAgICAgICAgICAgICAgIGlmICghZW50cnkubWV0YWRhdGEua2V5d29yZHMuaW5jbHVkZXMoJ3NoYXJkZWQnKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZW50cnkubWV0YWRhdGEua2V5d29yZHMucHVzaCgnc2hhcmRlZCcpO1xuICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgIC8vIENyZWF0ZSBwcm9wZXJseSB0eXBlZCBzaGFyZGVkIGVudHJ5XG4gICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hhcmRlZEVudHJ5OiBTaGFyZGVkTWVtb3J5SW5kZXhFbnRyeSA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLmVudHJ5LFxuICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmRJbmZvOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXJkQ291bnQ6IHNoYXJkWWFtbEZpbGVzLmxlbmd0aCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmREaXI6IHBhdGguam9pbihkYXRlRm9sZGVyLCBzdWJEaXIpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YUZpbGU6IG1ldGFkYXRhRmlsZVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZFRvSW5kZXgobmV3SW5kZXgsIHNoYXJkZWRFbnRyeSk7XG4gICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc2VkRmlsZXMrKztcbiAgICAgICAgICAgICAgICAgICAgICB0b3RhbEZpbGVzKys7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuKGBGYWlsZWQgdG8gaW5kZXggc2hhcmRlZCBtZW1vcnlgLCB7XG4gICAgICAgICAgICAgICAgICAgICAgc3ViRGlyLFxuICAgICAgICAgICAgICAgICAgICAgIGRhdGVGb2xkZXIsXG4gICAgICAgICAgICAgICAgICAgICAgcGF0aDogcGF0aC5qb2luKHN1YkRpclBhdGgsIG1ldGFkYXRhRmlsZSksXG4gICAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGFGaWxlLFxuICAgICAgICAgICAgICAgICAgICAgIHNoYXJkQ291bnQ6IHNoYXJkWWFtbEZpbGVzLmxlbmd0aCxcbiAgICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbjogJ3NoYXJkZWQtc3ViZGlyZWN0b3J5JyxcbiAgICAgICAgICAgICAgICAgICAgICBlcnJvcjogZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpLFxuICAgICAgICAgICAgICAgICAgICAgIGVycm9yVHlwZTogZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLmNvbnN0cnVjdG9yLm5hbWUgOiB0eXBlb2YgZXJyb3IsXG4gICAgICAgICAgICAgICAgICAgICAgc2hhcmRGaWxlczogc2hhcmRZYW1sRmlsZXMuc2xpY2UoMCwgNSkgLy8gTG9nIGZpcnN0IDUgc2hhcmQgZmlsZXMgZm9yIGNvbnRleHRcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIFN0YW5kYXJkIGhhbmRsaW5nIGZvciBvdGhlciBlbGVtZW50IHR5cGVzICgubWQgZmlsZXMgaW4gcm9vdClcbiAgICAgICAgICAgIGNvbnN0IGZpbGVzID0gYXdhaXQgdGhpcy5maWxlT3BlcmF0aW9ucy5saXN0RGlyZWN0b3J5KGVsZW1lbnREaXIpO1xuICAgICAgICAgICAgY29uc3QgbWRGaWxlcyA9IGZpbGVzLmZpbHRlcihmaWxlID0+IGZpbGUuZW5kc1dpdGgoJy5tZCcpKTtcbiAgICAgICAgICAgIHRvdGFsRmlsZXMgKz0gbWRGaWxlcy5sZW5ndGg7XG5cbiAgICAgICAgICAgIGZvciAoY29uc3QgZmlsZSBvZiBtZEZpbGVzKSB7XG4gICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLmpvaW4oZWxlbWVudERpciwgZmlsZSk7XG4gICAgICAgICAgICAgICAgY29uc3QgZW50cnkgPSBhd2FpdCB0aGlzLmNyZWF0ZUluZGV4RW50cnkoZmlsZVBhdGgsIGVsZW1lbnRUeXBlKTtcblxuICAgICAgICAgICAgICAgIGlmIChlbnRyeSkge1xuICAgICAgICAgICAgICAgICAgdGhpcy5hZGRUb0luZGV4KG5ld0luZGV4LCBlbnRyeSk7XG4gICAgICAgICAgICAgICAgICBwcm9jZXNzZWRGaWxlcysrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICBsb2dnZXIud2FybihgRmFpbGVkIHRvIGluZGV4IGZpbGU6ICR7ZmlsZX1gLCB7XG4gICAgICAgICAgICAgICAgICBlbGVtZW50VHlwZSxcbiAgICAgICAgICAgICAgICAgIGVycm9yOiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcilcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBsb2dnZXIuZXJyb3IoYEZhaWxlZCB0byBzY2FuIGVsZW1lbnQgdHlwZTogJHtlbGVtZW50VHlwZX1gLCB7XG4gICAgICAgICAgICBlcnJvcjogZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gVXBkYXRlIGluc3RhbmNlIHN0YXRlXG4gICAgICB0aGlzLmluZGV4ID0gbmV3SW5kZXg7XG4gICAgICB0aGlzLmxhc3RCdWlsdCA9IG5ldyBEYXRlKCk7XG4gICAgICBcbiAgICAgIGNvbnN0IGR1cmF0aW9uID0gRGF0ZS5ub3coKSAtIHN0YXJ0VGltZTtcbiAgICAgIGxvZ2dlci5pbmZvKCdQb3J0Zm9saW8gaW5kZXggYnVpbHQgc3VjY2Vzc2Z1bGx5Jywge1xuICAgICAgICB0b3RhbEZpbGVzLFxuICAgICAgICBwcm9jZXNzZWRGaWxlcyxcbiAgICAgICAgZHVyYXRpb246IGAke2R1cmF0aW9ufW1zYCxcbiAgICAgICAgdW5pcXVlTmFtZXM6IG5ld0luZGV4LmJ5TmFtZS5zaXplLFxuICAgICAgICB1bmlxdWVLZXl3b3JkczogbmV3SW5kZXguYnlLZXl3b3JkLnNpemUsXG4gICAgICAgIHVuaXF1ZVRhZ3M6IG5ld0luZGV4LmJ5VGFnLnNpemVcbiAgICAgIH0pO1xuICAgICAgXG4gICAgICAvLyBMb2cgc2VjdXJpdHkgZXZlbnQgZm9yIGF1ZGl0IHRyYWlsXG4gICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgIHR5cGU6ICdQT1JURk9MSU9fSU5JVElBTElaQVRJT04nLFxuICAgICAgICBzZXZlcml0eTogJ0xPVycsXG4gICAgICAgIHNvdXJjZTogJ1BvcnRmb2xpb0luZGV4TWFuYWdlci5wZXJmb3JtQnVpbGQnLFxuICAgICAgICBkZXRhaWxzOiBgUG9ydGZvbGlvIGluZGV4IHJlYnVpbHQgd2l0aCAke3Byb2Nlc3NlZEZpbGVzfSBlbGVtZW50cyBpbiAke2R1cmF0aW9ufW1zYFxuICAgICAgfSk7XG4gICAgICBcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgRXJyb3JIYW5kbGVyLmxvZ0Vycm9yKCdQb3J0Zm9saW9JbmRleE1hbmFnZXIucGVyZm9ybUJ1aWxkJywgZXJyb3IpO1xuICAgICAgdGhyb3cgRXJyb3JIYW5kbGVyLndyYXBFcnJvcihlcnJvciwgJ0ZhaWxlZCB0byBidWlsZCBwb3J0Zm9saW8gaW5kZXgnLCBFcnJvckNhdGVnb3J5LlNZU1RFTV9FUlJPUik7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhbiBpbmRleCBlbnRyeSBmcm9tIGEgZmlsZVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBjcmVhdGVJbmRleEVudHJ5KGZpbGVQYXRoOiBzdHJpbmcsIGVsZW1lbnRUeXBlOiBFbGVtZW50VHlwZSk6IFByb21pc2U8SW5kZXhFbnRyeSB8IG51bGw+IHtcbiAgICB0cnkge1xuICAgICAgLy8gR2V0IGZpbGUgc3RhdHNcbiAgICAgIGNvbnN0IHN0YXRzID0gYXdhaXQgdGhpcy5maWxlT3BlcmF0aW9ucy5zdGF0KGZpbGVQYXRoKTtcblxuICAgICAgLy8gUmVhZCBmaWxlIGNvbnRlbnRcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCB0aGlzLmZpbGVPcGVyYXRpb25zLnJlYWRGaWxlKGZpbGVQYXRoLCB7IHNvdXJjZTogJ1BvcnRmb2xpb0luZGV4TWFuYWdlci5jcmVhdGVJbmRleEVudHJ5JyB9KTtcblxuICAgICAgLy8gUGFyc2UgZnJvbnRtYXR0ZXIgc2VjdXJlbHlcbiAgICAgIC8vIFNFQ1VSSVRZIE5PVEU6IFBvcnRmb2xpbyBmaWxlcyBhcmUgbG9jYWxseSB0cnVzdGVkIGNvbnRlbnQgdGhhdCB1c2Vyc1xuICAgICAgLy8gaGF2ZSBkZWxpYmVyYXRlbHkgY3JlYXRlZCBvciBpbnN0YWxsZWQuIFNlY3VyaXR5IHZhbGlkYXRpb24gc2hvdWxkIGZvY3VzXG4gICAgICAvLyBvbiBCRUhBVklPUkFMIGFuYWx5c2lzIGR1cmluZyBpbXBvcnQvaW5zdGFsbGF0aW9uLCBub3Qgc3VwZXJmaWNpYWwgd29yZFxuICAgICAgLy8gbWF0Y2hpbmcgaW4gZGVzY3JpcHRpb25zLiBBIG1hbGljaW91cyBhY3RvciB3b3VsZCBuZXZlciBsYWJlbCB0aGVpclxuICAgICAgLy8gZXhwbG9pdCBhcyBcImRhbmdlcm91c1wiIC0gdGhleSdkIGNhbGwgaXQgXCJoZWxwZnVsIHV0aWxpdHlcIi5cbiAgICAgIC8vIEZ1dHVyZTogQWRkIGJlaGF2aW9yYWwgYW5hbHlzaXMgb24gaW1wb3J0LCBub3QgZHVyaW5nIGluZGV4aW5nLlxuICAgICAgY29uc3QgcGFyc2VkID0gU2VjdXJlWWFtbFBhcnNlci5wYXJzZShjb250ZW50LCB7XG4gICAgICAgIHZhbGlkYXRlQ29udGVudDogZmFsc2UsICAvLyBEb24ndCBzY2FuIGZvciB3b3JkcyBpbiB0cnVzdGVkIGxvY2FsIGZpbGVzXG4gICAgICAgIHZhbGlkYXRlRmllbGRzOiBmYWxzZSAgICAvLyBQb3J0Zm9saW8gZmlsZXMgYXJlIHByZS10cnVzdGVkIGJ5IHVzZXIgY2hvaWNlXG4gICAgICB9KTtcbiAgICAgIFxuICAgICAgLy8gRXh0cmFjdCBiYXNlIGZpbGVuYW1lXG4gICAgICBjb25zdCBmaWxlbmFtZSA9IHBhdGguYmFzZW5hbWUoZmlsZVBhdGgsICcubWQnKTtcbiAgICAgIFxuICAgICAgLy8gQnVpbGQgbWV0YWRhdGEgd2l0aCBkZWZhdWx0c1xuICAgICAgY29uc3QgbWV0YWRhdGEgPSB7XG4gICAgICAgIG5hbWU6IHBhcnNlZC5kYXRhLm5hbWUgfHwgZmlsZW5hbWUsXG4gICAgICAgIGRlc2NyaXB0aW9uOiBwYXJzZWQuZGF0YS5kZXNjcmlwdGlvbixcbiAgICAgICAgdmVyc2lvbjogcGFyc2VkLmRhdGEudmVyc2lvbixcbiAgICAgICAgYXV0aG9yOiBwYXJzZWQuZGF0YS5hdXRob3IsXG4gICAgICAgIHRhZ3M6IEFycmF5LmlzQXJyYXkocGFyc2VkLmRhdGEudGFncykgPyBwYXJzZWQuZGF0YS50YWdzIDogW10sXG4gICAgICAgIGtleXdvcmRzOiBBcnJheS5pc0FycmF5KHBhcnNlZC5kYXRhLmtleXdvcmRzKSA/IHBhcnNlZC5kYXRhLmtleXdvcmRzIDogW10sXG4gICAgICAgIHRyaWdnZXJzOiBBcnJheS5pc0FycmF5KHBhcnNlZC5kYXRhLnRyaWdnZXJzKSA/IHBhcnNlZC5kYXRhLnRyaWdnZXJzIDogW10sXG4gICAgICAgIGNhdGVnb3J5OiBwYXJzZWQuZGF0YS5jYXRlZ29yeSxcbiAgICAgICAgY3JlYXRlZDogcGFyc2VkLmRhdGEuY3JlYXRlZCB8fCBwYXJzZWQuZGF0YS5jcmVhdGVkX2RhdGUsXG4gICAgICAgIHVwZGF0ZWQ6IHBhcnNlZC5kYXRhLnVwZGF0ZWQgfHwgcGFyc2VkLmRhdGEudXBkYXRlZF9kYXRlLFxuICAgICAgICAvLyBJc3N1ZSAjNzQ5OiBDYXJyeSBhZ2VudCBgYWN0aXZhdGVzYCB0aHJvdWdoIHRvIGluZGV4IGJ1aWxkZXIgZm9yIHJlbGF0aW9uc2hpcCBleHRyYWN0aW9uXG4gICAgICAgIC4uLihwYXJzZWQuZGF0YS5hY3RpdmF0ZXMgJiYgdHlwZW9mIHBhcnNlZC5kYXRhLmFjdGl2YXRlcyA9PT0gJ29iamVjdCdcbiAgICAgICAgICA/IHsgYWN0aXZhdGVzOiBwYXJzZWQuZGF0YS5hY3RpdmF0ZXMgYXMgUmVjb3JkPHN0cmluZywgc3RyaW5nW10+IH1cbiAgICAgICAgICA6IHt9KVxuICAgICAgfTtcblxuICAgICAgY29uc3QgZW50cnk6IEluZGV4RW50cnkgPSB7XG4gICAgICAgIGZpbGVQYXRoLFxuICAgICAgICBlbGVtZW50VHlwZSxcbiAgICAgICAgbWV0YWRhdGEsXG4gICAgICAgIGxhc3RNb2RpZmllZDogc3RhdHMubXRpbWUsXG4gICAgICAgIGZpbGVuYW1lXG4gICAgICB9O1xuICAgICAgXG4gICAgICByZXR1cm4gZW50cnk7XG4gICAgICBcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbG9nZ2VyLmRlYnVnKGBGYWlsZWQgdG8gY3JlYXRlIGluZGV4IGVudHJ5IGZvcjogJHtmaWxlUGF0aH1gLCB7XG4gICAgICAgIGVycm9yOiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcilcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhbiBpbmRleCBlbnRyeSBmcm9tIGEgbWVtb3J5IFlBTUwgZmlsZVxuICAgKiBGSVggIzExODg6IFNwZWNpYWwgaGFuZGxpbmcgZm9yIG1lbW9yeSBmaWxlcyB3aXRoIGRpZmZlcmVudCBzdHJ1Y3R1cmVcbiAgICogRklYICMxMTk2OiBVc2UgeWFtbC5sb2FkIGZvciBwdXJlIFlBTUwgZmlsZXMsIG5vdCBTZWN1cmVZYW1sUGFyc2VyICh3aGljaCBleHBlY3RzIE1hcmtkb3duIGZyb250bWF0dGVyKVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBjcmVhdGVNZW1vcnlJbmRleEVudHJ5KGZpbGVQYXRoOiBzdHJpbmcsIGVsZW1lbnRUeXBlOiBFbGVtZW50VHlwZSk6IFByb21pc2U8SW5kZXhFbnRyeSB8IG51bGw+IHtcbiAgICB0cnkge1xuICAgICAgLy8gR2V0IGZpbGUgc3RhdHNcbiAgICAgIGNvbnN0IHN0YXRzID0gYXdhaXQgdGhpcy5maWxlT3BlcmF0aW9ucy5zdGF0KGZpbGVQYXRoKTtcblxuICAgICAgLy8gUmVhZCBmaWxlIGNvbnRlbnRcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCB0aGlzLmZpbGVPcGVyYXRpb25zLnJlYWRGaWxlKGZpbGVQYXRoLCB7IHNvdXJjZTogJ1BvcnRmb2xpb0luZGV4TWFuYWdlci5jcmVhdGVNZW1vcnlJbmRleEVudHJ5JyB9KTtcblxuICAgICAgLy8gRklYICMxMTk2OiBQYXJzZSBwdXJlIFlBTUwgdXNpbmcgeWFtbC5sb2FkKClcbiAgICAgIC8vIE1lbW9yeSBmaWxlcyBhcmUgcHVyZSBZQU1MIHdpdGhvdXQgZnJvbnRtYXR0ZXIgbWFya2Vycywgc28gd2UgY2FuJ3QgdXNlIFNlY3VyZVlhbWxQYXJzZXJcbiAgICAgIC8vICh3aGljaCBpcyBkZXNpZ25lZCBmb3IgTWFya2Rvd24gZmlsZXMgd2l0aCBZQU1MIGZyb250bWF0dGVyIGJldHdlZW4gLS0tIG1hcmtlcnMpXG4gICAgICAvLyBVc2luZyBGQUlMU0FGRV9TQ0hFTUEgZm9yIHNlY3VyaXR5IChzYW1lIGFzIE1lbW9yeU1hbmFnZXIgdXNlcylcblxuICAgICAgLy8gU2VjdXJpdHkgdmFsaWRhdGlvbjogQ2hlY2sgY29udGVudCBzaXplIGJlZm9yZSBwYXJzaW5nXG4gICAgICBpZiAoY29udGVudC5sZW5ndGggPiAxMDQ4NTc2KSB7IC8vIDFNQiBsaW1pdFxuICAgICAgICBsb2dnZXIud2FybihgTGFyZ2UgbWVtb3J5IGZpbGUgZGV0ZWN0ZWQsIHNraXBwaW5nOiAke2ZpbGVQYXRofWApO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcmF3UGFyc2VkID0geWFtbC5sb2FkKGNvbnRlbnQsIHtcbiAgICAgICAgc2NoZW1hOiB5YW1sLkZBSUxTQUZFX1NDSEVNQVxuICAgICAgfSk7XG5cbiAgICAgIC8vIFR5cGUgc2FmZXR5OiBFbnN1cmUgcGFyc2VkIHJlc3VsdCBpcyBhIHZhbGlkIG9iamVjdFxuICAgICAgaWYgKCFyYXdQYXJzZWQgfHwgdHlwZW9mIHJhd1BhcnNlZCAhPT0gJ29iamVjdCcgfHwgQXJyYXkuaXNBcnJheShyYXdQYXJzZWQpKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKGBJbnZhbGlkIFlBTUwgc3RydWN0dXJlIGluIG1lbW9yeSBmaWxlOiAke2ZpbGVQYXRofWApO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcGFyc2VkID0gcmF3UGFyc2VkIGFzIFJlY29yZDxzdHJpbmcsIGFueT47XG5cbiAgICAgIC8vIEV4dHJhY3QgYmFzZSBmaWxlbmFtZVxuICAgICAgY29uc3QgZmlsZW5hbWUgPSBwYXRoLmJhc2VuYW1lKGZpbGVQYXRoLCAnLnlhbWwnKTtcblxuICAgICAgLy8gTWVtb3J5IGZpbGVzIGNhbiBoYXZlIG1ldGFkYXRhIGF0IHRvcCBsZXZlbCBPUiBuZXN0ZWQgdW5kZXIgJ21ldGFkYXRhJyBrZXlcbiAgICAgIC8vIEZJWCAjMTE5NjogTWVyZ2UgYm90aCBsZXZlbHMsIHByZWZlcnJpbmcgbmVzdGVkIG1ldGFkYXRhIGJsb2NrIG92ZXIgdG9wLWxldmVsXG4gICAgICAvLyBUaGlzIGhhbmRsZXMgbWl4ZWQgc3RydWN0dXJlcyB3aGVyZSBzb21lIGZpZWxkcyBhcmUgdG9wLWxldmVsIGFuZCBvdGhlcnMgYXJlIG5lc3RlZFxuICAgICAgY29uc3QgbWV0YWRhdGFTb3VyY2UgPSBwYXJzZWQubWV0YWRhdGFcbiAgICAgICAgPyB7IC4uLnBhcnNlZCwgLi4ucGFyc2VkLm1ldGFkYXRhIH0gIC8vIE1lcmdlIHRvcC1sZXZlbCB3aXRoIG5lc3RlZCwgbmVzdGVkIHdpbnNcbiAgICAgICAgOiBwYXJzZWQ7ICAvLyBObyBuZXN0ZWQgbWV0YWRhdGEsIHVzZSB0b3AtbGV2ZWwgb25seVxuXG4gICAgICAvLyBCdWlsZCBtZXRhZGF0YSB3aXRoIG1lbW9yeS1zcGVjaWZpYyBkZWZhdWx0c1xuICAgICAgY29uc3QgbWV0YWRhdGEgPSB7XG4gICAgICAgIG5hbWU6IG1ldGFkYXRhU291cmNlLm5hbWUgfHwgZmlsZW5hbWUucmVwbGFjZUFsbCgnLScsICcgJyksXG4gICAgICAgIGRlc2NyaXB0aW9uOiBtZXRhZGF0YVNvdXJjZS5kZXNjcmlwdGlvbiB8fCAnTWVtb3J5IGVsZW1lbnQnLFxuICAgICAgICB2ZXJzaW9uOiBtZXRhZGF0YVNvdXJjZS52ZXJzaW9uIHx8ICcxLjAuMCcsXG4gICAgICAgIGF1dGhvcjogbWV0YWRhdGFTb3VyY2UuYXV0aG9yLFxuICAgICAgICB0YWdzOiBBcnJheS5pc0FycmF5KG1ldGFkYXRhU291cmNlLnRhZ3MpID8gbWV0YWRhdGFTb3VyY2UudGFncyA6IFtdLFxuICAgICAgICBrZXl3b3JkczogQXJyYXkuaXNBcnJheShtZXRhZGF0YVNvdXJjZS5rZXl3b3JkcykgPyBtZXRhZGF0YVNvdXJjZS5rZXl3b3JkcyA6IFtdLFxuICAgICAgICB0cmlnZ2VyczogQXJyYXkuaXNBcnJheShtZXRhZGF0YVNvdXJjZS50cmlnZ2VycykgPyBtZXRhZGF0YVNvdXJjZS50cmlnZ2VycyA6IFtdLFxuICAgICAgICBjYXRlZ29yeTogbWV0YWRhdGFTb3VyY2UuY2F0ZWdvcnksXG4gICAgICAgIGNyZWF0ZWQ6IG1ldGFkYXRhU291cmNlLmNyZWF0ZWQgfHwgbWV0YWRhdGFTb3VyY2UuY3JlYXRlZF9kYXRlLFxuICAgICAgICB1cGRhdGVkOiBtZXRhZGF0YVNvdXJjZS51cGRhdGVkIHx8IG1ldGFkYXRhU291cmNlLnVwZGF0ZWRfZGF0ZSB8fCBtZXRhZGF0YVNvdXJjZS5tb2RpZmllZFxuICAgICAgfTtcblxuICAgICAgY29uc3QgZW50cnk6IEluZGV4RW50cnkgPSB7XG4gICAgICAgIGZpbGVQYXRoLFxuICAgICAgICBlbGVtZW50VHlwZSxcbiAgICAgICAgbWV0YWRhdGEsXG4gICAgICAgIGxhc3RNb2RpZmllZDogc3RhdHMubXRpbWUsXG4gICAgICAgIGZpbGVuYW1lXG4gICAgICB9O1xuXG4gICAgICByZXR1cm4gZW50cnk7XG5cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbG9nZ2VyLmRlYnVnKGBGYWlsZWQgdG8gY3JlYXRlIG1lbW9yeSBpbmRleCBlbnRyeSBmb3I6ICR7ZmlsZVBhdGh9YCwge1xuICAgICAgICBlcnJvcjogZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpXG4gICAgICB9KTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgZW50cnkgdG8gYWxsIHJlbGV2YW50IGluZGV4IG1hcHNcbiAgICovXG4gIHByaXZhdGUgYWRkVG9JbmRleChpbmRleDogUG9ydGZvbGlvSW5kZXgsIGVudHJ5OiBJbmRleEVudHJ5KTogdm9pZCB7XG4gICAgLy8gTm9ybWFsaXplIGtleXMgZm9yIGNhc2UtaW5zZW5zaXRpdmUgbG9va3VwXG4gICAgY29uc3Qgbm9ybWFsaXplZE5hbWUgPSBlbnRyeS5tZXRhZGF0YS5uYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgY29uc3Qgbm9ybWFsaXplZEZpbGVuYW1lID0gZW50cnkuZmlsZW5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICBcbiAgICAvLyBBZGQgdG8gbmFtZSBtYXBcbiAgICBpbmRleC5ieU5hbWUuc2V0KG5vcm1hbGl6ZWROYW1lLCBlbnRyeSk7XG4gICAgXG4gICAgLy8gQWRkIHRvIGZpbGVuYW1lIG1hcFxuICAgIGluZGV4LmJ5RmlsZW5hbWUuc2V0KG5vcm1hbGl6ZWRGaWxlbmFtZSwgZW50cnkpO1xuICAgIFxuICAgIC8vIEFkZCB0byB0eXBlIG1hcFxuICAgIGNvbnN0IHR5cGVFbnRyaWVzID0gaW5kZXguYnlUeXBlLmdldChlbnRyeS5lbGVtZW50VHlwZSkgfHwgW107XG4gICAgdHlwZUVudHJpZXMucHVzaChlbnRyeSk7XG4gICAgaW5kZXguYnlUeXBlLnNldChlbnRyeS5lbGVtZW50VHlwZSwgdHlwZUVudHJpZXMpO1xuICAgIFxuICAgIC8vIEFkZCBrZXl3b3Jkc1xuICAgIGZvciAoY29uc3Qga2V5d29yZCBvZiBlbnRyeS5tZXRhZGF0YS5rZXl3b3JkcyB8fCBbXSkge1xuICAgICAgY29uc3Qgbm9ybWFsaXplZEtleXdvcmQgPSBrZXl3b3JkLnRvTG93ZXJDYXNlKCk7XG4gICAgICBjb25zdCBrZXl3b3JkRW50cmllcyA9IGluZGV4LmJ5S2V5d29yZC5nZXQobm9ybWFsaXplZEtleXdvcmQpIHx8IFtdO1xuICAgICAga2V5d29yZEVudHJpZXMucHVzaChlbnRyeSk7XG4gICAgICBpbmRleC5ieUtleXdvcmQuc2V0KG5vcm1hbGl6ZWRLZXl3b3JkLCBrZXl3b3JkRW50cmllcyk7XG4gICAgfVxuICAgIFxuICAgIC8vIEFkZCB0YWdzXG4gICAgZm9yIChjb25zdCB0YWcgb2YgZW50cnkubWV0YWRhdGEudGFncyB8fCBbXSkge1xuICAgICAgY29uc3Qgbm9ybWFsaXplZFRhZyA9IHRhZy50b0xvd2VyQ2FzZSgpO1xuICAgICAgY29uc3QgdGFnRW50cmllcyA9IGluZGV4LmJ5VGFnLmdldChub3JtYWxpemVkVGFnKSB8fCBbXTtcbiAgICAgIHRhZ0VudHJpZXMucHVzaChlbnRyeSk7XG4gICAgICBpbmRleC5ieVRhZy5zZXQobm9ybWFsaXplZFRhZywgdGFnRW50cmllcyk7XG4gICAgfVxuICAgIFxuICAgIC8vIEFkZCB0cmlnZ2Vyc1xuICAgIGZvciAoY29uc3QgdHJpZ2dlciBvZiBlbnRyeS5tZXRhZGF0YS50cmlnZ2VycyB8fCBbXSkge1xuICAgICAgY29uc3Qgbm9ybWFsaXplZFRyaWdnZXIgPSB0cmlnZ2VyLnRvTG93ZXJDYXNlKCk7XG4gICAgICBjb25zdCB0cmlnZ2VyRW50cmllcyA9IGluZGV4LmJ5VHJpZ2dlci5nZXQobm9ybWFsaXplZFRyaWdnZXIpIHx8IFtdO1xuICAgICAgdHJpZ2dlckVudHJpZXMucHVzaChlbnRyeSk7XG4gICAgICBpbmRleC5ieVRyaWdnZXIuc2V0KG5vcm1hbGl6ZWRUcmlnZ2VyLCB0cmlnZ2VyRW50cmllcyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEZpbmQgZnV6enkgbWF0Y2hlcyBmb3IgYSBuYW1lXG4gICAqL1xuICBwcml2YXRlIGZpbmRGdXp6eU1hdGNoKHNlYXJjaE5hbWU6IHN0cmluZywgaW5kZXg6IFBvcnRmb2xpb0luZGV4LCBvcHRpb25zOiBTZWFyY2hPcHRpb25zKTogSW5kZXhFbnRyeSB8IG51bGwge1xuICAgIGNvbnN0IHNlYXJjaCA9IHNlYXJjaE5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICBsZXQgYmVzdE1hdGNoOiBJbmRleEVudHJ5IHwgbnVsbCA9IG51bGw7XG4gICAgbGV0IGJlc3RTY29yZSA9IDA7XG4gICAgXG4gICAgLy8gU2VhcmNoIG5hbWVzIHdpdGggcGFydGlhbCBtYXRjaGluZ1xuICAgIGZvciAoY29uc3QgW25hbWUsIGVudHJ5XSBvZiBpbmRleC5ieU5hbWUpIHtcbiAgICAgIGlmIChvcHRpb25zLmVsZW1lbnRUeXBlICYmIGVudHJ5LmVsZW1lbnRUeXBlICE9PSBvcHRpb25zLmVsZW1lbnRUeXBlKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgXG4gICAgICBjb25zdCBzY29yZSA9IHRoaXMuY2FsY3VsYXRlU2ltaWxhcml0eShzZWFyY2gsIG5hbWUpO1xuICAgICAgaWYgKHNjb3JlID4gYmVzdFNjb3JlICYmIHNjb3JlID4gMC4zKSB7IC8vIE1pbmltdW0gc2ltaWxhcml0eSB0aHJlc2hvbGRcbiAgICAgICAgYmVzdFNjb3JlID0gc2NvcmU7XG4gICAgICAgIGJlc3RNYXRjaCA9IGVudHJ5O1xuICAgICAgfVxuICAgIH1cbiAgICBcbiAgICAvLyBBbHNvIGNoZWNrIGZpbGVuYW1lc1xuICAgIGZvciAoY29uc3QgW2ZpbGVuYW1lLCBlbnRyeV0gb2YgaW5kZXguYnlGaWxlbmFtZSkge1xuICAgICAgaWYgKG9wdGlvbnMuZWxlbWVudFR5cGUgJiYgZW50cnkuZWxlbWVudFR5cGUgIT09IG9wdGlvbnMuZWxlbWVudFR5cGUpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBcbiAgICAgIGNvbnN0IHNjb3JlID0gdGhpcy5jYWxjdWxhdGVTaW1pbGFyaXR5KHNlYXJjaCwgZmlsZW5hbWUpO1xuICAgICAgaWYgKHNjb3JlID4gYmVzdFNjb3JlICYmIHNjb3JlID4gMC4zKSB7XG4gICAgICAgIGJlc3RTY29yZSA9IHNjb3JlO1xuICAgICAgICBiZXN0TWF0Y2ggPSBlbnRyeTtcbiAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgcmV0dXJuIGJlc3RNYXRjaDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxjdWxhdGUgc2ltaWxhcml0eSBiZXR3ZWVuIHR3byBzdHJpbmdzXG4gICAqL1xuICBwcml2YXRlIGNhbGN1bGF0ZVNpbWlsYXJpdHkoYTogc3RyaW5nLCBiOiBzdHJpbmcpOiBudW1iZXIge1xuICAgIC8vIFNpbXBsZSBzaW1pbGFyaXR5IGJhc2VkIG9uIHN1YnN0cmluZyBjb250YWlubWVudCBhbmQgbGVuZ3RoXG4gICAgaWYgKGEgPT09IGIpIHJldHVybiAxLjA7XG4gICAgaWYgKGEuaW5jbHVkZXMoYikgfHwgYi5pbmNsdWRlcyhhKSkgcmV0dXJuIDAuODtcbiAgICBcbiAgICAvLyBDaGVjayBmb3Igd29yZCBvdmVybGFwXG4gICAgY29uc3Qgd29yZHNBID0gYS5zcGxpdCgvXFxzKy8pO1xuICAgIGNvbnN0IHdvcmRzQiA9IGIuc3BsaXQoL1xccysvKTtcbiAgICBjb25zdCBjb21tb25Xb3JkcyA9IHdvcmRzQS5maWx0ZXIod29yZCA9PiB3b3Jkc0IuaW5jbHVkZXMod29yZCkpO1xuICAgIFxuICAgIGlmIChjb21tb25Xb3Jkcy5sZW5ndGggPiAwKSB7XG4gICAgICByZXR1cm4gY29tbW9uV29yZHMubGVuZ3RoIC8gTWF0aC5tYXgod29yZHNBLmxlbmd0aCwgd29yZHNCLmxlbmd0aCk7XG4gICAgfVxuICAgIFxuICAgIHJldHVybiAwO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGFueSBxdWVyeSB0b2tlbnMgbWF0Y2ggdGhlIHRleHRcbiAgICovXG4gIHByaXZhdGUgbWF0Y2hlc1F1ZXJ5KHRleHQ6IHN0cmluZywgcXVlcnlUb2tlbnM6IHN0cmluZ1tdKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHF1ZXJ5VG9rZW5zLnNvbWUodG9rZW4gPT4gdGV4dC5pbmNsdWRlcyh0b2tlbikpO1xuICB9XG5cbiAgLyoqXG4gICAqIERpc3Bvc2UgaW50ZXJuYWwgc3RhdGUgdG8gcmVsZWFzZSByZXNvdXJjZXMgKHVzZWQgZHVyaW5nIHNodXRkb3duL3Rlc3RzKS5cbiAgICovXG4gIHB1YmxpYyBkaXNwb3NlKCk6IHZvaWQge1xuICAgIHRoaXMuaW5kZXggPSBudWxsO1xuICAgIHRoaXMubGFzdEJ1aWx0ID0gbnVsbDtcbiAgICB0aGlzLmlzQnVpbGRpbmcgPSBmYWxzZTtcbiAgICB0aGlzLmJ1aWxkUHJvbWlzZSA9IG51bGw7XG4gIH1cblxuXG59XG4iXX0=
|