@dollhousemcp/mcp-server 2.0.11 → 2.0.12-rc.2
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 +33 -0
- package/dist/config/ConfigManager.d.ts +34 -0
- package/dist/config/ConfigManager.d.ts.map +1 -1
- package/dist/config/ConfigManager.js +46 -1
- package/dist/config/env.d.ts +18 -0
- package/dist/config/env.d.ts.map +1 -1
- package/dist/config/env.js +89 -2
- package/dist/di/Container.d.ts +1 -0
- package/dist/di/Container.d.ts.map +1 -1
- package/dist/di/Container.js +38 -2
- package/dist/elements/agents/AgentManager.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/mcp-aql/GatekeeperSession.d.ts.map +1 -1
- package/dist/handlers/mcp-aql/GatekeeperSession.js +3 -2
- package/dist/handlers/mcp-aql/MCPAQLHandler.d.ts.map +1 -1
- package/dist/handlers/mcp-aql/MCPAQLHandler.js +11 -3
- package/dist/handlers/mcp-aql/OperationSchema.d.ts.map +1 -1
- package/dist/handlers/mcp-aql/OperationSchema.js +11 -6
- package/dist/handlers/mcp-aql/policies/ToolClassification.d.ts.map +1 -1
- package/dist/handlers/mcp-aql/policies/ToolClassification.js +8 -1
- package/dist/index.js +53 -3
- package/dist/security/InputNormalizer.d.ts +4 -6
- package/dist/security/InputNormalizer.d.ts.map +1 -1
- package/dist/security/InputNormalizer.js +10 -16
- package/dist/security/audit/config/suppressions.d.ts.map +1 -1
- package/dist/security/audit/config/suppressions.js +26 -1
- package/dist/security/constants.d.ts +7 -0
- package/dist/security/constants.d.ts.map +1 -1
- package/dist/security/constants.js +10 -1
- package/dist/security/contentValidator.d.ts.map +1 -1
- package/dist/security/contentValidator.js +14 -6
- package/dist/security/encryption/PatternEncryptor.d.ts.map +1 -1
- package/dist/security/encryption/PatternEncryptor.js +18 -10
- package/dist/security/securityMonitor.d.ts +1 -1
- package/dist/security/securityMonitor.d.ts.map +1 -1
- package/dist/security/securityMonitor.js +1 -1
- package/dist/security/tokenManager.d.ts +18 -2
- package/dist/security/tokenManager.d.ts.map +1 -1
- package/dist/security/tokenManager.js +47 -15
- package/dist/security/validators/unicodeValidator.d.ts +4 -5
- package/dist/security/validators/unicodeValidator.d.ts.map +1 -1
- package/dist/security/validators/unicodeValidator.js +19 -20
- package/dist/services/VerificationNotifier.d.ts.map +1 -1
- package/dist/services/VerificationNotifier.js +15 -13
- package/dist/services/validation/GenericElementValidator.js +5 -5
- package/dist/web/console/IngestRoutes.d.ts +14 -2
- package/dist/web/console/IngestRoutes.d.ts.map +1 -1
- package/dist/web/console/IngestRoutes.js +69 -5
- package/dist/web/console/LeaderElection.d.ts +37 -3
- package/dist/web/console/LeaderElection.d.ts.map +1 -1
- package/dist/web/console/LeaderElection.js +67 -7
- package/dist/web/console/LeaderForwardingSink.d.ts +19 -3
- package/dist/web/console/LeaderForwardingSink.d.ts.map +1 -1
- package/dist/web/console/LeaderForwardingSink.js +44 -9
- package/dist/web/console/PromotionManager.d.ts +29 -0
- package/dist/web/console/PromotionManager.d.ts.map +1 -0
- package/dist/web/console/PromotionManager.js +94 -0
- package/dist/web/console/SessionNames.d.ts +7 -0
- package/dist/web/console/SessionNames.d.ts.map +1 -1
- package/dist/web/console/SessionNames.js +10 -1
- package/dist/web/console/UnifiedConsole.d.ts +26 -1
- package/dist/web/console/UnifiedConsole.d.ts.map +1 -1
- package/dist/web/console/UnifiedConsole.js +143 -20
- package/dist/web/portDiscovery.d.ts +4 -3
- package/dist/web/portDiscovery.d.ts.map +1 -1
- package/dist/web/portDiscovery.js +7 -5
- package/dist/web/public/app.js +35 -18
- package/dist/web/public/consoleAuth.js +152 -0
- package/dist/web/public/index.html +243 -9
- package/dist/web/public/logs.js +1 -1
- package/dist/web/public/metrics.js +3 -3
- package/dist/web/public/permissions.js +1 -1
- package/dist/web/public/security.css +396 -0
- package/dist/web/public/security.js +393 -0
- package/dist/web/public/sessions.css +54 -4
- package/dist/web/public/sessions.js +46 -6
- package/dist/web/public/setup.css +439 -0
- package/dist/web/public/setup.js +490 -18
- package/dist/web/public/styles.css +10 -0
- package/dist/web/routes/permissionRoutes.d.ts.map +1 -1
- package/dist/web/routes/permissionRoutes.js +8 -3
- package/dist/web/routes/setupRoutes.d.ts +4 -0
- package/dist/web/routes/setupRoutes.d.ts.map +1 -1
- package/dist/web/routes/setupRoutes.js +418 -7
- package/dist/web/routes.d.ts.map +1 -1
- package/dist/web/routes.js +9 -5
- package/dist/web/server.d.ts +49 -3
- package/dist/web/server.d.ts.map +1 -1
- package/dist/web/server.js +282 -82
- package/package.json +11 -2
- package/server.json +2 -2
|
@@ -926,7 +926,7 @@ export class AgentManager extends BaseElementManager {
|
|
|
926
926
|
}
|
|
927
927
|
// 3. Unicode normalization via InputNormalizer
|
|
928
928
|
const normalized = InputNormalizer.normalize(parameters, '$.parameters');
|
|
929
|
-
if (normalized.
|
|
929
|
+
if (normalized.hasHighOrCriticalIssues) {
|
|
930
930
|
throw new Error(`Template parameter security validation failed: ${normalized.errors.join('; ')}`);
|
|
931
931
|
}
|
|
932
932
|
// Apply normalized values back (in-place, since we already cloned)
|
|
@@ -2441,4 +2441,4 @@ export class AgentManager extends BaseElementManager {
|
|
|
2441
2441
|
return suggestions;
|
|
2442
2442
|
}
|
|
2443
2443
|
}
|
|
2444
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQWdlbnRNYW5hZ2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2VsZW1lbnRzL2FnZW50cy9BZ2VudE1hbmFnZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7OztHQUdHO0FBR0gsT0FBTyxLQUFLLElBQUksTUFBTSxNQUFNLENBQUM7QUFFN0IsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLFlBQVksQ0FBQztBQUNuQyxPQUFPLEVBQ0wsd0JBQXdCLEVBQ3hCLFlBQVksRUFDWixxQkFBcUIsRUFDckIsa0JBQWtCLEVBQ2xCLHlCQUF5QixFQUN6QixrQkFBa0IsRUFDbEIsT0FBTyxFQUNQLHFCQUFxQixFQUNyQix1QkFBdUIsRUFDdkIsaUJBQWlCLEdBQ2xCLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEIsT0FBTyxFQVFMLHFCQUFxQixHQUd0QixNQUFNLFlBQVksQ0FBQztBQUNwQixPQUFPLEVBQUUsZUFBZSxFQUFxQixNQUFNLG1CQUFtQixDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQzFELE9BQU8sRUFDTCxTQUFTLEVBQ1QsYUFBYSxHQUNkLE1BQU0sc0JBQXNCLENBQUM7QUFDOUIsT0FBTyxFQUNMLG1CQUFtQixFQUNuQiwyQkFBMkIsRUFDM0IseUJBQXlCLEVBQ3pCLHlCQUF5QixFQUN6QixzQkFBc0IsR0FDdkIsTUFBTSx3QkFBd0IsQ0FBQztBQUNoQyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUNuRSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDdkQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHlDQUF5QyxDQUFDO0FBQzFFLE9BQU8sRUFBRSxhQUFhLEVBQUUsWUFBWSxFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDL0UsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sK0NBQStDLENBQUM7QUFDakYs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QztRQUN0RixDQUFDO1FBRUQsc0NBQXNDO1FBQ3RDLE1BQU0sY0FBYyxHQUFHLEtBQUssQ0FBQyxTQUFTO2FBQ25DLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQzthQUNWLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLEtBQUssU0FBUyxDQUFDLENBQUM7UUFDeEMsSUFBSSxjQUFjLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQzlCLFdBQVcsQ0FBQyxJQUFJLENBQUMsc0JBQXNCLGNBQWMsQ0FBQyxNQUFNLG9CQUFvQixDQUFDLENBQUM7UUFDcEYsQ0FBQztRQUVELE9BQU8sV0FBVyxDQUFDO0lBQ3JCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEFnZW50TWFuYWdlciAtIFJlZmFjdG9yZWQgdG8gZXh0ZW5kIEJhc2VFbGVtZW50TWFuYWdlclxuICogTWFuYWdlcyBhZ2VudCBDUlVEIG9wZXJhdGlvbnMsIG1ldGFkYXRhIHNhbml0aXphdGlvbiwgYW5kIHN0YXRlIHBlcnNpc3RlbmNlLlxuICovXG5cbmltcG9ydCB7IEZpbGVPcGVyYXRpb25zU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL0ZpbGVPcGVyYXRpb25zU2VydmljZS5qcyc7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuXG5pbXBvcnQgeyBBZ2VudCB9IGZyb20gJy4vQWdlbnQuanMnO1xuaW1wb3J0IHtcbiAgQ09NTUlUX1BFUlNJU1RFRF9WRVJTSU9OLFxuICBBR0VOVF9MSU1JVFMsXG4gIFJJU0tfVE9MRVJBTkNFX0xFVkVMUyxcbiAgU1RFUF9MSU1JVF9BQ1RJT05TLFxuICBFWEVDVVRJT05fRkFJTFVSRV9BQ1RJT05TLFxuICBCQUNLT0ZGX1NUUkFURUdJRVMsXG4gIGlzT25lT2YsXG4gIG5vcm1hbGl6ZUF1dG9ub215S2V5cyxcbiAgbm9ybWFsaXplUmVzaWxpZW5jZUtleXMsXG4gIG5vcm1hbGl6ZUdvYWxLZXlzLFxufSBmcm9tICcuL2NvbnN0YW50cy5qcyc7XG5pbXBvcnQge1xuICBBZ2VudE1ldGFkYXRhLFxuICBBZ2VudFN0YXRlLFxuICBFeGVjdXRlQWdlbnRSZXN1bHQsXG4gIEFnZW50R29hbENvbmZpZyxcbiAgQWdlbnRHb2FsUGFyYW1ldGVyLFxuICBBZ2VudE1ldGFkYXRhVjIsXG4gIEFnZW50R29hbCxcbiAgREVGQVVMVF9TQUZFVFlfQ09ORklHLFxuICBFeGVjdXRpb25Db250ZXh0LFxuICBBdXRvbm9teURpcmVjdGl2ZSxcbn0gZnJvbSAnLi90eXBlcy5qcyc7XG5pbXBvcnQgeyBnZXRHYXRoZXJlZERhdGEsIHR5cGUgR2F0aGVyZWREYXRhIH0gZnJvbSAnLi9nYXRoZXJlZERhdGEuanMnO1xuaW1wb3J0IHsgZXZhbHVhdGVBdXRvbm9teSB9IGZyb20gJy4vYXV0b25vbXlFdmFsdWF0b3IuanMnO1xuaW1wb3J0IHtcbiAgaXNWMUFnZW50LFxuICBjb252ZXJ0VjFUb1YyLFxufSBmcm9tICcuL3YxVG9WMkNvbnZlcnRlci5qcyc7XG5pbXBvcnQge1xuICBkZXRlcm1pbmVTYWZldHlUaWVyLFxuICBjcmVhdGVWZXJpZmljYXRpb25DaGFsbGVuZ2UsXG4gIGNyZWF0ZUNvbmZpcm1hdGlvblJlcXVlc3QsXG4gIGNyZWF0ZURhbmdlclpvbmVPcGVyYXRpb24sXG4gIGNyZWF0ZUV4ZWN1dGlvbkNvbnRleHQsXG59IGZyb20gJy4vc2FmZXR5VGllclNlcnZpY2UuanMnO1xuaW1wb3J0IHsgQmFzZUVsZW1lbnRNYW5hZ2VyIH0gZnJvbSAnLi4vYmFzZS9CYXNlRWxlbWVudE1hbmFnZXIuanMnO1xuaW1wb3J0IHsgRWxlbWVudFR5cGUgfSBmcm9tICcuLi8uLi9wb3J0Zm9saW8vdHlwZXMuanMnO1xuaW1wb3J0IHsgdG9TaW5ndWxhckxhYmVsIH0gZnJvbSAnLi4vLi4vdXRpbHMvZWxlbWVudFR5cGVOb3JtYWxpemF0aW9uLmpzJztcbmltcG9ydCB7IHNhbml0aXplSW5wdXQsIHZhbGlkYXRlUGF0aCB9IGZyb20gJy4uLy4uL3NlY3VyaXR5L0lucHV0VmFsaWRhdG9yLmpzJztcbmltcG9ydCB7IFVuaWNvZGVWYWxpZGF0b3IgfSBmcm9tICcuLi8uLi9zZWN1cml0eS92YWxpZGF0b3JzL3VuaWNvZGVWYWxpZGF0b3IuanMnO1xuaW1wb3J0IHsgU2VjdXJpdHlNb25pdG9yIH0gZnJvbSAnLi4vLi4vc2VjdXJpdHkvc2VjdXJpdHlNb25pdG9yLmpzJztcbmltcG9ydCB7IENvbnRlbnRWYWxpZGF0b3IgfSBmcm9tICcuLi8uLi9zZWN1cml0eS9jb250ZW50VmFsaWRhdG9yLmpzJztcbmltcG9ydCB7IElucHV0Tm9ybWFsaXplciB9IGZyb20gJy4uLy4uL3NlY3VyaXR5L0lucHV0Tm9ybWFsaXplci5qcyc7XG5pbXBvcnQgeyBTYWZlUmVnZXggfSBmcm9tICcuLi8uLi9zZWN1cml0eS9kb3NQcm90ZWN0aW9uLmpzJztcbmltcG9ydCB7IEZpbGVMb2NrTWFuYWdlciB9IGZyb20gJy4uLy4uL3NlY3VyaXR5L2ZpbGVMb2NrTWFuYWdlci5qcyc7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi8uLi91dGlscy9sb2dnZXIuanMnO1xuaW1wb3J0IHsgUG9ydGZvbGlvTWFuYWdlciB9IGZyb20gJy4uLy4uL3BvcnRmb2xpby9Qb3J0Zm9saW9NYW5hZ2VyLmpzJztcbmltcG9ydCB7IFZhbGlkYXRpb25SZWdpc3RyeSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3ZhbGlkYXRpb24vVmFsaWRhdGlvblJlZ2lzdHJ5LmpzJztcbmltcG9ydCB7IFRyaWdnZXJWYWxpZGF0aW9uU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3ZhbGlkYXRpb24vVHJpZ2dlclZhbGlkYXRpb25TZXJ2aWNlLmpzJztcbmltcG9ydCB7IFZhbGlkYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvdmFsaWRhdGlvbi9WYWxpZGF0aW9uU2VydmljZS5qcyc7XG5pbXBvcnQgeyBTZXJpYWxpemF0aW9uU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL1NlcmlhbGl6YXRpb25TZXJ2aWNlLmpzJztcbmltcG9ydCB7IE1ldGFkYXRhU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL01ldGFkYXRhU2VydmljZS5qcyc7XG5pbXBvcnQgeyBGaWxlV2F0Y2hTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvRmlsZVdhdGNoU2VydmljZS5qcyc7XG5pbXBvcnQgeyBFbGVtZW50TWVzc2FnZXMgfSBmcm9tICcuLi8uLi91dGlscy9lbGVtZW50TWVzc2FnZXMuanMnO1xuaW1wb3J0IHsgRWxlbWVudE5vdEZvdW5kRXJyb3IgfSBmcm9tICcuLi8uLi91dGlscy9FcnJvckhhbmRsZXIuanMnO1xuaW1wb3J0IHsgc2FuaXRpemVHYXRla2VlcGVyUG9saWN5IH0gZnJvbSAnLi4vLi4vaGFuZGxlcnMvbWNwLWFxbC9wb2xpY2llcy9FbGVtZW50UG9saWNpZXMuanMnO1xuaW1wb3J0IHsgU0VDVVJJVFlfTElNSVRTIH0gZnJvbSAnLi4vLi4vc2VjdXJpdHkvY29uc3RhbnRzLmpzJztcblxuY29uc3QgQUdFTlRfRklMRV9FWFRFTlNJT04gPSAnLm1kJztcbmNvbnN0IFNUQVRFX0RJUkVDVE9SWSA9ICcuc3RhdGUnO1xuY29uc3QgU1RBVEVfRklMRV9FWFRFTlNJT04gPSAnLnN0YXRlLnlhbWwnO1xuY29uc3QgTUFYX1lBTUxfU0laRSA9IDY0ICogMTAyNDtcbmNvbnN0IE1BWF9GSUxFX1NJWkUgPSAxMDAgKiAxMDI0O1xuXG4vLyBJc3N1ZSAjODM6IENlbnRyYWxpemVkIGFjdGl2ZSBlbGVtZW50IGxpbWl0cyAoY29uZmlndXJhYmxlIHZpYSBlbnYgdmFycylcbmltcG9ydCB7IGdldEFjdGl2ZUVsZW1lbnRMaW1pdENvbmZpZywgZ2V0TWF4QWN0aXZlTGltaXQgfSBmcm9tICcuLi8uLi9jb25maWcvYWN0aXZlLWVsZW1lbnQtbGltaXRzLmpzJztcblxuaW50ZXJmYWNlIEVsZW1lbnRDcmVhdGlvblJlc3VsdCB7XG4gIHN1Y2Nlc3M6IGJvb2xlYW47XG4gIG1lc3NhZ2U6IHN0cmluZztcbiAgZWxlbWVudD86IEFnZW50O1xufVxuXG5pbnRlcmZhY2UgUGFyc2VkQWdlbnRGaWxlIHtcbiAgbWV0YWRhdGE6IEFnZW50TWV0YWRhdGE7XG4gIGNvbnRlbnQ6IHN0cmluZztcbn1cblxuZXhwb3J0IGNsYXNzIEFnZW50TWFuYWdlciBleHRlbmRzIEJhc2VFbGVtZW50TWFuYWdlcjxBZ2VudD4ge1xuICBwcml2YXRlIHJlYWRvbmx5IHN0YXRlRGlyOiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgc3RhdGVDYWNoZTogTWFwPHN0cmluZywgQWdlbnRTdGF0ZT4gPSBuZXcgTWFwKCk7XG4gIHByaXZhdGUgdHJpZ2dlclZhbGlkYXRpb25TZXJ2aWNlOiBUcmlnZ2VyVmFsaWRhdGlvblNlcnZpY2U7XG4gIHByaXZhdGUgdmFsaWRhdGlvblNlcnZpY2U6IFZhbGlkYXRpb25TZXJ2aWNlO1xuICBwcml2YXRlIHNlcmlhbGl6YXRpb25TZXJ2aWNlOiBTZXJpYWxpemF0aW9uU2VydmljZTtcbiAgcHJpdmF0ZSBtZXRhZGF0YVNlcnZpY2U6IE1ldGFkYXRhU2VydmljZTtcbiAgLy8gVHJhY2sgYWN0aXZlIGFnZW50cyBieSBuYW1lIChzdGFibGUgaWRlbnRpZmllcilcbiAgcHJpdmF0ZSBhY3RpdmVBZ2VudE5hbWVzOiBTZXQ8c3RyaW5nPiA9IG5ldyBTZXQoKTtcblxuICAvLyBTdGF0aWMgcmVzb2x2ZXIgZm9yIGVsZW1lbnQgbWFuYWdlciBsb29rdXAgKERJIHBhdHRlcm4pXG4gIC8vIFRoaXMgYWxsb3dzIEFnZW50IGluc3RhbmNlcyB0byByZXNvbHZlIG1hbmFnZXJzIHdpdGhvdXQgdGlnaHQgY291cGxpbmdcbiAgcHJpdmF0ZSBzdGF0aWMgZWxlbWVudE1hbmFnZXJSZXNvbHZlcj86IChtYW5hZ2VyTmFtZTogc3RyaW5nKSA9PiBhbnk7XG5cbiAgLy8gSXNzdWUgIzQwMjogU3RhdGljIHJlc29sdmVyIGZvciBEYW5nZXJab25lRW5mb3JjZXIgKERJIHBhdHRlcm4pXG4gIHByaXZhdGUgc3RhdGljIGRhbmdlclpvbmVFbmZvcmNlclJlc29sdmVyPzogKCkgPT4gaW1wb3J0KCcuL3R5cGVzLmpzJykuRGFuZ2VyWm9uZUJsb2NrZXI7XG5cbiAgLy8gSXNzdWUgIzE0MjogU3RhdGljIHJlc29sdmVyIGZvciBWZXJpZmljYXRpb25TdG9yZSAoREkgcGF0dGVybilcbiAgcHJpdmF0ZSBzdGF0aWMgdmVyaWZpY2F0aW9uU3RvcmVSZXNvbHZlcj86ICgpID0+IHsgc2V0OiAoaWQ6IHN0cmluZywgY2hhbGxlbmdlOiB7IGNvZGU6IHN0cmluZzsgZXhwaXJlc0F0OiBudW1iZXI7IHJlYXNvbjogc3RyaW5nIH0pID0+IHZvaWQgfTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwb3J0Zm9saW9NYW5hZ2VyOiBQb3J0Zm9saW9NYW5hZ2VyLFxuICAgIGZpbGVMb2NrTWFuYWdlcjogRmlsZUxvY2tNYW5hZ2VyLFxuICAgIGJhc2VEaXI6IHN0cmluZyxcbiAgICBmaWxlT3BlcmF0aW9uc1NlcnZpY2U6IEZpbGVPcGVyYXRpb25zU2VydmljZSxcbiAgICB2YWxpZGF0aW9uUmVnaXN0cnk6IFZhbGlkYXRpb25SZWdpc3RyeSxcbiAgICBzZXJpYWxpemF0aW9uU2VydmljZTogU2VyaWFsaXphdGlvblNlcnZpY2UsXG4gICAgbWV0YWRhdGFTZXJ2aWNlOiBNZXRhZGF0YVNlcnZpY2UsXG4gICAgZmlsZVdhdGNoU2VydmljZT86IEZpbGVXYXRjaFNlcnZpY2UsXG4gICAgbWVtb3J5QnVkZ2V0PzogaW1wb3J0KCcuLi8uLi9jYWNoZS9DYWNoZU1lbW9yeUJ1ZGdldC5qcycpLkNhY2hlTWVtb3J5QnVkZ2V0LFxuICAgIGJhY2t1cFNlcnZpY2U/OiBpbXBvcnQoJy4uLy4uL3NlcnZpY2VzL0JhY2t1cFNlcnZpY2UuanMnKS5CYWNrdXBTZXJ2aWNlXG4gICkge1xuICAgIGNvbnN0IGVsZW1lbnREaXJPdmVycmlkZSA9IHBhdGguam9pbihiYXNlRGlyLCBFbGVtZW50VHlwZS5BR0VOVCk7XG4gICAgc3VwZXIoRWxlbWVudFR5cGUuQUdFTlQsIHBvcnRmb2xpb01hbmFnZXIsIGZpbGVMb2NrTWFuYWdlciwgeyBlbGVtZW50RGlyT3ZlcnJpZGUsIGZpbGVXYXRjaFNlcnZpY2UsIG1lbW9yeUJ1ZGdldCwgYmFja3VwU2VydmljZSB9LCBmaWxlT3BlcmF0aW9uc1NlcnZpY2UsIHZhbGlkYXRpb25SZWdpc3RyeSk7XG4gICAgdGhpcy5zdGF0ZURpciA9IHBhdGguam9pbih0aGlzLmVsZW1lbnREaXIsIFNUQVRFX0RJUkVDVE9SWSk7XG4gICAgdGhpcy50cmlnZ2VyVmFsaWRhdGlvblNlcnZpY2UgPSB2YWxpZGF0aW9uUmVnaXN0cnkuZ2V0VHJpZ2dlclZhbGlkYXRpb25TZXJ2aWNlKCk7XG4gICAgdGhpcy52YWxpZGF0aW9uU2VydmljZSA9IHZhbGlkYXRpb25SZWdpc3RyeS5nZXRWYWxpZGF0aW9uU2VydmljZSgpO1xuICAgIHRoaXMuc2VyaWFsaXphdGlvblNlcnZpY2UgPSBzZXJpYWxpemF0aW9uU2VydmljZTtcbiAgICB0aGlzLm1ldGFkYXRhU2VydmljZSA9IG1ldGFkYXRhU2VydmljZTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBnZXRFbGVtZW50TGFiZWwoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gJ2FnZW50JztcbiAgfVxuXG4gIC8qKlxuICAgKiBDb25maWd1cmUgdGhlIGVsZW1lbnQgbWFuYWdlciByZXNvbHZlciBmb3IgZWxlbWVudC1hZ25vc3RpYyBhY3RpdmF0aW9uXG4gICAqIFRoaXMgaXMgY2FsbGVkIGJ5IHRoZSBESSBjb250YWluZXIgZHVyaW5nIGluaXRpYWxpemF0aW9uXG4gICAqIEZvbGxvd3MgdGhlIHNhbWUgcGF0dGVybiBhcyBNZW1vcnkuY29uZmlndXJlTWVtb3J5TWFuYWdlclJlc29sdmVyXG4gICAqXG4gICAqIEBwYXJhbSByZXNvbHZlciBGdW5jdGlvbiB0aGF0IHRha2VzIGEgbWFuYWdlciBuYW1lIGFuZCByZXR1cm5zIHRoZSBtYW5hZ2VyIGluc3RhbmNlXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHNldEVsZW1lbnRNYW5hZ2VyUmVzb2x2ZXIocmVzb2x2ZXI6IChtYW5hZ2VyTmFtZTogc3RyaW5nKSA9PiBhbnkpOiB2b2lkIHtcbiAgICBBZ2VudE1hbmFnZXIuZWxlbWVudE1hbmFnZXJSZXNvbHZlciA9IHJlc29sdmVyO1xuICB9XG5cbiAgLyoqXG4gICAqIElzc3VlICM0MDI6IFNldCBEYW5nZXJab25lRW5mb3JjZXIgcmVzb2x2ZXIgZm9yIERJIGluamVjdGlvbi5cbiAgICogQ2FsbGVkIGJ5IHRoZSBESSBjb250YWluZXIgZHVyaW5nIGluaXRpYWxpemF0aW9uLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBzZXREYW5nZXJab25lRW5mb3JjZXJSZXNvbHZlcihyZXNvbHZlcjogKCkgPT4gaW1wb3J0KCcuL3R5cGVzLmpzJykuRGFuZ2VyWm9uZUJsb2NrZXIpOiB2b2lkIHtcbiAgICBBZ2VudE1hbmFnZXIuZGFuZ2VyWm9uZUVuZm9yY2VyUmVzb2x2ZXIgPSByZXNvbHZlcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBJc3N1ZSAjMTQyOiBTZXQgVmVyaWZpY2F0aW9uU3RvcmUgcmVzb2x2ZXIgZm9yIERJIGluamVjdGlvbi5cbiAgICogQ2FsbGVkIGJ5IHRoZSBESSBjb250YWluZXIgZHVyaW5nIGluaXRpYWxpemF0aW9uLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBzZXRWZXJpZmljYXRpb25TdG9yZVJlc29sdmVyKHJlc29sdmVyOiAoKSA9PiB7IHNldDogKGlkOiBzdHJpbmcsIGNoYWxsZW5nZTogeyBjb2RlOiBzdHJpbmc7IGV4cGlyZXNBdDogbnVtYmVyOyByZWFzb246IHN0cmluZyB9KSA9PiB2b2lkIH0pOiB2b2lkIHtcbiAgICBBZ2VudE1hbmFnZXIudmVyaWZpY2F0aW9uU3RvcmVSZXNvbHZlciA9IHJlc29sdmVyO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgZWxlbWVudCBtYW5hZ2VyIHJlc29sdmVyXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBnZXRFbGVtZW50TWFuYWdlclJlc29sdmVyKCk6ICgobWFuYWdlck5hbWU6IHN0cmluZykgPT4gYW55KSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIEFnZW50TWFuYWdlci5lbGVtZW50TWFuYWdlclJlc29sdmVyO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc2V0IHN0YXRpYyByZXNvbHZlcnMgKGZvciB0ZXN0IGNsZWFudXApXG4gICAqIENhbGwgdGhpcyBpbiBhZnRlckVhY2ggaG9va3MgdG8gcHJldmVudCB0ZXN0IGlzb2xhdGlvbiBpc3N1ZXNcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgcmVzZXRSZXNvbHZlcnMoKTogdm9pZCB7XG4gICAgQWdlbnRNYW5hZ2VyLmVsZW1lbnRNYW5hZ2VyUmVzb2x2ZXIgPSB1bmRlZmluZWQ7XG4gICAgQWdlbnRNYW5hZ2VyLmRhbmdlclpvbmVFbmZvcmNlclJlc29sdmVyID0gdW5kZWZpbmVkO1xuICAgIEFnZW50TWFuYWdlci52ZXJpZmljYXRpb25TdG9yZVJlc29sdmVyID0gdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIFByZXBhcmUgZGlyZWN0b3J5IHN0cnVjdHVyZSBmb3IgYWdlbnRzIGFuZCBzdGF0ZSBmaWxlcy5cbiAgICovXG4gIGFzeW5jIGluaXRpYWxpemUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5maWxlT3BlcmF0aW9ucy5jcmVhdGVEaXJlY3RvcnkodGhpcy5lbGVtZW50RGlyKTtcbiAgICBhd2FpdCB0aGlzLmZpbGVPcGVyYXRpb25zLmNyZWF0ZURpcmVjdG9yeSh0aGlzLnN0YXRlRGlyKTtcbiAgICBsb2dnZXIuaW5mbygnQWdlbnRNYW5hZ2VyIGluaXRpYWxpemVkJywgeyBwYXRoOiB0aGlzLmVsZW1lbnREaXIgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgbmV3IGFnZW50IG9uIGRpc2suXG4gICAqL1xuICBhc3luYyBjcmVhdGUoXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmcsXG4gICAgY29udGVudDogc3RyaW5nLFxuICAgIG1ldGFkYXRhPzogUGFydGlhbDxBZ2VudE1ldGFkYXRhPiAmIHsgY29udGVudD86IHN0cmluZyB9XG4gICk6IFByb21pc2U8RWxlbWVudENyZWF0aW9uUmVzdWx0PiB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuaW5pdGlhbGl6ZSgpO1xuXG4gICAgICAvLyBOb3JtYWxpemUgZ29hbCBpbnB1dCBiZWZvcmUgdmFsaWRhdGlvbiAtIExMTXMgbWF5IHBhc3Mgc3RyaW5nIG9yIG9iamVjdFxuICAgICAgLy8gU3RyaXAgJ2NvbnRlbnQnIGZyb20gbWV0YWRhdGEgdG8gcHJldmVudCBpdCBmcm9tIG92ZXJ3cml0aW5nIHRoZSBwb3NpdGlvbmFsXG4gICAgICAvLyBjb250ZW50IHBhcmFtICh3aGljaCBpcyB0aGUgYWdlbnQncyBpbnN0cnVjdGlvbnMgdGV4dCkgaW4gdGhlIHZhbGlkYXRpb24gY2FsbC5cbiAgICAgIGNvbnN0IHsgY29udGVudDogX3JlZmVyZW5jZUNvbnRlbnQsIC4uLm1ldGFkYXRhV2l0aG91dENvbnRlbnQgfSA9IChtZXRhZGF0YSB8fCB7fSkgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgICBjb25zdCBub3JtYWxpemVkTWV0YWRhdGE6IFBhcnRpYWw8QWdlbnRNZXRhZGF0YVYyPiA9IHsgLi4ubWV0YWRhdGFXaXRob3V0Q29udGVudCB9IGFzIFBhcnRpYWw8QWdlbnRNZXRhZGF0YVYyPjtcbiAgICAgIGlmICgobWV0YWRhdGEgYXMgUGFydGlhbDxBZ2VudE1ldGFkYXRhVjI+KT8uZ29hbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIG5vcm1hbGl6ZWRNZXRhZGF0YS5nb2FsID0gdGhpcy5ub3JtYWxpemVHb2FsSW5wdXQoXG4gICAgICAgICAgKG1ldGFkYXRhIGFzIFBhcnRpYWw8QWdlbnRNZXRhZGF0YVYyPikuZ29hbCBhcyBzdHJpbmcgfCBQYXJ0aWFsPEFnZW50R29hbENvbmZpZz5cbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgLy8gVXNlIHNwZWNpYWxpemVkIHZhbGlkYXRvciBmb3IgaW5wdXQgdmFsaWRhdGlvblxuICAgICAgLy8gSW5jbHVkZSBtZXRhZGF0YSB0byB2YWxpZGF0ZSBWMiBmaWVsZHMgKGdvYWwsIGFjdGl2YXRlcywgdG9vbHMsIHN5c3RlbVByb21wdCwgYXV0b25vbXkpXG4gICAgICBjb25zdCB2YWxpZGF0aW9uUmVzdWx0ID0gYXdhaXQgdGhpcy52YWxpZGF0b3IudmFsaWRhdGVDcmVhdGUoe1xuICAgICAgICBuYW1lLFxuICAgICAgICBkZXNjcmlwdGlvbixcbiAgICAgICAgY29udGVudCxcbiAgICAgICAgLi4ubm9ybWFsaXplZE1ldGFkYXRhXG4gICAgICB9KTtcblxuICAgICAgaWYgKCF2YWxpZGF0aW9uUmVzdWx0LmlzVmFsaWQpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgICBtZXNzYWdlOiBgVmFsaWRhdGlvbiBmYWlsZWQ6ICR7dmFsaWRhdGlvblJlc3VsdC5lcnJvcnMuam9pbignLCAnKX1gXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIC8vIExvZyB3YXJuaW5ncyBpZiBhbnlcbiAgICAgIGlmICh2YWxpZGF0aW9uUmVzdWx0Lndhcm5pbmdzICYmIHZhbGlkYXRpb25SZXN1bHQud2FybmluZ3MubGVuZ3RoID4gMCkge1xuICAgICAgICBsb2dnZXIud2FybihgQWdlbnQgY3JlYXRpb24gd2FybmluZ3M6ICR7dmFsaWRhdGlvblJlc3VsdC53YXJuaW5ncy5qb2luKCcsICcpfWApO1xuICAgICAgfVxuXG4gICAgICAvLyBTYW5pdGl6ZSBpbnB1dHMgZm9yIGVsZW1lbnQgY3JlYXRpb25cbiAgICAgIGNvbnN0IHNhbml0aXplZE5hbWUgPSBzYW5pdGl6ZUlucHV0KFVuaWNvZGVWYWxpZGF0b3Iubm9ybWFsaXplKG5hbWUpLm5vcm1hbGl6ZWRDb250ZW50LCAxMDApO1xuICAgICAgY29uc3Qgc2FuaXRpemVkRGVzY3JpcHRpb24gPSBzYW5pdGl6ZUlucHV0KFVuaWNvZGVWYWxpZGF0b3Iubm9ybWFsaXplKGRlc2NyaXB0aW9uKS5ub3JtYWxpemVkQ29udGVudCwgNTAwKTtcbiAgICAgIC8vIFVzZSBDb250ZW50VmFsaWRhdG9yIGZvciBtdWx0aS1saW5lIGNvbnRlbnQgdG8gcHJlc2VydmUgZm9ybWF0dGluZyAobmV3bGluZXMsIHRhYnMpXG4gICAgICAvLyB3aGlsZSBzdGlsbCBkZXRlY3RpbmcgcHJvbXB0IGluamVjdGlvbiBhdHRhY2tzXG4gICAgICBjb25zdCBjb250ZW50VmFsaWRhdGlvbiA9IENvbnRlbnRWYWxpZGF0b3IudmFsaWRhdGVBbmRTYW5pdGl6ZShjb250ZW50LCB7IG1heExlbmd0aDogU0VDVVJJVFlfTElNSVRTLk1BWF9DT05URU5UX0xFTkdUSCwgY29udGVudENvbnRleHQ6ICdhZ2VudCcgfSk7XG4gICAgICBjb25zdCBzYW5pdGl6ZWRJbnN0cnVjdGlvbnMgPSBjb250ZW50VmFsaWRhdGlvbi5zYW5pdGl6ZWRDb250ZW50IHx8ICcnO1xuXG4gICAgICBpZiAoIXRoaXMudmFsaWRhdGVFbGVtZW50TmFtZShzYW5pdGl6ZWROYW1lKSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICAgIG1lc3NhZ2U6ICdJbnZhbGlkIGFnZW50IG5hbWUuIFVzZSBvbmx5IGxldHRlcnMsIG51bWJlcnMsIGh5cGhlbnMsIGFuZCB1bmRlcnNjb3Jlcy4nXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGZpbGVuYW1lID0gdGhpcy5nZXRGaWxlbmFtZShzYW5pdGl6ZWROYW1lKTtcbiAgICAgIGNvbnN0IGFnZW50ID0gbmV3IEFnZW50KHtcbiAgICAgICAgLi4ubm9ybWFsaXplZE1ldGFkYXRhLFxuICAgICAgICBuYW1lOiBzYW5pdGl6ZWROYW1lLFxuICAgICAgICBkZXNjcmlwdGlvbjogc2FuaXRpemVkRGVzY3JpcHRpb25cbiAgICAgIH0sIHRoaXMubWV0YWRhdGFTZXJ2aWNlKTtcblxuICAgICAgYWdlbnQubWV0YWRhdGEuYXV0aG9yID0gbm9ybWFsaXplZE1ldGFkYXRhPy5hdXRob3IgPz8gdGhpcy5nZXRDdXJyZW50VXNlckZvckF0dHJpYnV0aW9uKCk7XG4gICAgICBhZ2VudC5leHRlbnNpb25zID0ge1xuICAgICAgICAuLi5hZ2VudC5leHRlbnNpb25zLFxuICAgICAgICBzcGVjaWFsaXphdGlvbnM6IG5vcm1hbGl6ZWRNZXRhZGF0YT8uc3BlY2lhbGl6YXRpb25zID8/IGFnZW50LmV4dGVuc2lvbnM/LnNwZWNpYWxpemF0aW9ucyA/PyBbXSxcbiAgICAgICAgZGVjaXNpb25GcmFtZXdvcms6IG5vcm1hbGl6ZWRNZXRhZGF0YT8uZGVjaXNpb25GcmFtZXdvcmsgPz8gYWdlbnQuZXh0ZW5zaW9ucz8uZGVjaXNpb25GcmFtZXdvcmssXG4gICAgICAgIHJpc2tUb2xlcmFuY2U6IG5vcm1hbGl6ZWRNZXRhZGF0YT8ucmlza1RvbGVyYW5jZSA/PyBhZ2VudC5leHRlbnNpb25zPy5yaXNrVG9sZXJhbmNlLFxuICAgICAgICBsZWFybmluZ0VuYWJsZWQ6IG5vcm1hbGl6ZWRNZXRhZGF0YT8ubGVhcm5pbmdFbmFibGVkID8/IGFnZW50LmV4dGVuc2lvbnM/LmxlYXJuaW5nRW5hYmxlZCxcbiAgICAgIH07XG4gICAgICAvLyBQcm9tb3RlIGluc3RydWN0aW9ucyB0byBmaXJzdC1jbGFzcyBwcm9wZXJ0eSAobm8gbG9uZ2VyIGluIGV4dGVuc2lvbnMpXG4gICAgICBhZ2VudC5pbnN0cnVjdGlvbnMgPSBzYW5pdGl6ZWRJbnN0cnVjdGlvbnM7XG4gICAgICAvLyBBbHNvIGtlZXAgaW4gZXh0ZW5zaW9ucyBmb3IgYmFja3dhcmQgY29tcGF0IGR1cmluZyB0cmFuc2l0aW9uXG4gICAgICBhZ2VudC5leHRlbnNpb25zLmluc3RydWN0aW9ucyA9IHNhbml0aXplZEluc3RydWN0aW9ucztcblxuICAgICAgLy8gU2V0IHJlZmVyZW5jZSBjb250ZW50IGlmIHByb3ZpZGVkICh2Mi4wIGR1YWwtZmllbGQgYXJjaGl0ZWN0dXJlKVxuICAgICAgY29uc3QgcmVmZXJlbmNlQ29udGVudCA9IChtZXRhZGF0YSBhcyB7IGNvbnRlbnQ/OiBzdHJpbmcgfSB8IHVuZGVmaW5lZCk/LmNvbnRlbnQ7XG4gICAgICBpZiAocmVmZXJlbmNlQ29udGVudCkge1xuICAgICAgICBjb25zdCBjb250ZW50VmFsaWRhdGlvblJlc3VsdCA9IENvbnRlbnRWYWxpZGF0b3IudmFsaWRhdGVBbmRTYW5pdGl6ZShcbiAgICAgICAgICBTdHJpbmcocmVmZXJlbmNlQ29udGVudCksXG4gICAgICAgICAgeyBtYXhMZW5ndGg6IFNFQ1VSSVRZX0xJTUlUUy5NQVhfQ09OVEVOVF9MRU5HVEgsIGNvbnRlbnRDb250ZXh0OiAnYWdlbnQnIH1cbiAgICAgICAgKTtcbiAgICAgICAgYWdlbnQuY29udGVudCA9IGNvbnRlbnRWYWxpZGF0aW9uUmVzdWx0LnNhbml0aXplZENvbnRlbnQgfHwgJyc7XG4gICAgICB9XG5cbiAgICAgIC8vIElzc3VlICM3Mjc6IFZhbGlkYXRlIGFuZCBub3JtYWxpemUgVjIgZmllbGRzIEJFRk9SRSBhc3NpZ25tZW50LlxuICAgICAgLy8gVGhpcyBpcyB0aGUgU0VDT05EIHZhbGlkYXRpb24gbGF5ZXIg4oCUIEFnZW50RWxlbWVudFZhbGlkYXRvciAoY2FsbGVkIGFib3ZlIHZpYVxuICAgICAgLy8gdGhpcy52YWxpZGF0b3IudmFsaWRhdGVDcmVhdGUpIGlzIHRoZSBmaXJzdC4gVGhlIHZhbGlkYXRvciBjYXRjaGVzIGNhbWVsQ2FzZVxuICAgICAgLy8gaW52YWxpZCB2YWx1ZXM7IHRoaXMgbWV0aG9kIGFsc28gbm9ybWFsaXplcyBzbmFrZV9jYXNlIGtleXMgKHdoaWNoIHRoZSB2YWxpZGF0b3JcbiAgICAgIC8vIGRvZXNuJ3Qgc2VlKSBhbmQgdmFsaWRhdGVzIHRoZW0uIEJvdGggbGF5ZXJzIGFyZSBuZWVkZWQuIFNlZSBJc3N1ZSAjNzMwLlxuICAgICAgY29uc3QgbWV0YWRhdGFWMiA9IG5vcm1hbGl6ZWRNZXRhZGF0YSBhcyBQYXJ0aWFsPEFnZW50TWV0YWRhdGFWMj4gfCB1bmRlZmluZWQ7XG4gICAgICBpZiAobWV0YWRhdGFWMikge1xuICAgICAgICBjb25zdCB2MkVycm9ycyA9IHRoaXMudmFsaWRhdGVWMkZpZWxkc0ZvckNyZWF0ZShtZXRhZGF0YVYyKTtcbiAgICAgICAgaWYgKHYyRXJyb3JzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgICBtZXNzYWdlOiBgVjIgZmllbGQgdmFsaWRhdGlvbiBmYWlsZWQ6ICR7djJFcnJvcnMuam9pbignOyAnKX1gXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBWMiBGSUVMRFM6IFN0b3JlIFYyLXNwZWNpZmljIGZpZWxkcyBpbiBhZ2VudCBtZXRhZGF0YSAobm90IGp1c3QgZXh0ZW5zaW9ucylcbiAgICAgIC8vIFRoaXMgZW5hYmxlcyBWMiBhZ2VudCBjcmVhdGlvbiB2aWEgTUNQLUFRTCBjcmVhdGVfZWxlbWVudCBvcGVyYXRpb25cbiAgICAgIGlmIChtZXRhZGF0YVYyPy5nb2FsKSB7XG4gICAgICAgIChhZ2VudC5tZXRhZGF0YSBhcyBBZ2VudE1ldGFkYXRhVjIpLmdvYWwgPSBtZXRhZGF0YVYyLmdvYWw7XG4gICAgICB9XG4gICAgICBpZiAobWV0YWRhdGFWMj8uYWN0aXZhdGVzKSB7XG4gICAgICAgIChhZ2VudC5tZXRhZGF0YSBhcyBBZ2VudE1ldGFkYXRhVjIpLmFjdGl2YXRlcyA9IG1ldGFkYXRhVjIuYWN0aXZhdGVzO1xuICAgICAgfVxuICAgICAgaWYgKG1ldGFkYXRhVjI/LnRvb2xzKSB7XG4gICAgICAgIChhZ2VudC5tZXRhZGF0YSBhcyBBZ2VudE1ldGFkYXRhVjIpLnRvb2xzID0gbWV0YWRhdGFWMi50b29scztcbiAgICAgIH1cbiAgICAgIGlmIChtZXRhZGF0YVYyPy5zeXN0ZW1Qcm9tcHQpIHtcbiAgICAgICAgKGFnZW50Lm1ldGFkYXRhIGFzIEFnZW50TWV0YWRhdGFWMikuc3lzdGVtUHJvbXB0ID0gbWV0YWRhdGFWMi5zeXN0ZW1Qcm9tcHQ7XG4gICAgICB9XG4gICAgICBpZiAobWV0YWRhdGFWMj8uYXV0b25vbXkpIHtcbiAgICAgICAgKGFnZW50Lm1ldGFkYXRhIGFzIEFnZW50TWV0YWRhdGFWMikuYXV0b25vbXkgPSBtZXRhZGF0YVYyLmF1dG9ub215O1xuICAgICAgfVxuICAgICAgLy8gSXNzdWUgIzQ0OTogUGVyc2lzdCBnYXRla2VlcGVyIHBvbGljeSBmb3IgR2F0ZWtlZXBlciBlbmZvcmNlbWVudCBkdXJpbmcgZXhlY3V0aW9uXG4gICAgICBpZiAobWV0YWRhdGFWMj8uZ2F0ZWtlZXBlcikge1xuICAgICAgICAoYWdlbnQubWV0YWRhdGEgYXMgQWdlbnRNZXRhZGF0YVYyKS5nYXRla2VlcGVyID0gbWV0YWRhdGFWMi5nYXRla2VlcGVyO1xuICAgICAgfVxuICAgICAgLy8gSXNzdWUgIzcyMjogUGVyc2lzdCByZXNpbGllbmNlIHBvbGljeSAod2FzIG1pc3NpbmcgZnJvbSBWMiBmaWVsZCBhc3NpZ25tZW50cylcbiAgICAgIGlmIChtZXRhZGF0YVYyPy5yZXNpbGllbmNlKSB7XG4gICAgICAgIChhZ2VudC5tZXRhZGF0YSBhcyBBZ2VudE1ldGFkYXRhVjIpLnJlc2lsaWVuY2UgPSBtZXRhZGF0YVYyLnJlc2lsaWVuY2U7XG4gICAgICB9XG5cbiAgICAgIC8vIElzc3VlICM2MTM6IENoZWNrIG1ldGFkYXRhIG5hbWUgdW5pcXVlbmVzcyAobm90IGp1c3QgZmlsZW5hbWUpXG4gICAgICBjb25zdCBleGlzdGluZ0FnZW50cyA9IGF3YWl0IHRoaXMubGlzdCgpO1xuICAgICAgY29uc3QgZHVwbGljYXRlID0gZXhpc3RpbmdBZ2VudHMuZmluZChhID0+XG4gICAgICAgIGEubWV0YWRhdGEubmFtZS50b0xvd2VyQ2FzZSgpID09PSBzYW5pdGl6ZWROYW1lLnRvTG93ZXJDYXNlKClcbiAgICAgICk7XG4gICAgICBpZiAoZHVwbGljYXRlKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgbWVzc2FnZTogYEFnZW50ICcke3Nhbml0aXplZE5hbWV9JyBhbHJlYWR5IGV4aXN0c2BcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgLy8gU2VyaWFsaXplIHRoZSBhZ2VudCBjb250ZW50IGZpcnN0XG4gICAgICBjb25zdCBzZXJpYWxpemVkQ29udGVudCA9IGF3YWl0IHRoaXMuc2VyaWFsaXplRWxlbWVudChhZ2VudCk7XG4gICAgICBjb25zdCBhYnNvbHV0ZVBhdGggPSB0aGlzLnJlc29sdmVBYnNvbHV0ZVBhdGgoZmlsZW5hbWUpO1xuXG4gICAgICAvLyBVc2UgYXRvbWljIGZpbGUgY3JlYXRpb24gdG8gcHJldmVudCBUT0NUT1UgcmFjZSBjb25kaXRpb25zXG4gICAgICAvLyBUaGlzIHJlcGxhY2VzIHRoZSBwcmV2aW91cyBjaGVjay10aGVuLXdyaXRlIHBhdHRlcm4gd2l0aCBhIHNpbmdsZSBhdG9taWMgb3BlcmF0aW9uXG4gICAgICBjb25zdCBjcmVhdGVkID0gYXdhaXQgdGhpcy5maWxlT3BlcmF0aW9ucy5jcmVhdGVGaWxlRXhjbHVzaXZlKGFic29sdXRlUGF0aCwgc2VyaWFsaXplZENvbnRlbnQsIHtcbiAgICAgICAgc291cmNlOiAnQWdlbnRNYW5hZ2VyLmNyZWF0ZSdcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoIWNyZWF0ZWQpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgICBtZXNzYWdlOiBgQWdlbnQgJyR7c2FuaXRpemVkTmFtZX0nIGFscmVhZHkgZXhpc3RzYFxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICAvLyBDYWNoZSB0aGUgZWxlbWVudCBhZnRlciBzdWNjZXNzZnVsIGNyZWF0aW9uXG4gICAgICB0aGlzLmNhY2hlRWxlbWVudChhZ2VudCwgZmlsZW5hbWUpO1xuICAgICAgLy8gTm90ZTogTm8gcmVsb2FkKCkgaGVyZSDigJQgY2FjaGVFbGVtZW50KCkgc3RvcmVzIHRoZSBlbGVtZW50IGNvcnJlY3RseS5cbiAgICAgIC8vIFNlZSBJc3N1ZSAjNDkxIGZvciB3aHkgUGVyc29uYU1hbmFnZXIncyByZWxvYWQtYWZ0ZXItY3JlYXRlIHdhcyByZW1vdmVkLlxuXG4gICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgIHR5cGU6ICdFTEVNRU5UX0NSRUFURUQnLFxuICAgICAgICBzZXZlcml0eTogJ0xPVycsXG4gICAgICAgIHNvdXJjZTogJ0FnZW50TWFuYWdlci5jcmVhdGUnLFxuICAgICAgICBkZXRhaWxzOiBgQWdlbnQgJyR7c2FuaXRpemVkTmFtZX0nIGNyZWF0ZWRgLFxuICAgICAgICBhZGRpdGlvbmFsRGF0YTogeyBhZ2VudElkOiBhZ2VudC5pZCB9XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc3VjY2VzczogdHJ1ZSxcbiAgICAgICAgbWVzc2FnZTogYPCfpJYgKioke3Nhbml0aXplZE5hbWV9KiogYnkgJHthZ2VudC5tZXRhZGF0YS5hdXRob3IgfHwgJ2Fub255bW91cyd9YCxcbiAgICAgICAgZWxlbWVudDogYWdlbnRcbiAgICAgIH07XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci5lcnJvcignRmFpbGVkIHRvIGNyZWF0ZSBhZ2VudCcsIGVycm9yKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICBtZXNzYWdlOiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6ICdGYWlsZWQgdG8gY3JlYXRlIGFnZW50J1xuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVhZCBhbiBhZ2VudCBieSBuYW1lICh3aXRob3V0IGV4dGVuc2lvbikuXG4gICAqXG4gICAqIEBwYXJhbSBuYW1lIC0gQWdlbnQgbmFtZSAod2l0aG91dCBleHRlbnNpb24pXG4gICAqIEByZXR1cm5zIEFnZW50IGluc3RhbmNlIG9yIG51bGwgaWYgbm90IGZvdW5kXG4gICAqL1xuICBhc3luYyByZWFkKG5hbWU6IHN0cmluZyk6IFByb21pc2U8QWdlbnQgfCBudWxsPiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHNhbml0aXplZE5hbWUgPSBzYW5pdGl6ZUlucHV0KG5hbWUsIDEwMCk7XG4gICAgICBjb25zdCBmaWxlbmFtZSA9IHRoaXMuZ2V0RmlsZW5hbWUoc2FuaXRpemVkTmFtZSk7XG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5sb2FkKGZpbGVuYW1lKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKChlcnJvciBhcyBOb2RlSlMuRXJybm9FeGNlcHRpb24pLmNvZGUgPT09ICdFTk9FTlQnKSB7XG4gICAgICAgIC8vIEZhbGxiYWNrOiBmbGV4aWJsZSBtYXRjaGluZyB2aWEgbGlzdCBzY2FuICgjNjA3KVxuICAgICAgICByZXR1cm4gdGhpcy5yZWFkRmxleGlibHkobmFtZSk7XG4gICAgICB9XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRmFsbGJhY2sgZm9yIHJlYWQoKSB3aGVuIGRpcmVjdCBmaWxlIGxvb2t1cCBmYWlscy5cbiAgICogU2VhcmNoZXMgbG9hZGVkIGFnZW50cyBieSBtZXRhZGF0YSBuYW1lIHVzaW5nIGNhc2UtaW5zZW5zaXRpdmUgYW5kIHNsdWcgbWF0Y2hpbmcuXG4gICAqIExvZ3MgYSB3YXJuaW5nIHdoZW4gYSBtYXRjaCBpcyBmb3VuZCAoaW5kaWNhdGVzIGZpbGVuYW1lL25hbWUgbWlzbWF0Y2ggbmVlZGluZyBjbGVhbnVwKS5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogLy8gRmlsZSBvbiBkaXNrOiBcImxlZ2FjeS1wb3N0ZXItYWdlbnQubWRcIlxuICAgKiAvLyBNZXRhZGF0YSBuYW1lOiBcImxlZ2FjeS1wb3N0ZXJcIlxuICAgKiAvLyBEaXJlY3QgbG9va3VwIGZvciBcImxlZ2FjeS1wb3N0ZXIubWRcIiBmYWlscyAoRU5PRU5UKVxuICAgKiAvLyBGbGV4aWJsZSBmYWxsYmFjayBtYXRjaGVzIHZpYSBtZXRhZGF0YSBuYW1lOlxuICAgKiBjb25zdCBhZ2VudCA9IGF3YWl0IHJlYWQoXCJsZWdhY3ktcG9zdGVyXCIpOyAvLyByZXNvbHZlcyB2aWEgZmFsbGJhY2tcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcmVhZEZsZXhpYmx5KG5hbWU6IHN0cmluZyk6IFByb21pc2U8QWdlbnQgfCBudWxsPiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGFnZW50cyA9IGF3YWl0IHRoaXMubGlzdCgpO1xuICAgICAgaWYgKGFnZW50cy5sZW5ndGggPT09IDApIHJldHVybiBudWxsO1xuXG4gICAgICBjb25zdCBzZWFyY2hMb3dlciA9IG5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgIGNvbnN0IHNlYXJjaFNsdWcgPSB0aGlzLm5vcm1hbGl6ZUZpbGVuYW1lKG5hbWUpO1xuXG4gICAgICAvLyBQYXNzIDE6IGV4YWN0IGNhc2UtaW5zZW5zaXRpdmUgbWF0Y2ggb24gbWV0YWRhdGEgbmFtZVxuICAgICAgbGV0IG1hdGNoID0gYWdlbnRzLmZpbmQoXG4gICAgICAgIChhKSA9PiBhLm1ldGFkYXRhLm5hbWUudG9Mb3dlckNhc2UoKSA9PT0gc2VhcmNoTG93ZXJcbiAgICAgICk7XG5cbiAgICAgIC8vIFBhc3MgMjogc2x1ZyBtYXRjaCAoaGFuZGxlcyBkYXNoZXMsIHVuZGVyc2NvcmVzLCBjYXNpbmcgZGlmZmVyZW5jZXMpXG4gICAgICBpZiAoIW1hdGNoKSB7XG4gICAgICAgIG1hdGNoID0gYWdlbnRzLmZpbmQoKGEpID0+IHtcbiAgICAgICAgICBjb25zdCBzbHVnID0gdGhpcy5ub3JtYWxpemVGaWxlbmFtZShhLm1ldGFkYXRhLm5hbWUpO1xuICAgICAgICAgIHJldHVybiBzbHVnID09PSBzZWFyY2hTbHVnIHx8IHNsdWcgPT09IHNlYXJjaExvd2VyO1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgaWYgKG1hdGNoKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKFxuICAgICAgICAgIGBBZ2VudCBcIiR7bmFtZX1cIiByZXNvbHZlZCB2aWEgZmxleGlibGUgbWF0Y2hpbmcgdG8gZmlsZSB3aXRoIG1ldGFkYXRhIG5hbWUgXCIke21hdGNoLm1ldGFkYXRhLm5hbWV9XCIuIGAgK1xuICAgICAgICAgIGBDb25zaWRlciByZW5hbWluZyB0aGUgZmlsZSB0byBtYXRjaCB0aGUgZXhwZWN0ZWQgY29udmVudGlvbiAoIzYwNykuYFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gbWF0Y2ggPz8gbnVsbDtcbiAgICB9IGNhdGNoIChsaXN0RXJyb3IpIHtcbiAgICAgIGxvZ2dlci5kZWJ1ZyhgRmxleGlibGUgYWdlbnQgbG9va3VwIGZhaWxlZCBmb3IgXCIke25hbWV9XCI6ICR7bGlzdEVycm9yfWApO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSBtZXRhZGF0YS9jb250ZW50IGZvciBhbiBleGlzdGluZyBhZ2VudC5cbiAgICovXG4gIGFzeW5jIHVwZGF0ZShcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgdXBkYXRlczogUGFydGlhbDxBZ2VudE1ldGFkYXRhPixcbiAgICBjb250ZW50Pzogc3RyaW5nXG4gICk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IHNhbml0aXplZE5hbWUgPSBzYW5pdGl6ZUlucHV0KG5hbWUsIDEwMCk7XG4gICAgY29uc3QgYWdlbnQgPSBhd2FpdCB0aGlzLnJlYWQoc2FuaXRpemVkTmFtZSk7XG4gICAgaWYgKCFhZ2VudCkge1xuICAgICAgbG9nZ2VyLndhcm4oYEFnZW50IG5vdCBmb3VuZCBmb3IgdXBkYXRlOiAke25hbWV9YCk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gVXNlIHNwZWNpYWxpemVkIHZhbGlkYXRvciBmb3IgZWRpdCB2YWxpZGF0aW9uXG4gICAgY29uc3QgdmFsaWRhdGlvblJlc3VsdCA9IGF3YWl0IHRoaXMudmFsaWRhdG9yLnZhbGlkYXRlRWRpdChhZ2VudCwge1xuICAgICAgLi4udXBkYXRlcyxcbiAgICAgIGNvbnRlbnRcbiAgICB9KTtcblxuICAgIGlmICghdmFsaWRhdGlvblJlc3VsdC5pc1ZhbGlkKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoYEFnZW50IHVwZGF0ZSB2YWxpZGF0aW9uIGZhaWxlZDogJHt2YWxpZGF0aW9uUmVzdWx0LmVycm9ycy5qb2luKCcsICcpfWApO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vIExvZyB3YXJuaW5ncyBpZiBhbnlcbiAgICBpZiAodmFsaWRhdGlvblJlc3VsdC53YXJuaW5ncyAmJiB2YWxpZGF0aW9uUmVzdWx0Lndhcm5pbmdzLmxlbmd0aCA+IDApIHtcbiAgICAgIGxvZ2dlci53YXJuKGBBZ2VudCB1cGRhdGUgd2FybmluZ3M6ICR7dmFsaWRhdGlvblJlc3VsdC53YXJuaW5ncy5qb2luKCcsICcpfWApO1xuICAgIH1cblxuICAgIGlmICh1cGRhdGVzLmRlc2NyaXB0aW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGFnZW50Lm1ldGFkYXRhLmRlc2NyaXB0aW9uID0gc2FuaXRpemVJbnB1dChcbiAgICAgICAgVW5pY29kZVZhbGlkYXRvci5ub3JtYWxpemUodXBkYXRlcy5kZXNjcmlwdGlvbikubm9ybWFsaXplZENvbnRlbnQsXG4gICAgICAgIDUwMFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAodXBkYXRlcy5zcGVjaWFsaXphdGlvbnMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgYWdlbnQuZXh0ZW5zaW9ucyA9IHtcbiAgICAgICAgLi4uYWdlbnQuZXh0ZW5zaW9ucyxcbiAgICAgICAgc3BlY2lhbGl6YXRpb25zOiB1cGRhdGVzLnNwZWNpYWxpemF0aW9ucy5tYXAoaXRlbSA9PiBzYW5pdGl6ZUlucHV0KGl0ZW0sIDUwKSlcbiAgICAgIH07XG4gICAgfVxuXG4gICAgaWYgKHVwZGF0ZXMuZGVjaXNpb25GcmFtZXdvcmsgIT09IHVuZGVmaW5lZCkge1xuICAgICAgYWdlbnQuZXh0ZW5zaW9ucyA9IHtcbiAgICAgICAgLi4uYWdlbnQuZXh0ZW5zaW9ucyxcbiAgICAgICAgZGVjaXNpb25GcmFtZXdvcms6IHVwZGF0ZXMuZGVjaXNpb25GcmFtZXdvcmtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgaWYgKHVwZGF0ZXMucmlza1RvbGVyYW5jZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBhZ2VudC5leHRlbnNpb25zID0ge1xuICAgICAgICAuLi5hZ2VudC5leHRlbnNpb25zLFxuICAgICAgICByaXNrVG9sZXJhbmNlOiB1cGRhdGVzLnJpc2tUb2xlcmFuY2VcbiAgICAgIH07XG4gICAgfVxuXG4gICAgaWYgKHVwZGF0ZXMubGVhcm5pbmdFbmFibGVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGFnZW50LmV4dGVuc2lvbnMgPSB7XG4gICAgICAgIC4uLmFnZW50LmV4dGVuc2lvbnMsXG4gICAgICAgIGxlYXJuaW5nRW5hYmxlZDogdXBkYXRlcy5sZWFybmluZ0VuYWJsZWRcbiAgICAgIH07XG4gICAgfVxuXG4gICAgaWYgKHVwZGF0ZXMubWF4Q29uY3VycmVudEdvYWxzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGFnZW50Lm1ldGFkYXRhLm1heENvbmN1cnJlbnRHb2FscyA9IHVwZGF0ZXMubWF4Q29uY3VycmVudEdvYWxzO1xuICAgIH1cblxuICAgIGFnZW50Lm1ldGFkYXRhLm1vZGlmaWVkID0gbmV3IERhdGUoKS50b0lTT1N0cmluZygpO1xuXG4gICAgaWYgKGNvbnRlbnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gVXNlIENvbnRlbnRWYWxpZGF0b3IgZm9yIG11bHRpLWxpbmUgY29udGVudCB0byBwcmVzZXJ2ZSBmb3JtYXR0aW5nIChuZXdsaW5lcywgdGFicylcbiAgICAgIC8vIHdoaWxlIHN0aWxsIGRldGVjdGluZyBwcm9tcHQgaW5qZWN0aW9uIGF0dGFja3NcbiAgICAgIGNvbnN0IGNvbnRlbnRWYWxpZGF0aW9uID0gQ29udGVudFZhbGlkYXRvci52YWxpZGF0ZUFuZFNhbml0aXplKGNvbnRlbnQsIHsgbWF4TGVuZ3RoOiBTRUNVUklUWV9MSU1JVFMuTUFYX0NPTlRFTlRfTEVOR1RILCBjb250ZW50Q29udGV4dDogJ2FnZW50JyB9KTtcbiAgICAgIGFnZW50LmV4dGVuc2lvbnMgPSB7XG4gICAgICAgIC4uLmFnZW50LmV4dGVuc2lvbnMsXG4gICAgICAgIGluc3RydWN0aW9uczogY29udGVudFZhbGlkYXRpb24uc2FuaXRpemVkQ29udGVudCB8fCAnJ1xuICAgICAgfTtcbiAgICB9XG5cbiAgICBhd2FpdCB0aGlzLnNhdmUoYWdlbnQsIHRoaXMuZ2V0RmlsZW5hbWUoc2FuaXRpemVkTmFtZSkpO1xuICAgIGxvZ2dlci5pbmZvKGBBZ2VudCB1cGRhdGVkOiAke3Nhbml0aXplZE5hbWV9YCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGUgYSBwcm92aWRlZCBhZ2VudCBuYW1lLlxuICAgKi9cbiAgdmFsaWRhdGVOYW1lKG5hbWU6IHN0cmluZyk6IHsgdmFsaWQ6IGJvb2xlYW47IGVycm9yPzogc3RyaW5nIH0ge1xuICAgIGlmICghbmFtZSB8fCBuYW1lLnRyaW0oKS5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiB7IHZhbGlkOiBmYWxzZSwgZXJyb3I6ICdOYW1lIGNhbm5vdCBiZSBlbXB0eScgfTtcbiAgICB9XG5cbiAgICBpZiAobmFtZS5sZW5ndGggPiAxMDApIHtcbiAgICAgIHJldHVybiB7IHZhbGlkOiBmYWxzZSwgZXJyb3I6ICdOYW1lIGNhbm5vdCBleGNlZWQgMTAwIGNoYXJhY3RlcnMnIH07XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLnZhbGlkYXRlRWxlbWVudE5hbWUobmFtZSkpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHZhbGlkOiBmYWxzZSxcbiAgICAgICAgZXJyb3I6ICdOYW1lIGNhbiBvbmx5IGNvbnRhaW4gbGV0dGVycywgbnVtYmVycywgaHlwaGVucywgYW5kIHVuZGVyc2NvcmVzJ1xuICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4geyB2YWxpZDogdHJ1ZSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEltcG9ydCBhbiBhZ2VudCBmcm9tIHNlcmlhbGl6ZWQgY29udGVudC5cbiAgICovXG4gIGFzeW5jIGltcG9ydEVsZW1lbnQoZGF0YTogc3RyaW5nLCBmb3JtYXQ6ICdqc29uJyB8ICd5YW1sJyB8ICdtYXJrZG93bicgPSAnbWFya2Rvd24nKTogUHJvbWlzZTxBZ2VudD4ge1xuICAgIGlmIChmb3JtYXQgPT09ICdqc29uJykge1xuICAgICAgY29uc3QgcGFyc2VkID0gdGhpcy5zZXJpYWxpemF0aW9uU2VydmljZS5wYXJzZUpzb24oZGF0YSwge1xuICAgICAgICBzb3VyY2U6ICdBZ2VudE1hbmFnZXIuaW1wb3J0RWxlbWVudCdcbiAgICAgIH0pO1xuICAgICAgY29uc3QgYWdlbnQgPSBuZXcgQWdlbnQocGFyc2VkLm1ldGFkYXRhLCB0aGlzLm1ldGFkYXRhU2VydmljZSk7XG4gICAgICBpZiAocGFyc2VkLnN0YXRlKSB7XG4gICAgICAgIGFnZW50LmRlc2VyaWFsaXplKEpTT04uc3RyaW5naWZ5KHBhcnNlZCkpO1xuICAgICAgfVxuICAgICAgYWdlbnQuZXh0ZW5zaW9ucyA9IHtcbiAgICAgICAgLi4uYWdlbnQuZXh0ZW5zaW9ucyxcbiAgICAgICAgaW5zdHJ1Y3Rpb25zOiBwYXJzZWQuaW5zdHJ1Y3Rpb25zIHx8ICcnXG4gICAgICB9O1xuICAgICAgcmV0dXJuIGFnZW50O1xuICAgIH1cblxuICAgIC8vIFVzZSBTZXJpYWxpemF0aW9uU2VydmljZSBmb3IgZnJvbnRtYXR0ZXIgcGFyc2luZ1xuICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuc2VyaWFsaXphdGlvblNlcnZpY2UucGFyc2VGcm9udG1hdHRlcihkYXRhLCB7XG4gICAgICBtYXhZYW1sU2l6ZTogTUFYX1lBTUxfU0laRSxcbiAgICAgIHZhbGlkYXRlQ29udGVudDogZmFsc2UsXG4gICAgICBzb3VyY2U6ICdBZ2VudE1hbmFnZXIuaW1wb3J0RWxlbWVudCdcbiAgICB9KTtcblxuICAgIGNvbnN0IGFnZW50ID0gbmV3IEFnZW50KHJlc3VsdC5kYXRhIGFzIEFnZW50TWV0YWRhdGEsIHRoaXMubWV0YWRhdGFTZXJ2aWNlKTtcbiAgICBhZ2VudC5leHRlbnNpb25zID0ge1xuICAgICAgLi4uYWdlbnQuZXh0ZW5zaW9ucyxcbiAgICAgIGluc3RydWN0aW9uczogcmVzdWx0LmNvbnRlbnQudHJpbSgpXG4gICAgfTtcbiAgICByZXR1cm4gYWdlbnQ7XG4gIH1cblxuICAvKipcbiAgICogRXhwb3J0IGFuIGFnZW50IHRvIEpTT04gb3IgbWFya2Rvd24gKGRlZmF1bHQpLlxuICAgKi9cbiAgYXN5bmMgZXhwb3J0RWxlbWVudChhZ2VudDogQWdlbnQsIGZvcm1hdDogJ2pzb24nIHwgJ3lhbWwnIHwgJ21hcmtkb3duJyA9ICdtYXJrZG93bicpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGlmIChmb3JtYXQgPT09ICdqc29uJykge1xuICAgICAgcmV0dXJuIGFnZW50LnNlcmlhbGl6ZVRvSlNPTigpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnNlcmlhbGl6ZUVsZW1lbnQoYWdlbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIExvYWQgYW4gYWdlbnQgZmlsZSwgZW5mb3JjaW5nIHNpemUgYW5kIGZvcm1hdCBjaGVja3MuXG4gICAqL1xuICBvdmVycmlkZSBhc3luYyBsb2FkKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPEFnZW50PiB7XG4gICAgY29uc3Qgc2FuaXRpemVkSW5wdXQgPSBzYW5pdGl6ZUlucHV0KGZpbGVQYXRoLCAyNTUpO1xuICAgIGNvbnN0IHJlbGF0aXZlUGF0aCA9IHNhbml0aXplZElucHV0LmVuZHNXaXRoKEFHRU5UX0ZJTEVfRVhURU5TSU9OKVxuICAgICAgPyBzYW5pdGl6ZWRJbnB1dFxuICAgICAgOiB0aGlzLmdldEZpbGVuYW1lKHNhbml0aXplSW5wdXQoc2FuaXRpemVkSW5wdXQsIDEwMCkpO1xuXG4gICAgdHJ5IHtcbiAgICAgIHZhbGlkYXRlUGF0aChyZWxhdGl2ZVBhdGgsIHRoaXMuZWxlbWVudERpcik7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci5lcnJvcihgSW52YWxpZCBhZ2VudCBwYXRoOiAke2Vycm9yfWApO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGFnZW50IHBhdGg6ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiAnSW52YWxpZCBwYXRoJ31gKTtcbiAgICB9XG5cbiAgICBjb25zdCBmdWxsUGF0aCA9IHRoaXMucmVzb2x2ZUFic29sdXRlUGF0aChyZWxhdGl2ZVBhdGgpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCB0aGlzLmZpbGVPcGVyYXRpb25zLnJlYWRGaWxlKGZ1bGxQYXRoLCB7IGVuY29kaW5nOiAndXRmLTgnIH0pO1xuXG4gICAgICBpZiAoY29udGVudC5sZW5ndGggPiBNQVhfRklMRV9TSVpFKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgQWdlbnQgZmlsZSBleGNlZWRzIG1heGltdW0gc2l6ZSBvZiAke01BWF9GSUxFX1NJWkV9IGJ5dGVzYCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHBhcnNlZCA9IHRoaXMucGFyc2VBZ2VudEZpbGUoY29udGVudCk7XG4gICAgICBjb25zdCBtZXRhZGF0YSA9IGF3YWl0IHRoaXMucGFyc2VNZXRhZGF0YShwYXJzZWQubWV0YWRhdGEpO1xuICAgICAgY29uc3QgYWdlbnQgPSB0aGlzLmNyZWF0ZUVsZW1lbnQobWV0YWRhdGEsIHBhcnNlZC5jb250ZW50KTtcblxuICAgICAgdGhpcy5jYWNoZUVsZW1lbnQoYWdlbnQsIHJlbGF0aXZlUGF0aCk7XG4gICAgICBhd2FpdCB0aGlzLmh5ZHJhdGVBZ2VudFN0YXRlKGFnZW50LCB0aGlzLnN0cmlwRXh0ZW5zaW9uKHJlbGF0aXZlUGF0aCkpO1xuXG4gICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgIHR5cGU6ICdFTEVNRU5UX0xPQURFRCcsXG4gICAgICAgIHNldmVyaXR5OiAnTE9XJyxcbiAgICAgICAgc291cmNlOiBgJHt0aGlzLmNvbnN0cnVjdG9yLm5hbWV9LmxvYWRgLFxuICAgICAgICBkZXRhaWxzOiBgJHt0aGlzLmdldEVsZW1lbnRMYWJlbENhcGl0YWxpemVkKCl9IGxvYWRlZDogJHthZ2VudC5tZXRhZGF0YS5uYW1lfSB2JHthZ2VudC5tZXRhZGF0YS52ZXJzaW9uIHx8ICd1bmtub3duJ31gLFxuICAgICAgICBhZGRpdGlvbmFsRGF0YToge1xuICAgICAgICAgIGFnZW50SWQ6IGFnZW50LmlkLFxuICAgICAgICAgIGFnZW50TmFtZTogYWdlbnQubWV0YWRhdGEubmFtZSxcbiAgICAgICAgICB2ZXJzaW9uOiBhZ2VudC5tZXRhZGF0YS52ZXJzaW9uLFxuICAgICAgICAgIGF1dGhvcjogYWdlbnQubWV0YWRhdGEuYXV0aG9yLFxuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIGFnZW50O1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoYEZhaWxlZCB0byBsb2FkIGFnZW50IGZyb20gJHtmdWxsUGF0aH06YCwgZXJyb3IpO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIE92ZXJyaWRlIEJhc2VFbGVtZW50TWFuYWdlci5zYXZlIHRvIHBlcnNpc3Qgc3RhdGUgd2hlbiByZXF1aXJlZC5cbiAgICovXG4gIG92ZXJyaWRlIGFzeW5jIHNhdmUoYWdlbnQ6IEFnZW50LCBmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qgc2FuaXRpemVkUGF0aCA9IGZpbGVQYXRoLmVuZHNXaXRoKEFHRU5UX0ZJTEVfRVhURU5TSU9OKVxuICAgICAgPyBzYW5pdGl6ZUlucHV0KGZpbGVQYXRoLCAyNTUpXG4gICAgICA6IHRoaXMuZ2V0RmlsZW5hbWUoc2FuaXRpemVJbnB1dChmaWxlUGF0aCwgMTAwKSk7XG5cbiAgICBhd2FpdCB0aGlzLmVuc3VyZVN0YXRlRGlyZWN0b3J5KCk7XG4gICAgYXdhaXQgc3VwZXIuc2F2ZShhZ2VudCwgc2FuaXRpemVkUGF0aCk7XG5cbiAgICBpZiAoYWdlbnQubmVlZHNTdGF0ZVBlcnNpc3RlbmNlKCkpIHtcbiAgICAgIGNvbnN0IG5ld1ZlcnNpb24gPSBhd2FpdCB0aGlzLnNhdmVBZ2VudFN0YXRlKHRoaXMuc3RyaXBFeHRlbnNpb24oc2FuaXRpemVkUGF0aCksIGFnZW50LmdldFN0YXRlKCkpO1xuICAgICAgYWdlbnRbQ09NTUlUX1BFUlNJU1RFRF9WRVJTSU9OXShuZXdWZXJzaW9uKTsgIC8vIFN5bmMgYWdlbnQncyBpbnRlcm5hbCB2ZXJzaW9uIChJc3N1ZSAjMTIzIGZpeClcbiAgICAgIGFnZW50Lm1hcmtTdGF0ZVBlcnNpc3RlZCgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBQZXJzaXN0IGFnZW50IHN0YXRlIHRvIGRpc2sgKHB1YmxpYyBBUEkgZm9yIGV4dGVybmFsIGNhbGxlcnMpLlxuICAgKlxuICAgKiBUaGlzIG1ldGhvZCBpcyB0aGUgcHJvcGVyIHdheSBmb3IgZXh0ZXJuYWwgY29kZSAoc3RyYXRlZ2llcywgaGFuZGxlcnMpIHRvXG4gICAqIHRyaWdnZXIgc3RhdGUgcGVyc2lzdGVuY2UuIEl0IGltcGxlbWVudHMgdGhlIE9wdGlvbiBDIHBhdHRlcm4gZnJvbSBJc3N1ZSAjMTIzOlxuICAgKiBzdGF0ZVZlcnNpb24gaXMgb25seSBpbmNyZW1lbnRlZCBvbiBzdWNjZXNzZnVsIHNhdmUuXG4gICAqXG4gICAqIEBwYXJhbSBuYW1lIC0gQWdlbnQgbmFtZVxuICAgKiBAcmV0dXJucyBQcm9taXNlPGJvb2xlYW4+IC0gVHJ1ZSBpZiBzdGF0ZSB3YXMgcGVyc2lzdGVkLCBmYWxzZSBpZiBub3QgbmVlZGVkXG4gICAqIEB0aHJvd3MgRXJyb3IgaWYgYWdlbnQgbm90IGZvdW5kIG9yIHNhdmUgZmFpbHNcbiAgICovXG4gIGFzeW5jIHBlcnNpc3RTdGF0ZShuYW1lOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCBhZ2VudCA9IGF3YWl0IHRoaXMucmVhZChuYW1lKTtcbiAgICBpZiAoIWFnZW50KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEFnZW50IG5vdCBmb3VuZDogJHtuYW1lfWApO1xuICAgIH1cblxuICAgIGlmICghYWdlbnQubmVlZHNTdGF0ZVBlcnNpc3RlbmNlKCkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCBuZXdWZXJzaW9uID0gYXdhaXQgdGhpcy5zYXZlQWdlbnRTdGF0ZShuYW1lLCBhZ2VudC5nZXRTdGF0ZSgpKTtcbiAgICBhZ2VudFtDT01NSVRfUEVSU0lTVEVEX1ZFUlNJT05dKG5ld1ZlcnNpb24pO1xuICAgIGFnZW50Lm1hcmtTdGF0ZVBlcnNpc3RlZCgpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIE92ZXJyaWRlIGRlbGV0ZSB0byByZW1vdmUgYXNzb2NpYXRlZCBzdGF0ZSBmaWxlLlxuICAgKlxuICAgKiBGSVg6IFVzZXMgbm9ybWFsaXplRmlsZW5hbWUoKSB0byBlbnN1cmUgc3RhdGUgZmlsZSBkZWxldGlvbiBtYXRjaGVzXG4gICAqIHRoZSBub3JtYWxpemVkIGZpbGVuYW1lIHVzZWQgZm9yIHN0YXRlIGZpbGUgY3JlYXRpb24vbG9hZGluZy5cbiAgICovXG4gIG92ZXJyaWRlIGFzeW5jIGRlbGV0ZShmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qgc2FuaXRpemVkUGF0aCA9IGZpbGVQYXRoLmVuZHNXaXRoKEFHRU5UX0ZJTEVfRVhURU5TSU9OKVxuICAgICAgPyBzYW5pdGl6ZUlucHV0KGZpbGVQYXRoLCAyNTUpXG4gICAgICA6IHRoaXMuZ2V0RmlsZW5hbWUoc2FuaXRpemVJbnB1dChmaWxlUGF0aCwgMTAwKSk7XG4gICAgY29uc3QgbmFtZSA9IHRoaXMuc3RyaXBFeHRlbnNpb24oc2FuaXRpemVkUGF0aCk7XG4gICAgYXdhaXQgc3VwZXIuZGVsZXRlKHNhbml0aXplZFBhdGgpO1xuXG4gICAgLy8gRklYOiBOb3JtYWxpemUgbmFtZSBmb3IgY29uc2lzdGVudCBzdGF0ZSBmaWxlIGRlbGV0aW9uXG4gICAgY29uc3Qgbm9ybWFsaXplZE5hbWUgPSB0aGlzLm5vcm1hbGl6ZUZpbGVuYW1lKG5hbWUpO1xuICAgIGNvbnN0IHN0YXRlUGF0aCA9IHBhdGguam9pbih0aGlzLnN0YXRlRGlyLCBgJHtub3JtYWxpemVkTmFtZX0ke1NUQVRFX0ZJTEVfRVhURU5TSU9OfWApO1xuICAgIHRyeSB7XG4gICAgICAvLyBCYWNrIHVwIHRoZSBzdGF0ZSBmaWxlIGJlZm9yZSBkZWxldGluZyBpdFxuICAgICAgaWYgKHRoaXMuYmFja3VwU2VydmljZSkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmJhY2t1cFNlcnZpY2UuYmFja3VwQmVmb3JlRGVsZXRlKHN0YXRlUGF0aCwgRWxlbWVudFR5cGUuQUdFTlQpO1xuICAgICAgICBpZiAoIXJlc3VsdC5tb3ZlZE9yaWdpbmFsKSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy5maWxlT3BlcmF0aW9ucy5kZWxldGVGaWxlKHN0YXRlUGF0aCwgRWxlbWVudFR5cGUuQUdFTlQsIHtcbiAgICAgICAgICAgIHNvdXJjZTogJ0FnZW50TWFuYWdlci5kZWxldGUgKHN0YXRlIGZpbGUpJ1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhd2FpdCB0aGlzLmZpbGVPcGVyYXRpb25zLmRlbGV0ZUZpbGUoc3RhdGVQYXRoLCBFbGVtZW50VHlwZS5BR0VOVCwge1xuICAgICAgICAgIHNvdXJjZTogJ0FnZW50TWFuYWdlci5kZWxldGUgKHN0YXRlIGZpbGUpJ1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKChlcnJvciBhcyBOb2RlSlMuRXJybm9FeGNlcHRpb24pLmNvZGUgIT09ICdFTk9FTlQnKSB7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBGSVg6IFVzZSBub3JtYWxpemVkIG5hbWUgYXMgY2FjaGUga2V5IGZvciBjb25zaXN0ZW50IGNhY2hlIGNsZWFudXBcbiAgICB0aGlzLnN0YXRlQ2FjaGUuZGVsZXRlKG5vcm1hbGl6ZWROYW1lKTtcbiAgfVxuXG4gIG92ZXJyaWRlIGFzeW5jIGV4aXN0cyhmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3Qgc2FuaXRpemVkUGF0aCA9IGZpbGVQYXRoLmVuZHNXaXRoKEFHRU5UX0ZJTEVfRVhURU5TSU9OKVxuICAgICAgPyBzYW5pdGl6ZUlucHV0KGZpbGVQYXRoLCAyNTUpXG4gICAgICA6IHRoaXMuZ2V0RmlsZW5hbWUoc2FuaXRpemVJbnB1dChmaWxlUGF0aCwgMTAwKSk7XG4gICAgcmV0dXJuIHN1cGVyLmV4aXN0cyhzYW5pdGl6ZWRQYXRoKTtcbiAgfVxuXG4gIG92ZXJyaWRlIHZhbGlkYXRlUGF0aCh0YXJnZXRQYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBpZiAodGFyZ2V0UGF0aC5pbmNsdWRlcygnLi4nKSB8fCB0YXJnZXRQYXRoLmluY2x1ZGVzKCd+JykpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKHRhcmdldFBhdGguc3RhcnRzV2l0aCgnLycpIHx8IC9eW0EtWmEtel06Ly50ZXN0KHRhcmdldFBhdGgpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgZ2V0RmlsZUV4dGVuc2lvbigpOiBzdHJpbmcge1xuICAgIHJldHVybiBBR0VOVF9GSUxFX0VYVEVOU0lPTjtcbiAgfVxuXG4gIC8qKlxuICAgKiBPdmVycmlkZSBsaXN0IHRvIGFwcGx5IGFjdGl2ZSBzdGF0dXMgYmFzZWQgb24gYWN0aXZlQWdlbnROYW1lcyBzZXRcbiAgICovXG4gIG92ZXJyaWRlIGFzeW5jIGxpc3QoKTogUHJvbWlzZTxBZ2VudFtdPiB7XG4gICAgY29uc3QgYWdlbnRzID0gYXdhaXQgc3VwZXIubGlzdCgpO1xuXG4gICAgLy8gQXBwbHkgYWN0aXZlIHN0YXR1cyB0byBhZ2VudHMgdGhhdCBhcmUgaW4gdGhlIGFjdGl2ZSBzZXQgKGJ5IG5hbWUpXG4gICAgZm9yIChjb25zdCBhZ2VudCBvZiBhZ2VudHMpIHtcbiAgICAgIGlmICh0aGlzLmFjdGl2ZUFnZW50TmFtZXMuaGFzKGFnZW50Lm1ldGFkYXRhLm5hbWUpKSB7XG4gICAgICAgIC8vIEFjdGl2YXRlIHRoZSBhZ2VudCB0byBzZXQgc3RhdHVzIHRvIEFDVElWRVxuICAgICAgICBhd2FpdCBhZ2VudC5hY3RpdmF0ZSgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBhZ2VudHM7XG4gIH1cblxuICAvKipcbiAgICogQWN0aXZhdGUgYW4gYWdlbnQgYnkgbmFtZSBvciBpZGVudGlmaWVyXG4gICAqXG4gICAqIElzc3VlICMyNCAoTE9XIFBSSU9SSVRZKTogUGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9uIHVzaW5nIGZpbmRCeU5hbWUoKVxuICAgKiBJc3N1ZSAjMjQgKExPVyBQUklPUklUWSk6IENvbnNpc3RlbnQgZXJyb3IgbWVzc2FnZXMgdXNpbmcgRWxlbWVudE1lc3NhZ2VzXG4gICAqIElzc3VlICMyNCAoTE9XIFBSSU9SSVRZKTogQ2xlYW51cCB0cmlnZ2VyIGZvciBtZW1vcnkgbGVhayBwcmV2ZW50aW9uXG4gICAqL1xuICBhc3luYyBhY3RpdmF0ZUFnZW50KGlkZW50aWZpZXI6IHN0cmluZyk6IFByb21pc2U8eyBzdWNjZXNzOiBib29sZWFuOyBtZXNzYWdlOiBzdHJpbmc7IGFnZW50PzogQWdlbnQgfT4ge1xuICAgIC8vIFBFUkZPUk1BTkNFIEZJWDogVXNlIGZpbmRCeU5hbWUoKSBpbnN0ZWFkIG9mIGxpc3QoKVxuICAgIGNvbnN0IGFnZW50ID0gYXdhaXQgdGhpcy5maW5kQnlOYW1lKGlkZW50aWZpZXIpO1xuXG4gICAgaWYgKCFhZ2VudCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgIC8vIENPTlNJU1RFTkNZIEZJWDogVXNlIHN0YW5kYXJkaXplZCBlcnJvciBtZXNzYWdlIGZvcm1hdFxuICAgICAgICBtZXNzYWdlOiBFbGVtZW50TWVzc2FnZXMubm90Rm91bmQoRWxlbWVudFR5cGUuQUdFTlQsIGlkZW50aWZpZXIpXG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vIE1FTU9SWSBMRUFLIEZJWDogQ2hlY2sgaWYgY2xlYW51cCBpcyBuZWVkZWQgYmVmb3JlIGFkZGluZ1xuICAgIHRoaXMuY2hlY2tBbmRDbGVhbnVwQWN0aXZlU2V0KCk7XG5cbiAgICAvLyBBZGQgdG8gYWN0aXZlIHNldCAoYnkgbmFtZSwgd2hpY2ggaXMgc3RhYmxlIGFjcm9zcyByZWxvYWRzKVxuICAgIHRoaXMuYWN0aXZlQWdlbnROYW1lcy5hZGQoYWdlbnQubWV0YWRhdGEubmFtZSk7XG5cbiAgICAvLyBVcGRhdGUgYWdlbnQgc3RhdHVzIGluIG1lbW9yeVxuICAgIGF3YWl0IGFnZW50LmFjdGl2YXRlKCk7XG5cbiAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICB0eXBlOiAnQUdFTlRfQUNUSVZBVEVEJyxcbiAgICAgIHNldmVyaXR5OiAnTE9XJyxcbiAgICAgIHNvdXJjZTogJ0FnZW50TWFuYWdlci5hY3RpdmF0ZUFnZW50JyxcbiAgICAgIGRldGFpbHM6IGBBZ2VudCBhY3RpdmF0ZWQ6ICR7YWdlbnQubWV0YWRhdGEubmFtZX0gdiR7YWdlbnQubWV0YWRhdGEudmVyc2lvbiB8fCAndW5rbm93bid9YCxcbiAgICAgIGFkZGl0aW9uYWxEYXRhOiB7XG4gICAgICAgIGFnZW50SWQ6IGFnZW50LmlkLFxuICAgICAgICBhZ2VudE5hbWU6IGFnZW50Lm1ldGFkYXRhLm5hbWUsXG4gICAgICAgIHZlcnNpb246IGFnZW50Lm1ldGFkYXRhLnZlcnNpb24sXG4gICAgICAgIGF1dGhvcjogYWdlbnQubWV0YWRhdGEuYXV0aG9yLFxuICAgICAgICBnb2FsQ291bnQ6IChhZ2VudC5tZXRhZGF0YSBhcyBhbnkpLmdvYWw/LnBhcmFtZXRlcnM/Lmxlbmd0aCB8fCAwLFxuICAgICAgICBzcGVjaWFsaXphdGlvbnM6IGFnZW50Lm1ldGFkYXRhLnNwZWNpYWxpemF0aW9ucyxcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGxvZ2dlci5pbmZvKGBBZ2VudCBhY3RpdmF0ZWQ6ICR7YWdlbnQubWV0YWRhdGEubmFtZX1gKTtcblxuICAgIHJldHVybiB7XG4gICAgICBzdWNjZXNzOiB0cnVlLFxuICAgICAgLy8gQ09OU0lTVEVOQ1kgRklYOiBVc2Ugc3RhbmRhcmRpemVkIHN1Y2Nlc3MgbWVzc2FnZSBmb3JtYXRcbiAgICAgIG1lc3NhZ2U6IEVsZW1lbnRNZXNzYWdlcy5hY3RpdmF0ZWQoRWxlbWVudFR5cGUuQUdFTlQsIGFnZW50Lm1ldGFkYXRhLm5hbWUpLFxuICAgICAgYWdlbnRcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIERlYWN0aXZhdGUgYW4gYWdlbnQgYnkgbmFtZSBvciBpZGVudGlmaWVyXG4gICAqXG4gICAqIElzc3VlICMyNCAoTE9XIFBSSU9SSVRZKTogUGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9uIHVzaW5nIGZpbmRCeU5hbWUoKVxuICAgKiBJc3N1ZSAjMjQgKExPVyBQUklPUklUWSk6IENvbnNpc3RlbnQgZXJyb3IgbWVzc2FnZXMgdXNpbmcgRWxlbWVudE1lc3NhZ2VzXG4gICAqL1xuICBhc3luYyBkZWFjdGl2YXRlQWdlbnQoaWRlbnRpZmllcjogc3RyaW5nKTogUHJvbWlzZTx7IHN1Y2Nlc3M6IGJvb2xlYW47IG1lc3NhZ2U6IHN0cmluZyB9PiB7XG4gICAgLy8gUEVSRk9STUFOQ0UgRklYOiBVc2UgZmluZEJ5TmFtZSgpIGluc3RlYWQgb2YgbGlzdCgpXG4gICAgY29uc3QgYWdlbnQgPSBhd2FpdCB0aGlzLmZpbmRCeU5hbWUoaWRlbnRpZmllcik7XG5cbiAgICBpZiAoIWFnZW50KSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgLy8gQ09OU0lTVEVOQ1kgRklYOiBVc2Ugc3RhbmRhcmRpemVkIGVycm9yIG1lc3NhZ2UgZm9ybWF0XG4gICAgICAgIG1lc3NhZ2U6IEVsZW1lbnRNZXNzYWdlcy5ub3RGb3VuZChFbGVtZW50VHlwZS5BR0VOVCwgaWRlbnRpZmllcilcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gUmVtb3ZlIGZyb20gYWN0aXZlIHNldFxuICAgIHRoaXMuYWN0aXZlQWdlbnROYW1lcy5kZWxldGUoYWdlbnQubWV0YWRhdGEubmFtZSk7XG5cbiAgICAvLyBVcGRhdGUgYWdlbnQgc3RhdHVzIGluIG1lbW9yeVxuICAgIGF3YWl0IGFnZW50LmRlYWN0aXZhdGUoKTtcblxuICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgIHR5cGU6ICdBR0VOVF9ERUFDVElWQVRFRCcsXG4gICAgICBzZXZlcml0eTogJ0xPVycsXG4gICAgICBzb3VyY2U6ICdBZ2VudE1hbmFnZXIuZGVhY3RpdmF0ZUFnZW50JyxcbiAgICAgIGRldGFpbHM6IGBBZ2VudCBkZWFjdGl2YXRlZDogJHthZ2VudC5tZXRhZGF0YS5uYW1lfSB2JHthZ2VudC5tZXRhZGF0YS52ZXJzaW9uIHx8ICd1bmtub3duJ31gLFxuICAgICAgYWRkaXRpb25hbERhdGE6IHtcbiAgICAgICAgYWdlbnRJZDogYWdlbnQuaWQsXG4gICAgICAgIGFnZW50TmFtZTogYWdlbnQubWV0YWRhdGEubmFtZSxcbiAgICAgICAgdmVyc2lvbjogYWdlbnQubWV0YWRhdGEudmVyc2lvbixcbiAgICAgICAgYXV0aG9yOiBhZ2VudC5tZXRhZGF0YS5hdXRob3IsXG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBsb2dnZXIuaW5mbyhgQWdlbnQgZGVhY3RpdmF0ZWQ6ICR7YWdlbnQubWV0YWRhdGEubmFtZX1gKTtcblxuICAgIHJldHVybiB7XG4gICAgICBzdWNjZXNzOiB0cnVlLFxuICAgICAgLy8gQ09OU0lTVEVOQ1kgRklYOiBVc2Ugc3RhbmRhcmRpemVkIHN1Y2Nlc3MgbWVzc2FnZSBmb3JtYXRcbiAgICAgIG1lc3NhZ2U6IEVsZW1lbnRNZXNzYWdlcy5kZWFjdGl2YXRlZChFbGVtZW50VHlwZS5BR0VOVCwgYWdlbnQubWV0YWRhdGEubmFtZSlcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhbGwgYWN0aXZlIGFnZW50c1xuICAgKi9cbiAgYXN5bmMgZ2V0QWN0aXZlQWdlbnRzKCk6IFByb21pc2U8QWdlbnRbXT4ge1xuICAgIGNvbnN0IGFnZW50cyA9IGF3YWl0IHRoaXMubGlzdCgpO1xuICAgIHJldHVybiBhZ2VudHMuZmlsdGVyKGEgPT4gdGhpcy5hY3RpdmVBZ2VudE5hbWVzLmhhcyhhLm1ldGFkYXRhLm5hbWUpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeGVjdXRlIGFuIGFnZW50IHdpdGggZ29hbCBwYXJhbWV0ZXJzXG4gICAqXG4gICAqIFJldHVybnMgY29udGV4dCBmb3IgTExNIHRvIGRyaXZlIHRoZSBhZ2VudGljIGxvb3AuXG4gICAqIFRoaXMgbWV0aG9kOlxuICAgKiAxLiBMb2FkcyB0aGUgYWdlbnQgY29uZmlndXJhdGlvblxuICAgKiAyLiBWYWxpZGF0ZXMgYW5kIHJlbmRlcnMgdGhlIGdvYWwgdGVtcGxhdGUgd2l0aCBwYXJhbWV0ZXJzXG4gICAqIDMuIEFjdGl2YXRlcyBjb25maWd1cmVkIGVsZW1lbnRzIChlbGVtZW50LWFnbm9zdGljKVxuICAgKiA0LiBFdmFsdWF0ZXMgcHJvZ3JhbW1hdGljIGNvbnN0cmFpbnRzIGFuZCByaXNrXG4gICAqIDUuIFJldHVybnMgc3RydWN0dXJlZCBjb250ZXh0IGZvciBMTE1cbiAgICpcbiAgICogVGhlIExMTSB0aGVuIGRyaXZlcyB0aGUgYWdlbnRpYyBsb29wIHVzaW5nIHRoaXMgY29udGV4dC5cbiAgICpcbiAgICogQHNpbmNlIHYyLjAuMCAtIEFnZW50aWMgTG9vcCBSZWRlc2lnblxuICAgKi9cbiAgYXN5bmMgZXhlY3V0ZUFnZW50KFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBwYXJhbWV0ZXJzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICApOiBQcm9taXNlPEV4ZWN1dGVBZ2VudFJlc3VsdD4ge1xuICAgIHRyeSB7XG4gICAgICAvLyAxLiBMb2FkIGFnZW50IGJ5IG5hbWVcbiAgICAgIGNvbnN0IGFnZW50ID0gYXdhaXQgdGhpcy5yZWFkKG5hbWUpO1xuICAgICAgaWYgKCFhZ2VudCkge1xuICAgICAgICAvLyBGSVg6IElzc3VlICMyNzUgLSBUaHJvdyBFbGVtZW50Tm90Rm91bmRFcnJvciBmb3IgY29uc2lzdGVudCBlcnJvciBoYW5kbGluZ1xuICAgICAgICB0aHJvdyBuZXcgRWxlbWVudE5vdEZvdW5kRXJyb3IoJ0FnZW50JywgbmFtZSk7XG4gICAgICB9XG5cbiAgICAgIC8vIEdldCBtZXRhZGF0YSBhcyB2MiAobWF5IGhhdmUgZ29hbCBjb25maWcpXG4gICAgICBsZXQgbWV0YWRhdGEgPSBhZ2VudC5tZXRhZGF0YSBhcyBBZ2VudE1ldGFkYXRhVjI7XG5cbiAgICAgIC8vIENoZWNrIGlmIHRoaXMgaXMgYSB2Mi4wIGFnZW50IHdpdGggZ29hbCBjb25maWd1cmF0aW9uXG4gICAgICAvLyBJZiBub3QsIGF1dG8tY29udmVydCBWMSB0byBWMiBpbiBwbGFjZSAoSXNzdWUgIzU4NylcbiAgICAgIGlmICghbWV0YWRhdGEuZ29hbCB8fCAhbWV0YWRhdGEuZ29hbC50ZW1wbGF0ZSkge1xuICAgICAgICBpZiAoaXNWMUFnZW50KG1ldGFkYXRhKSkge1xuICAgICAgICAgIGNvbnN0IGluc3RydWN0aW9ucyA9IGFnZW50LmV4dGVuc2lvbnM/Lmluc3RydWN0aW9ucyB8fCAnJztcbiAgICAgICAgICBjb25zdCBjb252ZXJzaW9uUmVzdWx0ID0gY29udmVydFYxVG9WMihtZXRhZGF0YSwgaW5zdHJ1Y3Rpb25zKTtcblxuICAgICAgICAgIGlmIChjb252ZXJzaW9uUmVzdWx0LmNvbnZlcnRlZCkge1xuICAgICAgICAgICAgLy8gTWVyZ2UgY29udmVydGVkIG1ldGFkYXRhIG9udG8gdGhlIGV4aXN0aW5nIGFnZW50IChpbi1wbGFjZSlcbiAgICAgICAgICAgIE9iamVjdC5hc3NpZ24obWV0YWRhdGEsIGNvbnZlcnNpb25SZXN1bHQubWV0YWRhdGEpO1xuICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihhZ2VudC5tZXRhZGF0YSwgY29udmVyc2lvblJlc3VsdC5tZXRhZGF0YSk7XG5cbiAgICAgICAgICAgIC8vIExvZyBjb252ZXJzaW9uIHdhcm5pbmdzXG4gICAgICAgICAgICBpZiAoY29udmVyc2lvblJlc3VsdC53YXJuaW5ncy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgIGxvZ2dlci53YXJuKGBBZ2VudCAnJHtuYW1lfScgYXV0by1jb252ZXJ0ZWQgZnJvbSBWMSB0byBWMiBpbiBwbGFjZWAsIHtcbiAgICAgICAgICAgICAgICB3YXJuaW5nczogY29udmVyc2lvblJlc3VsdC53YXJuaW5ncyxcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFNhdmUgdGhlIHVwZ3JhZGVkIGFnZW50IGJhY2sgdG8gaXRzIG9yaWdpbmFsIGZpbGVcbiAgICAgICAgICAgIGNvbnN0IHVwZ3JhZGVkRmlsZW5hbWUgPSB0aGlzLmdldEZpbGVuYW1lKHNhbml0aXplSW5wdXQobmFtZSwgMTAwKSk7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLnNhdmUoYWdlbnQsIHVwZ3JhZGVkRmlsZW5hbWUpO1xuICAgICAgICAgICAgbG9nZ2VyLmluZm8oYEFnZW50ICcke25hbWV9JyBjb252ZXJ0ZWQgZnJvbSBWMSB0byBWMiBhbmQgc2F2ZWQgaW4gcGxhY2VgKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICBgQWdlbnQgJyR7bmFtZX0nIGNhbm5vdCBiZSBleGVjdXRlZDogbWlzc2luZyBnb2FsLnRlbXBsYXRlIGFuZCBjb252ZXJzaW9uIGZhaWxlZC5gXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgQWdlbnQgJyR7bmFtZX0nIGlzIG5vdCBhIHYyLjAgYWdlbnQuIE1pc3NpbmcgZ29hbC50ZW1wbGF0ZSBjb25maWd1cmF0aW9uLmBcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIDIuIENsb25lIHBhcmFtZXRlcnMgdG8gcHJldmVudCBtdXRhdGlvbiBvZiBjYWxsZXIncyBvYmplY3QgKElzc3VlICMxMTgpXG4gICAgICBjb25zdCBjbG9uZWRQYXJhbWV0ZXJzID0gc3RydWN0dXJlZENsb25lKHBhcmFtZXRlcnMpO1xuXG4gICAgICAvLyAyYi4gU2VjdXJpdHkgdmFsaWRhdGlvbiBvZiB0ZW1wbGF0ZSBwYXJhbWV0ZXJzIChJc3N1ZSAjMTAzKVxuICAgICAgdGhpcy52YWxpZGF0ZVBhcmFtZXRlclNlY3VyaXR5KGNsb25lZFBhcmFtZXRlcnMpO1xuXG4gICAgICAvLyAzLiBWYWxpZGF0ZSBwYXJhbWV0ZXJzIGFnYWluc3QgZ29hbC5wYXJhbWV0ZXJzIHNjaGVtYVxuICAgICAgdGhpcy52YWxpZGF0ZVBhcmFtZXRlcnMobWV0YWRhdGEuZ29hbCwgY2xvbmVkUGFyYW1ldGVycyk7XG5cbiAgICAgIC8vIDQuIFJlbmRlciBnb2FsIHRlbXBsYXRlIGJ5IHJlcGxhY2luZyB7cGFyYW1ldGVyfSBwbGFjZWhvbGRlcnNcbiAgICAgIGNvbnN0IHJlbmRlcmVkR29hbCA9IHRoaXMucmVuZGVyR29hbFRlbXBsYXRlKG1ldGFkYXRhLmdvYWwudGVtcGxhdGUsIGNsb25lZFBhcmFtZXRlcnMpO1xuXG4gICAgICAvLyA0Yi4gRGV0ZWN0IHVubWF0Y2hlZCBwbGFjZWhvbGRlcnMgYWZ0ZXIgcmVuZGVyaW5nIChJc3N1ZSAjMTI2KVxuICAgICAgY29uc3QgdW5tYXRjaGVkUGxhY2Vob2xkZXJzID0gdGhpcy5kZXRlY3RVbm1hdGNoZWRQbGFjZWhvbGRlcnMocmVuZGVyZWRHb2FsKTtcbiAgICAgIGlmICh1bm1hdGNoZWRQbGFjZWhvbGRlcnMubGVuZ3RoID4gMCkge1xuICAgICAgICBsb2dnZXIud2FybignVW5tYXRjaGVkIHRlbXBsYXRlIHBsYWNlaG9sZGVycyBkZXRlY3RlZCBhZnRlciByZW5kZXJpbmcnLCB7XG4gICAgICAgICAgYWdlbnROYW1lOiBuYW1lLFxuICAgICAgICAgIHVubWF0Y2hlZDogdW5tYXRjaGVkUGxhY2Vob2xkZXJzLFxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgLy8gNS4gQ3JlYXRlIGV4ZWN1dGlvbiBjb250ZXh0IEJFRk9SRSBhY3RpdmF0aW5nIGVsZW1lbnRzIChJc3N1ZSAjMTA5IC0gY2lyY3VsYXIgYWN0aXZhdGlvbiBkZXRlY3Rpb24pXG4gICAgICBjb25zdCBleGVjdXRpb25Db250ZXh0ID0gY3JlYXRlRXhlY3V0aW9uQ29udGV4dChuYW1lKTtcblxuICAgICAgLy8gNWIuIFN0YXRpYyBhY3RpdmF0aW9uIGN5Y2xlIGRldGVjdGlvbiAoSXNzdWUgIzM3NClcbiAgICAgIGlmIChtZXRhZGF0YS5hY3RpdmF0ZXM/LmFnZW50cz8ubGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IGN5Y2xlUGF0aCA9IGF3YWl0IHRoaXMuZGV0ZWN0QWN0aXZhdGlvbkN5Y2xlcyhuYW1lLCBtZXRhZGF0YS5hY3RpdmF0ZXMuYWdlbnRzKTtcbiAgICAgICAgaWYgKGN5Y2xlUGF0aCkge1xuICAgICAgICAgIGNvbnN0IGN5Y2xlU3RhcnQgPSBjeWNsZVBhdGguaW5kZXhPZihjeWNsZVBhdGhbY3ljbGVQYXRoLmxlbmd0aCAtIDFdKTtcbiAgICAgICAgICBjb25zdCBjeWNsZSA9IGN5Y2xlUGF0aC5zbGljZShjeWNsZVN0YXJ0KTtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoQWdlbnRNYW5hZ2VyLmZvcm1hdENpcmN1bGFyQWN0aXZhdGlvbkVycm9yKGN5Y2xlKSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gNi4gQWN0aXZhdGUgZWxlbWVudHMgKGVsZW1lbnQtYWdub3N0aWMpXG4gICAgICBjb25zdCBhY3RpdmVFbGVtZW50czogUmVjb3JkPHN0cmluZywgQXJyYXk8eyBuYW1lOiBzdHJpbmc7IGNvbnRlbnQ6IHN0cmluZyB9Pj4gPSB7fTtcbiAgICAgIGNvbnN0IGFjdGl2YXRpb25XYXJuaW5nczogQXJyYXk8eyBlbGVtZW50VHlwZTogc3RyaW5nOyBlbGVtZW50TmFtZTogc3RyaW5nOyBlcnJvcjogc3RyaW5nIH0+ID0gW107XG5cbiAgICAgIGlmIChtZXRhZGF0YS5hY3RpdmF0ZXMpIHtcbiAgICAgICAgZm9yIChjb25zdCBbZWxlbWVudFR5cGUsIGVsZW1lbnROYW1lc10gb2YgT2JqZWN0LmVudHJpZXMobWV0YWRhdGEuYWN0aXZhdGVzKSkge1xuICAgICAgICAgIGlmICghZWxlbWVudE5hbWVzIHx8IGVsZW1lbnROYW1lcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGFjdGl2ZUVsZW1lbnRzW2VsZW1lbnRUeXBlXSA9IFtdO1xuXG4gICAgICAgICAgZm9yIChjb25zdCBlbGVtZW50TmFtZSBvZiBlbGVtZW50TmFtZXMpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGNvbnN0IGVsZW1lbnRDb250ZW50ID0gYXdhaXQgdGhpcy5nZXRFbGVtZW50Q29udGVudChlbGVtZW50VHlwZSwgZWxlbWVudE5hbWUsIGV4ZWN1dGlvbkNvbnRleHQpO1xuICAgICAgICAgICAgICBhY3RpdmVFbGVtZW50c1tlbGVtZW50VHlwZV0ucHVzaCh7XG4gICAgICAgICAgICAgICAgbmFtZTogZWxlbWVudE5hbWUsXG4gICAgICAgICAgICAgICAgY29udGVudDogZWxlbWVudENvbnRlbnRcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAvLyBISUdILTE6IFJlLXRocm93IGNpcmN1bGFyIGFjdGl2YXRpb24gZXJyb3JzIGltbWVkaWF0ZWx5IChJc3N1ZSAjMTA5KVxuICAgICAgICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvciAmJiBlcnJvci5tZXNzYWdlLmluY2x1ZGVzKCdDaXJjdWxhciBhZ2VudCBhY3RpdmF0aW9uIGRldGVjdGVkJykpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBjb25zdCBlcnJvck1lc3NhZ2UgPSBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcik7XG4gICAgICAgICAgICAgIGFjdGl2YXRpb25XYXJuaW5ncy5wdXNoKHsgZWxlbWVudFR5cGUsIGVsZW1lbnROYW1lLCBlcnJvcjogZXJyb3JNZXNzYWdlIH0pO1xuICAgICAgICAgICAgICBsb2dnZXIud2FybihgQWdlbnQgJyR7bmFtZX0nOiBmYWlsZWQgdG8gYWN0aXZhdGUgJHtlbGVtZW50VHlwZX0gJyR7ZWxlbWVudE5hbWV9JyDigJQgJHtlcnJvck1lc3NhZ2V9YCk7XG4gICAgICAgICAgICAgIC8vIENvbnRpbnVlIHdpdGggb3RoZXIgZWxlbWVudHMgcmF0aGVyIHRoYW4gZmFpbGluZyBjb21wbGV0ZWx5XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIDcuIEJ1aWxkIHRoZSByZXN1bHQgd2l0aCBhbGwgY29udGV4dCAoaW5pdGlhbGl6ZSB3aXRoIGRlZmF1bHQgc2FmZXR5IHRpZXIpXG4gICAgICBjb25zdCByZXN1bHQ6IEV4ZWN1dGVBZ2VudFJlc3VsdCA9IHtcbiAgICAgICAgYWdlbnROYW1lOiBuYW1lLFxuICAgICAgICBnb2FsOiByZW5kZXJlZEdvYWwsXG4gICAgICAgIGFjdGl2ZUVsZW1lbnRzLFxuICAgICAgICBhY3RpdmF0aW9uV2FybmluZ3M6IGFjdGl2YXRpb25XYXJuaW5ncy5sZW5ndGggPiAwID8gYWN0aXZhdGlvbldhcm5pbmdzIDogdW5kZWZpbmVkLFxuICAgICAgICAvLyBJc3N1ZSAjMTI2OiBXYXJuIGFib3V0IHVubWF0Y2hlZCB0ZW1wbGF0ZSBwbGFjZWhvbGRlcnNcbiAgICAgICAgdGVtcGxhdGVXYXJuaW5nczogdW5tYXRjaGVkUGxhY2Vob2xkZXJzLmxlbmd0aCA+IDBcbiAgICAgICAgICA/IHVubWF0Y2hlZFBsYWNlaG9sZGVycy5tYXAocCA9PiBgVW5tYXRjaGVkIHRlbXBsYXRlIHBsYWNlaG9sZGVyOiB7JHtwfX1gKVxuICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgICBhdmFpbGFibGVUb29sczogbWV0YWRhdGEudG9vbHM/LmFsbG93ZWQgfHwgW10sXG4gICAgICAgIHN1Y2Nlc3NDcml0ZXJpYTogbWV0YWRhdGEuZ29hbC5zdWNjZXNzQ3JpdGVyaWEgfHwgW10sXG4gICAgICAgIHN5c3RlbVByb21wdDogbWV0YWRhdGEuc3lzdGVtUHJvbXB0LFxuICAgICAgICBzYWZldHlUaWVyOiAnYWR2aXNvcnknLCAvLyBEZWZhdWx0LCB3aWxsIGJlIHVwZGF0ZWQgYmVsb3dcbiAgICAgIH07XG5cbiAgICAgIC8vIDguIENyZWF0ZSBhbmQgcGVyc2lzdCB0aGUgZ29hbCBmb3IgTExNIHRyYWNraW5nXG4gICAgICAvLyBUaGlzIGFsbG93cyByZWNvcmRfYWdlbnRfc3RlcCB0byBmaW5kIGFuZCB1cGRhdGUgdGhlIGdvYWxcblxuICAgICAgLy8gQ3JlYXRlIHRoZSBnb2FsIHVzaW5nIGFnZW50LmFkZEdvYWwoKSB3aGljaCBoYW5kbGVzIHZhbGlkYXRpb24gYW5kIHNhbml0aXphdGlvblxuICAgICAgY29uc3QgbmV3R29hbCA9IGFnZW50LmFkZEdvYWwoe1xuICAgICAgICBkZXNjcmlwdGlvbjogcmVuZGVyZWRHb2FsLFxuICAgICAgICBwcmlvcml0eTogJ21lZGl1bScsXG4gICAgICAgIGltcG9ydGFuY2U6IDUsXG4gICAgICAgIHVyZ2VuY3k6IDUsXG4gICAgICB9KTtcblxuICAgICAgLy8gU2V0IGdvYWwgc3RhdHVzIHRvIGluX3Byb2dyZXNzIHNpbmNlIGV4ZWN1dGlvbiBoYXMgc3RhcnRlZFxuICAgICAgbmV3R29hbC5zdGF0dXMgPSAnaW5fcHJvZ3Jlc3MnO1xuXG4gICAgICBjb25zdCBleGVjU2FuaXRpemVkTmFtZSA9IHNhbml0aXplSW5wdXQobmFtZSwgMTAwKTtcbiAgICAgIGF3YWl0IHRoaXMuc2F2ZShhZ2VudCwgdGhpcy5nZXRGaWxlbmFtZShleGVjU2FuaXRpemVkTmFtZSkpO1xuXG4gICAgICAvLyBTdG9yZSBnb2FsSWQgaW4gcmVzdWx0IGZvciBMTE0gdG8gdXNlIHdpdGggcmVjb3JkX2FnZW50X3N0ZXBcbiAgICAgIHJlc3VsdC5nb2FsSWQgPSBuZXdHb2FsLmlkO1xuXG4gICAgICAvLyBGaXggIzQ0NTogSW5jbHVkZSBzdGF0ZVZlcnNpb24gc28gc3Vic2VxdWVudCBjYWxscyBjYW4gZG8gdmVyc2lvbi1hd2FyZSBvcGVyYXRpb25zXG4gICAgICBjb25zdCBwb3N0U2F2ZVN0YXRlID0gYWdlbnQuZ2V0U3RhdGUoKTtcbiAgICAgIHJlc3VsdC5zdGF0ZVZlcnNpb24gPSBwb3N0U2F2ZVN0YXRlLnN0YXRlVmVyc2lvbiB8fCAxO1xuXG4gICAgICAvLyBDYWxsIHZhbGlkYXRlR29hbFNlY3VyaXR5IGFuZCBhZGQgd2FybmluZ3MgdG8gcmVzdWx0XG4gICAgICBjb25zdCBzZWN1cml0eVZhbGlkYXRpb24gPSBhZ2VudC52YWxpZGF0ZUdvYWxTZWN1cml0eShyZW5kZXJlZEdvYWwpO1xuICAgICAgaWYgKHNlY3VyaXR5VmFsaWRhdGlvbi53YXJuaW5ncyAmJiBzZWN1cml0eVZhbGlkYXRpb24ud2FybmluZ3MubGVuZ3RoID4gMCkge1xuICAgICAgICByZXN1bHQuc2VjdXJpdHlXYXJuaW5ncyA9IHNlY3VyaXR5VmFsaWRhdGlvbi53YXJuaW5ncztcbiAgICAgIH1cblxuICAgICAgLy8gQ2FsbCBldmFsdWF0ZUNvbnN0cmFpbnRzIGFuZCBhZGQgdG8gcmVzdWx0XG4gICAgICByZXN1bHQuY29uc3RyYWludHMgPSBhZ2VudC5ldmFsdWF0ZUNvbnN0cmFpbnRzKG5ld0dvYWwpO1xuXG4gICAgICAvLyBDYWxsIGFzc2Vzc1Jpc2sgYW5kIGFkZCB0byByZXN1bHRcbiAgICAgIHJlc3VsdC5yaXNrQXNzZXNzbWVudCA9IGFnZW50LmFzc2Vzc1Jpc2soJ2V4ZWN1dGUnLCBuZXdHb2FsLCB7fSk7XG5cbiAgICAgIC8vIENhbGwgY2FsY3VsYXRlUHJpb3JpdHlTY29yZSBhbmQgYWRkIHRvIHJlc3VsdFxuICAgICAgcmVzdWx0LnByaW9yaXR5U2NvcmUgPSBhZ2VudC5jYWxjdWxhdGVQcmlvcml0eVNjb3JlKG5ld0dvYWwpO1xuXG4gICAgICAvLyA5LiBEZXRlcm1pbmUgc2FmZXR5IHRpZXIgYmFzZWQgb24gcmlzayBhc3Nlc3NtZW50IGFuZCBzZWN1cml0eSB3YXJuaW5nc1xuICAgICAgLy8gKE5vdGU6IGV4ZWN1dGlvbkNvbnRleHQgYWxyZWFkeSBjcmVhdGVkIGVhcmxpZXIgZm9yIGNpcmN1bGFyIGRldGVjdGlvbilcbiAgICAgIGNvbnN0IHNhZmV0eVRpZXJSZXN1bHQgPSBkZXRlcm1pbmVTYWZldHlUaWVyKFxuICAgICAgICByZXN1bHQucmlza0Fzc2Vzc21lbnQ/LnNjb3JlIHx8IDAsXG4gICAgICAgIHJlc3VsdC5zZWN1cml0eVdhcm5pbmdzIHx8IFtdLFxuICAgICAgICByZW5kZXJlZEdvYWwsXG4gICAgICAgIERFRkFVTFRfU0FGRVRZX0NPTkZJRyxcbiAgICAgICAgZXhlY3V0aW9uQ29udGV4dFxuICAgICAgKTtcblxuICAgICAgLy8gMTAuIFNldCBzYWZldHkgdGllciBhbmQgcmVsYXRlZCBmaWVsZHNcbiAgICAgIHJlc3VsdC5zYWZldHlUaWVyID0gc2FmZXR5VGllclJlc3VsdC50aWVyO1xuICAgICAgcmVzdWx0LnNhZmV0eVRpZXJSZXN1bHQgPSBzYWZldHlUaWVyUmVzdWx0O1xuICAgICAgcmVzdWx0LmV4ZWN1dGlvbkNvbnRleHQgPSBleGVjdXRpb25Db250ZXh0O1xuXG4gICAgICAvLyAxMS4gQWRkIHRpZXItc3BlY2lmaWMgcmVzcG9uc2VzXG4gICAgICBzd2l0Y2ggKHNhZmV0eVRpZXJSZXN1bHQudGllcikge1xuICAgICAgICBjYXNlICdjb25maXJtJzpcbiAgICAgICAgICByZXN1bHQuY29uZmlybWF0aW9uUmVxdWlyZWQgPSBjcmVhdGVDb25maXJtYXRpb25SZXF1ZXN0KFxuICAgICAgICAgICAgJ09wZXJhdGlvbiByZXF1aXJlcyBjb25maXJtYXRpb24nLFxuICAgICAgICAgICAgc2FmZXR5VGllclJlc3VsdC5mYWN0b3JzXG4gICAgICAgICAgKTtcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlICd2ZXJpZnknOlxuICAgICAgICAgIHJlc3VsdC52ZXJpZmljYXRpb25SZXF1aXJlZCA9IGNyZWF0ZVZlcmlmaWNhdGlvbkNoYWxsZW5nZShcbiAgICAgICAgICAgIHNhZmV0eVRpZXJSZXN1bHQuZmFjdG9ycy5qb2luKCc7ICcpLFxuICAgICAgICAgICAgJ2Rpc3BsYXlfY29kZSdcbiAgICAgICAgICApO1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgJ2Rhbmdlcl96b25lJzpcbiAgICAgICAgICByZXN1bHQuZGFuZ2VyWm9uZUJsb2NrZWQgPSBjcmVhdGVEYW5nZXJab25lT3BlcmF0aW9uKFxuICAgICAgICAgICAgJ2FnZW50X2V4ZWN1dGlvbicsXG4gICAgICAgICAgICBzYWZldHlUaWVyUmVzdWx0LmZhY3RvcnMuam9pbignOyAnKSxcbiAgICAgICAgICAgIERFRkFVTFRfU0FGRVRZX0NPTkZJRy5kYW5nZXJab25lLmVuYWJsZWRcbiAgICAgICAgICApO1xuICAgICAgICAgIC8vIEFsc28gYWRkIHZlcmlmaWNhdGlvbiBpZiBub3QgYmxvY2tlZFxuICAgICAgICAgIGlmICghcmVzdWx0LmRhbmdlclpvbmVCbG9ja2VkLmJsb2NrZWQpIHtcbiAgICAgICAgICAgIHJlc3VsdC52ZXJpZmljYXRpb25SZXF1aXJlZCA9IHJlc3VsdC5kYW5nZXJab25lQmxvY2tlZC52ZXJpZmljYXRpb25SZXF1aXJlZDtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAnYWR2aXNvcnknOlxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIC8vIE5vIGFkZGl0aW9uYWwgYWN0aW9uIG5lZWRlZCBmb3IgYWR2aXNvcnkgdGllclxuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgIHR5cGU6ICdBR0VOVF9FWEVDVVRFRCcsXG4gICAgICAgIHNldmVyaXR5OiAnTE9XJyxcbiAgICAgICAgc291cmNlOiAnQWdlbnRNYW5hZ2VyLmV4ZWN1dGVBZ2VudCcsXG4gICAgICAgIGRldGFpbHM6IGBBZ2VudCBleGVjdXRlZDogJHtuYW1lfSB2JHthZ2VudC5tZXRhZGF0YS52ZXJzaW9uIHx8ICd1bmtub3duJ30gKHNhZmV0eTogJHtzYWZldHlUaWVyUmVzdWx0LnRpZXJ9KWAsXG4gICAgICAgIGFkZGl0aW9uYWxEYXRhOiB7XG4gICAgICAgICAgYWdlbnRJZDogYWdlbnQuaWQsXG4gICAgICAgICAgYWdlbnROYW1lOiBuYW1lLFxuICAgICAgICAgIHZlcnNpb246IGFnZW50Lm1ldGFkYXRhLnZlcnNpb24sXG4gICAgICAgICAgYXV0aG9yOiBhZ2VudC5tZXRhZGF0YS5hdXRob3IsXG4gICAgICAgICAgc2FmZXR5VGllcjogc2FmZXR5VGllclJlc3VsdC50aWVyLFxuICAgICAgICAgIHJpc2tTY29yZTogc2FmZXR5VGllclJlc3VsdC5yaXNrU2NvcmUsXG4gICAgICAgICAgcGFyYW1ldGVyS2V5czogT2JqZWN0LmtleXMocGFyYW1ldGVycyB8fCB7fSksXG4gICAgICAgICAgZ29hbENvdW50OiAobWV0YWRhdGEgYXMgYW55KS5nb2FsPy5wYXJhbWV0ZXJzPy5sZW5ndGggfHwgMCxcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci5lcnJvcihgRmFpbGVkIHRvIGV4ZWN1dGUgYWdlbnQgJyR7bmFtZX0nOmAsIGVycm9yKTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTZWN1cml0eSB2YWxpZGF0aW9uIGZvciB0ZW1wbGF0ZSBwYXJhbWV0ZXJzIChJc3N1ZSAjMTAzKS5cbiAgICogQ2hlY2tzIGZvciBwcm90b3R5cGUgcG9sbHV0aW9uLCBVbmljb2RlIGluamVjdGlvbiwgYW5kIG92ZXJzaXplZCBwYXlsb2Fkcy5cbiAgICogTXVzdCBiZSBjYWxsZWQgQkVGT1JFIHRlbXBsYXRlIHJlbmRlcmluZy5cbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgdmFsaWRhdGVQYXJhbWV0ZXJTZWN1cml0eShwYXJhbWV0ZXJzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IHZvaWQge1xuICAgIC8vIDEuIFByb3RvdHlwZSBwb2xsdXRpb24gY2hlY2sg4oCUIHJlamVjdCBkYW5nZXJvdXMga2V5c1xuICAgIGNvbnN0IEZPUkJJRERFTl9LRVlTID0gWydfX3Byb3RvX18nLCAnY29uc3RydWN0b3InLCAncHJvdG90eXBlJ107XG4gICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMocGFyYW1ldGVycykpIHtcbiAgICAgIGlmIChGT1JCSURERU5fS0VZUy5pbmNsdWRlcyhrZXkpKSB7XG4gICAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgICB0eXBlOiAnVE9LRU5fVkFMSURBVElPTl9GQUlMVVJFJyxcbiAgICAgICAgICBzZXZlcml0eTogJ0hJR0gnLFxuICAgICAgICAgIHNvdXJjZTogJ0FnZW50TWFuYWdlci52YWxpZGF0ZVBhcmFtZXRlclNlY3VyaXR5JyxcbiAgICAgICAgICBkZXRhaWxzOiBgUHJvdG90eXBlIHBvbGx1dGlvbiBhdHRlbXB0IHZpYSBwYXJhbWV0ZXIga2V5OiAnJHtrZXl9J2AsXG4gICAgICAgIH0pO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEZvcmJpZGRlbiBwYXJhbWV0ZXIga2V5OiAnJHtrZXl9JyAocG90ZW50aWFsIHByb3RvdHlwZSBwb2xsdXRpb24pYCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gMi4gTGltaXQgcGFyYW1ldGVyIGNvdW50IHRvIHByZXZlbnQgcmVzb3VyY2UgZXhoYXVzdGlvblxuICAgIGNvbnN0IE1BWF9QQVJBTUVURVJTID0gNTA7XG4gICAgaWYgKE9iamVjdC5rZXlzKHBhcmFtZXRlcnMpLmxlbmd0aCA+IE1BWF9QQVJBTUVURVJTKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFRvbyBtYW55IHBhcmFtZXRlcnM6ICR7T2JqZWN0LmtleXMocGFyYW1ldGVycykubGVuZ3RofSBleGNlZWRzIG1heGltdW0gb2YgJHtNQVhfUEFSQU1FVEVSU31gKTtcbiAgICB9XG5cbiAgICAvLyAzLiBVbmljb2RlIG5vcm1hbGl6YXRpb24gdmlhIElucHV0Tm9ybWFsaXplclxuICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSBJbnB1dE5vcm1hbGl6ZXIubm9ybWFsaXplKHBhcmFtZXRlcnMsICckLnBhcmFtZXRlcnMnKTtcbiAgICBpZiAobm9ybWFsaXplZC5oYXNDcml0aWNhbElzc3Vlcykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgVGVtcGxhdGUgcGFyYW1ldGVyIHNlY3VyaXR5IHZhbGlkYXRpb24gZmFpbGVkOiAke25vcm1hbGl6ZWQuZXJyb3JzLmpvaW4oJzsgJyl9YFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBBcHBseSBub3JtYWxpemVkIHZhbHVlcyBiYWNrIChpbi1wbGFjZSwgc2luY2Ugd2UgYWxyZWFkeSBjbG9uZWQpXG4gICAgY29uc3Qgbm9ybWFsaXplZERhdGEgPSBub3JtYWxpemVkLmRhdGEgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMobm9ybWFsaXplZERhdGEpKSB7XG4gICAgICBwYXJhbWV0ZXJzW2tleV0gPSB2YWx1ZTtcbiAgICB9XG5cbiAgICBpZiAobm9ybWFsaXplZC53YXJuaW5ncy5sZW5ndGggPiAwKSB7XG4gICAgICBsb2dnZXIud2FybignVGVtcGxhdGUgcGFyYW1ldGVyIG5vcm1hbGl6YXRpb24gd2FybmluZ3MnLCB7XG4gICAgICAgIHdhcm5pbmdzOiBub3JtYWxpemVkLndhcm5pbmdzLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlIHBhcmFtZXRlcnMgYWdhaW5zdCBnb2FsIHBhcmFtZXRlciBzY2hlbWFcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgdmFsaWRhdGVQYXJhbWV0ZXJzKFxuICAgIGdvYWxDb25maWc6IEFnZW50R29hbENvbmZpZyxcbiAgICBwYXJhbWV0ZXJzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICApOiB2b2lkIHtcbiAgICBjb25zdCBwYXJhbURlZnMgPSBnb2FsQ29uZmlnLnBhcmFtZXRlcnMgfHwgW107XG5cbiAgICAvLyBDaGVjayBhbGwgcmVxdWlyZWQgcGFyYW1ldGVycyBhcmUgcHJlc2VudFxuICAgIGZvciAoY29uc3QgcGFyYW1EZWYgb2YgcGFyYW1EZWZzKSB7XG4gICAgICBpZiAocGFyYW1EZWYucmVxdWlyZWQgJiYgIShwYXJhbURlZi5uYW1lIGluIHBhcmFtZXRlcnMpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgTWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXI6ICR7cGFyYW1EZWYubmFtZX1gKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBUeXBlIGNoZWNrIHByb3ZpZGVkIHBhcmFtZXRlcnNcbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhwYXJhbWV0ZXJzKSkge1xuICAgICAgY29uc3QgcGFyYW1EZWYgPSBwYXJhbURlZnMuZmluZChwID0+IHAubmFtZSA9PT0ga2V5KTtcbiAgICAgIGlmICghcGFyYW1EZWYpIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oYFVua25vd24gcGFyYW1ldGVyICcke2tleX0nIHByb3ZpZGVkIHRvIGFnZW50YCk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBUeXBlIHZhbGlkYXRpb25cbiAgICAgIGNvbnN0IGFjdHVhbFR5cGUgPSB0eXBlb2YgdmFsdWU7XG4gICAgICBpZiAocGFyYW1EZWYudHlwZSA9PT0gJ3N0cmluZycgJiYgYWN0dWFsVHlwZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBQYXJhbWV0ZXIgJyR7a2V5fScgbXVzdCBiZSBhIHN0cmluZywgZ290ICR7YWN0dWFsVHlwZX1gXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBpZiAocGFyYW1EZWYudHlwZSA9PT0gJ251bWJlcicgJiYgYWN0dWFsVHlwZSAhPT0gJ251bWJlcicpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBQYXJhbWV0ZXIgJyR7a2V5fScgbXVzdCBiZSBhIG51bWJlciwgZ290ICR7YWN0dWFsVHlwZX1gXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBpZiAocGFyYW1EZWYudHlwZSA9PT0gJ2Jvb2xlYW4nICYmIGFjdHVhbFR5cGUgIT09ICdib29sZWFuJykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYFBhcmFtZXRlciAnJHtrZXl9JyBtdXN0IGJlIGEgYm9vbGVhbiwgZ290ICR7YWN0dWFsVHlwZX1gXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIC8vIEFkdmlzb3J5IGxlbmd0aCB3YXJuaW5nIGZvciBzdHJpbmcgdmFsdWVzIChkZWZlbnNlLWluLWRlcHRoLCBkb2VzIG5vdCB0aHJvdylcbiAgICAgIGlmIChhY3R1YWxUeXBlID09PSAnc3RyaW5nJyAmJiAodmFsdWUgYXMgc3RyaW5nKS5sZW5ndGggPiBBR0VOVF9MSU1JVFMuTUFYX0dPQUxfTEVOR1RIKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKCdQYXJhbWV0ZXIgc3RyaW5nIHZhbHVlIGV4Y2VlZHMgTUFYX0dPQUxfTEVOR1RIIChhZHZpc29yeSknLCB7XG4gICAgICAgICAgcGFyYW1OYW1lOiBrZXksXG4gICAgICAgICAgdmFsdWVMZW5ndGg6ICh2YWx1ZSBhcyBzdHJpbmcpLmxlbmd0aCxcbiAgICAgICAgICBtYXhMZW5ndGg6IEFHRU5UX0xJTUlUUy5NQVhfR09BTF9MRU5HVEgsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEFwcGx5IGRlZmF1bHRzIGZvciBvcHRpb25hbCBwYXJhbWV0ZXJzIG5vdCBwcm92aWRlZFxuICAgIGZvciAoY29uc3QgcGFyYW1EZWYgb2YgcGFyYW1EZWZzKSB7XG4gICAgICBpZiAoIXBhcmFtRGVmLnJlcXVpcmVkICYmICEocGFyYW1EZWYubmFtZSBpbiBwYXJhbWV0ZXJzKSAmJiBwYXJhbURlZi5kZWZhdWx0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcGFyYW1ldGVyc1twYXJhbURlZi5uYW1lXSA9IHBhcmFtRGVmLmRlZmF1bHQ7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlbmRlciBnb2FsIHRlbXBsYXRlIGJ5IHJlcGxhY2luZyB7cGFyYW1ldGVyfSBwbGFjZWhvbGRlcnNcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgcmVuZGVyR29hbFRlbXBsYXRlKFxuICAgIHRlbXBsYXRlOiBzdHJpbmcsXG4gICAgcGFyYW1ldGVyczogUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgKTogc3RyaW5nIHtcbiAgICBsZXQgcmVuZGVyZWQgPSB0ZW1wbGF0ZTtcbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhwYXJhbWV0ZXJzKSkge1xuICAgICAgLy8gRXNjYXBlIGtleSB0byBwcmV2ZW50IHJlZ2V4IG1ldGFjaGFyYWN0ZXJzIGZyb20gY2F1c2luZyBSZURvUyAoSXNzdWUgIzEwMylcbiAgICAgIGNvbnN0IGVzY2FwZWRLZXkgPSBTYWZlUmVnZXguZXNjYXBlKGtleSk7XG4gICAgICByZW5kZXJlZCA9IHJlbmRlcmVkLnJlcGxhY2UobmV3IFJlZ0V4cChgXFxcXHske2VzY2FwZWRLZXl9XFxcXH1gLCAnZycpLCBTdHJpbmcodmFsdWUpKTtcbiAgICB9XG5cbiAgICAvLyBDYXAgcmVuZGVyZWQgZ29hbCBsZW5ndGggdG8gcHJldmVudCBvdmVyc2l6ZWQgcGF5bG9hZHNcbiAgICBpZiAocmVuZGVyZWQubGVuZ3RoID4gQUdFTlRfTElNSVRTLk1BWF9SRU5ERVJFRF9HT0FMX0xFTkdUSCkge1xuICAgICAgbG9nZ2VyLndhcm4oJ1JlbmRlcmVkIGdvYWwgZXhjZWVkcyBNQVhfUkVOREVSRURfR09BTF9MRU5HVEgsIHRydW5jYXRpbmcnLCB7XG4gICAgICAgIHJlbmRlcmVkTGVuZ3RoOiByZW5kZXJlZC5sZW5ndGgsXG4gICAgICAgIG1heExlbmd0aDogQUdFTlRfTElNSVRTLk1BWF9SRU5ERVJFRF9HT0FMX0xFTkdUSCxcbiAgICAgIH0pO1xuICAgICAgcmVuZGVyZWQgPSByZW5kZXJlZC5zdWJzdHJpbmcoMCwgQUdFTlRfTElNSVRTLk1BWF9SRU5ERVJFRF9HT0FMX0xFTkdUSCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlbmRlcmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIERldGVjdCB1bm1hdGNoZWQge3BsYWNlaG9sZGVyfSBwYXR0ZXJucyByZW1haW5pbmcgYWZ0ZXIgdGVtcGxhdGUgcmVuZGVyaW5nLlxuICAgKiBSZXR1cm5zIGFycmF5IG9mIHBsYWNlaG9sZGVyIG5hbWVzIGZvdW5kIGluIHRoZSByZW5kZXJlZCBzdHJpbmcuXG4gICAqIElzc3VlICMxMjY6IFdhcm4gd2hlbiB0ZW1wbGF0ZSBwYXJhbWV0ZXJzIGFyZSBtaXNzaW5nLlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBkZXRlY3RVbm1hdGNoZWRQbGFjZWhvbGRlcnMocmVuZGVyZWQ6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBwbGFjZWhvbGRlclBhdHRlcm4gPSAvXFx7KFthLXpBLVpfXVthLXpBLVowLTlfXSopXFx9L2c7XG4gICAgY29uc3QgdW5tYXRjaGVkOiBzdHJpbmdbXSA9IFtdO1xuICAgIGxldCBtYXRjaDogUmVnRXhwRXhlY0FycmF5IHwgbnVsbDtcbiAgICB3aGlsZSAoKG1hdGNoID0gcGxhY2Vob2xkZXJQYXR0ZXJuLmV4ZWMocmVuZGVyZWQpKSAhPT0gbnVsbCkge1xuICAgICAgdW5tYXRjaGVkLnB1c2gobWF0Y2hbMV0pO1xuICAgIH1cbiAgICByZXR1cm4gdW5tYXRjaGVkO1xuICB9XG5cbiAgLyoqXG4gICAqIEZvcm1hdHMgYSBjb25zaXN0ZW50IGVycm9yIG1lc3NhZ2UgZm9yIGNpcmN1bGFyIGFjdGl2YXRpb24gZGV0ZWN0aW9uLlxuICAgKiBVc2VkIGJ5IGJvdGggdGhlIHN0YXRpYyBwcmUtZmxpZ2h0IGNoZWNrIGFuZCB0aGUgcnVudGltZSBjaGFpbiBjaGVjay5cbiAgICovXG4gIHByaXZhdGUgc3RhdGljIGZvcm1hdENpcmN1bGFyQWN0aXZhdGlvbkVycm9yKGN5Y2xlUGF0aDogc3RyaW5nW10pOiBzdHJpbmcge1xuICAgIGNvbnN0IGFnZW50TmFtZSA9IGN5Y2xlUGF0aFtjeWNsZVBhdGgubGVuZ3RoIC0gMV07XG4gICAgcmV0dXJuIChcbiAgICAgIGBDaXJjdWxhciBhZ2VudCBhY3RpdmF0aW9uIGRldGVjdGVkIChjeWNsZSBvZiAke2N5Y2xlUGF0aC5sZW5ndGggLSAxfSk6IGAgK1xuICAgICAgYCR7Y3ljbGVQYXRoLmpvaW4oJyDihpIgJyl9LiBgICtcbiAgICAgIGBBZ2VudCAnJHthZ2VudE5hbWV9JyBjYW5ub3QgYWN0aXZhdGUgaXRzZWxmIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkuYFxuICAgICk7XG4gIH1cblxuICAvKiogU2FmZXR5IGxpbWl0cyBmb3IgYWN0aXZhdGlvbiBncmFwaCB0cmF2ZXJzYWwgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgTUFYX0FDVElWQVRJT05fREVQVEggPSAxMDtcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgTUFYX05PREVTX1ZJU0lURUQgPSAxMDA7XG5cbiAgLyoqXG4gICAqIFN0YXRpYyBhY3RpdmF0aW9uIGN5Y2xlIGRldGVjdGlvbiDigJQgTGF5ZXIgMSBvZiBkdWFsLWRldGVjdGlvbiBzdHJhdGVneSAoSXNzdWUgIzM3NClcbiAgICpcbiAgICogUGVyZm9ybXMgYXN5bmMgREZTIG9uIHRoZSBhY3RpdmF0aW9uIGdyYXBoIHRvIGRldGVjdCBjeWNsZXMgQkVGT1JFIGV4ZWN1dGlvbiBiZWdpbnMuXG4gICAqIFRoaXMgaXMgYSBwcmUtZmxpZ2h0IGNoZWNrIHRoYXQgcHJldmVudHMgY2lyY3VsYXIgYWN0aXZhdGlvbiBjaGFpbnMgZnJvbSBiZWluZyBhdHRlbXB0ZWQuXG4gICAqXG4gICAqIExheWVyIDEgKHRoaXMgbWV0aG9kKTogU3RhdGljIGdyYXBoIGFuYWx5c2lzIOKAlCB3YWxrcyB0aGUgYWN0aXZhdGlvbiBncmFwaCBmcm9tIHRoZSByb290XG4gICAqIGFnZW50LCBsb2FkaW5nIGVhY2ggYWdlbnQncyBgYWN0aXZhdGVzLmFnZW50c2AgbWV0YWRhdGEuIENhdGNoZXMgYWxsIGN5Y2xlcyByZWFjaGFibGVcbiAgICogZnJvbSB0aGUgcm9vdCB3aXRob3V0IGV4ZWN1dGluZyBhbnkgYWdlbnRzLiBCb3VuZGVkIGJ5IE1BWF9BQ1RJVkFUSU9OX0RFUFRIIGFuZFxuICAgKiBNQVhfTk9ERVNfVklTSVRFRCB0byBwcmV2ZW50IHJlc291cmNlIGV4aGF1c3Rpb24gZnJvbSBsYXJnZSBhY3ljbGljIGdyYXBocy5cbiAgICpcbiAgICogTGF5ZXIgMiAoZ2V0RWxlbWVudENvbnRlbnQgcnVudGltZSBjaGVjayk6IERlZmVuc2UtaW4tZGVwdGgg4oCUIGd1YXJkcyBhZ2FpbnN0IGVkZ2UgY2FzZXNcbiAgICogbGlrZSBkeW5hbWljYWxseS1jb25zdHJ1Y3RlZCBhY3RpdmF0aW9uIGNoYWlucyBvciBhZ2VudHMgbW9kaWZpZWQgYmV0d2VlbiB0aGUgc3RhdGljXG4gICAqIGNoZWNrIGFuZCBhY3R1YWwgZXhlY3V0aW9uLiBTZWUgZ2V0RWxlbWVudENvbnRlbnQgZm9yIGRldGFpbHMuXG4gICAqXG4gICAqIEBwYXJhbSByb290TmFtZSAtIFRoZSByb290IGFnZW50IG5hbWUgaW5pdGlhdGluZyB0aGUgYWN0aXZhdGlvbiBjaGFpblxuICAgKiBAcGFyYW0gYWN0aXZhdGVkQWdlbnRzIC0gVGhlIGltbWVkaWF0ZSBhZ2VudHMgYWN0aXZhdGVkIGJ5IHRoZSByb290XG4gICAqIEByZXR1cm5zIFRoZSBjeWNsZSBwYXRoIGFycmF5IGlmIGEgY3ljbGUgZXhpc3RzLCBudWxsIG90aGVyd2lzZVxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBkZXRlY3RBY3RpdmF0aW9uQ3ljbGVzKFxuICAgIHJvb3ROYW1lOiBzdHJpbmcsXG4gICAgYWN0aXZhdGVkQWdlbnRzOiBzdHJpbmdbXVxuICApOiBQcm9taXNlPHN0cmluZ1tdIHwgbnVsbD4ge1xuICAgIC8vIENhY2hlIGxvYWRlZCBhZ2VudHMgdG8gYXZvaWQgcmVkdW5kYW50IEkvTyBkdXJpbmcgREZTXG4gICAgY29uc3QgYWdlbnRDYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmdbXSB8IG51bGw+KCk7XG5cbiAgICAvLyBIZWxwZXI6IGxvYWQgYW4gYWdlbnQncyBhY3RpdmF0ZXMuYWdlbnRzIGxpc3QgKGNhY2hlZClcbiAgICBjb25zdCBnZXRBY3RpdmF0ZWRBZ2VudHMgPSBhc3luYyAobmFtZTogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmdbXT4gPT4ge1xuICAgICAgY29uc3QgY2FjaGVLZXkgPSBuYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICBpZiAoYWdlbnRDYWNoZS5oYXMoY2FjaGVLZXkpKSB7XG4gICAgICAgIHJldHVybiBhZ2VudENhY2hlLmdldChjYWNoZUtleSkgfHwgW107XG4gICAgICB9XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBhZ2VudCA9IGF3YWl0IHRoaXMucmVhZChuYW1lKTtcbiAgICAgICAgaWYgKCFhZ2VudCkge1xuICAgICAgICAgIGxvZ2dlci53YXJuKGBBZ2VudCAnJHtuYW1lfScgcmVmZXJlbmNlZCBpbiBhY3RpdmF0ZXMuYWdlbnRzIGNvdWxkIG5vdCBiZSByZXNvbHZlZCBkdXJpbmcgY3ljbGUgZGV0ZWN0aW9uYCk7XG4gICAgICAgICAgYWdlbnRDYWNoZS5zZXQoY2FjaGVLZXksIG51bGwpO1xuICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBtZXRhID0gYWdlbnQubWV0YWRhdGEgYXMgQWdlbnRNZXRhZGF0YVYyO1xuICAgICAgICBjb25zdCBhZ2VudHMgPSBtZXRhLmFjdGl2YXRlcz8uYWdlbnRzIHx8IFtdO1xuICAgICAgICBhZ2VudENhY2hlLnNldChjYWNoZUtleSwgYWdlbnRzKTtcbiAgICAgICAgcmV0dXJuIGFnZW50cztcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICBsb2dnZXIud2FybihgQWdlbnQgJyR7bmFtZX0nIHJlZmVyZW5jZWQgaW4gYWN0aXZhdGVzLmFnZW50cyBjb3VsZCBub3QgYmUgcmVzb2x2ZWQgZHVyaW5nIGN5Y2xlIGRldGVjdGlvbmApO1xuICAgICAgICBhZ2VudENhY2hlLnNldChjYWNoZUtleSwgbnVsbCk7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8gVHJhY2tzIG5vZGVzIHdob3NlIGVudGlyZSBzdWJ0cmVlIGhhcyBiZWVuIGV4cGxvcmVkIHdpdGhvdXQgZmluZGluZyBhIGN5Y2xlLlxuICAgIC8vIFByZXZlbnRzIGV4cG9uZW50aWFsIHJlLWV4cGxvcmF0aW9uIGluIGRpYW1vbmQvY29udmVyZ2VudCBncmFwaHMuXG4gICAgY29uc3QgZnVsbHlFeHBsb3JlZCA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgIGxldCBub2Rlc1Zpc2l0ZWQgPSAwO1xuXG4gICAgLy8gREZTIOKAlCBzdGFjayBlbnRyaWVzOiBbY3VycmVudEFnZW50LCBwYXRoU29GYXIsIHBhdGhTZXRMb3dlcl1cbiAgICAvLyBwYXRoU2V0TG93ZXIgaXMgYSBTZXQ8c3RyaW5nPiBvZiBsb3dlcmNhc2VkIG5hbWVzIGZvciBPKDEpIGN5Y2xlIGNoZWNrc1xuICAgIGNvbnN0IHN0YWNrOiBBcnJheTxbc3RyaW5nLCBzdHJpbmdbXSwgU2V0PHN0cmluZz5dPiA9IFtdO1xuXG4gICAgY29uc3Qgcm9vdExvd2VyID0gcm9vdE5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIGFjdGl2YXRlZEFnZW50cykge1xuICAgICAgLy8gU2VsZi1sb29wOiBhZ2VudCBkaXJlY3RseSBhY3RpdmF0ZXMgaXRzZWxmXG4gICAgICBpZiAoY2hpbGQudG9Mb3dlckNhc2UoKSA9PT0gcm9vdExvd2VyKSB7XG4gICAgICAgIHJldHVybiBbcm9vdE5hbWUsIGNoaWxkXTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHBhdGhTZXQgPSBuZXcgU2V0PHN0cmluZz4oW3Jvb3RMb3dlciwgY2hpbGQudG9Mb3dlckNhc2UoKV0pO1xuICAgICAgc3RhY2sucHVzaChbY2hpbGQsIFtyb290TmFtZSwgY2hpbGRdLCBwYXRoU2V0XSk7XG4gICAgfVxuXG4gICAgd2hpbGUgKHN0YWNrLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IFtjdXJyZW50LCBjdXJyZW50UGF0aCwgcGF0aFNldF0gPSBzdGFjay5wb3AoKSE7XG5cbiAgICAgIG5vZGVzVmlzaXRlZCsrO1xuICAgICAgaWYgKG5vZGVzVmlzaXRlZCA+IEFnZW50TWFuYWdlci5NQVhfTk9ERVNfVklTSVRFRCkge1xuICAgICAgICBsb2dnZXIud2FybihcbiAgICAgICAgICBgQWN0aXZhdGlvbiBjeWNsZSBkZXRlY3Rpb24gZm9yICcke3Jvb3ROYW1lfScgYWJvcnRlZDogZXhjZWVkZWQgJHtBZ2VudE1hbmFnZXIuTUFYX05PREVTX1ZJU0lURUR9IG5vZGVzIHZpc2l0ZWQuIGAgK1xuICAgICAgICAgIGBUaGUgYWN0aXZhdGlvbiBncmFwaCBtYXkgYmUgdG9vIGxhcmdlLmBcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIGlmIChjdXJyZW50UGF0aC5sZW5ndGggPiBBZ2VudE1hbmFnZXIuTUFYX0FDVElWQVRJT05fREVQVEggKyAxKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKFxuICAgICAgICAgIGBBY3RpdmF0aW9uIGN5Y2xlIGRldGVjdGlvbiBmb3IgJyR7cm9vdE5hbWV9JyBoaXQgZGVwdGggbGltaXQgb2YgJHtBZ2VudE1hbmFnZXIuTUFYX0FDVElWQVRJT05fREVQVEh9LiBgICtcbiAgICAgICAgICBgU2tpcHBpbmcgZGVlcGVyIGJyYW5jaGVzLmBcbiAgICAgICAgKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGN1cnJlbnRMb3dlciA9IGN1cnJlbnQudG9Mb3dlckNhc2UoKTtcbiAgICAgIGlmIChmdWxseUV4cGxvcmVkLmhhcyhjdXJyZW50TG93ZXIpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBMb2FkIHRoaXMgYWdlbnQncyBhY3RpdmF0aW9uc1xuICAgICAgY29uc3QgY2hpbGRyZW4gPSBhd2FpdCBnZXRBY3RpdmF0ZWRBZ2VudHMoY3VycmVudCk7XG5cbiAgICAgIGxldCBmb3VuZEN5Y2xlID0gZmFsc2U7XG4gICAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIGNoaWxkcmVuKSB7XG4gICAgICAgIGNvbnN0IGNoaWxkTG93ZXIgPSBjaGlsZC50b0xvd2VyQ2FzZSgpO1xuXG4gICAgICAgIC8vIENoZWNrIGZvciBjeWNsZTogZG9lcyB0aGlzIGNoaWxkIGFwcGVhciBlYXJsaWVyIGluIHRoZSBwYXRoP1xuICAgICAgICBpZiAocGF0aFNldC5oYXMoY2hpbGRMb3dlcikpIHtcbiAgICAgICAgICByZXR1cm4gWy4uLmN1cnJlbnRQYXRoLCBjaGlsZF07XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWZ1bGx5RXhwbG9yZWQuaGFzKGNoaWxkTG93ZXIpKSB7XG4gICAgICAgICAgY29uc3QgbmV3UGF0aFNldCA9IG5ldyBTZXQocGF0aFNldCk7XG4gICAgICAgICAgbmV3UGF0aFNldC5hZGQoY2hpbGRMb3dlcik7XG4gICAgICAgICAgc3RhY2sucHVzaChbY2hpbGQsIFsuLi5jdXJyZW50UGF0aCwgY2hpbGRdLCBuZXdQYXRoU2V0XSk7XG4gICAgICAgICAgZm91bmRDeWNsZSA9IHRydWU7IC8vIGhhcyBjaGlsZHJlbiB0byBleHBsb3JlLCBub3QgZnVsbHkgZXhwbG9yZWQgeWV0XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gSWYgbm8gdW5leHBsb3JlZCBjaGlsZHJlbiwgdGhpcyBub2RlJ3Mgc3VidHJlZSBpcyBjeWNsZS1mcmVlXG4gICAgICBpZiAoIWZvdW5kQ3ljbGUpIHtcbiAgICAgICAgZnVsbHlFeHBsb3JlZC5hZGQoY3VycmVudExvd2VyKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgY29udGVudCBmcm9tIGFuIGVsZW1lbnQgKGVsZW1lbnQtYWdub3N0aWMpXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGdldEVsZW1lbnRDb250ZW50KFxuICAgIGVsZW1lbnRUeXBlOiBzdHJpbmcsXG4gICAgZWxlbWVudE5hbWU6IHN0cmluZyxcbiAgICBleGVjdXRpb25Db250ZXh0PzogRXhlY3V0aW9uQ29udGV4dFxuICApOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIC8vIEdldCB0aGUgc3RhdGljIHJlc29sdmVyXG4gICAgY29uc3QgcmVzb2x2ZXIgPSBBZ2VudE1hbmFnZXIuZ2V0RWxlbWVudE1hbmFnZXJSZXNvbHZlcigpO1xuICAgIGlmICghcmVzb2x2ZXIpIHtcbiAgICAgIGxvZ2dlci53YXJuKGBFbGVtZW50IG1hbmFnZXIgcmVzb2x2ZXIgbm90IGNvbmZpZ3VyZWQgLSBjYW5ub3QgYWN0aXZhdGUgJHtlbGVtZW50VHlwZX0vJHtlbGVtZW50TmFtZX1gKTtcbiAgICAgIHJldHVybiBgW0VsZW1lbnQgbWFuYWdlciByZXNvbHZlciBub3QgY29uZmlndXJlZCBmb3IgJHtlbGVtZW50VHlwZX0vJHtlbGVtZW50TmFtZX1dYDtcbiAgICB9XG5cbiAgICAvLyBMYXllciAyIChkZWZlbnNlLWluLWRlcHRoKTogUnVudGltZSBjaXJjdWxhciBhY3RpdmF0aW9uIGRldGVjdGlvbiAoSXNzdWUgIzEwOSlcbiAgICAvLyBUaGUgc3RhdGljIHByZS1mbGlnaHQgY2hlY2sgKGRldGVjdEFjdGl2YXRpb25DeWNsZXMsIGxheWVyIDEpIGNhdGNoZXMgbW9zdCBjeWNsZXNcbiAgICAvLyBiZWZvcmUgZXhlY3V0aW9uIGJlZ2lucy4gVGhpcyBydW50aW1lIGNoZWNrIGd1YXJkcyBhZ2FpbnN0IGVkZ2UgY2FzZXMgc3VjaCBhc1xuICAgIC8vIGR5bmFtaWNhbGx5LWNvbnN0cnVjdGVkIGFjdGl2YXRpb24gY2hhaW5zIG9yIGFnZW50cyBtb2RpZmllZCBiZXR3ZWVuIHRoZSBzdGF0aWNcbiAgICAvLyBjaGVjayBhbmQgYWN0dWFsIGV4ZWN1dGlvbi4gVXNlcyBleGVjdXRpb25Db250ZXh0LmFnZW50Q2hhaW4gd2hpY2ggdHJhY2tzIHRoZVxuICAgIC8vIGN1cnJlbnQgZXhlY3V0aW9uIHBhdGgg4oCUIGVmZmVjdGl2ZSBmb3IgZGlyZWN0IGFuZCBtdWx0aS1ob3AgY2hhaW5zIHdpdGhpbiBhXG4gICAgLy8gc2luZ2xlIGV4ZWN1dGlvbiBjb250ZXh0LlxuICAgIGlmIChlbGVtZW50VHlwZSA9PT0gJ2FnZW50cycgJiYgZXhlY3V0aW9uQ29udGV4dD8uYWdlbnRDaGFpbikge1xuICAgICAgY29uc3QgY2hhaW5TZXQgPSBuZXcgU2V0KGV4ZWN1dGlvbkNvbnRleHQuYWdlbnRDaGFpbi5tYXAobmFtZSA9PiBuYW1lLnRvTG93ZXJDYXNlKCkpKTtcbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWROYW1lID0gZWxlbWVudE5hbWUudG9Mb3dlckNhc2UoKTtcblxuICAgICAgaWYgKGNoYWluU2V0Lmhhcyhub3JtYWxpemVkTmFtZSkpIHtcbiAgICAgICAgY29uc3QgY3ljbGVQYXRoID0gWy4uLmV4ZWN1dGlvbkNvbnRleHQuYWdlbnRDaGFpbiwgZWxlbWVudE5hbWVdO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoQWdlbnRNYW5hZ2VyLmZvcm1hdENpcmN1bGFyQWN0aXZhdGlvbkVycm9yKGN5Y2xlUGF0aCkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICAvLyBNYXAgcGx1cmFsIGVsZW1lbnQgdHlwZXMgdG8gbWFuYWdlciBuYW1lc1xuICAgICAgY29uc3QgbWFuYWdlck5hbWVNYXA6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgICAgIHBlcnNvbmFzOiAnUGVyc29uYU1hbmFnZXInLFxuICAgICAgICBza2lsbHM6ICdTa2lsbE1hbmFnZXInLFxuICAgICAgICBtZW1vcmllczogJ01lbW9yeU1hbmFnZXInLFxuICAgICAgICB0ZW1wbGF0ZXM6ICdUZW1wbGF0ZU1hbmFnZXInLFxuICAgICAgICBlbnNlbWJsZXM6ICdFbnNlbWJsZU1hbmFnZXInLFxuICAgICAgICBhZ2VudHM6ICdBZ2VudE1hbmFnZXInXG4gICAgICB9O1xuXG4gICAgICBjb25zdCBtYW5hZ2VyTmFtZSA9IG1hbmFnZXJOYW1lTWFwW2VsZW1lbnRUeXBlXTtcbiAgICAgIGlmICghbWFuYWdlck5hbWUpIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oYFVua25vd24gZWxlbWVudCB0eXBlOiAke2VsZW1lbnRUeXBlfWApO1xuICAgICAgICByZXR1cm4gYFtVbmtub3duIGVsZW1lbnQgdHlwZTogJHtlbGVtZW50VHlwZX1dYDtcbiAgICAgIH1cblxuICAgICAgY29uc3QgbWFuYWdlciA9IHJlc29sdmVyKG1hbmFnZXJOYW1lKTtcbiAgICAgIGlmICghbWFuYWdlcikge1xuICAgICAgICBsb2dnZXIud2FybihgTWFuYWdlciBub3QgZm91bmQgZm9yIGVsZW1lbnQgdHlwZTogJHtlbGVtZW50VHlwZX1gKTtcbiAgICAgICAgcmV0dXJuIGBbTWFuYWdlciBub3QgZm91bmQ6ICR7bWFuYWdlck5hbWV9XWA7XG4gICAgICB9XG5cbiAgICAgIC8vIEdldCBhbGwgZWxlbWVudHMgb2YgdGhpcyB0eXBlXG4gICAgICBjb25zdCBlbGVtZW50cyA9IGF3YWl0IG1hbmFnZXIubGlzdCgpO1xuICAgICAgY29uc3QgZWxlbWVudCA9IGVsZW1lbnRzLmZpbmQoKGU6IGFueSkgPT4gZS5tZXRhZGF0YS5uYW1lID09PSBlbGVtZW50TmFtZSk7XG5cbiAgICAgIGlmICghZWxlbWVudCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7ZWxlbWVudFR5cGV9ICcke2VsZW1lbnROYW1lfScgbm90IGZvdW5kYCk7XG4gICAgICB9XG5cbiAgICAgIC8vIFJldHVybiBhcHByb3ByaWF0ZSBjb250ZW50IGJhc2VkIG9uIGVsZW1lbnQgdHlwZVxuICAgICAgc3dpdGNoIChlbGVtZW50VHlwZSkge1xuICAgICAgICBjYXNlICdwZXJzb25hcyc6XG4gICAgICAgICAgcmV0dXJuIGVsZW1lbnQuY29udGVudCB8fCAnJztcblxuICAgICAgICBjYXNlICdza2lsbHMnOlxuICAgICAgICAgIHJldHVybiBlbGVtZW50Lmluc3RydWN0aW9ucyB8fCAnJztcblxuICAgICAgICBjYXNlICdtZW1vcmllcyc6IHtcbiAgICAgICAgICBjb25zdCBlbnRyaWVzID0gZWxlbWVudC5nZXRFbnRyaWVzKCk7XG4gICAgICAgICAgcmV0dXJuIGBNZW1vcnkgJyR7ZWxlbWVudE5hbWV9JyB3aXRoICR7ZW50cmllcy5sZW5ndGh9IGVudHJpZXNgO1xuICAgICAgICB9XG5cbiAgICAgICAgY2FzZSAndGVtcGxhdGVzJzpcbiAgICAgICAgICByZXR1cm4gZWxlbWVudC5jb250ZW50IHx8ICcnO1xuXG4gICAgICAgIGNhc2UgJ2Vuc2VtYmxlcyc6IHtcbiAgICAgICAgICBjb25zdCBlbGVtZW50TGlzdCA9IE9iamVjdC5lbnRyaWVzKGVsZW1lbnQuZWxlbWVudHMgfHwge30pXG4gICAgICAgICAgICAubWFwKChbdHlwZSwgbmFtZXNdKSA9PiBgJHt0eXBlfTogJHtBcnJheS5pc0FycmF5KG5hbWVzKSA/IG5hbWVzLmpvaW4oJywgJykgOiBTdHJpbmcobmFtZXMpfWApXG4gICAgICAgICAgICAuam9pbignOyAnKTtcbiAgICAgICAgICByZXR1cm4gYEVuc2VtYmxlICcke2VsZW1lbnROYW1lfScgYWN0aXZhdGVzOiAke2VsZW1lbnRMaXN0fWA7XG4gICAgICAgIH1cblxuICAgICAgICBjYXNlICdhZ2VudHMnOiB7XG4gICAgICAgICAgY29uc3QgaW5zdHJ1Y3Rpb25zID0gZWxlbWVudC5leHRlbnNpb25zPy5pbnN0cnVjdGlvbnMgfHwgJyc7XG4gICAgICAgICAgcmV0dXJuIGluc3RydWN0aW9ucztcbiAgICAgICAgfVxuXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgcmV0dXJuIGBbQ29udGVudCBub3QgYXZhaWxhYmxlIGZvciAke2VsZW1lbnRUeXBlfV1gO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoYEVycm9yIGdldHRpbmcgY29udGVudCBmb3IgJHtlbGVtZW50VHlwZX0gJyR7ZWxlbWVudE5hbWV9JzpgLCBlcnJvcik7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgYWN0aXZlIHNldCBjbGVhbnVwIGlzIG5lZWRlZCBhbmQgcGVyZm9ybSBjbGVhbnVwIGlmIG5lY2Vzc2FyeVxuICAgKiBJc3N1ZSAjMjQgKExPVyBQUklPUklUWSk6IE1lbW9yeSBsZWFrIHByZXZlbnRpb25cbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgY2hlY2tBbmRDbGVhbnVwQWN0aXZlU2V0KCk6IHZvaWQge1xuICAgIGNvbnN0IHsgbWF4LCBjbGVhbnVwVGhyZXNob2xkIH0gPSBnZXRBY3RpdmVFbGVtZW50TGltaXRDb25maWcoJ2FnZW50cycpO1xuXG4gICAgLy8gQmVsb3cgdGhyZXNob2xkIOKAlCBubyBhY3Rpb24gbmVlZGVkXG4gICAgaWYgKHRoaXMuYWN0aXZlQWdlbnROYW1lcy5zaXplIDwgY2xlYW51cFRocmVzaG9sZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIEF0IG9yIGFib3ZlIG1heCDigJQgd2FybiBiZWZvcmUgY2xlYW51cFxuICAgIGlmICh0aGlzLmFjdGl2ZUFnZW50TmFtZXMuc2l6ZSA+PSBtYXgpIHtcbiAgICAgIGxvZ2dlci53YXJuKFxuICAgICAgICBgQWN0aXZlIGFnZW50cyBsaW1pdCByZWFjaGVkICgke21heH0pLiBgICtcbiAgICAgICAgYENvbnNpZGVyIGRlYWN0aXZhdGluZyB1bnVzZWQgYWdlbnRzIG9yIHNldHRpbmcgRE9MTEhPVVNFX01BWF9BQ1RJVkVfQUdFTlRTIHRvIGEgaGlnaGVyIHZhbHVlLmBcbiAgICAgICk7XG5cbiAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgdHlwZTogJ0FHRU5UX0FDVElWQVRFRCcsXG4gICAgICAgIHNldmVyaXR5OiAnTUVESVVNJyxcbiAgICAgICAgc291cmNlOiAnQWdlbnRNYW5hZ2VyLmNoZWNrQW5kQ2xlYW51cEFjdGl2ZVNldCcsXG4gICAgICAgIGRldGFpbHM6IGBBY3RpdmUgYWdlbnRzIGxpbWl0IHJlYWNoZWQgKCR7dGhpcy5hY3RpdmVBZ2VudE5hbWVzLnNpemV9LyR7bWF4fSlgLFxuICAgICAgICBhZGRpdGlvbmFsRGF0YToge1xuICAgICAgICAgIGFjdGl2ZUNvdW50OiB0aGlzLmFjdGl2ZUFnZW50TmFtZXMuc2l6ZSxcbiAgICAgICAgICBtYXhBbGxvd2VkOiBtYXgsXG4gICAgICAgICAgYWN0aXZlQWdlbnROYW1lczogQXJyYXkuZnJvbSh0aGlzLmFjdGl2ZUFnZW50TmFtZXMpLFxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBBdCBvciBhYm92ZSB0aHJlc2hvbGQg4oCUIHByb2FjdGl2ZWx5IGNsZWFuIHN0YWxlIGVudHJpZXNcbiAgICB2b2lkIHRoaXMuY2xlYW51cFN0YWxlQWN0aXZlQWdlbnRzKCk7XG4gIH1cblxuICAvKipcbiAgICogQ2xlYW4gdXAgc3RhbGUgZW50cmllcyBmcm9tIGFjdGl2ZSBhZ2VudHMgc2V0XG4gICAqIElzc3VlICMyNCAoTE9XIFBSSU9SSVRZKTogTWVtb3J5IGxlYWsgcHJldmVudGlvblxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBjbGVhbnVwU3RhbGVBY3RpdmVBZ2VudHMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHN0YXJ0U2l6ZSA9IHRoaXMuYWN0aXZlQWdlbnROYW1lcy5zaXplO1xuICAgICAgY29uc3QgYWdlbnRzID0gYXdhaXQgdGhpcy5saXN0KCk7XG4gICAgICBjb25zdCBleGlzdGluZ0FnZW50TmFtZXMgPSBuZXcgU2V0KGFnZW50cy5tYXAoYSA9PiBhLm1ldGFkYXRhLm5hbWUpKTtcblxuICAgICAgY29uc3Qgc3RhbGVOYW1lczogc3RyaW5nW10gPSBbXTtcbiAgICAgIGZvciAoY29uc3QgYWN0aXZlTmFtZSBvZiB0aGlzLmFjdGl2ZUFnZW50TmFtZXMpIHtcbiAgICAgICAgaWYgKCFleGlzdGluZ0FnZW50TmFtZXMuaGFzKGFjdGl2ZU5hbWUpKSB7XG4gICAgICAgICAgdGhpcy5hY3RpdmVBZ2VudE5hbWVzLmRlbGV0ZShhY3RpdmVOYW1lKTtcbiAgICAgICAgICBzdGFsZU5hbWVzLnB1c2goYWN0aXZlTmFtZSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3QgZW5kU2l6ZSA9IHRoaXMuYWN0aXZlQWdlbnROYW1lcy5zaXplO1xuICAgICAgY29uc3QgcmVtb3ZlZCA9IHN0YXJ0U2l6ZSAtIGVuZFNpemU7XG5cbiAgICAgIGlmIChyZW1vdmVkID4gMCkge1xuICAgICAgICBsb2dnZXIuaW5mbyhcbiAgICAgICAgICBgQ2xlYW5lZCB1cCAke3JlbW92ZWR9IHN0YWxlIGFjdGl2ZSBhZ2VudCByZWZlcmVuY2UocykuIGAgK1xuICAgICAgICAgIGBBY3RpdmUgYWdlbnRzOiAke2VuZFNpemV9LyR7Z2V0TWF4QWN0aXZlTGltaXQoJ2FnZW50cycpfWBcbiAgICAgICAgKTtcblxuICAgICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgICAgdHlwZTogJ0VMRU1FTlRfREVMRVRFRCcsXG4gICAgICAgICAgc2V2ZXJpdHk6ICdMT1cnLFxuICAgICAgICAgIHNvdXJjZTogJ0FnZW50TWFuYWdlci5jbGVhbnVwU3RhbGVBY3RpdmVBZ2VudHMnLFxuICAgICAgICAgIGRldGFpbHM6IGBSZW1vdmVkICR7cmVtb3ZlZH0gc3RhbGUgYWN0aXZlIGFnZW50IHJlZmVyZW5jZXNgLFxuICAgICAgICAgIGFkZGl0aW9uYWxEYXRhOiB7XG4gICAgICAgICAgICByZW1vdmVkQ291bnQ6IHJlbW92ZWQsXG4gICAgICAgICAgICBhY3RpdmVDb3VudDogZW5kU2l6ZSxcbiAgICAgICAgICAgIHN0YWxlTmFtZXM6IHN0YWxlTmFtZXMuam9pbignLCAnKVxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci5lcnJvcignRmFpbGVkIHRvIGNsZWFudXAgc3RhbGUgYWN0aXZlIGFnZW50czonLCBlcnJvcik7XG5cbiAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgdHlwZTogJ0VMRU1FTlRfREVMRVRFRCcsXG4gICAgICAgIHNldmVyaXR5OiAnTE9XJyxcbiAgICAgICAgc291cmNlOiAnQWdlbnRNYW5hZ2VyLmNsZWFudXBTdGFsZUFjdGl2ZUFnZW50cycsXG4gICAgICAgIGRldGFpbHM6IGBDbGVhbnVwIGZhaWxlZDogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcil9YFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFBlcnNpc3QgYW4gYWdlbnQgc3RhdGUgZmlsZSAoWUFNTCkuXG4gICAqXG4gICAqIElNUFJPVkVNRU5UOiBPcHRpbWlzdGljIGxvY2tpbmcgd2l0aCB2ZXJzaW9uIGNoZWNraW5nIChJc3N1ZSAjMjQpXG4gICAqIFByZXZlbnRzIHN0YXRlIGNvcnJ1cHRpb24gZnJvbSBjb25jdXJyZW50IHVwZGF0ZXMgYnkgY29tcGFyaW5nIHZlcnNpb25zXG4gICAqXG4gICAqIEZJWDogVXNlcyBub3JtYWxpemVGaWxlbmFtZSgpIGZvciBjb25zaXN0ZW50IHN0YXRlIGZpbGUgbmFtaW5nXG4gICAqIFRoaXMgZW5zdXJlcyBzdGF0ZSBmaWxlcyB1c2Uga2ViYWItY2FzZSAoZS5nLiwgXCJjcnVkdi1hZ2VudC1kZWx0YS5zdGF0ZS55YW1sXCIpXG4gICAqIHJlZ2FyZGxlc3Mgb2YgaW5wdXQgbmFtZSBmb3JtYXQgKGUuZy4sIFwiQ1JVRFYtQWdlbnQtRGVsdGFcIilcbiAgICpcbiAgICogRklYIChJc3N1ZSAjMTA3IC0gQ1JJVC0yKTogV3JhcCByZWFkLWNvbXBhcmUtd3JpdGUgc2VxdWVuY2UgaW4gZmlsZSBsb2NrXG4gICAqIHRvIHByZXZlbnQgVE9DVE9VIHJhY2UgY29uZGl0aW9uIGZyb20gY29uY3VycmVudCBhZ2VudCBleGVjdXRpb25zXG4gICAqXG4gICAqIEZJWCAoSXNzdWUgIzEyMyk6IFZlcnNpb24gaW5jcmVtZW50cyBvbiBzdWNjZXNzZnVsIHNhdmUsIG5vdCBkdXJpbmcgb3BlcmF0aW9uc1xuICAgKlxuICAgKiBAcmV0dXJucyBUaGUgbmV3IHN0YXRlIHZlcnNpb24gYWZ0ZXIgc3VjY2Vzc2Z1bCBzYXZlXG4gICAqIEBwcm90ZWN0ZWQgT25seSBhY2Nlc3NpYmxlIGJ5IHN1YmNsYXNzZXMgKGUuZy4sIFRlc3RhYmxlQWdlbnRNYW5hZ2VyIGZvciB0ZXN0aW5nKVxuICAgKi9cbiAgcHJvdGVjdGVkIGFzeW5jIHNhdmVBZ2VudFN0YXRlKG5hbWU6IHN0cmluZywgc3RhdGU6IEFnZW50U3RhdGUpOiBQcm9taXNlPG51bWJlcj4ge1xuICAgIGF3YWl0IHRoaXMuZW5zdXJlU3RhdGVEaXJlY3RvcnkoKTtcblxuICAgIC8vIEZJWDogTm9ybWFsaXplIG5hbWUgZm9yIGNvbnNpc3RlbnQgc3RhdGUgZmlsZSBuYW1pbmdcbiAgICBjb25zdCBub3JtYWxpemVkTmFtZSA9IHRoaXMubm9ybWFsaXplRmlsZW5hbWUobmFtZSk7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLmpvaW4odGhpcy5zdGF0ZURpciwgYCR7bm9ybWFsaXplZE5hbWV9JHtTVEFURV9GSUxFX0VYVEVOU0lPTn1gKTtcblxuICAgIC8vIEZJWCAoSXNzdWUgIzEwNyAtIENSSVQtMik6IEFjcXVpcmUgZmlsZSBsb2NrIHRvIHByZXZlbnQgVE9DVE9VIHJhY2UgY29uZGl0aW9uXG4gICAgLy8gVGhlIGxvY2sgY292ZXJzIHRoZSBlbnRpcmUgcmVhZC1jb21wYXJlLXdyaXRlIHNlcXVlbmNlIHRvIGVuc3VyZSBhdG9taWNpdHlcbiAgICBhd2FpdCB0aGlzLmZpbGVMb2NrTWFuYWdlci53aXRoTG9jayhgYWdlbnQtc3RhdGU6JHtub3JtYWxpemVkTmFtZX1gLCBhc3luYyAoKSA9PiB7XG4gICAgICAvLyBGSVg6IE9wdGltaXN0aWMgbG9ja2luZyBjaGVjayAoSXNzdWUgIzI0KVxuICAgICAgLy8gTG9hZCBleGlzdGluZyBzdGF0ZSB0byBjb21wYXJlIHZlcnNpb25zIGJlZm9yZSBvdmVyd3JpdGluZ1xuICAgICAgY29uc3QgZXhpc3RpbmdTdGF0ZSA9IGF3YWl0IHRoaXMubG9hZEFnZW50U3RhdGUobmFtZSk7XG4gICAgICBpZiAoZXhpc3RpbmdTdGF0ZSAmJiBleGlzdGluZ1N0YXRlLnN0YXRlVmVyc2lvbiAhPT0gdW5kZWZpbmVkICYmIHN0YXRlLnN0YXRlVmVyc2lvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIC8vIENoZWNrIGlmIG91ciBzdGF0ZSBpcyBiYXNlZCBvbiB0aGUgY3VycmVudCB2ZXJzaW9uXG4gICAgICAgIC8vIElmIHZlcnNpb25zIGRvbid0IG1hdGNoLCBpdCBtZWFucyBhbm90aGVyIHByb2Nlc3MgdXBkYXRlZCB0aGUgc3RhdGVcbiAgICAgICAgaWYgKGV4aXN0aW5nU3RhdGUuc3RhdGVWZXJzaW9uID4gc3RhdGUuc3RhdGVWZXJzaW9uKSB7XG4gICAgICAgICAgbG9nZ2VyLndhcm4oYFN0YXRlIHZlcnNpb24gY29uZmxpY3QgZGV0ZWN0ZWQgZm9yIGFnZW50ICR7bmFtZX1gLCB7XG4gICAgICAgICAgICBleGlzdGluZ1ZlcnNpb246IGV4aXN0aW5nU3RhdGUuc3RhdGVWZXJzaW9uLFxuICAgICAgICAgICAgYXR0ZW1wdGVkVmVyc2lvbjogc3RhdGUuc3RhdGVWZXJzaW9uXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgICAgICB0eXBlOiAnTUVNT1JZX1NBVkVfRkFJTEVEJyxcbiAgICAgICAgICAgIHNldmVyaXR5OiAnTUVESVVNJyxcbiAgICAgICAgICAgIHNvdXJjZTogJ0FnZW50TWFuYWdlci5zYXZlQWdlbnRTdGF0ZScsXG4gICAgICAgICAgICBkZXRhaWxzOiBgU3RhdGUgdmVyc2lvbiBjb25mbGljdDogYXR0ZW1wdGVkIHRvIHNhdmUgc3RhbGUgc3RhdGVgLFxuICAgICAgICAgICAgYWRkaXRpb25hbERhdGE6IHtcbiAgICAgICAgICAgICAgYWdlbnROYW1lOiBuYW1lLFxuICAgICAgICAgICAgICBleGlzdGluZ1ZlcnNpb246IGV4aXN0aW5nU3RhdGUuc3RhdGVWZXJzaW9uLFxuICAgICAgICAgICAgICBhdHRlbXB0ZWRWZXJzaW9uOiBzdGF0ZS5zdGF0ZVZlcnNpb25cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBTdGF0ZSB2ZXJzaW9uIGNvbmZsaWN0OiBjdXJyZW50IHZlcnNpb24gaXMgJHtleGlzdGluZ1N0YXRlLnN0YXRlVmVyc2lvbn0sIGAgK1xuICAgICAgICAgICAgYGJ1dCBhdHRlbXB0ZWQgdG8gc2F2ZSB2ZXJzaW9uICR7c3RhdGUuc3RhdGVWZXJzaW9ufS4gYCArXG4gICAgICAgICAgICBgU3RhdGUgbWF5IGhhdmUgYmVlbiBtb2RpZmllZCBjb25jdXJyZW50bHkuYFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gRklYIChJc3N1ZSAjMTIzKTogSW5jcmVtZW50IHZlcnNpb24gQkVGT1JFIHNlcmlhbGl6YXRpb24sIG5vdCBkdXJpbmcgb3BlcmF0aW9uc1xuICAgICAgLy8gVGhpcyBlbnN1cmVzIHZlcnNpb24gb25seSBpbmNyZW1lbnRzIG9uIHN1Y2Nlc3NmdWwgc2F2ZVxuICAgICAgc3RhdGUuc3RhdGVWZXJzaW9uID0gKHN0YXRlLnN0YXRlVmVyc2lvbiB8fCAwKSArIDE7XG5cbiAgICAgIGNvbnN0IHNlcmlhbGl6ZWRTdGF0ZSA9IHRoaXMucHJlcGFyZVN0YXRlRm9yU2VyaWFsaXphdGlvbihzdGF0ZSk7XG5cbiAgICAgIGNvbnN0IHlhbWxDb250ZW50ID0gdGhpcy5zZXJpYWxpemF0aW9uU2VydmljZS5kdW1wWWFtbChzZXJpYWxpemVkU3RhdGUsIHtcbiAgICAgICAgc2NoZW1hOiAnanNvbicsICAvLyBGaXggIzkxNDogZmFpbHNhZmUgY29ycnVwdHMgYm9vbGVhbnMvbnVtYmVycyBpbiBhZ2VudCBzdGF0ZVxuICAgICAgICBub1JlZnM6IHRydWUsXG4gICAgICAgIHNvcnRLZXlzOiB0cnVlXG4gICAgICB9KTtcblxuICAgICAgLy8gVmFsaWRhdGUgc2l6ZVxuICAgICAgdGhpcy5zZXJpYWxpemF0aW9uU2VydmljZS52YWxpZGF0ZVNpemUoeWFtbENvbnRlbnQsIE1BWF9ZQU1MX1NJWkUsICdBZ2VudCBzdGF0ZScpO1xuXG4gICAgICBhd2FpdCB0aGlzLmZpbGVPcGVyYXRpb25zLndyaXRlRmlsZShmaWxlUGF0aCwgeWFtbENvbnRlbnQsIHsgZW5jb2Rpbmc6ICd1dGYtOCcgfSk7XG4gICAgICAvLyBGSVg6IFVzZSBub3JtYWxpemVkIG5hbWUgYXMgY2FjaGUga2V5IGZvciBjb25zaXN0ZW50IGxvb2t1cHNcbiAgICAgIHRoaXMuc3RhdGVDYWNoZS5zZXQobm9ybWFsaXplZE5hbWUsIHN0YXRlKTtcblxuICAgICAgbG9nZ2VyLmRlYnVnKGBBZ2VudCBzdGF0ZSBzYXZlZCBzdWNjZXNzZnVsbHlgLCB7XG4gICAgICAgIGFnZW50TmFtZTogbmFtZSxcbiAgICAgICAgbm9ybWFsaXplZE5hbWUsXG4gICAgICAgIHN0YXRlVmVyc2lvbjogc3RhdGUuc3RhdGVWZXJzaW9uLFxuICAgICAgICBnb2FsQ291bnQ6IHN0YXRlLmdvYWxzPy5sZW5ndGggPz8gMFxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICAvLyBSZXR1cm4gdGhlIG5ldyB2ZXJzaW9uIGZvciBjYWxsZXIgdG8gc3luYyBhZ2VudCdzIGludGVybmFsIHN0YXRlXG4gICAgLy8gc3RhdGVWZXJzaW9uIGlzIGd1YXJhbnRlZWQgdG8gYmUgYSBudW1iZXIgYWZ0ZXIgdGhlIGluY3JlbWVudCBhYm92ZVxuICAgIHJldHVybiBzdGF0ZS5zdGF0ZVZlcnNpb24hO1xuICB9XG5cbiAgLyoqXG4gICAqIFV0aWxpdHk6IGVuc3VyZSBgLm1kYCBleHRlbnNpb24gb24gcmVxdWVzdGVkIHBhdGguXG4gICAqL1xuICBwcml2YXRlIHN0cmlwRXh0ZW5zaW9uKGZpbGVQYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBmaWxlUGF0aC5lbmRzV2l0aChBR0VOVF9GSUxFX0VYVEVOU0lPTilcbiAgICAgID8gZmlsZVBhdGguc2xpY2UoMCwgLUFHRU5UX0ZJTEVfRVhURU5TSU9OLmxlbmd0aClcbiAgICAgIDogZmlsZVBhdGg7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGh5ZHJhdGVBZ2VudFN0YXRlKGFnZW50OiBBZ2VudCwgbmFtZTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qgc3RhdGUgPSBhd2FpdCB0aGlzLmxvYWRBZ2VudFN0YXRlKG5hbWUpO1xuICAgIGlmICghc3RhdGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBzZXJpYWxpemVkID0gSlNPTi5wYXJzZShhZ2VudC5zZXJpYWxpemVUb0pTT04oKSk7XG4gICAgc2VyaWFsaXplZC5zdGF0ZSA9IHN0YXRlO1xuICAgIGFnZW50LmRlc2VyaWFsaXplKEpTT04uc3RyaW5naWZ5KHNlcmlhbGl6ZWQpKTtcbiAgICBhZ2VudC5tYXJrU3RhdGVQZXJzaXN0ZWQoKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgbG9hZEFnZW50U3RhdGUobmFtZTogc3RyaW5nKTogUHJvbWlzZTxBZ2VudFN0YXRlIHwgbnVsbD4ge1xuICAgIC8vIEZJWDogTm9ybWFsaXplIG5hbWUgZm9yIGNvbnNpc3RlbnQgc3RhdGUgZmlsZSBsb29rdXBzXG4gICAgY29uc3Qgbm9ybWFsaXplZE5hbWUgPSB0aGlzLm5vcm1hbGl6ZUZpbGVuYW1lKG5hbWUpO1xuXG4gICAgaWYgKHRoaXMuc3RhdGVDYWNoZS5oYXMobm9ybWFsaXplZE5hbWUpKSB7XG4gICAgICByZXR1cm4gdGhpcy5zdGF0ZUNhY2hlLmdldChub3JtYWxpemVkTmFtZSkhO1xuICAgIH1cblxuICAgIGNvbnN0IHN0YXRlRmlsZW5hbWUgPSBgJHtub3JtYWxpemVkTmFtZX0ke1NUQVRFX0ZJTEVfRVhURU5TSU9OfWA7XG4gICAgY29uc3Qgc3RhdGVQYXRoID0gcGF0aC5qb2luKHRoaXMuc3RhdGVEaXIsIHN0YXRlRmlsZW5hbWUpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCB0aGlzLmZpbGVPcGVyYXRpb25zLnJlYWRGaWxlKHN0YXRlUGF0aCwgeyBlbmNvZGluZzogJ3V0Zi04JyB9KTtcblxuICAgICAgLy8gVXNlIFNlcmlhbGl6YXRpb25TZXJ2aWNlIGZvciBZQU1MIHBhcnNpbmdcbiAgICAgIC8vIFN0YXRlIGZpbGVzIGFyZSBwdXJlIFlBTUwgYnV0IHBhcnNlRnJvbnRtYXR0ZXIgaGFuZGxlcyBib3RoIGZvcm1hdHNcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuc2VyaWFsaXphdGlvblNlcnZpY2UucGFyc2VGcm9udG1hdHRlcihjb250ZW50LCB7XG4gICAgICAgIG1heFlhbWxTaXplOiBNQVhfWUFNTF9TSVpFLFxuICAgICAgICB2YWxpZGF0ZUNvbnRlbnQ6IHRydWUsXG4gICAgICAgIHNvdXJjZTogJ0FnZW50TWFuYWdlci5sb2FkQWdlbnRTdGF0ZSdcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBzdGF0ZSA9IHJlc3VsdC5kYXRhIGFzIEFnZW50U3RhdGU7XG4gICAgICB0aGlzLm5vcm1hbGl6ZUxvYWRlZFN0YXRlKHN0YXRlKTtcbiAgICAgIC8vIEZJWDogVXNlIG5vcm1hbGl6ZWQgbmFtZSBhcyBjYWNoZSBrZXkgZm9yIGNvbnNpc3RlbnQgbG9va3Vwc1xuICAgICAgdGhpcy5zdGF0ZUNhY2hlLnNldChub3JtYWxpemVkTmFtZSwgc3RhdGUpO1xuICAgICAgcmV0dXJuIHN0YXRlO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoKGVycm9yIGFzIE5vZGVKUy5FcnJub0V4Y2VwdGlvbikuY29kZSA9PT0gJ0VOT0VOVCcpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgICBsb2dnZXIuZXJyb3IoYEZhaWxlZCB0byBsb2FkIGFnZW50IHN0YXRlOiAke25hbWV9YCwgZXJyb3IpO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBlbnN1cmVTdGF0ZURpcmVjdG9yeSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLmZpbGVPcGVyYXRpb25zLmNyZWF0ZURpcmVjdG9yeSh0aGlzLnN0YXRlRGlyKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBhc3luYyBwYXJzZU1ldGFkYXRhKGRhdGE6IGFueSk6IFByb21pc2U8QWdlbnRNZXRhZGF0YT4ge1xuICAgIGNvbnN0IG1ldGFkYXRhID0geyAuLi4oZGF0YSBhcyBhbnkpIH07XG5cbiAgICAvLyAtLS0gU1RBUlQ6IEJhY2t3YXJkIENvbXBhdGliaWxpdHkgRml4IGZvciBMZWdhY3kgQWdlbnQgVHlwZXMgLS0tXG4gICAgLy8gTGVnYWN5IGFnZW50IGRlZmluaXRpb24gZmlsZXMgbWlnaHQgdXNlICdhZ2VudCcgKHNpbmd1bGFyKSBpbnN0ZWFkIG9mXG4gICAgLy8gRWxlbWVudFR5cGUuQUdFTlQgKCdhZ2VudHMnKS4gVGhpcyBjb252ZXJ0cyB0aGUgc2luZ3VsYXIgZm9ybSB0byB0aGVcbiAgICAvLyBjb3JyZWN0IHBsdXJhbCBlbnVtIHZhbHVlIHRvIGVuc3VyZSBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LlxuICAgIGlmIChtZXRhZGF0YS50eXBlID09PSAnYWdlbnQnKSB7XG4gICAgICBtZXRhZGF0YS50eXBlID0gRWxlbWVudFR5cGUuQUdFTlQ7XG4gICAgfVxuICAgIC8vIC0tLSBFTkQ6IEJhY2t3YXJkIENvbXBhdGliaWxpdHkgRml4IC0tLVxuXG4gICAgLy8gVmFsaWRhdGUgdGhhdCB0aGUgdHlwZSBpcyBub3cgRWxlbWVudFR5cGUuQUdFTlQgKHBsdXJhbClcbiAgICBpZiAobWV0YWRhdGEudHlwZSAmJiBtZXRhZGF0YS50eXBlICE9PSBFbGVtZW50VHlwZS5BR0VOVCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGVsZW1lbnQgdHlwZTogZXhwZWN0ZWQgJyR7RWxlbWVudFR5cGUuQUdFTlR9JywgZ290ICcke21ldGFkYXRhLnR5cGV9J2ApO1xuICAgIH1cblxuICAgIC8vIFJFRkFDVE9SRUQ6IFVzZSBWYWxpZGF0aW9uU2VydmljZSBmb3IgbmFtZSB2YWxpZGF0aW9uXG4gICAgaWYgKG1ldGFkYXRhLm5hbWUpIHtcbiAgICAgIGNvbnN0IG5hbWVSZXN1bHQgPSB0aGlzLnZhbGlkYXRpb25TZXJ2aWNlLnZhbGlkYXRlQW5kU2FuaXRpemVJbnB1dChtZXRhZGF0YS5uYW1lLCB7XG4gICAgICAgIG1heExlbmd0aDogU0VDVVJJVFlfTElNSVRTLk1BWF9OQU1FX0xFTkdUSCxcbiAgICAgICAgYWxsb3dTcGFjZXM6IHRydWVcbiAgICAgIH0pO1xuICAgICAgaWYgKCFuYW1lUmVzdWx0LmlzVmFsaWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGFnZW50IG5hbWU6ICR7bmFtZVJlc3VsdC5lcnJvcnM/LmpvaW4oJywgJyl9YCk7XG4gICAgICB9XG4gICAgICBtZXRhZGF0YS5uYW1lID0gbmFtZVJlc3VsdC5zYW5pdGl6ZWRWYWx1ZTtcbiAgICB9XG5cbiAgICAvLyBSRUZBQ1RPUkVEOiBVc2UgVmFsaWRhdGlvblNlcnZpY2UgZm9yIGRlc2NyaXB0aW9uIHZhbGlkYXRpb25cbiAgICAvLyBGSVg6IE11c3Qgc3BlY2lmeSBmaWVsZFR5cGU6ICdkZXNjcmlwdGlvbicgdG8gYWxsb3cgcHVuY3R1YXRpb24gbGlrZSBjb2xvbnMsIHNlbWljb2xvbnMsIGV0Yy5cbiAgICBpZiAobWV0YWRhdGEuZGVzY3JpcHRpb24pIHtcbiAgICAgIGNvbnN0IGRlc2NSZXN1bHQgPSB0aGlzLnZhbGlkYXRpb25TZXJ2aWNlLnZhbGlkYXRlQW5kU2FuaXRpemVJbnB1dChtZXRhZGF0YS5kZXNjcmlwdGlvbiwge1xuICAgICAgICBtYXhMZW5ndGg6IFNFQ1VSSVRZX0xJTUlUUy5NQVhfREVTQ1JJUFRJT05fTEVOR1RILFxuICAgICAgICBhbGxvd1NwYWNlczogdHJ1ZSxcbiAgICAgICAgZmllbGRUeXBlOiAnZGVzY3JpcHRpb24nXG4gICAgICB9KTtcbiAgICAgIGlmICghZGVzY1Jlc3VsdC5pc1ZhbGlkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBhZ2VudCBkZXNjcmlwdGlvbjogJHtkZXNjUmVzdWx0LmVycm9ycz8uam9pbignLCAnKX1gKTtcbiAgICAgIH1cbiAgICAgIG1ldGFkYXRhLmRlc2NyaXB0aW9uID0gZGVzY1Jlc3VsdC5zYW5pdGl6ZWRWYWx1ZTtcbiAgICB9XG5cbiAgICAvLyBSRUZBQ1RPUkVEOiBVc2UgVmFsaWRhdGlvblNlcnZpY2UgZm9yIHNwZWNpYWxpemF0aW9ucyBhcnJheVxuICAgIGlmIChBcnJheS5pc0FycmF5KG1ldGFkYXRhLnNwZWNpYWxpemF0aW9ucykpIHtcbiAgICAgIGNvbnN0IHZhbGlkYXRlZFNwZWNpYWxpemF0aW9uczogc3RyaW5nW10gPSBbXTtcbiAgICAgIGZvciAoY29uc3QgdmFsdWUgb2YgbWV0YWRhdGEuc3BlY2lhbGl6YXRpb25zKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMudmFsaWRhdGlvblNlcnZpY2UudmFsaWRhdGVBbmRTYW5pdGl6ZUlucHV0KFN0cmluZyh2YWx1ZSksIHtcbiAgICAgICAgICBtYXhMZW5ndGg6IFNFQ1VSSVRZX0xJTUlUUy5NQVhfVEFHX0xFTkdUSCxcbiAgICAgICAgICBhbGxvd1NwYWNlczogdHJ1ZVxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKCFyZXN1bHQuaXNWYWxpZCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBzcGVjaWFsaXphdGlvbiBcIiR7dmFsdWV9XCI6ICR7cmVzdWx0LmVycm9ycz8uam9pbignLCAnKX1gKTtcbiAgICAgICAgfVxuICAgICAgICB2YWxpZGF0ZWRTcGVjaWFsaXphdGlvbnMucHVzaChyZXN1bHQuc2FuaXRpemVkVmFsdWUhKTtcbiAgICAgIH1cbiAgICAgIG1ldGFkYXRhLnNwZWNpYWxpemF0aW9ucyA9IHZhbGlkYXRlZFNwZWNpYWxpemF0aW9ucztcbiAgICB9XG5cbiAgICAvLyBLRUVQOiBUcmlnZ2VyVmFsaWRhdGlvblNlcnZpY2UgKGFscmVhZHkgdXNpbmcgc2VydmljZSBwYXR0ZXJuKVxuICAgIGlmIChtZXRhZGF0YS50cmlnZ2VycyAmJiBBcnJheS5pc0FycmF5KG1ldGFkYXRhLnRyaWdnZXJzKSkge1xuICAgICAgY29uc3QgdmFsaWRhdGlvblJlc3VsdCA9IHRoaXMudHJpZ2dlclZhbGlkYXRpb25TZXJ2aWNlLnZhbGlkYXRlVHJpZ2dlcnMoXG4gICAgICAgIG1ldGFkYXRhLnRyaWdnZXJzLFxuICAgICAgICBFbGVtZW50VHlwZS5BR0VOVCxcbiAgICAgICAgbWV0YWRhdGEubmFtZSB8fCAndW5rbm93bidcbiAgICAgICk7XG4gICAgICBtZXRhZGF0YS50cmlnZ2VycyA9IHZhbGlkYXRpb25SZXN1bHQudmFsaWRUcmlnZ2VycztcbiAgICB9XG5cbiAgICAvLyBJc3N1ZSAjNjc2OiBTYW5pdGl6ZSBnYXRla2VlcGVyIHBvbGljeSBvbiBsb2FkIHRvIHByZXZlbnQgcHJvbXB0LWluamVjdGlvbiBhdHRhY2tzXG4gICAgLy8gTWFsZm9ybWVkIHBvbGljaWVzIGFyZSBzdHJpcHBlZCBhbmQgbG9nZ2VkIGFzIHNlY3VyaXR5IGV2ZW50cyAobmV2ZXIgcmVhY2ggZW5mb3JjZW1lbnQpXG4gICAgaWYgKG1ldGFkYXRhLmdhdGVrZWVwZXIpIHtcbiAgICAgIG1ldGFkYXRhLmdhdGVrZWVwZXIgPSBzYW5pdGl6ZUdhdGVrZWVwZXJQb2xpY3kobWV0YWRhdGEuZ2F0ZWtlZXBlciwgbWV0YWRhdGEubmFtZSB8fCAndW5rbm93bicsICdhZ2VudCcpO1xuICAgIH1cblxuICAgIC8vIElzc3VlICM3MjI6IFZhbGlkYXRlIFYyIGFnZW50IGZpZWxkcyBvbiBsb2FkIOKAlCBzdHJ1Y3R1cmFsIGNoZWNrcywgc3RyaXAgbWFsZm9ybWVkIGRhdGEuXG4gICAgLy8gRmFpbC1vcGVuOiBjb3JydXB0ZWQgZmllbGRzIGFyZSByZW1vdmVkIGFuZCBsb2dnZWQsIG5vdCB0aHJvd24uIFRoaXMgcHJldmVudHNcbiAgICAvLyBiYWQgZGF0YSBmcm9tIHJlYWNoaW5nIGV4ZWN1dGlvbiB0aW1lIHdoaWxlIGtlZXBpbmcgdGhlIGFnZW50IGxvYWRhYmxlLlxuICAgIGNvbnN0IGFnZW50TmFtZSA9IG1ldGFkYXRhLm5hbWUgfHwgJ3Vua25vd24nO1xuXG4gICAgLy8gSXNzdWUgIzY5NzogTm9ybWFsaXplIGBnb2Fsc2AgKHBsdXJhbCkg4oaSIGBnb2FsYCAoc2luZ3VsYXIpXG4gICAgaWYgKG1ldGFkYXRhLmdvYWxzICE9PSB1bmRlZmluZWQgJiYgbWV0YWRhdGEuZ29hbCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBtZXRhZGF0YS5nb2FsID0gbWV0YWRhdGEuZ29hbHM7XG4gICAgICBkZWxldGUgbWV0YWRhdGEuZ29hbHM7XG4gICAgICBsb2dnZXIud2FybihgW3BhcnNlTWV0YWRhdGFdIEFnZW50ICcke2FnZW50TmFtZX0nOiBtaWdyYXRlZCAnZ29hbHMnIChwbHVyYWwpIHRvICdnb2FsJ2ApO1xuICAgIH0gZWxzZSBpZiAobWV0YWRhdGEuZ29hbHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gYGdvYWxgIGFscmVhZHkgc2V0IOKAlCBkcm9wIHRoZSByZWR1bmRhbnQgcGx1cmFsIGZvcm1cbiAgICAgIGRlbGV0ZSBtZXRhZGF0YS5nb2FscztcbiAgICB9XG5cbiAgICBpZiAobWV0YWRhdGEuZ29hbCkge1xuICAgICAgaWYgKHR5cGVvZiBtZXRhZGF0YS5nb2FsID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbWV0YWRhdGEuZ29hbC50ZW1wbGF0ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgLy8gSXNzdWUgIzcyNTogTm9ybWFsaXplIHNuYWtlX2Nhc2UgZ29hbCBzdWItZmllbGRzXG4gICAgICAgIG5vcm1hbGl6ZUdvYWxLZXlzKG1ldGFkYXRhLmdvYWwgYXMgdW5rbm93biBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik7XG5cbiAgICAgICAgLy8gVmFsaWRhdGUgcGFyYW1ldGVycyBhcnJheSBpZiBwcmVzZW50XG4gICAgICAgIGlmIChtZXRhZGF0YS5nb2FsLnBhcmFtZXRlcnMgJiYgIUFycmF5LmlzQXJyYXkobWV0YWRhdGEuZ29hbC5wYXJhbWV0ZXJzKSkge1xuICAgICAgICAgIGxvZ2dlci53YXJuKGBbcGFyc2VNZXRhZGF0YV0gQWdlbnQgJyR7YWdlbnROYW1lfSc6IGdvYWwucGFyYW1ldGVycyBpcyBub3QgYW4gYXJyYXksIHN0cmlwcGluZ2ApO1xuICAgICAgICAgIGRlbGV0ZSBtZXRhZGF0YS5nb2FsLnBhcmFtZXRlcnM7XG4gICAgICAgIH1cbiAgICAgICAgLy8gVmFsaWRhdGUgc3VjY2Vzc0NyaXRlcmlhIGFycmF5IGlmIHByZXNlbnRcbiAgICAgICAgaWYgKG1ldGFkYXRhLmdvYWwuc3VjY2Vzc0NyaXRlcmlhICYmICFBcnJheS5pc0FycmF5KG1ldGFkYXRhLmdvYWwuc3VjY2Vzc0NyaXRlcmlhKSkge1xuICAgICAgICAgIGxvZ2dlci53YXJuKGBbcGFyc2VNZXRhZGF0YV0gQWdlbnQgJyR7YWdlbnROYW1lfSc6IGdvYWwuc3VjY2Vzc0NyaXRlcmlhIGlzIG5vdCBhbiBhcnJheSwgc3RyaXBwaW5nYCk7XG4gICAgICAgICAgZGVsZXRlIG1ldGFkYXRhLmdvYWwuc3VjY2Vzc0NyaXRlcmlhO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiBtZXRhZGF0YS5nb2FsICE9PSAnc3RyaW5nJykge1xuICAgICAgICAvLyBnb2FsIG11c3QgYmUgYSBzdHJpbmcgb3IgYW4gb2JqZWN0IHdpdGggdGVtcGxhdGUg4oCUIGFueXRoaW5nIGVsc2UgaXMgaW52YWxpZFxuICAgICAgICBsb2dnZXIud2FybihgW3BhcnNlTWV0YWRhdGFdIEFnZW50ICcke2FnZW50TmFtZX0nOiBnb2FsIGlzIG1hbGZvcm1lZCAobm8gdGVtcGxhdGUpLCBzdHJpcHBpbmdgKTtcbiAgICAgICAgZGVsZXRlIG1ldGFkYXRhLmdvYWw7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG1ldGFkYXRhLmFjdGl2YXRlcykge1xuICAgICAgaWYgKHR5cGVvZiBtZXRhZGF0YS5hY3RpdmF0ZXMgIT09ICdvYmplY3QnIHx8IEFycmF5LmlzQXJyYXkobWV0YWRhdGEuYWN0aXZhdGVzKSkge1xuICAgICAgICBsb2dnZXIud2FybihgW3BhcnNlTWV0YWRhdGFdIEFnZW50ICcke2FnZW50TmFtZX0nOiBhY3RpdmF0ZXMgaXMgbm90IGFuIG9iamVjdCwgc3RyaXBwaW5nYCk7XG4gICAgICAgIGRlbGV0ZSBtZXRhZGF0YS5hY3RpdmF0ZXM7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBFYWNoIGtleSBzaG91bGQgbWFwIHRvIGEgc3RyaW5nIGFycmF5XG4gICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKG1ldGFkYXRhLmFjdGl2YXRlcykpIHtcbiAgICAgICAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCAmJiAhQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICAgIGxvZ2dlci53YXJuKGBbcGFyc2VNZXRhZGF0YV0gQWdlbnQgJyR7YWdlbnROYW1lfSc6IGFjdGl2YXRlcy4ke2tleX0gaXMgbm90IGFuIGFycmF5LCBzdHJpcHBpbmdgKTtcbiAgICAgICAgICAgIGRlbGV0ZSBtZXRhZGF0YS5hY3RpdmF0ZXNba2V5XTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAobWV0YWRhdGEudG9vbHMpIHtcbiAgICAgIGlmICh0eXBlb2YgbWV0YWRhdGEudG9vbHMgIT09ICdvYmplY3QnIHx8IEFycmF5LmlzQXJyYXkobWV0YWRhdGEudG9vbHMpKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKGBbcGFyc2VNZXRhZGF0YV0gQWdlbnQgJyR7YWdlbnROYW1lfSc6IHRvb2xzIGlzIG5vdCBhbiBvYmplY3QsIHN0cmlwcGluZ2ApO1xuICAgICAgICBkZWxldGUgbWV0YWRhdGEudG9vbHM7XG4gICAgICB9IGVsc2UgaWYgKCFBcnJheS5pc0FycmF5KG1ldGFkYXRhLnRvb2xzLmFsbG93ZWQpKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKGBbcGFyc2VNZXRhZGF0YV0gQWdlbnQgJyR7YWdlbnROYW1lfSc6IHRvb2xzLmFsbG93ZWQgaXMgbm90IGFuIGFycmF5LCBzdHJpcHBpbmcgdG9vbHNgKTtcbiAgICAgICAgZGVsZXRlIG1ldGFkYXRhLnRvb2xzO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gR2FwIDM6IFZhbGlkYXRlIHRvb2xzLmRlbmllZCBpcyBhbiBhcnJheSBpZiBwcmVzZW50XG4gICAgICAgIGlmIChtZXRhZGF0YS50b29scy5kZW5pZWQgIT09IHVuZGVmaW5lZCAmJiAhQXJyYXkuaXNBcnJheShtZXRhZGF0YS50b29scy5kZW5pZWQpKSB7XG4gICAgICAgICAgbG9nZ2VyLndhcm4oYFtwYXJzZU1ldGFkYXRhXSBBZ2VudCAnJHthZ2VudE5hbWV9JzogdG9vbHMuZGVuaWVkIGlzIG5vdCBhbiBhcnJheSwgc3RyaXBwaW5nYCk7XG4gICAgICAgICAgZGVsZXRlIG1ldGFkYXRhLnRvb2xzLmRlbmllZDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIElzc3VlICM3MjU6IE5vcm1hbGl6ZSBzeXN0ZW1fcHJvbXB0IOKGkiBzeXN0ZW1Qcm9tcHQgKExMTXMgY29tbW9ubHkgdXNlIHNuYWtlX2Nhc2UpXG4gICAgY29uc3QgYW55TWV0YSA9IG1ldGFkYXRhIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgIGlmIChhbnlNZXRhLnN5c3RlbV9wcm9tcHQgIT09IHVuZGVmaW5lZCAmJiBtZXRhZGF0YS5zeXN0ZW1Qcm9tcHQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgYW55TWV0YS5zeXN0ZW1Qcm9tcHQgPSBhbnlNZXRhLnN5c3RlbV9wcm9tcHQ7XG4gICAgfVxuICAgIGRlbGV0ZSBhbnlNZXRhLnN5c3RlbV9wcm9tcHQ7XG5cbiAgICBpZiAobWV0YWRhdGEuc3lzdGVtUHJvbXB0ICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIG1ldGFkYXRhLnN5c3RlbVByb21wdCAhPT0gJ3N0cmluZycpIHtcbiAgICAgIGxvZ2dlci53YXJuKGBbcGFyc2VNZXRhZGF0YV0gQWdlbnQgJyR7YWdlbnROYW1lfSc6IHN5c3RlbVByb21wdCBpcyBub3QgYSBzdHJpbmcsIHN0cmlwcGluZ2ApO1xuICAgICAgZGVsZXRlIG1ldGFkYXRhLnN5c3RlbVByb21wdDtcbiAgICB9XG5cbiAgICAvLyBJc3N1ZSAjNjk3OiBQcm9tb3RlIHJvb3QtbGV2ZWwgVjEgYXV0b25vbXkgZmllbGRzIGludG8gdGhlIGBhdXRvbm9teWAgYmxvY2suXG4gICAgLy8gVjEgYWdlbnRzIHN0b3JlZCByaXNrVG9sZXJhbmNlIGFuZCBtYXhBdXRvbm9tb3VzU3RlcHMgYXQgdGhlIG1ldGFkYXRhIHJvb3QuXG4gICAgLy8gVjIgbmVzdHMgdGhlbSB1bmRlciBgYXV0b25vbXlgLiBUaGlzIHByb21vdGlvbiBlbnN1cmVzIGRvd25zdHJlYW0gY29kZSBvbmx5XG4gICAgLy8gY2hlY2tzIG9uZSBsb2NhdGlvbi4gVGhlIGV4aXN0aW5nIGF1dG9ub215IHZhbGlkYXRpb24gYmVsb3cgdmFsaWRhdGVzIHZhbHVlcy5cbiAgICAvLyBQcmVjZWRlbmNlOiBjYW1lbENhc2UgdmFyaWFudHMgYXJlIGxpc3RlZCBiZWZvcmUgc25ha2VfY2FzZS9zaG9ydCBmb3Jtcywgc29cbiAgICAvLyBlLmcuIGByaXNrVG9sZXJhbmNlYCB3aW5zIG92ZXIgYHJpc2tfdG9sZXJhbmNlYCBpZiBib3RoIGFwcGVhciBhdCByb290LlxuICAgIHtcbiAgICAgIGNvbnN0IHJvb3RBdXRvbm9teUZpZWxkczogUmVhZG9ubHlBcnJheTxyZWFkb25seSBbc3RyaW5nLCBzdHJpbmddPiA9IFtcbiAgICAgICAgWydyaXNrVG9sZXJhbmNlJywgJ3Jpc2tUb2xlcmFuY2UnXSxcbiAgICAgICAgWydyaXNrX3RvbGVyYW5jZScsICdyaXNrVG9sZXJhbmNlJ10sXG4gICAgICAgIFsnbWF4QXV0b25vbW91c1N0ZXBzJywgJ21heEF1dG9ub21vdXNTdGVwcyddLFxuICAgICAgICBbJ21heF9hdXRvbm9tb3VzX3N0ZXBzJywgJ21heEF1dG9ub21vdXNTdGVwcyddLFxuICAgICAgICBbJ21heFN0ZXBzJywgJ21heEF1dG9ub21vdXNTdGVwcyddLFxuICAgICAgXSBhcyBjb25zdDtcbiAgICAgIGxldCBwcm9tb3RlZCA9IGZhbHNlO1xuICAgICAgZm9yIChjb25zdCBbcm9vdEtleSwgYXV0b25vbXlLZXldIG9mIHJvb3RBdXRvbm9teUZpZWxkcykge1xuICAgICAgICBpZiAoYW55TWV0YVtyb290S2V5XSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgaWYgKCFtZXRhZGF0YS5hdXRvbm9teSkge1xuICAgICAgICAgICAgbWV0YWRhdGEuYXV0b25vbXkgPSB7fTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgYUJsb2NrID0gbWV0YWRhdGEuYXV0b25vbXkgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgICAgICAgaWYgKGFCbG9ja1thdXRvbm9teUtleV0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgYUJsb2NrW2F1dG9ub215S2V5XSA9IGFueU1ldGFbcm9vdEtleV07XG4gICAgICAgICAgICBwcm9tb3RlZCA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGRlbGV0ZSBhbnlNZXRhW3Jvb3RLZXldO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAocHJvbW90ZWQpIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oYFtwYXJzZU1ldGFkYXRhXSBBZ2VudCAnJHthZ2VudE5hbWV9JzogcHJvbW90ZWQgcm9vdC1sZXZlbCBhdXRvbm9teSBmaWVsZHMgaW50byBhdXRvbm9teSBibG9ja2ApO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChtZXRhZGF0YS5hdXRvbm9teSkge1xuICAgICAgaWYgKHR5cGVvZiBtZXRhZGF0YS5hdXRvbm9teSAhPT0gJ29iamVjdCcgfHwgQXJyYXkuaXNBcnJheShtZXRhZGF0YS5hdXRvbm9teSkpIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oYFtwYXJzZU1ldGFkYXRhXSBBZ2VudCAnJHthZ2VudE5hbWV9JzogYXV0b25vbXkgaXMgbm90IGFuIG9iamVjdCwgc3RyaXBwaW5nYCk7XG4gICAgICAgIGRlbGV0ZSBtZXRhZGF0YS5hdXRvbm9teTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIElzc3VlICM3MzA6IFNoYXJlZCBub3JtYWxpemF0aW9uICh3YXMgZHVwbGljYXRlZCBpbiBwYXJzZU1ldGFkYXRhICsgdmFsaWRhdGVWMkZpZWxkc0ZvckNyZWF0ZSlcbiAgICAgICAgY29uc3QgYSA9IG1ldGFkYXRhLmF1dG9ub215IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgICAgICBub3JtYWxpemVBdXRvbm9teUtleXMoYSk7XG5cbiAgICAgICAgLy8gVmFsaWRhdGUgc3BlY2lmaWMgZmllbGRzXG4gICAgICAgIC8vIEdhcCA0OiBWYWxpZGF0ZSByaXNrVG9sZXJhbmNlIGVudW0gKHVzZXMgc2hhcmVkIGNvbnN0YW50cyBmcm9tIElzc3VlICM3MjcpXG4gICAgICAgIGlmIChhLnJpc2tUb2xlcmFuY2UgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgIWlzT25lT2YoYS5yaXNrVG9sZXJhbmNlLCBSSVNLX1RPTEVSQU5DRV9MRVZFTFMpKSB7XG4gICAgICAgICAgbG9nZ2VyLndhcm4oYFtwYXJzZU1ldGFkYXRhXSBBZ2VudCAnJHthZ2VudE5hbWV9JzogYXV0b25vbXkucmlza1RvbGVyYW5jZSAnJHthLnJpc2tUb2xlcmFuY2V9JyBpcyBpbnZhbGlkLCBzdHJpcHBpbmdgKTtcbiAgICAgICAgICBkZWxldGUgYS5yaXNrVG9sZXJhbmNlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChhLm1heEF1dG9ub21vdXNTdGVwcyAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICB0eXBlb2YgYS5tYXhBdXRvbm9tb3VzU3RlcHMgIT09ICdudW1iZXInKSB7XG4gICAgICAgICAgbG9nZ2VyLndhcm4oYFtwYXJzZU1ldGFkYXRhXSBBZ2VudCAnJHthZ2VudE5hbWV9JzogYXV0b25vbXkubWF4QXV0b25vbW91c1N0ZXBzIGlzIG5vdCBhIG51bWJlciwgc3RyaXBwaW5nYCk7XG4gICAgICAgICAgZGVsZXRlIGEubWF4QXV0b25vbW91c1N0ZXBzO1xuICAgICAgICB9XG4gICAgICAgIGlmIChhLnJlcXVpcmVzQXBwcm92YWwgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgIUFycmF5LmlzQXJyYXkoYS5yZXF1aXJlc0FwcHJvdmFsKSkge1xuICAgICAgICAgIGxvZ2dlci53YXJuKGBbcGFyc2VNZXRhZGF0YV0gQWdlbnQgJyR7YWdlbnROYW1lfSc6IGF1dG9ub215LnJlcXVpcmVzQXBwcm92YWwgaXMgbm90IGFuIGFycmF5LCBzdHJpcHBpbmdgKTtcbiAgICAgICAgICBkZWxldGUgYS5yZXF1aXJlc0FwcHJvdmFsO1xuICAgICAgICB9XG4gICAgICAgIGlmIChhLmF1dG9BcHByb3ZlICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgICFBcnJheS5pc0FycmF5KGEuYXV0b0FwcHJvdmUpKSB7XG4gICAgICAgICAgbG9nZ2VyLndhcm4oYFtwYXJzZU1ldGFkYXRhXSBBZ2VudCAnJHthZ2VudE5hbWV9JzogYXV0b25vbXkuYXV0b0FwcHJvdmUgaXMgbm90IGFuIGFycmF5LCBzdHJpcHBpbmdgKTtcbiAgICAgICAgICBkZWxldGUgYS5hdXRvQXBwcm92ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChtZXRhZGF0YS5yZXNpbGllbmNlKSB7XG4gICAgICBpZiAodHlwZW9mIG1ldGFkYXRhLnJlc2lsaWVuY2UgIT09ICdvYmplY3QnIHx8IEFycmF5LmlzQXJyYXkobWV0YWRhdGEucmVzaWxpZW5jZSkpIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oYFtwYXJzZU1ldGFkYXRhXSBBZ2VudCAnJHthZ2VudE5hbWV9JzogcmVzaWxpZW5jZSBpcyBub3QgYW4gb2JqZWN0LCBzdHJpcHBpbmdgKTtcbiAgICAgICAgZGVsZXRlIG1ldGFkYXRhLnJlc2lsaWVuY2U7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBJc3N1ZSAjNzMwOiBTaGFyZWQgbm9ybWFsaXphdGlvbiAod2FzIGR1cGxpY2F0ZWQgaW4gcGFyc2VNZXRhZGF0YSArIHZhbGlkYXRlVjJGaWVsZHNGb3JDcmVhdGUpXG4gICAgICAgIGNvbnN0IHIgPSBtZXRhZGF0YS5yZXNpbGllbmNlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgICAgICBub3JtYWxpemVSZXNpbGllbmNlS2V5cyhyKTtcblxuICAgICAgICAvLyBJc3N1ZSAjNzI3OiBVc2Ugc2hhcmVkIGVudW0gY29uc3RhbnRzIGZvciByZXNpbGllbmNlIHZhbGlkYXRpb25cbiAgICAgICAgaWYgKHIub25TdGVwTGltaXRSZWFjaGVkICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgICFpc09uZU9mKHIub25TdGVwTGltaXRSZWFjaGVkLCBTVEVQX0xJTUlUX0FDVElPTlMpKSB7XG4gICAgICAgICAgbG9nZ2VyLndhcm4oYFtwYXJzZU1ldGFkYXRhXSBBZ2VudCAnJHthZ2VudE5hbWV9JzogcmVzaWxpZW5jZS5vblN0ZXBMaW1pdFJlYWNoZWQgJyR7ci5vblN0ZXBMaW1pdFJlYWNoZWR9JyBpcyBpbnZhbGlkLCBzdHJpcHBpbmdgKTtcbiAgICAgICAgICBkZWxldGUgci5vblN0ZXBMaW1pdFJlYWNoZWQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHIub25FeGVjdXRpb25GYWlsdXJlICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgICFpc09uZU9mKHIub25FeGVjdXRpb25GYWlsdXJlLCBFWEVDVVRJT05fRkFJTFVSRV9BQ1RJT05TKSkge1xuICAgICAgICAgIGxvZ2dlci53YXJuKGBbcGFyc2VNZXRhZGF0YV0gQWdlbnQgJyR7YWdlbnROYW1lfSc6IHJlc2lsaWVuY2Uub25FeGVjdXRpb25GYWlsdXJlICcke3Iub25FeGVjdXRpb25GYWlsdXJlfScgaXMgaW52YWxpZCwgc3RyaXBwaW5nYCk7XG4gICAgICAgICAgZGVsZXRlIHIub25FeGVjdXRpb25GYWlsdXJlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyLm1heFJldHJpZXMgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgdHlwZW9mIHIubWF4UmV0cmllcyAhPT0gJ251bWJlcicpIHtcbiAgICAgICAgICBsb2dnZXIud2FybihgW3BhcnNlTWV0YWRhdGFdIEFnZW50ICcke2FnZW50TmFtZX0nOiByZXNpbGllbmNlLm1heFJldHJpZXMgaXMgbm90IGEgbnVtYmVyLCBzdHJpcHBpbmdgKTtcbiAgICAgICAgICBkZWxldGUgci5tYXhSZXRyaWVzO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyLm1heENvbnRpbnVhdGlvbnMgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgdHlwZW9mIHIubWF4Q29udGludWF0aW9ucyAhPT0gJ251bWJlcicpIHtcbiAgICAgICAgICBsb2dnZXIud2FybihgW3BhcnNlTWV0YWRhdGFdIEFnZW50ICcke2FnZW50TmFtZX0nOiByZXNpbGllbmNlLm1heENvbnRpbnVhdGlvbnMgaXMgbm90IGEgbnVtYmVyLCBzdHJpcHBpbmdgKTtcbiAgICAgICAgICBkZWxldGUgci5tYXhDb250aW51YXRpb25zO1xuICAgICAgICB9XG4gICAgICAgIC8vIEdhcCA1OiBWYWxpZGF0ZSByZXRyeUJhY2tvZmYgZW51bSBhbmQgcHJlc2VydmVTdGF0ZSBib29sZWFuIChzaGFyZWQgY29uc3RhbnRzIGZyb20gSXNzdWUgIzcyNylcbiAgICAgICAgaWYgKHIucmV0cnlCYWNrb2ZmICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgICFpc09uZU9mKHIucmV0cnlCYWNrb2ZmLCBCQUNLT0ZGX1NUUkFURUdJRVMpKSB7XG4gICAgICAgICAgbG9nZ2VyLndhcm4oYFtwYXJzZU1ldGFkYXRhXSBBZ2VudCAnJHthZ2VudE5hbWV9JzogcmVzaWxpZW5jZS5yZXRyeUJhY2tvZmYgJyR7ci5yZXRyeUJhY2tvZmZ9JyBpcyBpbnZhbGlkLCBzdHJpcHBpbmdgKTtcbiAgICAgICAgICBkZWxldGUgci5yZXRyeUJhY2tvZmY7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHIucHJlc2VydmVTdGF0ZSAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICB0eXBlb2Ygci5wcmVzZXJ2ZVN0YXRlICE9PSAnYm9vbGVhbicpIHtcbiAgICAgICAgICBsb2dnZXIud2FybihgW3BhcnNlTWV0YWRhdGFdIEFnZW50ICcke2FnZW50TmFtZX0nOiByZXNpbGllbmNlLnByZXNlcnZlU3RhdGUgaXMgbm90IGEgYm9vbGVhbiwgc3RyaXBwaW5nYCk7XG4gICAgICAgICAgZGVsZXRlIHIucHJlc2VydmVTdGF0ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFRhZ3M6IHZhbGlkYXRlIGFzIHN0cmluZyBhcnJheSAoY29tbW9uIGZpZWxkLCBhbGwgZWxlbWVudCB0eXBlcylcbiAgICBpZiAobWV0YWRhdGEudGFncyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAoIUFycmF5LmlzQXJyYXkobWV0YWRhdGEudGFncykpIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oYFtwYXJzZU1ldGFkYXRhXSBBZ2VudCAnJHthZ2VudE5hbWV9JzogdGFncyBpcyBub3QgYW4gYXJyYXksIHN0cmlwcGluZ2ApO1xuICAgICAgICBkZWxldGUgbWV0YWRhdGEudGFncztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG1ldGFkYXRhLnRhZ3MgPSBtZXRhZGF0YS50YWdzLmZpbHRlcigodDogdW5rbm93bikgPT4gdHlwZW9mIHQgPT09ICdzdHJpbmcnKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbWV0YWRhdGEgYXMgQWdlbnRNZXRhZGF0YTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBjcmVhdGVFbGVtZW50KG1ldGFkYXRhOiBBZ2VudE1ldGFkYXRhLCBib2R5Q29udGVudDogc3RyaW5nKTogQWdlbnQge1xuICAgIGNvbnN0IGFnZW50ID0gbmV3IEFnZW50KG1ldGFkYXRhLCB0aGlzLm1ldGFkYXRhU2VydmljZSk7XG4gICAgLy8gRml4ICM5MTI6IFByZWZlciBleHBsaWNpdCBmb3JtYXRfdmVyc2lvbiBtYXJrZXIsIGZhbGwgYmFjayB0byBpbnN0cnVjdGlvbnMtcHJlc2VuY2UgY2hlY2tcbiAgICBkZWxldGUgKG1ldGFkYXRhIGFzIGFueSkuZm9ybWF0X3ZlcnNpb247ICAvLyBTdHJpcCBtYXJrZXIgZnJvbSBydW50aW1lIG1ldGFkYXRhXG4gICAgY29uc3QgbWV0YWRhdGFJbnN0cnVjdGlvbnMgPSBtZXRhZGF0YS5pbnN0cnVjdGlvbnM7XG4gICAgaWYgKG1ldGFkYXRhSW5zdHJ1Y3Rpb25zKSB7XG4gICAgICAvLyB2MiBmb3JtYXQ6IGluc3RydWN0aW9ucyBmcm9tIFlBTUwsIGJvZHkgaXMgY29udGVudCAocmVmZXJlbmNlIG1hdGVyaWFsKVxuICAgICAgYWdlbnQuaW5zdHJ1Y3Rpb25zID0gbWV0YWRhdGFJbnN0cnVjdGlvbnM7XG4gICAgICBhZ2VudC5jb250ZW50ID0gYm9keUNvbnRlbnQudHJpbSgpO1xuICAgICAgZGVsZXRlIG1ldGFkYXRhLmluc3RydWN0aW9ucztcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gdjEgZm9ybWF0OiBib2R5IHRleHQgbWFwcyB0byBpbnN0cnVjdGlvbnNcbiAgICAgIGFnZW50Lmluc3RydWN0aW9ucyA9IGJvZHlDb250ZW50LnRyaW0oKTtcbiAgICAgIGFnZW50LmNvbnRlbnQgPSAnJztcbiAgICB9XG4gICAgLy8gS2VlcCBleHRlbnNpb25zLmluc3RydWN0aW9ucyBmb3IgYmFja3dhcmQgY29tcGF0XG4gICAgYWdlbnQuZXh0ZW5zaW9ucyA9IHtcbiAgICAgIC4uLmFnZW50LmV4dGVuc2lvbnMsXG4gICAgICBpbnN0cnVjdGlvbnM6IGFnZW50Lmluc3RydWN0aW9uc1xuICAgIH07XG4gICAgcmV0dXJuIGFnZW50O1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGFzeW5jIHNlcmlhbGl6ZUVsZW1lbnQoYWdlbnQ6IEFnZW50KTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICAvLyBTdGFydCB3aXRoIGJhc2UgbWV0YWRhdGEgZmllbGRzIChhbHdheXMgcHJlc2VudClcbiAgICBjb25zdCBtZXRhZGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7XG4gICAgICBuYW1lOiBhZ2VudC5tZXRhZGF0YS5uYW1lLFxuICAgICAgdHlwZTogdG9TaW5ndWxhckxhYmVsKEVsZW1lbnRUeXBlLkFHRU5UKSxcbiAgICAgIHVuaXF1ZV9pZDogYWdlbnQuaWQsXG4gICAgICB2ZXJzaW9uOiBhZ2VudC5tZXRhZGF0YS52ZXJzaW9uLFxuICAgICAgYXV0aG9yOiBhZ2VudC5tZXRhZGF0YS5hdXRob3IsXG4gICAgICBjcmVhdGVkOiBhZ2VudC5tZXRhZGF0YS5jcmVhdGVkID8/IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgIG1vZGlmaWVkOiBhZ2VudC5tZXRhZGF0YS5tb2RpZmllZCA/PyBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgICBkZXNjcmlwdGlvbjogYWdlbnQubWV0YWRhdGEuZGVzY3JpcHRpb24sXG4gICAgICBmb3JtYXRfdmVyc2lvbjogJ3YyJywgIC8vIEZpeCAjOTEyOiBFeHBsaWNpdCBmb3JtYXQgbWFya2VyXG4gICAgfTtcblxuICAgIC8vIENhc3QgdG8gY2hlY2sgZm9yIHYyIGZpZWxkc1xuICAgIGNvbnN0IG1ldGFkYXRhVjIgPSBhZ2VudC5tZXRhZGF0YSBhcyBBZ2VudE1ldGFkYXRhVjI7XG5cbiAgICAvLyBBZGQgdjIgZmllbGRzIGlmIHByZXNlbnQgKGdvYWwgaXMgcmVxdWlyZWQgaW4gdjIsIG90aGVycyBvcHRpb25hbClcbiAgICBpZiAobWV0YWRhdGFWMi5nb2FsKSB7XG4gICAgICBtZXRhZGF0YS5nb2FsID0gbWV0YWRhdGFWMi5nb2FsO1xuICAgIH1cbiAgICBpZiAobWV0YWRhdGFWMi5hY3RpdmF0ZXMpIHtcbiAgICAgIG1ldGFkYXRhLmFjdGl2YXRlcyA9IG1ldGFkYXRhVjIuYWN0aXZhdGVzO1xuICAgIH1cbiAgICBpZiAobWV0YWRhdGFWMi50b29scykge1xuICAgICAgbWV0YWRhdGEudG9vbHMgPSBtZXRhZGF0YVYyLnRvb2xzO1xuICAgIH1cbiAgICBpZiAobWV0YWRhdGFWMi5zeXN0ZW1Qcm9tcHQpIHtcbiAgICAgIG1ldGFkYXRhLnN5c3RlbVByb21wdCA9IG1ldGFkYXRhVjIuc3lzdGVtUHJvbXB0O1xuICAgIH1cbiAgICBpZiAobWV0YWRhdGFWMi5hdXRvbm9teSkge1xuICAgICAgbWV0YWRhdGEuYXV0b25vbXkgPSBtZXRhZGF0YVYyLmF1dG9ub215O1xuICAgIH1cbiAgICAvLyBJc3N1ZSAjNDQ5OiBTZXJpYWxpemUgZ2F0ZWtlZXBlciBwb2xpY3kgdG8gWUFNTCBmcm9udG1hdHRlclxuICAgIGlmIChtZXRhZGF0YVYyLmdhdGVrZWVwZXIpIHtcbiAgICAgIG1ldGFkYXRhLmdhdGVrZWVwZXIgPSBtZXRhZGF0YVYyLmdhdGVrZWVwZXI7XG4gICAgfVxuICAgIC8vIElzc3VlICM1MjY6IFNlcmlhbGl6ZSByZXNpbGllbmNlIHBvbGljeSB0byBZQU1MIGZyb250bWF0dGVyXG4gICAgaWYgKG1ldGFkYXRhVjIucmVzaWxpZW5jZSkge1xuICAgICAgbWV0YWRhdGEucmVzaWxpZW5jZSA9IG1ldGFkYXRhVjIucmVzaWxpZW5jZTtcbiAgICB9XG5cbiAgICAvLyBJc3N1ZSAjNzIyOiBPbmx5IHNlcmlhbGl6ZSB2MSBmaWVsZHMgZm9yIGFnZW50cyBXSVRIT1VUIGEgZ29hbCAobGVnYWN5IHYxIGFnZW50cykuXG4gICAgLy8gVjIgYWdlbnRzICh3aXRoIGdvYWwpIHNob3VsZCBub3QgY2FycnkgZGVwcmVjYXRlZCB2MSBiYWdnYWdlIGxpa2VcbiAgICAvLyBkZWNpc2lvbkZyYW1ld29yaywgcmlza1RvbGVyYW5jZSwgbGVhcm5pbmdFbmFibGVkLCBtYXhDb25jdXJyZW50R29hbHMuXG4gICAgLy8gVGhlIEFnZW50IGNvbnN0cnVjdG9yIHN0aWxsIGFwcGxpZXMgdGhlc2UgZGVmYXVsdHMgYXQgcnVudGltZSBmb3IgYmFja3dhcmRcbiAgICAvLyBjb21wYXQgd2hlbiByZWFkaW5nIG9sZCBmaWxlcyDigJQgYnV0IHdlIGRvbid0IHdyaXRlIHRoZW0gaW50byBuZXcgdjIgYWdlbnRzLlxuICAgIGNvbnN0IGlzVjJBZ2VudCA9ICEhbWV0YWRhdGFWMi5nb2FsO1xuICAgIGlmICghaXNWMkFnZW50KSB7XG4gICAgICBpZiAobWV0YWRhdGFWMi5kZWNpc2lvbkZyYW1ld29yaykge1xuICAgICAgICBtZXRhZGF0YS5kZWNpc2lvbkZyYW1ld29yayA9IG1ldGFkYXRhVjIuZGVjaXNpb25GcmFtZXdvcms7XG4gICAgICB9XG4gICAgICBpZiAobWV0YWRhdGFWMi5yaXNrVG9sZXJhbmNlKSB7XG4gICAgICAgIG1ldGFkYXRhLnJpc2tUb2xlcmFuY2UgPSBtZXRhZGF0YVYyLnJpc2tUb2xlcmFuY2U7XG4gICAgICB9XG4gICAgICBpZiAobWV0YWRhdGFWMi5sZWFybmluZ0VuYWJsZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBtZXRhZGF0YS5sZWFybmluZ0VuYWJsZWQgPSBtZXRhZGF0YVYyLmxlYXJuaW5nRW5hYmxlZDtcbiAgICAgIH1cbiAgICAgIGlmIChtZXRhZGF0YVYyLm1heENvbmN1cnJlbnRHb2FscyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIG1ldGFkYXRhLm1heENvbmN1cnJlbnRHb2FscyA9IG1ldGFkYXRhVjIubWF4Q29uY3VycmVudEdvYWxzO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBzcGVjaWFsaXphdGlvbnMgaXMgbm90IGEgZGVwcmVjYXRlZCB2MSBmaWVsZCDigJQgYWx3YXlzIHNlcmlhbGl6ZVxuICAgIGlmIChtZXRhZGF0YVYyLnNwZWNpYWxpemF0aW9ucykge1xuICAgICAgbWV0YWRhdGEuc3BlY2lhbGl6YXRpb25zID0gbWV0YWRhdGFWMi5zcGVjaWFsaXphdGlvbnM7XG4gICAgfVxuICAgIC8vIElzc3VlICM3MjI6IFNlcmlhbGl6ZSB0YWdzIGFuZCB0cmlnZ2VycyB0byBZQU1MIGZyb250bWF0dGVyXG4gICAgaWYgKG1ldGFkYXRhVjIudGFncyAmJiBBcnJheS5pc0FycmF5KG1ldGFkYXRhVjIudGFncykgJiYgbWV0YWRhdGFWMi50YWdzLmxlbmd0aCA+IDApIHtcbiAgICAgIG1ldGFkYXRhLnRhZ3MgPSBtZXRhZGF0YVYyLnRhZ3M7XG4gICAgfVxuICAgIGlmIChtZXRhZGF0YVYyLnRyaWdnZXJzKSB7XG4gICAgICBtZXRhZGF0YS50cmlnZ2VycyA9IG1ldGFkYXRhVjIudHJpZ2dlcnM7XG4gICAgfVxuICAgIGlmIChtZXRhZGF0YVYyLnJ1bGVFbmdpbmVDb25maWcgIT09IHVuZGVmaW5lZCkge1xuICAgICAgbWV0YWRhdGEucnVsZUVuZ2luZUNvbmZpZyA9IG1ldGFkYXRhVjIucnVsZUVuZ2luZUNvbmZpZztcbiAgICB9XG5cbiAgICAvLyB2Mi4wIGZvcm1hdDogaW5zdHJ1Y3Rpb25zIGluIFlBTUwgZnJvbnRtYXR0ZXIsIGNvbnRlbnQgYXMgYm9keVxuICAgIGNvbnN0IGluc3RydWN0aW9ucyA9IGFnZW50Lmluc3RydWN0aW9ucyB8fFxuICAgICAgKGFnZW50LmV4dGVuc2lvbnM/Lmluc3RydWN0aW9ucyBhcyBzdHJpbmcgfCB1bmRlZmluZWQpIHx8XG4gICAgICB0aGlzLmJ1aWxkRGVmYXVsdEluc3RydWN0aW9ucyhhZ2VudCk7XG4gICAgaWYgKGluc3RydWN0aW9ucykge1xuICAgICAgbWV0YWRhdGEuaW5zdHJ1Y3Rpb25zID0gaW5zdHJ1Y3Rpb25zO1xuICAgIH1cbiAgICBjb25zdCBib2R5ID0gYWdlbnQuY29udGVudCB8fCB0aGlzLmJ1aWxkRGVmYXVsdEJvZHkoYWdlbnQpO1xuXG4gICAgcmV0dXJuIHRoaXMuc2VyaWFsaXphdGlvblNlcnZpY2UuY3JlYXRlRnJvbnRtYXR0ZXIobWV0YWRhdGEsIGJvZHksIHtcbiAgICAgIG1ldGhvZDogJ21hbnVhbCcsXG4gICAgICBzY2hlbWE6ICdqc29uJywgIC8vIFVzZSBKU09OIHNjaGVtYSB0byBwcmVzZXJ2ZSBib29sZWFucy9udW1iZXJzIGluIHYyIG1ldGFkYXRhXG4gICAgICBjbGVhbk1ldGFkYXRhOiB0cnVlLFxuICAgICAgY2xlYW5pbmdTdHJhdGVneTogJ3JlbW92ZS1ib3RoJywgIC8vIFJlbW92ZSBib3RoIG51bGwgYW5kIHVuZGVmaW5lZFxuICAgICAgc29ydEtleXM6IHRydWVcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYnVpbGREZWZhdWx0SW5zdHJ1Y3Rpb25zKGFnZW50OiBBZ2VudCk6IHN0cmluZyB7XG4gICAgY29uc3QgbmFtZUhlYWRlciA9IGFnZW50Lm1ldGFkYXRhLm5hbWUgPyBgIyAke2FnZW50Lm1ldGFkYXRhLm5hbWV9XFxuXFxuYCA6ICcnO1xuICAgIGNvbnN0IGRlc2NyaXB0aW9uID0gYWdlbnQubWV0YWRhdGEuZGVzY3JpcHRpb24gPz8gJyc7XG4gICAgcmV0dXJuIGAke25hbWVIZWFkZXJ9JHtkZXNjcmlwdGlvbn1gLnRyaW0oKTtcbiAgfVxuXG4gIHByaXZhdGUgYnVpbGREZWZhdWx0Qm9keShhZ2VudDogQWdlbnQpOiBzdHJpbmcge1xuICAgIGNvbnN0IG5hbWUgPSAoYWdlbnQubWV0YWRhdGEubmFtZSA/PyAnJykudHJpbSgpO1xuICAgIGNvbnN0IGRlc2NyaXB0aW9uID0gKGFnZW50Lm1ldGFkYXRhLmRlc2NyaXB0aW9uID8/ICcnKS50cmltKCk7XG4gICAgY29uc3QgbGluZXM6IHN0cmluZ1tdID0gW107XG4gICAgaWYgKG5hbWUpIHtcbiAgICAgIGxpbmVzLnB1c2goYCMgJHtuYW1lfWApO1xuICAgICAgbGluZXMucHVzaCgnJyk7XG4gICAgfVxuICAgIGlmIChkZXNjcmlwdGlvbikge1xuICAgICAgbGluZXMucHVzaChkZXNjcmlwdGlvbik7XG4gICAgfVxuICAgIHJldHVybiBsaW5lcy5qb2luKCdcXG4nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJc3N1ZSAjNzI3OiBWYWxpZGF0ZSBWMiBhZ2VudCBmaWVsZHMgYXQgd3JpdGUgdGltZS5cbiAgICpcbiAgICogTm9ybWFsaXplcyBzbmFrZV9jYXNlIOKGkiBjYW1lbENhc2UgKHNhbWUgYXMgcGFyc2VNZXRhZGF0YSkgYW5kIHRoZW4gdmFsaWRhdGVzXG4gICAqIHN0cnVjdHVyYWwgY29uc3RyYWludHMuIFVubGlrZSBwYXJzZU1ldGFkYXRhICh3aGljaCBzaWxlbnRseSBzdHJpcHMgZm9yXG4gICAqIGJhY2t3YXJkIGNvbXBhdCksIHRoaXMgcmV0dXJucyBlcnJvcnMgc28gdGhlIGNhbGxlciBjYW4gcmVqZWN0IHRoZSBjcmVhdGUuXG4gICAqXG4gICAqIE11dGF0ZXMgdGhlIG1ldGFkYXRhIGluIHBsYWNlIChub3JtYWxpemF0aW9uKSwgcmV0dXJucyB2YWxpZGF0aW9uIGVycm9ycy5cbiAgICovXG4gIHByaXZhdGUgdmFsaWRhdGVWMkZpZWxkc0ZvckNyZWF0ZShtZXRhZGF0YTogUGFydGlhbDxBZ2VudE1ldGFkYXRhVjI+KTogc3RyaW5nW10ge1xuICAgIGNvbnN0IGVycm9yczogc3RyaW5nW10gPSBbXTtcblxuICAgIC8vIC0tLSB0b29scyAtLS1cbiAgICBpZiAobWV0YWRhdGEudG9vbHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKHR5cGVvZiBtZXRhZGF0YS50b29scyAhPT0gJ29iamVjdCcgfHwgQXJyYXkuaXNBcnJheShtZXRhZGF0YS50b29scykgfHwgbWV0YWRhdGEudG9vbHMgPT09IG51bGwpIHtcbiAgICAgICAgZXJyb3JzLnB1c2goJ3Rvb2xzIG11c3QgYmUgYW4gb2JqZWN0IHdpdGggYWxsb3dlZC9kZW5pZWQgYXJyYXlzJyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkobWV0YWRhdGEudG9vbHMuYWxsb3dlZCkpIHtcbiAgICAgICAgICBlcnJvcnMucHVzaCgndG9vbHMuYWxsb3dlZCBpcyByZXF1aXJlZCBhbmQgbXVzdCBiZSBhbiBhcnJheSBvZiBzdHJpbmdzJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1ldGFkYXRhLnRvb2xzLmRlbmllZCAhPT0gdW5kZWZpbmVkICYmICFBcnJheS5pc0FycmF5KG1ldGFkYXRhLnRvb2xzLmRlbmllZCkpIHtcbiAgICAgICAgICBlcnJvcnMucHVzaCgndG9vbHMuZGVuaWVkIG11c3QgYmUgYW4gYXJyYXkgb2Ygc3RyaW5ncycpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gLS0tIHN5c3RlbVByb21wdCAtLS1cbiAgICBpZiAobWV0YWRhdGEuc3lzdGVtUHJvbXB0ICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIG1ldGFkYXRhLnN5c3RlbVByb21wdCAhPT0gJ3N0cmluZycpIHtcbiAgICAgIGVycm9ycy5wdXNoKCdzeXN0ZW1Qcm9tcHQgbXVzdCBiZSBhIHN0cmluZycpO1xuICAgIH1cbiAgICAvLyBzbmFrZV9jYXNlIHZhcmlhbnQgKElzc3VlICM3MjU6IG5vcm1hbGl6ZWQgYXQgZGlzcGF0Y2hlciBsZXZlbCBldmVudHVhbGx5KVxuICAgIGNvbnN0IGFueU1ldGEgPSBtZXRhZGF0YSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICBpZiAoYW55TWV0YS5zeXN0ZW1fcHJvbXB0ICE9PSB1bmRlZmluZWQgJiYgbWV0YWRhdGEuc3lzdGVtUHJvbXB0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmICh0eXBlb2YgYW55TWV0YS5zeXN0ZW1fcHJvbXB0ID09PSAnc3RyaW5nJykge1xuICAgICAgICBtZXRhZGF0YS5zeXN0ZW1Qcm9tcHQgPSBhbnlNZXRhLnN5c3RlbV9wcm9tcHQgYXMgc3RyaW5nO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZXJyb3JzLnB1c2goJ3N5c3RlbV9wcm9tcHQgbXVzdCBiZSBhIHN0cmluZycpO1xuICAgICAgfVxuICAgICAgZGVsZXRlIGFueU1ldGEuc3lzdGVtX3Byb21wdDtcbiAgICB9XG5cbiAgICAvLyAtLS0gYXV0b25vbXkgLS0tXG4gICAgaWYgKG1ldGFkYXRhLmF1dG9ub215ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmICh0eXBlb2YgbWV0YWRhdGEuYXV0b25vbXkgIT09ICdvYmplY3QnIHx8IEFycmF5LmlzQXJyYXkobWV0YWRhdGEuYXV0b25vbXkpIHx8IG1ldGFkYXRhLmF1dG9ub215ID09PSBudWxsKSB7XG4gICAgICAgIGVycm9ycy5wdXNoKCdhdXRvbm9teSBtdXN0IGJlIGFuIG9iamVjdCcpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gSXNzdWUgIzczMDogU2hhcmVkIG5vcm1hbGl6YXRpb25cbiAgICAgICAgY29uc3QgYSA9IG1ldGFkYXRhLmF1dG9ub215IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgICAgICBub3JtYWxpemVBdXRvbm9teUtleXMoYSk7XG5cbiAgICAgICAgLy8gVmFsaWRhdGUgYWZ0ZXIgbm9ybWFsaXphdGlvblxuICAgICAgICBpZiAoYS5yaXNrVG9sZXJhbmNlICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgICFpc09uZU9mKGEucmlza1RvbGVyYW5jZSwgUklTS19UT0xFUkFOQ0VfTEVWRUxTKSkge1xuICAgICAgICAgIGVycm9ycy5wdXNoKGBhdXRvbm9teS5yaXNrVG9sZXJhbmNlIG11c3QgYmUgb25lIG9mOiAke1JJU0tfVE9MRVJBTkNFX0xFVkVMUy5qb2luKCcsICcpfSAoZ290ICcke2Eucmlza1RvbGVyYW5jZX0nKWApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChhLm1heEF1dG9ub21vdXNTdGVwcyAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiBhLm1heEF1dG9ub21vdXNTdGVwcyAhPT0gJ251bWJlcicpIHtcbiAgICAgICAgICBlcnJvcnMucHVzaCgnYXV0b25vbXkubWF4QXV0b25vbW91c1N0ZXBzIG11c3QgYmUgYSBudW1iZXInKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYS5yZXF1aXJlc0FwcHJvdmFsICE9PSB1bmRlZmluZWQgJiYgIUFycmF5LmlzQXJyYXkoYS5yZXF1aXJlc0FwcHJvdmFsKSkge1xuICAgICAgICAgIGVycm9ycy5wdXNoKCdhdXRvbm9teS5yZXF1aXJlc0FwcHJvdmFsIG11c3QgYmUgYW4gYXJyYXkgb2Ygc3RyaW5ncycpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChhLmF1dG9BcHByb3ZlICE9PSB1bmRlZmluZWQgJiYgIUFycmF5LmlzQXJyYXkoYS5hdXRvQXBwcm92ZSkpIHtcbiAgICAgICAgICBlcnJvcnMucHVzaCgnYXV0b25vbXkuYXV0b0FwcHJvdmUgbXVzdCBiZSBhbiBhcnJheSBvZiBzdHJpbmdzJyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyAtLS0gcmVzaWxpZW5jZSAtLS1cbiAgICBpZiAobWV0YWRhdGEucmVzaWxpZW5jZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAodHlwZW9mIG1ldGFkYXRhLnJlc2lsaWVuY2UgIT09ICdvYmplY3QnIHx8IEFycmF5LmlzQXJyYXkobWV0YWRhdGEucmVzaWxpZW5jZSkgfHwgbWV0YWRhdGEucmVzaWxpZW5jZSA9PT0gbnVsbCkge1xuICAgICAgICBlcnJvcnMucHVzaCgncmVzaWxpZW5jZSBtdXN0IGJlIGFuIG9iamVjdCcpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gSXNzdWUgIzczMDogU2hhcmVkIG5vcm1hbGl6YXRpb25cbiAgICAgICAgY29uc3QgciA9IG1ldGFkYXRhLnJlc2lsaWVuY2UgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgICAgIG5vcm1hbGl6ZVJlc2lsaWVuY2VLZXlzKHIpO1xuXG4gICAgICAgIC8vIFZhbGlkYXRlIGFmdGVyIG5vcm1hbGl6YXRpb25cbiAgICAgICAgaWYgKHIub25TdGVwTGltaXRSZWFjaGVkICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgICFpc09uZU9mKHIub25TdGVwTGltaXRSZWFjaGVkLCBTVEVQX0xJTUlUX0FDVElPTlMpKSB7XG4gICAgICAgICAgZXJyb3JzLnB1c2goYHJlc2lsaWVuY2Uub25TdGVwTGltaXRSZWFjaGVkIG11c3QgYmUgb25lIG9mOiAke1NURVBfTElNSVRfQUNUSU9OUy5qb2luKCcsICcpfSAoZ290ICcke3Iub25TdGVwTGltaXRSZWFjaGVkfScpYCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHIub25FeGVjdXRpb25GYWlsdXJlICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgICFpc09uZU9mKHIub25FeGVjdXRpb25GYWlsdXJlLCBFWEVDVVRJT05fRkFJTFVSRV9BQ1RJT05TKSkge1xuICAgICAgICAgIGVycm9ycy5wdXNoKGByZXNpbGllbmNlLm9uRXhlY3V0aW9uRmFpbHVyZSBtdXN0IGJlIG9uZSBvZjogJHtFWEVDVVRJT05fRkFJTFVSRV9BQ1RJT05TLmpvaW4oJywgJyl9IChnb3QgJyR7ci5vbkV4ZWN1dGlvbkZhaWx1cmV9JylgKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoci5tYXhSZXRyaWVzICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIHIubWF4UmV0cmllcyAhPT0gJ251bWJlcicpIHtcbiAgICAgICAgICBlcnJvcnMucHVzaCgncmVzaWxpZW5jZS5tYXhSZXRyaWVzIG11c3QgYmUgYSBudW1iZXInKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoci5tYXhDb250aW51YXRpb25zICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIHIubWF4Q29udGludWF0aW9ucyAhPT0gJ251bWJlcicpIHtcbiAgICAgICAgICBlcnJvcnMucHVzaCgncmVzaWxpZW5jZS5tYXhDb250aW51YXRpb25zIG11c3QgYmUgYSBudW1iZXInKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoci5yZXRyeUJhY2tvZmYgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgIWlzT25lT2Yoci5yZXRyeUJhY2tvZmYsIEJBQ0tPRkZfU1RSQVRFR0lFUykpIHtcbiAgICAgICAgICBlcnJvcnMucHVzaChgcmVzaWxpZW5jZS5yZXRyeUJhY2tvZmYgbXVzdCBiZSBvbmUgb2Y6ICR7QkFDS09GRl9TVFJBVEVHSUVTLmpvaW4oJywgJyl9IChnb3QgJyR7ci5yZXRyeUJhY2tvZmZ9JylgKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoci5wcmVzZXJ2ZVN0YXRlICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIHIucHJlc2VydmVTdGF0ZSAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgICAgZXJyb3JzLnB1c2goJ3Jlc2lsaWVuY2UucHJlc2VydmVTdGF0ZSBtdXN0IGJlIGEgYm9vbGVhbicpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gLS0tIGFjdGl2YXRlcyAtLS1cbiAgICBpZiAobWV0YWRhdGEuYWN0aXZhdGVzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmICh0eXBlb2YgbWV0YWRhdGEuYWN0aXZhdGVzICE9PSAnb2JqZWN0JyB8fCBBcnJheS5pc0FycmF5KG1ldGFkYXRhLmFjdGl2YXRlcykgfHwgbWV0YWRhdGEuYWN0aXZhdGVzID09PSBudWxsKSB7XG4gICAgICAgIGVycm9ycy5wdXNoKCdhY3RpdmF0ZXMgbXVzdCBiZSBhbiBvYmplY3Qgd2l0aCBza2lsbHMvcGVyc29uYXMvbWVtb3JpZXMvdGVtcGxhdGVzL2Vuc2VtYmxlcyBhcnJheXMnKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZXJyb3JzO1xuICB9XG5cbiAgLyoqXG4gICAqIE5vcm1hbGl6ZSBnb2FsIGlucHV0IHRvIFYyIGZvcm1hdC5cbiAgICogTExNcyBtYXkgcGFzcyBnb2FsIGFzIGEgc2ltcGxlIHN0cmluZyBvciBhcyBhIFYyIGNvbmZpZyBvYmplY3QuXG4gICAqIFRoaXMgZW5zdXJlcyB3ZSBhbHdheXMgaGF2ZSBhIHByb3BlciBWMiBzdHJ1Y3R1cmUgYmVmb3JlIHZhbGlkYXRpb24uXG4gICAqXG4gICAqIEBwYXJhbSBnb2FsIC0gRWl0aGVyIGEgc3RyaW5nIGdvYWwgb3IgYSBWMiBnb2FsIGNvbmZpZyBvYmplY3RcbiAgICogQHJldHVybnMgTm9ybWFsaXplZCBWMiBnb2FsIGNvbmZpZywgb3IgdW5kZWZpbmVkIGlmIG5vIGdvYWwgcHJvdmlkZWRcbiAgICovXG4gIHByaXZhdGUgbm9ybWFsaXplR29hbElucHV0KGdvYWw6IHN0cmluZyB8IFBhcnRpYWw8QWdlbnRHb2FsQ29uZmlnPiB8IHVuZGVmaW5lZCk6IEFnZW50R29hbENvbmZpZyB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKCFnb2FsKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIC8vIElmIGl0J3MgYSBzdHJpbmcsIGNvbnZlcnQgdG8gVjIgZm9ybWF0XG4gICAgaWYgKHR5cGVvZiBnb2FsID09PSAnc3RyaW5nJykge1xuICAgICAgbG9nZ2VyLmRlYnVnKCdDb252ZXJ0aW5nIHN0cmluZyBnb2FsIHRvIFYyIGZvcm1hdCcsIHsgZ29hbCB9KTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHRlbXBsYXRlOiBnb2FsLFxuICAgICAgICBwYXJhbWV0ZXJzOiBbXVxuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBJZiBpdCdzIGFscmVhZHkgYW4gb2JqZWN0IHdpdGggdGVtcGxhdGUsIG5vcm1hbGl6ZSBwYXJhbWV0ZXJzXG4gICAgaWYgKHR5cGVvZiBnb2FsID09PSAnb2JqZWN0JyAmJiAndGVtcGxhdGUnIGluIGdvYWwgJiYgdHlwZW9mIGdvYWwudGVtcGxhdGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAvLyBJc3N1ZSAjNzI1OiBOb3JtYWxpemUgc25ha2VfY2FzZSBnb2FsIHN1Yi1maWVsZHMgYmVmb3JlIGFjY2Vzc2luZ1xuICAgICAgbm9ybWFsaXplR29hbEtleXMoZ29hbCBhcyB1bmtub3duIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KTtcblxuICAgICAgY29uc3QgdmFsaWRQYXJhbVR5cGVzID0gWydzdHJpbmcnLCAnbnVtYmVyJywgJ2Jvb2xlYW4nXSBhcyBjb25zdDtcbiAgICAgIGNvbnN0IHZhbGlkYXRlZFBhcmFtczogQWdlbnRHb2FsUGFyYW1ldGVyW10gPSAoZ29hbC5wYXJhbWV0ZXJzIHx8IFtdKS5tYXAoKHAsIGluZGV4KSA9PiB7XG4gICAgICAgIGNvbnN0IG5hbWUgPSB0eXBlb2YgcC5uYW1lID09PSAnc3RyaW5nJyA/IHAubmFtZSA6IGBwYXJhbV8ke2luZGV4fWA7XG4gICAgICAgIGNvbnN0IHR5cGUgPSB2YWxpZFBhcmFtVHlwZXMuaW5jbHVkZXMocC50eXBlIGFzIHR5cGVvZiB2YWxpZFBhcmFtVHlwZXNbbnVtYmVyXSlcbiAgICAgICAgICA/IHAudHlwZSBhcyAnc3RyaW5nJyB8ICdudW1iZXInIHwgJ2Jvb2xlYW4nXG4gICAgICAgICAgOiAnc3RyaW5nJztcbiAgICAgICAgY29uc3QgcmVxdWlyZWQgPSB0eXBlb2YgcC5yZXF1aXJlZCA9PT0gJ2Jvb2xlYW4nID8gcC5yZXF1aXJlZCA6IGZhbHNlO1xuXG4gICAgICAgIGNvbnN0IHZhbGlkYXRlZDogQWdlbnRHb2FsUGFyYW1ldGVyID0geyBuYW1lLCB0eXBlLCByZXF1aXJlZCB9O1xuICAgICAgICBpZiAodHlwZW9mIHAuZGVzY3JpcHRpb24gPT09ICdzdHJpbmcnICYmIHAuZGVzY3JpcHRpb24ubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHZhbGlkYXRlZC5kZXNjcmlwdGlvbiA9IHNhbml0aXplSW5wdXQocC5kZXNjcmlwdGlvbiwgNTAwKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocC5kZWZhdWx0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAvLyBTYW5pdGl6ZSBzdHJpbmcgZGVmYXVsdHMgdG8gcHJldmVudCBpbmplY3Rpb24gd2hlbiB1c2VkIGluIGdvYWwgcmVuZGVyaW5nXG4gICAgICAgICAgaWYgKHR5cGVvZiBwLmRlZmF1bHQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICB2YWxpZGF0ZWQuZGVmYXVsdCA9IHNhbml0aXplSW5wdXQocC5kZWZhdWx0LCA1MDApO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB2YWxpZGF0ZWQuZGVmYXVsdCA9IHAuZGVmYXVsdDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHZhbGlkYXRlZDtcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICB0ZW1wbGF0ZTogZ29hbC50ZW1wbGF0ZSxcbiAgICAgICAgcGFyYW1ldGVyczogdmFsaWRhdGVkUGFyYW1zLFxuICAgICAgICBzdWNjZXNzQ3JpdGVyaWE6IGdvYWwuc3VjY2Vzc0NyaXRlcmlhXG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vIE9iamVjdCB3aXRob3V0IHRlbXBsYXRlIC0gY2Fubm90IGNvbnZlcnRcbiAgICBsb2dnZXIud2FybignR29hbCBvYmplY3QgbWlzc2luZyB0ZW1wbGF0ZSBmaWVsZCwgY2Fubm90IGNvbnZlcnQgdG8gVjInLCB7IGdvYWwgfSk7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIHByaXZhdGUgcGFyc2VBZ2VudEZpbGUoY29udGVudDogc3RyaW5nKTogUGFyc2VkQWdlbnRGaWxlIHtcbiAgICAvLyBVc2UgU2VyaWFsaXphdGlvblNlcnZpY2UgZm9yIGZyb250bWF0dGVyIHBhcnNpbmdcbiAgICBjb25zdCByZXN1bHQgPSB0aGlzLnNlcmlhbGl6YXRpb25TZXJ2aWNlLnBhcnNlRnJvbnRtYXR0ZXIoY29udGVudCwge1xuICAgICAgbWF4WWFtbFNpemU6IE1BWF9ZQU1MX1NJWkUsXG4gICAgICB2YWxpZGF0ZUNvbnRlbnQ6IGZhbHNlLFxuICAgICAgc291cmNlOiAnQWdlbnRNYW5hZ2VyLnBhcnNlQWdlbnRGaWxlJ1xuICAgIH0pO1xuXG4gICAgLy8gU2VyaWFsaXphdGlvblNlcnZpY2UgZW5zdXJlcyBmcm9udG1hdHRlciBleGlzdHMsIG9yIHRocm93cyBlcnJvclxuICAgIHJldHVybiB7XG4gICAgICBtZXRhZGF0YTogcmVzdWx0LmRhdGEgYXMgQWdlbnRNZXRhZGF0YSxcbiAgICAgIGNvbnRlbnQ6IHJlc3VsdC5jb250ZW50LnRyaW0oKVxuICAgIH07XG4gIH1cblxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGZpbGVuYW1lIGZvciBhbiBhZ2VudCBlbGVtZW50LlxuICAgKlxuICAgKiBVc2VzIGluaGVyaXRlZCBub3JtYWxpemVGaWxlbmFtZSgpIGZyb20gQmFzZUVsZW1lbnRNYW5hZ2VyIGZvciBjb25zaXN0ZW50XG4gICAqIGZpbGVuYW1lIGZvcm1hdHRpbmcgYWNyb3NzIGFsbCBlbGVtZW50IG1hbmFnZXJzLlxuICAgKlxuICAgKiBFeGFtcGxlczpcbiAgICogICBcIkNyZWF0aXZlIFdyaXRlclwiIC0+IFwiY3JlYXRpdmUtd3JpdGVyLm1kXCJcbiAgICogICBcIkNSVURWLUFnZW50LURlbHRhXCIgLT4gXCJjcnVkdi1hZ2VudC1kZWx0YS5tZFwiXG4gICAqICAgXCJNdWx0aV9Hb2FsX0FnZW50XCIgLT4gXCJtdWx0aS1nb2FsLWFnZW50Lm1kXCJcbiAgICogICBcIkNhbWVsQ2FzZU5hbWVcIiAtPiBcImNhbWVsLWNhc2UtbmFtZS5tZFwiXG4gICAqL1xuICBwcml2YXRlIGdldEZpbGVuYW1lKG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgLy8gVXNlIGluaGVyaXRlZCBub3JtYWxpemVGaWxlbmFtZSgpIGZvciB1bmlmaWVkIG5vcm1hbGl6YXRpb25cbiAgICByZXR1cm4gdGhpcy5nZXRFbGVtZW50RmlsZW5hbWUobmFtZSk7XG4gIH1cblxuICBwcml2YXRlIHZhbGlkYXRlRWxlbWVudE5hbWUobmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIC9eW2EtekEtWjAtOV8tXSskLy50ZXN0KG5hbWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBjdXJyZW50IHVzZXIgZm9yIGF0dHJpYnV0aW9uXG4gICAqIFJFRkFDVE9SRUQ6IERlbGVnYXRlcyB0byBNZXRhZGF0YVNlcnZpY2UgZm9yIGNvbnNpc3RlbnQgdXNlciBhdHRyaWJ1dGlvbiBhY3Jvc3MgYWxsIG1hbmFnZXJzXG4gICAqL1xuICBwcml2YXRlIGdldEN1cnJlbnRVc2VyRm9yQXR0cmlidXRpb24oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5tZXRhZGF0YVNlcnZpY2UuZ2V0Q3VycmVudFVzZXIoKTtcbiAgfVxuXG4gIHByaXZhdGUgcHJlcGFyZVN0YXRlRm9yU2VyaWFsaXphdGlvbihzdGF0ZTogQWdlbnRTdGF0ZSk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgICByZXR1cm4ge1xuICAgICAgLi4uc3RhdGUsXG4gICAgICBsYXN0QWN0aXZlOiBzdGF0ZS5sYXN0QWN0aXZlIGluc3RhbmNlb2YgRGF0ZSA/IHN0YXRlLmxhc3RBY3RpdmUudG9JU09TdHJpbmcoKSA6IHN0YXRlLmxhc3RBY3RpdmUsXG4gICAgICBzZXNzaW9uQ291bnQ6IFN0cmluZyhzdGF0ZS5zZXNzaW9uQ291bnQgPz8gMCksXG4gICAgICBzdGF0ZVZlcnNpb246IHN0YXRlLnN0YXRlVmVyc2lvbiAhPT0gdW5kZWZpbmVkID8gU3RyaW5nKHN0YXRlLnN0YXRlVmVyc2lvbikgOiAnMScsICAvLyBJbmNsdWRlIHZlcnNpb24gZm9yIG9wdGltaXN0aWMgbG9ja2luZ1xuICAgICAgZ29hbHM6IHN0YXRlLmdvYWxzLm1hcChnb2FsID0+ICh7XG4gICAgICAgIC4uLmdvYWwsXG4gICAgICAgIGNyZWF0ZWRBdDogZ29hbC5jcmVhdGVkQXQgaW5zdGFuY2VvZiBEYXRlID8gZ29hbC5jcmVhdGVkQXQudG9JU09TdHJpbmcoKSA6IGdvYWwuY3JlYXRlZEF0LFxuICAgICAgICB1cGRhdGVkQXQ6IGdvYWwudXBkYXRlZEF0IGluc3RhbmNlb2YgRGF0ZSA/IGdvYWwudXBkYXRlZEF0LnRvSVNPU3RyaW5nKCkgOiBnb2FsLnVwZGF0ZWRBdCxcbiAgICAgICAgY29tcGxldGVkQXQ6IGdvYWwuY29tcGxldGVkQXQgaW5zdGFuY2VvZiBEYXRlID8gZ29hbC5jb21wbGV0ZWRBdC50b0lTT1N0cmluZygpIDogZ29hbC5jb21wbGV0ZWRBdCxcbiAgICAgICAgaW1wb3J0YW5jZTogZ29hbC5pbXBvcnRhbmNlICE9PSB1bmRlZmluZWQgPyBTdHJpbmcoZ29hbC5pbXBvcnRhbmNlKSA6IHVuZGVmaW5lZCxcbiAgICAgICAgdXJnZW5jeTogZ29hbC51cmdlbmN5ICE9PSB1bmRlZmluZWQgPyBTdHJpbmcoZ29hbC51cmdlbmN5KSA6IHVuZGVmaW5lZCxcbiAgICAgICAgZXN0aW1hdGVkRWZmb3J0OiBnb2FsLmVzdGltYXRlZEVmZm9ydCAhPT0gdW5kZWZpbmVkID8gU3RyaW5nKGdvYWwuZXN0aW1hdGVkRWZmb3J0KSA6IHVuZGVmaW5lZFxuICAgICAgfSkpLFxuICAgICAgZGVjaXNpb25zOiBzdGF0ZS5kZWNpc2lvbnMubWFwKGRlY2lzaW9uID0+ICh7XG4gICAgICAgIC4uLmRlY2lzaW9uLFxuICAgICAgICB0aW1lc3RhbXA6IGRlY2lzaW9uLnRpbWVzdGFtcCBpbnN0YW5jZW9mIERhdGUgPyBkZWNpc2lvbi50aW1lc3RhbXAudG9JU09TdHJpbmcoKSA6IGRlY2lzaW9uLnRpbWVzdGFtcCxcbiAgICAgICAgY29uZmlkZW5jZTogZGVjaXNpb24uY29uZmlkZW5jZSAhPT0gdW5kZWZpbmVkID8gU3RyaW5nKGRlY2lzaW9uLmNvbmZpZGVuY2UpIDogdW5kZWZpbmVkXG4gICAgICB9KSlcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBub3JtYWxpemVMb2FkZWRTdGF0ZShzdGF0ZTogQWdlbnRTdGF0ZSk6IHZvaWQge1xuICAgIC8vIEZJWCAoSXNzdWUgIzEyMyk6IERlZmF1bHQgbWlzc2luZyBhcnJheXMgdG8gcHJldmVudCBUeXBlRXJyb3JcbiAgICAvLyBJZiBzdGF0ZSBmaWxlIGlzIG1pc3NpbmcgZ29hbHMvZGVjaXNpb25zL2NvbnRleHQsIGRlZmF1bHQgdG8gZW1wdHkgYXJyYXlzL29iamVjdHNcbiAgICBpZiAoIXN0YXRlLmdvYWxzKSB7XG4gICAgICBzdGF0ZS5nb2FscyA9IFtdO1xuICAgIH1cbiAgICBpZiAoIXN0YXRlLmRlY2lzaW9ucykge1xuICAgICAgc3RhdGUuZGVjaXNpb25zID0gW107XG4gICAgfVxuICAgIGlmICghc3RhdGUuY29udGV4dCkge1xuICAgICAgc3RhdGUuY29udGV4dCA9IHt9O1xuICAgIH1cblxuICAgIGlmIChzdGF0ZS5zZXNzaW9uQ291bnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgc3RhdGUuc2Vzc2lvbkNvdW50ID0gTnVtYmVyLnBhcnNlSW50KFN0cmluZyhzdGF0ZS5zZXNzaW9uQ291bnQpLCAxMCk7XG4gICAgfVxuXG4gICAgLy8gUGFyc2Ugc3RhdGVWZXJzaW9uIGZvciBvcHRpbWlzdGljIGxvY2tpbmcgKElzc3VlICMyNClcbiAgICBpZiAoc3RhdGUuc3RhdGVWZXJzaW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHN0YXRlLnN0YXRlVmVyc2lvbiA9IE51bWJlci5wYXJzZUludChTdHJpbmcoc3RhdGUuc3RhdGVWZXJzaW9uKSwgMTApO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBEZWZhdWx0IHRvIHZlcnNpb24gMSBpZiBub3QgcHJlc2VudCAoZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkpXG4gICAgICBzdGF0ZS5zdGF0ZVZlcnNpb24gPSAxO1xuICAgIH1cblxuICAgIGlmIChzdGF0ZS5sYXN0QWN0aXZlKSB7XG4gICAgICBzdGF0ZS5sYXN0QWN0aXZlID0gbmV3IERhdGUoc3RhdGUubGFzdEFjdGl2ZSk7XG4gICAgfVxuXG4gICAgaWYgKHN0YXRlLmdvYWxzKSB7XG4gICAgICBzdGF0ZS5nb2Fscy5mb3JFYWNoKGdvYWwgPT4ge1xuICAgICAgICBpZiAoZ29hbC5pbXBvcnRhbmNlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBnb2FsLmltcG9ydGFuY2UgPSBOdW1iZXIucGFyc2VJbnQoU3RyaW5nKGdvYWwuaW1wb3J0YW5jZSksIDEwKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZ29hbC51cmdlbmN5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBnb2FsLnVyZ2VuY3kgPSBOdW1iZXIucGFyc2VJbnQoU3RyaW5nKGdvYWwudXJnZW5jeSksIDEwKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZ29hbC5lc3RpbWF0ZWRFZmZvcnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGdvYWwuZXN0aW1hdGVkRWZmb3J0ID0gTnVtYmVyLnBhcnNlRmxvYXQoU3RyaW5nKGdvYWwuZXN0aW1hdGVkRWZmb3J0KSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGdvYWwuY3JlYXRlZEF0KSB7XG4gICAgICAgICAgZ29hbC5jcmVhdGVkQXQgPSBuZXcgRGF0ZShnb2FsLmNyZWF0ZWRBdCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGdvYWwudXBkYXRlZEF0KSB7XG4gICAgICAgICAgZ29hbC51cGRhdGVkQXQgPSBuZXcgRGF0ZShnb2FsLnVwZGF0ZWRBdCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGdvYWwuY29tcGxldGVkQXQpIHtcbiAgICAgICAgICBnb2FsLmNvbXBsZXRlZEF0ID0gbmV3IERhdGUoZ29hbC5jb21wbGV0ZWRBdCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChzdGF0ZS5kZWNpc2lvbnMpIHtcbiAgICAgIHN0YXRlLmRlY2lzaW9ucy5mb3JFYWNoKGRlY2lzaW9uID0+IHtcbiAgICAgICAgaWYgKGRlY2lzaW9uLmNvbmZpZGVuY2UgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGRlY2lzaW9uLmNvbmZpZGVuY2UgPSBOdW1iZXIucGFyc2VGbG9hdChTdHJpbmcoZGVjaXNpb24uY29uZmlkZW5jZSkpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkZWNpc2lvbi50aW1lc3RhbXApIHtcbiAgICAgICAgICBkZWNpc2lvbi50aW1lc3RhbXAgPSBuZXcgRGF0ZShkZWNpc2lvbi50aW1lc3RhbXApO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVjb3JkIGEgc3RlcCBpbiBhZ2VudCBleGVjdXRpb25cbiAgICogV3JhcHMgQWdlbnQucmVjb3JkRGVjaXNpb24oKSBmb3IgdGhlIE1DUCB0b29sIGludGVyZmFjZVxuICAgKlxuICAgKiBAc2luY2UgdjIuMC4wIC0gQWdlbnRpYyBMb29wIFJlZGVzaWduXG4gICAqL1xuICBhc3luYyByZWNvcmRBZ2VudFN0ZXAocGFyYW1zOiB7XG4gICAgYWdlbnROYW1lOiBzdHJpbmc7XG4gICAgc3RlcERlc2NyaXB0aW9uOiBzdHJpbmc7XG4gICAgb3V0Y29tZTogXCJzdWNjZXNzXCIgfCBcImZhaWx1cmVcIiB8IFwicGFydGlhbFwiO1xuICAgIC8qKiBPcHRpb25hbCBmaW5kaW5ncyBvciByZXN1bHRzIGZyb20gdGhpcyBzdGVwICovXG4gICAgZmluZGluZ3M/OiBzdHJpbmc7XG4gICAgY29uZmlkZW5jZT86IG51bWJlcjtcbiAgICAvKiogT3B0aW9uYWwgaGludCBhYm91dCB3aGF0IHRoZSBMTE0gcGxhbnMgdG8gZG8gbmV4dCAoZm9yIHByb2FjdGl2ZSByaXNrIGV2YWx1YXRpb24pICovXG4gICAgbmV4dEFjdGlvbkhpbnQ/OiBzdHJpbmc7XG4gICAgLyoqIE9wdGlvbmFsIHJpc2sgc2NvcmUgZm9yIHRoZSBjdXJyZW50IHN0ZXAgKDAtMTAwKSAqL1xuICAgIHJpc2tTY29yZT86IG51bWJlcjtcbiAgICAvKiogUnVudGltZSBvdmVycmlkZSBmb3IgbWF4QXV0b25vbW91c1N0ZXBzIChJc3N1ZSAjNDQ3KSAqL1xuICAgIG1heFN0ZXBzT3ZlcnJpZGU/OiBudW1iZXI7XG4gIH0pOiBQcm9taXNlPHtcbiAgICBzdWNjZXNzOiBib29sZWFuO1xuICAgIG1lc3NhZ2U6IHN0cmluZztcbiAgICBkZWNpc2lvbjoge1xuICAgICAgaWQ6IHN0cmluZztcbiAgICAgIGdvYWxJZDogc3RyaW5nO1xuICAgICAgdGltZXN0YW1wOiBzdHJpbmc7XG4gICAgICBkZWNpc2lvbjogc3RyaW5nO1xuICAgICAgcmVhc29uaW5nOiBzdHJpbmc7XG4gICAgICBmcmFtZXdvcms6IHN0cmluZztcbiAgICAgIGNvbmZpZGVuY2U6IG51bWJlcjtcbiAgICAgIG91dGNvbWU6IFwic3VjY2Vzc1wiIHwgXCJmYWlsdXJlXCIgfCBcInBhcnRpYWxcIjtcbiAgICB9O1xuICAgIHN0YXRlOiB7XG4gICAgICBnb2FsQ291bnQ6IG51bWJlcjtcbiAgICAgIGRlY2lzaW9uQ291bnQ6IG51bWJlcjtcbiAgICAgIGxhc3RBY3RpdmU6IHN0cmluZztcbiAgICAgIHN0YXRlVmVyc2lvbjogbnVtYmVyO1xuICAgIH07XG4gICAgLyoqIEF1dG9ub215IGRpcmVjdGl2ZSBpbmRpY2F0aW5nIHdoZXRoZXIgdG8gY29udGludWUgb3IgcGF1c2UgKi9cbiAgICBhdXRvbm9teTogQXV0b25vbXlEaXJlY3RpdmU7XG4gIH0+IHtcbiAgICAvLyAxLiBMb2FkIGFnZW50IGJ5IG5hbWVcbiAgICBjb25zdCBhZ2VudCA9IGF3YWl0IHRoaXMucmVhZChwYXJhbXMuYWdlbnROYW1lKTtcbiAgICBpZiAoIWFnZW50KSB7XG4gICAgICAvLyBGSVg6IElzc3VlICMyNzUgLSBUaHJvdyBFbGVtZW50Tm90Rm91bmRFcnJvciBmb3IgY29uc2lzdGVudCBlcnJvciBoYW5kbGluZ1xuICAgICAgdGhyb3cgbmV3IEVsZW1lbnROb3RGb3VuZEVycm9yKCdBZ2VudCcsIHBhcmFtcy5hZ2VudE5hbWUpO1xuICAgIH1cblxuICAgIC8vIDIuIEdldCBhZ2VudCBzdGF0ZSB0byBmaW5kIGFjdGl2ZSBnb2Fsc1xuICAgIGNvbnN0IHN0YXRlID0gYWdlbnQuZ2V0U3RhdGUoKTtcbiAgICBjb25zdCBhY3RpdmVHb2FsID0gc3RhdGUuZ29hbHMuZmluZChnID0+IGcuc3RhdHVzID09PSAnaW5fcHJvZ3Jlc3MnKTtcblxuICAgIGlmICghYWN0aXZlR29hbCkge1xuICAgICAgY29uc3QgZ29hbFN0YXR1c2VzID0gc3RhdGUuZ29hbHMubWFwKGcgPT4gYCR7Zy5pZH06ICR7Zy5zdGF0dXN9YCkuam9pbignLCAnKTtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYE5vIGFjdGl2ZSBnb2FsIGZvdW5kIGZvciBhZ2VudCAnJHtwYXJhbXMuYWdlbnROYW1lfScuIGAgK1xuICAgICAgICBgQXZhaWxhYmxlIGdvYWxzOiAke2dvYWxTdGF0dXNlcyB8fCAnbm9uZSd9LiBgICtcbiAgICAgICAgYFVzZSBleGVjdXRlX2FnZW50IHRvIHN0YXJ0IGEgbmV3IGdvYWwgZmlyc3QuYFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyAzLiBDYWxsIEFnZW50LnJlY29yZERlY2lzaW9uKCkgdG8gcGVyc2lzdCB0aGUgc3RlcFxuICAgIGNvbnN0IGRlY2lzaW9uID0gYWdlbnQucmVjb3JkRGVjaXNpb24oe1xuICAgICAgZ29hbElkOiBhY3RpdmVHb2FsLmlkLFxuICAgICAgZGVjaXNpb246IHBhcmFtcy5zdGVwRGVzY3JpcHRpb24sXG4gICAgICByZWFzb25pbmc6IHBhcmFtcy5maW5kaW5ncyA/PyAnJyxcbiAgICAgIGNvbmZpZGVuY2U6IHBhcmFtcy5jb25maWRlbmNlID8/IDAuOCxcbiAgICAgIG91dGNvbWU6IHBhcmFtcy5vdXRjb21lXG4gICAgfSk7XG5cbiAgICAvLyA0LiBTYXZlIGFnZW50IHN0YXRlXG4gICAgY29uc3Qgc2FuaXRpemVkTmFtZSA9IHNhbml0aXplSW5wdXQocGFyYW1zLmFnZW50TmFtZSwgMTAwKTtcbiAgICBhd2FpdCB0aGlzLnNhdmUoYWdlbnQsIHRoaXMuZ2V0RmlsZW5hbWUoc2FuaXRpemVkTmFtZSkpO1xuXG4gICAgLy8gNS4gR2V0IHVwZGF0ZWQgc3RhdGUgZm9yIHN0ZXAgY291bnQgYW5kIGF1dG9ub215IGV2YWx1YXRpb25cbiAgICBjb25zdCB1cGRhdGVkU3RhdGUgPSBhZ2VudC5nZXRTdGF0ZSgpO1xuXG4gICAgLy8gNi4gQ2FsY3VsYXRlIHN0ZXAgY291bnQgZm9yIHRoaXMgZ29hbFxuICAgIC8vIHN0ZXBDb3VudCA9IG51bWJlciBvZiBzdGVwcyBjb21wbGV0ZWQgKGluY2x1ZGluZyB0aGUgb25lIGp1c3QgcmVjb3JkZWQpXG4gICAgLy8gVGhlIGV2YWx1YXRvciB1c2VzIHRoaXMgdG8gY2hlY2sgaWYgd2UndmUgaGl0IG1heEF1dG9ub21vdXNTdGVwc1xuICAgIC8vIGFuZCB0byBjb21wdXRlIHN0ZXBzUmVtYWluaW5nIGZvciB0aGUgYXV0b25vbXkgZGlyZWN0aXZlLlxuICAgIGNvbnN0IGdvYWxEZWNpc2lvbnMgPSB1cGRhdGVkU3RhdGUuZGVjaXNpb25zLmZpbHRlcihkID0+IGQuZ29hbElkID09PSBhY3RpdmVHb2FsLmlkKTtcbiAgICBjb25zdCBzdGVwQ291bnQgPSBnb2FsRGVjaXNpb25zLmxlbmd0aDtcblxuICAgIC8vIDcuIEdldCBhZ2VudCBtZXRhZGF0YSBmb3IgYXV0b25vbXkgY29uZmlnXG4gICAgY29uc3QgYWdlbnRNZXRhZGF0YSA9IGFnZW50Lm1ldGFkYXRhIGFzIEFnZW50TWV0YWRhdGFWMjtcblxuICAgIC8vIDguIEV2YWx1YXRlIGF1dG9ub215IC0gc2hvdWxkIHdlIGNvbnRpbnVlIG9yIHBhdXNlP1xuICAgIC8vIElzc3VlICM0MDI6IFBhc3MgREktaW5qZWN0ZWQgRGFuZ2VyWm9uZUVuZm9yY2VyIHZpYSBjb250ZXh0XG4gICAgLy8gSXNzdWUgIzQ0NzogQXBwbHkgcnVudGltZSBtYXhBdXRvbm9tb3VzU3RlcHMgb3ZlcnJpZGUgaWYgcHJvdmlkZWRcbiAgICBjb25zdCBhdXRvbm9teUNvbmZpZyA9IHBhcmFtcy5tYXhTdGVwc092ZXJyaWRlICE9PSB1bmRlZmluZWRcbiAgICAgID8geyAuLi5hZ2VudE1ldGFkYXRhLmF1dG9ub215LCBtYXhBdXRvbm9tb3VzU3RlcHM6IHBhcmFtcy5tYXhTdGVwc092ZXJyaWRlIH1cbiAgICAgIDogYWdlbnRNZXRhZGF0YS5hdXRvbm9teTtcblxuICAgIGNvbnN0IGF1dG9ub215RGlyZWN0aXZlID0gZXZhbHVhdGVBdXRvbm9teSh7XG4gICAgICBhZ2VudE5hbWU6IHBhcmFtcy5hZ2VudE5hbWUsXG4gICAgICBhdXRvbm9teUNvbmZpZyxcbiAgICAgIHN0ZXBDb3VudCxcbiAgICAgIGN1cnJlbnRTdGVwRGVzY3JpcHRpb246IHBhcmFtcy5zdGVwRGVzY3JpcHRpb24sXG4gICAgICBjdXJyZW50U3RlcE91dGNvbWU6IHBhcmFtcy5vdXRjb21lLFxuICAgICAgbmV4dEFjdGlvbkhpbnQ6IHBhcmFtcy5uZXh0QWN0aW9uSGludCxcbiAgICAgIHJpc2tTY29yZTogcGFyYW1zLnJpc2tTY29yZSxcbiAgICAgIGRhbmdlclpvbmVFbmZvcmNlcjogQWdlbnRNYW5hZ2VyLmRhbmdlclpvbmVFbmZvcmNlclJlc29sdmVyPy4oKSxcbiAgICAgIHZlcmlmaWNhdGlvblN0b3JlOiBBZ2VudE1hbmFnZXIudmVyaWZpY2F0aW9uU3RvcmVSZXNvbHZlcj8uKCksXG4gICAgICBnb2FsRGVzY3JpcHRpb246IGFjdGl2ZUdvYWwuZGVzY3JpcHRpb24sXG4gICAgICBnb2FsSWQ6IGFjdGl2ZUdvYWwuaWQsXG4gICAgfSk7XG5cbiAgICAvLyA5LiBSZXR1cm4gZGVjaXNpb24sIHN0YXRlIHN1bW1hcnksIGFuZCBhdXRvbm9teSBkaXJlY3RpdmVcbiAgICByZXR1cm4ge1xuICAgICAgc3VjY2VzczogdHJ1ZSxcbiAgICAgIG1lc3NhZ2U6IGBTdGVwIHJlY29yZGVkIGZvciBhZ2VudCAnJHtwYXJhbXMuYWdlbnROYW1lfSdgLFxuICAgICAgZGVjaXNpb246IHtcbiAgICAgICAgaWQ6IGRlY2lzaW9uLmlkLFxuICAgICAgICBnb2FsSWQ6IGRlY2lzaW9uLmdvYWxJZCxcbiAgICAgICAgdGltZXN0YW1wOiBkZWNpc2lvbi50aW1lc3RhbXAudG9JU09TdHJpbmcoKSxcbiAgICAgICAgZGVjaXNpb246IGRlY2lzaW9uLmRlY2lzaW9uLFxuICAgICAgICByZWFzb25pbmc6IGRlY2lzaW9uLnJlYXNvbmluZyxcbiAgICAgICAgZnJhbWV3b3JrOiBkZWNpc2lvbi5mcmFtZXdvcmssXG4gICAgICAgIGNvbmZpZGVuY2U6IGRlY2lzaW9uLmNvbmZpZGVuY2UsXG4gICAgICAgIG91dGNvbWU6IHBhcmFtcy5vdXRjb21lXG4gICAgICB9LFxuICAgICAgc3RhdGU6IHtcbiAgICAgICAgZ29hbENvdW50OiB1cGRhdGVkU3RhdGUuZ29hbHMubGVuZ3RoLFxuICAgICAgICBkZWNpc2lvbkNvdW50OiB1cGRhdGVkU3RhdGUuZGVjaXNpb25zLmxlbmd0aCxcbiAgICAgICAgbGFzdEFjdGl2ZTogdXBkYXRlZFN0YXRlLmxhc3RBY3RpdmUudG9JU09TdHJpbmcoKSxcbiAgICAgICAgc3RhdGVWZXJzaW9uOiB1cGRhdGVkU3RhdGUuc3RhdGVWZXJzaW9uIHx8IDFcbiAgICAgIH0sXG4gICAgICBhdXRvbm9teTogYXV0b25vbXlEaXJlY3RpdmVcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENvbXBsZXRlIGFuIGFnZW50IGdvYWxcbiAgICogV3JhcHMgQWdlbnQuY29tcGxldGVHb2FsKCkgZm9yIHRoZSBNQ1AgdG9vbCBpbnRlcmZhY2VcbiAgICpcbiAgICogQHNpbmNlIHYyLjAuMCAtIEFnZW50aWMgTG9vcCBSZWRlc2lnblxuICAgKi9cbiAgYXN5bmMgY29tcGxldGVBZ2VudEdvYWwocGFyYW1zOiB7XG4gICAgYWdlbnROYW1lOiBzdHJpbmc7XG4gICAgZ29hbElkPzogc3RyaW5nO1xuICAgIG91dGNvbWU6IFwic3VjY2Vzc1wiIHwgXCJmYWlsdXJlXCIgfCBcInBhcnRpYWxcIjtcbiAgICBzdW1tYXJ5OiBzdHJpbmc7XG4gIH0pOiBQcm9taXNlPHtcbiAgICBzdWNjZXNzOiBib29sZWFuO1xuICAgIG1lc3NhZ2U6IHN0cmluZztcbiAgICBnb2FsOiB7XG4gICAgICBpZDogc3RyaW5nO1xuICAgICAgZGVzY3JpcHRpb246IHN0cmluZztcbiAgICAgIHN0YXR1czogXCJjb21wbGV0ZWRcIiB8IFwiZmFpbGVkXCI7XG4gICAgICBjcmVhdGVkQXQ6IHN0cmluZztcbiAgICAgIGNvbXBsZXRlZEF0OiBzdHJpbmc7XG4gICAgICBlc3RpbWF0ZWRFZmZvcnQ/OiBudW1iZXI7XG4gICAgICBhY3R1YWxFZmZvcnQ/OiBudW1iZXI7XG4gICAgfTtcbiAgICBtZXRyaWNzOiB7XG4gICAgICBzdWNjZXNzUmF0ZTogbnVtYmVyO1xuICAgICAgZ29hbHNDb21wbGV0ZWQ6IG51bWJlcjtcbiAgICAgIGdvYWxzSW5Qcm9ncmVzczogbnVtYmVyO1xuICAgICAgZGVjaXNpb25BY2N1cmFjeTogbnVtYmVyO1xuICAgICAgYXZlcmFnZUNvbXBsZXRpb25UaW1lOiBudW1iZXI7XG4gICAgfTtcbiAgICBzdGF0ZToge1xuICAgICAgZ29hbENvdW50OiBudW1iZXI7XG4gICAgICBkZWNpc2lvbkNvdW50OiBudW1iZXI7XG4gICAgICBsYXN0QWN0aXZlOiBzdHJpbmc7XG4gICAgICBzdGF0ZVZlcnNpb246IG51bWJlcjtcbiAgICB9O1xuICB9PiB7XG4gICAgLy8gMS4gTG9hZCBhZ2VudCBieSBuYW1lXG4gICAgY29uc3QgYWdlbnQgPSBhd2FpdCB0aGlzLnJlYWQocGFyYW1zLmFnZW50TmFtZSk7XG4gICAgaWYgKCFhZ2VudCkge1xuICAgICAgLy8gRklYOiBJc3N1ZSAjMjc1IC0gVGhyb3cgRWxlbWVudE5vdEZvdW5kRXJyb3IgZm9yIGNvbnNpc3RlbnQgZXJyb3IgaGFuZGxpbmdcbiAgICAgIHRocm93IG5ldyBFbGVtZW50Tm90Rm91bmRFcnJvcignQWdlbnQnLCBwYXJhbXMuYWdlbnROYW1lKTtcbiAgICB9XG5cbiAgICAvLyAyLiBGaW5kIGdvYWwgdG8gY29tcGxldGVcbiAgICBjb25zdCBzdGF0ZSA9IGFnZW50LmdldFN0YXRlKCk7XG4gICAgbGV0IGdvYWw6IEFnZW50R29hbCB8IHVuZGVmaW5lZDtcblxuICAgIGlmIChwYXJhbXMuZ29hbElkKSB7XG4gICAgICBnb2FsID0gc3RhdGUuZ29hbHMuZmluZChnID0+IGcuaWQgPT09IHBhcmFtcy5nb2FsSWQpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBGaW5kIG1vc3QgcmVjZW50IGluLXByb2dyZXNzIGdvYWxcbiAgICAgIGdvYWwgPSBzdGF0ZS5nb2Fsc1xuICAgICAgICAuZmlsdGVyKGcgPT4gZy5zdGF0dXMgPT09ICdpbl9wcm9ncmVzcycpXG4gICAgICAgIC5zb3J0KChhLCBiKSA9PiBiLmNyZWF0ZWRBdC5nZXRUaW1lKCkgLSBhLmNyZWF0ZWRBdC5nZXRUaW1lKCkpWzBdO1xuICAgIH1cblxuICAgIGlmICghZ29hbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBwYXJhbXMuZ29hbElkXG4gICAgICAgICAgPyBgR29hbCAnJHtwYXJhbXMuZ29hbElkfScgbm90IGZvdW5kYFxuICAgICAgICAgIDogYE5vIGluLXByb2dyZXNzIGdvYWwgZm91bmQgZm9yIGFnZW50ICcke3BhcmFtcy5hZ2VudE5hbWV9J2BcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gMy4gUmVjb3JkIGZpbmFsIGRlY2lzaW9uIHdpdGggc3VtbWFyeVxuICAgIGFnZW50LnJlY29yZERlY2lzaW9uKHtcbiAgICAgIGdvYWxJZDogZ29hbC5pZCxcbiAgICAgIGRlY2lzaW9uOiAnZ29hbF9jb21wbGV0ZScsXG4gICAgICByZWFzb25pbmc6IHBhcmFtcy5zdW1tYXJ5LFxuICAgICAgY29uZmlkZW5jZTogMS4wLFxuICAgICAgb3V0Y29tZTogcGFyYW1zLm91dGNvbWVcbiAgICB9KTtcblxuICAgIC8vIDQuIENhbGwgQWdlbnQuY29tcGxldGVHb2FsKClcbiAgICBhZ2VudC5jb21wbGV0ZUdvYWwoZ29hbC5pZCwgcGFyYW1zLm91dGNvbWUpO1xuXG4gICAgLy8gNS4gR2V0IHBlcmZvcm1hbmNlIG1ldHJpY3NcbiAgICBjb25zdCBtZXRyaWNzID0gYWdlbnQuZ2V0UGVyZm9ybWFuY2VNZXRyaWNzKCk7XG5cbiAgICAvLyA2LiBTYXZlIGFnZW50IHN0YXRlXG4gICAgY29uc3QgY29tcGxldGVTYW5pdGl6ZWROYW1lID0gc2FuaXRpemVJbnB1dChwYXJhbXMuYWdlbnROYW1lLCAxMDApO1xuICAgIGF3YWl0IHRoaXMuc2F2ZShhZ2VudCwgdGhpcy5nZXRGaWxlbmFtZShjb21wbGV0ZVNhbml0aXplZE5hbWUpKTtcblxuICAgIC8vIDcuIFJldHVybiBnb2FsLCBtZXRyaWNzLCBhbmQgc3RhdGVcbiAgICBjb25zdCB1cGRhdGVkU3RhdGUgPSBhZ2VudC5nZXRTdGF0ZSgpO1xuICAgIGNvbnN0IGNvbXBsZXRlZEdvYWwgPSB1cGRhdGVkU3RhdGUuZ29hbHMuZmluZChnID0+IGcuaWQgPT09IGdvYWwuaWQpITtcblxuICAgIHJldHVybiB7XG4gICAgICBzdWNjZXNzOiB0cnVlLFxuICAgICAgbWVzc2FnZTogYEdvYWwgY29tcGxldGVkIGZvciBhZ2VudCAnJHtwYXJhbXMuYWdlbnROYW1lfScgd2l0aCBvdXRjb21lOiAke3BhcmFtcy5vdXRjb21lfWAsXG4gICAgICBnb2FsOiB7XG4gICAgICAgIGlkOiBjb21wbGV0ZWRHb2FsLmlkLFxuICAgICAgICBkZXNjcmlwdGlvbjogY29tcGxldGVkR29hbC5kZXNjcmlwdGlvbixcbiAgICAgICAgc3RhdHVzOiBjb21wbGV0ZWRHb2FsLnN0YXR1cyBhcyBcImNvbXBsZXRlZFwiIHwgXCJmYWlsZWRcIixcbiAgICAgICAgY3JlYXRlZEF0OiBjb21wbGV0ZWRHb2FsLmNyZWF0ZWRBdC50b0lTT1N0cmluZygpLFxuICAgICAgICBjb21wbGV0ZWRBdDogY29tcGxldGVkR29hbC5jb21wbGV0ZWRBdCEudG9JU09TdHJpbmcoKSxcbiAgICAgICAgZXN0aW1hdGVkRWZmb3J0OiBjb21wbGV0ZWRHb2FsLmVzdGltYXRlZEVmZm9ydCxcbiAgICAgICAgYWN0dWFsRWZmb3J0OiBjb21wbGV0ZWRHb2FsLmFjdHVhbEVmZm9ydFxuICAgICAgfSxcbiAgICAgIG1ldHJpY3M6IHtcbiAgICAgICAgc3VjY2Vzc1JhdGU6IG1ldHJpY3Muc3VjY2Vzc1JhdGUsXG4gICAgICAgIGdvYWxzQ29tcGxldGVkOiBtZXRyaWNzLmdvYWxzQ29tcGxldGVkLFxuICAgICAgICBnb2Fsc0luUHJvZ3Jlc3M6IG1ldHJpY3MuZ29hbHNJblByb2dyZXNzLFxuICAgICAgICBkZWNpc2lvbkFjY3VyYWN5OiBtZXRyaWNzLmRlY2lzaW9uQWNjdXJhY3ksXG4gICAgICAgIGF2ZXJhZ2VDb21wbGV0aW9uVGltZTogbWV0cmljcy5hdmVyYWdlQ29tcGxldGlvblRpbWVcbiAgICAgIH0sXG4gICAgICBzdGF0ZToge1xuICAgICAgICBnb2FsQ291bnQ6IHVwZGF0ZWRTdGF0ZS5nb2Fscy5sZW5ndGgsXG4gICAgICAgIGRlY2lzaW9uQ291bnQ6IHVwZGF0ZWRTdGF0ZS5kZWNpc2lvbnMubGVuZ3RoLFxuICAgICAgICBsYXN0QWN0aXZlOiB1cGRhdGVkU3RhdGUubGFzdEFjdGl2ZS50b0lTT1N0cmluZygpLFxuICAgICAgICBzdGF0ZVZlcnNpb246IHVwZGF0ZWRTdGF0ZS5zdGF0ZVZlcnNpb24gfHwgMVxuICAgICAgfVxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogR2V0IGFnZW50IHN0YXRlXG4gICAqIFdyYXBzIEFnZW50LmdldFN0YXRlKCkgZm9yIHRoZSBNQ1AgdG9vbCBpbnRlcmZhY2VcbiAgICpcbiAgICogQHNpbmNlIHYyLjAuMCAtIEFnZW50aWMgTG9vcCBSZWRlc2lnblxuICAgKi9cbiAgYXN5bmMgZ2V0QWdlbnRTdGF0ZShwYXJhbXM6IHtcbiAgICBhZ2VudE5hbWU6IHN0cmluZztcbiAgICBpbmNsdWRlRGVjaXNpb25IaXN0b3J5PzogYm9vbGVhbjtcbiAgICBpbmNsdWRlQ29udGV4dD86IGJvb2xlYW47XG4gIH0pOiBQcm9taXNlPHtcbiAgICBzdWNjZXNzOiBib29sZWFuO1xuICAgIGFnZW50TmFtZTogc3RyaW5nO1xuICAgIHN0YXRlOiB7XG4gICAgICBnb2FsczogQXJyYXk8e1xuICAgICAgICBpZDogc3RyaW5nO1xuICAgICAgICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICAgICAgICBwcmlvcml0eTogc3RyaW5nO1xuICAgICAgICBzdGF0dXM6IHN0cmluZztcbiAgICAgICAgaW1wb3J0YW5jZTogbnVtYmVyO1xuICAgICAgICB1cmdlbmN5OiBudW1iZXI7XG4gICAgICAgIGVpc2VuaG93ZXJRdWFkcmFudD86IHN0cmluZztcbiAgICAgICAgY3JlYXRlZEF0OiBzdHJpbmc7XG4gICAgICAgIHVwZGF0ZWRBdDogc3RyaW5nO1xuICAgICAgICBjb21wbGV0ZWRBdD86IHN0cmluZztcbiAgICAgICAgZGVwZW5kZW5jaWVzPzogc3RyaW5nW107XG4gICAgICAgIHJpc2tMZXZlbD86IHN0cmluZztcbiAgICAgICAgZXN0aW1hdGVkRWZmb3J0PzogbnVtYmVyO1xuICAgICAgICBhY3R1YWxFZmZvcnQ/OiBudW1iZXI7XG4gICAgICAgIG5vdGVzPzogc3RyaW5nO1xuICAgICAgfT47XG4gICAgICBkZWNpc2lvbnM6IEFycmF5PHtcbiAgICAgICAgaWQ6IHN0cmluZztcbiAgICAgICAgZ29hbElkOiBzdHJpbmc7XG4gICAgICAgIHRpbWVzdGFtcDogc3RyaW5nO1xuICAgICAgICBkZWNpc2lvbjogc3RyaW5nO1xuICAgICAgICByZWFzb25pbmc6IHN0cmluZztcbiAgICAgICAgZnJhbWV3b3JrOiBzdHJpbmc7XG4gICAgICAgIGNvbmZpZGVuY2U6IG51bWJlcjtcbiAgICAgICAgb3V0Y29tZT86IHN0cmluZztcbiAgICAgIH0+O1xuICAgICAgY29udGV4dD86IFJlY29yZDxzdHJpbmcsIGFueT47XG4gICAgICBjb250ZXh0U3VtbWFyeToge1xuICAgICAgICBrZXlzOiBzdHJpbmdbXTtcbiAgICAgICAgc2l6ZTogbnVtYmVyO1xuICAgICAgfTtcbiAgICAgIGxhc3RBY3RpdmU6IHN0cmluZztcbiAgICAgIHNlc3Npb25Db3VudDogbnVtYmVyO1xuICAgICAgc3RhdGVWZXJzaW9uOiBudW1iZXI7XG4gICAgfTtcbiAgICBtZXRyaWNzOiB7XG4gICAgICBzdWNjZXNzUmF0ZTogbnVtYmVyO1xuICAgICAgZ29hbHNDb21wbGV0ZWQ6IG51bWJlcjtcbiAgICAgIGdvYWxzSW5Qcm9ncmVzczogbnVtYmVyO1xuICAgICAgZGVjaXNpb25BY2N1cmFjeTogbnVtYmVyO1xuICAgICAgYXZlcmFnZUNvbXBsZXRpb25UaW1lOiBudW1iZXI7XG4gICAgfTtcbiAgfT4ge1xuICAgIC8vIDEuIExvYWQgYWdlbnQgYnkgbmFtZVxuICAgIGNvbnN0IGFnZW50ID0gYXdhaXQgdGhpcy5yZWFkKHBhcmFtcy5hZ2VudE5hbWUpO1xuICAgIGlmICghYWdlbnQpIHtcbiAgICAgIC8vIEZJWDogSXNzdWUgIzI3NSAtIFRocm93IEVsZW1lbnROb3RGb3VuZEVycm9yIGZvciBjb25zaXN0ZW50IGVycm9yIGhhbmRsaW5nXG4gICAgICB0aHJvdyBuZXcgRWxlbWVudE5vdEZvdW5kRXJyb3IoJ0FnZW50JywgcGFyYW1zLmFnZW50TmFtZSk7XG4gICAgfVxuXG4gICAgLy8gMi4gR2V0IGFnZW50IHN0YXRlXG4gICAgY29uc3Qgc3RhdGUgPSBhZ2VudC5nZXRTdGF0ZSgpO1xuXG4gICAgLy8gMy4gR2V0IHBlcmZvcm1hbmNlIG1ldHJpY3NcbiAgICBjb25zdCBtZXRyaWNzID0gYWdlbnQuZ2V0UGVyZm9ybWFuY2VNZXRyaWNzKCk7XG5cbiAgICAvLyA0LiBGaWx0ZXIgZGVjaXNpb25zIGJhc2VkIG9uIGluY2x1ZGVEZWNpc2lvbkhpc3RvcnlcbiAgICBjb25zdCBkZWNpc2lvbnMgPSBwYXJhbXMuaW5jbHVkZURlY2lzaW9uSGlzdG9yeVxuICAgICAgPyBzdGF0ZS5kZWNpc2lvbnNcbiAgICAgIDogc3RhdGUuZGVjaXNpb25zLnNsaWNlKC0xMCk7IC8vIExhc3QgMTAgZGVjaXNpb25zXG5cbiAgICAvLyA1LiBCdWlsZCBjb250ZXh0IHN1bW1hcnlcbiAgICBjb25zdCBjb250ZXh0S2V5cyA9IE9iamVjdC5rZXlzKHN0YXRlLmNvbnRleHQpO1xuICAgIGNvbnN0IGNvbnRleHRTaXplID0gSlNPTi5zdHJpbmdpZnkoc3RhdGUuY29udGV4dCkubGVuZ3RoO1xuXG4gICAgLy8gNi4gUmV0dXJuIHN0YXRlIGFuZCBtZXRyaWNzXG4gICAgcmV0dXJuIHtcbiAgICAgIHN1Y2Nlc3M6IHRydWUsXG4gICAgICBhZ2VudE5hbWU6IHBhcmFtcy5hZ2VudE5hbWUsXG4gICAgICBzdGF0ZToge1xuICAgICAgICBnb2Fsczogc3RhdGUuZ29hbHMubWFwKGcgPT4gKHtcbiAgICAgICAgICBpZDogZy5pZCxcbiAgICAgICAgICBkZXNjcmlwdGlvbjogZy5kZXNjcmlwdGlvbixcbiAgICAgICAgICBwcmlvcml0eTogZy5wcmlvcml0eSxcbiAgICAgICAgICBzdGF0dXM6IGcuc3RhdHVzLFxuICAgICAgICAgIGltcG9ydGFuY2U6IGcuaW1wb3J0YW5jZSxcbiAgICAgICAgICB1cmdlbmN5OiBnLnVyZ2VuY3ksXG4gICAgICAgICAgZWlzZW5ob3dlclF1YWRyYW50OiBnLmVpc2VuaG93ZXJRdWFkcmFudCxcbiAgICAgICAgICBjcmVhdGVkQXQ6IGcuY3JlYXRlZEF0LnRvSVNPU3RyaW5nKCksXG4gICAgICAgICAgdXBkYXRlZEF0OiBnLnVwZGF0ZWRBdC50b0lTT1N0cmluZygpLFxuICAgICAgICAgIGNvbXBsZXRlZEF0OiBnLmNvbXBsZXRlZEF0Py50b0lTT1N0cmluZygpLFxuICAgICAgICAgIGRlcGVuZGVuY2llczogZy5kZXBlbmRlbmNpZXMsXG4gICAgICAgICAgcmlza0xldmVsOiBnLnJpc2tMZXZlbCxcbiAgICAgICAgICBlc3RpbWF0ZWRFZmZvcnQ6IGcuZXN0aW1hdGVkRWZmb3J0LFxuICAgICAgICAgIGFjdHVhbEVmZm9ydDogZy5hY3R1YWxFZmZvcnQsXG4gICAgICAgICAgbm90ZXM6IGcubm90ZXNcbiAgICAgICAgfSkpLFxuICAgICAgICBkZWNpc2lvbnM6IGRlY2lzaW9ucy5tYXAoZCA9PiAoe1xuICAgICAgICAgIGlkOiBkLmlkLFxuICAgICAgICAgIGdvYWxJZDogZC5nb2FsSWQsXG4gICAgICAgICAgdGltZXN0YW1wOiBkLnRpbWVzdGFtcC50b0lTT1N0cmluZygpLFxuICAgICAgICAgIGRlY2lzaW9uOiBkLmRlY2lzaW9uLFxuICAgICAgICAgIHJlYXNvbmluZzogZC5yZWFzb25pbmcsXG4gICAgICAgICAgZnJhbWV3b3JrOiBkLmZyYW1ld29yayxcbiAgICAgICAgICBjb25maWRlbmNlOiBkLmNvbmZpZGVuY2UsXG4gICAgICAgICAgb3V0Y29tZTogZC5vdXRjb21lXG4gICAgICAgIH0pKSxcbiAgICAgICAgY29udGV4dDogcGFyYW1zLmluY2x1ZGVDb250ZXh0ID8gc3RhdGUuY29udGV4dCA6IHVuZGVmaW5lZCxcbiAgICAgICAgY29udGV4dFN1bW1hcnk6IHtcbiAgICAgICAgICBrZXlzOiBjb250ZXh0S2V5cyxcbiAgICAgICAgICBzaXplOiBjb250ZXh0U2l6ZVxuICAgICAgICB9LFxuICAgICAgICBsYXN0QWN0aXZlOiBzdGF0ZS5sYXN0QWN0aXZlLnRvSVNPU3RyaW5nKCksXG4gICAgICAgIHNlc3Npb25Db3VudDogc3RhdGUuc2Vzc2lvbkNvdW50LFxuICAgICAgICBzdGF0ZVZlcnNpb246IHN0YXRlLnN0YXRlVmVyc2lvbiB8fCAxXG4gICAgICB9LFxuICAgICAgbWV0cmljczoge1xuICAgICAgICBzdWNjZXNzUmF0ZTogbWV0cmljcy5zdWNjZXNzUmF0ZSxcbiAgICAgICAgZ29hbHNDb21wbGV0ZWQ6IG1ldHJpY3MuZ29hbHNDb21wbGV0ZWQsXG4gICAgICAgIGdvYWxzSW5Qcm9ncmVzczogbWV0cmljcy5nb2Fsc0luUHJvZ3Jlc3MsXG4gICAgICAgIGRlY2lzaW9uQWNjdXJhY3k6IG1ldHJpY3MuZGVjaXNpb25BY2N1cmFjeSxcbiAgICAgICAgYXZlcmFnZUNvbXBsZXRpb25UaW1lOiBtZXRyaWNzLmF2ZXJhZ2VDb21wbGV0aW9uVGltZVxuICAgICAgfVxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogR2V0IGdhdGhlcmVkIGRhdGEgZm9yIGEgc3BlY2lmaWMgZ29hbCBleGVjdXRpb24uXG4gICAqXG4gICAqIEFnZ3JlZ2F0ZXMgZGVjaXNpb24gaGlzdG9yeSwgZ29hbCBzdGF0ZSwgYW5kIHN1bW1hcnkgc3RhdGlzdGljc1xuICAgKiBpbnRvIGEgc3RydWN0dXJlZCBHYXRoZXJlZERhdGEgb2JqZWN0LiBUaGlzIGlzIGEgcmVhZC1zaWRlIHZpZXdcbiAgICogb3ZlciBleGlzdGluZyBhZ2VudCBzdGF0ZSBkYXRhLlxuICAgKlxuICAgKiBJc3N1ZSAjNjg6IEdhdGhlcmVkRGF0YUVudHJ5IGZvciBzdGF0ZSByZWNvcmRpbmdcbiAgICogQHNpbmNlIHYyLjAuMCAtIEFnZW50aWMgTG9vcCBDb21wbGV0aW9uIChFcGljICMzODApXG4gICAqL1xuICBhc3luYyBnZXRHYXRoZXJlZERhdGEocGFyYW1zOiB7XG4gICAgYWdlbnROYW1lOiBzdHJpbmc7XG4gICAgZ29hbElkOiBzdHJpbmc7XG4gIH0pOiBQcm9taXNlPEdhdGhlcmVkRGF0YT4ge1xuICAgIGNvbnN0IGFnZW50ID0gYXdhaXQgdGhpcy5yZWFkKHBhcmFtcy5hZ2VudE5hbWUpO1xuICAgIGlmICghYWdlbnQpIHtcbiAgICAgIHRocm93IG5ldyBFbGVtZW50Tm90Rm91bmRFcnJvcignQWdlbnQnLCBwYXJhbXMuYWdlbnROYW1lKTtcbiAgICB9XG5cbiAgICBjb25zdCBzdGF0ZSA9IGFnZW50LmdldFN0YXRlKCk7XG4gICAgY29uc3QgZ2F0aGVyZWQgPSBnZXRHYXRoZXJlZERhdGEocGFyYW1zLmFnZW50TmFtZSwgcGFyYW1zLmdvYWxJZCwgc3RhdGUpO1xuXG4gICAgaWYgKCFnYXRoZXJlZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgR29hbCAnJHtwYXJhbXMuZ29hbElkfScgbm90IGZvdW5kIGZvciBhZ2VudCAnJHtwYXJhbXMuYWdlbnROYW1lfScuIGAgK1xuICAgICAgICBgQXZhaWxhYmxlIGdvYWxzOiAke3N0YXRlLmdvYWxzLm1hcChnID0+IGcuaWQpLmpvaW4oJywgJykgfHwgJ25vbmUnfWBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGdhdGhlcmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnRpbnVlIGFnZW50IGV4ZWN1dGlvbiBmcm9tIHByZXZpb3VzIHN0YXRlXG4gICAqIENvbWJpbmVzIGV4ZWN1dGVBZ2VudCB3aXRoIHN0YXRlIGNvbnRleHRcbiAgICpcbiAgICogQHNpbmNlIHYyLjAuMCAtIEFnZW50aWMgTG9vcCBSZWRlc2lnblxuICAgKi9cbiAgYXN5bmMgY29udGludWVBZ2VudEV4ZWN1dGlvbihwYXJhbXM6IHtcbiAgICBhZ2VudE5hbWU6IHN0cmluZztcbiAgICBwYXJhbWV0ZXJzPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgcHJldmlvdXNTdGVwUmVzdWx0Pzogc3RyaW5nO1xuICB9KTogUHJvbWlzZTxFeGVjdXRlQWdlbnRSZXN1bHQgJiB7XG4gICAgcHJldmlvdXNTdGF0ZToge1xuICAgICAgZ29hbHM6IEFycmF5PHtcbiAgICAgICAgaWQ6IHN0cmluZztcbiAgICAgICAgZGVzY3JpcHRpb246IHN0cmluZztcbiAgICAgICAgc3RhdHVzOiBzdHJpbmc7XG4gICAgICAgIHByb2dyZXNzPzogbnVtYmVyO1xuICAgICAgfT47XG4gICAgICByZWNlbnREZWNpc2lvbnM6IEFycmF5PHtcbiAgICAgICAgZGVjaXNpb246IHN0cmluZztcbiAgICAgICAgcmVhc29uaW5nOiBzdHJpbmc7XG4gICAgICAgIG91dGNvbWU/OiBzdHJpbmc7XG4gICAgICAgIHRpbWVzdGFtcDogc3RyaW5nO1xuICAgICAgfT47XG4gICAgICBzZXNzaW9uQ291bnQ6IG51bWJlcjtcbiAgICAgIGxhc3RBY3RpdmU6IHN0cmluZztcbiAgICAgIHN0YXRlVmVyc2lvbjogbnVtYmVyO1xuICAgIH07XG4gICAgY29udGludWF0aW9uOiB7XG4gICAgICBpc1Jlc3VtaW5nOiBib29sZWFuO1xuICAgICAgcHJldmlvdXNTdGVwUmVzdWx0Pzogc3RyaW5nO1xuICAgICAgc3VnZ2VzdGVkTmV4dFN0ZXBzPzogc3RyaW5nW107XG4gICAgfTtcbiAgfT4ge1xuICAgIC8vIDEuIExvYWQgYWdlbnQgYnkgbmFtZVxuICAgIGNvbnN0IGFnZW50ID0gYXdhaXQgdGhpcy5yZWFkKHBhcmFtcy5hZ2VudE5hbWUpO1xuICAgIGlmICghYWdlbnQpIHtcbiAgICAgIC8vIEZJWDogSXNzdWUgIzI3NSAtIFRocm93IEVsZW1lbnROb3RGb3VuZEVycm9yIGZvciBjb25zaXN0ZW50IGVycm9yIGhhbmRsaW5nXG4gICAgICB0aHJvdyBuZXcgRWxlbWVudE5vdEZvdW5kRXJyb3IoJ0FnZW50JywgcGFyYW1zLmFnZW50TmFtZSk7XG4gICAgfVxuXG4gICAgLy8gMi4gR2V0IGN1cnJlbnQgc3RhdGVcbiAgICBjb25zdCBzdGF0ZSA9IGFnZW50LmdldFN0YXRlKCk7XG5cbiAgICAvLyAzLiBDaGVjayBpZiBhZ2VudCBoYXMgYmVlbiBleGVjdXRlZCBiZWZvcmVcbiAgICBjb25zdCBpc1Jlc3VtaW5nID0gc3RhdGUuc2Vzc2lvbkNvdW50ID4gMCB8fCBzdGF0ZS5kZWNpc2lvbnMubGVuZ3RoID4gMDtcblxuICAgIC8vIDQuIEV4ZWN1dGUgYWdlbnQgbm9ybWFsbHkgKHRoaXMgYWN0aXZhdGVzIGVsZW1lbnRzIGFuZCBnZXRzIGNvbnRleHQpXG4gICAgY29uc3QgZXhlY3V0aW9uUGFyYW1zID0gcGFyYW1zLnBhcmFtZXRlcnMgfHwge307XG5cbiAgICBjb25zdCBleGVjdXRpb25SZXN1bHQgPSBhd2FpdCB0aGlzLmV4ZWN1dGVBZ2VudChcbiAgICAgIHBhcmFtcy5hZ2VudE5hbWUsXG4gICAgICBleGVjdXRpb25QYXJhbXNcbiAgICApO1xuXG4gICAgLy8gNS4gQnVpbGQgcHJldmlvdXMgc3RhdGUgc3VtbWFyeVxuICAgIGNvbnN0IHJlY2VudERlY2lzaW9ucyA9IHN0YXRlLmRlY2lzaW9ucy5zbGljZSgtNSkubWFwKGQgPT4gKHtcbiAgICAgIGRlY2lzaW9uOiBkLmRlY2lzaW9uLFxuICAgICAgcmVhc29uaW5nOiBkLnJlYXNvbmluZyxcbiAgICAgIG91dGNvbWU6IGQub3V0Y29tZSxcbiAgICAgIHRpbWVzdGFtcDogZC50aW1lc3RhbXAudG9JU09TdHJpbmcoKVxuICAgIH0pKTtcblxuICAgIGNvbnN0IGdvYWxTdW1tYXJ5ID0gc3RhdGUuZ29hbHMubWFwKGcgPT4gKHtcbiAgICAgIGlkOiBnLmlkLFxuICAgICAgZGVzY3JpcHRpb246IGcuZGVzY3JpcHRpb24sXG4gICAgICBzdGF0dXM6IGcuc3RhdHVzLFxuICAgICAgcHJvZ3Jlc3M6IHVuZGVmaW5lZCAvLyBDb3VsZCBhZGQgcHJvZ3Jlc3MgdHJhY2tpbmcgaW4gZnV0dXJlXG4gICAgfSkpO1xuXG4gICAgLy8gNi4gR2VuZXJhdGUgc3VnZ2VzdGVkIG5leHQgc3RlcHMgYmFzZWQgb24gc3RhdGVcbiAgICBjb25zdCBzdWdnZXN0ZWROZXh0U3RlcHMgPSB0aGlzLmdlbmVyYXRlTmV4dFN0ZXBzKHN0YXRlKTtcblxuICAgIC8vIDcuIE1lcmdlIGV4ZWN1dGlvbiByZXN1bHQgd2l0aCBjb250aW51YXRpb24gY29udGV4dFxuICAgIHJldHVybiB7XG4gICAgICAvLyBJbmNsdWRlIGFsbCBmaWVsZHMgZnJvbSBleGVjdXRlX2FnZW50IHJlc3VsdFxuICAgICAgLi4uZXhlY3V0aW9uUmVzdWx0LFxuXG4gICAgICAvLyBBZGQgcHJldmlvdXMgc3RhdGUgaW5mb3JtYXRpb25cbiAgICAgIHByZXZpb3VzU3RhdGU6IHtcbiAgICAgICAgZ29hbHM6IGdvYWxTdW1tYXJ5LFxuICAgICAgICByZWNlbnREZWNpc2lvbnMsXG4gICAgICAgIHNlc3Npb25Db3VudDogc3RhdGUuc2Vzc2lvbkNvdW50LFxuICAgICAgICBsYXN0QWN0aXZlOiBzdGF0ZS5sYXN0QWN0aXZlLnRvSVNPU3RyaW5nKCksXG4gICAgICAgIHN0YXRlVmVyc2lvbjogc3RhdGUuc3RhdGVWZXJzaW9uIHx8IDFcbiAgICAgIH0sXG5cbiAgICAgIC8vIEFkZCBjb250aW51YXRpb24gY29udGV4dFxuICAgICAgY29udGludWF0aW9uOiB7XG4gICAgICAgIGlzUmVzdW1pbmcsXG4gICAgICAgIHByZXZpb3VzU3RlcFJlc3VsdDogcGFyYW1zLnByZXZpb3VzU3RlcFJlc3VsdCxcbiAgICAgICAgc3VnZ2VzdGVkTmV4dFN0ZXBzXG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZW5lcmF0ZSBzdWdnZXN0ZWQgbmV4dCBzdGVwcyBiYXNlZCBvbiBjdXJyZW50IHN0YXRlXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIGdlbmVyYXRlTmV4dFN0ZXBzKHN0YXRlOiBBZ2VudFN0YXRlKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IHN1Z2dlc3Rpb25zOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgLy8gQ2hlY2sgZm9yIHBlbmRpbmcgZ29hbHNcbiAgICBjb25zdCBwZW5kaW5nR29hbHMgPSBzdGF0ZS5nb2Fscy5maWx0ZXIoZyA9PiBnLnN0YXR1cyA9PT0gJ3BlbmRpbmcnKTtcbiAgICBpZiAocGVuZGluZ0dvYWxzLmxlbmd0aCA+IDApIHtcbiAgICAgIHN1Z2dlc3Rpb25zLnB1c2goYFN0YXJ0IHdvcmsgb24gJHtwZW5kaW5nR29hbHMubGVuZ3RofSBwZW5kaW5nIGdvYWwocylgKTtcbiAgICB9XG5cbiAgICAvLyBDaGVjayBmb3IgaW4tcHJvZ3Jlc3MgZ29hbHNcbiAgICBjb25zdCBpblByb2dyZXNzR29hbHMgPSBzdGF0ZS5nb2Fscy5maWx0ZXIoZyA9PiBnLnN0YXR1cyA9PT0gJ2luX3Byb2dyZXNzJyk7XG4gICAgaWYgKGluUHJvZ3Jlc3NHb2Fscy5sZW5ndGggPiAwKSB7XG4gICAgICBzdWdnZXN0aW9ucy5wdXNoKGBDb250aW51ZSAke2luUHJvZ3Jlc3NHb2Fscy5sZW5ndGh9IGluLXByb2dyZXNzIGdvYWwocylgKTtcbiAgICB9XG5cbiAgICAvLyBDaGVjayBmb3IgYmxvY2tlZCBnb2FscyAoZGVwZW5kZW5jaWVzKVxuICAgIGNvbnN0IGJsb2NrZWRHb2FscyA9IHN0YXRlLmdvYWxzLmZpbHRlcihnID0+XG4gICAgICBnLmRlcGVuZGVuY2llcyAmJiBnLmRlcGVuZGVuY2llcy5sZW5ndGggPiAwICYmIGcuc3RhdHVzID09PSAncGVuZGluZydcbiAgICApO1xuICAgIGlmIChibG9ja2VkR29hbHMubGVuZ3RoID4gMCkge1xuICAgICAgc3VnZ2VzdGlvbnMucHVzaChgUmVzb2x2ZSBkZXBlbmRlbmNpZXMgZm9yICR7YmxvY2tlZEdvYWxzLmxlbmd0aH0gYmxvY2tlZCBnb2FsKHMpYCk7XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgZGVjaXNpb24gaGlzdG9yeSBmb3IgZmFpbHVyZXNcbiAgICBjb25zdCByZWNlbnRGYWlsdXJlcyA9IHN0YXRlLmRlY2lzaW9uc1xuICAgICAgLnNsaWNlKC0xMClcbiAgICAgIC5maWx0ZXIoZCA9PiBkLm91dGNvbWUgPT09ICdmYWlsdXJlJyk7XG4gICAgaWYgKHJlY2VudEZhaWx1cmVzLmxlbmd0aCA+IDApIHtcbiAgICAgIHN1Z2dlc3Rpb25zLnB1c2goYFJldmlldyBhbmQgYWRkcmVzcyAke3JlY2VudEZhaWx1cmVzLmxlbmd0aH0gcmVjZW50IGZhaWx1cmUocylgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gc3VnZ2VzdGlvbnM7XG4gIH1cbn1cbiJdfQ==
|
|
2444
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQWdlbnRNYW5hZ2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2VsZW1lbnRzL2FnZW50cy9BZ2VudE1hbmFnZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7OztHQUdHO0FBR0gsT0FBTyxLQUFLLElBQUksTUFBTSxNQUFNLENBQUM7QUFFN0IsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLFlBQVksQ0FBQztBQUNuQyxPQUFPLEVBQ0wsd0JBQXdCLEVBQ3hCLFlBQVksRUFDWixxQkFBcUIsRUFDckIsa0JBQWtCLEVBQ2xCLHlCQUF5QixFQUN6QixrQkFBa0IsRUFDbEIsT0FBTyxFQUNQLHFCQUFxQixFQUNyQix1QkFBdUIsRUFDdkIsaUJBQWlCLEdBQ2xCLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEIsT0FBTyxFQVFMLHFCQUFxQixHQUd0QixNQUFNLFlBQVksQ0FBQztBQUNwQixPQUFPLEVBQUUsZUFBZSxFQUFxQixNQUFNLG1CQUFtQixDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQzFELE9BQU8sRUFDTCxTQUFTLEVBQ1QsYUFBYSxHQUNkLE1BQU0sc0JBQXNCLENBQUM7QUFDOUIsT0FBTyxFQUNMLG1CQUFtQixFQUNuQiwyQkFBMkIsRUFDM0IseUJBQXlCLEVBQ3pCLHlCQUF5QixFQUN6QixzQkFBc0IsR0FDdkIsTUFBTSx3QkFBd0IsQ0FBQztBQUNoQyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUNuRSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDdkQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHlDQUF5QyxDQUFDO0FBQzFFLE9BQU8sRUFBRSxhQUFhLEVBQUUsWUFBWSxFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDL0UsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sK0NBQStDLENBQUM7QUFDakYs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QztRQUN0RixDQUFDO1FBRUQsc0NBQXNDO1FBQ3RDLE1BQU0sY0FBYyxHQUFHLEtBQUssQ0FBQyxTQUFTO2FBQ25DLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQzthQUNWLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLEtBQUssU0FBUyxDQUFDLENBQUM7UUFDeEMsSUFBSSxjQUFjLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQzlCLFdBQVcsQ0FBQyxJQUFJLENBQUMsc0JBQXNCLGNBQWMsQ0FBQyxNQUFNLG9CQUFvQixDQUFDLENBQUM7UUFDcEYsQ0FBQztRQUVELE9BQU8sV0FBVyxDQUFDO0lBQ3JCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEFnZW50TWFuYWdlciAtIFJlZmFjdG9yZWQgdG8gZXh0ZW5kIEJhc2VFbGVtZW50TWFuYWdlclxuICogTWFuYWdlcyBhZ2VudCBDUlVEIG9wZXJhdGlvbnMsIG1ldGFkYXRhIHNhbml0aXphdGlvbiwgYW5kIHN0YXRlIHBlcnNpc3RlbmNlLlxuICovXG5cbmltcG9ydCB7IEZpbGVPcGVyYXRpb25zU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL0ZpbGVPcGVyYXRpb25zU2VydmljZS5qcyc7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuXG5pbXBvcnQgeyBBZ2VudCB9IGZyb20gJy4vQWdlbnQuanMnO1xuaW1wb3J0IHtcbiAgQ09NTUlUX1BFUlNJU1RFRF9WRVJTSU9OLFxuICBBR0VOVF9MSU1JVFMsXG4gIFJJU0tfVE9MRVJBTkNFX0xFVkVMUyxcbiAgU1RFUF9MSU1JVF9BQ1RJT05TLFxuICBFWEVDVVRJT05fRkFJTFVSRV9BQ1RJT05TLFxuICBCQUNLT0ZGX1NUUkFURUdJRVMsXG4gIGlzT25lT2YsXG4gIG5vcm1hbGl6ZUF1dG9ub215S2V5cyxcbiAgbm9ybWFsaXplUmVzaWxpZW5jZUtleXMsXG4gIG5vcm1hbGl6ZUdvYWxLZXlzLFxufSBmcm9tICcuL2NvbnN0YW50cy5qcyc7XG5pbXBvcnQge1xuICBBZ2VudE1ldGFkYXRhLFxuICBBZ2VudFN0YXRlLFxuICBFeGVjdXRlQWdlbnRSZXN1bHQsXG4gIEFnZW50R29hbENvbmZpZyxcbiAgQWdlbnRHb2FsUGFyYW1ldGVyLFxuICBBZ2VudE1ldGFkYXRhVjIsXG4gIEFnZW50R29hbCxcbiAgREVGQVVMVF9TQUZFVFlfQ09ORklHLFxuICBFeGVjdXRpb25Db250ZXh0LFxuICBBdXRvbm9teURpcmVjdGl2ZSxcbn0gZnJvbSAnLi90eXBlcy5qcyc7XG5pbXBvcnQgeyBnZXRHYXRoZXJlZERhdGEsIHR5cGUgR2F0aGVyZWREYXRhIH0gZnJvbSAnLi9nYXRoZXJlZERhdGEuanMnO1xuaW1wb3J0IHsgZXZhbHVhdGVBdXRvbm9teSB9IGZyb20gJy4vYXV0b25vbXlFdmFsdWF0b3IuanMnO1xuaW1wb3J0IHtcbiAgaXNWMUFnZW50LFxuICBjb252ZXJ0VjFUb1YyLFxufSBmcm9tICcuL3YxVG9WMkNvbnZlcnRlci5qcyc7XG5pbXBvcnQge1xuICBkZXRlcm1pbmVTYWZldHlUaWVyLFxuICBjcmVhdGVWZXJpZmljYXRpb25DaGFsbGVuZ2UsXG4gIGNyZWF0ZUNvbmZpcm1hdGlvblJlcXVlc3QsXG4gIGNyZWF0ZURhbmdlclpvbmVPcGVyYXRpb24sXG4gIGNyZWF0ZUV4ZWN1dGlvbkNvbnRleHQsXG59IGZyb20gJy4vc2FmZXR5VGllclNlcnZpY2UuanMnO1xuaW1wb3J0IHsgQmFzZUVsZW1lbnRNYW5hZ2VyIH0gZnJvbSAnLi4vYmFzZS9CYXNlRWxlbWVudE1hbmFnZXIuanMnO1xuaW1wb3J0IHsgRWxlbWVudFR5cGUgfSBmcm9tICcuLi8uLi9wb3J0Zm9saW8vdHlwZXMuanMnO1xuaW1wb3J0IHsgdG9TaW5ndWxhckxhYmVsIH0gZnJvbSAnLi4vLi4vdXRpbHMvZWxlbWVudFR5cGVOb3JtYWxpemF0aW9uLmpzJztcbmltcG9ydCB7IHNhbml0aXplSW5wdXQsIHZhbGlkYXRlUGF0aCB9IGZyb20gJy4uLy4uL3NlY3VyaXR5L0lucHV0VmFsaWRhdG9yLmpzJztcbmltcG9ydCB7IFVuaWNvZGVWYWxpZGF0b3IgfSBmcm9tICcuLi8uLi9zZWN1cml0eS92YWxpZGF0b3JzL3VuaWNvZGVWYWxpZGF0b3IuanMnO1xuaW1wb3J0IHsgU2VjdXJpdHlNb25pdG9yIH0gZnJvbSAnLi4vLi4vc2VjdXJpdHkvc2VjdXJpdHlNb25pdG9yLmpzJztcbmltcG9ydCB7IENvbnRlbnRWYWxpZGF0b3IgfSBmcm9tICcuLi8uLi9zZWN1cml0eS9jb250ZW50VmFsaWRhdG9yLmpzJztcbmltcG9ydCB7IElucHV0Tm9ybWFsaXplciB9IGZyb20gJy4uLy4uL3NlY3VyaXR5L0lucHV0Tm9ybWFsaXplci5qcyc7XG5pbXBvcnQgeyBTYWZlUmVnZXggfSBmcm9tICcuLi8uLi9zZWN1cml0eS9kb3NQcm90ZWN0aW9uLmpzJztcbmltcG9ydCB7IEZpbGVMb2NrTWFuYWdlciB9IGZyb20gJy4uLy4uL3NlY3VyaXR5L2ZpbGVMb2NrTWFuYWdlci5qcyc7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi8uLi91dGlscy9sb2dnZXIuanMnO1xuaW1wb3J0IHsgUG9ydGZvbGlvTWFuYWdlciB9IGZyb20gJy4uLy4uL3BvcnRmb2xpby9Qb3J0Zm9saW9NYW5hZ2VyLmpzJztcbmltcG9ydCB7IFZhbGlkYXRpb25SZWdpc3RyeSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3ZhbGlkYXRpb24vVmFsaWRhdGlvblJlZ2lzdHJ5LmpzJztcbmltcG9ydCB7IFRyaWdnZXJWYWxpZGF0aW9uU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3ZhbGlkYXRpb24vVHJpZ2dlclZhbGlkYXRpb25TZXJ2aWNlLmpzJztcbmltcG9ydCB7IFZhbGlkYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvdmFsaWRhdGlvbi9WYWxpZGF0aW9uU2VydmljZS5qcyc7XG5pbXBvcnQgeyBTZXJpYWxpemF0aW9uU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL1NlcmlhbGl6YXRpb25TZXJ2aWNlLmpzJztcbmltcG9ydCB7IE1ldGFkYXRhU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL01ldGFkYXRhU2VydmljZS5qcyc7XG5pbXBvcnQgeyBGaWxlV2F0Y2hTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvRmlsZVdhdGNoU2VydmljZS5qcyc7XG5pbXBvcnQgeyBFbGVtZW50TWVzc2FnZXMgfSBmcm9tICcuLi8uLi91dGlscy9lbGVtZW50TWVzc2FnZXMuanMnO1xuaW1wb3J0IHsgRWxlbWVudE5vdEZvdW5kRXJyb3IgfSBmcm9tICcuLi8uLi91dGlscy9FcnJvckhhbmRsZXIuanMnO1xuaW1wb3J0IHsgc2FuaXRpemVHYXRla2VlcGVyUG9saWN5IH0gZnJvbSAnLi4vLi4vaGFuZGxlcnMvbWNwLWFxbC9wb2xpY2llcy9FbGVtZW50UG9saWNpZXMuanMnO1xuaW1wb3J0IHsgU0VDVVJJVFlfTElNSVRTIH0gZnJvbSAnLi4vLi4vc2VjdXJpdHkvY29uc3RhbnRzLmpzJztcblxuY29uc3QgQUdFTlRfRklMRV9FWFRFTlNJT04gPSAnLm1kJztcbmNvbnN0IFNUQVRFX0RJUkVDVE9SWSA9ICcuc3RhdGUnO1xuY29uc3QgU1RBVEVfRklMRV9FWFRFTlNJT04gPSAnLnN0YXRlLnlhbWwnO1xuY29uc3QgTUFYX1lBTUxfU0laRSA9IDY0ICogMTAyNDtcbmNvbnN0IE1BWF9GSUxFX1NJWkUgPSAxMDAgKiAxMDI0O1xuXG4vLyBJc3N1ZSAjODM6IENlbnRyYWxpemVkIGFjdGl2ZSBlbGVtZW50IGxpbWl0cyAoY29uZmlndXJhYmxlIHZpYSBlbnYgdmFycylcbmltcG9ydCB7IGdldEFjdGl2ZUVsZW1lbnRMaW1pdENvbmZpZywgZ2V0TWF4QWN0aXZlTGltaXQgfSBmcm9tICcuLi8uLi9jb25maWcvYWN0aXZlLWVsZW1lbnQtbGltaXRzLmpzJztcblxuaW50ZXJmYWNlIEVsZW1lbnRDcmVhdGlvblJlc3VsdCB7XG4gIHN1Y2Nlc3M6IGJvb2xlYW47XG4gIG1lc3NhZ2U6IHN0cmluZztcbiAgZWxlbWVudD86IEFnZW50O1xufVxuXG5pbnRlcmZhY2UgUGFyc2VkQWdlbnRGaWxlIHtcbiAgbWV0YWRhdGE6IEFnZW50TWV0YWRhdGE7XG4gIGNvbnRlbnQ6IHN0cmluZztcbn1cblxuZXhwb3J0IGNsYXNzIEFnZW50TWFuYWdlciBleHRlbmRzIEJhc2VFbGVtZW50TWFuYWdlcjxBZ2VudD4ge1xuICBwcml2YXRlIHJlYWRvbmx5IHN0YXRlRGlyOiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgc3RhdGVDYWNoZTogTWFwPHN0cmluZywgQWdlbnRTdGF0ZT4gPSBuZXcgTWFwKCk7XG4gIHByaXZhdGUgdHJpZ2dlclZhbGlkYXRpb25TZXJ2aWNlOiBUcmlnZ2VyVmFsaWRhdGlvblNlcnZpY2U7XG4gIHByaXZhdGUgdmFsaWRhdGlvblNlcnZpY2U6IFZhbGlkYXRpb25TZXJ2aWNlO1xuICBwcml2YXRlIHNlcmlhbGl6YXRpb25TZXJ2aWNlOiBTZXJpYWxpemF0aW9uU2VydmljZTtcbiAgcHJpdmF0ZSBtZXRhZGF0YVNlcnZpY2U6IE1ldGFkYXRhU2VydmljZTtcbiAgLy8gVHJhY2sgYWN0aXZlIGFnZW50cyBieSBuYW1lIChzdGFibGUgaWRlbnRpZmllcilcbiAgcHJpdmF0ZSBhY3RpdmVBZ2VudE5hbWVzOiBTZXQ8c3RyaW5nPiA9IG5ldyBTZXQoKTtcblxuICAvLyBTdGF0aWMgcmVzb2x2ZXIgZm9yIGVsZW1lbnQgbWFuYWdlciBsb29rdXAgKERJIHBhdHRlcm4pXG4gIC8vIFRoaXMgYWxsb3dzIEFnZW50IGluc3RhbmNlcyB0byByZXNvbHZlIG1hbmFnZXJzIHdpdGhvdXQgdGlnaHQgY291cGxpbmdcbiAgcHJpdmF0ZSBzdGF0aWMgZWxlbWVudE1hbmFnZXJSZXNvbHZlcj86IChtYW5hZ2VyTmFtZTogc3RyaW5nKSA9PiBhbnk7XG5cbiAgLy8gSXNzdWUgIzQwMjogU3RhdGljIHJlc29sdmVyIGZvciBEYW5nZXJab25lRW5mb3JjZXIgKERJIHBhdHRlcm4pXG4gIHByaXZhdGUgc3RhdGljIGRhbmdlclpvbmVFbmZvcmNlclJlc29sdmVyPzogKCkgPT4gaW1wb3J0KCcuL3R5cGVzLmpzJykuRGFuZ2VyWm9uZUJsb2NrZXI7XG5cbiAgLy8gSXNzdWUgIzE0MjogU3RhdGljIHJlc29sdmVyIGZvciBWZXJpZmljYXRpb25TdG9yZSAoREkgcGF0dGVybilcbiAgcHJpdmF0ZSBzdGF0aWMgdmVyaWZpY2F0aW9uU3RvcmVSZXNvbHZlcj86ICgpID0+IHsgc2V0OiAoaWQ6IHN0cmluZywgY2hhbGxlbmdlOiB7IGNvZGU6IHN0cmluZzsgZXhwaXJlc0F0OiBudW1iZXI7IHJlYXNvbjogc3RyaW5nIH0pID0+IHZvaWQgfTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwb3J0Zm9saW9NYW5hZ2VyOiBQb3J0Zm9saW9NYW5hZ2VyLFxuICAgIGZpbGVMb2NrTWFuYWdlcjogRmlsZUxvY2tNYW5hZ2VyLFxuICAgIGJhc2VEaXI6IHN0cmluZyxcbiAgICBmaWxlT3BlcmF0aW9uc1NlcnZpY2U6IEZpbGVPcGVyYXRpb25zU2VydmljZSxcbiAgICB2YWxpZGF0aW9uUmVnaXN0cnk6IFZhbGlkYXRpb25SZWdpc3RyeSxcbiAgICBzZXJpYWxpemF0aW9uU2VydmljZTogU2VyaWFsaXphdGlvblNlcnZpY2UsXG4gICAgbWV0YWRhdGFTZXJ2aWNlOiBNZXRhZGF0YVNlcnZpY2UsXG4gICAgZmlsZVdhdGNoU2VydmljZT86IEZpbGVXYXRjaFNlcnZpY2UsXG4gICAgbWVtb3J5QnVkZ2V0PzogaW1wb3J0KCcuLi8uLi9jYWNoZS9DYWNoZU1lbW9yeUJ1ZGdldC5qcycpLkNhY2hlTWVtb3J5QnVkZ2V0LFxuICAgIGJhY2t1cFNlcnZpY2U/OiBpbXBvcnQoJy4uLy4uL3NlcnZpY2VzL0JhY2t1cFNlcnZpY2UuanMnKS5CYWNrdXBTZXJ2aWNlXG4gICkge1xuICAgIGNvbnN0IGVsZW1lbnREaXJPdmVycmlkZSA9IHBhdGguam9pbihiYXNlRGlyLCBFbGVtZW50VHlwZS5BR0VOVCk7XG4gICAgc3VwZXIoRWxlbWVudFR5cGUuQUdFTlQsIHBvcnRmb2xpb01hbmFnZXIsIGZpbGVMb2NrTWFuYWdlciwgeyBlbGVtZW50RGlyT3ZlcnJpZGUsIGZpbGVXYXRjaFNlcnZpY2UsIG1lbW9yeUJ1ZGdldCwgYmFja3VwU2VydmljZSB9LCBmaWxlT3BlcmF0aW9uc1NlcnZpY2UsIHZhbGlkYXRpb25SZWdpc3RyeSk7XG4gICAgdGhpcy5zdGF0ZURpciA9IHBhdGguam9pbih0aGlzLmVsZW1lbnREaXIsIFNUQVRFX0RJUkVDVE9SWSk7XG4gICAgdGhpcy50cmlnZ2VyVmFsaWRhdGlvblNlcnZpY2UgPSB2YWxpZGF0aW9uUmVnaXN0cnkuZ2V0VHJpZ2dlclZhbGlkYXRpb25TZXJ2aWNlKCk7XG4gICAgdGhpcy52YWxpZGF0aW9uU2VydmljZSA9IHZhbGlkYXRpb25SZWdpc3RyeS5nZXRWYWxpZGF0aW9uU2VydmljZSgpO1xuICAgIHRoaXMuc2VyaWFsaXphdGlvblNlcnZpY2UgPSBzZXJpYWxpemF0aW9uU2VydmljZTtcbiAgICB0aGlzLm1ldGFkYXRhU2VydmljZSA9IG1ldGFkYXRhU2VydmljZTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBnZXRFbGVtZW50TGFiZWwoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gJ2FnZW50JztcbiAgfVxuXG4gIC8qKlxuICAgKiBDb25maWd1cmUgdGhlIGVsZW1lbnQgbWFuYWdlciByZXNvbHZlciBmb3IgZWxlbWVudC1hZ25vc3RpYyBhY3RpdmF0aW9uXG4gICAqIFRoaXMgaXMgY2FsbGVkIGJ5IHRoZSBESSBjb250YWluZXIgZHVyaW5nIGluaXRpYWxpemF0aW9uXG4gICAqIEZvbGxvd3MgdGhlIHNhbWUgcGF0dGVybiBhcyBNZW1vcnkuY29uZmlndXJlTWVtb3J5TWFuYWdlclJlc29sdmVyXG4gICAqXG4gICAqIEBwYXJhbSByZXNvbHZlciBGdW5jdGlvbiB0aGF0IHRha2VzIGEgbWFuYWdlciBuYW1lIGFuZCByZXR1cm5zIHRoZSBtYW5hZ2VyIGluc3RhbmNlXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHNldEVsZW1lbnRNYW5hZ2VyUmVzb2x2ZXIocmVzb2x2ZXI6IChtYW5hZ2VyTmFtZTogc3RyaW5nKSA9PiBhbnkpOiB2b2lkIHtcbiAgICBBZ2VudE1hbmFnZXIuZWxlbWVudE1hbmFnZXJSZXNvbHZlciA9IHJlc29sdmVyO1xuICB9XG5cbiAgLyoqXG4gICAqIElzc3VlICM0MDI6IFNldCBEYW5nZXJab25lRW5mb3JjZXIgcmVzb2x2ZXIgZm9yIERJIGluamVjdGlvbi5cbiAgICogQ2FsbGVkIGJ5IHRoZSBESSBjb250YWluZXIgZHVyaW5nIGluaXRpYWxpemF0aW9uLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBzZXREYW5nZXJab25lRW5mb3JjZXJSZXNvbHZlcihyZXNvbHZlcjogKCkgPT4gaW1wb3J0KCcuL3R5cGVzLmpzJykuRGFuZ2VyWm9uZUJsb2NrZXIpOiB2b2lkIHtcbiAgICBBZ2VudE1hbmFnZXIuZGFuZ2VyWm9uZUVuZm9yY2VyUmVzb2x2ZXIgPSByZXNvbHZlcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBJc3N1ZSAjMTQyOiBTZXQgVmVyaWZpY2F0aW9uU3RvcmUgcmVzb2x2ZXIgZm9yIERJIGluamVjdGlvbi5cbiAgICogQ2FsbGVkIGJ5IHRoZSBESSBjb250YWluZXIgZHVyaW5nIGluaXRpYWxpemF0aW9uLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBzZXRWZXJpZmljYXRpb25TdG9yZVJlc29sdmVyKHJlc29sdmVyOiAoKSA9PiB7IHNldDogKGlkOiBzdHJpbmcsIGNoYWxsZW5nZTogeyBjb2RlOiBzdHJpbmc7IGV4cGlyZXNBdDogbnVtYmVyOyByZWFzb246IHN0cmluZyB9KSA9PiB2b2lkIH0pOiB2b2lkIHtcbiAgICBBZ2VudE1hbmFnZXIudmVyaWZpY2F0aW9uU3RvcmVSZXNvbHZlciA9IHJlc29sdmVyO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgZWxlbWVudCBtYW5hZ2VyIHJlc29sdmVyXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBnZXRFbGVtZW50TWFuYWdlclJlc29sdmVyKCk6ICgobWFuYWdlck5hbWU6IHN0cmluZykgPT4gYW55KSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIEFnZW50TWFuYWdlci5lbGVtZW50TWFuYWdlclJlc29sdmVyO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc2V0IHN0YXRpYyByZXNvbHZlcnMgKGZvciB0ZXN0IGNsZWFudXApXG4gICAqIENhbGwgdGhpcyBpbiBhZnRlckVhY2ggaG9va3MgdG8gcHJldmVudCB0ZXN0IGlzb2xhdGlvbiBpc3N1ZXNcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgcmVzZXRSZXNvbHZlcnMoKTogdm9pZCB7XG4gICAgQWdlbnRNYW5hZ2VyLmVsZW1lbnRNYW5hZ2VyUmVzb2x2ZXIgPSB1bmRlZmluZWQ7XG4gICAgQWdlbnRNYW5hZ2VyLmRhbmdlclpvbmVFbmZvcmNlclJlc29sdmVyID0gdW5kZWZpbmVkO1xuICAgIEFnZW50TWFuYWdlci52ZXJpZmljYXRpb25TdG9yZVJlc29sdmVyID0gdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIFByZXBhcmUgZGlyZWN0b3J5IHN0cnVjdHVyZSBmb3IgYWdlbnRzIGFuZCBzdGF0ZSBmaWxlcy5cbiAgICovXG4gIGFzeW5jIGluaXRpYWxpemUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5maWxlT3BlcmF0aW9ucy5jcmVhdGVEaXJlY3RvcnkodGhpcy5lbGVtZW50RGlyKTtcbiAgICBhd2FpdCB0aGlzLmZpbGVPcGVyYXRpb25zLmNyZWF0ZURpcmVjdG9yeSh0aGlzLnN0YXRlRGlyKTtcbiAgICBsb2dnZXIuaW5mbygnQWdlbnRNYW5hZ2VyIGluaXRpYWxpemVkJywgeyBwYXRoOiB0aGlzLmVsZW1lbnREaXIgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgbmV3IGFnZW50IG9uIGRpc2suXG4gICAqL1xuICBhc3luYyBjcmVhdGUoXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmcsXG4gICAgY29udGVudDogc3RyaW5nLFxuICAgIG1ldGFkYXRhPzogUGFydGlhbDxBZ2VudE1ldGFkYXRhPiAmIHsgY29udGVudD86IHN0cmluZyB9XG4gICk6IFByb21pc2U8RWxlbWVudENyZWF0aW9uUmVzdWx0PiB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuaW5pdGlhbGl6ZSgpO1xuXG4gICAgICAvLyBOb3JtYWxpemUgZ29hbCBpbnB1dCBiZWZvcmUgdmFsaWRhdGlvbiAtIExMTXMgbWF5IHBhc3Mgc3RyaW5nIG9yIG9iamVjdFxuICAgICAgLy8gU3RyaXAgJ2NvbnRlbnQnIGZyb20gbWV0YWRhdGEgdG8gcHJldmVudCBpdCBmcm9tIG92ZXJ3cml0aW5nIHRoZSBwb3NpdGlvbmFsXG4gICAgICAvLyBjb250ZW50IHBhcmFtICh3aGljaCBpcyB0aGUgYWdlbnQncyBpbnN0cnVjdGlvbnMgdGV4dCkgaW4gdGhlIHZhbGlkYXRpb24gY2FsbC5cbiAgICAgIGNvbnN0IHsgY29udGVudDogX3JlZmVyZW5jZUNvbnRlbnQsIC4uLm1ldGFkYXRhV2l0aG91dENvbnRlbnQgfSA9IChtZXRhZGF0YSB8fCB7fSkgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgICBjb25zdCBub3JtYWxpemVkTWV0YWRhdGE6IFBhcnRpYWw8QWdlbnRNZXRhZGF0YVYyPiA9IHsgLi4ubWV0YWRhdGFXaXRob3V0Q29udGVudCB9IGFzIFBhcnRpYWw8QWdlbnRNZXRhZGF0YVYyPjtcbiAgICAgIGlmICgobWV0YWRhdGEgYXMgUGFydGlhbDxBZ2VudE1ldGFkYXRhVjI+KT8uZ29hbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIG5vcm1hbGl6ZWRNZXRhZGF0YS5nb2FsID0gdGhpcy5ub3JtYWxpemVHb2FsSW5wdXQoXG4gICAgICAgICAgKG1ldGFkYXRhIGFzIFBhcnRpYWw8QWdlbnRNZXRhZGF0YVYyPikuZ29hbCBhcyBzdHJpbmcgfCBQYXJ0aWFsPEFnZW50R29hbENvbmZpZz5cbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgLy8gVXNlIHNwZWNpYWxpemVkIHZhbGlkYXRvciBmb3IgaW5wdXQgdmFsaWRhdGlvblxuICAgICAgLy8gSW5jbHVkZSBtZXRhZGF0YSB0byB2YWxpZGF0ZSBWMiBmaWVsZHMgKGdvYWwsIGFjdGl2YXRlcywgdG9vbHMsIHN5c3RlbVByb21wdCwgYXV0b25vbXkpXG4gICAgICBjb25zdCB2YWxpZGF0aW9uUmVzdWx0ID0gYXdhaXQgdGhpcy52YWxpZGF0b3IudmFsaWRhdGVDcmVhdGUoe1xuICAgICAgICBuYW1lLFxuICAgICAgICBkZXNjcmlwdGlvbixcbiAgICAgICAgY29udGVudCxcbiAgICAgICAgLi4ubm9ybWFsaXplZE1ldGFkYXRhXG4gICAgICB9KTtcblxuICAgICAgaWYgKCF2YWxpZGF0aW9uUmVzdWx0LmlzVmFsaWQpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgICBtZXNzYWdlOiBgVmFsaWRhdGlvbiBmYWlsZWQ6ICR7dmFsaWRhdGlvblJlc3VsdC5lcnJvcnMuam9pbignLCAnKX1gXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIC8vIExvZyB3YXJuaW5ncyBpZiBhbnlcbiAgICAgIGlmICh2YWxpZGF0aW9uUmVzdWx0Lndhcm5pbmdzICYmIHZhbGlkYXRpb25SZXN1bHQud2FybmluZ3MubGVuZ3RoID4gMCkge1xuICAgICAgICBsb2dnZXIud2FybihgQWdlbnQgY3JlYXRpb24gd2FybmluZ3M6ICR7dmFsaWRhdGlvblJlc3VsdC53YXJuaW5ncy5qb2luKCcsICcpfWApO1xuICAgICAgfVxuXG4gICAgICAvLyBTYW5pdGl6ZSBpbnB1dHMgZm9yIGVsZW1lbnQgY3JlYXRpb25cbiAgICAgIGNvbnN0IHNhbml0aXplZE5hbWUgPSBzYW5pdGl6ZUlucHV0KFVuaWNvZGVWYWxpZGF0b3Iubm9ybWFsaXplKG5hbWUpLm5vcm1hbGl6ZWRDb250ZW50LCAxMDApO1xuICAgICAgY29uc3Qgc2FuaXRpemVkRGVzY3JpcHRpb24gPSBzYW5pdGl6ZUlucHV0KFVuaWNvZGVWYWxpZGF0b3Iubm9ybWFsaXplKGRlc2NyaXB0aW9uKS5ub3JtYWxpemVkQ29udGVudCwgNTAwKTtcbiAgICAgIC8vIFVzZSBDb250ZW50VmFsaWRhdG9yIGZvciBtdWx0aS1saW5lIGNvbnRlbnQgdG8gcHJlc2VydmUgZm9ybWF0dGluZyAobmV3bGluZXMsIHRhYnMpXG4gICAgICAvLyB3aGlsZSBzdGlsbCBkZXRlY3RpbmcgcHJvbXB0IGluamVjdGlvbiBhdHRhY2tzXG4gICAgICBjb25zdCBjb250ZW50VmFsaWRhdGlvbiA9IENvbnRlbnRWYWxpZGF0b3IudmFsaWRhdGVBbmRTYW5pdGl6ZShjb250ZW50LCB7IG1heExlbmd0aDogU0VDVVJJVFlfTElNSVRTLk1BWF9DT05URU5UX0xFTkdUSCwgY29udGVudENvbnRleHQ6ICdhZ2VudCcgfSk7XG4gICAgICBjb25zdCBzYW5pdGl6ZWRJbnN0cnVjdGlvbnMgPSBjb250ZW50VmFsaWRhdGlvbi5zYW5pdGl6ZWRDb250ZW50IHx8ICcnO1xuXG4gICAgICBpZiAoIXRoaXMudmFsaWRhdGVFbGVtZW50TmFtZShzYW5pdGl6ZWROYW1lKSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICAgIG1lc3NhZ2U6ICdJbnZhbGlkIGFnZW50IG5hbWUuIFVzZSBvbmx5IGxldHRlcnMsIG51bWJlcnMsIGh5cGhlbnMsIGFuZCB1bmRlcnNjb3Jlcy4nXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGZpbGVuYW1lID0gdGhpcy5nZXRGaWxlbmFtZShzYW5pdGl6ZWROYW1lKTtcbiAgICAgIGNvbnN0IGFnZW50ID0gbmV3IEFnZW50KHtcbiAgICAgICAgLi4ubm9ybWFsaXplZE1ldGFkYXRhLFxuICAgICAgICBuYW1lOiBzYW5pdGl6ZWROYW1lLFxuICAgICAgICBkZXNjcmlwdGlvbjogc2FuaXRpemVkRGVzY3JpcHRpb25cbiAgICAgIH0sIHRoaXMubWV0YWRhdGFTZXJ2aWNlKTtcblxuICAgICAgYWdlbnQubWV0YWRhdGEuYXV0aG9yID0gbm9ybWFsaXplZE1ldGFkYXRhPy5hdXRob3IgPz8gdGhpcy5nZXRDdXJyZW50VXNlckZvckF0dHJpYnV0aW9uKCk7XG4gICAgICBhZ2VudC5leHRlbnNpb25zID0ge1xuICAgICAgICAuLi5hZ2VudC5leHRlbnNpb25zLFxuICAgICAgICBzcGVjaWFsaXphdGlvbnM6IG5vcm1hbGl6ZWRNZXRhZGF0YT8uc3BlY2lhbGl6YXRpb25zID8/IGFnZW50LmV4dGVuc2lvbnM/LnNwZWNpYWxpemF0aW9ucyA/PyBbXSxcbiAgICAgICAgZGVjaXNpb25GcmFtZXdvcms6IG5vcm1hbGl6ZWRNZXRhZGF0YT8uZGVjaXNpb25GcmFtZXdvcmsgPz8gYWdlbnQuZXh0ZW5zaW9ucz8uZGVjaXNpb25GcmFtZXdvcmssXG4gICAgICAgIHJpc2tUb2xlcmFuY2U6IG5vcm1hbGl6ZWRNZXRhZGF0YT8ucmlza1RvbGVyYW5jZSA/PyBhZ2VudC5leHRlbnNpb25zPy5yaXNrVG9sZXJhbmNlLFxuICAgICAgICBsZWFybmluZ0VuYWJsZWQ6IG5vcm1hbGl6ZWRNZXRhZGF0YT8ubGVhcm5pbmdFbmFibGVkID8/IGFnZW50LmV4dGVuc2lvbnM/LmxlYXJuaW5nRW5hYmxlZCxcbiAgICAgIH07XG4gICAgICAvLyBQcm9tb3RlIGluc3RydWN0aW9ucyB0byBmaXJzdC1jbGFzcyBwcm9wZXJ0eSAobm8gbG9uZ2VyIGluIGV4dGVuc2lvbnMpXG4gICAgICBhZ2VudC5pbnN0cnVjdGlvbnMgPSBzYW5pdGl6ZWRJbnN0cnVjdGlvbnM7XG4gICAgICAvLyBBbHNvIGtlZXAgaW4gZXh0ZW5zaW9ucyBmb3IgYmFja3dhcmQgY29tcGF0IGR1cmluZyB0cmFuc2l0aW9uXG4gICAgICBhZ2VudC5leHRlbnNpb25zLmluc3RydWN0aW9ucyA9IHNhbml0aXplZEluc3RydWN0aW9ucztcblxuICAgICAgLy8gU2V0IHJlZmVyZW5jZSBjb250ZW50IGlmIHByb3ZpZGVkICh2Mi4wIGR1YWwtZmllbGQgYXJjaGl0ZWN0dXJlKVxuICAgICAgY29uc3QgcmVmZXJlbmNlQ29udGVudCA9IChtZXRhZGF0YSBhcyB7IGNvbnRlbnQ/OiBzdHJpbmcgfSB8IHVuZGVmaW5lZCk/LmNvbnRlbnQ7XG4gICAgICBpZiAocmVmZXJlbmNlQ29udGVudCkge1xuICAgICAgICBjb25zdCBjb250ZW50VmFsaWRhdGlvblJlc3VsdCA9IENvbnRlbnRWYWxpZGF0b3IudmFsaWRhdGVBbmRTYW5pdGl6ZShcbiAgICAgICAgICBTdHJpbmcocmVmZXJlbmNlQ29udGVudCksXG4gICAgICAgICAgeyBtYXhMZW5ndGg6IFNFQ1VSSVRZX0xJTUlUUy5NQVhfQ09OVEVOVF9MRU5HVEgsIGNvbnRlbnRDb250ZXh0OiAnYWdlbnQnIH1cbiAgICAgICAgKTtcbiAgICAgICAgYWdlbnQuY29udGVudCA9IGNvbnRlbnRWYWxpZGF0aW9uUmVzdWx0LnNhbml0aXplZENvbnRlbnQgfHwgJyc7XG4gICAgICB9XG5cbiAgICAgIC8vIElzc3VlICM3Mjc6IFZhbGlkYXRlIGFuZCBub3JtYWxpemUgVjIgZmllbGRzIEJFRk9SRSBhc3NpZ25tZW50LlxuICAgICAgLy8gVGhpcyBpcyB0aGUgU0VDT05EIHZhbGlkYXRpb24gbGF5ZXIg4oCUIEFnZW50RWxlbWVudFZhbGlkYXRvciAoY2FsbGVkIGFib3ZlIHZpYVxuICAgICAgLy8gdGhpcy52YWxpZGF0b3IudmFsaWRhdGVDcmVhdGUpIGlzIHRoZSBmaXJzdC4gVGhlIHZhbGlkYXRvciBjYXRjaGVzIGNhbWVsQ2FzZVxuICAgICAgLy8gaW52YWxpZCB2YWx1ZXM7IHRoaXMgbWV0aG9kIGFsc28gbm9ybWFsaXplcyBzbmFrZV9jYXNlIGtleXMgKHdoaWNoIHRoZSB2YWxpZGF0b3JcbiAgICAgIC8vIGRvZXNuJ3Qgc2VlKSBhbmQgdmFsaWRhdGVzIHRoZW0uIEJvdGggbGF5ZXJzIGFyZSBuZWVkZWQuIFNlZSBJc3N1ZSAjNzMwLlxuICAgICAgY29uc3QgbWV0YWRhdGFWMiA9IG5vcm1hbGl6ZWRNZXRhZGF0YSBhcyBQYXJ0aWFsPEFnZW50TWV0YWRhdGFWMj4gfCB1bmRlZmluZWQ7XG4gICAgICBpZiAobWV0YWRhdGFWMikge1xuICAgICAgICBjb25zdCB2MkVycm9ycyA9IHRoaXMudmFsaWRhdGVWMkZpZWxkc0ZvckNyZWF0ZShtZXRhZGF0YVYyKTtcbiAgICAgICAgaWYgKHYyRXJyb3JzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgICBtZXNzYWdlOiBgVjIgZmllbGQgdmFsaWRhdGlvbiBmYWlsZWQ6ICR7djJFcnJvcnMuam9pbignOyAnKX1gXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBWMiBGSUVMRFM6IFN0b3JlIFYyLXNwZWNpZmljIGZpZWxkcyBpbiBhZ2VudCBtZXRhZGF0YSAobm90IGp1c3QgZXh0ZW5zaW9ucylcbiAgICAgIC8vIFRoaXMgZW5hYmxlcyBWMiBhZ2VudCBjcmVhdGlvbiB2aWEgTUNQLUFRTCBjcmVhdGVfZWxlbWVudCBvcGVyYXRpb25cbiAgICAgIGlmIChtZXRhZGF0YVYyPy5nb2FsKSB7XG4gICAgICAgIChhZ2VudC5tZXRhZGF0YSBhcyBBZ2VudE1ldGFkYXRhVjIpLmdvYWwgPSBtZXRhZGF0YVYyLmdvYWw7XG4gICAgICB9XG4gICAgICBpZiAobWV0YWRhdGFWMj8uYWN0aXZhdGVzKSB7XG4gICAgICAgIChhZ2VudC5tZXRhZGF0YSBhcyBBZ2VudE1ldGFkYXRhVjIpLmFjdGl2YXRlcyA9IG1ldGFkYXRhVjIuYWN0aXZhdGVzO1xuICAgICAgfVxuICAgICAgaWYgKG1ldGFkYXRhVjI/LnRvb2xzKSB7XG4gICAgICAgIChhZ2VudC5tZXRhZGF0YSBhcyBBZ2VudE1ldGFkYXRhVjIpLnRvb2xzID0gbWV0YWRhdGFWMi50b29scztcbiAgICAgIH1cbiAgICAgIGlmIChtZXRhZGF0YVYyPy5zeXN0ZW1Qcm9tcHQpIHtcbiAgICAgICAgKGFnZW50Lm1ldGFkYXRhIGFzIEFnZW50TWV0YWRhdGFWMikuc3lzdGVtUHJvbXB0ID0gbWV0YWRhdGFWMi5zeXN0ZW1Qcm9tcHQ7XG4gICAgICB9XG4gICAgICBpZiAobWV0YWRhdGFWMj8uYXV0b25vbXkpIHtcbiAgICAgICAgKGFnZW50Lm1ldGFkYXRhIGFzIEFnZW50TWV0YWRhdGFWMikuYXV0b25vbXkgPSBtZXRhZGF0YVYyLmF1dG9ub215O1xuICAgICAgfVxuICAgICAgLy8gSXNzdWUgIzQ0OTogUGVyc2lzdCBnYXRla2VlcGVyIHBvbGljeSBmb3IgR2F0ZWtlZXBlciBlbmZvcmNlbWVudCBkdXJpbmcgZXhlY3V0aW9uXG4gICAgICBpZiAobWV0YWRhdGFWMj8uZ2F0ZWtlZXBlcikge1xuICAgICAgICAoYWdlbnQubWV0YWRhdGEgYXMgQWdlbnRNZXRhZGF0YVYyKS5nYXRla2VlcGVyID0gbWV0YWRhdGFWMi5nYXRla2VlcGVyO1xuICAgICAgfVxuICAgICAgLy8gSXNzdWUgIzcyMjogUGVyc2lzdCByZXNpbGllbmNlIHBvbGljeSAod2FzIG1pc3NpbmcgZnJvbSBWMiBmaWVsZCBhc3NpZ25tZW50cylcbiAgICAgIGlmIChtZXRhZGF0YVYyPy5yZXNpbGllbmNlKSB7XG4gICAgICAgIChhZ2VudC5tZXRhZGF0YSBhcyBBZ2VudE1ldGFkYXRhVjIpLnJlc2lsaWVuY2UgPSBtZXRhZGF0YVYyLnJlc2lsaWVuY2U7XG4gICAgICB9XG5cbiAgICAgIC8vIElzc3VlICM2MTM6IENoZWNrIG1ldGFkYXRhIG5hbWUgdW5pcXVlbmVzcyAobm90IGp1c3QgZmlsZW5hbWUpXG4gICAgICBjb25zdCBleGlzdGluZ0FnZW50cyA9IGF3YWl0IHRoaXMubGlzdCgpO1xuICAgICAgY29uc3QgZHVwbGljYXRlID0gZXhpc3RpbmdBZ2VudHMuZmluZChhID0+XG4gICAgICAgIGEubWV0YWRhdGEubmFtZS50b0xvd2VyQ2FzZSgpID09PSBzYW5pdGl6ZWROYW1lLnRvTG93ZXJDYXNlKClcbiAgICAgICk7XG4gICAgICBpZiAoZHVwbGljYXRlKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgbWVzc2FnZTogYEFnZW50ICcke3Nhbml0aXplZE5hbWV9JyBhbHJlYWR5IGV4aXN0c2BcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgLy8gU2VyaWFsaXplIHRoZSBhZ2VudCBjb250ZW50IGZpcnN0XG4gICAgICBjb25zdCBzZXJpYWxpemVkQ29udGVudCA9IGF3YWl0IHRoaXMuc2VyaWFsaXplRWxlbWVudChhZ2VudCk7XG4gICAgICBjb25zdCBhYnNvbHV0ZVBhdGggPSB0aGlzLnJlc29sdmVBYnNvbHV0ZVBhdGgoZmlsZW5hbWUpO1xuXG4gICAgICAvLyBVc2UgYXRvbWljIGZpbGUgY3JlYXRpb24gdG8gcHJldmVudCBUT0NUT1UgcmFjZSBjb25kaXRpb25zXG4gICAgICAvLyBUaGlzIHJlcGxhY2VzIHRoZSBwcmV2aW91cyBjaGVjay10aGVuLXdyaXRlIHBhdHRlcm4gd2l0aCBhIHNpbmdsZSBhdG9taWMgb3BlcmF0aW9uXG4gICAgICBjb25zdCBjcmVhdGVkID0gYXdhaXQgdGhpcy5maWxlT3BlcmF0aW9ucy5jcmVhdGVGaWxlRXhjbHVzaXZlKGFic29sdXRlUGF0aCwgc2VyaWFsaXplZENvbnRlbnQsIHtcbiAgICAgICAgc291cmNlOiAnQWdlbnRNYW5hZ2VyLmNyZWF0ZSdcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoIWNyZWF0ZWQpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgICBtZXNzYWdlOiBgQWdlbnQgJyR7c2FuaXRpemVkTmFtZX0nIGFscmVhZHkgZXhpc3RzYFxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICAvLyBDYWNoZSB0aGUgZWxlbWVudCBhZnRlciBzdWNjZXNzZnVsIGNyZWF0aW9uXG4gICAgICB0aGlzLmNhY2hlRWxlbWVudChhZ2VudCwgZmlsZW5hbWUpO1xuICAgICAgLy8gTm90ZTogTm8gcmVsb2FkKCkgaGVyZSDigJQgY2FjaGVFbGVtZW50KCkgc3RvcmVzIHRoZSBlbGVtZW50IGNvcnJlY3RseS5cbiAgICAgIC8vIFNlZSBJc3N1ZSAjNDkxIGZvciB3aHkgUGVyc29uYU1hbmFnZXIncyByZWxvYWQtYWZ0ZXItY3JlYXRlIHdhcyByZW1vdmVkLlxuXG4gICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgIHR5cGU6ICdFTEVNRU5UX0NSRUFURUQnLFxuICAgICAgICBzZXZlcml0eTogJ0xPVycsXG4gICAgICAgIHNvdXJjZTogJ0FnZW50TWFuYWdlci5jcmVhdGUnLFxuICAgICAgICBkZXRhaWxzOiBgQWdlbnQgJyR7c2FuaXRpemVkTmFtZX0nIGNyZWF0ZWRgLFxuICAgICAgICBhZGRpdGlvbmFsRGF0YTogeyBhZ2VudElkOiBhZ2VudC5pZCB9XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc3VjY2VzczogdHJ1ZSxcbiAgICAgICAgbWVzc2FnZTogYPCfpJYgKioke3Nhbml0aXplZE5hbWV9KiogYnkgJHthZ2VudC5tZXRhZGF0YS5hdXRob3IgfHwgJ2Fub255bW91cyd9YCxcbiAgICAgICAgZWxlbWVudDogYWdlbnRcbiAgICAgIH07XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci5lcnJvcignRmFpbGVkIHRvIGNyZWF0ZSBhZ2VudCcsIGVycm9yKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICBtZXNzYWdlOiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6ICdGYWlsZWQgdG8gY3JlYXRlIGFnZW50J1xuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVhZCBhbiBhZ2VudCBieSBuYW1lICh3aXRob3V0IGV4dGVuc2lvbikuXG4gICAqXG4gICAqIEBwYXJhbSBuYW1lIC0gQWdlbnQgbmFtZSAod2l0aG91dCBleHRlbnNpb24pXG4gICAqIEByZXR1cm5zIEFnZW50IGluc3RhbmNlIG9yIG51bGwgaWYgbm90IGZvdW5kXG4gICAqL1xuICBhc3luYyByZWFkKG5hbWU6IHN0cmluZyk6IFByb21pc2U8QWdlbnQgfCBudWxsPiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHNhbml0aXplZE5hbWUgPSBzYW5pdGl6ZUlucHV0KG5hbWUsIDEwMCk7XG4gICAgICBjb25zdCBmaWxlbmFtZSA9IHRoaXMuZ2V0RmlsZW5hbWUoc2FuaXRpemVkTmFtZSk7XG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5sb2FkKGZpbGVuYW1lKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKChlcnJvciBhcyBOb2RlSlMuRXJybm9FeGNlcHRpb24pLmNvZGUgPT09ICdFTk9FTlQnKSB7XG4gICAgICAgIC8vIEZhbGxiYWNrOiBmbGV4aWJsZSBtYXRjaGluZyB2aWEgbGlzdCBzY2FuICgjNjA3KVxuICAgICAgICByZXR1cm4gdGhpcy5yZWFkRmxleGlibHkobmFtZSk7XG4gICAgICB9XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRmFsbGJhY2sgZm9yIHJlYWQoKSB3aGVuIGRpcmVjdCBmaWxlIGxvb2t1cCBmYWlscy5cbiAgICogU2VhcmNoZXMgbG9hZGVkIGFnZW50cyBieSBtZXRhZGF0YSBuYW1lIHVzaW5nIGNhc2UtaW5zZW5zaXRpdmUgYW5kIHNsdWcgbWF0Y2hpbmcuXG4gICAqIExvZ3MgYSB3YXJuaW5nIHdoZW4gYSBtYXRjaCBpcyBmb3VuZCAoaW5kaWNhdGVzIGZpbGVuYW1lL25hbWUgbWlzbWF0Y2ggbmVlZGluZyBjbGVhbnVwKS5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogLy8gRmlsZSBvbiBkaXNrOiBcImxlZ2FjeS1wb3N0ZXItYWdlbnQubWRcIlxuICAgKiAvLyBNZXRhZGF0YSBuYW1lOiBcImxlZ2FjeS1wb3N0ZXJcIlxuICAgKiAvLyBEaXJlY3QgbG9va3VwIGZvciBcImxlZ2FjeS1wb3N0ZXIubWRcIiBmYWlscyAoRU5PRU5UKVxuICAgKiAvLyBGbGV4aWJsZSBmYWxsYmFjayBtYXRjaGVzIHZpYSBtZXRhZGF0YSBuYW1lOlxuICAgKiBjb25zdCBhZ2VudCA9IGF3YWl0IHJlYWQoXCJsZWdhY3ktcG9zdGVyXCIpOyAvLyByZXNvbHZlcyB2aWEgZmFsbGJhY2tcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcmVhZEZsZXhpYmx5KG5hbWU6IHN0cmluZyk6IFByb21pc2U8QWdlbnQgfCBudWxsPiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGFnZW50cyA9IGF3YWl0IHRoaXMubGlzdCgpO1xuICAgICAgaWYgKGFnZW50cy5sZW5ndGggPT09IDApIHJldHVybiBudWxsO1xuXG4gICAgICBjb25zdCBzZWFyY2hMb3dlciA9IG5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgIGNvbnN0IHNlYXJjaFNsdWcgPSB0aGlzLm5vcm1hbGl6ZUZpbGVuYW1lKG5hbWUpO1xuXG4gICAgICAvLyBQYXNzIDE6IGV4YWN0IGNhc2UtaW5zZW5zaXRpdmUgbWF0Y2ggb24gbWV0YWRhdGEgbmFtZVxuICAgICAgbGV0IG1hdGNoID0gYWdlbnRzLmZpbmQoXG4gICAgICAgIChhKSA9PiBhLm1ldGFkYXRhLm5hbWUudG9Mb3dlckNhc2UoKSA9PT0gc2VhcmNoTG93ZXJcbiAgICAgICk7XG5cbiAgICAgIC8vIFBhc3MgMjogc2x1ZyBtYXRjaCAoaGFuZGxlcyBkYXNoZXMsIHVuZGVyc2NvcmVzLCBjYXNpbmcgZGlmZmVyZW5jZXMpXG4gICAgICBpZiAoIW1hdGNoKSB7XG4gICAgICAgIG1hdGNoID0gYWdlbnRzLmZpbmQoKGEpID0+IHtcbiAgICAgICAgICBjb25zdCBzbHVnID0gdGhpcy5ub3JtYWxpemVGaWxlbmFtZShhLm1ldGFkYXRhLm5hbWUpO1xuICAgICAgICAgIHJldHVybiBzbHVnID09PSBzZWFyY2hTbHVnIHx8IHNsdWcgPT09IHNlYXJjaExvd2VyO1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgaWYgKG1hdGNoKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKFxuICAgICAgICAgIGBBZ2VudCBcIiR7bmFtZX1cIiByZXNvbHZlZCB2aWEgZmxleGlibGUgbWF0Y2hpbmcgdG8gZmlsZSB3aXRoIG1ldGFkYXRhIG5hbWUgXCIke21hdGNoLm1ldGFkYXRhLm5hbWV9XCIuIGAgK1xuICAgICAgICAgIGBDb25zaWRlciByZW5hbWluZyB0aGUgZmlsZSB0byBtYXRjaCB0aGUgZXhwZWN0ZWQgY29udmVudGlvbiAoIzYwNykuYFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gbWF0Y2ggPz8gbnVsbDtcbiAgICB9IGNhdGNoIChsaXN0RXJyb3IpIHtcbiAgICAgIGxvZ2dlci5kZWJ1ZyhgRmxleGlibGUgYWdlbnQgbG9va3VwIGZhaWxlZCBmb3IgXCIke25hbWV9XCI6ICR7bGlzdEVycm9yfWApO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSBtZXRhZGF0YS9jb250ZW50IGZvciBhbiBleGlzdGluZyBhZ2VudC5cbiAgICovXG4gIGFzeW5jIHVwZGF0ZShcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgdXBkYXRlczogUGFydGlhbDxBZ2VudE1ldGFkYXRhPixcbiAgICBjb250ZW50Pzogc3RyaW5nXG4gICk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IHNhbml0aXplZE5hbWUgPSBzYW5pdGl6ZUlucHV0KG5hbWUsIDEwMCk7XG4gICAgY29uc3QgYWdlbnQgPSBhd2FpdCB0aGlzLnJlYWQoc2FuaXRpemVkTmFtZSk7XG4gICAgaWYgKCFhZ2VudCkge1xuICAgICAgbG9nZ2VyLndhcm4oYEFnZW50IG5vdCBmb3VuZCBmb3IgdXBkYXRlOiAke25hbWV9YCk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gVXNlIHNwZWNpYWxpemVkIHZhbGlkYXRvciBmb3IgZWRpdCB2YWxpZGF0aW9uXG4gICAgY29uc3QgdmFsaWRhdGlvblJlc3VsdCA9IGF3YWl0IHRoaXMudmFsaWRhdG9yLnZhbGlkYXRlRWRpdChhZ2VudCwge1xuICAgICAgLi4udXBkYXRlcyxcbiAgICAgIGNvbnRlbnRcbiAgICB9KTtcblxuICAgIGlmICghdmFsaWRhdGlvblJlc3VsdC5pc1ZhbGlkKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoYEFnZW50IHVwZGF0ZSB2YWxpZGF0aW9uIGZhaWxlZDogJHt2YWxpZGF0aW9uUmVzdWx0LmVycm9ycy5qb2luKCcsICcpfWApO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vIExvZyB3YXJuaW5ncyBpZiBhbnlcbiAgICBpZiAodmFsaWRhdGlvblJlc3VsdC53YXJuaW5ncyAmJiB2YWxpZGF0aW9uUmVzdWx0Lndhcm5pbmdzLmxlbmd0aCA+IDApIHtcbiAgICAgIGxvZ2dlci53YXJuKGBBZ2VudCB1cGRhdGUgd2FybmluZ3M6ICR7dmFsaWRhdGlvblJlc3VsdC53YXJuaW5ncy5qb2luKCcsICcpfWApO1xuICAgIH1cblxuICAgIGlmICh1cGRhdGVzLmRlc2NyaXB0aW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGFnZW50Lm1ldGFkYXRhLmRlc2NyaXB0aW9uID0gc2FuaXRpemVJbnB1dChcbiAgICAgICAgVW5pY29kZVZhbGlkYXRvci5ub3JtYWxpemUodXBkYXRlcy5kZXNjcmlwdGlvbikubm9ybWFsaXplZENvbnRlbnQsXG4gICAgICAgIDUwMFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAodXBkYXRlcy5zcGVjaWFsaXphdGlvbnMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgYWdlbnQuZXh0ZW5zaW9ucyA9IHtcbiAgICAgICAgLi4uYWdlbnQuZXh0ZW5zaW9ucyxcbiAgICAgICAgc3BlY2lhbGl6YXRpb25zOiB1cGRhdGVzLnNwZWNpYWxpemF0aW9ucy5tYXAoaXRlbSA9PiBzYW5pdGl6ZUlucHV0KGl0ZW0sIDUwKSlcbiAgICAgIH07XG4gICAgfVxuXG4gICAgaWYgKHVwZGF0ZXMuZGVjaXNpb25GcmFtZXdvcmsgIT09IHVuZGVmaW5lZCkge1xuICAgICAgYWdlbnQuZXh0ZW5zaW9ucyA9IHtcbiAgICAgICAgLi4uYWdlbnQuZXh0ZW5zaW9ucyxcbiAgICAgICAgZGVjaXNpb25GcmFtZXdvcms6IHVwZGF0ZXMuZGVjaXNpb25GcmFtZXdvcmtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgaWYgKHVwZGF0ZXMucmlza1RvbGVyYW5jZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBhZ2VudC5leHRlbnNpb25zID0ge1xuICAgICAgICAuLi5hZ2VudC5leHRlbnNpb25zLFxuICAgICAgICByaXNrVG9sZXJhbmNlOiB1cGRhdGVzLnJpc2tUb2xlcmFuY2VcbiAgICAgIH07XG4gICAgfVxuXG4gICAgaWYgKHVwZGF0ZXMubGVhcm5pbmdFbmFibGVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGFnZW50LmV4dGVuc2lvbnMgPSB7XG4gICAgICAgIC4uLmFnZW50LmV4dGVuc2lvbnMsXG4gICAgICAgIGxlYXJuaW5nRW5hYmxlZDogdXBkYXRlcy5sZWFybmluZ0VuYWJsZWRcbiAgICAgIH07XG4gICAgfVxuXG4gICAgaWYgKHVwZGF0ZXMubWF4Q29uY3VycmVudEdvYWxzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGFnZW50Lm1ldGFkYXRhLm1heENvbmN1cnJlbnRHb2FscyA9IHVwZGF0ZXMubWF4Q29uY3VycmVudEdvYWxzO1xuICAgIH1cblxuICAgIGFnZW50Lm1ldGFkYXRhLm1vZGlmaWVkID0gbmV3IERhdGUoKS50b0lTT1N0cmluZygpO1xuXG4gICAgaWYgKGNvbnRlbnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gVXNlIENvbnRlbnRWYWxpZGF0b3IgZm9yIG11bHRpLWxpbmUgY29udGVudCB0byBwcmVzZXJ2ZSBmb3JtYXR0aW5nIChuZXdsaW5lcywgdGFicylcbiAgICAgIC8vIHdoaWxlIHN0aWxsIGRldGVjdGluZyBwcm9tcHQgaW5qZWN0aW9uIGF0dGFja3NcbiAgICAgIGNvbnN0IGNvbnRlbnRWYWxpZGF0aW9uID0gQ29udGVudFZhbGlkYXRvci52YWxpZGF0ZUFuZFNhbml0aXplKGNvbnRlbnQsIHsgbWF4TGVuZ3RoOiBTRUNVUklUWV9MSU1JVFMuTUFYX0NPTlRFTlRfTEVOR1RILCBjb250ZW50Q29udGV4dDogJ2FnZW50JyB9KTtcbiAgICAgIGFnZW50LmV4dGVuc2lvbnMgPSB7XG4gICAgICAgIC4uLmFnZW50LmV4dGVuc2lvbnMsXG4gICAgICAgIGluc3RydWN0aW9uczogY29udGVudFZhbGlkYXRpb24uc2FuaXRpemVkQ29udGVudCB8fCAnJ1xuICAgICAgfTtcbiAgICB9XG5cbiAgICBhd2FpdCB0aGlzLnNhdmUoYWdlbnQsIHRoaXMuZ2V0RmlsZW5hbWUoc2FuaXRpemVkTmFtZSkpO1xuICAgIGxvZ2dlci5pbmZvKGBBZ2VudCB1cGRhdGVkOiAke3Nhbml0aXplZE5hbWV9YCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGUgYSBwcm92aWRlZCBhZ2VudCBuYW1lLlxuICAgKi9cbiAgdmFsaWRhdGVOYW1lKG5hbWU6IHN0cmluZyk6IHsgdmFsaWQ6IGJvb2xlYW47IGVycm9yPzogc3RyaW5nIH0ge1xuICAgIGlmICghbmFtZSB8fCBuYW1lLnRyaW0oKS5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiB7IHZhbGlkOiBmYWxzZSwgZXJyb3I6ICdOYW1lIGNhbm5vdCBiZSBlbXB0eScgfTtcbiAgICB9XG5cbiAgICBpZiAobmFtZS5sZW5ndGggPiAxMDApIHtcbiAgICAgIHJldHVybiB7IHZhbGlkOiBmYWxzZSwgZXJyb3I6ICdOYW1lIGNhbm5vdCBleGNlZWQgMTAwIGNoYXJhY3RlcnMnIH07XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLnZhbGlkYXRlRWxlbWVudE5hbWUobmFtZSkpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHZhbGlkOiBmYWxzZSxcbiAgICAgICAgZXJyb3I6ICdOYW1lIGNhbiBvbmx5IGNvbnRhaW4gbGV0dGVycywgbnVtYmVycywgaHlwaGVucywgYW5kIHVuZGVyc2NvcmVzJ1xuICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4geyB2YWxpZDogdHJ1ZSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEltcG9ydCBhbiBhZ2VudCBmcm9tIHNlcmlhbGl6ZWQgY29udGVudC5cbiAgICovXG4gIGFzeW5jIGltcG9ydEVsZW1lbnQoZGF0YTogc3RyaW5nLCBmb3JtYXQ6ICdqc29uJyB8ICd5YW1sJyB8ICdtYXJrZG93bicgPSAnbWFya2Rvd24nKTogUHJvbWlzZTxBZ2VudD4ge1xuICAgIGlmIChmb3JtYXQgPT09ICdqc29uJykge1xuICAgICAgY29uc3QgcGFyc2VkID0gdGhpcy5zZXJpYWxpemF0aW9uU2VydmljZS5wYXJzZUpzb24oZGF0YSwge1xuICAgICAgICBzb3VyY2U6ICdBZ2VudE1hbmFnZXIuaW1wb3J0RWxlbWVudCdcbiAgICAgIH0pO1xuICAgICAgY29uc3QgYWdlbnQgPSBuZXcgQWdlbnQocGFyc2VkLm1ldGFkYXRhLCB0aGlzLm1ldGFkYXRhU2VydmljZSk7XG4gICAgICBpZiAocGFyc2VkLnN0YXRlKSB7XG4gICAgICAgIGFnZW50LmRlc2VyaWFsaXplKEpTT04uc3RyaW5naWZ5KHBhcnNlZCkpO1xuICAgICAgfVxuICAgICAgYWdlbnQuZXh0ZW5zaW9ucyA9IHtcbiAgICAgICAgLi4uYWdlbnQuZXh0ZW5zaW9ucyxcbiAgICAgICAgaW5zdHJ1Y3Rpb25zOiBwYXJzZWQuaW5zdHJ1Y3Rpb25zIHx8ICcnXG4gICAgICB9O1xuICAgICAgcmV0dXJuIGFnZW50O1xuICAgIH1cblxuICAgIC8vIFVzZSBTZXJpYWxpemF0aW9uU2VydmljZSBmb3IgZnJvbnRtYXR0ZXIgcGFyc2luZ1xuICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuc2VyaWFsaXphdGlvblNlcnZpY2UucGFyc2VGcm9udG1hdHRlcihkYXRhLCB7XG4gICAgICBtYXhZYW1sU2l6ZTogTUFYX1lBTUxfU0laRSxcbiAgICAgIHZhbGlkYXRlQ29udGVudDogZmFsc2UsXG4gICAgICBzb3VyY2U6ICdBZ2VudE1hbmFnZXIuaW1wb3J0RWxlbWVudCdcbiAgICB9KTtcblxuICAgIGNvbnN0IGFnZW50ID0gbmV3IEFnZW50KHJlc3VsdC5kYXRhIGFzIEFnZW50TWV0YWRhdGEsIHRoaXMubWV0YWRhdGFTZXJ2aWNlKTtcbiAgICBhZ2VudC5leHRlbnNpb25zID0ge1xuICAgICAgLi4uYWdlbnQuZXh0ZW5zaW9ucyxcbiAgICAgIGluc3RydWN0aW9uczogcmVzdWx0LmNvbnRlbnQudHJpbSgpXG4gICAgfTtcbiAgICByZXR1cm4gYWdlbnQ7XG4gIH1cblxuICAvKipcbiAgICogRXhwb3J0IGFuIGFnZW50IHRvIEpTT04gb3IgbWFya2Rvd24gKGRlZmF1bHQpLlxuICAgKi9cbiAgYXN5bmMgZXhwb3J0RWxlbWVudChhZ2VudDogQWdlbnQsIGZvcm1hdDogJ2pzb24nIHwgJ3lhbWwnIHwgJ21hcmtkb3duJyA9ICdtYXJrZG93bicpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGlmIChmb3JtYXQgPT09ICdqc29uJykge1xuICAgICAgcmV0dXJuIGFnZW50LnNlcmlhbGl6ZVRvSlNPTigpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnNlcmlhbGl6ZUVsZW1lbnQoYWdlbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIExvYWQgYW4gYWdlbnQgZmlsZSwgZW5mb3JjaW5nIHNpemUgYW5kIGZvcm1hdCBjaGVja3MuXG4gICAqL1xuICBvdmVycmlkZSBhc3luYyBsb2FkKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPEFnZW50PiB7XG4gICAgY29uc3Qgc2FuaXRpemVkSW5wdXQgPSBzYW5pdGl6ZUlucHV0KGZpbGVQYXRoLCAyNTUpO1xuICAgIGNvbnN0IHJlbGF0aXZlUGF0aCA9IHNhbml0aXplZElucHV0LmVuZHNXaXRoKEFHRU5UX0ZJTEVfRVhURU5TSU9OKVxuICAgICAgPyBzYW5pdGl6ZWRJbnB1dFxuICAgICAgOiB0aGlzLmdldEZpbGVuYW1lKHNhbml0aXplSW5wdXQoc2FuaXRpemVkSW5wdXQsIDEwMCkpO1xuXG4gICAgdHJ5IHtcbiAgICAgIHZhbGlkYXRlUGF0aChyZWxhdGl2ZVBhdGgsIHRoaXMuZWxlbWVudERpcik7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci5lcnJvcihgSW52YWxpZCBhZ2VudCBwYXRoOiAke2Vycm9yfWApO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGFnZW50IHBhdGg6ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiAnSW52YWxpZCBwYXRoJ31gKTtcbiAgICB9XG5cbiAgICBjb25zdCBmdWxsUGF0aCA9IHRoaXMucmVzb2x2ZUFic29sdXRlUGF0aChyZWxhdGl2ZVBhdGgpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCB0aGlzLmZpbGVPcGVyYXRpb25zLnJlYWRGaWxlKGZ1bGxQYXRoLCB7IGVuY29kaW5nOiAndXRmLTgnIH0pO1xuXG4gICAgICBpZiAoY29udGVudC5sZW5ndGggPiBNQVhfRklMRV9TSVpFKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgQWdlbnQgZmlsZSBleGNlZWRzIG1heGltdW0gc2l6ZSBvZiAke01BWF9GSUxFX1NJWkV9IGJ5dGVzYCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHBhcnNlZCA9IHRoaXMucGFyc2VBZ2VudEZpbGUoY29udGVudCk7XG4gICAgICBjb25zdCBtZXRhZGF0YSA9IGF3YWl0IHRoaXMucGFyc2VNZXRhZGF0YShwYXJzZWQubWV0YWRhdGEpO1xuICAgICAgY29uc3QgYWdlbnQgPSB0aGlzLmNyZWF0ZUVsZW1lbnQobWV0YWRhdGEsIHBhcnNlZC5jb250ZW50KTtcblxuICAgICAgdGhpcy5jYWNoZUVsZW1lbnQoYWdlbnQsIHJlbGF0aXZlUGF0aCk7XG4gICAgICBhd2FpdCB0aGlzLmh5ZHJhdGVBZ2VudFN0YXRlKGFnZW50LCB0aGlzLnN0cmlwRXh0ZW5zaW9uKHJlbGF0aXZlUGF0aCkpO1xuXG4gICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgIHR5cGU6ICdFTEVNRU5UX0xPQURFRCcsXG4gICAgICAgIHNldmVyaXR5OiAnTE9XJyxcbiAgICAgICAgc291cmNlOiBgJHt0aGlzLmNvbnN0cnVjdG9yLm5hbWV9LmxvYWRgLFxuICAgICAgICBkZXRhaWxzOiBgJHt0aGlzLmdldEVsZW1lbnRMYWJlbENhcGl0YWxpemVkKCl9IGxvYWRlZDogJHthZ2VudC5tZXRhZGF0YS5uYW1lfSB2JHthZ2VudC5tZXRhZGF0YS52ZXJzaW9uIHx8ICd1bmtub3duJ31gLFxuICAgICAgICBhZGRpdGlvbmFsRGF0YToge1xuICAgICAgICAgIGFnZW50SWQ6IGFnZW50LmlkLFxuICAgICAgICAgIGFnZW50TmFtZTogYWdlbnQubWV0YWRhdGEubmFtZSxcbiAgICAgICAgICB2ZXJzaW9uOiBhZ2VudC5tZXRhZGF0YS52ZXJzaW9uLFxuICAgICAgICAgIGF1dGhvcjogYWdlbnQubWV0YWRhdGEuYXV0aG9yLFxuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIGFnZW50O1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoYEZhaWxlZCB0byBsb2FkIGFnZW50IGZyb20gJHtmdWxsUGF0aH06YCwgZXJyb3IpO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIE92ZXJyaWRlIEJhc2VFbGVtZW50TWFuYWdlci5zYXZlIHRvIHBlcnNpc3Qgc3RhdGUgd2hlbiByZXF1aXJlZC5cbiAgICovXG4gIG92ZXJyaWRlIGFzeW5jIHNhdmUoYWdlbnQ6IEFnZW50LCBmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qgc2FuaXRpemVkUGF0aCA9IGZpbGVQYXRoLmVuZHNXaXRoKEFHRU5UX0ZJTEVfRVhURU5TSU9OKVxuICAgICAgPyBzYW5pdGl6ZUlucHV0KGZpbGVQYXRoLCAyNTUpXG4gICAgICA6IHRoaXMuZ2V0RmlsZW5hbWUoc2FuaXRpemVJbnB1dChmaWxlUGF0aCwgMTAwKSk7XG5cbiAgICBhd2FpdCB0aGlzLmVuc3VyZVN0YXRlRGlyZWN0b3J5KCk7XG4gICAgYXdhaXQgc3VwZXIuc2F2ZShhZ2VudCwgc2FuaXRpemVkUGF0aCk7XG5cbiAgICBpZiAoYWdlbnQubmVlZHNTdGF0ZVBlcnNpc3RlbmNlKCkpIHtcbiAgICAgIGNvbnN0IG5ld1ZlcnNpb24gPSBhd2FpdCB0aGlzLnNhdmVBZ2VudFN0YXRlKHRoaXMuc3RyaXBFeHRlbnNpb24oc2FuaXRpemVkUGF0aCksIGFnZW50LmdldFN0YXRlKCkpO1xuICAgICAgYWdlbnRbQ09NTUlUX1BFUlNJU1RFRF9WRVJTSU9OXShuZXdWZXJzaW9uKTsgIC8vIFN5bmMgYWdlbnQncyBpbnRlcm5hbCB2ZXJzaW9uIChJc3N1ZSAjMTIzIGZpeClcbiAgICAgIGFnZW50Lm1hcmtTdGF0ZVBlcnNpc3RlZCgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBQZXJzaXN0IGFnZW50IHN0YXRlIHRvIGRpc2sgKHB1YmxpYyBBUEkgZm9yIGV4dGVybmFsIGNhbGxlcnMpLlxuICAgKlxuICAgKiBUaGlzIG1ldGhvZCBpcyB0aGUgcHJvcGVyIHdheSBmb3IgZXh0ZXJuYWwgY29kZSAoc3RyYXRlZ2llcywgaGFuZGxlcnMpIHRvXG4gICAqIHRyaWdnZXIgc3RhdGUgcGVyc2lzdGVuY2UuIEl0IGltcGxlbWVudHMgdGhlIE9wdGlvbiBDIHBhdHRlcm4gZnJvbSBJc3N1ZSAjMTIzOlxuICAgKiBzdGF0ZVZlcnNpb24gaXMgb25seSBpbmNyZW1lbnRlZCBvbiBzdWNjZXNzZnVsIHNhdmUuXG4gICAqXG4gICAqIEBwYXJhbSBuYW1lIC0gQWdlbnQgbmFtZVxuICAgKiBAcmV0dXJucyBQcm9taXNlPGJvb2xlYW4+IC0gVHJ1ZSBpZiBzdGF0ZSB3YXMgcGVyc2lzdGVkLCBmYWxzZSBpZiBub3QgbmVlZGVkXG4gICAqIEB0aHJvd3MgRXJyb3IgaWYgYWdlbnQgbm90IGZvdW5kIG9yIHNhdmUgZmFpbHNcbiAgICovXG4gIGFzeW5jIHBlcnNpc3RTdGF0ZShuYW1lOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCBhZ2VudCA9IGF3YWl0IHRoaXMucmVhZChuYW1lKTtcbiAgICBpZiAoIWFnZW50KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEFnZW50IG5vdCBmb3VuZDogJHtuYW1lfWApO1xuICAgIH1cblxuICAgIGlmICghYWdlbnQubmVlZHNTdGF0ZVBlcnNpc3RlbmNlKCkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCBuZXdWZXJzaW9uID0gYXdhaXQgdGhpcy5zYXZlQWdlbnRTdGF0ZShuYW1lLCBhZ2VudC5nZXRTdGF0ZSgpKTtcbiAgICBhZ2VudFtDT01NSVRfUEVSU0lTVEVEX1ZFUlNJT05dKG5ld1ZlcnNpb24pO1xuICAgIGFnZW50Lm1hcmtTdGF0ZVBlcnNpc3RlZCgpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIE92ZXJyaWRlIGRlbGV0ZSB0byByZW1vdmUgYXNzb2NpYXRlZCBzdGF0ZSBmaWxlLlxuICAgKlxuICAgKiBGSVg6IFVzZXMgbm9ybWFsaXplRmlsZW5hbWUoKSB0byBlbnN1cmUgc3RhdGUgZmlsZSBkZWxldGlvbiBtYXRjaGVzXG4gICAqIHRoZSBub3JtYWxpemVkIGZpbGVuYW1lIHVzZWQgZm9yIHN0YXRlIGZpbGUgY3JlYXRpb24vbG9hZGluZy5cbiAgICovXG4gIG92ZXJyaWRlIGFzeW5jIGRlbGV0ZShmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qgc2FuaXRpemVkUGF0aCA9IGZpbGVQYXRoLmVuZHNXaXRoKEFHRU5UX0ZJTEVfRVhURU5TSU9OKVxuICAgICAgPyBzYW5pdGl6ZUlucHV0KGZpbGVQYXRoLCAyNTUpXG4gICAgICA6IHRoaXMuZ2V0RmlsZW5hbWUoc2FuaXRpemVJbnB1dChmaWxlUGF0aCwgMTAwKSk7XG4gICAgY29uc3QgbmFtZSA9IHRoaXMuc3RyaXBFeHRlbnNpb24oc2FuaXRpemVkUGF0aCk7XG4gICAgYXdhaXQgc3VwZXIuZGVsZXRlKHNhbml0aXplZFBhdGgpO1xuXG4gICAgLy8gRklYOiBOb3JtYWxpemUgbmFtZSBmb3IgY29uc2lzdGVudCBzdGF0ZSBmaWxlIGRlbGV0aW9uXG4gICAgY29uc3Qgbm9ybWFsaXplZE5hbWUgPSB0aGlzLm5vcm1hbGl6ZUZpbGVuYW1lKG5hbWUpO1xuICAgIGNvbnN0IHN0YXRlUGF0aCA9IHBhdGguam9pbih0aGlzLnN0YXRlRGlyLCBgJHtub3JtYWxpemVkTmFtZX0ke1NUQVRFX0ZJTEVfRVhURU5TSU9OfWApO1xuICAgIHRyeSB7XG4gICAgICAvLyBCYWNrIHVwIHRoZSBzdGF0ZSBmaWxlIGJlZm9yZSBkZWxldGluZyBpdFxuICAgICAgaWYgKHRoaXMuYmFja3VwU2VydmljZSkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmJhY2t1cFNlcnZpY2UuYmFja3VwQmVmb3JlRGVsZXRlKHN0YXRlUGF0aCwgRWxlbWVudFR5cGUuQUdFTlQpO1xuICAgICAgICBpZiAoIXJlc3VsdC5tb3ZlZE9yaWdpbmFsKSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy5maWxlT3BlcmF0aW9ucy5kZWxldGVGaWxlKHN0YXRlUGF0aCwgRWxlbWVudFR5cGUuQUdFTlQsIHtcbiAgICAgICAgICAgIHNvdXJjZTogJ0FnZW50TWFuYWdlci5kZWxldGUgKHN0YXRlIGZpbGUpJ1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhd2FpdCB0aGlzLmZpbGVPcGVyYXRpb25zLmRlbGV0ZUZpbGUoc3RhdGVQYXRoLCBFbGVtZW50VHlwZS5BR0VOVCwge1xuICAgICAgICAgIHNvdXJjZTogJ0FnZW50TWFuYWdlci5kZWxldGUgKHN0YXRlIGZpbGUpJ1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKChlcnJvciBhcyBOb2RlSlMuRXJybm9FeGNlcHRpb24pLmNvZGUgIT09ICdFTk9FTlQnKSB7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBGSVg6IFVzZSBub3JtYWxpemVkIG5hbWUgYXMgY2FjaGUga2V5IGZvciBjb25zaXN0ZW50IGNhY2hlIGNsZWFudXBcbiAgICB0aGlzLnN0YXRlQ2FjaGUuZGVsZXRlKG5vcm1hbGl6ZWROYW1lKTtcbiAgfVxuXG4gIG92ZXJyaWRlIGFzeW5jIGV4aXN0cyhmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3Qgc2FuaXRpemVkUGF0aCA9IGZpbGVQYXRoLmVuZHNXaXRoKEFHRU5UX0ZJTEVfRVhURU5TSU9OKVxuICAgICAgPyBzYW5pdGl6ZUlucHV0KGZpbGVQYXRoLCAyNTUpXG4gICAgICA6IHRoaXMuZ2V0RmlsZW5hbWUoc2FuaXRpemVJbnB1dChmaWxlUGF0aCwgMTAwKSk7XG4gICAgcmV0dXJuIHN1cGVyLmV4aXN0cyhzYW5pdGl6ZWRQYXRoKTtcbiAgfVxuXG4gIG92ZXJyaWRlIHZhbGlkYXRlUGF0aCh0YXJnZXRQYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBpZiAodGFyZ2V0UGF0aC5pbmNsdWRlcygnLi4nKSB8fCB0YXJnZXRQYXRoLmluY2x1ZGVzKCd+JykpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKHRhcmdldFBhdGguc3RhcnRzV2l0aCgnLycpIHx8IC9eW0EtWmEtel06Ly50ZXN0KHRhcmdldFBhdGgpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgZ2V0RmlsZUV4dGVuc2lvbigpOiBzdHJpbmcge1xuICAgIHJldHVybiBBR0VOVF9GSUxFX0VYVEVOU0lPTjtcbiAgfVxuXG4gIC8qKlxuICAgKiBPdmVycmlkZSBsaXN0IHRvIGFwcGx5IGFjdGl2ZSBzdGF0dXMgYmFzZWQgb24gYWN0aXZlQWdlbnROYW1lcyBzZXRcbiAgICovXG4gIG92ZXJyaWRlIGFzeW5jIGxpc3QoKTogUHJvbWlzZTxBZ2VudFtdPiB7XG4gICAgY29uc3QgYWdlbnRzID0gYXdhaXQgc3VwZXIubGlzdCgpO1xuXG4gICAgLy8gQXBwbHkgYWN0aXZlIHN0YXR1cyB0byBhZ2VudHMgdGhhdCBhcmUgaW4gdGhlIGFjdGl2ZSBzZXQgKGJ5IG5hbWUpXG4gICAgZm9yIChjb25zdCBhZ2VudCBvZiBhZ2VudHMpIHtcbiAgICAgIGlmICh0aGlzLmFjdGl2ZUFnZW50TmFtZXMuaGFzKGFnZW50Lm1ldGFkYXRhLm5hbWUpKSB7XG4gICAgICAgIC8vIEFjdGl2YXRlIHRoZSBhZ2VudCB0byBzZXQgc3RhdHVzIHRvIEFDVElWRVxuICAgICAgICBhd2FpdCBhZ2VudC5hY3RpdmF0ZSgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBhZ2VudHM7XG4gIH1cblxuICAvKipcbiAgICogQWN0aXZhdGUgYW4gYWdlbnQgYnkgbmFtZSBvciBpZGVudGlmaWVyXG4gICAqXG4gICAqIElzc3VlICMyNCAoTE9XIFBSSU9SSVRZKTogUGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9uIHVzaW5nIGZpbmRCeU5hbWUoKVxuICAgKiBJc3N1ZSAjMjQgKExPVyBQUklPUklUWSk6IENvbnNpc3RlbnQgZXJyb3IgbWVzc2FnZXMgdXNpbmcgRWxlbWVudE1lc3NhZ2VzXG4gICAqIElzc3VlICMyNCAoTE9XIFBSSU9SSVRZKTogQ2xlYW51cCB0cmlnZ2VyIGZvciBtZW1vcnkgbGVhayBwcmV2ZW50aW9uXG4gICAqL1xuICBhc3luYyBhY3RpdmF0ZUFnZW50KGlkZW50aWZpZXI6IHN0cmluZyk6IFByb21pc2U8eyBzdWNjZXNzOiBib29sZWFuOyBtZXNzYWdlOiBzdHJpbmc7IGFnZW50PzogQWdlbnQgfT4ge1xuICAgIC8vIFBFUkZPUk1BTkNFIEZJWDogVXNlIGZpbmRCeU5hbWUoKSBpbnN0ZWFkIG9mIGxpc3QoKVxuICAgIGNvbnN0IGFnZW50ID0gYXdhaXQgdGhpcy5maW5kQnlOYW1lKGlkZW50aWZpZXIpO1xuXG4gICAgaWYgKCFhZ2VudCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgIC8vIENPTlNJU1RFTkNZIEZJWDogVXNlIHN0YW5kYXJkaXplZCBlcnJvciBtZXNzYWdlIGZvcm1hdFxuICAgICAgICBtZXNzYWdlOiBFbGVtZW50TWVzc2FnZXMubm90Rm91bmQoRWxlbWVudFR5cGUuQUdFTlQsIGlkZW50aWZpZXIpXG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vIE1FTU9SWSBMRUFLIEZJWDogQ2hlY2sgaWYgY2xlYW51cCBpcyBuZWVkZWQgYmVmb3JlIGFkZGluZ1xuICAgIHRoaXMuY2hlY2tBbmRDbGVhbnVwQWN0aXZlU2V0KCk7XG5cbiAgICAvLyBBZGQgdG8gYWN0aXZlIHNldCAoYnkgbmFtZSwgd2hpY2ggaXMgc3RhYmxlIGFjcm9zcyByZWxvYWRzKVxuICAgIHRoaXMuYWN0aXZlQWdlbnROYW1lcy5hZGQoYWdlbnQubWV0YWRhdGEubmFtZSk7XG5cbiAgICAvLyBVcGRhdGUgYWdlbnQgc3RhdHVzIGluIG1lbW9yeVxuICAgIGF3YWl0IGFnZW50LmFjdGl2YXRlKCk7XG5cbiAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICB0eXBlOiAnQUdFTlRfQUNUSVZBVEVEJyxcbiAgICAgIHNldmVyaXR5OiAnTE9XJyxcbiAgICAgIHNvdXJjZTogJ0FnZW50TWFuYWdlci5hY3RpdmF0ZUFnZW50JyxcbiAgICAgIGRldGFpbHM6IGBBZ2VudCBhY3RpdmF0ZWQ6ICR7YWdlbnQubWV0YWRhdGEubmFtZX0gdiR7YWdlbnQubWV0YWRhdGEudmVyc2lvbiB8fCAndW5rbm93bid9YCxcbiAgICAgIGFkZGl0aW9uYWxEYXRhOiB7XG4gICAgICAgIGFnZW50SWQ6IGFnZW50LmlkLFxuICAgICAgICBhZ2VudE5hbWU6IGFnZW50Lm1ldGFkYXRhLm5hbWUsXG4gICAgICAgIHZlcnNpb246IGFnZW50Lm1ldGFkYXRhLnZlcnNpb24sXG4gICAgICAgIGF1dGhvcjogYWdlbnQubWV0YWRhdGEuYXV0aG9yLFxuICAgICAgICBnb2FsQ291bnQ6IChhZ2VudC5tZXRhZGF0YSBhcyBhbnkpLmdvYWw/LnBhcmFtZXRlcnM/Lmxlbmd0aCB8fCAwLFxuICAgICAgICBzcGVjaWFsaXphdGlvbnM6IGFnZW50Lm1ldGFkYXRhLnNwZWNpYWxpemF0aW9ucyxcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGxvZ2dlci5pbmZvKGBBZ2VudCBhY3RpdmF0ZWQ6ICR7YWdlbnQubWV0YWRhdGEubmFtZX1gKTtcblxuICAgIHJldHVybiB7XG4gICAgICBzdWNjZXNzOiB0cnVlLFxuICAgICAgLy8gQ09OU0lTVEVOQ1kgRklYOiBVc2Ugc3RhbmRhcmRpemVkIHN1Y2Nlc3MgbWVzc2FnZSBmb3JtYXRcbiAgICAgIG1lc3NhZ2U6IEVsZW1lbnRNZXNzYWdlcy5hY3RpdmF0ZWQoRWxlbWVudFR5cGUuQUdFTlQsIGFnZW50Lm1ldGFkYXRhLm5hbWUpLFxuICAgICAgYWdlbnRcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIERlYWN0aXZhdGUgYW4gYWdlbnQgYnkgbmFtZSBvciBpZGVudGlmaWVyXG4gICAqXG4gICAqIElzc3VlICMyNCAoTE9XIFBSSU9SSVRZKTogUGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9uIHVzaW5nIGZpbmRCeU5hbWUoKVxuICAgKiBJc3N1ZSAjMjQgKExPVyBQUklPUklUWSk6IENvbnNpc3RlbnQgZXJyb3IgbWVzc2FnZXMgdXNpbmcgRWxlbWVudE1lc3NhZ2VzXG4gICAqL1xuICBhc3luYyBkZWFjdGl2YXRlQWdlbnQoaWRlbnRpZmllcjogc3RyaW5nKTogUHJvbWlzZTx7IHN1Y2Nlc3M6IGJvb2xlYW47IG1lc3NhZ2U6IHN0cmluZyB9PiB7XG4gICAgLy8gUEVSRk9STUFOQ0UgRklYOiBVc2UgZmluZEJ5TmFtZSgpIGluc3RlYWQgb2YgbGlzdCgpXG4gICAgY29uc3QgYWdlbnQgPSBhd2FpdCB0aGlzLmZpbmRCeU5hbWUoaWRlbnRpZmllcik7XG5cbiAgICBpZiAoIWFnZW50KSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgLy8gQ09OU0lTVEVOQ1kgRklYOiBVc2Ugc3RhbmRhcmRpemVkIGVycm9yIG1lc3NhZ2UgZm9ybWF0XG4gICAgICAgIG1lc3NhZ2U6IEVsZW1lbnRNZXNzYWdlcy5ub3RGb3VuZChFbGVtZW50VHlwZS5BR0VOVCwgaWRlbnRpZmllcilcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gUmVtb3ZlIGZyb20gYWN0aXZlIHNldFxuICAgIHRoaXMuYWN0aXZlQWdlbnROYW1lcy5kZWxldGUoYWdlbnQubWV0YWRhdGEubmFtZSk7XG5cbiAgICAvLyBVcGRhdGUgYWdlbnQgc3RhdHVzIGluIG1lbW9yeVxuICAgIGF3YWl0IGFnZW50LmRlYWN0aXZhdGUoKTtcblxuICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgIHR5cGU6ICdBR0VOVF9ERUFDVElWQVRFRCcsXG4gICAgICBzZXZlcml0eTogJ0xPVycsXG4gICAgICBzb3VyY2U6ICdBZ2VudE1hbmFnZXIuZGVhY3RpdmF0ZUFnZW50JyxcbiAgICAgIGRldGFpbHM6IGBBZ2VudCBkZWFjdGl2YXRlZDogJHthZ2VudC5tZXRhZGF0YS5uYW1lfSB2JHthZ2VudC5tZXRhZGF0YS52ZXJzaW9uIHx8ICd1bmtub3duJ31gLFxuICAgICAgYWRkaXRpb25hbERhdGE6IHtcbiAgICAgICAgYWdlbnRJZDogYWdlbnQuaWQsXG4gICAgICAgIGFnZW50TmFtZTogYWdlbnQubWV0YWRhdGEubmFtZSxcbiAgICAgICAgdmVyc2lvbjogYWdlbnQubWV0YWRhdGEudmVyc2lvbixcbiAgICAgICAgYXV0aG9yOiBhZ2VudC5tZXRhZGF0YS5hdXRob3IsXG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBsb2dnZXIuaW5mbyhgQWdlbnQgZGVhY3RpdmF0ZWQ6ICR7YWdlbnQubWV0YWRhdGEubmFtZX1gKTtcblxuICAgIHJldHVybiB7XG4gICAgICBzdWNjZXNzOiB0cnVlLFxuICAgICAgLy8gQ09OU0lTVEVOQ1kgRklYOiBVc2Ugc3RhbmRhcmRpemVkIHN1Y2Nlc3MgbWVzc2FnZSBmb3JtYXRcbiAgICAgIG1lc3NhZ2U6IEVsZW1lbnRNZXNzYWdlcy5kZWFjdGl2YXRlZChFbGVtZW50VHlwZS5BR0VOVCwgYWdlbnQubWV0YWRhdGEubmFtZSlcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhbGwgYWN0aXZlIGFnZW50c1xuICAgKi9cbiAgYXN5bmMgZ2V0QWN0aXZlQWdlbnRzKCk6IFByb21pc2U8QWdlbnRbXT4ge1xuICAgIGNvbnN0IGFnZW50cyA9IGF3YWl0IHRoaXMubGlzdCgpO1xuICAgIHJldHVybiBhZ2VudHMuZmlsdGVyKGEgPT4gdGhpcy5hY3RpdmVBZ2VudE5hbWVzLmhhcyhhLm1ldGFkYXRhLm5hbWUpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeGVjdXRlIGFuIGFnZW50IHdpdGggZ29hbCBwYXJhbWV0ZXJzXG4gICAqXG4gICAqIFJldHVybnMgY29udGV4dCBmb3IgTExNIHRvIGRyaXZlIHRoZSBhZ2VudGljIGxvb3AuXG4gICAqIFRoaXMgbWV0aG9kOlxuICAgKiAxLiBMb2FkcyB0aGUgYWdlbnQgY29uZmlndXJhdGlvblxuICAgKiAyLiBWYWxpZGF0ZXMgYW5kIHJlbmRlcnMgdGhlIGdvYWwgdGVtcGxhdGUgd2l0aCBwYXJhbWV0ZXJzXG4gICAqIDMuIEFjdGl2YXRlcyBjb25maWd1cmVkIGVsZW1lbnRzIChlbGVtZW50LWFnbm9zdGljKVxuICAgKiA0LiBFdmFsdWF0ZXMgcHJvZ3JhbW1hdGljIGNvbnN0cmFpbnRzIGFuZCByaXNrXG4gICAqIDUuIFJldHVybnMgc3RydWN0dXJlZCBjb250ZXh0IGZvciBMTE1cbiAgICpcbiAgICogVGhlIExMTSB0aGVuIGRyaXZlcyB0aGUgYWdlbnRpYyBsb29wIHVzaW5nIHRoaXMgY29udGV4dC5cbiAgICpcbiAgICogQHNpbmNlIHYyLjAuMCAtIEFnZW50aWMgTG9vcCBSZWRlc2lnblxuICAgKi9cbiAgYXN5bmMgZXhlY3V0ZUFnZW50KFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBwYXJhbWV0ZXJzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICApOiBQcm9taXNlPEV4ZWN1dGVBZ2VudFJlc3VsdD4ge1xuICAgIHRyeSB7XG4gICAgICAvLyAxLiBMb2FkIGFnZW50IGJ5IG5hbWVcbiAgICAgIGNvbnN0IGFnZW50ID0gYXdhaXQgdGhpcy5yZWFkKG5hbWUpO1xuICAgICAgaWYgKCFhZ2VudCkge1xuICAgICAgICAvLyBGSVg6IElzc3VlICMyNzUgLSBUaHJvdyBFbGVtZW50Tm90Rm91bmRFcnJvciBmb3IgY29uc2lzdGVudCBlcnJvciBoYW5kbGluZ1xuICAgICAgICB0aHJvdyBuZXcgRWxlbWVudE5vdEZvdW5kRXJyb3IoJ0FnZW50JywgbmFtZSk7XG4gICAgICB9XG5cbiAgICAgIC8vIEdldCBtZXRhZGF0YSBhcyB2MiAobWF5IGhhdmUgZ29hbCBjb25maWcpXG4gICAgICBsZXQgbWV0YWRhdGEgPSBhZ2VudC5tZXRhZGF0YSBhcyBBZ2VudE1ldGFkYXRhVjI7XG5cbiAgICAgIC8vIENoZWNrIGlmIHRoaXMgaXMgYSB2Mi4wIGFnZW50IHdpdGggZ29hbCBjb25maWd1cmF0aW9uXG4gICAgICAvLyBJZiBub3QsIGF1dG8tY29udmVydCBWMSB0byBWMiBpbiBwbGFjZSAoSXNzdWUgIzU4NylcbiAgICAgIGlmICghbWV0YWRhdGEuZ29hbCB8fCAhbWV0YWRhdGEuZ29hbC50ZW1wbGF0ZSkge1xuICAgICAgICBpZiAoaXNWMUFnZW50KG1ldGFkYXRhKSkge1xuICAgICAgICAgIGNvbnN0IGluc3RydWN0aW9ucyA9IGFnZW50LmV4dGVuc2lvbnM/Lmluc3RydWN0aW9ucyB8fCAnJztcbiAgICAgICAgICBjb25zdCBjb252ZXJzaW9uUmVzdWx0ID0gY29udmVydFYxVG9WMihtZXRhZGF0YSwgaW5zdHJ1Y3Rpb25zKTtcblxuICAgICAgICAgIGlmIChjb252ZXJzaW9uUmVzdWx0LmNvbnZlcnRlZCkge1xuICAgICAgICAgICAgLy8gTWVyZ2UgY29udmVydGVkIG1ldGFkYXRhIG9udG8gdGhlIGV4aXN0aW5nIGFnZW50IChpbi1wbGFjZSlcbiAgICAgICAgICAgIE9iamVjdC5hc3NpZ24obWV0YWRhdGEsIGNvbnZlcnNpb25SZXN1bHQubWV0YWRhdGEpO1xuICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihhZ2VudC5tZXRhZGF0YSwgY29udmVyc2lvblJlc3VsdC5tZXRhZGF0YSk7XG5cbiAgICAgICAgICAgIC8vIExvZyBjb252ZXJzaW9uIHdhcm5pbmdzXG4gICAgICAgICAgICBpZiAoY29udmVyc2lvblJlc3VsdC53YXJuaW5ncy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgIGxvZ2dlci53YXJuKGBBZ2VudCAnJHtuYW1lfScgYXV0by1jb252ZXJ0ZWQgZnJvbSBWMSB0byBWMiBpbiBwbGFjZWAsIHtcbiAgICAgICAgICAgICAgICB3YXJuaW5nczogY29udmVyc2lvblJlc3VsdC53YXJuaW5ncyxcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFNhdmUgdGhlIHVwZ3JhZGVkIGFnZW50IGJhY2sgdG8gaXRzIG9yaWdpbmFsIGZpbGVcbiAgICAgICAgICAgIGNvbnN0IHVwZ3JhZGVkRmlsZW5hbWUgPSB0aGlzLmdldEZpbGVuYW1lKHNhbml0aXplSW5wdXQobmFtZSwgMTAwKSk7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLnNhdmUoYWdlbnQsIHVwZ3JhZGVkRmlsZW5hbWUpO1xuICAgICAgICAgICAgbG9nZ2VyLmluZm8oYEFnZW50ICcke25hbWV9JyBjb252ZXJ0ZWQgZnJvbSBWMSB0byBWMiBhbmQgc2F2ZWQgaW4gcGxhY2VgKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICBgQWdlbnQgJyR7bmFtZX0nIGNhbm5vdCBiZSBleGVjdXRlZDogbWlzc2luZyBnb2FsLnRlbXBsYXRlIGFuZCBjb252ZXJzaW9uIGZhaWxlZC5gXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgQWdlbnQgJyR7bmFtZX0nIGlzIG5vdCBhIHYyLjAgYWdlbnQuIE1pc3NpbmcgZ29hbC50ZW1wbGF0ZSBjb25maWd1cmF0aW9uLmBcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIDIuIENsb25lIHBhcmFtZXRlcnMgdG8gcHJldmVudCBtdXRhdGlvbiBvZiBjYWxsZXIncyBvYmplY3QgKElzc3VlICMxMTgpXG4gICAgICBjb25zdCBjbG9uZWRQYXJhbWV0ZXJzID0gc3RydWN0dXJlZENsb25lKHBhcmFtZXRlcnMpO1xuXG4gICAgICAvLyAyYi4gU2VjdXJpdHkgdmFsaWRhdGlvbiBvZiB0ZW1wbGF0ZSBwYXJhbWV0ZXJzIChJc3N1ZSAjMTAzKVxuICAgICAgdGhpcy52YWxpZGF0ZVBhcmFtZXRlclNlY3VyaXR5KGNsb25lZFBhcmFtZXRlcnMpO1xuXG4gICAgICAvLyAzLiBWYWxpZGF0ZSBwYXJhbWV0ZXJzIGFnYWluc3QgZ29hbC5wYXJhbWV0ZXJzIHNjaGVtYVxuICAgICAgdGhpcy52YWxpZGF0ZVBhcmFtZXRlcnMobWV0YWRhdGEuZ29hbCwgY2xvbmVkUGFyYW1ldGVycyk7XG5cbiAgICAgIC8vIDQuIFJlbmRlciBnb2FsIHRlbXBsYXRlIGJ5IHJlcGxhY2luZyB7cGFyYW1ldGVyfSBwbGFjZWhvbGRlcnNcbiAgICAgIGNvbnN0IHJlbmRlcmVkR29hbCA9IHRoaXMucmVuZGVyR29hbFRlbXBsYXRlKG1ldGFkYXRhLmdvYWwudGVtcGxhdGUsIGNsb25lZFBhcmFtZXRlcnMpO1xuXG4gICAgICAvLyA0Yi4gRGV0ZWN0IHVubWF0Y2hlZCBwbGFjZWhvbGRlcnMgYWZ0ZXIgcmVuZGVyaW5nIChJc3N1ZSAjMTI2KVxuICAgICAgY29uc3QgdW5tYXRjaGVkUGxhY2Vob2xkZXJzID0gdGhpcy5kZXRlY3RVbm1hdGNoZWRQbGFjZWhvbGRlcnMocmVuZGVyZWRHb2FsKTtcbiAgICAgIGlmICh1bm1hdGNoZWRQbGFjZWhvbGRlcnMubGVuZ3RoID4gMCkge1xuICAgICAgICBsb2dnZXIud2FybignVW5tYXRjaGVkIHRlbXBsYXRlIHBsYWNlaG9sZGVycyBkZXRlY3RlZCBhZnRlciByZW5kZXJpbmcnLCB7XG4gICAgICAgICAgYWdlbnROYW1lOiBuYW1lLFxuICAgICAgICAgIHVubWF0Y2hlZDogdW5tYXRjaGVkUGxhY2Vob2xkZXJzLFxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgLy8gNS4gQ3JlYXRlIGV4ZWN1dGlvbiBjb250ZXh0IEJFRk9SRSBhY3RpdmF0aW5nIGVsZW1lbnRzIChJc3N1ZSAjMTA5IC0gY2lyY3VsYXIgYWN0aXZhdGlvbiBkZXRlY3Rpb24pXG4gICAgICBjb25zdCBleGVjdXRpb25Db250ZXh0ID0gY3JlYXRlRXhlY3V0aW9uQ29udGV4dChuYW1lKTtcblxuICAgICAgLy8gNWIuIFN0YXRpYyBhY3RpdmF0aW9uIGN5Y2xlIGRldGVjdGlvbiAoSXNzdWUgIzM3NClcbiAgICAgIGlmIChtZXRhZGF0YS5hY3RpdmF0ZXM/LmFnZW50cz8ubGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IGN5Y2xlUGF0aCA9IGF3YWl0IHRoaXMuZGV0ZWN0QWN0aXZhdGlvbkN5Y2xlcyhuYW1lLCBtZXRhZGF0YS5hY3RpdmF0ZXMuYWdlbnRzKTtcbiAgICAgICAgaWYgKGN5Y2xlUGF0aCkge1xuICAgICAgICAgIGNvbnN0IGN5Y2xlU3RhcnQgPSBjeWNsZVBhdGguaW5kZXhPZihjeWNsZVBhdGhbY3ljbGVQYXRoLmxlbmd0aCAtIDFdKTtcbiAgICAgICAgICBjb25zdCBjeWNsZSA9IGN5Y2xlUGF0aC5zbGljZShjeWNsZVN0YXJ0KTtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoQWdlbnRNYW5hZ2VyLmZvcm1hdENpcmN1bGFyQWN0aXZhdGlvbkVycm9yKGN5Y2xlKSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gNi4gQWN0aXZhdGUgZWxlbWVudHMgKGVsZW1lbnQtYWdub3N0aWMpXG4gICAgICBjb25zdCBhY3RpdmVFbGVtZW50czogUmVjb3JkPHN0cmluZywgQXJyYXk8eyBuYW1lOiBzdHJpbmc7IGNvbnRlbnQ6IHN0cmluZyB9Pj4gPSB7fTtcbiAgICAgIGNvbnN0IGFjdGl2YXRpb25XYXJuaW5nczogQXJyYXk8eyBlbGVtZW50VHlwZTogc3RyaW5nOyBlbGVtZW50TmFtZTogc3RyaW5nOyBlcnJvcjogc3RyaW5nIH0+ID0gW107XG5cbiAgICAgIGlmIChtZXRhZGF0YS5hY3RpdmF0ZXMpIHtcbiAgICAgICAgZm9yIChjb25zdCBbZWxlbWVudFR5cGUsIGVsZW1lbnROYW1lc10gb2YgT2JqZWN0LmVudHJpZXMobWV0YWRhdGEuYWN0aXZhdGVzKSkge1xuICAgICAgICAgIGlmICghZWxlbWVudE5hbWVzIHx8IGVsZW1lbnROYW1lcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGFjdGl2ZUVsZW1lbnRzW2VsZW1lbnRUeXBlXSA9IFtdO1xuXG4gICAgICAgICAgZm9yIChjb25zdCBlbGVtZW50TmFtZSBvZiBlbGVtZW50TmFtZXMpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGNvbnN0IGVsZW1lbnRDb250ZW50ID0gYXdhaXQgdGhpcy5nZXRFbGVtZW50Q29udGVudChlbGVtZW50VHlwZSwgZWxlbWVudE5hbWUsIGV4ZWN1dGlvbkNvbnRleHQpO1xuICAgICAgICAgICAgICBhY3RpdmVFbGVtZW50c1tlbGVtZW50VHlwZV0ucHVzaCh7XG4gICAgICAgICAgICAgICAgbmFtZTogZWxlbWVudE5hbWUsXG4gICAgICAgICAgICAgICAgY29udGVudDogZWxlbWVudENvbnRlbnRcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAvLyBISUdILTE6IFJlLXRocm93IGNpcmN1bGFyIGFjdGl2YXRpb24gZXJyb3JzIGltbWVkaWF0ZWx5IChJc3N1ZSAjMTA5KVxuICAgICAgICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvciAmJiBlcnJvci5tZXNzYWdlLmluY2x1ZGVzKCdDaXJjdWxhciBhZ2VudCBhY3RpdmF0aW9uIGRldGVjdGVkJykpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBjb25zdCBlcnJvck1lc3NhZ2UgPSBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcik7XG4gICAgICAgICAgICAgIGFjdGl2YXRpb25XYXJuaW5ncy5wdXNoKHsgZWxlbWVudFR5cGUsIGVsZW1lbnROYW1lLCBlcnJvcjogZXJyb3JNZXNzYWdlIH0pO1xuICAgICAgICAgICAgICBsb2dnZXIud2FybihgQWdlbnQgJyR7bmFtZX0nOiBmYWlsZWQgdG8gYWN0aXZhdGUgJHtlbGVtZW50VHlwZX0gJyR7ZWxlbWVudE5hbWV9JyDigJQgJHtlcnJvck1lc3NhZ2V9YCk7XG4gICAgICAgICAgICAgIC8vIENvbnRpbnVlIHdpdGggb3RoZXIgZWxlbWVudHMgcmF0aGVyIHRoYW4gZmFpbGluZyBjb21wbGV0ZWx5XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIDcuIEJ1aWxkIHRoZSByZXN1bHQgd2l0aCBhbGwgY29udGV4dCAoaW5pdGlhbGl6ZSB3aXRoIGRlZmF1bHQgc2FmZXR5IHRpZXIpXG4gICAgICBjb25zdCByZXN1bHQ6IEV4ZWN1dGVBZ2VudFJlc3VsdCA9IHtcbiAgICAgICAgYWdlbnROYW1lOiBuYW1lLFxuICAgICAgICBnb2FsOiByZW5kZXJlZEdvYWwsXG4gICAgICAgIGFjdGl2ZUVsZW1lbnRzLFxuICAgICAgICBhY3RpdmF0aW9uV2FybmluZ3M6IGFjdGl2YXRpb25XYXJuaW5ncy5sZW5ndGggPiAwID8gYWN0aXZhdGlvbldhcm5pbmdzIDogdW5kZWZpbmVkLFxuICAgICAgICAvLyBJc3N1ZSAjMTI2OiBXYXJuIGFib3V0IHVubWF0Y2hlZCB0ZW1wbGF0ZSBwbGFjZWhvbGRlcnNcbiAgICAgICAgdGVtcGxhdGVXYXJuaW5nczogdW5tYXRjaGVkUGxhY2Vob2xkZXJzLmxlbmd0aCA+IDBcbiAgICAgICAgICA/IHVubWF0Y2hlZFBsYWNlaG9sZGVycy5tYXAocCA9PiBgVW5tYXRjaGVkIHRlbXBsYXRlIHBsYWNlaG9sZGVyOiB7JHtwfX1gKVxuICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgICBhdmFpbGFibGVUb29sczogbWV0YWRhdGEudG9vbHM/LmFsbG93ZWQgfHwgW10sXG4gICAgICAgIHN1Y2Nlc3NDcml0ZXJpYTogbWV0YWRhdGEuZ29hbC5zdWNjZXNzQ3JpdGVyaWEgfHwgW10sXG4gICAgICAgIHN5c3RlbVByb21wdDogbWV0YWRhdGEuc3lzdGVtUHJvbXB0LFxuICAgICAgICBzYWZldHlUaWVyOiAnYWR2aXNvcnknLCAvLyBEZWZhdWx0LCB3aWxsIGJlIHVwZGF0ZWQgYmVsb3dcbiAgICAgIH07XG5cbiAgICAgIC8vIDguIENyZWF0ZSBhbmQgcGVyc2lzdCB0aGUgZ29hbCBmb3IgTExNIHRyYWNraW5nXG4gICAgICAvLyBUaGlzIGFsbG93cyByZWNvcmRfYWdlbnRfc3RlcCB0byBmaW5kIGFuZCB1cGRhdGUgdGhlIGdvYWxcblxuICAgICAgLy8gQ3JlYXRlIHRoZSBnb2FsIHVzaW5nIGFnZW50LmFkZEdvYWwoKSB3aGljaCBoYW5kbGVzIHZhbGlkYXRpb24gYW5kIHNhbml0aXphdGlvblxuICAgICAgY29uc3QgbmV3R29hbCA9IGFnZW50LmFkZEdvYWwoe1xuICAgICAgICBkZXNjcmlwdGlvbjogcmVuZGVyZWRHb2FsLFxuICAgICAgICBwcmlvcml0eTogJ21lZGl1bScsXG4gICAgICAgIGltcG9ydGFuY2U6IDUsXG4gICAgICAgIHVyZ2VuY3k6IDUsXG4gICAgICB9KTtcblxuICAgICAgLy8gU2V0IGdvYWwgc3RhdHVzIHRvIGluX3Byb2dyZXNzIHNpbmNlIGV4ZWN1dGlvbiBoYXMgc3RhcnRlZFxuICAgICAgbmV3R29hbC5zdGF0dXMgPSAnaW5fcHJvZ3Jlc3MnO1xuXG4gICAgICBjb25zdCBleGVjU2FuaXRpemVkTmFtZSA9IHNhbml0aXplSW5wdXQobmFtZSwgMTAwKTtcbiAgICAgIGF3YWl0IHRoaXMuc2F2ZShhZ2VudCwgdGhpcy5nZXRGaWxlbmFtZShleGVjU2FuaXRpemVkTmFtZSkpO1xuXG4gICAgICAvLyBTdG9yZSBnb2FsSWQgaW4gcmVzdWx0IGZvciBMTE0gdG8gdXNlIHdpdGggcmVjb3JkX2FnZW50X3N0ZXBcbiAgICAgIHJlc3VsdC5nb2FsSWQgPSBuZXdHb2FsLmlkO1xuXG4gICAgICAvLyBGaXggIzQ0NTogSW5jbHVkZSBzdGF0ZVZlcnNpb24gc28gc3Vic2VxdWVudCBjYWxscyBjYW4gZG8gdmVyc2lvbi1hd2FyZSBvcGVyYXRpb25zXG4gICAgICBjb25zdCBwb3N0U2F2ZVN0YXRlID0gYWdlbnQuZ2V0U3RhdGUoKTtcbiAgICAgIHJlc3VsdC5zdGF0ZVZlcnNpb24gPSBwb3N0U2F2ZVN0YXRlLnN0YXRlVmVyc2lvbiB8fCAxO1xuXG4gICAgICAvLyBDYWxsIHZhbGlkYXRlR29hbFNlY3VyaXR5IGFuZCBhZGQgd2FybmluZ3MgdG8gcmVzdWx0XG4gICAgICBjb25zdCBzZWN1cml0eVZhbGlkYXRpb24gPSBhZ2VudC52YWxpZGF0ZUdvYWxTZWN1cml0eShyZW5kZXJlZEdvYWwpO1xuICAgICAgaWYgKHNlY3VyaXR5VmFsaWRhdGlvbi53YXJuaW5ncyAmJiBzZWN1cml0eVZhbGlkYXRpb24ud2FybmluZ3MubGVuZ3RoID4gMCkge1xuICAgICAgICByZXN1bHQuc2VjdXJpdHlXYXJuaW5ncyA9IHNlY3VyaXR5VmFsaWRhdGlvbi53YXJuaW5ncztcbiAgICAgIH1cblxuICAgICAgLy8gQ2FsbCBldmFsdWF0ZUNvbnN0cmFpbnRzIGFuZCBhZGQgdG8gcmVzdWx0XG4gICAgICByZXN1bHQuY29uc3RyYWludHMgPSBhZ2VudC5ldmFsdWF0ZUNvbnN0cmFpbnRzKG5ld0dvYWwpO1xuXG4gICAgICAvLyBDYWxsIGFzc2Vzc1Jpc2sgYW5kIGFkZCB0byByZXN1bHRcbiAgICAgIHJlc3VsdC5yaXNrQXNzZXNzbWVudCA9IGFnZW50LmFzc2Vzc1Jpc2soJ2V4ZWN1dGUnLCBuZXdHb2FsLCB7fSk7XG5cbiAgICAgIC8vIENhbGwgY2FsY3VsYXRlUHJpb3JpdHlTY29yZSBhbmQgYWRkIHRvIHJlc3VsdFxuICAgICAgcmVzdWx0LnByaW9yaXR5U2NvcmUgPSBhZ2VudC5jYWxjdWxhdGVQcmlvcml0eVNjb3JlKG5ld0dvYWwpO1xuXG4gICAgICAvLyA5LiBEZXRlcm1pbmUgc2FmZXR5IHRpZXIgYmFzZWQgb24gcmlzayBhc3Nlc3NtZW50IGFuZCBzZWN1cml0eSB3YXJuaW5nc1xuICAgICAgLy8gKE5vdGU6IGV4ZWN1dGlvbkNvbnRleHQgYWxyZWFkeSBjcmVhdGVkIGVhcmxpZXIgZm9yIGNpcmN1bGFyIGRldGVjdGlvbilcbiAgICAgIGNvbnN0IHNhZmV0eVRpZXJSZXN1bHQgPSBkZXRlcm1pbmVTYWZldHlUaWVyKFxuICAgICAgICByZXN1bHQucmlza0Fzc2Vzc21lbnQ/LnNjb3JlIHx8IDAsXG4gICAgICAgIHJlc3VsdC5zZWN1cml0eVdhcm5pbmdzIHx8IFtdLFxuICAgICAgICByZW5kZXJlZEdvYWwsXG4gICAgICAgIERFRkFVTFRfU0FGRVRZX0NPTkZJRyxcbiAgICAgICAgZXhlY3V0aW9uQ29udGV4dFxuICAgICAgKTtcblxuICAgICAgLy8gMTAuIFNldCBzYWZldHkgdGllciBhbmQgcmVsYXRlZCBmaWVsZHNcbiAgICAgIHJlc3VsdC5zYWZldHlUaWVyID0gc2FmZXR5VGllclJlc3VsdC50aWVyO1xuICAgICAgcmVzdWx0LnNhZmV0eVRpZXJSZXN1bHQgPSBzYWZldHlUaWVyUmVzdWx0O1xuICAgICAgcmVzdWx0LmV4ZWN1dGlvbkNvbnRleHQgPSBleGVjdXRpb25Db250ZXh0O1xuXG4gICAgICAvLyAxMS4gQWRkIHRpZXItc3BlY2lmaWMgcmVzcG9uc2VzXG4gICAgICBzd2l0Y2ggKHNhZmV0eVRpZXJSZXN1bHQudGllcikge1xuICAgICAgICBjYXNlICdjb25maXJtJzpcbiAgICAgICAgICByZXN1bHQuY29uZmlybWF0aW9uUmVxdWlyZWQgPSBjcmVhdGVDb25maXJtYXRpb25SZXF1ZXN0KFxuICAgICAgICAgICAgJ09wZXJhdGlvbiByZXF1aXJlcyBjb25maXJtYXRpb24nLFxuICAgICAgICAgICAgc2FmZXR5VGllclJlc3VsdC5mYWN0b3JzXG4gICAgICAgICAgKTtcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlICd2ZXJpZnknOlxuICAgICAgICAgIHJlc3VsdC52ZXJpZmljYXRpb25SZXF1aXJlZCA9IGNyZWF0ZVZlcmlmaWNhdGlvbkNoYWxsZW5nZShcbiAgICAgICAgICAgIHNhZmV0eVRpZXJSZXN1bHQuZmFjdG9ycy5qb2luKCc7ICcpLFxuICAgICAgICAgICAgJ2Rpc3BsYXlfY29kZSdcbiAgICAgICAgICApO1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgJ2Rhbmdlcl96b25lJzpcbiAgICAgICAgICByZXN1bHQuZGFuZ2VyWm9uZUJsb2NrZWQgPSBjcmVhdGVEYW5nZXJab25lT3BlcmF0aW9uKFxuICAgICAgICAgICAgJ2FnZW50X2V4ZWN1dGlvbicsXG4gICAgICAgICAgICBzYWZldHlUaWVyUmVzdWx0LmZhY3RvcnMuam9pbignOyAnKSxcbiAgICAgICAgICAgIERFRkFVTFRfU0FGRVRZX0NPTkZJRy5kYW5nZXJab25lLmVuYWJsZWRcbiAgICAgICAgICApO1xuICAgICAgICAgIC8vIEFsc28gYWRkIHZlcmlmaWNhdGlvbiBpZiBub3QgYmxvY2tlZFxuICAgICAgICAgIGlmICghcmVzdWx0LmRhbmdlclpvbmVCbG9ja2VkLmJsb2NrZWQpIHtcbiAgICAgICAgICAgIHJlc3VsdC52ZXJpZmljYXRpb25SZXF1aXJlZCA9IHJlc3VsdC5kYW5nZXJab25lQmxvY2tlZC52ZXJpZmljYXRpb25SZXF1aXJlZDtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAnYWR2aXNvcnknOlxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIC8vIE5vIGFkZGl0aW9uYWwgYWN0aW9uIG5lZWRlZCBmb3IgYWR2aXNvcnkgdGllclxuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgIHR5cGU6ICdBR0VOVF9FWEVDVVRFRCcsXG4gICAgICAgIHNldmVyaXR5OiAnTE9XJyxcbiAgICAgICAgc291cmNlOiAnQWdlbnRNYW5hZ2VyLmV4ZWN1dGVBZ2VudCcsXG4gICAgICAgIGRldGFpbHM6IGBBZ2VudCBleGVjdXRlZDogJHtuYW1lfSB2JHthZ2VudC5tZXRhZGF0YS52ZXJzaW9uIHx8ICd1bmtub3duJ30gKHNhZmV0eTogJHtzYWZldHlUaWVyUmVzdWx0LnRpZXJ9KWAsXG4gICAgICAgIGFkZGl0aW9uYWxEYXRhOiB7XG4gICAgICAgICAgYWdlbnRJZDogYWdlbnQuaWQsXG4gICAgICAgICAgYWdlbnROYW1lOiBuYW1lLFxuICAgICAgICAgIHZlcnNpb246IGFnZW50Lm1ldGFkYXRhLnZlcnNpb24sXG4gICAgICAgICAgYXV0aG9yOiBhZ2VudC5tZXRhZGF0YS5hdXRob3IsXG4gICAgICAgICAgc2FmZXR5VGllcjogc2FmZXR5VGllclJlc3VsdC50aWVyLFxuICAgICAgICAgIHJpc2tTY29yZTogc2FmZXR5VGllclJlc3VsdC5yaXNrU2NvcmUsXG4gICAgICAgICAgcGFyYW1ldGVyS2V5czogT2JqZWN0LmtleXMocGFyYW1ldGVycyB8fCB7fSksXG4gICAgICAgICAgZ29hbENvdW50OiAobWV0YWRhdGEgYXMgYW55KS5nb2FsPy5wYXJhbWV0ZXJzPy5sZW5ndGggfHwgMCxcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci5lcnJvcihgRmFpbGVkIHRvIGV4ZWN1dGUgYWdlbnQgJyR7bmFtZX0nOmAsIGVycm9yKTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTZWN1cml0eSB2YWxpZGF0aW9uIGZvciB0ZW1wbGF0ZSBwYXJhbWV0ZXJzIChJc3N1ZSAjMTAzKS5cbiAgICogQ2hlY2tzIGZvciBwcm90b3R5cGUgcG9sbHV0aW9uLCBVbmljb2RlIGluamVjdGlvbiwgYW5kIG92ZXJzaXplZCBwYXlsb2Fkcy5cbiAgICogTXVzdCBiZSBjYWxsZWQgQkVGT1JFIHRlbXBsYXRlIHJlbmRlcmluZy5cbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgdmFsaWRhdGVQYXJhbWV0ZXJTZWN1cml0eShwYXJhbWV0ZXJzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IHZvaWQge1xuICAgIC8vIDEuIFByb3RvdHlwZSBwb2xsdXRpb24gY2hlY2sg4oCUIHJlamVjdCBkYW5nZXJvdXMga2V5c1xuICAgIGNvbnN0IEZPUkJJRERFTl9LRVlTID0gWydfX3Byb3RvX18nLCAnY29uc3RydWN0b3InLCAncHJvdG90eXBlJ107XG4gICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMocGFyYW1ldGVycykpIHtcbiAgICAgIGlmIChGT1JCSURERU5fS0VZUy5pbmNsdWRlcyhrZXkpKSB7XG4gICAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgICB0eXBlOiAnVE9LRU5fVkFMSURBVElPTl9GQUlMVVJFJyxcbiAgICAgICAgICBzZXZlcml0eTogJ0hJR0gnLFxuICAgICAgICAgIHNvdXJjZTogJ0FnZW50TWFuYWdlci52YWxpZGF0ZVBhcmFtZXRlclNlY3VyaXR5JyxcbiAgICAgICAgICBkZXRhaWxzOiBgUHJvdG90eXBlIHBvbGx1dGlvbiBhdHRlbXB0IHZpYSBwYXJhbWV0ZXIga2V5OiAnJHtrZXl9J2AsXG4gICAgICAgIH0pO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEZvcmJpZGRlbiBwYXJhbWV0ZXIga2V5OiAnJHtrZXl9JyAocG90ZW50aWFsIHByb3RvdHlwZSBwb2xsdXRpb24pYCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gMi4gTGltaXQgcGFyYW1ldGVyIGNvdW50IHRvIHByZXZlbnQgcmVzb3VyY2UgZXhoYXVzdGlvblxuICAgIGNvbnN0IE1BWF9QQVJBTUVURVJTID0gNTA7XG4gICAgaWYgKE9iamVjdC5rZXlzKHBhcmFtZXRlcnMpLmxlbmd0aCA+IE1BWF9QQVJBTUVURVJTKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFRvbyBtYW55IHBhcmFtZXRlcnM6ICR7T2JqZWN0LmtleXMocGFyYW1ldGVycykubGVuZ3RofSBleGNlZWRzIG1heGltdW0gb2YgJHtNQVhfUEFSQU1FVEVSU31gKTtcbiAgICB9XG5cbiAgICAvLyAzLiBVbmljb2RlIG5vcm1hbGl6YXRpb24gdmlhIElucHV0Tm9ybWFsaXplclxuICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSBJbnB1dE5vcm1hbGl6ZXIubm9ybWFsaXplKHBhcmFtZXRlcnMsICckLnBhcmFtZXRlcnMnKTtcbiAgICBpZiAobm9ybWFsaXplZC5oYXNIaWdoT3JDcml0aWNhbElzc3Vlcykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgVGVtcGxhdGUgcGFyYW1ldGVyIHNlY3VyaXR5IHZhbGlkYXRpb24gZmFpbGVkOiAke25vcm1hbGl6ZWQuZXJyb3JzLmpvaW4oJzsgJyl9YFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBBcHBseSBub3JtYWxpemVkIHZhbHVlcyBiYWNrIChpbi1wbGFjZSwgc2luY2Ugd2UgYWxyZWFkeSBjbG9uZWQpXG4gICAgY29uc3Qgbm9ybWFsaXplZERhdGEgPSBub3JtYWxpemVkLmRhdGEgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMobm9ybWFsaXplZERhdGEpKSB7XG4gICAgICBwYXJhbWV0ZXJzW2tleV0gPSB2YWx1ZTtcbiAgICB9XG5cbiAgICBpZiAobm9ybWFsaXplZC53YXJuaW5ncy5sZW5ndGggPiAwKSB7XG4gICAgICBsb2dnZXIud2FybignVGVtcGxhdGUgcGFyYW1ldGVyIG5vcm1hbGl6YXRpb24gd2FybmluZ3MnLCB7XG4gICAgICAgIHdhcm5pbmdzOiBub3JtYWxpemVkLndhcm5pbmdzLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlIHBhcmFtZXRlcnMgYWdhaW5zdCBnb2FsIHBhcmFtZXRlciBzY2hlbWFcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgdmFsaWRhdGVQYXJhbWV0ZXJzKFxuICAgIGdvYWxDb25maWc6IEFnZW50R29hbENvbmZpZyxcbiAgICBwYXJhbWV0ZXJzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICApOiB2b2lkIHtcbiAgICBjb25zdCBwYXJhbURlZnMgPSBnb2FsQ29uZmlnLnBhcmFtZXRlcnMgfHwgW107XG5cbiAgICAvLyBDaGVjayBhbGwgcmVxdWlyZWQgcGFyYW1ldGVycyBhcmUgcHJlc2VudFxuICAgIGZvciAoY29uc3QgcGFyYW1EZWYgb2YgcGFyYW1EZWZzKSB7XG4gICAgICBpZiAocGFyYW1EZWYucmVxdWlyZWQgJiYgIShwYXJhbURlZi5uYW1lIGluIHBhcmFtZXRlcnMpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgTWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXI6ICR7cGFyYW1EZWYubmFtZX1gKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBUeXBlIGNoZWNrIHByb3ZpZGVkIHBhcmFtZXRlcnNcbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhwYXJhbWV0ZXJzKSkge1xuICAgICAgY29uc3QgcGFyYW1EZWYgPSBwYXJhbURlZnMuZmluZChwID0+IHAubmFtZSA9PT0ga2V5KTtcbiAgICAgIGlmICghcGFyYW1EZWYpIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oYFVua25vd24gcGFyYW1ldGVyICcke2tleX0nIHByb3ZpZGVkIHRvIGFnZW50YCk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBUeXBlIHZhbGlkYXRpb25cbiAgICAgIGNvbnN0IGFjdHVhbFR5cGUgPSB0eXBlb2YgdmFsdWU7XG4gICAgICBpZiAocGFyYW1EZWYudHlwZSA9PT0gJ3N0cmluZycgJiYgYWN0dWFsVHlwZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBQYXJhbWV0ZXIgJyR7a2V5fScgbXVzdCBiZSBhIHN0cmluZywgZ290ICR7YWN0dWFsVHlwZX1gXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBpZiAocGFyYW1EZWYudHlwZSA9PT0gJ251bWJlcicgJiYgYWN0dWFsVHlwZSAhPT0gJ251bWJlcicpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBQYXJhbWV0ZXIgJyR7a2V5fScgbXVzdCBiZSBhIG51bWJlciwgZ290ICR7YWN0dWFsVHlwZX1gXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBpZiAocGFyYW1EZWYudHlwZSA9PT0gJ2Jvb2xlYW4nICYmIGFjdHVhbFR5cGUgIT09ICdib29sZWFuJykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYFBhcmFtZXRlciAnJHtrZXl9JyBtdXN0IGJlIGEgYm9vbGVhbiwgZ290ICR7YWN0dWFsVHlwZX1gXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIC8vIEFkdmlzb3J5IGxlbmd0aCB3YXJuaW5nIGZvciBzdHJpbmcgdmFsdWVzIChkZWZlbnNlLWluLWRlcHRoLCBkb2VzIG5vdCB0aHJvdylcbiAgICAgIGlmIChhY3R1YWxUeXBlID09PSAnc3RyaW5nJyAmJiAodmFsdWUgYXMgc3RyaW5nKS5sZW5ndGggPiBBR0VOVF9MSU1JVFMuTUFYX0dPQUxfTEVOR1RIKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKCdQYXJhbWV0ZXIgc3RyaW5nIHZhbHVlIGV4Y2VlZHMgTUFYX0dPQUxfTEVOR1RIIChhZHZpc29yeSknLCB7XG4gICAgICAgICAgcGFyYW1OYW1lOiBrZXksXG4gICAgICAgICAgdmFsdWVMZW5ndGg6ICh2YWx1ZSBhcyBzdHJpbmcpLmxlbmd0aCxcbiAgICAgICAgICBtYXhMZW5ndGg6IEFHRU5UX0xJTUlUUy5NQVhfR09BTF9MRU5HVEgsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEFwcGx5IGRlZmF1bHRzIGZvciBvcHRpb25hbCBwYXJhbWV0ZXJzIG5vdCBwcm92aWRlZFxuICAgIGZvciAoY29uc3QgcGFyYW1EZWYgb2YgcGFyYW1EZWZzKSB7XG4gICAgICBpZiAoIXBhcmFtRGVmLnJlcXVpcmVkICYmICEocGFyYW1EZWYubmFtZSBpbiBwYXJhbWV0ZXJzKSAmJiBwYXJhbURlZi5kZWZhdWx0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcGFyYW1ldGVyc1twYXJhbURlZi5uYW1lXSA9IHBhcmFtRGVmLmRlZmF1bHQ7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlbmRlciBnb2FsIHRlbXBsYXRlIGJ5IHJlcGxhY2luZyB7cGFyYW1ldGVyfSBwbGFjZWhvbGRlcnNcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgcmVuZGVyR29hbFRlbXBsYXRlKFxuICAgIHRlbXBsYXRlOiBzdHJpbmcsXG4gICAgcGFyYW1ldGVyczogUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgKTogc3RyaW5nIHtcbiAgICBsZXQgcmVuZGVyZWQgPSB0ZW1wbGF0ZTtcbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhwYXJhbWV0ZXJzKSkge1xuICAgICAgLy8gRXNjYXBlIGtleSB0byBwcmV2ZW50IHJlZ2V4IG1ldGFjaGFyYWN0ZXJzIGZyb20gY2F1c2luZyBSZURvUyAoSXNzdWUgIzEwMylcbiAgICAgIGNvbnN0IGVzY2FwZWRLZXkgPSBTYWZlUmVnZXguZXNjYXBlKGtleSk7XG4gICAgICByZW5kZXJlZCA9IHJlbmRlcmVkLnJlcGxhY2UobmV3IFJlZ0V4cChgXFxcXHske2VzY2FwZWRLZXl9XFxcXH1gLCAnZycpLCBTdHJpbmcodmFsdWUpKTtcbiAgICB9XG5cbiAgICAvLyBDYXAgcmVuZGVyZWQgZ29hbCBsZW5ndGggdG8gcHJldmVudCBvdmVyc2l6ZWQgcGF5bG9hZHNcbiAgICBpZiAocmVuZGVyZWQubGVuZ3RoID4gQUdFTlRfTElNSVRTLk1BWF9SRU5ERVJFRF9HT0FMX0xFTkdUSCkge1xuICAgICAgbG9nZ2VyLndhcm4oJ1JlbmRlcmVkIGdvYWwgZXhjZWVkcyBNQVhfUkVOREVSRURfR09BTF9MRU5HVEgsIHRydW5jYXRpbmcnLCB7XG4gICAgICAgIHJlbmRlcmVkTGVuZ3RoOiByZW5kZXJlZC5sZW5ndGgsXG4gICAgICAgIG1heExlbmd0aDogQUdFTlRfTElNSVRTLk1BWF9SRU5ERVJFRF9HT0FMX0xFTkdUSCxcbiAgICAgIH0pO1xuICAgICAgcmVuZGVyZWQgPSByZW5kZXJlZC5zdWJzdHJpbmcoMCwgQUdFTlRfTElNSVRTLk1BWF9SRU5ERVJFRF9HT0FMX0xFTkdUSCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlbmRlcmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIERldGVjdCB1bm1hdGNoZWQge3BsYWNlaG9sZGVyfSBwYXR0ZXJucyByZW1haW5pbmcgYWZ0ZXIgdGVtcGxhdGUgcmVuZGVyaW5nLlxuICAgKiBSZXR1cm5zIGFycmF5IG9mIHBsYWNlaG9sZGVyIG5hbWVzIGZvdW5kIGluIHRoZSByZW5kZXJlZCBzdHJpbmcuXG4gICAqIElzc3VlICMxMjY6IFdhcm4gd2hlbiB0ZW1wbGF0ZSBwYXJhbWV0ZXJzIGFyZSBtaXNzaW5nLlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBkZXRlY3RVbm1hdGNoZWRQbGFjZWhvbGRlcnMocmVuZGVyZWQ6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBwbGFjZWhvbGRlclBhdHRlcm4gPSAvXFx7KFthLXpBLVpfXVthLXpBLVowLTlfXSopXFx9L2c7XG4gICAgY29uc3QgdW5tYXRjaGVkOiBzdHJpbmdbXSA9IFtdO1xuICAgIGxldCBtYXRjaDogUmVnRXhwRXhlY0FycmF5IHwgbnVsbDtcbiAgICB3aGlsZSAoKG1hdGNoID0gcGxhY2Vob2xkZXJQYXR0ZXJuLmV4ZWMocmVuZGVyZWQpKSAhPT0gbnVsbCkge1xuICAgICAgdW5tYXRjaGVkLnB1c2gobWF0Y2hbMV0pO1xuICAgIH1cbiAgICByZXR1cm4gdW5tYXRjaGVkO1xuICB9XG5cbiAgLyoqXG4gICAqIEZvcm1hdHMgYSBjb25zaXN0ZW50IGVycm9yIG1lc3NhZ2UgZm9yIGNpcmN1bGFyIGFjdGl2YXRpb24gZGV0ZWN0aW9uLlxuICAgKiBVc2VkIGJ5IGJvdGggdGhlIHN0YXRpYyBwcmUtZmxpZ2h0IGNoZWNrIGFuZCB0aGUgcnVudGltZSBjaGFpbiBjaGVjay5cbiAgICovXG4gIHByaXZhdGUgc3RhdGljIGZvcm1hdENpcmN1bGFyQWN0aXZhdGlvbkVycm9yKGN5Y2xlUGF0aDogc3RyaW5nW10pOiBzdHJpbmcge1xuICAgIGNvbnN0IGFnZW50TmFtZSA9IGN5Y2xlUGF0aFtjeWNsZVBhdGgubGVuZ3RoIC0gMV07XG4gICAgcmV0dXJuIChcbiAgICAgIGBDaXJjdWxhciBhZ2VudCBhY3RpdmF0aW9uIGRldGVjdGVkIChjeWNsZSBvZiAke2N5Y2xlUGF0aC5sZW5ndGggLSAxfSk6IGAgK1xuICAgICAgYCR7Y3ljbGVQYXRoLmpvaW4oJyDihpIgJyl9LiBgICtcbiAgICAgIGBBZ2VudCAnJHthZ2VudE5hbWV9JyBjYW5ub3QgYWN0aXZhdGUgaXRzZWxmIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkuYFxuICAgICk7XG4gIH1cblxuICAvKiogU2FmZXR5IGxpbWl0cyBmb3IgYWN0aXZhdGlvbiBncmFwaCB0cmF2ZXJzYWwgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgTUFYX0FDVElWQVRJT05fREVQVEggPSAxMDtcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgTUFYX05PREVTX1ZJU0lURUQgPSAxMDA7XG5cbiAgLyoqXG4gICAqIFN0YXRpYyBhY3RpdmF0aW9uIGN5Y2xlIGRldGVjdGlvbiDigJQgTGF5ZXIgMSBvZiBkdWFsLWRldGVjdGlvbiBzdHJhdGVneSAoSXNzdWUgIzM3NClcbiAgICpcbiAgICogUGVyZm9ybXMgYXN5bmMgREZTIG9uIHRoZSBhY3RpdmF0aW9uIGdyYXBoIHRvIGRldGVjdCBjeWNsZXMgQkVGT1JFIGV4ZWN1dGlvbiBiZWdpbnMuXG4gICAqIFRoaXMgaXMgYSBwcmUtZmxpZ2h0IGNoZWNrIHRoYXQgcHJldmVudHMgY2lyY3VsYXIgYWN0aXZhdGlvbiBjaGFpbnMgZnJvbSBiZWluZyBhdHRlbXB0ZWQuXG4gICAqXG4gICAqIExheWVyIDEgKHRoaXMgbWV0aG9kKTogU3RhdGljIGdyYXBoIGFuYWx5c2lzIOKAlCB3YWxrcyB0aGUgYWN0aXZhdGlvbiBncmFwaCBmcm9tIHRoZSByb290XG4gICAqIGFnZW50LCBsb2FkaW5nIGVhY2ggYWdlbnQncyBgYWN0aXZhdGVzLmFnZW50c2AgbWV0YWRhdGEuIENhdGNoZXMgYWxsIGN5Y2xlcyByZWFjaGFibGVcbiAgICogZnJvbSB0aGUgcm9vdCB3aXRob3V0IGV4ZWN1dGluZyBhbnkgYWdlbnRzLiBCb3VuZGVkIGJ5IE1BWF9BQ1RJVkFUSU9OX0RFUFRIIGFuZFxuICAgKiBNQVhfTk9ERVNfVklTSVRFRCB0byBwcmV2ZW50IHJlc291cmNlIGV4aGF1c3Rpb24gZnJvbSBsYXJnZSBhY3ljbGljIGdyYXBocy5cbiAgICpcbiAgICogTGF5ZXIgMiAoZ2V0RWxlbWVudENvbnRlbnQgcnVudGltZSBjaGVjayk6IERlZmVuc2UtaW4tZGVwdGgg4oCUIGd1YXJkcyBhZ2FpbnN0IGVkZ2UgY2FzZXNcbiAgICogbGlrZSBkeW5hbWljYWxseS1jb25zdHJ1Y3RlZCBhY3RpdmF0aW9uIGNoYWlucyBvciBhZ2VudHMgbW9kaWZpZWQgYmV0d2VlbiB0aGUgc3RhdGljXG4gICAqIGNoZWNrIGFuZCBhY3R1YWwgZXhlY3V0aW9uLiBTZWUgZ2V0RWxlbWVudENvbnRlbnQgZm9yIGRldGFpbHMuXG4gICAqXG4gICAqIEBwYXJhbSByb290TmFtZSAtIFRoZSByb290IGFnZW50IG5hbWUgaW5pdGlhdGluZyB0aGUgYWN0aXZhdGlvbiBjaGFpblxuICAgKiBAcGFyYW0gYWN0aXZhdGVkQWdlbnRzIC0gVGhlIGltbWVkaWF0ZSBhZ2VudHMgYWN0aXZhdGVkIGJ5IHRoZSByb290XG4gICAqIEByZXR1cm5zIFRoZSBjeWNsZSBwYXRoIGFycmF5IGlmIGEgY3ljbGUgZXhpc3RzLCBudWxsIG90aGVyd2lzZVxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBkZXRlY3RBY3RpdmF0aW9uQ3ljbGVzKFxuICAgIHJvb3ROYW1lOiBzdHJpbmcsXG4gICAgYWN0aXZhdGVkQWdlbnRzOiBzdHJpbmdbXVxuICApOiBQcm9taXNlPHN0cmluZ1tdIHwgbnVsbD4ge1xuICAgIC8vIENhY2hlIGxvYWRlZCBhZ2VudHMgdG8gYXZvaWQgcmVkdW5kYW50IEkvTyBkdXJpbmcgREZTXG4gICAgY29uc3QgYWdlbnRDYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmdbXSB8IG51bGw+KCk7XG5cbiAgICAvLyBIZWxwZXI6IGxvYWQgYW4gYWdlbnQncyBhY3RpdmF0ZXMuYWdlbnRzIGxpc3QgKGNhY2hlZClcbiAgICBjb25zdCBnZXRBY3RpdmF0ZWRBZ2VudHMgPSBhc3luYyAobmFtZTogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmdbXT4gPT4ge1xuICAgICAgY29uc3QgY2FjaGVLZXkgPSBuYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICBpZiAoYWdlbnRDYWNoZS5oYXMoY2FjaGVLZXkpKSB7XG4gICAgICAgIHJldHVybiBhZ2VudENhY2hlLmdldChjYWNoZUtleSkgfHwgW107XG4gICAgICB9XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBhZ2VudCA9IGF3YWl0IHRoaXMucmVhZChuYW1lKTtcbiAgICAgICAgaWYgKCFhZ2VudCkge1xuICAgICAgICAgIGxvZ2dlci53YXJuKGBBZ2VudCAnJHtuYW1lfScgcmVmZXJlbmNlZCBpbiBhY3RpdmF0ZXMuYWdlbnRzIGNvdWxkIG5vdCBiZSByZXNvbHZlZCBkdXJpbmcgY3ljbGUgZGV0ZWN0aW9uYCk7XG4gICAgICAgICAgYWdlbnRDYWNoZS5zZXQoY2FjaGVLZXksIG51bGwpO1xuICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBtZXRhID0gYWdlbnQubWV0YWRhdGEgYXMgQWdlbnRNZXRhZGF0YVYyO1xuICAgICAgICBjb25zdCBhZ2VudHMgPSBtZXRhLmFjdGl2YXRlcz8uYWdlbnRzIHx8IFtdO1xuICAgICAgICBhZ2VudENhY2hlLnNldChjYWNoZUtleSwgYWdlbnRzKTtcbiAgICAgICAgcmV0dXJuIGFnZW50cztcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICBsb2dnZXIud2FybihgQWdlbnQgJyR7bmFtZX0nIHJlZmVyZW5jZWQgaW4gYWN0aXZhdGVzLmFnZW50cyBjb3VsZCBub3QgYmUgcmVzb2x2ZWQgZHVyaW5nIGN5Y2xlIGRldGVjdGlvbmApO1xuICAgICAgICBhZ2VudENhY2hlLnNldChjYWNoZUtleSwgbnVsbCk7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8gVHJhY2tzIG5vZGVzIHdob3NlIGVudGlyZSBzdWJ0cmVlIGhhcyBiZWVuIGV4cGxvcmVkIHdpdGhvdXQgZmluZGluZyBhIGN5Y2xlLlxuICAgIC8vIFByZXZlbnRzIGV4cG9uZW50aWFsIHJlLWV4cGxvcmF0aW9uIGluIGRpYW1vbmQvY29udmVyZ2VudCBncmFwaHMuXG4gICAgY29uc3QgZnVsbHlFeHBsb3JlZCA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgIGxldCBub2Rlc1Zpc2l0ZWQgPSAwO1xuXG4gICAgLy8gREZTIOKAlCBzdGFjayBlbnRyaWVzOiBbY3VycmVudEFnZW50LCBwYXRoU29GYXIsIHBhdGhTZXRMb3dlcl1cbiAgICAvLyBwYXRoU2V0TG93ZXIgaXMgYSBTZXQ8c3RyaW5nPiBvZiBsb3dlcmNhc2VkIG5hbWVzIGZvciBPKDEpIGN5Y2xlIGNoZWNrc1xuICAgIGNvbnN0IHN0YWNrOiBBcnJheTxbc3RyaW5nLCBzdHJpbmdbXSwgU2V0PHN0cmluZz5dPiA9IFtdO1xuXG4gICAgY29uc3Qgcm9vdExvd2VyID0gcm9vdE5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIGFjdGl2YXRlZEFnZW50cykge1xuICAgICAgLy8gU2VsZi1sb29wOiBhZ2VudCBkaXJlY3RseSBhY3RpdmF0ZXMgaXRzZWxmXG4gICAgICBpZiAoY2hpbGQudG9Mb3dlckNhc2UoKSA9PT0gcm9vdExvd2VyKSB7XG4gICAgICAgIHJldHVybiBbcm9vdE5hbWUsIGNoaWxkXTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHBhdGhTZXQgPSBuZXcgU2V0PHN0cmluZz4oW3Jvb3RMb3dlciwgY2hpbGQudG9Mb3dlckNhc2UoKV0pO1xuICAgICAgc3RhY2sucHVzaChbY2hpbGQsIFtyb290TmFtZSwgY2hpbGRdLCBwYXRoU2V0XSk7XG4gICAgfVxuXG4gICAgd2hpbGUgKHN0YWNrLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IFtjdXJyZW50LCBjdXJyZW50UGF0aCwgcGF0aFNldF0gPSBzdGFjay5wb3AoKSE7XG5cbiAgICAgIG5vZGVzVmlzaXRlZCsrO1xuICAgICAgaWYgKG5vZGVzVmlzaXRlZCA+IEFnZW50TWFuYWdlci5NQVhfTk9ERVNfVklTSVRFRCkge1xuICAgICAgICBsb2dnZXIud2FybihcbiAgICAgICAgICBgQWN0aXZhdGlvbiBjeWNsZSBkZXRlY3Rpb24gZm9yICcke3Jvb3ROYW1lfScgYWJvcnRlZDogZXhjZWVkZWQgJHtBZ2VudE1hbmFnZXIuTUFYX05PREVTX1ZJU0lURUR9IG5vZGVzIHZpc2l0ZWQuIGAgK1xuICAgICAgICAgIGBUaGUgYWN0aXZhdGlvbiBncmFwaCBtYXkgYmUgdG9vIGxhcmdlLmBcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIGlmIChjdXJyZW50UGF0aC5sZW5ndGggPiBBZ2VudE1hbmFnZXIuTUFYX0FDVElWQVRJT05fREVQVEggKyAxKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKFxuICAgICAgICAgIGBBY3RpdmF0aW9uIGN5Y2xlIGRldGVjdGlvbiBmb3IgJyR7cm9vdE5hbWV9JyBoaXQgZGVwdGggbGltaXQgb2YgJHtBZ2VudE1hbmFnZXIuTUFYX0FDVElWQVRJT05fREVQVEh9LiBgICtcbiAgICAgICAgICBgU2tpcHBpbmcgZGVlcGVyIGJyYW5jaGVzLmBcbiAgICAgICAgKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGN1cnJlbnRMb3dlciA9IGN1cnJlbnQudG9Mb3dlckNhc2UoKTtcbiAgICAgIGlmIChmdWxseUV4cGxvcmVkLmhhcyhjdXJyZW50TG93ZXIpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBMb2FkIHRoaXMgYWdlbnQncyBhY3RpdmF0aW9uc1xuICAgICAgY29uc3QgY2hpbGRyZW4gPSBhd2FpdCBnZXRBY3RpdmF0ZWRBZ2VudHMoY3VycmVudCk7XG5cbiAgICAgIGxldCBmb3VuZEN5Y2xlID0gZmFsc2U7XG4gICAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIGNoaWxkcmVuKSB7XG4gICAgICAgIGNvbnN0IGNoaWxkTG93ZXIgPSBjaGlsZC50b0xvd2VyQ2FzZSgpO1xuXG4gICAgICAgIC8vIENoZWNrIGZvciBjeWNsZTogZG9lcyB0aGlzIGNoaWxkIGFwcGVhciBlYXJsaWVyIGluIHRoZSBwYXRoP1xuICAgICAgICBpZiAocGF0aFNldC5oYXMoY2hpbGRMb3dlcikpIHtcbiAgICAgICAgICByZXR1cm4gWy4uLmN1cnJlbnRQYXRoLCBjaGlsZF07XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWZ1bGx5RXhwbG9yZWQuaGFzKGNoaWxkTG93ZXIpKSB7XG4gICAgICAgICAgY29uc3QgbmV3UGF0aFNldCA9IG5ldyBTZXQocGF0aFNldCk7XG4gICAgICAgICAgbmV3UGF0aFNldC5hZGQoY2hpbGRMb3dlcik7XG4gICAgICAgICAgc3RhY2sucHVzaChbY2hpbGQsIFsuLi5jdXJyZW50UGF0aCwgY2hpbGRdLCBuZXdQYXRoU2V0XSk7XG4gICAgICAgICAgZm91bmRDeWNsZSA9IHRydWU7IC8vIGhhcyBjaGlsZHJlbiB0byBleHBsb3JlLCBub3QgZnVsbHkgZXhwbG9yZWQgeWV0XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gSWYgbm8gdW5leHBsb3JlZCBjaGlsZHJlbiwgdGhpcyBub2RlJ3Mgc3VidHJlZSBpcyBjeWNsZS1mcmVlXG4gICAgICBpZiAoIWZvdW5kQ3ljbGUpIHtcbiAgICAgICAgZnVsbHlFeHBsb3JlZC5hZGQoY3VycmVudExvd2VyKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgY29udGVudCBmcm9tIGFuIGVsZW1lbnQgKGVsZW1lbnQtYWdub3N0aWMpXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGdldEVsZW1lbnRDb250ZW50KFxuICAgIGVsZW1lbnRUeXBlOiBzdHJpbmcsXG4gICAgZWxlbWVudE5hbWU6IHN0cmluZyxcbiAgICBleGVjdXRpb25Db250ZXh0PzogRXhlY3V0aW9uQ29udGV4dFxuICApOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIC8vIEdldCB0aGUgc3RhdGljIHJlc29sdmVyXG4gICAgY29uc3QgcmVzb2x2ZXIgPSBBZ2VudE1hbmFnZXIuZ2V0RWxlbWVudE1hbmFnZXJSZXNvbHZlcigpO1xuICAgIGlmICghcmVzb2x2ZXIpIHtcbiAgICAgIGxvZ2dlci53YXJuKGBFbGVtZW50IG1hbmFnZXIgcmVzb2x2ZXIgbm90IGNvbmZpZ3VyZWQgLSBjYW5ub3QgYWN0aXZhdGUgJHtlbGVtZW50VHlwZX0vJHtlbGVtZW50TmFtZX1gKTtcbiAgICAgIHJldHVybiBgW0VsZW1lbnQgbWFuYWdlciByZXNvbHZlciBub3QgY29uZmlndXJlZCBmb3IgJHtlbGVtZW50VHlwZX0vJHtlbGVtZW50TmFtZX1dYDtcbiAgICB9XG5cbiAgICAvLyBMYXllciAyIChkZWZlbnNlLWluLWRlcHRoKTogUnVudGltZSBjaXJjdWxhciBhY3RpdmF0aW9uIGRldGVjdGlvbiAoSXNzdWUgIzEwOSlcbiAgICAvLyBUaGUgc3RhdGljIHByZS1mbGlnaHQgY2hlY2sgKGRldGVjdEFjdGl2YXRpb25DeWNsZXMsIGxheWVyIDEpIGNhdGNoZXMgbW9zdCBjeWNsZXNcbiAgICAvLyBiZWZvcmUgZXhlY3V0aW9uIGJlZ2lucy4gVGhpcyBydW50aW1lIGNoZWNrIGd1YXJkcyBhZ2FpbnN0IGVkZ2UgY2FzZXMgc3VjaCBhc1xuICAgIC8vIGR5bmFtaWNhbGx5LWNvbnN0cnVjdGVkIGFjdGl2YXRpb24gY2hhaW5zIG9yIGFnZW50cyBtb2RpZmllZCBiZXR3ZWVuIHRoZSBzdGF0aWNcbiAgICAvLyBjaGVjayBhbmQgYWN0dWFsIGV4ZWN1dGlvbi4gVXNlcyBleGVjdXRpb25Db250ZXh0LmFnZW50Q2hhaW4gd2hpY2ggdHJhY2tzIHRoZVxuICAgIC8vIGN1cnJlbnQgZXhlY3V0aW9uIHBhdGgg4oCUIGVmZmVjdGl2ZSBmb3IgZGlyZWN0IGFuZCBtdWx0aS1ob3AgY2hhaW5zIHdpdGhpbiBhXG4gICAgLy8gc2luZ2xlIGV4ZWN1dGlvbiBjb250ZXh0LlxuICAgIGlmIChlbGVtZW50VHlwZSA9PT0gJ2FnZW50cycgJiYgZXhlY3V0aW9uQ29udGV4dD8uYWdlbnRDaGFpbikge1xuICAgICAgY29uc3QgY2hhaW5TZXQgPSBuZXcgU2V0KGV4ZWN1dGlvbkNvbnRleHQuYWdlbnRDaGFpbi5tYXAobmFtZSA9PiBuYW1lLnRvTG93ZXJDYXNlKCkpKTtcbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWROYW1lID0gZWxlbWVudE5hbWUudG9Mb3dlckNhc2UoKTtcblxuICAgICAgaWYgKGNoYWluU2V0Lmhhcyhub3JtYWxpemVkTmFtZSkpIHtcbiAgICAgICAgY29uc3QgY3ljbGVQYXRoID0gWy4uLmV4ZWN1dGlvbkNvbnRleHQuYWdlbnRDaGFpbiwgZWxlbWVudE5hbWVdO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoQWdlbnRNYW5hZ2VyLmZvcm1hdENpcmN1bGFyQWN0aXZhdGlvbkVycm9yKGN5Y2xlUGF0aCkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICAvLyBNYXAgcGx1cmFsIGVsZW1lbnQgdHlwZXMgdG8gbWFuYWdlciBuYW1lc1xuICAgICAgY29uc3QgbWFuYWdlck5hbWVNYXA6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgICAgIHBlcnNvbmFzOiAnUGVyc29uYU1hbmFnZXInLFxuICAgICAgICBza2lsbHM6ICdTa2lsbE1hbmFnZXInLFxuICAgICAgICBtZW1vcmllczogJ01lbW9yeU1hbmFnZXInLFxuICAgICAgICB0ZW1wbGF0ZXM6ICdUZW1wbGF0ZU1hbmFnZXInLFxuICAgICAgICBlbnNlbWJsZXM6ICdFbnNlbWJsZU1hbmFnZXInLFxuICAgICAgICBhZ2VudHM6ICdBZ2VudE1hbmFnZXInXG4gICAgICB9O1xuXG4gICAgICBjb25zdCBtYW5hZ2VyTmFtZSA9IG1hbmFnZXJOYW1lTWFwW2VsZW1lbnRUeXBlXTtcbiAgICAgIGlmICghbWFuYWdlck5hbWUpIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oYFVua25vd24gZWxlbWVudCB0eXBlOiAke2VsZW1lbnRUeXBlfWApO1xuICAgICAgICByZXR1cm4gYFtVbmtub3duIGVsZW1lbnQgdHlwZTogJHtlbGVtZW50VHlwZX1dYDtcbiAgICAgIH1cblxuICAgICAgY29uc3QgbWFuYWdlciA9IHJlc29sdmVyKG1hbmFnZXJOYW1lKTtcbiAgICAgIGlmICghbWFuYWdlcikge1xuICAgICAgICBsb2dnZXIud2FybihgTWFuYWdlciBub3QgZm91bmQgZm9yIGVsZW1lbnQgdHlwZTogJHtlbGVtZW50VHlwZX1gKTtcbiAgICAgICAgcmV0dXJuIGBbTWFuYWdlciBub3QgZm91bmQ6ICR7bWFuYWdlck5hbWV9XWA7XG4gICAgICB9XG5cbiAgICAgIC8vIEdldCBhbGwgZWxlbWVudHMgb2YgdGhpcyB0eXBlXG4gICAgICBjb25zdCBlbGVtZW50cyA9IGF3YWl0IG1hbmFnZXIubGlzdCgpO1xuICAgICAgY29uc3QgZWxlbWVudCA9IGVsZW1lbnRzLmZpbmQoKGU6IGFueSkgPT4gZS5tZXRhZGF0YS5uYW1lID09PSBlbGVtZW50TmFtZSk7XG5cbiAgICAgIGlmICghZWxlbWVudCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7ZWxlbWVudFR5cGV9ICcke2VsZW1lbnROYW1lfScgbm90IGZvdW5kYCk7XG4gICAgICB9XG5cbiAgICAgIC8vIFJldHVybiBhcHByb3ByaWF0ZSBjb250ZW50IGJhc2VkIG9uIGVsZW1lbnQgdHlwZVxuICAgICAgc3dpdGNoIChlbGVtZW50VHlwZSkge1xuICAgICAgICBjYXNlICdwZXJzb25hcyc6XG4gICAgICAgICAgcmV0dXJuIGVsZW1lbnQuY29udGVudCB8fCAnJztcblxuICAgICAgICBjYXNlICdza2lsbHMnOlxuICAgICAgICAgIHJldHVybiBlbGVtZW50Lmluc3RydWN0aW9ucyB8fCAnJztcblxuICAgICAgICBjYXNlICdtZW1vcmllcyc6IHtcbiAgICAgICAgICBjb25zdCBlbnRyaWVzID0gZWxlbWVudC5nZXRFbnRyaWVzKCk7XG4gICAgICAgICAgcmV0dXJuIGBNZW1vcnkgJyR7ZWxlbWVudE5hbWV9JyB3aXRoICR7ZW50cmllcy5sZW5ndGh9IGVudHJpZXNgO1xuICAgICAgICB9XG5cbiAgICAgICAgY2FzZSAndGVtcGxhdGVzJzpcbiAgICAgICAgICByZXR1cm4gZWxlbWVudC5jb250ZW50IHx8ICcnO1xuXG4gICAgICAgIGNhc2UgJ2Vuc2VtYmxlcyc6IHtcbiAgICAgICAgICBjb25zdCBlbGVtZW50TGlzdCA9IE9iamVjdC5lbnRyaWVzKGVsZW1lbnQuZWxlbWVudHMgfHwge30pXG4gICAgICAgICAgICAubWFwKChbdHlwZSwgbmFtZXNdKSA9PiBgJHt0eXBlfTogJHtBcnJheS5pc0FycmF5KG5hbWVzKSA/IG5hbWVzLmpvaW4oJywgJykgOiBTdHJpbmcobmFtZXMpfWApXG4gICAgICAgICAgICAuam9pbignOyAnKTtcbiAgICAgICAgICByZXR1cm4gYEVuc2VtYmxlICcke2VsZW1lbnROYW1lfScgYWN0aXZhdGVzOiAke2VsZW1lbnRMaXN0fWA7XG4gICAgICAgIH1cblxuICAgICAgICBjYXNlICdhZ2VudHMnOiB7XG4gICAgICAgICAgY29uc3QgaW5zdHJ1Y3Rpb25zID0gZWxlbWVudC5leHRlbnNpb25zPy5pbnN0cnVjdGlvbnMgfHwgJyc7XG4gICAgICAgICAgcmV0dXJuIGluc3RydWN0aW9ucztcbiAgICAgICAgfVxuXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgcmV0dXJuIGBbQ29udGVudCBub3QgYXZhaWxhYmxlIGZvciAke2VsZW1lbnRUeXBlfV1gO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoYEVycm9yIGdldHRpbmcgY29udGVudCBmb3IgJHtlbGVtZW50VHlwZX0gJyR7ZWxlbWVudE5hbWV9JzpgLCBlcnJvcik7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgYWN0aXZlIHNldCBjbGVhbnVwIGlzIG5lZWRlZCBhbmQgcGVyZm9ybSBjbGVhbnVwIGlmIG5lY2Vzc2FyeVxuICAgKiBJc3N1ZSAjMjQgKExPVyBQUklPUklUWSk6IE1lbW9yeSBsZWFrIHByZXZlbnRpb25cbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgY2hlY2tBbmRDbGVhbnVwQWN0aXZlU2V0KCk6IHZvaWQge1xuICAgIGNvbnN0IHsgbWF4LCBjbGVhbnVwVGhyZXNob2xkIH0gPSBnZXRBY3RpdmVFbGVtZW50TGltaXRDb25maWcoJ2FnZW50cycpO1xuXG4gICAgLy8gQmVsb3cgdGhyZXNob2xkIOKAlCBubyBhY3Rpb24gbmVlZGVkXG4gICAgaWYgKHRoaXMuYWN0aXZlQWdlbnROYW1lcy5zaXplIDwgY2xlYW51cFRocmVzaG9sZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIEF0IG9yIGFib3ZlIG1heCDigJQgd2FybiBiZWZvcmUgY2xlYW51cFxuICAgIGlmICh0aGlzLmFjdGl2ZUFnZW50TmFtZXMuc2l6ZSA+PSBtYXgpIHtcbiAgICAgIGxvZ2dlci53YXJuKFxuICAgICAgICBgQWN0aXZlIGFnZW50cyBsaW1pdCByZWFjaGVkICgke21heH0pLiBgICtcbiAgICAgICAgYENvbnNpZGVyIGRlYWN0aXZhdGluZyB1bnVzZWQgYWdlbnRzIG9yIHNldHRpbmcgRE9MTEhPVVNFX01BWF9BQ1RJVkVfQUdFTlRTIHRvIGEgaGlnaGVyIHZhbHVlLmBcbiAgICAgICk7XG5cbiAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgdHlwZTogJ0FHRU5UX0FDVElWQVRFRCcsXG4gICAgICAgIHNldmVyaXR5OiAnTUVESVVNJyxcbiAgICAgICAgc291cmNlOiAnQWdlbnRNYW5hZ2VyLmNoZWNrQW5kQ2xlYW51cEFjdGl2ZVNldCcsXG4gICAgICAgIGRldGFpbHM6IGBBY3RpdmUgYWdlbnRzIGxpbWl0IHJlYWNoZWQgKCR7dGhpcy5hY3RpdmVBZ2VudE5hbWVzLnNpemV9LyR7bWF4fSlgLFxuICAgICAgICBhZGRpdGlvbmFsRGF0YToge1xuICAgICAgICAgIGFjdGl2ZUNvdW50OiB0aGlzLmFjdGl2ZUFnZW50TmFtZXMuc2l6ZSxcbiAgICAgICAgICBtYXhBbGxvd2VkOiBtYXgsXG4gICAgICAgICAgYWN0aXZlQWdlbnROYW1lczogQXJyYXkuZnJvbSh0aGlzLmFjdGl2ZUFnZW50TmFtZXMpLFxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBBdCBvciBhYm92ZSB0aHJlc2hvbGQg4oCUIHByb2FjdGl2ZWx5IGNsZWFuIHN0YWxlIGVudHJpZXNcbiAgICB2b2lkIHRoaXMuY2xlYW51cFN0YWxlQWN0aXZlQWdlbnRzKCk7XG4gIH1cblxuICAvKipcbiAgICogQ2xlYW4gdXAgc3RhbGUgZW50cmllcyBmcm9tIGFjdGl2ZSBhZ2VudHMgc2V0XG4gICAqIElzc3VlICMyNCAoTE9XIFBSSU9SSVRZKTogTWVtb3J5IGxlYWsgcHJldmVudGlvblxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBjbGVhbnVwU3RhbGVBY3RpdmVBZ2VudHMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHN0YXJ0U2l6ZSA9IHRoaXMuYWN0aXZlQWdlbnROYW1lcy5zaXplO1xuICAgICAgY29uc3QgYWdlbnRzID0gYXdhaXQgdGhpcy5saXN0KCk7XG4gICAgICBjb25zdCBleGlzdGluZ0FnZW50TmFtZXMgPSBuZXcgU2V0KGFnZW50cy5tYXAoYSA9PiBhLm1ldGFkYXRhLm5hbWUpKTtcblxuICAgICAgY29uc3Qgc3RhbGVOYW1lczogc3RyaW5nW10gPSBbXTtcbiAgICAgIGZvciAoY29uc3QgYWN0aXZlTmFtZSBvZiB0aGlzLmFjdGl2ZUFnZW50TmFtZXMpIHtcbiAgICAgICAgaWYgKCFleGlzdGluZ0FnZW50TmFtZXMuaGFzKGFjdGl2ZU5hbWUpKSB7XG4gICAgICAgICAgdGhpcy5hY3RpdmVBZ2VudE5hbWVzLmRlbGV0ZShhY3RpdmVOYW1lKTtcbiAgICAgICAgICBzdGFsZU5hbWVzLnB1c2goYWN0aXZlTmFtZSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3QgZW5kU2l6ZSA9IHRoaXMuYWN0aXZlQWdlbnROYW1lcy5zaXplO1xuICAgICAgY29uc3QgcmVtb3ZlZCA9IHN0YXJ0U2l6ZSAtIGVuZFNpemU7XG5cbiAgICAgIGlmIChyZW1vdmVkID4gMCkge1xuICAgICAgICBsb2dnZXIuaW5mbyhcbiAgICAgICAgICBgQ2xlYW5lZCB1cCAke3JlbW92ZWR9IHN0YWxlIGFjdGl2ZSBhZ2VudCByZWZlcmVuY2UocykuIGAgK1xuICAgICAgICAgIGBBY3RpdmUgYWdlbnRzOiAke2VuZFNpemV9LyR7Z2V0TWF4QWN0aXZlTGltaXQoJ2FnZW50cycpfWBcbiAgICAgICAgKTtcblxuICAgICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgICAgdHlwZTogJ0VMRU1FTlRfREVMRVRFRCcsXG4gICAgICAgICAgc2V2ZXJpdHk6ICdMT1cnLFxuICAgICAgICAgIHNvdXJjZTogJ0FnZW50TWFuYWdlci5jbGVhbnVwU3RhbGVBY3RpdmVBZ2VudHMnLFxuICAgICAgICAgIGRldGFpbHM6IGBSZW1vdmVkICR7cmVtb3ZlZH0gc3RhbGUgYWN0aXZlIGFnZW50IHJlZmVyZW5jZXNgLFxuICAgICAgICAgIGFkZGl0aW9uYWxEYXRhOiB7XG4gICAgICAgICAgICByZW1vdmVkQ291bnQ6IHJlbW92ZWQsXG4gICAgICAgICAgICBhY3RpdmVDb3VudDogZW5kU2l6ZSxcbiAgICAgICAgICAgIHN0YWxlTmFtZXM6IHN0YWxlTmFtZXMuam9pbignLCAnKVxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci5lcnJvcignRmFpbGVkIHRvIGNsZWFudXAgc3RhbGUgYWN0aXZlIGFnZW50czonLCBlcnJvcik7XG5cbiAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgdHlwZTogJ0VMRU1FTlRfREVMRVRFRCcsXG4gICAgICAgIHNldmVyaXR5OiAnTE9XJyxcbiAgICAgICAgc291cmNlOiAnQWdlbnRNYW5hZ2VyLmNsZWFudXBTdGFsZUFjdGl2ZUFnZW50cycsXG4gICAgICAgIGRldGFpbHM6IGBDbGVhbnVwIGZhaWxlZDogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcil9YFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFBlcnNpc3QgYW4gYWdlbnQgc3RhdGUgZmlsZSAoWUFNTCkuXG4gICAqXG4gICAqIElNUFJPVkVNRU5UOiBPcHRpbWlzdGljIGxvY2tpbmcgd2l0aCB2ZXJzaW9uIGNoZWNraW5nIChJc3N1ZSAjMjQpXG4gICAqIFByZXZlbnRzIHN0YXRlIGNvcnJ1cHRpb24gZnJvbSBjb25jdXJyZW50IHVwZGF0ZXMgYnkgY29tcGFyaW5nIHZlcnNpb25zXG4gICAqXG4gICAqIEZJWDogVXNlcyBub3JtYWxpemVGaWxlbmFtZSgpIGZvciBjb25zaXN0ZW50IHN0YXRlIGZpbGUgbmFtaW5nXG4gICAqIFRoaXMgZW5zdXJlcyBzdGF0ZSBmaWxlcyB1c2Uga2ViYWItY2FzZSAoZS5nLiwgXCJjcnVkdi1hZ2VudC1kZWx0YS5zdGF0ZS55YW1sXCIpXG4gICAqIHJlZ2FyZGxlc3Mgb2YgaW5wdXQgbmFtZSBmb3JtYXQgKGUuZy4sIFwiQ1JVRFYtQWdlbnQtRGVsdGFcIilcbiAgICpcbiAgICogRklYIChJc3N1ZSAjMTA3IC0gQ1JJVC0yKTogV3JhcCByZWFkLWNvbXBhcmUtd3JpdGUgc2VxdWVuY2UgaW4gZmlsZSBsb2NrXG4gICAqIHRvIHByZXZlbnQgVE9DVE9VIHJhY2UgY29uZGl0aW9uIGZyb20gY29uY3VycmVudCBhZ2VudCBleGVjdXRpb25zXG4gICAqXG4gICAqIEZJWCAoSXNzdWUgIzEyMyk6IFZlcnNpb24gaW5jcmVtZW50cyBvbiBzdWNjZXNzZnVsIHNhdmUsIG5vdCBkdXJpbmcgb3BlcmF0aW9uc1xuICAgKlxuICAgKiBAcmV0dXJucyBUaGUgbmV3IHN0YXRlIHZlcnNpb24gYWZ0ZXIgc3VjY2Vzc2Z1bCBzYXZlXG4gICAqIEBwcm90ZWN0ZWQgT25seSBhY2Nlc3NpYmxlIGJ5IHN1YmNsYXNzZXMgKGUuZy4sIFRlc3RhYmxlQWdlbnRNYW5hZ2VyIGZvciB0ZXN0aW5nKVxuICAgKi9cbiAgcHJvdGVjdGVkIGFzeW5jIHNhdmVBZ2VudFN0YXRlKG5hbWU6IHN0cmluZywgc3RhdGU6IEFnZW50U3RhdGUpOiBQcm9taXNlPG51bWJlcj4ge1xuICAgIGF3YWl0IHRoaXMuZW5zdXJlU3RhdGVEaXJlY3RvcnkoKTtcblxuICAgIC8vIEZJWDogTm9ybWFsaXplIG5hbWUgZm9yIGNvbnNpc3RlbnQgc3RhdGUgZmlsZSBuYW1pbmdcbiAgICBjb25zdCBub3JtYWxpemVkTmFtZSA9IHRoaXMubm9ybWFsaXplRmlsZW5hbWUobmFtZSk7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLmpvaW4odGhpcy5zdGF0ZURpciwgYCR7bm9ybWFsaXplZE5hbWV9JHtTVEFURV9GSUxFX0VYVEVOU0lPTn1gKTtcblxuICAgIC8vIEZJWCAoSXNzdWUgIzEwNyAtIENSSVQtMik6IEFjcXVpcmUgZmlsZSBsb2NrIHRvIHByZXZlbnQgVE9DVE9VIHJhY2UgY29uZGl0aW9uXG4gICAgLy8gVGhlIGxvY2sgY292ZXJzIHRoZSBlbnRpcmUgcmVhZC1jb21wYXJlLXdyaXRlIHNlcXVlbmNlIHRvIGVuc3VyZSBhdG9taWNpdHlcbiAgICBhd2FpdCB0aGlzLmZpbGVMb2NrTWFuYWdlci53aXRoTG9jayhgYWdlbnQtc3RhdGU6JHtub3JtYWxpemVkTmFtZX1gLCBhc3luYyAoKSA9PiB7XG4gICAgICAvLyBGSVg6IE9wdGltaXN0aWMgbG9ja2luZyBjaGVjayAoSXNzdWUgIzI0KVxuICAgICAgLy8gTG9hZCBleGlzdGluZyBzdGF0ZSB0byBjb21wYXJlIHZlcnNpb25zIGJlZm9yZSBvdmVyd3JpdGluZ1xuICAgICAgY29uc3QgZXhpc3RpbmdTdGF0ZSA9IGF3YWl0IHRoaXMubG9hZEFnZW50U3RhdGUobmFtZSk7XG4gICAgICBpZiAoZXhpc3RpbmdTdGF0ZSAmJiBleGlzdGluZ1N0YXRlLnN0YXRlVmVyc2lvbiAhPT0gdW5kZWZpbmVkICYmIHN0YXRlLnN0YXRlVmVyc2lvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIC8vIENoZWNrIGlmIG91ciBzdGF0ZSBpcyBiYXNlZCBvbiB0aGUgY3VycmVudCB2ZXJzaW9uXG4gICAgICAgIC8vIElmIHZlcnNpb25zIGRvbid0IG1hdGNoLCBpdCBtZWFucyBhbm90aGVyIHByb2Nlc3MgdXBkYXRlZCB0aGUgc3RhdGVcbiAgICAgICAgaWYgKGV4aXN0aW5nU3RhdGUuc3RhdGVWZXJzaW9uID4gc3RhdGUuc3RhdGVWZXJzaW9uKSB7XG4gICAgICAgICAgbG9nZ2VyLndhcm4oYFN0YXRlIHZlcnNpb24gY29uZmxpY3QgZGV0ZWN0ZWQgZm9yIGFnZW50ICR7bmFtZX1gLCB7XG4gICAgICAgICAgICBleGlzdGluZ1ZlcnNpb246IGV4aXN0aW5nU3RhdGUuc3RhdGVWZXJzaW9uLFxuICAgICAgICAgICAgYXR0ZW1wdGVkVmVyc2lvbjogc3RhdGUuc3RhdGVWZXJzaW9uXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgICAgICB0eXBlOiAnTUVNT1JZX1NBVkVfRkFJTEVEJyxcbiAgICAgICAgICAgIHNldmVyaXR5OiAnTUVESVVNJyxcbiAgICAgICAgICAgIHNvdXJjZTogJ0FnZW50TWFuYWdlci5zYXZlQWdlbnRTdGF0ZScsXG4gICAgICAgICAgICBkZXRhaWxzOiBgU3RhdGUgdmVyc2lvbiBjb25mbGljdDogYXR0ZW1wdGVkIHRvIHNhdmUgc3RhbGUgc3RhdGVgLFxuICAgICAgICAgICAgYWRkaXRpb25hbERhdGE6IHtcbiAgICAgICAgICAgICAgYWdlbnROYW1lOiBuYW1lLFxuICAgICAgICAgICAgICBleGlzdGluZ1ZlcnNpb246IGV4aXN0aW5nU3RhdGUuc3RhdGVWZXJzaW9uLFxuICAgICAgICAgICAgICBhdHRlbXB0ZWRWZXJzaW9uOiBzdGF0ZS5zdGF0ZVZlcnNpb25cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBTdGF0ZSB2ZXJzaW9uIGNvbmZsaWN0OiBjdXJyZW50IHZlcnNpb24gaXMgJHtleGlzdGluZ1N0YXRlLnN0YXRlVmVyc2lvbn0sIGAgK1xuICAgICAgICAgICAgYGJ1dCBhdHRlbXB0ZWQgdG8gc2F2ZSB2ZXJzaW9uICR7c3RhdGUuc3RhdGVWZXJzaW9ufS4gYCArXG4gICAgICAgICAgICBgU3RhdGUgbWF5IGhhdmUgYmVlbiBtb2RpZmllZCBjb25jdXJyZW50bHkuYFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gRklYIChJc3N1ZSAjMTIzKTogSW5jcmVtZW50IHZlcnNpb24gQkVGT1JFIHNlcmlhbGl6YXRpb24sIG5vdCBkdXJpbmcgb3BlcmF0aW9uc1xuICAgICAgLy8gVGhpcyBlbnN1cmVzIHZlcnNpb24gb25seSBpbmNyZW1lbnRzIG9uIHN1Y2Nlc3NmdWwgc2F2ZVxuICAgICAgc3RhdGUuc3RhdGVWZXJzaW9uID0gKHN0YXRlLnN0YXRlVmVyc2lvbiB8fCAwKSArIDE7XG5cbiAgICAgIGNvbnN0IHNlcmlhbGl6ZWRTdGF0ZSA9IHRoaXMucHJlcGFyZVN0YXRlRm9yU2VyaWFsaXphdGlvbihzdGF0ZSk7XG5cbiAgICAgIGNvbnN0IHlhbWxDb250ZW50ID0gdGhpcy5zZXJpYWxpemF0aW9uU2VydmljZS5kdW1wWWFtbChzZXJpYWxpemVkU3RhdGUsIHtcbiAgICAgICAgc2NoZW1hOiAnanNvbicsICAvLyBGaXggIzkxNDogZmFpbHNhZmUgY29ycnVwdHMgYm9vbGVhbnMvbnVtYmVycyBpbiBhZ2VudCBzdGF0ZVxuICAgICAgICBub1JlZnM6IHRydWUsXG4gICAgICAgIHNvcnRLZXlzOiB0cnVlXG4gICAgICB9KTtcblxuICAgICAgLy8gVmFsaWRhdGUgc2l6ZVxuICAgICAgdGhpcy5zZXJpYWxpemF0aW9uU2VydmljZS52YWxpZGF0ZVNpemUoeWFtbENvbnRlbnQsIE1BWF9ZQU1MX1NJWkUsICdBZ2VudCBzdGF0ZScpO1xuXG4gICAgICBhd2FpdCB0aGlzLmZpbGVPcGVyYXRpb25zLndyaXRlRmlsZShmaWxlUGF0aCwgeWFtbENvbnRlbnQsIHsgZW5jb2Rpbmc6ICd1dGYtOCcgfSk7XG4gICAgICAvLyBGSVg6IFVzZSBub3JtYWxpemVkIG5hbWUgYXMgY2FjaGUga2V5IGZvciBjb25zaXN0ZW50IGxvb2t1cHNcbiAgICAgIHRoaXMuc3RhdGVDYWNoZS5zZXQobm9ybWFsaXplZE5hbWUsIHN0YXRlKTtcblxuICAgICAgbG9nZ2VyLmRlYnVnKGBBZ2VudCBzdGF0ZSBzYXZlZCBzdWNjZXNzZnVsbHlgLCB7XG4gICAgICAgIGFnZW50TmFtZTogbmFtZSxcbiAgICAgICAgbm9ybWFsaXplZE5hbWUsXG4gICAgICAgIHN0YXRlVmVyc2lvbjogc3RhdGUuc3RhdGVWZXJzaW9uLFxuICAgICAgICBnb2FsQ291bnQ6IHN0YXRlLmdvYWxzPy5sZW5ndGggPz8gMFxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICAvLyBSZXR1cm4gdGhlIG5ldyB2ZXJzaW9uIGZvciBjYWxsZXIgdG8gc3luYyBhZ2VudCdzIGludGVybmFsIHN0YXRlXG4gICAgLy8gc3RhdGVWZXJzaW9uIGlzIGd1YXJhbnRlZWQgdG8gYmUgYSBudW1iZXIgYWZ0ZXIgdGhlIGluY3JlbWVudCBhYm92ZVxuICAgIHJldHVybiBzdGF0ZS5zdGF0ZVZlcnNpb24hO1xuICB9XG5cbiAgLyoqXG4gICAqIFV0aWxpdHk6IGVuc3VyZSBgLm1kYCBleHRlbnNpb24gb24gcmVxdWVzdGVkIHBhdGguXG4gICAqL1xuICBwcml2YXRlIHN0cmlwRXh0ZW5zaW9uKGZpbGVQYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBmaWxlUGF0aC5lbmRzV2l0aChBR0VOVF9GSUxFX0VYVEVOU0lPTilcbiAgICAgID8gZmlsZVBhdGguc2xpY2UoMCwgLUFHRU5UX0ZJTEVfRVhURU5TSU9OLmxlbmd0aClcbiAgICAgIDogZmlsZVBhdGg7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGh5ZHJhdGVBZ2VudFN0YXRlKGFnZW50OiBBZ2VudCwgbmFtZTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qgc3RhdGUgPSBhd2FpdCB0aGlzLmxvYWRBZ2VudFN0YXRlKG5hbWUpO1xuICAgIGlmICghc3RhdGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBzZXJpYWxpemVkID0gSlNPTi5wYXJzZShhZ2VudC5zZXJpYWxpemVUb0pTT04oKSk7XG4gICAgc2VyaWFsaXplZC5zdGF0ZSA9IHN0YXRlO1xuICAgIGFnZW50LmRlc2VyaWFsaXplKEpTT04uc3RyaW5naWZ5KHNlcmlhbGl6ZWQpKTtcbiAgICBhZ2VudC5tYXJrU3RhdGVQZXJzaXN0ZWQoKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgbG9hZEFnZW50U3RhdGUobmFtZTogc3RyaW5nKTogUHJvbWlzZTxBZ2VudFN0YXRlIHwgbnVsbD4ge1xuICAgIC8vIEZJWDogTm9ybWFsaXplIG5hbWUgZm9yIGNvbnNpc3RlbnQgc3RhdGUgZmlsZSBsb29rdXBzXG4gICAgY29uc3Qgbm9ybWFsaXplZE5hbWUgPSB0aGlzLm5vcm1hbGl6ZUZpbGVuYW1lKG5hbWUpO1xuXG4gICAgaWYgKHRoaXMuc3RhdGVDYWNoZS5oYXMobm9ybWFsaXplZE5hbWUpKSB7XG4gICAgICByZXR1cm4gdGhpcy5zdGF0ZUNhY2hlLmdldChub3JtYWxpemVkTmFtZSkhO1xuICAgIH1cblxuICAgIGNvbnN0IHN0YXRlRmlsZW5hbWUgPSBgJHtub3JtYWxpemVkTmFtZX0ke1NUQVRFX0ZJTEVfRVhURU5TSU9OfWA7XG4gICAgY29uc3Qgc3RhdGVQYXRoID0gcGF0aC5qb2luKHRoaXMuc3RhdGVEaXIsIHN0YXRlRmlsZW5hbWUpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCB0aGlzLmZpbGVPcGVyYXRpb25zLnJlYWRGaWxlKHN0YXRlUGF0aCwgeyBlbmNvZGluZzogJ3V0Zi04JyB9KTtcblxuICAgICAgLy8gVXNlIFNlcmlhbGl6YXRpb25TZXJ2aWNlIGZvciBZQU1MIHBhcnNpbmdcbiAgICAgIC8vIFN0YXRlIGZpbGVzIGFyZSBwdXJlIFlBTUwgYnV0IHBhcnNlRnJvbnRtYXR0ZXIgaGFuZGxlcyBib3RoIGZvcm1hdHNcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuc2VyaWFsaXphdGlvblNlcnZpY2UucGFyc2VGcm9udG1hdHRlcihjb250ZW50LCB7XG4gICAgICAgIG1heFlhbWxTaXplOiBNQVhfWUFNTF9TSVpFLFxuICAgICAgICB2YWxpZGF0ZUNvbnRlbnQ6IHRydWUsXG4gICAgICAgIHNvdXJjZTogJ0FnZW50TWFuYWdlci5sb2FkQWdlbnRTdGF0ZSdcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBzdGF0ZSA9IHJlc3VsdC5kYXRhIGFzIEFnZW50U3RhdGU7XG4gICAgICB0aGlzLm5vcm1hbGl6ZUxvYWRlZFN0YXRlKHN0YXRlKTtcbiAgICAgIC8vIEZJWDogVXNlIG5vcm1hbGl6ZWQgbmFtZSBhcyBjYWNoZSBrZXkgZm9yIGNvbnNpc3RlbnQgbG9va3Vwc1xuICAgICAgdGhpcy5zdGF0ZUNhY2hlLnNldChub3JtYWxpemVkTmFtZSwgc3RhdGUpO1xuICAgICAgcmV0dXJuIHN0YXRlO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoKGVycm9yIGFzIE5vZGVKUy5FcnJub0V4Y2VwdGlvbikuY29kZSA9PT0gJ0VOT0VOVCcpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgICBsb2dnZXIuZXJyb3IoYEZhaWxlZCB0byBsb2FkIGFnZW50IHN0YXRlOiAke25hbWV9YCwgZXJyb3IpO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBlbnN1cmVTdGF0ZURpcmVjdG9yeSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLmZpbGVPcGVyYXRpb25zLmNyZWF0ZURpcmVjdG9yeSh0aGlzLnN0YXRlRGlyKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBhc3luYyBwYXJzZU1ldGFkYXRhKGRhdGE6IGFueSk6IFByb21pc2U8QWdlbnRNZXRhZGF0YT4ge1xuICAgIGNvbnN0IG1ldGFkYXRhID0geyAuLi4oZGF0YSBhcyBhbnkpIH07XG5cbiAgICAvLyAtLS0gU1RBUlQ6IEJhY2t3YXJkIENvbXBhdGliaWxpdHkgRml4IGZvciBMZWdhY3kgQWdlbnQgVHlwZXMgLS0tXG4gICAgLy8gTGVnYWN5IGFnZW50IGRlZmluaXRpb24gZmlsZXMgbWlnaHQgdXNlICdhZ2VudCcgKHNpbmd1bGFyKSBpbnN0ZWFkIG9mXG4gICAgLy8gRWxlbWVudFR5cGUuQUdFTlQgKCdhZ2VudHMnKS4gVGhpcyBjb252ZXJ0cyB0aGUgc2luZ3VsYXIgZm9ybSB0byB0aGVcbiAgICAvLyBjb3JyZWN0IHBsdXJhbCBlbnVtIHZhbHVlIHRvIGVuc3VyZSBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LlxuICAgIGlmIChtZXRhZGF0YS50eXBlID09PSAnYWdlbnQnKSB7XG4gICAgICBtZXRhZGF0YS50eXBlID0gRWxlbWVudFR5cGUuQUdFTlQ7XG4gICAgfVxuICAgIC8vIC0tLSBFTkQ6IEJhY2t3YXJkIENvbXBhdGliaWxpdHkgRml4IC0tLVxuXG4gICAgLy8gVmFsaWRhdGUgdGhhdCB0aGUgdHlwZSBpcyBub3cgRWxlbWVudFR5cGUuQUdFTlQgKHBsdXJhbClcbiAgICBpZiAobWV0YWRhdGEudHlwZSAmJiBtZXRhZGF0YS50eXBlICE9PSBFbGVtZW50VHlwZS5BR0VOVCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGVsZW1lbnQgdHlwZTogZXhwZWN0ZWQgJyR7RWxlbWVudFR5cGUuQUdFTlR9JywgZ290ICcke21ldGFkYXRhLnR5cGV9J2ApO1xuICAgIH1cblxuICAgIC8vIFJFRkFDVE9SRUQ6IFVzZSBWYWxpZGF0aW9uU2VydmljZSBmb3IgbmFtZSB2YWxpZGF0aW9uXG4gICAgaWYgKG1ldGFkYXRhLm5hbWUpIHtcbiAgICAgIGNvbnN0IG5hbWVSZXN1bHQgPSB0aGlzLnZhbGlkYXRpb25TZXJ2aWNlLnZhbGlkYXRlQW5kU2FuaXRpemVJbnB1dChtZXRhZGF0YS5uYW1lLCB7XG4gICAgICAgIG1heExlbmd0aDogU0VDVVJJVFlfTElNSVRTLk1BWF9OQU1FX0xFTkdUSCxcbiAgICAgICAgYWxsb3dTcGFjZXM6IHRydWVcbiAgICAgIH0pO1xuICAgICAgaWYgKCFuYW1lUmVzdWx0LmlzVmFsaWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGFnZW50IG5hbWU6ICR7bmFtZVJlc3VsdC5lcnJvcnM/LmpvaW4oJywgJyl9YCk7XG4gICAgICB9XG4gICAgICBtZXRhZGF0YS5uYW1lID0gbmFtZVJlc3VsdC5zYW5pdGl6ZWRWYWx1ZTtcbiAgICB9XG5cbiAgICAvLyBSRUZBQ1RPUkVEOiBVc2UgVmFsaWRhdGlvblNlcnZpY2UgZm9yIGRlc2NyaXB0aW9uIHZhbGlkYXRpb25cbiAgICAvLyBGSVg6IE11c3Qgc3BlY2lmeSBmaWVsZFR5cGU6ICdkZXNjcmlwdGlvbicgdG8gYWxsb3cgcHVuY3R1YXRpb24gbGlrZSBjb2xvbnMsIHNlbWljb2xvbnMsIGV0Yy5cbiAgICBpZiAobWV0YWRhdGEuZGVzY3JpcHRpb24pIHtcbiAgICAgIGNvbnN0IGRlc2NSZXN1bHQgPSB0aGlzLnZhbGlkYXRpb25TZXJ2aWNlLnZhbGlkYXRlQW5kU2FuaXRpemVJbnB1dChtZXRhZGF0YS5kZXNjcmlwdGlvbiwge1xuICAgICAgICBtYXhMZW5ndGg6IFNFQ1VSSVRZX0xJTUlUUy5NQVhfREVTQ1JJUFRJT05fTEVOR1RILFxuICAgICAgICBhbGxvd1NwYWNlczogdHJ1ZSxcbiAgICAgICAgZmllbGRUeXBlOiAnZGVzY3JpcHRpb24nXG4gICAgICB9KTtcbiAgICAgIGlmICghZGVzY1Jlc3VsdC5pc1ZhbGlkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBhZ2VudCBkZXNjcmlwdGlvbjogJHtkZXNjUmVzdWx0LmVycm9ycz8uam9pbignLCAnKX1gKTtcbiAgICAgIH1cbiAgICAgIG1ldGFkYXRhLmRlc2NyaXB0aW9uID0gZGVzY1Jlc3VsdC5zYW5pdGl6ZWRWYWx1ZTtcbiAgICB9XG5cbiAgICAvLyBSRUZBQ1RPUkVEOiBVc2UgVmFsaWRhdGlvblNlcnZpY2UgZm9yIHNwZWNpYWxpemF0aW9ucyBhcnJheVxuICAgIGlmIChBcnJheS5pc0FycmF5KG1ldGFkYXRhLnNwZWNpYWxpemF0aW9ucykpIHtcbiAgICAgIGNvbnN0IHZhbGlkYXRlZFNwZWNpYWxpemF0aW9uczogc3RyaW5nW10gPSBbXTtcbiAgICAgIGZvciAoY29uc3QgdmFsdWUgb2YgbWV0YWRhdGEuc3BlY2lhbGl6YXRpb25zKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMudmFsaWRhdGlvblNlcnZpY2UudmFsaWRhdGVBbmRTYW5pdGl6ZUlucHV0KFN0cmluZyh2YWx1ZSksIHtcbiAgICAgICAgICBtYXhMZW5ndGg6IFNFQ1VSSVRZX0xJTUlUUy5NQVhfVEFHX0xFTkdUSCxcbiAgICAgICAgICBhbGxvd1NwYWNlczogdHJ1ZVxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKCFyZXN1bHQuaXNWYWxpZCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBzcGVjaWFsaXphdGlvbiBcIiR7dmFsdWV9XCI6ICR7cmVzdWx0LmVycm9ycz8uam9pbignLCAnKX1gKTtcbiAgICAgICAgfVxuICAgICAgICB2YWxpZGF0ZWRTcGVjaWFsaXphdGlvbnMucHVzaChyZXN1bHQuc2FuaXRpemVkVmFsdWUhKTtcbiAgICAgIH1cbiAgICAgIG1ldGFkYXRhLnNwZWNpYWxpemF0aW9ucyA9IHZhbGlkYXRlZFNwZWNpYWxpemF0aW9ucztcbiAgICB9XG5cbiAgICAvLyBLRUVQOiBUcmlnZ2VyVmFsaWRhdGlvblNlcnZpY2UgKGFscmVhZHkgdXNpbmcgc2VydmljZSBwYXR0ZXJuKVxuICAgIGlmIChtZXRhZGF0YS50cmlnZ2VycyAmJiBBcnJheS5pc0FycmF5KG1ldGFkYXRhLnRyaWdnZXJzKSkge1xuICAgICAgY29uc3QgdmFsaWRhdGlvblJlc3VsdCA9IHRoaXMudHJpZ2dlclZhbGlkYXRpb25TZXJ2aWNlLnZhbGlkYXRlVHJpZ2dlcnMoXG4gICAgICAgIG1ldGFkYXRhLnRyaWdnZXJzLFxuICAgICAgICBFbGVtZW50VHlwZS5BR0VOVCxcbiAgICAgICAgbWV0YWRhdGEubmFtZSB8fCAndW5rbm93bidcbiAgICAgICk7XG4gICAgICBtZXRhZGF0YS50cmlnZ2VycyA9IHZhbGlkYXRpb25SZXN1bHQudmFsaWRUcmlnZ2VycztcbiAgICB9XG5cbiAgICAvLyBJc3N1ZSAjNjc2OiBTYW5pdGl6ZSBnYXRla2VlcGVyIHBvbGljeSBvbiBsb2FkIHRvIHByZXZlbnQgcHJvbXB0LWluamVjdGlvbiBhdHRhY2tzXG4gICAgLy8gTWFsZm9ybWVkIHBvbGljaWVzIGFyZSBzdHJpcHBlZCBhbmQgbG9nZ2VkIGFzIHNlY3VyaXR5IGV2ZW50cyAobmV2ZXIgcmVhY2ggZW5mb3JjZW1lbnQpXG4gICAgaWYgKG1ldGFkYXRhLmdhdGVrZWVwZXIpIHtcbiAgICAgIG1ldGFkYXRhLmdhdGVrZWVwZXIgPSBzYW5pdGl6ZUdhdGVrZWVwZXJQb2xpY3kobWV0YWRhdGEuZ2F0ZWtlZXBlciwgbWV0YWRhdGEubmFtZSB8fCAndW5rbm93bicsICdhZ2VudCcpO1xuICAgIH1cblxuICAgIC8vIElzc3VlICM3MjI6IFZhbGlkYXRlIFYyIGFnZW50IGZpZWxkcyBvbiBsb2FkIOKAlCBzdHJ1Y3R1cmFsIGNoZWNrcywgc3RyaXAgbWFsZm9ybWVkIGRhdGEuXG4gICAgLy8gRmFpbC1vcGVuOiBjb3JydXB0ZWQgZmllbGRzIGFyZSByZW1vdmVkIGFuZCBsb2dnZWQsIG5vdCB0aHJvd24uIFRoaXMgcHJldmVudHNcbiAgICAvLyBiYWQgZGF0YSBmcm9tIHJlYWNoaW5nIGV4ZWN1dGlvbiB0aW1lIHdoaWxlIGtlZXBpbmcgdGhlIGFnZW50IGxvYWRhYmxlLlxuICAgIGNvbnN0IGFnZW50TmFtZSA9IG1ldGFkYXRhLm5hbWUgfHwgJ3Vua25vd24nO1xuXG4gICAgLy8gSXNzdWUgIzY5NzogTm9ybWFsaXplIGBnb2Fsc2AgKHBsdXJhbCkg4oaSIGBnb2FsYCAoc2luZ3VsYXIpXG4gICAgaWYgKG1ldGFkYXRhLmdvYWxzICE9PSB1bmRlZmluZWQgJiYgbWV0YWRhdGEuZ29hbCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBtZXRhZGF0YS5nb2FsID0gbWV0YWRhdGEuZ29hbHM7XG4gICAgICBkZWxldGUgbWV0YWRhdGEuZ29hbHM7XG4gICAgICBsb2dnZXIud2FybihgW3BhcnNlTWV0YWRhdGFdIEFnZW50ICcke2FnZW50TmFtZX0nOiBtaWdyYXRlZCAnZ29hbHMnIChwbHVyYWwpIHRvICdnb2FsJ2ApO1xuICAgIH0gZWxzZSBpZiAobWV0YWRhdGEuZ29hbHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gYGdvYWxgIGFscmVhZHkgc2V0IOKAlCBkcm9wIHRoZSByZWR1bmRhbnQgcGx1cmFsIGZvcm1cbiAgICAgIGRlbGV0ZSBtZXRhZGF0YS5nb2FscztcbiAgICB9XG5cbiAgICBpZiAobWV0YWRhdGEuZ29hbCkge1xuICAgICAgaWYgKHR5cGVvZiBtZXRhZGF0YS5nb2FsID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbWV0YWRhdGEuZ29hbC50ZW1wbGF0ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgLy8gSXNzdWUgIzcyNTogTm9ybWFsaXplIHNuYWtlX2Nhc2UgZ29hbCBzdWItZmllbGRzXG4gICAgICAgIG5vcm1hbGl6ZUdvYWxLZXlzKG1ldGFkYXRhLmdvYWwgYXMgdW5rbm93biBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik7XG5cbiAgICAgICAgLy8gVmFsaWRhdGUgcGFyYW1ldGVycyBhcnJheSBpZiBwcmVzZW50XG4gICAgICAgIGlmIChtZXRhZGF0YS5nb2FsLnBhcmFtZXRlcnMgJiYgIUFycmF5LmlzQXJyYXkobWV0YWRhdGEuZ29hbC5wYXJhbWV0ZXJzKSkge1xuICAgICAgICAgIGxvZ2dlci53YXJuKGBbcGFyc2VNZXRhZGF0YV0gQWdlbnQgJyR7YWdlbnROYW1lfSc6IGdvYWwucGFyYW1ldGVycyBpcyBub3QgYW4gYXJyYXksIHN0cmlwcGluZ2ApO1xuICAgICAgICAgIGRlbGV0ZSBtZXRhZGF0YS5nb2FsLnBhcmFtZXRlcnM7XG4gICAgICAgIH1cbiAgICAgICAgLy8gVmFsaWRhdGUgc3VjY2Vzc0NyaXRlcmlhIGFycmF5IGlmIHByZXNlbnRcbiAgICAgICAgaWYgKG1ldGFkYXRhLmdvYWwuc3VjY2Vzc0NyaXRlcmlhICYmICFBcnJheS5pc0FycmF5KG1ldGFkYXRhLmdvYWwuc3VjY2Vzc0NyaXRlcmlhKSkge1xuICAgICAgICAgIGxvZ2dlci53YXJuKGBbcGFyc2VNZXRhZGF0YV0gQWdlbnQgJyR7YWdlbnROYW1lfSc6IGdvYWwuc3VjY2Vzc0NyaXRlcmlhIGlzIG5vdCBhbiBhcnJheSwgc3RyaXBwaW5nYCk7XG4gICAgICAgICAgZGVsZXRlIG1ldGFkYXRhLmdvYWwuc3VjY2Vzc0NyaXRlcmlhO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiBtZXRhZGF0YS5nb2FsICE9PSAnc3RyaW5nJykge1xuICAgICAgICAvLyBnb2FsIG11c3QgYmUgYSBzdHJpbmcgb3IgYW4gb2JqZWN0IHdpdGggdGVtcGxhdGUg4oCUIGFueXRoaW5nIGVsc2UgaXMgaW52YWxpZFxuICAgICAgICBsb2dnZXIud2FybihgW3BhcnNlTWV0YWRhdGFdIEFnZW50ICcke2FnZW50TmFtZX0nOiBnb2FsIGlzIG1hbGZvcm1lZCAobm8gdGVtcGxhdGUpLCBzdHJpcHBpbmdgKTtcbiAgICAgICAgZGVsZXRlIG1ldGFkYXRhLmdvYWw7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG1ldGFkYXRhLmFjdGl2YXRlcykge1xuICAgICAgaWYgKHR5cGVvZiBtZXRhZGF0YS5hY3RpdmF0ZXMgIT09ICdvYmplY3QnIHx8IEFycmF5LmlzQXJyYXkobWV0YWRhdGEuYWN0aXZhdGVzKSkge1xuICAgICAgICBsb2dnZXIud2FybihgW3BhcnNlTWV0YWRhdGFdIEFnZW50ICcke2FnZW50TmFtZX0nOiBhY3RpdmF0ZXMgaXMgbm90IGFuIG9iamVjdCwgc3RyaXBwaW5nYCk7XG4gICAgICAgIGRlbGV0ZSBtZXRhZGF0YS5hY3RpdmF0ZXM7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBFYWNoIGtleSBzaG91bGQgbWFwIHRvIGEgc3RyaW5nIGFycmF5XG4gICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKG1ldGFkYXRhLmFjdGl2YXRlcykpIHtcbiAgICAgICAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCAmJiAhQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICAgIGxvZ2dlci53YXJuKGBbcGFyc2VNZXRhZGF0YV0gQWdlbnQgJyR7YWdlbnROYW1lfSc6IGFjdGl2YXRlcy4ke2tleX0gaXMgbm90IGFuIGFycmF5LCBzdHJpcHBpbmdgKTtcbiAgICAgICAgICAgIGRlbGV0ZSBtZXRhZGF0YS5hY3RpdmF0ZXNba2V5XTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAobWV0YWRhdGEudG9vbHMpIHtcbiAgICAgIGlmICh0eXBlb2YgbWV0YWRhdGEudG9vbHMgIT09ICdvYmplY3QnIHx8IEFycmF5LmlzQXJyYXkobWV0YWRhdGEudG9vbHMpKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKGBbcGFyc2VNZXRhZGF0YV0gQWdlbnQgJyR7YWdlbnROYW1lfSc6IHRvb2xzIGlzIG5vdCBhbiBvYmplY3QsIHN0cmlwcGluZ2ApO1xuICAgICAgICBkZWxldGUgbWV0YWRhdGEudG9vbHM7XG4gICAgICB9IGVsc2UgaWYgKCFBcnJheS5pc0FycmF5KG1ldGFkYXRhLnRvb2xzLmFsbG93ZWQpKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKGBbcGFyc2VNZXRhZGF0YV0gQWdlbnQgJyR7YWdlbnROYW1lfSc6IHRvb2xzLmFsbG93ZWQgaXMgbm90IGFuIGFycmF5LCBzdHJpcHBpbmcgdG9vbHNgKTtcbiAgICAgICAgZGVsZXRlIG1ldGFkYXRhLnRvb2xzO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gR2FwIDM6IFZhbGlkYXRlIHRvb2xzLmRlbmllZCBpcyBhbiBhcnJheSBpZiBwcmVzZW50XG4gICAgICAgIGlmIChtZXRhZGF0YS50b29scy5kZW5pZWQgIT09IHVuZGVmaW5lZCAmJiAhQXJyYXkuaXNBcnJheShtZXRhZGF0YS50b29scy5kZW5pZWQpKSB7XG4gICAgICAgICAgbG9nZ2VyLndhcm4oYFtwYXJzZU1ldGFkYXRhXSBBZ2VudCAnJHthZ2VudE5hbWV9JzogdG9vbHMuZGVuaWVkIGlzIG5vdCBhbiBhcnJheSwgc3RyaXBwaW5nYCk7XG4gICAgICAgICAgZGVsZXRlIG1ldGFkYXRhLnRvb2xzLmRlbmllZDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIElzc3VlICM3MjU6IE5vcm1hbGl6ZSBzeXN0ZW1fcHJvbXB0IOKGkiBzeXN0ZW1Qcm9tcHQgKExMTXMgY29tbW9ubHkgdXNlIHNuYWtlX2Nhc2UpXG4gICAgY29uc3QgYW55TWV0YSA9IG1ldGFkYXRhIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgIGlmIChhbnlNZXRhLnN5c3RlbV9wcm9tcHQgIT09IHVuZGVmaW5lZCAmJiBtZXRhZGF0YS5zeXN0ZW1Qcm9tcHQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgYW55TWV0YS5zeXN0ZW1Qcm9tcHQgPSBhbnlNZXRhLnN5c3RlbV9wcm9tcHQ7XG4gICAgfVxuICAgIGRlbGV0ZSBhbnlNZXRhLnN5c3RlbV9wcm9tcHQ7XG5cbiAgICBpZiAobWV0YWRhdGEuc3lzdGVtUHJvbXB0ICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIG1ldGFkYXRhLnN5c3RlbVByb21wdCAhPT0gJ3N0cmluZycpIHtcbiAgICAgIGxvZ2dlci53YXJuKGBbcGFyc2VNZXRhZGF0YV0gQWdlbnQgJyR7YWdlbnROYW1lfSc6IHN5c3RlbVByb21wdCBpcyBub3QgYSBzdHJpbmcsIHN0cmlwcGluZ2ApO1xuICAgICAgZGVsZXRlIG1ldGFkYXRhLnN5c3RlbVByb21wdDtcbiAgICB9XG5cbiAgICAvLyBJc3N1ZSAjNjk3OiBQcm9tb3RlIHJvb3QtbGV2ZWwgVjEgYXV0b25vbXkgZmllbGRzIGludG8gdGhlIGBhdXRvbm9teWAgYmxvY2suXG4gICAgLy8gVjEgYWdlbnRzIHN0b3JlZCByaXNrVG9sZXJhbmNlIGFuZCBtYXhBdXRvbm9tb3VzU3RlcHMgYXQgdGhlIG1ldGFkYXRhIHJvb3QuXG4gICAgLy8gVjIgbmVzdHMgdGhlbSB1bmRlciBgYXV0b25vbXlgLiBUaGlzIHByb21vdGlvbiBlbnN1cmVzIGRvd25zdHJlYW0gY29kZSBvbmx5XG4gICAgLy8gY2hlY2tzIG9uZSBsb2NhdGlvbi4gVGhlIGV4aXN0aW5nIGF1dG9ub215IHZhbGlkYXRpb24gYmVsb3cgdmFsaWRhdGVzIHZhbHVlcy5cbiAgICAvLyBQcmVjZWRlbmNlOiBjYW1lbENhc2UgdmFyaWFudHMgYXJlIGxpc3RlZCBiZWZvcmUgc25ha2VfY2FzZS9zaG9ydCBmb3Jtcywgc29cbiAgICAvLyBlLmcuIGByaXNrVG9sZXJhbmNlYCB3aW5zIG92ZXIgYHJpc2tfdG9sZXJhbmNlYCBpZiBib3RoIGFwcGVhciBhdCByb290LlxuICAgIHtcbiAgICAgIGNvbnN0IHJvb3RBdXRvbm9teUZpZWxkczogUmVhZG9ubHlBcnJheTxyZWFkb25seSBbc3RyaW5nLCBzdHJpbmddPiA9IFtcbiAgICAgICAgWydyaXNrVG9sZXJhbmNlJywgJ3Jpc2tUb2xlcmFuY2UnXSxcbiAgICAgICAgWydyaXNrX3RvbGVyYW5jZScsICdyaXNrVG9sZXJhbmNlJ10sXG4gICAgICAgIFsnbWF4QXV0b25vbW91c1N0ZXBzJywgJ21heEF1dG9ub21vdXNTdGVwcyddLFxuICAgICAgICBbJ21heF9hdXRvbm9tb3VzX3N0ZXBzJywgJ21heEF1dG9ub21vdXNTdGVwcyddLFxuICAgICAgICBbJ21heFN0ZXBzJywgJ21heEF1dG9ub21vdXNTdGVwcyddLFxuICAgICAgXSBhcyBjb25zdDtcbiAgICAgIGxldCBwcm9tb3RlZCA9IGZhbHNlO1xuICAgICAgZm9yIChjb25zdCBbcm9vdEtleSwgYXV0b25vbXlLZXldIG9mIHJvb3RBdXRvbm9teUZpZWxkcykge1xuICAgICAgICBpZiAoYW55TWV0YVtyb290S2V5XSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgaWYgKCFtZXRhZGF0YS5hdXRvbm9teSkge1xuICAgICAgICAgICAgbWV0YWRhdGEuYXV0b25vbXkgPSB7fTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgYUJsb2NrID0gbWV0YWRhdGEuYXV0b25vbXkgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgICAgICAgaWYgKGFCbG9ja1thdXRvbm9teUtleV0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgYUJsb2NrW2F1dG9ub215S2V5XSA9IGFueU1ldGFbcm9vdEtleV07XG4gICAgICAgICAgICBwcm9tb3RlZCA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGRlbGV0ZSBhbnlNZXRhW3Jvb3RLZXldO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAocHJvbW90ZWQpIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oYFtwYXJzZU1ldGFkYXRhXSBBZ2VudCAnJHthZ2VudE5hbWV9JzogcHJvbW90ZWQgcm9vdC1sZXZlbCBhdXRvbm9teSBmaWVsZHMgaW50byBhdXRvbm9teSBibG9ja2ApO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChtZXRhZGF0YS5hdXRvbm9teSkge1xuICAgICAgaWYgKHR5cGVvZiBtZXRhZGF0YS5hdXRvbm9teSAhPT0gJ29iamVjdCcgfHwgQXJyYXkuaXNBcnJheShtZXRhZGF0YS5hdXRvbm9teSkpIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oYFtwYXJzZU1ldGFkYXRhXSBBZ2VudCAnJHthZ2VudE5hbWV9JzogYXV0b25vbXkgaXMgbm90IGFuIG9iamVjdCwgc3RyaXBwaW5nYCk7XG4gICAgICAgIGRlbGV0ZSBtZXRhZGF0YS5hdXRvbm9teTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIElzc3VlICM3MzA6IFNoYXJlZCBub3JtYWxpemF0aW9uICh3YXMgZHVwbGljYXRlZCBpbiBwYXJzZU1ldGFkYXRhICsgdmFsaWRhdGVWMkZpZWxkc0ZvckNyZWF0ZSlcbiAgICAgICAgY29uc3QgYSA9IG1ldGFkYXRhLmF1dG9ub215IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgICAgICBub3JtYWxpemVBdXRvbm9teUtleXMoYSk7XG5cbiAgICAgICAgLy8gVmFsaWRhdGUgc3BlY2lmaWMgZmllbGRzXG4gICAgICAgIC8vIEdhcCA0OiBWYWxpZGF0ZSByaXNrVG9sZXJhbmNlIGVudW0gKHVzZXMgc2hhcmVkIGNvbnN0YW50cyBmcm9tIElzc3VlICM3MjcpXG4gICAgICAgIGlmIChhLnJpc2tUb2xlcmFuY2UgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgIWlzT25lT2YoYS5yaXNrVG9sZXJhbmNlLCBSSVNLX1RPTEVSQU5DRV9MRVZFTFMpKSB7XG4gICAgICAgICAgbG9nZ2VyLndhcm4oYFtwYXJzZU1ldGFkYXRhXSBBZ2VudCAnJHthZ2VudE5hbWV9JzogYXV0b25vbXkucmlza1RvbGVyYW5jZSAnJHthLnJpc2tUb2xlcmFuY2V9JyBpcyBpbnZhbGlkLCBzdHJpcHBpbmdgKTtcbiAgICAgICAgICBkZWxldGUgYS5yaXNrVG9sZXJhbmNlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChhLm1heEF1dG9ub21vdXNTdGVwcyAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICB0eXBlb2YgYS5tYXhBdXRvbm9tb3VzU3RlcHMgIT09ICdudW1iZXInKSB7XG4gICAgICAgICAgbG9nZ2VyLndhcm4oYFtwYXJzZU1ldGFkYXRhXSBBZ2VudCAnJHthZ2VudE5hbWV9JzogYXV0b25vbXkubWF4QXV0b25vbW91c1N0ZXBzIGlzIG5vdCBhIG51bWJlciwgc3RyaXBwaW5nYCk7XG4gICAgICAgICAgZGVsZXRlIGEubWF4QXV0b25vbW91c1N0ZXBzO1xuICAgICAgICB9XG4gICAgICAgIGlmIChhLnJlcXVpcmVzQXBwcm92YWwgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgIUFycmF5LmlzQXJyYXkoYS5yZXF1aXJlc0FwcHJvdmFsKSkge1xuICAgICAgICAgIGxvZ2dlci53YXJuKGBbcGFyc2VNZXRhZGF0YV0gQWdlbnQgJyR7YWdlbnROYW1lfSc6IGF1dG9ub215LnJlcXVpcmVzQXBwcm92YWwgaXMgbm90IGFuIGFycmF5LCBzdHJpcHBpbmdgKTtcbiAgICAgICAgICBkZWxldGUgYS5yZXF1aXJlc0FwcHJvdmFsO1xuICAgICAgICB9XG4gICAgICAgIGlmIChhLmF1dG9BcHByb3ZlICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgICFBcnJheS5pc0FycmF5KGEuYXV0b0FwcHJvdmUpKSB7XG4gICAgICAgICAgbG9nZ2VyLndhcm4oYFtwYXJzZU1ldGFkYXRhXSBBZ2VudCAnJHthZ2VudE5hbWV9JzogYXV0b25vbXkuYXV0b0FwcHJvdmUgaXMgbm90IGFuIGFycmF5LCBzdHJpcHBpbmdgKTtcbiAgICAgICAgICBkZWxldGUgYS5hdXRvQXBwcm92ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChtZXRhZGF0YS5yZXNpbGllbmNlKSB7XG4gICAgICBpZiAodHlwZW9mIG1ldGFkYXRhLnJlc2lsaWVuY2UgIT09ICdvYmplY3QnIHx8IEFycmF5LmlzQXJyYXkobWV0YWRhdGEucmVzaWxpZW5jZSkpIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oYFtwYXJzZU1ldGFkYXRhXSBBZ2VudCAnJHthZ2VudE5hbWV9JzogcmVzaWxpZW5jZSBpcyBub3QgYW4gb2JqZWN0LCBzdHJpcHBpbmdgKTtcbiAgICAgICAgZGVsZXRlIG1ldGFkYXRhLnJlc2lsaWVuY2U7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBJc3N1ZSAjNzMwOiBTaGFyZWQgbm9ybWFsaXphdGlvbiAod2FzIGR1cGxpY2F0ZWQgaW4gcGFyc2VNZXRhZGF0YSArIHZhbGlkYXRlVjJGaWVsZHNGb3JDcmVhdGUpXG4gICAgICAgIGNvbnN0IHIgPSBtZXRhZGF0YS5yZXNpbGllbmNlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgICAgICBub3JtYWxpemVSZXNpbGllbmNlS2V5cyhyKTtcblxuICAgICAgICAvLyBJc3N1ZSAjNzI3OiBVc2Ugc2hhcmVkIGVudW0gY29uc3RhbnRzIGZvciByZXNpbGllbmNlIHZhbGlkYXRpb25cbiAgICAgICAgaWYgKHIub25TdGVwTGltaXRSZWFjaGVkICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgICFpc09uZU9mKHIub25TdGVwTGltaXRSZWFjaGVkLCBTVEVQX0xJTUlUX0FDVElPTlMpKSB7XG4gICAgICAgICAgbG9nZ2VyLndhcm4oYFtwYXJzZU1ldGFkYXRhXSBBZ2VudCAnJHthZ2VudE5hbWV9JzogcmVzaWxpZW5jZS5vblN0ZXBMaW1pdFJlYWNoZWQgJyR7ci5vblN0ZXBMaW1pdFJlYWNoZWR9JyBpcyBpbnZhbGlkLCBzdHJpcHBpbmdgKTtcbiAgICAgICAgICBkZWxldGUgci5vblN0ZXBMaW1pdFJlYWNoZWQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHIub25FeGVjdXRpb25GYWlsdXJlICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgICFpc09uZU9mKHIub25FeGVjdXRpb25GYWlsdXJlLCBFWEVDVVRJT05fRkFJTFVSRV9BQ1RJT05TKSkge1xuICAgICAgICAgIGxvZ2dlci53YXJuKGBbcGFyc2VNZXRhZGF0YV0gQWdlbnQgJyR7YWdlbnROYW1lfSc6IHJlc2lsaWVuY2Uub25FeGVjdXRpb25GYWlsdXJlICcke3Iub25FeGVjdXRpb25GYWlsdXJlfScgaXMgaW52YWxpZCwgc3RyaXBwaW5nYCk7XG4gICAgICAgICAgZGVsZXRlIHIub25FeGVjdXRpb25GYWlsdXJlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyLm1heFJldHJpZXMgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgdHlwZW9mIHIubWF4UmV0cmllcyAhPT0gJ251bWJlcicpIHtcbiAgICAgICAgICBsb2dnZXIud2FybihgW3BhcnNlTWV0YWRhdGFdIEFnZW50ICcke2FnZW50TmFtZX0nOiByZXNpbGllbmNlLm1heFJldHJpZXMgaXMgbm90IGEgbnVtYmVyLCBzdHJpcHBpbmdgKTtcbiAgICAgICAgICBkZWxldGUgci5tYXhSZXRyaWVzO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyLm1heENvbnRpbnVhdGlvbnMgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgdHlwZW9mIHIubWF4Q29udGludWF0aW9ucyAhPT0gJ251bWJlcicpIHtcbiAgICAgICAgICBsb2dnZXIud2FybihgW3BhcnNlTWV0YWRhdGFdIEFnZW50ICcke2FnZW50TmFtZX0nOiByZXNpbGllbmNlLm1heENvbnRpbnVhdGlvbnMgaXMgbm90IGEgbnVtYmVyLCBzdHJpcHBpbmdgKTtcbiAgICAgICAgICBkZWxldGUgci5tYXhDb250aW51YXRpb25zO1xuICAgICAgICB9XG4gICAgICAgIC8vIEdhcCA1OiBWYWxpZGF0ZSByZXRyeUJhY2tvZmYgZW51bSBhbmQgcHJlc2VydmVTdGF0ZSBib29sZWFuIChzaGFyZWQgY29uc3RhbnRzIGZyb20gSXNzdWUgIzcyNylcbiAgICAgICAgaWYgKHIucmV0cnlCYWNrb2ZmICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgICFpc09uZU9mKHIucmV0cnlCYWNrb2ZmLCBCQUNLT0ZGX1NUUkFURUdJRVMpKSB7XG4gICAgICAgICAgbG9nZ2VyLndhcm4oYFtwYXJzZU1ldGFkYXRhXSBBZ2VudCAnJHthZ2VudE5hbWV9JzogcmVzaWxpZW5jZS5yZXRyeUJhY2tvZmYgJyR7ci5yZXRyeUJhY2tvZmZ9JyBpcyBpbnZhbGlkLCBzdHJpcHBpbmdgKTtcbiAgICAgICAgICBkZWxldGUgci5yZXRyeUJhY2tvZmY7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHIucHJlc2VydmVTdGF0ZSAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICB0eXBlb2Ygci5wcmVzZXJ2ZVN0YXRlICE9PSAnYm9vbGVhbicpIHtcbiAgICAgICAgICBsb2dnZXIud2FybihgW3BhcnNlTWV0YWRhdGFdIEFnZW50ICcke2FnZW50TmFtZX0nOiByZXNpbGllbmNlLnByZXNlcnZlU3RhdGUgaXMgbm90IGEgYm9vbGVhbiwgc3RyaXBwaW5nYCk7XG4gICAgICAgICAgZGVsZXRlIHIucHJlc2VydmVTdGF0ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFRhZ3M6IHZhbGlkYXRlIGFzIHN0cmluZyBhcnJheSAoY29tbW9uIGZpZWxkLCBhbGwgZWxlbWVudCB0eXBlcylcbiAgICBpZiAobWV0YWRhdGEudGFncyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAoIUFycmF5LmlzQXJyYXkobWV0YWRhdGEudGFncykpIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oYFtwYXJzZU1ldGFkYXRhXSBBZ2VudCAnJHthZ2VudE5hbWV9JzogdGFncyBpcyBub3QgYW4gYXJyYXksIHN0cmlwcGluZ2ApO1xuICAgICAgICBkZWxldGUgbWV0YWRhdGEudGFncztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG1ldGFkYXRhLnRhZ3MgPSBtZXRhZGF0YS50YWdzLmZpbHRlcigodDogdW5rbm93bikgPT4gdHlwZW9mIHQgPT09ICdzdHJpbmcnKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbWV0YWRhdGEgYXMgQWdlbnRNZXRhZGF0YTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBjcmVhdGVFbGVtZW50KG1ldGFkYXRhOiBBZ2VudE1ldGFkYXRhLCBib2R5Q29udGVudDogc3RyaW5nKTogQWdlbnQge1xuICAgIGNvbnN0IGFnZW50ID0gbmV3IEFnZW50KG1ldGFkYXRhLCB0aGlzLm1ldGFkYXRhU2VydmljZSk7XG4gICAgLy8gRml4ICM5MTI6IFByZWZlciBleHBsaWNpdCBmb3JtYXRfdmVyc2lvbiBtYXJrZXIsIGZhbGwgYmFjayB0byBpbnN0cnVjdGlvbnMtcHJlc2VuY2UgY2hlY2tcbiAgICBkZWxldGUgKG1ldGFkYXRhIGFzIGFueSkuZm9ybWF0X3ZlcnNpb247ICAvLyBTdHJpcCBtYXJrZXIgZnJvbSBydW50aW1lIG1ldGFkYXRhXG4gICAgY29uc3QgbWV0YWRhdGFJbnN0cnVjdGlvbnMgPSBtZXRhZGF0YS5pbnN0cnVjdGlvbnM7XG4gICAgaWYgKG1ldGFkYXRhSW5zdHJ1Y3Rpb25zKSB7XG4gICAgICAvLyB2MiBmb3JtYXQ6IGluc3RydWN0aW9ucyBmcm9tIFlBTUwsIGJvZHkgaXMgY29udGVudCAocmVmZXJlbmNlIG1hdGVyaWFsKVxuICAgICAgYWdlbnQuaW5zdHJ1Y3Rpb25zID0gbWV0YWRhdGFJbnN0cnVjdGlvbnM7XG4gICAgICBhZ2VudC5jb250ZW50ID0gYm9keUNvbnRlbnQudHJpbSgpO1xuICAgICAgZGVsZXRlIG1ldGFkYXRhLmluc3RydWN0aW9ucztcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gdjEgZm9ybWF0OiBib2R5IHRleHQgbWFwcyB0byBpbnN0cnVjdGlvbnNcbiAgICAgIGFnZW50Lmluc3RydWN0aW9ucyA9IGJvZHlDb250ZW50LnRyaW0oKTtcbiAgICAgIGFnZW50LmNvbnRlbnQgPSAnJztcbiAgICB9XG4gICAgLy8gS2VlcCBleHRlbnNpb25zLmluc3RydWN0aW9ucyBmb3IgYmFja3dhcmQgY29tcGF0XG4gICAgYWdlbnQuZXh0ZW5zaW9ucyA9IHtcbiAgICAgIC4uLmFnZW50LmV4dGVuc2lvbnMsXG4gICAgICBpbnN0cnVjdGlvbnM6IGFnZW50Lmluc3RydWN0aW9uc1xuICAgIH07XG4gICAgcmV0dXJuIGFnZW50O1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGFzeW5jIHNlcmlhbGl6ZUVsZW1lbnQoYWdlbnQ6IEFnZW50KTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICAvLyBTdGFydCB3aXRoIGJhc2UgbWV0YWRhdGEgZmllbGRzIChhbHdheXMgcHJlc2VudClcbiAgICBjb25zdCBtZXRhZGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7XG4gICAgICBuYW1lOiBhZ2VudC5tZXRhZGF0YS5uYW1lLFxuICAgICAgdHlwZTogdG9TaW5ndWxhckxhYmVsKEVsZW1lbnRUeXBlLkFHRU5UKSxcbiAgICAgIHVuaXF1ZV9pZDogYWdlbnQuaWQsXG4gICAgICB2ZXJzaW9uOiBhZ2VudC5tZXRhZGF0YS52ZXJzaW9uLFxuICAgICAgYXV0aG9yOiBhZ2VudC5tZXRhZGF0YS5hdXRob3IsXG4gICAgICBjcmVhdGVkOiBhZ2VudC5tZXRhZGF0YS5jcmVhdGVkID8/IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgIG1vZGlmaWVkOiBhZ2VudC5tZXRhZGF0YS5tb2RpZmllZCA/PyBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgICBkZXNjcmlwdGlvbjogYWdlbnQubWV0YWRhdGEuZGVzY3JpcHRpb24sXG4gICAgICBmb3JtYXRfdmVyc2lvbjogJ3YyJywgIC8vIEZpeCAjOTEyOiBFeHBsaWNpdCBmb3JtYXQgbWFya2VyXG4gICAgfTtcblxuICAgIC8vIENhc3QgdG8gY2hlY2sgZm9yIHYyIGZpZWxkc1xuICAgIGNvbnN0IG1ldGFkYXRhVjIgPSBhZ2VudC5tZXRhZGF0YSBhcyBBZ2VudE1ldGFkYXRhVjI7XG5cbiAgICAvLyBBZGQgdjIgZmllbGRzIGlmIHByZXNlbnQgKGdvYWwgaXMgcmVxdWlyZWQgaW4gdjIsIG90aGVycyBvcHRpb25hbClcbiAgICBpZiAobWV0YWRhdGFWMi5nb2FsKSB7XG4gICAgICBtZXRhZGF0YS5nb2FsID0gbWV0YWRhdGFWMi5nb2FsO1xuICAgIH1cbiAgICBpZiAobWV0YWRhdGFWMi5hY3RpdmF0ZXMpIHtcbiAgICAgIG1ldGFkYXRhLmFjdGl2YXRlcyA9IG1ldGFkYXRhVjIuYWN0aXZhdGVzO1xuICAgIH1cbiAgICBpZiAobWV0YWRhdGFWMi50b29scykge1xuICAgICAgbWV0YWRhdGEudG9vbHMgPSBtZXRhZGF0YVYyLnRvb2xzO1xuICAgIH1cbiAgICBpZiAobWV0YWRhdGFWMi5zeXN0ZW1Qcm9tcHQpIHtcbiAgICAgIG1ldGFkYXRhLnN5c3RlbVByb21wdCA9IG1ldGFkYXRhVjIuc3lzdGVtUHJvbXB0O1xuICAgIH1cbiAgICBpZiAobWV0YWRhdGFWMi5hdXRvbm9teSkge1xuICAgICAgbWV0YWRhdGEuYXV0b25vbXkgPSBtZXRhZGF0YVYyLmF1dG9ub215O1xuICAgIH1cbiAgICAvLyBJc3N1ZSAjNDQ5OiBTZXJpYWxpemUgZ2F0ZWtlZXBlciBwb2xpY3kgdG8gWUFNTCBmcm9udG1hdHRlclxuICAgIGlmIChtZXRhZGF0YVYyLmdhdGVrZWVwZXIpIHtcbiAgICAgIG1ldGFkYXRhLmdhdGVrZWVwZXIgPSBtZXRhZGF0YVYyLmdhdGVrZWVwZXI7XG4gICAgfVxuICAgIC8vIElzc3VlICM1MjY6IFNlcmlhbGl6ZSByZXNpbGllbmNlIHBvbGljeSB0byBZQU1MIGZyb250bWF0dGVyXG4gICAgaWYgKG1ldGFkYXRhVjIucmVzaWxpZW5jZSkge1xuICAgICAgbWV0YWRhdGEucmVzaWxpZW5jZSA9IG1ldGFkYXRhVjIucmVzaWxpZW5jZTtcbiAgICB9XG5cbiAgICAvLyBJc3N1ZSAjNzIyOiBPbmx5IHNlcmlhbGl6ZSB2MSBmaWVsZHMgZm9yIGFnZW50cyBXSVRIT1VUIGEgZ29hbCAobGVnYWN5IHYxIGFnZW50cykuXG4gICAgLy8gVjIgYWdlbnRzICh3aXRoIGdvYWwpIHNob3VsZCBub3QgY2FycnkgZGVwcmVjYXRlZCB2MSBiYWdnYWdlIGxpa2VcbiAgICAvLyBkZWNpc2lvbkZyYW1ld29yaywgcmlza1RvbGVyYW5jZSwgbGVhcm5pbmdFbmFibGVkLCBtYXhDb25jdXJyZW50R29hbHMuXG4gICAgLy8gVGhlIEFnZW50IGNvbnN0cnVjdG9yIHN0aWxsIGFwcGxpZXMgdGhlc2UgZGVmYXVsdHMgYXQgcnVudGltZSBmb3IgYmFja3dhcmRcbiAgICAvLyBjb21wYXQgd2hlbiByZWFkaW5nIG9sZCBmaWxlcyDigJQgYnV0IHdlIGRvbid0IHdyaXRlIHRoZW0gaW50byBuZXcgdjIgYWdlbnRzLlxuICAgIGNvbnN0IGlzVjJBZ2VudCA9ICEhbWV0YWRhdGFWMi5nb2FsO1xuICAgIGlmICghaXNWMkFnZW50KSB7XG4gICAgICBpZiAobWV0YWRhdGFWMi5kZWNpc2lvbkZyYW1ld29yaykge1xuICAgICAgICBtZXRhZGF0YS5kZWNpc2lvbkZyYW1ld29yayA9IG1ldGFkYXRhVjIuZGVjaXNpb25GcmFtZXdvcms7XG4gICAgICB9XG4gICAgICBpZiAobWV0YWRhdGFWMi5yaXNrVG9sZXJhbmNlKSB7XG4gICAgICAgIG1ldGFkYXRhLnJpc2tUb2xlcmFuY2UgPSBtZXRhZGF0YVYyLnJpc2tUb2xlcmFuY2U7XG4gICAgICB9XG4gICAgICBpZiAobWV0YWRhdGFWMi5sZWFybmluZ0VuYWJsZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBtZXRhZGF0YS5sZWFybmluZ0VuYWJsZWQgPSBtZXRhZGF0YVYyLmxlYXJuaW5nRW5hYmxlZDtcbiAgICAgIH1cbiAgICAgIGlmIChtZXRhZGF0YVYyLm1heENvbmN1cnJlbnRHb2FscyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIG1ldGFkYXRhLm1heENvbmN1cnJlbnRHb2FscyA9IG1ldGFkYXRhVjIubWF4Q29uY3VycmVudEdvYWxzO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBzcGVjaWFsaXphdGlvbnMgaXMgbm90IGEgZGVwcmVjYXRlZCB2MSBmaWVsZCDigJQgYWx3YXlzIHNlcmlhbGl6ZVxuICAgIGlmIChtZXRhZGF0YVYyLnNwZWNpYWxpemF0aW9ucykge1xuICAgICAgbWV0YWRhdGEuc3BlY2lhbGl6YXRpb25zID0gbWV0YWRhdGFWMi5zcGVjaWFsaXphdGlvbnM7XG4gICAgfVxuICAgIC8vIElzc3VlICM3MjI6IFNlcmlhbGl6ZSB0YWdzIGFuZCB0cmlnZ2VycyB0byBZQU1MIGZyb250bWF0dGVyXG4gICAgaWYgKG1ldGFkYXRhVjIudGFncyAmJiBBcnJheS5pc0FycmF5KG1ldGFkYXRhVjIudGFncykgJiYgbWV0YWRhdGFWMi50YWdzLmxlbmd0aCA+IDApIHtcbiAgICAgIG1ldGFkYXRhLnRhZ3MgPSBtZXRhZGF0YVYyLnRhZ3M7XG4gICAgfVxuICAgIGlmIChtZXRhZGF0YVYyLnRyaWdnZXJzKSB7XG4gICAgICBtZXRhZGF0YS50cmlnZ2VycyA9IG1ldGFkYXRhVjIudHJpZ2dlcnM7XG4gICAgfVxuICAgIGlmIChtZXRhZGF0YVYyLnJ1bGVFbmdpbmVDb25maWcgIT09IHVuZGVmaW5lZCkge1xuICAgICAgbWV0YWRhdGEucnVsZUVuZ2luZUNvbmZpZyA9IG1ldGFkYXRhVjIucnVsZUVuZ2luZUNvbmZpZztcbiAgICB9XG5cbiAgICAvLyB2Mi4wIGZvcm1hdDogaW5zdHJ1Y3Rpb25zIGluIFlBTUwgZnJvbnRtYXR0ZXIsIGNvbnRlbnQgYXMgYm9keVxuICAgIGNvbnN0IGluc3RydWN0aW9ucyA9IGFnZW50Lmluc3RydWN0aW9ucyB8fFxuICAgICAgKGFnZW50LmV4dGVuc2lvbnM/Lmluc3RydWN0aW9ucyBhcyBzdHJpbmcgfCB1bmRlZmluZWQpIHx8XG4gICAgICB0aGlzLmJ1aWxkRGVmYXVsdEluc3RydWN0aW9ucyhhZ2VudCk7XG4gICAgaWYgKGluc3RydWN0aW9ucykge1xuICAgICAgbWV0YWRhdGEuaW5zdHJ1Y3Rpb25zID0gaW5zdHJ1Y3Rpb25zO1xuICAgIH1cbiAgICBjb25zdCBib2R5ID0gYWdlbnQuY29udGVudCB8fCB0aGlzLmJ1aWxkRGVmYXVsdEJvZHkoYWdlbnQpO1xuXG4gICAgcmV0dXJuIHRoaXMuc2VyaWFsaXphdGlvblNlcnZpY2UuY3JlYXRlRnJvbnRtYXR0ZXIobWV0YWRhdGEsIGJvZHksIHtcbiAgICAgIG1ldGhvZDogJ21hbnVhbCcsXG4gICAgICBzY2hlbWE6ICdqc29uJywgIC8vIFVzZSBKU09OIHNjaGVtYSB0byBwcmVzZXJ2ZSBib29sZWFucy9udW1iZXJzIGluIHYyIG1ldGFkYXRhXG4gICAgICBjbGVhbk1ldGFkYXRhOiB0cnVlLFxuICAgICAgY2xlYW5pbmdTdHJhdGVneTogJ3JlbW92ZS1ib3RoJywgIC8vIFJlbW92ZSBib3RoIG51bGwgYW5kIHVuZGVmaW5lZFxuICAgICAgc29ydEtleXM6IHRydWVcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYnVpbGREZWZhdWx0SW5zdHJ1Y3Rpb25zKGFnZW50OiBBZ2VudCk6IHN0cmluZyB7XG4gICAgY29uc3QgbmFtZUhlYWRlciA9IGFnZW50Lm1ldGFkYXRhLm5hbWUgPyBgIyAke2FnZW50Lm1ldGFkYXRhLm5hbWV9XFxuXFxuYCA6ICcnO1xuICAgIGNvbnN0IGRlc2NyaXB0aW9uID0gYWdlbnQubWV0YWRhdGEuZGVzY3JpcHRpb24gPz8gJyc7XG4gICAgcmV0dXJuIGAke25hbWVIZWFkZXJ9JHtkZXNjcmlwdGlvbn1gLnRyaW0oKTtcbiAgfVxuXG4gIHByaXZhdGUgYnVpbGREZWZhdWx0Qm9keShhZ2VudDogQWdlbnQpOiBzdHJpbmcge1xuICAgIGNvbnN0IG5hbWUgPSAoYWdlbnQubWV0YWRhdGEubmFtZSA/PyAnJykudHJpbSgpO1xuICAgIGNvbnN0IGRlc2NyaXB0aW9uID0gKGFnZW50Lm1ldGFkYXRhLmRlc2NyaXB0aW9uID8/ICcnKS50cmltKCk7XG4gICAgY29uc3QgbGluZXM6IHN0cmluZ1tdID0gW107XG4gICAgaWYgKG5hbWUpIHtcbiAgICAgIGxpbmVzLnB1c2goYCMgJHtuYW1lfWApO1xuICAgICAgbGluZXMucHVzaCgnJyk7XG4gICAgfVxuICAgIGlmIChkZXNjcmlwdGlvbikge1xuICAgICAgbGluZXMucHVzaChkZXNjcmlwdGlvbik7XG4gICAgfVxuICAgIHJldHVybiBsaW5lcy5qb2luKCdcXG4nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJc3N1ZSAjNzI3OiBWYWxpZGF0ZSBWMiBhZ2VudCBmaWVsZHMgYXQgd3JpdGUgdGltZS5cbiAgICpcbiAgICogTm9ybWFsaXplcyBzbmFrZV9jYXNlIOKGkiBjYW1lbENhc2UgKHNhbWUgYXMgcGFyc2VNZXRhZGF0YSkgYW5kIHRoZW4gdmFsaWRhdGVzXG4gICAqIHN0cnVjdHVyYWwgY29uc3RyYWludHMuIFVubGlrZSBwYXJzZU1ldGFkYXRhICh3aGljaCBzaWxlbnRseSBzdHJpcHMgZm9yXG4gICAqIGJhY2t3YXJkIGNvbXBhdCksIHRoaXMgcmV0dXJucyBlcnJvcnMgc28gdGhlIGNhbGxlciBjYW4gcmVqZWN0IHRoZSBjcmVhdGUuXG4gICAqXG4gICAqIE11dGF0ZXMgdGhlIG1ldGFkYXRhIGluIHBsYWNlIChub3JtYWxpemF0aW9uKSwgcmV0dXJucyB2YWxpZGF0aW9uIGVycm9ycy5cbiAgICovXG4gIHByaXZhdGUgdmFsaWRhdGVWMkZpZWxkc0ZvckNyZWF0ZShtZXRhZGF0YTogUGFydGlhbDxBZ2VudE1ldGFkYXRhVjI+KTogc3RyaW5nW10ge1xuICAgIGNvbnN0IGVycm9yczogc3RyaW5nW10gPSBbXTtcblxuICAgIC8vIC0tLSB0b29scyAtLS1cbiAgICBpZiAobWV0YWRhdGEudG9vbHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKHR5cGVvZiBtZXRhZGF0YS50b29scyAhPT0gJ29iamVjdCcgfHwgQXJyYXkuaXNBcnJheShtZXRhZGF0YS50b29scykgfHwgbWV0YWRhdGEudG9vbHMgPT09IG51bGwpIHtcbiAgICAgICAgZXJyb3JzLnB1c2goJ3Rvb2xzIG11c3QgYmUgYW4gb2JqZWN0IHdpdGggYWxsb3dlZC9kZW5pZWQgYXJyYXlzJyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkobWV0YWRhdGEudG9vbHMuYWxsb3dlZCkpIHtcbiAgICAgICAgICBlcnJvcnMucHVzaCgndG9vbHMuYWxsb3dlZCBpcyByZXF1aXJlZCBhbmQgbXVzdCBiZSBhbiBhcnJheSBvZiBzdHJpbmdzJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1ldGFkYXRhLnRvb2xzLmRlbmllZCAhPT0gdW5kZWZpbmVkICYmICFBcnJheS5pc0FycmF5KG1ldGFkYXRhLnRvb2xzLmRlbmllZCkpIHtcbiAgICAgICAgICBlcnJvcnMucHVzaCgndG9vbHMuZGVuaWVkIG11c3QgYmUgYW4gYXJyYXkgb2Ygc3RyaW5ncycpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gLS0tIHN5c3RlbVByb21wdCAtLS1cbiAgICBpZiAobWV0YWRhdGEuc3lzdGVtUHJvbXB0ICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIG1ldGFkYXRhLnN5c3RlbVByb21wdCAhPT0gJ3N0cmluZycpIHtcbiAgICAgIGVycm9ycy5wdXNoKCdzeXN0ZW1Qcm9tcHQgbXVzdCBiZSBhIHN0cmluZycpO1xuICAgIH1cbiAgICAvLyBzbmFrZV9jYXNlIHZhcmlhbnQgKElzc3VlICM3MjU6IG5vcm1hbGl6ZWQgYXQgZGlzcGF0Y2hlciBsZXZlbCBldmVudHVhbGx5KVxuICAgIGNvbnN0IGFueU1ldGEgPSBtZXRhZGF0YSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICBpZiAoYW55TWV0YS5zeXN0ZW1fcHJvbXB0ICE9PSB1bmRlZmluZWQgJiYgbWV0YWRhdGEuc3lzdGVtUHJvbXB0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmICh0eXBlb2YgYW55TWV0YS5zeXN0ZW1fcHJvbXB0ID09PSAnc3RyaW5nJykge1xuICAgICAgICBtZXRhZGF0YS5zeXN0ZW1Qcm9tcHQgPSBhbnlNZXRhLnN5c3RlbV9wcm9tcHQgYXMgc3RyaW5nO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZXJyb3JzLnB1c2goJ3N5c3RlbV9wcm9tcHQgbXVzdCBiZSBhIHN0cmluZycpO1xuICAgICAgfVxuICAgICAgZGVsZXRlIGFueU1ldGEuc3lzdGVtX3Byb21wdDtcbiAgICB9XG5cbiAgICAvLyAtLS0gYXV0b25vbXkgLS0tXG4gICAgaWYgKG1ldGFkYXRhLmF1dG9ub215ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmICh0eXBlb2YgbWV0YWRhdGEuYXV0b25vbXkgIT09ICdvYmplY3QnIHx8IEFycmF5LmlzQXJyYXkobWV0YWRhdGEuYXV0b25vbXkpIHx8IG1ldGFkYXRhLmF1dG9ub215ID09PSBudWxsKSB7XG4gICAgICAgIGVycm9ycy5wdXNoKCdhdXRvbm9teSBtdXN0IGJlIGFuIG9iamVjdCcpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gSXNzdWUgIzczMDogU2hhcmVkIG5vcm1hbGl6YXRpb25cbiAgICAgICAgY29uc3QgYSA9IG1ldGFkYXRhLmF1dG9ub215IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgICAgICBub3JtYWxpemVBdXRvbm9teUtleXMoYSk7XG5cbiAgICAgICAgLy8gVmFsaWRhdGUgYWZ0ZXIgbm9ybWFsaXphdGlvblxuICAgICAgICBpZiAoYS5yaXNrVG9sZXJhbmNlICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgICFpc09uZU9mKGEucmlza1RvbGVyYW5jZSwgUklTS19UT0xFUkFOQ0VfTEVWRUxTKSkge1xuICAgICAgICAgIGVycm9ycy5wdXNoKGBhdXRvbm9teS5yaXNrVG9sZXJhbmNlIG11c3QgYmUgb25lIG9mOiAke1JJU0tfVE9MRVJBTkNFX0xFVkVMUy5qb2luKCcsICcpfSAoZ290ICcke2Eucmlza1RvbGVyYW5jZX0nKWApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChhLm1heEF1dG9ub21vdXNTdGVwcyAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiBhLm1heEF1dG9ub21vdXNTdGVwcyAhPT0gJ251bWJlcicpIHtcbiAgICAgICAgICBlcnJvcnMucHVzaCgnYXV0b25vbXkubWF4QXV0b25vbW91c1N0ZXBzIG11c3QgYmUgYSBudW1iZXInKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYS5yZXF1aXJlc0FwcHJvdmFsICE9PSB1bmRlZmluZWQgJiYgIUFycmF5LmlzQXJyYXkoYS5yZXF1aXJlc0FwcHJvdmFsKSkge1xuICAgICAgICAgIGVycm9ycy5wdXNoKCdhdXRvbm9teS5yZXF1aXJlc0FwcHJvdmFsIG11c3QgYmUgYW4gYXJyYXkgb2Ygc3RyaW5ncycpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChhLmF1dG9BcHByb3ZlICE9PSB1bmRlZmluZWQgJiYgIUFycmF5LmlzQXJyYXkoYS5hdXRvQXBwcm92ZSkpIHtcbiAgICAgICAgICBlcnJvcnMucHVzaCgnYXV0b25vbXkuYXV0b0FwcHJvdmUgbXVzdCBiZSBhbiBhcnJheSBvZiBzdHJpbmdzJyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyAtLS0gcmVzaWxpZW5jZSAtLS1cbiAgICBpZiAobWV0YWRhdGEucmVzaWxpZW5jZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAodHlwZW9mIG1ldGFkYXRhLnJlc2lsaWVuY2UgIT09ICdvYmplY3QnIHx8IEFycmF5LmlzQXJyYXkobWV0YWRhdGEucmVzaWxpZW5jZSkgfHwgbWV0YWRhdGEucmVzaWxpZW5jZSA9PT0gbnVsbCkge1xuICAgICAgICBlcnJvcnMucHVzaCgncmVzaWxpZW5jZSBtdXN0IGJlIGFuIG9iamVjdCcpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gSXNzdWUgIzczMDogU2hhcmVkIG5vcm1hbGl6YXRpb25cbiAgICAgICAgY29uc3QgciA9IG1ldGFkYXRhLnJlc2lsaWVuY2UgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgICAgIG5vcm1hbGl6ZVJlc2lsaWVuY2VLZXlzKHIpO1xuXG4gICAgICAgIC8vIFZhbGlkYXRlIGFmdGVyIG5vcm1hbGl6YXRpb25cbiAgICAgICAgaWYgKHIub25TdGVwTGltaXRSZWFjaGVkICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgICFpc09uZU9mKHIub25TdGVwTGltaXRSZWFjaGVkLCBTVEVQX0xJTUlUX0FDVElPTlMpKSB7XG4gICAgICAgICAgZXJyb3JzLnB1c2goYHJlc2lsaWVuY2Uub25TdGVwTGltaXRSZWFjaGVkIG11c3QgYmUgb25lIG9mOiAke1NURVBfTElNSVRfQUNUSU9OUy5qb2luKCcsICcpfSAoZ290ICcke3Iub25TdGVwTGltaXRSZWFjaGVkfScpYCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHIub25FeGVjdXRpb25GYWlsdXJlICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgICFpc09uZU9mKHIub25FeGVjdXRpb25GYWlsdXJlLCBFWEVDVVRJT05fRkFJTFVSRV9BQ1RJT05TKSkge1xuICAgICAgICAgIGVycm9ycy5wdXNoKGByZXNpbGllbmNlLm9uRXhlY3V0aW9uRmFpbHVyZSBtdXN0IGJlIG9uZSBvZjogJHtFWEVDVVRJT05fRkFJTFVSRV9BQ1RJT05TLmpvaW4oJywgJyl9IChnb3QgJyR7ci5vbkV4ZWN1dGlvbkZhaWx1cmV9JylgKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoci5tYXhSZXRyaWVzICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIHIubWF4UmV0cmllcyAhPT0gJ251bWJlcicpIHtcbiAgICAgICAgICBlcnJvcnMucHVzaCgncmVzaWxpZW5jZS5tYXhSZXRyaWVzIG11c3QgYmUgYSBudW1iZXInKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoci5tYXhDb250aW51YXRpb25zICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIHIubWF4Q29udGludWF0aW9ucyAhPT0gJ251bWJlcicpIHtcbiAgICAgICAgICBlcnJvcnMucHVzaCgncmVzaWxpZW5jZS5tYXhDb250aW51YXRpb25zIG11c3QgYmUgYSBudW1iZXInKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoci5yZXRyeUJhY2tvZmYgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgIWlzT25lT2Yoci5yZXRyeUJhY2tvZmYsIEJBQ0tPRkZfU1RSQVRFR0lFUykpIHtcbiAgICAgICAgICBlcnJvcnMucHVzaChgcmVzaWxpZW5jZS5yZXRyeUJhY2tvZmYgbXVzdCBiZSBvbmUgb2Y6ICR7QkFDS09GRl9TVFJBVEVHSUVTLmpvaW4oJywgJyl9IChnb3QgJyR7ci5yZXRyeUJhY2tvZmZ9JylgKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoci5wcmVzZXJ2ZVN0YXRlICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIHIucHJlc2VydmVTdGF0ZSAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgICAgZXJyb3JzLnB1c2goJ3Jlc2lsaWVuY2UucHJlc2VydmVTdGF0ZSBtdXN0IGJlIGEgYm9vbGVhbicpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gLS0tIGFjdGl2YXRlcyAtLS1cbiAgICBpZiAobWV0YWRhdGEuYWN0aXZhdGVzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmICh0eXBlb2YgbWV0YWRhdGEuYWN0aXZhdGVzICE9PSAnb2JqZWN0JyB8fCBBcnJheS5pc0FycmF5KG1ldGFkYXRhLmFjdGl2YXRlcykgfHwgbWV0YWRhdGEuYWN0aXZhdGVzID09PSBudWxsKSB7XG4gICAgICAgIGVycm9ycy5wdXNoKCdhY3RpdmF0ZXMgbXVzdCBiZSBhbiBvYmplY3Qgd2l0aCBza2lsbHMvcGVyc29uYXMvbWVtb3JpZXMvdGVtcGxhdGVzL2Vuc2VtYmxlcyBhcnJheXMnKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZXJyb3JzO1xuICB9XG5cbiAgLyoqXG4gICAqIE5vcm1hbGl6ZSBnb2FsIGlucHV0IHRvIFYyIGZvcm1hdC5cbiAgICogTExNcyBtYXkgcGFzcyBnb2FsIGFzIGEgc2ltcGxlIHN0cmluZyBvciBhcyBhIFYyIGNvbmZpZyBvYmplY3QuXG4gICAqIFRoaXMgZW5zdXJlcyB3ZSBhbHdheXMgaGF2ZSBhIHByb3BlciBWMiBzdHJ1Y3R1cmUgYmVmb3JlIHZhbGlkYXRpb24uXG4gICAqXG4gICAqIEBwYXJhbSBnb2FsIC0gRWl0aGVyIGEgc3RyaW5nIGdvYWwgb3IgYSBWMiBnb2FsIGNvbmZpZyBvYmplY3RcbiAgICogQHJldHVybnMgTm9ybWFsaXplZCBWMiBnb2FsIGNvbmZpZywgb3IgdW5kZWZpbmVkIGlmIG5vIGdvYWwgcHJvdmlkZWRcbiAgICovXG4gIHByaXZhdGUgbm9ybWFsaXplR29hbElucHV0KGdvYWw6IHN0cmluZyB8IFBhcnRpYWw8QWdlbnRHb2FsQ29uZmlnPiB8IHVuZGVmaW5lZCk6IEFnZW50R29hbENvbmZpZyB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKCFnb2FsKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIC8vIElmIGl0J3MgYSBzdHJpbmcsIGNvbnZlcnQgdG8gVjIgZm9ybWF0XG4gICAgaWYgKHR5cGVvZiBnb2FsID09PSAnc3RyaW5nJykge1xuICAgICAgbG9nZ2VyLmRlYnVnKCdDb252ZXJ0aW5nIHN0cmluZyBnb2FsIHRvIFYyIGZvcm1hdCcsIHsgZ29hbCB9KTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHRlbXBsYXRlOiBnb2FsLFxuICAgICAgICBwYXJhbWV0ZXJzOiBbXVxuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBJZiBpdCdzIGFscmVhZHkgYW4gb2JqZWN0IHdpdGggdGVtcGxhdGUsIG5vcm1hbGl6ZSBwYXJhbWV0ZXJzXG4gICAgaWYgKHR5cGVvZiBnb2FsID09PSAnb2JqZWN0JyAmJiAndGVtcGxhdGUnIGluIGdvYWwgJiYgdHlwZW9mIGdvYWwudGVtcGxhdGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAvLyBJc3N1ZSAjNzI1OiBOb3JtYWxpemUgc25ha2VfY2FzZSBnb2FsIHN1Yi1maWVsZHMgYmVmb3JlIGFjY2Vzc2luZ1xuICAgICAgbm9ybWFsaXplR29hbEtleXMoZ29hbCBhcyB1bmtub3duIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KTtcblxuICAgICAgY29uc3QgdmFsaWRQYXJhbVR5cGVzID0gWydzdHJpbmcnLCAnbnVtYmVyJywgJ2Jvb2xlYW4nXSBhcyBjb25zdDtcbiAgICAgIGNvbnN0IHZhbGlkYXRlZFBhcmFtczogQWdlbnRHb2FsUGFyYW1ldGVyW10gPSAoZ29hbC5wYXJhbWV0ZXJzIHx8IFtdKS5tYXAoKHAsIGluZGV4KSA9PiB7XG4gICAgICAgIGNvbnN0IG5hbWUgPSB0eXBlb2YgcC5uYW1lID09PSAnc3RyaW5nJyA/IHAubmFtZSA6IGBwYXJhbV8ke2luZGV4fWA7XG4gICAgICAgIGNvbnN0IHR5cGUgPSB2YWxpZFBhcmFtVHlwZXMuaW5jbHVkZXMocC50eXBlIGFzIHR5cGVvZiB2YWxpZFBhcmFtVHlwZXNbbnVtYmVyXSlcbiAgICAgICAgICA/IHAudHlwZSBhcyAnc3RyaW5nJyB8ICdudW1iZXInIHwgJ2Jvb2xlYW4nXG4gICAgICAgICAgOiAnc3RyaW5nJztcbiAgICAgICAgY29uc3QgcmVxdWlyZWQgPSB0eXBlb2YgcC5yZXF1aXJlZCA9PT0gJ2Jvb2xlYW4nID8gcC5yZXF1aXJlZCA6IGZhbHNlO1xuXG4gICAgICAgIGNvbnN0IHZhbGlkYXRlZDogQWdlbnRHb2FsUGFyYW1ldGVyID0geyBuYW1lLCB0eXBlLCByZXF1aXJlZCB9O1xuICAgICAgICBpZiAodHlwZW9mIHAuZGVzY3JpcHRpb24gPT09ICdzdHJpbmcnICYmIHAuZGVzY3JpcHRpb24ubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHZhbGlkYXRlZC5kZXNjcmlwdGlvbiA9IHNhbml0aXplSW5wdXQocC5kZXNjcmlwdGlvbiwgNTAwKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocC5kZWZhdWx0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAvLyBTYW5pdGl6ZSBzdHJpbmcgZGVmYXVsdHMgdG8gcHJldmVudCBpbmplY3Rpb24gd2hlbiB1c2VkIGluIGdvYWwgcmVuZGVyaW5nXG4gICAgICAgICAgaWYgKHR5cGVvZiBwLmRlZmF1bHQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICB2YWxpZGF0ZWQuZGVmYXVsdCA9IHNhbml0aXplSW5wdXQocC5kZWZhdWx0LCA1MDApO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB2YWxpZGF0ZWQuZGVmYXVsdCA9IHAuZGVmYXVsdDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHZhbGlkYXRlZDtcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICB0ZW1wbGF0ZTogZ29hbC50ZW1wbGF0ZSxcbiAgICAgICAgcGFyYW1ldGVyczogdmFsaWRhdGVkUGFyYW1zLFxuICAgICAgICBzdWNjZXNzQ3JpdGVyaWE6IGdvYWwuc3VjY2Vzc0NyaXRlcmlhXG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vIE9iamVjdCB3aXRob3V0IHRlbXBsYXRlIC0gY2Fubm90IGNvbnZlcnRcbiAgICBsb2dnZXIud2FybignR29hbCBvYmplY3QgbWlzc2luZyB0ZW1wbGF0ZSBmaWVsZCwgY2Fubm90IGNvbnZlcnQgdG8gVjInLCB7IGdvYWwgfSk7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIHByaXZhdGUgcGFyc2VBZ2VudEZpbGUoY29udGVudDogc3RyaW5nKTogUGFyc2VkQWdlbnRGaWxlIHtcbiAgICAvLyBVc2UgU2VyaWFsaXphdGlvblNlcnZpY2UgZm9yIGZyb250bWF0dGVyIHBhcnNpbmdcbiAgICBjb25zdCByZXN1bHQgPSB0aGlzLnNlcmlhbGl6YXRpb25TZXJ2aWNlLnBhcnNlRnJvbnRtYXR0ZXIoY29udGVudCwge1xuICAgICAgbWF4WWFtbFNpemU6IE1BWF9ZQU1MX1NJWkUsXG4gICAgICB2YWxpZGF0ZUNvbnRlbnQ6IGZhbHNlLFxuICAgICAgc291cmNlOiAnQWdlbnRNYW5hZ2VyLnBhcnNlQWdlbnRGaWxlJ1xuICAgIH0pO1xuXG4gICAgLy8gU2VyaWFsaXphdGlvblNlcnZpY2UgZW5zdXJlcyBmcm9udG1hdHRlciBleGlzdHMsIG9yIHRocm93cyBlcnJvclxuICAgIHJldHVybiB7XG4gICAgICBtZXRhZGF0YTogcmVzdWx0LmRhdGEgYXMgQWdlbnRNZXRhZGF0YSxcbiAgICAgIGNvbnRlbnQ6IHJlc3VsdC5jb250ZW50LnRyaW0oKVxuICAgIH07XG4gIH1cblxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGZpbGVuYW1lIGZvciBhbiBhZ2VudCBlbGVtZW50LlxuICAgKlxuICAgKiBVc2VzIGluaGVyaXRlZCBub3JtYWxpemVGaWxlbmFtZSgpIGZyb20gQmFzZUVsZW1lbnRNYW5hZ2VyIGZvciBjb25zaXN0ZW50XG4gICAqIGZpbGVuYW1lIGZvcm1hdHRpbmcgYWNyb3NzIGFsbCBlbGVtZW50IG1hbmFnZXJzLlxuICAgKlxuICAgKiBFeGFtcGxlczpcbiAgICogICBcIkNyZWF0aXZlIFdyaXRlclwiIC0+IFwiY3JlYXRpdmUtd3JpdGVyLm1kXCJcbiAgICogICBcIkNSVURWLUFnZW50LURlbHRhXCIgLT4gXCJjcnVkdi1hZ2VudC1kZWx0YS5tZFwiXG4gICAqICAgXCJNdWx0aV9Hb2FsX0FnZW50XCIgLT4gXCJtdWx0aS1nb2FsLWFnZW50Lm1kXCJcbiAgICogICBcIkNhbWVsQ2FzZU5hbWVcIiAtPiBcImNhbWVsLWNhc2UtbmFtZS5tZFwiXG4gICAqL1xuICBwcml2YXRlIGdldEZpbGVuYW1lKG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgLy8gVXNlIGluaGVyaXRlZCBub3JtYWxpemVGaWxlbmFtZSgpIGZvciB1bmlmaWVkIG5vcm1hbGl6YXRpb25cbiAgICByZXR1cm4gdGhpcy5nZXRFbGVtZW50RmlsZW5hbWUobmFtZSk7XG4gIH1cblxuICBwcml2YXRlIHZhbGlkYXRlRWxlbWVudE5hbWUobmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIC9eW2EtekEtWjAtOV8tXSskLy50ZXN0KG5hbWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBjdXJyZW50IHVzZXIgZm9yIGF0dHJpYnV0aW9uXG4gICAqIFJFRkFDVE9SRUQ6IERlbGVnYXRlcyB0byBNZXRhZGF0YVNlcnZpY2UgZm9yIGNvbnNpc3RlbnQgdXNlciBhdHRyaWJ1dGlvbiBhY3Jvc3MgYWxsIG1hbmFnZXJzXG4gICAqL1xuICBwcml2YXRlIGdldEN1cnJlbnRVc2VyRm9yQXR0cmlidXRpb24oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5tZXRhZGF0YVNlcnZpY2UuZ2V0Q3VycmVudFVzZXIoKTtcbiAgfVxuXG4gIHByaXZhdGUgcHJlcGFyZVN0YXRlRm9yU2VyaWFsaXphdGlvbihzdGF0ZTogQWdlbnRTdGF0ZSk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgICByZXR1cm4ge1xuICAgICAgLi4uc3RhdGUsXG4gICAgICBsYXN0QWN0aXZlOiBzdGF0ZS5sYXN0QWN0aXZlIGluc3RhbmNlb2YgRGF0ZSA/IHN0YXRlLmxhc3RBY3RpdmUudG9JU09TdHJpbmcoKSA6IHN0YXRlLmxhc3RBY3RpdmUsXG4gICAgICBzZXNzaW9uQ291bnQ6IFN0cmluZyhzdGF0ZS5zZXNzaW9uQ291bnQgPz8gMCksXG4gICAgICBzdGF0ZVZlcnNpb246IHN0YXRlLnN0YXRlVmVyc2lvbiAhPT0gdW5kZWZpbmVkID8gU3RyaW5nKHN0YXRlLnN0YXRlVmVyc2lvbikgOiAnMScsICAvLyBJbmNsdWRlIHZlcnNpb24gZm9yIG9wdGltaXN0aWMgbG9ja2luZ1xuICAgICAgZ29hbHM6IHN0YXRlLmdvYWxzLm1hcChnb2FsID0+ICh7XG4gICAgICAgIC4uLmdvYWwsXG4gICAgICAgIGNyZWF0ZWRBdDogZ29hbC5jcmVhdGVkQXQgaW5zdGFuY2VvZiBEYXRlID8gZ29hbC5jcmVhdGVkQXQudG9JU09TdHJpbmcoKSA6IGdvYWwuY3JlYXRlZEF0LFxuICAgICAgICB1cGRhdGVkQXQ6IGdvYWwudXBkYXRlZEF0IGluc3RhbmNlb2YgRGF0ZSA/IGdvYWwudXBkYXRlZEF0LnRvSVNPU3RyaW5nKCkgOiBnb2FsLnVwZGF0ZWRBdCxcbiAgICAgICAgY29tcGxldGVkQXQ6IGdvYWwuY29tcGxldGVkQXQgaW5zdGFuY2VvZiBEYXRlID8gZ29hbC5jb21wbGV0ZWRBdC50b0lTT1N0cmluZygpIDogZ29hbC5jb21wbGV0ZWRBdCxcbiAgICAgICAgaW1wb3J0YW5jZTogZ29hbC5pbXBvcnRhbmNlICE9PSB1bmRlZmluZWQgPyBTdHJpbmcoZ29hbC5pbXBvcnRhbmNlKSA6IHVuZGVmaW5lZCxcbiAgICAgICAgdXJnZW5jeTogZ29hbC51cmdlbmN5ICE9PSB1bmRlZmluZWQgPyBTdHJpbmcoZ29hbC51cmdlbmN5KSA6IHVuZGVmaW5lZCxcbiAgICAgICAgZXN0aW1hdGVkRWZmb3J0OiBnb2FsLmVzdGltYXRlZEVmZm9ydCAhPT0gdW5kZWZpbmVkID8gU3RyaW5nKGdvYWwuZXN0aW1hdGVkRWZmb3J0KSA6IHVuZGVmaW5lZFxuICAgICAgfSkpLFxuICAgICAgZGVjaXNpb25zOiBzdGF0ZS5kZWNpc2lvbnMubWFwKGRlY2lzaW9uID0+ICh7XG4gICAgICAgIC4uLmRlY2lzaW9uLFxuICAgICAgICB0aW1lc3RhbXA6IGRlY2lzaW9uLnRpbWVzdGFtcCBpbnN0YW5jZW9mIERhdGUgPyBkZWNpc2lvbi50aW1lc3RhbXAudG9JU09TdHJpbmcoKSA6IGRlY2lzaW9uLnRpbWVzdGFtcCxcbiAgICAgICAgY29uZmlkZW5jZTogZGVjaXNpb24uY29uZmlkZW5jZSAhPT0gdW5kZWZpbmVkID8gU3RyaW5nKGRlY2lzaW9uLmNvbmZpZGVuY2UpIDogdW5kZWZpbmVkXG4gICAgICB9KSlcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBub3JtYWxpemVMb2FkZWRTdGF0ZShzdGF0ZTogQWdlbnRTdGF0ZSk6IHZvaWQge1xuICAgIC8vIEZJWCAoSXNzdWUgIzEyMyk6IERlZmF1bHQgbWlzc2luZyBhcnJheXMgdG8gcHJldmVudCBUeXBlRXJyb3JcbiAgICAvLyBJZiBzdGF0ZSBmaWxlIGlzIG1pc3NpbmcgZ29hbHMvZGVjaXNpb25zL2NvbnRleHQsIGRlZmF1bHQgdG8gZW1wdHkgYXJyYXlzL29iamVjdHNcbiAgICBpZiAoIXN0YXRlLmdvYWxzKSB7XG4gICAgICBzdGF0ZS5nb2FscyA9IFtdO1xuICAgIH1cbiAgICBpZiAoIXN0YXRlLmRlY2lzaW9ucykge1xuICAgICAgc3RhdGUuZGVjaXNpb25zID0gW107XG4gICAgfVxuICAgIGlmICghc3RhdGUuY29udGV4dCkge1xuICAgICAgc3RhdGUuY29udGV4dCA9IHt9O1xuICAgIH1cblxuICAgIGlmIChzdGF0ZS5zZXNzaW9uQ291bnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgc3RhdGUuc2Vzc2lvbkNvdW50ID0gTnVtYmVyLnBhcnNlSW50KFN0cmluZyhzdGF0ZS5zZXNzaW9uQ291bnQpLCAxMCk7XG4gICAgfVxuXG4gICAgLy8gUGFyc2Ugc3RhdGVWZXJzaW9uIGZvciBvcHRpbWlzdGljIGxvY2tpbmcgKElzc3VlICMyNClcbiAgICBpZiAoc3RhdGUuc3RhdGVWZXJzaW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHN0YXRlLnN0YXRlVmVyc2lvbiA9IE51bWJlci5wYXJzZUludChTdHJpbmcoc3RhdGUuc3RhdGVWZXJzaW9uKSwgMTApO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBEZWZhdWx0IHRvIHZlcnNpb24gMSBpZiBub3QgcHJlc2VudCAoZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkpXG4gICAgICBzdGF0ZS5zdGF0ZVZlcnNpb24gPSAxO1xuICAgIH1cblxuICAgIGlmIChzdGF0ZS5sYXN0QWN0aXZlKSB7XG4gICAgICBzdGF0ZS5sYXN0QWN0aXZlID0gbmV3IERhdGUoc3RhdGUubGFzdEFjdGl2ZSk7XG4gICAgfVxuXG4gICAgaWYgKHN0YXRlLmdvYWxzKSB7XG4gICAgICBzdGF0ZS5nb2Fscy5mb3JFYWNoKGdvYWwgPT4ge1xuICAgICAgICBpZiAoZ29hbC5pbXBvcnRhbmNlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBnb2FsLmltcG9ydGFuY2UgPSBOdW1iZXIucGFyc2VJbnQoU3RyaW5nKGdvYWwuaW1wb3J0YW5jZSksIDEwKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZ29hbC51cmdlbmN5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBnb2FsLnVyZ2VuY3kgPSBOdW1iZXIucGFyc2VJbnQoU3RyaW5nKGdvYWwudXJnZW5jeSksIDEwKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZ29hbC5lc3RpbWF0ZWRFZmZvcnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGdvYWwuZXN0aW1hdGVkRWZmb3J0ID0gTnVtYmVyLnBhcnNlRmxvYXQoU3RyaW5nKGdvYWwuZXN0aW1hdGVkRWZmb3J0KSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGdvYWwuY3JlYXRlZEF0KSB7XG4gICAgICAgICAgZ29hbC5jcmVhdGVkQXQgPSBuZXcgRGF0ZShnb2FsLmNyZWF0ZWRBdCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGdvYWwudXBkYXRlZEF0KSB7XG4gICAgICAgICAgZ29hbC51cGRhdGVkQXQgPSBuZXcgRGF0ZShnb2FsLnVwZGF0ZWRBdCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGdvYWwuY29tcGxldGVkQXQpIHtcbiAgICAgICAgICBnb2FsLmNvbXBsZXRlZEF0ID0gbmV3IERhdGUoZ29hbC5jb21wbGV0ZWRBdCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChzdGF0ZS5kZWNpc2lvbnMpIHtcbiAgICAgIHN0YXRlLmRlY2lzaW9ucy5mb3JFYWNoKGRlY2lzaW9uID0+IHtcbiAgICAgICAgaWYgKGRlY2lzaW9uLmNvbmZpZGVuY2UgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGRlY2lzaW9uLmNvbmZpZGVuY2UgPSBOdW1iZXIucGFyc2VGbG9hdChTdHJpbmcoZGVjaXNpb24uY29uZmlkZW5jZSkpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkZWNpc2lvbi50aW1lc3RhbXApIHtcbiAgICAgICAgICBkZWNpc2lvbi50aW1lc3RhbXAgPSBuZXcgRGF0ZShkZWNpc2lvbi50aW1lc3RhbXApO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVjb3JkIGEgc3RlcCBpbiBhZ2VudCBleGVjdXRpb25cbiAgICogV3JhcHMgQWdlbnQucmVjb3JkRGVjaXNpb24oKSBmb3IgdGhlIE1DUCB0b29sIGludGVyZmFjZVxuICAgKlxuICAgKiBAc2luY2UgdjIuMC4wIC0gQWdlbnRpYyBMb29wIFJlZGVzaWduXG4gICAqL1xuICBhc3luYyByZWNvcmRBZ2VudFN0ZXAocGFyYW1zOiB7XG4gICAgYWdlbnROYW1lOiBzdHJpbmc7XG4gICAgc3RlcERlc2NyaXB0aW9uOiBzdHJpbmc7XG4gICAgb3V0Y29tZTogXCJzdWNjZXNzXCIgfCBcImZhaWx1cmVcIiB8IFwicGFydGlhbFwiO1xuICAgIC8qKiBPcHRpb25hbCBmaW5kaW5ncyBvciByZXN1bHRzIGZyb20gdGhpcyBzdGVwICovXG4gICAgZmluZGluZ3M/OiBzdHJpbmc7XG4gICAgY29uZmlkZW5jZT86IG51bWJlcjtcbiAgICAvKiogT3B0aW9uYWwgaGludCBhYm91dCB3aGF0IHRoZSBMTE0gcGxhbnMgdG8gZG8gbmV4dCAoZm9yIHByb2FjdGl2ZSByaXNrIGV2YWx1YXRpb24pICovXG4gICAgbmV4dEFjdGlvbkhpbnQ/OiBzdHJpbmc7XG4gICAgLyoqIE9wdGlvbmFsIHJpc2sgc2NvcmUgZm9yIHRoZSBjdXJyZW50IHN0ZXAgKDAtMTAwKSAqL1xuICAgIHJpc2tTY29yZT86IG51bWJlcjtcbiAgICAvKiogUnVudGltZSBvdmVycmlkZSBmb3IgbWF4QXV0b25vbW91c1N0ZXBzIChJc3N1ZSAjNDQ3KSAqL1xuICAgIG1heFN0ZXBzT3ZlcnJpZGU/OiBudW1iZXI7XG4gIH0pOiBQcm9taXNlPHtcbiAgICBzdWNjZXNzOiBib29sZWFuO1xuICAgIG1lc3NhZ2U6IHN0cmluZztcbiAgICBkZWNpc2lvbjoge1xuICAgICAgaWQ6IHN0cmluZztcbiAgICAgIGdvYWxJZDogc3RyaW5nO1xuICAgICAgdGltZXN0YW1wOiBzdHJpbmc7XG4gICAgICBkZWNpc2lvbjogc3RyaW5nO1xuICAgICAgcmVhc29uaW5nOiBzdHJpbmc7XG4gICAgICBmcmFtZXdvcms6IHN0cmluZztcbiAgICAgIGNvbmZpZGVuY2U6IG51bWJlcjtcbiAgICAgIG91dGNvbWU6IFwic3VjY2Vzc1wiIHwgXCJmYWlsdXJlXCIgfCBcInBhcnRpYWxcIjtcbiAgICB9O1xuICAgIHN0YXRlOiB7XG4gICAgICBnb2FsQ291bnQ6IG51bWJlcjtcbiAgICAgIGRlY2lzaW9uQ291bnQ6IG51bWJlcjtcbiAgICAgIGxhc3RBY3RpdmU6IHN0cmluZztcbiAgICAgIHN0YXRlVmVyc2lvbjogbnVtYmVyO1xuICAgIH07XG4gICAgLyoqIEF1dG9ub215IGRpcmVjdGl2ZSBpbmRpY2F0aW5nIHdoZXRoZXIgdG8gY29udGludWUgb3IgcGF1c2UgKi9cbiAgICBhdXRvbm9teTogQXV0b25vbXlEaXJlY3RpdmU7XG4gIH0+IHtcbiAgICAvLyAxLiBMb2FkIGFnZW50IGJ5IG5hbWVcbiAgICBjb25zdCBhZ2VudCA9IGF3YWl0IHRoaXMucmVhZChwYXJhbXMuYWdlbnROYW1lKTtcbiAgICBpZiAoIWFnZW50KSB7XG4gICAgICAvLyBGSVg6IElzc3VlICMyNzUgLSBUaHJvdyBFbGVtZW50Tm90Rm91bmRFcnJvciBmb3IgY29uc2lzdGVudCBlcnJvciBoYW5kbGluZ1xuICAgICAgdGhyb3cgbmV3IEVsZW1lbnROb3RGb3VuZEVycm9yKCdBZ2VudCcsIHBhcmFtcy5hZ2VudE5hbWUpO1xuICAgIH1cblxuICAgIC8vIDIuIEdldCBhZ2VudCBzdGF0ZSB0byBmaW5kIGFjdGl2ZSBnb2Fsc1xuICAgIGNvbnN0IHN0YXRlID0gYWdlbnQuZ2V0U3RhdGUoKTtcbiAgICBjb25zdCBhY3RpdmVHb2FsID0gc3RhdGUuZ29hbHMuZmluZChnID0+IGcuc3RhdHVzID09PSAnaW5fcHJvZ3Jlc3MnKTtcblxuICAgIGlmICghYWN0aXZlR29hbCkge1xuICAgICAgY29uc3QgZ29hbFN0YXR1c2VzID0gc3RhdGUuZ29hbHMubWFwKGcgPT4gYCR7Zy5pZH06ICR7Zy5zdGF0dXN9YCkuam9pbignLCAnKTtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYE5vIGFjdGl2ZSBnb2FsIGZvdW5kIGZvciBhZ2VudCAnJHtwYXJhbXMuYWdlbnROYW1lfScuIGAgK1xuICAgICAgICBgQXZhaWxhYmxlIGdvYWxzOiAke2dvYWxTdGF0dXNlcyB8fCAnbm9uZSd9LiBgICtcbiAgICAgICAgYFVzZSBleGVjdXRlX2FnZW50IHRvIHN0YXJ0IGEgbmV3IGdvYWwgZmlyc3QuYFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyAzLiBDYWxsIEFnZW50LnJlY29yZERlY2lzaW9uKCkgdG8gcGVyc2lzdCB0aGUgc3RlcFxuICAgIGNvbnN0IGRlY2lzaW9uID0gYWdlbnQucmVjb3JkRGVjaXNpb24oe1xuICAgICAgZ29hbElkOiBhY3RpdmVHb2FsLmlkLFxuICAgICAgZGVjaXNpb246IHBhcmFtcy5zdGVwRGVzY3JpcHRpb24sXG4gICAgICByZWFzb25pbmc6IHBhcmFtcy5maW5kaW5ncyA/PyAnJyxcbiAgICAgIGNvbmZpZGVuY2U6IHBhcmFtcy5jb25maWRlbmNlID8/IDAuOCxcbiAgICAgIG91dGNvbWU6IHBhcmFtcy5vdXRjb21lXG4gICAgfSk7XG5cbiAgICAvLyA0LiBTYXZlIGFnZW50IHN0YXRlXG4gICAgY29uc3Qgc2FuaXRpemVkTmFtZSA9IHNhbml0aXplSW5wdXQocGFyYW1zLmFnZW50TmFtZSwgMTAwKTtcbiAgICBhd2FpdCB0aGlzLnNhdmUoYWdlbnQsIHRoaXMuZ2V0RmlsZW5hbWUoc2FuaXRpemVkTmFtZSkpO1xuXG4gICAgLy8gNS4gR2V0IHVwZGF0ZWQgc3RhdGUgZm9yIHN0ZXAgY291bnQgYW5kIGF1dG9ub215IGV2YWx1YXRpb25cbiAgICBjb25zdCB1cGRhdGVkU3RhdGUgPSBhZ2VudC5nZXRTdGF0ZSgpO1xuXG4gICAgLy8gNi4gQ2FsY3VsYXRlIHN0ZXAgY291bnQgZm9yIHRoaXMgZ29hbFxuICAgIC8vIHN0ZXBDb3VudCA9IG51bWJlciBvZiBzdGVwcyBjb21wbGV0ZWQgKGluY2x1ZGluZyB0aGUgb25lIGp1c3QgcmVjb3JkZWQpXG4gICAgLy8gVGhlIGV2YWx1YXRvciB1c2VzIHRoaXMgdG8gY2hlY2sgaWYgd2UndmUgaGl0IG1heEF1dG9ub21vdXNTdGVwc1xuICAgIC8vIGFuZCB0byBjb21wdXRlIHN0ZXBzUmVtYWluaW5nIGZvciB0aGUgYXV0b25vbXkgZGlyZWN0aXZlLlxuICAgIGNvbnN0IGdvYWxEZWNpc2lvbnMgPSB1cGRhdGVkU3RhdGUuZGVjaXNpb25zLmZpbHRlcihkID0+IGQuZ29hbElkID09PSBhY3RpdmVHb2FsLmlkKTtcbiAgICBjb25zdCBzdGVwQ291bnQgPSBnb2FsRGVjaXNpb25zLmxlbmd0aDtcblxuICAgIC8vIDcuIEdldCBhZ2VudCBtZXRhZGF0YSBmb3IgYXV0b25vbXkgY29uZmlnXG4gICAgY29uc3QgYWdlbnRNZXRhZGF0YSA9IGFnZW50Lm1ldGFkYXRhIGFzIEFnZW50TWV0YWRhdGFWMjtcblxuICAgIC8vIDguIEV2YWx1YXRlIGF1dG9ub215IC0gc2hvdWxkIHdlIGNvbnRpbnVlIG9yIHBhdXNlP1xuICAgIC8vIElzc3VlICM0MDI6IFBhc3MgREktaW5qZWN0ZWQgRGFuZ2VyWm9uZUVuZm9yY2VyIHZpYSBjb250ZXh0XG4gICAgLy8gSXNzdWUgIzQ0NzogQXBwbHkgcnVudGltZSBtYXhBdXRvbm9tb3VzU3RlcHMgb3ZlcnJpZGUgaWYgcHJvdmlkZWRcbiAgICBjb25zdCBhdXRvbm9teUNvbmZpZyA9IHBhcmFtcy5tYXhTdGVwc092ZXJyaWRlICE9PSB1bmRlZmluZWRcbiAgICAgID8geyAuLi5hZ2VudE1ldGFkYXRhLmF1dG9ub215LCBtYXhBdXRvbm9tb3VzU3RlcHM6IHBhcmFtcy5tYXhTdGVwc092ZXJyaWRlIH1cbiAgICAgIDogYWdlbnRNZXRhZGF0YS5hdXRvbm9teTtcblxuICAgIGNvbnN0IGF1dG9ub215RGlyZWN0aXZlID0gZXZhbHVhdGVBdXRvbm9teSh7XG4gICAgICBhZ2VudE5hbWU6IHBhcmFtcy5hZ2VudE5hbWUsXG4gICAgICBhdXRvbm9teUNvbmZpZyxcbiAgICAgIHN0ZXBDb3VudCxcbiAgICAgIGN1cnJlbnRTdGVwRGVzY3JpcHRpb246IHBhcmFtcy5zdGVwRGVzY3JpcHRpb24sXG4gICAgICBjdXJyZW50U3RlcE91dGNvbWU6IHBhcmFtcy5vdXRjb21lLFxuICAgICAgbmV4dEFjdGlvbkhpbnQ6IHBhcmFtcy5uZXh0QWN0aW9uSGludCxcbiAgICAgIHJpc2tTY29yZTogcGFyYW1zLnJpc2tTY29yZSxcbiAgICAgIGRhbmdlclpvbmVFbmZvcmNlcjogQWdlbnRNYW5hZ2VyLmRhbmdlclpvbmVFbmZvcmNlclJlc29sdmVyPy4oKSxcbiAgICAgIHZlcmlmaWNhdGlvblN0b3JlOiBBZ2VudE1hbmFnZXIudmVyaWZpY2F0aW9uU3RvcmVSZXNvbHZlcj8uKCksXG4gICAgICBnb2FsRGVzY3JpcHRpb246IGFjdGl2ZUdvYWwuZGVzY3JpcHRpb24sXG4gICAgICBnb2FsSWQ6IGFjdGl2ZUdvYWwuaWQsXG4gICAgfSk7XG5cbiAgICAvLyA5LiBSZXR1cm4gZGVjaXNpb24sIHN0YXRlIHN1bW1hcnksIGFuZCBhdXRvbm9teSBkaXJlY3RpdmVcbiAgICByZXR1cm4ge1xuICAgICAgc3VjY2VzczogdHJ1ZSxcbiAgICAgIG1lc3NhZ2U6IGBTdGVwIHJlY29yZGVkIGZvciBhZ2VudCAnJHtwYXJhbXMuYWdlbnROYW1lfSdgLFxuICAgICAgZGVjaXNpb246IHtcbiAgICAgICAgaWQ6IGRlY2lzaW9uLmlkLFxuICAgICAgICBnb2FsSWQ6IGRlY2lzaW9uLmdvYWxJZCxcbiAgICAgICAgdGltZXN0YW1wOiBkZWNpc2lvbi50aW1lc3RhbXAudG9JU09TdHJpbmcoKSxcbiAgICAgICAgZGVjaXNpb246IGRlY2lzaW9uLmRlY2lzaW9uLFxuICAgICAgICByZWFzb25pbmc6IGRlY2lzaW9uLnJlYXNvbmluZyxcbiAgICAgICAgZnJhbWV3b3JrOiBkZWNpc2lvbi5mcmFtZXdvcmssXG4gICAgICAgIGNvbmZpZGVuY2U6IGRlY2lzaW9uLmNvbmZpZGVuY2UsXG4gICAgICAgIG91dGNvbWU6IHBhcmFtcy5vdXRjb21lXG4gICAgICB9LFxuICAgICAgc3RhdGU6IHtcbiAgICAgICAgZ29hbENvdW50OiB1cGRhdGVkU3RhdGUuZ29hbHMubGVuZ3RoLFxuICAgICAgICBkZWNpc2lvbkNvdW50OiB1cGRhdGVkU3RhdGUuZGVjaXNpb25zLmxlbmd0aCxcbiAgICAgICAgbGFzdEFjdGl2ZTogdXBkYXRlZFN0YXRlLmxhc3RBY3RpdmUudG9JU09TdHJpbmcoKSxcbiAgICAgICAgc3RhdGVWZXJzaW9uOiB1cGRhdGVkU3RhdGUuc3RhdGVWZXJzaW9uIHx8IDFcbiAgICAgIH0sXG4gICAgICBhdXRvbm9teTogYXV0b25vbXlEaXJlY3RpdmVcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENvbXBsZXRlIGFuIGFnZW50IGdvYWxcbiAgICogV3JhcHMgQWdlbnQuY29tcGxldGVHb2FsKCkgZm9yIHRoZSBNQ1AgdG9vbCBpbnRlcmZhY2VcbiAgICpcbiAgICogQHNpbmNlIHYyLjAuMCAtIEFnZW50aWMgTG9vcCBSZWRlc2lnblxuICAgKi9cbiAgYXN5bmMgY29tcGxldGVBZ2VudEdvYWwocGFyYW1zOiB7XG4gICAgYWdlbnROYW1lOiBzdHJpbmc7XG4gICAgZ29hbElkPzogc3RyaW5nO1xuICAgIG91dGNvbWU6IFwic3VjY2Vzc1wiIHwgXCJmYWlsdXJlXCIgfCBcInBhcnRpYWxcIjtcbiAgICBzdW1tYXJ5OiBzdHJpbmc7XG4gIH0pOiBQcm9taXNlPHtcbiAgICBzdWNjZXNzOiBib29sZWFuO1xuICAgIG1lc3NhZ2U6IHN0cmluZztcbiAgICBnb2FsOiB7XG4gICAgICBpZDogc3RyaW5nO1xuICAgICAgZGVzY3JpcHRpb246IHN0cmluZztcbiAgICAgIHN0YXR1czogXCJjb21wbGV0ZWRcIiB8IFwiZmFpbGVkXCI7XG4gICAgICBjcmVhdGVkQXQ6IHN0cmluZztcbiAgICAgIGNvbXBsZXRlZEF0OiBzdHJpbmc7XG4gICAgICBlc3RpbWF0ZWRFZmZvcnQ/OiBudW1iZXI7XG4gICAgICBhY3R1YWxFZmZvcnQ/OiBudW1iZXI7XG4gICAgfTtcbiAgICBtZXRyaWNzOiB7XG4gICAgICBzdWNjZXNzUmF0ZTogbnVtYmVyO1xuICAgICAgZ29hbHNDb21wbGV0ZWQ6IG51bWJlcjtcbiAgICAgIGdvYWxzSW5Qcm9ncmVzczogbnVtYmVyO1xuICAgICAgZGVjaXNpb25BY2N1cmFjeTogbnVtYmVyO1xuICAgICAgYXZlcmFnZUNvbXBsZXRpb25UaW1lOiBudW1iZXI7XG4gICAgfTtcbiAgICBzdGF0ZToge1xuICAgICAgZ29hbENvdW50OiBudW1iZXI7XG4gICAgICBkZWNpc2lvbkNvdW50OiBudW1iZXI7XG4gICAgICBsYXN0QWN0aXZlOiBzdHJpbmc7XG4gICAgICBzdGF0ZVZlcnNpb246IG51bWJlcjtcbiAgICB9O1xuICB9PiB7XG4gICAgLy8gMS4gTG9hZCBhZ2VudCBieSBuYW1lXG4gICAgY29uc3QgYWdlbnQgPSBhd2FpdCB0aGlzLnJlYWQocGFyYW1zLmFnZW50TmFtZSk7XG4gICAgaWYgKCFhZ2VudCkge1xuICAgICAgLy8gRklYOiBJc3N1ZSAjMjc1IC0gVGhyb3cgRWxlbWVudE5vdEZvdW5kRXJyb3IgZm9yIGNvbnNpc3RlbnQgZXJyb3IgaGFuZGxpbmdcbiAgICAgIHRocm93IG5ldyBFbGVtZW50Tm90Rm91bmRFcnJvcignQWdlbnQnLCBwYXJhbXMuYWdlbnROYW1lKTtcbiAgICB9XG5cbiAgICAvLyAyLiBGaW5kIGdvYWwgdG8gY29tcGxldGVcbiAgICBjb25zdCBzdGF0ZSA9IGFnZW50LmdldFN0YXRlKCk7XG4gICAgbGV0IGdvYWw6IEFnZW50R29hbCB8IHVuZGVmaW5lZDtcblxuICAgIGlmIChwYXJhbXMuZ29hbElkKSB7XG4gICAgICBnb2FsID0gc3RhdGUuZ29hbHMuZmluZChnID0+IGcuaWQgPT09IHBhcmFtcy5nb2FsSWQpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBGaW5kIG1vc3QgcmVjZW50IGluLXByb2dyZXNzIGdvYWxcbiAgICAgIGdvYWwgPSBzdGF0ZS5nb2Fsc1xuICAgICAgICAuZmlsdGVyKGcgPT4gZy5zdGF0dXMgPT09ICdpbl9wcm9ncmVzcycpXG4gICAgICAgIC5zb3J0KChhLCBiKSA9PiBiLmNyZWF0ZWRBdC5nZXRUaW1lKCkgLSBhLmNyZWF0ZWRBdC5nZXRUaW1lKCkpWzBdO1xuICAgIH1cblxuICAgIGlmICghZ29hbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBwYXJhbXMuZ29hbElkXG4gICAgICAgICAgPyBgR29hbCAnJHtwYXJhbXMuZ29hbElkfScgbm90IGZvdW5kYFxuICAgICAgICAgIDogYE5vIGluLXByb2dyZXNzIGdvYWwgZm91bmQgZm9yIGFnZW50ICcke3BhcmFtcy5hZ2VudE5hbWV9J2BcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gMy4gUmVjb3JkIGZpbmFsIGRlY2lzaW9uIHdpdGggc3VtbWFyeVxuICAgIGFnZW50LnJlY29yZERlY2lzaW9uKHtcbiAgICAgIGdvYWxJZDogZ29hbC5pZCxcbiAgICAgIGRlY2lzaW9uOiAnZ29hbF9jb21wbGV0ZScsXG4gICAgICByZWFzb25pbmc6IHBhcmFtcy5zdW1tYXJ5LFxuICAgICAgY29uZmlkZW5jZTogMS4wLFxuICAgICAgb3V0Y29tZTogcGFyYW1zLm91dGNvbWVcbiAgICB9KTtcblxuICAgIC8vIDQuIENhbGwgQWdlbnQuY29tcGxldGVHb2FsKClcbiAgICBhZ2VudC5jb21wbGV0ZUdvYWwoZ29hbC5pZCwgcGFyYW1zLm91dGNvbWUpO1xuXG4gICAgLy8gNS4gR2V0IHBlcmZvcm1hbmNlIG1ldHJpY3NcbiAgICBjb25zdCBtZXRyaWNzID0gYWdlbnQuZ2V0UGVyZm9ybWFuY2VNZXRyaWNzKCk7XG5cbiAgICAvLyA2LiBTYXZlIGFnZW50IHN0YXRlXG4gICAgY29uc3QgY29tcGxldGVTYW5pdGl6ZWROYW1lID0gc2FuaXRpemVJbnB1dChwYXJhbXMuYWdlbnROYW1lLCAxMDApO1xuICAgIGF3YWl0IHRoaXMuc2F2ZShhZ2VudCwgdGhpcy5nZXRGaWxlbmFtZShjb21wbGV0ZVNhbml0aXplZE5hbWUpKTtcblxuICAgIC8vIDcuIFJldHVybiBnb2FsLCBtZXRyaWNzLCBhbmQgc3RhdGVcbiAgICBjb25zdCB1cGRhdGVkU3RhdGUgPSBhZ2VudC5nZXRTdGF0ZSgpO1xuICAgIGNvbnN0IGNvbXBsZXRlZEdvYWwgPSB1cGRhdGVkU3RhdGUuZ29hbHMuZmluZChnID0+IGcuaWQgPT09IGdvYWwuaWQpITtcblxuICAgIHJldHVybiB7XG4gICAgICBzdWNjZXNzOiB0cnVlLFxuICAgICAgbWVzc2FnZTogYEdvYWwgY29tcGxldGVkIGZvciBhZ2VudCAnJHtwYXJhbXMuYWdlbnROYW1lfScgd2l0aCBvdXRjb21lOiAke3BhcmFtcy5vdXRjb21lfWAsXG4gICAgICBnb2FsOiB7XG4gICAgICAgIGlkOiBjb21wbGV0ZWRHb2FsLmlkLFxuICAgICAgICBkZXNjcmlwdGlvbjogY29tcGxldGVkR29hbC5kZXNjcmlwdGlvbixcbiAgICAgICAgc3RhdHVzOiBjb21wbGV0ZWRHb2FsLnN0YXR1cyBhcyBcImNvbXBsZXRlZFwiIHwgXCJmYWlsZWRcIixcbiAgICAgICAgY3JlYXRlZEF0OiBjb21wbGV0ZWRHb2FsLmNyZWF0ZWRBdC50b0lTT1N0cmluZygpLFxuICAgICAgICBjb21wbGV0ZWRBdDogY29tcGxldGVkR29hbC5jb21wbGV0ZWRBdCEudG9JU09TdHJpbmcoKSxcbiAgICAgICAgZXN0aW1hdGVkRWZmb3J0OiBjb21wbGV0ZWRHb2FsLmVzdGltYXRlZEVmZm9ydCxcbiAgICAgICAgYWN0dWFsRWZmb3J0OiBjb21wbGV0ZWRHb2FsLmFjdHVhbEVmZm9ydFxuICAgICAgfSxcbiAgICAgIG1ldHJpY3M6IHtcbiAgICAgICAgc3VjY2Vzc1JhdGU6IG1ldHJpY3Muc3VjY2Vzc1JhdGUsXG4gICAgICAgIGdvYWxzQ29tcGxldGVkOiBtZXRyaWNzLmdvYWxzQ29tcGxldGVkLFxuICAgICAgICBnb2Fsc0luUHJvZ3Jlc3M6IG1ldHJpY3MuZ29hbHNJblByb2dyZXNzLFxuICAgICAgICBkZWNpc2lvbkFjY3VyYWN5OiBtZXRyaWNzLmRlY2lzaW9uQWNjdXJhY3ksXG4gICAgICAgIGF2ZXJhZ2VDb21wbGV0aW9uVGltZTogbWV0cmljcy5hdmVyYWdlQ29tcGxldGlvblRpbWVcbiAgICAgIH0sXG4gICAgICBzdGF0ZToge1xuICAgICAgICBnb2FsQ291bnQ6IHVwZGF0ZWRTdGF0ZS5nb2Fscy5sZW5ndGgsXG4gICAgICAgIGRlY2lzaW9uQ291bnQ6IHVwZGF0ZWRTdGF0ZS5kZWNpc2lvbnMubGVuZ3RoLFxuICAgICAgICBsYXN0QWN0aXZlOiB1cGRhdGVkU3RhdGUubGFzdEFjdGl2ZS50b0lTT1N0cmluZygpLFxuICAgICAgICBzdGF0ZVZlcnNpb246IHVwZGF0ZWRTdGF0ZS5zdGF0ZVZlcnNpb24gfHwgMVxuICAgICAgfVxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogR2V0IGFnZW50IHN0YXRlXG4gICAqIFdyYXBzIEFnZW50LmdldFN0YXRlKCkgZm9yIHRoZSBNQ1AgdG9vbCBpbnRlcmZhY2VcbiAgICpcbiAgICogQHNpbmNlIHYyLjAuMCAtIEFnZW50aWMgTG9vcCBSZWRlc2lnblxuICAgKi9cbiAgYXN5bmMgZ2V0QWdlbnRTdGF0ZShwYXJhbXM6IHtcbiAgICBhZ2VudE5hbWU6IHN0cmluZztcbiAgICBpbmNsdWRlRGVjaXNpb25IaXN0b3J5PzogYm9vbGVhbjtcbiAgICBpbmNsdWRlQ29udGV4dD86IGJvb2xlYW47XG4gIH0pOiBQcm9taXNlPHtcbiAgICBzdWNjZXNzOiBib29sZWFuO1xuICAgIGFnZW50TmFtZTogc3RyaW5nO1xuICAgIHN0YXRlOiB7XG4gICAgICBnb2FsczogQXJyYXk8e1xuICAgICAgICBpZDogc3RyaW5nO1xuICAgICAgICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICAgICAgICBwcmlvcml0eTogc3RyaW5nO1xuICAgICAgICBzdGF0dXM6IHN0cmluZztcbiAgICAgICAgaW1wb3J0YW5jZTogbnVtYmVyO1xuICAgICAgICB1cmdlbmN5OiBudW1iZXI7XG4gICAgICAgIGVpc2VuaG93ZXJRdWFkcmFudD86IHN0cmluZztcbiAgICAgICAgY3JlYXRlZEF0OiBzdHJpbmc7XG4gICAgICAgIHVwZGF0ZWRBdDogc3RyaW5nO1xuICAgICAgICBjb21wbGV0ZWRBdD86IHN0cmluZztcbiAgICAgICAgZGVwZW5kZW5jaWVzPzogc3RyaW5nW107XG4gICAgICAgIHJpc2tMZXZlbD86IHN0cmluZztcbiAgICAgICAgZXN0aW1hdGVkRWZmb3J0PzogbnVtYmVyO1xuICAgICAgICBhY3R1YWxFZmZvcnQ/OiBudW1iZXI7XG4gICAgICAgIG5vdGVzPzogc3RyaW5nO1xuICAgICAgfT47XG4gICAgICBkZWNpc2lvbnM6IEFycmF5PHtcbiAgICAgICAgaWQ6IHN0cmluZztcbiAgICAgICAgZ29hbElkOiBzdHJpbmc7XG4gICAgICAgIHRpbWVzdGFtcDogc3RyaW5nO1xuICAgICAgICBkZWNpc2lvbjogc3RyaW5nO1xuICAgICAgICByZWFzb25pbmc6IHN0cmluZztcbiAgICAgICAgZnJhbWV3b3JrOiBzdHJpbmc7XG4gICAgICAgIGNvbmZpZGVuY2U6IG51bWJlcjtcbiAgICAgICAgb3V0Y29tZT86IHN0cmluZztcbiAgICAgIH0+O1xuICAgICAgY29udGV4dD86IFJlY29yZDxzdHJpbmcsIGFueT47XG4gICAgICBjb250ZXh0U3VtbWFyeToge1xuICAgICAgICBrZXlzOiBzdHJpbmdbXTtcbiAgICAgICAgc2l6ZTogbnVtYmVyO1xuICAgICAgfTtcbiAgICAgIGxhc3RBY3RpdmU6IHN0cmluZztcbiAgICAgIHNlc3Npb25Db3VudDogbnVtYmVyO1xuICAgICAgc3RhdGVWZXJzaW9uOiBudW1iZXI7XG4gICAgfTtcbiAgICBtZXRyaWNzOiB7XG4gICAgICBzdWNjZXNzUmF0ZTogbnVtYmVyO1xuICAgICAgZ29hbHNDb21wbGV0ZWQ6IG51bWJlcjtcbiAgICAgIGdvYWxzSW5Qcm9ncmVzczogbnVtYmVyO1xuICAgICAgZGVjaXNpb25BY2N1cmFjeTogbnVtYmVyO1xuICAgICAgYXZlcmFnZUNvbXBsZXRpb25UaW1lOiBudW1iZXI7XG4gICAgfTtcbiAgfT4ge1xuICAgIC8vIDEuIExvYWQgYWdlbnQgYnkgbmFtZVxuICAgIGNvbnN0IGFnZW50ID0gYXdhaXQgdGhpcy5yZWFkKHBhcmFtcy5hZ2VudE5hbWUpO1xuICAgIGlmICghYWdlbnQpIHtcbiAgICAgIC8vIEZJWDogSXNzdWUgIzI3NSAtIFRocm93IEVsZW1lbnROb3RGb3VuZEVycm9yIGZvciBjb25zaXN0ZW50IGVycm9yIGhhbmRsaW5nXG4gICAgICB0aHJvdyBuZXcgRWxlbWVudE5vdEZvdW5kRXJyb3IoJ0FnZW50JywgcGFyYW1zLmFnZW50TmFtZSk7XG4gICAgfVxuXG4gICAgLy8gMi4gR2V0IGFnZW50IHN0YXRlXG4gICAgY29uc3Qgc3RhdGUgPSBhZ2VudC5nZXRTdGF0ZSgpO1xuXG4gICAgLy8gMy4gR2V0IHBlcmZvcm1hbmNlIG1ldHJpY3NcbiAgICBjb25zdCBtZXRyaWNzID0gYWdlbnQuZ2V0UGVyZm9ybWFuY2VNZXRyaWNzKCk7XG5cbiAgICAvLyA0LiBGaWx0ZXIgZGVjaXNpb25zIGJhc2VkIG9uIGluY2x1ZGVEZWNpc2lvbkhpc3RvcnlcbiAgICBjb25zdCBkZWNpc2lvbnMgPSBwYXJhbXMuaW5jbHVkZURlY2lzaW9uSGlzdG9yeVxuICAgICAgPyBzdGF0ZS5kZWNpc2lvbnNcbiAgICAgIDogc3RhdGUuZGVjaXNpb25zLnNsaWNlKC0xMCk7IC8vIExhc3QgMTAgZGVjaXNpb25zXG5cbiAgICAvLyA1LiBCdWlsZCBjb250ZXh0IHN1bW1hcnlcbiAgICBjb25zdCBjb250ZXh0S2V5cyA9IE9iamVjdC5rZXlzKHN0YXRlLmNvbnRleHQpO1xuICAgIGNvbnN0IGNvbnRleHRTaXplID0gSlNPTi5zdHJpbmdpZnkoc3RhdGUuY29udGV4dCkubGVuZ3RoO1xuXG4gICAgLy8gNi4gUmV0dXJuIHN0YXRlIGFuZCBtZXRyaWNzXG4gICAgcmV0dXJuIHtcbiAgICAgIHN1Y2Nlc3M6IHRydWUsXG4gICAgICBhZ2VudE5hbWU6IHBhcmFtcy5hZ2VudE5hbWUsXG4gICAgICBzdGF0ZToge1xuICAgICAgICBnb2Fsczogc3RhdGUuZ29hbHMubWFwKGcgPT4gKHtcbiAgICAgICAgICBpZDogZy5pZCxcbiAgICAgICAgICBkZXNjcmlwdGlvbjogZy5kZXNjcmlwdGlvbixcbiAgICAgICAgICBwcmlvcml0eTogZy5wcmlvcml0eSxcbiAgICAgICAgICBzdGF0dXM6IGcuc3RhdHVzLFxuICAgICAgICAgIGltcG9ydGFuY2U6IGcuaW1wb3J0YW5jZSxcbiAgICAgICAgICB1cmdlbmN5OiBnLnVyZ2VuY3ksXG4gICAgICAgICAgZWlzZW5ob3dlclF1YWRyYW50OiBnLmVpc2VuaG93ZXJRdWFkcmFudCxcbiAgICAgICAgICBjcmVhdGVkQXQ6IGcuY3JlYXRlZEF0LnRvSVNPU3RyaW5nKCksXG4gICAgICAgICAgdXBkYXRlZEF0OiBnLnVwZGF0ZWRBdC50b0lTT1N0cmluZygpLFxuICAgICAgICAgIGNvbXBsZXRlZEF0OiBnLmNvbXBsZXRlZEF0Py50b0lTT1N0cmluZygpLFxuICAgICAgICAgIGRlcGVuZGVuY2llczogZy5kZXBlbmRlbmNpZXMsXG4gICAgICAgICAgcmlza0xldmVsOiBnLnJpc2tMZXZlbCxcbiAgICAgICAgICBlc3RpbWF0ZWRFZmZvcnQ6IGcuZXN0aW1hdGVkRWZmb3J0LFxuICAgICAgICAgIGFjdHVhbEVmZm9ydDogZy5hY3R1YWxFZmZvcnQsXG4gICAgICAgICAgbm90ZXM6IGcubm90ZXNcbiAgICAgICAgfSkpLFxuICAgICAgICBkZWNpc2lvbnM6IGRlY2lzaW9ucy5tYXAoZCA9PiAoe1xuICAgICAgICAgIGlkOiBkLmlkLFxuICAgICAgICAgIGdvYWxJZDogZC5nb2FsSWQsXG4gICAgICAgICAgdGltZXN0YW1wOiBkLnRpbWVzdGFtcC50b0lTT1N0cmluZygpLFxuICAgICAgICAgIGRlY2lzaW9uOiBkLmRlY2lzaW9uLFxuICAgICAgICAgIHJlYXNvbmluZzogZC5yZWFzb25pbmcsXG4gICAgICAgICAgZnJhbWV3b3JrOiBkLmZyYW1ld29yayxcbiAgICAgICAgICBjb25maWRlbmNlOiBkLmNvbmZpZGVuY2UsXG4gICAgICAgICAgb3V0Y29tZTogZC5vdXRjb21lXG4gICAgICAgIH0pKSxcbiAgICAgICAgY29udGV4dDogcGFyYW1zLmluY2x1ZGVDb250ZXh0ID8gc3RhdGUuY29udGV4dCA6IHVuZGVmaW5lZCxcbiAgICAgICAgY29udGV4dFN1bW1hcnk6IHtcbiAgICAgICAgICBrZXlzOiBjb250ZXh0S2V5cyxcbiAgICAgICAgICBzaXplOiBjb250ZXh0U2l6ZVxuICAgICAgICB9LFxuICAgICAgICBsYXN0QWN0aXZlOiBzdGF0ZS5sYXN0QWN0aXZlLnRvSVNPU3RyaW5nKCksXG4gICAgICAgIHNlc3Npb25Db3VudDogc3RhdGUuc2Vzc2lvbkNvdW50LFxuICAgICAgICBzdGF0ZVZlcnNpb246IHN0YXRlLnN0YXRlVmVyc2lvbiB8fCAxXG4gICAgICB9LFxuICAgICAgbWV0cmljczoge1xuICAgICAgICBzdWNjZXNzUmF0ZTogbWV0cmljcy5zdWNjZXNzUmF0ZSxcbiAgICAgICAgZ29hbHNDb21wbGV0ZWQ6IG1ldHJpY3MuZ29hbHNDb21wbGV0ZWQsXG4gICAgICAgIGdvYWxzSW5Qcm9ncmVzczogbWV0cmljcy5nb2Fsc0luUHJvZ3Jlc3MsXG4gICAgICAgIGRlY2lzaW9uQWNjdXJhY3k6IG1ldHJpY3MuZGVjaXNpb25BY2N1cmFjeSxcbiAgICAgICAgYXZlcmFnZUNvbXBsZXRpb25UaW1lOiBtZXRyaWNzLmF2ZXJhZ2VDb21wbGV0aW9uVGltZVxuICAgICAgfVxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogR2V0IGdhdGhlcmVkIGRhdGEgZm9yIGEgc3BlY2lmaWMgZ29hbCBleGVjdXRpb24uXG4gICAqXG4gICAqIEFnZ3JlZ2F0ZXMgZGVjaXNpb24gaGlzdG9yeSwgZ29hbCBzdGF0ZSwgYW5kIHN1bW1hcnkgc3RhdGlzdGljc1xuICAgKiBpbnRvIGEgc3RydWN0dXJlZCBHYXRoZXJlZERhdGEgb2JqZWN0LiBUaGlzIGlzIGEgcmVhZC1zaWRlIHZpZXdcbiAgICogb3ZlciBleGlzdGluZyBhZ2VudCBzdGF0ZSBkYXRhLlxuICAgKlxuICAgKiBJc3N1ZSAjNjg6IEdhdGhlcmVkRGF0YUVudHJ5IGZvciBzdGF0ZSByZWNvcmRpbmdcbiAgICogQHNpbmNlIHYyLjAuMCAtIEFnZW50aWMgTG9vcCBDb21wbGV0aW9uIChFcGljICMzODApXG4gICAqL1xuICBhc3luYyBnZXRHYXRoZXJlZERhdGEocGFyYW1zOiB7XG4gICAgYWdlbnROYW1lOiBzdHJpbmc7XG4gICAgZ29hbElkOiBzdHJpbmc7XG4gIH0pOiBQcm9taXNlPEdhdGhlcmVkRGF0YT4ge1xuICAgIGNvbnN0IGFnZW50ID0gYXdhaXQgdGhpcy5yZWFkKHBhcmFtcy5hZ2VudE5hbWUpO1xuICAgIGlmICghYWdlbnQpIHtcbiAgICAgIHRocm93IG5ldyBFbGVtZW50Tm90Rm91bmRFcnJvcignQWdlbnQnLCBwYXJhbXMuYWdlbnROYW1lKTtcbiAgICB9XG5cbiAgICBjb25zdCBzdGF0ZSA9IGFnZW50LmdldFN0YXRlKCk7XG4gICAgY29uc3QgZ2F0aGVyZWQgPSBnZXRHYXRoZXJlZERhdGEocGFyYW1zLmFnZW50TmFtZSwgcGFyYW1zLmdvYWxJZCwgc3RhdGUpO1xuXG4gICAgaWYgKCFnYXRoZXJlZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgR29hbCAnJHtwYXJhbXMuZ29hbElkfScgbm90IGZvdW5kIGZvciBhZ2VudCAnJHtwYXJhbXMuYWdlbnROYW1lfScuIGAgK1xuICAgICAgICBgQXZhaWxhYmxlIGdvYWxzOiAke3N0YXRlLmdvYWxzLm1hcChnID0+IGcuaWQpLmpvaW4oJywgJykgfHwgJ25vbmUnfWBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGdhdGhlcmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnRpbnVlIGFnZW50IGV4ZWN1dGlvbiBmcm9tIHByZXZpb3VzIHN0YXRlXG4gICAqIENvbWJpbmVzIGV4ZWN1dGVBZ2VudCB3aXRoIHN0YXRlIGNvbnRleHRcbiAgICpcbiAgICogQHNpbmNlIHYyLjAuMCAtIEFnZW50aWMgTG9vcCBSZWRlc2lnblxuICAgKi9cbiAgYXN5bmMgY29udGludWVBZ2VudEV4ZWN1dGlvbihwYXJhbXM6IHtcbiAgICBhZ2VudE5hbWU6IHN0cmluZztcbiAgICBwYXJhbWV0ZXJzPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgcHJldmlvdXNTdGVwUmVzdWx0Pzogc3RyaW5nO1xuICB9KTogUHJvbWlzZTxFeGVjdXRlQWdlbnRSZXN1bHQgJiB7XG4gICAgcHJldmlvdXNTdGF0ZToge1xuICAgICAgZ29hbHM6IEFycmF5PHtcbiAgICAgICAgaWQ6IHN0cmluZztcbiAgICAgICAgZGVzY3JpcHRpb246IHN0cmluZztcbiAgICAgICAgc3RhdHVzOiBzdHJpbmc7XG4gICAgICAgIHByb2dyZXNzPzogbnVtYmVyO1xuICAgICAgfT47XG4gICAgICByZWNlbnREZWNpc2lvbnM6IEFycmF5PHtcbiAgICAgICAgZGVjaXNpb246IHN0cmluZztcbiAgICAgICAgcmVhc29uaW5nOiBzdHJpbmc7XG4gICAgICAgIG91dGNvbWU/OiBzdHJpbmc7XG4gICAgICAgIHRpbWVzdGFtcDogc3RyaW5nO1xuICAgICAgfT47XG4gICAgICBzZXNzaW9uQ291bnQ6IG51bWJlcjtcbiAgICAgIGxhc3RBY3RpdmU6IHN0cmluZztcbiAgICAgIHN0YXRlVmVyc2lvbjogbnVtYmVyO1xuICAgIH07XG4gICAgY29udGludWF0aW9uOiB7XG4gICAgICBpc1Jlc3VtaW5nOiBib29sZWFuO1xuICAgICAgcHJldmlvdXNTdGVwUmVzdWx0Pzogc3RyaW5nO1xuICAgICAgc3VnZ2VzdGVkTmV4dFN0ZXBzPzogc3RyaW5nW107XG4gICAgfTtcbiAgfT4ge1xuICAgIC8vIDEuIExvYWQgYWdlbnQgYnkgbmFtZVxuICAgIGNvbnN0IGFnZW50ID0gYXdhaXQgdGhpcy5yZWFkKHBhcmFtcy5hZ2VudE5hbWUpO1xuICAgIGlmICghYWdlbnQpIHtcbiAgICAgIC8vIEZJWDogSXNzdWUgIzI3NSAtIFRocm93IEVsZW1lbnROb3RGb3VuZEVycm9yIGZvciBjb25zaXN0ZW50IGVycm9yIGhhbmRsaW5nXG4gICAgICB0aHJvdyBuZXcgRWxlbWVudE5vdEZvdW5kRXJyb3IoJ0FnZW50JywgcGFyYW1zLmFnZW50TmFtZSk7XG4gICAgfVxuXG4gICAgLy8gMi4gR2V0IGN1cnJlbnQgc3RhdGVcbiAgICBjb25zdCBzdGF0ZSA9IGFnZW50LmdldFN0YXRlKCk7XG5cbiAgICAvLyAzLiBDaGVjayBpZiBhZ2VudCBoYXMgYmVlbiBleGVjdXRlZCBiZWZvcmVcbiAgICBjb25zdCBpc1Jlc3VtaW5nID0gc3RhdGUuc2Vzc2lvbkNvdW50ID4gMCB8fCBzdGF0ZS5kZWNpc2lvbnMubGVuZ3RoID4gMDtcblxuICAgIC8vIDQuIEV4ZWN1dGUgYWdlbnQgbm9ybWFsbHkgKHRoaXMgYWN0aXZhdGVzIGVsZW1lbnRzIGFuZCBnZXRzIGNvbnRleHQpXG4gICAgY29uc3QgZXhlY3V0aW9uUGFyYW1zID0gcGFyYW1zLnBhcmFtZXRlcnMgfHwge307XG5cbiAgICBjb25zdCBleGVjdXRpb25SZXN1bHQgPSBhd2FpdCB0aGlzLmV4ZWN1dGVBZ2VudChcbiAgICAgIHBhcmFtcy5hZ2VudE5hbWUsXG4gICAgICBleGVjdXRpb25QYXJhbXNcbiAgICApO1xuXG4gICAgLy8gNS4gQnVpbGQgcHJldmlvdXMgc3RhdGUgc3VtbWFyeVxuICAgIGNvbnN0IHJlY2VudERlY2lzaW9ucyA9IHN0YXRlLmRlY2lzaW9ucy5zbGljZSgtNSkubWFwKGQgPT4gKHtcbiAgICAgIGRlY2lzaW9uOiBkLmRlY2lzaW9uLFxuICAgICAgcmVhc29uaW5nOiBkLnJlYXNvbmluZyxcbiAgICAgIG91dGNvbWU6IGQub3V0Y29tZSxcbiAgICAgIHRpbWVzdGFtcDogZC50aW1lc3RhbXAudG9JU09TdHJpbmcoKVxuICAgIH0pKTtcblxuICAgIGNvbnN0IGdvYWxTdW1tYXJ5ID0gc3RhdGUuZ29hbHMubWFwKGcgPT4gKHtcbiAgICAgIGlkOiBnLmlkLFxuICAgICAgZGVzY3JpcHRpb246IGcuZGVzY3JpcHRpb24sXG4gICAgICBzdGF0dXM6IGcuc3RhdHVzLFxuICAgICAgcHJvZ3Jlc3M6IHVuZGVmaW5lZCAvLyBDb3VsZCBhZGQgcHJvZ3Jlc3MgdHJhY2tpbmcgaW4gZnV0dXJlXG4gICAgfSkpO1xuXG4gICAgLy8gNi4gR2VuZXJhdGUgc3VnZ2VzdGVkIG5leHQgc3RlcHMgYmFzZWQgb24gc3RhdGVcbiAgICBjb25zdCBzdWdnZXN0ZWROZXh0U3RlcHMgPSB0aGlzLmdlbmVyYXRlTmV4dFN0ZXBzKHN0YXRlKTtcblxuICAgIC8vIDcuIE1lcmdlIGV4ZWN1dGlvbiByZXN1bHQgd2l0aCBjb250aW51YXRpb24gY29udGV4dFxuICAgIHJldHVybiB7XG4gICAgICAvLyBJbmNsdWRlIGFsbCBmaWVsZHMgZnJvbSBleGVjdXRlX2FnZW50IHJlc3VsdFxuICAgICAgLi4uZXhlY3V0aW9uUmVzdWx0LFxuXG4gICAgICAvLyBBZGQgcHJldmlvdXMgc3RhdGUgaW5mb3JtYXRpb25cbiAgICAgIHByZXZpb3VzU3RhdGU6IHtcbiAgICAgICAgZ29hbHM6IGdvYWxTdW1tYXJ5LFxuICAgICAgICByZWNlbnREZWNpc2lvbnMsXG4gICAgICAgIHNlc3Npb25Db3VudDogc3RhdGUuc2Vzc2lvbkNvdW50LFxuICAgICAgICBsYXN0QWN0aXZlOiBzdGF0ZS5sYXN0QWN0aXZlLnRvSVNPU3RyaW5nKCksXG4gICAgICAgIHN0YXRlVmVyc2lvbjogc3RhdGUuc3RhdGVWZXJzaW9uIHx8IDFcbiAgICAgIH0sXG5cbiAgICAgIC8vIEFkZCBjb250aW51YXRpb24gY29udGV4dFxuICAgICAgY29udGludWF0aW9uOiB7XG4gICAgICAgIGlzUmVzdW1pbmcsXG4gICAgICAgIHByZXZpb3VzU3RlcFJlc3VsdDogcGFyYW1zLnByZXZpb3VzU3RlcFJlc3VsdCxcbiAgICAgICAgc3VnZ2VzdGVkTmV4dFN0ZXBzXG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZW5lcmF0ZSBzdWdnZXN0ZWQgbmV4dCBzdGVwcyBiYXNlZCBvbiBjdXJyZW50IHN0YXRlXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIGdlbmVyYXRlTmV4dFN0ZXBzKHN0YXRlOiBBZ2VudFN0YXRlKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IHN1Z2dlc3Rpb25zOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgLy8gQ2hlY2sgZm9yIHBlbmRpbmcgZ29hbHNcbiAgICBjb25zdCBwZW5kaW5nR29hbHMgPSBzdGF0ZS5nb2Fscy5maWx0ZXIoZyA9PiBnLnN0YXR1cyA9PT0gJ3BlbmRpbmcnKTtcbiAgICBpZiAocGVuZGluZ0dvYWxzLmxlbmd0aCA+IDApIHtcbiAgICAgIHN1Z2dlc3Rpb25zLnB1c2goYFN0YXJ0IHdvcmsgb24gJHtwZW5kaW5nR29hbHMubGVuZ3RofSBwZW5kaW5nIGdvYWwocylgKTtcbiAgICB9XG5cbiAgICAvLyBDaGVjayBmb3IgaW4tcHJvZ3Jlc3MgZ29hbHNcbiAgICBjb25zdCBpblByb2dyZXNzR29hbHMgPSBzdGF0ZS5nb2Fscy5maWx0ZXIoZyA9PiBnLnN0YXR1cyA9PT0gJ2luX3Byb2dyZXNzJyk7XG4gICAgaWYgKGluUHJvZ3Jlc3NHb2Fscy5sZW5ndGggPiAwKSB7XG4gICAgICBzdWdnZXN0aW9ucy5wdXNoKGBDb250aW51ZSAke2luUHJvZ3Jlc3NHb2Fscy5sZW5ndGh9IGluLXByb2dyZXNzIGdvYWwocylgKTtcbiAgICB9XG5cbiAgICAvLyBDaGVjayBmb3IgYmxvY2tlZCBnb2FscyAoZGVwZW5kZW5jaWVzKVxuICAgIGNvbnN0IGJsb2NrZWRHb2FscyA9IHN0YXRlLmdvYWxzLmZpbHRlcihnID0+XG4gICAgICBnLmRlcGVuZGVuY2llcyAmJiBnLmRlcGVuZGVuY2llcy5sZW5ndGggPiAwICYmIGcuc3RhdHVzID09PSAncGVuZGluZydcbiAgICApO1xuICAgIGlmIChibG9ja2VkR29hbHMubGVuZ3RoID4gMCkge1xuICAgICAgc3VnZ2VzdGlvbnMucHVzaChgUmVzb2x2ZSBkZXBlbmRlbmNpZXMgZm9yICR7YmxvY2tlZEdvYWxzLmxlbmd0aH0gYmxvY2tlZCBnb2FsKHMpYCk7XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgZGVjaXNpb24gaGlzdG9yeSBmb3IgZmFpbHVyZXNcbiAgICBjb25zdCByZWNlbnRGYWlsdXJlcyA9IHN0YXRlLmRlY2lzaW9uc1xuICAgICAgLnNsaWNlKC0xMClcbiAgICAgIC5maWx0ZXIoZCA9PiBkLm91dGNvbWUgPT09ICdmYWlsdXJlJyk7XG4gICAgaWYgKHJlY2VudEZhaWx1cmVzLmxlbmd0aCA+IDApIHtcbiAgICAgIHN1Z2dlc3Rpb25zLnB1c2goYFJldmlldyBhbmQgYWRkcmVzcyAke3JlY2VudEZhaWx1cmVzLmxlbmd0aH0gcmVjZW50IGZhaWx1cmUocylgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gc3VnZ2VzdGlvbnM7XG4gIH1cbn1cbiJdfQ==
|