@dollhousemcp/mcp-server 2.0.17 → 2.0.19
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 +10 -0
- package/dist/elements/BaseElement.d.ts +1 -0
- package/dist/elements/BaseElement.d.ts.map +1 -1
- package/dist/elements/BaseElement.js +7 -1
- package/dist/elements/agents/AgentManager.js +2 -2
- package/dist/elements/base/ElementFileOperations.js +2 -2
- package/dist/elements/ensembles/EnsembleManager.js +3 -3
- package/dist/elements/memories/MemoryManager.js +2 -2
- package/dist/elements/skills/SkillManager.js +2 -2
- 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/ElementCRUDHandler.d.ts +30 -0
- package/dist/handlers/ElementCRUDHandler.d.ts.map +1 -1
- package/dist/handlers/ElementCRUDHandler.js +142 -2
- package/dist/handlers/mcp-aql/MCPAQLHandler.d.ts +4 -0
- package/dist/handlers/mcp-aql/MCPAQLHandler.d.ts.map +1 -1
- package/dist/handlers/mcp-aql/MCPAQLHandler.js +132 -14
- package/dist/handlers/mcp-aql/OperationRouter.d.ts.map +1 -1
- package/dist/handlers/mcp-aql/OperationRouter.js +6 -1
- package/dist/handlers/mcp-aql/OperationSchema.d.ts.map +1 -1
- package/dist/handlers/mcp-aql/OperationSchema.js +17 -1
- package/dist/handlers/mcp-aql/policies/AgentToolPolicyTranslator.d.ts.map +1 -1
- package/dist/handlers/mcp-aql/policies/AgentToolPolicyTranslator.js +2 -1
- package/dist/handlers/mcp-aql/policies/ElementPolicies.d.ts +9 -1
- package/dist/handlers/mcp-aql/policies/ElementPolicies.d.ts.map +1 -1
- package/dist/handlers/mcp-aql/policies/ElementPolicies.js +64 -4
- package/dist/handlers/mcp-aql/policies/OperationPolicies.d.ts.map +1 -1
- package/dist/handlers/mcp-aql/policies/OperationPolicies.js +6 -1
- package/dist/handlers/mcp-aql/policies/ToolClassification.d.ts.map +1 -1
- package/dist/handlers/mcp-aql/policies/ToolClassification.js +2 -1
- package/dist/handlers/strategies/AgentActivationStrategy.d.ts.map +1 -1
- package/dist/handlers/strategies/AgentActivationStrategy.js +5 -1
- package/dist/handlers/strategies/BaseActivationStrategy.d.ts +1 -0
- package/dist/handlers/strategies/BaseActivationStrategy.d.ts.map +1 -1
- package/dist/handlers/strategies/BaseActivationStrategy.js +15 -1
- package/dist/handlers/strategies/EnsembleActivationStrategy.d.ts.map +1 -1
- package/dist/handlers/strategies/EnsembleActivationStrategy.js +5 -1
- package/dist/handlers/strategies/MemoryActivationStrategy.d.ts.map +1 -1
- package/dist/handlers/strategies/MemoryActivationStrategy.js +5 -1
- package/dist/handlers/strategies/PersonaActivationStrategy.d.ts.map +1 -1
- package/dist/handlers/strategies/PersonaActivationStrategy.js +5 -1
- package/dist/handlers/strategies/SkillActivationStrategy.d.ts.map +1 -1
- package/dist/handlers/strategies/SkillActivationStrategy.js +5 -1
- package/dist/handlers/strategies/TemplateActivationStrategy.d.ts.map +1 -1
- package/dist/handlers/strategies/TemplateActivationStrategy.js +7 -2
- package/dist/persona/PersonaElement.js +2 -2
- package/dist/server/tools/MCPAQLTools.js +2 -1
- package/dist/services/SerializationService.d.ts.map +1 -1
- package/dist/services/SerializationService.js +7 -1
- package/dist/types/elements/IElement.d.ts +9 -0
- package/dist/types/elements/IElement.d.ts.map +1 -1
- package/dist/types/elements/IElement.js +1 -1
- package/dist/web/console/IngestRoutes.d.ts +6 -0
- package/dist/web/console/IngestRoutes.d.ts.map +1 -1
- package/dist/web/console/IngestRoutes.js +38 -9
- package/dist/web/console/LeaderElection.d.ts +39 -0
- package/dist/web/console/LeaderElection.d.ts.map +1 -1
- package/dist/web/console/LeaderElection.js +147 -29
- package/dist/web/console/LeaderForwardingSink.d.ts.map +1 -1
- package/dist/web/console/LeaderForwardingSink.js +5 -1
- package/dist/web/console/PromotionManager.d.ts.map +1 -1
- package/dist/web/console/PromotionManager.js +3 -11
- package/dist/web/public/app.js +62 -1
- package/dist/web/public/index.html +19 -17
- package/dist/web/public/permissions.css +190 -2
- package/dist/web/public/permissions.js +171 -30
- package/dist/web/public/sessions.js +111 -0
- package/dist/web/public/setup.js +131 -60
- package/dist/web/routes/permissionRoutes.d.ts.map +1 -1
- package/dist/web/routes/permissionRoutes.js +77 -5
- package/dist/web/routes/setupRoutes.d.ts.map +1 -1
- package/dist/web/routes/setupRoutes.js +16 -2
- package/dist/web/server.d.ts.map +1 -1
- package/dist/web/server.js +12 -10
- package/package.json +1 -1
- package/scripts/pretooluse-dollhouse.sh +39 -1
- package/server.json +2 -2
|
@@ -106,7 +106,7 @@ export class ElementFileOperations {
|
|
|
106
106
|
}
|
|
107
107
|
// Clean metadata to remove undefined values
|
|
108
108
|
const cleanMetadata = Object.entries(metadata).reduce((acc, [key, value]) => {
|
|
109
|
-
if (value !== undefined) {
|
|
109
|
+
if (key !== 'gatekeeperDiagnostics' && value !== undefined) {
|
|
110
110
|
acc[key] = value;
|
|
111
111
|
}
|
|
112
112
|
return acc;
|
|
@@ -223,4 +223,4 @@ export class ElementFileOperations {
|
|
|
223
223
|
}
|
|
224
224
|
}
|
|
225
225
|
}
|
|
226
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRWxlbWVudEZpbGVPcGVyYXRpb25zLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2VsZW1lbnRzL2Jhc2UvRWxlbWVudEZpbGVPcGVyYXRpb25zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7OztHQVdHO0FBR0gsT0FBTyxFQUFFLGFBQWEsRUFBRSxZQUFZLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUMvRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDcEUsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQy9DLE9BQU8sRUFBRSxRQUFRLElBQUksRUFBRSxFQUFFLE1BQU0sSUFBSSxDQUFDO0FBQ3BDLE9BQU8sS0FBSyxJQUFJLE1BQU0sTUFBTSxDQUFDO0FBQzdCLE9BQU8sTUFBTSxNQUFNLGFBQWEsQ0FBQztBQXVCakM7Ozs7O0dBS0c7QUFDSCxNQUFNLE9BQU8scUJBQXFCO0lBQ3hCLGVBQWUsQ0FBa0I7SUFFekM7OztPQUdHO0lBQ0gsWUFBWSxlQUFnQztRQUMxQyxJQUFJLENBQUMsZUFBZSxHQUFHLGVBQWUsQ0FBQztJQUN6QyxDQUFDO0lBRUQ7Ozs7Ozs7O09BUUc7SUFDSCxLQUFLLENBQUMsdUJBQXVCLENBQzNCLFFBQWdCLEVBQ2hCLE9BQWUsRUFDZixVQUFnQyxFQUFFO1FBRWxDLE1BQU0sRUFDSixPQUFPLEdBQUcsSUFBSSxHQUFHLElBQUksRUFBRSxjQUFjO1FBQ3JDLFlBQVksRUFBRSxrQkFBa0IsR0FBRyxJQUFJLEVBQ3hDLEdBQUcsT0FBTyxDQUFDO1FBRVosMEJBQTBCO1FBQzFCLE1BQU0sYUFBYSxHQUFHLGFBQWEsQ0FBQyxRQUFRLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFFbkQsNkJBQTZCO1FBQzdCLElBQUksa0JBQWtCLEVBQUUsQ0FBQztZQUN2QixJQUFJLENBQUM7Z0JBQ0gsWUFBWSxDQUFDLGFBQWEsRUFBRSxPQUFPLENB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RSxrQ0FBa0M7WUFDMUMsT0FBTyxFQUFFLGlCQUFpQixJQUFJLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBQyxFQUFFO1NBQzFELENBQUMsQ0FBQztRQUVILE1BQU0sRUFBRSxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQztJQUNsQyxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0gsS0FBSyxDQUFDLFNBQVMsQ0FBQyxHQUFXLEVBQUUsU0FBa0I7UUFDN0MsSUFBSSxDQUFDO1lBQ0gsMEJBQTBCO1lBQzFCLE1BQU0sRUFBRSxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztZQUV6QyxNQUFNLEtBQUssR0FBRyxNQUFNLEVBQUUsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7WUFFcEMsSUFBSSxTQUFTLEVBQUUsQ0FBQztnQkFDZCxPQUFPLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7WUFDbEQsQ0FBQztZQUVELE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDZixNQUFNLENBQUMsS0FBSyxDQUFDLDJCQUEyQixHQUFHLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQztZQUN2RCxPQUFPLEVBQUUsQ0FBQztRQUNaLENBQUM7SUFDSCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEVsZW1lbnRGaWxlT3BlcmF0aW9ucyAtIENvbW1vbiBmaWxlIG9wZXJhdGlvbnMgZm9yIGVsZW1lbnQgbWFuYWdlcnNcbiAqXG4gKiBQcm92aWRlcyBzaGFyZWQgZmlsZSBoYW5kbGluZyBvcGVyYXRpb25zIGZvciBhbGwgZWxlbWVudCB0eXBlczpcbiAqIC0gUmVhZGluZyBmaWxlcyB3aXRoIGZyb250bWF0dGVyIHBhcnNpbmdcbiAqIC0gV3JpdGluZyBmaWxlcyB3aXRoIGF0b21pYyBvcGVyYXRpb25zXG4gKiAtIERpcmVjdG9yeSBzY2FubmluZyBhbmQgZmlsdGVyaW5nXG4gKlxuICogU0VDVVJJVFk6IEFsbCBvcGVyYXRpb25zIHVzZSBGaWxlTG9ja01hbmFnZXIgZm9yIGF0b21pYyByZWFkcy93cml0ZXNcbiAqIFBBVEggVkFMSURBVElPTjogQWxsIHBhdGhzIGFyZSB2YWxpZGF0ZWQgYmVmb3JlIGZpbGUgb3BlcmF0aW9uc1xuICogTE9HR0lORzogT3BlcmF0aW9ucyBhcmUgbG9nZ2VkIGZvciBkZWJ1Z2dpbmcgYW5kIGF1ZGl0IHRyYWlsXG4gKi9cblxuaW1wb3J0IHsgRmlsZUxvY2tNYW5hZ2VyIH0gZnJvbSAnLi4vLi4vc2VjdXJpdHkvZmlsZUxvY2tNYW5hZ2VyLmpzJztcbmltcG9ydCB7IHNhbml0aXplSW5wdXQsIHZhbGlkYXRlUGF0aCB9IGZyb20gJy4uLy4uL3NlY3VyaXR5L0lucHV0VmFsaWRhdG9yLmpzJztcbmltcG9ydCB7IFNlY3VyaXR5TW9uaXRvciB9IGZyb20gJy4uLy4uL3NlY3VyaXR5L3NlY3VyaXR5TW9uaXRvci5qcyc7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi8uLi91dGlscy9sb2dnZXIuanMnO1xuaW1wb3J0IHsgcHJvbWlzZXMgYXMgZnMgfSBmcm9tICdmcyc7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IG1hdHRlciBmcm9tICdncmF5LW1hdHRlcic7XG5cbi8qKlxuICogUmVzdWx0IG9mIHBhcnNpbmcgYSBmaWxlIHdpdGggZnJvbnRtYXR0ZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXJzZWRGaWxlIHtcbiAgbWV0YWRhdGE6IGFueTtcbiAgY29udGVudDogc3RyaW5nO1xuICByYXc6IHN0cmluZztcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciBmaWxlIG9wZXJhdGlvbnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBGaWxlT3BlcmF0aW9uT3B0aW9ucyB7XG4gIC8qKiBNYXhpbXVtIGZpbGUgc2l6ZSBpbiBieXRlcyAoZGVmYXVsdDogMU1CKSAqL1xuICBtYXhTaXplPzogbnVtYmVyO1xuICAvKiogV2hldGhlciB0byB2YWxpZGF0ZSBwYXRoIGlzIHdpdGhpbiBiYXNlIGRpcmVjdG9yeSAoZGVmYXVsdDogdHJ1ZSkgKi9cbiAgdmFsaWRhdGVQYXRoPzogYm9vbGVhbjtcbiAgLyoqIFdoZXRoZXIgdG8gY3JlYXRlIGRpcmVjdG9yeSBpZiBpdCBkb2Vzbid0IGV4aXN0IChkZWZhdWx0OiB0cnVlKSAqL1xuICBlbnN1cmVEaXI/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIFV0aWxpdHkgY2xhc3MgZm9yIGNvbW1vbiBmaWxlIG9wZXJhdGlvbnNcbiAqIFVzZWQgYnkgQmFzZUVsZW1lbnRNYW5hZ2VyIGFuZCBjYW4gYmUgdXNlZCBieSBvdGhlciBtYW5hZ2Vyc1xuICpcbiAqIERFUEVOREVOQ1kgSU5KRUNUSU9OOiBSZXF1aXJlcyBGaWxlTG9ja01hbmFnZXIgaW5zdGFuY2UgZm9yIGF0b21pYyBvcGVyYXRpb25zXG4gKi9cbmV4cG9ydCBjbGFzcyBFbGVtZW50RmlsZU9wZXJhdGlvbnMge1xuICBwcml2YXRlIGZpbGVMb2NrTWFuYWdlcjogRmlsZUxvY2tNYW5hZ2VyO1xuXG4gIC8qKlxuICAgKiBDb25zdHJ1Y3RvciAtIGFjY2VwdHMgRmlsZUxvY2tNYW5hZ2VyIGZvciBhdG9taWMgb3BlcmF0aW9uc1xuICAgKiBAcGFyYW0gZmlsZUxvY2tNYW5hZ2VyIC0gRmlsZUxvY2tNYW5hZ2VyIGluc3RhbmNlIGZvciBhdG9taWMgZmlsZSBvcGVyYXRpb25zXG4gICAqL1xuICBjb25zdHJ1Y3RvcihmaWxlTG9ja01hbmFnZXI6IEZpbGVMb2NrTWFuYWdlcikge1xuICAgIHRoaXMuZmlsZUxvY2tNYW5hZ2VyID0gZmlsZUxvY2tNYW5hZ2VyO1xuICB9XG5cbiAgLyoqXG4gICAqIEF0b21pY2FsbHkgcmVhZCBhIGZpbGUgd2l0aCBmcm9udG1hdHRlclxuICAgKiBTRUNVUklUWTogVXNlcyBGaWxlTG9ja01hbmFnZXIgdG8gcHJldmVudCByYWNlIGNvbmRpdGlvbnNcbiAgICpcbiAgICogQHBhcmFtIGZpbGVQYXRoIC0gQWJzb2x1dGUgb3IgcmVsYXRpdmUgcGF0aCB0byBmaWxlXG4gICAqIEBwYXJhbSBiYXNlRGlyIC0gQmFzZSBkaXJlY3RvcnkgZm9yIHZhbGlkYXRpb25cbiAgICogQHBhcmFtIG9wdGlvbnMgLSBPcGVyYXRpb24gb3B0aW9uc1xuICAgKiBAcmV0dXJucyBQYXJzZWQgZmlsZSB3aXRoIG1ldGFkYXRhIGFuZCBjb250ZW50XG4gICAqL1xuICBhc3luYyByZWFkRmlsZVdpdGhGcm9udG1hdHRlcihcbiAgICBmaWxlUGF0aDogc3RyaW5nLFxuICAgIGJhc2VEaXI6IHN0cmluZyxcbiAgICBvcHRpb25zOiBGaWxlT3BlcmF0aW9uT3B0aW9ucyA9IHt9XG4gICk6IFByb21pc2U8UGFyc2VkRmlsZT4ge1xuICAgIGNvbnN0IHtcbiAgICAgIG1heFNpemUgPSAxMDI0ICogMTAyNCwgLy8gMU1CIGRlZmF1bHRcbiAgICAgIHZhbGlkYXRlUGF0aDogc2hvdWxkVmFsaWRhdGVQYXRoID0gdHJ1ZVxuICAgIH0gPSBvcHRpb25zO1xuXG4gICAgLy8gU0VDVVJJVFk6IFNhbml0aXplIHBhdGhcbiAgICBjb25zdCBzYW5pdGl6ZWRQYXRoID0gc2FuaXRpemVJbnB1dChmaWxlUGF0aCwgMjU1KTtcblxuICAgIC8vIFZhbGlkYXRlIHBhdGggaWYgcmVxdWVzdGVkXG4gICAgaWYgKHNob3VsZFZhbGlkYXRlUGF0aCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgdmFsaWRhdGVQYXRoKHNhbml0aXplZFBhdGgsIGJhc2VEaXIpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGZpbGUgcGF0aDogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6ICdJbnZhbGlkIHBhdGgnfWApO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFJlc29sdmUgZnVsbCBwYXRoXG4gICAgY29uc3QgZnVsbFBhdGggPSBwYXRoLmlzQWJzb2x1dGUoc2FuaXRpemVkUGF0aClcbiAgICAgID8gc2FuaXRpemVkUGF0aFxuICAgICAgOiBwYXRoLmpvaW4oYmFzZURpciwgc2FuaXRpemVkUGF0aCk7XG5cbiAgICAvLyBDaGVjayBmaWxlIHNpemUgYmVmb3JlIHJlYWRpbmdcbiAgICBjb25zdCBzdGF0cyA9IGF3YWl0IGZzLnN0YXQoZnVsbFBhdGgpO1xuICAgIGlmIChzdGF0cy5zaXplID4gbWF4U2l6ZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBGaWxlIHRvbyBsYXJnZTogJHtzdGF0cy5zaXplfSBieXRlcyAobWF4OiAke21heFNpemV9KWApO1xuICAgIH1cblxuICAgIC8vIENSSVRJQ0FMIEZJWDogVXNlIGF0b21pYyBmaWxlIHJlYWQgdmlhIGluamVjdGVkIGluc3RhbmNlXG4gICAgY29uc3QgcmF3ID0gYXdhaXQgdGhpcy5maWxlTG9ja01hbmFnZXIuYXRvbWljUmVhZEZpbGUoZnVsbFBhdGgsIHsgZW5jb2Rpbmc6ICd1dGYtOCcgfSk7XG5cbiAgICAvLyBQYXJzZSBmcm9udG1hdHRlclxuICAgIGNvbnN0IHBhcnNlZCA9IG1hdHRlcihyYXcpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIG1ldGFkYXRhOiBwYXJzZWQuZGF0YSxcbiAgICAgIGNvbnRlbnQ6IHBhcnNlZC5jb250ZW50LFxuICAgICAgcmF3XG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBdG9taWNhbGx5IHdyaXRlIGEgZmlsZSB3aXRoIGZyb250bWF0dGVyXG4gICAqIFNFQ1VSSVRZOiBVc2VzIEZpbGVMb2NrTWFuYWdlciB0byBwcmV2ZW50IGNvcnJ1cHRpb25cbiAgICpcbiAgICogQHBhcmFtIGZpbGVQYXRoIC0gQWJzb2x1dGUgb3IgcmVsYXRpdmUgcGF0aCB0byBmaWxlXG4gICAqIEBwYXJhbSBtZXRhZGF0YSAtIFlBTUwgZnJvbnRtYXR0ZXIgbWV0YWRhdGFcbiAgICogQHBhcmFtIGNvbnRlbnQgLSBGaWxlIGNvbnRlbnRcbiAgICogQHBhcmFtIGJhc2VEaXIgLSBCYXNlIGRpcmVjdG9yeSBmb3IgdmFsaWRhdGlvblxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIE9wZXJhdGlvbiBvcHRpb25zXG4gICAqL1xuICBhc3luYyB3cml0ZUZpbGVXaXRoRnJvbnRtYXR0ZXIoXG4gICAgZmlsZVBhdGg6IHN0cmluZyxcbiAgICBtZXRhZGF0YTogYW55LFxuICAgIGNvbnRlbnQ6IHN0cmluZyxcbiAgICBiYXNlRGlyOiBzdHJpbmcsXG4gICAgb3B0aW9uczogRmlsZU9wZXJhdGlvbk9wdGlvbnMgPSB7fVxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB7XG4gICAgICB2YWxpZGF0ZVBhdGg6IHNob3VsZFZhbGlkYXRlUGF0aCA9IHRydWUsXG4gICAgICBlbnN1cmVEaXIgPSB0cnVlXG4gICAgfSA9IG9wdGlvbnM7XG5cbiAgICAvLyBTRUNVUklUWTogU2FuaXRpemUgcGF0aFxuICAgIGNvbnN0IHNhbml0aXplZFBhdGggPSBzYW5pdGl6ZUlucHV0KGZpbGVQYXRoLCAyNTUpO1xuXG4gICAgLy8gVmFsaWRhdGUgcGF0aCBpZiByZXF1ZXN0ZWRcbiAgICBpZiAoc2hvdWxkVmFsaWRhdGVQYXRoKSB7XG4gICAgICB0cnkge1xuICAgICAgICB2YWxpZGF0ZVBhdGgoc2FuaXRpemVkUGF0aCwgYmFzZURpcik7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgZmlsZSBwYXRoOiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogJ0ludmFsaWQgcGF0aCd9YCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gUmVzb2x2ZSBmdWxsIHBhdGhcbiAgICBjb25zdCBmdWxsUGF0aCA9IHBhdGguaXNBYnNvbHV0ZShzYW5pdGl6ZWRQYXRoKVxuICAgICAgPyBzYW5pdGl6ZWRQYXRoXG4gICAgICA6IHBhdGguam9pbihiYXNlRGlyLCBzYW5pdGl6ZWRQYXRoKTtcblxuICAgIC8vIEVuc3VyZSBkaXJlY3RvcnkgZXhpc3RzXG4gICAgaWYgKGVuc3VyZURpcikge1xuICAgICAgYXdhaXQgZnMubWtkaXIocGF0aC5kaXJuYW1lKGZ1bGxQYXRoKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgfVxuXG4gICAgLy8gQ2xlYW4gbWV0YWRhdGEgdG8gcmVtb3ZlIHVuZGVmaW5lZCB2YWx1ZXNcbiAgICBjb25zdCBjbGVhbk1ldGFkYXRhID0gT2JqZWN0LmVudHJpZXMobWV0YWRhdGEpLnJlZHVjZSgoYWNjLCBba2V5LCB2YWx1ZV0pID0+IHtcbiAgICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGFjY1trZXldID0gdmFsdWU7XG4gICAgICB9XG4gICAgICByZXR1cm4gYWNjO1xuICAgIH0sIHt9IGFzIGFueSk7XG5cbiAgICAvLyBDcmVhdGUgZnJvbnRtYXR0ZXIgY29udGVudFxuICAgIGNvbnN0IGZpbGVDb250ZW50ID0gbWF0dGVyLnN0cmluZ2lmeShjb250ZW50LCBjbGVhbk1ldGFkYXRhKTtcblxuICAgIC8vIENSSVRJQ0FMIEZJWDogVXNlIGF0b21pYyBmaWxlIHdyaXRlIHZpYSBpbmplY3RlZCBpbnN0YW5jZVxuICAgIGF3YWl0IHRoaXMuZmlsZUxvY2tNYW5hZ2VyLmF0b21pY1dyaXRlRmlsZShmdWxsUGF0aCwgZmlsZUNvbnRlbnQsIHsgZW5jb2Rpbmc6ICd1dGYtOCcgfSk7XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGUgcGF0aCBpcyB3aXRoaW4gYmFzZSBkaXJlY3RvcnkgYW5kIHJlc29sdmUgdG8gYWJzb2x1dGUgcGF0aFxuICAgKiBTRUNVUklUWTogUHJldmVudHMgcGF0aCB0cmF2ZXJzYWwgYXR0YWNrc1xuICAgKlxuICAgKiBAcGFyYW0gZmlsZVBhdGggLSBQYXRoIHRvIHZhbGlkYXRlXG4gICAqIEBwYXJhbSBiYXNlRGlyIC0gQmFzZSBkaXJlY3RvcnlcbiAgICogQHJldHVybnMgTm9ybWFsaXplZCBhYnNvbHV0ZSBwYXRoXG4gICAqIEB0aHJvd3MgRXJyb3IgaWYgcGF0aCBpcyBpbnZhbGlkIG9yIG91dHNpZGUgYmFzZSBkaXJlY3RvcnlcbiAgICovXG4gIHZhbGlkYXRlQW5kUmVzb2x2ZVBhdGgoZmlsZVBhdGg6IHN0cmluZywgYmFzZURpcjogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBzYW5pdGl6ZWRQYXRoID0gc2FuaXRpemVJbnB1dChmaWxlUGF0aCwgMjU1KTtcblxuICAgIC8vIFJlc29sdmUgdG8gYWJzb2x1dGUgcGF0aFxuICAgIGNvbnN0IGZ1bGxQYXRoID0gcGF0aC5pc0Fic29sdXRlKHNhbml0aXplZFBhdGgpXG4gICAgICA/IHNhbml0aXplZFBhdGhcbiAgICAgIDogcGF0aC5qb2luKGJhc2VEaXIsIHNhbml0aXplZFBhdGgpO1xuXG4gICAgLy8gTm9ybWFsaXplIGFuZCBjaGVjayBwYXRoIHRyYXZlcnNhbFxuICAgIGNvbnN0IG5vcm1hbGl6ZWRQYXRoID0gcGF0aC5ub3JtYWxpemUoZnVsbFBhdGgpO1xuXG4gICAgaWYgKCFub3JtYWxpemVkUGF0aC5zdGFydHNXaXRoKGJhc2VEaXIpKSB7XG4gICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgIHR5cGU6ICdQQVRIX1RSQVZFUlNBTF9BVFRFTVBUJyxcbiAgICAgICAgc2V2ZXJpdHk6ICdDUklUSUNBTCcsXG4gICAgICAgIHNvdXJjZTogJ0VsZW1lbnRGaWxlT3BlcmF0aW9ucy52YWxpZGF0ZUFuZFJlc29sdmVQYXRoJyxcbiAgICAgICAgZGV0YWlsczogYEF0dGVtcHRlZCB0byBhY2Nlc3MgZmlsZSBvdXRzaWRlIGRpcmVjdG9yeTogJHtzYW5pdGl6ZWRQYXRofWBcbiAgICAgIH0pO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdQYXRoIHRyYXZlcnNhbCBhdHRlbXB0IGRldGVjdGVkJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5vcm1hbGl6ZWRQYXRoO1xuICB9XG5cbiAgLyoqXG4gICAqIEdlbmVyYXRlIGZpbGVuYW1lIGZyb20gZWxlbWVudCBuYW1lXG4gICAqIENvbnZlcnRzIG5hbWUgdG8gbG93ZXJjYXNlIGFuZCByZXBsYWNlcyBpbnZhbGlkIGNoYXJhY3RlcnMgd2l0aCBoeXBoZW5zXG4gICAqXG4gICAqIEBwYXJhbSBuYW1lIC0gRWxlbWVudCBuYW1lXG4gICAqIEBwYXJhbSBleHRlbnNpb24gLSBGaWxlIGV4dGVuc2lvbiAoZGVmYXVsdDogJy5tZCcpXG4gICAqIEByZXR1cm5zIFNhbml0aXplZCBmaWxlbmFtZVxuICAgKi9cbiAgZ2VuZXJhdGVGaWxlbmFtZShuYW1lOiBzdHJpbmcsIGV4dGVuc2lvbjogc3RyaW5nID0gJy5tZCcpOiBzdHJpbmcge1xuICAgIGNvbnN0IHNhbml0aXplZCA9IHNhbml0aXplSW5wdXQobmFtZSwgMTAwKTtcbiAgICBjb25zdCBmaWxlbmFtZSA9IHNhbml0aXplZFxuICAgICAgLnRvTG93ZXJDYXNlKClcbiAgICAgIC5yZXBsYWNlQWxsKC9bXmEtejAtOS1dL2csICctJylcbiAgICAgIC5yZXBsYWNlQWxsKC8tKy9nLCAnLScpXG4gICAgICAucmVwbGFjZUFsbCgvXi18LSQvZywgJycpO1xuXG4gICAgcmV0dXJuIGAke2ZpbGVuYW1lfSR7ZXh0ZW5zaW9ufWA7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgYSBmaWxlIGV4aXN0c1xuICAgKlxuICAgKiBAcGFyYW0gZmlsZVBhdGggLSBQYXRoIHRvIGNoZWNrXG4gICAqIEBwYXJhbSBiYXNlRGlyIC0gQmFzZSBkaXJlY3RvcnkgKG9wdGlvbmFsKVxuICAgKiBAcmV0dXJucyBUcnVlIGlmIGZpbGUgZXhpc3RzXG4gICAqL1xuICBhc3luYyBmaWxlRXhpc3RzKGZpbGVQYXRoOiBzdHJpbmcsIGJhc2VEaXI/OiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgc2FuaXRpemVkUGF0aCA9IHNhbml0aXplSW5wdXQoZmlsZVBhdGgsIDI1NSk7XG4gICAgICBjb25zdCBmdWxsUGF0aCA9IGJhc2VEaXJcbiAgICAgICAgPyBwYXRoLmpvaW4oYmFzZURpciwgc2FuaXRpemVkUGF0aClcbiAgICAgICAgOiBzYW5pdGl6ZWRQYXRoO1xuICAgICAgYXdhaXQgZnMuYWNjZXNzKGZ1bGxQYXRoKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBEZWxldGUgYSBmaWxlIHdpdGggdmFsaWRhdGlvblxuICAgKiBTRUNVUklUWTogVmFsaWRhdGVzIHBhdGggYmVmb3JlIGRlbGV0aW9uXG4gICAqXG4gICAqIEBwYXJhbSBmaWxlUGF0aCAtIFBhdGggdG8gZGVsZXRlXG4gICAqIEBwYXJhbSBiYXNlRGlyIC0gQmFzZSBkaXJlY3RvcnkgZm9yIHZhbGlkYXRpb25cbiAgICogQHRocm93cyBFcnJvciBpZiBwYXRoIGlzIGludmFsaWRcbiAgICovXG4gIGFzeW5jIGRlbGV0ZUZpbGUoZmlsZVBhdGg6IHN0cmluZywgYmFzZURpcjogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qgbm9ybWFsaXplZFBhdGggPSB0aGlzLnZhbGlkYXRlQW5kUmVzb2x2ZVBhdGgoZmlsZVBhdGgsIGJhc2VEaXIpO1xuXG4gICAgLy8gTG9nIHNlY3VyaXR5IGV2ZW50XG4gICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgdHlwZTogJ0VMRU1FTlRfREVMRVRFRCcsXG4gICAgICBzZXZlcml0eTogJ01FRElVTScsXG4gICAgICBzb3VyY2U6ICdFbGVtZW50RmlsZU9wZXJhdGlvbnMuZGVsZXRlRmlsZScsXG4gICAgICBkZXRhaWxzOiBgRmlsZSBkZWxldGVkOiAke3BhdGguYmFzZW5hbWUobm9ybWFsaXplZFBhdGgpfWBcbiAgICB9KTtcblxuICAgIGF3YWl0IGZzLnVubGluayhub3JtYWxpemVkUGF0aCk7XG4gIH1cblxuICAvKipcbiAgICogTGlzdCBmaWxlcyBpbiBhIGRpcmVjdG9yeVxuICAgKlxuICAgKiBAcGFyYW0gZGlyIC0gRGlyZWN0b3J5IHRvIGxpc3RcbiAgICogQHBhcmFtIGV4dGVuc2lvbiAtIEZpbHRlciBieSBleHRlbnNpb24gKG9wdGlvbmFsKVxuICAgKiBAcmV0dXJucyBBcnJheSBvZiBmaWxlIHBhdGhzXG4gICAqL1xuICBhc3luYyBsaXN0RmlsZXMoZGlyOiBzdHJpbmcsIGV4dGVuc2lvbj86IHN0cmluZyk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgICB0cnkge1xuICAgICAgLy8gRW5zdXJlIGRpcmVjdG9yeSBleGlzdHNcbiAgICAgIGF3YWl0IGZzLm1rZGlyKGRpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cbiAgICAgIGNvbnN0IGZpbGVzID0gYXdhaXQgZnMucmVhZGRpcihkaXIpO1xuXG4gICAgICBpZiAoZXh0ZW5zaW9uKSB7XG4gICAgICAgIHJldHVybiBmaWxlcy5maWx0ZXIoZiA9PiBmLmVuZHNXaXRoKGV4dGVuc2lvbikpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZmlsZXM7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci5lcnJvcihgRmFpbGVkIHRvIGxpc3QgZmlsZXMgaW4gJHtkaXJ9OmAsIGVycm9yKTtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
|
|
226
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRWxlbWVudEZpbGVPcGVyYXRpb25zLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2VsZW1lbnRzL2Jhc2UvRWxlbWVudEZpbGVPcGVyYXRpb25zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7OztHQVdHO0FBR0gsT0FBTyxFQUFFLGFBQWEsRUFBRSxZQUFZLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUMvRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDcEUsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQy9DLE9BQU8sRUFBRSxRQUFRLElBQUksRUFBRSxFQUFFLE1BQU0sSUFBSSxDQUFDO0FBQ3BDLE9BQU8sS0FBSyxJQUFJLE1BQU0sTUFBTSxDQUFDO0FBQzdCLE9BQU8sTUFBTSxNQUFNLGFBQWEsQ0FBQztBQXVCakM7Ozs7O0dBS0c7QUFDSCxNQUFNLE9BQU8scUJBQXFCO0lBQ3hCLGVBQWUsQ0FBa0I7SUFFekM7OztPQUdHO0lBQ0gsWUFBWSxlQUFnQztRQUMxQyxJQUFJLENBQUMsZUFBZSxHQUFHLGVBQWUsQ0FBQztJQUN6QyxDQUFDO0lBRUQ7Ozs7Ozs7O09BUUc7SUFDSCxLQUFLLENBQUMsdUJBQXVCLENBQzNCLFFBQWdCLEVBQ2hCLE9BQWUsRUFDZixVQUFnQyxFQUFFO1FBRWxDLE1BQU0sRUFDSixPQUFPLEdBQUcsSUFBSSxHQUFHLElBQUksRUFBRSxjQUFjO1FBQ3JDLFlBQVksRUFBRSxrQkFBa0IsR0FBRyxJQUFJLEVBQ3hDLEdBQUcsT0FBTyxDQUFDO1FBRVosMEJBQTBCO1FBQzFCLE1BQU0sYUFBYSxHQUFHLGFBQWEsQ0FBQyxRQUFRLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFFbkQsNkJBQTZCO1FBQzdCLElBQUksa0JBQWtCLEVBQUUsQ0FBQztZQUN2QixJQUFJLENBQUM7Z0JBQ0gsWUFBWSxDQUFDLGFBQWEsRUFBRSxPQUFPLENB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QUUsUUFBUTtZQUNsQixNQUFNLEVBQUUsa0NBQWtDO1lBQzFDLE9BQU8sRUFBRSxpQkFBaUIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsRUFBRTtTQUMxRCxDQUFDLENBQUM7UUFFSCxNQUFNLEVBQUUsQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLENBQUM7SUFDbEMsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNILEtBQUssQ0FBQyxTQUFTLENBQUMsR0FBVyxFQUFFLFNBQWtCO1FBQzdDLElBQUksQ0FBQztZQUNILDBCQUEwQjtZQUMxQixNQUFNLEVBQUUsQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7WUFFekMsTUFBTSxLQUFLLEdBQUcsTUFBTSxFQUFFLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBRXBDLElBQUksU0FBUyxFQUFFLENBQUM7Z0JBQ2QsT0FBTyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO1lBQ2xELENBQUM7WUFFRCxPQUFPLEtBQUssQ0FBQztRQUNmLENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2YsTUFBTSxDQUFDLEtBQUssQ0FBQywyQkFBMkIsR0FBRyxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDdkQsT0FBTyxFQUFFLENBQUM7UUFDWixDQUFDO0lBQ0gsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBFbGVtZW50RmlsZU9wZXJhdGlvbnMgLSBDb21tb24gZmlsZSBvcGVyYXRpb25zIGZvciBlbGVtZW50IG1hbmFnZXJzXG4gKlxuICogUHJvdmlkZXMgc2hhcmVkIGZpbGUgaGFuZGxpbmcgb3BlcmF0aW9ucyBmb3IgYWxsIGVsZW1lbnQgdHlwZXM6XG4gKiAtIFJlYWRpbmcgZmlsZXMgd2l0aCBmcm9udG1hdHRlciBwYXJzaW5nXG4gKiAtIFdyaXRpbmcgZmlsZXMgd2l0aCBhdG9taWMgb3BlcmF0aW9uc1xuICogLSBEaXJlY3Rvcnkgc2Nhbm5pbmcgYW5kIGZpbHRlcmluZ1xuICpcbiAqIFNFQ1VSSVRZOiBBbGwgb3BlcmF0aW9ucyB1c2UgRmlsZUxvY2tNYW5hZ2VyIGZvciBhdG9taWMgcmVhZHMvd3JpdGVzXG4gKiBQQVRIIFZBTElEQVRJT046IEFsbCBwYXRocyBhcmUgdmFsaWRhdGVkIGJlZm9yZSBmaWxlIG9wZXJhdGlvbnNcbiAqIExPR0dJTkc6IE9wZXJhdGlvbnMgYXJlIGxvZ2dlZCBmb3IgZGVidWdnaW5nIGFuZCBhdWRpdCB0cmFpbFxuICovXG5cbmltcG9ydCB7IEZpbGVMb2NrTWFuYWdlciB9IGZyb20gJy4uLy4uL3NlY3VyaXR5L2ZpbGVMb2NrTWFuYWdlci5qcyc7XG5pbXBvcnQgeyBzYW5pdGl6ZUlucHV0LCB2YWxpZGF0ZVBhdGggfSBmcm9tICcuLi8uLi9zZWN1cml0eS9JbnB1dFZhbGlkYXRvci5qcyc7XG5pbXBvcnQgeyBTZWN1cml0eU1vbml0b3IgfSBmcm9tICcuLi8uLi9zZWN1cml0eS9zZWN1cml0eU1vbml0b3IuanMnO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vLi4vdXRpbHMvbG9nZ2VyLmpzJztcbmltcG9ydCB7IHByb21pc2VzIGFzIGZzIH0gZnJvbSAnZnMnO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCBtYXR0ZXIgZnJvbSAnZ3JheS1tYXR0ZXInO1xuXG4vKipcbiAqIFJlc3VsdCBvZiBwYXJzaW5nIGEgZmlsZSB3aXRoIGZyb250bWF0dGVyXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGFyc2VkRmlsZSB7XG4gIG1ldGFkYXRhOiBhbnk7XG4gIGNvbnRlbnQ6IHN0cmluZztcbiAgcmF3OiBzdHJpbmc7XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3IgZmlsZSBvcGVyYXRpb25zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRmlsZU9wZXJhdGlvbk9wdGlvbnMge1xuICAvKiogTWF4aW11bSBmaWxlIHNpemUgaW4gYnl0ZXMgKGRlZmF1bHQ6IDFNQikgKi9cbiAgbWF4U2l6ZT86IG51bWJlcjtcbiAgLyoqIFdoZXRoZXIgdG8gdmFsaWRhdGUgcGF0aCBpcyB3aXRoaW4gYmFzZSBkaXJlY3RvcnkgKGRlZmF1bHQ6IHRydWUpICovXG4gIHZhbGlkYXRlUGF0aD86IGJvb2xlYW47XG4gIC8qKiBXaGV0aGVyIHRvIGNyZWF0ZSBkaXJlY3RvcnkgaWYgaXQgZG9lc24ndCBleGlzdCAoZGVmYXVsdDogdHJ1ZSkgKi9cbiAgZW5zdXJlRGlyPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBVdGlsaXR5IGNsYXNzIGZvciBjb21tb24gZmlsZSBvcGVyYXRpb25zXG4gKiBVc2VkIGJ5IEJhc2VFbGVtZW50TWFuYWdlciBhbmQgY2FuIGJlIHVzZWQgYnkgb3RoZXIgbWFuYWdlcnNcbiAqXG4gKiBERVBFTkRFTkNZIElOSkVDVElPTjogUmVxdWlyZXMgRmlsZUxvY2tNYW5hZ2VyIGluc3RhbmNlIGZvciBhdG9taWMgb3BlcmF0aW9uc1xuICovXG5leHBvcnQgY2xhc3MgRWxlbWVudEZpbGVPcGVyYXRpb25zIHtcbiAgcHJpdmF0ZSBmaWxlTG9ja01hbmFnZXI6IEZpbGVMb2NrTWFuYWdlcjtcblxuICAvKipcbiAgICogQ29uc3RydWN0b3IgLSBhY2NlcHRzIEZpbGVMb2NrTWFuYWdlciBmb3IgYXRvbWljIG9wZXJhdGlvbnNcbiAgICogQHBhcmFtIGZpbGVMb2NrTWFuYWdlciAtIEZpbGVMb2NrTWFuYWdlciBpbnN0YW5jZSBmb3IgYXRvbWljIGZpbGUgb3BlcmF0aW9uc1xuICAgKi9cbiAgY29uc3RydWN0b3IoZmlsZUxvY2tNYW5hZ2VyOiBGaWxlTG9ja01hbmFnZXIpIHtcbiAgICB0aGlzLmZpbGVMb2NrTWFuYWdlciA9IGZpbGVMb2NrTWFuYWdlcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBBdG9taWNhbGx5IHJlYWQgYSBmaWxlIHdpdGggZnJvbnRtYXR0ZXJcbiAgICogU0VDVVJJVFk6IFVzZXMgRmlsZUxvY2tNYW5hZ2VyIHRvIHByZXZlbnQgcmFjZSBjb25kaXRpb25zXG4gICAqXG4gICAqIEBwYXJhbSBmaWxlUGF0aCAtIEFic29sdXRlIG9yIHJlbGF0aXZlIHBhdGggdG8gZmlsZVxuICAgKiBAcGFyYW0gYmFzZURpciAtIEJhc2UgZGlyZWN0b3J5IGZvciB2YWxpZGF0aW9uXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gT3BlcmF0aW9uIG9wdGlvbnNcbiAgICogQHJldHVybnMgUGFyc2VkIGZpbGUgd2l0aCBtZXRhZGF0YSBhbmQgY29udGVudFxuICAgKi9cbiAgYXN5bmMgcmVhZEZpbGVXaXRoRnJvbnRtYXR0ZXIoXG4gICAgZmlsZVBhdGg6IHN0cmluZyxcbiAgICBiYXNlRGlyOiBzdHJpbmcsXG4gICAgb3B0aW9uczogRmlsZU9wZXJhdGlvbk9wdGlvbnMgPSB7fVxuICApOiBQcm9taXNlPFBhcnNlZEZpbGU+IHtcbiAgICBjb25zdCB7XG4gICAgICBtYXhTaXplID0gMTAyNCAqIDEwMjQsIC8vIDFNQiBkZWZhdWx0XG4gICAgICB2YWxpZGF0ZVBhdGg6IHNob3VsZFZhbGlkYXRlUGF0aCA9IHRydWVcbiAgICB9ID0gb3B0aW9ucztcblxuICAgIC8vIFNFQ1VSSVRZOiBTYW5pdGl6ZSBwYXRoXG4gICAgY29uc3Qgc2FuaXRpemVkUGF0aCA9IHNhbml0aXplSW5wdXQoZmlsZVBhdGgsIDI1NSk7XG5cbiAgICAvLyBWYWxpZGF0ZSBwYXRoIGlmIHJlcXVlc3RlZFxuICAgIGlmIChzaG91bGRWYWxpZGF0ZVBhdGgpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHZhbGlkYXRlUGF0aChzYW5pdGl6ZWRQYXRoLCBiYXNlRGlyKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBmaWxlIHBhdGg6ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiAnSW52YWxpZCBwYXRoJ31gKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBSZXNvbHZlIGZ1bGwgcGF0aFxuICAgIGNvbnN0IGZ1bGxQYXRoID0gcGF0aC5pc0Fic29sdXRlKHNhbml0aXplZFBhdGgpXG4gICAgICA/IHNhbml0aXplZFBhdGhcbiAgICAgIDogcGF0aC5qb2luKGJhc2VEaXIsIHNhbml0aXplZFBhdGgpO1xuXG4gICAgLy8gQ2hlY2sgZmlsZSBzaXplIGJlZm9yZSByZWFkaW5nXG4gICAgY29uc3Qgc3RhdHMgPSBhd2FpdCBmcy5zdGF0KGZ1bGxQYXRoKTtcbiAgICBpZiAoc3RhdHMuc2l6ZSA+IG1heFNpemUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRmlsZSB0b28gbGFyZ2U6ICR7c3RhdHMuc2l6ZX0gYnl0ZXMgKG1heDogJHttYXhTaXplfSlgKTtcbiAgICB9XG5cbiAgICAvLyBDUklUSUNBTCBGSVg6IFVzZSBhdG9taWMgZmlsZSByZWFkIHZpYSBpbmplY3RlZCBpbnN0YW5jZVxuICAgIGNvbnN0IHJhdyA9IGF3YWl0IHRoaXMuZmlsZUxvY2tNYW5hZ2VyLmF0b21pY1JlYWRGaWxlKGZ1bGxQYXRoLCB7IGVuY29kaW5nOiAndXRmLTgnIH0pO1xuXG4gICAgLy8gUGFyc2UgZnJvbnRtYXR0ZXJcbiAgICBjb25zdCBwYXJzZWQgPSBtYXR0ZXIocmF3KTtcblxuICAgIHJldHVybiB7XG4gICAgICBtZXRhZGF0YTogcGFyc2VkLmRhdGEsXG4gICAgICBjb250ZW50OiBwYXJzZWQuY29udGVudCxcbiAgICAgIHJhd1xuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQXRvbWljYWxseSB3cml0ZSBhIGZpbGUgd2l0aCBmcm9udG1hdHRlclxuICAgKiBTRUNVUklUWTogVXNlcyBGaWxlTG9ja01hbmFnZXIgdG8gcHJldmVudCBjb3JydXB0aW9uXG4gICAqXG4gICAqIEBwYXJhbSBmaWxlUGF0aCAtIEFic29sdXRlIG9yIHJlbGF0aXZlIHBhdGggdG8gZmlsZVxuICAgKiBAcGFyYW0gbWV0YWRhdGEgLSBZQU1MIGZyb250bWF0dGVyIG1ldGFkYXRhXG4gICAqIEBwYXJhbSBjb250ZW50IC0gRmlsZSBjb250ZW50XG4gICAqIEBwYXJhbSBiYXNlRGlyIC0gQmFzZSBkaXJlY3RvcnkgZm9yIHZhbGlkYXRpb25cbiAgICogQHBhcmFtIG9wdGlvbnMgLSBPcGVyYXRpb24gb3B0aW9uc1xuICAgKi9cbiAgYXN5bmMgd3JpdGVGaWxlV2l0aEZyb250bWF0dGVyKFxuICAgIGZpbGVQYXRoOiBzdHJpbmcsXG4gICAgbWV0YWRhdGE6IGFueSxcbiAgICBjb250ZW50OiBzdHJpbmcsXG4gICAgYmFzZURpcjogc3RyaW5nLFxuICAgIG9wdGlvbnM6IEZpbGVPcGVyYXRpb25PcHRpb25zID0ge31cbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qge1xuICAgICAgdmFsaWRhdGVQYXRoOiBzaG91bGRWYWxpZGF0ZVBhdGggPSB0cnVlLFxuICAgICAgZW5zdXJlRGlyID0gdHJ1ZVxuICAgIH0gPSBvcHRpb25zO1xuXG4gICAgLy8gU0VDVVJJVFk6IFNhbml0aXplIHBhdGhcbiAgICBjb25zdCBzYW5pdGl6ZWRQYXRoID0gc2FuaXRpemVJbnB1dChmaWxlUGF0aCwgMjU1KTtcblxuICAgIC8vIFZhbGlkYXRlIHBhdGggaWYgcmVxdWVzdGVkXG4gICAgaWYgKHNob3VsZFZhbGlkYXRlUGF0aCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgdmFsaWRhdGVQYXRoKHNhbml0aXplZFBhdGgsIGJhc2VEaXIpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGZpbGUgcGF0aDogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6ICdJbnZhbGlkIHBhdGgnfWApO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFJlc29sdmUgZnVsbCBwYXRoXG4gICAgY29uc3QgZnVsbFBhdGggPSBwYXRoLmlzQWJzb2x1dGUoc2FuaXRpemVkUGF0aClcbiAgICAgID8gc2FuaXRpemVkUGF0aFxuICAgICAgOiBwYXRoLmpvaW4oYmFzZURpciwgc2FuaXRpemVkUGF0aCk7XG5cbiAgICAvLyBFbnN1cmUgZGlyZWN0b3J5IGV4aXN0c1xuICAgIGlmIChlbnN1cmVEaXIpIHtcbiAgICAgIGF3YWl0IGZzLm1rZGlyKHBhdGguZGlybmFtZShmdWxsUGF0aCksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIH1cblxuICAgIC8vIENsZWFuIG1ldGFkYXRhIHRvIHJlbW92ZSB1bmRlZmluZWQgdmFsdWVzXG4gICAgY29uc3QgY2xlYW5NZXRhZGF0YSA9IE9iamVjdC5lbnRyaWVzKG1ldGFkYXRhKS5yZWR1Y2UoKGFjYywgW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICBpZiAoa2V5ICE9PSAnZ2F0ZWtlZXBlckRpYWdub3N0aWNzJyAmJiB2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGFjY1trZXldID0gdmFsdWU7XG4gICAgICB9XG4gICAgICByZXR1cm4gYWNjO1xuICAgIH0sIHt9IGFzIGFueSk7XG5cbiAgICAvLyBDcmVhdGUgZnJvbnRtYXR0ZXIgY29udGVudFxuICAgIGNvbnN0IGZpbGVDb250ZW50ID0gbWF0dGVyLnN0cmluZ2lmeShjb250ZW50LCBjbGVhbk1ldGFkYXRhKTtcblxuICAgIC8vIENSSVRJQ0FMIEZJWDogVXNlIGF0b21pYyBmaWxlIHdyaXRlIHZpYSBpbmplY3RlZCBpbnN0YW5jZVxuICAgIGF3YWl0IHRoaXMuZmlsZUxvY2tNYW5hZ2VyLmF0b21pY1dyaXRlRmlsZShmdWxsUGF0aCwgZmlsZUNvbnRlbnQsIHsgZW5jb2Rpbmc6ICd1dGYtOCcgfSk7XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGUgcGF0aCBpcyB3aXRoaW4gYmFzZSBkaXJlY3RvcnkgYW5kIHJlc29sdmUgdG8gYWJzb2x1dGUgcGF0aFxuICAgKiBTRUNVUklUWTogUHJldmVudHMgcGF0aCB0cmF2ZXJzYWwgYXR0YWNrc1xuICAgKlxuICAgKiBAcGFyYW0gZmlsZVBhdGggLSBQYXRoIHRvIHZhbGlkYXRlXG4gICAqIEBwYXJhbSBiYXNlRGlyIC0gQmFzZSBkaXJlY3RvcnlcbiAgICogQHJldHVybnMgTm9ybWFsaXplZCBhYnNvbHV0ZSBwYXRoXG4gICAqIEB0aHJvd3MgRXJyb3IgaWYgcGF0aCBpcyBpbnZhbGlkIG9yIG91dHNpZGUgYmFzZSBkaXJlY3RvcnlcbiAgICovXG4gIHZhbGlkYXRlQW5kUmVzb2x2ZVBhdGgoZmlsZVBhdGg6IHN0cmluZywgYmFzZURpcjogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBzYW5pdGl6ZWRQYXRoID0gc2FuaXRpemVJbnB1dChmaWxlUGF0aCwgMjU1KTtcblxuICAgIC8vIFJlc29sdmUgdG8gYWJzb2x1dGUgcGF0aFxuICAgIGNvbnN0IGZ1bGxQYXRoID0gcGF0aC5pc0Fic29sdXRlKHNhbml0aXplZFBhdGgpXG4gICAgICA/IHNhbml0aXplZFBhdGhcbiAgICAgIDogcGF0aC5qb2luKGJhc2VEaXIsIHNhbml0aXplZFBhdGgpO1xuXG4gICAgLy8gTm9ybWFsaXplIGFuZCBjaGVjayBwYXRoIHRyYXZlcnNhbFxuICAgIGNvbnN0IG5vcm1hbGl6ZWRQYXRoID0gcGF0aC5ub3JtYWxpemUoZnVsbFBhdGgpO1xuXG4gICAgaWYgKCFub3JtYWxpemVkUGF0aC5zdGFydHNXaXRoKGJhc2VEaXIpKSB7XG4gICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgIHR5cGU6ICdQQVRIX1RSQVZFUlNBTF9BVFRFTVBUJyxcbiAgICAgICAgc2V2ZXJpdHk6ICdDUklUSUNBTCcsXG4gICAgICAgIHNvdXJjZTogJ0VsZW1lbnRGaWxlT3BlcmF0aW9ucy52YWxpZGF0ZUFuZFJlc29sdmVQYXRoJyxcbiAgICAgICAgZGV0YWlsczogYEF0dGVtcHRlZCB0byBhY2Nlc3MgZmlsZSBvdXRzaWRlIGRpcmVjdG9yeTogJHtzYW5pdGl6ZWRQYXRofWBcbiAgICAgIH0pO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdQYXRoIHRyYXZlcnNhbCBhdHRlbXB0IGRldGVjdGVkJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5vcm1hbGl6ZWRQYXRoO1xuICB9XG5cbiAgLyoqXG4gICAqIEdlbmVyYXRlIGZpbGVuYW1lIGZyb20gZWxlbWVudCBuYW1lXG4gICAqIENvbnZlcnRzIG5hbWUgdG8gbG93ZXJjYXNlIGFuZCByZXBsYWNlcyBpbnZhbGlkIGNoYXJhY3RlcnMgd2l0aCBoeXBoZW5zXG4gICAqXG4gICAqIEBwYXJhbSBuYW1lIC0gRWxlbWVudCBuYW1lXG4gICAqIEBwYXJhbSBleHRlbnNpb24gLSBGaWxlIGV4dGVuc2lvbiAoZGVmYXVsdDogJy5tZCcpXG4gICAqIEByZXR1cm5zIFNhbml0aXplZCBmaWxlbmFtZVxuICAgKi9cbiAgZ2VuZXJhdGVGaWxlbmFtZShuYW1lOiBzdHJpbmcsIGV4dGVuc2lvbjogc3RyaW5nID0gJy5tZCcpOiBzdHJpbmcge1xuICAgIGNvbnN0IHNhbml0aXplZCA9IHNhbml0aXplSW5wdXQobmFtZSwgMTAwKTtcbiAgICBjb25zdCBmaWxlbmFtZSA9IHNhbml0aXplZFxuICAgICAgLnRvTG93ZXJDYXNlKClcbiAgICAgIC5yZXBsYWNlQWxsKC9bXmEtejAtOS1dL2csICctJylcbiAgICAgIC5yZXBsYWNlQWxsKC8tKy9nLCAnLScpXG4gICAgICAucmVwbGFjZUFsbCgvXi18LSQvZywgJycpO1xuXG4gICAgcmV0dXJuIGAke2ZpbGVuYW1lfSR7ZXh0ZW5zaW9ufWA7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgYSBmaWxlIGV4aXN0c1xuICAgKlxuICAgKiBAcGFyYW0gZmlsZVBhdGggLSBQYXRoIHRvIGNoZWNrXG4gICAqIEBwYXJhbSBiYXNlRGlyIC0gQmFzZSBkaXJlY3RvcnkgKG9wdGlvbmFsKVxuICAgKiBAcmV0dXJucyBUcnVlIGlmIGZpbGUgZXhpc3RzXG4gICAqL1xuICBhc3luYyBmaWxlRXhpc3RzKGZpbGVQYXRoOiBzdHJpbmcsIGJhc2VEaXI/OiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgc2FuaXRpemVkUGF0aCA9IHNhbml0aXplSW5wdXQoZmlsZVBhdGgsIDI1NSk7XG4gICAgICBjb25zdCBmdWxsUGF0aCA9IGJhc2VEaXJcbiAgICAgICAgPyBwYXRoLmpvaW4oYmFzZURpciwgc2FuaXRpemVkUGF0aClcbiAgICAgICAgOiBzYW5pdGl6ZWRQYXRoO1xuICAgICAgYXdhaXQgZnMuYWNjZXNzKGZ1bGxQYXRoKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBEZWxldGUgYSBmaWxlIHdpdGggdmFsaWRhdGlvblxuICAgKiBTRUNVUklUWTogVmFsaWRhdGVzIHBhdGggYmVmb3JlIGRlbGV0aW9uXG4gICAqXG4gICAqIEBwYXJhbSBmaWxlUGF0aCAtIFBhdGggdG8gZGVsZXRlXG4gICAqIEBwYXJhbSBiYXNlRGlyIC0gQmFzZSBkaXJlY3RvcnkgZm9yIHZhbGlkYXRpb25cbiAgICogQHRocm93cyBFcnJvciBpZiBwYXRoIGlzIGludmFsaWRcbiAgICovXG4gIGFzeW5jIGRlbGV0ZUZpbGUoZmlsZVBhdGg6IHN0cmluZywgYmFzZURpcjogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qgbm9ybWFsaXplZFBhdGggPSB0aGlzLnZhbGlkYXRlQW5kUmVzb2x2ZVBhdGgoZmlsZVBhdGgsIGJhc2VEaXIpO1xuXG4gICAgLy8gTG9nIHNlY3VyaXR5IGV2ZW50XG4gICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgdHlwZTogJ0VMRU1FTlRfREVMRVRFRCcsXG4gICAgICBzZXZlcml0eTogJ01FRElVTScsXG4gICAgICBzb3VyY2U6ICdFbGVtZW50RmlsZU9wZXJhdGlvbnMuZGVsZXRlRmlsZScsXG4gICAgICBkZXRhaWxzOiBgRmlsZSBkZWxldGVkOiAke3BhdGguYmFzZW5hbWUobm9ybWFsaXplZFBhdGgpfWBcbiAgICB9KTtcblxuICAgIGF3YWl0IGZzLnVubGluayhub3JtYWxpemVkUGF0aCk7XG4gIH1cblxuICAvKipcbiAgICogTGlzdCBmaWxlcyBpbiBhIGRpcmVjdG9yeVxuICAgKlxuICAgKiBAcGFyYW0gZGlyIC0gRGlyZWN0b3J5IHRvIGxpc3RcbiAgICogQHBhcmFtIGV4dGVuc2lvbiAtIEZpbHRlciBieSBleHRlbnNpb24gKG9wdGlvbmFsKVxuICAgKiBAcmV0dXJucyBBcnJheSBvZiBmaWxlIHBhdGhzXG4gICAqL1xuICBhc3luYyBsaXN0RmlsZXMoZGlyOiBzdHJpbmcsIGV4dGVuc2lvbj86IHN0cmluZyk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgICB0cnkge1xuICAgICAgLy8gRW5zdXJlIGRpcmVjdG9yeSBleGlzdHNcbiAgICAgIGF3YWl0IGZzLm1rZGlyKGRpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cbiAgICAgIGNvbnN0IGZpbGVzID0gYXdhaXQgZnMucmVhZGRpcihkaXIpO1xuXG4gICAgICBpZiAoZXh0ZW5zaW9uKSB7XG4gICAgICAgIHJldHVybiBmaWxlcy5maWx0ZXIoZiA9PiBmLmVuZHNXaXRoKGV4dGVuc2lvbikpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZmlsZXM7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci5lcnJvcihgRmFpbGVkIHRvIGxpc3QgZmlsZXMgaW4gJHtkaXJ9OmAsIGVycm9yKTtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
|
|
@@ -308,7 +308,7 @@ export class EnsembleManager extends BaseElementManager {
|
|
|
308
308
|
allowNested,
|
|
309
309
|
maxNestingDepth,
|
|
310
310
|
elements,
|
|
311
|
-
gatekeeper: sanitizeGatekeeperPolicy(data.gatekeeper, name, 'ensemble'), // Issue #524
|
|
311
|
+
gatekeeper: sanitizeGatekeeperPolicy(data.gatekeeper, name, 'ensemble', data), // Issue #524
|
|
312
312
|
};
|
|
313
313
|
return metadata;
|
|
314
314
|
}
|
|
@@ -571,7 +571,7 @@ export class EnsembleManager extends BaseElementManager {
|
|
|
571
571
|
maxNestingDepth: metadata.maxNestingDepth || ENSEMBLE_DEFAULTS.MAX_NESTING_DEPTH,
|
|
572
572
|
elements: migratedElements,
|
|
573
573
|
// Issue #524 — Gatekeeper policy (symmetric with buildMetadata deserialization)
|
|
574
|
-
gatekeeper: sanitizeGatekeeperPolicy(metadata.gatekeeper, metadata.name, 'ensemble'),
|
|
574
|
+
gatekeeper: sanitizeGatekeeperPolicy(metadata.gatekeeper, metadata.name, 'ensemble', metadata),
|
|
575
575
|
};
|
|
576
576
|
// Use inherited getElementFilename() for consistent filename normalization
|
|
577
577
|
const filename = this.getElementFilename(fullMetadata.name);
|
|
@@ -826,4 +826,4 @@ export class EnsembleManager extends BaseElementManager {
|
|
|
826
826
|
}
|
|
827
827
|
}
|
|
828
828
|
}
|
|
829
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRW5zZW1ibGVNYW5hZ2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2VsZW1lbnRzL2Vuc2VtYmxlcy9FbnNlbWJsZU1hbmFnZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBaUJHO0FBRUgsT0FBTyxFQUFFLFFBQVEsRUFBcUMsTUFBTSxlQUFlLENBQUM7QUFFNUUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSx5Q0FBeUMsQ0FBQztBQUMxRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUVuRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDcEUsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQy9DLE9BQU8sRUFDTCxpQkFBaUIsRUFDakIsZUFBZSxFQUNmLHdCQUF3QixFQUN4QixlQUFlLEVBQ2YscUJBQXFCLEVBQ3JCLG1CQUFtQixFQUNuQixhQUFhLEVBQ2IsZ0JBQWdCLEVBQ2pCLE1BQU0sZ0JBQWdCLENBQUM7QUFTeEIsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ2pFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxlQUFlLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUNuRixPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxvREFBb0QsQ0FBQztBQUU5RiwyRUFBMkU7QUFDM0UsT0FBTyxFQUFFLDJCQUEyQixFQUFFLGlCQUFpQixFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFFdkcsb0ZBQW9GO0FBQ3BGLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQ3pFLE9BQU8sRUFBRSxtQkFBbUIsRUFBcUMsTUFBTSxvQ0FBb0MsQ0FBQztBQUU1RyxvRkFBb0Y7QUFDcEYsTUFBTSxD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TUFBTSxPQUFPLEdBQUcsU0FBUyxHQUFHLE9BQU8sQ0FBQztZQUVwQyxJQUFJLE9BQU8sR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDaEIsTUFBTSxDQUFDLElBQUksQ0FDVCxjQUFjLE9BQU8sdUNBQXVDO29CQUM1RCxxQkFBcUIsT0FBTyxJQUFJLGlCQUFpQixDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQ2pFLENBQUM7Z0JBRUYsZUFBZSxDQUFDLGdCQUFnQixDQUFDO29CQUMvQixJQUFJLEVBQUUsaUJBQWlCO29CQUN2QixRQUFRLEVBQUUsS0FBSztvQkFDZixNQUFNLEVBQUUsNkNBQTZDO29CQUNyRCxPQUFPLEVBQUUsV0FBVyxPQUFPLG1DQUFtQztvQkFDOUQsY0FBYyxFQUFFO3dCQUNkLFlBQVksRUFBRSxPQUFPO3dCQUNyQixXQUFXLEVBQUUsT0FBTzt3QkFDcEIsVUFBVSxFQUFFLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO3FCQUNsQztpQkFDRixDQUFDLENBQUM7WUFDTCxDQUFDO1FBQ0gsQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDZixNQUFNLENBQUMsS0FBSyxDQUFDLDJDQUEyQyxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBRWpFLGVBQWUsQ0FBQyxnQkFBZ0IsQ0FBQztnQkFDL0IsSUFBSSxFQUFFLGlCQUFpQjtnQkFDdkIsUUFBUSxFQUFFLEtBQUs7Z0JBQ2YsTUFBTSxFQUFFLDZDQUE2QztnQkFDckQsT0FBTyxFQUFFLG1CQUFtQixLQUFLLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUU7YUFDckYsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztJQUNILENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogRW5zZW1ibGVNYW5hZ2VyIC0gSW1wbGVtZW50YXRpb24gb2YgSUVsZW1lbnRNYW5hZ2VyIGZvciBFbnNlbWJsZSBlbGVtZW50c1xuICpcbiAqIEhhbmRsZXMgQ1JVRCBvcGVyYXRpb25zIGFuZCBsaWZlY3ljbGUgbWFuYWdlbWVudCBmb3IgZW5zZW1ibGVzIGltcGxlbWVudGluZyBJRWxlbWVudFxuICpcbiAqIEFSQ0hJVEVDVFVSRTpcbiAqIC0gRXh0ZW5kcyBCYXNlRWxlbWVudE1hbmFnZXIgZm9yIHVuaWZpZWQgZWxlbWVudCBtYW5hZ2VtZW50XG4gKiAtIEZvbGxvd3MgdGVtcGxhdGUgbWV0aG9kIHBhdHRlcm4gKHBhcnNlTWV0YWRhdGEsIGNyZWF0ZUVsZW1lbnQgaG9va3MpXG4gKiAtIFB1cmUgbWFuYWdlciBsYXllciAtIGRlbGVnYXRlcyBidXNpbmVzcyBsb2dpYyB0byBFbnNlbWJsZSBjbGFzc1xuICogLSBVc2VzIERJIGZvciBkZXBlbmRlbmNpZXMgKFBvcnRmb2xpb01hbmFnZXIsIEZpbGVMb2NrTWFuYWdlcilcbiAqXG4gKiBTRUNVUklUWTpcbiAqIC0gVXNlcyBGaWxlTG9ja01hbmFnZXIgZm9yIGF0b21pYyBmaWxlIG9wZXJhdGlvbnNcbiAqIC0gUGF0aCB2YWxpZGF0aW9uIHByZXZlbnRzIGRpcmVjdG9yeSB0cmF2ZXJzYWwgYXR0YWNrc1xuICogLSBJbnB1dCBzYW5pdGl6YXRpb24gZm9yIGFsbCB1c2VyIGRhdGFcbiAqIC0gU2VjdXJpdHkgZXZlbnQgbG9nZ2luZyBmb3IgYXVkaXQgdHJhaWxzXG4gKiAtIFNlY3VyZVlhbWxQYXJzZXIgZm9yIHNhZmUgWUFNTCBwYXJzaW5nXG4gKi9cblxuaW1wb3J0IHsgRW5zZW1ibGUsIEVuc2VtYmxlTWV0YWRhdGEsIEVuc2VtYmxlRWxlbWVudCB9IGZyb20gJy4vRW5zZW1ibGUuanMnO1xuaW1wb3J0IHsgRWxlbWVudFZhbGlkYXRpb25SZXN1bHQgfSBmcm9tICcuLi8uLi90eXBlcy9lbGVtZW50cy9JRWxlbWVudC5qcyc7XG5pbXBvcnQgeyBFbGVtZW50VHlwZSB9IGZyb20gJy4uLy4uL3BvcnRmb2xpby90eXBlcy5qcyc7XG5pbXBvcnQgeyB0b1Npbmd1bGFyTGFiZWwgfSBmcm9tICcuLi8uLi91dGlscy9lbGVtZW50VHlwZU5vcm1hbGl6YXRpb24uanMnO1xuaW1wb3J0IHsgQmFzZUVsZW1lbnRNYW5hZ2VyIH0gZnJvbSAnLi4vYmFzZS9CYXNlRWxlbWVudE1hbmFnZXIuanMnO1xuaW1wb3J0IHsgRmlsZUxvY2tNYW5hZ2VyIH0gZnJvbSAnLi4vLi4vc2VjdXJpdHkvZmlsZUxvY2tNYW5hZ2VyLmpzJztcbmltcG9ydCB7IFNlY3VyaXR5TW9uaXRvciB9IGZyb20gJy4uLy4uL3NlY3VyaXR5L3NlY3VyaXR5TW9uaXRvci5qcyc7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi8uLi91dGlscy9sb2dnZXIuanMnO1xuaW1wb3J0IHtcbiAgRU5TRU1CTEVfREVGQVVMVFMsXG4gIEVOU0VNQkxFX0xJTUlUUyxcbiAgRU5TRU1CTEVfU0VDVVJJVFlfRVZFTlRTLFxuICBFTlNFTUJMRV9FUlJPUlMsXG4gIEFDVElWQVRJT05fU1RSQVRFR0lFUyxcbiAgQ09ORkxJQ1RfU1RSQVRFR0lFUyxcbiAgRUxFTUVOVF9ST0xFUyxcbiAgQUNUSVZBVElPTl9NT0RFU1xufSBmcm9tICcuL2NvbnN0YW50cy5qcyc7XG5pbXBvcnQgdHlwZSB7IEFjdGl2YXRpb25TdHJhdGVneSwgQ29uZmxpY3RSZXNvbHV0aW9uU3RyYXRlZ3ksIEVsZW1lbnRSb2xlLCBBY3RpdmF0aW9uTW9kZSB9IGZyb20gJy4vdHlwZXMuanMnO1xuaW1wb3J0IHsgUG9ydGZvbGlvTWFuYWdlciB9IGZyb20gJy4uLy4uL3BvcnRmb2xpby9Qb3J0Zm9saW9NYW5hZ2VyLmpzJztcbmltcG9ydCB7IFZhbGlkYXRpb25SZWdpc3RyeSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3ZhbGlkYXRpb24vVmFsaWRhdGlvblJlZ2lzdHJ5LmpzJztcbmltcG9ydCB7IFZhbGlkYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvdmFsaWRhdGlvbi9WYWxpZGF0aW9uU2VydmljZS5qcyc7XG5pbXBvcnQgeyBTZXJpYWxpemF0aW9uU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL1NlcmlhbGl6YXRpb25TZXJ2aWNlLmpzJztcbmltcG9ydCB7IE1ldGFkYXRhU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL01ldGFkYXRhU2VydmljZS5qcyc7XG5pbXBvcnQgeyBGaWxlT3BlcmF0aW9uc1NlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9GaWxlT3BlcmF0aW9uc1NlcnZpY2UuanMnO1xuaW1wb3J0IHsgRmlsZVdhdGNoU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL0ZpbGVXYXRjaFNlcnZpY2UuanMnO1xuaW1wb3J0IHsgRWxlbWVudE1lc3NhZ2VzIH0gZnJvbSAnLi4vLi4vdXRpbHMvZWxlbWVudE1lc3NhZ2VzLmpzJztcbmltcG9ydCB7IFZBTElEQVRJT05fUEFUVEVSTlMsIFNFQ1VSSVRZX0xJTUlUUyB9IGZyb20gJy4uLy4uL3NlY3VyaXR5L2NvbnN0YW50cy5qcyc7XG5pbXBvcnQgeyBzYW5pdGl6ZUdhdGVrZWVwZXJQb2xpY3kgfSBmcm9tICcuLi8uLi9oYW5kbGVycy9tY3AtYXFsL3BvbGljaWVzL0VsZW1lbnRQb2xpY2llcy5qcyc7XG5cbi8vIElzc3VlICM4MzogQ2VudHJhbGl6ZWQgYWN0aXZlIGVsZW1lbnQgbGltaXRzIChjb25maWd1cmFibGUgdmlhIGVudiB2YXJzKVxuaW1wb3J0IHsgZ2V0QWN0aXZlRWxlbWVudExpbWl0Q29uZmlnLCBnZXRNYXhBY3RpdmVMaW1pdCB9IGZyb20gJy4uLy4uL2NvbmZpZy9hY3RpdmUtZWxlbWVudC1saW1pdHMuanMnO1xuXG4vLyBJc3N1ZSAjNDY2OiBTaGFyZWQgZWxlbWVudCB0eXBlIHJlc29sdmVyIOKAlCByZS1leHBvcnRlZCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eVxuaW1wb3J0IHsgcmVzb2x2ZUVsZW1lbnRUeXBlcyB9IGZyb20gJy4uLy4uL3V0aWxzL2VsZW1lbnRUeXBlUmVzb2x2ZXIuanMnO1xuZXhwb3J0IHsgcmVzb2x2ZUVsZW1lbnRUeXBlcywgdHlwZSBFbGVtZW50TWFuYWdlcnNGb3JSZXNvbHV0aW9uIH0gZnJvbSAnLi4vLi4vdXRpbHMvZWxlbWVudFR5cGVSZXNvbHZlci5qcyc7XG5cbi8qKiBAZGVwcmVjYXRlZCBVc2UgcmVzb2x2ZUVsZW1lbnRUeXBlcyBmcm9tICcuLi8uLi91dGlscy9lbGVtZW50VHlwZVJlc29sdmVyLmpzJyAqL1xuZXhwb3J0IGNvbnN0IHJlc29sdmVFbnNlbWJsZUVsZW1lbnRUeXBlcyA9IHJlc29sdmVFbGVtZW50VHlwZXM7XG5cbi8qKlxuICogRW5zZW1ibGVNYW5hZ2VyIC0gTWFuYWdlcyBlbnNlbWJsZSBlbGVtZW50IGxpZmVjeWNsZVxuICpcbiAqIEV4dGVuZHMgQmFzZUVsZW1lbnRNYW5hZ2VyIHRvIHByb3ZpZGUgZW5zZW1ibGUtc3BlY2lmaWMgb3BlcmF0aW9uczpcbiAqIC0gWUFNTCBwYXJzaW5nIHdpdGggYm90aCBzbmFrZV9jYXNlIGFuZCBjYW1lbENhc2Ugc3VwcG9ydFxuICogLSBFbnNlbWJsZSBjcmVhdGlvbiBhbmQgdmFsaWRhdGlvblxuICogLSBFbGVtZW50IHJlZmVyZW5jZSBtYW5hZ2VtZW50XG4gKiAtIEltcG9ydC9leHBvcnQgaW4gbXVsdGlwbGUgZm9ybWF0c1xuICovXG5leHBvcnQgY2xhc3MgRW5zZW1ibGVNYW5hZ2VyIGV4dGVuZHMgQmFzZUVsZW1lbnRNYW5hZ2VyPEVuc2VtYmxlPiB7XG4gIHByaXZhdGUgcmVhZG9ubHkgZW5zZW1ibGVzRGlyOiBzdHJpbmc7XG4gIHByaXZhdGUgdmFsaWRhdGlvblNlcnZpY2U6IFZhbGlkYXRpb25TZXJ2aWNlO1xuICBwcml2YXRlIHNlcmlhbGl6YXRpb25TZXJ2aWNlOiBTZXJpYWxpemF0aW9uU2VydmljZTtcbiAgcHJpdmF0ZSBhY3RpdmVFbnNlbWJsZU5hbWVzOiBTZXQ8c3RyaW5nPiA9IG5ldyBTZXQoKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwb3J0Zm9saW9NYW5hZ2VyOiBQb3J0Zm9saW9NYW5hZ2VyLFxuICAgIGZpbGVMb2NrTWFuYWdlcjogRmlsZUxvY2tNYW5hZ2VyLFxuICAgIGZpbGVPcGVyYXRpb25zU2VydmljZTogRmlsZU9wZXJhdGlvbnNTZXJ2aWNlLFxuICAgIHZhbGlkYXRpb25SZWdpc3RyeTogVmFsaWRhdGlvblJlZ2lzdHJ5LFxuICAgIHNlcmlhbGl6YXRpb25TZXJ2aWNlOiBTZXJpYWxpemF0aW9uU2VydmljZSxcbiAgICBwcml2YXRlIG1ldGFkYXRhU2VydmljZTogTWV0YWRhdGFTZXJ2aWNlLFxuICAgIGZpbGVXYXRjaFNlcnZpY2U/OiBGaWxlV2F0Y2hTZXJ2aWNlLFxuICAgIG1lbW9yeUJ1ZGdldD86IGltcG9ydCgnLi4vLi4vY2FjaGUvQ2FjaGVNZW1vcnlCdWRnZXQuanMnKS5DYWNoZU1lbW9yeUJ1ZGdldCxcbiAgICBiYWNrdXBTZXJ2aWNlPzogaW1wb3J0KCcuLi8uLi9zZXJ2aWNlcy9CYWNrdXBTZXJ2aWNlLmpzJykuQmFja3VwU2VydmljZVxuICApIHtcbiAgICBzdXBlcihFbGVtZW50VHlwZS5FTlNFTUJMRSwgcG9ydGZvbGlvTWFuYWdlciwgZmlsZUxvY2tNYW5hZ2VyLCB7IGZpbGVXYXRjaFNlcnZpY2UsIG1lbW9yeUJ1ZGdldCwgYmFja3VwU2VydmljZSB9LCBmaWxlT3BlcmF0aW9uc1NlcnZpY2UsIHZhbGlkYXRpb25SZWdpc3RyeSk7XG4gICAgdGhpcy5lbnNlbWJsZXNEaXIgPSB0aGlzLmVsZW1lbnREaXI7XG4gICAgdGhpcy52YWxpZGF0aW9uU2VydmljZSA9IHZhbGlkYXRpb25SZWdpc3RyeS5nZXRWYWxpZGF0aW9uU2VydmljZSgpO1xuICAgIHRoaXMuc2VyaWFsaXphdGlvblNlcnZpY2UgPSBzZXJpYWxpemF0aW9uU2VydmljZTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBnZXRFbGVtZW50TGFiZWwoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gJ2Vuc2VtYmxlJztcbiAgfVxuXG4gIC8qKlxuICAgKiBQYXJzZSBtZXRhZGF0YSBmcm9tIFlBTUwgZnJvbnRtYXR0ZXJcbiAgICpcbiAgICogTkFNSU5HIENPTlZFTlRJT04gU1VQUE9SVDpcbiAgICogLSBUeXBlU2NyaXB0IGludGVyZmFjZXMgdXNlIGNhbWVsQ2FzZSAoYWN0aXZhdGlvblN0cmF0ZWd5LCBjb25mbGljdFJlc29sdXRpb24pXG4gICAqIC0gWUFNTCBmaWxlcyBjYW4gdXNlIHNuYWtlX2Nhc2UgKGFjdGl2YXRpb25fc3RyYXRlZ3ksIGNvbmZsaWN0X3Jlc29sdXRpb24pXG4gICAqIC0gVGhpcyBtZXRob2QgbWFwcyBzbmFrZV9jYXNlIOKGkiBjYW1lbENhc2UgZm9yIHVzZXIgY29udmVuaWVuY2VcbiAgICpcbiAgICogQHBhcmFtIGRhdGEgLSBSYXcgWUFNTCBkYXRhIGZyb20gZnJvbnRtYXR0ZXJcbiAgICogQHJldHVybnMgVmFsaWRhdGVkIEVuc2VtYmxlTWV0YWRhdGFcbiAgICovXG4gIHByb3RlY3RlZCBvdmVycmlkZSBhc3luYyBwYXJzZU1ldGFkYXRhKGRhdGE6IGFueSk6IFByb21pc2U8RW5zZW1ibGVNZXRhZGF0YT4ge1xuICAgIC8vIFJFRkFDVE9SRUQ6IFVzZSB2YWxpZGF0ZU1ldGFkYXRhRmllbGQgZm9yIGZpZWxkLWF3YXJlIGVycm9yIG1lc3NhZ2VzICgjMzY1KVxuICAgIGNvbnN0IG5hbWVSZXN1bHQgPSB0aGlzLnZhbGlkYXRpb25TZXJ2aWNlLnZhbGlkYXRlTWV0YWRhdGFGaWVsZCgnbmFtZScsIGRhdGEubmFtZSwge1xuICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICBtYXhMZW5ndGg6IFNFQ1VSSVRZX0xJTUlUUy5NQVhfTkFNRV9MRU5HVEhcbiAgICB9KTtcbiAgICBpZiAoIW5hbWVSZXN1bHQuaXNWYWxpZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBWYWxpZGF0aW9uIGZhaWxlZDogJHtuYW1lUmVzdWx0LmVycm9ycz8uam9pbignLCAnKX1gKTtcbiAgICB9XG4gICAgY29uc3QgbmFtZSA9IG5hbWVSZXN1bHQuc2FuaXRpemVkVmFsdWU7XG5cbiAgICBpZiAoIW5hbWUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRW5zZW1ibGUgbWV0YWRhdGEgbXVzdCBpbmNsdWRlIGEgbmFtZScpO1xuICAgIH1cblxuICAgIC8vIFJFRkFDVE9SRUQ6IFVzZSB2YWxpZGF0ZU1ldGFkYXRhRmllbGQgZm9yIGZpZWxkLWF3YXJlIGVycm9yIG1lc3NhZ2VzICgjMzY1KVxuICAgIGxldCBkZXNjcmlwdGlvbjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIGlmIChkYXRhLmRlc2NyaXB0aW9uKSB7XG4gICAgICBjb25zdCBkZXNjUmVzdWx0ID0gdGhpcy52YWxpZGF0aW9uU2VydmljZS52YWxpZGF0ZU1ldGFkYXRhRmllbGQoJ2Rlc2NyaXB0aW9uJywgZGF0YS5kZXNjcmlwdGlvbiwge1xuICAgICAgICByZXF1aXJlZDogZmFsc2UsXG4gICAgICAgIG1heExlbmd0aDogU0VDVVJJVFlfTElNSVRTLk1BWF9ERVNDUklQVElPTl9MRU5HVEgsXG4gICAgICAgIHBhdHRlcm46IFZBTElEQVRJT05fUEFUVEVSTlMuU0FGRV9ERVNDUklQVElPTlxuICAgICAgfSk7XG4gICAgICBpZiAoIWRlc2NSZXN1bHQuaXNWYWxpZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFZhbGlkYXRpb24gZmFpbGVkOiAke2Rlc2NSZXN1bHQuZXJyb3JzPy5qb2luKCcsICcpfWApO1xuICAgICAgfVxuICAgICAgZGVzY3JpcHRpb24gPSBkZXNjUmVzdWx0LnNhbml0aXplZFZhbHVlO1xuICAgIH1cblxuICAgIC8vIFJFRkFDVE9SRUQ6IFVzZSBWYWxpZGF0aW9uU2VydmljZSBmb3IgYWN0aXZhdGlvbiBzdHJhdGVneSAoc3VwcG9ydCBib3RoIHNuYWtlX2Nhc2UgYW5kIGNhbWVsQ2FzZSlcbiAgICBjb25zdCBhY3RpdmF0aW9uU3RyYXRlZ3lSYXcgPSBkYXRhLmFjdGl2YXRpb25fc3RyYXRlZ3kgfHwgZGF0YS5hY3RpdmF0aW9uU3RyYXRlZ3kgfHwgRU5TRU1CTEVfREVGQVVMVFMuQUNUSVZBVElPTl9TVFJBVEVHWTtcbiAgICBjb25zdCBhY3RpdmF0aW9uU3RyYXRlZ3lSZXN1bHQgPSB0aGlzLnZhbGlkYXRpb25TZXJ2aWNlLnZhbGlkYXRlQW5kU2FuaXRpemVJbnB1dChTdHJpbmcoYWN0aXZhdGlvblN0cmF0ZWd5UmF3KSwge1xuICAgICAgbWF4TGVuZ3RoOiBTRUNVUklUWV9MSU1JVFMuTUFYX0VOVU1fRklFTERfTEVOR1RILFxuICAgICAgYWxsb3dTcGFjZXM6IGZhbHNlXG4gICAgfSk7XG4gICAgaWYgKCFhY3RpdmF0aW9uU3RyYXRlZ3lSZXN1bHQuaXNWYWxpZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGFjdGl2YXRpb24gc3RyYXRlZ3k6ICR7YWN0aXZhdGlvblN0cmF0ZWd5UmVzdWx0LmVycm9ycz8uam9pbignLCAnKX1gKTtcbiAgICB9XG4gICAgY29uc3QgYWN0aXZhdGlvblN0cmF0ZWd5ID0gYWN0aXZhdGlvblN0cmF0ZWd5UmVzdWx0LnNhbml0aXplZFZhbHVlITtcblxuICAgIC8vIEtFRVA6IEVudW0gdmFsaWRhdGlvbiBsb2dpYyAoYWRkIEFGVEVSIFZhbGlkYXRpb25TZXJ2aWNlIHNhbml0aXphdGlvbilcbiAgICBpZiAoIUFDVElWQVRJT05fU1RSQVRFR0lFUy5pbmNsdWRlcyhhY3RpdmF0aW9uU3RyYXRlZ3kgYXMgYW55KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGAke0VOU0VNQkxFX0VSUk9SUy5JTlZBTElEX1NUUkFURUdZfTogJHthY3RpdmF0aW9uU3RyYXRlZ3l9YCk7XG4gICAgfVxuXG4gICAgLy8gUkVGQUNUT1JFRDogVXNlIFZhbGlkYXRpb25TZXJ2aWNlIGZvciBjb25mbGljdCByZXNvbHV0aW9uIHN0cmF0ZWd5XG4gICAgY29uc3QgY29uZmxpY3RSZXNvbHV0aW9uUmF3ID0gZGF0YS5jb25mbGljdF9yZXNvbHV0aW9uIHx8IGRhdGEuY29uZmxpY3RSZXNvbHV0aW9uIHx8IEVOU0VNQkxFX0RFRkFVTFRTLkNPTkZMSUNUX1JFU09MVVRJT047XG4gICAgY29uc3QgY29uZmxpY3RSZXNvbHV0aW9uUmVzdWx0ID0gdGhpcy52YWxpZGF0aW9uU2VydmljZS52YWxpZGF0ZUFuZFNhbml0aXplSW5wdXQoU3RyaW5nKGNvbmZsaWN0UmVzb2x1dGlvblJhdyksIHtcbiAgICAgIG1heExlbmd0aDogU0VDVVJJVFlfTElNSVRTLk1BWF9FTlVNX0ZJRUxEX0xFTkdUSCxcbiAgICAgIGFsbG93U3BhY2VzOiBmYWxzZVxuICAgIH0pO1xuICAgIGlmICghY29uZmxpY3RSZXNvbHV0aW9uUmVzdWx0LmlzVmFsaWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBjb25mbGljdCByZXNvbHV0aW9uIHN0cmF0ZWd5OiAke2NvbmZsaWN0UmVzb2x1dGlvblJlc3VsdC5lcnJvcnM/LmpvaW4oJywgJyl9YCk7XG4gICAgfVxuICAgIGNvbnN0IGNvbmZsaWN0UmVzb2x1dGlvbiA9IGNvbmZsaWN0UmVzb2x1dGlvblJlc3VsdC5zYW5pdGl6ZWRWYWx1ZSE7XG5cbiAgICAvLyBLRUVQOiBFbnVtIHZhbGlkYXRpb24gbG9naWMgKGFkZCBBRlRFUiBWYWxpZGF0aW9uU2VydmljZSBzYW5pdGl6YXRpb24pXG4gICAgaWYgKCFDT05GTElDVF9TVFJBVEVHSUVTLmluY2x1ZGVzKGNvbmZsaWN0UmVzb2x1dGlvbiBhcyBhbnkpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7RU5TRU1CTEVfRVJST1JTLklOVkFMSURfQ09ORkxJQ1RfUkVTT0xVVElPTn06ICR7Y29uZmxpY3RSZXNvbHV0aW9ufWApO1xuICAgIH1cblxuICAgIC8vIFJFRkFDVE9SRUQ6IFVzZSBWYWxpZGF0aW9uU2VydmljZSBmb3IgY29udGV4dCBzaGFyaW5nIG1vZGVcbiAgICBjb25zdCBjb250ZXh0U2hhcmluZ1JhdyA9IGRhdGEuY29udGV4dF9zaGFyaW5nIHx8IGRhdGEuY29udGV4dFNoYXJpbmcgfHwgRU5TRU1CTEVfREVGQVVMVFMuQ09OVEVYVF9TSEFSSU5HO1xuXG4gICAgLy8gRklYOiBIYW5kbGUgYm9vbGVhbiB2YWx1ZXMgKHRydWUgLT4gJ2Z1bGwnLCBmYWxzZSAtPiAnbm9uZScpXG4gICAgbGV0IGNvbnRleHRTaGFyaW5nVmFsdWU6IHN0cmluZztcbiAgICBpZiAodHlwZW9mIGNvbnRleHRTaGFyaW5nUmF3ID09PSAnYm9vbGVhbicpIHtcbiAgICAgIGNvbnRleHRTaGFyaW5nVmFsdWUgPSBjb250ZXh0U2hhcmluZ1JhdyA/ICdmdWxsJyA6ICdub25lJztcbiAgICB9IGVsc2Uge1xuICAgICAgY29udGV4dFNoYXJpbmdWYWx1ZSA9IFN0cmluZyhjb250ZXh0U2hhcmluZ1Jhdyk7XG4gICAgfVxuXG4gICAgY29uc3QgY29udGV4dFNoYXJpbmdSZXN1bHQgPSB0aGlzLnZhbGlkYXRpb25TZXJ2aWNlLnZhbGlkYXRlQW5kU2FuaXRpemVJbnB1dChjb250ZXh0U2hhcmluZ1ZhbHVlLCB7XG4gICAgICBtYXhMZW5ndGg6IFNFQ1VSSVRZX0xJTUlUUy5NQVhfRU5VTV9GSUVMRF9MRU5HVEgsXG4gICAgICBhbGxvd1NwYWNlczogZmFsc2VcbiAgICB9KTtcbiAgICBpZiAoIWNvbnRleHRTaGFyaW5nUmVzdWx0LmlzVmFsaWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBjb250ZXh0IHNoYXJpbmcgbW9kZTogJHtjb250ZXh0U2hhcmluZ1Jlc3VsdC5lcnJvcnM/LmpvaW4oJywgJyl9YCk7XG4gICAgfVxuICAgIGNvbnN0IGNvbnRleHRTaGFyaW5nID0gY29udGV4dFNoYXJpbmdSZXN1bHQuc2FuaXRpemVkVmFsdWUhO1xuXG4gICAgLy8gS0VFUDogRW51bSB2YWxpZGF0aW9uIGxvZ2ljIChhZGQgQUZURVIgVmFsaWRhdGlvblNlcnZpY2Ugc2FuaXRpemF0aW9uKVxuICAgIGlmICghWydub25lJywgJ3NlbGVjdGl2ZScsICdmdWxsJ10uaW5jbHVkZXMoY29udGV4dFNoYXJpbmcpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgY29udGV4dCBzaGFyaW5nIG1vZGU6ICR7Y29udGV4dFNoYXJpbmd9YCk7XG4gICAgfVxuXG4gICAgLy8gUGFyc2UgcmVzb3VyY2UgbGltaXRzIChzdXBwb3J0IHNuYWtlX2Nhc2UpXG4gICAgY29uc3QgcmVzb3VyY2VMaW1pdHNSYXcgPSBkYXRhLnJlc291cmNlX2xpbWl0cyB8fCBkYXRhLnJlc291cmNlTGltaXRzO1xuICAgIGxldCByZXNvdXJjZUxpbWl0cztcblxuICAgIGlmIChyZXNvdXJjZUxpbWl0c1Jhdykge1xuICAgICAgcmVzb3VyY2VMaW1pdHMgPSB7XG4gICAgICAgIG1heEFjdGl2ZUVsZW1lbnRzOiByZXNvdXJjZUxpbWl0c1Jhdy5tYXhfYWN0aXZlX2VsZW1lbnRzIHx8IHJlc291cmNlTGltaXRzUmF3Lm1heEFjdGl2ZUVsZW1lbnRzIHx8IEVOU0VNQkxFX0xJTUlUUy5NQVhfRUxFTUVOVFMsXG4gICAgICAgIG1heE1lbW9yeU1iOiByZXNvdXJjZUxpbWl0c1Jhdy5tYXhfbWVtb3J5X21iIHx8IHJlc291cmNlTGltaXRzUmF3Lm1heE1lbW9yeU1iLFxuICAgICAgICBtYXhFeGVjdXRpb25UaW1lTXM6IHJlc291cmNlTGltaXRzUmF3Lm1heF9leGVjdXRpb25fdGltZV9tcyB8fCByZXNvdXJjZUxpbWl0c1Jhdy5tYXhFeGVjdXRpb25UaW1lTXMgfHwgRU5TRU1CTEVfTElNSVRTLk1BWF9BQ1RJVkFUSU9OX1RJTUVcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gUGFyc2UgZWxlbWVudHMgYXJyYXlcbiAgICBjb25zdCBlbGVtZW50c1JhdyA9IGRhdGEuZWxlbWVudHMgfHwgW107XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGVsZW1lbnRzUmF3KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdFbnNlbWJsZSBlbGVtZW50cyBtdXN0IGJlIGFuIGFycmF5Jyk7XG4gICAgfVxuXG4gICAgY29uc3QgZWxlbWVudHM6IEVuc2VtYmxlRWxlbWVudFtdID0gZWxlbWVudHNSYXcubWFwKChlbGVtOiBhbnksIGluZGV4OiBudW1iZXIpID0+IHtcbiAgICAgIC8vIFJFRkFDVE9SRUQ6IFVzZSBWYWxpZGF0aW9uU2VydmljZSBmb3IgZWxlbWVudCBuYW1lXG4gICAgICAvLyBTdXBwb3J0IGJvdGggZWxlbWVudF9uYW1lIChuZXcgc3RhbmRhcmQpIGFuZCBuYW1lIChsZWdhY3kpIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eVxuICAgICAgY29uc3QgcmF3RWxlbWVudE5hbWUgPSBlbGVtLmVsZW1lbnRfbmFtZSB8fCBlbGVtLm5hbWU7XG4gICAgICBpZiAoIXJhd0VsZW1lbnROYW1lKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRWxlbWVudCBhdCBpbmRleCAke2luZGV4fSBtdXN0IGhhdmUgZWxlbWVudF9uYW1lIChvciBuYW1lIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSlgKTtcbiAgICAgIH1cbiAgICAgIC8vIExvZyBkZXByZWNhdGlvbiB3YXJuaW5nIGlmIHVzaW5nIGxlZ2FjeSAnbmFtZScgZmllbGRcbiAgICAgIGlmIChlbGVtLm5hbWUgJiYgIWVsZW0uZWxlbWVudF9uYW1lKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKGBFbnNlbWJsZSBlbGVtZW50IGF0IGluZGV4ICR7aW5kZXh9IHVzZXMgZGVwcmVjYXRlZCAnbmFtZScgZmllbGQuIFVzZSAnZWxlbWVudF9uYW1lJyBpbnN0ZWFkLmApO1xuICAgICAgfVxuICAgICAgY29uc3QgZWxlbWVudE5hbWVSZXN1bHQgPSB0aGlzLnZhbGlkYXRpb25TZXJ2aWNlLnZhbGlkYXRlQW5kU2FuaXRpemVJbnB1dChcbiAgICAgICAgU3RyaW5nKHJhd0VsZW1lbnROYW1lKSxcbiAgICAgICAgeyBtYXhMZW5ndGg6IFNFQ1VSSVRZX0xJTUlUUy5NQVhfTkFNRV9MRU5HVEgsIGFsbG93U3BhY2VzOiB0cnVlIH1cbiAgICAgICk7XG4gICAgICBpZiAoIWVsZW1lbnROYW1lUmVzdWx0LmlzVmFsaWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGVsZW1lbnQgbmFtZSBhdCBpbmRleCAke2luZGV4fTogJHtlbGVtZW50TmFtZVJlc3VsdC5lcnJvcnM/LmpvaW4oJywgJyl9YCk7XG4gICAgICB9XG4gICAgICBjb25zdCBlbGVtZW50TmFtZSA9IGVsZW1lbnROYW1lUmVzdWx0LnNhbml0aXplZFZhbHVlITtcblxuICAgICAgLy8gUkVGQUNUT1JFRDogVXNlIFZhbGlkYXRpb25TZXJ2aWNlIGZvciBlbGVtZW50IHR5cGVcbiAgICAgIC8vIFN1cHBvcnQgYm90aCBlbGVtZW50X3R5cGUgKG5ldyBzdGFuZGFyZCkgYW5kIHR5cGUgKGxlZ2FjeSkgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5XG4gICAgICBjb25zdCByYXdFbGVtZW50VHlwZSA9IGVsZW0uZWxlbWVudF90eXBlIHx8IGVsZW0udHlwZSB8fCAnc2tpbGwnO1xuICAgICAgLy8gTG9nIGRlcHJlY2F0aW9uIHdhcm5pbmcgaWYgdXNpbmcgbGVnYWN5ICd0eXBlJyBmaWVsZFxuICAgICAgaWYgKGVsZW0udHlwZSAmJiAhZWxlbS5lbGVtZW50X3R5cGUpIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oYEVuc2VtYmxlIGVsZW1lbnQgYXQgaW5kZXggJHtpbmRleH0gdXNlcyBkZXByZWNhdGVkICd0eXBlJyBmaWVsZC4gVXNlICdlbGVtZW50X3R5cGUnIGluc3RlYWQuYCk7XG4gICAgICB9XG4gICAgICBjb25zdCBlbGVtZW50VHlwZVJlc3VsdCA9IHRoaXMudmFsaWRhdGlvblNlcnZpY2UudmFsaWRhdGVBbmRTYW5pdGl6ZUlucHV0KFxuICAgICAgICBTdHJpbmcocmF3RWxlbWVudFR5cGUpLFxuICAgICAgICB7IG1heExlbmd0aDogU0VDVVJJVFlfTElNSVRTLk1BWF9UQUdfTEVOR1RILCBhbGxvd1NwYWNlczogZmFsc2UgfVxuICAgICAgKTtcbiAgICAgIGlmICghZWxlbWVudFR5cGVSZXN1bHQuaXNWYWxpZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgZWxlbWVudCB0eXBlIGF0IGluZGV4ICR7aW5kZXh9OiAke2VsZW1lbnRUeXBlUmVzdWx0LmVycm9ycz8uam9pbignLCAnKX1gKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGVsZW1lbnRUeXBlID0gZWxlbWVudFR5cGVSZXN1bHQuc2FuaXRpemVkVmFsdWUhO1xuXG4gICAgICAvLyBSRUZBQ1RPUkVEOiBVc2UgVmFsaWRhdGlvblNlcnZpY2UgZm9yIGVsZW1lbnQgcm9sZVxuICAgICAgY29uc3QgZWxlbWVudFJvbGVSZXN1bHQgPSB0aGlzLnZhbGlkYXRpb25TZXJ2aWNlLnZhbGlkYXRlQW5kU2FuaXRpemVJbnB1dChcbiAgICAgICAgU3RyaW5nKGVsZW0ucm9sZSB8fCBFTlNFTUJMRV9ERUZBVUxUUy5FTEVNRU5UX1JPTEUpLFxuICAgICAgICB7IG1heExlbmd0aDogU0VDVVJJVFlfTElNSVRTLk1BWF9FTlVNX0ZJRUxEX0xFTkdUSCwgYWxsb3dTcGFjZXM6IGZhbHNlIH1cbiAgICAgICk7XG4gICAgICBpZiAoIWVsZW1lbnRSb2xlUmVzdWx0LmlzVmFsaWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGVsZW1lbnQgcm9sZSBhdCBpbmRleCAke2luZGV4fTogJHtlbGVtZW50Um9sZVJlc3VsdC5lcnJvcnM/LmpvaW4oJywgJyl9YCk7XG4gICAgICB9XG4gICAgICBjb25zdCBlbGVtZW50Um9sZSA9IGVsZW1lbnRSb2xlUmVzdWx0LnNhbml0aXplZFZhbHVlITtcblxuICAgICAgLy8gS0VFUDogRW51bSB2YWxpZGF0aW9uIGxvZ2ljIChhZGQgQUZURVIgVmFsaWRhdGlvblNlcnZpY2Ugc2FuaXRpemF0aW9uKVxuICAgICAgaWYgKCFFTEVNRU5UX1JPTEVTLmluY2x1ZGVzKGVsZW1lbnRSb2xlIGFzIGFueSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke0VOU0VNQkxFX0VSUk9SUy5JTlZBTElEX0VMRU1FTlRfUk9MRX06ICR7ZWxlbWVudFJvbGV9YCk7XG4gICAgICB9XG5cbiAgICAgIC8vIFJFRkFDVE9SRUQ6IFVzZSBWYWxpZGF0aW9uU2VydmljZSBmb3IgZWxlbWVudCBhY3RpdmF0aW9uXG4gICAgICBjb25zdCBlbGVtZW50QWN0aXZhdGlvblJlc3VsdCA9IHRoaXMudmFsaWRhdGlvblNlcnZpY2UudmFsaWRhdGVBbmRTYW5pdGl6ZUlucHV0KFxuICAgICAgICBTdHJpbmcoZWxlbS5hY3RpdmF0aW9uIHx8ICdhbHdheXMnKSxcbiAgICAgICAgeyBtYXhMZW5ndGg6IFNFQ1VSSVRZX0xJTUlUUy5NQVhfRU5VTV9GSUVMRF9MRU5HVEgsIGFsbG93U3BhY2VzOiBmYWxzZSB9XG4gICAgICApO1xuICAgICAgaWYgKCFlbGVtZW50QWN0aXZhdGlvblJlc3VsdC5pc1ZhbGlkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBlbGVtZW50IGFjdGl2YXRpb24gYXQgaW5kZXggJHtpbmRleH06ICR7ZWxlbWVudEFjdGl2YXRpb25SZXN1bHQuZXJyb3JzPy5qb2luKCcsICcpfWApO1xuICAgICAgfVxuICAgICAgY29uc3QgZWxlbWVudEFjdGl2YXRpb24gPSBlbGVtZW50QWN0aXZhdGlvblJlc3VsdC5zYW5pdGl6ZWRWYWx1ZSE7XG5cbiAgICAgIC8vIEtFRVA6IEVudW0gdmFsaWRhdGlvbiBsb2dpYyAoYWRkIEFGVEVSIFZhbGlkYXRpb25TZXJ2aWNlIHNhbml0aXphdGlvbilcbiAgICAgIGlmICghQUNUSVZBVElPTl9NT0RFUy5pbmNsdWRlcyhlbGVtZW50QWN0aXZhdGlvbiBhcyBhbnkpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgJHtFTlNFTUJMRV9FUlJPUlMuSU5WQUxJRF9BQ1RJVkFUSU9OX01PREV9OiAke2VsZW1lbnRBY3RpdmF0aW9ufWApO1xuICAgICAgfVxuXG4gICAgICAvLyBQYXJzZSBwcmlvcml0eSAoMC0xMDAsIGRlZmF1bHQgNTApXG4gICAgICBsZXQgcHJpb3JpdHkgPSBlbGVtLnByaW9yaXR5ID8/IEVOU0VNQkxFX0RFRkFVTFRTLlBSSU9SSVRZO1xuICAgICAgaWYgKHR5cGVvZiBwcmlvcml0eSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgcHJpb3JpdHkgPSBwYXJzZUludChwcmlvcml0eSwgMTApO1xuICAgICAgfVxuICAgICAgcHJpb3JpdHkgPSBNYXRoLm1heCgwLCBNYXRoLm1pbigxMDAsIHByaW9yaXR5KSk7XG5cbiAgICAgIC8vIFJFRkFDVE9SRUQ6IFVzZSBWYWxpZGF0aW9uU2VydmljZSBmb3IgY29uZGl0aW9uIChpZiBjb25kaXRpb25hbCBhY3RpdmF0aW9uKVxuICAgICAgLy8gQ29uZGl0aW9ucyBuZWVkIHNwZWNpYWwgaGFuZGxpbmcgLSB0aGV5IGNhbiBjb250YWluIG9wZXJhdG9ycyBsaWtlID09LCAhPSwgJiYsIHx8XG4gICAgICAvLyBTbyB3ZSB1c2UgYSBjdXN0b20gcGF0dGVybiB0aGF0IGFsbG93cyB0aGVzZSBjaGFyYWN0ZXJzXG4gICAgICBsZXQgY29uZGl0aW9uOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgICBpZiAoZWxlbWVudEFjdGl2YXRpb24gPT09ICdjb25kaXRpb25hbCcgJiYgZWxlbS5jb25kaXRpb24pIHtcbiAgICAgICAgY29uc3QgY29uZGl0aW9uUmVzdWx0ID0gdGhpcy52YWxpZGF0aW9uU2VydmljZS52YWxpZGF0ZUFuZFNhbml0aXplSW5wdXQoXG4gICAgICAgICAgU3RyaW5nKGVsZW0uY29uZGl0aW9uKSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBtYXhMZW5ndGg6IEVOU0VNQkxFX0xJTUlUUy5NQVhfQ09ORElUSU9OX0xFTkdUSCxcbiAgICAgICAgICAgIGFsbG93U3BhY2VzOiB0cnVlLFxuICAgICAgICAgICAgY3VzdG9tUGF0dGVybjogL15bYS16QS1aMC05XFxzXFwtXy49ISZ8PD4oKV0rJC8gIC8vIEFsbG93IGNvbXBhcmlzb24vbG9naWNhbCBvcGVyYXRvcnNcbiAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgICAgIGlmICghY29uZGl0aW9uUmVzdWx0LmlzVmFsaWQpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgY29uZGl0aW9uIGF0IGluZGV4ICR7aW5kZXh9OiAke2NvbmRpdGlvblJlc3VsdC5lcnJvcnM/LmpvaW4oJywgJyl9YCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uZGl0aW9uID0gY29uZGl0aW9uUmVzdWx0LnNhbml0aXplZFZhbHVlO1xuICAgICAgfVxuXG4gICAgICAvLyBSRUZBQ1RPUkVEOiBVc2UgVmFsaWRhdGlvblNlcnZpY2UgZm9yIGRlcGVuZGVuY2llc1xuICAgICAgbGV0IGRlcGVuZGVuY2llczogc3RyaW5nW10gfCB1bmRlZmluZWQ7XG4gICAgICBpZiAoZWxlbS5kZXBlbmRlbmNpZXMgJiYgQXJyYXkuaXNBcnJheShlbGVtLmRlcGVuZGVuY2llcykpIHtcbiAgICAgICAgY29uc3QgdmFsaWRhdGVkRGVwZW5kZW5jaWVzOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IGRlcCBvZiBlbGVtLmRlcGVuZGVuY2llcy5zbGljZSgwLCBFTlNFTUJMRV9MSU1JVFMuTUFYX0RFUEVOREVOQ0lFUykpIHtcbiAgICAgICAgICBjb25zdCBkZXBSZXN1bHQgPSB0aGlzLnZhbGlkYXRpb25TZXJ2aWNlLnZhbGlkYXRlQW5kU2FuaXRpemVJbnB1dChTdHJpbmcoZGVwKSwge1xuICAgICAgICAgICAgbWF4TGVuZ3RoOiBTRUNVUklUWV9MSU1JVFMuTUFYX05BTUVfTEVOR1RILFxuICAgICAgICAgICAgYWxsb3dTcGFjZXM6IHRydWVcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBpZiAoIWRlcFJlc3VsdC5pc1ZhbGlkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgZGVwZW5kZW5jeSBcIiR7ZGVwfVwiIGF0IGluZGV4ICR7aW5kZXh9OiAke2RlcFJlc3VsdC5lcnJvcnM/LmpvaW4oJywgJyl9YCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHZhbGlkYXRlZERlcGVuZGVuY2llcy5wdXNoKGRlcFJlc3VsdC5zYW5pdGl6ZWRWYWx1ZSEpO1xuICAgICAgICB9XG4gICAgICAgIGRlcGVuZGVuY2llcyA9IHZhbGlkYXRlZERlcGVuZGVuY2llcztcbiAgICAgIH1cblxuICAgICAgLy8gUkVGQUNUT1JFRDogVXNlIFZhbGlkYXRpb25TZXJ2aWNlIGZvciBwdXJwb3NlXG4gICAgICBsZXQgcHVycG9zZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgICAgaWYgKGVsZW0ucHVycG9zZSkge1xuICAgICAgICBjb25zdCBwdXJwb3NlUmVzdWx0ID0gdGhpcy52YWxpZGF0aW9uU2VydmljZS52YWxpZGF0ZUFuZFNhbml0aXplSW5wdXQoU3RyaW5nKGVsZW0ucHVycG9zZSksIHtcbiAgICAgICAgICBtYXhMZW5ndGg6IFNFQ1VSSVRZX0xJTUlUUy5NQVhfREVTQ1JJUFRJT05fTEVOR1RILFxuICAgICAgICAgIGFsbG93U3BhY2VzOiB0cnVlLFxuICAgICAgICAgIGZpZWxkVHlwZTogJ2Rlc2NyaXB0aW9uJyAgLy8gQWxsb3cgZnVsbCBkZXNjcmlwdGlvbiBwdW5jdHVhdGlvbiAoY29tbWFzLCBlbS1kYXNoZXMsIGV0Yy4pXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoIXB1cnBvc2VSZXN1bHQuaXNWYWxpZCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBwdXJwb3NlIGF0IGluZGV4ICR7aW5kZXh9OiAke3B1cnBvc2VSZXN1bHQuZXJyb3JzPy5qb2luKCcsICcpfWApO1xuICAgICAgICB9XG4gICAgICAgIHB1cnBvc2UgPSBwdXJwb3NlUmVzdWx0LnNhbml0aXplZFZhbHVlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBlbGVtZW50X25hbWU6IGVsZW1lbnROYW1lLFxuICAgICAgICBlbGVtZW50X3R5cGU6IGVsZW1lbnRUeXBlLFxuICAgICAgICByb2xlOiBlbGVtZW50Um9sZSBhcyBFbGVtZW50Um9sZSxcbiAgICAgICAgcHJpb3JpdHksXG4gICAgICAgIGFjdGl2YXRpb246IGVsZW1lbnRBY3RpdmF0aW9uIGFzIEFjdGl2YXRpb25Nb2RlLFxuICAgICAgICBjb25kaXRpb24sXG4gICAgICAgIGRlcGVuZGVuY2llcyxcbiAgICAgICAgcHVycG9zZVxuICAgICAgfTtcbiAgICB9KTtcblxuICAgIC8vIFZhbGlkYXRlIGVsZW1lbnQgY291bnRcbiAgICBpZiAoZWxlbWVudHMubGVuZ3RoID4gRU5TRU1CTEVfTElNSVRTLk1BWF9FTEVNRU5UUykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKEVOU0VNQkxFX0VSUk9SUy5UT09fTUFOWV9FTEVNRU5UUyk7XG4gICAgfVxuXG4gICAgLy8gUGFyc2UgbmVzdGluZyBjb25maWd1cmF0aW9uXG4gICAgY29uc3QgYWxsb3dOZXN0ZWQgPSBkYXRhLmFsbG93X25lc3RlZCAhPT0gdW5kZWZpbmVkID9cbiAgICAgIEJvb2xlYW4oZGF0YS5hbGxvd19uZXN0ZWQpIDpcbiAgICAgIChkYXRhLmFsbG93TmVzdGVkICE9PSB1bmRlZmluZWQgPyBCb29sZWFuKGRhdGEuYWxsb3dOZXN0ZWQpIDogRU5TRU1CTEVfREVGQVVMVFMuQUxMT1dfTkVTVEVEKTtcblxuICAgIGNvbnN0IG1heE5lc3RpbmdEZXB0aCA9IGRhdGEubWF4X25lc3RpbmdfZGVwdGggfHwgZGF0YS5tYXhOZXN0aW5nRGVwdGggfHwgRU5TRU1CTEVfREVGQVVMVFMuTUFYX05FU1RJTkdfREVQVEg7XG5cbiAgICAvLyBSRUZBQ1RPUkVEOiBVc2UgVmFsaWRhdGlvblNlcnZpY2UgZm9yIHRhZ3MgYXJyYXlcbiAgICBsZXQgdGFnczogc3RyaW5nW10gPSBbXTtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShkYXRhLnRhZ3MpKSB7XG4gICAgICBmb3IgKGNvbnN0IHRhZyBvZiBkYXRhLnRhZ3MpIHtcbiAgICAgICAgY29uc3QgdGFnUmVzdWx0ID0gdGhpcy52YWxpZGF0aW9uU2VydmljZS52YWxpZGF0ZUFuZFNhbml0aXplSW5wdXQoU3RyaW5nKHRhZyksIHtcbiAgICAgICAgICBtYXhMZW5ndGg6IFNFQ1VSSVRZX0xJTUlUUy5NQVhfVEFHX0xFTkdUSCxcbiAgICAgICAgICBhbGxvd1NwYWNlczogdHJ1ZVxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKCF0YWdSZXN1bHQuaXNWYWxpZCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCB0YWcgXCIke3RhZ31cIjogJHt0YWdSZXN1bHQuZXJyb3JzPy5qb2luKCcsICcpfWApO1xuICAgICAgICB9XG4gICAgICAgIHRhZ3MucHVzaCh0YWdSZXN1bHQuc2FuaXRpemVkVmFsdWUhKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBCdWlsZCBtZXRhZGF0YSBvYmplY3QgKGNhbWVsQ2FzZSlcbiAgICBjb25zdCBtZXRhZGF0YTogRW5zZW1ibGVNZXRhZGF0YSA9IHtcbiAgICAgIG5hbWUsXG4gICAgICBkZXNjcmlwdGlvbjogZGVzY3JpcHRpb24gfHwgJycsXG4gICAgICB2ZXJzaW9uOiBkYXRhLnZlcnNpb24gfHwgJzEuMC4wJyxcbiAgICAgIGF1dGhvcjogZGF0YS5hdXRob3IsXG4gICAgICBjcmVhdGVkOiBkYXRhLmNyZWF0ZWQsXG4gICAgICBtb2RpZmllZDogZGF0YS5tb2RpZmllZCB8fCBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgICB0YWdzLFxuICAgICAgYWN0aXZhdGlvblN0cmF0ZWd5OiBhY3RpdmF0aW9uU3RyYXRlZ3kgYXMgQWN0aXZhdGlvblN0cmF0ZWd5LFxuICAgICAgY29uZmxpY3RSZXNvbHV0aW9uOiBjb25mbGljdFJlc29sdXRpb24gYXMgQ29uZmxpY3RSZXNvbHV0aW9uU3RyYXRlZ3ksXG4gICAgICBjb250ZXh0U2hhcmluZzogY29udGV4dFNoYXJpbmcgYXMgJ25vbmUnIHwgJ3NlbGVjdGl2ZScgfCAnZnVsbCcsXG4gICAgICByZXNvdXJjZUxpbWl0cyxcbiAgICAgIGFsbG93TmVzdGVkLFxuICAgICAgbWF4TmVzdGluZ0RlcHRoLFxuICAgICAgZWxlbWVudHMsXG4gICAgICBnYXRla2VlcGVyOiBzYW5pdGl6ZUdhdGVrZWVwZXJQb2xpY3koZGF0YS5nYXRla2VlcGVyLCBuYW1lLCAnZW5zZW1ibGUnKSwgIC8vIElzc3VlICM1MjRcbiAgICB9O1xuXG4gICAgcmV0dXJuIG1ldGFkYXRhO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhbiBFbnNlbWJsZSBpbnN0YW5jZSBmcm9tIHBhcnNlZCBtZXRhZGF0YVxuICAgKlxuICAgKiBAcGFyYW0gbWV0YWRhdGEgLSBWYWxpZGF0ZWQgZW5zZW1ibGUgbWV0YWRhdGFcbiAgICogQHBhcmFtIGNvbnRlbnQgLSBNYXJrZG93biBjb250ZW50IChlbnNlbWJsZSBpbnN0cnVjdGlvbnMvZG9jdW1lbnRhdGlvbilcbiAgICogQHJldHVybnMgTmV3IEVuc2VtYmxlIGluc3RhbmNlXG4gICAqL1xuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgY3JlYXRlRWxlbWVudChtZXRhZGF0YTogRW5zZW1ibGVNZXRhZGF0YSwgX2NvbnRlbnQ6IHN0cmluZyk6IEVuc2VtYmxlIHtcbiAgICBkZWxldGUgKG1ldGFkYXRhIGFzIGFueSkuZm9ybWF0X3ZlcnNpb247ICAvLyBGaXggIzkxMjogU3RyaXAgbWFya2VyIGZyb20gcnVudGltZSBtZXRhZGF0YVxuICAgIGNvbnN0IGVuc2VtYmxlID0gbmV3IEVuc2VtYmxlKG1ldGFkYXRhLCBtZXRhZGF0YS5lbGVtZW50cywgdGhpcy5tZXRhZGF0YVNlcnZpY2UpO1xuICAgIC8vIEV4dHJhY3QgaW5zdHJ1Y3Rpb25zIGZyb20gbWV0YWRhdGEgaWYgcHJlc2VudCAodjIgZHVhbC1maWVsZClcbiAgICBpZiAobWV0YWRhdGEuaW5zdHJ1Y3Rpb25zKSB7XG4gICAgICBlbnNlbWJsZS5pbnN0cnVjdGlvbnMgPSBtZXRhZGF0YS5pbnN0cnVjdGlvbnM7XG4gICAgICBkZWxldGUgbWV0YWRhdGEuaW5zdHJ1Y3Rpb25zO1xuICAgIH1cbiAgICByZXR1cm4gZW5zZW1ibGU7XG4gIH1cblxuICAvKipcbiAgICogU2VyaWFsaXplIGFuIGVuc2VtYmxlIHRvIGZpbGUgY29udGVudFxuICAgKlxuICAgKiBGb3JtYXQ6IE1hcmtkb3duIHdpdGggWUFNTCBmcm9udG1hdHRlclxuICAgKiAtIEZyb250bWF0dGVyOiBFbnNlbWJsZSBtZXRhZGF0YSArIGVsZW1lbnQgcmVmZXJlbmNlc1xuICAgKiAtIENvbnRlbnQ6IEluc3RydWN0aW9ucy9kb2N1bWVudGF0aW9uIGZvciB0aGUgZW5zZW1ibGVcbiAgICpcbiAgICogQHBhcmFtIGVsZW1lbnQgLSBFbnNlbWJsZSB0byBzZXJpYWxpemVcbiAgICogQHJldHVybnMgRmlsZSBjb250ZW50IChtYXJrZG93biB3aXRoIGZyb250bWF0dGVyKVxuICAgKi9cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGFzeW5jIHNlcmlhbGl6ZUVsZW1lbnQoZWxlbWVudDogRW5zZW1ibGUpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IG1ldGFkYXRhID0gZWxlbWVudC5tZXRhZGF0YTtcblxuICAgIC8vIEJ1aWxkIGZyb250bWF0dGVyIGRhdGEgKHVzaW5nIGNhbWVsQ2FzZSlcbiAgICBjb25zdCBmcm9udG1hdHRlcjogYW55ID0ge1xuICAgICAgbmFtZTogbWV0YWRhdGEubmFtZSxcbiAgICAgIHR5cGU6IHRvU2luZ3VsYXJMYWJlbChFbGVtZW50VHlwZS5FTlNFTUJMRSksXG4gICAgICBmb3JtYXRfdmVyc2lvbjogJ3YyJywgIC8vIEZpeCAjOTEyOiBFeHBsaWNpdCBmb3JtYXQgbWFya2VyXG4gICAgICB1bmlxdWVfaWQ6IGVsZW1lbnQuaWQsXG4gICAgICBkZXNjcmlwdGlvbjogbWV0YWRhdGEuZGVzY3JpcHRpb24sXG4gICAgICB2ZXJzaW9uOiBtZXRhZGF0YS52ZXJzaW9uLFxuICAgICAgYXV0aG9yOiBtZXRhZGF0YS5hdXRob3IsXG4gICAgICBjcmVhdGVkOiBtZXRhZGF0YS5jcmVhdGVkLFxuICAgICAgbW9kaWZpZWQ6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgIHRhZ3M6IG1ldGFkYXRhLnRhZ3MgfHwgW10sXG4gICAgICBhY3RpdmF0aW9uU3RyYXRlZ3k6IG1ldGFkYXRhLmFjdGl2YXRpb25TdHJhdGVneSxcbiAgICAgIGNvbmZsaWN0UmVzb2x1dGlvbjogbWV0YWRhdGEuY29uZmxpY3RSZXNvbHV0aW9uLFxuICAgICAgY29udGV4dFNoYXJpbmc6IG1ldGFkYXRhLmNvbnRleHRTaGFyaW5nLFxuICAgICAgYWxsb3dOZXN0ZWQ6IG1ldGFkYXRhLmFsbG93TmVzdGVkLFxuICAgICAgbWF4TmVzdGluZ0RlcHRoOiBtZXRhZGF0YS5tYXhOZXN0aW5nRGVwdGhcbiAgICB9O1xuXG4gICAgLy8gdjIuMCBkdWFsLWZpZWxkOiB3cml0ZSBpbnN0cnVjdGlvbnMgdG8gWUFNTCBmcm9udG1hdHRlciBpZiBwcmVzZW50XG4gICAgaWYgKGVsZW1lbnQuaW5zdHJ1Y3Rpb25zKSB7XG4gICAgICBmcm9udG1hdHRlci5pbnN0cnVjdGlvbnMgPSBlbGVtZW50Lmluc3RydWN0aW9ucztcbiAgICB9XG5cbiAgICAvLyBJbmNsdWRlIHJlc291cmNlIGxpbWl0cyBpZiBzcGVjaWZpZWRcbiAgICBpZiAobWV0YWRhdGEucmVzb3VyY2VMaW1pdHMpIHtcbiAgICAgIGZyb250bWF0dGVyLnJlc291cmNlTGltaXRzID0gbWV0YWRhdGEucmVzb3VyY2VMaW1pdHM7XG4gICAgfVxuXG4gICAgLy8gSXNzdWUgIzUyNCDigJQgR2F0ZWtlZXBlciBwb2xpY3kgKGFsbCBlbGVtZW50IHR5cGVzKVxuICAgIGlmIChtZXRhZGF0YS5nYXRla2VlcGVyKSB7XG4gICAgICBmcm9udG1hdHRlci5nYXRla2VlcGVyID0gbWV0YWRhdGEuZ2F0ZWtlZXBlcjtcbiAgICB9XG5cbiAgICAvLyBJbmNsdWRlIGVsZW1lbnRzIGFycmF5ICh1c2luZyBlbGVtZW50X25hbWUvZWxlbWVudF90eXBlIGZvciBBUEkgY29uc2lzdGVuY3kpXG4gICAgZnJvbnRtYXR0ZXIuZWxlbWVudHMgPSBtZXRhZGF0YS5lbGVtZW50cy5tYXAoZWxlbSA9PiB7XG4gICAgICBjb25zdCBlbGVtRGF0YTogYW55ID0ge1xuICAgICAgICBlbGVtZW50X25hbWU6IGVsZW0uZWxlbWVudF9uYW1lLFxuICAgICAgICBlbGVtZW50X3R5cGU6IGVsZW0uZWxlbWVudF90eXBlLFxuICAgICAgICByb2xlOiBlbGVtLnJvbGUsXG4gICAgICAgIHByaW9yaXR5OiBlbGVtLnByaW9yaXR5LFxuICAgICAgICBhY3RpdmF0aW9uOiBlbGVtLmFjdGl2YXRpb25cbiAgICAgIH07XG5cbiAgICAgIGlmIChlbGVtLmNvbmRpdGlvbikge1xuICAgICAgICBlbGVtRGF0YS5jb25kaXRpb24gPSBlbGVtLmNvbmRpdGlvbjtcbiAgICAgIH1cblxuICAgICAgaWYgKGVsZW0uZGVwZW5kZW5jaWVzICYmIGVsZW0uZGVwZW5kZW5jaWVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgZWxlbURhdGEuZGVwZW5kZW5jaWVzID0gZWxlbS5kZXBlbmRlbmNpZXM7XG4gICAgICB9XG5cbiAgICAgIGlmIChlbGVtLnB1cnBvc2UpIHtcbiAgICAgICAgZWxlbURhdGEucHVycG9zZSA9IGVsZW0ucHVycG9zZTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGVsZW1EYXRhO1xuICAgIH0pO1xuXG4gICAgLy8gVXNlIFNlcmlhbGl6YXRpb25TZXJ2aWNlIGZvciBmcm9udG1hdHRlciBjcmVhdGlvblxuICAgIC8vIFVzZSBDT1JFX1NDSEVNQSB0byBzdXBwb3J0IG51bWJlcnMgKHByaW9yaXR5KSBhbmQgYm9vbGVhbnMgKGFsbG93TmVzdGVkKVxuICAgIGNvbnN0IGJvZHkgPSBlbGVtZW50LmNvbnRlbnQgfHwgdGhpcy5idWlsZERlZmF1bHRCb2R5KGVsZW1lbnQpO1xuICAgIHJldHVybiB0aGlzLnNlcmlhbGl6YXRpb25TZXJ2aWNlLmNyZWF0ZUZyb250bWF0dGVyKGZyb250bWF0dGVyLCBib2R5LCB7XG4gICAgICBtZXRob2Q6ICdtYW51YWwnLFxuICAgICAgc2NoZW1hOiAnanNvbicsICAvLyBGaXggIzkxNDogc3RhbmRhcmRpemUgb24gSlNPTiBzY2hlbWEgYWNyb3NzIGFsbCBtYW5hZ2Vyc1xuICAgICAgY2xlYW5NZXRhZGF0YTogdHJ1ZSwgIC8vIEZpeCAjOTEzOiBzdGFuZGFyZGl6ZSBhY3Jvc3MgYWxsIG1hbmFnZXJzXG4gICAgICBjbGVhbmluZ1N0cmF0ZWd5OiAncmVtb3ZlLWJvdGgnLFxuICAgICAgc29ydEtleXM6IHRydWUsXG4gICAgICBsaW5lV2lkdGg6IDEwMCxcbiAgICAgIHNraXBJbnZhbGlkOiBmYWxzZSAgLy8gRG9uJ3Qgc2tpcCBpbnZhbGlkIC0gd2Ugd2FudCB0byBjYXRjaCBlcnJvcnNcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYnVpbGREZWZhdWx0Qm9keShlbGVtZW50OiBFbnNlbWJsZSk6IHN0cmluZyB7XG4gICAgY29uc3QgbmFtZSA9IChlbGVtZW50Lm1ldGFkYXRhLm5hbWUgPz8gJycpLnRyaW0oKTtcbiAgICBjb25zdCBkZXNjcmlwdGlvbiA9IChlbGVtZW50Lm1ldGFkYXRhLmRlc2NyaXB0aW9uID8/ICcnKS50cmltKCk7XG4gICAgY29uc3QgbGluZXM6IHN0cmluZ1tdID0gW107XG4gICAgaWYgKG5hbWUpIHtcbiAgICAgIGxpbmVzLnB1c2goYCMgJHtuYW1lfWApO1xuICAgICAgbGluZXMucHVzaCgnJyk7XG4gICAgfVxuICAgIGlmIChkZXNjcmlwdGlvbikge1xuICAgICAgbGluZXMucHVzaChkZXNjcmlwdGlvbik7XG4gICAgfVxuICAgIHJldHVybiBsaW5lcy5qb2luKCdcXG4nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgZmlsZSBleHRlbnNpb24gZm9yIGVuc2VtYmxlIGZpbGVzXG4gICAqL1xuICBvdmVycmlkZSBnZXRGaWxlRXh0ZW5zaW9uKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuICcubWQnO1xuICB9XG5cbiAgLyoqXG4gICAqIEltcG9ydCBhbiBlbnNlbWJsZSBmcm9tIGV4dGVybmFsIGZvcm1hdFxuICAgKlxuICAgKiBTdXBwb3J0czpcbiAgICogLSBZQU1MOiBGcm9udG1hdHRlci1zdHlsZSBtZXRhZGF0YSB3aXRoIG9wdGlvbmFsIG1hcmtkb3duIGNvbnRlbnRcbiAgICogLSBKU09OOiBEaXJlY3QgZW5zZW1ibGUgc3RydWN0dXJlXG4gICAqIC0gTWFya2Rvd246IFlBTUwgZnJvbnRtYXR0ZXIgKyBtYXJrZG93biBjb250ZW50XG4gICAqXG4gICAqIEBwYXJhbSBkYXRhIC0gU3RyaW5nIGNvbnRhaW5pbmcgZW5zZW1ibGUgZGF0YVxuICAgKiBAcGFyYW0gZm9ybWF0IC0gRm9ybWF0IG9mIHRoZSBkYXRhIChqc29uLCB5YW1sLCBtYXJrZG93bilcbiAgICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZpbmcgdG8gaW1wb3J0ZWQgRW5zZW1ibGVcbiAgICovXG4gIG92ZXJyaWRlIGFzeW5jIGltcG9ydEVsZW1lbnQoXG4gICAgZGF0YTogc3RyaW5nLFxuICAgIGZvcm1hdDogJ2pzb24nIHwgJ3lhbWwnIHwgJ21hcmtkb3duJyA9ICdtYXJrZG93bidcbiAgKTogUHJvbWlzZTxFbnNlbWJsZT4ge1xuICAgIHRyeSB7XG4gICAgICBsZXQgcGFyc2VkOiBhbnk7XG5cbiAgICAgIGlmIChmb3JtYXQgPT09ICdqc29uJykge1xuICAgICAgICBwYXJzZWQgPSB0aGlzLnNlcmlhbGl6YXRpb25TZXJ2aWNlLnBhcnNlSnNvbihkYXRhLCB7XG4gICAgICAgICAgc291cmNlOiAnRW5zZW1ibGVNYW5hZ2VyLmltcG9ydEVsZW1lbnQnXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gUGFyc2UgWUFNTC9NYXJrZG93biB1c2luZyBTZXJpYWxpemF0aW9uU2VydmljZVxuICAgICAgICBjb25zdCByZXN1bHQgPSB0aGlzLnNlcmlhbGl6YXRpb25TZXJ2aWNlLnBhcnNlRnJvbnRtYXR0ZXIoZGF0YSwge1xuICAgICAgICAgIG1heFlhbWxTaXplOiA1MDAwMCwgLy8gNTBLQiBsaW1pdCBmb3IgZW5zZW1ibGUgZmlsZXNcbiAgICAgICAgICB2YWxpZGF0ZUNvbnRlbnQ6IHRydWUsXG4gICAgICAgICAgc291cmNlOiAnRW5zZW1ibGVNYW5hZ2VyLmltcG9ydEVsZW1lbnQnXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHBhcnNlZCA9IHJlc3VsdC5kYXRhO1xuICAgICAgICAvLyBDb250ZW50IGlzIHBhcnNlZCBidXQgbm90IHVzZWQgaW4gZW5zZW1ibGUgY3JlYXRpb25cbiAgICAgIH1cblxuICAgICAgLy8gUGFyc2UgbWV0YWRhdGFcbiAgICAgIGNvbnN0IG1ldGFkYXRhID0gYXdhaXQgdGhpcy5wYXJzZU1ldGFkYXRhKHBhcnNlZCk7XG5cbiAgICAgIC8vIENyZWF0ZSBlbnNlbWJsZVxuICAgICAgY29uc3QgZW5zZW1ibGUgPSBuZXcgRW5zZW1ibGUobWV0YWRhdGEsIG1ldGFkYXRhLmVsZW1lbnRzLCB0aGlzLm1ldGFkYXRhU2VydmljZSk7XG5cbiAgICAgIC8vIExvZyBzdWNjZXNzZnVsIGltcG9ydFxuICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICB0eXBlOiBFTlNFTUJMRV9TRUNVUklUWV9FVkVOVFMuSU1QT1JURUQsXG4gICAgICAgIHNldmVyaXR5OiAnTE9XJyxcbiAgICAgICAgc291cmNlOiAnRW5zZW1ibGVNYW5hZ2VyLmltcG9ydEVsZW1lbnQnLFxuICAgICAgICBkZXRhaWxzOiBgSW1wb3J0ZWQgZW5zZW1ibGU6ICR7bWV0YWRhdGEubmFtZX0gd2l0aCAke21ldGFkYXRhLmVsZW1lbnRzLmxlbmd0aH0gZWxlbWVudHNgXG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIGVuc2VtYmxlO1xuXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgdHlwZTogRU5TRU1CTEVfU0VDVVJJVFlfRVZFTlRTLklNUE9SVEVELFxuICAgICAgICBzZXZlcml0eTogJ01FRElVTScsXG4gICAgICAgIHNvdXJjZTogJ0Vuc2VtYmxlTWFuYWdlci5pbXBvcnRFbGVtZW50JyxcbiAgICAgICAgZGV0YWlsczogYEZhaWxlZCB0byBpbXBvcnQgZW5zZW1ibGU6ICR7ZXJyb3J9YFxuICAgICAgfSk7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byBpbXBvcnQgZW5zZW1ibGU6ICR7ZXJyb3J9YCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEV4cG9ydCBhbiBlbnNlbWJsZSB0byBleHRlcm5hbCBmb3JtYXRcbiAgICpcbiAgICogQHBhcmFtIGVsZW1lbnQgLSBFbnNlbWJsZSB0byBleHBvcnRcbiAgICogQHBhcmFtIGZvcm1hdCAtIE91dHB1dCBmb3JtYXQgKGpzb24sIHlhbWwsIG1hcmtkb3duKVxuICAgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmluZyB0byBzZXJpYWxpemVkIHN0cmluZ1xuICAgKi9cbiAgb3ZlcnJpZGUgYXN5bmMgZXhwb3J0RWxlbWVudChcbiAgICBlbGVtZW50OiBFbnNlbWJsZSxcbiAgICBmb3JtYXQ6ICdqc29uJyB8ICd5YW1sJyB8ICdtYXJrZG93bicgPSAnbWFya2Rvd24nXG4gICk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgaWYgKGZvcm1hdCA9PT0gJ2pzb24nKSB7XG4gICAgICByZXR1cm4gZWxlbWVudC5zZXJpYWxpemVUb0pTT04oKTtcbiAgICB9XG5cbiAgICAvLyBGb3IgWUFNTCBhbmQgTWFya2Rvd24sIHVzZSB0aGUgc2FtZSBmb3JtYXQgKGZyb250bWF0dGVyICsgY29udGVudClcbiAgICByZXR1cm4gdGhpcy5zZXJpYWxpemVFbGVtZW50KGVsZW1lbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIG5ldyBlbnNlbWJsZSB3aXRoIG1ldGFkYXRhXG4gICAqXG4gICAqIEBwYXJhbSBtZXRhZGF0YSAtIFBhcnRpYWwgbWV0YWRhdGEgZm9yIHRoZSBlbnNlbWJsZVxuICAgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmluZyB0byBuZXcgRW5zZW1ibGUgaW5zdGFuY2VcbiAgICovXG4gIGFzeW5jIGNyZWF0ZShtZXRhZGF0YTogUGFydGlhbDxFbnNlbWJsZU1ldGFkYXRhPiAmIHsgaW5zdHJ1Y3Rpb25zPzogc3RyaW5nOyBjb250ZW50Pzogc3RyaW5nIH0pOiBQcm9taXNlPEVuc2VtYmxlPiB7XG4gICAgLy8gVXNlIHNwZWNpYWxpemVkIHZhbGlkYXRvciBmb3IgaW5wdXQgdmFsaWRhdGlvblxuICAgIC8vIE5vdGU6IGVsZW1lbnRfdHlwZSByZXNvbHV0aW9uIGlzIGhhbmRsZWQgYnkgdGhlIGhhbmRsZXIgbGF5ZXIgYmVmb3JlIGNhbGxpbmcgY3JlYXRlKCkuXG4gICAgLy8gRWxlbWVudHMgc2hvdWxkIGFscmVhZHkgaGF2ZSBlbGVtZW50X3R5cGUgc2V0IHdoZW4gdGhleSBhcnJpdmUgaGVyZS5cbiAgICBjb25zdCB2YWxpZGF0aW9uUmVzdWx0ID0gYXdhaXQgdGhpcy52YWxpZGF0b3IudmFsaWRhdGVDcmVhdGUoe1xuICAgICAgbmFtZTogbWV0YWRhdGEubmFtZSxcbiAgICAgIGRlc2NyaXB0aW9uOiBtZXRhZGF0YS5kZXNjcmlwdGlvbixcbiAgICAgIGVsZW1lbnRzOiBtZXRhZGF0YS5lbGVtZW50cyB8fCBbXSxcbiAgICAgIGFsbG93TmVzdGVkOiBtZXRhZGF0YS5hbGxvd05lc3RlZCxcbiAgICAgIG1heE5lc3RpbmdEZXB0aDogbWV0YWRhdGEubWF4TmVzdGluZ0RlcHRoXG4gICAgfSk7XG5cbiAgICBpZiAoIXZhbGlkYXRpb25SZXN1bHQuaXNWYWxpZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBWYWxpZGF0aW9uIGZhaWxlZDogJHt2YWxpZGF0aW9uUmVzdWx0LmVycm9ycy5qb2luKCcsICcpfWApO1xuICAgIH1cblxuICAgIC8vIExvZyB3YXJuaW5ncyBpZiBhbnlcbiAgICBpZiAodmFsaWRhdGlvblJlc3VsdC53YXJuaW5ncyAmJiB2YWxpZGF0aW9uUmVzdWx0Lndhcm5pbmdzLmxlbmd0aCA+IDApIHtcbiAgICAgIGxvZ2dlci53YXJuKGBFbnNlbWJsZSBjcmVhdGlvbiB3YXJuaW5nczogJHt2YWxpZGF0aW9uUmVzdWx0Lndhcm5pbmdzLmpvaW4oJywgJyl9YCk7XG4gICAgfVxuXG4gICAgLy8gRW5zdXJlIHJlcXVpcmVkIGZpZWxkc1xuICAgIGlmICghbWV0YWRhdGEubmFtZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdFbnNlbWJsZSBtdXN0IGhhdmUgYSBuYW1lJyk7XG4gICAgfVxuXG4gICAgbGV0IHJhd0VsZW1lbnRzID0gbWV0YWRhdGEuZWxlbWVudHMgfHwgW107XG5cbiAgICAvLyBNaWdyYXRlIGxlZ2FjeSBlbGVtZW50IGZpZWxkcyAobmFtZSAtPiBlbGVtZW50X25hbWUsIHR5cGUgLT4gZWxlbWVudF90eXBlKVxuICAgIC8vIFRoaXMgZW5zdXJlcyBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSB3aXRoIEFQSSBjYWxscyB1c2luZyBvbGQgZmllbGQgbmFtZXNcbiAgICBjb25zdCBtaWdyYXRlZEVsZW1lbnRzOiBFbnNlbWJsZUVsZW1lbnRbXSA9IHJhd0VsZW1lbnRzLm1hcCgoZWxlbTogYW55LCBpbmRleDogbnVtYmVyKSA9PiB7XG4gICAgICAvLyBTdXBwb3J0IGJvdGggZWxlbWVudF9uYW1lIChuZXcgc3RhbmRhcmQpIGFuZCBuYW1lIChsZWdhY3kpXG4gICAgICBjb25zdCBlbGVtZW50TmFtZSA9IGVsZW0uZWxlbWVudF9uYW1lIHx8IGVsZW0ubmFtZTtcbiAgICAgIGlmICghZWxlbWVudE5hbWUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFbGVtZW50IGF0IGluZGV4ICR7aW5kZXh9IG11c3QgaGF2ZSBlbGVtZW50X25hbWUgKG9yIG5hbWUgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5KWApO1xuICAgICAgfVxuICAgICAgLy8gTG9nIGRlcHJlY2F0aW9uIHdhcm5pbmcgaWYgdXNpbmcgbGVnYWN5ICduYW1lJyBmaWVsZFxuICAgICAgaWYgKGVsZW0ubmFtZSAmJiAhZWxlbS5lbGVtZW50X25hbWUpIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oYEVuc2VtYmxlIGVsZW1lbnQgYXQgaW5kZXggJHtpbmRleH0gdXNlcyBkZXByZWNhdGVkICduYW1lJyBmaWVsZC4gVXNlICdlbGVtZW50X25hbWUnIGluc3RlYWQuYCk7XG4gICAgICB9XG5cbiAgICAgIC8vIFN1cHBvcnQgYm90aCBlbGVtZW50X3R5cGUgKG5ldyBzdGFuZGFyZCkgYW5kIHR5cGUgKGxlZ2FjeSlcbiAgICAgIC8vIElzc3VlICM0NjY6IE5vIGxvbmdlciBkZWZhdWx0cyB0byAnc2tpbGwnIOKAlCBjYWxsZXJzIG11c3QgcHJvdmlkZSB0eXBlXG4gICAgICAvLyBvciBwYXNzIG1hbmFnZXJzIGZvciBwb3J0Zm9saW8gcmVzb2x1dGlvblxuICAgICAgY29uc3QgZWxlbWVudFR5cGUgPSBlbGVtLmVsZW1lbnRfdHlwZSB8fCBlbGVtLnR5cGU7XG4gICAgICBpZiAoIWVsZW1lbnRUeXBlKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgRWxlbWVudCAnJHtlbGVtZW50TmFtZX0nIGF0IGluZGV4ICR7aW5kZXh9IGhhcyBubyBlbGVtZW50X3R5cGUuIGAgK1xuICAgICAgICAgIGBQcm92aWRlIGVsZW1lbnRfdHlwZSBleHBsaWNpdGx5IG9yIGVuc3VyZSB0aGUgZWxlbWVudCBleGlzdHMgaW4gdGhlIHBvcnRmb2xpby5gXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICAvLyBMb2cgZGVwcmVjYXRpb24gd2FybmluZyBpZiB1c2luZyBsZWdhY3kgJ3R5cGUnIGZpZWxkXG4gICAgICBpZiAoZWxlbS50eXBlICYmICFlbGVtLmVsZW1lbnRfdHlwZSkge1xuICAgICAgICBsb2dnZXIud2FybihgRW5zZW1ibGUgZWxlbWVudCBhdCBpbmRleCAke2luZGV4fSB1c2VzIGRlcHJlY2F0ZWQgJ3R5cGUnIGZpZWxkLiBVc2UgJ2VsZW1lbnRfdHlwZScgaW5zdGVhZC5gKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZWxlbWVudF9uYW1lOiBlbGVtZW50TmFtZSxcbiAgICAgICAgZWxlbWVudF90eXBlOiBlbGVtZW50VHlwZSxcbiAgICAgICAgcm9sZTogZWxlbS5yb2xlIHx8IEVOU0VNQkxFX0RFRkFVTFRTLkVMRU1FTlRfUk9MRSxcbiAgICAgICAgcHJpb3JpdHk6IGVsZW0ucHJpb3JpdHkgPz8gRU5TRU1CTEVfREVGQVVMVFMuUFJJT1JJVFksXG4gICAgICAgIGFjdGl2YXRpb246IGVsZW0uYWN0aXZhdGlvbiB8fCAnYWx3YXlzJyxcbiAgICAgICAgY29uZGl0aW9uOiBlbGVtLmNvbmRpdGlvbixcbiAgICAgICAgZGVwZW5kZW5jaWVzOiBlbGVtLmRlcGVuZGVuY2llcyxcbiAgICAgICAgcHVycG9zZTogZWxlbS5wdXJwb3NlXG4gICAgICB9IGFzIEVuc2VtYmxlRWxlbWVudDtcbiAgICB9KTtcblxuICAgIC8vIFNldCBkZWZhdWx0cyBmb3Igb3B0aW9uYWwgZmllbGRzXG4gICAgY29uc3QgZnVsbE1ldGFkYXRhOiBFbnNlbWJsZU1ldGFkYXRhID0ge1xuICAgICAgbmFtZTogbWV0YWRhdGEubmFtZSxcbiAgICAgIGRlc2NyaXB0aW9uOiBtZXRhZGF0YS5kZXNjcmlwdGlvbiB8fCAnJyxcbiAgICAgIHZlcnNpb246IG1ldGFkYXRhLnZlcnNpb24gfHwgJzEuMC4wJyxcbiAgICAgIGF1dGhvcjogbWV0YWRhdGEuYXV0aG9yLFxuICAgICAgY3JlYXRlZDogbWV0YWRhdGEuY3JlYXRlZCB8fCBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgICBtb2RpZmllZDogbWV0YWRhdGEubW9kaWZpZWQgfHwgbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgICAgdGFnczogbWV0YWRhdGEudGFncyB8fCBbXSxcbiAgICAgIGFjdGl2YXRpb25TdHJhdGVneTogbWV0YWRhdGEuYWN0aXZhdGlvblN0cmF0ZWd5IHx8IChtZXRhZGF0YSBhcyBhbnkpLmFjdGl2YXRpb25fc3RyYXRlZ3kgfHwgRU5TRU1CTEVfREVGQVVMVFMuQUNUSVZBVElPTl9TVFJBVEVHWSxcbiAgICAgIGNvbmZsaWN0UmVzb2x1dGlvbjogbWV0YWRhdGEuY29uZmxpY3RSZXNvbHV0aW9uIHx8IChtZXRhZGF0YSBhcyBhbnkpLmNvbmZsaWN0X3Jlc29sdXRpb24gfHwgRU5TRU1CTEVfREVGQVVMVFMuQ09ORkxJQ1RfUkVTT0xVVElPTixcbiAgICAgIGNvbnRleHRTaGFyaW5nOiBtZXRhZGF0YS5jb250ZXh0U2hhcmluZyB8fCBFTlNFTUJMRV9ERUZBVUxUUy5DT05URVhUX1NIQVJJTkcsXG4gICAgICByZXNvdXJjZUxpbWl0czogbWV0YWRhdGEucmVzb3VyY2VMaW1pdHMsXG4gICAgICBhbGxvd05lc3RlZDogbWV0YWRhdGEuYWxsb3dOZXN0ZWQgPz8gRU5TRU1CTEVfREVGQVVMVFMuQUxMT1dfTkVTVEVELFxuICAgICAgbWF4TmVzdGluZ0RlcHRoOiBtZXRhZGF0YS5tYXhOZXN0aW5nRGVwdGggfHwgRU5TRU1CTEVfREVGQVVMVFMuTUFYX05FU1RJTkdfREVQVEgsXG4gICAgICBlbGVtZW50czogbWlncmF0ZWRFbGVtZW50cyxcbiAgICAgIC8vIElzc3VlICM1MjQg4oCUIEdhdGVrZWVwZXIgcG9saWN5IChzeW1tZXRyaWMgd2l0aCBidWlsZE1ldGFkYXRhIGRlc2VyaWFsaXphdGlvbilcbiAgICAgIGdhdGVrZWVwZXI6IHNhbml0aXplR2F0ZWtlZXBlclBvbGljeSgobWV0YWRhdGEgYXMgYW55KS5nYXRla2VlcGVyLCBtZXRhZGF0YS5uYW1lISwgJ2Vuc2VtYmxlJyksXG4gICAgfTtcblxuICAgIC8vIFVzZSBpbmhlcml0ZWQgZ2V0RWxlbWVudEZpbGVuYW1lKCkgZm9yIGNvbnNpc3RlbnQgZmlsZW5hbWUgbm9ybWFsaXphdGlvblxuICAgIGNvbnN0IGZpbGVuYW1lID0gdGhpcy5nZXRFbGVtZW50RmlsZW5hbWUoZnVsbE1ldGFkYXRhLm5hbWUpO1xuXG4gICAgLy8gSXNzdWUgIzYxMzogQ2hlY2sgbWV0YWRhdGEgbmFtZSB1bmlxdWVuZXNzIChub3QganVzdCBmaWxlbmFtZSlcbiAgICBjb25zdCBleGlzdGluZ0Vuc2VtYmxlcyA9IGF3YWl0IHRoaXMubGlzdCgpO1xuICAgIGNvbnN0IGR1cGxpY2F0ZSA9IGV4aXN0aW5nRW5zZW1ibGVzLmZpbmQoZSA9PlxuICAgICAgZS5tZXRhZGF0YS5uYW1lLnRvTG93ZXJDYXNlKCkgPT09IGZ1bGxNZXRhZGF0YS5uYW1lLnRvTG93ZXJDYXNlKClcbiAgICApO1xuICAgIGlmIChkdXBsaWNhdGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQW4gZW5zZW1ibGUgbmFtZWQgXCIke2Z1bGxNZXRhZGF0YS5uYW1lfVwiIGFscmVhZHkgZXhpc3RzYCk7XG4gICAgfVxuXG4gICAgLy8gQ3JlYXRlIGVuc2VtYmxlXG4gICAgY29uc3QgZW5zZW1ibGUgPSBuZXcgRW5zZW1ibGUoZnVsbE1ldGFkYXRhLCBmdWxsTWV0YWRhdGEuZWxlbWVudHMsIHRoaXMubWV0YWRhdGFTZXJ2aWNlKTtcblxuICAgIC8vIFNldCBpbnN0cnVjdGlvbnMgYW5kIGNvbnRlbnQgaWYgcHJvdmlkZWQgKHYyLjAgZHVhbC1maWVsZCBhcmNoaXRlY3R1cmUpXG4gICAgaWYgKG1ldGFkYXRhLmluc3RydWN0aW9ucykge1xuICAgICAgZW5zZW1ibGUuaW5zdHJ1Y3Rpb25zID0gbWV0YWRhdGEuaW5zdHJ1Y3Rpb25zO1xuICAgIH1cbiAgICBpZiAobWV0YWRhdGEuY29udGVudCkge1xuICAgICAgZW5zZW1ibGUuY29udGVudCA9IG1ldGFkYXRhLmNvbnRlbnQ7XG4gICAgfVxuXG4gICAgLy8gU2F2ZSB0byBkaXNrXG4gICAgYXdhaXQgdGhpcy5zYXZlKGVuc2VtYmxlLCBmaWxlbmFtZSk7XG4gICAgLy8gTm90ZTogTm8gcmVsb2FkKCkgaGVyZSDigJQgc2F2ZSgpIGNhY2hlcyB0aGUgZWxlbWVudCBjb3JyZWN0bHkuXG4gICAgLy8gU2VlIElzc3VlICM0OTEgZm9yIHdoeSBQZXJzb25hTWFuYWdlcidzIHJlbG9hZC1hZnRlci1jcmVhdGUgd2FzIHJlbW92ZWQuXG5cbiAgICAvLyBMb2cgY3JlYXRpb25cbiAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICB0eXBlOiBFTlNFTUJMRV9TRUNVUklUWV9FVkVOVFMuU0FWRUQsXG4gICAgICBzZXZlcml0eTogJ0xPVycsXG4gICAgICBzb3VyY2U6ICdFbnNlbWJsZU1hbmFnZXIuY3JlYXRlJyxcbiAgICAgIGRldGFpbHM6IGBDcmVhdGVkIGVuc2VtYmxlOiAke2Z1bGxNZXRhZGF0YS5uYW1lfWBcbiAgICB9KTtcblxuICAgIHJldHVybiBlbnNlbWJsZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZSBhbiBlbnNlbWJsZVxuICAgKiBEZWxlZ2F0ZXMgdG8gZW5zZW1ibGUncyBvd24gdmFsaWRhdGUgbWV0aG9kXG4gICAqXG4gICAqIEBwYXJhbSBlbGVtZW50IC0gRW5zZW1ibGUgdG8gdmFsaWRhdGVcbiAgICogQHJldHVybnMgVmFsaWRhdGlvbiByZXN1bHRcbiAgICovXG4gIG92ZXJyaWRlIHZhbGlkYXRlKGVsZW1lbnQ6IEVuc2VtYmxlKTogRWxlbWVudFZhbGlkYXRpb25SZXN1bHQge1xuICAgIHJldHVybiBlbGVtZW50LnZhbGlkYXRlKCk7XG4gIH1cblxuICAvKipcbiAgICogT3ZlcnJpZGUgc2F2ZSB0byB2YWxpZGF0ZSBiZWZvcmUgcGVyc2lzdGluZ1xuICAgKi9cbiAgb3ZlcnJpZGUgYXN5bmMgc2F2ZShlbGVtZW50OiBFbnNlbWJsZSwgZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIFZhbGlkYXRlIGVuc2VtYmxlIGJlZm9yZSBzYXZpbmdcbiAgICBjb25zdCB2YWxpZGF0aW9uUmVzdWx0ID0gdGhpcy52YWxpZGF0ZShlbGVtZW50KTtcbiAgICBpZiAoIXZhbGlkYXRpb25SZXN1bHQudmFsaWQpIHtcbiAgICAgIGNvbnN0IGVycm9ycyA9IHZhbGlkYXRpb25SZXN1bHQuZXJyb3JzPy5tYXAoZSA9PiBlLm1lc3NhZ2UpLmpvaW4oJywgJykgfHwgJ1Vua25vd24gdmFsaWRhdGlvbiBlcnJvcic7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBzYXZlIGludmFsaWQgZW5zZW1ibGU6ICR7ZXJyb3JzfWApO1xuICAgIH1cblxuICAgIC8vIENhbGwgYmFzZSBpbXBsZW1lbnRhdGlvblxuICAgIGF3YWl0IHN1cGVyLnNhdmUoZWxlbWVudCwgZmlsZVBhdGgpO1xuICB9XG5cbiAgLyoqXG4gICAqIE92ZXJyaWRlIGRlbGV0ZSB0byBhZGQgZW5zZW1ibGUtc3BlY2lmaWMgbG9nZ2luZ1xuICAgKi9cbiAgb3ZlcnJpZGUgYXN5bmMgZGVsZXRlKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICB0eXBlOiBFTlNFTUJMRV9TRUNVUklUWV9FVkVOVFMuREVMRVRFRCxcbiAgICAgIHNldmVyaXR5OiAnTUVESVVNJyxcbiAgICAgIHNvdXJjZTogJ0Vuc2VtYmxlTWFuYWdlci5kZWxldGUnLFxuICAgICAgZGV0YWlsczogYERlbGV0aW5nIGVuc2VtYmxlOiAke2ZpbGVQYXRofWBcbiAgICB9KTtcblxuICAgIGF3YWl0IHN1cGVyLmRlbGV0ZShmaWxlUGF0aCk7XG5cbiAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICB0eXBlOiBFTlNFTUJMRV9TRUNVUklUWV9FVkVOVFMuREVMRVRFRCxcbiAgICAgIHNldmVyaXR5OiAnTE9XJyxcbiAgICAgIHNvdXJjZTogJ0Vuc2VtYmxlTWFuYWdlci5kZWxldGUnLFxuICAgICAgZGV0YWlsczogYFN1Y2Nlc3NmdWxseSBkZWxldGVkIGVuc2VtYmxlOiAke2ZpbGVQYXRofWBcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBPdmVycmlkZSBsaXN0IHRvIGFwcGx5IGFjdGl2ZSBzdGF0dXMgYmFzZWQgb24gYWN0aXZlRW5zZW1ibGVOYW1lcyBzZXRcbiAgICovXG4gIG92ZXJyaWRlIGFzeW5jIGxpc3QoKTogUHJvbWlzZTxFbnNlbWJsZVtdPiB7XG4gICAgY29uc3QgZW5zZW1ibGVzID0gYXdhaXQgc3VwZXIubGlzdCgpO1xuXG4gICAgLy8gQXBwbHkgQUNUSVZFIHN0YXR1cyB0byBlbnNlbWJsZXMgaW4gdGhlIGFjdGl2ZUVuc2VtYmxlTmFtZXMgc2V0XG4gICAgZm9yIChjb25zdCBlbnNlbWJsZSBvZiBlbnNlbWJsZXMpIHtcbiAgICAgIGlmICh0aGlzLmFjdGl2ZUVuc2VtYmxlTmFtZXMuaGFzKGVuc2VtYmxlLm1ldGFkYXRhLm5hbWUpKSB7XG4gICAgICAgIC8vIENhbGwgYWN0aXZhdGUoKSB0byBzZXQgc3RhdHVzIHRvIEFDVElWRVxuICAgICAgICBhd2FpdCBlbnNlbWJsZS5hY3RpdmF0ZSgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBlbnNlbWJsZXM7XG4gIH1cblxuICAvKipcbiAgICogQWN0aXZhdGUgYW4gZW5zZW1ibGUgYnkgbmFtZSBvciBpZGVudGlmaWVyXG4gICAqXG4gICAqIElzc3VlICMyNCAoTE9XIFBSSU9SSVRZKTogUGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9uIHVzaW5nIGZpbmRCeU5hbWUoKVxuICAgKiBJc3N1ZSAjMjQgKExPVyBQUklPUklUWSk6IENvbnNpc3RlbnQgZXJyb3IgbWVzc2FnZXMgdXNpbmcgRWxlbWVudE1lc3NhZ2VzXG4gICAqIElzc3VlICMyNCAoTE9XIFBSSU9SSVRZKTogQ2xlYW51cCB0cmlnZ2VyIGZvciBtZW1vcnkgbGVhayBwcmV2ZW50aW9uXG4gICAqXG4gICAqIEBwYXJhbSBpZGVudGlmaWVyIC0gRW5zZW1ibGUgbmFtZSBvciBpZGVudGlmaWVyXG4gICAqIEByZXR1cm5zIEFjdGl2YXRpb24gcmVzdWx0IHdpdGggc3VjY2VzcyBzdGF0dXMgYW5kIG1lc3NhZ2VcbiAgICovXG4gIGFzeW5jIGFjdGl2YXRlRW5zZW1ibGUoaWRlbnRpZmllcjogc3RyaW5nKTogUHJvbWlzZTx7IHN1Y2Nlc3M6IGJvb2xlYW47IG1lc3NhZ2U6IHN0cmluZzsgZW5zZW1ibGU/OiBFbnNlbWJsZSB9PiB7XG4gICAgLy8gRXZpY3Qgc3RhbGUgY2FjaGUgYmVmb3JlIGxvb2t1cCBzbyBleHRlcm5hbCBmaWxlIGVkaXRzIGFyZSBwaWNrZWQgdXAgKCMxODk1KS5cbiAgICAvLyBmaW5kQnlOYW1lKCkgaGl0cyB0aGUgTFJVIGNhY2hlIGZpcnN0IGFuZCBuZXZlciBjYWxscyBsaXN0KCksIHNvIHdpdGhvdXQgdGhpc1xuICAgIC8vIHRoZSBzY2FuIGNvb2xkb3duIHByZXZlbnRzIG10aW1lLWJhc2VkIGV2aWN0aW9uIGZyb20gcnVubmluZy5cbiAgICBhd2FpdCB0aGlzLnNjYW5BbmRFdmljdCgpO1xuXG4gICAgLy8gUEVSRk9STUFOQ0UgRklYOiBVc2UgZmluZEJ5TmFtZSgpIGluc3RlYWQgb2YgbGlzdCgpXG4gICAgY29uc3QgZW5zZW1ibGUgPSBhd2FpdCB0aGlzLmZpbmRCeU5hbWUoaWRlbnRpZmllcik7XG5cbiAgICBpZiAoIWVuc2VtYmxlKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgLy8gQ09OU0lTVEVOQ1kgRklYOiBVc2Ugc3RhbmRhcmRpemVkIGVycm9yIG1lc3NhZ2UgZm9ybWF0XG4gICAgICAgIG1lc3NhZ2U6IEVsZW1lbnRNZXNzYWdlcy5ub3RGb3VuZChFbGVtZW50VHlwZS5FTlNFTUJMRSwgaWRlbnRpZmllcilcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gTUVNT1JZIExFQUsgRklYOiBDaGVjayBpZiBjbGVhbnVwIGlzIG5lZWRlZCBiZWZvcmUgYWRkaW5nXG4gICAgdGhpcy5jaGVja0FuZENsZWFudXBBY3RpdmVTZXQoKTtcblxuICAgIHRoaXMuYWN0aXZlRW5zZW1ibGVOYW1lcy5hZGQoZW5zZW1ibGUubWV0YWRhdGEubmFtZSk7XG5cbiAgICAvLyBTZXQgZW5zZW1ibGUgc3RhdHVzIHRvIGFjdGl2ZVxuICAgIGF3YWl0IGVuc2VtYmxlLmFjdGl2YXRlKCk7XG5cbiAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICB0eXBlOiAnRUxFTUVOVF9DUkVBVEVEJyxcbiAgICAgIHNldmVyaXR5OiAnTE9XJyxcbiAgICAgIHNvdXJjZTogJ0Vuc2VtYmxlTWFuYWdlci5hY3RpdmF0ZUVuc2VtYmxlJyxcbiAgICAgIGRldGFpbHM6IGBFbnNlbWJsZSBhY3RpdmF0ZWQ6ICR7ZW5zZW1ibGUubWV0YWRhdGEubmFtZX1gXG4gICAgfSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgc3VjY2VzczogdHJ1ZSxcbiAgICAgIC8vIENPTlNJU1RFTkNZIEZJWDogVXNlIHN0YW5kYXJkaXplZCBzdWNjZXNzIG1lc3NhZ2UgZm9ybWF0XG4gICAgICBtZXNzYWdlOiBFbGVtZW50TWVzc2FnZXMuYWN0aXZhdGVkKEVsZW1lbnRUeXBlLkVOU0VNQkxFLCBlbnNlbWJsZS5tZXRhZGF0YS5uYW1lKSxcbiAgICAgIGVuc2VtYmxlXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWFjdGl2YXRlIGFuIGVuc2VtYmxlIGJ5IG5hbWUgb3IgaWRlbnRpZmllclxuICAgKlxuICAgKiBJc3N1ZSAjMjQgKExPVyBQUklPUklUWSk6IFBlcmZvcm1hbmNlIG9wdGltaXphdGlvbiB1c2luZyBmaW5kQnlOYW1lKClcbiAgICogSXNzdWUgIzI0IChMT1cgUFJJT1JJVFkpOiBDb25zaXN0ZW50IGVycm9yIG1lc3NhZ2VzIHVzaW5nIEVsZW1lbnRNZXNzYWdlc1xuICAgKlxuICAgKiBAcGFyYW0gaWRlbnRpZmllciAtIEVuc2VtYmxlIG5hbWUgb3IgaWRlbnRpZmllclxuICAgKiBAcmV0dXJucyBEZWFjdGl2YXRpb24gcmVzdWx0IHdpdGggc3VjY2VzcyBzdGF0dXMgYW5kIG1lc3NhZ2VcbiAgICovXG4gIGFzeW5jIGRlYWN0aXZhdGVFbnNlbWJsZShpZGVudGlmaWVyOiBzdHJpbmcpOiBQcm9taXNlPHsgc3VjY2VzczogYm9vbGVhbjsgbWVzc2FnZTogc3RyaW5nOyBlbnNlbWJsZT86IEVuc2VtYmxlIH0+IHtcbiAgICAvLyBObyBzY2FuQW5kRXZpY3QoKSBoZXJlIOKAlCBpbnRlbnRpb25hbC4gRGVhY3RpdmF0aW9uIG9ubHkgbmVlZHMgdGhlIGVuc2VtYmxlJ3NcbiAgICAvLyBuYW1lICh0byByZW1vdmUgZnJvbSBhY3RpdmVFbnNlbWJsZU5hbWVzKSBhbmQgY2FsbHMgZGVhY3RpdmF0ZSgpIHdoaWNoIHNldHNcbiAgICAvLyBhIHN0YXR1cyBmbGFnLiBJdCBkb2VzIG5vdCBjb25zdW1lIHRoZSBlbGVtZW50cyBsaXN0LCBzbyBzdGFsZSBjYWNoZWQgZWxlbWVudFxuICAgIC8vIGRhdGEgaGFzIG5vIGVmZmVjdCBvbiBjb3JyZWN0bmVzcy4gQ29tcGFyZSB3aXRoIGFjdGl2YXRlRW5zZW1ibGUoKSwgd2hpY2hcbiAgICAvLyBpbmdlc3RzIHRoZSBmdWxsIGVsZW1lbnQgbGlzdCB0byBvcmNoZXN0cmF0ZSBzdWItZWxlbWVudCBsb2FkaW5nIGFuZCBtdXN0XG4gICAgLy8gdGhlcmVmb3JlIHNlZSB0aGUgbGF0ZXN0IG9uLWRpc2sgZGVmaW5pdGlvbi4gKCMxODk1KVxuXG4gICAgLy8gUEVSRk9STUFOQ0UgRklYOiBVc2UgZmluZEJ5TmFtZSgpIGluc3RlYWQgb2YgbGlzdCgpXG4gICAgY29uc3QgZW5zZW1ibGUgPSBhd2FpdCB0aGlzLmZpbmRCeU5hbWUoaWRlbnRpZmllcik7XG5cbiAgICBpZiAoIWVuc2VtYmxlKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgLy8gQ09OU0lTVEVOQ1kgRklYOiBVc2Ugc3RhbmRhcmRpemVkIGVycm9yIG1lc3NhZ2UgZm9ybWF0XG4gICAgICAgIG1lc3NhZ2U6IEVsZW1lbnRNZXNzYWdlcy5ub3RGb3VuZChFbGVtZW50VHlwZS5FTlNFTUJMRSwgaWRlbnRpZmllcilcbiAgICAgIH07XG4gICAgfVxuXG4gICAgdGhpcy5hY3RpdmVFbnNlbWJsZU5hbWVzLmRlbGV0ZShlbnNlbWJsZS5tZXRhZGF0YS5uYW1lKTtcblxuICAgIC8vIFNldCBlbnNlbWJsZSBzdGF0dXMgdG8gaW5hY3RpdmVcbiAgICBhd2FpdCBlbnNlbWJsZS5kZWFjdGl2YXRlKCk7XG5cbiAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICB0eXBlOiAnRUxFTUVOVF9DUkVBVEVEJyxcbiAgICAgIHNldmVyaXR5OiAnTE9XJyxcbiAgICAgIHNvdXJjZTogJ0Vuc2VtYmxlTWFuYWdlci5kZWFjdGl2YXRlRW5zZW1ibGUnLFxuICAgICAgZGV0YWlsczogYEVuc2VtYmxlIGRlYWN0aXZhdGVkOiAke2Vuc2VtYmxlLm1ldGFkYXRhLm5hbWV9YFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHN1Y2Nlc3M6IHRydWUsXG4gICAgICAvLyBDT05TSVNURU5DWSBGSVg6IFVzZSBzdGFuZGFyZGl6ZWQgc3VjY2VzcyBtZXNzYWdlIGZvcm1hdFxuICAgICAgbWVzc2FnZTogRWxlbWVudE1lc3NhZ2VzLmRlYWN0aXZhdGVkKEVsZW1lbnRUeXBlLkVOU0VNQkxFLCBlbnNlbWJsZS5tZXRhZGF0YS5uYW1lKSxcbiAgICAgIGVuc2VtYmxlXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYWxsIGFjdGl2ZSBlbnNlbWJsZXNcbiAgICpcbiAgICogQHJldHVybnMgTGlzdCBvZiBhY3RpdmUgZW5zZW1ibGVzXG4gICAqL1xuICBhc3luYyBnZXRBY3RpdmVFbnNlbWJsZXMoKTogUHJvbWlzZTxFbnNlbWJsZVtdPiB7XG4gICAgY29uc3QgcmVzdWx0czogRW5zZW1ibGVbXSA9IFtdO1xuICAgIGZvciAoY29uc3QgbmFtZSBvZiB0aGlzLmFjdGl2ZUVuc2VtYmxlTmFtZXMpIHtcbiAgICAgIGNvbnN0IGVuc2VtYmxlID0gYXdhaXQgdGhpcy5maW5kQnlOYW1lKG5hbWUpO1xuICAgICAgaWYgKGVuc2VtYmxlKSByZXN1bHRzLnB1c2goZW5zZW1ibGUpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0cztcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBhY3RpdmUgc2V0IGNsZWFudXAgaXMgbmVlZGVkIGFuZCBwZXJmb3JtIGNsZWFudXAgaWYgbmVjZXNzYXJ5XG4gICAqIElzc3VlICMyNCAoTE9XIFBSSU9SSVRZKTogTWVtb3J5IGxlYWsgcHJldmVudGlvblxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBjaGVja0FuZENsZWFudXBBY3RpdmVTZXQoKTogdm9pZCB7XG4gICAgY29uc3QgeyBtYXgsIGNsZWFudXBUaHJlc2hvbGQgfSA9IGdldEFjdGl2ZUVsZW1lbnRMaW1pdENvbmZpZygnZW5zZW1ibGVzJyk7XG5cbiAgICAvLyBCZWxvdyB0aHJlc2hvbGQg4oCUIG5vIGFjdGlvbiBuZWVkZWRcbiAgICBpZiAodGhpcy5hY3RpdmVFbnNlbWJsZU5hbWVzLnNpemUgPCBjbGVhbnVwVGhyZXNob2xkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gQXQgb3IgYWJvdmUgbWF4IOKAlCB3YXJuIGJlZm9yZSBjbGVhbnVwXG4gICAgaWYgKHRoaXMuYWN0aXZlRW5zZW1ibGVOYW1lcy5zaXplID49IG1heCkge1xuICAgICAgbG9nZ2VyLndhcm4oXG4gICAgICAgIGBBY3RpdmUgZW5zZW1ibGVzIGxpbWl0IHJlYWNoZWQgKCR7bWF4fSkuIGAgK1xuICAgICAgICBgQ29uc2lkZXIgZGVhY3RpdmF0aW5nIHVudXNlZCBlbnNlbWJsZXMgb3Igc2V0dGluZyBET0xMSE9VU0VfTUFYX0FDVElWRV9FTlNFTUJMRVMgdG8gYSBoaWdoZXIgdmFsdWUuYFxuICAgICAgKTtcblxuICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICB0eXBlOiAnRUxFTUVOVF9DUkVBVEVEJyxcbiAgICAgICAgc2V2ZXJpdHk6ICdNRURJVU0nLFxuICAgICAgICBzb3VyY2U6ICdFbnNlbWJsZU1hbmFnZXIuY2hlY2tBbmRDbGVhbnVwQWN0aXZlU2V0JyxcbiAgICAgICAgZGV0YWlsczogYEFjdGl2ZSBlbnNlbWJsZXMgbGltaXQgcmVhY2hlZDogJHt0aGlzLmFjdGl2ZUVuc2VtYmxlTmFtZXMuc2l6ZX0vJHttYXh9YFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gQXQgb3IgYWJvdmUgdGhyZXNob2xkIOKAlCBwcm9hY3RpdmVseSBjbGVhbiBzdGFsZSBlbnRyaWVzXG4gICAgdm9pZCB0aGlzLmNsZWFudXBTdGFsZUFjdGl2ZUVuc2VtYmxlcygpO1xuICB9XG5cbiAgLyoqXG4gICAqIENsZWFuIHVwIHN0YWxlIGVudHJpZXMgZnJvbSBhY3RpdmUgZW5zZW1ibGVzIHNldFxuICAgKiBJc3N1ZSAjMjQgKExPVyBQUklPUklUWSk6IE1lbW9yeSBsZWFrIHByZXZlbnRpb25cbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgY2xlYW51cFN0YWxlQWN0aXZlRW5zZW1ibGVzKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBzdGFydFNpemUgPSB0aGlzLmFjdGl2ZUVuc2VtYmxlTmFtZXMuc2l6ZTtcbiAgICAgIGNvbnN0IGVuc2VtYmxlcyA9IGF3YWl0IHRoaXMubGlzdCgpO1xuICAgICAgY29uc3QgZXhpc3RpbmdFbnNlbWJsZU5hbWVzID0gbmV3IFNldChlbnNlbWJsZXMubWFwKGUgPT4gZS5tZXRhZGF0YS5uYW1lKSk7XG5cbiAgICAgIGNvbnN0IHN0YWxlTmFtZXM6IHN0cmluZ1tdID0gW107XG4gICAgICBmb3IgKGNvbnN0IGFjdGl2ZU5hbWUgb2YgdGhpcy5hY3RpdmVFbnNlbWJsZU5hbWVzKSB7XG4gICAgICAgIGlmICghZXhpc3RpbmdFbnNlbWJsZU5hbWVzLmhhcyhhY3RpdmVOYW1lKSkge1xuICAgICAgICAgIHRoaXMuYWN0aXZlRW5zZW1ibGVOYW1lcy5kZWxldGUoYWN0aXZlTmFtZSk7XG4gICAgICAgICAgc3RhbGVOYW1lcy5wdXNoKGFjdGl2ZU5hbWUpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGVuZFNpemUgPSB0aGlzLmFjdGl2ZUVuc2VtYmxlTmFtZXMuc2l6ZTtcbiAgICAgIGNvbnN0IHJlbW92ZWQgPSBzdGFydFNpemUgLSBlbmRTaXplO1xuXG4gICAgICBpZiAocmVtb3ZlZCA+IDApIHtcbiAgICAgICAgbG9nZ2VyLmluZm8oXG4gICAgICAgICAgYENsZWFuZWQgdXAgJHtyZW1vdmVkfSBzdGFsZSBhY3RpdmUgZW5zZW1ibGUgcmVmZXJlbmNlKHMpLiBgICtcbiAgICAgICAgICBgQWN0aXZlIGVuc2VtYmxlczogJHtlbmRTaXplfS8ke2dldE1heEFjdGl2ZUxpbWl0KCdlbnNlbWJsZXMnKX1gXG4gICAgICAgICk7XG5cbiAgICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICAgIHR5cGU6ICdFTEVNRU5UX0RFTEVURUQnLFxuICAgICAgICAgIHNldmVyaXR5OiAnTE9XJyxcbiAgICAgICAgICBzb3VyY2U6ICdFbnNlbWJsZU1hbmFnZXIuY2xlYW51cFN0YWxlQWN0aXZlRW5zZW1ibGVzJyxcbiAgICAgICAgICBkZXRhaWxzOiBgUmVtb3ZlZCAke3JlbW92ZWR9IHN0YWxlIGFjdGl2ZSBlbnNlbWJsZSByZWZlcmVuY2VzYCxcbiAgICAgICAgICBhZGRpdGlvbmFsRGF0YToge1xuICAgICAgICAgICAgcmVtb3ZlZENvdW50OiByZW1vdmVkLFxuICAgICAgICAgICAgYWN0aXZlQ291bnQ6IGVuZFNpemUsXG4gICAgICAgICAgICBzdGFsZU5hbWVzOiBzdGFsZU5hbWVzLmpvaW4oJywgJylcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoJ0ZhaWxlZCB0byBjbGVhbnVwIHN0YWxlIGFjdGl2ZSBlbnNlbWJsZXM6JywgZXJyb3IpO1xuXG4gICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgIHR5cGU6ICdFTEVNRU5UX0RFTEVURUQnLFxuICAgICAgICBzZXZlcml0eTogJ0xPVycsXG4gICAgICAgIHNvdXJjZTogJ0Vuc2VtYmxlTWFuYWdlci5jbGVhbnVwU3RhbGVBY3RpdmVFbnNlbWJsZXMnLFxuICAgICAgICBkZXRhaWxzOiBgQ2xlYW51cCBmYWlsZWQ6ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpfWBcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxufVxuIl19
|
|
829
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRW5zZW1ibGVNYW5hZ2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2VsZW1lbnRzL2Vuc2VtYmxlcy9FbnNlbWJsZU1hbmFnZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBaUJHO0FBRUgsT0FBTyxFQUFFLFFBQVEsRUFBcUMsTUFBTSxlQUFlLENBQUM7QUFFNUUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSx5Q0FBeUMsQ0FBQztBQUMxRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUVuRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDcEUsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQy9DLE9BQU8sRUFDTCxpQkFBaUIsRUFDakIsZUFBZSxFQUNmLHdCQUF3QixFQUN4QixlQUFlLEVBQ2YscUJBQXFCLEVBQ3JCLG1CQUFtQixFQUNuQixhQUFhLEVBQ2IsZ0JBQWdCLEVBQ2pCLE1BQU0sZ0JBQWdCLENBQUM7QUFTeEIsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ2pFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxlQUFlLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUNuRixPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxvREFBb0QsQ0FBQztBQUU5RiwyRUFBMkU7QUFDM0UsT0FBTyxFQUFFLDJCQUEyQixFQUFFLGlCQUFpQixFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFFdkcsb0ZBQW9GO0FBQ3BGLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQ3pFLE9BQU8sRUFBRSxtQkFBbUIsRUFBcUMsTUFBTSxvQ0FBb0MsQ0FBQztBQUU1RyxvRkFBb0Y7QUFDcEYsTUFBTSxDQUFDLE1BQU0sMkJBQTJCLEdBQUcsbUJBQW1CLENBQUM7QUFFL0Q7Ozs7Ozs7O0dBUUc7QUFDSCxNQUFNLE9BQU8sZUFBZ0IsU0FBUSxrQkFBNEI7SUFZckQ7SUFYTyxZQUFZLENBQVM7SUFDOUIsaUJBQWlCLENBQW9CO0lBQ3JDLG9CQUFvQixDQUF1QjtJQUMzQyxtQkFBbUIsR0FBZ0IsSUFBSSxHQUFHLEVBQUUsQ0FBQztJQUVyRCxZQUNFLGdCQUFrQyxFQUNsQyxlQUFnQyxFQUNoQyxxQkFBNEMsRUFDNUMsa0JBQXNDLEVBQ3RDLG9CQUEwQyxFQUNsQyxlQUFnQyxFQUN4QyxnQkFBbUMsRUFDbkMsWUFBMkUsRUFDM0UsYUFBdUU7UUFFdkUsS0FBSyxDQUFDLFdBQVcsQ0FBQyxRQUFRLEVBQUUsZ0JBQWdCLEVBQUUsZUFBZSxFQUFFLEVBQUUsZ0JBQWdCLEVBQUUsWUFBWSxFQUFFLGFBQWEsRUFBRSxFQUFFLHFCQUFxQixFQUFFLGtCQUFrQixDQUFDLENBQUM7UUFMckosb0JBQWUsR0FBZixlQUFlLENBQWlCO1FBTXhDLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQztRQUNwQyxJQUFJLENBQUMsaUJBQWlCLEdBQUcsa0JBQWtCLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztRQUNuRSxJQUFJLENBQUMsb0JBQW9CLEdBQUcsb0JBQW9CLENBQUM7SUFDbkQsQ0FBQztJQUVrQixlQUFlO1FBQ2hDLE9BQU8sVUFBVSxDQUFDO0lBQ3BCLENBQUM7SUFFRDs7Ozs7Ozs7OztPQVVHO0lBQ2dCLEtBQUssQ0FBQyxhQUFhLENBQUMsSUFBUztRQUM5Qyw4RUFBOEU7UUFDOUUsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLHFCQUFxQixDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFO1lBQ2pGLFFBQVEsRUFBRSxJQUFJO1lBQ2QsU0FBUyxFQUFFLGVBQWUsQ0FBQyxlQUFlO1NBQzNDLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDeEIsTUFBTSxJQUFJLEtBQUssQ0FBQyxzQkFBc0IsVUFBVSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3pFLENBQUM7UUFDRCxNQUFNLElBQUksR0FBRyxVQUFVLENBQUMsY0FBYyxDQUFDO1FBRXZDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNWLE1BQU0sSUFBSSxLQUFLLENBQUMsdUNBQXVDLENBQUMsQ0FBQztRQUMzRCxDQUFDO1FBRUQsOEVBQThFO1FBQzlFLElBQUksV0FBK0IsQ0FBQztRQUNwQyxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUNyQixNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMscUJBQXFCLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxXQUFXLEVBQUU7Z0JBQy9GLFFBQVEsRUFBRSxLQUFLO2dCQUNmLFNBQVMsRUFBRSxlQUFlLENBQUMsc0JBQXNCO2dCQUNqRCxPQUFPLEVBQUUsbUJBQW1CLENBQUMsZ0JBQWdCO2FBQzlDLENBQUMsQ0FBQztZQUNILElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxFQUFFLENBQUM7Z0JBQ3hCLE1BQU0sSUFBSSxLQUFLLENBQUMsc0JBQXNCLFVBQVUsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUN6RSxDQUFDO1lBQ0QsV0FBVyxHQUFHLFVBQVUsQ0FBQyxjQUFjLENBQUM7UUFDMUMsQ0FBQztRQUVELG9HQUFvRztRQUNwRyxNQUFNLHFCQUFxQixHQUFHLElBQUksQ0FBQyxtQkFBbUIsSUFBSSxJQUFJLENBQUMsa0JBQWtCLElBQUksaUJBQWlCLENBQUMsbUJBQW1CLENBQUM7UUFDM0gsTUFBTSx3QkFBd0IsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsd0JBQXdCLENBQUMsTUFBTSxDQUFDLHFCQUFxQixDQUFDLEVBQUU7WUFDOUcsU0FBUyxFQUFFLGVBQWUsQ0FBQyxxQkFBcUI7WUFDaEQsV0FBVyxFQUFFLEtBQUs7U0FDbkIsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLHdCQUF3QixDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ3RDLE1BQU0sSUFBSSxLQUFLLENBQUMsZ0NBQWdDLHdCQUF3QixDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ2pHLENBQUM7UUFDRCxNQUFNLGtCQUFrQixHQUFHLHdCQUF3QixDQUFDLGNBQWUsQ0FBQztRQUVwRSx5RUFBeUU7UUFDekUsSUFBSSxDQUFDLHFCQUFxQixDQUFDLFFBQVEsQ0FBQyxrQkFBeUIsQ0FBQyxFQUFFLENBQUM7WUFDL0QsTUFBTSxJQUFJLEtBQUssQ0FBQyxHQUFHLGVBQWUsQ0FBQyxnQkFBZ0IsS0FBSyxrQkFBa0IsRUFBRSxDQUFDLENBQUM7UUFDaEYsQ0FBQztRQUVELHFFQUFxRTtRQUNyRSxNQUFNLHFCQUFxQixHQUFHLElBQUksQ0FBQyxtQkFBbUIsSUFBSSxJQUFJLENBQUMsa0JBQWtCLElBQUksaUJBQWlCLENBQUMsbUJBQW1CLENBQUM7UUFDM0gsTUFBTSx3QkFBd0IsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsd0JBQXdCLENBQUMsTUFBTSxDQUFDLHFCQUFxQixDQUFDLEVBQUU7WUFDOUcsU0FBUyxFQUFFLGVBQWUsQ0FBQyxxQkFBcUI7WUFDaEQsV0FBVyxFQUFFLEtBQUs7U0FDbkIsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLHdCQUF3QixDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ3RDLE1BQU0sSUFBSSxLQUFLLENBQUMseUNBQXlDLHdCQUF3QixDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQzFHLENBQUM7UUFDRCxNQUFNLGtCQUFrQixHQUFHLHdCQUF3QixDQUFDLGNBQWUsQ0FBQztRQUVwRSx5RUFBeUU7UUFDekUsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFFBQVEsQ0FBQyxrQkFBeUIsQ0FBQyxFQUFFLENBQUM7WUFDN0QsTUFBTSxJQUFJLEtBQUssQ0FBQyxHQUFHLGVBQWUsQ0FBQywyQkFBMkIsS0FBSyxrQkFBa0IsRUFBRSxDQUFDLENBQUM7UUFDM0YsQ0FBQztRQUVELDZEQUE2RDtRQUM3RCxNQUFNLGlCQUFpQixHQUFHLElBQUksQ0FBQyxlQUFlLElBQUksSUFBSSxDQUFDLGNBQWMsSUFBSSxpQkFBaUIsQ0FBQyxlQUFlLENBQUM7UUFFM0csK0RBQStEO1FBQy9ELElBQUksbUJBQTJCLENBQUM7UUFDaEMsSUFBSSxPQUFPLGlCQUFpQixLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQzNDLG1CQUFtQixHQUFHLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQztRQUM1RCxDQUFDO2FBQU0sQ0FBQztZQUNOLG1CQUFtQixHQUFHLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBQ2xELENBQUM7UUFFRCxNQUFNLG9CQUFvQixHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyx3QkFBd0IsQ0FBQyxtQkFBbUIsRUFBRTtZQUNoRyxTQUFTLEVBQUUsZUFBZSxDQUFDLHFCQUFxQjtZQUNoRCxXQUFXLEVBQUUsS0FBSztTQUNuQixDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsb0JBQW9CLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDbEMsTUFBTSxJQUFJLEtBQUssQ0FBQyxpQ0FBaUMsb0JBQW9CLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDOUYsQ0FBQztRQUNELE1BQU0sY0FBYyxHQUFHLG9CQUFvQixDQUFDLGNBQWUsQ0FBQztRQUU1RCx5RUFBeUU7UUFDekUsSUFBSSxDQUFDLENBQUMsTUFBTSxFQUFFLFdBQVcsRUFBRSxNQUFNLENBQUMsQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFDLEVBQUUsQ0FBQztZQUM1RCxNQUFNLElBQUksS0FBSyxDQUFDLGlDQUFpQyxjQUFjLEVBQUUsQ0FBQyxDQUFDO1FBQ3JFLENBQUM7UUFFRCw2Q0FBNkM7UUFDN0MsTUFBTSxpQkFBaUIsR0FBRyxJQUFJLENBQUMsZUFBZSxJQUFJLElBQUksQ0FBQyxjQUFjLENBQUM7UUFDdEUsSUFBSSxjQUFjLENBQUM7UUFFbkIsSUFBSSxpQkFBaUIsRUFBRSxDQUFDO1lBQ3RCLGNBQWMsR0FBRztnQkFDZixpQkFBaUIsRUFBRSxpQkFBaUIsQ0FBQyxtQkFBbUIsSUFBSSxpQkFBaUIsQ0FBQyxpQkFBaUIsSUFBSSxlQUFlLENBQUMsWUFBWTtnQkFDL0gsV0FBVyxFQUFFLGlCQUFpQixDQUFDLGFBQWEsSUFBSSxpQkFBaUIsQ0FBQyxXQUFXO2dCQUM3RSxrQkFBa0IsRUFBRSxpQkFBaUIsQ0FBQyxxQkFBcUIsSUFBSSxpQkFBaUIsQ0FBQyxrQkFBa0IsSUFBSSxlQUFlLENBQUMsbUJBQW1CO2FBQzNJLENBQUM7UUFDSixDQUFDO1FBRUQsdUJBQXVCO1FBQ3ZCLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxRQUFRLElBQUksRUFBRSxDQUFDO1FBQ3hDLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUM7WUFDaEMsTUFBTSxJQUFJLEtBQUssQ0FBQyxvQ0FBb0MsQ0FBQyxDQUFDO1FBQ3hELENBQUM7UUFFRCxNQUFNLFFBQVEsR0FBc0IsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQVMsRUFBRSxLQUFhLEVBQUUsRUFBRTtZQUMvRSxxREFBcUQ7WUFDckQseUZBQXlGO1lBQ3pGLE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxZQUFZLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQztZQUN0RCxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7Z0JBQ3BCLE1BQU0sSUFBSSxLQUFLLENBQUMsb0JBQW9CLEtBQUssK0RBQStELENBQUMsQ0FBQztZQUM1RyxDQUFDO1lBQ0QsdURBQXVEO1lBQ3ZELElBQUksSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztnQkFDcEMsTUFBTSxDQUFDLElBQUksQ0FBQyw2QkFBNkIsS0FBSyw0REFBNEQsQ0FBQyxDQUFDO1lBQzlHLENBQUM7WUFDRCxNQUFNLGlCQUFpQixHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyx3QkFBd0IsQ0FDdkUsTUFBTSxDQUFDLGNBQWMsQ0FBQyxFQUN0QixFQUFFLFNBQVMsRUFBRSxlQUFlLENBQUMsZUFBZSxFQUFFLFdBQVcsRUFBRSxJQUFJLEVBQUUsQ0FDbEUsQ0FBQztZQUNGLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLEVBQUUsQ0FBQztnQkFDL0IsTUFBTSxJQUFJLEtBQUssQ0FBQyxpQ0FBaUMsS0FBSyxLQUFLLGlCQUFpQixDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ3JHLENBQUM7WUFDRCxNQUFNLFdBQVcsR0FBRyxpQkFBaUIsQ0FBQyxjQUFlLENBQUM7WUFFdEQscURBQXFEO1lBQ3JELHlGQUF5RjtZQUN6RixNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsWUFBWSxJQUFJLElBQUksQ0FBQyxJQUFJLElBQUksT0FBTyxDQUFDO1lBQ2pFLHVEQUF1RDtZQUN2RCxJQUFJLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7Z0JBQ3BDLE1BQU0sQ0FBQyxJQUFJLENBQUMsNkJBQTZCLEtBQUssNERBQTRELENBQUMsQ0FBQztZQUM5RyxDQUFDO1lBQ0QsTUFBTSxpQkFBaUIsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsd0JBQXdCLENBQ3ZFLE1BQU0sQ0FBQyxjQUFjLENBQUMsRUFDdEIsRUFBRSxTQUFTLEVBQUUsZUFBZSxDQUFDLGNBQWMsRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUFFLENBQ2xFLENBQUM7WUFDRixJQUFJLENBQUMsaUJBQWlCLENBQUMsT0FBTyxFQUFFLENBQUM7Z0JBQy9CLE1BQU0sSUFBSSxLQUFLLENBQUMsaUNBQWlDLEtBQUssS0FBSyxpQkFBaUIsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUNyRyxDQUFDO1lBQ0QsTUFBTSxXQUFXLEdBQUcsaUJBQWlCLENBQUMsY0FBZSxDQUFDO1lBRXRELHFEQUFxRDtZQUNyRCxNQUFNLGlCQUFpQixHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyx3QkFBd0IsQ0FDdkUsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksaUJBQWlCLENBQUMsWUFBWSxDQUFDLEVBQ25ELEVBQUUsU0FBUyxFQUFFLGVBQWUsQ0FBQyxxQkFBcUIsRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUFFLENBQ3pFLENBQUM7WUFDRixJQUFJLENBQUMsaUJBQWlCLENBQUMsT0FBTyxFQUFFLENBQUM7Z0JBQy9CLE1BQU0sSUFBSSxLQUFLLENBQUMsaUNBQWlDLEtBQUssS0FBSyxpQkFBaUIsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUNyRyxDQUFDO1lBQ0QsTUFBTSxXQUFXLEdBQUcsaUJBQWlCLENBQUMsY0FBZSxDQUFDO1lBRXRELHlFQUF5RTtZQUN6RSxJQUFJLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxXQUFrQixDQUFDLEVBQUUsQ0FBQztnQkFDaEQsTUFBTSxJQUFJLEtBQUssQ0FBQyxHQUFHLGVBQWUsQ0FBQyxvQkFBb0IsS0FBSyxXQUFXLEVBQUUsQ0FBQyxDQUFDO1lBQzdFLENBQUM7WUFFRCwyREFBMkQ7WUFDM0QsTUFBTSx1QkFBdUIsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsd0JBQXdCLENBQzdFLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxJQUFJLFFBQVEsQ0FBQyxFQUNuQyxFQUFFLFNBQVMsRUFBRSxlQUFlLENBQUMscUJBQXFCLEVBQUUsV0FBVyxFQUFFLEtBQUssRUFBRSxDQUN6RSxDQUFDO1lBQ0YsSUFBSSxDQUFDLHVCQUF1QixDQUFDLE9BQU8sRUFBRSxDQUFDO2dCQUNyQyxNQUFNLElBQUksS0FBSyxDQUFDLHVDQUF1QyxLQUFLLEtBQUssdUJBQXVCLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDakgsQ0FBQztZQUNELE1BQU0saUJBQWlCLEdBQUcsdUJBQXVCLENBQUMsY0FBZSxDQUFDO1lBRWxFLHlFQUF5RTtZQUN6RSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLGlCQUF3QixDQUFDLEVBQUUsQ0FBQztnQkFDekQsTUFBTSxJQUFJLEtBQUssQ0FBQyxHQUFHLGVBQWUsQ0FBQyx1QkFBdUIsS0FBSyxpQkFBaUIsRUFBRSxDQUFDLENBQUM7WUFDdEYsQ0FBQztZQUVELHFDQUFxQztZQUNyQyxJQUFJLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxJQUFJLGlCQUFpQixDQUFDLFFBQVEsQ0FBQztZQUMzRCxJQUFJLE9BQU8sUUFBUSxLQUFLLFFBQVEsRUFBRSxDQUFDO2dCQUNqQyxRQUFRLEdBQUcsUUFBUSxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUNwQyxDQUFDO1lBQ0QsUUFBUSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUM7WUFFaEQsOEVBQThFO1lBQzlFLG9GQUFvRjtZQUNwRiwwREFBMEQ7WUFDMUQsSUFBSSxTQUE2QixDQUFDO1lBQ2xDLElBQUksaUJBQWlCLEtBQUssYUFBYSxJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztnQkFDMUQsTUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLHdCQUF3QixDQUNyRSxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUN0QjtvQkFDRSxTQUFTLEVBQUUsZUFBZSxDQUFDLG9CQUFvQjtvQkFDL0MsV0FBVyxFQUFFLElBQUk7b0JBQ2pCLGFBQWEsRUFBRSw4QkFBOEIsQ0FBRSxxQ0FBcUM7aUJBQ3JGLENBQ0YsQ0FBQztnQkFDRixJQUFJLENBQUMsZUFBZSxDQUFDLE9BQU8sRUFBRSxDQUFDO29CQUM3QixNQUFNLElBQUksS0FBSyxDQUFDLDhCQUE4QixLQUFLLEtBQUssZUFBZSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO2dCQUNoRyxDQUFDO2dCQUNELFNBQVMsR0FBRyxlQUFlLENBQUMsY0FBYyxDQUFDO1lBQzdDLENBQUM7WUFFRCxxREFBcUQ7WUFDckQsSUFBSSxZQUFrQyxDQUFDO1lBQ3ZDLElBQUksSUFBSSxDQUFDLFlBQVksSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDO2dCQUMxRCxNQUFNLHFCQUFxQixHQUFhLEVBQUUsQ0FBQztnQkFDM0MsS0FBSyxNQUFNLEdBQUcsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsZUFBZSxDQUFDLGdCQUFnQixDQUFDLEVBQUUsQ0FBQztvQkFDL0UsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLHdCQUF3QixDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRTt3QkFDN0UsU0FBUyxFQUFFLGVBQWUsQ0FBQyxlQUFlO3dCQUMxQyxXQUFXLEVBQUUsSUFBSTtxQkFDbEIsQ0FBQyxDQUFDO29CQUNILElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxFQUFFLENBQUM7d0JBQ3ZCLE1BQU0sSUFBSSxLQUFLLENBQUMsdUJBQXVCLEdBQUcsY0FBYyxLQUFLLEtBQUssU0FBUyxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO29CQUNwRyxDQUFDO29CQUNELHFCQUFxQixDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsY0FBZSxDQUFDLENBQUM7Z0JBQ3hELENBQUM7Z0JBQ0QsWUFBWSxHQUFHLHFCQUFxQixDQUFDO1lBQ3ZDLENBQUM7WUFFRCxnREFBZ0Q7WUFDaEQsSUFBSSxPQUEyQixDQUFDO1lBQ2hDLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO2dCQUNqQixNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsd0JBQXdCLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRTtvQkFDMUYsU0FBUyxFQUFFLGVBQWUsQ0FBQyxzQkFBc0I7b0JBQ2pELFdBQVcsRUFBRSxJQUFJO29CQUNqQixTQUFTLEVBQUUsYUFBYSxDQUFFLCtEQUErRDtpQkFDMUYsQ0FBQyxDQUFDO2dCQUNILElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxFQUFFLENBQUM7b0JBQzNCLE1BQU0sSUFBSSxLQUFLLENBQUMsNEJBQTRCLEtBQUssS0FBSyxhQUFhLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7Z0JBQzVGLENBQUM7Z0JBQ0QsT0FBTyxHQUFHLGFBQWEsQ0FBQyxjQUFjLENBQUM7WUFDekMsQ0FBQztZQUVELE9BQU87Z0JBQ0wsWUFBWSxFQUFFLFdBQVc7Z0JBQ3pCLFlBQVksRUFBRSxXQUFXO2dCQUN6QixJQUFJLEVBQUUsV0FBMEI7Z0JBQ2hDLFFBQVE7Z0JBQ1IsVUFBVSxFQUFFLGlCQUFtQztnQkFDL0MsU0FBUztnQkFDVCxZQUFZO2dCQUNaLE9BQU87YUFDUixDQUFDO1FBQ0osQ0FBQyxDQUFDLENBQUM7UUFFSCx5QkFBeUI7UUFDekIsSUFBSSxRQUFRLENBQUMsTUFBTSxHQUFHLGVBQWUsQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUNuRCxNQUFNLElBQUksS0FBSyxDQUFDLGVBQWUsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBQ3JELENBQUM7UUFFRCw4QkFBOEI7UUFDOUIsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLFlBQVksS0FBSyxTQUFTLENBQUMsQ0FBQztZQUNuRCxPQUFPLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUM7WUFDNUIsQ0FBQyxJQUFJLENBQUMsV0FBVyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUMsWUFBWSxDQUFDLENBQUM7UUFFaEcsTUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixJQUFJLElBQUksQ0FBQyxlQUFlLElBQUksaUJBQWlCLENBQUMsaUJBQWlCLENBQUM7UUFFOUcsbURBQW1EO1FBQ25ELElBQUksSUFBSSxHQUFhLEVBQUUsQ0FBQztRQUN4QixJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDN0IsS0FBSyxNQUFNLEdBQUcsSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7Z0JBQzVCLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyx3QkFBd0IsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUU7b0JBQzdFLFNBQVMsRUFBRSxlQUFlLENBQUMsY0FBYztvQkFDekMsV0FBVyxFQUFFLElBQUk7aUJBQ2xCLENBQUMsQ0FBQztnQkFDSCxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sRUFBRSxDQUFDO29CQUN2QixNQUFNLElBQUksS0FBSyxDQUFDLGdCQUFnQixHQUFHLE1BQU0sU0FBUyxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO2dCQUMzRSxDQUFDO2dCQUNELElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLGNBQWUsQ0FBQyxDQUFDO1lBQ3ZDLENBQUM7UUFDSCxDQUFDO1FBRUQsb0NBQW9DO1FBQ3BDLE1BQU0sUUFBUSxHQUFxQjtZQUNqQyxJQUFJO1lBQ0osV0FBVyxFQUFFLFdBQVcsSUFBSSxFQUFFO1lBQzlCLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTyxJQUFJLE9BQU87WUFDaEMsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNO1lBQ25CLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTztZQUNyQixRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVEsSUFBSSxJQUFJLElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRTtZQUNuRCxJQUFJO1lBQ0osa0JBQWtCLEVBQUUsa0JBQXdDO1lBQzVELGtCQUFrQixFQUFFLGtCQUFnRDtZQUNwRSxjQUFjLEVBQUUsY0FBK0M7WUFDL0QsY0FBYztZQUNkLFdBQVc7WUFDWCxlQUFlO1lBQ2YsUUFBUTtZQUNSLFVBQVUsRUFBRSx3QkFBd0IsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsSUFBK0IsQ0FBQyxFQUFHLGFBQWE7U0FDekgsQ0FBQztRQUVGLE9BQU8sUUFBUSxDQUFDO0lBQ2xCLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDZ0IsYUFBYSxDQUFDLFFBQTBCLEVBQUUsUUFBZ0I7UUFDM0UsT0FBUSxRQUFnQixDQUFDLGNBQWMsQ0FBQyxDQUFFLCtDQUErQztRQUN6RixNQUFNLFFBQVEsR0FBRyxJQUFJLFFBQVEsQ0FBQyxRQUFRLEVBQUUsUUFBUSxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDakYsZ0VBQWdFO1FBQ2hFLElBQUksUUFBUSxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQzFCLFFBQVEsQ0FBQyxZQUFZLEdBQUcsUUFBUSxDQUFDLFlBQVksQ0FBQztZQUM5QyxPQUFPLFFBQVEsQ0FBQyxZQUFZLENBQUM7UUFDL0IsQ0FBQztRQUNELE9BQU8sUUFBUSxDQUFDO0lBQ2xCLENBQUM7SUFFRDs7Ozs7Ozs7O09BU0c7SUFDZ0IsS0FBSyxDQUFDLGdCQUFnQixDQUFDLE9BQWlCO1FBQ3pELE1BQU0sUUFBUSxHQUFHLE9BQU8sQ0FBQyxRQUFRLENBQUM7UUFFbEMsMkNBQTJDO1FBQzNDLE1BQU0sV0FBVyxHQUFRO1lBQ3ZCLElBQUksRUFBRSxRQUFRLENBQUMsSUFBSTtZQUNuQixJQUFJLEVBQUUsZUFBZSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUM7WUFDM0MsY0FBYyxFQUFFLElBQUksRUFBRyxtQ0FBbUM7WUFDMUQsU0FBUyxFQUFFLE9BQU8sQ0FBQyxFQUFFO1lBQ3JCLFdBQVcsRUFBRSxRQUFRLENBQUMsV0FBVztZQUNqQyxPQUFPLEVBQUUsUUFBUSxDQUFDLE9BQU87WUFDekIsTUFBTSxFQUFFLFFBQVEsQ0FBQyxNQUFNO1lBQ3ZCLE9BQU8sRUFBRSxRQUFRLENBQUMsT0FBTztZQUN6QixRQUFRLEVBQUUsSUFBSSxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUU7WUFDbEMsSUFBSSxFQUFFLFFBQVEsQ0FBQyxJQUFJLElBQUksRUFBRTtZQUN6QixrQkFBa0IsRUFBRSxRQUFRLENBQUMsa0JBQWtCO1lBQy9DLGtCQUFrQixFQUFFLFFBQVEsQ0FBQyxrQkFBa0I7WUFDL0MsY0FBYyxFQUFFLFFBQVEsQ0FBQyxjQUFjO1lBQ3ZDLFdBQVcsRUFBRSxRQUFRLENBQUMsV0FBVztZQUNqQyxlQUFlLEVBQUUsUUFBUSxDQUFDLGVBQWU7U0FDMUMsQ0FBQztRQUVGLHFFQUFxRTtRQUNyRSxJQUFJLE9BQU8sQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUN6QixXQUFXLENBQUMsWUFBWSxHQUFHLE9BQU8sQ0FBQyxZQUFZLENBQUM7UUFDbEQsQ0FBQztRQUVELHVDQUF1QztRQUN2QyxJQUFJLFFBQVEsQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUM1QixXQUFXLENBQUMsY0FBYyxHQUFHLFFBQVEsQ0FBQyxjQUFjLENBQUM7UUFDdkQsQ0FBQztRQUVELHFEQUFxRDtRQUNyRCxJQUFJLFFBQVEsQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUN4QixXQUFXLENBQUMsVUFBVSxHQUFHLFFBQVEsQ0FBQyxVQUFVLENBQUM7UUFDL0MsQ0FBQztRQUVELCtFQUErRTtRQUMvRSxXQUFXLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQ2xELE1BQU0sUUFBUSxHQUFRO2dCQUNwQixZQUFZLEVBQUUsSUFBSSxDQUFDLFlBQVk7Z0JBQy9CLFlBQVksRUFBRSxJQUFJLENBQUMsWUFBWTtnQkFDL0IsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJO2dCQUNmLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUTtnQkFDdkIsVUFBVSxFQUFFLElBQUksQ0FBQyxVQUFVO2FBQzVCLENBQUM7WUFFRixJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztnQkFDbkIsUUFBUSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDO1lBQ3RDLENBQUM7WUFFRCxJQUFJLElBQUksQ0FBQyxZQUFZLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQ3RELFFBQVEsQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQztZQUM1QyxDQUFDO1lBRUQsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7Z0JBQ2pCLFFBQVEsQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQztZQUNsQyxDQUFDO1lBRUQsT0FBTyxRQUFRLENBQUM7UUFDbEIsQ0FBQyxDQUFDLENBQUM7UUFFSCxvREFBb0Q7UUFDcEQsMkVBQTJFO1FBQzNFLE1BQU0sSUFBSSxHQUFHLE9BQU8sQ0FBQyxPQUFPLElBQUksSUFBSSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQy9ELE9BQU8sSUFBSSxDQUFDLG9CQUFvQixDQUFDLGlCQUFpQixDQUFDLFdBQVcsRUFBRSxJQUFJLEVBQUU7WUFDcEUsTUFBTSxFQUFFLFFBQVE7WUFDaEIsTUFBTSxFQUFFLE1BQU0sRUFBRywyREFBMkQ7WUFDNUUsYUFBYSxFQUFFLElBQUksRUFBRyw0Q0FBNEM7WUFDbEUsZ0JBQWdCLEVBQUUsYUFBYTtZQUMvQixRQUFRLEVBQUUsSUFBSTtZQUNkLFNBQVMsRUFBRSxHQUFHO1lBQ2QsV0FBVyxFQUFFLEtBQUssQ0FBRSwrQ0FBK0M7U0FDcEUsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVPLGdCQUFnQixDQUFDLE9BQWlCO1FBQ3hDLE1BQU0sSUFBSSxHQUFHLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDbEQsTUFBTSxXQUFXLEdBQUcsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLFdBQVcsSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNoRSxNQUFNLEtBQUssR0FBYSxFQUFFLENBQUM7UUFDM0IsSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUNULEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1lBQ3hCLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDakIsQ0FBQztRQUNELElBQUksV0FBVyxFQUFFLENBQUM7WUFDaEIsS0FBSyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUMxQixDQUFDO1FBQ0QsT0FBTyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzFCLENBQUM7SUFFRDs7T0FFRztJQUNNLGdCQUFnQjtRQUN2QixPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFRDs7Ozs7Ozs7Ozs7T0FXRztJQUNNLEtBQUssQ0FBQyxhQUFhLENBQzFCLElBQVksRUFDWixTQUF1QyxVQUFVO1FBRWpELElBQUksQ0FBQztZQUNILElBQUksTUFBVyxDQUFDO1lBRWhCLElBQUksTUFBTSxLQUFLLE1BQU0sRUFBRSxDQUFDO2dCQUN0QixNQUFNLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUU7b0JBQ2pELE1BQU0sRUFBRSwrQkFBK0I7aUJBQ3hDLENBQUMsQ0FBQztZQUNMLENBQUM7aUJBQU0sQ0FBQztnQkFDTixpREFBaUQ7Z0JBQ2pELE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLEVBQUU7b0JBQzlELFdBQVcsRUFBRSxLQUFLLEVBQUUsZ0NBQWdDO29CQUNwRCxlQUFlLEVBQUUsSUFBSTtvQkFDckIsTUFBTSxFQUFFLCtCQUErQjtpQkFDeEMsQ0FBQyxDQUFDO2dCQUVILE1BQU0sR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDO2dCQUNyQixzREFBc0Q7WUFDeEQsQ0FBQztZQUVELGlCQUFpQjtZQUNqQixNQUFNLFFBQVEsR0FBRyxNQUFNLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUM7WUFFbEQsa0JBQWtCO1lBQ2xCLE1BQU0sUUFBUSxHQUFHLElBQUksUUFBUSxDQUFDLFFBQVEsRUFBRSxRQUFRLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQztZQUVqRix3QkFBd0I7WUFDeEIsZUFBZSxDQUFDLGdCQUFnQixDQUFDO2dCQUMvQixJQUFJLEVBQUUsd0JBQXdCLENBQUMsUUFBUTtnQkFDdkMsUUFBUSxFQUFFLEtBQUs7Z0JBQ2YsTUFBTSxFQUFFLCtCQUErQjtnQkFDdkMsT0FBTyxFQUFFLHNCQUFzQixRQUFRLENBQUMsSUFBSSxTQUFTLFFBQVEsQ0FBQyxRQUFRLENBQUMsTUFBTSxXQUFXO2FBQ3pGLENBQUMsQ0FBQztZQUVILE9BQU8sUUFBUSxDQUFDO1FBRWxCLENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2YsZUFBZSxDQUFDLGdCQUFnQixDQUFDO2dCQUMvQixJQUFJLEVBQUUsd0JBQXdCLENBQUMsUUFBUTtnQkFDdkMsUUFBUSxFQUFFLFFBQVE7Z0JBQ2xCLE1BQU0sRUFBRSwrQkFBK0I7Z0JBQ3ZDLE9BQU8sRUFBRSw4QkFBOEIsS0FBSyxFQUFFO2FBQy9DLENBQUMsQ0FBQztZQUNILE1BQU0sSUFBSSxLQUFLLENBQUMsOEJBQThCLEtBQUssRUFBRSxDQUFDLENBQUM7UUFDekQsQ0FBQztJQUNILENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDTSxLQUFLLENBQUMsYUFBYSxDQUMxQixPQUFpQixFQUNqQixTQUF1QyxVQUFVO1FBRWpELElBQUksTUFBTSxLQUFLLE1BQU0sRUFBRSxDQUFDO1lBQ3RCLE9BQU8sT0FBTyxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQ25DLENBQUM7UUFFRCxxRUFBcUU7UUFDckUsT0FBTyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDeEMsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsS0FBSyxDQUFDLE1BQU0sQ0FBQyxRQUFpRjtRQUM1RixpREFBaUQ7UUFDakQseUZBQXlGO1FBQ3pGLHVFQUF1RTtRQUN2RSxNQUFNLGdCQUFnQixHQUFHLE1BQU0sSUFBSSxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUM7WUFDM0QsSUFBSSxFQUFFLFFBQVEsQ0FBQyxJQUFJO1lBQ25CLFdBQVcsRUFBRSxRQUFRLENBQUMsV0FBVztZQUNqQyxRQUFRLEVBQUUsUUFBUSxDQUFDLFFBQVEsSUFBSSxFQUFFO1lBQ2pDLFdBQVcsRUFBRSxRQUFRLENBQUMsV0FBVztZQUNqQyxlQUFlLEVBQUUsUUFBUSxDQUFDLGVBQWU7U0FDMUMsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQzlCLE1BQU0sSUFBSSxLQUFLLENBQUMsc0JBQXNCLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQzlFLENBQUM7UUFFRCxzQkFBc0I7UUFDdEIsSUFBSSxnQkFBZ0IsQ0FBQyxRQUFRLElBQUksZ0JBQWdCLENBQUMsUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUN0RSxNQUFNLENBQUMsSUFBSSxDQUFDLCtCQUErQixnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNyRixDQUFDO1FBRUQseUJBQXlCO1FBQ3pCLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDbkIsTUFBTSxJQUFJLEtBQUssQ0FBQywyQkFBMkIsQ0FBQyxDQUFDO1FBQy9DLENBQUM7UUFFRCxJQUFJLFdBQVcsR0FBRyxRQUFRLENBQUMsUUFBUSxJQUFJLEVBQUUsQ0FBQztRQUUxQyw2RUFBNkU7UUFDN0UsNEVBQTRFO1FBQzVFLE1BQU0sZ0JBQWdCLEdBQXNCLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFTLEVBQUUsS0FBYSxFQUFFLEVBQUU7WUFDdkYsNkRBQTZEO1lBQzdELE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxZQUFZLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQztZQUNuRCxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7Z0JBQ2pCLE1BQU0sSUFBSSxLQUFLLENBQUMsb0JBQW9CLEtBQUssK0RBQStELENBQUMsQ0FBQztZQUM1RyxDQUFDO1lBQ0QsdURBQXVEO1lBQ3ZELElBQUksSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztnQkFDcEMsTUFBTSxDQUFDLElBQUksQ0FBQyw2QkFBNkIsS0FBSyw0REFBNEQsQ0FBQyxDQUFDO1lBQzlHLENBQUM7WUFFRCw2REFBNkQ7WUFDN0Qsd0VBQXdFO1lBQ3hFLDRDQUE0QztZQUM1QyxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsWUFBWSxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUM7WUFDbkQsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO2dCQUNqQixNQUFNLElBQUksS0FBSyxDQUNiLFlBQVksV0FBVyxjQUFjLEtBQUssd0JBQXdCO29CQUNsRSxnRkFBZ0YsQ0FDakYsQ0FBQztZQUNKLENBQUM7WUFDRCx1REFBdUQ7WUFDdkQsSUFBSSxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO2dCQUNwQyxNQUFNLENBQUMsSUFBSSxDQUFDLDZCQUE2QixLQUFLLDREQUE0RCxDQUFDLENBQUM7WUFDOUcsQ0FBQztZQUVELE9BQU87Z0JBQ0wsWUFBWSxFQUFFLFdBQVc7Z0JBQ3pCLFlBQVksRUFBRSxXQUFXO2dCQUN6QixJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksSUFBSSxpQkFBaUIsQ0FBQyxZQUFZO2dCQUNqRCxRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVEsSUFBSSxpQkFBaUIsQ0FBQyxRQUFRO2dCQUNyRCxVQUFVLEVBQUUsSUFBSSxDQUFDLFVBQVUsSUFBSSxRQUFRO2dCQUN2QyxTQUFTLEVBQUUsSUFBSSxDQUFDLFNBQVM7Z0JBQ3pCLFlBQVksRUFBRSxJQUFJLENBQUMsWUFBWTtnQkFDL0IsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPO2FBQ0gsQ0FBQztRQUN2QixDQUFDLENBQUMsQ0FBQztRQUVILG1DQUFtQztRQUNuQyxNQUFNLFlBQVksR0FBcUI7WUFDckMsSUFBSSxFQUFFLFFBQVEsQ0FBQyxJQUFJO1lBQ25CLFdBQVcsRUFBRSxRQUFRLENBQUMsV0FBVyxJQUFJLEVBQUU7WUFDdkMsT0FBTyxFQUFFLFFBQVEsQ0FBQyxPQUFPLElBQUksT0FBTztZQUNwQyxNQUFNLEVBQUUsUUFBUSxDQUFDLE1BQU07WUFDdkIsT0FBTyxFQUFFLFFBQVEsQ0FBQyxPQUFPLElBQUksSUFBSSxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUU7WUFDckQsUUFBUSxFQUFFLFFBQVEsQ0FBQyxRQUFRLElBQUksSUFBSSxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUU7WUFDdkQsSUFBSSxFQUFFLFFBQVEsQ0FBQyxJQUFJLElBQUksRUFBRTtZQUN6QixrQkFBa0IsRUFBRSxRQUFRLENBQUMsa0JBQWtCLElBQUssUUFBZ0IsQ0FBQyxtQkFBbUIsSUFBSSxpQkFBaUIsQ0FBQyxtQkFBbUI7WUFDakksa0JBQWtCLEVBQUUsUUFBUSxDQUFDLGtCQUFrQixJQUFLLFFBQWdCLENBQUMsbUJBQW1CLElBQUksaUJBQWlCLENBQUMsbUJBQW1CO1lBQ2pJLGNBQWMsRUFBRSxRQUFRLENBQUMsY0FBYyxJQUFJLGlCQUFpQixDQUFDLGVBQWU7WUFDNUUsY0FBYyxFQUFFLFFBQVEsQ0FBQyxjQUFjO1lBQ3ZDLFdBQVcsRUFBRSxRQUFRLENBQUMsV0FBVyxJQUFJLGlCQUFpQixDQUFDLFlBQVk7WUFDbkUsZUFBZSxFQUFFLFFBQVEsQ0FBQyxlQUFlLElBQUksaUJBQWlCLENBQUMsaUJBQWlCO1lBQ2hGLFFBQVEsRUFBRSxnQkFBZ0I7WUFDMUIsZ0ZBQWdGO1lBQ2hGLFVBQVUsRUFBRSx3QkFBd0IsQ0FBRSxRQUFnQixDQUFDLFVBQVUsRUFBRSxRQUFRLENBQUMsSUFBSyxFQUFFLFVBQVUsRUFBRSxRQUE4QyxDQUFDO1NBQy9JLENBQUM7UUFFRiwyRUFBMkU7UUFDM0UsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUU1RCxpRUFBaUU7UUFDakUsTUFBTSxpQkFBaUIsR0FBRyxNQUFNLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUM1QyxNQUFNLFNBQVMsR0FBRyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FDM0MsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLEtBQUssWUFBWSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FDbEUsQ0FBQztRQUNGLElBQUksU0FBUyxFQUFFLENBQUM7WUFDZCxNQUFNLElBQUksS0FBSyxDQUFDLHNCQUFzQixZQUFZLENBQUMsSUFBSSxrQkFBa0IsQ0FBQyxDQUFDO1FBQzdFLENBQUM7UUFFRCxrQkFBa0I7UUFDbEIsTUFBTSxRQUFRLEdBQUcsSUFBSSxRQUFRLENBQUMsWUFBWSxFQUFFLFlBQVksQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBRXpGLDBFQUEwRTtRQUMxRSxJQUFJLFFBQVEsQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUMxQixRQUFRLENBQUMsWUFBWSxHQUFHLFFBQVEsQ0FBQyxZQUFZLENBQUM7UUFDaEQsQ0FBQztRQUNELElBQUksUUFBUSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ3JCLFFBQVEsQ0FBQyxPQUFPLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQztRQUN0QyxDQUFDO1FBRUQsZUFBZTtRQUNmLE1BQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDcEMsZ0VBQWdFO1FBQ2hFLDJFQUEyRTtRQUUzRSxlQUFlO1FBQ2YsZUFBZSxDQUFDLGdCQUFnQixDQUFDO1lBQy9CLElBQUksRUFBRSx3QkFBd0IsQ0FBQyxLQUFLO1lBQ3BDLFFBQVEsRUFBRSxLQUFLO1lBQ2YsTUFBTSxFQUFFLHdCQUF3QjtZQUNoQyxPQUFPLEVBQUUscUJBQXFCLFlBQVksQ0FBQyxJQUFJLEVBQUU7U0FDbEQsQ0FBQyxDQUFDO1FBRUgsT0FBTyxRQUFRLENBQUM7SUFDbEIsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNNLFFBQVEsQ0FBQyxPQUFpQjtRQUNqQyxPQUFPLE9BQU8sQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUM1QixDQUFDO0lBRUQ7O09BRUc7SUFDTSxLQUFLLENBQUMsSUFBSSxDQUFDLE9BQWlCLEVBQUUsUUFBZ0I7UUFDckQsa0NBQWtDO1FBQ2xDLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNoRCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDNUIsTUFBTSxNQUFNLEdBQUcsZ0JBQWdCLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksMEJBQTBCLENBQUM7WUFDckcsTUFBTSxJQUFJLEtBQUssQ0FBQyxpQ0FBaUMsTUFBTSxFQUFFLENBQUMsQ0FBQztRQUM3RCxDQUFDO1FBRUQsMkJBQTJCO1FBQzNCLE1BQU0sS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDdEMsQ0FBQztJQUVEOztPQUVHO0lBQ00sS0FBSyxDQUFDLE1BQU0sQ0FBQyxRQUFnQjtRQUNwQyxlQUFlLENBQUMsZ0JBQWdCLENBQUM7WUFDL0IsSUFBSSxFQUFFLHdCQUF3QixDQUFDLE9BQU87WUFDdEMsUUFBUSxFQUFFLFFBQVE7WUFDbEIsTUFBTSxFQUFFLHdCQUF3QjtZQUNoQyxPQUFPLEVBQUUsc0JBQXNCLFFBQVEsRUFBRTtTQUMxQyxDQUFDLENBQUM7UUFFSCxNQUFNLEtBQUssQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7UUFFN0IsZUFBZSxDQUFDLGdCQUFnQixDQUFDO1lBQy9CLElBQUksRUFBRSx3QkFBd0IsQ0FBQyxPQUFPO1lBQ3RDLFFBQVEsRUFBRSxLQUFLO1lBQ2YsTUFBTSxFQUFFLHdCQUF3QjtZQUNoQyxPQUFPLEVBQUUsa0NBQWtDLFFBQVEsRUFBRTtTQUN0RCxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7O09BRUc7SUFDTSxLQUFLLENBQUMsSUFBSTtRQUNqQixNQUFNLFNBQVMsR0FBRyxNQUFNLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUVyQyxrRUFBa0U7UUFDbEUsS0FBSyxNQUFNLFFBQVEsSUFBSSxTQUFTLEVBQUUsQ0FBQztZQUNqQyxJQUFJLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO2dCQUN6RCwwQ0FBMEM7Z0JBQzFDLE1BQU0sUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQzVCLENBQUM7UUFDSCxDQUFDO1FBRUQsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztJQUVEOzs7Ozs7Ozs7T0FTRztJQUNILEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxVQUFrQjtRQUN2QyxnRkFBZ0Y7UUFDaEYsZ0ZBQWdGO1FBQ2hGLGdFQUFnRTtRQUNoRSxNQUFNLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUUxQixzREFBc0Q7UUFDdEQsTUFBTSxRQUFRLEdBQUcsTUFBTSxJQUFJLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBRW5ELElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNkLE9BQU87Z0JBQ0wsT0FBTyxFQUFFLEtBQUs7Z0JBQ2QseURBQXlEO2dCQUN6RCxPQUFPLEVBQUUsZUFBZSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsUUFBUSxFQUFFLFVBQVUsQ0FBQzthQUNwRSxDQUFDO1FBQ0osQ0FBQztRQUVELDREQUE0RDtRQUM1RCxJQUFJLENBQUMsd0JBQXdCLEVBQUUsQ0FBQztRQUVoQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFckQsZ0NBQWdDO1FBQ2hDLE1BQU0sUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBRTFCLGVBQWUsQ0FBQyxnQkFBZ0IsQ0FBQztZQUMvQixJQUFJLEVBQUUsaUJBQWlCO1lBQ3ZCLFFBQVEsRUFBRSxLQUFLO1lBQ2YsTUFBTSxFQUFFLGtDQUFrQztZQUMxQyxPQUFPLEVBQUUsdUJBQXVCLFFBQVEsQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFO1NBQ3pELENBQUMsQ0FBQztRQUVILE9BQU87WUFDTCxPQUFPLEVBQUUsSUFBSTtZQUNiLDJEQUEyRDtZQUMzRCxPQUFPLEVBQUUsZUFBZSxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsUUFBUSxFQUFFLFFBQVEsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDO1lBQ2hGLFFBQVE7U0FDVCxDQUFDO0lBQ0osQ0FBQztJQUVEOzs7Ozs7OztPQVFHO0lBQ0gsS0FBSyxDQUFDLGtCQUFrQixDQUFDLFVBQWtCO1FBQ3pDLCtFQUErRTtRQUMvRSw4RUFBOEU7UUFDOUUsZ0ZBQWdGO1FBQ2hGLDRFQUE0RTtRQUM1RSw0RUFBNEU7UUFDNUUsdURBQXVEO1FBRXZELHNEQUFzRDtRQUN0RCxNQUFNLFFBQVEsR0FBRyxNQUFNLElBQUksQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLENBQUM7UUFFbkQsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ2QsT0FBTztnQkFDTCxPQUFPLEVBQUUsS0FBSztnQkFDZCx5REFBeUQ7Z0JBQ3pELE9BQU8sRUFBRSxlQUFlLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxRQUFRLEVBQUUsVUFBVSxDQUFDO2FBQ3BFLENBQUM7UUFDSixDQUFDO1FBRUQsSUFBSSxDQUFDLG1CQUFtQixDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRXhELGtDQUFrQztRQUNsQyxNQUFNLFFBQVEsQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUU1QixlQUFlLENBQUMsZ0JBQWdCLENBQUM7WUFDL0IsSUFBSSxFQUFFLGlCQUFpQjtZQUN2QixRQUFRLEVBQUUsS0FBSztZQUNmLE1BQU0sRUFBRSxvQ0FBb0M7WUFDNUMsT0FBTyxFQUFFLHlCQUF5QixRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRTtTQUMzRCxDQUFDLENBQUM7UUFFSCxPQUFPO1lBQ0wsT0FBTyxFQUFFLElBQUk7WUFDYiwyREFBMkQ7WUFDM0QsT0FBTyxFQUFFLGVBQWUsQ0FBQyxXQUFXLENBQUMsV0FBVyxDQUFDLFFBQVEsRUFBRSxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQztZQUNsRixRQUFRO1NBQ1QsQ0FBQztJQUNKLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsS0FBSyxDQUFDLGtCQUFrQjtRQUN0QixNQUFNLE9BQU8sR0FBZSxFQUFFLENBQUM7UUFDL0IsS0FBSyxNQUFNLElBQUksSUFBSSxJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztZQUM1QyxNQUFNLFFBQVEsR0FBRyxNQUFNLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDN0MsSUFBSSxRQUFRO2dCQUFFLE9BQU8sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDdkMsQ0FBQztRQUNELE9BQU8sT0FBTyxDQUFDO0lBQ2pCLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ssd0JBQXdCO1FBQzlCLE1BQU0sRUFBRSxHQUFHLEVBQUUsZ0JBQWdCLEVBQUUsR0FBRywyQkFBMkIsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUUzRSxxQ0FBcUM7UUFDckMsSUFBSSxJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxHQUFHLGdCQUFnQixFQUFFLENBQUM7WUFDckQsT0FBTztRQUNULENBQUM7UUFFRCx3Q0FBd0M7UUFDeEMsSUFBSSxJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxJQUFJLEdBQUcsRUFBRSxDQUFDO1lBQ3pDLE1BQU0sQ0FBQyxJQUFJLENBQ1QsbUNBQW1DLEdBQUcsS0FBSztnQkFDM0MscUdBQXFHLENBQ3RHLENBQUM7WUFFRixlQUFlLENBQUMsZ0JBQWdCLENBQUM7Z0JBQy9CLElBQUksRUFBRSxpQkFBaUI7Z0JBQ3ZCLFFBQVEsRUFBRSxRQUFRO2dCQUNsQixNQUFNLEVBQUUsMENBQTBDO2dCQUNsRCxPQUFPLEVBQUUsbUNBQW1DLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLElBQUksR0FBRyxFQUFFO2FBQ25GLENBQUMsQ0FBQztRQUNMLENBQUM7UUFFRCwwREFBMEQ7UUFDMUQsS0FBSyxJQUFJLENBQUMsMkJBQTJCLEVBQUUsQ0FBQztJQUMxQyxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNLLEtBQUssQ0FBQywyQkFBMkI7UUFDdkMsSUFBSSxDQUFDO1lBQ0gsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQztZQUNoRCxNQUFNLFNBQVMsR0FBRyxNQUFNLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNwQyxNQUFNLHFCQUFxQixHQUFHLElBQUksR0FBRyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7WUFFM0UsTUFBTSxVQUFVLEdBQWEsRUFBRSxDQUFDO1lBQ2hDLEtBQUssTUFBTSxVQUFVLElBQUksSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7Z0JBQ2xELElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQztvQkFDM0MsSUFBSSxDQUFDLG1CQUFtQixDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQztvQkFDNUMsVUFBVSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztnQkFDOUIsQ0FBQztZQUNILENBQUM7WUFFRCxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDO1lBQzlDLE1BQU0sT0FBTyxHQUFHLFNBQVMsR0FBRyxPQUFPLENBQUM7WUFFcEMsSUFBSSxPQUFPLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQ2hCLE1BQU0sQ0FBQyxJQUFJLENBQ1QsY0FBYyxPQUFPLHVDQUF1QztvQkFDNUQscUJBQXFCLE9BQU8sSUFBSSxpQkFBaUIsQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUNqRSxDQUFDO2dCQUVGLGVBQWUsQ0FBQyxnQkFBZ0IsQ0FBQztvQkFDL0IsSUFBSSxFQUFFLGlCQUFpQjtvQkFDdkIsUUFBUSxFQUFFLEtBQUs7b0JBQ2YsTUFBTSxFQUFFLDZDQUE2QztvQkFDckQsT0FBTyxFQUFFLFdBQVcsT0FBTyxtQ0FBbUM7b0JBQzlELGNBQWMsRUFBRTt3QkFDZCxZQUFZLEVBQUUsT0FBTzt3QkFDckIsV0FBVyxFQUFFLE9BQU87d0JBQ3BCLFVBQVUsRUFBRSxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQztxQkFDbEM7aUJBQ0YsQ0FBQyxDQUFDO1lBQ0wsQ0FBQztRQUNILENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2YsTUFBTSxDQUFDLEtBQUssQ0FBQywyQ0FBMkMsRUFBRSxLQUFLLENBQUMsQ0FBQztZQUVqRSxlQUFlLENBQUMsZ0JBQWdCLENBQUM7Z0JBQy9CLElBQUksRUFBRSxpQkFBaUI7Z0JBQ3ZCLFFBQVEsRUFBRSxLQUFLO2dCQUNmLE1BQU0sRUFBRSw2Q0FBNkM7Z0JBQ3JELE9BQU8sRUFBRSxtQkFBbUIsS0FBSyxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFO2FBQ3JGLENBQUMsQ0FBQztRQUNMLENBQUM7SUFDSCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEVuc2VtYmxlTWFuYWdlciAtIEltcGxlbWVudGF0aW9uIG9mIElFbGVtZW50TWFuYWdlciBmb3IgRW5zZW1ibGUgZWxlbWVudHNcbiAqXG4gKiBIYW5kbGVzIENSVUQgb3BlcmF0aW9ucyBhbmQgbGlmZWN5Y2xlIG1hbmFnZW1lbnQgZm9yIGVuc2VtYmxlcyBpbXBsZW1lbnRpbmcgSUVsZW1lbnRcbiAqXG4gKiBBUkNISVRFQ1RVUkU6XG4gKiAtIEV4dGVuZHMgQmFzZUVsZW1lbnRNYW5hZ2VyIGZvciB1bmlmaWVkIGVsZW1lbnQgbWFuYWdlbWVudFxuICogLSBGb2xsb3dzIHRlbXBsYXRlIG1ldGhvZCBwYXR0ZXJuIChwYXJzZU1ldGFkYXRhLCBjcmVhdGVFbGVtZW50IGhvb2tzKVxuICogLSBQdXJlIG1hbmFnZXIgbGF5ZXIgLSBkZWxlZ2F0ZXMgYnVzaW5lc3MgbG9naWMgdG8gRW5zZW1ibGUgY2xhc3NcbiAqIC0gVXNlcyBESSBmb3IgZGVwZW5kZW5jaWVzIChQb3J0Zm9saW9NYW5hZ2VyLCBGaWxlTG9ja01hbmFnZXIpXG4gKlxuICogU0VDVVJJVFk6XG4gKiAtIFVzZXMgRmlsZUxvY2tNYW5hZ2VyIGZvciBhdG9taWMgZmlsZSBvcGVyYXRpb25zXG4gKiAtIFBhdGggdmFsaWRhdGlvbiBwcmV2ZW50cyBkaXJlY3RvcnkgdHJhdmVyc2FsIGF0dGFja3NcbiAqIC0gSW5wdXQgc2FuaXRpemF0aW9uIGZvciBhbGwgdXNlciBkYXRhXG4gKiAtIFNlY3VyaXR5IGV2ZW50IGxvZ2dpbmcgZm9yIGF1ZGl0IHRyYWlsc1xuICogLSBTZWN1cmVZYW1sUGFyc2VyIGZvciBzYWZlIFlBTUwgcGFyc2luZ1xuICovXG5cbmltcG9ydCB7IEVuc2VtYmxlLCBFbnNlbWJsZU1ldGFkYXRhLCBFbnNlbWJsZUVsZW1lbnQgfSBmcm9tICcuL0Vuc2VtYmxlLmpzJztcbmltcG9ydCB7IEVsZW1lbnRWYWxpZGF0aW9uUmVzdWx0IH0gZnJvbSAnLi4vLi4vdHlwZXMvZWxlbWVudHMvSUVsZW1lbnQuanMnO1xuaW1wb3J0IHsgRWxlbWVudFR5cGUgfSBmcm9tICcuLi8uLi9wb3J0Zm9saW8vdHlwZXMuanMnO1xuaW1wb3J0IHsgdG9TaW5ndWxhckxhYmVsIH0gZnJvbSAnLi4vLi4vdXRpbHMvZWxlbWVudFR5cGVOb3JtYWxpemF0aW9uLmpzJztcbmltcG9ydCB7IEJhc2VFbGVtZW50TWFuYWdlciB9IGZyb20gJy4uL2Jhc2UvQmFzZUVsZW1lbnRNYW5hZ2VyLmpzJztcbmltcG9ydCB7IEZpbGVMb2NrTWFuYWdlciB9IGZyb20gJy4uLy4uL3NlY3VyaXR5L2ZpbGVMb2NrTWFuYWdlci5qcyc7XG5pbXBvcnQgeyBTZWN1cml0eU1vbml0b3IgfSBmcm9tICcuLi8uLi9zZWN1cml0eS9zZWN1cml0eU1vbml0b3IuanMnO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vLi4vdXRpbHMvbG9nZ2VyLmpzJztcbmltcG9ydCB7XG4gIEVOU0VNQkxFX0RFRkFVTFRTLFxuICBFTlNFTUJMRV9MSU1JVFMsXG4gIEVOU0VNQkxFX1NFQ1VSSVRZX0VWRU5UUyxcbiAgRU5TRU1CTEVfRVJST1JTLFxuICBBQ1RJVkFUSU9OX1NUUkFURUdJRVMsXG4gIENPTkZMSUNUX1NUUkFURUdJRVMsXG4gIEVMRU1FTlRfUk9MRVMsXG4gIEFDVElWQVRJT05fTU9ERVNcbn0gZnJvbSAnLi9jb25zdGFudHMuanMnO1xuaW1wb3J0IHR5cGUgeyBBY3RpdmF0aW9uU3RyYXRlZ3ksIENvbmZsaWN0UmVzb2x1dGlvblN0cmF0ZWd5LCBFbGVtZW50Um9sZSwgQWN0aXZhdGlvbk1vZGUgfSBmcm9tICcuL3R5cGVzLmpzJztcbmltcG9ydCB7IFBvcnRmb2xpb01hbmFnZXIgfSBmcm9tICcuLi8uLi9wb3J0Zm9saW8vUG9ydGZvbGlvTWFuYWdlci5qcyc7XG5pbXBvcnQgeyBWYWxpZGF0aW9uUmVnaXN0cnkgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy92YWxpZGF0aW9uL1ZhbGlkYXRpb25SZWdpc3RyeS5qcyc7XG5pbXBvcnQgeyBWYWxpZGF0aW9uU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3ZhbGlkYXRpb24vVmFsaWRhdGlvblNlcnZpY2UuanMnO1xuaW1wb3J0IHsgU2VyaWFsaXphdGlvblNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9TZXJpYWxpemF0aW9uU2VydmljZS5qcyc7XG5pbXBvcnQgeyBNZXRhZGF0YVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9NZXRhZGF0YVNlcnZpY2UuanMnO1xuaW1wb3J0IHsgRmlsZU9wZXJhdGlvbnNTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvRmlsZU9wZXJhdGlvbnNTZXJ2aWNlLmpzJztcbmltcG9ydCB7IEZpbGVXYXRjaFNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9GaWxlV2F0Y2hTZXJ2aWNlLmpzJztcbmltcG9ydCB7IEVsZW1lbnRNZXNzYWdlcyB9IGZyb20gJy4uLy4uL3V0aWxzL2VsZW1lbnRNZXNzYWdlcy5qcyc7XG5pbXBvcnQgeyBWQUxJREFUSU9OX1BBVFRFUk5TLCBTRUNVUklUWV9MSU1JVFMgfSBmcm9tICcuLi8uLi9zZWN1cml0eS9jb25zdGFudHMuanMnO1xuaW1wb3J0IHsgc2FuaXRpemVHYXRla2VlcGVyUG9saWN5IH0gZnJvbSAnLi4vLi4vaGFuZGxlcnMvbWNwLWFxbC9wb2xpY2llcy9FbGVtZW50UG9saWNpZXMuanMnO1xuXG4vLyBJc3N1ZSAjODM6IENlbnRyYWxpemVkIGFjdGl2ZSBlbGVtZW50IGxpbWl0cyAoY29uZmlndXJhYmxlIHZpYSBlbnYgdmFycylcbmltcG9ydCB7IGdldEFjdGl2ZUVsZW1lbnRMaW1pdENvbmZpZywgZ2V0TWF4QWN0aXZlTGltaXQgfSBmcm9tICcuLi8uLi9jb25maWcvYWN0aXZlLWVsZW1lbnQtbGltaXRzLmpzJztcblxuLy8gSXNzdWUgIzQ2NjogU2hhcmVkIGVsZW1lbnQgdHlwZSByZXNvbHZlciDigJQgcmUtZXhwb3J0ZWQgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHlcbmltcG9ydCB7IHJlc29sdmVFbGVtZW50VHlwZXMgfSBmcm9tICcuLi8uLi91dGlscy9lbGVtZW50VHlwZVJlc29sdmVyLmpzJztcbmV4cG9ydCB7IHJlc29sdmVFbGVtZW50VHlwZXMsIHR5cGUgRWxlbWVudE1hbmFnZXJzRm9yUmVzb2x1dGlvbiB9IGZyb20gJy4uLy4uL3V0aWxzL2VsZW1lbnRUeXBlUmVzb2x2ZXIuanMnO1xuXG4vKiogQGRlcHJlY2F0ZWQgVXNlIHJlc29sdmVFbGVtZW50VHlwZXMgZnJvbSAnLi4vLi4vdXRpbHMvZWxlbWVudFR5cGVSZXNvbHZlci5qcycgKi9cbmV4cG9ydCBjb25zdCByZXNvbHZlRW5zZW1ibGVFbGVtZW50VHlwZXMgPSByZXNvbHZlRWxlbWVudFR5cGVzO1xuXG4vKipcbiAqIEVuc2VtYmxlTWFuYWdlciAtIE1hbmFnZXMgZW5zZW1ibGUgZWxlbWVudCBsaWZlY3ljbGVcbiAqXG4gKiBFeHRlbmRzIEJhc2VFbGVtZW50TWFuYWdlciB0byBwcm92aWRlIGVuc2VtYmxlLXNwZWNpZmljIG9wZXJhdGlvbnM6XG4gKiAtIFlBTUwgcGFyc2luZyB3aXRoIGJvdGggc25ha2VfY2FzZSBhbmQgY2FtZWxDYXNlIHN1cHBvcnRcbiAqIC0gRW5zZW1ibGUgY3JlYXRpb24gYW5kIHZhbGlkYXRpb25cbiAqIC0gRWxlbWVudCByZWZlcmVuY2UgbWFuYWdlbWVudFxuICogLSBJbXBvcnQvZXhwb3J0IGluIG11bHRpcGxlIGZvcm1hdHNcbiAqL1xuZXhwb3J0IGNsYXNzIEVuc2VtYmxlTWFuYWdlciBleHRlbmRzIEJhc2VFbGVtZW50TWFuYWdlcjxFbnNlbWJsZT4ge1xuICBwcml2YXRlIHJlYWRvbmx5IGVuc2VtYmxlc0Rpcjogc3RyaW5nO1xuICBwcml2YXRlIHZhbGlkYXRpb25TZXJ2aWNlOiBWYWxpZGF0aW9uU2VydmljZTtcbiAgcHJpdmF0ZSBzZXJpYWxpemF0aW9uU2VydmljZTogU2VyaWFsaXphdGlvblNlcnZpY2U7XG4gIHByaXZhdGUgYWN0aXZlRW5zZW1ibGVOYW1lczogU2V0PHN0cmluZz4gPSBuZXcgU2V0KCk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcG9ydGZvbGlvTWFuYWdlcjogUG9ydGZvbGlvTWFuYWdlcixcbiAgICBmaWxlTG9ja01hbmFnZXI6IEZpbGVMb2NrTWFuYWdlcixcbiAgICBmaWxlT3BlcmF0aW9uc1NlcnZpY2U6IEZpbGVPcGVyYXRpb25zU2VydmljZSxcbiAgICB2YWxpZGF0aW9uUmVnaXN0cnk6IFZhbGlkYXRpb25SZWdpc3RyeSxcbiAgICBzZXJpYWxpemF0aW9uU2VydmljZTogU2VyaWFsaXphdGlvblNlcnZpY2UsXG4gICAgcHJpdmF0ZSBtZXRhZGF0YVNlcnZpY2U6IE1ldGFkYXRhU2VydmljZSxcbiAgICBmaWxlV2F0Y2hTZXJ2aWNlPzogRmlsZVdhdGNoU2VydmljZSxcbiAgICBtZW1vcnlCdWRnZXQ/OiBpbXBvcnQoJy4uLy4uL2NhY2hlL0NhY2hlTWVtb3J5QnVkZ2V0LmpzJykuQ2FjaGVNZW1vcnlCdWRnZXQsXG4gICAgYmFja3VwU2VydmljZT86IGltcG9ydCgnLi4vLi4vc2VydmljZXMvQmFja3VwU2VydmljZS5qcycpLkJhY2t1cFNlcnZpY2VcbiAgKSB7XG4gICAgc3VwZXIoRWxlbWVudFR5cGUuRU5TRU1CTEUsIHBvcnRmb2xpb01hbmFnZXIsIGZpbGVMb2NrTWFuYWdlciwgeyBmaWxlV2F0Y2hTZXJ2aWNlLCBtZW1vcnlCdWRnZXQsIGJhY2t1cFNlcnZpY2UgfSwgZmlsZU9wZXJhdGlvbnNTZXJ2aWNlLCB2YWxpZGF0aW9uUmVnaXN0cnkpO1xuICAgIHRoaXMuZW5zZW1ibGVzRGlyID0gdGhpcy5lbGVtZW50RGlyO1xuICAgIHRoaXMudmFsaWRhdGlvblNlcnZpY2UgPSB2YWxpZGF0aW9uUmVnaXN0cnkuZ2V0VmFsaWRhdGlvblNlcnZpY2UoKTtcbiAgICB0aGlzLnNlcmlhbGl6YXRpb25TZXJ2aWNlID0gc2VyaWFsaXphdGlvblNlcnZpY2U7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgZ2V0RWxlbWVudExhYmVsKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuICdlbnNlbWJsZSc7XG4gIH1cblxuICAvKipcbiAgICogUGFyc2UgbWV0YWRhdGEgZnJvbSBZQU1MIGZyb250bWF0dGVyXG4gICAqXG4gICAqIE5BTUlORyBDT05WRU5USU9OIFNVUFBPUlQ6XG4gICAqIC0gVHlwZVNjcmlwdCBpbnRlcmZhY2VzIHVzZSBjYW1lbENhc2UgKGFjdGl2YXRpb25TdHJhdGVneSwgY29uZmxpY3RSZXNvbHV0aW9uKVxuICAgKiAtIFlBTUwgZmlsZXMgY2FuIHVzZSBzbmFrZV9jYXNlIChhY3RpdmF0aW9uX3N0cmF0ZWd5LCBjb25mbGljdF9yZXNvbHV0aW9uKVxuICAgKiAtIFRoaXMgbWV0aG9kIG1hcHMgc25ha2VfY2FzZSDihpIgY2FtZWxDYXNlIGZvciB1c2VyIGNvbnZlbmllbmNlXG4gICAqXG4gICAqIEBwYXJhbSBkYXRhIC0gUmF3IFlBTUwgZGF0YSBmcm9tIGZyb250bWF0dGVyXG4gICAqIEByZXR1cm5zIFZhbGlkYXRlZCBFbnNlbWJsZU1ldGFkYXRhXG4gICAqL1xuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgYXN5bmMgcGFyc2VNZXRhZGF0YShkYXRhOiBhbnkpOiBQcm9taXNlPEVuc2VtYmxlTWV0YWRhdGE+IHtcbiAgICAvLyBSRUZBQ1RPUkVEOiBVc2UgdmFsaWRhdGVNZXRhZGF0YUZpZWxkIGZvciBmaWVsZC1hd2FyZSBlcnJvciBtZXNzYWdlcyAoIzM2NSlcbiAgICBjb25zdCBuYW1lUmVzdWx0ID0gdGhpcy52YWxpZGF0aW9uU2VydmljZS52YWxpZGF0ZU1ldGFkYXRhRmllbGQoJ25hbWUnLCBkYXRhLm5hbWUsIHtcbiAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgbWF4TGVuZ3RoOiBTRUNVUklUWV9MSU1JVFMuTUFYX05BTUVfTEVOR1RIXG4gICAgfSk7XG4gICAgaWYgKCFuYW1lUmVzdWx0LmlzVmFsaWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVmFsaWRhdGlvbiBmYWlsZWQ6ICR7bmFtZVJlc3VsdC5lcnJvcnM/LmpvaW4oJywgJyl9YCk7XG4gICAgfVxuICAgIGNvbnN0IG5hbWUgPSBuYW1lUmVzdWx0LnNhbml0aXplZFZhbHVlO1xuXG4gICAgaWYgKCFuYW1lKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Vuc2VtYmxlIG1ldGFkYXRhIG11c3QgaW5jbHVkZSBhIG5hbWUnKTtcbiAgICB9XG5cbiAgICAvLyBSRUZBQ1RPUkVEOiBVc2UgdmFsaWRhdGVNZXRhZGF0YUZpZWxkIGZvciBmaWVsZC1hd2FyZSBlcnJvciBtZXNzYWdlcyAoIzM2NSlcbiAgICBsZXQgZGVzY3JpcHRpb246IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICBpZiAoZGF0YS5kZXNjcmlwdGlvbikge1xuICAgICAgY29uc3QgZGVzY1Jlc3VsdCA9IHRoaXMudmFsaWRhdGlvblNlcnZpY2UudmFsaWRhdGVNZXRhZGF0YUZpZWxkKCdkZXNjcmlwdGlvbicsIGRhdGEuZGVzY3JpcHRpb24sIHtcbiAgICAgICAgcmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgICBtYXhMZW5ndGg6IFNFQ1VSSVRZX0xJTUlUUy5NQVhfREVTQ1JJUFRJT05fTEVOR1RILFxuICAgICAgICBwYXR0ZXJuOiBWQUxJREFUSU9OX1BBVFRFUk5TLlNBRkVfREVTQ1JJUFRJT05cbiAgICAgIH0pO1xuICAgICAgaWYgKCFkZXNjUmVzdWx0LmlzVmFsaWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBWYWxpZGF0aW9uIGZhaWxlZDogJHtkZXNjUmVzdWx0LmVycm9ycz8uam9pbignLCAnKX1gKTtcbiAgICAgIH1cbiAgICAgIGRlc2NyaXB0aW9uID0gZGVzY1Jlc3VsdC5zYW5pdGl6ZWRWYWx1ZTtcbiAgICB9XG5cbiAgICAvLyBSRUZBQ1RPUkVEOiBVc2UgVmFsaWRhdGlvblNlcnZpY2UgZm9yIGFjdGl2YXRpb24gc3RyYXRlZ3kgKHN1cHBvcnQgYm90aCBzbmFrZV9jYXNlIGFuZCBjYW1lbENhc2UpXG4gICAgY29uc3QgYWN0aXZhdGlvblN0cmF0ZWd5UmF3ID0gZGF0YS5hY3RpdmF0aW9uX3N0cmF0ZWd5IHx8IGRhdGEuYWN0aXZhdGlvblN0cmF0ZWd5IHx8IEVOU0VNQkxFX0RFRkFVTFRTLkFDVElWQVRJT05fU1RSQVRFR1k7XG4gICAgY29uc3QgYWN0aXZhdGlvblN0cmF0ZWd5UmVzdWx0ID0gdGhpcy52YWxpZGF0aW9uU2VydmljZS52YWxpZGF0ZUFuZFNhbml0aXplSW5wdXQoU3RyaW5nKGFjdGl2YXRpb25TdHJhdGVneVJhdyksIHtcbiAgICAgIG1heExlbmd0aDogU0VDVVJJVFlfTElNSVRTLk1BWF9FTlVNX0ZJRUxEX0xFTkdUSCxcbiAgICAgIGFsbG93U3BhY2VzOiBmYWxzZVxuICAgIH0pO1xuICAgIGlmICghYWN0aXZhdGlvblN0cmF0ZWd5UmVzdWx0LmlzVmFsaWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBhY3RpdmF0aW9uIHN0cmF0ZWd5OiAke2FjdGl2YXRpb25TdHJhdGVneVJlc3VsdC5lcnJvcnM/LmpvaW4oJywgJyl9YCk7XG4gICAgfVxuICAgIGNvbnN0IGFjdGl2YXRpb25TdHJhdGVneSA9IGFjdGl2YXRpb25TdHJhdGVneVJlc3VsdC5zYW5pdGl6ZWRWYWx1ZSE7XG5cbiAgICAvLyBLRUVQOiBFbnVtIHZhbGlkYXRpb24gbG9naWMgKGFkZCBBRlRFUiBWYWxpZGF0aW9uU2VydmljZSBzYW5pdGl6YXRpb24pXG4gICAgaWYgKCFBQ1RJVkFUSU9OX1NUUkFURUdJRVMuaW5jbHVkZXMoYWN0aXZhdGlvblN0cmF0ZWd5IGFzIGFueSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHtFTlNFTUJMRV9FUlJPUlMuSU5WQUxJRF9TVFJBVEVHWX06ICR7YWN0aXZhdGlvblN0cmF0ZWd5fWApO1xuICAgIH1cblxuICAgIC8vIFJFRkFDVE9SRUQ6IFVzZSBWYWxpZGF0aW9uU2VydmljZSBmb3IgY29uZmxpY3QgcmVzb2x1dGlvbiBzdHJhdGVneVxuICAgIGNvbnN0IGNvbmZsaWN0UmVzb2x1dGlvblJhdyA9IGRhdGEuY29uZmxpY3RfcmVzb2x1dGlvbiB8fCBkYXRhLmNvbmZsaWN0UmVzb2x1dGlvbiB8fCBFTlNFTUJMRV9ERUZBVUxUUy5DT05GTElDVF9SRVNPTFVUSU9OO1xuICAgIGNvbnN0IGNvbmZsaWN0UmVzb2x1dGlvblJlc3VsdCA9IHRoaXMudmFsaWRhdGlvblNlcnZpY2UudmFsaWRhdGVBbmRTYW5pdGl6ZUlucHV0KFN0cmluZyhjb25mbGljdFJlc29sdXRpb25SYXcpLCB7XG4gICAgICBtYXhMZW5ndGg6IFNFQ1VSSVRZX0xJTUlUUy5NQVhfRU5VTV9GSUVMRF9MRU5HVEgsXG4gICAgICBhbGxvd1NwYWNlczogZmFsc2VcbiAgICB9KTtcbiAgICBpZiAoIWNvbmZsaWN0UmVzb2x1dGlvblJlc3VsdC5pc1ZhbGlkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgY29uZmxpY3QgcmVzb2x1dGlvbiBzdHJhdGVneTogJHtjb25mbGljdFJlc29sdXRpb25SZXN1bHQuZXJyb3JzPy5qb2luKCcsICcpfWApO1xuICAgIH1cbiAgICBjb25zdCBjb25mbGljdFJlc29sdXRpb24gPSBjb25mbGljdFJlc29sdXRpb25SZXN1bHQuc2FuaXRpemVkVmFsdWUhO1xuXG4gICAgLy8gS0VFUDogRW51bSB2YWxpZGF0aW9uIGxvZ2ljIChhZGQgQUZURVIgVmFsaWRhdGlvblNlcnZpY2Ugc2FuaXRpemF0aW9uKVxuICAgIGlmICghQ09ORkxJQ1RfU1RSQVRFR0lFUy5pbmNsdWRlcyhjb25mbGljdFJlc29sdXRpb24gYXMgYW55KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGAke0VOU0VNQkxFX0VSUk9SUy5JTlZBTElEX0NPTkZMSUNUX1JFU09MVVRJT059OiAke2NvbmZsaWN0UmVzb2x1dGlvbn1gKTtcbiAgICB9XG5cbiAgICAvLyBSRUZBQ1RPUkVEOiBVc2UgVmFsaWRhdGlvblNlcnZpY2UgZm9yIGNvbnRleHQgc2hhcmluZyBtb2RlXG4gICAgY29uc3QgY29udGV4dFNoYXJpbmdSYXcgPSBkYXRhLmNvbnRleHRfc2hhcmluZyB8fCBkYXRhLmNvbnRleHRTaGFyaW5nIHx8IEVOU0VNQkxFX0RFRkFVTFRTLkNPTlRFWFRfU0hBUklORztcblxuICAgIC8vIEZJWDogSGFuZGxlIGJvb2xlYW4gdmFsdWVzICh0cnVlIC0+ICdmdWxsJywgZmFsc2UgLT4gJ25vbmUnKVxuICAgIGxldCBjb250ZXh0U2hhcmluZ1ZhbHVlOiBzdHJpbmc7XG4gICAgaWYgKHR5cGVvZiBjb250ZXh0U2hhcmluZ1JhdyA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICBjb250ZXh0U2hhcmluZ1ZhbHVlID0gY29udGV4dFNoYXJpbmdSYXcgPyAnZnVsbCcgOiAnbm9uZSc7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnRleHRTaGFyaW5nVmFsdWUgPSBTdHJpbmcoY29udGV4dFNoYXJpbmdSYXcpO1xuICAgIH1cblxuICAgIGNvbnN0IGNvbnRleHRTaGFyaW5nUmVzdWx0ID0gdGhpcy52YWxpZGF0aW9uU2VydmljZS52YWxpZGF0ZUFuZFNhbml0aXplSW5wdXQoY29udGV4dFNoYXJpbmdWYWx1ZSwge1xuICAgICAgbWF4TGVuZ3RoOiBTRUNVUklUWV9MSU1JVFMuTUFYX0VOVU1fRklFTERfTEVOR1RILFxuICAgICAgYWxsb3dTcGFjZXM6IGZhbHNlXG4gICAgfSk7XG4gICAgaWYgKCFjb250ZXh0U2hhcmluZ1Jlc3VsdC5pc1ZhbGlkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgY29udGV4dCBzaGFyaW5nIG1vZGU6ICR7Y29udGV4dFNoYXJpbmdSZXN1bHQuZXJyb3JzPy5qb2luKCcsICcpfWApO1xuICAgIH1cbiAgICBjb25zdCBjb250ZXh0U2hhcmluZyA9IGNvbnRleHRTaGFyaW5nUmVzdWx0LnNhbml0aXplZFZhbHVlITtcblxuICAgIC8vIEtFRVA6IEVudW0gdmFsaWRhdGlvbiBsb2dpYyAoYWRkIEFGVEVSIFZhbGlkYXRpb25TZXJ2aWNlIHNhbml0aXphdGlvbilcbiAgICBpZiAoIVsnbm9uZScsICdzZWxlY3RpdmUnLCAnZnVsbCddLmluY2x1ZGVzKGNvbnRleHRTaGFyaW5nKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGNvbnRleHQgc2hhcmluZyBtb2RlOiAke2NvbnRleHRTaGFyaW5nfWApO1xuICAgIH1cblxuICAgIC8vIFBhcnNlIHJlc291cmNlIGxpbWl0cyAoc3VwcG9ydCBzbmFrZV9jYXNlKVxuICAgIGNvbnN0IHJlc291cmNlTGltaXRzUmF3ID0gZGF0YS5yZXNvdXJjZV9saW1pdHMgfHwgZGF0YS5yZXNvdXJjZUxpbWl0cztcbiAgICBsZXQgcmVzb3VyY2VMaW1pdHM7XG5cbiAgICBpZiAocmVzb3VyY2VMaW1pdHNSYXcpIHtcbiAgICAgIHJlc291cmNlTGltaXRzID0ge1xuICAgICAgICBtYXhBY3RpdmVFbGVtZW50czogcmVzb3VyY2VMaW1pdHNSYXcubWF4X2FjdGl2ZV9lbGVtZW50cyB8fCByZXNvdXJjZUxpbWl0c1Jhdy5tYXhBY3RpdmVFbGVtZW50cyB8fCBFTlNFTUJMRV9MSU1JVFMuTUFYX0VMRU1FTlRTLFxuICAgICAgICBtYXhNZW1vcnlNYjogcmVzb3VyY2VMaW1pdHNSYXcubWF4X21lbW9yeV9tYiB8fCByZXNvdXJjZUxpbWl0c1Jhdy5tYXhNZW1vcnlNYixcbiAgICAgICAgbWF4RXhlY3V0aW9uVGltZU1zOiByZXNvdXJjZUxpbWl0c1Jhdy5tYXhfZXhlY3V0aW9uX3RpbWVfbXMgfHwgcmVzb3VyY2VMaW1pdHNSYXcubWF4RXhlY3V0aW9uVGltZU1zIHx8IEVOU0VNQkxFX0xJTUlUUy5NQVhfQUNUSVZBVElPTl9USU1FXG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vIFBhcnNlIGVsZW1lbnRzIGFycmF5XG4gICAgY29uc3QgZWxlbWVudHNSYXcgPSBkYXRhLmVsZW1lbnRzIHx8IFtdO1xuICAgIGlmICghQXJyYXkuaXNBcnJheShlbGVtZW50c1JhdykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRW5zZW1ibGUgZWxlbWVudHMgbXVzdCBiZSBhbiBhcnJheScpO1xuICAgIH1cblxuICAgIGNvbnN0IGVsZW1lbnRzOiBFbnNlbWJsZUVsZW1lbnRbXSA9IGVsZW1lbnRzUmF3Lm1hcCgoZWxlbTogYW55LCBpbmRleDogbnVtYmVyKSA9PiB7XG4gICAgICAvLyBSRUZBQ1RPUkVEOiBVc2UgVmFsaWRhdGlvblNlcnZpY2UgZm9yIGVsZW1lbnQgbmFtZVxuICAgICAgLy8gU3VwcG9ydCBib3RoIGVsZW1lbnRfbmFtZSAobmV3IHN0YW5kYXJkKSBhbmQgbmFtZSAobGVnYWN5KSBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHlcbiAgICAgIGNvbnN0IHJhd0VsZW1lbnROYW1lID0gZWxlbS5lbGVtZW50X25hbWUgfHwgZWxlbS5uYW1lO1xuICAgICAgaWYgKCFyYXdFbGVtZW50TmFtZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEVsZW1lbnQgYXQgaW5kZXggJHtpbmRleH0gbXVzdCBoYXZlIGVsZW1lbnRfbmFtZSAob3IgbmFtZSBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkpYCk7XG4gICAgICB9XG4gICAgICAvLyBMb2cgZGVwcmVjYXRpb24gd2FybmluZyBpZiB1c2luZyBsZWdhY3kgJ25hbWUnIGZpZWxkXG4gICAgICBpZiAoZWxlbS5uYW1lICYmICFlbGVtLmVsZW1lbnRfbmFtZSkge1xuICAgICAgICBsb2dnZXIud2FybihgRW5zZW1ibGUgZWxlbWVudCBhdCBpbmRleCAke2luZGV4fSB1c2VzIGRlcHJlY2F0ZWQgJ25hbWUnIGZpZWxkLiBVc2UgJ2VsZW1lbnRfbmFtZScgaW5zdGVhZC5gKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGVsZW1lbnROYW1lUmVzdWx0ID0gdGhpcy52YWxpZGF0aW9uU2VydmljZS52YWxpZGF0ZUFuZFNhbml0aXplSW5wdXQoXG4gICAgICAgIFN0cmluZyhyYXdFbGVtZW50TmFtZSksXG4gICAgICAgIHsgbWF4TGVuZ3RoOiBTRUNVUklUWV9MSU1JVFMuTUFYX05BTUVfTEVOR1RILCBhbGxvd1NwYWNlczogdHJ1ZSB9XG4gICAgICApO1xuICAgICAgaWYgKCFlbGVtZW50TmFtZVJlc3VsdC5pc1ZhbGlkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBlbGVtZW50IG5hbWUgYXQgaW5kZXggJHtpbmRleH06ICR7ZWxlbWVudE5hbWVSZXN1bHQuZXJyb3JzPy5qb2luKCcsICcpfWApO1xuICAgICAgfVxuICAgICAgY29uc3QgZWxlbWVudE5hbWUgPSBlbGVtZW50TmFtZVJlc3VsdC5zYW5pdGl6ZWRWYWx1ZSE7XG5cbiAgICAgIC8vIFJFRkFDVE9SRUQ6IFVzZSBWYWxpZGF0aW9uU2VydmljZSBmb3IgZWxlbWVudCB0eXBlXG4gICAgICAvLyBTdXBwb3J0IGJvdGggZWxlbWVudF90eXBlIChuZXcgc3RhbmRhcmQpIGFuZCB0eXBlIChsZWdhY3kpIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eVxuICAgICAgY29uc3QgcmF3RWxlbWVudFR5cGUgPSBlbGVtLmVsZW1lbnRfdHlwZSB8fCBlbGVtLnR5cGUgfHwgJ3NraWxsJztcbiAgICAgIC8vIExvZyBkZXByZWNhdGlvbiB3YXJuaW5nIGlmIHVzaW5nIGxlZ2FjeSAndHlwZScgZmllbGRcbiAgICAgIGlmIChlbGVtLnR5cGUgJiYgIWVsZW0uZWxlbWVudF90eXBlKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKGBFbnNlbWJsZSBlbGVtZW50IGF0IGluZGV4ICR7aW5kZXh9IHVzZXMgZGVwcmVjYXRlZCAndHlwZScgZmllbGQuIFVzZSAnZWxlbWVudF90eXBlJyBpbnN0ZWFkLmApO1xuICAgICAgfVxuICAgICAgY29uc3QgZWxlbWVudFR5cGVSZXN1bHQgPSB0aGlzLnZhbGlkYXRpb25TZXJ2aWNlLnZhbGlkYXRlQW5kU2FuaXRpemVJbnB1dChcbiAgICAgICAgU3RyaW5nKHJhd0VsZW1lbnRUeXBlKSxcbiAgICAgICAgeyBtYXhMZW5ndGg6IFNFQ1VSSVRZX0xJTUlUUy5NQVhfVEFHX0xFTkdUSCwgYWxsb3dTcGFjZXM6IGZhbHNlIH1cbiAgICAgICk7XG4gICAgICBpZiAoIWVsZW1lbnRUeXBlUmVzdWx0LmlzVmFsaWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGVsZW1lbnQgdHlwZSBhdCBpbmRleCAke2luZGV4fTogJHtlbGVtZW50VHlwZVJlc3VsdC5lcnJvcnM/LmpvaW4oJywgJyl9YCk7XG4gICAgICB9XG4gICAgICBjb25zdCBlbGVtZW50VHlwZSA9IGVsZW1lbnRUeXBlUmVzdWx0LnNhbml0aXplZFZhbHVlITtcblxuICAgICAgLy8gUkVGQUNUT1JFRDogVXNlIFZhbGlkYXRpb25TZXJ2aWNlIGZvciBlbGVtZW50IHJvbGVcbiAgICAgIGNvbnN0IGVsZW1lbnRSb2xlUmVzdWx0ID0gdGhpcy52YWxpZGF0aW9uU2VydmljZS52YWxpZGF0ZUFuZFNhbml0aXplSW5wdXQoXG4gICAgICAgIFN0cmluZyhlbGVtLnJvbGUgfHwgRU5TRU1CTEVfREVGQVVMVFMuRUxFTUVOVF9ST0xFKSxcbiAgICAgICAgeyBtYXhMZW5ndGg6IFNFQ1VSSVRZX0xJTUlUUy5NQVhfRU5VTV9GSUVMRF9MRU5HVEgsIGFsbG93U3BhY2VzOiBmYWxzZSB9XG4gICAgICApO1xuICAgICAgaWYgKCFlbGVtZW50Um9sZVJlc3VsdC5pc1ZhbGlkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBlbGVtZW50IHJvbGUgYXQgaW5kZXggJHtpbmRleH06ICR7ZWxlbWVudFJvbGVSZXN1bHQuZXJyb3JzPy5qb2luKCcsICcpfWApO1xuICAgICAgfVxuICAgICAgY29uc3QgZWxlbWVudFJvbGUgPSBlbGVtZW50Um9sZVJlc3VsdC5zYW5pdGl6ZWRWYWx1ZSE7XG5cbiAgICAgIC8vIEtFRVA6IEVudW0gdmFsaWRhdGlvbiBsb2dpYyAoYWRkIEFGVEVSIFZhbGlkYXRpb25TZXJ2aWNlIHNhbml0aXphdGlvbilcbiAgICAgIGlmICghRUxFTUVOVF9ST0xFUy5pbmNsdWRlcyhlbGVtZW50Um9sZSBhcyBhbnkpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgJHtFTlNFTUJMRV9FUlJPUlMuSU5WQUxJRF9FTEVNRU5UX1JPTEV9OiAke2VsZW1lbnRSb2xlfWApO1xuICAgICAgfVxuXG4gICAgICAvLyBSRUZBQ1RPUkVEOiBVc2UgVmFsaWRhdGlvblNlcnZpY2UgZm9yIGVsZW1lbnQgYWN0aXZhdGlvblxuICAgICAgY29uc3QgZWxlbWVudEFjdGl2YXRpb25SZXN1bHQgPSB0aGlzLnZhbGlkYXRpb25TZXJ2aWNlLnZhbGlkYXRlQW5kU2FuaXRpemVJbnB1dChcbiAgICAgICAgU3RyaW5nKGVsZW0uYWN0aXZhdGlvbiB8fCAnYWx3YXlzJyksXG4gICAgICAgIHsgbWF4TGVuZ3RoOiBTRUNVUklUWV9MSU1JVFMuTUFYX0VOVU1fRklFTERfTEVOR1RILCBhbGxvd1NwYWNlczogZmFsc2UgfVxuICAgICAgKTtcbiAgICAgIGlmICghZWxlbWVudEFjdGl2YXRpb25SZXN1bHQuaXNWYWxpZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgZWxlbWVudCBhY3RpdmF0aW9uIGF0IGluZGV4ICR7aW5kZXh9OiAke2VsZW1lbnRBY3RpdmF0aW9uUmVzdWx0LmVycm9ycz8uam9pbignLCAnKX1gKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGVsZW1lbnRBY3RpdmF0aW9uID0gZWxlbWVudEFjdGl2YXRpb25SZXN1bHQuc2FuaXRpemVkVmFsdWUhO1xuXG4gICAgICAvLyBLRUVQOiBFbnVtIHZhbGlkYXRpb24gbG9naWMgKGFkZCBBRlRFUiBWYWxpZGF0aW9uU2VydmljZSBzYW5pdGl6YXRpb24pXG4gICAgICBpZiAoIUFDVElWQVRJT05fTU9ERVMuaW5jbHVkZXMoZWxlbWVudEFjdGl2YXRpb24gYXMgYW55KSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7RU5TRU1CTEVfRVJST1JTLklOVkFMSURfQUNUSVZBVElPTl9NT0RFfTogJHtlbGVtZW50QWN0aXZhdGlvbn1gKTtcbiAgICAgIH1cblxuICAgICAgLy8gUGFyc2UgcHJpb3JpdHkgKDAtMTAwLCBkZWZhdWx0IDUwKVxuICAgICAgbGV0IHByaW9yaXR5ID0gZWxlbS5wcmlvcml0eSA/PyBFTlNFTUJMRV9ERUZBVUxUUy5QUklPUklUWTtcbiAgICAgIGlmICh0eXBlb2YgcHJpb3JpdHkgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHByaW9yaXR5ID0gcGFyc2VJbnQocHJpb3JpdHksIDEwKTtcbiAgICAgIH1cbiAgICAgIHByaW9yaXR5ID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oMTAwLCBwcmlvcml0eSkpO1xuXG4gICAgICAvLyBSRUZBQ1RPUkVEOiBVc2UgVmFsaWRhdGlvblNlcnZpY2UgZm9yIGNvbmRpdGlvbiAoaWYgY29uZGl0aW9uYWwgYWN0aXZhdGlvbilcbiAgICAgIC8vIENvbmRpdGlvbnMgbmVlZCBzcGVjaWFsIGhhbmRsaW5nIC0gdGhleSBjYW4gY29udGFpbiBvcGVyYXRvcnMgbGlrZSA9PSwgIT0sICYmLCB8fFxuICAgICAgLy8gU28gd2UgdXNlIGEgY3VzdG9tIHBhdHRlcm4gdGhhdCBhbGxvd3MgdGhlc2UgY2hhcmFjdGVyc1xuICAgICAgbGV0IGNvbmRpdGlvbjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgICAgaWYgKGVsZW1lbnRBY3RpdmF0aW9uID09PSAnY29uZGl0aW9uYWwnICYmIGVsZW0uY29uZGl0aW9uKSB7XG4gICAgICAgIGNvbnN0IGNvbmRpdGlvblJlc3VsdCA9IHRoaXMudmFsaWRhdGlvblNlcnZpY2UudmFsaWRhdGVBbmRTYW5pdGl6ZUlucHV0KFxuICAgICAgICAgIFN0cmluZyhlbGVtLmNvbmRpdGlvbiksXG4gICAgICAgICAge1xuICAgICAgICAgICAgbWF4TGVuZ3RoOiBFTlNFTUJMRV9MSU1JVFMuTUFYX0NPTkRJVElPTl9MRU5HVEgsXG4gICAgICAgICAgICBhbGxvd1NwYWNlczogdHJ1ZSxcbiAgICAgICAgICAgIGN1c3RvbVBhdHRlcm46IC9eW2EtekEtWjAtOVxcc1xcLV8uPSEmfDw+KCldKyQvICAvLyBBbGxvdyBjb21wYXJpc29uL2xvZ2ljYWwgb3BlcmF0b3JzXG4gICAgICAgICAgfVxuICAgICAgICApO1xuICAgICAgICBpZiAoIWNvbmRpdGlvblJlc3VsdC5pc1ZhbGlkKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGNvbmRpdGlvbiBhdCBpbmRleCAke2luZGV4fTogJHtjb25kaXRpb25SZXN1bHQuZXJyb3JzPy5qb2luKCcsICcpfWApO1xuICAgICAgICB9XG4gICAgICAgIGNvbmRpdGlvbiA9IGNvbmRpdGlvblJlc3VsdC5zYW5pdGl6ZWRWYWx1ZTtcbiAgICAgIH1cblxuICAgICAgLy8gUkVGQUNUT1JFRDogVXNlIFZhbGlkYXRpb25TZXJ2aWNlIGZvciBkZXBlbmRlbmNpZXNcbiAgICAgIGxldCBkZXBlbmRlbmNpZXM6IHN0cmluZ1tdIHwgdW5kZWZpbmVkO1xuICAgICAgaWYgKGVsZW0uZGVwZW5kZW5jaWVzICYmIEFycmF5LmlzQXJyYXkoZWxlbS5kZXBlbmRlbmNpZXMpKSB7XG4gICAgICAgIGNvbnN0IHZhbGlkYXRlZERlcGVuZGVuY2llczogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBkZXAgb2YgZWxlbS5kZXBlbmRlbmNpZXMuc2xpY2UoMCwgRU5TRU1CTEVfTElNSVRTLk1BWF9ERVBFTkRFTkNJRVMpKSB7XG4gICAgICAgICAgY29uc3QgZGVwUmVzdWx0ID0gdGhpcy52YWxpZGF0aW9uU2VydmljZS52YWxpZGF0ZUFuZFNhbml0aXplSW5wdXQoU3RyaW5nKGRlcCksIHtcbiAgICAgICAgICAgIG1heExlbmd0aDogU0VDVVJJVFlfTElNSVRTLk1BWF9OQU1FX0xFTkdUSCxcbiAgICAgICAgICAgIGFsbG93U3BhY2VzOiB0cnVlXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgaWYgKCFkZXBSZXN1bHQuaXNWYWxpZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGRlcGVuZGVuY3kgXCIke2RlcH1cIiBhdCBpbmRleCAke2luZGV4fTogJHtkZXBSZXN1bHQuZXJyb3JzPy5qb2luKCcsICcpfWApO1xuICAgICAgICAgIH1cbiAgICAgICAgICB2YWxpZGF0ZWREZXBlbmRlbmNpZXMucHVzaChkZXBSZXN1bHQuc2FuaXRpemVkVmFsdWUhKTtcbiAgICAgICAgfVxuICAgICAgICBkZXBlbmRlbmNpZXMgPSB2YWxpZGF0ZWREZXBlbmRlbmNpZXM7XG4gICAgICB9XG5cbiAgICAgIC8vIFJFRkFDVE9SRUQ6IFVzZSBWYWxpZGF0aW9uU2VydmljZSBmb3IgcHVycG9zZVxuICAgICAgbGV0IHB1cnBvc2U6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICAgIGlmIChlbGVtLnB1cnBvc2UpIHtcbiAgICAgICAgY29uc3QgcHVycG9zZVJlc3VsdCA9IHRoaXMudmFsaWRhdGlvblNlcnZpY2UudmFsaWRhdGVBbmRTYW5pdGl6ZUlucHV0KFN0cmluZyhlbGVtLnB1cnBvc2UpLCB7XG4gICAgICAgICAgbWF4TGVuZ3RoOiBTRUNVUklUWV9MSU1JVFMuTUFYX0RFU0NSSVBUSU9OX0xFTkdUSCxcbiAgICAgICAgICBhbGxvd1NwYWNlczogdHJ1ZSxcbiAgICAgICAgICBmaWVsZFR5cGU6ICdkZXNjcmlwdGlvbicgIC8vIEFsbG93IGZ1bGwgZGVzY3JpcHRpb24gcHVuY3R1YXRpb24gKGNvbW1hcywgZW0tZGFzaGVzLCBldGMuKVxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKCFwdXJwb3NlUmVzdWx0LmlzVmFsaWQpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgcHVycG9zZSBhdCBpbmRleCAke2luZGV4fTogJHtwdXJwb3NlUmVzdWx0LmVycm9ycz8uam9pbignLCAnKX1gKTtcbiAgICAgICAgfVxuICAgICAgICBwdXJwb3NlID0gcHVycG9zZVJlc3VsdC5zYW5pdGl6ZWRWYWx1ZTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZWxlbWVudF9uYW1lOiBlbGVtZW50TmFtZSxcbiAgICAgICAgZWxlbWVudF90eXBlOiBlbGVtZW50VHlwZSxcbiAgICAgICAgcm9sZTogZWxlbWVudFJvbGUgYXMgRWxlbWVudFJvbGUsXG4gICAgICAgIHByaW9yaXR5LFxuICAgICAgICBhY3RpdmF0aW9uOiBlbGVtZW50QWN0aXZhdGlvbiBhcyBBY3RpdmF0aW9uTW9kZSxcbiAgICAgICAgY29uZGl0aW9uLFxuICAgICAgICBkZXBlbmRlbmNpZXMsXG4gICAgICAgIHB1cnBvc2VcbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICAvLyBWYWxpZGF0ZSBlbGVtZW50IGNvdW50XG4gICAgaWYgKGVsZW1lbnRzLmxlbmd0aCA+IEVOU0VNQkxFX0xJTUlUUy5NQVhfRUxFTUVOVFMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihFTlNFTUJMRV9FUlJPUlMuVE9PX01BTllfRUxFTUVOVFMpO1xuICAgIH1cblxuICAgIC8vIFBhcnNlIG5lc3RpbmcgY29uZmlndXJhdGlvblxuICAgIGNvbnN0IGFsbG93TmVzdGVkID0gZGF0YS5hbGxvd19uZXN0ZWQgIT09IHVuZGVmaW5lZCA/XG4gICAgICBCb29sZWFuKGRhdGEuYWxsb3dfbmVzdGVkKSA6XG4gICAgICAoZGF0YS5hbGxvd05lc3RlZCAhPT0gdW5kZWZpbmVkID8gQm9vbGVhbihkYXRhLmFsbG93TmVzdGVkKSA6IEVOU0VNQkxFX0RFRkFVTFRTLkFMTE9XX05FU1RFRCk7XG5cbiAgICBjb25zdCBtYXhOZXN0aW5nRGVwdGggPSBkYXRhLm1heF9uZXN0aW5nX2RlcHRoIHx8IGRhdGEubWF4TmVzdGluZ0RlcHRoIHx8IEVOU0VNQkxFX0RFRkFVTFRTLk1BWF9ORVNUSU5HX0RFUFRIO1xuXG4gICAgLy8gUkVGQUNUT1JFRDogVXNlIFZhbGlkYXRpb25TZXJ2aWNlIGZvciB0YWdzIGFycmF5XG4gICAgbGV0IHRhZ3M6IHN0cmluZ1tdID0gW107XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoZGF0YS50YWdzKSkge1xuICAgICAgZm9yIChjb25zdCB0YWcgb2YgZGF0YS50YWdzKSB7XG4gICAgICAgIGNvbnN0IHRhZ1Jlc3VsdCA9IHRoaXMudmFsaWRhdGlvblNlcnZpY2UudmFsaWRhdGVBbmRTYW5pdGl6ZUlucHV0KFN0cmluZyh0YWcpLCB7XG4gICAgICAgICAgbWF4TGVuZ3RoOiBTRUNVUklUWV9MSU1JVFMuTUFYX1RBR19MRU5HVEgsXG4gICAgICAgICAgYWxsb3dTcGFjZXM6IHRydWVcbiAgICAgICAgfSk7XG4gICAgICAgIGlmICghdGFnUmVzdWx0LmlzVmFsaWQpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgdGFnIFwiJHt0YWd9XCI6ICR7dGFnUmVzdWx0LmVycm9ycz8uam9pbignLCAnKX1gKTtcbiAgICAgICAgfVxuICAgICAgICB0YWdzLnB1c2godGFnUmVzdWx0LnNhbml0aXplZFZhbHVlISk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQnVpbGQgbWV0YWRhdGEgb2JqZWN0IChjYW1lbENhc2UpXG4gICAgY29uc3QgbWV0YWRhdGE6IEVuc2VtYmxlTWV0YWRhdGEgPSB7XG4gICAgICBuYW1lLFxuICAgICAgZGVzY3JpcHRpb246IGRlc2NyaXB0aW9uIHx8ICcnLFxuICAgICAgdmVyc2lvbjogZGF0YS52ZXJzaW9uIHx8ICcxLjAuMCcsXG4gICAgICBhdXRob3I6IGRhdGEuYXV0aG9yLFxuICAgICAgY3JlYXRlZDogZGF0YS5jcmVhdGVkLFxuICAgICAgbW9kaWZpZWQ6IGRhdGEubW9kaWZpZWQgfHwgbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgICAgdGFncyxcbiAgICAgIGFjdGl2YXRpb25TdHJhdGVneTogYWN0aXZhdGlvblN0cmF0ZWd5IGFzIEFjdGl2YXRpb25TdHJhdGVneSxcbiAgICAgIGNvbmZsaWN0UmVzb2x1dGlvbjogY29uZmxpY3RSZXNvbHV0aW9uIGFzIENvbmZsaWN0UmVzb2x1dGlvblN0cmF0ZWd5LFxuICAgICAgY29udGV4dFNoYXJpbmc6IGNvbnRleHRTaGFyaW5nIGFzICdub25lJyB8ICdzZWxlY3RpdmUnIHwgJ2Z1bGwnLFxuICAgICAgcmVzb3VyY2VMaW1pdHMsXG4gICAgICBhbGxvd05lc3RlZCxcbiAgICAgIG1heE5lc3RpbmdEZXB0aCxcbiAgICAgIGVsZW1lbnRzLFxuICAgICAgZ2F0ZWtlZXBlcjogc2FuaXRpemVHYXRla2VlcGVyUG9saWN5KGRhdGEuZ2F0ZWtlZXBlciwgbmFtZSwgJ2Vuc2VtYmxlJywgZGF0YSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiksICAvLyBJc3N1ZSAjNTI0XG4gICAgfTtcblxuICAgIHJldHVybiBtZXRhZGF0YTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYW4gRW5zZW1ibGUgaW5zdGFuY2UgZnJvbSBwYXJzZWQgbWV0YWRhdGFcbiAgICpcbiAgICogQHBhcmFtIG1ldGFkYXRhIC0gVmFsaWRhdGVkIGVuc2VtYmxlIG1ldGFkYXRhXG4gICAqIEBwYXJhbSBjb250ZW50IC0gTWFya2Rvd24gY29udGVudCAoZW5zZW1ibGUgaW5zdHJ1Y3Rpb25zL2RvY3VtZW50YXRpb24pXG4gICAqIEByZXR1cm5zIE5ldyBFbnNlbWJsZSBpbnN0YW5jZVxuICAgKi9cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGNyZWF0ZUVsZW1lbnQobWV0YWRhdGE6IEVuc2VtYmxlTWV0YWRhdGEsIF9jb250ZW50OiBzdHJpbmcpOiBFbnNlbWJsZSB7XG4gICAgZGVsZXRlIChtZXRhZGF0YSBhcyBhbnkpLmZvcm1hdF92ZXJzaW9uOyAgLy8gRml4ICM5MTI6IFN0cmlwIG1hcmtlciBmcm9tIHJ1bnRpbWUgbWV0YWRhdGFcbiAgICBjb25zdCBlbnNlbWJsZSA9IG5ldyBFbnNlbWJsZShtZXRhZGF0YSwgbWV0YWRhdGEuZWxlbWVudHMsIHRoaXMubWV0YWRhdGFTZXJ2aWNlKTtcbiAgICAvLyBFeHRyYWN0IGluc3RydWN0aW9ucyBmcm9tIG1ldGFkYXRhIGlmIHByZXNlbnQgKHYyIGR1YWwtZmllbGQpXG4gICAgaWYgKG1ldGFkYXRhLmluc3RydWN0aW9ucykge1xuICAgICAgZW5zZW1ibGUuaW5zdHJ1Y3Rpb25zID0gbWV0YWRhdGEuaW5zdHJ1Y3Rpb25zO1xuICAgICAgZGVsZXRlIG1ldGFkYXRhLmluc3RydWN0aW9ucztcbiAgICB9XG4gICAgcmV0dXJuIGVuc2VtYmxlO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlcmlhbGl6ZSBhbiBlbnNlbWJsZSB0byBmaWxlIGNvbnRlbnRcbiAgICpcbiAgICogRm9ybWF0OiBNYXJrZG93biB3aXRoIFlBTUwgZnJvbnRtYXR0ZXJcbiAgICogLSBGcm9udG1hdHRlcjogRW5zZW1ibGUgbWV0YWRhdGEgKyBlbGVtZW50IHJlZmVyZW5jZXNcbiAgICogLSBDb250ZW50OiBJbnN0cnVjdGlvbnMvZG9jdW1lbnRhdGlvbiBmb3IgdGhlIGVuc2VtYmxlXG4gICAqXG4gICAqIEBwYXJhbSBlbGVtZW50IC0gRW5zZW1ibGUgdG8gc2VyaWFsaXplXG4gICAqIEByZXR1cm5zIEZpbGUgY29udGVudCAobWFya2Rvd24gd2l0aCBmcm9udG1hdHRlcilcbiAgICovXG4gIHByb3RlY3RlZCBvdmVycmlkZSBhc3luYyBzZXJpYWxpemVFbGVtZW50KGVsZW1lbnQ6IEVuc2VtYmxlKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCBtZXRhZGF0YSA9IGVsZW1lbnQubWV0YWRhdGE7XG5cbiAgICAvLyBCdWlsZCBmcm9udG1hdHRlciBkYXRhICh1c2luZyBjYW1lbENhc2UpXG4gICAgY29uc3QgZnJvbnRtYXR0ZXI6IGFueSA9IHtcbiAgICAgIG5hbWU6IG1ldGFkYXRhLm5hbWUsXG4gICAgICB0eXBlOiB0b1Npbmd1bGFyTGFiZWwoRWxlbWVudFR5cGUuRU5TRU1CTEUpLFxuICAgICAgZm9ybWF0X3ZlcnNpb246ICd2MicsICAvLyBGaXggIzkxMjogRXhwbGljaXQgZm9ybWF0IG1hcmtlclxuICAgICAgdW5pcXVlX2lkOiBlbGVtZW50LmlkLFxuICAgICAgZGVzY3JpcHRpb246IG1ldGFkYXRhLmRlc2NyaXB0aW9uLFxuICAgICAgdmVyc2lvbjogbWV0YWRhdGEudmVyc2lvbixcbiAgICAgIGF1dGhvcjogbWV0YWRhdGEuYXV0aG9yLFxuICAgICAgY3JlYXRlZDogbWV0YWRhdGEuY3JlYXRlZCxcbiAgICAgIG1vZGlmaWVkOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgICB0YWdzOiBtZXRhZGF0YS50YWdzIHx8IFtdLFxuICAgICAgYWN0aXZhdGlvblN0cmF0ZWd5OiBtZXRhZGF0YS5hY3RpdmF0aW9uU3RyYXRlZ3ksXG4gICAgICBjb25mbGljdFJlc29sdXRpb246IG1ldGFkYXRhLmNvbmZsaWN0UmVzb2x1dGlvbixcbiAgICAgIGNvbnRleHRTaGFyaW5nOiBtZXRhZGF0YS5jb250ZXh0U2hhcmluZyxcbiAgICAgIGFsbG93TmVzdGVkOiBtZXRhZGF0YS5hbGxvd05lc3RlZCxcbiAgICAgIG1heE5lc3RpbmdEZXB0aDogbWV0YWRhdGEubWF4TmVzdGluZ0RlcHRoXG4gICAgfTtcblxuICAgIC8vIHYyLjAgZHVhbC1maWVsZDogd3JpdGUgaW5zdHJ1Y3Rpb25zIHRvIFlBTUwgZnJvbnRtYXR0ZXIgaWYgcHJlc2VudFxuICAgIGlmIChlbGVtZW50Lmluc3RydWN0aW9ucykge1xuICAgICAgZnJvbnRtYXR0ZXIuaW5zdHJ1Y3Rpb25zID0gZWxlbWVudC5pbnN0cnVjdGlvbnM7XG4gICAgfVxuXG4gICAgLy8gSW5jbHVkZSByZXNvdXJjZSBsaW1pdHMgaWYgc3BlY2lmaWVkXG4gICAgaWYgKG1ldGFkYXRhLnJlc291cmNlTGltaXRzKSB7XG4gICAgICBmcm9udG1hdHRlci5yZXNvdXJjZUxpbWl0cyA9IG1ldGFkYXRhLnJlc291cmNlTGltaXRzO1xuICAgIH1cblxuICAgIC8vIElzc3VlICM1MjQg4oCUIEdhdGVrZWVwZXIgcG9saWN5IChhbGwgZWxlbWVudCB0eXBlcylcbiAgICBpZiAobWV0YWRhdGEuZ2F0ZWtlZXBlcikge1xuICAgICAgZnJvbnRtYXR0ZXIuZ2F0ZWtlZXBlciA9IG1ldGFkYXRhLmdhdGVrZWVwZXI7XG4gICAgfVxuXG4gICAgLy8gSW5jbHVkZSBlbGVtZW50cyBhcnJheSAodXNpbmcgZWxlbWVudF9uYW1lL2VsZW1lbnRfdHlwZSBmb3IgQVBJIGNvbnNpc3RlbmN5KVxuICAgIGZyb250bWF0dGVyLmVsZW1lbnRzID0gbWV0YWRhdGEuZWxlbWVudHMubWFwKGVsZW0gPT4ge1xuICAgICAgY29uc3QgZWxlbURhdGE6IGFueSA9IHtcbiAgICAgICAgZWxlbWVudF9uYW1lOiBlbGVtLmVsZW1lbnRfbmFtZSxcbiAgICAgICAgZWxlbWVudF90eXBlOiBlbGVtLmVsZW1lbnRfdHlwZSxcbiAgICAgICAgcm9sZTogZWxlbS5yb2xlLFxuICAgICAgICBwcmlvcml0eTogZWxlbS5wcmlvcml0eSxcbiAgICAgICAgYWN0aXZhdGlvbjogZWxlbS5hY3RpdmF0aW9uXG4gICAgICB9O1xuXG4gICAgICBpZiAoZWxlbS5jb25kaXRpb24pIHtcbiAgICAgICAgZWxlbURhdGEuY29uZGl0aW9uID0gZWxlbS5jb25kaXRpb247XG4gICAgICB9XG5cbiAgICAgIGlmIChlbGVtLmRlcGVuZGVuY2llcyAmJiBlbGVtLmRlcGVuZGVuY2llcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGVsZW1EYXRhLmRlcGVuZGVuY2llcyA9IGVsZW0uZGVwZW5kZW5jaWVzO1xuICAgICAgfVxuXG4gICAgICBpZiAoZWxlbS5wdXJwb3NlKSB7XG4gICAgICAgIGVsZW1EYXRhLnB1cnBvc2UgPSBlbGVtLnB1cnBvc2U7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBlbGVtRGF0YTtcbiAgICB9KTtcblxuICAgIC8vIFVzZSBTZXJpYWxpemF0aW9uU2VydmljZSBmb3IgZnJvbnRtYXR0ZXIgY3JlYXRpb25cbiAgICAvLyBVc2UgQ09SRV9TQ0hFTUEgdG8gc3VwcG9ydCBudW1iZXJzIChwcmlvcml0eSkgYW5kIGJvb2xlYW5zIChhbGxvd05lc3RlZClcbiAgICBjb25zdCBib2R5ID0gZWxlbWVudC5jb250ZW50IHx8IHRoaXMuYnVpbGREZWZhdWx0Qm9keShlbGVtZW50KTtcbiAgICByZXR1cm4gdGhpcy5zZXJpYWxpemF0aW9uU2VydmljZS5jcmVhdGVGcm9udG1hdHRlcihmcm9udG1hdHRlciwgYm9keSwge1xuICAgICAgbWV0aG9kOiAnbWFudWFsJyxcbiAgICAgIHNjaGVtYTogJ2pzb24nLCAgLy8gRml4ICM5MTQ6IHN0YW5kYXJkaXplIG9uIEpTT04gc2NoZW1hIGFjcm9zcyBhbGwgbWFuYWdlcnNcbiAgICAgIGNsZWFuTWV0YWRhdGE6IHRydWUsICAvLyBGaXggIzkxMzogc3RhbmRhcmRpemUgYWNyb3NzIGFsbCBtYW5hZ2Vyc1xuICAgICAgY2xlYW5pbmdTdHJhdGVneTogJ3JlbW92ZS1ib3RoJyxcbiAgICAgIHNvcnRLZXlzOiB0cnVlLFxuICAgICAgbGluZVdpZHRoOiAxMDAsXG4gICAgICBza2lwSW52YWxpZDogZmFsc2UgIC8vIERvbid0IHNraXAgaW52YWxpZCAtIHdlIHdhbnQgdG8gY2F0Y2ggZXJyb3JzXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkRGVmYXVsdEJvZHkoZWxlbWVudDogRW5zZW1ibGUpOiBzdHJpbmcge1xuICAgIGNvbnN0IG5hbWUgPSAoZWxlbWVudC5tZXRhZGF0YS5uYW1lID8/ICcnKS50cmltKCk7XG4gICAgY29uc3QgZGVzY3JpcHRpb24gPSAoZWxlbWVudC5tZXRhZGF0YS5kZXNjcmlwdGlvbiA/PyAnJykudHJpbSgpO1xuICAgIGNvbnN0IGxpbmVzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGlmIChuYW1lKSB7XG4gICAgICBsaW5lcy5wdXNoKGAjICR7bmFtZX1gKTtcbiAgICAgIGxpbmVzLnB1c2goJycpO1xuICAgIH1cbiAgICBpZiAoZGVzY3JpcHRpb24pIHtcbiAgICAgIGxpbmVzLnB1c2goZGVzY3JpcHRpb24pO1xuICAgIH1cbiAgICByZXR1cm4gbGluZXMuam9pbignXFxuJyk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGZpbGUgZXh0ZW5zaW9uIGZvciBlbnNlbWJsZSBmaWxlc1xuICAgKi9cbiAgb3ZlcnJpZGUgZ2V0RmlsZUV4dGVuc2lvbigpOiBzdHJpbmcge1xuICAgIHJldHVybiAnLm1kJztcbiAgfVxuXG4gIC8qKlxuICAgKiBJbXBvcnQgYW4gZW5zZW1ibGUgZnJvbSBleHRlcm5hbCBmb3JtYXRcbiAgICpcbiAgICogU3VwcG9ydHM6XG4gICAqIC0gWUFNTDogRnJvbnRtYXR0ZXItc3R5bGUgbWV0YWRhdGEgd2l0aCBvcHRpb25hbCBtYXJrZG93biBjb250ZW50XG4gICAqIC0gSlNPTjogRGlyZWN0IGVuc2VtYmxlIHN0cnVjdHVyZVxuICAgKiAtIE1hcmtkb3duOiBZQU1MIGZyb250bWF0dGVyICsgbWFya2Rvd24gY29udGVudFxuICAgKlxuICAgKiBAcGFyYW0gZGF0YSAtIFN0cmluZyBjb250YWluaW5nIGVuc2VtYmxlIGRhdGFcbiAgICogQHBhcmFtIGZvcm1hdCAtIEZvcm1hdCBvZiB0aGUgZGF0YSAoanNvbiwgeWFtbCwgbWFya2Rvd24pXG4gICAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2aW5nIHRvIGltcG9ydGVkIEVuc2VtYmxlXG4gICAqL1xuICBvdmVycmlkZSBhc3luYyBpbXBvcnRFbGVtZW50KFxuICAgIGRhdGE6IHN0cmluZyxcbiAgICBmb3JtYXQ6ICdqc29uJyB8ICd5YW1sJyB8ICdtYXJrZG93bicgPSAnbWFya2Rvd24nXG4gICk6IFByb21pc2U8RW5zZW1ibGU+IHtcbiAgICB0cnkge1xuICAgICAgbGV0IHBhcnNlZDogYW55O1xuXG4gICAgICBpZiAoZm9ybWF0ID09PSAnanNvbicpIHtcbiAgICAgICAgcGFyc2VkID0gdGhpcy5zZXJpYWxpemF0aW9uU2VydmljZS5wYXJzZUpzb24oZGF0YSwge1xuICAgICAgICAgIHNvdXJjZTogJ0Vuc2VtYmxlTWFuYWdlci5pbXBvcnRFbGVtZW50J1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFBhcnNlIFlBTUwvTWFya2Rvd24gdXNpbmcgU2VyaWFsaXphdGlvblNlcnZpY2VcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5zZXJpYWxpemF0aW9uU2VydmljZS5wYXJzZUZyb250bWF0dGVyKGRhdGEsIHtcbiAgICAgICAgICBtYXhZYW1sU2l6ZTogNTAwMDAsIC8vIDUwS0IgbGltaXQgZm9yIGVuc2VtYmxlIGZpbGVzXG4gICAgICAgICAgdmFsaWRhdGVDb250ZW50OiB0cnVlLFxuICAgICAgICAgIHNvdXJjZTogJ0Vuc2VtYmxlTWFuYWdlci5pbXBvcnRFbGVtZW50J1xuICAgICAgICB9KTtcblxuICAgICAgICBwYXJzZWQgPSByZXN1bHQuZGF0YTtcbiAgICAgICAgLy8gQ29udGVudCBpcyBwYXJzZWQgYnV0IG5vdCB1c2VkIGluIGVuc2VtYmxlIGNyZWF0aW9uXG4gICAgICB9XG5cbiAgICAgIC8vIFBhcnNlIG1ldGFkYXRhXG4gICAgICBjb25zdCBtZXRhZGF0YSA9IGF3YWl0IHRoaXMucGFyc2VNZXRhZGF0YShwYXJzZWQpO1xuXG4gICAgICAvLyBDcmVhdGUgZW5zZW1ibGVcbiAgICAgIGNvbnN0IGVuc2VtYmxlID0gbmV3IEVuc2VtYmxlKG1ldGFkYXRhLCBtZXRhZGF0YS5lbGVtZW50cywgdGhpcy5tZXRhZGF0YVNlcnZpY2UpO1xuXG4gICAgICAvLyBMb2cgc3VjY2Vzc2Z1bCBpbXBvcnRcbiAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgdHlwZTogRU5TRU1CTEVfU0VDVVJJVFlfRVZFTlRTLklNUE9SVEVELFxuICAgICAgICBzZXZlcml0eTogJ0xPVycsXG4gICAgICAgIHNvdXJjZTogJ0Vuc2VtYmxlTWFuYWdlci5pbXBvcnRFbGVtZW50JyxcbiAgICAgICAgZGV0YWlsczogYEltcG9ydGVkIGVuc2VtYmxlOiAke21ldGFkYXRhLm5hbWV9IHdpdGggJHttZXRhZGF0YS5lbGVtZW50cy5sZW5ndGh9IGVsZW1lbnRzYFxuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiBlbnNlbWJsZTtcblxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgIHR5cGU6IEVOU0VNQkxFX1NFQ1VSSVRZX0VWRU5UUy5JTVBPUlRFRCxcbiAgICAgICAgc2V2ZXJpdHk6ICdNRURJVU0nLFxuICAgICAgICBzb3VyY2U6ICdFbnNlbWJsZU1hbmFnZXIuaW1wb3J0RWxlbWVudCcsXG4gICAgICAgIGRldGFpbHM6IGBGYWlsZWQgdG8gaW1wb3J0IGVuc2VtYmxlOiAke2Vycm9yfWBcbiAgICAgIH0pO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gaW1wb3J0IGVuc2VtYmxlOiAke2Vycm9yfWApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBFeHBvcnQgYW4gZW5zZW1ibGUgdG8gZXh0ZXJuYWwgZm9ybWF0XG4gICAqXG4gICAqIEBwYXJhbSBlbGVtZW50IC0gRW5zZW1ibGUgdG8gZXhwb3J0XG4gICAqIEBwYXJhbSBmb3JtYXQgLSBPdXRwdXQgZm9ybWF0IChqc29uLCB5YW1sLCBtYXJrZG93bilcbiAgICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZpbmcgdG8gc2VyaWFsaXplZCBzdHJpbmdcbiAgICovXG4gIG92ZXJyaWRlIGFzeW5jIGV4cG9ydEVsZW1lbnQoXG4gICAgZWxlbWVudDogRW5zZW1ibGUsXG4gICAgZm9ybWF0OiAnanNvbicgfCAneWFtbCcgfCAnbWFya2Rvd24nID0gJ21hcmtkb3duJ1xuICApOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGlmIChmb3JtYXQgPT09ICdqc29uJykge1xuICAgICAgcmV0dXJuIGVsZW1lbnQuc2VyaWFsaXplVG9KU09OKCk7XG4gICAgfVxuXG4gICAgLy8gRm9yIFlBTUwgYW5kIE1hcmtkb3duLCB1c2UgdGhlIHNhbWUgZm9ybWF0IChmcm9udG1hdHRlciArIGNvbnRlbnQpXG4gICAgcmV0dXJuIHRoaXMuc2VyaWFsaXplRWxlbWVudChlbGVtZW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBuZXcgZW5zZW1ibGUgd2l0aCBtZXRhZGF0YVxuICAgKlxuICAgKiBAcGFyYW0gbWV0YWRhdGEgLSBQYXJ0aWFsIG1ldGFkYXRhIGZvciB0aGUgZW5zZW1ibGVcbiAgICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZpbmcgdG8gbmV3IEVuc2VtYmxlIGluc3RhbmNlXG4gICAqL1xuICBhc3luYyBjcmVhdGUobWV0YWRhdGE6IFBhcnRpYWw8RW5zZW1ibGVNZXRhZGF0YT4gJiB7IGluc3RydWN0aW9ucz86IHN0cmluZzsgY29udGVudD86IHN0cmluZyB9KTogUHJvbWlzZTxFbnNlbWJsZT4ge1xuICAgIC8vIFVzZSBzcGVjaWFsaXplZCB2YWxpZGF0b3IgZm9yIGlucHV0IHZhbGlkYXRpb25cbiAgICAvLyBOb3RlOiBlbGVtZW50X3R5cGUgcmVzb2x1dGlvbiBpcyBoYW5kbGVkIGJ5IHRoZSBoYW5kbGVyIGxheWVyIGJlZm9yZSBjYWxsaW5nIGNyZWF0ZSgpLlxuICAgIC8vIEVsZW1lbnRzIHNob3VsZCBhbHJlYWR5IGhhdmUgZWxlbWVudF90eXBlIHNldCB3aGVuIHRoZXkgYXJyaXZlIGhlcmUuXG4gICAgY29uc3QgdmFsaWRhdGlvblJlc3VsdCA9IGF3YWl0IHRoaXMudmFsaWRhdG9yLnZhbGlkYXRlQ3JlYXRlKHtcbiAgICAgIG5hbWU6IG1ldGFkYXRhLm5hbWUsXG4gICAgICBkZXNjcmlwdGlvbjogbWV0YWRhdGEuZGVzY3JpcHRpb24sXG4gICAgICBlbGVtZW50czogbWV0YWRhdGEuZWxlbWVudHMgfHwgW10sXG4gICAgICBhbGxvd05lc3RlZDogbWV0YWRhdGEuYWxsb3dOZXN0ZWQsXG4gICAgICBtYXhOZXN0aW5nRGVwdGg6IG1ldGFkYXRhLm1heE5lc3RpbmdEZXB0aFxuICAgIH0pO1xuXG4gICAgaWYgKCF2YWxpZGF0aW9uUmVzdWx0LmlzVmFsaWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVmFsaWRhdGlvbiBmYWlsZWQ6ICR7dmFsaWRhdGlvblJlc3VsdC5lcnJvcnMuam9pbignLCAnKX1gKTtcbiAgICB9XG5cbiAgICAvLyBMb2cgd2FybmluZ3MgaWYgYW55XG4gICAgaWYgKHZhbGlkYXRpb25SZXN1bHQud2FybmluZ3MgJiYgdmFsaWRhdGlvblJlc3VsdC53YXJuaW5ncy5sZW5ndGggPiAwKSB7XG4gICAgICBsb2dnZXIud2FybihgRW5zZW1ibGUgY3JlYXRpb24gd2FybmluZ3M6ICR7dmFsaWRhdGlvblJlc3VsdC53YXJuaW5ncy5qb2luKCcsICcpfWApO1xuICAgIH1cblxuICAgIC8vIEVuc3VyZSByZXF1aXJlZCBmaWVsZHNcbiAgICBpZiAoIW1ldGFkYXRhLm5hbWUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRW5zZW1ibGUgbXVzdCBoYXZlIGEgbmFtZScpO1xuICAgIH1cblxuICAgIGxldCByYXdFbGVtZW50cyA9IG1ldGFkYXRhLmVsZW1lbnRzIHx8IFtdO1xuXG4gICAgLy8gTWlncmF0ZSBsZWdhY3kgZWxlbWVudCBmaWVsZHMgKG5hbWUgLT4gZWxlbWVudF9uYW1lLCB0eXBlIC0+IGVsZW1lbnRfdHlwZSlcbiAgICAvLyBUaGlzIGVuc3VyZXMgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgd2l0aCBBUEkgY2FsbHMgdXNpbmcgb2xkIGZpZWxkIG5hbWVzXG4gICAgY29uc3QgbWlncmF0ZWRFbGVtZW50czogRW5zZW1ibGVFbGVtZW50W10gPSByYXdFbGVtZW50cy5tYXAoKGVsZW06IGFueSwgaW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgLy8gU3VwcG9ydCBib3RoIGVsZW1lbnRfbmFtZSAobmV3IHN0YW5kYXJkKSBhbmQgbmFtZSAobGVnYWN5KVxuICAgICAgY29uc3QgZWxlbWVudE5hbWUgPSBlbGVtLmVsZW1lbnRfbmFtZSB8fCBlbGVtLm5hbWU7XG4gICAgICBpZiAoIWVsZW1lbnROYW1lKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRWxlbWVudCBhdCBpbmRleCAke2luZGV4fSBtdXN0IGhhdmUgZWxlbWVudF9uYW1lIChvciBuYW1lIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSlgKTtcbiAgICAgIH1cbiAgICAgIC8vIExvZyBkZXByZWNhdGlvbiB3YXJuaW5nIGlmIHVzaW5nIGxlZ2FjeSAnbmFtZScgZmllbGRcbiAgICAgIGlmIChlbGVtLm5hbWUgJiYgIWVsZW0uZWxlbWVudF9uYW1lKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKGBFbnNlbWJsZSBlbGVtZW50IGF0IGluZGV4ICR7aW5kZXh9IHVzZXMgZGVwcmVjYXRlZCAnbmFtZScgZmllbGQuIFVzZSAnZWxlbWVudF9uYW1lJyBpbnN0ZWFkLmApO1xuICAgICAgfVxuXG4gICAgICAvLyBTdXBwb3J0IGJvdGggZWxlbWVudF90eXBlIChuZXcgc3RhbmRhcmQpIGFuZCB0eXBlIChsZWdhY3kpXG4gICAgICAvLyBJc3N1ZSAjNDY2OiBObyBsb25nZXIgZGVmYXVsdHMgdG8gJ3NraWxsJyDigJQgY2FsbGVycyBtdXN0IHByb3ZpZGUgdHlwZVxuICAgICAgLy8gb3IgcGFzcyBtYW5hZ2VycyBmb3IgcG9ydGZvbGlvIHJlc29sdXRpb25cbiAgICAgIGNvbnN0IGVsZW1lbnRUeXBlID0gZWxlbS5lbGVtZW50X3R5cGUgfHwgZWxlbS50eXBlO1xuICAgICAgaWYgKCFlbGVtZW50VHlwZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYEVsZW1lbnQgJyR7ZWxlbWVudE5hbWV9JyBhdCBpbmRleCAke2luZGV4fSBoYXMgbm8gZWxlbWVudF90eXBlLiBgICtcbiAgICAgICAgICBgUHJvdmlkZSBlbGVtZW50X3R5cGUgZXhwbGljaXRseSBvciBlbnN1cmUgdGhlIGVsZW1lbnQgZXhpc3RzIGluIHRoZSBwb3J0Zm9saW8uYFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgLy8gTG9nIGRlcHJlY2F0aW9uIHdhcm5pbmcgaWYgdXNpbmcgbGVnYWN5ICd0eXBlJyBmaWVsZFxuICAgICAgaWYgKGVsZW0udHlwZSAmJiAhZWxlbS5lbGVtZW50X3R5cGUpIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oYEVuc2VtYmxlIGVsZW1lbnQgYXQgaW5kZXggJHtpbmRleH0gdXNlcyBkZXByZWNhdGVkICd0eXBlJyBmaWVsZC4gVXNlICdlbGVtZW50X3R5cGUnIGluc3RlYWQuYCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGVsZW1lbnRfbmFtZTogZWxlbWVudE5hbWUsXG4gICAgICAgIGVsZW1lbnRfdHlwZTogZWxlbWVudFR5cGUsXG4gICAgICAgIHJvbGU6IGVsZW0ucm9sZSB8fCBFTlNFTUJMRV9ERUZBVUxUUy5FTEVNRU5UX1JPTEUsXG4gICAgICAgIHByaW9yaXR5OiBlbGVtLnByaW9yaXR5ID8/IEVOU0VNQkxFX0RFRkFVTFRTLlBSSU9SSVRZLFxuICAgICAgICBhY3RpdmF0aW9uOiBlbGVtLmFjdGl2YXRpb24gfHwgJ2Fsd2F5cycsXG4gICAgICAgIGNvbmRpdGlvbjogZWxlbS5jb25kaXRpb24sXG4gICAgICAgIGRlcGVuZGVuY2llczogZWxlbS5kZXBlbmRlbmNpZXMsXG4gICAgICAgIHB1cnBvc2U6IGVsZW0ucHVycG9zZVxuICAgICAgfSBhcyBFbnNlbWJsZUVsZW1lbnQ7XG4gICAgfSk7XG5cbiAgICAvLyBTZXQgZGVmYXVsdHMgZm9yIG9wdGlvbmFsIGZpZWxkc1xuICAgIGNvbnN0IGZ1bGxNZXRhZGF0YTogRW5zZW1ibGVNZXRhZGF0YSA9IHtcbiAgICAgIG5hbWU6IG1ldGFkYXRhLm5hbWUsXG4gICAgICBkZXNjcmlwdGlvbjogbWV0YWRhdGEuZGVzY3JpcHRpb24gfHwgJycsXG4gICAgICB2ZXJzaW9uOiBtZXRhZGF0YS52ZXJzaW9uIHx8ICcxLjAuMCcsXG4gICAgICBhdXRob3I6IG1ldGFkYXRhLmF1dGhvcixcbiAgICAgIGNyZWF0ZWQ6IG1ldGFkYXRhLmNyZWF0ZWQgfHwgbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgICAgbW9kaWZpZWQ6IG1ldGFkYXRhLm1vZGlmaWVkIHx8IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgIHRhZ3M6IG1ldGFkYXRhLnRhZ3MgfHwgW10sXG4gICAgICBhY3RpdmF0aW9uU3RyYXRlZ3k6IG1ldGFkYXRhLmFjdGl2YXRpb25TdHJhdGVneSB8fCAobWV0YWRhdGEgYXMgYW55KS5hY3RpdmF0aW9uX3N0cmF0ZWd5IHx8IEVOU0VNQkxFX0RFRkFVTFRTLkFDVElWQVRJT05fU1RSQVRFR1ksXG4gICAgICBjb25mbGljdFJlc29sdXRpb246IG1ldGFkYXRhLmNvbmZsaWN0UmVzb2x1dGlvbiB8fCAobWV0YWRhdGEgYXMgYW55KS5jb25mbGljdF9yZXNvbHV0aW9uIHx8IEVOU0VNQkxFX0RFRkFVTFRTLkNPTkZMSUNUX1JFU09MVVRJT04sXG4gICAgICBjb250ZXh0U2hhcmluZzogbWV0YWRhdGEuY29udGV4dFNoYXJpbmcgfHwgRU5TRU1CTEVfREVGQVVMVFMuQ09OVEVYVF9TSEFSSU5HLFxuICAgICAgcmVzb3VyY2VMaW1pdHM6IG1ldGFkYXRhLnJlc291cmNlTGltaXRzLFxuICAgICAgYWxsb3dOZXN0ZWQ6IG1ldGFkYXRhLmFsbG93TmVzdGVkID8/IEVOU0VNQkxFX0RFRkFVTFRTLkFMTE9XX05FU1RFRCxcbiAgICAgIG1heE5lc3RpbmdEZXB0aDogbWV0YWRhdGEubWF4TmVzdGluZ0RlcHRoIHx8IEVOU0VNQkxFX0RFRkFVTFRTLk1BWF9ORVNUSU5HX0RFUFRILFxuICAgICAgZWxlbWVudHM6IG1pZ3JhdGVkRWxlbWVudHMsXG4gICAgICAvLyBJc3N1ZSAjNTI0IOKAlCBHYXRla2VlcGVyIHBvbGljeSAoc3ltbWV0cmljIHdpdGggYnVpbGRNZXRhZGF0YSBkZXNlcmlhbGl6YXRpb24pXG4gICAgICBnYXRla2VlcGVyOiBzYW5pdGl6ZUdhdGVrZWVwZXJQb2xpY3koKG1ldGFkYXRhIGFzIGFueSkuZ2F0ZWtlZXBlciwgbWV0YWRhdGEubmFtZSEsICdlbnNlbWJsZScsIG1ldGFkYXRhIGFzIHVua25vd24gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pLFxuICAgIH07XG5cbiAgICAvLyBVc2UgaW5oZXJpdGVkIGdldEVsZW1lbnRGaWxlbmFtZSgpIGZvciBjb25zaXN0ZW50IGZpbGVuYW1lIG5vcm1hbGl6YXRpb25cbiAgICBjb25zdCBmaWxlbmFtZSA9IHRoaXMuZ2V0RWxlbWVudEZpbGVuYW1lKGZ1bGxNZXRhZGF0YS5uYW1lKTtcblxuICAgIC8vIElzc3VlICM2MTM6IENoZWNrIG1ldGFkYXRhIG5hbWUgdW5pcXVlbmVzcyAobm90IGp1c3QgZmlsZW5hbWUpXG4gICAgY29uc3QgZXhpc3RpbmdFbnNlbWJsZXMgPSBhd2FpdCB0aGlzLmxpc3QoKTtcbiAgICBjb25zdCBkdXBsaWNhdGUgPSBleGlzdGluZ0Vuc2VtYmxlcy5maW5kKGUgPT5cbiAgICAgIGUubWV0YWRhdGEubmFtZS50b0xvd2VyQ2FzZSgpID09PSBmdWxsTWV0YWRhdGEubmFtZS50b0xvd2VyQ2FzZSgpXG4gICAgKTtcbiAgICBpZiAoZHVwbGljYXRlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEFuIGVuc2VtYmxlIG5hbWVkIFwiJHtmdWxsTWV0YWRhdGEubmFtZX1cIiBhbHJlYWR5IGV4aXN0c2ApO1xuICAgIH1cblxuICAgIC8vIENyZWF0ZSBlbnNlbWJsZVxuICAgIGNvbnN0IGVuc2VtYmxlID0gbmV3IEVuc2VtYmxlKGZ1bGxNZXRhZGF0YSwgZnVsbE1ldGFkYXRhLmVsZW1lbnRzLCB0aGlzLm1ldGFkYXRhU2VydmljZSk7XG5cbiAgICAvLyBTZXQgaW5zdHJ1Y3Rpb25zIGFuZCBjb250ZW50IGlmIHByb3ZpZGVkICh2Mi4wIGR1YWwtZmllbGQgYXJjaGl0ZWN0dXJlKVxuICAgIGlmIChtZXRhZGF0YS5pbnN0cnVjdGlvbnMpIHtcbiAgICAgIGVuc2VtYmxlLmluc3RydWN0aW9ucyA9IG1ldGFkYXRhLmluc3RydWN0aW9ucztcbiAgICB9XG4gICAgaWYgKG1ldGFkYXRhLmNvbnRlbnQpIHtcbiAgICAgIGVuc2VtYmxlLmNvbnRlbnQgPSBtZXRhZGF0YS5jb250ZW50O1xuICAgIH1cblxuICAgIC8vIFNhdmUgdG8gZGlza1xuICAgIGF3YWl0IHRoaXMuc2F2ZShlbnNlbWJsZSwgZmlsZW5hbWUpO1xuICAgIC8vIE5vdGU6IE5vIHJlbG9hZCgpIGhlcmUg4oCUIHNhdmUoKSBjYWNoZXMgdGhlIGVsZW1lbnQgY29ycmVjdGx5LlxuICAgIC8vIFNlZSBJc3N1ZSAjNDkxIGZvciB3aHkgUGVyc29uYU1hbmFnZXIncyByZWxvYWQtYWZ0ZXItY3JlYXRlIHdhcyByZW1vdmVkLlxuXG4gICAgLy8gTG9nIGNyZWF0aW9uXG4gICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgdHlwZTogRU5TRU1CTEVfU0VDVVJJVFlfRVZFTlRTLlNBVkVELFxuICAgICAgc2V2ZXJpdHk6ICdMT1cnLFxuICAgICAgc291cmNlOiAnRW5zZW1ibGVNYW5hZ2VyLmNyZWF0ZScsXG4gICAgICBkZXRhaWxzOiBgQ3JlYXRlZCBlbnNlbWJsZTogJHtmdWxsTWV0YWRhdGEubmFtZX1gXG4gICAgfSk7XG5cbiAgICByZXR1cm4gZW5zZW1ibGU7XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGUgYW4gZW5zZW1ibGVcbiAgICogRGVsZWdhdGVzIHRvIGVuc2VtYmxlJ3Mgb3duIHZhbGlkYXRlIG1ldGhvZFxuICAgKlxuICAgKiBAcGFyYW0gZWxlbWVudCAtIEVuc2VtYmxlIHRvIHZhbGlkYXRlXG4gICAqIEByZXR1cm5zIFZhbGlkYXRpb24gcmVzdWx0XG4gICAqL1xuICBvdmVycmlkZSB2YWxpZGF0ZShlbGVtZW50OiBFbnNlbWJsZSk6IEVsZW1lbnRWYWxpZGF0aW9uUmVzdWx0IHtcbiAgICByZXR1cm4gZWxlbWVudC52YWxpZGF0ZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIE92ZXJyaWRlIHNhdmUgdG8gdmFsaWRhdGUgYmVmb3JlIHBlcnNpc3RpbmdcbiAgICovXG4gIG92ZXJyaWRlIGFzeW5jIHNhdmUoZWxlbWVudDogRW5zZW1ibGUsIGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyBWYWxpZGF0ZSBlbnNlbWJsZSBiZWZvcmUgc2F2aW5nXG4gICAgY29uc3QgdmFsaWRhdGlvblJlc3VsdCA9IHRoaXMudmFsaWRhdGUoZWxlbWVudCk7XG4gICAgaWYgKCF2YWxpZGF0aW9uUmVzdWx0LnZhbGlkKSB7XG4gICAgICBjb25zdCBlcnJvcnMgPSB2YWxpZGF0aW9uUmVzdWx0LmVycm9ycz8ubWFwKGUgPT4gZS5tZXNzYWdlKS5qb2luKCcsICcpIHx8ICdVbmtub3duIHZhbGlkYXRpb24gZXJyb3InO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3Qgc2F2ZSBpbnZhbGlkIGVuc2VtYmxlOiAke2Vycm9yc31gKTtcbiAgICB9XG5cbiAgICAvLyBDYWxsIGJhc2UgaW1wbGVtZW50YXRpb25cbiAgICBhd2FpdCBzdXBlci5zYXZlKGVsZW1lbnQsIGZpbGVQYXRoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBPdmVycmlkZSBkZWxldGUgdG8gYWRkIGVuc2VtYmxlLXNwZWNpZmljIGxvZ2dpbmdcbiAgICovXG4gIG92ZXJyaWRlIGFzeW5jIGRlbGV0ZShmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgdHlwZTogRU5TRU1CTEVfU0VDVVJJVFlfRVZFTlRTLkRFTEVURUQsXG4gICAgICBzZXZlcml0eTogJ01FRElVTScsXG4gICAgICBzb3VyY2U6ICdFbnNlbWJsZU1hbmFnZXIuZGVsZXRlJyxcbiAgICAgIGRldGFpbHM6IGBEZWxldGluZyBlbnNlbWJsZTogJHtmaWxlUGF0aH1gXG4gICAgfSk7XG5cbiAgICBhd2FpdCBzdXBlci5kZWxldGUoZmlsZVBhdGgpO1xuXG4gICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgdHlwZTogRU5TRU1CTEVfU0VDVVJJVFlfRVZFTlRTLkRFTEVURUQsXG4gICAgICBzZXZlcml0eTogJ0xPVycsXG4gICAgICBzb3VyY2U6ICdFbnNlbWJsZU1hbmFnZXIuZGVsZXRlJyxcbiAgICAgIGRldGFpbHM6IGBTdWNjZXNzZnVsbHkgZGVsZXRlZCBlbnNlbWJsZTogJHtmaWxlUGF0aH1gXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogT3ZlcnJpZGUgbGlzdCB0byBhcHBseSBhY3RpdmUgc3RhdHVzIGJhc2VkIG9uIGFjdGl2ZUVuc2VtYmxlTmFtZXMgc2V0XG4gICAqL1xuICBvdmVycmlkZSBhc3luYyBsaXN0KCk6IFByb21pc2U8RW5zZW1ibGVbXT4ge1xuICAgIGNvbnN0IGVuc2VtYmxlcyA9IGF3YWl0IHN1cGVyLmxpc3QoKTtcblxuICAgIC8vIEFwcGx5IEFDVElWRSBzdGF0dXMgdG8gZW5zZW1ibGVzIGluIHRoZSBhY3RpdmVFbnNlbWJsZU5hbWVzIHNldFxuICAgIGZvciAoY29uc3QgZW5zZW1ibGUgb2YgZW5zZW1ibGVzKSB7XG4gICAgICBpZiAodGhpcy5hY3RpdmVFbnNlbWJsZU5hbWVzLmhhcyhlbnNlbWJsZS5tZXRhZGF0YS5uYW1lKSkge1xuICAgICAgICAvLyBDYWxsIGFjdGl2YXRlKCkgdG8gc2V0IHN0YXR1cyB0byBBQ1RJVkVcbiAgICAgICAgYXdhaXQgZW5zZW1ibGUuYWN0aXZhdGUoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZW5zZW1ibGVzO1xuICB9XG5cbiAgLyoqXG4gICAqIEFjdGl2YXRlIGFuIGVuc2VtYmxlIGJ5IG5hbWUgb3IgaWRlbnRpZmllclxuICAgKlxuICAgKiBJc3N1ZSAjMjQgKExPVyBQUklPUklUWSk6IFBlcmZvcm1hbmNlIG9wdGltaXphdGlvbiB1c2luZyBmaW5kQnlOYW1lKClcbiAgICogSXNzdWUgIzI0IChMT1cgUFJJT1JJVFkpOiBDb25zaXN0ZW50IGVycm9yIG1lc3NhZ2VzIHVzaW5nIEVsZW1lbnRNZXNzYWdlc1xuICAgKiBJc3N1ZSAjMjQgKExPVyBQUklPUklUWSk6IENsZWFudXAgdHJpZ2dlciBmb3IgbWVtb3J5IGxlYWsgcHJldmVudGlvblxuICAgKlxuICAgKiBAcGFyYW0gaWRlbnRpZmllciAtIEVuc2VtYmxlIG5hbWUgb3IgaWRlbnRpZmllclxuICAgKiBAcmV0dXJucyBBY3RpdmF0aW9uIHJlc3VsdCB3aXRoIHN1Y2Nlc3Mgc3RhdHVzIGFuZCBtZXNzYWdlXG4gICAqL1xuICBhc3luYyBhY3RpdmF0ZUVuc2VtYmxlKGlkZW50aWZpZXI6IHN0cmluZyk6IFByb21pc2U8eyBzdWNjZXNzOiBib29sZWFuOyBtZXNzYWdlOiBzdHJpbmc7IGVuc2VtYmxlPzogRW5zZW1ibGUgfT4ge1xuICAgIC8vIEV2aWN0IHN0YWxlIGNhY2hlIGJlZm9yZSBsb29rdXAgc28gZXh0ZXJuYWwgZmlsZSBlZGl0cyBhcmUgcGlja2VkIHVwICgjMTg5NSkuXG4gICAgLy8gZmluZEJ5TmFtZSgpIGhpdHMgdGhlIExSVSBjYWNoZSBmaXJzdCBhbmQgbmV2ZXIgY2FsbHMgbGlzdCgpLCBzbyB3aXRob3V0IHRoaXNcbiAgICAvLyB0aGUgc2NhbiBjb29sZG93biBwcmV2ZW50cyBtdGltZS1iYXNlZCBldmljdGlvbiBmcm9tIHJ1bm5pbmcuXG4gICAgYXdhaXQgdGhpcy5zY2FuQW5kRXZpY3QoKTtcblxuICAgIC8vIFBFUkZPUk1BTkNFIEZJWDogVXNlIGZpbmRCeU5hbWUoKSBpbnN0ZWFkIG9mIGxpc3QoKVxuICAgIGNvbnN0IGVuc2VtYmxlID0gYXdhaXQgdGhpcy5maW5kQnlOYW1lKGlkZW50aWZpZXIpO1xuXG4gICAgaWYgKCFlbnNlbWJsZSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgIC8vIENPTlNJU1RFTkNZIEZJWDogVXNlIHN0YW5kYXJkaXplZCBlcnJvciBtZXNzYWdlIGZvcm1hdFxuICAgICAgICBtZXNzYWdlOiBFbGVtZW50TWVzc2FnZXMubm90Rm91bmQoRWxlbWVudFR5cGUuRU5TRU1CTEUsIGlkZW50aWZpZXIpXG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vIE1FTU9SWSBMRUFLIEZJWDogQ2hlY2sgaWYgY2xlYW51cCBpcyBuZWVkZWQgYmVmb3JlIGFkZGluZ1xuICAgIHRoaXMuY2hlY2tBbmRDbGVhbnVwQWN0aXZlU2V0KCk7XG5cbiAgICB0aGlzLmFjdGl2ZUVuc2VtYmxlTmFtZXMuYWRkKGVuc2VtYmxlLm1ldGFkYXRhLm5hbWUpO1xuXG4gICAgLy8gU2V0IGVuc2VtYmxlIHN0YXR1cyB0byBhY3RpdmVcbiAgICBhd2FpdCBlbnNlbWJsZS5hY3RpdmF0ZSgpO1xuXG4gICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgdHlwZTogJ0VMRU1FTlRfQ1JFQVRFRCcsXG4gICAgICBzZXZlcml0eTogJ0xPVycsXG4gICAgICBzb3VyY2U6ICdFbnNlbWJsZU1hbmFnZXIuYWN0aXZhdGVFbnNlbWJsZScsXG4gICAgICBkZXRhaWxzOiBgRW5zZW1ibGUgYWN0aXZhdGVkOiAke2Vuc2VtYmxlLm1ldGFkYXRhLm5hbWV9YFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHN1Y2Nlc3M6IHRydWUsXG4gICAgICAvLyBDT05TSVNURU5DWSBGSVg6IFVzZSBzdGFuZGFyZGl6ZWQgc3VjY2VzcyBtZXNzYWdlIGZvcm1hdFxuICAgICAgbWVzc2FnZTogRWxlbWVudE1lc3NhZ2VzLmFjdGl2YXRlZChFbGVtZW50VHlwZS5FTlNFTUJMRSwgZW5zZW1ibGUubWV0YWRhdGEubmFtZSksXG4gICAgICBlbnNlbWJsZVxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogRGVhY3RpdmF0ZSBhbiBlbnNlbWJsZSBieSBuYW1lIG9yIGlkZW50aWZpZXJcbiAgICpcbiAgICogSXNzdWUgIzI0IChMT1cgUFJJT1JJVFkpOiBQZXJmb3JtYW5jZSBvcHRpbWl6YXRpb24gdXNpbmcgZmluZEJ5TmFtZSgpXG4gICAqIElzc3VlICMyNCAoTE9XIFBSSU9SSVRZKTogQ29uc2lzdGVudCBlcnJvciBtZXNzYWdlcyB1c2luZyBFbGVtZW50TWVzc2FnZXNcbiAgICpcbiAgICogQHBhcmFtIGlkZW50aWZpZXIgLSBFbnNlbWJsZSBuYW1lIG9yIGlkZW50aWZpZXJcbiAgICogQHJldHVybnMgRGVhY3RpdmF0aW9uIHJlc3VsdCB3aXRoIHN1Y2Nlc3Mgc3RhdHVzIGFuZCBtZXNzYWdlXG4gICAqL1xuICBhc3luYyBkZWFjdGl2YXRlRW5zZW1ibGUoaWRlbnRpZmllcjogc3RyaW5nKTogUHJvbWlzZTx7IHN1Y2Nlc3M6IGJvb2xlYW47IG1lc3NhZ2U6IHN0cmluZzsgZW5zZW1ibGU/OiBFbnNlbWJsZSB9PiB7XG4gICAgLy8gTm8gc2NhbkFuZEV2aWN0KCkgaGVyZSDigJQgaW50ZW50aW9uYWwuIERlYWN0aXZhdGlvbiBvbmx5IG5lZWRzIHRoZSBlbnNlbWJsZSdzXG4gICAgLy8gbmFtZSAodG8gcmVtb3ZlIGZyb20gYWN0aXZlRW5zZW1ibGVOYW1lcykgYW5kIGNhbGxzIGRlYWN0aXZhdGUoKSB3aGljaCBzZXRzXG4gICAgLy8gYSBzdGF0dXMgZmxhZy4gSXQgZG9lcyBub3QgY29uc3VtZSB0aGUgZWxlbWVudHMgbGlzdCwgc28gc3RhbGUgY2FjaGVkIGVsZW1lbnRcbiAgICAvLyBkYXRhIGhhcyBubyBlZmZlY3Qgb24gY29ycmVjdG5lc3MuIENvbXBhcmUgd2l0aCBhY3RpdmF0ZUVuc2VtYmxlKCksIHdoaWNoXG4gICAgLy8gaW5nZXN0cyB0aGUgZnVsbCBlbGVtZW50IGxpc3QgdG8gb3JjaGVzdHJhdGUgc3ViLWVsZW1lbnQgbG9hZGluZyBhbmQgbXVzdFxuICAgIC8vIHRoZXJlZm9yZSBzZWUgdGhlIGxhdGVzdCBvbi1kaXNrIGRlZmluaXRpb24uICgjMTg5NSlcblxuICAgIC8vIFBFUkZPUk1BTkNFIEZJWDogVXNlIGZpbmRCeU5hbWUoKSBpbnN0ZWFkIG9mIGxpc3QoKVxuICAgIGNvbnN0IGVuc2VtYmxlID0gYXdhaXQgdGhpcy5maW5kQnlOYW1lKGlkZW50aWZpZXIpO1xuXG4gICAgaWYgKCFlbnNlbWJsZSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgIC8vIENPTlNJU1RFTkNZIEZJWDogVXNlIHN0YW5kYXJkaXplZCBlcnJvciBtZXNzYWdlIGZvcm1hdFxuICAgICAgICBtZXNzYWdlOiBFbGVtZW50TWVzc2FnZXMubm90Rm91bmQoRWxlbWVudFR5cGUuRU5TRU1CTEUsIGlkZW50aWZpZXIpXG4gICAgICB9O1xuICAgIH1cblxuICAgIHRoaXMuYWN0aXZlRW5zZW1ibGVOYW1lcy5kZWxldGUoZW5zZW1ibGUubWV0YWRhdGEubmFtZSk7XG5cbiAgICAvLyBTZXQgZW5zZW1ibGUgc3RhdHVzIHRvIGluYWN0aXZlXG4gICAgYXdhaXQgZW5zZW1ibGUuZGVhY3RpdmF0ZSgpO1xuXG4gICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgdHlwZTogJ0VMRU1FTlRfQ1JFQVRFRCcsXG4gICAgICBzZXZlcml0eTogJ0xPVycsXG4gICAgICBzb3VyY2U6ICdFbnNlbWJsZU1hbmFnZXIuZGVhY3RpdmF0ZUVuc2VtYmxlJyxcbiAgICAgIGRldGFpbHM6IGBFbnNlbWJsZSBkZWFjdGl2YXRlZDogJHtlbnNlbWJsZS5tZXRhZGF0YS5uYW1lfWBcbiAgICB9KTtcblxuICAgIHJldHVybiB7XG4gICAgICBzdWNjZXNzOiB0cnVlLFxuICAgICAgLy8gQ09OU0lTVEVOQ1kgRklYOiBVc2Ugc3RhbmRhcmRpemVkIHN1Y2Nlc3MgbWVzc2FnZSBmb3JtYXRcbiAgICAgIG1lc3NhZ2U6IEVsZW1lbnRNZXNzYWdlcy5kZWFjdGl2YXRlZChFbGVtZW50VHlwZS5FTlNFTUJMRSwgZW5zZW1ibGUubWV0YWRhdGEubmFtZSksXG4gICAgICBlbnNlbWJsZVxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogR2V0IGFsbCBhY3RpdmUgZW5zZW1ibGVzXG4gICAqXG4gICAqIEByZXR1cm5zIExpc3Qgb2YgYWN0aXZlIGVuc2VtYmxlc1xuICAgKi9cbiAgYXN5bmMgZ2V0QWN0aXZlRW5zZW1ibGVzKCk6IFByb21pc2U8RW5zZW1ibGVbXT4ge1xuICAgIGNvbnN0IHJlc3VsdHM6IEVuc2VtYmxlW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IG5hbWUgb2YgdGhpcy5hY3RpdmVFbnNlbWJsZU5hbWVzKSB7XG4gICAgICBjb25zdCBlbnNlbWJsZSA9IGF3YWl0IHRoaXMuZmluZEJ5TmFtZShuYW1lKTtcbiAgICAgIGlmIChlbnNlbWJsZSkgcmVzdWx0cy5wdXNoKGVuc2VtYmxlKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdHM7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgYWN0aXZlIHNldCBjbGVhbnVwIGlzIG5lZWRlZCBhbmQgcGVyZm9ybSBjbGVhbnVwIGlmIG5lY2Vzc2FyeVxuICAgKiBJc3N1ZSAjMjQgKExPVyBQUklPUklUWSk6IE1lbW9yeSBsZWFrIHByZXZlbnRpb25cbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgY2hlY2tBbmRDbGVhbnVwQWN0aXZlU2V0KCk6IHZvaWQge1xuICAgIGNvbnN0IHsgbWF4LCBjbGVhbnVwVGhyZXNob2xkIH0gPSBnZXRBY3RpdmVFbGVtZW50TGltaXRDb25maWcoJ2Vuc2VtYmxlcycpO1xuXG4gICAgLy8gQmVsb3cgdGhyZXNob2xkIOKAlCBubyBhY3Rpb24gbmVlZGVkXG4gICAgaWYgKHRoaXMuYWN0aXZlRW5zZW1ibGVOYW1lcy5zaXplIDwgY2xlYW51cFRocmVzaG9sZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIEF0IG9yIGFib3ZlIG1heCDigJQgd2FybiBiZWZvcmUgY2xlYW51cFxuICAgIGlmICh0aGlzLmFjdGl2ZUVuc2VtYmxlTmFtZXMuc2l6ZSA+PSBtYXgpIHtcbiAgICAgIGxvZ2dlci53YXJuKFxuICAgICAgICBgQWN0aXZlIGVuc2VtYmxlcyBsaW1pdCByZWFjaGVkICgke21heH0pLiBgICtcbiAgICAgICAgYENvbnNpZGVyIGRlYWN0aXZhdGluZyB1bnVzZWQgZW5zZW1ibGVzIG9yIHNldHRpbmcgRE9MTEhPVVNFX01BWF9BQ1RJVkVfRU5TRU1CTEVTIHRvIGEgaGlnaGVyIHZhbHVlLmBcbiAgICAgICk7XG5cbiAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgdHlwZTogJ0VMRU1FTlRfQ1JFQVRFRCcsXG4gICAgICAgIHNldmVyaXR5OiAnTUVESVVNJyxcbiAgICAgICAgc291cmNlOiAnRW5zZW1ibGVNYW5hZ2VyLmNoZWNrQW5kQ2xlYW51cEFjdGl2ZVNldCcsXG4gICAgICAgIGRldGFpbHM6IGBBY3RpdmUgZW5zZW1ibGVzIGxpbWl0IHJlYWNoZWQ6ICR7dGhpcy5hY3RpdmVFbnNlbWJsZU5hbWVzLnNpemV9LyR7bWF4fWBcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIEF0IG9yIGFib3ZlIHRocmVzaG9sZCDigJQgcHJvYWN0aXZlbHkgY2xlYW4gc3RhbGUgZW50cmllc1xuICAgIHZvaWQgdGhpcy5jbGVhbnVwU3RhbGVBY3RpdmVFbnNlbWJsZXMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhbiB1cCBzdGFsZSBlbnRyaWVzIGZyb20gYWN0aXZlIGVuc2VtYmxlcyBzZXRcbiAgICogSXNzdWUgIzI0IChMT1cgUFJJT1JJVFkpOiBNZW1vcnkgbGVhayBwcmV2ZW50aW9uXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGNsZWFudXBTdGFsZUFjdGl2ZUVuc2VtYmxlcygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgc3RhcnRTaXplID0gdGhpcy5hY3RpdmVFbnNlbWJsZU5hbWVzLnNpemU7XG4gICAgICBjb25zdCBlbnNlbWJsZXMgPSBhd2FpdCB0aGlzLmxpc3QoKTtcbiAgICAgIGNvbnN0IGV4aXN0aW5nRW5zZW1ibGVOYW1lcyA9IG5ldyBTZXQoZW5zZW1ibGVzLm1hcChlID0+IGUubWV0YWRhdGEubmFtZSkpO1xuXG4gICAgICBjb25zdCBzdGFsZU5hbWVzOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgZm9yIChjb25zdCBhY3RpdmVOYW1lIG9mIHRoaXMuYWN0aXZlRW5zZW1ibGVOYW1lcykge1xuICAgICAgICBpZiAoIWV4aXN0aW5nRW5zZW1ibGVOYW1lcy5oYXMoYWN0aXZlTmFtZSkpIHtcbiAgICAgICAgICB0aGlzLmFjdGl2ZUVuc2VtYmxlTmFtZXMuZGVsZXRlKGFjdGl2ZU5hbWUpO1xuICAgICAgICAgIHN0YWxlTmFtZXMucHVzaChhY3RpdmVOYW1lKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCBlbmRTaXplID0gdGhpcy5hY3RpdmVFbnNlbWJsZU5hbWVzLnNpemU7XG4gICAgICBjb25zdCByZW1vdmVkID0gc3RhcnRTaXplIC0gZW5kU2l6ZTtcblxuICAgICAgaWYgKHJlbW92ZWQgPiAwKSB7XG4gICAgICAgIGxvZ2dlci5pbmZvKFxuICAgICAgICAgIGBDbGVhbmVkIHVwICR7cmVtb3ZlZH0gc3RhbGUgYWN0aXZlIGVuc2VtYmxlIHJlZmVyZW5jZShzKS4gYCArXG4gICAgICAgICAgYEFjdGl2ZSBlbnNlbWJsZXM6ICR7ZW5kU2l6ZX0vJHtnZXRNYXhBY3RpdmVMaW1pdCgnZW5zZW1ibGVzJyl9YFxuICAgICAgICApO1xuXG4gICAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgICB0eXBlOiAnRUxFTUVOVF9ERUxFVEVEJyxcbiAgICAgICAgICBzZXZlcml0eTogJ0xPVycsXG4gICAgICAgICAgc291cmNlOiAnRW5zZW1ibGVNYW5hZ2VyLmNsZWFudXBTdGFsZUFjdGl2ZUVuc2VtYmxlcycsXG4gICAgICAgICAgZGV0YWlsczogYFJlbW92ZWQgJHtyZW1vdmVkfSBzdGFsZSBhY3RpdmUgZW5zZW1ibGUgcmVmZXJlbmNlc2AsXG4gICAgICAgICAgYWRkaXRpb25hbERhdGE6IHtcbiAgICAgICAgICAgIHJlbW92ZWRDb3VudDogcmVtb3ZlZCxcbiAgICAgICAgICAgIGFjdGl2ZUNvdW50OiBlbmRTaXplLFxuICAgICAgICAgICAgc3RhbGVOYW1lczogc3RhbGVOYW1lcy5qb2luKCcsICcpXG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbG9nZ2VyLmVycm9yKCdGYWlsZWQgdG8gY2xlYW51cCBzdGFsZSBhY3RpdmUgZW5zZW1ibGVzOicsIGVycm9yKTtcblxuICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICB0eXBlOiAnRUxFTUVOVF9ERUxFVEVEJyxcbiAgICAgICAgc2V2ZXJpdHk6ICdMT1cnLFxuICAgICAgICBzb3VyY2U6ICdFbnNlbWJsZU1hbmFnZXIuY2xlYW51cFN0YWxlQWN0aXZlRW5zZW1ibGVzJyxcbiAgICAgICAgZGV0YWlsczogYENsZWFudXAgZmFpbGVkOiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKX1gXG4gICAgICB9KTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
|