@dollhousemcp/mcp-server 1.9.13 → 1.9.15
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 +48 -0
- package/README.github.md +54 -0
- package/README.md.backup +1241 -49
- package/dist/cache/CollectionCache.js +2 -2
- package/dist/collection/CollectionIndexManager.js +3 -3
- package/dist/config/ConfigWizard.js +3 -3
- package/dist/config/indicator-config.js +2 -2
- package/dist/config/portfolio-constants.js +12 -12
- package/dist/elements/BaseElement.js +7 -7
- package/dist/elements/FeedbackProcessor.d.ts +7 -0
- package/dist/elements/FeedbackProcessor.d.ts.map +1 -1
- package/dist/elements/FeedbackProcessor.js +67 -14
- package/dist/elements/agents/AgentManager.js +6 -6
- package/dist/elements/memories/Memory.js +4 -4
- package/dist/elements/memories/MemoryManager.js +3 -3
- package/dist/elements/memories/utils.js +3 -3
- package/dist/elements/skills/Skill.js +2 -2
- package/dist/elements/skills/SkillManager.js +2 -2
- package/dist/elements/templates/Template.d.ts.map +1 -1
- package/dist/elements/templates/Template.js +38 -14
- package/dist/elements/templates/TemplateManager.js +2 -2
- package/dist/generated/version.d.ts +2 -2
- package/dist/generated/version.js +3 -3
- package/dist/handlers/ConfigHandler.js +3 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +20 -16
- package/dist/persona/PersonaElementManager.js +3 -3
- package/dist/persona/PersonaManager.js +2 -2
- package/dist/persona/export-import/PersonaImporter.js +3 -3
- package/dist/portfolio/DefaultElementProvider.d.ts +12 -0
- package/dist/portfolio/DefaultElementProvider.d.ts.map +1 -1
- package/dist/portfolio/DefaultElementProvider.js +23 -6
- package/dist/portfolio/GitHubPortfolioIndexer.js +2 -2
- package/dist/portfolio/MigrationManager.js +2 -2
- package/dist/portfolio/NLPScoringManager.js +2 -2
- package/dist/portfolio/PortfolioManager.d.ts +5 -0
- package/dist/portfolio/PortfolioManager.d.ts.map +1 -1
- package/dist/portfolio/PortfolioManager.js +8 -1
- package/dist/portfolio/PortfolioRepoManager.js +2 -2
- package/dist/portfolio/PortfolioSyncManager.js +5 -5
- package/dist/portfolio/RelationshipManager.js +4 -4
- package/dist/portfolio/UnifiedIndexManager.js +4 -4
- package/dist/portfolio/types/RelationshipTypes.js +2 -2
- package/dist/security/InputValidator.d.ts +12 -0
- package/dist/security/InputValidator.d.ts.map +1 -1
- package/dist/security/InputValidator.js +38 -18
- package/dist/security/audit/config/suppressions.js +10 -10
- package/dist/security/commandValidator.js +2 -2
- package/dist/security/dosProtection.d.ts +123 -0
- package/dist/security/dosProtection.d.ts.map +1 -0
- package/dist/security/dosProtection.js +392 -0
- package/dist/security/pathValidator.js +2 -2
- package/dist/security/secureYamlParser.d.ts.map +1 -1
- package/dist/security/secureYamlParser.js +4 -3
- package/dist/security/tokenManager.js +10 -10
- package/dist/security/validators/unicodeValidator.js +2 -2
- package/dist/security/yamlValidator.js +3 -3
- package/dist/sync/PortfolioDownloader.js +2 -2
- package/dist/sync/PortfolioSyncComparer.js +2 -2
- package/dist/tools/portfolio/PortfolioElementAdapter.js +3 -3
- package/dist/tools/portfolio/submitToPortfolioTool.js +14 -14
- package/dist/utils/EarlyTerminationSearch.d.ts +1 -1
- package/dist/utils/EarlyTerminationSearch.d.ts.map +1 -1
- package/dist/utils/EarlyTerminationSearch.js +3 -3
- package/dist/utils/ElementFormatter.d.ts +1 -0
- package/dist/utils/ElementFormatter.d.ts.map +1 -1
- package/dist/utils/ElementFormatter.js +21 -13
- package/dist/utils/GitHubRateLimiter.d.ts +6 -0
- package/dist/utils/GitHubRateLimiter.d.ts.map +1 -1
- package/dist/utils/GitHubRateLimiter.js +20 -5
- package/dist/utils/RateLimiter.js +2 -2
- package/dist/utils/SecureDownloader.js +2 -2
- package/dist/utils/fileOperations.d.ts +6 -1
- package/dist/utils/fileOperations.d.ts.map +1 -1
- package/dist/utils/fileOperations.js +29 -5
- package/dist/utils/filesystem.js +6 -6
- package/dist/utils/searchUtils.js +2 -2
- package/dist/utils/version.js +3 -3
- package/package.json +1 -1
|
@@ -173,9 +173,9 @@ export class SubmitToPortfolioTool {
|
|
|
173
173
|
message += `1. 📝 Use \`list_portfolio\` to see all available content\n`;
|
|
174
174
|
message += `2. 🔍 Check exact spelling and try variations:\n`;
|
|
175
175
|
message += ` • "${(originalName || safeName).toLowerCase()}" (lowercase)\n`;
|
|
176
|
-
message += ` • "${(originalName || safeName).
|
|
176
|
+
message += ` • "${(originalName || safeName).replaceAll(/[^a-z0-9]/gi, '-').toLowerCase()}" (normalized)\n`;
|
|
177
177
|
if ((originalName || safeName).includes('.')) {
|
|
178
|
-
message += ` • "${(originalName || safeName).
|
|
178
|
+
message += ` • "${(originalName || safeName).replaceAll('.', '')}" (no dots)\n`;
|
|
179
179
|
}
|
|
180
180
|
message += `3. 🎯 Specify element type: \`submit_collection_content "${originalName || safeName}" --type=personas\`\n`;
|
|
181
181
|
message += `4. 📁 Check if file exists in portfolio directories\n\n`;
|
|
@@ -650,7 +650,7 @@ export class SubmitToPortfolioTool {
|
|
|
650
650
|
let normalizedPath;
|
|
651
651
|
try {
|
|
652
652
|
// Remove null bytes and normalize
|
|
653
|
-
const cleanPath = filePath.
|
|
653
|
+
const cleanPath = filePath.replaceAll(/\u0000/g, ''); // NOSONAR - Removing null bytes for security
|
|
654
654
|
normalizedPath = path.normalize(cleanPath);
|
|
655
655
|
// Check if path is within the portfolio directory
|
|
656
656
|
const portfolioManager = PortfolioManager.getInstance();
|
|
@@ -1540,15 +1540,15 @@ ${elementContent}
|
|
|
1540
1540
|
operation: 'create-collection-issue',
|
|
1541
1541
|
remaining: rateLimitRemaining,
|
|
1542
1542
|
limit: rateLimitLimit,
|
|
1543
|
-
resetTime: rateLimitReset ? new Date(parseInt(rateLimitReset) * 1000) : undefined,
|
|
1543
|
+
resetTime: rateLimitReset ? new Date(Number.parseInt(rateLimitReset) * 1000) : undefined,
|
|
1544
1544
|
responseStatus: response.status
|
|
1545
1545
|
});
|
|
1546
1546
|
// Log warning if approaching rate limit
|
|
1547
|
-
if (rateLimitRemaining && parseInt(rateLimitRemaining) < 100) {
|
|
1547
|
+
if (rateLimitRemaining && Number.parseInt(rateLimitRemaining) < 100) {
|
|
1548
1548
|
logger.warn('Approaching GitHub API rate limit', {
|
|
1549
1549
|
operation: 'create-collection-issue',
|
|
1550
1550
|
remaining: rateLimitRemaining,
|
|
1551
|
-
resetTime: rateLimitReset ? new Date(parseInt(rateLimitReset) * 1000) : undefined,
|
|
1551
|
+
resetTime: rateLimitReset ? new Date(Number.parseInt(rateLimitReset) * 1000) : undefined,
|
|
1552
1552
|
recommendation: 'Consider reducing API usage frequency or authenticating for higher limits'
|
|
1553
1553
|
});
|
|
1554
1554
|
}
|
|
@@ -1634,9 +1634,9 @@ ${elementContent}
|
|
|
1634
1634
|
// If not found, try normalizing the name (e.g., "J.A.R.V.I.S." -> "j-a-r-v-i-s")
|
|
1635
1635
|
if (!file) {
|
|
1636
1636
|
const normalizedName = name.toLowerCase()
|
|
1637
|
-
.
|
|
1638
|
-
.
|
|
1639
|
-
.
|
|
1637
|
+
.replaceAll(/[^a-z0-9]/gi, '-') // Replace non-alphanumeric with dashes
|
|
1638
|
+
.replaceAll(/-+/g, '-') // Replace multiple dashes with single dash
|
|
1639
|
+
.replaceAll(/(^-)|(-$)/g, ''); // Remove leading/trailing dashes
|
|
1640
1640
|
if (normalizedName !== name.toLowerCase()) {
|
|
1641
1641
|
logger.debug('Trying normalized name search', {
|
|
1642
1642
|
original: name,
|
|
@@ -1654,10 +1654,10 @@ ${elementContent}
|
|
|
1654
1654
|
if (!file) {
|
|
1655
1655
|
// Try common variations like removing dots, spaces, etc.
|
|
1656
1656
|
const variations = [
|
|
1657
|
-
name.
|
|
1658
|
-
name.
|
|
1659
|
-
name.
|
|
1660
|
-
name.
|
|
1657
|
+
name.replaceAll('.', ''), // Remove dots: "J.A.R.V.I.S." -> "JARVIS"
|
|
1658
|
+
name.replaceAll(/\s+/g, '-'), // Replace spaces with dashes
|
|
1659
|
+
name.replaceAll(/[\s\.]/g, ''), // Remove spaces and dots
|
|
1660
|
+
name.replaceAll(/[\s\.]/g, '-'), // Replace spaces and dots with dashes
|
|
1661
1661
|
].filter(v => v !== name && v.length > 0);
|
|
1662
1662
|
for (const variation of variations) {
|
|
1663
1663
|
file = await FileDiscoveryUtil.findFile(portfolioDir, variation, {
|
|
@@ -2056,4 +2056,4 @@ ${elementContent}
|
|
|
2056
2056
|
return false;
|
|
2057
2057
|
}
|
|
2058
2058
|
}
|
|
2059
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3VibWl0VG9Qb3J0Zm9saW9Ub29sLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3Rvb2xzL3BvcnRmb2xpby9zdWJtaXRUb1BvcnRmb2xpb1Rvb2wudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7O0dBUUc7QUFFSCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sUUFBUSxDQUFDO0FBQ3BDLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ3BFLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLHlDQUF5QyxDQUFDO0FBQy9FLE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQzdFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUM5RCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUN0RSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUN2RSxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSwwQ0FBMEMsQ0FBQztBQUNqRixPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDdkQsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQy9DLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLCtDQUErQyxDQUFDO0FBQ2pGLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUVwRSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUN2RSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUNyRSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDM0QsT0FBTyxFQUNMLGdCQUFnQixFQUNoQixZQUFZLEVBQ1osYUFBYSxFQUViLG1CQUFtQixFQUNuQixtQkFBbUIs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QVEsQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDO1lBQ3hDLE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQztRQUVELHFFQUFxRTtRQUNyRSxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogVG9vbCBmb3Igc3VibWl0dGluZyBjb250ZW50IHRvIEdpdEh1YiBwb3J0Zm9saW8gcmVwb3NpdG9yaWVzXG4gKiBSZXBsYWNlcyB0aGUgYnJva2VuIGlzc3VlLWJhc2VkIHN1Ym1pc3Npb24gd2l0aCBkaXJlY3QgcmVwb3NpdG9yeSBzYXZlc1xuICogXG4gKiBGSVhFUyBJTVBMRU1FTlRFRCAoUFIgIzUwMyk6XG4gKiAxLiBUWVBFIFNBRkVUWSBGSVggIzEgKElzc3VlICM0OTcpOiBDaGFuZ2VkIGFwaUNhY2hlIGZyb20gJ2FueScgdG8gcHJvcGVyIEFQSUNhY2hlIHR5cGVcbiAqIDIuIFRZUEUgU0FGRVRZIEZJWCAjMiAoSXNzdWUgIzQ5Nyk6IFJlcGxhY2VkIGNvbXBsZXggdHlwZSBjYXN0aW5nIHdpdGggUG9ydGZvbGlvRWxlbWVudEFkYXB0ZXJcbiAqIDMuIFBFUkZPUk1BTkNFIChQUiAjNDk2IHJlY29tbWVuZGF0aW9uKTogVXNpbmcgRmlsZURpc2NvdmVyeVV0aWwgZm9yIG9wdGltaXplZCBmaWxlIHNlYXJjaFxuICovXG5cbmltcG9ydCB7IGNyZWF0ZUhhc2ggfSBmcm9tICdjcnlwdG8nO1xuaW1wb3J0IHsgR2l0SHViQXV0aE1hbmFnZXIgfSBmcm9tICcuLi8uLi9hdXRoL0dpdEh1YkF1dGhNYW5hZ2VyLmpzJztcbmltcG9ydCB7IFBvcnRmb2xpb1JlcG9NYW5hZ2VyIH0gZnJvbSAnLi4vLi4vcG9ydGZvbGlvL1BvcnRmb2xpb1JlcG9NYW5hZ2VyLmpzJztcbmltcG9ydCB7IGdldFBvcnRmb2xpb1JlcG9zaXRvcnlOYW1lIH0gZnJvbSAnLi4vLi4vY29uZmlnL3BvcnRmb2xpb0NvbmZpZy5qcyc7XG5pbXBvcnQgeyBUb2tlbk1hbmFnZXIgfSBmcm9tICcuLi8uLi9zZWN1cml0eS90b2tlbk1hbmFnZXIuanMnO1xuaW1wb3J0IHsgQ29udGVudFZhbGlkYXRvciB9IGZyb20gJy4uLy4uL3NlY3VyaXR5L2NvbnRlbnRWYWxpZGF0b3IuanMnO1xuaW1wb3J0IHsgUG9ydGZvbGlvTWFuYWdlciB9IGZyb20gJy4uLy4uL3BvcnRmb2xpby9Qb3J0Zm9saW9NYW5hZ2VyLmpzJztcbmltcG9ydCB7IFBvcnRmb2xpb0luZGV4TWFuYWdlciB9IGZyb20gJy4uLy4uL3BvcnRmb2xpby9Qb3J0Zm9saW9JbmRleE1hbmFnZXIuanMnO1xuaW1wb3J0IHsgRWxlbWVudFR5cGUgfSBmcm9tICcuLi8uLi9wb3J0Zm9saW8vdHlwZXMuanMnO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vLi4vdXRpbHMvbG9nZ2VyLmpzJztcbmltcG9ydCB7IFVuaWNvZGVWYWxpZGF0b3IgfSBmcm9tICcuLi8uLi9zZWN1cml0eS92YWxpZGF0b3JzL3VuaWNvZGVWYWxpZGF0b3IuanMnO1xuaW1wb3J0IHsgU2VjdXJpdHlNb25pdG9yIH0gZnJvbSAnLi4vLi4vc2VjdXJpdHkvc2VjdXJpdHlNb25pdG9yLmpzJztcbmltcG9ydCB7IEFQSUNhY2hlIH0gZnJvbSAnLi4vLi4vY2FjaGUvQVBJQ2FjaGUuanMnO1xuaW1wb3J0IHsgUG9ydGZvbGlvRWxlbWVudEFkYXB0ZXIgfSBmcm9tICcuL1BvcnRmb2xpb0VsZW1lbnRBZGFwdGVyLmpzJztcbmltcG9ydCB7IEZpbGVEaXNjb3ZlcnlVdGlsIH0gZnJvbSAnLi4vLi4vdXRpbHMvRmlsZURpc2NvdmVyeVV0aWwuanMnO1xuaW1wb3J0IHsgRXJyb3JIYW5kbGVyIH0gZnJvbSAnLi4vLi4vdXRpbHMvRXJyb3JIYW5kbGVyLmpzJztcbmltcG9ydCB7IFxuICBGSUxFX1NJWkVfTElNSVRTLCBcbiAgUkVUUllfQ09ORklHLCBcbiAgU0VBUkNIX0NPTkZJRyxcbiAgUG9ydGZvbGlvRWxlbWVudE1ldGFkYXRhLFxuICBnZXRWYWxpZGF0ZWRUaW1lb3V0LFxuICBjYWxjdWxhdGVSZXRyeURlbGF5XG59IGZyb20gJy4uLy4uL2NvbmZpZy9wb3J0Zm9saW8tY29uc3RhbnRzLmpzJztcbmltcG9ydCB7IGdpdGh1YlJhdGVMaW1pdGVyIH0gZnJvbSAnLi4vLi4vdXRpbHMvR2l0SHViUmF0ZUxpbWl0ZXIuanMnO1xuaW1wb3J0IHsgRWFybHlUZXJtaW5hdGlvblNlYXJjaCB9IGZyb20gJy4uLy4uL3V0aWxzL0Vhcmx5VGVybWluYXRpb25TZWFyY2guanMnO1xuaW1wb3J0IHsgQ29sbGVjdGlvbkVycm9yQ29kZSwgZm9ybWF0Q29sbGVjdGlvbkVycm9yIH0gZnJvbSAnLi4vLi4vY29uZmlnL2Vycm9yLWNvZGVzLmpzJztcbmltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgKiBhcyBmcyBmcm9tICdmcy9wcm9taXNlcyc7XG5pbXBvcnQgeyBTZWN1cmVZYW1sUGFyc2VyIH0gZnJvbSAnLi4vLi4vc2VjdXJpdHkvc2VjdXJlWWFtbFBhcnNlci5qcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3VibWl0VG9Qb3J0Zm9saW9QYXJhbXMge1xuICBuYW1lOiBzdHJpbmc7XG4gIHR5cGU/OiBFbGVtZW50VHlwZTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQb3J0Zm9saW9FbGVtZW50IHtcbiAgdHlwZTogRWxlbWVudFR5cGU7XG4gIG1ldGFkYXRhOiBQb3J0Zm9saW9FbGVtZW50TWV0YWRhdGE7XG4gIGNvbnRlbnQ6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTdWJtaXRUb1BvcnRmb2xpb1Jlc3VsdCB7XG4gIHN1Y2Nlc3M6IGJvb2xlYW47XG4gIG1lc3NhZ2U6IHN0cmluZztcbiAgdXJsPzogc3RyaW5nO1xuICBlcnJvcj86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBFbGVtZW50RGV0ZWN0aW9uTWF0Y2gge1xuICB0eXBlOiBFbGVtZW50VHlwZTtcbiAgcGF0aDogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEVsZW1lbnREZXRlY3Rpb25SZXN1bHQge1xuICBmb3VuZDogYm9vbGVhbjtcbiAgbWF0Y2hlczogRWxlbWVudERldGVjdGlvbk1hdGNoW107XG59XG5cbi8vIFdvcmtmbG93IHN0ZXAgY29uc3RhbnRzIGZvciBjb25zaXN0ZW50IGxvZ2dpbmdcbmNvbnN0IFdPUktGTE9XX1NURVBTID0ge1xuICBWQUxJREFUSU9OOiAxLFxuICBBVVRIRU5USUNBVElPTjogMixcbiAgQ09OVEVOVF9ESVNDT1ZFUlk6IDMsXG4gIFNFQ1VSSVRZOiA0LFxuICBNRVRBREFUQTogNSxcbiAgUkVQT19TRVRVUDogNixcbiAgU1VCTUlTU0lPTjogNyxcbiAgUkVQT1JUSU5HOiA4LFxuICBUT1RBTDogOFxufSBhcyBjb25zdDtcblxuLy8gTG9nZ2luZyBjb25maWd1cmF0aW9uXG5jb25zdCBMT0dHSU5HX0NPTkZJRyA9IHtcbiAgLy8gU2V0IERPTExIT1VTRV9WRVJCT1NFX0xPR0dJTkc9dHJ1ZSBmb3IgZGV0YWlsZWQgc3RlcC1ieS1zdGVwIGxvZ3NcbiAgaXNWZXJib3NlOiBwcm9jZXNzLmVudi5ET0xMSE9VU0VfVkVSQk9TRV9MT0dHSU5HPy50b0xvd2VyQ2FzZSgpID09PSAndHJ1ZScsXG4gIC8vIFNldCBET0xMSE9VU0VfTE9HX1RJTUlORz10cnVlIGZvciB0aW1pbmcgbWVhc3VyZW1lbnRzXG4gIHNob3VsZExvZ1RpbWluZzogcHJvY2Vzcy5lbnYuRE9MTEhPVVNFX0xPR19USU1JTkc/LnRvTG93ZXJDYXNlKCkgPT09ICd0cnVlJyB8fCBcbiAgICAgICAgICAgICAgICAgICBwcm9jZXNzLmVudi5ET0xMSE9VU0VfVkVSQk9TRV9MT0dHSU5HPy50b0xvd2VyQ2FzZSgpID09PSAndHJ1ZSdcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCBjbGFzcyBTdWJtaXRUb1BvcnRmb2xpb1Rvb2wge1xuICBwcml2YXRlIGF1dGhNYW5hZ2VyOiBHaXRIdWJBdXRoTWFuYWdlcjtcbiAgcHJpdmF0ZSBwb3J0Zm9saW9NYW5hZ2VyOiBQb3J0Zm9saW9SZXBvTWFuYWdlcjtcblxuICBjb25zdHJ1Y3RvcihhcGlDYWNoZTogQVBJQ2FjaGUpIHtcbiAgICAvLyBUWVBFIFNBRkVUWSBGSVggIzE6IFByb3BlciB0eXBpbmcgZm9yIGFwaUNhY2hlIHBhcmFtZXRlclxuICAgIC8vIFByZXZpb3VzbHk6IGNvbnN0cnVjdG9yKGFwaUNhY2hlOiBhbnkpXG4gICAgLy8gTm93OiBjb25zdHJ1Y3RvcihhcGlDYWNoZTogQVBJQ2FjaGUpIHdpdGggcHJvcGVyIGltcG9ydFxuICAgIHRoaXMuYXV0aE1hbmFnZXIgPSBuZXcgR2l0SHViQXV0aE1hbmFnZXIoYXBpQ2FjaGUpO1xuICAgIHRoaXMucG9ydGZvbGlvTWFuYWdlciA9IG5ldyBQb3J0Zm9saW9SZXBvTWFuYWdlcihnZXRQb3J0Zm9saW9SZXBvc2l0b3J5TmFtZSgpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZXMgYW5kIG5vcm1hbGl6ZXMgaW5wdXQgcGFyYW1ldGVycyB0byBwcmV2ZW50IFVuaWNvZGUgYXR0YWNrcyBhbmQgZW5zdXJlIGRhdGEgc2FmZXR5XG4gICAqIEBwYXJhbSBwYXJhbXMgVGhlIGlucHV0IHBhcmFtZXRlcnMgZnJvbSB0aGUgdXNlclxuICAgKiBAcmV0dXJucyBWYWxpZGF0aW9uIHJlc3VsdCB3aXRoIG5vcm1hbGl6ZWQgbmFtZSBvciBlcnJvciByZXNwb25zZVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyB2YWxpZGF0ZUFuZE5vcm1hbGl6ZVBhcmFtcyhwYXJhbXM6IFN1Ym1pdFRvUG9ydGZvbGlvUGFyYW1zKTogUHJvbWlzZTx7XG4gICAgc3VjY2VzczogYm9vbGVhbjtcbiAgICBzYWZlTmFtZT86IHN0cmluZztcbiAgICBlcnJvcj86IFN1Ym1pdFRvUG9ydGZvbGlvUmVzdWx0O1xuICB9PiB7XG4gICAgLy8gTm9ybWFsaXplIHVzZXIgaW5wdXQgdG8gcHJldmVudCBVbmljb2RlIGF0dGFja3MgKERNQ1AtU0VDLTAwNClcbiAgICBjb25zdCBub3JtYWxpemVkTmFtZSA9IFVuaWNvZGVWYWxpZGF0b3Iubm9ybWFsaXplKHBhcmFtcy5uYW1lKTtcbiAgICBpZiAoIW5vcm1hbGl6ZWROYW1lLmlzVmFsaWQpIHtcbiAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgdHlwZTogJ1VOSUNPREVfVkFMSURBVElPTl9FUlJPUicsXG4gICAgICAgIHNldmVyaXR5OiAnTUVESVVNJyxcbiAgICAgICAgc291cmNlOiAnU3VibWl0VG9Qb3J0Zm9saW9Ub29sLmV4ZWN1dGUnLFxuICAgICAgICBkZXRhaWxzOiBgSW52YWxpZCBVbmljb2RlIGluIGVsZW1lbnQgbmFtZTogJHtub3JtYWxpemVkTmFtZS5kZXRlY3RlZElzc3Vlcz8uWzBdIHx8ICd1bmtub3duIGVycm9yJ31gXG4gICAgICB9KTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICBlcnJvcjoge1xuICAgICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICAgIG1lc3NhZ2U6IGBJbnZhbGlkIGNoYXJhY3RlcnMgaW4gZWxlbWVudCBuYW1lOiAke25vcm1hbGl6ZWROYW1lLmRldGVjdGVkSXNzdWVzPy5bMF0gfHwgJ3Vua25vd24gZXJyb3InfWAsXG4gICAgICAgICAgZXJyb3I6ICdJTlZBTElEX0lOUFVUJ1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH1cbiAgICBcbiAgICByZXR1cm4ge1xuICAgICAgc3VjY2VzczogdHJ1ZSxcbiAgICAgIHNhZmVOYW1lOiBub3JtYWxpemVkTmFtZS5ub3JtYWxpemVkQ29udGVudFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIGlmIHRoZSB1c2VyIGlzIGF1dGhlbnRpY2F0ZWQgd2l0aCBHaXRIdWJcbiAgICogQHJldHVybnMgQXV0aGVudGljYXRpb24gY2hlY2sgcmVzdWx0IHdpdGggc3RhdHVzIG9yIGVycm9yIHJlc3BvbnNlXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGNoZWNrQXV0aGVudGljYXRpb24oKTogUHJvbWlzZTx7XG4gICAgc3VjY2VzczogYm9vbGVhbjtcbiAgICBhdXRoU3RhdHVzPzogYW55O1xuICAgIGVycm9yPzogU3VibWl0VG9Qb3J0Zm9saW9SZXN1bHQ7XG4gIH0+IHtcbiAgICBjb25zdCBhdXRoU3RhdHVzID0gYXdhaXQgdGhpcy5hdXRoTWFuYWdlci5nZXRBdXRoU3RhdHVzKCk7XG4gICAgaWYgKCFhdXRoU3RhdHVzLmlzQXV0aGVudGljYXRlZCkge1xuICAgICAgLy8gTG9nIGF1dGhlbnRpY2F0aW9uIHJlcXVpcmVkICh1c2luZyBleGlzdGluZyBldmVudCB0eXBlKVxuICAgICAgbG9nZ2VyLndhcm4oJ1VzZXIgYXR0ZW1wdGVkIHBvcnRmb2xpbyBzdWJtaXNzaW9uIHdpdGhvdXQgYXV0aGVudGljYXRpb24nKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICBlcnJvcjoge1xuICAgICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICAgIG1lc3NhZ2U6ICdOb3QgYXV0aGVudGljYXRlZC4gUGxlYXNlIGF1dGhlbnRpY2F0ZSBmaXJzdCB1c2luZyB0aGUgR2l0SHViIE9BdXRoIGZsb3cuXFxuXFxuJyArXG4gICAgICAgICAgICAgICAgICAgJ1Zpc2l0OiBodHRwczovL2RvY3MuYW50aHJvcGljLmNvbS9lbi9kb2NzL2NsYXVkZS1jb2RlL29hdXRoLXNldHVwXFxuJyArXG4gICAgICAgICAgICAgICAgICAgJ09yIHJ1bjogZ2ggYXV0aCBsb2dpbiAtLXdlYicsXG4gICAgICAgICAgZXJyb3I6ICdOT1RfQVVUSEVOVElDQVRFRCdcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgc3VjY2VzczogdHJ1ZSxcbiAgICAgIGF1dGhTdGF0dXNcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIERpc2NvdmVycyBjb250ZW50IGxvY2FsbHkgd2l0aCBzbWFydCB0eXBlIGRldGVjdGlvblxuICAgKiBAcGFyYW0gc2FmZU5hbWUgVGhlIG5vcm1hbGl6ZWQgbmFtZSB0byBzZWFyY2ggZm9yXG4gICAqIEBwYXJhbSBleHBsaWNpdFR5cGUgT3B0aW9uYWwgZXhwbGljaXQgZWxlbWVudCB0eXBlIHByb3ZpZGVkIGJ5IHVzZXJcbiAgICogQHBhcmFtIG9yaWdpbmFsTmFtZSBPcmlnaW5hbCB1c2VyLXByb3ZpZGVkIG5hbWUgZm9yIGVycm9yIG1lc3NhZ2VzXG4gICAqIEByZXR1cm5zIENvbnRlbnQgZGlzY292ZXJ5IHJlc3VsdCB3aXRoIGVsZW1lbnQgdHlwZSBhbmQgcGF0aCBvciBlcnJvciByZXNwb25zZVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBkaXNjb3ZlckNvbnRlbnRXaXRoVHlwZURldGVjdGlvbihcbiAgICBzYWZlTmFtZTogc3RyaW5nLCBcbiAgICBleHBsaWNpdFR5cGU/OiBFbGVtZW50VHlwZSwgXG4gICAgb3JpZ2luYWxOYW1lPzogc3RyaW5nXG4gICk6IFByb21pc2U8e1xuICAgIHN1Y2Nlc3M6IGJvb2xlYW47XG4gICAgZWxlbWVudFR5cGU/OiBFbGVtZW50VHlwZTtcbiAgICBsb2NhbFBhdGg/OiBzdHJpbmc7XG4gICAgZXJyb3I/OiBTdWJtaXRUb1BvcnRmb2xpb1Jlc3VsdDtcbiAgfT4ge1xuICAgIGxldCBlbGVtZW50VHlwZSA9IGV4cGxpY2l0VHlwZTtcbiAgICBsZXQgbG9jYWxQYXRoOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgICBcbiAgICBpZiAoZWxlbWVudFR5cGUpIHtcbiAgICAgIC8vIFR5cGUgZXhwbGljaXRseSBwcm92aWRlZCAtIHNlYXJjaCBpbiB0aGF0IHNwZWNpZmljIGRpcmVjdG9yeSBvbmx5XG4gICAgICBsb2NhbFBhdGggPSBhd2FpdCB0aGlzLmZpbmRMb2NhbENvbnRlbnQoc2FmZU5hbWUsIGVsZW1lbnRUeXBlKTtcbiAgICAgIGlmICghbG9jYWxQYXRoKSB7XG4gICAgICAgIC8vIFVYIElNUFJPVkVNRU5UOiBQcm92aWRlIGhlbHBmdWwgc3VnZ2VzdGlvbnMgZm9yIGZpbmRpbmcgY29udGVudFxuICAgICAgICBjb25zdCBwb3J0Zm9saW9NYW5hZ2VyID0gUG9ydGZvbGlvTWFuYWdlci5nZXRJbnN0YW5jZSgpO1xuICAgICAgICBjb25zdCBlbGVtZW50RGlyID0gcG9ydGZvbGlvTWFuYWdlci5nZXRFbGVtZW50RGlyKGVsZW1lbnRUeXBlKTtcbiAgICAgICAgXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgZXJyb3I6IHtcbiAgICAgICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICAgICAgbWVzc2FnZTogYENvdWxkIG5vdCBmaW5kICR7ZWxlbWVudFR5cGV9IG5hbWVkIFwiJHtvcmlnaW5hbE5hbWUgfHwgc2FmZU5hbWV9XCIgaW4gbG9jYWwgcG9ydGZvbGlvLlxcblxcbmAgK1xuICAgICAgICAgICAgICAgICAgICBgKipTZWFyY2hlZCBpbioqOiAke2VsZW1lbnREaXJ9XFxuXFxuYCArXG4gICAgICAgICAgICAgICAgICAgIGAqKlRyb3VibGVzaG9vdGluZyBUaXBzKio6XFxuYCArXG4gICAgICAgICAgICAgICAgICAgIGDigKIgQ2hlY2sgaWYgdGhlIGZpbGUgZXhpc3RzIHVzaW5nIHlvdXIgZmlsZSBleHBsb3JlclxcbmAgK1xuICAgICAgICAgICAgICAgICAgICBg4oCiIFRyeSB1c2luZyB0aGUgZXhhY3QgZmlsZW5hbWUgKHdpdGhvdXQgZXh0ZW5zaW9uKVxcbmAgK1xuICAgICAgICAgICAgICAgICAgICBg4oCiIFVzZSBcXGBsaXN0X3BvcnRmb2xpb1xcYCB0byBzZWUgYWxsIGF2YWlsYWJsZSAke2VsZW1lbnRUeXBlfVxcbmAgK1xuICAgICAgICAgICAgICAgICAgICBg4oCiIElmIHVuc3VyZSBvZiB0aGUgdHlwZSwgb21pdCAtLXR5cGUgYW5kIGxldCB0aGUgc3lzdGVtIGRldGVjdCBpdFxcblxcbmAgK1xuICAgICAgICAgICAgICAgICAgICBgKipDb21tb24gbmFtZSBmb3JtYXRzIHRoYXQgd29yayoqOlxcbmAgK1xuICAgICAgICAgICAgICAgICAgICBg4oCiIFwibXktZWxlbWVudFwiIChrZWJhYi1jYXNlKVxcbmAgK1xuICAgICAgICAgICAgICAgICAgICBg4oCiIFwiTXkgRWxlbWVudFwiICh3aXRoIHNwYWNlcylcXG5gICtcbiAgICAgICAgICAgICAgICAgICAgYOKAoiBcIk15RWxlbWVudFwiIChQYXNjYWxDYXNlKVxcbmAgK1xuICAgICAgICAgICAgICAgICAgICBg4oCiIFBhcnRpYWwgbWF0Y2hlcyBhcmUgc3VwcG9ydGVkYCxcbiAgICAgICAgICAgIGVycm9yOiAnQ09OVEVOVF9OT1RfRk9VTkQnXG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBDUklUSUNBTCBGSVg6IE5vIHR5cGUgcHJvdmlkZWQgLSBpbXBsZW1lbnQgc21hcnQgZGV0ZWN0aW9uIGFjcm9zcyBBTEwgZWxlbWVudCB0eXBlc1xuICAgICAgLy8gVGhpcyBwcmV2ZW50cyB0aGUgcHJldmlvdXMgaGFyZGNvZGVkIGRlZmF1bHQgdG8gUEVSU09OQSBhbmQgZW5hYmxlcyBwcm9wZXIgdHlwZSBkZXRlY3Rpb25cbiAgICAgIGNvbnN0IGRldGVjdGlvblJlc3VsdCA9IGF3YWl0IHRoaXMuZGV0ZWN0RWxlbWVudFR5cGUoc2FmZU5hbWUpO1xuICAgICAgXG4gICAgICBpZiAoIWRldGVjdGlvblJlc3VsdC5mb3VuZCkge1xuICAgICAgICAvLyBVWCBJTVBST1ZFTUVOVDogRW5oYW5jZWQgZ3VpZGFuY2Ugd2l0aCBzcGVjaWZpYyBzdWdnZXN0aW9uc1xuICAgICAgICBjb25zdCBhdmFpbGFibGVUeXBlcyA9IE9iamVjdC52YWx1ZXMoRWxlbWVudFR5cGUpLmpvaW4oJywgJyk7XG4gICAgICAgIFxuICAgICAgICAvLyBHZXQgc3VnZ2VzdGlvbnMgZm9yIHNpbWlsYXIgbmFtZXNcbiAgICAgICAgY29uc3Qgc3VnZ2VzdGlvbnMgPSBhd2FpdCB0aGlzLmdlbmVyYXRlTmFtZVN1Z2dlc3Rpb25zKHNhZmVOYW1lKTtcbiAgICAgICAgXG4gICAgICAgIGxldCBtZXNzYWdlID0gYENvbnRlbnQgXCIke29yaWdpbmFsTmFtZSB8fCBzYWZlTmFtZX1cIiBub3QgZm91bmQgaW4gcG9ydGZvbGlvLlxcblxcbmA7XG4gICAgICAgIG1lc3NhZ2UgKz0gYPCflI0gKipTZWFyY2hlZCBpbiBhbGwgZWxlbWVudCB0eXBlcyoqOiAke2F2YWlsYWJsZVR5cGVzfVxcblxcbmA7XG4gICAgICAgIFxuICAgICAgICBpZiAoc3VnZ2VzdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIG1lc3NhZ2UgKz0gYPCfkqEgKipEaWQgeW91IG1lYW4gb25lIG9mIHRoZXNlPyoqXFxuYDtcbiAgICAgICAgICBmb3IgKGNvbnN0IHN1Z2dlc3Rpb24gb2Ygc3VnZ2VzdGlvbnMuc2xpY2UoMCwgU0VBUkNIX0NPTkZJRy5NQVhfU1VHR0VTVElPTlMpKSB7XG4gICAgICAgICAgICBtZXNzYWdlICs9IGAgIOKAoiBcIiR7c3VnZ2VzdGlvbi5uYW1lfVwiICgke3N1Z2dlc3Rpb24udHlwZX0pXFxuYDtcbiAgICAgICAgICB9XG4gICAgICAgICAgbWVzc2FnZSArPSBgXFxuYDtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgbWVzc2FnZSArPSBg8J+boO+4jyAqKlRyb3VibGVzaG9vdGluZyBTdGVwcyoqOlxcbmA7XG4gICAgICAgIG1lc3NhZ2UgKz0gYDEuIPCfk50gVXNlIFxcYGxpc3RfcG9ydGZvbGlvXFxgIHRvIHNlZSBhbGwgYXZhaWxhYmxlIGNvbnRlbnRcXG5gO1xuICAgICAgICBtZXNzYWdlICs9IGAyLiDwn5SNIENoZWNrIGV4YWN0IHNwZWxsaW5nIGFuZCB0cnkgdmFyaWF0aW9uczpcXG5gO1xuICAgICAgICBtZXNzYWdlICs9IGAgICDigKIgXCIkeyhvcmlnaW5hbE5hbWUgfHwgc2FmZU5hbWUpLnRvTG93ZXJDYXNlKCl9XCIgKGxvd2VyY2FzZSlcXG5gO1xuICAgICAgICBtZXNzYWdlICs9IGAgICDigKIgXCIkeyhvcmlnaW5hbE5hbWUgfHwgc2FmZU5hbWUpLnJlcGxhY2UoL1teYS16MC05XS9naSwgJy0nKS50b0xvd2VyQ2FzZSgpfVwiIChub3JtYWxpemVkKVxcbmA7XG4gICAgICAgIGlmICgob3JpZ2luYWxOYW1lIHx8IHNhZmVOYW1lKS5pbmNsdWRlcygnLicpKSB7XG4gICAgICAgICAgbWVzc2FnZSArPSBgICAg4oCiIFwiJHsob3JpZ2luYWxOYW1lIHx8IHNhZmVOYW1lKS5yZXBsYWNlKC9cXC4vZywgJycpfVwiIChubyBkb3RzKVxcbmA7XG4gICAgICAgIH1cbiAgICAgICAgbWVzc2FnZSArPSBgMy4g8J+OryBTcGVjaWZ5IGVsZW1lbnQgdHlwZTogXFxgc3VibWl0X2NvbGxlY3Rpb25fY29udGVudCBcIiR7b3JpZ2luYWxOYW1lIHx8IHNhZmVOYW1lfVwiIC0tdHlwZT1wZXJzb25hc1xcYFxcbmA7XG4gICAgICAgIG1lc3NhZ2UgKz0gYDQuIPCfk4EgQ2hlY2sgaWYgZmlsZSBleGlzdHMgaW4gcG9ydGZvbGlvIGRpcmVjdG9yaWVzXFxuXFxuYDtcbiAgICAgICAgbWVzc2FnZSArPSBg8J+TnSAqKlRpcCoqOiBUaGUgc3lzdGVtIHNlYXJjaGVzIGZpbGVuYW1lcyBBTkQgbWV0YWRhdGEgbmFtZXMgd2l0aCBmdXp6eSBtYXRjaGluZy5gO1xuICAgICAgICBcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgICBlcnJvcjoge1xuICAgICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgICBtZXNzYWdlLFxuICAgICAgICAgICAgZXJyb3I6ICdDT05URU5UX05PVF9GT1VORCdcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBcbiAgICAgIGlmIChkZXRlY3Rpb25SZXN1bHQubWF0Y2hlcy5sZW5ndGggPiAxKSB7XG4gICAgICAgIC8vIE11bHRpcGxlIG1hdGNoZXMgZm91bmQgLSBhc2sgdXNlciB0byBzcGVjaWZ5IHR5cGVcbiAgICAgICAgY29uc3QgbWF0Y2hEZXRhaWxzID0gZGV0ZWN0aW9uUmVzdWx0Lm1hdGNoZXMubWFwKG0gPT4gYC0gJHttLnR5cGV9OiAke20ucGF0aH1gKS5qb2luKCdcXG4nKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgICBlcnJvcjoge1xuICAgICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgICBtZXNzYWdlOiBgQ29udGVudCBcIiR7b3JpZ2luYWxOYW1lIHx8IHNhZmVOYW1lfVwiIGZvdW5kIGluIG11bHRpcGxlIGVsZW1lbnQgdHlwZXM6XFxuXFxuJHttYXRjaERldGFpbHN9XFxuXFxuYCArXG4gICAgICAgICAgICAgICAgICAgIGBQbGVhc2Ugc3BlY2lmeSB0aGUgZWxlbWVudCB0eXBlIHVzaW5nIHRoZSAtLXR5cGUgcGFyYW1ldGVyIHRvIGF2b2lkIGFtYmlndWl0eS5gLFxuICAgICAgICAgICAgZXJyb3I6ICdNVUxUSVBMRV9NQVRDSEVTX0ZPVU5EJ1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gU2luZ2xlIG1hdGNoIGZvdW5kIC0gdXNlIGl0XG4gICAgICBjb25zdCBtYXRjaCA9IGRldGVjdGlvblJlc3VsdC5tYXRjaGVzWzBdO1xuICAgICAgZWxlbWVudFR5cGUgPSBtYXRjaC50eXBlO1xuICAgICAgbG9jYWxQYXRoID0gbWF0Y2gucGF0aDtcbiAgICAgIFxuICAgICAgbG9nZ2VyLmluZm8oYFNtYXJ0IGRldGVjdGlvbjogRm91bmQgXCIke3NhZmVOYW1lfVwiIGFzICR7ZWxlbWVudFR5cGV9YCwgeyBcbiAgICAgICAgbmFtZTogc2FmZU5hbWUsXG4gICAgICAgIGRldGVjdGVkVHlwZTogZWxlbWVudFR5cGUsXG4gICAgICAgIHBhdGg6IGxvY2FsUGF0aFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHN1Y2Nlc3M6IHRydWUsXG4gICAgICBlbGVtZW50VHlwZSxcbiAgICAgIGxvY2FsUGF0aFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGVzIGZpbGUgc2l6ZSBhbmQgY29udGVudCBzZWN1cml0eSBiZWZvcmUgcHJvY2Vzc2luZ1xuICAgKiBAcGFyYW0gbG9jYWxQYXRoIFBhdGggdG8gdGhlIGxvY2FsIGZpbGUgdG8gdmFsaWRhdGVcbiAgICogQHJldHVybnMgVmFsaWRhdGlvbiByZXN1bHQgd2l0aCBjb250ZW50IG9yIGVycm9yIHJlc3BvbnNlXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHZhbGlkYXRlRmlsZUFuZENvbnRlbnQobG9jYWxQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHtcbiAgICBzdWNjZXNzOiBib29sZWFuO1xuICAgIGNvbnRlbnQ/OiBzdHJpbmc7XG4gICAgZXJyb3I/OiBTdWJtaXRUb1BvcnRmb2xpb1Jlc3VsdDtcbiAgfT4ge1xuICAgIC8vIFNFQ1VSSVRZIEVOSEFOQ0VNRU5UIChUYXNrICM3KTogVmFsaWRhdGUgZmlsZSBwYXRoIGJlZm9yZSBwcm9jZXNzaW5nXG4gICAgY29uc3QgcGF0aFZhbGlkYXRpb24gPSBhd2FpdCB0aGlzLnZhbGlkYXRlUG9ydGZvbGlvUGF0aChsb2NhbFBhdGgpO1xuICAgIGlmICghcGF0aFZhbGlkYXRpb24uaXNWYWxpZCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgIGVycm9yOiBwYXRoVmFsaWRhdGlvbi5lcnJvclxuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBVc2UgdGhlIHZhbGlkYXRlZCBzYWZlIHBhdGggZm9yIGFsbCBzdWJzZXF1ZW50IG9wZXJhdGlvbnNcbiAgICBjb25zdCBzYWZlUGF0aCA9IHBhdGhWYWxpZGF0aW9uLnNhZmVQYXRoITtcblxuICAgIC8vIFZhbGlkYXRlIGZpbGUgc2l6ZSBiZWZvcmUgcmVhZGluZ1xuICAgIGNvbnN0IHN0YXRzID0gYXdhaXQgZnMuc3RhdChzYWZlUGF0aCk7XG4gICAgaWYgKHN0YXRzLnNpemUgPiBGSUxFX1NJWkVfTElNSVRTLk1BWF9GSUxFX1NJWkUpIHtcbiAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgdHlwZTogJ1JBVEVfTElNSVRfRVhDRUVERUQnLFxuICAgICAgICBzZXZlcml0eTogJ01FRElVTScsXG4gICAgICAgIHNvdXJjZTogJ1N1Ym1pdFRvUG9ydGZvbGlvVG9vbC5leGVjdXRlJyxcbiAgICAgICAgZGV0YWlsczogYEZpbGUgc2l6ZSAke3N0YXRzLnNpemV9IGV4Y2VlZHMgbGltaXQgb2YgJHtGSUxFX1NJWkVfTElNSVRTLk1BWF9GSUxFX1NJWkV9YFxuICAgICAgfSk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgZXJyb3I6IHtcbiAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgICBtZXNzYWdlOiBgRmlsZSBzaXplIGV4Y2VlZHMgJHtGSUxFX1NJWkVfTElNSVRTLk1BWF9GSUxFX1NJWkVfTUJ9TUIgbGltaXRgLFxuICAgICAgICAgIGVycm9yOiAnRklMRV9UT09fTEFSR0UnXG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gVmFsaWRhdGUgY29udGVudCBzZWN1cml0eVxuICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBmcy5yZWFkRmlsZShzYWZlUGF0aCwgJ3V0Zi04Jyk7XG4gICAgY29uc3QgdmFsaWRhdGlvblJlc3VsdCA9IENvbnRlbnRWYWxpZGF0b3IudmFsaWRhdGVBbmRTYW5pdGl6ZShjb250ZW50KTtcblxuICAgIGlmICghdmFsaWRhdGlvblJlc3VsdC5pc1ZhbGlkICYmIHZhbGlkYXRpb25SZXN1bHQuc2V2ZXJpdHkgPT09ICdjcml0aWNhbCcpIHtcbiAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgdHlwZTogJ0NPTlRFTlRfSU5KRUNUSU9OX0FUVEVNUFQnLFxuICAgICAgICBzZXZlcml0eTogJ0hJR0gnLFxuICAgICAgICBzb3VyY2U6ICdTdWJtaXRUb1BvcnRmb2xpb1Rvb2wuZXhlY3V0ZScsXG4gICAgICAgIGRldGFpbHM6IGBDcml0aWNhbCBzZWN1cml0eSBpc3N1ZXMgZGV0ZWN0ZWQ6ICR7dmFsaWRhdGlvblJlc3VsdC5kZXRlY3RlZFBhdHRlcm5zPy5qb2luKCcsICcpfWBcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgIGVycm9yOiB7XG4gICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgbWVzc2FnZTogYENvbnRlbnQgdmFsaWRhdGlvbiBmYWlsZWQ6ICR7dmFsaWRhdGlvblJlc3VsdC5kZXRlY3RlZFBhdHRlcm5zPy5qb2luKCcsICcpfWAsXG4gICAgICAgICAgZXJyb3I6ICdWQUxJREFUSU9OX0ZBSUxFRCdcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgc3VjY2VzczogdHJ1ZSxcbiAgICAgIGNvbnRlbnRcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFByZXBhcmVzIG1ldGFkYXRhIGZvciB0aGUgcG9ydGZvbGlvIGVsZW1lbnRcbiAgICogQHBhcmFtIHNhZmVOYW1lIFRoZSBub3JtYWxpemVkIG5hbWUgb2YgdGhlIGVsZW1lbnRcbiAgICogQHBhcmFtIGVsZW1lbnRUeXBlIFRoZSB0eXBlIG9mIHRoZSBlbGVtZW50XG4gICAqIEBwYXJhbSBhdXRoU3RhdHVzIEF1dGhlbnRpY2F0aW9uIHN0YXR1cyBjb250YWluaW5nIHVzZXJuYW1lXG4gICAqIEByZXR1cm5zIE1ldGFkYXRhIG9iamVjdCBmb3IgdGhlIGVsZW1lbnRcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcHJlcGFyZUVsZW1lbnRNZXRhZGF0YShcbiAgICBzYWZlTmFtZTogc3RyaW5nLCBcbiAgICBlbGVtZW50VHlwZTogRWxlbWVudFR5cGUsIFxuICAgIGF1dGhTdGF0dXM6IGFueSxcbiAgICBmaWxlUGF0aD86IHN0cmluZ1xuICApOiBQcm9taXNlPFBvcnRmb2xpb0VsZW1lbnRNZXRhZGF0YT4ge1xuICAgIC8vIFRyeSB0byBleHRyYWN0IG1ldGFkYXRhIGZyb20gdGhlIGZpbGUgaWYgcGF0aCBpcyBwcm92aWRlZFxuICAgIGxldCBmaWxlTWV0YWRhdGE6IFJlY29yZDxzdHJpbmcsIGFueT4gfCBudWxsID0gbnVsbDtcbiAgICBcbiAgICBpZiAoZmlsZVBhdGgpIHtcbiAgICAgIGZpbGVNZXRhZGF0YSA9IGF3YWl0IHRoaXMuZXh0cmFjdEVsZW1lbnRNZXRhZGF0YShmaWxlUGF0aCk7XG4gICAgfVxuICAgIFxuICAgIC8vIFRZUEUgU0FGRVRZOiBEZWZpbmUgZXh0ZW5kZWQgbWV0YWRhdGEgaW50ZXJmYWNlIGZvciBiZXR0ZXIgdHlwZSBzYWZldHlcbiAgICBpbnRlcmZhY2UgRXh0ZW5kZWRNZXRhZGF0YSBleHRlbmRzIFBvcnRmb2xpb0VsZW1lbnRNZXRhZGF0YSB7XG4gICAgICB0cmlnZ2Vycz86IHN0cmluZ1tdO1xuICAgICAgY2F0ZWdvcnk/OiBzdHJpbmc7XG4gICAgICBhZ2VfcmF0aW5nPzogc3RyaW5nO1xuICAgICAgYWlfZ2VuZXJhdGVkPzogYm9vbGVhbjtcbiAgICAgIGdlbmVyYXRpb25fbWV0aG9kPzogc3RyaW5nO1xuICAgICAgbGljZW5zZT86IHN0cmluZztcbiAgICAgIHRhZ3M/OiBzdHJpbmdbXTtcbiAgICB9XG4gICAgXG4gICAgLy8gQnVpbGQgbWV0YWRhdGEgd2l0aCByZWFsIHZhbHVlcyBmcm9tIGZpbGUsIGZhbGxpbmcgYmFjayB0byBkZWZhdWx0c1xuICAgIGNvbnN0IG1ldGFkYXRhOiBFeHRlbmRlZE1ldGFkYXRhID0ge1xuICAgICAgbmFtZTogc2FmZU5hbWUsXG4gICAgICBkZXNjcmlwdGlvbjogZmlsZU1ldGFkYXRhPy5kZXNjcmlwdGlvbiB8fCBcbiAgICAgICAgICAgICAgICAgICBmaWxlTWV0YWRhdGE/LnN1bW1hcnkgfHwgXG4gICAgICAgICAgICAgICAgICAgYCR7ZWxlbWVudFR5cGV9IHN1Ym1pdHRlZCBmcm9tIGxvY2FsIHBvcnRmb2xpb2AsXG4gICAgICBhdXRob3I6IGF1dGhTdGF0dXMudXNlcm5hbWUgfHwgZmlsZU1ldGFkYXRhPy5hdXRob3IgfHwgJ3Vua25vd24nLFxuICAgICAgY3JlYXRlZDogZmlsZU1ldGFkYXRhPy5jcmVhdGVkIHx8IFxuICAgICAgICAgICAgICAgZmlsZU1ldGFkYXRhPy5jcmVhdGVkX2RhdGUgfHwgXG4gICAgICAgICAgICAgICBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgICB1cGRhdGVkOiBmaWxlTWV0YWRhdGE/LnVwZGF0ZWQgfHwgXG4gICAgICAgICAgICAgICBmaWxlTWV0YWRhdGE/Lm1vZGlmaWVkIHx8IFxuICAgICAgICAgICAgICAgbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgICAgdmVyc2lvbjogZmlsZU1ldGFkYXRhPy52ZXJzaW9uIHx8ICcxLjAuMCdcbiAgICB9O1xuICAgIFxuICAgIC8vIEFkZCBhZGRpdGlvbmFsIG1ldGFkYXRhIGZpZWxkcyBpZiBwcmVzZW50ICh3aXRoIHR5cGUgc2FmZXR5KVxuICAgIGlmIChmaWxlTWV0YWRhdGEpIHtcbiAgICAgIC8vIFByZXNlcnZlIG90aGVyIG1ldGFkYXRhIGZpZWxkcyB0aGF0IG1pZ2h0IGJlIHVzZWZ1bFxuICAgICAgaWYgKGZpbGVNZXRhZGF0YS50cmlnZ2VycyAmJiBBcnJheS5pc0FycmF5KGZpbGVNZXRhZGF0YS50cmlnZ2VycykpIHtcbiAgICAgICAgbWV0YWRhdGEudHJpZ2dlcnMgPSBmaWxlTWV0YWRhdGEudHJpZ2dlcnM7XG4gICAgICB9XG4gICAgICBpZiAoZmlsZU1ldGFkYXRhLmNhdGVnb3J5ICYmIHR5cGVvZiBmaWxlTWV0YWRhdGEuY2F0ZWdvcnkgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIG1ldGFkYXRhLmNhdGVnb3J5ID0gZmlsZU1ldGFkYXRhLmNhdGVnb3J5O1xuICAgICAgfVxuICAgICAgaWYgKGZpbGVNZXRhZGF0YS5hZ2VfcmF0aW5nICYmIHR5cGVvZiBmaWxlTWV0YWRhdGEuYWdlX3JhdGluZyA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgbWV0YWRhdGEuYWdlX3JhdGluZyA9IGZpbGVNZXRhZGF0YS5hZ2VfcmF0aW5nO1xuICAgICAgfVxuICAgICAgaWYgKGZpbGVNZXRhZGF0YS5haV9nZW5lcmF0ZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBtZXRhZGF0YS5haV9nZW5lcmF0ZWQgPSBCb29sZWFuKGZpbGVNZXRhZGF0YS5haV9nZW5lcmF0ZWQpO1xuICAgICAgfVxuICAgICAgaWYgKGZpbGVNZXRhZGF0YS5nZW5lcmF0aW9uX21ldGhvZCAmJiB0eXBlb2YgZmlsZU1ldGFkYXRhLmdlbmVyYXRpb25fbWV0aG9kID09PSAnc3RyaW5nJykge1xuICAgICAgICBtZXRhZGF0YS5nZW5lcmF0aW9uX21ldGhvZCA9IGZpbGVNZXRhZGF0YS5nZW5lcmF0aW9uX21ldGhvZDtcbiAgICAgIH1cbiAgICAgIGlmIChmaWxlTWV0YWRhdGEubGljZW5zZSAmJiB0eXBlb2YgZmlsZU1ldGFkYXRhLmxpY2Vuc2UgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIG1ldGFkYXRhLmxpY2Vuc2UgPSBmaWxlTWV0YWRhdGEubGljZW5zZTtcbiAgICAgIH1cbiAgICAgIGlmIChmaWxlTWV0YWRhdGEudGFncyAmJiBBcnJheS5pc0FycmF5KGZpbGVNZXRhZGF0YS50YWdzKSkge1xuICAgICAgICBtZXRhZGF0YS50YWdzID0gZmlsZU1ldGFkYXRhLnRhZ3M7XG4gICAgICB9XG4gICAgfVxuICAgIFxuICAgIGxvZ2dlci5pbmZvKCdQcmVwYXJlZCBlbGVtZW50IG1ldGFkYXRhJywge1xuICAgICAgZWxlbWVudE5hbWU6IHNhZmVOYW1lLFxuICAgICAgaGFzRmlsZU1ldGFkYXRhOiAhIWZpbGVNZXRhZGF0YSxcbiAgICAgIGRlc2NyaXB0aW9uOiBtZXRhZGF0YS5kZXNjcmlwdGlvbi5zdWJzdHJpbmcoMCwgMTAwKSAvLyBMb2cgZmlyc3QgMTAwIGNoYXJzXG4gICAgfSk7XG4gICAgXG4gICAgcmV0dXJuIG1ldGFkYXRhO1xuICB9XG5cbiAgLyoqXG4gICAqIEZvcm1hdHMgbWV0YWRhdGEgYXMgWUFNTCBzdHJpbmcgZm9yIGRpc3BsYXlcbiAgICogUEVSRk9STUFOQ0U6IFVzZXMgYXJyYXkgam9pbiBpbnN0ZWFkIG9mIHN0cmluZyBjb25jYXRlbmF0aW9uIGZvciBiZXR0ZXIgcGVyZm9ybWFuY2VcbiAgICovXG4gIHByaXZhdGUgZm9ybWF0TWV0YWRhdGFBc1lhbWwoYmFzZU1ldGFkYXRhOiBQb3J0Zm9saW9FbGVtZW50TWV0YWRhdGEsIGV4dGVuZGVkTWV0YTogYW55KTogc3RyaW5nIHtcbiAgICBjb25zdCB5YW1sTGluZXM6IHN0cmluZ1tdID0gW1xuICAgICAgYG5hbWU6ICR7YmFzZU1ldGFkYXRhLm5hbWV9YCxcbiAgICAgIGBkZXNjcmlwdGlvbjogJHtiYXNlTWV0YWRhdGEuZGVzY3JpcHRpb259YCxcbiAgICAgIGBhdXRob3I6ICR7YmFzZU1ldGFkYXRhLmF1dGhvcn1gLFxuICAgICAgYHZlcnNpb246ICR7YmFzZU1ldGFkYXRhLnZlcnNpb259YCxcbiAgICAgIGBjcmVhdGVkOiAke2Jhc2VNZXRhZGF0YS5jcmVhdGVkfWAsXG4gICAgICBgdXBkYXRlZDogJHtiYXNlTWV0YWRhdGEudXBkYXRlZH1gXG4gICAgXTtcbiAgICBcbiAgICAvLyBBZGQgb3B0aW9uYWwgZmllbGRzIGlmIHByZXNlbnRcbiAgICBpZiAoZXh0ZW5kZWRNZXRhLmNhdGVnb3J5KSB7XG4gICAgICB5YW1sTGluZXMucHVzaChgY2F0ZWdvcnk6ICR7ZXh0ZW5kZWRNZXRhLmNhdGVnb3J5fWApO1xuICAgIH1cbiAgICBpZiAoZXh0ZW5kZWRNZXRhLnRyaWdnZXJzICYmIEFycmF5LmlzQXJyYXkoZXh0ZW5kZWRNZXRhLnRyaWdnZXJzKSAmJiBleHRlbmRlZE1ldGEudHJpZ2dlcnMubGVuZ3RoID4gMCkge1xuICAgICAgeWFtbExpbmVzLnB1c2goYHRyaWdnZXJzOiBbJHtleHRlbmRlZE1ldGEudHJpZ2dlcnMuam9pbignLCAnKX1dYCk7XG4gICAgfVxuICAgIGlmIChleHRlbmRlZE1ldGEuYWdlX3JhdGluZykge1xuICAgICAgeWFtbExpbmVzLnB1c2goYGFnZV9yYXRpbmc6ICR7ZXh0ZW5kZWRNZXRhLmFnZV9yYXRpbmd9YCk7XG4gICAgfVxuICAgIGlmIChleHRlbmRlZE1ldGEuYWlfZ2VuZXJhdGVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHlhbWxMaW5lcy5wdXNoKGBhaV9nZW5lcmF0ZWQ6ICR7ZXh0ZW5kZWRNZXRhLmFpX2dlbmVyYXRlZH1gKTtcbiAgICB9XG4gICAgaWYgKGV4dGVuZGVkTWV0YS5nZW5lcmF0aW9uX21ldGhvZCkge1xuICAgICAgeWFtbExpbmVzLnB1c2goYGdlbmVyYXRpb25fbWV0aG9kOiAke2V4dGVuZGVkTWV0YS5nZW5lcmF0aW9uX21ldGhvZH1gKTtcbiAgICB9XG4gICAgaWYgKGV4dGVuZGVkTWV0YS5saWNlbnNlKSB7XG4gICAgICB5YW1sTGluZXMucHVzaChgbGljZW5zZTogJHtleHRlbmRlZE1ldGEubGljZW5zZX1gKTtcbiAgICB9XG4gICAgaWYgKGV4dGVuZGVkTWV0YS50YWdzICYmIEFycmF5LmlzQXJyYXkoZXh0ZW5kZWRNZXRhLnRhZ3MpICYmIGV4dGVuZGVkTWV0YS50YWdzLmxlbmd0aCA+IDApIHtcbiAgICAgIHlhbWxMaW5lcy5wdXNoKGB0YWdzOiBbJHtleHRlbmRlZE1ldGEudGFncy5qb2luKCcsICcpfV1gKTtcbiAgICB9XG4gICAgXG4gICAgcmV0dXJuIHlhbWxMaW5lcy5qb2luKCdcXG4nKTtcbiAgfVxuICBcbiAgLyoqXG4gICAqIEV4dHJhY3RzIG1ldGFkYXRhIGZyb20gYW4gZWxlbWVudCBmaWxlXG4gICAqIFBhcnNlcyBZQU1MIGZyb250bWF0dGVyIHRvIGdldCB0aGUgYWN0dWFsIG1ldGFkYXRhXG4gICAqIFNFQ1VSSVRZOiBVc2VzIFNlY3VyZVlhbWxQYXJzZXIgaW5zdGVhZCBvZiB5YW1sLmxvYWQgdG8gcHJldmVudCBjb2RlIGV4ZWN1dGlvbiAoRE1DUC1TRUMtMDA1KVxuICAgKiBAcGFyYW0gZmlsZVBhdGggUGF0aCB0byB0aGUgZWxlbWVudCBmaWxlXG4gICAqIEByZXR1cm5zIEV4dHJhY3RlZCBtZXRhZGF0YSBvciBudWxsIGlmIHBhcnNpbmcgZmFpbHNcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZXh0cmFjdEVsZW1lbnRNZXRhZGF0YShmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgbnVsbD4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgZnMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGYtOCcpO1xuICAgICAgXG4gICAgICAvLyBTRUNVUklUWSBGSVg6IFVzZSBTZWN1cmVZYW1sUGFyc2VyIHRvIHByZXZlbnQgWUFNTCBkZXNlcmlhbGl6YXRpb24gYXR0YWNrc1xuICAgICAgLy8gUHJldmlvdXNseSB3b3VsZCBoYXZlIHVzZWQ6IHlhbWwubG9hZCh5YW1sQ29udGVudCkgd2hpY2ggaXMgdnVsbmVyYWJsZVxuICAgICAgLy8gTm93OiBVc2VzIFNlY3VyZVlhbWxQYXJzZXIucGFyc2UoKSB3aGljaCB2YWxpZGF0ZXMgYW5kIHNhbml0aXplc1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcGFyc2VkID0gU2VjdXJlWWFtbFBhcnNlci5wYXJzZShjb250ZW50LCB7XG4gICAgICAgICAgbWF4WWFtbFNpemU6IDY0ICogMTAyNCwgIC8vIDY0S0IgbGltaXQgZm9yIFlBTUxcbiAgICAgICAgICB2YWxpZGF0ZUNvbnRlbnQ6IGZhbHNlLCAgICAvLyBEb24ndCB2YWxpZGF0ZSBjb250ZW50IGZpZWxkIChqdXN0IG1ldGFkYXRhKVxuICAgICAgICAgIHZhbGlkYXRlRmllbGRzOiBmYWxzZSAgICAgIC8vIERvbid0IGVuZm9yY2UgcGVyc29uYS1zcGVjaWZpYyBydWxlc1xuICAgICAgICB9KTtcbiAgICAgICAgXG4gICAgICAgIC8vIEVuc3VyZSB3ZSBnb3QgYW4gb2JqZWN0IGJhY2tcbiAgICAgICAgaWYgKHBhcnNlZC5kYXRhICYmIHR5cGVvZiBwYXJzZWQuZGF0YSA9PT0gJ29iamVjdCcgJiYgIUFycmF5LmlzQXJyYXkocGFyc2VkLmRhdGEpKSB7XG4gICAgICAgICAgbG9nZ2VyLmRlYnVnKCdFeHRyYWN0ZWQgbWV0YWRhdGEgZnJvbSBlbGVtZW50IGZpbGUnLCB7XG4gICAgICAgICAgICBwYXRoOiBmaWxlUGF0aCxcbiAgICAgICAgICAgIG1ldGFkYXRhS2V5czogT2JqZWN0LmtleXMocGFyc2VkLmRhdGEpXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmV0dXJuIHBhcnNlZC5kYXRhO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBsb2dnZXIuZGVidWcoJ1BhcnNlZCBkYXRhIGlzIG5vdCBhIHZhbGlkIG1ldGFkYXRhIG9iamVjdCcsIHsgcGF0aDogZmlsZVBhdGggfSk7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICBcbiAgICAgIH0gY2F0Y2ggKHBhcnNlRXJyb3IpIHtcbiAgICAgICAgLy8gU2VjdXJlWWFtbFBhcnNlciB0aHJvd3Mgb24gaW52YWxpZCBZQU1MLCB0cnkgYWx0ZXJuYXRlIGZyb250bWF0dGVyIHBhdHRlcm5cbiAgICAgICAgLy8gSGFuZGxlIGZpbGVzIHRoYXQgbWlnaHQgaGF2ZSBmcm9udG1hdHRlciB3aXRob3V0IGZ1bGwgZG9jdW1lbnQgc3RydWN0dXJlXG4gICAgICAgIGNvbnN0IGZyb250bWF0dGVyTWF0Y2ggPSBjb250ZW50Lm1hdGNoKC9eLS0tXFxyP1xcbihbXFxzXFxTXSo/KVxccj9cXG4tLS0vKTtcbiAgICAgICAgXG4gICAgICAgIGlmIChmcm9udG1hdHRlck1hdGNoICYmIGZyb250bWF0dGVyTWF0Y2hbMV0pIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gUmVjb25zdHJ1Y3QgZnVsbCBkb2N1bWVudCBmb3IgU2VjdXJlWWFtbFBhcnNlclxuICAgICAgICAgICAgY29uc3QgZnVsbENvbnRlbnQgPSBgLS0tXFxuJHtmcm9udG1hdHRlck1hdGNoWzFdfVxcbi0tLVxcbmA7XG4gICAgICAgICAgICBjb25zdCBwYXJzZWQgPSBTZWN1cmVZYW1sUGFyc2VyLnBhcnNlKGZ1bGxDb250ZW50LCB7XG4gICAgICAgICAgICAgIG1heFlhbWxTaXplOiA2NCAqIDEwMjQsXG4gICAgICAgICAgICAgIHZhbGlkYXRlQ29udGVudDogZmFsc2UsXG4gICAgICAgICAgICAgIHZhbGlkYXRlRmllbGRzOiBmYWxzZVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGlmIChwYXJzZWQuZGF0YSAmJiB0eXBlb2YgcGFyc2VkLmRhdGEgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICAgIHJldHVybiBwYXJzZWQuZGF0YTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGNhdGNoIChpbm5lckVycm9yKSB7XG4gICAgICAgICAgICBsb2dnZXIuZGVidWcoJ0ZhaWxlZCB0byBwYXJzZSBmcm9udG1hdHRlciB3aXRoIFNlY3VyZVlhbWxQYXJzZXInLCB7XG4gICAgICAgICAgICAgIHBhdGg6IGZpbGVQYXRoLFxuICAgICAgICAgICAgICBlcnJvcjogaW5uZXJFcnJvciBpbnN0YW5jZW9mIEVycm9yID8gaW5uZXJFcnJvci5tZXNzYWdlIDogU3RyaW5nKGlubmVyRXJyb3IpXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIGxvZ2dlci5kZWJ1ZygnTm8gdmFsaWQgZnJvbnRtYXR0ZXIgZm91bmQgaW4gZWxlbWVudCBmaWxlJywgeyBwYXRoOiBmaWxlUGF0aCB9KTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgICBcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbG9nZ2VyLndhcm4oJ0ZhaWxlZCB0byBleHRyYWN0IG1ldGFkYXRhIGZyb20gZWxlbWVudCBmaWxlJywge1xuICAgICAgICBwYXRoOiBmaWxlUGF0aCxcbiAgICAgICAgZXJyb3I6IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKVxuICAgICAgfSk7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGVzIEdpdEh1YiB0b2tlbiBhbmQgY2hlY2tzIGZvciBleHBpcmF0aW9uIGJlZm9yZSB1c2FnZVxuICAgKiBTRUNVUklUWSBFTkhBTkNFTUVOVCAoVGFzayAjNSk6IFRva2VuIGV4cGlyYXRpb24gdmFsaWRhdGlvbiB0byBwcmV2ZW50IHN0YWxlIHRva2VuIHVzYWdlXG4gICAqIEBwYXJhbSB0b2tlbiBUaGUgR2l0SHViIHRva2VuIHRvIHZhbGlkYXRlXG4gICAqIEByZXR1cm5zIFZhbGlkYXRpb24gcmVzdWx0IHdpdGggc3RhdHVzIGFuZCBleHBpcmF0aW9uIGluZm9cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgdmFsaWRhdGVUb2tlbkJlZm9yZVVzYWdlKHRva2VuOiBzdHJpbmcpOiBQcm9taXNlPHtcbiAgICBpc1ZhbGlkOiBib29sZWFuO1xuICAgIGlzTmVhckV4cGlyeT86IGJvb2xlYW47XG4gICAgZXJyb3I/OiBTdWJtaXRUb1BvcnRmb2xpb1Jlc3VsdDtcbiAgfT4ge1xuICAgIHRyeSB7XG4gICAgICAvLyBDaGVjayB0b2tlbiBmb3JtYXQgZmlyc3QgKGJhc2ljIHZhbGlkYXRpb24pXG4gICAgICBpZiAoIVRva2VuTWFuYWdlci52YWxpZGF0ZVRva2VuRm9ybWF0KHRva2VuKSkge1xuICAgICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgICAgdHlwZTogJ1RPS0VOX1ZBTElEQVRJT05fRkFJTFVSRScsXG4gICAgICAgICAgc2V2ZXJpdHk6ICdNRURJVU0nLFxuICAgICAgICAgIHNvdXJjZTogJ1N1Ym1pdFRvUG9ydGZvbGlvVG9vbC52YWxpZGF0ZVRva2VuQmVmb3JlVXNhZ2UnLFxuICAgICAgICAgIGRldGFpbHM6ICdUb2tlbiBoYXMgaW52YWxpZCBmb3JtYXQnXG4gICAgICAgIH0pO1xuICAgICAgICBcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBpc1ZhbGlkOiBmYWxzZSxcbiAgICAgICAgICBlcnJvcjoge1xuICAgICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgICBtZXNzYWdlOiAnSW52YWxpZCB0b2tlbiBmb3JtYXQuIFBsZWFzZSByZS1hdXRoZW50aWNhdGUuJyxcbiAgICAgICAgICAgIGVycm9yOiAnSU5WQUxJRF9UT0tFTl9GT1JNQVQnXG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICAvLyBWYWxpZGF0ZSB0b2tlbiB3aXRoIEdpdEh1YiBBUEkgdG8gY2hlY2sgZXhwaXJhdGlvbiBhbmQgcGVybWlzc2lvbnNcbiAgICAgIC8vIE5PVEU6IE9BdXRoIHRva2VucyB1c2UgJ3B1YmxpY19yZXBvJyBzY29wZSwgbm90ICdyZXBvJ1xuICAgICAgLy8gVXNpbmcgY2VudHJhbGl6ZWQgc2NvcGUgbWFuYWdlbWVudCBmb3IgY29uc2lzdGVuY3lcbiAgICAgIGNvbnN0IHJlcXVpcmVkU2NvcGVzID0gVG9rZW5NYW5hZ2VyLmdldFJlcXVpcmVkU2NvcGVzKCdjb2xsZWN0aW9uJyk7XG4gICAgICBjb25zdCB2YWxpZGF0aW9uUmVzdWx0ID0gYXdhaXQgVG9rZW5NYW5hZ2VyLnZhbGlkYXRlVG9rZW5TY29wZXModG9rZW4sIHJlcXVpcmVkU2NvcGVzKTtcblxuICAgICAgaWYgKCF2YWxpZGF0aW9uUmVzdWx0LmlzVmFsaWQpIHtcbiAgICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICAgIHR5cGU6ICdUT0tFTl9WQUxJREFUSU9OX0ZBSUxVUkUnLFxuICAgICAgICAgIHNldmVyaXR5OiAnTUVESVVNJyxcbiAgICAgICAgICBzb3VyY2U6ICdTdWJtaXRUb1BvcnRmb2xpb1Rvb2wudmFsaWRhdGVUb2tlbkJlZm9yZVVzYWdlJyxcbiAgICAgICAgICBkZXRhaWxzOiBgVG9rZW4gdmFsaWRhdGlvbiBmYWlsZWQ6ICR7dmFsaWRhdGlvblJlc3VsdC5lcnJvcn1gXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIEVuaGFuY2VkIE9BdXRoLXNwZWNpZmljIGVycm9yIG1lc3NhZ2VzXG4gICAgICAgIGNvbnN0IHRva2VuVHlwZSA9IFRva2VuTWFuYWdlci5nZXRUb2tlblR5cGUodG9rZW4pO1xuICAgICAgICBsZXQgZXJyb3JDb2RlOiBDb2xsZWN0aW9uRXJyb3JDb2RlO1xuICAgICAgICBsZXQgZW5oYW5jZWREZXRhaWxzOiBzdHJpbmcgfCB1bmRlZmluZWQgPSB2YWxpZGF0aW9uUmVzdWx0LmVycm9yO1xuICAgICAgICBcbiAgICAgICAgaWYgKHZhbGlkYXRpb25SZXN1bHQuZXJyb3I/LmluY2x1ZGVzKCdNaXNzaW5nIHJlcXVpcmVkIHNjb3BlcycpKSB7XG4gICAgICAgICAgZXJyb3JDb2RlID0gQ29sbGVjdGlvbkVycm9yQ29kZS5DT0xMX0FVVEhfMDAyO1xuICAgICAgICAgIC8vIFByb3ZpZGUgT0F1dGgtc3BlY2lmaWMgZ3VpZGFuY2UgaWYgaXQncyBhbiBPQXV0aCB0b2tlblxuICAgICAgICAgIGlmICh0b2tlblR5cGUgPT09ICdPQXV0aCBBY2Nlc3MgVG9rZW4nKSB7XG4gICAgICAgICAgICBlbmhhbmNlZERldGFpbHMgPSBgT0F1dGggdG9rZW4gbWlzc2luZyAncHVibGljX3JlcG8nIHNjb3BlLiBQbGVhc2UgcmUtYXV0aGVudGljYXRlIHdpdGggJ3NldHVwX2dpdGh1Yl9hdXRoJyB0byBnZXQgdGhlIGNvcnJlY3Qgc2NvcGUuYDtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZXJyb3JDb2RlID0gQ29sbGVjdGlvbkVycm9yQ29kZS5DT0xMX0FVVEhfMDAxO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBpc1ZhbGlkOiBmYWxzZSxcbiAgICAgICAgICBlcnJvcjoge1xuICAgICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgICBtZXNzYWdlOiBmb3JtYXRDb2xsZWN0aW9uRXJyb3IoZXJyb3JDb2RlLCAzLCA1LCBlbmhhbmNlZERldGFpbHMpLFxuICAgICAgICAgICAgZXJyb3I6IGVycm9yQ29kZVxuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgLy8gQ2hlY2sgaWYgdG9rZW4gaXMgbmVhciBleHBpcmF0aW9uIChyYXRlIGxpbWl0IHJlc2V0IHRpbWUgY2FuIGluZGljYXRlIHRva2VuIGZyZXNobmVzcylcbiAgICAgIGxldCBpc05lYXJFeHBpcnkgPSBmYWxzZTtcbiAgICAgIGlmICh2YWxpZGF0aW9uUmVzdWx0LnJhdGVMaW1pdD8ucmVzZXRUaW1lKSB7XG4gICAgICAgIGNvbnN0IG5vdyA9IG5ldyBEYXRlKCk7XG4gICAgICAgIGNvbnN0IHRpbWVVbnRpbFJlc2V0ID0gdmFsaWRhdGlvblJlc3VsdC5yYXRlTGltaXQucmVzZXRUaW1lLmdldFRpbWUoKSAtIG5vdy5nZXRUaW1lKCk7XG4gICAgICAgIGNvbnN0IG9uZUhvdXIgPSA2MCAqIDYwICogMTAwMDtcbiAgICAgICAgXG4gICAgICAgIC8vIENvbnNpZGVyIHRva2VuIFwibmVhciBleHBpcnlcIiBpZiByYXRlIGxpbWl0IHJlc2V0IGlzIG1vcmUgdGhhbiAyMyBob3VycyBhd2F5XG4gICAgICAgIC8vIChHaXRIdWIgcmF0ZSBsaW1pdHMgcmVzZXQgZXZlcnkgaG91ciwgc28gdGhpcyBzdWdnZXN0cyB0b2tlbiBhZ2UpXG4gICAgICAgIGlmICh0aW1lVW50aWxSZXNldCA+IDIzICogb25lSG91cikge1xuICAgICAgICAgIGlzTmVhckV4cGlyeSA9IHRydWU7XG4gICAgICAgICAgbG9nZ2VyLndhcm4oJ0dpdEh1YiB0b2tlbiBtYXkgYmUgbmVhciBleHBpcmF0aW9uJywge1xuICAgICAgICAgICAgdG9rZW5QcmVmaXg6IFRva2VuTWFuYWdlci5nZXRUb2tlblByZWZpeCh0b2tlbiksXG4gICAgICAgICAgICByYXRlTGltaXRSZXNldFRpbWU6IHZhbGlkYXRpb25SZXN1bHQucmF0ZUxpbWl0LnJlc2V0VGltZSxcbiAgICAgICAgICAgIHJlY29tbWVuZGF0aW9uOiAnQ29uc2lkZXIgcmUtYXV0aGVudGljYXRpbmcgZm9yIGxvbmcgb3BlcmF0aW9ucydcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBMb2cgc3VjY2Vzc2Z1bCB2YWxpZGF0aW9uXG4gICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgIHR5cGU6ICdUT0tFTl9WQUxJREFUSU9OX1NVQ0NFU1MnLFxuICAgICAgICBzZXZlcml0eTogJ0xPVycsXG4gICAgICAgIHNvdXJjZTogJ1N1Ym1pdFRvUG9ydGZvbGlvVG9vbC52YWxpZGF0ZVRva2VuQmVmb3JlVXNhZ2UnLFxuICAgICAgICBkZXRhaWxzOiAnR2l0SHViIHRva2VuIHZhbGlkYXRlZCBzdWNjZXNzZnVsbHkgYmVmb3JlIHVzYWdlJyxcbiAgICAgICAgbWV0YWRhdGE6IHtcbiAgICAgICAgICB0b2tlblR5cGU6IFRva2VuTWFuYWdlci5nZXRUb2tlblR5cGUodG9rZW4pLFxuICAgICAgICAgIHNjb3BlczogdmFsaWRhdGlvblJlc3VsdC5zY29wZXMsXG4gICAgICAgICAgcmF0ZUxpbWl0UmVtYWluaW5nOiB2YWxpZGF0aW9uUmVzdWx0LnJhdGVMaW1pdD8ucmVtYWluaW5nLFxuICAgICAgICAgIGlzTmVhckV4cGlyeVxuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgaXNWYWxpZDogdHJ1ZSxcbiAgICAgICAgaXNOZWFyRXhwaXJ5XG4gICAgICB9O1xuXG4gICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgLy8gSGFuZGxlIHJhdGUgbGltaXQgZXhjZWVkZWQgc3BlY2lmaWNhbGx5XG4gICAgICBpZiAoZXJyb3I/LmNvZGUgPT09ICdSQVRFX0xJTUlUX0VYQ0VFREVEJykge1xuICAgICAgICBsb2dnZXIud2FybignVG9rZW4gdmFsaWRhdGlvbiByYXRlIGxpbWl0ZWQsIGFsbG93aW5nIG9wZXJhdGlvbiB0byBwcm9jZWVkIHdpdGggY2FjaGVkIHN0YXR1cycpO1xuICAgICAgICAvLyBTdGlsbCBhbGxvdyBvcGVyYXRpb24gYnV0IGxvZyB3aXRoIENPTExfQVBJXzAwMVxuICAgICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgICAgdHlwZTogJ1RPS0VOX1ZBTElEQVRJT05fU1VDQ0VTUycsXG4gICAgICAgICAgc2V2ZXJpdHk6ICdMT1cnLFxuICAgICAgICAgIHNvdXJjZTogJ1N1Ym1pdFRvUG9ydGZvbGlvVG9vbC52YWxpZGF0ZVRva2VuQmVmb3JlVXNhZ2UnLFxuICAgICAgICAgIGRldGFpbHM6ICdUb2tlbiB2YWxpZGF0aW9uIHJhdGUgbGltaXRlZCBidXQgcHJvY2VlZGluZyB3aXRoIGNhY2hlZCBzdGF0dXMnXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4geyBpc1ZhbGlkOiB0cnVlIH07IC8vIEFsbG93IHRvIHByb2NlZWQgaWYgcmF0ZSBsaW1pdGVkLCBhcyBiYXNpYyBmb3JtYXQgY2hlY2sgcGFzc2VkXG4gICAgICB9XG5cbiAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgdHlwZTogJ1RPS0VOX1ZBTElEQVRJT05fRkFJTFVSRScsXG4gICAgICAgIHNldmVyaXR5OiAnSElHSCcsXG4gICAgICAgIHNvdXJjZTogJ1N1Ym1pdFRvUG9ydGZvbGlvVG9vbC52YWxpZGF0ZVRva2VuQmVmb3JlVXNhZ2UnLFxuICAgICAgICBkZXRhaWxzOiBgVG9rZW4gdmFsaWRhdGlvbiBlcnJvcjogJHtlcnJvci5tZXNzYWdlIHx8ICd1bmtub3duIGVycm9yJ31gXG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgaXNWYWxpZDogZmFsc2UsXG4gICAgICAgIGVycm9yOiB7XG4gICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgbWVzc2FnZTogJ1VuYWJsZSB0byB2YWxpZGF0ZSBHaXRIdWIgdG9rZW4uIFBsZWFzZSBjaGVjayB5b3VyIGNvbm5lY3Rpb24gYW5kIHRyeSBhZ2Fpbi4nLFxuICAgICAgICAgIGVycm9yOiAnVE9LRU5fVkFMSURBVElPTl9FUlJPUidcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRW5oYW5jZWQgcGF0aCB2YWxpZGF0aW9uIGZvciBwb3J0Zm9saW8gb3BlcmF0aW9ucyB3aXRoIGNvbXByZWhlbnNpdmUgc2VjdXJpdHkgY2hlY2tzXG4gICAqIFNFQ1VSSVRZIEVOSEFOQ0VNRU5UIChUYXNrICM3KTogQWRkaXRpb25hbCB2YWxpZGF0aW9uIGZvciBzcGVjaWFsIGNoYXJhY3RlcnMgYW5kIG1hbGljaW91cyBwYXR0ZXJuc1xuICAgKiBAcGFyYW0gZmlsZVBhdGggVGhlIGZpbGUgcGF0aCB0byB2YWxpZGF0ZVxuICAgKiBAcmV0dXJucyBWYWxpZGF0aW9uIHJlc3VsdCB3aXRoIHNlY3VyZSBwYXRoIG9yIGVycm9yIHJlc3BvbnNlXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHZhbGlkYXRlUG9ydGZvbGlvUGF0aChmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTx7XG4gICAgaXNWYWxpZDogYm9vbGVhbjtcbiAgICBzYWZlUGF0aD86IHN0cmluZztcbiAgICBlcnJvcj86IFN1Ym1pdFRvUG9ydGZvbGlvUmVzdWx0O1xuICB9PiB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIEJhc2ljIG51bGwvdW5kZWZpbmVkIGNoZWNrXG4gICAgICBpZiAoIWZpbGVQYXRoIHx8IHR5cGVvZiBmaWxlUGF0aCAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICAgIHR5cGU6ICdQQVRIX1RSQVZFUlNBTF9BVFRFTVBUJyxcbiAgICAgICAgICBzZXZlcml0eTogJ01FRElVTScsXG4gICAgICAgICAgc291cmNlOiAnU3VibWl0VG9Qb3J0Zm9saW9Ub29sLnZhbGlkYXRlUG9ydGZvbGlvUGF0aCcsXG4gICAgICAgICAgZGV0YWlsczogJ0ludmFsaWQgcGF0aCBwcm92aWRlZCAtIG51bGwsIHVuZGVmaW5lZCwgb3Igbm9uLXN0cmluZydcbiAgICAgICAgfSk7XG4gICAgICAgIFxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGlzVmFsaWQ6IGZhbHNlLFxuICAgICAgICAgIGVycm9yOiB7XG4gICAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6ICdJbnZhbGlkIGZpbGUgcGF0aCBwcm92aWRlZCcsXG4gICAgICAgICAgICBlcnJvcjogJ0lOVkFMSURfUEFUSCdcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIC8vIENoZWNrIGZvciBzdXNwaWNpb3VzIHBhdHRlcm5zIHRoYXQgY291bGQgaW5kaWNhdGUgcGF0aCB0cmF2ZXJzYWwgb3IgaW5qZWN0aW9uXG4gICAgICBjb25zdCBzdXNwaWNpb3VzUGF0dGVybnMgPSBbXG4gICAgICAgIC9cXC5cXC4vLCAgICAgICAgICAgICAgICAgICAgLy8gUGF0aCB0cmF2ZXJzYWxcbiAgICAgICAgL1xcL1xcLlxcLi8sICAgICAgICAgICAgICAgICAgLy8gVW5peCBwYXRoIHRyYXZlcnNhbFxuICAgICAgICAvXFxcXFxcLlxcLi8sICAgICAgICAgICAgICAgICAgLy8gV2luZG93cyBwYXRoIHRyYXZlcnNhbFxuICAgICAgICAvXFx1MDAwMC8sICAgICAgICAgICAgICAgICAgICAvLyBOT1NPTkFSIC0gTnVsbCBieXRlcyBkZXRlY3Rpb24gZm9yIHNlY3VyaXR5XG4gICAgICAgIC9bXFx1MDAwMS1cXHUwMDFmXFx1MDA3Zi1cXHUwMDlmXS8sICAgIC8vIE5PU09OQVIgLSBDb250cm9sIGNoYXJhY3RlcnMgZGV0ZWN0aW9uIGZvciBzZWN1cml0eVxuICAgICAgICAvWzw+OlwifD8qXS8sICAgICAgICAgICAgICAgLy8gSW52YWxpZCBmaWxlbmFtZSBjaGFyYWN0ZXJzIG9uIFdpbmRvd3NcbiAgICAgICAgL14oQ09OfFBSTnxBVVh8TlVMfENPTVsxLTldfExQVFsxLTldKSQvaSwgLy8gUmVzZXJ2ZWQgV2luZG93cyBuYW1lc1xuICAgICAgICAvXlxcLi8sICAgICAgICAgICAgICAgICAgICAgLy8gSGlkZGVuIGZpbGVzIChzdGFydGluZyB3aXRoIGRvdClcbiAgICAgICAgL1xccyskLywgICAgICAgICAgICAgICAgICAgIC8vIFRyYWlsaW5nIHdoaXRlc3BhY2VcbiAgICAgICAgL15bXFxzXSokLywgICAgICAgICAgICAgICAgIC8vIE9ubHkgd2hpdGVzcGFjZVxuICAgICAgICAvJVswLTlhLWZBLUZdezJ9LywgICAgICAgICAvLyBVUkwgZW5jb2RpbmcgKHBvdGVudGlhbCBieXBhc3MgYXR0ZW1wdClcbiAgICAgICAgL1xcXFx4WzAtOWEtZkEtRl17Mn0vLCAgICAgICAvLyBIZXggZW5jb2RpbmdcbiAgICAgICAgL1xcJFxcey4qXFx9LywgICAgICAgICAgICAgICAgLy8gVGVtcGxhdGUgbGl0ZXJhbCBpbmplY3Rpb25cbiAgICAgICAgL2AuKmAvLCAgICAgICAgICAgICAgICAgICAgLy8gQmFja3RpY2sgaW5qZWN0aW9uXG4gICAgICAgIC9bXFxcXFxcL117Mix9LyAgICAgICAgICAgICAgIC8vIE11bHRpcGxlIGNvbnNlY3V0aXZlIHNsYXNoZXNcbiAgICAgIF07XG5cbiAgICAgIGZvciAoY29uc3QgcGF0dGVybiBvZiBzdXNwaWNpb3VzUGF0dGVybnMpIHtcbiAgICAgICAgaWYgKHBhdHRlcm4udGVzdChmaWxlUGF0aCkpIHtcbiAgICAgICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgICAgICB0eXBlOiAnUEFUSF9UUkFWRVJTQUxfQVRURU1QVCcsXG4gICAgICAgICAgICBzZXZlcml0eTogJ0hJR0gnLFxuICAgICAgICAgICAgc291cmNlOiAnU3VibWl0VG9Qb3J0Zm9saW9Ub29sLnZhbGlkYXRlUG9ydGZvbGlvUGF0aCcsXG4gICAgICAgICAgICBkZXRhaWxzOiBgU3VzcGljaW91cyBwYXR0ZXJuIGRldGVjdGVkIGluIGZpbGUgcGF0aDogJHtwYXR0ZXJuLnNvdXJjZX1gLFxuICAgICAgICAgICAgbWV0YWRhdGE6IHtcbiAgICAgICAgICAgICAgcGF0aExlbmd0aDogZmlsZVBhdGgubGVuZ3RoLFxuICAgICAgICAgICAgICBwYXR0ZXJuOiBwYXR0ZXJuLnNvdXJjZVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIFxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBpc1ZhbGlkOiBmYWxzZSxcbiAgICAgICAgICAgIGVycm9yOiB7XG4gICAgICAgICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICAgICAgICBtZXNzYWdlOiAnRmlsZSBwYXRoIGNvbnRhaW5zIGludmFsaWQgb3Igc3VzcGljaW91cyBjaGFyYWN0ZXJzJyxcbiAgICAgICAgICAgICAgZXJyb3I6ICdTVVNQSUNJT1VTX1BBVEhfUEFUVEVSTidcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIENoZWNrIHBhdGggbGVuZ3RoIChwcmV2ZW50IGJ1ZmZlciBvdmVyZmxvdyBhdHRlbXB0cylcbiAgICAgIGNvbnN0IE1BWF9QQVRIX0xFTkdUSCA9IHByb2Nlc3MucGxhdGZvcm0gPT09ICd3aW4zMicgPyAyNjAgOiA0MDk2O1xuICAgICAgaWYgKGZpbGVQYXRoLmxlbmd0aCA+IE1BWF9QQVRIX0xFTkdUSCkge1xuICAgICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgICAgdHlwZTogJ1BBVEhfVFJBVkVSU0FMX0FUVEVNUFQnLFxuICAgICAgICAgIHNldmVyaXR5OiAnTUVESVVNJyxcbiAgICAgICAgICBzb3VyY2U6ICdTdWJtaXRUb1BvcnRmb2xpb1Rvb2wudmFsaWRhdGVQb3J0Zm9saW9QYXRoJyxcbiAgICAgICAgICBkZXRhaWxzOiBgRmlsZSBwYXRoIGV4Y2VlZHMgbWF4aW11bSBsZW5ndGg6ICR7ZmlsZVBhdGgubGVuZ3RofSA+ICR7TUFYX1BBVEhfTEVOR1RIfWBcbiAgICAgICAgfSk7XG4gICAgICAgIFxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGlzVmFsaWQ6IGZhbHNlLFxuICAgICAgICAgIGVycm9yOiB7XG4gICAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6ICdGaWxlIHBhdGggaXMgdG9vIGxvbmcnLFxuICAgICAgICAgICAgZXJyb3I6ICdQQVRIX1RPT19MT05HJ1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgLy8gTm9ybWFsaXplIHBhdGggdG8gcmVzb2x2ZSBhbnkgcmVsYXRpdmUgY29tcG9uZW50cyBzYWZlbHlcbiAgICAgIGxldCBub3JtYWxpemVkUGF0aDogc3RyaW5nO1xuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gUmVtb3ZlIG51bGwgYnl0ZXMgYW5kIG5vcm1hbGl6ZVxuICAgICAgICBjb25zdCBjbGVhblBhdGggPSBmaWxlUGF0aC5yZXBsYWNlKC9cXHUwMDAwL2csICcnKTsgLy8gTk9TT05BUiAtIFJlbW92aW5nIG51bGwgYnl0ZXMgZm9yIHNlY3VyaXR5XG4gICAgICAgIG5vcm1hbGl6ZWRQYXRoID0gcGF0aC5ub3JtYWxpemUoY2xlYW5QYXRoKTtcbiAgICAgICAgXG4gICAgICAgIC8vIENoZWNrIGlmIHBhdGggaXMgd2l0aGluIHRoZSBwb3J0Zm9saW8gZGlyZWN0b3J5XG4gICAgICAgIGNvbnN0IHBvcnRmb2xpb01hbmFnZXIgPSBQb3J0Zm9saW9NYW5hZ2VyLmdldEluc3RhbmNlKCk7XG4gICAgICAgIGNvbnN0IHBvcnRmb2xpb0Jhc2UgPSBwb3J0Zm9saW9NYW5hZ2VyLmdldEJhc2VEaXIoKTtcbiAgICAgICAgXG4gICAgICAgIC8vIEZvciBhYnNvbHV0ZSBwYXRocywgdmVyaWZ5IHRoZXkncmUgd2l0aGluIHRoZSBwb3J0Zm9saW8gZGlyZWN0b3J5XG4gICAgICAgIGlmIChwYXRoLmlzQWJzb2x1dGUobm9ybWFsaXplZFBhdGgpKSB7XG4gICAgICAgICAgY29uc3QgcmVzb2x2ZWRQYXRoID0gcGF0aC5yZXNvbHZlKG5vcm1hbGl6ZWRQYXRoKTtcbiAgICAgICAgICBjb25zdCByZXNvbHZlZEJhc2UgPSBwYXRoLnJlc29sdmUocG9ydGZvbGlvQmFzZSk7XG4gICAgICAgICAgXG4gICAgICAgICAgLy8gUGF0aCBtdXN0IGJlIHdpdGhpbiB0aGUgcG9ydGZvbGlvIGRpcmVjdG9yeVxuICAgICAgICAgIGlmICghcmVzb2x2ZWRQYXRoLnN0YXJ0c1dpdGgocmVzb2x2ZWRCYXNlKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdQYXRoIGlzIG91dHNpZGUgcG9ydGZvbGlvIGRpcmVjdG9yeScpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChub3JtYWxpemVkUGF0aC5pbmNsdWRlcygnLi4nKSkge1xuICAgICAgICAgIC8vIFJlbGF0aXZlIHBhdGhzIHdpdGggLi4gYXJlIG5vdCBhbGxvd2VkXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdQYXRoIGNvbnRhaW5zIGRpcmVjdG9yeSB0cmF2ZXJzYWwnKTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICAgIHR5cGU6ICdQQVRIX1RSQVZFUlNBTF9BVFRFTVBUJyxcbiAgICAgICAgICBzZXZlcml0eTogJ0hJR0gnLFxuICAgICAgICAgIHNvdXJjZTogJ1N1Ym1pdFRvUG9ydGZvbGlvVG9vbC52YWxpZGF0ZVBvcnRmb2xpb1BhdGgnLFxuICAgICAgICAgIGRldGFpbHM6IGBQYXRoIG5vcm1hbGl6YXRpb24gZmFpbGVkOiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogJ3Vua25vd24gZXJyb3InfWBcbiAgICAgICAgfSk7XG4gICAgICAgIFxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGlzVmFsaWQ6IGZhbHNlLFxuICAgICAgICAgIGVycm9yOiB7XG4gICAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6ICdGaWxlIHBhdGggY291bGQgbm90IGJlIHNhZmVseSBwcm9jZXNzZWQnLFxuICAgICAgICAgICAgZXJyb3I6ICdQQVRIX05PUk1BTElaQVRJT05fRkFJTEVEJ1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgLy8gVmFsaWRhdGUgZmlsZSBleHRlbnNpb24gKG9ubHkgYWxsb3cgc2FmZSBleHRlbnNpb25zIGZvciBwb3J0Zm9saW8gY29udGVudClcbiAgICAgIGNvbnN0IGFsbG93ZWRFeHRlbnNpb25zID0gWycubWQnLCAnLm1hcmtkb3duJywgJy50eHQnLCAnLnltbCcsICcueWFtbCcsICcuanNvbiddO1xuICAgICAgY29uc3QgZmlsZUV4dGVuc2lvbiA9IHBhdGguZXh0bmFtZShub3JtYWxpemVkUGF0aCkudG9Mb3dlckNhc2UoKTtcbiAgICAgIFxuICAgICAgaWYgKGZpbGVFeHRlbnNpb24gJiYgIWFsbG93ZWRFeHRlbnNpb25zLmluY2x1ZGVzKGZpbGVFeHRlbnNpb24pKSB7XG4gICAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgICB0eXBlOiAnQ09OVEVOVF9JTkpFQ1RJT05fQVRURU1QVCcsXG4gICAgICAgICAgc2V2ZXJpdHk6ICdNRURJVU0nLFxuICAgICAgICAgIHNvdXJjZTogJ1N1Ym1pdFRvUG9ydGZvbGlvVG9vbC52YWxpZGF0ZVBvcnRmb2xpb1BhdGgnLFxuICAgICAgICAgIGRldGFpbHM6IGBEaXNhbGxvd2VkIGZpbGUgZXh0ZW5zaW9uOiAke2ZpbGVFeHRlbnNpb259YCxcbiAgICAgICAgICBtZXRhZGF0YToge1xuICAgICAgICAgICAgYWxsb3dlZEV4dGVuc2lvbnM6IGFsbG93ZWRFeHRlbnNpb25zLmpvaW4oJywgJylcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBpc1ZhbGlkOiBmYWxzZSxcbiAgICAgICAgICBlcnJvcjoge1xuICAgICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgICBtZXNzYWdlOiBgRmlsZSBleHRlbnNpb24gJyR7ZmlsZUV4dGVuc2lvbn0nIGlzIG5vdCBhbGxvd2VkLiBBbGxvd2VkIGV4dGVuc2lvbnM6ICR7YWxsb3dlZEV4dGVuc2lvbnMuam9pbignLCAnKX1gLFxuICAgICAgICAgICAgZXJyb3I6ICdJTlZBTElEX0ZJTEVfRVhURU5TSU9OJ1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgLy8gVmFsaWRhdGUgZmlsZW5hbWUgY2hhcmFjdGVycyAob25seSBhbGxvdyBzYWZlIGNoYXJhY3RlcnMpXG4gICAgICBjb25zdCBiYXNlbmFtZSA9IHBhdGguYmFzZW5hbWUobm9ybWFsaXplZFBhdGgpO1xuICAgICAgY29uc3Qgc2FmZUZpbGVuYW1lUGF0dGVybiA9IC9eW2EtekEtWjAtOVxcLV8uXFxzKClbXFxde31dKyQvO1xuICAgICAgXG4gICAgICBpZiAoYmFzZW5hbWUgJiYgIXNhZmVGaWxlbmFtZVBhdHRlcm4udGVzdChiYXNlbmFtZSkpIHtcbiAgICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICAgIHR5cGU6ICdDT05URU5UX0lOSkVDVElPTl9BVFRFTVBUJyxcbiAgICAgICAgICBzZXZlcml0eTogJ01FRElVTScsXG4gICAgICAgICAgc291cmNlOiAnU3VibWl0VG9Qb3J0Zm9saW9Ub29sLnZhbGlkYXRlUG9ydGZvbGlvUGF0aCcsXG4gICAgICAgICAgZGV0YWlsczogJ0ZpbGVuYW1lIGNvbnRhaW5zIHBvdGVudGlhbGx5IGRhbmdlcm91cyBjaGFyYWN0ZXJzJyxcbiAgICAgICAgICBtZXRhZGF0YToge1xuICAgICAgICAgICAgZmlsZW5hbWU6IGJhc2VuYW1lLFxuICAgICAgICAgICAgYWxsb3dlZFBhdHRlcm46IHNhZmVGaWxlbmFtZVBhdHRlcm4uc291cmNlXG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgaXNWYWxpZDogZmFsc2UsXG4gICAgICAgICAgZXJyb3I6IHtcbiAgICAgICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICAgICAgbWVzc2FnZTogJ0ZpbGVuYW1lIGNvbnRhaW5zIGludmFsaWQgY2hhcmFjdGVycy4gT25seSBsZXR0ZXJzLCBudW1iZXJzLCBzcGFjZXMsIGh5cGhlbnMsIHVuZGVyc2NvcmVzLCBkb3RzLCBhbmQgY29tbW9uIGJyYWNrZXRzIGFyZSBhbGxvd2VkLicsXG4gICAgICAgICAgICBlcnJvcjogJ0lOVkFMSURfRklMRU5BTUVfQ0hBUkFDVEVSUydcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIC8vIExvZyBzdWNjZXNzZnVsIHZhbGlkYXRpb24gd2l0aCBjb3JyZWN0IGV2ZW50IHR5cGUgZm9yIHBhdGggdmFsaWRhdGlvblxuICAgICAgLy8gRml4ZWQ6IFdhcyB1c2luZyBUT0tFTl9WQUxJREFUSU9OX1NVQ0NFU1Mgd2hpY2ggaXMgc2VtYW50aWNhbGx5IGluY29ycmVjdCBmb3IgcGF0aCB2YWxpZGF0aW9uXG4gICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgIHR5cGU6ICdQQVRIX1ZBTElEQVRJT05fU1VDQ0VTUycsXG4gICAgICAgIHNldmVyaXR5OiAnTE9XJyxcbiAgICAgICAgc291cmNlOiAnU3VibWl0VG9Qb3J0Zm9saW9Ub29sLnZhbGlkYXRlUG9ydGZvbGlvUGF0aCcsXG4gICAgICAgIGRldGFpbHM6ICdGaWxlIHBhdGggdmFsaWRhdGlvbiBzdWNjZXNzZnVsJyxcbiAgICAgICAgbWV0YWRhdGE6IHtcbiAgICAgICAgICBvcmlnaW5hbFBhdGhMZW5ndGg6IGZpbGVQYXRoLmxlbmd0aCxcbiAgICAgICAgICBub3JtYWxpemVkUGF0aExlbmd0aDogbm9ybWFsaXplZFBhdGgubGVuZ3RoLFxuICAgICAgICAgIGZpbGVFeHRlbnNpb246IGZpbGVFeHRlbnNpb24gfHwgJ25vbmUnXG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBpc1ZhbGlkOiB0cnVlLFxuICAgICAgICBzYWZlUGF0aDogbm9ybWFsaXplZFBhdGhcbiAgICAgIH07XG5cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICB0eXBlOiAnUEFUSF9UUkFWRVJTQUxfQVRURU1QVCcsXG4gICAgICAgIHNldmVyaXR5OiAnSElHSCcsXG4gICAgICAgIHNvdXJjZTogJ1N1Ym1pdFRvUG9ydGZvbGlvVG9vbC52YWxpZGF0ZVBvcnRmb2xpb1BhdGgnLFxuICAgICAgICBkZXRhaWxzOiBgUGF0aCB2YWxpZGF0aW9uIGVycm9yOiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogJ3Vua25vd24gZXJyb3InfWBcbiAgICAgIH0pO1xuICAgICAgXG4gICAgICByZXR1cm4ge1xuICAgICAgICBpc1ZhbGlkOiBmYWxzZSxcbiAgICAgICAgZXJyb3I6IHtcbiAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgICBtZXNzYWdlOiAnVW5hYmxlIHRvIHZhbGlkYXRlIGZpbGUgcGF0aC4gUGxlYXNlIGNoZWNrIHRoZSBmaWxlIHBhdGggYW5kIHRyeSBhZ2Fpbi4nLFxuICAgICAgICAgIGVycm9yOiAnUEFUSF9WQUxJREFUSU9OX0VSUk9SJ1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTbWFydCB0b2tlbiBtYW5hZ2VtZW50IGZvciBsb25nIG9wZXJhdGlvbnMgd2l0aCByZWZyZXNoLWxpa2UgY2FwYWJpbGl0aWVzXG4gICAqIFNFQ1VSSVRZIEVOSEFOQ0VNRU5UIChUYXNrICMxNCk6IFRva2VuIHJlZnJlc2ggbG9naWMgZm9yIGxvbmcgb3BlcmF0aW9uc1xuICAgKiBcbiAgICogTm90ZTogR2l0SHViIE9BdXRoIGRldmljZSBmbG93IHRva2VucyBkb24ndCBoYXZlIHRyYWRpdGlvbmFsIHJlZnJlc2ggdG9rZW5zLFxuICAgKiBidXQgd2UgY2FuIGltcGxlbWVudCBzbWFydCB2YWxpZGF0aW9uIGFuZCBndWlkYW5jZSBmb3IgbG9uZyBvcGVyYXRpb25zXG4gICAqIFxuICAgKiBAcGFyYW0gb3BlcmF0aW9uVHlwZSBUeXBlIG9mIG9wZXJhdGlvbiBiZWluZyBwZXJmb3JtZWRcbiAgICogQHJldHVybnMgVG9rZW4gbWFuYWdlbWVudCByZXN1bHQgd2l0aCByZWNvbW1lbmRhdGlvbnNcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgbWFuYWdlVG9rZW5Gb3JMb25nT3BlcmF0aW9uKG9wZXJhdGlvblR5cGU6ICdwb3J0Zm9saW9fY3JlYXRpb24nIHwgJ2NvbGxlY3Rpb25fc3VibWlzc2lvbicgfCAnZmlsZV91cGxvYWQnKTogUHJvbWlzZTx7XG4gICAgY2FuUHJvY2VlZDogYm9vbGVhbjtcbiAgICB0b2tlbj86IHN0cmluZztcbiAgICByZWZyZXNoUmVjb21tZW5kZWQ/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+IDAgPyBhZGRpdGlvbmFsRmllbGRzLmpvaW4oJ1xcbicpIDogJypObyBhZGRpdGlvbmFsIG1ldGFkYXRhIGF2YWlsYWJsZSonfVxuXG4jIyMgUG9ydGZvbGlvIExpbmtcbiR7cGFyYW1zLnBvcnRmb2xpb1VybH1cblxuIyMjIEVsZW1lbnQgQ29udGVudFxuXFxgXFxgXFxgeWFtbFxuJHtlbGVtZW50Q29udGVudH1cblxcYFxcYFxcYFxuXG4jIyMgUmV2aWV3IENoZWNrbGlzdFxuLSBbIF0gQ29udGVudCBpcyBhcHByb3ByaWF0ZSBhbmQgZm9sbG93cyBjb21tdW5pdHkgZ3VpZGVsaW5lc1xuLSBbIF0gTm8gc2VjdXJpdHkgdnVsbmVyYWJpbGl0aWVzIG9yIG1hbGljaW91cyBwYXR0ZXJuc1xuLSBbIF0gTWV0YWRhdGEgaXMgY29tcGxldGUgYW5kIGFjY3VyYXRlXG4tIFsgXSBFbGVtZW50IHdvcmtzIGFzIGRlc2NyaWJlZFxuLSBbIF0gTm8gZHVwbGljYXRlIG9mIGV4aXN0aW5nIGNvbGxlY3Rpb24gY29udGVudFxuXG4tLS1cbipUaGlzIHN1Ym1pc3Npb24gd2FzIGNyZWF0ZWQgYXV0b21hdGljYWxseSB2aWEgdGhlIERvbGxob3VzZU1DUCBzdWJtaXRfY29sbGVjdGlvbl9jb250ZW50IHRvb2wgKHYxLjYuOS1iZXRhMS1jb2xsZWN0aW9uLWZpeCkuKmA7XG5cbiAgICAgIC8vIERldGVybWluZSBsYWJlbHMgYmFzZWQgb24gZWxlbWVudCB0eXBlXG4gICAgICBjb25zdCBsYWJlbHMgPSBbXG4gICAgICAgICdlbGVtZW50LXN1Ym1pc3Npb24nLCAgLy8gQ1JJVElDQUw6IFRyaWdnZXJzIGF1dG9tYXRpb24gd29ya2Zsb3dcbiAgICAgICAgJ2NvbGxlY3Rpb24tcmVwbycsICAgICAvLyBJbmRpY2F0ZXMgdGhpcyBpcyBmb3IgdGhlIGNvbGxlY3Rpb25cbiAgICAgICAgJ2NvbnRyaWJ1dGlvbicsICAgICAgICAvLyBBbGwgc3VibWlzc2lvbnMgZ2V0IHRoaXNcbiAgICAgICAgJ3BlbmRpbmctcmV2aWV3JywgICAgICAvLyBOZWVkcyByZXZpZXdcbiAgICAgICAgcGFyYW1zLmVsZW1lbnRUeXBlLnRvTG93ZXJDYXNlKCkgLy8gRWxlbWVudCB0eXBlIGxhYmVsIChlLmcuLCAncGVyc29uYXMnKVxuICAgICAgXTtcblxuICAgICAgLy8gUEVSRk9STUFOQ0UgT1BUSU1JWkFUSU9OIChUYXNrICM2KTogVXNlIEdpdEh1YiByYXRlIGxpbWl0ZXIgZm9yIEFQSSBjYWxsc1xuICAgICAgLy8gVGhpcyBwcmV2ZW50cyBoaXR0aW5nIEdpdEh1YiByYXRlIGxpbWl0cyBhbmQgcHJvdmlkZXMgYmV0dGVyIGVycm9yIGhhbmRsaW5nXG4gICAgICBjb25zdCBpc3N1ZVVybCA9IGF3YWl0IGdpdGh1YlJhdGVMaW1pdGVyLnF1ZXVlUmVxdWVzdChcbiAgICAgICAgJ2NyZWF0ZS1jb2xsZWN0aW9uLWlzc3VlJyxcbiAgICAgICAgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHVybCA9ICdodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL0RvbGxob3VzZU1DUC9jb2xsZWN0aW9uL2lzc3Vlcyc7XG4gICAgICAgICAgXG4gICAgICAgICAgLy8gQ3JlYXRlIEFib3J0Q29udHJvbGxlciBmb3IgdGltZW91dFxuICAgICAgICAgIGNvbnN0IGNvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gICAgICAgICAgY29uc3QgdGltZW91dElkID0gc2V0VGltZW91dCgoKSA9PiBjb250cm9sbGVyLmFib3J0KCksIGdldFZhbGlkYXRlZFRpbWVvdXQoKSk7XG4gICAgICAgICAgXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsLCB7XG4gICAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICAgICAgJ0FjY2VwdCc6ICdhcHBsaWNhdGlvbi92bmQuZ2l0aHViLnYzK2pzb24nLFxuICAgICAgICAgICAgICAgICdBdXRob3JpemF0aW9uJzogYEJlYXJlciAke3BhcmFtcy50b2tlbn1gLFxuICAgICAgICAgICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgICAgICAgICAgJ1VzZXItQWdlbnQnOiAnRG9sbGhvdXNlTUNQLzEuMCdcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgICAgIHRpdGxlLFxuICAgICAgICAgICAgICAgIGJvZHksXG4gICAgICAgICAgICAgICAgbGFiZWxzXG4gICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICBzaWduYWw6IGNvbnRyb2xsZXIuc2lnbmFsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXRJZCk7XG5cbiAgICAgICAgICAgIC8vIFBFUkZPUk1BTkNFIE9QVElNSVpBVElPTiAoVGFzayAjMTUpOiBFbmhhbmNlZCByYXRlIGxpbWl0IGxvZ2dpbmdcbiAgICAgICAgICAgIC8vIExvZyByYXRlIGxpbWl0IGhlYWRlcnMgZm9yIGRpYWdub3N0aWNzXG4gICAgICAgICAgICBjb25zdCByYXRlTGltaXRSZW1haW5pbmcgPSByZXNwb25zZS5oZWFkZXJzLmdldCgnWC1SYXRlTGltaXQtUmVtYWluaW5nJyk7XG4gICAgICAgICAgICBjb25zdCByYXRlTGltaXRSZXNldCA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KCdYLVJhdGVMaW1pdC1SZXNldCcpO1xuICAgICAgICAgICAgY29uc3QgcmF0ZUxpbWl0TGltaXQgPSByZXNwb25zZS5oZWFkZXJzLmdldCgnWC1SYXRlTGltaXQtTGltaXQnKTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdHaXRIdWIgQVBJIHJhdGUgbGltaXQgc3RhdHVzJywge1xuICAgICAgICAgICAgICBvcGVyYXRpb246ICdjcmVhdGUtY29sbGVjdGlvbi1pc3N1ZScsXG4gICAgICAgICAgICAgIHJlbWFpbmluZzogcmF0ZUxpbWl0UmVtYWluaW5nLFxuICAgICAgICAgICAgICBsaW1pdDogcmF0ZUxpbWl0TGltaXQsXG4gICAgICAgICAgICAgIHJlc2V0VGltZTogcmF0ZUxpbWl0UmVzZXQgPyBuZXcgRGF0ZShwYXJzZUludChyYXRlTGltaXRSZXNldCkgKiAxMDAwKSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgcmVzcG9uc2VTdGF0dXM6IHJlc3BvbnNlLnN0YXR1c1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8vIExvZyB3YXJuaW5nIGlmIGFwcHJvYWNoaW5nIHJhdGUgbGltaXRcbiAgICAgICAgICAgIGlmIChyYXRlTGltaXRSZW1haW5pbmcgJiYgcGFyc2VJbnQocmF0ZUxpbWl0UmVtYWluaW5nKSA8IDEwMCkge1xuICAgICAgICAgICAgICBsb2dnZXIud2FybignQXBwcm9hY2hpbmcgR2l0SHViIEFQSSByYXRlIGxpbWl0Jywge1xuICAgICAgICAgICAgICAgIG9wZXJhdGlvbjogJ2NyZWF0ZS1jb2xsZWN0aW9uLWlzc3VlJyxcbiAgICAgICAgICAgICAgICByZW1haW5pbmc6IHJhdGVMaW1pdFJlbWFpbmluZyxcbiAgICAgICAgICAgICAgICByZXNldFRpbWU6IHJhdGVMaW1pdFJlc2V0ID8gbmV3IERhdGUocGFyc2VJbnQocmF0ZUxpbWl0UmVzZXQpICogMTAwMCkgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgcmVjb21tZW5kYXRpb246ICdDb25zaWRlciByZWR1Y2luZyBBUEkgdXNhZ2UgZnJlcXVlbmN5IG9yIGF1dGhlbnRpY2F0aW5nIGZvciBoaWdoZXIgbGltaXRzJ1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgICAgICAgICBjb25zdCBlcnJvclRleHQgPSBhd2FpdCByZXNwb25zZS50ZXh0KCk7XG4gICAgICAgICAgICAgIGxvZ2dlci5lcnJvcignR2l0SHViIEFQSSBlcnJvciBjcmVhdGluZyBpc3N1ZScsIHsgXG4gICAgICAgICAgICAgICAgc3RhdHVzOiByZXNwb25zZS5zdGF0dXMsIFxuICAgICAgICAgICAgICAgIHN0YXR1c1RleHQ6IHJlc3BvbnNlLnN0YXR1c1RleHQsXG4gICAgICAgICAgICAgICAgZXJyb3I6IGVycm9yVGV4dCxcbiAgICAgICAgICAgICAgICByYXRlTGltaXRSZW1haW5pbmcsXG4gICAgICAgICAgICAgICAgcmF0ZUxpbWl0UmVzZXRcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIFxuICAgICAgICAgICAgICBpZiAocmVzcG9uc2Uuc3RhdHVzID09PSA0MDQpIHtcbiAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoJ0NvbGxlY3Rpb24gcmVwb3NpdG9yeSBub3QgZm91bmQgb3Igbm8gYWNjZXNzJyk7XG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAocmVzcG9uc2Uuc3RhdHVzID09PSA0MDMpIHtcbiAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoJ1Blcm1pc3Npb24gZGVuaWVkIHRvIGNyZWF0ZSBpc3N1ZSBpbiBjb2xsZWN0aW9uIHJlcG8nKTtcbiAgICAgICAgICAgICAgfSBlbHNlIGlmIChyZXNwb25zZS5zdGF0dXMgPT09IDQwMSkge1xuICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcignQXV0aGVudGljYXRpb24gZmFpbGVkIGZvciBjb2xsZWN0aW9uIHN1Ym1pc3Npb24nKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEdpdEh1YiBBUEkgZXJyb3I6ICR7cmVzcG9uc2Uuc3RhdHVzfSAke3Jlc3BvbnNlLnN0YXR1c1RleHR9YCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG4gICAgICAgICAgICByZXR1cm4gZGF0YS5odG1sX3VybDtcbiAgICAgICAgICAgIFxuICAgICAgICAgIH0gY2F0Y2ggKGZldGNoRXJyb3I6IGFueSkge1xuICAgICAgICAgICAgLy8gUmUtdGhyb3cgdG8gb3V0ZXIgY2F0Y2ggYmxvY2tcbiAgICAgICAgICAgIHRocm93IGZldGNoRXJyb3I7XG4gICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0SWQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgJ2hpZ2gnIC8vIEhpZ2ggcHJpb3JpdHkgZm9yIGNvbGxlY3Rpb24gc3VibWlzc2lvblxuICAgICAgKTtcbiAgICAgIFxuICAgICAgcmV0dXJuIGlzc3VlVXJsO1xuXG4gICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgLy8gSGFuZGxlIHRpbWVvdXQgc3BlY2lmaWNhbGx5XG4gICAgICBpZiAoZXJyb3IubmFtZSA9PT0gJ0Fib3J0RXJyb3InKSB7XG4gICAgICAgIGxvZ2dlci5lcnJvcihgR2l0SHViIEFQSSByZXF1ZXN0IHRpbWVvdXQgYWZ0ZXIgJHtnZXRWYWxpZGF0ZWRUaW1lb3V0KCl9bXNgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxvZ2dlci5lcnJvcignRmFpbGVkIHRvIGNyZWF0ZSBjb2xsZWN0aW9uIGlzc3VlJywgeyBcbiAgICAgICAgICBlcnJvcjogZXJyb3IubWVzc2FnZSB8fCBlcnJvclxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZmluZExvY2FsQ29udGVudChuYW1lOiBzdHJpbmcsIHR5cGU6IEVsZW1lbnRUeXBlKTogUHJvbWlzZTxzdHJpbmcgfCBudWxsPiB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIE1FVEFEQVRBIElOREVYIEZJWDogVXNlIHBvcnRmb2xpbyBpbmRleCBmb3IgZmFzdCBtZXRhZGF0YS1iYXNlZCBsb29rdXBzXG4gICAgICAvLyBUaGlzIHNvbHZlcyB0aGUgY3JpdGljYWwgaXNzdWUgd2hlcmUgXCJTYWZlIFJvdW5kdHJpcCBUZXN0ZXJcIiBjb3VsZG4ndCBiZSBmb3VuZFxuICAgICAgLy8gYmVjYXVzZSBmaW5kTG9jYWxDb250ZW50IG9ubHkgc2VhcmNoZWQgZmlsZW5hbWVzLCBub3QgbWV0YWRhdGEgbmFtZXNcbiAgICAgIGNvbnN0IGluZGV4TWFuYWdlciA9IFBvcnRmb2xpb0luZGV4TWFuYWdlci5nZXRJbnN0YW5jZSgpO1xuICAgICAgXG4gICAgICAvLyBVWCBJTVBST1ZFTUVOVDogRW5oYW5jZWQgc2VhcmNoIHdpdGggZnV6enkgbWF0Y2hpbmdcbiAgICAgIGNvbnN0IGluZGV4RW50cnkgPSBhd2FpdCBpbmRleE1hbmFnZXIuZmluZEJ5TmFtZShuYW1lLCB7IFxuICAgICAgICBlbGVtZW50VHlwZTogdHlwZSxcbiAgICAgICAgZnV6enlNYXRjaDogdHJ1ZVxuICAgICAgfSk7XG4gICAgICBcbiAgICAgIGlmIChpbmRleEVudHJ5KSB7XG4gICAgICAgIGxvZ2dlci5kZWJ1ZygnRm91bmQgY29udGVudCB2aWEgbWV0YWRhdGEgaW5kZXgnLCB7IFxuICAgICAgICAgIHNlYXJjaE5hbWU6IG5hbWUsIFxuICAgICAgICAgIG1ldGFkYXRhTmFtZTogaW5kZXhFbnRyeS5tZXRhZGF0YS5uYW1lLFxuICAgICAgICAgIGZpbGVuYW1lOiBpbmRleEVudHJ5LmZpbGVuYW1lLFxuICAgICAgICAgIGZpbGVQYXRoOiBpbmRleEVudHJ5LmZpbGVQYXRoLFxuICAgICAgICAgIHR5cGUgXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gaW5kZXhFbnRyeS5maWxlUGF0aDtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gRkFMTEJBQ0s6IFVzZSBvcmlnaW5hbCBmaWxlIGRpc2NvdmVyeSBpZiBpbmRleCBsb29rdXAgZmFpbHNcbiAgICAgIC8vIFRoaXMgbWFpbnRhaW5zIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgYW5kIGhhbmRsZXMgZWRnZSBjYXNlc1xuICAgICAgbG9nZ2VyLmRlYnVnKCdJbmRleCBsb29rdXAgZmFpbGVkLCBmYWxsaW5nIGJhY2sgdG8gZmlsZSBkaXNjb3ZlcnknLCB7IG5hbWUsIHR5cGUgfSk7XG4gICAgICBcbiAgICAgIGNvbnN0IHBvcnRmb2xpb01hbmFnZXIgPSBQb3J0Zm9saW9NYW5hZ2VyLmdldEluc3RhbmNlKCk7XG4gICAgICBjb25zdCBwb3J0Zm9saW9EaXIgPSBwb3J0Zm9saW9NYW5hZ2VyLmdldEVsZW1lbnREaXIodHlwZSk7XG4gICAgICBcbiAgICAgIC8vIFVYIElNUFJPVkVNRU5UOiBUcnkgbXVsdGlwbGUgc2VhcmNoIHN0cmF0ZWdpZXMgZm9yIGJldHRlciB1c2VyIGV4cGVyaWVuY2VcbiAgICAgIGxldCBmaWxlID0gYXdhaXQgRmlsZURpc2NvdmVyeVV0aWwuZmluZEZpbGUocG9ydGZvbGlvRGlyLCBuYW1lLCB7XG4gICAgICAgIGV4dGVuc2lvbnM6IFsnLm1kJywgJy5qc29uJywgJy55YW1sJywgJy55bWwnXSxcbiAgICAgICAgcGFydGlhbE1hdGNoOiB0cnVlLFxuICAgICAgICBjYWNoZVJlc3VsdHM6IHRydWVcbiAgICAgIH0pO1xuICAgICAgXG4gICAgICAvLyBJZiBub3QgZm91bmQsIHRyeSBub3JtYWxpemluZyB0aGUgbmFtZSAoZS5nLiwgXCJKLkEuUi5WLkkuUy5cIiAtPiBcImotYS1yLXYtaS1zXCIpXG4gICAgICBpZiAoIWZpbGUpIHtcbiAgICAgICAgY29uc3Qgbm9ybWFsaXplZE5hbWUgPSBuYW1lLnRvTG93ZXJDYXNlKClcbiAgICAgICAgICAucmVwbGFjZSgvW15hLXowLTldL2dpLCAnLScpICAvLyBSZXBsYWNlIG5vbi1hbHBoYW51bWVyaWMgd2l0aCBkYXNoZXNcbiAgICAgICAgICAucmVwbGFjZSgvLSsvZywgJy0nKSAgICAgICAgIC8vIFJlcGxhY2UgbXVsdGlwbGUgZGFzaGVzIHdpdGggc2luZ2xlIGRhc2hcbiAgICAgICAgICAucmVwbGFjZSgvKF4tKXwoLSQpL2csICcnKTsgICAgICAvLyBSZW1vdmUgbGVhZGluZy90cmFpbGluZyBkYXNoZXNcbiAgICAgICAgICBcbiAgICAgICAgaWYgKG5vcm1hbGl6ZWROYW1lICE9PSBuYW1lLnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgICAgICBsb2dnZXIuZGVidWcoJ1RyeWluZyBub3JtYWxpemVkIG5hbWUgc2VhcmNoJywgeyBcbiAgICAgICAgICAgIG9yaWdpbmFsOiBuYW1lLCBcbiAgICAgICAgICAgIG5vcm1hbGl6ZWQ6IG5vcm1hbGl6ZWROYW1lLFxuICAgICAgICAgICAgdHlwZSBcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBcbiAgICAgICAgICBmaWxlID0gYXdhaXQgRmlsZURpc2NvdmVyeVV0aWwuZmluZEZpbGUocG9ydGZvbGlvRGlyLCBub3JtYWxpemVkTmFtZSwge1xuICAgICAgICAgICAgZXh0ZW5zaW9uczogWycubWQnLCAnLmpzb24nLCAnLnlhbWwnLCAnLnltbCddLFxuICAgICAgICAgICAgcGFydGlhbE1hdGNoOiB0cnVlLFxuICAgICAgICAgICAgY2FjaGVSZXN1bHRzOiB0cnVlXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gSWYgc3RpbGwgbm90IGZvdW5kLCB0cnkgc2VhcmNoaW5nIGJ5IGRpc3BsYXkgbmFtZSBwYXR0ZXJuc1xuICAgICAgaWYgKCFmaWxlKSB7XG4gICAgICAgIC8vIFRyeSBjb21tb24gdmFyaWF0aW9ucyBsaWtlIHJlbW92aW5nIGRvdHMsIHNwYWNlcywgZXRjLlxuICAgICAgICBjb25zdCB2YXJpYXRpb25zID0gW1xuICAgICAgICAgIG5hbWUucmVwbGFjZSgvXFwuL2csICcnKSwgICAgICAgIC8vIFJlbW92ZSBkb3RzOiBcIkouQS5SLlYuSS5TLlwiIC0+IFwiSkFSVklTXCJcbiAgICAgICAgICBuYW1lLnJlcGxhY2UoL1xccysvZywgJy0nKSwgICAgICAvLyBSZXBsYWNlIHNwYWNlcyB3aXRoIGRhc2hlc1xuICAgICAgICAgIG5hbWUucmVwbGFjZSgvW1xcc1xcLl0vZywgJycpLCAgICAvLyBSZW1vdmUgc3BhY2VzIGFuZCBkb3RzXG4gICAgICAgICAgbmFtZS5yZXBsYWNlKC9bXFxzXFwuXS9nLCAnLScpLCAgIC8vIFJlcGxhY2Ugc3BhY2VzIGFuZCBkb3RzIHdpdGggZGFzaGVzXG4gICAgICAgIF0uZmlsdGVyKHYgPT4gdiAhPT0gbmFtZSAmJiB2Lmxlbmd0aCA+IDApO1xuICAgICAgICBcbiAgICAgICAgZm9yIChjb25zdCB2YXJpYXRpb24gb2YgdmFyaWF0aW9ucykge1xuICAgICAgICAgIGZpbGUgPSBhd2FpdCBGaWxlRGlzY292ZXJ5VXRpbC5maW5kRmlsZShwb3J0Zm9saW9EaXIsIHZhcmlhdGlvbiwge1xuICAgICAgICAgICAgZXh0ZW5zaW9uczogWycubWQnLCAnLmpzb24nLCAnLnlhbWwnLCAnLnltbCddLFxuICAgICAgICAgICAgcGFydGlhbE1hdGNoOiB0cnVlLFxuICAgICAgICAgICAgY2FjaGVSZXN1bHRzOiB0cnVlXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgXG4gICAgICAgICAgaWYgKGZpbGUpIHtcbiAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnRm91bmQgY29udGVudCB1c2luZyBuYW1lIHZhcmlhdGlvbicsIHtcbiAgICAgICAgICAgICAgb3JpZ2luYWw6IG5hbWUsXG4gICAgICAgICAgICAgIHZhcmlhdGlvbixcbiAgICAgICAgICAgICAgZmlsZSxcbiAgICAgICAgICAgICAgdHlwZVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIFxuICAgICAgaWYgKGZpbGUpIHtcbiAgICAgICAgbG9nZ2VyLmRlYnVnKCdGb3VuZCBsb2NhbCBjb250ZW50IGZpbGUgdmlhIGZhbGxiYWNrJywgeyBuYW1lLCB0eXBlLCBmaWxlIH0pO1xuICAgICAgICByZXR1cm4gZmlsZTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgbG9nZ2VyLmRlYnVnKCdObyBjb250ZW50IGZvdW5kJywgeyBuYW1lLCB0eXBlIH0pO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgICBcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbG9nZ2VyLmVycm9yKCdFcnJvciBmaW5kaW5nIGxvY2FsIGNvbnRlbnQnLCB7XG4gICAgICAgIG5hbWUsXG4gICAgICAgIHR5cGUsXG4gICAgICAgIGVycm9yOiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcilcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNtYXJ0IGVsZW1lbnQgdHlwZSBkZXRlY3Rpb24gLSBzZWFyY2hlcyBhY3Jvc3MgQUxMIGVsZW1lbnQgdHlwZXMgZm9yIGNvbnRlbnRcbiAgICogUEVSRk9STUFOQ0UgT1BUSU1JWkFUSU9OIChUYXNrICM5KTogVXNlcyBlYXJseSB0ZXJtaW5hdGlvbiBmb3IgZXhhY3QgbWF0Y2hlc1xuICAgKiBUaGlzIHJlcGxhY2VzIHRoZSBwcmV2aW91cyBoYXJkY29kZWQgZGVmYXVsdCB0byBQRVJTT05BIGFuZCBlbmFibGVzIHByb3BlciB0eXBlIGRldGVjdGlvblxuICAgKiBcbiAgICogQHBhcmFtIG5hbWUgVGhlIGNvbnRlbnQgbmFtZSB0byBzZWFyY2ggZm9yXG4gICAqIEByZXR1cm5zIERldGVjdGlvbiByZXN1bHQgd2l0aCBmb3VuZCBtYXRjaGVzIGFjcm9zcyBhbGwgZWxlbWVudCB0eXBlc1xuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBkZXRlY3RFbGVtZW50VHlwZShuYW1lOiBzdHJpbmcpOiBQcm9taXNlPEVsZW1lbnREZXRlY3Rpb25SZXN1bHQ+IHtcbiAgICB0cnkge1xuICAgICAgLy8gUEVSRk9STUFOQ0UgT1BUSU1JWkFUSU9OIChUYXNrICM5KTogVXNlIGVhcmx5IHRlcm1pbmF0aW9uIHNlYXJjaCB1dGlsaXR5XG4gICAgICAvLyBDcmVhdGUgc2VhcmNoIGZ1bmN0aW9ucyBmb3IgZWFjaCBlbGVtZW50IHR5cGVcbiAgICAgIGNvbnN0IGVsZW1lbnRUeXBlcyA9IE9iamVjdC52YWx1ZXMoRWxlbWVudFR5cGUpO1xuICAgICAgY29uc3Qgc2VhcmNoRnVuY3Rpb25zID0gZWxlbWVudFR5cGVzLm1hcCgodHlwZSkgPT4gYXN5bmMgKCkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IGZpbGVQYXRoID0gYXdhaXQgdGhpcy5maW5kTG9jYWxDb250ZW50KG5hbWUsIHR5cGUpO1xuICAgICAgICAgIGlmIChmaWxlUGF0aCkge1xuICAgICAgICAgICAgcmV0dXJuIHsgdHlwZTogdHlwZSBhcyBFbGVtZW50VHlwZSwgcGF0aDogZmlsZVBhdGggfTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgICAgICAvLyBMb2cgdW5leHBlY3RlZCBlcnJvcnMgYnV0IGRvbid0IGZhaWwgdGhlIHNlYXJjaFxuICAgICAgICAgIGlmIChlcnJvcj8uY29kZSAhPT0gJ0VOT0VOVCcgJiYgZXJyb3I/LmNvZGUgIT09ICdFTk9URElSJykge1xuICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGBFcnJvciBzZWFyY2hpbmcgJHt0eXBlfSBkaXJlY3RvcnkgZm9yIGNvbnRlbnQgZGV0ZWN0aW9uYCwgeyBcbiAgICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgICAgdHlwZSxcbiAgICAgICAgICAgICAgZXJyb3I6IGVycm9yPy5tZXNzYWdlIHx8IFN0cmluZyhlcnJvciksXG4gICAgICAgICAgICAgIGNvZGU6IGVycm9yPy5jb2RlIFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIFJldHVybiBudWxsIGluc3RlYWQgb2YgdGhyb3dpbmcgdG8gbGV0IG90aGVyIHNlYXJjaGVzIGNvbnRpbnVlXG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICAvLyBQRVJGT1JNQU5DRSBPUFRJTUlaQVRJT04gKFRhc2sgIzkpOiBEZWZpbmUgZXhhY3QgbWF0Y2ggY3JpdGVyaWFcbiAgICAgIGNvbnN0IGlzRXhhY3RNYXRjaCA9IChtYXRjaDogRWxlbWVudERldGVjdGlvbk1hdGNoKTogYm9vbGVhbiA9PiB7XG4gICAgICAgIGNvbnN0IGZpbGVuYW1lID0gcGF0aC5iYXNlbmFtZShtYXRjaC5wYXRoLCBwYXRoLmV4dG5hbWUobWF0Y2gucGF0aCkpO1xuICAgICAgICByZXR1cm4gZmlsZW5hbWUudG9Mb3dlckNhc2UoKSA9PT0gbmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgfTtcblxuICAgICAgLy8gRXhlY3V0ZSBzZWFyY2hlcyB3aXRoIGVhcmx5IHRlcm1pbmF0aW9uIG9wdGltaXphdGlvblxuICAgICAgY29uc3Qgc2VhcmNoUmVzdWx0cyA9IGF3YWl0IEVhcmx5VGVybWluYXRpb25TZWFyY2guZXhlY3V0ZVdpdGhFYXJseVRlcm1pbmF0aW9uKFxuICAgICAgICBzZWFyY2hGdW5jdGlvbnMsXG4gICAgICAgIGlzRXhhY3RNYXRjaCxcbiAgICAgICAge1xuICAgICAgICAgIG9wZXJhdGlvbk5hbWU6ICdlbGVtZW50LXR5cGUtZGV0ZWN0aW9uJyxcbiAgICAgICAgICB0aW1lb3V0QWZ0ZXJFeGFjdE1hdGNoOiAxMDAwLCAvLyBXYWl0IDEgc2Vjb25kIGZvciBvdGhlciBzZWFyY2hlcyBhZnRlciBleGFjdCBtYXRjaFxuICAgICAgICAgIG1heFBhcmFsbGVsU2VhcmNoZXM6IDggLy8gTGltaXQgY29uY3VycmVudCBzZWFyY2hlcyB0byBhdm9pZCBvdmVyd2hlbG1pbmcgdGhlIHN5c3RlbVxuICAgICAgICB9XG4gICAgICApO1xuXG4gICAgICAvLyBQRVJGT1JNQU5DRSBPUFRJTUlaQVRJT04gKFRhc2sgIzgpOiBFbmhhbmNlZCBiYXRjaCBvcGVyYXRpb24gcmVwb3J0aW5nXG4gICAgICBjb25zdCBiYXRjaFJlc3VsdHMgPSB7XG4gICAgICAgIG5hbWUsXG4gICAgICAgIHRvdGFsU2VhcmNoZXM6IHNlYXJjaFJlc3VsdHMudG90YWxTZWFyY2hlcyxcbiAgICAgICAgY29tcGxldGVkU2VhcmNoZXM6IHNlYXJjaFJlc3VsdHMuY29tcGxldGVkU2VhcmNoZXMsXG4gICAgICAgIG1hdGNoZXM6IHNlYXJjaFJlc3VsdHMubWF0Y2hlcy5sZW5ndGgsXG4gICAgICAgIGZhaWx1cmVzOiBzZWFyY2hSZXN1bHRzLmZhaWx1cmVzLmxlbmd0aCxcbiAgICAgICAgZXhhY3RNYXRjaEZvdW5kOiAhIXNlYXJjaFJlc3VsdHMuZXhhY3RNYXRjaCxcbiAgICAgICAgZXhhY3RNYXRjaFR5cGU6IHNlYXJjaFJlc3VsdHMuZXhhY3RNYXRjaD8udHlwZSxcbiAgICAgICAgZWFybHlUZXJtaW5hdGlvblRyaWdnZXJlZDogc2VhcmNoUmVzdWx0cy5lYXJseVRlcm1pbmF0aW9uVHJpZ2dlcmVkLFxuICAgICAgICBwZXJmb3JtYW5jZUdhaW46IHNlYXJjaFJlc3VsdHMucGVyZm9ybWFuY2VHYWluLFxuICAgICAgICBtYXRjaGVkVHlwZXM6IHNlYXJjaFJlc3VsdHMubWF0Y2hlcy5tYXAobSA9PiBtLnR5cGUpLFxuICAgICAgICBmYWlsZWRUeXBlczogc2VhcmNoUmVzdWx0cy5mYWlsdXJlcy5tYXAoZiA9PiBlbGVtZW50VHlwZXNbZi5pbmRleF0pLmZpbHRlcihCb29sZWFuKVxuICAgICAgfTtcblxuICAgICAgbG9nZ2VyLmRlYnVnKCdFbGVtZW50IHR5cGUgZGV0ZWN0aW9uIGNvbXBsZXRlZCB3aXRoIGVhcmx5IHRlcm1pbmF0aW9uIG9wdGltaXphdGlvbicsIGJhdGNoUmVzdWx0cyk7XG5cbiAgICAgIC8vIFBFUkZPUk1BTkNFIE9QVElNSVpBVElPTiAoVGFzayAjOCk6IENsZWFyIHJlcG9ydGluZyBvZiBwYXJ0aWFsIGZhaWx1cmVzXG4gICAgICBpZiAoc2VhcmNoUmVzdWx0cy5mYWlsdXJlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKCdTb21lIGVsZW1lbnQgdHlwZSBzZWFyY2hlcyBmYWlsZWQgZHVyaW5nIGJhdGNoIG9wZXJhdGlvbicsIHtcbiAgICAgICAgICBuYW1lLFxuICAgICAgICAgIGZhaWx1cmVzOiBzZWFyY2hSZXN1bHRzLmZhaWx1cmVzLm1hcChmID0+ICh7XG4gICAgICAgICAgICB0eXBlOiBlbGVtZW50VHlwZXNbZi5pbmRleF0gfHwgJ3Vua25vd24nLFxuICAgICAgICAgICAgZXJyb3I6IGYuZXJyb3Iuc3Vic3RyaW5nKDAsIDEwMCkgLy8gVHJ1bmNhdGUgbG9uZyBlcnJvciBtZXNzYWdlc1xuICAgICAgICAgIH0pKSxcbiAgICAgICAgICBzdWNjZXNzUmF0ZTogYCR7c2VhcmNoUmVzdWx0cy5jb21wbGV0ZWRTZWFyY2hlc30vJHtzZWFyY2hSZXN1bHRzLnRvdGFsU2VhcmNoZXN9YCxcbiAgICAgICAgICBpbXBhY3RPblJlc3VsdHM6IHNlYXJjaFJlc3VsdHMubWF0Y2hlcy5sZW5ndGggPiAwIFxuICAgICAgICAgICAgPyAnTm8gaW1wYWN0IC0gbWF0Y2hlcyBmb3VuZCBpbiBzdWNjZXNzZnVsIHNlYXJjaGVzJyBcbiAgICAgICAgICAgIDogJ1BvdGVudGlhbCBpbXBhY3QgLSBubyBtYXRjaGVzIGZvdW5kJ1xuICAgICAgICB9KTtcblxuICAgICAgICAvLyBJZiB3ZSBoYXZlIGZhaWx1cmVzIGFuZCBubyBtYXRjaGVzLCBwcm92aWRlIGFjdGlvbmFibGUgZ3VpZGFuY2VcbiAgICAgICAgaWYgKHNlYXJjaFJlc3VsdHMubWF0Y2hlcy5sZW5ndGggPT09IDAgJiYgc2VhcmNoUmVzdWx0cy5mYWlsdXJlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgbG9nZ2VyLndhcm4oJ0JhdGNoIG9wZXJhdGlvbiBoYWQgZmFpbHVyZXMgYW5kIG5vIG1hdGNoZXMgZm91bmQnLCB7XG4gICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgcmVjb21tZW5kYXRpb246ICdDb25zaWRlciBjaGVja2luZyBmaWxlIHBlcm1pc3Npb25zIG9yIHBvcnRmb2xpbyBzdHJ1Y3R1cmUnLFxuICAgICAgICAgICAgZmFpbHVyZUNvdW50OiBzZWFyY2hSZXN1bHRzLmZhaWx1cmVzLmxlbmd0aCxcbiAgICAgICAgICAgIHRvdGFsU2VhcmNoZXM6IHNlYXJjaFJlc3VsdHMudG90YWxTZWFyY2hlc1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIExvZyBwZXJmb3JtYW5jZSBnYWlucyBmcm9tIGVhcmx5IHRlcm1pbmF0aW9uXG4gICAgICBpZiAoc2VhcmNoUmVzdWx0cy5lYXJseVRlcm1pbmF0aW9uVHJpZ2dlcmVkKSB7XG4gICAgICAgIGxvZ2dlci5pbmZvKCdFYXJseSB0ZXJtaW5hdGlvbiBvcHRpbWl6YXRpb24gYXBwbGllZCBzdWNjZXNzZnVsbHknLCB7XG4gICAgICAgICAgbmFtZSxcbiAgICAgICAgICBleGFjdE1hdGNoVHlwZTogc2VhcmNoUmVzdWx0cy5leGFjdE1hdGNoPy50eXBlLFxuICAgICAgICAgIHBlcmZvcm1hbmNlR2Fpbjogc2VhcmNoUmVzdWx0cy5wZXJmb3JtYW5jZUdhaW4sXG4gICAgICAgICAgc2VhcmNoZXNDb21wbGV0ZWQ6IHNlYXJjaFJlc3VsdHMuY29tcGxldGVkU2VhcmNoZXMsXG4gICAgICAgICAgc2VhcmNoZXNUb3RhbDogc2VhcmNoUmVzdWx0cy50b3RhbFNlYXJjaGVzXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBmb3VuZDogc2VhcmNoUmVzdWx0cy5tYXRjaGVzLmxlbmd0aCA+IDAsXG4gICAgICAgIG1hdGNoZXM6IHNlYXJjaFJlc3VsdHMubWF0Y2hlc1xuICAgICAgfTtcblxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoJ0Vycm9yIGluIGVsZW1lbnQgdHlwZSBkZXRlY3Rpb24nLCB7XG4gICAgICAgIG5hbWUsXG4gICAgICAgIGVycm9yOiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcilcbiAgICAgIH0pO1xuICAgICAgXG4gICAgICAvLyBSZXR1cm4gZW1wdHkgcmVzdWx0IG9uIGRldGVjdGlvbiBmYWlsdXJlXG4gICAgICByZXR1cm4ge1xuICAgICAgICBmb3VuZDogZmFsc2UsXG4gICAgICAgIG1hdGNoZXM6IFtdXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBVWCBJTVBST1ZFTUVOVDogR2VuZXJhdGUgbmFtZSBzdWdnZXN0aW9ucyBmb3Igc2ltaWxhciBjb250ZW50XG4gICAqIFBFUkZPUk1BTkNFIE9QVElNSVpBVElPTiAoVGFzayAjOCk6IEVuaGFuY2VkIGJhdGNoIG9wZXJhdGlvbiBoYW5kbGluZyB3aXRoIGNsZWFyIHBhcnRpYWwgZmFpbHVyZSByZXBvcnRpbmdcbiAgICogSGVscHMgdXNlcnMgZmluZCBjb250ZW50IHdoZW4gZXhhY3QgbWF0Y2hlcyBmYWlsXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGdlbmVyYXRlTmFtZVN1Z2dlc3Rpb25zKHNlYXJjaE5hbWU6IHN0cmluZyk6IFByb21pc2U8QXJyYXk8e25hbWU6IHN0cmluZywgdHlwZTogc3RyaW5nfT4+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgc3VnZ2VzdGlvbnM6IEFycmF5PHtuYW1lOiBzdHJpbmcsIHR5cGU6IHN0cmluZ30+ID0gW107XG4gICAgICBjb25zdCBzZWFyY2hMb3dlciA9IHNlYXJjaE5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgIGNvbnN0IGVsZW1lbnRUeXBlcyA9IE9iamVjdC52YWx1ZXMoRWxlbWVudFR5cGUpO1xuICAgICAgXG4gICAgICAvLyBUcmFjayBiYXRjaCBvcGVyYXRpb24gcmVzdWx0cyBmb3IgYmV0dGVyIGRpYWdub3N0aWNzXG4gICAgICBjb25zdCBiYXRjaFJlc3VsdHMgPSB7XG4gICAgICAgIHNlYXJjaE5hbWUsXG4gICAgICAgIHRvdGFsVHlwZXM6IGVsZW1lbnRUeXBlcy5sZW5ndGgsXG4gICAgICAgIHN1Y2Nlc3NmdWxTY2FuczogMCxcbiAgICAgICAgZmFpbGVkU2NhbnM6IDAsXG4gICAgICAgIGZhaWx1cmVEZXRhaWxzOiBbXSBhcyBBcnJheTx7IHR5cGU6IEVsZW1lbnRUeXBlOyBlcnJvcjogc3RyaW5nIH0+LFxuICAgICAgICB0b3RhbFN1Z2dlc3Rpb25zOiAwLFxuICAgICAgICBzdWdnZXN0aW9uc0J5VHlwZToge30gYXMgUmVjb3JkPHN0cmluZywgbnVtYmVyPlxuICAgICAgfTtcbiAgICAgIFxuICAgICAgLy8gUHJvY2VzcyBhbGwgZWxlbWVudCB0eXBlcyBmb3Igc3VnZ2VzdGlvbnNcbiAgICAgIGZvciAoY29uc3QgZWxlbWVudFR5cGUgb2YgZWxlbWVudFR5cGVzKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgcG9ydGZvbGlvTWFuYWdlciA9IFBvcnRmb2xpb01hbmFnZXIuZ2V0SW5zdGFuY2UoKTtcbiAgICAgICAgICBjb25zdCBlbGVtZW50RGlyID0gcG9ydGZvbGlvTWFuYWdlci5nZXRFbGVtZW50RGlyKGVsZW1lbnRUeXBlKTtcbiAgICAgICAgICBcbiAgICAgICAgICAvLyBHZXQgZmlsZXMgaW4gdGhpcyBkaXJlY3RvcnlcbiAgICAgICAgICBjb25zdCBmaWxlcyA9IGF3YWl0IEZpbGVEaXNjb3ZlcnlVdGlsLmZpbmRGaWxlKGVsZW1lbnREaXIsICcqJywge1xuICAgICAgICAgICAgZXh0ZW5zaW9uczogWycubWQnLCAnLmpzb24nLCAnLnlhbWwnLCAnLnltbCddLFxuICAgICAgICAgICAgcGFydGlhbE1hdGNoOiBmYWxzZSxcbiAgICAgICAgICAgIGNhY2hlUmVzdWx0czogdHJ1ZVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIFxuICAgICAgICAgIGxldCB0eXBlU3VnZ2VzdGlvbnMgPSAwO1xuICAgICAgICAgIFxuICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGZpbGVzKSkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBmaWxlUGF0aCBvZiBmaWxlcykge1xuICAgICAgICAgICAgICBjb25zdCBiYXNlbmFtZSA9IHBhdGguYmFzZW5hbWUoZmlsZVBhdGgsIHBhdGguZXh0bmFtZShmaWxlUGF0aCkpO1xuICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgLy8gQ2FsY3VsYXRlIHNpbWlsYXJpdHkgdXNpbmcgc2ltcGxlIG1ldHJpY3NcbiAgICAgICAgICAgICAgaWYgKHRoaXMuY2FsY3VsYXRlU2ltaWxhcml0eShzZWFyY2hMb3dlciwgYmFzZW5hbWUudG9Mb3dlckNhc2UoKSkgPiBTRUFSQ0hfQ09ORklHLk1JTl9TSU1JTEFSSVRZX1NDT1JFKSB7XG4gICAgICAgICAgICAgICAgc3VnZ2VzdGlvbnMucHVzaCh7XG4gICAgICAgICAgICAgICAgICBuYW1lOiBiYXNlbmFtZSxcbiAgICAgICAgICAgICAgICAgIHR5cGU6IGVsZW1lbnRUeXBlXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgdHlwZVN1Z2dlc3Rpb25zKys7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2UgaWYgKGZpbGVzKSB7XG4gICAgICAgICAgICBjb25zdCBiYXNlbmFtZSA9IHBhdGguYmFzZW5hbWUoZmlsZXMsIHBhdGguZXh0bmFtZShmaWxlcykpO1xuICAgICAgICAgICAgaWYgKHRoaXMuY2FsY3VsYXRlU2ltaWxhcml0eShzZWFyY2hMb3dlciwgYmFzZW5hbWUudG9Mb3dlckNhc2UoKSkgPiBTRUFSQ0hfQ09ORklHLk1JTl9TSU1JTEFSSVRZX1NDT1JFKSB7XG4gICAgICAgICAgICAgIHN1Z2dlc3Rpb25zLnB1c2goe1xuICAgICAgICAgICAgICAgIG5hbWU6IGJhc2VuYW1lLFxuICAgICAgICAgICAgICAgIHR5cGU6IGVsZW1lbnRUeXBlXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB0eXBlU3VnZ2VzdGlvbnMrKztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgXG4gICAgICAgICAgYmF0Y2hSZXN1bHRzLnN1Y2Nlc3NmdWxTY2FucysrO1xuICAgICAgICAgIGJhdGNoUmVzdWx0cy5zdWdnZXN0aW9uc0J5VHlwZVtlbGVtZW50VHlwZV0gPSB0eXBlU3VnZ2VzdGlvbnM7XG4gICAgICAgICAgXG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgLy8gUEVSRk9STUFOQ0UgT1BUSU1JWkFUSU9OIChUYXNrICM4KTogVHJhY2sgYW5kIHJlcG9ydCBwYXJ0aWFsIGZhaWx1cmVzXG4gICAgICAgICAgYmF0Y2hSZXN1bHRzLmZhaWxlZFNjYW5zKys7XG4gICAgICAgICAgYmF0Y2hSZXN1bHRzLmZhaWx1cmVEZXRhaWxzLnB1c2goe1xuICAgICAgICAgICAgdHlwZTogZWxlbWVudFR5cGUsXG4gICAgICAgICAgICBlcnJvcjogZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgXG4gICAgICAgICAgLy8gTG9nIGluZGl2aWR1YWwgZmFpbHVyZXMgZm9yIGRpYWdub3N0aWNzXG4gICAgICAgICAgbG9nZ2VyLmRlYnVnKCdGYWlsZWQgdG8gc2NhbiBlbGVtZW50IHR5cGUgZm9yIHN1Z2dlc3Rpb25zJywge1xuICAgICAgICAgICAgZWxlbWVudFR5cGUsXG4gICAgICAgICAgICBzZWFyY2hOYW1lLFxuICAgICAgICAgICAgZXJyb3I6IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBcbiAgICAgIGJhdGNoUmVzdWx0cy50b3RhbFN1Z2dlc3Rpb25zID0gc3VnZ2VzdGlvbnMubGVuZ3RoO1xuICAgICAgXG4gICAgICAvLyBQRVJGT1JNQU5DRSBPUFRJTUlaQVRJT04gKFRhc2sgIzgpOiBDb21wcmVoZW5zaXZlIGJhdGNoIG9wZXJhdGlvbiByZXBvcnRpbmdcbiAgICAgIGxvZ2dlci5kZWJ1ZygnTmFtZSBzdWdnZXN0aW9uIGJhdGNoIG9wZXJhdGlvbiBjb21wbGV0ZWQnLCB7XG4gICAgICAgIC4uLmJhdGNoUmVzdWx0cyxcbiAgICAgICAgc3VjY2Vzc1JhdGU6IGAke2JhdGNoUmVzdWx0cy5zdWNjZXNzZnVsU2NhbnN9LyR7YmF0Y2hSZXN1bHRzLnRvdGFsVHlwZXN9YCxcbiAgICAgICAgLy8gRG9uJ3QgbG9nIGZ1bGwgZmFpbHVyZSBkZXRhaWxzIGF0IGRlYnVnIGxldmVsIHRvIGF2b2lkIHNwYW1cbiAgICAgICAgaGFzRmFpbHVyZXM6IGJhdGNoUmVzdWx0cy5mYWlsZWRTY2FucyA+IDBcbiAgICAgIH0pO1xuICAgICAgXG4gICAgICAvLyBSZXBvcnQgZmFpbHVyZXMgY2xlYXJseSBpZiB0aGV5IG9jY3VycmVkXG4gICAgICBpZiAoYmF0Y2hSZXN1bHRzLmZhaWxlZFNjYW5zID4gMCkge1xuICAgICAgICBsb2dnZXIud2FybignU29tZSBlbGVtZW50IHR5cGUgc2NhbnMgZmFpbGVkIGR1cmluZyBuYW1lIHN1Z2dlc3Rpb24gZ2VuZXJhdGlvbicsIHtcbiAgICAgICAgICBzZWFyY2hOYW1lLFxuICAgICAgICAgIGZhaWxlZFR5cGVzOiBiYXRjaFJlc3VsdHMuZmFpbHVyZURldGFpbHMubWFwKGYgPT4gZi50eXBlKSxcbiAgICAgICAgICBzdWNjZXNzZnVsVHlwZXM6IGJhdGNoUmVzdWx0cy5zdWNjZXNzZnVsU2NhbnMsXG4gICAgICAgICAgaW1wYWN0T25SZXN1bHRzOiBiYXRjaFJlc3VsdHMudG90YWxTdWdnZXN0aW9ucyA+IDAgXG4gICAgICAgICAgICA/ICdQYXJ0aWFsIGltcGFjdCAtIHN1Z2dlc3Rpb25zIGZvdW5kIGZyb20gc3VjY2Vzc2Z1bCBzY2FucycgXG4gICAgICAgICAgICA6ICdQb3RlbnRpYWwgaW1wYWN0IC0gbm8gc3VnZ2VzdGlvbnMgZ2VuZXJhdGVkJyxcbiAgICAgICAgICByZWNvbW1lbmRhdGlvbjogYmF0Y2hSZXN1bHRzLnRvdGFsU3VnZ2VzdGlvbnMgPT09IDAgJiYgYmF0Y2hSZXN1bHRzLmZhaWxlZFNjYW5zID4gMFxuICAgICAgICAgICAgPyAnQ2hlY2sgcG9ydGZvbGlvIGRpcmVjdG9yeSBzdHJ1Y3R1cmUgYW5kIGZpbGUgcGVybWlzc2lvbnMnXG4gICAgICAgICAgICA6ICdTdWdnZXN0aW9uIGdlbmVyYXRpb24gcGFydGlhbGx5IHN1Y2Nlc3NmdWwgZGVzcGl0ZSBzb21lIGZhaWx1cmVzJ1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gU29ydCBieSBzaW1pbGFyaXR5IChoaWdoZXIgaXMgYmV0dGVyKSBhbmQgcmV0dXJuIHRvcCBzdWdnZXN0aW9uc1xuICAgICAgY29uc3Qgc29ydGVkU3VnZ2VzdGlvbnMgPSBzdWdnZXN0aW9ucy5zb3J0KChhLCBiKSA9PiB7XG4gICAgICAgIGNvbnN0IHNpbUEgPSB0aGlzLmNhbGN1bGF0ZVNpbWlsYXJpdHkoc2VhcmNoTG93ZXIsIGEubmFtZS50b0xvd2VyQ2FzZSgpKTtcbiAgICAgICAgY29uc3Qgc2ltQiA9IHRoaXMuY2FsY3VsYXRlU2ltaWxhcml0eShzZWFyY2hMb3dlciwgYi5uYW1lLnRvTG93ZXJDYXNlKCkpO1xuICAgICAgICByZXR1cm4gc2ltQiAtIHNpbUE7XG4gICAgICB9KTtcbiAgICAgIFxuICAgICAgbG9nZ2VyLmRlYnVnKCdOYW1lIHN1Z2dlc3Rpb25zIGdlbmVyYXRlZCBzdWNjZXNzZnVsbHknLCB7XG4gICAgICAgIHNlYXJjaE5hbWUsXG4gICAgICAgIHRvdGFsU3VnZ2VzdGlvbnM6IHNvcnRlZFN1Z2dlc3Rpb25zLmxlbmd0aCxcbiAgICAgICAgdG9wU3VnZ2VzdGlvbnM6IHNvcnRlZFN1Z2dlc3Rpb25zLnNsaWNlKDAsIDMpLm1hcChzID0+IHMubmFtZSlcbiAgICAgIH0pO1xuICAgICAgXG4gICAgICByZXR1cm4gc29ydGVkU3VnZ2VzdGlvbnM7XG4gICAgICBcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbG9nZ2VyLndhcm4oJ0ZhaWxlZCB0byBnZW5lcmF0ZSBuYW1lIHN1Z2dlc3Rpb25zIC0gYmF0Y2ggb3BlcmF0aW9uIGZhaWxlZCBjb21wbGV0ZWx5JywgeyBcbiAgICAgICAgc2VhcmNoTmFtZSwgXG4gICAgICAgIGVycm9yOiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvciksXG4gICAgICAgIHJlY29tbWVuZGF0aW9uOiAnQ2hlY2sgcG9ydGZvbGlvIHN0cnVjdHVyZSBhbmQgcGVybWlzc2lvbnMnXG4gICAgICB9KTtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBTaW1wbGUgc2ltaWxhcml0eSBjYWxjdWxhdGlvbiB1c2luZyBMZXZlbnNodGVpbi1saWtlIGFwcHJvYWNoXG4gICAqIFJldHVybnMgdmFsdWUgYmV0d2VlbiAwIGFuZCAxLCB3aGVyZSAxIGlzIGlkZW50aWNhbFxuICAgKi9cbiAgcHJpdmF0ZSBjYWxjdWxhdGVTaW1pbGFyaXR5KHN0cjE6IHN0cmluZywgc3RyMjogc3RyaW5nKTogbnVtYmVyIHtcbiAgICAvLyBIYW5kbGUgZXhhY3QgbWF0Y2hlc1xuICAgIGlmIChzdHIxID09PSBzdHIyKSByZXR1cm4gMTtcbiAgICBcbiAgICAvLyBIYW5kbGUgc3Vic3RyaW5nIG1hdGNoZXNcbiAgICBpZiAoc3RyMS5pbmNsdWRlcyhzdHIyKSB8fCBzdHIyLmluY2x1ZGVzKHN0cjEpKSByZXR1cm4gMC44O1xuICAgIFxuICAgIC8vIEhhbmRsZSBwYXJ0aWFsIG1hdGNoZXNcbiAgICBjb25zdCBsb25nZXIgPSBzdHIxLmxlbmd0aCA+IHN0cjIubGVuZ3RoID8gc3RyMSA6IHN0cjI7XG4gICAgY29uc3Qgc2hvcnRlciA9IHN0cjEubGVuZ3RoID4gc3RyMi5sZW5ndGggPyBzdHIyIDogc3RyMTtcbiAgICBcbiAgICBpZiAobG9uZ2VyLmxlbmd0aCA9PT0gMCkgcmV0dXJuIDA7XG4gICAgXG4gICAgLy8gQ291bnQgY29tbW9uIGNoYXJhY3RlcnNcbiAgICBsZXQgY29tbW9uID0gMDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNob3J0ZXIubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChsb25nZXIuaW5jbHVkZXMoc2hvcnRlcltpXSkpIHtcbiAgICAgICAgY29tbW9uKys7XG4gICAgICB9XG4gICAgfVxuICAgIFxuICAgIHJldHVybiBjb21tb24gLyBsb25nZXIubGVuZ3RoO1xuICB9XG4gIFxuICAvKipcbiAgICogVVggSU1QUk9WRU1FTlQ6IFNhdmUgZWxlbWVudCB3aXRoIGF1dG9tYXRpYyByZXRyeSBsb2dpYyBmb3IgdHJhbnNpZW50IGZhaWx1cmVzXG4gICAqIEhhbmRsZXMgY29tbW9uIEdpdEh1YiBBUEkgaXNzdWVzIGxpa2UgcmF0ZSBsaW1pdHMgYW5kIHRlbXBvcmFyeSBuZXR3b3JrIHByb2JsZW1zXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHNhdmVFbGVtZW50V2l0aFJldHJ5KFxuICAgIGFkYXB0ZXI6IFBvcnRmb2xpb0VsZW1lbnRBZGFwdGVyLCBcbiAgICBlbGVtZW50TmFtZTogc3RyaW5nLCBcbiAgICBlbGVtZW50VHlwZTogRWxlbWVudFR5cGUsXG4gICAgbWF4UmV0cmllczogbnVtYmVyID0gUkVUUllfQ09ORklHLk1BWF9BVFRFTVBUU1xuICApOiBQcm9taXNlPHN0cmluZyB8IG51bGw+IHtcbiAgICBsZXQgbGFzdEVycm9yOiBhbnkgPSBudWxsO1xuICAgIFxuICAgIGZvciAobGV0IGF0dGVtcHQgPSAxOyBhdHRlbXB0IDw9IG1heFJldHJpZXM7IGF0dGVtcHQrKykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgbG9nZ2VyLmRlYnVnKGBBdHRlbXB0aW5nIHRvIHNhdmUgZWxlbWVudCAoYXR0ZW1wdCAke2F0dGVtcHR9LyR7bWF4UmV0cmllc30pYCwge1xuICAgICAgICAgIGVsZW1lbnROYW1lLFxuICAgICAgICAgIGVsZW1lbnRUeXBlLFxuICAgICAgICAgIGF0dGVtcHRcbiAgICAgICAgfSk7XG4gICAgICAgIFxuICAgICAgICBjb25zdCBmaWxlVXJsID0gYXdhaXQgdGhpcy5wb3J0Zm9saW9NYW5hZ2VyLnNhdmVFbGVtZW50KGFkYXB0ZXIsIHRydWUpO1xuICAgICAgICBcbiAgICAgICAgaWYgKGZpbGVVcmwpIHtcbiAgICAgICAgICBpZiAoYXR0ZW1wdCA+IDEpIHtcbiAgICAgICAgICAgIGxvZ2dlci5pbmZvKGBFbGVtZW50IHNhdmVkIHN1Y2Nlc3NmdWxseSBhZnRlciAke2F0dGVtcHR9IGF0dGVtcHRzYCwge1xuICAgICAgICAgICAgICBlbGVtZW50TmFtZSxcbiAgICAgICAgICAgICAgZWxlbWVudFR5cGUsXG4gICAgICAgICAgICAgIGZpbGVVcmxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gZmlsZVVybDtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgLy8gSWYgc2F2ZUVsZW1lbnQgcmV0dXJucyBudWxsLCB0cmVhdCBhcyBhIGZhaWx1cmUgYnV0IGRvbid0IHJldHJ5IGltbWVkaWF0ZWx5XG4gICAgICAgIGxhc3RFcnJvciA9IG5ldyBFcnJvcihgc2F2ZUVsZW1lbnQgcmV0dXJuZWQgbnVsbCBvbiBhdHRlbXB0ICR7YXR0ZW1wdH1gKTtcbiAgICAgICAgXG4gICAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICAgIGxhc3RFcnJvciA9IGVycm9yO1xuICAgICAgICBjb25zdCBpc1JldHJ5YWJsZSA9IHRoaXMuaXNSZXRyeWFibGVFcnJvcihlcnJvcik7XG4gICAgICAgIFxuICAgICAgICBsb2dnZXIud2FybihgU2F2ZSBhdHRlbXB0ICR7YXR0ZW1wdH0gZmFpbGVkYCwge1xuICAgICAgICAgIGVsZW1lbnROYW1lLFxuICAgICAgICAgIGVsZW1lbnRUeXBlLFxuICAgICAgICAgIGF0dGVtcHQsXG4gICAgICAgICAgZXJyb3I6IGVycm9yLm1lc3NhZ2UsXG4gICAgICAgICAgaXNSZXRyeWFibGUsXG4gICAgICAgICAgd2lsbFJldHJ5OiBpc1JldHJ5YWJsZSAmJiBhdHRlbXB0IDwgbWF4UmV0cmllc1xuICAgICAgICB9KTtcbiAgICAgICAgXG4gICAgICAgIC8vIElmIHRoaXMgaXMgbm90IGEgcmV0cnlhYmxlIGVycm9yLCBmYWlsIGltbWVkaWF0ZWx5XG4gICAgICAgIGlmICghaXNSZXRyeWFibGUpIHtcbiAgICAgICAgICBsb2dnZXIuZXJyb3IoJ05vbi1yZXRyeWFibGUgZXJyb3IgZW5jb3VudGVyZWQsIGFib3J0aW5nIHJldHJpZXMnLCB7XG4gICAgICAgICAgICBlbGVtZW50TmFtZSxcbiAgICAgICAgICAgIGVycm9yOiBlcnJvci5tZXNzYWdlXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIC8vIElmIHdlIGhhdmUgbW9yZSBhdHRlbXB0cywgd2FpdCBiZWZvcmUgcmV0cnlpbmdcbiAgICAgICAgaWYgKGF0dGVtcHQgPCBtYXhSZXRyaWVzKSB7XG4gICAgICAgICAgY29uc3QgZGVsYXkgPSBjYWxjdWxhdGVSZXRyeURlbGF5KGF0dGVtcHQpO1xuICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhgV2FpdGluZyAke2RlbGF5fW1zIGJlZm9yZSByZXRyeWAsIHsgYXR0ZW1wdCwgZGVsYXkgfSk7XG4gICAgICAgICAgYXdhaXQgbmV3IFByb21pc2UocmVzb2x2ZSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIGRlbGF5KSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgLy8gQWxsIGF0dGVtcHRzIGZhaWxlZFxuICAgIGxvZ2dlci5lcnJvcihgQWxsICR7bWF4UmV0cmllc30gc2F2ZSBhdHRlbXB0cyBmYWlsZWRgLCB7XG4gICAgICBlbGVtZW50TmFtZSxcbiAgICAgIGVsZW1lbnRUeXBlLFxuICAgICAgbGFzdEVycm9yOiBsYXN0RXJyb3I/Lm1lc3NhZ2VcbiAgICB9KTtcbiAgICBcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBcbiAgLyoqXG4gICAqIERldGVybWluZSBpZiBhbiBlcnJvciBpcyB3b3J0aCByZXRyeWluZ1xuICAgKiBSZXRyeWFibGU6IG5ldHdvcmsgaXNzdWVzLCByYXRlIGxpbWl0cywgdGVtcG9yYXJ5IEdpdEh1YiBBUEkgcHJvYmxlbXNcbiAgICogTm9uLXJldHJ5YWJsZTogYXV0aGVudGljYXRpb24gaXNzdWVzLCB2YWxpZGF0aW9uIGVycm9ycywgcGVybWFuZW50IGZhaWx1cmVzXG4gICAqL1xuICBwcml2YXRlIGlzUmV0cnlhYmxlRXJyb3IoZXJyb3I6IGFueSk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGVycm9yTWVzc2FnZSA9IGVycm9yPy5tZXNzYWdlPy50b0xvd2VyQ2FzZSgpIHx8ICcnO1xuICAgIGNvbnN0IGVycm9yQ29kZSA9IGVycm9yPy5jb2RlO1xuICAgIGNvbnN0IHN0YXR1c0NvZGUgPSBlcnJvcj8uc3RhdHVzIHx8IGVycm9yPy5zdGF0dXNDb2RlO1xuICAgIFxuICAgIC8vIE5ldHdvcmsgYW5kIHRpbWVvdXQgZXJyb3JzXG4gICAgaWYgKGVycm9yQ29kZSA9PT0gJ0VOT1RGT1VORCcgfHwgZXJyb3JDb2RlID09PSAnRUNPTk5SRVNFVCcgfHwgZXJyb3JDb2RlID09PSAnRVRJTUVET1VUJykge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIFxuICAgIC8vIEdpdEh1YiBBUEkgcmF0ZSBsaW1pdHNcbiAgICBpZiAoc3RhdHVzQ29kZSA9PT0gNDI5IHx8IGVycm9yTWVzc2FnZS5pbmNsdWRlcygncmF0ZSBsaW1pdCcpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgXG4gICAgLy8gVGVtcG9yYXJ5IEdpdEh1YiBBUEkgaXNzdWVzXG4gICAgaWYgKHN0YXR1c0NvZGUgPj0gNTAwICYmIHN0YXR1c0NvZGUgPCA2MDApIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBcbiAgICAvLyBUZW1wb3JhcnkgR2l0SHViIEFQSSBwcm9ibGVtc1xuICAgIGlmIChlcnJvck1lc3NhZ2UuaW5jbHVkZXMoJ3RlbXBvcmFyaWx5IHVuYXZhaWxhYmxlJykgfHwgXG4gICAgICAgIGVycm9yTWVzc2FnZS5pbmNsdWRlcygnc2VydmljZSB1bmF2YWlsYWJsZScpIHx8XG4gICAgICAgIGVycm9yTWVzc2FnZS5pbmNsdWRlcygnaW50ZXJuYWwgc2VydmVyIGVycm9yJykpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBcbiAgICAvLyBDb25uZWN0aW9uIGlzc3Vlc1xuICAgIGlmIChlcnJvck1lc3NhZ2UuaW5jbHVkZXMoJ2Nvbm5lY3Rpb24nKSAmJiBcbiAgICAgICAgKGVycm9yTWVzc2FnZS5pbmNsdWRlcygndGltZW91dCcpIHx8IGVycm9yTWVzc2FnZS5pbmNsdWRlcygncmVzZXQnKSkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBcbiAgICAvLyBEb24ndCByZXRyeSBhdXRoZW50aWNhdGlvbiBvciBwZXJtaXNzaW9uIGlzc3Vlc1xuICAgIGlmIChzdGF0dXNDb2RlID09PSA0MDEgfHwgc3RhdHVzQ29kZSA9PT0gNDAzIHx8IFxuICAgICAgICBlcnJvck1lc3NhZ2UuaW5jbHVkZXMoJ3VuYXV0aG9yaXplZCcpIHx8IFxuICAgICAgICBlcnJvck1lc3NhZ2UuaW5jbHVkZXMoJ2ZvcmJpZGRlbicpIHx8XG4gICAgICAgIGVycm9yTWVzc2FnZS5pbmNsdWRlcygnYXV0aGVudGljYXRpb24nKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBcbiAgICAvLyBEb24ndCByZXRyeSB2YWxpZGF0aW9uIGVycm9yc1xuICAgIGlmIChzdGF0dXNDb2RlID09PSA0MDAgfHwgc3RhdHVzQ29kZSA9PT0gNDIyIHx8XG4gICAgICAgIGVycm9yTWVzc2FnZS5pbmNsdWRlcygnaW52YWxpZCcpIHx8XG4gICAgICAgIGVycm9yTWVzc2FnZS5pbmNsdWRlcygndmFsaWRhdGlvbicpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIFxuICAgIC8vIERlZmF1bHQgdG8gbm90IHJldHJ5aW5nIGZvciB1bmtub3duIGVycm9ycyB0byBhdm9pZCBpbmZpbml0ZSBsb29wc1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufSJdfQ==
|
|
2059
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3VibWl0VG9Qb3J0Zm9saW9Ub29sLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3Rvb2xzL3BvcnRmb2xpby9zdWJtaXRUb1BvcnRmb2xpb1Rvb2wudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7O0dBUUc7QUFFSCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sUUFBUSxDQUFDO0FBQ3BDLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ3BFLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLHlDQUF5QyxDQUFDO0FBQy9FLE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQzdFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUM5RCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUN0RSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUN2RSxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSwwQ0FBMEMsQ0FBQztBQUNqRixPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDdkQsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQy9DLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLCtDQUErQyxDQUFDO0FBQ2pGLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUVwRSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUN2RSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUNyRSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDM0QsT0FBTyxFQUNMLGdCQUFnQixFQUNoQixZQUFZLEVBQ1osYUFBYSxFQUViLG1CQUFtQixFQUNuQixtQkFBbUIs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QyxTQUFTLENBQUM7WUFDaEMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDO1lBQ3hDLE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQztRQUVELHFFQUFxRTtRQUNyRSxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogVG9vbCBmb3Igc3VibWl0dGluZyBjb250ZW50IHRvIEdpdEh1YiBwb3J0Zm9saW8gcmVwb3NpdG9yaWVzXG4gKiBSZXBsYWNlcyB0aGUgYnJva2VuIGlzc3VlLWJhc2VkIHN1Ym1pc3Npb24gd2l0aCBkaXJlY3QgcmVwb3NpdG9yeSBzYXZlc1xuICogXG4gKiBGSVhFUyBJTVBMRU1FTlRFRCAoUFIgIzUwMyk6XG4gKiAxLiBUWVBFIFNBRkVUWSBGSVggIzEgKElzc3VlICM0OTcpOiBDaGFuZ2VkIGFwaUNhY2hlIGZyb20gJ2FueScgdG8gcHJvcGVyIEFQSUNhY2hlIHR5cGVcbiAqIDIuIFRZUEUgU0FGRVRZIEZJWCAjMiAoSXNzdWUgIzQ5Nyk6IFJlcGxhY2VkIGNvbXBsZXggdHlwZSBjYXN0aW5nIHdpdGggUG9ydGZvbGlvRWxlbWVudEFkYXB0ZXJcbiAqIDMuIFBFUkZPUk1BTkNFIChQUiAjNDk2IHJlY29tbWVuZGF0aW9uKTogVXNpbmcgRmlsZURpc2NvdmVyeVV0aWwgZm9yIG9wdGltaXplZCBmaWxlIHNlYXJjaFxuICovXG5cbmltcG9ydCB7IGNyZWF0ZUhhc2ggfSBmcm9tICdjcnlwdG8nO1xuaW1wb3J0IHsgR2l0SHViQXV0aE1hbmFnZXIgfSBmcm9tICcuLi8uLi9hdXRoL0dpdEh1YkF1dGhNYW5hZ2VyLmpzJztcbmltcG9ydCB7IFBvcnRmb2xpb1JlcG9NYW5hZ2VyIH0gZnJvbSAnLi4vLi4vcG9ydGZvbGlvL1BvcnRmb2xpb1JlcG9NYW5hZ2VyLmpzJztcbmltcG9ydCB7IGdldFBvcnRmb2xpb1JlcG9zaXRvcnlOYW1lIH0gZnJvbSAnLi4vLi4vY29uZmlnL3BvcnRmb2xpb0NvbmZpZy5qcyc7XG5pbXBvcnQgeyBUb2tlbk1hbmFnZXIgfSBmcm9tICcuLi8uLi9zZWN1cml0eS90b2tlbk1hbmFnZXIuanMnO1xuaW1wb3J0IHsgQ29udGVudFZhbGlkYXRvciB9IGZyb20gJy4uLy4uL3NlY3VyaXR5L2NvbnRlbnRWYWxpZGF0b3IuanMnO1xuaW1wb3J0IHsgUG9ydGZvbGlvTWFuYWdlciB9IGZyb20gJy4uLy4uL3BvcnRmb2xpby9Qb3J0Zm9saW9NYW5hZ2VyLmpzJztcbmltcG9ydCB7IFBvcnRmb2xpb0luZGV4TWFuYWdlciB9IGZyb20gJy4uLy4uL3BvcnRmb2xpby9Qb3J0Zm9saW9JbmRleE1hbmFnZXIuanMnO1xuaW1wb3J0IHsgRWxlbWVudFR5cGUgfSBmcm9tICcuLi8uLi9wb3J0Zm9saW8vdHlwZXMuanMnO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vLi4vdXRpbHMvbG9nZ2VyLmpzJztcbmltcG9ydCB7IFVuaWNvZGVWYWxpZGF0b3IgfSBmcm9tICcuLi8uLi9zZWN1cml0eS92YWxpZGF0b3JzL3VuaWNvZGVWYWxpZGF0b3IuanMnO1xuaW1wb3J0IHsgU2VjdXJpdHlNb25pdG9yIH0gZnJvbSAnLi4vLi4vc2VjdXJpdHkvc2VjdXJpdHlNb25pdG9yLmpzJztcbmltcG9ydCB7IEFQSUNhY2hlIH0gZnJvbSAnLi4vLi4vY2FjaGUvQVBJQ2FjaGUuanMnO1xuaW1wb3J0IHsgUG9ydGZvbGlvRWxlbWVudEFkYXB0ZXIgfSBmcm9tICcuL1BvcnRmb2xpb0VsZW1lbnRBZGFwdGVyLmpzJztcbmltcG9ydCB7IEZpbGVEaXNjb3ZlcnlVdGlsIH0gZnJvbSAnLi4vLi4vdXRpbHMvRmlsZURpc2NvdmVyeVV0aWwuanMnO1xuaW1wb3J0IHsgRXJyb3JIYW5kbGVyIH0gZnJvbSAnLi4vLi4vdXRpbHMvRXJyb3JIYW5kbGVyLmpzJztcbmltcG9ydCB7IFxuICBGSUxFX1NJWkVfTElNSVRTLCBcbiAgUkVUUllfQ09ORklHLCBcbiAgU0VBUkNIX0NPTkZJRyxcbiAgUG9ydGZvbGlvRWxlbWVudE1ldGFkYXRhLFxuICBnZXRWYWxpZGF0ZWRUaW1lb3V0LFxuICBjYWxjdWxhdGVSZXRyeURlbGF5XG59IGZyb20gJy4uLy4uL2NvbmZpZy9wb3J0Zm9saW8tY29uc3RhbnRzLmpzJztcbmltcG9ydCB7IGdpdGh1YlJhdGVMaW1pdGVyIH0gZnJvbSAnLi4vLi4vdXRpbHMvR2l0SHViUmF0ZUxpbWl0ZXIuanMnO1xuaW1wb3J0IHsgRWFybHlUZXJtaW5hdGlvblNlYXJjaCB9IGZyb20gJy4uLy4uL3V0aWxzL0Vhcmx5VGVybWluYXRpb25TZWFyY2guanMnO1xuaW1wb3J0IHsgQ29sbGVjdGlvbkVycm9yQ29kZSwgZm9ybWF0Q29sbGVjdGlvbkVycm9yIH0gZnJvbSAnLi4vLi4vY29uZmlnL2Vycm9yLWNvZGVzLmpzJztcbmltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgKiBhcyBmcyBmcm9tICdmcy9wcm9taXNlcyc7XG5pbXBvcnQgeyBTZWN1cmVZYW1sUGFyc2VyIH0gZnJvbSAnLi4vLi4vc2VjdXJpdHkvc2VjdXJlWWFtbFBhcnNlci5qcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3VibWl0VG9Qb3J0Zm9saW9QYXJhbXMge1xuICBuYW1lOiBzdHJpbmc7XG4gIHR5cGU/OiBFbGVtZW50VHlwZTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQb3J0Zm9saW9FbGVtZW50IHtcbiAgdHlwZTogRWxlbWVudFR5cGU7XG4gIG1ldGFkYXRhOiBQb3J0Zm9saW9FbGVtZW50TWV0YWRhdGE7XG4gIGNvbnRlbnQ6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTdWJtaXRUb1BvcnRmb2xpb1Jlc3VsdCB7XG4gIHN1Y2Nlc3M6IGJvb2xlYW47XG4gIG1lc3NhZ2U6IHN0cmluZztcbiAgdXJsPzogc3RyaW5nO1xuICBlcnJvcj86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBFbGVtZW50RGV0ZWN0aW9uTWF0Y2gge1xuICB0eXBlOiBFbGVtZW50VHlwZTtcbiAgcGF0aDogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEVsZW1lbnREZXRlY3Rpb25SZXN1bHQge1xuICBmb3VuZDogYm9vbGVhbjtcbiAgbWF0Y2hlczogRWxlbWVudERldGVjdGlvbk1hdGNoW107XG59XG5cbi8vIFdvcmtmbG93IHN0ZXAgY29uc3RhbnRzIGZvciBjb25zaXN0ZW50IGxvZ2dpbmdcbmNvbnN0IFdPUktGTE9XX1NURVBTID0ge1xuICBWQUxJREFUSU9OOiAxLFxuICBBVVRIRU5USUNBVElPTjogMixcbiAgQ09OVEVOVF9ESVNDT1ZFUlk6IDMsXG4gIFNFQ1VSSVRZOiA0LFxuICBNRVRBREFUQTogNSxcbiAgUkVQT19TRVRVUDogNixcbiAgU1VCTUlTU0lPTjogNyxcbiAgUkVQT1JUSU5HOiA4LFxuICBUT1RBTDogOFxufSBhcyBjb25zdDtcblxuLy8gTG9nZ2luZyBjb25maWd1cmF0aW9uXG5jb25zdCBMT0dHSU5HX0NPTkZJRyA9IHtcbiAgLy8gU2V0IERPTExIT1VTRV9WRVJCT1NFX0xPR0dJTkc9dHJ1ZSBmb3IgZGV0YWlsZWQgc3RlcC1ieS1zdGVwIGxvZ3NcbiAgaXNWZXJib3NlOiBwcm9jZXNzLmVudi5ET0xMSE9VU0VfVkVSQk9TRV9MT0dHSU5HPy50b0xvd2VyQ2FzZSgpID09PSAndHJ1ZScsXG4gIC8vIFNldCBET0xMSE9VU0VfTE9HX1RJTUlORz10cnVlIGZvciB0aW1pbmcgbWVhc3VyZW1lbnRzXG4gIHNob3VsZExvZ1RpbWluZzogcHJvY2Vzcy5lbnYuRE9MTEhPVVNFX0xPR19USU1JTkc/LnRvTG93ZXJDYXNlKCkgPT09ICd0cnVlJyB8fCBcbiAgICAgICAgICAgICAgICAgICBwcm9jZXNzLmVudi5ET0xMSE9VU0VfVkVSQk9TRV9MT0dHSU5HPy50b0xvd2VyQ2FzZSgpID09PSAndHJ1ZSdcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCBjbGFzcyBTdWJtaXRUb1BvcnRmb2xpb1Rvb2wge1xuICBwcml2YXRlIGF1dGhNYW5hZ2VyOiBHaXRIdWJBdXRoTWFuYWdlcjtcbiAgcHJpdmF0ZSBwb3J0Zm9saW9NYW5hZ2VyOiBQb3J0Zm9saW9SZXBvTWFuYWdlcjtcblxuICBjb25zdHJ1Y3RvcihhcGlDYWNoZTogQVBJQ2FjaGUpIHtcbiAgICAvLyBUWVBFIFNBRkVUWSBGSVggIzE6IFByb3BlciB0eXBpbmcgZm9yIGFwaUNhY2hlIHBhcmFtZXRlclxuICAgIC8vIFByZXZpb3VzbHk6IGNvbnN0cnVjdG9yKGFwaUNhY2hlOiBhbnkpXG4gICAgLy8gTm93OiBjb25zdHJ1Y3RvcihhcGlDYWNoZTogQVBJQ2FjaGUpIHdpdGggcHJvcGVyIGltcG9ydFxuICAgIHRoaXMuYXV0aE1hbmFnZXIgPSBuZXcgR2l0SHViQXV0aE1hbmFnZXIoYXBpQ2FjaGUpO1xuICAgIHRoaXMucG9ydGZvbGlvTWFuYWdlciA9IG5ldyBQb3J0Zm9saW9SZXBvTWFuYWdlcihnZXRQb3J0Zm9saW9SZXBvc2l0b3J5TmFtZSgpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZXMgYW5kIG5vcm1hbGl6ZXMgaW5wdXQgcGFyYW1ldGVycyB0byBwcmV2ZW50IFVuaWNvZGUgYXR0YWNrcyBhbmQgZW5zdXJlIGRhdGEgc2FmZXR5XG4gICAqIEBwYXJhbSBwYXJhbXMgVGhlIGlucHV0IHBhcmFtZXRlcnMgZnJvbSB0aGUgdXNlclxuICAgKiBAcmV0dXJucyBWYWxpZGF0aW9uIHJlc3VsdCB3aXRoIG5vcm1hbGl6ZWQgbmFtZSBvciBlcnJvciByZXNwb25zZVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyB2YWxpZGF0ZUFuZE5vcm1hbGl6ZVBhcmFtcyhwYXJhbXM6IFN1Ym1pdFRvUG9ydGZvbGlvUGFyYW1zKTogUHJvbWlzZTx7XG4gICAgc3VjY2VzczogYm9vbGVhbjtcbiAgICBzYWZlTmFtZT86IHN0cmluZztcbiAgICBlcnJvcj86IFN1Ym1pdFRvUG9ydGZvbGlvUmVzdWx0O1xuICB9PiB7XG4gICAgLy8gTm9ybWFsaXplIHVzZXIgaW5wdXQgdG8gcHJldmVudCBVbmljb2RlIGF0dGFja3MgKERNQ1AtU0VDLTAwNClcbiAgICBjb25zdCBub3JtYWxpemVkTmFtZSA9IFVuaWNvZGVWYWxpZGF0b3Iubm9ybWFsaXplKHBhcmFtcy5uYW1lKTtcbiAgICBpZiAoIW5vcm1hbGl6ZWROYW1lLmlzVmFsaWQpIHtcbiAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgdHlwZTogJ1VOSUNPREVfVkFMSURBVElPTl9FUlJPUicsXG4gICAgICAgIHNldmVyaXR5OiAnTUVESVVNJyxcbiAgICAgICAgc291cmNlOiAnU3VibWl0VG9Qb3J0Zm9saW9Ub29sLmV4ZWN1dGUnLFxuICAgICAgICBkZXRhaWxzOiBgSW52YWxpZCBVbmljb2RlIGluIGVsZW1lbnQgbmFtZTogJHtub3JtYWxpemVkTmFtZS5kZXRlY3RlZElzc3Vlcz8uWzBdIHx8ICd1bmtub3duIGVycm9yJ31gXG4gICAgICB9KTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICBlcnJvcjoge1xuICAgICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICAgIG1lc3NhZ2U6IGBJbnZhbGlkIGNoYXJhY3RlcnMgaW4gZWxlbWVudCBuYW1lOiAke25vcm1hbGl6ZWROYW1lLmRldGVjdGVkSXNzdWVzPy5bMF0gfHwgJ3Vua25vd24gZXJyb3InfWAsXG4gICAgICAgICAgZXJyb3I6ICdJTlZBTElEX0lOUFVUJ1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH1cbiAgICBcbiAgICByZXR1cm4ge1xuICAgICAgc3VjY2VzczogdHJ1ZSxcbiAgICAgIHNhZmVOYW1lOiBub3JtYWxpemVkTmFtZS5ub3JtYWxpemVkQ29udGVudFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIGlmIHRoZSB1c2VyIGlzIGF1dGhlbnRpY2F0ZWQgd2l0aCBHaXRIdWJcbiAgICogQHJldHVybnMgQXV0aGVudGljYXRpb24gY2hlY2sgcmVzdWx0IHdpdGggc3RhdHVzIG9yIGVycm9yIHJlc3BvbnNlXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGNoZWNrQXV0aGVudGljYXRpb24oKTogUHJvbWlzZTx7XG4gICAgc3VjY2VzczogYm9vbGVhbjtcbiAgICBhdXRoU3RhdHVzPzogYW55O1xuICAgIGVycm9yPzogU3VibWl0VG9Qb3J0Zm9saW9SZXN1bHQ7XG4gIH0+IHtcbiAgICBjb25zdCBhdXRoU3RhdHVzID0gYXdhaXQgdGhpcy5hdXRoTWFuYWdlci5nZXRBdXRoU3RhdHVzKCk7XG4gICAgaWYgKCFhdXRoU3RhdHVzLmlzQXV0aGVudGljYXRlZCkge1xuICAgICAgLy8gTG9nIGF1dGhlbnRpY2F0aW9uIHJlcXVpcmVkICh1c2luZyBleGlzdGluZyBldmVudCB0eXBlKVxuICAgICAgbG9nZ2VyLndhcm4oJ1VzZXIgYXR0ZW1wdGVkIHBvcnRmb2xpbyBzdWJtaXNzaW9uIHdpdGhvdXQgYXV0aGVudGljYXRpb24nKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICBlcnJvcjoge1xuICAgICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICAgIG1lc3NhZ2U6ICdOb3QgYXV0aGVudGljYXRlZC4gUGxlYXNlIGF1dGhlbnRpY2F0ZSBmaXJzdCB1c2luZyB0aGUgR2l0SHViIE9BdXRoIGZsb3cuXFxuXFxuJyArXG4gICAgICAgICAgICAgICAgICAgJ1Zpc2l0OiBodHRwczovL2RvY3MuYW50aHJvcGljLmNvbS9lbi9kb2NzL2NsYXVkZS1jb2RlL29hdXRoLXNldHVwXFxuJyArXG4gICAgICAgICAgICAgICAgICAgJ09yIHJ1bjogZ2ggYXV0aCBsb2dpbiAtLXdlYicsXG4gICAgICAgICAgZXJyb3I6ICdOT1RfQVVUSEVOVElDQVRFRCdcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgc3VjY2VzczogdHJ1ZSxcbiAgICAgIGF1dGhTdGF0dXNcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIERpc2NvdmVycyBjb250ZW50IGxvY2FsbHkgd2l0aCBzbWFydCB0eXBlIGRldGVjdGlvblxuICAgKiBAcGFyYW0gc2FmZU5hbWUgVGhlIG5vcm1hbGl6ZWQgbmFtZSB0byBzZWFyY2ggZm9yXG4gICAqIEBwYXJhbSBleHBsaWNpdFR5cGUgT3B0aW9uYWwgZXhwbGljaXQgZWxlbWVudCB0eXBlIHByb3ZpZGVkIGJ5IHVzZXJcbiAgICogQHBhcmFtIG9yaWdpbmFsTmFtZSBPcmlnaW5hbCB1c2VyLXByb3ZpZGVkIG5hbWUgZm9yIGVycm9yIG1lc3NhZ2VzXG4gICAqIEByZXR1cm5zIENvbnRlbnQgZGlzY292ZXJ5IHJlc3VsdCB3aXRoIGVsZW1lbnQgdHlwZSBhbmQgcGF0aCBvciBlcnJvciByZXNwb25zZVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBkaXNjb3ZlckNvbnRlbnRXaXRoVHlwZURldGVjdGlvbihcbiAgICBzYWZlTmFtZTogc3RyaW5nLCBcbiAgICBleHBsaWNpdFR5cGU/OiBFbGVtZW50VHlwZSwgXG4gICAgb3JpZ2luYWxOYW1lPzogc3RyaW5nXG4gICk6IFByb21pc2U8e1xuICAgIHN1Y2Nlc3M6IGJvb2xlYW47XG4gICAgZWxlbWVudFR5cGU/OiBFbGVtZW50VHlwZTtcbiAgICBsb2NhbFBhdGg/OiBzdHJpbmc7XG4gICAgZXJyb3I/OiBTdWJtaXRUb1BvcnRmb2xpb1Jlc3VsdDtcbiAgfT4ge1xuICAgIGxldCBlbGVtZW50VHlwZSA9IGV4cGxpY2l0VHlwZTtcbiAgICBsZXQgbG9jYWxQYXRoOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgICBcbiAgICBpZiAoZWxlbWVudFR5cGUpIHtcbiAgICAgIC8vIFR5cGUgZXhwbGljaXRseSBwcm92aWRlZCAtIHNlYXJjaCBpbiB0aGF0IHNwZWNpZmljIGRpcmVjdG9yeSBvbmx5XG4gICAgICBsb2NhbFBhdGggPSBhd2FpdCB0aGlzLmZpbmRMb2NhbENvbnRlbnQoc2FmZU5hbWUsIGVsZW1lbnRUeXBlKTtcbiAgICAgIGlmICghbG9jYWxQYXRoKSB7XG4gICAgICAgIC8vIFVYIElNUFJPVkVNRU5UOiBQcm92aWRlIGhlbHBmdWwgc3VnZ2VzdGlvbnMgZm9yIGZpbmRpbmcgY29udGVudFxuICAgICAgICBjb25zdCBwb3J0Zm9saW9NYW5hZ2VyID0gUG9ydGZvbGlvTWFuYWdlci5nZXRJbnN0YW5jZSgpO1xuICAgICAgICBjb25zdCBlbGVtZW50RGlyID0gcG9ydGZvbGlvTWFuYWdlci5nZXRFbGVtZW50RGlyKGVsZW1lbnRUeXBlKTtcbiAgICAgICAgXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgZXJyb3I6IHtcbiAgICAgICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICAgICAgbWVzc2FnZTogYENvdWxkIG5vdCBmaW5kICR7ZWxlbWVudFR5cGV9IG5hbWVkIFwiJHtvcmlnaW5hbE5hbWUgfHwgc2FmZU5hbWV9XCIgaW4gbG9jYWwgcG9ydGZvbGlvLlxcblxcbmAgK1xuICAgICAgICAgICAgICAgICAgICBgKipTZWFyY2hlZCBpbioqOiAke2VsZW1lbnREaXJ9XFxuXFxuYCArXG4gICAgICAgICAgICAgICAgICAgIGAqKlRyb3VibGVzaG9vdGluZyBUaXBzKio6XFxuYCArXG4gICAgICAgICAgICAgICAgICAgIGDigKIgQ2hlY2sgaWYgdGhlIGZpbGUgZXhpc3RzIHVzaW5nIHlvdXIgZmlsZSBleHBsb3JlclxcbmAgK1xuICAgICAgICAgICAgICAgICAgICBg4oCiIFRyeSB1c2luZyB0aGUgZXhhY3QgZmlsZW5hbWUgKHdpdGhvdXQgZXh0ZW5zaW9uKVxcbmAgK1xuICAgICAgICAgICAgICAgICAgICBg4oCiIFVzZSBcXGBsaXN0X3BvcnRmb2xpb1xcYCB0byBzZWUgYWxsIGF2YWlsYWJsZSAke2VsZW1lbnRUeXBlfVxcbmAgK1xuICAgICAgICAgICAgICAgICAgICBg4oCiIElmIHVuc3VyZSBvZiB0aGUgdHlwZSwgb21pdCAtLXR5cGUgYW5kIGxldCB0aGUgc3lzdGVtIGRldGVjdCBpdFxcblxcbmAgK1xuICAgICAgICAgICAgICAgICAgICBgKipDb21tb24gbmFtZSBmb3JtYXRzIHRoYXQgd29yayoqOlxcbmAgK1xuICAgICAgICAgICAgICAgICAgICBg4oCiIFwibXktZWxlbWVudFwiIChrZWJhYi1jYXNlKVxcbmAgK1xuICAgICAgICAgICAgICAgICAgICBg4oCiIFwiTXkgRWxlbWVudFwiICh3aXRoIHNwYWNlcylcXG5gICtcbiAgICAgICAgICAgICAgICAgICAgYOKAoiBcIk15RWxlbWVudFwiIChQYXNjYWxDYXNlKVxcbmAgK1xuICAgICAgICAgICAgICAgICAgICBg4oCiIFBhcnRpYWwgbWF0Y2hlcyBhcmUgc3VwcG9ydGVkYCxcbiAgICAgICAgICAgIGVycm9yOiAnQ09OVEVOVF9OT1RfRk9VTkQnXG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBDUklUSUNBTCBGSVg6IE5vIHR5cGUgcHJvdmlkZWQgLSBpbXBsZW1lbnQgc21hcnQgZGV0ZWN0aW9uIGFjcm9zcyBBTEwgZWxlbWVudCB0eXBlc1xuICAgICAgLy8gVGhpcyBwcmV2ZW50cyB0aGUgcHJldmlvdXMgaGFyZGNvZGVkIGRlZmF1bHQgdG8gUEVSU09OQSBhbmQgZW5hYmxlcyBwcm9wZXIgdHlwZSBkZXRlY3Rpb25cbiAgICAgIGNvbnN0IGRldGVjdGlvblJlc3VsdCA9IGF3YWl0IHRoaXMuZGV0ZWN0RWxlbWVudFR5cGUoc2FmZU5hbWUpO1xuICAgICAgXG4gICAgICBpZiAoIWRldGVjdGlvblJlc3VsdC5mb3VuZCkge1xuICAgICAgICAvLyBVWCBJTVBST1ZFTUVOVDogRW5oYW5jZWQgZ3VpZGFuY2Ugd2l0aCBzcGVjaWZpYyBzdWdnZXN0aW9uc1xuICAgICAgICBjb25zdCBhdmFpbGFibGVUeXBlcyA9IE9iamVjdC52YWx1ZXMoRWxlbWVudFR5cGUpLmpvaW4oJywgJyk7XG4gICAgICAgIFxuICAgICAgICAvLyBHZXQgc3VnZ2VzdGlvbnMgZm9yIHNpbWlsYXIgbmFtZXNcbiAgICAgICAgY29uc3Qgc3VnZ2VzdGlvbnMgPSBhd2FpdCB0aGlzLmdlbmVyYXRlTmFtZVN1Z2dlc3Rpb25zKHNhZmVOYW1lKTtcbiAgICAgICAgXG4gICAgICAgIGxldCBtZXNzYWdlID0gYENvbnRlbnQgXCIke29yaWdpbmFsTmFtZSB8fCBzYWZlTmFtZX1cIiBub3QgZm91bmQgaW4gcG9ydGZvbGlvLlxcblxcbmA7XG4gICAgICAgIG1lc3NhZ2UgKz0gYPCflI0gKipTZWFyY2hlZCBpbiBhbGwgZWxlbWVudCB0eXBlcyoqOiAke2F2YWlsYWJsZVR5cGVzfVxcblxcbmA7XG4gICAgICAgIFxuICAgICAgICBpZiAoc3VnZ2VzdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIG1lc3NhZ2UgKz0gYPCfkqEgKipEaWQgeW91IG1lYW4gb25lIG9mIHRoZXNlPyoqXFxuYDtcbiAgICAgICAgICBmb3IgKGNvbnN0IHN1Z2dlc3Rpb24gb2Ygc3VnZ2VzdGlvbnMuc2xpY2UoMCwgU0VBUkNIX0NPTkZJRy5NQVhfU1VHR0VTVElPTlMpKSB7XG4gICAgICAgICAgICBtZXNzYWdlICs9IGAgIOKAoiBcIiR7c3VnZ2VzdGlvbi5uYW1lfVwiICgke3N1Z2dlc3Rpb24udHlwZX0pXFxuYDtcbiAgICAgICAgICB9XG4gICAgICAgICAgbWVzc2FnZSArPSBgXFxuYDtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgbWVzc2FnZSArPSBg8J+boO+4jyAqKlRyb3VibGVzaG9vdGluZyBTdGVwcyoqOlxcbmA7XG4gICAgICAgIG1lc3NhZ2UgKz0gYDEuIPCfk50gVXNlIFxcYGxpc3RfcG9ydGZvbGlvXFxgIHRvIHNlZSBhbGwgYXZhaWxhYmxlIGNvbnRlbnRcXG5gO1xuICAgICAgICBtZXNzYWdlICs9IGAyLiDwn5SNIENoZWNrIGV4YWN0IHNwZWxsaW5nIGFuZCB0cnkgdmFyaWF0aW9uczpcXG5gO1xuICAgICAgICBtZXNzYWdlICs9IGAgICDigKIgXCIkeyhvcmlnaW5hbE5hbWUgfHwgc2FmZU5hbWUpLnRvTG93ZXJDYXNlKCl9XCIgKGxvd2VyY2FzZSlcXG5gO1xuICAgICAgICBtZXNzYWdlICs9IGAgICDigKIgXCIkeyhvcmlnaW5hbE5hbWUgfHwgc2FmZU5hbWUpLnJlcGxhY2VBbGwoL1teYS16MC05XS9naSwgJy0nKS50b0xvd2VyQ2FzZSgpfVwiIChub3JtYWxpemVkKVxcbmA7XG4gICAgICAgIGlmICgob3JpZ2luYWxOYW1lIHx8IHNhZmVOYW1lKS5pbmNsdWRlcygnLicpKSB7XG4gICAgICAgICAgbWVzc2FnZSArPSBgICAg4oCiIFwiJHsob3JpZ2luYWxOYW1lIHx8IHNhZmVOYW1lKS5yZXBsYWNlQWxsKCcuJywgJycpfVwiIChubyBkb3RzKVxcbmA7XG4gICAgICAgIH1cbiAgICAgICAgbWVzc2FnZSArPSBgMy4g8J+OryBTcGVjaWZ5IGVsZW1lbnQgdHlwZTogXFxgc3VibWl0X2NvbGxlY3Rpb25fY29udGVudCBcIiR7b3JpZ2luYWxOYW1lIHx8IHNhZmVOYW1lfVwiIC0tdHlwZT1wZXJzb25hc1xcYFxcbmA7XG4gICAgICAgIG1lc3NhZ2UgKz0gYDQuIPCfk4EgQ2hlY2sgaWYgZmlsZSBleGlzdHMgaW4gcG9ydGZvbGlvIGRpcmVjdG9yaWVzXFxuXFxuYDtcbiAgICAgICAgbWVzc2FnZSArPSBg8J+TnSAqKlRpcCoqOiBUaGUgc3lzdGVtIHNlYXJjaGVzIGZpbGVuYW1lcyBBTkQgbWV0YWRhdGEgbmFtZXMgd2l0aCBmdXp6eSBtYXRjaGluZy5gO1xuICAgICAgICBcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgICBlcnJvcjoge1xuICAgICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgICBtZXNzYWdlLFxuICAgICAgICAgICAgZXJyb3I6ICdDT05URU5UX05PVF9GT1VORCdcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBcbiAgICAgIGlmIChkZXRlY3Rpb25SZXN1bHQubWF0Y2hlcy5sZW5ndGggPiAxKSB7XG4gICAgICAgIC8vIE11bHRpcGxlIG1hdGNoZXMgZm91bmQgLSBhc2sgdXNlciB0byBzcGVjaWZ5IHR5cGVcbiAgICAgICAgY29uc3QgbWF0Y2hEZXRhaWxzID0gZGV0ZWN0aW9uUmVzdWx0Lm1hdGNoZXMubWFwKG0gPT4gYC0gJHttLnR5cGV9OiAke20ucGF0aH1gKS5qb2luKCdcXG4nKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgICBlcnJvcjoge1xuICAgICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgICBtZXNzYWdlOiBgQ29udGVudCBcIiR7b3JpZ2luYWxOYW1lIHx8IHNhZmVOYW1lfVwiIGZvdW5kIGluIG11bHRpcGxlIGVsZW1lbnQgdHlwZXM6XFxuXFxuJHttYXRjaERldGFpbHN9XFxuXFxuYCArXG4gICAgICAgICAgICAgICAgICAgIGBQbGVhc2Ugc3BlY2lmeSB0aGUgZWxlbWVudCB0eXBlIHVzaW5nIHRoZSAtLXR5cGUgcGFyYW1ldGVyIHRvIGF2b2lkIGFtYmlndWl0eS5gLFxuICAgICAgICAgICAgZXJyb3I6ICdNVUxUSVBMRV9NQVRDSEVTX0ZPVU5EJ1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gU2luZ2xlIG1hdGNoIGZvdW5kIC0gdXNlIGl0XG4gICAgICBjb25zdCBtYXRjaCA9IGRldGVjdGlvblJlc3VsdC5tYXRjaGVzWzBdO1xuICAgICAgZWxlbWVudFR5cGUgPSBtYXRjaC50eXBlO1xuICAgICAgbG9jYWxQYXRoID0gbWF0Y2gucGF0aDtcbiAgICAgIFxuICAgICAgbG9nZ2VyLmluZm8oYFNtYXJ0IGRldGVjdGlvbjogRm91bmQgXCIke3NhZmVOYW1lfVwiIGFzICR7ZWxlbWVudFR5cGV9YCwgeyBcbiAgICAgICAgbmFtZTogc2FmZU5hbWUsXG4gICAgICAgIGRldGVjdGVkVHlwZTogZWxlbWVudFR5cGUsXG4gICAgICAgIHBhdGg6IGxvY2FsUGF0aFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHN1Y2Nlc3M6IHRydWUsXG4gICAgICBlbGVtZW50VHlwZSxcbiAgICAgIGxvY2FsUGF0aFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGVzIGZpbGUgc2l6ZSBhbmQgY29udGVudCBzZWN1cml0eSBiZWZvcmUgcHJvY2Vzc2luZ1xuICAgKiBAcGFyYW0gbG9jYWxQYXRoIFBhdGggdG8gdGhlIGxvY2FsIGZpbGUgdG8gdmFsaWRhdGVcbiAgICogQHJldHVybnMgVmFsaWRhdGlvbiByZXN1bHQgd2l0aCBjb250ZW50IG9yIGVycm9yIHJlc3BvbnNlXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHZhbGlkYXRlRmlsZUFuZENvbnRlbnQobG9jYWxQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHtcbiAgICBzdWNjZXNzOiBib29sZWFuO1xuICAgIGNvbnRlbnQ/OiBzdHJpbmc7XG4gICAgZXJyb3I/OiBTdWJtaXRUb1BvcnRmb2xpb1Jlc3VsdDtcbiAgfT4ge1xuICAgIC8vIFNFQ1VSSVRZIEVOSEFOQ0VNRU5UIChUYXNrICM3KTogVmFsaWRhdGUgZmlsZSBwYXRoIGJlZm9yZSBwcm9jZXNzaW5nXG4gICAgY29uc3QgcGF0aFZhbGlkYXRpb24gPSBhd2FpdCB0aGlzLnZhbGlkYXRlUG9ydGZvbGlvUGF0aChsb2NhbFBhdGgpO1xuICAgIGlmICghcGF0aFZhbGlkYXRpb24uaXNWYWxpZCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgIGVycm9yOiBwYXRoVmFsaWRhdGlvbi5lcnJvclxuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBVc2UgdGhlIHZhbGlkYXRlZCBzYWZlIHBhdGggZm9yIGFsbCBzdWJzZXF1ZW50IG9wZXJhdGlvbnNcbiAgICBjb25zdCBzYWZlUGF0aCA9IHBhdGhWYWxpZGF0aW9uLnNhZmVQYXRoITtcblxuICAgIC8vIFZhbGlkYXRlIGZpbGUgc2l6ZSBiZWZvcmUgcmVhZGluZ1xuICAgIGNvbnN0IHN0YXRzID0gYXdhaXQgZnMuc3RhdChzYWZlUGF0aCk7XG4gICAgaWYgKHN0YXRzLnNpemUgPiBGSUxFX1NJWkVfTElNSVRTLk1BWF9GSUxFX1NJWkUpIHtcbiAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgdHlwZTogJ1JBVEVfTElNSVRfRVhDRUVERUQnLFxuICAgICAgICBzZXZlcml0eTogJ01FRElVTScsXG4gICAgICAgIHNvdXJjZTogJ1N1Ym1pdFRvUG9ydGZvbGlvVG9vbC5leGVjdXRlJyxcbiAgICAgICAgZGV0YWlsczogYEZpbGUgc2l6ZSAke3N0YXRzLnNpemV9IGV4Y2VlZHMgbGltaXQgb2YgJHtGSUxFX1NJWkVfTElNSVRTLk1BWF9GSUxFX1NJWkV9YFxuICAgICAgfSk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgZXJyb3I6IHtcbiAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgICBtZXNzYWdlOiBgRmlsZSBzaXplIGV4Y2VlZHMgJHtGSUxFX1NJWkVfTElNSVRTLk1BWF9GSUxFX1NJWkVfTUJ9TUIgbGltaXRgLFxuICAgICAgICAgIGVycm9yOiAnRklMRV9UT09fTEFSR0UnXG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gVmFsaWRhdGUgY29udGVudCBzZWN1cml0eVxuICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBmcy5yZWFkRmlsZShzYWZlUGF0aCwgJ3V0Zi04Jyk7XG4gICAgY29uc3QgdmFsaWRhdGlvblJlc3VsdCA9IENvbnRlbnRWYWxpZGF0b3IudmFsaWRhdGVBbmRTYW5pdGl6ZShjb250ZW50KTtcblxuICAgIGlmICghdmFsaWRhdGlvblJlc3VsdC5pc1ZhbGlkICYmIHZhbGlkYXRpb25SZXN1bHQuc2V2ZXJpdHkgPT09ICdjcml0aWNhbCcpIHtcbiAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgdHlwZTogJ0NPTlRFTlRfSU5KRUNUSU9OX0FUVEVNUFQnLFxuICAgICAgICBzZXZlcml0eTogJ0hJR0gnLFxuICAgICAgICBzb3VyY2U6ICdTdWJtaXRUb1BvcnRmb2xpb1Rvb2wuZXhlY3V0ZScsXG4gICAgICAgIGRldGFpbHM6IGBDcml0aWNhbCBzZWN1cml0eSBpc3N1ZXMgZGV0ZWN0ZWQ6ICR7dmFsaWRhdGlvblJlc3VsdC5kZXRlY3RlZFBhdHRlcm5zPy5qb2luKCcsICcpfWBcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgIGVycm9yOiB7XG4gICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgbWVzc2FnZTogYENvbnRlbnQgdmFsaWRhdGlvbiBmYWlsZWQ6ICR7dmFsaWRhdGlvblJlc3VsdC5kZXRlY3RlZFBhdHRlcm5zPy5qb2luKCcsICcpfWAsXG4gICAgICAgICAgZXJyb3I6ICdWQUxJREFUSU9OX0ZBSUxFRCdcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgc3VjY2VzczogdHJ1ZSxcbiAgICAgIGNvbnRlbnRcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFByZXBhcmVzIG1ldGFkYXRhIGZvciB0aGUgcG9ydGZvbGlvIGVsZW1lbnRcbiAgICogQHBhcmFtIHNhZmVOYW1lIFRoZSBub3JtYWxpemVkIG5hbWUgb2YgdGhlIGVsZW1lbnRcbiAgICogQHBhcmFtIGVsZW1lbnRUeXBlIFRoZSB0eXBlIG9mIHRoZSBlbGVtZW50XG4gICAqIEBwYXJhbSBhdXRoU3RhdHVzIEF1dGhlbnRpY2F0aW9uIHN0YXR1cyBjb250YWluaW5nIHVzZXJuYW1lXG4gICAqIEByZXR1cm5zIE1ldGFkYXRhIG9iamVjdCBmb3IgdGhlIGVsZW1lbnRcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcHJlcGFyZUVsZW1lbnRNZXRhZGF0YShcbiAgICBzYWZlTmFtZTogc3RyaW5nLCBcbiAgICBlbGVtZW50VHlwZTogRWxlbWVudFR5cGUsIFxuICAgIGF1dGhTdGF0dXM6IGFueSxcbiAgICBmaWxlUGF0aD86IHN0cmluZ1xuICApOiBQcm9taXNlPFBvcnRmb2xpb0VsZW1lbnRNZXRhZGF0YT4ge1xuICAgIC8vIFRyeSB0byBleHRyYWN0IG1ldGFkYXRhIGZyb20gdGhlIGZpbGUgaWYgcGF0aCBpcyBwcm92aWRlZFxuICAgIGxldCBmaWxlTWV0YWRhdGE6IFJlY29yZDxzdHJpbmcsIGFueT4gfCBudWxsID0gbnVsbDtcbiAgICBcbiAgICBpZiAoZmlsZVBhdGgpIHtcbiAgICAgIGZpbGVNZXRhZGF0YSA9IGF3YWl0IHRoaXMuZXh0cmFjdEVsZW1lbnRNZXRhZGF0YShmaWxlUGF0aCk7XG4gICAgfVxuICAgIFxuICAgIC8vIFRZUEUgU0FGRVRZOiBEZWZpbmUgZXh0ZW5kZWQgbWV0YWRhdGEgaW50ZXJmYWNlIGZvciBiZXR0ZXIgdHlwZSBzYWZldHlcbiAgICBpbnRlcmZhY2UgRXh0ZW5kZWRNZXRhZGF0YSBleHRlbmRzIFBvcnRmb2xpb0VsZW1lbnRNZXRhZGF0YSB7XG4gICAgICB0cmlnZ2Vycz86IHN0cmluZ1tdO1xuICAgICAgY2F0ZWdvcnk/OiBzdHJpbmc7XG4gICAgICBhZ2VfcmF0aW5nPzogc3RyaW5nO1xuICAgICAgYWlfZ2VuZXJhdGVkPzogYm9vbGVhbjtcbiAgICAgIGdlbmVyYXRpb25fbWV0aG9kPzogc3RyaW5nO1xuICAgICAgbGljZW5zZT86IHN0cmluZztcbiAgICAgIHRhZ3M/OiBzdHJpbmdbXTtcbiAgICB9XG4gICAgXG4gICAgLy8gQnVpbGQgbWV0YWRhdGEgd2l0aCByZWFsIHZhbHVlcyBmcm9tIGZpbGUsIGZhbGxpbmcgYmFjayB0byBkZWZhdWx0c1xuICAgIGNvbnN0IG1ldGFkYXRhOiBFeHRlbmRlZE1ldGFkYXRhID0ge1xuICAgICAgbmFtZTogc2FmZU5hbWUsXG4gICAgICBkZXNjcmlwdGlvbjogZmlsZU1ldGFkYXRhPy5kZXNjcmlwdGlvbiB8fCBcbiAgICAgICAgICAgICAgICAgICBmaWxlTWV0YWRhdGE/LnN1bW1hcnkgfHwgXG4gICAgICAgICAgICAgICAgICAgYCR7ZWxlbWVudFR5cGV9IHN1Ym1pdHRlZCBmcm9tIGxvY2FsIHBvcnRmb2xpb2AsXG4gICAgICBhdXRob3I6IGF1dGhTdGF0dXMudXNlcm5hbWUgfHwgZmlsZU1ldGFkYXRhPy5hdXRob3IgfHwgJ3Vua25vd24nLFxuICAgICAgY3JlYXRlZDogZmlsZU1ldGFkYXRhPy5jcmVhdGVkIHx8IFxuICAgICAgICAgICAgICAgZmlsZU1ldGFkYXRhPy5jcmVhdGVkX2RhdGUgfHwgXG4gICAgICAgICAgICAgICBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgICB1cGRhdGVkOiBmaWxlTWV0YWRhdGE/LnVwZGF0ZWQgfHwgXG4gICAgICAgICAgICAgICBmaWxlTWV0YWRhdGE/Lm1vZGlmaWVkIHx8IFxuICAgICAgICAgICAgICAgbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgICAgdmVyc2lvbjogZmlsZU1ldGFkYXRhPy52ZXJzaW9uIHx8ICcxLjAuMCdcbiAgICB9O1xuICAgIFxuICAgIC8vIEFkZCBhZGRpdGlvbmFsIG1ldGFkYXRhIGZpZWxkcyBpZiBwcmVzZW50ICh3aXRoIHR5cGUgc2FmZXR5KVxuICAgIGlmIChmaWxlTWV0YWRhdGEpIHtcbiAgICAgIC8vIFByZXNlcnZlIG90aGVyIG1ldGFkYXRhIGZpZWxkcyB0aGF0IG1pZ2h0IGJlIHVzZWZ1bFxuICAgICAgaWYgKGZpbGVNZXRhZGF0YS50cmlnZ2VycyAmJiBBcnJheS5pc0FycmF5KGZpbGVNZXRhZGF0YS50cmlnZ2VycykpIHtcbiAgICAgICAgbWV0YWRhdGEudHJpZ2dlcnMgPSBmaWxlTWV0YWRhdGEudHJpZ2dlcnM7XG4gICAgICB9XG4gICAgICBpZiAoZmlsZU1ldGFkYXRhLmNhdGVnb3J5ICYmIHR5cGVvZiBmaWxlTWV0YWRhdGEuY2F0ZWdvcnkgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIG1ldGFkYXRhLmNhdGVnb3J5ID0gZmlsZU1ldGFkYXRhLmNhdGVnb3J5O1xuICAgICAgfVxuICAgICAgaWYgKGZpbGVNZXRhZGF0YS5hZ2VfcmF0aW5nICYmIHR5cGVvZiBmaWxlTWV0YWRhdGEuYWdlX3JhdGluZyA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgbWV0YWRhdGEuYWdlX3JhdGluZyA9IGZpbGVNZXRhZGF0YS5hZ2VfcmF0aW5nO1xuICAgICAgfVxuICAgICAgaWYgKGZpbGVNZXRhZGF0YS5haV9nZW5lcmF0ZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBtZXRhZGF0YS5haV9nZW5lcmF0ZWQgPSBCb29sZWFuKGZpbGVNZXRhZGF0YS5haV9nZW5lcmF0ZWQpO1xuICAgICAgfVxuICAgICAgaWYgKGZpbGVNZXRhZGF0YS5nZW5lcmF0aW9uX21ldGhvZCAmJiB0eXBlb2YgZmlsZU1ldGFkYXRhLmdlbmVyYXRpb25fbWV0aG9kID09PSAnc3RyaW5nJykge1xuICAgICAgICBtZXRhZGF0YS5nZW5lcmF0aW9uX21ldGhvZCA9IGZpbGVNZXRhZGF0YS5nZW5lcmF0aW9uX21ldGhvZDtcbiAgICAgIH1cbiAgICAgIGlmIChmaWxlTWV0YWRhdGEubGljZW5zZSAmJiB0eXBlb2YgZmlsZU1ldGFkYXRhLmxpY2Vuc2UgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIG1ldGFkYXRhLmxpY2Vuc2UgPSBmaWxlTWV0YWRhdGEubGljZW5zZTtcbiAgICAgIH1cbiAgICAgIGlmIChmaWxlTWV0YWRhdGEudGFncyAmJiBBcnJheS5pc0FycmF5KGZpbGVNZXRhZGF0YS50YWdzKSkge1xuICAgICAgICBtZXRhZGF0YS50YWdzID0gZmlsZU1ldGFkYXRhLnRhZ3M7XG4gICAgICB9XG4gICAgfVxuICAgIFxuICAgIGxvZ2dlci5pbmZvKCdQcmVwYXJlZCBlbGVtZW50IG1ldGFkYXRhJywge1xuICAgICAgZWxlbWVudE5hbWU6IHNhZmVOYW1lLFxuICAgICAgaGFzRmlsZU1ldGFkYXRhOiAhIWZpbGVNZXRhZGF0YSxcbiAgICAgIGRlc2NyaXB0aW9uOiBtZXRhZGF0YS5kZXNjcmlwdGlvbi5zdWJzdHJpbmcoMCwgMTAwKSAvLyBMb2cgZmlyc3QgMTAwIGNoYXJzXG4gICAgfSk7XG4gICAgXG4gICAgcmV0dXJuIG1ldGFkYXRhO1xuICB9XG5cbiAgLyoqXG4gICAqIEZvcm1hdHMgbWV0YWRhdGEgYXMgWUFNTCBzdHJpbmcgZm9yIGRpc3BsYXlcbiAgICogUEVSRk9STUFOQ0U6IFVzZXMgYXJyYXkgam9pbiBpbnN0ZWFkIG9mIHN0cmluZyBjb25jYXRlbmF0aW9uIGZvciBiZXR0ZXIgcGVyZm9ybWFuY2VcbiAgICovXG4gIHByaXZhdGUgZm9ybWF0TWV0YWRhdGFBc1lhbWwoYmFzZU1ldGFkYXRhOiBQb3J0Zm9saW9FbGVtZW50TWV0YWRhdGEsIGV4dGVuZGVkTWV0YTogYW55KTogc3RyaW5nIHtcbiAgICBjb25zdCB5YW1sTGluZXM6IHN0cmluZ1tdID0gW1xuICAgICAgYG5hbWU6ICR7YmFzZU1ldGFkYXRhLm5hbWV9YCxcbiAgICAgIGBkZXNjcmlwdGlvbjogJHtiYXNlTWV0YWRhdGEuZGVzY3JpcHRpb259YCxcbiAgICAgIGBhdXRob3I6ICR7YmFzZU1ldGFkYXRhLmF1dGhvcn1gLFxuICAgICAgYHZlcnNpb246ICR7YmFzZU1ldGFkYXRhLnZlcnNpb259YCxcbiAgICAgIGBjcmVhdGVkOiAke2Jhc2VNZXRhZGF0YS5jcmVhdGVkfWAsXG4gICAgICBgdXBkYXRlZDogJHtiYXNlTWV0YWRhdGEudXBkYXRlZH1gXG4gICAgXTtcbiAgICBcbiAgICAvLyBBZGQgb3B0aW9uYWwgZmllbGRzIGlmIHByZXNlbnRcbiAgICBpZiAoZXh0ZW5kZWRNZXRhLmNhdGVnb3J5KSB7XG4gICAgICB5YW1sTGluZXMucHVzaChgY2F0ZWdvcnk6ICR7ZXh0ZW5kZWRNZXRhLmNhdGVnb3J5fWApO1xuICAgIH1cbiAgICBpZiAoZXh0ZW5kZWRNZXRhLnRyaWdnZXJzICYmIEFycmF5LmlzQXJyYXkoZXh0ZW5kZWRNZXRhLnRyaWdnZXJzKSAmJiBleHRlbmRlZE1ldGEudHJpZ2dlcnMubGVuZ3RoID4gMCkge1xuICAgICAgeWFtbExpbmVzLnB1c2goYHRyaWdnZXJzOiBbJHtleHRlbmRlZE1ldGEudHJpZ2dlcnMuam9pbignLCAnKX1dYCk7XG4gICAgfVxuICAgIGlmIChleHRlbmRlZE1ldGEuYWdlX3JhdGluZykge1xuICAgICAgeWFtbExpbmVzLnB1c2goYGFnZV9yYXRpbmc6ICR7ZXh0ZW5kZWRNZXRhLmFnZV9yYXRpbmd9YCk7XG4gICAgfVxuICAgIGlmIChleHRlbmRlZE1ldGEuYWlfZ2VuZXJhdGVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHlhbWxMaW5lcy5wdXNoKGBhaV9nZW5lcmF0ZWQ6ICR7ZXh0ZW5kZWRNZXRhLmFpX2dlbmVyYXRlZH1gKTtcbiAgICB9XG4gICAgaWYgKGV4dGVuZGVkTWV0YS5nZW5lcmF0aW9uX21ldGhvZCkge1xuICAgICAgeWFtbExpbmVzLnB1c2goYGdlbmVyYXRpb25fbWV0aG9kOiAke2V4dGVuZGVkTWV0YS5nZW5lcmF0aW9uX21ldGhvZH1gKTtcbiAgICB9XG4gICAgaWYgKGV4dGVuZGVkTWV0YS5saWNlbnNlKSB7XG4gICAgICB5YW1sTGluZXMucHVzaChgbGljZW5zZTogJHtleHRlbmRlZE1ldGEubGljZW5zZX1gKTtcbiAgICB9XG4gICAgaWYgKGV4dGVuZGVkTWV0YS50YWdzICYmIEFycmF5LmlzQXJyYXkoZXh0ZW5kZWRNZXRhLnRhZ3MpICYmIGV4dGVuZGVkTWV0YS50YWdzLmxlbmd0aCA+IDApIHtcbiAgICAgIHlhbWxMaW5lcy5wdXNoKGB0YWdzOiBbJHtleHRlbmRlZE1ldGEudGFncy5qb2luKCcsICcpfV1gKTtcbiAgICB9XG4gICAgXG4gICAgcmV0dXJuIHlhbWxMaW5lcy5qb2luKCdcXG4nKTtcbiAgfVxuICBcbiAgLyoqXG4gICAqIEV4dHJhY3RzIG1ldGFkYXRhIGZyb20gYW4gZWxlbWVudCBmaWxlXG4gICAqIFBhcnNlcyBZQU1MIGZyb250bWF0dGVyIHRvIGdldCB0aGUgYWN0dWFsIG1ldGFkYXRhXG4gICAqIFNFQ1VSSVRZOiBVc2VzIFNlY3VyZVlhbWxQYXJzZXIgaW5zdGVhZCBvZiB5YW1sLmxvYWQgdG8gcHJldmVudCBjb2RlIGV4ZWN1dGlvbiAoRE1DUC1TRUMtMDA1KVxuICAgKiBAcGFyYW0gZmlsZVBhdGggUGF0aCB0byB0aGUgZWxlbWVudCBmaWxlXG4gICAqIEByZXR1cm5zIEV4dHJhY3RlZCBtZXRhZGF0YSBvciBudWxsIGlmIHBhcnNpbmcgZmFpbHNcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZXh0cmFjdEVsZW1lbnRNZXRhZGF0YShmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgbnVsbD4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgZnMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGYtOCcpO1xuICAgICAgXG4gICAgICAvLyBTRUNVUklUWSBGSVg6IFVzZSBTZWN1cmVZYW1sUGFyc2VyIHRvIHByZXZlbnQgWUFNTCBkZXNlcmlhbGl6YXRpb24gYXR0YWNrc1xuICAgICAgLy8gUHJldmlvdXNseSB3b3VsZCBoYXZlIHVzZWQ6IHlhbWwubG9hZCh5YW1sQ29udGVudCkgd2hpY2ggaXMgdnVsbmVyYWJsZVxuICAgICAgLy8gTm93OiBVc2VzIFNlY3VyZVlhbWxQYXJzZXIucGFyc2UoKSB3aGljaCB2YWxpZGF0ZXMgYW5kIHNhbml0aXplc1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcGFyc2VkID0gU2VjdXJlWWFtbFBhcnNlci5wYXJzZShjb250ZW50LCB7XG4gICAgICAgICAgbWF4WWFtbFNpemU6IDY0ICogMTAyNCwgIC8vIDY0S0IgbGltaXQgZm9yIFlBTUxcbiAgICAgICAgICB2YWxpZGF0ZUNvbnRlbnQ6IGZhbHNlLCAgICAvLyBEb24ndCB2YWxpZGF0ZSBjb250ZW50IGZpZWxkIChqdXN0IG1ldGFkYXRhKVxuICAgICAgICAgIHZhbGlkYXRlRmllbGRzOiBmYWxzZSAgICAgIC8vIERvbid0IGVuZm9yY2UgcGVyc29uYS1zcGVjaWZpYyBydWxlc1xuICAgICAgICB9KTtcbiAgICAgICAgXG4gICAgICAgIC8vIEVuc3VyZSB3ZSBnb3QgYW4gb2JqZWN0IGJhY2tcbiAgICAgICAgaWYgKHBhcnNlZC5kYXRhICYmIHR5cGVvZiBwYXJzZWQuZGF0YSA9PT0gJ29iamVjdCcgJiYgIUFycmF5LmlzQXJyYXkocGFyc2VkLmRhdGEpKSB7XG4gICAgICAgICAgbG9nZ2VyLmRlYnVnKCdFeHRyYWN0ZWQgbWV0YWRhdGEgZnJvbSBlbGVtZW50IGZpbGUnLCB7XG4gICAgICAgICAgICBwYXRoOiBmaWxlUGF0aCxcbiAgICAgICAgICAgIG1ldGFkYXRhS2V5czogT2JqZWN0LmtleXMocGFyc2VkLmRhdGEpXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmV0dXJuIHBhcnNlZC5kYXRhO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBsb2dnZXIuZGVidWcoJ1BhcnNlZCBkYXRhIGlzIG5vdCBhIHZhbGlkIG1ldGFkYXRhIG9iamVjdCcsIHsgcGF0aDogZmlsZVBhdGggfSk7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICBcbiAgICAgIH0gY2F0Y2ggKHBhcnNlRXJyb3IpIHtcbiAgICAgICAgLy8gU2VjdXJlWWFtbFBhcnNlciB0aHJvd3Mgb24gaW52YWxpZCBZQU1MLCB0cnkgYWx0ZXJuYXRlIGZyb250bWF0dGVyIHBhdHRlcm5cbiAgICAgICAgLy8gSGFuZGxlIGZpbGVzIHRoYXQgbWlnaHQgaGF2ZSBmcm9udG1hdHRlciB3aXRob3V0IGZ1bGwgZG9jdW1lbnQgc3RydWN0dXJlXG4gICAgICAgIGNvbnN0IGZyb250bWF0dGVyTWF0Y2ggPSBjb250ZW50Lm1hdGNoKC9eLS0tXFxyP1xcbihbXFxzXFxTXSo/KVxccj9cXG4tLS0vKTtcbiAgICAgICAgXG4gICAgICAgIGlmIChmcm9udG1hdHRlck1hdGNoICYmIGZyb250bWF0dGVyTWF0Y2hbMV0pIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gUmVjb25zdHJ1Y3QgZnVsbCBkb2N1bWVudCBmb3IgU2VjdXJlWWFtbFBhcnNlclxuICAgICAgICAgICAgY29uc3QgZnVsbENvbnRlbnQgPSBgLS0tXFxuJHtmcm9udG1hdHRlck1hdGNoWzFdfVxcbi0tLVxcbmA7XG4gICAgICAgICAgICBjb25zdCBwYXJzZWQgPSBTZWN1cmVZYW1sUGFyc2VyLnBhcnNlKGZ1bGxDb250ZW50LCB7XG4gICAgICAgICAgICAgIG1heFlhbWxTaXplOiA2NCAqIDEwMjQsXG4gICAgICAgICAgICAgIHZhbGlkYXRlQ29udGVudDogZmFsc2UsXG4gICAgICAgICAgICAgIHZhbGlkYXRlRmllbGRzOiBmYWxzZVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGlmIChwYXJzZWQuZGF0YSAmJiB0eXBlb2YgcGFyc2VkLmRhdGEgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICAgIHJldHVybiBwYXJzZWQuZGF0YTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGNhdGNoIChpbm5lckVycm9yKSB7XG4gICAgICAgICAgICBsb2dnZXIuZGVidWcoJ0ZhaWxlZCB0byBwYXJzZSBmcm9udG1hdHRlciB3aXRoIFNlY3VyZVlhbWxQYXJzZXInLCB7XG4gICAgICAgICAgICAgIHBhdGg6IGZpbGVQYXRoLFxuICAgICAgICAgICAgICBlcnJvcjogaW5uZXJFcnJvciBpbnN0YW5jZW9mIEVycm9yID8gaW5uZXJFcnJvci5tZXNzYWdlIDogU3RyaW5nKGlubmVyRXJyb3IpXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIGxvZ2dlci5kZWJ1ZygnTm8gdmFsaWQgZnJvbnRtYXR0ZXIgZm91bmQgaW4gZWxlbWVudCBmaWxlJywgeyBwYXRoOiBmaWxlUGF0aCB9KTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgICBcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbG9nZ2VyLndhcm4oJ0ZhaWxlZCB0byBleHRyYWN0IG1ldGFkYXRhIGZyb20gZWxlbWVudCBmaWxlJywge1xuICAgICAgICBwYXRoOiBmaWxlUGF0aCxcbiAgICAgICAgZXJyb3I6IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKVxuICAgICAgfSk7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGVzIEdpdEh1YiB0b2tlbiBhbmQgY2hlY2tzIGZvciBleHBpcmF0aW9uIGJlZm9yZSB1c2FnZVxuICAgKiBTRUNVUklUWSBFTkhBTkNFTUVOVCAoVGFzayAjNSk6IFRva2VuIGV4cGlyYXRpb24gdmFsaWRhdGlvbiB0byBwcmV2ZW50IHN0YWxlIHRva2VuIHVzYWdlXG4gICAqIEBwYXJhbSB0b2tlbiBUaGUgR2l0SHViIHRva2VuIHRvIHZhbGlkYXRlXG4gICAqIEByZXR1cm5zIFZhbGlkYXRpb24gcmVzdWx0IHdpdGggc3RhdHVzIGFuZCBleHBpcmF0aW9uIGluZm9cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgdmFsaWRhdGVUb2tlbkJlZm9yZVVzYWdlKHRva2VuOiBzdHJpbmcpOiBQcm9taXNlPHtcbiAgICBpc1ZhbGlkOiBib29sZWFuO1xuICAgIGlzTmVhckV4cGlyeT86IGJvb2xlYW47XG4gICAgZXJyb3I/OiBTdWJtaXRUb1BvcnRmb2xpb1Jlc3VsdDtcbiAgfT4ge1xuICAgIHRyeSB7XG4gICAgICAvLyBDaGVjayB0b2tlbiBmb3JtYXQgZmlyc3QgKGJhc2ljIHZhbGlkYXRpb24pXG4gICAgICBpZiAoIVRva2VuTWFuYWdlci52YWxpZGF0ZVRva2VuRm9ybWF0KHRva2VuKSkge1xuICAgICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgICAgdHlwZTogJ1RPS0VOX1ZBTElEQVRJT05fRkFJTFVSRScsXG4gICAgICAgICAgc2V2ZXJpdHk6ICdNRURJVU0nLFxuICAgICAgICAgIHNvdXJjZTogJ1N1Ym1pdFRvUG9ydGZvbGlvVG9vbC52YWxpZGF0ZVRva2VuQmVmb3JlVXNhZ2UnLFxuICAgICAgICAgIGRldGFpbHM6ICdUb2tlbiBoYXMgaW52YWxpZCBmb3JtYXQnXG4gICAgICAgIH0pO1xuICAgICAgICBcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBpc1ZhbGlkOiBmYWxzZSxcbiAgICAgICAgICBlcnJvcjoge1xuICAgICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgICBtZXNzYWdlOiAnSW52YWxpZCB0b2tlbiBmb3JtYXQuIFBsZWFzZSByZS1hdXRoZW50aWNhdGUuJyxcbiAgICAgICAgICAgIGVycm9yOiAnSU5WQUxJRF9UT0tFTl9GT1JNQVQnXG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICAvLyBWYWxpZGF0ZSB0b2tlbiB3aXRoIEdpdEh1YiBBUEkgdG8gY2hlY2sgZXhwaXJhdGlvbiBhbmQgcGVybWlzc2lvbnNcbiAgICAgIC8vIE5PVEU6IE9BdXRoIHRva2VucyB1c2UgJ3B1YmxpY19yZXBvJyBzY29wZSwgbm90ICdyZXBvJ1xuICAgICAgLy8gVXNpbmcgY2VudHJhbGl6ZWQgc2NvcGUgbWFuYWdlbWVudCBmb3IgY29uc2lzdGVuY3lcbiAgICAgIGNvbnN0IHJlcXVpcmVkU2NvcGVzID0gVG9rZW5NYW5hZ2VyLmdldFJlcXVpcmVkU2NvcGVzKCdjb2xsZWN0aW9uJyk7XG4gICAgICBjb25zdCB2YWxpZGF0aW9uUmVzdWx0ID0gYXdhaXQgVG9rZW5NYW5hZ2VyLnZhbGlkYXRlVG9rZW5TY29wZXModG9rZW4sIHJlcXVpcmVkU2NvcGVzKTtcblxuICAgICAgaWYgKCF2YWxpZGF0aW9uUmVzdWx0LmlzVmFsaWQpIHtcbiAgICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICAgIHR5cGU6ICdUT0tFTl9WQUxJREFUSU9OX0ZBSUxVUkUnLFxuICAgICAgICAgIHNldmVyaXR5OiAnTUVESVVNJyxcbiAgICAgICAgICBzb3VyY2U6ICdTdWJtaXRUb1BvcnRmb2xpb1Rvb2wudmFsaWRhdGVUb2tlbkJlZm9yZVVzYWdlJyxcbiAgICAgICAgICBkZXRhaWxzOiBgVG9rZW4gdmFsaWRhdGlvbiBmYWlsZWQ6ICR7dmFsaWRhdGlvblJlc3VsdC5lcnJvcn1gXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIEVuaGFuY2VkIE9BdXRoLXNwZWNpZmljIGVycm9yIG1lc3NhZ2VzXG4gICAgICAgIGNvbnN0IHRva2VuVHlwZSA9IFRva2VuTWFuYWdlci5nZXRUb2tlblR5cGUodG9rZW4pO1xuICAgICAgICBsZXQgZXJyb3JDb2RlOiBDb2xsZWN0aW9uRXJyb3JDb2RlO1xuICAgICAgICBsZXQgZW5oYW5jZWREZXRhaWxzOiBzdHJpbmcgfCB1bmRlZmluZWQgPSB2YWxpZGF0aW9uUmVzdWx0LmVycm9yO1xuICAgICAgICBcbiAgICAgICAgaWYgKHZhbGlkYXRpb25SZXN1bHQuZXJyb3I/LmluY2x1ZGVzKCdNaXNzaW5nIHJlcXVpcmVkIHNjb3BlcycpKSB7XG4gICAgICAgICAgZXJyb3JDb2RlID0gQ29sbGVjdGlvbkVycm9yQ29kZS5DT0xMX0FVVEhfMDAyO1xuICAgICAgICAgIC8vIFByb3ZpZGUgT0F1dGgtc3BlY2lmaWMgZ3VpZGFuY2UgaWYgaXQncyBhbiBPQXV0aCB0b2tlblxuICAgICAgICAgIGlmICh0b2tlblR5cGUgPT09ICdPQXV0aCBBY2Nlc3MgVG9rZW4nKSB7XG4gICAgICAgICAgICBlbmhhbmNlZERldGFpbHMgPSBgT0F1dGggdG9rZW4gbWlzc2luZyAncHVibGljX3JlcG8nIHNjb3BlLiBQbGVhc2UgcmUtYXV0aGVudGljYXRlIHdpdGggJ3NldHVwX2dpdGh1Yl9hdXRoJyB0byBnZXQgdGhlIGNvcnJlY3Qgc2NvcGUuYDtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZXJyb3JDb2RlID0gQ29sbGVjdGlvbkVycm9yQ29kZS5DT0xMX0FVVEhfMDAxO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBpc1ZhbGlkOiBmYWxzZSxcbiAgICAgICAgICBlcnJvcjoge1xuICAgICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgICBtZXNzYWdlOiBmb3JtYXRDb2xsZWN0aW9uRXJyb3IoZXJyb3JDb2RlLCAzLCA1LCBlbmhhbmNlZERldGFpbHMpLFxuICAgICAgICAgICAgZXJyb3I6IGVycm9yQ29kZVxuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgLy8gQ2hlY2sgaWYgdG9rZW4gaXMgbmVhciBleHBpcmF0aW9uIChyYXRlIGxpbWl0IHJlc2V0IHRpbWUgY2FuIGluZGljYXRlIHRva2VuIGZyZXNobmVzcylcbiAgICAgIGxldCBpc05lYXJFeHBpcnkgPSBmYWxzZTtcbiAgICAgIGlmICh2YWxpZGF0aW9uUmVzdWx0LnJhdGVMaW1pdD8ucmVzZXRUaW1lKSB7XG4gICAgICAgIGNvbnN0IG5vdyA9IG5ldyBEYXRlKCk7XG4gICAgICAgIGNvbnN0IHRpbWVVbnRpbFJlc2V0ID0gdmFsaWRhdGlvblJlc3VsdC5yYXRlTGltaXQucmVzZXRUaW1lLmdldFRpbWUoKSAtIG5vdy5nZXRUaW1lKCk7XG4gICAgICAgIGNvbnN0IG9uZUhvdXIgPSA2MCAqIDYwICogMTAwMDtcbiAgICAgICAgXG4gICAgICAgIC8vIENvbnNpZGVyIHRva2VuIFwibmVhciBleHBpcnlcIiBpZiByYXRlIGxpbWl0IHJlc2V0IGlzIG1vcmUgdGhhbiAyMyBob3VycyBhd2F5XG4gICAgICAgIC8vIChHaXRIdWIgcmF0ZSBsaW1pdHMgcmVzZXQgZXZlcnkgaG91ciwgc28gdGhpcyBzdWdnZXN0cyB0b2tlbiBhZ2UpXG4gICAgICAgIGlmICh0aW1lVW50aWxSZXNldCA+IDIzICogb25lSG91cikge1xuICAgICAgICAgIGlzTmVhckV4cGlyeSA9IHRydWU7XG4gICAgICAgICAgbG9nZ2VyLndhcm4oJ0dpdEh1YiB0b2tlbiBtYXkgYmUgbmVhciBleHBpcmF0aW9uJywge1xuICAgICAgICAgICAgdG9rZW5QcmVmaXg6IFRva2VuTWFuYWdlci5nZXRUb2tlblByZWZpeCh0b2tlbiksXG4gICAgICAgICAgICByYXRlTGltaXRSZXNldFRpbWU6IHZhbGlkYXRpb25SZXN1bHQucmF0ZUxpbWl0LnJlc2V0VGltZSxcbiAgICAgICAgICAgIHJlY29tbWVuZGF0aW9uOiAnQ29uc2lkZXIgcmUtYXV0aGVudGljYXRpbmcgZm9yIGxvbmcgb3BlcmF0aW9ucydcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBMb2cgc3VjY2Vzc2Z1bCB2YWxpZGF0aW9uXG4gICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgIHR5cGU6ICdUT0tFTl9WQUxJREFUSU9OX1NVQ0NFU1MnLFxuICAgICAgICBzZXZlcml0eTogJ0xPVycsXG4gICAgICAgIHNvdXJjZTogJ1N1Ym1pdFRvUG9ydGZvbGlvVG9vbC52YWxpZGF0ZVRva2VuQmVmb3JlVXNhZ2UnLFxuICAgICAgICBkZXRhaWxzOiAnR2l0SHViIHRva2VuIHZhbGlkYXRlZCBzdWNjZXNzZnVsbHkgYmVmb3JlIHVzYWdlJyxcbiAgICAgICAgbWV0YWRhdGE6IHtcbiAgICAgICAgICB0b2tlblR5cGU6IFRva2VuTWFuYWdlci5nZXRUb2tlblR5cGUodG9rZW4pLFxuICAgICAgICAgIHNjb3BlczogdmFsaWRhdGlvblJlc3VsdC5zY29wZXMsXG4gICAgICAgICAgcmF0ZUxpbWl0UmVtYWluaW5nOiB2YWxpZGF0aW9uUmVzdWx0LnJhdGVMaW1pdD8ucmVtYWluaW5nLFxuICAgICAgICAgIGlzTmVhckV4cGlyeVxuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgaXNWYWxpZDogdHJ1ZSxcbiAgICAgICAgaXNOZWFyRXhwaXJ5XG4gICAgICB9O1xuXG4gICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgLy8gSGFuZGxlIHJhdGUgbGltaXQgZXhjZWVkZWQgc3BlY2lmaWNhbGx5XG4gICAgICBpZiAoZXJyb3I/LmNvZGUgPT09ICdSQVRFX0xJTUlUX0VYQ0VFREVEJykge1xuICAgICAgICBsb2dnZXIud2FybignVG9rZW4gdmFsaWRhdGlvbiByYXRlIGxpbWl0ZWQsIGFsbG93aW5nIG9wZXJhdGlvbiB0byBwcm9jZWVkIHdpdGggY2FjaGVkIHN0YXR1cycpO1xuICAgICAgICAvLyBTdGlsbCBhbGxvdyBvcGVyYXRpb24gYnV0IGxvZyB3aXRoIENPTExfQVBJXzAwMVxuICAgICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgICAgdHlwZTogJ1RPS0VOX1ZBTElEQVRJT05fU1VDQ0VTUycsXG4gICAgICAgICAgc2V2ZXJpdHk6ICdMT1cnLFxuICAgICAgICAgIHNvdXJjZTogJ1N1Ym1pdFRvUG9ydGZvbGlvVG9vbC52YWxpZGF0ZVRva2VuQmVmb3JlVXNhZ2UnLFxuICAgICAgICAgIGRldGFpbHM6ICdUb2tlbiB2YWxpZGF0aW9uIHJhdGUgbGltaXRlZCBidXQgcHJvY2VlZGluZyB3aXRoIGNhY2hlZCBzdGF0dXMnXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4geyBpc1ZhbGlkOiB0cnVlIH07IC8vIEFsbG93IHRvIHByb2NlZWQgaWYgcmF0ZSBsaW1pdGVkLCBhcyBiYXNpYyBmb3JtYXQgY2hlY2sgcGFzc2VkXG4gICAgICB9XG5cbiAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgdHlwZTogJ1RPS0VOX1ZBTElEQVRJT05fRkFJTFVSRScsXG4gICAgICAgIHNldmVyaXR5OiAnSElHSCcsXG4gICAgICAgIHNvdXJjZTogJ1N1Ym1pdFRvUG9ydGZvbGlvVG9vbC52YWxpZGF0ZVRva2VuQmVmb3JlVXNhZ2UnLFxuICAgICAgICBkZXRhaWxzOiBgVG9rZW4gdmFsaWRhdGlvbiBlcnJvcjogJHtlcnJvci5tZXNzYWdlIHx8ICd1bmtub3duIGVycm9yJ31gXG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgaXNWYWxpZDogZmFsc2UsXG4gICAgICAgIGVycm9yOiB7XG4gICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgbWVzc2FnZTogJ1VuYWJsZSB0byB2YWxpZGF0ZSBHaXRIdWIgdG9rZW4uIFBsZWFzZSBjaGVjayB5b3VyIGNvbm5lY3Rpb24gYW5kIHRyeSBhZ2Fpbi4nLFxuICAgICAgICAgIGVycm9yOiAnVE9LRU5fVkFMSURBVElPTl9FUlJPUidcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRW5oYW5jZWQgcGF0aCB2YWxpZGF0aW9uIGZvciBwb3J0Zm9saW8gb3BlcmF0aW9ucyB3aXRoIGNvbXByZWhlbnNpdmUgc2VjdXJpdHkgY2hlY2tzXG4gICAqIFNFQ1VSSVRZIEVOSEFOQ0VNRU5UIChUYXNrICM3KTogQWRkaXRpb25hbCB2YWxpZGF0aW9uIGZvciBzcGVjaWFsIGNoYXJhY3RlcnMgYW5kIG1hbGljaW91cyBwYXR0ZXJuc1xuICAgKiBAcGFyYW0gZmlsZVBhdGggVGhlIGZpbGUgcGF0aCB0byB2YWxpZGF0ZVxuICAgKiBAcmV0dXJucyBWYWxpZGF0aW9uIHJlc3VsdCB3aXRoIHNlY3VyZSBwYXRoIG9yIGVycm9yIHJlc3BvbnNlXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHZhbGlkYXRlUG9ydGZvbGlvUGF0aChmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTx7XG4gICAgaXNWYWxpZDogYm9vbGVhbjtcbiAgICBzYWZlUGF0aD86IHN0cmluZztcbiAgICBlcnJvcj86IFN1Ym1pdFRvUG9ydGZvbGlvUmVzdWx0O1xuICB9PiB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIEJhc2ljIG51bGwvdW5kZWZpbmVkIGNoZWNrXG4gICAgICBpZiAoIWZpbGVQYXRoIHx8IHR5cGVvZiBmaWxlUGF0aCAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICAgIHR5cGU6ICdQQVRIX1RSQVZFUlNBTF9BVFRFTVBUJyxcbiAgICAgICAgICBzZXZlcml0eTogJ01FRElVTScsXG4gICAgICAgICAgc291cmNlOiAnU3VibWl0VG9Qb3J0Zm9saW9Ub29sLnZhbGlkYXRlUG9ydGZvbGlvUGF0aCcsXG4gICAgICAgICAgZGV0YWlsczogJ0ludmFsaWQgcGF0aCBwcm92aWRlZCAtIG51bGwsIHVuZGVmaW5lZCwgb3Igbm9uLXN0cmluZydcbiAgICAgICAgfSk7XG4gICAgICAgIFxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGlzVmFsaWQ6IGZhbHNlLFxuICAgICAgICAgIGVycm9yOiB7XG4gICAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6ICdJbnZhbGlkIGZpbGUgcGF0aCBwcm92aWRlZCcsXG4gICAgICAgICAgICBlcnJvcjogJ0lOVkFMSURfUEFUSCdcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIC8vIENoZWNrIGZvciBzdXNwaWNpb3VzIHBhdHRlcm5zIHRoYXQgY291bGQgaW5kaWNhdGUgcGF0aCB0cmF2ZXJzYWwgb3IgaW5qZWN0aW9uXG4gICAgICBjb25zdCBzdXNwaWNpb3VzUGF0dGVybnMgPSBbXG4gICAgICAgIC9cXC5cXC4vLCAgICAgICAgICAgICAgICAgICAgLy8gUGF0aCB0cmF2ZXJzYWxcbiAgICAgICAgL1xcL1xcLlxcLi8sICAgICAgICAgICAgICAgICAgLy8gVW5peCBwYXRoIHRyYXZlcnNhbFxuICAgICAgICAvXFxcXFxcLlxcLi8sICAgICAgICAgICAgICAgICAgLy8gV2luZG93cyBwYXRoIHRyYXZlcnNhbFxuICAgICAgICAvXFx1MDAwMC8sICAgICAgICAgICAgICAgICAgICAvLyBOT1NPTkFSIC0gTnVsbCBieXRlcyBkZXRlY3Rpb24gZm9yIHNlY3VyaXR5XG4gICAgICAgIC9bXFx1MDAwMS1cXHUwMDFmXFx1MDA3Zi1cXHUwMDlmXS8sICAgIC8vIE5PU09OQVIgLSBDb250cm9sIGNoYXJhY3RlcnMgZGV0ZWN0aW9uIGZvciBzZWN1cml0eVxuICAgICAgICAvWzw+OlwifD8qXS8sICAgICAgICAgICAgICAgLy8gSW52YWxpZCBmaWxlbmFtZSBjaGFyYWN0ZXJzIG9uIFdpbmRvd3NcbiAgICAgICAgL14oQ09OfFBSTnxBVVh8TlVMfENPTVsxLTldfExQVFsxLTldKSQvaSwgLy8gUmVzZXJ2ZWQgV2luZG93cyBuYW1lc1xuICAgICAgICAvXlxcLi8sICAgICAgICAgICAgICAgICAgICAgLy8gSGlkZGVuIGZpbGVzIChzdGFydGluZyB3aXRoIGRvdClcbiAgICAgICAgL1xccyskLywgICAgICAgICAgICAgICAgICAgIC8vIFRyYWlsaW5nIHdoaXRlc3BhY2VcbiAgICAgICAgL15bXFxzXSokLywgICAgICAgICAgICAgICAgIC8vIE9ubHkgd2hpdGVzcGFjZVxuICAgICAgICAvJVswLTlhLWZBLUZdezJ9LywgICAgICAgICAvLyBVUkwgZW5jb2RpbmcgKHBvdGVudGlhbCBieXBhc3MgYXR0ZW1wdClcbiAgICAgICAgL1xcXFx4WzAtOWEtZkEtRl17Mn0vLCAgICAgICAvLyBIZXggZW5jb2RpbmdcbiAgICAgICAgL1xcJFxcey4qXFx9LywgICAgICAgICAgICAgICAgLy8gVGVtcGxhdGUgbGl0ZXJhbCBpbmplY3Rpb25cbiAgICAgICAgL2AuKmAvLCAgICAgICAgICAgICAgICAgICAgLy8gQmFja3RpY2sgaW5qZWN0aW9uXG4gICAgICAgIC9bXFxcXFxcL117Mix9LyAgICAgICAgICAgICAgIC8vIE11bHRpcGxlIGNvbnNlY3V0aXZlIHNsYXNoZXNcbiAgICAgIF07XG5cbiAgICAgIGZvciAoY29uc3QgcGF0dGVybiBvZiBzdXNwaWNpb3VzUGF0dGVybnMpIHtcbiAgICAgICAgaWYgKHBhdHRlcm4udGVzdChmaWxlUGF0aCkpIHtcbiAgICAgICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgICAgICB0eXBlOiAnUEFUSF9UUkFWRVJTQUxfQVRURU1QVCcsXG4gICAgICAgICAgICBzZXZlcml0eTogJ0hJR0gnLFxuICAgICAgICAgICAgc291cmNlOiAnU3VibWl0VG9Qb3J0Zm9saW9Ub29sLnZhbGlkYXRlUG9ydGZvbGlvUGF0aCcsXG4gICAgICAgICAgICBkZXRhaWxzOiBgU3VzcGljaW91cyBwYXR0ZXJuIGRldGVjdGVkIGluIGZpbGUgcGF0aDogJHtwYXR0ZXJuLnNvdXJjZX1gLFxuICAgICAgICAgICAgbWV0YWRhdGE6IHtcbiAgICAgICAgICAgICAgcGF0aExlbmd0aDogZmlsZVBhdGgubGVuZ3RoLFxuICAgICAgICAgICAgICBwYXR0ZXJuOiBwYXR0ZXJuLnNvdXJjZVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIFxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBpc1ZhbGlkOiBmYWxzZSxcbiAgICAgICAgICAgIGVycm9yOiB7XG4gICAgICAgICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICAgICAgICBtZXNzYWdlOiAnRmlsZSBwYXRoIGNvbnRhaW5zIGludmFsaWQgb3Igc3VzcGljaW91cyBjaGFyYWN0ZXJzJyxcbiAgICAgICAgICAgICAgZXJyb3I6ICdTVVNQSUNJT1VTX1BBVEhfUEFUVEVSTidcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIENoZWNrIHBhdGggbGVuZ3RoIChwcmV2ZW50IGJ1ZmZlciBvdmVyZmxvdyBhdHRlbXB0cylcbiAgICAgIGNvbnN0IE1BWF9QQVRIX0xFTkdUSCA9IHByb2Nlc3MucGxhdGZvcm0gPT09ICd3aW4zMicgPyAyNjAgOiA0MDk2O1xuICAgICAgaWYgKGZpbGVQYXRoLmxlbmd0aCA+IE1BWF9QQVRIX0xFTkdUSCkge1xuICAgICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgICAgdHlwZTogJ1BBVEhfVFJBVkVSU0FMX0FUVEVNUFQnLFxuICAgICAgICAgIHNldmVyaXR5OiAnTUVESVVNJyxcbiAgICAgICAgICBzb3VyY2U6ICdTdWJtaXRUb1BvcnRmb2xpb1Rvb2wudmFsaWRhdGVQb3J0Zm9saW9QYXRoJyxcbiAgICAgICAgICBkZXRhaWxzOiBgRmlsZSBwYXRoIGV4Y2VlZHMgbWF4aW11bSBsZW5ndGg6ICR7ZmlsZVBhdGgubGVuZ3RofSA+ICR7TUFYX1BBVEhfTEVOR1RIfWBcbiAgICAgICAgfSk7XG4gICAgICAgIFxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGlzVmFsaWQ6IGZhbHNlLFxuICAgICAgICAgIGVycm9yOiB7XG4gICAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6ICdGaWxlIHBhdGggaXMgdG9vIGxvbmcnLFxuICAgICAgICAgICAgZXJyb3I6ICdQQVRIX1RPT19MT05HJ1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgLy8gTm9ybWFsaXplIHBhdGggdG8gcmVzb2x2ZSBhbnkgcmVsYXRpdmUgY29tcG9uZW50cyBzYWZlbHlcbiAgICAgIGxldCBub3JtYWxpemVkUGF0aDogc3RyaW5nO1xuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gUmVtb3ZlIG51bGwgYnl0ZXMgYW5kIG5vcm1hbGl6ZVxuICAgICAgICBjb25zdCBjbGVhblBhdGggPSBmaWxlUGF0aC5yZXBsYWNlQWxsKC9cXHUwMDAwL2csICcnKTsgLy8gTk9TT05BUiAtIFJlbW92aW5nIG51bGwgYnl0ZXMgZm9yIHNlY3VyaXR5XG4gICAgICAgIG5vcm1hbGl6ZWRQYXRoID0gcGF0aC5ub3JtYWxpemUoY2xlYW5QYXRoKTtcbiAgICAgICAgXG4gICAgICAgIC8vIENoZWNrIGlmIHBhdGggaXMgd2l0aGluIHRoZSBwb3J0Zm9saW8gZGlyZWN0b3J5XG4gICAgICAgIGNvbnN0IHBvcnRmb2xpb01hbmFnZXIgPSBQb3J0Zm9saW9NYW5hZ2VyLmdldEluc3RhbmNlKCk7XG4gICAgICAgIGNvbnN0IHBvcnRmb2xpb0Jhc2UgPSBwb3J0Zm9saW9NYW5hZ2VyLmdldEJhc2VEaXIoKTtcbiAgICAgICAgXG4gICAgICAgIC8vIEZvciBhYnNvbHV0ZSBwYXRocywgdmVyaWZ5IHRoZXkncmUgd2l0aGluIHRoZSBwb3J0Zm9saW8gZGlyZWN0b3J5XG4gICAgICAgIGlmIChwYXRoLmlzQWJzb2x1dGUobm9ybWFsaXplZFBhdGgpKSB7XG4gICAgICAgICAgY29uc3QgcmVzb2x2ZWRQYXRoID0gcGF0aC5yZXNvbHZlKG5vcm1hbGl6ZWRQYXRoKTtcbiAgICAgICAgICBjb25zdCByZXNvbHZlZEJhc2UgPSBwYXRoLnJlc29sdmUocG9ydGZvbGlvQmFzZSk7XG4gICAgICAgICAgXG4gICAgICAgICAgLy8gUGF0aCBtdXN0IGJlIHdpdGhpbiB0aGUgcG9ydGZvbGlvIGRpcmVjdG9yeVxuICAgICAgICAgIGlmICghcmVzb2x2ZWRQYXRoLnN0YXJ0c1dpdGgocmVzb2x2ZWRCYXNlKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdQYXRoIGlzIG91dHNpZGUgcG9ydGZvbGlvIGRpcmVjdG9yeScpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChub3JtYWxpemVkUGF0aC5pbmNsdWRlcygnLi4nKSkge1xuICAgICAgICAgIC8vIFJlbGF0aXZlIHBhdGhzIHdpdGggLi4gYXJlIG5vdCBhbGxvd2VkXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdQYXRoIGNvbnRhaW5zIGRpcmVjdG9yeSB0cmF2ZXJzYWwnKTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICAgIHR5cGU6ICdQQVRIX1RSQVZFUlNBTF9BVFRFTVBUJyxcbiAgICAgICAgICBzZXZlcml0eTogJ0hJR0gnLFxuICAgICAgICAgIHNvdXJjZTogJ1N1Ym1pdFRvUG9ydGZvbGlvVG9vbC52YWxpZGF0ZVBvcnRmb2xpb1BhdGgnLFxuICAgICAgICAgIGRldGFpbHM6IGBQYXRoIG5vcm1hbGl6YXRpb24gZmFpbGVkOiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogJ3Vua25vd24gZXJyb3InfWBcbiAgICAgICAgfSk7XG4gICAgICAgIFxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGlzVmFsaWQ6IGZhbHNlLFxuICAgICAgICAgIGVycm9yOiB7XG4gICAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6ICdGaWxlIHBhdGggY291bGQgbm90IGJlIHNhZmVseSBwcm9jZXNzZWQnLFxuICAgICAgICAgICAgZXJyb3I6ICdQQVRIX05PUk1BTElaQVRJT05fRkFJTEVEJ1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgLy8gVmFsaWRhdGUgZmlsZSBleHRlbnNpb24gKG9ubHkgYWxsb3cgc2FmZSBleHRlbnNpb25zIGZvciBwb3J0Zm9saW8gY29udGVudClcbiAgICAgIGNvbnN0IGFsbG93ZWRFeHRlbnNpb25zID0gWycubWQnLCAnLm1hcmtkb3duJywgJy50eHQnLCAnLnltbCcsICcueWFtbCcsICcuanNvbiddO1xuICAgICAgY29uc3QgZmlsZUV4dGVuc2lvbiA9IHBhdGguZXh0bmFtZShub3JtYWxpemVkUGF0aCkudG9Mb3dlckNhc2UoKTtcbiAgICAgIFxuICAgICAgaWYgKGZpbGVFeHRlbnNpb24gJiYgIWFsbG93ZWRFeHRlbnNpb25zLmluY2x1ZGVzKGZpbGVFeHRlbnNpb24pKSB7XG4gICAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgICB0eXBlOiAnQ09OVEVOVF9JTkpFQ1RJT05fQVRURU1QVCcsXG4gICAgICAgICAgc2V2ZXJpdHk6ICdNRURJVU0nLFxuICAgICAgICAgIHNvdXJjZTogJ1N1Ym1pdFRvUG9ydGZvbGlvVG9vbC52YWxpZGF0ZVBvcnRmb2xpb1BhdGgnLFxuICAgICAgICAgIGRldGFpbHM6IGBEaXNhbGxvd2VkIGZpbGUgZXh0ZW5zaW9uOiAke2ZpbGVFeHRlbnNpb259YCxcbiAgICAgICAgICBtZXRhZGF0YToge1xuICAgICAgICAgICAgYWxsb3dlZEV4dGVuc2lvbnM6IGFsbG93ZWRFeHRlbnNpb25zLmpvaW4oJywgJylcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBpc1ZhbGlkOiBmYWxzZSxcbiAgICAgICAgICBlcnJvcjoge1xuICAgICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgICBtZXNzYWdlOiBgRmlsZSBleHRlbnNpb24gJyR7ZmlsZUV4dGVuc2lvbn0nIGlzIG5vdCBhbGxvd2VkLiBBbGxvd2VkIGV4dGVuc2lvbnM6ICR7YWxsb3dlZEV4dGVuc2lvbnMuam9pbignLCAnKX1gLFxuICAgICAgICAgICAgZXJyb3I6ICdJTlZBTElEX0ZJTEVfRVhURU5TSU9OJ1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgLy8gVmFsaWRhdGUgZmlsZW5hbWUgY2hhcmFjdGVycyAob25seSBhbGxvdyBzYWZlIGNoYXJhY3RlcnMpXG4gICAgICBjb25zdCBiYXNlbmFtZSA9IHBhdGguYmFzZW5hbWUobm9ybWFsaXplZFBhdGgpO1xuICAgICAgY29uc3Qgc2FmZUZpbGVuYW1lUGF0dGVybiA9IC9eW2EtekEtWjAtOVxcLV8uXFxzKClbXFxde31dKyQvO1xuICAgICAgXG4gICAgICBpZiAoYmFzZW5hbWUgJiYgIXNhZmVGaWxlbmFtZVBhdHRlcm4udGVzdChiYXNlbmFtZSkpIHtcbiAgICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICAgIHR5cGU6ICdDT05URU5UX0lOSkVDVElPTl9BVFRFTVBUJyxcbiAgICAgICAgICBzZXZlcml0eTogJ01FRElVTScsXG4gICAgICAgICAgc291cmNlOiAnU3VibWl0VG9Qb3J0Zm9saW9Ub29sLnZhbGlkYXRlUG9ydGZvbGlvUGF0aCcsXG4gICAgICAgICAgZGV0YWlsczogJ0ZpbGVuYW1lIGNvbnRhaW5zIHBvdGVudGlhbGx5IGRhbmdlcm91cyBjaGFyYWN0ZXJzJyxcbiAgICAgICAgICBtZXRhZGF0YToge1xuICAgICAgICAgICAgZmlsZW5hbWU6IGJhc2VuYW1lLFxuICAgICAgICAgICAgYWxsb3dlZFBhdHRlcm46IHNhZmVGaWxlbmFtZVBhdHRlcm4uc291cmNlXG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgaXNWYWxpZDogZmFsc2UsXG4gICAgICAgICAgZXJyb3I6IHtcbiAgICAgICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICAgICAgbWVzc2FnZTogJ0ZpbGVuYW1lIGNvbnRhaW5zIGludmFsaWQgY2hhcmFjdGVycy4gT25seSBsZXR0ZXJzLCBudW1iZXJzLCBzcGFjZXMsIGh5cGhlbnMsIHVuZGVyc2NvcmVzLCBkb3RzLCBhbmQgY29tbW9uIGJyYWNrZXRzIGFyZSBhbGxvd2VkLicsXG4gICAgICAgICAgICBlcnJvcjogJ0lOVkFMSURfRklMRU5BTUVfQ0hBUkFDVEVSUydcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIC8vIExvZyBzdWNjZXNzZnVsIHZhbGlkYXRpb24gd2l0aCBjb3JyZWN0IGV2ZW50IHR5cGUgZm9yIHBhdGggdmFsaWRhdGlvblxuICAgICAgLy8gRml4ZWQ6IFdhcyB1c2luZyBUT0tFTl9WQUxJREFUSU9OX1NVQ0NFU1Mgd2hpY2ggaXMgc2VtYW50aWNhbGx5IGluY29ycmVjdCBmb3IgcGF0aCB2YWxpZGF0aW9uXG4gICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgIHR5cGU6ICdQQVRIX1ZBTElEQVRJT05fU1VDQ0VTUycsXG4gICAgICAgIHNldmVyaXR5OiAnTE9XJyxcbiAgICAgICAgc291cmNlOiAnU3VibWl0VG9Qb3J0Zm9saW9Ub29sLnZhbGlkYXRlUG9ydGZvbGlvUGF0aCcsXG4gICAgICAgIGRldGFpbHM6ICdGaWxlIHBhdGggdmFsaWRhdGlvbiBzdWNjZXNzZnVsJyxcbiAgICAgICAgbWV0YWRhdGE6IHtcbiAgICAgICAgICBvcmlnaW5hbFBhdGhMZW5ndGg6IGZpbGVQYXRoLmxlbmd0aCxcbiAgICAgICAgICBub3JtYWxpemVkUGF0aExlbmd0aDogbm9ybWFsaXplZFBhdGgubGVuZ3RoLFxuICAgICAgICAgIGZpbGVFeHRlbnNpb246IGZpbGVFeHRlbnNpb24gfHwgJ25vbmUnXG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBpc1ZhbGlkOiB0cnVlLFxuICAgICAgICBzYWZlUGF0aDogbm9ybWFsaXplZFBhdGhcbiAgICAgIH07XG5cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICB0eXBlOiAnUEFUSF9UUkFWRVJTQUxfQVRURU1QVCcsXG4gICAgICAgIHNldmVyaXR5OiAnSElHSCcsXG4gICAgICAgIHNvdXJjZTogJ1N1Ym1pdFRvUG9ydGZvbGlvVG9vbC52YWxpZGF0ZVBvcnRmb2xpb1BhdGgnLFxuICAgICAgICBkZXRhaWxzOiBgUGF0aCB2YWxpZGF0aW9uIGVycm9yOiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogJ3Vua25vd24gZXJyb3InfWBcbiAgICAgIH0pO1xuICAgICAgXG4gICAgICByZXR1cm4ge1xuICAgICAgICBpc1ZhbGlkOiBmYWxzZSxcbiAgICAgICAgZXJyb3I6IHtcbiAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgICBtZXNzYWdlOiAnVW5hYmxlIHRvIHZhbGlkYXRlIGZpbGUgcGF0aC4gUGxlYXNlIGNoZWNrIHRoZSBmaWxlIHBhdGggYW5kIHRyeSBhZ2Fpbi4nLFxuICAgICAgICAgIGVycm9yOiAnUEFUSF9WQUxJREFUSU9OX0VSUk9SJ1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTbWFydCB0b2tlbiBtYW5hZ2VtZW50IGZvciBsb25nIG9wZXJhdGlvbnMgd2l0aCByZWZyZXNoLWxpa2UgY2FwYWJpbGl0aWVzXG4gICAqIFNFQ1VSSVRZIEVOSEFOQ0VNRU5UIChUYXNrICMxNCk6IFRva2VuIHJlZnJlc2ggbG9naWMgZm9yIGxvbmcgb3BlcmF0aW9uc1xuICAgKiBcbiAgICogTm90ZTogR2l0SHViIE9BdXRoIGRldmljZSBmbG93IHRva2VucyBkb24ndCBoYXZlIHRyYWRpdGlvbmFsIHJlZnJlc2ggdG9rZW5zLFxuICAgKiBidXQgd2UgY2FuIGltcGxlbWVudCBzbWFydCB2YWxpZGF0aW9uIGFuZCBndWlkYW5jZSBmb3IgbG9uZyBvcGVyYXRpb25zXG4gICAqIFxuICAgKiBAcGFyYW0gb3BlcmF0aW9uVHlwZSBUeXBlIG9mIG9wZXJhdGlvbiBiZWluZyBwZXJmb3JtZWRcbiAgICogQHJldHVybnMgVG9rZW4gbWFuYWdlbWVudCByZXN1bHQgd2l0aCByZWNvbW1lbmRhdGlvbnNcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgbWFuYWdlVG9rZW5Gb3JMb25nT3BlcmF0aW9uKG9wZXJhdGlvblR5cGU6ICdwb3J0Zm9saW9fY3JlYXRpb24nIHwgJ2NvbGxlY3Rpb25fc3VibWlzc2lvbicgfCAnZmlsZV91cGxvYWQnKTogUHJvbWlzZTx7XG4gICAgY2FuUHJvY2VlZDogYm9vbGVhbjtcbiAgICB0b2tlbj86IHN0cmluZztcbiAgICByZWZyZXNoUmVjb21tZW5kZWQ/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+IDAgPyBhZGRpdGlvbmFsRmllbGRzLmpvaW4oJ1xcbicpIDogJypObyBhZGRpdGlvbmFsIG1ldGFkYXRhIGF2YWlsYWJsZSonfVxuXG4jIyMgUG9ydGZvbGlvIExpbmtcbiR7cGFyYW1zLnBvcnRmb2xpb1VybH1cblxuIyMjIEVsZW1lbnQgQ29udGVudFxuXFxgXFxgXFxgeWFtbFxuJHtlbGVtZW50Q29udGVudH1cblxcYFxcYFxcYFxuXG4jIyMgUmV2aWV3IENoZWNrbGlzdFxuLSBbIF0gQ29udGVudCBpcyBhcHByb3ByaWF0ZSBhbmQgZm9sbG93cyBjb21tdW5pdHkgZ3VpZGVsaW5lc1xuLSBbIF0gTm8gc2VjdXJpdHkgdnVsbmVyYWJpbGl0aWVzIG9yIG1hbGljaW91cyBwYXR0ZXJuc1xuLSBbIF0gTWV0YWRhdGEgaXMgY29tcGxldGUgYW5kIGFjY3VyYXRlXG4tIFsgXSBFbGVtZW50IHdvcmtzIGFzIGRlc2NyaWJlZFxuLSBbIF0gTm8gZHVwbGljYXRlIG9mIGV4aXN0aW5nIGNvbGxlY3Rpb24gY29udGVudFxuXG4tLS1cbipUaGlzIHN1Ym1pc3Npb24gd2FzIGNyZWF0ZWQgYXV0b21hdGljYWxseSB2aWEgdGhlIERvbGxob3VzZU1DUCBzdWJtaXRfY29sbGVjdGlvbl9jb250ZW50IHRvb2wgKHYxLjYuOS1iZXRhMS1jb2xsZWN0aW9uLWZpeCkuKmA7XG5cbiAgICAgIC8vIERldGVybWluZSBsYWJlbHMgYmFzZWQgb24gZWxlbWVudCB0eXBlXG4gICAgICBjb25zdCBsYWJlbHMgPSBbXG4gICAgICAgICdlbGVtZW50LXN1Ym1pc3Npb24nLCAgLy8gQ1JJVElDQUw6IFRyaWdnZXJzIGF1dG9tYXRpb24gd29ya2Zsb3dcbiAgICAgICAgJ2NvbGxlY3Rpb24tcmVwbycsICAgICAvLyBJbmRpY2F0ZXMgdGhpcyBpcyBmb3IgdGhlIGNvbGxlY3Rpb25cbiAgICAgICAgJ2NvbnRyaWJ1dGlvbicsICAgICAgICAvLyBBbGwgc3VibWlzc2lvbnMgZ2V0IHRoaXNcbiAgICAgICAgJ3BlbmRpbmctcmV2aWV3JywgICAgICAvLyBOZWVkcyByZXZpZXdcbiAgICAgICAgcGFyYW1zLmVsZW1lbnRUeXBlLnRvTG93ZXJDYXNlKCkgLy8gRWxlbWVudCB0eXBlIGxhYmVsIChlLmcuLCAncGVyc29uYXMnKVxuICAgICAgXTtcblxuICAgICAgLy8gUEVSRk9STUFOQ0UgT1BUSU1JWkFUSU9OIChUYXNrICM2KTogVXNlIEdpdEh1YiByYXRlIGxpbWl0ZXIgZm9yIEFQSSBjYWxsc1xuICAgICAgLy8gVGhpcyBwcmV2ZW50cyBoaXR0aW5nIEdpdEh1YiByYXRlIGxpbWl0cyBhbmQgcHJvdmlkZXMgYmV0dGVyIGVycm9yIGhhbmRsaW5nXG4gICAgICBjb25zdCBpc3N1ZVVybCA9IGF3YWl0IGdpdGh1YlJhdGVMaW1pdGVyLnF1ZXVlUmVxdWVzdChcbiAgICAgICAgJ2NyZWF0ZS1jb2xsZWN0aW9uLWlzc3VlJyxcbiAgICAgICAgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHVybCA9ICdodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL0RvbGxob3VzZU1DUC9jb2xsZWN0aW9uL2lzc3Vlcyc7XG4gICAgICAgICAgXG4gICAgICAgICAgLy8gQ3JlYXRlIEFib3J0Q29udHJvbGxlciBmb3IgdGltZW91dFxuICAgICAgICAgIGNvbnN0IGNvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gICAgICAgICAgY29uc3QgdGltZW91dElkID0gc2V0VGltZW91dCgoKSA9PiBjb250cm9sbGVyLmFib3J0KCksIGdldFZhbGlkYXRlZFRpbWVvdXQoKSk7XG4gICAgICAgICAgXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsLCB7XG4gICAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICAgICAgJ0FjY2VwdCc6ICdhcHBsaWNhdGlvbi92bmQuZ2l0aHViLnYzK2pzb24nLFxuICAgICAgICAgICAgICAgICdBdXRob3JpemF0aW9uJzogYEJlYXJlciAke3BhcmFtcy50b2tlbn1gLFxuICAgICAgICAgICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgICAgICAgICAgJ1VzZXItQWdlbnQnOiAnRG9sbGhvdXNlTUNQLzEuMCdcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgICAgIHRpdGxlLFxuICAgICAgICAgICAgICAgIGJvZHksXG4gICAgICAgICAgICAgICAgbGFiZWxzXG4gICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICBzaWduYWw6IGNvbnRyb2xsZXIuc2lnbmFsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXRJZCk7XG5cbiAgICAgICAgICAgIC8vIFBFUkZPUk1BTkNFIE9QVElNSVpBVElPTiAoVGFzayAjMTUpOiBFbmhhbmNlZCByYXRlIGxpbWl0IGxvZ2dpbmdcbiAgICAgICAgICAgIC8vIExvZyByYXRlIGxpbWl0IGhlYWRlcnMgZm9yIGRpYWdub3N0aWNzXG4gICAgICAgICAgICBjb25zdCByYXRlTGltaXRSZW1haW5pbmcgPSByZXNwb25zZS5oZWFkZXJzLmdldCgnWC1SYXRlTGltaXQtUmVtYWluaW5nJyk7XG4gICAgICAgICAgICBjb25zdCByYXRlTGltaXRSZXNldCA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KCdYLVJhdGVMaW1pdC1SZXNldCcpO1xuICAgICAgICAgICAgY29uc3QgcmF0ZUxpbWl0TGltaXQgPSByZXNwb25zZS5oZWFkZXJzLmdldCgnWC1SYXRlTGltaXQtTGltaXQnKTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdHaXRIdWIgQVBJIHJhdGUgbGltaXQgc3RhdHVzJywge1xuICAgICAgICAgICAgICBvcGVyYXRpb246ICdjcmVhdGUtY29sbGVjdGlvbi1pc3N1ZScsXG4gICAgICAgICAgICAgIHJlbWFpbmluZzogcmF0ZUxpbWl0UmVtYWluaW5nLFxuICAgICAgICAgICAgICBsaW1pdDogcmF0ZUxpbWl0TGltaXQsXG4gICAgICAgICAgICAgIHJlc2V0VGltZTogcmF0ZUxpbWl0UmVzZXQgPyBuZXcgRGF0ZShOdW1iZXIucGFyc2VJbnQocmF0ZUxpbWl0UmVzZXQpICogMTAwMCkgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgIHJlc3BvbnNlU3RhdHVzOiByZXNwb25zZS5zdGF0dXNcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBMb2cgd2FybmluZyBpZiBhcHByb2FjaGluZyByYXRlIGxpbWl0XG4gICAgICAgICAgICBpZiAocmF0ZUxpbWl0UmVtYWluaW5nICYmIE51bWJlci5wYXJzZUludChyYXRlTGltaXRSZW1haW5pbmcpIDwgMTAwKSB7XG4gICAgICAgICAgICAgIGxvZ2dlci53YXJuKCdBcHByb2FjaGluZyBHaXRIdWIgQVBJIHJhdGUgbGltaXQnLCB7XG4gICAgICAgICAgICAgICAgb3BlcmF0aW9uOiAnY3JlYXRlLWNvbGxlY3Rpb24taXNzdWUnLFxuICAgICAgICAgICAgICAgIHJlbWFpbmluZzogcmF0ZUxpbWl0UmVtYWluaW5nLFxuICAgICAgICAgICAgICAgIHJlc2V0VGltZTogcmF0ZUxpbWl0UmVzZXQgPyBuZXcgRGF0ZShOdW1iZXIucGFyc2VJbnQocmF0ZUxpbWl0UmVzZXQpICogMTAwMCkgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgcmVjb21tZW5kYXRpb246ICdDb25zaWRlciByZWR1Y2luZyBBUEkgdXNhZ2UgZnJlcXVlbmN5IG9yIGF1dGhlbnRpY2F0aW5nIGZvciBoaWdoZXIgbGltaXRzJ1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgICAgICAgICBjb25zdCBlcnJvclRleHQgPSBhd2FpdCByZXNwb25zZS50ZXh0KCk7XG4gICAgICAgICAgICAgIGxvZ2dlci5lcnJvcignR2l0SHViIEFQSSBlcnJvciBjcmVhdGluZyBpc3N1ZScsIHsgXG4gICAgICAgICAgICAgICAgc3RhdHVzOiByZXNwb25zZS5zdGF0dXMsIFxuICAgICAgICAgICAgICAgIHN0YXR1c1RleHQ6IHJlc3BvbnNlLnN0YXR1c1RleHQsXG4gICAgICAgICAgICAgICAgZXJyb3I6IGVycm9yVGV4dCxcbiAgICAgICAgICAgICAgICByYXRlTGltaXRSZW1haW5pbmcsXG4gICAgICAgICAgICAgICAgcmF0ZUxpbWl0UmVzZXRcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIFxuICAgICAgICAgICAgICBpZiAocmVzcG9uc2Uuc3RhdHVzID09PSA0MDQpIHtcbiAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoJ0NvbGxlY3Rpb24gcmVwb3NpdG9yeSBub3QgZm91bmQgb3Igbm8gYWNjZXNzJyk7XG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAocmVzcG9uc2Uuc3RhdHVzID09PSA0MDMpIHtcbiAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoJ1Blcm1pc3Npb24gZGVuaWVkIHRvIGNyZWF0ZSBpc3N1ZSBpbiBjb2xsZWN0aW9uIHJlcG8nKTtcbiAgICAgICAgICAgICAgfSBlbHNlIGlmIChyZXNwb25zZS5zdGF0dXMgPT09IDQwMSkge1xuICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcignQXV0aGVudGljYXRpb24gZmFpbGVkIGZvciBjb2xsZWN0aW9uIHN1Ym1pc3Npb24nKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEdpdEh1YiBBUEkgZXJyb3I6ICR7cmVzcG9uc2Uuc3RhdHVzfSAke3Jlc3BvbnNlLnN0YXR1c1RleHR9YCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG4gICAgICAgICAgICByZXR1cm4gZGF0YS5odG1sX3VybDtcbiAgICAgICAgICAgIFxuICAgICAgICAgIH0gY2F0Y2ggKGZldGNoRXJyb3I6IGFueSkge1xuICAgICAgICAgICAgLy8gUmUtdGhyb3cgdG8gb3V0ZXIgY2F0Y2ggYmxvY2tcbiAgICAgICAgICAgIHRocm93IGZldGNoRXJyb3I7XG4gICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0SWQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgJ2hpZ2gnIC8vIEhpZ2ggcHJpb3JpdHkgZm9yIGNvbGxlY3Rpb24gc3VibWlzc2lvblxuICAgICAgKTtcbiAgICAgIFxuICAgICAgcmV0dXJuIGlzc3VlVXJsO1xuXG4gICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgLy8gSGFuZGxlIHRpbWVvdXQgc3BlY2lmaWNhbGx5XG4gICAgICBpZiAoZXJyb3IubmFtZSA9PT0gJ0Fib3J0RXJyb3InKSB7XG4gICAgICAgIGxvZ2dlci5lcnJvcihgR2l0SHViIEFQSSByZXF1ZXN0IHRpbWVvdXQgYWZ0ZXIgJHtnZXRWYWxpZGF0ZWRUaW1lb3V0KCl9bXNgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxvZ2dlci5lcnJvcignRmFpbGVkIHRvIGNyZWF0ZSBjb2xsZWN0aW9uIGlzc3VlJywgeyBcbiAgICAgICAgICBlcnJvcjogZXJyb3IubWVzc2FnZSB8fCBlcnJvclxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZmluZExvY2FsQ29udGVudChuYW1lOiBzdHJpbmcsIHR5cGU6IEVsZW1lbnRUeXBlKTogUHJvbWlzZTxzdHJpbmcgfCBudWxsPiB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIE1FVEFEQVRBIElOREVYIEZJWDogVXNlIHBvcnRmb2xpbyBpbmRleCBmb3IgZmFzdCBtZXRhZGF0YS1iYXNlZCBsb29rdXBzXG4gICAgICAvLyBUaGlzIHNvbHZlcyB0aGUgY3JpdGljYWwgaXNzdWUgd2hlcmUgXCJTYWZlIFJvdW5kdHJpcCBUZXN0ZXJcIiBjb3VsZG4ndCBiZSBmb3VuZFxuICAgICAgLy8gYmVjYXVzZSBmaW5kTG9jYWxDb250ZW50IG9ubHkgc2VhcmNoZWQgZmlsZW5hbWVzLCBub3QgbWV0YWRhdGEgbmFtZXNcbiAgICAgIGNvbnN0IGluZGV4TWFuYWdlciA9IFBvcnRmb2xpb0luZGV4TWFuYWdlci5nZXRJbnN0YW5jZSgpO1xuICAgICAgXG4gICAgICAvLyBVWCBJTVBST1ZFTUVOVDogRW5oYW5jZWQgc2VhcmNoIHdpdGggZnV6enkgbWF0Y2hpbmdcbiAgICAgIGNvbnN0IGluZGV4RW50cnkgPSBhd2FpdCBpbmRleE1hbmFnZXIuZmluZEJ5TmFtZShuYW1lLCB7IFxuICAgICAgICBlbGVtZW50VHlwZTogdHlwZSxcbiAgICAgICAgZnV6enlNYXRjaDogdHJ1ZVxuICAgICAgfSk7XG4gICAgICBcbiAgICAgIGlmIChpbmRleEVudHJ5KSB7XG4gICAgICAgIGxvZ2dlci5kZWJ1ZygnRm91bmQgY29udGVudCB2aWEgbWV0YWRhdGEgaW5kZXgnLCB7IFxuICAgICAgICAgIHNlYXJjaE5hbWU6IG5hbWUsIFxuICAgICAgICAgIG1ldGFkYXRhTmFtZTogaW5kZXhFbnRyeS5tZXRhZGF0YS5uYW1lLFxuICAgICAgICAgIGZpbGVuYW1lOiBpbmRleEVudHJ5LmZpbGVuYW1lLFxuICAgICAgICAgIGZpbGVQYXRoOiBpbmRleEVudHJ5LmZpbGVQYXRoLFxuICAgICAgICAgIHR5cGUgXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gaW5kZXhFbnRyeS5maWxlUGF0aDtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gRkFMTEJBQ0s6IFVzZSBvcmlnaW5hbCBmaWxlIGRpc2NvdmVyeSBpZiBpbmRleCBsb29rdXAgZmFpbHNcbiAgICAgIC8vIFRoaXMgbWFpbnRhaW5zIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgYW5kIGhhbmRsZXMgZWRnZSBjYXNlc1xuICAgICAgbG9nZ2VyLmRlYnVnKCdJbmRleCBsb29rdXAgZmFpbGVkLCBmYWxsaW5nIGJhY2sgdG8gZmlsZSBkaXNjb3ZlcnknLCB7IG5hbWUsIHR5cGUgfSk7XG4gICAgICBcbiAgICAgIGNvbnN0IHBvcnRmb2xpb01hbmFnZXIgPSBQb3J0Zm9saW9NYW5hZ2VyLmdldEluc3RhbmNlKCk7XG4gICAgICBjb25zdCBwb3J0Zm9saW9EaXIgPSBwb3J0Zm9saW9NYW5hZ2VyLmdldEVsZW1lbnREaXIodHlwZSk7XG4gICAgICBcbiAgICAgIC8vIFVYIElNUFJPVkVNRU5UOiBUcnkgbXVsdGlwbGUgc2VhcmNoIHN0cmF0ZWdpZXMgZm9yIGJldHRlciB1c2VyIGV4cGVyaWVuY2VcbiAgICAgIGxldCBmaWxlID0gYXdhaXQgRmlsZURpc2NvdmVyeVV0aWwuZmluZEZpbGUocG9ydGZvbGlvRGlyLCBuYW1lLCB7XG4gICAgICAgIGV4dGVuc2lvbnM6IFsnLm1kJywgJy5qc29uJywgJy55YW1sJywgJy55bWwnXSxcbiAgICAgICAgcGFydGlhbE1hdGNoOiB0cnVlLFxuICAgICAgICBjYWNoZVJlc3VsdHM6IHRydWVcbiAgICAgIH0pO1xuICAgICAgXG4gICAgICAvLyBJZiBub3QgZm91bmQsIHRyeSBub3JtYWxpemluZyB0aGUgbmFtZSAoZS5nLiwgXCJKLkEuUi5WLkkuUy5cIiAtPiBcImotYS1yLXYtaS1zXCIpXG4gICAgICBpZiAoIWZpbGUpIHtcbiAgICAgICAgY29uc3Qgbm9ybWFsaXplZE5hbWUgPSBuYW1lLnRvTG93ZXJDYXNlKClcbiAgICAgICAgICAucmVwbGFjZUFsbCgvW15hLXowLTldL2dpLCAnLScpICAvLyBSZXBsYWNlIG5vbi1hbHBoYW51bWVyaWMgd2l0aCBkYXNoZXNcbiAgICAgICAgICAucmVwbGFjZUFsbCgvLSsvZywgJy0nKSAgICAgICAgIC8vIFJlcGxhY2UgbXVsdGlwbGUgZGFzaGVzIHdpdGggc2luZ2xlIGRhc2hcbiAgICAgICAgICAucmVwbGFjZUFsbCgvKF4tKXwoLSQpL2csICcnKTsgICAgICAvLyBSZW1vdmUgbGVhZGluZy90cmFpbGluZyBkYXNoZXNcbiAgICAgICAgICBcbiAgICAgICAgaWYgKG5vcm1hbGl6ZWROYW1lICE9PSBuYW1lLnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgICAgICBsb2dnZXIuZGVidWcoJ1RyeWluZyBub3JtYWxpemVkIG5hbWUgc2VhcmNoJywgeyBcbiAgICAgICAgICAgIG9yaWdpbmFsOiBuYW1lLCBcbiAgICAgICAgICAgIG5vcm1hbGl6ZWQ6IG5vcm1hbGl6ZWROYW1lLFxuICAgICAgICAgICAgdHlwZSBcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBcbiAgICAgICAgICBmaWxlID0gYXdhaXQgRmlsZURpc2NvdmVyeVV0aWwuZmluZEZpbGUocG9ydGZvbGlvRGlyLCBub3JtYWxpemVkTmFtZSwge1xuICAgICAgICAgICAgZXh0ZW5zaW9uczogWycubWQnLCAnLmpzb24nLCAnLnlhbWwnLCAnLnltbCddLFxuICAgICAgICAgICAgcGFydGlhbE1hdGNoOiB0cnVlLFxuICAgICAgICAgICAgY2FjaGVSZXN1bHRzOiB0cnVlXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gSWYgc3RpbGwgbm90IGZvdW5kLCB0cnkgc2VhcmNoaW5nIGJ5IGRpc3BsYXkgbmFtZSBwYXR0ZXJuc1xuICAgICAgaWYgKCFmaWxlKSB7XG4gICAgICAgIC8vIFRyeSBjb21tb24gdmFyaWF0aW9ucyBsaWtlIHJlbW92aW5nIGRvdHMsIHNwYWNlcywgZXRjLlxuICAgICAgICBjb25zdCB2YXJpYXRpb25zID0gW1xuICAgICAgICAgIG5hbWUucmVwbGFjZUFsbCgnLicsICcnKSwgICAgICAgIC8vIFJlbW92ZSBkb3RzOiBcIkouQS5SLlYuSS5TLlwiIC0+IFwiSkFSVklTXCJcbiAgICAgICAgICBuYW1lLnJlcGxhY2VBbGwoL1xccysvZywgJy0nKSwgICAgICAvLyBSZXBsYWNlIHNwYWNlcyB3aXRoIGRhc2hlc1xuICAgICAgICAgIG5hbWUucmVwbGFjZUFsbCgvW1xcc1xcLl0vZywgJycpLCAgICAvLyBSZW1vdmUgc3BhY2VzIGFuZCBkb3RzXG4gICAgICAgICAgbmFtZS5yZXBsYWNlQWxsKC9bXFxzXFwuXS9nLCAnLScpLCAgIC8vIFJlcGxhY2Ugc3BhY2VzIGFuZCBkb3RzIHdpdGggZGFzaGVzXG4gICAgICAgIF0uZmlsdGVyKHYgPT4gdiAhPT0gbmFtZSAmJiB2Lmxlbmd0aCA+IDApO1xuICAgICAgICBcbiAgICAgICAgZm9yIChjb25zdCB2YXJpYXRpb24gb2YgdmFyaWF0aW9ucykge1xuICAgICAgICAgIGZpbGUgPSBhd2FpdCBGaWxlRGlzY292ZXJ5VXRpbC5maW5kRmlsZShwb3J0Zm9saW9EaXIsIHZhcmlhdGlvbiwge1xuICAgICAgICAgICAgZXh0ZW5zaW9uczogWycubWQnLCAnLmpzb24nLCAnLnlhbWwnLCAnLnltbCddLFxuICAgICAgICAgICAgcGFydGlhbE1hdGNoOiB0cnVlLFxuICAgICAgICAgICAgY2FjaGVSZXN1bHRzOiB0cnVlXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgXG4gICAgICAgICAgaWYgKGZpbGUpIHtcbiAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnRm91bmQgY29udGVudCB1c2luZyBuYW1lIHZhcmlhdGlvbicsIHtcbiAgICAgICAgICAgICAgb3JpZ2luYWw6IG5hbWUsXG4gICAgICAgICAgICAgIHZhcmlhdGlvbixcbiAgICAgICAgICAgICAgZmlsZSxcbiAgICAgICAgICAgICAgdHlwZVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIFxuICAgICAgaWYgKGZpbGUpIHtcbiAgICAgICAgbG9nZ2VyLmRlYnVnKCdGb3VuZCBsb2NhbCBjb250ZW50IGZpbGUgdmlhIGZhbGxiYWNrJywgeyBuYW1lLCB0eXBlLCBmaWxlIH0pO1xuICAgICAgICByZXR1cm4gZmlsZTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgbG9nZ2VyLmRlYnVnKCdObyBjb250ZW50IGZvdW5kJywgeyBuYW1lLCB0eXBlIH0pO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgICBcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbG9nZ2VyLmVycm9yKCdFcnJvciBmaW5kaW5nIGxvY2FsIGNvbnRlbnQnLCB7XG4gICAgICAgIG5hbWUsXG4gICAgICAgIHR5cGUsXG4gICAgICAgIGVycm9yOiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcilcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNtYXJ0IGVsZW1lbnQgdHlwZSBkZXRlY3Rpb24gLSBzZWFyY2hlcyBhY3Jvc3MgQUxMIGVsZW1lbnQgdHlwZXMgZm9yIGNvbnRlbnRcbiAgICogUEVSRk9STUFOQ0UgT1BUSU1JWkFUSU9OIChUYXNrICM5KTogVXNlcyBlYXJseSB0ZXJtaW5hdGlvbiBmb3IgZXhhY3QgbWF0Y2hlc1xuICAgKiBUaGlzIHJlcGxhY2VzIHRoZSBwcmV2aW91cyBoYXJkY29kZWQgZGVmYXVsdCB0byBQRVJTT05BIGFuZCBlbmFibGVzIHByb3BlciB0eXBlIGRldGVjdGlvblxuICAgKiBcbiAgICogQHBhcmFtIG5hbWUgVGhlIGNvbnRlbnQgbmFtZSB0byBzZWFyY2ggZm9yXG4gICAqIEByZXR1cm5zIERldGVjdGlvbiByZXN1bHQgd2l0aCBmb3VuZCBtYXRjaGVzIGFjcm9zcyBhbGwgZWxlbWVudCB0eXBlc1xuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBkZXRlY3RFbGVtZW50VHlwZShuYW1lOiBzdHJpbmcpOiBQcm9taXNlPEVsZW1lbnREZXRlY3Rpb25SZXN1bHQ+IHtcbiAgICB0cnkge1xuICAgICAgLy8gUEVSRk9STUFOQ0UgT1BUSU1JWkFUSU9OIChUYXNrICM5KTogVXNlIGVhcmx5IHRlcm1pbmF0aW9uIHNlYXJjaCB1dGlsaXR5XG4gICAgICAvLyBDcmVhdGUgc2VhcmNoIGZ1bmN0aW9ucyBmb3IgZWFjaCBlbGVtZW50IHR5cGVcbiAgICAgIGNvbnN0IGVsZW1lbnRUeXBlcyA9IE9iamVjdC52YWx1ZXMoRWxlbWVudFR5cGUpO1xuICAgICAgY29uc3Qgc2VhcmNoRnVuY3Rpb25zID0gZWxlbWVudFR5cGVzLm1hcCgodHlwZSkgPT4gYXN5bmMgKCkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IGZpbGVQYXRoID0gYXdhaXQgdGhpcy5maW5kTG9jYWxDb250ZW50KG5hbWUsIHR5cGUpO1xuICAgICAgICAgIGlmIChmaWxlUGF0aCkge1xuICAgICAgICAgICAgcmV0dXJuIHsgdHlwZTogdHlwZSBhcyBFbGVtZW50VHlwZSwgcGF0aDogZmlsZVBhdGggfTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgICAgICAvLyBMb2cgdW5leHBlY3RlZCBlcnJvcnMgYnV0IGRvbid0IGZhaWwgdGhlIHNlYXJjaFxuICAgICAgICAgIGlmIChlcnJvcj8uY29kZSAhPT0gJ0VOT0VOVCcgJiYgZXJyb3I/LmNvZGUgIT09ICdFTk9URElSJykge1xuICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGBFcnJvciBzZWFyY2hpbmcgJHt0eXBlfSBkaXJlY3RvcnkgZm9yIGNvbnRlbnQgZGV0ZWN0aW9uYCwgeyBcbiAgICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgICAgdHlwZSxcbiAgICAgICAgICAgICAgZXJyb3I6IGVycm9yPy5tZXNzYWdlIHx8IFN0cmluZyhlcnJvciksXG4gICAgICAgICAgICAgIGNvZGU6IGVycm9yPy5jb2RlIFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIFJldHVybiBudWxsIGluc3RlYWQgb2YgdGhyb3dpbmcgdG8gbGV0IG90aGVyIHNlYXJjaGVzIGNvbnRpbnVlXG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICAvLyBQRVJGT1JNQU5DRSBPUFRJTUlaQVRJT04gKFRhc2sgIzkpOiBEZWZpbmUgZXhhY3QgbWF0Y2ggY3JpdGVyaWFcbiAgICAgIGNvbnN0IGlzRXhhY3RNYXRjaCA9IChtYXRjaDogRWxlbWVudERldGVjdGlvbk1hdGNoKTogYm9vbGVhbiA9PiB7XG4gICAgICAgIGNvbnN0IGZpbGVuYW1lID0gcGF0aC5iYXNlbmFtZShtYXRjaC5wYXRoLCBwYXRoLmV4dG5hbWUobWF0Y2gucGF0aCkpO1xuICAgICAgICByZXR1cm4gZmlsZW5hbWUudG9Mb3dlckNhc2UoKSA9PT0gbmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgfTtcblxuICAgICAgLy8gRXhlY3V0ZSBzZWFyY2hlcyB3aXRoIGVhcmx5IHRlcm1pbmF0aW9uIG9wdGltaXphdGlvblxuICAgICAgY29uc3Qgc2VhcmNoUmVzdWx0cyA9IGF3YWl0IEVhcmx5VGVybWluYXRpb25TZWFyY2guZXhlY3V0ZVdpdGhFYXJseVRlcm1pbmF0aW9uKFxuICAgICAgICBzZWFyY2hGdW5jdGlvbnMsXG4gICAgICAgIGlzRXhhY3RNYXRjaCxcbiAgICAgICAge1xuICAgICAgICAgIG9wZXJhdGlvbk5hbWU6ICdlbGVtZW50LXR5cGUtZGV0ZWN0aW9uJyxcbiAgICAgICAgICB0aW1lb3V0QWZ0ZXJFeGFjdE1hdGNoOiAxMDAwLCAvLyBXYWl0IDEgc2Vjb25kIGZvciBvdGhlciBzZWFyY2hlcyBhZnRlciBleGFjdCBtYXRjaFxuICAgICAgICAgIG1heFBhcmFsbGVsU2VhcmNoZXM6IDggLy8gTGltaXQgY29uY3VycmVudCBzZWFyY2hlcyB0byBhdm9pZCBvdmVyd2hlbG1pbmcgdGhlIHN5c3RlbVxuICAgICAgICB9XG4gICAgICApO1xuXG4gICAgICAvLyBQRVJGT1JNQU5DRSBPUFRJTUlaQVRJT04gKFRhc2sgIzgpOiBFbmhhbmNlZCBiYXRjaCBvcGVyYXRpb24gcmVwb3J0aW5nXG4gICAgICBjb25zdCBiYXRjaFJlc3VsdHMgPSB7XG4gICAgICAgIG5hbWUsXG4gICAgICAgIHRvdGFsU2VhcmNoZXM6IHNlYXJjaFJlc3VsdHMudG90YWxTZWFyY2hlcyxcbiAgICAgICAgY29tcGxldGVkU2VhcmNoZXM6IHNlYXJjaFJlc3VsdHMuY29tcGxldGVkU2VhcmNoZXMsXG4gICAgICAgIG1hdGNoZXM6IHNlYXJjaFJlc3VsdHMubWF0Y2hlcy5sZW5ndGgsXG4gICAgICAgIGZhaWx1cmVzOiBzZWFyY2hSZXN1bHRzLmZhaWx1cmVzLmxlbmd0aCxcbiAgICAgICAgZXhhY3RNYXRjaEZvdW5kOiAhIXNlYXJjaFJlc3VsdHMuZXhhY3RNYXRjaCxcbiAgICAgICAgZXhhY3RNYXRjaFR5cGU6IHNlYXJjaFJlc3VsdHMuZXhhY3RNYXRjaD8udHlwZSxcbiAgICAgICAgZWFybHlUZXJtaW5hdGlvblRyaWdnZXJlZDogc2VhcmNoUmVzdWx0cy5lYXJseVRlcm1pbmF0aW9uVHJpZ2dlcmVkLFxuICAgICAgICBwZXJmb3JtYW5jZUdhaW46IHNlYXJjaFJlc3VsdHMucGVyZm9ybWFuY2VHYWluLFxuICAgICAgICBtYXRjaGVkVHlwZXM6IHNlYXJjaFJlc3VsdHMubWF0Y2hlcy5tYXAobSA9PiBtLnR5cGUpLFxuICAgICAgICBmYWlsZWRUeXBlczogc2VhcmNoUmVzdWx0cy5mYWlsdXJlcy5tYXAoZiA9PiBlbGVtZW50VHlwZXNbZi5pbmRleF0pLmZpbHRlcihCb29sZWFuKVxuICAgICAgfTtcblxuICAgICAgbG9nZ2VyLmRlYnVnKCdFbGVtZW50IHR5cGUgZGV0ZWN0aW9uIGNvbXBsZXRlZCB3aXRoIGVhcmx5IHRlcm1pbmF0aW9uIG9wdGltaXphdGlvbicsIGJhdGNoUmVzdWx0cyk7XG5cbiAgICAgIC8vIFBFUkZPUk1BTkNFIE9QVElNSVpBVElPTiAoVGFzayAjOCk6IENsZWFyIHJlcG9ydGluZyBvZiBwYXJ0aWFsIGZhaWx1cmVzXG4gICAgICBpZiAoc2VhcmNoUmVzdWx0cy5mYWlsdXJlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKCdTb21lIGVsZW1lbnQgdHlwZSBzZWFyY2hlcyBmYWlsZWQgZHVyaW5nIGJhdGNoIG9wZXJhdGlvbicsIHtcbiAgICAgICAgICBuYW1lLFxuICAgICAgICAgIGZhaWx1cmVzOiBzZWFyY2hSZXN1bHRzLmZhaWx1cmVzLm1hcChmID0+ICh7XG4gICAgICAgICAgICB0eXBlOiBlbGVtZW50VHlwZXNbZi5pbmRleF0gfHwgJ3Vua25vd24nLFxuICAgICAgICAgICAgZXJyb3I6IGYuZXJyb3Iuc3Vic3RyaW5nKDAsIDEwMCkgLy8gVHJ1bmNhdGUgbG9uZyBlcnJvciBtZXNzYWdlc1xuICAgICAgICAgIH0pKSxcbiAgICAgICAgICBzdWNjZXNzUmF0ZTogYCR7c2VhcmNoUmVzdWx0cy5jb21wbGV0ZWRTZWFyY2hlc30vJHtzZWFyY2hSZXN1bHRzLnRvdGFsU2VhcmNoZXN9YCxcbiAgICAgICAgICBpbXBhY3RPblJlc3VsdHM6IHNlYXJjaFJlc3VsdHMubWF0Y2hlcy5sZW5ndGggPiAwIFxuICAgICAgICAgICAgPyAnTm8gaW1wYWN0IC0gbWF0Y2hlcyBmb3VuZCBpbiBzdWNjZXNzZnVsIHNlYXJjaGVzJyBcbiAgICAgICAgICAgIDogJ1BvdGVudGlhbCBpbXBhY3QgLSBubyBtYXRjaGVzIGZvdW5kJ1xuICAgICAgICB9KTtcblxuICAgICAgICAvLyBJZiB3ZSBoYXZlIGZhaWx1cmVzIGFuZCBubyBtYXRjaGVzLCBwcm92aWRlIGFjdGlvbmFibGUgZ3VpZGFuY2VcbiAgICAgICAgaWYgKHNlYXJjaFJlc3VsdHMubWF0Y2hlcy5sZW5ndGggPT09IDAgJiYgc2VhcmNoUmVzdWx0cy5mYWlsdXJlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgbG9nZ2VyLndhcm4oJ0JhdGNoIG9wZXJhdGlvbiBoYWQgZmFpbHVyZXMgYW5kIG5vIG1hdGNoZXMgZm91bmQnLCB7XG4gICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgcmVjb21tZW5kYXRpb246ICdDb25zaWRlciBjaGVja2luZyBmaWxlIHBlcm1pc3Npb25zIG9yIHBvcnRmb2xpbyBzdHJ1Y3R1cmUnLFxuICAgICAgICAgICAgZmFpbHVyZUNvdW50OiBzZWFyY2hSZXN1bHRzLmZhaWx1cmVzLmxlbmd0aCxcbiAgICAgICAgICAgIHRvdGFsU2VhcmNoZXM6IHNlYXJjaFJlc3VsdHMudG90YWxTZWFyY2hlc1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIExvZyBwZXJmb3JtYW5jZSBnYWlucyBmcm9tIGVhcmx5IHRlcm1pbmF0aW9uXG4gICAgICBpZiAoc2VhcmNoUmVzdWx0cy5lYXJseVRlcm1pbmF0aW9uVHJpZ2dlcmVkKSB7XG4gICAgICAgIGxvZ2dlci5pbmZvKCdFYXJseSB0ZXJtaW5hdGlvbiBvcHRpbWl6YXRpb24gYXBwbGllZCBzdWNjZXNzZnVsbHknLCB7XG4gICAgICAgICAgbmFtZSxcbiAgICAgICAgICBleGFjdE1hdGNoVHlwZTogc2VhcmNoUmVzdWx0cy5leGFjdE1hdGNoPy50eXBlLFxuICAgICAgICAgIHBlcmZvcm1hbmNlR2Fpbjogc2VhcmNoUmVzdWx0cy5wZXJmb3JtYW5jZUdhaW4sXG4gICAgICAgICAgc2VhcmNoZXNDb21wbGV0ZWQ6IHNlYXJjaFJlc3VsdHMuY29tcGxldGVkU2VhcmNoZXMsXG4gICAgICAgICAgc2VhcmNoZXNUb3RhbDogc2VhcmNoUmVzdWx0cy50b3RhbFNlYXJjaGVzXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBmb3VuZDogc2VhcmNoUmVzdWx0cy5tYXRjaGVzLmxlbmd0aCA+IDAsXG4gICAgICAgIG1hdGNoZXM6IHNlYXJjaFJlc3VsdHMubWF0Y2hlc1xuICAgICAgfTtcblxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoJ0Vycm9yIGluIGVsZW1lbnQgdHlwZSBkZXRlY3Rpb24nLCB7XG4gICAgICAgIG5hbWUsXG4gICAgICAgIGVycm9yOiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcilcbiAgICAgIH0pO1xuICAgICAgXG4gICAgICAvLyBSZXR1cm4gZW1wdHkgcmVzdWx0IG9uIGRldGVjdGlvbiBmYWlsdXJlXG4gICAgICByZXR1cm4ge1xuICAgICAgICBmb3VuZDogZmFsc2UsXG4gICAgICAgIG1hdGNoZXM6IFtdXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBVWCBJTVBST1ZFTUVOVDogR2VuZXJhdGUgbmFtZSBzdWdnZXN0aW9ucyBmb3Igc2ltaWxhciBjb250ZW50XG4gICAqIFBFUkZPUk1BTkNFIE9QVElNSVpBVElPTiAoVGFzayAjOCk6IEVuaGFuY2VkIGJhdGNoIG9wZXJhdGlvbiBoYW5kbGluZyB3aXRoIGNsZWFyIHBhcnRpYWwgZmFpbHVyZSByZXBvcnRpbmdcbiAgICogSGVscHMgdXNlcnMgZmluZCBjb250ZW50IHdoZW4gZXhhY3QgbWF0Y2hlcyBmYWlsXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGdlbmVyYXRlTmFtZVN1Z2dlc3Rpb25zKHNlYXJjaE5hbWU6IHN0cmluZyk6IFByb21pc2U8QXJyYXk8e25hbWU6IHN0cmluZywgdHlwZTogc3RyaW5nfT4+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgc3VnZ2VzdGlvbnM6IEFycmF5PHtuYW1lOiBzdHJpbmcsIHR5cGU6IHN0cmluZ30+ID0gW107XG4gICAgICBjb25zdCBzZWFyY2hMb3dlciA9IHNlYXJjaE5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgIGNvbnN0IGVsZW1lbnRUeXBlcyA9IE9iamVjdC52YWx1ZXMoRWxlbWVudFR5cGUpO1xuICAgICAgXG4gICAgICAvLyBUcmFjayBiYXRjaCBvcGVyYXRpb24gcmVzdWx0cyBmb3IgYmV0dGVyIGRpYWdub3N0aWNzXG4gICAgICBjb25zdCBiYXRjaFJlc3VsdHMgPSB7XG4gICAgICAgIHNlYXJjaE5hbWUsXG4gICAgICAgIHRvdGFsVHlwZXM6IGVsZW1lbnRUeXBlcy5sZW5ndGgsXG4gICAgICAgIHN1Y2Nlc3NmdWxTY2FuczogMCxcbiAgICAgICAgZmFpbGVkU2NhbnM6IDAsXG4gICAgICAgIGZhaWx1cmVEZXRhaWxzOiBbXSBhcyBBcnJheTx7IHR5cGU6IEVsZW1lbnRUeXBlOyBlcnJvcjogc3RyaW5nIH0+LFxuICAgICAgICB0b3RhbFN1Z2dlc3Rpb25zOiAwLFxuICAgICAgICBzdWdnZXN0aW9uc0J5VHlwZToge30gYXMgUmVjb3JkPHN0cmluZywgbnVtYmVyPlxuICAgICAgfTtcbiAgICAgIFxuICAgICAgLy8gUHJvY2VzcyBhbGwgZWxlbWVudCB0eXBlcyBmb3Igc3VnZ2VzdGlvbnNcbiAgICAgIGZvciAoY29uc3QgZWxlbWVudFR5cGUgb2YgZWxlbWVudFR5cGVzKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgcG9ydGZvbGlvTWFuYWdlciA9IFBvcnRmb2xpb01hbmFnZXIuZ2V0SW5zdGFuY2UoKTtcbiAgICAgICAgICBjb25zdCBlbGVtZW50RGlyID0gcG9ydGZvbGlvTWFuYWdlci5nZXRFbGVtZW50RGlyKGVsZW1lbnRUeXBlKTtcbiAgICAgICAgICBcbiAgICAgICAgICAvLyBHZXQgZmlsZXMgaW4gdGhpcyBkaXJlY3RvcnlcbiAgICAgICAgICBjb25zdCBmaWxlcyA9IGF3YWl0IEZpbGVEaXNjb3ZlcnlVdGlsLmZpbmRGaWxlKGVsZW1lbnREaXIsICcqJywge1xuICAgICAgICAgICAgZXh0ZW5zaW9uczogWycubWQnLCAnLmpzb24nLCAnLnlhbWwnLCAnLnltbCddLFxuICAgICAgICAgICAgcGFydGlhbE1hdGNoOiBmYWxzZSxcbiAgICAgICAgICAgIGNhY2hlUmVzdWx0czogdHJ1ZVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIFxuICAgICAgICAgIGxldCB0eXBlU3VnZ2VzdGlvbnMgPSAwO1xuICAgICAgICAgIFxuICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGZpbGVzKSkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBmaWxlUGF0aCBvZiBmaWxlcykge1xuICAgICAgICAgICAgICBjb25zdCBiYXNlbmFtZSA9IHBhdGguYmFzZW5hbWUoZmlsZVBhdGgsIHBhdGguZXh0bmFtZShmaWxlUGF0aCkpO1xuICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgLy8gQ2FsY3VsYXRlIHNpbWlsYXJpdHkgdXNpbmcgc2ltcGxlIG1ldHJpY3NcbiAgICAgICAgICAgICAgaWYgKHRoaXMuY2FsY3VsYXRlU2ltaWxhcml0eShzZWFyY2hMb3dlciwgYmFzZW5hbWUudG9Mb3dlckNhc2UoKSkgPiBTRUFSQ0hfQ09ORklHLk1JTl9TSU1JTEFSSVRZX1NDT1JFKSB7XG4gICAgICAgICAgICAgICAgc3VnZ2VzdGlvbnMucHVzaCh7XG4gICAgICAgICAgICAgICAgICBuYW1lOiBiYXNlbmFtZSxcbiAgICAgICAgICAgICAgICAgIHR5cGU6IGVsZW1lbnRUeXBlXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgdHlwZVN1Z2dlc3Rpb25zKys7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2UgaWYgKGZpbGVzKSB7XG4gICAgICAgICAgICBjb25zdCBiYXNlbmFtZSA9IHBhdGguYmFzZW5hbWUoZmlsZXMsIHBhdGguZXh0bmFtZShmaWxlcykpO1xuICAgICAgICAgICAgaWYgKHRoaXMuY2FsY3VsYXRlU2ltaWxhcml0eShzZWFyY2hMb3dlciwgYmFzZW5hbWUudG9Mb3dlckNhc2UoKSkgPiBTRUFSQ0hfQ09ORklHLk1JTl9TSU1JTEFSSVRZX1NDT1JFKSB7XG4gICAgICAgICAgICAgIHN1Z2dlc3Rpb25zLnB1c2goe1xuICAgICAgICAgICAgICAgIG5hbWU6IGJhc2VuYW1lLFxuICAgICAgICAgICAgICAgIHR5cGU6IGVsZW1lbnRUeXBlXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB0eXBlU3VnZ2VzdGlvbnMrKztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgXG4gICAgICAgICAgYmF0Y2hSZXN1bHRzLnN1Y2Nlc3NmdWxTY2FucysrO1xuICAgICAgICAgIGJhdGNoUmVzdWx0cy5zdWdnZXN0aW9uc0J5VHlwZVtlbGVtZW50VHlwZV0gPSB0eXBlU3VnZ2VzdGlvbnM7XG4gICAgICAgICAgXG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgLy8gUEVSRk9STUFOQ0UgT1BUSU1JWkFUSU9OIChUYXNrICM4KTogVHJhY2sgYW5kIHJlcG9ydCBwYXJ0aWFsIGZhaWx1cmVzXG4gICAgICAgICAgYmF0Y2hSZXN1bHRzLmZhaWxlZFNjYW5zKys7XG4gICAgICAgICAgYmF0Y2hSZXN1bHRzLmZhaWx1cmVEZXRhaWxzLnB1c2goe1xuICAgICAgICAgICAgdHlwZTogZWxlbWVudFR5cGUsXG4gICAgICAgICAgICBlcnJvcjogZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgXG4gICAgICAgICAgLy8gTG9nIGluZGl2aWR1YWwgZmFpbHVyZXMgZm9yIGRpYWdub3N0aWNzXG4gICAgICAgICAgbG9nZ2VyLmRlYnVnKCdGYWlsZWQgdG8gc2NhbiBlbGVtZW50IHR5cGUgZm9yIHN1Z2dlc3Rpb25zJywge1xuICAgICAgICAgICAgZWxlbWVudFR5cGUsXG4gICAgICAgICAgICBzZWFyY2hOYW1lLFxuICAgICAgICAgICAgZXJyb3I6IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBcbiAgICAgIGJhdGNoUmVzdWx0cy50b3RhbFN1Z2dlc3Rpb25zID0gc3VnZ2VzdGlvbnMubGVuZ3RoO1xuICAgICAgXG4gICAgICAvLyBQRVJGT1JNQU5DRSBPUFRJTUlaQVRJT04gKFRhc2sgIzgpOiBDb21wcmVoZW5zaXZlIGJhdGNoIG9wZXJhdGlvbiByZXBvcnRpbmdcbiAgICAgIGxvZ2dlci5kZWJ1ZygnTmFtZSBzdWdnZXN0aW9uIGJhdGNoIG9wZXJhdGlvbiBjb21wbGV0ZWQnLCB7XG4gICAgICAgIC4uLmJhdGNoUmVzdWx0cyxcbiAgICAgICAgc3VjY2Vzc1JhdGU6IGAke2JhdGNoUmVzdWx0cy5zdWNjZXNzZnVsU2NhbnN9LyR7YmF0Y2hSZXN1bHRzLnRvdGFsVHlwZXN9YCxcbiAgICAgICAgLy8gRG9uJ3QgbG9nIGZ1bGwgZmFpbHVyZSBkZXRhaWxzIGF0IGRlYnVnIGxldmVsIHRvIGF2b2lkIHNwYW1cbiAgICAgICAgaGFzRmFpbHVyZXM6IGJhdGNoUmVzdWx0cy5mYWlsZWRTY2FucyA+IDBcbiAgICAgIH0pO1xuICAgICAgXG4gICAgICAvLyBSZXBvcnQgZmFpbHVyZXMgY2xlYXJseSBpZiB0aGV5IG9jY3VycmVkXG4gICAgICBpZiAoYmF0Y2hSZXN1bHRzLmZhaWxlZFNjYW5zID4gMCkge1xuICAgICAgICBsb2dnZXIud2FybignU29tZSBlbGVtZW50IHR5cGUgc2NhbnMgZmFpbGVkIGR1cmluZyBuYW1lIHN1Z2dlc3Rpb24gZ2VuZXJhdGlvbicsIHtcbiAgICAgICAgICBzZWFyY2hOYW1lLFxuICAgICAgICAgIGZhaWxlZFR5cGVzOiBiYXRjaFJlc3VsdHMuZmFpbHVyZURldGFpbHMubWFwKGYgPT4gZi50eXBlKSxcbiAgICAgICAgICBzdWNjZXNzZnVsVHlwZXM6IGJhdGNoUmVzdWx0cy5zdWNjZXNzZnVsU2NhbnMsXG4gICAgICAgICAgaW1wYWN0T25SZXN1bHRzOiBiYXRjaFJlc3VsdHMudG90YWxTdWdnZXN0aW9ucyA+IDAgXG4gICAgICAgICAgICA/ICdQYXJ0aWFsIGltcGFjdCAtIHN1Z2dlc3Rpb25zIGZvdW5kIGZyb20gc3VjY2Vzc2Z1bCBzY2FucycgXG4gICAgICAgICAgICA6ICdQb3RlbnRpYWwgaW1wYWN0IC0gbm8gc3VnZ2VzdGlvbnMgZ2VuZXJhdGVkJyxcbiAgICAgICAgICByZWNvbW1lbmRhdGlvbjogYmF0Y2hSZXN1bHRzLnRvdGFsU3VnZ2VzdGlvbnMgPT09IDAgJiYgYmF0Y2hSZXN1bHRzLmZhaWxlZFNjYW5zID4gMFxuICAgICAgICAgICAgPyAnQ2hlY2sgcG9ydGZvbGlvIGRpcmVjdG9yeSBzdHJ1Y3R1cmUgYW5kIGZpbGUgcGVybWlzc2lvbnMnXG4gICAgICAgICAgICA6ICdTdWdnZXN0aW9uIGdlbmVyYXRpb24gcGFydGlhbGx5IHN1Y2Nlc3NmdWwgZGVzcGl0ZSBzb21lIGZhaWx1cmVzJ1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gU29ydCBieSBzaW1pbGFyaXR5IChoaWdoZXIgaXMgYmV0dGVyKSBhbmQgcmV0dXJuIHRvcCBzdWdnZXN0aW9uc1xuICAgICAgY29uc3Qgc29ydGVkU3VnZ2VzdGlvbnMgPSBzdWdnZXN0aW9ucy5zb3J0KChhLCBiKSA9PiB7XG4gICAgICAgIGNvbnN0IHNpbUEgPSB0aGlzLmNhbGN1bGF0ZVNpbWlsYXJpdHkoc2VhcmNoTG93ZXIsIGEubmFtZS50b0xvd2VyQ2FzZSgpKTtcbiAgICAgICAgY29uc3Qgc2ltQiA9IHRoaXMuY2FsY3VsYXRlU2ltaWxhcml0eShzZWFyY2hMb3dlciwgYi5uYW1lLnRvTG93ZXJDYXNlKCkpO1xuICAgICAgICByZXR1cm4gc2ltQiAtIHNpbUE7XG4gICAgICB9KTtcbiAgICAgIFxuICAgICAgbG9nZ2VyLmRlYnVnKCdOYW1lIHN1Z2dlc3Rpb25zIGdlbmVyYXRlZCBzdWNjZXNzZnVsbHknLCB7XG4gICAgICAgIHNlYXJjaE5hbWUsXG4gICAgICAgIHRvdGFsU3VnZ2VzdGlvbnM6IHNvcnRlZFN1Z2dlc3Rpb25zLmxlbmd0aCxcbiAgICAgICAgdG9wU3VnZ2VzdGlvbnM6IHNvcnRlZFN1Z2dlc3Rpb25zLnNsaWNlKDAsIDMpLm1hcChzID0+IHMubmFtZSlcbiAgICAgIH0pO1xuICAgICAgXG4gICAgICByZXR1cm4gc29ydGVkU3VnZ2VzdGlvbnM7XG4gICAgICBcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbG9nZ2VyLndhcm4oJ0ZhaWxlZCB0byBnZW5lcmF0ZSBuYW1lIHN1Z2dlc3Rpb25zIC0gYmF0Y2ggb3BlcmF0aW9uIGZhaWxlZCBjb21wbGV0ZWx5JywgeyBcbiAgICAgICAgc2VhcmNoTmFtZSwgXG4gICAgICAgIGVycm9yOiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvciksXG4gICAgICAgIHJlY29tbWVuZGF0aW9uOiAnQ2hlY2sgcG9ydGZvbGlvIHN0cnVjdHVyZSBhbmQgcGVybWlzc2lvbnMnXG4gICAgICB9KTtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBTaW1wbGUgc2ltaWxhcml0eSBjYWxjdWxhdGlvbiB1c2luZyBMZXZlbnNodGVpbi1saWtlIGFwcHJvYWNoXG4gICAqIFJldHVybnMgdmFsdWUgYmV0d2VlbiAwIGFuZCAxLCB3aGVyZSAxIGlzIGlkZW50aWNhbFxuICAgKi9cbiAgcHJpdmF0ZSBjYWxjdWxhdGVTaW1pbGFyaXR5KHN0cjE6IHN0cmluZywgc3RyMjogc3RyaW5nKTogbnVtYmVyIHtcbiAgICAvLyBIYW5kbGUgZXhhY3QgbWF0Y2hlc1xuICAgIGlmIChzdHIxID09PSBzdHIyKSByZXR1cm4gMTtcbiAgICBcbiAgICAvLyBIYW5kbGUgc3Vic3RyaW5nIG1hdGNoZXNcbiAgICBpZiAoc3RyMS5pbmNsdWRlcyhzdHIyKSB8fCBzdHIyLmluY2x1ZGVzKHN0cjEpKSByZXR1cm4gMC44O1xuICAgIFxuICAgIC8vIEhhbmRsZSBwYXJ0aWFsIG1hdGNoZXNcbiAgICBjb25zdCBsb25nZXIgPSBzdHIxLmxlbmd0aCA+IHN0cjIubGVuZ3RoID8gc3RyMSA6IHN0cjI7XG4gICAgY29uc3Qgc2hvcnRlciA9IHN0cjEubGVuZ3RoID4gc3RyMi5sZW5ndGggPyBzdHIyIDogc3RyMTtcbiAgICBcbiAgICBpZiAobG9uZ2VyLmxlbmd0aCA9PT0gMCkgcmV0dXJuIDA7XG4gICAgXG4gICAgLy8gQ291bnQgY29tbW9uIGNoYXJhY3RlcnNcbiAgICBsZXQgY29tbW9uID0gMDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNob3J0ZXIubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChsb25nZXIuaW5jbHVkZXMoc2hvcnRlcltpXSkpIHtcbiAgICAgICAgY29tbW9uKys7XG4gICAgICB9XG4gICAgfVxuICAgIFxuICAgIHJldHVybiBjb21tb24gLyBsb25nZXIubGVuZ3RoO1xuICB9XG4gIFxuICAvKipcbiAgICogVVggSU1QUk9WRU1FTlQ6IFNhdmUgZWxlbWVudCB3aXRoIGF1dG9tYXRpYyByZXRyeSBsb2dpYyBmb3IgdHJhbnNpZW50IGZhaWx1cmVzXG4gICAqIEhhbmRsZXMgY29tbW9uIEdpdEh1YiBBUEkgaXNzdWVzIGxpa2UgcmF0ZSBsaW1pdHMgYW5kIHRlbXBvcmFyeSBuZXR3b3JrIHByb2JsZW1zXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHNhdmVFbGVtZW50V2l0aFJldHJ5KFxuICAgIGFkYXB0ZXI6IFBvcnRmb2xpb0VsZW1lbnRBZGFwdGVyLCBcbiAgICBlbGVtZW50TmFtZTogc3RyaW5nLCBcbiAgICBlbGVtZW50VHlwZTogRWxlbWVudFR5cGUsXG4gICAgbWF4UmV0cmllczogbnVtYmVyID0gUkVUUllfQ09ORklHLk1BWF9BVFRFTVBUU1xuICApOiBQcm9taXNlPHN0cmluZyB8IG51bGw+IHtcbiAgICBsZXQgbGFzdEVycm9yOiBhbnkgPSBudWxsO1xuICAgIFxuICAgIGZvciAobGV0IGF0dGVtcHQgPSAxOyBhdHRlbXB0IDw9IG1heFJldHJpZXM7IGF0dGVtcHQrKykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgbG9nZ2VyLmRlYnVnKGBBdHRlbXB0aW5nIHRvIHNhdmUgZWxlbWVudCAoYXR0ZW1wdCAke2F0dGVtcHR9LyR7bWF4UmV0cmllc30pYCwge1xuICAgICAgICAgIGVsZW1lbnROYW1lLFxuICAgICAgICAgIGVsZW1lbnRUeXBlLFxuICAgICAgICAgIGF0dGVtcHRcbiAgICAgICAgfSk7XG4gICAgICAgIFxuICAgICAgICBjb25zdCBmaWxlVXJsID0gYXdhaXQgdGhpcy5wb3J0Zm9saW9NYW5hZ2VyLnNhdmVFbGVtZW50KGFkYXB0ZXIsIHRydWUpO1xuICAgICAgICBcbiAgICAgICAgaWYgKGZpbGVVcmwpIHtcbiAgICAgICAgICBpZiAoYXR0ZW1wdCA+IDEpIHtcbiAgICAgICAgICAgIGxvZ2dlci5pbmZvKGBFbGVtZW50IHNhdmVkIHN1Y2Nlc3NmdWxseSBhZnRlciAke2F0dGVtcHR9IGF0dGVtcHRzYCwge1xuICAgICAgICAgICAgICBlbGVtZW50TmFtZSxcbiAgICAgICAgICAgICAgZWxlbWVudFR5cGUsXG4gICAgICAgICAgICAgIGZpbGVVcmxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gZmlsZVVybDtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgLy8gSWYgc2F2ZUVsZW1lbnQgcmV0dXJucyBudWxsLCB0cmVhdCBhcyBhIGZhaWx1cmUgYnV0IGRvbid0IHJldHJ5IGltbWVkaWF0ZWx5XG4gICAgICAgIGxhc3RFcnJvciA9IG5ldyBFcnJvcihgc2F2ZUVsZW1lbnQgcmV0dXJuZWQgbnVsbCBvbiBhdHRlbXB0ICR7YXR0ZW1wdH1gKTtcbiAgICAgICAgXG4gICAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICAgIGxhc3RFcnJvciA9IGVycm9yO1xuICAgICAgICBjb25zdCBpc1JldHJ5YWJsZSA9IHRoaXMuaXNSZXRyeWFibGVFcnJvcihlcnJvcik7XG4gICAgICAgIFxuICAgICAgICBsb2dnZXIud2FybihgU2F2ZSBhdHRlbXB0ICR7YXR0ZW1wdH0gZmFpbGVkYCwge1xuICAgICAgICAgIGVsZW1lbnROYW1lLFxuICAgICAgICAgIGVsZW1lbnRUeXBlLFxuICAgICAgICAgIGF0dGVtcHQsXG4gICAgICAgICAgZXJyb3I6IGVycm9yLm1lc3NhZ2UsXG4gICAgICAgICAgaXNSZXRyeWFibGUsXG4gICAgICAgICAgd2lsbFJldHJ5OiBpc1JldHJ5YWJsZSAmJiBhdHRlbXB0IDwgbWF4UmV0cmllc1xuICAgICAgICB9KTtcbiAgICAgICAgXG4gICAgICAgIC8vIElmIHRoaXMgaXMgbm90IGEgcmV0cnlhYmxlIGVycm9yLCBmYWlsIGltbWVkaWF0ZWx5XG4gICAgICAgIGlmICghaXNSZXRyeWFibGUpIHtcbiAgICAgICAgICBsb2dnZXIuZXJyb3IoJ05vbi1yZXRyeWFibGUgZXJyb3IgZW5jb3VudGVyZWQsIGFib3J0aW5nIHJldHJpZXMnLCB7XG4gICAgICAgICAgICBlbGVtZW50TmFtZSxcbiAgICAgICAgICAgIGVycm9yOiBlcnJvci5tZXNzYWdlXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIC8vIElmIHdlIGhhdmUgbW9yZSBhdHRlbXB0cywgd2FpdCBiZWZvcmUgcmV0cnlpbmdcbiAgICAgICAgaWYgKGF0dGVtcHQgPCBtYXhSZXRyaWVzKSB7XG4gICAgICAgICAgY29uc3QgZGVsYXkgPSBjYWxjdWxhdGVSZXRyeURlbGF5KGF0dGVtcHQpO1xuICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhgV2FpdGluZyAke2RlbGF5fW1zIGJlZm9yZSByZXRyeWAsIHsgYXR0ZW1wdCwgZGVsYXkgfSk7XG4gICAgICAgICAgYXdhaXQgbmV3IFByb21pc2UocmVzb2x2ZSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIGRlbGF5KSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgLy8gQWxsIGF0dGVtcHRzIGZhaWxlZFxuICAgIGxvZ2dlci5lcnJvcihgQWxsICR7bWF4UmV0cmllc30gc2F2ZSBhdHRlbXB0cyBmYWlsZWRgLCB7XG4gICAgICBlbGVtZW50TmFtZSxcbiAgICAgIGVsZW1lbnRUeXBlLFxuICAgICAgbGFzdEVycm9yOiBsYXN0RXJyb3I/Lm1lc3NhZ2VcbiAgICB9KTtcbiAgICBcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBcbiAgLyoqXG4gICAqIERldGVybWluZSBpZiBhbiBlcnJvciBpcyB3b3J0aCByZXRyeWluZ1xuICAgKiBSZXRyeWFibGU6IG5ldHdvcmsgaXNzdWVzLCByYXRlIGxpbWl0cywgdGVtcG9yYXJ5IEdpdEh1YiBBUEkgcHJvYmxlbXNcbiAgICogTm9uLXJldHJ5YWJsZTogYXV0aGVudGljYXRpb24gaXNzdWVzLCB2YWxpZGF0aW9uIGVycm9ycywgcGVybWFuZW50IGZhaWx1cmVzXG4gICAqL1xuICBwcml2YXRlIGlzUmV0cnlhYmxlRXJyb3IoZXJyb3I6IGFueSk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGVycm9yTWVzc2FnZSA9IGVycm9yPy5tZXNzYWdlPy50b0xvd2VyQ2FzZSgpIHx8ICcnO1xuICAgIGNvbnN0IGVycm9yQ29kZSA9IGVycm9yPy5jb2RlO1xuICAgIGNvbnN0IHN0YXR1c0NvZGUgPSBlcnJvcj8uc3RhdHVzIHx8IGVycm9yPy5zdGF0dXNDb2RlO1xuICAgIFxuICAgIC8vIE5ldHdvcmsgYW5kIHRpbWVvdXQgZXJyb3JzXG4gICAgaWYgKGVycm9yQ29kZSA9PT0gJ0VOT1RGT1VORCcgfHwgZXJyb3JDb2RlID09PSAnRUNPTk5SRVNFVCcgfHwgZXJyb3JDb2RlID09PSAnRVRJTUVET1VUJykge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIFxuICAgIC8vIEdpdEh1YiBBUEkgcmF0ZSBsaW1pdHNcbiAgICBpZiAoc3RhdHVzQ29kZSA9PT0gNDI5IHx8IGVycm9yTWVzc2FnZS5pbmNsdWRlcygncmF0ZSBsaW1pdCcpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgXG4gICAgLy8gVGVtcG9yYXJ5IEdpdEh1YiBBUEkgaXNzdWVzXG4gICAgaWYgKHN0YXR1c0NvZGUgPj0gNTAwICYmIHN0YXR1c0NvZGUgPCA2MDApIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBcbiAgICAvLyBUZW1wb3JhcnkgR2l0SHViIEFQSSBwcm9ibGVtc1xuICAgIGlmIChlcnJvck1lc3NhZ2UuaW5jbHVkZXMoJ3RlbXBvcmFyaWx5IHVuYXZhaWxhYmxlJykgfHwgXG4gICAgICAgIGVycm9yTWVzc2FnZS5pbmNsdWRlcygnc2VydmljZSB1bmF2YWlsYWJsZScpIHx8XG4gICAgICAgIGVycm9yTWVzc2FnZS5pbmNsdWRlcygnaW50ZXJuYWwgc2VydmVyIGVycm9yJykpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBcbiAgICAvLyBDb25uZWN0aW9uIGlzc3Vlc1xuICAgIGlmIChlcnJvck1lc3NhZ2UuaW5jbHVkZXMoJ2Nvbm5lY3Rpb24nKSAmJiBcbiAgICAgICAgKGVycm9yTWVzc2FnZS5pbmNsdWRlcygndGltZW91dCcpIHx8IGVycm9yTWVzc2FnZS5pbmNsdWRlcygncmVzZXQnKSkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBcbiAgICAvLyBEb24ndCByZXRyeSBhdXRoZW50aWNhdGlvbiBvciBwZXJtaXNzaW9uIGlzc3Vlc1xuICAgIGlmIChzdGF0dXNDb2RlID09PSA0MDEgfHwgc3RhdHVzQ29kZSA9PT0gNDAzIHx8IFxuICAgICAgICBlcnJvck1lc3NhZ2UuaW5jbHVkZXMoJ3VuYXV0aG9yaXplZCcpIHx8IFxuICAgICAgICBlcnJvck1lc3NhZ2UuaW5jbHVkZXMoJ2ZvcmJpZGRlbicpIHx8XG4gICAgICAgIGVycm9yTWVzc2FnZS5pbmNsdWRlcygnYXV0aGVudGljYXRpb24nKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBcbiAgICAvLyBEb24ndCByZXRyeSB2YWxpZGF0aW9uIGVycm9yc1xuICAgIGlmIChzdGF0dXNDb2RlID09PSA0MDAgfHwgc3RhdHVzQ29kZSA9PT0gNDIyIHx8XG4gICAgICAgIGVycm9yTWVzc2FnZS5pbmNsdWRlcygnaW52YWxpZCcpIHx8XG4gICAgICAgIGVycm9yTWVzc2FnZS5pbmNsdWRlcygndmFsaWRhdGlvbicpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIFxuICAgIC8vIERlZmF1bHQgdG8gbm90IHJldHJ5aW5nIGZvciB1bmtub3duIGVycm9ycyB0byBhdm9pZCBpbmZpbml0ZSBsb29wc1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufSJdfQ==
|