@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
|
@@ -221,7 +221,7 @@ export function createRelationship(targetType, targetName, relationType, strengt
|
|
|
221
221
|
normalizedRelType = normalizedRel.normalizedContent;
|
|
222
222
|
}
|
|
223
223
|
// Validate strength is in range
|
|
224
|
-
if (strength !== undefined && (strength < 0 || strength > 1 || isNaN(strength))) {
|
|
224
|
+
if (strength !== undefined && (strength < 0 || strength > 1 || Number.isNaN(strength))) {
|
|
225
225
|
throw new Error(`Relationship strength must be between 0 and 1, got ${strength}`);
|
|
226
226
|
}
|
|
227
227
|
const element = formatElementId(normalizedType.normalizedContent, normalizedName.normalizedContent);
|
|
@@ -338,4 +338,4 @@ export const RelationshipTypes = {
|
|
|
338
338
|
// Semantic relationships
|
|
339
339
|
SEMANTIC_SIMILARITY: 'semantic_similarity'
|
|
340
340
|
};
|
|
341
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUmVsYXRpb25zaGlwVHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvcG9ydGZvbGlvL3R5cGVzL1JlbGF0aW9uc2hpcFR5cGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXNDRztBQUVILE9BQU8sRUFBRSxjQUFjLEVBQUUsZUFBZSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDM0UsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBQ3BFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLCtDQUErQyxDQUFDO0FBaUdqRjs7Ozs7Ozs7Ozs7Ozs7R0FjRztBQUNILE1BQU0sVUFBVSxvQkFBb0IsQ0FBQyxHQUFpQjtJQUNwRCxPQUFPLFNBQVMsSUFBSSxHQUFHLElBQUksR0FBRyxDQUFDLE9BQU8sS0FBSyxJQUFJO1FBQ3hDLFlBQVksSUFBSSxHQUFHLElBQUksR0FBRyxDQUFDLFVBQVUsS0FBSyxJQUFJO1FBQzlDLFlBQVksSUFBSSxHQUFHLElBQUksR0FBRyxDQUFDLFVBQVUsS0FBSyxJQUFJLENBQUM7QUFDeEQsQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7O0dBYUc7QUFDSCxNQUFNLFVBQVUscUJBQXFCLENBQUMsR0FBaUI7SUFDckQsT0FBTyxTQUFTLElBQUksR0FBRyxJQUFJLEdBQUcsQ0FBQyxPQUFPLEtBQUssS0FBSyxDQUFDO0FBQ25ELENBQUM7QUFFRDs7Ozs7Ozs7Ozs7OztHQWFHO0FBQ0gsTUFBTSxVQUFVLGtCQUFrQixDQUFDLEdBQWlCO0lBQ2xELE9BQU8sQ0FBQyxDQUFDLFNBQVMsSUFBSSxHQUFHLENBQUMsQ0FBQztBQUM3QixDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0E0Qkc7QUFDSCxNQUFNLFVBQVUsaUJBQWlCLENBQUMsR0FBcUI7SUFDckQsSUFBSSxDQUFDLEdBQUcsQ0FB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QixPQUFPLGFBQWEsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxRQUFRLElBQUksQ0FBQyxDQUFDLElBQUksV0FBVyxDQUFDLENBQUM7QUFDekUsQ0FBQztBQUVEOztHQUVHO0FBQ0gsTUFBTSxDQUFDLE1BQU0saUJBQWlCLEdBQUc7SUFDL0IsMkJBQTJCO0lBQzNCLFVBQVUsRUFBRSxZQUFZO0lBRXhCLHNCQUFzQjtJQUN0QixJQUFJLEVBQUUsTUFBTTtJQUNaLE9BQU8sRUFBRSxTQUFTO0lBRWxCLDBCQUEwQjtJQUMxQixPQUFPLEVBQUUsU0FBUztJQUNsQixXQUFXLEVBQUUsYUFBYTtJQUUxQiw0QkFBNEI7SUFDNUIsUUFBUSxFQUFFLFVBQVU7SUFDcEIsWUFBWSxFQUFFLGNBQWM7SUFFNUIsMEJBQTBCO0lBQzFCLFdBQVcsRUFBRSxhQUFhO0lBQzFCLFdBQVcsRUFBRSxhQUFhO0lBRTFCLHlCQUF5QjtJQUN6QixXQUFXLEVBQUUsYUFBYTtJQUMxQixRQUFRLEVBQUUsVUFBVTtJQUVwQix5QkFBeUI7SUFDekIsbUJBQW1CLEVBQUUscUJBQXFCO0NBQ2xDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFR5cGUtc2FmZSByZWxhdGlvbnNoaXAgZGVmaW5pdGlvbnMgZm9yIEVuaGFuY2VkIEluZGV4XG4gKlxuICogVGhpcyBtb2R1bGUgcHJvdmlkZXMgYSBjb21wcmVoZW5zaXZlIHR5cGUgc3lzdGVtIGZvciBtYW5hZ2luZyByZWxhdGlvbnNoaXBzXG4gKiBiZXR3ZWVuIGVsZW1lbnRzIGluIHRoZSBEb2xsaG91c2VNQ1AgRW5oYW5jZWQgSW5kZXguIEl0IGltcGxlbWVudHMgYSB0aHJlZS10aWVyXG4gKiB0eXBlIGhpZXJhcmNoeSB0aGF0IGVuc3VyZXMgYm90aCBjb21waWxlLXRpbWUgYW5kIHJ1bnRpbWUgc2FmZXR5LlxuICpcbiAqICMjIFR5cGUgSGllcmFyY2h5OlxuICogMS4gQmFzZVJlbGF0aW9uc2hpcCAtIFRoZSBzdG9yYWdlIGZvcm1hdCAod2hhdCdzIHBlcnNpc3RlZCB0byBkaXNrKVxuICogMi4gUGFyc2VkUmVsYXRpb25zaGlwIC0gVmFsaWQgcnVudGltZSBmb3JtYXQgd2l0aCBleHRyYWN0ZWQgbWV0YWRhdGFcbiAqIDMuIEludmFsaWRSZWxhdGlvbnNoaXAgLSBFcnJvciBzdGF0ZSB3aXRoIGRldGFpbGVkIGRpYWdub3N0aWNzXG4gKlxuICogIyMgS2V5IEZlYXR1cmVzOlxuICogLSBTdHJvbmdseS10eXBlZCBpbnRlcmZhY2VzIHdpdGggZGlzY3JpbWluYXRlZCB1bmlvbnNcbiAqIC0gUnVudGltZSB0eXBlIGd1YXJkcyBmb3Igc2FmZSB0eXBlIG5hcnJvd2luZ1xuICogLSBEZXRhaWxlZCBlcnJvciBtZXNzYWdlcyB3aXRoIHBvc2l0aW9uIGluZm9ybWF0aW9uXG4gKiAtIEJhdGNoIHByb2Nlc3NpbmcgdXRpbGl0aWVzIHdpdGggcGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9uc1xuICogLSBSZWxhdGlvbnNoaXAgZGVkdXBsaWNhdGlvbiBhbmQgc29ydGluZyBhbGdvcml0aG1zXG4gKlxuICogIyMgVXNhZ2UgRXhhbXBsZTpcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIC8vIFBhcnNlIGEgcmVsYXRpb25zaGlwIGZyb20gc3RvcmFnZVxuICogY29uc3Qgc3RvcmVkOiBCYXNlUmVsYXRpb25zaGlwID0geyBlbGVtZW50OiAncGVyc29uYXM6ZXhwZXJ0LWNvZGVyJyB9O1xuICogY29uc3QgcGFyc2VkID0gcGFyc2VSZWxhdGlvbnNoaXAoc3RvcmVkKTtcbiAqXG4gKiBpZiAoaXNQYXJzZWRSZWxhdGlvbnNoaXAocGFyc2VkKSkge1xuICogICBjb25zb2xlLmxvZyhgVHlwZTogJHtwYXJzZWQudGFyZ2V0VHlwZX0sIE5hbWU6ICR7cGFyc2VkLnRhcmdldE5hbWV9YCk7XG4gKiB9IGVsc2Uge1xuICogICBjb25zb2xlLmVycm9yKGBQYXJzZSBmYWlsZWQ6ICR7cGFyc2VkLnBhcnNlRXJyb3J9YCk7XG4gKiB9XG4gKiBgYGBcbiAqXG4gKiBGSVhFUyBJTVBMRU1FTlRFRCAoSXNzdWUgIzExMDMpOlxuICogLSBUeXBlLXNhZmUgcmVsYXRpb25zaGlwIHZhcmlhbnRzIHdpdGggZGlzY3JpbWluYXRlZCB1bmlvbnNcbiAqIC0gQ29tcGlsZS10aW1lIHZhbGlkYXRpb24gdGhyb3VnaCBUeXBlU2NyaXB0J3MgdHlwZSBzeXN0ZW1cbiAqIC0gUnVudGltZSB0eXBlIGd1YXJkcyBmb3Igc2FmZSB0eXBlIG5hcnJvd2luZ1xuICogLSBTYWZlIHBhcnNpbmcgdXRpbGl0aWVzIHdpdGggZGV0YWlsZWQgZXJyb3IgcmVwb3J0aW5nXG4gKiAtIFNlY3VyaXR5IGF1ZGl0IGxvZ2dpbmcgZm9yIHJlbGF0aW9uc2hpcCBvcGVyYXRpb25zXG4gKi9cblxuaW1wb3J0IHsgcGFyc2VFbGVtZW50SWQsIGZvcm1hdEVsZW1lbnRJZCB9IGZyb20gJy4uLy4uL3V0aWxzL2VsZW1lbnRJZC5qcyc7XG5pbXBvcnQgeyBTZWN1cml0eU1vbml0b3IgfSBmcm9tICcuLi8uLi9zZWN1cml0eS9zZWN1cml0eU1vbml0b3IuanMnO1xuaW1wb3J0IHsgVW5pY29kZVZhbGlkYXRvciB9IGZyb20gJy4uLy4uL3NlY3VyaXR5L3ZhbGlkYXRvcnMvdW5pY29kZVZhbGlkYXRvci5qcyc7XG5cbi8qKlxuICogQmFzZSByZWxhdGlvbnNoaXAgaW50ZXJmYWNlIC0gdGhlIHN0b3JhZ2UgZm9ybWF0XG4gKlxuICogVGhpcyBpcyB0aGUgZnVuZGFtZW50YWwgcmVsYXRpb25zaGlwIHN0cnVjdHVyZSB0aGF0IGdldHMgcGVyc2lzdGVkIHRvIGRpc2suXG4gKiBJdCBjb250YWlucyBvbmx5IHRoZSByYXcgZGF0YSB3aXRob3V0IGFueSBwYXJzZWQgb3IgY29tcHV0ZWQgZmllbGRzLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCByZWxhdGlvbnNoaXA6IEJhc2VSZWxhdGlvbnNoaXAgPSB7XG4gKiAgIGVsZW1lbnQ6ICdza2lsbHM6ZGVidWdnaW5nJyxcbiAqICAgdHlwZTogJ3NpbWlsYXJfdG8nLFxuICogICBzdHJlbmd0aDogMC44NSxcbiAqICAgbWV0YWRhdGE6IHsgcmVhc29uOiAnQm90aCBpbnZvbHZlIGNvZGUgYW5hbHlzaXMnIH1cbiAqIH07XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCYXNlUmVsYXRpb25zaGlwIHtcbiAgLyoqIEVsZW1lbnQgSUQgaW4gZm9ybWF0IFwidHlwZTpuYW1lXCIgKGUuZy4sIFwicGVyc29uYXM6ZXhwZXJ0XCIsIFwic2tpbGxzOnJlZmFjdG9yXCIpICovXG4gIGVsZW1lbnQ6IHN0cmluZztcblxuICAvKiogU2VtYW50aWMgcmVsYXRpb25zaGlwIHR5cGUgZnJvbSBSZWxhdGlvbnNoaXBUeXBlcyBlbnVtIChlLmcuLCAndXNlcycsICdzaW1pbGFyX3RvJywgJ2V4dGVuZHMnKSAqL1xuICB0eXBlPzogc3RyaW5nO1xuXG4gIC8qKiBSZWxhdGlvbnNoaXAgc3RyZW5ndGgvY29uZmlkZW5jZSBzY29yZSBiZXR3ZWVuIDAuMCBhbmQgMS4wIChpbmNsdXNpdmUpICovXG4gIHN0cmVuZ3RoPzogbnVtYmVyO1xuXG4gIC8qKiBFeHRlbnNpYmxlIG1ldGFkYXRhIGZvciBjdXN0b20gcHJvcGVydGllcyAoZS5nLiwgc2ltaWxhcml0eSBzY29yZXMsIHRpbWVzdGFtcHMpICovXG4gIG1ldGFkYXRhPzogUmVjb3JkPHN0cmluZywgYW55Pjtcbn1cblxuLyoqXG4gKiBQYXJzZWQgcmVsYXRpb25zaGlwIHdpdGggZXh0cmFjdGVkIHR5cGUgYW5kIG5hbWUgY29tcG9uZW50c1xuICpcbiAqIFRoaXMgaXMgdGhlIHJ1bnRpbWUgZm9ybWF0IGFmdGVyIHN1Y2Nlc3NmdWxseSBwYXJzaW5nIGEgQmFzZVJlbGF0aW9uc2hpcC5cbiAqIEl0IGluY2x1ZGVzIGFsbCBiYXNlIGZpZWxkcyBwbHVzIGV4dHJhY3RlZCBtZXRhZGF0YSBmb3IgZWZmaWNpZW50IHF1ZXJ5aW5nLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCBwYXJzZWQ6IFBhcnNlZFJlbGF0aW9uc2hpcCA9IHtcbiAqICAgZWxlbWVudDogJ3BlcnNvbmFzOmV4cGVydC1jb2RlcicsXG4gKiAgIHR5cGU6ICdzaW1pbGFyX3RvJyxcbiAqICAgc3RyZW5ndGg6IDAuOSxcbiAqICAgdGFyZ2V0VHlwZTogJ3BlcnNvbmFzJywgIC8vIEV4dHJhY3RlZCBmcm9tIGVsZW1lbnRcbiAqICAgdGFyZ2V0TmFtZTogJ2V4cGVydC1jb2RlcicsICAvLyBFeHRyYWN0ZWQgZnJvbSBlbGVtZW50XG4gKiAgIGlzVmFsaWQ6IHRydWUgIC8vIFR5cGUgZGlzY3JpbWluYXRvclxuICogfTtcbiAqIGBgYFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBhcnNlZFJlbGF0aW9uc2hpcCBleHRlbmRzIEJhc2VSZWxhdGlvbnNoaXAge1xuICAvKiogRXh0cmFjdGVkIGVsZW1lbnQgdHlwZSAoZS5nLiwgJ3BlcnNvbmFzJywgJ3NraWxscycsICd0ZW1wbGF0ZXMnKSAqL1xuICB0YXJnZXRUeXBlOiBzdHJpbmc7XG5cbiAgLyoqIEV4dHJhY3RlZCBlbGVtZW50IG5hbWUgKGUuZy4sICdleHBlcnQtY29kZXInLCAnZGVidWdnaW5nJykgKi9cbiAgdGFyZ2V0TmFtZTogc3RyaW5nO1xuXG4gIC8qKiBUeXBlIGRpc2NyaW1pbmF0b3IgLSBhbHdheXMgdHJ1ZSBmb3IgdmFsaWQgcGFyc2VkIHJlbGF0aW9uc2hpcHMgKi9cbiAgaXNWYWxpZDogdHJ1ZTtcbn1cblxuLyoqXG4gKiBJbnZhbGlkIHJlbGF0aW9uc2hpcCBzdGF0ZSB3aXRoIGRpYWdub3N0aWMgaW5mb3JtYXRpb25cbiAqXG4gKiBUaGlzIHR5cGUgcmVwcmVzZW50cyBhIHJlbGF0aW9uc2hpcCB0aGF0IGZhaWxlZCB0byBwYXJzZSwgcHJlc2VydmluZ1xuICogdGhlIG9yaWdpbmFsIGRhdGEgd2hpbGUgcHJvdmlkaW5nIGRldGFpbGVkIGVycm9yIGNvbnRleHQgZm9yIGRlYnVnZ2luZy5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgaW52YWxpZDogSW52YWxpZFJlbGF0aW9uc2hpcCA9IHtcbiAqICAgZWxlbWVudDogJ21hbGZvcm1lZDplbGVtZW50OmlkJyxcbiAqICAgdGFyZ2V0VHlwZTogbnVsbCxcbiAqICAgdGFyZ2V0TmFtZTogbnVsbCxcbiAqICAgaXNWYWxpZDogZmFsc2UsXG4gKiAgIHBhcnNlRXJyb3I6ICdJbnZhbGlkIGVsZW1lbnQgSUQgZm9ybWF0OiBcIm1hbGZvcm1lZDplbGVtZW50OmlkXCIgLSBtdWx0aXBsZSBzZXBhcmF0b3JzLi4uJ1xuICogfTtcbiAqIGBgYFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEludmFsaWRSZWxhdGlvbnNoaXAgZXh0ZW5kcyBCYXNlUmVsYXRpb25zaGlwIHtcbiAgLyoqIE51bGwgd2hlbiBwYXJzaW5nIGZhaWxzICovXG4gIHRhcmdldFR5cGU6IG51bGw7XG5cbiAgLyoqIE51bGwgd2hlbiBwYXJzaW5nIGZhaWxzICovXG4gIHRhcmdldE5hbWU6IG51bGw7XG5cbiAgLyoqIFR5cGUgZGlzY3JpbWluYXRvciAtIGFsd2F5cyBmYWxzZSBmb3IgaW52YWxpZCByZWxhdGlvbnNoaXBzICovXG4gIGlzVmFsaWQ6IGZhbHNlO1xuXG4gIC8qKiBEZXRhaWxlZCBlcnJvciBtZXNzYWdlIHdpdGggcG9zaXRpb24gaW5mb3JtYXRpb24gYW5kIGV4cGVjdGVkIGZvcm1hdCAqL1xuICBwYXJzZUVycm9yOiBzdHJpbmc7XG59XG5cbi8qKlxuICogVW5pb24gdHlwZSBmb3IgYWxsIHJlbGF0aW9uc2hpcCB2YXJpYW50c1xuICovXG5leHBvcnQgdHlwZSBSZWxhdGlvbnNoaXAgPSBCYXNlUmVsYXRpb25zaGlwIHwgUGFyc2VkUmVsYXRpb25zaGlwIHwgSW52YWxpZFJlbGF0aW9uc2hpcDtcblxuLyoqXG4gKiBUeXBlIGd1YXJkIHRvIGNoZWNrIGlmIGEgcmVsYXRpb25zaGlwIGlzIHN1Y2Nlc3NmdWxseSBwYXJzZWRcbiAqXG4gKiBAcGFyYW0gcmVsIC0gVGhlIHJlbGF0aW9uc2hpcCB0byBjaGVja1xuICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgcmVsYXRpb25zaGlwIGlzIGEgUGFyc2VkUmVsYXRpb25zaGlwIHdpdGggdmFsaWQgZGF0YVxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCByZWwgPSBwYXJzZVJlbGF0aW9uc2hpcChiYXNlUmVsKTtcbiAqIGlmIChpc1BhcnNlZFJlbGF0aW9uc2hpcChyZWwpKSB7XG4gKiAgIC8vIFR5cGVTY3JpcHQga25vd3MgcmVsIGlzIFBhcnNlZFJlbGF0aW9uc2hpcCBoZXJlXG4gKiAgIGNvbnNvbGUubG9nKHJlbC50YXJnZXRUeXBlLCByZWwudGFyZ2V0TmFtZSk7XG4gKiB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzUGFyc2VkUmVsYXRpb25zaGlwKHJlbDogUmVsYXRpb25zaGlwKTogcmVsIGlzIFBhcnNlZFJlbGF0aW9uc2hpcCB7XG4gIHJldHVybiAnaXNWYWxpZCcgaW4gcmVsICYmIHJlbC5pc1ZhbGlkID09PSB0cnVlICYmXG4gICAgICAgICAndGFyZ2V0VHlwZScgaW4gcmVsICYmIHJlbC50YXJnZXRUeXBlICE9PSBudWxsICYmXG4gICAgICAgICAndGFyZ2V0TmFtZScgaW4gcmVsICYmIHJlbC50YXJnZXROYW1lICE9PSBudWxsO1xufVxuXG4vKipcbiAqIFR5cGUgZ3VhcmQgdG8gY2hlY2sgaWYgYSByZWxhdGlvbnNoaXAgZmFpbGVkIHRvIHBhcnNlXG4gKlxuICogQHBhcmFtIHJlbCAtIFRoZSByZWxhdGlvbnNoaXAgdG8gY2hlY2tcbiAqIEByZXR1cm5zIFRydWUgaWYgdGhlIHJlbGF0aW9uc2hpcCBpcyBhbiBJbnZhbGlkUmVsYXRpb25zaGlwIHdpdGggZXJyb3IgZGV0YWlsc1xuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCByZWwgPSBwYXJzZVJlbGF0aW9uc2hpcChiYXNlUmVsKTtcbiAqIGlmIChpc0ludmFsaWRSZWxhdGlvbnNoaXAocmVsKSkge1xuICogICBjb25zb2xlLmVycm9yKGBQYXJzZSBmYWlsZWQ6ICR7cmVsLnBhcnNlRXJyb3J9YCk7XG4gKiB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzSW52YWxpZFJlbGF0aW9uc2hpcChyZWw6IFJlbGF0aW9uc2hpcCk6IHJlbCBpcyBJbnZhbGlkUmVsYXRpb25zaGlwIHtcbiAgcmV0dXJuICdpc1ZhbGlkJyBpbiByZWwgJiYgcmVsLmlzVmFsaWQgPT09IGZhbHNlO1xufVxuXG4vKipcbiAqIFR5cGUgZ3VhcmQgdG8gY2hlY2sgaWYgYSByZWxhdGlvbnNoaXAgaXMgdW5wYXJzZWQgKGJhc2UgdHlwZSBvbmx5KVxuICpcbiAqIEBwYXJhbSByZWwgLSBUaGUgcmVsYXRpb25zaGlwIHRvIGNoZWNrXG4gKiBAcmV0dXJucyBUcnVlIGlmIHRoZSByZWxhdGlvbnNoaXAgaXMgYSBCYXNlUmVsYXRpb25zaGlwIHdpdGhvdXQgcGFyc2VkIGZpZWxkc1xuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBpZiAoaXNCYXNlUmVsYXRpb25zaGlwKHJlbCkpIHtcbiAqICAgLy8gTmVlZCB0byBwYXJzZSB0aGlzIHJlbGF0aW9uc2hpcCBiZWZvcmUgdXNlXG4gKiAgIGNvbnN0IHBhcnNlZCA9IHBhcnNlUmVsYXRpb25zaGlwKHJlbCk7XG4gKiB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzQmFzZVJlbGF0aW9uc2hpcChyZWw6IFJlbGF0aW9uc2hpcCk6IHJlbCBpcyBCYXNlUmVsYXRpb25zaGlwIHtcbiAgcmV0dXJuICEoJ2lzVmFsaWQnIGluIHJlbCk7XG59XG5cbi8qKlxuICogU2FmZWx5IHBhcnNlIGEgYmFzZSByZWxhdGlvbnNoaXAgaW50byBhIHR5cGVkIHJlbGF0aW9uc2hpcCB2YXJpYW50XG4gKlxuICogVGhpcyBmdW5jdGlvbiBhdHRlbXB0cyB0byBwYXJzZSB0aGUgZWxlbWVudCBJRCBhbmQgZXh0cmFjdCB0eXBlL25hbWUgY29tcG9uZW50cy5cbiAqIElmIHBhcnNpbmcgZmFpbHMsIGl0IHJldHVybnMgYW4gSW52YWxpZFJlbGF0aW9uc2hpcCB3aXRoIGRldGFpbGVkIGVycm9yIGNvbnRleHRcbiAqIGluY2x1ZGluZyBwb3NpdGlvbiBpbmZvcm1hdGlvbiBhbmQgd2hhdCB3YXMgZXhwZWN0ZWQuXG4gKlxuICogQHBhcmFtIHJlbCAtIFRoZSBiYXNlIHJlbGF0aW9uc2hpcCB0byBwYXJzZVxuICogQHJldHVybnMgUGFyc2VkUmVsYXRpb25zaGlwIGlmIHN1Y2Nlc3NmdWwsIEludmFsaWRSZWxhdGlvbnNoaXAgd2l0aCBkaWFnbm9zdGljcyBpZiBmYWlsZWRcbiAqXG4gKiBAZXhhbXBsZSBTdWNjZXNzIGNhc2VcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IGJhc2U6IEJhc2VSZWxhdGlvbnNoaXAgPSB7IGVsZW1lbnQ6ICdza2lsbHM6ZGVidWdnaW5nJyB9O1xuICogY29uc3QgcmVzdWx0ID0gcGFyc2VSZWxhdGlvbnNoaXAoYmFzZSk7XG4gKiAvLyByZXN1bHQ6IFBhcnNlZFJlbGF0aW9uc2hpcCB3aXRoIHRhcmdldFR5cGU9J3NraWxscycsIHRhcmdldE5hbWU9J2RlYnVnZ2luZydcbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlIEVycm9yIGNhc2VzIHdpdGggZGV0YWlsZWQgZGlhZ25vc3RpY3NcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIHBhcnNlUmVsYXRpb25zaGlwKHsgZWxlbWVudDogJ25vLXNlcGFyYXRvcicgfSk7XG4gKiAvLyBFcnJvcjogXCJtaXNzaW5nIHNlcGFyYXRvciAnOidcIlxuICpcbiAqIHBhcnNlUmVsYXRpb25zaGlwKHsgZWxlbWVudDogJzptaXNzaW5nLXR5cGUnIH0pO1xuICogLy8gRXJyb3I6IFwibWlzc2luZyB0eXBlIGJlZm9yZSAnOidcIlxuICpcbiAqIHBhcnNlUmVsYXRpb25zaGlwKHsgZWxlbWVudDogJ3RvbzptYW55OmNvbG9ucycgfSk7XG4gKiAvLyBFcnJvcjogXCJtdWx0aXBsZSBzZXBhcmF0b3JzICc6JyBmb3VuZCBhdCBwb3NpdGlvbnMgWzMsIDhdXCJcbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VSZWxhdGlvbnNoaXAocmVsOiBCYXNlUmVsYXRpb25zaGlwKTogUGFyc2VkUmVsYXRpb25zaGlwIHwgSW52YWxpZFJlbGF0aW9uc2hpcCB7XG4gIGlmICghcmVsLmVsZW1lbnQpIHtcbiAgICByZXR1cm4ge1xuICAgICAgLi4ucmVsLFxuICAgICAgdGFyZ2V0VHlwZTogbnVsbCxcbiAgICAgIHRhcmdldE5hbWU6IG51bGwsXG4gICAgICBpc1ZhbGlkOiBmYWxzZSxcbiAgICAgIHBhcnNlRXJyb3I6ICdJbnZhbGlkIGVsZW1lbnQgSUQ6IG1pc3Npbmcgb3IgZW1wdHkgKGV4cGVjdGVkIGZvcm1hdDogXCJ0eXBlOm5hbWVcIiknXG4gICAgfTtcbiAgfVxuXG4gIC8vIEZJWDogRE1DUC1TRUMtMDA0IC0gTm9ybWFsaXplIFVuaWNvZGUgYmVmb3JlIHBhcnNpbmcgdG8gcHJldmVudCBhdHRhY2tzXG4gIGNvbnN0IG5vcm1hbGl6ZWQgPSBVbmljb2RlVmFsaWRhdG9yLm5vcm1hbGl6ZShyZWwuZWxlbWVudCk7XG4gIGlmICghbm9ybWFsaXplZC5pc1ZhbGlkKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnJlbCxcbiAgICAgIHRhcmdldFR5cGU6IG51bGwsXG4gICAgICB0YXJnZXROYW1lOiBudWxsLFxuICAgICAgaXNWYWxpZDogZmFsc2UsXG4gICAgICBwYXJzZUVycm9yOiBgSW52YWxpZCBlbGVtZW50IElEIC0gVW5pY29kZSBzZWN1cml0eSBpc3N1ZTogJHtub3JtYWxpemVkLmRldGVjdGVkSXNzdWVzPy5qb2luKCcsICcpfWBcbiAgICB9O1xuICB9XG5cbiAgY29uc3QgcGFyc2VkID0gcGFyc2VFbGVtZW50SWQobm9ybWFsaXplZC5ub3JtYWxpemVkQ29udGVudCk7XG5cbiAgaWYgKCFwYXJzZWQpIHtcbiAgICAvLyBQcm92aWRlIGRldGFpbGVkIGVycm9yIGNvbnRleHQgYWJvdXQgd2hhdCB3YXMgZm91bmQgKHVzZSBub3JtYWxpemVkIGZvciBzYWZldHkpXG4gICAgY29uc3QgY29sb25JbmRleCA9IG5vcm1hbGl6ZWQubm9ybWFsaXplZENvbnRlbnQuaW5kZXhPZignOicpO1xuICAgIGxldCBlcnJvckRldGFpbDogc3RyaW5nO1xuXG4gICAgaWYgKGNvbG9uSW5kZXggPT09IC0xKSB7XG4gICAgICBlcnJvckRldGFpbCA9IGBJbnZhbGlkIGVsZW1lbnQgSUQgZm9ybWF0OiBcIiR7bm9ybWFsaXplZC5ub3JtYWxpemVkQ29udGVudH1cIiAtIG1pc3Npbmcgc2VwYXJhdG9yICc6JyAoZXhwZWN0ZWQgZm9ybWF0OiBcInR5cGU6bmFtZVwiKWA7XG4gICAgfSBlbHNlIGlmIChjb2xvbkluZGV4ID09PSAwKSB7XG4gICAgICBlcnJvckRldGFpbCA9IGBJbnZhbGlkIGVsZW1lbnQgSUQgZm9ybWF0OiBcIiR7bm9ybWFsaXplZC5ub3JtYWxpemVkQ29udGVudH1cIiAtIG1pc3NpbmcgdHlwZSBiZWZvcmUgJzonIChleHBlY3RlZCBmb3JtYXQ6IFwidHlwZTpuYW1lXCIpYDtcbiAgICB9IGVsc2UgaWYgKGNvbG9uSW5kZXggPT09IG5vcm1hbGl6ZWQubm9ybWFsaXplZENvbnRlbnQubGVuZ3RoIC0gMSkge1xuICAgICAgZXJyb3JEZXRhaWwgPSBgSW52YWxpZCBlbGVtZW50IElEIGZvcm1hdDogXCIke25vcm1hbGl6ZWQubm9ybWFsaXplZENvbnRlbnR9XCIgLSBtaXNzaW5nIG5hbWUgYWZ0ZXIgJzonIChleHBlY3RlZCBmb3JtYXQ6IFwidHlwZTpuYW1lXCIpYDtcbiAgICB9IGVsc2UgaWYgKG5vcm1hbGl6ZWQubm9ybWFsaXplZENvbnRlbnQuc3BsaXQoJzonKS5sZW5ndGggPiAyKSB7XG4gICAgICBjb25zdCBwb3NpdGlvbnMgPSBbXTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbm9ybWFsaXplZC5ub3JtYWxpemVkQ29udGVudC5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAobm9ybWFsaXplZC5ub3JtYWxpemVkQ29udGVudFtpXSA9PT0gJzonKSBwb3NpdGlvbnMucHVzaChpKTtcbiAgICAgIH1cbiAgICAgIGVycm9yRGV0YWlsID0gYEludmFsaWQgZWxlbWVudCBJRCBmb3JtYXQ6IFwiJHtub3JtYWxpemVkLm5vcm1hbGl6ZWRDb250ZW50fVwiIC0gbXVsdGlwbGUgc2VwYXJhdG9ycyAnOicgZm91bmQgYXQgcG9zaXRpb25zIFske3Bvc2l0aW9ucy5qb2luKCcsICcpfV0gKGV4cGVjdGVkIGZvcm1hdDogXCJ0eXBlOm5hbWVcIiB3aXRoIHNpbmdsZSAnOicpYDtcbiAgICB9IGVsc2Uge1xuICAgICAgZXJyb3JEZXRhaWwgPSBgSW52YWxpZCBlbGVtZW50IElEIGZvcm1hdDogXCIke25vcm1hbGl6ZWQubm9ybWFsaXplZENvbnRlbnR9XCIgKGV4cGVjdGVkIGZvcm1hdDogXCJ0eXBlOm5hbWVcIilgO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICAuLi5yZWwsXG4gICAgICB0YXJnZXRUeXBlOiBudWxsLFxuICAgICAgdGFyZ2V0TmFtZTogbnVsbCxcbiAgICAgIGlzVmFsaWQ6IGZhbHNlLFxuICAgICAgcGFyc2VFcnJvcjogZXJyb3JEZXRhaWxcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICAuLi5yZWwsXG4gICAgdGFyZ2V0VHlwZTogcGFyc2VkLnR5cGUsXG4gICAgdGFyZ2V0TmFtZTogcGFyc2VkLm5hbWUsXG4gICAgaXNWYWxpZDogdHJ1ZVxuICB9O1xufVxuXG4vKipcbiAqIEJhdGNoIHBhcnNlIHJlbGF0aW9uc2hpcHMgd2l0aCB0eXBlIHNhZmV0eVxuICogRmlsdGVycyBvdXQgaW52YWxpZCByZWxhdGlvbnNoaXBzIGJ5IGRlZmF1bHRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlUmVsYXRpb25zaGlwcyhcbiAgcmVsYXRpb25zaGlwczogQmFzZVJlbGF0aW9uc2hpcFtdLFxuICBpbmNsdWRlSW52YWxpZDogYm9vbGVhbiA9IGZhbHNlXG4pOiBQYXJzZWRSZWxhdGlvbnNoaXBbXSB8IChQYXJzZWRSZWxhdGlvbnNoaXAgfCBJbnZhbGlkUmVsYXRpb25zaGlwKVtdIHtcbiAgY29uc3QgcGFyc2VkID0gcmVsYXRpb25zaGlwcy5tYXAocGFyc2VSZWxhdGlvbnNoaXApO1xuXG4gIGlmIChpbmNsdWRlSW52YWxpZCkge1xuICAgIHJldHVybiBwYXJzZWQ7XG4gIH1cblxuICAvLyBGaWx0ZXIgdG8gb25seSB2YWxpZCByZWxhdGlvbnNoaXBzXG4gIHJldHVybiBwYXJzZWQuZmlsdGVyKGlzUGFyc2VkUmVsYXRpb25zaGlwKTtcbn1cblxuLyoqXG4gKiBDcmVhdGUgYSBuZXcgcmVsYXRpb25zaGlwIHdpdGggdmFsaWRhdGlvblxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUmVsYXRpb25zaGlwKFxuICB0YXJnZXRUeXBlOiBzdHJpbmcsXG4gIHRhcmdldE5hbWU6IHN0cmluZyxcbiAgcmVsYXRpb25UeXBlPzogc3RyaW5nLFxuICBzdHJlbmd0aD86IG51bWJlcixcbiAgbWV0YWRhdGE/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+XG4pOiBQYXJzZWRSZWxhdGlvbnNoaXAge1xuICAvLyBGSVg6IERNQ1AtU0VDLTAwNCAtIE5vcm1hbGl6ZSBVbmljb2RlIGluIHVzZXIgaW5wdXQgdG8gcHJldmVudCBob21vZ3JhcGggYXR0YWNrc1xuICAvLyBQcmV2aW91c2x5OiBBY2NlcHRpbmcgcmF3IHVzZXIgaW5wdXQgd2l0aG91dCBub3JtYWxpemF0aW9uXG4gIC8vIE5vdzogTm9ybWFsaXppbmcgYWxsIHN0cmluZyBpbnB1dHMgdG8gcHJldmVudCBVbmljb2RlLWJhc2VkIHNlY3VyaXR5IGF0dGFja3NcbiAgY29uc3Qgbm9ybWFsaXplZFR5cGUgPSBVbmljb2RlVmFsaWRhdG9yLm5vcm1hbGl6ZSh0YXJnZXRUeXBlKTtcbiAgaWYgKCFub3JtYWxpemVkVHlwZS5pc1ZhbGlkKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHRhcmdldCB0eXBlIC0gVW5pY29kZSBzZWN1cml0eSBpc3N1ZTogJHtub3JtYWxpemVkVHlwZS5kZXRlY3RlZElzc3Vlcz8uam9pbignLCAnKX1gKTtcbiAgfVxuXG4gIGNvbnN0IG5vcm1hbGl6ZWROYW1lID0gVW5pY29kZVZhbGlkYXRvci5ub3JtYWxpemUodGFyZ2V0TmFtZSk7XG4gIGlmICghbm9ybWFsaXplZE5hbWUuaXNWYWxpZCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCB0YXJnZXQgbmFtZSAtIFVuaWNvZGUgc2VjdXJpdHkgaXNzdWU6ICR7bm9ybWFsaXplZE5hbWUuZGV0ZWN0ZWRJc3N1ZXM/LmpvaW4oJywgJyl9YCk7XG4gIH1cblxuICAvLyBBbHNvIG5vcm1hbGl6ZSByZWxhdGlvbnNoaXAgdHlwZSBpZiBwcm92aWRlZFxuICBsZXQgbm9ybWFsaXplZFJlbFR5cGU6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgaWYgKHJlbGF0aW9uVHlwZSkge1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRSZWwgPSBVbmljb2RlVmFsaWRhdG9yLm5vcm1hbGl6ZShyZWxhdGlvblR5cGUpO1xuICAgIGlmICghbm9ybWFsaXplZFJlbC5pc1ZhbGlkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgcmVsYXRpb25zaGlwIHR5cGUgLSBVbmljb2RlIHNlY3VyaXR5IGlzc3VlOiAke25vcm1hbGl6ZWRSZWwuZGV0ZWN0ZWRJc3N1ZXM/LmpvaW4oJywgJyl9YCk7XG4gICAgfVxuICAgIG5vcm1hbGl6ZWRSZWxUeXBlID0gbm9ybWFsaXplZFJlbC5ub3JtYWxpemVkQ29udGVudDtcbiAgfVxuXG4gIC8vIFZhbGlkYXRlIHN0cmVuZ3RoIGlzIGluIHJhbmdlXG4gIGlmIChzdHJlbmd0aCAhPT0gdW5kZWZpbmVkICYmIChzdHJlbmd0aCA8IDAgfHwgc3RyZW5ndGggPiAxIHx8IGlzTmFOKHN0cmVuZ3RoKSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFJlbGF0aW9uc2hpcCBzdHJlbmd0aCBtdXN0IGJlIGJldHdlZW4gMCBhbmQgMSwgZ290ICR7c3RyZW5ndGh9YCk7XG4gIH1cblxuICBjb25zdCBlbGVtZW50ID0gZm9ybWF0RWxlbWVudElkKG5vcm1hbGl6ZWRUeXBlLm5vcm1hbGl6ZWRDb250ZW50LCBub3JtYWxpemVkTmFtZS5ub3JtYWxpemVkQ29udGVudCk7XG5cbiAgLy8gRklYOiBBZGQgc2VjdXJpdHkgYXVkaXQgbG9nZ2luZyBmb3IgcmVsYXRpb25zaGlwIGNyZWF0aW9uXG4gIC8vIFByZXZpb3VzbHk6IE5vIGxvZ2dpbmcgb2YgcmVsYXRpb25zaGlwIG9wZXJhdGlvbnNcbiAgLy8gTm93OiBMb2cgcmVsYXRpb25zaGlwIGNyZWF0aW9uIGZvciBzZWN1cml0eSBhdWRpdCB0cmFpbFxuICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgdHlwZTogJ0VMRU1FTlRfQ1JFQVRFRCcsXG4gICAgc2V2ZXJpdHk6ICdMT1cnLFxuICAgIHNvdXJjZTogJ1JlbGF0aW9uc2hpcFR5cGVzLmNyZWF0ZVJlbGF0aW9uc2hpcCcsXG4gICAgZGV0YWlsczogYENyZWF0ZWQgcmVsYXRpb25zaGlwIHRvICR7ZWxlbWVudH1gLFxuICAgIG1ldGFkYXRhOiB7XG4gICAgICB0YXJnZXRUeXBlOiBub3JtYWxpemVkVHlwZS5ub3JtYWxpemVkQ29udGVudCxcbiAgICAgIHRhcmdldE5hbWU6IG5vcm1hbGl6ZWROYW1lLm5vcm1hbGl6ZWRDb250ZW50LFxuICAgICAgcmVsYXRpb25UeXBlOiBub3JtYWxpemVkUmVsVHlwZSB8fCAndW5zcGVjaWZpZWQnLFxuICAgICAgc3RyZW5ndGg6IHN0cmVuZ3RoID8/IDEuMFxuICAgIH1cbiAgfSk7XG5cbiAgcmV0dXJuIHtcbiAgICBlbGVtZW50LFxuICAgIHR5cGU6IG5vcm1hbGl6ZWRSZWxUeXBlLFxuICAgIHN0cmVuZ3RoLFxuICAgIG1ldGFkYXRhLFxuICAgIHRhcmdldFR5cGU6IG5vcm1hbGl6ZWRUeXBlLm5vcm1hbGl6ZWRDb250ZW50LFxuICAgIHRhcmdldE5hbWU6IG5vcm1hbGl6ZWROYW1lLm5vcm1hbGl6ZWRDb250ZW50LFxuICAgIGlzVmFsaWQ6IHRydWVcbiAgfTtcbn1cblxuLyoqXG4gKiBWYWxpZGF0ZSBhIHJlbGF0aW9uc2hpcCBoYXMgcmVxdWlyZWQgZmllbGRzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZVJlbGF0aW9uc2hpcChyZWw6IGFueSk6IHJlbCBpcyBCYXNlUmVsYXRpb25zaGlwIHtcbiAgcmV0dXJuICEhKHJlbCAmJlxuICAgICAgICAgICAgdHlwZW9mIHJlbCA9PT0gJ29iamVjdCcgJiZcbiAgICAgICAgICAgICdlbGVtZW50JyBpbiByZWwgJiZcbiAgICAgICAgICAgIHR5cGVvZiByZWwuZWxlbWVudCA9PT0gJ3N0cmluZycgJiZcbiAgICAgICAgICAgIHJlbC5lbGVtZW50Lmxlbmd0aCA+IDApO1xufVxuXG4vKipcbiAqIEdyb3VwIHJlbGF0aW9uc2hpcHMgYnkgdGFyZ2V0IHR5cGUgZm9yIGVmZmljaWVudCBwcm9jZXNzaW5nXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBncm91cFJlbGF0aW9uc2hpcHNCeVR5cGUoXG4gIHJlbGF0aW9uc2hpcHM6IFBhcnNlZFJlbGF0aW9uc2hpcFtdXG4pOiBNYXA8c3RyaW5nLCBQYXJzZWRSZWxhdGlvbnNoaXBbXT4ge1xuICBjb25zdCBncm91cGVkID0gbmV3IE1hcDxzdHJpbmcsIFBhcnNlZFJlbGF0aW9uc2hpcFtdPigpO1xuXG4gIGZvciAoY29uc3QgcmVsIG9mIHJlbGF0aW9uc2hpcHMpIHtcbiAgICBjb25zdCBleGlzdGluZyA9IGdyb3VwZWQuZ2V0KHJlbC50YXJnZXRUeXBlKSB8fCBbXTtcbiAgICBleGlzdGluZy5wdXNoKHJlbCk7XG4gICAgZ3JvdXBlZC5zZXQocmVsLnRhcmdldFR5cGUsIGV4aXN0aW5nKTtcbiAgfVxuXG4gIHJldHVybiBncm91cGVkO1xufVxuXG4vKipcbiAqIEZpbmQgZHVwbGljYXRlIHJlbGF0aW9uc2hpcHMgKHNhbWUgdGFyZ2V0IGVsZW1lbnQpXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaW5kRHVwbGljYXRlUmVsYXRpb25zaGlwcyhcbiAgcmVsYXRpb25zaGlwczogQmFzZVJlbGF0aW9uc2hpcFtdXG4pOiBCYXNlUmVsYXRpb25zaGlwW11bXSB7XG4gIGNvbnN0IGVsZW1lbnRNYXAgPSBuZXcgTWFwPHN0cmluZywgQmFzZVJlbGF0aW9uc2hpcFtdPigpO1xuXG4gIGZvciAoY29uc3QgcmVsIG9mIHJlbGF0aW9uc2hpcHMpIHtcbiAgICBjb25zdCBleGlzdGluZyA9IGVsZW1lbnRNYXAuZ2V0KHJlbC5lbGVtZW50KSB8fCBbXTtcbiAgICBleGlzdGluZy5wdXNoKHJlbCk7XG4gICAgZWxlbWVudE1hcC5zZXQocmVsLmVsZW1lbnQsIGV4aXN0aW5nKTtcbiAgfVxuXG4gIC8vIFJldHVybiBvbmx5IGdyb3VwcyB3aXRoIGR1cGxpY2F0ZXNcbiAgcmV0dXJuIEFycmF5LmZyb20oZWxlbWVudE1hcC52YWx1ZXMoKSkuZmlsdGVyKGdyb3VwID0+IGdyb3VwLmxlbmd0aCA+IDEpO1xufVxuXG4vKipcbiAqIE1lcmdlIGR1cGxpY2F0ZSByZWxhdGlvbnNoaXBzLCBrZWVwaW5nIGhpZ2hlc3Qgc3RyZW5ndGhcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlZHVwbGljYXRlUmVsYXRpb25zaGlwcyhcbiAgcmVsYXRpb25zaGlwczogQmFzZVJlbGF0aW9uc2hpcFtdXG4pOiBCYXNlUmVsYXRpb25zaGlwW10ge1xuICBjb25zdCBlbGVtZW50TWFwID0gbmV3IE1hcDxzdHJpbmcsIEJhc2VSZWxhdGlvbnNoaXA+KCk7XG5cbiAgZm9yIChjb25zdCByZWwgb2YgcmVsYXRpb25zaGlwcykge1xuICAgIGNvbnN0IGV4aXN0aW5nID0gZWxlbWVudE1hcC5nZXQocmVsLmVsZW1lbnQpO1xuXG4gICAgaWYgKCFleGlzdGluZyB8fCAocmVsLnN0cmVuZ3RoIHx8IDApID4gKGV4aXN0aW5nLnN0cmVuZ3RoIHx8IDApKSB7XG4gICAgICBlbGVtZW50TWFwLnNldChyZWwuZWxlbWVudCwgcmVsKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gQXJyYXkuZnJvbShlbGVtZW50TWFwLnZhbHVlcygpKTtcbn1cblxuLyoqXG4gKiBTb3J0IHJlbGF0aW9uc2hpcHMgYnkgc3RyZW5ndGggKGRlc2NlbmRpbmcpXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzb3J0UmVsYXRpb25zaGlwc0J5U3RyZW5ndGgoXG4gIHJlbGF0aW9uc2hpcHM6IEJhc2VSZWxhdGlvbnNoaXBbXVxuKTogQmFzZVJlbGF0aW9uc2hpcFtdIHtcbiAgcmV0dXJuIFsuLi5yZWxhdGlvbnNoaXBzXS5zb3J0KChhLCBiKSA9PiB7XG4gICAgY29uc3Qgc3RyZW5ndGhBID0gYS5zdHJlbmd0aCB8fCAwO1xuICAgIGNvbnN0IHN0cmVuZ3RoQiA9IGIuc3RyZW5ndGggfHwgMDtcbiAgICByZXR1cm4gc3RyZW5ndGhCIC0gc3RyZW5ndGhBO1xuICB9KTtcbn1cblxuLyoqXG4gKiBGaWx0ZXIgcmVsYXRpb25zaGlwcyBieSBtaW5pbXVtIHN0cmVuZ3RoIHRocmVzaG9sZFxuICovXG5leHBvcnQgZnVuY3Rpb24gZmlsdGVyUmVsYXRpb25zaGlwc0J5U3RyZW5ndGgoXG4gIHJlbGF0aW9uc2hpcHM6IEJhc2VSZWxhdGlvbnNoaXBbXSxcbiAgbWluU3RyZW5ndGg6IG51bWJlclxuKTogQmFzZVJlbGF0aW9uc2hpcFtdIHtcbiAgcmV0dXJuIHJlbGF0aW9uc2hpcHMuZmlsdGVyKHJlbCA9PiAocmVsLnN0cmVuZ3RoIHx8IDApID49IG1pblN0cmVuZ3RoKTtcbn1cblxuLyoqXG4gKiBSZWxhdGlvbnNoaXAgdHlwZSBhbGlhc2VzIGZvciBjb21tb24gcGF0dGVybnNcbiAqL1xuZXhwb3J0IGNvbnN0IFJlbGF0aW9uc2hpcFR5cGVzID0ge1xuICAvLyBTaW1pbGFyaXR5IHJlbGF0aW9uc2hpcHNcbiAgU0lNSUxBUl9UTzogJ3NpbWlsYXJfdG8nLFxuXG4gIC8vIFVzYWdlIHJlbGF0aW9uc2hpcHNcbiAgVVNFUzogJ3VzZXMnLFxuICBVU0VEX0JZOiAndXNlZF9ieScsXG5cbiAgLy8gRXh0ZW5zaW9uIHJlbGF0aW9uc2hpcHNcbiAgRVhURU5EUzogJ2V4dGVuZHMnLFxuICBFWFRFTkRFRF9CWTogJ2V4dGVuZGVkX2J5JyxcblxuICAvLyBDb21wb3NpdGlvbiByZWxhdGlvbnNoaXBzXG4gIENPTlRBSU5TOiAnY29udGFpbnMnLFxuICBDT05UQUlORURfQlk6ICdjb250YWluZWRfYnknLFxuXG4gIC8vIERlYnVnZ2luZyByZWxhdGlvbnNoaXBzXG4gIEhFTFBTX0RFQlVHOiAnaGVscHNfZGVidWcnLFxuICBERUJVR0dFRF9CWTogJ2RlYnVnZ2VkX2J5JyxcblxuICAvLyBDb25mbGljdCByZWxhdGlvbnNoaXBzXG4gIENPTlRSQURJQ1RTOiAnY29udHJhZGljdHMnLFxuICBTVVBQT1JUUzogJ3N1cHBvcnRzJyxcblxuICAvLyBTZW1hbnRpYyByZWxhdGlvbnNoaXBzXG4gIFNFTUFOVElDX1NJTUlMQVJJVFk6ICdzZW1hbnRpY19zaW1pbGFyaXR5J1xufSBhcyBjb25zdDtcblxuZXhwb3J0IHR5cGUgUmVsYXRpb25zaGlwVHlwZSA9IHR5cGVvZiBSZWxhdGlvbnNoaXBUeXBlc1trZXlvZiB0eXBlb2YgUmVsYXRpb25zaGlwVHlwZXNdOyJdfQ==
|
|
341
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUmVsYXRpb25zaGlwVHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvcG9ydGZvbGlvL3R5cGVzL1JlbGF0aW9uc2hpcFR5cGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXNDRztBQUVILE9BQU8sRUFBRSxjQUFjLEVBQUUsZUFBZSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDM0UsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBQ3BFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLCtDQUErQyxDQUFDO0FBaUdqRjs7Ozs7Ozs7Ozs7Ozs7R0FjRztBQUNILE1BQU0sVUFBVSxvQkFBb0IsQ0FBQyxHQUFpQjtJQUNwRCxPQUFPLFNBQVMsSUFBSSxHQUFHLElBQUksR0FBRyxDQUFDLE9BQU8sS0FBSyxJQUFJO1FBQ3hDLFlBQVksSUFBSSxHQUFHLElBQUksR0FBRyxDQUFDLFVBQVUsS0FBSyxJQUFJO1FBQzlDLFlBQVksSUFBSSxHQUFHLElBQUksR0FBRyxDQUFDLFVBQVUsS0FBSyxJQUFJLENBQUM7QUFDeEQsQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7O0dBYUc7QUFDSCxNQUFNLFVBQVUscUJBQXFCLENBQUMsR0FBaUI7SUFDckQsT0FBTyxTQUFTLElBQUksR0FBRyxJQUFJLEdBQUcsQ0FBQyxPQUFPLEtBQUssS0FBSyxDQUFDO0FBQ25ELENBQUM7QUFFRDs7Ozs7Ozs7Ozs7OztHQWFHO0FBQ0gsTUFBTSxVQUFVLGtCQUFrQixDQUFDLEdBQWlCO0lBQ2xELE9BQU8sQ0FBQyxDQUFDLFNBQVMsSUFBSSxHQUFHLENBQUMsQ0FBQztBQUM3QixDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0E0Qkc7QUFDSCxNQUFNLFVBQVUsaUJBQWlCLENBQUMsR0FBcUI7SUFDckQsSUFBSSxDQUFDLEdBQUcsQ0FB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V0FBbUI7SUFFbkIsT0FBTyxhQUFhLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsUUFBUSxJQUFJLENBQUMsQ0FBQyxJQUFJLFdBQVcsQ0FBQyxDQUFDO0FBQ3pFLENBQUM7QUFFRDs7R0FFRztBQUNILE1BQU0sQ0FBQyxNQUFNLGlCQUFpQixHQUFHO0lBQy9CLDJCQUEyQjtJQUMzQixVQUFVLEVBQUUsWUFBWTtJQUV4QixzQkFBc0I7SUFDdEIsSUFBSSxFQUFFLE1BQU07SUFDWixPQUFPLEVBQUUsU0FBUztJQUVsQiwwQkFBMEI7SUFDMUIsT0FBTyxFQUFFLFNBQVM7SUFDbEIsV0FBVyxFQUFFLGFBQWE7SUFFMUIsNEJBQTRCO0lBQzVCLFFBQVEsRUFBRSxVQUFVO0lBQ3BCLFlBQVksRUFBRSxjQUFjO0lBRTVCLDBCQUEwQjtJQUMxQixXQUFXLEVBQUUsYUFBYTtJQUMxQixXQUFXLEVBQUUsYUFBYTtJQUUxQix5QkFBeUI7SUFDekIsV0FBVyxFQUFFLGFBQWE7SUFDMUIsUUFBUSxFQUFFLFVBQVU7SUFFcEIseUJBQXlCO0lBQ3pCLG1CQUFtQixFQUFFLHFCQUFxQjtDQUNsQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBUeXBlLXNhZmUgcmVsYXRpb25zaGlwIGRlZmluaXRpb25zIGZvciBFbmhhbmNlZCBJbmRleFxuICpcbiAqIFRoaXMgbW9kdWxlIHByb3ZpZGVzIGEgY29tcHJlaGVuc2l2ZSB0eXBlIHN5c3RlbSBmb3IgbWFuYWdpbmcgcmVsYXRpb25zaGlwc1xuICogYmV0d2VlbiBlbGVtZW50cyBpbiB0aGUgRG9sbGhvdXNlTUNQIEVuaGFuY2VkIEluZGV4LiBJdCBpbXBsZW1lbnRzIGEgdGhyZWUtdGllclxuICogdHlwZSBoaWVyYXJjaHkgdGhhdCBlbnN1cmVzIGJvdGggY29tcGlsZS10aW1lIGFuZCBydW50aW1lIHNhZmV0eS5cbiAqXG4gKiAjIyBUeXBlIEhpZXJhcmNoeTpcbiAqIDEuIEJhc2VSZWxhdGlvbnNoaXAgLSBUaGUgc3RvcmFnZSBmb3JtYXQgKHdoYXQncyBwZXJzaXN0ZWQgdG8gZGlzaylcbiAqIDIuIFBhcnNlZFJlbGF0aW9uc2hpcCAtIFZhbGlkIHJ1bnRpbWUgZm9ybWF0IHdpdGggZXh0cmFjdGVkIG1ldGFkYXRhXG4gKiAzLiBJbnZhbGlkUmVsYXRpb25zaGlwIC0gRXJyb3Igc3RhdGUgd2l0aCBkZXRhaWxlZCBkaWFnbm9zdGljc1xuICpcbiAqICMjIEtleSBGZWF0dXJlczpcbiAqIC0gU3Ryb25nbHktdHlwZWQgaW50ZXJmYWNlcyB3aXRoIGRpc2NyaW1pbmF0ZWQgdW5pb25zXG4gKiAtIFJ1bnRpbWUgdHlwZSBndWFyZHMgZm9yIHNhZmUgdHlwZSBuYXJyb3dpbmdcbiAqIC0gRGV0YWlsZWQgZXJyb3IgbWVzc2FnZXMgd2l0aCBwb3NpdGlvbiBpbmZvcm1hdGlvblxuICogLSBCYXRjaCBwcm9jZXNzaW5nIHV0aWxpdGllcyB3aXRoIHBlcmZvcm1hbmNlIG9wdGltaXphdGlvbnNcbiAqIC0gUmVsYXRpb25zaGlwIGRlZHVwbGljYXRpb24gYW5kIHNvcnRpbmcgYWxnb3JpdGhtc1xuICpcbiAqICMjIFVzYWdlIEV4YW1wbGU6XG4gKiBgYGB0eXBlc2NyaXB0XG4gKiAvLyBQYXJzZSBhIHJlbGF0aW9uc2hpcCBmcm9tIHN0b3JhZ2VcbiAqIGNvbnN0IHN0b3JlZDogQmFzZVJlbGF0aW9uc2hpcCA9IHsgZWxlbWVudDogJ3BlcnNvbmFzOmV4cGVydC1jb2RlcicgfTtcbiAqIGNvbnN0IHBhcnNlZCA9IHBhcnNlUmVsYXRpb25zaGlwKHN0b3JlZCk7XG4gKlxuICogaWYgKGlzUGFyc2VkUmVsYXRpb25zaGlwKHBhcnNlZCkpIHtcbiAqICAgY29uc29sZS5sb2coYFR5cGU6ICR7cGFyc2VkLnRhcmdldFR5cGV9LCBOYW1lOiAke3BhcnNlZC50YXJnZXROYW1lfWApO1xuICogfSBlbHNlIHtcbiAqICAgY29uc29sZS5lcnJvcihgUGFyc2UgZmFpbGVkOiAke3BhcnNlZC5wYXJzZUVycm9yfWApO1xuICogfVxuICogYGBgXG4gKlxuICogRklYRVMgSU1QTEVNRU5URUQgKElzc3VlICMxMTAzKTpcbiAqIC0gVHlwZS1zYWZlIHJlbGF0aW9uc2hpcCB2YXJpYW50cyB3aXRoIGRpc2NyaW1pbmF0ZWQgdW5pb25zXG4gKiAtIENvbXBpbGUtdGltZSB2YWxpZGF0aW9uIHRocm91Z2ggVHlwZVNjcmlwdCdzIHR5cGUgc3lzdGVtXG4gKiAtIFJ1bnRpbWUgdHlwZSBndWFyZHMgZm9yIHNhZmUgdHlwZSBuYXJyb3dpbmdcbiAqIC0gU2FmZSBwYXJzaW5nIHV0aWxpdGllcyB3aXRoIGRldGFpbGVkIGVycm9yIHJlcG9ydGluZ1xuICogLSBTZWN1cml0eSBhdWRpdCBsb2dnaW5nIGZvciByZWxhdGlvbnNoaXAgb3BlcmF0aW9uc1xuICovXG5cbmltcG9ydCB7IHBhcnNlRWxlbWVudElkLCBmb3JtYXRFbGVtZW50SWQgfSBmcm9tICcuLi8uLi91dGlscy9lbGVtZW50SWQuanMnO1xuaW1wb3J0IHsgU2VjdXJpdHlNb25pdG9yIH0gZnJvbSAnLi4vLi4vc2VjdXJpdHkvc2VjdXJpdHlNb25pdG9yLmpzJztcbmltcG9ydCB7IFVuaWNvZGVWYWxpZGF0b3IgfSBmcm9tICcuLi8uLi9zZWN1cml0eS92YWxpZGF0b3JzL3VuaWNvZGVWYWxpZGF0b3IuanMnO1xuXG4vKipcbiAqIEJhc2UgcmVsYXRpb25zaGlwIGludGVyZmFjZSAtIHRoZSBzdG9yYWdlIGZvcm1hdFxuICpcbiAqIFRoaXMgaXMgdGhlIGZ1bmRhbWVudGFsIHJlbGF0aW9uc2hpcCBzdHJ1Y3R1cmUgdGhhdCBnZXRzIHBlcnNpc3RlZCB0byBkaXNrLlxuICogSXQgY29udGFpbnMgb25seSB0aGUgcmF3IGRhdGEgd2l0aG91dCBhbnkgcGFyc2VkIG9yIGNvbXB1dGVkIGZpZWxkcy5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgcmVsYXRpb25zaGlwOiBCYXNlUmVsYXRpb25zaGlwID0ge1xuICogICBlbGVtZW50OiAnc2tpbGxzOmRlYnVnZ2luZycsXG4gKiAgIHR5cGU6ICdzaW1pbGFyX3RvJyxcbiAqICAgc3RyZW5ndGg6IDAuODUsXG4gKiAgIG1ldGFkYXRhOiB7IHJlYXNvbjogJ0JvdGggaW52b2x2ZSBjb2RlIGFuYWx5c2lzJyB9XG4gKiB9O1xuICogYGBgXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmFzZVJlbGF0aW9uc2hpcCB7XG4gIC8qKiBFbGVtZW50IElEIGluIGZvcm1hdCBcInR5cGU6bmFtZVwiIChlLmcuLCBcInBlcnNvbmFzOmV4cGVydFwiLCBcInNraWxsczpyZWZhY3RvclwiKSAqL1xuICBlbGVtZW50OiBzdHJpbmc7XG5cbiAgLyoqIFNlbWFudGljIHJlbGF0aW9uc2hpcCB0eXBlIGZyb20gUmVsYXRpb25zaGlwVHlwZXMgZW51bSAoZS5nLiwgJ3VzZXMnLCAnc2ltaWxhcl90bycsICdleHRlbmRzJykgKi9cbiAgdHlwZT86IHN0cmluZztcblxuICAvKiogUmVsYXRpb25zaGlwIHN0cmVuZ3RoL2NvbmZpZGVuY2Ugc2NvcmUgYmV0d2VlbiAwLjAgYW5kIDEuMCAoaW5jbHVzaXZlKSAqL1xuICBzdHJlbmd0aD86IG51bWJlcjtcblxuICAvKiogRXh0ZW5zaWJsZSBtZXRhZGF0YSBmb3IgY3VzdG9tIHByb3BlcnRpZXMgKGUuZy4sIHNpbWlsYXJpdHkgc2NvcmVzLCB0aW1lc3RhbXBzKSAqL1xuICBtZXRhZGF0YT86IFJlY29yZDxzdHJpbmcsIGFueT47XG59XG5cbi8qKlxuICogUGFyc2VkIHJlbGF0aW9uc2hpcCB3aXRoIGV4dHJhY3RlZCB0eXBlIGFuZCBuYW1lIGNvbXBvbmVudHNcbiAqXG4gKiBUaGlzIGlzIHRoZSBydW50aW1lIGZvcm1hdCBhZnRlciBzdWNjZXNzZnVsbHkgcGFyc2luZyBhIEJhc2VSZWxhdGlvbnNoaXAuXG4gKiBJdCBpbmNsdWRlcyBhbGwgYmFzZSBmaWVsZHMgcGx1cyBleHRyYWN0ZWQgbWV0YWRhdGEgZm9yIGVmZmljaWVudCBxdWVyeWluZy5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgcGFyc2VkOiBQYXJzZWRSZWxhdGlvbnNoaXAgPSB7XG4gKiAgIGVsZW1lbnQ6ICdwZXJzb25hczpleHBlcnQtY29kZXInLFxuICogICB0eXBlOiAnc2ltaWxhcl90bycsXG4gKiAgIHN0cmVuZ3RoOiAwLjksXG4gKiAgIHRhcmdldFR5cGU6ICdwZXJzb25hcycsICAvLyBFeHRyYWN0ZWQgZnJvbSBlbGVtZW50XG4gKiAgIHRhcmdldE5hbWU6ICdleHBlcnQtY29kZXInLCAgLy8gRXh0cmFjdGVkIGZyb20gZWxlbWVudFxuICogICBpc1ZhbGlkOiB0cnVlICAvLyBUeXBlIGRpc2NyaW1pbmF0b3JcbiAqIH07XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXJzZWRSZWxhdGlvbnNoaXAgZXh0ZW5kcyBCYXNlUmVsYXRpb25zaGlwIHtcbiAgLyoqIEV4dHJhY3RlZCBlbGVtZW50IHR5cGUgKGUuZy4sICdwZXJzb25hcycsICdza2lsbHMnLCAndGVtcGxhdGVzJykgKi9cbiAgdGFyZ2V0VHlwZTogc3RyaW5nO1xuXG4gIC8qKiBFeHRyYWN0ZWQgZWxlbWVudCBuYW1lIChlLmcuLCAnZXhwZXJ0LWNvZGVyJywgJ2RlYnVnZ2luZycpICovXG4gIHRhcmdldE5hbWU6IHN0cmluZztcblxuICAvKiogVHlwZSBkaXNjcmltaW5hdG9yIC0gYWx3YXlzIHRydWUgZm9yIHZhbGlkIHBhcnNlZCByZWxhdGlvbnNoaXBzICovXG4gIGlzVmFsaWQ6IHRydWU7XG59XG5cbi8qKlxuICogSW52YWxpZCByZWxhdGlvbnNoaXAgc3RhdGUgd2l0aCBkaWFnbm9zdGljIGluZm9ybWF0aW9uXG4gKlxuICogVGhpcyB0eXBlIHJlcHJlc2VudHMgYSByZWxhdGlvbnNoaXAgdGhhdCBmYWlsZWQgdG8gcGFyc2UsIHByZXNlcnZpbmdcbiAqIHRoZSBvcmlnaW5hbCBkYXRhIHdoaWxlIHByb3ZpZGluZyBkZXRhaWxlZCBlcnJvciBjb250ZXh0IGZvciBkZWJ1Z2dpbmcuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IGludmFsaWQ6IEludmFsaWRSZWxhdGlvbnNoaXAgPSB7XG4gKiAgIGVsZW1lbnQ6ICdtYWxmb3JtZWQ6ZWxlbWVudDppZCcsXG4gKiAgIHRhcmdldFR5cGU6IG51bGwsXG4gKiAgIHRhcmdldE5hbWU6IG51bGwsXG4gKiAgIGlzVmFsaWQ6IGZhbHNlLFxuICogICBwYXJzZUVycm9yOiAnSW52YWxpZCBlbGVtZW50IElEIGZvcm1hdDogXCJtYWxmb3JtZWQ6ZWxlbWVudDppZFwiIC0gbXVsdGlwbGUgc2VwYXJhdG9ycy4uLidcbiAqIH07XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbnZhbGlkUmVsYXRpb25zaGlwIGV4dGVuZHMgQmFzZVJlbGF0aW9uc2hpcCB7XG4gIC8qKiBOdWxsIHdoZW4gcGFyc2luZyBmYWlscyAqL1xuICB0YXJnZXRUeXBlOiBudWxsO1xuXG4gIC8qKiBOdWxsIHdoZW4gcGFyc2luZyBmYWlscyAqL1xuICB0YXJnZXROYW1lOiBudWxsO1xuXG4gIC8qKiBUeXBlIGRpc2NyaW1pbmF0b3IgLSBhbHdheXMgZmFsc2UgZm9yIGludmFsaWQgcmVsYXRpb25zaGlwcyAqL1xuICBpc1ZhbGlkOiBmYWxzZTtcblxuICAvKiogRGV0YWlsZWQgZXJyb3IgbWVzc2FnZSB3aXRoIHBvc2l0aW9uIGluZm9ybWF0aW9uIGFuZCBleHBlY3RlZCBmb3JtYXQgKi9cbiAgcGFyc2VFcnJvcjogc3RyaW5nO1xufVxuXG4vKipcbiAqIFVuaW9uIHR5cGUgZm9yIGFsbCByZWxhdGlvbnNoaXAgdmFyaWFudHNcbiAqL1xuZXhwb3J0IHR5cGUgUmVsYXRpb25zaGlwID0gQmFzZVJlbGF0aW9uc2hpcCB8IFBhcnNlZFJlbGF0aW9uc2hpcCB8IEludmFsaWRSZWxhdGlvbnNoaXA7XG5cbi8qKlxuICogVHlwZSBndWFyZCB0byBjaGVjayBpZiBhIHJlbGF0aW9uc2hpcCBpcyBzdWNjZXNzZnVsbHkgcGFyc2VkXG4gKlxuICogQHBhcmFtIHJlbCAtIFRoZSByZWxhdGlvbnNoaXAgdG8gY2hlY2tcbiAqIEByZXR1cm5zIFRydWUgaWYgdGhlIHJlbGF0aW9uc2hpcCBpcyBhIFBhcnNlZFJlbGF0aW9uc2hpcCB3aXRoIHZhbGlkIGRhdGFcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgcmVsID0gcGFyc2VSZWxhdGlvbnNoaXAoYmFzZVJlbCk7XG4gKiBpZiAoaXNQYXJzZWRSZWxhdGlvbnNoaXAocmVsKSkge1xuICogICAvLyBUeXBlU2NyaXB0IGtub3dzIHJlbCBpcyBQYXJzZWRSZWxhdGlvbnNoaXAgaGVyZVxuICogICBjb25zb2xlLmxvZyhyZWwudGFyZ2V0VHlwZSwgcmVsLnRhcmdldE5hbWUpO1xuICogfVxuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1BhcnNlZFJlbGF0aW9uc2hpcChyZWw6IFJlbGF0aW9uc2hpcCk6IHJlbCBpcyBQYXJzZWRSZWxhdGlvbnNoaXAge1xuICByZXR1cm4gJ2lzVmFsaWQnIGluIHJlbCAmJiByZWwuaXNWYWxpZCA9PT0gdHJ1ZSAmJlxuICAgICAgICAgJ3RhcmdldFR5cGUnIGluIHJlbCAmJiByZWwudGFyZ2V0VHlwZSAhPT0gbnVsbCAmJlxuICAgICAgICAgJ3RhcmdldE5hbWUnIGluIHJlbCAmJiByZWwudGFyZ2V0TmFtZSAhPT0gbnVsbDtcbn1cblxuLyoqXG4gKiBUeXBlIGd1YXJkIHRvIGNoZWNrIGlmIGEgcmVsYXRpb25zaGlwIGZhaWxlZCB0byBwYXJzZVxuICpcbiAqIEBwYXJhbSByZWwgLSBUaGUgcmVsYXRpb25zaGlwIHRvIGNoZWNrXG4gKiBAcmV0dXJucyBUcnVlIGlmIHRoZSByZWxhdGlvbnNoaXAgaXMgYW4gSW52YWxpZFJlbGF0aW9uc2hpcCB3aXRoIGVycm9yIGRldGFpbHNcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgcmVsID0gcGFyc2VSZWxhdGlvbnNoaXAoYmFzZVJlbCk7XG4gKiBpZiAoaXNJbnZhbGlkUmVsYXRpb25zaGlwKHJlbCkpIHtcbiAqICAgY29uc29sZS5lcnJvcihgUGFyc2UgZmFpbGVkOiAke3JlbC5wYXJzZUVycm9yfWApO1xuICogfVxuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0ludmFsaWRSZWxhdGlvbnNoaXAocmVsOiBSZWxhdGlvbnNoaXApOiByZWwgaXMgSW52YWxpZFJlbGF0aW9uc2hpcCB7XG4gIHJldHVybiAnaXNWYWxpZCcgaW4gcmVsICYmIHJlbC5pc1ZhbGlkID09PSBmYWxzZTtcbn1cblxuLyoqXG4gKiBUeXBlIGd1YXJkIHRvIGNoZWNrIGlmIGEgcmVsYXRpb25zaGlwIGlzIHVucGFyc2VkIChiYXNlIHR5cGUgb25seSlcbiAqXG4gKiBAcGFyYW0gcmVsIC0gVGhlIHJlbGF0aW9uc2hpcCB0byBjaGVja1xuICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgcmVsYXRpb25zaGlwIGlzIGEgQmFzZVJlbGF0aW9uc2hpcCB3aXRob3V0IHBhcnNlZCBmaWVsZHNcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogaWYgKGlzQmFzZVJlbGF0aW9uc2hpcChyZWwpKSB7XG4gKiAgIC8vIE5lZWQgdG8gcGFyc2UgdGhpcyByZWxhdGlvbnNoaXAgYmVmb3JlIHVzZVxuICogICBjb25zdCBwYXJzZWQgPSBwYXJzZVJlbGF0aW9uc2hpcChyZWwpO1xuICogfVxuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0Jhc2VSZWxhdGlvbnNoaXAocmVsOiBSZWxhdGlvbnNoaXApOiByZWwgaXMgQmFzZVJlbGF0aW9uc2hpcCB7XG4gIHJldHVybiAhKCdpc1ZhbGlkJyBpbiByZWwpO1xufVxuXG4vKipcbiAqIFNhZmVseSBwYXJzZSBhIGJhc2UgcmVsYXRpb25zaGlwIGludG8gYSB0eXBlZCByZWxhdGlvbnNoaXAgdmFyaWFudFxuICpcbiAqIFRoaXMgZnVuY3Rpb24gYXR0ZW1wdHMgdG8gcGFyc2UgdGhlIGVsZW1lbnQgSUQgYW5kIGV4dHJhY3QgdHlwZS9uYW1lIGNvbXBvbmVudHMuXG4gKiBJZiBwYXJzaW5nIGZhaWxzLCBpdCByZXR1cm5zIGFuIEludmFsaWRSZWxhdGlvbnNoaXAgd2l0aCBkZXRhaWxlZCBlcnJvciBjb250ZXh0XG4gKiBpbmNsdWRpbmcgcG9zaXRpb24gaW5mb3JtYXRpb24gYW5kIHdoYXQgd2FzIGV4cGVjdGVkLlxuICpcbiAqIEBwYXJhbSByZWwgLSBUaGUgYmFzZSByZWxhdGlvbnNoaXAgdG8gcGFyc2VcbiAqIEByZXR1cm5zIFBhcnNlZFJlbGF0aW9uc2hpcCBpZiBzdWNjZXNzZnVsLCBJbnZhbGlkUmVsYXRpb25zaGlwIHdpdGggZGlhZ25vc3RpY3MgaWYgZmFpbGVkXG4gKlxuICogQGV4YW1wbGUgU3VjY2VzcyBjYXNlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCBiYXNlOiBCYXNlUmVsYXRpb25zaGlwID0geyBlbGVtZW50OiAnc2tpbGxzOmRlYnVnZ2luZycgfTtcbiAqIGNvbnN0IHJlc3VsdCA9IHBhcnNlUmVsYXRpb25zaGlwKGJhc2UpO1xuICogLy8gcmVzdWx0OiBQYXJzZWRSZWxhdGlvbnNoaXAgd2l0aCB0YXJnZXRUeXBlPSdza2lsbHMnLCB0YXJnZXROYW1lPSdkZWJ1Z2dpbmcnXG4gKiBgYGBcbiAqXG4gKiBAZXhhbXBsZSBFcnJvciBjYXNlcyB3aXRoIGRldGFpbGVkIGRpYWdub3N0aWNzXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBwYXJzZVJlbGF0aW9uc2hpcCh7IGVsZW1lbnQ6ICduby1zZXBhcmF0b3InIH0pO1xuICogLy8gRXJyb3I6IFwibWlzc2luZyBzZXBhcmF0b3IgJzonXCJcbiAqXG4gKiBwYXJzZVJlbGF0aW9uc2hpcCh7IGVsZW1lbnQ6ICc6bWlzc2luZy10eXBlJyB9KTtcbiAqIC8vIEVycm9yOiBcIm1pc3NpbmcgdHlwZSBiZWZvcmUgJzonXCJcbiAqXG4gKiBwYXJzZVJlbGF0aW9uc2hpcCh7IGVsZW1lbnQ6ICd0b286bWFueTpjb2xvbnMnIH0pO1xuICogLy8gRXJyb3I6IFwibXVsdGlwbGUgc2VwYXJhdG9ycyAnOicgZm91bmQgYXQgcG9zaXRpb25zIFszLCA4XVwiXG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlUmVsYXRpb25zaGlwKHJlbDogQmFzZVJlbGF0aW9uc2hpcCk6IFBhcnNlZFJlbGF0aW9uc2hpcCB8IEludmFsaWRSZWxhdGlvbnNoaXAge1xuICBpZiAoIXJlbC5lbGVtZW50KSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnJlbCxcbiAgICAgIHRhcmdldFR5cGU6IG51bGwsXG4gICAgICB0YXJnZXROYW1lOiBudWxsLFxuICAgICAgaXNWYWxpZDogZmFsc2UsXG4gICAgICBwYXJzZUVycm9yOiAnSW52YWxpZCBlbGVtZW50IElEOiBtaXNzaW5nIG9yIGVtcHR5IChleHBlY3RlZCBmb3JtYXQ6IFwidHlwZTpuYW1lXCIpJ1xuICAgIH07XG4gIH1cblxuICAvLyBGSVg6IERNQ1AtU0VDLTAwNCAtIE5vcm1hbGl6ZSBVbmljb2RlIGJlZm9yZSBwYXJzaW5nIHRvIHByZXZlbnQgYXR0YWNrc1xuICBjb25zdCBub3JtYWxpemVkID0gVW5pY29kZVZhbGlkYXRvci5ub3JtYWxpemUocmVsLmVsZW1lbnQpO1xuICBpZiAoIW5vcm1hbGl6ZWQuaXNWYWxpZCkge1xuICAgIHJldHVybiB7XG4gICAgICAuLi5yZWwsXG4gICAgICB0YXJnZXRUeXBlOiBudWxsLFxuICAgICAgdGFyZ2V0TmFtZTogbnVsbCxcbiAgICAgIGlzVmFsaWQ6IGZhbHNlLFxuICAgICAgcGFyc2VFcnJvcjogYEludmFsaWQgZWxlbWVudCBJRCAtIFVuaWNvZGUgc2VjdXJpdHkgaXNzdWU6ICR7bm9ybWFsaXplZC5kZXRlY3RlZElzc3Vlcz8uam9pbignLCAnKX1gXG4gICAgfTtcbiAgfVxuXG4gIGNvbnN0IHBhcnNlZCA9IHBhcnNlRWxlbWVudElkKG5vcm1hbGl6ZWQubm9ybWFsaXplZENvbnRlbnQpO1xuXG4gIGlmICghcGFyc2VkKSB7XG4gICAgLy8gUHJvdmlkZSBkZXRhaWxlZCBlcnJvciBjb250ZXh0IGFib3V0IHdoYXQgd2FzIGZvdW5kICh1c2Ugbm9ybWFsaXplZCBmb3Igc2FmZXR5KVxuICAgIGNvbnN0IGNvbG9uSW5kZXggPSBub3JtYWxpemVkLm5vcm1hbGl6ZWRDb250ZW50LmluZGV4T2YoJzonKTtcbiAgICBsZXQgZXJyb3JEZXRhaWw6IHN0cmluZztcblxuICAgIGlmIChjb2xvbkluZGV4ID09PSAtMSkge1xuICAgICAgZXJyb3JEZXRhaWwgPSBgSW52YWxpZCBlbGVtZW50IElEIGZvcm1hdDogXCIke25vcm1hbGl6ZWQubm9ybWFsaXplZENvbnRlbnR9XCIgLSBtaXNzaW5nIHNlcGFyYXRvciAnOicgKGV4cGVjdGVkIGZvcm1hdDogXCJ0eXBlOm5hbWVcIilgO1xuICAgIH0gZWxzZSBpZiAoY29sb25JbmRleCA9PT0gMCkge1xuICAgICAgZXJyb3JEZXRhaWwgPSBgSW52YWxpZCBlbGVtZW50IElEIGZvcm1hdDogXCIke25vcm1hbGl6ZWQubm9ybWFsaXplZENvbnRlbnR9XCIgLSBtaXNzaW5nIHR5cGUgYmVmb3JlICc6JyAoZXhwZWN0ZWQgZm9ybWF0OiBcInR5cGU6bmFtZVwiKWA7XG4gICAgfSBlbHNlIGlmIChjb2xvbkluZGV4ID09PSBub3JtYWxpemVkLm5vcm1hbGl6ZWRDb250ZW50Lmxlbmd0aCAtIDEpIHtcbiAgICAgIGVycm9yRGV0YWlsID0gYEludmFsaWQgZWxlbWVudCBJRCBmb3JtYXQ6IFwiJHtub3JtYWxpemVkLm5vcm1hbGl6ZWRDb250ZW50fVwiIC0gbWlzc2luZyBuYW1lIGFmdGVyICc6JyAoZXhwZWN0ZWQgZm9ybWF0OiBcInR5cGU6bmFtZVwiKWA7XG4gICAgfSBlbHNlIGlmIChub3JtYWxpemVkLm5vcm1hbGl6ZWRDb250ZW50LnNwbGl0KCc6JykubGVuZ3RoID4gMikge1xuICAgICAgY29uc3QgcG9zaXRpb25zID0gW107XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5vcm1hbGl6ZWQubm9ybWFsaXplZENvbnRlbnQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKG5vcm1hbGl6ZWQubm9ybWFsaXplZENvbnRlbnRbaV0gPT09ICc6JykgcG9zaXRpb25zLnB1c2goaSk7XG4gICAgICB9XG4gICAgICBlcnJvckRldGFpbCA9IGBJbnZhbGlkIGVsZW1lbnQgSUQgZm9ybWF0OiBcIiR7bm9ybWFsaXplZC5ub3JtYWxpemVkQ29udGVudH1cIiAtIG11bHRpcGxlIHNlcGFyYXRvcnMgJzonIGZvdW5kIGF0IHBvc2l0aW9ucyBbJHtwb3NpdGlvbnMuam9pbignLCAnKX1dIChleHBlY3RlZCBmb3JtYXQ6IFwidHlwZTpuYW1lXCIgd2l0aCBzaW5nbGUgJzonKWA7XG4gICAgfSBlbHNlIHtcbiAgICAgIGVycm9yRGV0YWlsID0gYEludmFsaWQgZWxlbWVudCBJRCBmb3JtYXQ6IFwiJHtub3JtYWxpemVkLm5vcm1hbGl6ZWRDb250ZW50fVwiIChleHBlY3RlZCBmb3JtYXQ6IFwidHlwZTpuYW1lXCIpYDtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgLi4ucmVsLFxuICAgICAgdGFyZ2V0VHlwZTogbnVsbCxcbiAgICAgIHRhcmdldE5hbWU6IG51bGwsXG4gICAgICBpc1ZhbGlkOiBmYWxzZSxcbiAgICAgIHBhcnNlRXJyb3I6IGVycm9yRGV0YWlsXG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgLi4ucmVsLFxuICAgIHRhcmdldFR5cGU6IHBhcnNlZC50eXBlLFxuICAgIHRhcmdldE5hbWU6IHBhcnNlZC5uYW1lLFxuICAgIGlzVmFsaWQ6IHRydWVcbiAgfTtcbn1cblxuLyoqXG4gKiBCYXRjaCBwYXJzZSByZWxhdGlvbnNoaXBzIHdpdGggdHlwZSBzYWZldHlcbiAqIEZpbHRlcnMgb3V0IGludmFsaWQgcmVsYXRpb25zaGlwcyBieSBkZWZhdWx0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVJlbGF0aW9uc2hpcHMoXG4gIHJlbGF0aW9uc2hpcHM6IEJhc2VSZWxhdGlvbnNoaXBbXSxcbiAgaW5jbHVkZUludmFsaWQ6IGJvb2xlYW4gPSBmYWxzZVxuKTogUGFyc2VkUmVsYXRpb25zaGlwW10gfCAoUGFyc2VkUmVsYXRpb25zaGlwIHwgSW52YWxpZFJlbGF0aW9uc2hpcClbXSB7XG4gIGNvbnN0IHBhcnNlZCA9IHJlbGF0aW9uc2hpcHMubWFwKHBhcnNlUmVsYXRpb25zaGlwKTtcblxuICBpZiAoaW5jbHVkZUludmFsaWQpIHtcbiAgICByZXR1cm4gcGFyc2VkO1xuICB9XG5cbiAgLy8gRmlsdGVyIHRvIG9ubHkgdmFsaWQgcmVsYXRpb25zaGlwc1xuICByZXR1cm4gcGFyc2VkLmZpbHRlcihpc1BhcnNlZFJlbGF0aW9uc2hpcCk7XG59XG5cbi8qKlxuICogQ3JlYXRlIGEgbmV3IHJlbGF0aW9uc2hpcCB3aXRoIHZhbGlkYXRpb25cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVJlbGF0aW9uc2hpcChcbiAgdGFyZ2V0VHlwZTogc3RyaW5nLFxuICB0YXJnZXROYW1lOiBzdHJpbmcsXG4gIHJlbGF0aW9uVHlwZT86IHN0cmluZyxcbiAgc3RyZW5ndGg/OiBudW1iZXIsXG4gIG1ldGFkYXRhPzogUmVjb3JkPHN0cmluZywgYW55PlxuKTogUGFyc2VkUmVsYXRpb25zaGlwIHtcbiAgLy8gRklYOiBETUNQLVNFQy0wMDQgLSBOb3JtYWxpemUgVW5pY29kZSBpbiB1c2VyIGlucHV0IHRvIHByZXZlbnQgaG9tb2dyYXBoIGF0dGFja3NcbiAgLy8gUHJldmlvdXNseTogQWNjZXB0aW5nIHJhdyB1c2VyIGlucHV0IHdpdGhvdXQgbm9ybWFsaXphdGlvblxuICAvLyBOb3c6IE5vcm1hbGl6aW5nIGFsbCBzdHJpbmcgaW5wdXRzIHRvIHByZXZlbnQgVW5pY29kZS1iYXNlZCBzZWN1cml0eSBhdHRhY2tzXG4gIGNvbnN0IG5vcm1hbGl6ZWRUeXBlID0gVW5pY29kZVZhbGlkYXRvci5ub3JtYWxpemUodGFyZ2V0VHlwZSk7XG4gIGlmICghbm9ybWFsaXplZFR5cGUuaXNWYWxpZCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCB0YXJnZXQgdHlwZSAtIFVuaWNvZGUgc2VjdXJpdHkgaXNzdWU6ICR7bm9ybWFsaXplZFR5cGUuZGV0ZWN0ZWRJc3N1ZXM/LmpvaW4oJywgJyl9YCk7XG4gIH1cblxuICBjb25zdCBub3JtYWxpemVkTmFtZSA9IFVuaWNvZGVWYWxpZGF0b3Iubm9ybWFsaXplKHRhcmdldE5hbWUpO1xuICBpZiAoIW5vcm1hbGl6ZWROYW1lLmlzVmFsaWQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgdGFyZ2V0IG5hbWUgLSBVbmljb2RlIHNlY3VyaXR5IGlzc3VlOiAke25vcm1hbGl6ZWROYW1lLmRldGVjdGVkSXNzdWVzPy5qb2luKCcsICcpfWApO1xuICB9XG5cbiAgLy8gQWxzbyBub3JtYWxpemUgcmVsYXRpb25zaGlwIHR5cGUgaWYgcHJvdmlkZWRcbiAgbGV0IG5vcm1hbGl6ZWRSZWxUeXBlOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIGlmIChyZWxhdGlvblR5cGUpIHtcbiAgICBjb25zdCBub3JtYWxpemVkUmVsID0gVW5pY29kZVZhbGlkYXRvci5ub3JtYWxpemUocmVsYXRpb25UeXBlKTtcbiAgICBpZiAoIW5vcm1hbGl6ZWRSZWwuaXNWYWxpZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHJlbGF0aW9uc2hpcCB0eXBlIC0gVW5pY29kZSBzZWN1cml0eSBpc3N1ZTogJHtub3JtYWxpemVkUmVsLmRldGVjdGVkSXNzdWVzPy5qb2luKCcsICcpfWApO1xuICAgIH1cbiAgICBub3JtYWxpemVkUmVsVHlwZSA9IG5vcm1hbGl6ZWRSZWwubm9ybWFsaXplZENvbnRlbnQ7XG4gIH1cblxuICAvLyBWYWxpZGF0ZSBzdHJlbmd0aCBpcyBpbiByYW5nZVxuICBpZiAoc3RyZW5ndGggIT09IHVuZGVmaW5lZCAmJiAoc3RyZW5ndGggPCAwIHx8IHN0cmVuZ3RoID4gMSB8fCBOdW1iZXIuaXNOYU4oc3RyZW5ndGgpKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgUmVsYXRpb25zaGlwIHN0cmVuZ3RoIG11c3QgYmUgYmV0d2VlbiAwIGFuZCAxLCBnb3QgJHtzdHJlbmd0aH1gKTtcbiAgfVxuXG4gIGNvbnN0IGVsZW1lbnQgPSBmb3JtYXRFbGVtZW50SWQobm9ybWFsaXplZFR5cGUubm9ybWFsaXplZENvbnRlbnQsIG5vcm1hbGl6ZWROYW1lLm5vcm1hbGl6ZWRDb250ZW50KTtcblxuICAvLyBGSVg6IEFkZCBzZWN1cml0eSBhdWRpdCBsb2dnaW5nIGZvciByZWxhdGlvbnNoaXAgY3JlYXRpb25cbiAgLy8gUHJldmlvdXNseTogTm8gbG9nZ2luZyBvZiByZWxhdGlvbnNoaXAgb3BlcmF0aW9uc1xuICAvLyBOb3c6IExvZyByZWxhdGlvbnNoaXAgY3JlYXRpb24gZm9yIHNlY3VyaXR5IGF1ZGl0IHRyYWlsXG4gIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICB0eXBlOiAnRUxFTUVOVF9DUkVBVEVEJyxcbiAgICBzZXZlcml0eTogJ0xPVycsXG4gICAgc291cmNlOiAnUmVsYXRpb25zaGlwVHlwZXMuY3JlYXRlUmVsYXRpb25zaGlwJyxcbiAgICBkZXRhaWxzOiBgQ3JlYXRlZCByZWxhdGlvbnNoaXAgdG8gJHtlbGVtZW50fWAsXG4gICAgbWV0YWRhdGE6IHtcbiAgICAgIHRhcmdldFR5cGU6IG5vcm1hbGl6ZWRUeXBlLm5vcm1hbGl6ZWRDb250ZW50LFxuICAgICAgdGFyZ2V0TmFtZTogbm9ybWFsaXplZE5hbWUubm9ybWFsaXplZENvbnRlbnQsXG4gICAgICByZWxhdGlvblR5cGU6IG5vcm1hbGl6ZWRSZWxUeXBlIHx8ICd1bnNwZWNpZmllZCcsXG4gICAgICBzdHJlbmd0aDogc3RyZW5ndGggPz8gMS4wXG4gICAgfVxuICB9KTtcblxuICByZXR1cm4ge1xuICAgIGVsZW1lbnQsXG4gICAgdHlwZTogbm9ybWFsaXplZFJlbFR5cGUsXG4gICAgc3RyZW5ndGgsXG4gICAgbWV0YWRhdGEsXG4gICAgdGFyZ2V0VHlwZTogbm9ybWFsaXplZFR5cGUubm9ybWFsaXplZENvbnRlbnQsXG4gICAgdGFyZ2V0TmFtZTogbm9ybWFsaXplZE5hbWUubm9ybWFsaXplZENvbnRlbnQsXG4gICAgaXNWYWxpZDogdHJ1ZVxuICB9O1xufVxuXG4vKipcbiAqIFZhbGlkYXRlIGEgcmVsYXRpb25zaGlwIGhhcyByZXF1aXJlZCBmaWVsZHNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlUmVsYXRpb25zaGlwKHJlbDogYW55KTogcmVsIGlzIEJhc2VSZWxhdGlvbnNoaXAge1xuICByZXR1cm4gISEocmVsICYmXG4gICAgICAgICAgICB0eXBlb2YgcmVsID09PSAnb2JqZWN0JyAmJlxuICAgICAgICAgICAgJ2VsZW1lbnQnIGluIHJlbCAmJlxuICAgICAgICAgICAgdHlwZW9mIHJlbC5lbGVtZW50ID09PSAnc3RyaW5nJyAmJlxuICAgICAgICAgICAgcmVsLmVsZW1lbnQubGVuZ3RoID4gMCk7XG59XG5cbi8qKlxuICogR3JvdXAgcmVsYXRpb25zaGlwcyBieSB0YXJnZXQgdHlwZSBmb3IgZWZmaWNpZW50IHByb2Nlc3NpbmdcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdyb3VwUmVsYXRpb25zaGlwc0J5VHlwZShcbiAgcmVsYXRpb25zaGlwczogUGFyc2VkUmVsYXRpb25zaGlwW11cbik6IE1hcDxzdHJpbmcsIFBhcnNlZFJlbGF0aW9uc2hpcFtdPiB7XG4gIGNvbnN0IGdyb3VwZWQgPSBuZXcgTWFwPHN0cmluZywgUGFyc2VkUmVsYXRpb25zaGlwW10+KCk7XG5cbiAgZm9yIChjb25zdCByZWwgb2YgcmVsYXRpb25zaGlwcykge1xuICAgIGNvbnN0IGV4aXN0aW5nID0gZ3JvdXBlZC5nZXQocmVsLnRhcmdldFR5cGUpIHx8IFtdO1xuICAgIGV4aXN0aW5nLnB1c2gocmVsKTtcbiAgICBncm91cGVkLnNldChyZWwudGFyZ2V0VHlwZSwgZXhpc3RpbmcpO1xuICB9XG5cbiAgcmV0dXJuIGdyb3VwZWQ7XG59XG5cbi8qKlxuICogRmluZCBkdXBsaWNhdGUgcmVsYXRpb25zaGlwcyAoc2FtZSB0YXJnZXQgZWxlbWVudClcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZpbmREdXBsaWNhdGVSZWxhdGlvbnNoaXBzKFxuICByZWxhdGlvbnNoaXBzOiBCYXNlUmVsYXRpb25zaGlwW11cbik6IEJhc2VSZWxhdGlvbnNoaXBbXVtdIHtcbiAgY29uc3QgZWxlbWVudE1hcCA9IG5ldyBNYXA8c3RyaW5nLCBCYXNlUmVsYXRpb25zaGlwW10+KCk7XG5cbiAgZm9yIChjb25zdCByZWwgb2YgcmVsYXRpb25zaGlwcykge1xuICAgIGNvbnN0IGV4aXN0aW5nID0gZWxlbWVudE1hcC5nZXQocmVsLmVsZW1lbnQpIHx8IFtdO1xuICAgIGV4aXN0aW5nLnB1c2gocmVsKTtcbiAgICBlbGVtZW50TWFwLnNldChyZWwuZWxlbWVudCwgZXhpc3RpbmcpO1xuICB9XG5cbiAgLy8gUmV0dXJuIG9ubHkgZ3JvdXBzIHdpdGggZHVwbGljYXRlc1xuICByZXR1cm4gQXJyYXkuZnJvbShlbGVtZW50TWFwLnZhbHVlcygpKS5maWx0ZXIoZ3JvdXAgPT4gZ3JvdXAubGVuZ3RoID4gMSk7XG59XG5cbi8qKlxuICogTWVyZ2UgZHVwbGljYXRlIHJlbGF0aW9uc2hpcHMsIGtlZXBpbmcgaGlnaGVzdCBzdHJlbmd0aFxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVkdXBsaWNhdGVSZWxhdGlvbnNoaXBzKFxuICByZWxhdGlvbnNoaXBzOiBCYXNlUmVsYXRpb25zaGlwW11cbik6IEJhc2VSZWxhdGlvbnNoaXBbXSB7XG4gIGNvbnN0IGVsZW1lbnRNYXAgPSBuZXcgTWFwPHN0cmluZywgQmFzZVJlbGF0aW9uc2hpcD4oKTtcblxuICBmb3IgKGNvbnN0IHJlbCBvZiByZWxhdGlvbnNoaXBzKSB7XG4gICAgY29uc3QgZXhpc3RpbmcgPSBlbGVtZW50TWFwLmdldChyZWwuZWxlbWVudCk7XG5cbiAgICBpZiAoIWV4aXN0aW5nIHx8IChyZWwuc3RyZW5ndGggfHwgMCkgPiAoZXhpc3Rpbmcuc3RyZW5ndGggfHwgMCkpIHtcbiAgICAgIGVsZW1lbnRNYXAuc2V0KHJlbC5lbGVtZW50LCByZWwpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBBcnJheS5mcm9tKGVsZW1lbnRNYXAudmFsdWVzKCkpO1xufVxuXG4vKipcbiAqIFNvcnQgcmVsYXRpb25zaGlwcyBieSBzdHJlbmd0aCAoZGVzY2VuZGluZylcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNvcnRSZWxhdGlvbnNoaXBzQnlTdHJlbmd0aChcbiAgcmVsYXRpb25zaGlwczogQmFzZVJlbGF0aW9uc2hpcFtdXG4pOiBCYXNlUmVsYXRpb25zaGlwW10ge1xuICByZXR1cm4gWy4uLnJlbGF0aW9uc2hpcHNdLnNvcnQoKGEsIGIpID0+IHtcbiAgICBjb25zdCBzdHJlbmd0aEEgPSBhLnN0cmVuZ3RoIHx8IDA7XG4gICAgY29uc3Qgc3RyZW5ndGhCID0gYi5zdHJlbmd0aCB8fCAwO1xuICAgIHJldHVybiBzdHJlbmd0aEIgLSBzdHJlbmd0aEE7XG4gIH0pO1xufVxuXG4vKipcbiAqIEZpbHRlciByZWxhdGlvbnNoaXBzIGJ5IG1pbmltdW0gc3RyZW5ndGggdGhyZXNob2xkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaWx0ZXJSZWxhdGlvbnNoaXBzQnlTdHJlbmd0aChcbiAgcmVsYXRpb25zaGlwczogQmFzZVJlbGF0aW9uc2hpcFtdLFxuICBtaW5TdHJlbmd0aDogbnVtYmVyXG4pOiBCYXNlUmVsYXRpb25zaGlwW10ge1xuICByZXR1cm4gcmVsYXRpb25zaGlwcy5maWx0ZXIocmVsID0+IChyZWwuc3RyZW5ndGggfHwgMCkgPj0gbWluU3RyZW5ndGgpO1xufVxuXG4vKipcbiAqIFJlbGF0aW9uc2hpcCB0eXBlIGFsaWFzZXMgZm9yIGNvbW1vbiBwYXR0ZXJuc1xuICovXG5leHBvcnQgY29uc3QgUmVsYXRpb25zaGlwVHlwZXMgPSB7XG4gIC8vIFNpbWlsYXJpdHkgcmVsYXRpb25zaGlwc1xuICBTSU1JTEFSX1RPOiAnc2ltaWxhcl90bycsXG5cbiAgLy8gVXNhZ2UgcmVsYXRpb25zaGlwc1xuICBVU0VTOiAndXNlcycsXG4gIFVTRURfQlk6ICd1c2VkX2J5JyxcblxuICAvLyBFeHRlbnNpb24gcmVsYXRpb25zaGlwc1xuICBFWFRFTkRTOiAnZXh0ZW5kcycsXG4gIEVYVEVOREVEX0JZOiAnZXh0ZW5kZWRfYnknLFxuXG4gIC8vIENvbXBvc2l0aW9uIHJlbGF0aW9uc2hpcHNcbiAgQ09OVEFJTlM6ICdjb250YWlucycsXG4gIENPTlRBSU5FRF9CWTogJ2NvbnRhaW5lZF9ieScsXG5cbiAgLy8gRGVidWdnaW5nIHJlbGF0aW9uc2hpcHNcbiAgSEVMUFNfREVCVUc6ICdoZWxwc19kZWJ1ZycsXG4gIERFQlVHR0VEX0JZOiAnZGVidWdnZWRfYnknLFxuXG4gIC8vIENvbmZsaWN0IHJlbGF0aW9uc2hpcHNcbiAgQ09OVFJBRElDVFM6ICdjb250cmFkaWN0cycsXG4gIFNVUFBPUlRTOiAnc3VwcG9ydHMnLFxuXG4gIC8vIFNlbWFudGljIHJlbGF0aW9uc2hpcHNcbiAgU0VNQU5USUNfU0lNSUxBUklUWTogJ3NlbWFudGljX3NpbWlsYXJpdHknXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgdHlwZSBSZWxhdGlvbnNoaXBUeXBlID0gdHlwZW9mIFJlbGF0aW9uc2hpcFR5cGVzW2tleW9mIHR5cGVvZiBSZWxhdGlvbnNoaXBUeXBlc107Il19
|
|
@@ -33,6 +33,18 @@ export declare class MCPInputValidator {
|
|
|
33
33
|
* Validate field name for edit operations
|
|
34
34
|
*/
|
|
35
35
|
static validateEditField(field: string): string;
|
|
36
|
+
/**
|
|
37
|
+
* Sanitize text for safe display output
|
|
38
|
+
* Removes core shell metacharacters to prevent command injection in displayed messages
|
|
39
|
+
*
|
|
40
|
+
* Uses a conservative subset of shell metacharacters (;, &, |, `, $, parentheses)
|
|
41
|
+
* that are most critical for command injection prevention while preserving
|
|
42
|
+
* common punctuation like !, ?, * for better user experience in display contexts.
|
|
43
|
+
*
|
|
44
|
+
* @param text - Text to sanitize for display
|
|
45
|
+
* @returns Sanitized text with core shell metacharacters removed
|
|
46
|
+
*/
|
|
47
|
+
static sanitizeForDisplay(text: string): string;
|
|
36
48
|
/**
|
|
37
49
|
* Check if hostname is a private IP address (IPv4 and IPv6)
|
|
38
50
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"InputValidator.d.ts","sourceRoot":"","sources":["../../src/security/InputValidator.ts"],"names":[],"mappings":"AAAA;;GAEG;
|
|
1
|
+
{"version":3,"file":"InputValidator.d.ts","sourceRoot":"","sources":["../../src/security/InputValidator.ts"],"names":[],"mappings":"AAAA;;GAEG;AA6BH;;GAEG;AACH,qBAAa,iBAAiB;IAC5B;;OAEG;IACH,MAAM,CAAC,yBAAyB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM;IAkB5D;;OAEG;IACH,MAAM,CAAC,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;IA4BjD;;OAEG;IACH,MAAM,CAAC,sBAAsB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAoDnD;;OAEG;IACH,MAAM,CAAC,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;IA8D7C;;OAEG;IACH,MAAM,CAAC,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAgB/C;;OAEG;IACH,MAAM,CAAC,oBAAoB,CAAC,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,GAAG,OAAO;IAY7E;;OAEG;IACH,MAAM,CAAC,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;IAkB/C;;;;;;;;;;OAUG;IACH,MAAM,CAAC,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAS/C;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,WAAW;IAgD1B;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,kBAAkB;CA+BlC;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAiBzD;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CAwDxE;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAUzD;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAgBzD;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,MAA2C,GAAG,IAAI,CAS/G;AAED;;;GAGG;AACH,MAAM,WAAW,wBAAwB;IACvC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,MAAM,GAAG,MAAM,GAAG,UAAU,GAAG,OAAO,EACnD,OAAO,GAAE,wBAA6B,GACrC,IAAI,CAmDN;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,GAAE,MAAa,GAAG,MAAM,CAa7E"}
|
|
@@ -12,6 +12,7 @@ import { ValidationErrorCodes } from '../utils/errorCodes.js';
|
|
|
12
12
|
const CONTROL_CHARS_REGEX = /[\u0000-\u001F\u007F]/g; // NOSONAR - Removing control characters for security
|
|
13
13
|
const HTML_DANGEROUS_REGEX = /[<>'"&]/g;
|
|
14
14
|
const SHELL_METACHAR_REGEX = /[;&|`$()!\\~*?{}]/g;
|
|
15
|
+
const SHELL_METACHAR_DISPLAY_REGEX = /[;&|`$()]/g; // Core shell metacharacters for display sanitization
|
|
15
16
|
const RTL_ZEROWIDTH_REGEX = /[\u202E\uFEFF]/g;
|
|
16
17
|
const COLLECTION_PATH_CHAR_REGEX = /[a-zA-Z0-9\/\-_.]/;
|
|
17
18
|
const VALID_COLLECTION_PATH_REGEX = /^[a-zA-Z0-9\/\-_.]*$/;
|
|
@@ -61,10 +62,10 @@ export class MCPInputValidator {
|
|
|
61
62
|
}
|
|
62
63
|
// Sanitize but preserve spaces for search
|
|
63
64
|
const sanitized = query
|
|
64
|
-
.
|
|
65
|
-
.
|
|
66
|
-
.
|
|
67
|
-
.
|
|
65
|
+
.replaceAll(CONTROL_CHARS_REGEX, '') // Remove control characters
|
|
66
|
+
.replaceAll(HTML_DANGEROUS_REGEX, '') // Remove HTML-dangerous characters
|
|
67
|
+
.replaceAll(SHELL_METACHAR_REGEX, '') // Remove shell metacharacters (expanded)
|
|
68
|
+
.replaceAll(RTL_ZEROWIDTH_REGEX, '') // Remove RTL override and zero-width chars
|
|
68
69
|
.trim();
|
|
69
70
|
if (!sanitized) {
|
|
70
71
|
throw ErrorHandler.createError('Search query contains only invalid characters', ErrorCategory.VALIDATION_ERROR, ValidationErrorCodes.INVALID_SEARCH_QUERY);
|
|
@@ -96,7 +97,7 @@ export class MCPInputValidator {
|
|
|
96
97
|
}
|
|
97
98
|
// Prevent path traversal in GitHub paths (comprehensive check)
|
|
98
99
|
const pathLower = path.toLowerCase();
|
|
99
|
-
const encodedPath = decodeURIComponent(path.
|
|
100
|
+
const encodedPath = decodeURIComponent(path.replaceAll(URL_PLUS_DECODE_REGEX, ' ')); // Decode URL encoding
|
|
100
101
|
// Check for various path traversal patterns
|
|
101
102
|
const traversalPatterns = [
|
|
102
103
|
'..', // Basic traversal
|
|
@@ -183,7 +184,7 @@ export class MCPInputValidator {
|
|
|
183
184
|
if (typeof days !== 'number') {
|
|
184
185
|
throw ErrorHandler.createError('Expiry days must be a valid number', ErrorCategory.VALIDATION_ERROR, ValidationErrorCodes.INVALID_NUMBER);
|
|
185
186
|
}
|
|
186
|
-
if (isNaN(days) || !isFinite(days)) {
|
|
187
|
+
if (Number.isNaN(days) || !Number.isFinite(days)) {
|
|
187
188
|
throw ErrorHandler.createError('Expiry days must be a valid number', ErrorCategory.VALIDATION_ERROR, ValidationErrorCodes.INVALID_NUMBER);
|
|
188
189
|
}
|
|
189
190
|
if (days < 1 || days > 365) {
|
|
@@ -220,6 +221,25 @@ export class MCPInputValidator {
|
|
|
220
221
|
}
|
|
221
222
|
return normalizedField;
|
|
222
223
|
}
|
|
224
|
+
/**
|
|
225
|
+
* Sanitize text for safe display output
|
|
226
|
+
* Removes core shell metacharacters to prevent command injection in displayed messages
|
|
227
|
+
*
|
|
228
|
+
* Uses a conservative subset of shell metacharacters (;, &, |, `, $, parentheses)
|
|
229
|
+
* that are most critical for command injection prevention while preserving
|
|
230
|
+
* common punctuation like !, ?, * for better user experience in display contexts.
|
|
231
|
+
*
|
|
232
|
+
* @param text - Text to sanitize for display
|
|
233
|
+
* @returns Sanitized text with core shell metacharacters removed
|
|
234
|
+
*/
|
|
235
|
+
static sanitizeForDisplay(text) {
|
|
236
|
+
if (!text || typeof text !== 'string') {
|
|
237
|
+
return '';
|
|
238
|
+
}
|
|
239
|
+
// Use pre-compiled regex for performance
|
|
240
|
+
// Removes: ; & | ` $ ( )
|
|
241
|
+
return text.replaceAll(SHELL_METACHAR_DISPLAY_REGEX, '');
|
|
242
|
+
}
|
|
223
243
|
/**
|
|
224
244
|
* Check if hostname is a private IP address (IPv4 and IPv6)
|
|
225
245
|
*/
|
|
@@ -253,7 +273,7 @@ export class MCPInputValidator {
|
|
|
253
273
|
}
|
|
254
274
|
// fe80::/10 - Link-Local Addresses
|
|
255
275
|
// IPv6 link-local addresses are fe80::/10, meaning the valid range is fe80 through febf
|
|
256
|
-
const fe80Range = parseInt(ipv6Lower.substring(0, 4), 16);
|
|
276
|
+
const fe80Range = Number.parseInt(ipv6Lower.substring(0, 4), 16);
|
|
257
277
|
if (fe80Range >= 0xfe80 && fe80Range <= 0xfebf) {
|
|
258
278
|
return true;
|
|
259
279
|
}
|
|
@@ -269,7 +289,7 @@ export class MCPInputValidator {
|
|
|
269
289
|
static isEncodedPrivateIP(hostname) {
|
|
270
290
|
// Check for decimal encoded IPs (e.g., 2130706433 = 127.0.0.1)
|
|
271
291
|
if (DECIMAL_IP_REGEX.test(hostname)) {
|
|
272
|
-
const num = parseInt(hostname, 10);
|
|
292
|
+
const num = Number.parseInt(hostname, 10);
|
|
273
293
|
if (num >= 0 && num <= 4294967295) { // Valid IPv4 range
|
|
274
294
|
// Convert to IP format and check if private
|
|
275
295
|
const ip = [(num >>> 24) & 255, (num >>> 16) & 255, (num >>> 8) & 255, num & 255].join('.');
|
|
@@ -278,7 +298,7 @@ export class MCPInputValidator {
|
|
|
278
298
|
}
|
|
279
299
|
// Check for hex encoded IPs (e.g., 0x7f000001 = 127.0.0.1)
|
|
280
300
|
if (HEX_IP_REGEX.test(hostname)) {
|
|
281
|
-
const num = parseInt(hostname, 16);
|
|
301
|
+
const num = Number.parseInt(hostname, 16);
|
|
282
302
|
if (num >= 0 && num <= 4294967295) {
|
|
283
303
|
const ip = [(num >>> 24) & 255, (num >>> 16) & 255, (num >>> 8) & 255, num & 255].join('.');
|
|
284
304
|
return this.isPrivateIP(ip);
|
|
@@ -286,7 +306,7 @@ export class MCPInputValidator {
|
|
|
286
306
|
}
|
|
287
307
|
// Check for octal encoded IPs (e.g., 017700000001 = 127.0.0.1)
|
|
288
308
|
if (OCTAL_IP_REGEX.test(hostname)) {
|
|
289
|
-
const num = parseInt(hostname, 8);
|
|
309
|
+
const num = Number.parseInt(hostname, 8);
|
|
290
310
|
if (num >= 0 && num <= 4294967295) {
|
|
291
311
|
const ip = [(num >>> 24) & 255, (num >>> 16) & 255, (num >>> 8) & 255, num & 255].join('.');
|
|
292
312
|
return this.isPrivateIP(ip);
|
|
@@ -306,7 +326,7 @@ export function validateFilename(filename) {
|
|
|
306
326
|
throw ErrorHandler.createError(`Filename too long (max ${SECURITY_LIMITS.MAX_FILENAME_LENGTH} characters)`, ErrorCategory.VALIDATION_ERROR, ValidationErrorCodes.INVALID_LENGTH);
|
|
307
327
|
}
|
|
308
328
|
// Remove any path separators and dangerous characters
|
|
309
|
-
const sanitized = filename.
|
|
329
|
+
const sanitized = filename.replaceAll(FILENAME_DANGEROUS_REGEX, '').replace(FILENAME_LEADING_DOTS_REGEX, '');
|
|
310
330
|
if (!RegexValidator.validate(sanitized, VALIDATION_PATTERNS.SAFE_FILENAME, { maxLength: SECURITY_LIMITS.MAX_FILENAME_LENGTH })) {
|
|
311
331
|
throw ErrorHandler.createError('Invalid filename format. Use alphanumeric characters, hyphens, underscores, and dots only.', ErrorCategory.VALIDATION_ERROR, ValidationErrorCodes.INVALID_FILENAME);
|
|
312
332
|
}
|
|
@@ -329,11 +349,11 @@ export function validatePath(inputPath, baseDir) {
|
|
|
329
349
|
// Remove leading/trailing slashes and normalize
|
|
330
350
|
// Length limits added to prevent ReDoS attacks
|
|
331
351
|
// WINDOWS FIX: Convert backslashes to forward slashes for cross-platform compatibility
|
|
332
|
-
let normalized = inputPath.
|
|
352
|
+
let normalized = inputPath.replaceAll('\\', '/');
|
|
333
353
|
// FIX: Preserve leading slash for absolute paths
|
|
334
354
|
const isAbsolute = normalized.startsWith('/') || isWindowsAbsolute;
|
|
335
355
|
// Remove trailing slashes and normalize multiple slashes
|
|
336
|
-
normalized = normalized.
|
|
356
|
+
normalized = normalized.replaceAll(/\/{1,100}$/g, '').replaceAll(/\/{2,100}/g, '/');
|
|
337
357
|
// Preserve the leading slash if it was an absolute path
|
|
338
358
|
if (isAbsolute && !normalized.startsWith('/') && !isWindowsAbsolute) {
|
|
339
359
|
normalized = '/' + normalized;
|
|
@@ -441,11 +461,11 @@ export function sanitizeInput(input, maxLength = 1000) {
|
|
|
441
461
|
}
|
|
442
462
|
// Remove potentially dangerous characters and limit length
|
|
443
463
|
return input
|
|
444
|
-
.
|
|
445
|
-
.
|
|
446
|
-
.
|
|
447
|
-
.
|
|
464
|
+
.replaceAll(CONTROL_CHARS_REGEX, '') // Remove control characters
|
|
465
|
+
.replaceAll(HTML_DANGEROUS_REGEX, '') // Remove HTML-dangerous characters
|
|
466
|
+
.replaceAll(SHELL_METACHAR_REGEX, '') // Remove shell metacharacters (expanded)
|
|
467
|
+
.replaceAll(RTL_ZEROWIDTH_REGEX, '') // Remove RTL override and zero-width chars
|
|
448
468
|
.substring(0, maxLength)
|
|
449
469
|
.trim();
|
|
450
470
|
}
|
|
451
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSW5wdXRWYWxpZGF0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2VjdXJpdHkvSW5wdXRWYWxpZGF0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFFSCxPQUFPLEtBQUssSUFBSSxNQUFNLE1BQU0sQ0FBQztBQUM3QixPQUFPLEVBQUUsZUFBZSxFQUFFLG1CQUFtQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDdEUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDMUQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3JELE9BQU8sRUFBRSxZQUFZLEVBQUUsYUFBYSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDdkUsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFFOUQscURBQXFEO0FBQ3JELHNFQUFzRTtBQUN0RSxNQUFNLG1CQUFtQixHQUFHLHdCQUF3QixDQUFDLENBQUMscURBQXFEO0FBQzNHLE1BQU0sb0JBQW9CLEdBQUcsVUFBVSxDQUFDO0FBQ3hDLE1BQU0sb0JBQW9CLEdBQUcsb0JBQW9CLENBQUM7QUFDbEQsTUFBTSxtQkFBbUIsR0FBRyxpQkFBaUIsQ0FBQztBQUM5QyxNQUFNLDBCQUEwQixHQUFHLG1CQUFtQixDQUFDO0FBQ3ZELE1BQU0sMkJBQTJCLEdBQUcsc0JBQXNCLENBQUM7QUFDM0QsTUFBTSxVQUFVLEdBQUcsOEJBQThCLENBQUM7QUFDbEQsTUFBTSxnQkFBZ0IsR0FBRyxZQUFZLENBQUM7QUFDdEMsTUFBTSxZQUFZLEdBQUcsb0JBQW9CLENBQUM7QUFDMUMsTUFBTSxjQUFjLEdBQUcsZ0JBQWdCLENBQUM7QUFDeEMsTUFBTSx3QkFBd0IsR0FBRyxnQkFBZ0IsQ0FBQztBQUNsRCxNQUFNLDJCQUEyQixHQUFHLE1BQU0sQ0FBQztBQUMzQyxvRUFBb0U7QUFDcEUsTUFBTSxvQkFBb0IsR0FBRyw0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QU8sRUFBRSxDQUFDO0lBQ1osQ0FBQztJQUVELDJEQUEyRDtJQUMzRCxPQUFPLEtBQUs7U0FDVCxPQUFPLENBQUMsbUJBQW1CLEVBQUUsRUFBRSxDQUFDLENBQUMsNEJBQTRCO1NBQzdELE9BQU8sQ0FBQyxvQkFBb0IsRUFBRSxFQUFFLENBQUMsQ0FBQyxtQ0FBbUM7U0FDckUsT0FBTyxDQUFDLG9CQUFvQixFQUFFLEVBQUUsQ0FBQyxDQUFDLHlDQUF5QztTQUMzRSxPQUFPLENBQUMsbUJBQW1CLEVBQUUsRUFBRSxDQUFDLENBQUMsMkNBQTJDO1NBQzVFLFNBQVMsQ0FBQyxDQUFDLEVBQUUsU0FBUyxDQUFDO1NBQ3ZCLElBQUksRUFBRSxDQUFDO0FBQ1osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogSW5wdXQgdmFsaWRhdGlvbiBhbmQgc2FuaXRpemF0aW9uIGZ1bmN0aW9uc1xuICovXG5cbmltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgeyBTRUNVUklUWV9MSU1JVFMsIFZBTElEQVRJT05fUEFUVEVSTlMgfSBmcm9tICcuL2NvbnN0YW50cy5qcyc7XG5pbXBvcnQgeyBWQUxJRF9DQVRFR09SSUVTIH0gZnJvbSAnLi4vY29uZmlnL2NvbnN0YW50cy5qcyc7XG5pbXBvcnQgeyBSZWdleFZhbGlkYXRvciB9IGZyb20gJy4vcmVnZXhWYWxpZGF0b3IuanMnO1xuaW1wb3J0IHsgRXJyb3JIYW5kbGVyLCBFcnJvckNhdGVnb3J5IH0gZnJvbSAnLi4vdXRpbHMvRXJyb3JIYW5kbGVyLmpzJztcbmltcG9ydCB7IFZhbGlkYXRpb25FcnJvckNvZGVzIH0gZnJvbSAnLi4vdXRpbHMvZXJyb3JDb2Rlcy5qcyc7XG5cbi8vIFByZS1jb21waWxlZCByZWdleCBwYXR0ZXJucyBmb3IgYmV0dGVyIHBlcmZvcm1hbmNlXG4vLyBUaGVzZSBwYXR0ZXJucyBhcmUgdXNlZCByZXBlYXRlZGx5IGFuZCBiZW5lZml0IGZyb20gcHJlLWNvbXBpbGF0aW9uXG5jb25zdCBDT05UUk9MX0NIQVJTX1JFR0VYID0gL1tcXHUwMDAwLVxcdTAwMUZcXHUwMDdGXS9nOyAvLyBOT1NPTkFSIC0gUmVtb3ZpbmcgY29udHJvbCBjaGFyYWN0ZXJzIGZvciBzZWN1cml0eVxuY29uc3QgSFRNTF9EQU5HRVJPVVNfUkVHRVggPSAvWzw+J1wiJl0vZztcbmNvbnN0IFNIRUxMX01FVEFDSEFSX1JFR0VYID0gL1s7JnxgJCgpIVxcXFx+Kj97fV0vZztcbmNvbnN0IFJUTF9aRVJPV0lEVEhfUkVHRVggPSAvW1xcdTIwMkVcXHVGRUZGXS9nO1xuY29uc3QgQ09MTEVDVElPTl9QQVRIX0NIQVJfUkVHRVggPSAvW2EtekEtWjAtOVxcL1xcLV8uXS87XG5jb25zdCBWQUxJRF9DT0xMRUNUSU9OX1BBVEhfUkVHRVggPSAvXlthLXpBLVowLTlcXC9cXC1fLl0qJC87XG5jb25zdCBJUFY0X1JFR0VYID0gL14oXFxkKylcXC4oXFxkKylcXC4oXFxkKylcXC4oXFxkKykkLztcbmNvbnN0IERFQ0lNQUxfSVBfUkVHRVggPSAvXlxcZHs4LDEwfSQvO1xuY29uc3QgSEVYX0lQX1JFR0VYID0gL14weFswLTlhLWZdezEsOH0kL2k7XG5jb25zdCBPQ1RBTF9JUF9SRUdFWCA9IC9eMFswLTddezgsMTF9JC87XG5jb25zdCBGSUxFTkFNRV9EQU5HRVJPVVNfUkVHRVggPSAvW1xcL1xcXFw6Kj9cIjw+fF0vZztcbmNvbnN0IEZJTEVOQU1FX0xFQURJTkdfRE9UU19SRUdFWCA9IC9eXFwuKy87XG4vLyBSZWdleCB0byB0cmltIGxlYWRpbmcvdHJhaWxpbmcgc2xhc2hlcyAoZS5nLiwgXCIvcGF0aC9cIiAtPiBcInBhdGhcIilcbmNvbnN0IFBBVEhfTk9STUFMSVpFX1JFR0VYID0gLyheXFwvezEsMTAwfSl8KFxcL3sxLDEwMH0kKS9nO1xuY29uc3QgUEFUSF9NVUxUSVBMRV9TTEFTSEVTX1JFR0VYID0gL1xcL3sxLDEwMH0vZztcbmNvbnN0IFVSTF9QTFVTX0RFQ09ERV9SRUdFWCA9IC9cXCsvZztcblxuLyoqXG4gKiBFbmhhbmNlZCBpbnB1dCB2YWxpZGF0aW9uIGZvciBNQ1AgdG9vbHNcbiAqL1xuZXhwb3J0IGNsYXNzIE1DUElucHV0VmFsaWRhdG9yIHtcbiAgLyoqXG4gICAqIFZhbGlkYXRlIGEgcGVyc29uYSBpZGVudGlmaWVyIChuYW1lIG9yIGZpbGVuYW1lKVxuICAgKi9cbiAgc3RhdGljIHZhbGlkYXRlUGVyc29uYUlkZW50aWZpZXIoaWRlbnRpZmllcjogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAoIWlkZW50aWZpZXIgfHwgdHlwZW9mIGlkZW50aWZpZXIgIT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBFcnJvckhhbmRsZXIuY3JlYXRlRXJyb3IoJ1BlcnNvbmEgaWRlbnRpZmllciBtdXN0IGJlIGEgbm9uLWVtcHR5IHN0cmluZycsIEVycm9yQ2F0ZWdvcnkuVkFMSURBVElPTl9FUlJPUiwgVmFsaWRhdGlvbkVycm9yQ29kZXMuSU5WQUxJRF9QRVJTT05BX0lEKTtcbiAgICB9XG5cbiAgICBpZiAoaWRlbnRpZmllci5sZW5ndGggPiAxMDApIHtcbiAgICAgIHRocm93IEVycm9ySGFuZGxlci5jcmVhdGVFcnJvcignUGVyc29uYSBpZGVudGlmaWVyIHRvbyBsb25nIChtYXggMTAwIGNoYXJhY3RlcnMpJywgRXJyb3JDYXRlZ29yeS5WQUxJREFUSU9OX0VSUk9SLCBWYWxpZGF0aW9uRXJyb3JDb2Rlcy5JTlZBTElEX0xFTkdUSCk7XG4gICAgfVxuXG4gICAgLy8gQWxsb3cgcGVyc29uYSBuYW1lcyBhbmQgZmlsZW5hbWVzXG4gICAgY29uc3Qgc2FuaXRpemVkID0gc2FuaXRpemVJbnB1dChpZGVudGlmaWVyLCAxMDApO1xuICAgIGlmICghc2FuaXRpemVkKSB7XG4gICAgICB0aHJvdyBFcnJvckhhbmRsZXIuY3JlYXRlRXJyb3IoJ1BlcnNvbmEgaWRlbnRpZmllciBjb250YWlucyBvbmx5IGludmFsaWQgY2hhcmFjdGVycycsIEVycm9yQ2F0ZWdvcnkuVkFMSURBVElPTl9FUlJPUiwgVmFsaWRhdGlvbkVycm9yQ29kZXMuSU5WQUxJRF9QRVJTT05BX0lEKTtcbiAgICB9XG5cbiAgICByZXR1cm4gc2FuaXRpemVkO1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlIHNlYXJjaCBxdWVyeSBmb3IgY29sbGVjdGlvblxuICAgKi9cbiAgc3RhdGljIHZhbGlkYXRlU2VhcmNoUXVlcnkocXVlcnk6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKCFxdWVyeSB8fCB0eXBlb2YgcXVlcnkgIT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBFcnJvckhhbmRsZXIuY3JlYXRlRXJyb3IoJ1NlYXJjaCBxdWVyeSBtdXN0IGJlIGEgbm9uLWVtcHR5IHN0cmluZycsIEVycm9yQ2F0ZWdvcnkuVkFMSURBVElPTl9FUlJPUiwgVmFsaWRhdGlvbkVycm9yQ29kZXMuSU5WQUxJRF9TRUFSQ0hfUVVFUlkpO1xuICAgIH1cblxuICAgIGlmIChxdWVyeS5sZW5ndGggPCAyKSB7XG4gICAgICB0aHJvdyBFcnJvckhhbmRsZXIuY3JlYXRlRXJyb3IoJ1NlYXJjaCBxdWVyeSB0b28gc2hvcnQgKG1pbmltdW0gMiBjaGFyYWN0ZXJzKScsIEVycm9yQ2F0ZWdvcnkuVkFMSURBVElPTl9FUlJPUiwgVmFsaWRhdGlvbkVycm9yQ29kZXMuSU5WQUxJRF9MRU5HVEgpO1xuICAgIH1cblxuICAgIGlmIChxdWVyeS5sZW5ndGggPiAyMDApIHtcbiAgICAgIHRocm93IEVycm9ySGFuZGxlci5jcmVhdGVFcnJvcignU2VhcmNoIHF1ZXJ5IHRvbyBsb25nIChtYXggMjAwIGNoYXJhY3RlcnMpJywgRXJyb3JDYXRlZ29yeS5WQUxJREFUSU9OX0VSUk9SLCBWYWxpZGF0aW9uRXJyb3JDb2Rlcy5JTlZBTElEX0xFTkdUSCk7XG4gICAgfVxuXG4gICAgLy8gU2FuaXRpemUgYnV0IHByZXNlcnZlIHNwYWNlcyBmb3Igc2VhcmNoXG4gICAgY29uc3Qgc2FuaXRpemVkID0gcXVlcnlcbiAgICAgIC5yZXBsYWNlKENPTlRST0xfQ0hBUlNfUkVHRVgsICcnKSAvLyBSZW1vdmUgY29udHJvbCBjaGFyYWN0ZXJzXG4gICAgICAucmVwbGFjZShIVE1MX0RBTkdFUk9VU19SRUdFWCwgJycpIC8vIFJlbW92ZSBIVE1MLWRhbmdlcm91cyBjaGFyYWN0ZXJzXG4gICAgICAucmVwbGFjZShTSEVMTF9NRVRBQ0hBUl9SRUdFWCwgJycpIC8vIFJlbW92ZSBzaGVsbCBtZXRhY2hhcmFjdGVycyAoZXhwYW5kZWQpXG4gICAgICAucmVwbGFjZShSVExfWkVST1dJRFRIX1JFR0VYLCAnJykgLy8gUmVtb3ZlIFJUTCBvdmVycmlkZSBhbmQgemVyby13aWR0aCBjaGFyc1xuICAgICAgLnRyaW0oKTtcblxuICAgIGlmICghc2FuaXRpemVkKSB7XG4gICAgICB0aHJvdyBFcnJvckhhbmRsZXIuY3JlYXRlRXJyb3IoJ1NlYXJjaCBxdWVyeSBjb250YWlucyBvbmx5IGludmFsaWQgY2hhcmFjdGVycycsIEVycm9yQ2F0ZWdvcnkuVkFMSURBVElPTl9FUlJPUiwgVmFsaWRhdGlvbkVycm9yQ29kZXMuSU5WQUxJRF9TRUFSQ0hfUVVFUlkpO1xuICAgIH1cblxuICAgIHJldHVybiBzYW5pdGl6ZWQ7XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGUgY29sbGVjdGlvbiBwYXRoXG4gICAqL1xuICBzdGF0aWMgdmFsaWRhdGVDb2xsZWN0aW9uUGF0aChwYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmICghcGF0aCB8fCB0eXBlb2YgcGF0aCAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IEVycm9ySGFuZGxlci5jcmVhdGVFcnJvcignQ29sbGVjdGlvbiBwYXRoIG11c3QgYmUgYSBub24tZW1wdHkgc3RyaW5nJywgRXJyb3JDYXRlZ29yeS5WQUxJREFUSU9OX0VSUk9SLCBWYWxpZGF0aW9uRXJyb3JDb2Rlcy5JTlZBTElEX0NPTExFQ1RJT05fUEFUSCk7XG4gICAgfVxuXG4gICAgaWYgKHBhdGgubGVuZ3RoID4gNTAwKSB7XG4gICAgICB0aHJvdyBFcnJvckhhbmRsZXIuY3JlYXRlRXJyb3IoJ0NvbGxlY3Rpb24gcGF0aCB0b28gbG9uZyAobWF4IDUwMCBjaGFyYWN0ZXJzKScsIEVycm9yQ2F0ZWdvcnkuVkFMSURBVElPTl9FUlJPUiwgVmFsaWRhdGlvbkVycm9yQ29kZXMuSU5WQUxJRF9MRU5HVEgpO1xuICAgIH1cblxuICAgIC8vIEdpdEh1YiBBUEkgcGF0aHMgc2hvdWxkIGJlIHNhZmUgZmlsZW5hbWUgcGF0dGVybnNcbiAgICAvLyBVc2Ugc2luZ2xlIHJlZ2V4IHRlc3QgZm9yIGJldHRlciBwZXJmb3JtYW5jZSAoYXZvaWRzIE8obikgY2hhcmFjdGVyLWJ5LWNoYXJhY3RlciBjaGVjaylcbiAgICBpZiAoIVZBTElEX0NPTExFQ1RJT05fUEFUSF9SRUdFWC50ZXN0KHBhdGgpKSB7XG4gICAgICAvLyBPbmx5IGRvIGNoYXJhY3Rlci1ieS1jaGFyYWN0ZXIgY2hlY2sgaWYgdmFsaWRhdGlvbiBmYWlscywgdG8gcHJvdmlkZSBkZXRhaWxlZCBlcnJvciBtZXNzYWdlXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhdGgubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgY2hhciA9IHBhdGhbaV07XG4gICAgICAgIGlmICghQ09MTEVDVElPTl9QQVRIX0NIQVJfUkVHRVgudGVzdChjaGFyKSkge1xuICAgICAgICAgIHRocm93IEVycm9ySGFuZGxlci5jcmVhdGVFcnJvcihgSW52YWxpZCBjaGFyYWN0ZXIgJyR7Y2hhcn0nIGluIGNvbGxlY3Rpb24gcGF0aCBhdCBwb3NpdGlvbiAke2kgKyAxfWAsIEVycm9yQ2F0ZWdvcnkuVkFMSURBVElPTl9FUlJPUiwgVmFsaWRhdGlvbkVycm9yQ29kZXMuSU5WQUxJRF9DSEFSQUNURVIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBGYWxsYmFjayBlcnJvciBpZiB3ZSBzb21laG93IGRvbid0IGZpbmQgdGhlIGludmFsaWQgY2hhcmFjdGVyXG4gICAgICB0aHJvdyBFcnJvckhhbmRsZXIuY3JlYXRlRXJyb3IoJ0ludmFsaWQgY2hhcmFjdGVycyBpbiBjb2xsZWN0aW9uIHBhdGgnLCBFcnJvckNhdGVnb3J5LlZBTElEQVRJT05fRVJST1IsIFZhbGlkYXRpb25FcnJvckNvZGVzLklOVkFMSURfQ09MTEVDVElPTl9QQVRIKTtcbiAgICB9XG5cbiAgICAvLyBQcmV2ZW50IHBhdGggdHJhdmVyc2FsIGluIEdpdEh1YiBwYXRocyAoY29tcHJlaGVuc2l2ZSBjaGVjaylcbiAgICBjb25zdCBwYXRoTG93ZXIgPSBwYXRoLnRvTG93ZXJDYXNlKCk7XG4gICAgY29uc3QgZW5jb2RlZFBhdGggPSBkZWNvZGVVUklDb21wb25lbnQocGF0aC5yZXBsYWNlKFVSTF9QTFVTX0RFQ09ERV9SRUdFWCwgJyAnKSk7IC8vIERlY29kZSBVUkwgZW5jb2RpbmdcbiAgICBcbiAgICAvLyBDaGVjayBmb3IgdmFyaW91cyBwYXRoIHRyYXZlcnNhbCBwYXR0ZXJuc1xuICAgIGNvbnN0IHRyYXZlcnNhbFBhdHRlcm5zID0gW1xuICAgICAgJy4uJywgICAgICAgICAgLy8gQmFzaWMgdHJhdmVyc2FsXG4gICAgICAnLi8nLCAgICAgICAgICAvLyBDdXJyZW50IGRpcmVjdG9yeVxuICAgICAgJy8uLi8nLCAgICAgICAgLy8gRGlyZWN0b3J5IHRyYXZlcnNhbCB3aXRoIHNsYXNoZXNcbiAgICAgICdcXFxcJywgICAgICAgICAgLy8gQmFja3NsYXNoIChXaW5kb3dzLXN0eWxlKVxuICAgICAgJyUyZSUyZScsICAgICAgLy8gVVJMLWVuY29kZWQgLi5cbiAgICAgICclMmUlMmUlMmYnLCAgIC8vIFVSTC1lbmNvZGVkIC4uL1xuICAgICAgJyUyZSUyZSU1YycsICAgLy8gVVJMLWVuY29kZWQgLi5cXFxuICAgICAgJyUyNTJlJTI1MmUnLCAgLy8gRG91YmxlIFVSTC1lbmNvZGVkIC4uXG4gICAgICAnLi4lMmYnLCAgICAgICAvLyBNaXhlZCBlbmNvZGluZ1xuICAgICAgJy4uJTVjJywgICAgICAgLy8gTWl4ZWQgZW5jb2Rpbmcgd2l0aCBiYWNrc2xhc2hcbiAgICAgICcuLi4uLycsICAgICAgIC8vIERvdGRvdCBieXBhc3MgYXR0ZW1wdFxuICAgICAgJy4uOy8nLCAgICAgICAgLy8gU2VtaWNvbG9uIGJ5cGFzcyBhdHRlbXB0XG4gICAgXTtcbiAgICBcbiAgICBmb3IgKGNvbnN0IHBhdHRlcm4gb2YgdHJhdmVyc2FsUGF0dGVybnMpIHtcbiAgICAgIGlmIChwYXRoTG93ZXIuaW5jbHVkZXMocGF0dGVybikgfHwgZW5jb2RlZFBhdGgudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhwYXR0ZXJuKSkge1xuICAgICAgICB0aHJvdyBFcnJvckhhbmRsZXIuY3JlYXRlRXJyb3IoJ1BhdGggdHJhdmVyc2FsIG5vdCBhbGxvd2VkIGluIGNvbGxlY3Rpb24gcGF0aCcsIEVycm9yQ2F0ZWdvcnkuVkFMSURBVElPTl9FUlJPUiwgVmFsaWRhdGlvbkVycm9yQ29kZXMuUEFUSF9UUkFWRVJTQUwpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBwYXRoO1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlIFVSTCBmb3IgaW1wb3J0IG9wZXJhdGlvbnNcbiAgICovXG4gIHN0YXRpYyB2YWxpZGF0ZUltcG9ydFVybCh1cmw6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKCF1cmwgfHwgdHlwZW9mIHVybCAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IEVycm9ySGFuZGxlci5jcmVhdGVFcnJvcignVVJMIG11c3QgYmUgYSBub24tZW1wdHkgc3RyaW5nJywgRXJyb3JDYXRlZ29yeS5WQUxJREFUSU9OX0VSUk9SLCBWYWxpZGF0aW9uRXJyb3JDb2Rlcy5JTlZBTElEX1VSTCk7XG4gICAgfVxuXG4gICAgaWYgKHVybC5sZW5ndGggPiAyMDAwKSB7XG4gICAgICB0aHJvdyBFcnJvckhhbmRsZXIuY3JlYXRlRXJyb3IoJ1VSTCB0b28gbG9uZyAobWF4IDIwMDAgY2hhcmFjdGVycyknLCBFcnJvckNhdGVnb3J5LlZBTElEQVRJT05fRVJST1IsIFZhbGlkYXRpb25FcnJvckNvZGVzLklOVkFMSURfTEVOR1RIKTtcbiAgICB9XG5cbiAgICAvLyBSZWplY3QgcHJvdG9jb2wtcmVsYXRpdmUgVVJMcyB0aGF0IGNvdWxkIGJ5cGFzcyB2YWxpZGF0aW9uXG4gICAgaWYgKHVybC5zdGFydHNXaXRoKCcvLycpKSB7XG4gICAgICB0aHJvdyBFcnJvckhhbmRsZXIuY3JlYXRlRXJyb3IoJ1Byb3RvY29sLXJlbGF0aXZlIFVSTHMgYXJlIG5vdCBhbGxvd2VkJywgRXJyb3JDYXRlZ29yeS5WQUxJREFUSU9OX0VSUk9SLCBWYWxpZGF0aW9uRXJyb3JDb2Rlcy5JTlZBTElEX1VSTCk7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIC8vIERlY29kZSBVUkwgdG8gcHJldmVudCBlbmNvZGluZy1iYXNlZCBieXBhc3Nlc1xuICAgICAgbGV0IGRlY29kZWRVcmwgPSB1cmw7XG4gICAgICB0cnkge1xuICAgICAgICBkZWNvZGVkVXJsID0gZGVjb2RlVVJJQ29tcG9uZW50KHVybCk7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLy8gSWYgZGVjb2RpbmcgZmFpbHMsIHVzZSBvcmlnaW5hbCBVUkxcbiAgICAgIH1cbiAgICAgIFxuICAgICAgY29uc3QgcGFyc2VkID0gbmV3IFVSTChkZWNvZGVkVXJsKTtcbiAgICAgIFxuICAgICAgLy8gUHJvdG9jb2wgdmFsaWRhdGlvblxuICAgICAgaWYgKCFbJ2h0dHA6JywgJ2h0dHBzOiddLmluY2x1ZGVzKHBhcnNlZC5wcm90b2NvbCkpIHtcbiAgICAgICAgdGhyb3cgRXJyb3JIYW5kbGVyLmNyZWF0ZUVycm9yKCdPbmx5IEhUVFAoUykgVVJMcyBhcmUgYWxsb3dlZCcsIEVycm9yQ2F0ZWdvcnkuVkFMSURBVElPTl9FUlJPUiwgVmFsaWRhdGlvbkVycm9yQ29kZXMuSU5WQUxJRF9VUkwpO1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBFbmhhbmNlZCBTU1JGIHByb3RlY3Rpb24gd2l0aCBJRE4gbm9ybWFsaXphdGlvblxuICAgICAgbGV0IGhvc3RuYW1lID0gcGFyc2VkLmhvc3RuYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICBcbiAgICAgIC8vIEhhbmRsZSBJRE4gKEludGVybmF0aW9uYWwgRG9tYWluIE5hbWVzKSBieSBjb252ZXJ0aW5nIHRvIEFTQ0lJXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBpZG5Ob3JtYWxpemVkID0gbmV3IFVSTChgaHR0cDovLyR7aG9zdG5hbWV9YCkuaG9zdG5hbWU7XG4gICAgICAgIGhvc3RuYW1lID0gaWRuTm9ybWFsaXplZDtcbiAgICAgIH0gY2F0Y2ggKGlkbkVycm9yKSB7XG4gICAgICAgIC8vIElmIElETiBjb252ZXJzaW9uIGZhaWxzLCByZWplY3QgdGhlIFVSTCBmb3Igc2VjdXJpdHlcbiAgICAgICAgdGhyb3cgRXJyb3JIYW5kbGVyLmNyZWF0ZUVycm9yKCdJbnZhbGlkIGhvc3RuYW1lOiBJRE4gY29udmVyc2lvbiBmYWlsZWQgLSBwb3RlbnRpYWxseSBtYWxpY2lvdXMgZG9tYWluIG5hbWUnLCBFcnJvckNhdGVnb3J5LlZBTElEQVRJT05fRVJST1IsIFZhbGlkYXRpb25FcnJvckNvZGVzLklOVkFMSURfVVJMKTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gQ2hlY2sgZm9yIHByaXZhdGUgSVBzIChub3cgd2l0aCBJRE4tbm9ybWFsaXplZCBob3N0bmFtZSlcbiAgICAgIGlmICh0aGlzLmlzUHJpdmF0ZUlQKGhvc3RuYW1lKSkge1xuICAgICAgICB0aHJvdyBFcnJvckhhbmRsZXIuY3JlYXRlRXJyb3IoJ1ByaXZhdGUgbmV0d29yayBVUkxzIGFyZSBub3QgYWxsb3dlZCcsIEVycm9yQ2F0ZWdvcnkuVkFMSURBVElPTl9FUlJPUiwgVmFsaWRhdGlvbkVycm9yQ29kZXMuSU5WQUxJRF9VUkwpO1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBBZGRpdGlvbmFsIFNTUkYgY2hlY2tzIGZvciBlbmNvZGVkIElQc1xuICAgICAgaWYgKHRoaXMuaXNFbmNvZGVkUHJpdmF0ZUlQKGhvc3RuYW1lKSkge1xuICAgICAgICB0aHJvdyBFcnJvckhhbmRsZXIuY3JlYXRlRXJyb3IoJ0VuY29kZWQgcHJpdmF0ZSBuZXR3b3JrIFVSTHMgYXJlIG5vdCBhbGxvd2VkJywgRXJyb3JDYXRlZ29yeS5WQUxJREFUSU9OX0VSUk9SLCBWYWxpZGF0aW9uRXJyb3JDb2Rlcy5JTlZBTElEX1VSTCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB1cmw7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yICYmIChlcnJvci5tZXNzYWdlLmluY2x1ZGVzKCdQcml2YXRlIG5ldHdvcmsnKSB8fCBlcnJvci5tZXNzYWdlLmluY2x1ZGVzKCdFbmNvZGVkIHByaXZhdGUnKSkpIHtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgICBjb25zdCBlcnJvck1lc3NhZ2UgPSBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6ICdVbmtub3duIGVycm9yJztcbiAgICAgIHRocm93IEVycm9ySGFuZGxlci5jcmVhdGVFcnJvcihgSW52YWxpZCBVUkwgZm9ybWF0OiAke2Vycm9yTWVzc2FnZX1gLCBFcnJvckNhdGVnb3J5LlZBTElEQVRJT05fRVJST1IsIFZhbGlkYXRpb25FcnJvckNvZGVzLklOVkFMSURfVVJMKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGUgZXhwaXJ5IGRheXMgZm9yIHNoYXJpbmdcbiAgICovXG4gIHN0YXRpYyB2YWxpZGF0ZUV4cGlyeURheXMoZGF5czogbnVtYmVyKTogbnVtYmVyIHtcbiAgICBpZiAodHlwZW9mIGRheXMgIT09ICdudW1iZXInKSB7XG4gICAgICB0aHJvdyBFcnJvckhhbmRsZXIuY3JlYXRlRXJyb3IoJ0V4cGlyeSBkYXlzIG11c3QgYmUgYSB2YWxpZCBudW1iZXInLCBFcnJvckNhdGVnb3J5LlZBTElEQVRJT05fRVJST1IsIFZhbGlkYXRpb25FcnJvckNvZGVzLklOVkFMSURfTlVNQkVSKTtcbiAgICB9XG4gICAgXG4gICAgaWYgKGlzTmFOKGRheXMpIHx8ICFpc0Zpbml0ZShkYXlzKSkge1xuICAgICAgdGhyb3cgRXJyb3JIYW5kbGVyLmNyZWF0ZUVycm9yKCdFeHBpcnkgZGF5cyBtdXN0IGJlIGEgdmFsaWQgbnVtYmVyJywgRXJyb3JDYXRlZ29yeS5WQUxJREFUSU9OX0VSUk9SLCBWYWxpZGF0aW9uRXJyb3JDb2Rlcy5JTlZBTElEX05VTUJFUik7XG4gICAgfVxuXG4gICAgaWYgKGRheXMgPCAxIHx8IGRheXMgPiAzNjUpIHtcbiAgICAgIHRocm93IEVycm9ySGFuZGxlci5jcmVhdGVFcnJvcignRXhwaXJ5IGRheXMgbXVzdCBiZSBiZXR3ZWVuIDEgYW5kIDM2NScsIEVycm9yQ2F0ZWdvcnkuVkFMSURBVElPTl9FUlJPUiwgVmFsaWRhdGlvbkVycm9yQ29kZXMuSU5WQUxJRF9SQU5HRSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIE1hdGguZmxvb3IoZGF5cyk7XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGUgYm9vbGVhbiBjb25maXJtYXRpb24gcGFyYW1ldGVyc1xuICAgKi9cbiAgc3RhdGljIHZhbGlkYXRlQ29uZmlybWF0aW9uKGNvbmZpcm06IGJvb2xlYW4sIG9wZXJhdGlvbk5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGlmICh0eXBlb2YgY29uZmlybSAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgICB0aHJvdyBFcnJvckhhbmRsZXIuY3JlYXRlRXJyb3IoYCR7b3BlcmF0aW9uTmFtZX0gY29uZmlybWF0aW9uIG11c3QgYmUgYSBib29sZWFuIHZhbHVlYCwgRXJyb3JDYXRlZ29yeS5WQUxJREFUSU9OX0VSUk9SLCBWYWxpZGF0aW9uRXJyb3JDb2Rlcy5JTlZBTElEX1RZUEUpO1xuICAgIH1cblxuICAgIGlmICghY29uZmlybSkge1xuICAgICAgdGhyb3cgRXJyb3JIYW5kbGVyLmNyZWF0ZUVycm9yKGAke29wZXJhdGlvbk5hbWV9IG9wZXJhdGlvbiByZXF1aXJlcyBleHBsaWNpdCBjb25maXJtYXRpb24gKHRydWUpYCwgRXJyb3JDYXRlZ29yeS5WQUxJREFUSU9OX0VSUk9SLCBWYWxpZGF0aW9uRXJyb3JDb2Rlcy5DT05GSVJNQVRJT05fUkVRVUlSRUQpO1xuICAgIH1cblxuICAgIHJldHVybiBjb25maXJtO1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlIGZpZWxkIG5hbWUgZm9yIGVkaXQgb3BlcmF0aW9uc1xuICAgKi9cbiAgc3RhdGljIHZhbGlkYXRlRWRpdEZpZWxkKGZpZWxkOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmICghZmllbGQgfHwgdHlwZW9mIGZpZWxkICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgRXJyb3JIYW5kbGVyLmNyZWF0ZUVycm9yKCdGaWVsZCBuYW1lIG11c3QgYmUgYSBub24tZW1wdHkgc3RyaW5nJywgRXJyb3JDYXRlZ29yeS5WQUxJREFUSU9OX0VSUk9SLCBWYWxpZGF0aW9uRXJyb3JDb2Rlcy5SRVFVSVJFRF9GSUVMRCk7XG4gICAgfVxuXG4gICAgY29uc3QgdmFsaWRGaWVsZHMgPSBbXG4gICAgICAnbmFtZScsICdkZXNjcmlwdGlvbicsICdjYXRlZ29yeScsICdpbnN0cnVjdGlvbnMnLCBcbiAgICAgICd0cmlnZ2VycycsICd2ZXJzaW9uJywgJ2F1dGhvcicsICd0YWdzJ1xuICAgIF07XG5cbiAgICBjb25zdCBub3JtYWxpemVkRmllbGQgPSBmaWVsZC50b0xvd2VyQ2FzZSgpLnRyaW0oKTtcbiAgICBpZiAoIXZhbGlkRmllbGRzLmluY2x1ZGVzKG5vcm1hbGl6ZWRGaWVsZCkpIHtcbiAgICAgIHRocm93IEVycm9ySGFuZGxlci5jcmVhdGVFcnJvcihgSW52YWxpZCBmaWVsZCBuYW1lLiBNdXN0IGJlIG9uZSBvZjogJHt2YWxpZEZpZWxkcy5qb2luKCcsICcpfWAsIEVycm9yQ2F0ZWdvcnkuVkFMSURBVElPTl9FUlJPUiwgVmFsaWRhdGlvbkVycm9yQ29kZXMuSU5WQUxJRF9JTlBVVCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5vcm1hbGl6ZWRGaWVsZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBob3N0bmFtZSBpcyBhIHByaXZhdGUgSVAgYWRkcmVzcyAoSVB2NCBhbmQgSVB2NilcbiAgICovXG4gIHByaXZhdGUgc3RhdGljIGlzUHJpdmF0ZUlQKGhvc3RuYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAvLyBDaGVjayBmb3IgbG9jYWxob3N0IHZhcmlhdGlvbnNcbiAgICBpZiAoWydsb2NhbGhvc3QnLCAnMTI3LjAuMC4xJywgJzo6MSddLmluY2x1ZGVzKGhvc3RuYW1lKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgZm9yIHByaXZhdGUgSVB2NCByYW5nZXNcbiAgICBjb25zdCBpcHY0TWF0Y2ggPSBob3N0bmFtZS5tYXRjaChJUFY0X1JFR0VYKTtcbiAgICBcbiAgICBpZiAoaXB2NE1hdGNoKSB7XG4gICAgICBjb25zdCBbLCBhLCBiLCBjLCBkXSA9IGlwdjRNYXRjaC5tYXAoTnVtYmVyKTtcbiAgICAgIFxuICAgICAgLy8gMTAuMC4wLjAvOFxuICAgICAgaWYgKGEgPT09IDEwKSByZXR1cm4gdHJ1ZTtcbiAgICAgIFxuICAgICAgLy8gMTcyLjE2LjAuMC8xMlxuICAgICAgaWYgKGEgPT09IDE3MiAmJiBiID49IDE2ICYmIGIgPD0gMzEpIHJldHVybiB0cnVlO1xuICAgICAgXG4gICAgICAvLyAxOTIuMTY4LjAuMC8xNlxuICAgICAgaWYgKGEgPT09IDE5MiAmJiBiID09PSAxNjgpIHJldHVybiB0cnVlO1xuICAgICAgXG4gICAgICAvLyAxNjkuMjU0LjAuMC8xNiAobGluay1sb2NhbClcbiAgICAgIGlmIChhID09PSAxNjkgJiYgYiA9PT0gMjU0KSByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBDaGVjayBmb3IgcHJpdmF0ZSBJUHY2IHJhbmdlc1xuICAgIGNvbnN0IGlwdjZMb3dlciA9IGhvc3RuYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgXG4gICAgLy8gZmMwMDo6LzcgLSBVbmlxdWUgTG9jYWwgQWRkcmVzc2VzIChVTEEpXG4gICAgaWYgKGlwdjZMb3dlci5zdGFydHNXaXRoKCdmYycpIHx8IGlwdjZMb3dlci5zdGFydHNXaXRoKCdmZCcpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgXG4gICAgLy8gZmU4MDo6LzEwIC0gTGluay1Mb2NhbCBBZGRyZXNzZXNcbiAgICAvLyBJUHY2IGxpbmstbG9jYWwgYWRkcmVzc2VzIGFyZSBmZTgwOjovMTAsIG1lYW5pbmcgdGhlIHZhbGlkIHJhbmdlIGlzIGZlODAgdGhyb3VnaCBmZWJmXG4gICAgY29uc3QgZmU4MFJhbmdlID0gcGFyc2VJbnQoaXB2Nkxvd2VyLnN1YnN0cmluZygwLCA0KSwgMTYpO1xuICAgIGlmIChmZTgwUmFuZ2UgPj0gMHhmZTgwICYmIGZlODBSYW5nZSA8PSAweGZlYmYpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBcbiAgICAvLyBBZGRpdGlvbmFsIElQdjYgbG9jYWxob3N0IGZvcm1hdHNcbiAgICBpZiAoWyc6OjEnLCAnMDowOjA6MDowOjA6MDoxJ10uaW5jbHVkZXMoaXB2Nkxvd2VyKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGZvciBlbmNvZGVkIHByaXZhdGUgSVAgYWRkcmVzc2VzIHRoYXQgY291bGQgYnlwYXNzIGJhc2ljIGRldGVjdGlvblxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgaXNFbmNvZGVkUHJpdmF0ZUlQKGhvc3RuYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAvLyBDaGVjayBmb3IgZGVjaW1hbCBlbmNvZGVkIElQcyAoZS5nLiwgMjEzMDcwNjQzMyA9IDEyNy4wLjAuMSlcbiAgICBpZiAoREVDSU1BTF9JUF9SRUdFWC50ZXN0KGhvc3RuYW1lKSkge1xuICAgICAgY29uc3QgbnVtID0gcGFyc2VJbnQoaG9zdG5hbWUsIDEwKTtcbiAgICAgIGlmIChudW0gPj0gMCAmJiBudW0gPD0gNDI5NDk2NzI5NSkgeyAvLyBWYWxpZCBJUHY0IHJhbmdlXG4gICAgICAgIC8vIENvbnZlcnQgdG8gSVAgZm9ybWF0IGFuZCBjaGVjayBpZiBwcml2YXRlXG4gICAgICAgIGNvbnN0IGlwID0gWyhudW0gPj4+IDI0KSAmIDI1NSwgKG51bSA+Pj4gMTYpICYgMjU1LCAobnVtID4+PiA4KSAmIDI1NSwgbnVtICYgMjU1XS5qb2luKCcuJyk7XG4gICAgICAgIHJldHVybiB0aGlzLmlzUHJpdmF0ZUlQKGlwKTtcbiAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgLy8gQ2hlY2sgZm9yIGhleCBlbmNvZGVkIElQcyAoZS5nLiwgMHg3ZjAwMDAwMSA9IDEyNy4wLjAuMSlcbiAgICBpZiAoSEVYX0lQX1JFR0VYLnRlc3QoaG9zdG5hbWUpKSB7XG4gICAgICBjb25zdCBudW0gPSBwYXJzZUludChob3N0bmFtZSwgMTYpO1xuICAgICAgaWYgKG51bSA+PSAwICYmIG51bSA8PSA0Mjk0OTY3Mjk1KSB7XG4gICAgICAgIGNvbnN0IGlwID0gWyhudW0gPj4+IDI0KSAmIDI1NSwgKG51bSA+Pj4gMTYpICYgMjU1LCAobnVtID4+PiA4KSAmIDI1NSwgbnVtICYgMjU1XS5qb2luKCcuJyk7XG4gICAgICAgIHJldHVybiB0aGlzLmlzUHJpdmF0ZUlQKGlwKTtcbiAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgLy8gQ2hlY2sgZm9yIG9jdGFsIGVuY29kZWQgSVBzIChlLmcuLCAwMTc3MDAwMDAwMDEgPSAxMjcuMC4wLjEpXG4gICAgaWYgKE9DVEFMX0lQX1JFR0VYLnRlc3QoaG9zdG5hbWUpKSB7XG4gICAgICBjb25zdCBudW0gPSBwYXJzZUludChob3N0bmFtZSwgOCk7XG4gICAgICBpZiAobnVtID49IDAgJiYgbnVtIDw9IDQyOTQ5NjcyOTUpIHtcbiAgICAgICAgY29uc3QgaXAgPSBbKG51bSA+Pj4gMjQpICYgMjU1LCAobnVtID4+PiAxNikgJiAyNTUsIChudW0gPj4+IDgpICYgMjU1LCBudW0gJiAyNTVdLmpvaW4oJy4nKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNQcml2YXRlSVAoaXApO1xuICAgICAgfVxuICAgIH1cbiAgICBcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuLyoqXG4gKiBWYWxpZGF0ZSBhbmQgc2FuaXRpemUgYSBmaWxlbmFtZVxuICovXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVGaWxlbmFtZShmaWxlbmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgaWYgKCFmaWxlbmFtZSB8fCB0eXBlb2YgZmlsZW5hbWUgIT09ICdzdHJpbmcnKSB7XG4gICAgdGhyb3cgRXJyb3JIYW5kbGVyLmNyZWF0ZUVycm9yKCdGaWxlbmFtZSBtdXN0IGJlIGEgbm9uLWVtcHR5IHN0cmluZycsIEVycm9yQ2F0ZWdvcnkuVkFMSURBVElPTl9FUlJPUiwgVmFsaWRhdGlvbkVycm9yQ29kZXMuSU5WQUxJRF9GSUxFTkFNRSk7XG4gIH1cbiAgXG4gIGlmIChmaWxlbmFtZS5sZW5ndGggPiBTRUNVUklUWV9MSU1JVFMuTUFYX0ZJTEVOQU1FX0xFTkdUSCkge1xuICAgIHRocm93IEVycm9ySGFuZGxlci5jcmVhdGVFcnJvcihgRmlsZW5hbWUgdG9vIGxvbmcgKG1heCAke1NFQ1VSSVRZX0xJTUlUUy5NQVhfRklMRU5BTUVfTEVOR1RIfSBjaGFyYWN0ZXJzKWAsIEVycm9yQ2F0ZWdvcnkuVkFMSURBVElPTl9FUlJPUiwgVmFsaWRhdGlvbkVycm9yQ29kZXMuSU5WQUxJRF9MRU5HVEgpO1xuICB9XG4gIFxuICAvLyBSZW1vdmUgYW55IHBhdGggc2VwYXJhdG9ycyBhbmQgZGFuZ2Vyb3VzIGNoYXJhY3RlcnNcbiAgY29uc3Qgc2FuaXRpemVkID0gZmlsZW5hbWUucmVwbGFjZShGSUxFTkFNRV9EQU5HRVJPVVNfUkVHRVgsICcnKS5yZXBsYWNlKEZJTEVOQU1FX0xFQURJTkdfRE9UU19SRUdFWCwgJycpO1xuICBcbiAgaWYgKCFSZWdleFZhbGlkYXRvci52YWxpZGF0ZShzYW5pdGl6ZWQsIFZBTElEQVRJT05fUEFUVEVSTlMuU0FGRV9GSUxFTkFNRSwgeyBtYXhMZW5ndGg6IFNFQ1VSSVRZX0xJTUlUUy5NQVhfRklMRU5BTUVfTEVOR1RIIH0pKSB7XG4gICAgdGhyb3cgRXJyb3JIYW5kbGVyLmNyZWF0ZUVycm9yKCdJbnZhbGlkIGZpbGVuYW1lIGZvcm1hdC4gVXNlIGFscGhhbnVtZXJpYyBjaGFyYWN0ZXJzLCBoeXBoZW5zLCB1bmRlcnNjb3JlcywgYW5kIGRvdHMgb25seS4nLCBFcnJvckNhdGVnb3J5LlZBTElEQVRJT05fRVJST1IsIFZhbGlkYXRpb25FcnJvckNvZGVzLklOVkFMSURfRklMRU5BTUUpO1xuICB9XG4gIFxuICByZXR1cm4gc2FuaXRpemVkO1xufVxuXG4vKipcbiAqIFZhbGlkYXRlIGFuZCBzYW5pdGl6ZSBhIHBhdGhcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlUGF0aChpbnB1dFBhdGg6IHN0cmluZywgYmFzZURpcj86IHN0cmluZyk6IHN0cmluZyB7XG4gIGlmICghaW5wdXRQYXRoIHx8IHR5cGVvZiBpbnB1dFBhdGggIT09ICdzdHJpbmcnKSB7XG4gICAgdGhyb3cgRXJyb3JIYW5kbGVyLmNyZWF0ZUVycm9yKCdQYXRoIG11c3QgYmUgYSBub24tZW1wdHkgc3RyaW5nJywgRXJyb3JDYXRlZ29yeS5WQUxJREFUSU9OX0VSUk9SLCBWYWxpZGF0aW9uRXJyb3JDb2Rlcy5JTlZBTElEX1BBVEgpO1xuICB9XG4gIFxuICAvLyBJZiBiYXNlRGlyIGlzIHByb3ZpZGVkIGFuZCBpbnB1dFBhdGggaXMgYWJzb2x1dGUsIHJlamVjdCBpdFxuICAvLyBDaGVjayBib3RoIFVuaXgtc3R5bGUgYW5kIFdpbmRvd3Mtc3R5bGUgYWJzb2x1dGUgcGF0aHMgZm9yIGNyb3NzLXBsYXRmb3JtIHNlY3VyaXR5XG4gIGNvbnN0IGlzVW5peEFic29sdXRlID0gcGF0aC5pc0Fic29sdXRlKGlucHV0UGF0aCk7XG4gIGNvbnN0IGlzV2luZG93c0Fic29sdXRlID0gL15bYS16QS1aXTpbXFxcXC9dLy50ZXN0KGlucHV0UGF0aCk7XG4gIFxuICBpZiAoYmFzZURpciAmJiAoaXNVbml4QWJzb2x1dGUgfHwgaXNXaW5kb3dzQWJzb2x1dGUpKSB7XG4gICAgdGhyb3cgRXJyb3JIYW5kbGVyLmNyZWF0ZUVycm9yKCdBYnNvbHV0ZSBwYXRocyBub3QgYWxsb3dlZCB3aGVuIGJhc2UgZGlyZWN0b3J5IGlzIHNwZWNpZmllZCcsIEVycm9yQ2F0ZWdvcnkuVkFMSURBVElPTl9FUlJPUiwgVmFsaWRhdGlvbkVycm9yQ29kZXMuSU5WQUxJRF9QQVRIKTtcbiAgfVxuICBcbiAgLy8gUmVtb3ZlIGxlYWRpbmcvdHJhaWxpbmcgc2xhc2hlcyBhbmQgbm9ybWFsaXplXG4gIC8vIExlbmd0aCBsaW1pdHMgYWRkZWQgdG8gcHJldmVudCBSZURvUyBhdHRhY2tzXG4gIC8vIFdJTkRPV1MgRklYOiBDb252ZXJ0IGJhY2tzbGFzaGVzIHRvIGZvcndhcmQgc2xhc2hlcyBmb3IgY3Jvc3MtcGxhdGZvcm0gY29tcGF0aWJpbGl0eVxuICBsZXQgbm9ybWFsaXplZCA9IGlucHV0UGF0aC5yZXBsYWNlKC9cXFxcL2csICcvJyk7XG4gIFxuICAvLyBGSVg6IFByZXNlcnZlIGxlYWRpbmcgc2xhc2ggZm9yIGFic29sdXRlIHBhdGhzXG4gIGNvbnN0IGlzQWJzb2x1dGUgPSBub3JtYWxpemVkLnN0YXJ0c1dpdGgoJy8nKSB8fCBpc1dpbmRvd3NBYnNvbHV0ZTtcbiAgXG4gIC8vIFJlbW92ZSB0cmFpbGluZyBzbGFzaGVzIGFuZCBub3JtYWxpemUgbXVsdGlwbGUgc2xhc2hlc1xuICBub3JtYWxpemVkID0gbm9ybWFsaXplZC5yZXBsYWNlKC9cXC97MSwxMDB9JC9nLCAnJykucmVwbGFjZSgvXFwvezIsMTAwfS9nLCAnLycpO1xuICBcbiAgLy8gUHJlc2VydmUgdGhlIGxlYWRpbmcgc2xhc2ggaWYgaXQgd2FzIGFuIGFic29sdXRlIHBhdGhcbiAgaWYgKGlzQWJzb2x1dGUgJiYgIW5vcm1hbGl6ZWQuc3RhcnRzV2l0aCgnLycpICYmICFpc1dpbmRvd3NBYnNvbHV0ZSkge1xuICAgIG5vcm1hbGl6ZWQgPSAnLycgKyBub3JtYWxpemVkO1xuICB9XG4gIFxuICBpZiAoIVZBTElEQVRJT05fUEFUVEVSTlMuU0FGRV9QQVRILnRlc3Qobm9ybWFsaXplZCkpIHtcbiAgICB0aHJvdyBFcnJvckhhbmRsZXIuY3JlYXRlRXJyb3IoJ0ludmFsaWQgcGF0aCBmb3JtYXQuIFVzZSBhbHBoYW51bWVyaWMgY2hhcmFjdGVycywgaHlwaGVucywgdW5kZXJzY29yZXMsIGRvdHMsIGFuZCBmb3J3YXJkIHNsYXNoZXMgb25seS4nLCBFcnJvckNhdGVnb3J5LlZBTElEQVRJT05fRVJST1IsIFZhbGlkYXRpb25FcnJvckNvZGVzLklOVkFMSURfUEFUSCk7XG4gIH1cbiAgXG4gIC8vIENoZWNrIGZvciBwYXRoIHRyYXZlcnNhbCBhdHRlbXB0c1xuICBpZiAobm9ybWFsaXplZC5pbmNsdWRlcygnLi4nKSB8fCBub3JtYWxpemVkLmluY2x1ZGVzKCcuLycpIHx8IG5vcm1hbGl6ZWQuaW5jbHVkZXMoJy8uJykpIHtcbiAgICB0aHJvdyBFcnJvckhhbmRsZXIuY3JlYXRlRXJyb3IoJ1BhdGggdHJhdmVyc2FsIG5vdCBhbGxvd2VkJywgRXJyb3JDYXRlZ29yeS5WQUxJREFUSU9OX0VSUk9SLCBWYWxpZGF0aW9uRXJyb3JDb2Rlcy5QQVRIX1RSQVZFUlNBTCk7XG4gIH1cbiAgXG4gIC8vIFZhbGlkYXRlIHBhdGggZGVwdGhcbiAgY29uc3QgZGVwdGggPSBub3JtYWxpemVkLnNwbGl0KCcvJykubGVuZ3RoO1xuICBpZiAoZGVwdGggPiBTRUNVUklUWV9MSU1JVFMuTUFYX1BBVEhfREVQVEgpIHtcbiAgICB0aHJvdyBFcnJvckhhbmRsZXIuY3JlYXRlRXJyb3IoYFBhdGggdG9vIGRlZXAgKG1heCAke1NFQ1VSSVRZX0xJTUlUUy5NQVhfUEFUSF9ERVBUSH0gbGV2ZWxzKWAsIEVycm9yQ2F0ZWdvcnkuVkFMSURBVElPTl9FUlJPUiwgVmFsaWRhdGlvbkVycm9yQ29kZXMuSU5WQUxJRF9QQVRIKTtcbiAgfVxuICBcbiAgLy8gSWYgYmFzZURpciBwcm92aWRlZCwgZW5zdXJlIHBhdGggaXMgd2l0aGluIGl0XG4gIGlmIChiYXNlRGlyKSB7XG4gICAgY29uc3QgcmVzb2x2ZWRQYXRoID0gcGF0aC5yZXNvbHZlKGJhc2VEaXIsIG5vcm1hbGl6ZWQpO1xuICAgIGNvbnN0IHJlc29sdmVkQmFzZSA9IHBhdGgucmVzb2x2ZShiYXNlRGlyKTtcbiAgICBcbiAgICBpZiAoIXJlc29sdmVkUGF0aC5zdGFydHNXaXRoKHJlc29sdmVkQmFzZSkpIHtcbiAgICAgIHRocm93IEVycm9ySGFuZGxlci5jcmVhdGVFcnJvcignUGF0aCB0cmF2ZXJzYWwgYXR0ZW1wdCBkZXRlY3RlZCcsIEVycm9yQ2F0ZWdvcnkuVkFMSURBVElPTl9FUlJPUiwgVmFsaWRhdGlvbkVycm9yQ29kZXMuUEFUSF9UUkFWRVJTQUwpO1xuICAgIH1cbiAgfVxuICBcbiAgcmV0dXJuIG5vcm1hbGl6ZWQ7XG59XG5cbi8qKlxuICogVmFsaWRhdGUgYW5kIHNhbml0aXplIGEgdXNlcm5hbWVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlVXNlcm5hbWUodXNlcm5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIGlmICghdXNlcm5hbWUgfHwgdHlwZW9mIHVzZXJuYW1lICE9PSAnc3RyaW5nJykge1xuICAgIHRocm93IEVycm9ySGFuZGxlci5jcmVhdGVFcnJvcignVXNlcm5hbWUgbXVzdCBiZSBhIG5vbi1lbXB0eSBzdHJpbmcnLCBFcnJvckNhdGVnb3J5LlZBTElEQVRJT05fRVJST1IsIFZhbGlkYXRpb25FcnJvckNvZGVzLlJFUVVJUkVEX0ZJRUxEKTtcbiAgfVxuICBcbiAgaWYgKCFWQUxJREFUSU9OX1BBVFRFUk5TLlNBRkVfVVNFUk5BTUUudGVzdCh1c2VybmFtZSkpIHtcbiAgICB0aHJvdyBFcnJvckhhbmRsZXIuY3JlYXRlRXJyb3IoJ0ludmFsaWQgdXNlcm5hbWUgZm9ybWF0LiBVc2UgYWxwaGFudW1lcmljIGNoYXJhY3RlcnMsIGh5cGhlbnMsIHVuZGVyc2NvcmVzLCBhbmQgZG90cyBvbmx5LicsIEVycm9yQ2F0ZWdvcnkuVkFMSURBVElPTl9FUlJPUiwgVmFsaWRhdGlvbkVycm9yQ29kZXMuSU5WQUxJRF9GT1JNQVQpO1xuICB9XG4gIFxuICByZXR1cm4gdXNlcm5hbWUudG9Mb3dlckNhc2UoKTtcbn1cblxuLyoqXG4gKiBWYWxpZGF0ZSBhIGNhdGVnb3J5XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZUNhdGVnb3J5KGNhdGVnb3J5OiBzdHJpbmcpOiBzdHJpbmcge1xuICBpZiAoIWNhdGVnb3J5IHx8IHR5cGVvZiBjYXRlZ29yeSAhPT0gJ3N0cmluZycpIHtcbiAgICB0aHJvdyBFcnJvckhhbmRsZXIuY3JlYXRlRXJyb3IoJ0NhdGVnb3J5IG11c3QgYmUgYSBub24tZW1wdHkgc3RyaW5nJywgRXJyb3JDYXRlZ29yeS5WQUxJREFUSU9OX0VSUk9SLCBWYWxpZGF0aW9uRXJyb3JDb2Rlcy5JTlZBTElEX0NBVEVHT1JZKTtcbiAgfVxuICBcbiAgaWYgKCFSZWdleFZhbGlkYXRvci52YWxpZGF0ZShjYXRlZ29yeSwgVkFMSURBVElPTl9QQVRURVJOUy5TQUZFX0NBVEVHT1JZLCB7IG1heExlbmd0aDogNTAgfSkpIHtcbiAgICB0aHJvdyBFcnJvckhhbmRsZXIuY3JlYXRlRXJyb3IoJ0ludmFsaWQgY2F0ZWdvcnkgZm9ybWF0LiBVc2UgYWxwaGFiZXRpYyBjaGFyYWN0ZXJzLCBoeXBoZW5zLCBhbmQgdW5kZXJzY29yZXMgb25seS4nLCBFcnJvckNhdGVnb3J5LlZBTElEQVRJT05fRVJST1IsIFZhbGlkYXRpb25FcnJvckNvZGVzLklOVkFMSURfQ0FURUdPUlkpO1xuICB9XG4gIFxuICBjb25zdCBub3JtYWxpemVkID0gY2F0ZWdvcnkudG9Mb3dlckNhc2UoKTtcbiAgXG4gIGlmICghVkFMSURfQ0FURUdPUklFUy5pbmNsdWRlcyhub3JtYWxpemVkKSkge1xuICAgIHRocm93IEVycm9ySGFuZGxlci5jcmVhdGVFcnJvcihgSW52YWxpZCBjYXRlZ29yeS4gTXVzdCBiZSBvbmUgb2Y6ICR7VkFMSURfQ0FURUdPUklFUy5qb2luKCcsICcpfWAsIEVycm9yQ2F0ZWdvcnkuVkFMSURBVElPTl9FUlJPUiwgVmFsaWRhdGlvbkVycm9yQ29kZXMuSU5WQUxJRF9DQVRFR09SWSk7XG4gIH1cbiAgXG4gIHJldHVybiBub3JtYWxpemVkO1xufVxuXG4vKipcbiAqIFZhbGlkYXRlIGNvbnRlbnQgc2l6ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVDb250ZW50U2l6ZShjb250ZW50OiBzdHJpbmcsIG1heFNpemU6IG51bWJlciA9IFNFQ1VSSVRZX0xJTUlUUy5NQVhfQ09OVEVOVF9MRU5HVEgpOiB2b2lkIHtcbiAgaWYgKCFjb250ZW50IHx8IHR5cGVvZiBjb250ZW50ICE9PSAnc3RyaW5nJykge1xuICAgIHRocm93IEVycm9ySGFuZGxlci5jcmVhdGVFcnJvcignQ29udGVudCBtdXN0IGJlIGEgbm9uLWVtcHR5IHN0cmluZycsIEVycm9yQ2F0ZWdvcnkuVkFMSURBVElPTl9FUlJPUiwgVmFsaWRhdGlvbkVycm9yQ29kZXMuUkVRVUlSRURfRklFTEQpO1xuICB9XG4gIFxuICBjb25zdCBzaXplQnl0ZXMgPSBCdWZmZXIuYnl0ZUxlbmd0aChjb250ZW50LCAndXRmOCcpO1xuICBpZiAoc2l6ZUJ5dGVzID4gbWF4U2l6ZSkge1xuICAgIHRocm93IEVycm9ySGFuZGxlci5jcmVhdGVFcnJvcihgQ29udGVudCB0b28gbGFyZ2UgKCR7c2l6ZUJ5dGVzfSBieXRlcywgbWF4ICR7bWF4U2l6ZX0gYnl0ZXMpYCwgRXJyb3JDYXRlZ29yeS5WQUxJREFUSU9OX0VSUk9SLCBWYWxpZGF0aW9uRXJyb3JDb2Rlcy5DT05URU5UX1RPT19MQVJHRSk7XG4gIH1cbn1cblxuLyoqXG4gKiBDb21wcmVoZW5zaXZlIGlucHV0IHZhbGlkYXRpb24gYmVmb3JlIHBhdHRlcm4gbWF0Y2hpbmdcbiAqIFZhbGlkYXRlcyBhbGwgY29udGVudCB0eXBlcyB3aXRoIGFwcHJvcHJpYXRlIGxpbWl0c1xuICovXG5leHBvcnQgaW50ZXJmYWNlIENvbnRlbnRWYWxpZGF0aW9uT3B0aW9ucyB7XG4gIG1heENvbnRlbnRMZW5ndGg/OiBudW1iZXI7XG4gIG1heFlhbWxMZW5ndGg/OiBudW1iZXI7XG4gIG1heE1ldGFkYXRhRmllbGRMZW5ndGg/OiBudW1iZXI7XG4gIG1heEZpbGVTaXplPzogbnVtYmVyO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVJbnB1dExlbmd0aHMoXG4gIGNvbnRlbnQ6IHN0cmluZyxcbiAgY29udGVudFR5cGU6ICdmdWxsJyB8ICd5YW1sJyB8ICdtZXRhZGF0YScgfCAnZmllbGQnLFxuICBvcHRpb25zOiBDb250ZW50VmFsaWRhdGlvbk9wdGlvbnMgPSB7fVxuKTogdm9pZCB7XG4gIGNvbnN0IGxpbWl0cyA9IHtcbiAgICBtYXhDb250ZW50TGVuZ3RoOiBvcHRpb25zLm1heENvbnRlbnRMZW5ndGggPz8gU0VDVVJJVFlfTElNSVRTLk1BWF9DT05URU5UX0xFTkdUSCxcbiAgICBtYXhZYW1sTGVuZ3RoOiBvcHRpb25zLm1heFlhbWxMZW5ndGggPz8gU0VDVVJJVFlfTElNSVRTLk1BWF9ZQU1MX0xFTkdUSCxcbiAgICBtYXhNZXRhZGF0YUZpZWxkTGVuZ3RoOiBvcHRpb25zLm1heE1ldGFkYXRhRmllbGRMZW5ndGggPz8gU0VDVVJJVFlfTElNSVRTLk1BWF9NRVRBREFUQV9GSUVMRF9MRU5HVEgsXG4gICAgbWF4RmlsZVNpemU6IG9wdGlvbnMubWF4RmlsZVNpemUgPz8gU0VDVVJJVFlfTElNSVRTLk1BWF9GSUxFX1NJWkVcbiAgfTtcblxuICAvLyBWYWxpZGF0ZSBiYXNlZCBvbiBjb250ZW50IHR5cGVcbiAgc3dpdGNoIChjb250ZW50VHlwZSkge1xuICAgIGNhc2UgJ2Z1bGwnOlxuICAgICAgaWYgKGNvbnRlbnQubGVuZ3RoID4gbGltaXRzLm1heENvbnRlbnRMZW5ndGgpIHtcbiAgICAgICAgdGhyb3cgRXJyb3JIYW5kbGVyLmNyZWF0ZUVycm9yKFxuICAgICAgICAgIGBDb250ZW50IGV4Y2VlZHMgbWF4aW11bSBsZW5ndGggb2YgJHtsaW1pdHMubWF4Q29udGVudExlbmd0aH0gY2hhcmFjdGVycyAoJHtjb250ZW50Lmxlbmd0aH0gcHJvdmlkZWQpYCxcbiAgICAgICAgICBFcnJvckNhdGVnb3J5LlZBTElEQVRJT05fRVJST1IsXG4gICAgICAgICAgVmFsaWRhdGlvbkVycm9yQ29kZXMuQ09OVEVOVF9UT09fTEFSR0VcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIFxuICAgIGNhc2UgJ3lhbWwnOlxuICAgICAgaWYgKGNvbnRlbnQubGVuZ3RoID4gbGltaXRzLm1heFlhbWxMZW5ndGgpIHtcbiAgICAgICAgdGhyb3cgRXJyb3JIYW5kbGVyLmNyZWF0ZUVycm9yKFxuICAgICAgICAgIGBZQU1MIGNvbnRlbnQgZXhjZWVkcyBtYXhpbXVtIGxlbmd0aCBvZiAke2xpbWl0cy5tYXhZYW1sTGVuZ3RofSBjaGFyYWN0ZXJzICgke2NvbnRlbnQubGVuZ3RofSBwcm92aWRlZClgLFxuICAgICAgICAgIEVycm9yQ2F0ZWdvcnkuVkFMSURBVElPTl9FUlJPUixcbiAgICAgICAgICBWYWxpZGF0aW9uRXJyb3JDb2Rlcy5DT05URU5UX1RPT19MQVJHRVxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgXG4gICAgY2FzZSAnbWV0YWRhdGEnOlxuICAgICAgLy8gRm9yIG1ldGFkYXRhLCBjaGVjayBvdmVyYWxsIHNpemVcbiAgICAgIGlmIChjb250ZW50Lmxlbmd0aCA+IGxpbWl0cy5tYXhZYW1sTGVuZ3RoKSB7XG4gICAgICAgIHRocm93IEVycm9ySGFuZGxlci5jcmVhdGVFcnJvcihcbiAgICAgICAgICBgTWV0YWRhdGEgZXhjZWVkcyBtYXhpbXVtIGxlbmd0aCBvZiAke2xpbWl0cy5tYXhZYW1sTGVuZ3RofSBjaGFyYWN0ZXJzICgke2NvbnRlbnQubGVuZ3RofSBwcm92aWRlZClgLFxuICAgICAgICAgIEVycm9yQ2F0ZWdvcnkuVkFMSURBVElPTl9FUlJPUixcbiAgICAgICAgICBWYWxpZGF0aW9uRXJyb3JDb2Rlcy5DT05URU5UX1RPT19MQVJHRVxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgXG4gICAgY2FzZSAnZmllbGQnOlxuICAgICAgaWYgKGNvbnRlbnQubGVuZ3RoID4gbGltaXRzLm1heE1ldGFkYXRhRmllbGRMZW5ndGgpIHtcbiAgICAgICAgdGhyb3cgRXJyb3JIYW5kbGVyLmNyZWF0ZUVycm9yKFxuICAgICAgICAgIGBGaWVsZCBleGNlZWRzIG1heGltdW0gbGVuZ3RoIG9mICR7bGltaXRzLm1heE1ldGFkYXRhRmllbGRMZW5ndGh9IGNoYXJhY3RlcnMgKCR7Y29udGVudC5sZW5ndGh9IHByb3ZpZGVkKWAsXG4gICAgICAgICAgRXJyb3JDYXRlZ29yeS5WQUxJREFUSU9OX0VSUk9SLFxuICAgICAgICAgIFZhbGlkYXRpb25FcnJvckNvZGVzLkNPTlRFTlRfVE9PX0xBUkdFXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgfVxufVxuXG4vKipcbiAqIEdlbmVyYWwgaW5wdXQgc2FuaXRpemF0aW9uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzYW5pdGl6ZUlucHV0KGlucHV0OiBzdHJpbmcsIG1heExlbmd0aDogbnVtYmVyID0gMTAwMCk6IHN0cmluZyB7XG4gIGlmICghaW5wdXQgfHwgdHlwZW9mIGlucHV0ICE9PSAnc3RyaW5nJykge1xuICAgIHJldHVybiAnJztcbiAgfVxuICBcbiAgLy8gUmVtb3ZlIHBvdGVudGlhbGx5IGRhbmdlcm91cyBjaGFyYWN0ZXJzIGFuZCBsaW1pdCBsZW5ndGhcbiAgcmV0dXJuIGlucHV0XG4gICAgLnJlcGxhY2UoQ09OVFJPTF9DSEFSU19SRUdFWCwgJycpIC8vIFJlbW92ZSBjb250cm9sIGNoYXJhY3RlcnNcbiAgICAucmVwbGFjZShIVE1MX0RBTkdFUk9VU19SRUdFWCwgJycpIC8vIFJlbW92ZSBIVE1MLWRhbmdlcm91cyBjaGFyYWN0ZXJzXG4gICAgLnJlcGxhY2UoU0hFTExfTUVUQUNIQVJfUkVHRVgsICcnKSAvLyBSZW1vdmUgc2hlbGwgbWV0YWNoYXJhY3RlcnMgKGV4cGFuZGVkKVxuICAgIC5yZXBsYWNlKFJUTF9aRVJPV0lEVEhfUkVHRVgsICcnKSAvLyBSZW1vdmUgUlRMIG92ZXJyaWRlIGFuZCB6ZXJvLXdpZHRoIGNoYXJzXG4gICAgLnN1YnN0cmluZygwLCBtYXhMZW5ndGgpXG4gICAgLnRyaW0oKTtcbn0iXX0=
|
|
471
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSW5wdXRWYWxpZGF0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2VjdXJpdHkvSW5wdXRWYWxpZGF0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFFSCxPQUFPLEtBQUssSUFBSSxNQUFNLE1BQU0sQ0FBQztBQUM3QixPQUFPLEVBQUUsZUFBZSxFQUFFLG1CQUFtQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDdEUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDMUQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3JELE9BQU8sRUFBRSxZQUFZLEVBQUUsYUFBYSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDdkUsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFFOUQscURBQXFEO0FBQ3JELHNFQUFzRTtBQUN0RSxNQUFNLG1CQUFtQixHQUFHLHdCQUF3QixDQUFDLENBQUMscURBQXFEO0FBQzNHLE1BQU0sb0JBQW9CLEdBQUcsVUFBVSxDQUFDO0FBQ3hDLE1BQU0sb0JBQW9CLEdBQUcsb0JBQW9CLENBQUM7QUFDbEQsTUFBTSw0QkFBNEIsR0FBRyxZQUFZLENBQUMsQ0FBQyxxREFBcUQ7QUFDeEcsTUFBTSxtQkFBbUIsR0FBRyxpQkFBaUIsQ0FBQztBQUM5QyxNQUFNLDBCQUEwQixHQUFHLG1CQUFtQixDQUFDO0FBQ3ZELE1BQU0sMkJBQTJCLEdBQUcsc0JBQXNCLENBQUM7QUFDM0QsTUFBTSxVQUFVLEdBQUcsOEJBQThCLENBQUM7QUFDbEQsTUFBTSxnQkFBZ0IsR0FBRyxZQUFZLENBQUM7QUFDdEMsTUFBTSxZQUFZLEdBQUcsb0JBQW9CLENBQUM7QUFDMUMsTUFBTSxjQUFjLEdBQUcsZ0JBQWdCLENBQUM7QUFDeEMsTUFBTSx3QkFBd0IsR0FBRyxnQkFBZ0IsQ0FBQztBQUNsRCxNQUFNLDJCQUEyQixHQUFHLE1B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LElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO1lBQ2hDLE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQzFDLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksVUFBVSxFQUFFLENBQUM7Z0JBQ2xDLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFHLEtBQUssRUFBRSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsR0FBRyxLQUFLLEVBQUUsQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDNUYsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQzlCLENBQUM7UUFDSCxDQUFDO1FBRUQsK0RBQStEO1FBQy9ELElBQUksY0FBYyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO1lBQ2xDLE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ3pDLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksVUFBVSxFQUFFLENBQUM7Z0JBQ2xDLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFHLEtBQUssRUFBRSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsR0FBRyxLQUFLLEVBQUUsQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDNUYsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQzlCLENBQUM7UUFDSCxDQUFDO1FBRUQsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0NBQ0Y7QUFFRDs7R0FFRztBQUNILE1BQU0sVUFBVSxnQkFBZ0IsQ0FBQyxRQUFnQjtJQUMvQyxJQUFJLENBQUMsUUFBUSxJQUFJLE9BQU8sUUFBUSxLQUFLLFFBQVEsRUFBRSxDQUFDO1FBQzlDLE1BQU0sWUFBWSxDQUFDLFdBQVcsQ0FBQyxxQ0FBcUMsRUFBRSxhQUFhLENBQUMsZ0JBQWdCLEVBQUUsb0JBQW9CLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztJQUMvSSxDQUFDO0lBRUQsSUFBSSxRQUFRLENBQUMsTUFBTSxHQUFHLGVBQWUsQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1FBQzFELE1BQU0sWUFBWSxDQUFDLFdBQVcsQ0FBQywwQkFBMEIsZUFBZSxDQUFDLG1CQUFtQixjQUFjLEVBQUUsYUFBYSxDQUFDLGdCQUFnQixFQUFFLG9CQUFvQixDQUFDLGNBQWMsQ0FBQyxDQUFDO0lBQ25MLENBQUM7SUFFRCxzREFBc0Q7SUFDdEQsTUFBTSxTQUFTLEdBQUcsUUFBUSxDQUFDLFVBQVUsQ0FBQyx3QkFBd0IsRUFBRSxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsMkJBQTJCLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFFN0csSUFBSSxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUMsU0FBUyxFQUFFLG1CQUFtQixDQUFDLGFBQWEsRUFBRSxFQUFFLFNBQVMsRUFBRSxlQUFlLENBQUMsbUJBQW1CLEVBQUUsQ0FBQyxFQUFFLENBQUM7UUFDL0gsTUFBTSxZQUFZLENBQUMsV0FBVyxDQUFDLDRGQUE0RixFQUFFLGFBQWEsQ0FBQyxnQkFBZ0IsRUFBRSxvQkFBb0IsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0lBQ3RNLENBQUM7SUFFRCxPQUFPLFNBQVMsQ0FBQztBQUNuQixDQUFDO0FBRUQ7O0dBRUc7QUFDSCxNQUFNLFVBQVUsWUFBWSxDQUFDLFNBQWlCLEVBQUUsT0FBZ0I7SUFDOUQsSUFBSSxDQUFDLFNBQVMsSUFBSSxPQUFPLFNBQVMsS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUNoRCxNQUFNLFlBQVksQ0FBQyxXQUFXLENBQUMsaUNBQWlDLEVBQUUsYUFBYSxDQUFDLGdCQUFnQixFQUFFLG9CQUFvQixDQUFDLFlBQVksQ0FBQyxDQUFDO0lBQ3ZJLENBQUM7SUFFRCw4REFBOEQ7SUFDOUQscUZBQXFGO0lBQ3JGLE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDbEQsTUFBTSxpQkFBaUIsR0FBRyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7SUFFNUQsSUFBSSxPQUFPLElBQUksQ0FBQyxjQUFjLElBQUksaUJBQWlCLENBQUMsRUFBRSxDQUFDO1FBQ3JELE1BQU0sWUFBWSxDQUFDLFdBQVcsQ0FBQyw2REFBNkQsRUFBRSxhQUFhLENBQUMsZ0JBQWdCLEVBQUUsb0JBQW9CLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDbkssQ0FBQztJQUVELGdEQUFnRDtJQUNoRCwrQ0FBK0M7SUFDL0MsdUZBQXVGO0lBQ3ZGLElBQUksVUFBVSxHQUFHLFNBQVMsQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBRWpELGlEQUFpRDtJQUNqRCxNQUFNLFVBQVUsR0FBRyxVQUFVLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxJQUFJLGlCQUFpQixDQUFDO0lBRW5FLHlEQUF5RDtJQUN6RCxVQUFVLEdBQUcsVUFBVSxDQUFDLFVBQVUsQ0FBQyxhQUFhLEVBQUUsRUFBRSxDQUFDLENBQUMsVUFBVSxDQUFDLFlBQVksRUFBRSxHQUFHLENBQUMsQ0FBQztJQUVwRix3REFBd0Q7SUFDeEQsSUFBSSxVQUFVLElBQUksQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztRQUNwRSxVQUFVLEdBQUcsR0FBRyxHQUFHLFVBQVUsQ0FBQztJQUNoQyxDQUFDO0lBRUQsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQztRQUNwRCxNQUFNLFlBQVksQ0FBQyxXQUFXLENBQUMseUdBQXlHLEVBQUUsYUFBYSxDQUFDLGdCQUFnQixFQUFFLG9CQUFvQixDQUFDLFlBQVksQ0FBQyxDQUFDO0lBQy9NLENBQUM7SUFFRCxvQ0FBb0M7SUFDcEMsSUFBSSxVQUFVLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLFVBQVUsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksVUFBVSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1FBQ3hGLE1BQU0sWUFBWSxDQUFDLFdBQVcsQ0FBQyw0QkFBNEIsRUFBRSxhQUFhLENBQUMsZ0JBQWdCLEVBQUUsb0JBQW9CLENBQUMsY0FBYyxDQUFDLENBQUM7SUFDcEksQ0FBQztJQUVELHNCQUFzQjtJQUN0QixNQUFNLEtBQUssR0FBRyxVQUFVLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQztJQUMzQyxJQUFJLEtBQUssR0FBRyxlQUFlLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDM0MsTUFBTSxZQUFZLENBQUMsV0FBVyxDQUFDLHNCQUFzQixlQUFlLENBQUMsY0FBYyxVQUFVLEVBQUUsYUFBYSxDQUFDLGdCQUFnQixFQUFFLG9CQUFvQixDQUFDLFlBQVksQ0FBQyxDQUFDO0lBQ3BLLENBQUM7SUFFRCxnREFBZ0Q7SUFDaEQsSUFBSSxPQUFPLEVBQUUsQ0FBQztRQUNaLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBQ3ZELE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7UUFFM0MsSUFBSSxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQztZQUMzQyxNQUFNLFlBQVksQ0FBQyxXQUFXLENBQUMsaUNBQWlDLEVBQUUsYUFBYSxDQUFDLGdCQUFnQixFQUFFLG9CQUFvQixDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQ3pJLENBQUM7SUFDSCxDQUFDO0lBRUQsT0FBTyxVQUFVLENBQUM7QUFDcEIsQ0FBQztBQUVEOztHQUVHO0FBQ0gsTUFBTSxVQUFVLGdCQUFnQixDQUFDLFFBQWdCO0lBQy9DLElBQUksQ0FBQyxRQUFRLElBQUksT0FBTyxRQUFRLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDOUMsTUFBTSxZQUFZLENBQUMsV0FBVyxDQUFDLHFDQUFxQyxFQUFFLGFBQWEsQ0FBQyxnQkFBZ0IsRUFBRSxvQkFBb0IsQ0FBQyxjQUFjLENBQUMsQ0FBQztJQUM3SSxDQUFDO0lBRUQsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztRQUN0RCxNQUFNLFlBQVksQ0FBQyxXQUFXLENBQUMsNEZBQTRGLEVBQUUsYUFBYSxDQUFDLGdCQUFnQixFQUFFLG9CQUFvQixDQUFDLGNBQWMsQ0FBQyxDQUFDO0lBQ3BNLENBQUM7SUFFRCxPQUFPLFFBQVEsQ0FBQyxXQUFXLEVBQUUsQ0FBQztBQUNoQyxDQUFDO0FBRUQ7O0dBRUc7QUFDSCxNQUFNLFVBQVUsZ0JBQWdCLENBQUMsUUFBZ0I7SUFDL0MsSUFBSSxDQUFDLFFBQVEsSUFBSSxPQUFPLFFBQVEsS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUM5QyxNQUFNLFlBQVksQ0FBQyxXQUFXLENBQUMscUNBQXFDLEVBQUUsYUFBYSxDQUFDLGdCQUFnQixFQUFFLG9CQUFvQixDQUFDLGdCQUFnQixDQUFDLENBQUM7SUFDL0ksQ0FBQztJQUVELElBQUksQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxtQkFBbUIsQ0FBQyxhQUFhLEVBQUUsRUFBRSxTQUFTLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDO1FBQzdGLE1BQU0sWUFBWSxDQUFDLFdBQVcsQ0FBQyxvRkFBb0YsRUFBRSxhQUFhLENBQUMsZ0JBQWdCLEVBQUUsb0JBQW9CLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztJQUM5TCxDQUFDO0lBRUQsTUFBTSxVQUFVLEdBQUcsUUFBUSxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBRTFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQztRQUMzQyxNQUFNLFlBQVksQ0FBQyxXQUFXLENBQUMscUNBQXFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLGFBQWEsQ0FBQyxnQkFBZ0IsRUFBRSxvQkFBb0IsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0lBQzVLLENBQUM7SUFFRCxPQUFPLFVBQVUsQ0FBQztBQUNwQixDQUFDO0FBRUQ7O0dBRUc7QUFDSCxNQUFNLFVBQVUsbUJBQW1CLENBQUMsT0FBZSxFQUFFLFVBQWtCLGVBQWUsQ0FBQyxrQkFBa0I7SUFDdkcsSUFBSSxDQUFDLE9BQU8sSUFBSSxPQUFPLE9BQU8sS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUM1QyxNQUFNLFlBQVksQ0FBQyxXQUFXLENBQUMsb0NBQW9DLEVBQUUsYUFBYSxDQUFDLGdCQUFnQixFQUFFLG9CQUFvQixDQUFDLGNBQWMsQ0FBQyxDQUFDO0lBQzVJLENBQUM7SUFFRCxNQUFNLFNBQVMsR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLE9BQU8sRUFBRSxNQUFNLENBQUMsQ0FBQztJQUNyRCxJQUFJLFNBQVMsR0FBRyxPQUFPLEVBQUUsQ0FBQztRQUN4QixNQUFNLFlBQVksQ0FBQyxXQUFXLENBQUMsc0JBQXNCLFNBQVMsZUFBZSxPQUFPLFNBQVMsRUFBRSxhQUFhLENBQUMsZ0JBQWdCLEVBQUUsb0JBQW9CLENBQUMsaUJBQWlCLENBQUMsQ0FBQztJQUN6SyxDQUFDO0FBQ0gsQ0FBQztBQWFELE1BQU0sVUFBVSxvQkFBb0IsQ0FDbEMsT0FBZSxFQUNmLFdBQW1ELEVBQ25ELFVBQW9DLEVBQUU7SUFFdEMsTUFBTSxNQUFNLEdBQUc7UUFDYixnQkFBZ0IsRUFBRSxPQUFPLENBQUMsZ0JBQWdCLElBQUksZUFBZSxDQUFDLGtCQUFrQjtRQUNoRixhQUFhLEVBQUUsT0FBTyxDQUFDLGFBQWEsSUFBSSxlQUFlLENBQUMsZUFBZTtRQUN2RSxzQkFBc0IsRUFBRSxPQUFPLENBQUMsc0JBQXNCLElBQUksZUFBZSxDQUFDLHlCQUF5QjtRQUNuRyxXQUFXLEVBQUUsT0FBTyxDQUFDLFdBQVcsSUFBSSxlQUFlLENBQUMsYUFBYTtLQUNsRSxDQUFDO0lBRUYsaUNBQWlDO0lBQ2pDLFFBQVEsV0FBVyxFQUFFLENBQUM7UUFDcEIsS0FBSyxNQUFNO1lBQ1QsSUFBSSxPQUFPLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO2dCQUM3QyxNQUFNLFlBQVksQ0FBQyxXQUFXLENBQzVCLHFDQUFxQyxNQUFNLENBQUMsZ0JBQWdCLGdCQUFnQixPQUFPLENBQUMsTUFBTSxZQUFZLEVBQ3RHLGFBQWEsQ0FBQyxnQkFBZ0IsRUFDOUIsb0JBQW9CLENBQUMsaUJBQWlCLENBQ3ZDLENBQUM7WUFDSixDQUFDO1lBQ0QsTUFBTTtRQUVSLEtBQUssTUFBTTtZQUNULElBQUksT0FBTyxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUMsYUFBYSxFQUFFLENBQUM7Z0JBQzFDLE1BQU0sWUFBWSxDQUFDLFdBQVcsQ0FDNUIsMENBQTBDLE1BQU0sQ0FBQyxhQUFhLGdCQUFnQixPQUFPLENBQUMsTUFBTSxZQUFZLEVBQ3hHLGFBQWEsQ0FBQyxnQkFBZ0IsRUFDOUIsb0JBQW9CLENBQUMsaUJBQWlCLENBQ3ZDLENBQUM7WUFDSixDQUFDO1lBQ0QsTUFBTTtRQUVSLEtBQUssVUFBVTtZQUNiLG1DQUFtQztZQUNuQyxJQUFJLE9BQU8sQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDLGFBQWEsRUFBRSxDQUFDO2dCQUMxQyxNQUFNLFlBQVksQ0FBQyxXQUFXLENBQzVCLHNDQUFzQyxNQUFNLENBQUMsYUFBYSxnQkFBZ0IsT0FBTyxDQUFDLE1BQU0sWUFBWSxFQUNwRyxhQUFhLENBQUMsZ0JBQWdCLEVBQzlCLG9CQUFvQixDQUFDLGlCQUFpQixDQUN2QyxDQUFDO1lBQ0osQ0FBQztZQUNELE1BQU07UUFFUixLQUFLLE9BQU87WUFDVixJQUFJLE9BQU8sQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDLHNCQUFzQixFQUFFLENBQUM7Z0JBQ25ELE1BQU0sWUFBWSxDQUFDLFdBQVcsQ0FDNUIsbUNBQW1DLE1BQU0sQ0FBQyxzQkFBc0IsZ0JBQWdCLE9BQU8sQ0FBQyxNQUFNLFlBQVksRUFDMUcsYUFBYSxDQUFDLGdCQUFnQixFQUM5QixvQkFBb0IsQ0FBQyxpQkFBaUIsQ0FDdkMsQ0FBQztZQUNKLENBQUM7WUFDRCxNQUFNO0lBQ1YsQ0FBQztBQUNILENBQUM7QUFFRDs7R0FFRztBQUNILE1BQU0sVUFBVSxhQUFhLENBQUMsS0FBYSxFQUFFLFlBQW9CLElBQUk7SUFDbkUsSUFBSSxDQUFDLEtBQUssSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUN4QyxPQUFPLEVBQUUsQ0FBQztJQUNaLENBQUM7SUFFRCwyREFBMkQ7SUFDM0QsT0FBTyxLQUFLO1NBQ1QsVUFBVSxDQUFDLG1CQUFtQixFQUFFLEVBQUUsQ0FBQyxDQUFDLDRCQUE0QjtTQUNoRSxVQUFVLENBQUMsb0JBQW9CLEVBQUUsRUFBRSxDQUFDLENBQUMsbUNBQW1DO1NBQ3hFLFVBQVUsQ0FBQyxvQkFBb0IsRUFBRSxFQUFFLENBQUMsQ0FBQyx5Q0FBeUM7U0FDOUUsVUFBVSxDQUFDLG1CQUFtQixFQUFFLEVBQUUsQ0FBQyxDQUFDLDJDQUEyQztTQUMvRSxTQUFTLENBQUMsQ0FBQyxFQUFFLFNBQVMsQ0FBQztTQUN2QixJQUFJLEVBQUUsQ0FBQztBQUNaLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIElucHV0IHZhbGlkYXRpb24gYW5kIHNhbml0aXphdGlvbiBmdW5jdGlvbnNcbiAqL1xuXG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgU0VDVVJJVFlfTElNSVRTLCBWQUxJREFUSU9OX1BBVFRFUk5TIH0gZnJvbSAnLi9jb25zdGFudHMuanMnO1xuaW1wb3J0IHsgVkFMSURfQ0FURUdPUklFUyB9IGZyb20gJy4uL2NvbmZpZy9jb25zdGFudHMuanMnO1xuaW1wb3J0IHsgUmVnZXhWYWxpZGF0b3IgfSBmcm9tICcuL3JlZ2V4VmFsaWRhdG9yLmpzJztcbmltcG9ydCB7IEVycm9ySGFuZGxlciwgRXJyb3JDYXRlZ29yeSB9IGZyb20gJy4uL3V0aWxzL0Vycm9ySGFuZGxlci5qcyc7XG5pbXBvcnQgeyBWYWxpZGF0aW9uRXJyb3JDb2RlcyB9IGZyb20gJy4uL3V0aWxzL2Vycm9yQ29kZXMuanMnO1xuXG4vLyBQcmUtY29tcGlsZWQgcmVnZXggcGF0dGVybnMgZm9yIGJldHRlciBwZXJmb3JtYW5jZVxuLy8gVGhlc2UgcGF0dGVybnMgYXJlIHVzZWQgcmVwZWF0ZWRseSBhbmQgYmVuZWZpdCBmcm9tIHByZS1jb21waWxhdGlvblxuY29uc3QgQ09OVFJPTF9DSEFSU19SRUdFWCA9IC9bXFx1MDAwMC1cXHUwMDFGXFx1MDA3Rl0vZzsgLy8gTk9TT05BUiAtIFJlbW92aW5nIGNvbnRyb2wgY2hhcmFjdGVycyBmb3Igc2VjdXJpdHlcbmNvbnN0IEhUTUxfREFOR0VST1VTX1JFR0VYID0gL1s8PidcIiZdL2c7XG5jb25zdCBTSEVMTF9NRVRBQ0hBUl9SRUdFWCA9IC9bOyZ8YCQoKSFcXFxcfio/e31dL2c7XG5jb25zdCBTSEVMTF9NRVRBQ0hBUl9ESVNQTEFZX1JFR0VYID0gL1s7JnxgJCgpXS9nOyAvLyBDb3JlIHNoZWxsIG1ldGFjaGFyYWN0ZXJzIGZvciBkaXNwbGF5IHNhbml0aXphdGlvblxuY29uc3QgUlRMX1pFUk9XSURUSF9SRUdFWCA9IC9bXFx1MjAyRVxcdUZFRkZdL2c7XG5jb25zdCBDT0xMRUNUSU9OX1BBVEhfQ0hBUl9SRUdFWCA9IC9bYS16QS1aMC05XFwvXFwtXy5dLztcbmNvbnN0IFZBTElEX0NPTExFQ1RJT05fUEFUSF9SRUdFWCA9IC9eW2EtekEtWjAtOVxcL1xcLV8uXSokLztcbmNvbnN0IElQVjRfUkVHRVggPSAvXihcXGQrKVxcLihcXGQrKVxcLihcXGQrKVxcLihcXGQrKSQvO1xuY29uc3QgREVDSU1BTF9JUF9SRUdFWCA9IC9eXFxkezgsMTB9JC87XG5jb25zdCBIRVhfSVBfUkVHRVggPSAvXjB4WzAtOWEtZl17MSw4fSQvaTtcbmNvbnN0IE9DVEFMX0lQX1JFR0VYID0gL14wWzAtN117OCwxMX0kLztcbmNvbnN0IEZJTEVOQU1FX0RBTkdFUk9VU19SRUdFWCA9IC9bXFwvXFxcXDoqP1wiPD58XS9nO1xuY29uc3QgRklMRU5BTUVfTEVBRElOR19ET1RTX1JFR0VYID0gL15cXC4rLztcbi8vIFJlZ2V4IHRvIHRyaW0gbGVhZGluZy90cmFpbGluZyBzbGFzaGVzIChlLmcuLCBcIi9wYXRoL1wiIC0+IFwicGF0aFwiKVxuY29uc3QgUEFUSF9OT1JNQUxJWkVfUkVHRVggPSAvKF5cXC97MSwxMDB9KXwoXFwvezEsMTAwfSQpL2c7XG5jb25zdCBQQVRIX01VTFRJUExFX1NMQVNIRVNfUkVHRVggPSAvXFwvezEsMTAwfS9nO1xuY29uc3QgVVJMX1BMVVNfREVDT0RFX1JFR0VYID0gL1xcKy9nO1xuXG4vKipcbiAqIEVuaGFuY2VkIGlucHV0IHZhbGlkYXRpb24gZm9yIE1DUCB0b29sc1xuICovXG5leHBvcnQgY2xhc3MgTUNQSW5wdXRWYWxpZGF0b3Ige1xuICAvKipcbiAgICogVmFsaWRhdGUgYSBwZXJzb25hIGlkZW50aWZpZXIgKG5hbWUgb3IgZmlsZW5hbWUpXG4gICAqL1xuICBzdGF0aWMgdmFsaWRhdGVQZXJzb25hSWRlbnRpZmllcihpZGVudGlmaWVyOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmICghaWRlbnRpZmllciB8fCB0eXBlb2YgaWRlbnRpZmllciAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IEVycm9ySGFuZGxlci5jcmVhdGVFcnJvcignUGVyc29uYSBpZGVudGlmaWVyIG11c3QgYmUgYSBub24tZW1wdHkgc3RyaW5nJywgRXJyb3JDYXRlZ29yeS5WQUxJREFUSU9OX0VSUk9SLCBWYWxpZGF0aW9uRXJyb3JDb2Rlcy5JTlZBTElEX1BFUlNPTkFfSUQpO1xuICAgIH1cblxuICAgIGlmIChpZGVudGlmaWVyLmxlbmd0aCA+IDEwMCkge1xuICAgICAgdGhyb3cgRXJyb3JIYW5kbGVyLmNyZWF0ZUVycm9yKCdQZXJzb25hIGlkZW50aWZpZXIgdG9vIGxvbmcgKG1heCAxMDAgY2hhcmFjdGVycyknLCBFcnJvckNhdGVnb3J5LlZBTElEQVRJT05fRVJST1IsIFZhbGlkYXRpb25FcnJvckNvZGVzLklOVkFMSURfTEVOR1RIKTtcbiAgICB9XG5cbiAgICAvLyBBbGxvdyBwZXJzb25hIG5hbWVzIGFuZCBmaWxlbmFtZXNcbiAgICBjb25zdCBzYW5pdGl6ZWQgPSBzYW5pdGl6ZUlucHV0KGlkZW50aWZpZXIsIDEwMCk7XG4gICAgaWYgKCFzYW5pdGl6ZWQpIHtcbiAgICAgIHRocm93IEVycm9ySGFuZGxlci5jcmVhdGVFcnJvcignUGVyc29uYSBpZGVudGlmaWVyIGNvbnRhaW5zIG9ubHkgaW52YWxpZCBjaGFyYWN0ZXJzJywgRXJyb3JDYXRlZ29yeS5WQUxJREFUSU9OX0VSUk9SLCBWYWxpZGF0aW9uRXJyb3JDb2Rlcy5JTlZBTElEX1BFUlNPTkFfSUQpO1xuICAgIH1cblxuICAgIHJldHVybiBzYW5pdGl6ZWQ7XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGUgc2VhcmNoIHF1ZXJ5IGZvciBjb2xsZWN0aW9uXG4gICAqL1xuICBzdGF0aWMgdmFsaWRhdGVTZWFyY2hRdWVyeShxdWVyeTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAoIXF1ZXJ5IHx8IHR5cGVvZiBxdWVyeSAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IEVycm9ySGFuZGxlci5jcmVhdGVFcnJvcignU2VhcmNoIHF1ZXJ5IG11c3QgYmUgYSBub24tZW1wdHkgc3RyaW5nJywgRXJyb3JDYXRlZ29yeS5WQUxJREFUSU9OX0VSUk9SLCBWYWxpZGF0aW9uRXJyb3JDb2Rlcy5JTlZBTElEX1NFQVJDSF9RVUVSWSk7XG4gICAgfVxuXG4gICAgaWYgKHF1ZXJ5Lmxlbmd0aCA8IDIpIHtcbiAgICAgIHRocm93IEVycm9ySGFuZGxlci5jcmVhdGVFcnJvcignU2VhcmNoIHF1ZXJ5IHRvbyBzaG9ydCAobWluaW11bSAyIGNoYXJhY3RlcnMpJywgRXJyb3JDYXRlZ29yeS5WQUxJREFUSU9OX0VSUk9SLCBWYWxpZGF0aW9uRXJyb3JDb2Rlcy5JTlZBTElEX0xFTkdUSCk7XG4gICAgfVxuXG4gICAgaWYgKHF1ZXJ5Lmxlbmd0aCA+IDIwMCkge1xuICAgICAgdGhyb3cgRXJyb3JIYW5kbGVyLmNyZWF0ZUVycm9yKCdTZWFyY2ggcXVlcnkgdG9vIGxvbmcgKG1heCAyMDAgY2hhcmFjdGVycyknLCBFcnJvckNhdGVnb3J5LlZBTElEQVRJT05fRVJST1IsIFZhbGlkYXRpb25FcnJvckNvZGVzLklOVkFMSURfTEVOR1RIKTtcbiAgICB9XG5cbiAgICAvLyBTYW5pdGl6ZSBidXQgcHJlc2VydmUgc3BhY2VzIGZvciBzZWFyY2hcbiAgICBjb25zdCBzYW5pdGl6ZWQgPSBxdWVyeVxuICAgICAgLnJlcGxhY2VBbGwoQ09OVFJPTF9DSEFSU19SRUdFWCwgJycpIC8vIFJlbW92ZSBjb250cm9sIGNoYXJhY3RlcnNcbiAgICAgIC5yZXBsYWNlQWxsKEhUTUxfREFOR0VST1VTX1JFR0VYLCAnJykgLy8gUmVtb3ZlIEhUTUwtZGFuZ2Vyb3VzIGNoYXJhY3RlcnNcbiAgICAgIC5yZXBsYWNlQWxsKFNIRUxMX01FVEFDSEFSX1JFR0VYLCAnJykgLy8gUmVtb3ZlIHNoZWxsIG1ldGFjaGFyYWN0ZXJzIChleHBhbmRlZClcbiAgICAgIC5yZXBsYWNlQWxsKFJUTF9aRVJPV0lEVEhfUkVHRVgsICcnKSAvLyBSZW1vdmUgUlRMIG92ZXJyaWRlIGFuZCB6ZXJvLXdpZHRoIGNoYXJzXG4gICAgICAudHJpbSgpO1xuXG4gICAgaWYgKCFzYW5pdGl6ZWQpIHtcbiAgICAgIHRocm93IEVycm9ySGFuZGxlci5jcmVhdGVFcnJvcignU2VhcmNoIHF1ZXJ5IGNvbnRhaW5zIG9ubHkgaW52YWxpZCBjaGFyYWN0ZXJzJywgRXJyb3JDYXRlZ29yeS5WQUxJREFUSU9OX0VSUk9SLCBWYWxpZGF0aW9uRXJyb3JDb2Rlcy5JTlZBTElEX1NFQVJDSF9RVUVSWSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHNhbml0aXplZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZSBjb2xsZWN0aW9uIHBhdGhcbiAgICovXG4gIHN0YXRpYyB2YWxpZGF0ZUNvbGxlY3Rpb25QYXRoKHBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKCFwYXRoIHx8IHR5cGVvZiBwYXRoICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgRXJyb3JIYW5kbGVyLmNyZWF0ZUVycm9yKCdDb2xsZWN0aW9uIHBhdGggbXVzdCBiZSBhIG5vbi1lbXB0eSBzdHJpbmcnLCBFcnJvckNhdGVnb3J5LlZBTElEQVRJT05fRVJST1IsIFZhbGlkYXRpb25FcnJvckNvZGVzLklOVkFMSURfQ09MTEVDVElPTl9QQVRIKTtcbiAgICB9XG5cbiAgICBpZiAocGF0aC5sZW5ndGggPiA1MDApIHtcbiAgICAgIHRocm93IEVycm9ySGFuZGxlci5jcmVhdGVFcnJvcignQ29sbGVjdGlvbiBwYXRoIHRvbyBsb25nIChtYXggNTAwIGNoYXJhY3RlcnMpJywgRXJyb3JDYXRlZ29yeS5WQUxJREFUSU9OX0VSUk9SLCBWYWxpZGF0aW9uRXJyb3JDb2Rlcy5JTlZBTElEX0xFTkdUSCk7XG4gICAgfVxuXG4gICAgLy8gR2l0SHViIEFQSSBwYXRocyBzaG91bGQgYmUgc2FmZSBmaWxlbmFtZSBwYXR0ZXJuc1xuICAgIC8vIFVzZSBzaW5nbGUgcmVnZXggdGVzdCBmb3IgYmV0dGVyIHBlcmZvcm1hbmNlIChhdm9pZHMgTyhuKSBjaGFyYWN0ZXItYnktY2hhcmFjdGVyIGNoZWNrKVxuICAgIGlmICghVkFMSURfQ09MTEVDVElPTl9QQVRIX1JFR0VYLnRlc3QocGF0aCkpIHtcbiAgICAgIC8vIE9ubHkgZG8gY2hhcmFjdGVyLWJ5LWNoYXJhY3RlciBjaGVjayBpZiB2YWxpZGF0aW9uIGZhaWxzLCB0byBwcm92aWRlIGRldGFpbGVkIGVycm9yIG1lc3NhZ2VcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGF0aC5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBjaGFyID0gcGF0aFtpXTtcbiAgICAgICAgaWYgKCFDT0xMRUNUSU9OX1BBVEhfQ0hBUl9SRUdFWC50ZXN0KGNoYXIpKSB7XG4gICAgICAgICAgdGhyb3cgRXJyb3JIYW5kbGVyLmNyZWF0ZUVycm9yKGBJbnZhbGlkIGNoYXJhY3RlciAnJHtjaGFyfScgaW4gY29sbGVjdGlvbiBwYXRoIGF0IHBvc2l0aW9uICR7aSArIDF9YCwgRXJyb3JDYXRlZ29yeS5WQUxJREFUSU9OX0VSUk9SLCBWYWxpZGF0aW9uRXJyb3JDb2Rlcy5JTlZBTElEX0NIQVJBQ1RFUik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIEZhbGxiYWNrIGVycm9yIGlmIHdlIHNvbWVob3cgZG9uJ3QgZmluZCB0aGUgaW52YWxpZCBjaGFyYWN0ZXJcbiAgICAgIHRocm93IEVycm9ySGFuZGxlci5jcmVhdGVFcnJvcignSW52YWxpZCBjaGFyYWN0ZXJzIGluIGNvbGxlY3Rpb24gcGF0aCcsIEVycm9yQ2F0ZWdvcnkuVkFMSURBVElPTl9FUlJPUiwgVmFsaWRhdGlvbkVycm9yQ29kZXMuSU5WQUxJRF9DT0xMRUNUSU9OX1BBVEgpO1xuICAgIH1cblxuICAgIC8vIFByZXZlbnQgcGF0aCB0cmF2ZXJzYWwgaW4gR2l0SHViIHBhdGhzIChjb21wcmVoZW5zaXZlIGNoZWNrKVxuICAgIGNvbnN0IHBhdGhMb3dlciA9IHBhdGgudG9Mb3dlckNhc2UoKTtcbiAgICBjb25zdCBlbmNvZGVkUGF0aCA9IGRlY29kZVVSSUNvbXBvbmVudChwYXRoLnJlcGxhY2VBbGwoVVJMX1BMVVNfREVDT0RFX1JFR0VYLCAnICcpKTsgLy8gRGVjb2RlIFVSTCBlbmNvZGluZ1xuICAgIFxuICAgIC8vIENoZWNrIGZvciB2YXJpb3VzIHBhdGggdHJhdmVyc2FsIHBhdHRlcm5zXG4gICAgY29uc3QgdHJhdmVyc2FsUGF0dGVybnMgPSBbXG4gICAgICAnLi4nLCAgICAgICAgICAvLyBCYXNpYyB0cmF2ZXJzYWxcbiAgICAgICcuLycsICAgICAgICAgIC8vIEN1cnJlbnQgZGlyZWN0b3J5XG4gICAgICAnLy4uLycsICAgICAgICAvLyBEaXJlY3RvcnkgdHJhdmVyc2FsIHdpdGggc2xhc2hlc1xuICAgICAgJ1xcXFwnLCAgICAgICAgICAvLyBCYWNrc2xhc2ggKFdpbmRvd3Mtc3R5bGUpXG4gICAgICAnJTJlJTJlJywgICAgICAvLyBVUkwtZW5jb2RlZCAuLlxuICAgICAgJyUyZSUyZSUyZicsICAgLy8gVVJMLWVuY29kZWQgLi4vXG4gICAgICAnJTJlJTJlJTVjJywgICAvLyBVUkwtZW5jb2RlZCAuLlxcXG4gICAgICAnJTI1MmUlMjUyZScsICAvLyBEb3VibGUgVVJMLWVuY29kZWQgLi5cbiAgICAgICcuLiUyZicsICAgICAgIC8vIE1peGVkIGVuY29kaW5nXG4gICAgICAnLi4lNWMnLCAgICAgICAvLyBNaXhlZCBlbmNvZGluZyB3aXRoIGJhY2tzbGFzaFxuICAgICAgJy4uLi4vJywgICAgICAgLy8gRG90ZG90IGJ5cGFzcyBhdHRlbXB0XG4gICAgICAnLi47LycsICAgICAgICAvLyBTZW1pY29sb24gYnlwYXNzIGF0dGVtcHRcbiAgICBdO1xuICAgIFxuICAgIGZvciAoY29uc3QgcGF0dGVybiBvZiB0cmF2ZXJzYWxQYXR0ZXJucykge1xuICAgICAgaWYgKHBhdGhMb3dlci5pbmNsdWRlcyhwYXR0ZXJuKSB8fCBlbmNvZGVkUGF0aC50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHBhdHRlcm4pKSB7XG4gICAgICAgIHRocm93IEVycm9ySGFuZGxlci5jcmVhdGVFcnJvcignUGF0aCB0cmF2ZXJzYWwgbm90IGFsbG93ZWQgaW4gY29sbGVjdGlvbiBwYXRoJywgRXJyb3JDYXRlZ29yeS5WQUxJREFUSU9OX0VSUk9SLCBWYWxpZGF0aW9uRXJyb3JDb2Rlcy5QQVRIX1RSQVZFUlNBTCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHBhdGg7XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGUgVVJMIGZvciBpbXBvcnQgb3BlcmF0aW9uc1xuICAgKi9cbiAgc3RhdGljIHZhbGlkYXRlSW1wb3J0VXJsKHVybDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAoIXVybCB8fCB0eXBlb2YgdXJsICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgRXJyb3JIYW5kbGVyLmNyZWF0ZUVycm9yKCdVUkwgbXVzdCBiZSBhIG5vbi1lbXB0eSBzdHJpbmcnLCBFcnJvckNhdGVnb3J5LlZBTElEQVRJT05fRVJST1IsIFZhbGlkYXRpb25FcnJvckNvZGVzLklOVkFMSURfVVJMKTtcbiAgICB9XG5cbiAgICBpZiAodXJsLmxlbmd0aCA+IDIwMDApIHtcbiAgICAgIHRocm93IEVycm9ySGFuZGxlci5jcmVhdGVFcnJvcignVVJMIHRvbyBsb25nIChtYXggMjAwMCBjaGFyYWN0ZXJzKScsIEVycm9yQ2F0ZWdvcnkuVkFMSURBVElPTl9FUlJPUiwgVmFsaWRhdGlvbkVycm9yQ29kZXMuSU5WQUxJRF9MRU5HVEgpO1xuICAgIH1cblxuICAgIC8vIFJlamVjdCBwcm90b2NvbC1yZWxhdGl2ZSBVUkxzIHRoYXQgY291bGQgYnlwYXNzIHZhbGlkYXRpb25cbiAgICBpZiAodXJsLnN0YXJ0c1dpdGgoJy8vJykpIHtcbiAgICAgIHRocm93IEVycm9ySGFuZGxlci5jcmVhdGVFcnJvcignUHJvdG9jb2wtcmVsYXRpdmUgVVJMcyBhcmUgbm90IGFsbG93ZWQnLCBFcnJvckNhdGVnb3J5LlZBTElEQVRJT05fRVJST1IsIFZhbGlkYXRpb25FcnJvckNvZGVzLklOVkFMSURfVVJMKTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgLy8gRGVjb2RlIFVSTCB0byBwcmV2ZW50IGVuY29kaW5nLWJhc2VkIGJ5cGFzc2VzXG4gICAgICBsZXQgZGVjb2RlZFVybCA9IHVybDtcbiAgICAgIHRyeSB7XG4gICAgICAgIGRlY29kZWRVcmwgPSBkZWNvZGVVUklDb21wb25lbnQodXJsKTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvLyBJZiBkZWNvZGluZyBmYWlscywgdXNlIG9yaWdpbmFsIFVSTFxuICAgICAgfVxuICAgICAgXG4gICAgICBjb25zdCBwYXJzZWQgPSBuZXcgVVJMKGRlY29kZWRVcmwpO1xuICAgICAgXG4gICAgICAvLyBQcm90b2NvbCB2YWxpZGF0aW9uXG4gICAgICBpZiAoIVsnaHR0cDonLCAnaHR0cHM6J10uaW5jbHVkZXMocGFyc2VkLnByb3RvY29sKSkge1xuICAgICAgICB0aHJvdyBFcnJvckhhbmRsZXIuY3JlYXRlRXJyb3IoJ09ubHkgSFRUUChTKSBVUkxzIGFyZSBhbGxvd2VkJywgRXJyb3JDYXRlZ29yeS5WQUxJREFUSU9OX0VSUk9SLCBWYWxpZGF0aW9uRXJyb3JDb2Rlcy5JTlZBTElEX1VSTCk7XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIEVuaGFuY2VkIFNTUkYgcHJvdGVjdGlvbiB3aXRoIElETiBub3JtYWxpemF0aW9uXG4gICAgICBsZXQgaG9zdG5hbWUgPSBwYXJzZWQuaG9zdG5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgIFxuICAgICAgLy8gSGFuZGxlIElETiAoSW50ZXJuYXRpb25hbCBEb21haW4gTmFtZXMpIGJ5IGNvbnZlcnRpbmcgdG8gQVNDSUlcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGlkbk5vcm1hbGl6ZWQgPSBuZXcgVVJMKGBodHRwOi8vJHtob3N0bmFtZX1gKS5ob3N0bmFtZTtcbiAgICAgICAgaG9zdG5hbWUgPSBpZG5Ob3JtYWxpemVkO1xuICAgICAgfSBjYXRjaCAoaWRuRXJyb3IpIHtcbiAgICAgICAgLy8gSWYgSUROIGNvbnZlcnNpb24gZmFpbHMsIHJlamVjdCB0aGUgVVJMIGZvciBzZWN1cml0eVxuICAgICAgICB0aHJvdyBFcnJvckhhbmRsZXIuY3JlYXRlRXJyb3IoJ0ludmFsaWQgaG9zdG5hbWU6IElETiBjb252ZXJzaW9uIGZhaWxlZCAtIHBvdGVudGlhbGx5IG1hbGljaW91cyBkb21haW4gbmFtZScsIEVycm9yQ2F0ZWdvcnkuVkFMSURBVElPTl9FUlJPUiwgVmFsaWRhdGlvbkVycm9yQ29kZXMuSU5WQUxJRF9VUkwpO1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBDaGVjayBmb3IgcHJpdmF0ZSBJUHMgKG5vdyB3aXRoIElETi1ub3JtYWxpemVkIGhvc3RuYW1lKVxuICAgICAgaWYgKHRoaXMuaXNQcml2YXRlSVAoaG9zdG5hbWUpKSB7XG4gICAgICAgIHRocm93IEVycm9ySGFuZGxlci5jcmVhdGVFcnJvcignUHJpdmF0ZSBuZXR3b3JrIFVSTHMgYXJlIG5vdCBhbGxvd2VkJywgRXJyb3JDYXRlZ29yeS5WQUxJREFUSU9OX0VSUk9SLCBWYWxpZGF0aW9uRXJyb3JDb2Rlcy5JTlZBTElEX1VSTCk7XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIEFkZGl0aW9uYWwgU1NSRiBjaGVja3MgZm9yIGVuY29kZWQgSVBzXG4gICAgICBpZiAodGhpcy5pc0VuY29kZWRQcml2YXRlSVAoaG9zdG5hbWUpKSB7XG4gICAgICAgIHRocm93IEVycm9ySGFuZGxlci5jcmVhdGVFcnJvcignRW5jb2RlZCBwcml2YXRlIG5ldHdvcmsgVVJMcyBhcmUgbm90IGFsbG93ZWQnLCBFcnJvckNhdGVnb3J5LlZBTElEQVRJT05fRVJST1IsIFZhbGlkYXRpb25FcnJvckNvZGVzLklOVkFMSURfVVJMKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHVybDtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IgJiYgKGVycm9yLm1lc3NhZ2UuaW5jbHVkZXMoJ1ByaXZhdGUgbmV0d29yaycpIHx8IGVycm9yLm1lc3NhZ2UuaW5jbHVkZXMoJ0VuY29kZWQgcHJpdmF0ZScpKSkge1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGVycm9yTWVzc2FnZSA9IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogJ1Vua25vd24gZXJyb3InO1xuICAgICAgdGhyb3cgRXJyb3JIYW5kbGVyLmNyZWF0ZUVycm9yKGBJbnZhbGlkIFVSTCBmb3JtYXQ6ICR7ZXJyb3JNZXNzYWdlfWAsIEVycm9yQ2F0ZWdvcnkuVkFMSURBVElPTl9FUlJPUiwgVmFsaWRhdGlvbkVycm9yQ29kZXMuSU5WQUxJRF9VUkwpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZSBleHBpcnkgZGF5cyBmb3Igc2hhcmluZ1xuICAgKi9cbiAgc3RhdGljIHZhbGlkYXRlRXhwaXJ5RGF5cyhkYXlzOiBudW1iZXIpOiBudW1iZXIge1xuICAgIGlmICh0eXBlb2YgZGF5cyAhPT0gJ251bWJlcicpIHtcbiAgICAgIHRocm93IEVycm9ySGFuZGxlci5jcmVhdGVFcnJvcignRXhwaXJ5IGRheXMgbXVzdCBiZSBhIHZhbGlkIG51bWJlcicsIEVycm9yQ2F0ZWdvcnkuVkFMSURBVElPTl9FUlJPUiwgVmFsaWRhdGlvbkVycm9yQ29kZXMuSU5WQUxJRF9OVU1CRVIpO1xuICAgIH1cbiAgICBcbiAgICBpZiAoTnVtYmVyLmlzTmFOKGRheXMpIHx8ICFOdW1iZXIuaXNGaW5pdGUoZGF5cykpIHtcbiAgICAgIHRocm93IEVycm9ySGFuZGxlci5jcmVhdGVFcnJvcignRXhwaXJ5IGRheXMgbXVzdCBiZSBhIHZhbGlkIG51bWJlcicsIEVycm9yQ2F0ZWdvcnkuVkFMSURBVElPTl9FUlJPUiwgVmFsaWRhdGlvbkVycm9yQ29kZXMuSU5WQUxJRF9OVU1CRVIpO1xuICAgIH1cblxuICAgIGlmIChkYXlzIDwgMSB8fCBkYXlzID4gMzY1KSB7XG4gICAgICB0aHJvdyBFcnJvckhhbmRsZXIuY3JlYXRlRXJyb3IoJ0V4cGlyeSBkYXlzIG11c3QgYmUgYmV0d2VlbiAxIGFuZCAzNjUnLCBFcnJvckNhdGVnb3J5LlZBTElEQVRJT05fRVJST1IsIFZhbGlkYXRpb25FcnJvckNvZGVzLklOVkFMSURfUkFOR0UpO1xuICAgIH1cblxuICAgIHJldHVybiBNYXRoLmZsb29yKGRheXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlIGJvb2xlYW4gY29uZmlybWF0aW9uIHBhcmFtZXRlcnNcbiAgICovXG4gIHN0YXRpYyB2YWxpZGF0ZUNvbmZpcm1hdGlvbihjb25maXJtOiBib29sZWFuLCBvcGVyYXRpb25OYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBpZiAodHlwZW9mIGNvbmZpcm0gIT09ICdib29sZWFuJykge1xuICAgICAgdGhyb3cgRXJyb3JIYW5kbGVyLmNyZWF0ZUVycm9yKGAke29wZXJhdGlvbk5hbWV9IGNvbmZpcm1hdGlvbiBtdXN0IGJlIGEgYm9vbGVhbiB2YWx1ZWAsIEVycm9yQ2F0ZWdvcnkuVkFMSURBVElPTl9FUlJPUiwgVmFsaWRhdGlvbkVycm9yQ29kZXMuSU5WQUxJRF9UWVBFKTtcbiAgICB9XG5cbiAgICBpZiAoIWNvbmZpcm0pIHtcbiAgICAgIHRocm93IEVycm9ySGFuZGxlci5jcmVhdGVFcnJvcihgJHtvcGVyYXRpb25OYW1lfSBvcGVyYXRpb24gcmVxdWlyZXMgZXhwbGljaXQgY29uZmlybWF0aW9uICh0cnVlKWAsIEVycm9yQ2F0ZWdvcnkuVkFMSURBVElPTl9FUlJPUiwgVmFsaWRhdGlvbkVycm9yQ29kZXMuQ09ORklSTUFUSU9OX1JFUVVJUkVEKTtcbiAgICB9XG5cbiAgICByZXR1cm4gY29uZmlybTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZSBmaWVsZCBuYW1lIGZvciBlZGl0IG9wZXJhdGlvbnNcbiAgICovXG4gIHN0YXRpYyB2YWxpZGF0ZUVkaXRGaWVsZChmaWVsZDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAoIWZpZWxkIHx8IHR5cGVvZiBmaWVsZCAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IEVycm9ySGFuZGxlci5jcmVhdGVFcnJvcignRmllbGQgbmFtZSBtdXN0IGJlIGEgbm9uLWVtcHR5IHN0cmluZycsIEVycm9yQ2F0ZWdvcnkuVkFMSURBVElPTl9FUlJPUiwgVmFsaWRhdGlvbkVycm9yQ29kZXMuUkVRVUlSRURfRklFTEQpO1xuICAgIH1cblxuICAgIGNvbnN0IHZhbGlkRmllbGRzID0gW1xuICAgICAgJ25hbWUnLCAnZGVzY3JpcHRpb24nLCAnY2F0ZWdvcnknLCAnaW5zdHJ1Y3Rpb25zJywgXG4gICAgICAndHJpZ2dlcnMnLCAndmVyc2lvbicsICdhdXRob3InLCAndGFncydcbiAgICBdO1xuXG4gICAgY29uc3Qgbm9ybWFsaXplZEZpZWxkID0gZmllbGQudG9Mb3dlckNhc2UoKS50cmltKCk7XG4gICAgaWYgKCF2YWxpZEZpZWxkcy5pbmNsdWRlcyhub3JtYWxpemVkRmllbGQpKSB7XG4gICAgICB0aHJvdyBFcnJvckhhbmRsZXIuY3JlYXRlRXJyb3IoYEludmFsaWQgZmllbGQgbmFtZS4gTXVzdCBiZSBvbmUgb2Y6ICR7dmFsaWRGaWVsZHMuam9pbignLCAnKX1gLCBFcnJvckNhdGVnb3J5LlZBTElEQVRJT05fRVJST1IsIFZhbGlkYXRpb25FcnJvckNvZGVzLklOVkFMSURfSU5QVVQpO1xuICAgIH1cblxuICAgIHJldHVybiBub3JtYWxpemVkRmllbGQ7XG4gIH1cblxuICAvKipcbiAgICogU2FuaXRpemUgdGV4dCBmb3Igc2FmZSBkaXNwbGF5IG91dHB1dFxuICAgKiBSZW1vdmVzIGNvcmUgc2hlbGwgbWV0YWNoYXJhY3RlcnMgdG8gcHJldmVudCBjb21tYW5kIGluamVjdGlvbiBpbiBkaXNwbGF5ZWQgbWVzc2FnZXNcbiAgICpcbiAgICogVXNlcyBhIGNvbnNlcnZhdGl2ZSBzdWJzZXQgb2Ygc2hlbGwgbWV0YWNoYXJhY3RlcnMgKDssICYsIHwsIGAsICQsIHBhcmVudGhlc2VzKVxuICAgKiB0aGF0IGFyZSBtb3N0IGNyaXRpY2FsIGZvciBjb21tYW5kIGluamVjdGlvbiBwcmV2ZW50aW9uIHdoaWxlIHByZXNlcnZpbmdcbiAgICogY29tbW9uIHB1bmN0dWF0aW9uIGxpa2UgISwgPywgKiBmb3IgYmV0dGVyIHVzZXIgZXhwZXJpZW5jZSBpbiBkaXNwbGF5IGNvbnRleHRzLlxuICAgKlxuICAgKiBAcGFyYW0gdGV4dCAtIFRleHQgdG8gc2FuaXRpemUgZm9yIGRpc3BsYXlcbiAgICogQHJldHVybnMgU2FuaXRpemVkIHRleHQgd2l0aCBjb3JlIHNoZWxsIG1ldGFjaGFyYWN0ZXJzIHJlbW92ZWRcbiAgICovXG4gIHN0YXRpYyBzYW5pdGl6ZUZvckRpc3BsYXkodGV4dDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAoIXRleHQgfHwgdHlwZW9mIHRleHQgIT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuICAgIC8vIFVzZSBwcmUtY29tcGlsZWQgcmVnZXggZm9yIHBlcmZvcm1hbmNlXG4gICAgLy8gUmVtb3ZlczogOyAmIHwgYCAkICggKVxuICAgIHJldHVybiB0ZXh0LnJlcGxhY2VBbGwoU0hFTExfTUVUQUNIQVJfRElTUExBWV9SRUdFWCwgJycpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGhvc3RuYW1lIGlzIGEgcHJpdmF0ZSBJUCBhZGRyZXNzIChJUHY0IGFuZCBJUHY2KVxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgaXNQcml2YXRlSVAoaG9zdG5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIC8vIENoZWNrIGZvciBsb2NhbGhvc3QgdmFyaWF0aW9uc1xuICAgIGlmIChbJ2xvY2FsaG9zdCcsICcxMjcuMC4wLjEnLCAnOjoxJ10uaW5jbHVkZXMoaG9zdG5hbWUpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBDaGVjayBmb3IgcHJpdmF0ZSBJUHY0IHJhbmdlc1xuICAgIGNvbnN0IGlwdjRNYXRjaCA9IGhvc3RuYW1lLm1hdGNoKElQVjRfUkVHRVgpO1xuICAgIFxuICAgIGlmIChpcHY0TWF0Y2gpIHtcbiAgICAgIGNvbnN0IFssIGEsIGIsIGMsIGRdID0gaXB2NE1hdGNoLm1hcChOdW1iZXIpO1xuICAgICAgXG4gICAgICAvLyAxMC4wLjAuMC84XG4gICAgICBpZiAoYSA9PT0gMTApIHJldHVybiB0cnVlO1xuICAgICAgXG4gICAgICAvLyAxNzIuMTYuMC4wLzEyXG4gICAgICBpZiAoYSA9PT0gMTcyICYmIGIgPj0gMTYgJiYgYiA8PSAzMSkgcmV0dXJuIHRydWU7XG4gICAgICBcbiAgICAgIC8vIDE5Mi4xNjguMC4wLzE2XG4gICAgICBpZiAoYSA9PT0gMTkyICYmIGIgPT09IDE2OCkgcmV0dXJuIHRydWU7XG4gICAgICBcbiAgICAgIC8vIDE2OS4yNTQuMC4wLzE2IChsaW5rLWxvY2FsKVxuICAgICAgaWYgKGEgPT09IDE2OSAmJiBiID09PSAyNTQpIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8vIENoZWNrIGZvciBwcml2YXRlIElQdjYgcmFuZ2VzXG4gICAgY29uc3QgaXB2Nkxvd2VyID0gaG9zdG5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICBcbiAgICAvLyBmYzAwOjovNyAtIFVuaXF1ZSBMb2NhbCBBZGRyZXNzZXMgKFVMQSlcbiAgICBpZiAoaXB2Nkxvd2VyLnN0YXJ0c1dpdGgoJ2ZjJykgfHwgaXB2Nkxvd2VyLnN0YXJ0c1dpdGgoJ2ZkJykpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBcbiAgICAvLyBmZTgwOjovMTAgLSBMaW5rLUxvY2FsIEFkZHJlc3Nlc1xuICAgIC8vIElQdjYgbGluay1sb2NhbCBhZGRyZXNzZXMgYXJlIGZlODA6Oi8xMCwgbWVhbmluZyB0aGUgdmFsaWQgcmFuZ2UgaXMgZmU4MCB0aHJvdWdoIGZlYmZcbiAgICBjb25zdCBmZTgwUmFuZ2UgPSBOdW1iZXIucGFyc2VJbnQoaXB2Nkxvd2VyLnN1YnN0cmluZygwLCA0KSwgMTYpO1xuICAgIGlmIChmZTgwUmFuZ2UgPj0gMHhmZTgwICYmIGZlODBSYW5nZSA8PSAweGZlYmYpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBcbiAgICAvLyBBZGRpdGlvbmFsIElQdjYgbG9jYWxob3N0IGZvcm1hdHNcbiAgICBpZiAoWyc6OjEnLCAnMDowOjA6MDowOjA6MDoxJ10uaW5jbHVkZXMoaXB2Nkxvd2VyKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGZvciBlbmNvZGVkIHByaXZhdGUgSVAgYWRkcmVzc2VzIHRoYXQgY291bGQgYnlwYXNzIGJhc2ljIGRldGVjdGlvblxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgaXNFbmNvZGVkUHJpdmF0ZUlQKGhvc3RuYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAvLyBDaGVjayBmb3IgZGVjaW1hbCBlbmNvZGVkIElQcyAoZS5nLiwgMjEzMDcwNjQzMyA9IDEyNy4wLjAuMSlcbiAgICBpZiAoREVDSU1BTF9JUF9SRUdFWC50ZXN0KGhvc3RuYW1lKSkge1xuICAgICAgY29uc3QgbnVtID0gTnVtYmVyLnBhcnNlSW50KGhvc3RuYW1lLCAxMCk7XG4gICAgICBpZiAobnVtID49IDAgJiYgbnVtIDw9IDQyOTQ5NjcyOTUpIHsgLy8gVmFsaWQgSVB2NCByYW5nZVxuICAgICAgICAvLyBDb252ZXJ0IHRvIElQIGZvcm1hdCBhbmQgY2hlY2sgaWYgcHJpdmF0ZVxuICAgICAgICBjb25zdCBpcCA9IFsobnVtID4+PiAyNCkgJiAyNTUsIChudW0gPj4+IDE2KSAmIDI1NSwgKG51bSA+Pj4gOCkgJiAyNTUsIG51bSAmIDI1NV0uam9pbignLicpO1xuICAgICAgICByZXR1cm4gdGhpcy5pc1ByaXZhdGVJUChpcCk7XG4gICAgICB9XG4gICAgfVxuICAgIFxuICAgIC8vIENoZWNrIGZvciBoZXggZW5jb2RlZCBJUHMgKGUuZy4sIDB4N2YwMDAwMDEgPSAxMjcuMC4wLjEpXG4gICAgaWYgKEhFWF9JUF9SRUdFWC50ZXN0KGhvc3RuYW1lKSkge1xuICAgICAgY29uc3QgbnVtID0gTnVtYmVyLnBhcnNlSW50KGhvc3RuYW1lLCAxNik7XG4gICAgICBpZiAobnVtID49IDAgJiYgbnVtIDw9IDQyOTQ5NjcyOTUpIHtcbiAgICAgICAgY29uc3QgaXAgPSBbKG51bSA+Pj4gMjQpICYgMjU1LCAobnVtID4+PiAxNikgJiAyNTUsIChudW0gPj4+IDgpICYgMjU1LCBudW0gJiAyNTVdLmpvaW4oJy4nKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNQcml2YXRlSVAoaXApO1xuICAgICAgfVxuICAgIH1cbiAgICBcbiAgICAvLyBDaGVjayBmb3Igb2N0YWwgZW5jb2RlZCBJUHMgKGUuZy4sIDAxNzcwMDAwMDAwMSA9IDEyNy4wLjAuMSlcbiAgICBpZiAoT0NUQUxfSVBfUkVHRVgudGVzdChob3N0bmFtZSkpIHtcbiAgICAgIGNvbnN0IG51bSA9IE51bWJlci5wYXJzZUludChob3N0bmFtZSwgOCk7XG4gICAgICBpZiAobnVtID49IDAgJiYgbnVtIDw9IDQyOTQ5NjcyOTUpIHtcbiAgICAgICAgY29uc3QgaXAgPSBbKG51bSA+Pj4gMjQpICYgMjU1LCAobnVtID4+PiAxNikgJiAyNTUsIChudW0gPj4+IDgpICYgMjU1LCBudW0gJiAyNTVdLmpvaW4oJy4nKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNQcml2YXRlSVAoaXApO1xuICAgICAgfVxuICAgIH1cbiAgICBcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuLyoqXG4gKiBWYWxpZGF0ZSBhbmQgc2FuaXRpemUgYSBmaWxlbmFtZVxuICovXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVGaWxlbmFtZShmaWxlbmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgaWYgKCFmaWxlbmFtZSB8fCB0eXBlb2YgZmlsZW5hbWUgIT09ICdzdHJpbmcnKSB7XG4gICAgdGhyb3cgRXJyb3JIYW5kbGVyLmNyZWF0ZUVycm9yKCdGaWxlbmFtZSBtdXN0IGJlIGEgbm9uLWVtcHR5IHN0cmluZycsIEVycm9yQ2F0ZWdvcnkuVkFMSURBVElPTl9FUlJPUiwgVmFsaWRhdGlvbkVycm9yQ29kZXMuSU5WQUxJRF9GSUxFTkFNRSk7XG4gIH1cbiAgXG4gIGlmIChmaWxlbmFtZS5sZW5ndGggPiBTRUNVUklUWV9MSU1JVFMuTUFYX0ZJTEVOQU1FX0xFTkdUSCkge1xuICAgIHRocm93IEVycm9ySGFuZGxlci5jcmVhdGVFcnJvcihgRmlsZW5hbWUgdG9vIGxvbmcgKG1heCAke1NFQ1VSSVRZX0xJTUlUUy5NQVhfRklMRU5BTUVfTEVOR1RIfSBjaGFyYWN0ZXJzKWAsIEVycm9yQ2F0ZWdvcnkuVkFMSURBVElPTl9FUlJPUiwgVmFsaWRhdGlvbkVycm9yQ29kZXMuSU5WQUxJRF9MRU5HVEgpO1xuICB9XG4gIFxuICAvLyBSZW1vdmUgYW55IHBhdGggc2VwYXJhdG9ycyBhbmQgZGFuZ2Vyb3VzIGNoYXJhY3RlcnNcbiAgY29uc3Qgc2FuaXRpemVkID0gZmlsZW5hbWUucmVwbGFjZUFsbChGSUxFTkFNRV9EQU5HRVJPVVNfUkVHRVgsICcnKS5yZXBsYWNlKEZJTEVOQU1FX0xFQURJTkdfRE9UU19SRUdFWCwgJycpO1xuICBcbiAgaWYgKCFSZWdleFZhbGlkYXRvci52YWxpZGF0ZShzYW5pdGl6ZWQsIFZBTElEQVRJT05fUEFUVEVSTlMuU0FGRV9GSUxFTkFNRSwgeyBtYXhMZW5ndGg6IFNFQ1VSSVRZX0xJTUlUUy5NQVhfRklMRU5BTUVfTEVOR1RIIH0pKSB7XG4gICAgdGhyb3cgRXJyb3JIYW5kbGVyLmNyZWF0ZUVycm9yKCdJbnZhbGlkIGZpbGVuYW1lIGZvcm1hdC4gVXNlIGFscGhhbnVtZXJpYyBjaGFyYWN0ZXJzLCBoeXBoZW5zLCB1bmRlcnNjb3JlcywgYW5kIGRvdHMgb25seS4nLCBFcnJvckNhdGVnb3J5LlZBTElEQVRJT05fRVJST1IsIFZhbGlkYXRpb25FcnJvckNvZGVzLklOVkFMSURfRklMRU5BTUUpO1xuICB9XG4gIFxuICByZXR1cm4gc2FuaXRpemVkO1xufVxuXG4vKipcbiAqIFZhbGlkYXRlIGFuZCBzYW5pdGl6ZSBhIHBhdGhcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlUGF0aChpbnB1dFBhdGg6IHN0cmluZywgYmFzZURpcj86IHN0cmluZyk6IHN0cmluZyB7XG4gIGlmICghaW5wdXRQYXRoIHx8IHR5cGVvZiBpbnB1dFBhdGggIT09ICdzdHJpbmcnKSB7XG4gICAgdGhyb3cgRXJyb3JIYW5kbGVyLmNyZWF0ZUVycm9yKCdQYXRoIG11c3QgYmUgYSBub24tZW1wdHkgc3RyaW5nJywgRXJyb3JDYXRlZ29yeS5WQUxJREFUSU9OX0VSUk9SLCBWYWxpZGF0aW9uRXJyb3JDb2Rlcy5JTlZBTElEX1BBVEgpO1xuICB9XG4gIFxuICAvLyBJZiBiYXNlRGlyIGlzIHByb3ZpZGVkIGFuZCBpbnB1dFBhdGggaXMgYWJzb2x1dGUsIHJlamVjdCBpdFxuICAvLyBDaGVjayBib3RoIFVuaXgtc3R5bGUgYW5kIFdpbmRvd3Mtc3R5bGUgYWJzb2x1dGUgcGF0aHMgZm9yIGNyb3NzLXBsYXRmb3JtIHNlY3VyaXR5XG4gIGNvbnN0IGlzVW5peEFic29sdXRlID0gcGF0aC5pc0Fic29sdXRlKGlucHV0UGF0aCk7XG4gIGNvbnN0IGlzV2luZG93c0Fic29sdXRlID0gL15bYS16QS1aXTpbXFxcXC9dLy50ZXN0KGlucHV0UGF0aCk7XG4gIFxuICBpZiAoYmFzZURpciAmJiAoaXNVbml4QWJzb2x1dGUgfHwgaXNXaW5kb3dzQWJzb2x1dGUpKSB7XG4gICAgdGhyb3cgRXJyb3JIYW5kbGVyLmNyZWF0ZUVycm9yKCdBYnNvbHV0ZSBwYXRocyBub3QgYWxsb3dlZCB3aGVuIGJhc2UgZGlyZWN0b3J5IGlzIHNwZWNpZmllZCcsIEVycm9yQ2F0ZWdvcnkuVkFMSURBVElPTl9FUlJPUiwgVmFsaWRhdGlvbkVycm9yQ29kZXMuSU5WQUxJRF9QQVRIKTtcbiAgfVxuICBcbiAgLy8gUmVtb3ZlIGxlYWRpbmcvdHJhaWxpbmcgc2xhc2hlcyBhbmQgbm9ybWFsaXplXG4gIC8vIExlbmd0aCBsaW1pdHMgYWRkZWQgdG8gcHJldmVudCBSZURvUyBhdHRhY2tzXG4gIC8vIFdJTkRPV1MgRklYOiBDb252ZXJ0IGJhY2tzbGFzaGVzIHRvIGZvcndhcmQgc2xhc2hlcyBmb3IgY3Jvc3MtcGxhdGZvcm0gY29tcGF0aWJpbGl0eVxuICBsZXQgbm9ybWFsaXplZCA9IGlucHV0UGF0aC5yZXBsYWNlQWxsKCdcXFxcJywgJy8nKTtcblxuICAvLyBGSVg6IFByZXNlcnZlIGxlYWRpbmcgc2xhc2ggZm9yIGFic29sdXRlIHBhdGhzXG4gIGNvbnN0IGlzQWJzb2x1dGUgPSBub3JtYWxpemVkLnN0YXJ0c1dpdGgoJy8nKSB8fCBpc1dpbmRvd3NBYnNvbHV0ZTtcblxuICAvLyBSZW1vdmUgdHJhaWxpbmcgc2xhc2hlcyBhbmQgbm9ybWFsaXplIG11bHRpcGxlIHNsYXNoZXNcbiAgbm9ybWFsaXplZCA9IG5vcm1hbGl6ZWQucmVwbGFjZUFsbCgvXFwvezEsMTAwfSQvZywgJycpLnJlcGxhY2VBbGwoL1xcL3syLDEwMH0vZywgJy8nKTtcbiAgXG4gIC8vIFByZXNlcnZlIHRoZSBsZWFkaW5nIHNsYXNoIGlmIGl0IHdhcyBhbiBhYnNvbHV0ZSBwYXRoXG4gIGlmIChpc0Fic29sdXRlICYmICFub3JtYWxpemVkLnN0YXJ0c1dpdGgoJy8nKSAmJiAhaXNXaW5kb3dzQWJzb2x1dGUpIHtcbiAgICBub3JtYWxpemVkID0gJy8nICsgbm9ybWFsaXplZDtcbiAgfVxuICBcbiAgaWYgKCFWQUxJREFUSU9OX1BBVFRFUk5TLlNBRkVfUEFUSC50ZXN0KG5vcm1hbGl6ZWQpKSB7XG4gICAgdGhyb3cgRXJyb3JIYW5kbGVyLmNyZWF0ZUVycm9yKCdJbnZhbGlkIHBhdGggZm9ybWF0LiBVc2UgYWxwaGFudW1lcmljIGNoYXJhY3RlcnMsIGh5cGhlbnMsIHVuZGVyc2NvcmVzLCBkb3RzLCBhbmQgZm9yd2FyZCBzbGFzaGVzIG9ubHkuJywgRXJyb3JDYXRlZ29yeS5WQUxJREFUSU9OX0VSUk9SLCBWYWxpZGF0aW9uRXJyb3JDb2Rlcy5JTlZBTElEX1BBVEgpO1xuICB9XG4gIFxuICAvLyBDaGVjayBmb3IgcGF0aCB0cmF2ZXJzYWwgYXR0ZW1wdHNcbiAgaWYgKG5vcm1hbGl6ZWQuaW5jbHVkZXMoJy4uJykgfHwgbm9ybWFsaXplZC5pbmNsdWRlcygnLi8nKSB8fCBub3JtYWxpemVkLmluY2x1ZGVzKCcvLicpKSB7XG4gICAgdGhyb3cgRXJyb3JIYW5kbGVyLmNyZWF0ZUVycm9yKCdQYXRoIHRyYXZlcnNhbCBub3QgYWxsb3dlZCcsIEVycm9yQ2F0ZWdvcnkuVkFMSURBVElPTl9FUlJPUiwgVmFsaWRhdGlvbkVycm9yQ29kZXMuUEFUSF9UUkFWRVJTQUwpO1xuICB9XG4gIFxuICAvLyBWYWxpZGF0ZSBwYXRoIGRlcHRoXG4gIGNvbnN0IGRlcHRoID0gbm9ybWFsaXplZC5zcGxpdCgnLycpLmxlbmd0aDtcbiAgaWYgKGRlcHRoID4gU0VDVVJJVFlfTElNSVRTLk1BWF9QQVRIX0RFUFRIKSB7XG4gICAgdGhyb3cgRXJyb3JIYW5kbGVyLmNyZWF0ZUVycm9yKGBQYXRoIHRvbyBkZWVwIChtYXggJHtTRUNVUklUWV9MSU1JVFMuTUFYX1BBVEhfREVQVEh9IGxldmVscylgLCBFcnJvckNhdGVnb3J5LlZBTElEQVRJT05fRVJST1IsIFZhbGlkYXRpb25FcnJvckNvZGVzLklOVkFMSURfUEFUSCk7XG4gIH1cbiAgXG4gIC8vIElmIGJhc2VEaXIgcHJvdmlkZWQsIGVuc3VyZSBwYXRoIGlzIHdpdGhpbiBpdFxuICBpZiAoYmFzZURpcikge1xuICAgIGNvbnN0IHJlc29sdmVkUGF0aCA9IHBhdGgucmVzb2x2ZShiYXNlRGlyLCBub3JtYWxpemVkKTtcbiAgICBjb25zdCByZXNvbHZlZEJhc2UgPSBwYXRoLnJlc29sdmUoYmFzZURpcik7XG4gICAgXG4gICAgaWYgKCFyZXNvbHZlZFBhdGguc3RhcnRzV2l0aChyZXNvbHZlZEJhc2UpKSB7XG4gICAgICB0aHJvdyBFcnJvckhhbmRsZXIuY3JlYXRlRXJyb3IoJ1BhdGggdHJhdmVyc2FsIGF0dGVtcHQgZGV0ZWN0ZWQnLCBFcnJvckNhdGVnb3J5LlZBTElEQVRJT05fRVJST1IsIFZhbGlkYXRpb25FcnJvckNvZGVzLlBBVEhfVFJBVkVSU0FMKTtcbiAgICB9XG4gIH1cbiAgXG4gIHJldHVybiBub3JtYWxpemVkO1xufVxuXG4vKipcbiAqIFZhbGlkYXRlIGFuZCBzYW5pdGl6ZSBhIHVzZXJuYW1lXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZVVzZXJuYW1lKHVzZXJuYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICBpZiAoIXVzZXJuYW1lIHx8IHR5cGVvZiB1c2VybmFtZSAhPT0gJ3N0cmluZycpIHtcbiAgICB0aHJvdyBFcnJvckhhbmRsZXIuY3JlYXRlRXJyb3IoJ1VzZXJuYW1lIG11c3QgYmUgYSBub24tZW1wdHkgc3RyaW5nJywgRXJyb3JDYXRlZ29yeS5WQUxJREFUSU9OX0VSUk9SLCBWYWxpZGF0aW9uRXJyb3JDb2Rlcy5SRVFVSVJFRF9GSUVMRCk7XG4gIH1cbiAgXG4gIGlmICghVkFMSURBVElPTl9QQVRURVJOUy5TQUZFX1VTRVJOQU1FLnRlc3QodXNlcm5hbWUpKSB7XG4gICAgdGhyb3cgRXJyb3JIYW5kbGVyLmNyZWF0ZUVycm9yKCdJbnZhbGlkIHVzZXJuYW1lIGZvcm1hdC4gVXNlIGFscGhhbnVtZXJpYyBjaGFyYWN0ZXJzLCBoeXBoZW5zLCB1bmRlcnNjb3JlcywgYW5kIGRvdHMgb25seS4nLCBFcnJvckNhdGVnb3J5LlZBTElEQVRJT05fRVJST1IsIFZhbGlkYXRpb25FcnJvckNvZGVzLklOVkFMSURfRk9STUFUKTtcbiAgfVxuICBcbiAgcmV0dXJuIHVzZXJuYW1lLnRvTG93ZXJDYXNlKCk7XG59XG5cbi8qKlxuICogVmFsaWRhdGUgYSBjYXRlZ29yeVxuICovXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVDYXRlZ29yeShjYXRlZ29yeTogc3RyaW5nKTogc3RyaW5nIHtcbiAgaWYgKCFjYXRlZ29yeSB8fCB0eXBlb2YgY2F0ZWdvcnkgIT09ICdzdHJpbmcnKSB7XG4gICAgdGhyb3cgRXJyb3JIYW5kbGVyLmNyZWF0ZUVycm9yKCdDYXRlZ29yeSBtdXN0IGJlIGEgbm9uLWVtcHR5IHN0cmluZycsIEVycm9yQ2F0ZWdvcnkuVkFMSURBVElPTl9FUlJPUiwgVmFsaWRhdGlvbkVycm9yQ29kZXMuSU5WQUxJRF9DQVRFR09SWSk7XG4gIH1cbiAgXG4gIGlmICghUmVnZXhWYWxpZGF0b3IudmFsaWRhdGUoY2F0ZWdvcnksIFZBTElEQVRJT05fUEFUVEVSTlMuU0FGRV9DQVRFR09SWSwgeyBtYXhMZW5ndGg6IDUwIH0pKSB7XG4gICAgdGhyb3cgRXJyb3JIYW5kbGVyLmNyZWF0ZUVycm9yKCdJbnZhbGlkIGNhdGVnb3J5IGZvcm1hdC4gVXNlIGFscGhhYmV0aWMgY2hhcmFjdGVycywgaHlwaGVucywgYW5kIHVuZGVyc2NvcmVzIG9ubHkuJywgRXJyb3JDYXRlZ29yeS5WQUxJREFUSU9OX0VSUk9SLCBWYWxpZGF0aW9uRXJyb3JDb2Rlcy5JTlZBTElEX0NBVEVHT1JZKTtcbiAgfVxuICBcbiAgY29uc3Qgbm9ybWFsaXplZCA9IGNhdGVnb3J5LnRvTG93ZXJDYXNlKCk7XG4gIFxuICBpZiAoIVZBTElEX0NBVEVHT1JJRVMuaW5jbHVkZXMobm9ybWFsaXplZCkpIHtcbiAgICB0aHJvdyBFcnJvckhhbmRsZXIuY3JlYXRlRXJyb3IoYEludmFsaWQgY2F0ZWdvcnkuIE11c3QgYmUgb25lIG9mOiAke1ZBTElEX0NBVEVHT1JJRVMuam9pbignLCAnKX1gLCBFcnJvckNhdGVnb3J5LlZBTElEQVRJT05fRVJST1IsIFZhbGlkYXRpb25FcnJvckNvZGVzLklOVkFMSURfQ0FURUdPUlkpO1xuICB9XG4gIFxuICByZXR1cm4gbm9ybWFsaXplZDtcbn1cblxuLyoqXG4gKiBWYWxpZGF0ZSBjb250ZW50IHNpemVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlQ29udGVudFNpemUoY29udGVudDogc3RyaW5nLCBtYXhTaXplOiBudW1iZXIgPSBTRUNVUklUWV9MSU1JVFMuTUFYX0NPTlRFTlRfTEVOR1RIKTogdm9pZCB7XG4gIGlmICghY29udGVudCB8fCB0eXBlb2YgY29udGVudCAhPT0gJ3N0cmluZycpIHtcbiAgICB0aHJvdyBFcnJvckhhbmRsZXIuY3JlYXRlRXJyb3IoJ0NvbnRlbnQgbXVzdCBiZSBhIG5vbi1lbXB0eSBzdHJpbmcnLCBFcnJvckNhdGVnb3J5LlZBTElEQVRJT05fRVJST1IsIFZhbGlkYXRpb25FcnJvckNvZGVzLlJFUVVJUkVEX0ZJRUxEKTtcbiAgfVxuICBcbiAgY29uc3Qgc2l6ZUJ5dGVzID0gQnVmZmVyLmJ5dGVMZW5ndGgoY29udGVudCwgJ3V0ZjgnKTtcbiAgaWYgKHNpemVCeXRlcyA+IG1heFNpemUpIHtcbiAgICB0aHJvdyBFcnJvckhhbmRsZXIuY3JlYXRlRXJyb3IoYENvbnRlbnQgdG9vIGxhcmdlICgke3NpemVCeXRlc30gYnl0ZXMsIG1heCAke21heFNpemV9IGJ5dGVzKWAsIEVycm9yQ2F0ZWdvcnkuVkFMSURBVElPTl9FUlJPUiwgVmFsaWRhdGlvbkVycm9yQ29kZXMuQ09OVEVOVF9UT09fTEFSR0UpO1xuICB9XG59XG5cbi8qKlxuICogQ29tcHJlaGVuc2l2ZSBpbnB1dCB2YWxpZGF0aW9uIGJlZm9yZSBwYXR0ZXJuIG1hdGNoaW5nXG4gKiBWYWxpZGF0ZXMgYWxsIGNvbnRlbnQgdHlwZXMgd2l0aCBhcHByb3ByaWF0ZSBsaW1pdHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb250ZW50VmFsaWRhdGlvbk9wdGlvbnMge1xuICBtYXhDb250ZW50TGVuZ3RoPzogbnVtYmVyO1xuICBtYXhZYW1sTGVuZ3RoPzogbnVtYmVyO1xuICBtYXhNZXRhZGF0YUZpZWxkTGVuZ3RoPzogbnVtYmVyO1xuICBtYXhGaWxlU2l6ZT86IG51bWJlcjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlSW5wdXRMZW5ndGhzKFxuICBjb250ZW50OiBzdHJpbmcsXG4gIGNvbnRlbnRUeXBlOiAnZnVsbCcgfCAneWFtbCcgfCAnbWV0YWRhdGEnIHwgJ2ZpZWxkJyxcbiAgb3B0aW9uczogQ29udGVudFZhbGlkYXRpb25PcHRpb25zID0ge31cbik6IHZvaWQge1xuICBjb25zdCBsaW1pdHMgPSB7XG4gICAgbWF4Q29udGVudExlbmd0aDogb3B0aW9ucy5tYXhDb250ZW50TGVuZ3RoID8/IFNFQ1VSSVRZX0xJTUlUUy5NQVhfQ09OVEVOVF9MRU5HVEgsXG4gICAgbWF4WWFtbExlbmd0aDogb3B0aW9ucy5tYXhZYW1sTGVuZ3RoID8/IFNFQ1VSSVRZX0xJTUlUUy5NQVhfWUFNTF9MRU5HVEgsXG4gICAgbWF4TWV0YWRhdGFGaWVsZExlbmd0aDogb3B0aW9ucy5tYXhNZXRhZGF0YUZpZWxkTGVuZ3RoID8/IFNFQ1VSSVRZX0xJTUlUUy5NQVhfTUVUQURBVEFfRklFTERfTEVOR1RILFxuICAgIG1heEZpbGVTaXplOiBvcHRpb25zLm1heEZpbGVTaXplID8/IFNFQ1VSSVRZX0xJTUlUUy5NQVhfRklMRV9TSVpFXG4gIH07XG5cbiAgLy8gVmFsaWRhdGUgYmFzZWQgb24gY29udGVudCB0eXBlXG4gIHN3aXRjaCAoY29udGVudFR5cGUpIHtcbiAgICBjYXNlICdmdWxsJzpcbiAgICAgIGlmIChjb250ZW50Lmxlbmd0aCA+IGxpbWl0cy5tYXhDb250ZW50TGVuZ3RoKSB7XG4gICAgICAgIHRocm93IEVycm9ySGFuZGxlci5jcmVhdGVFcnJvcihcbiAgICAgICAgICBgQ29udGVudCBleGNlZWRzIG1heGltdW0gbGVuZ3RoIG9mICR7bGltaXRzLm1heENvbnRlbnRMZW5ndGh9IGNoYXJhY3RlcnMgKCR7Y29udGVudC5sZW5ndGh9IHByb3ZpZGVkKWAsXG4gICAgICAgICAgRXJyb3JDYXRlZ29yeS5WQUxJREFUSU9OX0VSUk9SLFxuICAgICAgICAgIFZhbGlkYXRpb25FcnJvckNvZGVzLkNPTlRFTlRfVE9PX0xBUkdFXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICBcbiAgICBjYXNlICd5YW1sJzpcbiAgICAgIGlmIChjb250ZW50Lmxlbmd0aCA+IGxpbWl0cy5tYXhZYW1sTGVuZ3RoKSB7XG4gICAgICAgIHRocm93IEVycm9ySGFuZGxlci5jcmVhdGVFcnJvcihcbiAgICAgICAgICBgWUFNTCBjb250ZW50IGV4Y2VlZHMgbWF4aW11bSBsZW5ndGggb2YgJHtsaW1pdHMubWF4WWFtbExlbmd0aH0gY2hhcmFjdGVycyAoJHtjb250ZW50Lmxlbmd0aH0gcHJvdmlkZWQpYCxcbiAgICAgICAgICBFcnJvckNhdGVnb3J5LlZBTElEQVRJT05fRVJST1IsXG4gICAgICAgICAgVmFsaWRhdGlvbkVycm9yQ29kZXMuQ09OVEVOVF9UT09fTEFSR0VcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIFxuICAgIGNhc2UgJ21ldGFkYXRhJzpcbiAgICAgIC8vIEZvciBtZXRhZGF0YSwgY2hlY2sgb3ZlcmFsbCBzaXplXG4gICAgICBpZiAoY29udGVudC5sZW5ndGggPiBsaW1pdHMubWF4WWFtbExlbmd0aCkge1xuICAgICAgICB0aHJvdyBFcnJvckhhbmRsZXIuY3JlYXRlRXJyb3IoXG4gICAgICAgICAgYE1ldGFkYXRhIGV4Y2VlZHMgbWF4aW11bSBsZW5ndGggb2YgJHtsaW1pdHMubWF4WWFtbExlbmd0aH0gY2hhcmFjdGVycyAoJHtjb250ZW50Lmxlbmd0aH0gcHJvdmlkZWQpYCxcbiAgICAgICAgICBFcnJvckNhdGVnb3J5LlZBTElEQVRJT05fRVJST1IsXG4gICAgICAgICAgVmFsaWRhdGlvbkVycm9yQ29kZXMuQ09OVEVOVF9UT09fTEFSR0VcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIFxuICAgIGNhc2UgJ2ZpZWxkJzpcbiAgICAgIGlmIChjb250ZW50Lmxlbmd0aCA+IGxpbWl0cy5tYXhNZXRhZGF0YUZpZWxkTGVuZ3RoKSB7XG4gICAgICAgIHRocm93IEVycm9ySGFuZGxlci5jcmVhdGVFcnJvcihcbiAgICAgICAgICBgRmllbGQgZXhjZWVkcyBtYXhpbXVtIGxlbmd0aCBvZiAke2xpbWl0cy5tYXhNZXRhZGF0YUZpZWxkTGVuZ3RofSBjaGFyYWN0ZXJzICgke2NvbnRlbnQubGVuZ3RofSBwcm92aWRlZClgLFxuICAgICAgICAgIEVycm9yQ2F0ZWdvcnkuVkFMSURBVElPTl9FUlJPUixcbiAgICAgICAgICBWYWxpZGF0aW9uRXJyb3JDb2Rlcy5DT05URU5UX1RPT19MQVJHRVxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gIH1cbn1cblxuLyoqXG4gKiBHZW5lcmFsIGlucHV0IHNhbml0aXphdGlvblxuICovXG5leHBvcnQgZnVuY3Rpb24gc2FuaXRpemVJbnB1dChpbnB1dDogc3RyaW5nLCBtYXhMZW5ndGg6IG51bWJlciA9IDEwMDApOiBzdHJpbmcge1xuICBpZiAoIWlucHV0IHx8IHR5cGVvZiBpbnB1dCAhPT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gJyc7XG4gIH1cbiAgXG4gIC8vIFJlbW92ZSBwb3RlbnRpYWxseSBkYW5nZXJvdXMgY2hhcmFjdGVycyBhbmQgbGltaXQgbGVuZ3RoXG4gIHJldHVybiBpbnB1dFxuICAgIC5yZXBsYWNlQWxsKENPTlRST0xfQ0hBUlNfUkVHRVgsICcnKSAvLyBSZW1vdmUgY29udHJvbCBjaGFyYWN0ZXJzXG4gICAgLnJlcGxhY2VBbGwoSFRNTF9EQU5HRVJPVVNfUkVHRVgsICcnKSAvLyBSZW1vdmUgSFRNTC1kYW5nZXJvdXMgY2hhcmFjdGVyc1xuICAgIC5yZXBsYWNlQWxsKFNIRUxMX01FVEFDSEFSX1JFR0VYLCAnJykgLy8gUmVtb3ZlIHNoZWxsIG1ldGFjaGFyYWN0ZXJzIChleHBhbmRlZClcbiAgICAucmVwbGFjZUFsbChSVExfWkVST1dJRFRIX1JFR0VYLCAnJykgLy8gUmVtb3ZlIFJUTCBvdmVycmlkZSBhbmQgemVyby13aWR0aCBjaGFyc1xuICAgIC5zdWJzdHJpbmcoMCwgbWF4TGVuZ3RoKVxuICAgIC50cmltKCk7XG59Il19
|