@dollhousemcp/mcp-server 1.7.4 → 1.8.1
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 +118 -0
- package/README.github.md +90 -1
- package/README.md +1 -1
- package/README.md.backup +90 -1
- package/README.npm.md +1 -1
- package/dist/collection/CollectionBrowser.js +2 -2
- package/dist/collection/CollectionSearch.js +3 -3
- package/dist/collection/PersonaDetails.js +2 -2
- package/dist/config/ConfigManager.d.ts +20 -0
- package/dist/config/ConfigManager.d.ts.map +1 -1
- package/dist/config/ConfigManager.js +48 -4
- package/dist/generated/version.d.ts +2 -2
- package/dist/generated/version.js +3 -3
- package/dist/handlers/ConfigHandler.d.ts +30 -0
- package/dist/handlers/ConfigHandler.d.ts.map +1 -1
- package/dist/handlers/ConfigHandler.js +149 -21
- package/dist/index.d.ts +4 -6
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +73 -52
- package/dist/portfolio/GitHubPortfolioIndexer.d.ts.map +1 -1
- package/dist/portfolio/GitHubPortfolioIndexer.js +8 -5
- package/dist/portfolio/PortfolioIndexManager.d.ts +1 -1
- package/dist/portfolio/PortfolioIndexManager.js +2 -2
- package/dist/portfolio/PortfolioRepoManager.d.ts +16 -2
- package/dist/portfolio/PortfolioRepoManager.d.ts.map +1 -1
- package/dist/portfolio/PortfolioRepoManager.js +95 -18
- package/dist/portfolio/PortfolioSyncManager.d.ts.map +1 -1
- package/dist/portfolio/PortfolioSyncManager.js +23 -15
- package/dist/security/audit/config/suppressions.d.ts.map +1 -1
- package/dist/security/audit/config/suppressions.js +11 -1
- package/dist/server/ServerSetup.d.ts.map +1 -1
- package/dist/server/ServerSetup.js +11 -6
- package/dist/server/tools/CollectionTools.js +6 -6
- package/dist/server/tools/ConfigTools.js +2 -2
- package/dist/server/tools/ConfigToolsV2.js +5 -5
- package/dist/server/tools/PortfolioTools.d.ts.map +1 -1
- package/dist/server/tools/PortfolioTools.js +16 -5
- package/dist/server/types.d.ts +2 -0
- package/dist/server/types.d.ts.map +1 -1
- package/dist/server/types.js +1 -1
- package/dist/tools/portfolio/submitToPortfolioTool.d.ts.map +1 -1
- package/dist/tools/portfolio/submitToPortfolioTool.js +6 -5
- package/package.json +7 -6
|
@@ -10,6 +10,7 @@
|
|
|
10
10
|
import { createHash } from 'crypto';
|
|
11
11
|
import { GitHubAuthManager } from '../../auth/GitHubAuthManager.js';
|
|
12
12
|
import { PortfolioRepoManager } from '../../portfolio/PortfolioRepoManager.js';
|
|
13
|
+
import { getPortfolioRepositoryName } from '../../config/portfolioConfig.js';
|
|
13
14
|
import { TokenManager } from '../../security/tokenManager.js';
|
|
14
15
|
import { ContentValidator } from '../../security/contentValidator.js';
|
|
15
16
|
import { PortfolioManager } from '../../portfolio/PortfolioManager.js';
|
|
@@ -56,7 +57,7 @@ export class SubmitToPortfolioTool {
|
|
|
56
57
|
// Previously: constructor(apiCache: any)
|
|
57
58
|
// Now: constructor(apiCache: APICache) with proper import
|
|
58
59
|
this.authManager = new GitHubAuthManager(apiCache);
|
|
59
|
-
this.portfolioManager = new PortfolioRepoManager();
|
|
60
|
+
this.portfolioManager = new PortfolioRepoManager(getPortfolioRepositoryName());
|
|
60
61
|
}
|
|
61
62
|
/**
|
|
62
63
|
* Validates and normalizes input parameters to prevent Unicode attacks and ensure data safety
|
|
@@ -176,7 +177,7 @@ export class SubmitToPortfolioTool {
|
|
|
176
177
|
if ((originalName || safeName).includes('.')) {
|
|
177
178
|
message += ` • "${(originalName || safeName).replace(/\./g, '')}" (no dots)\n`;
|
|
178
179
|
}
|
|
179
|
-
message += `3. 🎯 Specify element type: \`
|
|
180
|
+
message += `3. 🎯 Specify element type: \`submit_collection_content "${originalName || safeName}" --type=personas\`\n`;
|
|
180
181
|
message += `4. 📁 Check if file exists in portfolio directories\n\n`;
|
|
181
182
|
message += `📝 **Tip**: The system searches filenames AND metadata names with fuzzy matching.`;
|
|
182
183
|
return {
|
|
@@ -1048,7 +1049,7 @@ export class SubmitToPortfolioTool {
|
|
|
1048
1049
|
async submitElementAndHandleResponse(safeName, elementType, metadata, content, authStatus, localPath // Local file path for collection submission
|
|
1049
1050
|
) {
|
|
1050
1051
|
// DUPLICATE DETECTION: Check if content already exists in portfolio
|
|
1051
|
-
const repoFullName = `${authStatus.username}
|
|
1052
|
+
const repoFullName = `${authStatus.username}/${this.portfolioManager.getRepositoryName()}`;
|
|
1052
1053
|
const filePath = `${elementType}/${safeName}.md`;
|
|
1053
1054
|
// Prepare the full content that would be saved
|
|
1054
1055
|
const fullContent = `---\n${JSON.stringify(metadata, null, 2)}\n---\n\n${content}`;
|
|
@@ -1497,7 +1498,7 @@ ${elementContent}
|
|
|
1497
1498
|
- [ ] No duplicate of existing collection content
|
|
1498
1499
|
|
|
1499
1500
|
---
|
|
1500
|
-
*This submission was created automatically via the DollhouseMCP
|
|
1501
|
+
*This submission was created automatically via the DollhouseMCP submit_collection_content tool (v1.6.9-beta1-collection-fix).*`;
|
|
1501
1502
|
// Determine labels based on element type
|
|
1502
1503
|
const labels = [
|
|
1503
1504
|
'element-submission', // CRITICAL: Triggers automation workflow
|
|
@@ -2055,4 +2056,4 @@ ${elementContent}
|
|
|
2055
2056
|
return false;
|
|
2056
2057
|
}
|
|
2057
2058
|
}
|
|
2058
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3VibWl0VG9Qb3J0Zm9saW9Ub29sLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3Rvb2xzL3BvcnRmb2xpby9zdWJtaXRUb1BvcnRmb2xpb1Rvb2wudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7O0dBUUc7QUFFSCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sUUFBUSxDQUFDO0FBQ3BDLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ3BFLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLHlDQUF5QyxDQUFDO0FBQy9FLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUM5RCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUN0RSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUN2RSxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSwwQ0FBMEMsQ0FBQztBQUNqRixPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDdkQsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQy9DLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLCtDQUErQyxDQUFDO0FBQ2pGLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUVwRSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUN2RSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUNyRSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDM0QsT0FBTyxFQUNMLGdCQUFnQixFQUNoQixZQUFZLEVBQ1osYUFBYSxFQUViLG1CQUFtQixFQUNuQixtQkFBbUIsRUFDcEIsTUFBTSxxQ0FBcUMsQ0FBQztBQUM3QyxPQUFPLEVBQUUsaUJBQWlC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Y2VzQ29udGVudCI6WyIvKipcbiAqIFRvb2wgZm9yIHN1Ym1pdHRpbmcgY29udGVudCB0byBHaXRIdWIgcG9ydGZvbGlvIHJlcG9zaXRvcmllc1xuICogUmVwbGFjZXMgdGhlIGJyb2tlbiBpc3N1ZS1iYXNlZCBzdWJtaXNzaW9uIHdpdGggZGlyZWN0IHJlcG9zaXRvcnkgc2F2ZXNcbiAqIFxuICogRklYRVMgSU1QTEVNRU5URUQgKFBSICM1MDMpOlxuICogMS4gVFlQRSBTQUZFVFkgRklYICMxIChJc3N1ZSAjNDk3KTogQ2hhbmdlZCBhcGlDYWNoZSBmcm9tICdhbnknIHRvIHByb3BlciBBUElDYWNoZSB0eXBlXG4gKiAyLiBUWVBFIFNBRkVUWSBGSVggIzIgKElzc3VlICM0OTcpOiBSZXBsYWNlZCBjb21wbGV4IHR5cGUgY2FzdGluZyB3aXRoIFBvcnRmb2xpb0VsZW1lbnRBZGFwdGVyXG4gKiAzLiBQRVJGT1JNQU5DRSAoUFIgIzQ5NiByZWNvbW1lbmRhdGlvbik6IFVzaW5nIEZpbGVEaXNjb3ZlcnlVdGlsIGZvciBvcHRpbWl6ZWQgZmlsZSBzZWFyY2hcbiAqL1xuXG5pbXBvcnQgeyBjcmVhdGVIYXNoIH0gZnJvbSAnY3J5cHRvJztcbmltcG9ydCB7IEdpdEh1YkF1dGhNYW5hZ2VyIH0gZnJvbSAnLi4vLi4vYXV0aC9HaXRIdWJBdXRoTWFuYWdlci5qcyc7XG5pbXBvcnQgeyBQb3J0Zm9saW9SZXBvTWFuYWdlciB9IGZyb20gJy4uLy4uL3BvcnRmb2xpby9Qb3J0Zm9saW9SZXBvTWFuYWdlci5qcyc7XG5pbXBvcnQgeyBUb2tlbk1hbmFnZXIgfSBmcm9tICcuLi8uLi9zZWN1cml0eS90b2tlbk1hbmFnZXIuanMnO1xuaW1wb3J0IHsgQ29udGVudFZhbGlkYXRvciB9IGZyb20gJy4uLy4uL3NlY3VyaXR5L2NvbnRlbnRWYWxpZGF0b3IuanMnO1xuaW1wb3J0IHsgUG9ydGZvbGlvTWFuYWdlciB9IGZyb20gJy4uLy4uL3BvcnRmb2xpby9Qb3J0Zm9saW9NYW5hZ2VyLmpzJztcbmltcG9ydCB7IFBvcnRmb2xpb0luZGV4TWFuYWdlciB9IGZyb20gJy4uLy4uL3BvcnRmb2xpby9Qb3J0Zm9saW9JbmRleE1hbmFnZXIuanMnO1xuaW1wb3J0IHsgRWxlbWVudFR5cGUgfSBmcm9tICcuLi8uLi9wb3J0Zm9saW8vdHlwZXMuanMnO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vLi4vdXRpbHMvbG9nZ2VyLmpzJztcbmltcG9ydCB7IFVuaWNvZGVWYWxpZGF0b3IgfSBmcm9tICcuLi8uLi9zZWN1cml0eS92YWxpZGF0b3JzL3VuaWNvZGVWYWxpZGF0b3IuanMnO1xuaW1wb3J0IHsgU2VjdXJpdHlNb25pdG9yIH0gZnJvbSAnLi4vLi4vc2VjdXJpdHkvc2VjdXJpdHlNb25pdG9yLmpzJztcbmltcG9ydCB7IEFQSUNhY2hlIH0gZnJvbSAnLi4vLi4vY2FjaGUvQVBJQ2FjaGUuanMnO1xuaW1wb3J0IHsgUG9ydGZvbGlvRWxlbWVudEFkYXB0ZXIgfSBmcm9tICcuL1BvcnRmb2xpb0VsZW1lbnRBZGFwdGVyLmpzJztcbmltcG9ydCB7IEZpbGVEaXNjb3ZlcnlVdGlsIH0gZnJvbSAnLi4vLi4vdXRpbHMvRmlsZURpc2NvdmVyeVV0aWwuanMnO1xuaW1wb3J0IHsgRXJyb3JIYW5kbGVyIH0gZnJvbSAnLi4vLi4vdXRpbHMvRXJyb3JIYW5kbGVyLmpzJztcbmltcG9ydCB7IFxuICBGSUxFX1NJWkVfTElNSVRTLCBcbiAgUkVUUllfQ09ORklHLCBcbiAgU0VBUkNIX0NPTkZJRyxcbiAgUG9ydGZvbGlvRWxlbWVudE1ldGFkYXRhLFxuICBnZXRWYWxpZGF0ZWRUaW1lb3V0LFxuICBjYWxjdWxhdGVSZXRyeURlbGF5XG59IGZyb20gJy4uLy4uL2NvbmZpZy9wb3J0Zm9saW8tY29uc3RhbnRzLmpzJztcbmltcG9ydCB7IGdpdGh1YlJhdGVMaW1pdGVyIH0gZnJvbSAnLi4vLi4vdXRpbHMvR2l0SHViUmF0ZUxpbWl0ZXIuanMnO1xuaW1wb3J0IHsgRWFybHlUZXJtaW5hdGlvblNlYXJjaCB9IGZyb20gJy4uLy4uL3V0aWxzL0Vhcmx5VGVybWluYXRpb25TZWFyY2guanMnO1xuaW1wb3J0IHsgQ29sbGVjdGlvbkVycm9yQ29kZSwgZm9ybWF0Q29sbGVjdGlvbkVycm9yIH0gZnJvbSAnLi4vLi4vY29uZmlnL2Vycm9yLWNvZGVzLmpzJztcbmltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgKiBhcyBmcyBmcm9tICdmcy9wcm9taXNlcyc7XG5pbXBvcnQgeyBTZWN1cmVZYW1sUGFyc2VyIH0gZnJvbSAnLi4vLi4vc2VjdXJpdHkvc2VjdXJlWWFtbFBhcnNlci5qcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3VibWl0VG9Qb3J0Zm9saW9QYXJhbXMge1xuICBuYW1lOiBzdHJpbmc7XG4gIHR5cGU/OiBFbGVtZW50VHlwZTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQb3J0Zm9saW9FbGVtZW50IHtcbiAgdHlwZTogRWxlbWVudFR5cGU7XG4gIG1ldGFkYXRhOiBQb3J0Zm9saW9FbGVtZW50TWV0YWRhdGE7XG4gIGNvbnRlbnQ6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTdWJtaXRUb1BvcnRmb2xpb1Jlc3VsdCB7XG4gIHN1Y2Nlc3M6IGJvb2xlYW47XG4gIG1lc3NhZ2U6IHN0cmluZztcbiAgdXJsPzogc3RyaW5nO1xuICBlcnJvcj86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBFbGVtZW50RGV0ZWN0aW9uTWF0Y2gge1xuICB0eXBlOiBFbGVtZW50VHlwZTtcbiAgcGF0aDogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEVsZW1lbnREZXRlY3Rpb25SZXN1bHQge1xuICBmb3VuZDogYm9vbGVhbjtcbiAgbWF0Y2hlczogRWxlbWVudERldGVjdGlvbk1hdGNoW107XG59XG5cbi8vIFdvcmtmbG93IHN0ZXAgY29uc3RhbnRzIGZvciBjb25zaXN0ZW50IGxvZ2dpbmdcbmNvbnN0IFdPUktGTE9XX1NURVBTID0ge1xuICBWQUxJREFUSU9OOiAxLFxuICBBVVRIRU5USUNBVElPTjogMixcbiAgQ09OVEVOVF9ESVNDT1ZFUlk6IDMsXG4gIFNFQ1VSSVRZOiA0LFxuICBNRVRBREFUQTogNSxcbiAgUkVQT19TRVRVUDogNixcbiAgU1VCTUlTU0lPTjogNyxcbiAgUkVQT1JUSU5HOiA4LFxuICBUT1RBTDogOFxufSBhcyBjb25zdDtcblxuLy8gTG9nZ2luZyBjb25maWd1cmF0aW9uXG5jb25zdCBMT0dHSU5HX0NPTkZJRyA9IHtcbiAgLy8gU2V0IERPTExIT1VTRV9WRVJCT1NFX0xPR0dJTkc9dHJ1ZSBmb3IgZGV0YWlsZWQgc3RlcC1ieS1zdGVwIGxvZ3NcbiAgaXNWZXJib3NlOiBwcm9jZXNzLmVudi5ET0xMSE9VU0VfVkVSQk9TRV9MT0dHSU5HPy50b0xvd2VyQ2FzZSgpID09PSAndHJ1ZScsXG4gIC8vIFNldCBET0xMSE9VU0VfTE9HX1RJTUlORz10cnVlIGZvciB0aW1pbmcgbWVhc3VyZW1lbnRzXG4gIHNob3VsZExvZ1RpbWluZzogcHJvY2Vzcy5lbnYuRE9MTEhPVVNFX0xPR19USU1JTkc/LnRvTG93ZXJDYXNlKCkgPT09ICd0cnVlJyB8fCBcbiAgICAgICAgICAgICAgICAgICBwcm9jZXNzLmVudi5ET0xMSE9VU0VfVkVSQk9TRV9MT0dHSU5HPy50b0xvd2VyQ2FzZSgpID09PSAndHJ1ZSdcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCBjbGFzcyBTdWJtaXRUb1BvcnRmb2xpb1Rvb2wge1xuICBwcml2YXRlIGF1dGhNYW5hZ2VyOiBHaXRIdWJBdXRoTWFuYWdlcjtcbiAgcHJpdmF0ZSBwb3J0Zm9saW9NYW5hZ2VyOiBQb3J0Zm9saW9SZXBvTWFuYWdlcjtcblxuICBjb25zdHJ1Y3RvcihhcGlDYWNoZTogQVBJQ2FjaGUpIHtcbiAgICAvLyBUWVBFIFNBRkVUWSBGSVggIzE6IFByb3BlciB0eXBpbmcgZm9yIGFwaUNhY2hlIHBhcmFtZXRlclxuICAgIC8vIFByZXZpb3VzbHk6IGNvbnN0cnVjdG9yKGFwaUNhY2hlOiBhbnkpXG4gICAgLy8gTm93OiBjb25zdHJ1Y3RvcihhcGlDYWNoZTogQVBJQ2FjaGUpIHdpdGggcHJvcGVyIGltcG9ydFxuICAgIHRoaXMuYXV0aE1hbmFnZXIgPSBuZXcgR2l0SHViQXV0aE1hbmFnZXIoYXBpQ2FjaGUpO1xuICAgIHRoaXMucG9ydGZvbGlvTWFuYWdlciA9IG5ldyBQb3J0Zm9saW9SZXBvTWFuYWdlcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlcyBhbmQgbm9ybWFsaXplcyBpbnB1dCBwYXJhbWV0ZXJzIHRvIHByZXZlbnQgVW5pY29kZSBhdHRhY2tzIGFuZCBlbnN1cmUgZGF0YSBzYWZldHlcbiAgICogQHBhcmFtIHBhcmFtcyBUaGUgaW5wdXQgcGFyYW1ldGVycyBmcm9tIHRoZSB1c2VyXG4gICAqIEByZXR1cm5zIFZhbGlkYXRpb24gcmVzdWx0IHdpdGggbm9ybWFsaXplZCBuYW1lIG9yIGVycm9yIHJlc3BvbnNlXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHZhbGlkYXRlQW5kTm9ybWFsaXplUGFyYW1zKHBhcmFtczogU3VibWl0VG9Qb3J0Zm9saW9QYXJhbXMpOiBQcm9taXNlPHtcbiAgICBzdWNjZXNzOiBib29sZWFuO1xuICAgIHNhZmVOYW1lPzogc3RyaW5nO1xuICAgIGVycm9yPzogU3VibWl0VG9Qb3J0Zm9saW9SZXN1bHQ7XG4gIH0+IHtcbiAgICAvLyBOb3JtYWxpemUgdXNlciBpbnB1dCB0byBwcmV2ZW50IFVuaWNvZGUgYXR0YWNrcyAoRE1DUC1TRUMtMDA0KVxuICAgIGNvbnN0IG5vcm1hbGl6ZWROYW1lID0gVW5pY29kZVZhbGlkYXRvci5ub3JtYWxpemUocGFyYW1zLm5hbWUpO1xuICAgIGlmICghbm9ybWFsaXplZE5hbWUuaXNWYWxpZCkge1xuICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICB0eXBlOiAnVU5JQ09ERV9WQUxJREFUSU9OX0VSUk9SJyxcbiAgICAgICAgc2V2ZXJpdHk6ICdNRURJVU0nLFxuICAgICAgICBzb3VyY2U6ICdTdWJtaXRUb1BvcnRmb2xpb1Rvb2wuZXhlY3V0ZScsXG4gICAgICAgIGRldGFpbHM6IGBJbnZhbGlkIFVuaWNvZGUgaW4gZWxlbWVudCBuYW1lOiAke25vcm1hbGl6ZWROYW1lLmRldGVjdGVkSXNzdWVzPy5bMF0gfHwgJ3Vua25vd24gZXJyb3InfWBcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgIGVycm9yOiB7XG4gICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgbWVzc2FnZTogYEludmFsaWQgY2hhcmFjdGVycyBpbiBlbGVtZW50IG5hbWU6ICR7bm9ybWFsaXplZE5hbWUuZGV0ZWN0ZWRJc3N1ZXM/LlswXSB8fCAndW5rbm93biBlcnJvcid9YCxcbiAgICAgICAgICBlcnJvcjogJ0lOVkFMSURfSU5QVVQnXG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfVxuICAgIFxuICAgIHJldHVybiB7XG4gICAgICBzdWNjZXNzOiB0cnVlLFxuICAgICAgc2FmZU5hbWU6IG5vcm1hbGl6ZWROYW1lLm5vcm1hbGl6ZWRDb250ZW50XG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgdGhlIHVzZXIgaXMgYXV0aGVudGljYXRlZCB3aXRoIEdpdEh1YlxuICAgKiBAcmV0dXJucyBBdXRoZW50aWNhdGlvbiBjaGVjayByZXN1bHQgd2l0aCBzdGF0dXMgb3IgZXJyb3IgcmVzcG9uc2VcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgY2hlY2tBdXRoZW50aWNhdGlvbigpOiBQcm9taXNlPHtcbiAgICBzdWNjZXNzOiBib29sZWFuO1xuICAgIGF1dGhTdGF0dXM/OiBhbnk7XG4gICAgZXJyb3I/OiBTdWJtaXRUb1BvcnRmb2xpb1Jlc3VsdDtcbiAgfT4ge1xuICAgIGNvbnN0IGF1dGhTdGF0dXMgPSBhd2FpdCB0aGlzLmF1dGhNYW5hZ2VyLmdldEF1dGhTdGF0dXMoKTtcbiAgICBpZiAoIWF1dGhTdGF0dXMuaXNBdXRoZW50aWNhdGVkKSB7XG4gICAgICAvLyBMb2cgYXV0aGVudGljYXRpb24gcmVxdWlyZWQgKHVzaW5nIGV4aXN0aW5nIGV2ZW50IHR5cGUpXG4gICAgICBsb2dnZXIud2FybignVXNlciBhdHRlbXB0ZWQgcG9ydGZvbGlvIHN1Ym1pc3Npb24gd2l0aG91dCBhdXRoZW50aWNhdGlvbicpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgIGVycm9yOiB7XG4gICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgbWVzc2FnZTogJ05vdCBhdXRoZW50aWNhdGVkLiBQbGVhc2UgYXV0aGVudGljYXRlIGZpcnN0IHVzaW5nIHRoZSBHaXRIdWIgT0F1dGggZmxvdy5cXG5cXG4nICtcbiAgICAgICAgICAgICAgICAgICAnVmlzaXQ6IGh0dHBzOi8vZG9jcy5hbnRocm9waWMuY29tL2VuL2RvY3MvY2xhdWRlLWNvZGUvb2F1dGgtc2V0dXBcXG4nICtcbiAgICAgICAgICAgICAgICAgICAnT3IgcnVuOiBnaCBhdXRoIGxvZ2luIC0td2ViJyxcbiAgICAgICAgICBlcnJvcjogJ05PVF9BVVRIRU5USUNBVEVEJ1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBzdWNjZXNzOiB0cnVlLFxuICAgICAgYXV0aFN0YXR1c1xuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogRGlzY292ZXJzIGNvbnRlbnQgbG9jYWxseSB3aXRoIHNtYXJ0IHR5cGUgZGV0ZWN0aW9uXG4gICAqIEBwYXJhbSBzYWZlTmFtZSBUaGUgbm9ybWFsaXplZCBuYW1lIHRvIHNlYXJjaCBmb3JcbiAgICogQHBhcmFtIGV4cGxpY2l0VHlwZSBPcHRpb25hbCBleHBsaWNpdCBlbGVtZW50IHR5cGUgcHJvdmlkZWQgYnkgdXNlclxuICAgKiBAcGFyYW0gb3JpZ2luYWxOYW1lIE9yaWdpbmFsIHVzZXItcHJvdmlkZWQgbmFtZSBmb3IgZXJyb3IgbWVzc2FnZXNcbiAgICogQHJldHVybnMgQ29udGVudCBkaXNjb3ZlcnkgcmVzdWx0IHdpdGggZWxlbWVudCB0eXBlIGFuZCBwYXRoIG9yIGVycm9yIHJlc3BvbnNlXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGRpc2NvdmVyQ29udGVudFdpdGhUeXBlRGV0ZWN0aW9uKFxuICAgIHNhZmVOYW1lOiBzdHJpbmcsIFxuICAgIGV4cGxpY2l0VHlwZT86IEVsZW1lbnRUeXBlLCBcbiAgICBvcmlnaW5hbE5hbWU/OiBzdHJpbmdcbiAgKTogUHJvbWlzZTx7XG4gICAgc3VjY2VzczogYm9vbGVhbjtcbiAgICBlbGVtZW50VHlwZT86IEVsZW1lbnRUeXBlO1xuICAgIGxvY2FsUGF0aD86IHN0cmluZztcbiAgICBlcnJvcj86IFN1Ym1pdFRvUG9ydGZvbGlvUmVzdWx0O1xuICB9PiB7XG4gICAgbGV0IGVsZW1lbnRUeXBlID0gZXhwbGljaXRUeXBlO1xuICAgIGxldCBsb2NhbFBhdGg6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICAgIFxuICAgIGlmIChlbGVtZW50VHlwZSkge1xuICAgICAgLy8gVHlwZSBleHBsaWNpdGx5IHByb3ZpZGVkIC0gc2VhcmNoIGluIHRoYXQgc3BlY2lmaWMgZGlyZWN0b3J5IG9ubHlcbiAgICAgIGxvY2FsUGF0aCA9IGF3YWl0IHRoaXMuZmluZExvY2FsQ29udGVudChzYWZlTmFtZSwgZWxlbWVudFR5cGUpO1xuICAgICAgaWYgKCFsb2NhbFBhdGgpIHtcbiAgICAgICAgLy8gVVggSU1QUk9WRU1FTlQ6IFByb3ZpZGUgaGVscGZ1bCBzdWdnZXN0aW9ucyBmb3IgZmluZGluZyBjb250ZW50XG4gICAgICAgIGNvbnN0IHBvcnRmb2xpb01hbmFnZXIgPSBQb3J0Zm9saW9NYW5hZ2VyLmdldEluc3RhbmNlKCk7XG4gICAgICAgIGNvbnN0IGVsZW1lbnREaXIgPSBwb3J0Zm9saW9NYW5hZ2VyLmdldEVsZW1lbnREaXIoZWxlbWVudFR5cGUpO1xuICAgICAgICBcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgICBlcnJvcjoge1xuICAgICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgICBtZXNzYWdlOiBgQ291bGQgbm90IGZpbmQgJHtlbGVtZW50VHlwZX0gbmFtZWQgXCIke29yaWdpbmFsTmFtZSB8fCBzYWZlTmFtZX1cIiBpbiBsb2NhbCBwb3J0Zm9saW8uXFxuXFxuYCArXG4gICAgICAgICAgICAgICAgICAgIGAqKlNlYXJjaGVkIGluKio6ICR7ZWxlbWVudERpcn1cXG5cXG5gICtcbiAgICAgICAgICAgICAgICAgICAgYCoqVHJvdWJsZXNob290aW5nIFRpcHMqKjpcXG5gICtcbiAgICAgICAgICAgICAgICAgICAgYOKAoiBDaGVjayBpZiB0aGUgZmlsZSBleGlzdHMgdXNpbmcgeW91ciBmaWxlIGV4cGxvcmVyXFxuYCArXG4gICAgICAgICAgICAgICAgICAgIGDigKIgVHJ5IHVzaW5nIHRoZSBleGFjdCBmaWxlbmFtZSAod2l0aG91dCBleHRlbnNpb24pXFxuYCArXG4gICAgICAgICAgICAgICAgICAgIGDigKIgVXNlIFxcYGxpc3RfcG9ydGZvbGlvXFxgIHRvIHNlZSBhbGwgYXZhaWxhYmxlICR7ZWxlbWVudFR5cGV9XFxuYCArXG4gICAgICAgICAgICAgICAgICAgIGDigKIgSWYgdW5zdXJlIG9mIHRoZSB0eXBlLCBvbWl0IC0tdHlwZSBhbmQgbGV0IHRoZSBzeXN0ZW0gZGV0ZWN0IGl0XFxuXFxuYCArXG4gICAgICAgICAgICAgICAgICAgIGAqKkNvbW1vbiBuYW1lIGZvcm1hdHMgdGhhdCB3b3JrKio6XFxuYCArXG4gICAgICAgICAgICAgICAgICAgIGDigKIgXCJteS1lbGVtZW50XCIgKGtlYmFiLWNhc2UpXFxuYCArXG4gICAgICAgICAgICAgICAgICAgIGDigKIgXCJNeSBFbGVtZW50XCIgKHdpdGggc3BhY2VzKVxcbmAgK1xuICAgICAgICAgICAgICAgICAgICBg4oCiIFwiTXlFbGVtZW50XCIgKFBhc2NhbENhc2UpXFxuYCArXG4gICAgICAgICAgICAgICAgICAgIGDigKIgUGFydGlhbCBtYXRjaGVzIGFyZSBzdXBwb3J0ZWRgLFxuICAgICAgICAgICAgZXJyb3I6ICdDT05URU5UX05PVF9GT1VORCdcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIENSSVRJQ0FMIEZJWDogTm8gdHlwZSBwcm92aWRlZCAtIGltcGxlbWVudCBzbWFydCBkZXRlY3Rpb24gYWNyb3NzIEFMTCBlbGVtZW50IHR5cGVzXG4gICAgICAvLyBUaGlzIHByZXZlbnRzIHRoZSBwcmV2aW91cyBoYXJkY29kZWQgZGVmYXVsdCB0byBQRVJTT05BIGFuZCBlbmFibGVzIHByb3BlciB0eXBlIGRldGVjdGlvblxuICAgICAgY29uc3QgZGV0ZWN0aW9uUmVzdWx0ID0gYXdhaXQgdGhpcy5kZXRlY3RFbGVtZW50VHlwZShzYWZlTmFtZSk7XG4gICAgICBcbiAgICAgIGlmICghZGV0ZWN0aW9uUmVzdWx0LmZvdW5kKSB7XG4gICAgICAgIC8vIFVYIElNUFJPVkVNRU5UOiBFbmhhbmNlZCBndWlkYW5jZSB3aXRoIHNwZWNpZmljIHN1Z2dlc3Rpb25zXG4gICAgICAgIGNvbnN0IGF2YWlsYWJsZVR5cGVzID0gT2JqZWN0LnZhbHVlcyhFbGVtZW50VHlwZSkuam9pbignLCAnKTtcbiAgICAgICAgXG4gICAgICAgIC8vIEdldCBzdWdnZXN0aW9ucyBmb3Igc2ltaWxhciBuYW1lc1xuICAgICAgICBjb25zdCBzdWdnZXN0aW9ucyA9IGF3YWl0IHRoaXMuZ2VuZXJhdGVOYW1lU3VnZ2VzdGlvbnMoc2FmZU5hbWUpO1xuICAgICAgICBcbiAgICAgICAgbGV0IG1lc3NhZ2UgPSBgQ29udGVudCBcIiR7b3JpZ2luYWxOYW1lIHx8IHNhZmVOYW1lfVwiIG5vdCBmb3VuZCBpbiBwb3J0Zm9saW8uXFxuXFxuYDtcbiAgICAgICAgbWVzc2FnZSArPSBg8J+UjSAqKlNlYXJjaGVkIGluIGFsbCBlbGVtZW50IHR5cGVzKio6ICR7YXZhaWxhYmxlVHlwZXN9XFxuXFxuYDtcbiAgICAgICAgXG4gICAgICAgIGlmIChzdWdnZXN0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgbWVzc2FnZSArPSBg8J+SoSAqKkRpZCB5b3UgbWVhbiBvbmUgb2YgdGhlc2U/KipcXG5gO1xuICAgICAgICAgIGZvciAoY29uc3Qgc3VnZ2VzdGlvbiBvZiBzdWdnZXN0aW9ucy5zbGljZSgwLCBTRUFSQ0hfQ09ORklHLk1BWF9TVUdHRVNUSU9OUykpIHtcbiAgICAgICAgICAgIG1lc3NhZ2UgKz0gYCAg4oCiIFwiJHtzdWdnZXN0aW9uLm5hbWV9XCIgKCR7c3VnZ2VzdGlvbi50eXBlfSlcXG5gO1xuICAgICAgICAgIH1cbiAgICAgICAgICBtZXNzYWdlICs9IGBcXG5gO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBtZXNzYWdlICs9IGDwn5ug77iPICoqVHJvdWJsZXNob290aW5nIFN0ZXBzKio6XFxuYDtcbiAgICAgICAgbWVzc2FnZSArPSBgMS4g8J+TnSBVc2UgXFxgbGlzdF9wb3J0Zm9saW9cXGAgdG8gc2VlIGFsbCBhdmFpbGFibGUgY29udGVudFxcbmA7XG4gICAgICAgIG1lc3NhZ2UgKz0gYDIuIPCflI0gQ2hlY2sgZXhhY3Qgc3BlbGxpbmcgYW5kIHRyeSB2YXJpYXRpb25zOlxcbmA7XG4gICAgICAgIG1lc3NhZ2UgKz0gYCAgIOKAoiBcIiR7KG9yaWdpbmFsTmFtZSB8fCBzYWZlTmFtZSkudG9Mb3dlckNhc2UoKX1cIiAobG93ZXJjYXNlKVxcbmA7XG4gICAgICAgIG1lc3NhZ2UgKz0gYCAgIOKAoiBcIiR7KG9yaWdpbmFsTmFtZSB8fCBzYWZlTmFtZSkucmVwbGFjZSgvW15hLXowLTldL2dpLCAnLScpLnRvTG93ZXJDYXNlKCl9XCIgKG5vcm1hbGl6ZWQpXFxuYDtcbiAgICAgICAgaWYgKChvcmlnaW5hbE5hbWUgfHwgc2FmZU5hbWUpLmluY2x1ZGVzKCcuJykpIHtcbiAgICAgICAgICBtZXNzYWdlICs9IGAgICDigKIgXCIkeyhvcmlnaW5hbE5hbWUgfHwgc2FmZU5hbWUpLnJlcGxhY2UoL1xcLi9nLCAnJyl9XCIgKG5vIGRvdHMpXFxuYDtcbiAgICAgICAgfVxuICAgICAgICBtZXNzYWdlICs9IGAzLiDwn46vIFNwZWNpZnkgZWxlbWVudCB0eXBlOiBcXGBzdWJtaXRfY29udGVudCBcIiR7b3JpZ2luYWxOYW1lIHx8IHNhZmVOYW1lfVwiIC0tdHlwZT1wZXJzb25hc1xcYFxcbmA7XG4gICAgICAgIG1lc3NhZ2UgKz0gYDQuIPCfk4EgQ2hlY2sgaWYgZmlsZSBleGlzdHMgaW4gcG9ydGZvbGlvIGRpcmVjdG9yaWVzXFxuXFxuYDtcbiAgICAgICAgbWVzc2FnZSArPSBg8J+TnSAqKlRpcCoqOiBUaGUgc3lzdGVtIHNlYXJjaGVzIGZpbGVuYW1lcyBBTkQgbWV0YWRhdGEgbmFtZXMgd2l0aCBmdXp6eSBtYXRjaGluZy5gO1xuICAgICAgICBcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgICBlcnJvcjoge1xuICAgICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgICBtZXNzYWdlLFxuICAgICAgICAgICAgZXJyb3I6ICdDT05URU5UX05PVF9GT1VORCdcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBcbiAgICAgIGlmIChkZXRlY3Rpb25SZXN1bHQubWF0Y2hlcy5sZW5ndGggPiAxKSB7XG4gICAgICAgIC8vIE11bHRpcGxlIG1hdGNoZXMgZm91bmQgLSBhc2sgdXNlciB0byBzcGVjaWZ5IHR5cGVcbiAgICAgICAgY29uc3QgbWF0Y2hEZXRhaWxzID0gZGV0ZWN0aW9uUmVzdWx0Lm1hdGNoZXMubWFwKG0gPT4gYC0gJHttLnR5cGV9OiAke20ucGF0aH1gKS5qb2luKCdcXG4nKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgICBlcnJvcjoge1xuICAgICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgICBtZXNzYWdlOiBgQ29udGVudCBcIiR7b3JpZ2luYWxOYW1lIHx8IHNhZmVOYW1lfVwiIGZvdW5kIGluIG11bHRpcGxlIGVsZW1lbnQgdHlwZXM6XFxuXFxuJHttYXRjaERldGFpbHN9XFxuXFxuYCArXG4gICAgICAgICAgICAgICAgICAgIGBQbGVhc2Ugc3BlY2lmeSB0aGUgZWxlbWVudCB0eXBlIHVzaW5nIHRoZSAtLXR5cGUgcGFyYW1ldGVyIHRvIGF2b2lkIGFtYmlndWl0eS5gLFxuICAgICAgICAgICAgZXJyb3I6ICdNVUxUSVBMRV9NQVRDSEVTX0ZPVU5EJ1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gU2luZ2xlIG1hdGNoIGZvdW5kIC0gdXNlIGl0XG4gICAgICBjb25zdCBtYXRjaCA9IGRldGVjdGlvblJlc3VsdC5tYXRjaGVzWzBdO1xuICAgICAgZWxlbWVudFR5cGUgPSBtYXRjaC50eXBlO1xuICAgICAgbG9jYWxQYXRoID0gbWF0Y2gucGF0aDtcbiAgICAgIFxuICAgICAgbG9nZ2VyLmluZm8oYFNtYXJ0IGRldGVjdGlvbjogRm91bmQgXCIke3NhZmVOYW1lfVwiIGFzICR7ZWxlbWVudFR5cGV9YCwgeyBcbiAgICAgICAgbmFtZTogc2FmZU5hbWUsXG4gICAgICAgIGRldGVjdGVkVHlwZTogZWxlbWVudFR5cGUsXG4gICAgICAgIHBhdGg6IGxvY2FsUGF0aFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHN1Y2Nlc3M6IHRydWUsXG4gICAgICBlbGVtZW50VHlwZSxcbiAgICAgIGxvY2FsUGF0aFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGVzIGZpbGUgc2l6ZSBhbmQgY29udGVudCBzZWN1cml0eSBiZWZvcmUgcHJvY2Vzc2luZ1xuICAgKiBAcGFyYW0gbG9jYWxQYXRoIFBhdGggdG8gdGhlIGxvY2FsIGZpbGUgdG8gdmFsaWRhdGVcbiAgICogQHJldHVybnMgVmFsaWRhdGlvbiByZXN1bHQgd2l0aCBjb250ZW50IG9yIGVycm9yIHJlc3BvbnNlXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHZhbGlkYXRlRmlsZUFuZENvbnRlbnQobG9jYWxQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHtcbiAgICBzdWNjZXNzOiBib29sZWFuO1xuICAgIGNvbnRlbnQ/OiBzdHJpbmc7XG4gICAgZXJyb3I/OiBTdWJtaXRUb1BvcnRmb2xpb1Jlc3VsdDtcbiAgfT4ge1xuICAgIC8vIFNFQ1VSSVRZIEVOSEFOQ0VNRU5UIChUYXNrICM3KTogVmFsaWRhdGUgZmlsZSBwYXRoIGJlZm9yZSBwcm9jZXNzaW5nXG4gICAgY29uc3QgcGF0aFZhbGlkYXRpb24gPSBhd2FpdCB0aGlzLnZhbGlkYXRlUG9ydGZvbGlvUGF0aChsb2NhbFBhdGgpO1xuICAgIGlmICghcGF0aFZhbGlkYXRpb24uaXNWYWxpZCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgIGVycm9yOiBwYXRoVmFsaWRhdGlvbi5lcnJvclxuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBVc2UgdGhlIHZhbGlkYXRlZCBzYWZlIHBhdGggZm9yIGFsbCBzdWJzZXF1ZW50IG9wZXJhdGlvbnNcbiAgICBjb25zdCBzYWZlUGF0aCA9IHBhdGhWYWxpZGF0aW9uLnNhZmVQYXRoITtcblxuICAgIC8vIFZhbGlkYXRlIGZpbGUgc2l6ZSBiZWZvcmUgcmVhZGluZ1xuICAgIGNvbnN0IHN0YXRzID0gYXdhaXQgZnMuc3RhdChzYWZlUGF0aCk7XG4gICAgaWYgKHN0YXRzLnNpemUgPiBGSUxFX1NJWkVfTElNSVRTLk1BWF9GSUxFX1NJWkUpIHtcbiAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgdHlwZTogJ1JBVEVfTElNSVRfRVhDRUVERUQnLFxuICAgICAgICBzZXZlcml0eTogJ01FRElVTScsXG4gICAgICAgIHNvdXJjZTogJ1N1Ym1pdFRvUG9ydGZvbGlvVG9vbC5leGVjdXRlJyxcbiAgICAgICAgZGV0YWlsczogYEZpbGUgc2l6ZSAke3N0YXRzLnNpemV9IGV4Y2VlZHMgbGltaXQgb2YgJHtGSUxFX1NJWkVfTElNSVRTLk1BWF9GSUxFX1NJWkV9YFxuICAgICAgfSk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgZXJyb3I6IHtcbiAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgICBtZXNzYWdlOiBgRmlsZSBzaXplIGV4Y2VlZHMgJHtGSUxFX1NJWkVfTElNSVRTLk1BWF9GSUxFX1NJWkVfTUJ9TUIgbGltaXRgLFxuICAgICAgICAgIGVycm9yOiAnRklMRV9UT09fTEFSR0UnXG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gVmFsaWRhdGUgY29udGVudCBzZWN1cml0eVxuICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBmcy5yZWFkRmlsZShzYWZlUGF0aCwgJ3V0Zi04Jyk7XG4gICAgY29uc3QgdmFsaWRhdGlvblJlc3VsdCA9IENvbnRlbnRWYWxpZGF0b3IudmFsaWRhdGVBbmRTYW5pdGl6ZShjb250ZW50KTtcblxuICAgIGlmICghdmFsaWRhdGlvblJlc3VsdC5pc1ZhbGlkICYmIHZhbGlkYXRpb25SZXN1bHQuc2V2ZXJpdHkgPT09ICdjcml0aWNhbCcpIHtcbiAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgdHlwZTogJ0NPTlRFTlRfSU5KRUNUSU9OX0FUVEVNUFQnLFxuICAgICAgICBzZXZlcml0eTogJ0hJR0gnLFxuICAgICAgICBzb3VyY2U6ICdTdWJtaXRUb1BvcnRmb2xpb1Rvb2wuZXhlY3V0ZScsXG4gICAgICAgIGRldGFpbHM6IGBDcml0aWNhbCBzZWN1cml0eSBpc3N1ZXMgZGV0ZWN0ZWQ6ICR7dmFsaWRhdGlvblJlc3VsdC5kZXRlY3RlZFBhdHRlcm5zPy5qb2luKCcsICcpfWBcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgIGVycm9yOiB7XG4gICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgbWVzc2FnZTogYENvbnRlbnQgdmFsaWRhdGlvbiBmYWlsZWQ6ICR7dmFsaWRhdGlvblJlc3VsdC5kZXRlY3RlZFBhdHRlcm5zPy5qb2luKCcsICcpfWAsXG4gICAgICAgICAgZXJyb3I6ICdWQUxJREFUSU9OX0ZBSUxFRCdcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgc3VjY2VzczogdHJ1ZSxcbiAgICAgIGNvbnRlbnRcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFByZXBhcmVzIG1ldGFkYXRhIGZvciB0aGUgcG9ydGZvbGlvIGVsZW1lbnRcbiAgICogQHBhcmFtIHNhZmVOYW1lIFRoZSBub3JtYWxpemVkIG5hbWUgb2YgdGhlIGVsZW1lbnRcbiAgICogQHBhcmFtIGVsZW1lbnRUeXBlIFRoZSB0eXBlIG9mIHRoZSBlbGVtZW50XG4gICAqIEBwYXJhbSBhdXRoU3RhdHVzIEF1dGhlbnRpY2F0aW9uIHN0YXR1cyBjb250YWluaW5nIHVzZXJuYW1lXG4gICAqIEByZXR1cm5zIE1ldGFkYXRhIG9iamVjdCBmb3IgdGhlIGVsZW1lbnRcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcHJlcGFyZUVsZW1lbnRNZXRhZGF0YShcbiAgICBzYWZlTmFtZTogc3RyaW5nLCBcbiAgICBlbGVtZW50VHlwZTogRWxlbWVudFR5cGUsIFxuICAgIGF1dGhTdGF0dXM6IGFueSxcbiAgICBmaWxlUGF0aD86IHN0cmluZ1xuICApOiBQcm9taXNlPFBvcnRmb2xpb0VsZW1lbnRNZXRhZGF0YT4ge1xuICAgIC8vIFRyeSB0byBleHRyYWN0IG1ldGFkYXRhIGZyb20gdGhlIGZpbGUgaWYgcGF0aCBpcyBwcm92aWRlZFxuICAgIGxldCBmaWxlTWV0YWRhdGE6IFJlY29yZDxzdHJpbmcsIGFueT4gfCBudWxsID0gbnVsbDtcbiAgICBcbiAgICBpZiAoZmlsZVBhdGgpIHtcbiAgICAgIGZpbGVNZXRhZGF0YSA9IGF3YWl0IHRoaXMuZXh0cmFjdEVsZW1lbnRNZXRhZGF0YShmaWxlUGF0aCk7XG4gICAgfVxuICAgIFxuICAgIC8vIFRZUEUgU0FGRVRZOiBEZWZpbmUgZXh0ZW5kZWQgbWV0YWRhdGEgaW50ZXJmYWNlIGZvciBiZXR0ZXIgdHlwZSBzYWZldHlcbiAgICBpbnRlcmZhY2UgRXh0ZW5kZWRNZXRhZGF0YSBleHRlbmRzIFBvcnRmb2xpb0VsZW1lbnRNZXRhZGF0YSB7XG4gICAgICB0cmlnZ2Vycz86IHN0cmluZ1tdO1xuICAgICAgY2F0ZWdvcnk/OiBzdHJpbmc7XG4gICAgICBhZ2VfcmF0aW5nPzogc3RyaW5nO1xuICAgICAgYWlfZ2VuZXJhdGVkPzogYm9vbGVhbjtcbiAgICAgIGdlbmVyYXRpb25fbWV0aG9kPzogc3RyaW5nO1xuICAgICAgbGljZW5zZT86IHN0cmluZztcbiAgICAgIHRhZ3M/OiBzdHJpbmdbXTtcbiAgICB9XG4gICAgXG4gICAgLy8gQnVpbGQgbWV0YWRhdGEgd2l0aCByZWFsIHZhbHVlcyBmcm9tIGZpbGUsIGZhbGxpbmcgYmFjayB0byBkZWZhdWx0c1xuICAgIGNvbnN0IG1ldGFkYXRhOiBFeHRlbmRlZE1ldGFkYXRhID0ge1xuICAgICAgbmFtZTogc2FmZU5hbWUsXG4gICAgICBkZXNjcmlwdGlvbjogZmlsZU1ldGFkYXRhPy5kZXNjcmlwdGlvbiB8fCBcbiAgICAgICAgICAgICAgICAgICBmaWxlTWV0YWRhdGE/LnN1bW1hcnkgfHwgXG4gICAgICAgICAgICAgICAgICAgYCR7ZWxlbWVudFR5cGV9IHN1Ym1pdHRlZCBmcm9tIGxvY2FsIHBvcnRmb2xpb2AsXG4gICAgICBhdXRob3I6IGF1dGhTdGF0dXMudXNlcm5hbWUgfHwgZmlsZU1ldGFkYXRhPy5hdXRob3IgfHwgJ3Vua25vd24nLFxuICAgICAgY3JlYXRlZDogZmlsZU1ldGFkYXRhPy5jcmVhdGVkIHx8IFxuICAgICAgICAgICAgICAgZmlsZU1ldGFkYXRhPy5jcmVhdGVkX2RhdGUgfHwgXG4gICAgICAgICAgICAgICBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgICB1cGRhdGVkOiBmaWxlTWV0YWRhdGE/LnVwZGF0ZWQgfHwgXG4gICAgICAgICAgICAgICBmaWxlTWV0YWRhdGE/Lm1vZGlmaWVkIHx8IFxuICAgICAgICAgICAgICAgbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgICAgdmVyc2lvbjogZmlsZU1ldGFkYXRhPy52ZXJzaW9uIHx8ICcxLjAuMCdcbiAgICB9O1xuICAgIFxuICAgIC8vIEFkZCBhZGRpdGlvbmFsIG1ldGFkYXRhIGZpZWxkcyBpZiBwcmVzZW50ICh3aXRoIHR5cGUgc2FmZXR5KVxuICAgIGlmIChmaWxlTWV0YWRhdGEpIHtcbiAgICAgIC8vIFByZXNlcnZlIG90aGVyIG1ldGFkYXRhIGZpZWxkcyB0aGF0IG1pZ2h0IGJlIHVzZWZ1bFxuICAgICAgaWYgKGZpbGVNZXRhZGF0YS50cmlnZ2VycyAmJiBBcnJheS5pc0FycmF5KGZpbGVNZXRhZGF0YS50cmlnZ2VycykpIHtcbiAgICAgICAgbWV0YWRhdGEudHJpZ2dlcnMgPSBmaWxlTWV0YWRhdGEudHJpZ2dlcnM7XG4gICAgICB9XG4gICAgICBpZiAoZmlsZU1ldGFkYXRhLmNhdGVnb3J5ICYmIHR5cGVvZiBmaWxlTWV0YWRhdGEuY2F0ZWdvcnkgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIG1ldGFkYXRhLmNhdGVnb3J5ID0gZmlsZU1ldGFkYXRhLmNhdGVnb3J5O1xuICAgICAgfVxuICAgICAgaWYgKGZpbGVNZXRhZGF0YS5hZ2VfcmF0aW5nICYmIHR5cGVvZiBmaWxlTWV0YWRhdGEuYWdlX3JhdGluZyA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgbWV0YWRhdGEuYWdlX3JhdGluZyA9IGZpbGVNZXRhZGF0YS5hZ2VfcmF0aW5nO1xuICAgICAgfVxuICAgICAgaWYgKGZpbGVNZXRhZGF0YS5haV9nZW5lcmF0ZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBtZXRhZGF0YS5haV9nZW5lcmF0ZWQgPSBCb29sZWFuKGZpbGVNZXRhZGF0YS5haV9nZW5lcmF0ZWQpO1xuICAgICAgfVxuICAgICAgaWYgKGZpbGVNZXRhZGF0YS5nZW5lcmF0aW9uX21ldGhvZCAmJiB0eXBlb2YgZmlsZU1ldGFkYXRhLmdlbmVyYXRpb25fbWV0aG9kID09PSAnc3RyaW5nJykge1xuICAgICAgICBtZXRhZGF0YS5nZW5lcmF0aW9uX21ldGhvZCA9IGZpbGVNZXRhZGF0YS5nZW5lcmF0aW9uX21ldGhvZDtcbiAgICAgIH1cbiAgICAgIGlmIChmaWxlTWV0YWRhdGEubGljZW5zZSAmJiB0eXBlb2YgZmlsZU1ldGFkYXRhLmxpY2Vuc2UgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIG1ldGFkYXRhLmxpY2Vuc2UgPSBmaWxlTWV0YWRhdGEubGljZW5zZTtcbiAgICAgIH1cbiAgICAgIGlmIChmaWxlTWV0YWRhdGEudGFncyAmJiBBcnJheS5pc0FycmF5KGZpbGVNZXRhZGF0YS50YWdzKSkge1xuICAgICAgICBtZXRhZGF0YS50YWdzID0gZmlsZU1ldGFkYXRhLnRhZ3M7XG4gICAgICB9XG4gICAgfVxuICAgIFxuICAgIGxvZ2dlci5pbmZvKCdQcmVwYXJlZCBlbGVtZW50IG1ldGFkYXRhJywge1xuICAgICAgZWxlbWVudE5hbWU6IHNhZmVOYW1lLFxuICAgICAgaGFzRmlsZU1ldGFkYXRhOiAhIWZpbGVNZXRhZGF0YSxcbiAgICAgIGRlc2NyaXB0aW9uOiBtZXRhZGF0YS5kZXNjcmlwdGlvbi5zdWJzdHJpbmcoMCwgMTAwKSAvLyBMb2cgZmlyc3QgMTAwIGNoYXJzXG4gICAgfSk7XG4gICAgXG4gICAgcmV0dXJuIG1ldGFkYXRhO1xuICB9XG5cbiAgLyoqXG4gICAqIEZvcm1hdHMgbWV0YWRhdGEgYXMgWUFNTCBzdHJpbmcgZm9yIGRpc3BsYXlcbiAgICogUEVSRk9STUFOQ0U6IFVzZXMgYXJyYXkgam9pbiBpbnN0ZWFkIG9mIHN0cmluZyBjb25jYXRlbmF0aW9uIGZvciBiZXR0ZXIgcGVyZm9ybWFuY2VcbiAgICovXG4gIHByaXZhdGUgZm9ybWF0TWV0YWRhdGFBc1lhbWwoYmFzZU1ldGFkYXRhOiBQb3J0Zm9saW9FbGVtZW50TWV0YWRhdGEsIGV4dGVuZGVkTWV0YTogYW55KTogc3RyaW5nIHtcbiAgICBjb25zdCB5YW1sTGluZXM6IHN0cmluZ1tdID0gW1xuICAgICAgYG5hbWU6ICR7YmFzZU1ldGFkYXRhLm5hbWV9YCxcbiAgICAgIGBkZXNjcmlwdGlvbjogJHtiYXNlTWV0YWRhdGEuZGVzY3JpcHRpb259YCxcbiAgICAgIGBhdXRob3I6ICR7YmFzZU1ldGFkYXRhLmF1dGhvcn1gLFxuICAgICAgYHZlcnNpb246ICR7YmFzZU1ldGFkYXRhLnZlcnNpb259YCxcbiAgICAgIGBjcmVhdGVkOiAke2Jhc2VNZXRhZGF0YS5jcmVhdGVkfWAsXG4gICAgICBgdXBkYXRlZDogJHtiYXNlTWV0YWRhdGEudXBkYXRlZH1gXG4gICAgXTtcbiAgICBcbiAgICAvLyBBZGQgb3B0aW9uYWwgZmllbGRzIGlmIHByZXNlbnRcbiAgICBpZiAoZXh0ZW5kZWRNZXRhLmNhdGVnb3J5KSB7XG4gICAgICB5YW1sTGluZXMucHVzaChgY2F0ZWdvcnk6ICR7ZXh0ZW5kZWRNZXRhLmNhdGVnb3J5fWApO1xuICAgIH1cbiAgICBpZiAoZXh0ZW5kZWRNZXRhLnRyaWdnZXJzICYmIEFycmF5LmlzQXJyYXkoZXh0ZW5kZWRNZXRhLnRyaWdnZXJzKSAmJiBleHRlbmRlZE1ldGEudHJpZ2dlcnMubGVuZ3RoID4gMCkge1xuICAgICAgeWFtbExpbmVzLnB1c2goYHRyaWdnZXJzOiBbJHtleHRlbmRlZE1ldGEudHJpZ2dlcnMuam9pbignLCAnKX1dYCk7XG4gICAgfVxuICAgIGlmIChleHRlbmRlZE1ldGEuYWdlX3JhdGluZykge1xuICAgICAgeWFtbExpbmVzLnB1c2goYGFnZV9yYXRpbmc6ICR7ZXh0ZW5kZWRNZXRhLmFnZV9yYXRpbmd9YCk7XG4gICAgfVxuICAgIGlmIChleHRlbmRlZE1ldGEuYWlfZ2VuZXJhdGVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHlhbWxMaW5lcy5wdXNoKGBhaV9nZW5lcmF0ZWQ6ICR7ZXh0ZW5kZWRNZXRhLmFpX2dlbmVyYXRlZH1gKTtcbiAgICB9XG4gICAgaWYgKGV4dGVuZGVkTWV0YS5nZW5lcmF0aW9uX21ldGhvZCkge1xuICAgICAgeWFtbExpbmVzLnB1c2goYGdlbmVyYXRpb25fbWV0aG9kOiAke2V4dGVuZGVkTWV0YS5nZW5lcmF0aW9uX21ldGhvZH1gKTtcbiAgICB9XG4gICAgaWYgKGV4dGVuZGVkTWV0YS5saWNlbnNlKSB7XG4gICAgICB5YW1sTGluZXMucHVzaChgbGljZW5zZTogJHtleHRlbmRlZE1ldGEubGljZW5zZX1gKTtcbiAgICB9XG4gICAgaWYgKGV4dGVuZGVkTWV0YS50YWdzICYmIEFycmF5LmlzQXJyYXkoZXh0ZW5kZWRNZXRhLnRhZ3MpICYmIGV4dGVuZGVkTWV0YS50YWdzLmxlbmd0aCA+IDApIHtcbiAgICAgIHlhbWxMaW5lcy5wdXNoKGB0YWdzOiBbJHtleHRlbmRlZE1ldGEudGFncy5qb2luKCcsICcpfV1gKTtcbiAgICB9XG4gICAgXG4gICAgcmV0dXJuIHlhbWxMaW5lcy5qb2luKCdcXG4nKTtcbiAgfVxuICBcbiAgLyoqXG4gICAqIEV4dHJhY3RzIG1ldGFkYXRhIGZyb20gYW4gZWxlbWVudCBmaWxlXG4gICAqIFBhcnNlcyBZQU1MIGZyb250bWF0dGVyIHRvIGdldCB0aGUgYWN0dWFsIG1ldGFkYXRhXG4gICAqIFNFQ1VSSVRZOiBVc2VzIFNlY3VyZVlhbWxQYXJzZXIgaW5zdGVhZCBvZiB5YW1sLmxvYWQgdG8gcHJldmVudCBjb2RlIGV4ZWN1dGlvbiAoRE1DUC1TRUMtMDA1KVxuICAgKiBAcGFyYW0gZmlsZVBhdGggUGF0aCB0byB0aGUgZWxlbWVudCBmaWxlXG4gICAqIEByZXR1cm5zIEV4dHJhY3RlZCBtZXRhZGF0YSBvciBudWxsIGlmIHBhcnNpbmcgZmFpbHNcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZXh0cmFjdEVsZW1lbnRNZXRhZGF0YShmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgbnVsbD4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgZnMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGYtOCcpO1xuICAgICAgXG4gICAgICAvLyBTRUNVUklUWSBGSVg6IFVzZSBTZWN1cmVZYW1sUGFyc2VyIHRvIHByZXZlbnQgWUFNTCBkZXNlcmlhbGl6YXRpb24gYXR0YWNrc1xuICAgICAgLy8gUHJldmlvdXNseSB3b3VsZCBoYXZlIHVzZWQ6IHlhbWwubG9hZCh5YW1sQ29udGVudCkgd2hpY2ggaXMgdnVsbmVyYWJsZVxuICAgICAgLy8gTm93OiBVc2VzIFNlY3VyZVlhbWxQYXJzZXIucGFyc2UoKSB3aGljaCB2YWxpZGF0ZXMgYW5kIHNhbml0aXplc1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcGFyc2VkID0gU2VjdXJlWWFtbFBhcnNlci5wYXJzZShjb250ZW50LCB7XG4gICAgICAgICAgbWF4WWFtbFNpemU6IDY0ICogMTAyNCwgIC8vIDY0S0IgbGltaXQgZm9yIFlBTUxcbiAgICAgICAgICB2YWxpZGF0ZUNvbnRlbnQ6IGZhbHNlLCAgICAvLyBEb24ndCB2YWxpZGF0ZSBjb250ZW50IGZpZWxkIChqdXN0IG1ldGFkYXRhKVxuICAgICAgICAgIHZhbGlkYXRlRmllbGRzOiBmYWxzZSAgICAgIC8vIERvbid0IGVuZm9yY2UgcGVyc29uYS1zcGVjaWZpYyBydWxlc1xuICAgICAgICB9KTtcbiAgICAgICAgXG4gICAgICAgIC8vIEVuc3VyZSB3ZSBnb3QgYW4gb2JqZWN0IGJhY2tcbiAgICAgICAgaWYgKHBhcnNlZC5kYXRhICYmIHR5cGVvZiBwYXJzZWQuZGF0YSA9PT0gJ29iamVjdCcgJiYgIUFycmF5LmlzQXJyYXkocGFyc2VkLmRhdGEpKSB7XG4gICAgICAgICAgbG9nZ2VyLmRlYnVnKCdFeHRyYWN0ZWQgbWV0YWRhdGEgZnJvbSBlbGVtZW50IGZpbGUnLCB7XG4gICAgICAgICAgICBwYXRoOiBmaWxlUGF0aCxcbiAgICAgICAgICAgIG1ldGFkYXRhS2V5czogT2JqZWN0LmtleXMocGFyc2VkLmRhdGEpXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmV0dXJuIHBhcnNlZC5kYXRhO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBsb2dnZXIuZGVidWcoJ1BhcnNlZCBkYXRhIGlzIG5vdCBhIHZhbGlkIG1ldGFkYXRhIG9iamVjdCcsIHsgcGF0aDogZmlsZVBhdGggfSk7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICBcbiAgICAgIH0gY2F0Y2ggKHBhcnNlRXJyb3IpIHtcbiAgICAgICAgLy8gU2VjdXJlWWFtbFBhcnNlciB0aHJvd3Mgb24gaW52YWxpZCBZQU1MLCB0cnkgYWx0ZXJuYXRlIGZyb250bWF0dGVyIHBhdHRlcm5cbiAgICAgICAgLy8gSGFuZGxlIGZpbGVzIHRoYXQgbWlnaHQgaGF2ZSBmcm9udG1hdHRlciB3aXRob3V0IGZ1bGwgZG9jdW1lbnQgc3RydWN0dXJlXG4gICAgICAgIGNvbnN0IGZyb250bWF0dGVyTWF0Y2ggPSBjb250ZW50Lm1hdGNoKC9eLS0tXFxyP1xcbihbXFxzXFxTXSo/KVxccj9cXG4tLS0vKTtcbiAgICAgICAgXG4gICAgICAgIGlmIChmcm9udG1hdHRlck1hdGNoICYmIGZyb250bWF0dGVyTWF0Y2hbMV0pIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gUmVjb25zdHJ1Y3QgZnVsbCBkb2N1bWVudCBmb3IgU2VjdXJlWWFtbFBhcnNlclxuICAgICAgICAgICAgY29uc3QgZnVsbENvbnRlbnQgPSBgLS0tXFxuJHtmcm9udG1hdHRlck1hdGNoWzFdfVxcbi0tLVxcbmA7XG4gICAgICAgICAgICBjb25zdCBwYXJzZWQgPSBTZWN1cmVZYW1sUGFyc2VyLnBhcnNlKGZ1bGxDb250ZW50LCB7XG4gICAgICAgICAgICAgIG1heFlhbWxTaXplOiA2NCAqIDEwMjQsXG4gICAgICAgICAgICAgIHZhbGlkYXRlQ29udGVudDogZmFsc2UsXG4gICAgICAgICAgICAgIHZhbGlkYXRlRmllbGRzOiBmYWxzZVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGlmIChwYXJzZWQuZGF0YSAmJiB0eXBlb2YgcGFyc2VkLmRhdGEgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICAgIHJldHVybiBwYXJzZWQuZGF0YTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGNhdGNoIChpbm5lckVycm9yKSB7XG4gICAgICAgICAgICBsb2dnZXIuZGVidWcoJ0ZhaWxlZCB0byBwYXJzZSBmcm9udG1hdHRlciB3aXRoIFNlY3VyZVlhbWxQYXJzZXInLCB7XG4gICAgICAgICAgICAgIHBhdGg6IGZpbGVQYXRoLFxuICAgICAgICAgICAgICBlcnJvcjogaW5uZXJFcnJvciBpbnN0YW5jZW9mIEVycm9yID8gaW5uZXJFcnJvci5tZXNzYWdlIDogU3RyaW5nKGlubmVyRXJyb3IpXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIGxvZ2dlci5kZWJ1ZygnTm8gdmFsaWQgZnJvbnRtYXR0ZXIgZm91bmQgaW4gZWxlbWVudCBmaWxlJywgeyBwYXRoOiBmaWxlUGF0aCB9KTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgICBcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbG9nZ2VyLndhcm4oJ0ZhaWxlZCB0byBleHRyYWN0IG1ldGFkYXRhIGZyb20gZWxlbWVudCBmaWxlJywge1xuICAgICAgICBwYXRoOiBmaWxlUGF0aCxcbiAgICAgICAgZXJyb3I6IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKVxuICAgICAgfSk7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGVzIEdpdEh1YiB0b2tlbiBhbmQgY2hlY2tzIGZvciBleHBpcmF0aW9uIGJlZm9yZSB1c2FnZVxuICAgKiBTRUNVUklUWSBFTkhBTkNFTUVOVCAoVGFzayAjNSk6IFRva2VuIGV4cGlyYXRpb24gdmFsaWRhdGlvbiB0byBwcmV2ZW50IHN0YWxlIHRva2VuIHVzYWdlXG4gICAqIEBwYXJhbSB0b2tlbiBUaGUgR2l0SHViIHRva2VuIHRvIHZhbGlkYXRlXG4gICAqIEByZXR1cm5zIFZhbGlkYXRpb24gcmVzdWx0IHdpdGggc3RhdHVzIGFuZCBleHBpcmF0aW9uIGluZm9cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgdmFsaWRhdGVUb2tlbkJlZm9yZVVzYWdlKHRva2VuOiBzdHJpbmcpOiBQcm9taXNlPHtcbiAgICBpc1ZhbGlkOiBib29sZWFuO1xuICAgIGlzTmVhckV4cGlyeT86IGJvb2xlYW47XG4gICAgZXJyb3I/OiBTdWJtaXRUb1BvcnRmb2xpb1Jlc3VsdDtcbiAgfT4ge1xuICAgIHRyeSB7XG4gICAgICAvLyBDaGVjayB0b2tlbiBmb3JtYXQgZmlyc3QgKGJhc2ljIHZhbGlkYXRpb24pXG4gICAgICBpZiAoIVRva2VuTWFuYWdlci52YWxpZGF0ZVRva2VuRm9ybWF0KHRva2VuKSkge1xuICAgICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgICAgdHlwZTogJ1RPS0VOX1ZBTElEQVRJT05fRkFJTFVSRScsXG4gICAgICAgICAgc2V2ZXJpdHk6ICdNRURJVU0nLFxuICAgICAgICAgIHNvdXJjZTogJ1N1Ym1pdFRvUG9ydGZvbGlvVG9vbC52YWxpZGF0ZVRva2VuQmVmb3JlVXNhZ2UnLFxuICAgICAgICAgIGRldGFpbHM6ICdUb2tlbiBoYXMgaW52YWxpZCBmb3JtYXQnXG4gICAgICAgIH0pO1xuICAgICAgICBcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBpc1ZhbGlkOiBmYWxzZSxcbiAgICAgICAgICBlcnJvcjoge1xuICAgICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgICBtZXNzYWdlOiAnSW52YWxpZCB0b2tlbiBmb3JtYXQuIFBsZWFzZSByZS1hdXRoZW50aWNhdGUuJyxcbiAgICAgICAgICAgIGVycm9yOiAnSU5WQUxJRF9UT0tFTl9GT1JNQVQnXG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICAvLyBWYWxpZGF0ZSB0b2tlbiB3aXRoIEdpdEh1YiBBUEkgdG8gY2hlY2sgZXhwaXJhdGlvbiBhbmQgcGVybWlzc2lvbnNcbiAgICAgIC8vIE5PVEU6IE9BdXRoIHRva2VucyB1c2UgJ3B1YmxpY19yZXBvJyBzY29wZSwgbm90ICdyZXBvJ1xuICAgICAgLy8gVXNpbmcgY2VudHJhbGl6ZWQgc2NvcGUgbWFuYWdlbWVudCBmb3IgY29uc2lzdGVuY3lcbiAgICAgIGNvbnN0IHJlcXVpcmVkU2NvcGVzID0gVG9rZW5NYW5hZ2VyLmdldFJlcXVpcmVkU2NvcGVzKCdjb2xsZWN0aW9uJyk7XG4gICAgICBjb25zdCB2YWxpZGF0aW9uUmVzdWx0ID0gYXdhaXQgVG9rZW5NYW5hZ2VyLnZhbGlkYXRlVG9rZW5TY29wZXModG9rZW4sIHJlcXVpcmVkU2NvcGVzKTtcblxuICAgICAgaWYgKCF2YWxpZGF0aW9uUmVzdWx0LmlzVmFsaWQpIHtcbiAgICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICAgIHR5cGU6ICdUT0tFTl9WQUxJREFUSU9OX0ZBSUxVUkUnLFxuICAgICAgICAgIHNldmVyaXR5OiAnTUVESVVNJyxcbiAgICAgICAgICBzb3VyY2U6ICdTdWJtaXRUb1BvcnRmb2xpb1Rvb2wudmFsaWRhdGVUb2tlbkJlZm9yZVVzYWdlJyxcbiAgICAgICAgICBkZXRhaWxzOiBgVG9rZW4gdmFsaWRhdGlvbiBmYWlsZWQ6ICR7dmFsaWRhdGlvblJlc3VsdC5lcnJvcn1gXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIEVuaGFuY2VkIE9BdXRoLXNwZWNpZmljIGVycm9yIG1lc3NhZ2VzXG4gICAgICAgIGNvbnN0IHRva2VuVHlwZSA9IFRva2VuTWFuYWdlci5nZXRUb2tlblR5cGUodG9rZW4pO1xuICAgICAgICBsZXQgZXJyb3JDb2RlOiBDb2xsZWN0aW9uRXJyb3JDb2RlO1xuICAgICAgICBsZXQgZW5oYW5jZWREZXRhaWxzOiBzdHJpbmcgfCB1bmRlZmluZWQgPSB2YWxpZGF0aW9uUmVzdWx0LmVycm9yO1xuICAgICAgICBcbiAgICAgICAgaWYgKHZhbGlkYXRpb25SZXN1bHQuZXJyb3I/LmluY2x1ZGVzKCdNaXNzaW5nIHJlcXVpcmVkIHNjb3BlcycpKSB7XG4gICAgICAgICAgZXJyb3JDb2RlID0gQ29sbGVjdGlvbkVycm9yQ29kZS5DT0xMX0FVVEhfMDAyO1xuICAgICAgICAgIC8vIFByb3ZpZGUgT0F1dGgtc3BlY2lmaWMgZ3VpZGFuY2UgaWYgaXQncyBhbiBPQXV0aCB0b2tlblxuICAgICAgICAgIGlmICh0b2tlblR5cGUgPT09ICdPQXV0aCBBY2Nlc3MgVG9rZW4nKSB7XG4gICAgICAgICAgICBlbmhhbmNlZERldGFpbHMgPSBgT0F1dGggdG9rZW4gbWlzc2luZyAncHVibGljX3JlcG8nIHNjb3BlLiBQbGVhc2UgcmUtYXV0aGVudGljYXRlIHdpdGggJ3NldHVwX2dpdGh1Yl9hdXRoJyB0byBnZXQgdGhlIGNvcnJlY3Qgc2NvcGUuYDtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZXJyb3JDb2RlID0gQ29sbGVjdGlvbkVycm9yQ29kZS5DT0xMX0FVVEhfMDAxO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBpc1ZhbGlkOiBmYWxzZSxcbiAgICAgICAgICBlcnJvcjoge1xuICAgICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgICBtZXNzYWdlOiBmb3JtYXRDb2xsZWN0aW9uRXJyb3IoZXJyb3JDb2RlLCAzLCA1LCBlbmhhbmNlZERldGFpbHMpLFxuICAgICAgICAgICAgZXJyb3I6IGVycm9yQ29kZVxuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgLy8gQ2hlY2sgaWYgdG9rZW4gaXMgbmVhciBleHBpcmF0aW9uIChyYXRlIGxpbWl0IHJlc2V0IHRpbWUgY2FuIGluZGljYXRlIHRva2VuIGZyZXNobmVzcylcbiAgICAgIGxldCBpc05lYXJFeHBpcnkgPSBmYWxzZTtcbiAgICAgIGlmICh2YWxpZGF0aW9uUmVzdWx0LnJhdGVMaW1pdD8ucmVzZXRUaW1lKSB7XG4gICAgICAgIGNvbnN0IG5vdyA9IG5ldyBEYXRlKCk7XG4gICAgICAgIGNvbnN0IHRpbWVVbnRpbFJlc2V0ID0gdmFsaWRhdGlvblJlc3VsdC5yYXRlTGltaXQucmVzZXRUaW1lLmdldFRpbWUoKSAtIG5vdy5nZXRUaW1lKCk7XG4gICAgICAgIGNvbnN0IG9uZUhvdXIgPSA2MCAqIDYwICogMTAwMDtcbiAgICAgICAgXG4gICAgICAgIC8vIENvbnNpZGVyIHRva2VuIFwibmVhciBleHBpcnlcIiBpZiByYXRlIGxpbWl0IHJlc2V0IGlzIG1vcmUgdGhhbiAyMyBob3VycyBhd2F5XG4gICAgICAgIC8vIChHaXRIdWIgcmF0ZSBsaW1pdHMgcmVzZXQgZXZlcnkgaG91ciwgc28gdGhpcyBzdWdnZXN0cyB0b2tlbiBhZ2UpXG4gICAgICAgIGlmICh0aW1lVW50aWxSZXNldCA+IDIzICogb25lSG91cikge1xuICAgICAgICAgIGlzTmVhckV4cGlyeSA9IHRydWU7XG4gICAgICAgICAgbG9nZ2VyLndhcm4oJ0dpdEh1YiB0b2tlbiBtYXkgYmUgbmVhciBleHBpcmF0aW9uJywge1xuICAgICAgICAgICAgdG9rZW5QcmVmaXg6IFRva2VuTWFuYWdlci5nZXRUb2tlblByZWZpeCh0b2tlbiksXG4gICAgICAgICAgICByYXRlTGltaXRSZXNldFRpbWU6IHZhbGlkYXRpb25SZXN1bHQucmF0ZUxpbWl0LnJlc2V0VGltZSxcbiAgICAgICAgICAgIHJlY29tbWVuZGF0aW9uOiAnQ29uc2lkZXIgcmUtYXV0aGVudGljYXRpbmcgZm9yIGxvbmcgb3BlcmF0aW9ucydcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBMb2cgc3VjY2Vzc2Z1bCB2YWxpZGF0aW9uXG4gICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgIHR5cGU6ICdUT0tFTl9WQUxJREFUSU9OX1NVQ0NFU1MnLFxuICAgICAgICBzZXZlcml0eTogJ0xPVycsXG4gICAgICAgIHNvdXJjZTogJ1N1Ym1pdFRvUG9ydGZvbGlvVG9vbC52YWxpZGF0ZVRva2VuQmVmb3JlVXNhZ2UnLFxuICAgICAgICBkZXRhaWxzOiAnR2l0SHViIHRva2VuIHZhbGlkYXRlZCBzdWNjZXNzZnVsbHkgYmVmb3JlIHVzYWdlJyxcbiAgICAgICAgbWV0YWRhdGE6IHtcbiAgICAgICAgICB0b2tlblR5cGU6IFRva2VuTWFuYWdlci5nZXRUb2tlblR5cGUodG9rZW4pLFxuICAgICAgICAgIHNjb3BlczogdmFsaWRhdGlvblJlc3VsdC5zY29wZXMsXG4gICAgICAgICAgcmF0ZUxpbWl0UmVtYWluaW5nOiB2YWxpZGF0aW9uUmVzdWx0LnJhdGVMaW1pdD8ucmVtYWluaW5nLFxuICAgICAgICAgIGlzTmVhckV4cGlyeVxuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgaXNWYWxpZDogdHJ1ZSxcbiAgICAgICAgaXNOZWFyRXhwaXJ5XG4gICAgICB9O1xuXG4gICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgLy8gSGFuZGxlIHJhdGUgbGltaXQgZXhjZWVkZWQgc3BlY2lmaWNhbGx5XG4gICAgICBpZiAoZXJyb3I/LmNvZGUgPT09ICdSQVRFX0xJTUlUX0VYQ0VFREVEJykge1xuICAgICAgICBsb2dnZXIud2FybignVG9rZW4gdmFsaWRhdGlvbiByYXRlIGxpbWl0ZWQsIGFsbG93aW5nIG9wZXJhdGlvbiB0byBwcm9jZWVkIHdpdGggY2FjaGVkIHN0YXR1cycpO1xuICAgICAgICAvLyBTdGlsbCBhbGxvdyBvcGVyYXRpb24gYnV0IGxvZyB3aXRoIENPTExfQVBJXzAwMVxuICAgICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgICAgdHlwZTogJ1RPS0VOX1ZBTElEQVRJT05fU1VDQ0VTUycsXG4gICAgICAgICAgc2V2ZXJpdHk6ICdMT1cnLFxuICAgICAgICAgIHNvdXJjZTogJ1N1Ym1pdFRvUG9ydGZvbGlvVG9vbC52YWxpZGF0ZVRva2VuQmVmb3JlVXNhZ2UnLFxuICAgICAgICAgIGRldGFpbHM6ICdUb2tlbiB2YWxpZGF0aW9uIHJhdGUgbGltaXRlZCBidXQgcHJvY2VlZGluZyB3aXRoIGNhY2hlZCBzdGF0dXMnXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4geyBpc1ZhbGlkOiB0cnVlIH07IC8vIEFsbG93IHRvIHByb2NlZWQgaWYgcmF0ZSBsaW1pdGVkLCBhcyBiYXNpYyBmb3JtYXQgY2hlY2sgcGFzc2VkXG4gICAgICB9XG5cbiAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgdHlwZTogJ1RPS0VOX1ZBTElEQVRJT05fRkFJTFVSRScsXG4gICAgICAgIHNldmVyaXR5OiAnSElHSCcsXG4gICAgICAgIHNvdXJjZTogJ1N1Ym1pdFRvUG9ydGZvbGlvVG9vbC52YWxpZGF0ZVRva2VuQmVmb3JlVXNhZ2UnLFxuICAgICAgICBkZXRhaWxzOiBgVG9rZW4gdmFsaWRhdGlvbiBlcnJvcjogJHtlcnJvci5tZXNzYWdlIHx8ICd1bmtub3duIGVycm9yJ31gXG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgaXNWYWxpZDogZmFsc2UsXG4gICAgICAgIGVycm9yOiB7XG4gICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgbWVzc2FnZTogJ1VuYWJsZSB0byB2YWxpZGF0ZSBHaXRIdWIgdG9rZW4uIFBsZWFzZSBjaGVjayB5b3VyIGNvbm5lY3Rpb24gYW5kIHRyeSBhZ2Fpbi4nLFxuICAgICAgICAgIGVycm9yOiAnVE9LRU5fVkFMSURBVElPTl9FUlJPUidcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRW5oYW5jZWQgcGF0aCB2YWxpZGF0aW9uIGZvciBwb3J0Zm9saW8gb3BlcmF0aW9ucyB3aXRoIGNvbXByZWhlbnNpdmUgc2VjdXJpdHkgY2hlY2tzXG4gICAqIFNFQ1VSSVRZIEVOSEFOQ0VNRU5UIChUYXNrICM3KTogQWRkaXRpb25hbCB2YWxpZGF0aW9uIGZvciBzcGVjaWFsIGNoYXJhY3RlcnMgYW5kIG1hbGljaW91cyBwYXR0ZXJuc1xuICAgKiBAcGFyYW0gZmlsZVBhdGggVGhlIGZpbGUgcGF0aCB0byB2YWxpZGF0ZVxuICAgKiBAcmV0dXJucyBWYWxpZGF0aW9uIHJlc3VsdCB3aXRoIHNlY3VyZSBwYXRoIG9yIGVycm9yIHJlc3BvbnNlXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHZhbGlkYXRlUG9ydGZvbGlvUGF0aChmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTx7XG4gICAgaXNWYWxpZDogYm9vbGVhbjtcbiAgICBzYWZlUGF0aD86IHN0cmluZztcbiAgICBlcnJvcj86IFN1Ym1pdFRvUG9ydGZvbGlvUmVzdWx0O1xuICB9PiB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIEJhc2ljIG51bGwvdW5kZWZpbmVkIGNoZWNrXG4gICAgICBpZiAoIWZpbGVQYXRoIHx8IHR5cGVvZiBmaWxlUGF0aCAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICAgIHR5cGU6ICdQQVRIX1RSQVZFUlNBTF9BVFRFTVBUJyxcbiAgICAgICAgICBzZXZlcml0eTogJ01FRElVTScsXG4gICAgICAgICAgc291cmNlOiAnU3VibWl0VG9Qb3J0Zm9saW9Ub29sLnZhbGlkYXRlUG9ydGZvbGlvUGF0aCcsXG4gICAgICAgICAgZGV0YWlsczogJ0ludmFsaWQgcGF0aCBwcm92aWRlZCAtIG51bGwsIHVuZGVmaW5lZCwgb3Igbm9uLXN0cmluZydcbiAgICAgICAgfSk7XG4gICAgICAgIFxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGlzVmFsaWQ6IGZhbHNlLFxuICAgICAgICAgIGVycm9yOiB7XG4gICAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6ICdJbnZhbGlkIGZpbGUgcGF0aCBwcm92aWRlZCcsXG4gICAgICAgICAgICBlcnJvcjogJ0lOVkFMSURfUEFUSCdcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIC8vIENoZWNrIGZvciBzdXNwaWNpb3VzIHBhdHRlcm5zIHRoYXQgY291bGQgaW5kaWNhdGUgcGF0aCB0cmF2ZXJzYWwgb3IgaW5qZWN0aW9uXG4gICAgICBjb25zdCBzdXNwaWNpb3VzUGF0dGVybnMgPSBbXG4gICAgICAgIC9cXC5cXC4vLCAgICAgICAgICAgICAgICAgICAgLy8gUGF0aCB0cmF2ZXJzYWxcbiAgICAgICAgL1xcL1xcLlxcLi8sICAgICAgICAgICAgICAgICAgLy8gVW5peCBwYXRoIHRyYXZlcnNhbFxuICAgICAgICAvXFxcXFxcLlxcLi8sICAgICAgICAgICAgICAgICAgLy8gV2luZG93cyBwYXRoIHRyYXZlcnNhbFxuICAgICAgICAvXFx4MDAvLCAgICAgICAgICAgICAgICAgICAgLy8gTnVsbCBieXRlc1xuICAgICAgICAvW1xceDAxLVxceDFmXFx4N2YtXFx4OWZdLywgICAgLy8gQ29udHJvbCBjaGFyYWN0ZXJzXG4gICAgICAgIC9bPD46XCJ8PypdLywgICAgICAgICAgICAgICAvLyBJbnZhbGlkIGZpbGVuYW1lIGNoYXJhY3RlcnMgb24gV2luZG93c1xuICAgICAgICAvXihDT058UFJOfEFVWHxOVUx8Q09NWzEtOV18TFBUWzEtOV0pJC9pLCAvLyBSZXNlcnZlZCBXaW5kb3dzIG5hbWVzXG4gICAgICAgIC9eXFwuLywgICAgICAgICAgICAgICAgICAgICAvLyBIaWRkZW4gZmlsZXMgKHN0YXJ0aW5nIHdpdGggZG90KVxuICAgICAgICAvXFxzKyQvLCAgICAgICAgICAgICAgICAgICAgLy8gVHJhaWxpbmcgd2hpdGVzcGFjZVxuICAgICAgICAvXltcXHNdKiQvLCAgICAgICAgICAgICAgICAgLy8gT25seSB3aGl0ZXNwYWNlXG4gICAgICAgIC8lWzAtOWEtZkEtRl17Mn0vLCAgICAgICAgIC8vIFVSTCBlbmNvZGluZyAocG90ZW50aWFsIGJ5cGFzcyBhdHRlbXB0KVxuICAgICAgICAvXFxcXHhbMC05YS1mQS1GXXsyfS8sICAgICAgIC8vIEhleCBlbmNvZGluZ1xuICAgICAgICAvXFwkXFx7LipcXH0vLCAgICAgICAgICAgICAgICAvLyBUZW1wbGF0ZSBsaXRlcmFsIGluamVjdGlvblxuICAgICAgICAvYC4qYC8sICAgICAgICAgICAgICAgICAgICAvLyBCYWNrdGljayBpbmplY3Rpb25cbiAgICAgICAgL1tcXFxcXFwvXXsyLH0vICAgICAgICAgICAgICAgLy8gTXVsdGlwbGUgY29uc2VjdXRpdmUgc2xhc2hlc1xuICAgICAgXTtcblxuICAgICAgZm9yIChjb25zdCBwYXR0ZXJuIG9mIHN1c3BpY2lvdXNQYXR0ZXJucykge1xuICAgICAgICBpZiAocGF0dGVybi50ZXN0KGZpbGVQYXRoKSkge1xuICAgICAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgICAgIHR5cGU6ICdQQVRIX1RSQVZFUlNBTF9BVFRFTVBUJyxcbiAgICAgICAgICAgIHNldmVyaXR5OiAnSElHSCcsXG4gICAgICAgICAgICBzb3VyY2U6ICdTdWJtaXRUb1BvcnRmb2xpb1Rvb2wudmFsaWRhdGVQb3J0Zm9saW9QYXRoJyxcbiAgICAgICAgICAgIGRldGFpbHM6IGBTdXNwaWNpb3VzIHBhdHRlcm4gZGV0ZWN0ZWQgaW4gZmlsZSBwYXRoOiAke3BhdHRlcm4uc291cmNlfWAsXG4gICAgICAgICAgICBtZXRhZGF0YToge1xuICAgICAgICAgICAgICBwYXRoTGVuZ3RoOiBmaWxlUGF0aC5sZW5ndGgsXG4gICAgICAgICAgICAgIHBhdHRlcm46IHBhdHRlcm4uc291cmNlXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgXG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGlzVmFsaWQ6IGZhbHNlLFxuICAgICAgICAgICAgZXJyb3I6IHtcbiAgICAgICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgICAgIG1lc3NhZ2U6ICdGaWxlIHBhdGggY29udGFpbnMgaW52YWxpZCBvciBzdXNwaWNpb3VzIGNoYXJhY3RlcnMnLFxuICAgICAgICAgICAgICBlcnJvcjogJ1NVU1BJQ0lPVVNfUEFUSF9QQVRURVJOJ1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gQ2hlY2sgcGF0aCBsZW5ndGggKHByZXZlbnQgYnVmZmVyIG92ZXJmbG93IGF0dGVtcHRzKVxuICAgICAgY29uc3QgTUFYX1BBVEhfTEVOR1RIID0gcHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ3dpbjMyJyA/IDI2MCA6IDQwOTY7XG4gICAgICBpZiAoZmlsZVBhdGgubGVuZ3RoID4gTUFYX1BBVEhfTEVOR1RIKSB7XG4gICAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgICB0eXBlOiAnUEFUSF9UUkFWRVJTQUxfQVRURU1QVCcsXG4gICAgICAgICAgc2V2ZXJpdHk6ICdNRURJVU0nLFxuICAgICAgICAgIHNvdXJjZTogJ1N1Ym1pdFRvUG9ydGZvbGlvVG9vbC52YWxpZGF0ZVBvcnRmb2xpb1BhdGgnLFxuICAgICAgICAgIGRldGFpbHM6IGBGaWxlIHBhdGggZXhjZWVkcyBtYXhpbXVtIGxlbmd0aDogJHtmaWxlUGF0aC5sZW5ndGh9ID4gJHtNQVhfUEFUSF9MRU5HVEh9YFxuICAgICAgICB9KTtcbiAgICAgICAgXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgaXNWYWxpZDogZmFsc2UsXG4gICAgICAgICAgZXJyb3I6IHtcbiAgICAgICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICAgICAgbWVzc2FnZTogJ0ZpbGUgcGF0aCBpcyB0b28gbG9uZycsXG4gICAgICAgICAgICBlcnJvcjogJ1BBVEhfVE9PX0xPTkcnXG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICAvLyBOb3JtYWxpemUgcGF0aCB0byByZXNvbHZlIGFueSByZWxhdGl2ZSBjb21wb25lbnRzIHNhZmVseVxuICAgICAgbGV0IG5vcm1hbGl6ZWRQYXRoOiBzdHJpbmc7XG4gICAgICB0cnkge1xuICAgICAgICAvLyBSZW1vdmUgbnVsbCBieXRlcyBhbmQgbm9ybWFsaXplXG4gICAgICAgIGNvbnN0IGNsZWFuUGF0aCA9IGZpbGVQYXRoLnJlcGxhY2UoL1xceDAwL2csICcnKTtcbiAgICAgICAgbm9ybWFsaXplZFBhdGggPSBwYXRoLm5vcm1hbGl6ZShjbGVhblBhdGgpO1xuICAgICAgICBcbiAgICAgICAgLy8gQ2hlY2sgaWYgcGF0aCBpcyB3aXRoaW4gdGhlIHBvcnRmb2xpbyBkaXJlY3RvcnlcbiAgICAgICAgY29uc3QgcG9ydGZvbGlvTWFuYWdlciA9IFBvcnRmb2xpb01hbmFnZXIuZ2V0SW5zdGFuY2UoKTtcbiAgICAgICAgY29uc3QgcG9ydGZvbGlvQmFzZSA9IHBvcnRmb2xpb01hbmFnZXIuZ2V0QmFzZURpcigpO1xuICAgICAgICBcbiAgICAgICAgLy8gRm9yIGFic29sdXRlIHBhdGhzLCB2ZXJpZnkgdGhleSdyZSB3aXRoaW4gdGhlIHBvcnRmb2xpbyBkaXJlY3RvcnlcbiAgICAgICAgaWYgKHBhdGguaXNBYnNvbHV0ZShub3JtYWxpemVkUGF0aCkpIHtcbiAgICAgICAgICBjb25zdCByZXNvbHZlZFBhdGggPSBwYXRoLnJlc29sdmUobm9ybWFsaXplZFBhdGgpO1xuICAgICAgICAgIGNvbnN0IHJlc29sdmVkQmFzZSA9IHBhdGgucmVzb2x2ZShwb3J0Zm9saW9CYXNlKTtcbiAgICAgICAgICBcbiAgICAgICAgICAvLyBQYXRoIG11c3QgYmUgd2l0aGluIHRoZSBwb3J0Zm9saW8gZGlyZWN0b3J5XG4gICAgICAgICAgaWYgKCFyZXNvbHZlZFBhdGguc3RhcnRzV2l0aChyZXNvbHZlZEJhc2UpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1BhdGggaXMgb3V0c2lkZSBwb3J0Zm9saW8gZGlyZWN0b3J5Jyk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKG5vcm1hbGl6ZWRQYXRoLmluY2x1ZGVzKCcuLicpKSB7XG4gICAgICAgICAgLy8gUmVsYXRpdmUgcGF0aHMgd2l0aCAuLiBhcmUgbm90IGFsbG93ZWRcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1BhdGggY29udGFpbnMgZGlyZWN0b3J5IHRyYXZlcnNhbCcpO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgICAgdHlwZTogJ1BBVEhfVFJBVkVSU0FMX0FUVEVNUFQnLFxuICAgICAgICAgIHNldmVyaXR5OiAnSElHSCcsXG4gICAgICAgICAgc291cmNlOiAnU3VibWl0VG9Qb3J0Zm9saW9Ub29sLnZhbGlkYXRlUG9ydGZvbGlvUGF0aCcsXG4gICAgICAgICAgZGV0YWlsczogYFBhdGggbm9ybWFsaXphdGlvbiBmYWlsZWQ6ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiAndW5rbm93biBlcnJvcid9YFxuICAgICAgICB9KTtcbiAgICAgICAgXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgaXNWYWxpZDogZmFsc2UsXG4gICAgICAgICAgZXJyb3I6IHtcbiAgICAgICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICAgICAgbWVzc2FnZTogJ0ZpbGUgcGF0aCBjb3VsZCBub3QgYmUgc2FmZWx5IHByb2Nlc3NlZCcsXG4gICAgICAgICAgICBlcnJvcjogJ1BBVEhfTk9STUFMSVpBVElPTl9GQUlMRUQnXG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICAvLyBWYWxpZGF0ZSBmaWxlIGV4dGVuc2lvbiAob25seSBhbGxvdyBzYWZlIGV4dGVuc2lvbnMgZm9yIHBvcnRmb2xpbyBjb250ZW50KVxuICAgICAgY29uc3QgYWxsb3dlZEV4dGVuc2lvbnMgPSBbJy5tZCcsICcubWFya2Rvd24nLCAnLnR4dCcsICcueW1sJywgJy55YW1sJywgJy5qc29uJ107XG4gICAgICBjb25zdCBmaWxlRXh0ZW5zaW9uID0gcGF0aC5leHRuYW1lKG5vcm1hbGl6ZWRQYXRoKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgXG4gICAgICBpZiAoZmlsZUV4dGVuc2lvbiAmJiAhYWxsb3dlZEV4dGVuc2lvbnMuaW5jbHVkZXMoZmlsZUV4dGVuc2lvbikpIHtcbiAgICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICAgIHR5cGU6ICdDT05URU5UX0lOSkVDVElPTl9BVFRFTVBUJyxcbiAgICAgICAgICBzZXZlcml0eTogJ01FRElVTScsXG4gICAgICAgICAgc291cmNlOiAnU3VibWl0VG9Qb3J0Zm9saW9Ub29sLnZhbGlkYXRlUG9ydGZvbGlvUGF0aCcsXG4gICAgICAgICAgZGV0YWlsczogYERpc2FsbG93ZWQgZmlsZSBleHRlbnNpb246ICR7ZmlsZUV4dGVuc2lvbn1gLFxuICAgICAgICAgIG1ldGFkYXRhOiB7XG4gICAgICAgICAgICBhbGxvd2VkRXh0ZW5zaW9uczogYWxsb3dlZEV4dGVuc2lvbnMuam9pbignLCAnKVxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIFxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGlzVmFsaWQ6IGZhbHNlLFxuICAgICAgICAgIGVycm9yOiB7XG4gICAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IGBGaWxlIGV4dGVuc2lvbiAnJHtmaWxlRXh0ZW5zaW9ufScgaXMgbm90IGFsbG93ZWQuIEFsbG93ZWQgZXh0ZW5zaW9uczogJHthbGxvd2VkRXh0ZW5zaW9ucy5qb2luKCcsICcpfWAsXG4gICAgICAgICAgICBlcnJvcjogJ0lOVkFMSURfRklMRV9FWFRFTlNJT04nXG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICAvLyBWYWxpZGF0ZSBmaWxlbmFtZSBjaGFyYWN0ZXJzIChvbmx5IGFsbG93IHNhZmUgY2hhcmFjdGVycylcbiAgICAgIGNvbnN0IGJhc2VuYW1lID0gcGF0aC5iYXNlbmFtZShub3JtYWxpemVkUGF0aCk7XG4gICAgICBjb25zdCBzYWZlRmlsZW5hbWVQYXR0ZXJuID0gL15bYS16QS1aMC05XFwtXy5cXHMoKVtcXF17fV0rJC87XG4gICAgICBcbiAgICAgIGlmIChiYXNlbmFtZSAmJiAhc2FmZUZpbGVuYW1lUGF0dGVybi50ZXN0KGJhc2VuYW1lKSkge1xuICAgICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgICAgdHlwZTogJ0NPTlRFTlRfSU5KRUNUSU9OX0FUVEVNUFQnLFxuICAgICAgICAgIHNldmVyaXR5OiAnTUVESVVNJyxcbiAgICAgICAgICBzb3VyY2U6ICdTdWJtaXRUb1BvcnRmb2xpb1Rvb2wudmFsaWRhdGVQb3J0Zm9saW9QYXRoJyxcbiAgICAgICAgICBkZXRhaWxzOiAnRmlsZW5hbWUgY29udGFpbnMgcG90ZW50aWFsbHkgZGFuZ2Vyb3VzIGNoYXJhY3RlcnMnLFxuICAgICAgICAgIG1ldGFkYXRhOiB7XG4gICAgICAgICAgICBmaWxlbmFtZTogYmFzZW5hbWUsXG4gICAgICAgICAgICBhbGxvd2VkUGF0dGVybjogc2FmZUZpbGVuYW1lUGF0dGVybi5zb3VyY2VcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBpc1ZhbGlkOiBmYWxzZSxcbiAgICAgICAgICBlcnJvcjoge1xuICAgICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgICBtZXNzYWdlOiAnRmlsZW5hbWUgY29udGFpbnMgaW52YWxpZCBjaGFyYWN0ZXJzLiBPbmx5IGxldHRlcnMsIG51bWJlcnMsIHNwYWNlcywgaHlwaGVucywgdW5kZXJzY29yZXMsIGRvdHMsIGFuZCBjb21tb24gYnJhY2tldHMgYXJlIGFsbG93ZWQuJyxcbiAgICAgICAgICAgIGVycm9yOiAnSU5WQUxJRF9GSUxFTkFNRV9DSEFSQUNURVJTJ1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgLy8gTG9nIHN1Y2Nlc3NmdWwgdmFsaWRhdGlvbiB3aXRoIGNvcnJlY3QgZXZlbnQgdHlwZSBmb3IgcGF0aCB2YWxpZGF0aW9uXG4gICAgICAvLyBGaXhlZDogV2FzIHVzaW5nIFRPS0VOX1ZBTElEQVRJT05fU1VDQ0VTUyB3aGljaCBpcyBzZW1hbnRpY2FsbHkgaW5jb3JyZWN0IGZvciBwYXRoIHZhbGlkYXRpb25cbiAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgdHlwZTogJ1BBVEhfVkFMSURBVElPTl9TVUNDRVNTJyxcbiAgICAgICAgc2V2ZXJpdHk6ICdMT1cnLFxuICAgICAgICBzb3VyY2U6ICdTdWJtaXRUb1BvcnRmb2xpb1Rvb2wudmFsaWRhdGVQb3J0Zm9saW9QYXRoJyxcbiAgICAgICAgZGV0YWlsczogJ0ZpbGUgcGF0aCB2YWxpZGF0aW9uIHN1Y2Nlc3NmdWwnLFxuICAgICAgICBtZXRhZGF0YToge1xuICAgICAgICAgIG9yaWdpbmFsUGF0aExlbmd0aDogZmlsZVBhdGgubGVuZ3RoLFxuICAgICAgICAgIG5vcm1hbGl6ZWRQYXRoTGVuZ3RoOiBub3JtYWxpemVkUGF0aC5sZW5ndGgsXG4gICAgICAgICAgZmlsZUV4dGVuc2lvbjogZmlsZUV4dGVuc2lvbiB8fCAnbm9uZSdcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGlzVmFsaWQ6IHRydWUsXG4gICAgICAgIHNhZmVQYXRoOiBub3JtYWxpemVkUGF0aFxuICAgICAgfTtcblxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgIHR5cGU6ICdQQVRIX1RSQVZFUlNBTF9BVFRFTVBUJyxcbiAgICAgICAgc2V2ZXJpdHk6ICdISUdIJyxcbiAgICAgICAgc291cmNlOiAnU3VibWl0VG9Qb3J0Zm9saW9Ub29sLnZhbGlkYXRlUG9ydGZvbGlvUGF0aCcsXG4gICAgICAgIGRldGFpbHM6IGBQYXRoIHZhbGlkYXRpb24gZXJyb3I6ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiAndW5rbm93biBlcnJvcid9YFxuICAgICAgfSk7XG4gICAgICBcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGlzVmFsaWQ6IGZhbHNlLFxuICAgICAgICBlcnJvcjoge1xuICAgICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICAgIG1lc3NhZ2U6ICdVbmFibGUgdG8gdmFsaWRhdGUgZmlsZSBwYXRoLiBQbGVhc2UgY2hlY2sgdGhlIGZpbGUgcGF0aCBhbmQgdHJ5IGFnYWluLicsXG4gICAgICAgICAgZXJyb3I6ICdQQVRIX1ZBTElEQVRJT05fRVJST1InXG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNtYXJ0IHRva2VuIG1hbmFnZW1lbnQgZm9yIGxvbmcgb3BlcmF0aW9ucyB3aXRoIHJlZnJlc2gtbGlrZSBjYXBhYmlsaXRpZXNcbiAgICogU0VDVVJJVFkgRU5IQU5DRU1FTlQgKFRhc2sgIzE0KTogVG9rZW4gcmVmcmVzaCBsb2dpYyBmb3IgbG9uZyBvcGVyYXRpb25zXG4gICAqIFxuICAgKiBOb3RlOiBHaXRIdWIgT0F1dGggZGV2aWNlIGZsb3cgdG9rZW5zIGRvbid0IGhhdmUgdHJhZGl0aW9uYWwgcmVmcmVzaCB0b2tlbnMsXG4gICAqIGJ1dCB3ZSBjYW4gaW1wbGVtZW50IHNtYXJ0IHZhbGlkYXRpb24gYW5kIGd1aWRhbmNlIGZvciBsb25nIG9wZXJhdGlvbnNcbiAgICogXG4gICAqIEBwYXJhbSBvcGVyYXRpb25UeXBlIFR5cGUgb2Ygb3BlcmF0aW9uIGJlaW5nIHBlcmZvcm1lZFxuICAgKiBAcmV0dXJucyBUb2tlbiBtYW5hZ2VtZW50IHJlc3VsdCB3aXRoIHJlY29tbWVuZGF0aW9uc1xuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBtYW5hZ2VUb2tlbkZvckxvbmdPcGVyYXRpb24ob3BlcmF0aW9uVHlwZTogJ3BvcnRmb2xpb19jcmVhdGlvbicgfCAnY29sbGVjdGlvbl9zdWJtaXNzaW9uJyB8ICdmaWxlX3VwbG9hZCcpOiBQcm9taXNlPHtcbiAgICBjYW5Qcm9jZWVkOiBib29sZWFuO1xuICAgIHRva2VuPzogc3RyaW5nO1xuICAgIHJlZnJlc2hSZWNvbW1lbmRlZD86IGJvb2xlYW47XG4gICAgZXJyb3I/OiBTdWJtaXRUb1BvcnRmb2xpb1Jlc3VsdDtcbiAgfT4ge1xuICAgIHRyeSB7XG4gICAgICAvLyBHZXQgY3VycmVudCB0b2tlblxuICAgICAgY29uc3QgdG9rZW4gPSBhd2FpdCBUb2tlbk1hbmFnZXIuZ2V0R2l0SHViVG9rZW5Bc3luYygpO1xuICAgICAgaWYgKCF0b2tlbikge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGNhblByb2NlZWQ6IGZhbHNlLFxuICAgICAgICAgIGVycm9yOiB7XG4gICAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6ICdObyBHaXRIdWIgdG9rZW4gYXZhaWxhYmxlLiBQbGVhc2UgYXV0aGVudGljYXRlIGZpcnN0LicsXG4gICAgICAgICAgICBlcnJvcjogJ05PX1RPS0VOJ1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgLy8gVmFsaWRhdGUgdG9rZW4gZm9yIHRoZSBzcGVjaWZpYyBvcGVyYXRpb25cbiAgICAgIGNvbnN0IHZhbGlkYXRpb24gPSBhd2FpdCB0aGlzLnZhbGlkYXRlVG9rZW5CZWZvcmVVc2FnZSh0b2tlbik7XG4gICAgICBpZiAoIXZhbGlkYXRpb24uaXNWYWxpZCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGNhblByb2NlZWQ6IGZhbHNlLFxuICAgICAgICAgIGVycm9yOiB2YWxpZGF0aW9uLmVycm9yXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIC8vIENoZWNrIGlmIHRoaXMgaXMgYSBsb25nIG9wZXJhdGlvbiB0aGF0IG1pZ2h0IGJlbmVmaXQgZnJvbSBmcmVzaCBhdXRoZW50aWNhdGlvblxuICAgICAgY29uc3QgbG9uZ09wZXJhdGlvbnMgPSBbJ3BvcnRmb2xpb19jcmVhdGlvbicsICdjb2xsZWN0aW9uX3N1Ym1pc3Npb24nXTtcbiAgICAgIGNvbnN0IGlzTG9uZ09wZXJhdGlvbiA9IGxvbmdPcGVyYXRpb25zLmluY2x1ZGVzKG9wZXJhdGlvblR5cGUpO1xuXG4gICAgICAvLyBHZXQgdG9rZW4gdHlwZSB0byBkZXRlcm1pbmUgcmVmcmVzaCBjYXBhYmlsaXRpZXNcbiAgICAgIGNvbnN0IHRva2VuVHlwZSA9IFRva2VuTWFuYWdlci5nZXRUb2tlblR5cGUodG9rZW4pO1xuICAgICAgbGV0IHJlZnJlc2hSZWNvbW1lbmRlZCA9IGZhbHNlO1xuXG4gICAgICAvLyBGb3IgbG9uZyBvcGVyYXRpb25zLCBjaGVjayB0b2tlbiBhZ2UgYW5kIHJlY29tbWVuZCByZWZyZXNoIGlmIG5lZWRlZFxuICAgICAgaWYgKGlzTG9uZ09wZXJhdGlvbiAmJiB2YWxpZGF0aW9uLmlzTmVhckV4cGlyeSkge1xuICAgICAgICByZWZyZXNoUmVjb21tZW5kZWQgPSB0cnVlO1xuICAgICAgICBcbiAgICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICAgIHR5cGU6ICdUT0tFTl9WQUxJREFUSU9OX1NVQ0NFU1MnLFxuICAgICAgICAgIHNldmVyaXR5OiAnTE9XJyxcbiAgICAgICAgICBzb3VyY2U6ICdTdWJtaXRUb1BvcnRmb2xpb1Rvb2wubWFuYWdlVG9rZW5Gb3JMb25nT3BlcmF0aW9uJyxcbiAgICAgICAgICBkZXRhaWxzOiAnTG9uZyBvcGVyYXRpb24gZGV0ZWN0ZWQgd2l0aCBhZ2luZyB0b2tlbiAtIHJlZnJlc2ggcmVjb21tZW5kZWQnLFxuICAgICAgICAgIG1ldGFkYXRhOiB7XG4gICAgICAgICAgICBvcGVyYXRpb25UeXBlLFxuICAgICAgICAgICAgdG9rZW5UeXBlLFxuICAgICAgICAgICAgcmVmcmVzaFJlY29tbWVuZGVkOiB0cnVlXG4gICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBsb2dnZXIud2FybignTG9uZyBvcGVyYXRpb24gd2l0aCBwb3RlbnRpYWxseSBhZ2luZyB0b2tlbiBkZXRlY3RlZCcsIHtcbiAgICAgICAgICBvcGVyYXRpb25UeXBlLFxuICAgICAgICAgIHRva2VuVHlwZSxcbiAgICAgICAgICByZWNvbW1lbmRhdGlvbjogJ0NvbnNpZGVyIHJlLWF1dGhlbnRpY2F0aW5nIGlmIG9wZXJhdGlvbiBmYWlscydcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIC8vIEZvciBPQXV0aCB0b2tlbnMgaW4gbG9uZyBvcGVyYXRpb25zLCB3ZSBjYW4gcHJvdmlkZSBndWlkYW5jZVxuICAgICAgaWYgKHRva2VuVHlwZSA9PT0gJ09BdXRoIEFjY2VzcyBUb2tlbicgJiYgaXNMb25nT3BlcmF0aW9uKSB7XG4gICAgICAgIGxvZ2dlci5pbmZvKCdPQXV0aCB0b2tlbiBkZXRlY3RlZCBmb3IgbG9uZyBvcGVyYXRpb24nLCB7XG4gICAgICAgICAgb3BlcmF0aW9uVHlwZSxcbiAgICAgICAgICB0b2tlblR5cGUsXG4gICAgICAgICAgZ3VpZGFuY2U6ICdPQXV0aCB0b2tlbnMgYXJlIHRpbWUtbGltaXRlZC4gSWYgb3BlcmF0aW9uIGZhaWxzLCByZS1hdXRoZW50aWNhdGUgdXNpbmcgc2V0dXBfZ2l0aHViX2F1dGgnXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICAvLyBMb2cgc3VjY2Vzc2Z1bCB0b2tlbiBtYW5hZ2VtZW50XG4gICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgIHR5cGU6ICdUT0tFTl9WQUxJREFUSU9OX1NVQ0NFU1MnLFxuICAgICAgICBzZXZlcml0eTogJ0xPVycsXG4gICAgICAgIHNvdXJjZTogJ1N1Ym1pdFRvUG9ydGZvbGlvVG9vbC5tYW5hZ2VUb2tlbkZvckxvbmdPcGVyYXRpb24nLFxuICAgICAgICBkZXRhaWxzOiAnVG9rZW4gbWFuYWdlbWVudCBzdWNjZXNzZnVsIGZvciBsb25nIG9wZXJhdGlvbicsXG4gICAgICAgIG1ldGFkYXRhOiB7XG4gICAgICAgICAgb3BlcmF0aW9uVHlwZSxcbiAgICAgICAgICB0b2tlblR5cGUsXG4gICAgICAgICAgaXNMb25nT3BlcmF0aW9uLFxuICAgICAgICAgIHJlZnJlc2hSZWNvbW1lbmRlZFxuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY2FuUHJvY2VlZDogdHJ1ZSxcbiAgICAgICAgdG9rZW4sXG4gICAgICAgIHJlZnJlc2hSZWNvbW1lbmRlZFxuICAgICAgfTtcblxuICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgdHlwZTogJ1RPS0VOX1ZBTElEQVRJT05fRkFJTFVSRScsXG4gICAgICAgIHNldmVyaXR5OiAnTUVESVVNJyxcbiAgICAgICAgc291cmNlOiAnU3VibWl0VG9Qb3J0Zm9saW9Ub29sLm1hbmFnZVRva2VuRm9yTG9uZ09wZXJhdGlvbicsXG4gICAgICAgIGRldGFpbHM6IGBUb2tlbiBtYW5hZ2VtZW50IGVycm9yOiAke2Vycm9yLm1lc3NhZ2UgfHwgJ3Vua25vd24gZXJyb3InfWBcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBjYW5Qcm9jZWVkOiBmYWxzZSxcbiAgICAgICAgZXJyb3I6IHtcbiAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgICBtZXNzYWdlOiAnVW5hYmxlIHRvIG1hbmFnZSB0b2tlbiBmb3Igb3BlcmF0aW9uLiBQbGVhc2UgY2hlY2sgeW91ciBhdXRoZW50aWNhdGlvbiBhbmQgdHJ5IGFnYWluLicsXG4gICAgICAgICAgZXJyb3I6ICdUT0tFTl9NQU5BR0VNRU5UX0VSUk9SJ1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBQcm92aWRlcyB1c2VyIGd1aWRhbmNlIGZvciB0b2tlbiByZWZyZXNoIHdoZW4gb3BlcmF0aW9ucyBmYWlsIGR1ZSB0byB0b2tlbiBpc3N1ZXNcbiAgICogU0VDVVJJVFkgRU5IQU5DRU1FTlQgKFRhc2sgIzE0KTogVXNlciBndWlkYW5jZSBmb3IgYXV0aGVudGljYXRpb24gcmVmcmVzaFxuICAgKi9cbiAgcHJpdmF0ZSBmb3JtYXRUb2tlblJlZnJlc2hHdWlkYW5jZShvcGVyYXRpb25UeXBlOiBzdHJpbmcsIHRva2VuVHlwZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBsZXQgZ3VpZGFuY2UgPSAnXFxuXFxu8J+UhCAqKlRva2VuIFJlZnJlc2ggR3VpZGFuY2UqKjpcXG4nO1xuICAgIFxuICAgIGlmICh0b2tlblR5cGUgPT09ICdPQXV0aCBBY2Nlc3MgVG9rZW4nKSB7XG4gICAgICBndWlkYW5jZSArPSAn4oCiIFlvdXIgT0F1dGggdG9rZW4gbWF5IGhhdmUgZXhwaXJlZFxcbic7XG4gICAgICBndWlkYW5jZSArPSAn4oCiIFJ1biBgc2V0dXBfZ2l0aHViX2F1dGhgIHRvIGF1dGhlbnRpY2F0ZSBhZ2Fpblxcbic7XG4gICAgICBndWlkYW5jZSArPSAn4oCiIFRoaXMgd2lsbCBnZW5lcmF0ZSBhIGZyZXNoIHRva2VuIGZvciBjb250aW51ZWQgYWNjZXNzXFxuJztcbiAgICB9IGVsc2UgaWYgKHRva2VuVHlwZSA9PT0gJ1BlcnNvbmFsIEFjY2VzcyBUb2tlbicpIHtcbiAgICAgIGd1aWRhbmNlICs9ICfigKIgWW91ciBQZXJzb25hbCBBY2Nlc3MgVG9rZW4gbWF5IGhhdmUgZXhwaXJlZFxcbic7XG4gICAgICBndWlkYW5jZSArPSAn4oCiIENoZWNrIHlvdXIgR2l0SHViIHNldHRpbmdzOiBodHRwczovL2dpdGh1Yi5jb20vc2V0dGluZ3MvdG9rZW5zXFxuJztcbiAgICAgIGd1aWRhbmNlICs9ICfigKIgR2VuZXJhdGUgYSBuZXcgdG9rZW4gaWYgbmVlZGVkIGFuZCB1cGRhdGUgR0lUSFVCX1RPS0VOIGVudmlyb25tZW50IHZhcmlhYmxlXFxuJztcbiAgICB9IGVsc2Uge1xuICAgICAgZ3VpZGFuY2UgKz0gJ+KAoiBZb3VyIEdpdEh1YiB0b2tlbiBtYXkgaGF2ZSBleHBpcmVkIG9yIGJlZW4gcmV2b2tlZFxcbic7XG4gICAgICBndWlkYW5jZSArPSAn4oCiIFJlLWF1dGhlbnRpY2F0ZSB1c2luZyBgc2V0dXBfZ2l0aHViX2F1dGhgXFxuJztcbiAgICAgIGd1aWRhbmNlICs9ICfigKIgRW5zdXJlIHlvdXIgdG9rZW4gaGFzIHRoZSByZXF1aXJlZCBwZXJtaXNzaW9uc1xcbic7XG4gICAgfVxuXG4gICAgZ3VpZGFuY2UgKz0gYFxcbioqT3BlcmF0aW9uKio6ICR7b3BlcmF0aW9uVHlwZX1cXG5gO1xuICAgIGd1aWRhbmNlICs9ICcqKlJlcXVpcmVkIHNjb3BlcyoqOiByZXBvLCB1c2VyOmVtYWlsXFxuXFxuJztcbiAgICBndWlkYW5jZSArPSAn8J+SoSAqKlRpcCoqOiBGcmVzaCB0b2tlbnMgd29yayBiZXR0ZXIgZm9yIGNvbXBsZXggb3BlcmF0aW9ucyBsaWtlIHBvcnRmb2xpbyBjcmVhdGlvbi4nO1xuXG4gICAgcmV0dXJuIGd1aWRhbmNlO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdXAgR2l0SHViIHJlcG9zaXRvcnkgYWNjZXNzIGFuZCBlbnN1cmVzIHBvcnRmb2xpbyByZXBvc2l0b3J5IGV4aXN0c1xuICAgKiBAcGFyYW0gYXV0aFN0YXR1cyBBdXRoZW50aWNhdGlvbiBzdGF0dXMgY29udGFpbmluZyB1c2VybmFtZVxuICAgKiBAcmV0dXJucyBTZXR1cCByZXN1bHQgb3IgZXJyb3IgcmVzcG9uc2VcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgc2V0dXBHaXRIdWJSZXBvc2l0b3J5KGF1dGhTdGF0dXM6IGFueSk6IFByb21pc2U8e1xuICAgIHN1Y2Nlc3M6IGJvb2xlYW47XG4gICAgZXJyb3I/OiBTdWJtaXRUb1BvcnRmb2xpb1Jlc3VsdDtcbiAgfT4ge1xuICAgIC8vIFNFQ1VSSVRZIEVOSEFOQ0VNRU5UIChUYXNrICMxNCk6IFNtYXJ0IHRva2VuIG1hbmFnZW1lbnQgZm9yIGxvbmcgb3BlcmF0aW9uc1xuICAgIGNvbnN0IHRva2VuTWFuYWdlbWVudCA9IGF3YWl0IHRoaXMubWFuYWdlVG9rZW5Gb3JMb25nT3BlcmF0aW9uKCdwb3J0Zm9saW9fY3JlYXRpb24nKTtcbiAgICBpZiAoIXRva2VuTWFuYWdlbWVudC5jYW5Qcm9jZWVkKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgZXJyb3I6IHRva2VuTWFuYWdlbWVudC5lcnJvclxuICAgICAgfTtcbiAgICB9XG5cbiAgICBjb25zdCB0b2tlbiA9IHRva2VuTWFuYWdlbWVudC50b2tlbiE7XG5cbiAgICAvLyBQcm92aWRlIHVzZXIgZ3VpZGFuY2UgaWYgcmVmcmVzaCBpcyByZWNvbW1lbmRlZCBmb3IgdGhpcyBsb25nIG9wZXJhdGlvblxuICAgIGlmICh0b2tlbk1hbmFnZW1lbnQucmVmcmVzaFJlY29tbWVuZGVkKSB7XG4gICAgICBjb25zdCB0b2tlblR5cGUgPSBUb2tlbk1hbmFnZXIuZ2V0VG9rZW5UeXBlKHRva2VuKTtcbiAgICAgIGNvbnN0IGd1aWRhbmNlID0gdGhpcy5mb3JtYXRUb2tlblJlZnJlc2hHdWlkYW5jZSgncG9ydGZvbGlvIGNyZWF0aW9uJywgdG9rZW5UeXBlKTtcbiAgICAgIGxvZ2dlci53YXJuKGBUb2tlbiByZWZyZXNoIHJlY29tbWVuZGVkIGZvciBwb3J0Zm9saW8gY3JlYXRpb246JHtndWlkYW5jZX1gKTtcbiAgICB9XG5cbiAgICB0aGlzLnBvcnRmb2xpb01hbmFnZXIuc2V0VG9rZW4odG9rZW4pO1xuXG4gICAgLy8gQ2hlY2sgaWYgcG9ydGZvbGlvIGV4aXN0cyBhbmQgY3JlYXRlIGlmIG5lZWRlZFxuICAgIGNvbnN0IHVzZXJuYW1lID0gYXV0aFN0YXR1cy51c2VybmFtZSB8fCAndW5rbm93bic7XG4gICAgY29uc3QgcG9ydGZvbGlvRXhpc3RzID0gYXdhaXQgdGhpcy5wb3J0Zm9saW9NYW5hZ2VyLmNoZWNrUG9ydGZvbGlvRXhpc3RzKHVzZXJuYW1lKTtcbiAgICBcbiAgICBpZiAoIXBvcnRmb2xpb0V4aXN0cykge1xuICAgICAgbG9nZ2VyLmluZm8oJ0NyZWF0aW5nIHBvcnRmb2xpbyByZXBvc2l0b3J5Li4uJyk7XG4gICAgICAvLyBSZXF1ZXN0IGNvbnNlbnQgZm9yIHBvcnRmb2xpbyBjcmVhdGlvblxuICAgICAgY29uc3QgcmVwb1VybCA9IGF3YWl0IHRoaXMucG9ydGZvbGlvTWFuYWdlci5jcmVhdGVQb3J0Zm9saW8odXNlcm5hbWUsIHRydWUpO1xuICAgICAgaWYgKCFyZXBvVXJsKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgZXJyb3I6IHtcbiAgICAgICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICAgICAgbWVzc2FnZTogJ0ZhaWxlZCB0byBjcmVhdGUgcG9ydGZvbGlvIHJlcG9zaXRvcnknLFxuICAgICAgICAgICAgZXJyb3I6ICdDUkVBVEVfRkFJTEVEJ1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4geyBzdWNjZXNzOiB0cnVlIH07XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgY29udGVudCBhbHJlYWR5IGV4aXN0cyBpbiB0aGUgcG9ydGZvbGlvIHJlcG9zaXRvcnlcbiAgICogUHJldmVudHMgZHVwbGljYXRlIHVwbG9hZHMgYnkgY29tcGFyaW5nIGNvbnRlbnQgaGFzaGVzXG4gICAqIEBwYXJhbSByZXBvRnVsbE5hbWUgR2l0SHViIHJlcG9zaXRvcnkgZnVsbCBuYW1lIChvd25lci9yZXBvKVxuICAgKiBAcGFyYW0gZmlsZVBhdGggUGF0aCB0byB0aGUgZmlsZSBpbiB0aGUgcmVwb3NpdG9yeVxuICAgKiBAcGFyYW0gY29udGVudCBDb250ZW50IHRvIGNoZWNrIGFnYWluc3QgZXhpc3RpbmdcbiAgICogQHJldHVybnMgdHJ1ZSBpZiBpZGVudGljYWwgY29udGVudCBleGlzdHMsIGZhbHNlIG90aGVyd2lzZVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBjaGVja0V4aXN0aW5nQ29udGVudChcbiAgICByZXBvRnVsbE5hbWU6IHN0cmluZywgXG4gICAgZmlsZVBhdGg6IHN0cmluZywgXG4gICAgY29udGVudDogc3RyaW5nLFxuICAgIHRva2VuOiBzdHJpbmdcbiAgKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIEF0dGVtcHQgdG8gZmV0Y2ggZXhpc3RpbmcgZmlsZSBmcm9tIEdpdEh1YlxuICAgICAgY29uc3QgdXJsID0gYGh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvJHtyZXBvRnVsbE5hbWV9L2NvbnRlbnRzLyR7ZmlsZVBhdGh9YDtcbiAgICAgIFxuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh1cmwsIHtcbiAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICdBY2NlcHQnOiAnYXBwbGljYXRpb24vdm5kLmdpdGh1Yi52Mytqc29uJyxcbiAgICAgICAgICAnQXV0aG9yaXphdGlvbic6IGBCZWFyZXIgJHt0b2tlbn1gLFxuICAgICAgICAgICdVc2VyLUFnZW50JzogJ0RvbGxob3VzZU1DUC8xLjAnXG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBpZiAocmVzcG9uc2Uuc3RhdHVzID09PSA0MDQpIHtcbiAgICAgICAgLy8gRmlsZSBkb2Vzbid0IGV4aXN0LCBub3QgYSBkdXBsaWNhdGVcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKCdGYWlsZWQgdG8gY2hlY2sgZXhpc3RpbmcgY29udGVudCcsIHtcbiAgICAgICAgICBzdGF0dXM6IHJlc3BvbnNlLnN0YXR1cyxcbiAgICAgICAgICBwYXRoOiBmaWxlUGF0aFxuICAgICAgICB9KTtcbiAgICAgICAgLy8gT24gZXJyb3IsIGFsbG93IHVwbG9hZCB0byBwcm9jZWVkXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcbiAgICAgIFxuICAgICAgLy8gR2l0SHViIHJldHVybnMgY29udGVudCBhcyBiYXNlNjRcbiAgICAgIGNvbnN0IGV4aXN0aW5nQ29udGVudCA9IEJ1ZmZlci5mcm9tKGRhdGEuY29udGVudCwgJ2Jhc2U2NCcpLnRvU3RyaW5nKCd1dGYtOCcpO1xuICAgICAgXG4gICAgICAvLyBDb21wYXJlIGNvbnRlbnQgaGFzaGVzXG4gICAgICBjb25zdCBleGlzdGluZ0hhc2ggPSBjcmVhdGVIYXNoKCdzaGEyNTYnKS51cGRhdGUoZXhpc3RpbmdDb250ZW50KS5kaWdlc3QoJ2hleCcpO1xuICAgICAgY29uc3QgbmV3SGFzaCA9IGNyZWF0ZUhhc2goJ3NoYTI1NicpLnVwZGF0ZShjb250ZW50KS5kaWdlc3QoJ2hleCcpO1xuICAgICAgXG4gICAgICBjb25zdCBpc0R1cGxpY2F0ZSA9IGV4aXN0aW5nSGFzaCA9PT0gbmV3SGFzaDtcbiAgICAgIFxuICAgICAgaWYgKGlzRHVwbGljYXRlKSB7XG4gICAgICAgIGxvZ2dlci5pbmZvKCdEdXBsaWNhdGUgY29udGVudCBkZXRlY3RlZCwgc2tpcHBpbmcgdXBsb2FkJywge1xuICAgICAgICAgIHBhdGg6IGZpbGVQYXRoLFxuICAgICAgICAgIGhhc2g6IG5ld0hhc2guc3Vic3RyaW5nKDAsIDgpIC8vIExvZyBwYXJ0aWFsIGhhc2ggZm9yIGRlYnVnZ2luZ1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgcmV0dXJuIGlzRHVwbGljYXRlO1xuICAgICAgXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci53YXJuKCdFcnJvciBjaGVja2luZyBmb3IgZXhpc3RpbmcgY29udGVudCcsIHtcbiAgICAgICAgZXJyb3I6IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKSxcbiAgICAgICAgcGF0aDogZmlsZVBhdGhcbiAgICAgIH0pO1xuICAgICAgLy8gT24gZXJyb3IsIGFsbG93IHVwbG9hZCB0byBwcm9jZWVkIHJhdGhlciB0aGFuIGJsb2NraW5nXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGFuIGlzc3VlIGZvciB0aGlzIGNvbnRlbnQgYWxyZWFkeSBleGlzdHMgaW4gdGhlIGNvbGxlY3Rpb25cbiAgICogQHBhcmFtIGVsZW1lbnROYW1lIE5hbWUgb2YgdGhlIGVsZW1lbnQgdG8gY2hlY2tcbiAgICogQHBhcmFtIHVzZXJuYW1lIFVzZXIgc3VibWl0dGluZyB0aGUgZWxlbWVudFxuICAgKiBAcGFyYW0gdG9rZW4gR2l0SHViIHRva2VuIGZvciBBUEkgYWNjZXNzXG4gICAqIEByZXR1cm5zIFVSTCBvZiBleGlzdGluZyBpc3N1ZSBpZiBmb3VuZCwgbnVsbCBvdGhlcndpc2VcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgY2hlY2tFeGlzdGluZ0lzc3VlKFxuICAgIGVsZW1lbnROYW1lOiBzdHJpbmcsXG4gICAgdXNlcm5hbWU6IHN0cmluZyxcbiAgICB0b2tlbjogc3RyaW5nXG4gICk6IFByb21pc2U8c3RyaW5nIHwgbnVsbD4ge1xuICAgIHRyeSB7XG4gICAgICAvLyBTZWFyY2ggZm9yIGV4aXN0aW5nIGlzc3VlcyB3aXRoIHRoaXMgZWxlbWVudCBuYW1lXG4gICAgICAvLyBVc2luZyBib3RoIHRpdGxlIGFuZCBhdXRob3IgdG8gZW5zdXJlIGl0J3MgdGhlIHNhbWUgc3VibWlzc2lvblxuICAgICAgY29uc3QgcXVlcnkgPSBgcmVwbzpEb2xsaG91c2VNQ1AvY29sbGVjdGlvbiBpczppc3N1ZSBcIiR7ZWxlbWVudE5hbWV9XCIgaW46dGl0bGUgYXV0aG9yOiR7dXNlcm5hbWV9YDtcbiAgICAgIGNvbnN0IHVybCA9IGBodHRwczovL2FwaS5naXRodWIuY29tL3NlYXJjaC9pc3N1ZXM/cT0ke2VuY29kZVVSSUNvbXBvbmVudChxdWVyeSl9JnNvcnQ9Y3JlYXRlZCZvcmRlcj1kZXNjYDtcbiAgICAgIFxuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh1cmwsIHtcbiAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICdBY2NlcHQnOiAnYXBwbGljYXRpb24vdm5kLmdpdGh1Yi52Mytqc29uJyxcbiAgICAgICAgICAnQXV0aG9yaXphdGlvbic6IGBCZWFyZXIgJHt0b2tlbn1gLFxuICAgICAgICAgICdVc2VyLUFnZW50JzogJ0RvbGxob3VzZU1DUC8xLjAnXG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKCdGYWlsZWQgdG8gc2VhcmNoIGZvciBleGlzdGluZyBpc3N1ZXMnLCB7XG4gICAgICAgICAgc3RhdHVzOiByZXNwb25zZS5zdGF0dXNcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuICAgICAgXG4gICAgICBpZiAoZGF0YS5pdGVtcyAmJiBkYXRhLml0ZW1zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgLy8gRm91bmQgZXhpc3RpbmcgaXNzdWUocylcbiAgICAgICAgY29uc3QgZXhpc3RpbmdJc3N1ZSA9IGRhdGEuaXRlbXNbMF07XG4gICAgICAgIGxvZ2dlci5pbmZvKCdGb3VuZCBleGlzdGluZyBjb2xsZWN0aW9uIGlzc3VlJywge1xuICAgICAgICAgIGlzc3VlVXJsOiBleGlzdGluZ0lzc3VlLmh0bWxfdXJsLFxuICAgICAgICAgIGVsZW1lbnROYW1lXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gZXhpc3RpbmdJc3N1ZS5odG1sX3VybDtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgICBcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbG9nZ2VyLndhcm4oJ0Vycm9yIGNoZWNraW5nIGZvciBleGlzdGluZyBjb2xsZWN0aW9uIGlzc3VlJywge1xuICAgICAgICBlcnJvcjogZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpLFxuICAgICAgICBlbGVtZW50TmFtZVxuICAgICAgfSk7XG4gICAgICAvLyBPbiBlcnJvciwgYWxsb3cgc3VibWlzc2lvbiB0byBwcm9jZWVkXG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU3VibWl0cyBlbGVtZW50IHRvIHBvcnRmb2xpbyBhbmQgaGFuZGxlcyB0aGUgY29tcGxldGUgcmVzcG9uc2Ugd29ya2Zsb3dcbiAgICogQHBhcmFtIHNhZmVOYW1lIFRoZSBub3JtYWxpemVkIG5hbWUgb2YgdGhlIGVsZW1lbnRcbiAgICogQHBhcmFtIGVsZW1lbnRUeXBlIFRoZSB0eXBlIG9mIHRoZSBlbGVtZW50XG4gICAqIEBwYXJhbSBtZXRhZGF0YSBUaGUgbWV0YWRhdGEgZm9yIHRoZSBlbGVtZW50XG4gICAqIEBwYXJhbSBjb250ZW50IFRoZSBjb250ZW50IG9mIHRoZSBlbGVtZW50XG4gICAqIEBwYXJhbSBhdXRoU3RhdHVzIEF1dGhlbnRpY2F0aW9uIHN0YXR1cyBjb250YWluaW5nIHVzZXJuYW1lIGFuZCB0b2tlblxuICAgKiBAcmV0dXJucyBDb21wbGV0ZSBzdWJtaXNzaW9uIHJlc3VsdCB3aXRoIHN1Y2Nlc3MgbWVzc2FnZSBvciBlcnJvclxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBzdWJtaXRFbGVtZW50QW5kSGFuZGxlUmVzcG9uc2UoXG4gICAgc2FmZU5hbWU6IHN0cmluZyxcbiAgICBlbGVtZW50VHlwZTogRWxlbWVudFR5cGUsXG4gICAgbWV0YWRhdGE6IFBvcnRmb2xpb0VsZW1lbnRNZXRhZGF0YSxcbiAgICBjb250ZW50OiBzdHJpbmcsXG4gICAgYXV0aFN0YXR1czogYW55LFxuICAgIGxvY2FsUGF0aD86IHN0cmluZyAgLy8gTG9jYWwgZmlsZSBwYXRoIGZvciBjb2xsZWN0aW9uIHN1Ym1pc3Npb25cbiAgKTogUHJvbWlzZTxTdWJtaXRUb1BvcnRmb2xpb1Jlc3VsdD4ge1xuICAgIC8vIERVUExJQ0FURSBERVRFQ1RJT046IENoZWNrIGlmIGNvbnRlbnQgYWxyZWFkeSBleGlzdHMgaW4gcG9ydGZvbGlvXG4gICAgY29uc3QgcmVwb0Z1bGxOYW1lID0gYCR7YXV0aFN0YXR1cy51c2VybmFtZX0vZG9sbGhvdXNlLXBvcnRmb2xpb2A7XG4gICAgY29uc3QgZmlsZVBhdGggPSBgJHtlbGVtZW50VHlwZX0vJHtzYWZlTmFtZX0ubWRgO1xuICAgIFxuICAgIC8vIFByZXBhcmUgdGhlIGZ1bGwgY29udGVudCB0aGF0IHdvdWxkIGJlIHNhdmVkXG4gICAgY29uc3QgZnVsbENvbnRlbnQgPSBgLS0tXFxuJHtKU09OLnN0cmluZ2lmeShtZXRhZGF0YSwgbnVsbCwgMil9XFxuLS0tXFxuXFxuJHtjb250ZW50fWA7XG4gICAgXG4gICAgY29uc3QgaXNEdXBsaWNhdGUgPSBhd2FpdCB0aGlzLmNoZWNrRXhpc3RpbmdDb250ZW50KFxuICAgICAgcmVwb0Z1bGxOYW1lLCBcbiAgICAgIGZpbGVQYXRoLCBcbiAgICAgIGZ1bGxDb250ZW50LFxuICAgICAgYXV0aFN0YXR1cy50b2tlblxuICAgICk7XG4gICAgXG4gICAgbGV0IGZpbGVVcmw6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICAgIFxuICAgIGlmIChpc0R1cGxpY2F0ZSkge1xuICAgICAgLy8gQ29udGVudCBhbHJlYWR5IGV4aXN0cywgY29uc3RydWN0IHRoZSBVUkwgd2l0aG91dCB1cGxvYWRpbmdcbiAgICAgIGZpbGVVcmwgPSBgaHR0cHM6Ly9naXRodWIuY29tLyR7cmVwb0Z1bGxOYW1lfS9ibG9iL21haW4vJHtmaWxlUGF0aH1gO1xuICAgICAgbG9nZ2VyLmluZm8oJ1NraXBwZWQgZHVwbGljYXRlIHVwbG9hZCB0byBwb3J0Zm9saW8nLCB7XG4gICAgICAgIGVsZW1lbnROYW1lOiBzYWZlTmFtZSxcbiAgICAgICAgcGF0aDogZmlsZVBhdGhcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBDcmVhdGUgZWxlbWVudCBzdHJ1Y3R1cmUgdG8gc2F2ZVxuICAgICAgY29uc3QgZWxlbWVudDogUG9ydGZvbGlvRWxlbWVudCA9IHtcbiAgICAgICAgdHlwZTogZWxlbWVudFR5cGUsXG4gICAgICAgIG1ldGFkYXRhLFxuICAgICAgICBjb250ZW50XG4gICAgICB9O1xuICAgICAgXG4gICAgICAvLyBUWVBFIFNBRkVUWSBGSVggIzI6IFVzZSBhZGFwdGVyIHBhdHRlcm4gaW5zdGVhZCBvZiBjb21wbGV4IHR5cGUgY2FzdGluZ1xuICAgICAgLy8gUHJldmlvdXNseTogZWxlbWVudCBhcyB1bmtub3duIGFzIFBhcmFtZXRlcnM8dHlwZW9mIHRoaXMucG9ydGZvbGlvTWFuYWdlci5zYXZlRWxlbWVudD5bMF1cbiAgICAgIC8vIE5vdzogQ2xlYW4gYWRhcHRlciBwYXR0ZXJuIHRoYXQgaW1wbGVtZW50cyBJRWxlbWVudCBpbnRlcmZhY2UgcHJvcGVybHlcbiAgICAgIGNvbnN0IGFkYXB0ZXIgPSBuZXcgUG9ydGZvbGlvRWxlbWVudEFkYXB0ZXIoZWxlbWVudCk7XG4gICAgICBcbiAgICAgIC8vIFVYIElNUFJPVkVNRU5UOiBBZGQgcmV0cnkgbG9naWMgZm9yIHRyYW5zaWVudCBmYWlsdXJlc1xuICAgICAgZmlsZVVybCA9IGF3YWl0IHRoaXMuc2F2ZUVsZW1lbnRXaXRoUmV0cnkoYWRhcHRlciwgc2FmZU5hbWUsIGVsZW1lbnRUeXBlKTtcbiAgICB9XG4gICAgXG4gICAgaWYgKCFmaWxlVXJsKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgbWVzc2FnZTogJ0ZhaWxlZCB0byBzYXZlIGVsZW1lbnQgdG8gR2l0SHViIHBvcnRmb2xpbyBhZnRlciBtdWx0aXBsZSBhdHRlbXB0cy5cXG5cXG4nICtcbiAgICAgICAgICAgICAgICAn8J+SoSAqKlRyb3VibGVzaG9vdGluZyBUaXBzKio6XFxuJyArXG4gICAgICAgICAgICAgICAgJ+KAoiBDaGVjayB5b3VyIEdpdEh1YiBhdXRoZW50aWNhdGlvbjogYGdoIGF1dGggc3RhdHVzYFxcbicgK1xuICAgICAgICAgICAgICAgICfigKIgVmVyaWZ5IHJlcG9zaXRvcnkgcGVybWlzc2lvbnNcXG4nICtcbiAgICAgICAgICAgICAgICAn4oCiIFRyeSBhZ2FpbiBpbiBhIGZldyBtaW51dGVzIChHaXRIdWIgQVBJIHJhdGUgbGltaXRzKVxcbicgK1xuICAgICAgICAgICAgICAgICfigKIgQ2hlY2sgR2l0SHViIHN0YXR1czogaHR0cHM6Ly9zdGF0dXMuZ2l0aHViLmNvbScsXG4gICAgICAgIGVycm9yOiAnU0FWRV9GQUlMRUQnXG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vIExvZyBzdWJtaXNzaW9uIHJlc3VsdCAoRE1DUC1TRUMtMDA2KVxuICAgIC8vIENoZWNrIGlmIHRoaXMgd2FzIGEgZHVwbGljYXRlIHNraXAgb3IgYWN0dWFsIHVwbG9hZFxuICAgIGNvbnN0IHdhc0R1cGxpY2F0ZSA9IGZpbGVVcmwgJiYgZmlsZVVybC5pbmNsdWRlcygnYmxvYi9tYWluLycpICYmICFmaWxlVXJsLmluY2x1ZGVzKCcvY29tbWl0LycpO1xuICAgIFxuICAgIGlmICh3YXNEdXBsaWNhdGUpIHtcbiAgICAgIGxvZ2dlci5pbmZvKGBTa2lwcGVkIGR1cGxpY2F0ZSB1cGxvYWQgZm9yICR7c2FmZU5hbWV9IC0gYWxyZWFkeSBpbiBwb3J0Zm9saW9gLCB7XG4gICAgICAgIGVsZW1lbnRUeXBlLFxuICAgICAgICB1c2VybmFtZTogYXV0aFN0YXR1cy51c2VybmFtZSxcbiAgICAgICAgZmlsZVVybFxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxvZ2dlci5pbmZvKGBTdWNjZXNzZnVsbHkgc3VibWl0dGVkICR7c2FmZU5hbWV9IHRvIEdpdEh1YiBwb3J0Zm9saW9gLCB7XG4gICAgICAgIGVsZW1lbnRUeXBlLFxuICAgICAgICB1c2VybmFtZTogYXV0aFN0YXR1cy51c2VybmFtZSxcbiAgICAgICAgZmlsZVVybFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gU0VDVVJJVFkgRU5IQU5DRU1FTlQgKFRhc2sgIzE0KTogU21hcnQgdG9rZW4gbWFuYWdlbWVudCBmb3IgY29sbGVjdGlvbiBzdWJtaXNzaW9uXG4gICAgY29uc3QgY29sbGVjdGlvblRva2VuTWFuYWdlbWVudCA9IGF3YWl0IHRoaXMubWFuYWdlVG9rZW5Gb3JMb25nT3BlcmF0aW9uKCdjb2xsZWN0aW9uX3N1Ym1pc3Npb24nKTtcbiAgICBpZiAoIWNvbGxlY3Rpb25Ub2tlbk1hbmFnZW1lbnQuY2FuUHJvY2VlZCkge1xuICAgICAgLy8gVG9rZW4gbWFuYWdlbWVudCBmYWlsZWQgZm9yIGNvbGxlY3Rpb24gc3VibWlzc2lvbiwgYnV0IG1haW4gc3VibWlzc2lvbiBzdWNjZWVkZWRcbiAgICAgIGNvbnN0IGVycm9yTWVzc2FnZSA9IGNvbGxlY3Rpb25Ub2tlbk1hbmFnZW1lbnQuZXJyb3I/Lm1lc3NhZ2UgfHwgJ1Rva2VuIG1hbmFnZW1lbnQgZmFpbGVkJztcbiAgICAgIGNvbnN0IHBvcnRmb2xpb01lc3NhZ2UgPSB3YXNEdXBsaWNhdGUgPyBcbiAgICAgICAgYOKchSAke3NhZmVOYW1lfSBhbHJlYWR5IGV4aXN0cyBpbiB5b3VyIEdpdEh1YiBwb3J0Zm9saW8gKG5vIGNoYW5nZXMgbmVlZGVkKWAgOlxuICAgICAgICBg4pyFIFN1Y2Nlc3NmdWxseSB1cGxvYWRlZCAke3NhZmVOYW1lfSB0byB5b3VyIEdpdEh1YiBwb3J0Zm9saW8hYDtcbiAgICAgIFxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc3VjY2VzczogdHJ1ZSxcbiAgICAgICAgbWVzc2FnZTogYCR7cG9ydGZvbGlvTWVzc2FnZX1cXG7wn5OBIFBvcnRmb2xpbyBVUkw6ICR7ZmlsZVVybH1cXG5cXG7imqDvuI8gQ29sbGVjdGlvbiBzdWJtaXNzaW9uIHNraXBwZWQ6ICR7ZXJyb3JNZXNzYWdlfWAsXG4gICAgICAgIHVybDogZmlsZVVybFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBjb25zdCB0b2tlbiA9IGNvbGxlY3Rpb25Ub2tlbk1hbmFnZW1lbnQudG9rZW4hO1xuXG4gICAgLy8gUHJvdmlkZSByZWZyZXNoIGd1aWRhbmNlIGlmIHJlY29tbWVuZGVkIGZvciBjb2xsZWN0aW9uIHN1Ym1pc3Npb25cbiAgICBpZiAoY29sbGVjdGlvblRva2VuTWFuYWdlbWVudC5yZWZyZXNoUmVjb21tZW5kZWQpIHtcbiAgICAgIGNvbnN0IHRva2VuVHlwZSA9IFRva2VuTWFuYWdlci5nZXRUb2tlblR5cGUodG9rZW4pO1xuICAgICAgbG9nZ2VyLmluZm8oJ0NvbGxlY3Rpb24gc3VibWlzc2lvbiBwcm9jZWVkaW5nIHdpdGggYWdpbmcgdG9rZW4nLCB7XG4gICAgICAgIHRva2VuVHlwZSxcbiAgICAgICAgcmVjb21tZW5kYXRpb246ICdJZiBjb2xsZWN0aW9uIHN1Ym1pc3Npb24gZmFpbHMsIHRyeSByZS1hdXRoZW50aWNhdGluZyB3aXRoIHNldHVwX2dpdGh1Yl9hdXRoJ1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gRU5IQU5DRU1FTlQgKElzc3VlICM1NDkpOiBBc2sgdXNlciBpZiB0aGV5IHdhbnQgdG8gc3VibWl0IHRvIGNvbGxlY3Rpb25cbiAgICAvLyBUaGlzIGNvbXBsZXRlcyB0aGUgY29tbXVuaXR5IGNvbnRyaWJ1dGlvbiB3b3JrZmxvd1xuICAgIGNvbnN0IGNvbGxlY3Rpb25TdWJtaXNzaW9uUmVzdWx0ID0gYXdhaXQgdGhpcy5wcm9tcHRGb3JDb2xsZWN0aW9uU3VibWlzc2lvbih7XG4gICAgICBlbGVtZW50TmFtZTogc2FmZU5hbWUsXG4gICAgICBlbGVtZW50VHlwZSxcbiAgICAgIHBvcnRmb2xpb1VybDogZmlsZVVybCxcbiAgICAgIHVzZXJuYW1lOiBhdXRoU3RhdHVzLnVzZXJuYW1lIHx8ICd1bmtub3duJyxcbiAgICAgIG1ldGFkYXRhLFxuICAgICAgdG9rZW4sXG4gICAgICBsb2NhbFBhdGggIC8vIFBhc3MgdGhlIGxvY2FsIGZpbGUgcGF0aCBmb3IgcmVhZGluZyBjb250ZW50XG4gICAgfSk7XG5cbiAgICAvLyBCdWlsZCB0aGUgcmVzcG9uc2UgbWVzc2FnZSBiYXNlZCBvbiB3aGF0IGhhcHBlbmVkXG4gICAgY29uc3QgcG9ydGZvbGlvTWVzc2FnZSA9IHdhc0R1cGxpY2F0ZSA/IFxuICAgICAgYOKchSAke3NhZmVOYW1lfSBhbHJlYWR5IGV4aXN0cyBpbiB5b3VyIEdpdEh1YiBwb3J0Zm9saW8gKG5vIGNoYW5nZXMgbmVlZGVkKWAgOlxuICAgICAgYOKchSBTdWNjZXNzZnVsbHkgdXBsb2FkZWQgJHtzYWZlTmFtZX0gdG8geW91ciBHaXRIdWIgcG9ydGZvbGlvIWA7XG4gICAgXG4gICAgbGV0IG1lc3NhZ2UgPSBgJHtwb3J0Zm9saW9NZXNzYWdlfVxcbmA7XG4gICAgbWVzc2FnZSArPSBg8J+TgSBQb3J0Zm9saW8gVVJMOiAke2ZpbGVVcmx9XFxuXFxuYDtcbiAgICBcbiAgICBpZiAoY29sbGVjdGlvblN1Ym1pc3Npb25SZXN1bHQuc3VibWl0dGVkKSB7XG4gICAgICBpZiAoY29sbGVjdGlvblN1Ym1pc3Npb25SZXN1bHQuaXNEdXBsaWNhdGUpIHtcbiAgICAgICAgbWVzc2FnZSArPSBg8J+TiyBDb2xsZWN0aW9uIGlzc3VlIGFscmVhZHkgZXhpc3RzIChubyBuZXcgc3VibWlzc2lvbiBuZWVkZWQpXFxuYDtcbiAgICAgICAgbWVzc2FnZSArPSBg8J+UlyBJc3N1ZTogJHtjb2xsZWN0aW9uU3VibWlzc2lvblJlc3VsdC5pc3N1ZVVybH1gO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbWVzc2FnZSArPSBg8J+OiSBBbHNvIHN1Ym1pdHRlZCB0byBEb2xsaG91c2VNQ1AgY29sbGVjdGlvbiBmb3IgY29tbXVuaXR5IHJldmlldyFcXG5gO1xuICAgICAgICBtZXNzYWdlICs9IGDwn5OLIElzc3VlOiAke2NvbGxlY3Rpb25TdWJtaXNzaW9uUmVzdWx0Lmlzc3VlVXJsfWA7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChjb2xsZWN0aW9uU3VibWlzc2lvblJlc3VsdC5kZWNsaW5lZCkge1xuICAgICAgbWVzc2FnZSArPSBg8J+SoSBZb3UgY2FuIHN1Ym1pdCB0byB0aGUgY29sbGVjdGlvbiBsYXRlciB1c2luZyB0aGUgc2FtZSBjb21tYW5kLmA7XG4gICAgfSBlbHNlIGlmIChjb2xsZWN0aW9uU3VibWlzc2lvblJlc3VsdC5lcnJvcikge1xuICAgICAgbWVzc2FnZSArPSBg4pqg77iPIENvbGxlY3Rpb24gc3VibWlzc2lvbiBmYWlsZWQ6ICR7Y29sbGVjdGlvblN1Ym1pc3Npb25SZXN1bHQuZXJyb3J9XFxuYDtcbiAgICAgIG1lc3NhZ2UgKz0gYPCfkqEgWW91IGNhbiBtYW51YWxseSBzdWJtaXQgYXQ6IGh0dHBzOi8vZ2l0aHViLmNvbS9Eb2xsaG91c2VNQ1AvY29sbGVjdGlvbi9pc3N1ZXMvbmV3YDtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgc3VjY2VzczogdHJ1ZSxcbiAgICAgIG1lc3NhZ2UsXG4gICAgICB1cmw6IGZpbGVVcmxcbiAgICB9O1xuICB9XG5cbiAgYXN5bmMgZXhlY3V0ZShwYXJhbXM6IFN1Ym1pdFRvUG9ydGZvbGlvUGFyYW1zKTogUHJvbWlzZTxTdWJtaXRUb1BvcnRmb2xpb1Jlc3VsdD4ge1xuICAgIGNvbnN0IHN0YXJ0VGltZSA9IERhdGUubm93KCk7XG4gICAgY29uc3QgdGltaW5nczogUmVjb3JkPHN0cmluZywgbnVtYmVyPiA9IHt9O1xuICAgIFxuICAgIGxvZ2dlci5pbmZvKCfwn5qAIFNVQk1JU1NJT04gV09SS0ZMT1cgU1RBUlRJTkcnLCB7XG4gICAgICBwYXJhbXM6IEpTT04uc3RyaW5naWZ5KHBhcmFtcyksXG4gICAgICB0aW1lc3RhbXA6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKVxuICAgIH0pO1xuICAgIFxuICAgIHRyeSB7XG4gICAgICAvLyBTdGVwIDE6IFZhbGlkYXRlIGFuZCBub3JtYWxpemUgaW5wdXQgcGFyYW1ldGVyc1xuICAgICAgbG9nZ2VyLmluZm8oJ/Cfk4sgU3RlcCAxLzg6IFZhbGlkYXRpbmcgcGFyYW1ldGVycy4uLicpO1xuICAgICAgY29uc3Qgc3RlcDFTdGFydCA9IERhdGUubm93KCk7XG4gICAgICBjb25zdCB2YWxpZGF0aW9uUmVzdWx0ID0gYXdhaXQgdGhpcy52YWxpZGF0ZUFuZE5vcm1hbGl6ZVBhcmFtcyhwYXJhbXMpO1xuICAgICAgdGltaW5nc1sndmFsaWRhdGlvbiddID0gRGF0ZS5ub3coKSAtIHN0ZXAxU3RhcnQ7XG4gICAgICBsb2dnZXIuaW5mbyhg4pyFIFN0ZXAgMSBjb21wbGV0ZSAoJHt0aW1pbmdzWyd2YWxpZGF0aW9uJ119bXMpYCk7XG4gICAgICBpZiAoIXZhbGlkYXRpb25SZXN1bHQuc3VjY2Vzcykge1xuICAgICAgICByZXR1cm4gdmFsaWRhdGlvblJlc3VsdC5lcnJvciE7XG4gICAgICB9XG4gICAgICBjb25zdCBzYWZlTmFtZSA9IHZhbGlkYXRpb25SZXN1bHQuc2FmZU5hbWUhO1xuXG4gICAgICAvLyBTdGVwIDI6IENoZWNrIGF1dGhlbnRpY2F0aW9uIHN0YXR1c1xuICAgICAgbG9nZ2VyLmluZm8oJ/CflJAgU3RlcCAyLzg6IENoZWNraW5nIGF1dGhlbnRpY2F0aW9uLi4uJyk7XG4gICAgICBjb25zdCBzdGVwMlN0YXJ0ID0gRGF0ZS5ub3coKTtcbiAgICAgIGNvbnN0IGF1dGhSZXN1bHQgPSBhd2FpdCB0aGlzLmNoZWNrQXV0aGVudGljYXRpb24oKTtcbiAgICAgIHRpbWluZ3NbJ2F1dGhlbnRpY2F0aW9uJ10gPSBEYXRlLm5vdygpIC0gc3RlcDJTdGFydDtcbiAgICAgIGxvZ2dlci5pbmZvKGDinIUgU3RlcCAyIGNvbXBsZXRlICgke3RpbWluZ3NbJ2F1dGhlbnRpY2F0aW9uJ119bXMpYCwge1xuICAgICAgICB1c2VybmFtZTogYXV0aFJlc3VsdC5hdXRoU3RhdHVzPy51c2VybmFtZSxcbiAgICAgICAgaGFzVG9rZW46ICEhYXV0aFJlc3VsdC5hdXRoU3RhdHVzPy5oYXNUb2tlblxuICAgICAgfSk7XG4gICAgICBpZiAoIWF1dGhSZXN1bHQuc3VjY2Vzcykge1xuICAgICAgICByZXR1cm4gYXV0aFJlc3VsdC5lcnJvciE7XG4gICAgICB9XG4gICAgICBjb25zdCBhdXRoU3RhdHVzID0gYXV0aFJlc3VsdC5hdXRoU3RhdHVzITtcblxuICAgICAgLy8gU3RlcCAzOiBGaW5kIGNvbnRlbnQgbG9jYWxseSB3aXRoIHNtYXJ0IHR5cGUgZGV0ZWN0aW9uXG4gICAgICBsb2dnZXIuaW5mbygn8J+UjSBTdGVwIDMvODogRmluZGluZyBjb250ZW50IGxvY2FsbHkuLi4nKTtcbiAgICAgIGNvbnN0IHN0ZXAzU3RhcnQgPSBEYXRlLm5vdygpO1xuICAgICAgY29uc3QgY29udGVudFJlc3VsdCA9IGF3YWl0IHRoaXMuZGlzY292ZXJDb250ZW50V2l0aFR5cGVEZXRlY3Rpb24oc2FmZU5hbWUhLCBwYXJhbXMudHlwZSwgcGFyYW1zLm5hbWUpO1xuICAgICAgdGltaW5nc1snY29udGVudERpc2NvdmVyeSddID0gRGF0ZS5ub3coKSAtIHN0ZXAzU3RhcnQ7XG4gICAgICBsb2dnZXIuaW5mbyhg4pyFIFN0ZXAgMyBjb21wbGV0ZSAoJHt0aW1pbmdzWydjb250ZW50RGlzY292ZXJ5J119bXMpYCwge1xuICAgICAgICBmb3VuZDogY29udGVudFJlc3VsdC5zdWNjZXNzLFxuICAgICAgICBlbGVtZW50VHlwZTogY29udGVudFJlc3VsdC5lbGVtZW50VHlwZSxcbiAgICAgICAgcGF0aDogY29udGVudFJlc3VsdC5sb2NhbFBhdGhcbiAgICAgIH0pO1xuICAgICAgaWYgKCFjb250ZW50UmVzdWx0LnN1Y2Nlc3MpIHtcbiAgICAgICAgcmV0dXJuIGNvbnRlbnRSZXN1bHQuZXJyb3IhO1xuICAgICAgfVxuICAgICAgY29uc3QgZWxlbWVudFR5cGUgPSBjb250ZW50UmVzdWx0LmVsZW1lbnRUeXBlITtcbiAgICAgIGNvbnN0IGxvY2FsUGF0aCA9IGNvbnRlbnRSZXN1bHQubG9jYWxQYXRoITtcblxuICAgICAgLy8gU3RlcCA0OiBWYWxpZGF0ZSBmaWxlIGFuZCBjb250ZW50IHNlY3VyaXR5XG4gICAgICBsb2dnZXIuaW5mbygn8J+UkiBTdGVwIDQvODogVmFsaWRhdGluZyBzZWN1cml0eS4uLicpO1xuICAgICAgY29uc3Qgc3RlcDRTdGFydCA9IERhdGUubm93KCk7XG4gICAgICBjb25zdCBzZWN1cml0eVJlc3VsdCA9IGF3YWl0IHRoaXMudmFsaWRhdGVGaWxlQW5kQ29udGVudChsb2NhbFBhdGgpO1xuICAgICAgdGltaW5nc1snc2VjdXJpdHknXSA9IERhdGUubm93KCkgLSBzdGVwNFN0YXJ0O1xuICAgICAgbG9nZ2VyLmluZm8oYOKchSBTdGVwIDQgY29tcGxldGUgKCR7dGltaW5nc1snc2VjdXJpdHknXX1tcylgKTtcbiAgICAgIGlmICghc2VjdXJpdHlSZXN1bHQuc3VjY2Vzcykge1xuICAgICAgICByZXR1cm4gc2VjdXJpdHlSZXN1bHQuZXJyb3IhO1xuICAgICAgfVxuICAgICAgY29uc3QgY29udGVudCA9IHNlY3VyaXR5UmVzdWx0LmNvbnRlbnQhO1xuXG4gICAgICAvLyBTdGVwIDU6IFByZXBhcmUgbWV0YWRhdGEgZm9yIGVsZW1lbnRcbiAgICAgIGxvZ2dlci5pbmZvKCfwn5OdIFN0ZXAgNS84OiBQcmVwYXJpbmcgbWV0YWRhdGEuLi4nKTtcbiAgICAgIGNvbnN0IHN0ZXA1U3RhcnQgPSBEYXRlLm5vdygpO1xuICAgICAgY29uc3QgbWV0YWRhdGEgPSBhd2FpdCB0aGlzLnByZXBhcmVFbGVtZW50TWV0YWRhdGEoc2FmZU5hbWUhLCBlbGVtZW50VHlwZSwgYXV0aFN0YXR1cywgbG9jYWxQYXRoKTtcbiAgICAgIHRpbWluZ3NbJ21ldGFkYXRhJ10gPSBEYXRlLm5vdygpIC0gc3RlcDVTdGFydDtcbiAgICAgIGxvZ2dlci5pbmZvKGDinIUgU3RlcCA1IGNvbXBsZXRlICgke3RpbWluZ3NbJ21ldGFkYXRhJ119bXMpYCwge1xuICAgICAgICBhdXRob3I6IG1ldGFkYXRhLmF1dGhvcixcbiAgICAgICAgZWxlbWVudE5hbWU6IHNhZmVOYW1lXG4gICAgICB9KTtcblxuICAgICAgLy8gU3RlcCA2OiBTZXQgdXAgR2l0SHViIHJlcG9zaXRvcnkgYWNjZXNzXG4gICAgICBsb2dnZXIuaW5mbygn8J+UpyBTdGVwIDYvODogU2V0dGluZyB1cCBHaXRIdWIgcmVwb3NpdG9yeS4uLicpO1xuICAgICAgY29uc3Qgc3RlcDZTdGFydCA9IERhdGUubm93KCk7XG4gICAgICBjb25zdCByZXBvUmVzdWx0ID0gYXdhaXQgdGhpcy5zZXR1cEdpdEh1YlJlcG9zaXRvcnkoYXV0aFN0YXR1cyk7XG4gICAgICB0aW1pbmdzWydyZXBvU2V0dXAnXSA9IERhdGUubm93KCkgLSBzdGVwNlN0YXJ0O1xuICAgICAgbG9nZ2VyLmluZm8oYOKchSBTdGVwIDYgY29tcGxldGUgKCR7dGltaW5nc1sncmVwb1NldHVwJ119bXMpYCwge1xuICAgICAgICBzdWNjZXNzOiByZXBvUmVzdWx0LnN1Y2Nlc3NcbiAgICAgIH0pO1xuICAgICAgaWYgKCFyZXBvUmVzdWx0LnN1Y2Nlc3MpIHtcbiAgICAgICAgcmV0dXJuIHJlcG9SZXN1bHQuZXJyb3IhO1xuICAgICAgfVxuXG4gICAgICAvLyBTdGVwIDc6IFN1Ym1pdCBlbGVtZW50IHRvIHBvcnRmb2xpbyBhbmQgaGFuZGxlIGNvbGxlY3Rpb24gc3VibWlzc2lvblxuICAgICAgbG9nZ2VyLmluZm8oJ/Cfk6QgU3RlcCA3Lzg6IFN1Ym1pdHRpbmcgdG8gcG9ydGZvbGlvLi4uJyk7XG4gICAgICBjb25zdCBzdGVwN1N0YXJ0ID0gRGF0ZS5ub3coKTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuc3VibWl0RWxlbWVudEFuZEhhbmRsZVJlc3BvbnNlKFxuICAgICAgICBzYWZlTmFtZSEsIFxuICAgICAgICBlbGVtZW50VHlwZSwgXG4gICAgICAgIG1ldGFkYXRhLCBcbiAgICAgICAgY29udGVudCwgXG4gICAgICAgIGF1dGhTdGF0dXMsXG4gICAgICAgIGxvY2FsUGF0aCAgLy8gUGFzcyBmaWxlIHBhdGggZm9yIGNvbGxlY3Rpb24gc3VibWlzc2lvblxuICAgICAgKTtcbiAgICAgIHRpbWluZ3NbJ3N1Ym1pc3Npb24nXSA9IERhdGUubm93KCkgLSBzdGVwN1N0YXJ0O1xuICAgICAgXG4gICAgICAvLyBTdGVwIDg6IEZpbmFsIHJlcG9ydGluZ1xuICAgICAgdGltaW5nc1sndG90YWwnXSA9IERhdGUubm93KCkgLSBzdGFydFRpbWU7XG4gICAgICBsb2dnZXIuaW5mbygn4pyoIFNVQk1JU1NJT04gV09SS0ZMT1cgQ09NUExFVEUnLCB7XG4gICAgICAgIHN1Y2Nlc3M6IHJlc3VsdC5zdWNjZXNzLFxuICAgICAgICB0aW1pbmdzLFxuICAgICAgICB0b3RhbFRpbWU6IGAke3RpbWluZ3NbJ3RvdGFsJ119bXNgXG4gICAgICB9KTtcbiAgICAgIFxuICAgICAgcmV0dXJuIHJlc3VsdDtcblxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvLyBTRUNVUklUWSBFTkhBTkNFTUVOVCAoVGFzayAjMTQpOiBFbmhhbmNlZCBlcnJvciBoYW5kbGluZyB3aXRoIHRva2VuIHJlZnJlc2ggZ3VpZGFuY2VcbiAgICAgIEVycm9ySGFuZGxlci5sb2dFcnJvcignc3VibWl0VG9Qb3J0Zm9saW8nLCBlcnJvciwge1xuICAgICAgICBlbGVtZW50TmFtZTogcGFyYW1zLm5hbWUsXG4gICAgICAgIGVsZW1lbnRUeXBlOiBwYXJhbXMudHlwZVxuICAgICAgfSk7XG5cbiAgICAgIC8vIENoZWNrIGlmIGVycm9yIGlzIHRva2VuLXJlbGF0ZWQgYW5kIHByb3ZpZGUgcmVmcmVzaCBndWlkYW5jZVxuICAgICAgY29uc3QgZXJyb3JNZXNzYWdlID0gZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpO1xuICAgICAgY29uc3QgaXNUb2tlbkVycm9yID0gZXJyb3JNZXNzYWdlLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoJ3Rva2VuJykgfHwgXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yTWVzc2FnZS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKCdhdXRoJykgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JNZXNzYWdlLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoJzQwMScpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yTWVzc2FnZS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKCc0MDMnKTtcblxuICAgICAgbGV0IGZvcm1hdHRlZEVycm9yID0gRXJyb3JIYW5kbGVyLmZvcm1hdEZvclJlc3BvbnNlKGVycm9yKTtcblxuICAgICAgaWYgKGlzVG9rZW5FcnJvcikge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIC8vIEdldCBjdXJyZW50IHRva2VuIHRvIGRldGVybWluZSB0eXBlIGZvciBndWlkYW5jZVxuICAgICAgICAgIGNvbnN0IGN1cnJlbnRUb2tlbiA9IGF3YWl0IFRva2VuTWFuYWdlci5nZXRHaXRIdWJUb2tlbkFzeW5jKCk7XG4gICAgICAgICAgaWYgKGN1cnJlbnRUb2tlbikge1xuICAgICAgICAgICAgY29uc3QgdG9rZW5UeXBlID0gVG9rZW5NYW5hZ2VyLmdldFRva2VuVHlwZShjdXJyZW50VG9rZW4pO1xuICAgICAgICAgICAgY29uc3QgcmVmcmVzaEd1aWRhbmNlID0gdGhpcy5mb3JtYXRUb2tlblJlZnJlc2hHdWlkYW5jZSgncG9ydGZvbGlvIHN1Ym1pc3Npb24nLCB0b2tlblR5cGUpO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBBcHBlbmQgcmVmcmVzaCBndWlkYW5jZSB0byBlcnJvciBtZXNzYWdlXG4gICAgICAgICAgICBpZiAoZm9ybWF0dGVkRXJyb3IubWVzc2FnZSkge1xuICAgICAgICAgICAgICBmb3JtYXR0ZWRFcnJvci5tZXNzYWdlICs9IHJlZnJlc2hHdWlkYW5jZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKHRva2VuRXJyb3IpIHtcbiAgICAgICAgICAvLyBJZiB3ZSBjYW4ndCBnZXQgdG9rZW4gaW5mbywgcHJvdmlkZSBnZW5lcmljIGd1aWRhbmNlXG4gICAgICAgICAgZm9ybWF0dGVkRXJyb3IubWVzc2FnZSArPSAnXFxuXFxu8J+UhCAqKkF1dGhlbnRpY2F0aW9uIElzc3VlKio6IFRyeSBydW5uaW5nIGBzZXR1cF9naXRodWJfYXV0aGAgdG8gcmVmcmVzaCB5b3VyIGF1dGhlbnRpY2F0aW9uLic7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGZvcm1hdHRlZEVycm9yO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBQcm9tcHRzIHVzZXIgdG8gc3VibWl0IGNvbnRlbnQgdG8gdGhlIERvbGxob3VzZU1DUCBjb2xsZWN0aW9uXG4gICAqIEVOSEFOQ0VNRU5UIChJc3N1ZSAjNTQ5KTogQ29tcGxldGUgdGhlIGNvbW11bml0eSBjb250cmlidXRpb24gd29ya2Zsb3dcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcHJvbXB0Rm9yQ29sbGVjdGlvblN1Ym1pc3Npb24ocGFyYW1zOiB7XG4gICAgZWxlbWVudE5hbWU6IHN0cmluZztcbiAgICBlbGVtZW50VHlwZTogRWxlbWVudFR5cGU7XG4gICAgcG9ydGZvbGlvVXJsOiBzdHJpbmc7XG4gICAgdXNlcm5hbWU6IHN0cmluZztcbiAgICBtZXRhZGF0YTogUG9ydGZvbGlvRWxlbWVudE1ldGFkYXRhO1xuICAgIHRva2VuOiBzdHJpbmc7XG4gICAgbG9jYWxQYXRoPzogc3RyaW5nOyAgLy8gUGF0aCB0byB0aGUgbG9jYWwgZWxlbWVudCBmaWxlXG4gIH0pOiBQcm9taXNlPHsgc3VibWl0dGVkOiBib29sZWFuOyBkZWNsaW5lZDogYm9vbGVhbjsgZXJyb3I/OiBzdHJpbmc7IGlzc3VlVXJsPzogc3RyaW5nOyBpc0R1cGxpY2F0ZT86IGJvb2xlYW4gfT4ge1xuICAgIHRyeSB7XG4gICAgICAvLyBDcmVhdGUgYSBzaW1wbGUgcHJvbXB0IG1lc3NhZ2UgZm9yIHRoZSB1c2VyXG4gICAgICAvLyBOb3RlOiBJbiBNQ1AgY29udGV4dCwgd2UgY2FuJ3QgZG8gaW50ZXJhY3RpdmUgcHJvbXB0cywgc28gd2UnbGwgbmVlZCB0b1xuICAgICAgLy8gZWl0aGVyIG1ha2UgdGhpcyBhdXRvbWF0aWMgb3IgcmVxdWlyZSBhIHBhcmFtZXRlclxuICAgICAgXG4gICAgICAvLyBGb3Igbm93LCBsZXQncyBjaGVjayBpZiB0aGUgdXNlciBoYXMgc2V0IGFuIGVudmlyb25tZW50IHZhcmlhYmxlXG4gICAgICAvLyB0byBhdXRvLXN1Ym1pdCB0byBjb2xsZWN0aW9uIChvcHQtaW4gYmVoYXZpb3IpXG4gICAgICBjb25zdCBhdXRvU3VibWl0ID0gcHJvY2Vzcy5lbnYuRE9MTEhPVVNFX0FVVE9fU1VCTUlUX1RPX0NPTExFQ1RJT04gPT09ICd0cnVlJztcbiAgICAgIFxuICAgICAgaWYgKCFhdXRvU3VibWl0KSB7XG4gICAgICAgIC8vIFVzZXIgaGFzbid0IG9wdGVkIGluIHRvIGF1dG8tc3VibWlzc2lvblxuICAgICAgICBsb2dnZXIuaW5mbygnQ29sbGVjdGlvbiBzdWJtaXNzaW9uIHNraXBwZWQgKHNldCBET0xMSE9VU0VfQVVUT19TVUJNSVRfVE9fQ09MTEVDVElPTj10cnVlIHRvIGVuYWJsZSknKTtcbiAgICAgICAgLy8gVXNlIENPTExfQ0ZHXzAwMSBlcnJvciBjb2RlIGZvciBhdXRvLXN1Ym1pdCBkaXNhYmxlZFxuICAgICAgICBjb25zdCBlcnJvck1lc3NhZ2UgPSBmb3JtYXRDb2xsZWN0aW9uRXJyb3IoQ29sbGVjdGlvbkVycm9yQ29kZS5DT0xMX0NGR18wMDEsIDUsIDUpO1xuICAgICAgICByZXR1cm4geyBzdWJtaXR0ZWQ6IGZhbHNlLCBkZWNsaW5lZDogdHJ1ZSwgZXJyb3I6IGVycm9yTWVzc2FnZSB9O1xuICAgICAgfVxuXG4gICAgICBsb2dnZXIuaW5mbygnQXV0by1zdWJtaXR0aW5nIHRvIERvbGxob3VzZU1DUCBjb2xsZWN0aW9uLi4uJyk7XG5cbiAgICAgIC8vIENyZWF0ZSB0aGUgaXNzdWUgaW4gdGhlIGNvbGxlY3Rpb24gcmVwb3NpdG9yeVxuICAgICAgY29uc3QgaXNzdWVVcmwgPSBhd2FpdCB0aGlzLmNyZWF0ZUNvbGxlY3Rpb25Jc3N1ZSh7XG4gICAgICAgIC4uLnBhcmFtcyxcbiAgICAgICAgdG9rZW46IHBhcmFtcy50b2tlbixcbiAgICAgICAgbG9jYWxQYXRoOiBwYXJhbXMubG9jYWxQYXRoICAvLyBQYXNzIHRocm91Z2ggdGhlIGZpbGUgcGF0aFxuICAgICAgfSk7XG5cbiAgICAgIGlmIChpc3N1ZVVybCkge1xuICAgICAgICAvLyBDaGVjayBpZiB0aGlzIHdhcyBhbiBleGlzdGluZyBpc3N1ZSAoZHVwbGljYXRlKSBvciBuZXdseSBjcmVhdGVkXG4gICAgICAgIC8vIFRoZSBjaGVja0V4aXN0aW5nSXNzdWUgbWV0aG9kIHJldHVybnMgZWFybHkgd2l0aCBleGlzdGluZyBVUkwgaWYgZHVwbGljYXRlIGZvdW5kXG4gICAgICAgIGNvbnN0IGlzRHVwbGljYXRlID0gaXNzdWVVcmwuaW5jbHVkZXMoJy9pc3N1ZXMvJykgJiYgIWlzc3VlVXJsLmluY2x1ZGVzKCduZXcnKTtcbiAgICAgICAgXG4gICAgICAgIGlmIChpc0R1cGxpY2F0ZSkge1xuICAgICAgICAgIGxvZ2dlci5pbmZvKCdDb2xsZWN0aW9uIGlzc3VlIGFscmVhZHkgZXhpc3RzLCByZXR1cm5pbmcgZXhpc3RpbmcgaXNzdWUnLCB7IGlzc3VlVXJsIH0pO1xuICAgICAgICAgIHJldHVybiB7IFxuICAgICAgICAgICAgc3VibWl0dGVkOiB0cnVlLCBcbiAgICAgICAgICAgIGRlY2xpbmVkOiBmYWxzZSwgXG4gICAgICAgICAgICBpc3N1ZVVybCxcbiAgICAgICAgICAgIGlzRHVwbGljYXRlOiB0cnVlIFxuICAgICAgICAgIH07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbG9nZ2VyLmluZm8oJ1N1Y2Nlc3NmdWxseSBjcmVhdGVkIGNvbGxlY3Rpb24gc3VibWlzc2lvbiBpc3N1ZScsIHsgaXNzdWVVcmwgfSk7XG4gICAgICAgICAgcmV0dXJuIHsgXG4gICAgICAgICAgICBzdWJtaXR0ZWQ6IHRydWUsIFxuICAgICAgICAgICAgZGVjbGluZWQ6IGZhbHNlLCBcbiAgICAgICAgICAgIGlzc3VlVXJsLFxuICAgICAgICAgICAgaXNEdXBsaWNhdGU6IGZhbHNlIFxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB7IHN1Ym1pdHRlZDogZmFsc2UsIGRlY2xpbmVkOiBmYWxzZSwgZXJyb3I6ICdGYWlsZWQgdG8gY3JlYXRlIGlzc3VlJyB9O1xuICAgICAgfVxuXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci5lcnJvcignRXJyb3IgaW4gY29sbGVjdGlvbiBzdWJtaXNzaW9uIHByb21wdCcsIHsgZXJyb3IgfSk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzdWJtaXR0ZWQ6IGZhbHNlLFxuICAgICAgICBkZWNsaW5lZDogZmFsc2UsXG4gICAgICAgIGVycm9yOiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6ICdVbmtub3duIGVycm9yJ1xuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhbiBpc3N1ZSBpbiB0aGUgRG9sbGhvdXNlTUNQL2NvbGxlY3Rpb24gcmVwb3NpdG9yeVxuICAgKiBFTkhBTkNFTUVOVCAoSXNzdWUgIzU0OSk6IEdpdEh1YiBBUEkgaW50ZWdyYXRpb24gZm9yIGNvbGxlY3Rpb24gc3VibWlzc2lvblxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBjcmVhdGVDb2xsZWN0aW9uSXNzdWUocGFyYW1zOiB7XG4gICAgZWxlbWVudE5hbWU6IHN0cmluZztcbiAgICBlbGVtZW50VHlwZTogRWxlbWVudFR5cGU7XG4gICAgcG9ydGZvbGlvVXJsOiBzdHJpbmc7XG4gICAgdXNlcm5hbWU6IHN0cmluZztcbiAgICBtZXRhZGF0YTogUG9ydGZvbGlvRWxlbWVudE1ldGFkYXRhO1xuICAgIHRva2VuOiBzdHJpbmc7XG4gICAgbG9jYWxQYXRoPzogc3RyaW5nOyAgLy8gUGF0aCB0byB0aGUgbG9jYWwgZWxlbWVudCBmaWxlXG4gIH0pOiBQcm9taXNlPHN0cmluZyB8IG51bGw+IHtcbiAgICB0cnkge1xuICAgICAgLy8gRFVQTElDQVRFIERFVEVDVElPTjogQ2hlY2sgaWYgaXNzdWUgYWxyZWFkeSBleGlzdHNcbiAgICAgIGNvbnN0IGV4aXN0aW5nSXNzdWVVcmwgPSBhd2FpdCB0aGlzLmNoZWNrRXhpc3RpbmdJc3N1ZShcbiAgICAgICAgcGFyYW1zLmVsZW1lbnROYW1lLFxuICAgICAgICBwYXJhbXMudXNlcm5hbWUsXG4gICAgICAgIHBhcmFtcy50b2tlblxuICAgICAgKTtcbiAgICAgIFxuICAgICAgaWYgKGV4aXN0aW5nSXNzdWVVcmwpIHtcbiAgICAgICAgbG9nZ2VyLmluZm8oJ0NvbGxlY3Rpb24gaXNzdWUgYWxyZWFkeSBleGlzdHMsIHNraXBwaW5nIGNyZWF0aW9uJywge1xuICAgICAgICAgIGVsZW1lbnROYW1lOiBwYXJhbXMuZWxlbWVudE5hbWUsXG4gICAgICAgICAgaXNzdWVVcmw6IGV4aXN0aW5nSXNzdWVVcmxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBleGlzdGluZ0lzc3VlVXJsO1xuICAgICAgfVxuXG4gICAgICAvLyBGb3JtYXQgdGhlIGlzc3VlIHRpdGxlXG4gICAgICBjb25zdCB0aXRsZSA9IGBbJHtwYXJhbXMuZWxlbWVudFR5cGV9XSBBZGQgJHtwYXJhbXMuZWxlbWVudE5hbWV9IGJ5IEAke3BhcmFtcy51c2VybmFtZX1gO1xuXG4gICAgICAvLyBGb3JtYXQgdGhlIGlzc3VlIGJvZHkgd2l0aCBhbGwgcmVsZXZhbnQgaW5mb3JtYXRpb25cbiAgICAgIC8vIEJ1aWxkIGFkZGl0aW9uYWwgbWV0YWRhdGEgZmllbGRzIGZvciBkaXNwbGF5XG4gICAgICAvLyBUWVBFIFNBRkVUWTogRGVmaW5lIGludGVyZmFjZSBmb3IgZXh0ZW5kZWQgbWV0YWRhdGFcbiAgICAgIGludGVyZmFjZSBFeHRlbmRlZE1ldGEgZXh0ZW5kcyBQb3J0Zm9saW9FbGVtZW50TWV0YWRhdGEge1xuICAgICAgICBjYXRlZ29yeT86IHN0cmluZztcbiAgICAgICAgdHJpZ2dlcnM/OiBzdHJpbmdbXTtcbiAgICAgICAgYWdlX3JhdGluZz86IHN0cmluZztcbiAgICAgICAgYWlfZ2VuZXJhdGVkPzogYm9vbGVhbjtcbiAgICAgICAgZ2VuZXJhdGlvbl9tZXRob2Q/OiBzdHJpbmc7XG4gICAgICAgIGxpY2Vuc2U/OiBzdHJpbmc7XG4gICAgICAgIHRhZ3M/OiBzdHJpbmdbXTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgY29uc3QgYWRkaXRpb25hbEZpZWxkczogc3RyaW5nW10gPSBbXTtcbiAgICAgIGNvbnN0IG1ldGEgPSBwYXJhbXMubWV0YWRhdGEgYXMgRXh0ZW5kZWRNZXRhO1xuICAgICAgXG4gICAgICBpZiAobWV0YS5jYXRlZ29yeSkgYWRkaXRpb25hbEZpZWxkcy5wdXNoKGAqKkNhdGVnb3J5Kio6ICR7bWV0YS5jYXRlZ29yeX1gKTtcbiAgICAgIGlmIChtZXRhLnZlcnNpb24pIGFkZGl0aW9uYWxGaWVsZHMucHVzaChgKipWZXJzaW9uKio6ICR7bWV0YS52ZXJzaW9ufWApO1xuICAgICAgaWYgKG1ldGEudHJpZ2dlcnMgJiYgQXJyYXkuaXNBcnJheShtZXRhLnRyaWdnZXJzKSAmJiBtZXRhLnRyaWdnZXJzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgYWRkaXRpb25hbEZpZWxkcy5wdXNoKGAqKlRyaWdnZXJzKio6ICR7bWV0YS50cmlnZ2Vycy5qb2luKCcsICcpfWApO1xuICAgICAgfVxuICAgICAgaWYgKG1ldGEuYWdlX3JhdGluZykgYWRkaXRpb25hbEZpZWxkcy5wdXNoKGAqKkFnZSBSYXRpbmcqKjogJHttZXRhLmFnZV9yYXRpbmd9YCk7XG4gICAgICBpZiAobWV0YS5haV9nZW5lcmF0ZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBhZGRpdGlvbmFsRmllbGRzLnB1c2goYCoqQUkgR2VuZXJhdGVkKio6ICR7bWV0YS5haV9nZW5lcmF0ZWQgPyAnWWVzJyA6ICdObyd9YCk7XG4gICAgICB9XG4gICAgICBpZiAobWV0YS5nZW5lcmF0aW9uX21ldGhvZCkgYWRkaXRpb25hbEZpZWxkcy5wdXNoKGAqKkdlbmVyYXRpb24gTWV0aG9kKio6ICR7bWV0YS5nZW5lcmF0aW9uX21ldGhvZH1gKTtcbiAgICAgIGlmIChtZXRhLmxpY2Vuc2UpIGFkZGl0aW9uYWxGaWVsZHMucHVzaChgKipMaWNlbnNlKio6ICR7bWV0YS5saWNlbnNlfWApO1xuICAgICAgaWYgKG1ldGEudGFncyAmJiBBcnJheS5pc0FycmF5KG1ldGEudGFncykgJiYgbWV0YS50YWdzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgYWRkaXRpb25hbEZpZWxkcy5wdXNoKGAqKlRhZ3MqKjogJHttZXRhLnRhZ3Muam9pbignLCAnKX1gKTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gUmVhZCB0aGUgZnVsbCBlbGVtZW50IGZpbGUgY29udGVudCBpZiBwYXRoIGlzIHByb3ZpZGVkXG4gICAgICBsZXQgZWxlbWVudENvbnRlbnQgPSAnJztcbiAgICAgIGlmIChwYXJhbXMubG9jYWxQYXRoKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgLy8gU0VDVVJJVFk6IFZhbGlkYXRlIGZpbGUgc2l6ZSBiZWZvcmUgcmVhZGluZyB0byBwcmV2ZW50IG1lbW9yeSBleGhhdXN0aW9uXG4gICAgICAgICAgY29uc3Qgc3RhdHMgPSBhd2FpdCBmcy5zdGF0KHBhcmFtcy5sb2NhbFBhdGgpO1xuICAgICAgICAgIGlmIChzdGF0cy5zaXplID4gRklMRV9TSVpFX0xJTUlUUy5NQVhfRklMRV9TSVpFKSB7XG4gICAgICAgICAgICAvLyBETyBOT1QgdHJ1bmNhdGUgdXNlciBjb250ZW50IC0gcmVqZWN0IGlmIHRvbyBsYXJnZVxuICAgICAgICAgICAgbG9nZ2VyLmVycm9yKCdFbGVtZW50IGZpbGUgZXhjZWVkcyBzaXplIGxpbWl0IGZvciBjb2xsZWN0aW9uIHN1Ym1pc3Npb24nLCB7XG4gICAgICAgICAgICAgIGVsZW1lbnROYW1lOiBwYXJhbXMuZWxlbWVudE5hbWUsXG4gICAgICAgICAgICAgIGZpbGVTaXplOiBzdGF0cy5zaXplLFxuICAgICAgICAgICAgICBtYXhTaXplOiBGSUxFX1NJWkVfTElNSVRTLk1BWF9GSUxFX1NJWkVcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgICAgICAgIHR5cGU6ICdDT05URU5UX0lOSkVDVElPTl9BVFRFTVBUJyxcbiAgICAgICAgICAgICAgc2V2ZXJpdHk6ICdNRURJVU0nLFxuICAgICAgICAgICAgICBzb3VyY2U6ICdTdWJtaXRUb1BvcnRmb2xpb1Rvb2wuY3JlYXRlQ29sbGVjdGlvbklzc3VlJyxcbiAgICAgICAgICAgICAgZGV0YWlsczogYEZpbGUgc2l6ZSAke3N0YXRzLnNpemV9IGV4Y2VlZHMgbGltaXQgZm9yIGNvbGxlY3Rpb24gc3VibWlzc2lvbmAsXG4gICAgICAgICAgICAgIG1ldGFkYXRhOiB7XG4gICAgICAgICAgICAgICAgZWxlbWVudE5hbWU6IHBhcmFtcy5lbGVtZW50TmFtZSxcbiAgICAgICAgICAgICAgICBmaWxlU2l6ZTogc3RhdHMuc2l6ZSxcbiAgICAgICAgICAgICAgICBsaW1pdDogRklMRV9TSVpFX0xJTUlUUy5NQVhfRklMRV9TSVpFXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBSZXR1cm4gZXJyb3IgbWVzc2FnZSBpbnN0ZWFkIG9mIHRydW5jYXRpbmdcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgIH1cbiAgICAgICAgICBcbiAgICAgICAgICAvLyBSZWFkIHRoZSBmdWxsIG1hcmtkb3duIGZpbGUgd2l0aCBmcm9udG1hdHRlciBhbmQgY29udGVudFxuICAgICAgICAgIGVsZW1lbnRDb250ZW50ID0gYXdhaXQgZnMucmVhZEZpbGUocGFyYW1zLmxvY2FsUGF0aCwgJ3V0Zi04Jyk7XG4gICAgICAgICAgXG4gICAgICAgICAgLy8gU0VDVVJJVFk6IFZhbGlkYXRlIGNvbnRlbnQgZm9yIHNlY3VyaXR5IGlzc3Vlc1xuICAgICAgICAgIC8vIE5vdGU6IFdlIGFscmVhZHkgdmFsaWRhdGVkIHRoaXMgY29udGVudCBpbiB2YWxpZGF0ZUZpbGVBbmRDb250ZW50KClcbiAgICAgICAgICAvLyBidXQgd2UgcmUtdmFsaWRhdGUgaGVyZSBzaW5jZSB0aGlzIGlzIGJlaW5nIHBvc3RlZCB0byBhIHB1YmxpYyBpc3N1ZVxuICAgICAgICAgIGNvbnN0IHZhbGlkYXRpb25SZXN1bHQgPSBDb250ZW50VmFsaWRhdG9yLnZhbGlkYXRlQW5kU2FuaXRpemUoZWxlbWVudENvbnRlbnQpO1xuICAgICAgICAgIFxuICAgICAgICAgIGlmICghdmFsaWRhdGlvblJlc3VsdC5pc1ZhbGlkICYmIHZhbGlkYXRpb25SZXN1bHQuc2V2ZXJpdHkgPT09ICdjcml0aWNhbCcpIHtcbiAgICAgICAgICAgIGxvZ2dlci5lcnJvcignRWxlbWVudCBjb250ZW50IGZhaWxlZCBzZWN1cml0eSB2YWxpZGF0aW9uIGZvciBjb2xsZWN0aW9uIHN1Ym1pc3Npb24nLCB7XG4gICAgICAgICAgICAgIGVsZW1lbnROYW1lOiBwYXJhbXMuZWxlbWVudE5hbWUsXG4gICAgICAgICAgICAgIGlzc3VlczogdmFsaWRhdGlvblJlc3VsdC5kZXRlY3RlZFBhdHRlcm5zXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICAgICAgICB0eXBlOiAnQ09OVEVOVF9JTkpFQ1RJT05fQVRURU1QVCcsXG4gICAgICAgICAgICAgIHNldmVyaXR5OiAnSElHSCcsXG4gICAgICAgICAgICAgIHNvdXJjZTogJ1N1Ym1pdFRvUG9ydGZvbGlvVG9vbC5jcmVhdGVDb2xsZWN0aW9uSXNzdWUnLFxuICAgICAgICAgICAgICBkZXRhaWxzOiBgQ3JpdGljYWwgc2VjdXJpdHkgaXNzdWVzIGRldGVjdGVkIGluIGNvbGxlY3Rpb24gc3VibWlzc2lvbmAsXG4gICAgICAgICAgICAgIG1ldGFkYXRhOiB7XG4gICAgICAgICAgICAgICAgZWxlbWVudE5hbWU6IHBhcmFtcy5lbGVtZW50TmFtZSxcbiAgICAgICAgICAgICAgICBkZXRlY3RlZFBhdHRlcm5zOiB2YWxpZGF0aW9uUmVzdWx0LmRldGVjdGVkUGF0dGVybnNcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8vIERPIE5PVCBzdWJtaXQgY29udGVudCB3aXRoIHNlY3VyaXR5IGlzc3Vlc1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgfVxuICAgICAgICAgIFxuICAgICAgICAgIC8vIFVzZSB0aGUgc2FuaXRpemVkIGNvbnRlbnQgKGJ1dCBOT1QgdHJ1bmNhdGVkKVxuICAgICAgICAgIGVsZW1lbnRDb250ZW50ID0gdmFsaWRhdGlvblJlc3VsdC5zYW5pdGl6ZWRDb250ZW50IHx8IGVsZW1lbnRDb250ZW50O1xuICAgICAgICAgIFxuICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnUmVhZCBhbmQgdmFsaWRhdGVkIGVsZW1lbnQgZmlsZSBjb250ZW50IGZvciBjb2xsZWN0aW9uIHN1Ym1pc3Npb24nLCB7XG4gICAgICAgICAgICBlbGVtZW50TmFtZTogcGFyYW1zLmVsZW1lbnROYW1lLFxuICAgICAgICAgICAgY29udGVudExlbmd0aDogZWxlbWVudENvbnRlbnQubGVuZ3RoLFxuICAgICAgICAgICAgc2VjdXJpdHlJc3N1ZXM6IHZhbGlkYXRpb25SZXN1bHQuZGV0ZWN0ZWRQYXR0ZXJucz8ubGVuZ3RoIHx8IDAsXG4gICAgICAgICAgICBidWlsZFZlcnNpb246ICd2MS42LjktYmV0YTEtY29sbGVjdGlvbi1maXgnICAvLyBWZXJzaW9uIGlkZW50aWZpZXIgZm9yIHZlcmlmaWNhdGlvblxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGxvZ2dlci53YXJuKCdGYWlsZWQgdG8gcmVhZCBlbGVtZW50IGZpbGUgY29udGVudCwgZmFsbGluZyBiYWNrIHRvIG1ldGFkYXRhIG9ubHknLCB7XG4gICAgICAgICAgICBlbGVtZW50TmFtZTogcGFyYW1zLmVsZW1lbnROYW1lLFxuICAgICAgICAgICAgZXJyb3I6IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIC8vIEZhbGwgYmFjayB0byBqdXN0IHRoZSBtZXRhZGF0YSBpZiB3ZSBjYW4ndCByZWFkIHRoZSBmaWxlXG4gICAgICAgICAgZWxlbWVudENvbnRlbnQgPSB0aGlzLmZvcm1hdE1ldGFkYXRhQXNZYW1sKHBhcmFtcy5tZXRhZGF0YSwgbWV0YSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIE5vIGZpbGUgcGF0aCBwcm92aWRlZCwgdXNlIG1ldGFkYXRhIGFzIGZhbGxiYWNrXG4gICAgICAgIGxvZ2dlci53YXJuKCdObyBmaWxlIHBhdGggcHJvdmlkZWQgZm9yIGNvbGxlY3Rpb24gc3VibWlzc2lvbiwgdXNpbmcgbWV0YWRhdGEgb25seScsIHtcbiAgICAgICAgICBlbGVtZW50TmFtZTogcGFyYW1zLmVsZW1lbnROYW1lXG4gICAgICAgIH0pO1xuICAgICAgICBlbGVtZW50Q29udGVudCA9IHRoaXMuZm9ybWF0TWV0YWRhdGFBc1lhbWwocGFyYW1zLm1ldGFkYXRhLCBtZXRhKTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgY29uc3QgYm9keSA9IGAjIyBOZXcgJHtwYXJhbXMuZWxlbWVudFR5cGV9IFN1Ym1pc3Npb25cblxuKipOYW1lKio6ICR7cGFyYW1zLmVsZW1lbnROYW1lfVxuKipBdXRob3IqKjogQCR7cGFyYW1zLnVzZXJuYW1lfVxuKipUeXBlKio6ICR7cGFyYW1zLmVsZW1lbnRUeXBlfVxuXG4jIyMgRGVzY3JpcHRpb25cbiR7cGFyYW1zLm1ldGFkYXRhLmRlc2NyaXB0aW9uIHx8ICdObyBkZXNjcmlwdGlvbiBwcm92aWRlZCd9XG5cbiMjIyBFbGVtZW50IERldGFpbHNcbiR7YWRkaXRpb25hbEZpZWxkcy5sZW5ndGggPiAwID8gYWRkaXRpb25hbEZpZWxkcy5qb2luKCdcXG4nKSA6ICcqTm8gYWRkaXRpb25hbCBtZXRhZGF0YSBhdmFpbGFibGUqJ31cblxuIyMjIFBvcnRmb2xpbyBMaW5rXG4ke3BhcmFtcy5wb3J0Zm9saW9Vcmx9XG5cbiMjIyBFbGVtZW50IENvbnRlbnRcblxcYFxcYFxcYHlhbWxcbiR7ZWxlbWVudENvbnRlbnR9XG5cXGBcXGBcXGBcblxuIyMjIFJldmlldyBDaGVja2xpc3Rcbi0gWyBdIENvbnRlbnQgaXMgYXBwcm9wcmlhdGUgYW5kIGZvbGxvd3MgY29tbXVuaXR5IGd1aWRlbGluZXNcbi0gWyBdIE5vIHNlY3VyaXR5IHZ1bG5lcmFiaWxpdGllcyBvciBtYWxpY2lvdXMgcGF0dGVybnNcbi0gWyBdIE1ldGFkYXRhIGlzIGNvbXBsZXRlIGFuZCBhY2N1cmF0ZVxuLSBbIF0gRWxlbWVudCB3b3JrcyBhcyBkZXNjcmliZWRcbi0gWyBdIE5vIGR1cGxpY2F0ZSBvZiBleGlzdGluZyBjb2xsZWN0aW9uIGNvbnRlbnRcblxuLS0tXG4qVGhpcyBzdWJtaXNzaW9uIHdhcyBjcmVhdGVkIGF1dG9tYXRpY2FsbHkgdmlhIHRoZSBEb2xsaG91c2VNQ1Agc3VibWl0X2NvbnRlbnQgdG9vbCAodjEuNi45LWJldGExLWNvbGxlY3Rpb24tZml4KS4qYDtcblxuICAgICAgLy8gRGV0ZXJtaW5lIGxhYmVscyBiYXNlZCBvbiBlbGVtZW50IHR5cGVcbiAgICAgIGNvbnN0IGxhYmVscyA9IFtcbiAgICAgICAgJ2VsZW1lbnQtc3VibWlzc2lvbicsICAvLyBDUklUSUNBTDogVHJpZ2dlcnMgYXV0b21hdGlvbiB3b3JrZmxvd1xuICAgICAgICAnY29sbGVjdGlvbi1yZXBvJywgICAgIC8vIEluZGljYXRlcyB0aGlzIGlzIGZvciB0aGUgY29sbGVjdGlvblxuICAgICAgICAnY29udHJpYnV0aW9uJywgICAgICAgIC8vIEFsbCBzdWJtaXNzaW9ucyBnZXQgdGhpc1xuICAgICAgICAncGVuZGluZy1yZXZpZXcnLCAgICAgIC8vIE5lZWRzIHJldmlld1xuICAgICAgICBwYXJhbXMuZWxlbWVudFR5cGUudG9Mb3dlckNhc2UoKSAvLyBFbGVtZW50IHR5cGUgbGFiZWwgKGUuZy4sICdwZXJzb25hcycpXG4gICAgICBdO1xuXG4gICAgICAvLyBQRVJGT1JNQU5DRSBPUFRJTUlaQVRJT04gKFRhc2sgIzYpOiBVc2UgR2l0SHViIHJhdGUgbGltaXRlciBmb3IgQVBJIGNhbGxzXG4gICAgICAvLyBUaGlzIHByZXZlbnRzIGhpdHRpbmcgR2l0SHViIHJhdGUgbGltaXRzIGFuZCBwcm92aWRlcyBiZXR0ZXIgZXJyb3IgaGFuZGxpbmdcbiAgICAgIGNvbnN0IGlzc3VlVXJsID0gYXdhaXQgZ2l0aHViUmF0ZUxpbWl0ZXIucXVldWVSZXF1ZXN0KFxuICAgICAgICAnY3JlYXRlLWNvbGxlY3Rpb24taXNzdWUnLFxuICAgICAgICBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgdXJsID0gJ2h0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvRG9sbGhvdXNlTUNQL2NvbGxlY3Rpb24vaXNzdWVzJztcbiAgICAgICAgICBcbiAgICAgICAgICAvLyBDcmVhdGUgQWJvcnRDb250cm9sbGVyIGZvciB0aW1lb3V0XG4gICAgICAgICAgY29uc3QgY29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcbiAgICAgICAgICBjb25zdCB0aW1lb3V0SWQgPSBzZXRUaW1lb3V0KCgpID0+IGNvbnRyb2xsZXIuYWJvcnQoKSwgZ2V0VmFsaWRhdGVkVGltZW91dCgpKTtcbiAgICAgICAgICBcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh1cmwsIHtcbiAgICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgICAgICAnQWNjZXB0JzogJ2FwcGxpY2F0aW9uL3ZuZC5naXRodWIudjMranNvbicsXG4gICAgICAgICAgICAgICAgJ0F1dGhvcml6YXRpb24nOiBgQmVhcmVyICR7cGFyYW1zLnRva2VufWAsXG4gICAgICAgICAgICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgICAgICAgICAnVXNlci1BZ2VudCc6ICdEb2xsaG91c2VNQ1AvMS4wJ1xuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICAgICAgdGl0bGUsXG4gICAgICAgICAgICAgICAgYm9keSxcbiAgICAgICAgICAgICAgICBsYWJlbHNcbiAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgIHNpZ25hbDogY29udHJvbGxlci5zaWduYWxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQodGltZW91dElkKTtcblxuICAgICAgICAgICAgLy8gUEVSRk9STUFOQ0UgT1BUSU1JWkFUSU9OIChUYXNrICMxNSk6IEVuaGFuY2VkIHJhdGUgbGltaXQgbG9nZ2luZ1xuICAgICAgICAgICAgLy8gTG9nIHJhdGUgbGltaXQgaGVhZGVycyBmb3IgZGlhZ25vc3RpY3NcbiAgICAgICAgICAgIGNvbnN0IHJhdGVMaW1pdFJlbWFpbmluZyA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KCdYLVJhdGVMaW1pdC1SZW1haW5pbmcnKTtcbiAgICAgICAgICAgIGNvbnN0IHJhdGVMaW1pdFJlc2V0ID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoJ1gtUmF0ZUxpbWl0LVJlc2V0Jyk7XG4gICAgICAgICAgICBjb25zdCByYXRlTGltaXRMaW1pdCA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KCdYLVJhdGVMaW1pdC1MaW1pdCcpO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICBsb2dnZXIuZGVidWcoJ0dpdEh1YiBBUEkgcmF0ZSBsaW1pdCBzdGF0dXMnLCB7XG4gICAgICAgICAgICAgIG9wZXJhdGlvbjogJ2NyZWF0ZS1jb2xsZWN0aW9uLWlzc3VlJyxcbiAgICAgICAgICAgICAgcmVtYWluaW5nOiByYXRlTGltaXRSZW1haW5pbmcsXG4gICAgICAgICAgICAgIGxpbWl0OiByYXRlTGltaXRMaW1pdCxcbiAgICAgICAgICAgICAgcmVzZXRUaW1lOiByYXRlTGltaXRSZXNldCA/IG5ldyBEYXRlKHBhcnNlSW50KHJhdGVMaW1pdFJlc2V0KSAqIDEwMDApIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICByZXNwb25zZVN0YXR1czogcmVzcG9uc2Uuc3RhdHVzXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLy8gTG9nIHdhcm5pbmcgaWYgYXBwcm9hY2hpbmcgcmF0ZSBsaW1pdFxuICAgICAgICAgICAgaWYgKHJhdGVMaW1pdFJlbWFpbmluZyAmJiBwYXJzZUludChyYXRlTGltaXRSZW1haW5pbmcpIDwgMTAwKSB7XG4gICAgICAgICAgICAgIGxvZ2dlci53YXJuKCdBcHByb2FjaGluZyBHaXRIdWIgQVBJIHJhdGUgbGltaXQnLCB7XG4gICAgICAgICAgICAgICAgb3BlcmF0aW9uOiAnY3JlYXRlLWNvbGxlY3Rpb24taXNzdWUnLFxuICAgICAgICAgICAgICAgIHJlbWFpbmluZzogcmF0ZUxpbWl0UmVtYWluaW5nLFxuICAgICAgICAgICAgICAgIHJlc2V0VGltZTogcmF0ZUxpbWl0UmVzZXQgPyBuZXcgRGF0ZShwYXJzZUludChyYXRlTGltaXRSZXNldCkgKiAxMDAwKSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICByZWNvbW1lbmRhdGlvbjogJ0NvbnNpZGVyIHJlZHVjaW5nIEFQSSB1c2FnZSBmcmVxdWVuY3kgb3IgYXV0aGVudGljYXRpbmcgZm9yIGhpZ2hlciBsaW1pdHMnXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGVycm9yVGV4dCA9IGF3YWl0IHJlc3BvbnNlLnRleHQoKTtcbiAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKCdHaXRIdWIgQVBJIGVycm9yIGNyZWF0aW5nIGlzc3VlJywgeyBcbiAgICAgICAgICAgICAgICBzdGF0dXM6IHJlc3BvbnNlLnN0YXR1cywgXG4gICAgICAgICAgICAgICAgc3RhdHVzVGV4dDogcmVzcG9uc2Uuc3RhdHVzVGV4dCxcbiAgICAgICAgICAgICAgICBlcnJvcjogZXJyb3JUZXh0LFxuICAgICAgICAgICAgICAgIHJhdGVMaW1pdFJlbWFpbmluZyxcbiAgICAgICAgICAgICAgICByYXRlTGltaXRSZXNldFxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgIGlmIChyZXNwb25zZS5zdGF0dXMgPT09IDQwNCkge1xuICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcignQ29sbGVjdGlvbiByZXBvc2l0b3J5IG5vdCBmb3VuZCBvciBubyBhY2Nlc3MnKTtcbiAgICAgICAgICAgICAgfSBlbHNlIGlmIChyZXNwb25zZS5zdGF0dXMgPT09IDQwMykge1xuICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcignUGVybWlzc2lvbiBkZW5pZWQgdG8gY3JlYXRlIGlzc3VlIGluIGNvbGxlY3Rpb24gcmVwbycpO1xuICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PT0gNDAxKSB7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKCdBdXRoZW50aWNhdGlvbiBmYWlsZWQgZm9yIGNvbGxlY3Rpb24gc3VibWlzc2lvbicpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgR2l0SHViIEFQSSBlcnJvcjogJHtyZXNwb25zZS5zdGF0dXN9ICR7cmVzcG9uc2Uuc3RhdHVzVGV4dH1gKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcbiAgICAgICAgICAgIHJldHVybiBkYXRhLmh0bWxfdXJsO1xuICAgICAgICAgICAgXG4gICAgICAgICAgfSBjYXRjaCAoZmV0Y2hFcnJvcjogYW55KSB7XG4gICAgICAgICAgICAvLyBSZS10aHJvdyB0byBvdXRlciBjYXRjaCBibG9ja1xuICAgICAgICAgICAgdGhyb3cgZmV0Y2hFcnJvcjtcbiAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXRJZCk7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICAnaGlnaCcgLy8gSGlnaCBwcmlvcml0eSBmb3IgY29sbGVjdGlvbiBzdWJtaXNzaW9uXG4gICAgICApO1xuICAgICAgXG4gICAgICByZXR1cm4gaXNzdWVVcmw7XG5cbiAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICAvLyBIYW5kbGUgdGltZW91dCBzcGVjaWZpY2FsbHlcbiAgICAgIGlmIChlcnJvci5uYW1lID09PSAnQWJvcnRFcnJvcicpIHtcbiAgICAgICAgbG9nZ2VyLmVycm9yKGBHaXRIdWIgQVBJIHJlcXVlc3QgdGltZW91dCBhZnRlciAke2dldFZhbGlkYXRlZFRpbWVvdXQoKX1tc2ApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbG9nZ2VyLmVycm9yKCdGYWlsZWQgdG8gY3JlYXRlIGNvbGxlY3Rpb24gaXNzdWUnLCB7IFxuICAgICAgICAgIGVycm9yOiBlcnJvci5tZXNzYWdlIHx8IGVycm9yXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBmaW5kTG9jYWxDb250ZW50KG5hbWU6IHN0cmluZywgdHlwZTogRWxlbWVudFR5cGUpOiBQcm9taXNlPHN0cmluZyB8IG51bGw+IHtcbiAgICB0cnkge1xuICAgICAgLy8gTUVUQURBVEEgSU5ERVggRklYOiBVc2UgcG9ydGZvbGlvIGluZGV4IGZvciBmYXN0IG1ldGFkYXRhLWJhc2VkIGxvb2t1cHNcbiAgICAgIC8vIFRoaXMgc29sdmVzIHRoZSBjcml0aWNhbCBpc3N1ZSB3aGVyZSBcIlNhZmUgUm91bmR0cmlwIFRlc3RlclwiIGNvdWxkbid0IGJlIGZvdW5kXG4gICAgICAvLyBiZWNhdXNlIGZpbmRMb2NhbENvbnRlbnQgb25seSBzZWFyY2hlZCBmaWxlbmFtZXMsIG5vdCBtZXRhZGF0YSBuYW1lc1xuICAgICAgY29uc3QgaW5kZXhNYW5hZ2VyID0gUG9ydGZvbGlvSW5kZXhNYW5hZ2VyLmdldEluc3RhbmNlKCk7XG4gICAgICBcbiAgICAgIC8vIFVYIElNUFJPVkVNRU5UOiBFbmhhbmNlZCBzZWFyY2ggd2l0aCBmdXp6eSBtYXRjaGluZ1xuICAgICAgY29uc3QgaW5kZXhFbnRyeSA9IGF3YWl0IGluZGV4TWFuYWdlci5maW5kQnlOYW1lKG5hbWUsIHsgXG4gICAgICAgIGVsZW1lbnRUeXBlOiB0eXBlLFxuICAgICAgICBmdXp6eU1hdGNoOiB0cnVlXG4gICAgICB9KTtcbiAgICAgIFxuICAgICAgaWYgKGluZGV4RW50cnkpIHtcbiAgICAgICAgbG9nZ2VyLmRlYnVnKCdGb3VuZCBjb250ZW50IHZpYSBtZXRhZGF0YSBpbmRleCcsIHsgXG4gICAgICAgICAgc2VhcmNoTmFtZTogbmFtZSwgXG4gICAgICAgICAgbWV0YWRhdGFOYW1lOiBpbmRleEVudHJ5Lm1ldGFkYXRhLm5hbWUsXG4gICAgICAgICAgZmlsZW5hbWU6IGluZGV4RW50cnkuZmlsZW5hbWUsXG4gICAgICAgICAgZmlsZVBhdGg6IGluZGV4RW50cnkuZmlsZVBhdGgsXG4gICAgICAgICAgdHlwZSBcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBpbmRleEVudHJ5LmZpbGVQYXRoO1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBGQUxMQkFDSzogVXNlIG9yaWdpbmFsIGZpbGUgZGlzY292ZXJ5IGlmIGluZGV4IGxvb2t1cCBmYWlsc1xuICAgICAgLy8gVGhpcyBtYWludGFpbnMgYmFja3dhcmQgY29tcGF0aWJpbGl0eSBhbmQgaGFuZGxlcyBlZGdlIGNhc2VzXG4gICAgICBsb2dnZXIuZGVidWcoJ0luZGV4IGxvb2t1cCBmYWlsZWQsIGZhbGxpbmcgYmFjayB0byBmaWxlIGRpc2NvdmVyeScsIHsgbmFtZSwgdHlwZSB9KTtcbiAgICAgIFxuICAgICAgY29uc3QgcG9ydGZvbGlvTWFuYWdlciA9IFBvcnRmb2xpb01hbmFnZXIuZ2V0SW5zdGFuY2UoKTtcbiAgICAgIGNvbnN0IHBvcnRmb2xpb0RpciA9IHBvcnRmb2xpb01hbmFnZXIuZ2V0RWxlbWVudERpcih0eXBlKTtcbiAgICAgIFxuICAgICAgLy8gVVggSU1QUk9WRU1FTlQ6IFRyeSBtdWx0aXBsZSBzZWFyY2ggc3RyYXRlZ2llcyBmb3IgYmV0dGVyIHVzZXIgZXhwZXJpZW5jZVxuICAgICAgbGV0IGZpbGUgPSBhd2FpdCBGaWxlRGlzY292ZXJ5VXRpbC5maW5kRmlsZShwb3J0Zm9saW9EaXIsIG5hbWUsIHtcbiAgICAgICAgZXh0ZW5zaW9uczogWycubWQnLCAnLmpzb24nLCAnLnlhbWwnLCAnLnltbCddLFxuICAgICAgICBwYXJ0aWFsTWF0Y2g6IHRydWUsXG4gICAgICAgIGNhY2hlUmVzdWx0czogdHJ1ZVxuICAgICAgfSk7XG4gICAgICBcbiAgICAgIC8vIElmIG5vdCBmb3VuZCwgdHJ5IG5vcm1hbGl6aW5nIHRoZSBuYW1lIChlLmcuLCBcIkouQS5SLlYuSS5TLlwiIC0+IFwiai1hLXItdi1pLXNcIilcbiAgICAgIGlmICghZmlsZSkge1xuICAgICAgICBjb25zdCBub3JtYWxpemVkTmFtZSA9IG5hbWUudG9Mb3dlckNhc2UoKVxuICAgICAgICAgIC5yZXBsYWNlKC9bXmEtejAtOV0vZ2ksICctJykgIC8vIFJlcGxhY2Ugbm9uLWFscGhhbnVtZXJpYyB3aXRoIGRhc2hlc1xuICAgICAgICAgIC5yZXBsYWNlKC8tKy9nLCAnLScpICAgICAgICAgLy8gUmVwbGFjZSBtdWx0aXBsZSBkYXNoZXMgd2l0aCBzaW5nbGUgZGFzaFxuICAgICAgICAgIC5yZXBsYWNlKC9eLXwtJC9nLCAnJyk7ICAgICAgLy8gUmVtb3ZlIGxlYWRpbmcvdHJhaWxpbmcgZGFzaGVzXG4gICAgICAgICAgXG4gICAgICAgIGlmIChub3JtYWxpemVkTmFtZSAhPT0gbmFtZS50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICAgICAgbG9nZ2VyLmRlYnVnKCdUcnlpbmcgbm9ybWFsaXplZCBuYW1lIHNlYXJjaCcsIHsgXG4gICAgICAgICAgICBvcmlnaW5hbDogbmFtZSwgXG4gICAgICAgICAgICBub3JtYWxpemVkOiBub3JtYWxpemVkTmFtZSxcbiAgICAgICAgICAgIHR5cGUgXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgXG4gICAgICAgICAgZmlsZSA9IGF3YWl0IEZpbGVEaXNjb3ZlcnlVdGlsLmZpbmRGaWxlKHBvcnRmb2xpb0Rpciwgbm9ybWFsaXplZE5hbWUsIHtcbiAgICAgICAgICAgIGV4dGVuc2lvbnM6IFsnLm1kJywgJy5qc29uJywgJy55YW1sJywgJy55bWwnXSxcbiAgICAgICAgICAgIHBhcnRpYWxNYXRjaDogdHJ1ZSxcbiAgICAgICAgICAgIGNhY2hlUmVzdWx0czogdHJ1ZVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIElmIHN0aWxsIG5vdCBmb3VuZCwgdHJ5IHNlYXJjaGluZyBieSBkaXNwbGF5IG5hbWUgcGF0dGVybnNcbiAgICAgIGlmICghZmlsZSkge1xuICAgICAgICAvLyBUcnkgY29tbW9uIHZhcmlhdGlvbnMgbGlrZSByZW1vdmluZyBkb3RzLCBzcGFjZXMsIGV0Yy5cbiAgICAgICAgY29uc3QgdmFyaWF0aW9ucyA9IFtcbiAgICAgICAgICBuYW1lLnJlcGxhY2UoL1xcLi9nLCAnJyksICAgICAgICAvLyBSZW1vdmUgZG90czogXCJKLkEuUi5WLkkuUy5cIiAtPiBcIkpBUlZJU1wiXG4gICAgICAgICAgbmFtZS5yZXBsYWNlKC9cXHMrL2csICctJyksICAgICAgLy8gUmVwbGFjZSBzcGFjZXMgd2l0aCBkYXNoZXNcbiAgICAgICAgICBuYW1lLnJlcGxhY2UoL1tcXHNcXC5dL2csICcnKSwgICAgLy8gUmVtb3ZlIHNwYWNlcyBhbmQgZG90c1xuICAgICAgICAgIG5hbWUucmVwbGFjZSgvW1xcc1xcLl0vZywgJy0nKSwgICAvLyBSZXBsYWNlIHNwYWNlcyBhbmQgZG90cyB3aXRoIGRhc2hlc1xuICAgICAgICBdLmZpbHRlcih2ID0+IHYgIT09IG5hbWUgJiYgdi5sZW5ndGggPiAwKTtcbiAgICAgICAgXG4gICAgICAgIGZvciAoY29uc3QgdmFyaWF0aW9uIG9mIHZhcmlhdGlvbnMpIHtcbiAgICAgICAgICBmaWxlID0gYXdhaXQgRmlsZURpc2NvdmVyeVV0aWwuZmluZEZpbGUocG9ydGZvbGlvRGlyLCB2YXJpYXRpb24sIHtcbiAgICAgICAgICAgIGV4dGVuc2lvbnM6IFsnLm1kJywgJy5qc29uJywgJy55YW1sJywgJy55bWwnXSxcbiAgICAgICAgICAgIHBhcnRpYWxNYXRjaDogdHJ1ZSxcbiAgICAgICAgICAgIGNhY2hlUmVzdWx0czogdHJ1ZVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIFxuICAgICAgICAgIGlmIChmaWxlKSB7XG4gICAgICAgICAgICBsb2dnZXIuZGVidWcoJ0ZvdW5kIGNvbnRlbnQgdXNpbmcgbmFtZSB2YXJpYXRpb24nLCB7XG4gICAgICAgICAgICAgIG9yaWdpbmFsOiBuYW1lLFxuICAgICAgICAgICAgICB2YXJpYXRpb24sXG4gICAgICAgICAgICAgIGZpbGUsXG4gICAgICAgICAgICAgIHR5cGVcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBcbiAgICAgIGlmIChmaWxlKSB7XG4gICAgICAgIGxvZ2dlci5kZWJ1ZygnRm91bmQgbG9jYWwgY29udGVudCBmaWxlIHZpYSBmYWxsYmFjaycsIHsgbmFtZSwgdHlwZSwgZmlsZSB9KTtcbiAgICAgICAgcmV0dXJuIGZpbGU7XG4gICAgICB9XG4gICAgICBcbiAgICAgIGxvZ2dlci5kZWJ1ZygnTm8gY29udGVudCBmb3VuZCcsIHsgbmFtZSwgdHlwZSB9KTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgICAgXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci5lcnJvcignRXJyb3IgZmluZGluZyBsb2NhbCBjb250ZW50Jywge1xuICAgICAgICBuYW1lLFxuICAgICAgICB0eXBlLFxuICAgICAgICBlcnJvcjogZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpXG4gICAgICB9KTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTbWFydCBlbGVtZW50IHR5cGUgZGV0ZWN0aW9uIC0gc2VhcmNoZXMgYWNyb3NzIEFMTCBlbGVtZW50IHR5cGVzIGZvciBjb250ZW50XG4gICAqIFBFUkZPUk1BTkNFIE9QVElNSVpBVElPTiAoVGFzayAjOSk6IFVzZXMgZWFybHkgdGVybWluYXRpb24gZm9yIGV4YWN0IG1hdGNoZXNcbiAgICogVGhpcyByZXBsYWNlcyB0aGUgcHJldmlvdXMgaGFyZGNvZGVkIGRlZmF1bHQgdG8gUEVSU09OQSBhbmQgZW5hYmxlcyBwcm9wZXIgdHlwZSBkZXRlY3Rpb25cbiAgICogXG4gICAqIEBwYXJhbSBuYW1lIFRoZSBjb250ZW50IG5hbWUgdG8gc2VhcmNoIGZvclxuICAgKiBAcmV0dXJucyBEZXRlY3Rpb24gcmVzdWx0IHdpdGggZm91bmQgbWF0Y2hlcyBhY3Jvc3MgYWxsIGVsZW1lbnQgdHlwZXNcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZGV0ZWN0RWxlbWVudFR5cGUobmFtZTogc3RyaW5nKTogUHJvbWlzZTxFbGVtZW50RGV0ZWN0aW9uUmVzdWx0PiB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIFBFUkZPUk1BTkNFIE9QVElNSVpBVElPTiAoVGFzayAjOSk6IFVzZSBlYXJseSB0ZXJtaW5hdGlvbiBzZWFyY2ggdXRpbGl0eVxuICAgICAgLy8gQ3JlYXRlIHNlYXJjaCBmdW5jdGlvbnMgZm9yIGVhY2ggZWxlbWVudCB0eXBlXG4gICAgICBjb25zdCBlbGVtZW50VHlwZXMgPSBPYmplY3QudmFsdWVzKEVsZW1lbnRUeXBlKTtcbiAgICAgIGNvbnN0IHNlYXJjaEZ1bmN0aW9ucyA9IGVsZW1lbnRUeXBlcy5tYXAoKHR5cGUpID0+IGFzeW5jICgpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBmaWxlUGF0aCA9IGF3YWl0IHRoaXMuZmluZExvY2FsQ29udGVudChuYW1lLCB0eXBlKTtcbiAgICAgICAgICBpZiAoZmlsZVBhdGgpIHtcbiAgICAgICAgICAgIHJldHVybiB7IHR5cGU6IHR5cGUgYXMgRWxlbWVudFR5cGUsIHBhdGg6IGZpbGVQYXRoIH07XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICAgICAgLy8gTG9nIHVuZXhwZWN0ZWQgZXJyb3JzIGJ1dCBkb24ndCBmYWlsIHRoZSBzZWFyY2hcbiAgICAgICAgICBpZiAoZXJyb3I/LmNvZGUgIT09ICdFTk9FTlQnICYmIGVycm9yPy5jb2RlICE9PSAnRU5PVERJUicpIHtcbiAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhgRXJyb3Igc2VhcmNoaW5nICR7dHlwZX0gZGlyZWN0b3J5IGZvciBjb250ZW50IGRldGVjdGlvbmAsIHsgXG4gICAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICAgIHR5cGUsXG4gICAgICAgICAgICAgIGVycm9yOiBlcnJvcj8ubWVzc2FnZSB8fCBTdHJpbmcoZXJyb3IpLFxuICAgICAgICAgICAgICBjb2RlOiBlcnJvcj8uY29kZSBcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBSZXR1cm4gbnVsbCBpbnN0ZWFkIG9mIHRocm93aW5nIHRvIGxldCBvdGhlciBzZWFyY2hlcyBjb250aW51ZVxuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgLy8gUEVSRk9STUFOQ0UgT1BUSU1JWkFUSU9OIChUYXNrICM5KTogRGVmaW5lIGV4YWN0IG1hdGNoIGNyaXRlcmlhXG4gICAgICBjb25zdCBpc0V4YWN0TWF0Y2ggPSAobWF0Y2g6IEVsZW1lbnREZXRlY3Rpb25NYXRjaCk6IGJvb2xlYW4gPT4ge1xuICAgICAgICBjb25zdCBmaWxlbmFtZSA9IHBhdGguYmFzZW5hbWUobWF0Y2gucGF0aCwgcGF0aC5leHRuYW1lKG1hdGNoLnBhdGgpKTtcbiAgICAgICAgcmV0dXJuIGZpbGVuYW1lLnRvTG93ZXJDYXNlKCkgPT09IG5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgIH07XG5cbiAgICAgIC8vIEV4ZWN1dGUgc2VhcmNoZXMgd2l0aCBlYXJseSB0ZXJtaW5hdGlvbiBvcHRpbWl6YXRpb25cbiAgICAgIGNvbnN0IHNlYXJjaFJlc3VsdHMgPSBhd2FpdCBFYXJseVRlcm1pbmF0aW9uU2VhcmNoLmV4ZWN1dGVXaXRoRWFybHlUZXJtaW5hdGlvbihcbiAgICAgICAgc2VhcmNoRnVuY3Rpb25zLFxuICAgICAgICBpc0V4YWN0TWF0Y2gsXG4gICAgICAgIHtcbiAgICAgICAgICBvcGVyYXRpb25OYW1lOiAnZWxlbWVudC10eXBlLWRldGVjdGlvbicsXG4gICAgICAgICAgdGltZW91dEFmdGVyRXhhY3RNYXRjaDogMTAwMCwgLy8gV2FpdCAxIHNlY29uZCBmb3Igb3RoZXIgc2VhcmNoZXMgYWZ0ZXIgZXhhY3QgbWF0Y2hcbiAgICAgICAgICBtYXhQYXJhbGxlbFNlYXJjaGVzOiA4IC8vIExpbWl0IGNvbmN1cnJlbnQgc2VhcmNoZXMgdG8gYXZvaWQgb3ZlcndoZWxtaW5nIHRoZSBzeXN0ZW1cbiAgICAgICAgfVxuICAgICAgKTtcblxuICAgICAgLy8gUEVSRk9STUFOQ0UgT1BUSU1JWkFUSU9OIChUYXNrICM4KTogRW5oYW5jZWQgYmF0Y2ggb3BlcmF0aW9uIHJlcG9ydGluZ1xuICAgICAgY29uc3QgYmF0Y2hSZXN1bHRzID0ge1xuICAgICAgICBuYW1lLFxuICAgICAgICB0b3RhbFNlYXJjaGVzOiBzZWFyY2hSZXN1bHRzLnRvdGFsU2VhcmNoZXMsXG4gICAgICAgIGNvbXBsZXRlZFNlYXJjaGVzOiBzZWFyY2hSZXN1bHRzLmNvbXBsZXRlZFNlYXJjaGVzLFxuICAgICAgICBtYXRjaGVzOiBzZWFyY2hSZXN1bHRzLm1hdGNoZXMubGVuZ3RoLFxuICAgICAgICBmYWlsdXJlczogc2VhcmNoUmVzdWx0cy5mYWlsdXJlcy5sZW5ndGgsXG4gICAgICAgIGV4YWN0TWF0Y2hGb3VuZDogISFzZWFyY2hSZXN1bHRzLmV4YWN0TWF0Y2gsXG4gICAgICAgIGV4YWN0TWF0Y2hUeXBlOiBzZWFyY2hSZXN1bHRzLmV4YWN0TWF0Y2g/LnR5cGUsXG4gICAgICAgIGVhcmx5VGVybWluYXRpb25UcmlnZ2VyZWQ6IHNlYXJjaFJlc3VsdHMuZWFybHlUZXJtaW5hdGlvblRyaWdnZXJlZCxcbiAgICAgICAgcGVyZm9ybWFuY2VHYWluOiBzZWFyY2hSZXN1bHRzLnBlcmZvcm1hbmNlR2FpbixcbiAgICAgICAgbWF0Y2hlZFR5cGVzOiBzZWFyY2hSZXN1bHRzLm1hdGNoZXMubWFwKG0gPT4gbS50eXBlKSxcbiAgICAgICAgZmFpbGVkVHlwZXM6IHNlYXJjaFJlc3VsdHMuZmFpbHVyZXMubWFwKGYgPT4gZWxlbWVudFR5cGVzW2YuaW5kZXhdKS5maWx0ZXIoQm9vbGVhbilcbiAgICAgIH07XG5cbiAgICAgIGxvZ2dlci5kZWJ1ZygnRWxlbWVudCB0eXBlIGRldGVjdGlvbiBjb21wbGV0ZWQgd2l0aCBlYXJseSB0ZXJtaW5hdGlvbiBvcHRpbWl6YXRpb24nLCBiYXRjaFJlc3VsdHMpO1xuXG4gICAgICAvLyBQRVJGT1JNQU5DRSBPUFRJTUlaQVRJT04gKFRhc2sgIzgpOiBDbGVhciByZXBvcnRpbmcgb2YgcGFydGlhbCBmYWlsdXJlc1xuICAgICAgaWYgKHNlYXJjaFJlc3VsdHMuZmFpbHVyZXMubGVuZ3RoID4gMCkge1xuICAgICAgICBsb2dnZXIud2FybignU29tZSBlbGVtZW50IHR5cGUgc2VhcmNoZXMgZmFpbGVkIGR1cmluZyBiYXRjaCBvcGVyYXRpb24nLCB7XG4gICAgICAgICAgbmFtZSxcbiAgICAgICAgICBmYWlsdXJlczogc2VhcmNoUmVzdWx0cy5mYWlsdXJlcy5tYXAoZiA9PiAoe1xuICAgICAgICAgICAgdHlwZTogZWxlbWVudFR5cGVzW2YuaW5kZXhdIHx8ICd1bmtub3duJyxcbiAgICAgICAgICAgIGVycm9yOiBmLmVycm9yLnN1YnN0cmluZygwLCAxMDApIC8vIFRydW5jYXRlIGxvbmcgZXJyb3IgbWVzc2FnZXNcbiAgICAgICAgICB9KSksXG4gICAgICAgICAgc3VjY2Vzc1JhdGU6IGAke3NlYXJjaFJlc3VsdHMuY29tcGxldGVkU2VhcmNoZXN9LyR7c2VhcmNoUmVzdWx0cy50b3RhbFNlYXJjaGVzfWAsXG4gICAgICAgICAgaW1wYWN0T25SZXN1bHRzOiBzZWFyY2hSZXN1bHRzLm1hdGNoZXMubGVuZ3RoID4gMCBcbiAgICAgICAgICAgID8gJ05vIGltcGFjdCAtIG1hdGNoZXMgZm91bmQgaW4gc3VjY2Vzc2Z1bCBzZWFyY2hlcycgXG4gICAgICAgICAgICA6ICdQb3RlbnRpYWwgaW1wYWN0IC0gbm8gbWF0Y2hlcyBmb3VuZCdcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gSWYgd2UgaGF2ZSBmYWlsdXJlcyBhbmQgbm8gbWF0Y2hlcywgcHJvdmlkZSBhY3Rpb25hYmxlIGd1aWRhbmNlXG4gICAgICAgIGlmIChzZWFyY2hSZXN1bHRzLm1hdGNoZXMubGVuZ3RoID09PSAwICYmIHNlYXJjaFJlc3VsdHMuZmFpbHVyZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGxvZ2dlci53YXJuKCdCYXRjaCBvcGVyYXRpb24gaGFkIGZhaWx1cmVzIGFuZCBubyBtYXRjaGVzIGZvdW5kJywge1xuICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgIHJlY29tbWVuZGF0aW9uOiAnQ29uc2lkZXIgY2hlY2tpbmcgZmlsZSBwZXJtaXNzaW9ucyBvciBwb3J0Zm9saW8gc3RydWN0dXJlJyxcbiAgICAgICAgICAgIGZhaWx1cmVDb3VudDogc2VhcmNoUmVzdWx0cy5mYWlsdXJlcy5sZW5ndGgsXG4gICAgICAgICAgICB0b3RhbFNlYXJjaGVzOiBzZWFyY2hSZXN1bHRzLnRvdGFsU2VhcmNoZXNcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBMb2cgcGVyZm9ybWFuY2UgZ2FpbnMgZnJvbSBlYXJseSB0ZXJtaW5hdGlvblxuICAgICAgaWYgKHNlYXJjaFJlc3VsdHMuZWFybHlUZXJtaW5hdGlvblRyaWdnZXJlZCkge1xuICAgICAgICBsb2dnZXIuaW5mbygnRWFybHkgdGVybWluYXRpb24gb3B0aW1pemF0aW9uIGFwcGxpZWQgc3VjY2Vzc2Z1bGx5Jywge1xuICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgZXhhY3RNYXRjaFR5cGU6IHNlYXJjaFJlc3VsdHMuZXhhY3RNYXRjaD8udHlwZSxcbiAgICAgICAgICBwZXJmb3JtYW5jZUdhaW46IHNlYXJjaFJlc3VsdHMucGVyZm9ybWFuY2VHYWluLFxuICAgICAgICAgIHNlYXJjaGVzQ29tcGxldGVkOiBzZWFyY2hSZXN1bHRzLmNvbXBsZXRlZFNlYXJjaGVzLFxuICAgICAgICAgIHNlYXJjaGVzVG90YWw6IHNlYXJjaFJlc3VsdHMudG90YWxTZWFyY2hlc1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZm91bmQ6IHNlYXJjaFJlc3VsdHMubWF0Y2hlcy5sZW5ndGggPiAwLFxuICAgICAgICBtYXRjaGVzOiBzZWFyY2hSZXN1bHRzLm1hdGNoZXNcbiAgICAgIH07XG5cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbG9nZ2VyLmVycm9yKCdFcnJvciBpbiBlbGVtZW50IHR5cGUgZGV0ZWN0aW9uJywge1xuICAgICAgICBuYW1lLFxuICAgICAgICBlcnJvcjogZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpXG4gICAgICB9KTtcbiAgICAgIFxuICAgICAgLy8gUmV0dXJuIGVtcHR5IHJlc3VsdCBvbiBkZXRlY3Rpb24gZmFpbHVyZVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZm91bmQ6IGZhbHNlLFxuICAgICAgICBtYXRjaGVzOiBbXVxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVVggSU1QUk9WRU1FTlQ6IEdlbmVyYXRlIG5hbWUgc3VnZ2VzdGlvbnMgZm9yIHNpbWlsYXIgY29udGVudFxuICAgKiBQRVJGT1JNQU5DRSBPUFRJTUlaQVRJT04gKFRhc2sgIzgpOiBFbmhhbmNlZCBiYXRjaCBvcGVyYXRpb24gaGFuZGxpbmcgd2l0aCBjbGVhciBwYXJ0aWFsIGZhaWx1cmUgcmVwb3J0aW5nXG4gICAqIEhlbHBzIHVzZXJzIGZpbmQgY29udGVudCB3aGVuIGV4YWN0IG1hdGNoZXMgZmFpbFxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBnZW5lcmF0ZU5hbWVTdWdnZXN0aW9ucyhzZWFyY2hOYW1lOiBzdHJpbmcpOiBQcm9taXNlPEFycmF5PHtuYW1lOiBzdHJpbmcsIHR5cGU6IHN0cmluZ30+PiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHN1Z2dlc3Rpb25zOiBBcnJheTx7bmFtZTogc3RyaW5nLCB0eXBlOiBzdHJpbmd9PiA9IFtdO1xuICAgICAgY29uc3Qgc2VhcmNoTG93ZXIgPSBzZWFyY2hOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICBjb25zdCBlbGVtZW50VHlwZXMgPSBPYmplY3QudmFsdWVzKEVsZW1lbnRUeXBlKTtcbiAgICAgIFxuICAgICAgLy8gVHJhY2sgYmF0Y2ggb3BlcmF0aW9uIHJlc3VsdHMgZm9yIGJldHRlciBkaWFnbm9zdGljc1xuICAgICAgY29uc3QgYmF0Y2hSZXN1bHRzID0ge1xuICAgICAgICBzZWFyY2hOYW1lLFxuICAgICAgICB0b3RhbFR5cGVzOiBlbGVtZW50VHlwZXMubGVuZ3RoLFxuICAgICAgICBzdWNjZXNzZnVsU2NhbnM6IDAsXG4gICAgICAgIGZhaWxlZFNjYW5zOiAwLFxuICAgICAgICBmYWlsdXJlRGV0YWlsczogW10gYXMgQXJyYXk8eyB0eXBlOiBFbGVtZW50VHlwZTsgZXJyb3I6IHN0cmluZyB9PixcbiAgICAgICAgdG90YWxTdWdnZXN0aW9uczogMCxcbiAgICAgICAgc3VnZ2VzdGlvbnNCeVR5cGU6IHt9IGFzIFJlY29yZDxzdHJpbmcsIG51bWJlcj5cbiAgICAgIH07XG4gICAgICBcbiAgICAgIC8vIFByb2Nlc3MgYWxsIGVsZW1lbnQgdHlwZXMgZm9yIHN1Z2dlc3Rpb25zXG4gICAgICBmb3IgKGNvbnN0IGVsZW1lbnRUeXBlIG9mIGVsZW1lbnRUeXBlcykge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHBvcnRmb2xpb01hbmFnZXIgPSBQb3J0Zm9saW9NYW5hZ2VyLmdldEluc3RhbmNlKCk7XG4gICAgICAgICAgY29uc3QgZWxlbWVudERpciA9IHBvcnRmb2xpb01hbmFnZXIuZ2V0RWxlbWVudERpcihlbGVtZW50VHlwZSk7XG4gICAgICAgICAgXG4gICAgICAgICAgLy8gR2V0IGZpbGVzIGluIHRoaXMgZGlyZWN0b3J5XG4gICAgICAgICAgY29uc3QgZmlsZXMgPSBhd2FpdCBGaWxlRGlzY292ZXJ5VXRpbC5maW5kRmlsZShlbGVtZW50RGlyLCAnKicsIHtcbiAgICAgICAgICAgIGV4dGVuc2lvbnM6IFsnLm1kJywgJy5qc29uJywgJy55YW1sJywgJy55bWwnXSxcbiAgICAgICAgICAgIHBhcnRpYWxNYXRjaDogZmFsc2UsXG4gICAgICAgICAgICBjYWNoZVJlc3VsdHM6IHRydWVcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBcbiAgICAgICAgICBsZXQgdHlwZVN1Z2dlc3Rpb25zID0gMDtcbiAgICAgICAgICBcbiAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShmaWxlcykpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgZmlsZVBhdGggb2YgZmlsZXMpIHtcbiAgICAgICAgICAgICAgY29uc3QgYmFzZW5hbWUgPSBwYXRoLmJhc2VuYW1lKGZpbGVQYXRoLCBwYXRoLmV4dG5hbWUoZmlsZVBhdGgpKTtcbiAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgIC8vIENhbGN1bGF0ZSBzaW1pbGFyaXR5IHVzaW5nIHNpbXBsZSBtZXRyaWNzXG4gICAgICAgICAgICAgIGlmICh0aGlzLmNhbGN1bGF0ZVNpbWlsYXJpdHkoc2VhcmNoTG93ZXIsIGJhc2VuYW1lLnRvTG93ZXJDYXNlKCkpID4gU0VBUkNIX0NPTkZJRy5NSU5fU0lNSUxBUklUWV9TQ09SRSkge1xuICAgICAgICAgICAgICAgIHN1Z2dlc3Rpb25zLnB1c2goe1xuICAgICAgICAgICAgICAgICAgbmFtZTogYmFzZW5hbWUsXG4gICAgICAgICAgICAgICAgICB0eXBlOiBlbGVtZW50VHlwZVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHR5cGVTdWdnZXN0aW9ucysrO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIGlmIChmaWxlcykge1xuICAgICAgICAgICAgY29uc3QgYmFzZW5hbWUgPSBwYXRoLmJhc2VuYW1lKGZpbGVzLCBwYXRoLmV4dG5hbWUoZmlsZXMpKTtcbiAgICAgICAgICAgIGlmICh0aGlzLmNhbGN1bGF0ZVNpbWlsYXJpdHkoc2VhcmNoTG93ZXIsIGJhc2VuYW1lLnRvTG93ZXJDYXNlKCkpID4gU0VBUkNIX0NPTkZJRy5NSU5fU0lNSUxBUklUWV9TQ09SRSkge1xuICAgICAgICAgICAgICBzdWdnZXN0aW9ucy5wdXNoKHtcbiAgICAgICAgICAgICAgICBuYW1lOiBiYXNlbmFtZSxcbiAgICAgICAgICAgICAgICB0eXBlOiBlbGVtZW50VHlwZVxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgdHlwZVN1Z2dlc3Rpb25zKys7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIFxuICAgICAgICAgIGJhdGNoUmVzdWx0cy5zdWNjZXNzZnVsU2NhbnMrKztcbiAgICAgICAgICBiYXRjaFJlc3VsdHMuc3VnZ2VzdGlvbnNCeVR5cGVbZWxlbWVudFR5cGVdID0gdHlwZVN1Z2dlc3Rpb25zO1xuICAgICAgICAgIFxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIC8vIFBFUkZPUk1BTkNFIE9QVElNSVpBVElPTiAoVGFzayAjOCk6IFRyYWNrIGFuZCByZXBvcnQgcGFydGlhbCBmYWlsdXJlc1xuICAgICAgICAgIGJhdGNoUmVzdWx0cy5mYWlsZWRTY2FucysrO1xuICAgICAgICAgIGJhdGNoUmVzdWx0cy5mYWlsdXJlRGV0YWlscy5wdXNoKHtcbiAgICAgICAgICAgIHR5cGU6IGVsZW1lbnRUeXBlLFxuICAgICAgICAgICAgZXJyb3I6IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIFxuICAgICAgICAgIC8vIExvZyBpbmRpdmlkdWFsIGZhaWx1cmVzIGZvciBkaWFnbm9zdGljc1xuICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnRmFpbGVkIHRvIHNjYW4gZWxlbWVudCB0eXBlIGZvciBzdWdnZXN0aW9ucycsIHtcbiAgICAgICAgICAgIGVsZW1lbnRUeXBlLFxuICAgICAgICAgICAgc2VhcmNoTmFtZSxcbiAgICAgICAgICAgIGVycm9yOiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcilcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgXG4gICAgICBiYXRjaFJlc3VsdHMudG90YWxTdWdnZXN0aW9ucyA9IHN1Z2dlc3Rpb25zLmxlbmd0aDtcbiAgICAgIFxuICAgICAgLy8gUEVSRk9STUFOQ0UgT1BUSU1JWkFUSU9OIChUYXNrICM4KTogQ29tcHJlaGVuc2l2ZSBiYXRjaCBvcGVyYXRpb24gcmVwb3J0aW5nXG4gICAgICBsb2dnZXIuZGVidWcoJ05hbWUgc3VnZ2VzdGlvbiBiYXRjaCBvcGVyYXRpb24gY29tcGxldGVkJywge1xuICAgICAgICAuLi5iYXRjaFJlc3VsdHMsXG4gICAgICAgIHN1Y2Nlc3NSYXRlOiBgJHtiYXRjaFJlc3VsdHMuc3VjY2Vzc2Z1bFNjYW5zfS8ke2JhdGNoUmVzdWx0cy50b3RhbFR5cGVzfWAsXG4gICAgICAgIC8vIERvbid0IGxvZyBmdWxsIGZhaWx1cmUgZGV0YWlscyBhdCBkZWJ1ZyBsZXZlbCB0byBhdm9pZCBzcGFtXG4gICAgICAgIGhhc0ZhaWx1cmVzOiBiYXRjaFJlc3VsdHMuZmFpbGVkU2NhbnMgPiAwXG4gICAgICB9KTtcbiAgICAgIFxuICAgICAgLy8gUmVwb3J0IGZhaWx1cmVzIGNsZWFybHkgaWYgdGhleSBvY2N1cnJlZFxuICAgICAgaWYgKGJhdGNoUmVzdWx0cy5mYWlsZWRTY2FucyA+IDApIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oJ1NvbWUgZWxlbWVudCB0eXBlIHNjYW5zIGZhaWxlZCBkdXJpbmcgbmFtZSBzdWdnZXN0aW9uIGdlbmVyYXRpb24nLCB7XG4gICAgICAgICAgc2VhcmNoTmFtZSxcbiAgICAgICAgICBmYWlsZWRUeXBlczogYmF0Y2hSZXN1bHRzLmZhaWx1cmVEZXRhaWxzLm1hcChmID0+IGYudHlwZSksXG4gICAgICAgICAgc3VjY2Vzc2Z1bFR5cGVzOiBiYXRjaFJlc3VsdHMuc3VjY2Vzc2Z1bFNjYW5zLFxuICAgICAgICAgIGltcGFjdE9uUmVzdWx0czogYmF0Y2hSZXN1bHRzLnRvdGFsU3VnZ2VzdGlvbnMgPiAwIFxuICAgICAgICAgICAgPyAnUGFydGlhbCBpbXBhY3QgLSBzdWdnZXN0aW9ucyBmb3VuZCBmcm9tIHN1Y2Nlc3NmdWwgc2NhbnMnIFxuICAgICAgICAgICAgOiAnUG90ZW50aWFsIGltcGFjdCAtIG5vIHN1Z2dlc3Rpb25zIGdlbmVyYXRlZCcsXG4gICAgICAgICAgcmVjb21tZW5kYXRpb246IGJhdGNoUmVzdWx0cy50b3RhbFN1Z2dlc3Rpb25zID09PSAwICYmIGJhdGNoUmVzdWx0cy5mYWlsZWRTY2FucyA+IDBcbiAgICAgICAgICAgID8gJ0NoZWNrIHBvcnRmb2xpbyBkaXJlY3Rvcnkgc3RydWN0dXJlIGFuZCBmaWxlIHBlcm1pc3Npb25zJ1xuICAgICAgICAgICAgOiAnU3VnZ2VzdGlvbiBnZW5lcmF0aW9uIHBhcnRpYWxseSBzdWNjZXNzZnVsIGRlc3BpdGUgc29tZSBmYWlsdXJlcydcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIFNvcnQgYnkgc2ltaWxhcml0eSAoaGlnaGVyIGlzIGJldHRlcikgYW5kIHJldHVybiB0b3Agc3VnZ2VzdGlvbnNcbiAgICAgIGNvbnN0IHNvcnRlZFN1Z2dlc3Rpb25zID0gc3VnZ2VzdGlvbnMuc29ydCgoYSwgYikgPT4ge1xuICAgICAgICBjb25zdCBzaW1BID0gdGhpcy5jYWxjdWxhdGVTaW1pbGFyaXR5KHNlYXJjaExvd2VyLCBhLm5hbWUudG9Mb3dlckNhc2UoKSk7XG4gICAgICAgIGNvbnN0IHNpbUIgPSB0aGlzLmNhbGN1bGF0ZVNpbWlsYXJpdHkoc2VhcmNoTG93ZXIsIGIubmFtZS50b0xvd2VyQ2FzZSgpKTtcbiAgICAgICAgcmV0dXJuIHNpbUIgLSBzaW1BO1xuICAgICAgfSk7XG4gICAgICBcbiAgICAgIGxvZ2dlci5kZWJ1ZygnTmFtZSBzdWdnZXN0aW9ucyBnZW5lcmF0ZWQgc3VjY2Vzc2Z1bGx5Jywge1xuICAgICAgICBzZWFyY2hOYW1lLFxuICAgICAgICB0b3RhbFN1Z2dlc3Rpb25zOiBzb3J0ZWRTdWdnZXN0aW9ucy5sZW5ndGgsXG4gICAgICAgIHRvcFN1Z2dlc3Rpb25zOiBzb3J0ZWRTdWdnZXN0aW9ucy5zbGljZSgwLCAzKS5tYXAocyA9PiBzLm5hbWUpXG4gICAgICB9KTtcbiAgICAgIFxuICAgICAgcmV0dXJuIHNvcnRlZFN1Z2dlc3Rpb25zO1xuICAgICAgXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci53YXJuKCdGYWlsZWQgdG8gZ2VuZXJhdGUgbmFtZSBzdWdnZXN0aW9ucyAtIGJhdGNoIG9wZXJhdGlvbiBmYWlsZWQgY29tcGxldGVseScsIHsgXG4gICAgICAgIHNlYXJjaE5hbWUsIFxuICAgICAgICBlcnJvcjogZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpLFxuICAgICAgICByZWNvbW1lbmRhdGlvbjogJ0NoZWNrIHBvcnRmb2xpbyBzdHJ1Y3R1cmUgYW5kIHBlcm1pc3Npb25zJ1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICB9XG4gIFxuICAvKipcbiAgICogU2ltcGxlIHNpbWlsYXJpdHkgY2FsY3VsYXRpb24gdXNpbmcgTGV2ZW5zaHRlaW4tbGlrZSBhcHByb2FjaFxuICAgKiBSZXR1cm5zIHZhbHVlIGJldHdlZW4gMCBhbmQgMSwgd2hlcmUgMSBpcyBpZGVudGljYWxcbiAgICovXG4gIHByaXZhdGUgY2FsY3VsYXRlU2ltaWxhcml0eShzdHIxOiBzdHJpbmcsIHN0cjI6IHN0cmluZyk6IG51bWJlciB7XG4gICAgLy8gSGFuZGxlIGV4YWN0IG1hdGNoZXNcbiAgICBpZiAoc3RyMSA9PT0gc3RyMikgcmV0dXJuIDE7XG4gICAgXG4gICAgLy8gSGFuZGxlIHN1YnN0cmluZyBtYXRjaGVzXG4gICAgaWYgKHN0cjEuaW5jbHVkZXMoc3RyMikgfHwgc3RyMi5pbmNsdWRlcyhzdHIxKSkgcmV0dXJuIDAuODtcbiAgICBcbiAgICAvLyBIYW5kbGUgcGFydGlhbCBtYXRjaGVzXG4gICAgY29uc3QgbG9uZ2VyID0gc3RyMS5sZW5ndGggPiBzdHIyLmxlbmd0aCA/IHN0cjEgOiBzdHIyO1xuICAgIGNvbnN0IHNob3J0ZXIgPSBzdHIxLmxlbmd0aCA+IHN0cjIubGVuZ3RoID8gc3RyMiA6IHN0cjE7XG4gICAgXG4gICAgaWYgKGxvbmdlci5sZW5ndGggPT09IDApIHJldHVybiAwO1xuICAgIFxuICAgIC8vIENvdW50IGNvbW1vbiBjaGFyYWN0ZXJzXG4gICAgbGV0IGNvbW1vbiA9IDA7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzaG9ydGVyLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAobG9uZ2VyLmluY2x1ZGVzKHNob3J0ZXJbaV0pKSB7XG4gICAgICAgIGNvbW1vbisrO1xuICAgICAgfVxuICAgIH1cbiAgICBcbiAgICByZXR1cm4gY29tbW9uIC8gbG9uZ2VyLmxlbmd0aDtcbiAgfVxuICBcbiAgLyoqXG4gICAqIFVYIElNUFJPVkVNRU5UOiBTYXZlIGVsZW1lbnQgd2l0aCBhdXRvbWF0aWMgcmV0cnkgbG9naWMgZm9yIHRyYW5zaWVudCBmYWlsdXJlc1xuICAgKiBIYW5kbGVzIGNvbW1vbiBHaXRIdWIgQVBJIGlzc3VlcyBsaWtlIHJhdGUgbGltaXRzIGFuZCB0ZW1wb3JhcnkgbmV0d29yayBwcm9ibGVtc1xuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBzYXZlRWxlbWVudFdpdGhSZXRyeShcbiAgICBhZGFwdGVyOiBQb3J0Zm9saW9FbGVtZW50QWRhcHRlciwgXG4gICAgZWxlbWVudE5hbWU6IHN0cmluZywgXG4gICAgZWxlbWVudFR5cGU6IEVsZW1lbnRUeXBlLFxuICAgIG1heFJldHJpZXM6IG51bWJlciA9IFJFVFJZX0NPTkZJRy5NQVhfQVRURU1QVFNcbiAgKTogUHJvbWlzZTxzdHJpbmcgfCBudWxsPiB7XG4gICAgbGV0IGxhc3RFcnJvcjogYW55ID0gbnVsbDtcbiAgICBcbiAgICBmb3IgKGxldCBhdHRlbXB0ID0gMTsgYXR0ZW1wdCA8PSBtYXhSZXRyaWVzOyBhdHRlbXB0KyspIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGxvZ2dlci5kZWJ1ZyhgQXR0ZW1wdGluZyB0byBzYXZlIGVsZW1lbnQgKGF0dGVtcHQgJHthdHRlbXB0fS8ke21heFJldHJpZXN9KWAsIHtcbiAgICAgICAgICBlbGVtZW50TmFtZSxcbiAgICAgICAgICBlbGVtZW50VHlwZSxcbiAgICAgICAgICBhdHRlbXB0XG4gICAgICAgIH0pO1xuICAgICAgICBcbiAgICAgICAgY29uc3QgZmlsZVVybCA9IGF3YWl0IHRoaXMucG9ydGZvbGlvTWFuYWdlci5zYXZlRWxlbWVudChhZGFwdGVyLCB0cnVlKTtcbiAgICAgICAgXG4gICAgICAgIGlmIChmaWxlVXJsKSB7XG4gICAgICAgICAgaWYgKGF0dGVtcHQgPiAxKSB7XG4gICAgICAgICAgICBsb2dnZXIuaW5mbyhgRWxlbWVudCBzYXZlZCBzdWNjZXNzZnVsbHkgYWZ0ZXIgJHthdHRlbXB0fSBhdHRlbXB0c2AsIHtcbiAgICAgICAgICAgICAgZWxlbWVudE5hbWUsXG4gICAgICAgICAgICAgIGVsZW1lbnRUeXBlLFxuICAgICAgICAgICAgICBmaWxlVXJsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGZpbGVVcmw7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIC8vIElmIHNhdmVFbGVtZW50IHJldHVybnMgbnVsbCwgdHJlYXQgYXMgYSBmYWlsdXJlIGJ1dCBkb24ndCByZXRyeSBpbW1lZGlhdGVseVxuICAgICAgICBsYXN0RXJyb3IgPSBuZXcgRXJyb3IoYHNhdmVFbGVtZW50IHJldHVybmVkIG51bGwgb24gYXR0ZW1wdCAke2F0dGVtcHR9YCk7XG4gICAgICAgIFxuICAgICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgICBsYXN0RXJyb3IgPSBlcnJvcjtcbiAgICAgICAgY29uc3QgaXNSZXRyeWFibGUgPSB0aGlzLmlzUmV0cnlhYmxlRXJyb3IoZXJyb3IpO1xuICAgICAgICBcbiAgICAgICAgbG9nZ2VyLndhcm4oYFNhdmUgYXR0ZW1wdCAke2F0dGVtcHR9IGZhaWxlZGAsIHtcbiAgICAgICAgICBlbGVtZW50TmFtZSxcbiAgICAgICAgICBlbGVtZW50VHlwZSxcbiAgICAgICAgICBhdHRlbXB0LFxuICAgICAgICAgIGVycm9yOiBlcnJvci5tZXNzYWdlLFxuICAgICAgICAgIGlzUmV0cnlhYmxlLFxuICAgICAgICAgIHdpbGxSZXRyeTogaXNSZXRyeWFibGUgJiYgYXR0ZW1wdCA8IG1heFJldHJpZXNcbiAgICAgICAgfSk7XG4gICAgICAgIFxuICAgICAgICAvLyBJZiB0aGlzIGlzIG5vdCBhIHJldHJ5YWJsZSBlcnJvciwgZmFpbCBpbW1lZGlhdGVseVxuICAgICAgICBpZiAoIWlzUmV0cnlhYmxlKSB7XG4gICAgICAgICAgbG9nZ2VyLmVycm9yKCdOb24tcmV0cnlhYmxlIGVycm9yIGVuY291bnRlcmVkLCBhYm9ydGluZyByZXRyaWVzJywge1xuICAgICAgICAgICAgZWxlbWVudE5hbWUsXG4gICAgICAgICAgICBlcnJvcjogZXJyb3IubWVzc2FnZVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICAvLyBJZiB3ZSBoYXZlIG1vcmUgYXR0ZW1wdHMsIHdhaXQgYmVmb3JlIHJldHJ5aW5nXG4gICAgICAgIGlmIChhdHRlbXB0IDwgbWF4UmV0cmllcykge1xuICAgICAgICAgIGNvbnN0IGRlbGF5ID0gY2FsY3VsYXRlUmV0cnlEZWxheShhdHRlbXB0KTtcbiAgICAgICAgICBsb2dnZXIuZGVidWcoYFdhaXRpbmcgJHtkZWxheX1tcyBiZWZvcmUgcmV0cnlgLCB7IGF0dGVtcHQsIGRlbGF5IH0pO1xuICAgICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKHJlc29sdmUgPT4gc2V0VGltZW91dChyZXNvbHZlLCBkZWxheSkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIFxuICAgIC8vIEFsbCBhdHRlbXB0cyBmYWlsZWRcbiAgICBsb2dnZXIuZXJyb3IoYEFsbCAke21heFJldHJpZXN9IHNhdmUgYXR0ZW1wdHMgZmFpbGVkYCwge1xuICAgICAgZWxlbWVudE5hbWUsXG4gICAgICBlbGVtZW50VHlwZSxcbiAgICAgIGxhc3RFcnJvcjogbGFzdEVycm9yPy5tZXNzYWdlXG4gICAgfSk7XG4gICAgXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBEZXRlcm1pbmUgaWYgYW4gZXJyb3IgaXMgd29ydGggcmV0cnlpbmdcbiAgICogUmV0cnlhYmxlOiBuZXR3b3JrIGlzc3VlcywgcmF0ZSBsaW1pdHMsIHRlbXBvcmFyeSBHaXRIdWIgQVBJIHByb2JsZW1zXG4gICAqIE5vbi1yZXRyeWFibGU6IGF1dGhlbnRpY2F0aW9uIGlzc3VlcywgdmFsaWRhdGlvbiBlcnJvcnMsIHBlcm1hbmVudCBmYWlsdXJlc1xuICAgKi9cbiAgcHJpdmF0ZSBpc1JldHJ5YWJsZUVycm9yKGVycm9yOiBhbnkpOiBib29sZWFuIHtcbiAgICBjb25zdCBlcnJvck1lc3NhZ2UgPSBlcnJvcj8ubWVzc2FnZT8udG9Mb3dlckNhc2UoKSB8fCAnJztcbiAgICBjb25zdCBlcnJvckNvZGUgPSBlcnJvcj8uY29kZTtcbiAgICBjb25zdCBzdGF0dXNDb2RlID0gZXJyb3I/LnN0YXR1cyB8fCBlcnJvcj8uc3RhdHVzQ29kZTtcbiAgICBcbiAgICAvLyBOZXR3b3JrIGFuZCB0aW1lb3V0IGVycm9yc1xuICAgIGlmIChlcnJvckNvZGUgPT09ICdFTk9URk9VTkQnIHx8IGVycm9yQ29kZSA9PT0gJ0VDT05OUkVTRVQnIHx8IGVycm9yQ29kZSA9PT0gJ0VUSU1FRE9VVCcpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBcbiAgICAvLyBHaXRIdWIgQVBJIHJhdGUgbGltaXRzXG4gICAgaWYgKHN0YXR1c0NvZGUgPT09IDQyOSB8fCBlcnJvck1lc3NhZ2UuaW5jbHVkZXMoJ3JhdGUgbGltaXQnKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIFxuICAgIC8vIFRlbXBvcmFyeSBHaXRIdWIgQVBJIGlzc3Vlc1xuICAgIGlmIChzdGF0dXNDb2RlID49IDUwMCAmJiBzdGF0dXNDb2RlIDwgNjAwKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgXG4gICAgLy8gVGVtcG9yYXJ5IEdpdEh1YiBBUEkgcHJvYmxlbXNcbiAgICBpZiAoZXJyb3JNZXNzYWdlLmluY2x1ZGVzKCd0ZW1wb3JhcmlseSB1bmF2YWlsYWJsZScpIHx8IFxuICAgICAgICBlcnJvck1lc3NhZ2UuaW5jbHVkZXMoJ3NlcnZpY2UgdW5hdmFpbGFibGUnKSB8fFxuICAgICAgICBlcnJvck1lc3NhZ2UuaW5jbHVkZXMoJ2ludGVybmFsIHNlcnZlciBlcnJvcicpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgXG4gICAgLy8gQ29ubmVjdGlvbiBpc3N1ZXNcbiAgICBpZiAoZXJyb3JNZXNzYWdlLmluY2x1ZGVzKCdjb25uZWN0aW9uJykgJiYgXG4gICAgICAgIChlcnJvck1lc3NhZ2UuaW5jbHVkZXMoJ3RpbWVvdXQnKSB8fCBlcnJvck1lc3NhZ2UuaW5jbHVkZXMoJ3Jlc2V0JykpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgXG4gICAgLy8gRG9uJ3QgcmV0cnkgYXV0aGVudGljYXRpb24gb3IgcGVybWlzc2lvbiBpc3N1ZXNcbiAgICBpZiAoc3RhdHVzQ29kZSA9PT0gNDAxIHx8IHN0YXR1c0NvZGUgPT09IDQwMyB8fCBcbiAgICAgICAgZXJyb3JNZXNzYWdlLmluY2x1ZGVzKCd1bmF1dGhvcml6ZWQnKSB8fCBcbiAgICAgICAgZXJyb3JNZXNzYWdlLmluY2x1ZGVzKCdmb3JiaWRkZW4nKSB8fFxuICAgICAgICBlcnJvck1lc3NhZ2UuaW5jbHVkZXMoJ2F1dGhlbnRpY2F0aW9uJykpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgXG4gICAgLy8gRG9uJ3QgcmV0cnkgdmFsaWRhdGlvbiBlcnJvcnNcbiAgICBpZiAoc3RhdHVzQ29kZSA9PT0gNDAwIHx8IHN0YXR1c0NvZGUgPT09IDQyMiB8fFxuICAgICAgICBlcnJvck1lc3NhZ2UuaW5jbHVkZXMoJ2ludmFsaWQnKSB8fFxuICAgICAgICBlcnJvck1lc3NhZ2UuaW5jbHVkZXMoJ3ZhbGlkYXRpb24nKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBcbiAgICAvLyBEZWZhdWx0IHRvIG5vdCByZXRyeWluZyBmb3IgdW5rbm93biBlcnJvcnMgdG8gYXZvaWQgaW5maW5pdGUgbG9vcHNcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn0iXX0=
|
|
2059
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3VibWl0VG9Qb3J0Zm9saW9Ub29sLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3Rvb2xzL3BvcnRmb2xpby9zdWJtaXRUb1BvcnRmb2xpb1Rvb2wudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7O0dBUUc7QUFFSCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sUUFBUSxDQUFDO0FBQ3BDLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ3BFLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLHlDQUF5QyxDQUFDO0FBQy9FLE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQzdFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUM5RCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUN0RSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUN2RSxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSwwQ0FBMEMsQ0FBQztBQUNqRixPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDdkQsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQy9DLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLCtDQUErQyxDQUFDO0FBQ2pGLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUVwRSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUN2RSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUNyRSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDM0QsT0FBTyxFQUNMLGdCQUFnQixFQUNoQixZQUFZLEVBQ1osYUFBYSxFQUViLG1CQUFtQixFQUNuQixtQkFBbUIs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QUFDLEVBQUUsQ0FBQztZQUN4QyxPQUFPLEtBQUssQ0FBQztRQUNmLENBQUM7UUFFRCxxRUFBcUU7UUFDckUsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFRvb2wgZm9yIHN1Ym1pdHRpbmcgY29udGVudCB0byBHaXRIdWIgcG9ydGZvbGlvIHJlcG9zaXRvcmllc1xuICogUmVwbGFjZXMgdGhlIGJyb2tlbiBpc3N1ZS1iYXNlZCBzdWJtaXNzaW9uIHdpdGggZGlyZWN0IHJlcG9zaXRvcnkgc2F2ZXNcbiAqIFxuICogRklYRVMgSU1QTEVNRU5URUQgKFBSICM1MDMpOlxuICogMS4gVFlQRSBTQUZFVFkgRklYICMxIChJc3N1ZSAjNDk3KTogQ2hhbmdlZCBhcGlDYWNoZSBmcm9tICdhbnknIHRvIHByb3BlciBBUElDYWNoZSB0eXBlXG4gKiAyLiBUWVBFIFNBRkVUWSBGSVggIzIgKElzc3VlICM0OTcpOiBSZXBsYWNlZCBjb21wbGV4IHR5cGUgY2FzdGluZyB3aXRoIFBvcnRmb2xpb0VsZW1lbnRBZGFwdGVyXG4gKiAzLiBQRVJGT1JNQU5DRSAoUFIgIzQ5NiByZWNvbW1lbmRhdGlvbik6IFVzaW5nIEZpbGVEaXNjb3ZlcnlVdGlsIGZvciBvcHRpbWl6ZWQgZmlsZSBzZWFyY2hcbiAqL1xuXG5pbXBvcnQgeyBjcmVhdGVIYXNoIH0gZnJvbSAnY3J5cHRvJztcbmltcG9ydCB7IEdpdEh1YkF1dGhNYW5hZ2VyIH0gZnJvbSAnLi4vLi4vYXV0aC9HaXRIdWJBdXRoTWFuYWdlci5qcyc7XG5pbXBvcnQgeyBQb3J0Zm9saW9SZXBvTWFuYWdlciB9IGZyb20gJy4uLy4uL3BvcnRmb2xpby9Qb3J0Zm9saW9SZXBvTWFuYWdlci5qcyc7XG5pbXBvcnQgeyBnZXRQb3J0Zm9saW9SZXBvc2l0b3J5TmFtZSB9IGZyb20gJy4uLy4uL2NvbmZpZy9wb3J0Zm9saW9Db25maWcuanMnO1xuaW1wb3J0IHsgVG9rZW5NYW5hZ2VyIH0gZnJvbSAnLi4vLi4vc2VjdXJpdHkvdG9rZW5NYW5hZ2VyLmpzJztcbmltcG9ydCB7IENvbnRlbnRWYWxpZGF0b3IgfSBmcm9tICcuLi8uLi9zZWN1cml0eS9jb250ZW50VmFsaWRhdG9yLmpzJztcbmltcG9ydCB7IFBvcnRmb2xpb01hbmFnZXIgfSBmcm9tICcuLi8uLi9wb3J0Zm9saW8vUG9ydGZvbGlvTWFuYWdlci5qcyc7XG5pbXBvcnQgeyBQb3J0Zm9saW9JbmRleE1hbmFnZXIgfSBmcm9tICcuLi8uLi9wb3J0Zm9saW8vUG9ydGZvbGlvSW5kZXhNYW5hZ2VyLmpzJztcbmltcG9ydCB7IEVsZW1lbnRUeXBlIH0gZnJvbSAnLi4vLi4vcG9ydGZvbGlvL3R5cGVzLmpzJztcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uLy4uL3V0aWxzL2xvZ2dlci5qcyc7XG5pbXBvcnQgeyBVbmljb2RlVmFsaWRhdG9yIH0gZnJvbSAnLi4vLi4vc2VjdXJpdHkvdmFsaWRhdG9ycy91bmljb2RlVmFsaWRhdG9yLmpzJztcbmltcG9ydCB7IFNlY3VyaXR5TW9uaXRvciB9IGZyb20gJy4uLy4uL3NlY3VyaXR5L3NlY3VyaXR5TW9uaXRvci5qcyc7XG5pbXBvcnQgeyBBUElDYWNoZSB9IGZyb20gJy4uLy4uL2NhY2hlL0FQSUNhY2hlLmpzJztcbmltcG9ydCB7IFBvcnRmb2xpb0VsZW1lbnRBZGFwdGVyIH0gZnJvbSAnLi9Qb3J0Zm9saW9FbGVtZW50QWRhcHRlci5qcyc7XG5pbXBvcnQgeyBGaWxlRGlzY292ZXJ5VXRpbCB9IGZyb20gJy4uLy4uL3V0aWxzL0ZpbGVEaXNjb3ZlcnlVdGlsLmpzJztcbmltcG9ydCB7IEVycm9ySGFuZGxlciB9IGZyb20gJy4uLy4uL3V0aWxzL0Vycm9ySGFuZGxlci5qcyc7XG5pbXBvcnQgeyBcbiAgRklMRV9TSVpFX0xJTUlUUywgXG4gIFJFVFJZX0NPTkZJRywgXG4gIFNFQVJDSF9DT05GSUcsXG4gIFBvcnRmb2xpb0VsZW1lbnRNZXRhZGF0YSxcbiAgZ2V0VmFsaWRhdGVkVGltZW91dCxcbiAgY2FsY3VsYXRlUmV0cnlEZWxheVxufSBmcm9tICcuLi8uLi9jb25maWcvcG9ydGZvbGlvLWNvbnN0YW50cy5qcyc7XG5pbXBvcnQgeyBnaXRodWJSYXRlTGltaXRlciB9IGZyb20gJy4uLy4uL3V0aWxzL0dpdEh1YlJhdGVMaW1pdGVyLmpzJztcbmltcG9ydCB7IEVhcmx5VGVybWluYXRpb25TZWFyY2ggfSBmcm9tICcuLi8uLi91dGlscy9FYXJseVRlcm1pbmF0aW9uU2VhcmNoLmpzJztcbmltcG9ydCB7IENvbGxlY3Rpb25FcnJvckNvZGUsIGZvcm1hdENvbGxlY3Rpb25FcnJvciB9IGZyb20gJy4uLy4uL2NvbmZpZy9lcnJvci1jb2Rlcy5qcyc7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0ICogYXMgZnMgZnJvbSAnZnMvcHJvbWlzZXMnO1xuaW1wb3J0IHsgU2VjdXJlWWFtbFBhcnNlciB9IGZyb20gJy4uLy4uL3NlY3VyaXR5L3NlY3VyZVlhbWxQYXJzZXIuanMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFN1Ym1pdFRvUG9ydGZvbGlvUGFyYW1zIHtcbiAgbmFtZTogc3RyaW5nO1xuICB0eXBlPzogRWxlbWVudFR5cGU7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUG9ydGZvbGlvRWxlbWVudCB7XG4gIHR5cGU6IEVsZW1lbnRUeXBlO1xuICBtZXRhZGF0YTogUG9ydGZvbGlvRWxlbWVudE1ldGFkYXRhO1xuICBjb250ZW50OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3VibWl0VG9Qb3J0Zm9saW9SZXN1bHQge1xuICBzdWNjZXNzOiBib29sZWFuO1xuICBtZXNzYWdlOiBzdHJpbmc7XG4gIHVybD86IHN0cmluZztcbiAgZXJyb3I/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRWxlbWVudERldGVjdGlvbk1hdGNoIHtcbiAgdHlwZTogRWxlbWVudFR5cGU7XG4gIHBhdGg6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBFbGVtZW50RGV0ZWN0aW9uUmVzdWx0IHtcbiAgZm91bmQ6IGJvb2xlYW47XG4gIG1hdGNoZXM6IEVsZW1lbnREZXRlY3Rpb25NYXRjaFtdO1xufVxuXG4vLyBXb3JrZmxvdyBzdGVwIGNvbnN0YW50cyBmb3IgY29uc2lzdGVudCBsb2dnaW5nXG5jb25zdCBXT1JLRkxPV19TVEVQUyA9IHtcbiAgVkFMSURBVElPTjogMSxcbiAgQVVUSEVOVElDQVRJT046IDIsXG4gIENPTlRFTlRfRElTQ09WRVJZOiAzLFxuICBTRUNVUklUWTogNCxcbiAgTUVUQURBVEE6IDUsXG4gIFJFUE9fU0VUVVA6IDYsXG4gIFNVQk1JU1NJT046IDcsXG4gIFJFUE9SVElORzogOCxcbiAgVE9UQUw6IDhcbn0gYXMgY29uc3Q7XG5cbi8vIExvZ2dpbmcgY29uZmlndXJhdGlvblxuY29uc3QgTE9HR0lOR19DT05GSUcgPSB7XG4gIC8vIFNldCBET0xMSE9VU0VfVkVSQk9TRV9MT0dHSU5HPXRydWUgZm9yIGRldGFpbGVkIHN0ZXAtYnktc3RlcCBsb2dzXG4gIGlzVmVyYm9zZTogcHJvY2Vzcy5lbnYuRE9MTEhPVVNFX1ZFUkJPU0VfTE9HR0lORz8udG9Mb3dlckNhc2UoKSA9PT0gJ3RydWUnLFxuICAvLyBTZXQgRE9MTEhPVVNFX0xPR19USU1JTkc9dHJ1ZSBmb3IgdGltaW5nIG1lYXN1cmVtZW50c1xuICBzaG91bGRMb2dUaW1pbmc6IHByb2Nlc3MuZW52LkRPTExIT1VTRV9MT0dfVElNSU5HPy50b0xvd2VyQ2FzZSgpID09PSAndHJ1ZScgfHwgXG4gICAgICAgICAgICAgICAgICAgcHJvY2Vzcy5lbnYuRE9MTEhPVVNFX1ZFUkJPU0VfTE9HR0lORz8udG9Mb3dlckNhc2UoKSA9PT0gJ3RydWUnXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgY2xhc3MgU3VibWl0VG9Qb3J0Zm9saW9Ub29sIHtcbiAgcHJpdmF0ZSBhdXRoTWFuYWdlcjogR2l0SHViQXV0aE1hbmFnZXI7XG4gIHByaXZhdGUgcG9ydGZvbGlvTWFuYWdlcjogUG9ydGZvbGlvUmVwb01hbmFnZXI7XG5cbiAgY29uc3RydWN0b3IoYXBpQ2FjaGU6IEFQSUNhY2hlKSB7XG4gICAgLy8gVFlQRSBTQUZFVFkgRklYICMxOiBQcm9wZXIgdHlwaW5nIGZvciBhcGlDYWNoZSBwYXJhbWV0ZXJcbiAgICAvLyBQcmV2aW91c2x5OiBjb25zdHJ1Y3RvcihhcGlDYWNoZTogYW55KVxuICAgIC8vIE5vdzogY29uc3RydWN0b3IoYXBpQ2FjaGU6IEFQSUNhY2hlKSB3aXRoIHByb3BlciBpbXBvcnRcbiAgICB0aGlzLmF1dGhNYW5hZ2VyID0gbmV3IEdpdEh1YkF1dGhNYW5hZ2VyKGFwaUNhY2hlKTtcbiAgICB0aGlzLnBvcnRmb2xpb01hbmFnZXIgPSBuZXcgUG9ydGZvbGlvUmVwb01hbmFnZXIoZ2V0UG9ydGZvbGlvUmVwb3NpdG9yeU5hbWUoKSk7XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGVzIGFuZCBub3JtYWxpemVzIGlucHV0IHBhcmFtZXRlcnMgdG8gcHJldmVudCBVbmljb2RlIGF0dGFja3MgYW5kIGVuc3VyZSBkYXRhIHNhZmV0eVxuICAgKiBAcGFyYW0gcGFyYW1zIFRoZSBpbnB1dCBwYXJhbWV0ZXJzIGZyb20gdGhlIHVzZXJcbiAgICogQHJldHVybnMgVmFsaWRhdGlvbiByZXN1bHQgd2l0aCBub3JtYWxpemVkIG5hbWUgb3IgZXJyb3IgcmVzcG9uc2VcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgdmFsaWRhdGVBbmROb3JtYWxpemVQYXJhbXMocGFyYW1zOiBTdWJtaXRUb1BvcnRmb2xpb1BhcmFtcyk6IFByb21pc2U8e1xuICAgIHN1Y2Nlc3M6IGJvb2xlYW47XG4gICAgc2FmZU5hbWU/OiBzdHJpbmc7XG4gICAgZXJyb3I/OiBTdWJtaXRUb1BvcnRmb2xpb1Jlc3VsdDtcbiAgfT4ge1xuICAgIC8vIE5vcm1hbGl6ZSB1c2VyIGlucHV0IHRvIHByZXZlbnQgVW5pY29kZSBhdHRhY2tzIChETUNQLVNFQy0wMDQpXG4gICAgY29uc3Qgbm9ybWFsaXplZE5hbWUgPSBVbmljb2RlVmFsaWRhdG9yLm5vcm1hbGl6ZShwYXJhbXMubmFtZSk7XG4gICAgaWYgKCFub3JtYWxpemVkTmFtZS5pc1ZhbGlkKSB7XG4gICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgIHR5cGU6ICdVTklDT0RFX1ZBTElEQVRJT05fRVJST1InLFxuICAgICAgICBzZXZlcml0eTogJ01FRElVTScsXG4gICAgICAgIHNvdXJjZTogJ1N1Ym1pdFRvUG9ydGZvbGlvVG9vbC5leGVjdXRlJyxcbiAgICAgICAgZGV0YWlsczogYEludmFsaWQgVW5pY29kZSBpbiBlbGVtZW50IG5hbWU6ICR7bm9ybWFsaXplZE5hbWUuZGV0ZWN0ZWRJc3N1ZXM/LlswXSB8fCAndW5rbm93biBlcnJvcid9YFxuICAgICAgfSk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgZXJyb3I6IHtcbiAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgICBtZXNzYWdlOiBgSW52YWxpZCBjaGFyYWN0ZXJzIGluIGVsZW1lbnQgbmFtZTogJHtub3JtYWxpemVkTmFtZS5kZXRlY3RlZElzc3Vlcz8uWzBdIHx8ICd1bmtub3duIGVycm9yJ31gLFxuICAgICAgICAgIGVycm9yOiAnSU5WQUxJRF9JTlBVVCdcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9XG4gICAgXG4gICAgcmV0dXJuIHtcbiAgICAgIHN1Y2Nlc3M6IHRydWUsXG4gICAgICBzYWZlTmFtZTogbm9ybWFsaXplZE5hbWUubm9ybWFsaXplZENvbnRlbnRcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiB0aGUgdXNlciBpcyBhdXRoZW50aWNhdGVkIHdpdGggR2l0SHViXG4gICAqIEByZXR1cm5zIEF1dGhlbnRpY2F0aW9uIGNoZWNrIHJlc3VsdCB3aXRoIHN0YXR1cyBvciBlcnJvciByZXNwb25zZVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBjaGVja0F1dGhlbnRpY2F0aW9uKCk6IFByb21pc2U8e1xuICAgIHN1Y2Nlc3M6IGJvb2xlYW47XG4gICAgYXV0aFN0YXR1cz86IGFueTtcbiAgICBlcnJvcj86IFN1Ym1pdFRvUG9ydGZvbGlvUmVzdWx0O1xuICB9PiB7XG4gICAgY29uc3QgYXV0aFN0YXR1cyA9IGF3YWl0IHRoaXMuYXV0aE1hbmFnZXIuZ2V0QXV0aFN0YXR1cygpO1xuICAgIGlmICghYXV0aFN0YXR1cy5pc0F1dGhlbnRpY2F0ZWQpIHtcbiAgICAgIC8vIExvZyBhdXRoZW50aWNhdGlvbiByZXF1aXJlZCAodXNpbmcgZXhpc3RpbmcgZXZlbnQgdHlwZSlcbiAgICAgIGxvZ2dlci53YXJuKCdVc2VyIGF0dGVtcHRlZCBwb3J0Zm9saW8gc3VibWlzc2lvbiB3aXRob3V0IGF1dGhlbnRpY2F0aW9uJyk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgZXJyb3I6IHtcbiAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgICBtZXNzYWdlOiAnTm90IGF1dGhlbnRpY2F0ZWQuIFBsZWFzZSBhdXRoZW50aWNhdGUgZmlyc3QgdXNpbmcgdGhlIEdpdEh1YiBPQXV0aCBmbG93LlxcblxcbicgK1xuICAgICAgICAgICAgICAgICAgICdWaXNpdDogaHR0cHM6Ly9kb2NzLmFudGhyb3BpYy5jb20vZW4vZG9jcy9jbGF1ZGUtY29kZS9vYXV0aC1zZXR1cFxcbicgK1xuICAgICAgICAgICAgICAgICAgICdPciBydW46IGdoIGF1dGggbG9naW4gLS13ZWInLFxuICAgICAgICAgIGVycm9yOiAnTk9UX0FVVEhFTlRJQ0FURUQnXG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHN1Y2Nlc3M6IHRydWUsXG4gICAgICBhdXRoU3RhdHVzXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNjb3ZlcnMgY29udGVudCBsb2NhbGx5IHdpdGggc21hcnQgdHlwZSBkZXRlY3Rpb25cbiAgICogQHBhcmFtIHNhZmVOYW1lIFRoZSBub3JtYWxpemVkIG5hbWUgdG8gc2VhcmNoIGZvclxuICAgKiBAcGFyYW0gZXhwbGljaXRUeXBlIE9wdGlvbmFsIGV4cGxpY2l0IGVsZW1lbnQgdHlwZSBwcm92aWRlZCBieSB1c2VyXG4gICAqIEBwYXJhbSBvcmlnaW5hbE5hbWUgT3JpZ2luYWwgdXNlci1wcm92aWRlZCBuYW1lIGZvciBlcnJvciBtZXNzYWdlc1xuICAgKiBAcmV0dXJucyBDb250ZW50IGRpc2NvdmVyeSByZXN1bHQgd2l0aCBlbGVtZW50IHR5cGUgYW5kIHBhdGggb3IgZXJyb3IgcmVzcG9uc2VcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZGlzY292ZXJDb250ZW50V2l0aFR5cGVEZXRlY3Rpb24oXG4gICAgc2FmZU5hbWU6IHN0cmluZywgXG4gICAgZXhwbGljaXRUeXBlPzogRWxlbWVudFR5cGUsIFxuICAgIG9yaWdpbmFsTmFtZT86IHN0cmluZ1xuICApOiBQcm9taXNlPHtcbiAgICBzdWNjZXNzOiBib29sZWFuO1xuICAgIGVsZW1lbnRUeXBlPzogRWxlbWVudFR5cGU7XG4gICAgbG9jYWxQYXRoPzogc3RyaW5nO1xuICAgIGVycm9yPzogU3VibWl0VG9Qb3J0Zm9saW9SZXN1bHQ7XG4gIH0+IHtcbiAgICBsZXQgZWxlbWVudFR5cGUgPSBleHBsaWNpdFR5cGU7XG4gICAgbGV0IGxvY2FsUGF0aDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gICAgXG4gICAgaWYgKGVsZW1lbnRUeXBlKSB7XG4gICAgICAvLyBUeXBlIGV4cGxpY2l0bHkgcHJvdmlkZWQgLSBzZWFyY2ggaW4gdGhhdCBzcGVjaWZpYyBkaXJlY3Rvcnkgb25seVxuICAgICAgbG9jYWxQYXRoID0gYXdhaXQgdGhpcy5maW5kTG9jYWxDb250ZW50KHNhZmVOYW1lLCBlbGVtZW50VHlwZSk7XG4gICAgICBpZiAoIWxvY2FsUGF0aCkge1xuICAgICAgICAvLyBVWCBJTVBST1ZFTUVOVDogUHJvdmlkZSBoZWxwZnVsIHN1Z2dlc3Rpb25zIGZvciBmaW5kaW5nIGNvbnRlbnRcbiAgICAgICAgY29uc3QgcG9ydGZvbGlvTWFuYWdlciA9IFBvcnRmb2xpb01hbmFnZXIuZ2V0SW5zdGFuY2UoKTtcbiAgICAgICAgY29uc3QgZWxlbWVudERpciA9IHBvcnRmb2xpb01hbmFnZXIuZ2V0RWxlbWVudERpcihlbGVtZW50VHlwZSk7XG4gICAgICAgIFxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICAgIGVycm9yOiB7XG4gICAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IGBDb3VsZCBub3QgZmluZCAke2VsZW1lbnRUeXBlfSBuYW1lZCBcIiR7b3JpZ2luYWxOYW1lIHx8IHNhZmVOYW1lfVwiIGluIGxvY2FsIHBvcnRmb2xpby5cXG5cXG5gICtcbiAgICAgICAgICAgICAgICAgICAgYCoqU2VhcmNoZWQgaW4qKjogJHtlbGVtZW50RGlyfVxcblxcbmAgK1xuICAgICAgICAgICAgICAgICAgICBgKipUcm91Ymxlc2hvb3RpbmcgVGlwcyoqOlxcbmAgK1xuICAgICAgICAgICAgICAgICAgICBg4oCiIENoZWNrIGlmIHRoZSBmaWxlIGV4aXN0cyB1c2luZyB5b3VyIGZpbGUgZXhwbG9yZXJcXG5gICtcbiAgICAgICAgICAgICAgICAgICAgYOKAoiBUcnkgdXNpbmcgdGhlIGV4YWN0IGZpbGVuYW1lICh3aXRob3V0IGV4dGVuc2lvbilcXG5gICtcbiAgICAgICAgICAgICAgICAgICAgYOKAoiBVc2UgXFxgbGlzdF9wb3J0Zm9saW9cXGAgdG8gc2VlIGFsbCBhdmFpbGFibGUgJHtlbGVtZW50VHlwZX1cXG5gICtcbiAgICAgICAgICAgICAgICAgICAgYOKAoiBJZiB1bnN1cmUgb2YgdGhlIHR5cGUsIG9taXQgLS10eXBlIGFuZCBsZXQgdGhlIHN5c3RlbSBkZXRlY3QgaXRcXG5cXG5gICtcbiAgICAgICAgICAgICAgICAgICAgYCoqQ29tbW9uIG5hbWUgZm9ybWF0cyB0aGF0IHdvcmsqKjpcXG5gICtcbiAgICAgICAgICAgICAgICAgICAgYOKAoiBcIm15LWVsZW1lbnRcIiAoa2ViYWItY2FzZSlcXG5gICtcbiAgICAgICAgICAgICAgICAgICAgYOKAoiBcIk15IEVsZW1lbnRcIiAod2l0aCBzcGFjZXMpXFxuYCArXG4gICAgICAgICAgICAgICAgICAgIGDigKIgXCJNeUVsZW1lbnRcIiAoUGFzY2FsQ2FzZSlcXG5gICtcbiAgICAgICAgICAgICAgICAgICAgYOKAoiBQYXJ0aWFsIG1hdGNoZXMgYXJlIHN1cHBvcnRlZGAsXG4gICAgICAgICAgICBlcnJvcjogJ0NPTlRFTlRfTk9UX0ZPVU5EJ1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gQ1JJVElDQUwgRklYOiBObyB0eXBlIHByb3ZpZGVkIC0gaW1wbGVtZW50IHNtYXJ0IGRldGVjdGlvbiBhY3Jvc3MgQUxMIGVsZW1lbnQgdHlwZXNcbiAgICAgIC8vIFRoaXMgcHJldmVudHMgdGhlIHByZXZpb3VzIGhhcmRjb2RlZCBkZWZhdWx0IHRvIFBFUlNPTkEgYW5kIGVuYWJsZXMgcHJvcGVyIHR5cGUgZGV0ZWN0aW9uXG4gICAgICBjb25zdCBkZXRlY3Rpb25SZXN1bHQgPSBhd2FpdCB0aGlzLmRldGVjdEVsZW1lbnRUeXBlKHNhZmVOYW1lKTtcbiAgICAgIFxuICAgICAgaWYgKCFkZXRlY3Rpb25SZXN1bHQuZm91bmQpIHtcbiAgICAgICAgLy8gVVggSU1QUk9WRU1FTlQ6IEVuaGFuY2VkIGd1aWRhbmNlIHdpdGggc3BlY2lmaWMgc3VnZ2VzdGlvbnNcbiAgICAgICAgY29uc3QgYXZhaWxhYmxlVHlwZXMgPSBPYmplY3QudmFsdWVzKEVsZW1lbnRUeXBlKS5qb2luKCcsICcpO1xuICAgICAgICBcbiAgICAgICAgLy8gR2V0IHN1Z2dlc3Rpb25zIGZvciBzaW1pbGFyIG5hbWVzXG4gICAgICAgIGNvbnN0IHN1Z2dlc3Rpb25zID0gYXdhaXQgdGhpcy5nZW5lcmF0ZU5hbWVTdWdnZXN0aW9ucyhzYWZlTmFtZSk7XG4gICAgICAgIFxuICAgICAgICBsZXQgbWVzc2FnZSA9IGBDb250ZW50IFwiJHtvcmlnaW5hbE5hbWUgfHwgc2FmZU5hbWV9XCIgbm90IGZvdW5kIGluIHBvcnRmb2xpby5cXG5cXG5gO1xuICAgICAgICBtZXNzYWdlICs9IGDwn5SNICoqU2VhcmNoZWQgaW4gYWxsIGVsZW1lbnQgdHlwZXMqKjogJHthdmFpbGFibGVUeXBlc31cXG5cXG5gO1xuICAgICAgICBcbiAgICAgICAgaWYgKHN1Z2dlc3Rpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBtZXNzYWdlICs9IGDwn5KhICoqRGlkIHlvdSBtZWFuIG9uZSBvZiB0aGVzZT8qKlxcbmA7XG4gICAgICAgICAgZm9yIChjb25zdCBzdWdnZXN0aW9uIG9mIHN1Z2dlc3Rpb25zLnNsaWNlKDAsIFNFQVJDSF9DT05GSUcuTUFYX1NVR0dFU1RJT05TKSkge1xuICAgICAgICAgICAgbWVzc2FnZSArPSBgICDigKIgXCIke3N1Z2dlc3Rpb24ubmFtZX1cIiAoJHtzdWdnZXN0aW9uLnR5cGV9KVxcbmA7XG4gICAgICAgICAgfVxuICAgICAgICAgIG1lc3NhZ2UgKz0gYFxcbmA7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIG1lc3NhZ2UgKz0gYPCfm6DvuI8gKipUcm91Ymxlc2hvb3RpbmcgU3RlcHMqKjpcXG5gO1xuICAgICAgICBtZXNzYWdlICs9IGAxLiDwn5OdIFVzZSBcXGBsaXN0X3BvcnRmb2xpb1xcYCB0byBzZWUgYWxsIGF2YWlsYWJsZSBjb250ZW50XFxuYDtcbiAgICAgICAgbWVzc2FnZSArPSBgMi4g8J+UjSBDaGVjayBleGFjdCBzcGVsbGluZyBhbmQgdHJ5IHZhcmlhdGlvbnM6XFxuYDtcbiAgICAgICAgbWVzc2FnZSArPSBgICAg4oCiIFwiJHsob3JpZ2luYWxOYW1lIHx8IHNhZmVOYW1lKS50b0xvd2VyQ2FzZSgpfVwiIChsb3dlcmNhc2UpXFxuYDtcbiAgICAgICAgbWVzc2FnZSArPSBgICAg4oCiIFwiJHsob3JpZ2luYWxOYW1lIHx8IHNhZmVOYW1lKS5yZXBsYWNlKC9bXmEtejAtOV0vZ2ksICctJykudG9Mb3dlckNhc2UoKX1cIiAobm9ybWFsaXplZClcXG5gO1xuICAgICAgICBpZiAoKG9yaWdpbmFsTmFtZSB8fCBzYWZlTmFtZSkuaW5jbHVkZXMoJy4nKSkge1xuICAgICAgICAgIG1lc3NhZ2UgKz0gYCAgIOKAoiBcIiR7KG9yaWdpbmFsTmFtZSB8fCBzYWZlTmFtZSkucmVwbGFjZSgvXFwuL2csICcnKX1cIiAobm8gZG90cylcXG5gO1xuICAgICAgICB9XG4gICAgICAgIG1lc3NhZ2UgKz0gYDMuIPCfjq8gU3BlY2lmeSBlbGVtZW50IHR5cGU6IFxcYHN1Ym1pdF9jb2xsZWN0aW9uX2NvbnRlbnQgXCIke29yaWdpbmFsTmFtZSB8fCBzYWZlTmFtZX1cIiAtLXR5cGU9cGVyc29uYXNcXGBcXG5gO1xuICAgICAgICBtZXNzYWdlICs9IGA0LiDwn5OBIENoZWNrIGlmIGZpbGUgZXhpc3RzIGluIHBvcnRmb2xpbyBkaXJlY3Rvcmllc1xcblxcbmA7XG4gICAgICAgIG1lc3NhZ2UgKz0gYPCfk50gKipUaXAqKjogVGhlIHN5c3RlbSBzZWFyY2hlcyBmaWxlbmFtZXMgQU5EIG1ldGFkYXRhIG5hbWVzIHdpdGggZnV6enkgbWF0Y2hpbmcuYDtcbiAgICAgICAgXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgZXJyb3I6IHtcbiAgICAgICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICAgICAgbWVzc2FnZSxcbiAgICAgICAgICAgIGVycm9yOiAnQ09OVEVOVF9OT1RfRk9VTkQnXG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgXG4gICAgICBpZiAoZGV0ZWN0aW9uUmVzdWx0Lm1hdGNoZXMubGVuZ3RoID4gMSkge1xuICAgICAgICAvLyBNdWx0aXBsZSBtYXRjaGVzIGZvdW5kIC0gYXNrIHVzZXIgdG8gc3BlY2lmeSB0eXBlXG4gICAgICAgIGNvbnN0IG1hdGNoRGV0YWlscyA9IGRldGVjdGlvblJlc3VsdC5tYXRjaGVzLm1hcChtID0+IGAtICR7bS50eXBlfTogJHttLnBhdGh9YCkuam9pbignXFxuJyk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgZXJyb3I6IHtcbiAgICAgICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICAgICAgbWVzc2FnZTogYENvbnRlbnQgXCIke29yaWdpbmFsTmFtZSB8fCBzYWZlTmFtZX1cIiBmb3VuZCBpbiBtdWx0aXBsZSBlbGVtZW50IHR5cGVzOlxcblxcbiR7bWF0Y2hEZXRhaWxzfVxcblxcbmAgK1xuICAgICAgICAgICAgICAgICAgICBgUGxlYXNlIHNwZWNpZnkgdGhlIGVsZW1lbnQgdHlwZSB1c2luZyB0aGUgLS10eXBlIHBhcmFtZXRlciB0byBhdm9pZCBhbWJpZ3VpdHkuYCxcbiAgICAgICAgICAgIGVycm9yOiAnTVVMVElQTEVfTUFUQ0hFU19GT1VORCdcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIFNpbmdsZSBtYXRjaCBmb3VuZCAtIHVzZSBpdFxuICAgICAgY29uc3QgbWF0Y2ggPSBkZXRlY3Rpb25SZXN1bHQubWF0Y2hlc1swXTtcbiAgICAgIGVsZW1lbnRUeXBlID0gbWF0Y2gudHlwZTtcbiAgICAgIGxvY2FsUGF0aCA9IG1hdGNoLnBhdGg7XG4gICAgICBcbiAgICAgIGxvZ2dlci5pbmZvKGBTbWFydCBkZXRlY3Rpb246IEZvdW5kIFwiJHtzYWZlTmFtZX1cIiBhcyAke2VsZW1lbnRUeXBlfWAsIHsgXG4gICAgICAgIG5hbWU6IHNhZmVOYW1lLFxuICAgICAgICBkZXRlY3RlZFR5cGU6IGVsZW1lbnRUeXBlLFxuICAgICAgICBwYXRoOiBsb2NhbFBhdGhcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBzdWNjZXNzOiB0cnVlLFxuICAgICAgZWxlbWVudFR5cGUsXG4gICAgICBsb2NhbFBhdGhcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlcyBmaWxlIHNpemUgYW5kIGNvbnRlbnQgc2VjdXJpdHkgYmVmb3JlIHByb2Nlc3NpbmdcbiAgICogQHBhcmFtIGxvY2FsUGF0aCBQYXRoIHRvIHRoZSBsb2NhbCBmaWxlIHRvIHZhbGlkYXRlXG4gICAqIEByZXR1cm5zIFZhbGlkYXRpb24gcmVzdWx0IHdpdGggY29udGVudCBvciBlcnJvciByZXNwb25zZVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyB2YWxpZGF0ZUZpbGVBbmRDb250ZW50KGxvY2FsUGF0aDogc3RyaW5nKTogUHJvbWlzZTx7XG4gICAgc3VjY2VzczogYm9vbGVhbjtcbiAgICBjb250ZW50Pzogc3RyaW5nO1xuICAgIGVycm9yPzogU3VibWl0VG9Qb3J0Zm9saW9SZXN1bHQ7XG4gIH0+IHtcbiAgICAvLyBTRUNVUklUWSBFTkhBTkNFTUVOVCAoVGFzayAjNyk6IFZhbGlkYXRlIGZpbGUgcGF0aCBiZWZvcmUgcHJvY2Vzc2luZ1xuICAgIGNvbnN0IHBhdGhWYWxpZGF0aW9uID0gYXdhaXQgdGhpcy52YWxpZGF0ZVBvcnRmb2xpb1BhdGgobG9jYWxQYXRoKTtcbiAgICBpZiAoIXBhdGhWYWxpZGF0aW9uLmlzVmFsaWQpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICBlcnJvcjogcGF0aFZhbGlkYXRpb24uZXJyb3JcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gVXNlIHRoZSB2YWxpZGF0ZWQgc2FmZSBwYXRoIGZvciBhbGwgc3Vic2VxdWVudCBvcGVyYXRpb25zXG4gICAgY29uc3Qgc2FmZVBhdGggPSBwYXRoVmFsaWRhdGlvbi5zYWZlUGF0aCE7XG5cbiAgICAvLyBWYWxpZGF0ZSBmaWxlIHNpemUgYmVmb3JlIHJlYWRpbmdcbiAgICBjb25zdCBzdGF0cyA9IGF3YWl0IGZzLnN0YXQoc2FmZVBhdGgpO1xuICAgIGlmIChzdGF0cy5zaXplID4gRklMRV9TSVpFX0xJTUlUUy5NQVhfRklMRV9TSVpFKSB7XG4gICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgIHR5cGU6ICdSQVRFX0xJTUlUX0VYQ0VFREVEJyxcbiAgICAgICAgc2V2ZXJpdHk6ICdNRURJVU0nLFxuICAgICAgICBzb3VyY2U6ICdTdWJtaXRUb1BvcnRmb2xpb1Rvb2wuZXhlY3V0ZScsXG4gICAgICAgIGRldGFpbHM6IGBGaWxlIHNpemUgJHtzdGF0cy5zaXplfSBleGNlZWRzIGxpbWl0IG9mICR7RklMRV9TSVpFX0xJTUlUUy5NQVhfRklMRV9TSVpFfWBcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgIGVycm9yOiB7XG4gICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgbWVzc2FnZTogYEZpbGUgc2l6ZSBleGNlZWRzICR7RklMRV9TSVpFX0xJTUlUUy5NQVhfRklMRV9TSVpFX01CfU1CIGxpbWl0YCxcbiAgICAgICAgICBlcnJvcjogJ0ZJTEVfVE9PX0xBUkdFJ1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIGNvbnRlbnQgc2VjdXJpdHlcbiAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgZnMucmVhZEZpbGUoc2FmZVBhdGgsICd1dGYtOCcpO1xuICAgIGNvbnN0IHZhbGlkYXRpb25SZXN1bHQgPSBDb250ZW50VmFsaWRhdG9yLnZhbGlkYXRlQW5kU2FuaXRpemUoY29udGVudCk7XG5cbiAgICBpZiAoIXZhbGlkYXRpb25SZXN1bHQuaXNWYWxpZCAmJiB2YWxpZGF0aW9uUmVzdWx0LnNldmVyaXR5ID09PSAnY3JpdGljYWwnKSB7XG4gICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgIHR5cGU6ICdDT05URU5UX0lOSkVDVElPTl9BVFRFTVBUJyxcbiAgICAgICAgc2V2ZXJpdHk6ICdISUdIJyxcbiAgICAgICAgc291cmNlOiAnU3VibWl0VG9Qb3J0Zm9saW9Ub29sLmV4ZWN1dGUnLFxuICAgICAgICBkZXRhaWxzOiBgQ3JpdGljYWwgc2VjdXJpdHkgaXNzdWVzIGRldGVjdGVkOiAke3ZhbGlkYXRpb25SZXN1bHQuZGV0ZWN0ZWRQYXR0ZXJucz8uam9pbignLCAnKX1gXG4gICAgICB9KTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICBlcnJvcjoge1xuICAgICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICAgIG1lc3NhZ2U6IGBDb250ZW50IHZhbGlkYXRpb24gZmFpbGVkOiAke3ZhbGlkYXRpb25SZXN1bHQuZGV0ZWN0ZWRQYXR0ZXJucz8uam9pbignLCAnKX1gLFxuICAgICAgICAgIGVycm9yOiAnVkFMSURBVElPTl9GQUlMRUQnXG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHN1Y2Nlc3M6IHRydWUsXG4gICAgICBjb250ZW50XG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQcmVwYXJlcyBtZXRhZGF0YSBmb3IgdGhlIHBvcnRmb2xpbyBlbGVtZW50XG4gICAqIEBwYXJhbSBzYWZlTmFtZSBUaGUgbm9ybWFsaXplZCBuYW1lIG9mIHRoZSBlbGVtZW50XG4gICAqIEBwYXJhbSBlbGVtZW50VHlwZSBUaGUgdHlwZSBvZiB0aGUgZWxlbWVudFxuICAgKiBAcGFyYW0gYXV0aFN0YXR1cyBBdXRoZW50aWNhdGlvbiBzdGF0dXMgY29udGFpbmluZyB1c2VybmFtZVxuICAgKiBAcmV0dXJucyBNZXRhZGF0YSBvYmplY3QgZm9yIHRoZSBlbGVtZW50XG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHByZXBhcmVFbGVtZW50TWV0YWRhdGEoXG4gICAgc2FmZU5hbWU6IHN0cmluZywgXG4gICAgZWxlbWVudFR5cGU6IEVsZW1lbnRUeXBlLCBcbiAgICBhdXRoU3RhdHVzOiBhbnksXG4gICAgZmlsZVBhdGg/OiBzdHJpbmdcbiAgKTogUHJvbWlzZTxQb3J0Zm9saW9FbGVtZW50TWV0YWRhdGE+IHtcbiAgICAvLyBUcnkgdG8gZXh0cmFjdCBtZXRhZGF0YSBmcm9tIHRoZSBmaWxlIGlmIHBhdGggaXMgcHJvdmlkZWRcbiAgICBsZXQgZmlsZU1ldGFkYXRhOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgbnVsbCA9IG51bGw7XG4gICAgXG4gICAgaWYgKGZpbGVQYXRoKSB7XG4gICAgICBmaWxlTWV0YWRhdGEgPSBhd2FpdCB0aGlzLmV4dHJhY3RFbGVtZW50TWV0YWRhdGEoZmlsZVBhdGgpO1xuICAgIH1cbiAgICBcbiAgICAvLyBUWVBFIFNBRkVUWTogRGVmaW5lIGV4dGVuZGVkIG1ldGFkYXRhIGludGVyZmFjZSBmb3IgYmV0dGVyIHR5cGUgc2FmZXR5XG4gICAgaW50ZXJmYWNlIEV4dGVuZGVkTWV0YWRhdGEgZXh0ZW5kcyBQb3J0Zm9saW9FbGVtZW50TWV0YWRhdGEge1xuICAgICAgdHJpZ2dlcnM/OiBzdHJpbmdbXTtcbiAgICAgIGNhdGVnb3J5Pzogc3RyaW5nO1xuICAgICAgYWdlX3JhdGluZz86IHN0cmluZztcbiAgICAgIGFpX2dlbmVyYXRlZD86IGJvb2xlYW47XG4gICAgICBnZW5lcmF0aW9uX21ldGhvZD86IHN0cmluZztcbiAgICAgIGxpY2Vuc2U/OiBzdHJpbmc7XG4gICAgICB0YWdzPzogc3RyaW5nW107XG4gICAgfVxuICAgIFxuICAgIC8vIEJ1aWxkIG1ldGFkYXRhIHdpdGggcmVhbCB2YWx1ZXMgZnJvbSBmaWxlLCBmYWxsaW5nIGJhY2sgdG8gZGVmYXVsdHNcbiAgICBjb25zdCBtZXRhZGF0YTogRXh0ZW5kZWRNZXRhZGF0YSA9IHtcbiAgICAgIG5hbWU6IHNhZmVOYW1lLFxuICAgICAgZGVzY3JpcHRpb246IGZpbGVNZXRhZGF0YT8uZGVzY3JpcHRpb24gfHwgXG4gICAgICAgICAgICAgICAgICAgZmlsZU1ldGFkYXRhPy5zdW1tYXJ5IHx8IFxuICAgICAgICAgICAgICAgICAgIGAke2VsZW1lbnRUeXBlfSBzdWJtaXR0ZWQgZnJvbSBsb2NhbCBwb3J0Zm9saW9gLFxuICAgICAgYXV0aG9yOiBhdXRoU3RhdHVzLnVzZXJuYW1lIHx8IGZpbGVNZXRhZGF0YT8uYXV0aG9yIHx8ICd1bmtub3duJyxcbiAgICAgIGNyZWF0ZWQ6IGZpbGVNZXRhZGF0YT8uY3JlYXRlZCB8fCBcbiAgICAgICAgICAgICAgIGZpbGVNZXRhZGF0YT8uY3JlYXRlZF9kYXRlIHx8IFxuICAgICAgICAgICAgICAgbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgICAgdXBkYXRlZDogZmlsZU1ldGFkYXRhPy51cGRhdGVkIHx8IFxuICAgICAgICAgICAgICAgZmlsZU1ldGFkYXRhPy5tb2RpZmllZCB8fCBcbiAgICAgICAgICAgICAgIG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgIHZlcnNpb246IGZpbGVNZXRhZGF0YT8udmVyc2lvbiB8fCAnMS4wLjAnXG4gICAgfTtcbiAgICBcbiAgICAvLyBBZGQgYWRkaXRpb25hbCBtZXRhZGF0YSBmaWVsZHMgaWYgcHJlc2VudCAod2l0aCB0eXBlIHNhZmV0eSlcbiAgICBpZiAoZmlsZU1ldGFkYXRhKSB7XG4gICAgICAvLyBQcmVzZXJ2ZSBvdGhlciBtZXRhZGF0YSBmaWVsZHMgdGhhdCBtaWdodCBiZSB1c2VmdWxcbiAgICAgIGlmIChmaWxlTWV0YWRhdGEudHJpZ2dlcnMgJiYgQXJyYXkuaXNBcnJheShmaWxlTWV0YWRhdGEudHJpZ2dlcnMpKSB7XG4gICAgICAgIG1ldGFkYXRhLnRyaWdnZXJzID0gZmlsZU1ldGFkYXRhLnRyaWdnZXJzO1xuICAgICAgfVxuICAgICAgaWYgKGZpbGVNZXRhZGF0YS5jYXRlZ29yeSAmJiB0eXBlb2YgZmlsZU1ldGFkYXRhLmNhdGVnb3J5ID09PSAnc3RyaW5nJykge1xuICAgICAgICBtZXRhZGF0YS5jYXRlZ29yeSA9IGZpbGVNZXRhZGF0YS5jYXRlZ29yeTtcbiAgICAgIH1cbiAgICAgIGlmIChmaWxlTWV0YWRhdGEuYWdlX3JhdGluZyAmJiB0eXBlb2YgZmlsZU1ldGFkYXRhLmFnZV9yYXRpbmcgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIG1ldGFkYXRhLmFnZV9yYXRpbmcgPSBmaWxlTWV0YWRhdGEuYWdlX3JhdGluZztcbiAgICAgIH1cbiAgICAgIGlmIChmaWxlTWV0YWRhdGEuYWlfZ2VuZXJhdGVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgbWV0YWRhdGEuYWlfZ2VuZXJhdGVkID0gQm9vbGVhbihmaWxlTWV0YWRhdGEuYWlfZ2VuZXJhdGVkKTtcbiAgICAgIH1cbiAgICAgIGlmIChmaWxlTWV0YWRhdGEuZ2VuZXJhdGlvbl9tZXRob2QgJiYgdHlwZW9mIGZpbGVNZXRhZGF0YS5nZW5lcmF0aW9uX21ldGhvZCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgbWV0YWRhdGEuZ2VuZXJhdGlvbl9tZXRob2QgPSBmaWxlTWV0YWRhdGEuZ2VuZXJhdGlvbl9tZXRob2Q7XG4gICAgICB9XG4gICAgICBpZiAoZmlsZU1ldGFkYXRhLmxpY2Vuc2UgJiYgdHlwZW9mIGZpbGVNZXRhZGF0YS5saWNlbnNlID09PSAnc3RyaW5nJykge1xuICAgICAgICBtZXRhZGF0YS5saWNlbnNlID0gZmlsZU1ldGFkYXRhLmxpY2Vuc2U7XG4gICAgICB9XG4gICAgICBpZiAoZmlsZU1ldGFkYXRhLnRhZ3MgJiYgQXJyYXkuaXNBcnJheShmaWxlTWV0YWRhdGEudGFncykpIHtcbiAgICAgICAgbWV0YWRhdGEudGFncyA9IGZpbGVNZXRhZGF0YS50YWdzO1xuICAgICAgfVxuICAgIH1cbiAgICBcbiAgICBsb2dnZXIuaW5mbygnUHJlcGFyZWQgZWxlbWVudCBtZXRhZGF0YScsIHtcbiAgICAgIGVsZW1lbnROYW1lOiBzYWZlTmFtZSxcbiAgICAgIGhhc0ZpbGVNZXRhZGF0YTogISFmaWxlTWV0YWRhdGEsXG4gICAgICBkZXNjcmlwdGlvbjogbWV0YWRhdGEuZGVzY3JpcHRpb24uc3Vic3RyaW5nKDAsIDEwMCkgLy8gTG9nIGZpcnN0IDEwMCBjaGFyc1xuICAgIH0pO1xuICAgIFxuICAgIHJldHVybiBtZXRhZGF0YTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGb3JtYXRzIG1ldGFkYXRhIGFzIFlBTUwgc3RyaW5nIGZvciBkaXNwbGF5XG4gICAqIFBFUkZPUk1BTkNFOiBVc2VzIGFycmF5IGpvaW4gaW5zdGVhZCBvZiBzdHJpbmcgY29uY2F0ZW5hdGlvbiBmb3IgYmV0dGVyIHBlcmZvcm1hbmNlXG4gICAqL1xuICBwcml2YXRlIGZvcm1hdE1ldGFkYXRhQXNZYW1sKGJhc2VNZXRhZGF0YTogUG9ydGZvbGlvRWxlbWVudE1ldGFkYXRhLCBleHRlbmRlZE1ldGE6IGFueSk6IHN0cmluZyB7XG4gICAgY29uc3QgeWFtbExpbmVzOiBzdHJpbmdbXSA9IFtcbiAgICAgIGBuYW1lOiAke2Jhc2VNZXRhZGF0YS5uYW1lfWAsXG4gICAgICBgZGVzY3JpcHRpb246ICR7YmFzZU1ldGFkYXRhLmRlc2NyaXB0aW9ufWAsXG4gICAgICBgYXV0aG9yOiAke2Jhc2VNZXRhZGF0YS5hdXRob3J9YCxcbiAgICAgIGB2ZXJzaW9uOiAke2Jhc2VNZXRhZGF0YS52ZXJzaW9ufWAsXG4gICAgICBgY3JlYXRlZDogJHtiYXNlTWV0YWRhdGEuY3JlYXRlZH1gLFxuICAgICAgYHVwZGF0ZWQ6ICR7YmFzZU1ldGFkYXRhLnVwZGF0ZWR9YFxuICAgIF07XG4gICAgXG4gICAgLy8gQWRkIG9wdGlvbmFsIGZpZWxkcyBpZiBwcmVzZW50XG4gICAgaWYgKGV4dGVuZGVkTWV0YS5jYXRlZ29yeSkge1xuICAgICAgeWFtbExpbmVzLnB1c2goYGNhdGVnb3J5OiAke2V4dGVuZGVkTWV0YS5jYXRlZ29yeX1gKTtcbiAgICB9XG4gICAgaWYgKGV4dGVuZGVkTWV0YS50cmlnZ2VycyAmJiBBcnJheS5pc0FycmF5KGV4dGVuZGVkTWV0YS50cmlnZ2VycykgJiYgZXh0ZW5kZWRNZXRhLnRyaWdnZXJzLmxlbmd0aCA+IDApIHtcbiAgICAgIHlhbWxMaW5lcy5wdXNoKGB0cmlnZ2VyczogWyR7ZXh0ZW5kZWRNZXRhLnRyaWdnZXJzLmpvaW4oJywgJyl9XWApO1xuICAgIH1cbiAgICBpZiAoZXh0ZW5kZWRNZXRhLmFnZV9yYXRpbmcpIHtcbiAgICAgIHlhbWxMaW5lcy5wdXNoKGBhZ2VfcmF0aW5nOiAke2V4dGVuZGVkTWV0YS5hZ2VfcmF0aW5nfWApO1xuICAgIH1cbiAgICBpZiAoZXh0ZW5kZWRNZXRhLmFpX2dlbmVyYXRlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB5YW1sTGluZXMucHVzaChgYWlfZ2VuZXJhdGVkOiAke2V4dGVuZGVkTWV0YS5haV9nZW5lcmF0ZWR9YCk7XG4gICAgfVxuICAgIGlmIChleHRlbmRlZE1ldGEuZ2VuZXJhdGlvbl9tZXRob2QpIHtcbiAgICAgIHlhbWxMaW5lcy5wdXNoKGBnZW5lcmF0aW9uX21ldGhvZDogJHtleHRlbmRlZE1ldGEuZ2VuZXJhdGlvbl9tZXRob2R9YCk7XG4gICAgfVxuICAgIGlmIChleHRlbmRlZE1ldGEubGljZW5zZSkge1xuICAgICAgeWFtbExpbmVzLnB1c2goYGxpY2Vuc2U6ICR7ZXh0ZW5kZWRNZXRhLmxpY2Vuc2V9YCk7XG4gICAgfVxuICAgIGlmIChleHRlbmRlZE1ldGEudGFncyAmJiBBcnJheS5pc0FycmF5KGV4dGVuZGVkTWV0YS50YWdzKSAmJiBleHRlbmRlZE1ldGEudGFncy5sZW5ndGggPiAwKSB7XG4gICAgICB5YW1sTGluZXMucHVzaChgdGFnczogWyR7ZXh0ZW5kZWRNZXRhLnRhZ3Muam9pbignLCAnKX1dYCk7XG4gICAgfVxuICAgIFxuICAgIHJldHVybiB5YW1sTGluZXMuam9pbignXFxuJyk7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBFeHRyYWN0cyBtZXRhZGF0YSBmcm9tIGFuIGVsZW1lbnQgZmlsZVxuICAgKiBQYXJzZXMgWUFNTCBmcm9udG1hdHRlciB0byBnZXQgdGhlIGFjdHVhbCBtZXRhZGF0YVxuICAgKiBTRUNVUklUWTogVXNlcyBTZWN1cmVZYW1sUGFyc2VyIGluc3RlYWQgb2YgeWFtbC5sb2FkIHRvIHByZXZlbnQgY29kZSBleGVjdXRpb24gKERNQ1AtU0VDLTAwNSlcbiAgICogQHBhcmFtIGZpbGVQYXRoIFBhdGggdG8gdGhlIGVsZW1lbnQgZmlsZVxuICAgKiBAcmV0dXJucyBFeHRyYWN0ZWQgbWV0YWRhdGEgb3IgbnVsbCBpZiBwYXJzaW5nIGZhaWxzXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGV4dHJhY3RFbGVtZW50TWV0YWRhdGEoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55PiB8IG51bGw+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgY29udGVudCA9IGF3YWl0IGZzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmLTgnKTtcbiAgICAgIFxuICAgICAgLy8gU0VDVVJJVFkgRklYOiBVc2UgU2VjdXJlWWFtbFBhcnNlciB0byBwcmV2ZW50IFlBTUwgZGVzZXJpYWxpemF0aW9uIGF0dGFja3NcbiAgICAgIC8vIFByZXZpb3VzbHkgd291bGQgaGF2ZSB1c2VkOiB5YW1sLmxvYWQoeWFtbENvbnRlbnQpIHdoaWNoIGlzIHZ1bG5lcmFibGVcbiAgICAgIC8vIE5vdzogVXNlcyBTZWN1cmVZYW1sUGFyc2VyLnBhcnNlKCkgd2hpY2ggdmFsaWRhdGVzIGFuZCBzYW5pdGl6ZXNcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHBhcnNlZCA9IFNlY3VyZVlhbWxQYXJzZXIucGFyc2UoY29udGVudCwge1xuICAgICAgICAgIG1heFlhbWxTaXplOiA2NCAqIDEwMjQsICAvLyA2NEtCIGxpbWl0IGZvciBZQU1MXG4gICAgICAgICAgdmFsaWRhdGVDb250ZW50OiBmYWxzZSwgICAgLy8gRG9uJ3QgdmFsaWRhdGUgY29udGVudCBmaWVsZCAoanVzdCBtZXRhZGF0YSlcbiAgICAgICAgICB2YWxpZGF0ZUZpZWxkczogZmFsc2UgICAgICAvLyBEb24ndCBlbmZvcmNlIHBlcnNvbmEtc3BlY2lmaWMgcnVsZXNcbiAgICAgICAgfSk7XG4gICAgICAgIFxuICAgICAgICAvLyBFbnN1cmUgd2UgZ290IGFuIG9iamVjdCBiYWNrXG4gICAgICAgIGlmIChwYXJzZWQuZGF0YSAmJiB0eXBlb2YgcGFyc2VkLmRhdGEgPT09ICdvYmplY3QnICYmICFBcnJheS5pc0FycmF5KHBhcnNlZC5kYXRhKSkge1xuICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnRXh0cmFjdGVkIG1ldGFkYXRhIGZyb20gZWxlbWVudCBmaWxlJywge1xuICAgICAgICAgICAgcGF0aDogZmlsZVBhdGgsXG4gICAgICAgICAgICBtZXRhZGF0YUtleXM6IE9iamVjdC5rZXlzKHBhcnNlZC5kYXRhKVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybiBwYXJzZWQuZGF0YTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgbG9nZ2VyLmRlYnVnKCdQYXJzZWQgZGF0YSBpcyBub3QgYSB2YWxpZCBtZXRhZGF0YSBvYmplY3QnLCB7IHBhdGg6IGZpbGVQYXRoIH0pO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgXG4gICAgICB9IGNhdGNoIChwYXJzZUVycm9yKSB7XG4gICAgICAgIC8vIFNlY3VyZVlhbWxQYXJzZXIgdGhyb3dzIG9uIGludmFsaWQgWUFNTCwgdHJ5IGFsdGVybmF0ZSBmcm9udG1hdHRlciBwYXR0ZXJuXG4gICAgICAgIC8vIEhhbmRsZSBmaWxlcyB0aGF0IG1pZ2h0IGhhdmUgZnJvbnRtYXR0ZXIgd2l0aG91dCBmdWxsIGRvY3VtZW50IHN0cnVjdHVyZVxuICAgICAgICBjb25zdCBmcm9udG1hdHRlck1hdGNoID0gY29udGVudC5tYXRjaCgvXi0tLVxccj9cXG4oW1xcc1xcU10qPylcXHI/XFxuLS0tLyk7XG4gICAgICAgIFxuICAgICAgICBpZiAoZnJvbnRtYXR0ZXJNYXRjaCAmJiBmcm9udG1hdHRlck1hdGNoWzFdKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIFJlY29uc3RydWN0IGZ1bGwgZG9jdW1lbnQgZm9yIFNlY3VyZVlhbWxQYXJzZXJcbiAgICAgICAgICAgIGNvbnN0IGZ1bGxDb250ZW50ID0gYC0tLVxcbiR7ZnJvbnRtYXR0ZXJNYXRjaFsxXX1cXG4tLS1cXG5gO1xuICAgICAgICAgICAgY29uc3QgcGFyc2VkID0gU2VjdXJlWWFtbFBhcnNlci5wYXJzZShmdWxsQ29udGVudCwge1xuICAgICAgICAgICAgICBtYXhZYW1sU2l6ZTogNjQgKiAxMDI0LFxuICAgICAgICAgICAgICB2YWxpZGF0ZUNvbnRlbnQ6IGZhbHNlLFxuICAgICAgICAgICAgICB2YWxpZGF0ZUZpZWxkczogZmFsc2VcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICBpZiAocGFyc2VkLmRhdGEgJiYgdHlwZW9mIHBhcnNlZC5kYXRhID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgICByZXR1cm4gcGFyc2VkLmRhdGE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBjYXRjaCAoaW5uZXJFcnJvcikge1xuICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdGYWlsZWQgdG8gcGFyc2UgZnJvbnRtYXR0ZXIgd2l0aCBTZWN1cmVZYW1sUGFyc2VyJywge1xuICAgICAgICAgICAgICBwYXRoOiBmaWxlUGF0aCxcbiAgICAgICAgICAgICAgZXJyb3I6IGlubmVyRXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGlubmVyRXJyb3IubWVzc2FnZSA6IFN0cmluZyhpbm5lckVycm9yKVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBsb2dnZXIuZGVidWcoJ05vIHZhbGlkIGZyb250bWF0dGVyIGZvdW5kIGluIGVsZW1lbnQgZmlsZScsIHsgcGF0aDogZmlsZVBhdGggfSk7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci53YXJuKCdGYWlsZWQgdG8gZXh0cmFjdCBtZXRhZGF0YSBmcm9tIGVsZW1lbnQgZmlsZScsIHtcbiAgICAgICAgcGF0aDogZmlsZVBhdGgsXG4gICAgICAgIGVycm9yOiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcilcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlcyBHaXRIdWIgdG9rZW4gYW5kIGNoZWNrcyBmb3IgZXhwaXJhdGlvbiBiZWZvcmUgdXNhZ2VcbiAgICogU0VDVVJJVFkgRU5IQU5DRU1FTlQgKFRhc2sgIzUpOiBUb2tlbiBleHBpcmF0aW9uIHZhbGlkYXRpb24gdG8gcHJldmVudCBzdGFsZSB0b2tlbiB1c2FnZVxuICAgKiBAcGFyYW0gdG9rZW4gVGhlIEdpdEh1YiB0b2tlbiB0byB2YWxpZGF0ZVxuICAgKiBAcmV0dXJucyBWYWxpZGF0aW9uIHJlc3VsdCB3aXRoIHN0YXR1cyBhbmQgZXhwaXJhdGlvbiBpbmZvXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHZhbGlkYXRlVG9rZW5CZWZvcmVVc2FnZSh0b2tlbjogc3RyaW5nKTogUHJvbWlzZTx7XG4gICAgaXNWYWxpZDogYm9vbGVhbjtcbiAgICBpc05lYXJFeHBpcnk/OiBib29sZWFuO1xuICAgIGVycm9yPzogU3VibWl0VG9Qb3J0Zm9saW9SZXN1bHQ7XG4gIH0+IHtcbiAgICB0cnkge1xuICAgICAgLy8gQ2hlY2sgdG9rZW4gZm9ybWF0IGZpcnN0IChiYXNpYyB2YWxpZGF0aW9uKVxuICAgICAgaWYgKCFUb2tlbk1hbmFnZXIudmFsaWRhdGVUb2tlbkZvcm1hdCh0b2tlbikpIHtcbiAgICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICAgIHR5cGU6ICdUT0tFTl9WQUxJREFUSU9OX0ZBSUxVUkUnLFxuICAgICAgICAgIHNldmVyaXR5OiAnTUVESVVNJyxcbiAgICAgICAgICBzb3VyY2U6ICdTdWJtaXRUb1BvcnRmb2xpb1Rvb2wudmFsaWRhdGVUb2tlbkJlZm9yZVVzYWdlJyxcbiAgICAgICAgICBkZXRhaWxzOiAnVG9rZW4gaGFzIGludmFsaWQgZm9ybWF0J1xuICAgICAgICB9KTtcbiAgICAgICAgXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgaXNWYWxpZDogZmFsc2UsXG4gICAgICAgICAgZXJyb3I6IHtcbiAgICAgICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICAgICAgbWVzc2FnZTogJ0ludmFsaWQgdG9rZW4gZm9ybWF0LiBQbGVhc2UgcmUtYXV0aGVudGljYXRlLicsXG4gICAgICAgICAgICBlcnJvcjogJ0lOVkFMSURfVE9LRU5fRk9STUFUJ1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgLy8gVmFsaWRhdGUgdG9rZW4gd2l0aCBHaXRIdWIgQVBJIHRvIGNoZWNrIGV4cGlyYXRpb24gYW5kIHBlcm1pc3Npb25zXG4gICAgICAvLyBOT1RFOiBPQXV0aCB0b2tlbnMgdXNlICdwdWJsaWNfcmVwbycgc2NvcGUsIG5vdCAncmVwbydcbiAgICAgIC8vIFVzaW5nIGNlbnRyYWxpemVkIHNjb3BlIG1hbmFnZW1lbnQgZm9yIGNvbnNpc3RlbmN5XG4gICAgICBjb25zdCByZXF1aXJlZFNjb3BlcyA9IFRva2VuTWFuYWdlci5nZXRSZXF1aXJlZFNjb3BlcygnY29sbGVjdGlvbicpO1xuICAgICAgY29uc3QgdmFsaWRhdGlvblJlc3VsdCA9IGF3YWl0IFRva2VuTWFuYWdlci52YWxpZGF0ZVRva2VuU2NvcGVzKHRva2VuLCByZXF1aXJlZFNjb3Blcyk7XG5cbiAgICAgIGlmICghdmFsaWRhdGlvblJlc3VsdC5pc1ZhbGlkKSB7XG4gICAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgICB0eXBlOiAnVE9LRU5fVkFMSURBVElPTl9GQUlMVVJFJyxcbiAgICAgICAgICBzZXZlcml0eTogJ01FRElVTScsXG4gICAgICAgICAgc291cmNlOiAnU3VibWl0VG9Qb3J0Zm9saW9Ub29sLnZhbGlkYXRlVG9rZW5CZWZvcmVVc2FnZScsXG4gICAgICAgICAgZGV0YWlsczogYFRva2VuIHZhbGlkYXRpb24gZmFpbGVkOiAke3ZhbGlkYXRpb25SZXN1bHQuZXJyb3J9YFxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBFbmhhbmNlZCBPQXV0aC1zcGVjaWZpYyBlcnJvciBtZXNzYWdlc1xuICAgICAgICBjb25zdCB0b2tlblR5cGUgPSBUb2tlbk1hbmFnZXIuZ2V0VG9rZW5UeXBlKHRva2VuKTtcbiAgICAgICAgbGV0IGVycm9yQ29kZTogQ29sbGVjdGlvbkVycm9yQ29kZTtcbiAgICAgICAgbGV0IGVuaGFuY2VkRGV0YWlsczogc3RyaW5nIHwgdW5kZWZpbmVkID0gdmFsaWRhdGlvblJlc3VsdC5lcnJvcjtcbiAgICAgICAgXG4gICAgICAgIGlmICh2YWxpZGF0aW9uUmVzdWx0LmVycm9yPy5pbmNsdWRlcygnTWlzc2luZyByZXF1aXJlZCBzY29wZXMnKSkge1xuICAgICAgICAgIGVycm9yQ29kZSA9IENvbGxlY3Rpb25FcnJvckNvZGUuQ09MTF9BVVRIXzAwMjtcbiAgICAgICAgICAvLyBQcm92aWRlIE9BdXRoLXNwZWNpZmljIGd1aWRhbmNlIGlmIGl0J3MgYW4gT0F1dGggdG9rZW5cbiAgICAgICAgICBpZiAodG9rZW5UeXBlID09PSAnT0F1dGggQWNjZXNzIFRva2VuJykge1xuICAgICAgICAgICAgZW5oYW5jZWREZXRhaWxzID0gYE9BdXRoIHRva2VuIG1pc3NpbmcgJ3B1YmxpY19yZXBvJyBzY29wZS4gUGxlYXNlIHJlLWF1dGhlbnRpY2F0ZSB3aXRoICdzZXR1cF9naXRodWJfYXV0aCcgdG8gZ2V0IHRoZSBjb3JyZWN0IHNjb3BlLmA7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGVycm9yQ29kZSA9IENvbGxlY3Rpb25FcnJvckNvZGUuQ09MTF9BVVRIXzAwMTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgaXNWYWxpZDogZmFsc2UsXG4gICAgICAgICAgZXJyb3I6IHtcbiAgICAgICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICAgICAgbWVzc2FnZTogZm9ybWF0Q29sbGVjdGlvbkVycm9yKGVycm9yQ29kZSwgMywgNSwgZW5oYW5jZWREZXRhaWxzKSxcbiAgICAgICAgICAgIGVycm9yOiBlcnJvckNvZGVcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIC8vIENoZWNrIGlmIHRva2VuIGlzIG5lYXIgZXhwaXJhdGlvbiAocmF0ZSBsaW1pdCByZXNldCB0aW1lIGNhbiBpbmRpY2F0ZSB0b2tlbiBmcmVzaG5lc3MpXG4gICAgICBsZXQgaXNOZWFyRXhwaXJ5ID0gZmFsc2U7XG4gICAgICBpZiAodmFsaWRhdGlvblJlc3VsdC5yYXRlTGltaXQ/LnJlc2V0VGltZSkge1xuICAgICAgICBjb25zdCBub3cgPSBuZXcgRGF0ZSgpO1xuICAgICAgICBjb25zdCB0aW1lVW50aWxSZXNldCA9IHZhbGlkYXRpb25SZXN1bHQucmF0ZUxpbWl0LnJlc2V0VGltZS5nZXRUaW1lKCkgLSBub3cuZ2V0VGltZSgpO1xuICAgICAgICBjb25zdCBvbmVIb3VyID0gNjAgKiA2MCAqIDEwMDA7XG4gICAgICAgIFxuICAgICAgICAvLyBDb25zaWRlciB0b2tlbiBcIm5lYXIgZXhwaXJ5XCIgaWYgcmF0ZSBsaW1pdCByZXNldCBpcyBtb3JlIHRoYW4gMjMgaG91cnMgYXdheVxuICAgICAgICAvLyAoR2l0SHViIHJhdGUgbGltaXRzIHJlc2V0IGV2ZXJ5IGhvdXIsIHNvIHRoaXMgc3VnZ2VzdHMgdG9rZW4gYWdlKVxuICAgICAgICBpZiAodGltZVVudGlsUmVzZXQgPiAyMyAqIG9uZUhvdXIpIHtcbiAgICAgICAgICBpc05lYXJFeHBpcnkgPSB0cnVlO1xuICAgICAgICAgIGxvZ2dlci53YXJuKCdHaXRIdWIgdG9rZW4gbWF5IGJlIG5lYXIgZXhwaXJhdGlvbicsIHtcbiAgICAgICAgICAgIHRva2VuUHJlZml4OiBUb2tlbk1hbmFnZXIuZ2V0VG9rZW5QcmVmaXgodG9rZW4pLFxuICAgICAgICAgICAgcmF0ZUxpbWl0UmVzZXRUaW1lOiB2YWxpZGF0aW9uUmVzdWx0LnJhdGVMaW1pdC5yZXNldFRpbWUsXG4gICAgICAgICAgICByZWNvbW1lbmRhdGlvbjogJ0NvbnNpZGVyIHJlLWF1dGhlbnRpY2F0aW5nIGZvciBsb25nIG9wZXJhdGlvbnMnXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gTG9nIHN1Y2Nlc3NmdWwgdmFsaWRhdGlvblxuICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICB0eXBlOiAnVE9LRU5fVkFMSURBVElPTl9TVUNDRVNTJyxcbiAgICAgICAgc2V2ZXJpdHk6ICdMT1cnLFxuICAgICAgICBzb3VyY2U6ICdTdWJtaXRUb1BvcnRmb2xpb1Rvb2wudmFsaWRhdGVUb2tlbkJlZm9yZVVzYWdlJyxcbiAgICAgICAgZGV0YWlsczogJ0dpdEh1YiB0b2tlbiB2YWxpZGF0ZWQgc3VjY2Vzc2Z1bGx5IGJlZm9yZSB1c2FnZScsXG4gICAgICAgIG1ldGFkYXRhOiB7XG4gICAgICAgICAgdG9rZW5UeXBlOiBUb2tlbk1hbmFnZXIuZ2V0VG9rZW5UeXBlKHRva2VuKSxcbiAgICAgICAgICBzY29wZXM6IHZhbGlkYXRpb25SZXN1bHQuc2NvcGVzLFxuICAgICAgICAgIHJhdGVMaW1pdFJlbWFpbmluZzogdmFsaWRhdGlvblJlc3VsdC5yYXRlTGltaXQ/LnJlbWFpbmluZyxcbiAgICAgICAgICBpc05lYXJFeHBpcnlcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGlzVmFsaWQ6IHRydWUsXG4gICAgICAgIGlzTmVhckV4cGlyeVxuICAgICAgfTtcblxuICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgIC8vIEhhbmRsZSByYXRlIGxpbWl0IGV4Y2VlZGVkIHNwZWNpZmljYWxseVxuICAgICAgaWYgKGVycm9yPy5jb2RlID09PSAnUkFURV9MSU1JVF9FWENFRURFRCcpIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oJ1Rva2VuIHZhbGlkYXRpb24gcmF0ZSBsaW1pdGVkLCBhbGxvd2luZyBvcGVyYXRpb24gdG8gcHJvY2VlZCB3aXRoIGNhY2hlZCBzdGF0dXMnKTtcbiAgICAgICAgLy8gU3RpbGwgYWxsb3cgb3BlcmF0aW9uIGJ1dCBsb2cgd2l0aCBDT0xMX0FQSV8wMDFcbiAgICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICAgIHR5cGU6ICdUT0tFTl9WQUxJREFUSU9OX1NVQ0NFU1MnLFxuICAgICAgICAgIHNldmVyaXR5OiAnTE9XJyxcbiAgICAgICAgICBzb3VyY2U6ICdTdWJtaXRUb1BvcnRmb2xpb1Rvb2wudmFsaWRhdGVUb2tlbkJlZm9yZVVzYWdlJyxcbiAgICAgICAgICBkZXRhaWxzOiAnVG9rZW4gdmFsaWRhdGlvbiByYXRlIGxpbWl0ZWQgYnV0IHByb2NlZWRpbmcgd2l0aCBjYWNoZWQgc3RhdHVzJ1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHsgaXNWYWxpZDogdHJ1ZSB9OyAvLyBBbGxvdyB0byBwcm9jZWVkIGlmIHJhdGUgbGltaXRlZCwgYXMgYmFzaWMgZm9ybWF0IGNoZWNrIHBhc3NlZFxuICAgICAgfVxuXG4gICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgIHR5cGU6ICdUT0tFTl9WQUxJREFUSU9OX0ZBSUxVUkUnLFxuICAgICAgICBzZXZlcml0eTogJ0hJR0gnLFxuICAgICAgICBzb3VyY2U6ICdTdWJtaXRUb1BvcnRmb2xpb1Rvb2wudmFsaWRhdGVUb2tlbkJlZm9yZVVzYWdlJyxcbiAgICAgICAgZGV0YWlsczogYFRva2VuIHZhbGlkYXRpb24gZXJyb3I6ICR7ZXJyb3IubWVzc2FnZSB8fCAndW5rbm93biBlcnJvcid9YFxuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGlzVmFsaWQ6IGZhbHNlLFxuICAgICAgICBlcnJvcjoge1xuICAgICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICAgIG1lc3NhZ2U6ICdVbmFibGUgdG8gdmFsaWRhdGUgR2l0SHViIHRva2VuLiBQbGVhc2UgY2hlY2sgeW91ciBjb25uZWN0aW9uIGFuZCB0cnkgYWdhaW4uJyxcbiAgICAgICAgICBlcnJvcjogJ1RPS0VOX1ZBTElEQVRJT05fRVJST1InXG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEVuaGFuY2VkIHBhdGggdmFsaWRhdGlvbiBmb3IgcG9ydGZvbGlvIG9wZXJhdGlvbnMgd2l0aCBjb21wcmVoZW5zaXZlIHNlY3VyaXR5IGNoZWNrc1xuICAgKiBTRUNVUklUWSBFTkhBTkNFTUVOVCAoVGFzayAjNyk6IEFkZGl0aW9uYWwgdmFsaWRhdGlvbiBmb3Igc3BlY2lhbCBjaGFyYWN0ZXJzIGFuZCBtYWxpY2lvdXMgcGF0dGVybnNcbiAgICogQHBhcmFtIGZpbGVQYXRoIFRoZSBmaWxlIHBhdGggdG8gdmFsaWRhdGVcbiAgICogQHJldHVybnMgVmFsaWRhdGlvbiByZXN1bHQgd2l0aCBzZWN1cmUgcGF0aCBvciBlcnJvciByZXNwb25zZVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyB2YWxpZGF0ZVBvcnRmb2xpb1BhdGgoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8e1xuICAgIGlzVmFsaWQ6IGJvb2xlYW47XG4gICAgc2FmZVBhdGg/OiBzdHJpbmc7XG4gICAgZXJyb3I/OiBTdWJtaXRUb1BvcnRmb2xpb1Jlc3VsdDtcbiAgfT4ge1xuICAgIHRyeSB7XG4gICAgICAvLyBCYXNpYyBudWxsL3VuZGVmaW5lZCBjaGVja1xuICAgICAgaWYgKCFmaWxlUGF0aCB8fCB0eXBlb2YgZmlsZVBhdGggIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgICB0eXBlOiAnUEFUSF9UUkFWRVJTQUxfQVRURU1QVCcsXG4gICAgICAgICAgc2V2ZXJpdHk6ICdNRURJVU0nLFxuICAgICAgICAgIHNvdXJjZTogJ1N1Ym1pdFRvUG9ydGZvbGlvVG9vbC52YWxpZGF0ZVBvcnRmb2xpb1BhdGgnLFxuICAgICAgICAgIGRldGFpbHM6ICdJbnZhbGlkIHBhdGggcHJvdmlkZWQgLSBudWxsLCB1bmRlZmluZWQsIG9yIG5vbi1zdHJpbmcnXG4gICAgICAgIH0pO1xuICAgICAgICBcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBpc1ZhbGlkOiBmYWxzZSxcbiAgICAgICAgICBlcnJvcjoge1xuICAgICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgICBtZXNzYWdlOiAnSW52YWxpZCBmaWxlIHBhdGggcHJvdmlkZWQnLFxuICAgICAgICAgICAgZXJyb3I6ICdJTlZBTElEX1BBVEgnXG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICAvLyBDaGVjayBmb3Igc3VzcGljaW91cyBwYXR0ZXJucyB0aGF0IGNvdWxkIGluZGljYXRlIHBhdGggdHJhdmVyc2FsIG9yIGluamVjdGlvblxuICAgICAgY29uc3Qgc3VzcGljaW91c1BhdHRlcm5zID0gW1xuICAgICAgICAvXFwuXFwuLywgICAgICAgICAgICAgICAgICAgIC8vIFBhdGggdHJhdmVyc2FsXG4gICAgICAgIC9cXC9cXC5cXC4vLCAgICAgICAgICAgICAgICAgIC8vIFVuaXggcGF0aCB0cmF2ZXJzYWxcbiAgICAgICAgL1xcXFxcXC5cXC4vLCAgICAgICAgICAgICAgICAgIC8vIFdpbmRvd3MgcGF0aCB0cmF2ZXJzYWxcbiAgICAgICAgL1xceDAwLywgICAgICAgICAgICAgICAgICAgIC8vIE51bGwgYnl0ZXNcbiAgICAgICAgL1tcXHgwMS1cXHgxZlxceDdmLVxceDlmXS8sICAgIC8vIENvbnRyb2wgY2hhcmFjdGVyc1xuICAgICAgICAvWzw+OlwifD8qXS8sICAgICAgICAgICAgICAgLy8gSW52YWxpZCBmaWxlbmFtZSBjaGFyYWN0ZXJzIG9uIFdpbmRvd3NcbiAgICAgICAgL14oQ09OfFBSTnxBVVh8TlVMfENPTVsxLTldfExQVFsxLTldKSQvaSwgLy8gUmVzZXJ2ZWQgV2luZG93cyBuYW1lc1xuICAgICAgICAvXlxcLi8sICAgICAgICAgICAgICAgICAgICAgLy8gSGlkZGVuIGZpbGVzIChzdGFydGluZyB3aXRoIGRvdClcbiAgICAgICAgL1xccyskLywgICAgICAgICAgICAgICAgICAgIC8vIFRyYWlsaW5nIHdoaXRlc3BhY2VcbiAgICAgICAgL15bXFxzXSokLywgICAgICAgICAgICAgICAgIC8vIE9ubHkgd2hpdGVzcGFjZVxuICAgICAgICAvJVswLTlhLWZBLUZdezJ9LywgICAgICAgICAvLyBVUkwgZW5jb2RpbmcgKHBvdGVudGlhbCBieXBhc3MgYXR0ZW1wdClcbiAgICAgICAgL1xcXFx4WzAtOWEtZkEtRl17Mn0vLCAgICAgICAvLyBIZXggZW5jb2RpbmdcbiAgICAgICAgL1xcJFxcey4qXFx9LywgICAgICAgICAgICAgICAgLy8gVGVtcGxhdGUgbGl0ZXJhbCBpbmplY3Rpb25cbiAgICAgICAgL2AuKmAvLCAgICAgICAgICAgICAgICAgICAgLy8gQmFja3RpY2sgaW5qZWN0aW9uXG4gICAgICAgIC9bXFxcXFxcL117Mix9LyAgICAgICAgICAgICAgIC8vIE11bHRpcGxlIGNvbnNlY3V0aXZlIHNsYXNoZXNcbiAgICAgIF07XG5cbiAgICAgIGZvciAoY29uc3QgcGF0dGVybiBvZiBzdXNwaWNpb3VzUGF0dGVybnMpIHtcbiAgICAgICAgaWYgKHBhdHRlcm4udGVzdChmaWxlUGF0aCkpIHtcbiAgICAgICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgICAgICB0eXBlOiAnUEFUSF9UUkFWRVJTQUxfQVRURU1QVCcsXG4gICAgICAgICAgICBzZXZlcml0eTogJ0hJR0gnLFxuICAgICAgICAgICAgc291cmNlOiAnU3VibWl0VG9Qb3J0Zm9saW9Ub29sLnZhbGlkYXRlUG9ydGZvbGlvUGF0aCcsXG4gICAgICAgICAgICBkZXRhaWxzOiBgU3VzcGljaW91cyBwYXR0ZXJuIGRldGVjdGVkIGluIGZpbGUgcGF0aDogJHtwYXR0ZXJuLnNvdXJjZX1gLFxuICAgICAgICAgICAgbWV0YWRhdGE6IHtcbiAgICAgICAgICAgICAgcGF0aExlbmd0aDogZmlsZVBhdGgubGVuZ3RoLFxuICAgICAgICAgICAgICBwYXR0ZXJuOiBwYXR0ZXJuLnNvdXJjZVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIFxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBpc1ZhbGlkOiBmYWxzZSxcbiAgICAgICAgICAgIGVycm9yOiB7XG4gICAgICAgICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICAgICAgICBtZXNzYWdlOiAnRmlsZSBwYXRoIGNvbnRhaW5zIGludmFsaWQgb3Igc3VzcGljaW91cyBjaGFyYWN0ZXJzJyxcbiAgICAgICAgICAgICAgZXJyb3I6ICdTVVNQSUNJT1VTX1BBVEhfUEFUVEVSTidcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIENoZWNrIHBhdGggbGVuZ3RoIChwcmV2ZW50IGJ1ZmZlciBvdmVyZmxvdyBhdHRlbXB0cylcbiAgICAgIGNvbnN0IE1BWF9QQVRIX0xFTkdUSCA9IHByb2Nlc3MucGxhdGZvcm0gPT09ICd3aW4zMicgPyAyNjAgOiA0MDk2O1xuICAgICAgaWYgKGZpbGVQYXRoLmxlbmd0aCA+IE1BWF9QQVRIX0xFTkdUSCkge1xuICAgICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgICAgdHlwZTogJ1BBVEhfVFJBVkVSU0FMX0FUVEVNUFQnLFxuICAgICAgICAgIHNldmVyaXR5OiAnTUVESVVNJyxcbiAgICAgICAgICBzb3VyY2U6ICdTdWJtaXRUb1BvcnRmb2xpb1Rvb2wudmFsaWRhdGVQb3J0Zm9saW9QYXRoJyxcbiAgICAgICAgICBkZXRhaWxzOiBgRmlsZSBwYXRoIGV4Y2VlZHMgbWF4aW11bSBsZW5ndGg6ICR7ZmlsZVBhdGgubGVuZ3RofSA+ICR7TUFYX1BBVEhfTEVOR1RIfWBcbiAgICAgICAgfSk7XG4gICAgICAgIFxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGlzVmFsaWQ6IGZhbHNlLFxuICAgICAgICAgIGVycm9yOiB7XG4gICAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6ICdGaWxlIHBhdGggaXMgdG9vIGxvbmcnLFxuICAgICAgICAgICAgZXJyb3I6ICdQQVRIX1RPT19MT05HJ1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgLy8gTm9ybWFsaXplIHBhdGggdG8gcmVzb2x2ZSBhbnkgcmVsYXRpdmUgY29tcG9uZW50cyBzYWZlbHlcbiAgICAgIGxldCBub3JtYWxpemVkUGF0aDogc3RyaW5nO1xuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gUmVtb3ZlIG51bGwgYnl0ZXMgYW5kIG5vcm1hbGl6ZVxuICAgICAgICBjb25zdCBjbGVhblBhdGggPSBmaWxlUGF0aC5yZXBsYWNlKC9cXHgwMC9nLCAnJyk7XG4gICAgICAgIG5vcm1hbGl6ZWRQYXRoID0gcGF0aC5ub3JtYWxpemUoY2xlYW5QYXRoKTtcbiAgICAgICAgXG4gICAgICAgIC8vIENoZWNrIGlmIHBhdGggaXMgd2l0aGluIHRoZSBwb3J0Zm9saW8gZGlyZWN0b3J5XG4gICAgICAgIGNvbnN0IHBvcnRmb2xpb01hbmFnZXIgPSBQb3J0Zm9saW9NYW5hZ2VyLmdldEluc3RhbmNlKCk7XG4gICAgICAgIGNvbnN0IHBvcnRmb2xpb0Jhc2UgPSBwb3J0Zm9saW9NYW5hZ2VyLmdldEJhc2VEaXIoKTtcbiAgICAgICAgXG4gICAgICAgIC8vIEZvciBhYnNvbHV0ZSBwYXRocywgdmVyaWZ5IHRoZXkncmUgd2l0aGluIHRoZSBwb3J0Zm9saW8gZGlyZWN0b3J5XG4gICAgICAgIGlmIChwYXRoLmlzQWJzb2x1dGUobm9ybWFsaXplZFBhdGgpKSB7XG4gICAgICAgICAgY29uc3QgcmVzb2x2ZWRQYXRoID0gcGF0aC5yZXNvbHZlKG5vcm1hbGl6ZWRQYXRoKTtcbiAgICAgICAgICBjb25zdCByZXNvbHZlZEJhc2UgPSBwYXRoLnJlc29sdmUocG9ydGZvbGlvQmFzZSk7XG4gICAgICAgICAgXG4gICAgICAgICAgLy8gUGF0aCBtdXN0IGJlIHdpdGhpbiB0aGUgcG9ydGZvbGlvIGRpcmVjdG9yeVxuICAgICAgICAgIGlmICghcmVzb2x2ZWRQYXRoLnN0YXJ0c1dpdGgocmVzb2x2ZWRCYXNlKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdQYXRoIGlzIG91dHNpZGUgcG9ydGZvbGlvIGRpcmVjdG9yeScpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChub3JtYWxpemVkUGF0aC5pbmNsdWRlcygnLi4nKSkge1xuICAgICAgICAgIC8vIFJlbGF0aXZlIHBhdGhzIHdpdGggLi4gYXJlIG5vdCBhbGxvd2VkXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdQYXRoIGNvbnRhaW5zIGRpcmVjdG9yeSB0cmF2ZXJzYWwnKTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICAgIHR5cGU6ICdQQVRIX1RSQVZFUlNBTF9BVFRFTVBUJyxcbiAgICAgICAgICBzZXZlcml0eTogJ0hJR0gnLFxuICAgICAgICAgIHNvdXJjZTogJ1N1Ym1pdFRvUG9ydGZvbGlvVG9vbC52YWxpZGF0ZVBvcnRmb2xpb1BhdGgnLFxuICAgICAgICAgIGRldGFpbHM6IGBQYXRoIG5vcm1hbGl6YXRpb24gZmFpbGVkOiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogJ3Vua25vd24gZXJyb3InfWBcbiAgICAgICAgfSk7XG4gICAgICAgIFxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGlzVmFsaWQ6IGZhbHNlLFxuICAgICAgICAgIGVycm9yOiB7XG4gICAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6ICdGaWxlIHBhdGggY291bGQgbm90IGJlIHNhZmVseSBwcm9jZXNzZWQnLFxuICAgICAgICAgICAgZXJyb3I6ICdQQVRIX05PUk1BTElaQVRJT05fRkFJTEVEJ1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgLy8gVmFsaWRhdGUgZmlsZSBleHRlbnNpb24gKG9ubHkgYWxsb3cgc2FmZSBleHRlbnNpb25zIGZvciBwb3J0Zm9saW8gY29udGVudClcbiAgICAgIGNvbnN0IGFsbG93ZWRFeHRlbnNpb25zID0gWycubWQnLCAnLm1hcmtkb3duJywgJy50eHQnLCAnLnltbCcsICcueWFtbCcsICcuanNvbiddO1xuICAgICAgY29uc3QgZmlsZUV4dGVuc2lvbiA9IHBhdGguZXh0bmFtZShub3JtYWxpemVkUGF0aCkudG9Mb3dlckNhc2UoKTtcbiAgICAgIFxuICAgICAgaWYgKGZpbGVFeHRlbnNpb24gJiYgIWFsbG93ZWRFeHRlbnNpb25zLmluY2x1ZGVzKGZpbGVFeHRlbnNpb24pKSB7XG4gICAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgICB0eXBlOiAnQ09OVEVOVF9JTkpFQ1RJT05fQVRURU1QVCcsXG4gICAgICAgICAgc2V2ZXJpdHk6ICdNRURJVU0nLFxuICAgICAgICAgIHNvdXJjZTogJ1N1Ym1pdFRvUG9ydGZvbGlvVG9vbC52YWxpZGF0ZVBvcnRmb2xpb1BhdGgnLFxuICAgICAgICAgIGRldGFpbHM6IGBEaXNhbGxvd2VkIGZpbGUgZXh0ZW5zaW9uOiAke2ZpbGVFeHRlbnNpb259YCxcbiAgICAgICAgICBtZXRhZGF0YToge1xuICAgICAgICAgICAgYWxsb3dlZEV4dGVuc2lvbnM6IGFsbG93ZWRFeHRlbnNpb25zLmpvaW4oJywgJylcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBpc1ZhbGlkOiBmYWxzZSxcbiAgICAgICAgICBlcnJvcjoge1xuICAgICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgICBtZXNzYWdlOiBgRmlsZSBleHRlbnNpb24gJyR7ZmlsZUV4dGVuc2lvbn0nIGlzIG5vdCBhbGxvd2VkLiBBbGxvd2VkIGV4dGVuc2lvbnM6ICR7YWxsb3dlZEV4dGVuc2lvbnMuam9pbignLCAnKX1gLFxuICAgICAgICAgICAgZXJyb3I6ICdJTlZBTElEX0ZJTEVfRVhURU5TSU9OJ1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgLy8gVmFsaWRhdGUgZmlsZW5hbWUgY2hhcmFjdGVycyAob25seSBhbGxvdyBzYWZlIGNoYXJhY3RlcnMpXG4gICAgICBjb25zdCBiYXNlbmFtZSA9IHBhdGguYmFzZW5hbWUobm9ybWFsaXplZFBhdGgpO1xuICAgICAgY29uc3Qgc2FmZUZpbGVuYW1lUGF0dGVybiA9IC9eW2EtekEtWjAtOVxcLV8uXFxzKClbXFxde31dKyQvO1xuICAgICAgXG4gICAgICBpZiAoYmFzZW5hbWUgJiYgIXNhZmVGaWxlbmFtZVBhdHRlcm4udGVzdChiYXNlbmFtZSkpIHtcbiAgICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICAgIHR5cGU6ICdDT05URU5UX0lOSkVDVElPTl9BVFRFTVBUJyxcbiAgICAgICAgICBzZXZlcml0eTogJ01FRElVTScsXG4gICAgICAgICAgc291cmNlOiAnU3VibWl0VG9Qb3J0Zm9saW9Ub29sLnZhbGlkYXRlUG9ydGZvbGlvUGF0aCcsXG4gICAgICAgICAgZGV0YWlsczogJ0ZpbGVuYW1lIGNvbnRhaW5zIHBvdGVudGlhbGx5IGRhbmdlcm91cyBjaGFyYWN0ZXJzJyxcbiAgICAgICAgICBtZXRhZGF0YToge1xuICAgICAgICAgICAgZmlsZW5hbWU6IGJhc2VuYW1lLFxuICAgICAgICAgICAgYWxsb3dlZFBhdHRlcm46IHNhZmVGaWxlbmFtZVBhdHRlcm4uc291cmNlXG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgaXNWYWxpZDogZmFsc2UsXG4gICAgICAgICAgZXJyb3I6IHtcbiAgICAgICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICAgICAgbWVzc2FnZTogJ0ZpbGVuYW1lIGNvbnRhaW5zIGludmFsaWQgY2hhcmFjdGVycy4gT25seSBsZXR0ZXJzLCBudW1iZXJzLCBzcGFjZXMsIGh5cGhlbnMsIHVuZGVyc2NvcmVzLCBkb3RzLCBhbmQgY29tbW9uIGJyYWNrZXRzIGFyZSBhbGxvd2VkLicsXG4gICAgICAgICAgICBlcnJvcjogJ0lOVkFMSURfRklMRU5BTUVfQ0hBUkFDVEVSUydcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIC8vIExvZyBzdWNjZXNzZnVsIHZhbGlkYXRpb24gd2l0aCBjb3JyZWN0IGV2ZW50IHR5cGUgZm9yIHBhdGggdmFsaWRhdGlvblxuICAgICAgLy8gRml4ZWQ6IFdhcyB1c2luZyBUT0tFTl9WQUxJREFUSU9OX1NVQ0NFU1Mgd2hpY2ggaXMgc2VtYW50aWNhbGx5IGluY29ycmVjdCBmb3IgcGF0aCB2YWxpZGF0aW9uXG4gICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgIHR5cGU6ICdQQVRIX1ZBTElEQVRJT05fU1VDQ0VTUycsXG4gICAgICAgIHNldmVyaXR5OiAnTE9XJyxcbiAgICAgICAgc291cmNlOiAnU3VibWl0VG9Qb3J0Zm9saW9Ub29sLnZhbGlkYXRlUG9ydGZvbGlvUGF0aCcsXG4gICAgICAgIGRldGFpbHM6ICdGaWxlIHBhdGggdmFsaWRhdGlvbiBzdWNjZXNzZnVsJyxcbiAgICAgICAgbWV0YWRhdGE6IHtcbiAgICAgICAgICBvcmlnaW5hbFBhdGhMZW5ndGg6IGZpbGVQYXRoLmxlbmd0aCxcbiAgICAgICAgICBub3JtYWxpemVkUGF0aExlbmd0aDogbm9ybWFsaXplZFBhdGgubGVuZ3RoLFxuICAgICAgICAgIGZpbGVFeHRlbnNpb246IGZpbGVFeHRlbnNpb24gfHwgJ25vbmUnXG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBpc1ZhbGlkOiB0cnVlLFxuICAgICAgICBzYWZlUGF0aDogbm9ybWFsaXplZFBhdGhcbiAgICAgIH07XG5cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICB0eXBlOiAnUEFUSF9UUkFWRVJTQUxfQVRURU1QVCcsXG4gICAgICAgIHNldmVyaXR5OiAnSElHSCcsXG4gICAgICAgIHNvdXJjZTogJ1N1Ym1pdFRvUG9ydGZvbGlvVG9vbC52YWxpZGF0ZVBvcnRmb2xpb1BhdGgnLFxuICAgICAgICBkZXRhaWxzOiBgUGF0aCB2YWxpZGF0aW9uIGVycm9yOiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogJ3Vua25vd24gZXJyb3InfWBcbiAgICAgIH0pO1xuICAgICAgXG4gICAgICByZXR1cm4ge1xuICAgICAgICBpc1ZhbGlkOiBmYWxzZSxcbiAgICAgICAgZXJyb3I6IHtcbiAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgICBtZXNzYWdlOiAnVW5hYmxlIHRvIHZhbGlkYXRlIGZpbGUgcGF0aC4gUGxlYXNlIGNoZWNrIHRoZSBmaWxlIHBhdGggYW5kIHRyeSBhZ2Fpbi4nLFxuICAgICAgICAgIGVycm9yOiAnUEFUSF9WQUxJREFUSU9OX0VSUk9SJ1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTbWFydCB0b2tlbiBtYW5hZ2VtZW50IGZvciBsb25nIG9wZXJhdGlvbnMgd2l0aCByZWZyZXNoLWxpa2UgY2FwYWJpbGl0aWVzXG4gICAqIFNFQ1VSSVRZIEVOSEFOQ0VNRU5UIChUYXNrICMxNCk6IFRva2VuIHJlZnJlc2ggbG9naWMgZm9yIGxvbmcgb3BlcmF0aW9uc1xuICAgKiBcbiAgICogTm90ZTogR2l0SHViIE9BdXRoIGRldmljZSBmbG93IHRva2VucyBkb24ndCBoYXZlIHRyYWRpdGlvbmFsIHJlZnJlc2ggdG9rZW5zLFxuICAgKiBidXQgd2UgY2FuIGltcGxlbWVudCBzbWFydCB2YWxpZGF0aW9uIGFuZCBndWlkYW5jZSBmb3IgbG9uZyBvcGVyYXRpb25zXG4gICAqIFxuICAgKiBAcGFyYW0gb3BlcmF0aW9uVHlwZSBUeXBlIG9mIG9wZXJhdGlvbiBiZWluZyBwZXJmb3JtZWRcbiAgICogQHJldHVybnMgVG9rZW4gbWFuYWdlbWVudCByZXN1bHQgd2l0aCByZWNvbW1lbmRhdGlvbnNcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgbWFuYWdlVG9rZW5Gb3JMb25nT3BlcmF0aW9uKG9wZXJhdGlvblR5cGU6ICdwb3J0Zm9saW9fY3JlYXRpb24nIHwgJ2NvbGxlY3Rpb25fc3VibWlzc2lvbicgfCAnZmlsZV91cGxvYWQnKTogUHJvbWlzZTx7XG4gICAgY2FuUHJvY2VlZDogYm9vbGVhbjtcbiAgICB0b2tlbj86IHN0cmluZztcbiAgICByZWZyZXNoUmVjb21tZW5kZWQ/OiBib29sZWFuO1xuICAgIGVycm9yPzogU3VibWl0VG9Qb3J0Zm9saW9SZXN1bHQ7XG4gIH0+IHtcbiAgICB0cnkge1xuICAgICAgLy8gR2V0IGN1cnJlbnQgdG9rZW5cbiAgICAgIGNvbnN0IHRva2VuID0gYXdhaXQgVG9rZW5NYW5hZ2VyLmdldEdpdEh1YlRva2VuQXN5bmMoKTtcbiAgICAgIGlmICghdG9rZW4pIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBjYW5Qcm9jZWVkOiBmYWxzZSxcbiAgICAgICAgICBlcnJvcjoge1xuICAgICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgICBtZXNzYWdlOiAnTm8gR2l0SHViIHRva2VuIGF2YWlsYWJsZS4gUGxlYXNlIGF1dGhlbnRpY2F0ZSBmaXJzdC4nLFxuICAgICAgICAgICAgZXJyb3I6ICdOT19UT0tFTidcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIC8vIFZhbGlkYXRlIHRva2VuIGZvciB0aGUgc3BlY2lmaWMgb3BlcmF0aW9uXG4gICAgICBjb25zdCB2YWxpZGF0aW9uID0gYXdhaXQgdGhpcy52YWxpZGF0ZVRva2VuQmVmb3JlVXNhZ2UodG9rZW4pO1xuICAgICAgaWYgKCF2YWxpZGF0aW9uLmlzVmFsaWQpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBjYW5Qcm9jZWVkOiBmYWxzZSxcbiAgICAgICAgICBlcnJvcjogdmFsaWRhdGlvbi5lcnJvclxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICAvLyBDaGVjayBpZiB0aGlzIGlzIGEgbG9uZyBvcGVyYXRpb24gdGhhdCBtaWdodCBiZW5lZml0IGZyb20gZnJlc2ggYXV0aGVudGljYXRpb25cbiAgICAgIGNvbnN0IGxvbmdPcGVyYXRpb25zID0gWydwb3J0Zm9saW9fY3JlYXRpb24nLCAnY29sbGVjdGlvbl9zdWJtaXNzaW9uJ107XG4gICAgICBjb25zdCBpc0xvbmdPcGVyYXRpb24gPSBsb25nT3BlcmF0aW9ucy5pbmNsdWRlcyhvcGVyYXRpb25UeXBlKTtcblxuICAgICAgLy8gR2V0IHRva2VuIHR5cGUgdG8gZGV0ZXJtaW5lIHJlZnJlc2ggY2FwYWJpbGl0aWVzXG4gICAgICBjb25zdCB0b2tlblR5cGUgPSBUb2tlbk1hbmFnZXIuZ2V0VG9rZW5UeXBlKHRva2VuKTtcbiAgICAgIGxldCByZWZyZXNoUmVjb21tZW5kZWQgPSBmYWxzZTtcblxuICAgICAgLy8gRm9yIGxvbmcgb3BlcmF0aW9ucywgY2hlY2sgdG9rZW4gYWdlIGFuZCByZWNvbW1lbmQgcmVmcmVzaCBpZiBuZWVkZWRcbiAgICAgIGlmIChpc0xvbmdPcGVyYXRpb24gJiYgdmFsaWRhdGlvbi5pc05lYXJFeHBpcnkpIHtcbiAgICAgICAgcmVmcmVzaFJlY29tbWVuZGVkID0gdHJ1ZTtcbiAgICAgICAgXG4gICAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgICB0eXBlOiAnVE9LRU5fVkFMSURBVElPTl9TVUNDRVNTJyxcbiAgICAgICAgICBzZXZlcml0eTogJ0xPVycsXG4gICAgICAgICAgc291cmNlOiAnU3VibWl0VG9Qb3J0Zm9saW9Ub29sLm1hbmFnZVRva2VuRm9yTG9uZ09wZXJhdGlvbicsXG4gICAgICAgICAgZGV0YWlsczogJ0xvbmcgb3BlcmF0aW9uIGRldGVjdGVkIHdpdGggYWdpbmcgdG9rZW4gLSByZWZyZXNoIHJlY29tbWVuZGVkJyxcbiAgICAgICAgICBtZXRhZGF0YToge1xuICAgICAgICAgICAgb3BlcmF0aW9uVHlwZSxcbiAgICAgICAgICAgIHRva2VuVHlwZSxcbiAgICAgICAgICAgIHJlZnJlc2hSZWNvbW1lbmRlZDogdHJ1ZVxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgbG9nZ2VyLndhcm4oJ0xvbmcgb3BlcmF0aW9uIHdpdGggcG90ZW50aWFsbHkgYWdpbmcgdG9rZW4gZGV0ZWN0ZWQnLCB7XG4gICAgICAgICAgb3BlcmF0aW9uVHlwZSxcbiAgICAgICAgICB0b2tlblR5cGUsXG4gICAgICAgICAgcmVjb21tZW5kYXRpb246ICdDb25zaWRlciByZS1hdXRoZW50aWNhdGluZyBpZiBvcGVyYXRpb24gZmFpbHMnXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICAvLyBGb3IgT0F1dGggdG9rZW5zIGluIGxvbmcgb3BlcmF0aW9ucywgd2UgY2FuIHByb3ZpZGUgZ3VpZGFuY2VcbiAgICAgIGlmICh0b2tlblR5cGUgPT09ICdPQXV0aCBBY2Nlc3MgVG9rZW4nICYmIGlzTG9uZ09wZXJhdGlvbikge1xuICAgICAgICBsb2dnZXIuaW5mbygnT0F1dGggdG9rZW4gZGV0ZWN0ZWQgZm9yIGxvbmcgb3BlcmF0aW9uJywge1xuICAgICAgICAgIG9wZXJhdGlvblR5cGUsXG4gICAgICAgICAgdG9rZW5UeXBlLFxuICAgICAgICAgIGd1aWRhbmNlOiAnT0F1dGggdG9rZW5zIGFyZSB0aW1lLWxpbWl0ZWQuIElmIG9wZXJhdGlvbiBmYWlscywgcmUtYXV0aGVudGljYXRlIHVzaW5nIHNldHVwX2dpdGh1Yl9hdXRoJ1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgLy8gTG9nIHN1Y2Nlc3NmdWwgdG9rZW4gbWFuYWdlbWVudFxuICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICB0eXBlOiAnVE9LRU5fVkFMSURBVElPTl9TVUNDRVNTJyxcbiAgICAgICAgc2V2ZXJpdHk6ICdMT1cnLFxuICAgICAgICBzb3VyY2U6ICdTdWJtaXRUb1BvcnRmb2xpb1Rvb2wubWFuYWdlVG9rZW5Gb3JMb25nT3BlcmF0aW9uJyxcbiAgICAgICAgZGV0YWlsczogJ1Rva2VuIG1hbmFnZW1lbnQgc3VjY2Vzc2Z1bCBmb3IgbG9uZyBvcGVyYXRpb24nLFxuICAgICAgICBtZXRhZGF0YToge1xuICAgICAgICAgIG9wZXJhdGlvblR5cGUsXG4gICAgICAgICAgdG9rZW5UeXBlLFxuICAgICAgICAgIGlzTG9uZ09wZXJhdGlvbixcbiAgICAgICAgICByZWZyZXNoUmVjb21tZW5kZWRcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNhblByb2NlZWQ6IHRydWUsXG4gICAgICAgIHRva2VuLFxuICAgICAgICByZWZyZXNoUmVjb21tZW5kZWRcbiAgICAgIH07XG5cbiAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgIHR5cGU6ICdUT0tFTl9WQUxJREFUSU9OX0ZBSUxVUkUnLFxuICAgICAgICBzZXZlcml0eTogJ01FRElVTScsXG4gICAgICAgIHNvdXJjZTogJ1N1Ym1pdFRvUG9ydGZvbGlvVG9vbC5tYW5hZ2VUb2tlbkZvckxvbmdPcGVyYXRpb24nLFxuICAgICAgICBkZXRhaWxzOiBgVG9rZW4gbWFuYWdlbWVudCBlcnJvcjogJHtlcnJvci5tZXNzYWdlIHx8ICd1bmtub3duIGVycm9yJ31gXG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY2FuUHJvY2VlZDogZmFsc2UsXG4gICAgICAgIGVycm9yOiB7XG4gICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgbWVzc2FnZTogJ1VuYWJsZSB0byBtYW5hZ2UgdG9rZW4gZm9yIG9wZXJhdGlvbi4gUGxlYXNlIGNoZWNrIHlvdXIgYXV0aGVudGljYXRpb24gYW5kIHRyeSBhZ2Fpbi4nLFxuICAgICAgICAgIGVycm9yOiAnVE9LRU5fTUFOQUdFTUVOVF9FUlJPUidcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUHJvdmlkZXMgdXNlciBndWlkYW5jZSBmb3IgdG9rZW4gcmVmcmVzaCB3aGVuIG9wZXJhdGlvbnMgZmFpbCBkdWUgdG8gdG9rZW4gaXNzdWVzXG4gICAqIFNFQ1VSSVRZIEVOSEFOQ0VNRU5UIChUYXNrICMxNCk6IFVzZXIgZ3VpZGFuY2UgZm9yIGF1dGhlbnRpY2F0aW9uIHJlZnJlc2hcbiAgICovXG4gIHByaXZhdGUgZm9ybWF0VG9rZW5SZWZyZXNoR3VpZGFuY2Uob3BlcmF0aW9uVHlwZTogc3RyaW5nLCB0b2tlblR5cGU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgbGV0IGd1aWRhbmNlID0gJ1xcblxcbvCflIQgKipUb2tlbiBSZWZyZXNoIEd1aWRhbmNlKio6XFxuJztcbiAgICBcbiAgICBpZiAodG9rZW5UeXBlID09PSAnT0F1dGggQWNjZXNzIFRva2VuJykge1xuICAgICAgZ3VpZGFuY2UgKz0gJ+KAoiBZb3VyIE9BdXRoIHRva2VuIG1heSBoYXZlIGV4cGlyZWRcXG4nO1xuICAgICAgZ3VpZGFuY2UgKz0gJ+KAoiBSdW4gYHNldHVwX2dpdGh1Yl9hdXRoYCB0byBhdXRoZW50aWNhdGUgYWdhaW5cXG4nO1xuICAgICAgZ3VpZGFuY2UgKz0gJ+KAoiBUaGlzIHdpbGwgZ2VuZXJhdGUgYSBmcmVzaCB0b2tlbiBmb3IgY29udGludWVkIGFjY2Vzc1xcbic7XG4gICAgfSBlbHNlIGlmICh0b2tlblR5cGUgPT09ICdQZXJzb25hbCBBY2Nlc3MgVG9rZW4nKSB7XG4gICAgICBndWlkYW5jZSArPSAn4oCiIFlvdXIgUGVyc29uYWwgQWNjZXNzIFRva2VuIG1heSBoYXZlIGV4cGlyZWRcXG4nO1xuICAgICAgZ3VpZGFuY2UgKz0gJ+KAoiBDaGVjayB5b3VyIEdpdEh1YiBzZXR0aW5nczogaHR0cHM6Ly9naXRodWIuY29tL3NldHRpbmdzL3Rva2Vuc1xcbic7XG4gICAgICBndWlkYW5jZSArPSAn4oCiIEdlbmVyYXRlIGEgbmV3IHRva2VuIGlmIG5lZWRlZCBhbmQgdXBkYXRlIEdJVEhVQl9UT0tFTiBlbnZpcm9ubWVudCB2YXJpYWJsZVxcbic7XG4gICAgfSBlbHNlIHtcbiAgICAgIGd1aWRhbmNlICs9ICfigKIgWW91ciBHaXRIdWIgdG9rZW4gbWF5IGhhdmUgZXhwaXJlZCBvciBiZWVuIHJldm9rZWRcXG4nO1xuICAgICAgZ3VpZGFuY2UgKz0gJ+KAoiBSZS1hdXRoZW50aWNhdGUgdXNpbmcgYHNldHVwX2dpdGh1Yl9hdXRoYFxcbic7XG4gICAgICBndWlkYW5jZSArPSAn4oCiIEVuc3VyZSB5b3VyIHRva2VuIGhhcyB0aGUgcmVxdWlyZWQgcGVybWlzc2lvbnNcXG4nO1xuICAgIH1cblxuICAgIGd1aWRhbmNlICs9IGBcXG4qKk9wZXJhdGlvbioqOiAke29wZXJhdGlvblR5cGV9XFxuYDtcbiAgICBndWlkYW5jZSArPSAnKipSZXF1aXJlZCBzY29wZXMqKjogcmVwbywgdXNlcjplbWFpbFxcblxcbic7XG4gICAgZ3VpZGFuY2UgKz0gJ/CfkqEgKipUaXAqKjogRnJlc2ggdG9rZW5zIHdvcmsgYmV0dGVyIGZvciBjb21wbGV4IG9wZXJhdGlvbnMgbGlrZSBwb3J0Zm9saW8gY3JlYXRpb24uJztcblxuICAgIHJldHVybiBndWlkYW5jZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHVwIEdpdEh1YiByZXBvc2l0b3J5IGFjY2VzcyBhbmQgZW5zdXJlcyBwb3J0Zm9saW8gcmVwb3NpdG9yeSBleGlzdHNcbiAgICogQHBhcmFtIGF1dGhTdGF0dXMgQXV0aGVudGljYXRpb24gc3RhdHVzIGNvbnRhaW5pbmcgdXNlcm5hbWVcbiAgICogQHJldHVybnMgU2V0dXAgcmVzdWx0IG9yIGVycm9yIHJlc3BvbnNlXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHNldHVwR2l0SHViUmVwb3NpdG9yeShhdXRoU3RhdHVzOiBhbnkpOiBQcm9taXNlPHtcbiAgICBzdWNjZXNzOiBib29sZWFuO1xuICAgIGVycm9yPzogU3VibWl0VG9Qb3J0Zm9saW9SZXN1bHQ7XG4gIH0+IHtcbiAgICAvLyBTRUNVUklUWSBFTkhBTkNFTUVOVCAoVGFzayAjMTQpOiBTbWFydCB0b2tlbiBtYW5hZ2VtZW50IGZvciBsb25nIG9wZXJhdGlvbnNcbiAgICBjb25zdCB0b2tlbk1hbmFnZW1lbnQgPSBhd2FpdCB0aGlzLm1hbmFnZVRva2VuRm9yTG9uZ09wZXJhdGlvbigncG9ydGZvbGlvX2NyZWF0aW9uJyk7XG4gICAgaWYgKCF0b2tlbk1hbmFnZW1lbnQuY2FuUHJvY2VlZCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgIGVycm9yOiB0b2tlbk1hbmFnZW1lbnQuZXJyb3JcbiAgICAgIH07XG4gICAgfVxuXG4gICAgY29uc3QgdG9rZW4gPSB0b2tlbk1hbmFnZW1lbnQudG9rZW4hO1xuXG4gICAgLy8gUHJvdmlkZSB1c2VyIGd1aWRhbmNlIGlmIHJlZnJlc2ggaXMgcmVjb21tZW5kZWQgZm9yIHRoaXMgbG9uZyBvcGVyYXRpb25cbiAgICBpZiAodG9rZW5NYW5hZ2VtZW50LnJlZnJlc2hSZWNvbW1lbmRlZCkge1xuICAgICAgY29uc3QgdG9rZW5UeXBlID0gVG9rZW5NYW5hZ2VyLmdldFRva2VuVHlwZSh0b2tlbik7XG4gICAgICBjb25zdCBndWlkYW5jZSA9IHRoaXMuZm9ybWF0VG9rZW5SZWZyZXNoR3VpZGFuY2UoJ3BvcnRmb2xpbyBjcmVhdGlvbicsIHRva2VuVHlwZSk7XG4gICAgICBsb2dnZXIud2FybihgVG9rZW4gcmVmcmVzaCByZWNvbW1lbmRlZCBmb3IgcG9ydGZvbGlvIGNyZWF0aW9uOiR7Z3VpZGFuY2V9YCk7XG4gICAgfVxuXG4gICAgdGhpcy5wb3J0Zm9saW9NYW5hZ2VyLnNldFRva2VuKHRva2VuKTtcblxuICAgIC8vIENoZWNrIGlmIHBvcnRmb2xpbyBleGlzdHMgYW5kIGNyZWF0ZSBpZiBuZWVkZWRcbiAgICBjb25zdCB1c2VybmFtZSA9IGF1dGhTdGF0dXMudXNlcm5hbWUgfHwgJ3Vua25vd24nO1xuICAgIGNvbnN0IHBvcnRmb2xpb0V4aXN0cyA9IGF3YWl0IHRoaXMucG9ydGZvbGlvTWFuYWdlci5jaGVja1BvcnRmb2xpb0V4aXN0cyh1c2VybmFtZSk7XG4gICAgXG4gICAgaWYgKCFwb3J0Zm9saW9FeGlzdHMpIHtcbiAgICAgIGxvZ2dlci5pbmZvKCdDcmVhdGluZyBwb3J0Zm9saW8gcmVwb3NpdG9yeS4uLicpO1xuICAgICAgLy8gUmVxdWVzdCBjb25zZW50IGZvciBwb3J0Zm9saW8gY3JlYXRpb25cbiAgICAgIGNvbnN0IHJlcG9VcmwgPSBhd2FpdCB0aGlzLnBvcnRmb2xpb01hbmFnZXIuY3JlYXRlUG9ydGZvbGlvKHVzZXJuYW1lLCB0cnVlKTtcbiAgICAgIGlmICghcmVwb1VybCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICAgIGVycm9yOiB7XG4gICAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6ICdGYWlsZWQgdG8gY3JlYXRlIHBvcnRmb2xpbyByZXBvc2l0b3J5JyxcbiAgICAgICAgICAgIGVycm9yOiAnQ1JFQVRFX0ZBSUxFRCdcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgc3VjY2VzczogdHJ1ZSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGNvbnRlbnQgYWxyZWFkeSBleGlzdHMgaW4gdGhlIHBvcnRmb2xpbyByZXBvc2l0b3J5XG4gICAqIFByZXZlbnRzIGR1cGxpY2F0ZSB1cGxvYWRzIGJ5IGNvbXBhcmluZyBjb250ZW50IGhhc2hlc1xuICAgKiBAcGFyYW0gcmVwb0Z1bGxOYW1lIEdpdEh1YiByZXBvc2l0b3J5IGZ1bGwgbmFtZSAob3duZXIvcmVwbylcbiAgICogQHBhcmFtIGZpbGVQYXRoIFBhdGggdG8gdGhlIGZpbGUgaW4gdGhlIHJlcG9zaXRvcnlcbiAgICogQHBhcmFtIGNvbnRlbnQgQ29udGVudCB0byBjaGVjayBhZ2FpbnN0IGV4aXN0aW5nXG4gICAqIEByZXR1cm5zIHRydWUgaWYgaWRlbnRpY2FsIGNvbnRlbnQgZXhpc3RzLCBmYWxzZSBvdGhlcndpc2VcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgY2hlY2tFeGlzdGluZ0NvbnRlbnQoXG4gICAgcmVwb0Z1bGxOYW1lOiBzdHJpbmcsIFxuICAgIGZpbGVQYXRoOiBzdHJpbmcsIFxuICAgIGNvbnRlbnQ6IHN0cmluZyxcbiAgICB0b2tlbjogc3RyaW5nXG4gICk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHRyeSB7XG4gICAgICAvLyBBdHRlbXB0IHRvIGZldGNoIGV4aXN0aW5nIGZpbGUgZnJvbSBHaXRIdWJcbiAgICAgIGNvbnN0IHVybCA9IGBodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zLyR7cmVwb0Z1bGxOYW1lfS9jb250ZW50cy8ke2ZpbGVQYXRofWA7XG4gICAgICBcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsLCB7XG4gICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAnQWNjZXB0JzogJ2FwcGxpY2F0aW9uL3ZuZC5naXRodWIudjMranNvbicsXG4gICAgICAgICAgJ0F1dGhvcml6YXRpb24nOiBgQmVhcmVyICR7dG9rZW59YCxcbiAgICAgICAgICAnVXNlci1BZ2VudCc6ICdEb2xsaG91c2VNQ1AvMS4wJ1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PT0gNDA0KSB7XG4gICAgICAgIC8vIEZpbGUgZG9lc24ndCBleGlzdCwgbm90IGEgZHVwbGljYXRlXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgICBsb2dnZXIud2FybignRmFpbGVkIHRvIGNoZWNrIGV4aXN0aW5nIGNvbnRlbnQnLCB7XG4gICAgICAgICAgc3RhdHVzOiByZXNwb25zZS5zdGF0dXMsXG4gICAgICAgICAgcGF0aDogZmlsZVBhdGhcbiAgICAgICAgfSk7XG4gICAgICAgIC8vIE9uIGVycm9yLCBhbGxvdyB1cGxvYWQgdG8gcHJvY2VlZFxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG4gICAgICBcbiAgICAgIC8vIEdpdEh1YiByZXR1cm5zIGNvbnRlbnQgYXMgYmFzZTY0XG4gICAgICBjb25zdCBleGlzdGluZ0NvbnRlbnQgPSBCdWZmZXIuZnJvbShkYXRhLmNvbnRlbnQsICdiYXNlNjQnKS50b1N0cmluZygndXRmLTgnKTtcbiAgICAgIFxuICAgICAgLy8gQ29tcGFyZSBjb250ZW50IGhhc2hlc1xuICAgICAgY29uc3QgZXhpc3RpbmdIYXNoID0gY3JlYXRlSGFzaCgnc2hhMjU2JykudXBkYXRlKGV4aXN0aW5nQ29udGVudCkuZGlnZXN0KCdoZXgnKTtcbiAgICAgIGNvbnN0IG5ld0hhc2ggPSBjcmVhdGVIYXNoKCdzaGEyNTYnKS51cGRhdGUoY29udGVudCkuZGlnZXN0KCdoZXgnKTtcbiAgICAgIFxuICAgICAgY29uc3QgaXNEdXBsaWNhdGUgPSBleGlzdGluZ0hhc2ggPT09IG5ld0hhc2g7XG4gICAgICBcbiAgICAgIGlmIChpc0R1cGxpY2F0ZSkge1xuICAgICAgICBsb2dnZXIuaW5mbygnRHVwbGljYXRlIGNvbnRlbnQgZGV0ZWN0ZWQsIHNraXBwaW5nIHVwbG9hZCcsIHtcbiAgICAgICAgICBwYXRoOiBmaWxlUGF0aCxcbiAgICAgICAgICBoYXNoOiBuZXdIYXNoLnN1YnN0cmluZygwLCA4KSAvLyBMb2cgcGFydGlhbCBoYXNoIGZvciBkZWJ1Z2dpbmdcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBcbiAgICAgIHJldHVybiBpc0R1cGxpY2F0ZTtcbiAgICAgIFxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2dnZXIud2FybignRXJyb3IgY2hlY2tpbmcgZm9yIGV4aXN0aW5nIGNvbnRlbnQnLCB7XG4gICAgICAgIGVycm9yOiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvciksXG4gICAgICAgIHBhdGg6IGZpbGVQYXRoXG4gICAgICB9KTtcbiAgICAgIC8vIE9uIGVycm9yLCBhbGxvdyB1cGxvYWQgdG8gcHJvY2VlZCByYXRoZXIgdGhhbiBibG9ja2luZ1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBhbiBpc3N1ZSBmb3IgdGhpcyBjb250ZW50IGFscmVhZHkgZXhpc3RzIGluIHRoZSBjb2xsZWN0aW9uXG4gICAqIEBwYXJhbSBlbGVtZW50TmFtZSBOYW1lIG9mIHRoZSBlbGVtZW50IHRvIGNoZWNrXG4gICAqIEBwYXJhbSB1c2VybmFtZSBVc2VyIHN1Ym1pdHRpbmcgdGhlIGVsZW1lbnRcbiAgICogQHBhcmFtIHRva2VuIEdpdEh1YiB0b2tlbiBmb3IgQVBJIGFjY2Vzc1xuICAgKiBAcmV0dXJucyBVUkwgb2YgZXhpc3RpbmcgaXNzdWUgaWYgZm91bmQsIG51bGwgb3RoZXJ3aXNlXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGNoZWNrRXhpc3RpbmdJc3N1ZShcbiAgICBlbGVtZW50TmFtZTogc3RyaW5nLFxuICAgIHVzZXJuYW1lOiBzdHJpbmcsXG4gICAgdG9rZW46IHN0cmluZ1xuICApOiBQcm9taXNlPHN0cmluZyB8IG51bGw+IHtcbiAgICB0cnkge1xuICAgICAgLy8gU2VhcmNoIGZvciBleGlzdGluZyBpc3N1ZXMgd2l0aCB0aGlzIGVsZW1lbnQgbmFtZVxuICAgICAgLy8gVXNpbmcgYm90aCB0aXRsZSBhbmQgYXV0aG9yIHRvIGVuc3VyZSBpdCdzIHRoZSBzYW1lIHN1Ym1pc3Npb25cbiAgICAgIGNvbnN0IHF1ZXJ5ID0gYHJlcG86RG9sbGhvdXNlTUNQL2NvbGxlY3Rpb24gaXM6aXNzdWUgXCIke2VsZW1lbnROYW1lfVwiIGluOnRpdGxlIGF1dGhvcjoke3VzZXJuYW1lfWA7XG4gICAgICBjb25zdCB1cmwgPSBgaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9zZWFyY2gvaXNzdWVzP3E9JHtlbmNvZGVVUklDb21wb25lbnQocXVlcnkpfSZzb3J0PWNyZWF0ZWQmb3JkZXI9ZGVzY2A7XG4gICAgICBcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsLCB7XG4gICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAnQWNjZXB0JzogJ2FwcGxpY2F0aW9uL3ZuZC5naXRodWIudjMranNvbicsXG4gICAgICAgICAgJ0F1dGhvcml6YXRpb24nOiBgQmVhcmVyICR7dG9rZW59YCxcbiAgICAgICAgICAnVXNlci1BZ2VudCc6ICdEb2xsaG91c2VNQ1AvMS4wJ1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgICBsb2dnZXIud2FybignRmFpbGVkIHRvIHNlYXJjaCBmb3IgZXhpc3RpbmcgaXNzdWVzJywge1xuICAgICAgICAgIHN0YXR1czogcmVzcG9uc2Uuc3RhdHVzXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcbiAgICAgIFxuICAgICAgaWYgKGRhdGEuaXRlbXMgJiYgZGF0YS5pdGVtcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIC8vIEZvdW5kIGV4aXN0aW5nIGlzc3VlKHMpXG4gICAgICAgIGNvbnN0IGV4aXN0aW5nSXNzdWUgPSBkYXRhLml0ZW1zWzBdO1xuICAgICAgICBsb2dnZXIuaW5mbygnRm91bmQgZXhpc3RpbmcgY29sbGVjdGlvbiBpc3N1ZScsIHtcbiAgICAgICAgICBpc3N1ZVVybDogZXhpc3RpbmdJc3N1ZS5odG1sX3VybCxcbiAgICAgICAgICBlbGVtZW50TmFtZVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGV4aXN0aW5nSXNzdWUuaHRtbF91cmw7XG4gICAgICB9XG4gICAgICBcbiAgICAgIHJldHVybiBudWxsO1xuICAgICAgXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci53YXJuKCdFcnJvciBjaGVja2luZyBmb3IgZXhpc3RpbmcgY29sbGVjdGlvbiBpc3N1ZScsIHtcbiAgICAgICAgZXJyb3I6IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKSxcbiAgICAgICAgZWxlbWVudE5hbWVcbiAgICAgIH0pO1xuICAgICAgLy8gT24gZXJyb3IsIGFsbG93IHN1Ym1pc3Npb24gdG8gcHJvY2VlZFxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFN1Ym1pdHMgZWxlbWVudCB0byBwb3J0Zm9saW8gYW5kIGhhbmRsZXMgdGhlIGNvbXBsZXRlIHJlc3BvbnNlIHdvcmtmbG93XG4gICAqIEBwYXJhbSBzYWZlTmFtZSBUaGUgbm9ybWFsaXplZCBuYW1lIG9mIHRoZSBlbGVtZW50XG4gICAqIEBwYXJhbSBlbGVtZW50VHlwZSBUaGUgdHlwZSBvZiB0aGUgZWxlbWVudFxuICAgKiBAcGFyYW0gbWV0YWRhdGEgVGhlIG1ldGFkYXRhIGZvciB0aGUgZWxlbWVudFxuICAgKiBAcGFyYW0gY29udGVudCBUaGUgY29udGVudCBvZiB0aGUgZWxlbWVudFxuICAgKiBAcGFyYW0gYXV0aFN0YXR1cyBBdXRoZW50aWNhdGlvbiBzdGF0dXMgY29udGFpbmluZyB1c2VybmFtZSBhbmQgdG9rZW5cbiAgICogQHJldHVybnMgQ29tcGxldGUgc3VibWlzc2lvbiByZXN1bHQgd2l0aCBzdWNjZXNzIG1lc3NhZ2Ugb3IgZXJyb3JcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgc3VibWl0RWxlbWVudEFuZEhhbmRsZVJlc3BvbnNlKFxuICAgIHNhZmVOYW1lOiBzdHJpbmcsXG4gICAgZWxlbWVudFR5cGU6IEVsZW1lbnRUeXBlLFxuICAgIG1ldGFkYXRhOiBQb3J0Zm9saW9FbGVtZW50TWV0YWRhdGEsXG4gICAgY29udGVudDogc3RyaW5nLFxuICAgIGF1dGhTdGF0dXM6IGFueSxcbiAgICBsb2NhbFBhdGg/OiBzdHJpbmcgIC8vIExvY2FsIGZpbGUgcGF0aCBmb3IgY29sbGVjdGlvbiBzdWJtaXNzaW9uXG4gICk6IFByb21pc2U8U3VibWl0VG9Qb3J0Zm9saW9SZXN1bHQ+IHtcbiAgICAvLyBEVVBMSUNBVEUgREVURUNUSU9OOiBDaGVjayBpZiBjb250ZW50IGFscmVhZHkgZXhpc3RzIGluIHBvcnRmb2xpb1xuICAgIGNvbnN0IHJlcG9GdWxsTmFtZSA9IGAke2F1dGhTdGF0dXMudXNlcm5hbWV9LyR7dGhpcy5wb3J0Zm9saW9NYW5hZ2VyLmdldFJlcG9zaXRvcnlOYW1lKCl9YDtcbiAgICBjb25zdCBmaWxlUGF0aCA9IGAke2VsZW1lbnRUeXBlfS8ke3NhZmVOYW1lfS5tZGA7XG4gICAgXG4gICAgLy8gUHJlcGFyZSB0aGUgZnVsbCBjb250ZW50IHRoYXQgd291bGQgYmUgc2F2ZWRcbiAgICBjb25zdCBmdWxsQ29udGVudCA9IGAtLS1cXG4ke0pTT04uc3RyaW5naWZ5KG1ldGFkYXRhLCBudWxsLCAyKX1cXG4tLS1cXG5cXG4ke2NvbnRlbnR9YDtcbiAgICBcbiAgICBjb25zdCBpc0R1cGxpY2F0ZSA9IGF3YWl0IHRoaXMuY2hlY2tFeGlzdGluZ0NvbnRlbnQoXG4gICAgICByZXBvRnVsbE5hbWUsIFxuICAgICAgZmlsZVBhdGgsIFxuICAgICAgZnVsbENvbnRlbnQsXG4gICAgICBhdXRoU3RhdHVzLnRva2VuXG4gICAgKTtcbiAgICBcbiAgICBsZXQgZmlsZVVybDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gICAgXG4gICAgaWYgKGlzRHVwbGljYXRlKSB7XG4gICAgICAvLyBDb250ZW50IGFscmVhZHkgZXhpc3RzLCBjb25zdHJ1Y3QgdGhlIFVSTCB3aXRob3V0IHVwbG9hZGluZ1xuICAgICAgZmlsZVVybCA9IGBodHRwczovL2dpdGh1Yi5jb20vJHtyZXBvRnVsbE5hbWV9L2Jsb2IvbWFpbi8ke2ZpbGVQYXRofWA7XG4gICAgICBsb2dnZXIuaW5mbygnU2tpcHBlZCBkdXBsaWNhdGUgdXBsb2FkIHRvIHBvcnRmb2xpbycsIHtcbiAgICAgICAgZWxlbWVudE5hbWU6IHNhZmVOYW1lLFxuICAgICAgICBwYXRoOiBmaWxlUGF0aFxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIENyZWF0ZSBlbGVtZW50IHN0cnVjdHVyZSB0byBzYXZlXG4gICAgICBjb25zdCBlbGVtZW50OiBQb3J0Zm9saW9FbGVtZW50ID0ge1xuICAgICAgICB0eXBlOiBlbGVtZW50VHlwZSxcbiAgICAgICAgbWV0YWRhdGEsXG4gICAgICAgIGNvbnRlbnRcbiAgICAgIH07XG4gICAgICBcbiAgICAgIC8vIFRZUEUgU0FGRVRZIEZJWCAjMjogVXNlIGFkYXB0ZXIgcGF0dGVybiBpbnN0ZWFkIG9mIGNvbXBsZXggdHlwZSBjYXN0aW5nXG4gICAgICAvLyBQcmV2aW91c2x5OiBlbGVtZW50IGFzIHVua25vd24gYXMgUGFyYW1ldGVyczx0eXBlb2YgdGhpcy5wb3J0Zm9saW9NYW5hZ2VyLnNhdmVFbGVtZW50PlswXVxuICAgICAgLy8gTm93OiBDbGVhbiBhZGFwdGVyIHBhdHRlcm4gdGhhdCBpbXBsZW1lbnRzIElFbGVtZW50IGludGVyZmFjZSBwcm9wZXJseVxuICAgICAgY29uc3QgYWRhcHRlciA9IG5ldyBQb3J0Zm9saW9FbGVtZW50QWRhcHRlcihlbGVtZW50KTtcbiAgICAgIFxuICAgICAgLy8gVVggSU1QUk9WRU1FTlQ6IEFkZCByZXRyeSBsb2dpYyBmb3IgdHJhbnNpZW50IGZhaWx1cmVzXG4gICAgICBmaWxlVXJsID0gYXdhaXQgdGhpcy5zYXZlRWxlbWVudFdpdGhSZXRyeShhZGFwdGVyLCBzYWZlTmFtZSwgZWxlbWVudFR5cGUpO1xuICAgIH1cbiAgICBcbiAgICBpZiAoIWZpbGVVcmwpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICBtZXNzYWdlOiAnRmFpbGVkIHRvIHNhdmUgZWxlbWVudCB0byBHaXRIdWIgcG9ydGZvbGlvIGFmdGVyIG11bHRpcGxlIGF0dGVtcHRzLlxcblxcbicgK1xuICAgICAgICAgICAgICAgICfwn5KhICoqVHJvdWJsZXNob290aW5nIFRpcHMqKjpcXG4nICtcbiAgICAgICAgICAgICAgICAn4oCiIENoZWNrIHlvdXIgR2l0SHViIGF1dGhlbnRpY2F0aW9uOiBgZ2ggYXV0aCBzdGF0dXNgXFxuJyArXG4gICAgICAgICAgICAgICAgJ+KAoiBWZXJpZnkgcmVwb3NpdG9yeSBwZXJtaXNzaW9uc1xcbicgK1xuICAgICAgICAgICAgICAgICfigKIgVHJ5IGFnYWluIGluIGEgZmV3IG1pbnV0ZXMgKEdpdEh1YiBBUEkgcmF0ZSBsaW1pdHMpXFxuJyArXG4gICAgICAgICAgICAgICAgJ+KAoiBDaGVjayBHaXRIdWIgc3RhdHVzOiBodHRwczovL3N0YXR1cy5naXRodWIuY29tJyxcbiAgICAgICAgZXJyb3I6ICdTQVZFX0ZBSUxFRCdcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gTG9nIHN1Ym1pc3Npb24gcmVzdWx0IChETUNQLVNFQy0wMDYpXG4gICAgLy8gQ2hlY2sgaWYgdGhpcyB3YXMgYSBkdXBsaWNhdGUgc2tpcCBvciBhY3R1YWwgdXBsb2FkXG4gICAgY29uc3Qgd2FzRHVwbGljYXRlID0gZmlsZVVybCAmJiBmaWxlVXJsLmluY2x1ZGVzKCdibG9iL21haW4vJykgJiYgIWZpbGVVcmwuaW5jbHVkZXMoJy9jb21taXQvJyk7XG4gICAgXG4gICAgaWYgKHdhc0R1cGxpY2F0ZSkge1xuICAgICAgbG9nZ2VyLmluZm8oYFNraXBwZWQgZHVwbGljYXRlIHVwbG9hZCBmb3IgJHtzYWZlTmFtZX0gLSBhbHJlYWR5IGluIHBvcnRmb2xpb2AsIHtcbiAgICAgICAgZWxlbWVudFR5cGUsXG4gICAgICAgIHVzZXJuYW1lOiBhdXRoU3RhdHVzLnVzZXJuYW1lLFxuICAgICAgICBmaWxlVXJsXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgbG9nZ2VyLmluZm8oYFN1Y2Nlc3NmdWxseSBzdWJtaXR0ZWQgJHtzYWZlTmFtZX0gdG8gR2l0SHViIHBvcnRmb2xpb2AsIHtcbiAgICAgICAgZWxlbWVudFR5cGUsXG4gICAgICAgIHVzZXJuYW1lOiBhdXRoU3RhdHVzLnVzZXJuYW1lLFxuICAgICAgICBmaWxlVXJsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBTRUNVUklUWSBFTkhBTkNFTUVOVCAoVGFzayAjMTQpOiBTbWFydCB0b2tlbiBtYW5hZ2VtZW50IGZvciBjb2xsZWN0aW9uIHN1Ym1pc3Npb25cbiAgICBjb25zdCBjb2xsZWN0aW9uVG9rZW5NYW5hZ2VtZW50ID0gYXdhaXQgdGhpcy5tYW5hZ2VUb2tlbkZvckxvbmdPcGVyYXRpb24oJ2NvbGxlY3Rpb25fc3VibWlzc2lvbicpO1xuICAgIGlmICghY29sbGVjdGlvblRva2VuTWFuYWdlbWVudC5jYW5Qcm9jZWVkKSB7XG4gICAgICAvLyBUb2tlbiBtYW5hZ2VtZW50IGZhaWxlZCBmb3IgY29sbGVjdGlvbiBzdWJtaXNzaW9uLCBidXQgbWFpbiBzdWJtaXNzaW9uIHN1Y2NlZWRlZFxuICAgICAgY29uc3QgZXJyb3JNZXNzYWdlID0gY29sbGVjdGlvblRva2VuTWFuYWdlbWVudC5lcnJvcj8ubWVzc2FnZSB8fCAnVG9rZW4gbWFuYWdlbWVudCBmYWlsZWQnO1xuICAgICAgY29uc3QgcG9ydGZvbGlvTWVzc2FnZSA9IHdhc0R1cGxpY2F0ZSA/IFxuICAgICAgICBg4pyFICR7c2FmZU5hbWV9IGFscmVhZHkgZXhpc3RzIGluIHlvdXIgR2l0SHViIHBvcnRmb2xpbyAobm8gY2hhbmdlcyBuZWVkZWQpYCA6XG4gICAgICAgIGDinIUgU3VjY2Vzc2Z1bGx5IHVwbG9hZGVkICR7c2FmZU5hbWV9IHRvIHlvdXIgR2l0SHViIHBvcnRmb2xpbyFgO1xuICAgICAgXG4gICAgICByZXR1cm4ge1xuICAgICAgICBzdWNjZXNzOiB0cnVlLFxuICAgICAgICBtZXNzYWdlOiBgJHtwb3J0Zm9saW9NZXNzYWdlfVxcbvCfk4EgUG9ydGZvbGlvIFVSTDogJHtmaWxlVXJsfVxcblxcbuKaoO+4jyBDb2xsZWN0aW9uIHN1Ym1pc3Npb24gc2tpcHBlZDogJHtlcnJvck1lc3NhZ2V9YCxcbiAgICAgICAgdXJsOiBmaWxlVXJsXG4gICAgICB9O1xuICAgIH1cblxuICAgIGNvbnN0IHRva2VuID0gY29sbGVjdGlvblRva2VuTWFuYWdlbWVudC50b2tlbiE7XG5cbiAgICAvLyBQcm92aWRlIHJlZnJlc2ggZ3VpZGFuY2UgaWYgcmVjb21tZW5kZWQgZm9yIGNvbGxlY3Rpb24gc3VibWlzc2lvblxuICAgIGlmIChjb2xsZWN0aW9uVG9rZW5NYW5hZ2VtZW50LnJlZnJlc2hSZWNvbW1lbmRlZCkge1xuICAgICAgY29uc3QgdG9rZW5UeXBlID0gVG9rZW5NYW5hZ2VyLmdldFRva2VuVHlwZSh0b2tlbik7XG4gICAgICBsb2dnZXIuaW5mbygnQ29sbGVjdGlvbiBzdWJtaXNzaW9uIHByb2NlZWRpbmcgd2l0aCBhZ2luZyB0b2tlbicsIHtcbiAgICAgICAgdG9rZW5UeXBlLFxuICAgICAgICByZWNvbW1lbmRhdGlvbjogJ0lmIGNvbGxlY3Rpb24gc3VibWlzc2lvbiBmYWlscywgdHJ5IHJlLWF1dGhlbnRpY2F0aW5nIHdpdGggc2V0dXBfZ2l0aHViX2F1dGgnXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBFTkhBTkNFTUVOVCAoSXNzdWUgIzU0OSk6IEFzayB1c2VyIGlmIHRoZXkgd2FudCB0byBzdWJtaXQgdG8gY29sbGVjdGlvblxuICAgIC8vIFRoaXMgY29tcGxldGVzIHRoZSBjb21tdW5pdHkgY29udHJpYnV0aW9uIHdvcmtmbG93XG4gICAgY29uc3QgY29sbGVjdGlvblN1Ym1pc3Npb25SZXN1bHQgPSBhd2FpdCB0aGlzLnByb21wdEZvckNvbGxlY3Rpb25TdWJtaXNzaW9uKHtcbiAgICAgIGVsZW1lbnROYW1lOiBzYWZlTmFtZSxcbiAgICAgIGVsZW1lbnRUeXBlLFxuICAgICAgcG9ydGZvbGlvVXJsOiBmaWxlVXJsLFxuICAgICAgdXNlcm5hbWU6IGF1dGhTdGF0dXMudXNlcm5hbWUgfHwgJ3Vua25vd24nLFxuICAgICAgbWV0YWRhdGEsXG4gICAgICB0b2tlbixcbiAgICAgIGxvY2FsUGF0aCAgLy8gUGFzcyB0aGUgbG9jYWwgZmlsZSBwYXRoIGZvciByZWFkaW5nIGNvbnRlbnRcbiAgICB9KTtcblxuICAgIC8vIEJ1aWxkIHRoZSByZXNwb25zZSBtZXNzYWdlIGJhc2VkIG9uIHdoYXQgaGFwcGVuZWRcbiAgICBjb25zdCBwb3J0Zm9saW9NZXNzYWdlID0gd2FzRHVwbGljYXRlID8gXG4gICAgICBg4pyFICR7c2FmZU5hbWV9IGFscmVhZHkgZXhpc3RzIGluIHlvdXIgR2l0SHViIHBvcnRmb2xpbyAobm8gY2hhbmdlcyBuZWVkZWQpYCA6XG4gICAgICBg4pyFIFN1Y2Nlc3NmdWxseSB1cGxvYWRlZCAke3NhZmVOYW1lfSB0byB5b3VyIEdpdEh1YiBwb3J0Zm9saW8hYDtcbiAgICBcbiAgICBsZXQgbWVzc2FnZSA9IGAke3BvcnRmb2xpb01lc3NhZ2V9XFxuYDtcbiAgICBtZXNzYWdlICs9IGDwn5OBIFBvcnRmb2xpbyBVUkw6ICR7ZmlsZVVybH1cXG5cXG5gO1xuICAgIFxuICAgIGlmIChjb2xsZWN0aW9uU3VibWlzc2lvblJlc3VsdC5zdWJtaXR0ZWQpIHtcbiAgICAgIGlmIChjb2xsZWN0aW9uU3VibWlzc2lvblJlc3VsdC5pc0R1cGxpY2F0ZSkge1xuICAgICAgICBtZXNzYWdlICs9IGDwn5OLIENvbGxlY3Rpb24gaXNzdWUgYWxyZWFkeSBleGlzdHMgKG5vIG5ldyBzdWJtaXNzaW9uIG5lZWRlZClcXG5gO1xuICAgICAgICBtZXNzYWdlICs9IGDwn5SXIElzc3VlOiAke2NvbGxlY3Rpb25TdWJtaXNzaW9uUmVzdWx0Lmlzc3VlVXJsfWA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBtZXNzYWdlICs9IGDwn46JIEFsc28gc3VibWl0dGVkIHRvIERvbGxob3VzZU1DUCBjb2xsZWN0aW9uIGZvciBjb21tdW5pdHkgcmV2aWV3IVxcbmA7XG4gICAgICAgIG1lc3NhZ2UgKz0gYPCfk4sgSXNzdWU6ICR7Y29sbGVjdGlvblN1Ym1pc3Npb25SZXN1bHQuaXNzdWVVcmx9YDtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGNvbGxlY3Rpb25TdWJtaXNzaW9uUmVzdWx0LmRlY2xpbmVkKSB7XG4gICAgICBtZXNzYWdlICs9IGDwn5KhIFlvdSBjYW4gc3VibWl0IHRvIHRoZSBjb2xsZWN0aW9uIGxhdGVyIHVzaW5nIHRoZSBzYW1lIGNvbW1hbmQuYDtcbiAgICB9IGVsc2UgaWYgKGNvbGxlY3Rpb25TdWJtaXNzaW9uUmVzdWx0LmVycm9yKSB7XG4gICAgICBtZXNzYWdlICs9IGDimqDvuI8gQ29sbGVjdGlvbiBzdWJtaXNzaW9uIGZhaWxlZDogJHtjb2xsZWN0aW9uU3VibWlzc2lvblJlc3VsdC5lcnJvcn1cXG5gO1xuICAgICAgbWVzc2FnZSArPSBg8J+SoSBZb3UgY2FuIG1hbnVhbGx5IHN1Ym1pdCBhdDogaHR0cHM6Ly9naXRodWIuY29tL0RvbGxob3VzZU1DUC9jb2xsZWN0aW9uL2lzc3Vlcy9uZXdgO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBzdWNjZXNzOiB0cnVlLFxuICAgICAgbWVzc2FnZSxcbiAgICAgIHVybDogZmlsZVVybFxuICAgIH07XG4gIH1cblxuICBhc3luYyBleGVjdXRlKHBhcmFtczogU3VibWl0VG9Qb3J0Zm9saW9QYXJhbXMpOiBQcm9taXNlPFN1Ym1pdFRvUG9ydGZvbGlvUmVzdWx0PiB7XG4gICAgY29uc3Qgc3RhcnRUaW1lID0gRGF0ZS5ub3coKTtcbiAgICBjb25zdCB0aW1pbmdzOiBSZWNvcmQ8c3RyaW5nLCBudW1iZXI+ID0ge307XG4gICAgXG4gICAgbG9nZ2VyLmluZm8oJ/CfmoAgU1VCTUlTU0lPTiBXT1JLRkxPVyBTVEFSVElORycsIHtcbiAgICAgIHBhcmFtczogSlNPTi5zdHJpbmdpZnkocGFyYW1zKSxcbiAgICAgIHRpbWVzdGFtcDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpXG4gICAgfSk7XG4gICAgXG4gICAgdHJ5IHtcbiAgICAgIC8vIFN0ZXAgMTogVmFsaWRhdGUgYW5kIG5vcm1hbGl6ZSBpbnB1dCBwYXJhbWV0ZXJzXG4gICAgICBsb2dnZXIuaW5mbygn8J+TiyBTdGVwIDEvODogVmFsaWRhdGluZyBwYXJhbWV0ZXJzLi4uJyk7XG4gICAgICBjb25zdCBzdGVwMVN0YXJ0ID0gRGF0ZS5ub3coKTtcbiAgICAgIGNvbnN0IHZhbGlkYXRpb25SZXN1bHQgPSBhd2FpdCB0aGlzLnZhbGlkYXRlQW5kTm9ybWFsaXplUGFyYW1zKHBhcmFtcyk7XG4gICAgICB0aW1pbmdzWyd2YWxpZGF0aW9uJ10gPSBEYXRlLm5vdygpIC0gc3RlcDFTdGFydDtcbiAgICAgIGxvZ2dlci5pbmZvKGDinIUgU3RlcCAxIGNvbXBsZXRlICgke3RpbWluZ3NbJ3ZhbGlkYXRpb24nXX1tcylgKTtcbiAgICAgIGlmICghdmFsaWRhdGlvblJlc3VsdC5zdWNjZXNzKSB7XG4gICAgICAgIHJldHVybiB2YWxpZGF0aW9uUmVzdWx0LmVycm9yITtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHNhZmVOYW1lID0gdmFsaWRhdGlvblJlc3VsdC5zYWZlTmFtZSE7XG5cbiAgICAgIC8vIFN0ZXAgMjogQ2hlY2sgYXV0aGVudGljYXRpb24gc3RhdHVzXG4gICAgICBsb2dnZXIuaW5mbygn8J+UkCBTdGVwIDIvODogQ2hlY2tpbmcgYXV0aGVudGljYXRpb24uLi4nKTtcbiAgICAgIGNvbnN0IHN0ZXAyU3RhcnQgPSBEYXRlLm5vdygpO1xuICAgICAgY29uc3QgYXV0aFJlc3VsdCA9IGF3YWl0IHRoaXMuY2hlY2tBdXRoZW50aWNhdGlvbigpO1xuICAgICAgdGltaW5nc1snYXV0aGVudGljYXRpb24nXSA9IERhdGUubm93KCkgLSBzdGVwMlN0YXJ0O1xuICAgICAgbG9nZ2VyLmluZm8oYOKchSBTdGVwIDIgY29tcGxldGUgKCR7dGltaW5nc1snYXV0aGVudGljYXRpb24nXX1tcylgLCB7XG4gICAgICAgIHVzZXJuYW1lOiBhdXRoUmVzdWx0LmF1dGhTdGF0dXM/LnVzZXJuYW1lLFxuICAgICAgICBoYXNUb2tlbjogISFhdXRoUmVzdWx0LmF1dGhTdGF0dXM/Lmhhc1Rva2VuXG4gICAgICB9KTtcbiAgICAgIGlmICghYXV0aFJlc3VsdC5zdWNjZXNzKSB7XG4gICAgICAgIHJldHVybiBhdXRoUmVzdWx0LmVycm9yITtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGF1dGhTdGF0dXMgPSBhdXRoUmVzdWx0LmF1dGhTdGF0dXMhO1xuXG4gICAgICAvLyBTdGVwIDM6IEZpbmQgY29udGVudCBsb2NhbGx5IHdpdGggc21hcnQgdHlwZSBkZXRlY3Rpb25cbiAgICAgIGxvZ2dlci5pbmZvKCfwn5SNIFN0ZXAgMy84OiBGaW5kaW5nIGNvbnRlbnQgbG9jYWxseS4uLicpO1xuICAgICAgY29uc3Qgc3RlcDNTdGFydCA9IERhdGUubm93KCk7XG4gICAgICBjb25zdCBjb250ZW50UmVzdWx0ID0gYXdhaXQgdGhpcy5kaXNjb3ZlckNvbnRlbnRXaXRoVHlwZURldGVjdGlvbihzYWZlTmFtZSEsIHBhcmFtcy50eXBlLCBwYXJhbXMubmFtZSk7XG4gICAgICB0aW1pbmdzWydjb250ZW50RGlzY292ZXJ5J10gPSBEYXRlLm5vdygpIC0gc3RlcDNTdGFydDtcbiAgICAgIGxvZ2dlci5pbmZvKGDinIUgU3RlcCAzIGNvbXBsZXRlICgke3RpbWluZ3NbJ2NvbnRlbnREaXNjb3ZlcnknXX1tcylgLCB7XG4gICAgICAgIGZvdW5kOiBjb250ZW50UmVzdWx0LnN1Y2Nlc3MsXG4gICAgICAgIGVsZW1lbnRUeXBlOiBjb250ZW50UmVzdWx0LmVsZW1lbnRUeXBlLFxuICAgICAgICBwYXRoOiBjb250ZW50UmVzdWx0LmxvY2FsUGF0aFxuICAgICAgfSk7XG4gICAgICBpZiAoIWNvbnRlbnRSZXN1bHQuc3VjY2Vzcykge1xuICAgICAgICByZXR1cm4gY29udGVudFJlc3VsdC5lcnJvciE7XG4gICAgICB9XG4gICAgICBjb25zdCBlbGVtZW50VHlwZSA9IGNvbnRlbnRSZXN1bHQuZWxlbWVudFR5cGUhO1xuICAgICAgY29uc3QgbG9jYWxQYXRoID0gY29udGVudFJlc3VsdC5sb2NhbFBhdGghO1xuXG4gICAgICAvLyBTdGVwIDQ6IFZhbGlkYXRlIGZpbGUgYW5kIGNvbnRlbnQgc2VjdXJpdHlcbiAgICAgIGxvZ2dlci5pbmZvKCfwn5SSIFN0ZXAgNC84OiBWYWxpZGF0aW5nIHNlY3VyaXR5Li4uJyk7XG4gICAgICBjb25zdCBzdGVwNFN0YXJ0ID0gRGF0ZS5ub3coKTtcbiAgICAgIGNvbnN0IHNlY3VyaXR5UmVzdWx0ID0gYXdhaXQgdGhpcy52YWxpZGF0ZUZpbGVBbmRDb250ZW50KGxvY2FsUGF0aCk7XG4gICAgICB0aW1pbmdzWydzZWN1cml0eSddID0gRGF0ZS5ub3coKSAtIHN0ZXA0U3RhcnQ7XG4gICAgICBsb2dnZXIuaW5mbyhg4pyFIFN0ZXAgNCBjb21wbGV0ZSAoJHt0aW1pbmdzWydzZWN1cml0eSddfW1zKWApO1xuICAgICAgaWYgKCFzZWN1cml0eVJlc3VsdC5zdWNjZXNzKSB7XG4gICAgICAgIHJldHVybiBzZWN1cml0eVJlc3VsdC5lcnJvciE7XG4gICAgICB9XG4gICAgICBjb25zdCBjb250ZW50ID0gc2VjdXJpdHlSZXN1bHQuY29udGVudCE7XG5cbiAgICAgIC8vIFN0ZXAgNTogUHJlcGFyZSBtZXRhZGF0YSBmb3IgZWxlbWVudFxuICAgICAgbG9nZ2VyLmluZm8oJ/Cfk50gU3RlcCA1Lzg6IFByZXBhcmluZyBtZXRhZGF0YS4uLicpO1xuICAgICAgY29uc3Qgc3RlcDVTdGFydCA9IERhdGUubm93KCk7XG4gICAgICBjb25zdCBtZXRhZGF0YSA9IGF3YWl0IHRoaXMucHJlcGFyZUVsZW1lbnRNZXRhZGF0YShzYWZlTmFtZSEsIGVsZW1lbnRUeXBlLCBhdXRoU3RhdHVzLCBsb2NhbFBhdGgpO1xuICAgICAgdGltaW5nc1snbWV0YWRhdGEnXSA9IERhdGUubm93KCkgLSBzdGVwNVN0YXJ0O1xuICAgICAgbG9nZ2VyLmluZm8oYOKchSBTdGVwIDUgY29tcGxldGUgKCR7dGltaW5nc1snbWV0YWRhdGEnXX1tcylgLCB7XG4gICAgICAgIGF1dGhvcjogbWV0YWRhdGEuYXV0aG9yLFxuICAgICAgICBlbGVtZW50TmFtZTogc2FmZU5hbWVcbiAgICAgIH0pO1xuXG4gICAgICAvLyBTdGVwIDY6IFNldCB1cCBHaXRIdWIgcmVwb3NpdG9yeSBhY2Nlc3NcbiAgICAgIGxvZ2dlci5pbmZvKCfwn5SnIFN0ZXAgNi84OiBTZXR0aW5nIHVwIEdpdEh1YiByZXBvc2l0b3J5Li4uJyk7XG4gICAgICBjb25zdCBzdGVwNlN0YXJ0ID0gRGF0ZS5ub3coKTtcbiAgICAgIGNvbnN0IHJlcG9SZXN1bHQgPSBhd2FpdCB0aGlzLnNldHVwR2l0SHViUmVwb3NpdG9yeShhdXRoU3RhdHVzKTtcbiAgICAgIHRpbWluZ3NbJ3JlcG9TZXR1cCddID0gRGF0ZS5ub3coKSAtIHN0ZXA2U3RhcnQ7XG4gICAgICBsb2dnZXIuaW5mbyhg4pyFIFN0ZXAgNiBjb21wbGV0ZSAoJHt0aW1pbmdzWydyZXBvU2V0dXAnXX1tcylgLCB7XG4gICAgICAgIHN1Y2Nlc3M6IHJlcG9SZXN1bHQuc3VjY2Vzc1xuICAgICAgfSk7XG4gICAgICBpZiAoIXJlcG9SZXN1bHQuc3VjY2Vzcykge1xuICAgICAgICByZXR1cm4gcmVwb1Jlc3VsdC5lcnJvciE7XG4gICAgICB9XG5cbiAgICAgIC8vIFN0ZXAgNzogU3VibWl0IGVsZW1lbnQgdG8gcG9ydGZvbGlvIGFuZCBoYW5kbGUgY29sbGVjdGlvbiBzdWJtaXNzaW9uXG4gICAgICBsb2dnZXIuaW5mbygn8J+TpCBTdGVwIDcvODogU3VibWl0dGluZyB0byBwb3J0Zm9saW8uLi4nKTtcbiAgICAgIGNvbnN0IHN0ZXA3U3RhcnQgPSBEYXRlLm5vdygpO1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5zdWJtaXRFbGVtZW50QW5kSGFuZGxlUmVzcG9uc2UoXG4gICAgICAgIHNhZmVOYW1lISwgXG4gICAgICAgIGVsZW1lbnRUeXBlLCBcbiAgICAgICAgbWV0YWRhdGEsIFxuICAgICAgICBjb250ZW50LCBcbiAgICAgICAgYXV0aFN0YXR1cyxcbiAgICAgICAgbG9jYWxQYXRoICAvLyBQYXNzIGZpbGUgcGF0aCBmb3IgY29sbGVjdGlvbiBzdWJtaXNzaW9uXG4gICAgICApO1xuICAgICAgdGltaW5nc1snc3VibWlzc2lvbiddID0gRGF0ZS5ub3coKSAtIHN0ZXA3U3RhcnQ7XG4gICAgICBcbiAgICAgIC8vIFN0ZXAgODogRmluYWwgcmVwb3J0aW5nXG4gICAgICB0aW1pbmdzWyd0b3RhbCddID0gRGF0ZS5ub3coKSAtIHN0YXJ0VGltZTtcbiAgICAgIGxvZ2dlci5pbmZvKCfinKggU1VCTUlTU0lPTiBXT1JLRkxPVyBDT01QTEVURScsIHtcbiAgICAgICAgc3VjY2VzczogcmVzdWx0LnN1Y2Nlc3MsXG4gICAgICAgIHRpbWluZ3MsXG4gICAgICAgIHRvdGFsVGltZTogYCR7dGltaW5nc1sndG90YWwnXX1tc2BcbiAgICAgIH0pO1xuICAgICAgXG4gICAgICByZXR1cm4gcmVzdWx0O1xuXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIFNFQ1VSSVRZIEVOSEFOQ0VNRU5UIChUYXNrICMxNCk6IEVuaGFuY2VkIGVycm9yIGhhbmRsaW5nIHdpdGggdG9rZW4gcmVmcmVzaCBndWlkYW5jZVxuICAgICAgRXJyb3JIYW5kbGVyLmxvZ0Vycm9yKCdzdWJtaXRUb1BvcnRmb2xpbycsIGVycm9yLCB7XG4gICAgICAgIGVsZW1lbnROYW1lOiBwYXJhbXMubmFtZSxcbiAgICAgICAgZWxlbWVudFR5cGU6IHBhcmFtcy50eXBlXG4gICAgICB9KTtcblxuICAgICAgLy8gQ2hlY2sgaWYgZXJyb3IgaXMgdG9rZW4tcmVsYXRlZCBhbmQgcHJvdmlkZSByZWZyZXNoIGd1aWRhbmNlXG4gICAgICBjb25zdCBlcnJvck1lc3NhZ2UgPSBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcik7XG4gICAgICBjb25zdCBpc1Rva2VuRXJyb3IgPSBlcnJvck1lc3NhZ2UudG9Mb3dlckNhc2UoKS5pbmNsdWRlcygndG9rZW4nKSB8fCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JNZXNzYWdlLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoJ2F1dGgnKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvck1lc3NhZ2UudG9Mb3dlckNhc2UoKS5pbmNsdWRlcygnNDAxJykgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JNZXNzYWdlLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoJzQwMycpO1xuXG4gICAgICBsZXQgZm9ybWF0dGVkRXJyb3IgPSBFcnJvckhhbmRsZXIuZm9ybWF0Rm9yUmVzcG9uc2UoZXJyb3IpO1xuXG4gICAgICBpZiAoaXNUb2tlbkVycm9yKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgLy8gR2V0IGN1cnJlbnQgdG9rZW4gdG8gZGV0ZXJtaW5lIHR5cGUgZm9yIGd1aWRhbmNlXG4gICAgICAgICAgY29uc3QgY3VycmVudFRva2VuID0gYXdhaXQgVG9rZW5NYW5hZ2VyLmdldEdpdEh1YlRva2VuQXN5bmMoKTtcbiAgICAgICAgICBpZiAoY3VycmVudFRva2VuKSB7XG4gICAgICAgICAgICBjb25zdCB0b2tlblR5cGUgPSBUb2tlbk1hbmFnZXIuZ2V0VG9rZW5UeXBlKGN1cnJlbnRUb2tlbik7XG4gICAgICAgICAgICBjb25zdCByZWZyZXNoR3VpZGFuY2UgPSB0aGlzLmZvcm1hdFRva2VuUmVmcmVzaEd1aWRhbmNlKCdwb3J0Zm9saW8gc3VibWlzc2lvbicsIHRva2VuVHlwZSk7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8vIEFwcGVuZCByZWZyZXNoIGd1aWRhbmNlIHRvIGVycm9yIG1lc3NhZ2VcbiAgICAgICAgICAgIGlmIChmb3JtYXR0ZWRFcnJvci5tZXNzYWdlKSB7XG4gICAgICAgICAgICAgIGZvcm1hdHRlZEVycm9yLm1lc3NhZ2UgKz0gcmVmcmVzaEd1aWRhbmNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAodG9rZW5FcnJvcikge1xuICAgICAgICAgIC8vIElmIHdlIGNhbid0IGdldCB0b2tlbiBpbmZvLCBwcm92aWRlIGdlbmVyaWMgZ3VpZGFuY2VcbiAgICAgICAgICBmb3JtYXR0ZWRFcnJvci5tZXNzYWdlICs9ICdcXG5cXG7wn5SEICoqQXV0aGVudGljYXRpb24gSXNzdWUqKjogVHJ5IHJ1bm5pbmcgYHNldHVwX2dpdGh1Yl9hdXRoYCB0byByZWZyZXNoIHlvdXIgYXV0aGVudGljYXRpb24uJztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gZm9ybWF0dGVkRXJyb3I7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFByb21wdHMgdXNlciB0byBzdWJtaXQgY29udGVudCB0byB0aGUgRG9sbGhvdXNlTUNQIGNvbGxlY3Rpb25cbiAgICogRU5IQU5DRU1FTlQgKElzc3VlICM1NDkpOiBDb21wbGV0ZSB0aGUgY29tbXVuaXR5IGNvbnRyaWJ1dGlvbiB3b3JrZmxvd1xuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBwcm9tcHRGb3JDb2xsZWN0aW9uU3VibWlzc2lvbihwYXJhbXM6IHtcbiAgICBlbGVtZW50TmFtZTogc3RyaW5nO1xuICAgIGVsZW1lbnRUeXBlOiBFbGVtZW50VHlwZTtcbiAgICBwb3J0Zm9saW9Vcmw6IHN0cmluZztcbiAgICB1c2VybmFtZTogc3RyaW5nO1xuICAgIG1ldGFkYXRhOiBQb3J0Zm9saW9FbGVtZW50TWV0YWRhdGE7XG4gICAgdG9rZW46IHN0cmluZztcbiAgICBsb2NhbFBhdGg/OiBzdHJpbmc7ICAvLyBQYXRoIHRvIHRoZSBsb2NhbCBlbGVtZW50IGZpbGVcbiAgfSk6IFByb21pc2U8eyBzdWJtaXR0ZWQ6IGJvb2xlYW47IGRlY2xpbmVkOiBib29sZWFuOyBlcnJvcj86IHN0cmluZzsgaXNzdWVVcmw/OiBzdHJpbmc7IGlzRHVwbGljYXRlPzogYm9vbGVhbiB9PiB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIENyZWF0ZSBhIHNpbXBsZSBwcm9tcHQgbWVzc2FnZSBmb3IgdGhlIHVzZXJcbiAgICAgIC8vIE5vdGU6IEluIE1DUCBjb250ZXh0LCB3ZSBjYW4ndCBkbyBpbnRlcmFjdGl2ZSBwcm9tcHRzLCBzbyB3ZSdsbCBuZWVkIHRvXG4gICAgICAvLyBlaXRoZXIgbWFrZSB0aGlzIGF1dG9tYXRpYyBvciByZXF1aXJlIGEgcGFyYW1ldGVyXG4gICAgICBcbiAgICAgIC8vIEZvciBub3csIGxldCdzIGNoZWNrIGlmIHRoZSB1c2VyIGhhcyBzZXQgYW4gZW52aXJvbm1lbnQgdmFyaWFibGVcbiAgICAgIC8vIHRvIGF1dG8tc3VibWl0IHRvIGNvbGxlY3Rpb24gKG9wdC1pbiBiZWhhdmlvcilcbiAgICAgIGNvbnN0IGF1dG9TdWJtaXQgPSBwcm9jZXNzLmVudi5ET0xMSE9VU0VfQVVUT19TVUJNSVRfVE9fQ09MTEVDVElPTiA9PT0gJ3RydWUnO1xuICAgICAgXG4gICAgICBpZiAoIWF1dG9TdWJtaXQpIHtcbiAgICAgICAgLy8gVXNlciBoYXNuJ3Qgb3B0ZWQgaW4gdG8gYXV0by1zdWJtaXNzaW9uXG4gICAgICAgIGxvZ2dlci5pbmZvKCdDb2xsZWN0aW9uIHN1Ym1pc3Npb24gc2tpcHBlZCAoc2V0IERPTExIT1VTRV9BVVRPX1NVQk1JVF9UT19DT0xMRUNUSU9OPXRydWUgdG8gZW5hYmxlKScpO1xuICAgICAgICAvLyBVc2UgQ09MTF9DRkdfMDAxIGVycm9yIGNvZGUgZm9yIGF1dG8tc3VibWl0IGRpc2FibGVkXG4gICAgICAgIGNvbnN0IGVycm9yTWVzc2FnZSA9IGZvcm1hdENvbGxlY3Rpb25FcnJvcihDb2xsZWN0aW9uRXJyb3JDb2RlLkNPTExfQ0ZHXzAwMSwgNSwgNSk7XG4gICAgICAgIHJldHVybiB7IHN1Ym1pdHRlZDogZmFsc2UsIGRlY2xpbmVkOiB0cnVlLCBlcnJvcjogZXJyb3JNZXNzYWdlIH07XG4gICAgICB9XG5cbiAgICAgIGxvZ2dlci5pbmZvKCdBdXRvLXN1Ym1pdHRpbmcgdG8gRG9sbGhvdXNlTUNQIGNvbGxlY3Rpb24uLi4nKTtcblxuICAgICAgLy8gQ3JlYXRlIHRoZSBpc3N1ZSBpbiB0aGUgY29sbGVjdGlvbiByZXBvc2l0b3J5XG4gICAgICBjb25zdCBpc3N1ZVVybCA9IGF3YWl0IHRoaXMuY3JlYXRlQ29sbGVjdGlvbklzc3VlKHtcbiAgICAgICAgLi4ucGFyYW1zLFxuICAgICAgICB0b2tlbjogcGFyYW1zLnRva2VuLFxuICAgICAgICBsb2NhbFBhdGg6IHBhcmFtcy5sb2NhbFBhdGggIC8vIFBhc3MgdGhyb3VnaCB0aGUgZmlsZSBwYXRoXG4gICAgICB9KTtcblxuICAgICAgaWYgKGlzc3VlVXJsKSB7XG4gICAgICAgIC8vIENoZWNrIGlmIHRoaXMgd2FzIGFuIGV4aXN0aW5nIGlzc3VlIChkdXBsaWNhdGUpIG9yIG5ld2x5IGNyZWF0ZWRcbiAgICAgICAgLy8gVGhlIGNoZWNrRXhpc3RpbmdJc3N1ZSBtZXRob2QgcmV0dXJucyBlYXJseSB3aXRoIGV4aXN0aW5nIFVSTCBpZiBkdXBsaWNhdGUgZm91bmRcbiAgICAgICAgY29uc3QgaXNEdXBsaWNhdGUgPSBpc3N1ZVVybC5pbmNsdWRlcygnL2lzc3Vlcy8nKSAmJiAhaXNzdWVVcmwuaW5jbHVkZXMoJ25ldycpO1xuICAgICAgICBcbiAgICAgICAgaWYgKGlzRHVwbGljYXRlKSB7XG4gICAgICAgICAgbG9nZ2VyLmluZm8oJ0NvbGxlY3Rpb24gaXNzdWUgYWxyZWFkeSBleGlzdHMsIHJldHVybmluZyBleGlzdGluZyBpc3N1ZScsIHsgaXNzdWVVcmwgfSk7XG4gICAgICAgICAgcmV0dXJuIHsgXG4gICAgICAgICAgICBzdWJtaXR0ZWQ6IHRydWUsIFxuICAgICAgICAgICAgZGVjbGluZWQ6IGZhbHNlLCBcbiAgICAgICAgICAgIGlzc3VlVXJsLFxuICAgICAgICAgICAgaXNEdXBsaWNhdGU6IHRydWUgXG4gICAgICAgICAgfTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBsb2dnZXIuaW5mbygnU3VjY2Vzc2Z1bGx5IGNyZWF0ZWQgY29sbGVjdGlvbiBzdWJtaXNzaW9uIGlzc3VlJywgeyBpc3N1ZVVybCB9KTtcbiAgICAgICAgICByZXR1cm4geyBcbiAgICAgICAgICAgIHN1Ym1pdHRlZDogdHJ1ZSwgXG4gICAgICAgICAgICBkZWNsaW5lZDogZmFsc2UsIFxuICAgICAgICAgICAgaXNzdWVVcmwsXG4gICAgICAgICAgICBpc0R1cGxpY2F0ZTogZmFsc2UgXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHsgc3VibWl0dGVkOiBmYWxzZSwgZGVjbGluZWQ6IGZhbHNlLCBlcnJvcjogJ0ZhaWxlZCB0byBjcmVhdGUgaXNzdWUnIH07XG4gICAgICB9XG5cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbG9nZ2VyLmVycm9yKCdFcnJvciBpbiBjb2xsZWN0aW9uIHN1Ym1pc3Npb24gcHJvbXB0JywgeyBlcnJvciB9KTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHN1Ym1pdHRlZDogZmFsc2UsXG4gICAgICAgIGRlY2xpbmVkOiBmYWxzZSxcbiAgICAgICAgZXJyb3I6IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogJ1Vua25vd24gZXJyb3InXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGFuIGlzc3VlIGluIHRoZSBEb2xsaG91c2VNQ1AvY29sbGVjdGlvbiByZXBvc2l0b3J5XG4gICAqIEVOSEFOQ0VNRU5UIChJc3N1ZSAjNTQ5KTogR2l0SHViIEFQSSBpbnRlZ3JhdGlvbiBmb3IgY29sbGVjdGlvbiBzdWJtaXNzaW9uXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGNyZWF0ZUNvbGxlY3Rpb25Jc3N1ZShwYXJhbXM6IHtcbiAgICBlbGVtZW50TmFtZTogc3RyaW5nO1xuICAgIGVsZW1lbnRUeXBlOiBFbGVtZW50VHlwZTtcbiAgICBwb3J0Zm9saW9Vcmw6IHN0cmluZztcbiAgICB1c2VybmFtZTogc3RyaW5nO1xuICAgIG1ldGFkYXRhOiBQb3J0Zm9saW9FbGVtZW50TWV0YWRhdGE7XG4gICAgdG9rZW46IHN0cmluZztcbiAgICBsb2NhbFBhdGg/OiBzdHJpbmc7ICAvLyBQYXRoIHRvIHRoZSBsb2NhbCBlbGVtZW50IGZpbGVcbiAgfSk6IFByb21pc2U8c3RyaW5nIHwgbnVsbD4ge1xuICAgIHRyeSB7XG4gICAgICAvLyBEVVBMSUNBVEUgREVURUNUSU9OOiBDaGVjayBpZiBpc3N1ZSBhbHJlYWR5IGV4aXN0c1xuICAgICAgY29uc3QgZXhpc3RpbmdJc3N1ZVVybCA9IGF3YWl0IHRoaXMuY2hlY2tFeGlzdGluZ0lzc3VlKFxuICAgICAgICBwYXJhbXMuZWxlbWVudE5hbWUsXG4gICAgICAgIHBhcmFtcy51c2VybmFtZSxcbiAgICAgICAgcGFyYW1zLnRva2VuXG4gICAgICApO1xuICAgICAgXG4gICAgICBpZiAoZXhpc3RpbmdJc3N1ZVVybCkge1xuICAgICAgICBsb2dnZXIuaW5mbygnQ29sbGVjdGlvbiBpc3N1ZSBhbHJlYWR5IGV4aXN0cywgc2tpcHBpbmcgY3JlYXRpb24nLCB7XG4gICAgICAgICAgZWxlbWVudE5hbWU6IHBhcmFtcy5lbGVtZW50TmFtZSxcbiAgICAgICAgICBpc3N1ZVVybDogZXhpc3RpbmdJc3N1ZVVybFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGV4aXN0aW5nSXNzdWVVcmw7XG4gICAgICB9XG5cbiAgICAgIC8vIEZvcm1hdCB0aGUgaXNzdWUgdGl0bGVcbiAgICAgIGNvbnN0IHRpdGxlID0gYFske3BhcmFtcy5lbGVtZW50VHlwZX1dIEFkZCAke3BhcmFtcy5lbGVtZW50TmFtZX0gYnkgQCR7cGFyYW1zLnVzZXJuYW1lfWA7XG5cbiAgICAgIC8vIEZvcm1hdCB0aGUgaXNzdWUgYm9keSB3aXRoIGFsbCByZWxldmFudCBpbmZvcm1hdGlvblxuICAgICAgLy8gQnVpbGQgYWRkaXRpb25hbCBtZXRhZGF0YSBmaWVsZHMgZm9yIGRpc3BsYXlcbiAgICAgIC8vIFRZUEUgU0FGRVRZOiBEZWZpbmUgaW50ZXJmYWNlIGZvciBleHRlbmRlZCBtZXRhZGF0YVxuICAgICAgaW50ZXJmYWNlIEV4dGVuZGVkTWV0YSBleHRlbmRzIFBvcnRmb2xpb0VsZW1lbnRNZXRhZGF0YSB7XG4gICAgICAgIGNhdGVnb3J5Pzogc3RyaW5nO1xuICAgICAgICB0cmlnZ2Vycz86IHN0cmluZ1tdO1xuICAgICAgICBhZ2VfcmF0aW5nPzogc3RyaW5nO1xuICAgICAgICBhaV9nZW5lcmF0ZWQ/OiBib29sZWFuO1xuICAgICAgICBnZW5lcmF0aW9uX21ldGhvZD86IHN0cmluZztcbiAgICAgICAgbGljZW5zZT86IHN0cmluZztcbiAgICAgICAgdGFncz86IHN0cmluZ1tdO1xuICAgICAgfVxuICAgICAgXG4gICAgICBjb25zdCBhZGRpdGlvbmFsRmllbGRzOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgY29uc3QgbWV0YSA9IHBhcmFtcy5tZXRhZGF0YSBhcyBFeHRlbmRlZE1ldGE7XG4gICAgICBcbiAgICAgIGlmIChtZXRhLmNhdGVnb3J5KSBhZGRpdGlvbmFsRmllbGRzLnB1c2goYCoqQ2F0ZWdvcnkqKjogJHttZXRhLmNhdGVnb3J5fWApO1xuICAgICAgaWYgKG1ldGEudmVyc2lvbikgYWRkaXRpb25hbEZpZWxkcy5wdXNoKGAqKlZlcnNpb24qKjogJHttZXRhLnZlcnNpb259YCk7XG4gICAgICBpZiAobWV0YS50cmlnZ2VycyAmJiBBcnJheS5pc0FycmF5KG1ldGEudHJpZ2dlcnMpICYmIG1ldGEudHJpZ2dlcnMubGVuZ3RoID4gMCkge1xuICAgICAgICBhZGRpdGlvbmFsRmllbGRzLnB1c2goYCoqVHJpZ2dlcnMqKjogJHttZXRhLnRyaWdnZXJzLmpvaW4oJywgJyl9YCk7XG4gICAgICB9XG4gICAgICBpZiAobWV0YS5hZ2VfcmF0aW5nKSBhZGRpdGlvbmFsRmllbGRzLnB1c2goYCoqQWdlIFJhdGluZyoqOiAke21ldGEuYWdlX3JhdGluZ31gKTtcbiAgICAgIGlmIChtZXRhLmFpX2dlbmVyYXRlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGFkZGl0aW9uYWxGaWVsZHMucHVzaChgKipBSSBHZW5lcmF0ZWQqKjogJHttZXRhLmFpX2dlbmVyYXRlZCA/ICdZZXMnIDogJ05vJ31gKTtcbiAgICAgIH1cbiAgICAgIGlmIChtZXRhLmdlbmVyYXRpb25fbWV0aG9kKSBhZGRpdGlvbmFsRmllbGRzLnB1c2goYCoqR2VuZXJhdGlvbiBNZXRob2QqKjogJHttZXRhLmdlbmVyYXRpb25fbWV0aG9kfWApO1xuICAgICAgaWYgKG1ldGEubGljZW5zZSkgYWRkaXRpb25hbEZpZWxkcy5wdXNoKGAqKkxpY2Vuc2UqKjogJHttZXRhLmxpY2Vuc2V9YCk7XG4gICAgICBpZiAobWV0YS50YWdzICYmIEFycmF5LmlzQXJyYXkobWV0YS50YWdzKSAmJiBtZXRhLnRhZ3MubGVuZ3RoID4gMCkge1xuICAgICAgICBhZGRpdGlvbmFsRmllbGRzLnB1c2goYCoqVGFncyoqOiAke21ldGEudGFncy5qb2luKCcsICcpfWApO1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBSZWFkIHRoZSBmdWxsIGVsZW1lbnQgZmlsZSBjb250ZW50IGlmIHBhdGggaXMgcHJvdmlkZWRcbiAgICAgIGxldCBlbGVtZW50Q29udGVudCA9ICcnO1xuICAgICAgaWYgKHBhcmFtcy5sb2NhbFBhdGgpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAvLyBTRUNVUklUWTogVmFsaWRhdGUgZmlsZSBzaXplIGJlZm9yZSByZWFkaW5nIHRvIHByZXZlbnQgbWVtb3J5IGV4aGF1c3Rpb25cbiAgICAgICAgICBjb25zdCBzdGF0cyA9IGF3YWl0IGZzLnN0YXQocGFyYW1zLmxvY2FsUGF0aCk7XG4gICAgICAgICAgaWYgKHN0YXRzLnNpemUgPiBGSUxFX1NJWkVfTElNSVRTLk1BWF9GSUxFX1NJWkUpIHtcbiAgICAgICAgICAgIC8vIERPIE5PVCB0cnVuY2F0ZSB1c2VyIGNvbnRlbnQgLSByZWplY3QgaWYgdG9vIGxhcmdlXG4gICAgICAgICAgICBsb2dnZXIuZXJyb3IoJ0VsZW1lbnQgZmlsZSBleGNlZWRzIHNpemUgbGltaXQgZm9yIGNvbGxlY3Rpb24gc3VibWlzc2lvbicsIHtcbiAgICAgICAgICAgICAgZWxlbWVudE5hbWU6IHBhcmFtcy5lbGVtZW50TmFtZSxcbiAgICAgICAgICAgICAgZmlsZVNpemU6IHN0YXRzLnNpemUsXG4gICAgICAgICAgICAgIG1heFNpemU6IEZJTEVfU0laRV9MSU1JVFMuTUFYX0ZJTEVfU0laRVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgICAgICAgdHlwZTogJ0NPTlRFTlRfSU5KRUNUSU9OX0FUVEVNUFQnLFxuICAgICAgICAgICAgICBzZXZlcml0eTogJ01FRElVTScsXG4gICAgICAgICAgICAgIHNvdXJjZTogJ1N1Ym1pdFRvUG9ydGZvbGlvVG9vbC5jcmVhdGVDb2xsZWN0aW9uSXNzdWUnLFxuICAgICAgICAgICAgICBkZXRhaWxzOiBgRmlsZSBzaXplICR7c3RhdHMuc2l6ZX0gZXhjZWVkcyBsaW1pdCBmb3IgY29sbGVjdGlvbiBzdWJtaXNzaW9uYCxcbiAgICAgICAgICAgICAgbWV0YWRhdGE6IHtcbiAgICAgICAgICAgICAgICBlbGVtZW50TmFtZTogcGFyYW1zLmVsZW1lbnROYW1lLFxuICAgICAgICAgICAgICAgIGZpbGVTaXplOiBzdGF0cy5zaXplLFxuICAgICAgICAgICAgICAgIGxpbWl0OiBGSUxFX1NJWkVfTElNSVRTLk1BWF9GSUxFX1NJWkVcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8vIFJldHVybiBlcnJvciBtZXNzYWdlIGluc3RlYWQgb2YgdHJ1bmNhdGluZ1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgfVxuICAgICAgICAgIFxuICAgICAgICAgIC8vIFJlYWQgdGhlIGZ1bGwgbWFya2Rvd24gZmlsZSB3aXRoIGZyb250bWF0dGVyIGFuZCBjb250ZW50XG4gICAgICAgICAgZWxlbWVudENvbnRlbnQgPSBhd2FpdCBmcy5yZWFkRmlsZShwYXJhbXMubG9jYWxQYXRoLCAndXRmLTgnKTtcbiAgICAgICAgICBcbiAgICAgICAgICAvLyBTRUNVUklUWTogVmFsaWRhdGUgY29udGVudCBmb3Igc2VjdXJpdHkgaXNzdWVzXG4gICAgICAgICAgLy8gTm90ZTogV2UgYWxyZWFkeSB2YWxpZGF0ZWQgdGhpcyBjb250ZW50IGluIHZhbGlkYXRlRmlsZUFuZENvbnRlbnQoKVxuICAgICAgICAgIC8vIGJ1dCB3ZSByZS12YWxpZGF0ZSBoZXJlIHNpbmNlIHRoaXMgaXMgYmVpbmcgcG9zdGVkIHRvIGEgcHVibGljIGlzc3VlXG4gICAgICAgICAgY29uc3QgdmFsaWRhdGlvblJlc3VsdCA9IENvbnRlbnRWYWxpZGF0b3IudmFsaWRhdGVBbmRTYW5pdGl6ZShlbGVtZW50Q29udGVudCk7XG4gICAgICAgICAgXG4gICAgICAgICAgaWYgKCF2YWxpZGF0aW9uUmVzdWx0LmlzVmFsaWQgJiYgdmFsaWRhdGlvblJlc3VsdC5zZXZlcml0eSA9PT0gJ2NyaXRpY2FsJykge1xuICAgICAgICAgICAgbG9nZ2VyLmVycm9yKCdFbGVtZW50IGNvbnRlbnQgZmFpbGVkIHNlY3VyaXR5IHZhbGlkYXRpb24gZm9yIGNvbGxlY3Rpb24gc3VibWlzc2lvbicsIHtcbiAgICAgICAgICAgICAgZWxlbWVudE5hbWU6IHBhcmFtcy5lbGVtZW50TmFtZSxcbiAgICAgICAgICAgICAgaXNzdWVzOiB2YWxpZGF0aW9uUmVzdWx0LmRldGVjdGVkUGF0dGVybnNcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgICAgICAgIHR5cGU6ICdDT05URU5UX0lOSkVDVElPTl9BVFRFTVBUJyxcbiAgICAgICAgICAgICAgc2V2ZXJpdHk6ICdISUdIJyxcbiAgICAgICAgICAgICAgc291cmNlOiAnU3VibWl0VG9Qb3J0Zm9saW9Ub29sLmNyZWF0ZUNvbGxlY3Rpb25Jc3N1ZScsXG4gICAgICAgICAgICAgIGRldGFpbHM6IGBDcml0aWNhbCBzZWN1cml0eSBpc3N1ZXMgZGV0ZWN0ZWQgaW4gY29sbGVjdGlvbiBzdWJtaXNzaW9uYCxcbiAgICAgICAgICAgICAgbWV0YWRhdGE6IHtcbiAgICAgICAgICAgICAgICBlbGVtZW50TmFtZTogcGFyYW1zLmVsZW1lbnROYW1lLFxuICAgICAgICAgICAgICAgIGRldGVjdGVkUGF0dGVybnM6IHZhbGlkYXRpb25SZXN1bHQuZGV0ZWN0ZWRQYXR0ZXJuc1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLy8gRE8gTk9UIHN1Ym1pdCBjb250ZW50IHdpdGggc2VjdXJpdHkgaXNzdWVzXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICB9XG4gICAgICAgICAgXG4gICAgICAgICAgLy8gVXNlIHRoZSBzYW5pdGl6ZWQgY29udGVudCAoYnV0IE5PVCB0cnVuY2F0ZWQpXG4gICAgICAgICAgZWxlbWVudENvbnRlbnQgPSB2YWxpZGF0aW9uUmVzdWx0LnNhbml0aXplZENvbnRlbnQgfHwgZWxlbWVudENvbnRlbnQ7XG4gICAgICAgICAgXG4gICAgICAgICAgbG9nZ2VyLmRlYnVnKCdSZWFkIGFuZCB2YWxpZGF0ZWQgZWxlbWVudCBmaWxlIGNvbnRlbnQgZm9yIGNvbGxlY3Rpb24gc3VibWlzc2lvbicsIHtcbiAgICAgICAgICAgIGVsZW1lbnROYW1lOiBwYXJhbXMuZWxlbWVudE5hbWUsXG4gICAgICAgICAgICBjb250ZW50TGVuZ3RoOiBlbGVtZW50Q29udGVudC5sZW5ndGgsXG4gICAgICAgICAgICBzZWN1cml0eUlzc3VlczogdmFsaWRhdGlvblJlc3VsdC5kZXRlY3RlZFBhdHRlcm5zPy5sZW5ndGggfHwgMCxcbiAgICAgICAgICAgIGJ1aWxkVmVyc2lvbjogJ3YxLjYuOS1iZXRhMS1jb2xsZWN0aW9uLWZpeCcgIC8vIFZlcnNpb24gaWRlbnRpZmllciBmb3IgdmVyaWZpY2F0aW9uXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgbG9nZ2VyLndhcm4oJ0ZhaWxlZCB0byByZWFkIGVsZW1lbnQgZmlsZSBjb250ZW50LCBmYWxsaW5nIGJhY2sgdG8gbWV0YWRhdGEgb25seScsIHtcbiAgICAgICAgICAgIGVsZW1lbnROYW1lOiBwYXJhbXMuZWxlbWVudE5hbWUsXG4gICAgICAgICAgICBlcnJvcjogZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgLy8gRmFsbCBiYWNrIHRvIGp1c3QgdGhlIG1ldGFkYXRhIGlmIHdlIGNhbid0IHJlYWQgdGhlIGZpbGVcbiAgICAgICAgICBlbGVtZW50Q29udGVudCA9IHRoaXMuZm9ybWF0TWV0YWRhdGFBc1lhbWwocGFyYW1zLm1ldGFkYXRhLCBtZXRhKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gTm8gZmlsZSBwYXRoIHByb3ZpZGVkLCB1c2UgbWV0YWRhdGEgYXMgZmFsbGJhY2tcbiAgICAgICAgbG9nZ2VyLndhcm4oJ05vIGZpbGUgcGF0aCBwcm92aWRlZCBmb3IgY29sbGVjdGlvbiBzdWJtaXNzaW9uLCB1c2luZyBtZXRhZGF0YSBvbmx5Jywge1xuICAgICAgICAgIGVsZW1lbnROYW1lOiBwYXJhbXMuZWxlbWVudE5hbWVcbiAgICAgICAgfSk7XG4gICAgICAgIGVsZW1lbnRDb250ZW50ID0gdGhpcy5mb3JtYXRNZXRhZGF0YUFzWWFtbChwYXJhbXMubWV0YWRhdGEsIG1ldGEpO1xuICAgICAgfVxuICAgICAgXG4gICAgICBjb25zdCBib2R5ID0gYCMjIE5ldyAke3BhcmFtcy5lbGVtZW50VHlwZX0gU3VibWlzc2lvblxuXG4qKk5hbWUqKjogJHtwYXJhbXMuZWxlbWVudE5hbWV9XG4qKkF1dGhvcioqOiBAJHtwYXJhbXMudXNlcm5hbWV9XG4qKlR5cGUqKjogJHtwYXJhbXMuZWxlbWVudFR5cGV9XG5cbiMjIyBEZXNjcmlwdGlvblxuJHtwYXJhbXMubWV0YWRhdGEuZGVzY3JpcHRpb24gfHwgJ05vIGRlc2NyaXB0aW9uIHByb3ZpZGVkJ31cblxuIyMjIEVsZW1lbnQgRGV0YWlsc1xuJHthZGRpdGlvbmFsRmllbGRzLmxlbmd0aCA+IDAgPyBhZGRpdGlvbmFsRmllbGRzLmpvaW4oJ1xcbicpIDogJypObyBhZGRpdGlvbmFsIG1ldGFkYXRhIGF2YWlsYWJsZSonfVxuXG4jIyMgUG9ydGZvbGlvIExpbmtcbiR7cGFyYW1zLnBvcnRmb2xpb1VybH1cblxuIyMjIEVsZW1lbnQgQ29udGVudFxuXFxgXFxgXFxgeWFtbFxuJHtlbGVtZW50Q29udGVudH1cblxcYFxcYFxcYFxuXG4jIyMgUmV2aWV3IENoZWNrbGlzdFxuLSBbIF0gQ29udGVudCBpcyBhcHByb3ByaWF0ZSBhbmQgZm9sbG93cyBjb21tdW5pdHkgZ3VpZGVsaW5lc1xuLSBbIF0gTm8gc2VjdXJpdHkgdnVsbmVyYWJpbGl0aWVzIG9yIG1hbGljaW91cyBwYXR0ZXJuc1xuLSBbIF0gTWV0YWRhdGEgaXMgY29tcGxldGUgYW5kIGFjY3VyYXRlXG4tIFsgXSBFbGVtZW50IHdvcmtzIGFzIGRlc2NyaWJlZFxuLSBbIF0gTm8gZHVwbGljYXRlIG9mIGV4aXN0aW5nIGNvbGxlY3Rpb24gY29udGVudFxuXG4tLS1cbipUaGlzIHN1Ym1pc3Npb24gd2FzIGNyZWF0ZWQgYXV0b21hdGljYWxseSB2aWEgdGhlIERvbGxob3VzZU1DUCBzdWJtaXRfY29sbGVjdGlvbl9jb250ZW50IHRvb2wgKHYxLjYuOS1iZXRhMS1jb2xsZWN0aW9uLWZpeCkuKmA7XG5cbiAgICAgIC8vIERldGVybWluZSBsYWJlbHMgYmFzZWQgb24gZWxlbWVudCB0eXBlXG4gICAgICBjb25zdCBsYWJlbHMgPSBbXG4gICAgICAgICdlbGVtZW50LXN1Ym1pc3Npb24nLCAgLy8gQ1JJVElDQUw6IFRyaWdnZXJzIGF1dG9tYXRpb24gd29ya2Zsb3dcbiAgICAgICAgJ2NvbGxlY3Rpb24tcmVwbycsICAgICAvLyBJbmRpY2F0ZXMgdGhpcyBpcyBmb3IgdGhlIGNvbGxlY3Rpb25cbiAgICAgICAgJ2NvbnRyaWJ1dGlvbicsICAgICAgICAvLyBBbGwgc3VibWlzc2lvbnMgZ2V0IHRoaXNcbiAgICAgICAgJ3BlbmRpbmctcmV2aWV3JywgICAgICAvLyBOZWVkcyByZXZpZXdcbiAgICAgICAgcGFyYW1zLmVsZW1lbnRUeXBlLnRvTG93ZXJDYXNlKCkgLy8gRWxlbWVudCB0eXBlIGxhYmVsIChlLmcuLCAncGVyc29uYXMnKVxuICAgICAgXTtcblxuICAgICAgLy8gUEVSRk9STUFOQ0UgT1BUSU1JWkFUSU9OIChUYXNrICM2KTogVXNlIEdpdEh1YiByYXRlIGxpbWl0ZXIgZm9yIEFQSSBjYWxsc1xuICAgICAgLy8gVGhpcyBwcmV2ZW50cyBoaXR0aW5nIEdpdEh1YiByYXRlIGxpbWl0cyBhbmQgcHJvdmlkZXMgYmV0dGVyIGVycm9yIGhhbmRsaW5nXG4gICAgICBjb25zdCBpc3N1ZVVybCA9IGF3YWl0IGdpdGh1YlJhdGVMaW1pdGVyLnF1ZXVlUmVxdWVzdChcbiAgICAgICAgJ2NyZWF0ZS1jb2xsZWN0aW9uLWlzc3VlJyxcbiAgICAgICAgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHVybCA9ICdodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL0RvbGxob3VzZU1DUC9jb2xsZWN0aW9uL2lzc3Vlcyc7XG4gICAgICAgICAgXG4gICAgICAgICAgLy8gQ3JlYXRlIEFib3J0Q29udHJvbGxlciBmb3IgdGltZW91dFxuICAgICAgICAgIGNvbnN0IGNvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gICAgICAgICAgY29uc3QgdGltZW91dElkID0gc2V0VGltZW91dCgoKSA9PiBjb250cm9sbGVyLmFib3J0KCksIGdldFZhbGlkYXRlZFRpbWVvdXQoKSk7XG4gICAgICAgICAgXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsLCB7XG4gICAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICAgICAgJ0FjY2VwdCc6ICdhcHBsaWNhdGlvbi92bmQuZ2l0aHViLnYzK2pzb24nLFxuICAgICAgICAgICAgICAgICdBdXRob3JpemF0aW9uJzogYEJlYXJlciAke3BhcmFtcy50b2tlbn1gLFxuICAgICAgICAgICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgICAgICAgICAgJ1VzZXItQWdlbnQnOiAnRG9sbGhvdXNlTUNQLzEuMCdcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgICAgIHRpdGxlLFxuICAgICAgICAgICAgICAgIGJvZHksXG4gICAgICAgICAgICAgICAgbGFiZWxzXG4gICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICBzaWduYWw6IGNvbnRyb2xsZXIuc2lnbmFsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXRJZCk7XG5cbiAgICAgICAgICAgIC8vIFBFUkZPUk1BTkNFIE9QVElNSVpBVElPTiAoVGFzayAjMTUpOiBFbmhhbmNlZCByYXRlIGxpbWl0IGxvZ2dpbmdcbiAgICAgICAgICAgIC8vIExvZyByYXRlIGxpbWl0IGhlYWRlcnMgZm9yIGRpYWdub3N0aWNzXG4gICAgICAgICAgICBjb25zdCByYXRlTGltaXRSZW1haW5pbmcgPSByZXNwb25zZS5oZWFkZXJzLmdldCgnWC1SYXRlTGltaXQtUmVtYWluaW5nJyk7XG4gICAgICAgICAgICBjb25zdCByYXRlTGltaXRSZXNldCA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KCdYLVJhdGVMaW1pdC1SZXNldCcpO1xuICAgICAgICAgICAgY29uc3QgcmF0ZUxpbWl0TGltaXQgPSByZXNwb25zZS5oZWFkZXJzLmdldCgnWC1SYXRlTGltaXQtTGltaXQnKTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdHaXRIdWIgQVBJIHJhdGUgbGltaXQgc3RhdHVzJywge1xuICAgICAgICAgICAgICBvcGVyYXRpb246ICdjcmVhdGUtY29sbGVjdGlvbi1pc3N1ZScsXG4gICAgICAgICAgICAgIHJlbWFpbmluZzogcmF0ZUxpbWl0UmVtYWluaW5nLFxuICAgICAgICAgICAgICBsaW1pdDogcmF0ZUxpbWl0TGltaXQsXG4gICAgICAgICAgICAgIHJlc2V0VGltZTogcmF0ZUxpbWl0UmVzZXQgPyBuZXcgRGF0ZShwYXJzZUludChyYXRlTGltaXRSZXNldCkgKiAxMDAwKSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgcmVzcG9uc2VTdGF0dXM6IHJlc3BvbnNlLnN0YXR1c1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8vIExvZyB3YXJuaW5nIGlmIGFwcHJvYWNoaW5nIHJhdGUgbGltaXRcbiAgICAgICAgICAgIGlmIChyYXRlTGltaXRSZW1haW5pbmcgJiYgcGFyc2VJbnQocmF0ZUxpbWl0UmVtYWluaW5nKSA8IDEwMCkge1xuICAgICAgICAgICAgICBsb2dnZXIud2FybignQXBwcm9hY2hpbmcgR2l0SHViIEFQSSByYXRlIGxpbWl0Jywge1xuICAgICAgICAgICAgICAgIG9wZXJhdGlvbjogJ2NyZWF0ZS1jb2xsZWN0aW9uLWlzc3VlJyxcbiAgICAgICAgICAgICAgICByZW1haW5pbmc6IHJhdGVMaW1pdFJlbWFpbmluZyxcbiAgICAgICAgICAgICAgICByZXNldFRpbWU6IHJhdGVMaW1pdFJlc2V0ID8gbmV3IERhdGUocGFyc2VJbnQocmF0ZUxpbWl0UmVzZXQpICogMTAwMCkgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgcmVjb21tZW5kYXRpb246ICdDb25zaWRlciByZWR1Y2luZyBBUEkgdXNhZ2UgZnJlcXVlbmN5IG9yIGF1dGhlbnRpY2F0aW5nIGZvciBoaWdoZXIgbGltaXRzJ1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgICAgICAgICBjb25zdCBlcnJvclRleHQgPSBhd2FpdCByZXNwb25zZS50ZXh0KCk7XG4gICAgICAgICAgICAgIGxvZ2dlci5lcnJvcignR2l0SHViIEFQSSBlcnJvciBjcmVhdGluZyBpc3N1ZScsIHsgXG4gICAgICAgICAgICAgICAgc3RhdHVzOiByZXNwb25zZS5zdGF0dXMsIFxuICAgICAgICAgICAgICAgIHN0YXR1c1RleHQ6IHJlc3BvbnNlLnN0YXR1c1RleHQsXG4gICAgICAgICAgICAgICAgZXJyb3I6IGVycm9yVGV4dCxcbiAgICAgICAgICAgICAgICByYXRlTGltaXRSZW1haW5pbmcsXG4gICAgICAgICAgICAgICAgcmF0ZUxpbWl0UmVzZXRcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIFxuICAgICAgICAgICAgICBpZiAocmVzcG9uc2Uuc3RhdHVzID09PSA0MDQpIHtcbiAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoJ0NvbGxlY3Rpb24gcmVwb3NpdG9yeSBub3QgZm91bmQgb3Igbm8gYWNjZXNzJyk7XG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAocmVzcG9uc2Uuc3RhdHVzID09PSA0MDMpIHtcbiAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoJ1Blcm1pc3Npb24gZGVuaWVkIHRvIGNyZWF0ZSBpc3N1ZSBpbiBjb2xsZWN0aW9uIHJlcG8nKTtcbiAgICAgICAgICAgICAgfSBlbHNlIGlmIChyZXNwb25zZS5zdGF0dXMgPT09IDQwMSkge1xuICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcignQXV0aGVudGljYXRpb24gZmFpbGVkIGZvciBjb2xsZWN0aW9uIHN1Ym1pc3Npb24nKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEdpdEh1YiBBUEkgZXJyb3I6ICR7cmVzcG9uc2Uuc3RhdHVzfSAke3Jlc3BvbnNlLnN0YXR1c1RleHR9YCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG4gICAgICAgICAgICByZXR1cm4gZGF0YS5odG1sX3VybDtcbiAgICAgICAgICAgIFxuICAgICAgICAgIH0gY2F0Y2ggKGZldGNoRXJyb3I6IGFueSkge1xuICAgICAgICAgICAgLy8gUmUtdGhyb3cgdG8gb3V0ZXIgY2F0Y2ggYmxvY2tcbiAgICAgICAgICAgIHRocm93IGZldGNoRXJyb3I7XG4gICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0SWQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgJ2hpZ2gnIC8vIEhpZ2ggcHJpb3JpdHkgZm9yIGNvbGxlY3Rpb24gc3VibWlzc2lvblxuICAgICAgKTtcbiAgICAgIFxuICAgICAgcmV0dXJuIGlzc3VlVXJsO1xuXG4gICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgLy8gSGFuZGxlIHRpbWVvdXQgc3BlY2lmaWNhbGx5XG4gICAgICBpZiAoZXJyb3IubmFtZSA9PT0gJ0Fib3J0RXJyb3InKSB7XG4gICAgICAgIGxvZ2dlci5lcnJvcihgR2l0SHViIEFQSSByZXF1ZXN0IHRpbWVvdXQgYWZ0ZXIgJHtnZXRWYWxpZGF0ZWRUaW1lb3V0KCl9bXNgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxvZ2dlci5lcnJvcignRmFpbGVkIHRvIGNyZWF0ZSBjb2xsZWN0aW9uIGlzc3VlJywgeyBcbiAgICAgICAgICBlcnJvcjogZXJyb3IubWVzc2FnZSB8fCBlcnJvclxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZmluZExvY2FsQ29udGVudChuYW1lOiBzdHJpbmcsIHR5cGU6IEVsZW1lbnRUeXBlKTogUHJvbWlzZTxzdHJpbmcgfCBudWxsPiB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIE1FVEFEQVRBIElOREVYIEZJWDogVXNlIHBvcnRmb2xpbyBpbmRleCBmb3IgZmFzdCBtZXRhZGF0YS1iYXNlZCBsb29rdXBzXG4gICAgICAvLyBUaGlzIHNvbHZlcyB0aGUgY3JpdGljYWwgaXNzdWUgd2hlcmUgXCJTYWZlIFJvdW5kdHJpcCBUZXN0ZXJcIiBjb3VsZG4ndCBiZSBmb3VuZFxuICAgICAgLy8gYmVjYXVzZSBmaW5kTG9jYWxDb250ZW50IG9ubHkgc2VhcmNoZWQgZmlsZW5hbWVzLCBub3QgbWV0YWRhdGEgbmFtZXNcbiAgICAgIGNvbnN0IGluZGV4TWFuYWdlciA9IFBvcnRmb2xpb0luZGV4TWFuYWdlci5nZXRJbnN0YW5jZSgpO1xuICAgICAgXG4gICAgICAvLyBVWCBJTVBST1ZFTUVOVDogRW5oYW5jZWQgc2VhcmNoIHdpdGggZnV6enkgbWF0Y2hpbmdcbiAgICAgIGNvbnN0IGluZGV4RW50cnkgPSBhd2FpdCBpbmRleE1hbmFnZXIuZmluZEJ5TmFtZShuYW1lLCB7IFxuICAgICAgICBlbGVtZW50VHlwZTogdHlwZSxcbiAgICAgICAgZnV6enlNYXRjaDogdHJ1ZVxuICAgICAgfSk7XG4gICAgICBcbiAgICAgIGlmIChpbmRleEVudHJ5KSB7XG4gICAgICAgIGxvZ2dlci5kZWJ1ZygnRm91bmQgY29udGVudCB2aWEgbWV0YWRhdGEgaW5kZXgnLCB7IFxuICAgICAgICAgIHNlYXJjaE5hbWU6IG5hbWUsIFxuICAgICAgICAgIG1ldGFkYXRhTmFtZTogaW5kZXhFbnRyeS5tZXRhZGF0YS5uYW1lLFxuICAgICAgICAgIGZpbGVuYW1lOiBpbmRleEVudHJ5LmZpbGVuYW1lLFxuICAgICAgICAgIGZpbGVQYXRoOiBpbmRleEVudHJ5LmZpbGVQYXRoLFxuICAgICAgICAgIHR5cGUgXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gaW5kZXhFbnRyeS5maWxlUGF0aDtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gRkFMTEJBQ0s6IFVzZSBvcmlnaW5hbCBmaWxlIGRpc2NvdmVyeSBpZiBpbmRleCBsb29rdXAgZmFpbHNcbiAgICAgIC8vIFRoaXMgbWFpbnRhaW5zIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgYW5kIGhhbmRsZXMgZWRnZSBjYXNlc1xuICAgICAgbG9nZ2VyLmRlYnVnKCdJbmRleCBsb29rdXAgZmFpbGVkLCBmYWxsaW5nIGJhY2sgdG8gZmlsZSBkaXNjb3ZlcnknLCB7IG5hbWUsIHR5cGUgfSk7XG4gICAgICBcbiAgICAgIGNvbnN0IHBvcnRmb2xpb01hbmFnZXIgPSBQb3J0Zm9saW9NYW5hZ2VyLmdldEluc3RhbmNlKCk7XG4gICAgICBjb25zdCBwb3J0Zm9saW9EaXIgPSBwb3J0Zm9saW9NYW5hZ2VyLmdldEVsZW1lbnREaXIodHlwZSk7XG4gICAgICBcbiAgICAgIC8vIFVYIElNUFJPVkVNRU5UOiBUcnkgbXVsdGlwbGUgc2VhcmNoIHN0cmF0ZWdpZXMgZm9yIGJldHRlciB1c2VyIGV4cGVyaWVuY2VcbiAgICAgIGxldCBmaWxlID0gYXdhaXQgRmlsZURpc2NvdmVyeVV0aWwuZmluZEZpbGUocG9ydGZvbGlvRGlyLCBuYW1lLCB7XG4gICAgICAgIGV4dGVuc2lvbnM6IFsnLm1kJywgJy5qc29uJywgJy55YW1sJywgJy55bWwnXSxcbiAgICAgICAgcGFydGlhbE1hdGNoOiB0cnVlLFxuICAgICAgICBjYWNoZVJlc3VsdHM6IHRydWVcbiAgICAgIH0pO1xuICAgICAgXG4gICAgICAvLyBJZiBub3QgZm91bmQsIHRyeSBub3JtYWxpemluZyB0aGUgbmFtZSAoZS5nLiwgXCJKLkEuUi5WLkkuUy5cIiAtPiBcImotYS1yLXYtaS1zXCIpXG4gICAgICBpZiAoIWZpbGUpIHtcbiAgICAgICAgY29uc3Qgbm9ybWFsaXplZE5hbWUgPSBuYW1lLnRvTG93ZXJDYXNlKClcbiAgICAgICAgICAucmVwbGFjZSgvW15hLXowLTldL2dpLCAnLScpICAvLyBSZXBsYWNlIG5vbi1hbHBoYW51bWVyaWMgd2l0aCBkYXNoZXNcbiAgICAgICAgICAucmVwbGFjZSgvLSsvZywgJy0nKSAgICAgICAgIC8vIFJlcGxhY2UgbXVsdGlwbGUgZGFzaGVzIHdpdGggc2luZ2xlIGRhc2hcbiAgICAgICAgICAucmVwbGFjZSgvXi18LSQvZywgJycpOyAgICAgIC8vIFJlbW92ZSBsZWFkaW5nL3RyYWlsaW5nIGRhc2hlc1xuICAgICAgICAgIFxuICAgICAgICBpZiAobm9ybWFsaXplZE5hbWUgIT09IG5hbWUudG9Mb3dlckNhc2UoKSkge1xuICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnVHJ5aW5nIG5vcm1hbGl6ZWQgbmFtZSBzZWFyY2gnLCB7IFxuICAgICAgICAgICAgb3JpZ2luYWw6IG5hbWUsIFxuICAgICAgICAgICAgbm9ybWFsaXplZDogbm9ybWFsaXplZE5hbWUsXG4gICAgICAgICAgICB0eXBlIFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIFxuICAgICAgICAgIGZpbGUgPSBhd2FpdCBGaWxlRGlzY292ZXJ5VXRpbC5maW5kRmlsZShwb3J0Zm9saW9EaXIsIG5vcm1hbGl6ZWROYW1lLCB7XG4gICAgICAgICAgICBleHRlbnNpb25zOiBbJy5tZCcsICcuanNvbicsICcueWFtbCcsICcueW1sJ10sXG4gICAgICAgICAgICBwYXJ0aWFsTWF0Y2g6IHRydWUsXG4gICAgICAgICAgICBjYWNoZVJlc3VsdHM6IHRydWVcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBJZiBzdGlsbCBub3QgZm91bmQsIHRyeSBzZWFyY2hpbmcgYnkgZGlzcGxheSBuYW1lIHBhdHRlcm5zXG4gICAgICBpZiAoIWZpbGUpIHtcbiAgICAgICAgLy8gVHJ5IGNvbW1vbiB2YXJpYXRpb25zIGxpa2UgcmVtb3ZpbmcgZG90cywgc3BhY2VzLCBldGMuXG4gICAgICAgIGNvbnN0IHZhcmlhdGlvbnMgPSBbXG4gICAgICAgICAgbmFtZS5yZXBsYWNlKC9cXC4vZywgJycpLCAgICAgICAgLy8gUmVtb3ZlIGRvdHM6IFwiSi5BLlIuVi5JLlMuXCIgLT4gXCJKQVJWSVNcIlxuICAgICAgICAgIG5hbWUucmVwbGFjZSgvXFxzKy9nLCAnLScpLCAgICAgIC8vIFJlcGxhY2Ugc3BhY2VzIHdpdGggZGFzaGVzXG4gICAgICAgICAgbmFtZS5yZXBsYWNlKC9bXFxzXFwuXS9nLCAnJyksICAgIC8vIFJlbW92ZSBzcGFjZXMgYW5kIGRvdHNcbiAgICAgICAgICBuYW1lLnJlcGxhY2UoL1tcXHNcXC5dL2csICctJyksICAgLy8gUmVwbGFjZSBzcGFjZXMgYW5kIGRvdHMgd2l0aCBkYXNoZXNcbiAgICAgICAgXS5maWx0ZXIodiA9PiB2ICE9PSBuYW1lICYmIHYubGVuZ3RoID4gMCk7XG4gICAgICAgIFxuICAgICAgICBmb3IgKGNvbnN0IHZhcmlhdGlvbiBvZiB2YXJpYXRpb25zKSB7XG4gICAgICAgICAgZmlsZSA9IGF3YWl0IEZpbGVEaXNjb3ZlcnlVdGlsLmZpbmRGaWxlKHBvcnRmb2xpb0RpciwgdmFyaWF0aW9uLCB7XG4gICAgICAgICAgICBleHRlbnNpb25zOiBbJy5tZCcsICcuanNvbicsICcueWFtbCcsICcueW1sJ10sXG4gICAgICAgICAgICBwYXJ0aWFsTWF0Y2g6IHRydWUsXG4gICAgICAgICAgICBjYWNoZVJlc3VsdHM6IHRydWVcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBcbiAgICAgICAgICBpZiAoZmlsZSkge1xuICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdGb3VuZCBjb250ZW50IHVzaW5nIG5hbWUgdmFyaWF0aW9uJywge1xuICAgICAgICAgICAgICBvcmlnaW5hbDogbmFtZSxcbiAgICAgICAgICAgICAgdmFyaWF0aW9uLFxuICAgICAgICAgICAgICBmaWxlLFxuICAgICAgICAgICAgICB0eXBlXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgXG4gICAgICBpZiAoZmlsZSkge1xuICAgICAgICBsb2dnZXIuZGVidWcoJ0ZvdW5kIGxvY2FsIGNvbnRlbnQgZmlsZSB2aWEgZmFsbGJhY2snLCB7IG5hbWUsIHR5cGUsIGZpbGUgfSk7XG4gICAgICAgIHJldHVybiBmaWxlO1xuICAgICAgfVxuICAgICAgXG4gICAgICBsb2dnZXIuZGVidWcoJ05vIGNvbnRlbnQgZm91bmQnLCB7IG5hbWUsIHR5cGUgfSk7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICAgIFxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoJ0Vycm9yIGZpbmRpbmcgbG9jYWwgY29udGVudCcsIHtcbiAgICAgICAgbmFtZSxcbiAgICAgICAgdHlwZSxcbiAgICAgICAgZXJyb3I6IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKVxuICAgICAgfSk7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU21hcnQgZWxlbWVudCB0eXBlIGRldGVjdGlvbiAtIHNlYXJjaGVzIGFjcm9zcyBBTEwgZWxlbWVudCB0eXBlcyBmb3IgY29udGVudFxuICAgKiBQRVJGT1JNQU5DRSBPUFRJTUlaQVRJT04gKFRhc2sgIzkpOiBVc2VzIGVhcmx5IHRlcm1pbmF0aW9uIGZvciBleGFjdCBtYXRjaGVzXG4gICAqIFRoaXMgcmVwbGFjZXMgdGhlIHByZXZpb3VzIGhhcmRjb2RlZCBkZWZhdWx0IHRvIFBFUlNPTkEgYW5kIGVuYWJsZXMgcHJvcGVyIHR5cGUgZGV0ZWN0aW9uXG4gICAqIFxuICAgKiBAcGFyYW0gbmFtZSBUaGUgY29udGVudCBuYW1lIHRvIHNlYXJjaCBmb3JcbiAgICogQHJldHVybnMgRGV0ZWN0aW9uIHJlc3VsdCB3aXRoIGZvdW5kIG1hdGNoZXMgYWNyb3NzIGFsbCBlbGVtZW50IHR5cGVzXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGRldGVjdEVsZW1lbnRUeXBlKG5hbWU6IHN0cmluZyk6IFByb21pc2U8RWxlbWVudERldGVjdGlvblJlc3VsdD4ge1xuICAgIHRyeSB7XG4gICAgICAvLyBQRVJGT1JNQU5DRSBPUFRJTUlaQVRJT04gKFRhc2sgIzkpOiBVc2UgZWFybHkgdGVybWluYXRpb24gc2VhcmNoIHV0aWxpdHlcbiAgICAgIC8vIENyZWF0ZSBzZWFyY2ggZnVuY3Rpb25zIGZvciBlYWNoIGVsZW1lbnQgdHlwZVxuICAgICAgY29uc3QgZWxlbWVudFR5cGVzID0gT2JqZWN0LnZhbHVlcyhFbGVtZW50VHlwZSk7XG4gICAgICBjb25zdCBzZWFyY2hGdW5jdGlvbnMgPSBlbGVtZW50VHlwZXMubWFwKCh0eXBlKSA9PiBhc3luYyAoKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgZmlsZVBhdGggPSBhd2FpdCB0aGlzLmZpbmRMb2NhbENvbnRlbnQobmFtZSwgdHlwZSk7XG4gICAgICAgICAgaWYgKGZpbGVQYXRoKSB7XG4gICAgICAgICAgICByZXR1cm4geyB0eXBlOiB0eXBlIGFzIEVsZW1lbnRUeXBlLCBwYXRoOiBmaWxlUGF0aCB9O1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgICAgIC8vIExvZyB1bmV4cGVjdGVkIGVycm9ycyBidXQgZG9uJ3QgZmFpbCB0aGUgc2VhcmNoXG4gICAgICAgICAgaWYgKGVycm9yPy5jb2RlICE9PSAnRU5PRU5UJyAmJiBlcnJvcj8uY29kZSAhPT0gJ0VOT1RESVInKSB7XG4gICAgICAgICAgICBsb2dnZXIuZGVidWcoYEVycm9yIHNlYXJjaGluZyAke3R5cGV9IGRpcmVjdG9yeSBmb3IgY29udGVudCBkZXRlY3Rpb25gLCB7IFxuICAgICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgICB0eXBlLFxuICAgICAgICAgICAgICBlcnJvcjogZXJyb3I/Lm1lc3NhZ2UgfHwgU3RyaW5nKGVycm9yKSxcbiAgICAgICAgICAgICAgY29kZTogZXJyb3I/LmNvZGUgXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gUmV0dXJuIG51bGwgaW5zdGVhZCBvZiB0aHJvd2luZyB0byBsZXQgb3RoZXIgc2VhcmNoZXMgY29udGludWVcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIC8vIFBFUkZPUk1BTkNFIE9QVElNSVpBVElPTiAoVGFzayAjOSk6IERlZmluZSBleGFjdCBtYXRjaCBjcml0ZXJpYVxuICAgICAgY29uc3QgaXNFeGFjdE1hdGNoID0gKG1hdGNoOiBFbGVtZW50RGV0ZWN0aW9uTWF0Y2gpOiBib29sZWFuID0+IHtcbiAgICAgICAgY29uc3QgZmlsZW5hbWUgPSBwYXRoLmJhc2VuYW1lKG1hdGNoLnBhdGgsIHBhdGguZXh0bmFtZShtYXRjaC5wYXRoKSk7XG4gICAgICAgIHJldHVybiBmaWxlbmFtZS50b0xvd2VyQ2FzZSgpID09PSBuYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICB9O1xuXG4gICAgICAvLyBFeGVjdXRlIHNlYXJjaGVzIHdpdGggZWFybHkgdGVybWluYXRpb24gb3B0aW1pemF0aW9uXG4gICAgICBjb25zdCBzZWFyY2hSZXN1bHRzID0gYXdhaXQgRWFybHlUZXJtaW5hdGlvblNlYXJjaC5leGVjdXRlV2l0aEVhcmx5VGVybWluYXRpb24oXG4gICAgICAgIHNlYXJjaEZ1bmN0aW9ucyxcbiAgICAgICAgaXNFeGFjdE1hdGNoLFxuICAgICAgICB7XG4gICAgICAgICAgb3BlcmF0aW9uTmFtZTogJ2VsZW1lbnQtdHlwZS1kZXRlY3Rpb24nLFxuICAgICAgICAgIHRpbWVvdXRBZnRlckV4YWN0TWF0Y2g6IDEwMDAsIC8vIFdhaXQgMSBzZWNvbmQgZm9yIG90aGVyIHNlYXJjaGVzIGFmdGVyIGV4YWN0IG1hdGNoXG4gICAgICAgICAgbWF4UGFyYWxsZWxTZWFyY2hlczogOCAvLyBMaW1pdCBjb25jdXJyZW50IHNlYXJjaGVzIHRvIGF2b2lkIG92ZXJ3aGVsbWluZyB0aGUgc3lzdGVtXG4gICAgICAgIH1cbiAgICAgICk7XG5cbiAgICAgIC8vIFBFUkZPUk1BTkNFIE9QVElNSVpBVElPTiAoVGFzayAjOCk6IEVuaGFuY2VkIGJhdGNoIG9wZXJhdGlvbiByZXBvcnRpbmdcbiAgICAgIGNvbnN0IGJhdGNoUmVzdWx0cyA9IHtcbiAgICAgICAgbmFtZSxcbiAgICAgICAgdG90YWxTZWFyY2hlczogc2VhcmNoUmVzdWx0cy50b3RhbFNlYXJjaGVzLFxuICAgICAgICBjb21wbGV0ZWRTZWFyY2hlczogc2VhcmNoUmVzdWx0cy5jb21wbGV0ZWRTZWFyY2hlcyxcbiAgICAgICAgbWF0Y2hlczogc2VhcmNoUmVzdWx0cy5tYXRjaGVzLmxlbmd0aCxcbiAgICAgICAgZmFpbHVyZXM6IHNlYXJjaFJlc3VsdHMuZmFpbHVyZXMubGVuZ3RoLFxuICAgICAgICBleGFjdE1hdGNoRm91bmQ6ICEhc2VhcmNoUmVzdWx0cy5leGFjdE1hdGNoLFxuICAgICAgICBleGFjdE1hdGNoVHlwZTogc2VhcmNoUmVzdWx0cy5leGFjdE1hdGNoPy50eXBlLFxuICAgICAgICBlYXJseVRlcm1pbmF0aW9uVHJpZ2dlcmVkOiBzZWFyY2hSZXN1bHRzLmVhcmx5VGVybWluYXRpb25UcmlnZ2VyZWQsXG4gICAgICAgIHBlcmZvcm1hbmNlR2Fpbjogc2VhcmNoUmVzdWx0cy5wZXJmb3JtYW5jZUdhaW4sXG4gICAgICAgIG1hdGNoZWRUeXBlczogc2VhcmNoUmVzdWx0cy5tYXRjaGVzLm1hcChtID0+IG0udHlwZSksXG4gICAgICAgIGZhaWxlZFR5cGVzOiBzZWFyY2hSZXN1bHRzLmZhaWx1cmVzLm1hcChmID0+IGVsZW1lbnRUeXBlc1tmLmluZGV4XSkuZmlsdGVyKEJvb2xlYW4pXG4gICAgICB9O1xuXG4gICAgICBsb2dnZXIuZGVidWcoJ0VsZW1lbnQgdHlwZSBkZXRlY3Rpb24gY29tcGxldGVkIHdpdGggZWFybHkgdGVybWluYXRpb24gb3B0aW1pemF0aW9uJywgYmF0Y2hSZXN1bHRzKTtcblxuICAgICAgLy8gUEVSRk9STUFOQ0UgT1BUSU1JWkFUSU9OIChUYXNrICM4KTogQ2xlYXIgcmVwb3J0aW5nIG9mIHBhcnRpYWwgZmFpbHVyZXNcbiAgICAgIGlmIChzZWFyY2hSZXN1bHRzLmZhaWx1cmVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oJ1NvbWUgZWxlbWVudCB0eXBlIHNlYXJjaGVzIGZhaWxlZCBkdXJpbmcgYmF0Y2ggb3BlcmF0aW9uJywge1xuICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgZmFpbHVyZXM6IHNlYXJjaFJlc3VsdHMuZmFpbHVyZXMubWFwKGYgPT4gKHtcbiAgICAgICAgICAgIHR5cGU6IGVsZW1lbnRUeXBlc1tmLmluZGV4XSB8fCAndW5rbm93bicsXG4gICAgICAgICAgICBlcnJvcjogZi5lcnJvci5zdWJzdHJpbmcoMCwgMTAwKSAvLyBUcnVuY2F0ZSBsb25nIGVycm9yIG1lc3NhZ2VzXG4gICAgICAgICAgfSkpLFxuICAgICAgICAgIHN1Y2Nlc3NSYXRlOiBgJHtzZWFyY2hSZXN1bHRzLmNvbXBsZXRlZFNlYXJjaGVzfS8ke3NlYXJjaFJlc3VsdHMudG90YWxTZWFyY2hlc31gLFxuICAgICAgICAgIGltcGFjdE9uUmVzdWx0czogc2VhcmNoUmVzdWx0cy5tYXRjaGVzLmxlbmd0aCA+IDAgXG4gICAgICAgICAgICA/ICdObyBpbXBhY3QgLSBtYXRjaGVzIGZvdW5kIGluIHN1Y2Nlc3NmdWwgc2VhcmNoZXMnIFxuICAgICAgICAgICAgOiAnUG90ZW50aWFsIGltcGFjdCAtIG5vIG1hdGNoZXMgZm91bmQnXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIElmIHdlIGhhdmUgZmFpbHVyZXMgYW5kIG5vIG1hdGNoZXMsIHByb3ZpZGUgYWN0aW9uYWJsZSBndWlkYW5jZVxuICAgICAgICBpZiAoc2VhcmNoUmVzdWx0cy5tYXRjaGVzLmxlbmd0aCA9PT0gMCAmJiBzZWFyY2hSZXN1bHRzLmZhaWx1cmVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBsb2dnZXIud2FybignQmF0Y2ggb3BlcmF0aW9uIGhhZCBmYWlsdXJlcyBhbmQgbm8gbWF0Y2hlcyBmb3VuZCcsIHtcbiAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICByZWNvbW1lbmRhdGlvbjogJ0NvbnNpZGVyIGNoZWNraW5nIGZpbGUgcGVybWlzc2lvbnMgb3IgcG9ydGZvbGlvIHN0cnVjdHVyZScsXG4gICAgICAgICAgICBmYWlsdXJlQ291bnQ6IHNlYXJjaFJlc3VsdHMuZmFpbHVyZXMubGVuZ3RoLFxuICAgICAgICAgICAgdG90YWxTZWFyY2hlczogc2VhcmNoUmVzdWx0cy50b3RhbFNlYXJjaGVzXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gTG9nIHBlcmZvcm1hbmNlIGdhaW5zIGZyb20gZWFybHkgdGVybWluYXRpb25cbiAgICAgIGlmIChzZWFyY2hSZXN1bHRzLmVhcmx5VGVybWluYXRpb25UcmlnZ2VyZWQpIHtcbiAgICAgICAgbG9nZ2VyLmluZm8oJ0Vhcmx5IHRlcm1pbmF0aW9uIG9wdGltaXphdGlvbiBhcHBsaWVkIHN1Y2Nlc3NmdWxseScsIHtcbiAgICAgICAgICBuYW1lLFxuICAgICAgICAgIGV4YWN0TWF0Y2hUeXBlOiBzZWFyY2hSZXN1bHRzLmV4YWN0TWF0Y2g/LnR5cGUsXG4gICAgICAgICAgcGVyZm9ybWFuY2VHYWluOiBzZWFyY2hSZXN1bHRzLnBlcmZvcm1hbmNlR2FpbixcbiAgICAgICAgICBzZWFyY2hlc0NvbXBsZXRlZDogc2VhcmNoUmVzdWx0cy5jb21wbGV0ZWRTZWFyY2hlcyxcbiAgICAgICAgICBzZWFyY2hlc1RvdGFsOiBzZWFyY2hSZXN1bHRzLnRvdGFsU2VhcmNoZXNcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGZvdW5kOiBzZWFyY2hSZXN1bHRzLm1hdGNoZXMubGVuZ3RoID4gMCxcbiAgICAgICAgbWF0Y2hlczogc2VhcmNoUmVzdWx0cy5tYXRjaGVzXG4gICAgICB9O1xuXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci5lcnJvcignRXJyb3IgaW4gZWxlbWVudCB0eXBlIGRldGVjdGlvbicsIHtcbiAgICAgICAgbmFtZSxcbiAgICAgICAgZXJyb3I6IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKVxuICAgICAgfSk7XG4gICAgICBcbiAgICAgIC8vIFJldHVybiBlbXB0eSByZXN1bHQgb24gZGV0ZWN0aW9uIGZhaWx1cmVcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGZvdW5kOiBmYWxzZSxcbiAgICAgICAgbWF0Y2hlczogW11cbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFVYIElNUFJPVkVNRU5UOiBHZW5lcmF0ZSBuYW1lIHN1Z2dlc3Rpb25zIGZvciBzaW1pbGFyIGNvbnRlbnRcbiAgICogUEVSRk9STUFOQ0UgT1BUSU1JWkFUSU9OIChUYXNrICM4KTogRW5oYW5jZWQgYmF0Y2ggb3BlcmF0aW9uIGhhbmRsaW5nIHdpdGggY2xlYXIgcGFydGlhbCBmYWlsdXJlIHJlcG9ydGluZ1xuICAgKiBIZWxwcyB1c2VycyBmaW5kIGNvbnRlbnQgd2hlbiBleGFjdCBtYXRjaGVzIGZhaWxcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZ2VuZXJhdGVOYW1lU3VnZ2VzdGlvbnMoc2VhcmNoTmFtZTogc3RyaW5nKTogUHJvbWlzZTxBcnJheTx7bmFtZTogc3RyaW5nLCB0eXBlOiBzdHJpbmd9Pj4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBzdWdnZXN0aW9uczogQXJyYXk8e25hbWU6IHN0cmluZywgdHlwZTogc3RyaW5nfT4gPSBbXTtcbiAgICAgIGNvbnN0IHNlYXJjaExvd2VyID0gc2VhcmNoTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgY29uc3QgZWxlbWVudFR5cGVzID0gT2JqZWN0LnZhbHVlcyhFbGVtZW50VHlwZSk7XG4gICAgICBcbiAgICAgIC8vIFRyYWNrIGJhdGNoIG9wZXJhdGlvbiByZXN1bHRzIGZvciBiZXR0ZXIgZGlhZ25vc3RpY3NcbiAgICAgIGNvbnN0IGJhdGNoUmVzdWx0cyA9IHtcbiAgICAgICAgc2VhcmNoTmFtZSxcbiAgICAgICAgdG90YWxUeXBlczogZWxlbWVudFR5cGVzLmxlbmd0aCxcbiAgICAgICAgc3VjY2Vzc2Z1bFNjYW5zOiAwLFxuICAgICAgICBmYWlsZWRTY2FuczogMCxcbiAgICAgICAgZmFpbHVyZURldGFpbHM6IFtdIGFzIEFycmF5PHsgdHlwZTogRWxlbWVudFR5cGU7IGVycm9yOiBzdHJpbmcgfT4sXG4gICAgICAgIHRvdGFsU3VnZ2VzdGlvbnM6IDAsXG4gICAgICAgIHN1Z2dlc3Rpb25zQnlUeXBlOiB7fSBhcyBSZWNvcmQ8c3RyaW5nLCBudW1iZXI+XG4gICAgICB9O1xuICAgICAgXG4gICAgICAvLyBQcm9jZXNzIGFsbCBlbGVtZW50IHR5cGVzIGZvciBzdWdnZXN0aW9uc1xuICAgICAgZm9yIChjb25zdCBlbGVtZW50VHlwZSBvZiBlbGVtZW50VHlwZXMpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBwb3J0Zm9saW9NYW5hZ2VyID0gUG9ydGZvbGlvTWFuYWdlci5nZXRJbnN0YW5jZSgpO1xuICAgICAgICAgIGNvbnN0IGVsZW1lbnREaXIgPSBwb3J0Zm9saW9NYW5hZ2VyLmdldEVsZW1lbnREaXIoZWxlbWVudFR5cGUpO1xuICAgICAgICAgIFxuICAgICAgICAgIC8vIEdldCBmaWxlcyBpbiB0aGlzIGRpcmVjdG9yeVxuICAgICAgICAgIGNvbnN0IGZpbGVzID0gYXdhaXQgRmlsZURpc2NvdmVyeVV0aWwuZmluZEZpbGUoZWxlbWVudERpciwgJyonLCB7XG4gICAgICAgICAgICBleHRlbnNpb25zOiBbJy5tZCcsICcuanNvbicsICcueWFtbCcsICcueW1sJ10sXG4gICAgICAgICAgICBwYXJ0aWFsTWF0Y2g6IGZhbHNlLFxuICAgICAgICAgICAgY2FjaGVSZXN1bHRzOiB0cnVlXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgXG4gICAgICAgICAgbGV0IHR5cGVTdWdnZXN0aW9ucyA9IDA7XG4gICAgICAgICAgXG4gICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZmlsZXMpKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGZpbGVQYXRoIG9mIGZpbGVzKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGJhc2VuYW1lID0gcGF0aC5iYXNlbmFtZShmaWxlUGF0aCwgcGF0aC5leHRuYW1lKGZpbGVQYXRoKSk7XG4gICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAvLyBDYWxjdWxhdGUgc2ltaWxhcml0eSB1c2luZyBzaW1wbGUgbWV0cmljc1xuICAgICAgICAgICAgICBpZiAodGhpcy5jYWxjdWxhdGVTaW1pbGFyaXR5KHNlYXJjaExvd2VyLCBiYXNlbmFtZS50b0xvd2VyQ2FzZSgpKSA+IFNFQVJDSF9DT05GSUcuTUlOX1NJTUlMQVJJVFlfU0NPUkUpIHtcbiAgICAgICAgICAgICAgICBzdWdnZXN0aW9ucy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgIG5hbWU6IGJhc2VuYW1lLFxuICAgICAgICAgICAgICAgICAgdHlwZTogZWxlbWVudFR5cGVcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB0eXBlU3VnZ2VzdGlvbnMrKztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSBpZiAoZmlsZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IGJhc2VuYW1lID0gcGF0aC5iYXNlbmFtZShmaWxlcywgcGF0aC5leHRuYW1lKGZpbGVzKSk7XG4gICAgICAgICAgICBpZiAodGhpcy5jYWxjdWxhdGVTaW1pbGFyaXR5KHNlYXJjaExvd2VyLCBiYXNlbmFtZS50b0xvd2VyQ2FzZSgpKSA+IFNFQVJDSF9DT05GSUcuTUlOX1NJTUlMQVJJVFlfU0NPUkUpIHtcbiAgICAgICAgICAgICAgc3VnZ2VzdGlvbnMucHVzaCh7XG4gICAgICAgICAgICAgICAgbmFtZTogYmFzZW5hbWUsXG4gICAgICAgICAgICAgICAgdHlwZTogZWxlbWVudFR5cGVcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIHR5cGVTdWdnZXN0aW9ucysrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBcbiAgICAgICAgICBiYXRjaFJlc3VsdHMuc3VjY2Vzc2Z1bFNjYW5zKys7XG4gICAgICAgICAgYmF0Y2hSZXN1bHRzLnN1Z2dlc3Rpb25zQnlUeXBlW2VsZW1lbnRUeXBlXSA9IHR5cGVTdWdnZXN0aW9ucztcbiAgICAgICAgICBcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAvLyBQRVJGT1JNQU5DRSBPUFRJTUlaQVRJT04gKFRhc2sgIzgpOiBUcmFjayBhbmQgcmVwb3J0IHBhcnRpYWwgZmFpbHVyZXNcbiAgICAgICAgICBiYXRjaFJlc3VsdHMuZmFpbGVkU2NhbnMrKztcbiAgICAgICAgICBiYXRjaFJlc3VsdHMuZmFpbHVyZURldGFpbHMucHVzaCh7XG4gICAgICAgICAgICB0eXBlOiBlbGVtZW50VHlwZSxcbiAgICAgICAgICAgIGVycm9yOiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcilcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBcbiAgICAgICAgICAvLyBMb2cgaW5kaXZpZHVhbCBmYWlsdXJlcyBmb3IgZGlhZ25vc3RpY3NcbiAgICAgICAgICBsb2dnZXIuZGVidWcoJ0ZhaWxlZCB0byBzY2FuIGVsZW1lbnQgdHlwZSBmb3Igc3VnZ2VzdGlvbnMnLCB7XG4gICAgICAgICAgICBlbGVtZW50VHlwZSxcbiAgICAgICAgICAgIHNlYXJjaE5hbWUsXG4gICAgICAgICAgICBlcnJvcjogZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIFxuICAgICAgYmF0Y2hSZXN1bHRzLnRvdGFsU3VnZ2VzdGlvbnMgPSBzdWdnZXN0aW9ucy5sZW5ndGg7XG4gICAgICBcbiAgICAgIC8vIFBFUkZPUk1BTkNFIE9QVElNSVpBVElPTiAoVGFzayAjOCk6IENvbXByZWhlbnNpdmUgYmF0Y2ggb3BlcmF0aW9uIHJlcG9ydGluZ1xuICAgICAgbG9nZ2VyLmRlYnVnKCdOYW1lIHN1Z2dlc3Rpb24gYmF0Y2ggb3BlcmF0aW9uIGNvbXBsZXRlZCcsIHtcbiAgICAgICAgLi4uYmF0Y2hSZXN1bHRzLFxuICAgICAgICBzdWNjZXNzUmF0ZTogYCR7YmF0Y2hSZXN1bHRzLnN1Y2Nlc3NmdWxTY2Fuc30vJHtiYXRjaFJlc3VsdHMudG90YWxUeXBlc31gLFxuICAgICAgICAvLyBEb24ndCBsb2cgZnVsbCBmYWlsdXJlIGRldGFpbHMgYXQgZGVidWcgbGV2ZWwgdG8gYXZvaWQgc3BhbVxuICAgICAgICBoYXNGYWlsdXJlczogYmF0Y2hSZXN1bHRzLmZhaWxlZFNjYW5zID4gMFxuICAgICAgfSk7XG4gICAgICBcbiAgICAgIC8vIFJlcG9ydCBmYWlsdXJlcyBjbGVhcmx5IGlmIHRoZXkgb2NjdXJyZWRcbiAgICAgIGlmIChiYXRjaFJlc3VsdHMuZmFpbGVkU2NhbnMgPiAwKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKCdTb21lIGVsZW1lbnQgdHlwZSBzY2FucyBmYWlsZWQgZHVyaW5nIG5hbWUgc3VnZ2VzdGlvbiBnZW5lcmF0aW9uJywge1xuICAgICAgICAgIHNlYXJjaE5hbWUsXG4gICAgICAgICAgZmFpbGVkVHlwZXM6IGJhdGNoUmVzdWx0cy5mYWlsdXJlRGV0YWlscy5tYXAoZiA9PiBmLnR5cGUpLFxuICAgICAgICAgIHN1Y2Nlc3NmdWxUeXBlczogYmF0Y2hSZXN1bHRzLnN1Y2Nlc3NmdWxTY2FucyxcbiAgICAgICAgICBpbXBhY3RPblJlc3VsdHM6IGJhdGNoUmVzdWx0cy50b3RhbFN1Z2dlc3Rpb25zID4gMCBcbiAgICAgICAgICAgID8gJ1BhcnRpYWwgaW1wYWN0IC0gc3VnZ2VzdGlvbnMgZm91bmQgZnJvbSBzdWNjZXNzZnVsIHNjYW5zJyBcbiAgICAgICAgICAgIDogJ1BvdGVudGlhbCBpbXBhY3QgLSBubyBzdWdnZXN0aW9ucyBnZW5lcmF0ZWQnLFxuICAgICAgICAgIHJlY29tbWVuZGF0aW9uOiBiYXRjaFJlc3VsdHMudG90YWxTdWdnZXN0aW9ucyA9PT0gMCAmJiBiYXRjaFJlc3VsdHMuZmFpbGVkU2NhbnMgPiAwXG4gICAgICAgICAgICA/ICdDaGVjayBwb3J0Zm9saW8gZGlyZWN0b3J5IHN0cnVjdHVyZSBhbmQgZmlsZSBwZXJtaXNzaW9ucydcbiAgICAgICAgICAgIDogJ1N1Z2dlc3Rpb24gZ2VuZXJhdGlvbiBwYXJ0aWFsbHkgc3VjY2Vzc2Z1bCBkZXNwaXRlIHNvbWUgZmFpbHVyZXMnXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBTb3J0IGJ5IHNpbWlsYXJpdHkgKGhpZ2hlciBpcyBiZXR0ZXIpIGFuZCByZXR1cm4gdG9wIHN1Z2dlc3Rpb25zXG4gICAgICBjb25zdCBzb3J0ZWRTdWdnZXN0aW9ucyA9IHN1Z2dlc3Rpb25zLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgICAgY29uc3Qgc2ltQSA9IHRoaXMuY2FsY3VsYXRlU2ltaWxhcml0eShzZWFyY2hMb3dlciwgYS5uYW1lLnRvTG93ZXJDYXNlKCkpO1xuICAgICAgICBjb25zdCBzaW1CID0gdGhpcy5jYWxjdWxhdGVTaW1pbGFyaXR5KHNlYXJjaExvd2VyLCBiLm5hbWUudG9Mb3dlckNhc2UoKSk7XG4gICAgICAgIHJldHVybiBzaW1CIC0gc2ltQTtcbiAgICAgIH0pO1xuICAgICAgXG4gICAgICBsb2dnZXIuZGVidWcoJ05hbWUgc3VnZ2VzdGlvbnMgZ2VuZXJhdGVkIHN1Y2Nlc3NmdWxseScsIHtcbiAgICAgICAgc2VhcmNoTmFtZSxcbiAgICAgICAgdG90YWxTdWdnZXN0aW9uczogc29ydGVkU3VnZ2VzdGlvbnMubGVuZ3RoLFxuICAgICAgICB0b3BTdWdnZXN0aW9uczogc29ydGVkU3VnZ2VzdGlvbnMuc2xpY2UoMCwgMykubWFwKHMgPT4gcy5uYW1lKVxuICAgICAgfSk7XG4gICAgICBcbiAgICAgIHJldHVybiBzb3J0ZWRTdWdnZXN0aW9ucztcbiAgICAgIFxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2dnZXIud2FybignRmFpbGVkIHRvIGdlbmVyYXRlIG5hbWUgc3VnZ2VzdGlvbnMgLSBiYXRjaCBvcGVyYXRpb24gZmFpbGVkIGNvbXBsZXRlbHknLCB7IFxuICAgICAgICBzZWFyY2hOYW1lLCBcbiAgICAgICAgZXJyb3I6IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKSxcbiAgICAgICAgcmVjb21tZW5kYXRpb246ICdDaGVjayBwb3J0Zm9saW8gc3RydWN0dXJlIGFuZCBwZXJtaXNzaW9ucydcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgfVxuICBcbiAgLyoqXG4gICAqIFNpbXBsZSBzaW1pbGFyaXR5IGNhbGN1bGF0aW9uIHVzaW5nIExldmVuc2h0ZWluLWxpa2UgYXBwcm9hY2hcbiAgICogUmV0dXJucyB2YWx1ZSBiZXR3ZWVuIDAgYW5kIDEsIHdoZXJlIDEgaXMgaWRlbnRpY2FsXG4gICAqL1xuICBwcml2YXRlIGNhbGN1bGF0ZVNpbWlsYXJpdHkoc3RyMTogc3RyaW5nLCBzdHIyOiBzdHJpbmcpOiBudW1iZXIge1xuICAgIC8vIEhhbmRsZSBleGFjdCBtYXRjaGVzXG4gICAgaWYgKHN0cjEgPT09IHN0cjIpIHJldHVybiAxO1xuICAgIFxuICAgIC8vIEhhbmRsZSBzdWJzdHJpbmcgbWF0Y2hlc1xuICAgIGlmIChzdHIxLmluY2x1ZGVzKHN0cjIpIHx8IHN0cjIuaW5jbHVkZXMoc3RyMSkpIHJldHVybiAwLjg7XG4gICAgXG4gICAgLy8gSGFuZGxlIHBhcnRpYWwgbWF0Y2hlc1xuICAgIGNvbnN0IGxvbmdlciA9IHN0cjEubGVuZ3RoID4gc3RyMi5sZW5ndGggPyBzdHIxIDogc3RyMjtcbiAgICBjb25zdCBzaG9ydGVyID0gc3RyMS5sZW5ndGggPiBzdHIyLmxlbmd0aCA/IHN0cjIgOiBzdHIxO1xuICAgIFxuICAgIGlmIChsb25nZXIubGVuZ3RoID09PSAwKSByZXR1cm4gMDtcbiAgICBcbiAgICAvLyBDb3VudCBjb21tb24gY2hhcmFjdGVyc1xuICAgIGxldCBjb21tb24gPSAwO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2hvcnRlci5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKGxvbmdlci5pbmNsdWRlcyhzaG9ydGVyW2ldKSkge1xuICAgICAgICBjb21tb24rKztcbiAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgcmV0dXJuIGNvbW1vbiAvIGxvbmdlci5sZW5ndGg7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBVWCBJTVBST1ZFTUVOVDogU2F2ZSBlbGVtZW50IHdpdGggYXV0b21hdGljIHJldHJ5IGxvZ2ljIGZvciB0cmFuc2llbnQgZmFpbHVyZXNcbiAgICogSGFuZGxlcyBjb21tb24gR2l0SHViIEFQSSBpc3N1ZXMgbGlrZSByYXRlIGxpbWl0cyBhbmQgdGVtcG9yYXJ5IG5ldHdvcmsgcHJvYmxlbXNcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgc2F2ZUVsZW1lbnRXaXRoUmV0cnkoXG4gICAgYWRhcHRlcjogUG9ydGZvbGlvRWxlbWVudEFkYXB0ZXIsIFxuICAgIGVsZW1lbnROYW1lOiBzdHJpbmcsIFxuICAgIGVsZW1lbnRUeXBlOiBFbGVtZW50VHlwZSxcbiAgICBtYXhSZXRyaWVzOiBudW1iZXIgPSBSRVRSWV9DT05GSUcuTUFYX0FUVEVNUFRTXG4gICk6IFByb21pc2U8c3RyaW5nIHwgbnVsbD4ge1xuICAgIGxldCBsYXN0RXJyb3I6IGFueSA9IG51bGw7XG4gICAgXG4gICAgZm9yIChsZXQgYXR0ZW1wdCA9IDE7IGF0dGVtcHQgPD0gbWF4UmV0cmllczsgYXR0ZW1wdCsrKSB7XG4gICAgICB0cnkge1xuICAgICAgICBsb2dnZXIuZGVidWcoYEF0dGVtcHRpbmcgdG8gc2F2ZSBlbGVtZW50IChhdHRlbXB0ICR7YXR0ZW1wdH0vJHttYXhSZXRyaWVzfSlgLCB7XG4gICAgICAgICAgZWxlbWVudE5hbWUsXG4gICAgICAgICAgZWxlbWVudFR5cGUsXG4gICAgICAgICAgYXR0ZW1wdFxuICAgICAgICB9KTtcbiAgICAgICAgXG4gICAgICAgIGNvbnN0IGZpbGVVcmwgPSBhd2FpdCB0aGlzLnBvcnRmb2xpb01hbmFnZXIuc2F2ZUVsZW1lbnQoYWRhcHRlciwgdHJ1ZSk7XG4gICAgICAgIFxuICAgICAgICBpZiAoZmlsZVVybCkge1xuICAgICAgICAgIGlmIChhdHRlbXB0ID4gMSkge1xuICAgICAgICAgICAgbG9nZ2VyLmluZm8oYEVsZW1lbnQgc2F2ZWQgc3VjY2Vzc2Z1bGx5IGFmdGVyICR7YXR0ZW1wdH0gYXR0ZW1wdHNgLCB7XG4gICAgICAgICAgICAgIGVsZW1lbnROYW1lLFxuICAgICAgICAgICAgICBlbGVtZW50VHlwZSxcbiAgICAgICAgICAgICAgZmlsZVVybFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBmaWxlVXJsO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICAvLyBJZiBzYXZlRWxlbWVudCByZXR1cm5zIG51bGwsIHRyZWF0IGFzIGEgZmFpbHVyZSBidXQgZG9uJ3QgcmV0cnkgaW1tZWRpYXRlbHlcbiAgICAgICAgbGFzdEVycm9yID0gbmV3IEVycm9yKGBzYXZlRWxlbWVudCByZXR1cm5lZCBudWxsIG9uIGF0dGVtcHQgJHthdHRlbXB0fWApO1xuICAgICAgICBcbiAgICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgICAgbGFzdEVycm9yID0gZXJyb3I7XG4gICAgICAgIGNvbnN0IGlzUmV0cnlhYmxlID0gdGhpcy5pc1JldHJ5YWJsZUVycm9yKGVycm9yKTtcbiAgICAgICAgXG4gICAgICAgIGxvZ2dlci53YXJuKGBTYXZlIGF0dGVtcHQgJHthdHRlbXB0fSBmYWlsZWRgLCB7XG4gICAgICAgICAgZWxlbWVudE5hbWUsXG4gICAgICAgICAgZWxlbWVudFR5cGUsXG4gICAgICAgICAgYXR0ZW1wdCxcbiAgICAgICAgICBlcnJvcjogZXJyb3IubWVzc2FnZSxcbiAgICAgICAgICBpc1JldHJ5YWJsZSxcbiAgICAgICAgICB3aWxsUmV0cnk6IGlzUmV0cnlhYmxlICYmIGF0dGVtcHQgPCBtYXhSZXRyaWVzXG4gICAgICAgIH0pO1xuICAgICAgICBcbiAgICAgICAgLy8gSWYgdGhpcyBpcyBub3QgYSByZXRyeWFibGUgZXJyb3IsIGZhaWwgaW1tZWRpYXRlbHlcbiAgICAgICAgaWYgKCFpc1JldHJ5YWJsZSkge1xuICAgICAgICAgIGxvZ2dlci5lcnJvcignTm9uLXJldHJ5YWJsZSBlcnJvciBlbmNvdW50ZXJlZCwgYWJvcnRpbmcgcmV0cmllcycsIHtcbiAgICAgICAgICAgIGVsZW1lbnROYW1lLFxuICAgICAgICAgICAgZXJyb3I6IGVycm9yLm1lc3NhZ2VcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgLy8gSWYgd2UgaGF2ZSBtb3JlIGF0dGVtcHRzLCB3YWl0IGJlZm9yZSByZXRyeWluZ1xuICAgICAgICBpZiAoYXR0ZW1wdCA8IG1heFJldHJpZXMpIHtcbiAgICAgICAgICBjb25zdCBkZWxheSA9IGNhbGN1bGF0ZVJldHJ5RGVsYXkoYXR0ZW1wdCk7XG4gICAgICAgICAgbG9nZ2VyLmRlYnVnKGBXYWl0aW5nICR7ZGVsYXl9bXMgYmVmb3JlIHJldHJ5YCwgeyBhdHRlbXB0LCBkZWxheSB9KTtcbiAgICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgZGVsYXkpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBcbiAgICAvLyBBbGwgYXR0ZW1wdHMgZmFpbGVkXG4gICAgbG9nZ2VyLmVycm9yKGBBbGwgJHttYXhSZXRyaWVzfSBzYXZlIGF0dGVtcHRzIGZhaWxlZGAsIHtcbiAgICAgIGVsZW1lbnROYW1lLFxuICAgICAgZWxlbWVudFR5cGUsXG4gICAgICBsYXN0RXJyb3I6IGxhc3RFcnJvcj8ubWVzc2FnZVxuICAgIH0pO1xuICAgIFxuICAgIHJldHVybiBudWxsO1xuICB9XG4gIFxuICAvKipcbiAgICogRGV0ZXJtaW5lIGlmIGFuIGVycm9yIGlzIHdvcnRoIHJldHJ5aW5nXG4gICAqIFJldHJ5YWJsZTogbmV0d29yayBpc3N1ZXMsIHJhdGUgbGltaXRzLCB0ZW1wb3JhcnkgR2l0SHViIEFQSSBwcm9ibGVtc1xuICAgKiBOb24tcmV0cnlhYmxlOiBhdXRoZW50aWNhdGlvbiBpc3N1ZXMsIHZhbGlkYXRpb24gZXJyb3JzLCBwZXJtYW5lbnQgZmFpbHVyZXNcbiAgICovXG4gIHByaXZhdGUgaXNSZXRyeWFibGVFcnJvcihlcnJvcjogYW55KTogYm9vbGVhbiB7XG4gICAgY29uc3QgZXJyb3JNZXNzYWdlID0gZXJyb3I/Lm1lc3NhZ2U/LnRvTG93ZXJDYXNlKCkgfHwgJyc7XG4gICAgY29uc3QgZXJyb3JDb2RlID0gZXJyb3I/LmNvZGU7XG4gICAgY29uc3Qgc3RhdHVzQ29kZSA9IGVycm9yPy5zdGF0dXMgfHwgZXJyb3I/LnN0YXR1c0NvZGU7XG4gICAgXG4gICAgLy8gTmV0d29yayBhbmQgdGltZW91dCBlcnJvcnNcbiAgICBpZiAoZXJyb3JDb2RlID09PSAnRU5PVEZPVU5EJyB8fCBlcnJvckNvZGUgPT09ICdFQ09OTlJFU0VUJyB8fCBlcnJvckNvZGUgPT09ICdFVElNRURPVVQnKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgXG4gICAgLy8gR2l0SHViIEFQSSByYXRlIGxpbWl0c1xuICAgIGlmIChzdGF0dXNDb2RlID09PSA0MjkgfHwgZXJyb3JNZXNzYWdlLmluY2x1ZGVzKCdyYXRlIGxpbWl0JykpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBcbiAgICAvLyBUZW1wb3JhcnkgR2l0SHViIEFQSSBpc3N1ZXNcbiAgICBpZiAoc3RhdHVzQ29kZSA+PSA1MDAgJiYgc3RhdHVzQ29kZSA8IDYwMCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIFxuICAgIC8vIFRlbXBvcmFyeSBHaXRIdWIgQVBJIHByb2JsZW1zXG4gICAgaWYgKGVycm9yTWVzc2FnZS5pbmNsdWRlcygndGVtcG9yYXJpbHkgdW5hdmFpbGFibGUnKSB8fCBcbiAgICAgICAgZXJyb3JNZXNzYWdlLmluY2x1ZGVzKCdzZXJ2aWNlIHVuYXZhaWxhYmxlJykgfHxcbiAgICAgICAgZXJyb3JNZXNzYWdlLmluY2x1ZGVzKCdpbnRlcm5hbCBzZXJ2ZXIgZXJyb3InKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIFxuICAgIC8vIENvbm5lY3Rpb24gaXNzdWVzXG4gICAgaWYgKGVycm9yTWVzc2FnZS5pbmNsdWRlcygnY29ubmVjdGlvbicpICYmIFxuICAgICAgICAoZXJyb3JNZXNzYWdlLmluY2x1ZGVzKCd0aW1lb3V0JykgfHwgZXJyb3JNZXNzYWdlLmluY2x1ZGVzKCdyZXNldCcpKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIFxuICAgIC8vIERvbid0IHJldHJ5IGF1dGhlbnRpY2F0aW9uIG9yIHBlcm1pc3Npb24gaXNzdWVzXG4gICAgaWYgKHN0YXR1c0NvZGUgPT09IDQwMSB8fCBzdGF0dXNDb2RlID09PSA0MDMgfHwgXG4gICAgICAgIGVycm9yTWVzc2FnZS5pbmNsdWRlcygndW5hdXRob3JpemVkJykgfHwgXG4gICAgICAgIGVycm9yTWVzc2FnZS5pbmNsdWRlcygnZm9yYmlkZGVuJykgfHxcbiAgICAgICAgZXJyb3JNZXNzYWdlLmluY2x1ZGVzKCdhdXRoZW50aWNhdGlvbicpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIFxuICAgIC8vIERvbid0IHJldHJ5IHZhbGlkYXRpb24gZXJyb3JzXG4gICAgaWYgKHN0YXR1c0NvZGUgPT09IDQwMCB8fCBzdGF0dXNDb2RlID09PSA0MjIgfHxcbiAgICAgICAgZXJyb3JNZXNzYWdlLmluY2x1ZGVzKCdpbnZhbGlkJykgfHxcbiAgICAgICAgZXJyb3JNZXNzYWdlLmluY2x1ZGVzKCd2YWxpZGF0aW9uJykpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgXG4gICAgLy8gRGVmYXVsdCB0byBub3QgcmV0cnlpbmcgZm9yIHVua25vd24gZXJyb3JzIHRvIGF2b2lkIGluZmluaXRlIGxvb3BzXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59Il19
|