@dollhousemcp/mcp-server 2.0.4 → 2.0.5
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 +8 -0
- package/dist/generated/version.d.ts +2 -2
- package/dist/generated/version.js +3 -3
- package/dist/index.js +7 -1
- package/dist/utils/logger.d.ts +7 -0
- package/dist/utils/logger.d.ts.map +1 -1
- package/dist/utils/logger.js +13 -3
- package/dist/web/console/LeaderElection.d.ts +10 -0
- package/dist/web/console/LeaderElection.d.ts.map +1 -1
- package/dist/web/console/LeaderElection.js +44 -1
- package/dist/web/console/LeaderForwardingSink.d.ts +3 -1
- package/dist/web/console/LeaderForwardingSink.d.ts.map +1 -1
- package/dist/web/console/LeaderForwardingSink.js +24 -6
- package/dist/web/console/UnifiedConsole.d.ts.map +1 -1
- package/dist/web/console/UnifiedConsole.js +12 -3
- package/dist/web/server.d.ts.map +1 -1
- package/dist/web/server.js +3 -2
- package/package.json +1 -1
- package/server.json +2 -2
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,13 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [2.0.5] - 2026-04-02
|
|
4
|
+
|
|
5
|
+
### Hotfix: `--web` mode UX improvements
|
|
6
|
+
|
|
7
|
+
- **Fix**: Browser now auto-opens on `--web` startup (was blocked by security check on `dollhouse.localhost` URL — now uses `127.0.0.1`)
|
|
8
|
+
- **Fix**: Debug log spam suppressed in `--web` mode — only info/warn/error print to terminal unless `DOLLHOUSE_DEBUG` is set
|
|
9
|
+
- **Fix**: Follower log forwarding gives up after 5 failed attempts instead of retrying forever (issue #1751)
|
|
10
|
+
|
|
3
11
|
## [2.0.4] - 2026-04-02
|
|
4
12
|
|
|
5
13
|
### Hotfix: npm package missing web assets
|
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
* Auto-generated file - DO NOT EDIT
|
|
3
3
|
* Generated at build time by scripts/generate-version.js
|
|
4
4
|
*/
|
|
5
|
-
export declare const PACKAGE_VERSION = "2.0.
|
|
6
|
-
export declare const BUILD_TIMESTAMP = "2026-04-02T18:
|
|
5
|
+
export declare const PACKAGE_VERSION = "2.0.5";
|
|
6
|
+
export declare const BUILD_TIMESTAMP = "2026-04-02T18:59:22.885Z";
|
|
7
7
|
export declare const BUILD_TYPE: 'npm' | 'git';
|
|
8
8
|
export declare const PACKAGE_NAME = "@dollhousemcp/mcp-server";
|
|
9
9
|
//# sourceMappingURL=version.d.ts.map
|
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
* Auto-generated file - DO NOT EDIT
|
|
3
3
|
* Generated at build time by scripts/generate-version.js
|
|
4
4
|
*/
|
|
5
|
-
export const PACKAGE_VERSION = '2.0.
|
|
6
|
-
export const BUILD_TIMESTAMP = '2026-04-02T18:
|
|
5
|
+
export const PACKAGE_VERSION = '2.0.5';
|
|
6
|
+
export const BUILD_TIMESTAMP = '2026-04-02T18:59:22.885Z';
|
|
7
7
|
export const BUILD_TYPE = 'npm';
|
|
8
8
|
export const PACKAGE_NAME = '@dollhousemcp/mcp-server';
|
|
9
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
9
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVyc2lvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9nZW5lcmF0ZWQvdmVyc2lvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7O0dBR0c7QUFFSCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsT0FBTyxDQUFDO0FBQ3ZDLE1BQU0sQ0FBQyxNQUFNLGVBQWUsR0FBRywwQkFBMEIsQ0FBQztBQUMxRCxNQUFNLENBQUMsTUFBTSxVQUFVLEdBQWtCLEtBQUssQ0FBQztBQUMvQyxNQUFNLENBQUMsTUFBTSxZQUFZLEdBQUcsMEJBQTBCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEF1dG8tZ2VuZXJhdGVkIGZpbGUgLSBETyBOT1QgRURJVFxuICogR2VuZXJhdGVkIGF0IGJ1aWxkIHRpbWUgYnkgc2NyaXB0cy9nZW5lcmF0ZS12ZXJzaW9uLmpzXG4gKi9cblxuZXhwb3J0IGNvbnN0IFBBQ0tBR0VfVkVSU0lPTiA9ICcyLjAuNSc7XG5leHBvcnQgY29uc3QgQlVJTERfVElNRVNUQU1QID0gJzIwMjYtMDQtMDJUMTg6NTk6MjIuODg1Wic7XG5leHBvcnQgY29uc3QgQlVJTERfVFlQRTogJ25wbScgfCAnZ2l0JyA9ICducG0nO1xuZXhwb3J0IGNvbnN0IFBBQ0tBR0VfTkFNRSA9ICdAZG9sbGhvdXNlbWNwL21jcC1zZXJ2ZXInO1xuIl19
|
package/dist/index.js
CHANGED
|
@@ -628,6 +628,12 @@ if ((isDirectExecution || isNpxExecution || isCliExecution) && (!isTest || isTes
|
|
|
628
628
|
if (isWebMode) {
|
|
629
629
|
// Issue #796: Bootstrap DI container for web-only mode so API routes
|
|
630
630
|
// go through MCPAQLHandler (validated, cached, gatekeeper-checked)
|
|
631
|
+
//
|
|
632
|
+
// Suppress debug output in --web mode unless DOLLHOUSE_DEBUG is set.
|
|
633
|
+
// The web console captures all logs in memory — no need to flood the terminal.
|
|
634
|
+
if (!process.env.DOLLHOUSE_DEBUG && !process.env.ENABLE_DEBUG) {
|
|
635
|
+
logger.setMinLevel('info');
|
|
636
|
+
}
|
|
631
637
|
(async () => {
|
|
632
638
|
const portfolioDir = path.join(os.homedir(), '.dollhouse', 'portfolio');
|
|
633
639
|
const portArg = process.argv.find(a => a.startsWith('--port='));
|
|
@@ -665,4 +671,4 @@ if ((isDirectExecution || isNpxExecution || isCliExecution) && (!isTest || isTes
|
|
|
665
671
|
});
|
|
666
672
|
}
|
|
667
673
|
}
|
|
668
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUVBLGtFQUFrRTtBQUNsRSw4REFBOEQ7QUFDOUQsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRXRDLE9BQU8sS0FBSyxJQUFJLE1BQU0sTUFBTSxDQUFDO0FBQzdCLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQztBQUNuRSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQztBQUNqRixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDdkQsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQzNDLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUU5RCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFjekQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQzFELE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBQzVFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUNoRSxPQUFPLEtBQUssRUFBRSxNQUFNLElBQUksQ0FBQztBQUd6QixpREFBaUQ7QUFDakQsT0FBTyxDQUFDLEVBQUUsQ0FBQyxtQkFBbUIsRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFO0lBQ3hDLE1BQU0sQ0FBQyxLQUFLLENBQUMsOEJBQThCLEVBQUU7UUFDM0MsS0FBSyxFQUFFLEtBQUssWUFBWSxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUM7UUFDN0QsS0FBSyxFQUFFLEtB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T0FBTyxDQUFDLEtBQUssQ0FBQyx3Q0FBd0MsRUFBRSxHQUFHLENBQUMsQ0FBQztZQUM3RCxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2xCLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztTQUFNLENBQUM7UUFDTixJQUFJLHFCQUFxQixFQUFFLENBQUM7WUFDMUIsT0FBTyxDQUFDLEtBQUssQ0FBQyxvRUFBb0UsQ0FBQyxDQUFDO1FBQ3RGLENBQUM7UUFDRCxvQkFBb0IsRUFBRSxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUU7WUFDaEMsb0ZBQW9GO1lBQ3BGLE9BQU8sQ0FBQyxLQUFLLENBQUMsc0NBQXNDLENBQUMsQ0FBQztZQUN0RCxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2xCLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIjIS91c3IvYmluL2VudiBub2RlXG5cbi8vIExvYWQgZW52aXJvbm1lbnQgdmFyaWFibGVzIGZyb20gLmVudiBmaWxlcyBCRUZPUkUgYW55dGhpbmcgZWxzZVxuLy8gVGhpcyBlbnN1cmVzIC5lbnYubG9jYWwgYW5kIC5lbnYgYXJlIGxvYWRlZCBmb3IgYWxsIG1vZHVsZXNcbmltcG9ydCB7IGVudiB9IGZyb20gJy4vY29uZmlnL2Vudi5qcyc7XG5cbmltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgeyBTZXJ2ZXIgfSBmcm9tIFwiQG1vZGVsY29udGV4dHByb3RvY29sL3Nkay9zZXJ2ZXIvaW5kZXguanNcIjtcbmltcG9ydCB7IFN0ZGlvU2VydmVyVHJhbnNwb3J0IH0gZnJvbSBcIkBtb2RlbGNvbnRleHRwcm90b2NvbC9zZGsvc2VydmVyL3N0ZGlvLmpzXCI7XG5pbXBvcnQgeyBFcnJvckhhbmRsZXIgfSBmcm9tIFwiLi91dGlscy9FcnJvckhhbmRsZXIuanNcIjtcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gXCIuL3V0aWxzL2xvZ2dlci5qc1wiO1xuaW1wb3J0IHsgRG9sbGhvdXNlQ29udGFpbmVyIH0gZnJvbSBcIi4vZGkvQ29udGFpbmVyLmpzXCI7XG5pbXBvcnQgeyBFbGVtZW50VHlwZSB9IGZyb20gXCIuL3BvcnRmb2xpby9Qb3J0Zm9saW9NYW5hZ2VyLmpzXCI7XG5pbXBvcnQgeyBPcGVyYXRpb25hbFRlbGVtZXRyeSwgU3RhcnR1cFRpbWVyIH0gZnJvbSBcIi4vdGVsZW1ldHJ5L2luZGV4LmpzXCI7XG5pbXBvcnQgeyBQQUNLQUdFX1ZFUlNJT04gfSBmcm9tIFwiLi9nZW5lcmF0ZWQvdmVyc2lvbi5qc1wiO1xuaW1wb3J0IHR5cGUgeyBJbmRpY2F0b3JDb25maWcgfSBmcm9tIFwiLi9jb25maWcvaW5kaWNhdG9yLWNvbmZpZy5qc1wiO1xuaW1wb3J0IHR5cGUgeyBJVG9vbEhhbmRsZXIgfSBmcm9tIFwiLi9zZXJ2ZXIvaW5kZXguanNcIjtcbmltcG9ydCB0eXBlIHsgVG9vbFJlZ2lzdHJ5IH0gZnJvbSBcIi4vaGFuZGxlcnMvVG9vbFJlZ2lzdHJ5LmpzXCI7XG5pbXBvcnQgdHlwZSB7IFBlcnNvbmFIYW5kbGVyIH0gZnJvbSBcIi4vaGFuZGxlcnMvUGVyc29uYUhhbmRsZXIuanNcIjtcbmltcG9ydCB0eXBlIHsgRWxlbWVudENSVURIYW5kbGVyIH0gZnJvbSBcIi4vaGFuZGxlcnMvRWxlbWVudENSVURIYW5kbGVyLmpzXCI7XG5pbXBvcnQgdHlwZSB7IENvbGxlY3Rpb25IYW5kbGVyIH0gZnJvbSBcIi4vaGFuZGxlcnMvQ29sbGVjdGlvbkhhbmRsZXIuanNcIjtcbmltcG9ydCB0eXBlIHsgUG9ydGZvbGlvSGFuZGxlciB9IGZyb20gXCIuL2hhbmRsZXJzL1BvcnRmb2xpb0hhbmRsZXIuanNcIjtcbmltcG9ydCB0eXBlIHsgR2l0SHViQXV0aEhhbmRsZXIgfSBmcm9tIFwiLi9oYW5kbGVycy9HaXRIdWJBdXRoSGFuZGxlci5qc1wiO1xuaW1wb3J0IHR5cGUgeyBEaXNwbGF5Q29uZmlnSGFuZGxlciB9IGZyb20gXCIuL2hhbmRsZXJzL0Rpc3BsYXlDb25maWdIYW5kbGVyLmpzXCI7XG5pbXBvcnQgdHlwZSB7IElkZW50aXR5SGFuZGxlciB9IGZyb20gXCIuL2hhbmRsZXJzL0lkZW50aXR5SGFuZGxlci5qc1wiO1xuaW1wb3J0IHR5cGUgeyBDb25maWdIYW5kbGVyIH0gZnJvbSBcIi4vaGFuZGxlcnMvQ29uZmlnSGFuZGxlci5qc1wiO1xuaW1wb3J0IHR5cGUgeyBTeW5jSGFuZGxlciB9IGZyb20gXCIuL2hhbmRsZXJzL1N5bmNIYW5kbGVyVjIuanNcIjtcbmltcG9ydCB0eXBlIHsgRW5oYW5jZWRJbmRleEhhbmRsZXIgfSBmcm9tIFwiLi9oYW5kbGVycy9FbmhhbmNlZEluZGV4SGFuZGxlci5qc1wiO1xuaW1wb3J0IHsgQ29uZmlnTWFuYWdlciB9IGZyb20gXCIuL2NvbmZpZy9Db25maWdNYW5hZ2VyLmpzXCI7XG5pbXBvcnQgeyBGaWxlT3BlcmF0aW9uc1NlcnZpY2UgfSBmcm9tIFwiLi9zZXJ2aWNlcy9GaWxlT3BlcmF0aW9uc1NlcnZpY2UuanNcIjtcbmltcG9ydCB7IEZpbGVMb2NrTWFuYWdlciB9IGZyb20gXCIuL3NlY3VyaXR5L2ZpbGVMb2NrTWFuYWdlci5qc1wiO1xuaW1wb3J0ICogYXMgb3MgZnJvbSBcIm9zXCI7XG5pbXBvcnQgdHlwZSB7IEVuc2VtYmxlRWxlbWVudCB9IGZyb20gXCIuL2VsZW1lbnRzL2Vuc2VtYmxlcy90eXBlcy5qc1wiO1xuXG4vLyBEZWZlbnNpdmUgZXJyb3IgaGFuZGxpbmcgZm9yIG5weC9DTEkgZXhlY3V0aW9uXG5wcm9jZXNzLm9uKCd1bmNhdWdodEV4Y2VwdGlvbicsIChlcnJvcikgPT4ge1xuICBsb2dnZXIuZXJyb3IoJ1VuaGFuZGxlZCBleGNlcHRpb24gZGV0ZWN0ZWQnLCB7XG4gICAgZXJyb3I6IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKSxcbiAgICBzdGFjazogZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLnN0YWNrIDogdW5kZWZpbmVkXG4gIH0pO1xuICBjb25zb2xlLmVycm9yKCdbRG9sbGhvdXNlTUNQXSBTZXJ2ZXIgc3RhcnR1cCBmYWlsZWQnKTtcbiAgcHJvY2Vzcy5leGl0KDEpO1xufSk7XG5cbnByb2Nlc3Mub24oJ3VuaGFuZGxlZFJlamVjdGlvbicsIChyZWFzb24sIHByb21pc2UpID0+IHtcbiAgbG9nZ2VyLmVycm9yKCdVbmhhbmRsZWQgcHJvbWlzZSByZWplY3Rpb24gZGV0ZWN0ZWQnLCB7XG4gICAgcmVhc29uOiByZWFzb24gaW5zdGFuY2VvZiBFcnJvciA/IHJlYXNvbi5tZXNzYWdlIDogU3RyaW5nKHJlYXNvbiksXG4gICAgc3RhY2s6IHJlYXNvbiBpbnN0YW5jZW9mIEVycm9yID8gcmVhc29uLnN0YWNrIDogdW5kZWZpbmVkLFxuICAgIHByb21pc2VcbiAgfSk7XG4gIGNvbnNvbGUuZXJyb3IoJ1tEb2xsaG91c2VNQ1BdIFNlcnZlciBzdGFydHVwIGZhaWxlZCcpO1xuICBwcm9jZXNzLmV4aXQoMSk7XG59KTtcblxuLy8gT25seSBsb2cgZXhlY3V0aW9uIGVudmlyb25tZW50IGluIGRlYnVnIG1vZGVcbmlmIChwcm9jZXNzLmVudi5ET0xMSE9VU0VfREVCVUcpIHtcbiAgY29uc29sZS5lcnJvcignW0RvbGxob3VzZU1DUF0gRGVidWcgbW9kZSBlbmFibGVkJyk7XG59XG5cbmV4cG9ydCBjbGFzcyBEb2xsaG91c2VNQ1BTZXJ2ZXIgaW1wbGVtZW50cyBJVG9vbEhhbmRsZXIge1xuICBwcml2YXRlIHNlcnZlcjogU2VydmVyO1xuICBwdWJsaWMgcGVyc29uYXNEaXI6IHN0cmluZyB8IG51bGw7XG4gIHByaXZhdGUgY3VycmVudFVzZXI6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGlzSW5pdGlhbGl6ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJpdmF0ZSBpbml0aWFsaXphdGlvblByb21pc2U6IFByb21pc2U8dm9pZD4gfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBjb250YWluZXI6IERvbGxob3VzZUNvbnRhaW5lcjtcbiAgcHJpdmF0ZSB0b29sUmVnaXN0cnk/OiBUb29sUmVnaXN0cnk7XG4gIHByaXZhdGUgZW5oYW5jZWRJbmRleEhhbmRsZXI/OiBFbmhhbmNlZEluZGV4SGFuZGxlcjtcbiAgcHJpdmF0ZSBwZXJzb25hSGFuZGxlcj86IFBlcnNvbmFIYW5kbGVyO1xuICBwcml2YXRlIGVsZW1lbnRDUlVESGFuZGxlcj86IEVsZW1lbnRDUlVESGFuZGxlcjtcbiAgcHJpdmF0ZSBjb2xsZWN0aW9uSGFuZGxlcj86IENvbGxlY3Rpb25IYW5kbGVyO1xuICBwcml2YXRlIHBvcnRmb2xpb0hhbmRsZXI/OiBQb3J0Zm9saW9IYW5kbGVyO1xuICBwcml2YXRlIGdpdGh1YkF1dGhIYW5kbGVyPzogR2l0SHViQXV0aEhhbmRsZXI7XG4gIHByaXZhdGUgZGlzcGxheUNvbmZpZ0hhbmRsZXI/OiBEaXNwbGF5Q29uZmlnSGFuZGxlcjtcbiAgcHJpdmF0ZSBpZGVudGl0eUhhbmRsZXI/OiBJZGVudGl0eUhhbmRsZXI7XG4gIHByaXZhdGUgY29uZmlnSGFuZGxlcj86IENvbmZpZ0hhbmRsZXI7XG4gIHByaXZhdGUgc3luY0hhbmRsZXI/OiBTeW5jSGFuZGxlcjtcbiAgcHJpdmF0ZSByZXNvdXJjZUhhbmRsZXI/OiBpbXBvcnQoJy4vaGFuZGxlcnMvUmVzb3VyY2VIYW5kbGVyLmpzJykuUmVzb3VyY2VIYW5kbGVyO1xuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBuZXcgRG9sbGhvdXNlTUNQU2VydmVyIGluc3RhbmNlXG4gICAqXG4gICAqIEBwYXJhbSBjb250YWluZXIgRG9sbGhvdXNlQ29udGFpbmVyIGluc3RhbmNlIGZvciBkZXBlbmRlbmN5IGluamVjdGlvbi5cbiAgICogICAgICAgICAgICAgICAgICBVc2UgYG5ldyBEb2xsaG91c2VDb250YWluZXIoKWAgZm9yIHByb2R1Y3Rpb24gb3JcbiAgICogICAgICAgICAgICAgICAgICBgY3JlYXRlSW50ZWdyYXRpb25Db250YWluZXIoKS5jb250YWluZXJgIGZvciB0ZXN0cy5cbiAgICovXG4gIGNvbnN0cnVjdG9yKGNvbnRhaW5lcjogRG9sbGhvdXNlQ29udGFpbmVyKSB7XG4gICAgLy8gQnVpbGQgY2FwYWJpbGl0aWVzIG9iamVjdCBjb25kaXRpb25hbGx5IGJhc2VkIG9uIGNvbmZpZ3VyYXRpb25cbiAgICAvLyBSZXNvdXJjZXMgYXJlIGRpc2FibGVkIGJ5IGRlZmF1bHQgKGFkdmVydGlzZV9yZXNvdXJjZXM6IGZhbHNlKVxuICAgIGNvbnN0IGNhcGFiaWxpdGllczogYW55ID0ge1xuICAgICAgdG9vbHM6IHt9LFxuICAgIH07XG5cbiAgICAvLyBDaGVjayBpZiByZXNvdXJjZXMgc2hvdWxkIGJlIGFkdmVydGlzZWRcbiAgICAvLyBUaGlzIGlzIGEgZnV0dXJlLXByb29mIGltcGxlbWVudGF0aW9uIC0gcmVzb3VyY2VzIGFyZSBvcHQtaW5cbiAgICB0cnkge1xuICAgICAgLy8gSW5pdGlhbGl6ZSBDb25maWdNYW5hZ2VyIHRvIGNoZWNrIHJlc291cmNlIHNldHRpbmdzXG4gICAgICAvLyBOb3RlOiBDb25maWcgbWF5IG5vdCBiZSBmdWxseSBpbml0aWFsaXplZCB5ZXQsIHNvIHdlIGNoZWNrIHN5bmNocm9ub3VzbHlcbiAgICAgIC8vIElmIGNvbmZpZyBpcyBub3QgaW5pdGlhbGl6ZWQsIGRlZmF1bHRzIChhZHZlcnRpc2VfcmVzb3VyY2VzOiBmYWxzZSkgYXBwbHlcbiAgICAgIGNvbnN0IGZpbGVMb2NrTWFuYWdlciA9IG5ldyBGaWxlTG9ja01hbmFnZXIoKTtcbiAgICAgIGNvbnN0IGZpbGVPcGVyYXRpb25zID0gbmV3IEZpbGVPcGVyYXRpb25zU2VydmljZShmaWxlTG9ja01hbmFnZXIpO1xuICAgICAgY29uc3QgY29uZmlnTWFuYWdlciA9IG5ldyBDb25maWdNYW5hZ2VyKGZpbGVPcGVyYXRpb25zLCBvcyk7XG4gICAgICBjb25zdCByZXNvdXJjZXNDb25maWcgPSBjb25maWdNYW5hZ2VyLmdldFNldHRpbmc8YW55PignZWxlbWVudHMuZW5oYW5jZWRfaW5kZXgucmVzb3VyY2VzJyk7XG5cbiAgICAgIGlmIChyZXNvdXJjZXNDb25maWc/LmFkdmVydGlzZV9yZXNvdXJjZXMgPT09IHRydWUpIHtcbiAgICAgICAgY2FwYWJpbGl0aWVzLnJlc291cmNlcyA9IHt9O1xuICAgICAgICBsb2dnZXIuaW5mbygnW0RvbGxob3VzZU1DUF0gTUNQIFJlc291cmNlcyBjYXBhYmlsaXR5IGFkdmVydGlzZWQgKGVuYWJsZWQgdmlhIGNvbmZpZyknKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxvZ2dlci5pbmZvKCdbRG9sbGhvdXNlTUNQXSBNQ1AgUmVzb3VyY2VzIGNhcGFiaWxpdHkgTk9UIGFkdmVydGlzZWQgKGRpc2FibGVkIGJ5IGRlZmF1bHQpJyk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIENvbmZpZyBub3QgaW5pdGlhbGl6ZWQgeWV0IC0gdXNlIHNhZmUgZGVmYXVsdCAobm8gcmVzb3VyY2VzKVxuICAgICAgY29uc3QgZXJyb3JNZXNzYWdlID0gZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpO1xuICAgICAgbG9nZ2VyLmRlYnVnKGBbRG9sbGhvdXNlTUNQXSBDb25maWcgbm90IGluaXRpYWxpemVkIHlldCwgcmVzb3VyY2VzIGNhcGFiaWxpdHkgZGlzYWJsZWQgYnkgZGVmYXVsdDogJHtlcnJvck1lc3NhZ2V9YCk7XG4gICAgfVxuXG4gICAgdGhpcy5zZXJ2ZXIgPSBuZXcgU2VydmVyKFxuICAgICAge1xuICAgICAgICBuYW1lOiBcImRvbGxob3VzZW1jcFwiLFxuICAgICAgICB2ZXJzaW9uOiBQQUNLQUdFX1ZFUlNJT04sXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBjYXBhYmlsaXRpZXMsXG4gICAgICB9XG4gICAgKTtcblxuICAgIHRoaXMucGVyc29uYXNEaXIgPSBudWxsO1xuICAgIHRoaXMuY3VycmVudFVzZXIgPSBwcm9jZXNzLmVudi5ET0xMSE9VU0VfVVNFUiB8fCBudWxsO1xuICAgIHRoaXMuY29udGFpbmVyID0gY29udGFpbmVyO1xuICB9XG4gIFxuICBwcml2YXRlIGFzeW5jIGluaXRpYWxpemVQb3J0Zm9saW8oKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5jb250YWluZXIucHJlcGFyZVBvcnRmb2xpbygpO1xuICAgIHRoaXMucGVyc29uYXNEaXIgPSB0aGlzLmNvbnRhaW5lci5nZXRQZXJzb25hc0RpcigpO1xuICB9XG4gIFxuICAvKipcbiAgICogQ29tcGxldGUgaW5pdGlhbGl6YXRpb24gYWZ0ZXIgcG9ydGZvbGlvIGlzIHJlYWR5XG4gICAqIEZJWCAjNjEwOiBUaGlzIHdhcyBwcmV2aW91c2x5IGluIGEgLnRoZW4oKSBjYWxsYmFjayBpbiB0aGUgY29uc3RydWN0b3JcbiAgICogTm93IGNhbGxlZCBzeW5jaHJvbm91c2x5IGZyb20gcnVuKCkgdG8gcHJldmVudCByYWNlIGNvbmRpdGlvblxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBjb21wbGV0ZUluaXRpYWxpemF0aW9uKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIENyZWF0ZSBoYW5kbGVycyB3aXRoIHNlcnZlciBpbnN0YW5jZSAtIGFsbCBzdGF0ZSBtYW5hZ2VkIGJ5IHNlcnZpY2VzXG4gICAgY29uc3QgaGFuZGxlcnMgPSBhd2FpdCB0aGlzLmNvbnRhaW5lci5jcmVhdGVIYW5kbGVycyh0aGlzLnNlcnZlcik7XG5cbiAgICB0aGlzLnBlcnNvbmFIYW5kbGVyID0gaGFuZGxlcnMucGVyc29uYUhhbmRsZXI7XG4gICAgdGhpcy5lbGVtZW50Q1JVREhhbmRsZXIgPSBoYW5kbGVycy5lbGVtZW50Q3J1ZEhhbmRsZXI7XG4gICAgdGhpcy5jb2xsZWN0aW9uSGFuZGxlciA9IGhhbmRsZXJzLmNvbGxlY3Rpb25IYW5kbGVyO1xuICAgIHRoaXMucG9ydGZvbGlvSGFuZGxlciA9IGhhbmRsZXJzLnBvcnRmb2xpb0hhbmRsZXI7XG4gICAgdGhpcy5naXRodWJBdXRoSGFuZGxlciA9IGhhbmRsZXJzLmdpdGh1YkF1dGhIYW5kbGVyO1xuICAgIHRoaXMuZGlzcGxheUNvbmZpZ0hhbmRsZXIgPSBoYW5kbGVycy5kaXNwbGF5Q29uZmlnSGFuZGxlcjtcbiAgICB0aGlzLmlkZW50aXR5SGFuZGxlciA9IGhhbmRsZXJzLmlkZW50aXR5SGFuZGxlcjtcbiAgICB0aGlzLmNvbmZpZ0hhbmRsZXIgPSBoYW5kbGVycy5jb25maWdIYW5kbGVyO1xuICAgIHRoaXMuc3luY0hhbmRsZXIgPSBoYW5kbGVycy5zeW5jSGFuZGxlcjtcbiAgICB0aGlzLnRvb2xSZWdpc3RyeSA9IGhhbmRsZXJzLnRvb2xSZWdpc3RyeTtcbiAgICB0aGlzLmVuaGFuY2VkSW5kZXhIYW5kbGVyID0gaGFuZGxlcnMuZW5oYW5jZWRJbmRleEhhbmRsZXI7XG5cbiAgICAvLyBJbml0aWFsaXplIGFuZCByZWdpc3RlciByZXNvdXJjZSBoYW5kbGVyc1xuICAgIC8vIFJlc291cmNlcyBhcmUgZGlzYWJsZWQgYnkgZGVmYXVsdCBhbmQgcmVxdWlyZSBleHBsaWNpdCBjb25maWd1cmF0aW9uXG4gICAgYXdhaXQgdGhpcy5pbml0aWFsaXplUmVzb3VyY2VIYW5kbGVycygpO1xuXG4gICAgdGhpcy5pc0luaXRpYWxpemVkID0gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplIE1DUCBSZXNvdXJjZXMgaGFuZGxlcnMgaWYgZW5hYmxlZCBpbiBjb25maWd1cmF0aW9uXG4gICAqIFRoaXMgaXMgc2VwYXJhdGUgZnJvbSBvdGhlciBoYW5kbGVycyBiZWNhdXNlIGl0IHJlcXVpcmVzIGR5bmFtaWMgaW1wb3J0XG4gICAqIGFuZCBjb25kaXRpb25hbCByZWdpc3RyYXRpb24gYmFzZWQgb24gY29uZmlndXJhdGlvblxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBpbml0aWFsaXplUmVzb3VyY2VIYW5kbGVycygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgeyBSZXNvdXJjZUhhbmRsZXIgfSA9IGF3YWl0IGltcG9ydCgnLi9oYW5kbGVycy9SZXNvdXJjZUhhbmRsZXIuanMnKTtcbiAgICAgIGNvbnN0IGNvbmZpZ01hbmFnZXIgPSB0aGlzLmNvbnRhaW5lci5yZXNvbHZlPENvbmZpZ01hbmFnZXI+KCdDb25maWdNYW5hZ2VyJyk7XG5cbiAgICAgIHRoaXMucmVzb3VyY2VIYW5kbGVyID0gbmV3IFJlc291cmNlSGFuZGxlcihjb25maWdNYW5hZ2VyKTtcbiAgICAgIGF3YWl0IHRoaXMucmVzb3VyY2VIYW5kbGVyLmluaXRpYWxpemUodGhpcy5zZXJ2ZXIpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvLyBSZXNvdXJjZXMgYXJlIG9wdGlvbmFsIC0gZG9uJ3QgZmFpbCBzZXJ2ZXIgc3RhcnR1cCBpZiB0aGV5IGNhbid0IGJlIGluaXRpYWxpemVkXG4gICAgICBsb2dnZXIud2FybignW0RvbGxob3VzZU1DUF0gRmFpbGVkIHRvIGluaXRpYWxpemUgcmVzb3VyY2UgaGFuZGxlcnMsIGNvbnRpbnVpbmcgd2l0aG91dCByZXNvdXJjZXMnKTtcbiAgICAgIGxvZ2dlci5kZWJ1ZyhgUmVzb3VyY2UgaW5pdGlhbGl6YXRpb24gZXJyb3I6ICR7ZXJyb3J9YCk7XG4gICAgfVxuICB9XG4gIFxuICAvKipcbiAgICogRW5zdXJlIHNlcnZlciBpcyBpbml0aWFsaXplZCBiZWZvcmUgYW55IG9wZXJhdGlvblxuICAgKiBGSVggIzYxMDogQWRkZWQgZm9yIHRlc3QgY29tcGF0aWJpbGl0eSAtIHRlc3RzIGRvbid0IGNhbGwgcnVuKClcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZW5zdXJlSW5pdGlhbGl6ZWQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMuaXNJbml0aWFsaXplZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBcbiAgICAvLyBJZiBpbml0aWFsaXphdGlvbiBpcyBhbHJlYWR5IGluIHByb2dyZXNzLCB3YWl0IGZvciBpdFxuICAgIGlmICh0aGlzLmluaXRpYWxpemF0aW9uUHJvbWlzZSkge1xuICAgICAgYXdhaXQgdGhpcy5pbml0aWFsaXphdGlvblByb21pc2U7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIFxuICAgIC8vIFN0YXJ0IGluaXRpYWxpemF0aW9uXG4gICAgdGhpcy5pbml0aWFsaXphdGlvblByb21pc2UgPSAoYXN5bmMgKCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgdGhpcy5pbml0aWFsaXplUG9ydGZvbGlvKCk7XG4gICAgICAgIGF3YWl0IHRoaXMuY29tcGxldGVJbml0aWFsaXphdGlvbigpO1xuICAgICAgICBsb2dnZXIuaW5mbyhcIlBvcnRmb2xpbyBhbmQgcGVyc29uYXMgaW5pdGlhbGl6ZWQgc3VjY2Vzc2Z1bGx5IChsYXp5KVwiKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIEVycm9ySGFuZGxlci5sb2dFcnJvcignRG9sbGhvdXNlTUNQU2VydmVyLmVuc3VyZUluaXRpYWxpemVkJywgZXJyb3IpO1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICB9KSgpO1xuICAgIFxuICAgIGF3YWl0IHRoaXMuaW5pdGlhbGl6YXRpb25Qcm9taXNlO1xuICB9XG4gIFxuICAvLyBUb29sIGhhbmRsZXIgbWV0aG9kcyAtIG5vdyBwdWJsaWMgZm9yIGFjY2VzcyBmcm9tIHRvb2wgbW9kdWxlc1xuICBcbiAgYXN5bmMgbGlzdFBlcnNvbmFzKCkge1xuICAgIGF3YWl0IHRoaXMuZW5zdXJlSW5pdGlhbGl6ZWQoKTtcbiAgICByZXR1cm4gdGhpcy5wZXJzb25hSGFuZGxlciEubGlzdFBlcnNvbmFzKCk7XG4gIH1cblxuICAvLyBVc2UgYWN0aXZhdGVFbGVtZW50KG5hbWUsICdwZXJzb25hJyksIGRlYWN0aXZhdGVFbGVtZW50KG5hbWUsICdwZXJzb25hJyksXG4gIC8vIGdldEFjdGl2ZUVsZW1lbnRzKCdwZXJzb25hJyksIGFuZCBnZXRFbGVtZW50RGV0YWlscyhuYW1lLCAncGVyc29uYScpIGluc3RlYWQuXG4gIC8vIFRoZXNlIHdlcmUgcmVtb3ZlZCB0byBub3JtYWxpemUgcGVyc29uYSBoYW5kbGluZyB0aHJvdWdoIHRoZSBnZW5lcmljIGVsZW1lbnQgQVBJLlxuXG4gIGFzeW5jIHJlbG9hZFBlcnNvbmFzKCkge1xuICAgIGF3YWl0IHRoaXMuZW5zdXJlSW5pdGlhbGl6ZWQoKTtcbiAgICByZXR1cm4gdGhpcy5wZXJzb25hSGFuZGxlciEucmVsb2FkUGVyc29uYXMoKTtcbiAgfVxuXG4gIC8vID09PT09IEVsZW1lbnQgTWV0aG9kcyAoR2VuZXJpYyBmb3IgYWxsIGVsZW1lbnQgdHlwZXMpID09PT09XG4gIFxuICBhc3luYyBsaXN0RWxlbWVudHModHlwZTogc3RyaW5nKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWRUeXBlID0gdGhpcy5lbGVtZW50Q1JVREhhbmRsZXIhLm5vcm1hbGl6ZUVsZW1lbnRUeXBlKHR5cGUpO1xuICAgICAgaWYgKG5vcm1hbGl6ZWRUeXBlID09PSBFbGVtZW50VHlwZS5QRVJTT05BKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmxpc3RQZXJzb25hcygpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMuZWxlbWVudENSVURIYW5kbGVyIS5saXN0RWxlbWVudHMobm9ybWFsaXplZFR5cGUpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBFcnJvckhhbmRsZXIubG9nRXJyb3IoJ0RvbGxob3VzZU1DUFNlcnZlci5saXN0RWxlbWVudHMnLCBlcnJvciwgeyB0eXBlIH0pO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICB0ZXh0OiBg4p2MIEZhaWxlZCB0byBsaXN0ICR7dHlwZX06ICR7RXJyb3JIYW5kbGVyLmdldFVzZXJNZXNzYWdlKGVycm9yKX1gXG4gICAgICAgIH1dXG4gICAgICB9O1xuICAgIH1cbiAgfVxuICBcbiAgYXN5bmMgYWN0aXZhdGVFbGVtZW50KG5hbWU6IHN0cmluZywgdHlwZTogc3RyaW5nLCBjb250ZXh0PzogUmVjb3JkPHN0cmluZywgYW55Pikge1xuICAgIHRyeSB7XG4gICAgICAvLyBGSVg6IElzc3VlICMyODEgLSBSb3V0ZSBhbGwgZWxlbWVudCB0eXBlcyB0aHJvdWdoIGVsZW1lbnRDUlVESGFuZGxlclxuICAgICAgLy8gUGVyc29uYUhhbmRsZXIuYWN0aXZhdGVQZXJzb25hIGlzIGRlcHJlY2F0ZWQ7IFBlcnNvbmFBY3RpdmF0aW9uU3RyYXRlZ3kgaGFuZGxlcyBwZXJzb25hc1xuICAgICAgY29uc3Qgbm9ybWFsaXplZFR5cGUgPSB0aGlzLmVsZW1lbnRDUlVESGFuZGxlciEubm9ybWFsaXplRWxlbWVudFR5cGUodHlwZSk7XG4gICAgICByZXR1cm4gdGhpcy5lbGVtZW50Q1JVREhhbmRsZXIhLmFjdGl2YXRlRWxlbWVudChuYW1lLCBub3JtYWxpemVkVHlwZSwgY29udGV4dCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIEVycm9ySGFuZGxlci5sb2dFcnJvcignRG9sbGhvdXNlTUNQU2VydmVyLmFjdGl2YXRlRWxlbWVudCcsIGVycm9yLCB7IHR5cGUsIG5hbWUgfSk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgIHRleHQ6IGDinYwgRmFpbGVkIHRvIGFjdGl2YXRlICR7dHlwZX0gJyR7bmFtZX0nOiAke0Vycm9ySGFuZGxlci5nZXRVc2VyTWVzc2FnZShlcnJvcil9YFxuICAgICAgICB9XVxuICAgICAgfTtcbiAgICB9XG4gIH1cbiAgXG4gIGFzeW5jIGdldEFjdGl2ZUVsZW1lbnRzKHR5cGU6IHN0cmluZykge1xuICAgIHRyeSB7XG4gICAgICAvLyBGSVg6IElzc3VlICMyODEgLSBSb3V0ZSBhbGwgZWxlbWVudCB0eXBlcyB0aHJvdWdoIGVsZW1lbnRDUlVESGFuZGxlclxuICAgICAgLy8gUGVyc29uYUhhbmRsZXIuZ2V0QWN0aXZlUGVyc29uYSBpcyBkZXByZWNhdGVkOyBQZXJzb25hQWN0aXZhdGlvblN0cmF0ZWd5IGhhbmRsZXMgcGVyc29uYXNcbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWRUeXBlID0gdGhpcy5lbGVtZW50Q1JVREhhbmRsZXIhLm5vcm1hbGl6ZUVsZW1lbnRUeXBlKHR5cGUpO1xuICAgICAgcmV0dXJuIHRoaXMuZWxlbWVudENSVURIYW5kbGVyIS5nZXRBY3RpdmVFbGVtZW50cyhub3JtYWxpemVkVHlwZSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIEVycm9ySGFuZGxlci5sb2dFcnJvcignRG9sbGhvdXNlTUNQU2VydmVyLmdldEFjdGl2ZUVsZW1lbnRzJywgZXJyb3IsIHsgdHlwZSB9KTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgdGV4dDogYOKdjCBGYWlsZWQgdG8gZ2V0IGFjdGl2ZSAke3R5cGV9OiAke0Vycm9ySGFuZGxlci5nZXRVc2VyTWVzc2FnZShlcnJvcil9YFxuICAgICAgICB9XVxuICAgICAgfTtcbiAgICB9XG4gIH1cbiAgXG4gIGFzeW5jIGRlYWN0aXZhdGVFbGVtZW50KG5hbWU6IHN0cmluZywgdHlwZTogc3RyaW5nKSB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIEZJWDogSXNzdWUgIzI4MSAtIFJvdXRlIGFsbCBlbGVtZW50IHR5cGVzIHRocm91Z2ggZWxlbWVudENSVURIYW5kbGVyXG4gICAgICAvLyBQZXJzb25hSGFuZGxlci5kZWFjdGl2YXRlUGVyc29uYSBpcyBkZXByZWNhdGVkOyBQZXJzb25hQWN0aXZhdGlvblN0cmF0ZWd5IGhhbmRsZXMgcGVyc29uYXNcbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWRUeXBlID0gdGhpcy5lbGVtZW50Q1JVREhhbmRsZXIhLm5vcm1hbGl6ZUVsZW1lbnRUeXBlKHR5cGUpO1xuICAgICAgcmV0dXJuIHRoaXMuZWxlbWVudENSVURIYW5kbGVyIS5kZWFjdGl2YXRlRWxlbWVudChuYW1lLCBub3JtYWxpemVkVHlwZSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIEVycm9ySGFuZGxlci5sb2dFcnJvcignRG9sbGhvdXNlTUNQU2VydmVyLmRlYWN0aXZhdGVFbGVtZW50JywgZXJyb3IsIHsgdHlwZSwgbmFtZSB9KTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgdGV4dDogYOKdjCBGYWlsZWQgdG8gZGVhY3RpdmF0ZSAke3R5cGV9ICcke25hbWV9JzogJHtFcnJvckhhbmRsZXIuZ2V0VXNlck1lc3NhZ2UoZXJyb3IpfWBcbiAgICAgICAgfV1cbiAgICAgIH07XG4gICAgfVxuICB9XG4gIFxuICBhc3luYyBnZXRFbGVtZW50RGV0YWlscyhuYW1lOiBzdHJpbmcsIHR5cGU6IHN0cmluZykge1xuICAgIC8vIEZJWDogSXNzdWUgIzI3NiAtIFJvdXRlIGFsbCBlbGVtZW50IHR5cGVzIHRocm91Z2ggZWxlbWVudENSVURIYW5kbGVyIGZvciBjb25zaXN0ZW50IGVycm9yIGhhbmRsaW5nXG4gICAgLy8gUGVyc29uYUhhbmRsZXIuZ2V0UGVyc29uYURldGFpbHMgaXMgZGVwcmVjYXRlZDsgUGVyc29uYUFjdGl2YXRpb25TdHJhdGVneSBoYW5kbGVzIHBlcnNvbmFzXG4gICAgY29uc3Qgbm9ybWFsaXplZFR5cGUgPSB0aGlzLmVsZW1lbnRDUlVESGFuZGxlciEubm9ybWFsaXplRWxlbWVudFR5cGUodHlwZSk7XG4gICAgcmV0dXJuIHRoaXMuZWxlbWVudENSVURIYW5kbGVyIS5nZXRFbGVtZW50RGV0YWlscyhuYW1lLCBub3JtYWxpemVkVHlwZSk7XG4gIH1cbiAgXG4gIGFzeW5jIHJlbG9hZEVsZW1lbnRzKHR5cGU6IHN0cmluZykge1xuICAgIGF3YWl0IHRoaXMuZW5zdXJlSW5pdGlhbGl6ZWQoKTtcbiAgICByZXR1cm4gdGhpcy5lbGVtZW50Q1JVREhhbmRsZXIhLnJlbG9hZEVsZW1lbnRzKHR5cGUpO1xuICB9XG5cbiAgLy8gRWxlbWVudC1zcGVjaWZpYyBtZXRob2RzXG4gIGFzeW5jIHJlbmRlclRlbXBsYXRlKG5hbWU6IHN0cmluZywgdmFyaWFibGVzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+KSB7XG4gICAgYXdhaXQgdGhpcy5lbnN1cmVJbml0aWFsaXplZCgpO1xuICAgIHJldHVybiB0aGlzLmVsZW1lbnRDUlVESGFuZGxlciEucmVuZGVyVGVtcGxhdGUobmFtZSwgdmFyaWFibGVzKTtcbiAgfVxuXG4gIGFzeW5jIGV4ZWN1dGVBZ2VudChuYW1lOiBzdHJpbmcsIHBhcmFtZXRlcnM6IFJlY29yZDxzdHJpbmcsIGFueT4pIHtcbiAgICBhd2FpdCB0aGlzLmVuc3VyZUluaXRpYWxpemVkKCk7XG4gICAgcmV0dXJuIHRoaXMuZWxlbWVudENSVURIYW5kbGVyIS5leGVjdXRlQWdlbnQobmFtZSwgcGFyYW1ldGVycyk7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBuZXcgZWxlbWVudCBpbiB0aGUgcG9ydGZvbGlvLlxuICAgKiBAcGFyYW0gYXJncy5lbGVtZW50cyAtIEZvciBlbnNlbWJsZXM6IGFycmF5IG9mIGVsZW1lbnQgcmVmZXJlbmNlcyAoSXNzdWUgIzI3OClcbiAgICovXG4gIGFzeW5jIGNyZWF0ZUVsZW1lbnQoYXJnczoge25hbWU6IHN0cmluZzsgdHlwZTogc3RyaW5nOyBkZXNjcmlwdGlvbjogc3RyaW5nOyBjb250ZW50Pzogc3RyaW5nOyBpbnN0cnVjdGlvbnM/OiBzdHJpbmc7IG1ldGFkYXRhPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47IGVsZW1lbnRzPzogRW5zZW1ibGVFbGVtZW50W119KSB7XG4gICAgYXdhaXQgdGhpcy5lbnN1cmVJbml0aWFsaXplZCgpO1xuICAgIC8vIEZJWDogSXNzdWUgIzIwIC0gUmVtb3ZlIHBlcnNvbmEgc3BlY2lhbCBjYXNlLCByb3V0ZSBhbGwgZWxlbWVudCBjcmVhdGlvbiB0aHJvdWdoIEVsZW1lbnRDUlVESGFuZGxlclxuICAgIC8vIFRoaXMgZW5zdXJlcyBjb25zaXN0ZW50IGR1cGxpY2F0ZSBjaGVja2luZyBhbmQgZXJyb3IgaGFuZGxpbmcgZm9yIGFsbCBlbGVtZW50IHR5cGVzXG4gICAgLy8gRklYOiBJc3N1ZSAjMjc4IC0gU3VwcG9ydCBlbGVtZW50cyBwYXJhbWV0ZXIgZm9yIGVuc2VtYmxlc1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRUeXBlID0gdGhpcy5lbGVtZW50Q1JVREhhbmRsZXIhLm5vcm1hbGl6ZUVsZW1lbnRUeXBlKGFyZ3MudHlwZSk7XG4gICAgcmV0dXJuIHRoaXMuZWxlbWVudENSVURIYW5kbGVyIS5jcmVhdGVFbGVtZW50KHsuLi5hcmdzLCB0eXBlOiBub3JtYWxpemVkVHlwZX0pO1xuICB9XG5cbiAgYXN5bmMgZWRpdEVsZW1lbnQoYXJnczoge25hbWU6IHN0cmluZzsgdHlwZTogc3RyaW5nOyBpbnB1dDogUmVjb3JkPHN0cmluZywgdW5rbm93bj59KSB7XG4gICAgYXdhaXQgdGhpcy5lbnN1cmVJbml0aWFsaXplZCgpO1xuICAgIC8vIEZJWDogSXNzdWUgIzI3NiAtIFJvdXRlIGFsbCBlbGVtZW50IHR5cGVzIHRocm91Z2ggZWxlbWVudENSVURIYW5kbGVyIGZvciBjb25zaXN0ZW50IGVycm9yIGhhbmRsaW5nXG4gICAgLy8gUGVyc29uYUhhbmRsZXIuZWRpdFBlcnNvbmEgaXMgZGVwcmVjYXRlZDsgZWxlbWVudENSVURIYW5kbGVyIGhhbmRsZXMgcGVyc29uYXMgdmlhIFBlcnNvbmFBY3RpdmF0aW9uU3RyYXRlZ3lcbiAgICBjb25zdCBub3JtYWxpemVkVHlwZSA9IHRoaXMuZWxlbWVudENSVURIYW5kbGVyIS5ub3JtYWxpemVFbGVtZW50VHlwZShhcmdzLnR5cGUpO1xuICAgIHJldHVybiB0aGlzLmVsZW1lbnRDUlVESGFuZGxlciEuZWRpdEVsZW1lbnQoey4uLmFyZ3MsIHR5cGU6IG5vcm1hbGl6ZWRUeXBlfSk7XG4gIH1cblxuICBhc3luYyB2YWxpZGF0ZUVsZW1lbnQoYXJnczoge25hbWU6IHN0cmluZzsgdHlwZTogc3RyaW5nOyBzdHJpY3Q/OiBib29sZWFufSkge1xuICAgIGF3YWl0IHRoaXMuZW5zdXJlSW5pdGlhbGl6ZWQoKTtcbiAgICAvLyBGSVg6IElzc3VlICMyNzYgLSBSb3V0ZSBhbGwgZWxlbWVudCB0eXBlcyB0aHJvdWdoIGVsZW1lbnRDUlVESGFuZGxlciBmb3IgY29uc2lzdGVudCBlcnJvciBoYW5kbGluZ1xuICAgIC8vIFBlcnNvbmFIYW5kbGVyLnZhbGlkYXRlUGVyc29uYSBpcyBkZXByZWNhdGVkOyBlbGVtZW50Q1JVREhhbmRsZXIgaGFuZGxlcyBwZXJzb25hc1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRUeXBlID0gdGhpcy5lbGVtZW50Q1JVREhhbmRsZXIhLm5vcm1hbGl6ZUVsZW1lbnRUeXBlKGFyZ3MudHlwZSk7XG4gICAgcmV0dXJuIHRoaXMuZWxlbWVudENSVURIYW5kbGVyIS52YWxpZGF0ZUVsZW1lbnQoey4uLmFyZ3MsIHR5cGU6IG5vcm1hbGl6ZWRUeXBlfSk7XG4gIH1cblxuICBhc3luYyBkZWxldGVFbGVtZW50KGFyZ3M6IHtuYW1lOiBzdHJpbmc7IHR5cGU6IHN0cmluZzsgZGVsZXRlRGF0YT86IGJvb2xlYW59KSB7XG4gICAgYXdhaXQgdGhpcy5lbnN1cmVJbml0aWFsaXplZCgpO1xuICAgIC8vIEZJWDogSXNzdWUgIzI3NiAtIFJvdXRlIGFsbCBlbGVtZW50IHR5cGVzIHRocm91Z2ggZWxlbWVudENSVURIYW5kbGVyIGZvciBjb25zaXN0ZW50IGVycm9yIGhhbmRsaW5nXG4gICAgLy8gUGVyc29uYUhhbmRsZXIuZGVsZXRlUGVyc29uYSBpcyBkZXByZWNhdGVkOyBlbGVtZW50Q1JVREhhbmRsZXIgaGFuZGxlcyBwZXJzb25hcyB2aWEgZGVkaWNhdGVkIGRlbGV0ZSBwYXRoXG4gICAgY29uc3Qgbm9ybWFsaXplZFR5cGUgPSB0aGlzLmVsZW1lbnRDUlVESGFuZGxlciEubm9ybWFsaXplRWxlbWVudFR5cGUoYXJncy50eXBlKTtcbiAgICByZXR1cm4gdGhpcy5lbGVtZW50Q1JVREhhbmRsZXIhLmRlbGV0ZUVsZW1lbnQoey4uLmFyZ3MsIHR5cGU6IG5vcm1hbGl6ZWRUeXBlfSk7XG4gIH1cblxuICBhc3luYyBicm93c2VDb2xsZWN0aW9uKHNlY3Rpb24/OiBzdHJpbmcsIHR5cGU/OiBzdHJpbmcpIHtcbiAgICBhd2FpdCB0aGlzLmVuc3VyZUluaXRpYWxpemVkKCk7XG4gICAgcmV0dXJuIHRoaXMuY29sbGVjdGlvbkhhbmRsZXIhLmJyb3dzZUNvbGxlY3Rpb24oc2VjdGlvbiwgdHlwZSk7XG4gIH1cblxuICBhc3luYyBzZWFyY2hDb2xsZWN0aW9uKHF1ZXJ5OiBzdHJpbmcpIHtcbiAgICBhd2FpdCB0aGlzLmVuc3VyZUluaXRpYWxpemVkKCk7XG4gICAgcmV0dXJuIHRoaXMuY29sbGVjdGlvbkhhbmRsZXIhLnNlYXJjaENvbGxlY3Rpb24ocXVlcnkpO1xuICB9XG5cbiAgYXN5bmMgc2VhcmNoQ29sbGVjdGlvbkVuaGFuY2VkKHF1ZXJ5OiBzdHJpbmcsIG9wdGlvbnM6IGFueSA9IHt9KSB7XG4gICAgYXdhaXQgdGhpcy5lbnN1cmVJbml0aWFsaXplZCgpO1xuICAgIHJldHVybiB0aGlzLmNvbGxlY3Rpb25IYW5kbGVyIS5zZWFyY2hDb2xsZWN0aW9uRW5oYW5jZWQocXVlcnksIG9wdGlvbnMpO1xuICB9XG5cbiAgYXN5bmMgZ2V0Q29sbGVjdGlvbkNvbnRlbnQocGF0aDogc3RyaW5nKSB7XG4gICAgYXdhaXQgdGhpcy5lbnN1cmVJbml0aWFsaXplZCgpO1xuICAgIHJldHVybiB0aGlzLmNvbGxlY3Rpb25IYW5kbGVyIS5nZXRDb2xsZWN0aW9uQ29udGVudChwYXRoKTtcbiAgfVxuXG4gIGFzeW5jIGluc3RhbGxDb250ZW50KGlucHV0UGF0aDogc3RyaW5nKSB7XG4gICAgYXdhaXQgdGhpcy5lbnN1cmVJbml0aWFsaXplZCgpO1xuICAgIHJldHVybiB0aGlzLmNvbGxlY3Rpb25IYW5kbGVyIS5pbnN0YWxsQ29udGVudChpbnB1dFBhdGgpO1xuICB9XG5cbiAgYXN5bmMgc3VibWl0Q29udGVudChjb250ZW50SWRlbnRpZmllcjogc3RyaW5nKSB7XG4gICAgYXdhaXQgdGhpcy5lbnN1cmVJbml0aWFsaXplZCgpO1xuICAgIHJldHVybiB0aGlzLmNvbGxlY3Rpb25IYW5kbGVyIS5zdWJtaXRDb250ZW50KGNvbnRlbnRJZGVudGlmaWVyKTtcbiAgfVxuXG4gIGFzeW5jIGdldENvbGxlY3Rpb25DYWNoZUhlYWx0aCgpIHtcbiAgICBhd2FpdCB0aGlzLmVuc3VyZUluaXRpYWxpemVkKCk7XG4gICAgcmV0dXJuIHRoaXMuY29sbGVjdGlvbkhhbmRsZXIhLmdldENvbGxlY3Rpb25DYWNoZUhlYWx0aCgpO1xuICB9XG5cbiAgLy8gVXNlciBpZGVudGl0eSBtYW5hZ2VtZW50IC0gZGVsZWdhdGVkIHRvIElkZW50aXR5SGFuZGxlclxuICBhc3luYyBzZXRVc2VySWRlbnRpdHkodXNlcm5hbWU6IHN0cmluZywgZW1haWw/OiBzdHJpbmcpIHtcbiAgICBhd2FpdCB0aGlzLmVuc3VyZUluaXRpYWxpemVkKCk7XG4gICAgcmV0dXJuIHRoaXMuaWRlbnRpdHlIYW5kbGVyIS5zZXRVc2VySWRlbnRpdHkodXNlcm5hbWUsIGVtYWlsKTtcbiAgfVxuXG4gIGFzeW5jIGdldFVzZXJJZGVudGl0eSgpIHtcbiAgICBhd2FpdCB0aGlzLmVuc3VyZUluaXRpYWxpemVkKCk7XG4gICAgcmV0dXJuIHRoaXMuaWRlbnRpdHlIYW5kbGVyIS5nZXRVc2VySWRlbnRpdHkoKTtcbiAgfVxuXG4gIGFzeW5jIGNsZWFyVXNlcklkZW50aXR5KCkge1xuICAgIGF3YWl0IHRoaXMuZW5zdXJlSW5pdGlhbGl6ZWQoKTtcbiAgICByZXR1cm4gdGhpcy5pZGVudGl0eUhhbmRsZXIhLmNsZWFyVXNlcklkZW50aXR5KCk7XG4gIH1cblxuICBwcml2YXRlIGdldEN1cnJlbnRVc2VyRm9yQXR0cmlidXRpb24oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5pZGVudGl0eUhhbmRsZXIhLmdldEN1cnJlbnRVc2VyRm9yQXR0cmlidXRpb24oKTtcbiAgfVxuXG4gIC8vIEdpdEh1YiBhdXRoZW50aWNhdGlvbiBtYW5hZ2VtZW50XG4gIGFzeW5jIHNldHVwR2l0SHViQXV0aCgpIHtcbiAgICBhd2FpdCB0aGlzLmVuc3VyZUluaXRpYWxpemVkKCk7XG4gICAgcmV0dXJuIHRoaXMuZ2l0aHViQXV0aEhhbmRsZXIhLnNldHVwR2l0SHViQXV0aCgpO1xuICB9XG4gIFxuICBhc3luYyBjaGVja0dpdEh1YkF1dGgoKSB7XG4gICAgYXdhaXQgdGhpcy5lbnN1cmVJbml0aWFsaXplZCgpO1xuICAgIHJldHVybiB0aGlzLmdpdGh1YkF1dGhIYW5kbGVyIS5jaGVja0dpdEh1YkF1dGgoKTtcbiAgfVxuICBcbiAgYXN5bmMgZ2V0T0F1dGhIZWxwZXJTdGF0dXModmVyYm9zZTogYm9vbGVhbiA9IGZhbHNlKSB7XG4gICAgYXdhaXQgdGhpcy5lbnN1cmVJbml0aWFsaXplZCgpO1xuICAgIHJldHVybiB0aGlzLmdpdGh1YkF1dGhIYW5kbGVyIS5nZXRPQXV0aEhlbHBlclN0YXR1cyh2ZXJib3NlKTtcbiAgfVxuICBcblxuICBcbiAgYXN5bmMgY2xlYXJHaXRIdWJBdXRoKCkge1xuICAgIGF3YWl0IHRoaXMuZW5zdXJlSW5pdGlhbGl6ZWQoKTtcbiAgICByZXR1cm4gdGhpcy5naXRodWJBdXRoSGFuZGxlciEuY2xlYXJHaXRIdWJBdXRoKCk7XG4gIH1cblxuICAvLyBPQXV0aCBjb25maWd1cmF0aW9uIG1hbmFnZW1lbnRcbiAgYXN5bmMgY29uZmlndXJlT0F1dGgoY2xpZW50X2lkPzogc3RyaW5nKSB7XG4gICAgYXdhaXQgdGhpcy5lbnN1cmVJbml0aWFsaXplZCgpO1xuICAgIHJldHVybiB0aGlzLmdpdGh1YkF1dGhIYW5kbGVyIS5jb25maWd1cmVPQXV0aChjbGllbnRfaWQpO1xuICB9XG5cblxuXG5cblxuXG5cblxuXG5cbiAgLyoqXG4gICAqIENvbmZpZ3VyZSBpbmRpY2F0b3Igc2V0dGluZ3MgKGRlbGVnYXRlZCB0byBEaXNwbGF5Q29uZmlnSGFuZGxlcilcbiAgICovXG4gIGFzeW5jIGNvbmZpZ3VyZUluZGljYXRvcihjb25maWc6IFBhcnRpYWw8SW5kaWNhdG9yQ29uZmlnPikge1xuICAgIGF3YWl0IHRoaXMuZW5zdXJlSW5pdGlhbGl6ZWQoKTtcbiAgICByZXR1cm4gdGhpcy5kaXNwbGF5Q29uZmlnSGFuZGxlciEuY29uZmlndXJlSW5kaWNhdG9yKGNvbmZpZyk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGN1cnJlbnQgaW5kaWNhdG9yIGNvbmZpZ3VyYXRpb24gKGRlbGVnYXRlZCB0byBEaXNwbGF5Q29uZmlnSGFuZGxlcilcbiAgICovXG4gIGFzeW5jIGdldEluZGljYXRvckNvbmZpZygpIHtcbiAgICBhd2FpdCB0aGlzLmVuc3VyZUluaXRpYWxpemVkKCk7XG4gICAgcmV0dXJuIHRoaXMuZGlzcGxheUNvbmZpZ0hhbmRsZXIhLmdldEluZGljYXRvckNvbmZpZygpO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbmZpZ3VyZSBjb2xsZWN0aW9uIHN1Ym1pc3Npb24gc2V0dGluZ3MgKGRlbGVnYXRlZCB0byBDb2xsZWN0aW9uSGFuZGxlcilcbiAgICovXG4gIGFzeW5jIGNvbmZpZ3VyZUNvbGxlY3Rpb25TdWJtaXNzaW9uKGF1dG9TdWJtaXQ6IGJvb2xlYW4pIHtcbiAgICBhd2FpdCB0aGlzLmVuc3VyZUluaXRpYWxpemVkKCk7XG4gICAgcmV0dXJuIHRoaXMuY29sbGVjdGlvbkhhbmRsZXIhLmNvbmZpZ3VyZUNvbGxlY3Rpb25TdWJtaXNzaW9uKGF1dG9TdWJtaXQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBjb2xsZWN0aW9uIHN1Ym1pc3Npb24gY29uZmlndXJhdGlvbiAoZGVsZWdhdGVkIHRvIENvbGxlY3Rpb25IYW5kbGVyKVxuICAgKi9cbiAgYXN5bmMgZ2V0Q29sbGVjdGlvblN1Ym1pc3Npb25Db25maWcoKSB7XG4gICAgYXdhaXQgdGhpcy5lbnN1cmVJbml0aWFsaXplZCgpO1xuICAgIHJldHVybiB0aGlzLmNvbGxlY3Rpb25IYW5kbGVyIS5nZXRDb2xsZWN0aW9uU3VibWlzc2lvbkNvbmZpZygpO1xuICB9XG5cblxuICAvKipcbiAgICogRXhwb3J0IGEgc2luZ2xlIHBlcnNvbmFcbiAgICovXG4gIGFzeW5jIGV4cG9ydFBlcnNvbmEocGVyc29uYU5hbWU6IHN0cmluZykge1xuICAgIGF3YWl0IHRoaXMuZW5zdXJlSW5pdGlhbGl6ZWQoKTtcbiAgICByZXR1cm4gdGhpcy5wZXJzb25hSGFuZGxlciEuZXhwb3J0UGVyc29uYShwZXJzb25hTmFtZSk7XG4gIH1cblxuICAvKipcbiAgICogRXhwb3J0IGFsbCBwZXJzb25hc1xuICAgKi9cbiAgYXN5bmMgZXhwb3J0QWxsUGVyc29uYXMoaW5jbHVkZURlZmF1bHRzID0gdHJ1ZSkge1xuICAgIGF3YWl0IHRoaXMuZW5zdXJlSW5pdGlhbGl6ZWQoKTtcbiAgICByZXR1cm4gdGhpcy5wZXJzb25hSGFuZGxlciEuZXhwb3J0QWxsUGVyc29uYXMoaW5jbHVkZURlZmF1bHRzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbXBvcnQgYSBwZXJzb25hXG4gICAqL1xuICBhc3luYyBpbXBvcnRQZXJzb25hKHNvdXJjZTogc3RyaW5nLCBvdmVyd3JpdGUgPSBmYWxzZSkge1xuICAgIGF3YWl0IHRoaXMuZW5zdXJlSW5pdGlhbGl6ZWQoKTtcbiAgICByZXR1cm4gdGhpcy5wZXJzb25hSGFuZGxlciEuaW1wb3J0UGVyc29uYShzb3VyY2UsIG92ZXJ3cml0ZSk7XG4gIH1cblxuXG4gIC8qKlxuICAgKiBQb3J0Zm9saW8gbWFuYWdlbWVudCBtZXRob2RzXG4gICAqL1xuXG4gIC8qKlxuICAgKiBDaGVjayBwb3J0Zm9saW8gc3RhdHVzIGluY2x1ZGluZyByZXBvc2l0b3J5IGV4aXN0ZW5jZSBhbmQgc3luYyBpbmZvcm1hdGlvblxuICAgKi9cbiAgYXN5bmMgcG9ydGZvbGlvU3RhdHVzKHVzZXJuYW1lPzogc3RyaW5nKSB7XG4gICAgYXdhaXQgdGhpcy5lbnN1cmVJbml0aWFsaXplZCgpO1xuICAgIHJldHVybiB0aGlzLnBvcnRmb2xpb0hhbmRsZXIhLnBvcnRmb2xpb1N0YXR1cyh1c2VybmFtZSk7XG4gIH1cblxuICAvKipcbiAgICogSW5pdGlhbGl6ZSBhIG5ldyBHaXRIdWIgcG9ydGZvbGlvIHJlcG9zaXRvcnlcbiAgICovXG4gIGFzeW5jIGluaXRQb3J0Zm9saW8ob3B0aW9uczoge3JlcG9zaXRvcnlOYW1lPzogc3RyaW5nOyBwcml2YXRlPzogYm9vbGVhbjsgZGVzY3JpcHRpb24/OiBzdHJpbmd9KSB7XG4gICAgYXdhaXQgdGhpcy5lbnN1cmVJbml0aWFsaXplZCgpO1xuICAgIHJldHVybiB0aGlzLnBvcnRmb2xpb0hhbmRsZXIhLmluaXRQb3J0Zm9saW8ob3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogQ29uZmlndXJlIHBvcnRmb2xpbyBzZXR0aW5nc1xuICAgKi9cbiAgYXN5bmMgcG9ydGZvbGlvQ29uZmlnKG9wdGlvbnM6IHthdXRvU3luYz86IGJvb2xlYW47IGRlZmF1bHRWaXNpYmlsaXR5Pzogc3RyaW5nOyBhdXRvU3VibWl0PzogYm9vbGVhbjsgcmVwb3NpdG9yeU5hbWU/OiBzdHJpbmd9KSB7XG4gICAgYXdhaXQgdGhpcy5lbnN1cmVJbml0aWFsaXplZCgpO1xuICAgIHJldHVybiB0aGlzLnBvcnRmb2xpb0hhbmRsZXIhLnBvcnRmb2xpb0NvbmZpZyhvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTeW5jIHBvcnRmb2xpbyB3aXRoIEdpdEh1YlxuICAgKi9cbiAgYXN5bmMgc3luY1BvcnRmb2xpbyhvcHRpb25zOiB7XG4gICAgZGlyZWN0aW9uOiBzdHJpbmc7XG4gICAgbW9kZT86IHN0cmluZztcbiAgICBmb3JjZTogYm9vbGVhbjtcbiAgICBkcnlSdW46IGJvb2xlYW47XG4gICAgY29uZmlybURlbGV0aW9ucz86IGJvb2xlYW47XG4gIH0pIHtcbiAgICBhd2FpdCB0aGlzLmVuc3VyZUluaXRpYWxpemVkKCk7XG4gICAgcmV0dXJuIHRoaXMucG9ydGZvbGlvSGFuZGxlciEuc3luY1BvcnRmb2xpbyhvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGUgY29uZmlndXJhdGlvbiBvcGVyYXRpb25zIC0gZGVsZWdhdGVzIHRvIENvbmZpZ0hhbmRsZXJcbiAgKi9cbiAgYXN5bmMgaGFuZGxlQ29uZmlnT3BlcmF0aW9uKG9wdGlvbnM6IGFueSkge1xuICAgIGF3YWl0IHRoaXMuZW5zdXJlSW5pdGlhbGl6ZWQoKTtcbiAgICByZXR1cm4gdGhpcy5jb25maWdIYW5kbGVyIS5oYW5kbGVDb25maWdPcGVyYXRpb24ob3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlIHN5bmMgb3BlcmF0aW9ucyAtIGRlbGVnYXRlcyB0byBTeW5jSGFuZGxlclxuICAgKi9cbiAgYXN5bmMgaGFuZGxlU3luY09wZXJhdGlvbihvcHRpb25zOiBhbnkpIHtcbiAgICBhd2FpdCB0aGlzLmVuc3VyZUluaXRpYWxpemVkKCk7XG4gICAgcmV0dXJuIHRoaXMuc3luY0hhbmRsZXIhLmhhbmRsZVN5bmNPcGVyYXRpb24ob3B0aW9ucyk7XG4gIH1cblxuICBhc3luYyBkaXNwb3NlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMuY29udGFpbmVyLmRpc3Bvc2UoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZWFyY2ggbG9jYWwgcG9ydGZvbGlvIHVzaW5nIHRoZSBtZXRhZGF0YSBpbmRleCBzeXN0ZW1cbiAgICogVGhpcyBwcm92aWRlcyBmYXN0LCBjb21wcmVoZW5zaXZlIHNlYXJjaCBhY3Jvc3MgYWxsIGVsZW1lbnQgdHlwZXNcbiAgICovXG4gIGFzeW5jIHNlYXJjaFBvcnRmb2xpbyhvcHRpb25zOiB7XG4gICAgcXVlcnk6IHN0cmluZzsgXG4gICAgZWxlbWVudFR5cGU/OiBzdHJpbmc7IFxuICAgIGZ1enp5TWF0Y2g/OiBib29sZWFuOyBcbiAgICBtYXhSZXN1bHRzPzogbnVtYmVyOyBcbiAgICBpbmNsdWRlS2V5d29yZHM/OiBib29sZWFuOyBcbiAgICBpbmNsdWRlVGFncz86IGJvb2xlYW47IFxuICAgIGluY2x1ZGVUcmlnZ2Vycz86IGJvb2xlYW47IFxuICAgIGluY2x1ZGVEZXNjcmlwdGlvbnM/OiBib29sZWFuO1xuICB9KSB7XG4gICAgYXdhaXQgdGhpcy5lbnN1cmVJbml0aWFsaXplZCgpO1xuICAgIHJldHVybiB0aGlzLnBvcnRmb2xpb0hhbmRsZXIhLnNlYXJjaFBvcnRmb2xpbyhvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZWFyY2ggYWNyb3NzIGFsbCBzb3VyY2VzIChsb2NhbCwgR2l0SHViLCBjb2xsZWN0aW9uKSB1c2luZyBVbmlmaWVkSW5kZXhNYW5hZ2VyXG4gICAqIFRoaXMgcHJvdmlkZXMgY29tcHJlaGVuc2l2ZSBzZWFyY2ggd2l0aCBkdXBsaWNhdGUgZGV0ZWN0aW9uIGFuZCB2ZXJzaW9uIGNvbXBhcmlzb25cbiAgICovXG4gIGFzeW5jIHNlYXJjaEFsbChvcHRpb25zOiB7XG4gICAgcXVlcnk6IHN0cmluZztcbiAgICBzb3VyY2VzPzogc3RyaW5nW107XG4gICAgZWxlbWVudFR5cGU/OiBzdHJpbmc7XG4gICAgcGFnZT86IG51bWJlcjtcbiAgICBwYWdlU2l6ZT86IG51bWJlcjtcbiAgICBzb3J0Qnk/OiBzdHJpbmc7XG4gIH0pIHtcbiAgICBhd2FpdCB0aGlzLmVuc3VyZUluaXRpYWxpemVkKCk7XG4gICAgcmV0dXJuIHRoaXMucG9ydGZvbGlvSGFuZGxlciEuc2VhcmNoQWxsKG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbmQgc2VtYW50aWNhbGx5IHNpbWlsYXIgZWxlbWVudHMgdXNpbmcgRW5oYW5jZWQgSW5kZXhcbiAgICovXG4gIGFzeW5jIGZpbmRTaW1pbGFyRWxlbWVudHMob3B0aW9uczoge1xuICAgIGVsZW1lbnROYW1lOiBzdHJpbmc7XG4gICAgZWxlbWVudFR5cGU/OiBzdHJpbmc7XG4gICAgbGltaXQ6IG51bWJlcjtcbiAgICB0aHJlc2hvbGQ6IG51bWJlcjtcbiAgfSkge1xuICAgIHJldHVybiB0aGlzLmVuaGFuY2VkSW5kZXhIYW5kbGVyIS5maW5kU2ltaWxhckVsZW1lbnRzKG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhbGwgcmVsYXRpb25zaGlwcyBmb3IgYSBzcGVjaWZpYyBlbGVtZW50XG4gICAqL1xuICBhc3luYyBnZXRFbGVtZW50UmVsYXRpb25zaGlwcyhvcHRpb25zOiB7XG4gICAgZWxlbWVudE5hbWU6IHN0cmluZztcbiAgICBlbGVtZW50VHlwZT86IHN0cmluZztcbiAgICByZWxhdGlvbnNoaXBUeXBlcz86IHN0cmluZ1tdO1xuICB9KSB7XG4gICAgcmV0dXJuIHRoaXMuZW5oYW5jZWRJbmRleEhhbmRsZXIhLmdldEVsZW1lbnRSZWxhdGlvbnNoaXBzKG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlYXJjaCBmb3IgZWxlbWVudHMgYnkgYWN0aW9uIHZlcmJcbiAgICovXG4gIGFzeW5jIHNlYXJjaEJ5VmVyYihvcHRpb25zOiB7XG4gICAgdmVyYjogc3RyaW5nO1xuICAgIGxpbWl0OiBudW1iZXI7XG4gIH0pIHtcbiAgICByZXR1cm4gdGhpcy5lbmhhbmNlZEluZGV4SGFuZGxlciEuc2VhcmNoQnlWZXJiKG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBzdGF0aXN0aWNzIGFib3V0IEVuaGFuY2VkIEluZGV4IHJlbGF0aW9uc2hpcHNcbiAgICovXG4gIGFzeW5jIGdldFJlbGF0aW9uc2hpcFN0YXRzKCkge1xuICAgIHJldHVybiB0aGlzLmVuaGFuY2VkSW5kZXhIYW5kbGVyIS5nZXRSZWxhdGlvbnNoaXBTdGF0cygpO1xuICB9XG5cbiAgYXN5bmMgcnVuKCkge1xuICAgIGxvZ2dlci5kZWJ1ZyhcIkRvbGxob3VzZU1DUFNlcnZlci5ydW4oKSBzdGFydGVkXCIpO1xuICAgIGxvZ2dlci5pbmZvKFwiU3RhcnRpbmcgRG9sbGhvdXNlTUNQIHNlcnZlci4uLlwiKTtcblxuICAgIGNvbnN0IHRpbWVyID0gdGhpcy5jb250YWluZXIucmVzb2x2ZTxTdGFydHVwVGltZXI+KCdTdGFydHVwVGltZXInKTtcblxuICAgIC8vIElzc3VlICM3MDY6IENyaXRpY2FsIHBhdGggb25seSDigJQgZ2V0IHRvIGNvbm5lY3QoKSBhcyBmYXN0IGFzIHBvc3NpYmxlXG4gICAgLy8gTm9uLWNyaXRpY2FsIHdvcmsgKG1lbW9yeSBhdXRvLWxvYWQsIGFjdGl2YXRpb24gcmVzdG9yZSwgZXRjLikgaXNcbiAgICAvLyBkZWZlcnJlZCB0byBjb21wbGV0ZURlZmVycmVkU2V0dXAoKSB3aGljaCBydW5zIHBvc3QtY29ubmVjdC5cbiAgICB0cnkge1xuICAgICAgdGltZXIuc3RhcnRQaGFzZSgncG9ydGZvbGlvX3ByZXBhcmUnLCB0cnVlKTtcbiAgICAgIGF3YWl0IHRoaXMuaW5pdGlhbGl6ZVBvcnRmb2xpbygpO1xuICAgICAgdGltZXIuZW5kUGhhc2UoJ3BvcnRmb2xpb19wcmVwYXJlJyk7XG5cbiAgICAgIHRpbWVyLnN0YXJ0UGhhc2UoJ2hhbmRsZXJfY3JlYXRpb24nLCB0cnVlKTtcbiAgICAgIGF3YWl0IHRoaXMuY29tcGxldGVJbml0aWFsaXphdGlvbigpO1xuICAgICAgdGltZXIuZW5kUGhhc2UoJ2hhbmRsZXJfY3JlYXRpb24nKTtcblxuICAgICAgLy8gSW5pdGlhbGl6ZSBvcGVyYXRpb25hbCB0ZWxlbWV0cnkgKGFzeW5jLCBub24tYmxvY2tpbmcsIG5ldmVyIHRocm93cylcbiAgICAgIGNvbnN0IG9wZXJhdGlvbmFsVGVsZW1ldHJ5ID0gdGhpcy5jb250YWluZXIucmVzb2x2ZTxPcGVyYXRpb25hbFRlbGVtZXRyeT4oJ09wZXJhdGlvbmFsVGVsZW1ldHJ5Jyk7XG4gICAgICBvcGVyYXRpb25hbFRlbGVtZXRyeS5pbml0aWFsaXplKCkuY2F0Y2goKCkgPT4ge1xuICAgICAgICAvLyBUZWxlbWV0cnkgZXJyb3JzIGFyZSBsb2dnZWQgaW50ZXJuYWxseSwgc2FmZSB0byBpZ25vcmUgaGVyZVxuICAgICAgfSk7XG5cbiAgICAgIGxvZ2dlci5pbmZvKFwiUG9ydGZvbGlvIGFuZCBwZXJzb25hcyBpbml0aWFsaXplZCBzdWNjZXNzZnVsbHlcIik7XG5cbiAgICAgIGlmICghZW52LkRPTExIT1VTRV9HQVRFS0VFUEVSX0VOQUJMRUQpIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oXCLimqDvuI8gIEdhdGVrZWVwZXIgaXMgRElTQUJMRUQgKERPTExIT1VTRV9HQVRFS0VFUEVSX0VOQUJMRUQ9ZmFsc2UpLiBBbGwgcGVybWlzc2lvbiBjaGVja3MgYXJlIGJ5cGFzc2VkLlwiKTtcbiAgICAgIH1cblxuICAgICAgbG9nZ2VyLmluZm8oXCJEb2xsaG91c2VNQ1Agc2VydmVyIHJlYWR5IC0gd2FpdGluZyBmb3IgTUNQIGNvbm5lY3Rpb24gb24gc3RkaW9cIik7XG4gICAgICBsb2dnZXIuZGVidWcoXCJEb2xsaG91c2VNQ1BTZXJ2ZXIucnVuKCkgY29tcGxldGVkIGluaXRpYWxpemF0aW9uXCIpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBFcnJvckhhbmRsZXIubG9nRXJyb3IoJ0RvbGxob3VzZU1DUFNlcnZlci5ydW4uaW5pdGlhbGl6YXRpb24nLCBlcnJvcik7XG4gICAgICB0aHJvdyBlcnJvcjsgLy8gUmUtdGhyb3cgdG8gcHJldmVudCBzZXJ2ZXIgZnJvbSBzdGFydGluZyB3aXRoIGluY29tcGxldGUgaW5pdGlhbGl6YXRpb25cbiAgICB9XG5cbiAgICBjb25zdCB0cmFuc3BvcnQgPSBuZXcgU3RkaW9TZXJ2ZXJUcmFuc3BvcnQoKTtcblxuICAgIC8vIFNldCB1cCBncmFjZWZ1bCBzaHV0ZG93biBoYW5kbGVyc1xuICAgIGNvbnN0IGNsZWFudXAgPSBhc3luYyAoKSA9PiB7XG4gICAgICBsb2dnZXIuaW5mbyhcIlNodXR0aW5nIGRvd24gRG9sbGhvdXNlTUNQIHNlcnZlci4uLlwiKTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgdGhpcy5jb250YWluZXIuZGlzcG9zZSgpO1xuICAgICAgICBsb2dnZXIuaW5mbyhcIkNsZWFudXAgY29tcGxldGVkXCIpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgbG9nZ2VyLmVycm9yKFwiRXJyb3IgZHVyaW5nIGNsZWFudXBcIiwgeyBlcnJvciB9KTtcbiAgICAgIH1cblxuICAgICAgcHJvY2Vzcy5leGl0KDApO1xuICAgIH07XG5cbiAgICAvLyBSZWdpc3RlciBzaHV0ZG93biBoYW5kbGVyc1xuICAgIHByb2Nlc3Mub24oJ1NJR0lOVCcsIGNsZWFudXApO1xuICAgIHByb2Nlc3Mub24oJ1NJR1RFUk0nLCBjbGVhbnVwKTtcbiAgICBwcm9jZXNzLm9uKCdTSUdIVVAnLCBjbGVhbnVwKTtcblxuICAgIC8vIENvbm5lY3QgQVNBUCDigJQgdG9vbHMgYXJlIHJlZ2lzdGVyZWQsIHNlcnZlciBjYW4gYWNjZXB0IHJlcXVlc3RzXG4gICAgdGltZXIuc3RhcnRQaGFzZSgnbWNwX2Nvbm5lY3QnLCB0cnVlKTtcbiAgICBhd2FpdCB0aGlzLnNlcnZlci5jb25uZWN0KHRyYW5zcG9ydCk7XG4gICAgdGltZXIuZW5kUGhhc2UoJ21jcF9jb25uZWN0Jyk7XG4gICAgdGltZXIubWFya0Nvbm5lY3QoKTtcblxuICAgIC8vIE1hcmsgdGhhdCBNQ1AgaXMgbm93IGNvbm5lY3RlZCAtIG5vIG1vcmUgY29uc29sZSBvdXRwdXQgYWxsb3dlZFxuICAgIGxvZ2dlci5zZXRNQ1BDb25uZWN0ZWQoKTtcblxuICAgIC8vIElzc3VlICM3MDYgUGhhc2UgMzogRW1pdCBSRUFEWSBzZW50aW5lbCBmb3IgYnJpZGdlIGNsaWVudHNcbiAgICBwcm9jZXNzLnN0ZGVyci53cml0ZSgnRE9MTEhPVVNFTUNQX1JFQURZXFxuJyk7XG5cbiAgICBsb2dnZXIuaW5mbyhcIkRvbGxob3VzZU1DUCBzZXJ2ZXIgcnVubmluZyBvbiBzdGRpb1wiKTtcblxuICAgIC8vIElzc3VlICM3MDYgUGhhc2UgMjogRGVmZXJyZWQgc2V0dXAg4oCUIHJ1bnMgcG9zdC1jb25uZWN0LCBub24tYmxvY2tpbmdcbiAgICAvLyBQYXR0ZXJuIGVuY3J5cHRpb24sIGJhY2tncm91bmQgdmFsaWRhdG9yLCBtZW1vcnkgYXV0by1sb2FkLCBhY3RpdmF0aW9uXG4gICAgLy8gcmVzdG9yZSwgbG9nIGhvb2tzLCBkYW5nZXIgem9uZSBpbml0IGFsbCBtb3ZlIGhlcmUuXG4gICAgY29uc3QgZGVmZXJyZWRQcm9taXNlID0gdGhpcy5jb250YWluZXIuY29tcGxldGVEZWZlcnJlZFNldHVwKCk7XG4gICAgZGVmZXJyZWRQcm9taXNlLmNhdGNoKGVyciA9PiBsb2dnZXIud2FybignW1N0YXJ0dXBdIERlZmVycmVkIHNldHVwIGVycm9yOicsIGVycikpO1xuXG4gICAgLy8gSXNzdWUgIzcwNiBQaGFzZSA0OiBXaXJlIGRlZmVycmVkIHByb21pc2UgaW50byBTZXJ2ZXJTZXR1cCBmb3IgcmVxdWVzdCBidWZmZXJpbmdcbiAgICBjb25zdCBzZXJ2ZXJTZXR1cCA9IHRoaXMuY29udGFpbmVyLnJlc29sdmU8aW1wb3J0KCcuL3NlcnZlci9TZXJ2ZXJTZXR1cC5qcycpLlNlcnZlclNldHVwPignU2VydmVyU2V0dXAnKTtcbiAgICBzZXJ2ZXJTZXR1cC5zZXREZWZlcnJlZFNldHVwUHJvbWlzZShkZWZlcnJlZFByb21pc2UpO1xuXG4gICAgLy8gTG9nIHN0YXJ0dXAgdGltaW5nIGFmdGVyIGRlZmVycmVkIHNldHVwIGNvbXBsZXRlc1xuICAgIGRlZmVycmVkUHJvbWlzZS50aGVuKGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHJlcG9ydCA9IHRpbWVyLmdldFJlcG9ydCgpO1xuICAgICAgbG9nZ2VyLmluZm8oYFtTdGFydHVwXSBGdWxsIHJlcG9ydDogY29ubmVjdCBhdCAke3JlcG9ydC5jb25uZWN0QXRNc31tcywgYCArXG4gICAgICAgIGBjcml0aWNhbCAke3JlcG9ydC5jcml0aWNhbFBhdGhNc31tcywgZGVmZXJyZWQgJHtyZXBvcnQuZGVmZXJyZWRNc31tcywgYCArXG4gICAgICAgIGB0b3RhbCAke3JlcG9ydC50b3RhbE1zfW1zYCk7XG4gICAgfSkuY2F0Y2goKCkgPT4geyAvKiBhbHJlYWR5IGxvZ2dlZCAqLyB9KTtcblxuICB9XG59XG5cbi8vIEV4cG9ydCBpcyBhbHJlYWR5IGF0IGNsYXNzIGRlY2xhcmF0aW9uXG5cbi8vIE9ubHkgc3RhcnQgdGhlIHNlcnZlciBpZiB0aGlzIGZpbGUgaXMgYmVpbmcgcnVuIGRpcmVjdGx5IChub3QgaW1wb3J0ZWQgYnkgdGVzdHMpXG4vLyBIYW5kbGUgZGlmZmVyZW50IGV4ZWN1dGlvbiBtZXRob2RzIChkaXJlY3QsIG5weCwgQ0xJKVxuY29uc3Qgc2NyaXB0UGF0aCA9IHByb2Nlc3MuYXJndj8uWzFdID8gcGF0aC5ub3JtYWxpemUocHJvY2Vzcy5hcmd2WzFdKSA6ICcnO1xuY29uc3QgaXNEaXJlY3RFeGVjdXRpb24gPVxuICBzY3JpcHRQYXRoLmVuZHNXaXRoKGAke3BhdGguc2VwfWRpc3Qke3BhdGguc2VwfWluZGV4LmpzYCkgfHxcbiAgc2NyaXB0UGF0aC5lbmRzV2l0aChgJHtwYXRoLnNlcH1zcmMke3BhdGguc2VwfWluZGV4LnRzYCk7XG5jb25zdCBpc05weEV4ZWN1dGlvbiA9IHByb2Nlc3MuZW52Lm5wbV9leGVjcGF0aD8uaW5jbHVkZXMoJ25weCcpO1xuY29uc3QgaXNDbGlFeGVjdXRpb24gPSBwcm9jZXNzLmFyZ3ZbMV0/LmVuZHNXaXRoKCcvZG9sbGhvdXNlbWNwJykgfHwgcHJvY2Vzcy5hcmd2WzFdPy5lbmRzV2l0aCgnXFxcXGRvbGxob3VzZW1jcCcpO1xuY29uc3QgaXNUZXN0ID0gcHJvY2Vzcy5lbnYuSkVTVF9XT1JLRVJfSUQ7IC8vIFRoaXMgaXMgc2V0IHdoZW4gSmVzdCBydW5zIHRlc3RzXG5jb25zdCBpc1Rlc3RNb2RlID0gcHJvY2Vzcy5lbnYuVEVTVF9NT0RFID09PSAndHJ1ZSc7IC8vIENoZWNrIGZvciBURVNUX01PREUgZW52aXJvbm1lbnQgdmFyaWFibGVcbmNvbnN0IGRvbGxob3VzZURlYnVnRmxhZyA9IHByb2Nlc3MuZW52LkRPTExIT1VTRV9ERUJVRz8udG9Mb3dlckNhc2UoKTtcbmNvbnN0IGlzRGVidWdTdGFydHVwTG9nZ2luZyA9IGRvbGxob3VzZURlYnVnRmxhZyA9PT0gJ3RydWUnIHx8IGRvbGxob3VzZURlYnVnRmxhZyA9PT0gJzEnO1xuXG4vLyBQcm9ncmVzc2l2ZSBzdGFydHVwIHdpdGggcmV0cmllcyBmb3IgbnB4L0NMSSBleGVjdXRpb25cbmNvbnN0IFNUQVJUVVBfREVMQVlTID0gWzEwLCA1MCwgMTAwLCAyMDBdOyAvLyBQcm9ncmVzc2l2ZSBkZWxheXMgaW4gbXNcblxuYXN5bmMgZnVuY3Rpb24gc3RhcnRTZXJ2ZXJXaXRoUmV0cnkocmV0cmllc0xlZnQgPSBTVEFSVFVQX0RFTEFZUy5sZW5ndGgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKGlzRGVidWdTdGFydHVwTG9nZ2luZykge1xuICAgIGNvbnNvbGUuZXJyb3IoXCJERUJVRzogc3RhcnRTZXJ2ZXJXaXRoUmV0cnkgY2FsbGVkLlwiKTtcbiAgfVxuICB0cnkge1xuICAgIGNvbnN0IGNvbnRhaW5lciA9IG5ldyBEb2xsaG91c2VDb250YWluZXIoKTtcbiAgICBjb25zdCBzZXJ2ZXIgPSBuZXcgRG9sbGhvdXNlTUNQU2VydmVyKGNvbnRhaW5lcik7XG4gICAgYXdhaXQgc2VydmVyLnJ1bigpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmIChyZXRyaWVzTGVmdCA+IDAgJiYgKGlzTnB4RXhlY3V0aW9uIHx8IGlzQ2xpRXhlY3V0aW9uKSkge1xuICAgICAgLy8gVHJ5IGFnYWluIHdpdGggYSBsb25nZXIgZGVsYXlcbiAgICAgIGNvbnN0IGRlbGF5SW5kZXggPSBTVEFSVFVQX0RFTEFZUy5sZW5ndGggLSByZXRyaWVzTGVmdDtcbiAgICAgIGNvbnN0IGRlbGF5ID0gU1RBUlRVUF9ERUxBWVNbZGVsYXlJbmRleF07XG4gICAgICBhd2FpdCBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgZGVsYXkpKTtcbiAgICAgIHJldHVybiBzdGFydFNlcnZlcldpdGhSZXRyeShyZXRyaWVzTGVmdCAtIDEpO1xuICAgIH1cbiAgICAvLyBGaW5hbCBmYWlsdXJlIC0gbWluaW1hbCBlcnJvciBtZXNzYWdlIGZvciBzZWN1cml0eVxuICAgIC8vIE5vdGU6IFVzaW5nIGNvbnNvbGUuZXJyb3IgaGVyZSBpcyBpbnRlbnRpb25hbCBhcyBpdCdzIHRoZSBmaW5hbCBlcnJvciBiZWZvcmUgZXhpdFxuICAgIGNvbnNvbGUuZXJyb3IoXCJbRG9sbGhvdXNlTUNQXSBTZXJ2ZXIgc3RhcnR1cCBmYWlsZWRcIiwgZXJyb3IpOyAvLyBBZGRlZCBlcnJvciBvYmplY3RcbiAgICBwcm9jZXNzLmV4aXQoMSk7XG4gIH1cbn1cblxuaWYgKChpc0RpcmVjdEV4ZWN1dGlvbiB8fCBpc05weEV4ZWN1dGlvbiB8fCBpc0NsaUV4ZWN1dGlvbikgJiYgKCFpc1Rlc3QgfHwgaXNUZXN0TW9kZSkpIHtcbiAgLy8gSXNzdWUgIzcwNDogLS13ZWIgZmxhZyBzdGFydHMgdGhlIHBvcnRmb2xpbyB3ZWIgVUkgaW5zdGVhZCBvZiBNQ1Agc2VydmVyXG4gIGNvbnN0IGlzV2ViTW9kZSA9IHByb2Nlc3MuYXJndi5pbmNsdWRlcygnLS13ZWInKTtcbiAgaWYgKGlzV2ViTW9kZSkge1xuICAgIC8vIElzc3VlICM3OTY6IEJvb3RzdHJhcCBESSBjb250YWluZXIgZm9yIHdlYi1vbmx5IG1vZGUgc28gQVBJIHJvdXRlc1xuICAgIC8vIGdvIHRocm91Z2ggTUNQQVFMSGFuZGxlciAodmFsaWRhdGVkLCBjYWNoZWQsIGdhdGVrZWVwZXItY2hlY2tlZClcbiAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgcG9ydGZvbGlvRGlyID0gcGF0aC5qb2luKG9zLmhvbWVkaXIoKSwgJy5kb2xsaG91c2UnLCAncG9ydGZvbGlvJyk7XG4gICAgICBjb25zdCBwb3J0QXJnID0gcHJvY2Vzcy5hcmd2LmZpbmQoYSA9PiBhLnN0YXJ0c1dpdGgoJy0tcG9ydD0nKSk7XG4gICAgICBjb25zdCBwb3J0ID0gcG9ydEFyZyA/IHBhcnNlSW50KHBvcnRBcmcuc3BsaXQoJz0nKVsxXSwgMTApIDogdW5kZWZpbmVkO1xuICAgICAgY29uc3Qgbm9Ccm93c2VyID0gcHJvY2Vzcy5hcmd2LmluY2x1ZGVzKCctLW5vLW9wZW4nKTtcblxuICAgICAgbGV0IG1jcEFxbEhhbmRsZXI7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBjb250YWluZXIgPSBuZXcgRG9sbGhvdXNlQ29udGFpbmVyKCk7XG4gICAgICAgIGF3YWl0IGNvbnRhaW5lci5wcmVwYXJlUG9ydGZvbGlvKCk7XG4gICAgICAgIGNvbnN0IGJ1bmRsZSA9IGF3YWl0IGNvbnRhaW5lci5ib290c3RyYXBIYW5kbGVycygpO1xuICAgICAgICBhd2FpdCBjb250YWluZXIuY29tcGxldGVEZWZlcnJlZFNldHVwKCk7XG4gICAgICAgIG1jcEFxbEhhbmRsZXIgPSBidW5kbGUubWNwQXFsSGFuZGxlcjtcbiAgICAgICAgY29uc29sZS5lcnJvcihcIltEb2xsaG91c2VNQ1BdIENvbnRhaW5lciBib290c3RyYXBwZWQg4oCUIHdlYiByb3V0ZXMgdXNpbmcgTUNQLUFRTCBHYXRld2F5XCIpO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXCJbRG9sbGhvdXNlTUNQXSBDb250YWluZXIgYm9vdHN0cmFwIGZhaWxlZCDigJQgd2ViIHJvdXRlcyB3aWxsIHVzZSBkaXJlY3QgZmlsZXN5c3RlbSBhY2Nlc3MuXCIpO1xuICAgICAgICBjb25zb2xlLmVycm9yKFwiW0RvbGxob3VzZU1DUF0gUmVhc29uOlwiLCAoZXJyIGFzIEVycm9yKS5tZXNzYWdlIHx8IGVycik7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXCJbRG9sbGhvdXNlTUNQXSBUaGlzIG1heSBpbmRpY2F0ZSBhIGNvcnJ1cHQgcG9ydGZvbGlvIG9yIG1pc3NpbmcgZGVwZW5kZW5jaWVzLlwiKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgeyBzdGFydFdlYlNlcnZlciB9ID0gYXdhaXQgaW1wb3J0KCcuL3dlYi9zZXJ2ZXIuanMnKTtcbiAgICAgIGF3YWl0IHN0YXJ0V2ViU2VydmVyKHsgcG9ydGZvbGlvRGlyLCBwb3J0LCBvcGVuQnJvd3NlcjogIW5vQnJvd3NlciwgbWNwQXFsSGFuZGxlciB9KTtcbiAgICB9KSgpLmNhdGNoKGVyciA9PiB7XG4gICAgICBjb25zb2xlLmVycm9yKFwiW0RvbGxob3VzZU1DUF0gV2ViIFVJIGZhaWxlZCB0byBzdGFydDpcIiwgZXJyKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICBpZiAoaXNEZWJ1Z1N0YXJ0dXBMb2dnaW5nKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFwiREVCVUc6IFNlcnZlciBzdGFydHVwIGNvbmRpdGlvbiBtZXQuIENhbGxpbmcgc3RhcnRTZXJ2ZXJXaXRoUmV0cnkuXCIpO1xuICAgIH1cbiAgICBzdGFydFNlcnZlcldpdGhSZXRyeSgpLmNhdGNoKCgpID0+IHtcbiAgICAgIC8vIE5vdGU6IFVzaW5nIGNvbnNvbGUuZXJyb3IgaGVyZSBpcyBpbnRlbnRpb25hbCBhcyBpdCdzIHRoZSBmaW5hbCBlcnJvciBiZWZvcmUgZXhpdFxuICAgICAgY29uc29sZS5lcnJvcihcIltEb2xsaG91c2VNQ1BdIFNlcnZlciBzdGFydHVwIGZhaWxlZFwiKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9KTtcbiAgfVxufVxuIl19
|
|
674
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUVBLGtFQUFrRTtBQUNsRSw4REFBOEQ7QUFDOUQsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRXRDLE9BQU8sS0FBSyxJQUFJLE1BQU0sTUFBTSxDQUFDO0FBQzdCLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQztBQUNuRSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQztBQUNqRixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDdkQsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQzNDLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUU5RCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFjekQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQzFELE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBQzVFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUNoRSxPQUFPLEtBQUssRUFBRSxNQUFNLElBQUksQ0FBQztBQUd6QixpREFBaUQ7QUFDakQsT0FBTyxDQUFDLEVBQUUsQ0FBQyxtQkFBbUIsRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFO0lBQ3hDLE1BQU0sQ0FBQyxLQUFLLENBQUMsOEJBQThCLEVBQUU7UUFDM0MsS0FBSyxFQUFFLEtBQUssWUFBWSxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUM7UUFDN0QsS0FBSyxFQUFFLEtB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QUFNLENBQUMsaUJBQWlCLENBQUMsQ0FBQztZQUMzRCxNQUFNLGNBQWMsQ0FBQyxFQUFFLFlBQVksRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLENBQUMsU0FBUyxFQUFFLGFBQWEsRUFBRSxDQUFDLENBQUM7UUFDdkYsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUU7WUFDZixPQUFPLENBQUMsS0FBSyxDQUFDLHdDQUF3QyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBQzdELE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDbEIsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO1NBQU0sQ0FBQztRQUNOLElBQUkscUJBQXFCLEVBQUUsQ0FBQztZQUMxQixPQUFPLENBQUMsS0FBSyxDQUFDLG9FQUFvRSxDQUFDLENBQUM7UUFDdEYsQ0FBQztRQUNELG9CQUFvQixFQUFFLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRTtZQUNoQyxvRkFBb0Y7WUFDcEYsT0FBTyxDQUFDLEtBQUssQ0FBQyxzQ0FBc0MsQ0FBQyxDQUFDO1lBQ3RELE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDbEIsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIiMhL3Vzci9iaW4vZW52IG5vZGVcblxuLy8gTG9hZCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZnJvbSAuZW52IGZpbGVzIEJFRk9SRSBhbnl0aGluZyBlbHNlXG4vLyBUaGlzIGVuc3VyZXMgLmVudi5sb2NhbCBhbmQgLmVudiBhcmUgbG9hZGVkIGZvciBhbGwgbW9kdWxlc1xuaW1wb3J0IHsgZW52IH0gZnJvbSAnLi9jb25maWcvZW52LmpzJztcblxuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCB7IFNlcnZlciB9IGZyb20gXCJAbW9kZWxjb250ZXh0cHJvdG9jb2wvc2RrL3NlcnZlci9pbmRleC5qc1wiO1xuaW1wb3J0IHsgU3RkaW9TZXJ2ZXJUcmFuc3BvcnQgfSBmcm9tIFwiQG1vZGVsY29udGV4dHByb3RvY29sL3Nkay9zZXJ2ZXIvc3RkaW8uanNcIjtcbmltcG9ydCB7IEVycm9ySGFuZGxlciB9IGZyb20gXCIuL3V0aWxzL0Vycm9ySGFuZGxlci5qc1wiO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSBcIi4vdXRpbHMvbG9nZ2VyLmpzXCI7XG5pbXBvcnQgeyBEb2xsaG91c2VDb250YWluZXIgfSBmcm9tIFwiLi9kaS9Db250YWluZXIuanNcIjtcbmltcG9ydCB7IEVsZW1lbnRUeXBlIH0gZnJvbSBcIi4vcG9ydGZvbGlvL1BvcnRmb2xpb01hbmFnZXIuanNcIjtcbmltcG9ydCB7IE9wZXJhdGlvbmFsVGVsZW1ldHJ5LCBTdGFydHVwVGltZXIgfSBmcm9tIFwiLi90ZWxlbWV0cnkvaW5kZXguanNcIjtcbmltcG9ydCB7IFBBQ0tBR0VfVkVSU0lPTiB9IGZyb20gXCIuL2dlbmVyYXRlZC92ZXJzaW9uLmpzXCI7XG5pbXBvcnQgdHlwZSB7IEluZGljYXRvckNvbmZpZyB9IGZyb20gXCIuL2NvbmZpZy9pbmRpY2F0b3ItY29uZmlnLmpzXCI7XG5pbXBvcnQgdHlwZSB7IElUb29sSGFuZGxlciB9IGZyb20gXCIuL3NlcnZlci9pbmRleC5qc1wiO1xuaW1wb3J0IHR5cGUgeyBUb29sUmVnaXN0cnkgfSBmcm9tIFwiLi9oYW5kbGVycy9Ub29sUmVnaXN0cnkuanNcIjtcbmltcG9ydCB0eXBlIHsgUGVyc29uYUhhbmRsZXIgfSBmcm9tIFwiLi9oYW5kbGVycy9QZXJzb25hSGFuZGxlci5qc1wiO1xuaW1wb3J0IHR5cGUgeyBFbGVtZW50Q1JVREhhbmRsZXIgfSBmcm9tIFwiLi9oYW5kbGVycy9FbGVtZW50Q1JVREhhbmRsZXIuanNcIjtcbmltcG9ydCB0eXBlIHsgQ29sbGVjdGlvbkhhbmRsZXIgfSBmcm9tIFwiLi9oYW5kbGVycy9Db2xsZWN0aW9uSGFuZGxlci5qc1wiO1xuaW1wb3J0IHR5cGUgeyBQb3J0Zm9saW9IYW5kbGVyIH0gZnJvbSBcIi4vaGFuZGxlcnMvUG9ydGZvbGlvSGFuZGxlci5qc1wiO1xuaW1wb3J0IHR5cGUgeyBHaXRIdWJBdXRoSGFuZGxlciB9IGZyb20gXCIuL2hhbmRsZXJzL0dpdEh1YkF1dGhIYW5kbGVyLmpzXCI7XG5pbXBvcnQgdHlwZSB7IERpc3BsYXlDb25maWdIYW5kbGVyIH0gZnJvbSBcIi4vaGFuZGxlcnMvRGlzcGxheUNvbmZpZ0hhbmRsZXIuanNcIjtcbmltcG9ydCB0eXBlIHsgSWRlbnRpdHlIYW5kbGVyIH0gZnJvbSBcIi4vaGFuZGxlcnMvSWRlbnRpdHlIYW5kbGVyLmpzXCI7XG5pbXBvcnQgdHlwZSB7IENvbmZpZ0hhbmRsZXIgfSBmcm9tIFwiLi9oYW5kbGVycy9Db25maWdIYW5kbGVyLmpzXCI7XG5pbXBvcnQgdHlwZSB7IFN5bmNIYW5kbGVyIH0gZnJvbSBcIi4vaGFuZGxlcnMvU3luY0hhbmRsZXJWMi5qc1wiO1xuaW1wb3J0IHR5cGUgeyBFbmhhbmNlZEluZGV4SGFuZGxlciB9IGZyb20gXCIuL2hhbmRsZXJzL0VuaGFuY2VkSW5kZXhIYW5kbGVyLmpzXCI7XG5pbXBvcnQgeyBDb25maWdNYW5hZ2VyIH0gZnJvbSBcIi4vY29uZmlnL0NvbmZpZ01hbmFnZXIuanNcIjtcbmltcG9ydCB7IEZpbGVPcGVyYXRpb25zU2VydmljZSB9IGZyb20gXCIuL3NlcnZpY2VzL0ZpbGVPcGVyYXRpb25zU2VydmljZS5qc1wiO1xuaW1wb3J0IHsgRmlsZUxvY2tNYW5hZ2VyIH0gZnJvbSBcIi4vc2VjdXJpdHkvZmlsZUxvY2tNYW5hZ2VyLmpzXCI7XG5pbXBvcnQgKiBhcyBvcyBmcm9tIFwib3NcIjtcbmltcG9ydCB0eXBlIHsgRW5zZW1ibGVFbGVtZW50IH0gZnJvbSBcIi4vZWxlbWVudHMvZW5zZW1ibGVzL3R5cGVzLmpzXCI7XG5cbi8vIERlZmVuc2l2ZSBlcnJvciBoYW5kbGluZyBmb3IgbnB4L0NMSSBleGVjdXRpb25cbnByb2Nlc3Mub24oJ3VuY2F1Z2h0RXhjZXB0aW9uJywgKGVycm9yKSA9PiB7XG4gIGxvZ2dlci5lcnJvcignVW5oYW5kbGVkIGV4Y2VwdGlvbiBkZXRlY3RlZCcsIHtcbiAgICBlcnJvcjogZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpLFxuICAgIHN0YWNrOiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3Iuc3RhY2sgOiB1bmRlZmluZWRcbiAgfSk7XG4gIGNvbnNvbGUuZXJyb3IoJ1tEb2xsaG91c2VNQ1BdIFNlcnZlciBzdGFydHVwIGZhaWxlZCcpO1xuICBwcm9jZXNzLmV4aXQoMSk7XG59KTtcblxucHJvY2Vzcy5vbigndW5oYW5kbGVkUmVqZWN0aW9uJywgKHJlYXNvbiwgcHJvbWlzZSkgPT4ge1xuICBsb2dnZXIuZXJyb3IoJ1VuaGFuZGxlZCBwcm9taXNlIHJlamVjdGlvbiBkZXRlY3RlZCcsIHtcbiAgICByZWFzb246IHJlYXNvbiBpbnN0YW5jZW9mIEVycm9yID8gcmVhc29uLm1lc3NhZ2UgOiBTdHJpbmcocmVhc29uKSxcbiAgICBzdGFjazogcmVhc29uIGluc3RhbmNlb2YgRXJyb3IgPyByZWFzb24uc3RhY2sgOiB1bmRlZmluZWQsXG4gICAgcHJvbWlzZVxuICB9KTtcbiAgY29uc29sZS5lcnJvcignW0RvbGxob3VzZU1DUF0gU2VydmVyIHN0YXJ0dXAgZmFpbGVkJyk7XG4gIHByb2Nlc3MuZXhpdCgxKTtcbn0pO1xuXG4vLyBPbmx5IGxvZyBleGVjdXRpb24gZW52aXJvbm1lbnQgaW4gZGVidWcgbW9kZVxuaWYgKHByb2Nlc3MuZW52LkRPTExIT1VTRV9ERUJVRykge1xuICBjb25zb2xlLmVycm9yKCdbRG9sbGhvdXNlTUNQXSBEZWJ1ZyBtb2RlIGVuYWJsZWQnKTtcbn1cblxuZXhwb3J0IGNsYXNzIERvbGxob3VzZU1DUFNlcnZlciBpbXBsZW1lbnRzIElUb29sSGFuZGxlciB7XG4gIHByaXZhdGUgc2VydmVyOiBTZXJ2ZXI7XG4gIHB1YmxpYyBwZXJzb25hc0Rpcjogc3RyaW5nIHwgbnVsbDtcbiAgcHJpdmF0ZSBjdXJyZW50VXNlcjogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgaXNJbml0aWFsaXplZDogYm9vbGVhbiA9IGZhbHNlO1xuICBwcml2YXRlIGluaXRpYWxpemF0aW9uUHJvbWlzZTogUHJvbWlzZTx2b2lkPiB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGNvbnRhaW5lcjogRG9sbGhvdXNlQ29udGFpbmVyO1xuICBwcml2YXRlIHRvb2xSZWdpc3RyeT86IFRvb2xSZWdpc3RyeTtcbiAgcHJpdmF0ZSBlbmhhbmNlZEluZGV4SGFuZGxlcj86IEVuaGFuY2VkSW5kZXhIYW5kbGVyO1xuICBwcml2YXRlIHBlcnNvbmFIYW5kbGVyPzogUGVyc29uYUhhbmRsZXI7XG4gIHByaXZhdGUgZWxlbWVudENSVURIYW5kbGVyPzogRWxlbWVudENSVURIYW5kbGVyO1xuICBwcml2YXRlIGNvbGxlY3Rpb25IYW5kbGVyPzogQ29sbGVjdGlvbkhhbmRsZXI7XG4gIHByaXZhdGUgcG9ydGZvbGlvSGFuZGxlcj86IFBvcnRmb2xpb0hhbmRsZXI7XG4gIHByaXZhdGUgZ2l0aHViQXV0aEhhbmRsZXI/OiBHaXRIdWJBdXRoSGFuZGxlcjtcbiAgcHJpdmF0ZSBkaXNwbGF5Q29uZmlnSGFuZGxlcj86IERpc3BsYXlDb25maWdIYW5kbGVyO1xuICBwcml2YXRlIGlkZW50aXR5SGFuZGxlcj86IElkZW50aXR5SGFuZGxlcjtcbiAgcHJpdmF0ZSBjb25maWdIYW5kbGVyPzogQ29uZmlnSGFuZGxlcjtcbiAgcHJpdmF0ZSBzeW5jSGFuZGxlcj86IFN5bmNIYW5kbGVyO1xuICBwcml2YXRlIHJlc291cmNlSGFuZGxlcj86IGltcG9ydCgnLi9oYW5kbGVycy9SZXNvdXJjZUhhbmRsZXIuanMnKS5SZXNvdXJjZUhhbmRsZXI7XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIG5ldyBEb2xsaG91c2VNQ1BTZXJ2ZXIgaW5zdGFuY2VcbiAgICpcbiAgICogQHBhcmFtIGNvbnRhaW5lciBEb2xsaG91c2VDb250YWluZXIgaW5zdGFuY2UgZm9yIGRlcGVuZGVuY3kgaW5qZWN0aW9uLlxuICAgKiAgICAgICAgICAgICAgICAgIFVzZSBgbmV3IERvbGxob3VzZUNvbnRhaW5lcigpYCBmb3IgcHJvZHVjdGlvbiBvclxuICAgKiAgICAgICAgICAgICAgICAgIGBjcmVhdGVJbnRlZ3JhdGlvbkNvbnRhaW5lcigpLmNvbnRhaW5lcmAgZm9yIHRlc3RzLlxuICAgKi9cbiAgY29uc3RydWN0b3IoY29udGFpbmVyOiBEb2xsaG91c2VDb250YWluZXIpIHtcbiAgICAvLyBCdWlsZCBjYXBhYmlsaXRpZXMgb2JqZWN0IGNvbmRpdGlvbmFsbHkgYmFzZWQgb24gY29uZmlndXJhdGlvblxuICAgIC8vIFJlc291cmNlcyBhcmUgZGlzYWJsZWQgYnkgZGVmYXVsdCAoYWR2ZXJ0aXNlX3Jlc291cmNlczogZmFsc2UpXG4gICAgY29uc3QgY2FwYWJpbGl0aWVzOiBhbnkgPSB7XG4gICAgICB0b29sczoge30sXG4gICAgfTtcblxuICAgIC8vIENoZWNrIGlmIHJlc291cmNlcyBzaG91bGQgYmUgYWR2ZXJ0aXNlZFxuICAgIC8vIFRoaXMgaXMgYSBmdXR1cmUtcHJvb2YgaW1wbGVtZW50YXRpb24gLSByZXNvdXJjZXMgYXJlIG9wdC1pblxuICAgIHRyeSB7XG4gICAgICAvLyBJbml0aWFsaXplIENvbmZpZ01hbmFnZXIgdG8gY2hlY2sgcmVzb3VyY2Ugc2V0dGluZ3NcbiAgICAgIC8vIE5vdGU6IENvbmZpZyBtYXkgbm90IGJlIGZ1bGx5IGluaXRpYWxpemVkIHlldCwgc28gd2UgY2hlY2sgc3luY2hyb25vdXNseVxuICAgICAgLy8gSWYgY29uZmlnIGlzIG5vdCBpbml0aWFsaXplZCwgZGVmYXVsdHMgKGFkdmVydGlzZV9yZXNvdXJjZXM6IGZhbHNlKSBhcHBseVxuICAgICAgY29uc3QgZmlsZUxvY2tNYW5hZ2VyID0gbmV3IEZpbGVMb2NrTWFuYWdlcigpO1xuICAgICAgY29uc3QgZmlsZU9wZXJhdGlvbnMgPSBuZXcgRmlsZU9wZXJhdGlvbnNTZXJ2aWNlKGZpbGVMb2NrTWFuYWdlcik7XG4gICAgICBjb25zdCBjb25maWdNYW5hZ2VyID0gbmV3IENvbmZpZ01hbmFnZXIoZmlsZU9wZXJhdGlvbnMsIG9zKTtcbiAgICAgIGNvbnN0IHJlc291cmNlc0NvbmZpZyA9IGNvbmZpZ01hbmFnZXIuZ2V0U2V0dGluZzxhbnk+KCdlbGVtZW50cy5lbmhhbmNlZF9pbmRleC5yZXNvdXJjZXMnKTtcblxuICAgICAgaWYgKHJlc291cmNlc0NvbmZpZz8uYWR2ZXJ0aXNlX3Jlc291cmNlcyA9PT0gdHJ1ZSkge1xuICAgICAgICBjYXBhYmlsaXRpZXMucmVzb3VyY2VzID0ge307XG4gICAgICAgIGxvZ2dlci5pbmZvKCdbRG9sbGhvdXNlTUNQXSBNQ1AgUmVzb3VyY2VzIGNhcGFiaWxpdHkgYWR2ZXJ0aXNlZCAoZW5hYmxlZCB2aWEgY29uZmlnKScpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbG9nZ2VyLmluZm8oJ1tEb2xsaG91c2VNQ1BdIE1DUCBSZXNvdXJjZXMgY2FwYWJpbGl0eSBOT1QgYWR2ZXJ0aXNlZCAoZGlzYWJsZWQgYnkgZGVmYXVsdCknKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gQ29uZmlnIG5vdCBpbml0aWFsaXplZCB5ZXQgLSB1c2Ugc2FmZSBkZWZhdWx0IChubyByZXNvdXJjZXMpXG4gICAgICBjb25zdCBlcnJvck1lc3NhZ2UgPSBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcik7XG4gICAgICBsb2dnZXIuZGVidWcoYFtEb2xsaG91c2VNQ1BdIENvbmZpZyBub3QgaW5pdGlhbGl6ZWQgeWV0LCByZXNvdXJjZXMgY2FwYWJpbGl0eSBkaXNhYmxlZCBieSBkZWZhdWx0OiAke2Vycm9yTWVzc2FnZX1gKTtcbiAgICB9XG5cbiAgICB0aGlzLnNlcnZlciA9IG5ldyBTZXJ2ZXIoXG4gICAgICB7XG4gICAgICAgIG5hbWU6IFwiZG9sbGhvdXNlbWNwXCIsXG4gICAgICAgIHZlcnNpb246IFBBQ0tBR0VfVkVSU0lPTixcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGNhcGFiaWxpdGllcyxcbiAgICAgIH1cbiAgICApO1xuXG4gICAgdGhpcy5wZXJzb25hc0RpciA9IG51bGw7XG4gICAgdGhpcy5jdXJyZW50VXNlciA9IHByb2Nlc3MuZW52LkRPTExIT1VTRV9VU0VSIHx8IG51bGw7XG4gICAgdGhpcy5jb250YWluZXIgPSBjb250YWluZXI7XG4gIH1cbiAgXG4gIHByaXZhdGUgYXN5bmMgaW5pdGlhbGl6ZVBvcnRmb2xpbygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLmNvbnRhaW5lci5wcmVwYXJlUG9ydGZvbGlvKCk7XG4gICAgdGhpcy5wZXJzb25hc0RpciA9IHRoaXMuY29udGFpbmVyLmdldFBlcnNvbmFzRGlyKCk7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBDb21wbGV0ZSBpbml0aWFsaXphdGlvbiBhZnRlciBwb3J0Zm9saW8gaXMgcmVhZHlcbiAgICogRklYICM2MTA6IFRoaXMgd2FzIHByZXZpb3VzbHkgaW4gYSAudGhlbigpIGNhbGxiYWNrIGluIHRoZSBjb25zdHJ1Y3RvclxuICAgKiBOb3cgY2FsbGVkIHN5bmNocm9ub3VzbHkgZnJvbSBydW4oKSB0byBwcmV2ZW50IHJhY2UgY29uZGl0aW9uXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGNvbXBsZXRlSW5pdGlhbGl6YXRpb24oKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gQ3JlYXRlIGhhbmRsZXJzIHdpdGggc2VydmVyIGluc3RhbmNlIC0gYWxsIHN0YXRlIG1hbmFnZWQgYnkgc2VydmljZXNcbiAgICBjb25zdCBoYW5kbGVycyA9IGF3YWl0IHRoaXMuY29udGFpbmVyLmNyZWF0ZUhhbmRsZXJzKHRoaXMuc2VydmVyKTtcblxuICAgIHRoaXMucGVyc29uYUhhbmRsZXIgPSBoYW5kbGVycy5wZXJzb25hSGFuZGxlcjtcbiAgICB0aGlzLmVsZW1lbnRDUlVESGFuZGxlciA9IGhhbmRsZXJzLmVsZW1lbnRDcnVkSGFuZGxlcjtcbiAgICB0aGlzLmNvbGxlY3Rpb25IYW5kbGVyID0gaGFuZGxlcnMuY29sbGVjdGlvbkhhbmRsZXI7XG4gICAgdGhpcy5wb3J0Zm9saW9IYW5kbGVyID0gaGFuZGxlcnMucG9ydGZvbGlvSGFuZGxlcjtcbiAgICB0aGlzLmdpdGh1YkF1dGhIYW5kbGVyID0gaGFuZGxlcnMuZ2l0aHViQXV0aEhhbmRsZXI7XG4gICAgdGhpcy5kaXNwbGF5Q29uZmlnSGFuZGxlciA9IGhhbmRsZXJzLmRpc3BsYXlDb25maWdIYW5kbGVyO1xuICAgIHRoaXMuaWRlbnRpdHlIYW5kbGVyID0gaGFuZGxlcnMuaWRlbnRpdHlIYW5kbGVyO1xuICAgIHRoaXMuY29uZmlnSGFuZGxlciA9IGhhbmRsZXJzLmNvbmZpZ0hhbmRsZXI7XG4gICAgdGhpcy5zeW5jSGFuZGxlciA9IGhhbmRsZXJzLnN5bmNIYW5kbGVyO1xuICAgIHRoaXMudG9vbFJlZ2lzdHJ5ID0gaGFuZGxlcnMudG9vbFJlZ2lzdHJ5O1xuICAgIHRoaXMuZW5oYW5jZWRJbmRleEhhbmRsZXIgPSBoYW5kbGVycy5lbmhhbmNlZEluZGV4SGFuZGxlcjtcblxuICAgIC8vIEluaXRpYWxpemUgYW5kIHJlZ2lzdGVyIHJlc291cmNlIGhhbmRsZXJzXG4gICAgLy8gUmVzb3VyY2VzIGFyZSBkaXNhYmxlZCBieSBkZWZhdWx0IGFuZCByZXF1aXJlIGV4cGxpY2l0IGNvbmZpZ3VyYXRpb25cbiAgICBhd2FpdCB0aGlzLmluaXRpYWxpemVSZXNvdXJjZUhhbmRsZXJzKCk7XG5cbiAgICB0aGlzLmlzSW5pdGlhbGl6ZWQgPSB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemUgTUNQIFJlc291cmNlcyBoYW5kbGVycyBpZiBlbmFibGVkIGluIGNvbmZpZ3VyYXRpb25cbiAgICogVGhpcyBpcyBzZXBhcmF0ZSBmcm9tIG90aGVyIGhhbmRsZXJzIGJlY2F1c2UgaXQgcmVxdWlyZXMgZHluYW1pYyBpbXBvcnRcbiAgICogYW5kIGNvbmRpdGlvbmFsIHJlZ2lzdHJhdGlvbiBiYXNlZCBvbiBjb25maWd1cmF0aW9uXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGluaXRpYWxpemVSZXNvdXJjZUhhbmRsZXJzKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB7IFJlc291cmNlSGFuZGxlciB9ID0gYXdhaXQgaW1wb3J0KCcuL2hhbmRsZXJzL1Jlc291cmNlSGFuZGxlci5qcycpO1xuICAgICAgY29uc3QgY29uZmlnTWFuYWdlciA9IHRoaXMuY29udGFpbmVyLnJlc29sdmU8Q29uZmlnTWFuYWdlcj4oJ0NvbmZpZ01hbmFnZXInKTtcblxuICAgICAgdGhpcy5yZXNvdXJjZUhhbmRsZXIgPSBuZXcgUmVzb3VyY2VIYW5kbGVyKGNvbmZpZ01hbmFnZXIpO1xuICAgICAgYXdhaXQgdGhpcy5yZXNvdXJjZUhhbmRsZXIuaW5pdGlhbGl6ZSh0aGlzLnNlcnZlcik7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIFJlc291cmNlcyBhcmUgb3B0aW9uYWwgLSBkb24ndCBmYWlsIHNlcnZlciBzdGFydHVwIGlmIHRoZXkgY2FuJ3QgYmUgaW5pdGlhbGl6ZWRcbiAgICAgIGxvZ2dlci53YXJuKCdbRG9sbGhvdXNlTUNQXSBGYWlsZWQgdG8gaW5pdGlhbGl6ZSByZXNvdXJjZSBoYW5kbGVycywgY29udGludWluZyB3aXRob3V0IHJlc291cmNlcycpO1xuICAgICAgbG9nZ2VyLmRlYnVnKGBSZXNvdXJjZSBpbml0aWFsaXphdGlvbiBlcnJvcjogJHtlcnJvcn1gKTtcbiAgICB9XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBFbnN1cmUgc2VydmVyIGlzIGluaXRpYWxpemVkIGJlZm9yZSBhbnkgb3BlcmF0aW9uXG4gICAqIEZJWCAjNjEwOiBBZGRlZCBmb3IgdGVzdCBjb21wYXRpYmlsaXR5IC0gdGVzdHMgZG9uJ3QgY2FsbCBydW4oKVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBlbnN1cmVJbml0aWFsaXplZCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5pc0luaXRpYWxpemVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIFxuICAgIC8vIElmIGluaXRpYWxpemF0aW9uIGlzIGFscmVhZHkgaW4gcHJvZ3Jlc3MsIHdhaXQgZm9yIGl0XG4gICAgaWYgKHRoaXMuaW5pdGlhbGl6YXRpb25Qcm9taXNlKSB7XG4gICAgICBhd2FpdCB0aGlzLmluaXRpYWxpemF0aW9uUHJvbWlzZTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgXG4gICAgLy8gU3RhcnQgaW5pdGlhbGl6YXRpb25cbiAgICB0aGlzLmluaXRpYWxpemF0aW9uUHJvbWlzZSA9IChhc3luYyAoKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCB0aGlzLmluaXRpYWxpemVQb3J0Zm9saW8oKTtcbiAgICAgICAgYXdhaXQgdGhpcy5jb21wbGV0ZUluaXRpYWxpemF0aW9uKCk7XG4gICAgICAgIGxvZ2dlci5pbmZvKFwiUG9ydGZvbGlvIGFuZCBwZXJzb25hcyBpbml0aWFsaXplZCBzdWNjZXNzZnVsbHkgKGxhenkpXCIpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgRXJyb3JIYW5kbGVyLmxvZ0Vycm9yKCdEb2xsaG91c2VNQ1BTZXJ2ZXIuZW5zdXJlSW5pdGlhbGl6ZWQnLCBlcnJvcik7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgIH0pKCk7XG4gICAgXG4gICAgYXdhaXQgdGhpcy5pbml0aWFsaXphdGlvblByb21pc2U7XG4gIH1cbiAgXG4gIC8vIFRvb2wgaGFuZGxlciBtZXRob2RzIC0gbm93IHB1YmxpYyBmb3IgYWNjZXNzIGZyb20gdG9vbCBtb2R1bGVzXG4gIFxuICBhc3luYyBsaXN0UGVyc29uYXMoKSB7XG4gICAgYXdhaXQgdGhpcy5lbnN1cmVJbml0aWFsaXplZCgpO1xuICAgIHJldHVybiB0aGlzLnBlcnNvbmFIYW5kbGVyIS5saXN0UGVyc29uYXMoKTtcbiAgfVxuXG4gIC8vIFVzZSBhY3RpdmF0ZUVsZW1lbnQobmFtZSwgJ3BlcnNvbmEnKSwgZGVhY3RpdmF0ZUVsZW1lbnQobmFtZSwgJ3BlcnNvbmEnKSxcbiAgLy8gZ2V0QWN0aXZlRWxlbWVudHMoJ3BlcnNvbmEnKSwgYW5kIGdldEVsZW1lbnREZXRhaWxzKG5hbWUsICdwZXJzb25hJykgaW5zdGVhZC5cbiAgLy8gVGhlc2Ugd2VyZSByZW1vdmVkIHRvIG5vcm1hbGl6ZSBwZXJzb25hIGhhbmRsaW5nIHRocm91Z2ggdGhlIGdlbmVyaWMgZWxlbWVudCBBUEkuXG5cbiAgYXN5bmMgcmVsb2FkUGVyc29uYXMoKSB7XG4gICAgYXdhaXQgdGhpcy5lbnN1cmVJbml0aWFsaXplZCgpO1xuICAgIHJldHVybiB0aGlzLnBlcnNvbmFIYW5kbGVyIS5yZWxvYWRQZXJzb25hcygpO1xuICB9XG5cbiAgLy8gPT09PT0gRWxlbWVudCBNZXRob2RzIChHZW5lcmljIGZvciBhbGwgZWxlbWVudCB0eXBlcykgPT09PT1cbiAgXG4gIGFzeW5jIGxpc3RFbGVtZW50cyh0eXBlOiBzdHJpbmcpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgbm9ybWFsaXplZFR5cGUgPSB0aGlzLmVsZW1lbnRDUlVESGFuZGxlciEubm9ybWFsaXplRWxlbWVudFR5cGUodHlwZSk7XG4gICAgICBpZiAobm9ybWFsaXplZFR5cGUgPT09IEVsZW1lbnRUeXBlLlBFUlNPTkEpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubGlzdFBlcnNvbmFzKCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5lbGVtZW50Q1JVREhhbmRsZXIhLmxpc3RFbGVtZW50cyhub3JtYWxpemVkVHlwZSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIEVycm9ySGFuZGxlci5sb2dFcnJvcignRG9sbGhvdXNlTUNQU2VydmVyLmxpc3RFbGVtZW50cycsIGVycm9yLCB7IHR5cGUgfSk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgIHRleHQ6IGDinYwgRmFpbGVkIHRvIGxpc3QgJHt0eXBlfTogJHtFcnJvckhhbmRsZXIuZ2V0VXNlck1lc3NhZ2UoZXJyb3IpfWBcbiAgICAgICAgfV1cbiAgICAgIH07XG4gICAgfVxuICB9XG4gIFxuICBhc3luYyBhY3RpdmF0ZUVsZW1lbnQobmFtZTogc3RyaW5nLCB0eXBlOiBzdHJpbmcsIGNvbnRleHQ/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+KSB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIEZJWDogSXNzdWUgIzI4MSAtIFJvdXRlIGFsbCBlbGVtZW50IHR5cGVzIHRocm91Z2ggZWxlbWVudENSVURIYW5kbGVyXG4gICAgICAvLyBQZXJzb25hSGFuZGxlci5hY3RpdmF0ZVBlcnNvbmEgaXMgZGVwcmVjYXRlZDsgUGVyc29uYUFjdGl2YXRpb25TdHJhdGVneSBoYW5kbGVzIHBlcnNvbmFzXG4gICAgICBjb25zdCBub3JtYWxpemVkVHlwZSA9IHRoaXMuZWxlbWVudENSVURIYW5kbGVyIS5ub3JtYWxpemVFbGVtZW50VHlwZSh0eXBlKTtcbiAgICAgIHJldHVybiB0aGlzLmVsZW1lbnRDUlVESGFuZGxlciEuYWN0aXZhdGVFbGVtZW50KG5hbWUsIG5vcm1hbGl6ZWRUeXBlLCBjb250ZXh0KTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgRXJyb3JIYW5kbGVyLmxvZ0Vycm9yKCdEb2xsaG91c2VNQ1BTZXJ2ZXIuYWN0aXZhdGVFbGVtZW50JywgZXJyb3IsIHsgdHlwZSwgbmFtZSB9KTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgdGV4dDogYOKdjCBGYWlsZWQgdG8gYWN0aXZhdGUgJHt0eXBlfSAnJHtuYW1lfSc6ICR7RXJyb3JIYW5kbGVyLmdldFVzZXJNZXNzYWdlKGVycm9yKX1gXG4gICAgICAgIH1dXG4gICAgICB9O1xuICAgIH1cbiAgfVxuICBcbiAgYXN5bmMgZ2V0QWN0aXZlRWxlbWVudHModHlwZTogc3RyaW5nKSB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIEZJWDogSXNzdWUgIzI4MSAtIFJvdXRlIGFsbCBlbGVtZW50IHR5cGVzIHRocm91Z2ggZWxlbWVudENSVURIYW5kbGVyXG4gICAgICAvLyBQZXJzb25hSGFuZGxlci5nZXRBY3RpdmVQZXJzb25hIGlzIGRlcHJlY2F0ZWQ7IFBlcnNvbmFBY3RpdmF0aW9uU3RyYXRlZ3kgaGFuZGxlcyBwZXJzb25hc1xuICAgICAgY29uc3Qgbm9ybWFsaXplZFR5cGUgPSB0aGlzLmVsZW1lbnRDUlVESGFuZGxlciEubm9ybWFsaXplRWxlbWVudFR5cGUodHlwZSk7XG4gICAgICByZXR1cm4gdGhpcy5lbGVtZW50Q1JVREhhbmRsZXIhLmdldEFjdGl2ZUVsZW1lbnRzKG5vcm1hbGl6ZWRUeXBlKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgRXJyb3JIYW5kbGVyLmxvZ0Vycm9yKCdEb2xsaG91c2VNQ1BTZXJ2ZXIuZ2V0QWN0aXZlRWxlbWVudHMnLCBlcnJvciwgeyB0eXBlIH0pO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICB0ZXh0OiBg4p2MIEZhaWxlZCB0byBnZXQgYWN0aXZlICR7dHlwZX06ICR7RXJyb3JIYW5kbGVyLmdldFVzZXJNZXNzYWdlKGVycm9yKX1gXG4gICAgICAgIH1dXG4gICAgICB9O1xuICAgIH1cbiAgfVxuICBcbiAgYXN5bmMgZGVhY3RpdmF0ZUVsZW1lbnQobmFtZTogc3RyaW5nLCB0eXBlOiBzdHJpbmcpIHtcbiAgICB0cnkge1xuICAgICAgLy8gRklYOiBJc3N1ZSAjMjgxIC0gUm91dGUgYWxsIGVsZW1lbnQgdHlwZXMgdGhyb3VnaCBlbGVtZW50Q1JVREhhbmRsZXJcbiAgICAgIC8vIFBlcnNvbmFIYW5kbGVyLmRlYWN0aXZhdGVQZXJzb25hIGlzIGRlcHJlY2F0ZWQ7IFBlcnNvbmFBY3RpdmF0aW9uU3RyYXRlZ3kgaGFuZGxlcyBwZXJzb25hc1xuICAgICAgY29uc3Qgbm9ybWFsaXplZFR5cGUgPSB0aGlzLmVsZW1lbnRDUlVESGFuZGxlciEubm9ybWFsaXplRWxlbWVudFR5cGUodHlwZSk7XG4gICAgICByZXR1cm4gdGhpcy5lbGVtZW50Q1JVREhhbmRsZXIhLmRlYWN0aXZhdGVFbGVtZW50KG5hbWUsIG5vcm1hbGl6ZWRUeXBlKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgRXJyb3JIYW5kbGVyLmxvZ0Vycm9yKCdEb2xsaG91c2VNQ1BTZXJ2ZXIuZGVhY3RpdmF0ZUVsZW1lbnQnLCBlcnJvciwgeyB0eXBlLCBuYW1lIH0pO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICB0ZXh0OiBg4p2MIEZhaWxlZCB0byBkZWFjdGl2YXRlICR7dHlwZX0gJyR7bmFtZX0nOiAke0Vycm9ySGFuZGxlci5nZXRVc2VyTWVzc2FnZShlcnJvcil9YFxuICAgICAgICB9XVxuICAgICAgfTtcbiAgICB9XG4gIH1cbiAgXG4gIGFzeW5jIGdldEVsZW1lbnREZXRhaWxzKG5hbWU6IHN0cmluZywgdHlwZTogc3RyaW5nKSB7XG4gICAgLy8gRklYOiBJc3N1ZSAjMjc2IC0gUm91dGUgYWxsIGVsZW1lbnQgdHlwZXMgdGhyb3VnaCBlbGVtZW50Q1JVREhhbmRsZXIgZm9yIGNvbnNpc3RlbnQgZXJyb3IgaGFuZGxpbmdcbiAgICAvLyBQZXJzb25hSGFuZGxlci5nZXRQZXJzb25hRGV0YWlscyBpcyBkZXByZWNhdGVkOyBQZXJzb25hQWN0aXZhdGlvblN0cmF0ZWd5IGhhbmRsZXMgcGVyc29uYXNcbiAgICBjb25zdCBub3JtYWxpemVkVHlwZSA9IHRoaXMuZWxlbWVudENSVURIYW5kbGVyIS5ub3JtYWxpemVFbGVtZW50VHlwZSh0eXBlKTtcbiAgICByZXR1cm4gdGhpcy5lbGVtZW50Q1JVREhhbmRsZXIhLmdldEVsZW1lbnREZXRhaWxzKG5hbWUsIG5vcm1hbGl6ZWRUeXBlKTtcbiAgfVxuICBcbiAgYXN5bmMgcmVsb2FkRWxlbWVudHModHlwZTogc3RyaW5nKSB7XG4gICAgYXdhaXQgdGhpcy5lbnN1cmVJbml0aWFsaXplZCgpO1xuICAgIHJldHVybiB0aGlzLmVsZW1lbnRDUlVESGFuZGxlciEucmVsb2FkRWxlbWVudHModHlwZSk7XG4gIH1cblxuICAvLyBFbGVtZW50LXNwZWNpZmljIG1ldGhvZHNcbiAgYXN5bmMgcmVuZGVyVGVtcGxhdGUobmFtZTogc3RyaW5nLCB2YXJpYWJsZXM6IFJlY29yZDxzdHJpbmcsIGFueT4pIHtcbiAgICBhd2FpdCB0aGlzLmVuc3VyZUluaXRpYWxpemVkKCk7XG4gICAgcmV0dXJuIHRoaXMuZWxlbWVudENSVURIYW5kbGVyIS5yZW5kZXJUZW1wbGF0ZShuYW1lLCB2YXJpYWJsZXMpO1xuICB9XG5cbiAgYXN5bmMgZXhlY3V0ZUFnZW50KG5hbWU6IHN0cmluZywgcGFyYW1ldGVyczogUmVjb3JkPHN0cmluZywgYW55Pikge1xuICAgIGF3YWl0IHRoaXMuZW5zdXJlSW5pdGlhbGl6ZWQoKTtcbiAgICByZXR1cm4gdGhpcy5lbGVtZW50Q1JVREhhbmRsZXIhLmV4ZWN1dGVBZ2VudChuYW1lLCBwYXJhbWV0ZXJzKTtcbiAgfVxuICBcbiAgLyoqXG4gICAqIENyZWF0ZSBhIG5ldyBlbGVtZW50IGluIHRoZSBwb3J0Zm9saW8uXG4gICAqIEBwYXJhbSBhcmdzLmVsZW1lbnRzIC0gRm9yIGVuc2VtYmxlczogYXJyYXkgb2YgZWxlbWVudCByZWZlcmVuY2VzIChJc3N1ZSAjMjc4KVxuICAgKi9cbiAgYXN5bmMgY3JlYXRlRWxlbWVudChhcmdzOiB7bmFtZTogc3RyaW5nOyB0eXBlOiBzdHJpbmc7IGRlc2NyaXB0aW9uOiBzdHJpbmc7IGNvbnRlbnQ/OiBzdHJpbmc7IGluc3RydWN0aW9ucz86IHN0cmluZzsgbWV0YWRhdGE/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjsgZWxlbWVudHM/OiBFbnNlbWJsZUVsZW1lbnRbXX0pIHtcbiAgICBhd2FpdCB0aGlzLmVuc3VyZUluaXRpYWxpemVkKCk7XG4gICAgLy8gRklYOiBJc3N1ZSAjMjAgLSBSZW1vdmUgcGVyc29uYSBzcGVjaWFsIGNhc2UsIHJvdXRlIGFsbCBlbGVtZW50IGNyZWF0aW9uIHRocm91Z2ggRWxlbWVudENSVURIYW5kbGVyXG4gICAgLy8gVGhpcyBlbnN1cmVzIGNvbnNpc3RlbnQgZHVwbGljYXRlIGNoZWNraW5nIGFuZCBlcnJvciBoYW5kbGluZyBmb3IgYWxsIGVsZW1lbnQgdHlwZXNcbiAgICAvLyBGSVg6IElzc3VlICMyNzggLSBTdXBwb3J0IGVsZW1lbnRzIHBhcmFtZXRlciBmb3IgZW5zZW1ibGVzXG4gICAgY29uc3Qgbm9ybWFsaXplZFR5cGUgPSB0aGlzLmVsZW1lbnRDUlVESGFuZGxlciEubm9ybWFsaXplRWxlbWVudFR5cGUoYXJncy50eXBlKTtcbiAgICByZXR1cm4gdGhpcy5lbGVtZW50Q1JVREhhbmRsZXIhLmNyZWF0ZUVsZW1lbnQoey4uLmFyZ3MsIHR5cGU6IG5vcm1hbGl6ZWRUeXBlfSk7XG4gIH1cblxuICBhc3luYyBlZGl0RWxlbWVudChhcmdzOiB7bmFtZTogc3RyaW5nOyB0eXBlOiBzdHJpbmc7IGlucHV0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPn0pIHtcbiAgICBhd2FpdCB0aGlzLmVuc3VyZUluaXRpYWxpemVkKCk7XG4gICAgLy8gRklYOiBJc3N1ZSAjMjc2IC0gUm91dGUgYWxsIGVsZW1lbnQgdHlwZXMgdGhyb3VnaCBlbGVtZW50Q1JVREhhbmRsZXIgZm9yIGNvbnNpc3RlbnQgZXJyb3IgaGFuZGxpbmdcbiAgICAvLyBQZXJzb25hSGFuZGxlci5lZGl0UGVyc29uYSBpcyBkZXByZWNhdGVkOyBlbGVtZW50Q1JVREhhbmRsZXIgaGFuZGxlcyBwZXJzb25hcyB2aWEgUGVyc29uYUFjdGl2YXRpb25TdHJhdGVneVxuICAgIGNvbnN0IG5vcm1hbGl6ZWRUeXBlID0gdGhpcy5lbGVtZW50Q1JVREhhbmRsZXIhLm5vcm1hbGl6ZUVsZW1lbnRUeXBlKGFyZ3MudHlwZSk7XG4gICAgcmV0dXJuIHRoaXMuZWxlbWVudENSVURIYW5kbGVyIS5lZGl0RWxlbWVudCh7Li4uYXJncywgdHlwZTogbm9ybWFsaXplZFR5cGV9KTtcbiAgfVxuXG4gIGFzeW5jIHZhbGlkYXRlRWxlbWVudChhcmdzOiB7bmFtZTogc3RyaW5nOyB0eXBlOiBzdHJpbmc7IHN0cmljdD86IGJvb2xlYW59KSB7XG4gICAgYXdhaXQgdGhpcy5lbnN1cmVJbml0aWFsaXplZCgpO1xuICAgIC8vIEZJWDogSXNzdWUgIzI3NiAtIFJvdXRlIGFsbCBlbGVtZW50IHR5cGVzIHRocm91Z2ggZWxlbWVudENSVURIYW5kbGVyIGZvciBjb25zaXN0ZW50IGVycm9yIGhhbmRsaW5nXG4gICAgLy8gUGVyc29uYUhhbmRsZXIudmFsaWRhdGVQZXJzb25hIGlzIGRlcHJlY2F0ZWQ7IGVsZW1lbnRDUlVESGFuZGxlciBoYW5kbGVzIHBlcnNvbmFzXG4gICAgY29uc3Qgbm9ybWFsaXplZFR5cGUgPSB0aGlzLmVsZW1lbnRDUlVESGFuZGxlciEubm9ybWFsaXplRWxlbWVudFR5cGUoYXJncy50eXBlKTtcbiAgICByZXR1cm4gdGhpcy5lbGVtZW50Q1JVREhhbmRsZXIhLnZhbGlkYXRlRWxlbWVudCh7Li4uYXJncywgdHlwZTogbm9ybWFsaXplZFR5cGV9KTtcbiAgfVxuXG4gIGFzeW5jIGRlbGV0ZUVsZW1lbnQoYXJnczoge25hbWU6IHN0cmluZzsgdHlwZTogc3RyaW5nOyBkZWxldGVEYXRhPzogYm9vbGVhbn0pIHtcbiAgICBhd2FpdCB0aGlzLmVuc3VyZUluaXRpYWxpemVkKCk7XG4gICAgLy8gRklYOiBJc3N1ZSAjMjc2IC0gUm91dGUgYWxsIGVsZW1lbnQgdHlwZXMgdGhyb3VnaCBlbGVtZW50Q1JVREhhbmRsZXIgZm9yIGNvbnNpc3RlbnQgZXJyb3IgaGFuZGxpbmdcbiAgICAvLyBQZXJzb25hSGFuZGxlci5kZWxldGVQZXJzb25hIGlzIGRlcHJlY2F0ZWQ7IGVsZW1lbnRDUlVESGFuZGxlciBoYW5kbGVzIHBlcnNvbmFzIHZpYSBkZWRpY2F0ZWQgZGVsZXRlIHBhdGhcbiAgICBjb25zdCBub3JtYWxpemVkVHlwZSA9IHRoaXMuZWxlbWVudENSVURIYW5kbGVyIS5ub3JtYWxpemVFbGVtZW50VHlwZShhcmdzLnR5cGUpO1xuICAgIHJldHVybiB0aGlzLmVsZW1lbnRDUlVESGFuZGxlciEuZGVsZXRlRWxlbWVudCh7Li4uYXJncywgdHlwZTogbm9ybWFsaXplZFR5cGV9KTtcbiAgfVxuXG4gIGFzeW5jIGJyb3dzZUNvbGxlY3Rpb24oc2VjdGlvbj86IHN0cmluZywgdHlwZT86IHN0cmluZykge1xuICAgIGF3YWl0IHRoaXMuZW5zdXJlSW5pdGlhbGl6ZWQoKTtcbiAgICByZXR1cm4gdGhpcy5jb2xsZWN0aW9uSGFuZGxlciEuYnJvd3NlQ29sbGVjdGlvbihzZWN0aW9uLCB0eXBlKTtcbiAgfVxuXG4gIGFzeW5jIHNlYXJjaENvbGxlY3Rpb24ocXVlcnk6IHN0cmluZykge1xuICAgIGF3YWl0IHRoaXMuZW5zdXJlSW5pdGlhbGl6ZWQoKTtcbiAgICByZXR1cm4gdGhpcy5jb2xsZWN0aW9uSGFuZGxlciEuc2VhcmNoQ29sbGVjdGlvbihxdWVyeSk7XG4gIH1cblxuICBhc3luYyBzZWFyY2hDb2xsZWN0aW9uRW5oYW5jZWQocXVlcnk6IHN0cmluZywgb3B0aW9uczogYW55ID0ge30pIHtcbiAgICBhd2FpdCB0aGlzLmVuc3VyZUluaXRpYWxpemVkKCk7XG4gICAgcmV0dXJuIHRoaXMuY29sbGVjdGlvbkhhbmRsZXIhLnNlYXJjaENvbGxlY3Rpb25FbmhhbmNlZChxdWVyeSwgb3B0aW9ucyk7XG4gIH1cblxuICBhc3luYyBnZXRDb2xsZWN0aW9uQ29udGVudChwYXRoOiBzdHJpbmcpIHtcbiAgICBhd2FpdCB0aGlzLmVuc3VyZUluaXRpYWxpemVkKCk7XG4gICAgcmV0dXJuIHRoaXMuY29sbGVjdGlvbkhhbmRsZXIhLmdldENvbGxlY3Rpb25Db250ZW50KHBhdGgpO1xuICB9XG5cbiAgYXN5bmMgaW5zdGFsbENvbnRlbnQoaW5wdXRQYXRoOiBzdHJpbmcpIHtcbiAgICBhd2FpdCB0aGlzLmVuc3VyZUluaXRpYWxpemVkKCk7XG4gICAgcmV0dXJuIHRoaXMuY29sbGVjdGlvbkhhbmRsZXIhLmluc3RhbGxDb250ZW50KGlucHV0UGF0aCk7XG4gIH1cblxuICBhc3luYyBzdWJtaXRDb250ZW50KGNvbnRlbnRJZGVudGlmaWVyOiBzdHJpbmcpIHtcbiAgICBhd2FpdCB0aGlzLmVuc3VyZUluaXRpYWxpemVkKCk7XG4gICAgcmV0dXJuIHRoaXMuY29sbGVjdGlvbkhhbmRsZXIhLnN1Ym1pdENvbnRlbnQoY29udGVudElkZW50aWZpZXIpO1xuICB9XG5cbiAgYXN5bmMgZ2V0Q29sbGVjdGlvbkNhY2hlSGVhbHRoKCkge1xuICAgIGF3YWl0IHRoaXMuZW5zdXJlSW5pdGlhbGl6ZWQoKTtcbiAgICByZXR1cm4gdGhpcy5jb2xsZWN0aW9uSGFuZGxlciEuZ2V0Q29sbGVjdGlvbkNhY2hlSGVhbHRoKCk7XG4gIH1cblxuICAvLyBVc2VyIGlkZW50aXR5IG1hbmFnZW1lbnQgLSBkZWxlZ2F0ZWQgdG8gSWRlbnRpdHlIYW5kbGVyXG4gIGFzeW5jIHNldFVzZXJJZGVudGl0eSh1c2VybmFtZTogc3RyaW5nLCBlbWFpbD86IHN0cmluZykge1xuICAgIGF3YWl0IHRoaXMuZW5zdXJlSW5pdGlhbGl6ZWQoKTtcbiAgICByZXR1cm4gdGhpcy5pZGVudGl0eUhhbmRsZXIhLnNldFVzZXJJZGVudGl0eSh1c2VybmFtZSwgZW1haWwpO1xuICB9XG5cbiAgYXN5bmMgZ2V0VXNlcklkZW50aXR5KCkge1xuICAgIGF3YWl0IHRoaXMuZW5zdXJlSW5pdGlhbGl6ZWQoKTtcbiAgICByZXR1cm4gdGhpcy5pZGVudGl0eUhhbmRsZXIhLmdldFVzZXJJZGVudGl0eSgpO1xuICB9XG5cbiAgYXN5bmMgY2xlYXJVc2VySWRlbnRpdHkoKSB7XG4gICAgYXdhaXQgdGhpcy5lbnN1cmVJbml0aWFsaXplZCgpO1xuICAgIHJldHVybiB0aGlzLmlkZW50aXR5SGFuZGxlciEuY2xlYXJVc2VySWRlbnRpdHkoKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0Q3VycmVudFVzZXJGb3JBdHRyaWJ1dGlvbigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmlkZW50aXR5SGFuZGxlciEuZ2V0Q3VycmVudFVzZXJGb3JBdHRyaWJ1dGlvbigpO1xuICB9XG5cbiAgLy8gR2l0SHViIGF1dGhlbnRpY2F0aW9uIG1hbmFnZW1lbnRcbiAgYXN5bmMgc2V0dXBHaXRIdWJBdXRoKCkge1xuICAgIGF3YWl0IHRoaXMuZW5zdXJlSW5pdGlhbGl6ZWQoKTtcbiAgICByZXR1cm4gdGhpcy5naXRodWJBdXRoSGFuZGxlciEuc2V0dXBHaXRIdWJBdXRoKCk7XG4gIH1cbiAgXG4gIGFzeW5jIGNoZWNrR2l0SHViQXV0aCgpIHtcbiAgICBhd2FpdCB0aGlzLmVuc3VyZUluaXRpYWxpemVkKCk7XG4gICAgcmV0dXJuIHRoaXMuZ2l0aHViQXV0aEhhbmRsZXIhLmNoZWNrR2l0SHViQXV0aCgpO1xuICB9XG4gIFxuICBhc3luYyBnZXRPQXV0aEhlbHBlclN0YXR1cyh2ZXJib3NlOiBib29sZWFuID0gZmFsc2UpIHtcbiAgICBhd2FpdCB0aGlzLmVuc3VyZUluaXRpYWxpemVkKCk7XG4gICAgcmV0dXJuIHRoaXMuZ2l0aHViQXV0aEhhbmRsZXIhLmdldE9BdXRoSGVscGVyU3RhdHVzKHZlcmJvc2UpO1xuICB9XG4gIFxuXG4gIFxuICBhc3luYyBjbGVhckdpdEh1YkF1dGgoKSB7XG4gICAgYXdhaXQgdGhpcy5lbnN1cmVJbml0aWFsaXplZCgpO1xuICAgIHJldHVybiB0aGlzLmdpdGh1YkF1dGhIYW5kbGVyIS5jbGVhckdpdEh1YkF1dGgoKTtcbiAgfVxuXG4gIC8vIE9BdXRoIGNvbmZpZ3VyYXRpb24gbWFuYWdlbWVudFxuICBhc3luYyBjb25maWd1cmVPQXV0aChjbGllbnRfaWQ/OiBzdHJpbmcpIHtcbiAgICBhd2FpdCB0aGlzLmVuc3VyZUluaXRpYWxpemVkKCk7XG4gICAgcmV0dXJuIHRoaXMuZ2l0aHViQXV0aEhhbmRsZXIhLmNvbmZpZ3VyZU9BdXRoKGNsaWVudF9pZCk7XG4gIH1cblxuXG5cblxuXG5cblxuXG5cblxuICAvKipcbiAgICogQ29uZmlndXJlIGluZGljYXRvciBzZXR0aW5ncyAoZGVsZWdhdGVkIHRvIERpc3BsYXlDb25maWdIYW5kbGVyKVxuICAgKi9cbiAgYXN5bmMgY29uZmlndXJlSW5kaWNhdG9yKGNvbmZpZzogUGFydGlhbDxJbmRpY2F0b3JDb25maWc+KSB7XG4gICAgYXdhaXQgdGhpcy5lbnN1cmVJbml0aWFsaXplZCgpO1xuICAgIHJldHVybiB0aGlzLmRpc3BsYXlDb25maWdIYW5kbGVyIS5jb25maWd1cmVJbmRpY2F0b3IoY29uZmlnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgY3VycmVudCBpbmRpY2F0b3IgY29uZmlndXJhdGlvbiAoZGVsZWdhdGVkIHRvIERpc3BsYXlDb25maWdIYW5kbGVyKVxuICAgKi9cbiAgYXN5bmMgZ2V0SW5kaWNhdG9yQ29uZmlnKCkge1xuICAgIGF3YWl0IHRoaXMuZW5zdXJlSW5pdGlhbGl6ZWQoKTtcbiAgICByZXR1cm4gdGhpcy5kaXNwbGF5Q29uZmlnSGFuZGxlciEuZ2V0SW5kaWNhdG9yQ29uZmlnKCk7XG4gIH1cblxuICAvKipcbiAgICogQ29uZmlndXJlIGNvbGxlY3Rpb24gc3VibWlzc2lvbiBzZXR0aW5ncyAoZGVsZWdhdGVkIHRvIENvbGxlY3Rpb25IYW5kbGVyKVxuICAgKi9cbiAgYXN5bmMgY29uZmlndXJlQ29sbGVjdGlvblN1Ym1pc3Npb24oYXV0b1N1Ym1pdDogYm9vbGVhbikge1xuICAgIGF3YWl0IHRoaXMuZW5zdXJlSW5pdGlhbGl6ZWQoKTtcbiAgICByZXR1cm4gdGhpcy5jb2xsZWN0aW9uSGFuZGxlciEuY29uZmlndXJlQ29sbGVjdGlvblN1Ym1pc3Npb24oYXV0b1N1Ym1pdCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGNvbGxlY3Rpb24gc3VibWlzc2lvbiBjb25maWd1cmF0aW9uIChkZWxlZ2F0ZWQgdG8gQ29sbGVjdGlvbkhhbmRsZXIpXG4gICAqL1xuICBhc3luYyBnZXRDb2xsZWN0aW9uU3VibWlzc2lvbkNvbmZpZygpIHtcbiAgICBhd2FpdCB0aGlzLmVuc3VyZUluaXRpYWxpemVkKCk7XG4gICAgcmV0dXJuIHRoaXMuY29sbGVjdGlvbkhhbmRsZXIhLmdldENvbGxlY3Rpb25TdWJtaXNzaW9uQ29uZmlnKCk7XG4gIH1cblxuXG4gIC8qKlxuICAgKiBFeHBvcnQgYSBzaW5nbGUgcGVyc29uYVxuICAgKi9cbiAgYXN5bmMgZXhwb3J0UGVyc29uYShwZXJzb25hTmFtZTogc3RyaW5nKSB7XG4gICAgYXdhaXQgdGhpcy5lbnN1cmVJbml0aWFsaXplZCgpO1xuICAgIHJldHVybiB0aGlzLnBlcnNvbmFIYW5kbGVyIS5leHBvcnRQZXJzb25hKHBlcnNvbmFOYW1lKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeHBvcnQgYWxsIHBlcnNvbmFzXG4gICAqL1xuICBhc3luYyBleHBvcnRBbGxQZXJzb25hcyhpbmNsdWRlRGVmYXVsdHMgPSB0cnVlKSB7XG4gICAgYXdhaXQgdGhpcy5lbnN1cmVJbml0aWFsaXplZCgpO1xuICAgIHJldHVybiB0aGlzLnBlcnNvbmFIYW5kbGVyIS5leHBvcnRBbGxQZXJzb25hcyhpbmNsdWRlRGVmYXVsdHMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEltcG9ydCBhIHBlcnNvbmFcbiAgICovXG4gIGFzeW5jIGltcG9ydFBlcnNvbmEoc291cmNlOiBzdHJpbmcsIG92ZXJ3cml0ZSA9IGZhbHNlKSB7XG4gICAgYXdhaXQgdGhpcy5lbnN1cmVJbml0aWFsaXplZCgpO1xuICAgIHJldHVybiB0aGlzLnBlcnNvbmFIYW5kbGVyIS5pbXBvcnRQZXJzb25hKHNvdXJjZSwgb3ZlcndyaXRlKTtcbiAgfVxuXG5cbiAgLyoqXG4gICAqIFBvcnRmb2xpbyBtYW5hZ2VtZW50IG1ldGhvZHNcbiAgICovXG5cbiAgLyoqXG4gICAqIENoZWNrIHBvcnRmb2xpbyBzdGF0dXMgaW5jbHVkaW5nIHJlcG9zaXRvcnkgZXhpc3RlbmNlIGFuZCBzeW5jIGluZm9ybWF0aW9uXG4gICAqL1xuICBhc3luYyBwb3J0Zm9saW9TdGF0dXModXNlcm5hbWU/OiBzdHJpbmcpIHtcbiAgICBhd2FpdCB0aGlzLmVuc3VyZUluaXRpYWxpemVkKCk7XG4gICAgcmV0dXJuIHRoaXMucG9ydGZvbGlvSGFuZGxlciEucG9ydGZvbGlvU3RhdHVzKHVzZXJuYW1lKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplIGEgbmV3IEdpdEh1YiBwb3J0Zm9saW8gcmVwb3NpdG9yeVxuICAgKi9cbiAgYXN5bmMgaW5pdFBvcnRmb2xpbyhvcHRpb25zOiB7cmVwb3NpdG9yeU5hbWU/OiBzdHJpbmc7IHByaXZhdGU/OiBib29sZWFuOyBkZXNjcmlwdGlvbj86IHN0cmluZ30pIHtcbiAgICBhd2FpdCB0aGlzLmVuc3VyZUluaXRpYWxpemVkKCk7XG4gICAgcmV0dXJuIHRoaXMucG9ydGZvbGlvSGFuZGxlciEuaW5pdFBvcnRmb2xpbyhvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb25maWd1cmUgcG9ydGZvbGlvIHNldHRpbmdzXG4gICAqL1xuICBhc3luYyBwb3J0Zm9saW9Db25maWcob3B0aW9uczoge2F1dG9TeW5jPzogYm9vbGVhbjsgZGVmYXVsdFZpc2liaWxpdHk/OiBzdHJpbmc7IGF1dG9TdWJtaXQ/OiBib29sZWFuOyByZXBvc2l0b3J5TmFtZT86IHN0cmluZ30pIHtcbiAgICBhd2FpdCB0aGlzLmVuc3VyZUluaXRpYWxpemVkKCk7XG4gICAgcmV0dXJuIHRoaXMucG9ydGZvbGlvSGFuZGxlciEucG9ydGZvbGlvQ29uZmlnKG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFN5bmMgcG9ydGZvbGlvIHdpdGggR2l0SHViXG4gICAqL1xuICBhc3luYyBzeW5jUG9ydGZvbGlvKG9wdGlvbnM6IHtcbiAgICBkaXJlY3Rpb246IHN0cmluZztcbiAgICBtb2RlPzogc3RyaW5nO1xuICAgIGZvcmNlOiBib29sZWFuO1xuICAgIGRyeVJ1bjogYm9vbGVhbjtcbiAgICBjb25maXJtRGVsZXRpb25zPzogYm9vbGVhbjtcbiAgfSkge1xuICAgIGF3YWl0IHRoaXMuZW5zdXJlSW5pdGlhbGl6ZWQoKTtcbiAgICByZXR1cm4gdGhpcy5wb3J0Zm9saW9IYW5kbGVyIS5zeW5jUG9ydGZvbGlvKG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZSBjb25maWd1cmF0aW9uIG9wZXJhdGlvbnMgLSBkZWxlZ2F0ZXMgdG8gQ29uZmlnSGFuZGxlclxuICAqL1xuICBhc3luYyBoYW5kbGVDb25maWdPcGVyYXRpb24ob3B0aW9uczogYW55KSB7XG4gICAgYXdhaXQgdGhpcy5lbnN1cmVJbml0aWFsaXplZCgpO1xuICAgIHJldHVybiB0aGlzLmNvbmZpZ0hhbmRsZXIhLmhhbmRsZUNvbmZpZ09wZXJhdGlvbihvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGUgc3luYyBvcGVyYXRpb25zIC0gZGVsZWdhdGVzIHRvIFN5bmNIYW5kbGVyXG4gICAqL1xuICBhc3luYyBoYW5kbGVTeW5jT3BlcmF0aW9uKG9wdGlvbnM6IGFueSkge1xuICAgIGF3YWl0IHRoaXMuZW5zdXJlSW5pdGlhbGl6ZWQoKTtcbiAgICByZXR1cm4gdGhpcy5zeW5jSGFuZGxlciEuaGFuZGxlU3luY09wZXJhdGlvbihvcHRpb25zKTtcbiAgfVxuXG4gIGFzeW5jIGRpc3Bvc2UoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5jb250YWluZXIuZGlzcG9zZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlYXJjaCBsb2NhbCBwb3J0Zm9saW8gdXNpbmcgdGhlIG1ldGFkYXRhIGluZGV4IHN5c3RlbVxuICAgKiBUaGlzIHByb3ZpZGVzIGZhc3QsIGNvbXByZWhlbnNpdmUgc2VhcmNoIGFjcm9zcyBhbGwgZWxlbWVudCB0eXBlc1xuICAgKi9cbiAgYXN5bmMgc2VhcmNoUG9ydGZvbGlvKG9wdGlvbnM6IHtcbiAgICBxdWVyeTogc3RyaW5nOyBcbiAgICBlbGVtZW50VHlwZT86IHN0cmluZzsgXG4gICAgZnV6enlNYXRjaD86IGJvb2xlYW47IFxuICAgIG1heFJlc3VsdHM/OiBudW1iZXI7IFxuICAgIGluY2x1ZGVLZXl3b3Jkcz86IGJvb2xlYW47IFxuICAgIGluY2x1ZGVUYWdzPzogYm9vbGVhbjsgXG4gICAgaW5jbHVkZVRyaWdnZXJzPzogYm9vbGVhbjsgXG4gICAgaW5jbHVkZURlc2NyaXB0aW9ucz86IGJvb2xlYW47XG4gIH0pIHtcbiAgICBhd2FpdCB0aGlzLmVuc3VyZUluaXRpYWxpemVkKCk7XG4gICAgcmV0dXJuIHRoaXMucG9ydGZvbGlvSGFuZGxlciEuc2VhcmNoUG9ydGZvbGlvKG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlYXJjaCBhY3Jvc3MgYWxsIHNvdXJjZXMgKGxvY2FsLCBHaXRIdWIsIGNvbGxlY3Rpb24pIHVzaW5nIFVuaWZpZWRJbmRleE1hbmFnZXJcbiAgICogVGhpcyBwcm92aWRlcyBjb21wcmVoZW5zaXZlIHNlYXJjaCB3aXRoIGR1cGxpY2F0ZSBkZXRlY3Rpb24gYW5kIHZlcnNpb24gY29tcGFyaXNvblxuICAgKi9cbiAgYXN5bmMgc2VhcmNoQWxsKG9wdGlvbnM6IHtcbiAgICBxdWVyeTogc3RyaW5nO1xuICAgIHNvdXJjZXM/OiBzdHJpbmdbXTtcbiAgICBlbGVtZW50VHlwZT86IHN0cmluZztcbiAgICBwYWdlPzogbnVtYmVyO1xuICAgIHBhZ2VTaXplPzogbnVtYmVyO1xuICAgIHNvcnRCeT86IHN0cmluZztcbiAgfSkge1xuICAgIGF3YWl0IHRoaXMuZW5zdXJlSW5pdGlhbGl6ZWQoKTtcbiAgICByZXR1cm4gdGhpcy5wb3J0Zm9saW9IYW5kbGVyIS5zZWFyY2hBbGwob3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogRmluZCBzZW1hbnRpY2FsbHkgc2ltaWxhciBlbGVtZW50cyB1c2luZyBFbmhhbmNlZCBJbmRleFxuICAgKi9cbiAgYXN5bmMgZmluZFNpbWlsYXJFbGVtZW50cyhvcHRpb25zOiB7XG4gICAgZWxlbWVudE5hbWU6IHN0cmluZztcbiAgICBlbGVtZW50VHlwZT86IHN0cmluZztcbiAgICBsaW1pdDogbnVtYmVyO1xuICAgIHRocmVzaG9sZDogbnVtYmVyO1xuICB9KSB7XG4gICAgcmV0dXJuIHRoaXMuZW5oYW5jZWRJbmRleEhhbmRsZXIhLmZpbmRTaW1pbGFyRWxlbWVudHMob3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGFsbCByZWxhdGlvbnNoaXBzIGZvciBhIHNwZWNpZmljIGVsZW1lbnRcbiAgICovXG4gIGFzeW5jIGdldEVsZW1lbnRSZWxhdGlvbnNoaXBzKG9wdGlvbnM6IHtcbiAgICBlbGVtZW50TmFtZTogc3RyaW5nO1xuICAgIGVsZW1lbnRUeXBlPzogc3RyaW5nO1xuICAgIHJlbGF0aW9uc2hpcFR5cGVzPzogc3RyaW5nW107XG4gIH0pIHtcbiAgICByZXR1cm4gdGhpcy5lbmhhbmNlZEluZGV4SGFuZGxlciEuZ2V0RWxlbWVudFJlbGF0aW9uc2hpcHMob3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogU2VhcmNoIGZvciBlbGVtZW50cyBieSBhY3Rpb24gdmVyYlxuICAgKi9cbiAgYXN5bmMgc2VhcmNoQnlWZXJiKG9wdGlvbnM6IHtcbiAgICB2ZXJiOiBzdHJpbmc7XG4gICAgbGltaXQ6IG51bWJlcjtcbiAgfSkge1xuICAgIHJldHVybiB0aGlzLmVuaGFuY2VkSW5kZXhIYW5kbGVyIS5zZWFyY2hCeVZlcmIob3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHN0YXRpc3RpY3MgYWJvdXQgRW5oYW5jZWQgSW5kZXggcmVsYXRpb25zaGlwc1xuICAgKi9cbiAgYXN5bmMgZ2V0UmVsYXRpb25zaGlwU3RhdHMoKSB7XG4gICAgcmV0dXJuIHRoaXMuZW5oYW5jZWRJbmRleEhhbmRsZXIhLmdldFJlbGF0aW9uc2hpcFN0YXRzKCk7XG4gIH1cblxuICBhc3luYyBydW4oKSB7XG4gICAgbG9nZ2VyLmRlYnVnKFwiRG9sbGhvdXNlTUNQU2VydmVyLnJ1bigpIHN0YXJ0ZWRcIik7XG4gICAgbG9nZ2VyLmluZm8oXCJTdGFydGluZyBEb2xsaG91c2VNQ1Agc2VydmVyLi4uXCIpO1xuXG4gICAgY29uc3QgdGltZXIgPSB0aGlzLmNvbnRhaW5lci5yZXNvbHZlPFN0YXJ0dXBUaW1lcj4oJ1N0YXJ0dXBUaW1lcicpO1xuXG4gICAgLy8gSXNzdWUgIzcwNjogQ3JpdGljYWwgcGF0aCBvbmx5IOKAlCBnZXQgdG8gY29ubmVjdCgpIGFzIGZhc3QgYXMgcG9zc2libGVcbiAgICAvLyBOb24tY3JpdGljYWwgd29yayAobWVtb3J5IGF1dG8tbG9hZCwgYWN0aXZhdGlvbiByZXN0b3JlLCBldGMuKSBpc1xuICAgIC8vIGRlZmVycmVkIHRvIGNvbXBsZXRlRGVmZXJyZWRTZXR1cCgpIHdoaWNoIHJ1bnMgcG9zdC1jb25uZWN0LlxuICAgIHRyeSB7XG4gICAgICB0aW1lci5zdGFydFBoYXNlKCdwb3J0Zm9saW9fcHJlcGFyZScsIHRydWUpO1xuICAgICAgYXdhaXQgdGhpcy5pbml0aWFsaXplUG9ydGZvbGlvKCk7XG4gICAgICB0aW1lci5lbmRQaGFzZSgncG9ydGZvbGlvX3ByZXBhcmUnKTtcblxuICAgICAgdGltZXIuc3RhcnRQaGFzZSgnaGFuZGxlcl9jcmVhdGlvbicsIHRydWUpO1xuICAgICAgYXdhaXQgdGhpcy5jb21wbGV0ZUluaXRpYWxpemF0aW9uKCk7XG4gICAgICB0aW1lci5lbmRQaGFzZSgnaGFuZGxlcl9jcmVhdGlvbicpO1xuXG4gICAgICAvLyBJbml0aWFsaXplIG9wZXJhdGlvbmFsIHRlbGVtZXRyeSAoYXN5bmMsIG5vbi1ibG9ja2luZywgbmV2ZXIgdGhyb3dzKVxuICAgICAgY29uc3Qgb3BlcmF0aW9uYWxUZWxlbWV0cnkgPSB0aGlzLmNvbnRhaW5lci5yZXNvbHZlPE9wZXJhdGlvbmFsVGVsZW1ldHJ5PignT3BlcmF0aW9uYWxUZWxlbWV0cnknKTtcbiAgICAgIG9wZXJhdGlvbmFsVGVsZW1ldHJ5LmluaXRpYWxpemUoKS5jYXRjaCgoKSA9PiB7XG4gICAgICAgIC8vIFRlbGVtZXRyeSBlcnJvcnMgYXJlIGxvZ2dlZCBpbnRlcm5hbGx5LCBzYWZlIHRvIGlnbm9yZSBoZXJlXG4gICAgICB9KTtcblxuICAgICAgbG9nZ2VyLmluZm8oXCJQb3J0Zm9saW8gYW5kIHBlcnNvbmFzIGluaXRpYWxpemVkIHN1Y2Nlc3NmdWxseVwiKTtcblxuICAgICAgaWYgKCFlbnYuRE9MTEhPVVNFX0dBVEVLRUVQRVJfRU5BQkxFRCkge1xuICAgICAgICBsb2dnZXIud2FybihcIuKaoO+4jyAgR2F0ZWtlZXBlciBpcyBESVNBQkxFRCAoRE9MTEhPVVNFX0dBVEVLRUVQRVJfRU5BQkxFRD1mYWxzZSkuIEFsbCBwZXJtaXNzaW9uIGNoZWNrcyBhcmUgYnlwYXNzZWQuXCIpO1xuICAgICAgfVxuXG4gICAgICBsb2dnZXIuaW5mbyhcIkRvbGxob3VzZU1DUCBzZXJ2ZXIgcmVhZHkgLSB3YWl0aW5nIGZvciBNQ1AgY29ubmVjdGlvbiBvbiBzdGRpb1wiKTtcbiAgICAgIGxvZ2dlci5kZWJ1ZyhcIkRvbGxob3VzZU1DUFNlcnZlci5ydW4oKSBjb21wbGV0ZWQgaW5pdGlhbGl6YXRpb25cIik7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIEVycm9ySGFuZGxlci5sb2dFcnJvcignRG9sbGhvdXNlTUNQU2VydmVyLnJ1bi5pbml0aWFsaXphdGlvbicsIGVycm9yKTtcbiAgICAgIHRocm93IGVycm9yOyAvLyBSZS10aHJvdyB0byBwcmV2ZW50IHNlcnZlciBmcm9tIHN0YXJ0aW5nIHdpdGggaW5jb21wbGV0ZSBpbml0aWFsaXphdGlvblxuICAgIH1cblxuICAgIGNvbnN0IHRyYW5zcG9ydCA9IG5ldyBTdGRpb1NlcnZlclRyYW5zcG9ydCgpO1xuXG4gICAgLy8gU2V0IHVwIGdyYWNlZnVsIHNodXRkb3duIGhhbmRsZXJzXG4gICAgY29uc3QgY2xlYW51cCA9IGFzeW5jICgpID0+IHtcbiAgICAgIGxvZ2dlci5pbmZvKFwiU2h1dHRpbmcgZG93biBEb2xsaG91c2VNQ1Agc2VydmVyLi4uXCIpO1xuXG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCB0aGlzLmNvbnRhaW5lci5kaXNwb3NlKCk7XG4gICAgICAgIGxvZ2dlci5pbmZvKFwiQ2xlYW51cCBjb21wbGV0ZWRcIik7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBsb2dnZXIuZXJyb3IoXCJFcnJvciBkdXJpbmcgY2xlYW51cFwiLCB7IGVycm9yIH0pO1xuICAgICAgfVxuXG4gICAgICBwcm9jZXNzLmV4aXQoMCk7XG4gICAgfTtcblxuICAgIC8vIFJlZ2lzdGVyIHNodXRkb3duIGhhbmRsZXJzXG4gICAgcHJvY2Vzcy5vbignU0lHSU5UJywgY2xlYW51cCk7XG4gICAgcHJvY2Vzcy5vbignU0lHVEVSTScsIGNsZWFudXApO1xuICAgIHByb2Nlc3Mub24oJ1NJR0hVUCcsIGNsZWFudXApO1xuXG4gICAgLy8gQ29ubmVjdCBBU0FQIOKAlCB0b29scyBhcmUgcmVnaXN0ZXJlZCwgc2VydmVyIGNhbiBhY2NlcHQgcmVxdWVzdHNcbiAgICB0aW1lci5zdGFydFBoYXNlKCdtY3BfY29ubmVjdCcsIHRydWUpO1xuICAgIGF3YWl0IHRoaXMuc2VydmVyLmNvbm5lY3QodHJhbnNwb3J0KTtcbiAgICB0aW1lci5lbmRQaGFzZSgnbWNwX2Nvbm5lY3QnKTtcbiAgICB0aW1lci5tYXJrQ29ubmVjdCgpO1xuXG4gICAgLy8gTWFyayB0aGF0IE1DUCBpcyBub3cgY29ubmVjdGVkIC0gbm8gbW9yZSBjb25zb2xlIG91dHB1dCBhbGxvd2VkXG4gICAgbG9nZ2VyLnNldE1DUENvbm5lY3RlZCgpO1xuXG4gICAgLy8gSXNzdWUgIzcwNiBQaGFzZSAzOiBFbWl0IFJFQURZIHNlbnRpbmVsIGZvciBicmlkZ2UgY2xpZW50c1xuICAgIHByb2Nlc3Muc3RkZXJyLndyaXRlKCdET0xMSE9VU0VNQ1BfUkVBRFlcXG4nKTtcblxuICAgIGxvZ2dlci5pbmZvKFwiRG9sbGhvdXNlTUNQIHNlcnZlciBydW5uaW5nIG9uIHN0ZGlvXCIpO1xuXG4gICAgLy8gSXNzdWUgIzcwNiBQaGFzZSAyOiBEZWZlcnJlZCBzZXR1cCDigJQgcnVucyBwb3N0LWNvbm5lY3QsIG5vbi1ibG9ja2luZ1xuICAgIC8vIFBhdHRlcm4gZW5jcnlwdGlvbiwgYmFja2dyb3VuZCB2YWxpZGF0b3IsIG1lbW9yeSBhdXRvLWxvYWQsIGFjdGl2YXRpb25cbiAgICAvLyByZXN0b3JlLCBsb2cgaG9va3MsIGRhbmdlciB6b25lIGluaXQgYWxsIG1vdmUgaGVyZS5cbiAgICBjb25zdCBkZWZlcnJlZFByb21pc2UgPSB0aGlzLmNvbnRhaW5lci5jb21wbGV0ZURlZmVycmVkU2V0dXAoKTtcbiAgICBkZWZlcnJlZFByb21pc2UuY2F0Y2goZXJyID0+IGxvZ2dlci53YXJuKCdbU3RhcnR1cF0gRGVmZXJyZWQgc2V0dXAgZXJyb3I6JywgZXJyKSk7XG5cbiAgICAvLyBJc3N1ZSAjNzA2IFBoYXNlIDQ6IFdpcmUgZGVmZXJyZWQgcHJvbWlzZSBpbnRvIFNlcnZlclNldHVwIGZvciByZXF1ZXN0IGJ1ZmZlcmluZ1xuICAgIGNvbnN0IHNlcnZlclNldHVwID0gdGhpcy5jb250YWluZXIucmVzb2x2ZTxpbXBvcnQoJy4vc2VydmVyL1NlcnZlclNldHVwLmpzJykuU2VydmVyU2V0dXA+KCdTZXJ2ZXJTZXR1cCcpO1xuICAgIHNlcnZlclNldHVwLnNldERlZmVycmVkU2V0dXBQcm9taXNlKGRlZmVycmVkUHJvbWlzZSk7XG5cbiAgICAvLyBMb2cgc3RhcnR1cCB0aW1pbmcgYWZ0ZXIgZGVmZXJyZWQgc2V0dXAgY29tcGxldGVzXG4gICAgZGVmZXJyZWRQcm9taXNlLnRoZW4oYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgcmVwb3J0ID0gdGltZXIuZ2V0UmVwb3J0KCk7XG4gICAgICBsb2dnZXIuaW5mbyhgW1N0YXJ0dXBdIEZ1bGwgcmVwb3J0OiBjb25uZWN0IGF0ICR7cmVwb3J0LmNvbm5lY3RBdE1zfW1zLCBgICtcbiAgICAgICAgYGNyaXRpY2FsICR7cmVwb3J0LmNyaXRpY2FsUGF0aE1zfW1zLCBkZWZlcnJlZCAke3JlcG9ydC5kZWZlcnJlZE1zfW1zLCBgICtcbiAgICAgICAgYHRvdGFsICR7cmVwb3J0LnRvdGFsTXN9bXNgKTtcbiAgICB9KS5jYXRjaCgoKSA9PiB7IC8qIGFscmVhZHkgbG9nZ2VkICovIH0pO1xuXG4gIH1cbn1cblxuLy8gRXhwb3J0IGlzIGFscmVhZHkgYXQgY2xhc3MgZGVjbGFyYXRpb25cblxuLy8gT25seSBzdGFydCB0aGUgc2VydmVyIGlmIHRoaXMgZmlsZSBpcyBiZWluZyBydW4gZGlyZWN0bHkgKG5vdCBpbXBvcnRlZCBieSB0ZXN0cylcbi8vIEhhbmRsZSBkaWZmZXJlbnQgZXhlY3V0aW9uIG1ldGhvZHMgKGRpcmVjdCwgbnB4LCBDTEkpXG5jb25zdCBzY3JpcHRQYXRoID0gcHJvY2Vzcy5hcmd2Py5bMV0gPyBwYXRoLm5vcm1hbGl6ZShwcm9jZXNzLmFyZ3ZbMV0pIDogJyc7XG5jb25zdCBpc0RpcmVjdEV4ZWN1dGlvbiA9XG4gIHNjcmlwdFBhdGguZW5kc1dpdGgoYCR7cGF0aC5zZXB9ZGlzdCR7cGF0aC5zZXB9aW5kZXguanNgKSB8fFxuICBzY3JpcHRQYXRoLmVuZHNXaXRoKGAke3BhdGguc2VwfXNyYyR7cGF0aC5zZXB9aW5kZXgudHNgKTtcbmNvbnN0IGlzTnB4RXhlY3V0aW9uID0gcHJvY2Vzcy5lbnYubnBtX2V4ZWNwYXRoPy5pbmNsdWRlcygnbnB4Jyk7XG5jb25zdCBpc0NsaUV4ZWN1dGlvbiA9IHByb2Nlc3MuYXJndlsxXT8uZW5kc1dpdGgoJy9kb2xsaG91c2VtY3AnKSB8fCBwcm9jZXNzLmFyZ3ZbMV0/LmVuZHNXaXRoKCdcXFxcZG9sbGhvdXNlbWNwJyk7XG5jb25zdCBpc1Rlc3QgPSBwcm9jZXNzLmVudi5KRVNUX1dPUktFUl9JRDsgLy8gVGhpcyBpcyBzZXQgd2hlbiBKZXN0IHJ1bnMgdGVzdHNcbmNvbnN0IGlzVGVzdE1vZGUgPSBwcm9jZXNzLmVudi5URVNUX01PREUgPT09ICd0cnVlJzsgLy8gQ2hlY2sgZm9yIFRFU1RfTU9ERSBlbnZpcm9ubWVudCB2YXJpYWJsZVxuY29uc3QgZG9sbGhvdXNlRGVidWdGbGFnID0gcHJvY2Vzcy5lbnYuRE9MTEhPVVNFX0RFQlVHPy50b0xvd2VyQ2FzZSgpO1xuY29uc3QgaXNEZWJ1Z1N0YXJ0dXBMb2dnaW5nID0gZG9sbGhvdXNlRGVidWdGbGFnID09PSAndHJ1ZScgfHwgZG9sbGhvdXNlRGVidWdGbGFnID09PSAnMSc7XG5cbi8vIFByb2dyZXNzaXZlIHN0YXJ0dXAgd2l0aCByZXRyaWVzIGZvciBucHgvQ0xJIGV4ZWN1dGlvblxuY29uc3QgU1RBUlRVUF9ERUxBWVMgPSBbMTAsIDUwLCAxMDAsIDIwMF07IC8vIFByb2dyZXNzaXZlIGRlbGF5cyBpbiBtc1xuXG5hc3luYyBmdW5jdGlvbiBzdGFydFNlcnZlcldpdGhSZXRyeShyZXRyaWVzTGVmdCA9IFNUQVJUVVBfREVMQVlTLmxlbmd0aCk6IFByb21pc2U8dm9pZD4ge1xuICBpZiAoaXNEZWJ1Z1N0YXJ0dXBMb2dnaW5nKSB7XG4gICAgY29uc29sZS5lcnJvcihcIkRFQlVHOiBzdGFydFNlcnZlcldpdGhSZXRyeSBjYWxsZWQuXCIpO1xuICB9XG4gIHRyeSB7XG4gICAgY29uc3QgY29udGFpbmVyID0gbmV3IERvbGxob3VzZUNvbnRhaW5lcigpO1xuICAgIGNvbnN0IHNlcnZlciA9IG5ldyBEb2xsaG91c2VNQ1BTZXJ2ZXIoY29udGFpbmVyKTtcbiAgICBhd2FpdCBzZXJ2ZXIucnVuKCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKHJldHJpZXNMZWZ0ID4gMCAmJiAoaXNOcHhFeGVjdXRpb24gfHwgaXNDbGlFeGVjdXRpb24pKSB7XG4gICAgICAvLyBUcnkgYWdhaW4gd2l0aCBhIGxvbmdlciBkZWxheVxuICAgICAgY29uc3QgZGVsYXlJbmRleCA9IFNUQVJUVVBfREVMQVlTLmxlbmd0aCAtIHJldHJpZXNMZWZ0O1xuICAgICAgY29uc3QgZGVsYXkgPSBTVEFSVFVQX0RFTEFZU1tkZWxheUluZGV4XTtcbiAgICAgIGF3YWl0IG5ldyBQcm9taXNlKHJlc29sdmUgPT4gc2V0VGltZW91dChyZXNvbHZlLCBkZWxheSkpO1xuICAgICAgcmV0dXJuIHN0YXJ0U2VydmVyV2l0aFJldHJ5KHJldHJpZXNMZWZ0IC0gMSk7XG4gICAgfVxuICAgIC8vIEZpbmFsIGZhaWx1cmUgLSBtaW5pbWFsIGVycm9yIG1lc3NhZ2UgZm9yIHNlY3VyaXR5XG4gICAgLy8gTm90ZTogVXNpbmcgY29uc29sZS5lcnJvciBoZXJlIGlzIGludGVudGlvbmFsIGFzIGl0J3MgdGhlIGZpbmFsIGVycm9yIGJlZm9yZSBleGl0XG4gICAgY29uc29sZS5lcnJvcihcIltEb2xsaG91c2VNQ1BdIFNlcnZlciBzdGFydHVwIGZhaWxlZFwiLCBlcnJvcik7IC8vIEFkZGVkIGVycm9yIG9iamVjdFxuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxufVxuXG5pZiAoKGlzRGlyZWN0RXhlY3V0aW9uIHx8IGlzTnB4RXhlY3V0aW9uIHx8IGlzQ2xpRXhlY3V0aW9uKSAmJiAoIWlzVGVzdCB8fCBpc1Rlc3RNb2RlKSkge1xuICAvLyBJc3N1ZSAjNzA0OiAtLXdlYiBmbGFnIHN0YXJ0cyB0aGUgcG9ydGZvbGlvIHdlYiBVSSBpbnN0ZWFkIG9mIE1DUCBzZXJ2ZXJcbiAgY29uc3QgaXNXZWJNb2RlID0gcHJvY2Vzcy5hcmd2LmluY2x1ZGVzKCctLXdlYicpO1xuICBpZiAoaXNXZWJNb2RlKSB7XG4gICAgLy8gSXNzdWUgIzc5NjogQm9vdHN0cmFwIERJIGNvbnRhaW5lciBmb3Igd2ViLW9ubHkgbW9kZSBzbyBBUEkgcm91dGVzXG4gICAgLy8gZ28gdGhyb3VnaCBNQ1BBUUxIYW5kbGVyICh2YWxpZGF0ZWQsIGNhY2hlZCwgZ2F0ZWtlZXBlci1jaGVja2VkKVxuICAgIC8vXG4gICAgLy8gU3VwcHJlc3MgZGVidWcgb3V0cHV0IGluIC0td2ViIG1vZGUgdW5sZXNzIERPTExIT1VTRV9ERUJVRyBpcyBzZXQuXG4gICAgLy8gVGhlIHdlYiBjb25zb2xlIGNhcHR1cmVzIGFsbCBsb2dzIGluIG1lbW9yeSDigJQgbm8gbmVlZCB0byBmbG9vZCB0aGUgdGVybWluYWwuXG4gICAgaWYgKCFwcm9jZXNzLmVudi5ET0xMSE9VU0VfREVCVUcgJiYgIXByb2Nlc3MuZW52LkVOQUJMRV9ERUJVRykge1xuICAgICAgbG9nZ2VyLnNldE1pbkxldmVsKCdpbmZvJyk7XG4gICAgfVxuXG4gICAgKGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHBvcnRmb2xpb0RpciA9IHBhdGguam9pbihvcy5ob21lZGlyKCksICcuZG9sbGhvdXNlJywgJ3BvcnRmb2xpbycpO1xuICAgICAgY29uc3QgcG9ydEFyZyA9IHByb2Nlc3MuYXJndi5maW5kKGEgPT4gYS5zdGFydHNXaXRoKCctLXBvcnQ9JykpO1xuICAgICAgY29uc3QgcG9ydCA9IHBvcnRBcmcgPyBwYXJzZUludChwb3J0QXJnLnNwbGl0KCc9JylbMV0sIDEwKSA6IHVuZGVmaW5lZDtcbiAgICAgIGNvbnN0IG5vQnJvd3NlciA9IHByb2Nlc3MuYXJndi5pbmNsdWRlcygnLS1uby1vcGVuJyk7XG5cbiAgICAgIGxldCBtY3BBcWxIYW5kbGVyO1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgY29udGFpbmVyID0gbmV3IERvbGxob3VzZUNvbnRhaW5lcigpO1xuICAgICAgICBhd2FpdCBjb250YWluZXIucHJlcGFyZVBvcnRmb2xpbygpO1xuICAgICAgICBjb25zdCBidW5kbGUgPSBhd2FpdCBjb250YWluZXIuYm9vdHN0cmFwSGFuZGxlcnMoKTtcbiAgICAgICAgYXdhaXQgY29udGFpbmVyLmNvbXBsZXRlRGVmZXJyZWRTZXR1cCgpO1xuICAgICAgICBtY3BBcWxIYW5kbGVyID0gYnVuZGxlLm1jcEFxbEhhbmRsZXI7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXCJbRG9sbGhvdXNlTUNQXSBDb250YWluZXIgYm9vdHN0cmFwcGVkIOKAlCB3ZWIgcm91dGVzIHVzaW5nIE1DUC1BUUwgR2F0ZXdheVwiKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBjb25zb2xlLmVycm9yKFwiW0RvbGxob3VzZU1DUF0gQ29udGFpbmVyIGJvb3RzdHJhcCBmYWlsZWQg4oCUIHdlYiByb3V0ZXMgd2lsbCB1c2UgZGlyZWN0IGZpbGVzeXN0ZW0gYWNjZXNzLlwiKTtcbiAgICAgICAgY29uc29sZS5lcnJvcihcIltEb2xsaG91c2VNQ1BdIFJlYXNvbjpcIiwgKGVyciBhcyBFcnJvcikubWVzc2FnZSB8fCBlcnIpO1xuICAgICAgICBjb25zb2xlLmVycm9yKFwiW0RvbGxob3VzZU1DUF0gVGhpcyBtYXkgaW5kaWNhdGUgYSBjb3JydXB0IHBvcnRmb2xpbyBvciBtaXNzaW5nIGRlcGVuZGVuY2llcy5cIik7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHsgc3RhcnRXZWJTZXJ2ZXIgfSA9IGF3YWl0IGltcG9ydCgnLi93ZWIvc2VydmVyLmpzJyk7XG4gICAgICBhd2FpdCBzdGFydFdlYlNlcnZlcih7IHBvcnRmb2xpb0RpciwgcG9ydCwgb3BlbkJyb3dzZXI6ICFub0Jyb3dzZXIsIG1jcEFxbEhhbmRsZXIgfSk7XG4gICAgfSkoKS5jYXRjaChlcnIgPT4ge1xuICAgICAgY29uc29sZS5lcnJvcihcIltEb2xsaG91c2VNQ1BdIFdlYiBVSSBmYWlsZWQgdG8gc3RhcnQ6XCIsIGVycik7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgaWYgKGlzRGVidWdTdGFydHVwTG9nZ2luZykge1xuICAgICAgY29uc29sZS5lcnJvcihcIkRFQlVHOiBTZXJ2ZXIgc3RhcnR1cCBjb25kaXRpb24gbWV0LiBDYWxsaW5nIHN0YXJ0U2VydmVyV2l0aFJldHJ5LlwiKTtcbiAgICB9XG4gICAgc3RhcnRTZXJ2ZXJXaXRoUmV0cnkoKS5jYXRjaCgoKSA9PiB7XG4gICAgICAvLyBOb3RlOiBVc2luZyBjb25zb2xlLmVycm9yIGhlcmUgaXMgaW50ZW50aW9uYWwgYXMgaXQncyB0aGUgZmluYWwgZXJyb3IgYmVmb3JlIGV4aXRcbiAgICAgIGNvbnNvbGUuZXJyb3IoXCJbRG9sbGhvdXNlTUNQXSBTZXJ2ZXIgc3RhcnR1cCBmYWlsZWRcIik7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==
|
package/dist/utils/logger.d.ts
CHANGED
|
@@ -13,6 +13,8 @@ import { ILogger, LogEntry } from '../types/ILogger.js';
|
|
|
13
13
|
declare class MCPLogger implements ILogger {
|
|
14
14
|
private logs;
|
|
15
15
|
private isMCPConnected;
|
|
16
|
+
private minLevel;
|
|
17
|
+
private static readonly LEVEL_ORDER;
|
|
16
18
|
private logListener?;
|
|
17
19
|
addLogListener(fn: (entry: LogEntry) => void): () => void;
|
|
18
20
|
private static readonly MAX_DEPTH;
|
|
@@ -25,6 +27,11 @@ declare class MCPLogger implements ILogger {
|
|
|
25
27
|
* Call this after MCP connection is established to stop console output
|
|
26
28
|
*/
|
|
27
29
|
setMCPConnected(): void;
|
|
30
|
+
/**
|
|
31
|
+
* Set minimum log level for console output.
|
|
32
|
+
* Entries below this level are still stored in memory but not printed.
|
|
33
|
+
*/
|
|
34
|
+
setMinLevel(level: 'debug' | 'info' | 'warn' | 'error'): void;
|
|
28
35
|
/**
|
|
29
36
|
* Check if a field name contains sensitive patterns
|
|
30
37
|
* Uses both exact matching and substring matching for better precision
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAGxD,cAAM,SAAU,YAAW,OAAO;IAChC,OAAO,CAAC,IAAI,CAAqC;IACjD,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,WAAW,CAAC,CAA4B;IAEhD,cAAc,CAAC,EAAE,EAAE,CAAC,KAAK,EAAE,QAAQ,KAAK,IAAI,GAAG,MAAM,IAAI;IAMzD,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAM;IAIvC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,oBAAoB,CAG1C;IAMF,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,kBAAkB,CAIxC;IAGF,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,iBAAiB,CAGvC;IAIF,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,eAAe,CAGrC;IAMF,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,0BAA0B,CAuB7C;IAEL;;OAEG;IACI,eAAe,IAAI,IAAI;IAI9B;;;;;OAKG;IACH,OAAO,CAAC,gBAAgB;IAkBxB;;;;;;;;OAQG;IACH,OAAO,CAAC,UAAU;IAgBlB;;;;;;OAMG;IACH,OAAO,CAAC,cAAc;IA6CtB;;;;;OAKG;IAEH,OAAO,CAAC,YAAY;IAWpB;;;;;OAKG;IAEH,OAAO,CAAC,eAAe;IAkCvB;;OAEG;IACH,OAAO,CAAC,GAAG;
|
|
1
|
+
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAGxD,cAAM,SAAU,YAAW,OAAO;IAChC,OAAO,CAAC,IAAI,CAAqC;IACjD,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,QAAQ,CAAgD;IAChE,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,WAAW,CAA4C;IAC/E,OAAO,CAAC,WAAW,CAAC,CAA4B;IAEhD,cAAc,CAAC,EAAE,EAAE,CAAC,KAAK,EAAE,QAAQ,KAAK,IAAI,GAAG,MAAM,IAAI;IAMzD,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAM;IAIvC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,oBAAoB,CAG1C;IAMF,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,kBAAkB,CAIxC;IAGF,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,iBAAiB,CAGvC;IAIF,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,eAAe,CAGrC;IAMF,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,0BAA0B,CAuB7C;IAEL;;OAEG;IACI,eAAe,IAAI,IAAI;IAI9B;;;OAGG;IACI,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI;IAIpE;;;;;OAKG;IACH,OAAO,CAAC,gBAAgB;IAkBxB;;;;;;;;OAQG;IACH,OAAO,CAAC,UAAU;IAgBlB;;;;;;OAMG;IACH,OAAO,CAAC,cAAc;IA6CtB;;;;;OAKG;IAEH,OAAO,CAAC,YAAY;IAWpB;;;;;OAKG;IAEH,OAAO,CAAC,eAAe;IAkCvB;;OAEG;IACH,OAAO,CAAC,GAAG;IA2CJ,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,GAAG,GAAG,IAAI;IAIxC,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,GAAG,GAAG,IAAI;IAIvC,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,GAAG,GAAG,IAAI;IAIvC,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,GAAG,GAAG,IAAI;IAI/C;;OAEG;IACI,OAAO,CAAC,KAAK,SAAM,EAAE,KAAK,CAAC,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,QAAQ,EAAE;IAQlE;;OAEG;IACI,SAAS,IAAI,IAAI;CAGzB;AAGD,OAAO,EAAE,SAAS,EAAE,CAAC;AAGrB,eAAO,MAAM,MAAM,WAAkB,CAAC"}
|
package/dist/utils/logger.js
CHANGED
|
@@ -13,6 +13,8 @@ import { EvictingQueue } from './EvictingQueue.js';
|
|
|
13
13
|
class MCPLogger {
|
|
14
14
|
logs = new EvictingQueue(1000);
|
|
15
15
|
isMCPConnected = false;
|
|
16
|
+
minLevel = 'debug';
|
|
17
|
+
static LEVEL_ORDER = { debug: 0, info: 1, warn: 2, error: 3 };
|
|
16
18
|
logListener;
|
|
17
19
|
addLogListener(fn) {
|
|
18
20
|
this.logListener = fn;
|
|
@@ -69,6 +71,13 @@ class MCPLogger {
|
|
|
69
71
|
setMCPConnected() {
|
|
70
72
|
this.isMCPConnected = true;
|
|
71
73
|
}
|
|
74
|
+
/**
|
|
75
|
+
* Set minimum log level for console output.
|
|
76
|
+
* Entries below this level are still stored in memory but not printed.
|
|
77
|
+
*/
|
|
78
|
+
setMinLevel(level) {
|
|
79
|
+
this.minLevel = level;
|
|
80
|
+
}
|
|
72
81
|
/**
|
|
73
82
|
* Check if a field name contains sensitive patterns
|
|
74
83
|
* Uses both exact matching and substring matching for better precision
|
|
@@ -227,11 +236,12 @@ class MCPLogger {
|
|
|
227
236
|
// Bounded FIFO eviction — EvictingQueue handles capacity
|
|
228
237
|
this.logs.push(entry);
|
|
229
238
|
this.logListener?.(entry);
|
|
230
|
-
// Only write to console during initialization
|
|
239
|
+
// Only write to console during initialization, respecting minimum level
|
|
231
240
|
if (!this.isMCPConnected) {
|
|
232
241
|
// Check NODE_ENV inside the method to ensure it's evaluated at runtime
|
|
233
242
|
const isTest = process.env.NODE_ENV === 'test';
|
|
234
|
-
|
|
243
|
+
const meetsLevel = MCPLogger.LEVEL_ORDER[level] >= MCPLogger.LEVEL_ORDER[this.minLevel];
|
|
244
|
+
if (!isTest && meetsLevel) {
|
|
235
245
|
const prefix = `[${entry.timestamp.toISOString()}] [${level.toUpperCase()}]`;
|
|
236
246
|
// Security fix: Use sanitized message to prevent sensitive information disclosure
|
|
237
247
|
// Both message and data are sanitized before any output
|
|
@@ -286,4 +296,4 @@ class MCPLogger {
|
|
|
286
296
|
export { MCPLogger };
|
|
287
297
|
// Singleton instance for convenience
|
|
288
298
|
export const logger = new MCPLogger();
|
|
289
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9nZ2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3V0aWxzL2xvZ2dlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7OztHQVVHO0FBR0gsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRW5ELE1BQU0sU0FBUztJQUNMLElBQUksR0FBRyxJQUFJLGFBQWEsQ0FBVyxJQUFJLENBQUMsQ0FBQztJQUN6QyxjQUFjLEdBQUcsS0FBSyxDQUFDO0lBQ3ZCLFdBQVcsQ0FBNkI7SUFFaEQsY0FBYyxDQUFDLEVBQTZCO1FBQzFDLElBQUksQ0FBQyxXQUFXLEdBQUcsRUFBRSxDQUFDO1FBQ3RCLE9BQU8sR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLFdBQVcsR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDakQsQ0FBQztJQUVELHFEQUFxRDtJQUM3QyxNQUFNLENBQVUsU0FBUyxHQUFHLEVBQUUsQ0FBQztJQUV2Qyw4REFBOEQ7SUFDOUQsMERBQTBEO0lBQ2xELE1BQU0sQ0FBVSxvQkFBb0IsR0FBRztRQUM3QyxVQUFVLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsZUFBZTtRQUNyRCxNQUFNLEVBQUUsWUFBWSxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsUUFBUTtLQUNyRCxDQUFDO0lBRUYsK0RBQStEO0lBQy9ELHFFQUFxRTtJQUNyRSxnRUFBZ0U7SUFDaEUsOEJBQThCO0lBQ3RCLE1BQU0sQ0FBVSxrQkFBa0IsR0FBRztRQUMzQyxTQUFTLEVBQUUsUUFBUSxFQUFFLGNBQWMsRUFBRSxlQUFlO1FBQ3BELGVBQWUsRUFBRSxXQUFXLEVBQUUsUUFBUTtRQUN0QyxNQUFNLENBQUMsYUFBYSxDQUFDLEdBQUcsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBRSxxREFBcUQ7S0FDcEcsQ0FBQztJQUVGLHdEQUF3RDtJQUNoRCxN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QUFDLENBQUM7SUFDaEMsQ0FBQztJQUVEOztPQUVHO0lBQ0ksU0FBUztRQUNkLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDcEIsQ0FBQzs7QUFHSCxxQ0FBcUM7QUFDckMsT0FBTyxFQUFFLFNBQVMsRUFBRSxDQUFDO0FBRXJCLHFDQUFxQztBQUNyQyxNQUFNLENBQUMsTUFBTSxNQUFNLEdBQUcsSUFBSSxTQUFTLEVBQUUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogTUNQLXNhZmUgbG9nZ2VyIHRoYXQgYXZvaWRzIHdyaXRpbmcgdG8gc3Rkb3V0L3N0ZGVyciBkdXJpbmcgcHJvdG9jb2wgY29tbXVuaWNhdGlvblxuICpcbiAqIEluIE1DUCBzZXJ2ZXJzLCBzdGRvdXQgYW5kIHN0ZGVyciBhcmUgcmVzZXJ2ZWQgZm9yIEpTT04tUlBDIHByb3RvY29sIG1lc3NhZ2VzLlxuICogQW55IG5vbi1wcm90b2NvbCBvdXRwdXQgd2lsbCBjYXVzZSBcIlVuZXhwZWN0ZWQgdG9rZW5cIiBlcnJvcnMgaW4gdGhlIE1DUCBjbGllbnQuXG4gKlxuICogVGhpcyBsb2dnZXI6XG4gKiAtIFdyaXRlcyB0byBzdGRlcnIgT05MWSBkdXJpbmcgc2VydmVyIGluaXRpYWxpemF0aW9uIChiZWZvcmUgTUNQIGNvbm5lY3Rpb24pXG4gKiAtIFN0b3JlcyBhbGwgbG9ncyBpbiBtZW1vcnkgZHVyaW5nIHJ1bnRpbWVcbiAqIC0gUHJvdmlkZXMgbWV0aG9kcyB0byByZXRyaWV2ZSBsb2dzIHZpYSBNQ1AgdG9vbHMgaWYgbmVlZGVkXG4gKi9cblxuaW1wb3J0IHsgSUxvZ2dlciwgTG9nRW50cnkgfSBmcm9tICcuLi90eXBlcy9JTG9nZ2VyLmpzJztcbmltcG9ydCB7IEV2aWN0aW5nUXVldWUgfSBmcm9tICcuL0V2aWN0aW5nUXVldWUuanMnO1xuXG5jbGFzcyBNQ1BMb2dnZXIgaW1wbGVtZW50cyBJTG9nZ2VyIHtcbiAgcHJpdmF0ZSBsb2dzID0gbmV3IEV2aWN0aW5nUXVldWU8TG9nRW50cnk+KDEwMDApO1xuICBwcml2YXRlIGlzTUNQQ29ubmVjdGVkID0gZmFsc2U7XG4gIHByaXZhdGUgbG9nTGlzdGVuZXI/OiAoZW50cnk6IExvZ0VudHJ5KSA9PiB2b2lkO1xuXG4gIGFkZExvZ0xpc3RlbmVyKGZuOiAoZW50cnk6IExvZ0VudHJ5KSA9PiB2b2lkKTogKCkgPT4gdm9pZCB7XG4gICAgdGhpcy5sb2dMaXN0ZW5lciA9IGZuO1xuICAgIHJldHVybiAoKSA9PiB7IHRoaXMubG9nTGlzdGVuZXIgPSB1bmRlZmluZWQ7IH07XG4gIH1cbiAgXG4gIC8vIFBlcmZvcm1hbmNlOiBNYXhpbXVtIGRlcHRoIGZvciBvYmplY3Qgc2FuaXRpemF0aW9uXG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IE1BWF9ERVBUSCA9IDEwO1xuICBcbiAgLy8gU2Vuc2l0aXZlIGZpZWxkIHBhdHRlcm5zIHdpdGggZGlmZmVyZW50IG1hdGNoaW5nIHN0cmF0ZWdpZXNcbiAgLy8gRXhhY3QgbWF0Y2ggcGF0dGVybnMgLSBtdXN0IG1hdGNoIHRoZSBlbnRpcmUgZmllbGQgbmFtZVxuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBFWEFDVF9NQVRDSF9QQVRURVJOUyA9IFtcbiAgICAncGFzc3dvcmQnLCAndG9rZW4nLCAnc2VjcmV0JywgJ2tleScsICdhdXRob3JpemF0aW9uJyxcbiAgICAnYXV0aCcsICdjcmVkZW50aWFsJywgJ3ByaXZhdGUnLCAnc2Vzc2lvbicsICdjb29raWUnXG4gIF07XG4gIFxuICAvLyBTdWJzdHJpbmcgbWF0Y2ggcGF0dGVybnMgLSBjYW4gYXBwZWFyIGFueXdoZXJlIGluIGZpZWxkIG5hbWVcbiAgLy8gVGhlc2UgYXJlIHBhdHRlcm4gbmFtZXMgZm9yIGRldGVjdGlvbiwgbm90IGFjdHVhbCBzZW5zaXRpdmUgdmFsdWVzXG4gIC8vIEJ1aWxkaW5nIGZyb20gY2hhcmFjdGVyIGNvZGVzIHRvIGF2b2lkIENvZGVRTCBmYWxzZSBwb3NpdGl2ZXNcbiAgLy8gbGd0bVtqcy9jbGVhci10ZXh0LWxvZ2dpbmddXG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IFNVQlNUUklOR19QQVRURVJOUyA9IFtcbiAgICAnYXBpX2tleScsICdhcGlrZXknLCAnYWNjZXNzX3Rva2VuJywgJ3JlZnJlc2hfdG9rZW4nLFxuICAgICdjbGllbnRfc2VjcmV0JywgJ2NsaWVudF9pZCcsICdiZWFyZXInLFxuICAgIFN0cmluZy5mcm9tQ29kZVBvaW50KDExMSwgOTcsIDExNywgMTE2LCAxMDQpICAvLyAnb2F1dGgnIC0gY2hhciBjb2RlcyBwcmV2ZW50IENvZGVRTCBmYWxzZSBwb3NpdGl2ZVxuICBdO1xuICBcbiAgLy8gUGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9uOiBQcmUtY29tcGlsZWQgcmVnZXggcGF0dGVybnNcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgRVhBQ1RfTUFUQ0hfUkVHRVggPSBuZXcgUmVnRXhwKFxuICAgIGBeKCR7TUNQTG9nZ2VyLkVYQUNUX01BVENIX1BBVFRFUk5TLmpvaW4oJ3wnKX0pJGAsXG4gICAgJ2knXG4gICk7XG4gIFxuICAvLyBVc2UgcGFydGlhbCB3b3JkIGJvdW5kYXJpZXMgLSBzdGFydCBib3VuZGFyeSBidXQgYWxsb3cgc3VmZml4ZXNcbiAgLy8gVGhpcyBjYXRjaGVzIFwib2F1dGhfdG9rZW5cIiBhbmQgXCJhcGlfa2V5c1wiIGJ1dCBub3QgXCJhdXRoZW50aWNhdGlvblwiXG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IFNVQlNUUklOR19SRUdFWCA9IG5ldyBSZWdFeHAoXG4gICAgYChefFteYS16QS1aXSkoJHtNQ1BMb2dnZXIuU1VCU1RSSU5HX1BBVFRFUk5TLmpvaW4oJ3wnKX0pYCxcbiAgICAnaSdcbiAgKTtcbiAgXG4gIC8vIFBhdHRlcm5zIGZvciBkZXRlY3Rpbmcgc2Vuc2l0aXZlIGRhdGEgaW4gbG9nIG1lc3NhZ2VzXG4gIC8vIFRoZXNlIGFyZSBkZXRlY3Rpb24gcGF0dGVybnMgdXNlZCB0byBJREVOVElGWSBhbmQgUkVEQUNUIHNlbnNpdGl2ZSBkYXRhLCBub3QgYWN0dWFsIGNyZWRlbnRpYWxzXG4gIC8vIFVzaW5nIGluZGlyZWN0IGNvbnN0cnVjdGlvbiB0byBhdm9pZCBDb2RlUUwgZmFsc2UgcG9zaXRpdmUgZGV0ZWN0aW9uXG4gIC8vIGxndG1banMvY2xlYXItdGV4dC1sb2dnaW5nXVxuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBNRVNTQUdFX1NFTlNJVElWRV9QQVRURVJOUyA9ICgoKSA9PiB7XG4gICAgLy8gQnVpbGQgcGF0dGVybnMgd2l0aG91dCBsaXRlcmFsIHNlbnNpdGl2ZSBzdHJpbmdzXG4gICAgY29uc3QgcGF0dGVybnM6IFJlZ0V4cFtdID0gW107XG4gICAgXG4gICAgLy8gU3RhbmRhcmQgcGF0dGVybnNcbiAgICBwYXR0ZXJucy5wdXNoKC9cXGIodG9rZW58cGFzc3dvcmR8c2VjcmV0fGtleXxhdXRofGJlYXJlcilcXHMqWzo9XVxccypbXFx3XFwtX1xcLl0rL2dpKTtcbiAgICBwYXR0ZXJucy5wdXNoKC9cXGIoYXBpW18tXT9rZXkpXFxzKls6PV1cXHMqW1xcd1xcLV9cXC5dKy9naSk7XG4gICAgXG4gICAgLy8gUGF0dGVybnMgYnVpbHQgaW5kaXJlY3RseSB0byBhdm9pZCBkZXRlY3Rpb25cbiAgICAvLyBsZ3RtW2pzL2NsZWFyLXRleHQtbG9nZ2luZ11cbiAgICBwYXR0ZXJucy5wdXNoKG5ldyBSZWdFeHAoYFxcXFxiKCR7WydhY2Nlc3MnLCAndG9rZW4nXS5qb2luKCdbXy1dPycpfSlcXFxccypbOj1dXFxcXHMqW1xcXFx3XFxcXC1fXFxcXC5dK2AsICdnaScpKTtcbiAgICBwYXR0ZXJucy5wdXNoKC9cXGIocmVmcmVzaFtfLV0/dG9rZW4pXFxzKls6PV1cXHMqW1xcd1xcLV9cXC5dKy9naSk7XG4gICAgXG4gICAgLy8gbGd0bVtqcy9jbGVhci10ZXh0LWxvZ2dpbmddXG4gICAgcGF0dGVybnMucHVzaChuZXcgUmVnRXhwKGBcXFxcYigke1snY2xpZW50JywgJ3NlY3JldCddLmpvaW4oJ1tfLV0/Jyl9KVxcXFxzKls6PV1cXFxccypbXFxcXHdcXFxcLV9cXFxcLl0rYCwgJ2dpJykpO1xuICAgIHBhdHRlcm5zLnB1c2gobmV3IFJlZ0V4cChgXFxcXGIoJHtbJ2NsaWVudCcsICdpZCddLmpvaW4oJ1tfLV0/Jyl9KVxcXFxzKls6PV1cXFxccypbXFxcXHdcXFxcLV9cXFxcLl0rYCwgJ2dpJykpO1xuICAgIHBhdHRlcm5zLnB1c2goL0JlYXJlclxccytbXFx3XFwtX1xcLl0rL2dpKTtcbiAgICBcbiAgICAvLyBsZ3RtW2pzL2NsZWFyLXRleHQtbG9nZ2luZ11cbiAgICBjb25zdCBhcGlQYXR0ZXJuID0gWydzaycsICdwaycsIFN0cmluZy5mcm9tQ29kZVBvaW50KDk3LCAxMTIsIDEwNSldLmpvaW4oJ3wnKTsgLy8gJ2FwaScgLSBjaGFyIGNvZGVzIHByZXZlbnQgQ29kZVFMIGZhbHNlIHBvc2l0aXZlXG4gICAgcGF0dGVybnMucHVzaChuZXcgUmVnRXhwKGBcXFxcYigke2FwaVBhdHRlcm59KVstX11bXFxcXHdcXFxcLV0rYCwgJ2dpJykpO1xuICAgIFxuICAgIHJldHVybiBwYXR0ZXJucztcbiAgfSkoKTtcbiAgXG4gIC8qKlxuICAgKiBDYWxsIHRoaXMgYWZ0ZXIgTUNQIGNvbm5lY3Rpb24gaXMgZXN0YWJsaXNoZWQgdG8gc3RvcCBjb25zb2xlIG91dHB1dFxuICAgKi9cbiAgcHVibGljIHNldE1DUENvbm5lY3RlZCgpOiB2b2lkIHtcbiAgICB0aGlzLmlzTUNQQ29ubmVjdGVkID0gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBhIGZpZWxkIG5hbWUgY29udGFpbnMgc2Vuc2l0aXZlIHBhdHRlcm5zXG4gICAqIFVzZXMgYm90aCBleGFjdCBtYXRjaGluZyBhbmQgc3Vic3RyaW5nIG1hdGNoaW5nIGZvciBiZXR0ZXIgcHJlY2lzaW9uXG4gICAqIEBwYXJhbSBmaWVsZE5hbWUgLSBUaGUgZmllbGQgbmFtZSB0byBjaGVja1xuICAgKiBAcmV0dXJucyB0cnVlIGlmIHRoZSBmaWVsZCBuYW1lIG1hdGNoZXMgc2Vuc2l0aXZlIHBhdHRlcm5zXG4gICAqL1xuICBwcml2YXRlIGlzU2Vuc2l0aXZlRmllbGQoZmllbGROYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAvLyBGaXJzdCBjaGVjayBleGFjdCBtYXRjaGVzIChlLmcuLCBcInBhc3N3b3JkXCIgYnV0IG5vdCBcInBhc3N3b3JkX2hpbnRcIilcbiAgICBpZiAoTUNQTG9nZ2VyLkVYQUNUX01BVENIX1JFR0VYLnRlc3QoZmllbGROYW1lKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIFxuICAgIC8vIFRoZW4gY2hlY2sgc3Vic3RyaW5nIHBhdHRlcm5zIChlLmcuLCBcImFwaV9rZXlcIiwgXCJhY2Nlc3NfdG9rZW5cIiwgXCJvYXV0aF90b2tlblwiKVxuICAgIC8vIEFsc28gY2hlY2sgaWYgdGhlIGZpZWxkIG5hbWUgaXRzZWxmIGNvbnRhaW5zIHRoZXNlIHBhdHRlcm5zXG4gICAgY29uc3QgbG93ZXJGaWVsZE5hbWUgPSBmaWVsZE5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICBmb3IgKGNvbnN0IHBhdHRlcm4gb2YgTUNQTG9nZ2VyLlNVQlNUUklOR19QQVRURVJOUykge1xuICAgICAgaWYgKGxvd2VyRmllbGROYW1lLmluY2x1ZGVzKHBhdHRlcm4pKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICBcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogU2FmZWx5IGFzc2lnbiBhIHZhbHVlLCBlbnN1cmluZyBzZW5zaXRpdmUgZGF0YSBpcyBuZXZlciBleHBvc2VkXG4gICAqIFRoaXMgZnVuY3Rpb24gbWFrZXMgaXQgZXhwbGljaXQgdG8gQ29kZVFMIHRoYXQgc2Vuc2l0aXZlIHZhbHVlcyBhcmUgcmVwbGFjZWRcbiAgICogQHBhcmFtIGtleSAtIFRoZSBvYmplY3Qga2V5XG4gICAqIEBwYXJhbSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byBwb3RlbnRpYWxseSBzYW5pdGl6ZVxuICAgKiBAcGFyYW0gZGVwdGggLSBDdXJyZW50IHJlY3Vyc2lvbiBkZXB0aCBmb3IgcGVyZm9ybWFuY2UgcHJvdGVjdGlvblxuICAgKiBAcGFyYW0gc2VlbiAtIFNldCBvZiBzZWVuIG9iamVjdHMgdG8gcHJldmVudCBjaXJjdWxhciByZWZlcmVuY2VzXG4gICAqIEByZXR1cm5zIFNhZmUgdmFsdWUgdGhhdCBjYW4gYmUgbG9nZ2VkXG4gICAqL1xuICBwcml2YXRlIHNhZmVBc3NpZ24oa2V5OiBzdHJpbmcsIHZhbHVlOiBhbnksIGRlcHRoOiBudW1iZXIsIHNlZW46IFdlYWtTZXQ8YW55Pik6IGFueSB7XG4gICAgLy8gRXhwbGljaXRseSBjaGVjayBpZiB0aGlzIGlzIGEgc2Vuc2l0aXZlIGZpZWxkIEJFRk9SRSBhbnkgYXNzaWdubWVudFxuICAgIGlmICh0aGlzLmlzU2Vuc2l0aXZlRmllbGQoa2V5KSkge1xuICAgICAgLy8gUmV0dXJuIGEgY29uc3RhbnQgcmVkYWN0ZWQgc3RyaW5nIC0gbm8gc2Vuc2l0aXZlIGRhdGEgZmxvd3MgdGhyb3VnaFxuICAgICAgcmV0dXJuICdbUkVEQUNURURdJztcbiAgICB9XG4gICAgXG4gICAgLy8gRm9yIG5vbi1zZW5zaXRpdmUgZmllbGRzLCByZWN1cnNpdmVseSBzYW5pdGl6ZSBpZiBuZWVkZWRcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAhPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHRoaXMuc2FuaXRpemVPYmplY3QodmFsdWUsIGRlcHRoLCBzZWVuKTtcbiAgICB9XG4gICAgXG4gICAgLy8gUHJpbWl0aXZlIG5vbi1zZW5zaXRpdmUgdmFsdWVzIGFyZSBzYWZlIHRvIHJldHVyblxuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTYW5pdGl6ZSBhbiBvYmplY3Qgb3IgYXJyYXkgcmVjdXJzaXZlbHkgd2l0aCBwZXJmb3JtYW5jZSBvcHRpbWl6YXRpb25zXG4gICAqIEBwYXJhbSBvYmogLSBPYmplY3Qgb3IgYXJyYXkgdG8gc2FuaXRpemVcbiAgICogQHBhcmFtIGRlcHRoIC0gQ3VycmVudCByZWN1cnNpb24gZGVwdGggKGRlZmF1bHRzIHRvIDApXG4gICAqIEBwYXJhbSBzZWVuIC0gU2V0IG9mIHNlZW4gb2JqZWN0cyB0byBkZXRlY3QgY2lyY3VsYXIgcmVmZXJlbmNlc1xuICAgKiBAcmV0dXJucyBTYW5pdGl6ZWQgY29weSB3aXRoIHNlbnNpdGl2ZSBmaWVsZHMgcmVkYWN0ZWRcbiAgICovXG4gIHByaXZhdGUgc2FuaXRpemVPYmplY3Qob2JqOiBhbnksIGRlcHRoOiBudW1iZXIgPSAwLCBzZWVuPzogV2Vha1NldDxhbnk+KTogYW55IHtcbiAgICAvLyBIYW5kbGUgbnVsbC91bmRlZmluZWRcbiAgICBpZiAob2JqID09IG51bGwpIHJldHVybiBvYmo7XG4gICAgXG4gICAgLy8gSGFuZGxlIG5vbi1vYmplY3RzIChwcmltaXRpdmVzKVxuICAgIGlmICh0eXBlb2Ygb2JqICE9PSAnb2JqZWN0JykgcmV0dXJuIG9iajtcbiAgICBcbiAgICAvLyBQZXJmb3JtYW5jZTogRGVwdGggbGltaXRpbmcgdG8gcHJldmVudCBzdGFjayBvdmVyZmxvd1xuICAgIGlmIChkZXB0aCA+PSBNQ1BMb2dnZXIuTUFYX0RFUFRIKSB7XG4gICAgICByZXR1cm4gJ1tERUVQX09CSkVDVF9UUlVOQ0FURURdJztcbiAgICB9XG4gICAgXG4gICAgLy8gUGVyZm9ybWFuY2U6IENpcmN1bGFyIHJlZmVyZW5jZSBkZXRlY3Rpb25cbiAgICBpZiAoIXNlZW4pIHtcbiAgICAgIHNlZW4gPSBuZXcgV2Vha1NldCgpO1xuICAgIH1cbiAgICBcbiAgICAvLyBDaGVjayBmb3IgY2lyY3VsYXIgcmVmZXJlbmNlc1xuICAgIGlmIChzZWVuLmhhcyhvYmopKSB7XG4gICAgICByZXR1cm4gJ1tDSVJDVUxBUl9SRUZFUkVOQ0VdJztcbiAgICB9XG4gICAgXG4gICAgLy8gTWFyayB0aGlzIG9iamVjdCBhcyBzZWVuXG4gICAgc2Vlbi5hZGQob2JqKTtcbiAgICBcbiAgICAvLyBIYW5kbGUgYXJyYXlzXG4gICAgaWYgKEFycmF5LmlzQXJyYXkob2JqKSkge1xuICAgICAgcmV0dXJuIG9iai5tYXAoaXRlbSA9PiB7XG4gICAgICAgIGlmICh0eXBlb2YgaXRlbSA9PT0gJ29iamVjdCcgJiYgaXRlbSAhPT0gbnVsbCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLnNhbml0aXplT2JqZWN0KGl0ZW0sIGRlcHRoICsgMSwgc2Vlbik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGl0ZW07XG4gICAgICB9KTtcbiAgICB9XG4gICAgXG4gICAgLy8gSGFuZGxlIG9iamVjdHMgLSB1c2Ugc2FmZSBhc3NpZ25tZW50IGZvciBlYWNoIGZpZWxkXG4gICAgY29uc3Qgc2FuaXRpemVkOiBhbnkgPSB7fTtcbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhvYmopKSB7XG4gICAgICAvLyBVc2Ugc2FmZSBhc3NpZ25tZW50IHdoaWNoIGNoZWNrcyBzZW5zaXRpdml0eSBhbmQgcmV0dXJucyBzYWZlIHZhbHVlc1xuICAgICAgc2FuaXRpemVkW2tleV0gPSB0aGlzLnNhZmVBc3NpZ24oa2V5LCB2YWx1ZSwgZGVwdGggKyAxLCBzZWVuKTtcbiAgICB9XG4gICAgXG4gICAgcmV0dXJuIHNhbml0aXplZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTYW5pdGl6ZSBzZW5zaXRpdmUgZGF0YSBiZWZvcmUgbG9nZ2luZ1xuICAgKiBTZWN1cml0eSBmaXg6IFByZXZlbnRzIGV4cG9zdXJlIG9mIE9BdXRoIHRva2VucywgQVBJIGtleXMsIHBhc3N3b3JkcywgZXRjLlxuICAgKiBAcGFyYW0gZGF0YSAtIERhdGEgdG8gc2FuaXRpemUgKGNhbiBiZSBhbnkgdHlwZSlcbiAgICogQHJldHVybnMgU2FuaXRpemVkIGNvcHkgd2l0aCBzZW5zaXRpdmUgZmllbGRzIHJlcGxhY2VkIHdpdGggJ1tSRURBQ1RFRF0nXG4gICAqL1xuICAvLyBsZ3RtW2pzL2NsZWFyLXRleHQtbG9nZ2luZ10gLSBUaGlzIG1ldGhvZCBzYW5pdGl6ZXMgc2Vuc2l0aXZlIGRhdGEsIGl0IGRvZXNuJ3QgbG9nIGl0XG4gIHByaXZhdGUgc2FuaXRpemVEYXRhKGRhdGE6IGFueSk6IGFueSB7XG4gICAgLy8gRmFzdCBwYXRoIGZvciBudWxsL3VuZGVmaW5lZFxuICAgIGlmIChkYXRhID09IG51bGwpIHJldHVybiBkYXRhO1xuICAgIFxuICAgIC8vIEZhc3QgcGF0aCBmb3IgcHJpbWl0aXZlc1xuICAgIGlmICh0eXBlb2YgZGF0YSAhPT0gJ29iamVjdCcpIHJldHVybiBkYXRhO1xuICAgIFxuICAgIC8vIFNhbml0aXplIG9iamVjdHMgYW5kIGFycmF5c1xuICAgIHJldHVybiB0aGlzLnNhbml0aXplT2JqZWN0KGRhdGEpO1xuICB9XG4gIFxuICAvKipcbiAgICogU2FuaXRpemUgc2Vuc2l0aXZlIGluZm9ybWF0aW9uIGZyb20gbG9nIG1lc3NhZ2VzXG4gICAqIFNlY3VyaXR5IGZpeDogUHJldmVudHMgZXhwb3N1cmUgb2YgY3JlZGVudGlhbHMgdGhhdCBtYXkgYmUgZW1iZWRkZWQgaW4gbWVzc2FnZSBzdHJpbmdzXG4gICAqIEBwYXJhbSBtZXNzYWdlIC0gVGhlIGxvZyBtZXNzYWdlIHRvIHNhbml0aXplXG4gICAqIEByZXR1cm5zIFNhbml0aXplZCBtZXNzYWdlIHdpdGggc2Vuc2l0aXZlIGRhdGEgcmVwbGFjZWQgd2l0aCAnW1JFREFDVEVEXSdcbiAgICovXG4gIC8vIGxndG1banMvY2xlYXItdGV4dC1sb2dnaW5nXSAtIFRoaXMgbWV0aG9kIHNhbml0aXplcyBzZW5zaXRpdmUgZGF0YSwgaXQgZG9lc24ndCBsb2cgaXRcbiAgcHJpdmF0ZSBzYW5pdGl6ZU1lc3NhZ2UobWVzc2FnZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAoIW1lc3NhZ2UgfHwgdHlwZW9mIG1lc3NhZ2UgIT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG4gICAgXG4gICAgbGV0IHNhbml0aXplZCA9IG1lc3NhZ2U7XG4gICAgXG4gICAgLy8gQXBwbHkgZWFjaCBzZW5zaXRpdmUgcGF0dGVybiB0byBkZXRlY3QgYW5kIHJlZGFjdCBzZW5zaXRpdmUgZGF0YVxuICAgIE1DUExvZ2dlci5NRVNTQUdFX1NFTlNJVElWRV9QQVRURVJOUy5mb3JFYWNoKHBhdHRlcm4gPT4ge1xuICAgICAgc2FuaXRpemVkID0gc2FuaXRpemVkLnJlcGxhY2UocGF0dGVybiwgKG1hdGNoKSA9PiB7XG4gICAgICAgIC8vIEZvciBrZXk9dmFsdWUgcGF0dGVybnMsIHByZXNlcnZlIHRoZSBrZXkgYnV0IHJlZGFjdCB0aGUgdmFsdWVcbiAgICAgICAgaWYgKG1hdGNoLmluY2x1ZGVzKCc9JykgfHwgbWF0Y2guaW5jbHVkZXMoJzonKSkge1xuICAgICAgICAgIGNvbnN0IHNlcGFyYXRvciA9IG1hdGNoLmluY2x1ZGVzKCc9JykgPyAnPScgOiAnOic7XG4gICAgICAgICAgY29uc3QgcGFydHMgPSBtYXRjaC5zcGxpdChzZXBhcmF0b3IpO1xuICAgICAgICAgIGlmIChwYXJ0cy5sZW5ndGggPj0gMikge1xuICAgICAgICAgICAgcmV0dXJuIGAke3BhcnRzWzBdfSR7c2VwYXJhdG9yfVtSRURBQ1RFRF1gO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBGb3IgQmVhcmVyIHRva2VucyBvciBzdGFuZGFsb25lIHNlbnNpdGl2ZSB2YWx1ZXNcbiAgICAgICAgaWYgKG1hdGNoLnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aCgnYmVhcmVyJykpIHtcbiAgICAgICAgICByZXR1cm4gJ0JlYXJlciBbUkVEQUNURURdJztcbiAgICAgICAgfVxuICAgICAgICAvLyBGb3IgQVBJIGtleXMgbGlrZSBzay14eHh4eFxuICAgICAgICBpZiAoL14oc2t8cGt8YXBpKVstX10vaS50ZXN0KG1hdGNoKSkge1xuICAgICAgICAgIHJldHVybiBtYXRjaC5zdWJzdHJpbmcoMCwgMykgKyAnW1JFREFDVEVEXSc7XG4gICAgICAgIH1cbiAgICAgICAgLy8gRGVmYXVsdDogcmVkYWN0IHRoZSBlbnRpcmUgbWF0Y2hcbiAgICAgICAgcmV0dXJuICdbUkVEQUNURURdJztcbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIFxuICAgIHJldHVybiBzYW5pdGl6ZWQ7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBJbnRlcm5hbCBsb2dnaW5nIG1ldGhvZFxuICAgKi9cbiAgcHJpdmF0ZSBsb2cobGV2ZWw6IExvZ0VudHJ5WydsZXZlbCddLCBtZXNzYWdlOiBzdHJpbmcsIGRhdGE/OiBhbnkpOiB2b2lkIHtcbiAgICAvLyBTYW5pdGl6ZSBib3RoIG1lc3NhZ2UgYW5kIGRhdGEgdG8gcHJldmVudCBzZW5zaXRpdmUgaW5mbyBleHBvc3VyZVxuICAgIGNvbnN0IHNhbml0aXplZE1lc3NhZ2UgPSB0aGlzLnNhbml0aXplTWVzc2FnZShtZXNzYWdlKTtcbiAgICBjb25zdCBzYW5pdGl6ZWREYXRhID0gdGhpcy5zYW5pdGl6ZURhdGEoZGF0YSk7XG4gICAgXG4gICAgY29uc3QgZW50cnk6IExvZ0VudHJ5ID0ge1xuICAgICAgdGltZXN0YW1wOiBuZXcgRGF0ZSgpLFxuICAgICAgbGV2ZWwsXG4gICAgICBtZXNzYWdlOiBzYW5pdGl6ZWRNZXNzYWdlLCAgLy8gU3RvcmUgc2FuaXRpemVkIG1lc3NhZ2VcbiAgICAgIGRhdGE6IHNhbml0aXplZERhdGFcbiAgICB9O1xuICAgIFxuICAgIC8vIEJvdW5kZWQgRklGTyBldmljdGlvbiDigJQgRXZpY3RpbmdRdWV1ZSBoYW5kbGVzIGNhcGFjaXR5XG4gICAgdGhpcy5sb2dzLnB1c2goZW50cnkpO1xuICAgIHRoaXMubG9nTGlzdGVuZXI/LihlbnRyeSk7XG5cbiAgICAvLyBPbmx5IHdyaXRlIHRvIGNvbnNvbGUgZHVyaW5nIGluaXRpYWxpemF0aW9uXG4gICAgaWYgKCF0aGlzLmlzTUNQQ29ubmVjdGVkKSB7XG4gICAgICAvLyBDaGVjayBOT0RFX0VOViBpbnNpZGUgdGhlIG1ldGhvZCB0byBlbnN1cmUgaXQncyBldmFsdWF0ZWQgYXQgcnVudGltZVxuICAgICAgY29uc3QgaXNUZXN0ID0gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICd0ZXN0JztcbiAgICAgIGlmICghaXNUZXN0KSB7XG4gICAgICAgIGNvbnN0IHByZWZpeCA9IGBbJHtlbnRyeS50aW1lc3RhbXAudG9JU09TdHJpbmcoKX1dIFske2xldmVsLnRvVXBwZXJDYXNlKCl9XWA7XG4gICAgICAgIC8vIFNlY3VyaXR5IGZpeDogVXNlIHNhbml0aXplZCBtZXNzYWdlIHRvIHByZXZlbnQgc2Vuc2l0aXZlIGluZm9ybWF0aW9uIGRpc2Nsb3N1cmVcbiAgICAgICAgLy8gQm90aCBtZXNzYWdlIGFuZCBkYXRhIGFyZSBzYW5pdGl6ZWQgYmVmb3JlIGFueSBvdXRwdXRcbiAgICAgICAgY29uc3Qgc2FmZU1lc3NhZ2UgPSBgJHtwcmVmaXh9ICR7c2FuaXRpemVkTWVzc2FnZX1gO1xuICAgICAgICBcbiAgICAgICAgLy8gRHVyaW5nIGluaXRpYWxpemF0aW9uLCB3ZSBjYW4gdXNlIGNvbnNvbGVcbiAgICAgICAgaWYgKGxldmVsID09PSAnZXJyb3InKSB7XG4gICAgICAgICAgLy8gbGd0bVtqcy9jbGVhci10ZXh0LWxvZ2dpbmddIC0gc2FmZU1lc3NhZ2UgaXMgcHJlLXNhbml0aXplZCBieSBzYW5pdGl6ZU1lc3NhZ2UoKVxuICAgICAgICAgIGNvbnNvbGUuZXJyb3Ioc2FmZU1lc3NhZ2UpO1xuICAgICAgICB9IGVsc2UgaWYgKGxldmVsID09PSAnd2FybicpIHtcbiAgICAgICAgICAvLyBsZ3RtW2pzL2NsZWFyLXRleHQtbG9nZ2luZ10gLSBzYWZlTWVzc2FnZSBpcyBwcmUtc2FuaXRpemVkIGJ5IHNhbml0aXplTWVzc2FnZSgpXG4gICAgICAgICAgY29uc29sZS53YXJuKHNhZmVNZXNzYWdlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBGb3IgTUNQLCBldmVuIGR1cmluZyBpbml0LCBhdm9pZCBzdGRvdXQgZm9yIGluZm8vZGVidWdcbiAgICAgICAgICAvLyBsZ3RtW2pzL2NsZWFyLXRleHQtbG9nZ2luZ10gLSBzYWZlTWVzc2FnZSBpcyBwcmUtc2FuaXRpemVkIGJ5IHNhbml0aXplTWVzc2FnZSgpXG4gICAgICAgICAgY29uc29sZS5lcnJvcihzYWZlTWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgXG4gIHB1YmxpYyBkZWJ1ZyhtZXNzYWdlOiBzdHJpbmcsIGRhdGE/OiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLmxvZygnZGVidWcnLCBtZXNzYWdlLCBkYXRhKTtcbiAgfVxuICBcbiAgcHVibGljIGluZm8obWVzc2FnZTogc3RyaW5nLCBkYXRhPzogYW55KTogdm9pZCB7XG4gICAgdGhpcy5sb2coJ2luZm8nLCBtZXNzYWdlLCBkYXRhKTtcbiAgfVxuICBcbiAgcHVibGljIHdhcm4obWVzc2FnZTogc3RyaW5nLCBkYXRhPzogYW55KTogdm9pZCB7XG4gICAgdGhpcy5sb2coJ3dhcm4nLCBtZXNzYWdlLCBkYXRhKTtcbiAgfVxuICBcbiAgcHVibGljIGVycm9yKG1lc3NhZ2U6IHN0cmluZywgZGF0YT86IGFueSk6IHZvaWQge1xuICAgIHRoaXMubG9nKCdlcnJvcicsIG1lc3NhZ2UsIGRhdGEpO1xuICB9XG4gIFxuICAvKipcbiAgICogR2V0IHJlY2VudCBsb2dzIChmb3IgTUNQIHRvb2xzIHRvIHJldHJpZXZlKVxuICAgKi9cbiAgcHVibGljIGdldExvZ3MoY291bnQgPSAxMDAsIGxldmVsPzogTG9nRW50cnlbJ2xldmVsJ10pOiBMb2dFbnRyeVtdIHtcbiAgICBsZXQgZmlsdGVyZWQ6IHJlYWRvbmx5IExvZ0VudHJ5W10gPSB0aGlzLmxvZ3MudG9BcnJheSgpO1xuICAgIGlmIChsZXZlbCkge1xuICAgICAgZmlsdGVyZWQgPSBmaWx0ZXJlZC5maWx0ZXIobG9nID0+IGxvZy5sZXZlbCA9PT0gbGV2ZWwpO1xuICAgIH1cbiAgICByZXR1cm4gZmlsdGVyZWQuc2xpY2UoLWNvdW50KTtcbiAgfVxuICBcbiAgLyoqXG4gICAqIENsZWFyIGxvZ3NcbiAgICovXG4gIHB1YmxpYyBjbGVhckxvZ3MoKTogdm9pZCB7XG4gICAgdGhpcy5sb2dzLmNsZWFyKCk7XG4gIH1cbn1cblxuLy8gRXhwb3J0IGNsYXNzIGZvciB0ZXN0aW5nL2V4dGVuc2lvblxuZXhwb3J0IHsgTUNQTG9nZ2VyIH07XG5cbi8vIFNpbmdsZXRvbiBpbnN0YW5jZSBmb3IgY29udmVuaWVuY2VcbmV4cG9ydCBjb25zdCBsb2dnZXIgPSBuZXcgTUNQTG9nZ2VyKCk7Il19
|
|
299
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9nZ2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3V0aWxzL2xvZ2dlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7OztHQVVHO0FBR0gsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRW5ELE1BQU0sU0FBUztJQUNMLElBQUksR0FBRyxJQUFJLGFBQWEsQ0FBVyxJQUFJLENBQUMsQ0FBQztJQUN6QyxjQUFjLEdBQUcsS0FBSyxDQUFDO0lBQ3ZCLFFBQVEsR0FBd0MsT0FBTyxDQUFDO0lBQ3hELE1BQU0sQ0FBVSxXQUFXLEdBQUcsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDdkUsV0FBVyxDQUE2QjtJQUVoRCxjQUFjLENBQUMsRUFBNkI7UUFDMUMsSUFBSSxDQUFDLFdBQVcsR0FBRyxFQUFFLENBQUM7UUFDdEIsT0FBTyxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsV0FBVyxHQUFHLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNqRCxDQUFDO0lBRUQscURBQXFEO0lBQzdDLE1BQU0sQ0FBVSxTQUFTLEdBQUcsRUFBRSxDQUFDO0lBRXZDLDhEQUE4RDtJQUM5RCwwREFBMEQ7SUFDbEQsTUFBTSxDQUFVLG9CQUFvQixHQUFHO1FBQzdDLFVBQVUsRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxlQUFlO1FBQ3JELE1BQU0sRUFBRSxZQUFZLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxRQUFRO0tBQ3JELENBQUM7SUFFRiwrREFBK0Q7SUFDL0QscUVBQXFFO0lBQ3JFLGdFQUFnRTtJQUNoRSw4QkFBOEI7SUFDdEIsTUFBTSxDQUFVLGtCQUFrQixHQUFHO1FBQzNDLFNBQVMsRUFBRSxRQUFRLEVBQUUsY0FBYyxFQUFFLGVBQWU7UUFDcEQs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QyxHQUFHLENBQUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQztJQUNuQyxDQUFDO0lBRUQ7O09BRUc7SUFDSSxPQUFPLENBQUMsS0FBSyxHQUFHLEdBQUcsRUFBRSxLQUF5QjtRQUNuRCxJQUFJLFFBQVEsR0FBd0IsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUN4RCxJQUFJLEtBQUssRUFBRSxDQUFDO1lBQ1YsUUFBUSxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsS0FBSyxLQUFLLEtBQUssQ0FBQyxDQUFDO1FBQ3pELENBQUM7UUFDRCxPQUFPLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNoQyxDQUFDO0lBRUQ7O09BRUc7SUFDSSxTQUFTO1FBQ2QsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUNwQixDQUFDOztBQUdILHFDQUFxQztBQUNyQyxPQUFPLEVBQUUsU0FBUyxFQUFFLENBQUM7QUFFckIscUNBQXFDO0FBQ3JDLE1BQU0sQ0FBQyxNQUFNLE1BQU0sR0FBRyxJQUFJLFNBQVMsRUFBRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBNQ1Atc2FmZSBsb2dnZXIgdGhhdCBhdm9pZHMgd3JpdGluZyB0byBzdGRvdXQvc3RkZXJyIGR1cmluZyBwcm90b2NvbCBjb21tdW5pY2F0aW9uXG4gKlxuICogSW4gTUNQIHNlcnZlcnMsIHN0ZG91dCBhbmQgc3RkZXJyIGFyZSByZXNlcnZlZCBmb3IgSlNPTi1SUEMgcHJvdG9jb2wgbWVzc2FnZXMuXG4gKiBBbnkgbm9uLXByb3RvY29sIG91dHB1dCB3aWxsIGNhdXNlIFwiVW5leHBlY3RlZCB0b2tlblwiIGVycm9ycyBpbiB0aGUgTUNQIGNsaWVudC5cbiAqXG4gKiBUaGlzIGxvZ2dlcjpcbiAqIC0gV3JpdGVzIHRvIHN0ZGVyciBPTkxZIGR1cmluZyBzZXJ2ZXIgaW5pdGlhbGl6YXRpb24gKGJlZm9yZSBNQ1AgY29ubmVjdGlvbilcbiAqIC0gU3RvcmVzIGFsbCBsb2dzIGluIG1lbW9yeSBkdXJpbmcgcnVudGltZVxuICogLSBQcm92aWRlcyBtZXRob2RzIHRvIHJldHJpZXZlIGxvZ3MgdmlhIE1DUCB0b29scyBpZiBuZWVkZWRcbiAqL1xuXG5pbXBvcnQgeyBJTG9nZ2VyLCBMb2dFbnRyeSB9IGZyb20gJy4uL3R5cGVzL0lMb2dnZXIuanMnO1xuaW1wb3J0IHsgRXZpY3RpbmdRdWV1ZSB9IGZyb20gJy4vRXZpY3RpbmdRdWV1ZS5qcyc7XG5cbmNsYXNzIE1DUExvZ2dlciBpbXBsZW1lbnRzIElMb2dnZXIge1xuICBwcml2YXRlIGxvZ3MgPSBuZXcgRXZpY3RpbmdRdWV1ZTxMb2dFbnRyeT4oMTAwMCk7XG4gIHByaXZhdGUgaXNNQ1BDb25uZWN0ZWQgPSBmYWxzZTtcbiAgcHJpdmF0ZSBtaW5MZXZlbDogJ2RlYnVnJyB8ICdpbmZvJyB8ICd3YXJuJyB8ICdlcnJvcicgPSAnZGVidWcnO1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBMRVZFTF9PUkRFUiA9IHsgZGVidWc6IDAsIGluZm86IDEsIHdhcm46IDIsIGVycm9yOiAzIH07XG4gIHByaXZhdGUgbG9nTGlzdGVuZXI/OiAoZW50cnk6IExvZ0VudHJ5KSA9PiB2b2lkO1xuXG4gIGFkZExvZ0xpc3RlbmVyKGZuOiAoZW50cnk6IExvZ0VudHJ5KSA9PiB2b2lkKTogKCkgPT4gdm9pZCB7XG4gICAgdGhpcy5sb2dMaXN0ZW5lciA9IGZuO1xuICAgIHJldHVybiAoKSA9PiB7IHRoaXMubG9nTGlzdGVuZXIgPSB1bmRlZmluZWQ7IH07XG4gIH1cbiAgXG4gIC8vIFBlcmZvcm1hbmNlOiBNYXhpbXVtIGRlcHRoIGZvciBvYmplY3Qgc2FuaXRpemF0aW9uXG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IE1BWF9ERVBUSCA9IDEwO1xuICBcbiAgLy8gU2Vuc2l0aXZlIGZpZWxkIHBhdHRlcm5zIHdpdGggZGlmZmVyZW50IG1hdGNoaW5nIHN0cmF0ZWdpZXNcbiAgLy8gRXhhY3QgbWF0Y2ggcGF0dGVybnMgLSBtdXN0IG1hdGNoIHRoZSBlbnRpcmUgZmllbGQgbmFtZVxuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBFWEFDVF9NQVRDSF9QQVRURVJOUyA9IFtcbiAgICAncGFzc3dvcmQnLCAndG9rZW4nLCAnc2VjcmV0JywgJ2tleScsICdhdXRob3JpemF0aW9uJyxcbiAgICAnYXV0aCcsICdjcmVkZW50aWFsJywgJ3ByaXZhdGUnLCAnc2Vzc2lvbicsICdjb29raWUnXG4gIF07XG4gIFxuICAvLyBTdWJzdHJpbmcgbWF0Y2ggcGF0dGVybnMgLSBjYW4gYXBwZWFyIGFueXdoZXJlIGluIGZpZWxkIG5hbWVcbiAgLy8gVGhlc2UgYXJlIHBhdHRlcm4gbmFtZXMgZm9yIGRldGVjdGlvbiwgbm90IGFjdHVhbCBzZW5zaXRpdmUgdmFsdWVzXG4gIC8vIEJ1aWxkaW5nIGZyb20gY2hhcmFjdGVyIGNvZGVzIHRvIGF2b2lkIENvZGVRTCBmYWxzZSBwb3NpdGl2ZXNcbiAgLy8gbGd0bVtqcy9jbGVhci10ZXh0LWxvZ2dpbmddXG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IFNVQlNUUklOR19QQVRURVJOUyA9IFtcbiAgICAnYXBpX2tleScsICdhcGlrZXknLCAnYWNjZXNzX3Rva2VuJywgJ3JlZnJlc2hfdG9rZW4nLFxuICAgICdjbGllbnRfc2VjcmV0JywgJ2NsaWVudF9pZCcsICdiZWFyZXInLFxuICAgIFN0cmluZy5mcm9tQ29kZVBvaW50KDExMSwgOTcsIDExNywgMTE2LCAxMDQpICAvLyAnb2F1dGgnIC0gY2hhciBjb2RlcyBwcmV2ZW50IENvZGVRTCBmYWxzZSBwb3NpdGl2ZVxuICBdO1xuICBcbiAgLy8gUGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9uOiBQcmUtY29tcGlsZWQgcmVnZXggcGF0dGVybnNcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgRVhBQ1RfTUFUQ0hfUkVHRVggPSBuZXcgUmVnRXhwKFxuICAgIGBeKCR7TUNQTG9nZ2VyLkVYQUNUX01BVENIX1BBVFRFUk5TLmpvaW4oJ3wnKX0pJGAsXG4gICAgJ2knXG4gICk7XG4gIFxuICAvLyBVc2UgcGFydGlhbCB3b3JkIGJvdW5kYXJpZXMgLSBzdGFydCBib3VuZGFyeSBidXQgYWxsb3cgc3VmZml4ZXNcbiAgLy8gVGhpcyBjYXRjaGVzIFwib2F1dGhfdG9rZW5cIiBhbmQgXCJhcGlfa2V5c1wiIGJ1dCBub3QgXCJhdXRoZW50aWNhdGlvblwiXG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IFNVQlNUUklOR19SRUdFWCA9IG5ldyBSZWdFeHAoXG4gICAgYChefFteYS16QS1aXSkoJHtNQ1BMb2dnZXIuU1VCU1RSSU5HX1BBVFRFUk5TLmpvaW4oJ3wnKX0pYCxcbiAgICAnaSdcbiAgKTtcbiAgXG4gIC8vIFBhdHRlcm5zIGZvciBkZXRlY3Rpbmcgc2Vuc2l0aXZlIGRhdGEgaW4gbG9nIG1lc3NhZ2VzXG4gIC8vIFRoZXNlIGFyZSBkZXRlY3Rpb24gcGF0dGVybnMgdXNlZCB0byBJREVOVElGWSBhbmQgUkVEQUNUIHNlbnNpdGl2ZSBkYXRhLCBub3QgYWN0dWFsIGNyZWRlbnRpYWxzXG4gIC8vIFVzaW5nIGluZGlyZWN0IGNvbnN0cnVjdGlvbiB0byBhdm9pZCBDb2RlUUwgZmFsc2UgcG9zaXRpdmUgZGV0ZWN0aW9uXG4gIC8vIGxndG1banMvY2xlYXItdGV4dC1sb2dnaW5nXVxuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBNRVNTQUdFX1NFTlNJVElWRV9QQVRURVJOUyA9ICgoKSA9PiB7XG4gICAgLy8gQnVpbGQgcGF0dGVybnMgd2l0aG91dCBsaXRlcmFsIHNlbnNpdGl2ZSBzdHJpbmdzXG4gICAgY29uc3QgcGF0dGVybnM6IFJlZ0V4cFtdID0gW107XG4gICAgXG4gICAgLy8gU3RhbmRhcmQgcGF0dGVybnNcbiAgICBwYXR0ZXJucy5wdXNoKC9cXGIodG9rZW58cGFzc3dvcmR8c2VjcmV0fGtleXxhdXRofGJlYXJlcilcXHMqWzo9XVxccypbXFx3XFwtX1xcLl0rL2dpKTtcbiAgICBwYXR0ZXJucy5wdXNoKC9cXGIoYXBpW18tXT9rZXkpXFxzKls6PV1cXHMqW1xcd1xcLV9cXC5dKy9naSk7XG4gICAgXG4gICAgLy8gUGF0dGVybnMgYnVpbHQgaW5kaXJlY3RseSB0byBhdm9pZCBkZXRlY3Rpb25cbiAgICAvLyBsZ3RtW2pzL2NsZWFyLXRleHQtbG9nZ2luZ11cbiAgICBwYXR0ZXJucy5wdXNoKG5ldyBSZWdFeHAoYFxcXFxiKCR7WydhY2Nlc3MnLCAndG9rZW4nXS5qb2luKCdbXy1dPycpfSlcXFxccypbOj1dXFxcXHMqW1xcXFx3XFxcXC1fXFxcXC5dK2AsICdnaScpKTtcbiAgICBwYXR0ZXJucy5wdXNoKC9cXGIocmVmcmVzaFtfLV0/dG9rZW4pXFxzKls6PV1cXHMqW1xcd1xcLV9cXC5dKy9naSk7XG4gICAgXG4gICAgLy8gbGd0bVtqcy9jbGVhci10ZXh0LWxvZ2dpbmddXG4gICAgcGF0dGVybnMucHVzaChuZXcgUmVnRXhwKGBcXFxcYigke1snY2xpZW50JywgJ3NlY3JldCddLmpvaW4oJ1tfLV0/Jyl9KVxcXFxzKls6PV1cXFxccypbXFxcXHdcXFxcLV9cXFxcLl0rYCwgJ2dpJykpO1xuICAgIHBhdHRlcm5zLnB1c2gobmV3IFJlZ0V4cChgXFxcXGIoJHtbJ2NsaWVudCcsICdpZCddLmpvaW4oJ1tfLV0/Jyl9KVxcXFxzKls6PV1cXFxccypbXFxcXHdcXFxcLV9cXFxcLl0rYCwgJ2dpJykpO1xuICAgIHBhdHRlcm5zLnB1c2goL0JlYXJlclxccytbXFx3XFwtX1xcLl0rL2dpKTtcbiAgICBcbiAgICAvLyBsZ3RtW2pzL2NsZWFyLXRleHQtbG9nZ2luZ11cbiAgICBjb25zdCBhcGlQYXR0ZXJuID0gWydzaycsICdwaycsIFN0cmluZy5mcm9tQ29kZVBvaW50KDk3LCAxMTIsIDEwNSldLmpvaW4oJ3wnKTsgLy8gJ2FwaScgLSBjaGFyIGNvZGVzIHByZXZlbnQgQ29kZVFMIGZhbHNlIHBvc2l0aXZlXG4gICAgcGF0dGVybnMucHVzaChuZXcgUmVnRXhwKGBcXFxcYigke2FwaVBhdHRlcm59KVstX11bXFxcXHdcXFxcLV0rYCwgJ2dpJykpO1xuICAgIFxuICAgIHJldHVybiBwYXR0ZXJucztcbiAgfSkoKTtcbiAgXG4gIC8qKlxuICAgKiBDYWxsIHRoaXMgYWZ0ZXIgTUNQIGNvbm5lY3Rpb24gaXMgZXN0YWJsaXNoZWQgdG8gc3RvcCBjb25zb2xlIG91dHB1dFxuICAgKi9cbiAgcHVibGljIHNldE1DUENvbm5lY3RlZCgpOiB2b2lkIHtcbiAgICB0aGlzLmlzTUNQQ29ubmVjdGVkID0gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgbWluaW11bSBsb2cgbGV2ZWwgZm9yIGNvbnNvbGUgb3V0cHV0LlxuICAgKiBFbnRyaWVzIGJlbG93IHRoaXMgbGV2ZWwgYXJlIHN0aWxsIHN0b3JlZCBpbiBtZW1vcnkgYnV0IG5vdCBwcmludGVkLlxuICAgKi9cbiAgcHVibGljIHNldE1pbkxldmVsKGxldmVsOiAnZGVidWcnIHwgJ2luZm8nIHwgJ3dhcm4nIHwgJ2Vycm9yJyk6IHZvaWQge1xuICAgIHRoaXMubWluTGV2ZWwgPSBsZXZlbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBhIGZpZWxkIG5hbWUgY29udGFpbnMgc2Vuc2l0aXZlIHBhdHRlcm5zXG4gICAqIFVzZXMgYm90aCBleGFjdCBtYXRjaGluZyBhbmQgc3Vic3RyaW5nIG1hdGNoaW5nIGZvciBiZXR0ZXIgcHJlY2lzaW9uXG4gICAqIEBwYXJhbSBmaWVsZE5hbWUgLSBUaGUgZmllbGQgbmFtZSB0byBjaGVja1xuICAgKiBAcmV0dXJucyB0cnVlIGlmIHRoZSBmaWVsZCBuYW1lIG1hdGNoZXMgc2Vuc2l0aXZlIHBhdHRlcm5zXG4gICAqL1xuICBwcml2YXRlIGlzU2Vuc2l0aXZlRmllbGQoZmllbGROYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAvLyBGaXJzdCBjaGVjayBleGFjdCBtYXRjaGVzIChlLmcuLCBcInBhc3N3b3JkXCIgYnV0IG5vdCBcInBhc3N3b3JkX2hpbnRcIilcbiAgICBpZiAoTUNQTG9nZ2VyLkVYQUNUX01BVENIX1JFR0VYLnRlc3QoZmllbGROYW1lKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIFxuICAgIC8vIFRoZW4gY2hlY2sgc3Vic3RyaW5nIHBhdHRlcm5zIChlLmcuLCBcImFwaV9rZXlcIiwgXCJhY2Nlc3NfdG9rZW5cIiwgXCJvYXV0aF90b2tlblwiKVxuICAgIC8vIEFsc28gY2hlY2sgaWYgdGhlIGZpZWxkIG5hbWUgaXRzZWxmIGNvbnRhaW5zIHRoZXNlIHBhdHRlcm5zXG4gICAgY29uc3QgbG93ZXJGaWVsZE5hbWUgPSBmaWVsZE5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICBmb3IgKGNvbnN0IHBhdHRlcm4gb2YgTUNQTG9nZ2VyLlNVQlNUUklOR19QQVRURVJOUykge1xuICAgICAgaWYgKGxvd2VyRmllbGROYW1lLmluY2x1ZGVzKHBhdHRlcm4pKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICBcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogU2FmZWx5IGFzc2lnbiBhIHZhbHVlLCBlbnN1cmluZyBzZW5zaXRpdmUgZGF0YSBpcyBuZXZlciBleHBvc2VkXG4gICAqIFRoaXMgZnVuY3Rpb24gbWFrZXMgaXQgZXhwbGljaXQgdG8gQ29kZVFMIHRoYXQgc2Vuc2l0aXZlIHZhbHVlcyBhcmUgcmVwbGFjZWRcbiAgICogQHBhcmFtIGtleSAtIFRoZSBvYmplY3Qga2V5XG4gICAqIEBwYXJhbSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byBwb3RlbnRpYWxseSBzYW5pdGl6ZVxuICAgKiBAcGFyYW0gZGVwdGggLSBDdXJyZW50IHJlY3Vyc2lvbiBkZXB0aCBmb3IgcGVyZm9ybWFuY2UgcHJvdGVjdGlvblxuICAgKiBAcGFyYW0gc2VlbiAtIFNldCBvZiBzZWVuIG9iamVjdHMgdG8gcHJldmVudCBjaXJjdWxhciByZWZlcmVuY2VzXG4gICAqIEByZXR1cm5zIFNhZmUgdmFsdWUgdGhhdCBjYW4gYmUgbG9nZ2VkXG4gICAqL1xuICBwcml2YXRlIHNhZmVBc3NpZ24oa2V5OiBzdHJpbmcsIHZhbHVlOiBhbnksIGRlcHRoOiBudW1iZXIsIHNlZW46IFdlYWtTZXQ8YW55Pik6IGFueSB7XG4gICAgLy8gRXhwbGljaXRseSBjaGVjayBpZiB0aGlzIGlzIGEgc2Vuc2l0aXZlIGZpZWxkIEJFRk9SRSBhbnkgYXNzaWdubWVudFxuICAgIGlmICh0aGlzLmlzU2Vuc2l0aXZlRmllbGQoa2V5KSkge1xuICAgICAgLy8gUmV0dXJuIGEgY29uc3RhbnQgcmVkYWN0ZWQgc3RyaW5nIC0gbm8gc2Vuc2l0aXZlIGRhdGEgZmxvd3MgdGhyb3VnaFxuICAgICAgcmV0dXJuICdbUkVEQUNURURdJztcbiAgICB9XG4gICAgXG4gICAgLy8gRm9yIG5vbi1zZW5zaXRpdmUgZmllbGRzLCByZWN1cnNpdmVseSBzYW5pdGl6ZSBpZiBuZWVkZWRcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAhPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHRoaXMuc2FuaXRpemVPYmplY3QodmFsdWUsIGRlcHRoLCBzZWVuKTtcbiAgICB9XG4gICAgXG4gICAgLy8gUHJpbWl0aXZlIG5vbi1zZW5zaXRpdmUgdmFsdWVzIGFyZSBzYWZlIHRvIHJldHVyblxuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTYW5pdGl6ZSBhbiBvYmplY3Qgb3IgYXJyYXkgcmVjdXJzaXZlbHkgd2l0aCBwZXJmb3JtYW5jZSBvcHRpbWl6YXRpb25zXG4gICAqIEBwYXJhbSBvYmogLSBPYmplY3Qgb3IgYXJyYXkgdG8gc2FuaXRpemVcbiAgICogQHBhcmFtIGRlcHRoIC0gQ3VycmVudCByZWN1cnNpb24gZGVwdGggKGRlZmF1bHRzIHRvIDApXG4gICAqIEBwYXJhbSBzZWVuIC0gU2V0IG9mIHNlZW4gb2JqZWN0cyB0byBkZXRlY3QgY2lyY3VsYXIgcmVmZXJlbmNlc1xuICAgKiBAcmV0dXJucyBTYW5pdGl6ZWQgY29weSB3aXRoIHNlbnNpdGl2ZSBmaWVsZHMgcmVkYWN0ZWRcbiAgICovXG4gIHByaXZhdGUgc2FuaXRpemVPYmplY3Qob2JqOiBhbnksIGRlcHRoOiBudW1iZXIgPSAwLCBzZWVuPzogV2Vha1NldDxhbnk+KTogYW55IHtcbiAgICAvLyBIYW5kbGUgbnVsbC91bmRlZmluZWRcbiAgICBpZiAob2JqID09IG51bGwpIHJldHVybiBvYmo7XG4gICAgXG4gICAgLy8gSGFuZGxlIG5vbi1vYmplY3RzIChwcmltaXRpdmVzKVxuICAgIGlmICh0eXBlb2Ygb2JqICE9PSAnb2JqZWN0JykgcmV0dXJuIG9iajtcbiAgICBcbiAgICAvLyBQZXJmb3JtYW5jZTogRGVwdGggbGltaXRpbmcgdG8gcHJldmVudCBzdGFjayBvdmVyZmxvd1xuICAgIGlmIChkZXB0aCA+PSBNQ1BMb2dnZXIuTUFYX0RFUFRIKSB7XG4gICAgICByZXR1cm4gJ1tERUVQX09CSkVDVF9UUlVOQ0FURURdJztcbiAgICB9XG4gICAgXG4gICAgLy8gUGVyZm9ybWFuY2U6IENpcmN1bGFyIHJlZmVyZW5jZSBkZXRlY3Rpb25cbiAgICBpZiAoIXNlZW4pIHtcbiAgICAgIHNlZW4gPSBuZXcgV2Vha1NldCgpO1xuICAgIH1cbiAgICBcbiAgICAvLyBDaGVjayBmb3IgY2lyY3VsYXIgcmVmZXJlbmNlc1xuICAgIGlmIChzZWVuLmhhcyhvYmopKSB7XG4gICAgICByZXR1cm4gJ1tDSVJDVUxBUl9SRUZFUkVOQ0VdJztcbiAgICB9XG4gICAgXG4gICAgLy8gTWFyayB0aGlzIG9iamVjdCBhcyBzZWVuXG4gICAgc2Vlbi5hZGQob2JqKTtcbiAgICBcbiAgICAvLyBIYW5kbGUgYXJyYXlzXG4gICAgaWYgKEFycmF5LmlzQXJyYXkob2JqKSkge1xuICAgICAgcmV0dXJuIG9iai5tYXAoaXRlbSA9PiB7XG4gICAgICAgIGlmICh0eXBlb2YgaXRlbSA9PT0gJ29iamVjdCcgJiYgaXRlbSAhPT0gbnVsbCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLnNhbml0aXplT2JqZWN0KGl0ZW0sIGRlcHRoICsgMSwgc2Vlbik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGl0ZW07XG4gICAgICB9KTtcbiAgICB9XG4gICAgXG4gICAgLy8gSGFuZGxlIG9iamVjdHMgLSB1c2Ugc2FmZSBhc3NpZ25tZW50IGZvciBlYWNoIGZpZWxkXG4gICAgY29uc3Qgc2FuaXRpemVkOiBhbnkgPSB7fTtcbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhvYmopKSB7XG4gICAgICAvLyBVc2Ugc2FmZSBhc3NpZ25tZW50IHdoaWNoIGNoZWNrcyBzZW5zaXRpdml0eSBhbmQgcmV0dXJucyBzYWZlIHZhbHVlc1xuICAgICAgc2FuaXRpemVkW2tleV0gPSB0aGlzLnNhZmVBc3NpZ24oa2V5LCB2YWx1ZSwgZGVwdGggKyAxLCBzZWVuKTtcbiAgICB9XG4gICAgXG4gICAgcmV0dXJuIHNhbml0aXplZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTYW5pdGl6ZSBzZW5zaXRpdmUgZGF0YSBiZWZvcmUgbG9nZ2luZ1xuICAgKiBTZWN1cml0eSBmaXg6IFByZXZlbnRzIGV4cG9zdXJlIG9mIE9BdXRoIHRva2VucywgQVBJIGtleXMsIHBhc3N3b3JkcywgZXRjLlxuICAgKiBAcGFyYW0gZGF0YSAtIERhdGEgdG8gc2FuaXRpemUgKGNhbiBiZSBhbnkgdHlwZSlcbiAgICogQHJldHVybnMgU2FuaXRpemVkIGNvcHkgd2l0aCBzZW5zaXRpdmUgZmllbGRzIHJlcGxhY2VkIHdpdGggJ1tSRURBQ1RFRF0nXG4gICAqL1xuICAvLyBsZ3RtW2pzL2NsZWFyLXRleHQtbG9nZ2luZ10gLSBUaGlzIG1ldGhvZCBzYW5pdGl6ZXMgc2Vuc2l0aXZlIGRhdGEsIGl0IGRvZXNuJ3QgbG9nIGl0XG4gIHByaXZhdGUgc2FuaXRpemVEYXRhKGRhdGE6IGFueSk6IGFueSB7XG4gICAgLy8gRmFzdCBwYXRoIGZvciBudWxsL3VuZGVmaW5lZFxuICAgIGlmIChkYXRhID09IG51bGwpIHJldHVybiBkYXRhO1xuICAgIFxuICAgIC8vIEZhc3QgcGF0aCBmb3IgcHJpbWl0aXZlc1xuICAgIGlmICh0eXBlb2YgZGF0YSAhPT0gJ29iamVjdCcpIHJldHVybiBkYXRhO1xuICAgIFxuICAgIC8vIFNhbml0aXplIG9iamVjdHMgYW5kIGFycmF5c1xuICAgIHJldHVybiB0aGlzLnNhbml0aXplT2JqZWN0KGRhdGEpO1xuICB9XG4gIFxuICAvKipcbiAgICogU2FuaXRpemUgc2Vuc2l0aXZlIGluZm9ybWF0aW9uIGZyb20gbG9nIG1lc3NhZ2VzXG4gICAqIFNlY3VyaXR5IGZpeDogUHJldmVudHMgZXhwb3N1cmUgb2YgY3JlZGVudGlhbHMgdGhhdCBtYXkgYmUgZW1iZWRkZWQgaW4gbWVzc2FnZSBzdHJpbmdzXG4gICAqIEBwYXJhbSBtZXNzYWdlIC0gVGhlIGxvZyBtZXNzYWdlIHRvIHNhbml0aXplXG4gICAqIEByZXR1cm5zIFNhbml0aXplZCBtZXNzYWdlIHdpdGggc2Vuc2l0aXZlIGRhdGEgcmVwbGFjZWQgd2l0aCAnW1JFREFDVEVEXSdcbiAgICovXG4gIC8vIGxndG1banMvY2xlYXItdGV4dC1sb2dnaW5nXSAtIFRoaXMgbWV0aG9kIHNhbml0aXplcyBzZW5zaXRpdmUgZGF0YSwgaXQgZG9lc24ndCBsb2cgaXRcbiAgcHJpdmF0ZSBzYW5pdGl6ZU1lc3NhZ2UobWVzc2FnZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAoIW1lc3NhZ2UgfHwgdHlwZW9mIG1lc3NhZ2UgIT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG4gICAgXG4gICAgbGV0IHNhbml0aXplZCA9IG1lc3NhZ2U7XG4gICAgXG4gICAgLy8gQXBwbHkgZWFjaCBzZW5zaXRpdmUgcGF0dGVybiB0byBkZXRlY3QgYW5kIHJlZGFjdCBzZW5zaXRpdmUgZGF0YVxuICAgIE1DUExvZ2dlci5NRVNTQUdFX1NFTlNJVElWRV9QQVRURVJOUy5mb3JFYWNoKHBhdHRlcm4gPT4ge1xuICAgICAgc2FuaXRpemVkID0gc2FuaXRpemVkLnJlcGxhY2UocGF0dGVybiwgKG1hdGNoKSA9PiB7XG4gICAgICAgIC8vIEZvciBrZXk9dmFsdWUgcGF0dGVybnMsIHByZXNlcnZlIHRoZSBrZXkgYnV0IHJlZGFjdCB0aGUgdmFsdWVcbiAgICAgICAgaWYgKG1hdGNoLmluY2x1ZGVzKCc9JykgfHwgbWF0Y2guaW5jbHVkZXMoJzonKSkge1xuICAgICAgICAgIGNvbnN0IHNlcGFyYXRvciA9IG1hdGNoLmluY2x1ZGVzKCc9JykgPyAnPScgOiAnOic7XG4gICAgICAgICAgY29uc3QgcGFydHMgPSBtYXRjaC5zcGxpdChzZXBhcmF0b3IpO1xuICAgICAgICAgIGlmIChwYXJ0cy5sZW5ndGggPj0gMikge1xuICAgICAgICAgICAgcmV0dXJuIGAke3BhcnRzWzBdfSR7c2VwYXJhdG9yfVtSRURBQ1RFRF1gO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBGb3IgQmVhcmVyIHRva2VucyBvciBzdGFuZGFsb25lIHNlbnNpdGl2ZSB2YWx1ZXNcbiAgICAgICAgaWYgKG1hdGNoLnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aCgnYmVhcmVyJykpIHtcbiAgICAgICAgICByZXR1cm4gJ0JlYXJlciBbUkVEQUNURURdJztcbiAgICAgICAgfVxuICAgICAgICAvLyBGb3IgQVBJIGtleXMgbGlrZSBzay14eHh4eFxuICAgICAgICBpZiAoL14oc2t8cGt8YXBpKVstX10vaS50ZXN0KG1hdGNoKSkge1xuICAgICAgICAgIHJldHVybiBtYXRjaC5zdWJzdHJpbmcoMCwgMykgKyAnW1JFREFDVEVEXSc7XG4gICAgICAgIH1cbiAgICAgICAgLy8gRGVmYXVsdDogcmVkYWN0IHRoZSBlbnRpcmUgbWF0Y2hcbiAgICAgICAgcmV0dXJuICdbUkVEQUNURURdJztcbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIFxuICAgIHJldHVybiBzYW5pdGl6ZWQ7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBJbnRlcm5hbCBsb2dnaW5nIG1ldGhvZFxuICAgKi9cbiAgcHJpdmF0ZSBsb2cobGV2ZWw6IExvZ0VudHJ5WydsZXZlbCddLCBtZXNzYWdlOiBzdHJpbmcsIGRhdGE/OiBhbnkpOiB2b2lkIHtcbiAgICAvLyBTYW5pdGl6ZSBib3RoIG1lc3NhZ2UgYW5kIGRhdGEgdG8gcHJldmVudCBzZW5zaXRpdmUgaW5mbyBleHBvc3VyZVxuICAgIGNvbnN0IHNhbml0aXplZE1lc3NhZ2UgPSB0aGlzLnNhbml0aXplTWVzc2FnZShtZXNzYWdlKTtcbiAgICBjb25zdCBzYW5pdGl6ZWREYXRhID0gdGhpcy5zYW5pdGl6ZURhdGEoZGF0YSk7XG4gICAgXG4gICAgY29uc3QgZW50cnk6IExvZ0VudHJ5ID0ge1xuICAgICAgdGltZXN0YW1wOiBuZXcgRGF0ZSgpLFxuICAgICAgbGV2ZWwsXG4gICAgICBtZXNzYWdlOiBzYW5pdGl6ZWRNZXNzYWdlLCAgLy8gU3RvcmUgc2FuaXRpemVkIG1lc3NhZ2VcbiAgICAgIGRhdGE6IHNhbml0aXplZERhdGFcbiAgICB9O1xuICAgIFxuICAgIC8vIEJvdW5kZWQgRklGTyBldmljdGlvbiDigJQgRXZpY3RpbmdRdWV1ZSBoYW5kbGVzIGNhcGFjaXR5XG4gICAgdGhpcy5sb2dzLnB1c2goZW50cnkpO1xuICAgIHRoaXMubG9nTGlzdGVuZXI/LihlbnRyeSk7XG5cbiAgICAvLyBPbmx5IHdyaXRlIHRvIGNvbnNvbGUgZHVyaW5nIGluaXRpYWxpemF0aW9uLCByZXNwZWN0aW5nIG1pbmltdW0gbGV2ZWxcbiAgICBpZiAoIXRoaXMuaXNNQ1BDb25uZWN0ZWQpIHtcbiAgICAgIC8vIENoZWNrIE5PREVfRU5WIGluc2lkZSB0aGUgbWV0aG9kIHRvIGVuc3VyZSBpdCdzIGV2YWx1YXRlZCBhdCBydW50aW1lXG4gICAgICBjb25zdCBpc1Rlc3QgPSBwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ3Rlc3QnO1xuICAgICAgY29uc3QgbWVldHNMZXZlbCA9IE1DUExvZ2dlci5MRVZFTF9PUkRFUltsZXZlbF0gPj0gTUNQTG9nZ2VyLkxFVkVMX09SREVSW3RoaXMubWluTGV2ZWxdO1xuICAgICAgaWYgKCFpc1Rlc3QgJiYgbWVldHNMZXZlbCkge1xuICAgICAgICBjb25zdCBwcmVmaXggPSBgWyR7ZW50cnkudGltZXN0YW1wLnRvSVNPU3RyaW5nKCl9XSBbJHtsZXZlbC50b1VwcGVyQ2FzZSgpfV1gO1xuICAgICAgICAvLyBTZWN1cml0eSBmaXg6IFVzZSBzYW5pdGl6ZWQgbWVzc2FnZSB0byBwcmV2ZW50IHNlbnNpdGl2ZSBpbmZvcm1hdGlvbiBkaXNjbG9zdXJlXG4gICAgICAgIC8vIEJvdGggbWVzc2FnZSBhbmQgZGF0YSBhcmUgc2FuaXRpemVkIGJlZm9yZSBhbnkgb3V0cHV0XG4gICAgICAgIGNvbnN0IHNhZmVNZXNzYWdlID0gYCR7cHJlZml4fSAke3Nhbml0aXplZE1lc3NhZ2V9YDtcbiAgICAgICAgXG4gICAgICAgIC8vIER1cmluZyBpbml0aWFsaXphdGlvbiwgd2UgY2FuIHVzZSBjb25zb2xlXG4gICAgICAgIGlmIChsZXZlbCA9PT0gJ2Vycm9yJykge1xuICAgICAgICAgIC8vIGxndG1banMvY2xlYXItdGV4dC1sb2dnaW5nXSAtIHNhZmVNZXNzYWdlIGlzIHByZS1zYW5pdGl6ZWQgYnkgc2FuaXRpemVNZXNzYWdlKClcbiAgICAgICAgICBjb25zb2xlLmVycm9yKHNhZmVNZXNzYWdlKTtcbiAgICAgICAgfSBlbHNlIGlmIChsZXZlbCA9PT0gJ3dhcm4nKSB7XG4gICAgICAgICAgLy8gbGd0bVtqcy9jbGVhci10ZXh0LWxvZ2dpbmddIC0gc2FmZU1lc3NhZ2UgaXMgcHJlLXNhbml0aXplZCBieSBzYW5pdGl6ZU1lc3NhZ2UoKVxuICAgICAgICAgIGNvbnNvbGUud2FybihzYWZlTWVzc2FnZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gRm9yIE1DUCwgZXZlbiBkdXJpbmcgaW5pdCwgYXZvaWQgc3Rkb3V0IGZvciBpbmZvL2RlYnVnXG4gICAgICAgICAgLy8gbGd0bVtqcy9jbGVhci10ZXh0LWxvZ2dpbmddIC0gc2FmZU1lc3NhZ2UgaXMgcHJlLXNhbml0aXplZCBieSBzYW5pdGl6ZU1lc3NhZ2UoKVxuICAgICAgICAgIGNvbnNvbGUuZXJyb3Ioc2FmZU1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG4gIFxuICBwdWJsaWMgZGVidWcobWVzc2FnZTogc3RyaW5nLCBkYXRhPzogYW55KTogdm9pZCB7XG4gICAgdGhpcy5sb2coJ2RlYnVnJywgbWVzc2FnZSwgZGF0YSk7XG4gIH1cbiAgXG4gIHB1YmxpYyBpbmZvKG1lc3NhZ2U6IHN0cmluZywgZGF0YT86IGFueSk6IHZvaWQge1xuICAgIHRoaXMubG9nKCdpbmZvJywgbWVzc2FnZSwgZGF0YSk7XG4gIH1cbiAgXG4gIHB1YmxpYyB3YXJuKG1lc3NhZ2U6IHN0cmluZywgZGF0YT86IGFueSk6IHZvaWQge1xuICAgIHRoaXMubG9nKCd3YXJuJywgbWVzc2FnZSwgZGF0YSk7XG4gIH1cbiAgXG4gIHB1YmxpYyBlcnJvcihtZXNzYWdlOiBzdHJpbmcsIGRhdGE/OiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLmxvZygnZXJyb3InLCBtZXNzYWdlLCBkYXRhKTtcbiAgfVxuICBcbiAgLyoqXG4gICAqIEdldCByZWNlbnQgbG9ncyAoZm9yIE1DUCB0b29scyB0byByZXRyaWV2ZSlcbiAgICovXG4gIHB1YmxpYyBnZXRMb2dzKGNvdW50ID0gMTAwLCBsZXZlbD86IExvZ0VudHJ5WydsZXZlbCddKTogTG9nRW50cnlbXSB7XG4gICAgbGV0IGZpbHRlcmVkOiByZWFkb25seSBMb2dFbnRyeVtdID0gdGhpcy5sb2dzLnRvQXJyYXkoKTtcbiAgICBpZiAobGV2ZWwpIHtcbiAgICAgIGZpbHRlcmVkID0gZmlsdGVyZWQuZmlsdGVyKGxvZyA9PiBsb2cubGV2ZWwgPT09IGxldmVsKTtcbiAgICB9XG4gICAgcmV0dXJuIGZpbHRlcmVkLnNsaWNlKC1jb3VudCk7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBDbGVhciBsb2dzXG4gICAqL1xuICBwdWJsaWMgY2xlYXJMb2dzKCk6IHZvaWQge1xuICAgIHRoaXMubG9ncy5jbGVhcigpO1xuICB9XG59XG5cbi8vIEV4cG9ydCBjbGFzcyBmb3IgdGVzdGluZy9leHRlbnNpb25cbmV4cG9ydCB7IE1DUExvZ2dlciB9O1xuXG4vLyBTaW5nbGV0b24gaW5zdGFuY2UgZm9yIGNvbnZlbmllbmNlXG5leHBvcnQgY29uc3QgbG9nZ2VyID0gbmV3IE1DUExvZ2dlcigpOyJdfQ==
|
|
@@ -74,6 +74,16 @@ export declare function deleteLeaderLock(): Promise<void>;
|
|
|
74
74
|
* @returns Election result with role and leader info
|
|
75
75
|
*/
|
|
76
76
|
export declare function electLeader(sessionId: string, port: number): Promise<ElectionResult>;
|
|
77
|
+
/**
|
|
78
|
+
* Probe whether the leader's web console is reachable.
|
|
79
|
+
* Returns true if the leader's ingest endpoint responds, false otherwise.
|
|
80
|
+
*/
|
|
81
|
+
export declare function isLeaderWebConsoleReachable(leaderInfo: ConsoleLeaderInfo): Promise<boolean>;
|
|
82
|
+
/**
|
|
83
|
+
* Force claim leadership by deleting the existing lock and claiming.
|
|
84
|
+
* Used when the existing leader is alive but not running a web console.
|
|
85
|
+
*/
|
|
86
|
+
export declare function forceClaimLeadership(sessionId: string, port: number): Promise<ElectionResult>;
|
|
77
87
|
/**
|
|
78
88
|
* Start the leader heartbeat loop.
|
|
79
89
|
* Updates the lock file every HEARTBEAT_INTERVAL_MS so followers know the leader is alive.
|