@wdio/browserstack-service 9.39.4 → 9.39.6
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/build/cleanup.js +2 -2
- package/build/cli/frameworks/testFramework.d.ts +13 -0
- package/build/cli/frameworks/wdioMochaTestFramework.d.ts +101 -0
- package/build/cli/modules/automateModule.d.ts +10 -3
- package/build/cli/skipReporter.d.ts +8 -1
- package/build/index.js +485 -199
- package/build/reporter.d.ts +8 -0
- package/build/service.d.ts +0 -36
- package/package.json +1 -1
package/build/cleanup.js
CHANGED
|
@@ -70,7 +70,7 @@ import logger from "@wdio/logger";
|
|
|
70
70
|
// package.json
|
|
71
71
|
var package_default = {
|
|
72
72
|
name: "@wdio/browserstack-service",
|
|
73
|
-
version: "9.39.
|
|
73
|
+
version: "9.39.6",
|
|
74
74
|
description: "WebdriverIO service for better Browserstack integration",
|
|
75
75
|
author: "BrowserStack <support@browserstack.com>",
|
|
76
76
|
homepage: "https://github.com/browserstack/wdio-browserstack-service",
|
|
@@ -4612,4 +4612,4 @@ void BStackCleanup.startCleanup();
|
|
|
4612
4612
|
export {
|
|
4613
4613
|
BStackCleanup as default
|
|
4614
4614
|
};
|
|
4615
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL3V0aWwudHMiLCAiLi4vc3JjL2xvZ1BhdGNoZXIudHMiLCAiLi4vc3JjL2luc3RydW1lbnRhdGlvbi9wZXJmb3JtYW5jZS9wZXJmb3JtYW5jZS10ZXN0ZXIudHMiLCAiLi4vc3JjL2JzdGFja0xvZ2dlci50cyIsICIuLi9wYWNrYWdlLmpzb24iLCAiLi4vc3JjL2NvbnN0YW50cy50cyIsICIuLi9zcmMvY2xpL2NsaUxvZ2dlci50cyIsICIuLi9zcmMvY2xpL2FwaVV0aWxzLnRzIiwgIi4uL3NyYy9jbGkvY2xpVXRpbHMudHMiLCAiLi4vc3JjL2ZldGNoV3JhcHBlci50cyIsICIuLi9zcmMvaW5zdHJ1bWVudGF0aW9uL3BlcmZvcm1hbmNlL2NvbnN0YW50cy50cyIsICIuLi9zcmMvY2xpL2ZyYW1ld29ya3MvY29uc3RhbnRzL3Rlc3RGcmFtZXdvcmtDb25zdGFudHMudHMiLCAiLi4vc3JjL3Rlc3RIdWIvdXRpbHMudHMiLCAiLi4vc3JjL3Rlc3RvcmNoZXN0cmF0aW9uL3Rlc3RvcmNoZXJzdHJhdGlvbnV0aWxzLnRzIiwgIi4uL3NyYy9jcmFzaC1yZXBvcnRlci50cyIsICIuLi9zcmMvY29uZmlnQ2FwdHVyZS50cyIsICIuLi9zcmMvdGVzdE9wcy9mZWF0dXJlU3RhdHMudHMiLCAiLi4vc3JjL3Rlc3RPcHMvZmVhdHVyZVVzYWdlLnRzIiwgIi4uL3NyYy90ZXN0T3BzL3Rlc3RPcHNDb25maWcudHMiLCAiLi4vc3JjL3Rlc3RPcHMvdXNhZ2VTdGF0cy50cyIsICIuLi9zcmMvc2NyaXB0cy9hY2Nlc3NpYmlsaXR5LXNjcmlwdHMudHMiLCAiLi4vc3JjL3Rlc3RPcHMvb3BlblJ1bnNKb3VybmFsLnRzIiwgIi4uL3NyYy9jbGVhbnVwLnRzIiwgIi4uL3NyYy9pbnN0cnVtZW50YXRpb24vZnVubmVsSW5zdHJ1bWVudGF0aW9uLnRzIiwgIi4uL3NyYy9kYXRhLXN0b3JlLnRzIl0sCiAgInNvdXJjZVJvb3QiOiAiL2hvbWUvcnVubmVyL3dvcmsvd2Rpby1icm93c2Vyc3RhY2stc2VydmljZS93ZGlvLWJyb3dzZXJzdGFjay1zZXJ2aWNlL3BhY2thZ2VzL2Jyb3dzZXJzdGFjay1zZXJ2aWNlIiwKICAic291cmNlc0NvbnRlbnQiOiBbImltcG9ydCB7IGhvc3RuYW1lLCBwbGF0Zm9ybSwgdHlwZSwgdmVyc2lvbiwgYXJjaCwgdG1wZGlyIH0gZnJvbSAnbm9kZTpvcydcbmltcG9ydCBjcnlwdG8gZnJvbSAnbm9kZTpjcnlwdG8nXG5pbXBvcnQgZnMgZnJvbSAnbm9kZTpmcydcbmltcG9ydCB6bGliIGZyb20gJ25vZGU6emxpYidcbmltcG9ydCB7IGZvcm1hdCwgcHJvbWlzaWZ5IH0gZnJvbSAnbm9kZTp1dGlsJ1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJ1xuaW1wb3J0IHV0aWwgZnJvbSAnbm9kZTp1dGlsJ1xuXG5pbXBvcnQgdHlwZSB7IENhcGFiaWxpdGllcywgRnJhbWV3b3JrcywgT3B0aW9ucyB9IGZyb20gJ0B3ZGlvL3R5cGVzJ1xuaW1wb3J0IHR5cGUgeyBCZWZvcmVDb21tYW5kQXJncywgQWZ0ZXJDb21tYW5kQXJncyB9IGZyb20gJ0B3ZGlvL3JlcG9ydGVyJ1xuXG5pbXBvcnQgdHlwZSB7IEdpdFJlcG9JbmZvIH0gZnJvbSAnZ2l0LXJlcG8taW5mbydcbmltcG9ydCBnaXRSZXBvSW5mbyBmcm9tICdnaXQtcmVwby1pbmZvJ1xuaW1wb3J0IGdpdGNvbmZpZyBmcm9tICdnaXRjb25maWdsb2NhbCdcbmltcG9ydCB0eXBlIHsgQ29sb3JOYW1lIH0gZnJvbSAnY2hhbGsnXG5pbXBvcnQgeyBwZXJmb3JtYW5jZSB9IGZyb20gJ25vZGU6cGVyZl9ob29rcydcbmltcG9ydCBsb2dQYXRjaGVyIGZyb20gJy4vbG9nUGF0Y2hlci5qcydcbmltcG9ydCBQZXJmb3JtYW5jZVRlc3RlciBmcm9tICcuL2luc3RydW1lbnRhdGlvbi9wZXJmb3JtYW5jZS9wZXJmb3JtYW5jZS10ZXN0ZXIuanMnXG5pbXBvcnQgKiBhcyBQRVJGT1JNQU5DRV9TREtfRVZFTlRTIGZyb20gJy4vaW5zdHJ1bWVudGF0aW9uL3BlcmZvcm1hbmNlL2NvbnN0YW50cy5qcydcbmltcG9ydCB7IGxvZ0J1aWxkRXJyb3IsIGhhbmRsZUVycm9yRm9yT2JzZXJ2YWJpbGl0eSwgaGFuZGxlRXJyb3JGb3JBY2Nlc3NpYmlsaXR5LCBnZXRQcm9kdWN0TWFwRm9yQnVpbGRTdGFydENhbGwgfSBmcm9tICcuL3Rlc3RIdWIvdXRpbHMuanMnXG5pbXBvcnQgdHlwZSBCcm93c2VyU3RhY2tDb25maWcgZnJvbSAnLi9jb25maWcuanMnXG5pbXBvcnQgeyBPcmNoZXN0cmF0aW9uVXRpbHMgfSBmcm9tICcuL3Rlc3RvcmNoZXN0cmF0aW9uL3Rlc3RvcmNoZXJzdHJhdGlvbnV0aWxzLmpzJ1xuaW1wb3J0IHR5cGUgeyBFcnJvcnMgfSBmcm9tICcuL3Rlc3RIdWIvdXRpbHMuanMnXG5pbXBvcnQgdHlwZSB7IFVzZXJDb25maWcsIFVwbG9hZFR5cGUsIEJyb3dzZXJzdGFja0NvbmZpZywgQnJvd3NlcnN0YWNrT3B0aW9ucywgTGF1bmNoUmVzcG9uc2UgfSBmcm9tICcuL3R5cGVzLmpzJ1xuaW1wb3J0IHR5cGUgeyBJVGVzdENhc2VIb29rUGFyYW1ldGVyIH0gZnJvbSAnLi9jdWN1bWJlci10eXBlcy5qcydcbmltcG9ydCB7XG4gICAgQlJPV1NFUl9ERVNDUklQVElPTixcbiAgICBVUExPQURfTE9HU19FTkRQT0lOVCxcbiAgICBjb25zb2xlSG9sZGVyLFxuICAgIFRFU1RPUFNfQlVJTERfQ09NUExFVEVEX0VOVixcbiAgICBCUk9XU0VSU1RBQ0tfVEVTVEhVQl9KV1QsXG4gICAgQlJPV1NFUlNUQUNLX09CU0VSVkFCSUxJVFksXG4gICAgQlJPV1NFUlNUQUNLX0FDQ0VTU0lCSUxJVFksXG4gICAgQlJPV1NFUlNUQUNLX0xUUyxcbiAgICBCUk9XU0VSU1RBQ0tfTFRTX1NFU1NJT05fSUQsXG4gICAgVEVTVE9QU19TQ1JFRU5TSE9UX0VOVixcbiAgICBCUk9XU0VSU1RBQ0tfVEVTVEhVQl9VVUlELFxuICAgIEJST1dTRVJTVEFDS19LSUxMX1NJR05BTCxcbiAgICBQRVJGX01FQVNVUkVNRU5UX0VOVixcbiAgICBSRVJVTl9FTlYsXG4gICAgQlJPV1NFUlNUQUNLX1RFU1RfUExBTl9JRCxcbiAgICBNQVhfR0lUX01FVEFfREFUQV9TSVpFX0lOX0JZVEVTLFxuICAgIEdJVF9NRVRBX0RBVEFfVFJVTkNBVEVELFxuICAgIEFQUF9BTExZX0lTU1VFU19TVU1NQVJZX0VORFBPSU5ULFxuICAgIEFQUF9BTExZX0lTU1VFU19FTkRQT0lOVCxcbiAgICBDTElfREVCVUdfTE9HU19GSUxFLFxuICAgIFdESU9fTkFNSU5HX1BSRUZJWCxcbiAgICBTVE9QX0JVSUxEX01BWF9BVFRFTVBUUyxcbiAgICBTVE9QX0JVSUxEX0FUVEVNUFRfVElNRU9VVF9NUyxcbiAgICBTVE9QX0JVSUxEX1RPVEFMX0JVREdFVF9NUyxcbiAgICBTVE9QX0JVSUxEX0JBQ0tPRkZfQkFTRV9NU1xufSBmcm9tICcuL2NvbnN0YW50cy5qcydcbmltcG9ydCBDcmFzaFJlcG9ydGVyIGZyb20gJy4vY3Jhc2gtcmVwb3J0ZXIuanMnXG5pbXBvcnQgeyBCU3RhY2tMb2dnZXIgfSBmcm9tICcuL2JzdGFja0xvZ2dlci5qcydcbmltcG9ydCB7IGNvbGxlY3RDb25maWdGaWxlc0ZvclVwbG9hZCwgZGVkdXBlRW50cnlOYW1lLCBmaW5kUGFja2FnZUpzb25Gb3JVcGxvYWQsIGlzQXV0b0NhcHR1cmVMb2dzRGlzYWJsZWQsIHJlZGFjdFNlbnNpdGl2ZUNvbnRlbnQsIHJlbGF0aXZlRGlyVG9Dd2QgfSBmcm9tICcuL2NvbmZpZ0NhcHR1cmUuanMnXG5pbXBvcnQgVXNhZ2VTdGF0cyBmcm9tICcuL3Rlc3RPcHMvdXNhZ2VTdGF0cy5qcydcbmltcG9ydCBUZXN0T3BzQ29uZmlnIGZyb20gJy4vdGVzdE9wcy90ZXN0T3BzQ29uZmlnLmpzJ1xuaW1wb3J0IHR5cGUgeyBTdGFydEJpblNlc3Npb25SZXNwb25zZSB9IGZyb20gJy4vZ3JwYy9pbmRleC5qcydcbmltcG9ydCBBUElVdGlscyBmcm9tICcuL2NsaS9hcGlVdGlscy5qcydcbmltcG9ydCB7IGNyZWF0ZSB9IGZyb20gJ3RhcidcblxuaW1wb3J0IEFjY2Vzc2liaWxpdHlTY3JpcHRzIGZyb20gJy4vc2NyaXB0cy9hY2Nlc3NpYmlsaXR5LXNjcmlwdHMuanMnXG5cbmltcG9ydCB7IF9mZXRjaCBhcyBmZXRjaCB9IGZyb20gJy4vZmV0Y2hXcmFwcGVyLmpzJ1xuXG5jb25zdCBwR2l0Y29uZmlnID0gcHJvbWlzaWZ5KGdpdGNvbmZpZylcblxuZXhwb3J0IHR5cGUgR2l0TWV0YURhdGEgPSB7XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIHNoYTogc3RyaW5nO1xuICAgIHNob3J0X3NoYTogc3RyaW5nO1xuICAgIGJyYW5jaDogc3RyaW5nO1xuICAgIHRhZzogc3RyaW5nIHwgbnVsbDtcbiAgICBjb21taXR0ZXI6IHN0cmluZztcbiAgICBjb21taXR0ZXJfZGF0ZTogc3RyaW5nO1xuICAgIGF1dGhvcjogc3RyaW5nO1xuICAgIGF1dGhvcl9kYXRlOiBzdHJpbmc7XG4gICAgY29tbWl0X21lc3NhZ2U6IHN0cmluZztcbiAgICByb290OiBzdHJpbmc7XG4gICAgY29tbW9uX2dpdF9kaXI6IHN0cmluZztcbiAgICB3b3JrdHJlZV9naXRfZGlyOiBzdHJpbmc7XG4gICAgbGFzdF90YWc6IHN0cmluZyB8IG51bGw7XG4gICAgY29tbWl0c19zaW5jZV9sYXN0X3RhZzogbnVtYmVyO1xuICAgIHJlbW90ZXM6IEFycmF5PHsgbmFtZTogc3RyaW5nOyB1cmw6IHN0cmluZyB9Pjtcbn1cblxuZXhwb3J0IGNvbnN0IERFRkFVTFRfUkVRVUVTVF9DT05GSUcgPSB7XG4gICAgaGVhZGVyczoge1xuICAgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICAnWC1CU1RBQ0stT0JTJzogJ3RydWUnXG4gICAgfSxcbn1cblxuZXhwb3J0IGNvbnN0IENPTE9SUzogUmVjb3JkPHN0cmluZywgQ29sb3JOYW1lPiA9IHtcbiAgICBlcnJvcjogJ3JlZCcsXG4gICAgd2FybjogJ3llbGxvdycsXG4gICAgaW5mbzogJ2N5YW5CcmlnaHQnLFxuICAgIGRlYnVnOiAnZ3JlZW4nLFxuICAgIHRyYWNlOiAnY3lhbicsXG4gICAgcHJvZ3Jlc3M6ICdtYWdlbnRhJ1xufVxuXG4vKipcbiAqIGdldCBicm93c2VyIGRlc2NyaXB0aW9uIGZvciBCcm93c2Vyc3RhY2sgc2VydmljZVxuICogQHBhcmFtIGNhcCBicm93c2VyIGNhcGFibGl0aWVzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRCcm93c2VyRGVzY3JpcHRpb24oY2FwOiBXZWJkcml2ZXJJTy5DYXBhYmlsaXRpZXMpIHtcbiAgICBjYXAgPSBjYXAgfHwge31cbiAgICBpZiAoY2FwWydic3RhY2s6b3B0aW9ucyddKSB7XG4gICAgICAgIGNhcCA9IHsgLi4uY2FwLCAuLi5jYXBbJ2JzdGFjazpvcHRpb25zJ10gfSBhcyBXZWJkcml2ZXJJTy5DYXBhYmlsaXRpZXNcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGVzZSBrZXlzIGRlc2NyaWJlIHRoZSBicm93c2VyIHRoZSB0ZXN0IHdhcyBydW4gb25cbiAgICAgKi9cbiAgICByZXR1cm4gQlJPV1NFUl9ERVNDUklQVElPTlxuICAgICAgICAubWFwKChrKSA9PiAoY2FwKVtrIGFzIGtleW9mIHR5cGVvZiBjYXBdKVxuICAgICAgICAuZmlsdGVyKEJvb2xlYW4pXG4gICAgICAgIC5qb2luKCcgJylcbn1cblxuLyoqXG4gKiBnZXQgY29ycmVjdCBicm93c2VyIGNhcGFiaWxpdGllcyBvYmplY3QgaW4gYm90aCBtdWx0aXJlbW90ZSBhbmQgbm9ybWFsIHNldHVwc1xuICogQHBhcmFtIGJyb3dzZXIgYnJvd3NlciBvYmplY3RcbiAqIEBwYXJhbSBjYXBzIGJyb3dzZXIgY2FwYmlsaXRpZXMgb2JqZWN0LiBJbiBjYXNlIG9mIG11bHRpcmVtb3RlLCB0aGUgb2JqZWN0IGl0c2VsZiBzaG91bGQgaGF2ZSBhIHByb3BlcnR5IG5hbWVkICdjYXBhYmlsaXRpZXMnXG4gKiBAcGFyYW0gYnJvd3Nlck5hbWUgYnJvd3NlciBuYW1lIGluIGNhc2Ugb2YgbXVsdGlyZW1vdGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEJyb3dzZXJDYXBhYmlsaXRpZXMoYnJvd3NlcjogV2ViZHJpdmVySU8uQnJvd3NlciB8IFdlYmRyaXZlcklPLk11bHRpUmVtb3RlQnJvd3NlciwgY2Fwcz86IENhcGFiaWxpdGllcy5SZXNvbHZlZFRlc3RydW5uZXJDYXBhYmlsaXRpZXMsIGJyb3dzZXJOYW1lPzogc3RyaW5nKSB7XG4gICAgaWYgKCFicm93c2VyLmlzTXVsdGlyZW1vdGUpIHtcbiAgICAgICAgcmV0dXJuIHsgLi4uYnJvd3Nlci5jYXBhYmlsaXRpZXMsIC4uLmNhcHMgfSBhcyBXZWJkcml2ZXJJTy5DYXBhYmlsaXRpZXNcbiAgICB9XG5cbiAgICBjb25zdCBtdWx0aUNhcHMgPSBjYXBzIGFzIENhcGFiaWxpdGllcy5SZXF1ZXN0ZWRNdWx0aXJlbW90ZUNhcGFiaWxpdGllc1xuICAgIGNvbnN0IGdsb2JhbENhcCA9IGJyb3dzZXJOYW1lICYmIGJyb3dzZXIuZ2V0SW5zdGFuY2UoYnJvd3Nlck5hbWUpID8gYnJvd3Nlci5nZXRJbnN0YW5jZShicm93c2VyTmFtZSkuY2FwYWJpbGl0aWVzIDoge31cbiAgICBjb25zdCBjYXAgPSBicm93c2VyTmFtZSAmJiBtdWx0aUNhcHNbYnJvd3Nlck5hbWVdID8gbXVsdGlDYXBzW2Jyb3dzZXJOYW1lXS5jYXBhYmlsaXRpZXMgOiB7fVxuICAgIHJldHVybiB7IC4uLmdsb2JhbENhcCwgLi4uY2FwIH0gYXMgV2ViZHJpdmVySU8uQ2FwYWJpbGl0aWVzXG59XG5cbi8qKlxuICogY2hlY2sgZm9yIGJyb3dzZXJzdGFjayBXM0MgY2FwYWJpbGl0aWVzLiBEb2VzIG5vdCBzdXBwb3J0IGxlZ2FjeSBjYXBhYmlsaXRpZXNcbiAqIEBwYXJhbSBjYXAgYnJvd3NlciBjYXBhYmlsaXRpZXNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzQnJvd3NlcnN0YWNrQ2FwYWJpbGl0eShjYXA/OiBXZWJkcml2ZXJJTy5DYXBhYmlsaXRpZXMpIHtcbiAgICByZXR1cm4gQm9vbGVhbihcbiAgICAgICAgY2FwICYmXG4gICAgICAgICAgICBjYXBbJ2JzdGFjazpvcHRpb25zJ10gJiZcbiAgICAgICAgICAgIC8vIHJldHVybiBmYWxzZSBpZiB0aGUgb25seSBjYXAgaW4gYnN0YWNrOm9wdGlvbnMgaXMgd2Rpb1NlcnZpY2UsXG4gICAgICAgICAgICAvLyBhcyB0aGF0IGlzIGFkZGVkIGJ5IHRoZSBzZXJ2aWNlIGFuZCBub3QgcHJlc2VudCBpbiB1c2VyIHBhc3NlZCBjYXBzXG4gICAgICAgICAgICAhKFxuICAgICAgICAgICAgICAgIE9iamVjdC5rZXlzKGNhcFsnYnN0YWNrOm9wdGlvbnMnXSkubGVuZ3RoID09PSAxICYmXG4gICAgICAgICAgICAgICAgY2FwWydic3RhY2s6b3B0aW9ucyddLndkaW9TZXJ2aWNlXG4gICAgICAgICAgICApXG4gICAgKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0UGFyZW50U3VpdGVOYW1lKGZ1bGxUaXRsZTogc3RyaW5nLCB0ZXN0U3VpdGVUaXRsZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBmdWxsVGl0bGVXb3JkcyA9IGZ1bGxUaXRsZS5zcGxpdCgnICcpXG4gICAgY29uc3QgdGVzdFN1aXRlVGl0bGVXb3JkcyA9IHRlc3RTdWl0ZVRpdGxlLnNwbGl0KCcgJylcbiAgICBjb25zdCBzaG9ydGVzdExlbmd0aCA9IE1hdGgubWluKGZ1bGxUaXRsZVdvcmRzLmxlbmd0aCwgdGVzdFN1aXRlVGl0bGVXb3Jkcy5sZW5ndGgpXG4gICAgbGV0IGMgPSAwXG4gICAgbGV0IHBhcmVudFN1aXRlTmFtZSA9ICcnXG4gICAgd2hpbGUgKGMgPCBzaG9ydGVzdExlbmd0aCAmJiBmdWxsVGl0bGVXb3Jkc1tjXSA9PT0gdGVzdFN1aXRlVGl0bGVXb3Jkc1tjXSkge1xuICAgICAgICBwYXJlbnRTdWl0ZU5hbWUgKz0gZnVsbFRpdGxlV29yZHNbYysrXSArICcgJ1xuICAgIH1cbiAgICByZXR1cm4gcGFyZW50U3VpdGVOYW1lLnRyaW0oKVxufVxuXG5mdW5jdGlvbiBwcm9jZXNzRXJyb3IoZXJyb3I6IEVycm9yLCBmbjogRnVuY3Rpb24sIGFyZ3M6IHVua25vd25bXSkge1xuICAgIEJTdGFja0xvZ2dlci5lcnJvcihgRXJyb3IgaW4gZXhlY3V0aW5nICR7Zm4ubmFtZX0gd2l0aCBhcmdzICR7YXJnc306ICR7ZXJyb3J9YClcbiAgICBsZXQgYXJnc1N0cmluZzogc3RyaW5nXG4gICAgdHJ5IHtcbiAgICAgICAgYXJnc1N0cmluZyA9IEpTT04uc3RyaW5naWZ5KGFyZ3MpXG4gICAgfSBjYXRjaCB7XG4gICAgICAgIGFyZ3NTdHJpbmcgPSB1dGlsLmluc3BlY3QoYXJncywgeyBkZXB0aDogMiB9KVxuICAgIH1cbiAgICBDcmFzaFJlcG9ydGVyLnVwbG9hZENyYXNoUmVwb3J0KGBFcnJvciBpbiBleGVjdXRpbmcgJHtmbi5uYW1lfSB3aXRoIGFyZ3MgJHthcmdzU3RyaW5nfSA6ICR7ZXJyb3J9YCwgZXJyb3IgJiYgZXJyb3Iuc3RhY2sgfHwgJ3Vua25vd24gZXJyb3InKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gbzExeUVycm9ySGFuZGxlcihmbjogRnVuY3Rpb24pIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKC4uLmFyZ3M6IHVua25vd25bXSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgbGV0IGZ1bmN0aW9uVG9IYW5kbGUgPSBmblxuICAgICAgICAgICAgaWYgKHByb2Nlc3MuZW52W1BFUkZfTUVBU1VSRU1FTlRfRU5WXSkge1xuICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICAgICAgICAgICAgZnVuY3Rpb25Ub0hhbmRsZSA9IHBlcmZvcm1hbmNlLnRpbWVyaWZ5KGZ1bmN0aW9uVG9IYW5kbGUgYXMgYW55KVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gZnVuY3Rpb25Ub0hhbmRsZSguLi5hcmdzKVxuICAgICAgICAgICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIFByb21pc2UpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0LmNhdGNoKGVycm9yID0+IHByb2Nlc3NFcnJvcihlcnJvciwgZm4sIGFyZ3MpKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdFxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgcHJvY2Vzc0Vycm9yKGVycm9yIGFzIEVycm9yLCBmbiwgYXJncylcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGVycm9ySGFuZGxlcihmbjogRnVuY3Rpb24pIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKC4uLmFyZ3M6IHVua25vd25bXSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgZnVuY3Rpb25Ub0hhbmRsZSA9IGZuXG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBmdW5jdGlvblRvSGFuZGxlKC4uLmFyZ3MpXG4gICAgICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQuY2F0Y2goZXJyb3IgPT4gQlN0YWNrTG9nZ2VyLmVycm9yKGBFcnJvciBpbiBleGVjdXRpbmcgJHtmbi5uYW1lfSB3aXRoIGFyZ3MgJHthcmdzfTogJHtlcnJvcn1gKSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXN1bHRcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIEJTdGFja0xvZ2dlci5lcnJvcihgRXJyb3IgaW4gZXhlY3V0aW5nICR7Zm4ubmFtZX0gd2l0aCBhcmdzICR7YXJnc306ICR7ZXJyb3J9YClcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIG5vZGVSZXF1ZXN0KHJlcXVlc3RUeXBlOiBzdHJpbmcsIGFwaUVuZHBvaW50OiBzdHJpbmcsIG9wdGlvbnM6IFJlcXVlc3RJbml0LCBhcGlVcmw6IHN0cmluZywgdGltZW91dDogbnVtYmVyID0gMTIwMDAwKSB7XG4gICAgdHJ5IHtcblxuICAgICAgICBjb25zdCBjb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpXG4gICAgICAgIGNvbnN0IHRpbWVvdXRJZCA9IHNldFRpbWVvdXQoKCkgPT4gY29udHJvbGxlci5hYm9ydCgpLCB0aW1lb3V0KVxuXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goYCR7YXBpVXJsfS8ke2FwaUVuZHBvaW50fWAsIHtcbiAgICAgICAgICAgIG1ldGhvZDogcmVxdWVzdFR5cGUsXG4gICAgICAgICAgICBzaWduYWw6IGNvbnRyb2xsZXIuc2lnbmFsLFxuICAgICAgICAgICAgLi4ub3B0aW9uc1xuICAgICAgICB9KVxuXG4gICAgICAgIC8vIENsZWFyIHRoZSB0aW1lb3V0IGFzIHRoZSByZXF1ZXN0IGNvbXBsZXRlZCBzdWNjZXNzZnVsbHlcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXRJZClcblxuICAgICAgICByZXR1cm4gYXdhaXQgcmVzcG9uc2UuanNvbigpXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICAgIEJTdGFja0xvZ2dlci5kZWJ1ZyhgRXJyb3IgaW4gZmlyaW5nIHJlcXVlc3QgJHthcGlVcmx9LyR7YXBpRW5kcG9pbnR9OiAke2Zvcm1hdChlcnJvcil9YClcbiAgICAgICAgY29uc3QgaXNMb2dVcGxvYWQgPSBhcGlFbmRwb2ludCA9PT0gVVBMT0FEX0xPR1NfRU5EUE9JTlRcbiAgICAgICAgaWYgKGVycm9yICYmIGVycm9yLnJlc3BvbnNlKSB7XG4gICAgICAgICAgICBjb25zdCBlcnJvck1lc3NhZ2VKc29uID0gZXJyb3IucmVzcG9uc2UuYm9keSA/IEpTT04ucGFyc2UoZXJyb3IucmVzcG9uc2UuYm9keS50b1N0cmluZygpKSA6IG51bGxcbiAgICAgICAgICAgIGNvbnN0IGVycm9yTWVzc2FnZSA9IGVycm9yTWVzc2FnZUpzb24gPyBlcnJvck1lc3NhZ2VKc29uLm1lc3NhZ2UgOiBudWxsXG4gICAgICAgICAgICBpZiAoZXJyb3JNZXNzYWdlKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbWVzc2FnZSA9IGAke2Vycm9yTWVzc2FnZX0gLSAke2Vycm9yLnN0YWNrfWBcbiAgICAgICAgICAgICAgICBpZiAoaXNMb2dVcGxvYWQpIHtcbiAgICAgICAgICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLmRlYnVnKG1lc3NhZ2UpXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLmVycm9yKG1lc3NhZ2UpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoaXNMb2dVcGxvYWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRocm93IGVycm9yXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoaXNMb2dVcGxvYWQpIHtcbiAgICAgICAgICAgICAgICBCU3RhY2tMb2dnZXIuZGVidWcoYEZhaWxlZCB0byBmaXJlIGFwaSByZXF1ZXN0IGR1ZSB0byAke2Vycm9yfSAtICR7ZXJyb3Iuc3RhY2t9YClcbiAgICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIEJTdGFja0xvZ2dlci5kZWJ1ZyhgRmFpbGVkIHRvIGZpcmUgYXBpIHJlcXVlc3QgZHVlIHRvICR7ZXJyb3J9IC0gJHtlcnJvci5zdGFja31gKVxuICAgICAgICAgICAgdGhyb3cgZXJyb3JcbiAgICAgICAgfVxuICAgIH1cbn1cblxuLy8gaHR0cHM6Ly90dWdheWlsaWsubWVkaXVtLmNvbS9lcnJvci1oYW5kbGluZy12aWEtdHJ5LWNhdGNoLXByb3h5LWluLWphdmFzY3JpcHQtNTQxMTZkYmY3ODNmXG4vKlxuICAgIEEgY2xhc3Mgd3JhcHBlciBmb3IgZXJyb3IgaGFuZGxpbmcuIFRoZSB3cmFwcGVyIHdyYXBzIGFsbCB0aGUgbWV0aG9kcyBvZiB0aGUgY2xhc3Mgd2l0aCBhIGVycm9yIGhhbmRsZXIgZnVuY3Rpb24uXG4gICAgSWYgYW55IGV4Y2VwdGlvbiBvY2N1cnMgaW4gYW55IG9mIHRoZSBjbGFzcyBtZXRob2QsIHRoYXQgd2lsbCBnZXQgY2F1Z2h0IGluIHRoZSB3cmFwcGVyIHdoaWNoIGxvZ3MgYW5kIHJlcG9ydHMgdGhlIGVycm9yLlxuICovXG50eXBlIENsYXNzVHlwZSA9IHsgbmV3KC4uLmFyZ3M6IHVua25vd25bXSk6IHVua25vd247IH0gLy8gQSBnZW5lcmljIHR5cGUgZm9yIGEgY2xhc3NcbmV4cG9ydCBmdW5jdGlvbiBvMTF5Q2xhc3NFcnJvckhhbmRsZXI8VCBleHRlbmRzIENsYXNzVHlwZT4oZXJyb3JDbGFzczogVCk6IFQge1xuICAgIGNvbnN0IHByb3RvdHlwZSA9IGVycm9yQ2xhc3MucHJvdG90eXBlXG5cbiAgICBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMocHJvdG90eXBlKS5sZW5ndGggPCAyKSB7XG4gICAgICAgIHJldHVybiBlcnJvckNsYXNzXG4gICAgfVxuXG4gICAgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMocHJvdG90eXBlKS5mb3JFYWNoKChtZXRob2ROYW1lKSA9PiB7XG4gICAgICAgIGNvbnN0IG1ldGhvZCA9IHByb3RvdHlwZVttZXRob2ROYW1lXVxuICAgICAgICBpZiAodHlwZW9mIG1ldGhvZCA9PT0gJ2Z1bmN0aW9uJyAmJiBtZXRob2ROYW1lICE9PSAnY29uc3RydWN0b3InICYmIG1ldGhvZE5hbWUgIT09ICdjb21tYW5kV3JhcHBlcicpIHtcbiAgICAgICAgICAgIC8vIEluIG9yZGVyIHRvIHByZXNlcnZlIHRoaXMgY29udGV4dCwgbmVlZCB0byBkZWZpbmUgbGlrZSB0aGlzXG4gICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkocHJvdG90eXBlLCBtZXRob2ROYW1lLCB7XG4gICAgICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uKC4uLmFyZ3M6IHVua25vd25bXSkge1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gKHByb2Nlc3MuZW52W1BFUkZfTUVBU1VSRU1FTlRfRU5WXSA/IHBlcmZvcm1hbmNlLnRpbWVyaWZ5KG1ldGhvZCkgOiBtZXRob2QpLmNhbGwodGhpcywgLi4uYXJncylcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC5jYXRjaChlcnJvciA9PiBwcm9jZXNzRXJyb3IoZXJyb3IsIG1ldGhvZCwgYXJncykpXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0XG5cbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzRXJyb3IoZXJyIGFzIEVycm9yLCBtZXRob2QsIGFyZ3MpXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgfSlcblxuICAgIHJldHVybiBlcnJvckNsYXNzXG59XG5cbmV4cG9ydCBjb25zdCBwcm9jZXNzVGVzdE9ic2VydmFiaWxpdHlSZXNwb25zZSA9IChyZXNwb25zZTogTGF1bmNoUmVzcG9uc2UpID0+IHtcbiAgICBpZiAoIXJlc3BvbnNlLm9ic2VydmFiaWxpdHkpIHtcbiAgICAgICAgaGFuZGxlRXJyb3JGb3JPYnNlcnZhYmlsaXR5KG51bGwpXG4gICAgICAgIHJldHVyblxuICAgIH1cbiAgICBpZiAoIXJlc3BvbnNlLm9ic2VydmFiaWxpdHkuc3VjY2Vzcykge1xuICAgICAgICBoYW5kbGVFcnJvckZvck9ic2VydmFiaWxpdHkocmVzcG9uc2Uub2JzZXJ2YWJpbGl0eSBhcyBFcnJvcnMpXG4gICAgICAgIHJldHVyblxuICAgIH1cbiAgICBwcm9jZXNzLmVudltCUk9XU0VSU1RBQ0tfT0JTRVJWQUJJTElUWV0gPSAndHJ1ZSdcbiAgICBpZiAocmVzcG9uc2Uub2JzZXJ2YWJpbGl0eS5vcHRpb25zLmFsbG93X3NjcmVlbnNob3RzKSB7XG4gICAgICAgIHByb2Nlc3MuZW52W1RFU1RPUFNfU0NSRUVOU0hPVF9FTlZdID0gcmVzcG9uc2Uub2JzZXJ2YWJpbGl0eS5vcHRpb25zLmFsbG93X3NjcmVlbnNob3RzLnRvU3RyaW5nKClcbiAgICB9XG59XG5cbmludGVyZmFjZSBEYXRhRWxlbWVudCB7XG4gICAgW2tleTogc3RyaW5nXTogdW5rbm93blxufVxuXG5leHBvcnQgY29uc3QganNvbmlmeUFjY2Vzc2liaWxpdHlBcnJheSA9IChcbiAgICBkYXRhQXJyYXk6IERhdGFFbGVtZW50W10sXG4gICAga2V5TmFtZToga2V5b2YgRGF0YUVsZW1lbnQsXG4gICAgdmFsdWVOYW1lOiBrZXlvZiBEYXRhRWxlbWVudFxuKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPT4ge1xuICAgIGNvbnN0IHJlc3VsdDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fVxuICAgIGRhdGFBcnJheS5mb3JFYWNoKChlbGVtZW50OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikgPT4ge1xuICAgICAgICByZXN1bHRbZWxlbWVudFtrZXlOYW1lXSBhcyBzdHJpbmddID0gZWxlbWVudFt2YWx1ZU5hbWVdXG4gICAgfSlcbiAgICByZXR1cm4gcmVzdWx0XG59XG5cbmV4cG9ydCBjb25zdCBwcm9jZXNzQWNjZXNzaWJpbGl0eVJlc3BvbnNlID0gKHJlc3BvbnNlOiBMYXVuY2hSZXNwb25zZSB8IFN0YXJ0QmluU2Vzc2lvblJlc3BvbnNlLCBvcHRpb25zOiBCcm93c2Vyc3RhY2tDb25maWcgJiBPcHRpb25zLlRlc3RydW5uZXIpID0+IHtcbiAgICBpZiAoIXJlc3BvbnNlLmFjY2Vzc2liaWxpdHkpIHtcbiAgICAgICAgaWYgKG9wdGlvbnMuYWNjZXNzaWJpbGl0eSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgaGFuZGxlRXJyb3JGb3JBY2Nlc3NpYmlsaXR5KG51bGwpXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGlmICghcmVzcG9uc2UuYWNjZXNzaWJpbGl0eS5zdWNjZXNzKSB7XG4gICAgICAgIGhhbmRsZUVycm9yRm9yQWNjZXNzaWJpbGl0eShyZXNwb25zZS5hY2Nlc3NpYmlsaXR5IGFzIEVycm9ycylcbiAgICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKHJlc3BvbnNlLmFjY2Vzc2liaWxpdHkub3B0aW9ucykge1xuICAgICAgICBjb25zdCB7IGFjY2Vzc2liaWxpdHlUb2tlbiwgcG9sbGluZ1RpbWVvdXQsIHNjYW5uZXJWZXJzaW9uIH0gPSBqc29uaWZ5QWNjZXNzaWJpbGl0eUFycmF5KHJlc3BvbnNlLmFjY2Vzc2liaWxpdHkub3B0aW9ucy5jYXBhYmlsaXRpZXMgYXMgQXJyYXk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+LCAnbmFtZScsICd2YWx1ZScpXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGpzb25pZnlBY2Nlc3NpYmlsaXR5QXJyYXkocmVzcG9uc2UuYWNjZXNzaWJpbGl0eS5vcHRpb25zLmNhcGFiaWxpdGllcyBhcyBBcnJheTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4sICduYW1lJywgJ3ZhbHVlJylcbiAgICAgICAgY29uc3Qgc2NyaXB0c0pzb24gPSB7XG4gICAgICAgICAgICAnc2NyaXB0cyc6IGpzb25pZnlBY2Nlc3NpYmlsaXR5QXJyYXkocmVzcG9uc2UuYWNjZXNzaWJpbGl0eS5vcHRpb25zLnNjcmlwdHMgYXMgQXJyYXk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+LCAnbmFtZScsICdjb21tYW5kJyksXG4gICAgICAgICAgICAnY29tbWFuZHMnOiByZXNwb25zZS5hY2Nlc3NpYmlsaXR5Lm9wdGlvbnMuY29tbWFuZHNUb1dyYXA/LmNvbW1hbmRzID8/IFtdLFxuICAgICAgICAgICAgJ25vbkJTdGFja0luZnJhQTExeUNocm9tZU9wdGlvbnMnOiByZXN1bHRbJ2dvb2c6Y2hyb21lT3B0aW9ucyddXG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNjYW5uZXJWZXJzaW9uKSB7XG4gICAgICAgICAgICBwcm9jZXNzLmVudi5CU1RBQ0tfQTExWV9TQ0FOTkVSX1ZFUlNJT04gPSBzY2FubmVyVmVyc2lvbiBhcyBzdHJpbmdcbiAgICAgICAgICAgIEJTdGFja0xvZ2dlci5kZWJ1ZyhgQWNjZXNzaWJpbGl0eSBzY2FubmVyVmVyc2lvbiAke3NjYW5uZXJWZXJzaW9ufWApXG4gICAgICAgIH1cbiAgICAgICAgaWYgKGFjY2Vzc2liaWxpdHlUb2tlbikge1xuICAgICAgICAgICAgcHJvY2Vzcy5lbnYuQlNUQUNLX0ExMVlfSldUID0gYWNjZXNzaWJpbGl0eVRva2VuIGFzIHN0cmluZ1xuICAgICAgICAgICAgcHJvY2Vzcy5lbnZbQlJPV1NFUlNUQUNLX0FDQ0VTU0lCSUxJVFldID0gJ3RydWUnXG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBvbGxpbmdUaW1lb3V0KSB7XG4gICAgICAgICAgICBwcm9jZXNzLmVudi5CU1RBQ0tfQTExWV9QT0xMSU5HX1RJTUVPVVQgPSBwb2xsaW5nVGltZW91dCBhcyBzdHJpbmdcbiAgICAgICAgfVxuICAgICAgICBpZiAoc2NyaXB0c0pzb24pIHtcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgZml4IHR5cGVcbiAgICAgICAgICAgIEFjY2Vzc2liaWxpdHlTY3JpcHRzLnVwZGF0ZShzY3JpcHRzSnNvbilcbiAgICAgICAgICAgIEFjY2Vzc2liaWxpdHlTY3JpcHRzLnN0b3JlKClcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZXhwb3J0IGNvbnN0IHByb2Nlc3NMYXVuY2hCdWlsZFJlc3BvbnNlID0gKHJlc3BvbnNlOiBMYXVuY2hSZXNwb25zZSwgb3B0aW9uczogQnJvd3NlcnN0YWNrQ29uZmlnICYgT3B0aW9ucy5UZXN0cnVubmVyKSA9PiB7XG4gICAgaWYgKG9wdGlvbnMudGVzdE9ic2VydmFiaWxpdHkpIHtcbiAgICAgICAgcHJvY2Vzc1Rlc3RPYnNlcnZhYmlsaXR5UmVzcG9uc2UocmVzcG9uc2UpXG4gICAgfVxuICAgIHByb2Nlc3NBY2Nlc3NpYmlsaXR5UmVzcG9uc2UocmVzcG9uc2UsIG9wdGlvbnMpXG59XG5cbmV4cG9ydCBjb25zdCBsYXVuY2hUZXN0U2Vzc2lvbiA9IFBlcmZvcm1hbmNlVGVzdGVyLm1lYXN1cmVXcmFwcGVyKFBFUkZPUk1BTkNFX1NES19FVkVOVFMuVEVTVEhVQl9FVkVOVFMuU1RBUlQsIG8xMXlFcnJvckhhbmRsZXIoYXN5bmMgZnVuY3Rpb24gbGF1bmNoVGVzdFNlc3Npb24ob3B0aW9uczogQnJvd3NlcnN0YWNrQ29uZmlnICYgT3B0aW9ucy5UZXN0cnVubmVyLCBjb25maWc6IE9wdGlvbnMuVGVzdHJ1bm5lciwgYnNDb25maWc6IFVzZXJDb25maWcsIGJTdGFja0NvbmZpZzogQnJvd3NlclN0YWNrQ29uZmlnLCBhY2Nlc3NpYmlsaXR5QXV0b21hdGlvbj86IGJvb2xlYW4pIHtcbiAgICBjb25zdCBsYXVuY2hCdWlsZFVzYWdlID0gVXNhZ2VTdGF0cy5nZXRJbnN0YW5jZSgpLmxhdW5jaEJ1aWxkVXNhZ2VcbiAgICBsYXVuY2hCdWlsZFVzYWdlLnRyaWdnZXJlZCgpXG5cbiAgICBjb25zdCBkYXRhID0ge1xuICAgICAgICBmb3JtYXQ6ICdqc29uJyxcbiAgICAgICAgcHJvamVjdF9uYW1lOiBnZXRPYnNlcnZhYmlsaXR5UHJvamVjdChvcHRpb25zLCBic0NvbmZpZy5wcm9qZWN0TmFtZSksXG4gICAgICAgIG5hbWU6IGdldE9ic2VydmFiaWxpdHlCdWlsZChvcHRpb25zLCBic0NvbmZpZy5idWlsZE5hbWUpLFxuICAgICAgICBidWlsZF9pZGVudGlmaWVyOiBic0NvbmZpZy5idWlsZElkZW50aWZpZXIsXG4gICAgICAgIHN0YXJ0ZWRfYXQ6IChuZXcgRGF0ZSgpKS50b0lTT1N0cmluZygpLFxuICAgICAgICB0YWdzOiBnZXRPYnNlcnZhYmlsaXR5QnVpbGRUYWdzKG9wdGlvbnMsIGJzQ29uZmlnLmJ1aWxkVGFnKSxcbiAgICAgICAgaG9zdF9pbmZvOiB7XG4gICAgICAgICAgICBob3N0bmFtZTogaG9zdG5hbWUoKSxcbiAgICAgICAgICAgIHBsYXRmb3JtOiBwbGF0Zm9ybSgpLFxuICAgICAgICAgICAgdHlwZTogdHlwZSgpLFxuICAgICAgICAgICAgdmVyc2lvbjogdmVyc2lvbigpLFxuICAgICAgICAgICAgYXJjaDogYXJjaCgpXG4gICAgICAgIH0sXG4gICAgICAgIGNpX2luZm86IGdldENpSW5mbygpLFxuICAgICAgICBidWlsZF9ydW5faWRlbnRpZmllcjogcHJvY2Vzcy5lbnYuQlJPV1NFUlNUQUNLX0JVSUxEX1JVTl9JREVOVElGSUVSLFxuICAgICAgICBmYWlsZWRfdGVzdHNfcmVydW46IHByb2Nlc3MuZW52W1JFUlVOX0VOVl0gfHwgZmFsc2UsXG4gICAgICAgIHZlcnNpb25fY29udHJvbDogYXdhaXQgZ2V0R2l0TWV0YURhdGEoKSxcbiAgICAgICAgYWNjZXNzaWJpbGl0eToge1xuICAgICAgICAgICAgc2V0dGluZ3M6IG9wdGlvbnMuYWNjZXNzaWJpbGl0eU9wdGlvbnNcbiAgICAgICAgfSxcbiAgICAgICAgYnJvd3NlcnN0YWNrQXV0b21hdGlvbjogc2hvdWxkQWRkU2VydmljZVZlcnNpb24oY29uZmlnLCBvcHRpb25zLnRlc3RPYnNlcnZhYmlsaXR5KSxcbiAgICAgICAgZnJhbWV3b3JrX2RldGFpbHM6IHtcbiAgICAgICAgICAgIGZyYW1ld29ya05hbWU6IFdESU9fTkFNSU5HX1BSRUZJWCArIGNvbmZpZy5mcmFtZXdvcmssXG4gICAgICAgICAgICBmcmFtZXdvcmtWZXJzaW9uOiBic0NvbmZpZy5ic3RhY2tTZXJ2aWNlVmVyc2lvbixcbiAgICAgICAgICAgIHNka1ZlcnNpb246IGJzQ29uZmlnLmJzdGFja1NlcnZpY2VWZXJzaW9uLFxuICAgICAgICAgICAgbGFuZ3VhZ2U6ICdFQ01BU2NyaXB0JyxcbiAgICAgICAgICAgIHRlc3RGcmFtZXdvcms6IHtcbiAgICAgICAgICAgICAgICBuYW1lOiAnV2ViZHJpdmVySU8nLFxuICAgICAgICAgICAgICAgIHZlcnNpb246IGJzQ29uZmlnLmJzdGFja1NlcnZpY2VWZXJzaW9uXG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHByb2R1Y3RfbWFwOiBnZXRQcm9kdWN0TWFwRm9yQnVpbGRTdGFydENhbGwoYlN0YWNrQ29uZmlnLCBhY2Nlc3NpYmlsaXR5QXV0b21hdGlvbiksXG4gICAgICAgIGNvbmZpZzoge30sXG4gICAgICAgIHRlc3Rfb3JjaGVzdHJhdGlvbjogT3JjaGVzdHJhdGlvblV0aWxzLmdldEluc3RhbmNlKGNvbmZpZyk/LmdldEJ1aWxkU3RhcnREYXRhKCkgfHwge30sXG4gICAgICAgIHRlc3RfbWFuYWdlbWVudDoge1xuICAgICAgICAgICAgdGVzdF9wbGFuX2lkOiBnZXRUZXN0UGxhbklkKG9wdGlvbnMpXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoYWNjZXNzaWJpbGl0eUF1dG9tYXRpb24gJiYgKGlzVHVyYm9TY2FsZShvcHRpb25zKSB8fCBkYXRhLmJyb3dzZXJzdGFja0F1dG9tYXRpb24gPT09IGZhbHNlKSl7XG4gICAgICAgIGRhdGEuYWNjZXNzaWJpbGl0eS5zZXR0aW5ncyA/Pz0ge31cbiAgICAgICAgZGF0YS5hY2Nlc3NpYmlsaXR5LnNldHRpbmdzLmluY2x1ZGVFbmNvZGVkRXh0ZW5zaW9uID0gdHJ1ZVxuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICAgIGlmIChPYmplY3Qua2V5cyhDcmFzaFJlcG9ydGVyLnVzZXJDb25maWdGb3JSZXBvcnRpbmcpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgQ3Jhc2hSZXBvcnRlci51c2VyQ29uZmlnRm9yUmVwb3J0aW5nID0gcHJvY2Vzcy5lbnYuVVNFUl9DT05GSUdfRk9SX1JFUE9SVElORyAhPT0gdW5kZWZpbmVkID8gSlNPTi5wYXJzZShwcm9jZXNzLmVudi5VU0VSX0NPTkZJR19GT1JfUkVQT1JUSU5HKSA6IHt9XG4gICAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICByZXR1cm4gQlN0YWNrTG9nZ2VyLmVycm9yKGBbQ3Jhc2hfUmVwb3J0X1VwbG9hZF0gRmFpbGVkIHRvIHBhcnNlIHVzZXIgY29uZmlnIHdoaWxlIHNlbmRpbmcgYnVpbGQgc3RhcnQgZXZlbnQgZHVlIHRvICR7ZXJyb3J9YClcbiAgICB9XG4gICAgZGF0YS5jb25maWcgPSBDcmFzaFJlcG9ydGVyLnVzZXJDb25maWdGb3JSZXBvcnRpbmdcblxuICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHVybCA9IGAke0FQSVV0aWxzLkRBVEFfRU5EUE9JTlR9L2FwaS92Mi9idWlsZHNgXG4gICAgICAgIGNvbnN0IGVuY29kZWRBdXRoID0gQnVmZmVyLmZyb20oYCR7Z2V0T2JzZXJ2YWJpbGl0eVVzZXIob3B0aW9ucywgY29uZmlnKX06JHtnZXRPYnNlcnZhYmlsaXR5S2V5KG9wdGlvbnMsIGNvbmZpZyl9YCwgJ3V0ZjgnKS50b1N0cmluZygnYmFzZTY0JylcbiAgICAgICAgY29uc3QgaGVhZGVyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAgICAgICAgIC4uLkRFRkFVTFRfUkVRVUVTVF9DT05GSUcuaGVhZGVycyxcbiAgICAgICAgICAgIEF1dGhvcml6YXRpb246IGBCYXNpYyAke2VuY29kZWRBdXRofWAsXG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh1cmwsIHtcbiAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgICAgaGVhZGVycyxcbiAgICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KGRhdGEpXG4gICAgICAgIH0pXG4gICAgICAgIGNvbnN0IGpzb25SZXNwb25zZTogTGF1bmNoUmVzcG9uc2UgPSBhd2FpdCByZXNwb25zZS5qc29uKClcbiAgICAgICAgZGVsZXRlIGRhdGE/LmFjY2Vzc2liaWxpdHk/LnNldHRpbmdzPy5pbmNsdWRlRW5jb2RlZEV4dGVuc2lvblxuICAgICAgICBCU3RhY2tMb2dnZXIuZGVidWcoYFtTdGFydF9CdWlsZF0gU3VjY2VzcyByZXNwb25zZTogJHtKU09OLnN0cmluZ2lmeShqc29uUmVzcG9uc2UpfWApXG4gICAgICAgIEJTdGFja0xvZ2dlci5kZWJ1ZyhgVGVzdCBQbGFuIElkIHNlbnQgaW4gcmVxdWVzdDogJHtnZXRUZXN0UGxhbklkKG9wdGlvbnMpfWApXG4gICAgICAgIHByb2Nlc3MuZW52W1RFU1RPUFNfQlVJTERfQ09NUExFVEVEX0VOVl0gPSAndHJ1ZSdcbiAgICAgICAgaWYgKGpzb25SZXNwb25zZS5qd3QpIHtcbiAgICAgICAgICAgIHByb2Nlc3MuZW52W0JST1dTRVJTVEFDS19URVNUSFVCX0pXVF0gPSBqc29uUmVzcG9uc2Uuand0XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGpzb25SZXNwb25zZS5idWlsZF9oYXNoZWRfaWQpIHtcbiAgICAgICAgICAgIHByb2Nlc3MuZW52W0JST1dTRVJTVEFDS19URVNUSFVCX1VVSURdID0ganNvblJlc3BvbnNlLmJ1aWxkX2hhc2hlZF9pZFxuICAgICAgICAgICAgVGVzdE9wc0NvbmZpZy5nZXRJbnN0YW5jZSgpLmJ1aWxkSGFzaGVkSWQgPSBqc29uUmVzcG9uc2UuYnVpbGRfaGFzaGVkX2lkXG4gICAgICAgICAgICBCU3RhY2tMb2dnZXIuaW5mbyhgVGVzdGh1YiBzdGFydGVkIHdpdGggaWQ6ICR7VGVzdE9wc0NvbmZpZy5nZXRJbnN0YW5jZSgpPy5idWlsZEhhc2hlZElkfWApXG4gICAgICAgIH1cbiAgICAgICAgcHJvY2Vzc0xhdW5jaEJ1aWxkUmVzcG9uc2UoanNvblJlc3BvbnNlLCBvcHRpb25zKVxuICAgICAgICBsYXVuY2hCdWlsZFVzYWdlLnN1Y2Nlc3MoKVxuICAgICAgICByZXR1cm4ganNvblJlc3BvbnNlXG4gICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgICAgQlN0YWNrTG9nZ2VyLmRlYnVnKGBUZXN0SHViIGJ1aWxkIHN0YXJ0IGZhaWxlZDogJHtmb3JtYXQoZXJyb3IpfWApXG4gICAgICAgIGlmICghKGVycm9yIGFzIEVycm9yICYgeyBzdWNjZXNzOiBib29sZWFuIH0pLnN1Y2Nlc3MpIHtcbiAgICAgICAgICAgIGxhdW5jaEJ1aWxkVXNhZ2UuZmFpbGVkKGVycm9yKVxuICAgICAgICAgICAgbG9nQnVpbGRFcnJvcihlcnJvciBhcyBFcnJvcnMpXG4gICAgICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgICB9XG4gICAgfVxufSkpXG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG5leHBvcnQgY29uc3QgdmFsaWRhdGVDYXBzV2l0aEFwcEExMXkgPSAocGxhdGZvcm1NZXRhPzogeyBba2V5OiBzdHJpbmddOiBhbnk7IH0pID0+IHtcbiAgICAvKiBDaGVjayBpZiB0aGUgY3VycmVudCBkcml2ZXIgcGxhdGZvcm0gaXMgZWxpZ2libGUgZm9yIEFwcEFjY2Vzc2liaWxpdHkgc2NhbiAqL1xuICAgIGlmIChcbiAgICAgICAgKHBsYXRmb3JtTWV0YT8ucGxhdGZvcm1fbmFtZSAmJiBTdHJpbmcocGxhdGZvcm1NZXRhPy5wbGF0Zm9ybV9uYW1lKS50b0xvd2VyQ2FzZSgpID09PSAnYW5kcm9pZCcpICYmXG4gICAgICAgIChwbGF0Zm9ybU1ldGE/LnBsYXRmb3JtX3ZlcnNpb24gJiYgcGFyc2VJbnQocGxhdGZvcm1NZXRhPy5wbGF0Zm9ybV92ZXJzaW9uPy50b1N0cmluZygpKSA8IDExKVxuICAgICkge1xuICAgICAgICBCU3RhY2tMb2dnZXIud2FybignQXBwIEFjY2Vzc2liaWxpdHkgQXV0b21hdGlvbiB0ZXN0cyBhcmUgc3VwcG9ydGVkIG9uIE9TIHZlcnNpb24gMTEgYW5kIGFib3ZlIGZvciBBbmRyb2lkIGRldmljZXMuJylcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICAgIHJldHVybiB0cnVlXG59XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG5leHBvcnQgY29uc3QgdmFsaWRhdGVDYXBzV2l0aEExMXkgPSAoZGV2aWNlTmFtZT86IGFueSwgcGxhdGZvcm1NZXRhPzogeyBba2V5OiBzdHJpbmddOiBhbnk7IH0sIGNocm9tZU9wdGlvbnM/OiBhbnkpID0+IHtcbiAgICAvKiBDaGVjayBpZiB0aGUgY3VycmVudCBkcml2ZXIgcGxhdGZvcm0gaXMgZWxpZ2libGUgZm9yIEFjY2Vzc2liaWxpdHkgc2NhbiAqL1xuICAgIHRyeSB7XG4gICAgICAgIGlmIChkZXZpY2VOYW1lKSB7XG4gICAgICAgICAgICBCU3RhY2tMb2dnZXIud2FybignQWNjZXNzaWJpbGl0eSBBdXRvbWF0aW9uIHdpbGwgcnVuIG9ubHkgb24gRGVza3RvcCBicm93c2Vycy4nKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgIH1cblxuICAgICAgICBpZiAocGxhdGZvcm1NZXRhPy5icm93c2VyX25hbWU/LnRvTG93ZXJDYXNlKCkgIT09ICdjaHJvbWUnKSB7XG4gICAgICAgICAgICBCU3RhY2tMb2dnZXIud2FybignQWNjZXNzaWJpbGl0eSBBdXRvbWF0aW9uIHdpbGwgcnVuIG9ubHkgb24gQ2hyb21lIGJyb3dzZXJzLicpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBicm93c2VyVmVyc2lvbiA9IHBsYXRmb3JtTWV0YT8uYnJvd3Nlcl92ZXJzaW9uXG4gICAgICAgIGlmICggIWlzVW5kZWZpbmVkKGJyb3dzZXJWZXJzaW9uKSAmJiAhKGJyb3dzZXJWZXJzaW9uID09PSAnbGF0ZXN0JyB8fCBwYXJzZUZsb2F0KGJyb3dzZXJWZXJzaW9uICsgJycpID4gOTQpKSB7XG4gICAgICAgICAgICBCU3RhY2tMb2dnZXIud2FybignQWNjZXNzaWJpbGl0eSBBdXRvbWF0aW9uIHdpbGwgcnVuIG9ubHkgb24gQ2hyb21lIGJyb3dzZXIgdmVyc2lvbiBncmVhdGVyIHRoYW4gOTQuJylcbiAgICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNocm9tZU9wdGlvbnM/LmFyZ3M/LmluY2x1ZGVzKCctLWhlYWRsZXNzJykpIHtcbiAgICAgICAgICAgIEJTdGFja0xvZ2dlci53YXJuKCdBY2Nlc3NpYmlsaXR5IEF1dG9tYXRpb24gd2lsbCBub3QgcnVuIG9uIGxlZ2FjeSBoZWFkbGVzcyBtb2RlLiBTd2l0Y2ggdG8gbmV3IGhlYWRsZXNzIG1vZGUgb3IgYXZvaWQgdXNpbmcgaGVhZGxlc3MgbW9kZS4nKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBCU3RhY2tMb2dnZXIuZGVidWcoYEV4Y2VwdGlvbiBpbiBjaGVja2luZyBjYXBhYmlsaXRpZXMgY29tcGF0aWJpbGl0eSB3aXRoIEFjY2Vzc2liaWxpdHkuIEVycm9yOiAke2Vycm9yfWApXG4gICAgfVxuICAgIHJldHVybiBmYWxzZVxufVxuXG5leHBvcnQgY29uc3QgdmFsaWRhdGVDYXBzV2l0aE5vbkJzdGFja0ExMXkgPSAoYnJvd3Nlck5hbWU/OiBzdHJpbmcgfCB1bmRlZmluZWQsIGJyb3dzZXJWZXJzaW9uPzpzdHJpbmcgfCB1bmRlZmluZWQgKSAgPT4ge1xuXG4gICAgaWYgKGJyb3dzZXJOYW1lPy50b0xvd2VyQ2FzZSgpICE9PSAnY2hyb21lJykge1xuICAgICAgICBCU3RhY2tMb2dnZXIud2FybignQWNjZXNzaWJpbGl0eSBBdXRvbWF0aW9uIHdpbGwgcnVuIG9ubHkgb24gQ2hyb21lIGJyb3dzZXJzLicpXG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgICBpZiAoIWlzVW5kZWZpbmVkKGJyb3dzZXJWZXJzaW9uKSAmJiAhKGJyb3dzZXJWZXJzaW9uID09PSAnbGF0ZXN0JyB8fCBwYXJzZUZsb2F0KGJyb3dzZXJWZXJzaW9uICsgJycpID4gMTAwKSkge1xuICAgICAgICBCU3RhY2tMb2dnZXIud2FybignQWNjZXNzaWJpbGl0eSBBdXRvbWF0aW9uIHdpbGwgcnVuIG9ubHkgb24gQ2hyb21lIGJyb3dzZXIgdmVyc2lvbiBncmVhdGVyIHRoYW4gMTAwLicpXG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZVxuXG59XG5cbmV4cG9ydCBjb25zdCBzaG91bGRTY2FuVGVzdEZvckFjY2Vzc2liaWxpdHkgPSAoc3VpdGVUaXRsZTogc3RyaW5nIHwgdW5kZWZpbmVkLCB0ZXN0VGl0bGU6IHN0cmluZywgYWNjZXNzaWJpbGl0eU9wdGlvbnM/OiB7IFtrZXk6IHN0cmluZ106IHN0cmluZzsgfSwgd29ybGQ/OiB7IFtrZXk6IHN0cmluZ106IHVua25vd247IH0sIGlzQ3VjdW1iZXI/OiBib29sZWFuICkgPT4ge1xuICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGluY2x1ZGVUYWdzID0gQXJyYXkuaXNBcnJheShhY2Nlc3NpYmlsaXR5T3B0aW9ucz8uaW5jbHVkZVRhZ3NJblRlc3RpbmdTY29wZSkgPyBhY2Nlc3NpYmlsaXR5T3B0aW9ucz8uaW5jbHVkZVRhZ3NJblRlc3RpbmdTY29wZSA6IFtdXG4gICAgICAgIGNvbnN0IGV4Y2x1ZGVUYWdzID0gQXJyYXkuaXNBcnJheShhY2Nlc3NpYmlsaXR5T3B0aW9ucz8uZXhjbHVkZVRhZ3NJblRlc3RpbmdTY29wZSkgPyBhY2Nlc3NpYmlsaXR5T3B0aW9ucz8uZXhjbHVkZVRhZ3NJblRlc3RpbmdTY29wZSA6IFtdXG5cbiAgICAgICAgaWYgKGlzQ3VjdW1iZXIpIHtcbiAgICAgICAgICAgIGNvbnN0IHRhZ3NMaXN0OiBzdHJpbmdbXSA9IFtdXG4gICAgICAgICAgICA7KHdvcmxkPy5waWNrbGUgYXMgeyB0YWdzOiB7IG5hbWU6IHN0cmluZyB9W10gfSk/LnRhZ3MubWFwKCh0YWc6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nOyB9KSA9PiB0YWdzTGlzdC5wdXNoKHRhZy5uYW1lKSlcbiAgICAgICAgICAgIGNvbnN0IGV4Y2x1ZGVkID0gZXhjbHVkZVRhZ3M/LnNvbWUoKGV4Y2x1ZGUpID0+IHRhZ3NMaXN0LmluY2x1ZGVzKGV4Y2x1ZGUpKVxuICAgICAgICAgICAgY29uc3QgaW5jbHVkZWQgPSBpbmNsdWRlVGFncz8ubGVuZ3RoID09PSAwIHx8IGluY2x1ZGVUYWdzPy5zb21lKChpbmNsdWRlKSA9PiB0YWdzTGlzdC5pbmNsdWRlcyhpbmNsdWRlKSlcblxuICAgICAgICAgICAgcmV0dXJuICFleGNsdWRlZCAmJiBpbmNsdWRlZFxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZnVsbFRlc3ROYW1lID0gc3VpdGVUaXRsZSArICcgJyArIHRlc3RUaXRsZVxuICAgICAgICBjb25zdCBleGNsdWRlZCA9IGV4Y2x1ZGVUYWdzPy5zb21lKChleGNsdWRlKSA9PiBmdWxsVGVzdE5hbWUuaW5jbHVkZXMoZXhjbHVkZSkpXG4gICAgICAgIGNvbnN0IGluY2x1ZGVkID0gaW5jbHVkZVRhZ3M/Lmxlbmd0aCA9PT0gMCB8fCBpbmNsdWRlVGFncz8uc29tZSgoaW5jbHVkZSkgPT4gZnVsbFRlc3ROYW1lLmluY2x1ZGVzKGluY2x1ZGUpKVxuXG4gICAgICAgIHJldHVybiAhZXhjbHVkZWQgJiYgaW5jbHVkZWRcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBCU3RhY2tMb2dnZXIuZGVidWcoYEVycm9yIHdoaWxlIHZhbGlkYXRpbmcgdGVzdCBjYXNlIGZvciBhY2Nlc3NpYmlsaXR5IGJlZm9yZSBzY2FubmluZy4gRXJyb3IgOiAke2Vycm9yfWApXG4gICAgfVxuICAgIHJldHVybiBmYWxzZVxufVxuXG5leHBvcnQgY29uc3QgaXNBY2Nlc3NpYmlsaXR5QXV0b21hdGlvblNlc3Npb24gPSAoYWNjZXNzaWJpbGl0eUZsYWc/OiBib29sZWFuIHwgc3RyaW5nIHwgbnVsbCkgPT4ge1xuICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGhhc0ExMXlKd3RUb2tlbiA9IHR5cGVvZiBwcm9jZXNzLmVudi5CU1RBQ0tfQTExWV9KV1QgPT09ICdzdHJpbmcnICYmIHByb2Nlc3MuZW52LkJTVEFDS19BMTFZX0pXVC5sZW5ndGggPiAwICYmIHByb2Nlc3MuZW52LkJTVEFDS19BMTFZX0pXVCAhPT0gJ251bGwnICYmIHByb2Nlc3MuZW52LkJTVEFDS19BMTFZX0pXVCAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAgcmV0dXJuIGFjY2Vzc2liaWxpdHlGbGFnICYmIGhhc0ExMXlKd3RUb2tlblxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIEJTdGFja0xvZ2dlci5kZWJ1ZyhgRXhjZXB0aW9uIGluIHZlcmlmeWluZyB0aGUgQWNjZXNzaWJpbGl0eSBzZXNzaW9uIHdpdGggZXJyb3IgOiAke2Vycm9yfWApXG4gICAgfVxuICAgIHJldHVybiBmYWxzZVxufVxuXG5leHBvcnQgY29uc3QgQVBQX0FVVE9NQVRFX0NBUF9LRVlTID0gWydhcHBpdW06YXBwJywgJ2FwcGl1bTpidW5kbGVJZCcsICdhcHBpdW06YXBwUGFja2FnZScsICdhcHBpdW06YXBwQWN0aXZpdHknXSBhcyBjb25zdFxuXG4vLyBBbiBBcHAgQXV0b21hdGUgc2Vzc2lvbiBpcyBpZGVudGlmaWVkIGJ5IGFuIGFwcCBjYXBhYmlsaXR5IG9uIHRoZSBkcml2ZXIgY2Fwc1xuLy8gKGFwcGl1bTphcHAgLyBhcHBpdW06YnVuZGxlSWQgLyBhcHBpdW06YXBwUGFja2FnZSAvIGFwcGl1bTphcHBBY3Rpdml0eSAvIGFwcGl1bTpvcHRpb25zLmFwcCkuXG4vLyBTaGFyZWQgYnkgY29uZmlnLXRpbWUgZGV0ZWN0aW9uIGFuZCB0aGUgQ0xJIEF1dG9tYXRlL1BlcmN5IG1vZHVsZXMgc28gQXBwLUF1dG9tYXRlXG4vLyBlbmRwb2ludCByb3V0aW5nIHN0YXlzIGNvbnNpc3RlbnQgYWNyb3NzIGV2ZXJ5IHBsYWNlIHRoYXQgcmVzb2x2ZXMgaXQgZnJvbSBjYXBhYmlsaXRpZXMuXG5leHBvcnQgZnVuY3Rpb24gaGFzQXBwQ2FwKGNhcD86IFdlYmRyaXZlcklPLkNhcGFiaWxpdGllcyk6IGJvb2xlYW4ge1xuICAgIGlmICghY2FwIHx8IHR5cGVvZiBjYXAgIT09ICdvYmplY3QnKSB7XG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgICBjb25zdCByZWNvcmQgPSBjYXAgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgICBpZiAoQVBQX0FVVE9NQVRFX0NBUF9LRVlTLnNvbWUoa2V5ID0+ICFpc1VuZGVmaW5lZChyZWNvcmRba2V5XSkpKSB7XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuICAgIGNvbnN0IGFwcGl1bU9wdGlvbnMgPSByZWNvcmRbJ2FwcGl1bTpvcHRpb25zJ10gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWRcbiAgICByZXR1cm4gISEoYXBwaXVtT3B0aW9ucyAmJiAhaXNVbmRlZmluZWQoYXBwaXVtT3B0aW9ucy5hcHApKVxufVxuXG5leHBvcnQgY29uc3QgaXNBcHBBY2Nlc3NpYmlsaXR5QXV0b21hdGlvblNlc3Npb24gPSAoYWNjZXNzaWJpbGl0eUZsYWc/OiBib29sZWFuIHwgc3RyaW5nLCBpc0FwcEF1dG9tYXRlPzogYm9vbGVhbikgPT4ge1xuICAgIGNvbnN0IGFjY2Vzc2liaWxpdHlBdXRvbWF0aW9uID0gaXNBY2Nlc3NpYmlsaXR5QXV0b21hdGlvblNlc3Npb24oYWNjZXNzaWJpbGl0eUZsYWcpXG4gICAgcmV0dXJuIGFjY2Vzc2liaWxpdHlBdXRvbWF0aW9uICYmIGlzQXBwQXV0b21hdGVcbn1cblxuZXhwb3J0IGNvbnN0IGZvcm1hdFN0cmluZyA9ICh0ZW1wbGF0ZTogKHN0cmluZyB8IG51bGwpLCAuLi52YWx1ZXM6IChzdHJpbmcgfCBudWxsKVtdKTogc3RyaW5nID0+IHtcbiAgICBsZXQgaSA9IDBcbiAgICBpZiAodGVtcGxhdGUgPT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuICcnXG4gICAgfVxuICAgIHJldHVybiB0ZW1wbGF0ZS5yZXBsYWNlKC8lcy9nLCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gdmFsdWVzW2krK11cbiAgICAgICAgcmV0dXJuIHZhbHVlICE9PSBudWxsICYmIHZhbHVlICE9PSB1bmRlZmluZWQgPyB2YWx1ZSA6ICcnXG4gICAgfSlcbn1cblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbmV4cG9ydCBjb25zdCBfZ2V0UGFyYW1zRm9yQXBwQWNjZXNzaWJpbGl0eSA9ICggY29tbWFuZE5hbWU/OiBzdHJpbmcsIHRlc3ROYW1lPzogc3RyaW5nLCBob29rUnVuVXVpZD86IHN0cmluZyB8IG51bGwsIGlzR2xvYmFsSG9vaz86IGJvb2xlYW4gKTogeyB0aFRlc3RSdW5VdWlkOiBhbnksIHRoSG9va1J1blV1aWQ6IGFueSwgdGhCdWlsZFV1aWQ6IGFueSwgdGhKd3RUb2tlbjogYW55LCBhdXRoSGVhZGVyOiBhbnksIHNjYW5UaW1lc3RhbXA6IG51bWJlciwgbWV0aG9kOiBzdHJpbmcgfCB1bmRlZmluZWQsIHRlc3ROYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQgIH0gPT4ge1xuICAgIHJldHVybiB7XG4gICAgICAgIC8vIEEgc2NhbiBmcm9tIGEgV0RJTyBjb25maWctbGV2ZWwgaG9vayBiZWxvbmdzIHRvIG5vIHRlc3QuIFRFU1RfQU5BTFlUSUNTX0lEIGluIHRoYXRcbiAgICAgICAgLy8gd2luZG93IGhvbGRzIGEgdXVpZCB0aGUgZnJhbWV3b3JrIG1pbnRlZCBhdCBpbnN0YW5jZSBjcmVhdGlvbiBcdTIwMTQgYSB0ZXN0IHRoYXQgaGFzIG5vdFxuICAgICAgICAvLyBzdGFydGVkIFx1MjAxNCBzbyBzZW5kaW5nIGl0IHdvdWxkIGF0dHJpYnV0ZSB0aGUgc2NhbiB0byBhIHRlc3QgaXQgZGlkIG5vdCBjb21lIGZyb20uXG4gICAgICAgICd0aFRlc3RSdW5VdWlkJzogaXNHbG9iYWxIb29rID8gdW5kZWZpbmVkIDogcHJvY2Vzcy5lbnYuVEVTVF9BTkFMWVRJQ1NfSUQsXG4gICAgICAgIC8vIFByZXNlbnQgb25seSB3aGVuIHRoZSBzY2FuIGZpcmVzIGluc2lkZSBhIGhvb2sgKGRyb3BwZWQgYnkgSlNPTi5zdHJpbmdpZnkgd2hlbiB1bmRlZmluZWQsXG4gICAgICAgIC8vIHNvIGluLXRlc3Qgc2NhbnMgYXJlIHVuY2hhbmdlZCkuIFNlbGVuaXVtSHViIGFwcEFsbHlIYW5kbGVyIHJlbGF5cyB0aGlzIGFzIGBob29rX3J1bl91dWlkYC5cbiAgICAgICAgJ3RoSG9va1J1blV1aWQnOiBob29rUnVuVXVpZCB8fCB1bmRlZmluZWQsXG4gICAgICAgICd0aEJ1aWxkVXVpZCc6IHByb2Nlc3MuZW52LkJST1dTRVJTVEFDS19URVNUSFVCX1VVSUQsXG4gICAgICAgICd0aEp3dFRva2VuJzogcHJvY2Vzcy5lbnYuQlJPV1NFUlNUQUNLX1RFU1RIVUJfSldULFxuICAgICAgICAnYXV0aEhlYWRlcic6IHByb2Nlc3MuZW52LkJTVEFDS19BMTFZX0pXVCxcbiAgICAgICAgJ3NjYW5UaW1lc3RhbXAnOiBEYXRlLm5vdygpLFxuICAgICAgICAnbWV0aG9kJzogY29tbWFuZE5hbWUsXG4gICAgICAgICd0ZXN0TmFtZSc6IHRlc3ROYW1lXG4gICAgfVxufVxuXG4vKiBlc2xpbnQtZGlzYWJsZSAgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAqL1xuZXhwb3J0IGNvbnN0IHBlcmZvcm1BMTF5U2NhbiA9IGFzeW5jIChpc0FwcEF1dG9tYXRlOiBib29sZWFuLCBicm93c2VyOiBXZWJkcml2ZXJJTy5Ccm93c2VyIHwgV2ViZHJpdmVySU8uTXVsdGlSZW1vdGVCcm93c2VyLCBpc0Jyb3dzZXJTdGFja1Nlc3Npb24/OiBib29sZWFuLCBpc0FjY2Vzc2liaWxpdHk/OiBib29sZWFuIHwgc3RyaW5nLCAgY29tbWFuZE5hbWU/OiBzdHJpbmcsIHRlc3ROYW1lPzogc3RyaW5nLCBob29rUnVuVXVpZD86IHN0cmluZyB8IG51bGwsIGlzR2xvYmFsSG9vaz86IGJvb2xlYW4sKSA6IFByb21pc2U8eyBba2V5OiBzdHJpbmddOiBhbnk7IH0gfCB1bmRlZmluZWQ+ID0+IHtcblxuICAgIGlmICghaXNBY2Nlc3NpYmlsaXR5QXV0b21hdGlvblNlc3Npb24oaXNBY2Nlc3NpYmlsaXR5KSkge1xuICAgICAgICBCU3RhY2tMb2dnZXIud2FybignTm90IGFuIEFjY2Vzc2liaWxpdHkgQXV0b21hdGlvbiBzZXNzaW9uLCBjYW5ub3QgcGVyZm9ybSBBY2Nlc3NpYmlsaXR5IHNjYW4uJylcbiAgICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgICAgaWYgKGlzQXBwQWNjZXNzaWJpbGl0eUF1dG9tYXRpb25TZXNzaW9uKGlzQWNjZXNzaWJpbGl0eSwgaXNBcHBBdXRvbWF0ZSkpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdHM6IHVua25vd24gPSBhd2FpdCAoYnJvd3NlciBhcyBXZWJkcml2ZXJJTy5Ccm93c2VyKS5leGVjdXRlKGZvcm1hdFN0cmluZyhBY2Nlc3NpYmlsaXR5U2NyaXB0cy5wZXJmb3JtU2NhbiwgSlNPTi5zdHJpbmdpZnkoX2dldFBhcmFtc0ZvckFwcEFjY2Vzc2liaWxpdHkoY29tbWFuZE5hbWUsIHRlc3ROYW1lLCBob29rUnVuVXVpZCwgaXNHbG9iYWxIb29rKSkpIGFzIHN0cmluZywge30pXG4gICAgICAgICAgICBCU3RhY2tMb2dnZXIuZGVidWcodXRpbC5mb3JtYXQocmVzdWx0cyBhcyBzdHJpbmcpKVxuICAgICAgICAgICAgcmV0dXJuICggcmVzdWx0cyBhcyB7IFtrZXk6IHN0cmluZ106IGFueTsgfSB8IHVuZGVmaW5lZCApXG4gICAgICAgIH1cbiAgICAgICAgaWYgKEFjY2Vzc2liaWxpdHlTY3JpcHRzLnBlcmZvcm1TY2FuKSB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgZXhlY3V0ZUFjY2Vzc2liaWxpdHlTY3JpcHQoYnJvd3NlciwgQWNjZXNzaWJpbGl0eVNjcmlwdHMucGVyZm9ybVNjYW4sIHsgbWV0aG9kOiBjb21tYW5kTmFtZSB8fCAnJyB9KVxuICAgICAgICAgICAgcmV0dXJuICggcmVzdWx0cyBhcyB7IFtrZXk6IHN0cmluZ106IHVua25vd247IH0gfCB1bmRlZmluZWQgKVxuICAgICAgICB9XG4gICAgICAgIEJTdGFja0xvZ2dlci5lcnJvcignQWNjZXNzaWJpbGl0eVNjcmlwdHMucGVyZm9ybVNjYW4gaXMgbnVsbCcpXG4gICAgICAgIHJldHVyblxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBCU3RhY2tMb2dnZXIuZXJyb3IoJ0FjY2Vzc2liaWxpdHkgU2NhbiBjb3VsZCBub3QgYmUgcGVyZm9ybWVkIDogJyArIGVycilcbiAgICAgICAgcmV0dXJuXG4gICAgfVxufVxuXG5leHBvcnQgY29uc3QgZ2V0QTExeVJlc3VsdHMgPSBQZXJmb3JtYW5jZVRlc3Rlci5tZWFzdXJlV3JhcHBlcihQRVJGT1JNQU5DRV9TREtfRVZFTlRTLkExMVlfRVZFTlRTLkdFVF9SRVNVTFRTLCBhc3luYyAoaXNBcHBBdXRvbWF0ZTogYm9vbGVhbiwgYnJvd3NlcjogV2ViZHJpdmVySU8uQnJvd3NlciwgaXNCcm93c2VyU3RhY2tTZXNzaW9uPzogYm9vbGVhbiwgaXNBY2Nlc3NpYmlsaXR5PzogYm9vbGVhbiB8IHN0cmluZykgOiBQcm9taXNlPEFycmF5PHsgW2tleTogc3RyaW5nXTogYW55OyB9Pj4gPT4ge1xuXG4gICAgaWYgKCFpc0FjY2Vzc2liaWxpdHlBdXRvbWF0aW9uU2Vzc2lvbihpc0FjY2Vzc2liaWxpdHkpKSB7XG4gICAgICAgIEJTdGFja0xvZ2dlci53YXJuKCdOb3QgYW4gQWNjZXNzaWJpbGl0eSBBdXRvbWF0aW9uIHNlc3Npb24sIGNhbm5vdCByZXRyaWV2ZSBBY2Nlc3NpYmlsaXR5IHJlc3VsdHMuJylcbiAgICAgICAgcmV0dXJuIFtdXG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgICAgQlN0YWNrTG9nZ2VyLmRlYnVnKCdQZXJmb3JtaW5nIHNjYW4gYmVmb3JlIGdldHRpbmcgcmVzdWx0cycpXG4gICAgICAgIGF3YWl0IHBlcmZvcm1BMTF5U2Nhbihpc0FwcEF1dG9tYXRlLCBicm93c2VyLCBpc0Jyb3dzZXJTdGFja1Nlc3Npb24sIGlzQWNjZXNzaWJpbGl0eSlcbiAgICAgICAgaWYgKEFjY2Vzc2liaWxpdHlTY3JpcHRzLmdldFJlc3VsdHMpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdHM6IEFycmF5PHsgW2tleTogc3RyaW5nXTogdW5rbm93biB9PiA9IGF3YWl0IGV4ZWN1dGVBY2Nlc3NpYmlsaXR5U2NyaXB0KGJyb3dzZXIsIEFjY2Vzc2liaWxpdHlTY3JpcHRzLmdldFJlc3VsdHMpXG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0c1xuICAgICAgICB9XG4gICAgICAgIEJTdGFja0xvZ2dlci5lcnJvcignQWNjZXNzaWJpbGl0eVNjcmlwdHMuZ2V0UmVzdWx0cyBpcyBudWxsJylcbiAgICAgICAgcmV0dXJuIFtdXG4gICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgICBCU3RhY2tMb2dnZXIuZXJyb3IoJ05vIGFjY2Vzc2liaWxpdHkgcmVzdWx0cyB3ZXJlIGZvdW5kLicpXG4gICAgICAgIEJTdGFja0xvZ2dlci5kZWJ1ZyhgZ2V0QTExeVJlc3VsdHMgRmFpbGVkLiBFcnJvcjogJHtlcnJvcn1gKVxuICAgICAgICByZXR1cm4gW11cbiAgICB9XG59KVxuXG5leHBvcnQgY29uc3QgZ2V0QXBwQTExeVJlc3VsdHMgPSBQZXJmb3JtYW5jZVRlc3Rlci5tZWFzdXJlV3JhcHBlcihQRVJGT1JNQU5DRV9TREtfRVZFTlRTLkExMVlfRVZFTlRTLkdFVF9SRVNVTFRTLCBhc3luYyAoaXNBcHBBdXRvbWF0ZTogYm9vbGVhbiwgYnJvd3NlcjogV2ViZHJpdmVySU8uQnJvd3NlciwgIHRlc3ROYW1lOiBzdHJpbmcsIGlzQnJvd3NlclN0YWNrU2Vzc2lvbj86IGJvb2xlYW4sIGlzQWNjZXNzaWJpbGl0eT86IGJvb2xlYW4gfCBzdHJpbmcsIHNlc3Npb25JZD86IHN0cmluZyB8IG51bGwpIDogUHJvbWlzZTxBcnJheTx7IFtrZXk6IHN0cmluZ106IGFueTsgfT4+ID0+IHtcbiAgICBpZiAoIWlzQnJvd3NlclN0YWNrU2Vzc2lvbikge1xuICAgICAgICByZXR1cm4gW10gLy8gc2luY2Ugd2UgYXJlIHJ1bm5pbmcgb25seSBvbiBBdXRvbWF0ZSBhcyBvZiBub3dcbiAgICB9XG5cbiAgICBpZiAoIWlzQXBwQWNjZXNzaWJpbGl0eUF1dG9tYXRpb25TZXNzaW9uKGlzQWNjZXNzaWJpbGl0eSwgaXNBcHBBdXRvbWF0ZSkpIHtcbiAgICAgICAgQlN0YWNrTG9nZ2VyLndhcm4oJ05vdCBhbiBBY2Nlc3NpYmlsaXR5IEF1dG9tYXRpb24gc2Vzc2lvbiwgY2Fubm90IHJldHJpZXZlIEFjY2Vzc2liaWxpdHkgcmVzdWx0cyBzdW1tYXJ5LicpXG4gICAgICAgIHJldHVybiBbXVxuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGFwaVVybCA9IGAke0FQSVV0aWxzLkFQUF9BTExZX0VORFBPSU5UfS8ke0FQUF9BTExZX0lTU1VFU19FTkRQT0lOVH1gXG4gICAgICAgIGNvbnN0IGFwaVJlc3BvbmUgPSBhd2FpdCBnZXRBcHBBMTF5UmVzdWx0UmVzcG9uc2UoYXBpVXJsLCBpc0FwcEF1dG9tYXRlLCBicm93c2VyLCB0ZXN0TmFtZSwgaXNCcm93c2VyU3RhY2tTZXNzaW9uLCBpc0FjY2Vzc2liaWxpdHksIHNlc3Npb25JZClcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXBpUmVzcG9uZT8uZGF0YT8uZGF0YT8uaXNzdWVzXG4gICAgICAgIEJTdGFja0xvZ2dlci5kZWJ1ZyhgUG9sbGluZyBSZXN1bHQ6ICR7SlNPTi5zdHJpbmdpZnkocmVzdWx0KX1gKVxuICAgICAgICByZXR1cm4gcmVzdWx0XG4gICAgfSBjYXRjaCAoZXJyb3I6IGFueSkgIHtcbiAgICAgICAgQlN0YWNrTG9nZ2VyLmVycm9yKCdObyBhY2Nlc3NpYmlsaXR5IHN1bW1hcnkgd2FzIGZvdW5kLicpXG4gICAgICAgIEJTdGFja0xvZ2dlci5kZWJ1ZyhgZ2V0QXBwQTExeVJlc3VsdHMgRmFpbGVkLiBFcnJvcjogJHtlcnJvcn1gKVxuICAgICAgICByZXR1cm4gW11cbiAgICB9XG59KVxuXG5leHBvcnQgY29uc3QgZ2V0QXBwQTExeVJlc3VsdHNTdW1tYXJ5ID0gUGVyZm9ybWFuY2VUZXN0ZXIubWVhc3VyZVdyYXBwZXIoUEVSRk9STUFOQ0VfU0RLX0VWRU5UUy5BMTFZX0VWRU5UUy5HRVRfUkVTVUxUU19TVU1NQVJZLCBhc3luYyAoaXNBcHBBdXRvbWF0ZTogYm9vbGVhbiwgYnJvd3NlcjogV2ViZHJpdmVySU8uQnJvd3NlciwgdGVzdE5hbWU6IHN0cmluZywgaXNCcm93c2VyU3RhY2tTZXNzaW9uPzogYm9vbGVhbiwgaXNBY2Nlc3NpYmlsaXR5PzogYm9vbGVhbiB8IHN0cmluZywgc2Vzc2lvbklkPzogc3RyaW5nIHwgbnVsbCkgOiBQcm9taXNlPHsgW2tleTogc3RyaW5nXTogYW55OyB9PiA9PiB7XG4gICAgaWYgKCFpc0Jyb3dzZXJTdGFja1Nlc3Npb24pIHtcbiAgICAgICAgcmV0dXJuIHt9IC8vIHNpbmNlIHdlIGFyZSBydW5uaW5nIG9ubHkgb24gQXV0b21hdGUgYXMgb2Ygbm93XG4gICAgfVxuXG4gICAgaWYgKCFpc0FwcEFjY2Vzc2liaWxpdHlBdXRvbWF0aW9uU2Vzc2lvbihpc0FjY2Vzc2liaWxpdHksIGlzQXBwQXV0b21hdGUpKSB7XG4gICAgICAgIEJTdGFja0xvZ2dlci53YXJuKCdOb3QgYW4gQWNjZXNzaWJpbGl0eSBBdXRvbWF0aW9uIHNlc3Npb24sIGNhbm5vdCByZXRyaWV2ZSBBY2Nlc3NpYmlsaXR5IHJlc3VsdHMgc3VtbWFyeS4nKVxuICAgICAgICByZXR1cm4ge31cbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgICBjb25zdCBhcGlVcmwgPSBgJHtBUElVdGlscy5BUFBfQUxMWV9FTkRQT0lOVH0vJHtBUFBfQUxMWV9JU1NVRVNfU1VNTUFSWV9FTkRQT0lOVH1gXG4gICAgICAgIGNvbnN0IGFwaVJlc3BvbmUgPSBhd2FpdCBnZXRBcHBBMTF5UmVzdWx0UmVzcG9uc2UoYXBpVXJsLCBpc0FwcEF1dG9tYXRlLCBicm93c2VyLCB0ZXN0TmFtZSwgaXNCcm93c2VyU3RhY2tTZXNzaW9uLCBpc0FjY2Vzc2liaWxpdHksIHNlc3Npb25JZClcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXBpUmVzcG9uZT8uZGF0YT8uZGF0YT8uc3VtbWFyeVxuICAgICAgICBCU3RhY2tMb2dnZXIuZGVidWcoYFBvbGxpbmcgUmVzdWx0OiAke0pTT04uc3RyaW5naWZ5KHJlc3VsdCl9YClcbiAgICAgICAgcmV0dXJuIHJlc3VsdFxuICAgIH0gY2F0Y2gge1xuICAgICAgICBCU3RhY2tMb2dnZXIuZXJyb3IoJ05vIGFjY2Vzc2liaWxpdHkgc3VtbWFyeSB3YXMgZm91bmQuJylcbiAgICAgICAgcmV0dXJuIHt9XG4gICAgfVxufSlcblxuY29uc3QgZ2V0QXBwQTExeVJlc3VsdFJlc3BvbnNlID0gYXN5bmMgKGFwaVVybDogc3RyaW5nLCBpc0FwcEF1dG9tYXRlOiBib29sZWFuLCBicm93c2VyOiBXZWJkcml2ZXJJTy5Ccm93c2VyLCB0ZXN0TmFtZTogc3RyaW5nLCBpc0Jyb3dzZXJTdGFja1Nlc3Npb24/OiBib29sZWFuLCBpc0FjY2Vzc2liaWxpdHk/OiBib29sZWFuIHwgc3RyaW5nLCBzZXNzaW9uSWQ/OiBzdHJpbmcgfCBudWxsKSA6IFByb21pc2U8UG9sbGluZ1Jlc3VsdD4gPT4ge1xuICAgIEJTdGFja0xvZ2dlci5kZWJ1ZygnUGVyZm9ybWluZyBzY2FuIGJlZm9yZSBnZXR0aW5nIHJlc3VsdHMgc3VtbWFyeScpXG4gICAgYXdhaXQgcGVyZm9ybUExMXlTY2FuKGlzQXBwQXV0b21hdGUsIGJyb3dzZXIsIGlzQnJvd3NlclN0YWNrU2Vzc2lvbiwgaXNBY2Nlc3NpYmlsaXR5LCB1bmRlZmluZWQsIHRlc3ROYW1lKVxuICAgIGNvbnN0IHVwcGVyVGltZUxpbWl0ID0gcHJvY2Vzcy5lbnYuQlNUQUNLX0ExMVlfUE9MTElOR19USU1FT1VUID8gRGF0ZS5ub3coKSArIHBhcnNlSW50KHByb2Nlc3MuZW52LkJTVEFDS19BMTFZX1BPTExJTkdfVElNRU9VVCkgKiAxMDAwIDogRGF0ZS5ub3coKSArIDMwMDAwXG4gICAgY29uc3QgcGFyYW1zID0geyB0ZXN0X3J1bl91dWlkOiBwcm9jZXNzLmVudi5URVNUX0FOQUxZVElDU19JRCwgc2Vzc2lvbl9pZDogc2Vzc2lvbklkLCB0aW1lc3RhbXA6IERhdGUubm93KCkgfSAvLyBRdWVyeSBwYXJhbXMgdG8gcGFzc1xuICAgIGNvbnN0IGhlYWRlciA9IHsgQXV0aG9yaXphdGlvbjogYEJlYXJlciAke3Byb2Nlc3MuZW52LkJTVEFDS19BMTFZX0pXVH1gIH1cbiAgICBjb25zdCBhcGlSZXNwb25lID0gYXdhaXQgcG9sbEFwaShhcGlVcmwsIHBhcmFtcywgaGVhZGVyLCB1cHBlclRpbWVMaW1pdClcbiAgICBCU3RhY2tMb2dnZXIuZGVidWcoYFBvbGxpbmcgUmVzdWx0OiAke0pTT04uc3RyaW5naWZ5KGFwaVJlc3BvbmUpfWApXG4gICAgcmV0dXJuIGFwaVJlc3BvbmVcbn1cblxuZXhwb3J0IGNvbnN0IGdldEExMXlSZXN1bHRzU3VtbWFyeSA9IFBlcmZvcm1hbmNlVGVzdGVyLm1lYXN1cmVXcmFwcGVyKFBFUkZPUk1BTkNFX1NES19FVkVOVFMuQTExWV9FVkVOVFMuR0VUX1JFU1VMVFNfU1VNTUFSWSwgYXN5bmMgKGlzQXBwQXV0b21hdGU6IGJvb2xlYW4sIGJyb3dzZXI6IFdlYmRyaXZlcklPLkJyb3dzZXIsIGlzQnJvd3NlclN0YWNrU2Vzc2lvbj86IGJvb2xlYW4sIGlzQWNjZXNzaWJpbGl0eT86IGJvb2xlYW4gfCBzdHJpbmcpIDogUHJvbWlzZTx7IFtrZXk6IHN0cmluZ106IGFueTsgfT4gPT4ge1xuXG4gICAgaWYgKCFpc0FjY2Vzc2liaWxpdHlBdXRvbWF0aW9uU2Vzc2lvbihpc0FjY2Vzc2liaWxpdHkpKSB7XG4gICAgICAgIEJTdGFja0xvZ2dlci53YXJuKCdOb3QgYW4gQWNjZXNzaWJpbGl0eSBBdXRvbWF0aW9uIHNlc3Npb24sIGNhbm5vdCByZXRyaWV2ZSBBY2Nlc3NpYmlsaXR5IHJlc3VsdHMgc3VtbWFyeS4nKVxuICAgICAgICByZXR1cm4ge31cbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgICBCU3RhY2tMb2dnZXIuZGVidWcoJ1BlcmZvcm1pbmcgc2NhbiBiZWZvcmUgZ2V0dGluZyByZXN1bHRzIHN1bW1hcnknKVxuICAgICAgICBhd2FpdCBwZXJmb3JtQTExeVNjYW4oaXNBcHBBdXRvbWF0ZSwgYnJvd3NlciwgaXNCcm93c2VyU3RhY2tTZXNzaW9uLCBpc0FjY2Vzc2liaWxpdHkpXG4gICAgICAgIGlmIChBY2Nlc3NpYmlsaXR5U2NyaXB0cy5nZXRSZXN1bHRzU3VtbWFyeSkge1xuICAgICAgICAgICAgY29uc3Qgc3VtbWFyeVJlc3VsdHM6IHsgW2tleTogc3RyaW5nXTogdW5rbm93bjsgfSA9IGF3YWl0IGV4ZWN1dGVBY2Nlc3NpYmlsaXR5U2NyaXB0KGJyb3dzZXIsIEFjY2Vzc2liaWxpdHlTY3JpcHRzLmdldFJlc3VsdHNTdW1tYXJ5KVxuICAgICAgICAgICAgcmV0dXJuIHN1bW1hcnlSZXN1bHRzXG4gICAgICAgIH1cbiAgICAgICAgQlN0YWNrTG9nZ2VyLmVycm9yKCdBY2Nlc3NpYmlsaXR5U2NyaXB0cy5nZXRSZXN1bHRzU3VtbWFyeSBpcyBudWxsJylcbiAgICAgICAgcmV0dXJuIHt9XG4gICAgfSBjYXRjaCB7XG4gICAgICAgIEJTdGFja0xvZ2dlci5lcnJvcignTm8gYWNjZXNzaWJpbGl0eSBzdW1tYXJ5IHdhcyBmb3VuZC4nKVxuICAgICAgICByZXR1cm4ge31cbiAgICB9XG59KVxuXG4vKipcbiAqIFJlbmRlciBhbiBlcnJvciB0b2dldGhlciB3aXRoIGl0cyBgY2F1c2VgIGNoYWluLlxuICpcbiAqIE5vZGUncyBuYXRpdmUgZmV0Y2ggcmVwb3J0cyBldmVyeSB0cmFuc3BvcnQgZmFpbHVyZSBhcyB0aGUgc2FtZSBvcGFxdWVcbiAqIGBUeXBlRXJyb3I6IGZldGNoIGZhaWxlZGA7IHRoZSBhY3Rpb25hYmxlIGRldGFpbCAoRU5PVEZPVU5ELCBFQ09OTlJFU0VULCBhIHByb3h5XG4gKiByZWZ1c2FsKSBvbmx5IGxpdmVzIG9uIGBlcnJvci5jYXVzZWAsIHdoaWNoIHBsYWluIGludGVycG9sYXRpb24gZHJvcHMuIFdpdGhvdXQgdGhpc1xuICogYSBmYWlsZWQgYnVpbGQtc3RvcCBpcyBpbmRpc3Rpbmd1aXNoYWJsZSBmcm9tIGFueSBvdGhlciBuZXR3b3JrIGZhdWx0IGluIHRoZSBsb2dzLlxuICovXG5leHBvcnQgY29uc3QgZGVzY3JpYmVFcnJvcldpdGhDYXVzZSA9IChlcnJvcjogdW5rbm93biwgZGVwdGggPSAzKTogc3RyaW5nID0+IHtcbiAgICBpZiAoZXJyb3IgPT09IG51bGwgfHwgZXJyb3IgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gU3RyaW5nKGVycm9yKVxuICAgIH1cbiAgICBjb25zdCBkZXNjcmliZWQgPSBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gYCR7ZXJyb3IubmFtZX06ICR7ZXJyb3IubWVzc2FnZX1gIDogU3RyaW5nKGVycm9yKVxuICAgIGNvbnN0IGNhdXNlID0gKGVycm9yIGFzIHsgY2F1c2U/OiB1bmtub3duIH0pLmNhdXNlXG4gICAgaWYgKGNhdXNlID09PSBudWxsIHx8IGNhdXNlID09PSB1bmRlZmluZWQgfHwgZGVwdGggPD0gMSkge1xuICAgICAgICByZXR1cm4gZGVzY3JpYmVkXG4gICAgfVxuICAgIHJldHVybiBgJHtkZXNjcmliZWR9IDwtIGNhdXNlZCBieSAke2Rlc2NyaWJlRXJyb3JXaXRoQ2F1c2UoY2F1c2UsIGRlcHRoIC0gMSl9YFxufVxuXG5leHBvcnQgY29uc3Qgc3RvcEJ1aWxkVXBzdHJlYW0gPSBQZXJmb3JtYW5jZVRlc3Rlci5tZWFzdXJlV3JhcHBlcihQRVJGT1JNQU5DRV9TREtfRVZFTlRTLlRFU1RIVUJfRVZFTlRTLlNUT1AsIG8xMXlFcnJvckhhbmRsZXIoYXN5bmMgZnVuY3Rpb24gc3RvcEJ1aWxkVXBzdHJlYW0oKSB7XG4gICAgY29uc3Qgc3RvcEJ1aWxkVXNhZ2UgPSBVc2FnZVN0YXRzLmdldEluc3RhbmNlKCkuc3RvcEJ1aWxkVXNhZ2VcbiAgICBzdG9wQnVpbGRVc2FnZS50cmlnZ2VyZWQoKVxuICAgIGlmICghcHJvY2Vzcy5lbnZbVEVTVE9QU19CVUlMRF9DT01QTEVURURfRU5WXSkge1xuICAgICAgICBzdG9wQnVpbGRVc2FnZS5mYWlsZWQoJ0J1aWxkIGlzIG5vdCBjb21wbGV0ZWQgeWV0JylcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHN0YXR1czogJ2Vycm9yJyxcbiAgICAgICAgICAgIG1lc3NhZ2U6ICdCdWlsZCBpcyBub3QgY29tcGxldGVkIHlldCdcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGlmICghcHJvY2Vzcy5lbnZbQlJPV1NFUlNUQUNLX1RFU1RIVUJfSldUXSkge1xuICAgICAgICBzdG9wQnVpbGRVc2FnZS5mYWlsZWQoJ1Rva2VuL2J1aWxkSUQgaXMgdW5kZWZpbmVkLCBidWlsZCBjcmVhdGlvbiBtaWdodCBoYXZlIGZhaWxlZCcpXG4gICAgICAgIEJTdGFja0xvZ2dlci5kZWJ1ZygnW1NUT1BfQlVJTERdIE1pc3NpbmcgQXV0aGVudGljYXRpb24gVG9rZW4vIEJ1aWxkIElEJylcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHN0YXR1czogJ2Vycm9yJyxcbiAgICAgICAgICAgIG1lc3NhZ2U6ICdUb2tlbi9idWlsZElEIGlzIHVuZGVmaW5lZCwgYnVpbGQgY3JlYXRpb24gbWlnaHQgaGF2ZSBmYWlsZWQnXG4gICAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgZGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7XG4gICAgICAgICdzdG9wX3RpbWUnOiAobmV3IERhdGUoKSkudG9JU09TdHJpbmcoKVxuICAgIH1cbiAgICAvLyBTdGFtcCB0aGUga2lsbCByZWFzb24gb250byB0aGUgYnVpbGQgcmVjb3JkIHNvIHRlcm1pbmF0ZWQgcnVucyBhcmVcbiAgICAvLyBpZGVudGlmaWFibGUgc2VydmVyLXNpZGUsIG5vdCBvbmx5IHZpYSB0aGUgYW5hbHl0aWNzIGZ1bm5lbC5cbiAgICBjb25zdCBraWxsU2lnbmFsID0gcHJvY2Vzcy5lbnZbQlJPV1NFUlNUQUNLX0tJTExfU0lHTkFMXVxuICAgIGlmIChraWxsU2lnbmFsKSB7XG4gICAgICAgIGRhdGEuZmluaXNoZWRfbWV0YWRhdGEgPSBbeyByZWFzb246ICd1c2VyX2tpbGxlZCcsIHNpZ25hbDoga2lsbFNpZ25hbCB9XVxuICAgIH1cblxuICAgIGNvbnN0IHVybCA9IGAke0FQSVV0aWxzLkRBVEFfRU5EUE9JTlR9L2FwaS92MS9idWlsZHMvJHtwcm9jZXNzLmVudltCUk9XU0VSU1RBQ0tfVEVTVEhVQl9VVUlEXX0vc3RvcGBcbiAgICAvLyBTREstNzA2MTogdGhlIGJ1aWxkLXN0b3AgUFVUIGlzIHRoZSBzaWduYWwgdGhhdCBjbG9zZXMgdGhlIFRSQSBidWlsZC4gQSBzaW5nbGVcbiAgICAvLyBiZXN0LWVmZm9ydCByZXF1ZXN0IG1lYW5zIGEgdHJhbnNpZW50IGZhaWx1cmUvdGltZW91dCBsZWF2ZXMgdGhlIGJ1aWxkIHJ1bm5pbmdcbiAgICAvLyB1bnRpbCB0aGUgfjYwLW1pbiBzZXJ2ZXItc2lkZSBpbmFjdGl2aXR5IHRpbWVvdXQuIFJldHJ5IHdpdGggYmFja29mZiBhbmQgdHJlYXQgYVxuICAgIC8vIG5vbi0yeHggcmVzcG9uc2UgYXMgYSBmYWlsdXJlIHNvIHRoZSBidWlsZCByZWxpYWJseSByZWFjaGVzIGEgdGVybWluYWwgc3RhdGUuXG4gICAgLy8gU0RLLTcyMjk6IGEgY29ycG9yYXRlIEROUy9wcm94eSBibGlwIHJvdXRpbmVseSBvdXRsYXN0cyBhIHN1Yi1zZWNvbmQgcmV0cnkgd2luZG93LFxuICAgIC8vIGFuZCB0aGUgcmVxdWVzdCBoYWQgbm8gdGltZW91dCBhdCBhbGwsIHNvIGEgaHVuZyBjb25uZWN0aW9uIGNvdWxkIHN0YWxsIHNodXRkb3duXG4gICAgLy8gaW5kZWZpbml0ZWx5LiBFYWNoIGF0dGVtcHQgaXMgbm93IGluZGl2aWR1YWxseSBib3VuZGVkLCBhbmQgdGhlIHJldHJ5IGxvb3AgYXMgYVxuICAgIC8vIHdob2xlIGlzIGNhcHBlZCBieSBhIHdhbGwtY2xvY2sgZGVhZGxpbmUgKHRoaXMgcnVucyBkdXJpbmcgc2h1dGRvd24pLlxuICAgIGNvbnN0IGRlYWRsaW5lID0gRGF0ZS5ub3coKSArIFNUT1BfQlVJTERfVE9UQUxfQlVER0VUX01TXG4gICAgbGV0IGxhc3RFcnJvcjogdW5rbm93blxuICAgIGxldCBhdHRlbXB0cyA9IDBcbiAgICBmb3IgKGxldCBhdHRlbXB0ID0gMTsgYXR0ZW1wdCA8PSBTVE9QX0JVSUxEX01BWF9BVFRFTVBUUzsgYXR0ZW1wdCsrKSB7XG4gICAgICAgIGNvbnN0IGJ1ZGdldExlZnQgPSBkZWFkbGluZSAtIERhdGUubm93KClcbiAgICAgICAgaWYgKGJ1ZGdldExlZnQgPD0gMCkge1xuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgICAgICBhdHRlbXB0cyA9IGF0dGVtcHRcbiAgICAgICAgY29uc3QgY29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKVxuICAgICAgICBjb25zdCB0aW1lb3V0SWQgPSBzZXRUaW1lb3V0KCgpID0+IGNvbnRyb2xsZXIuYWJvcnQoKSwgTWF0aC5taW4oU1RPUF9CVUlMRF9BVFRFTVBUX1RJTUVPVVRfTVMsIGJ1ZGdldExlZnQpKVxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh1cmwsIHtcbiAgICAgICAgICAgICAgICBtZXRob2Q6ICdQVVQnLFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgICAgICAgICAgLi4uREVGQVVMVF9SRVFVRVNUX0NPTkZJRy5oZWFkZXJzLFxuICAgICAgICAgICAgICAgICAgICAnQXV0aG9yaXphdGlvbic6IGBCZWFyZXIgJHtwcm9jZXNzLmVudltCUk9XU0VSU1RBQ0tfVEVTVEhVQl9KV1RdfWBcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KGRhdGEpLFxuICAgICAgICAgICAgICAgIHNpZ25hbDogY29udHJvbGxlci5zaWduYWxcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBIVFRQICR7cmVzcG9uc2Uuc3RhdHVzfSAke3Jlc3BvbnNlLnN0YXR1c1RleHR9YClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIEJTdGFja0xvZ2dlci5kZWJ1ZyhgW1NUT1BfQlVJTERdIFN1Y2Nlc3MgcmVzcG9uc2U6ICR7YXdhaXQgcmVzcG9uc2UudGV4dCgpfWApXG4gICAgICAgICAgICBzdG9wQnVpbGRVc2FnZS5zdWNjZXNzKClcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgc3RhdHVzOiAnc3VjY2VzcycsXG4gICAgICAgICAgICAgICAgbWVzc2FnZTogJydcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgICAgICAgIC8vIEFuIGFib3J0ZWQgYXR0ZW1wdCBzdXJmYWNlcyBhcyBhIGdlbmVyaWMgQWJvcnRFcnJvcjsgbmFtZSB0aGUgcmVhbCByZWFzb24gc29cbiAgICAgICAgICAgIC8vIGEgc2xvdyBlbmRwb2ludCBpcyBub3QgbWlzdGFrZW4gZm9yIGFuIG91dHJpZ2h0IHRyYW5zcG9ydCBmYWlsdXJlLlxuICAgICAgICAgICAgbGFzdEVycm9yID0gY29udHJvbGxlci5zaWduYWwuYWJvcnRlZFxuICAgICAgICAgICAgICAgID8gbmV3IEVycm9yKGBidWlsZCBzdG9wIHJlcXVlc3QgdGltZWQgb3V0IGFmdGVyICR7TWF0aC5taW4oU1RPUF9CVUlMRF9BVFRFTVBUX1RJTUVPVVRfTVMsIGJ1ZGdldExlZnQpfW1zYClcbiAgICAgICAgICAgICAgICA6IGVycm9yXG4gICAgICAgICAgICBCU3RhY2tMb2dnZXIuZGVidWcoYFtTVE9QX0JVSUxEXSBBdHRlbXB0ICR7YXR0ZW1wdH0vJHtTVE9QX0JVSUxEX01BWF9BVFRFTVBUU30gZmFpbGVkLiBFcnJvcjogJHtkZXNjcmliZUVycm9yV2l0aENhdXNlKGxhc3RFcnJvcil9YClcbiAgICAgICAgICAgIGNvbnN0IGJhY2tvZmYgPSBTVE9QX0JVSUxEX0JBQ0tPRkZfQkFTRV9NUyAqIE1hdGgucG93KDIsIGF0dGVtcHQgLSAxKVxuICAgICAgICAgICAgaWYgKGF0dGVtcHQgPj0gU1RPUF9CVUlMRF9NQVhfQVRURU1QVFMgfHwgRGF0ZS5ub3coKSArIGJhY2tvZmYgPj0gZGVhZGxpbmUpIHtcbiAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgYmFja29mZikpXG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICBjbGVhclRpbWVvdXQodGltZW91dElkKVxuICAgICAgICB9XG4gICAgfVxuICAgIHN0b3BCdWlsZFVzYWdlLmZhaWxlZChsYXN0RXJyb3IpXG4gICAgQlN0YWNrTG9nZ2VyLmRlYnVnKGBbU1RPUF9CVUlMRF0gRmFpbGVkIGFmdGVyICR7YXR0ZW1wdHN9IGF0dGVtcHQocykuIEVycm9yOiAke2Rlc2NyaWJlRXJyb3JXaXRoQ2F1c2UobGFzdEVycm9yKX1gKVxuICAgIHJldHVybiB7XG4gICAgICAgIHN0YXR1czogJ2Vycm9yJyxcbiAgICAgICAgbWVzc2FnZTogKGxhc3RFcnJvciBhcyBFcnJvcik/Lm1lc3NhZ2UgPz8gJ3N0b3AgYnVpbGQgZmFpbGVkJ1xuICAgIH1cbn0pKVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q2lJbmZvICgpIHtcbiAgICBjb25zdCBlbnYgPSBwcm9jZXNzLmVudlxuICAgIC8vIEplbmtpbnNcbiAgICBpZiAoKHR5cGVvZiBlbnYuSkVOS0lOU19VUkwgPT09ICdzdHJpbmcnICYmIGVudi5KRU5LSU5TX1VSTC5sZW5ndGggPiAwKSB8fCAodHlwZW9mIGVudi5KRU5LSU5TX0hPTUUgPT09ICdzdHJpbmcnICYmIGVudi5KRU5LSU5TX0hPTUUubGVuZ3RoID4gMCkpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG5hbWU6ICdKZW5raW5zJyxcbiAgICAgICAgICAgIGJ1aWxkX3VybDogZW52LkJVSUxEX1VSTCxcbiAgICAgICAgICAgIGpvYl9uYW1lOiBlbnYuSk9CX05BTUUsXG4gICAgICAgICAgICBidWlsZF9udW1iZXI6IGVudi5CVUlMRF9OVU1CRVJcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBDaXJjbGVDSVxuICAgIGlmIChpc1RydWUoZW52LkNJKSAmJiBpc1RydWUoZW52LkNJUkNMRUNJKSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbmFtZTogJ0NpcmNsZUNJJyxcbiAgICAgICAgICAgIGJ1aWxkX3VybDogZW52LkNJUkNMRV9CVUlMRF9VUkwsXG4gICAgICAgICAgICBqb2JfbmFtZTogZW52LkNJUkNMRV9KT0IsXG4gICAgICAgICAgICBidWlsZF9udW1iZXI6IGVudi5DSVJDTEVfQlVJTERfTlVNXG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gVHJhdmlzIENJXG4gICAgaWYgKGlzVHJ1ZShlbnYuQ0kpICYmIGlzVHJ1ZShlbnYuVFJBVklTKSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbmFtZTogJ1RyYXZpcyBDSScsXG4gICAgICAgICAgICBidWlsZF91cmw6IGVudi5UUkFWSVNfQlVJTERfV0VCX1VSTCxcbiAgICAgICAgICAgIGpvYl9uYW1lOiBlbnYuVFJBVklTX0pPQl9OQU1FLFxuICAgICAgICAgICAgYnVpbGRfbnVtYmVyOiBlbnYuVFJBVklTX0JVSUxEX05VTUJFUlxuICAgICAgICB9XG4gICAgfVxuICAgIC8vIENvZGVzaGlwXG4gICAgaWYgKGlzVHJ1ZShlbnYuQ0kpICYmIGVudi5DSV9OQU1FID09PSAnY29kZXNoaXAnKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBuYW1lOiAnQ29kZXNoaXAnLFxuICAgICAgICAgICAgYnVpbGRfdXJsOiBudWxsLFxuICAgICAgICAgICAgam9iX25hbWU6IG51bGwsXG4gICAgICAgICAgICBidWlsZF9udW1iZXI6IG51bGxcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBCaXRidWNrZXRcbiAgICBpZiAoZW52LkJJVEJVQ0tFVF9CUkFOQ0ggJiYgZW52LkJJVEJVQ0tFVF9DT01NSVQpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG5hbWU6ICdCaXRidWNrZXQnLFxuICAgICAgICAgICAgYnVpbGRfdXJsOiBlbnYuQklUQlVDS0VUX0dJVF9IVFRQX09SSUdJTixcbiAgICAgICAgICAgIGpvYl9uYW1lOiBudWxsLFxuICAgICAgICAgICAgYnVpbGRfbnVtYmVyOiBlbnYuQklUQlVDS0VUX0JVSUxEX05VTUJFUlxuICAgICAgICB9XG4gICAgfVxuICAgIC8vIERyb25lXG4gICAgaWYgKGlzVHJ1ZShlbnYuQ0kpICYmIGlzVHJ1ZShlbnYuRFJPTkUpKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBuYW1lOiAnRHJvbmUnLFxuICAgICAgICAgICAgYnVpbGRfdXJsOiBlbnYuRFJPTkVfQlVJTERfTElOSyxcbiAgICAgICAgICAgIGpvYl9uYW1lOiBudWxsLFxuICAgICAgICAgICAgYnVpbGRfbnVtYmVyOiBlbnYuRFJPTkVfQlVJTERfTlVNQkVSXG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gU2VtYXBob3JlXG4gICAgaWYgKGlzVHJ1ZShlbnYuQ0kpICYmIGlzVHJ1ZShlbnYuU0VNQVBIT1JFKSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbmFtZTogJ1NlbWFwaG9yZScsXG4gICAgICAgICAgICBidWlsZF91cmw6IGVudi5TRU1BUEhPUkVfT1JHQU5JWkFUSU9OX1VSTCxcbiAgICAgICAgICAgIGpvYl9uYW1lOiBlbnYuU0VNQVBIT1JFX0pPQl9OQU1FLFxuICAgICAgICAgICAgYnVpbGRfbnVtYmVyOiBlbnYuU0VNQVBIT1JFX0pPQl9JRFxuICAgICAgICB9XG4gICAgfVxuICAgIC8vIEdpdExhYlxuICAgIGlmIChpc1RydWUoZW52LkNJKSAmJiBpc1RydWUoZW52LkdJVExBQl9DSSkpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG5hbWU6ICdHaXRMYWInLFxuICAgICAgICAgICAgYnVpbGRfdXJsOiBlbnYuQ0lfSk9CX1VSTCxcbiAgICAgICAgICAgIGpvYl9uYW1lOiBlbnYuQ0lfSk9CX05BTUUsXG4gICAgICAgICAgICBidWlsZF9udW1iZXI6IGVudi5DSV9KT0JfSURcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBCdWlsZGtpdGVcbiAgICBpZiAoaXNUcnVlKGVudi5DSSkgJiYgaXNUcnVlKGVudi5CVUlMREtJVEUpKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBuYW1lOiAnQnVpbGRraXRlJyxcbiAgICAgICAgICAgIGJ1aWxkX3VybDogZW52LkJVSUxES0lURV9CVUlMRF9VUkwsXG4gICAgICAgICAgICBqb2JfbmFtZTogZW52LkJVSUxES0lURV9MQUJFTCB8fCBlbnYuQlVJTERLSVRFX1BJUEVMSU5FX05BTUUsXG4gICAgICAgICAgICBidWlsZF9udW1iZXI6IGVudi5CVUlMREtJVEVfQlVJTERfTlVNQkVSXG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gVmlzdWFsIFN0dWRpbyBUZWFtIFNlcnZpY2VzXG4gICAgaWYgKGlzVHJ1ZShlbnYuVEZfQlVJTEQpICYmIGVudi5URl9CVUlMRF9CVUlMRE5VTUJFUikge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbmFtZTogJ1Zpc3VhbCBTdHVkaW8gVGVhbSBTZXJ2aWNlcycsXG4gICAgICAgICAgICBidWlsZF91cmw6IGAke2Vudi5TWVNURU1fVEVBTUZPVU5EQVRJT05TRVJWRVJVUkl9JHtlbnYuU1lTVEVNX1RFQU1QUk9KRUNUSUR9YCxcbiAgICAgICAgICAgIGpvYl9uYW1lOiBlbnYuU1lTVEVNX0RFRklOSVRJT05JRCxcbiAgICAgICAgICAgIGJ1aWxkX251bWJlcjogZW52LkJVSUxEX0JVSUxESURcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBBcHB2ZXlvclxuICAgIGlmIChpc1RydWUoZW52LkFQUFZFWU9SKSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbmFtZTogJ0FwcHZleW9yJyxcbiAgICAgICAgICAgIGJ1aWxkX3VybDogYCR7ZW52LkFQUFZFWU9SX1VSTH0vcHJvamVjdC8ke2Vudi5BUFBWRVlPUl9BQ0NPVU5UX05BTUV9LyR7ZW52LkFQUFZFWU9SX1BST0pFQ1RfU0xVR30vYnVpbGRzLyR7ZW52LkFQUFZFWU9SX0JVSUxEX0lEfWAsXG4gICAgICAgICAgICBqb2JfbmFtZTogZW52LkFQUFZFWU9SX0pPQl9OQU1FLFxuICAgICAgICAgICAgYnVpbGRfbnVtYmVyOiBlbnYuQVBQVkVZT1JfQlVJTERfTlVNQkVSXG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gQXp1cmUgQ0lcbiAgICBpZiAoZW52LkFaVVJFX0hUVFBfVVNFUl9BR0VOVCAmJiBlbnYuVEZfQlVJTEQpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG5hbWU6ICdBenVyZSBDSScsXG4gICAgICAgICAgICBidWlsZF91cmw6IGAke2Vudi5TWVNURU1fVEVBTUZPVU5EQVRJT05TRVJWRVJVUkl9JHtlbnYuU1lTVEVNX1RFQU1QUk9KRUNUSUR9YCxcbiAgICAgICAgICAgIGpvYl9uYW1lOiBlbnYuQlVJTERfQlVJTERJRCxcbiAgICAgICAgICAgIGJ1aWxkX251bWJlcjogZW52LkJVSUxEX0JVSUxESURcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBBV1MgQ29kZUJ1aWxkXG4gICAgaWYgKGVudi5DT0RFQlVJTERfQlVJTERfSUQgfHwgZW52LkNPREVCVUlMRF9SRVNPTFZFRF9TT1VSQ0VfVkVSU0lPTiB8fCBlbnYuQ09ERUJVSUxEX1NPVVJDRV9WRVJTSU9OKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBuYW1lOiAnQVdTIENvZGVCdWlsZCcsXG4gICAgICAgICAgICBidWlsZF91cmw6IGVudi5DT0RFQlVJTERfUFVCTElDX0JVSUxEX1VSTCxcbiAgICAgICAgICAgIGpvYl9uYW1lOiBlbnYuQ09ERUJVSUxEX0JVSUxEX0lELFxuICAgICAgICAgICAgYnVpbGRfbnVtYmVyOiBlbnYuQ09ERUJVSUxEX0JVSUxEX0lEXG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gQmFtYm9vXG4gICAgaWYgKGVudi5iYW1ib29fYnVpbGROdW1iZXIpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG5hbWU6ICdCYW1ib28nLFxuICAgICAgICAgICAgYnVpbGRfdXJsOiBlbnYuYmFtYm9vX2J1aWxkUmVzdWx0c1VybCxcbiAgICAgICAgICAgIGpvYl9uYW1lOiBlbnYuYmFtYm9vX3Nob3J0Sm9iTmFtZSxcbiAgICAgICAgICAgIGJ1aWxkX251bWJlcjogZW52LmJhbWJvb19idWlsZE51bWJlclxuICAgICAgICB9XG4gICAgfVxuICAgIC8vIFdlcmNrZXJcbiAgICBpZiAoZW52LldFUkNLRVIgfHwgZW52LldFUkNLRVJfTUFJTl9QSVBFTElORV9TVEFSVEVEKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBuYW1lOiAnV2VyY2tlcicsXG4gICAgICAgICAgICBidWlsZF91cmw6IGVudi5XRVJDS0VSX0JVSUxEX1VSTCxcbiAgICAgICAgICAgIGpvYl9uYW1lOiBlbnYuV0VSQ0tFUl9NQUlOX1BJUEVMSU5FX1NUQVJURUQgPyAnTWFpbiBQaXBlbGluZScgOiBudWxsLFxuICAgICAgICAgICAgYnVpbGRfbnVtYmVyOiBlbnYuV0VSQ0tFUl9HSVRfQ09NTUlUXG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gR29vZ2xlIENsb3VkXG4gICAgaWYgKGVudi5HQ1BfUFJPSkVDVCB8fCBlbnYuR0NMT1VEX1BST0pFQ1QgfHwgZW52LkdPT0dMRV9DTE9VRF9QUk9KRUNUKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBuYW1lOiAnR29vZ2xlIENsb3VkJyxcbiAgICAgICAgICAgIGJ1aWxkX3VybDogbnVsbCxcbiAgICAgICAgICAgIGpvYl9uYW1lOiBlbnYuUFJPSkVDVF9JRCxcbiAgICAgICAgICAgIGJ1aWxkX251bWJlcjogZW52LkJVSUxEX0lELFxuICAgICAgICB9XG4gICAgfVxuICAgIC8vIFNoaXBwYWJsZVxuICAgIGlmIChlbnYuU0hJUFBBQkxFKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBuYW1lOiAnU2hpcHBhYmxlJyxcbiAgICAgICAgICAgIGJ1aWxkX3VybDogZW52LlNISVBQQUJMRV9CVUlMRF9VUkwsXG4gICAgICAgICAgICBqb2JfbmFtZTogZW52LlNISVBQQUJMRV9KT0JfSUQgPyBgSm9iICMke2Vudi5TSElQUEFCTEVfSk9CX0lEfWAgOiBudWxsLFxuICAgICAgICAgICAgYnVpbGRfbnVtYmVyOiBlbnYuU0hJUFBBQkxFX0JVSUxEX05VTUJFUlxuICAgICAgICB9XG4gICAgfVxuICAgIC8vIE5ldGxpZnlcbiAgICBpZiAoaXNUcnVlKGVudi5ORVRMSUZZKSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbmFtZTogJ05ldGxpZnknLFxuICAgICAgICAgICAgYnVpbGRfdXJsOiBlbnYuREVQTE9ZX1VSTCxcbiAgICAgICAgICAgIGpvYl9uYW1lOiBlbnYuU0lURV9OQU1FLFxuICAgICAgICAgICAgYnVpbGRfbnVtYmVyOiBlbnYuQlVJTERfSURcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBHaXRodWIgQWN0aW9uc1xuICAgIGlmIChpc1RydWUoZW52LkdJVEhVQl9BQ1RJT05TKSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbmFtZTogJ0dpdEh1YiBBY3Rpb25zJyxcbiAgICAgICAgICAgIGJ1aWxkX3VybDogYCR7ZW52LkdJVEhVQl9TRVJWRVJfVVJMfS8ke2Vudi5HSVRIVUJfUkVQT1NJVE9SWX0vYWN0aW9ucy9ydW5zLyR7ZW52LkdJVEhVQl9SVU5fSUR9YCxcbiAgICAgICAgICAgIGpvYl9uYW1lOiBlbnYuR0lUSFVCX1dPUktGTE9XLFxuICAgICAgICAgICAgYnVpbGRfbnVtYmVyOiBlbnYuR0lUSFVCX1JVTl9JRCxcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBWZXJjZWxcbiAgICBpZiAoaXNUcnVlKGVudi5DSSkgJiYgZW52LlZFUkNFTCA9PT0gJzEnKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBuYW1lOiAnVmVyY2VsJyxcbiAgICAgICAgICAgIGJ1aWxkX3VybDogYGh0dHA6Ly8ke2Vudi5WRVJDRUxfVVJMfWAsXG4gICAgICAgICAgICBqb2JfbmFtZTogbnVsbCxcbiAgICAgICAgICAgIGJ1aWxkX251bWJlcjogbnVsbCxcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBUZWFtY2l0eVxuICAgIGlmIChlbnYuVEVBTUNJVFlfVkVSU0lPTikge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbmFtZTogJ1RlYW1jaXR5JyxcbiAgICAgICAgICAgIGJ1aWxkX3VybDogbnVsbCxcbiAgICAgICAgICAgIGpvYl9uYW1lOiBudWxsLFxuICAgICAgICAgICAgYnVpbGRfbnVtYmVyOiBlbnYuQlVJTERfTlVNQkVSLFxuICAgICAgICB9XG4gICAgfVxuICAgIC8vIENvbmNvdXJzZVxuICAgIGlmIChlbnYuQ09OQ09VUlNFIHx8IGVudi5DT05DT1VSU0VfVVJMIHx8IGVudi5DT05DT1VSU0VfVVNFUk5BTUUgfHwgZW52LkNPTkNPVVJTRV9URUFNKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBuYW1lOiAnQ29uY291cnNlJyxcbiAgICAgICAgICAgIGJ1aWxkX3VybDogbnVsbCxcbiAgICAgICAgICAgIGpvYl9uYW1lOiBlbnYuQlVJTERfSk9CX05BTUUgfHwgbnVsbCxcbiAgICAgICAgICAgIGJ1aWxkX251bWJlcjogZW52LkJVSUxEX0lEIHx8IG51bGwsXG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gR29DRFxuICAgIGlmIChlbnYuR09fSk9CX05BTUUpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG5hbWU6ICdHb0NEJyxcbiAgICAgICAgICAgIGJ1aWxkX3VybDogbnVsbCxcbiAgICAgICAgICAgIGpvYl9uYW1lOiBlbnYuR09fSk9CX05BTUUsXG4gICAgICAgICAgICBidWlsZF9udW1iZXI6IGVudi5HT19QSVBFTElORV9DT1VOVEVSLFxuICAgICAgICB9XG4gICAgfVxuICAgIC8vIENvZGVGcmVzaFxuICAgIGlmIChlbnYuQ0ZfQlVJTERfSUQpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG5hbWU6ICdDb2RlRnJlc2gnLFxuICAgICAgICAgICAgYnVpbGRfdXJsOiBlbnYuQ0ZfQlVJTERfVVJMLFxuICAgICAgICAgICAgam9iX25hbWU6IGVudi5DRl9QSVBFTElORV9OQU1FLFxuICAgICAgICAgICAgYnVpbGRfbnVtYmVyOiBlbnYuQ0ZfQlVJTERfSUQsXG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gaWYgbm8gbWF0Y2hlcywgcmV0dXJuIG51bGxcbiAgICByZXR1cm4gbnVsbFxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0R2l0TWV0YURhdGEgKCkge1xuICAgIGNvbnN0IGluZm86IEdpdFJlcG9JbmZvID0gZ2l0UmVwb0luZm8oKVxuICAgIGlmICghaW5mby5jb21tb25HaXREaXIpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGNvbnN0IHsgcmVtb3RlIH0gPSBhd2FpdCBwR2l0Y29uZmlnKGluZm8uY29tbW9uR2l0RGlyKVxuICAgIGNvbnN0IHJlbW90ZXMgPSByZW1vdGUgPyBPYmplY3Qua2V5cyhyZW1vdGUpLm1hcChyZW1vdGVOYW1lID0+ICAoeyBuYW1lOiByZW1vdGVOYW1lLCB1cmw6IHJlbW90ZVtyZW1vdGVOYW1lXS51cmwgfSkpIDogW11cblxuICAgIGxldCBnaXRNZXRhRGF0YSA6IEdpdE1ldGFEYXRhID0ge1xuICAgICAgICBuYW1lOiAnZ2l0JyxcbiAgICAgICAgc2hhOiBpbmZvLnNoYSxcbiAgICAgICAgc2hvcnRfc2hhOiBpbmZvLmFiYnJldmlhdGVkU2hhLFxuICAgICAgICBicmFuY2g6IGluZm8uYnJhbmNoLFxuICAgICAgICB0YWc6IGluZm8udGFnLFxuICAgICAgICBjb21taXR0ZXI6IGluZm8uY29tbWl0dGVyLFxuICAgICAgICBjb21taXR0ZXJfZGF0ZTogaW5mby5jb21taXR0ZXJEYXRlLFxuICAgICAgICBhdXRob3I6IGluZm8uYXV0aG9yLFxuICAgICAgICBhdXRob3JfZGF0ZTogaW5mby5hdXRob3JEYXRlLFxuICAgICAgICBjb21taXRfbWVzc2FnZTogaW5mby5jb21taXRNZXNzYWdlLFxuICAgICAgICByb290OiBpbmZvLnJvb3QsXG4gICAgICAgIGNvbW1vbl9naXRfZGlyOiBpbmZvLmNvbW1vbkdpdERpcixcbiAgICAgICAgd29ya3RyZWVfZ2l0X2RpcjogaW5mby53b3JrdHJlZUdpdERpcixcbiAgICAgICAgbGFzdF90YWc6IGluZm8ubGFzdFRhZyxcbiAgICAgICAgY29tbWl0c19zaW5jZV9sYXN0X3RhZzogaW5mby5jb21taXRzU2luY2VMYXN0VGFnLFxuICAgICAgICByZW1vdGVzOiByZW1vdGVzXG4gICAgfVxuXG4gICAgZ2l0TWV0YURhdGEgPSBjaGVja0FuZFRydW5jYXRlVkNTSW5mbyhnaXRNZXRhRGF0YSlcblxuICAgIHJldHVybiBnaXRNZXRhRGF0YVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0VW5pcXVlSWRlbnRpZmllcih0ZXN0OiBGcmFtZXdvcmtzLlRlc3QsIGZyYW1ld29yaz86IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKGZyYW1ld29yayA9PT0gJ2phc21pbmUnKSB7XG4gICAgICAgIHJldHVybiB0ZXN0LmZ1bGxOYW1lXG4gICAgfVxuXG4gICAgbGV0IHBhcmVudFRpdGxlID0gdGVzdC5wYXJlbnRcbiAgICAvLyBTb21ldGltZXMgcGFyZW50IHdpbGwgYmUgYW4gb2JqZWN0IGluc3RlYWQgb2YgYSBzdHJpbmdcbiAgICBpZiAodHlwZW9mIHBhcmVudFRpdGxlID09PSAnb2JqZWN0Jykge1xuICAgICAgICBwYXJlbnRUaXRsZSA9IChwYXJlbnRUaXRsZSBhcyB7IHRpdGxlOiBzdHJpbmcgfSkudGl0bGVcbiAgICB9XG4gICAgcmV0dXJuIGAke3BhcmVudFRpdGxlfSAtICR7dGVzdC50aXRsZX1gXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRVbmlxdWVJZGVudGlmaWVyRm9yQ3VjdW1iZXIod29ybGQ6IElUZXN0Q2FzZUhvb2tQYXJhbWV0ZXIpOiBzdHJpbmcge1xuICAgIHJldHVybiB3b3JsZC5waWNrbGUudXJpICsgJ18nICsgd29ybGQucGlja2xlLmFzdE5vZGVJZHMuam9pbignLCcpXG59XG5cbi8vIExvYWQgVGVzdGluZyBTZXJ2aWNlIChMVFMpIGdhdGluZyBoZWxwZXJzIFx1MjAxNCBtaXJyb3Igb2YgYnN0YWNrX3V0aWxzL2hlbHBlci5weVxuLy8gaXNfbG9hZF90ZXN0aW5nX3Nlc3Npb24oKSAvIGdldF9sdHNfc2Vzc2lvbl9pZCgpIGluIGJyb3dzZXJzdGFjay1weXRob24tc2RrXG4vLyAoYnJhbmNoIExUUy10cmEtcHl0aG9uLXN1cHBvcnQpLiBMVFMgcG9kLWl0ZXJhdGlvbnMgZXhwb3J0XG4vLyBCUk9XU0VSU1RBQ0tfTFRTX1NFU1NJT05fSUQgYmVmb3JlIGludm9raW5nIHRoZSB0ZXN0IHJ1bm5lcjsgcHJlc2VuY2Ugb2Zcbi8vIHRoYXQgZW52IHZhciBpcyB0aGUgc2luZ2xlIHNvdXJjZSBvZiB0cnV0aCBmb3IgXCJ0aGlzIHJ1biBpcyBhbiBMVFMgcG9kXG4vLyBpdGVyYXRpb25cIi4gT3B0aW9uYWwgQlJPV1NFUlNUQUNLX0xUUz10cnVlfDEgbGV0cyB0aGUgcnVubmVyIG9wdC1pbiB3aXRob3V0XG4vLyBzdXBwbHlpbmcgYSBzZXNzaW9uIGlkICh1c2VmdWwgZm9yIGxvY2FsIHJlcHJvKS5cbmV4cG9ydCBmdW5jdGlvbiBpc0xvYWRUZXN0aW5nU2Vzc2lvbigpOiBib29sZWFuIHtcbiAgICBpZiAocHJvY2Vzcy5lbnZbQlJPV1NFUlNUQUNLX0xUU19TRVNTSU9OX0lEXSkge1xuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cbiAgICBjb25zdCBmbGFnID0gcHJvY2Vzcy5lbnZbQlJPV1NFUlNUQUNLX0xUU11cbiAgICByZXR1cm4gZmxhZyA9PT0gJ3RydWUnIHx8IGZsYWcgPT09ICcxJ1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0THRzU2Vzc2lvbklkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHByb2Nlc3MuZW52W0JST1dTRVJTVEFDS19MVFNfU0VTU0lPTl9JRF0gfHwgJydcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldENsb3VkUHJvdmlkZXIoYnJvd3NlcjogV2ViZHJpdmVySU8uQnJvd3NlciB8IFdlYmRyaXZlcklPLk11bHRpUmVtb3RlQnJvd3Nlcik6IHN0cmluZyB7XG4gICAgLy8gTk9URTogZG8gTk9UIGJyYW5jaCBvbiBpc0xvYWRUZXN0aW5nU2Vzc2lvbigpIGhlcmUuIGdldENsb3VkUHJvdmlkZXIgaXNcbiAgICAvLyBzaGFyZWQgd2l0aCBBdXRvbWF0ZS1zaWRlIGd1YXJkcyAoYXV0b21hdGVNb2R1bGUgb25CZWZvcmUvb25BZnRlclRlc3QsXG4gICAgLy8gd2ViZHJpdmVySU9Nb2R1bGUgS0VZX0lTX0JST1dTRVJTVEFDS19IVUIsIGFjY2Vzc2liaWxpdHktaGFuZGxlcixcbiAgICAvLyBzZXJ2aWNlLnRzKSBcdTIwMTQgZmxpcHBpbmcgaXQgdG8gJ2Jyb3dzZXJzdGFjaycgdW5kZXIgTFRTIHdvdWxkIG1ha2VcbiAgICAvLyBpc0Jyb3dzZXJzdGFja1Nlc3Npb24oKSByZXR1cm4gdHJ1ZSBmb3IgbG9jYWwtU2VsZW5pdW0gcG9kIHNlc3Npb25zLFxuICAgIC8vIGNhdXNpbmcgbWFya1Nlc3Npb25OYW1lIC8gbWFya1Nlc3Npb25TdGF0dXMgdG8gUFVUIGFnYWluc3QgQXV0b21hdGVcbiAgICAvLyBSRVNUIEFQSXMgd2l0aCBzZXNzaW9uIGlkcyB0aGF0IGRvbid0IGV4aXN0IHRoZXJlLiBUZXN0SHViLXJlcG9ydGluZ1xuICAgIC8vIGNhbGxlcnMgdGhhdCBuZWVkICdicm93c2Vyc3RhY2snIHVuZGVyIExUUyBkZXJpdmUgaXQgbG9jYWxseSB3aXRoXG4gICAgLy8gYGlzTG9hZFRlc3RpbmdTZXNzaW9uKCkgPyAnYnJvd3NlcnN0YWNrJyA6IGdldENsb3VkUHJvdmlkZXIoYnJvd3NlcilgXG4gICAgLy8gKHNlZSByZXBvcnRlci50cywgaW5zaWdodHMtaGFuZGxlci50cykuXG4gICAgaWYgKGJyb3dzZXIgJiYgJ2luc3RhbmNlcycgaW4gYnJvd3Nlcikge1xuICAgICAgICAvLyBMb29wIHRocm91Z2ggYWxsIGluc3RhbmNlc1xuICAgICAgICBmb3IgKGNvbnN0IGluc3RhbmNlTmFtZSBvZiBicm93c2VyLmluc3RhbmNlcykge1xuICAgICAgICAgICAgY29uc3QgaW5zdGFuY2UgPSAoYnJvd3NlciBhcyBhbnkpW2luc3RhbmNlTmFtZV0gYXMgV2ViZHJpdmVySU8uQnJvd3NlclxuICAgICAgICAgICAgaWYgKGluc3RhbmNlLm9wdGlvbnMgJiYgaW5zdGFuY2Uub3B0aW9ucy5ob3N0bmFtZSAmJiBpbnN0YW5jZS5vcHRpb25zLmhvc3RuYW1lLmluY2x1ZGVzKCdicm93c2Vyc3RhY2snKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiAnYnJvd3NlcnN0YWNrJ1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSBlbHNlIGlmIChicm93c2VyLm9wdGlvbnMgJiYgYnJvd3Nlci5vcHRpb25zLmhvc3RuYW1lICYmIGJyb3dzZXIub3B0aW9ucy5ob3N0bmFtZS5pbmNsdWRlcygnYnJvd3NlcnN0YWNrJykpIHsgLy8gU2luZ2xlIGJyb3dzZXIgaW5zdGFuY2VcbiAgICAgICAgcmV0dXJuICdicm93c2Vyc3RhY2snXG4gICAgfVxuICAgIHJldHVybiAndW5rbm93bl9ncmlkJ1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNCcm93c2Vyc3RhY2tTZXNzaW9uKGJyb3dzZXI/OiBXZWJkcml2ZXJJTy5Ccm93c2VyIHwgV2ViZHJpdmVySU8uTXVsdGlSZW1vdGVCcm93c2VyKSB7XG4gICAgcmV0dXJuIGJyb3dzZXIgJiYgZ2V0Q2xvdWRQcm92aWRlcihicm93c2VyKS50b0xvd2VyQ2FzZSgpID09PSAnYnJvd3NlcnN0YWNrJ1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0U2NlbmFyaW9FeGFtcGxlcyh3b3JsZDogSVRlc3RDYXNlSG9va1BhcmFtZXRlcikge1xuICAgIGNvbnN0IHNjZW5hcmlvID0gd29ybGQucGlja2xlXG5cbiAgICAvLyBubyBleGFtcGxlcyBwcmVzZW50XG4gICAgaWYgKChzY2VuYXJpby5hc3ROb2RlSWRzICYmIHNjZW5hcmlvLmFzdE5vZGVJZHMubGVuZ3RoIDw9IDEpIHx8IHNjZW5hcmlvLmFzdE5vZGVJZHMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBwaWNrbGVJZDogc3RyaW5nID0gc2NlbmFyaW8uYXN0Tm9kZUlkc1swXVxuICAgIGNvbnN0IGV4YW1wbGVzSWQ6IHN0cmluZyA9IHNjZW5hcmlvLmFzdE5vZGVJZHNbMV1cbiAgICBjb25zdCBnaGVya2luRG9jdW1lbnRDaGlsZHJlbiA9IHdvcmxkLmdoZXJraW5Eb2N1bWVudC5mZWF0dXJlPy5jaGlsZHJlblxuXG4gICAgbGV0IGV4YW1wbGVzOiBzdHJpbmdbXSA9IFtdXG5cbiAgICBnaGVya2luRG9jdW1lbnRDaGlsZHJlbj8uZm9yRWFjaChjaGlsZCA9PiB7XG4gICAgICAgIGlmIChjaGlsZC5ydWxlKSB7XG4gICAgICAgICAgICAvLyBoYW5kbGUgaWYgcnVsZSBpcyBwcmVzZW50XG4gICAgICAgICAgICBjaGlsZC5ydWxlLmNoaWxkcmVuLmZvckVhY2goY2hpbGRMZXZlbDIgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChjaGlsZExldmVsMi5zY2VuYXJpbyAmJiBjaGlsZExldmVsMi5zY2VuYXJpby5pZCA9PT0gcGlja2xlSWQgJiYgY2hpbGRMZXZlbDIuc2NlbmFyaW8uZXhhbXBsZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFzc2VkRXhhbXBsZXMgPSBjaGlsZExldmVsMi5zY2VuYXJpby5leGFtcGxlcy5mbGF0TWFwKCh2YWwpID0+ICh2YWwudGFibGVCb2R5KSkuZmluZCgoaXRlbSkgPT4gaXRlbS5pZCA9PT0gZXhhbXBsZXNJZCk/LmNlbGxzLm1hcCgodmFsKSA9PiAodmFsLnZhbHVlKSlcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBhc3NlZEV4YW1wbGVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBleGFtcGxlcyA9IHBhc3NlZEV4YW1wbGVzXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KVxuICAgICAgICB9IGVsc2UgaWYgKGNoaWxkLnNjZW5hcmlvICYmIGNoaWxkLnNjZW5hcmlvLmlkID09PSBwaWNrbGVJZCAmJiBjaGlsZC5zY2VuYXJpby5leGFtcGxlcykge1xuICAgICAgICAgICAgLy8gaGFuZGxlIGlmIHNjZW5hcmlvIG91dHNpZGUgcnVsZVxuICAgICAgICAgICAgY29uc3QgcGFzc2VkRXhhbXBsZXMgPSBjaGlsZC5zY2VuYXJpby5leGFtcGxlcy5mbGF0TWFwKCh2YWwpID0+ICh2YWwudGFibGVCb2R5KSkuZmluZCgoaXRlbSkgPT4gaXRlbS5pZCA9PT0gZXhhbXBsZXNJZCk/LmNlbGxzLm1hcCgodmFsKSA9PiAodmFsLnZhbHVlKSlcbiAgICAgICAgICAgIGlmIChwYXNzZWRFeGFtcGxlcykge1xuICAgICAgICAgICAgICAgIGV4YW1wbGVzID0gcGFzc2VkRXhhbXBsZXNcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0pXG5cbiAgICBpZiAoZXhhbXBsZXMubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBleGFtcGxlc1xuICAgIH1cbiAgICByZXR1cm5cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlbW92ZUFuc2lDb2xvcnMobWVzc2FnZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAoIW1lc3NhZ2UpIHtcbiAgICAgICAgcmV0dXJuICcnXG4gICAgfVxuICAgIC8vIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vYS8yOTQ5NzY4MFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb250cm9sLXJlZ2V4XG4gICAgcmV0dXJuIG1lc3NhZ2UucmVwbGFjZSgvW1xcdTAwMWJcXHUwMDliXVtbKCkjOz9dKig/OlswLTldezEsNH0oPzo7WzAtOV17MCw0fSkqKT9bMC05QS1PUlpjZi1ucXJ5PT48XS9nLCAnJylcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldExvZ1RhZyhldmVudFR5cGU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKGV2ZW50VHlwZSA9PT0gJ1Rlc3RSdW5TdGFydGVkJyB8fCBldmVudFR5cGUgPT09ICdUZXN0UnVuRmluaXNoZWQnKSB7XG4gICAgICAgIHJldHVybiAnVGVzdF9VcGxvYWQnXG4gICAgfSBlbHNlIGlmIChldmVudFR5cGUgPT09ICdIb29rUnVuU3RhcnRlZCcgfHwgZXZlbnRUeXBlID09PSAnSG9va1J1bkZpbmlzaGVkJykge1xuICAgICAgICByZXR1cm4gJ0hvb2tfVXBsb2FkJ1xuICAgIH0gZWxzZSBpZiAoZXZlbnRUeXBlID09PSAnU2NyZWVuc2hvdENyZWF0ZWQnKSB7XG4gICAgICAgIHJldHVybiAnU2NyZWVuc2hvdF9VcGxvYWQnXG4gICAgfSBlbHNlIGlmIChldmVudFR5cGUgPT09ICdMb2dDcmVhdGVkJykge1xuICAgICAgICByZXR1cm4gJ0xvZ19VcGxvYWQnXG4gICAgfVxuICAgIHJldHVybiAndW5kZWZpbmVkJ1xufVxuXG4vLyBnZXQgaGllcmFyY2h5IGZvciBhIHBhcnRpY3VsYXIgdGVzdCAoY2FsbGVkIGJ5IHJlcG9ydGVyIGZvciBza2lwcGVkIHRlc3RzKVxuZXhwb3J0IGZ1bmN0aW9uIGdldEhpZXJhcmNoeShmdWxsVGl0bGU/OiBzdHJpbmcpIHtcbiAgICBpZiAoIWZ1bGxUaXRsZSkge1xuICAgICAgICByZXR1cm4gW11cbiAgICB9XG4gICAgcmV0dXJuIGZ1bGxUaXRsZS5zcGxpdCgnLicpLnNsaWNlKDAsIC0xKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0SG9va1R5cGUgKGhvb2tOYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmIChob29rTmFtZS5zdGFydHNXaXRoKCdcImJlZm9yZSBlYWNoXCInKSkge1xuICAgICAgICByZXR1cm4gJ0JFRk9SRV9FQUNIJ1xuICAgIH0gZWxzZSBpZiAoaG9va05hbWUuc3RhcnRzV2l0aCgnXCJiZWZvcmUgYWxsXCInKSkge1xuICAgICAgICByZXR1cm4gJ0JFRk9SRV9BTEwnXG4gICAgfSBlbHNlIGlmIChob29rTmFtZS5zdGFydHNXaXRoKCdcImFmdGVyIGVhY2hcIicpKSB7XG4gICAgICAgIHJldHVybiAnQUZURVJfRUFDSCdcbiAgICB9IGVsc2UgaWYgKGhvb2tOYW1lLnN0YXJ0c1dpdGgoJ1wiYWZ0ZXIgYWxsXCInKSkge1xuICAgICAgICByZXR1cm4gJ0FGVEVSX0FMTCdcbiAgICB9XG4gICAgcmV0dXJuICd1bmtub3duJ1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNTY3JlZW5zaG90Q29tbWFuZCAoYXJnczogQmVmb3JlQ29tbWFuZEFyZ3MgfCBBZnRlckNvbW1hbmRBcmdzKSB7XG4gICAgcmV0dXJuIGFyZ3MuZW5kcG9pbnQgJiYgYXJncy5lbmRwb2ludC5pbmNsdWRlcygnL3NjcmVlbnNob3QnKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNCU3RhY2tTZXNzaW9uKGNvbmZpZzogT3B0aW9ucy5UZXN0cnVubmVyKSB7XG4gICAgaWYgKHR5cGVvZiBjb25maWcudXNlciA9PT0gJ3N0cmluZycgJiYgdHlwZW9mIGNvbmZpZy5rZXkgPT09ICdzdHJpbmcnICYmIGNvbmZpZy5rZXkubGVuZ3RoID09PSAyMCkge1xuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2Vcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzQnJvd3NlcnN0YWNrSW5mcmEoY29uZmlnOiBCcm93c2Vyc3RhY2tDb25maWcgJiBPcHRpb25zLlRlc3RydW5uZXIsIGNhcHM/OiBDYXBhYmlsaXRpZXMuQnJvd3NlclN0YWNrQ2FwYWJpbGl0aWVzKTogYm9vbGVhbiB7XG4gICAgLy8gdGhpcyBpcyBhIHV0aWxpdHkgZnVuY3Rpb24gdG8gY2hlY2sgaWYgdGhlIGJhc2ljIHNlc3Npb24gb3IgbXVsdGkgcmVtb3RlIHNlc3Npb24gaXMgcnVubmluZyBvbiBCcm93c2Vyc3RhY2ssIG1haW5seSBieSBjaGVja2luZyB0aGUgaG9zdG5hbWUgcGFyYW1ldGVyIGluIHRoZSBnaXZlbiBjb25maWdcbiAgICAvLyBJbiBjYXNlIGhvc3RuYW1lIGlzIG5vdCBwcmVzZW50IGFueXdoZXJlIGluIHRoZSBjb25maWcsIGl0IHJldHVybnMgdHJ1ZSBieSBkZWZhdWx0IGFzIGhvc3RuYW1lIGlzIG5vdCBhIG1hbmRhdG9yeSBwYXJhbWV0ZXIgaW4gdGhlIGNvbmZpZ1xuXG4gICAgY29uc3QgaXNCcm93c2Vyc3RhY2sgPSAoc3RyOiBzdHJpbmcgKTogYm9vbGVhbiA9PiB7XG4gICAgICAgIHJldHVybiBzdHIgPT09ICdicm93c2Vyc3RhY2suY29tJyB8fCBzdHIuZW5kc1dpdGgoJy5icm93c2Vyc3RhY2suY29tJylcbiAgICB9XG5cbiAgICBpZiAoKGNvbmZpZy5ob3N0bmFtZSkgJiYgIWlzQnJvd3NlcnN0YWNrKGNvbmZpZy5ob3N0bmFtZSkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuXG4gICAgaWYgKGNhcHMgJiYgdHlwZW9mIGNhcHMgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGNhcHMpKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGNhcGFiaWxpdHkgb2YgY2Fwcykge1xuICAgICAgICAgICAgICAgIGlmICgoKGNhcGFiaWxpdHkgYXMgT3B0aW9ucy5UZXN0cnVubmVyKS5ob3N0bmFtZSkgJiYgIWlzQnJvd3NlcnN0YWNrKChjYXBhYmlsaXR5IGFzIE9wdGlvbnMuVGVzdHJ1bm5lcikuaG9zdG5hbWUgYXMgc3RyaW5nKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBjYXBzKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY2FwYWJpbGl0eSA9IGNhcHNba2V5IGFzIGtleW9mIENhcGFiaWxpdGllcy5Ccm93c2VyU3RhY2tDYXBhYmlsaXRpZXNdXG4gICAgICAgICAgICAgICAgaWYgKCgoY2FwYWJpbGl0eSBhcyBPcHRpb25zLlRlc3RydW5uZXIpLmhvc3RuYW1lKSAmJiAhaXNCcm93c2Vyc3RhY2soKGNhcGFiaWxpdHkgYXMgT3B0aW9ucy5UZXN0cnVubmVyKS5ob3N0bmFtZSBhcyBzdHJpbmcpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGlmICghaXNCU3RhY2tTZXNzaW9uKGNvbmZpZykpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWVcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEJyb3dzZXJTdGFja1VzZXJBbmRLZXkoY29uZmlnOiBPcHRpb25zLlRlc3RydW5uZXIsIG9wdGlvbnM6IE9wdGlvbnMuVGVzdHJ1bm5lcikge1xuXG4gICAgLy8gRmFsbGJhY2sgMTogRW52IHZhcmlhYmxlc1xuICAgIC8vIEZhbGxiYWNrIDI6IFNlcnZpY2UgdmFyaWFibGVzIGluIHdkaW8uY29uZi5qcyAodGhhdCBhcmUgcmVjZWl2ZWQgaW5zaWRlIG9wdGlvbnMgb2JqZWN0KVxuICAgIGNvbnN0IGVudk9yU2VydmljZVZhcmlhYmxlcyA9IHtcbiAgICAgICAgdXNlcjogZ2V0QnJvd3NlclN0YWNrVXNlcihvcHRpb25zKSxcbiAgICAgICAga2V5OiBnZXRCcm93c2VyU3RhY2tLZXkob3B0aW9ucylcbiAgICB9XG4gICAgaWYgKGVudk9yU2VydmljZVZhcmlhYmxlcy51c2VyICYmIGVudk9yU2VydmljZVZhcmlhYmxlcy5rZXkpIHtcbiAgICAgICAgcmV0dXJuIGVudk9yU2VydmljZVZhcmlhYmxlc1xuICAgIH1cblxuICAgIC8vIEZhbGxiYWNrIDM6IFNlcnZpY2UgdmFyaWFibGVzIGluIHRlc3RPYnNlcnZhYmlsaXR5T3B0aW9ucyBvYmplY3RcbiAgICAvLyBGYWxsYmFjayA0OiBTZXJ2aWNlIHZhcmlhYmxlcyBpbiB0aGUgdG9wIGxldmVsIGNvbmZpZyBvYmplY3RcbiAgICBjb25zdCBvMTF5VmFyaWFibGVzID0ge1xuICAgICAgICB1c2VyOiBnZXRPYnNlcnZhYmlsaXR5VXNlcihvcHRpb25zLCBjb25maWcpLFxuICAgICAgICBrZXk6IGdldE9ic2VydmFiaWxpdHlLZXkob3B0aW9ucywgY29uZmlnKVxuICAgIH1cbiAgICByZXR1cm4gbzExeVZhcmlhYmxlc1xuXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzaG91bGRBZGRTZXJ2aWNlVmVyc2lvbihjb25maWc6IE9wdGlvbnMuVGVzdHJ1bm5lciwgdGVzdE9ic2VydmFiaWxpdHk/OiBib29sZWFuLCBjYXBzPzogQ2FwYWJpbGl0aWVzLkJyb3dzZXJTdGFja0NhcGFiaWxpdGllcyk6IGJvb2xlYW4ge1xuICAgIGlmICgoY29uZmlnLnNlcnZpY2VzICYmIGNvbmZpZy5zZXJ2aWNlcy50b1N0cmluZygpLmluY2x1ZGVzKCdjaHJvbWVkcml2ZXInKSAmJiB0ZXN0T2JzZXJ2YWJpbGl0eSAhPT0gZmFsc2UpIHx8ICFpc0Jyb3dzZXJzdGFja0luZnJhKGNvbmZpZywgY2FwcykpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICAgIHJldHVybiB0cnVlXG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBiYXRjaEFuZFBvc3RFdmVudHMgKGV2ZW50VXJsOiBzdHJpbmcsIGtpbmQ6IHN0cmluZywgZGF0YTogVXBsb2FkVHlwZVtdKSB7XG4gICAgaWYgKCFwcm9jZXNzLmVudltURVNUT1BTX0JVSUxEX0NPTVBMRVRFRF9FTlZdKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignQnVpbGQgbm90IGNvbXBsZXRlZCB5ZXQnKVxuICAgIH1cblxuICAgIGNvbnN0IGp3dFRva2VuID0gcHJvY2Vzcy5lbnZbQlJPV1NFUlNUQUNLX1RFU1RIVUJfSldUXVxuICAgIGlmICghand0VG9rZW4pIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdNaXNzaW5nIGF1dGhlbnRpY2F0aW9uIFRva2VuJylcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgICBjb25zdCB1cmwgPSBgJHtBUElVdGlscy5EQVRBX0VORFBPSU5UfS8ke2V2ZW50VXJsfWBcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh1cmwsIHtcbiAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICAgICAgIC4uLkRFRkFVTFRfUkVRVUVTVF9DT05GSUcuaGVhZGVycyxcbiAgICAgICAgICAgICAgICAnQXV0aG9yaXphdGlvbic6IGBCZWFyZXIgJHtqd3RUb2tlbn1gXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoZGF0YSlcbiAgICAgICAgfSlcbiAgICAgICAgLy8gcmVhZCBhcyB0ZXh0IGZpcnN0OiBlcnJvciByZXNwb25zZXMgKDQwMS81eHgpIGFuZCBlbXB0eSBib2RpZXMgYXJlIG5vdCBKU09OLCBhbmQgYSBibGluZFxuICAgICAgICAvLyByZXNwb25zZS5qc29uKCkgc3VyZmFjZWQgdGhlbSBhcyBhIG1pc2xlYWRpbmcgXCJVbmV4cGVjdGVkIGVuZCBvZiBKU09OIGlucHV0XCJcbiAgICAgICAgY29uc3QgcmVzcG9uc2VCb2R5ID0gYXdhaXQgcmVzcG9uc2UudGV4dCgpXG4gICAgICAgIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgSFRUUCAke3Jlc3BvbnNlLnN0YXR1c30gJHtyZXNwb25zZS5zdGF0dXNUZXh0fSR7cmVzcG9uc2VCb2R5ID8gYCBcdTIwMTQgJHtyZXNwb25zZUJvZHkuc2xpY2UoMCwgMzAwKX1gIDogJyAoZW1wdHkgYm9keSknfWApXG4gICAgICAgIH1cbiAgICAgICAgQlN0YWNrTG9nZ2VyLmRlYnVnKGBbJHtraW5kfV0gU3VjY2VzcyByZXNwb25zZTogJHtyZXNwb25zZUJvZHl9YClcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBCU3RhY2tMb2dnZXIuZGVidWcoYFske2tpbmR9XSBFWENFUFRJT04gSU4gJHtraW5kfSBSRVFVRVNUIFRPIFRFU1QgUkVQT1JUSU5HIEFORCBBTkFMWVRJQ1MgOiAke2Vycm9yfWApXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignRXhjZXB0aW9uIGluIHJlcXVlc3QgJyArIGVycm9yKVxuICAgIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldE9ic2VydmFiaWxpdHlVc2VyKG9wdGlvbnM6IEJyb3dzZXJzdGFja0NvbmZpZyAmIE9wdGlvbnMuVGVzdHJ1bm5lciwgY29uZmlnOiBPcHRpb25zLlRlc3RydW5uZXIpIHtcbiAgICBpZiAocHJvY2Vzcy5lbnYuQlJPV1NFUlNUQUNLX1VTRVJOQU1FKSB7XG4gICAgICAgIHJldHVybiBwcm9jZXNzLmVudi5CUk9XU0VSU1RBQ0tfVVNFUk5BTUVcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMudGVzdE9ic2VydmFiaWxpdHlPcHRpb25zICYmIG9wdGlvbnMudGVzdE9ic2VydmFiaWxpdHlPcHRpb25zLnVzZXIpIHtcbiAgICAgICAgcmV0dXJuIG9wdGlvbnMudGVzdE9ic2VydmFiaWxpdHlPcHRpb25zLnVzZXJcbiAgICB9XG4gICAgcmV0dXJuIGNvbmZpZy51c2VyXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRPYnNlcnZhYmlsaXR5S2V5KG9wdGlvbnM6IEJyb3dzZXJzdGFja0NvbmZpZyAmIE9wdGlvbnMuVGVzdHJ1bm5lciwgY29uZmlnOiBPcHRpb25zLlRlc3RydW5uZXIpIHtcbiAgICBpZiAocHJvY2Vzcy5lbnYuQlJPV1NFUlNUQUNLX0FDQ0VTU19LRVkpIHtcbiAgICAgICAgcmV0dXJuIHByb2Nlc3MuZW52LkJST1dTRVJTVEFDS19BQ0NFU1NfS0VZXG4gICAgfVxuICAgIGlmIChvcHRpb25zLnRlc3RPYnNlcnZhYmlsaXR5T3B0aW9ucyAmJiBvcHRpb25zLnRlc3RPYnNlcnZhYmlsaXR5T3B0aW9ucy5rZXkpIHtcbiAgICAgICAgcmV0dXJuIG9wdGlvbnMudGVzdE9ic2VydmFiaWxpdHlPcHRpb25zLmtleVxuICAgIH1cbiAgICByZXR1cm4gY29uZmlnLmtleVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0T2JzZXJ2YWJpbGl0eVByb2plY3Qob3B0aW9uczogQnJvd3NlcnN0YWNrQ29uZmlnICYgT3B0aW9ucy5UZXN0cnVubmVyLCBic3RhY2tQcm9qZWN0TmFtZT86IHN0cmluZykge1xuICAgIGlmIChwcm9jZXNzLmVudi5URVNUX09CU0VSVkFCSUxJVFlfUFJPSkVDVF9OQU1FKSB7XG4gICAgICAgIHJldHVybiBwcm9jZXNzLmVudi5URVNUX09CU0VSVkFCSUxJVFlfUFJPSkVDVF9OQU1FXG4gICAgfVxuICAgIGlmIChvcHRpb25zLnRlc3RPYnNlcnZhYmlsaXR5T3B0aW9ucyAmJiBvcHRpb25zLnRlc3RPYnNlcnZhYmlsaXR5T3B0aW9ucy5wcm9qZWN0TmFtZSkge1xuICAgICAgICByZXR1cm4gb3B0aW9ucy50ZXN0T2JzZXJ2YWJpbGl0eU9wdGlvbnMucHJvamVjdE5hbWVcbiAgICB9XG4gICAgcmV0dXJuIGJzdGFja1Byb2plY3ROYW1lXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRPYnNlcnZhYmlsaXR5QnVpbGQob3B0aW9uczogQnJvd3NlcnN0YWNrQ29uZmlnICYgT3B0aW9ucy5UZXN0cnVubmVyLCBic3RhY2tCdWlsZE5hbWU/OiBzdHJpbmcpIHtcbiAgICBpZiAocHJvY2Vzcy5lbnYuVEVTVF9PQlNFUlZBQklMSVRZX0JVSUxEX05BTUUpIHtcbiAgICAgICAgcmV0dXJuIHByb2Nlc3MuZW52LlRFU1RfT0JTRVJWQUJJTElUWV9CVUlMRF9OQU1FXG4gICAgfVxuICAgIGlmIChvcHRpb25zLnRlc3RPYnNlcnZhYmlsaXR5T3B0aW9ucyAmJiBvcHRpb25zLnRlc3RPYnNlcnZhYmlsaXR5T3B0aW9ucy5idWlsZE5hbWUpIHtcbiAgICAgICAgcmV0dXJuIG9wdGlvbnMudGVzdE9ic2VydmFiaWxpdHlPcHRpb25zLmJ1aWxkTmFtZVxuICAgIH1cbiAgICByZXR1cm4gYnN0YWNrQnVpbGROYW1lIHx8IHBhdGguYmFzZW5hbWUocGF0aC5yZXNvbHZlKHByb2Nlc3MuY3dkKCkpKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0T2JzZXJ2YWJpbGl0eUJ1aWxkVGFncyhvcHRpb25zOiBCcm93c2Vyc3RhY2tDb25maWcgJiBPcHRpb25zLlRlc3RydW5uZXIsIGJzdGFja0J1aWxkVGFnPzogc3RyaW5nKTogc3RyaW5nW10ge1xuICAgIGlmIChwcm9jZXNzLmVudi5URVNUX09CU0VSVkFCSUxJVFlfQlVJTERfVEFHKSB7XG4gICAgICAgIHJldHVybiBwcm9jZXNzLmVudi5URVNUX09CU0VSVkFCSUxJVFlfQlVJTERfVEFHLnNwbGl0KCcsJylcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMudGVzdE9ic2VydmFiaWxpdHlPcHRpb25zICYmIG9wdGlvbnMudGVzdE9ic2VydmFiaWxpdHlPcHRpb25zLmJ1aWxkVGFnKSB7XG4gICAgICAgIHJldHVybiBvcHRpb25zLnRlc3RPYnNlcnZhYmlsaXR5T3B0aW9ucy5idWlsZFRhZ1xuICAgIH1cbiAgICBpZiAoYnN0YWNrQnVpbGRUYWcpIHtcbiAgICAgICAgcmV0dXJuIFtic3RhY2tCdWlsZFRhZ11cbiAgICB9XG4gICAgcmV0dXJuIFtdXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRUZXN0UGxhbklkKG9wdGlvbnM6IEJyb3dzZXJzdGFja0NvbmZpZyAmIE9wdGlvbnMuVGVzdHJ1bm5lcik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHByb2Nlc3MuZW52W0JST1dTRVJTVEFDS19URVNUX1BMQU5fSURdKSB7XG4gICAgICAgIHJldHVybiBwcm9jZXNzLmVudltCUk9XU0VSU1RBQ0tfVEVTVF9QTEFOX0lEXVxuICAgIH1cbiAgICBjb25zdCBDTElfQVJHID0gJy0tYnJvd3NlcnN0YWNrLnRlc3RNYW5hZ2VtZW50T3B0aW9ucy50ZXN0UGxhbklkJ1xuICAgIGNvbnN0IGFyZ0luZGV4ID0gcHJvY2Vzcy5hcmd2LmluZGV4T2YoQ0xJX0FSRylcbiAgICBpZiAoYXJnSW5kZXggIT09IC0xICYmIHByb2Nlc3MuYXJndlthcmdJbmRleCArIDFdKSB7XG4gICAgICAgIHJldHVybiBwcm9jZXNzLmFyZ3ZbYXJnSW5kZXggKyAxXVxuICAgIH1cbiAgICBjb25zdCBhcmdXaXRoRXF1YWxzID0gcHJvY2Vzcy5hcmd2LmZpbmQoKGFyZykgPT4gYXJnLnN0YXJ0c1dpdGgoYCR7Q0xJX0FSR309YCkpXG4gICAgaWYgKGFyZ1dpdGhFcXVhbHMpIHtcbiAgICAgICAgcmV0dXJuIGFyZ1dpdGhFcXVhbHMuc3BsaXQoJz0nKVsxXVxuICAgIH1cbiAgICBjb25zdCB0ZXN0UGxhbklkID0gb3B0aW9ucy50ZXN0TWFuYWdlbWVudE9wdGlvbnM/LnRlc3RQbGFuSWRcbiAgICBpZiAodHlwZW9mIHRlc3RQbGFuSWQgPT09ICdzdHJpbmcnICYmIHRlc3RQbGFuSWQudHJpbSgpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgcmV0dXJuIHRlc3RQbGFuSWQudHJpbSgpXG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWRcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEJyb3dzZXJTdGFja1VzZXIoY29uZmlnOiBPcHRpb25zLlRlc3RydW5uZXIpIHtcbiAgICBpZiAocHJvY2Vzcy5lbnYuQlJPV1NFUlNUQUNLX1VTRVJOQU1FKSB7XG4gICAgICAgIHJldHVybiBwcm9jZXNzLmVudi5CUk9XU0VSU1RBQ0tfVVNFUk5BTUUgYXMgc3RyaW5nXG4gICAgfVxuICAgIHJldHVybiBjb25maWcudXNlciBhcyBzdHJpbmdcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEJyb3dzZXJTdGFja0tleShjb25maWc6IE9wdGlvbnMuVGVzdHJ1bm5lcikge1xuICAgIGlmIChwcm9jZXNzLmVudi5CUk9XU0VSU1RBQ0tfQUNDRVNTX0tFWSkge1xuICAgICAgICByZXR1cm4gcHJvY2Vzcy5lbnYuQlJPV1NFUlNUQUNLX0FDQ0VTU19LRVlcbiAgICB9XG4gICAgcmV0dXJuIGNvbmZpZy5rZXlcbn1cblxuLy8gU2Vzc2lvbnMgYXV0aGVudGljYXRlIHdpdGggY29uZmlnLnVzZXIsIGJ1dCB0aGUgQ0xJIC8gVGVzdCBSZXBvcnRpbmcgYnVpbGQgcHJlZmVycyB0aGVcbi8vIGVudiBjcmVkZW50aWFscywgdGhlbiB0ZXN0T2JzZXJ2YWJpbGl0eU9wdGlvbnMudXNlciBcdTIwMTQgYSBtaXNtYXRjaCBzcGxpdHMgb25lIHJ1biBhY3Jvc3MgdHdvIGFjY291bnRzLlxuZXhwb3J0IGZ1bmN0aW9uIGdldENyZWRlbnRpYWxNaXNtYXRjaFdhcm5pbmcob3B0aW9uczogQnJvd3NlcnN0YWNrQ29uZmlnICYgT3B0aW9ucy5UZXN0cnVubmVyLCBjb25maWc6IE9wdGlvbnMuVGVzdHJ1bm5lcik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgaHViVXNlciA9IGNvbmZpZy51c2VyXG4gICAgaWYgKHR5cGVvZiBodWJVc2VyICE9PSAnc3RyaW5nJyB8fCBodWJVc2VyLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkXG4gICAgfVxuXG4gICAgbGV0IHNvdXJjZTogc3RyaW5nIHwgdW5kZWZpbmVkXG4gICAgbGV0IHJlcG9ydGluZ1VzZXI6IHN0cmluZyB8IHVuZGVmaW5lZFxuICAgIGZvciAoY29uc3QgZW52VmFyIG9mIFsnQlJPV1NFUlNUQUNLX1VTRVJOQU1FJywgJ0JST1dTRVJTVEFDS19VU0VSX05BTUUnXSkge1xuICAgICAgICBpZiAocHJvY2Vzcy5lbnZbZW52VmFyXSkge1xuICAgICAgICAgICAgc291cmNlID0gYHRoZSAke2VudlZhcn0gZW52aXJvbm1lbnQgdmFyaWFibGVgXG4gICAgICAgICAgICByZXBvcnRpbmdVc2VyID0gcHJvY2Vzcy5lbnZbZW52VmFyXVxuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAoIXNvdXJjZSAmJiBvcHRpb25zLnRlc3RPYnNlcnZhYmlsaXR5T3B0aW9ucz8udXNlcikge1xuICAgICAgICBzb3VyY2UgPSAndGVzdE9ic2VydmFiaWxpdHlPcHRpb25zLnVzZXInXG4gICAgICAgIHJlcG9ydGluZ1VzZXIgPSBvcHRpb25zLnRlc3RPYnNlcnZhYmlsaXR5T3B0aW9ucy51c2VyXG4gICAgfVxuXG4gICAgaWYgKCFzb3VyY2UgfHwgcmVwb3J0aW5nVXNlciA9PT0gaHViVXNlcikge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkXG4gICAgfVxuXG4gICAgcmV0dXJuIGBCcm93c2VyU3RhY2sgY3JlZGVudGlhbCBtaXNtYXRjaDogdGhlIFxcYHVzZXJcXGAgaW4geW91ciBXZWJkcml2ZXJJTyBjb25maWcgYW5kICR7c291cmNlfSBwb2ludCB0byBkaWZmZXJlbnQgQnJvd3NlclN0YWNrIGFjY291bnRzLiBgICtcbiAgICAgICAgYFRlc3Qgc2Vzc2lvbnMgYXJlIGNyZWF0ZWQgd2l0aCB0aGUgY29uZmlnIFxcYHVzZXJcXGAsIGJ1dCBUZXN0IFJlcG9ydGluZyAmIEFuYWx5dGljcyBidWlsZHMgYXJlIGNyZWF0ZWQgd2l0aCAke3NvdXJjZX0sIGAgK1xuICAgICAgICAnc28gdGhpcyBydW5cXCdzIHRlc3QgcmVzdWx0cyB3aWxsIG5vdCBhcHBlYXIgdW5kZXIgdGhlIHNhbWUgYWNjb3VudCBhcyBpdHMgc2Vzc2lvbnMuICcgK1xuICAgICAgICBgVXNlIHRoZSBzYW1lIEJyb3dzZXJTdGFjayBjcmVkZW50aWFscyBpbiBib3RoIHBsYWNlcyAob3IgcmVtb3ZlICR7c291cmNlfSkgdG8gc2VlIHRoZW0gdG9nZXRoZXIuYFxufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNVbmRlZmluZWQodmFsdWU6IHVua25vd24pIHtcbiAgICBsZXQgcmVzID0gKHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsdWUgPT09IG51bGwpXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmVzID0gcmVzIHx8IHZhbHVlID09PSAnJ1xuICAgIH1cbiAgICByZXR1cm4gcmVzXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1RydWUodmFsdWU/OiB1bmtub3duKSB7XG4gICAgcmV0dXJuICh2YWx1ZSArICcnKS50b0xvd2VyQ2FzZSgpID09PSAndHJ1ZSdcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzRmFsc2UodmFsdWU/OiB1bmtub3duKSB7XG4gICAgcmV0dXJuICh2YWx1ZSArICcnKS50b0xvd2VyQ2FzZSgpID09PSAnZmFsc2UnXG59XG5cbi8qKlxuICogc2tpcEFwcE92ZXJyaWRlIHZhbGlkYXRpb24gY2hva2Vwb2ludCBcdTIwMTQgcG9ydGVkIGZyb20gdGhlIE5vZGUgU0RLJ3NcbiAqIHZhbGlkYXRlU2tpcEFwcE92ZXJyaWRlIChoZWxwZXIuanMpIC8gSmF2YSBCcm93c2VyU3RhY2tKYXZhQWdlbnQucHJvY2Vzc0FwcE9wdGlvbnMuXG4gKiBDYWxsZWQgT05DRSBmcm9tIHRoZSBsYXVuY2hlciAobWFpbiBwcm9jZXNzLCBwcmUtc2Vzc2lvbikuIEVtaXRzIHRoZSBmaXhlZCB3YXJuaW5nLFxuICogaGFuZGxlcyB0aGUgdGhyZWUgZWRnZSBjYXNlcywgYW5kIGNsZWFycyB0aGUgYXBwIG9uIGNvbmZsaWN0IHNvIGl0IGlzIG5laXRoZXIgdXBsb2FkZWRcbiAqIG5vciBpbmplY3RlZC4gVGhlcmUgaXMgTk8gVGllci0yIGJyYW5jaDogZXZlcnkgV2ViZHJpdmVySU8gdGVzdCBmcmFtZXdvcmtcbiAqIChtb2NoYS9qYXNtaW5lL2N1Y3VtYmVyKSBzdXBwb3J0cyBBcHAgQXV0b21hdGUuXG4gKlxuICogVGhlIHN0YW5kYXJkIHdhcm5pbmcgYW5kIHRoZSBlZGdlLTIgZXJyb3IgYXJlIHZlcmJhdGltIHdpdGggdGhlIG90aGVyIEJyb3dzZXJTdGFjayBTREtzXG4gKiAoQnJvd3NlclN0YWNrSmF2YUFnZW50I3Byb2Nlc3NBcHBPcHRpb25zKS4gVGhlIGVkZ2UtMSBjb25mbGljdCB3YXJuaW5nIGlzIElOVEVOVElPTkFMTFkgYWRhcHRlZCBmb3JcbiAqIFdlYmRyaXZlcklPIFx1MjAxNCBpdCBzYXlzIFwiYnJvd3NlcnN0YWNrIHNlcnZpY2Ugb3B0aW9uc1wiICh3aGVyZSBXRElPIHJlYWRzIGBhcHBgKSwgbm90IFwiYnJvd3NlcnN0YWNrLnltbFwiIFx1MjAxNFxuICogc28gcGxlYXNlIGRvIE5PVCBcImZpeFwiIGl0IGJhY2sgdG8gdGhlIHltbCB3b3JkaW5nIHRvIG1hdGNoIHRoZSBvdGhlciBTREtzLlxuICogR3JhY2VmdWw6IG5ldmVyIHRocm93cyBleGNlcHQgdGhlIGRlbGliZXJhdGUgZWRnZS0yIGNvbmZpZyBlcnJvciAoZXhwbGljaXQgZmFsc2UgKyBubyBhcHApLFxuICogd2hpY2ggZmlyZXMgcHJlLXNlc3Npb24gc28gdGhlIHJ1biBhYm9ydHMgY2xlYW5seS5cbiAqXG4gKiBNdXRhdGVzIGBvcHRpb25zLmFwcGAgKGVkZ2UtMSkuIDMtc3RhdGUgdmlhIGlzVHJ1ZS9pc0ZhbHNlIFx1MjAxNCBuZXZlciBgIW9wdGlvbnMuc2tpcEFwcE92ZXJyaWRlYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlU2tpcEFwcE92ZXJyaWRlKG9wdGlvbnM/OiBCcm93c2Vyc3RhY2tDb25maWcgJiBCcm93c2Vyc3RhY2tPcHRpb25zKSB7XG4gICAgaWYgKGlzVW5kZWZpbmVkKG9wdGlvbnMpKSB7XG4gICAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IHNraXBBcHBPdmVycmlkZSA9IChvcHRpb25zIGFzIEJyb3dzZXJzdGFja0NvbmZpZykuc2tpcEFwcE92ZXJyaWRlXG4gICAgY29uc3QgYWxyZWFkeVdhcm5lZCA9IGlzVHJ1ZShwcm9jZXNzLmVudi5CUk9XU0VSU1RBQ0tfU0tJUF9BUFBfT1ZFUlJJREVfV0FSTkVEKVxuXG4gICAgLy8gU3RhbmRhcmQgd2FybmluZyBcdTIwMTQgZmlyZXMgd2hlbmV2ZXIgc2tpcEFwcE92ZXJyaWRlIGlzIHRydWUsIGJlZm9yZSBhbnkgZWRnZSByZXR1cm4uXG4gICAgaWYgKGlzVHJ1ZShza2lwQXBwT3ZlcnJpZGUpICYmICFhbHJlYWR5V2FybmVkKSB7XG4gICAgICAgIEJTdGFja0xvZ2dlci53YXJuKCdbQnJvd3NlclN0YWNrXSBcXCdza2lwQXBwT3ZlcnJpZGU6IHRydWVcXCcgaXMgc2V0LiBUaGUgU0RLIHdpbGwgdHJlYXQgdGhpcyBzZXNzaW9uIGFzIEFwcCBBdXRvbWF0ZSBhbmQgd2lsbCBOT1QgbWFuYWdlIGFwcCB1cGxvYWQgb3IgaW5qZWN0IGFwcCBjYXBhYmlsaXRpZXMuIElmIHlvdSBpbnRlbmRlZCB0byBydW4gYW4gQXV0b21hdGUgKGJyb3dzZXIvd2Vic2l0ZSkgc2Vzc2lvbiwgcmVtb3ZlIFxcJ3NraXBBcHBPdmVycmlkZVxcJyBcdTIwMTQgbGVhdmluZyBpdCBzZXQgd2lsbCBjYXVzZSBBdXRvbWF0ZSBzZXNzaW9ucyB0byBiZWhhdmUgaW5jb3JyZWN0bHkuJylcbiAgICAgICAgcHJvY2Vzcy5lbnYuQlJPV1NFUlNUQUNLX1NLSVBfQVBQX09WRVJSSURFX1dBUk5FRCA9ICd0cnVlJ1xuICAgIH1cblxuICAgIC8vIEVkZ2UgMTogYXBwIHNwZWNpZmllZCArIHNraXBBcHBPdmVycmlkZTp0cnVlIFx1MjE5MiB3YXJuLCBjbGVhciB0aGUgYXBwIHNvIGl0IGlzIG5vdFxuICAgIC8vIHVwbG9hZGVkL2luamVjdGVkLCBwcm9jZWVkIEFwcCBBdXRvbWF0ZS5cbiAgICBpZiAoaXNUcnVlKHNraXBBcHBPdmVycmlkZSkgJiYgIWlzVW5kZWZpbmVkKChvcHRpb25zIGFzIEJyb3dzZXJzdGFja0NvbmZpZykuYXBwKSkge1xuICAgICAgICBCU3RhY2tMb2dnZXIud2FybignQ29uZmxpY3QgZGV0ZWN0ZWQuIHNraXBBcHBPdmVycmlkZTogdHJ1ZSBpcyBhY3RpdmU7IGlnbm9yaW5nIHRoZSBhcHAgcHJvdmlkZWQgaW4gdGhlIGJyb3dzZXJzdGFjayBzZXJ2aWNlIG9wdGlvbnMuJylcbiAgICAgICAgOyhvcHRpb25zIGFzIEJyb3dzZXJzdGFja0NvbmZpZykuYXBwID0gdW5kZWZpbmVkXG4gICAgICAgIHJldHVyblxuICAgIH1cblxuICAgIC8vIEVkZ2UgMjogYXBwIG5vdCBzcGVjaWZpZWQgKyBza2lwQXBwT3ZlcnJpZGUgZXhwbGljaXRseSBmYWxzZSBcdTIxOTIgcHJlLXNlc3Npb24gY29uZmlnIGVycm9yLlxuICAgIGlmIChpc0ZhbHNlKHNraXBBcHBPdmVycmlkZSkgJiYgaXNVbmRlZmluZWQoKG9wdGlvbnMgYXMgQnJvd3NlcnN0YWNrQ29uZmlnKS5hcHApKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignQXBwIGNhcGFiaWxpdHkgaXMgbWlzc2luZy4gV2hlbiBza2lwQXBwT3ZlcnJpZGUgaXMgc2V0IHRvIFxcJ2ZhbHNlXFwnLCBhIHZhbGlkIGFwcCBjYXBhYmlsaXR5IChoYXNoL3NoYXJlYWJsZSBpZC9wYXRoL2N1c3RvbV9pZCkgbXVzdCBiZSBwcm92aWRlZC4nKVxuICAgIH1cblxuICAgIC8vIEVkZ2UgMyAoYW5kIGRlZmF1bHQpOiB1bnNldCArIG5vIGFwcCBcdTIxOTIgdW5jaGFuZ2VkIGJlaGF2aW9yIChuby1vcCkuXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmcmFtZXdvcmtTdXBwb3J0c0hvb2soaG9vazogc3RyaW5nLCBmcmFtZXdvcms/OiBzdHJpbmcpIHtcbiAgICBpZiAoZnJhbWV3b3JrID09PSAnbW9jaGEnICYmIChob29rID09PSAnYmVmb3JlJyB8fCBob29rID09PSAnYWZ0ZXInIHx8IGhvb2sgPT09ICdiZWZvcmVFYWNoJyB8fCBob29rID09PSAnYWZ0ZXJFYWNoJykpIHtcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG5cbiAgICBpZiAoZnJhbWV3b3JrID09PSAnY3VjdW1iZXInKSB7XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlXG59XG5cbmV4cG9ydCBjb25zdCBwYXRjaENvbnNvbGVMb2dzID0gbzExeUVycm9ySGFuZGxlcigoKSA9PiB7XG4gICAgY29uc3QgQlNUZXN0T3BzUGF0Y2hlciA9IG5ldyBsb2dQYXRjaGVyKHt9KVxuXG4gICAgT2JqZWN0LmtleXMoY29uc29sZUhvbGRlcikuZm9yRWFjaCgobWV0aG9kOiBrZXlvZiB0eXBlb2YgY29uc29sZSkgPT4ge1xuICAgICAgICBpZiAoIShtZXRob2QgaW4gY29uc29sZSkgfHwgbWV0aG9kID09PSAnQ29uc29sZScgfHwgdHlwZW9mIGNvbnNvbGVbbWV0aG9kXSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLmRlYnVnKGBTa2lwcGluZyBtZXRob2Q6ICR7bWV0aG9kfSwgZXhpc3RzOiAke21ldGhvZCBpbiBjb25zb2xlfSwgdHlwZTogJHt0eXBlb2YgY29uc29sZVttZXRob2RdfWApXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBvcmlnTWV0aG9kOiBGdW5jdGlvbiA9IGNvbnNvbGVbbWV0aG9kXS5iaW5kKGNvbnNvbGUpXG5cbiAgICAgICAgY29uc29sZVttZXRob2RdID0gKC4uLmFyZ3M6IHVua25vd25bXSkgPT4ge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBpZiAoIU9iamVjdC5rZXlzKEJTVGVzdE9wc1BhdGNoZXIpLmluY2x1ZGVzKG1ldGhvZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgb3JpZ01ldGhvZCguLi5hcmdzKVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIG9yaWdNZXRob2QoLi4uYXJncyk7XG4gICAgICAgICAgICAgICAgICAgIChCU1Rlc3RPcHNQYXRjaGVyIGFzIGFueSlbbWV0aG9kXSguLi5hcmdzKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLmRlYnVnKGBFcnJvciB3aGlsZSBwYXRjaGluZyBjb25zb2xlIGxvZ3MgOiAke2Vycm9yfWApXG4gICAgICAgICAgICAgICAgb3JpZ01ldGhvZCguLi5hcmdzKVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSlcbn0pXG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRGYWlsdXJlT2JqZWN0KGVycm9yOiBzdHJpbmd8RXJyb3IpIHtcbiAgICBjb25zdCBzdGFjayA9IChlcnJvciBhcyBFcnJvcikuc3RhY2tcbiAgICBjb25zdCBtZXNzYWdlID0gdHlwZW9mIGVycm9yID09PSAnc3RyaW5nJyA/IGVycm9yIDogZXJyb3IubWVzc2FnZVxuICAgIGNvbnN0IGJhY2t0cmFjZSA9IHN0YWNrID8gcmVtb3ZlQW5zaUNvbG9ycyhzdGFjay50b1N0cmluZygpKSA6ICcnXG5cbiAgICByZXR1cm4ge1xuICAgICAgICBmYWlsdXJlOiBbeyBiYWNrdHJhY2U6IFtiYWNrdHJhY2VdIH1dLFxuICAgICAgICBmYWlsdXJlX3JlYXNvbjogcmVtb3ZlQW5zaUNvbG9ycyhtZXNzYWdlLnRvU3RyaW5nKCkpLFxuICAgICAgICBmYWlsdXJlX3R5cGU6IG1lc3NhZ2UgPyAobWVzc2FnZS50b1N0cmluZygpLm1hdGNoKC9Bc3NlcnRpb25FcnJvci8pID8gJ0Fzc2VydGlvbkVycm9yJyA6ICdVbmhhbmRsZWRFcnJvcicpIDogbnVsbFxuICAgIH1cbn1cblxuZXhwb3J0IGNvbnN0IHNsZWVwID0gKG1zID0gMTAwKSA9PiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gc2V0VGltZW91dChyZXNvbHZlLCBtcykpXG5cbmV4cG9ydCBpbnRlcmZhY2UgVXBsb2FkTG9nc09wdGlvbnMge1xuICAgIC8qIG9wdC1vdXQsIG1pcnJvcmluZyB0aGUgTm9kZSBTREsncyBgZGlzYWJsZUF1dG9DYXB0dXJlTG9nc2AgKi9cbiAgICBkaXNhYmxlQXV0b0NhcHR1cmVMb2dzPzogYm9vbGVhblxuICAgIC8qIHBhcnNlZCB3ZGlvIGNvbmZpZywgdXNlZCB0byBsb2NhdGUgdGhlIHVzZXIncyBjb25maWcgZmlsZSAqL1xuICAgIGNvbmZpZz86IE9wdGlvbnMuVGVzdHJ1bm5lclxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdXBsb2FkTG9ncyh1c2VyOiBzdHJpbmcgfCB1bmRlZmluZWQsIGtleTogc3RyaW5nIHwgdW5kZWZpbmVkLCBjbGllbnRCdWlsZFV1aWQ6IHN0cmluZywgb3B0aW9uczogVXBsb2FkTG9nc09wdGlvbnMgPSB7fSkge1xuICAgIC8vIE1hbnVhbCBpbnN0cnVtZW50YXRpb246IHRhZyBldmVyeSByZXR1cm4gcGF0aCBvbiB0aGUgU0RLX1VQTE9BRF9MT0dTIGV2ZW50IHNvXG4gICAgLy8gdGhlIG1ldHJpYyBpZGVudGlmaWVzIHRoZSBzcGVjaWZpYyByZWFzb24gbG9ncyB3ZXJlIG5vdCB1cGxvYWRlZCAobm8gY3JlZHMsXG4gICAgLy8gcGVyLWZpbGUgY29weSBmYWlsdXJlLCB1cGxvYWQgbm8tcmVzcG9uc2UsIGV4Y2VwdGlvbikuIG1lYXN1cmVXcmFwcGVyIHdvdWxkXG4gICAgLy8gb3RoZXJ3aXNlIG1hcmsgYWxsIG5vbi10aHJvd2luZyBwYXRocyBhcyBzdWNjZXNzLlxuICAgIGNvbnN0IGV2ZW50TmFtZSA9IFBFUkZPUk1BTkNFX1NES19FVkVOVFMuRVZFTlRTLlNES19VUExPQURfTE9HU1xuICAgIGxldCBzdWNjZXNzID0gdHJ1ZVxuICAgIGxldCBmYWlsdXJlOiBzdHJpbmcgfCB1bmRlZmluZWRcbiAgICAvLyBTdGFnaW5nIGRpciBmb3IgdGhlIGFyY2hpdmUuIENyZWF0ZWQgcGVyIHJ1bjogdGhlIHByZXZpb3VzIGZpeGVkIGB0bXBkaXIoKS9sb2dzLnRhcmBcbiAgICAvLyBuYW1lcyBtZWFudCB0d28gY29uY3VycmVudCB3ZGlvIHJ1bnMgb24gb25lIENJIGhvc3QgY2xvYmJlcmVkIGFuZCB1bmxpbmtlZCBlYWNoXG4gICAgLy8gb3RoZXIncyBhcmNoaXZlcywgYW5kIGEgc291cmNlIGZpbGUgdGhhdCBhbHJlYWR5IGxpdmVkIGluIHRtcGRpciB3YXMgY29waWVkIG9udG9cbiAgICAvLyBpdHNlbGYgYW5kIHRoZW4gZGVsZXRlZCBieSBjbGVhbnVwLlxuICAgIGxldCBzdGFnaW5nRGlyOiBzdHJpbmcgfCB1bmRlZmluZWRcbiAgICBQZXJmb3JtYW5jZVRlc3Rlci5zdGFydChldmVudE5hbWUpXG5cbiAgICB0cnkge1xuICAgICAgICAvLyBpc0F1dG9DYXB0dXJlTG9nc0Rpc2FibGVkIChub3Qgb3B0aW9ucy5kaXNhYmxlQXV0b0NhcHR1cmVMb2dzKSBzbyB0aGUgZGV0YWNoZWRcbiAgICAgICAgLy8gY2xlYW51cCBwcm9jZXNzIFx1MjAxNCB3aGljaCBjYWxscyB0aGlzIHdpdGggbm8gb3B0aW9ucyBcdTIwMTQgc3RpbGwgaG9ub3VycyB0aGUgb3B0LW91dFxuICAgICAgICAvLyB2aWEgdGhlIGVudiB2YXIgdGhlIGxhdW5jaGVyIHB1Ymxpc2hlcy5cbiAgICAgICAgaWYgKGlzQXV0b0NhcHR1cmVMb2dzRGlzYWJsZWQob3B0aW9ucykpIHtcbiAgICAgICAgICAgIHN1Y2Nlc3MgPSBmYWxzZVxuICAgICAgICAgICAgZmFpbHVyZSA9ICdza2lwcGVkOiBkaXNhYmxlQXV0b0NhcHR1cmVMb2dzPXRydWUnXG4gICAgICAgICAgICBCU3RhY2tMb2dnZXIuZGVidWcoJ1NraXBwaW5nIGxvZyB1cGxvYWQsIGF1dG8tY2FwdHVyZSBpcyBkaXNhYmxlZCcpXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdXNlciB8fCAha2V5KSB7XG4gICAgICAgICAgICBzdWNjZXNzID0gZmFsc2VcbiAgICAgICAgICAgIGZhaWx1cmUgPSAnc2tpcHBlZDogbWlzc2luZ19jcmVkZW50aWFscydcbiAgICAgICAgICAgIEJTdGFja0xvZ2dlci5kZWJ1ZygnVXBsb2FkaW5nIGxvZ3MgZmFpbGVkIGR1ZSB0byBubyBjcmVkZW50aWFscycpXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIHN0YWdpbmdEaXIgPSBmcy5ta2R0ZW1wU3luYyhwYXRoLmpvaW4odG1wZGlyKCksICdic3RhY2std2Rpby1sb2dzLScpKVxuICAgICAgICBjb25zdCB0bXBEaXIgPSBzdGFnaW5nRGlyXG4gICAgICAgIGNvbnN0IHRhclBhdGggPSBwYXRoLmpvaW4odG1wRGlyLCAnbG9ncy50YXInKVxuICAgICAgICBjb25zdCB0YXJHelBhdGggPSBwYXRoLmpvaW4odG1wRGlyLCAnbG9ncy50YXIuZ3onKVxuXG4gICAgICAgIC8vIEFyY2hpdmUgZW50cmllcyBhcmUga2V5ZWQgYnkgYmFzZW5hbWUsIHNvIHR3byBzb3VyY2VzIHNoYXJpbmcgb25lIGJhc2VuYW1lIHdvdWxkXG4gICAgICAgIC8vIHNpbGVudGx5IG92ZXJ3cml0ZSBlYWNoIG90aGVyIFx1MjAxNCByZWFjaGFibGUgbm93IHRoYXQgdXNlci1zdXBwbGllZCBjb25maWcgcGF0aHNcbiAgICAgICAgLy8gKGUuZy4gY29uZmlncy93ZGlvLmNvbmYudHMgKyBzaGFyZWQvd2Rpby5jb25mLnRzKSBqb2luIHRoZSBhcmNoaXZlLlxuICAgICAgICAvLyBTYW1lIGhlbHBlciBjb2xsZWN0Q29uZmlnRmlsZXNGb3JVcGxvYWQgdXNlcywgc28gdGhlIHR3byBjYW5ub3QgZGlzYWdyZWUuXG4gICAgICAgIGNvbnN0IHRha2VuTmFtZXMgPSBuZXcgU2V0PHN0cmluZz4oWydsb2dzLnRhcicsICdsb2dzLnRhci5neiddKVxuICAgICAgICBjb25zdCBjb3BpZWRGaWxlTmFtZXM6IHN0cmluZ1tdID0gW11cbiAgICAgICAgY29uc3QgYXJjaGl2ZUFkZEZhaWx1cmVzOiBzdHJpbmdbXSA9IFtdXG4gICAgICAgIGNvbnN0IHVuaXF1ZU5hbWUgPSAoZmlsZVBhdGg6IHN0cmluZyk6IHN0cmluZyA9PiBkZWR1cGVFbnRyeU5hbWUoZmlsZVBhdGgsIHRha2VuTmFtZXMpXG5cbiAgICAgICAgLy8gU0RLLTcyNTA6IHRoZSB1c2VyJ3Mgd2RpbyBjb25maWcgKGFuZCB0aGUgbG9jYWwgZmlsZXMgaXQgaW1wb3J0cyksIGNyZWRlbnRpYWwtc2NydWJiZWQuXG4gICAgICAgIC8vIFNvZnQtZmFpbHVyZSBieSBkZXNpZ24gXHUyMDE0IGEgY29uZmlnIHdlIGNhbm5vdCByZWFkIG9yIGxvY2F0ZSBtdXN0IG5ldmVyIHN0b3AgdGhlXG4gICAgICAgIC8vIGxvZyB1cGxvYWQ7IHRoZSByZWFzb24gaXMgcmVjb3JkZWQgb24gdGhlIGV2ZW50IGluc3RlYWQuXG4gICAgICAgIGNvbnN0IHsgZmlsZXM6IGNvbmZpZ0ZpbGVzLCBmYWlsdXJlczogY29uZmlnRmFpbHVyZXMsIHN0cmF0ZWd5IH0gPSBjb2xsZWN0Q29uZmlnRmlsZXNGb3JVcGxvYWQob3B0aW9ucy5jb25maWcpXG5cbiAgICAgICAgLy8gcGFja2FnZS5qc29uIGdpdmVzIHRyaWFnZSB0aGUgZnJhbWV3b3JrL3NlcnZpY2UgdmVyc2lvbnMsIHdoaWNoIHRoZSBhcmNoaXZlIGNhcnJpZWRcbiAgICAgICAgLy8gYmVmb3JlIHRoaXMgY2hhbmdlLiBJdCBnb2VzIHRocm91Z2ggdGhlIHNhbWUgcmVkYWN0aW9uIGFzIHRoZSBjb25maWdzIHJhdGhlciB0aGFuXG4gICAgICAgIC8vIGJlaW5nIGNvcGllZCB2ZXJiYXRpbTogYHNjcmlwdHNgIHJvdXRpbmVseSBlbWJlZCB0b2tlbnMgKGAtLXRva2VuPWdocF8uLi5gKSwgYW5kIHRoZVxuICAgICAgICAvLyB3YWxrLXVwIGNhbiBzZWxlY3QgYSBtb25vcmVwby1yb290IG1hbmlmZXN0IGJyb2FkZXIgdGhhbiB0aGUgdGVzdCBwcm9qZWN0LiBPcmRpbmFyeVxuICAgICAgICAvLyBkZXBlbmRlbmN5L3ZlcnNpb24gbGluZXMgYXJlIHVuYWZmZWN0ZWQgYnkgdGhlIHNjcnViLlxuICAgICAgICAvLyBzbmFwc2hvdCBiZWZvcmUgcGFja2FnZS5qc29uIGpvaW5zIHRoZSBsaXN0LCBzbyBjb3VudHMgYW5kIG5hbWVzIHN0YXkgaG9uZXN0XG4gICAgICAgIGNvbnN0IGNhcHR1cmVkQ29uZmlnTmFtZXMgPSBjb25maWdGaWxlcy5tYXAoZiA9PiBmLm5hbWUpXG5cbiAgICAgICAgY29uc3QgcGFja2FnZUpzb25QYXRoID0gZmluZFBhY2thZ2VKc29uRm9yVXBsb2FkKClcbiAgICAgICAgaWYgKHBhY2thZ2VKc29uUGF0aCkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBjb25maWdGaWxlcy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogcGF0aC5iYXNlbmFtZShwYWNrYWdlSnNvblBhdGgpLFxuICAgICAgICAgICAgICAgICAgICBzb3VyY2VQYXRoOiBwYWNrYWdlSnNvblBhdGgsXG4gICAgICAgICAgICAgICAgICAgIGNvbnRlbnQ6IHJlZGFjdFNlbnNpdGl2ZUNvbnRlbnQoZnMucmVhZEZpbGVTeW5jKHBhY2thZ2VKc29uUGF0aCwgJ3V0ZjgnKSlcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgfSBjYXRjaCAocGtnRXJyKSB7XG4gICAgICAgICAgICAgICAgY29uZmlnRmFpbHVyZXMucHVzaChgcGFja2FnZS5qc29uOiAkeyhwa2dFcnIgYXMgRXJyb3IpPy5tZXNzYWdlIHx8IFN0cmluZyhwa2dFcnIpfWApXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChjb25zdCBjb25maWdGaWxlIG9mIGNvbmZpZ0ZpbGVzKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGVudHJ5TmFtZSA9IHVuaXF1ZU5hbWUoY29uZmlnRmlsZS5uYW1lKVxuICAgICAgICAgICAgICAgIGZzLndyaXRlRmlsZVN5bmMocGF0aC5qb2luKHRtcERpciwgZW50cnlOYW1lKSwgY29uZmlnRmlsZS5jb250ZW50KVxuICAgICAgICAgICAgICAgIGNvcGllZEZpbGVOYW1lcy5wdXNoKGVudHJ5TmFtZSlcbiAgICAgICAgICAgIH0gY2F0Y2ggKHdyaXRlRXJyKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbXNnID0gKHdyaXRlRXJyIGFzIEVycm9yKT8ubWVzc2FnZSB8fCBTdHJpbmcod3JpdGVFcnIpXG4gICAgICAgICAgICAgICAgY29uZmlnRmFpbHVyZXMucHVzaChgJHtjb25maWdGaWxlLm5hbWV9OiAke21zZ31gKVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIExvZ2dlZCBzZXBhcmF0ZWx5IGZyb20gcGFja2FnZS5qc29uOiBgY29uZmlnRmlsZXNgIGhhcyB0aGUgbWFuaWZlc3QgYXBwZW5kZWQgdG8gaXQsXG4gICAgICAgIC8vIGFuZCBgc3RyYXRlZ3lgIGlzIHVuZGVmaW5lZCBvbiBldmVyeSBmYWlsdXJlIHBhdGgsIHNvIGEgY29tYmluZWQgbGluZSByZWFkc1xuICAgICAgICAvLyBcIkF1dG8tY2FwdHVyZWQgMSBjb25maWcgZmlsZShzKSB2aWEgdW5kZWZpbmVkOiBwYWNrYWdlLmpzb25cIiBcdTIwMTQgaS5lLiBpdCBjbGFpbXMgYVxuICAgICAgICAvLyBjYXB0dXJlIHN1Y2NlZWRlZCBpbiBleGFjdGx5IHRoZSBjYXNlIHdoZXJlIG5vbmUgZGlkLlxuICAgICAgICBpZiAoY2FwdHVyZWRDb25maWdOYW1lcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBCU3RhY2tMb2dnZXIuZGVidWcoYEF1dG8tY2FwdHVyZWQgJHtjYXB0dXJlZENvbmZpZ05hbWVzLmxlbmd0aH0gY29uZmlnIGZpbGUocykgdmlhICR7c3RyYXRlZ3l9OiAke2NhcHR1cmVkQ29uZmlnTmFtZXMuam9pbignLCAnKX1gKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLmRlYnVnKGBObyB3ZGlvIGNvbmZpZyBjYXB0dXJlZCR7c3RyYXRlZ3kgPyBgIChzdHJhdGVneSAke3N0cmF0ZWd5fSlgIDogJyd9YClcbiAgICAgICAgfVxuICAgICAgICBpZiAocGFja2FnZUpzb25QYXRoKSB7XG4gICAgICAgICAgICBCU3RhY2tMb2dnZXIuZGVidWcoYEF1dG8tY2FwdHVyZWQgcGFja2FnZS5qc29uIGZyb20gJHtyZWxhdGl2ZURpclRvQ3dkKHBhdGguZGlybmFtZShwYWNrYWdlSnNvblBhdGgpKX1gKVxuICAgICAgICB9XG4gICAgICAgIGlmIChjb25maWdGYWlsdXJlcy5sZW5ndGggPiAwICYmIGZhaWx1cmUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgLy8gV2FybmluZyBvbmx5IFx1MjAxNCBgc3VjY2Vzc2Agc3RheXMgdHJ1ZSBzbyBhIG1pc3NpbmcgY29uZmlnIG5ldmVyIHJlYWRzIGFzIGFcbiAgICAgICAgICAgIC8vIGZhaWxlZCBsb2cgdXBsb2FkIChzYW1lIGNvbnRyYWN0IGFzIHRoZSBOb2RlIFNESydzIGByZWRhY3Rpb25fZmFpbGVkYCkuXG4gICAgICAgICAgICBmYWlsdXJlID0gYGNvbmZpZ19jYXB0dXJlOiAke2NvbmZpZ0ZhaWx1cmVzLmpvaW4oJzsgJyl9YC5zdWJzdHJpbmcoMCwgMzAwKVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gVGhlIHNlcnZpY2UgbG9nIGlzIHNuYXBzaG90dGVkIExBU1QsIGRlbGliZXJhdGVseS4gRXZlcnl0aGluZyBhYm92ZSAtLSB0aGUgcmVzb2x1dGlvblxuICAgICAgICAvLyBzdHJhdGVneSwgd2hhdCB3YXMgY2FwdHVyZWQsIGFuZCBhbnkgY2FwdHVyZSBmYWlsdXJlcyAtLSBpcyB3cml0dGVuIHRvIHRoYXQgbG9nXG4gICAgICAgIC8vIGZpcnN0LCBzbyBpdCBpcyBpbnNpZGUgdGhlIGNvcHkgdGhhdCBzaGlwcy4gQ29weWluZyBlYXJsaWVyIGlzIHdoeSB0aG9zZSBsaW5lcyB1c2VkXG4gICAgICAgIC8vIHRvIGV4aXN0IG9ubHkgaW4gdGhlIGRldmVsb3BlcidzIGxvY2FsIGZpbGUgYW5kIG5ldmVyIGluIHRoZSBkb3dubG9hZGVkIGJ1bmRsZS5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gT3JkZXJpbmcgYWxvbmUgaXMgbm90IGVub3VnaDogQlN0YWNrTG9nZ2VyIHdyaXRlcyB0aHJvdWdoIGFuIGFzeW5jIFdyaXRlU3RyZWFtLCBzb1xuICAgICAgICAvLyB0aG9zZSBsaW5lcyBhcmUgc3RpbGwgYnVmZmVyZWQgYXQgdGhpcyBwb2ludC4gRmx1c2ggYmVmb3JlIGNvcHlpbmcgb3IgdGhlIHNoaXBwZWRcbiAgICAgICAgLy8gY29weSBpcyBzaWxlbnRseSBtaXNzaW5nIGl0cyB0YWlsICh2ZXJpZmllZCBhZ2FpbnN0IGEgZG93bmxvYWRlZCBidW5kbGUpLlxuICAgICAgICBhd2FpdCBCU3RhY2tMb2dnZXIuZmx1c2hMb2dGaWxlKClcblxuICAgICAgICBjb25zdCBmaWxlc1RvQXJjaGl2ZSA9IFtcbiAgICAgICAgICAgIEJTdGFja0xvZ2dlci5sb2dGaWxlUGF0aCxcbiAgICAgICAgICAgIENMSV9ERUJVR19MT0dTX0ZJTEUsXG4gICAgICAgIF0uZmlsdGVyKChmKTogZiBpcyBzdHJpbmcgPT4gQm9vbGVhbihmKSAmJiBmcy5leGlzdHNTeW5jKGYgYXMgc3RyaW5nKSlcblxuICAgICAgICBmb3IgKGNvbnN0IGYgb2YgZmlsZXNUb0FyY2hpdmUpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZW50cnlOYW1lID0gdW5pcXVlTmFtZShmKVxuICAgICAgICAgICAgICAgIGZzLmNvcHlGaWxlU3luYyhmLCBwYXRoLmpvaW4odG1wRGlyLCBlbnRyeU5hbWUpKVxuICAgICAgICAgICAgICAgIGNvcGllZEZpbGVOYW1lcy5wdXNoKGVudHJ5TmFtZSlcbiAgICAgICAgICAgIH0gY2F0Y2ggKGNvcHlFcnIpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBtc2cgPSAoY29weUVyciBhcyBFcnJvcik/Lm1lc3NhZ2UgfHwgU3RyaW5nKGNvcHlFcnIpXG4gICAgICAgICAgICAgICAgYXJjaGl2ZUFkZEZhaWx1cmVzLnB1c2goYCR7cGF0aC5iYXNlbmFtZShmKX06ICR7bXNnfWApXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYXJjaGl2ZUFkZEZhaWx1cmVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHN1Y2Nlc3MgPSBmYWxzZVxuICAgICAgICAgICAgZmFpbHVyZSA9IGBhcmNoaXZlX2FkZF9mYWlsZWQgWyR7YXJjaGl2ZUFkZEZhaWx1cmVzLmxlbmd0aH1dOiAke2FyY2hpdmVBZGRGYWlsdXJlcy5qb2luKCc7ICcpfWAuc3Vic3RyaW5nKDAsIDMwMClcbiAgICAgICAgfVxuXG4gICAgICAgIEJTdGFja0xvZ2dlci5kZWJ1ZyhgQXV0by1jYXB0dXJlIGFyY2hpdmUgZW50cmllczogJHtjb3BpZWRGaWxlTmFtZXMuam9pbignLCAnKX1gKVxuXG4gICAgICAgIGF3YWl0IGNyZWF0ZShcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBmaWxlOiB0YXJQYXRoLFxuICAgICAgICAgICAgICAgIGN3ZDogdG1wRGlyLFxuICAgICAgICAgICAgICAgIHBvcnRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgICAgIG5vRGlyUmVjdXJzZTogdHJ1ZVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNvcGllZEZpbGVOYW1lc1xuICAgICAgICApXG5cbiAgICAgICAgYXdhaXQgbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgc291cmNlID0gZnMuY3JlYXRlUmVhZFN0cmVhbSh0YXJQYXRoKVxuICAgICAgICAgICAgY29uc3QgZGVzdCA9IGZzLmNyZWF0ZVdyaXRlU3RyZWFtKHRhckd6UGF0aClcbiAgICAgICAgICAgIGNvbnN0IGd6aXAgPSB6bGliLmNyZWF0ZUd6aXAoeyBsZXZlbDogMSB9KVxuXG4gICAgICAgICAgICBzb3VyY2UucGlwZShnemlwKS5waXBlKGRlc3QpXG4gICAgICAgICAgICBkZXN0Lm9uKCdmaW5pc2gnLCByZXNvbHZlKVxuICAgICAgICAgICAgZGVzdC5vbignZXJyb3InLCByZWplY3QpXG4gICAgICAgIH0pXG5cbiAgICAgICAgY29uc3QgZm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKVxuICAgICAgICAvLyBvcGVuQXNCbG9iIChOb2RlID49MjApIHJldHVybnMgYSBCbG9iIGJhY2tlZCBieSBhIGZpbGUgZGVzY3JpcHRvciBcdTIwMTQgdW5kaWNpXG4gICAgICAgIC8vIHN0cmVhbXMgZnJvbSBkaXNrIGR1cmluZyB0aGUgdXBsb2FkIGluc3RlYWQgb2YgbWF0ZXJpYWxpc2luZyB0aGUgZnVsbCBhcmNoaXZlXG4gICAgICAgIC8vIGluIFY4IGhlYXAgKHdoaWNoIHJlYWRGaWxlU3luYyArIG5ldyBCbG9iKFtCdWZmZXJdKSB3b3VsZCBkbyB0d2ljZSkuXG4gICAgICAgIC8vIE5vZGUgMTguMjAgKHN0aWxsIHN1cHBvcnRlZCBwZXIgYGVuZ2luZXNgKSBsYWNrcyBmcy5vcGVuQXNCbG9iLCBzbyBmYWxsIGJhY2tcbiAgICAgICAgLy8gdG8gcmVhZGluZyB0aGUgKHNtYWxsKSBsb2cgYXJjaGl2ZSBpbnRvIGEgQmxvYiB0aGVyZS5cbiAgICAgICAgY29uc3QgZmlsZSA9IHR5cGVvZiBmcy5vcGVuQXNCbG9iID09PSAnZnVuY3Rpb24nXG4gICAgICAgICAgICA/IGF3YWl0IGZzLm9wZW5Bc0Jsb2IodGFyR3pQYXRoLCB7IHR5cGU6ICdhcHBsaWNhdGlvbi94LWd6aXAnIH0pXG4gICAgICAgICAgICA6IG5ldyBCbG9iKFtmcy5yZWFkRmlsZVN5bmModGFyR3pQYXRoKV0sIHsgdHlwZTogJ2FwcGxpY2F0aW9uL3gtZ3ppcCcgfSlcbiAgICAgICAgZm9ybURhdGEuYXBwZW5kKCdkYXRhJywgZmlsZSwgJ2xvZ3MudGFyLmd6JylcbiAgICAgICAgZm9ybURhdGEuYXBwZW5kKCdjbGllbnRCdWlsZFV1aWQnLCBjbGllbnRCdWlsZFV1aWQpXG5cbiAgICAgICAgY29uc3QgYXV0aCA9IEJ1ZmZlci5mcm9tKGAke3VzZXJ9OiR7a2V5fWApLnRvU3RyaW5nKCdiYXNlNjQnKVxuICAgICAgICBjb25zdCByZXF1ZXN0T3B0aW9uczogUmVxdWVzdEluaXQgPSB7XG4gICAgICAgICAgICBib2R5OiBmb3JtRGF0YSBhcyBCb2R5SW5pdCxcbiAgICAgICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgICAgICAnQXV0aG9yaXphdGlvbic6IGBCYXNpYyAke2F1dGh9YFxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBub2RlUmVxdWVzdChcbiAgICAgICAgICAgICdQT1NUJywgVVBMT0FEX0xPR1NfRU5EUE9JTlQsIHJlcXVlc3RPcHRpb25zLCBBUElVdGlscy5VUExPQURfTE9HU19BRERSRVNTXG4gICAgICAgIClcblxuICAgICAgICAvLyBTdGFnaW5nIGRpciAoYXJjaGl2ZSArIGV2ZXJ5IGNvcGllZC9yZWRhY3RlZCBlbnRyeSkgaXMgcmVtb3ZlZCBpbiBgZmluYWxseWAuXG5cbiAgICAgICAgLy8gRGVsZXRlIHRoZSBTREsgQ0xJIGxvZyBmaWxlIGFmdGVyIHVwbG9hZFxuICAgICAgICBpZiAoZnMuZXhpc3RzU3luYyhDTElfREVCVUdfTE9HU19GSUxFKSkge1xuICAgICAgICAgICAgZnMudW5saW5rU3luYyhDTElfREVCVUdfTE9HU19GSUxFKVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFyZXNwb25zZSkge1xuICAgICAgICAgICAgLy8gbm9kZVJlcXVlc3Qgc3dhbGxvd3MgZXJyb3JzIGZvciB0aGUgbG9nLXVwbG9hZCBwYXRoIGFuZCByZXR1cm5zIHVuZGVmaW5lZDtcbiAgICAgICAgICAgIC8vIHJlY29yZCB0aGUgc2lsZW50IHVwbG9hZCBmYWlsdXJlIG9uIHRoZSBtZXRyaWMuXG4gICAgICAgICAgICBzdWNjZXNzID0gZmFsc2VcbiAgICAgICAgICAgIGZhaWx1cmUgPSAndXBsb2FkX25vX3Jlc3BvbnNlJ1xuICAgICAgICB9IGVsc2UgaWYgKHJlc3BvbnNlLnN0YXR1cyAmJiByZXNwb25zZS5zdGF0dXMgIT09ICdzdWNjZXNzJykge1xuICAgICAgICAgICAgLy8gU2VydmVyLXNpZGUgcmVqZWN0aW9uIChlLmcuIFwiRmlsZSBub3QgYXR0YWNoZWRcIikgXHUyMDE0IHJlc3BvbnNlIGlzIHRydXRoeVxuICAgICAgICAgICAgLy8gYnV0IHRoZSB1cGxvYWQgZGlkbid0IGFjdHVhbGx5IGxhbmQuXG4gICAgICAgICAgICBzdWNjZXNzID0gZmFsc2VcbiAgICAgICAgICAgIGZhaWx1cmUgPSBgdXBsb2FkX3N0YXR1czogJHtyZXNwb25zZS5zdGF0dXN9JHtyZXNwb25zZS5tZXNzYWdlID8gJyAtICcgKyBTdHJpbmcocmVzcG9uc2UubWVzc2FnZSkuc2xpY2UoMCwgMjAwKSA6ICcnfWBcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXNwb25zZVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHN1Y2Nlc3MgPSBmYWxzZVxuICAgICAgICBmYWlsdXJlID0gYHVwbG9hZExvZ3MgZXhjZXB0aW9uOiAke2dldEVycm9yU3RyaW5nKGVycm9yKX1gXG4gICAgICAgIEJTdGFja0xvZ2dlci5lcnJvcihgRXJyb3Igd2hpbGUgdXBsb2FkaW5nIGxvZ3M6ICR7Z2V0RXJyb3JTdHJpbmcoZXJyb3IpfWApXG4gICAgICAgIHJldHVybiBudWxsXG4gICAgfSBmaW5hbGx5IHtcbiAgICAgICAgaWYgKHN0YWdpbmdEaXIpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgZnMucm1TeW5jKHN0YWdpbmdEaXIsIHsgcmVjdXJzaXZlOiB0cnVlLCBmb3JjZTogdHJ1ZSB9KVxuICAgICAgICAgICAgfSBjYXRjaCAoY2xlYW51cEVycikge1xuICAgICAgICAgICAgICAgIEJTdGFja0xvZ2dlci5kZWJ1ZyhgRmFpbGVkIHRvIGNsZWFuIHVwIGxvZyBzdGFnaW5nIGRpciAke3N0YWdpbmdEaXJ9OiAke2dldEVycm9yU3RyaW5nKGNsZWFudXBFcnIpfWApXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgUGVyZm9ybWFuY2VUZXN0ZXIuZW5kKGV2ZW50TmFtZSwgc3VjY2VzcywgZmFpbHVyZSlcbiAgICB9XG59XG5cbmV4cG9ydCBjb25zdCBpc09iamVjdCA9IChvYmplY3Q6IHVua25vd24pID0+IHtcbiAgICByZXR1cm4gb2JqZWN0ICE9PSBudWxsICYmIHR5cGVvZiBvYmplY3QgPT09ICdvYmplY3QnICYmICFBcnJheS5pc0FycmF5KG9iamVjdClcbn1cblxuZXhwb3J0IGNvbnN0IE9iamVjdHNBcmVFcXVhbCA9IChvYmplY3QxOiBvYmplY3QsIG9iamVjdDI6IG9iamVjdCkgPT4ge1xuICAgIGNvbnN0IG9iamVjdEtleXMxID0gT2JqZWN0LmtleXMob2JqZWN0MSlcbiAgICBjb25zdCBvYmplY3RLZXlzMiA9IE9iamVjdC5rZXlzKG9iamVjdDIpXG4gICAgaWYgKG9iamVjdEtleXMxLmxlbmd0aCAhPT0gb2JqZWN0S2V5czIubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgICBmb3IgKGNvbnN0IGtleSBvZiBvYmplY3RLZXlzMSkge1xuICAgICAgICBjb25zdCB2YWx1ZTEgPSBvYmplY3QxW2tleSBhcyBrZXlvZiB0eXBlb2Ygb2JqZWN0MV1cbiAgICAgICAgY29uc3QgdmFsdWUyID0gb2JqZWN0MltrZXkgYXMga2V5b2YgdHlwZW9mIG9iamVjdDFdXG4gICAgICAgIGNvbnN0IGlzQm90aEFyZU9iamVjdHMgPSBpc09iamVjdCh2YWx1ZTEpICYmIGlzT2JqZWN0KHZhbHVlMilcbiAgICAgICAgaWYgKChpc0JvdGhBcmVPYmplY3RzICYmICFPYmplY3RzQXJlRXF1YWwodmFsdWUxLCB2YWx1ZTIpKSB8fCAoIWlzQm90aEFyZU9iamVjdHMgJiYgdmFsdWUxICE9PSB2YWx1ZTIpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZVxufVxuXG5leHBvcnQgY29uc3QgZ2V0UGxhdGZvcm1WZXJzaW9uID0gbzExeUVycm9ySGFuZGxlcihmdW5jdGlvbiBnZXRQbGF0Zm9ybVZlcnNpb24oY2FwczogV2ViZHJpdmVySU8uQ2FwYWJpbGl0aWVzLCB1c2VyQ2FwczogV2ViZHJpdmVySU8uQ2FwYWJpbGl0aWVzKSB7XG4gICAgaWYgKCFjYXBzICYmICF1c2VyQ2Fwcykge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkXG4gICAgfVxuXG4gICAgY29uc3QgYnN0YWNrT3B0aW9ucyA9ICh1c2VyQ2Fwcyk/LlsnYnN0YWNrOm9wdGlvbnMnXVxuICAgIGNvbnN0IGtleXMgPSBbJ3BsYXRmb3JtVmVyc2lvbicsICdwbGF0Zm9ybV92ZXJzaW9uJywgJ29zVmVyc2lvbicsICdvc192ZXJzaW9uJ11cblxuICAgIGZvciAoY29uc3Qga2V5IG9mIGtleXMpIHtcbiAgICAgICAgaWYgKGNhcHM/LltrZXkgYXMga2V5b2YgV2ViZHJpdmVySU8uQ2FwYWJpbGl0aWVzXSkge1xuICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLmRlYnVnKGBHb3QgJHtrZXl9IGZyb20gZHJpdmVyIGNhcHNgKVxuICAgICAgICAgICAgcmV0dXJuIFN0cmluZyhjYXBzPy5ba2V5IGFzIGtleW9mIFdlYmRyaXZlcklPLkNhcGFiaWxpdGllc10pXG4gICAgICAgIH0gZWxzZSBpZiAoYnN0YWNrT3B0aW9ucyAmJiBic3RhY2tPcHRpb25zPy5ba2V5IGFzIGtleW9mIENhcGFiaWxpdGllcy5Ccm93c2VyU3RhY2tDYXBhYmlsaXRpZXNdKSB7XG4gICAgICAgICAgICBCU3RhY2tMb2dnZXIuZGVidWcoYEdvdCAke2tleX0gZnJvbSB1c2VyIGJzdGFjayBvcHRpb25zYClcbiAgICAgICAgICAgIHJldHVybiBTdHJpbmcoYnN0YWNrT3B0aW9ucz8uW2tleSBhcyBrZXlvZiBDYXBhYmlsaXRpZXMuQnJvd3NlclN0YWNrQ2FwYWJpbGl0aWVzXSlcbiAgICAgICAgfSBlbHNlIGlmICh1c2VyQ2Fwc1trZXkgYXMga2V5b2YgV2ViZHJpdmVySU8uQ2FwYWJpbGl0aWVzXSkge1xuICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLmRlYnVnKGBHb3QgJHtrZXl9IGZyb20gdXNlciBjYXBzYClcbiAgICAgICAgICAgIHJldHVybiBTdHJpbmcodXNlckNhcHNba2V5IGFzIGtleW9mIFdlYmRyaXZlcklPLkNhcGFiaWxpdGllc10pXG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZFxufSlcblxuLyoqXG4gKiBSZXNvbHZlIGEgc3RhYmxlLCBodW1hbi1yZWFkYWJsZSBkZXZpY2UgaWRlbnRpZmllciBmb3IgdGhlXG4gKiBgZGV2aWNlYCBmaWVsZCBvbiB0ZXN0X3J1biBpbnRlZ3JhdGlvbnMgcGF5bG9hZHMuXG4gKlxuICogVGVzdEh1YiBkZWR1cGVzIHRlc3RfcnVucyBieSBhIGhhc2ggdGhhdCBpbmNsdWRlcyBgZGV2aWNlYC4gRm9yXG4gKiBBcHAtQXV0b21hdGUgZmxvd3MgdGhhdCBwYXNzIGEgcmVnZXggZGV2aWNlIHJlcXVlc3QgKGUuZy4gYC4qUGl4ZWwuKmApXG4gKiBhY3Jvc3MgbXVsdGlwbGUgcGxhdGZvcm1zLCB0aGUgU0RLIHByZXZpb3VzbHkgc2VudCB0aGUgaW5wdXQgcmVnZXhcbiAqIHN0cmluZywgY2F1c2luZyB0d28gcGFyYWxsZWwgc2Vzc2lvbnMgb24gcGh5c2ljYWxseSBkaWZmZXJlbnQgZGV2aWNlc1xuICogdG8gY29sbGlkZSBvbiB0aGUgaGFzaCBhbmQgbWVyZ2UuIFRoaXMgaGVscGVyIHByZWZlcnMgdGhlIEFwcGl1bVxuICogc2VydmVyLXJlc29sdmVkIGZpZWxkcyAoYGRldmljZU1vZGVsYCAvIGBhcHBpdW06ZGV2aWNlTW9kZWxgKSBiZWZvcmVcbiAqIGZhbGxpbmcgYmFjayB0byB0aGUgcmVxdWVzdGVkIGNhcGFiaWxpdGllcy5cbiAqXG4gKiBNdWx0aXJlbW90ZTogYGRyaXZlckNhcHNgIGZvciBhIGBNdWx0aVJlbW90ZUJyb3dzZXJgIGlzIGEgbWFwIG9mXG4gKiBge2luc3RhbmNlTmFtZTogV2ViZHJpdmVySU8uQ2FwYWJpbGl0aWVzLCBcdTIwMjZ9YCByYXRoZXIgdGhhbiBmbGF0IGNhcHM7XG4gKiB0aGUgaGVscGVyIGRldGVjdHMgdGhhdCBzaGFwZSBhbmQgd2Fsa3MgZWFjaCBpbnN0YW5jZS5cbiAqXG4gKiBAcGFyYW0gZHJpdmVyQ2FwcyAtIGxpdmUgZHJpdmVyIGNhcGFiaWxpdGllcyAoYGJyb3dzZXIuY2FwYWJpbGl0aWVzYClcbiAqICAgICAgICAgICAgICAgICAgICAgd2hlcmUgQXBwaXVtIHNlcnZlci1yZXNvbHZlZCBmaWVsZHMgYXJlIHBvcHVsYXRlZFxuICogQHBhcmFtIHJlcXVlc3RlZENhcHMgLSB1c2VyLXJlcXVlc3RlZCBjYXBhYmlsaXRpZXMgKHJ1bm5lciBjYXBzIC8geW1sKVxuICogICAgICAgICAgICAgICAgICAgICAgICB1c2VkIGFzIGEgZmFsbGJhY2tcbiAqL1xuZXhwb3J0IGNvbnN0IGdldFJlc29sdmVkRGV2aWNlTmFtZSA9IG8xMXlFcnJvckhhbmRsZXIoZnVuY3Rpb24gZ2V0UmVzb2x2ZWREZXZpY2VOYW1lKFxuICAgIGRyaXZlckNhcHM/OiBXZWJkcml2ZXJJTy5DYXBhYmlsaXRpZXMgfCBSZWNvcmQ8c3RyaW5nLCB7IGNhcGFiaWxpdGllcz86IFdlYmRyaXZlcklPLkNhcGFiaWxpdGllcyB9PixcbiAgICByZXF1ZXN0ZWRDYXBzPzogV2ViZHJpdmVySU8uQ2FwYWJpbGl0aWVzIHwgUmVjb3JkPHN0cmluZywgeyBjYXBhYmlsaXRpZXM/OiBXZWJkcml2ZXJJTy5DYXBhYmlsaXRpZXMgfT4sXG4pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGZsYXR0ZW5NdWx0aXJlbW90ZSA9IChcbiAgICAgICAgY2FwczogV2ViZHJpdmVySU8uQ2FwYWJpbGl0aWVzIHwgUmVjb3JkPHN0cmluZywgeyBjYXBhYmlsaXRpZXM/OiBXZWJkcml2ZXJJTy5DYXBhYmlsaXRpZXMgfT4gfCB1bmRlZmluZWQsXG4gICAgKTogV2ViZHJpdmVySU8uQ2FwYWJpbGl0aWVzW10gPT4ge1xuICAgICAgICBpZiAoIWNhcHMpIHtyZXR1cm4gW119XG4gICAgICAgIGNvbnN0IG9iaiA9IGNhcHMgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgICAgICAgaWYgKG9iai5kZXZpY2VNb2RlbCB8fCBvYmpbJ2FwcGl1bTpkZXZpY2VNb2RlbCddIHx8IG9iai5kZXZpY2VOYW1lIHx8IG9ialsnYnN0YWNrOm9wdGlvbnMnXSkge1xuICAgICAgICAgICAgLy8gbG9va3MgbGlrZSBmbGF0IGNhcHNcbiAgICAgICAgICAgIHJldHVybiBbY2FwcyBhcyBXZWJkcml2ZXJJTy5DYXBhYmlsaXRpZXNdXG4gICAgICAgIH1cbiAgICAgICAgLy8gbG9va3MgbGlrZSBhIG11bHRpcmVtb3RlIG1hcDoge2luc3RhbmNlTmFtZToge2NhcGFiaWxpdGllczogey4uLn19fVxuICAgICAgICByZXR1cm4gT2JqZWN0LnZhbHVlcyhvYmopXG4gICAgICAgICAgICAuZmlsdGVyKCh2KTogdiBpcyB7IGNhcGFiaWxpdGllcz86IFdlYmRyaXZlcklPLkNhcGFiaWxpdGllcyB9ID0+XG4gICAgICAgICAgICAgICAgdiAhPT0gbnVsbCAmJiB0eXBlb2YgdiA9PT0gJ29iamVjdCcgJiYgJ2NhcGFiaWxpdGllcycgaW4gKHYgYXMgb2JqZWN0KSlcbiAgICAgICAgICAgIC5tYXAodiA9PiB2LmNhcGFiaWxpdGllcyBhcyBXZWJkcml2ZXJJTy5DYXBhYmlsaXRpZXMpXG4gICAgICAgICAgICAuZmlsdGVyKEJvb2xlYW4pXG4gICAgfVxuXG4gICAgY29uc3Qgc291cmNlczogV2ViZHJpdmVySU8uQ2FwYWJpbGl0aWVzW10gPSBbXG4gICAgICAgIC4uLmZsYXR0ZW5NdWx0aXJlbW90ZShkcml2ZXJDYXBzKSxcbiAgICAgICAgLi4uZmxhdHRlbk11bHRpcmVtb3RlKHJlcXVlc3RlZENhcHMpLFxuICAgIF1cbiAgICBpZiAoIXNvdXJjZXMubGVuZ3RoKSB7cmV0dXJuIHVuZGVmaW5lZH1cblxuICAgIGNvbnN0IHBpY2tTdHJpbmcgPSAob2JqOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZCwga2V5OiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQgPT4ge1xuICAgICAgICBjb25zdCB2ID0gb2JqPy5ba2V5XVxuICAgICAgICByZXR1cm4gdHlwZW9mIHYgPT09ICdzdHJpbmcnICYmIHYubGVuZ3RoID4gMCA/IHYgOiB1bmRlZmluZWRcbiAgICB9XG4gICAgLy8gUHJlY2VkZW5jZTogcHJlZmVyIEFwcGl1bSBzZXJ2ZXItcmVzb2x2ZWQgZGV2aWNlTW9kZWw7IGZhbGwgYmFjayB0aHJvdWdoXG4gICAgLy8gcmVxdWVzdGVkIGNhcCB2YXJpYW50cy4gYGJzdGFjazpvcHRpb25zLmRldmljZU5hbWVgIGlzIHRoZSB1c2VyJ3MgcmVnZXhcbiAgICAvLyBmb3IgQXBwLUF1dG9tYXRlIHJ1bnMsIGtlcHQgYXMgYSBmYWxsYmFjayBmb3IgdGhlIG5vbi1yZXNvbHZlZCBjYXNlLlxuICAgIGNvbnN0IHBhdGhzOiBBcnJheTwoYzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pID0+IHN0cmluZyB8IHVuZGVmaW5lZD4gPSBbXG4gICAgICAgIGMgPT4gcGlja1N0cmluZyhjLCAnZGV2aWNlTW9kZWwnKSxcbiAgICAgICAgYyA9PiBwaWNrU3RyaW5nKGMsICdhcHBpdW06ZGV2aWNlTW9kZWwnKSxcbiAgICAgICAgYyA9PiBwaWNrU3RyaW5nKGNbJ2JzdGFjazpvcHRpb25zJ10gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQsICdkZXZpY2VOYW1lJyksXG4gICAgICAgIGMgPT4gcGlja1N0cmluZyhjLCAnYXBwaXVtOmRldmljZU5hbWUnKSxcbiAgICAgICAgYyA9PiBwaWNrU3RyaW5nKGMsICdkZXZpY2VOYW1lJyksXG4gICAgXVxuICAgIGZvciAoY29uc3QgcGF0aCBvZiBwYXRocykge1xuICAgICAgICBmb3IgKGNvbnN0IHNyYyBvZiBzb3VyY2VzKSB7XG4gICAgICAgICAgICBjb25zdCB2ID0gcGF0aChzcmMgYXMgdW5rbm93biBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilcbiAgICAgICAgICAgIGlmICh2KSB7cmV0dXJuIHZ9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZFxufSlcblxuZXhwb3J0IGNvbnN0IGdldEJhc2ljQXV0aEhlYWRlciA9ICh1c2VybmFtZTogc3RyaW5nLCBwYXNzd29yZDogc3RyaW5nKSA9PiB7XG4gICAgY29uc3QgZW5jb2RlZEF1dGggPSBCdWZmZXIuZnJvbShgJHt1c2VybmFtZX06JHtwYXNzd29yZH1gLCAndXRmOCcpLnRvU3RyaW5nKCdiYXNlNjQnKVxuICAgIHJldHVybiBgQmFzaWMgJHtlbmNvZGVkQXV0aH1gXG59XG5cbmV4cG9ydCBjb25zdCBpc09iamVjdEVtcHR5ID0gKG9iamVjdE5hbWU6IHVua25vd24pID0+IHtcbiAgICByZXR1cm4gKFxuICAgICAgICBvYmplY3ROYW1lICYmXG4gICAgICAgIE9iamVjdC5rZXlzKG9iamVjdE5hbWUpLmxlbmd0aCA9PT0gMCAmJlxuICAgICAgICBvYmplY3ROYW1lLmNvbnN0cnVjdG9yID09PSBPYmplY3RcbiAgICApXG59XG5cbmV4cG9ydCBjb25zdCBnZXRFcnJvclN0cmluZyA9IChlcnI6IHVua25vd24pID0+IHtcbiAgICBpZiAoIWVycikge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkXG4gICAgfVxuICAgIGlmICh0eXBlb2YgZXJyID09PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm4gIGVyciAvLyB3b3JrcywgYGVgIG5hcnJvd2VkIHRvIHN0cmluZ1xuICAgIH0gZWxzZSBpZiAoZXJyIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIGVyci5tZXNzYWdlIC8vIHdvcmtzLCBgZWAgbmFycm93ZWQgdG8gRXJyb3JcbiAgICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0cnVuY2F0ZVN0cmluZyhmaWVsZDogc3RyaW5nLCB0cnVuY2F0ZVNpemVJbkJ5dGVzOiBudW1iZXIpOiBzdHJpbmcge1xuICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGJ1ZmZlclNpemVJbkJ5dGVzID0gQnVmZmVyLmZyb20oR0lUX01FVEFfREFUQV9UUlVOQ0FURUQpLmxlbmd0aFxuXG4gICAgICAgIGNvbnN0IGZpZWxkQnVmZmVyT2JqID0gQnVmZmVyLmZyb20oZmllbGQpXG4gICAgICAgIGNvbnN0IGxlbk9mRmllbGRCdWZmZXJPYmogPSBmaWVsZEJ1ZmZlck9iai5sZW5ndGhcbiAgICAgICAgY29uc3QgZmluYWxMZW4gPSBNYXRoLmNlaWwobGVuT2ZGaWVsZEJ1ZmZlck9iaiAtIHRydW5jYXRlU2l6ZUluQnl0ZXMgLSBidWZmZXJTaXplSW5CeXRlcylcbiAgICAgICAgaWYgKGZpbmFsTGVuID4gMCkge1xuICAgICAgICAgICAgY29uc3QgdHJ1bmNhdGVkU3RyaW5nID0gZmllbGRCdWZmZXJPYmouc3ViYXJyYXkoMCwgZmluYWxMZW4pLnRvU3RyaW5nKCkgKyBHSVRfTUVUQV9EQVRBX1RSVU5DQVRFRFxuICAgICAgICAgICAgcmV0dXJuIHRydW5jYXRlZFN0cmluZ1xuICAgICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgQlN0YWNrTG9nZ2VyLmRlYnVnKGBFcnJvciB3aGlsZSB0cnVuY2F0aW5nIGZpZWxkLCBub3RoaW5nIHdhcyB0cnVuY2F0ZWQgaGVyZTogJHtlcnJvcn1gKVxuICAgIH1cbiAgICByZXR1cm4gZmllbGRcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFNpemVPZkpzb25PYmplY3RJbkJ5dGVzKGpzb25EYXRhOiBHaXRNZXRhRGF0YSk6IG51bWJlciB7XG4gICAgdHJ5IHtcbiAgICAgICAgY29uc3QgYnVmZmVyID0gQnVmZmVyLmZyb20oSlNPTi5zdHJpbmdpZnkoanNvbkRhdGEpKVxuXG4gICAgICAgIHJldHVybiBidWZmZXIubGVuZ3RoXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgQlN0YWNrTG9nZ2VyLmRlYnVnKGBTb21ldGhpbmcgd2VudCB3cm9uZyB3aGlsZSBjYWxjdWxhdGluZyBzaXplIG9mIEpTT04gb2JqZWN0OiAke2Vycm9yfWApXG4gICAgfVxuXG4gICAgcmV0dXJuIC0xXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjaGVja0FuZFRydW5jYXRlVkNTSW5mbyhnaXRNZXRhRGF0YTogR2l0TWV0YURhdGEpOiBHaXRNZXRhRGF0YSB7XG4gICAgY29uc3QgZ2l0TWV0YURhdGFTaXplSW5CeXRlcyA9IGdldFNpemVPZkpzb25PYmplY3RJbkJ5dGVzKGdpdE1ldGFEYXRhKVxuXG4gICAgaWYgKGdpdE1ldGFEYXRhU2l6ZUluQnl0ZXMgJiYgZ2l0TWV0YURhdGFTaXplSW5CeXRlcyA+IE1BWF9HSVRfTUVUQV9EQVRBX1NJWkVfSU5fQllURVMpIHtcbiAgICAgICAgY29uc3QgdHJ1bmNhdGVTaXplID0gZ2l0TWV0YURhdGFTaXplSW5CeXRlcyAtIE1BWF9HSVRfTUVUQV9EQVRBX1NJWkVfSU5fQllURVNcbiAgICAgICAgY29uc3QgdHJ1bmNhdGVkQ29tbWl0TWVzc2FnZSA9IHRydW5jYXRlU3RyaW5nKGdpdE1ldGFEYXRhLmNvbW1pdF9tZXNzYWdlLCB0cnVuY2F0ZVNpemUpXG4gICAgICAgIGdpdE1ldGFEYXRhLmNvbW1pdF9tZXNzYWdlID0gdHJ1bmNhdGVkQ29tbWl0TWVzc2FnZVxuICAgICAgICBCU3RhY2tMb2dnZXIuaW5mbyhgVGhlIGNvbW1pdCBoYXMgYmVlbiB0cnVuY2F0ZWQuIFNpemUgb2YgY29tbWl0IGFmdGVyIHRydW5jYXRpb24gaXMgJHsgZ2V0U2l6ZU9mSnNvbk9iamVjdEluQnl0ZXMoZ2l0TWV0YURhdGEpIC8gMTAyNCB9IEtCYClcbiAgICB9XG5cbiAgICByZXR1cm4gZ2l0TWV0YURhdGFcbn1cblxuZXhwb3J0IGNvbnN0IGhhc0Jyb3dzZXJOYW1lID0gKGNhcDogQ2FwYWJpbGl0aWVzLldlYmRyaXZlcklPQ29uZmlnKTogYm9vbGVhbiA9PiB7XG4gICAgaWYgKCFjYXAgfHwgIWNhcC5jYXBhYmlsaXRpZXMpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICAgIGNvbnN0IGJyb3dzZXJTdGFja0NhcGFiaWxpdGllcyA9IGNhcC5jYXBhYmlsaXRpZXMgYXMgQ2FwYWJpbGl0aWVzLkJyb3dzZXJTdGFja0NhcGFiaWxpdGllc1xuICAgIHJldHVybiBicm93c2VyU3RhY2tDYXBhYmlsaXRpZXMuYnJvd3Nlck5hbWUgIT09IHVuZGVmaW5lZFxufVxuXG5leHBvcnQgY29uc3QgaXNWYWxpZENhcHNGb3JIZWFsaW5nID0gKGNhcHM6IFdlYmRyaXZlcklPLkNhcGFiaWxpdGllcyk6IGJvb2xlYW4gPT4ge1xuXG4gICAgLy8gR2V0IGFsbCBjYXBhYmlsaXR5IHZhbHVlc1xuICAgIGNvbnN0IGNhcFZhbHVlcyA9IE9iamVjdC52YWx1ZXMoY2FwcylcblxuICAgIC8vIENoZWNrIGlmIHRoZXJlIGFyZSBhbnkgY2FwYWJpbGl0aWVzIGFuZCBpZiBhdCBsZWFzdCBvbmUgaGFzIGEgYnJvd3NlciBuYW1lXG4gICAgcmV0dXJuIGNhcFZhbHVlcy5sZW5ndGggPiAwICYmIGNhcFZhbHVlcy5zb21lKGhhc0Jyb3dzZXJOYW1lKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNUdXJib1NjYWxlKG9wdGlvbnM6IChCcm93c2Vyc3RhY2tDb25maWcgJiBCcm93c2Vyc3RhY2tPcHRpb25zKSB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBCb29sZWFuKG9wdGlvbnM/LnR1cmJvU2NhbGUpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRPYnNlcnZhYmlsaXR5UHJvZHVjdChvcHRpb25zOiAoQnJvd3NlcnN0YWNrQ29uZmlnICYgQnJvd3NlcnN0YWNrT3B0aW9ucykgfCB1bmRlZmluZWQsIGlzQXBwQXV0b21hdGU6IGJvb2xlYW4gfCB1bmRlZmluZWQpOiBzdHJpbmcge1xuICAgIHJldHVybiBpc0FwcEF1dG9tYXRlXG4gICAgICAgID8gJ2FwcC1hdXRvbWF0ZSdcbiAgICAgICAgOiAoaXNUdXJib1NjYWxlKG9wdGlvbnMpID8gJ3R1cmJvc2NhbGUnIDogJ2F1dG9tYXRlJylcbn1cblxudHlwZSBQb2xsaW5nUmVzdWx0ID0ge1xuICAgIGRhdGE6IGFueTtcbiAgICBoZWFkZXJzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICAgIG1lc3NhZ2U/OiBzdHJpbmc7IC8vIE9wdGlvbmFsIG1lc3NhZ2UgZm9yIHRpbWVvdXQgY2FzZXNcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHBvbGxBcGkoXG4gICAgdXJsOiBzdHJpbmcsXG4gICAgcGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICAgIGhlYWRlcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4sXG4gICAgdXBwZXJMaW1pdDogbnVtYmVyLFxuICAgIHN0YXJ0VGltZSA9IERhdGUubm93KClcbik6IFByb21pc2U8UG9sbGluZ1Jlc3VsdD4ge1xuICAgIHBhcmFtcy50aW1lc3RhbXAgPSBNYXRoLnJvdW5kKERhdGUubm93KCkgLyAxMDAwKVxuICAgIEJTdGFja0xvZ2dlci5kZWJ1ZyhgY3VycmVudCB0aW1lc3RhbXAgJHtwYXJhbXMudGltZXN0YW1wfWApXG5cbiAgICB0cnkge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IG1ha2VHZXRSZXF1ZXN0KHVybCwgcGFyYW1zLCBoZWFkZXJzKVxuICAgICAgICBjb25zdCByZXNwb25zZURhdGEgPSBhd2FpdCByZXNwb25zZS5qc29uKClcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGRhdGE6IHJlc3BvbnNlRGF0YSxcbiAgICAgICAgICAgIGhlYWRlcnM6IHJlc3BvbnNlLmhlYWRlcnMsXG4gICAgICAgICAgICBtZXNzYWdlOiAnUG9sbGluZyBzdWNjZWVkZWQuJyxcbiAgICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgICAgaWYgKGVycm9yLnJlc3BvbnNlICYmIGVycm9yLnJlc3BvbnNlLnN0YXR1cyA9PT0gNDA0KSB7XG4gICAgICAgICAgICBjb25zdCBuZXh0UG9sbFRpbWUgPSBwYXJzZUludChlcnJvci5yZXNwb25zZS5oZWFkZXJzLmdldCgnbmV4dF9wb2xsX3RpbWUnKSwgMTApICogMTAwMFxuICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLmRlYnVnKGB0aW1lSW5NaWxsaXMgJHtuZXh0UG9sbFRpbWV9YClcblxuICAgICAgICAgICAgaWYgKGlzTmFOKG5leHRQb2xsVGltZSkpIHtcbiAgICAgICAgICAgICAgICBCU3RhY2tMb2dnZXIud2FybignSW52YWxpZCBvciBtaXNzaW5nIGBuZXh0UG9sbFRpbWVgIGhlYWRlci4gU3RvcHBpbmcgcG9sbGluZy4nKVxuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGE6IHt9LFxuICAgICAgICAgICAgICAgICAgICBoZWFkZXJzOiBlcnJvci5yZXNwb25zZS5oZWFkZXJzLFxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiAnSW52YWxpZCBuZXh0UG9sbFRpbWUgaGVhZGVyIHZhbHVlLiBQb2xsaW5nIHN0b3BwZWQuJyxcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lID0gbmV4dFBvbGxUaW1lIC0gRGF0ZS5ub3coKVxuICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLmRlYnVnKFxuICAgICAgICAgICAgICAgIGBlbGFwc2VkVGltZSAke2VsYXBzZWRUaW1lfSB0aW1lSW5NaWxsaXMgJHtuZXh0UG9sbFRpbWV9IHVwcGVyTGltaXQgJHt1cHBlckxpbWl0fWBcbiAgICAgICAgICAgIClcblxuICAgICAgICAgICAgaWYgKG5leHRQb2xsVGltZSA+IHVwcGVyTGltaXQpIHtcbiAgICAgICAgICAgICAgICBCU3RhY2tMb2dnZXIud2FybignUG9sbGluZyBzdG9wcGVkIGR1ZSB0byB1cHBlciB0aW1lIGxpbWl0LicpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgZGF0YToge30sXG4gICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IGVycm9yLnJlc3BvbnNlLmhlYWRlcnMsXG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICdQb2xsaW5nIHN0b3BwZWQgZHVlIHRvIHVwcGVyIHRpbWUgbGltaXQuJyxcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIEJTdGFja0xvZ2dlci5kZWJ1ZyhgUG9sbGluZyBhZ2FpbiBpbiAke2VsYXBzZWRUaW1lfW1zIHdpdGggcGFyYW1zOmAsIHBhcmFtcylcbiAgICAgICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIGVsYXBzZWRUaW1lKSlcbiAgICAgICAgICAgIHJldHVybiBwb2xsQXBpKHVybCwgcGFyYW1zLCBoZWFkZXJzLCB1cHBlckxpbWl0LCBzdGFydFRpbWUpXG4gICAgICAgIH0gZWxzZSBpZiAoZXJyb3IucmVzcG9uc2UpIHtcbiAgICAgICAgICAgIGxldCBlcnJvck1lc3NhZ2UgPSBlcnJvci5yZXNwb25zZS5zdGF0dXNUZXh0XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhcnNlZEVycm9yID0gSlNPTi5wYXJzZShlcnJvci5yZXNwb25zZS5qc29uKCkpXG4gICAgICAgICAgICAgICAgZXJyb3JNZXNzYWdlID0gcGFyc2VkRXJyb3IubWVzc2FnZVxuICAgICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLmRlYnVnKGBFcnJvciBwYXJzaW5nIHBvbGxBcGkgcmVxdWVzdCBib2R5ICR7ZXJyb3IucmVzcG9uc2UuYm9keX1gKVxuICAgICAgICAgICAgICAgIGVycm9yTWVzc2FnZSA9ICdVbmtub3duIGVycm9yJ1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhyb3cge1xuICAgICAgICAgICAgICAgIGRhdGE6IHt9LFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IHt9LFxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGVycm9yTWVzc2FnZSxcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIEJTdGFja0xvZ2dlci5lcnJvcihgVW5leHBlY3RlZCBlcnJvciBvY2N1cnJlZDogJHtlcnJvcn1gKVxuICAgICAgICAgICAgcmV0dXJuIHsgZGF0YToge30sIGhlYWRlcnM6IHt9LCBtZXNzYWdlOiAnVW5leHBlY3RlZCBlcnJvciBvY2N1cnJlZC4nIH1cbiAgICAgICAgfVxuICAgIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gbWFrZUdldFJlcXVlc3QodXJsOiBzdHJpbmcsIHBhcmFtczogUmVjb3JkPHN0cmluZywgYW55PiwgaGVhZGVyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPik6IFByb21pc2U8UmVzcG9uc2U+IHtcbiAgICBjb25zdCB1cmxPYmogPSBuZXcgVVJMKHVybClcbiAgICBPYmplY3Qua2V5cyhwYXJhbXMpLmZvckVhY2goKGtleSkgPT4gdXJsT2JqLnNlYXJjaFBhcmFtcy5hcHBlbmQoa2V5LCBwYXJhbXNba2V5XSkpXG5cbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHVybE9iai50b1N0cmluZygpLCB7XG4gICAgICAgIG1ldGhvZDogJ0dFVCcsXG4gICAgICAgIGhlYWRlcnMsXG4gICAgfSlcbiAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICAgIGNvbnN0IGVycm9yOiBhbnkgPSBuZXcgRXJyb3IoJ1JlcXVlc3QgZmFpbGVkJylcbiAgICAgICAgZXJyb3IucmVzcG9uc2UgPSByZXNwb25zZVxuICAgICAgICB0aHJvdyBlcnJvclxuICAgIH1cblxuICAgIHJldHVybiByZXNwb25zZVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZXhlY3V0ZUFjY2Vzc2liaWxpdHlTY3JpcHQ8UmV0dXJuVHlwZT4oXG4gICAgYnJvd3NlcjogYW55LFxuICAgIGZuQm9keTogc3RyaW5nLFxuICAgIGFyZz86IHVua25vd25cbik6IFByb21pc2U8UmV0dXJuVHlwZT4ge1xuICAgIHJldHVybiBicm93c2VyLmV4ZWN1dGUoXG4gICAgICAgIGByZXR1cm4gKGZ1bmN0aW9uICguLi5ic3RhY2tTZGtBcmdzKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBic3RhY2tTZGtBcmdzWzBdO1xuICAgICAgICAgICAgICAgIGJzdGFja1Nka0FyZ3MucHVzaChyZXNvbHZlKTtcbiAgICAgICAgICAgICAgICAke2ZuQm9keS5yZXBsYWNlKC9hcmd1bWVudHMvZywgJ2JzdGFja1Nka0FyZ3MnKX1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KSgke2FyZyA/IEpTT04uc3RyaW5naWZ5KGFyZykgOiAnJ30pYFxuICAgIClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlSGFzaENvZGVGcm9tRmllbGRzKGZpZWxkczogQXJyYXk8c3RyaW5nIHwgb2JqZWN0Pikge1xuICAgIGNvbnN0IHNlcmlhbGl6ZSA9ICh2YWx1ZToge30pID0+IHtcbiAgICAgICAgaWYgKHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh2YWx1ZSwgT2JqZWN0LmtleXModmFsdWUpLnNvcnQoKSlcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gU3RyaW5nKHZhbHVlKVxuICAgIH1cblxuICAgIGNvbnN0IHNlcmlhbGl6ZWQgPSBmaWVsZHMubWFwKHNlcmlhbGl6ZSkuam9pbignfCcpXG4gICAgcmV0dXJuIGNyeXB0by5jcmVhdGVIYXNoKCdzaGEyNTYnKS51cGRhdGUoc2VyaWFsaXplZCkuZGlnZXN0KCdoZXgnKVxufVxuZXhwb3J0IGZ1bmN0aW9uIGdldEJvb2xlYW5WYWx1ZUZyb21TdHJpbmcodmFsdWU6IHN0cmluZyB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICAgIGlmICghdmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICAgIHJldHVybiBbJ3RydWUnXS5pbmNsdWRlcyh2YWx1ZS50cmltKCkudG9Mb3dlckNhc2UoKSlcbn1cblxuLyoqXG4gKiBTREstMzczNzogQ29lcmNlIHN0cmluZ2lmaWVkIGJvb2xlYW5zICgndHJ1ZScvJ2ZhbHNlJywgYW55IGNhc2UpIGluIGEgZmxhdFxuICogb3B0aW9ucyBvYmplY3QgdG8gcmVhbCBib29sZWFucywgbGVhdmluZyBldmVyeSBvdGhlciB2YWx1ZSB1bnRvdWNoZWQuIEJvb2xlYW4tXG4gKiB0eXBlZCBhY2Nlc3NpYmlsaXR5IG9wdGlvbnMgKGUuZy4gYXV0b1NjYW5uaW5nKSBhcmUgY29tbW9ubHkgc3VwcGxpZWQgYXNcbiAqIHN0cmluZ3MgZnJvbSBKUyBjb25maWcgLyBlbnY7IHdpdGhvdXQgY29lcmNpb24gdGhleSBmYWlsIFczQyBjYXBzIHZhbGlkYXRpb25cbiAqIGFuZCBhcmUgc2lsZW50bHkgZHJvcHBlZC4gT25seSB0aGUgZXhhY3Qgc3RyaW5ncyAndHJ1ZScvJ2ZhbHNlJyBhcmUgY29udmVydGVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29lcmNlU3RyaW5nQm9vbGVhbnM8VCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIHVua25vd24+PihvYmo6IFQpOiBUIHtcbiAgICBpZiAoIW9iaiB8fCB0eXBlb2Ygb2JqICE9PSAnb2JqZWN0JyB8fCBBcnJheS5pc0FycmF5KG9iaikpIHtcbiAgICAgICAgcmV0dXJuIG9ialxuICAgIH1cbiAgICBjb25zdCBvdXQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge31cbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhvYmopKSB7XG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBjb25zdCBub3JtYWxpc2VkID0gdmFsdWUudHJpbSgpLnRvTG93ZXJDYXNlKClcbiAgICAgICAgICAgIGlmIChub3JtYWxpc2VkID09PSAndHJ1ZScgfHwgbm9ybWFsaXNlZCA9PT0gJ2ZhbHNlJykge1xuICAgICAgICAgICAgICAgIG91dFtrZXldID0gbm9ybWFsaXNlZCA9PT0gJ3RydWUnXG4gICAgICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBvdXRba2V5XSA9IHZhbHVlXG4gICAgfVxuICAgIHJldHVybiBvdXQgYXMgVFxufVxuXG4vKipcbiAqIENoZWNrcyBpZiBhIGtleSBpcyBzYWZlIHRvIHVzZSBmb3Igb2JqZWN0IHByb3BlcnR5IGFzc2lnbm1lbnQgdG8gcHJldmVudCBwcm90b3R5cGUgcG9sbHV0aW9uXG4gKiBAcGFyYW0ga2V5IC0gVGhlIGtleSB0byBjaGVja1xuICogQHJldHVybnMgdHJ1ZSBpZiB0aGUga2V5IGlzIHNhZmUsIGZhbHNlIG90aGVyd2lzZVxuICovXG5mdW5jdGlvbiBpc1NhZmVLZXkoa2V5OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBjb25zdCBkYW5nZXJvdXNLZXlzID0gWydfX3Byb3RvX18nLCAnY29uc3RydWN0b3InLCAncHJvdG90eXBlJ11cbiAgICByZXR1cm4gIWRhbmdlcm91c0tleXMuaW5jbHVkZXMoa2V5KVxufVxuXG4vKipcbiAqIFZhbGlkYXRlIGJvb2xlYW4gdmFsdWUgZnJvbSBtaXhlZCB0eXBlcyAoYm9vbGVhbiBvciBzdHJpbmcpXG4gKiBPbmx5IGFjY2VwdHMgdHJ1ZSBib29sZWFuIG9yIHN0cmluZyBcInRydWVcIiAoY2FzZSBpbnNlbnNpdGl2ZSlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzVmFsaWRFbmFibGVkVmFsdWUodmFsdWU6IGJvb2xlYW4gfCBzdHJpbmcgfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCB8fCB2YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZSA9PT0gdHJ1ZVxuICAgIH1cbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm4gZ2V0Qm9vbGVhblZhbHVlRnJvbVN0cmluZyh2YWx1ZSlcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBtZXJnZURlZXAodGFyZ2V0OiBSZWNvcmQ8c3RyaW5nLCBhbnk+LCAuLi5zb3VyY2VzOiBhbnlbXSk6IFJlY29yZDxzdHJpbmcsIGFueT4ge1xuICAgIGlmICghc291cmNlcy5sZW5ndGgpIHtyZXR1cm4gdGFyZ2V0fVxuICAgIGNvbnN0IHNvdXJjZSA9IHNvdXJjZXMuc2hpZnQoKVxuXG4gICAgaWYgKGlzT2JqZWN0KHRhcmdldCkgJiYgaXNPYmplY3Qoc291cmNlKSkge1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBzb3VyY2UpIHtcbiAgICAgICAgICAgIC8vIFNraXAgZGFuZ2Vyb3VzIGtleXMgdGhhdCBjb3VsZCBsZWFkIHRvIHByb3RvdHlwZSBwb2xsdXRpb25cbiAgICAgICAgICAgIGlmICghaXNTYWZlS2V5KGtleSkpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBzb3VyY2VWYWx1ZSA9IHNvdXJjZVtrZXldXG4gICAgICAgICAgICBjb25zdCB0YXJnZXRWYWx1ZSA9IHRhcmdldFtrZXldXG5cbiAgICAgICAgICAgIGlmIChpc09iamVjdChzb3VyY2VWYWx1ZSkpIHtcbiAgICAgICAgICAgICAgICBpZiAoIXRhcmdldFZhbHVlIHx8ICFpc09iamVjdCh0YXJnZXRWYWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0W2tleV0gPSB7fVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBtZXJnZURlZXAodGFyZ2V0W2tleV0sIHNvdXJjZVZhbHVlKVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0YXJnZXRba2V5XSA9IHNvdXJjZVZhbHVlXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbWVyZ2VEZWVwKHRhcmdldCwgLi4uc291cmNlcylcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1lcmdlQ2hyb21lT3B0aW9ucyhiYXNlOiBDYXBhYmlsaXRpZXMuQ2hyb21lT3B0aW9ucywgb3ZlcnJpZGU6IFBhcnRpYWw8Q2FwYWJpbGl0aWVzLkNocm9tZU9wdGlvbnM+KTogQ2FwYWJpbGl0aWVzLkNocm9tZU9wdGlvbnMge1xuICAgIGNvbnN0IG1lcmdlZDogQ2FwYWJpbGl0aWVzLkNocm9tZU9wdGlvbnMgPSB7IC4uLmJhc2UgfVxuXG4gICAgaWYgKG92ZXJyaWRlLmFyZ3MpIHtcbiAgICAgICAgbWVyZ2VkLmFyZ3MgPSBbLi4uKGJhc2UuYXJncyB8fCBbXSksIC4uLm92ZXJyaWRlLmFyZ3NdXG4gICAgfVxuXG4gICAgaWYgKG92ZXJyaWRlLmV4dGVuc2lvbnMpIHtcbiAgICAgICAgbWVyZ2VkLmV4dGVuc2lvbnMgPSBbLi4uKGJhc2UuZXh0ZW5zaW9ucyB8fCBbXSksIC4uLm92ZXJyaWRlLmV4dGVuc2lvbnNdXG4gICAgfVxuXG4gICAgaWYgKG92ZXJyaWRlLnByZWZzKSB7XG4gICAgICAgIG1lcmdlZC5wcmVmcyA9IG1lcmdlRGVlcCh7IC4uLihiYXNlLnByZWZzIHx8IHt9KSB9LCBvdmVycmlkZS5wcmVmcylcbiAgICB9XG4gICAgcmV0dXJuIG1lcmdlZFxufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNOdWxsT3JFbXB0eShzdHJpbmc6IGFueSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhc3RyaW5nIHx8IHN0cmluZy50cmltKCkgPT09ICcnXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0hhc2goZW50aXR5OiBhbnkpIHtcbiAgICByZXR1cm4gQm9vbGVhbihlbnRpdHkgJiYgdHlwZW9mKGVudGl0eSkgPT09ICdvYmplY3QnICYmICFBcnJheS5pc0FycmF5KGVudGl0eSkpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBuZXN0ZWRLZXlWYWx1ZShoYXNoOiBhbnksIGtleXM6IEFycmF5PHN0cmluZz4pIHtcbiAgICByZXR1cm4ga2V5cy5yZWR1Y2UoKGhhc2gsIGtleSkgPT4gKGlzSGFzaChoYXNoKSA/IGhhc2hba2V5XSA6IHVuZGVmaW5lZCksIGhhc2gpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZW1vdmVEaXIoZGlyOiBzdHJpbmcpIHtcbiAgICBjb25zdCBsaXN0ID0gZnMucmVhZGRpclN5bmMoZGlyKVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBmaWxlbmFtZSA9IHBhdGguam9pbihkaXIsIGxpc3RbaV0pXG4gICAgICAgIGNvbnN0IHN0YXQgPSBmcy5zdGF0U3luYyhmaWxlbmFtZSlcblxuICAgICAgICBpZiAoZmlsZW5hbWUgPT09ICcuJyB8fCBmaWxlbmFtZSA9PT0gJy4uJykge1xuICAgICAgICAgICAgLy8gcGFzcyB0aGVzZSBmaWxlc1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXQuaXNEaXJlY3RvcnkoKSkge1xuICAgICAgICAgICAgLy8gcm1kaXIgcmVjdXJzaXZlbHlcbiAgICAgICAgICAgIHJlbW92ZURpcihmaWxlbmFtZSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIHJtIGZpbGVuYW1lXG4gICAgICAgICAgICBmcy51bmxpbmtTeW5jKGZpbGVuYW1lKVxuICAgICAgICB9XG4gICAgfVxuICAgIGZzLnJtZGlyU3luYyhkaXIpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVEaXIoZGlyOiBzdHJpbmcpIHtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhkaXIpKXtcbiAgICAgICAgcmVtb3ZlRGlyKGRpcilcbiAgICB9XG4gICAgZnMubWtkaXJTeW5jKGRpciwgeyByZWN1cnNpdmU6IHRydWUgfSlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzV3JpdGFibGUoZGlyUGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgdHJ5IHtcbiAgICAgICAgZnMuYWNjZXNzU3luYyhkaXJQYXRoLCBmcy5jb25zdGFudHMuV19PSylcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICB9IGNhdGNoIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gc2V0UmVhZFdyaXRlQWNjZXNzKGRpclBhdGg6IHN0cmluZykge1xuICAgIHRyeSB7XG4gICAgICAgIGZzLmNobW9kU3luYyhkaXJQYXRoLCAwbzY2NilcbiAgICAgICAgQlN0YWNrTG9nZ2VyLmRlYnVnKGBEaXJlY3RvcnkgJHtkaXJQYXRofSBpcyBub3cgcmVhZC93cml0ZSBhY2Nlc3NpYmxlLmApXG4gICAgfSBjYXRjaCAoZXJyOiBhbnkpIHtcbiAgICAgICAgQlN0YWNrTG9nZ2VyLmVycm9yKGBGYWlsZWQgdG8gc2V0IGRpcmVjdG9yeSBhY2Nlc3M6ICR7ZXJyLnN0YWNrfWApXG4gICAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0TW9jaGFUZXN0SGllcmFyY2h5KHRlc3Q6IEZyYW1ld29ya3MuVGVzdCkge1xuICAgIGNvbnN0IHZhbHVlOiBzdHJpbmdbXSA9IFtdXG4gICAgaWYgKHRlc3QuY3R4ICYmIHRlc3QuY3R4LnRlc3QpIHtcbiAgICAgICAgLy8gSWYgd2UgYWxyZWFkeSBoYXZlIHRoZSBwYXJlbnQgb2JqZWN0LCB1dGlsaXplIGl0IGVsc2UgZ2V0IGZyb20gY29udGV4dFxuICAgICAgICBsZXQgcGFyZW50ID0gdHlwZW9mIHRlc3QucGFyZW50ID09PSAnb2JqZWN0JyA/IHRlc3QucGFyZW50IDogdGVzdC5jdHgudGVzdC5wYXJlbnRcbiAgICAgICAgd2hpbGUgKHBhcmVudCAmJiBwYXJlbnQudGl0bGUgIT09ICcnKSB7XG4gICAgICAgICAgICB2YWx1ZS5wdXNoKHBhcmVudC50aXRsZSlcbiAgICAgICAgICAgIHBhcmVudCA9IHBhcmVudC5wYXJlbnRcbiAgICAgICAgfVxuICAgIH0gZWxzZSBpZiAodGVzdC5kZXNjcmlwdGlvbiAmJiB0ZXN0LmZ1bGxOYW1lKSB7XG4gICAgICAgIC8vIGZvciBKYXNtaW5lXG4gICAgICAgIHZhbHVlLnB1c2godGVzdC5kZXNjcmlwdGlvbilcbiAgICAgICAgLy8gU3RyaXAgdGhlIHRyYWlsaW5nIFwiIDxkZXNjcmlwdGlvbj5cIiBzdWZmaXggd2l0aG91dCBidWlsZGluZyBhIHJlZ2V4IGZyb21cbiAgICAgICAgLy8gYSB2YXJpYWJsZSAoYXZvaWRzIFJlRG9TIGFuZCByZWdleC1tZXRhY2hhcmFjdGVyIG1pc21hdGNoZXMgaW4gZGVzY3JpcHRpb25zKS5cbiAgICAgICAgY29uc3QgZGVzY1N1ZmZpeCA9IGAgJHt0ZXN0LmRlc2NyaXB0aW9ufWBcbiAgICAgICAgdmFsdWUucHVzaCh0ZXN0LmZ1bGxOYW1lLmVuZHNXaXRoKGRlc2NTdWZmaXgpID8gdGVzdC5mdWxsTmFtZS5zbGljZSgwLCAtZGVzY1N1ZmZpeC5sZW5ndGgpIDogdGVzdC5mdWxsTmFtZSlcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlLnJldmVyc2UoKVxufVxuXG4vLyBUaGUgbG9va2JlaGluZCBpcyBsb2FkLWJlYXJpbmc6IHdpdGhvdXQgaXQgZXZlcnkgYEBgIHN0YXJ0cyBhIG1hdGNoLCBzbyBhbiBhZGRyZXNzXG4vLyBsaWtlIGB1c2VyQGV4YW1wbGUuY29tYCBpbiBhIHRpdGxlIHlpZWxkcyBhIGJvZ3VzIGBAZXhhbXBsZWAgdGFnLlxuY29uc3QgVEVTVF9UQUdfUEFUVEVSTiA9IC8oPzwhW1xcdy1dKUBbXFx3LV0rL2dcblxuLyoqXG4gKiBNb2NoYSBhbmQgSmFzbWluZSBoYXZlIG5vIHRhZyBjb25zdHJ1Y3QsIHNvIGBAdGFnYCB0b2tlbnMgd3JpdHRlbiBpbnRvIHRoZSBzdWl0ZSBhbmRcbiAqIHRlc3QgdGl0bGVzIGFyZSB0aGUgdGFnIHNvdXJjZS4gVGhlIGxlYWRpbmcgYEBgIGlzIGtlcHQgc28gdGhlc2UgbWF0Y2ggdGhlIHBpY2tsZSB0YWdzXG4gKiB0aGUgQ3VjdW1iZXIgcGF0aCBpbiB0aGlzIHNlcnZpY2UgYWxyZWFkeSBmb3J3YXJkczsgbm90ZSB0aGUgbm9kZSBTREsgc3RyaXBzIGl0IGZvclxuICogSmVzdC9QbGF5d3JpZ2h0LCBzbyB0aGUgdHdvIFNES3MgZW1pdCBkaWZmZXJlbnQgc2hhcGVzIGZvciB0aGUgc2FtZSBsb2dpY2FsIHRhZy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFRlc3RUYWdzKHRlc3Q6IEZyYW1ld29ya3MuVGVzdCwgc2NvcGVzPzogc3RyaW5nW10pOiBzdHJpbmdbXSB7XG4gICAgY29uc3QgdGl0bGVzID0gWy4uLihzY29wZXMgPz8gZ2V0TW9jaGFUZXN0SGllcmFyY2h5KHRlc3QpKSwgdGVzdC50aXRsZSB8fCB0ZXN0LmRlc2NyaXB0aW9uIHx8ICcnXVxuICAgIGNvbnN0IHRhZ3M6IHN0cmluZ1tdID0gW11cbiAgICBmb3IgKGNvbnN0IHRpdGxlIG9mIHRpdGxlcykge1xuICAgICAgICBmb3IgKGNvbnN0IHRhZyBvZiB0aXRsZS5tYXRjaChURVNUX1RBR19QQVRURVJOKSB8fCBbXSkge1xuICAgICAgICAgICAgaWYgKCF0YWdzLmluY2x1ZGVzKHRhZykpIHtcbiAgICAgICAgICAgICAgICB0YWdzLnB1c2godGFnKVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0YWdzXG59XG5cbi8qKlxuICogVHJ1ZSBvbmx5IGZvciB0aGUgaHViLWludGVycHJldGVkIGBicm93c2Vyc3RhY2tfZXhlY3V0b3I6IHtcdTIwMjZ9YCBtYWdpYyBzdHJpbmcuXG4gKiBBbmNob3JlZCB0byB0aGUgc3RhcnQgKGxlYWRpbmcgd2hpdGVzcGFjZSB0b2xlcmF0ZWQpIGFuZCBjYXNlLXNlbnNpdGl2ZSwgbWF0Y2hpbmdcbiAqIGhvdyB0aGUgaHViIHJlYWRzIHRoZSBwYXlsb2FkIFx1MjAxNCBhIHBsYWluIHNjcmlwdCBtZXJlbHkgbWVudGlvbmluZyB0aGUgdG9rZW4gbXVzdCBub3RcbiAqIGJlIHJlcm91dGVkIG9mZiBpdHMgbm9ybWFsIHRyYW5zcG9ydC5cbiAqL1xuZXhwb3J0IGNvbnN0IGlzQnJvd3NlcnN0YWNrRXhlY3V0b3JTY3JpcHQgPSAoc2NyaXB0OiB1bmtub3duKTogc2NyaXB0IGlzIHN0cmluZyA9PlxuICAgIHR5cGVvZiBzY3JpcHQgPT09ICdzdHJpbmcnICYmIHNjcmlwdC50cmltU3RhcnQoKS5zdGFydHNXaXRoKCdicm93c2Vyc3RhY2tfZXhlY3V0b3I6JylcblxuZXhwb3J0IGNvbnN0IHBlcmZvcm1PMTF5U3luYyA9IGFzeW5jIChicm93c2VyOiBXZWJkcml2ZXJJTy5Ccm93c2VyKSA9PiB7XG4gICAgaWYgKGlzQnJvd3NlcnN0YWNrU2Vzc2lvbihicm93c2VyKSkge1xuICAgICAgICBhd2FpdCBicm93c2VyLmV4ZWN1dGUoYGJyb3dzZXJzdGFja19leGVjdXRvcjogJHtKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICBhY3Rpb246ICdhbm5vdGF0ZScsXG4gICAgICAgICAgICBhcmd1bWVudHM6IHtcbiAgICAgICAgICAgICAgICBkYXRhOiBgT2JzZXJ2YWJpbGl0eVN5bmM6JHtEYXRlLm5vdygpfWAsXG4gICAgICAgICAgICAgICAgbGV2ZWw6ICdkZWJ1ZydcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSl9YClcbiAgICB9XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIHRoZSBjYXBhYmlsaXRpZXMgcmVwcmVzZW50IGEgbXVsdGlyZW1vdGUgY29uZmlndXJhdGlvblxuICogQHBhcmFtIGNhcGFiaWxpdGllcyAtIFRoZSBjYXBhYmlsaXRpZXMgdG8gY2hlY2tcbiAqIEByZXR1cm5zIHRydWUgaWYgY2FwYWJpbGl0aWVzIHJlcHJlc2VudCBhbnkgbXVsdGlyZW1vdGUgY29uZmlndXJhdGlvbiAocmVndWxhciBvciBwYXJhbGxlbClcbiAqXG4gKiBAZXhhbXBsZVxuICogUmVndWxhciBtdWx0aXJlbW90ZSAob2JqZWN0KTpcbiAqIHsgYnJvd3NlckE6IHsgY2FwYWJpbGl0aWVzOiB7Li4ufSB9LCBicm93c2VyQjogeyBjYXBhYmlsaXRpZXM6IHsuLi59IH0gfVxuICpcbiAqIFBhcmFsbGVsIG11bHRpcmVtb3RlIChhcnJheSB3aXRoIG5lc3RlZCBzdHJ1Y3R1cmUpOlxuICogW3sgYnJvd3NlckE6IHsgY2FwYWJpbGl0aWVzOiB7Li4ufSB9LCBicm93c2VyQjogeyBjYXBhYmlsaXRpZXM6IHsuLi59IH0gfV1cbiAqXG4gKiBSZWd1bGFyIGNhcGFiaWxpdGllcyAoYXJyYXkpOlxuICogW3sgYnJvd3Nlck5hbWU6ICdjaHJvbWUnLCAuLi4gfV1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzTXVsdGlSZW1vdGVDYXBzKGNhcGFiaWxpdGllczogQ2FwYWJpbGl0aWVzLlRlc3RydW5uZXJDYXBhYmlsaXRpZXMpOiBib29sZWFuIHtcbiAgICAvLyBSZWd1bGFyIG11bHRpcmVtb3RlIGlzIGFuIG9iamVjdCAobm90IGFycmF5KVxuICAgIGlmICghQXJyYXkuaXNBcnJheShjYXBhYmlsaXRpZXMpKSB7XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuXG4gICAgLy8gRW1wdHkgYXJyYXkgaXMgbm90IG11bHRpcmVtb3RlXG4gICAgaWYgKGNhcGFiaWxpdGllcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuXG4gICAgLy8gUGFyYWxsZWwgbXVsdGlyZW1vdGUgaXMgYW4gYXJyYXkgd2l0aCBuZXN0ZWQgY2FwYWJpbGl0aWVzIHN0cnVjdHVyZVxuICAgIHJldHVybiBjYXBhYmlsaXRpZXMuZXZlcnkoY2FwID0+XG4gICAgICAgIE9iamVjdC52YWx1ZXMoY2FwKS5sZW5ndGggPiAwICYmXG4gICAgICAgIE9iamVjdC52YWx1ZXMoY2FwKS5ldmVyeShjID0+IGMgIT09IG51bGwgJiYgdHlwZW9mIGMgPT09ICdvYmplY3QnICYmIChjIGFzIHsgY2FwYWJpbGl0aWVzOiBXZWJkcml2ZXJJTy5DYXBhYmlsaXRpZXMgfSkuY2FwYWJpbGl0aWVzKVxuICAgIClcbn1cbiIsICJpbXBvcnQgVHJhbnNwb3J0IGZyb20gJ3dpbnN0b24tdHJhbnNwb3J0J1xuXG5jb25zdCBMT0dfTEVWRUxTID0ge1xuICAgIElORk86ICdJTkZPJywgRVJST1I6ICdFUlJPUicsIERFQlVHOiAnREVCVUcnLCBUUkFDRTogJ1RSQUNFJywgV0FSTjogJ1dBUk4nLFxufVxuXG5jbGFzcyBsb2dQYXRjaGVyIGV4dGVuZHMgVHJhbnNwb3J0IHtcbiAgICBsb2dUb1Rlc3RPcHMgPSAobGV2ZWwgPSBMT0dfTEVWRUxTLklORk8sIG1lc3NhZ2UgPSBbJyddIGFzIHVua25vd25bXSkgPT4ge1xuICAgICAgICAocHJvY2Vzcy5lbWl0IGFzIEZ1bmN0aW9uKShgYnM6YWRkTG9nOiR7cHJvY2Vzcy5waWR9YCwge1xuICAgICAgICAgICAgdGltZXN0YW1wOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgICAgICAgICBsZXZlbDogbGV2ZWwudG9VcHBlckNhc2UoKSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IGBcIiR7bWVzc2FnZS5qb2luKCcsICcpfVwiYCxcbiAgICAgICAgICAgIGtpbmQ6ICdURVNUX0xPRycsXG4gICAgICAgICAgICBodHRwX3Jlc3BvbnNlOiB7fVxuICAgICAgICB9KVxuICAgIH1cblxuICAgIC8qIFBhdGNoaW5nIHRoaXMgd291bGQgc2hvdyB1c2VyIGFuIGV4dGVuZGVkIHRyYWNlIG9uIHRoZWlyIGNsaSAqL1xuICAgIHRyYWNlID0gKC4uLm1lc3NhZ2U6IHVua25vd25bXSkgPT4ge1xuICAgICAgICB0aGlzLmxvZ1RvVGVzdE9wcyhMT0dfTEVWRUxTLlRSQUNFLCBtZXNzYWdlKVxuICAgIH1cblxuICAgIGRlYnVnID0gKC4uLm1lc3NhZ2U6IHVua25vd25bXSkgPT4ge1xuICAgICAgICB0aGlzLmxvZ1RvVGVzdE9wcyhMT0dfTEVWRUxTLkRFQlVHLCBtZXNzYWdlKVxuICAgIH1cblxuICAgIGluZm8gPSAoLi4ubWVzc2FnZTogdW5rbm93bltdKSA9PiB7XG4gICAgICAgIHRoaXMubG9nVG9UZXN0T3BzKExPR19MRVZFTFMuSU5GTywgbWVzc2FnZSlcbiAgICB9XG5cbiAgICB3YXJuID0gKC4uLm1lc3NhZ2U6IHVua25vd25bXSkgPT4ge1xuICAgICAgICB0aGlzLmxvZ1RvVGVzdE9wcyhMT0dfTEVWRUxTLldBUk4sIG1lc3NhZ2UpXG4gICAgfVxuXG4gICAgZXJyb3IgPSAoLi4ubWVzc2FnZTogdW5rbm93bltdKSA9PiB7XG4gICAgICAgIHRoaXMubG9nVG9UZXN0T3BzKExPR19MRVZFTFMuRVJST1IsIG1lc3NhZ2UpXG4gICAgfVxuXG4gICAgbG9nID0gKC4uLm1lc3NhZ2U6IHVua25vd25bXSkgPT4ge1xuICAgICAgICB0aGlzLmxvZ1RvVGVzdE9wcyhMT0dfTEVWRUxTLklORk8sIG1lc3NhZ2UpXG4gICAgfVxufVxuZXhwb3J0IGRlZmF1bHQgbG9nUGF0Y2hlclxuIiwgImltcG9ydCB7IGNyZWF0ZU9iamVjdENzdldyaXRlciB9IGZyb20gJ2Nzdi13cml0ZXInXG5pbXBvcnQgZnMgZnJvbSAnbm9kZTpmcydcbmltcG9ydCBmc1Byb21pc2UgZnJvbSAnbm9kZTpmcy9wcm9taXNlcydcbmltcG9ydCB0eXBlIHsgRW50cnlUeXBlIH0gZnJvbSAnbm9kZTpwZXJmX2hvb2tzJ1xuaW1wb3J0IHsgcGVyZm9ybWFuY2UsIFBlcmZvcm1hbmNlT2JzZXJ2ZXIgfSBmcm9tICdub2RlOnBlcmZfaG9va3MnXG5pbXBvcnQgdXRpbCBmcm9tICdub2RlOnV0aWwnXG5pbXBvcnQgd29ya2VyIGZyb20gJ25vZGU6d29ya2VyX3RocmVhZHMnXG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnXG5pbXBvcnQgeyBhcmNoLCBob3N0bmFtZSwgcGxhdGZvcm0sIHR5cGUsIHZlcnNpb24gfSBmcm9tICdub2RlOm9zJ1xuXG5pbXBvcnQgeyBCU3RhY2tMb2dnZXIgfSBmcm9tICcuLi8uLi9ic3RhY2tMb2dnZXIuanMnXG5pbXBvcnQgeyBQRVJGX01FQVNVUkVNRU5UX0VOViB9IGZyb20gJy4uLy4uL2NvbnN0YW50cy5qcydcbmltcG9ydCBBUElVdGlscyBmcm9tICcuLi8uLi9jbGkvYXBpVXRpbHMuanMnXG5pbXBvcnQgeyBDTElVdGlscyB9IGZyb20gJy4uLy4uL2NsaS9jbGlVdGlscy5qcydcbmltcG9ydCB7IEVWRU5UUyB9IGZyb20gJy4vY29uc3RhbnRzLmpzJ1xuaW1wb3J0IGZldGNoV3JhcCBmcm9tICcuLi8uLi9mZXRjaFdyYXBwZXIuanMnXG5pbXBvcnQgdHlwZSB7IENzdldyaXRlciB9IGZyb20gJ2Nzdi13cml0ZXIvc3JjL2xpYi9jc3Ytd3JpdGVyLmpzJ1xuaW1wb3J0IHR5cGUgeyBPYmplY3RNYXAgfSBmcm9tICdjc3Ytd3JpdGVyL3NyYy9saWIvbGFuZy9vYmplY3QuanMnXG5pbXBvcnQgdHlwZSB7IEJyb3dzZXIgfSBmcm9tICd3ZWJkcml2ZXJpbydcblxuLy8gVGVsZW1ldHJ5IG11c3QgbmV2ZXIgdGhyb3cgaW50byBidXNpbmVzcyBsb2dpYy4gTm9kZSAxOCdzIHBlcmZfaG9va3MgcmVqZWN0c1xuLy8gbmVnYXRpdmUgdGltZXN0YW1wcyAoZS5nLiBwZXJmb3JtYW5jZS5ub3coKSB1bmRlciBmYWtlZCB0aW1lcnMsIG9yIGFueSBvdGhlclxuLy8gZWRnZSkgd2l0aCBFUlJfUEVSRk9STUFOQ0VfSU5WQUxJRF9USU1FU1RBTVA7IE5vZGUgMjArIHRvbGVyYXRlcyB0aGVtLiBXcmFwcGluZ1xuLy8gbWFyay9tZWFzdXJlIGtlZXBzIGFuIGluc3RydW1lbnRhdGlvbiBmYWlsdXJlIGZyb20gYnJlYWtpbmcgYSBjYWxsZXIncyBob29rXG4vLyAoZS5nLiBhIHNlcnZpY2UgYmVmb3JlKCkpLCBhbmQgaXMgYSBuby1vcCBvbiB0aGUgaGFwcHkgcGF0aC5cbmZ1bmN0aW9uIHNhZmVNYXJrKG1hcmtOYW1lOiBzdHJpbmcpIHtcbiAgICB0cnkgeyBwZXJmb3JtYW5jZS5tYXJrKG1hcmtOYW1lKSB9IGNhdGNoIHsgLyogaW5zdHJ1bWVudGF0aW9uIG11c3Qgbm90IHRocm93ICovIH1cbn1cbmZ1bmN0aW9uIHNhZmVNZWFzdXJlKG1lYXN1cmVOYW1lOiBzdHJpbmcsIHN0YXJ0OiBzdHJpbmcsIGVuZDogc3RyaW5nKSB7XG4gICAgdHJ5IHsgcGVyZm9ybWFuY2UubWVhc3VyZShtZWFzdXJlTmFtZSwgc3RhcnQsIGVuZCkgfSBjYXRjaCB7IC8qIGluc3RydW1lbnRhdGlvbiBtdXN0IG5vdCB0aHJvdyAqLyB9XG59XG5cbnR5cGUgUGVyZm9ybWFuY2VEZXRhaWxzID0ge1xuICAgIHN1Y2Nlc3M/OiB0cnVlLFxuICAgIGZhaWx1cmU/OiBzdHJpbmcsXG4gICAgdGVzdE5hbWU/OiBzdHJpbmcsXG4gICAgd29ya2VyPzogc3RyaW5nIHwgbnVtYmVyLFxuICAgIGNsaWVudFdvcmtlcklkPzogc3RyaW5nLFxuICAgIGNvbW1hbmQ/OiBzdHJpbmcsXG4gICAgaG9va1R5cGU/OiBzdHJpbmcsXG4gICAgcGxhdGZvcm0/OiBzdHJpbmcgfCBudW1iZXJcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUGVyZm9ybWFuY2VUZXN0ZXIge1xuICAgIHN0YXRpYyBfb2JzZXJ2ZXI6IFBlcmZvcm1hbmNlT2JzZXJ2ZXJcbiAgICBzdGF0aWMgX2NzdldyaXRlcjogQ3N2V3JpdGVyPE9iamVjdE1hcDx7fT4+XG4gICAgcHJpdmF0ZSBzdGF0aWMgX2V2ZW50czogUGVyZm9ybWFuY2VFbnRyeVtdID0gW11cbiAgICBwcml2YXRlIHN0YXRpYyBfbWVhc3VyZWRFdmVudHM6IEFycmF5PFBlcmZvcm1hbmNlRW50cnkgfCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4gPSBbXVxuICAgIHByaXZhdGUgc3RhdGljIF9oYXNTdG9wcGVkR2VuZXJhdGlvbiA9IGZhbHNlXG4gICAgcHJpdmF0ZSBzdGF0aWMgX3N0b3BHZW5lcmF0ZUNhbGxDb3VudCA9IDBcbiAgICBzdGF0aWMgc3RhcnRlZCA9IGZhbHNlXG4gICAgc3RhdGljIGRldGFpbHM6IHsgW2tleTogc3RyaW5nXTogUGVyZm9ybWFuY2VEZXRhaWxzIH0gPSB7fVxuICAgIHN0YXRpYyBldmVudHNNYXA6IHsgW2tleTogc3RyaW5nXTogbnVtYmVyIH0gPSB7fVxuICAgIHN0YXRpYyBicm93c2VyPzogQnJvd3NlclxuICAgIHN0YXRpYyBzY2VuYXJpb1RoYXRSYW46IHN0cmluZ1tdXG4gICAgc3RhdGljIGpzb25SZXBvcnREaXJOYW1lID0gJ3BlcmZvcm1hbmNlLXJlcG9ydCdcbiAgICBzdGF0aWMganNvblJlcG9ydERpclBhdGggPSBwYXRoLmpvaW4ocHJvY2Vzcy5jd2QoKSwgJ2xvZ3MnLCB0aGlzLmpzb25SZXBvcnREaXJOYW1lKVxuICAgIHN0YXRpYyBqc29uUmVwb3J0RmlsZU5hbWUgPSBgJHt0aGlzLmpzb25SZXBvcnREaXJQYXRofS9wZXJmb3JtYW5jZS1yZXBvcnQtJHtQZXJmb3JtYW5jZVRlc3Rlci5nZXRQcm9jZXNzSWQoKX0uanNvbmBcblxuICAgIHN0YXRpYyBzdGFydE1vbml0b3JpbmcoY3N2TmFtZTogc3RyaW5nID0gJ3BlcmZvcm1hbmNlLXJlcG9ydC5jc3YnKSB7XG5cbiAgICAgICAgLy8gQ3JlYXRlIHBlcmZvcm1hbmNlLXJlcG9ydCBkaXIgaWYgbm90IGV4aXN0cyBhbHJlYWR5XG4gICAgICAgIGlmICghZnMuZXhpc3RzU3luYyh0aGlzLmpzb25SZXBvcnREaXJQYXRoKSkge1xuICAgICAgICAgICAgZnMubWtkaXJTeW5jKHRoaXMuanNvblJlcG9ydERpclBhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fb2JzZXJ2ZXIgPSBuZXcgUGVyZm9ybWFuY2VPYnNlcnZlcihsaXN0ID0+IHtcbiAgICAgICAgICAgIGxpc3QuZ2V0RW50cmllcygpXG4gICAgICAgICAgICAgICAgLmZpbHRlcigoZW50cnkpID0+IGVudHJ5LmVudHJ5VHlwZSA9PT0gJ21lYXN1cmUnKVxuICAgICAgICAgICAgICAgIC5mb3JFYWNoKGVudHJ5ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGZpbmFsRW50cnk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0gZW50cnkudG9KU09OKCkgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj5cblxuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBmaW5hbEVudHJ5LnN0YXJ0VGltZSA9PT0gJ251bWJlcicgJiYgdHlwZW9mIHBlcmZvcm1hbmNlLnRpbWVPcmlnaW4gPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgb3JpZ2luYWxTdGFydFRpbWUgPSBmaW5hbEVudHJ5LnN0YXJ0VGltZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsRW50cnkuc3RhcnRUaW1lID0gcGVyZm9ybWFuY2UudGltZU9yaWdpbiArIGZpbmFsRW50cnkuc3RhcnRUaW1lXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLmRlYnVnKGBUaW1lc3RhbXAgY29udmVyc2lvbiBmb3IgJHtlbnRyeS5uYW1lfTogJHtvcmlnaW5hbFN0YXJ0VGltZX0gLT4gJHtmaW5hbEVudHJ5LnN0YXJ0VGltZX0gKHRpbWVPcmlnaW46ICR7cGVyZm9ybWFuY2UudGltZU9yaWdpbn0pYClcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLmRlYnVnKGBFcnJvciBjb252ZXJ0aW5nIHN0YXJ0VGltZSB0byBlcG9jaDogJHt1dGlsLmZvcm1hdChlKX1gKVxuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuZGV0YWlsc1tlbnRyeS5uYW1lXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZmluYWxFbnRyeSA9IE9iamVjdC5hc3NpZ24oZmluYWxFbnRyeSwgdGhpcy5kZXRhaWxzW2VudHJ5Lm5hbWVdKVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmRldGFpbHNbZW50cnkubmFtZV1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbWVhc3VyZWRFdmVudHMucHVzaChmaW5hbEVudHJ5KVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICApXG5cbiAgICAgICAgICAgIGlmIChwcm9jZXNzLmVudltQRVJGX01FQVNVUkVNRU5UX0VOVl0pIHtcbiAgICAgICAgICAgICAgICBsaXN0LmdldEVudHJpZXMoKS5mb3JFYWNoKChlbnRyeSkgPT4gdGhpcy5fZXZlbnRzLnB1c2goZW50cnkpKVxuICAgICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgICBjb25zdCBlbnRyeVR5cGVzOiBFbnRyeVR5cGVbXSA9IFsnbWVhc3VyZSddXG4gICAgICAgIGlmIChwcm9jZXNzLmVudltQRVJGX01FQVNVUkVNRU5UX0VOVl0pIHtcbiAgICAgICAgICAgIGVudHJ5VHlwZXMucHVzaCgnZnVuY3Rpb24nKVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuX29ic2VydmVyLm9ic2VydmUoeyBidWZmZXJlZDogdHJ1ZSwgZW50cnlUeXBlczogZW50cnlUeXBlcyB9KVxuICAgICAgICB0aGlzLnN0YXJ0ZWQgPSB0cnVlXG4gICAgICAgIGlmIChwcm9jZXNzLmVudltQRVJGX01FQVNVUkVNRU5UX0VOVl0pIHtcbiAgICAgICAgICAgIHRoaXMuX2NzdldyaXRlciA9IGNyZWF0ZU9iamVjdENzdldyaXRlcih7XG4gICAgICAgICAgICAgICAgcGF0aDogY3N2TmFtZSxcbiAgICAgICAgICAgICAgICBoZWFkZXI6IFtcbiAgICAgICAgICAgICAgICAgICAgeyBpZDogJ25hbWUnLCB0aXRsZTogJ0Z1bmN0aW9uIE5hbWUnIH0sXG4gICAgICAgICAgICAgICAgICAgIHsgaWQ6ICd0aW1lJywgdGl0bGU6ICdFeGVjdXRpb24gVGltZSAobXMpJyB9XG4gICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHN0YXRpYyBjYWxjdWxhdGVUaW1lcyhtZXRob2RzOiBzdHJpbmdbXSkgOiBudW1iZXIge1xuICAgICAgICBjb25zdCB0aW1lczogeyBba2V5OiBzdHJpbmddOiBudW1iZXIgfSA9IHt9XG4gICAgICAgIHRoaXMuX2V2ZW50cy5tYXAoKGVudHJ5KSA9PiB7XG4gICAgICAgICAgICBpZiAoIXRpbWVzW2VudHJ5Lm5hbWVdKSB7XG4gICAgICAgICAgICAgICAgdGltZXNbZW50cnkubmFtZV0gPSAwXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aW1lc1tlbnRyeS5uYW1lXSArPSBlbnRyeS5kdXJhdGlvblxuICAgICAgICB9KVxuICAgICAgICBjb25zdCB0aW1lVGFrZW4gPSBtZXRob2RzLnJlZHVjZSgoYSwgYykgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRpbWVzW2NdICsgKGEgfHwgMClcbiAgICAgICAgfSwgMClcbiAgICAgICAgQlN0YWNrTG9nZ2VyLmRlYnVnKGBUaW1lIGZvciAke21ldGhvZHN9IGlzICR7dGltZVRha2VufWApXG4gICAgICAgIHJldHVybiB0aW1lVGFrZW5cbiAgICB9XG5cbiAgICBzdGF0aWMgYXN5bmMgc3RvcEFuZEdlbmVyYXRlKGZpbGVuYW1lOiBzdHJpbmcgPSAncGVyZm9ybWFuY2Utb3duLmh0bWwnKSB7XG4gICAgICAgIGlmICghdGhpcy5zdGFydGVkKSB7XG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgZXZlbnRzSnNvbiA9IEpTT04uc3RyaW5naWZ5KHRoaXMuX21lYXN1cmVkRXZlbnRzKVxuICAgICAgICAgICAgLy8gcmVtb3ZlIGVuY2xvc2luZyBhcnJheSBhbmQgYWRkIGEgdHJhaWxpbmcgY29tbWEgc28gdGhhdCB3ZVxuICAgICAgICAgICAgLy8gZG9udCBuZWVkIHRvIGJvdGggcmVhZCBhbmQgdGhlbiB3cml0ZSB0aGUgZmlsZSwgd2UgY2FuIHVzZSBhcHBlbmQgaW5zdGVhZFxuICAgICAgICAgICAgY29uc3QgZmluYWxKU09OU3RyID0gZXZlbnRzSnNvbi5zbGljZSgxLCAtMSkgKyAnLCdcbiAgICAgICAgICAgIGF3YWl0IGZzUHJvbWlzZS5hcHBlbmRGaWxlKHRoaXMuanNvblJlcG9ydEZpbGVOYW1lLCBmaW5hbEpTT05TdHIpXG4gICAgICAgIH0gY2F0Y2ggKGVyKSB7XG4gICAgICAgICAgICBCU3RhY2tMb2dnZXIuZGVidWcoYEZhaWxlZCB0byB3cml0ZSBldmVudHMgb2YgdGhlIHdvcmtlciB0byAke3RoaXMuanNvblJlcG9ydEZpbGVOYW1lfTogJHt1dGlsLmZvcm1hdChlcil9YClcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9vYnNlcnZlci5kaXNjb25uZWN0KClcblxuICAgICAgICBpZiAoIXByb2Nlc3MuZW52W1BFUkZfTUVBU1VSRU1FTlRfRU5WXSkge1xuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnN0YXJ0ZWQgPSBmYWxzZVxuXG4gICAgICAgIC8vIEdlbmVyYXRlIENTViBhbmQgSFRNTCByZXBvcnRzIHVzaW5nIGRpcmVjdGx5IGNvbGxlY3RlZCBldmVudHNcbiAgICAgICAgdGhpcy5nZW5lcmF0ZUNTVih0aGlzLl9ldmVudHMpXG5cbiAgICAgICAgY29uc3QgY29udGVudCA9IHRoaXMuZ2VuZXJhdGVSZXBvcnQodGhpcy5fZXZlbnRzKVxuICAgICAgICBjb25zdCBkaXIgPSBwYXRoLmpvaW4ocHJvY2Vzcy5jd2QoKSwgZmlsZW5hbWUpXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCBmc1Byb21pc2Uud3JpdGVGaWxlKGRpciwgY29udGVudClcbiAgICAgICAgICAgIEJTdGFja0xvZ2dlci5pbmZvKGBQZXJmb3JtYW5jZSByZXBvcnQgaXMgYXQgJHtwYXRofWApXG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLmVycm9yKGBFcnJvciBpbiB3cml0aW5nIGh0bWwgJHt1dGlsLmZvcm1hdChlcnIpfWApXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzdGF0aWMgZ2VuZXJhdGVSZXBvcnQoZW50cmllczogUGVyZm9ybWFuY2VFbnRyeVtdKSB7XG4gICAgICAgIGxldCBodG1sID0gJzwhRE9DVFlQRSBodG1sPjxodG1sPjxoZWFkPjx0aXRsZT5QZXJmb3JtYW5jZSBSZXBvcnQ8L3RpdGxlPjwvaGVhZD48Ym9keT4nXG4gICAgICAgIGh0bWwgKz0gJzxoMT5QZXJmb3JtYW5jZSBSZXBvcnQ8L2gxPidcbiAgICAgICAgaHRtbCArPSAnPHRhYmxlPjx0aGVhZD48dHI+PHRoPkZ1bmN0aW9uIE5hbWU8L3RoPjx0aD5EdXJhdGlvbiAobXMpPC90aD48L3RyPjwvdGhlYWQ+PHRib2R5PidcbiAgICAgICAgZW50cmllcy5mb3JFYWNoKChlbnRyeSkgPT4ge1xuICAgICAgICAgICAgaHRtbCArPSBgPHRyPjx0ZD4ke2VudHJ5Lm5hbWV9PC90ZD48dGQ+JHtlbnRyeS5kdXJhdGlvbn08L3RkPjwvdHI+YFxuICAgICAgICB9KVxuICAgICAgICBodG1sICs9ICc8L3Rib2R5PjwvdGFibGU+PC9ib2R5PjwvaHRtbD4nXG4gICAgICAgIHJldHVybiBodG1sXG4gICAgfVxuXG4gICAgc3RhdGljIGdlbmVyYXRlQ1NWKGVudHJpZXM6IFBlcmZvcm1hbmNlRW50cnlbXSkge1xuICAgICAgICBjb25zdCB0aW1lczogeyBba2V5OiBzdHJpbmddOiBudW1iZXIgfSA9IHt9XG4gICAgICAgIGVudHJpZXMubWFwKChlbnRyeSkgPT4ge1xuICAgICAgICAgICAgaWYgKCF0aW1lc1tlbnRyeS5uYW1lXSkge1xuICAgICAgICAgICAgICAgIHRpbWVzW2VudHJ5Lm5hbWVdID0gMFxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGltZXNbZW50cnkubmFtZV0gKz0gZW50cnkuZHVyYXRpb25cblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBuYW1lOiBlbnRyeS5uYW1lLFxuICAgICAgICAgICAgICAgIHRpbWU6IGVudHJ5LmR1cmF0aW9uXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICAgIGNvbnN0IGRhdCA9IE9iamVjdC5lbnRyaWVzKHRpbWVzKS5tYXAoKFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBuYW1lOiBrZXksXG4gICAgICAgICAgICAgICAgdGltZTogdmFsdWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICAgdGhpcy5fY3N2V3JpdGVyLndyaXRlUmVjb3JkcyhkYXQpXG4gICAgICAgICAgICAudGhlbigoKSA9PiBCU3RhY2tMb2dnZXIuaW5mbygnUGVyZm9ybWFuY2UgQ1NWIHJlcG9ydCBnZW5lcmF0ZWQgc3VjY2Vzc2Z1bGx5JykpXG4gICAgICAgICAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4gY29uc29sZS5lcnJvcihlcnJvcikpXG4gICAgfVxuXG4gICAgc3RhdGljIE1lYXN1cmUobGFiZWw6IHN0cmluZywgZGV0YWlsczogUGVyZm9ybWFuY2VEZXRhaWxzID0ge30pIHtcbiAgICAgICAgY29uc3Qgc2VsZiA9IHRoaXNcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIHRhcmdldDogb2JqZWN0LFxuICAgICAgICAgICAga2V5OiBzdHJpbmcgfCBzeW1ib2wsXG4gICAgICAgICAgICBkZXNjcmlwdG9yOiBUeXBlZFByb3BlcnR5RGVzY3JpcHRvcjxGdW5jdGlvbj4pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG9yaWdpbmFsTWV0aG9kOiBGdW5jdGlvbnx1bmRlZmluZWQgPSBkZXNjcmlwdG9yLnZhbHVlXG4gICAgICAgICAgICBpZiAoZGVzY3JpcHRvci52YWx1ZSkge1xuICAgICAgICAgICAgICAgIGRlc2NyaXB0b3IudmFsdWUgPSBmdW5jdGlvbiguLi5hcmdzOiBvYmplY3RbXSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gUGVyZm9ybWFuY2VUZXN0ZXIubWVhc3VyZS5hcHBseShzZWxmLCBbbGFiZWwsIG9yaWdpbmFsTWV0aG9kIGFzIEZ1bmN0aW9uLCB7IG1ldGhvZE5hbWU6IGtleS50b1N0cmluZygpLCAuLi5kZXRhaWxzIH0sIGFyZ3MsIHRoaXNdKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHN0YXRpYyBtZWFzdXJlV3JhcHBlcihuYW1lOiBzdHJpbmcsIGZuOiBGdW5jdGlvbiwgZGV0YWlsczogUGVyZm9ybWFuY2VEZXRhaWxzID0ge30pIHtcbiAgICAgICAgY29uc3Qgc2VsZiA9IHRoaXNcblxuICAgICAgICBkZXRhaWxzLndvcmtlciA9IFBlcmZvcm1hbmNlVGVzdGVyLmdldFByb2Nlc3NJZCgpXG4gICAgICAgIGRldGFpbHMudGVzdE5hbWUgPSBQZXJmb3JtYW5jZVRlc3Rlci5zY2VuYXJpb1RoYXRSYW4gJiYgUGVyZm9ybWFuY2VUZXN0ZXIuc2NlbmFyaW9UaGF0UmFuW1BlcmZvcm1hbmNlVGVzdGVyLnNjZW5hcmlvVGhhdFJhbi5sZW5ndGggLSAxXVxuICAgICAgICBkZXRhaWxzLnBsYXRmb3JtID0gUGVyZm9ybWFuY2VUZXN0ZXIuYnJvd3Nlcj8uc2Vzc2lvbklkXG5cbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICguLi5hcmdzOiAob2JqZWN0fGJvb2xlYW58dW5kZWZpbmVkfG51bGx8c3RyaW5nKVtdKSB7XG5cbiAgICAgICAgICAgIHJldHVybiBzZWxmLm1lYXN1cmUobmFtZSwgZm4sIGRldGFpbHMsIGFyZ3MpXG4gICAgICAgIH1cblxuICAgIH1cblxuICAgIHN0YXRpYyBpc0VuYWJsZWQoKSB7XG4gICAgICAgIHJldHVybiAhKHByb2Nlc3MuZW52LkJST1dTRVJTVEFDS19TREtfSU5TVFJVTUVOVEFUSU9OID09PSAnZmFsc2UnKVxuICAgIH1cblxuICAgIHN0YXRpYyBtZWFzdXJlKGxhYmVsOiBzdHJpbmcsIGZuOiBGdW5jdGlvbiwgZGV0YWlscyA9IHt9LCBhcmdzPzogKG9iamVjdHxib29sZWFufHVuZGVmaW5lZHxudWxsfHN0cmluZylbXSwgdGhpc0FyZzogb2JqZWN0fG51bGwgPSBudWxsKSB7XG4gICAgICAgIGlmICghdGhpcy5zdGFydGVkIHx8ICF0aGlzLmlzRW5hYmxlZCgpKSB7XG4gICAgICAgICAgICByZXR1cm4gZm4uYXBwbHkodGhpc0FyZywgYXJncylcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEdlbmVyYXRlIHVuaXF1ZSBtYXJrIG5hbWVzIGZvciB0aGlzIHNwZWNpZmljIGNhbGwgdG8gYXZvaWQgdGltaW5nIGNvbmZsaWN0c1xuICAgICAgICBjb25zdCB1bmlxdWVJZCA9IGAke0RhdGUubm93KCl9LSR7TWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc3Vic3RyaW5nKDcpfWBcbiAgICAgICAgY29uc3Qgc3RhcnRNYXJrID0gYCR7bGFiZWx9LXN0YXJ0LSR7dW5pcXVlSWR9YFxuICAgICAgICBjb25zdCBlbmRNYXJrID0gYCR7bGFiZWx9LWVuZC0ke3VuaXF1ZUlkfWBcblxuICAgICAgICAvLyBDcmVhdGUgdGhlIHN0YXJ0IG1hcmsgd2l0aCB1bmlxdWUgSURcbiAgICAgICAgc2FmZU1hcmsoc3RhcnRNYXJrKVxuXG4gICAgICAgIC8vIFN0b3JlIGRldGFpbHMgd2l0aCBtZWFzdXJlbWVudCBjb250ZXh0XG4gICAgICAgIGNvbnN0IGRldGFpbHNXaXRoQ29udGV4dCA9IHtcbiAgICAgICAgICAgIC4uLmRldGFpbHMsXG4gICAgICAgICAgICBtZWFzdXJlbWVudElkOiB1bmlxdWVJZFxuICAgICAgICB9XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHJldHVyblZhbCA9IGZuLmFwcGx5KHRoaXNBcmcsIGFyZ3MpXG5cbiAgICAgICAgICAgIGlmIChyZXR1cm5WYWwgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuVmFsXG4gICAgICAgICAgICAgICAgICAgICAgICAudGhlbih2ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBVc2Ugc3BlY2lmaWMgbWFya3MgZm9yIHRoaXMgY2FsbFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhZmVNYXJrKGVuZE1hcmspXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FmZU1lYXN1cmUobGFiZWwsIHN0YXJ0TWFyaywgZW5kTWFyaylcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGV0YWlsc1tsYWJlbF0gPSBPYmplY3QuYXNzaWduKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VjY2VzczogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFpbHVyZTogdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50V29ya2VySWQ6IFBlcmZvcm1hbmNlVGVzdGVyLmdldENsaWVudFdvcmtlcklkKCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtlcjogUGVyZm9ybWFuY2VUZXN0ZXIuZ2V0UHJvY2Vzc0lkKCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXRmb3JtOiBQZXJmb3JtYW5jZVRlc3Rlci5icm93c2VyPy5zZXNzaW9uSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3ROYW1lOiBQZXJmb3JtYW5jZVRlc3Rlci5zY2VuYXJpb1RoYXRSYW4/LnBvcCgpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgZGV0YWlsc1dpdGhDb250ZXh0KSwgdGhpcy5kZXRhaWxzW2xhYmVsXSB8fCB7fSkpXG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHYpXG4gICAgICAgICAgICAgICAgICAgICAgICB9KS5jYXRjaChlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYWZlTWFyayhlbmRNYXJrKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhZmVNZWFzdXJlKGxhYmVsLCBzdGFydE1hcmssIGVuZE1hcmspXG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRldGFpbHNbbGFiZWxdID0gT2JqZWN0LmFzc2lnbih7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWlsdXJlOiB1dGlsLmZvcm1hdChlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudFdvcmtlcklkOiBQZXJmb3JtYW5jZVRlc3Rlci5nZXRDbGllbnRXb3JrZXJJZCgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrZXI6IFBlcmZvcm1hbmNlVGVzdGVyLmdldFByb2Nlc3NJZCgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF0Zm9ybTogUGVyZm9ybWFuY2VUZXN0ZXIuYnJvd3Nlcj8uc2Vzc2lvbklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0TmFtZTogUGVyZm9ybWFuY2VUZXN0ZXIuc2NlbmFyaW9UaGF0UmFuPy5wb3AoKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGRldGFpbHNXaXRoQ29udGV4dCksIHRoaXMuZGV0YWlsc1tsYWJlbF0gfHwge30pKVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGUpXG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFN5bmNocm9ub3VzIGV4ZWN1dGlvblxuICAgICAgICAgICAgc2FmZU1hcmsoZW5kTWFyaylcbiAgICAgICAgICAgIHNhZmVNZWFzdXJlKGxhYmVsLCBzdGFydE1hcmssIGVuZE1hcmspXG5cbiAgICAgICAgICAgIHRoaXMuZGV0YWlsc1tsYWJlbF0gPSBPYmplY3QuYXNzaWduKHtcbiAgICAgICAgICAgICAgICBzdWNjZXNzOiB0cnVlLFxuICAgICAgICAgICAgICAgIGZhaWx1cmU6IHVuZGVmaW5lZFxuICAgICAgICAgICAgfSwgT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHtcbiAgICAgICAgICAgICAgICBjbGllbnRXb3JrZXJJZDogUGVyZm9ybWFuY2VUZXN0ZXIuZ2V0Q2xpZW50V29ya2VySWQoKSxcbiAgICAgICAgICAgICAgICB3b3JrZXI6IFBlcmZvcm1hbmNlVGVzdGVyLmdldFByb2Nlc3NJZCgpLFxuICAgICAgICAgICAgICAgIHBsYXRmb3JtOiBQZXJmb3JtYW5jZVRlc3Rlci5icm93c2VyPy5zZXNzaW9uSWQsXG4gICAgICAgICAgICAgICAgdGVzdE5hbWU6IFBlcmZvcm1hbmNlVGVzdGVyLnNjZW5hcmlvVGhhdFJhbj8ucG9wKClcbiAgICAgICAgICAgIH0sIGRldGFpbHNXaXRoQ29udGV4dCksIHRoaXMuZGV0YWlsc1tsYWJlbF0gfHwge30pKVxuXG4gICAgICAgICAgICByZXR1cm4gcmV0dXJuVmFsXG4gICAgICAgIH0gY2F0Y2ggKGVyKSB7XG4gICAgICAgICAgICBzYWZlTWFyayhlbmRNYXJrKVxuICAgICAgICAgICAgc2FmZU1lYXN1cmUobGFiZWwsIHN0YXJ0TWFyaywgZW5kTWFyaylcblxuICAgICAgICAgICAgdGhpcy5kZXRhaWxzW2xhYmVsXSA9IE9iamVjdC5hc3NpZ24oe1xuICAgICAgICAgICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICAgICAgICAgIGZhaWx1cmU6IHV0aWwuZm9ybWF0KGVyKVxuICAgICAgICAgICAgfSwgT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHtcbiAgICAgICAgICAgICAgICBjbGllbnRXb3JrZXJJZDogUGVyZm9ybWFuY2VUZXN0ZXIuZ2V0Q2xpZW50V29ya2VySWQoKSxcbiAgICAgICAgICAgICAgICB3b3JrZXI6IFBlcmZvcm1hbmNlVGVzdGVyLmdldFByb2Nlc3NJZCgpLFxuICAgICAgICAgICAgICAgIHBsYXRmb3JtOiBQZXJmb3JtYW5jZVRlc3Rlci5icm93c2VyPy5zZXNzaW9uSWQsXG4gICAgICAgICAgICAgICAgdGVzdE5hbWU6IFBlcmZvcm1hbmNlVGVzdGVyLnNjZW5hcmlvVGhhdFJhbj8ucG9wKClcbiAgICAgICAgICAgIH0sIGRldGFpbHNXaXRoQ29udGV4dCksIHRoaXMuZGV0YWlsc1tsYWJlbF0gfHwge30pKVxuXG4gICAgICAgICAgICB0aHJvdyBlclxuICAgICAgICB9XG4gICAgfVxuXG4gICAgc3RhdGljIHN0YXJ0KGV2ZW50OiBzdHJpbmcpIHtcbiAgICAgICAgY29uc3QgZmluYWxFdmVudCA9IGV2ZW50ICsgJy1zdGFydCdcbiAgICAgICAgaWYgKHRoaXMuZXZlbnRzTWFwW2ZpbmFsRXZlbnRdKSB7cmV0dXJufVxuICAgICAgICBzYWZlTWFyayhmaW5hbEV2ZW50KVxuICAgICAgICB0aGlzLmV2ZW50c01hcFtmaW5hbEV2ZW50XSA9IDFcbiAgICB9XG5cbiAgICBzdGF0aWMgZW5kKGV2ZW50OiBzdHJpbmcsIHN1Y2Nlc3MgPSB0cnVlLCBmYWlsdXJlPzogc3RyaW5nIHwgdW5rbm93biwgZGV0YWlscyA9IHt9KSB7XG4gICAgICAgIHNhZmVNYXJrKGV2ZW50ICsgJy1lbmQnKVxuICAgICAgICBzYWZlTWVhc3VyZShldmVudCwgZXZlbnQgKyAnLXN0YXJ0JywgZXZlbnQgKyAnLWVuZCcpXG4gICAgICAgIC8vIENsZWFyIHRoZSBzdGFydC1tYXJrIGd1YXJkIHNvIGEgc3Vic2VxdWVudCBzdGFydChldmVudCkgZm9yIHRoZSBzYW1lXG4gICAgICAgIC8vIGV2ZW50IGFjdHVhbGx5IG1hcmtzIGEgbmV3IHN0YXJ0LiBXaXRob3V0IHRoaXMsIHN0YXJ0KCkgc2hvcnQtY2lyY3VpdHNcbiAgICAgICAgLy8gYW5kIHRoZSBuZXh0IGVuZCgpIG1lYXN1cmVzIGZyb20gdGhlIG9yaWdpbmFsIHN0YXJ0IG1hcmsgXHUyMDE0IGluZmxhdGVkXG4gICAgICAgIC8vIGR1cmF0aW9ucyBpbiB0ZWxlbWV0cnkgb24gZXZlcnkgY2FsbCBhZnRlciB0aGUgZmlyc3QuXG4gICAgICAgIGRlbGV0ZSB0aGlzLmV2ZW50c01hcFtldmVudCArICctc3RhcnQnXVxuICAgICAgICB0aGlzLmRldGFpbHNbZXZlbnRdID0gT2JqZWN0LmFzc2lnbih7IHN1Y2Nlc3MsIGZhaWx1cmU6IHV0aWwuZm9ybWF0KGZhaWx1cmUpIH0sIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7XG4gICAgICAgICAgICBjbGllbnRXb3JrZXJJZDogUGVyZm9ybWFuY2VUZXN0ZXIuZ2V0Q2xpZW50V29ya2VySWQoKSxcbiAgICAgICAgICAgIHdvcmtlcjogUGVyZm9ybWFuY2VUZXN0ZXIuZ2V0UHJvY2Vzc0lkKCksXG4gICAgICAgICAgICBwbGF0Zm9ybTogUGVyZm9ybWFuY2VUZXN0ZXIuYnJvd3Nlcj8uc2Vzc2lvbklkLFxuICAgICAgICAgICAgdGVzdE5hbWU6IFBlcmZvcm1hbmNlVGVzdGVyLnNjZW5hcmlvVGhhdFJhbiAmJiBQZXJmb3JtYW5jZVRlc3Rlci5zY2VuYXJpb1RoYXRSYW5bUGVyZm9ybWFuY2VUZXN0ZXIuc2NlbmFyaW9UaGF0UmFuLmxlbmd0aCAtIDFdXG4gICAgICAgIH0sIGRldGFpbHMpLCB0aGlzLmRldGFpbHNbZXZlbnRdIHx8IHt9KSlcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgY2xpZW50IHdvcmtlciBJRCBpbiBmb3JtYXQgXCJ0aHJlYWRJZC1wcm9jZXNzSWRcIi5cbiAgICAgKiBUaGlzIG1ldGhvZCBwcm92aWRlcyBhIGNvbnNpc3RlbnQgaWRlbnRpZmllciBhY3Jvc3MgdGhlIFNESyBmb3IgdHJhY2tpbmdcbiAgICAgKiB3b3JrZXItc3BlY2lmaWMgZXZlbnRzIGFuZCBwZXJmb3JtYW5jZSBtZXRyaWNzLlxuICAgICAqXG4gICAgICogQHJldHVybnMgV29ya2VyIElEIHN0cmluZyBpbiBmb3JtYXQgXCJ0aHJlYWRJZC1wcm9jZXNzSWRcIlxuICAgICAqL1xuICAgIHN0YXRpYyBnZXRDbGllbnRXb3JrZXJJZCgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gQ0xJVXRpbHMuZ2V0Q2xpZW50V29ya2VySWQoKVxuICAgIH1cblxuICAgIHN0YXRpYyBnZXRQcm9jZXNzSWQoKSB7XG4gICAgICAgIHJldHVybiBgJHtwcm9jZXNzLnBpZH0tJHt3b3JrZXIudGhyZWFkSWR9YFxuICAgIH1cblxuICAgIHN0YXRpYyBzbGVlcCA9IChtcyA9IDEwMCkgPT4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgbXMpKVxuXG4gICAgc3RhdGljIGFzeW5jIHVwbG9hZEV2ZW50c0RhdGEoKSB7XG4gICAgICAgIC8vIFRyYWNrIG92ZXJhbGwga2V5IG1ldHJpY3Mgb3BlcmF0aW9uXG4gICAgICAgIHRoaXMuc3RhcnQoRVZFTlRTLlNES19TRU5EX0tFWV9NRVRSSUNTKVxuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCB3b3JrZXJJZCA9IGAke3Byb2Nlc3MucGlkfWBcbiAgICAgICAgICAgIEJTdGFja0xvZ2dlci5kZWJ1ZyhgW1BlcmZvcm1hbmNlIFVwbG9hZF0gU3RhcnRpbmcgdXBsb2FkIGZvciB3b3JrZXIgJHt3b3JrZXJJZH1gKVxuXG4gICAgICAgICAgICAvLyBUcmFjayBwcmVwYXJhdGlvbiBwaGFzZSAoY29sbGVjdGlvbiBhbmQgZGVkdXBsaWNhdGlvbilcbiAgICAgICAgICAgIHRoaXMuc3RhcnQoRVZFTlRTLlNES19LRVlfTUVUUklDU19QUkVQQVJBVElPTilcblxuICAgICAgICAgICAgLy8gQ29sbGVjdCBhbGwgbWVhc3VyZXMgZnJvbSBwZXJmb3JtYW5jZSByZXBvcnQgZmlsZXMgYW5kIGluLW1lbW9yeSBldmVudHNcbiAgICAgICAgICAgIGxldCBtZWFzdXJlczogUmVjb3JkPHN0cmluZywgdW5rbm93bj5bXSA9IFtdXG4gICAgICAgICAgICBpZiAoYXdhaXQgZnNQcm9taXNlLmFjY2Vzcyh0aGlzLmpzb25SZXBvcnREaXJQYXRoKS50aGVuKCgpID0+IHRydWUpLmNhdGNoKCgpID0+IGZhbHNlKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGZpbGVzID0gKGF3YWl0IGZzUHJvbWlzZS5yZWFkZGlyKHRoaXMuanNvblJlcG9ydERpclBhdGgpKS5tYXAoZmlsZSA9PiBwYXRoLnJlc29sdmUodGhpcy5qc29uUmVwb3J0RGlyUGF0aCwgZmlsZSkpXG4gICAgICAgICAgICAgICAgbWVhc3VyZXMgPSAoYXdhaXQgUHJvbWlzZS5hbGwoZmlsZXMubWFwKChmaWxlKSA9PiBmc1Byb21pc2UucmVhZEZpbGUoZmlsZSwgJ3V0Zi04JykpKSkubWFwKGVsID0+IGBbJHtlbC5zbGljZSgwLCAtMSl9XWApLm1hcChlbCA9PiBKU09OLnBhcnNlKGVsKSkuZmxhdCgpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBCU3RhY2tMb2dnZXIuZGVidWcoYFtQZXJmb3JtYW5jZSBVcGxvYWRdIFRvdGFsIGV2ZW50cyBmcm9tIGZpbGVzOiAke21lYXN1cmVzLmxlbmd0aH1gKVxuXG4gICAgICAgICAgICBpZiAodGhpcy5fbWVhc3VyZWRFdmVudHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIEJTdGFja0xvZ2dlci5kZWJ1ZyhgW1BlcmZvcm1hbmNlIFVwbG9hZF0gQWRkaW5nICR7dGhpcy5fbWVhc3VyZWRFdmVudHMubGVuZ3RofSBpbi1tZW1vcnkgZXZlbnRzYClcbiAgICAgICAgICAgICAgICBtZWFzdXJlcyA9IG1lYXN1cmVzLmNvbmNhdChcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbWVhc3VyZWRFdmVudHMubWFwKGUgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ29udmVydCBQZXJmb3JtYW5jZUVudHJ5IHRvIHBsYWluIG9iamVjdCBpZiBpdCBoYXMgdG9KU09OXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIChlIGFzIFBlcmZvcm1hbmNlRW50cnkpLnRvSlNPTiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoZSBhcyBQZXJmb3JtYW5jZUVudHJ5KS50b0pTT04oKSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBlbnN1cmVFcG9jaFRpbWVzID0gKGFycjogUmVjb3JkPHN0cmluZywgdW5rbm93bj5bXSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IG5vdyA9IERhdGUubm93KClcbiAgICAgICAgICAgICAgICBjb25zdCBjdXRvZmYgPSAxZTEyIC8vIH55ZWFyIDIwMDEsIG1zIGVwb2NoXG4gICAgICAgICAgICAgICAgY29uc3QgdGltZU9yaWdpbiA9IChcbiAgICAgICAgICAgICAgICAgICAgdHlwZW9mIHBlcmZvcm1hbmNlICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgcGVyZm9ybWFuY2UudGltZU9yaWdpbiA9PT0gJ251bWJlcidcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgID8gcGVyZm9ybWFuY2UudGltZU9yaWdpblxuICAgICAgICAgICAgICAgICAgICA6IChub3cgLSBwcm9jZXNzLnVwdGltZSgpICogMTAwMClcbiAgICAgICAgICAgICAgICByZXR1cm4gYXJyLm1hcChlbnRyeSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgZW50cnkuc3RhcnRUaW1lID09PSAnbnVtYmVyJyAmJiBlbnRyeS5zdGFydFRpbWUgPCBjdXRvZmYpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5LnN0YXJ0VGltZSA9IHRpbWVPcmlnaW4gKyBlbnRyeS5zdGFydFRpbWVcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW50cnlcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbWVhc3VyZXMgPSBlbnN1cmVFcG9jaFRpbWVzKG1lYXN1cmVzKVxuICAgICAgICAgICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKClcbiAgICAgICAgICAgIC8vIHl5eXktTU0tZGQnVCdISDptbTpzcy5TU1NTU1MgWlxuICAgICAgICAgICAgY29uc3Qgb3B0aW9uczogSW50bC5EYXRlVGltZUZvcm1hdE9wdGlvbnMgPSB7XG4gICAgICAgICAgICAgICAgdGltZVpvbmU6ICdVVEMnLFxuICAgICAgICAgICAgICAgIHllYXI6ICdudW1lcmljJyxcbiAgICAgICAgICAgICAgICBtb250aDogJzItZGlnaXQnLFxuICAgICAgICAgICAgICAgIGRheTogJzItZGlnaXQnLFxuICAgICAgICAgICAgICAgIGhvdXI6ICcyLWRpZ2l0JyxcbiAgICAgICAgICAgICAgICBtaW51dGU6ICcyLWRpZ2l0JyxcbiAgICAgICAgICAgICAgICBzZWNvbmQ6ICcyLWRpZ2l0JyxcbiAgICAgICAgICAgICAgICBmcmFjdGlvbmFsU2Vjb25kRGlnaXRzOiAzLCAvLyBUbyBpbmNsdWRlIG1pY3Jvc2Vjb25kc1xuICAgICAgICAgICAgICAgIGhvdXIxMjogZmFsc2VcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIEZvcm1hdCB0aGUgZGF0ZSBhbmQgcmVwbGFjZSB0aGUgZGVmYXVsdCBzZXBhcmF0b3IgZm9yIHRpbWUgem9uZVxuICAgICAgICAgICAgY29uc3QgZm9ybWF0dGVkRGF0ZSA9IG5ldyBJbnRsLkRhdGVUaW1lRm9ybWF0KCdlbi1HQicsIG9wdGlvbnMpXG4gICAgICAgICAgICAgICAgLmZvcm1hdFRvUGFydHMoZGF0ZSlcbiAgICAgICAgICAgICAgICAubWFwKCh7IHR5cGUsIHZhbHVlIH0pID0+IHR5cGUgPT09ICd0aW1lWm9uZU5hbWUnID8gJ1onIDogdmFsdWUpXG4gICAgICAgICAgICAgICAgLmpvaW4oJycpXG4gICAgICAgICAgICAgICAgLnJlcGxhY2UoJywnLCAnVCcpXG5cbiAgICAgICAgICAgIHRoaXMuZW5kKEVWRU5UUy5TREtfS0VZX01FVFJJQ1NfUFJFUEFSQVRJT04sIHRydWUpXG4gICAgICAgICAgICBjb25zdCBwYXlsb2FkID0ge1xuICAgICAgICAgICAgICAgIGV2ZW50X3R5cGU6ICdzZGtfZXZlbnRzJyxcbiAgICAgICAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICAgICAgICAgIHRlc3RodWJfdXVpZDogcHJvY2Vzcy5lbnYuUEVSRl9URVNUSFVCX1VVSUQgfHwgcHJvY2Vzcy5lbnYuU0RLX1JVTl9JRCxcbiAgICAgICAgICAgICAgICAgICAgY3JlYXRlZF9kYXk6IGZvcm1hdHRlZERhdGUsXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50X25hbWU6ICdTREtGZWF0dXJlUGVyZm9ybWFuY2UnLFxuICAgICAgICAgICAgICAgICAgICB1c2VyX2RhdGE6IHByb2Nlc3MuZW52LlBFUkZfVVNFUl9OQU1FLFxuICAgICAgICAgICAgICAgICAgICBob3N0X2luZm86IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGhvc3RuYW1lOiBob3N0bmFtZSgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgcGxhdGZvcm06IHBsYXRmb3JtKCksXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiB0eXBlKCksXG4gICAgICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uOiB2ZXJzaW9uKCksXG4gICAgICAgICAgICAgICAgICAgICAgICBhcmNoOiBhcmNoKClcbiAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50X2pzb246IHsgbWVhc3VyZXM6IG1lYXN1cmVzLCBzZGtSdW5JZDogcHJvY2Vzcy5lbnYuU0RLX1JVTl9JRCB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZmV0Y2hXcmFwKGAke0FQSVV0aWxzLkVEU19VUkx9L3NlbmRfc2RrX2V2ZW50c2AsIHtcbiAgICAgICAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICAgICAgICAgICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24vanNvbidcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHBheWxvYWQpXG4gICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICBCU3RhY2tMb2dnZXIuZGVidWcoYFtQZXJmb3JtYW5jZSBVcGxvYWRdIFN1Y2Nlc3NmdWxseSB1cGxvYWRlZCB0byBFRFM6ICR7dXRpbC5mb3JtYXQoYXdhaXQgcmVzdWx0LnRleHQoKSl9YClcblxuICAgICAgICAgICAgdGhpcy5lbmQoRVZFTlRTLlNES19TRU5EX0tFWV9NRVRSSUNTLCB0cnVlKVxuICAgICAgICB9IGNhdGNoIChlcikge1xuICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLmRlYnVnKGBbUGVyZm9ybWFuY2UgVXBsb2FkXSBGYWlsZWQgdG8gdXBsb2FkIGV2ZW50czogJHt1dGlsLmZvcm1hdChlcil9YClcbiAgICAgICAgICAgIHRoaXMuZW5kKEVWRU5UUy5TREtfS0VZX01FVFJJQ1NfUFJFUEFSQVRJT04sIGZhbHNlLCBlcilcbiAgICAgICAgICAgIHRoaXMuZW5kKEVWRU5UUy5TREtfU0VORF9LRVlfTUVUUklDUywgZmFsc2UsIGVyKVxuICAgICAgICB9XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmIChhd2FpdCBmc1Byb21pc2UuYWNjZXNzKHRoaXMuanNvblJlcG9ydERpclBhdGgpLnRoZW4oKCkgPT4gdHJ1ZSwgKCkgPT4gZmFsc2UpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZmlsZXMgPSBhd2FpdCBmc1Byb21pc2UucmVhZGRpcih0aGlzLmpzb25SZXBvcnREaXJQYXRoKVxuXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBmaWxlIG9mIGZpbGVzKSB7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGZzUHJvbWlzZS51bmxpbmsocGF0aC5qb2luKHRoaXMuanNvblJlcG9ydERpclBhdGgsIGZpbGUpKVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIEJTdGFja0xvZ2dlci5kZWJ1ZyhgW1BlcmZvcm1hbmNlIFVwbG9hZF0gQ2xlYW5lZCB1cCAke2ZpbGVzLmxlbmd0aH0gdGVtcG9yYXJ5IHJlcG9ydCBmaWxlc2ApXG4gICAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGVyKSB7XG4gICAgICAgICAgICBCU3RhY2tMb2dnZXIuZGVidWcoYFtQZXJmb3JtYW5jZSBVcGxvYWRdIEZhaWxlZCB0byBkZWxldGUgdGVtcG9yYXJ5IGZpbGVzOiAke3V0aWwuZm9ybWF0KGVyKX1gKVxuICAgICAgICB9XG4gICAgfVxufVxuIiwgImltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCdcbmltcG9ydCBmcyBmcm9tICdub2RlOmZzJ1xuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJ1xuXG5pbXBvcnQgbG9nZ2VyIGZyb20gJ0B3ZGlvL2xvZ2dlcidcblxuaW1wb3J0IHsgTE9HU19GSUxFIH0gZnJvbSAnLi9jb25zdGFudHMuanMnXG5pbXBvcnQgeyBDT0xPUlMgfSBmcm9tICcuL3V0aWwuanMnXG5cbmNvbnN0IGxvZyA9IGxvZ2dlcignQHdkaW8vYnJvd3NlcnN0YWNrLXNlcnZpY2UnKVxuXG5leHBvcnQgY2xhc3MgQlN0YWNrTG9nZ2VyIHtcbiAgICBwdWJsaWMgc3RhdGljIGxvZ0ZpbGVQYXRoID0gcGF0aC5qb2luKHByb2Nlc3MuY3dkKCksIExPR1NfRklMRSlcbiAgICBwdWJsaWMgc3RhdGljIGxvZ0ZvbGRlclBhdGggPSBwYXRoLmpvaW4ocHJvY2Vzcy5jd2QoKSwgJ2xvZ3MnKVxuICAgIHByaXZhdGUgc3RhdGljIGxvZ0ZpbGVTdHJlYW06IGZzLldyaXRlU3RyZWFtIHwgbnVsbFxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgcmVkYWN0Q3JlZGVudGlhbHMobG9nTWVzc2FnZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIGxvZ01lc3NhZ2VcbiAgICAgICAgICAgIC5yZXBsYWNlKC8oW1wiJ10/KD86dXNlcm5hbWV8dXNlck5hbWV8YWNjZXNza2V5fGFjY2Vzc0tleXx1c2VyfGtleSlbXCInXT9cXHMqWzo9XVxccypbXCInXT8pKFteXCInXFxzLH1dKykvZ2ksICckMScpXG4gICAgICAgICAgICAucmVwbGFjZSgvKFs/Jl0oPzp1c2VybmFtZXx1c2VyTmFtZXxhY2Nlc3Nfa2V5fGFjY2Vzc2tleXxhY2Nlc3NLZXl8dXNlcnxrZXkpPSkoW14mI1xcc10rKS9naSwgJyQxJylcbiAgICB9XG5cbiAgICBzdGF0aWMgbG9nVG9GaWxlKGxvZ01lc3NhZ2U6IHN0cmluZywgbG9nTGV2ZWw6IHN0cmluZykge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgcmVkYWN0ZWRNZXNzYWdlID0gdGhpcy5yZWRhY3RDcmVkZW50aWFscyhsb2dNZXNzYWdlKVxuICAgICAgICAgICAgaWYgKCF0aGlzLmxvZ0ZpbGVTdHJlYW0pIHtcbiAgICAgICAgICAgICAgICB0aGlzLmVuc3VyZUxvZ3NGb2xkZXIoKVxuICAgICAgICAgICAgICAgIHRoaXMubG9nRmlsZVN0cmVhbSA9IGZzLmNyZWF0ZVdyaXRlU3RyZWFtKHRoaXMubG9nRmlsZVBhdGgsIHsgZmxhZ3M6ICdhJyB9KVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMubG9nRmlsZVN0cmVhbSAmJiB0aGlzLmxvZ0ZpbGVTdHJlYW0ud3JpdGFibGUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ0ZpbGVTdHJlYW0ud3JpdGUodGhpcy5mb3JtYXRMb2cocmVkYWN0ZWRNZXNzYWdlLCBsb2dMZXZlbCkpXG4gICAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBsb2cuZGVidWcoYEZhaWxlZCB0byBsb2cgdG8gZmlsZS4gRXJyb3IgJHtlcnJvcn1gKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgZm9ybWF0TG9nKGxvZ01lc3NhZ2U6IHN0cmluZywgbGV2ZWw6IHN0cmluZykge1xuICAgICAgICByZXR1cm4gYCR7Y2hhbGsuZ3JheShuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCkpfSAke2NoYWxrW0NPTE9SU1tsZXZlbF1dKGxldmVsLnRvVXBwZXJDYXNlKCkpfSAke2NoYWxrLndoaXRlQnJpZ2h0KCdAd2Rpby9icm93c2Vyc3RhY2stc2VydmljZScpfSAke2xvZ01lc3NhZ2V9XFxuYFxuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgaW5mbyhtZXNzYWdlOiBzdHJpbmcpIHtcbiAgICAgICAgY29uc3QgcmVkYWN0ZWRNZXNzYWdlID0gdGhpcy5yZWRhY3RDcmVkZW50aWFscyhtZXNzYWdlKVxuICAgICAgICB0aGlzLmxvZ1RvRmlsZShyZWRhY3RlZE1lc3NhZ2UsICdpbmZvJylcbiAgICAgICAgbG9nLmluZm8ocmVkYWN0ZWRNZXNzYWdlKVxuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZXJyb3IobWVzc2FnZTogc3RyaW5nKSB7XG4gICAgICAgIGNvbnN0IHJlZGFjdGVkTWVzc2FnZSA9IHRoaXMucmVkYWN0Q3JlZGVudGlhbHMobWVzc2FnZSlcbiAgICAgICAgdGhpcy5sb2dUb0ZpbGUocmVkYWN0ZWRNZXNzYWdlLCAnZXJyb3InKVxuICAgICAgICBsb2cuZXJyb3IocmVkYWN0ZWRNZXNzYWdlKVxuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZGVidWcobWVzc2FnZTogc3RyaW5nLCBwYXJhbT86IHVua25vd24pIHtcbiAgICAgICAgY29uc3QgcmVkYWN0ZWRNZXNzYWdlID0gdGhpcy5yZWRhY3RDcmVkZW50aWFscyhtZXNzYWdlKVxuICAgICAgICB0aGlzLmxvZ1RvRmlsZShyZWRhY3RlZE1lc3NhZ2UsICdkZWJ1ZycpXG4gICAgICAgIGlmIChwYXJhbSkge1xuICAgICAgICAgICAgbG9nLmRlYnVnKHJlZGFjdGVkTWVzc2FnZSwgcGFyYW0pXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsb2cuZGVidWcocmVkYWN0ZWRNZXNzYWdlKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyB3YXJuKG1lc3NhZ2U6IHN0cmluZykge1xuICAgICAgICBjb25zdCByZWRhY3RlZE1lc3NhZ2UgPSB0aGlzLnJlZGFjdENyZWRlbnRpYWxzKG1lc3NhZ2UpXG4gICAgICAgIHRoaXMubG9nVG9GaWxlKHJlZGFjdGVkTWVzc2FnZSwgJ3dhcm4nKVxuICAgICAgICBsb2cud2FybihyZWRhY3RlZE1lc3NhZ2UpXG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyB0cmFjZShtZXNzYWdlOiBzdHJpbmcpIHtcbiAgICAgICAgY29uc3QgcmVkYWN0ZWRNZXNzYWdlID0gdGhpcy5yZWRhY3RDcmVkZW50aWFscyhtZXNzYWdlKVxuICAgICAgICB0aGlzLmxvZ1RvRmlsZShyZWRhY3RlZE1lc3NhZ2UsICd0cmFjZScpXG4gICAgICAgIGxvZy50cmFjZShyZWRhY3RlZE1lc3NhZ2UpXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRHJhaW4gd2hhdGV2ZXIgaXMgc3RpbGwgc2l0dGluZyBpbiB0aGUgbG9nIHN0cmVhbSdzIGJ1ZmZlciBvbnRvIGRpc2suXG4gICAgICpcbiAgICAgKiBgbG9nVG9GaWxlYCB3cml0ZXMgdG8gYW4gYXN5bmMgYGZzLldyaXRlU3RyZWFtYCwgc28gYSBsaW5lIGxvZ2dlZCBpbW1lZGlhdGVseSBiZWZvcmUgdGhlXG4gICAgICogYXJjaGl2ZSBpcyBidWlsdCBpcyB2ZXJ5IGxpa2VseSBOT1QgaW4gdGhlIGZpbGUgeWV0IFx1MjAxNCB0aGUgc3RyZWFtJ3MgYG9wZW5gIGlzIGFzeW5jIHRvbyxcbiAgICAgKiBzbyBlYXJseSBvbiB0aGUgZmlsZSBtYXkgbm90IGV4aXN0IGF0IGFsbC4gQW55dGhpbmcgdGhhdCBzbmFwc2hvdHMgdGhlIGxvZyAodGhlIGRlYnVnLWxvZ1xuICAgICAqIHVwbG9hZCkgbXVzdCBmbHVzaCBmaXJzdCBvciBpdCBzaGlwcyBhIHRydW5jYXRlZCBjb3B5LlxuICAgICAqXG4gICAgICogQSB6ZXJvLWxlbmd0aCB3cml0ZSdzIGNhbGxiYWNrIGZpcmVzIG9ubHkgYWZ0ZXIgZXZlcnkgY2h1bmsgcXVldWVkIGFoZWFkIG9mIGl0IGhhcyBiZWVuXG4gICAgICogaGFuZGVkIHRvIHRoZSBmcyBsYXllciwgd2hpY2ggZHJhaW5zIHRoZSBidWZmZXIgd2l0aG91dCBlbmRpbmcgdGhlIHN0cmVhbSBcdTIwMTQgdW5saWtlXG4gICAgICogYGNsZWFyTG9nZ2VyKClgLCBsb2dnaW5nIGNvbnRpbnVlcyB0byB3b3JrIGFmdGVyd2FyZHMuXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBhc3luYyBmbHVzaExvZ0ZpbGUodGltZW91dE1zID0gMjAwMCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBjb25zdCBzdHJlYW0gPSB0aGlzLmxvZ0ZpbGVTdHJlYW1cbiAgICAgICAgaWYgKCFzdHJlYW0gfHwgIXN0cmVhbS53cml0YWJsZSkge1xuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgICAgLy8gTmV2ZXIgbGV0IGEgc3R1Y2sgc3RyZWFtIGhvbGQgdXAgdGhlIHVwbG9hZDsgYSB0cnVuY2F0ZWQgbG9nIGJlYXRzIG5vIGxvZyBhdCBhbGwuXG4gICAgICAgIGF3YWl0IG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB0aW1lciA9IHNldFRpbWVvdXQocmVzb2x2ZSwgdGltZW91dE1zKVxuICAgICAgICAgICAgdGltZXIudW5yZWY/LigpXG4gICAgICAgICAgICBzdHJlYW0ud3JpdGUoJycsICgpID0+IHtcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQodGltZXIpXG4gICAgICAgICAgICAgICAgcmVzb2x2ZSgpXG4gICAgICAgICAgICB9KVxuICAgICAgICB9KVxuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgY2xlYXJMb2dnZXIoKSB7XG4gICAgICAgIGlmICh0aGlzLmxvZ0ZpbGVTdHJlYW0pIHtcbiAgICAgICAgICAgIHRoaXMubG9nRmlsZVN0cmVhbS5lbmQoKVxuICAgICAgICB9XG4gICAgICAgIHRoaXMubG9nRmlsZVN0cmVhbSA9IG51bGxcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGNsZWFyTG9nRmlsZSgpIHtcbiAgICAgICAgaWYgKGZzLmV4aXN0c1N5bmModGhpcy5sb2dGaWxlUGF0aCkpIHtcbiAgICAgICAgICAgIGZzLnRydW5jYXRlU3luYyh0aGlzLmxvZ0ZpbGVQYXRoKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBlbnN1cmVMb2dzRm9sZGVyKCkge1xuICAgICAgICBpZiAoIWZzLmV4aXN0c1N5bmModGhpcy5sb2dGb2xkZXJQYXRoKSl7XG4gICAgICAgICAgICBmcy5ta2RpclN5bmModGhpcy5sb2dGb2xkZXJQYXRoKVxuICAgICAgICB9XG4gICAgfVxufVxuIiwgIntcbiAgXCJuYW1lXCI6IFwiQHdkaW8vYnJvd3NlcnN0YWNrLXNlcnZpY2VcIixcbiAgXCJ2ZXJzaW9uXCI6IFwiOS4zOS40XCIsXG4gIFwiZGVzY3JpcHRpb25cIjogXCJXZWJkcml2ZXJJTyBzZXJ2aWNlIGZvciBiZXR0ZXIgQnJvd3NlcnN0YWNrIGludGVncmF0aW9uXCIsXG4gIFwiYXV0aG9yXCI6IFwiQnJvd3NlclN0YWNrIDxzdXBwb3J0QGJyb3dzZXJzdGFjay5jb20+XCIsXG4gIFwiaG9tZXBhZ2VcIjogXCJodHRwczovL2dpdGh1Yi5jb20vYnJvd3NlcnN0YWNrL3dkaW8tYnJvd3NlcnN0YWNrLXNlcnZpY2VcIixcbiAgXCJsaWNlbnNlXCI6IFwiTUlUXCIsXG4gIFwiZW5naW5lc1wiOiB7XG4gICAgXCJub2RlXCI6IFwiPj0xOC4yMC4wXCJcbiAgfSxcbiAgXCJyZXBvc2l0b3J5XCI6IHtcbiAgICBcInR5cGVcIjogXCJnaXRcIixcbiAgICBcInVybFwiOiBcImdpdCtodHRwczovL2dpdGh1Yi5jb20vYnJvd3NlcnN0YWNrL3dkaW8tYnJvd3NlcnN0YWNrLXNlcnZpY2UuZ2l0XCIsXG4gICAgXCJkaXJlY3RvcnlcIjogXCJwYWNrYWdlcy9icm93c2Vyc3RhY2stc2VydmljZVwiXG4gIH0sXG4gIFwia2V5d29yZHNcIjogW1xuICAgIFwid2ViZHJpdmVyaW9cIixcbiAgICBcIndkaW9cIixcbiAgICBcImJyb3dzZXJzdGFja1wiLFxuICAgIFwid2Rpby1zZXJ2aWNlXCJcbiAgXSxcbiAgXCJidWdzXCI6IHtcbiAgICBcInVybFwiOiBcImh0dHBzOi8vZ2l0aHViLmNvbS9icm93c2Vyc3RhY2svd2Rpby1icm93c2Vyc3RhY2stc2VydmljZS9pc3N1ZXNcIlxuICB9LFxuICBcInR5cGVcIjogXCJtb2R1bGVcIixcbiAgXCJ0eXBlc1wiOiBcIi4vYnVpbGQvaW5kZXguZC50c1wiLFxuICBcImV4cG9ydHNcIjoge1xuICAgIFwiLlwiOiB7XG4gICAgICBcInR5cGVzXCI6IFwiLi9idWlsZC9pbmRleC5kLnRzXCIsXG4gICAgICBcImltcG9ydFwiOiBcIi4vYnVpbGQvaW5kZXguanNcIlxuICAgIH0sXG4gICAgXCIuL2NsZWFudXBcIjoge1xuICAgICAgXCJ0eXBlc1wiOiBcIi4vYnVpbGQvY2xlYW51cC5kLnRzXCIsXG4gICAgICBcImltcG9ydFwiOiBcIi4vYnVpbGQvY2xlYW51cC5qc1wiLFxuICAgICAgXCJzb3VyY2VcIjogXCIuL3NyYy9jbGVhbnVwLnRzXCJcbiAgICB9XG4gIH0sXG4gIFwidHlwZVNjcmlwdFZlcnNpb25cIjogXCIzLjguM1wiLFxuICBcImZpbGVzXCI6IFtcbiAgICBcImJ1aWxkXCIsXG4gICAgXCJzcmMvcHJvdG8vKiovKi5wcm90b1wiLFxuICAgIFwiYnJvd3NlcnN0YWNrLXNlcnZpY2UuZC50c1wiLFxuICAgIFwiUkVBRE1FLm1kXCIsXG4gICAgXCJMSUNFTlNFXCJcbiAgXSxcbiAgXCJzY3JpcHRzXCI6IHtcbiAgICBcImNsZWFuXCI6IFwicmltcmFmIC4vYnVpbGQgc3JjL2dycGMvZ2VuZXJhdGVkXCIsXG4gICAgXCJnZW5lcmF0ZVwiOiBcImJ1ZiBnZW5lcmF0ZVwiLFxuICAgIFwiYnVpbGRcIjogXCJyaW1yYWYgLi9idWlsZCBzcmMvZ3JwYy9nZW5lcmF0ZWQgJiYgYnVmIGdlbmVyYXRlICYmIG5vZGUgLi9zY3JpcHRzL2J1aWxkLm1qcyAmJiB0c2MgLXAgdHNjb25maWcucHJvZC5qc29uXCIsXG4gICAgXCJidWlsZDp3YXRjaFwiOiBcIm5vZGUgLi9zY3JpcHRzL2J1aWxkLm1qcyAtLXdhdGNoXCIsXG4gICAgXCJ0ZXN0XCI6IFwidml0ZXN0IC0tcnVuXCIsXG4gICAgXCJ0ZXN0OndhdGNoXCI6IFwidml0ZXN0XCIsXG4gICAgXCJwcmVwYWNrXCI6IFwibnBtIHJ1biBidWlsZFwiXG4gIH0sXG4gIFwiZGVwZW5kZW5jaWVzXCI6IHtcbiAgICBcIkBicm93c2Vyc3RhY2svYWktc2RrLW5vZGVcIjogXCIxLjUuMTdcIixcbiAgICBcIkBidWZidWlsZC9wcm90b2J1ZlwiOiBcIl4yLjUuMlwiLFxuICAgIFwiQGdycGMvZ3JwYy1qc1wiOiBcIn4xLjEzLjVcIixcbiAgICBcIkBwZXJjeS9hcHBpdW0tYXBwXCI6IFwiXjIuMC45XCIsXG4gICAgXCJAcGVyY3kvc2VsZW5pdW0td2ViZHJpdmVyXCI6IFwiXjIuMi4yXCIsXG4gICAgXCJAcGVyY3kvd2ViZHJpdmVyaW9cIjogXCJeMy4zLjRcIixcbiAgICBcIkB0eXBlcy9naXRjb25maWdsb2NhbFwiOiBcIl4yLjAuMVwiLFxuICAgIFwiQHdkaW8vbG9nZ2VyXCI6IFwiXjkuMC4wXCIsXG4gICAgXCJAd2Rpby9yZXBvcnRlclwiOiBcIl45LjAuMFwiLFxuICAgIFwiQHdkaW8vdHlwZXNcIjogXCJeOS4wLjBcIixcbiAgICBcImJyb3dzZXJzdGFjay1sb2NhbFwiOiBcIl4xLjUuMVwiLFxuICAgIFwiY2hhbGtcIjogXCJeNS42LjJcIixcbiAgICBcImNzdi13cml0ZXJcIjogXCJeMS42LjBcIixcbiAgICBcImdpdC1yZXBvLWluZm9cIjogXCJeMi4xLjFcIixcbiAgICBcImdpdGNvbmZpZ2xvY2FsXCI6IFwiXjIuMS4wXCIsXG4gICAgXCJnbG9iXCI6IFwiXjExLjAuMFwiLFxuICAgIFwidGFyXCI6IFwiXjcuNS4xMVwiLFxuICAgIFwidW5kaWNpXCI6IFwiXjYuMjQuMFwiLFxuICAgIFwidXVpZFwiOiBcIl4xMS4xLjBcIixcbiAgICBcIndlYmRyaXZlcmlvXCI6IFwiXjkuMC4wXCIsXG4gICAgXCJ3aW5zdG9uLXRyYW5zcG9ydFwiOiBcIl40LjUuMFwiLFxuICAgIFwieWF1emxcIjogXCJeMy40LjBcIlxuICB9LFxuICBcInBlZXJEZXBlbmRlbmNpZXNcIjoge1xuICAgIFwiQHdkaW8vY2xpXCI6IFwiXjUuMC4wIHx8IF42LjAuMCB8fCBeNy4wLjAgfHwgXjguMC4wIHx8IF45LjAuMFwiXG4gIH0sXG4gIFwiZGV2RGVwZW5kZW5jaWVzXCI6IHtcbiAgICBcIkBidWZidWlsZC9idWZcIjogXCJeMS41NS4xXCIsXG4gICAgXCJAY2hhbmdlc2V0cy9jbGlcIjogXCJeMi4yNy45XCIsXG4gICAgXCJAdHlwZXMvbm9kZVwiOiBcIl4yMC4xLjBcIixcbiAgICBcIkB0eXBlcy90YXJcIjogXCJeNy4wLjg3XCIsXG4gICAgXCJAdHlwZXMveWF1emxcIjogXCJeMi4xMC4zXCIsXG4gICAgXCJAd2Rpby9nbG9iYWxzXCI6IFwiXjkuMC4wXCIsXG4gICAgXCJAd2Rpby9sb2dnZXJcIjogXCJeOS4wLjBcIixcbiAgICBcIkB3ZGlvL3JlcG9ydGVyXCI6IFwiXjkuMC4wXCIsXG4gICAgXCJAd2Rpby90eXBlc1wiOiBcIl45LjAuMFwiLFxuICAgIFwiZXNidWlsZFwiOiBcIl4wLjI3LjJcIixcbiAgICBcInJpbXJhZlwiOiBcIl42LjAuMVwiLFxuICAgIFwidHMtcHJvdG9cIjogXCJeMi43LjVcIixcbiAgICBcInR5cGVzY3JpcHRcIjogXCJeNS44LjNcIixcbiAgICBcInZpdGVzdFwiOiBcIl4zLjIuNFwiLFxuICAgIFwid2ViZHJpdmVyaW9cIjogXCJeOS4wLjBcIlxuICB9LFxuICBcInB1Ymxpc2hDb25maWdcIjoge1xuICAgIFwiYWNjZXNzXCI6IFwicHVibGljXCJcbiAgfVxufVxuIiwgImltcG9ydCB0eXBlIHsgQnJvd3NlcnN0YWNrQ29uZmlnIH0gZnJvbSAnLi90eXBlcy5qcydcbmltcG9ydCBwa2cgZnJvbSAnLi4vcGFja2FnZS5qc29uJyB3aXRoIHsgdHlwZTogJ2pzb24nIH1cblxuY29uc3QgYnN0YWNrU2VydmljZVZlcnNpb24gPSBwa2cudmVyc2lvblxuXG5leHBvcnQgY29uc3QgQlJPV1NFUl9ERVNDUklQVElPTiA9IFtcbiAgICAnZGV2aWNlJyxcbiAgICAnb3MnLFxuICAgICdvc1ZlcnNpb24nLFxuICAgICdvc192ZXJzaW9uJyxcbiAgICAnYnJvd3Nlck5hbWUnLFxuICAgICdicm93c2VyJyxcbiAgICAnYnJvd3NlclZlcnNpb24nLFxuICAgICdicm93c2VyX3ZlcnNpb24nXG5dIGFzIGNvbnN0XG5cbmV4cG9ydCBjb25zdCBWQUxJRF9BUFBfRVhURU5TSU9OID0gW1xuICAgICcuYXBrJyxcbiAgICAnLmFhYicsXG4gICAgJy5pcGEnXG5dXG5cbmV4cG9ydCBjb25zdCBERUZBVUxUX09QVElPTlM6IFBhcnRpYWw8QnJvd3NlcnN0YWNrQ29uZmlnPiA9IHtcbiAgICBzZXRTZXNzaW9uTmFtZTogdHJ1ZSxcbiAgICBzZXRTZXNzaW9uU3RhdHVzOiB0cnVlLFxuICAgIHRlc3RPYnNlcnZhYmlsaXR5OiB0cnVlXG59XG5cbmV4cG9ydCBjb25zdCBjb25zb2xlSG9sZGVyOiB0eXBlb2YgY29uc29sZSA9IE9iamVjdC5hc3NpZ24oe30sIGNvbnNvbGUpXG5cbmV4cG9ydCBjb25zdCBEQVRBX0VORFBPSU5UID0gJ2h0dHBzOi8vY29sbGVjdG9yLW9ic2VydmFiaWxpdHkuYnJvd3NlcnN0YWNrLmNvbSdcbmV4cG9ydCBjb25zdCBBUFBfQUxMWV9FTkRQT0lOVCA9ICdodHRwczovL2FwcC1hY2Nlc3NpYmlsaXR5LmJyb3dzZXJzdGFjay5jb20vYXV0b21hdGUnXG5leHBvcnQgY29uc3QgQVBQX0FMTFlfSVNTVUVTX0VORFBPSU5UID0gJ2FwaS92MS9pc3N1ZXMnXG5leHBvcnQgY29uc3QgQVBQX0FMTFlfSVNTVUVTX1NVTU1BUllfRU5EUE9JTlQgPSAnYXBpL3YxL2lzc3Vlcy1zdW1tYXJ5J1xuZXhwb3J0IGNvbnN0IERBVEFfRVZFTlRfRU5EUE9JTlQgPSAnYXBpL3YxL2V2ZW50J1xuZXhwb3J0IGNvbnN0IERBVEFfQkFUQ0hfRU5EUE9JTlQgPSAnYXBpL3YxL2JhdGNoJ1xuZXhwb3J0IGNvbnN0IERBVEFfU0NSRUVOU0hPVF9FTkRQT0lOVCA9ICdhcGkvdjEvc2NyZWVuc2hvdHMnXG5leHBvcnQgY29uc3QgREFUQV9CQVRDSF9TSVpFID0gMTAwMFxuZXhwb3J0IGNvbnN0IERBVEFfQkFUQ0hfSU5URVJWQUwgPSAyMDAwXG5leHBvcnQgY29uc3QgQkFUQ0hfRVZFTlRfVFlQRVMgPSBbJ0xvZ0NyZWF0ZWQnLCAnVGVzdFJ1blN0YXJ0ZWQnLCAnVGVzdFJ1bkZpbmlzaGVkJywgJ0hvb2tSdW5GaW5pc2hlZCcsICdIb29rUnVuU3RhcnRlZCcsICdTY3JlZW5zaG90Q3JlYXRlZCddXG5leHBvcnQgY29uc3QgREVGQVVMVF9XQUlUX1RJTUVPVVRfRk9SX1BFTkRJTkdfVVBMT0FEUyA9IDUwMDAgLy8gNXNcbmV4cG9ydCBjb25zdCBERUZBVUxUX1dBSVRfSU5URVJWQUxfRk9SX1BFTkRJTkdfVVBMT0FEUyA9IDEwMCAvLyAxMDBtc1xuZXhwb3J0IGNvbnN0IEJTVEFDS19TRVJWSUNFX1ZFUlNJT04gPSBic3RhY2tTZXJ2aWNlVmVyc2lvblxuXG5leHBvcnQgY29uc3QgTk9UX0FMTE9XRURfS0VZU19JTl9DQVBTID0gWydpbmNsdWRlVGFnc0luVGVzdGluZ1Njb3BlJywgJ2V4Y2x1ZGVUYWdzSW5UZXN0aW5nU2NvcGUnLCAndGVzdE1hbmFnZW1lbnRPcHRpb25zJywgJ3NraXBBcHBPdmVycmlkZScsICdwcmVmZXJTY2VuYXJpb05hbWUnXVxuZXhwb3J0IGNvbnN0IEJST1dTRVJTVEFDS19URVNUX1BMQU5fSUQgPSAnQlJPV1NFUlNUQUNLX1RFU1RfUExBTl9JRCdcblxuZXhwb3J0IGNvbnN0IExPR1NfRklMRSA9ICdsb2dzL2JzdGFjay13ZGlvLXNlcnZpY2UubG9nJ1xuZXhwb3J0IGNvbnN0IENMSV9ERUJVR19MT0dTX0ZJTEUgPSAnbG9nL3Nkay1jbGktZGVidWcubG9nJ1xuZXhwb3J0IGNvbnN0IFVQTE9BRF9MT0dTX0FERFJFU1MgPSAnaHR0cHM6Ly91cGxvYWQtb2JzZXJ2YWJpbGl0eS5icm93c2Vyc3RhY2suY29tJ1xuZXhwb3J0IGNvbnN0IFVQTE9BRF9MT0dTX0VORFBPSU5UID0gJ2NsaWVudC1sb2dzL3VwbG9hZCdcblxuZXhwb3J0IGNvbnN0IFBFUkNZX0xPR1NfRklMRSA9ICdsb2dzL3BlcmN5LmxvZydcblxuLyoqXG4gKiBBdXRvLWNhcHR1cmUgb2YgdGhlIHVzZXIncyB3ZGlvIGNvbmZpZyBmaWxlIChTREstNzI1MCkuXG4gKi9cblxuLypcbiAqIFNob3duIG9uY2UgcGVyIHJ1biB3aGVuIGF1dG8tY2FwdHVyZSBpcyBhY3RpdmUuIFRoZSBOb2RlIFNESyBkb2VzIHRoZSBzYW1lXG4gKiAoQnJvd3NlclN0YWNrU2V0dXAuanMgLT4gQVVUT0xPR0NBUFRVUkVfTk9USUZJQ0FUSU9OKTsgd2l0aG91dCBpdCBhIHdkaW8gY3VzdG9tZXIgZ2V0cyBub1xuICogcnVudGltZSBkaXNjbG9zdXJlIHRoYXQgdGhlaXIgY29uZmlnIGZpbGUgaXMgY29sbGVjdGVkLCBvbmx5IGEgY2hhbmdlc2V0IGVudHJ5IGFuZCBhIEpTRG9jXG4gKiBjb21tZW50LiBTaW5jZSB0aGUgcmVkYWN0aW9uIGlzIGtleS1uYW1lIGRyaXZlbiBhbmQgYmVzdC1lZmZvcnQsIHRoZSBub3RpY2UgaXMgcGFydCBvZiB0aGVcbiAqIGNvbnRyb2wgcmF0aGVyIHRoYW4gZGVjb3JhdGlvbi5cbiAqL1xuZXhwb3J0IGNvbnN0IEFVVE9MT0dDQVBUVVJFX05PVElGSUNBVElPTiA9ICdZb3VyIHdkaW8gY29uZmlnIGZpbGUsIHRoZSBsb2NhbCBjb25maWcgZmlsZXMgaXQgaW1wb3J0cyBhbmQgcGFja2FnZS5qc29uIGFyZSBjYXB0dXJlZCB3aXRoIHRoZSBkZWJ1ZyBsb2dzIGF0IHRoZSBlbmQgb2YgdGhlIHJ1biwgd2l0aCB2YWx1ZXMgdW5kZXIga25vd24gY3JlZGVudGlhbCBrZXlzIHJlbW92ZWQuIFRvIGRpc2FibGUsIHNldCBkaXNhYmxlQXV0b0NhcHR1cmVMb2dzOiB0cnVlIGluIHRoZSBicm93c2Vyc3RhY2sgc2VydmljZSBvcHRpb25zLidcblxuLyogQWJzb2x1dGUgcGF0aCBvZiB0aGUgcmVzb2x2ZWQgd2RpbyBjb25maWcsIHB1Ymxpc2hlZCBvbmNlIHNvIHRoZSB1cGxvYWQgcGF0aCBuZXZlciByZS1kZXJpdmVzIGl0ICovXG5leHBvcnQgY29uc3QgQlJPV1NFUlNUQUNLX1dESU9fQ09ORklHX0ZJTEVfUEFUSCA9ICdCUk9XU0VSU1RBQ0tfV0RJT19DT05GSUdfRklMRV9QQVRIJ1xuZXhwb3J0IGNvbnN0IEJST1dTRVJTVEFDS19ESVNBQkxFX0FVVE9fQ0FQVFVSRV9MT0dTID0gJ0JST1dTRVJTVEFDS19ESVNBQkxFX0FVVE9fQ0FQVFVSRV9MT0dTJ1xuLyogV2hpY2ggbGFkZGVyIHJ1bmcgcmVzb2x2ZWQgdGhlIGNvbmZpZywga2VwdCBzbyB0aGUgdXBsb2FkIHBhdGggcmVwb3J0cyB0aGUgVFJVRSBydW5nXG4gICBpbnN0ZWFkIG9mIHJlLXJlYWRpbmcgaXRzIG93biBlbnYgdmFyIGFuZCBhbHdheXMgc2F5aW5nICdlbnZfb3ZlcnJpZGUnICovXG5leHBvcnQgY29uc3QgQlJPV1NFUlNUQUNLX1dESU9fQ09ORklHX1NUUkFURUdZID0gJ0JST1dTRVJTVEFDS19XRElPX0NPTkZJR19TVFJBVEVHWSdcblxuLyogTWlycm9ycyBjcmVhdGUtd2RpbydzIFNVUFBPUlRFRF9DT05GSUdfRklMRV9FWFRFTlNJT04gKGlkZW50aWNhbCBpbiB3ZGlvIHY4IGFuZCB2OSkgKi9cbmV4cG9ydCBjb25zdCBTVVBQT1JURURfV0RJT19DT05GSUdfRVhURU5TSU9OUyA9IFsnLmpzJywgJy50cycsICcubWpzJywgJy5tdHMnLCAnLmNqcycsICcuY3RzJ11cbmV4cG9ydCBjb25zdCBERUZBVUxUX1dESU9fQ09ORklHX0JBU0VOQU1FID0gJ3dkaW8uY29uZidcbi8qIGB3ZGlvIDxjbWQ+YCB2ZXJicyB0aGF0IG11c3QgbmV2ZXIgYmUgbWlzdGFrZW4gZm9yIHRoZSBjb25maWcgcG9zaXRpb25hbCAqL1xuZXhwb3J0IGNvbnN0IFdESU9fQ0xJX1NVQkNPTU1BTkRTID0gWydydW4nLCAnaW5zdGFsbCcsICdyZXBsJywgJ2NvbmZpZyddXG5cbi8qIENvbmZpZ3MgYXJlIGtpbG9ieXRlczsgdGhlIGNhcCBvbmx5IGV4aXN0cyBzbyBhIG1pc2xhYmVsbGVkIHBhdGggY2Fubm90IGJsb2F0IHRoZSBhcmNoaXZlICovXG5leHBvcnQgY29uc3QgTUFYX0NBUFRVUkVEX0NPTkZJR19GSUxFX0JZVEVTID0gMTAyNCAqIDEwMjRcbmV4cG9ydCBjb25zdCBNQVhfQ0FQVFVSRURfQ09ORklHX0ZJTEVTID0gNlxuLyogSG93IGZhciB0byBmb2xsb3cgcmVsYXRpdmUgaW1wb3J0cyBvdXQgb2YgdGhlIGVudHJ5IGNvbmZpZyAoMSA9IGRpcmVjdCBpbXBvcnRzIG9ubHkpICovXG5leHBvcnQgY29uc3QgQ0FQVFVSRV9DT05GSUdfSU1QT1JUX0RFUFRIID0gMVxuLyogSG93IGZhciB0byB3YWxrIHVwIGZyb20gdGhlIGNvbmZpZyBkaXIgbG9va2luZyBmb3IgdGhlIHByb2plY3QncyBwYWNrYWdlLmpzb24gKi9cbmV4cG9ydCBjb25zdCBNQVhfUEFDS0FHRV9KU09OX1dBTEtfVVAgPSA1XG5cbi8qKlxuICogS2V5cyB3aG9zZSBsaW5lIGlzIHNjcnViYmVkIGJlZm9yZSBhIGNvbmZpZyBmaWxlIGVudGVycyB0aGUgYXJjaGl2ZS5cbiAqIGB1c2VyYCAvIGBrZXlgIGFyZSBXRElPJ3Mgb3duIHRvcC1sZXZlbCBjcmVkZW50aWFsIG9wdGlvbnMsIGhlbmNlIHRoZSBiYXJlIGVudHJpZXMuXG4gKi9cbi8qKlxuICogV29yZCBmYW1pbGllcyB0aGF0IG1ha2UgYW4gaWRlbnRpZmllciBzZW5zaXRpdmUgd2hlbiB0aGV5IGFwcGVhciBhcyBpdHMgU1VGRklYIFx1MjAxNFxuICogYGNsaWVudFNlY3JldGAsIGByZWZyZXNoVG9rZW5gLCBgcHJpdmF0ZUtleWAsIGBjbGllbnRfc2VjcmV0YC4gU3BsaXQgYnkgY2FzZSBzbyB0aGVcbiAqIGNhbWVsQ2FzZSBmb3JtIHJlcXVpcmVzIGEgY2FwaXRhbCAoZGlzdGluZ3Vpc2hpbmcgYHByaXZhdGVLZXlgIGZyb20gYGhvdGtleWApIGFuZCB0aGVcbiAqIHNuYWtlX2Nhc2UgZm9ybSByZXF1aXJlcyBhbiBleHBsaWNpdCBgX2AgKGRpc3Rpbmd1aXNoaW5nIGBjbGllbnRfc2VjcmV0YCBmcm9tIGBrZXl3b3JkYCkuXG4gKi9cbmV4cG9ydCBjb25zdCBDT01QT1VORF9TRUNSRVRfU1VGRklYRVNfQ0FNRUwgPSAnS2V5fFRva2VufFNlY3JldHxQYXNzd29yZHxQYXNzd2R8Q3JlZGVudGlhbCdcbmV4cG9ydCBjb25zdCBDT01QT1VORF9TRUNSRVRfU1VGRklYRVNfU05BS0UgPSAna2V5fHRva2VufHNlY3JldHxwYXNzd29yZHxwYXNzd2R8Y3JlZGVudGlhbCdcblxuLyoqXG4gKiBTZWNyZXRzIHRoYXQgc3BhbiBsaW5lcyBvciBoaWRlIGluc2lkZSBhIHZhbHVlLCB3aGljaCBhIGxpbmUva2V5LWFuY2hvcmVkIHNjcnViIGNhbm5vdFxuICogcmVhY2guIEFwcGxpZWQgYXMgd2hvbGUtYmxvY2sgcGFzc2VzIGJlZm9yZSB0aGUgbGluZSBwYXNzZXMuXG4gKi9cbi8qIGFuIGlubGluZSBQRU06IHRoZSBrZXkgYnl0ZXMgc2l0IG9uIGxpbmVzIHRoYXQgY2Fycnkgbm8ga2V5IG5hbWUgYXQgYWxsICovXG4vKlxuICogVGhlIGJvZHkgaXMgVEVNUEVSRUQgc28gaXQgY2Fubm90IGNyb3NzIGEgc2Vjb25kIGAtLS0tLUJFR0lOYDogd2l0aCBhIHBsYWluIGBbXFxzXFxTXSo/YCxcbiAqIGFuIFVOVEVSTUlOQVRFRCBibG9jayBlYXJsaWVyIGluIHRoZSBmaWxlIG1hdGNoZXMgdGhyb3VnaCB0byBhIGxhdGVyLCB1bnJlbGF0ZWQgYmxvY2snc1xuICogRU5EIG1hcmtlciBhbmQgZXZlcnl0aGluZyBpbiBiZXR3ZWVuIGlzIHJlcGxhY2VkIFx1MjAxNCBzaWxlbnRseSBkZXN0cm95aW5nIHVucmVsYXRlZCBjb25maWcuXG4gKiBCb3VuZGVkIGFzIHdlbGwsIHNvIHRoZSBzY2FuIHN0YXlzIGxpbmVhci5cbiAqL1xuZXhwb3J0IGNvbnN0IFBFTV9CTE9DS19SRUdFWCA9IC8oLS0tLS1CRUdJTiBbXi1cXHJcXG5dKy0tLS0tKSg/Oig/IS0tLS0tQkVHSU4pW1xcc1xcU10pezAsNjU1MzZ9PygtLS0tLUVORCBbXi1cXHJcXG5dKy0tLS0tKS9nXG4vKlxuICogQSBQRU0gb3BlbmVkIGJ1dCBuZXZlciBjbG9zZWQuIFRoZSBibG9jayByZWdleCBhYm92ZSBuZWVkcyB0aGUgRU5EIG1hcmtlciwgc28gd2l0aG91dCBpdFxuICogdGhlIGtleSBieXRlcyBzdXJ2aXZlIGV2ZXJ5IHBhc3MuIE1hdGNoZWQgYXMgQkVHSU4gKyB0aGUgcnVuIG9mIGJhc2U2NC1vbmx5IGxpbmVzIHRoYXRcbiAqIGZvbGxvd3MuIEEgcnVuIG11c3QgYmUgYXQgbGVhc3QgMjAgY2hhcmFjdGVycyBhbmQgZW5kIGF0IGEgbm9uLWJhc2U2NCBjaGFyYWN0ZXI6IGxldHRlcnNcbiAqIGFyZSB2YWxpZCBiYXNlNjQsIHNvIGEgc2hvcnRlci91bmJvdW5kZWQgcnVsZSBtYXRjaGVzIHBhcnQgb2YgYW4gb3JkaW5hcnkgbGluZSBzdWNoIGFzXG4gKiBgbmV4dE9wdGlvbjogMWAgYW5kIGVhdHMgaXQuIFN0b3BzIGF0IHRoZSBmaXJzdCBsaW5lIHRoYXQgZG9lcyBub3QgcXVhbGlmeSwgc28gYSBtYWxmb3JtZWRcbiAqIGJsb2NrIGNhbm5vdCBzd2FsbG93IHRoZSByZXN0IG9mIHRoZSBmaWxlLiBUaGUgdXBwZXIgYm91bmQgaXMgZ2VuZXJvdXMgKDggS0IpIGJlY2F1c2UgYVxuICoga2V5IHdyaXR0ZW4gdW53cmFwcGVkIG9uIE9ORSBsaW5lIHdvdWxkIG90aGVyd2lzZSBleGNlZWQgaXQgYW5kIGZhaWwgT1BFTiwgbGVhdmluZyB0aGUgYm9keVxuICogaW4gdGhlIGJ1bmRsZS5cbiAqL1xuZXhwb3J0IGNvbnN0IFBFTV9VTlRFUk1JTkFURURfUkVHRVggPSAvKC0tLS0tQkVHSU4gW14tXFxyXFxuXSstLS0tLSkoPzpcXHI/XFxuW0EtWmEtejAtOSsvPV17MjAsODE5Mn0oPz1bXkEtWmEtejAtOSsvPV18JCkpKy9nXG4vKlxuICogVXNlcmluZm8gaW4gQU5ZIHVybCB2YWx1ZSwgbm90IGp1c3QgdGhlIGBwcm94eVVybGAga2V5LiBUaGUgcGFzc3dvcmQgaGFsZiBpcyBvcHRpb25hbCBzb1xuICogc2luZ2xlLXRva2VuIGZvcm1zIChgaHR0cHM6Ly9naHBfeHh4QGdpdGh1Yi5jb21gLCBjb21tb24gaW4gQ0kgZ2l0L25wbSByZW1vdGVzKSBhcmUgY2F1Z2h0XG4gKiB0b28uIFF1YW50aWZpZXJzIGFyZSBCT1VOREVEOiB0aGUgdW5ib3VuZGVkIGZvcm0gd2FzIG1lYXN1cmFibHkgcXVhZHJhdGljICgxMDAgS0Igb2ZcbiAqIHdvcmQgY2hhcmFjdGVycyB0b29rIDYuMSBzLCA0eCBwZXIgZG91YmxpbmcpIGJlY2F1c2UgYm90aCBoYWx2ZXMgc2NhbiBmb3J3YXJkIGZvciBhbiBgQGBcbiAqIHRoYXQgbmV2ZXIgYXJyaXZlcy4gUmVhbCB1c2VyaW5mbyBpcyBzaG9ydCwgc28gdGhlIGJvdW5kcyBjaGFuZ2Ugbm8gcmVhbC13b3JsZCBtYXRjaC5cbiAqL1xuZXhwb3J0IGNvbnN0IFVSTF9VU0VSSU5GT19SRUdFWCA9IC8oW2EtekEtWl1bYS16QS1aMC05Ky4tXXswLDY0fTpcXC9cXC8pW15cXHMvQDpdezEsMjU2fSg/OjpbXlxccy9AXXswLDI1Nn0pP0AvZ1xuXG5leHBvcnQgY29uc3QgUkVEQUNURURfS0VZUyA9IFtcbiAgICAndXNlcicsICdrZXknLFxuICAgICd1c2VyTmFtZScsICdhY2Nlc3NLZXknLFxuICAgICdicm93c2Vyc3RhY2sudXNlcicsICdicm93c2Vyc3RhY2sua2V5JyxcbiAgICAnYnJvd3NlcnN0YWNrLnVzZXJOYW1lJywgJ2Jyb3dzZXJzdGFjay5hY2Nlc3NLZXknLFxuICAgICdwYXNzd29yZCcsICdwcm94eVBhc3N3b3JkJywgJ3Byb3h5VXNlcicsICdwcm94eVBhc3MnLFxuICAgICdsb2NhbFByb3h5VXNlcicsICdsb2NhbFByb3h5UGFzcycsICdwcm94eVVybCcsXG4gICAgJ2F1dGhUb2tlbicsICdhcGlLZXknLCAnYWNjZXNzVG9rZW4nLCAnc2VjcmV0JywgJ3Rva2VuJyxcbiAgICAnY3VzdG9tVmFyaWFibGVzJywgJ3VzZXJfZGF0YScsICdodHRwUHJveHknLCAnaHR0cHNQcm94eSdcbl1cblxuZXhwb3J0IGNvbnN0IFBFUkNZX0RPTV9DSEFOR0lOR19DT01NQU5EU19FTkRQT0lOVFMgPSBbXG4gICAgJy9zZXNzaW9uLzpzZXNzaW9uSWQvdXJsJyxcbiAgICAnL3Nlc3Npb24vOnNlc3Npb25JZC9mb3J3YXJkJyxcbiAgICAnL3Nlc3Npb24vOnNlc3Npb25JZC9iYWNrJyxcbiAgICAnL3Nlc3Npb24vOnNlc3Npb25JZC9yZWZyZXNoJyxcbiAgICAnL3Nlc3Npb24vOnNlc3Npb25JZC9zY3JlZW5zaG90JyxcbiAgICAnL3Nlc3Npb24vOnNlc3Npb25JZC9hY3Rpb25zJyxcbiAgICAnL3Nlc3Npb24vOnNlc3Npb25JZC9hcHBpdW0vZGV2aWNlL3NoYWtlJ1xuXVxuXG5leHBvcnQgY29uc3QgQ0FQVFVSRV9NT0RFUyA9IFsnY2xpY2snLCAnYXV0bycsICdzY3JlZW5zaG90JywgJ21hbnVhbCcsICd0ZXN0Y2FzZSddXG5leHBvcnQgY29uc3QgTE9HX0tJTkRfVVNBR0VfTUFQID0ge1xuICAgICdURVNUX0xPRyc6ICdsb2cnLFxuICAgICdURVNUX1NDUkVFTlNIT1QnOiAnc2NyZWVuc2hvdCcsXG4gICAgJ1RFU1RfU1RFUCc6ICdzdGVwJyxcbiAgICAnSFRUUCc6ICdodHRwJ1xufVxuXG5leHBvcnQgY29uc3QgRlVOTkVMX0lOU1RSVU1FTlRBVElPTl9VUkwgPSAnaHR0cHM6Ly9hcGkuYnJvd3NlcnN0YWNrLmNvbS9zZGsvdjEvZXZlbnQnXG5cbmV4cG9ydCBjb25zdCBFRFNfVVJMID0gJ2h0dHBzOi8vZWRzLmJyb3dzZXJzdGFjay5jb20nXG5cbmV4cG9ydCBjb25zdCBTVVBQT1JURURfQlJPV1NFUlNfRk9SX0FJID0gWydjaHJvbWUnLCAnbWljcm9zb2Z0ZWRnZScsICdmaXJlZm94J11cblxuZXhwb3J0IGNvbnN0IFRDR19VUkwgPSAnaHR0cHM6Ly90Y2cuYnJvd3NlcnN0YWNrLmNvbSdcblxuZXhwb3J0IGNvbnN0IFRDR19JTkZPID0ge1xuICAgIHRjZ1JlZ2lvbjogJ3VzZScsXG4gICAgdGNnVXJsOiBUQ0dfVVJMLFxufVxuXG4vLyBTbWFydCBTZWxlY3Rpb24gTW9kZSBDb25zdGFudHNcbmV4cG9ydCBjb25zdCBTTUFSVF9TRUxFQ1RJT05fTU9ERV9SRUxFVkFOVF9GSVJTVCA9ICdyZWxldmFudEZpcnN0J1xuZXhwb3J0IGNvbnN0IFNNQVJUX1NFTEVDVElPTl9NT0RFX1JFTEVWQU5UX09OTFkgPSAncmVsZXZhbnRPbmx5J1xuXG4vLyBFbnYgdmFyaWFibGVzIC0gRGVmaW5lIGFsbCB0aGUgZW52IHZhcmlhYmxlIGNvbnN0YW50cyBvdmVyIGhlcmVcblxuLy8gVG8gc3RvcmUgdGhlIEpXVCB0b2tlbiByZXR1cm5lZCB0aGUgc2Vzc2lvbiBsYXVuY2hcbmV4cG9ydCBjb25zdCBCUk9XU0VSU1RBQ0tfVEVTVEhVQl9KV1QgPSAnQlJPV1NFUlNUQUNLX1RFU1RIVUJfSldUJ1xuXG4vLyBUbyBzdG9yZSB0Y2cgYXV0aCByZXN1bHQgZm9yIHNlbGZIZWFsaW5nIGZlYXR1cmU6XG5leHBvcnQgY29uc3QgQlNUQUNLX1RDR19BVVRIX1JFU1VMVCA9ICdCU1RBQ0tfVENHX0FVVEhfUkVTVUxUJ1xuXG4vLyBUbyBzdG9yZSB0aGUgc2V0dGluZyBvZiB3aGV0aGVyIHRvIHNlbmQgc2NyZWVuc2hvdHMgb3Igbm90XG5leHBvcnQgY29uc3QgVEVTVE9QU19TQ1JFRU5TSE9UX0VOViA9ICdCU19URVNUT1BTX0FMTE9XX1NDUkVFTlNIT1RTJ1xuXG4vLyBUbyBzdG9yZSBidWlsZCBoYXNoZWQgaWRcbmV4cG9ydCBjb25zdCBCUk9XU0VSU1RBQ0tfVEVTVEhVQl9VVUlEID0gJ0JST1dTRVJTVEFDS19URVNUSFVCX1VVSUQnXG4vLyBJbnRlcnJ1cHQgc2lnbmFsLCBwcm9wYWdhdGVkIHZpYSBlbnYgc28gdGhlIGRldGFjaGVkIGNsZWFudXAgY2hpbGQgYW5kIGdSUENcbi8vIHN0b3AgcGF0aCBjYW4gc3RhbXAgdGhlIGtpbGwgcmVhc29uIG9udG8gdGhlIGJ1aWxkIHN0b3AuXG5leHBvcnQgY29uc3QgQlJPV1NFUlNUQUNLX0tJTExfU0lHTkFMID0gJ0JST1dTRVJTVEFDS19TREtfS0lMTF9TSUdOQUwnXG5cbi8vIFRvIHN0b3JlIHRlc3QgcnVuIHV1aWRcbmV4cG9ydCBjb25zdCBURVNUX0FOQUxZVElDU19JRCA9ICdURVNUX0FOQUxZVElDU19JRCdcblxuLy8gV2hldGhlciB0byBjb2xsZWN0IHBlcmZvcm1hbmNlIGluc3RydW1lbnRhdGlvbiBvciBub3RcbmV4cG9ydCBjb25zdCBQRVJGX01FQVNVUkVNRU5UX0VOViA9ICdCUk9XU0VSU1RBQ0tfTzExWV9QRVJGX01FQVNVUkVNRU5UJ1xuXG4vLyBXaGV0aGVyIHRoZSBjdXJyZW50IHJ1biBpcyByZXJ1biBvciBub3RcbmV4cG9ydCBjb25zdCBSRVJVTl9URVNUU19FTlYgPSAnQlJPV1NFUlNUQUNLX1JFUlVOX1RFU1RTJ1xuXG4vLyBUaGUgdGVzdHMgdGhhdCBuZWVkcyB0byBiZSByZXJ1blxuZXhwb3J0IGNvbnN0IFJFUlVOX0VOViA9ICdCUk9XU0VSU1RBQ0tfUkVSVU4nXG5cbi8vIFRvIHN0b3JlIHdoZXRoZXIgdGhlIGJ1aWxkIGxhdW5jaCBoYXMgY29tcGxldGVkIG9yIG5vdFxuZXhwb3J0IGNvbnN0IFRFU1RPUFNfQlVJTERfQ09NUExFVEVEX0VOViA9ICdCU19URVNUT1BTX0JVSUxEX0NPTVBMRVRFRCdcblxuLy8gV2hldGhlciBwZXJjeSBoYXMgc3RhcnRlZCBzdWNjZXNzZnVsbHkgb3Igbm90XG5leHBvcnQgY29uc3QgQlJPV1NFUlNUQUNLX1BFUkNZID0gJ0JST1dTRVJTVEFDS19QRVJDWSdcblxuLy8gV2hldGhlciBzZXNzaW9uIGlzIGEgYWNjZXNzaWJpbGl0eSBzZXNzaW9uXG5leHBvcnQgY29uc3QgQlJPV1NFUlNUQUNLX0FDQ0VTU0lCSUxJVFkgPSAnQlJPV1NFUlNUQUNLX0FDQ0VTU0lCSUxJVFknXG5cbi8vIFdoZXRoZXIgc2Vzc2lvbiBpcyBhIHRlc3QgcmVwb3J0aW5nIHNlc3Npb25cbmV4cG9ydCBjb25zdCBCUk9XU0VSU1RBQ0tfT0JTRVJWQUJJTElUWSA9ICdCUk9XU0VSU1RBQ0tfT0JTRVJWQUJJTElUWSdcblxuLy8gTG9hZCBUZXN0aW5nIFNlcnZpY2UgKExUUykgZW52IHZhcnM6IHRoZSBwb2QtaXRlcmF0aW9uIHNlc3Npb24gaWQgKGl0c1xuLy8gcHJlc2VuY2UgaXMgdGhlIHNpbmdsZSBzb3VyY2Ugb2YgdHJ1dGggZm9yIFwidGhpcyBydW4gaXMgYW4gTFRTIHBvZFxuLy8gaXRlcmF0aW9uXCIpIGFuZCBhbiBvcHRpb25hbCBvcHQtaW4gZmxhZyBmb3IgbG9jYWwgcmVwcm8gLyBDSSBydW5zIHRoYXRcbi8vIGRvbid0IGhhdmUgYSByZWFsIHNlc3Npb24gaWQuXG5leHBvcnQgY29uc3QgQlJPV1NFUlNUQUNLX0xUU19TRVNTSU9OX0lEID0gJ0JST1dTRVJTVEFDS19MVFNfU0VTU0lPTl9JRCdcbmV4cG9ydCBjb25zdCBCUk9XU0VSU1RBQ0tfTFRTID0gJ0JST1dTRVJTVEFDS19MVFMnXG5cbi8vIE5ldyBUZXN0IFJlcG9ydGluZyBhbmQgQW5hbHl0aWNzIGVudmlyb25tZW50IHZhcmlhYmxlc1xuZXhwb3J0IGNvbnN0IEJST1dTRVJTVEFDS19URVNUX1JFUE9SVElORyA9ICdCUk9XU0VSU1RBQ0tfVEVTVF9SRVBPUlRJTkcnXG5leHBvcnQgY29uc3QgQlJPV1NFUlNUQUNLX1RFU1RfUkVQT1JUSU5HX0RFQlVHID0gJ0JST1dTRVJTVEFDS19URVNUX1JFUE9SVElOR19ERUJVRydcbmV4cG9ydCBjb25zdCBURVNUX1JFUE9SVElOR19CVUlMRF9UQUcgPSAnVEVTVF9SRVBPUlRJTkdfQlVJTERfVEFHJ1xuZXhwb3J0IGNvbnN0IFRFU1RfUkVQT1JUSU5HX1BST0pFQ1RfTkFNRSA9ICdURVNUX1JFUE9SVElOR19QUk9KRUNUX05BTUUnXG5leHBvcnQgY29uc3QgVEVTVF9SRVBPUlRJTkdfQlVJTERfTkFNRSA9ICdURVNUX1JFUE9SVElOR19CVUlMRF9OQU1FJ1xuXG4vLyBNYXhpbXVtIHNpemUgb2YgVkNTIGluZm8gd2hpY2ggaXMgYWxsb3dlZFxuZXhwb3J0IGNvbnN0IE1BWF9HSVRfTUVUQV9EQVRBX1NJWkVfSU5fQllURVMgPSA2NCAqIDEwMjRcblxuLyogVGhlIHZhbHVlIHRvIGJlIGFwcGVuZGVkIGF0IHRoZSBlbmQgaWYgZ2l0IG1ldGFkYXRhIGlzIGxhcmdlciB0aGFuIE1BWF9HSVRfTUVUQV9EQVRBX1NJWkVfSU5fQllURVNcbiovXG5leHBvcnQgY29uc3QgR0lUX01FVEFfREFUQV9UUlVOQ0FURUQgPSAnLi4uW1RSVU5DQVRFRF0nXG5cbi8vIENMSSByZWxhdGVkIGNvbnN0YW50c1xuZXhwb3J0IGNvbnN0IENMSV9TVE9QX1RJTUVPVVQgPSA1MDAwIC8vIDUgc2Vjb25kc1xuZXhwb3J0IGNvbnN0IEJJTkFSWV9CVVNZX0VSUk9SX0NPREVTID0gWydFVFhUQlNZJywgJ0VCVVNZJ11cbmV4cG9ydCBjb25zdCBNQVhfU1BBV05fUkVUUklFUyA9IDNcbmV4cG9ydCBjb25zdCBTUEFXTl9SRVRSWV9ERUxBWV9NUyA9IDEwMDBcbmV4cG9ydCBjb25zdCBXRElPX05BTUlOR19QUkVGSVggPSAnV2ViZHJpdmVySU8tJ1xuZXhwb3J0IGNvbnN0IFBFUkZfTUVUUklDU19XQUlUX1RJTUUgPSAyMDAwXG5cbi8vIEJ1aWxkLXN0b3AgZGVsaXZlcnkgYnVkZ2V0LiBUaGUgc3RvcCBQVVQgaXMgdGhlIG9ubHkgc2lnbmFsIHRoYXQgY2xvc2VzIGEgVFJBIGJ1aWxkLFxuLy8gc28gYSB0cmFuc2llbnQgdHJhbnNwb3J0IGZhaWx1cmUgaXMgd29ydGggcmV0cnlpbmcgcGFzdCBhIHNob3J0IG5ldHdvcmsgYmxpcCBcdTIwMTQgYnV0IHRoZVxuLy8gd2hvbGUgdGhpbmcgcnVucyBkdXJpbmcgc2h1dGRvd24sIHNvIHRoZSB0b3RhbCBjb3N0IGlzIGNhcHBlZCBieSBhIHdhbGwtY2xvY2sgZGVhZGxpbmVcbi8vIHJhdGhlciB0aGFuIGJ5IGF0dGVtcHQgY291bnQgYWxvbmUuXG5leHBvcnQgY29uc3QgU1RPUF9CVUlMRF9NQVhfQVRURU1QVFMgPSA0XG5leHBvcnQgY29uc3QgU1RPUF9CVUlMRF9BVFRFTVBUX1RJTUVPVVRfTVMgPSAxMDAwMFxuZXhwb3J0IGNvbnN0IFNUT1BfQlVJTERfVE9UQUxfQlVER0VUX01TID0gMzAwMDBcbmV4cG9ydCBjb25zdCBTVE9QX0JVSUxEX0JBQ0tPRkZfQkFTRV9NUyA9IDEwMDBcblxuLy8gdXBsb2FkQXR0YWNobWVudCBpcyBjYWxsZWQgZnJvbSBpbnNpZGUgdGhlIGN1c3RvbWVyJ3MgdGVzdCBib2R5LCBzbyB0aGUgd2FpdCBmb3IgdGhlXG4vLyBiaW5hcnkncyBhY2sgaXMgYm91bmRlZDogdGhlIGV2ZW50IGlzIGFscmVhZHkgb24gdGhlIHdpcmUgd2hlbiB0aGUgdGltZXIgZmlyZXMsIGFuZCBhXG4vLyB3ZWRnZWQgYmluYXJ5IG11c3Qgbm90IHN0YWxsIHRoZSB0ZXN0IHRoYXQgY2FsbGVkIHVzLlxuZXhwb3J0IGNvbnN0IFVQTE9BRF9BVFRBQ0hNRU5UX0FDS19USU1FT1VUX01TID0gMTAwMDBcblxuLy8gQVBJIEVuZHBvaW50IGNvbnN0YW50c1xuZXhwb3J0IGNvbnN0IFVQREFURURfQ0xJX0VORFBPSU5UID0gJ3Nkay92MS91cGRhdGVfY2xpJ1xuXG4vKipcbiAqIE1vZHVsZSBIb29rIEV2ZW50cyAtIFBlcmZvcm1hbmNlIGV2ZW50IG5hbWVzIGZvciBtb2R1bGUgbGlmZWN5Y2xlIHRyYWNraW5nXG4gKiBVc2VkIGJ5IG1vZHVsZS1ob29rLXRyYWNrZXIudHMgdG8gaW5zdHJ1bWVudCBtb2R1bGUgaW5pdGlhbGl6YXRpb24gYW5kIGNsZWFudXBcbiAqL1xuZXhwb3J0IGNvbnN0IE1PRFVMRV9IT09LX0VWRU5UUyA9IHtcbiAgICAvLyBJbnN0cnVtZW50YXRpb24gbW9kdWxlXG4gICAgSU5TVFJVTUVOVEFUSU9OX09OX1NUQVJUOiAnTU9EVUxFX0lOU1RSVU1FTlRBVElPTl9PTl9TVEFSVCcsXG4gICAgSU5TVFJVTUVOVEFUSU9OX09OX1NUT1A6ICdNT0RVTEVfSU5TVFJVTUVOVEFUSU9OX09OX1NUT1AnLFxuXG4gICAgLy8gVGVzdEh1YiBtb2R1bGVcbiAgICBURVNUSFVCX09OX1NUQVJUOiAnTU9EVUxFX1RFU1RIVUJfT05fU1RBUlQnLFxuICAgIFRFU1RIVUJfT05fU1RPUDogJ01PRFVMRV9URVNUSFVCX09OX1NUT1AnLFxuXG4gICAgLy8gT2JzZXJ2YWJpbGl0eSBtb2R1bGVcbiAgICBPQlNFUlZBQklMSVRZX09OX1NUQVJUOiAnTU9EVUxFX09CU0VSVkFCSUxJVFlfT05fU1RBUlQnLFxuICAgIE9CU0VSVkFCSUxJVFlfT05fU1RPUDogJ01PRFVMRV9PQlNFUlZBQklMSVRZX09OX1NUT1AnLFxuXG4gICAgLy8gUGVyY3kgbW9kdWxlXG4gICAgUEVSQ1lfT05fU1RBUlQ6ICdNT0RVTEVfUEVSQ1lfT05fU1RBUlQnLFxuICAgIFBFUkNZX09OX1NUT1A6ICdNT0RVTEVfUEVSQ1lfT05fU1RPUCcsXG5cbiAgICAvLyBBY2Nlc3NpYmlsaXR5IG1vZHVsZVxuICAgIEFDQ0VTU0lCSUxJVFlfT05fU1RBUlQ6ICdNT0RVTEVfQUNDRVNTSUJJTElUWV9PTl9TVEFSVCcsXG4gICAgQUNDRVNTSUJJTElUWV9PTl9TVE9QOiAnTU9EVUxFX0FDQ0VTU0lCSUxJVFlfT05fU1RPUCcsXG4gICAgQUNDRVNTSUJJTElUWV9PTl9EUklWRVJfSU5JVDogJ01PRFVMRV9BQ0NFU1NJQklMSVRZX09OX0RSSVZFUl9JTklUJyxcblxuICAgIC8vIEFJIG1vZHVsZVxuICAgIEFJX09OX1NUQVJUOiAnTU9EVUxFX0FJX09OX1NUQVJUJyxcbiAgICBBSV9PTl9TVE9QOiAnTU9EVUxFX0FJX09OX1NUT1AnLFxuICAgIEFJX0JFRk9SRV9TRVNTSU9OOiAnTU9EVUxFX0FJX0JFRk9SRV9TRVNTSU9OJyxcbiAgICBBSV9PTl9EUklWRVJfSU5JVDogJ01PRFVMRV9BSV9PTl9EUklWRVJfSU5JVCcsXG5cbiAgICAvLyBMb2NhbCB0ZXN0aW5nIG1vZHVsZVxuICAgIExPQ0FMX09OX1NUQVJUOiAnTU9EVUxFX0xPQ0FMX09OX1NUQVJUJyxcbiAgICBMT0NBTF9PTl9TVE9QOiAnTU9EVUxFX0xPQ0FMX09OX1NUT1AnLFxuICAgIExPQ0FMX0lOSVRfU0VTU0lPTjogJ01PRFVMRV9MT0NBTF9JTklUX1NFU1NJT04nLFxuICAgIExPQ0FMX09OX0RSSVZFUl9JTklUOiAnTU9EVUxFX0xPQ0FMX09OX0RSSVZFUl9JTklUJyxcblxuICAgIC8vIEFwcCBBdXRvbWF0ZSBtb2R1bGVcbiAgICBBUFBBVVRPTUFURV9PTl9TVEFSVDogJ01PRFVMRV9BUFBBVVRPTUFURV9PTl9TVEFSVCcsXG4gICAgQVBQQVVUT01BVEVfT05fRFJJVkVSX0lOSVQ6ICdNT0RVTEVfQVBQQVVUT01BVEVfT05fRFJJVkVSX0lOSVQnLFxufSBhcyBjb25zdFxuIiwgImltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCdcbmltcG9ydCBmcyBmcm9tICdub2RlOmZzJ1xuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJ1xuXG5pbXBvcnQgbG9nZ2VyIGZyb20gJ0B3ZGlvL2xvZ2dlcidcblxuaW1wb3J0IHsgTE9HU19GSUxFIH0gZnJvbSAnLi4vY29uc3RhbnRzLmpzJ1xuaW1wb3J0IHsgQ09MT1JTIH0gZnJvbSAnLi4vdXRpbC5qcydcblxuY29uc3QgbG9nID0gbG9nZ2VyKCdAd2Rpby9icm93c2Vyc3RhY2stc2VydmljZS9jbGknKVxuXG5leHBvcnQgY2xhc3MgQlN0YWNrTG9nZ2VyIHtcbiAgICBwdWJsaWMgc3RhdGljIGxvZ0ZpbGVQYXRoID0gcGF0aC5qb2luKHByb2Nlc3MuY3dkKCksIExPR1NfRklMRSlcbiAgICBwdWJsaWMgc3RhdGljIGxvZ0ZvbGRlclBhdGggPSBwYXRoLmpvaW4ocHJvY2Vzcy5jd2QoKSwgJ2xvZ3MnKVxuICAgIHByaXZhdGUgc3RhdGljIGxvZ0ZpbGVTdHJlYW06IGZzLldyaXRlU3RyZWFtIHwgbnVsbFxuXG4gICAgc3RhdGljIGxvZ1RvRmlsZShsb2dNZXNzYWdlOiBzdHJpbmcsIGxvZ0xldmVsOiBzdHJpbmcpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmICghdGhpcy5sb2dGaWxlU3RyZWFtKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5lbnN1cmVMb2dzRm9sZGVyKClcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ0ZpbGVTdHJlYW0gPSBmcy5jcmVhdGVXcml0ZVN0cmVhbSh0aGlzLmxvZ0ZpbGVQYXRoLCB7IGZsYWdzOiAnYScgfSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLmxvZ0ZpbGVTdHJlYW0gJiYgdGhpcy5sb2dGaWxlU3RyZWFtLndyaXRhYmxlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2dGaWxlU3RyZWFtLndyaXRlKHRoaXMuZm9ybWF0TG9nKGxvZ01lc3NhZ2UsIGxvZ0xldmVsKSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGxvZy5kZWJ1ZyhgRmFpbGVkIHRvIGxvZyB0byBmaWxlLiBFcnJvciAke2Vycm9yfWApXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBmb3JtYXRMb2cobG9nTWVzc2FnZTogc3RyaW5nLCBsZXZlbDogc3RyaW5nKSB7XG4gICAgICAgIHJldHVybiBgJHtjaGFsay5ncmF5KG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSl9ICR7Y2hhbGtbQ09MT1JTW2xldmVsXV0obGV2ZWwudG9VcHBlckNhc2UoKSl9ICR7Y2hhbGsud2hpdGVCcmlnaHQoJ0B3ZGlvL2Jyb3dzZXJzdGFjay1zZXJ2aWNlJyl9ICR7bG9nTWVzc2FnZX1cXG5gXG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBpbmZvKG1lc3NhZ2U6IHN0cmluZykge1xuICAgICAgICB0aGlzLmxvZ1RvRmlsZShtZXNzYWdlLCAnaW5mbycpXG4gICAgICAgIGxvZy5pbmZvKG1lc3NhZ2UpXG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBlcnJvcihtZXNzYWdlOiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5sb2dUb0ZpbGUobWVzc2FnZSwgJ2Vycm9yJylcbiAgICAgICAgbG9nLmVycm9yKG1lc3NhZ2UpXG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBkZWJ1ZyhtZXNzYWdlOiBzdHJpbmcsIHBhcmFtPzogdW5rbm93bikge1xuICAgICAgICB0aGlzLmxvZ1RvRmlsZShtZXNzYWdlLCAnZGVidWcnKVxuICAgICAgICBpZiAocGFyYW0pIHtcbiAgICAgICAgICAgIGxvZy5kZWJ1ZyhtZXNzYWdlLCBwYXJhbSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxvZy5kZWJ1ZyhtZXNzYWdlKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyB3YXJuKG1lc3NhZ2U6IHN0cmluZykge1xuICAgICAgICB0aGlzLmxvZ1RvRmlsZShtZXNzYWdlLCAnd2FybicpXG4gICAgICAgIGxvZy53YXJuKG1lc3NhZ2UpXG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyB0cmFjZShtZXNzYWdlOiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5sb2dUb0ZpbGUobWVzc2FnZSwgJ3RyYWNlJylcbiAgICAgICAgbG9nLnRyYWNlKG1lc3NhZ2UpXG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBjbGVhckxvZ2dlcigpIHtcbiAgICAgICAgaWYgKHRoaXMubG9nRmlsZVN0cmVhbSkge1xuICAgICAgICAgICAgdGhpcy5sb2dGaWxlU3RyZWFtLmVuZCgpXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5sb2dGaWxlU3RyZWFtID0gbnVsbFxuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgY2xlYXJMb2dGaWxlKCkge1xuICAgICAgICBpZiAoZnMuZXhpc3RzU3luYyh0aGlzLmxvZ0ZpbGVQYXRoKSkge1xuICAgICAgICAgICAgZnMudHJ1bmNhdGVTeW5jKHRoaXMubG9nRmlsZVBhdGgpXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGVuc3VyZUxvZ3NGb2xkZXIoKSB7XG4gICAgICAgIGlmICghZnMuZXhpc3RzU3luYyh0aGlzLmxvZ0ZvbGRlclBhdGgpKXtcbiAgICAgICAgICAgIGZzLm1rZGlyU3luYyh0aGlzLmxvZ0ZvbGRlclBhdGgpXG4gICAgICAgIH1cbiAgICB9XG59XG4iLCAiaW1wb3J0IHsgQlN0YWNrTG9nZ2VyIH0gZnJvbSAnLi9jbGlMb2dnZXIuanMnXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEFQSVV0aWxzIHtcbiAgICBzdGF0aWMgRlVOTkVMX0lOU1RSVU1FTlRBVElPTl9VUkwgPSAnaHR0cHM6Ly9hcGkuYnJvd3NlcnN0YWNrLmNvbS9zZGsvdjEvZXZlbnQnXG4gICAgc3RhdGljIEJST1dTRVJTVEFDS19BVVRPTUFURV9BUElfVVJMID0gJ2h0dHBzOi8vYXBpLmJyb3dzZXJzdGFjay5jb20nXG4gICAgc3RhdGljIEJST1dTRVJTVEFDS19BQV9BUElfVVJMID0gJ2h0dHBzOi8vYXBpLmJyb3dzZXJzdGFjay5jb20nXG4gICAgc3RhdGljIEJST1dTRVJTVEFDS19QRVJDWV9BUElfVVJMID0gJ2h0dHBzOi8vYXBpLmJyb3dzZXJzdGFjay5jb20nXG4gICAgc3RhdGljIEJST1dTRVJTVEFDS19BVVRPTUFURV9BUElfQ0xPVURfVVJMID0gJ2h0dHBzOi8vYXBpLWNsb3VkLmJyb3dzZXJzdGFjay5jb20nXG4gICAgc3RhdGljIEJST1dTRVJTVEFDS19BQV9BUElfQ0xPVURfVVJMID0gJ2h0dHBzOi8vYXBpLWNsb3VkLmJyb3dzZXJzdGFjay5jb20nXG4gICAgc3RhdGljIEFQUF9BTExZX0VORFBPSU5UID0gJ2h0dHBzOi8vYXBwLWFjY2Vzc2liaWxpdHkuYnJvd3NlcnN0YWNrLmNvbS9hdXRvbWF0ZSdcbiAgICBzdGF0aWMgREFUQV9FTkRQT0lOVCA9ICdodHRwczovL2NvbGxlY3Rvci1vYnNlcnZhYmlsaXR5LmJyb3dzZXJzdGFjay5jb20nXG4gICAgc3RhdGljIFVQTE9BRF9MT0dTX0FERFJFU1MgPSAnaHR0cHM6Ly91cGxvYWQtb2JzZXJ2YWJpbGl0eS5icm93c2Vyc3RhY2suY29tJ1xuICAgIHN0YXRpYyBFRFNfVVJMID0gJ2h0dHBzOi8vZWRzLmJyb3dzZXJzdGFjay5jb20nXG5cbiAgICAvKipcbiAgICAgKiBPdmVybGF5IHRoZSBiaW5hcnktc3VwcGxpZWQgR1JSIGVuZHBvaW50cyBvbnRvIHRoZSBwdWJsaWMgZGVmYXVsdHMuIEV2ZXJ5IGZpZWxkIGlzXG4gICAgICogb3B0aW9uYWw6IGEgZGVnZW5lcmF0ZSBTdGFydEJpblNlc3Npb24vQ29ubmVjdEJpblNlc3Npb24gY29uZmlnIChhdXRoIGZhaWx1cmUsIGVtcHR5XG4gICAgICogcGF5bG9hZCkgdXNlZCB0byB0aHJvdyBoZXJlIGFuZCBhYm9ydCB0aGUgd2hvbGUgQ0xJIGJvb3RzdHJhcCwgdGFraW5nIGV2ZXJ5IHByb2R1Y3RcbiAgICAgKiBtb2R1bGUgd2l0aCBpdC4gTWlzc2luZyBlbnRyaWVzIG5vdyBqdXN0IGxlYXZlIHRoZSBjb3JyZXNwb25kaW5nIGRlZmF1bHQgaW4gcGxhY2UuXG4gICAgICovXG4gICAgc3RhdGljIHVwZGF0ZVVSTFNGb3JHUlIoYXBpcz86IEdSUlVybHMpIHtcbiAgICAgICAgaWYgKCFhcGlzKSB7XG4gICAgICAgICAgICBCU3RhY2tMb2dnZXIuZGVidWcoJ3VwZGF0ZVVSTFNGb3JHUlI6IG5vIGFwaXMgaW4gdGhlIGJpbi1zZXNzaW9uIGNvbmZpZzsga2VlcGluZyBkZWZhdWx0IGVuZHBvaW50cycpXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBtaXNzaW5nID0gW1xuICAgICAgICAgICAgWydhdXRvbWF0ZS5hcGknLCBhcGlzLmF1dG9tYXRlPy5hcGldLCBbJ2F1dG9tYXRlLnVwbG9hZCcsIGFwaXMuYXV0b21hdGU/LnVwbG9hZF0sXG4gICAgICAgICAgICBbJ2FwcEF1dG9tYXRlLmFwaScsIGFwaXMuYXBwQXV0b21hdGU/LmFwaV0sIFsnYXBwQXV0b21hdGUudXBsb2FkJywgYXBpcy5hcHBBdXRvbWF0ZT8udXBsb2FkXSxcbiAgICAgICAgICAgIFsncGVyY3kuYXBpJywgYXBpcy5wZXJjeT8uYXBpXSwgWydhcHBBY2Nlc3NpYmlsaXR5LmFwaScsIGFwaXMuYXBwQWNjZXNzaWJpbGl0eT8uYXBpXSxcbiAgICAgICAgICAgIFsnb2JzZXJ2YWJpbGl0eS5hcGknLCBhcGlzLm9ic2VydmFiaWxpdHk/LmFwaV0sIFsnb2JzZXJ2YWJpbGl0eS51cGxvYWQnLCBhcGlzLm9ic2VydmFiaWxpdHk/LnVwbG9hZF0sXG4gICAgICAgICAgICBbJ2Vkc0luc3RydW1lbnRhdGlvbi5hcGknLCBhcGlzLmVkc0luc3RydW1lbnRhdGlvbj8uYXBpXVxuICAgICAgICBdLmZpbHRlcigoWywgdmFsdWVdKSA9PiAhdmFsdWUpLm1hcCgoW25hbWVdKSA9PiBuYW1lKVxuICAgICAgICBpZiAobWlzc2luZy5sZW5ndGgpIHtcbiAgICAgICAgICAgIEJTdGFja0xvZ2dlci5kZWJ1ZyhgdXBkYXRlVVJMU0ZvckdSUjoga2VlcGluZyBkZWZhdWx0IGVuZHBvaW50cyBmb3IgJHttaXNzaW5nLmpvaW4oJywgJyl9YClcbiAgICAgICAgfVxuICAgICAgICBpZiAoYXBpcy5hdXRvbWF0ZT8uYXBpKSB7XG4gICAgICAgICAgICB0aGlzLkZVTk5FTF9JTlNUUlVNRU5UQVRJT05fVVJMID0gYCR7YXBpcy5hdXRvbWF0ZS5hcGl9L3Nkay92MS9ldmVudGBcbiAgICAgICAgICAgIHRoaXMuQlJPV1NFUlNUQUNLX0FVVE9NQVRFX0FQSV9VUkwgPSBhcGlzLmF1dG9tYXRlLmFwaVxuICAgICAgICB9XG4gICAgICAgIGlmIChhcGlzLmF1dG9tYXRlPy51cGxvYWQpIHtcbiAgICAgICAgICAgIHRoaXMuQlJPV1NFUlNUQUNLX0FVVE9NQVRFX0FQSV9DTE9VRF9VUkwgPSBhcGlzLmF1dG9tYXRlLnVwbG9hZFxuICAgICAgICB9XG4gICAgICAgIGlmIChhcGlzLmFwcEF1dG9tYXRlPy5hcGkpIHtcbiAgICAgICAgICAgIHRoaXMuQlJPV1NFUlNUQUNLX0FBX0FQSV9VUkwgPSBhcGlzLmFwcEF1dG9tYXRlLmFwaVxuICAgICAgICB9XG4gICAgICAgIGlmIChhcGlzLmFwcEF1dG9tYXRlPy51cGxvYWQpIHtcbiAgICAgICAgICAgIHRoaXMuQlJPV1NFUlNUQUNLX0FBX0FQSV9DTE9VRF9VUkwgPSBhcGlzLmFwcEF1dG9tYXRlLnVwbG9hZFxuICAgICAgICB9XG4gICAgICAgIGlmIChhcGlzLnBlcmN5Py5hcGkpIHtcbiAgICAgICAgICAgIHRoaXMuQlJPV1NFUlNUQUNLX1BFUkNZX0FQSV9VUkwgPSBhcGlzLnBlcmN5LmFwaVxuICAgICAgICB9XG4gICAgICAgIGlmIChhcGlzLmFwcEFjY2Vzc2liaWxpdHk/LmFwaSkge1xuICAgICAgICAgICAgdGhpcy5BUFBfQUxMWV9FTkRQT0lOVCA9IGAke2FwaXMuYXBwQWNjZXNzaWJpbGl0eS5hcGl9L2F1dG9tYXRlYFxuICAgICAgICB9XG4gICAgICAgIGlmIChhcGlzLm9ic2VydmFiaWxpdHk/LmFwaSkge1xuICAgICAgICAgICAgdGhpcy5EQVRBX0VORFBPSU5UID0gYXBpcy5vYnNlcnZhYmlsaXR5LmFwaVxuICAgICAgICB9XG4gICAgICAgIGlmIChhcGlzLm9ic2VydmFiaWxpdHk/LnVwbG9hZCkge1xuICAgICAgICAgICAgdGhpcy5VUExPQURfTE9HU19BRERSRVNTID0gYXBpcy5vYnNlcnZhYmlsaXR5LnVwbG9hZFxuICAgICAgICB9XG4gICAgICAgIGlmIChhcGlzLmVkc0luc3RydW1lbnRhdGlvbj8uYXBpKSB7XG4gICAgICAgICAgICB0aGlzLkVEU19VUkwgPSBhcGlzLmVkc0luc3RydW1lbnRhdGlvbi5hcGlcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsICJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcydcbmltcG9ydCBmc3AgZnJvbSAnbm9kZTpmcy9wcm9taXNlcydcbmltcG9ydCB7IHBsYXRmb3JtLCBhcmNoLCBob21lZGlyIH0gZnJvbSAnbm9kZTpvcydcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCdcbmltcG9ydCB1dGlsLCB7IHByb21pc2lmeSB9IGZyb20gJ25vZGU6dXRpbCdcbmltcG9ydCB7IGV4ZWMgfSBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnXG5pbXBvcnQgeyBSZWFkYWJsZSB9IGZyb20gJ25vZGU6c3RyZWFtJ1xuaW1wb3J0IHR5cGUgeyBaaXBGaWxlLCBPcHRpb25zIGFzIHlhdXpsT3B0aW9ucyB9IGZyb20gJ3lhdXpsJ1xuaW1wb3J0IHlhdXpsIGZyb20gJ3lhdXpsJ1xuaW1wb3J0IHsgdGhyZWFkSWQgfSBmcm9tICdub2RlOndvcmtlcl90aHJlYWRzJ1xuXG5pbXBvcnQgeyBfZmV0Y2ggYXMgZmV0Y2ggfSBmcm9tICcuLi9mZXRjaFdyYXBwZXIuanMnXG5cbmltcG9ydCB7XG4gICAgaXNOdWxsT3JFbXB0eSxcbiAgICBuZXN0ZWRLZXlWYWx1ZSxcbiAgICBjcmVhdGVEaXIsXG4gICAgaXNXcml0YWJsZSxcbiAgICBzZXRSZWFkV3JpdGVBY2Nlc3MsXG4gICAgaXNUcnVlLFxuICAgIGdldEJyb3dzZXJTdGFja1VzZXIsXG4gICAgZ2V0QnJvd3NlclN0YWNrS2V5LFxuICAgIGlzRmFsc2UsXG4gICAgaXNUdXJib1NjYWxlLFxuICAgIHNob3VsZEFkZFNlcnZpY2VWZXJzaW9uLFxufSBmcm9tICcuLi91dGlsLmpzJ1xuaW1wb3J0IFBlcmZvcm1hbmNlVGVzdGVyIGZyb20gJy4uL2luc3RydW1lbnRhdGlvbi9wZXJmb3JtYW5jZS9wZXJmb3JtYW5jZS10ZXN0ZXIuanMnXG5pbXBvcnQgeyBFVkVOVFMgYXMgUGVyZm9ybWFuY2VFdmVudHMgfSBmcm9tICcuLi9pbnN0cnVtZW50YXRpb24vcGVyZm9ybWFuY2UvY29uc3RhbnRzLmpzJ1xuaW1wb3J0IHsgQlN0YWNrTG9nZ2VyIGFzIGxvZ2dlciB9IGZyb20gJy4vY2xpTG9nZ2VyLmpzJ1xuaW1wb3J0IHsgVVBEQVRFRF9DTElfRU5EUE9JTlQsIEJTVEFDS19TRVJWSUNFX1ZFUlNJT04sIEJJTkFSWV9CVVNZX0VSUk9SX0NPREVTIH0gZnJvbSAnLi4vY29uc3RhbnRzLmpzJ1xuaW1wb3J0IHR5cGUgeyBPcHRpb25zLCBDYXBhYmlsaXRpZXMgfSBmcm9tICdAd2Rpby90eXBlcydcbmltcG9ydCB0eXBlIHtcbiAgICBCcm93c2Vyc3RhY2tDb25maWcsXG4gICAgQnJvd3NlcnN0YWNrT3B0aW9ucyxcbiAgICBUZXN0TWFuYWdlbWVudE9wdGlvbnMsXG4gICAgVGVzdE9ic2VydmFiaWxpdHlPcHRpb25zLFxufSBmcm9tICcuLi90eXBlcy5qcydcbmltcG9ydCB7IFRlc3RGcmFtZXdvcmtDb25zdGFudHMgfSBmcm9tICcuL2ZyYW1ld29ya3MvY29uc3RhbnRzL3Rlc3RGcmFtZXdvcmtDb25zdGFudHMuanMnXG5pbXBvcnQgQVBJVXRpbHMgZnJvbSAnLi9hcGlVdGlscy5qcydcblxuY29uc3QgQ0xJX0xPQ0tfVElNRU9VVF9NUyA9IDUgKiA2MCAqIDEwMDBcbmNvbnN0IENMSV9MT0NLX1BPTExfTVMgPSAxMDAwXG5jb25zdCBDTElfRE9XTkxPQURfVElNRU9VVF9NUyA9IDUgKiA2MCAqIDEwMDBcbmNvbnN0IENMSV9ET1dOTE9BRF9UTVBfUFJFRklYID0gJ2Rvd25sb2FkZWRfZmlsZV8nXG5jb25zdCBDTElfRE9XTkxPQURfVE1QX1NVRkZJWCA9ICcuemlwJ1xuXG5leHBvcnQgY2xhc3MgQ0xJVXRpbHMge1xuICAgIHN0YXRpYyBhdXRvbWF0aW9uRnJhbWV3b3JrRGV0YWlsID0ge31cbiAgICBzdGF0aWMgdGVzdEZyYW1ld29ya0RldGFpbCA9IHt9XG4gICAgc3RhdGljIENMSVN1cHBvcnRlZEZyYW1ld29ya3MgPSBbJ21vY2hhJywgJ2N1Y3VtYmVyJ11cblxuICAgIHN0YXRpYyBpc0RldmVsb3BtZW50RW52KCkge1xuICAgICAgICByZXR1cm4gcHJvY2Vzcy5lbnYuQlJPV1NFUlNUQUNLX0NMSV9FTlYgPT09ICdkZXZlbG9wbWVudCdcbiAgICB9XG5cbiAgICBzdGF0aWMgZ2V0Q0xJUGFyYW1zRm9yRGV2RW52KCk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4ge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgaWQ6IHByb2Nlc3MuZW52LkJST1dTRVJTVEFDS19DTElfRU5WIHx8ICcnLFxuICAgICAgICAgICAgbGlzdGVuOiBgdW5peDovdG1wL3Nkay1wbGF0Zm9ybS0ke3Byb2Nlc3MuZW52LkJST1dTRVJTVEFDS19DTElfRU5WfS5zb2NrYCxcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEJ1aWxkIGNvbmZpZyBvYmplY3QgZm9yIGJpbmFyeSBzZXNzaW9uIHJlcXVlc3RcbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgICAqIEB0aHJvd3Mge0Vycm9yfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXRCaW5Db25maWcoXG4gICAgICAgIGNvbmZpZzogT3B0aW9ucy5UZXN0cnVubmVyLFxuICAgICAgICBjYXBhYmlsaXRpZXM6XG4gICAgICAgICAgICB8IENhcGFiaWxpdGllcy5SZXF1ZXN0ZWRTdGFuZGFsb25lQ2FwYWJpbGl0aWVzXG4gICAgICAgICAgICB8IENhcGFiaWxpdGllcy5SZXF1ZXN0ZWRTdGFuZGFsb25lQ2FwYWJpbGl0aWVzW10sXG4gICAgICAgIG9wdGlvbnM6IEJyb3dzZXJzdGFja0NvbmZpZyAmIEJyb3dzZXJzdGFja09wdGlvbnMsXG4gICAgICAgIGJ1aWxkVGFnPzogc3RyaW5nLFxuICAgICkge1xuICAgICAgICBjb25zdCBtb2RpZmllZE9wdHM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0geyAuLi5vcHRpb25zIH1cbiAgICAgICAgaWYgKG1vZGlmaWVkT3B0cy5vcHRzKSB7XG4gICAgICAgICAgICBtb2RpZmllZE9wdHMuYnJvd3NlclN0YWNrTG9jYWxPcHRpb25zID0gbW9kaWZpZWRPcHRzLm9wdHNcbiAgICAgICAgICAgIGRlbGV0ZSBtb2RpZmllZE9wdHMub3B0c1xuICAgICAgICB9XG4gICAgICAgIGRlbGV0ZSBtb2RpZmllZE9wdHMudGVzdE1hbmFnZW1lbnRPcHRpb25zXG5cbiAgICAgICAgbW9kaWZpZWRPcHRzLnRlc3RDb250ZXh0T3B0aW9ucyA9IHtcbiAgICAgICAgICAgIHNraXBTZXNzaW9uTmFtZTogaXNGYWxzZShtb2RpZmllZE9wdHMuc2V0U2Vzc2lvbk5hbWUpLFxuICAgICAgICAgICAgc2tpcFNlc3Npb25TdGF0dXM6IGlzRmFsc2UobW9kaWZpZWRPcHRzLnNldFNlc3Npb25TdGF0dXMpLFxuICAgICAgICAgICAgc2Vzc2lvbk5hbWVPbWl0VGVzdFRpdGxlOiBtb2RpZmllZE9wdHMuc2Vzc2lvbk5hbWVPbWl0VGVzdFRpdGxlIHx8IGZhbHNlLFxuICAgICAgICAgICAgc2Vzc2lvbk5hbWVQcmVwZW5kVG9wTGV2ZWxTdWl0ZVRpdGxlOlxuICAgICAgICAgICAgICAgIG1vZGlmaWVkT3B0cy5zZXNzaW9uTmFtZVByZXBlbmRUb3BMZXZlbFN1aXRlVGl0bGUgfHwgZmFsc2UsXG4gICAgICAgICAgICBzZXNzaW9uTmFtZUZvcm1hdDogbW9kaWZpZWRPcHRzLnNlc3Npb25OYW1lRm9ybWF0IHx8ICcnLFxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY29tbW9uQnN0YWNrT3B0aW9ucyA9ICgoKSA9PiB7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgY2FwYWJpbGl0aWVzICYmXG4gICAgICAgICAgICAgICAgIUFycmF5LmlzQXJyYXkoY2FwYWJpbGl0aWVzKSAmJlxuICAgICAgICAgICAgICAgIHR5cGVvZiBjYXBhYmlsaXRpZXMgPT09ICdvYmplY3QnICYmXG4gICAgICAgICAgICAgICAgJ2JzdGFjazpvcHRpb25zJyBpbiAoY2FwYWJpbGl0aWVzIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgLy8gQ2FzdCBhZnRlciBndWFyZCB0byBzYXRpc2Z5IFR5cGVTY3JpcHRcbiAgICAgICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgICAgICAoXG4gICAgICAgICAgICAgICAgICAgICAgICBjYXBhYmlsaXRpZXMgYXMge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsnYnN0YWNrOm9wdGlvbnMnXT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICApWydic3RhY2s6b3B0aW9ucyddIHx8IHt9XG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHt9XG4gICAgICAgIH0pKClcblxuICAgICAgICBjb25zdCBpc05vbkJzdGFja0ExMXkgPVxuICAgICAgICAgICAgaXNUdXJib1NjYWxlKG9wdGlvbnMpIHx8XG4gICAgICAgICAgICAhc2hvdWxkQWRkU2VydmljZVZlcnNpb24oXG4gICAgICAgICAgICAgICAgY29uZmlnIGFzIE9wdGlvbnMuVGVzdHJ1bm5lcixcbiAgICAgICAgICAgICAgICBvcHRpb25zLnRlc3RPYnNlcnZhYmlsaXR5LFxuICAgICAgICAgICAgKVxuICAgICAgICBjb25zdCBvYnNlcnZhYmlsaXR5T3B0aW9uczogVGVzdE9ic2VydmFiaWxpdHlPcHRpb25zID1cbiAgICAgICAgICAgIG9wdGlvbnMudGVzdE9ic2VydmFiaWxpdHlPcHRpb25zIHx8IHt9XG4gICAgICAgIGNvbnN0IHRlc3RNYW5hZ2VtZW50T3B0aW9uczogVGVzdE1hbmFnZW1lbnRPcHRpb25zID1cbiAgICAgICAgICAgIG9wdGlvbnMudGVzdE1hbmFnZW1lbnRPcHRpb25zIHx8IHt9XG4gICAgICAgIGNvbnN0IHRlc3RQbGFuSWQgPSB0eXBlb2YgdGVzdE1hbmFnZW1lbnRPcHRpb25zLnRlc3RQbGFuSWQgPT09ICdzdHJpbmcnXG4gICAgICAgICAgICA/IHRlc3RNYW5hZ2VtZW50T3B0aW9ucy50ZXN0UGxhbklkLnRyaW0oKVxuICAgICAgICAgICAgOiAnJ1xuICAgICAgICBjb25zdCBiaW5jb25maWc6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge1xuICAgICAgICAgICAgdXNlck5hbWU6IG9ic2VydmFiaWxpdHlPcHRpb25zLnVzZXIgfHwgY29uZmlnLnVzZXIsXG4gICAgICAgICAgICBhY2Nlc3NLZXk6IG9ic2VydmFiaWxpdHlPcHRpb25zLmtleSB8fCBjb25maWcua2V5LFxuICAgICAgICAgICAgcGxhdGZvcm1zOiBbXSxcbiAgICAgICAgICAgIGlzTm9uQnN0YWNrQTExeVdESU86IGlzTm9uQnN0YWNrQTExeSxcbiAgICAgICAgICAgIC4uLm1vZGlmaWVkT3B0cyxcbiAgICAgICAgICAgIC4uLmNvbW1vbkJzdGFja09wdGlvbnMsXG4gICAgICAgIH1cblxuICAgICAgICBiaW5jb25maWcuYnVpbGROYW1lID0gb2JzZXJ2YWJpbGl0eU9wdGlvbnMuYnVpbGROYW1lIHx8IGJpbmNvbmZpZy5idWlsZE5hbWVcbiAgICAgICAgYmluY29uZmlnLnByb2plY3ROYW1lID0gb2JzZXJ2YWJpbGl0eU9wdGlvbnMucHJvamVjdE5hbWUgfHwgYmluY29uZmlnLnByb2plY3ROYW1lXG4gICAgICAgIGJpbmNvbmZpZy5idWlsZFRhZyA9IHRoaXMuZ2V0T2JzZXJ2YWJpbGl0eUJ1aWxkVGFncyhvYnNlcnZhYmlsaXR5T3B0aW9ucywgYnVpbGRUYWcpIHx8IFtdXG4gICAgICAgIGlmICh0ZXN0UGxhbklkLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGJpbmNvbmZpZy50ZXN0TWFuYWdlbWVudE9wdGlvbnMgPSB7XG4gICAgICAgICAgICAgICAgdGVzdFBsYW5JZCxcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNhcHMgPSBBcnJheS5pc0FycmF5KGNhcGFiaWxpdGllcykgPyBjYXBhYmlsaXRpZXMgOiBbY2FwYWJpbGl0aWVzXVxuICAgICAgICBmb3IgKGNvbnN0IGNhcCBvZiBjYXBzKSB7XG4gICAgICAgICAgICBjb25zdCBwbGF0Zm9ybTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fVxuICAgICAgICAgICAgY29uc3QgY2FwYWJpbGl0eSA9IGNhcCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuXG4gICAgICAgICAgICBPYmplY3Qua2V5cyhjYXBhYmlsaXR5KVxuICAgICAgICAgICAgICAgIC5maWx0ZXIoKGtleSkgPT4ga2V5ICE9PSAnYnN0YWNrOm9wdGlvbnMnKVxuICAgICAgICAgICAgICAgIC5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcGxhdGZvcm1ba2V5XSA9IGNhcGFiaWxpdHlba2V5XVxuICAgICAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgIGlmIChjYXBhYmlsaXR5Wydic3RhY2s6b3B0aW9ucyddKSB7XG4gICAgICAgICAgICAgICAgT2JqZWN0LmtleXMoXG4gICAgICAgICAgICAgICAgICAgIGNhcGFiaWxpdHlbJ2JzdGFjazpvcHRpb25zJ10gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gICAgICAgICAgICAgICAgKS5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcGxhdGZvcm1ba2V5XSA9IChcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhcGFiaWxpdHlbJ2JzdGFjazpvcHRpb25zJ10gYXMgUmVjb3JkPFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmtub3duXG4gICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIClba2V5XVxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAoYmluY29uZmlnLnBsYXRmb3JtcyBhcyBBcnJheTx1bmtub3duPikucHVzaChwbGF0Zm9ybSlcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoYmluY29uZmlnKVxuICAgIH1cblxuICAgIHN0YXRpYyBnZXRTZGtWZXJzaW9uKCkge1xuICAgICAgICByZXR1cm4gQlNUQUNLX1NFUlZJQ0VfVkVSU0lPTlxuICAgIH1cblxuICAgIHN0YXRpYyBnZXRTZGtMYW5ndWFnZSgpIHtcbiAgICAgICAgcmV0dXJuICdFQ01BU2NyaXB0J1xuICAgIH1cblxuICAgIHN0YXRpYyBhc3luYyBzZXR1cENsaVBhdGgoXG4gICAgICAgIGNvbmZpZzogT3B0aW9ucy5UZXN0cnVubmVyLFxuICAgICk6IFByb21pc2U8c3RyaW5nIHwgbnVsbD4ge1xuICAgICAgICBsb2dnZXIuZGVidWcoJ0NvbmZpZ3VyaW5nIENsaSBwYXRoLicpXG4gICAgICAgIGNvbnN0IGRldmVsb3BtZW50QmluYXJ5UGF0aCA9IHByb2Nlc3MuZW52LlNES19DTElfQklOX1BBVEggfHwgbnVsbFxuICAgICAgICBpZiAoIWlzTnVsbE9yRW1wdHkoZGV2ZWxvcG1lbnRCaW5hcnlQYXRoKSkge1xuICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGBEZXZlbG9wbWVudCBDbGkgUGF0aDogJHtkZXZlbG9wbWVudEJpbmFyeVBhdGh9YClcbiAgICAgICAgICAgIHJldHVybiBkZXZlbG9wbWVudEJpbmFyeVBhdGhcbiAgICAgICAgfVxuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBjbGlEaXIgPSB0aGlzLmdldENsaURpcigpXG4gICAgICAgICAgICBpZiAoaXNOdWxsT3JFbXB0eShjbGlEaXIpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyB3cml0YWJsZSBkaXJlY3RvcnkgYXZhaWxhYmxlIGZvciB0aGUgQ0xJJylcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGV4aXN0aW5nQ2xpUGF0aCA9IHRoaXMuZ2V0RXhpc3RpbmdDbGlQYXRoKGNsaURpcilcbiAgICAgICAgICAgIGNvbnN0IGZpbmFsQmluYXJ5UGF0aCA9IGF3YWl0IHRoaXMuY2hlY2tBbmRVcGRhdGVDbGkoXG4gICAgICAgICAgICAgICAgZXhpc3RpbmdDbGlQYXRoLFxuICAgICAgICAgICAgICAgIGNsaURpcixcbiAgICAgICAgICAgICAgICBjb25maWcsXG4gICAgICAgICAgICApXG4gICAgICAgICAgICBsb2dnZXIuZGVidWcoYFJlc29sdmVkIGJpbmFyeSBwYXRoOiAke2ZpbmFsQmluYXJ5UGF0aH1gKVxuICAgICAgICAgICAgcmV0dXJuIGZpbmFsQmluYXJ5UGF0aFxuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgICAgICAgICBgRXJyb3IgaW4gc2V0dGluZyB1cCBjbGkgcGF0aCBkaXJlY3RvcnksIEV4Y2VwdGlvbjogJHt1dGlsLmZvcm1hdChlcnIpfWAsXG4gICAgICAgICAgICApXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGxcbiAgICB9XG5cbiAgICBzdGF0aWMgYXN5bmMgY2hlY2tBbmRVcGRhdGVDbGkoXG4gICAgICAgIGV4aXN0aW5nQ2xpUGF0aDogc3RyaW5nLFxuICAgICAgICBjbGlEaXI6IHN0cmluZyxcbiAgICAgICAgY29uZmlnOiBPcHRpb25zLlRlc3RydW5uZXIsXG4gICAgKTogUHJvbWlzZTxzdHJpbmcgfCBudWxsPiB7XG4gICAgICAgIC8vIFNraXAgQ0xJIHVwZGF0ZSBpbiB3b3JrZXIgcHJvY2Vzc2VzIC0gb25seSBsYXVuY2hlciBzaG91bGQgdXBkYXRlXG4gICAgICAgIC8vIFdvcmtlcnMgYXJlIGlkZW50aWZpZWQgYnkgaGF2aW5nIEJST1dTRVJTVEFDS19URVNUSFVCX0pXVCBzZXQgKGJ1aWxkIGFscmVhZHkgc3RhcnRlZClcbiAgICAgICAgaWYgKHByb2Nlc3MuZW52LkJST1dTRVJTVEFDS19URVNUSFVCX0pXVCkge1xuICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKFxuICAgICAgICAgICAgICAgIGBXb3JrZXIgcHJvY2VzcyBkZXRlY3RlZCwgc2tpcHBpbmcgQ0xJIHVwZGF0ZS4gVXNpbmcgZXhpc3Rpbmc6ICR7ZXhpc3RpbmdDbGlQYXRofWAsXG4gICAgICAgICAgICApXG4gICAgICAgICAgICBpZiAoZXhpc3RpbmdDbGlQYXRoICYmIGZzLmV4aXN0c1N5bmMoZXhpc3RpbmdDbGlQYXRoKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBleGlzdGluZ0NsaVBhdGhcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxvZ2dlci53YXJuKFxuICAgICAgICAgICAgICAgICdXb3JrZXIgcHJvY2VzcyBoYXMgbm8gZXhpc3RpbmcgQ0xJIGJpbmFyeSwgYXR0ZW1wdGluZyBkb3dubG9hZCBhcyBmYWxsYmFjay4nLFxuICAgICAgICAgICAgKVxuICAgICAgICB9XG5cbiAgICAgICAgUGVyZm9ybWFuY2VUZXN0ZXIuc3RhcnQoUGVyZm9ybWFuY2VFdmVudHMuU0RLX0NMSV9DSEVDS19VUERBVEUpXG4gICAgICAgIGxvZ2dlci5pbmZvKGBDdXJyZW50IENMSSBQYXRoIEZvdW5kOiAke2V4aXN0aW5nQ2xpUGF0aH1gKVxuICAgICAgICBjb25zdCBxdWVyeVBhcmFtczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAgICAgICAgIHNka192ZXJzaW9uOiBDTElVdGlscy5nZXRTZGtWZXJzaW9uKCksXG4gICAgICAgICAgICBvczogcGxhdGZvcm0oKSxcbiAgICAgICAgICAgIG9zX2FyY2g6IGFyY2goKSxcbiAgICAgICAgICAgIGNsaV92ZXJzaW9uOiAnMCcsXG4gICAgICAgICAgICBzZGtfbGFuZ3VhZ2U6IHRoaXMuZ2V0U2RrTGFuZ3VhZ2UoKSxcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWlzTnVsbE9yRW1wdHkoZXhpc3RpbmdDbGlQYXRoKSkge1xuICAgICAgICAgICAgLy8gSWYgYmluYXJ5IGlzIGJ1c3kgKGJlaW5nIGV4ZWN1dGVkIGJ5IGFub3RoZXIgcHJvY2VzcyksIHNraXAgdmVyc2lvbiBjaGVja1xuICAgICAgICAgICAgLy8gYW5kIEFQSSBjYWxsIGVudGlyZWx5IFx1MjAxNCB1c2UgZXhpc3RpbmcgYmluYXJ5IGFzLWlzXG4gICAgICAgICAgICBpZiAodGhpcy5pc0JpbmFyeUJ1c3koZXhpc3RpbmdDbGlQYXRoKSkge1xuICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuKGBFeGlzdGluZyBiaW5hcnkgaXMgY3VycmVudGx5IGluIHVzZSwgc2tpcHBpbmcgdXBkYXRlOiAke2V4aXN0aW5nQ2xpUGF0aH1gKVxuICAgICAgICAgICAgICAgIFBlcmZvcm1hbmNlVGVzdGVyLmVuZChQZXJmb3JtYW5jZUV2ZW50cy5TREtfQ0xJX0NIRUNLX1VQREFURSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZXhpc3RpbmdDbGlQYXRoXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCB2ZXJzaW9uID0gYXdhaXQgdGhpcy5ydW5TaGVsbENvbW1hbmQoXG4gICAgICAgICAgICAgICAgYCR7ZXhpc3RpbmdDbGlQYXRofSB2ZXJzaW9uYCxcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIGlmICh2ZXJzaW9uLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoJ3RleHQgZmlsZSBidXN5JykpIHtcbiAgICAgICAgICAgICAgICBsb2dnZXIud2FybihgQmluYXJ5IGJ1c3kgZHVyaW5nIHZlcnNpb24gY2hlY2ssIHNraXBwaW5nIHVwZGF0ZTogJHtleGlzdGluZ0NsaVBhdGh9YClcbiAgICAgICAgICAgICAgICBQZXJmb3JtYW5jZVRlc3Rlci5lbmQoUGVyZm9ybWFuY2VFdmVudHMuU0RLX0NMSV9DSEVDS19VUERBVEUpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGV4aXN0aW5nQ2xpUGF0aFxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcXVlcnlQYXJhbXMuY2xpX3ZlcnNpb24gPSB2ZXJzaW9uXG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLnJlcXVlc3RUb1VwZGF0ZUNMSShxdWVyeVBhcmFtcywgY29uZmlnKVxuICAgICAgICBpZiAobmVzdGVkS2V5VmFsdWUocmVzcG9uc2UsIFsndXBkYXRlZF9jbGlfdmVyc2lvbiddKSkge1xuICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKFxuICAgICAgICAgICAgICAgIGBOZWVkIHRvIHVwZGF0ZSBiaW5hcnksIGN1cnJlbnQgYmluYXJ5IHZlcnNpb246ICR7cXVlcnlQYXJhbXMuY2xpX3ZlcnNpb259YCxcbiAgICAgICAgICAgIClcblxuICAgICAgICAgICAgY29uc3QgYnJvd3NlclN0YWNrQmluYXJ5VXJsID1cbiAgICAgICAgICAgICAgICBwcm9jZXNzLmVudi5CUk9XU0VSU1RBQ0tfQklOQVJZX1VSTCB8fCBudWxsXG4gICAgICAgICAgICBpZiAoIWlzTnVsbE9yRW1wdHkoYnJvd3NlclN0YWNrQmluYXJ5VXJsKSkge1xuICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgICAgICAgICAgICAgYFVzaW5nIEJST1dTRVJTVEFDS19CSU5BUllfVVJMOiAke2Jyb3dzZXJTdGFja0JpbmFyeVVybH1gLFxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICByZXNwb25zZS51cmwgPSBicm93c2VyU3RhY2tCaW5hcnlVcmxcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgZmluYWxCaW5hcnlQYXRoID0gYXdhaXQgdGhpcy5kb3dubG9hZExhdGVzdEJpbmFyeShcbiAgICAgICAgICAgICAgICBuZXN0ZWRLZXlWYWx1ZShyZXNwb25zZSwgWyd1cmwnXSksXG4gICAgICAgICAgICAgICAgY2xpRGlyLFxuICAgICAgICAgICAgICAgIG5lc3RlZEtleVZhbHVlKHJlc3BvbnNlLCBbJ3VwZGF0ZWRfY2xpX3ZlcnNpb24nXSksXG4gICAgICAgICAgICApXG4gICAgICAgICAgICBQZXJmb3JtYW5jZVRlc3Rlci5lbmQoUGVyZm9ybWFuY2VFdmVudHMuU0RLX0NMSV9DSEVDS19VUERBVEUpXG4gICAgICAgICAgICByZXR1cm4gZmluYWxCaW5hcnlQYXRoXG4gICAgICAgIH1cbiAgICAgICAgUGVyZm9ybWFuY2VUZXN0ZXIuZW5kKFBlcmZvcm1hbmNlRXZlbnRzLlNES19DTElfQ0hFQ0tfVVBEQVRFKVxuICAgICAgICByZXR1cm4gZXhpc3RpbmdDbGlQYXRoXG4gICAgfVxuXG4gICAgc3RhdGljIGdldENsaURpcigpIHtcbiAgICAgICAgY29uc3Qgd3JpdGFibGVEaXIgPSB0aGlzLmdldFdyaXRhYmxlRGlyKClcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmIChpc051bGxPckVtcHR5KHdyaXRhYmxlRGlyKSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignTm8gd3JpdGFibGUgZGlyZWN0b3J5IGF2YWlsYWJsZSBmb3IgdGhlIENMSScpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBjbGlEaXJQYXRoID0gcGF0aC5qb2luKHdyaXRhYmxlRGlyISwgJ2NsaScpXG4gICAgICAgICAgICBpZiAoIWZzLmV4aXN0c1N5bmMoY2xpRGlyUGF0aCkpIHtcbiAgICAgICAgICAgICAgICBjcmVhdGVEaXIoY2xpRGlyUGF0aClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBjbGlEaXJQYXRoXG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgbG9nZ2VyLmVycm9yKFxuICAgICAgICAgICAgICAgIGBFcnJvciBpbiBnZXR0aW5nIHdyaXRhYmxlIGRpcmVjdG9yeSwgd3JpdGFibGVEaXI9JHt1dGlsLmZvcm1hdChlcnIpfWAsXG4gICAgICAgICAgICApXG4gICAgICAgICAgICByZXR1cm4gJydcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHN0YXRpYyBnZXRXcml0YWJsZURpcigpIHtcbiAgICAgICAgY29uc3Qgd3JpdGFibGVEaXJPcHRpb25zID0gW1xuICAgICAgICAgICAgcHJvY2Vzcy5lbnYuQlJPV1NFUlNUQUNLX0ZJTEVTX0RJUixcbiAgICAgICAgICAgIHBhdGguam9pbihob21lZGlyKCksICcuYnJvd3NlcnN0YWNrJyksXG4gICAgICAgICAgICBwYXRoLmpvaW4oJ3RtcCcsICcuYnJvd3NlcnN0YWNrJyksXG4gICAgICAgIF1cblxuICAgICAgICBmb3IgKGNvbnN0IHBhdGggb2Ygd3JpdGFibGVEaXJPcHRpb25zKSB7XG4gICAgICAgICAgICBpZiAoaXNOdWxsT3JFbXB0eShwYXRoKSkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGlmIChmcy5leGlzdHNTeW5jKHBhdGghKSkge1xuICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoYEZpbGUgJHtwYXRofSBhbHJlYWR5IGV4aXN0YClcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFpc1dyaXRhYmxlKHBhdGghKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGBHaXZpbmcgd3JpdGUgcGVybWlzc2lvbiB0byAke3BhdGh9YClcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN1Y2Nlc3MgPSBzZXRSZWFkV3JpdGVBY2Nlc3MocGF0aCEpXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlzVHJ1ZShzdWNjZXNzKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgVW5hYmxlIHRvIHByb3ZpZGUgd3JpdGUgcGVybWlzc2lvbiB0byAke3BhdGh9YCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoYEZpbGUgZG9lcyBub3QgZXhpc3Q6ICR7cGF0aH1gKVxuICAgICAgICAgICAgICAgICAgICBjcmVhdGVEaXIocGF0aCEpXG4gICAgICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhgR2l2aW5nIHdyaXRlIHBlcm1pc3Npb24gdG8gJHtwYXRofWApXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHN1Y2Nlc3MgPSBzZXRSZWFkV3JpdGVBY2Nlc3MocGF0aCEpXG4gICAgICAgICAgICAgICAgICAgIGlmICghaXNUcnVlKHN1Y2Nlc3MpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIud2FybihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBgVW5hYmxlIHRvIHByb3ZpZGUgd3JpdGUgcGVybWlzc2lvbiB0byAke3BhdGh9YCxcbiAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gcGF0aFxuICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKFxuICAgICAgICAgICAgICAgICAgICBgVW5hYmxlIHRvIGdldCB3cml0YWJsZSBkaXJlY3RvcnksIGV4Y2VwdGlvbiAke3V0aWwuZm9ybWF0KGVycil9YCxcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGxcbiAgICB9XG5cbiAgICBzdGF0aWMgZ2V0RXhpc3RpbmdDbGlQYXRoKGNsaURpcjogc3RyaW5nKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgcGF0aCBleGlzdHMgYW5kIGlzIGEgZGlyZWN0b3J5XG4gICAgICAgICAgICBpZiAoIWZzLmV4aXN0c1N5bmMoY2xpRGlyKSB8fCAhZnMuc3RhdFN5bmMoY2xpRGlyKS5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICcnXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIExpc3QgYWxsIGZpbGVzIGluIHRoZSBkaXJlY3RvcnkgdGhhdCBzdGFydCB3aXRoIFwiYmluYXJ5LVwiXG4gICAgICAgICAgICBjb25zdCBhbGxCaW5hcmllcyA9IGZzXG4gICAgICAgICAgICAgICAgLnJlYWRkaXJTeW5jKGNsaURpcilcbiAgICAgICAgICAgICAgICAubWFwKChmaWxlOiBzdHJpbmcpID0+IHBhdGguam9pbihjbGlEaXIsIGZpbGUpKVxuICAgICAgICAgICAgICAgIC5maWx0ZXIoXG4gICAgICAgICAgICAgICAgICAgIChmaWxlUGF0aDogc3RyaW5nKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgZnMuc3RhdFN5bmMoZmlsZVBhdGgpLmlzRmlsZSgpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXRoLmJhc2VuYW1lKGZpbGVQYXRoKS5zdGFydHNXaXRoKCdiaW5hcnktJyksXG4gICAgICAgICAgICAgICAgKVxuXG4gICAgICAgICAgICBpZiAoYWxsQmluYXJpZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIC8vIEdldCB0aGUgbGF0ZXN0IGJpbmFyeSBieSBjb21wYXJpbmcgdGhlIGxhc3QgbW9kaWZpZWQgdGltZVxuICAgICAgICAgICAgICAgIGNvbnN0IGxhdGVzdEJpbmFyeSA9IGFsbEJpbmFyaWVzXG4gICAgICAgICAgICAgICAgICAgIC5tYXAoKGZpbGVQYXRoOiBzdHJpbmcpID0+ICh7XG4gICAgICAgICAgICAgICAgICAgICAgICBmaWxlUGF0aCxcbiAgICAgICAgICAgICAgICAgICAgICAgIG10aW1lOiBmcy5zdGF0U3luYyhmaWxlUGF0aCkubXRpbWUsXG4gICAgICAgICAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgICAgICAgICAucmVkdWNlKFxuICAgICAgICAgICAgICAgICAgICAgICAgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhdGVzdDogeyBmaWxlUGF0aDogc3RyaW5nOyBtdGltZTogRGF0ZSB9IHwgbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50OiB7IGZpbGVQYXRoOiBzdHJpbmc7IG10aW1lOiBEYXRlIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICApID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWxhdGVzdCB8fCAhbGF0ZXN0Lm10aW1lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjdXJyZW50XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnQubXRpbWUgPiBsYXRlc3QubXRpbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbGF0ZXN0XG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIHJldHVybiBsYXRlc3RCaW5hcnkgPyBsYXRlc3RCaW5hcnkuZmlsZVBhdGggOiAnJ1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gJycgLy8gTm8gYmluYXJ5IHByZXNlbnRcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICBsb2dnZXIuZXJyb3IoYEVycm9yIHdoaWxlIHJlYWRpbmcgQ0xJIHBhdGg6ICR7dXRpbC5mb3JtYXQoZXJyKX1gKVxuICAgICAgICAgICAgcmV0dXJuICcnXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzdGF0aWMgaXNCaW5hcnlCdXN5KGJpbmFyeVBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoaXNOdWxsT3JFbXB0eShiaW5hcnlQYXRoKSkge3JldHVybiBmYWxzZX1cbiAgICAgICAgaWYgKHBsYXRmb3JtKCkgPT09ICdkYXJ3aW4nKSB7cmV0dXJuIGZhbHNlfVxuICAgICAgICBpZiAoIWZzLmV4aXN0c1N5bmMoYmluYXJ5UGF0aCkpIHtyZXR1cm4gZmFsc2V9XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IGZkID0gZnMub3BlblN5bmMoYmluYXJ5UGF0aCwgJ3IrJylcbiAgICAgICAgICAgIGZzLmNsb3NlU3luYyhmZClcbiAgICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgICB9IGNhdGNoIChlcnI6IGFueSkge1xuICAgICAgICAgICAgaWYgKEJJTkFSWV9CVVNZX0VSUk9SX0NPREVTLmluY2x1ZGVzKGVyci5jb2RlKSkge1xuICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhgQmluYXJ5IGlzIGJ1c3k6ICR7YmluYXJ5UGF0aH1gKVxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsb2dnZXIuZGVidWcoYEVycm9yIGNoZWNraW5nIGlmIGJpbmFyeSBpcyBidXN5OiAke2Vyci5tZXNzYWdlfWApXG4gICAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHN0YXRpYyByZXF1ZXN0VG9VcGRhdGVDTEkgPSBhc3luYyAoXG4gICAgICAgIHF1ZXJ5UGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LFxuICAgICAgICBjb25maWc6IE9wdGlvbnMuVGVzdHJ1bm5lcixcbiAgICApID0+IHtcbiAgICAgICAgY29uc3QgcGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcyhxdWVyeVBhcmFtcylcbiAgICAgICAgY29uc3QgcmVxdWVzdEluaXQ6IFJlcXVlc3RJbml0ID0ge1xuICAgICAgICAgICAgbWV0aG9kOiAnR0VUJyxcbiAgICAgICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgICAgICBBdXRob3JpemF0aW9uOiBgQmFzaWMgJHtCdWZmZXIuZnJvbShgJHtnZXRCcm93c2VyU3RhY2tVc2VyKGNvbmZpZyl9OiR7Z2V0QnJvd3NlclN0YWNrS2V5KGNvbmZpZyl9YCkudG9TdHJpbmcoJ2Jhc2U2NCcpfWAsXG4gICAgICAgICAgICB9LFxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goXG4gICAgICAgICAgICBgJHtBUElVdGlscy5CUk9XU0VSU1RBQ0tfQVVUT01BVEVfQVBJX1VSTH0vJHtVUERBVEVEX0NMSV9FTkRQT0lOVH0/JHtwYXJhbXMudG9TdHJpbmcoKX1gLFxuICAgICAgICAgICAgcmVxdWVzdEluaXQsXG4gICAgICAgIClcbiAgICAgICAgY29uc3QganNvblJlc3BvbnNlID0gYXdhaXQgcmVzcG9uc2UuanNvbigpXG4gICAgICAgIGxvZ2dlci5kZWJ1ZyhgcmVzcG9uc2UgJHtKU09OLnN0cmluZ2lmeShqc29uUmVzcG9uc2UpfWApXG4gICAgICAgIHJldHVybiBqc29uUmVzcG9uc2VcbiAgICB9XG5cbiAgICBzdGF0aWMgcnVuU2hlbGxDb21tYW5kKFxuICAgICAgICBjbWRDb21tYW5kOiBzdHJpbmcsXG4gICAgICAgIHdvcmtpbmdEaXIgPSAnJyxcbiAgICApOiBQcm9taXNlPHN0cmluZz4ge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHByb2Nlc3MgPSBleGVjKFxuICAgICAgICAgICAgICAgIGNtZENvbW1hbmQsXG4gICAgICAgICAgICAgICAgeyBjd2Q6IHdvcmtpbmdEaXIsIHRpbWVvdXQ6IDUwMDAgfSxcbiAgICAgICAgICAgICAgICAoZXJyb3I6IEVycm9yLCBzdGRvdXQ6IHN0cmluZywgc3RkZXJyOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHN0ZGVyci50cmltKCkgfHwgJ1NIRUxMX0VYRUNVVEVfRVJST1InKVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShzdGRvdXQudHJpbSgpKVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIClcblxuICAgICAgICAgICAgLy8gRW5zdXJlIHRoZSBwcm9jZXNzIGlzIGtpbGxlZCBpZiBpdCBleGNlZWRzIHRoZSB0aW1lb3V0XG4gICAgICAgICAgICBwcm9jZXNzLm9uKCdlcnJvcicsICgpID0+IHtcbiAgICAgICAgICAgICAgICByZXNvbHZlKCdTSEVMTF9FWEVDVVRFX0VSUk9SJylcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH0pXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVmVyc2lvbiBlbmNvZGVkIGluIGEgYmluYXJ5IGRvd25sb2FkIFVSTCwgZS5nLlxuICAgICAqIGAuLi4vYmluYXJ5LW1hY29zLWFybTY0LTEuNDguMC56aXBgIC0+IGAxLjQ4LjBgLiBOdWxsIHdoZW4gdGhlIFVSTCBkb2VzXG4gICAgICogbm90IGNhcnJ5IG9uZSAoY3VzdG9tIEJST1dTRVJTVEFDS19CSU5BUllfVVJMKS5cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0VmVyc2lvbkZyb21CaW5hcnlVcmwoYmluRG93bmxvYWRVcmw6IHN0cmluZyk6IHN0cmluZyB8IG51bGwge1xuICAgICAgICByZXR1cm4gLy0oXFxkK1xcLlxcZCtcXC5cXGQrKVxcLnppcCg/OlxcP3wkKS8uZXhlYyhiaW5Eb3dubG9hZFVybCB8fCAnJyk/LlsxXSA/PyBudWxsXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogV2hldGhlciB0aGUgYmluYXJ5IG9uIGRpc2sgaXMgYWxyZWFkeSB0aGUgdmVyc2lvbiB3ZSB3ZXJlIGFza2VkIHRvIGZldGNoLlxuICAgICAqIEEgcGVlciB3b3JrZXIgd2lubmluZyB0aGUgZG93bmxvYWQgcmFjZSBsZWF2ZXMgdGhlICp0YXJnZXQqIHZlcnNpb24gaGVyZTtcbiAgICAgKiBhIG1lcmVseS1wcmUtZXhpc3RpbmcgYmluYXJ5IGlzIHN0YWxlLiBPbmx5IHRoZSBmb3JtZXIgbWF5IHNob3J0LWNpcmN1aXRcbiAgICAgKiB0aGUgZG93bmxvYWQgXHUyMDE0IHNlZSBgZG93bmxvYWRMYXRlc3RCaW5hcnlgLlxuICAgICAqL1xuICAgIHN0YXRpYyBhc3luYyBpc0JpbmFyeUF0VmVyc2lvbihcbiAgICAgICAgYmluYXJ5UGF0aDogc3RyaW5nLFxuICAgICAgICBleHBlY3RlZFZlcnNpb246IHN0cmluZyB8IG51bGwsXG4gICAgKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAgIGlmICghZXhwZWN0ZWRWZXJzaW9uKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgfVxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgYWN0dWFsID0gYXdhaXQgQ0xJVXRpbHMucnVuU2hlbGxDb21tYW5kKGAke2JpbmFyeVBhdGh9IHZlcnNpb25gKVxuICAgICAgICAgICAgcmV0dXJuIGFjdHVhbC50cmltKCkgPT09IGV4cGVjdGVkVmVyc2lvblxuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgc3RhdGljIGRvd25sb2FkTGF0ZXN0QmluYXJ5ID0gYXN5bmMgKFxuICAgICAgICBiaW5Eb3dubG9hZFVybDogc3RyaW5nLFxuICAgICAgICBjbGlEaXI6IHN0cmluZyxcbiAgICAgICAgZXhwZWN0ZWRWZXJzaW9uPzogc3RyaW5nIHwgbnVsbCxcbiAgICApOiBQcm9taXNlPHN0cmluZyB8IG51bGw+ID0+IHtcbiAgICAgICAgY29uc3QgbG9ja1BhdGggPSBwYXRoLmpvaW4oY2xpRGlyLCAnZG93bmxvYWQubG9jaycpXG4gICAgICAgIC8vIFByZWZlciB0aGUgdmVyc2lvbiB0aGUgc2VydmVyIHJlcG9ydGVkOyB0aGUgVVJMIGlzIG9ubHkgYSBmYWxsYmFjayBhbmRcbiAgICAgICAgLy8gY2FycmllcyBubyB2ZXJzaW9uIHdoZW4gQlJPV1NFUlNUQUNLX0JJTkFSWV9VUkwgb3ZlcnJpZGVzIGl0LlxuICAgICAgICBjb25zdCB0YXJnZXRWZXJzaW9uID1cbiAgICAgICAgICAgIGV4cGVjdGVkVmVyc2lvbiB8fCBDTElVdGlscy5nZXRWZXJzaW9uRnJvbUJpbmFyeVVybChiaW5Eb3dubG9hZFVybClcblxuICAgICAgICBjb25zdCBzbGVlcCA9IChtczogbnVtYmVyKSA9PiBuZXcgUHJvbWlzZSgocikgPT4gc2V0VGltZW91dChyLCBtcykpXG5cbiAgICAgICAgY29uc3QgcGFyc2VMb2NrRmlsZSA9ICgpID0+IHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhsb2NrUGF0aCwgJ3V0ZjgnKS50cmltKClcbiAgICAgICAgICAgICAgICBjb25zdCBbcGlkTGluZSwgdGltZXN0YW1wTGluZV0gPSBjb250ZW50LnNwbGl0KCdcXG4nKVxuICAgICAgICAgICAgICAgIGNvbnN0IHBpZCA9IE51bWJlci5wYXJzZUludChwaWRMaW5lLCAxMClcbiAgICAgICAgICAgICAgICBjb25zdCB0aW1lc3RhbXAgPSBOdW1iZXIucGFyc2VJbnQodGltZXN0YW1wTGluZSwgMTApXG4gICAgICAgICAgICAgICAgaWYgKCFOdW1iZXIuaXNGaW5pdGUocGlkKSB8fCAhTnVtYmVyLmlzRmluaXRlKHRpbWVzdGFtcCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgcGlkLCB0aW1lc3RhbXAgfVxuICAgICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGlzUHJvY2Vzc1J1bm5pbmcgPSAocGlkOiBudW1iZXIpID0+IHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgcHJvY2Vzcy5raWxsKHBpZCwgMClcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBhY3F1aXJlTG9jayA9IGFzeW5jIChcbiAgICAgICAgICAgIHRpbWVvdXRNcyA9IENMSV9MT0NLX1RJTUVPVVRfTVMsXG4gICAgICAgICAgICBwb2xsTXMgPSBDTElfTE9DS19QT0xMX01TLFxuICAgICAgICApOiBQcm9taXNlPCgoKSA9PiB2b2lkKSB8IHsgYWxyZWFkeUV4aXN0czogc3RyaW5nIH0+ID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gRGF0ZS5ub3coKVxuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnN0YW50LWNvbmRpdGlvbiAtLSBpbnRlbnRpb25hbCBwb2xsIGxvb3A7IGV4aXRzIHZpYSByZXR1cm4vdGhyb3cgYmVsb3dcbiAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZmQgPSBmcy5vcGVuU3luYyhsb2NrUGF0aCwgJ3d4JylcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZzLndyaXRlRmlsZVN5bmMoZmQsIGAke3Byb2Nlc3MucGlkfVxcbiR7RGF0ZS5ub3coKX1cXG5gKVxuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGludGVudGlvbmFsbHkgaWdub3JlIHdyaXRlIGVycm9yczsgdGhlIG9wZW4gZmQgc3RpbGwgaG9sZHNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBleGNsdXNpdmUgbG9jayBhbmQgd2lsbCBiZSBjbG9zZWQgaW4gY2xlYW51cFxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZzLmNsb3NlU3luYyhmZClcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZSBjbGVhbnVwIGVycm9yc1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcy51bmxpbmtTeW5jKGxvY2tQYXRoKVxuICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlIGNsZWFudXAgZXJyb3JzXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGVycm9yID0gZSBhcyB7IGNvZGU/OiBzdHJpbmcgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoZXJyb3IuY29kZSA9PT0gJ0VFWElTVCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxvY2tNZXRhID0gcGFyc2VMb2NrRmlsZSgpXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9ja01ldGEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsb2NrQWdlID0gRGF0ZS5ub3coKSAtIGxvY2tNZXRhLnRpbWVzdGFtcFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJ1bm5pbmcgPSBpc1Byb2Nlc3NSdW5uaW5nKGxvY2tNZXRhLnBpZClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXJ1bm5pbmcgfHwgbG9ja0FnZSA+IHRpbWVvdXRNcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIud2FybihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBTdGFsZSBDTEkgZG93bmxvYWQgbG9jayBkZXRlY3RlZCAocGlkPSR7bG9ja01ldGEucGlkfSwgYWdlPSR7bG9ja0FnZX1tcykuIFJlbW92aW5nIGxvY2suYCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnMudW5saW5rU3luYyhsb2NrUGF0aClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmUgY2xlYW51cCBlcnJvcnNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSB0YXJnZXQgYmluYXJ5IGFwcGVhcmVkIHdoaWxlIHdhaXRpbmdcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGV4aXN0aW5nQmluYXJ5ID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDTElVdGlscy5nZXRFeGlzdGluZ0NsaVBhdGgoY2xpRGlyKVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nQmluYXJ5ICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnMuZXhpc3RzU3luYyhleGlzdGluZ0JpbmFyeSkgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcy5zdGF0U3luYyhleGlzdGluZ0JpbmFyeSkuc2l6ZSA+IDAgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYXdhaXQgQ0xJVXRpbHMuaXNCaW5hcnlBdFZlcnNpb24oXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nQmluYXJ5LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRWZXJzaW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICkpXG4gICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBCaW5hcnkgdiR7dGFyZ2V0VmVyc2lvbn0gYXBwZWFyZWQgd2hpbGUgd2FpdGluZyBmb3IgbG9jazogJHtleGlzdGluZ0JpbmFyeX1gLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geyBhbHJlYWR5RXhpc3RzOiBleGlzdGluZ0JpbmFyeSB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoRGF0ZS5ub3coKSAtIHN0YXJ0ID4gdGltZW91dE1zKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgVGltZW91dCB3YWl0aW5nIGZvciBsb2NrOiAke2xvY2tQYXRofWAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgc2xlZXAocG9sbE1zKVxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY2xlYW51cFRlbXBvcmFyeURvd25sb2FkcyA9IChtYXhBZ2VNcyA9IENMSV9MT0NLX1RJTUVPVVRfTVMpID0+IHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKVxuICAgICAgICAgICAgICAgIC8vIE1hdGNoIGJvdGggZG93bmxvYWQgemlwcyAoZG93bmxvYWRlZF9maWxlXyouemlwKSBhbmQgb3JwaGFuIGV4dHJhY3RcbiAgICAgICAgICAgICAgICAvLyB0ZW1wIGZpbGVzICg8bmFtZT4udG1wLjxwaWQ+KSBsZWZ0IGJ5IGNyYXNoZWQgcGVlciB3b3JrZXJzLlxuICAgICAgICAgICAgICAgIGNvbnN0IHRtcEV4dHJhY3RSZSA9IC9cXC50bXBcXC5cXGQrJC9cbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGZzLnJlYWRkaXJTeW5jKGNsaURpcikpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaXNEb3dubG9hZFppcCA9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbnRyeS5zdGFydHNXaXRoKENMSV9ET1dOTE9BRF9UTVBfUFJFRklYKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgZW50cnkuZW5kc1dpdGgoQ0xJX0RPV05MT0FEX1RNUF9TVUZGSVgpXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGlzRXh0cmFjdFRtcCA9IHRtcEV4dHJhY3RSZS50ZXN0KGVudHJ5KVxuICAgICAgICAgICAgICAgICAgICBpZiAoIWlzRG93bmxvYWRaaXAgJiYgIWlzRXh0cmFjdFRtcCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGguam9pbihjbGlEaXIsIGVudHJ5KVxuICAgICAgICAgICAgICAgICAgICBsZXQgc3RhdHM6IGZzLlN0YXRzXG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdGF0cyA9IGZzLnN0YXRTeW5jKGZpbGVQYXRoKVxuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKG5vdyAtIHN0YXRzLm10aW1lTXMgPCBtYXhBZ2VNcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZnMudW5saW5rU3luYyhmaWxlUGF0aClcbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYEZhaWxlZCB0byBkZWxldGUgdGVtcCBDTEkgZmlsZSAke2ZpbGVQYXRofTogJHt1dGlsLmZvcm1hdChlcnIpfWAsXG4gICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoXG4gICAgICAgICAgICAgICAgICAgIGBGYWlsZWQgdG8gc2NhbiB0ZW1wIENMSSBmaWxlcyBpbiAke2NsaURpcn06ICR7dXRpbC5mb3JtYXQoZXJyKX1gLFxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIFBlcmZvcm1hbmNlVGVzdGVyLnN0YXJ0KFBlcmZvcm1hbmNlRXZlbnRzLlNES19DTElfRE9XTkxPQUQpXG4gICAgICAgIGxvZ2dlci5kZWJ1ZyhgRG93bmxvYWRpbmcgU0RLIGJpbmFyeSBmcm9tOiAke2JpbkRvd25sb2FkVXJsfWApXG5cbiAgICAgICAgbGV0IGRvd25sb2FkRW5kZWQgPSBmYWxzZVxuICAgICAgICBjb25zdCBlbmREb3dubG9hZCA9IChzdWNjZXNzID0gdHJ1ZSwgZXJyTXNnPzogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICBpZiAoZG93bmxvYWRFbmRlZCkge1xuICAgICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZG93bmxvYWRFbmRlZCA9IHRydWVcbiAgICAgICAgICAgIGlmIChzdWNjZXNzKSB7XG4gICAgICAgICAgICAgICAgUGVyZm9ybWFuY2VUZXN0ZXIuZW5kKFBlcmZvcm1hbmNlRXZlbnRzLlNES19DTElfRE9XTkxPQUQpXG4gICAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBQZXJmb3JtYW5jZVRlc3Rlci5lbmQoXG4gICAgICAgICAgICAgICAgUGVyZm9ybWFuY2VFdmVudHMuU0RLX0NMSV9ET1dOTE9BRCxcbiAgICAgICAgICAgICAgICBmYWxzZSxcbiAgICAgICAgICAgICAgICBlcnJNc2csXG4gICAgICAgICAgICApXG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcmVsZWFzZUxvY2s6ICgoKSA9PiB2b2lkKSB8IHVuZGVmaW5lZFxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgbG9ja1Jlc3VsdCA9IGF3YWl0IGFjcXVpcmVMb2NrKClcblxuICAgICAgICAgICAgLy8gQ2hlY2sgaWYgYmluYXJ5IGFscmVhZHkgZXhpc3RzIChhbm90aGVyIHByb2Nlc3MgZG93bmxvYWRlZCBpdClcbiAgICAgICAgICAgIGlmICh0eXBlb2YgbG9ja1Jlc3VsdCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgIGVuZERvd25sb2FkKClcbiAgICAgICAgICAgICAgICByZXR1cm4gbG9ja1Jlc3VsdC5hbHJlYWR5RXhpc3RzXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJlbGVhc2VMb2NrID0gbG9ja1Jlc3VsdFxuXG4gICAgICAgICAgICAvLyBSZS1jaGVjayBhZnRlciBhY3F1aXJpbmcgbG9jay4gT25seSBhIGJpbmFyeSBhbHJlYWR5IGF0IHRoZSB0YXJnZXRcbiAgICAgICAgICAgIC8vIHZlcnNpb24gbWVhbnMgYSBwZWVyIHdvbiB0aGUgcmFjZTsgYW55IG90aGVyIGJpbmFyeSBoZXJlIGlzIHRoZVxuICAgICAgICAgICAgLy8gc3RhbGUgb25lIHdlIHdlcmUgc2VudCB0byByZXBsYWNlLCBzbyBpdCBtdXN0IG5vdCBzaG9ydC1jaXJjdWl0XG4gICAgICAgICAgICAvLyB0aGUgZG93bmxvYWQuXG4gICAgICAgICAgICBjb25zdCBleGlzdGluZ0JpbmFyeSA9IENMSVV0aWxzLmdldEV4aXN0aW5nQ2xpUGF0aChjbGlEaXIpXG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgZXhpc3RpbmdCaW5hcnkgJiZcbiAgICAgICAgICAgICAgICBmcy5leGlzdHNTeW5jKGV4aXN0aW5nQmluYXJ5KSAmJlxuICAgICAgICAgICAgICAgIGZzLnN0YXRTeW5jKGV4aXN0aW5nQmluYXJ5KS5zaXplID4gMCAmJlxuICAgICAgICAgICAgICAgIChhd2FpdCBDTElVdGlscy5pc0JpbmFyeUF0VmVyc2lvbihleGlzdGluZ0JpbmFyeSwgdGFyZ2V0VmVyc2lvbikpXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoXG4gICAgICAgICAgICAgICAgICAgIGBCaW5hcnkgYWxyZWFkeSBhdCB2JHt0YXJnZXRWZXJzaW9ufSBhZnRlciBhY3F1aXJpbmcgbG9jazogJHtleGlzdGluZ0JpbmFyeX1gLFxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICBlbmREb3dubG9hZCgpXG4gICAgICAgICAgICAgICAgcmVsZWFzZUxvY2soKVxuICAgICAgICAgICAgICAgIHJldHVybiBleGlzdGluZ0JpbmFyeVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjbGVhbnVwVGVtcG9yYXJ5RG93bmxvYWRzKClcblxuICAgICAgICAgICAgY29uc3QgemlwRmlsZVBhdGggPSBwYXRoLmpvaW4oXG4gICAgICAgICAgICAgICAgY2xpRGlyLFxuICAgICAgICAgICAgICAgIGAke0NMSV9ET1dOTE9BRF9UTVBfUFJFRklYfSR7cHJvY2Vzcy5waWR9XyR7RGF0ZS5ub3coKX0ke0NMSV9ET1dOTE9BRF9UTVBfU1VGRklYfWAsXG4gICAgICAgICAgICApXG4gICAgICAgICAgICBjb25zdCBkb3dubG9hZGVkRmlsZVN0cmVhbSA9IGZzLmNyZWF0ZVdyaXRlU3RyZWFtKHppcEZpbGVQYXRoKVxuXG4gICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2U8c3RyaW5nIHwgbnVsbD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgICAgIC8vIFJlZ2lzdGVyZWQgYmVmb3JlIHRoZSBmaXJzdCBhd2FpdDogY3JlYXRlV3JpdGVTdHJlYW0gb3BlbnNcbiAgICAgICAgICAgICAgICAvLyBhc3luY2hyb25vdXNseSwgc28gYW4gZXJyb3IgY2FuIGxhbmQgYmVmb3JlIHByb2Nlc3NEb3dubG9hZFxuICAgICAgICAgICAgICAgIC8vIGdldHMgZmFyIGVub3VnaCB0byBhdHRhY2ggaXRzIG93biBoYW5kbGVyIFx1MjAxNCB3aXRoIG5vIGxpc3RlbmVyXG4gICAgICAgICAgICAgICAgLy8gdGhhdCBiZWNvbWVzIGFuIHVuY2F1Z2h0IGV4Y2VwdGlvbiBpbiB0aGUgdXNlcidzIHRlc3QgcHJvY2Vzcy5cbiAgICAgICAgICAgICAgICBkb3dubG9hZGVkRmlsZVN0cmVhbS5vbignZXJyb3InLCBmdW5jdGlvbiAoZXJyOiBFcnJvcikge1xuICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICBgR290IEVycm9yIHdoaWxlIGRvd25sb2FkaW5nIGNsaSBiaW5hcnkgZmlsZTogJHtlcnJ9YCxcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICBlbmREb3dubG9hZChmYWxzZSwgdXRpbC5mb3JtYXQoZXJyKSlcbiAgICAgICAgICAgICAgICAgICAgcmVsZWFzZUxvY2s/LigpXG4gICAgICAgICAgICAgICAgICAgIHJlamVjdChlcnIpXG4gICAgICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgICAgIGNvbnN0IHByb2Nlc3NEb3dubG9hZCA9IGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYWJvcnRDb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRpbWVvdXQgPSBzZXRUaW1lb3V0KFxuICAgICAgICAgICAgICAgICAgICAgICAgKCkgPT4gYWJvcnRDb250cm9sbGVyLmFib3J0KCksXG4gICAgICAgICAgICAgICAgICAgICAgICBDTElfRE9XTkxPQURfVElNRU9VVF9NUyxcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICBsZXQgcmVzcG9uc2U6IFJlc3BvbnNlXG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZSA9IGF3YWl0IGZldGNoKGJpbkRvd25sb2FkVXJsLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lnbmFsOiBhYm9ydENvbnRyb2xsZXIuc2lnbmFsLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0KVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmICghcmVzcG9uc2UuYm9keSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyByZXNwb25zZSBib2R5IHJlY2VpdmVkJylcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhcnJheUJ1ZmZlciA9IGF3YWl0IHJlc3BvbnNlLmFycmF5QnVmZmVyKClcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5vZGVTdHJlYW0gPSBSZWFkYWJsZS5mcm9tKFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgVWludDhBcnJheShhcnJheUJ1ZmZlciksXG4gICAgICAgICAgICAgICAgICAgICAgICBdKVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBub2RlU3RyZWFtLnBpcGUoZG93bmxvYWRlZEZpbGVTdHJlYW0pXG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNldCB1cCB0aGUgZG93bmxvYWRGaWxlU3RyZWFtIGhhbmRsZXIgYmVmb3JlIHBpcGVsaW5lXG4gICAgICAgICAgICAgICAgICAgICAgICBDTElVdGlscy5kb3dubG9hZEZpbGVTdHJlYW0oXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZG93bmxvYWRlZEZpbGVTdHJlYW0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgemlwRmlsZVBhdGgsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpRGlyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChyZXN1bHQ6IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmREb3dubG9hZCgpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbGVhc2VMb2NrPy4oKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHJlc3VsdClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChlcnI/OiBFcnJvcikgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmREb3dubG9hZChmYWxzZSwgdXRpbC5mb3JtYXQoZXJyKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsZWFzZUxvY2s/LigpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChlcnIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYEdvdCBFcnJvciBpbiBjbGkgYmluYXJ5IGRvd25sb2FkaW5nIHJlcXVlc3QgJHt1dGlsLmZvcm1hdChlcnIpfWAsXG4gICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICBlbmREb3dubG9hZChmYWxzZSwgdXRpbC5mb3JtYXQoZXJyKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlbGVhc2VMb2NrPy4oKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGVyciBhcyBFcnJvcilcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIEEgcmVqZWN0aW9uIGJlZm9yZSB0aGUgc3RyZWFtIGhhbmRsZXJzIGFyZSB3aXJlZCAoZS5nLiBmZXRjaFxuICAgICAgICAgICAgICAgIC8vIGl0c2VsZiBmYWlsaW5nKSB3b3VsZCBvdGhlcndpc2UgbGVhdmUgdGhpcyBwcm9taXNlIHBlbmRpbmdcbiAgICAgICAgICAgICAgICAvLyBmb3JldmVyIGFuZCBoYW5nIHRoZSBsYXVuY2hlci5cbiAgICAgICAgICAgICAgICBwcm9jZXNzRG93bmxvYWQoKS5jYXRjaCgoZXJyOiBFcnJvcikgPT4ge1xuICAgICAgICAgICAgICAgICAgICAvLyBOb3RoaW5nIGlzIHBpcGVkIGludG8gdGhlIHN0cmVhbSBvbiB0aGlzIHBhdGgsIHNvIGNsb3NlIGl0XG4gICAgICAgICAgICAgICAgICAgIC8vIGV4cGxpY2l0bHkgXHUyMDE0IG90aGVyd2lzZSB0aGUgZmQgYW5kIHRoZSB0ZW1wIHppcCBib3RoIGxlYWsuXG4gICAgICAgICAgICAgICAgICAgIGRvd25sb2FkZWRGaWxlU3RyZWFtLmRlc3Ryb3koKVxuICAgICAgICAgICAgICAgICAgICBlbmREb3dubG9hZChmYWxzZSwgdXRpbC5mb3JtYXQoZXJyKSlcbiAgICAgICAgICAgICAgICAgICAgcmVsZWFzZUxvY2s/LigpXG4gICAgICAgICAgICAgICAgICAgIHJlamVjdChlcnIpXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgcmVsZWFzZUxvY2s/LigpXG4gICAgICAgICAgICBlbmREb3dubG9hZChmYWxzZSwgdXRpbC5mb3JtYXQoZXJyKSlcbiAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgICAgICAgICBgRmFpbGVkIHRvIGRvd25sb2FkIGJpbmFyeSwgRXhjZXB0aW9uOiAke3V0aWwuZm9ybWF0KGVycil9YCxcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIHJldHVybiBudWxsXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzdGF0aWMgZG93bmxvYWRGaWxlU3RyZWFtKFxuICAgICAgICBkb3dubG9hZGVkRmlsZVN0cmVhbTogZnMuV3JpdGVTdHJlYW0sXG4gICAgICAgIHppcEZpbGVQYXRoOiBzdHJpbmcsXG4gICAgICAgIGNsaURpcjogc3RyaW5nLFxuICAgICAgICByZXNvbHZlOiAocGF0aDogc3RyaW5nKSA9PiB2b2lkLFxuICAgICAgICByZWplY3Q6IChyZWFzb24/OiBFcnJvcikgPT4gdm9pZCxcbiAgICApIHtcbiAgICAgICAgZG93bmxvYWRlZEZpbGVTdHJlYW0ub24oJ2Nsb3NlJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgY29uc3QgeWF1emxPcGVuUHJvbWlzZSA9IHByb21pc2lmeSh5YXV6bC5vcGVuKSBhcyAoXG4gICAgICAgICAgICAgICAgcGF0aDogc3RyaW5nLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IHlhdXpsT3B0aW9ucyxcbiAgICAgICAgICAgICkgPT4gUHJvbWlzZTxaaXBGaWxlPlxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBjb25zdCB6aXBmaWxlID0gYXdhaXQgeWF1emxPcGVuUHJvbWlzZSh6aXBGaWxlUGF0aCwge1xuICAgICAgICAgICAgICAgICAgICBsYXp5RW50cmllczogdHJ1ZSxcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIGxldCByZXNvbHZlZEJpbmFyeVBhdGg6IHN0cmluZyB8IG51bGwgPSBudWxsXG5cbiAgICAgICAgICAgICAgICB6aXBmaWxlLnJlYWRFbnRyeSgpXG4gICAgICAgICAgICAgICAgemlwZmlsZS5vbignZW50cnknLCBhc3luYyAoZW50cnkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKC9cXC8kLy50ZXN0KGVudHJ5LmZpbGVOYW1lKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgemlwZmlsZS5yZWFkRW50cnkoKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAvLyBaaXAtc2xpcCBndWFyZDogcmVqZWN0IGVudHJpZXMgd2hvc2UgcmVzb2x2ZWQgcGF0aCBlc2NhcGVzIGNsaURpclxuICAgICAgICAgICAgICAgICAgICAvLyAoQlJPV1NFUlNUQUNLX0JJTkFSWV9VUkwgbGV0cyB1c2VycyBzdXBwbHkgYXJiaXRyYXJ5IHppcHMpLlxuICAgICAgICAgICAgICAgICAgICBjb25zdCBjYW5kaWRhdGVQYXRoID0gcGF0aC5qb2luKGNsaURpciwgZW50cnkuZmlsZU5hbWUpXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc29sdmVkQ2FuZGlkYXRlID0gcGF0aC5yZXNvbHZlKGNhbmRpZGF0ZVBhdGgpXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc29sdmVkRGlyID0gcGF0aC5yZXNvbHZlKGNsaURpcikgKyBwYXRoLnNlcFxuICAgICAgICAgICAgICAgICAgICBpZiAoIXJlc29sdmVkQ2FuZGlkYXRlLnN0YXJ0c1dpdGgocmVzb2x2ZWREaXIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB6aXBmaWxlLmNsb3NlKClcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoYFppcC1zbGlwIGRldGVjdGVkOiBlbnRyeSBcIiR7ZW50cnkuZmlsZU5hbWV9XCIgcmVzb2x2ZXMgb3V0c2lkZSAke2NsaURpcn1gKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaXNCaW5hcnlFbnRyeSA9IHBhdGguYmFzZW5hbWUoZW50cnkuZmlsZU5hbWUpLnN0YXJ0c1dpdGgoJ2JpbmFyeS0nKVxuXG4gICAgICAgICAgICAgICAgICAgIGlmICghaXNCaW5hcnlFbnRyeSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZGlyZWN0U3RyZWFtID0gZnMuY3JlYXRlV3JpdGVTdHJlYW0oY2FuZGlkYXRlUGF0aClcbiAgICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdFN0cmVhbS5vbignZXJyb3InLCAod3JpdGVFcnIpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB6aXBmaWxlLmNsb3NlKClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWplY3Qod3JpdGVFcnIgYXMgRXJyb3IpXG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgb3BlblJlYWRTdHJlYW1Qcm9taXNlID0gcHJvbWlzaWZ5KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHppcGZpbGUub3BlblJlYWRTdHJlYW0sXG4gICAgICAgICAgICAgICAgICAgICAgICApLmJpbmQoemlwZmlsZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVhZFN0cmVhbSA9IGF3YWl0IG9wZW5SZWFkU3RyZWFtUHJvbWlzZShlbnRyeSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkU3RyZWFtLm9uKCdlbmQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdFN0cmVhbS5lbmQoKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3RTdHJlYW0ub24oJ2Nsb3NlJywgKCkgPT4gemlwZmlsZS5yZWFkRW50cnkoKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRTdHJlYW0ucGlwZShkaXJlY3RTdHJlYW0pXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoICh6aXBFcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB6aXBmaWxlLmNsb3NlKClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWplY3QoemlwRXJyIGFzIEVycm9yKVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAvLyBCaW5hcnkgZW50cnk6IGV4dHJhY3QgdG8gUElELXNjb3BlZCB0ZW1wIGZpbGUsIGNobW9kLCBhdG9taWMgcmVuYW1lIGlubGluZS5cbiAgICAgICAgICAgICAgICAgICAgLy8gUHJldmVudHMgRVRYVEJTWS9FQlVTWTogdGhlIGZpbGUgYmVpbmcgZXhlY3V0ZWQgaXMgbmV2ZXIgdGhlIGZpbGUgYmVpbmcgd3JpdHRlbi5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZmluYWxQYXRoID0gY2FuZGlkYXRlUGF0aFxuICAgICAgICAgICAgICAgICAgICBjb25zdCB0ZW1wUGF0aCA9IHBhdGguam9pbihjbGlEaXIsIGAke2VudHJ5LmZpbGVOYW1lfS50bXAuJHtwcm9jZXNzLnBpZH1gKVxuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHdyaXRlU3RyZWFtID0gZnMuY3JlYXRlV3JpdGVTdHJlYW0odGVtcFBhdGgpXG5cbiAgICAgICAgICAgICAgICAgICAgbGV0IHdyaXRlU3RyZWFtRXJyb3JlZCA9IGZhbHNlXG4gICAgICAgICAgICAgICAgICAgIHdyaXRlU3RyZWFtLm9uKCdlcnJvcicsICh3cml0ZUVycikgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVTdHJlYW1FcnJvcmVkID0gdHJ1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgZnNwLnVubGluayh0ZW1wUGF0aCkuY2F0Y2goKCkgPT4ge30pXG4gICAgICAgICAgICAgICAgICAgICAgICB6aXBmaWxlLmNsb3NlKClcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdCh3cml0ZUVyciBhcyBFcnJvcilcbiAgICAgICAgICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgICAgICAgICAvLyAnY2xvc2UnIGZpcmVzIGFmdGVyIHRoZSBmZCBpcyBjbG9zZWQ7IHNhZmUgZm9yIGZzcC5yZW5hbWUgb24gV2luZG93cyAod2hlcmUgJ2ZpbmlzaCcgbWF5IGZpcmUgYmVmb3JlIGZkIHJlbGVhc2UpLlxuICAgICAgICAgICAgICAgICAgICAvLyBhdXRvQ2xvc2U9dHJ1ZSBhbHNvIG1ha2VzICdjbG9zZScgZmlyZSBhZnRlciAnZXJyb3InIFx1MjAxNCBiYWlsIG91dCBpZiB0aGUgZXJyb3IgcGF0aCBhbHJlYWR5IHJlamVjdGVkLlxuICAgICAgICAgICAgICAgICAgICB3cml0ZVN0cmVhbS5vbignY2xvc2UnLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAod3JpdGVTdHJlYW1FcnJvcmVkKSB7IHJldHVybiB9XG4gICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGZzcC5jaG1vZCh0ZW1wUGF0aCwgJzA3NTUnKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGZzcC5yZW5hbWUodGVtcFBhdGgsIGZpbmFsUGF0aClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHJlbmFtZUVycjogYW55KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5hcnJvdyBmYWxsYmFjayB0byBjcm9zcy1kZXZpY2UgKEVYREVWKSBvbmx5XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZW5hbWVFcnIuY29kZSAhPT0gJ0VYREVWJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgcmVuYW1lRXJyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLndhcm4oYEF0b21pYyByZW5hbWUgZmFpbGVkIChjcm9zcy1kZXZpY2UpLCBmYWxsaW5nIGJhY2sgdG8gY29weTogJHtyZW5hbWVFcnIubWVzc2FnZX1gKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBmc3AuY29weUZpbGUodGVtcFBhdGgsIGZpbmFsUGF0aClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgZnNwLnVubGluayh0ZW1wUGF0aCkuY2F0Y2goKCkgPT4ge30pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcmVzb2x2ZWRCaW5hcnlQYXRoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmVkQmluYXJ5UGF0aCA9IGZpbmFsUGF0aFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB6aXBmaWxlLnJlYWRFbnRyeSgpXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBmc3AudW5saW5rKHRlbXBQYXRoKS5jYXRjaCgoKSA9PiB7fSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB6aXBmaWxlLmNsb3NlKClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWplY3QoZXJyIGFzIEVycm9yKVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG9wZW5SZWFkU3RyZWFtUHJvbWlzZSA9IHByb21pc2lmeShcbiAgICAgICAgICAgICAgICAgICAgICAgIHppcGZpbGUub3BlblJlYWRTdHJlYW0sXG4gICAgICAgICAgICAgICAgICAgICkuYmluZCh6aXBmaWxlKVxuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVhZFN0cmVhbSA9IGF3YWl0IG9wZW5SZWFkU3RyZWFtUHJvbWlzZShlbnRyeSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRTdHJlYW0ub24oJ2VuZCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZVN0cmVhbS5lbmQoKVxuICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRTdHJlYW0ucGlwZSh3cml0ZVN0cmVhbSlcbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoemlwRXJyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmc3AudW5saW5rKHRlbXBQYXRoKS5jYXRjaCgoKSA9PiB7fSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHppcGZpbGUuY2xvc2UoKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KHppcEVyciBhcyBFcnJvcilcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgICAgICB6aXBmaWxlLm9uKCdlcnJvcicsICh6aXBFcnIpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KHppcEVyciBhcyBFcnJvcilcbiAgICAgICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICAgICAgemlwZmlsZS5vbmNlKCdlbmQnLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGZzcC51bmxpbmsoemlwRmlsZVBhdGgpLmNhdGNoKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuKGBGYWlsZWQgdG8gZGVsZXRlIHppcCBmaWxlOiAke3ppcEZpbGVQYXRofWApXG4gICAgICAgICAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFyZXNvbHZlZEJpbmFyeVBhdGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHppcGZpbGUuY2xvc2UoKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcignTm8gYmluYXJ5LSogZW50cnkgZm91bmQgaW4gemlwOyBjYW5ub3QgY29tcGxldGUgQ0xJIGJpbmFyeSBleHRyYWN0aW9uJykpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB6aXBmaWxlLmNsb3NlKClcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShyZXNvbHZlZEJpbmFyeVBhdGgpXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgIHJlamVjdChlcnIgYXMgRXJyb3IpXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgfVxuXG4gICAgc3RhdGljIGdldFRlc3RGcmFtZXdvcmtEZXRhaWwoKSB7XG4gICAgICAgIGlmIChwcm9jZXNzLmVudi5CUk9XU0VSU1RBQ0tfVEVTVF9GUkFNRVdPUktfREVUQUlMKSB7XG4gICAgICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShwcm9jZXNzLmVudi5CUk9XU0VSU1RBQ0tfVEVTVF9GUkFNRVdPUktfREVUQUlMKVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLnRlc3RGcmFtZXdvcmtEZXRhaWxcbiAgICB9XG5cbiAgICBzdGF0aWMgZ2V0QXV0b21hdGlvbkZyYW1ld29ya0RldGFpbCgpIHtcbiAgICAgICAgaWYgKHByb2Nlc3MuZW52LkJST1dTRVJTVEFDS19BVVRPTUFUSU9OX0ZSQU1FV09SS19ERVRBSUwpIHtcbiAgICAgICAgICAgIHJldHVybiBKU09OLnBhcnNlKFxuICAgICAgICAgICAgICAgIHByb2Nlc3MuZW52LkJST1dTRVJTVEFDS19BVVRPTUFUSU9OX0ZSQU1FV09SS19ERVRBSUwsXG4gICAgICAgICAgICApXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuYXV0b21hdGlvbkZyYW1ld29ya0RldGFpbFxuICAgIH1cblxuICAgIHN0YXRpYyBzZXRGcmFtZXdvcmtEZXRhaWwoXG4gICAgICAgIHRlc3RGcmFtZXdvcms6IHN0cmluZyxcbiAgICAgICAgYXV0b21hdGlvbkZyYW1ld29yazogc3RyaW5nLFxuICAgICkge1xuICAgICAgICBpZiAoIXRlc3RGcmFtZXdvcmsgfHwgIWF1dG9tYXRpb25GcmFtZXdvcmspIHtcbiAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgICAgICAgICBgVGVzdCBvciBBdXRvbWF0aW9uIGZyYW1ld29yayBub3QgcHJvdmlkZWQgdGVzdEZyYW1ld29yaz0ke3Rlc3RGcmFtZXdvcmt9LCBhdXRvbWF0aW9uRnJhbWV3b3JrPSR7YXV0b21hdGlvbkZyYW1ld29ya31gLFxuICAgICAgICAgICAgKVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy50ZXN0RnJhbWV3b3JrRGV0YWlsID0ge1xuICAgICAgICAgICAgbmFtZTogdGVzdEZyYW1ld29yayxcbiAgICAgICAgICAgIHZlcnNpb246IHsgW3Rlc3RGcmFtZXdvcmtdOiBDTElVdGlscy5nZXRTZGtWZXJzaW9uKCkgfSxcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuYXV0b21hdGlvbkZyYW1ld29ya0RldGFpbCA9IHtcbiAgICAgICAgICAgIG5hbWU6IGF1dG9tYXRpb25GcmFtZXdvcmssXG4gICAgICAgICAgICB2ZXJzaW9uOiB7IFthdXRvbWF0aW9uRnJhbWV3b3JrXTogQ0xJVXRpbHMuZ2V0U2RrVmVyc2lvbigpIH0sXG4gICAgICAgIH1cblxuICAgICAgICBwcm9jZXNzLmVudi5CUk9XU0VSU1RBQ0tfQVVUT01BVElPTl9GUkFNRVdPUktfREVUQUlMID0gSlNPTi5zdHJpbmdpZnkoXG4gICAgICAgICAgICB0aGlzLmF1dG9tYXRpb25GcmFtZXdvcmtEZXRhaWwsXG4gICAgICAgIClcbiAgICAgICAgcHJvY2Vzcy5lbnYuQlJPV1NFUlNUQUNLX1RFU1RfRlJBTUVXT1JLX0RFVEFJTCA9IEpTT04uc3RyaW5naWZ5KFxuICAgICAgICAgICAgdGhpcy50ZXN0RnJhbWV3b3JrRGV0YWlsLFxuICAgICAgICApXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBjdXJyZW50IGluc3RhbmNlIG5hbWUgdXNpbmcgdGhyZWFkIGlkIGFuZCBwcm9jZXNzSWRcbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXRDdXJyZW50SW5zdGFuY2VOYW1lKCkge1xuICAgICAgICByZXR1cm4gYCR7cHJvY2Vzcy5waWR9OiR7dGhyZWFkSWR9YFxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdlbmVyYXRlIGEgdW5pcXVlIGNsaWVudCB3b3JrZXIgaWRlbnRpZmllciBjb21iaW5pbmcgdGhyZWFkIElEIGFuZCBwcm9jZXNzIElELlxuICAgICAqIFRoaXMgaWRlbnRpZmllciBpcyB1c2VkIHRvIHRyYWNrIHdvcmtlci1zcGVjaWZpYyBldmVudHMgYW5kIHBlcmZvcm1hbmNlIG1ldHJpY3NcbiAgICAgKiBhY3Jvc3MgZGlzdHJpYnV0ZWQgdGVzdCBleGVjdXRpb24uIEZvcm1hdCBtYXRjaGVzIHRoZSBQeXRob24gU0RLIGltcGxlbWVudGF0aW9uXG4gICAgICogZm9yIGNvbnNpc3RlbmN5IGFjcm9zcyBTREtzLlxuICAgICAqXG4gICAgICogRm9ybWF0OiBcInRocmVhZElkLXByb2Nlc3NJZFwiXG4gICAgICpcbiAgICAgKiBAcGFyYW0gY29udGV4dCAtIE9wdGlvbmFsIGV4ZWN1dGlvbiBjb250ZXh0IHdpdGggdGhyZWFkSWQgYW5kIHByb2Nlc3NJZFxuICAgICAqIEByZXR1cm5zIFdvcmtlciBJRCBzdHJpbmcgaW4gZm9ybWF0IFwidGhyZWFkSWQtcHJvY2Vzc0lkXCJcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGNvbnN0IHdvcmtlcklkID0gQ0xJVXRpbHMuZ2V0Q2xpZW50V29ya2VySWQoKSAvLyBSZXR1cm5zIFwiMS0xMjM0NVwiXG4gICAgICogY29uc3Qgd29ya2VySWQgPSBDTElVdGlscy5nZXRDbGllbnRXb3JrZXJJZCh7IHRocmVhZElkOiAxMjMsIHByb2Nlc3NJZDogNDU2IH0pIC8vIFJldHVybnMgXCIxMjMtNDU2XCJcbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0Q2xpZW50V29ya2VySWQoY29udGV4dD86IHsgdGhyZWFkSWQ/OiBzdHJpbmcgfCBudW1iZXI7IHByb2Nlc3NJZD86IHN0cmluZyB8IG51bWJlciB9KTogc3RyaW5nIHtcbiAgICAgICAgY29uc3Qgd29ya2VyVGhyZWFkSWQgPSBjb250ZXh0Py50aHJlYWRJZD8udG9TdHJpbmcoKSB8fCB0aHJlYWRJZC50b1N0cmluZygpXG4gICAgICAgIGNvbnN0IHdvcmtlclByb2Nlc3NJZCA9IGNvbnRleHQ/LnByb2Nlc3NJZD8udG9TdHJpbmcoKSB8fCBwcm9jZXNzLnBpZC50b1N0cmluZygpXG4gICAgICAgIHJldHVybiBgJHt3b3JrZXJUaHJlYWRJZH0tJHt3b3JrZXJQcm9jZXNzSWR9YFxuICAgIH1cblxuICAgIC8qKlxuICAgICAqXG4gICAgICogQHBhcmFtIHtUZXN0RnJhbWV3b3JrU3RhdGUgfCBBdXRvbWF0aW9uRnJhbWV3b3JrU3RhdGV9IGZyYW1ld29ya1N0YXRlXG4gICAgICogQHBhcmFtIHtIb29rU3RhdGV9IGhvb2tTdGF0ZVxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldEhvb2tSZWdpc3RyeUtleShmcmFtZXdvcmtTdGF0ZTogU3RhdGUsIGhvb2tTdGF0ZTogU3RhdGUpIHtcbiAgICAgICAgcmV0dXJuIGAke2ZyYW1ld29ya1N0YXRlfToke2hvb2tTdGF0ZX1gXG4gICAgfVxuXG4gICAgc3RhdGljIG1hdGNoSG9va1JlZ2V4KGhvb2tTdGF0ZTogc3RyaW5nKSB7XG4gICAgICAgIGNvbnN0IHBhdHRlcm4gPSBuZXcgUmVnRXhwKFRlc3RGcmFtZXdvcmtDb25zdGFudHMuSE9PS19SRUdFWClcblxuICAgICAgICByZXR1cm4gcGF0dGVybi50ZXN0KGhvb2tTdGF0ZSlcbiAgICB9XG5cbiAgICBzdGF0aWMgZ2V0T2JzZXJ2YWJpbGl0eUJ1aWxkVGFncyhcbiAgICAgICAgb2JzZXJ2YWJpbGl0eU9wdGlvbnM6IFRlc3RPYnNlcnZhYmlsaXR5T3B0aW9ucyxcbiAgICAgICAgYnN0YWNrQnVpbGRUYWc/OiBzdHJpbmcsXG4gICAgKSB7XG4gICAgICAgIGlmIChwcm9jZXNzLmVudi5URVNUX09CU0VSVkFCSUxJVFlfQlVJTERfVEFHKSB7XG4gICAgICAgICAgICByZXR1cm4gcHJvY2Vzcy5lbnYuVEVTVF9PQlNFUlZBQklMSVRZX0JVSUxEX1RBRy5zcGxpdCgnLCcpXG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9ic2VydmFiaWxpdHlPcHRpb25zLmJ1aWxkVGFnKSB7XG4gICAgICAgICAgICByZXR1cm4gb2JzZXJ2YWJpbGl0eU9wdGlvbnMuYnVpbGRUYWdcbiAgICAgICAgfVxuICAgICAgICBpZiAoYnN0YWNrQnVpbGRUYWcpIHtcbiAgICAgICAgICAgIHJldHVybiBbYnN0YWNrQnVpbGRUYWddXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFtdXG4gICAgfVxuXG4gICAgc3RhdGljIGNoZWNrQ0xJU3VwcG9ydGVkRnJhbWV3b3JrcyhmcmFtZXdvcms6IHN0cmluZyB8IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAoZnJhbWV3b3JrID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLkNMSVN1cHBvcnRlZEZyYW1ld29ya3MuaW5jbHVkZXMoZnJhbWV3b3JrKVxuICAgIH1cbn1cbiIsICJpbXBvcnQgeyBmZXRjaCBhcyB1bmRpY2lGZXRjaCwgdHlwZSBSZXF1ZXN0SW5pdCBhcyBVbmRpY2lSZXF1ZXN0SW5pdCwgUHJveHlBZ2VudCB9IGZyb20gJ3VuZGljaSdcblxuZXhwb3J0IGNsYXNzIFJlc3BvbnNlRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gICAgcHVibGljIHJlc3BvbnNlOiBSZXNwb25zZVxuICAgIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZywgcmVzOiBSZXNwb25zZSkge1xuICAgICAgICBzdXBlcihtZXNzYWdlKVxuICAgICAgICB0aGlzLnJlc3BvbnNlID0gcmVzXG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBhc3luYyBmdW5jdGlvbiBmZXRjaFdyYXAoaW5wdXQ6IFJlcXVlc3RJbmZvIHwgVVJMLCBpbml0PzogUmVxdWVzdEluaXQpIHtcbiAgICBjb25zdCByZXMgPSBhd2FpdCBfZmV0Y2goaW5wdXQsIGluaXQpXG4gICAgaWYgKCFyZXMub2spIHtcbiAgICAgICAgdGhyb3cgbmV3IFJlc3BvbnNlRXJyb3IoYEVycm9yIHJlc3BvbnNlIGZyb20gc2VydmVyICR7cmVzLnN0YXR1c306ICAke2F3YWl0IHJlcy50ZXh0KCl9YCwgcmVzKVxuICAgIH1cbiAgICByZXR1cm4gcmVzXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfZmV0Y2goaW5wdXQ6IFJlcXVlc3RJbmZvIHwgVVJMLCBpbml0PzogUmVxdWVzdEluaXQpIHtcbiAgICBjb25zdCBwcm94eVVybCA9IHByb2Nlc3MuZW52LkhUVFBfUFJPWFkgfHwgcHJvY2Vzcy5lbnYuSFRUUFNfUFJPWFlcbiAgICBpZiAocHJveHlVcmwpIHtcbiAgICAgICAgY29uc3Qgbm9Qcm94eSA9IHByb2Nlc3MuZW52Lk5PX1BST1hZICYmIHByb2Nlc3MuZW52Lk5PX1BST1hZLnRyaW0oKVxuICAgICAgICAgICAgPyBwcm9jZXNzLmVudi5OT19QUk9YWS50cmltKCkuc3BsaXQoL1tcXHMsO10rLylcbiAgICAgICAgICAgIDogW11cbiAgICAgICAgY29uc3QgcmVxdWVzdCA9IG5ldyBSZXF1ZXN0KGlucHV0KVxuICAgICAgICBjb25zdCB1cmwgPSBuZXcgVVJMKHJlcXVlc3QudXJsKVxuICAgICAgICBpZiAoIW5vUHJveHkuc29tZSgoc3RyKSA9PiB1cmwuaG9zdG5hbWUuZW5kc1dpdGgoc3RyKSkpIHtcbiAgICAgICAgICAgIHJldHVybiB1bmRpY2lGZXRjaChcbiAgICAgICAgICAgICAgICByZXF1ZXN0LnVybCxcbiAgICAgICAgICAgICAgICB7IC4uLihpbml0IGFzIFVuZGljaVJlcXVlc3RJbml0KSwgZGlzcGF0Y2hlcjogbmV3IFByb3h5QWdlbnQocHJveHlVcmwpIH0sXG4gICAgICAgICAgICApIGFzIHVua25vd24gYXMgUHJvbWlzZTxSZXNwb25zZT5cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmV0Y2goaW5wdXQsIGluaXQpXG59XG4iLCAiZXhwb3J0IGNvbnN0IEVWRU5UUyA9IHtcbiAgICBTREtfU0VUVVA6ICdzZGs6c2V0dXAnLFxuICAgIFNES19DTEVBTlVQOiAnc2RrOmNsZWFudXAnLFxuICAgIFNES19QUkVfVEVTVDogJ3NkazpwcmUtdGVzdCcsXG4gICAgU0RLX1RFU1Q6ICdzZGs6dGVzdCcsXG4gICAgU0RLX1BPU1RfVEVTVDogJ3Nkazpwb3N0LXRlc3QnLFxuICAgIFNES19IT09LOiAnc2RrOmhvb2snLFxuICAgIFNES19EUklWRVI6ICdzZGs6ZHJpdmVyJyxcbiAgICBTREtfQTExWTogJ3NkazphMTF5JyxcbiAgICBTREtfTzExWTogJ3NkazpvMTF5JyxcbiAgICBTREtfQVVUT19DQVBUVVJFOiAnc2RrOmF1dG8tY2FwdHVyZScsXG4gICAgU0RLX1BST1hZX1NFVFVQOiAnc2RrOnByb3h5LXNldHVwJyxcbiAgICBTREtfVEVTVEhVQjogJ3Nkazp0ZXN0aHViJyxcbiAgICBTREtfQVVUT01BVEU6ICdzZGs6YXV0b21hdGUnLFxuICAgIFNES19BUFBfQVVUT01BVEU6ICdzZGs6YXBwLWF1dG9tYXRlJyxcbiAgICBTREtfVFVSQk9TQ0FMRTogJ3Nkazp0dXJib3NjYWxlJyxcbiAgICBTREtfUEVSQ1k6ICdzZGs6cGVyY3knLFxuICAgIFNES19QUkVfSU5JVElBTElaRTogJ3Nkazpkcml2ZXI6cHJlLWluaXRpYWxpemF0aW9uJyxcbiAgICBTREtfUE9TVF9JTklUSUFMSVpFOiAnc2RrOmRyaXZlcjpwb3N0LWluaXRpYWxpemF0aW9uJyxcbiAgICBTREtfQ0xJX0NIRUNLX1VQREFURTogJ3NkazpjbGk6Y2hlY2stdXBkYXRlJyxcbiAgICBTREtfQ0xJX0RPV05MT0FEOiAnc2RrOmNsaTpkb3dubG9hZCcsXG4gICAgU0RLX0NMSV9PTl9CT09UU1RSQVA6ICdzZGs6Y2xpOm9uLWJvb3RzdHJhcCcsXG4gICAgU0RLX0NMSV9PTl9DT05ORUNUOiAnc2RrOmNsaTpvbi1jb25uZWN0JyxcbiAgICBTREtfQ0xJX1NUQVJUOiAnc2RrOmNsaTpzdGFydCcsXG4gICAgU0RLX0NMSV9PTl9TVE9QOiAnc2RrOmNsaTpvbi1zdG9wJyxcbiAgICBTREtfQ09OTkVDVF9CSU5fU0VTU0lPTjogJ3Nkazpjb25uZWN0QmluU2Vzc2lvbicsXG4gICAgU0RLX1NUQVJUX0JJTl9TRVNTSU9OOiAnc2RrOnN0YXJ0QmluU2Vzc2lvbicsXG4gICAgLy8gTmV3IGV2ZW50cyBmcm9tIFB5dGhvbiBTREtcbiAgICBTREtfRFJJVkVSX0lOSVQ6ICdzZGs6ZHJpdmVySW5pdCcsXG4gICAgU0RLX0ZJTkRfTkVBUkVTVF9IVUI6ICdzZGs6ZmluZE5lYXJlc3RIdWInLFxuICAgIFNES19BVVRPTUFUSU9OX0ZSQU1FV09SS19JTklUOiAnc2RrOmF1dG9tYXRpb25GcmFtZXdvcmtJbml0JyxcbiAgICBTREtfQVVUT01BVElPTl9GUkFNRVdPUktfU1RBUlQ6ICdzZGs6YXV0b21hdGlvbkZyYW1ld29ya1N0YXJ0JyxcbiAgICBTREtfQVVUT01BVElPTl9GUkFNRVdPUktfU1RPUDogJ3NkazphdXRvbWF0aW9uRnJhbWV3b3JrU3RvcCcsXG4gICAgU0RLX0FDQ0VTU0lCSUxJVFlfQ09ORklHOiAnc2RrOmFjY2Vzc2liaWxpdHlDb25maWcnLFxuICAgIFNES19PQlNFUlZBQklMSVRZX0NPTkZJRzogJ3NkazpvYnNlcnZhYmlsaXR5Q29uZmlnJyxcbiAgICBTREtfQUlfU0VMRl9IRUFMX1NURVA6ICdzZGs6YWlTZWxmSGVhbFN0ZXAnLFxuICAgIFNES19BSV9TRUxGX0hFQUxfR0VUX1JFU1VMVDogJ3NkazphaVNlbGZIZWFsR2V0UmVzdWx0JyxcbiAgICBTREtfVEVTVF9GUkFNRVdPUktfRVZFTlQ6ICdzZGs6dGVzdEZyYW1ld29ya0V2ZW50JyxcbiAgICBTREtfVEVTVF9TRVNTSU9OX0VWRU5UOiAnc2RrOnRlc3RTZXNzaW9uRXZlbnQnLFxuICAgIFNES19DTElfTE9HX0NSRUFURURfRVZFTlQ6ICdzZGs6Y2xpOmxvZ0NyZWF0ZWRFdmVudCcsXG4gICAgU0RLX0NMSV9FTlFVRVVFX1RFU1RfRVZFTlQ6ICdzZGs6Y2xpOmVucXVldWVUZXN0RXZlbnQnLFxuICAgIFNES19PTl9TVE9QOiAnc2RrOm9uU3RvcCcsXG4gICAgU0RLX1NFTkRfTE9HUzogJ3NkazpzZW5kbG9ncycsXG4gICAgLy8gRnVubmVsIEV2ZW50c1xuICAgIFNES19GVU5ORUxfVEVTVF9BVFRFTVBURUQ6ICdzZGs6ZnVubmVsOnRlc3QtYXR0ZW1wdGVkJyxcbiAgICBTREtfRlVOTkVMX1RFU1RfU1VDQ0VTU0ZVTDogJ3NkazpmdW5uZWw6dGVzdC1zdWNjZXNzZnVsJyxcbiAgICAvLyBMb2cgVXBsb2FkIEV2ZW50c1xuICAgIFNES19VUExPQURfTE9HUzogJ3Nkazp1cGxvYWQtbG9ncycsXG4gICAgLy8gS2V5IE1ldHJpY3MgRXZlbnRzXG4gICAgU0RLX1NFTkRfS0VZX01FVFJJQ1M6ICdzZGs6c2VuZC1rZXktbWV0cmljcycsXG4gICAgU0RLX0tFWV9NRVRSSUNTX1BSRVBBUkFUSU9OOiAnc2RrOmtleS1tZXRyaWNzOnByZXBhcmF0aW9uJyxcbiAgICBTREtfS0VZX01FVFJJQ1NfVVBMT0FEOiAnc2RrOmtleS1tZXRyaWNzOnVwbG9hZCcsXG4gICAgLy8gQ0xJIEJpbmFyeSBFdmVudHNcbiAgICBTREtfQ0xJX0RPV05MT0FEX0JJTkFSWTogJ3NkazpjbGk6ZG93bmxvYWQtYmluYXJ5JyxcbiAgICBTREtfQ0xJX0JJTkFSWV9WRVJJRklDQVRJT046ICdzZGs6Y2xpOmJpbmFyeS12ZXJpZmljYXRpb24nLFxuICAgIC8vIENsZWFudXAgJiBTaHV0ZG93biBFdmVudHMgKHRyYWNraW5nIGdhcCBiZXR3ZWVuIGRyaXZlcjpxdWl0IGFuZCBmdW5uZWw6dGVzdC1zdWNjZXNzZnVsKVxuICAgIFNES19MSVNURU5FUl9XT1JLRVJfRU5EOiAnc2RrOmxpc3RlbmVyOndvcmtlci1lbmQnLFxuICAgIFNES19QRVJDWV9URUFSRE9XTjogJ3NkazpwZXJjeTp0ZWFyZG93bicsXG4gICAgU0RLX1dPUktFUl9TQVZFX0RBVEE6ICdzZGs6d29ya2VyOnNhdmUtZGF0YScsXG4gICAgU0RLX1BFUkZPUk1BTkNFX1JFUE9SVF9HRU46ICdzZGs6cGVyZm9ybWFuY2U6cmVwb3J0LWdlbmVyYXRpb24nLFxuICAgIFNES19QRVJGT1JNQU5DRV9KU09OX1dSSVRFOiAnc2RrOnBlcmZvcm1hbmNlOmpzb24td3JpdGUnLFxuICAgIFNES19QRVJGT1JNQU5DRV9IVE1MX0dFTjogJ3NkazpwZXJmb3JtYW5jZTpodG1sLWdlbmVyYXRpb24nLFxuICAgIC8vIERldmljZSBBbGxvY2F0aW9uIEV2ZW50ICh0cmFja2luZyBnYXAgYmV0d2VlbiBiZWZvcmVTZXNzaW9uIGFuZCBiZWZvcmUgaG9va3MpXG4gICAgU0RLX0RFVklDRV9BTExPQ0FUSU9OOiAnc2RrOmRldmljZS1hbGxvY2F0aW9uJ1xufVxuXG5leHBvcnQgY29uc3QgVEVTVEhVQl9FVkVOVFMgPSB7XG4gICAgU1RBUlQ6IGAke0VWRU5UUy5TREtfVEVTVEhVQn06c3RhcnRgLFxuICAgIFNUT1A6IGAke0VWRU5UUy5TREtfVEVTVEhVQn06c3RvcGBcbn1cblxuZXhwb3J0IGNvbnN0IEFVVE9NQVRFX0VWRU5UUyA9IHtcbiAgICBLRUVQX0FMSVZFOiBgJHtFVkVOVFMuU0RLX0FVVE9NQVRFfTprZWVwLWFsaXZlYCxcbiAgICBIVUJfTUFOQUdFTUVOVDogYCR7RVZFTlRTLlNES19BVVRPTUFURX06aHViLW1hbmFnZW1lbnRgLFxuICAgIExPQ0FMX1NUQVJUOiBgJHtFVkVOVFMuU0RLX0FVVE9NQVRFfTpsb2NhbC1zdGFydGAsXG4gICAgTE9DQUxfU1RPUDogYCR7RVZFTlRTLlNES19BVVRPTUFURX06bG9jYWwtc3RvcGAsXG4gICAgRFJJVkVSX01BTkFHRTogYCR7RVZFTlRTLlNES19BVVRPTUFURX06ZHJpdmVyLW1hbmFnZWAsXG4gICAgU0VTU0lPTl9OQU1FOiBgJHtFVkVOVFMuU0RLX0FVVE9NQVRFfTpzZXNzaW9uLW5hbWVgLFxuICAgIFNFU1NJT05fU1RBVFVTOiBgJHtFVkVOVFMuU0RLX0FVVE9NQVRFfTpzZXNzaW9uLXN0YXR1c2AsXG4gICAgU0VTU0lPTl9BTk5PVEFUSU9OOiBgJHtFVkVOVFMuU0RLX0FVVE9NQVRFfTpzZXNzaW9uLWFubm90YXRpb25gLFxuICAgIElETEVfVElNRU9VVDogYCR7RVZFTlRTLlNES19BVVRPTUFURX06aWRsZS10aW1lb3V0YCxcbiAgICBHRU5FUkFURV9DSV9BUlRJRkFDVDogYCR7RVZFTlRTLlNES19BVVRPTUFURX06Y2ktYXJ0aWZhY3RzYCxcbiAgICBQUklOVF9CVUlMRExJTks6IGAke0VWRU5UUy5TREtfQVVUT01BVEV9OnByaW50LWJ1aWxkbGlua2Bcbn1cblxuZXhwb3J0IGNvbnN0IEExMVlfRVZFTlRTID0ge1xuICAgIFBFUkZPUk1fU0NBTjogYCR7RVZFTlRTLlNES19BMTFZfTpkcml2ZXItcGVyZm9ybXNjYW5gLFxuICAgIFNBVkVfUkVTVUxUUzogYCR7RVZFTlRTLlNES19BMTFZfTpzYXZlLXJlc3VsdHNgLFxuICAgIEdFVF9SRVNVTFRTOiBgJHtFVkVOVFMuU0RLX0ExMVl9OmdldC1hY2Nlc3NpYmlsaXR5LXJlc3VsdHNgLFxuICAgIEdFVF9SRVNVTFRTX1NVTU1BUlk6IGAke0VWRU5UUy5TREtfQTExWX06Z2V0LWFjY2Vzc2liaWxpdHktcmVzdWx0cy1zdW1tYXJ5YFxufVxuXG5leHBvcnQgY29uc3QgUEVSQ1lfRVZFTlRTID0ge1xuICAgIERPV05MT0FEOiBgJHtFVkVOVFMuU0RLX1BFUkNZfTpkb3dubG9hZGAsXG4gICAgU0NSRUVOU0hPVDogYCR7RVZFTlRTLlNES19QRVJDWX06c2NyZWVuc2hvdGAsXG4gICAgU1RBUlQ6IGAke0VWRU5UUy5TREtfUEVSQ1l9OnN0YXJ0YCxcbiAgICBTVE9QOiBgJHtFVkVOVFMuU0RLX1BFUkNZfTpzdG9wYCxcbiAgICBBVVRPX0NBUFRVUkU6IGAke0VWRU5UUy5TREtfUEVSQ1l9OmF1dG8tY2FwdHVyZWAsXG4gICAgU05BUFNIT1Q6IGAke0VWRU5UUy5TREtfUEVSQ1l9OnNuYXBzaG90YCxcbiAgICBTQ1JFRU5TSE9UX0FQUDogYCR7RVZFTlRTLlNES19QRVJDWX06c2NyZWVuc2hvdC1hcHBgXG59XG5cbmV4cG9ydCBjb25zdCBPMTFZX0VWRU5UUyA9IHtcbiAgICBTWU5DOiBgJHtFVkVOVFMuU0RLX08xMVl9OnN5bmNgLFxuICAgIFRBS0VfU0NSRUVOU0hPVDogYCR7RVZFTlRTLlNES19PMTFZfTpkcml2ZXItdGFrZVNjcmVlblNob3RgLFxuICAgIFBSSU5UX0JVSUxETElOSzogYCR7RVZFTlRTLlNES19PMTFZfTpwcmludC1idWlsZGxpbmtgXG59XG5cbmV4cG9ydCBjb25zdCBIT09LX0VWRU5UUyA9IHtcbiAgICBCRUZPUkVfRUFDSDogYCR7RVZFTlRTLlNES19IT09LfTpiZWZvcmUtZWFjaGAsXG4gICAgQUZURVJfRUFDSDogYCR7RVZFTlRTLlNES19IT09LfTphZnRlci1lYWNoYCxcbiAgICBBRlRFUl9BTEw6IGAke0VWRU5UUy5TREtfSE9PS306YWZ0ZXItYWxsYCxcbiAgICBCRUZPUkVfQUxMOiBgJHtFVkVOVFMuU0RLX0hPT0t9OmJlZm9yZS1hbGxgLFxuICAgIEJFRk9SRTogYCR7RVZFTlRTLlNES19IT09LfTpiZWZvcmVgLFxuICAgIEFGVEVSOiBgJHtFVkVOVFMuU0RLX0hPT0t9OmFmdGVyYFxufVxuXG5leHBvcnQgY29uc3QgVFVSQk9TQ0FMRV9FVkVOVFMgPSB7XG4gICAgSFVCX01BTkFHRU1FTlQ6IGAke0VWRU5UUy5TREtfVFVSQk9TQ0FMRX06aHViLW1hbmFnZW1lbnRgLFxuICAgIFBSSU5UX0JVSUxETElOSzogYCR7RVZFTlRTLlNES19UVVJCT1NDQUxFfTpwcmludC1idWlsZGxpbmtgXG59XG5cbmV4cG9ydCBjb25zdCBBUFBfQVVUT01BVEVfRVZFTlRTID0ge1xuICAgIEFQUF9VUExPQUQ6IGAke0VWRU5UUy5TREtfQVBQX0FVVE9NQVRFfTphcHAtdXBsb2FkYFxufVxuXG5leHBvcnQgY29uc3QgRFJJVkVSX0VWRU5UID0ge1xuICAgIFFVSVQ6IGAke0VWRU5UUy5TREtfRFJJVkVSfTpxdWl0YCxcbiAgICBHRVQ6IGAke0VWRU5UUy5TREtfRFJJVkVSfTpnZXRgLFxuICAgIFBSRV9FWEVDVVRFOiBgJHtFVkVOVFMuU0RLX0RSSVZFUn06cHJlLWV4ZWN1dGVgLFxuICAgIFBPU1RfRVhFQ1VURTogYCR7RVZFTlRTLlNES19EUklWRVJ9OnBvc3QtZXhlY3V0ZWAsXG4gICAgSU5JVDogRVZFTlRTLlNES19EUklWRVJfSU5JVCxcbiAgICBQUkVfSU5JVElBTElaRTogRVZFTlRTLlNES19QUkVfSU5JVElBTElaRSxcbiAgICBQT1NUX0lOSVRJQUxJWkU6IEVWRU5UUy5TREtfUE9TVF9JTklUSUFMSVpFXG59XG5cbi8qKlxuICogRnJhbWV3b3JrIGxpZmVjeWNsZSBldmVudHMgZm9yIGF1dG9tYXRpb24gZnJhbWV3b3JrIHRyYWNraW5nXG4gKi9cbmV4cG9ydCBjb25zdCBGUkFNRVdPUktfRVZFTlRTID0ge1xuICAgIElOSVQ6IEVWRU5UUy5TREtfQVVUT01BVElPTl9GUkFNRVdPUktfSU5JVCxcbiAgICBTVEFSVDogRVZFTlRTLlNES19BVVRPTUFUSU9OX0ZSQU1FV09SS19TVEFSVCxcbiAgICBTVE9QOiBFVkVOVFMuU0RLX0FVVE9NQVRJT05fRlJBTUVXT1JLX1NUT1Bcbn1cblxuLyoqXG4gKiBNb2R1bGUgY29uZmlndXJhdGlvbiBldmVudHNcbiAqL1xuZXhwb3J0IGNvbnN0IENPTkZJR19FVkVOVFMgPSB7XG4gICAgQUNDRVNTSUJJTElUWTogRVZFTlRTLlNES19BQ0NFU1NJQklMSVRZX0NPTkZJRyxcbiAgICBPQlNFUlZBQklMSVRZOiBFVkVOVFMuU0RLX09CU0VSVkFCSUxJVFlfQ09ORklHXG59XG5cbi8qKlxuICogQUkgc2VsZi1oZWFsaW5nIGV2ZW50c1xuICovXG5leHBvcnQgY29uc3QgQUlfRVZFTlRTID0ge1xuICAgIFNFTEZfSEVBTF9TVEVQOiBFVkVOVFMuU0RLX0FJX1NFTEZfSEVBTF9TVEVQLFxuICAgIFNFTEZfSEVBTF9HRVRfUkVTVUxUOiBFVkVOVFMuU0RLX0FJX1NFTEZfSEVBTF9HRVRfUkVTVUxUXG59XG5cbi8qKlxuICogRXZlbnQgZGlzcGF0Y2hlciBldmVudHMgZm9yIHRlc3QgZnJhbWV3b3JrIGFuZCBzZXNzaW9uIHRyYWNraW5nXG4gKi9cbmV4cG9ydCBjb25zdCBESVNQQVRDSEVSX0VWRU5UUyA9IHtcbiAgICBURVNUX0ZSQU1FV09SSzogRVZFTlRTLlNES19URVNUX0ZSQU1FV09SS19FVkVOVCxcbiAgICBURVNUX1NFU1NJT046IEVWRU5UUy5TREtfVEVTVF9TRVNTSU9OX0VWRU5ULFxuICAgIExPR19DUkVBVEVEOiBFVkVOVFMuU0RLX0NMSV9MT0dfQ1JFQVRFRF9FVkVOVCxcbiAgICBFTlFVRVVFX1RFU1Q6IEVWRU5UUy5TREtfQ0xJX0VOUVVFVUVfVEVTVF9FVkVOVFxufVxuXG4iLCAiZXhwb3J0IGNvbnN0IFRlc3RGcmFtZXdvcmtDb25zdGFudHMgPSB7XG4gICAgS0VZX1RFU1RfVVVJRDogJ3Rlc3RfdXVpZCcsXG4gICAgS0VZX1RFU1RfSUQgOiAndGVzdF9pZCcsXG4gICAgS0VZX1RFU1RfTkFNRSA6ICd0ZXN0X25hbWUnLFxuICAgIEtFWV9URVNUX0ZJTEVfUEFUSCA6ICd0ZXN0X2ZpbGVfcGF0aCcsXG4gICAgS0VZX1RFU1RfVEFHUyA6ICd0ZXN0X3RhZ3MnLFxuICAgIEtFWV9URVNUX1JFU1VMVCA6ICd0ZXN0X3Jlc3VsdCcsXG4gICAgS0VZX1RFU1RfUkVTVUxUX0FUIDogJ3Rlc3RfcmVzdWx0X2F0JyxcbiAgICBLRVlfVEVTVF9TVEFSVEVEX0FUIDogJ3Rlc3Rfc3RhcnRlZF9hdCcsXG4gICAgS0VZX1RFU1RfRU5ERURfQVQgOiAndGVzdF9lbmRlZF9hdCcsXG4gICAgS0VZX1RFU1RfTE9DQVRJT04gOiAndGVzdF9sb2NhdGlvbicsXG4gICAgS0VZX1RFU1RfU0NPUEUgOiAndGVzdF9zY29wZScsXG4gICAgS0VZX1RFU1RfU0NPUEVTIDogJ3Rlc3Rfc2NvcGVzJyxcbiAgICBLRVlfVEVTVF9GUkFNRVdPUktfTkFNRSA6ICd0ZXN0X2ZyYW1ld29ya19uYW1lJyxcbiAgICBLRVlfVEVTVF9GUkFNRVdPUktfVkVSU0lPTiA6ICd0ZXN0X2ZyYW1ld29ya192ZXJzaW9uJyxcbiAgICBLRVlfVEVTVF9DT0RFIDogJ3Rlc3RfY29kZScsXG4gICAgS0VZX1RFU1RfUkVSVU5fTkFNRSA6ICd0ZXN0X3JlcnVuX25hbWUnLFxuICAgIEtFWV9QTEFURk9STV9JTkRFWCA6ICdwbGF0Zm9ybV9pbmRleCcsXG4gICAgS0VZX1RFU1RfRkFJTFVSRSA6ICd0ZXN0X2ZhaWx1cmUnLFxuICAgIEtFWV9URVNUX0ZBSUxVUkVfVFlQRSA6ICd0ZXN0X2ZhaWx1cmVfdHlwZScsXG4gICAgS0VZX1RFU1RfRkFJTFVSRV9SRUFTT04gOiAndGVzdF9mYWlsdXJlX3JlYXNvbicsXG4gICAgS0VZX1RFU1RfTE9HUyA6ICd0ZXN0X2xvZ3MnLFxuICAgIEtFWV9URVNUX01FVEEgOiAndGVzdF9tZXRhJyxcbiAgICBLRVlfQ1VTVE9NX1RBR1MgOiAnY3VzdG9tX21ldGFkYXRhJyxcbiAgICBLRVlfVEVTVF9ERUZFUlJFRCA6ICd0ZXN0X2RlZmVycmVkJyxcbiAgICBLRVlfU0VTU0lPTl9OQU1FIDogJ3Rlc3Rfc2Vzc2lvbl9uYW1lJyxcbiAgICBLRVlfQVVUT01BVEVfU0VTU0lPTl9OQU1FIDogJ2F1dG9tYXRlX3Nlc3Npb25fbmFtZScsXG4gICAgS0VZX0FVVE9NQVRFX1NFU1NJT05fU1RBVFVTOiAnYXV0b21hdGVfc2Vzc2lvbl9zdGF0dXMnLFxuICAgIEtFWV9BVVRPTUFURV9TRVNTSU9OX1JFQVNPTjogJ2F1dG9tYXRlX3Nlc3Npb25fcmVhc29uJyxcbiAgICBLRVlfRVZFTlRfU1RBUlRFRF9BVCA6ICdldmVudF9zdGFydGVkX2F0JyxcbiAgICBLRVlfRVZFTlRfRU5ERURfQVQgOiAnZXZlbnRfZW5kZWRfYXQnLFxuICAgIEtFWV9IT09LX0lEIDogJ2hvb2tfaWQnLFxuICAgIEtFWV9IT09LX1JFU1VMVCA6ICdob29rX3Jlc3VsdCcsXG4gICAgS0VZX0hPT0tfTE9HUyA6ICdob29rX2xvZ3MnLFxuICAgIEtFWV9IT09LX05BTUUgOiAnaG9va19uYW1lJyxcbiAgICBLRVlfSE9PS1NfU1RBUlRFRDogJ3Rlc3RfaG9va3Nfc3RhcnRlZCcsXG4gICAgS0VZX0hPT0tTX0ZJTklTSEVEOiAndGVzdF9ob29rc19maW5pc2hlZCcsXG4gICAgREVGQVVMVF9URVNUX1JFU1VMVCA6ICdwZW5kaW5nJyxcbiAgICBERUZBVUxUX0hPT0tfUkVTVUxUIDogJ3BlbmRpbmcnLFxuICAgIEtJTkRfU0NSRUVOU0hPVCA6ICdURVNUX1NDUkVFTlNIT1QnLFxuICAgIEtJTkRfTE9HIDogJ1RFU1RfTE9HJyxcbiAgICBLSU5EX0FUVEFDSE1FTlQgOiAnVEVTVF9BVFRBQ0hNRU5UJyxcbiAgICBIT09LX1JFR0VYIDogJ14oQkVGT1JFX3xBRlRFUl8pJyxcbn1cbiIsICJcbmltcG9ydCB7IEJST1dTRVJTVEFDS19QRVJDWSwgQlJPV1NFUlNUQUNLX09CU0VSVkFCSUxJVFksIEJST1dTRVJTVEFDS19BQ0NFU1NJQklMSVRZIH0gZnJvbSAnLi4vY29uc3RhbnRzLmpzJ1xuaW1wb3J0IHR5cGUgQnJvd3NlclN0YWNrQ29uZmlnIGZyb20gJy4uL2NvbmZpZy5qcydcbmltcG9ydCB7IEJTdGFja0xvZ2dlciB9IGZyb20gJy4uL2JzdGFja0xvZ2dlci5qcydcbmltcG9ydCB7IGlzVHJ1ZSwgaXNMb2FkVGVzdGluZ1Nlc3Npb24gfSBmcm9tICcuLi91dGlsLmpzJ1xuXG5pbnRlcmZhY2UgRXJyb3JUeXBlIHtcbiAgICBrZXk6IHN0cmluZ1xuICAgIG1lc3NhZ2U6IHN0cmluZ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEVycm9ycyB7XG4gICAgZXJyb3JzOiBFcnJvclR5cGVbXVxufVxuXG5leHBvcnQgY29uc3QgZ2V0UHJvZHVjdE1hcCA9IChjb25maWc6IEJyb3dzZXJTdGFja0NvbmZpZyk6IHsgW2tleTogc3RyaW5nXTogYm9vbGVhbiB9ID0+IHtcbiAgICAvLyBMVFMgZ2F0aW5nOiB1bmRlciBMVFMsIGF1dG9tYXRlIGlzIGZvcmNlZCBmYWxzZSAoTFRTIGJ1aWxkcyByb3V0ZSB0b1xuICAgIC8vIHRoZSBMVFMgaW50ZXJuYWwgaHViOyBrZWVwaW5nIGF1dG9tYXRlPXRydWUgdGFncyBUZXN0SHViIHNvdXJjZSBhc1xuICAgIC8vIFRPLEFVVCxMVFMgaW5zdGVhZCBvZiBUTyxMVFMgXHUyMDE0IHNlZSBweS1zZGsgZWE1M2Q5MTQpLiBUaGUgYGx0c2Aga2V5XG4gICAgLy8gaXRzZWxmIGlzIG9ubHkgZW1pdHRlZCB1bmRlciBMVFMgc28gbm9uLUxUUyBwYXlsb2FkcyBzdGF5IGJ5dGUtXG4gICAgLy8gaWRlbnRpY2FsIHRvIHRoZSBwcmUtTFRTLVBSIHNoYXBlIChhdm9pZHMgc3VycHJpc2luZyBhbnkgYmFja2VuZCB3aXRoXG4gICAgLy8gc3RyaWN0IHVua25vd24ta2V5IHZhbGlkYXRpb24pLlxuICAgIGNvbnN0IGx0cyA9IGlzTG9hZFRlc3RpbmdTZXNzaW9uKClcbiAgICBjb25zdCBlbnRyaWVzOiBbc3RyaW5nLCBib29sZWFuIHwgdW5kZWZpbmVkXVtdID0gW1xuICAgICAgICBbJ29ic2VydmFiaWxpdHknLCBjb25maWcudGVzdE9ic2VydmFiaWxpdHkuZW5hYmxlZF0sXG4gICAgICAgIFsnYWNjZXNzaWJpbGl0eScsICEhY29uZmlnLmFjY2Vzc2liaWxpdHldLFxuICAgICAgICBbJ3BlcmN5JywgY29uZmlnLnBlcmN5XSxcbiAgICAgICAgWydhdXRvbWF0ZScsIGx0cyA/IGZhbHNlIDogY29uZmlnLmF1dG9tYXRlXSxcbiAgICAgICAgWydhcHBfYXV0b21hdGUnLCBjb25maWcuYXBwQXV0b21hdGVdLFxuICAgIF1cbiAgICBpZiAobHRzKSB7XG4gICAgICAgIGVudHJpZXMucHVzaChbJ2x0cycsIHRydWVdKVxuICAgIH1cbiAgICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKGVudHJpZXMuZmlsdGVyKChbLCB2XSkgPT4gdiAhPT0gbnVsbCkpIGFzIHsgW2tleTogc3RyaW5nXTogYm9vbGVhbiB9XG59XG5cbmV4cG9ydCBjb25zdCBzaG91bGRQcm9jZXNzRXZlbnRGb3JUZXN0aHViID0gKGV2ZW50VHlwZTogc3RyaW5nKTogYm9vbGVhbiA9PiB7XG4gICAgLy8gTFRTIHNob3J0LWNpcmN1aXQ6IHdoZW4gcnVubmluZyBhcyBhbiBMVFMgbG9hZCB0ZXN0IChCUk9XU0VSU1RBQ0tfTFRTPXRydWVcbiAgICAvLyBmb3IgbG9jYWwgcmVwcm8sIG9yIEJST1dTRVJTVEFDS19MVFNfU0VTU0lPTl9JRCBzZXQgYnkgdGhlIHBvZCksIFRlc3RIdWJcbiAgICAvLyBldmVudCBlbWlzc2lvbiBtdXN0IGFsd2F5cyBmbG93IHJlZ2FyZGxlc3Mgb2YgdGhlIG9ic2VydmFiaWxpdHkgL1xuICAgIC8vIGFjY2Vzc2liaWxpdHkgLyBwZXJjeSBlbnYgZmxhZ3MuIFBvZCBydW5zIGRvIGV4cG9ydFxuICAgIC8vIEJST1dTRVJTVEFDS19PQlNFUlZBQklMSVRZLCBidXQgdGhlIGxvY2FsLXJlcHJvIGZsYWcgcGF0aCBkb2Vzbid0XG4gICAgLy8gZ3VhcmFudGVlIGl0IFx1MjAxNCB3aXRob3V0IHRoaXMgc2hvcnQtY2lyY3VpdCwgZ2V0UHJvZHVjdE1hcCBjb3JyZWN0bHlcbiAgICAvLyBlbWl0cyBsdHM6IHRydWUgd2hpbGUgZXZlcnkgb25UZXN0U3RhcnQgLyBvblRlc3RFbmQgLyBvbkhvb2tTdGFydFxuICAgIC8vIHNpbGVudGx5IG5vLW9wcy4gTWlycm9yIG9mIHRoZSB1bmNvbmRpdGlvbmFsIExUUyBldmVudCBmbG93IGluIHB5LXNkaydzXG4gICAgLy8gc2hvdWxkX3NlbmRfZXZlbnRfZm9yX3Rlc3RodWIoKSAoUFIgIzk5MykuXG4gICAgaWYgKGlzTG9hZFRlc3RpbmdTZXNzaW9uKCkpIHtcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG4gICAgaWYgKGlzVHJ1ZShwcm9jZXNzLmVudltCUk9XU0VSU1RBQ0tfT0JTRVJWQUJJTElUWV0pKSB7XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuICAgIGlmIChpc1RydWUocHJvY2Vzcy5lbnZbQlJPV1NFUlNUQUNLX0FDQ0VTU0lCSUxJVFldKSkge1xuICAgICAgICByZXR1cm4gIShbJ0hvb2tSdW5TdGFydGVkJywgJ0hvb2tSdW5GaW5pc2hlZCcsICdMb2dDcmVhdGVkJ10uaW5jbHVkZXMoZXZlbnRUeXBlKSlcbiAgICB9XG4gICAgaWYgKGlzVHJ1ZShwcm9jZXNzLmVudltCUk9XU0VSU1RBQ0tfUEVSQ1ldKSAmJiBldmVudFR5cGUpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICAgIC8vIEV2YWx1YXRlIHdpdGggaXNUcnVlIHNvIGEgcHJvZHVjdCBmbGFnIGV4cGxpY2l0bHkgc2V0IHRvIHRoZSBzdHJpbmcgJ2ZhbHNlJ1xuICAgIC8vIChlLmcuIG9ic2VydmFiaWxpdHkgdHVybmVkIG9mZiBhZnRlciBhIGZhaWxlZC9ibG9ja2VkIGJ1aWxkLXN0YXJ0KSByZWFkcyBhc1xuICAgIC8vIG9mZi4gUmF3IEJvb2xlYW4oJ2ZhbHNlJykgaXMgdHJ1dGh5LCB3aGljaCBrZXB0IGV2ZW50cyBmbG93aW5nIGZvciBhblxuICAgIC8vIG9ic2VydmFiaWxpdHktb25seSBzZXNzaW9uIGV2ZW4gYWZ0ZXIgdGhlIGZsYWcgd2FzIGRpc2FibGVkLlxuICAgIHJldHVybiBpc1RydWUocHJvY2Vzcy5lbnZbQlJPV1NFUlNUQUNLX0FDQ0VTU0lCSUxJVFldKSB8fCBpc1RydWUocHJvY2Vzcy5lbnZbQlJPV1NFUlNUQUNLX09CU0VSVkFCSUxJVFldKSB8fCBpc1RydWUocHJvY2Vzcy5lbnZbQlJPV1NFUlNUQUNLX1BFUkNZXSlcbn1cblxuZXhwb3J0IGNvbnN0IGhhbmRsZUVycm9yRm9yT2JzZXJ2YWJpbGl0eSA9IChlcnJvcjogRXJyb3JzIHwgbnVsbCk6IHZvaWQgPT4ge1xuICAgIHByb2Nlc3MuZW52W0JST1dTRVJTVEFDS19PQlNFUlZBQklMSVRZXSA9ICdmYWxzZSdcbiAgICBsb2dCdWlsZEVycm9yKGVycm9yLCAnVGVzdCBSZXBvcnRpbmcgYW5kIEFuYWx5dGljcycpXG59XG5cbmV4cG9ydCBjb25zdCBoYW5kbGVFcnJvckZvckFjY2Vzc2liaWxpdHkgPSAoZXJyb3I6IEVycm9ycyB8IG51bGwpOiB2b2lkID0+IHtcbiAgICBwcm9jZXNzLmVudltCUk9XU0VSU1RBQ0tfQUNDRVNTSUJJTElUWV0gPSAnZmFsc2UnXG4gICAgbG9nQnVpbGRFcnJvcihlcnJvciwgJ2FjY2Vzc2liaWxpdHknKVxufVxuXG5leHBvcnQgY29uc3QgbG9nQnVpbGRFcnJvciA9IChlcnJvcjogRXJyb3JzIHwgbnVsbCwgcHJvZHVjdDogc3RyaW5nID0gJycpOiB2b2lkID0+IHtcbiAgICBpZiAoIWVycm9yIHx8ICFlcnJvci5lcnJvcnMpIHtcbiAgICAgICAgQlN0YWNrTG9nZ2VyLmVycm9yKGAke3Byb2R1Y3QudG9VcHBlckNhc2UoKX0gQnVpbGQgY3JlYXRpb24gZmFpbGVkICR7ZXJyb3IhfWApXG4gICAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGZvciAoY29uc3QgZXJyb3JKc29uIG9mIGVycm9yLmVycm9ycykge1xuICAgICAgICBjb25zdCBlcnJvclR5cGUgPSBlcnJvckpzb24ua2V5XG4gICAgICAgIGNvbnN0IGVycm9yTWVzc2FnZSA9IGVycm9ySnNvbi5tZXNzYWdlXG4gICAgICAgIGlmIChlcnJvck1lc3NhZ2UpIHtcbiAgICAgICAgICAgIHN3aXRjaCAoZXJyb3JUeXBlKSB7XG4gICAgICAgICAgICBjYXNlICdFUlJPUl9JTlZBTElEX0NSRURFTlRJQUxTJzpcbiAgICAgICAgICAgICAgICBCU3RhY2tMb2dnZXIuZXJyb3IoZXJyb3JNZXNzYWdlKVxuICAgICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICBjYXNlICdFUlJPUl9BQ0NFU1NfREVOSUVEJzpcbiAgICAgICAgICAgICAgICBCU3RhY2tMb2dnZXIuaW5mbyhlcnJvck1lc3NhZ2UpXG4gICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgIGNhc2UgJ0VSUk9SX1NES19ERVBSRUNBVEVEJzpcbiAgICAgICAgICAgICAgICBCU3RhY2tMb2dnZXIuZXJyb3IoZXJyb3JNZXNzYWdlKVxuICAgICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIEJTdGFja0xvZ2dlci5lcnJvcihlcnJvck1lc3NhZ2UpXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmV4cG9ydCBjb25zdCBnZXRQcm9kdWN0TWFwRm9yQnVpbGRTdGFydENhbGwgPSAoY29uZmlnOiBCcm93c2VyU3RhY2tDb25maWcsIGFjY2Vzc2liaWxpdHlBdXRvbWF0aW9uPzogYm9vbGVhbiB8IG51bGwpOiB7IFtrZXk6IHN0cmluZ106IGJvb2xlYW4gfSA9PiB7XG4gICAgLy8gTFRTIGdhdGluZzogdW5kZXIgTFRTLCBhdXRvbWF0ZSBpcyBmb3JjZWQgZmFsc2UgKExUUyBidWlsZHMgcm91dGUgdG9cbiAgICAvLyB0aGUgTFRTIGludGVybmFsIGh1Yjsga2VlcGluZyBhdXRvbWF0ZT10cnVlIHRhZ3MgVGVzdEh1YiBzb3VyY2UgYXNcbiAgICAvLyBUTyxBVVQsTFRTIGluc3RlYWQgb2YgVE8sTFRTIFx1MjAxNCBzZWUgcHktc2RrIGVhNTNkOTE0KS4gVGhlIGBsdHNgIGtleVxuICAgIC8vIGl0c2VsZiBpcyBvbmx5IGVtaXR0ZWQgdW5kZXIgTFRTIHRvIGtlZXAgbm9uLUxUUyBwYXlsb2FkcyBieXRlLVxuICAgIC8vIGlkZW50aWNhbCB0byB0aGUgcHJlLUxUUy1QUiBzaGFwZS5cbiAgICBjb25zdCBsdHMgPSBpc0xvYWRUZXN0aW5nU2Vzc2lvbigpXG4gICAgY29uc3QgZW50cmllczogW3N0cmluZywgYm9vbGVhbiB8IHVuZGVmaW5lZCB8IG51bGxdW10gPSBbXG4gICAgICAgIFsnb2JzZXJ2YWJpbGl0eScsIGNvbmZpZy50ZXN0T2JzZXJ2YWJpbGl0eS5lbmFibGVkXSxcbiAgICAgICAgWydhY2Nlc3NpYmlsaXR5JywgYWNjZXNzaWJpbGl0eUF1dG9tYXRpb25dLFxuICAgICAgICBbJ3BlcmN5JywgY29uZmlnLnBlcmN5XSxcbiAgICAgICAgWydhdXRvbWF0ZScsIGx0cyA/IGZhbHNlIDogY29uZmlnLmF1dG9tYXRlXSxcbiAgICAgICAgWydhcHBfYXV0b21hdGUnLCBjb25maWcuYXBwQXV0b21hdGVdLFxuICAgIF1cbiAgICBpZiAobHRzKSB7XG4gICAgICAgIGVudHJpZXMucHVzaChbJ2x0cycsIHRydWVdKVxuICAgIH1cbiAgICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKGVudHJpZXMuZmlsdGVyKChbLCB2XSkgPT4gdiAhPT0gbnVsbCkpIGFzIHsgW2tleTogc3RyaW5nXTogYm9vbGVhbiB9XG59XG4iLCAiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnXG5cbmltcG9ydCB0eXBlIHsgT3B0aW9ucyB9IGZyb20gJ0B3ZGlvL3R5cGVzJ1xuXG5pbXBvcnQgeyBCU3RhY2tMb2dnZXIgfSBmcm9tICcuLi9ic3RhY2tMb2dnZXIuanMnXG5pbXBvcnQgeyBpc1ZhbGlkRW5hYmxlZFZhbHVlIH0gZnJvbSAnLi4vdXRpbC5qcydcbmltcG9ydCB7IFNNQVJUX1NFTEVDVElPTl9NT0RFX1JFTEVWQU5UX0ZJUlNULCBTTUFSVF9TRUxFQ1RJT05fTU9ERV9SRUxFVkFOVF9PTkxZIH0gZnJvbSAnLi4vY29uc3RhbnRzLmpzJ1xuXG5jb25zdCBSVU5fU01BUlRfU0VMRUNUSU9OID0gJ3J1blNtYXJ0U2VsZWN0aW9uJ1xuXG5jb25zdCBBTExPV0VEX09SQ0hFU1RSQVRJT05fS0VZUyA9IFtcbiAgICBSVU5fU01BUlRfU0VMRUNUSU9OXG5dXG5cbnR5cGUgU21hcnRTZWxlY3Rpb25SZXBvSW5mbyA9IHtcbiAgICB1cmw/OiBzdHJpbmdcbiAgICBmZWF0dXJlQnJhbmNoPzogc3RyaW5nXG4gICAgYmFzZUJyYW5jaD86IHN0cmluZ1xuICAgIG5hbWU/OiBzdHJpbmdcbiAgICBba2V5OiBzdHJpbmddOiB1bmtub3duXG59XG5cbnR5cGUgU21hcnRTZWxlY3Rpb25Tb3VyY2UgPSBzdHJpbmdbXSB8IFNtYXJ0U2VsZWN0aW9uUmVwb0luZm9bXSB8IG51bGxcblxudHlwZSBSdW5TbWFydFNlbGVjdGlvbkNvbmZpZyA9IHtcbiAgICBlbmFibGVkPzogYm9vbGVhbiB8IHN0cmluZ1xuICAgIG1vZGU/OiBzdHJpbmdcbiAgICBzb3VyY2U/OiBzdHJpbmcgfCBzdHJpbmdbXSB8IFNtYXJ0U2VsZWN0aW9uUmVwb0luZm9bXSB8IG51bGxcbn1cblxuY29uc3QgaXNQbGFpbk9iamVjdCA9ICh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0+IChcbiAgICB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICE9PSBudWxsICYmICFBcnJheS5pc0FycmF5KHZhbHVlKVxuKVxuXG5jb25zdCBhc1N0cmluZyA9ICh2YWx1ZTogdW5rbm93bik6IHN0cmluZyB8IHVuZGVmaW5lZCA9PiB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlXG4gICAgfVxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZS50b1N0cmluZygpXG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWRcbn1cblxuLyoqXG4gKiBDbGFzcyB0byBoYW5kbGUgdGVzdCBvcmRlcmluZyBmdW5jdGlvbmFsaXR5XG4gKi9cbmNsYXNzIFRlc3RPcmRlcmluZyB7XG4gICAgcHJpdmF0ZSBlbmFibGVkOiBib29sZWFuXG4gICAgcHJpdmF0ZSBuYW1lOiBzdHJpbmcgfCBudWxsXG5cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5lbmFibGVkID0gZmFsc2VcbiAgICAgICAgdGhpcy5uYW1lID0gbnVsbFxuICAgIH1cblxuICAgIGVuYWJsZShuYW1lOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5lbmFibGVkID0gdHJ1ZVxuICAgICAgICB0aGlzLm5hbWUgPSBuYW1lXG4gICAgfVxuXG4gICAgZGlzYWJsZSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5lbmFibGVkID0gZmFsc2VcbiAgICAgICAgdGhpcy5uYW1lID0gbnVsbFxuICAgIH1cblxuICAgIGdldEVuYWJsZWQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmVuYWJsZWRcbiAgICB9XG5cbiAgICBnZXROYW1lKCk6IHN0cmluZyB8IG51bGwge1xuICAgICAgICByZXR1cm4gdGhpcy5uYW1lXG4gICAgfVxufVxuXG4vKipcbiAqIFV0aWxpdHkgY2xhc3MgZm9yIHRlc3Qgb3JjaGVzdHJhdGlvblxuICovXG50eXBlIE9yY2hlc3RyYXRpb25Db25maWcgPSBPcHRpb25zLlRlc3RydW5uZXIgfCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuXG5leHBvcnQgY2xhc3MgT3JjaGVzdHJhdGlvblV0aWxzIHtcbiAgICBwcml2YXRlIHN0YXRpYyBfaW5zdGFuY2U6IE9yY2hlc3RyYXRpb25VdGlscyB8IG51bGwgPSBudWxsXG4gICAgcHJpdmF0ZSBydW5TbWFydFNlbGVjdGlvbjogYm9vbGVhblxuICAgIHByaXZhdGUgc21hcnRTZWxlY3Rpb25Nb2RlOiBzdHJpbmdcbiAgICBwcml2YXRlIHRlc3RPcmRlcmluZzogVGVzdE9yZGVyaW5nXG4gICAgcHJpdmF0ZSBzbWFydFNlbGVjdGlvblNvdXJjZTogU21hcnRTZWxlY3Rpb25Tb3VyY2VcbiAgICBwcml2YXRlIHByb2plY3ROYW1lPzogc3RyaW5nXG4gICAgcHJpdmF0ZSBidWlsZE5hbWU/OiBzdHJpbmdcbiAgICBwcml2YXRlIGJ1aWxkSWRlbnRpZmllcj86IHN0cmluZ1xuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIGNvbmZpZyBDb25maWd1cmF0aW9uIG9iamVjdFxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKGNvbmZpZzogT3JjaGVzdHJhdGlvbkNvbmZpZykge1xuICAgICAgICB0aGlzLnJ1blNtYXJ0U2VsZWN0aW9uID0gZmFsc2VcbiAgICAgICAgdGhpcy5zbWFydFNlbGVjdGlvbk1vZGUgPSBTTUFSVF9TRUxFQ1RJT05fTU9ERV9SRUxFVkFOVF9GSVJTVFxuICAgICAgICB0aGlzLnRlc3RPcmRlcmluZyA9IG5ldyBUZXN0T3JkZXJpbmcoKVxuICAgICAgICB0aGlzLnNtYXJ0U2VsZWN0aW9uU291cmNlID0gbnVsbCAvLyBTdG9yZSBzb3VyY2UgcGF0aHMgaWYgcHJvdmlkZWRcblxuICAgICAgICAvLyBDaGVjayBib3RoIHBvc3NpYmxlIGNvbmZpZ3VyYXRpb24gcGF0aHM6IGRpcmVjdCBvciBuZXN0ZWQgaW4gc2VydmljZXNcbiAgICAgICAgY29uc3QgY29uZmlnUmVjb3JkID0gaXNQbGFpbk9iamVjdChjb25maWcpID8gY29uZmlnIDoge31cbiAgICAgICAgbGV0IHRlc3RPcmNoT3B0aW9uczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSBpc1BsYWluT2JqZWN0KGNvbmZpZ1JlY29yZC50ZXN0T3JjaGVzdHJhdGlvbk9wdGlvbnMpXG4gICAgICAgICAgICA/IGNvbmZpZ1JlY29yZC50ZXN0T3JjaGVzdHJhdGlvbk9wdGlvbnNcbiAgICAgICAgICAgIDoge31cblxuICAgICAgICAvLyBJZiBub3QgZm91bmQgYXQgdG9wIGxldmVsLCBjaGVjayBpZiBpdCdzIGluIHRoZSBicm93c2Vyc3RhY2sgc2VydmljZSBjb25maWdcbiAgICAgICAgY29uc3Qgc2VydmljZXMgPSBBcnJheS5pc0FycmF5KGNvbmZpZ1JlY29yZC5zZXJ2aWNlcykgPyBjb25maWdSZWNvcmQuc2VydmljZXMgOiB1bmRlZmluZWRcbiAgICAgICAgaWYgKE9iamVjdC5rZXlzKHRlc3RPcmNoT3B0aW9ucykubGVuZ3RoID09PSAwICYmIEFycmF5LmlzQXJyYXkoc2VydmljZXMpKSB7XG4gICAgICAgICAgICAvLyBMb29rIGZvciBicm93c2Vyc3RhY2sgc2VydmljZSBjb25maWd1cmF0aW9uXG4gICAgICAgICAgICBmb3IgKGNvbnN0IHNlcnZpY2Ugb2Ygc2VydmljZXMpIHtcbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgIEFycmF5LmlzQXJyYXkoc2VydmljZSkgJiZcbiAgICAgICAgICAgICAgICAgICAgc2VydmljZVswXSA9PT0gJ2Jyb3dzZXJzdGFjaycgJiZcbiAgICAgICAgICAgICAgICAgICAgaXNQbGFpbk9iamVjdChzZXJ2aWNlWzFdKSAmJlxuICAgICAgICAgICAgICAgICAgICBpc1BsYWluT2JqZWN0KHNlcnZpY2VbMV0udGVzdE9yY2hlc3RyYXRpb25PcHRpb25zKVxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICB0ZXN0T3JjaE9wdGlvbnMgPSBzZXJ2aWNlWzFdLnRlc3RPcmNoZXN0cmF0aW9uT3B0aW9uc1xuICAgICAgICAgICAgICAgICAgICBCU3RhY2tMb2dnZXIuZGVidWcoJ1tjb25zdHJ1Y3Rvcl0gRm91bmQgdGVzdE9yY2hlc3RyYXRpb25PcHRpb25zIGluIGJyb3dzZXJzdGFjayBzZXJ2aWNlIGNvbmZpZycpXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gVHJ5IHRvIGdldCBydW5TbWFydFNlbGVjdGlvbiBvcHRpb25zXG4gICAgICAgIGNvbnN0IHJ1blNtYXJ0U2VsZWN0aW9uT3B0czogUnVuU21hcnRTZWxlY3Rpb25Db25maWcgPSBpc1BsYWluT2JqZWN0KHRlc3RPcmNoT3B0aW9uc1tSVU5fU01BUlRfU0VMRUNUSU9OXSlcbiAgICAgICAgICAgID8gdGVzdE9yY2hPcHRpb25zW1JVTl9TTUFSVF9TRUxFQ1RJT05dIGFzIFJ1blNtYXJ0U2VsZWN0aW9uQ29uZmlnXG4gICAgICAgICAgICA6IHt9XG5cbiAgICAgICAgdGhpcy5fc2V0UnVuU21hcnRTZWxlY3Rpb24oXG4gICAgICAgICAgICBydW5TbWFydFNlbGVjdGlvbk9wdHMuZW5hYmxlZCA/PyBmYWxzZSxcbiAgICAgICAgICAgIHJ1blNtYXJ0U2VsZWN0aW9uT3B0cy5tb2RlIHx8IFNNQVJUX1NFTEVDVElPTl9NT0RFX1JFTEVWQU5UX0ZJUlNULFxuICAgICAgICAgICAgcnVuU21hcnRTZWxlY3Rpb25PcHRzLnNvdXJjZSA/PyBudWxsXG4gICAgICAgIClcbiAgICAgICAgLy8gRXh0cmFjdCBidWlsZCBkZXRhaWxzIGZyb20gY2FwYWJpbGl0aWVzXG4gICAgICAgIHRoaXMuX2V4dHJhY3RCdWlsZERldGFpbHMoY29uZmlnKVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEV4dHJhY3QgYnVpbGQgZGV0YWlscyBmcm9tIGNhcGFiaWxpdGllc1xuICAgICAqL1xuICAgIHByaXZhdGUgX2V4dHJhY3RCdWlsZERldGFpbHMoY29uZmlnOiBPcmNoZXN0cmF0aW9uQ29uZmlnKTogdm9pZCB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBjb25maWdSZWNvcmQgPSBpc1BsYWluT2JqZWN0KGNvbmZpZykgPyBjb25maWcgOiB7fVxuICAgICAgICAgICAgY29uc3QgY2FwYWJpbGl0aWVzID0gKGNvbmZpZ1JlY29yZCBhcyB7IGNhcGFiaWxpdGllcz86IHVua25vd24gfSkuY2FwYWJpbGl0aWVzXG5cbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGNhcGFiaWxpdGllcykpIHtcbiAgICAgICAgICAgICAgICBjYXBhYmlsaXRpZXMuZm9yRWFjaChjYXBhYmlsaXR5ID0+IHRoaXMuX3BhcnNlQ2FwYWJpbGl0eShjYXBhYmlsaXR5KSlcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNQbGFpbk9iamVjdChjYXBhYmlsaXRpZXMpKSB7XG4gICAgICAgICAgICAgICAgLy8gSGFuZGxlIG11bHRpcmVtb3RlIGNhcGFiaWxpdGllc1xuICAgICAgICAgICAgICAgIE9iamVjdC52YWx1ZXMoY2FwYWJpbGl0aWVzKS5mb3JFYWNoKChjYXBzKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpc1BsYWluT2JqZWN0KGNhcHMpICYmICdjYXBhYmlsaXRpZXMnIGluIGNhcHMgJiYgaXNQbGFpbk9iamVjdChjYXBzLmNhcGFiaWxpdGllcykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3BhcnNlQ2FwYWJpbGl0eShjYXBzLmNhcGFiaWxpdGllcylcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIEJTdGFja0xvZ2dlci5kZWJ1ZyhgW19leHRyYWN0QnVpbGREZXRhaWxzXSBFeHRyYWN0ZWQgLSBwcm9qZWN0TmFtZTogJHt0aGlzLnByb2plY3ROYW1lfSwgYnVpbGROYW1lOiAke3RoaXMuYnVpbGROYW1lfSwgYnVpbGRJZGVudGlmaWVyOiAke3RoaXMuYnVpbGRJZGVudGlmaWVyfWApXG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBCU3RhY2tMb2dnZXIuZXJyb3IoYFtfZXh0cmFjdEJ1aWxkRGV0YWlsc10gJHtlcnJvcn1gKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfcGFyc2VDYXBhYmlsaXR5KGNhcGFiaWxpdHk6IHVua25vd24pOiB2b2lkIHtcbiAgICAgICAgaWYgKCFpc1BsYWluT2JqZWN0KGNhcGFiaWxpdHkpKSB7XG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGJzdGFja09wdGlvbnNSYXcgPSBjYXBhYmlsaXR5Wydic3RhY2s6b3B0aW9ucyddXG5cbiAgICAgICAgaWYgKGlzUGxhaW5PYmplY3QoYnN0YWNrT3B0aW9uc1JhdykpIHtcbiAgICAgICAgICAgIGNvbnN0IGJ1aWxkTmFtZSA9IGFzU3RyaW5nKGJzdGFja09wdGlvbnNSYXcuYnVpbGROYW1lKVxuICAgICAgICAgICAgY29uc3QgcHJvamVjdE5hbWUgPSBhc1N0cmluZyhic3RhY2tPcHRpb25zUmF3LnByb2plY3ROYW1lKVxuICAgICAgICAgICAgY29uc3QgYnVpbGRJZGVudGlmaWVyID0gYXNTdHJpbmcoYnN0YWNrT3B0aW9uc1Jhdy5idWlsZElkZW50aWZpZXIpXG5cbiAgICAgICAgICAgIGlmIChidWlsZE5hbWUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmJ1aWxkTmFtZSA9IGJ1aWxkTmFtZVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHByb2plY3ROYW1lKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wcm9qZWN0TmFtZSA9IHByb2plY3ROYW1lXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoYnVpbGRJZGVudGlmaWVyKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5idWlsZElkZW50aWZpZXIgPSBidWlsZElkZW50aWZpZXJcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGxlZ2FjeUJ1aWxkSWRlbnRpZmllciA9IGFzU3RyaW5nKGNhcGFiaWxpdHlbJ2Jyb3dzZXJzdGFjay5idWlsZElkZW50aWZpZXInXSlcbiAgICAgICAgICAgIGNvbnN0IGxlZ2FjeUJ1aWxkTmFtZSA9IGFzU3RyaW5nKGNhcGFiaWxpdHkuYnVpbGQpXG5cbiAgICAgICAgICAgIGlmIChsZWdhY3lCdWlsZElkZW50aWZpZXIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmJ1aWxkSWRlbnRpZmllciA9IGxlZ2FjeUJ1aWxkSWRlbnRpZmllclxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGxlZ2FjeUJ1aWxkTmFtZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuYnVpbGROYW1lID0gbGVnYWN5QnVpbGROYW1lXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgb3IgY3JlYXRlIGFuIGluc3RhbmNlIG9mIE9yY2hlc3RyYXRpb25VdGlsc1xuICAgICAqL1xuICAgIHN0YXRpYyBnZXRJbnN0YW5jZShjb25maWc/OiBPcmNoZXN0cmF0aW9uQ29uZmlnKTogT3JjaGVzdHJhdGlvblV0aWxzIHwgbnVsbCB7XG4gICAgICAgIGlmICghT3JjaGVzdHJhdGlvblV0aWxzLl9pbnN0YW5jZSAmJiBjb25maWcpIHtcbiAgICAgICAgICAgIE9yY2hlc3RyYXRpb25VdGlscy5faW5zdGFuY2UgPSBuZXcgT3JjaGVzdHJhdGlvblV0aWxzKGNvbmZpZylcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gT3JjaGVzdHJhdGlvblV0aWxzLl9pbnN0YW5jZVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBvcmNoZXN0cmF0aW9uIGRhdGEgZnJvbSBjb25maWdcbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0T3JjaGVzdHJhdGlvbkRhdGEoY29uZmlnOiBPcmNoZXN0cmF0aW9uQ29uZmlnKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICAgICAgICBjb25zdCBjb25maWdSZWNvcmQgPSBpc1BsYWluT2JqZWN0KGNvbmZpZykgPyBjb25maWcgOiB7fVxuICAgICAgICBjb25zdCBvcmNoZXN0cmF0aW9uRGF0YSA9IGlzUGxhaW5PYmplY3QoY29uZmlnUmVjb3JkLnRlc3RPcmNoZXN0cmF0aW9uT3B0aW9ucylcbiAgICAgICAgICAgID8gY29uZmlnUmVjb3JkLnRlc3RPcmNoZXN0cmF0aW9uT3B0aW9uc1xuICAgICAgICAgICAgOiB7fVxuICAgICAgICBjb25zdCByZXN1bHQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge31cblxuICAgICAgICBPYmplY3QuZW50cmllcyhvcmNoZXN0cmF0aW9uRGF0YSkuZm9yRWFjaCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICAgICAgICBpZiAoQUxMT1dFRF9PUkNIRVNUUkFUSU9OX0tFWVMuaW5jbHVkZXMoa2V5KSkge1xuICAgICAgICAgICAgICAgIHJlc3VsdFtrZXldID0gdmFsdWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSlcblxuICAgICAgICByZXR1cm4gcmVzdWx0XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHJ1biBzbWFydCBzZWxlY3Rpb24gc2V0dGluZ1xuICAgICAqL1xuICAgIGdldFJ1blNtYXJ0U2VsZWN0aW9uKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5ydW5TbWFydFNlbGVjdGlvblxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBzbWFydCBzZWxlY3Rpb24gbW9kZVxuICAgICAqL1xuICAgIGdldFNtYXJ0U2VsZWN0aW9uTW9kZSgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5zbWFydFNlbGVjdGlvbk1vZGVcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgc21hcnQgc2VsZWN0aW9uIHNvdXJjZVxuICAgICAqL1xuICAgIGdldFNtYXJ0U2VsZWN0aW9uU291cmNlKCk6IFNtYXJ0U2VsZWN0aW9uU291cmNlIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc21hcnRTZWxlY3Rpb25Tb3VyY2VcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgcHJvamVjdCBuYW1lXG4gICAgICovXG4gICAgZ2V0UHJvamVjdE5hbWUoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucHJvamVjdE5hbWVcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgYnVpbGQgbmFtZVxuICAgICAqL1xuICAgIGdldEJ1aWxkTmFtZSgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgICAgICByZXR1cm4gdGhpcy5idWlsZE5hbWVcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgYnVpbGQgaWRlbnRpZmllclxuICAgICAqL1xuICAgIGdldEJ1aWxkSWRlbnRpZmllcigpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgICAgICByZXR1cm4gdGhpcy5idWlsZElkZW50aWZpZXJcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXQgYnVpbGQgZGV0YWlsc1xuICAgICAqL1xuICAgIHNldEJ1aWxkRGV0YWlscyhwcm9qZWN0TmFtZT86IHN0cmluZywgYnVpbGROYW1lPzogc3RyaW5nLCBidWlsZElkZW50aWZpZXI/OiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5wcm9qZWN0TmFtZSA9IHByb2plY3ROYW1lXG4gICAgICAgIHRoaXMuYnVpbGROYW1lID0gYnVpbGROYW1lXG4gICAgICAgIHRoaXMuYnVpbGRJZGVudGlmaWVyID0gYnVpbGRJZGVudGlmaWVyXG4gICAgICAgIEJTdGFja0xvZ2dlci5kZWJ1ZyhgW3NldEJ1aWxkRGV0YWlsc10gU2V0IC0gcHJvamVjdE5hbWU6ICR7dGhpcy5wcm9qZWN0TmFtZX0sIGJ1aWxkTmFtZTogJHt0aGlzLmJ1aWxkTmFtZX0sIGJ1aWxkSWRlbnRpZmllcjogJHt0aGlzLmJ1aWxkSWRlbnRpZmllcn1gKVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldCBydW4gc21hcnQgc2VsZWN0aW9uXG4gICAgICovXG4gICAgcHJpdmF0ZSBfc2V0UnVuU21hcnRTZWxlY3Rpb24oZW5hYmxlZDogYm9vbGVhbiB8IHN0cmluZywgbW9kZTogc3RyaW5nLCBzb3VyY2U6IHN0cmluZ1tdIHwgU21hcnRTZWxlY3Rpb25SZXBvSW5mb1tdIHwgc3RyaW5nIHwgbnVsbCA9IG51bGwpOiB2b2lkIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIFByb3Blcmx5IHZhbGlkYXRlIGVuYWJsZWQgdmFsdWUgLSBvbmx5IGFjY2VwdCB0cnVlIGJvb2xlYW4gb3Igc3RyaW5nIFwidHJ1ZVwiXG4gICAgICAgICAgICB0aGlzLnJ1blNtYXJ0U2VsZWN0aW9uID0gaXNWYWxpZEVuYWJsZWRWYWx1ZShlbmFibGVkKVxuICAgICAgICAgICAgdGhpcy5zbWFydFNlbGVjdGlvbk1vZGUgPSBtb2RlXG4gICAgICAgICAgICB0aGlzLnNtYXJ0U2VsZWN0aW9uU291cmNlID0gW11cblxuICAgICAgICAgICAgLy8gTG9nIHRoZSBjb25maWd1cmF0aW9uIGZvciBkZWJ1Z2dpbmdcbiAgICAgICAgICAgIEJTdGFja0xvZ2dlci5kZWJ1ZyhgU2V0dGluZyBydW5TbWFydFNlbGVjdGlvbjogZW5hYmxlZD0ke3RoaXMucnVuU21hcnRTZWxlY3Rpb259LCBtb2RlPSR7dGhpcy5zbWFydFNlbGVjdGlvbk1vZGV9YClcbiAgICAgICAgICAgIGlmICh0aGlzLnJ1blNtYXJ0U2VsZWN0aW9uKSB7XG4gICAgICAgICAgICAgICAgLy8gTW9kZSB2YWxpZGF0aW9uIC0gb25seSB3aGVuIHNtYXJ0IHNlbGVjdGlvbiBpcyBlbmFibGVkXG4gICAgICAgICAgICAgICAgY29uc3QgdmFsaWRNb2RlcyA9IFtTTUFSVF9TRUxFQ1RJT05fTU9ERV9SRUxFVkFOVF9GSVJTVCwgU01BUlRfU0VMRUNUSU9OX01PREVfUkVMRVZBTlRfT05MWV1cbiAgICAgICAgICAgICAgICBpZiAoIXZhbGlkTW9kZXMuaW5jbHVkZXModGhpcy5zbWFydFNlbGVjdGlvbk1vZGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIEJTdGFja0xvZ2dlci53YXJuKGBJbnZhbGlkIHNtYXJ0IHNlbGVjdGlvbiBtb2RlICcke3RoaXMuc21hcnRTZWxlY3Rpb25Nb2RlfScgcHJvdmlkZWQuIERlZmF1bHRpbmcgdG8gJyR7U01BUlRfU0VMRUNUSU9OX01PREVfUkVMRVZBTlRfRklSU1R9Jy5gKVxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNtYXJ0U2VsZWN0aW9uTW9kZSA9IFNNQVJUX1NFTEVDVElPTl9NT0RFX1JFTEVWQU5UX0ZJUlNUXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChzb3VyY2UgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zbWFydFNlbGVjdGlvblNvdXJjZSA9IG51bGxcbiAgICAgICAgICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLmRlYnVnKCdObyBzb3VyY2UgcHJvdmlkZWQgZm9yIHNtYXJ0IHNlbGVjdGlvbjsgZGVmYXVsdGluZyB0byBudWxsLicpXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KHNvdXJjZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zbWFydFNlbGVjdGlvblNvdXJjZSA9IHNvdXJjZVxuICAgICAgICAgICAgICAgICAgICBCU3RhY2tMb2dnZXIuZGVidWcoYFNtYXJ0IHNlbGVjdGlvbiBzb3VyY2Ugc2V0IHRvIGFycmF5OiAke0pTT04uc3RyaW5naWZ5KHNvdXJjZSl9YClcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBzb3VyY2UgPT09ICdzdHJpbmcnICYmIHNvdXJjZS5lbmRzV2l0aCgnLmpzb24nKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNtYXJ0U2VsZWN0aW9uU291cmNlID0gdGhpcy5fbG9hZFNvdXJjZUZyb21GaWxlKHNvdXJjZSkgfHwgW11cbiAgICAgICAgICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLmRlYnVnKGBTbWFydCBzZWxlY3Rpb24gc291cmNlIGxvYWRlZCBmcm9tIGZpbGU6ICR7c291cmNlfWApXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuX3NldFRlc3RPcmRlcmluZygpXG4gICAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIEJTdGFja0xvZ2dlci5lcnJvcihgW19zZXRSdW5TbWFydFNlbGVjdGlvbl0gJHtlfWApXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQYXJzZSBKU09OIHNvdXJjZSBjb25maWd1cmF0aW9uIGZpbGUgYW5kIGZvcm1hdCBpdCBmb3Igc21hcnQgc2VsZWN0aW9uLlxuICAgICAqXG4gICAgICogQHBhcmFtIGZpbGVQYXRoIC0gUGF0aCB0byB0aGUgSlNPTiBjb25maWd1cmF0aW9uIGZpbGVcbiAgICAgKiBAcmV0dXJucyBGb3JtYXR0ZWQgbGlzdCBvZiByZXBvc2l0b3J5IGNvbmZpZ3VyYXRpb25zXG4gICAgICovXG4gICAgcHJpdmF0ZSBfbG9hZFNvdXJjZUZyb21GaWxlKGZpbGVQYXRoOiBzdHJpbmcpOiBTbWFydFNlbGVjdGlvblJlcG9JbmZvW10ge1xuICAgICAgICBpZiAoIWZzLmV4aXN0c1N5bmMoZmlsZVBhdGgpKSB7XG4gICAgICAgICAgICBCU3RhY2tMb2dnZXIuZXJyb3IoYFNvdXJjZSBmaWxlICcke2ZpbGVQYXRofScgZG9lcyBub3QgZXhpc3QuYClcbiAgICAgICAgICAgIHJldHVybiBbXVxuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGRhdGE6IHVua25vd24gPSBudWxsXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBmaWxlQ29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhmaWxlUGF0aCwgJ3V0ZjgnKVxuICAgICAgICAgICAgZGF0YSA9IEpTT04ucGFyc2UoZmlsZUNvbnRlbnQpXG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBjb25zdCBtZXNzYWdlID0gZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpXG4gICAgICAgICAgICBCU3RhY2tMb2dnZXIuZXJyb3IoYEVycm9yIHBhcnNpbmcgSlNPTiBmcm9tIHNvdXJjZSBmaWxlICcke2ZpbGVQYXRofSc6ICR7bWVzc2FnZX1gKVxuICAgICAgICAgICAgcmV0dXJuIFtdXG4gICAgICAgIH1cblxuICAgICAgICAvLyBDYWNoZSBmZWF0dXJlIGJyYW5jaCBtYXBwaW5ncyBmcm9tIGVudiB0byBhdm9pZCByZXBlYXRlZCBwYXJzaW5nXG4gICAgICAgIGxldCBmZWF0dXJlQnJhbmNoRW52TWFwOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHwgbnVsbCA9IG51bGxcblxuICAgICAgICBjb25zdCBsb2FkRmVhdHVyZUJyYW5jaE1hcHMgPSAoKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9PiB7XG4gICAgICAgICAgICBjb25zdCBlbnZWYXIgPSBwcm9jZXNzLmVudi5CUk9XU0VSU1RBQ0tfT1JDSEVTVFJBVElPTl9TTUFSVF9TRUxFQ1RJT05fRkVBVFVSRV9CUkFOQ0hFUyB8fCAnJ1xuICAgICAgICAgICAgbGV0IGVudk1hcDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9XG5cbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgZW52TWFwID0gZW52VmFyLnN0YXJ0c1dpdGgoJ3snKSAmJiBlbnZWYXIuZW5kc1dpdGgoJ30nKVxuICAgICAgICAgICAgICAgICAgICA/IEpTT04ucGFyc2UoZW52VmFyKVxuICAgICAgICAgICAgICAgICAgICA6IGVudlZhci5zcGxpdCgnLCcpXG4gICAgICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKGl0ZW0gPT4gaXRlbS5pbmNsdWRlcygnOicpKVxuICAgICAgICAgICAgICAgICAgICAgICAgLnJlZHVjZSgoYWNjOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LCBpdGVtOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBba2V5LCB2YWx1ZV0gPSBpdGVtLnNwbGl0KCc6JylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoa2V5ICYmIHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjY1trZXkudHJpbSgpXSA9IHZhbHVlLnRyaW0oKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYWNjXG4gICAgICAgICAgICAgICAgICAgICAgICB9LCB7fSlcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLmVycm9yKGBFcnJvciBwYXJzaW5nIGZlYXR1cmUgYnJhbmNoIG1hcHBpbmdzOiAke2Vycm9yfWApXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIEJTdGFja0xvZ2dlci5kZWJ1ZyhgRmVhdHVyZSBicmFuY2ggbWFwcGluZ3MgZnJvbSBlbnY6ICR7SlNPTi5zdHJpbmdpZnkoZW52TWFwKX1gKVxuICAgICAgICAgICAgcmV0dXJuIGVudk1hcFxuICAgICAgICB9XG5cbiAgICAgICAgZmVhdHVyZUJyYW5jaEVudk1hcCA9IGxvYWRGZWF0dXJlQnJhbmNoTWFwcygpXG5cbiAgICAgICAgY29uc3QgZ2V0RmVhdHVyZUJyYW5jaCA9IChuYW1lOiBzdHJpbmcsIHJlcG9JbmZvOiBTbWFydFNlbGVjdGlvblJlcG9JbmZvKTogc3RyaW5nIHwgbnVsbCA9PiB7XG4gICAgICAgICAgICAvLyAxLiBDaGVjayBpbiBlbnZpcm9ubWVudCB2YXJpYWJsZSBtYXBcbiAgICAgICAgICAgIGlmIChmZWF0dXJlQnJhbmNoRW52TWFwICYmIGZlYXR1cmVCcmFuY2hFbnZNYXBbbmFtZV0pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmVhdHVyZUJyYW5jaEVudk1hcFtuYW1lXVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gMi4gQ2hlY2sgaW4gcmVwb19pbmZvXG4gICAgICAgICAgICBpZiAocmVwb0luZm8uZmVhdHVyZUJyYW5jaCkge1xuICAgICAgICAgICAgICAgIHJldHVybiByZXBvSW5mby5mZWF0dXJlQnJhbmNoXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHR5cGVvZiBkYXRhID09PSAnb2JqZWN0JyAmJiBkYXRhICE9PSBudWxsICYmICFBcnJheS5pc0FycmF5KGRhdGEpKSB7XG4gICAgICAgICAgICBjb25zdCBmb3JtYXR0ZWREYXRhOiBTbWFydFNlbGVjdGlvblJlcG9JbmZvW10gPSBbXVxuICAgICAgICAgICAgY29uc3QgbmFtZVBhdHRlcm4gPSAvXltBLVowLTlfXSskL1xuXG4gICAgICAgICAgICBmb3IgKGNvbnN0IFtuYW1lLCByZXBvSW5mb10gb2YgT2JqZWN0LmVudHJpZXMoZGF0YSkpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWlzUGxhaW5PYmplY3QocmVwb0luZm8pKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgY29uc3QgdHlwZWRSZXBvSW5mbyA9IHJlcG9JbmZvIGFzIFNtYXJ0U2VsZWN0aW9uUmVwb0luZm9cblxuICAgICAgICAgICAgICAgIC8vIFZhbGlkYXRlIHRoYXQgdXJsIGlzIGEgc3RyaW5nIGFuZCBpcyBwcmVzZW50XG4gICAgICAgICAgICAgICAgaWYgKCF0eXBlZFJlcG9JbmZvLnVybCB8fCB0eXBlb2YgdHlwZWRSZXBvSW5mby51cmwgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgICAgIEJTdGFja0xvZ2dlci53YXJuKGBSZXBvc2l0b3J5IFVSTCBpcyBtaXNzaW5nIG9yIGludmFsaWQgZm9yIHNvdXJjZSAnJHtuYW1lfSc6ICR7SlNPTi5zdHJpbmdpZnkocmVwb0luZm8pfWApXG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gVmFsaWRhdGUgdGhhdCBiYXNlQnJhbmNoLCBpZiBwcm92aWRlZCwgaXMgYSBzdHJpbmdcbiAgICAgICAgICAgICAgICBpZiAodHlwZWRSZXBvSW5mby5iYXNlQnJhbmNoICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIHR5cGVkUmVwb0luZm8uYmFzZUJyYW5jaCAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLndhcm4oYEJhc2UgYnJhbmNoIG11c3QgYmUgYSBzdHJpbmcgZm9yIHNvdXJjZSAnJHtuYW1lfSc6ICR7SlNPTi5zdHJpbmdpZnkocmVwb0luZm8pfWApXG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gVmFsaWRhdGUgdGhhdCBmZWF0dXJlQnJhbmNoLCBpZiBwcm92aWRlZCwgaXMgYSBzdHJpbmdcbiAgICAgICAgICAgICAgICBpZiAodHlwZWRSZXBvSW5mby5mZWF0dXJlQnJhbmNoICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIHR5cGVkUmVwb0luZm8uZmVhdHVyZUJyYW5jaCAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLndhcm4oYEZlYXR1cmUgYnJhbmNoIG11c3QgYmUgYSBzdHJpbmcgZm9yIHNvdXJjZSAnJHtuYW1lfSc6ICR7SlNPTi5zdHJpbmdpZnkocmVwb0luZm8pfWApXG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gVmFsaWRhdGUgbmFtZVxuICAgICAgICAgICAgICAgIGlmICghbmFtZVBhdHRlcm4udGVzdChuYW1lKSkge1xuICAgICAgICAgICAgICAgICAgICBCU3RhY2tMb2dnZXIud2FybihgSW52YWxpZCBzb3VyY2UgaWRlbnRpZmllciBmb3JtYXQgZm9yICcke25hbWV9JzogJHtKU09OLnN0cmluZ2lmeShyZXBvSW5mbyl9YClcbiAgICAgICAgICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBWYWxpZGF0ZSBsZW5ndGhcbiAgICAgICAgICAgICAgICBpZiAobmFtZS5sZW5ndGggPiAzMCB8fCBuYW1lLmxlbmd0aCA8IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLndhcm4oYFNvdXJjZSBpZGVudGlmaWVyICcke25hbWV9JyBtdXN0IGhhdmUgYSBsZW5ndGggYmV0d2VlbiAxIGFuZCAzMCBjaGFyYWN0ZXJzLmApXG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gT25seSBjb25zaWRlciB1cmwsIGJhc2VCcmFuY2gsIGFuZCBmZWF0dXJlQnJhbmNoIC0gaWdub3JlIGFsbCBvdGhlciBrZXlzXG4gICAgICAgICAgICAgICAgY29uc3QgZmVhdHVyZUJyYW5jaCA9IGdldEZlYXR1cmVCcmFuY2gobmFtZSwgdHlwZWRSZXBvSW5mbylcblxuICAgICAgICAgICAgICAgIGNvbnN0IGZpbHRlcmVkUmVwb0luZm86IFNtYXJ0U2VsZWN0aW9uUmVwb0luZm8gPSB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICAgICAgICAgIHVybDogdHlwZWRSZXBvSW5mby51cmwsXG4gICAgICAgICAgICAgICAgICAgIGZlYXR1cmVCcmFuY2g6IGZlYXR1cmVCcmFuY2ggPz8gdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gT25seSBhZGQgYmFzZUJyYW5jaCBpZiBpdCdzIHByb3ZpZGVkXG4gICAgICAgICAgICAgICAgaWYgKHR5cGVkUmVwb0luZm8uYmFzZUJyYW5jaCkge1xuICAgICAgICAgICAgICAgICAgICBmaWx0ZXJlZFJlcG9JbmZvLmJhc2VCcmFuY2ggPSB0eXBlZFJlcG9JbmZvLmJhc2VCcmFuY2hcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoIWZpbHRlcmVkUmVwb0luZm8uZmVhdHVyZUJyYW5jaCB8fCBmaWx0ZXJlZFJlcG9JbmZvLmZlYXR1cmVCcmFuY2ggPT09ICcnKSB7XG4gICAgICAgICAgICAgICAgICAgIEJTdGFja0xvZ2dlci53YXJuKGBGZWF0dXJlIGJyYW5jaCBub3Qgc3BlY2lmaWVkIGZvciBzb3VyY2UgJyR7bmFtZX0nOiAke0pTT04uc3RyaW5naWZ5KHJlcG9JbmZvKX1gKVxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChmaWx0ZXJlZFJlcG9JbmZvLmJhc2VCcmFuY2ggJiYgZmlsdGVyZWRSZXBvSW5mby5iYXNlQnJhbmNoID09PSBmaWx0ZXJlZFJlcG9JbmZvLmZlYXR1cmVCcmFuY2gpIHtcbiAgICAgICAgICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLndhcm4oYEZlYXR1cmUgYnJhbmNoIGFuZCBiYXNlIGJyYW5jaCBjYW5ub3QgYmUgdGhlIHNhbWUgZm9yIHNvdXJjZSAnJHtuYW1lfSc6ICR7SlNPTi5zdHJpbmdpZnkocmVwb0luZm8pfWApXG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgZm9ybWF0dGVkRGF0YS5wdXNoKGZpbHRlcmVkUmVwb0luZm8pXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBmb3JtYXR0ZWREYXRhXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShkYXRhKSkge1xuICAgICAgICAgICAgcmV0dXJuIGRhdGEuZmlsdGVyKGlzUGxhaW5PYmplY3QpIGFzIFNtYXJ0U2VsZWN0aW9uUmVwb0luZm9bXVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIFtdXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0IHRlc3Qgb3JkZXJpbmcgYmFzZWQgb24gcHJpb3JpdGllc1xuICAgICAqL1xuICAgIHByaXZhdGUgX3NldFRlc3RPcmRlcmluZygpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMucnVuU21hcnRTZWxlY3Rpb24pIHsgLy8gSGlnaGVzdCBwcmlvcml0eVxuICAgICAgICAgICAgdGhpcy50ZXN0T3JkZXJpbmcuZW5hYmxlKFJVTl9TTUFSVF9TRUxFQ1RJT04pXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnRlc3RPcmRlcmluZy5kaXNhYmxlKClcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrIGlmIHRlc3Qgb3JkZXJpbmcgaXMgZW5hYmxlZFxuICAgICAqL1xuICAgIHRlc3RPcmRlcmluZ0VuYWJsZWQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLnRlc3RPcmRlcmluZy5nZXRFbmFibGVkKClcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGVzdCBvcmRlcmluZyBuYW1lXG4gICAgICovXG4gICAgZ2V0VGVzdE9yZGVyaW5nTmFtZSgpOiBzdHJpbmcgfCBudWxsIHtcbiAgICAgICAgaWYgKHRoaXMudGVzdE9yZGVyaW5nLmdldEVuYWJsZWQoKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudGVzdE9yZGVyaW5nLmdldE5hbWUoKVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRlc3Qgb3JjaGVzdHJhdGlvbiBtZXRhZGF0YVxuICAgICAqL1xuICAgIGdldFRlc3RPcmNoZXN0cmF0aW9uTWV0YWRhdGEoKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICAgICAgICBjb25zdCBkYXRhID0ge1xuICAgICAgICAgICAgJ3J1bl9zbWFydF9zZWxlY3Rpb24nOiB7XG4gICAgICAgICAgICAgICAgJ2VuYWJsZWQnOiB0aGlzLmdldFJ1blNtYXJ0U2VsZWN0aW9uKCksXG4gICAgICAgICAgICAgICAgJ21vZGUnOiB0aGlzLmdldFNtYXJ0U2VsZWN0aW9uTW9kZSgpLFxuICAgICAgICAgICAgICAgICdzb3VyY2UnOiB0aGlzLmdldFNtYXJ0U2VsZWN0aW9uU291cmNlKClcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZGF0YVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBidWlsZCBzdGFydCBkYXRhXG4gICAgICovXG4gICAgZ2V0QnVpbGRTdGFydERhdGEoKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgcnVuX3NtYXJ0X3NlbGVjdGlvbjoge1xuICAgICAgICAgICAgICAgIGVuYWJsZWQ6IHRoaXMuZ2V0UnVuU21hcnRTZWxlY3Rpb24oKSxcbiAgICAgICAgICAgICAgICBtb2RlOiB0aGlzLmdldFNtYXJ0U2VsZWN0aW9uTW9kZSgpXG4gICAgICAgICAgICAgICAgLy8gTm90IHNlbmRpbmcgXCJzb3VyY2VcIiB0byBUSCBidWlsZHNcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgT3JjaGVzdHJhdGlvblV0aWxzXG4iLCAiaW1wb3J0IHR5cGUgeyBDYXBhYmlsaXRpZXMsIE9wdGlvbnMgfSBmcm9tICdAd2Rpby90eXBlcydcblxuaW1wb3J0IHsgQlNUQUNLX1NFUlZJQ0VfVkVSU0lPTiwgQlJPV1NFUlNUQUNLX1RFU1RIVUJfVVVJRCwgV0RJT19OQU1JTkdfUFJFRklYIH0gZnJvbSAnLi9jb25zdGFudHMuanMnXG5pbXBvcnQgdHlwZSB7IEJyb3dzZXJzdGFja0NvbmZpZywgQ3JlZGVudGlhbHNGb3JDcmFzaFJlcG9ydFVwbG9hZCwgVXNlckNvbmZpZ2ZvclJlcG9ydGluZyB9IGZyb20gJy4vdHlwZXMuanMnXG5pbXBvcnQgeyBERUZBVUxUX1JFUVVFU1RfQ09ORklHLCBnZXRPYnNlcnZhYmlsaXR5S2V5LCBnZXRPYnNlcnZhYmlsaXR5VXNlciB9IGZyb20gJy4vdXRpbC5qcydcbmltcG9ydCB7IEJTdGFja0xvZ2dlciB9IGZyb20gJy4vYnN0YWNrTG9nZ2VyLmpzJ1xuaW1wb3J0IEFQSVV0aWxzIGZyb20gJy4vY2xpL2FwaVV0aWxzLmpzJ1xuXG5pbXBvcnQgeyBfZmV0Y2ggYXMgZmV0Y2ggfSBmcm9tICcuL2ZldGNoV3JhcHBlci5qcydcblxudHlwZSBEaWN0ID0gUmVjb3JkPHN0cmluZywgdW5rbm93bj5cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ3Jhc2hSZXBvcnRlciB7XG4gICAgLyogVXNlciB0ZXN0IGNvbmZpZyBmb3IgYnVpbGQgcnVuIG1pbnVzIFBJSSAqL1xuICAgIHB1YmxpYyBzdGF0aWMgdXNlckNvbmZpZ0ZvclJlcG9ydGluZzogVXNlckNvbmZpZ2ZvclJlcG9ydGluZyA9IHt9XG4gICAgLyogVXNlciBjcmVkZW50aWFscyB1c2VkIGZvciByZXBvcnRpbmcgY3Jhc2hlcyBpbiBicm93c2Vyc3RhY2sgc2VydmljZSAqL1xuICAgIHByaXZhdGUgc3RhdGljIGNyZWRlbnRpYWxzRm9yQ3Jhc2hSZXBvcnRVcGxvYWQ6IENyZWRlbnRpYWxzRm9yQ3Jhc2hSZXBvcnRVcGxvYWQgPSB7fVxuXG4gICAgc3RhdGljIHNldENyZWRlbnRpYWxzRm9yQ3Jhc2hSZXBvcnRVcGxvYWQob3B0aW9uczogQnJvd3NlcnN0YWNrQ29uZmlnICYgT3B0aW9ucy5UZXN0cnVubmVyLCBjb25maWc6IE9wdGlvbnMuVGVzdHJ1bm5lcikge1xuICAgICAgICB0aGlzLmNyZWRlbnRpYWxzRm9yQ3Jhc2hSZXBvcnRVcGxvYWQgPSB7XG4gICAgICAgICAgICB1c2VybmFtZTogZ2V0T2JzZXJ2YWJpbGl0eVVzZXIob3B0aW9ucywgY29uZmlnKSxcbiAgICAgICAgICAgIHBhc3N3b3JkOiBnZXRPYnNlcnZhYmlsaXR5S2V5KG9wdGlvbnMsIGNvbmZpZylcbiAgICAgICAgfVxuICAgICAgICBwcm9jZXNzLmVudi5DUkVERU5USUFMU19GT1JfQ1JBU0hfUkVQT1JUSU5HID0gSlNPTi5zdHJpbmdpZnkodGhpcy5jcmVkZW50aWFsc0ZvckNyYXNoUmVwb3J0VXBsb2FkKVxuICAgIH1cblxuICAgIHN0YXRpYyBzZXRDb25maWdEZXRhaWxzKHVzZXJDb25maWc6IE9wdGlvbnMuVGVzdHJ1bm5lciwgY2FwYWJpbGl0aWVzOiBDYXBhYmlsaXRpZXMuVGVzdHJ1bm5lckNhcGFiaWxpdGllcywgb3B0aW9uczogQnJvd3NlcnN0YWNrQ29uZmlnICYgT3B0aW9ucy5UZXN0cnVubmVyKSB7XG4gICAgICAgIGNvbnN0IGNvbmZpZ1dpdGhvdXRQSUkgPSB0aGlzLmZpbHRlclBJSSh1c2VyQ29uZmlnKVxuICAgICAgICBjb25zdCBmaWx0ZXJlZENhcGFiaWxpdGllcyA9IHRoaXMuZmlsdGVyQ2FwYWJpbGl0aWVzKGNhcGFiaWxpdGllcylcbiAgICAgICAgdGhpcy51c2VyQ29uZmlnRm9yUmVwb3J0aW5nID0ge1xuICAgICAgICAgICAgZnJhbWV3b3JrOiB1c2VyQ29uZmlnLmZyYW1ld29yayxcbiAgICAgICAgICAgIHNlcnZpY2VzOiBjb25maWdXaXRob3V0UElJLnNlcnZpY2VzLFxuICAgICAgICAgICAgY2FwYWJpbGl0aWVzOiBmaWx0ZXJlZENhcGFiaWxpdGllcyxcbiAgICAgICAgICAgIGVudjoge1xuICAgICAgICAgICAgICAgICdCUk9XU0VSU1RBQ0tfQlVJTEQnOiBwcm9jZXNzLmVudi5CUk9XU0VSU1RBQ0tfQlVJTEQsXG4gICAgICAgICAgICAgICAgJ0JST1dTRVJTVEFDS19CVUlMRF9OQU1FJzogcHJvY2Vzcy5lbnYuQlJPV1NFUlNUQUNLX0JVSUxEX05BTUUsXG4gICAgICAgICAgICAgICAgJ0JVSUxEX1RBRyc6IHByb2Nlc3MuZW52LkJVSUxEX1RBR1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHByb2Nlc3MuZW52LlVTRVJfQ09ORklHX0ZPUl9SRVBPUlRJTkcgPSBKU09OLnN0cmluZ2lmeSh0aGlzLnVzZXJDb25maWdGb3JSZXBvcnRpbmcpXG4gICAgICAgIHRoaXMuc2V0Q3JlZGVudGlhbHNGb3JDcmFzaFJlcG9ydFVwbG9hZChvcHRpb25zLCB1c2VyQ29uZmlnKVxuICAgIH1cblxuICAgIHN0YXRpYyBhc3luYyB1cGxvYWRDcmFzaFJlcG9ydChleGNlcHRpb246IHN0cmluZywgc3RhY2tUcmFjZTogc3RyaW5nKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuY3JlZGVudGlhbHNGb3JDcmFzaFJlcG9ydFVwbG9hZC51c2VybmFtZSB8fCAhdGhpcy5jcmVkZW50aWFsc0ZvckNyYXNoUmVwb3J0VXBsb2FkLnBhc3N3b3JkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jcmVkZW50aWFsc0ZvckNyYXNoUmVwb3J0VXBsb2FkID0gcHJvY2Vzcy5lbnYuQ1JFREVOVElBTFNfRk9SX0NSQVNIX1JFUE9SVElORyAhPT0gdW5kZWZpbmVkID8gSlNPTi5wYXJzZShwcm9jZXNzLmVudi5DUkVERU5USUFMU19GT1JfQ1JBU0hfUkVQT1JUSU5HKSA6IHRoaXMuY3JlZGVudGlhbHNGb3JDcmFzaFJlcG9ydFVwbG9hZFxuICAgICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgcmV0dXJuIEJTdGFja0xvZ2dlci5lcnJvcihgW0NyYXNoX1JlcG9ydF9VcGxvYWRdIEZhaWxlZCB0byBwYXJzZSB1c2VyIGNyZWRlbnRpYWxzIHdoaWxlIHJlcG9ydGluZyBjcmFzaCBkdWUgdG8gJHtlcnJvcn1gKVxuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy5jcmVkZW50aWFsc0ZvckNyYXNoUmVwb3J0VXBsb2FkLnVzZXJuYW1lIHx8ICF0aGlzLmNyZWRlbnRpYWxzRm9yQ3Jhc2hSZXBvcnRVcGxvYWQucGFzc3dvcmQpIHtcbiAgICAgICAgICAgIHJldHVybiBCU3RhY2tMb2dnZXIuZXJyb3IoJ1tDcmFzaF9SZXBvcnRfVXBsb2FkXSBGYWlsZWQgdG8gcGFyc2UgdXNlciBjcmVkZW50aWFscyB3aGlsZSByZXBvcnRpbmcgY3Jhc2gnKVxuICAgICAgICB9XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmIChPYmplY3Qua2V5cyh0aGlzLnVzZXJDb25maWdGb3JSZXBvcnRpbmcpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHRoaXMudXNlckNvbmZpZ0ZvclJlcG9ydGluZyA9IHByb2Nlc3MuZW52LlVTRVJfQ09ORklHX0ZPUl9SRVBPUlRJTkcgIT09IHVuZGVmaW5lZCA/IEpTT04ucGFyc2UocHJvY2Vzcy5lbnYuVVNFUl9DT05GSUdfRk9SX1JFUE9SVElORykgOiB7fVxuICAgICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLmVycm9yKGBbQ3Jhc2hfUmVwb3J0X1VwbG9hZF0gRmFpbGVkIHRvIHBhcnNlIHVzZXIgY29uZmlnIHdoaWxlIHJlcG9ydGluZyBjcmFzaCBkdWUgdG8gJHtlcnJvcn1gKVxuICAgICAgICAgICAgdGhpcy51c2VyQ29uZmlnRm9yUmVwb3J0aW5nID0ge31cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGRhdGEgPSB7XG4gICAgICAgICAgICBoYXNoZWRfaWQ6IHByb2Nlc3MuZW52W0JST1dTRVJTVEFDS19URVNUSFVCX1VVSURdLFxuICAgICAgICAgICAgb2JzZXJ2YWJpbGl0eV92ZXJzaW9uOiB7XG4gICAgICAgICAgICAgICAgZnJhbWV3b3JrTmFtZTogV0RJT19OQU1JTkdfUFJFRklYICsgKHRoaXMudXNlckNvbmZpZ0ZvclJlcG9ydGluZy5mcmFtZXdvcmsgfHwgJ251bGwnKSxcbiAgICAgICAgICAgICAgICBzZGtWZXJzaW9uOiBCU1RBQ0tfU0VSVklDRV9WRVJTSU9OXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZXhjZXB0aW9uOiB7XG4gICAgICAgICAgICAgICAgZXJyb3I6IGV4Y2VwdGlvbi50b1N0cmluZygpLFxuICAgICAgICAgICAgICAgIHN0YWNrVHJhY2U6IHN0YWNrVHJhY2VcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjb25maWc6IHRoaXMudXNlckNvbmZpZ0ZvclJlcG9ydGluZ1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHVybCA9IGAke0FQSVV0aWxzLkRBVEFfRU5EUE9JTlR9L2FwaS92MS9hbmFseXRpY3NgXG5cbiAgICAgICAgY29uc3QgZW5jb2RlZEF1dGggPSBCdWZmZXIuZnJvbShgJHt0aGlzLmNyZWRlbnRpYWxzRm9yQ3Jhc2hSZXBvcnRVcGxvYWQudXNlcm5hbWV9OiR7dGhpcy5jcmVkZW50aWFsc0ZvckNyYXNoUmVwb3J0VXBsb2FkLnBhc3N3b3JkfWAsICd1dGY4JykudG9TdHJpbmcoJ2Jhc2U2NCcpXG4gICAgICAgIGNvbnN0IGhlYWRlcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgICAgICAgICAuLi5ERUZBVUxUX1JFUVVFU1RfQ09ORklHLmhlYWRlcnMsXG4gICAgICAgICAgICBBdXRob3JpemF0aW9uOiBgQmFzaWMgJHtlbmNvZGVkQXV0aH1gLFxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh1cmwsIHtcbiAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoZGF0YSksXG4gICAgICAgICAgICBoZWFkZXJzXG4gICAgICAgIH0pXG5cbiAgICAgICAgaWYgKHJlc3BvbnNlLm9rKSB7XG4gICAgICAgICAgICBsZXQgYm9keSA9IGF3YWl0IHJlc3BvbnNlLnRleHQoKVxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBib2R5ID0gSlNPTi5zdHJpbmdpZnkoSlNPTi5wYXJzZShib2R5KSlcbiAgICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgICAgIC8vIFJlc3BvbnNlIGlzIG5vdCBKU09OLCB1c2UgdGV4dCBhcy1pc1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLmRlYnVnKGBbQ3Jhc2hfUmVwb3J0X1VwbG9hZF0gU3VjY2VzcyByZXNwb25zZTogJHtib2R5fWApXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBCU3RhY2tMb2dnZXIuZXJyb3IoYFtDcmFzaF9SZXBvcnRfVXBsb2FkXSBGYWlsZWQgZHVlIHRvICR7cmVzcG9uc2UuYm9keX1gKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgc3RhdGljIHJlY3Vyc2l2ZWx5UmVkYWN0S2V5c0Zyb21PYmplY3Qob2JqOiBEaWN0IHwgQXJyYXk8RGljdD4sIGtleXM6IHN0cmluZ1tdKSB7XG4gICAgICAgIGlmICghb2JqKSB7XG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShvYmopKSB7XG4gICAgICAgICAgICBvYmoubWFwKGVsZSA9PiB0aGlzLnJlY3Vyc2l2ZWx5UmVkYWN0S2V5c0Zyb21PYmplY3QoZWxlLCBrZXlzKSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgcHJvcCBpbiBvYmopIHtcbiAgICAgICAgICAgICAgICBpZiAoa2V5cy5pbmNsdWRlcyhwcm9wLnRvTG93ZXJDYXNlKCkpKSB7XG4gICAgICAgICAgICAgICAgICAgIG9ialtwcm9wXSA9ICdbUkVEQUNURURdJ1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIG9ialtwcm9wXSA9PT0gJ29iamVjdCcgJiYgb2JqW3Byb3BdICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVjdXJzaXZlbHlSZWRhY3RLZXlzRnJvbU9iamVjdChvYmpbcHJvcF0gYXMgRGljdCB8IEFycmF5PERpY3Q+LCBrZXlzKVxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIG9ialtwcm9wXSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhcnNlZCA9IEpTT04ucGFyc2Uob2JqW3Byb3BdIGFzIHN0cmluZylcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgcGFyc2VkID09PSAnb2JqZWN0JyAmJiBwYXJzZWQgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlY3Vyc2l2ZWx5UmVkYWN0S2V5c0Zyb21PYmplY3QocGFyc2VkIGFzIERpY3QgfCBBcnJheTxEaWN0Piwga2V5cylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmpbcHJvcF0gPSBKU09OLnN0cmluZ2lmeShwYXJzZWQpXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gTm90IHZhbGlkIEpTT04sIGxlYXZlIGFzLWlzXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzdGF0aWMgZGVsZXRlUElJS2V5c0Zyb21PYmplY3Qob2JqOiB7IFtrZXk6IHN0cmluZ106IHVua25vd24gfSkge1xuICAgICAgICBpZiAoIW9iaikge1xuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgICAgWyd1c2VyJywgJ3VzZXJuYW1lJywgJ2tleScsICdhY2Nlc3NLZXknXS5mb3JFYWNoKGtleSA9PiBkZWxldGUgb2JqW2tleV0pXG4gICAgfVxuXG4gICAgc3RhdGljIGZpbHRlckNhcGFiaWxpdGllcyhjYXBhYmlsaXRpZXM6IENhcGFiaWxpdGllcy5UZXN0cnVubmVyQ2FwYWJpbGl0aWVzKSB7XG4gICAgICAgIGNvbnN0IGNhcHNDb3B5ID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShjYXBhYmlsaXRpZXMpKVxuICAgICAgICB0aGlzLnJlY3Vyc2l2ZWx5UmVkYWN0S2V5c0Zyb21PYmplY3QoY2Fwc0NvcHksIFsnZXh0ZW5zaW9ucyddKVxuICAgICAgICByZXR1cm4gY2Fwc0NvcHlcbiAgICB9XG5cbiAgICBzdGF0aWMgZmlsdGVyUElJKHVzZXJDb25maWc6IE9wdGlvbnMuVGVzdHJ1bm5lcikge1xuICAgICAgICBjb25zdCBjb25maWdXaXRob3V0UElJID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh1c2VyQ29uZmlnKSlcbiAgICAgICAgdGhpcy5kZWxldGVQSUlLZXlzRnJvbU9iamVjdChjb25maWdXaXRob3V0UElJKVxuICAgICAgICBjb25zdCBmaW5hbFNlcnZpY2VzID0gW11cbiAgICAgICAgY29uc3QgaW5pdGlhbFNlcnZpY2VzID0gY29uZmlnV2l0aG91dFBJSS5zZXJ2aWNlc1xuICAgICAgICBkZWxldGUgY29uZmlnV2l0aG91dFBJSS5zZXJ2aWNlc1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBzZXJ2aWNlQXJyYXkgb2YgaW5pdGlhbFNlcnZpY2VzKSB7XG4gICAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoc2VydmljZUFycmF5KSAmJiBzZXJ2aWNlQXJyYXkubGVuZ3RoID49IDIgJiYgc2VydmljZUFycmF5WzBdID09PSAnYnJvd3NlcnN0YWNrJykge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpZHggPSAxOyBpZHggPCBzZXJ2aWNlQXJyYXkubGVuZ3RoOyBpZHgrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZWxldGVQSUlLZXlzRnJvbU9iamVjdChzZXJ2aWNlQXJyYXlbaWR4XSlcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZXJ2aWNlQXJyYXlbaWR4XSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEhhbmRsZSBib3RoIG5ldyB0ZXN0UmVwb3J0aW5nT3B0aW9ucyBhbmQgbGVnYWN5IHRlc3RPYnNlcnZhYmlsaXR5T3B0aW9uc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGVsZXRlUElJS2V5c0Zyb21PYmplY3Qoc2VydmljZUFycmF5W2lkeF0udGVzdFJlcG9ydGluZ09wdGlvbnMpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZWxldGVQSUlLZXlzRnJvbU9iamVjdChzZXJ2aWNlQXJyYXlbaWR4XS50ZXN0T2JzZXJ2YWJpbGl0eU9wdGlvbnMpXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZmluYWxTZXJ2aWNlcy5wdXNoKHNlcnZpY2VBcnJheSlcbiAgICAgICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgLyogV3JvbmcgY29uZmlndXJhdGlvbiBsaWtlIHN0cmluZ3MgaW5zdGVhZCBvZiBqc29uIG9iamVjdHMgY291bGQgYnJlYWsgdGhpcyBtZXRob2QsIG5lZWRzIG5vIGFjdGlvbiAqL1xuICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLmVycm9yKGBFcnJvciBpbiBwYXJzaW5nIHVzZXIgY29uZmlnIFBJSSB3aXRoIGVycm9yICR7ZXJyID8gKChlcnIgYXMgRXJyb3IpLnN0YWNrIHx8IGVycikgOiBlcnJ9YClcbiAgICAgICAgICAgIHJldHVybiBjb25maWdXaXRob3V0UElJXG4gICAgICAgIH1cbiAgICAgICAgY29uZmlnV2l0aG91dFBJSS5zZXJ2aWNlcyA9IGZpbmFsU2VydmljZXNcbiAgICAgICAgcmV0dXJuIGNvbmZpZ1dpdGhvdXRQSUlcbiAgICB9XG59XG4iLCAiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnXG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnXG5cbmltcG9ydCB0eXBlIHsgT3B0aW9ucyB9IGZyb20gJ0B3ZGlvL3R5cGVzJ1xuXG5pbXBvcnQgeyBCU3RhY2tMb2dnZXIgfSBmcm9tICcuL2JzdGFja0xvZ2dlci5qcydcbmltcG9ydCB7XG4gICAgQlJPV1NFUlNUQUNLX0RJU0FCTEVfQVVUT19DQVBUVVJFX0xPR1MsXG4gICAgQ09NUE9VTkRfU0VDUkVUX1NVRkZJWEVTX0NBTUVMLFxuICAgIENPTVBPVU5EX1NFQ1JFVF9TVUZGSVhFU19TTkFLRSxcbiAgICBQRU1fQkxPQ0tfUkVHRVgsXG4gICAgUEVNX1VOVEVSTUlOQVRFRF9SRUdFWCxcbiAgICBVUkxfVVNFUklORk9fUkVHRVgsXG4gICAgQlJPV1NFUlNUQUNLX1dESU9fQ09ORklHX0ZJTEVfUEFUSCxcbiAgICBCUk9XU0VSU1RBQ0tfV0RJT19DT05GSUdfU1RSQVRFR1ksXG4gICAgQ0FQVFVSRV9DT05GSUdfSU1QT1JUX0RFUFRILFxuICAgIERFRkFVTFRfV0RJT19DT05GSUdfQkFTRU5BTUUsXG4gICAgTUFYX0NBUFRVUkVEX0NPTkZJR19GSUxFUyxcbiAgICBNQVhfQ0FQVFVSRURfQ09ORklHX0ZJTEVfQllURVMsXG4gICAgTUFYX1BBQ0tBR0VfSlNPTl9XQUxLX1VQLFxuICAgIFJFREFDVEVEX0tFWVMsXG4gICAgU1VQUE9SVEVEX1dESU9fQ09ORklHX0VYVEVOU0lPTlMsXG4gICAgV0RJT19DTElfU1VCQ09NTUFORFNcbn0gZnJvbSAnLi9jb25zdGFudHMuanMnXG5cbmV4cG9ydCBpbnRlcmZhY2UgQ2FwdHVyZWRGaWxlIHtcbiAgICAvKiBhcmNoaXZlIGVudHJ5IG5hbWUgKGJhc2VuYW1lLCBkZS1kdXBsaWNhdGVkKSAqL1xuICAgIG5hbWU6IHN0cmluZ1xuICAgIC8qIGFic29sdXRlIHBhdGggdGhlIGNvbnRlbnQgY2FtZSBmcm9tICovXG4gICAgc291cmNlUGF0aDogc3RyaW5nXG4gICAgY29udGVudDogc3RyaW5nXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29uZmlnUGF0aFJlc29sdXRpb24ge1xuICAgIGNvbmZpZ1BhdGg/OiBzdHJpbmdcbiAgICAvKiB3aGljaCBsYWRkZXIgcnVuZyBhbnN3ZXJlZCBcdTIwMTQgcmVjb3JkZWQgb24gdGhlIFNES19VUExPQURfTE9HUyBldmVudCAqL1xuICAgIHN0cmF0ZWd5Pzogc3RyaW5nXG4gICAgLyogd2h5IG5vdGhpbmcgd2FzIGZvdW5kLCB3aGVuIGNvbmZpZ1BhdGggaXMgdW5kZWZpbmVkICovXG4gICAgcmVhc29uPzogc3RyaW5nXG59XG5cbmNvbnN0IGlzUmVhZGFibGVGaWxlID0gKGZpbGVQYXRoOiBzdHJpbmcpOiBib29sZWFuID0+IHtcbiAgICB0cnkge1xuICAgICAgICByZXR1cm4gZnMuZXhpc3RzU3luYyhmaWxlUGF0aCkgJiYgZnMuc3RhdFN5bmMoZmlsZVBhdGgpLmlzRmlsZSgpXG4gICAgfSBjYXRjaCB7XG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbn1cblxuLyoqXG4gKiBBY2NlcHQgYSBjb25maWcgcGF0aCB0aGUgd2F5IGBAd2Rpby9jbGlgIGRvZXM6IHRoZSB2YWx1ZSBhcyBzcGVsbGVkLCBlbHNlIHRoZSBzYW1lIHN0ZW1cbiAqIHByb2JlZCBhY3Jvc3MgdGhlIHN1cHBvcnRlZCBleHRlbnNpb25zLlxuICpcbiAqIFRoZSBwcm9iZSBpcyBub3QgZGVmZW5zaXZlIHBhZGRpbmcgXHUyMDE0IGl0IGlzIHJlcXVpcmVkLiBgY29tbWFuZHMvcnVuLnRzYCBoYW5kcyBgTGF1bmNoZXJgIHRoZVxuICogcGF0aCB0aGF0IGBjYW5BY2Nlc3NDb25maWdQYXRoYCBmb3VuZCwgYnV0IGxlYXZlcyBgY29uZmlnLXBhdGhgIHNldCB0byB3aGF0IHRoZSBVU0VSIHR5cGVkLFxuICogYW5kIGEgVHlwZVNjcmlwdCBwcm9qZWN0IGxlZ2FsbHkgc3BlbGxzIGEgYC50c2AgY29uZmlnIHdpdGggYC5qc2AuIFZlcmlmaWVkIGFnYWluc3QgYSByZWFsXG4gKiB3ZGlvIHJ1bjogYHdkaW8gcnVuIC4vY29uZmlncy9hLmNvbmYuanNgIHdpdGggb25seSBgY29uZmlncy9hLmNvbmYudHNgIG9uIGRpc2sgc3RhcnRzIGZpbmVcbiAqIGFuZCByZXBvcnRzIGBjb25maWctcGF0aDogJy4vY29uZmlncy9hLmNvbmYuanMnYCwgYSBwYXRoIHRoYXQgZG9lcyBub3QgZXhpc3QuXG4gKi9cbmNvbnN0IHJlc29sdmVDYW5kaWRhdGUgPSAodmFsdWU6IHVua25vd24pOiBzdHJpbmcgfCB1bmRlZmluZWQgPT4ge1xuICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICdzdHJpbmcnIHx8ICF2YWx1ZS50cmltKCkpIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZFxuICAgIH1cbiAgICB0cnkge1xuICAgICAgICBjb25zdCBmdWxsID0gcGF0aC5yZXNvbHZlKHByb2Nlc3MuY3dkKCksIHZhbHVlLnRyaW0oKSlcbiAgICAgICAgY29uc3QgZXh0ID0gcGF0aC5leHRuYW1lKGZ1bGwpXG4gICAgICAgIGNvbnN0IHN0ZW0gPSBTVVBQT1JURURfV0RJT19DT05GSUdfRVhURU5TSU9OUy5pbmNsdWRlcyhleHQpID8gZnVsbC5zbGljZSgwLCAtZXh0Lmxlbmd0aCkgOiBmdWxsXG4gICAgICAgIHJldHVybiBbZnVsbCwgLi4uU1VQUE9SVEVEX1dESU9fQ09ORklHX0VYVEVOU0lPTlMubWFwKChlKSA9PiBgJHtzdGVtfSR7ZX1gKV1cbiAgICAgICAgICAgIC5maW5kKGlzUmVhZGFibGVGaWxlKVxuICAgIH0gY2F0Y2gge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkXG4gICAgfVxufVxuXG4vKipcbiAqIGN3ZC1yZWxhdGl2ZSBmb3JtIG9mIGEgRklMRSBwYXRoLCBmb3IgYW55dGhpbmcgdGhhdCBnZXRzIHVwbG9hZGVkLlxuICpcbiAqIFRoZSBiYXNlbmFtZSBmYWxsYmFjayBpcyBzYWZlIGhlcmUgb25seSBiZWNhdXNlIGBwYXRoLnJlbGF0aXZlYCBpcyBuZXZlciBlbXB0eSBmb3IgYSBmaWxlIFx1MjAxNFxuICogYSBmaWxlIGlzIG5ldmVyIGVxdWFsIHRvIGN3ZC4gRG8gTk9UIHBhc3MgYSBkaXJlY3Rvcnk6IHNlZSBgcmVsYXRpdmVEaXJUb0N3ZGAuXG4gKi9cbmV4cG9ydCBjb25zdCByZWxhdGl2ZVRvQ3dkID0gKGZpbGVQYXRoOiBzdHJpbmcpOiBzdHJpbmcgPT4ge1xuICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBwYXRoLnJlbGF0aXZlKHByb2Nlc3MuY3dkKCksIGZpbGVQYXRoKSB8fCBwYXRoLmJhc2VuYW1lKGZpbGVQYXRoKVxuICAgIH0gY2F0Y2gge1xuICAgICAgICByZXR1cm4gcGF0aC5iYXNlbmFtZShmaWxlUGF0aClcbiAgICB9XG59XG5cbi8qKlxuICogY3dkLXJlbGF0aXZlIGZvcm0gb2YgYSBESVJFQ1RPUlkgcGF0aC5cbiAqXG4gKiBgcGF0aC5yZWxhdGl2ZShjd2QsIGN3ZClgIGlzIGAnJ2AsIHdoaWNoIGlzIHRoZSBDT01NT04gY2FzZSBoZXJlIChhIG1hbmlmZXN0IGF0IHRoZSBwcm9qZWN0XG4gKiByb290KSwgc28gYSBiYXNlbmFtZSBmYWxsYmFjayB3b3VsZCByZXBvcnQgdGhlIGZvbGRlciBuYW1lIFx1MjAxNCBhbmQgZm9yIGEgcHJvamVjdCBjaGVja2VkIG91dFxuICogZGlyZWN0bHkgaW4gYCRIT01FYCB0aGF0IGZvbGRlciBuYW1lIGlzIHRoZSBPUyB1c2VybmFtZSwgd2hpY2ggaXMgdGhlIGV4YWN0IGV4cG9zdXJlIHRoZVxuICogcmVsYXRpdmUtcGF0aCBoYW5kbGluZyBleGlzdHMgdG8gcHJldmVudC4gRW1wdHkgbWVhbnMgXCJjd2RcIiwgc28gcmVuZGVyIGl0IGFzIGAuYC5cbiAqL1xuZXhwb3J0IGNvbnN0IHJlbGF0aXZlRGlyVG9Dd2QgPSAoZGlyOiBzdHJpbmcpOiBzdHJpbmcgPT4ge1xuICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBwYXRoLnJlbGF0aXZlKHByb2Nlc3MuY3dkKCksIGRpcikgfHwgJy4nXG4gICAgfSBjYXRjaCB7XG4gICAgICAgIHJldHVybiAnLidcbiAgICB9XG59XG5cbi8qKlxuICogUmVzb2x2ZSB0aGUgYWJzb2x1dGUgcGF0aCBvZiB0aGUgdXNlcidzIHdkaW8gY29uZmlnIGZpbGUuXG4gKlxuICogV0RJTyBrZWVwcyB0aGUgcmVhbCBwYXRoIGluIGBDb25maWdQYXJzZXJgJ3MgcHJpdmF0ZSBgI2NvbmZpZ0ZpbGVQYXRoYCwgd2hpY2ggbm8gc2VydmljZSBjYW5cbiAqIHJlYWNoLCBzbyB0aGlzIHJlY29uc3RydWN0cyBpdCBmcm9tIHRoZSB2YWx1ZXMgdGhlIENMSSBkb2VzIGxlYXZlIG9uIHRoZSBtZXJnZWQgY29uZmlnIFx1MjAxNFxuICogbWlycm9yaW5nIGhvdyBgQHdkaW8vY2xpYCBpdHNlbGYgcmVzb2x2ZXMgaXQuIFRoZSBDTEkgbmV2ZXIgc2VhcmNoZXM6IGl0IHRha2VzIG9uZSBjYW5kaWRhdGVcbiAqIGFuZCBwcm9iZXMgb25lIHN0ZW0gYWNyb3NzIHRoZSBzdXBwb3J0ZWQgZXh0ZW5zaW9ucywgc28gbmVpdGhlciBkb2VzIHRoaXMuXG4gKlxuICogICAxLiBCUk9XU0VSU1RBQ0tfV0RJT19DT05GSUdfRklMRV9QQVRIICBcdTIwMTQgZXhwbGljaXQgb3ZlcnJpZGUgLyBzdXBwb3J0IGVzY2FwZSBoYXRjaFxuICogICAyLiBjb25maWdbJ2NvbmZpZy1wYXRoJ10gICAgICAgICAgICAgICBcdTIwMTQgeWFyZ3MnIGtlYmFiIGFsaWFzIG9mIHRoZSBgcnVuIDxjb25maWdQYXRoPmBcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbmFsICh2OCBhbmQgdjkgYWxpa2UpXG4gKiAgIDMuIGNvbmZpZy5fWzBdICAgICAgICAgICAgICAgICAgICAgICAgIFx1MjAxNCB0aGUgYmFyZSBgd2RpbyA8Y29uZmlnPmAgZm9ybSwgd2hpY2ggYHJ1bi50c2BcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdHNlbGYgcmVzb2x2ZXMgZnJvbSBgcGFyYW1zLl9bMF1gXG4gKiAgIDQuIHJvb3REaXIgKyB3ZGlvLmNvbmYuPGV4dD4gICAgICAgICAgIFx1MjAxNCBuby1hcmcgYHdkaW9gLCBhbmQgcHJvZ3JhbW1hdGljIGBuZXcgTGF1bmNoZXIoKWBcbiAqICAgNS4gY3dkICsgd2Rpby5jb25mLjxleHQ+ICAgICAgICAgICAgICAgXHUyMDE0IHdoZW4gdGhlIHVzZXIgb3ZlcnJpZGVzIGByb290RGlyYCBpbiB0aGVpciBjb25maWdcbiAqXG4gKiBgY29uZmlnLl9gIGlzIHJlYWQgcmF0aGVyIHRoYW4gcmF3IGBwcm9jZXNzLmFyZ3ZgOiBpdCBpcyB0aGUgc2FtZSBwb3NpdGlvbmFsIEFGVEVSIHlhcmdzIGhhc1xuICogYXBwbGllZCB3ZGlvJ3Mgb3duIG9wdGlvbiBkZWNsYXJhdGlvbnMuIFNjYW5uaW5nIGFyZ3YgbWVhbnMgcmUtaW1wbGVtZW50aW5nIHRoYXQgd2l0aCBhXG4gKiBoZXVyaXN0aWMgdGhhdCBjYW5ub3Qga25vdyB3aGljaCBmbGFncyBhcmUgYm9vbGVhbiBcdTIwMTQgYW5kIGB3ZGlvIC0td2F0Y2ggLi9hLmNvbmYudHNgIHB1dHMgdGhlXG4gKiByZWFsIGNvbmZpZyBpbiBgX1swXWAgd2hpbGUgYW55IFwic2tpcCBhIGZsYWcncyB2YWx1ZVwiIHJ1bGUgdGhyb3dzIGl0IGF3YXkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlV2Rpb0NvbmZpZ1BhdGgoY29uZmlnPzogT3B0aW9ucy5UZXN0cnVubmVyKTogQ29uZmlnUGF0aFJlc29sdXRpb24ge1xuICAgIGNvbnN0IHJlY29yZCA9IChjb25maWcgfHwge30pIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+XG5cbiAgICB0cnkge1xuICAgICAgICBjb25zdCBwb3NpdGlvbmFscyA9IEFycmF5LmlzQXJyYXkocmVjb3JkLl8pID8gcmVjb3JkLl8gYXMgdW5rbm93bltdIDogW11cbiAgICAgICAgY29uc3QgcG9zaXRpb25hbCA9IHBvc2l0aW9uYWxzLmZpbHRlcihcbiAgICAgICAgICAgIChlbnRyeSk6IGVudHJ5IGlzIHN0cmluZyA9PiB0eXBlb2YgZW50cnkgPT09ICdzdHJpbmcnICYmICFXRElPX0NMSV9TVUJDT01NQU5EUy5pbmNsdWRlcyhlbnRyeSlcbiAgICAgICAgKVswXVxuICAgICAgICBjb25zdCByb290RGlyID0gdHlwZW9mIHJlY29yZC5yb290RGlyID09PSAnc3RyaW5nJyA/IHJlY29yZC5yb290RGlyIDogdW5kZWZpbmVkXG5cbiAgICAgICAgY29uc3QgcnVuZ3M6IEFycmF5PFtzdHJpbmcsIHVua25vd25dPiA9IFtcbiAgICAgICAgICAgIFsnZW52X292ZXJyaWRlJywgcHJvY2Vzcy5lbnZbQlJPV1NFUlNUQUNLX1dESU9fQ09ORklHX0ZJTEVfUEFUSF1dLFxuICAgICAgICAgICAgWydjbGlfY29uZmlnX3BhdGgnLCByZWNvcmRbJ2NvbmZpZy1wYXRoJ11dLFxuICAgICAgICAgICAgWydjb25maWdfcG9zaXRpb25hbCcsIHBvc2l0aW9uYWxdLFxuICAgICAgICAgICAgWydyb290X2Rpcl9kZWZhdWx0Jywgcm9vdERpciAmJiBwYXRoLmpvaW4ocm9vdERpciwgREVGQVVMVF9XRElPX0NPTkZJR19CQVNFTkFNRSldLFxuICAgICAgICAgICAgWydjd2RfZGVmYXVsdCcsIERFRkFVTFRfV0RJT19DT05GSUdfQkFTRU5BTUVdXG4gICAgICAgIF1cblxuICAgICAgICBmb3IgKGNvbnN0IFtzdHJhdGVneSwgdmFsdWVdIG9mIHJ1bmdzKSB7XG4gICAgICAgICAgICBjb25zdCBjb25maWdQYXRoID0gcmVzb2x2ZUNhbmRpZGF0ZSh2YWx1ZSlcbiAgICAgICAgICAgIGlmIChjb25maWdQYXRoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgY29uZmlnUGF0aCwgc3RyYXRlZ3kgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHsgcmVhc29uOiAnY29uZmlnX25vdF9mb3VuZCcgfVxuICAgIH0gY2F0Y2gge1xuICAgICAgICByZXR1cm4geyByZWFzb246ICdjb25maWdfcmVzb2x2ZV9leGNlcHRpb24nIH1cbiAgICB9XG59XG5cbi8qKlxuICogUmVzb2x2ZSBvbmNlLCBhcyBlYXJseSBhcyBwb3NzaWJsZSwgYW5kIHB1Ymxpc2ggdGhlIGFuc3dlciBvbiB0aGUgZW52aXJvbm1lbnQgc28gdGhlXG4gKiB1cGxvYWQgcGF0aCAoYW5kIGFueSB3b3JrZXIpIHJlYWRzIHRoZSBTQU1FIHZhbHVlIGluc3RlYWQgb2YgcmUtZGVyaXZpbmcgaXQgZnJvbSBjd2QuXG4gKlxuICogUmUtcmVzb2x2aW5nIGF0IGFyY2hpdmUgdGltZSBpcyBwcmVjaXNlbHkgdGhlIGJ1ZyBTREstNTk5MyBmaXhlZCBpbiB0aGUgTm9kZSBTREs6IHRoZVxuICogYXJjaGl2ZSBzdGVwIHJlYWQgYGN3ZC9icm93c2Vyc3RhY2sueW1sYCB3aGlsZSBzdGFydHVwIGhhZCByZXNvbHZlZCBhIGRpZmZlcmVudCBwYXRoLFxuICogc2lsZW50bHkgZHJvcHBpbmcgdGhlIGNvbmZpZyBmb3IgZXZlcnkgbW9ub3JlcG8gLyBzdWJkaXIgQ0kgcnVuLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaW5pdFdkaW9Db25maWdQYXRoKGNvbmZpZz86IE9wdGlvbnMuVGVzdHJ1bm5lcik6IENvbmZpZ1BhdGhSZXNvbHV0aW9uIHtcbiAgICB0cnkge1xuICAgICAgICBjb25zdCBhbHJlYWR5UmVzb2x2ZWQgPSBwcm9jZXNzLmVudltCUk9XU0VSU1RBQ0tfV0RJT19DT05GSUdfRklMRV9QQVRIXVxuICAgICAgICBpZiAoYWxyZWFkeVJlc29sdmVkKSB7XG4gICAgICAgICAgICAvLyBSZXBvcnQgdGhlIHJ1bmcgdGhhdCBPUklHSU5BTExZIGFuc3dlcmVkLCBub3QgdGhlIGVudiB2YXIgdGhpcyBmdW5jdGlvblxuICAgICAgICAgICAgLy8gaXRzZWxmIHdyb3RlIFx1MjAxNCBvdGhlcndpc2UgZXZlcnkgcnVuIHJlcG9ydHMgYGVudl9vdmVycmlkZWAgYW5kIHRoZSBtZXRyaWNcbiAgICAgICAgICAgIC8vIGNhbiBuZXZlciB0ZWxsIHVzIGhvdyBvZnRlbiB0aGUgZmFsbGJhY2tzIGFyZSBjYXJyeWluZyBjdXN0b21lcnMuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGNvbmZpZ1BhdGg6IGFscmVhZHlSZXNvbHZlZCxcbiAgICAgICAgICAgICAgICBzdHJhdGVneTogcHJvY2Vzcy5lbnZbQlJPV1NFUlNUQUNLX1dESU9fQ09ORklHX1NUUkFURUdZXSB8fCAnZW52X292ZXJyaWRlJ1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVzb2x1dGlvbiA9IHJlc29sdmVXZGlvQ29uZmlnUGF0aChjb25maWcpXG4gICAgICAgIGlmIChyZXNvbHV0aW9uLmNvbmZpZ1BhdGgpIHtcbiAgICAgICAgICAgIHByb2Nlc3MuZW52W0JST1dTRVJTVEFDS19XRElPX0NPTkZJR19GSUxFX1BBVEhdID0gcmVzb2x1dGlvbi5jb25maWdQYXRoXG4gICAgICAgICAgICBpZiAocmVzb2x1dGlvbi5zdHJhdGVneSkge1xuICAgICAgICAgICAgICAgIHByb2Nlc3MuZW52W0JST1dTRVJTVEFDS19XRElPX0NPTkZJR19TVFJBVEVHWV0gPSByZXNvbHV0aW9uLnN0cmF0ZWd5XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBSZWxhdGl2ZSB0byBjd2Q6IHRoaXMgbG9nIGZpbGUgaXMgaXRzZWxmIHVwbG9hZGVkLCBhbmQgYW4gYWJzb2x1dGUgcGF0aCBsZWFrc1xuICAgICAgICAgICAgLy8gdGhlIE9TIHVzZXJuYW1lIGFuZCBkaXJlY3RvcnkgbGF5b3V0IChgL1VzZXJzL2phbmUuZG9lLy4uLmApLiBgcGF0aC5yZWxhdGl2ZWBcbiAgICAgICAgICAgIC8vIHN0aWxsIHlpZWxkcyBgLi4vLi4vc2hhcmVkL3dkaW8uY29uZi50c2AgZm9yIGEgY29uZmlnIG91dHNpZGUgY3dkLCBzbyB0aGVcbiAgICAgICAgICAgIC8vIG1vbm9yZXBvL3N1YmRpciBkaWFnbm9zdGljIFx1MjAxNCB3aGljaCBpcyB0aGUgd2hvbGUgcG9pbnQgb2YgbG9nZ2luZyBpdCBcdTIwMTQgc3Vydml2ZXMuXG4gICAgICAgICAgICAvLyBQYXRoIGJlZm9yZSBzdHJhdGVneTogQlN0YWNrTG9nZ2VyIHNjcnVicyBhbnkgYDwuLi4+a2V5OmAvYDwuLi4+dXNlcjpgIHByZWZpeGVkXG4gICAgICAgICAgICAvLyB2YWx1ZSwgc28gYSBzdHJhdGVneSBuYW1lIGVuZGluZyBpbiBga2V5YC9gdXNlcmAgaGVyZSB3b3VsZCByZWRhY3QgdGhlIHBhdGguXG4gICAgICAgICAgICBCU3RhY2tMb2dnZXIuZGVidWcoYFJlc29sdmVkIHdkaW8gY29uZmlnIGZpbGUgJHtyZWxhdGl2ZVRvQ3dkKHJlc29sdXRpb24uY29uZmlnUGF0aCl9IGZvciBhdXRvLWNhcHR1cmUgKHN0cmF0ZWd5ICR7cmVzb2x1dGlvbi5zdHJhdGVneX0pYClcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIEJTdGFja0xvZ2dlci5kZWJ1ZyhgQ291bGQgbm90IHJlc29sdmUgd2RpbyBjb25maWcgZmlsZSBmb3IgYXV0by1jYXB0dXJlOiAke3Jlc29sdXRpb24ucmVhc29ufWApXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc29sdXRpb25cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBCU3RhY2tMb2dnZXIuZGVidWcoYEVycm9yIHdoaWxlIHJlc29sdmluZyB3ZGlvIGNvbmZpZyBmaWxlOiAke2Vycm9yfWApXG4gICAgICAgIHJldHVybiB7IHJlYXNvbjogJ2NvbmZpZ19yZXNvbHZlX2V4Y2VwdGlvbicgfVxuICAgIH1cbn1cblxuLyoqXG4gKiBPcHQtb3V0IGZvciBhdXRvLWNhcHR1cmVkIGxvZ3MuIFNlcnZpY2Ugb3B0aW9uIGZpcnN0LCBlbnYgdmFyIGFzIHRoZSBDSSBlc2NhcGUgaGF0Y2hcbiAqIChjdXN0b21lcnMgY2Fubm90IGFsd2F5cyBlZGl0IGEgY29tbWl0dGVkIGNvbmZpZykuIE5hbWUgbWF0Y2hlcyB0aGUgTm9kZSBTREsnc1xuICogYGRpc2FibGVBdXRvQ2FwdHVyZUxvZ3NgIHNvIHRoZSBmbGFnIG1lYW5zIHRoZSBzYW1lIHRoaW5nIGFjcm9zcyBCcm93c2VyU3RhY2sgU0RLcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzQXV0b0NhcHR1cmVMb2dzRGlzYWJsZWQob3B0aW9ucz86IHsgZGlzYWJsZUF1dG9DYXB0dXJlTG9ncz86IGJvb2xlYW4gfSk6IGJvb2xlYW4ge1xuICAgIGlmIChvcHRpb25zPy5kaXNhYmxlQXV0b0NhcHR1cmVMb2dzID09PSB0cnVlKSB7XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuICAgIHJldHVybiBTdHJpbmcocHJvY2Vzcy5lbnZbQlJPV1NFUlNUQUNLX0RJU0FCTEVfQVVUT19DQVBUVVJFX0xPR1NdIHx8ICcnKS50b0xvd2VyQ2FzZSgpID09PSAndHJ1ZSdcbn1cblxuLyoqXG4gKiBNaXJyb3IgdGhlIHNlcnZpY2Ugb3B0aW9uIG9udG8gdGhlIGVudmlyb25tZW50IHNvIHRoZSBvcHQtb3V0IHN1cnZpdmVzIGludG8gdGhlXG4gKiBERVRBQ0hFRCBjbGVhbnVwIHByb2Nlc3MsIHdoaWNoIGdldHMgbm8gb3B0aW9ucyBvYmplY3QuXG4gKlxuICogV2l0aG91dCB0aGlzIHRoZSBvcHQtb3V0IGlzIHdvcnNlIHRoYW4gdXNlbGVzczogc2tpcHBpbmcgdGhlIHVwbG9hZCBsZWF2ZXNcbiAqIGBsb2dzVXBsb2FkZWRgIGZhbHNlLCB3aGljaCBpcyBleGFjdGx5IHRoZSBjb25kaXRpb24gdGhhdCBhcm1zIHRoZSBleGl0LXRpbWVcbiAqIGAtLXVwbG9hZExvZ3NgIHJlc2N1ZSBcdTIwMTQgc28gZXZlcnkgb3B0ZWQtb3V0IHJ1biBoYWQgaXRzIGNvbmZpZyByZWFkIGFuZCBQT1NUZWQgYnkgdGhlXG4gKiBjbGVhbnVwIGNoaWxkLiBSZXR1cm5zIHdoZXRoZXIgYXV0by1jYXB0dXJlIGlzIGRpc2FibGVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcHVibGlzaEF1dG9DYXB0dXJlRGlzYWJsZWQob3B0aW9ucz86IHsgZGlzYWJsZUF1dG9DYXB0dXJlTG9ncz86IGJvb2xlYW4gfSk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGRpc2FibGVkID0gaXNBdXRvQ2FwdHVyZUxvZ3NEaXNhYmxlZChvcHRpb25zKVxuICAgIGlmIChkaXNhYmxlZCkge1xuICAgICAgICBwcm9jZXNzLmVudltCUk9XU0VSU1RBQ0tfRElTQUJMRV9BVVRPX0NBUFRVUkVfTE9HU10gPSAndHJ1ZSdcbiAgICB9XG4gICAgcmV0dXJuIGRpc2FibGVkXG59XG5cbi8qKlxuICogTGluZS1sZXZlbCBjcmVkZW50aWFsIHNjcnViLCBwb3J0ZWQgZnJvbSB0aGUgTm9kZSBTREsncyBgcmVkYWN0U2Vuc2l0aXZlQ29udGVudGAuXG4gKlxuICogQW55IGxpbmUgbWVudGlvbmluZyBhIHNlbnNpdGl2ZSBrZXkgY29sbGFwc2VzIHRvIGA8a2V5PjogW1JFREFDVEVEXWAuIFdvcmQgYm91bmRhcmllc1xuICoga2VlcCBgaG90a2V5YCAvIGBrZXl3b3JkYCBmcm9tIHRyaXBwaW5nIHRoZSBiYXJlIGBrZXlgIGVudHJ5IHRoYXQgV0RJTydzIHRvcC1sZXZlbFxuICogY3JlZGVudGlhbCBvcHRpb25zIGZvcmNlIHVzIHRvIGNhcnJ5LiBgLmAgaXMgaW50ZW50aW9uYWxseSBOT1QgcGFydCBvZiB0aGUgYm91bmRhcnlcbiAqIGNsYXNzIHNvIGBic3RhY2tPcHRpb25zLmFjY2Vzc0tleSA9ICcuLi4nYCBzdGlsbCBtYXRjaGVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVkYWN0U2Vuc2l0aXZlQ29udGVudCh0ZXh0OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmICghdGV4dCkge1xuICAgICAgICByZXR1cm4gdGV4dFxuICAgIH1cblxuICAgIGNvbnN0IGVzY2FwZVJlZ2V4ID0gKHZhbHVlOiBzdHJpbmcpID0+IHZhbHVlLnJlcGxhY2UoL1suKis/XiR7fSgpfFtcXF1cXFxcXS9nLCAnXFxcXCQmJylcbiAgICAvLyBsb25nZXN0IGZpcnN0OiBhbHRlcm5hdGlvbiByZXR1cm5zIHRoZSBmaXJzdCBtYXRjaCwgbm90IHRoZSBsb25nZXN0IG9uZVxuICAgIGNvbnN0IGtleXMgPSBbLi4uUkVEQUNURURfS0VZU11cbiAgICAgICAgLnNvcnQoKGEsIGIpID0+IGIubGVuZ3RoIC0gYS5sZW5ndGgpXG4gICAgICAgIC5tYXAoZXNjYXBlUmVnZXgpXG4gICAgICAgIC5qb2luKCd8JylcbiAgICBjb25zdCByZWRhY3RSZWdleCA9IG5ldyBSZWdFeHAoYF4uKj8oPzwhW0EtWmEtejAtOV8kXSkoJHtrZXlzfSkoPyFbQS1aYS16MC05XyRdKS4qJGAsICdnbWknKVxuXG4gICAgLy8gQ29tcG91bmQgaWRlbnRpZmllcnMgZW5kaW5nIGluIGEgc2Vuc2l0aXZlIHdvcmQsIHdoaWNoIHRoZSB3aG9sZS13b3JkIHBhc3MgYWJvdmVcbiAgICAvLyBjYW5ub3Qgc2VlOiBpdHMgbG9va2JlaGluZCByZWplY3RzIHRoZSBwcmVjZWRpbmcgbGV0dGVyIGluIGBjbGllbnRTZWNyZXRgIC9cbiAgICAvLyBgcmVmcmVzaFRva2VuYCAvIGBwcml2YXRlS2V5YCwgYW5kIHRoZSBwcmVjZWRpbmcgYF9gIGluIGBjbGllbnRfc2VjcmV0YC5cbiAgICAvL1xuICAgIC8vIGNhbWVsQ2FzZSBzdGF5cyBjYXNlLVNFTlNJVElWRTogcmVxdWlyaW5nIGEgY2FwaXRhbGlzZWQgc3VmZml4IGlzIHdoYXQgc2VwYXJhdGVzXG4gICAgLy8gYHByaXZhdGVLZXlgIGZyb20gYGhvdGtleWAsIHNvIHRoaXMgY2xvc2VzIHRoZSBsZWFrIHdpdGhvdXQgdGhlIGZhbHNlIHBvc2l0aXZlcyBhXG4gICAgLy8gYmFyZSAva2V5fHRva2VufHNlY3JldC8gcGFzcyB3b3VsZCBwcm9kdWNlLiBUaGUgY29yZSBkb2VzIE5PVCByZXF1aXJlIGEgbG93ZXJjYXNlXG4gICAgLy8gY2hhciBiZWZvcmUgdGhlIHN1ZmZpeCBcdTIwMTQgdGhhdCBndWFyZCBvbmx5IGV2ZXIgZHVwbGljYXRlZCB0aGUgY2FzZS1zZW5zaXRpdml0eSwgd2hpbGVcbiAgICAvLyByZWplY3RpbmcgYWNyb255bSBwcmVmaXhlcyAoYEFQSVRva2VuYCwgYEpXVFNlY3JldGAsIGBTU0hLZXlgLCBgQVdTU2VjcmV0YCkuXG4gICAgLy8gSWRlbnRpZmllciBzY2FucyBhcmUgYm91bmRlZCBhdCA2NCBjaGFycy4gUmVhbCBjb25maWcga2V5cyBhcmUgZmFyIHNob3J0ZXIsIHNvIHRoaXNcbiAgICAvLyBjaGFuZ2VzIG5vIG1hdGNoOyBpdCBpcyBkZWZlbmNlLWluLWRlcHRoIGFnYWluc3QgYmFja3RyYWNraW5nIG9uIGEgcGF0aG9sb2dpY2FsIGxpbmVcbiAgICAvLyAoYSBtaW5pZmllZC9iYXNlNjQgcnVuKSwga2VlcGluZyBldmVyeSBzdGFydCBwb3NpdGlvbiBPKDEpIGluc3RlYWQgb2YgTyhuKS5cbiAgICBjb25zdCBjb21wb3VuZENhbWVsUmVnZXggPSBuZXcgUmVnRXhwKFxuICAgICAgICBgXi4qPyg/PCFbQS1aYS16MC05XyRdKShbQS1aYS16MC05XyRdezEsNjR9KD86JHtDT01QT1VORF9TRUNSRVRfU1VGRklYRVNfQ0FNRUx9KSlcXFxccypbOj1dLiokYCxcbiAgICAgICAgJ2dtJ1xuICAgIClcbiAgICAvLyBzbmFrZV9jYXNlIGlzIG1hdGNoZWQgY2FzZS1JTlNFTlNJVElWRUxZLCB3aGljaCBpcyBzYWZlIHByZWNpc2VseSBiZWNhdXNlIGl0IHJlcXVpcmVzXG4gICAgLy8gYW4gZXhwbGljaXQgYF9gIGJlZm9yZSB0aGUgc3VmZml4LiBUaGF0IGNvdmVycyBTQ1JFQU1JTkdfU05BS0VfQ0FTRSBcdTIwMTQgdGhlIGRvbWluYW50XG4gICAgLy8gY29udmVudGlvbiBmb3Igc2VjcmV0cyBpbiBjb25maWcvZW52IGZpbGVzIChgQVdTX1NFQ1JFVF9BQ0NFU1NfS0VZYCwgYEdJVEhVQl9UT0tFTmApIFx1MjAxNFxuICAgIC8vIHdoaWxlIGBrZXl3b3JkYCBhbmQgYG15X3NlY3JldGFyeWAgc3RpbGwgZmFsbCBvdXQsIHNpbmNlIG5laXRoZXIgaGFzIGBfPHN1ZmZpeD5gXG4gICAgLy8gaW1tZWRpYXRlbHkgYmVmb3JlIGFuIGFzc2lnbm1lbnQuXG4gICAgY29uc3QgY29tcG91bmRTbmFrZVJlZ2V4ID0gbmV3IFJlZ0V4cChcbiAgICAgICAgYF4uKj8oPzwhW0EtWmEtejAtOV8kXSkoW0EtWmEtejAtOV8kXXswLDY0fV8oPzoke0NPTVBPVU5EX1NFQ1JFVF9TVUZGSVhFU19TTkFLRX0pKVxcXFxzKls6PV0uKiRgLFxuICAgICAgICAnZ21pJ1xuICAgIClcblxuICAgIHJldHVybiB0ZXh0LnRvU3RyaW5nKClcbiAgICAgICAgLy8gQmxvY2stbGV2ZWwgcGFzc2VzIHJ1biBGSVJTVDogdGhleSBzcGFuIGxpbmVzLCBhbmQgdGhlIGxpbmUtYW5jaG9yZWQgcGFzc2VzIGJlbG93XG4gICAgICAgIC8vIGNhbiBvbmx5IGV2ZXIgc2VlIHRoZSBvbmUgbGluZSB0aGF0IGNhcnJpZXMgdGhlIGtleSBuYW1lLlxuICAgICAgICAucmVwbGFjZShQRU1fQkxPQ0tfUkVHRVgsICckMVtSRURBQ1RFRF0kMicpXG4gICAgICAgIC5yZXBsYWNlKFBFTV9VTlRFUk1JTkFURURfUkVHRVgsICckMVtSRURBQ1RFRF0nKVxuICAgICAgICAucmVwbGFjZShVUkxfVVNFUklORk9fUkVHRVgsICckMVtSRURBQ1RFRF1AJylcbiAgICAgICAgLnJlcGxhY2UocmVkYWN0UmVnZXgsICckMTogW1JFREFDVEVEXScpXG4gICAgICAgIC5yZXBsYWNlKGNvbXBvdW5kQ2FtZWxSZWdleCwgJyQxOiBbUkVEQUNURURdJylcbiAgICAgICAgLnJlcGxhY2UoY29tcG91bmRTbmFrZVJlZ2V4LCAnJDE6IFtSRURBQ1RFRF0nKVxufVxuXG5jb25zdCByZWFkQ2FwcGVkRmlsZSA9IChmaWxlUGF0aDogc3RyaW5nKTogeyBjb250ZW50Pzogc3RyaW5nLCByZWFzb24/OiBzdHJpbmcgfSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgICAgY29uc3Qgc2l6ZSA9IGZzLnN0YXRTeW5jKGZpbGVQYXRoKS5zaXplXG4gICAgICAgIGlmIChzaXplID4gTUFYX0NBUFRVUkVEX0NPTkZJR19GSUxFX0JZVEVTKSB7XG4gICAgICAgICAgICByZXR1cm4geyByZWFzb246IGAke3BhdGguYmFzZW5hbWUoZmlsZVBhdGgpfTogdG9vX2xhcmdlICgke3NpemV9IGJ5dGVzKWAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IGNvbnRlbnQ6IGZzLnJlYWRGaWxlU3luYyhmaWxlUGF0aCwgJ3V0ZjgnKSB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIHsgcmVhc29uOiBgJHtwYXRoLmJhc2VuYW1lKGZpbGVQYXRoKX06ICR7KGVycm9yIGFzIEVycm9yKT8ubWVzc2FnZSB8fCBTdHJpbmcoZXJyb3IpfWAgfVxuICAgIH1cbn1cblxuLyoqXG4gKiBSZXNvbHZlIGEgcmVsYXRpdmUgaW1wb3J0IHNwZWNpZmllciBhZ2FpbnN0IHRoZSBpbXBvcnRpbmcgZmlsZS5cbiAqXG4gKiBIYW5kbGVzIHRoZSBUeXBlU2NyaXB0LUVTTSBjb252ZW50aW9uIHdoZXJlIGAuL3NoYXJlZC5jb25mLmpzYCBvbiBkaXNrIGlzIGFjdHVhbGx5XG4gKiBgLi9zaGFyZWQuY29uZi50c2AsIHBsdXMgZXh0ZW5zaW9uLWxlc3MgYW5kIGRpcmVjdG9yeSAoYC9pbmRleC4qYCkgc3BlY2lmaWVycy5cbiAqL1xuLyoqXG4gKiBPbmx5IGZpbGVzIHRoYXQgYXJlIHRoZW1zZWx2ZXMgY29uZmlncyBhcmUgZm9sbG93ZWQuXG4gKlxuICogQSByZWxhdGl2ZSBzcGVjaWZpZXIgcmVzb2x2ZXMgdG8gd2hhdGV2ZXIgdGhlIGNvbmZpZyBoYXBwZW5zIHRvIGltcG9ydCwgd2hpY2ggaXMgZnJlcXVlbnRseVxuICogb3JkaW5hcnkgYXBwbGljYXRpb24gc291cmNlIChgLi9oZWxwZXJzL3V0aWxzLmpzYCkgcmF0aGVyIHRoYW4gY29uZmlndXJhdGlvbi4gQ2FwdHVyaW5nIHRoZVxuICogc3BsaXQtY29uZmlnIGNhc2UgKGBiYXNlLmNvbmYuanNgLCBgd2Rpby5zaGFyZWQuY29uZi50c2ApIGlzIHRoZSBwb2ludDsgc2hpcHBpbmcgYVxuICogY3VzdG9tZXIncyBhcHBsaWNhdGlvbiBtb2R1bGVzIGlzIG5vdC5cbiAqL1xuY29uc3QgaXNDb25maWdGaWxlTmFtZSA9IChmaWxlUGF0aDogc3RyaW5nKTogYm9vbGVhbiA9PiAvXFwuY29uZihpZyk/XFwuW14uXSskL2kudGVzdChwYXRoLmJhc2VuYW1lKGZpbGVQYXRoKSlcblxuY29uc3QgcmVzb2x2ZVJlbGF0aXZlSW1wb3J0ID0gKHNwZWNpZmllcjogc3RyaW5nLCBmcm9tRmlsZTogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkID0+IHtcbiAgICBjb25zdCBiYXNlID0gcGF0aC5yZXNvbHZlKHBhdGguZGlybmFtZShmcm9tRmlsZSksIHNwZWNpZmllcilcblxuICAgIGlmIChpc1JlYWRhYmxlRmlsZShiYXNlKSAmJiBTVVBQT1JURURfV0RJT19DT05GSUdfRVhURU5TSU9OUy5pbmNsdWRlcyhwYXRoLmV4dG5hbWUoYmFzZSkpKSB7XG4gICAgICAgIHJldHVybiBpc0NvbmZpZ0ZpbGVOYW1lKGJhc2UpID8gYmFzZSA6IHVuZGVmaW5lZFxuICAgIH1cblxuICAgIGNvbnN0IHdpdGhvdXRFeHQgPSBTVVBQT1JURURfV0RJT19DT05GSUdfRVhURU5TSU9OUy5pbmNsdWRlcyhwYXRoLmV4dG5hbWUoYmFzZSkpXG4gICAgICAgID8gYmFzZS5zbGljZSgwLCAtcGF0aC5leHRuYW1lKGJhc2UpLmxlbmd0aClcbiAgICAgICAgOiBiYXNlXG5cbiAgICBmb3IgKGNvbnN0IGV4dCBvZiBTVVBQT1JURURfV0RJT19DT05GSUdfRVhURU5TSU9OUykge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSBgJHt3aXRob3V0RXh0fSR7ZXh0fWBcbiAgICAgICAgaWYgKGlzUmVhZGFibGVGaWxlKGNhbmRpZGF0ZSkgJiYgaXNDb25maWdGaWxlTmFtZShjYW5kaWRhdGUpKSB7XG4gICAgICAgICAgICByZXR1cm4gY2FuZGlkYXRlXG4gICAgICAgIH1cbiAgICB9XG4gICAgZm9yIChjb25zdCBleHQgb2YgU1VQUE9SVEVEX1dESU9fQ09ORklHX0VYVEVOU0lPTlMpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gcGF0aC5qb2luKGJhc2UsIGBpbmRleCR7ZXh0fWApXG4gICAgICAgIGlmIChpc1JlYWRhYmxlRmlsZShjYW5kaWRhdGUpICYmIGlzQ29uZmlnRmlsZU5hbWUoY2FuZGlkYXRlKSkge1xuICAgICAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWRcbn1cblxuLyoqXG4gKiBDb2xsZWN0IGxvY2FsIGZpbGVzIGEgY29uZmlnIHB1bGxzIGluIChgd2Rpby5zaGFyZWQuY29uZi50c2Agc3R5bGUgc3BsaXRzKSwgc28gYVxuICogY2FwdHVyZWQgY29uZmlnIGlzIG5vdCBqdXN0IGEgdHdvLWxpbmUgZmlsZSB0aGF0IHNwcmVhZHMgYSBiYXNlIGNvbmZpZyB3ZSBuZXZlciBzZWUuXG4gKlxuICogT25seSBSRUxBVElWRSBzcGVjaWZpZXJzIGFyZSBmb2xsb3dlZCBcdTIwMTQgYmFyZSBzcGVjaWZpZXJzIGFyZSBucG0gcGFja2FnZXMsIG5ldmVyIHRoZVxuICogY3VzdG9tZXIncyBvd24gY29uZmlnLiBEZXB0aCBhbmQgY291bnQgYXJlIGNhcHBlZCBzbyB0aGlzIGNhbiBuZXZlciB3YWxrIGEgc291cmNlIHRyZWUuXG4gKi9cbmNvbnN0IGNvbGxlY3RMb2NhbEltcG9ydHMgPSAoZW50cnlQYXRoOiBzdHJpbmcsIGVudHJ5Q29udGVudDogc3RyaW5nLCBidWRnZXQ6IG51bWJlcik6IEFycmF5PHsgZmlsZVBhdGg6IHN0cmluZywgY29udGVudDogc3RyaW5nIH0+ID0+IHtcbiAgICBjb25zdCBmb3VuZDogQXJyYXk8eyBmaWxlUGF0aDogc3RyaW5nLCBjb250ZW50OiBzdHJpbmcgfT4gPSBbXVxuICAgIGNvbnN0IHNlZW4gPSBuZXcgU2V0KFtlbnRyeVBhdGhdKVxuICAgIGxldCBmcm9udGllcjogQXJyYXk8eyBmaWxlUGF0aDogc3RyaW5nLCBjb250ZW50OiBzdHJpbmcgfT4gPSBbeyBmaWxlUGF0aDogZW50cnlQYXRoLCBjb250ZW50OiBlbnRyeUNvbnRlbnQgfV1cblxuICAgIGZvciAobGV0IGRlcHRoID0gMDsgZGVwdGggPCBDQVBUVVJFX0NPTkZJR19JTVBPUlRfREVQVEggJiYgZm91bmQubGVuZ3RoIDwgYnVkZ2V0OyBkZXB0aCsrKSB7XG4gICAgICAgIGNvbnN0IG5leHQ6IEFycmF5PHsgZmlsZVBhdGg6IHN0cmluZywgY29udGVudDogc3RyaW5nIH0+ID0gW11cblxuICAgICAgICBmb3IgKGNvbnN0IHsgZmlsZVBhdGgsIGNvbnRlbnQgfSBvZiBmcm9udGllcikge1xuICAgICAgICAgICAgLy8gYGZyb20gJy4veCdgLCBgaW1wb3J0ICcuL3gnYCwgYGltcG9ydCgnLi94JylgLCBgcmVxdWlyZSgnLi94JylgXG4gICAgICAgICAgICBjb25zdCBpbXBvcnRSZWdleCA9IC8oPzpmcm9tfGltcG9ydHxyZXF1aXJlKVxccypcXCg/XFxzKlsnXCJdKFxcLlteJ1wiXSopWydcIl0vZ1xuICAgICAgICAgICAgbGV0IG1hdGNoOiBSZWdFeHBFeGVjQXJyYXkgfCBudWxsXG5cbiAgICAgICAgICAgIHdoaWxlICgobWF0Y2ggPSBpbXBvcnRSZWdleC5leGVjKGNvbnRlbnQpKSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGlmIChmb3VuZC5sZW5ndGggPj0gYnVkZ2V0KSB7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IHJlc29sdmVkID0gcmVzb2x2ZVJlbGF0aXZlSW1wb3J0KG1hdGNoWzFdLCBmaWxlUGF0aClcbiAgICAgICAgICAgICAgICBpZiAoIXJlc29sdmVkIHx8IHNlZW4uaGFzKHJlc29sdmVkKSB8fCByZXNvbHZlZC5pbmNsdWRlcyhgJHtwYXRoLnNlcH1ub2RlX21vZHVsZXMke3BhdGguc2VwfWApKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHNlZW4uYWRkKHJlc29sdmVkKVxuXG4gICAgICAgICAgICAgICAgY29uc3QgeyBjb250ZW50OiBpbXBvcnRlZENvbnRlbnQgfSA9IHJlYWRDYXBwZWRGaWxlKHJlc29sdmVkKVxuICAgICAgICAgICAgICAgIGlmIChpbXBvcnRlZENvbnRlbnQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBmb3VuZC5wdXNoKHsgZmlsZVBhdGg6IHJlc29sdmVkLCBjb250ZW50OiBpbXBvcnRlZENvbnRlbnQgfSlcbiAgICAgICAgICAgICAgICBuZXh0LnB1c2goeyBmaWxlUGF0aDogcmVzb2x2ZWQsIGNvbnRlbnQ6IGltcG9ydGVkQ29udGVudCB9KVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG5leHQubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgICAgIGZyb250aWVyID0gbmV4dFxuICAgIH1cblxuICAgIHJldHVybiBmb3VuZFxufVxuXG4vKipcbiAqIEdpdmUgZXZlcnkgYXJjaGl2ZSBlbnRyeSBhIHVuaXF1ZSBuYW1lLiBUd28gY29uZmlncyBjYW4gc2hhcmUgYSBiYXNlbmFtZVxuICogKGBjb25maWdzL3dkaW8uY29uZi50c2AgKyBgc2hhcmVkL3dkaW8uY29uZi50c2ApOyB3aXRob3V0IHRoaXMgdGhlIHNlY29uZCBzaWxlbnRseVxuICogb3ZlcndyaXRlcyB0aGUgZmlyc3QsIHNpbmNlIGFyY2hpdmUgZW50cmllcyBhcmUga2V5ZWQgYnkgYmFzZW5hbWUuXG4gKlxuICogU2hhcmVkIHdpdGggYHVwbG9hZExvZ3NgLCB3aGljaCBkZS1kdXBlcyB0aGUgY29waWVkIGxvZyBmaWxlcyBhZ2FpbnN0IHRoZXNlIGVudHJpZXMgXHUyMDE0XG4gKiBvbmUgaW1wbGVtZW50YXRpb24gc28gdGhlIHR3byBjYW4gbmV2ZXIgZGlzYWdyZWUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWR1cGVFbnRyeU5hbWUoZmlsZVBhdGg6IHN0cmluZywgdGFrZW46IFNldDxzdHJpbmc+KTogc3RyaW5nIHtcbiAgICBjb25zdCBiYXNlID0gcGF0aC5iYXNlbmFtZShmaWxlUGF0aClcbiAgICBpZiAoIXRha2VuLmhhcyhiYXNlKSkge1xuICAgICAgICB0YWtlbi5hZGQoYmFzZSlcbiAgICAgICAgcmV0dXJuIGJhc2VcbiAgICB9XG5cbiAgICBjb25zdCBleHQgPSBwYXRoLmV4dG5hbWUoYmFzZSlcbiAgICBjb25zdCBzdGVtID0gZXh0ID8gYmFzZS5zbGljZSgwLCAtZXh0Lmxlbmd0aCkgOiBiYXNlXG4gICAgbGV0IGluZGV4ID0gMVxuICAgIGxldCBjYW5kaWRhdGUgPSBgJHtzdGVtfS4ke2luZGV4fSR7ZXh0fWBcbiAgICB3aGlsZSAodGFrZW4uaGFzKGNhbmRpZGF0ZSkpIHtcbiAgICAgICAgaW5kZXgrK1xuICAgICAgICBjYW5kaWRhdGUgPSBgJHtzdGVtfS4ke2luZGV4fSR7ZXh0fWBcbiAgICB9XG4gICAgdGFrZW4uYWRkKGNhbmRpZGF0ZSlcbiAgICByZXR1cm4gY2FuZGlkYXRlXG59XG5cbi8qKlxuICogQnVpbGQgdGhlIHJlZGFjdGVkIGNvbmZpZyBlbnRyaWVzIGFkZGVkIHRvIHRoZSBhdXRvLWNhcHR1cmVkIGxvZyBhcmNoaXZlLlxuICpcbiAqIEJlc3QgZWZmb3J0IGJ5IGNvbnRyYWN0OiBhbnkgZmFpbHVyZSByZXR1cm5zIHdoYXQgd2FzIGdhdGhlcmVkIHNvIGZhciBhbmQgYSByZWFzb25cbiAqIHN0cmluZyBmb3IgdGhlIFNES19VUExPQURfTE9HUyBldmVudC4gSXQgbXVzdCBuZXZlciB0aHJvdyBcdTIwMTQgYSBkZWJ1ZyBhcnRpZmFjdCBpcyBuZXZlclxuICogd29ydGggZmFpbGluZyBhIGN1c3RvbWVyJ3MgdGVzdCBydW4gb3Zlci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbGxlY3RDb25maWdGaWxlc0ZvclVwbG9hZChjb25maWc/OiBPcHRpb25zLlRlc3RydW5uZXIpOiB7IGZpbGVzOiBDYXB0dXJlZEZpbGVbXSwgZmFpbHVyZXM6IHN0cmluZ1tdLCBzdHJhdGVneT86IHN0cmluZyB9IHtcbiAgICBjb25zdCBmYWlsdXJlczogc3RyaW5nW10gPSBbXVxuICAgIGNvbnN0IGZpbGVzOiBDYXB0dXJlZEZpbGVbXSA9IFtdXG4gICAgY29uc3QgdGFrZW5OYW1lcyA9IG5ldyBTZXQ8c3RyaW5nPigpXG5cbiAgICB0cnkge1xuICAgICAgICBjb25zdCByZXNvbHV0aW9uID0gaW5pdFdkaW9Db25maWdQYXRoKGNvbmZpZylcbiAgICAgICAgaWYgKCFyZXNvbHV0aW9uLmNvbmZpZ1BhdGgpIHtcbiAgICAgICAgICAgIGZhaWx1cmVzLnB1c2gocmVzb2x1dGlvbi5yZWFzb24gfHwgJ2NvbmZpZ19ub3RfZm91bmQnKVxuICAgICAgICAgICAgcmV0dXJuIHsgZmlsZXMsIGZhaWx1cmVzIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHsgY29udGVudCwgcmVhc29uIH0gPSByZWFkQ2FwcGVkRmlsZShyZXNvbHV0aW9uLmNvbmZpZ1BhdGgpXG4gICAgICAgIGlmIChjb250ZW50ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGZhaWx1cmVzLnB1c2gocmVhc29uIHx8ICdjb25maWdfcmVhZF9mYWlsZWQnKVxuICAgICAgICAgICAgcmV0dXJuIHsgZmlsZXMsIGZhaWx1cmVzLCBzdHJhdGVneTogcmVzb2x1dGlvbi5zdHJhdGVneSB9XG4gICAgICAgIH1cblxuICAgICAgICBmaWxlcy5wdXNoKHtcbiAgICAgICAgICAgIG5hbWU6IGRlZHVwZUVudHJ5TmFtZShyZXNvbHV0aW9uLmNvbmZpZ1BhdGgsIHRha2VuTmFtZXMpLFxuICAgICAgICAgICAgc291cmNlUGF0aDogcmVzb2x1dGlvbi5jb25maWdQYXRoLFxuICAgICAgICAgICAgY29udGVudDogcmVkYWN0U2Vuc2l0aXZlQ29udGVudChjb250ZW50KVxuICAgICAgICB9KVxuXG4gICAgICAgIGNvbnN0IHJlbWFpbmluZyA9IE1BWF9DQVBUVVJFRF9DT05GSUdfRklMRVMgLSBmaWxlcy5sZW5ndGhcbiAgICAgICAgaWYgKHJlbWFpbmluZyA+IDApIHtcbiAgICAgICAgICAgIC8vIGNvbnRlbnQgY29tZXMgYmFjayBmcm9tIHRoZSBkaXNjb3ZlcnkgcGFzcyBcdTIwMTQgcmUtcmVhZGluZyBoZXJlIHdvdWxkIGJlIGEgc2Vjb25kXG4gICAgICAgICAgICAvLyBkaXNrIHJlYWQgcGVyIGZpbGUgYW5kIGNvdWxkIGFyY2hpdmUgZGlmZmVyZW50IGJ5dGVzIHRoYW4gd2VyZSBzY2FubmVkLlxuICAgICAgICAgICAgZm9yIChjb25zdCBpbXBvcnRlZCBvZiBjb2xsZWN0TG9jYWxJbXBvcnRzKHJlc29sdXRpb24uY29uZmlnUGF0aCwgY29udGVudCwgcmVtYWluaW5nKSkge1xuICAgICAgICAgICAgICAgIGZpbGVzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBkZWR1cGVFbnRyeU5hbWUoaW1wb3J0ZWQuZmlsZVBhdGgsIHRha2VuTmFtZXMpLFxuICAgICAgICAgICAgICAgICAgICBzb3VyY2VQYXRoOiBpbXBvcnRlZC5maWxlUGF0aCxcbiAgICAgICAgICAgICAgICAgICAgY29udGVudDogcmVkYWN0U2Vuc2l0aXZlQ29udGVudChpbXBvcnRlZC5jb250ZW50KVxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4geyBmaWxlcywgZmFpbHVyZXMsIHN0cmF0ZWd5OiByZXNvbHV0aW9uLnN0cmF0ZWd5IH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBmYWlsdXJlcy5wdXNoKGBjb25maWdfY2FwdHVyZV9leGNlcHRpb246ICR7KGVycm9yIGFzIEVycm9yKT8ubWVzc2FnZSB8fCBTdHJpbmcoZXJyb3IpfWApXG4gICAgICAgIHJldHVybiB7IGZpbGVzLCBmYWlsdXJlcyB9XG4gICAgfVxufVxuXG4vKipcbiAqIFdhbGsgdXAgZnJvbSBgc3RhcnREaXJgIGxvb2tpbmcgZm9yIGBmaWxlTmFtZWAsIHN0b3BwaW5nIGF0IHRoZSBmaWxlc3lzdGVtIHJvb3Qgb3JcbiAqIGFmdGVyIE1BWF9QQUNLQUdFX0pTT05fV0FMS19VUCBsZXZlbHMuXG4gKi9cbmNvbnN0IGZpbmRVcHdhcmRzID0gKHN0YXJ0RGlyOiBzdHJpbmcsIGZpbGVOYW1lOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQgPT4ge1xuICAgIGxldCBjdXJyZW50ID0gc3RhcnREaXJcbiAgICBmb3IgKGxldCBkZXB0aCA9IDA7IGRlcHRoIDw9IE1BWF9QQUNLQUdFX0pTT05fV0FMS19VUDsgZGVwdGgrKykge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSBwYXRoLmpvaW4oY3VycmVudCwgZmlsZU5hbWUpXG4gICAgICAgIGlmIChpc1JlYWRhYmxlRmlsZShjYW5kaWRhdGUpKSB7XG4gICAgICAgICAgICByZXR1cm4gY2FuZGlkYXRlXG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcGFyZW50ID0gcGF0aC5kaXJuYW1lKGN1cnJlbnQpXG4gICAgICAgIGlmIChwYXJlbnQgPT09IGN1cnJlbnQpIHtcbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICAgICAgY3VycmVudCA9IHBhcmVudFxuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkXG59XG5cbi8qKlxuICogYHBhY2thZ2UuanNvbmAgZm9yIHRoZSBwcm9qZWN0IHRoZSBjb25maWcgYmVsb25ncyB0byBcdTIwMTQgZnJhbWV3b3JrIGFuZCBzZXJ2aWNlIHZlcnNpb25zXG4gKiBhcmUgdGhlIGZpcnN0IHRoaW5nIHRyaWFnZSBuZWVkcywgYW5kIHRoZSBhcmNoaXZlIGNhcnJpZWQgbmVpdGhlciBiZWZvcmUuXG4gKlxuICogV2Fsa3MgVVAgZnJvbSB0aGUgY29uZmlnJ3MgZGlyZWN0b3J5LCBiZWNhdXNlIGBjb25maWdzL3dkaW8uY29uZi50c2AgKGEgdmVyeSBjb21tb25cbiAqIGxheW91dCkgcHV0cyB0aGUgbWFuaWZlc3Qgb25lIG9yIG1vcmUgbGV2ZWxzIGFib3ZlIHRoZSBjb25maWcsIG5vdCBiZXNpZGUgaXQuXG4gKiBBcmNoaXZlZCB2ZXJiYXRpbTogaXQgaXMgYSBtYW5pZmVzdCwgbm90IGEgc2VjcmV0IHN0b3JlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZmluZFBhY2thZ2VKc29uRm9yVXBsb2FkKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgY29uZmlnUGF0aCA9IHByb2Nlc3MuZW52W0JST1dTRVJTVEFDS19XRElPX0NPTkZJR19GSUxFX1BBVEhdXG4gICAgY29uc3Qgc3RhcnREaXJzID0gW2NvbmZpZ1BhdGggPyBwYXRoLmRpcm5hbWUoY29uZmlnUGF0aCkgOiB1bmRlZmluZWQsIHByb2Nlc3MuY3dkKCldXG4gICAgICAgIC5maWx0ZXIoKGRpcik6IGRpciBpcyBzdHJpbmcgPT4gQm9vbGVhbihkaXIpKVxuXG4gICAgZm9yIChjb25zdCBkaXIgb2YgQXJyYXkuZnJvbShuZXcgU2V0KHN0YXJ0RGlycykpKSB7XG4gICAgICAgIGNvbnN0IGZvdW5kID0gZmluZFVwd2FyZHMoZGlyLCAncGFja2FnZS5qc29uJylcbiAgICAgICAgaWYgKGZvdW5kKSB7XG4gICAgICAgICAgICByZXR1cm4gZm91bmRcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkXG59XG4iLCAiaW1wb3J0IHsgQlN0YWNrTG9nZ2VyIH0gZnJvbSAnLi4vYnN0YWNrTG9nZ2VyLmpzJ1xuaW1wb3J0IHR5cGUgeyBGZWF0dXJlU3RhdHNPdmVydmlldyB9IGZyb20gJy4uL3R5cGVzLmpzJ1xuaW1wb3J0IHsgaXNPYmplY3RFbXB0eSB9IGZyb20gJy4uL3V0aWwuanMnXG5cbmludGVyZmFjZSBGZWF0dXJlU3RhdHNNYXAge1xuICAgIFtncm91cElkOiBzdHJpbmddOiBGZWF0dXJlU3RhdHM7XG59XG5cbmludGVyZmFjZSBKU09OQ29udmVyc2lvblNldHRpbmdzIHtcbiAgICBvbWl0R3JvdXBzPzogYm9vbGVhblxuICAgIG9ubHlHcm91cHM/OiBib29sZWFuXG4gICAgbmVzdGVkR3JvdXBzPzogYm9vbGVhblxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEZlYXR1cmUge1xuICAgIHRyaWdnZXJlZENvdW50OiBudW1iZXJcbiAgICBzZW50Q291bnQ6IG51bWJlclxuICAgIGZhaWxlZENvdW50OiBudW1iZXJcbiAgICBncm91cHM6IEZlYXR1cmVbXVxufVxuXG5jbGFzcyBGZWF0dXJlU3RhdHMge1xuICAgIHByaXZhdGUgdHJpZ2dlcmVkQ291bnQ6IG51bWJlciA9IDBcbiAgICBwcml2YXRlIHNlbnRDb3VudDogbnVtYmVyID0gMFxuICAgIHByaXZhdGUgZmFpbGVkQ291bnQ6IG51bWJlciA9IDBcbiAgICBwcml2YXRlIGdyb3VwczogRmVhdHVyZVN0YXRzTWFwID0ge31cblxuICAgIHB1YmxpYyBtYXJrKHN0YXR1czogc3RyaW5nLCBncm91cElkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgc3dpdGNoIChzdGF0dXMpIHtcbiAgICAgICAgY2FzZSAndHJpZ2dlcmVkJzpcbiAgICAgICAgICAgIHRoaXMudHJpZ2dlcmVkKGdyb3VwSWQpXG4gICAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlICdzdWNjZXNzJzpcbiAgICAgICAgY2FzZSAnc2VudCc6XG4gICAgICAgICAgICB0aGlzLnNlbnQoZ3JvdXBJZClcbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgJ2ZhaWxlZCc6XG4gICAgICAgICAgICB0aGlzLmZhaWxlZChncm91cElkKVxuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIEJTdGFja0xvZ2dlci5kZWJ1ZygnUmVxdWVzdCB0byBtYXJrIHVzYWdlIGZvciB1bmtub3duIHN0YXR1cyAtICcgKyBzdGF0dXMpXG4gICAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHRyaWdnZXJlZChncm91cElkPzogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIHRoaXMudHJpZ2dlcmVkQ291bnQgKz0gMVxuICAgICAgICBpZiAoZ3JvdXBJZCkge1xuICAgICAgICAgICAgdGhpcy5jcmVhdGVHcm91cChncm91cElkKS50cmlnZ2VyZWQoKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHNlbnQoZ3JvdXBJZD86IHN0cmluZyk6IHZvaWQge1xuICAgICAgICB0aGlzLnNlbnRDb3VudCArPSAxXG4gICAgICAgIGlmIChncm91cElkKSB7XG4gICAgICAgICAgICB0aGlzLmNyZWF0ZUdyb3VwKGdyb3VwSWQpLnNlbnQoKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGZhaWxlZChncm91cElkPzogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZmFpbGVkQ291bnQgKz0gMVxuICAgICAgICBpZiAoZ3JvdXBJZCkge1xuICAgICAgICAgICAgdGhpcy5jcmVhdGVHcm91cChncm91cElkKS5mYWlsZWQoKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHN1Y2Nlc3MoZ3JvdXBJZD86IHN0cmluZyk6IHZvaWQge1xuICAgICAgICB0aGlzLnNlbnQoZ3JvdXBJZClcbiAgICB9XG5cbiAgICBwdWJsaWMgY3JlYXRlR3JvdXAoZ3JvdXBJZDogc3RyaW5nKTogRmVhdHVyZVN0YXRzIHtcbiAgICAgICAgaWYgKCF0aGlzLmdyb3Vwc1tncm91cElkXSkge1xuICAgICAgICAgICAgdGhpcy5ncm91cHNbZ3JvdXBJZF0gPSBuZXcgRmVhdHVyZVN0YXRzKClcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5ncm91cHNbZ3JvdXBJZF1cbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0VHJpZ2dlcmVkQ291bnQoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudHJpZ2dlcmVkQ291bnRcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0U2VudENvdW50KCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLnNlbnRDb3VudFxuICAgIH1cblxuICAgIHB1YmxpYyBnZXRGYWlsZWRDb3VudCgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5mYWlsZWRDb3VudFxuICAgIH1cblxuICAgIHB1YmxpYyBnZXRVc2FnZUZvckdyb3VwKGdyb3VwSWQ6IHN0cmluZyk6IEZlYXR1cmVTdGF0cyB7XG4gICAgICAgIHJldHVybiB0aGlzLmdyb3Vwc1tncm91cElkXSB8fCBuZXcgRmVhdHVyZVN0YXRzKClcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0T3ZlcnZpZXcoKTogRmVhdHVyZVN0YXRzT3ZlcnZpZXcge1xuICAgICAgICByZXR1cm4geyB0cmlnZ2VyZWRDb3VudDogdGhpcy50cmlnZ2VyZWRDb3VudCwgc2VudENvdW50OiB0aGlzLnNlbnRDb3VudCwgZmFpbGVkQ291bnQ6IHRoaXMuZmFpbGVkQ291bnQgfVxuICAgIH1cblxuICAgIHB1YmxpYyBnZXRHcm91cHMoKTogRmVhdHVyZVN0YXRzTWFwIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ3JvdXBzXG4gICAgfVxuXG4gICAgcHVibGljIGFkZChmZWF0dXJlU3RhdHM6IEZlYXR1cmVTdGF0cyk6IHZvaWQge1xuICAgICAgICB0aGlzLnRyaWdnZXJlZENvdW50ICs9IGZlYXR1cmVTdGF0cy5nZXRUcmlnZ2VyZWRDb3VudCgpXG4gICAgICAgIHRoaXMuc2VudENvdW50ICs9IGZlYXR1cmVTdGF0cy5nZXRTZW50Q291bnQoKVxuICAgICAgICB0aGlzLmZhaWxlZENvdW50ICs9IGZlYXR1cmVTdGF0cy5nZXRGYWlsZWRDb3VudCgpXG5cbiAgICAgICAgT2JqZWN0LmVudHJpZXMoZmVhdHVyZVN0YXRzLmdldEdyb3VwcygpKS5mb3JFYWNoKChbZ3JvdXBJZCwgZ3JvdXBdKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmNyZWF0ZUdyb3VwKGdyb3VwSWQpLmFkZChncm91cClcbiAgICAgICAgfSlcbiAgICB9XG5cbiAgICAvLyBvbWl0R3JvdXBzOiB0cnVlL2ZhbHNlIC0+IEluY2x1ZGUgZ3JvdXBzIG9yIG5vdFxuICAgIC8vIG9ubHlHcm91cHM6IHRydWUvZmFsc2UgLT4gZGF0YSBpbmNsdWRlcyBvbmx5IGdyb3Vwc1xuICAgIC8vIG5lc3RlZEdyb3VwczogdHJ1ZS9mYWxzZSAtPiBncm91cHMgd2lsbCBiZSBuZXN0ZWQgaW4gZ3JvdXBzIGlmIHRydWVcbiAgICBwdWJsaWMgdG9KU09OKGNvbmZpZzogSlNPTkNvbnZlcnNpb25TZXR0aW5ncyA9IHt9KSB7XG4gICAgICAgIGNvbnN0IG92ZXJ2aWV3RGF0YTogRmVhdHVyZVN0YXRzT3ZlcnZpZXd8UmVjb3JkPHN0cmluZywgbmV2ZXI+ID0gIWNvbmZpZy5vbmx5R3JvdXBzID8ge1xuICAgICAgICAgICAgdHJpZ2dlcmVkQ291bnQ6IHRoaXMudHJpZ2dlcmVkQ291bnQsXG4gICAgICAgICAgICBzZW50Q291bnQ6IHRoaXMuc2VudENvdW50LFxuICAgICAgICAgICAgZmFpbGVkQ291bnQ6IHRoaXMuZmFpbGVkQ291bnRcbiAgICAgICAgfSA6IHt9XG5cbiAgICAgICAgY29uc3QgZ3JvdXBzRGF0YTogUmVjb3JkPHN0cmluZywgRmVhdHVyZVN0YXRzT3ZlcnZpZXc+ID0ge31cbiAgICAgICAgaWYgKCFjb25maWcub21pdEdyb3Vwcykge1xuICAgICAgICAgICAgT2JqZWN0LmVudHJpZXModGhpcy5ncm91cHMpLmZvckVhY2goKFtncm91cElkLCBncm91cF0pID0+IHtcbiAgICAgICAgICAgICAgICBncm91cHNEYXRhW2dyb3VwSWRdID0gKGdyb3VwLnRvSlNPTigpIGFzIEZlYXR1cmVTdGF0c092ZXJ2aWV3KSAvLyBDdXJyZW50bHkgTmVzdGVkIGdyb3VwcyBhcmUgb25seSBvdmVydmlld3NcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZ3JvdXAgPSBjb25maWcubmVzdGVkR3JvdXBzID8geyBncm91cHM6IGdyb3Vwc0RhdGEgfSA6IGdyb3Vwc0RhdGFcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgLi4ub3ZlcnZpZXdEYXRhLFxuICAgICAgICAgICAgLi4uZ3JvdXBcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZnJvbUpTT04oanNvbjogRmVhdHVyZSk6IEZlYXR1cmVTdGF0cyB7XG4gICAgICAgIGNvbnN0IHN0YXRzID0gbmV3IEZlYXR1cmVTdGF0cygpXG5cbiAgICAgICAgaWYgKCFqc29uIHx8IGlzT2JqZWN0RW1wdHkoanNvbikpIHtcbiAgICAgICAgICAgIHJldHVybiBzdGF0c1xuICAgICAgICB9XG4gICAgICAgIHN0YXRzLnRyaWdnZXJlZENvdW50ID0ganNvbi50cmlnZ2VyZWRDb3VudFxuICAgICAgICBzdGF0cy5zZW50Q291bnQgPSBqc29uLnNlbnRDb3VudFxuICAgICAgICBzdGF0cy5mYWlsZWRDb3VudCA9IGpzb24uZmFpbGVkQ291bnRcblxuICAgICAgICBpZiAoIWpzb24uZ3JvdXBzKSB7XG4gICAgICAgICAgICByZXR1cm4gc3RhdHNcbiAgICAgICAgfVxuICAgICAgICBPYmplY3QuZW50cmllcyhqc29uLmdyb3VwcykuZm9yRWFjaCgoW2dyb3VwSWQsIGdyb3VwXSkgPT4ge1xuICAgICAgICAgICAgc3RhdHMuZ3JvdXBzW2dyb3VwSWRdID0gRmVhdHVyZVN0YXRzLmZyb21KU09OKGdyb3VwKVxuICAgICAgICB9KVxuICAgICAgICByZXR1cm4gc3RhdHNcbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IEZlYXR1cmVTdGF0c1xuIiwgImltcG9ydCB7IGdldEVycm9yU3RyaW5nIH0gZnJvbSAnLi4vdXRpbC5qcydcblxuY2xhc3MgRmVhdHVyZVVzYWdlIHtcbiAgICBwcml2YXRlIGlzVHJpZ2dlcmVkPzogYm9vbGVhblxuICAgIHByaXZhdGUgc3RhdHVzPzogc3RyaW5nXG4gICAgcHJpdmF0ZSBlcnJvcj86IHN0cmluZ1xuXG4gICAgY29uc3RydWN0b3IoaXNUcmlnZ2VyZWQ/OiBib29sZWFuKSB7XG4gICAgICAgIGlmIChpc1RyaWdnZXJlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aGlzLmlzVHJpZ2dlcmVkID0gaXNUcmlnZ2VyZWRcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBnZXRUcmlnZ2VyZWQoKTogYm9vbGVhbiB8IHVuZGVmaW5lZCB7XG4gICAgICAgIHJldHVybiB0aGlzLmlzVHJpZ2dlcmVkXG4gICAgfVxuXG4gICAgcHVibGljIHNldFRyaWdnZXJlZCh0cmlnZ2VyZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAgICAgdGhpcy5pc1RyaWdnZXJlZCA9IHRyaWdnZXJlZFxuICAgIH1cblxuICAgIHB1YmxpYyBzZXRTdGF0dXMoc3RhdHVzOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5zdGF0dXMgPSBzdGF0dXNcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0RXJyb3IoZXJyb3I6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICB0aGlzLmVycm9yID0gZXJyb3JcbiAgICB9XG5cbiAgICBwdWJsaWMgdHJpZ2dlcmVkKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmlzVHJpZ2dlcmVkID0gdHJ1ZVxuICAgIH1cblxuICAgIHB1YmxpYyBmYWlsZWQoZTogdW5rbm93bik6IHZvaWQge1xuICAgICAgICB0aGlzLnN0YXR1cyA9ICdmYWlsZWQnXG4gICAgICAgIHRoaXMuZXJyb3IgPSBnZXRFcnJvclN0cmluZyhlKVxuICAgIH1cblxuICAgIHB1YmxpYyBzdWNjZXNzKCk6IHZvaWQge1xuICAgICAgICB0aGlzLnN0YXR1cyA9ICdzdWNjZXNzJ1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRTdGF0dXMoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RhdHVzXG4gICAgfVxuXG4gICAgcHVibGljIGdldEVycm9yKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgICAgIHJldHVybiB0aGlzLmVycm9yXG4gICAgfVxuXG4gICAgcHVibGljIHRvSlNPTigpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGlzVHJpZ2dlcmVkOiB0aGlzLmlzVHJpZ2dlcmVkLFxuICAgICAgICAgICAgc3RhdHVzOiB0aGlzLnN0YXR1cyxcbiAgICAgICAgICAgIGVycm9yOiB0aGlzLmVycm9yXG4gICAgICAgIH1cbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IEZlYXR1cmVVc2FnZVxuIiwgImNsYXNzIFRlc3RPcHNDb25maWcge1xuICAgIHByaXZhdGUgc3RhdGljIF9pbnN0YW5jZTogVGVzdE9wc0NvbmZpZ1xuICAgIHB1YmxpYyBidWlsZFN0b3BwZWQ6IGJvb2xlYW4gPSBmYWxzZVxuICAgIHB1YmxpYyBidWlsZEhhc2hlZElkPzogc3RyaW5nXG5cbiAgICBzdGF0aWMgZ2V0SW5zdGFuY2UoLi4uYXJnczogdW5rbm93bltdKSB7XG4gICAgICAgIGlmICghdGhpcy5faW5zdGFuY2UpIHtcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgcGFzc2luZyBhcmdzIHRvIGNvbnN0cnVjdG9yXG4gICAgICAgICAgICB0aGlzLl9pbnN0YW5jZSA9IG5ldyBUZXN0T3BzQ29uZmlnKC4uLmFyZ3MpXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX2luc3RhbmNlXG4gICAgfVxuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHB1YmxpYyBlbmFibGVkOiBib29sZWFuID0gdHJ1ZSxcbiAgICAgICAgcHVibGljIG1hbnVhbGx5U2V0OiBib29sZWFuID0gZmFsc2UsXG4gICAgKXtcbiAgICAgICAgVGVzdE9wc0NvbmZpZy5faW5zdGFuY2UgPSB0aGlzXG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBUZXN0T3BzQ29uZmlnXG4iLCAiaW1wb3J0IEZlYXR1cmVTdGF0cywgeyB0eXBlIEZlYXR1cmUgfSBmcm9tICcuL2ZlYXR1cmVTdGF0cy5qcydcbmltcG9ydCBGZWF0dXJlVXNhZ2UgZnJvbSAnLi9mZWF0dXJlVXNhZ2UuanMnXG5pbXBvcnQgeyBCU3RhY2tMb2dnZXIgfSBmcm9tICcuLi9ic3RhY2tMb2dnZXIuanMnXG5pbXBvcnQgVGVzdE9wc0NvbmZpZyBmcm9tICcuL3Rlc3RPcHNDb25maWcuanMnXG5pbXBvcnQgdHlwZSB7IFRPVXNhZ2VTdGF0cyB9IGZyb20gJy4uL3R5cGVzLmpzJ1xuXG5leHBvcnQgaW50ZXJmYWNlIFVzYWdlU3RhdCB7XG4gICAgdGVzdEV2ZW50czoge1xuICAgICAgICBzdGFydGVkOiBGZWF0dXJlXG4gICAgICAgIGZpbmlzaGVkOiBGZWF0dXJlXG4gICAgfVxuICAgIGhvb2tFdmVudHM6IHtcbiAgICAgICAgc3RhcnRlZDogRmVhdHVyZVxuICAgICAgICBmaW5pc2hlZDogRmVhdHVyZVxuICAgIH1cbiAgICBsb2dFdmVudHM6IEZlYXR1cmVcbiAgICBjYnRTZXNzaW9uRXZlbnRzOiBGZWF0dXJlXG4gICAgY2J0U2Vzc2lvblN0YXRzOiBGZWF0dXJlXG59XG5cbmNsYXNzIFVzYWdlU3RhdHMge1xuICAgIHB1YmxpYyBzdGF0aWMgaW5zdGFuY2U6IFVzYWdlU3RhdHNcbiAgICBwdWJsaWMgdGVzdFN0YXJ0ZWRTdGF0czogRmVhdHVyZVN0YXRzXG4gICAgcHVibGljIHRlc3RGaW5pc2hlZFN0YXRzOiBGZWF0dXJlU3RhdHNcbiAgICBwdWJsaWMgaG9va1N0YXJ0ZWRTdGF0czogRmVhdHVyZVN0YXRzXG4gICAgcHVibGljIGhvb2tGaW5pc2hlZFN0YXRzOiBGZWF0dXJlU3RhdHNcbiAgICBwdWJsaWMgY2J0U2Vzc2lvblN0YXRzOiBGZWF0dXJlU3RhdHNcbiAgICBwdWJsaWMgbG9nU3RhdHM6IEZlYXR1cmVTdGF0c1xuICAgIHB1YmxpYyBsYXVuY2hCdWlsZFVzYWdlOiBGZWF0dXJlVXNhZ2VcbiAgICBwdWJsaWMgc3RvcEJ1aWxkVXNhZ2U6IEZlYXR1cmVVc2FnZVxuXG4gICAgcHVibGljIHN0YXRpYyBnZXRJbnN0YW5jZSgpOiBVc2FnZVN0YXRzIHtcbiAgICAgICAgaWYgKCFVc2FnZVN0YXRzLmluc3RhbmNlKSB7XG4gICAgICAgICAgICBVc2FnZVN0YXRzLmluc3RhbmNlID0gbmV3IFVzYWdlU3RhdHMoKVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBVc2FnZVN0YXRzLmluc3RhbmNlXG4gICAgfVxuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMudGVzdFN0YXJ0ZWRTdGF0cyA9IG5ldyBGZWF0dXJlU3RhdHMoKVxuICAgICAgICB0aGlzLnRlc3RGaW5pc2hlZFN0YXRzID0gbmV3IEZlYXR1cmVTdGF0cygpXG4gICAgICAgIHRoaXMuaG9va1N0YXJ0ZWRTdGF0cyA9IG5ldyBGZWF0dXJlU3RhdHMoKVxuICAgICAgICB0aGlzLmhvb2tGaW5pc2hlZFN0YXRzID0gbmV3IEZlYXR1cmVTdGF0cygpXG4gICAgICAgIHRoaXMuY2J0U2Vzc2lvblN0YXRzID0gbmV3IEZlYXR1cmVTdGF0cygpXG4gICAgICAgIHRoaXMubG9nU3RhdHMgPSBuZXcgRmVhdHVyZVN0YXRzKClcbiAgICAgICAgdGhpcy5sYXVuY2hCdWlsZFVzYWdlID0gbmV3IEZlYXR1cmVVc2FnZSgpXG4gICAgICAgIHRoaXMuc3RvcEJ1aWxkVXNhZ2UgPSBuZXcgRmVhdHVyZVVzYWdlKClcbiAgICB9XG5cbiAgICBwdWJsaWMgYWRkKHVzYWdlU3RhdHM6IFVzYWdlU3RhdHMpOiB2b2lkIHtcbiAgICAgICAgdGhpcy50ZXN0U3RhcnRlZFN0YXRzLmFkZCh1c2FnZVN0YXRzLnRlc3RTdGFydGVkU3RhdHMpXG4gICAgICAgIHRoaXMudGVzdEZpbmlzaGVkU3RhdHMuYWRkKHVzYWdlU3RhdHMudGVzdEZpbmlzaGVkU3RhdHMpXG4gICAgICAgIHRoaXMuaG9va1N0YXJ0ZWRTdGF0cy5hZGQodXNhZ2VTdGF0cy5ob29rU3RhcnRlZFN0YXRzKVxuICAgICAgICB0aGlzLmhvb2tGaW5pc2hlZFN0YXRzLmFkZCh1c2FnZVN0YXRzLmhvb2tGaW5pc2hlZFN0YXRzKVxuICAgICAgICB0aGlzLmNidFNlc3Npb25TdGF0cy5hZGQodXNhZ2VTdGF0cy5jYnRTZXNzaW9uU3RhdHMpXG4gICAgICAgIHRoaXMubG9nU3RhdHMuYWRkKHVzYWdlU3RhdHMubG9nU3RhdHMpXG4gICAgfVxuXG4gICAgcHVibGljIGdldEZvcm1hdHRlZERhdGEod29ya2Vyc0RhdGE6IHsgdXNhZ2VTdGF0czogVXNhZ2VTdGF0IH1bXSkge1xuICAgICAgICB0aGlzLmFkZERhdGFGcm9tV29ya2Vycyh3b3JrZXJzRGF0YSlcbiAgICAgICAgY29uc3QgdGVzdE9wc0NvbmZpZyA9IFRlc3RPcHNDb25maWcuZ2V0SW5zdGFuY2UoKVxuICAgICAgICBjb25zdCB1c2FnZTogVE9Vc2FnZVN0YXRzID0ge1xuICAgICAgICAgICAgZW5hYmxlZDogdGVzdE9wc0NvbmZpZy5lbmFibGVkLFxuICAgICAgICAgICAgbWFudWFsbHlTZXQ6IHRlc3RPcHNDb25maWcubWFudWFsbHlTZXQsXG4gICAgICAgICAgICBidWlsZEhhc2hlZElkOiB0ZXN0T3BzQ29uZmlnLmJ1aWxkSGFzaGVkSWRcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdXNhZ2UuZW5hYmxlZCkge1xuICAgICAgICAgICAgcmV0dXJuIHVzYWdlXG4gICAgICAgIH1cblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdXNhZ2UuZXZlbnRzID0gdGhpcy5nZXRFdmVudHNEYXRhKClcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLmRlYnVnKCdleGNlcHRpb24gaW4gZ2V0Rm9ybWF0dGVkRGF0YTogJyArIGUpXG5cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdXNhZ2VcbiAgICB9XG5cbiAgICBwdWJsaWMgYWRkRGF0YUZyb21Xb3JrZXJzKHdvcmtlcnNEYXRhOiB7IHVzYWdlU3RhdHM6IFVzYWdlU3RhdCB9W10pIHtcbiAgICAgICAgd29ya2Vyc0RhdGEubWFwKHdvcmtlckRhdGEgPT4ge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBjb25zdCB1c2FnZVN0YXRzRm9yV29ya2VyID0gVXNhZ2VTdGF0cy5mcm9tSlNPTih3b3JrZXJEYXRhLnVzYWdlU3RhdHMpXG4gICAgICAgICAgICAgICAgdGhpcy5hZGQodXNhZ2VTdGF0c0ZvcldvcmtlcilcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICBCU3RhY2tMb2dnZXIuZGVidWcoJ0V4Y2VwdGlvbiBpbiBhZGRpbmcgd29ya2VyRGF0YTogJyArIGUpXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgfVxuXG4gICAgcHVibGljIGdldEV2ZW50c0RhdGEoKXtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGJ1aWxkRXZlbnRzOiB7XG4gICAgICAgICAgICAgICAgc3RhcnRlZDogdGhpcy5sYXVuY2hCdWlsZFVzYWdlLnRvSlNPTigpLFxuICAgICAgICAgICAgICAgIGZpbmlzaGVkOiB0aGlzLnN0b3BCdWlsZFVzYWdlLnRvSlNPTigpXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdGVzdEV2ZW50czoge1xuICAgICAgICAgICAgICAgIHN0YXJ0ZWQ6IHRoaXMudGVzdFN0YXJ0ZWRTdGF0cy50b0pTT04oKSxcbiAgICAgICAgICAgICAgICBmaW5pc2hlZDogdGhpcy50ZXN0RmluaXNoZWRTdGF0cy50b0pTT04oeyBvbWl0R3JvdXBzOiB0cnVlIH0pLFxuICAgICAgICAgICAgICAgIC4uLnRoaXMudGVzdEZpbmlzaGVkU3RhdHMudG9KU09OKHsgb25seUdyb3VwczogdHJ1ZSB9KVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGhvb2tFdmVudHM6IHtcbiAgICAgICAgICAgICAgICBzdGFydGVkOiB0aGlzLmhvb2tTdGFydGVkU3RhdHMudG9KU09OKCksXG4gICAgICAgICAgICAgICAgZmluaXNoZWQ6IHRoaXMuaG9va0ZpbmlzaGVkU3RhdHMudG9KU09OKHsgb21pdEdyb3VwczogdHJ1ZSB9KSxcbiAgICAgICAgICAgICAgICAuLi50aGlzLmhvb2tGaW5pc2hlZFN0YXRzLnRvSlNPTih7IG9ubHlHcm91cHM6IHRydWUgfSlcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBsb2dFdmVudHM6IHRoaXMubG9nU3RhdHMudG9KU09OKCksXG4gICAgICAgICAgICBjYnRTZXNzaW9uRXZlbnRzOiB0aGlzLmNidFNlc3Npb25TdGF0cy50b0pTT04oKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGdldERhdGFUb1NhdmUoKXtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHRlc3RFdmVudHM6IHtcbiAgICAgICAgICAgICAgICBzdGFydGVkOiB0aGlzLnRlc3RTdGFydGVkU3RhdHMudG9KU09OKCksXG4gICAgICAgICAgICAgICAgZmluaXNoZWQ6IHRoaXMudGVzdEZpbmlzaGVkU3RhdHMudG9KU09OKHsgbmVzdGVkR3JvdXBzOiB0cnVlIH0pLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGhvb2tFdmVudHM6IHtcbiAgICAgICAgICAgICAgICBzdGFydGVkOiB0aGlzLmhvb2tTdGFydGVkU3RhdHMudG9KU09OKCksXG4gICAgICAgICAgICAgICAgZmluaXNoZWQ6IHRoaXMuaG9va0ZpbmlzaGVkU3RhdHMudG9KU09OKHsgbmVzdGVkR3JvdXBzOiB0cnVlIH0pLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGxvZ0V2ZW50czogdGhpcy5sb2dTdGF0cy50b0pTT04oeyBuZXN0ZWRHcm91cHM6IHRydWUgfSksXG4gICAgICAgICAgICBjYnRTZXNzaW9uRXZlbnRzOiB0aGlzLmNidFNlc3Npb25TdGF0cy50b0pTT04oKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBmcm9tSlNPTihkYXRhOiBVc2FnZVN0YXQpIHtcbiAgICAgICAgY29uc3QgdXNhZ2VTdGF0cyA9IG5ldyBVc2FnZVN0YXRzKClcbiAgICAgICAgdXNhZ2VTdGF0cy50ZXN0U3RhcnRlZFN0YXRzID0gRmVhdHVyZVN0YXRzLmZyb21KU09OKGRhdGEudGVzdEV2ZW50cy5zdGFydGVkKVxuICAgICAgICB1c2FnZVN0YXRzLnRlc3RGaW5pc2hlZFN0YXRzID0gRmVhdHVyZVN0YXRzLmZyb21KU09OKGRhdGEudGVzdEV2ZW50cy5maW5pc2hlZClcbiAgICAgICAgdXNhZ2VTdGF0cy5ob29rU3RhcnRlZFN0YXRzID0gRmVhdHVyZVN0YXRzLmZyb21KU09OKGRhdGEuaG9va0V2ZW50cy5zdGFydGVkKVxuICAgICAgICB1c2FnZVN0YXRzLmhvb2tGaW5pc2hlZFN0YXRzID0gRmVhdHVyZVN0YXRzLmZyb21KU09OKGRhdGEuaG9va0V2ZW50cy5maW5pc2hlZClcbiAgICAgICAgdXNhZ2VTdGF0cy5sb2dTdGF0cyA9IEZlYXR1cmVTdGF0cy5mcm9tSlNPTihkYXRhLmxvZ0V2ZW50cylcbiAgICAgICAgdXNhZ2VTdGF0cy5jYnRTZXNzaW9uU3RhdHMgPSBGZWF0dXJlU3RhdHMuZnJvbUpTT04oZGF0YS5jYnRTZXNzaW9uU3RhdHMpXG4gICAgICAgIHJldHVybiB1c2FnZVN0YXRzXG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBVc2FnZVN0YXRzXG4iLCAiaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJ1xuaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnXG5pbXBvcnQgb3MgZnJvbSAnbm9kZTpvcydcbmltcG9ydCB7IEJTdGFja0xvZ2dlciB9IGZyb20gJy4uL2JzdGFja0xvZ2dlci5qcydcblxuaW50ZXJmYWNlIFNjcmlwdHMge1xuICAgIHNjYW46IHN0cmluZ1xuICAgIGdldFJlc3VsdHM6IHN0cmluZ1xuICAgIGdldFJlc3VsdHNTdW1tYXJ5OiBzdHJpbmdcbiAgICBzYXZlUmVzdWx0czogc3RyaW5nXG59XG5cbmludGVyZmFjZSBDb21tYW5kIHtcbiAgICBuYW1lOiBzdHJpbmdcbiAgICBjbGFzczogc3RyaW5nXG59XG5cbi8qKlxuICogVGhlIGJpbmFyeSB0eXBlcyBBY2Nlc3NpYmlsaXR5Q2FwYWJpbGl0eS52YWx1ZSBhcyBhIHByb3RvIHN0cmluZywgc28gZ29vZzpjaHJvbWVPcHRpb25zXG4gKiBhcnJpdmVzIEpTT04tZW5jb2RlZCBvdmVyIGdSUEMgd2hlcmUgdGhlIEhUVFAgbGF1bmNoIHJlc3BvbnNlIGRlbGl2ZXJzIGEgcGxhaW4gb2JqZWN0LlxuICogQWNjZXB0IGJvdGguIEFueXRoaW5nIHRoYXQgZG9lcyBub3QgcmVzb2x2ZSB0byBhbiBvYmplY3QgaXMgZHJvcHBlZCByYXRoZXIgdGhhbiB3cml0dGVuXG4gKiBpbnRvIGEgVzNDIGNhcGFiaWxpdHksIHdoaWNoIHRoZSBodWIgcmVqZWN0cyBvdXRyaWdodC5cbiAqL1xuZnVuY3Rpb24gdG9DaHJvbWVPcHRpb25zKHZhbHVlOiB1bmtub3duKTogeyBba2V5OiBzdHJpbmddOiB1bmtub3duIH0gfCBudWxsIHtcbiAgICAvLyBBbiBhYnNlbnQgZmllbGQgaXMgdGhlIGNvbW1vbiBjYXNlIGFuZCBub3QgYSBkcm9wIFx1MjAxNCB1cGRhdGUoKSBydW5zIG9uIGV2ZXJ5IGxhdW5jaCByZXNwb25zZVxuICAgIC8vIGFuZCBldmVyeSByZWFkRnJvbUV4aXN0aW5nRmlsZSgpLCBzbyByZXBvcnRpbmcgaXQgd291bGQgYnVyeSB0aGUgZHJvcCB0aGlzIGxvZ3MgZm9yLlxuICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHZhbHVlID09PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBudWxsXG4gICAgfVxuXG4gICAgbGV0IHBhcnNlZCA9IHZhbHVlXG4gICAgaWYgKHR5cGVvZiBwYXJzZWQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBwYXJzZWQgPSBKU09OLnBhcnNlKHBhcnNlZClcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAvLyBEcm9wcGluZyB0aGlzIGxlYXZlcyB0aGUgZXh0ZW5zaW9uIHVuaW5qZWN0ZWQgYW5kIHRoZSBhMTF5IHJlcG9ydCBlbXB0eSwgd2l0aCB0aGVcbiAgICAgICAgICAgIC8vIHJ1biBzdGlsbCBncmVlbiBcdTIwMTQgc28gdGhlIGRyb3AgaGFzIHRvIGJlIGZpbmRhYmxlIGluIHRoZSBsb2cuXG4gICAgICAgICAgICBCU3RhY2tMb2dnZXIuZGVidWcoYHRvQ2hyb21lT3B0aW9uczogZ29vZzpjaHJvbWVPcHRpb25zIGlzIG5vdCB2YWxpZCBKU09OLCBkcm9wcGluZyBpdDogJHtlcnJ9YClcbiAgICAgICAgICAgIHJldHVybiBudWxsXG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKHBhcnNlZCAmJiB0eXBlb2YgcGFyc2VkID09PSAnb2JqZWN0JyAmJiAhQXJyYXkuaXNBcnJheShwYXJzZWQpKSB7XG4gICAgICAgIHJldHVybiBwYXJzZWQgYXMgeyBba2V5OiBzdHJpbmddOiB1bmtub3duIH1cbiAgICB9XG4gICAgQlN0YWNrTG9nZ2VyLmRlYnVnKGB0b0Nocm9tZU9wdGlvbnM6IGdvb2c6Y2hyb21lT3B0aW9ucyByZXNvbHZlZCB0byAke3BhcnNlZCA9PT0gbnVsbCA/ICdudWxsJyA6IEFycmF5LmlzQXJyYXkocGFyc2VkKSA/ICdhbiBhcnJheScgOiB0eXBlb2YgcGFyc2VkfSwgbm90IGFuIG9iamVjdDsgZHJvcHBpbmcgaXRgKVxuICAgIHJldHVybiBudWxsXG59XG5cbmNsYXNzIEFjY2Vzc2liaWxpdHlTY3JpcHRzIHtcbiAgICBwcml2YXRlIHN0YXRpYyBpbnN0YW5jZTogQWNjZXNzaWJpbGl0eVNjcmlwdHMgfCBudWxsID0gbnVsbFxuXG4gICAgcHVibGljIHBlcmZvcm1TY2FuOiBzdHJpbmcgfCBudWxsID0gbnVsbFxuICAgIHB1YmxpYyBnZXRSZXN1bHRzOiBzdHJpbmcgfCBudWxsID0gbnVsbFxuICAgIHB1YmxpYyBnZXRSZXN1bHRzU3VtbWFyeTogc3RyaW5nIHwgbnVsbCA9IG51bGxcbiAgICBwdWJsaWMgc2F2ZVRlc3RSZXN1bHRzOiBzdHJpbmcgfCBudWxsID0gbnVsbFxuICAgIHB1YmxpYyBjb21tYW5kc1RvV3JhcDogQXJyYXk8Q29tbWFuZD4gfCBudWxsID0gbnVsbFxuICAgIHB1YmxpYyBDaHJvbWVFeHRlbnNpb246IHsgW2tleTogc3RyaW5nXTogdW5rbm93biB9ID0ge31cblxuICAgIHB1YmxpYyBicm93c2Vyc3RhY2tGb2xkZXJQYXRoID0gJydcbiAgICBwdWJsaWMgY29tbWFuZHNQYXRoID0gJydcblxuICAgIC8vIGRvbid0IGFsbG93IHRvIGNyZWF0ZSBpbnN0YW5jZXMgZnJvbSBpdCBvdGhlciB0aGFuIHRocm91Z2ggYGNoZWNrQW5kR2V0SW5zdGFuY2VgXG4gICAgcHJpdmF0ZSBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5icm93c2Vyc3RhY2tGb2xkZXJQYXRoID0gdGhpcy5nZXRXcml0YWJsZURpcigpXG4gICAgICAgIHRoaXMuY29tbWFuZHNQYXRoID0gcGF0aC5qb2luKHRoaXMuYnJvd3NlcnN0YWNrRm9sZGVyUGF0aCwgJ2NvbW1hbmRzLmpzb24nKVxuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgY2hlY2tBbmRHZXRJbnN0YW5jZSgpIHtcbiAgICAgICAgaWYgKCFBY2Nlc3NpYmlsaXR5U2NyaXB0cy5pbnN0YW5jZSkge1xuICAgICAgICAgICAgQWNjZXNzaWJpbGl0eVNjcmlwdHMuaW5zdGFuY2UgPSBuZXcgQWNjZXNzaWJpbGl0eVNjcmlwdHMoKVxuICAgICAgICAgICAgQWNjZXNzaWJpbGl0eVNjcmlwdHMuaW5zdGFuY2UucmVhZEZyb21FeGlzdGluZ0ZpbGUoKVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBBY2Nlc3NpYmlsaXR5U2NyaXB0cy5pbnN0YW5jZVxuICAgIH1cblxuICAgIC8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFycyAqL1xuICAgIHB1YmxpYyBnZXRXcml0YWJsZURpcigpOiBzdHJpbmcge1xuICAgICAgICBjb25zdCBvcmRlcmVkUGF0aHMgPSBbXG4gICAgICAgICAgICBwYXRoLmpvaW4ob3MuaG9tZWRpcigpLCAnLmJyb3dzZXJzdGFjaycpLFxuICAgICAgICAgICAgcHJvY2Vzcy5jd2QoKSxcbiAgICAgICAgICAgIG9zLnRtcGRpcigpXG4gICAgICAgIF1cbiAgICAgICAgZm9yIChjb25zdCBvcmRlcmVkUGF0aCBvZiBvcmRlcmVkUGF0aHMpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgaWYgKGZzLmV4aXN0c1N5bmMob3JkZXJlZFBhdGgpKSB7XG4gICAgICAgICAgICAgICAgICAgIGZzLmFjY2Vzc1N5bmMob3JkZXJlZFBhdGgpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBvcmRlcmVkUGF0aFxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGZzLm1rZGlyU3luYyhvcmRlcmVkUGF0aCwgeyByZWN1cnNpdmU6IHRydWUgfSlcbiAgICAgICAgICAgICAgICByZXR1cm4gb3JkZXJlZFBhdGhcblxuICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAvKiBuby1lbXB0eSAqL1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiAnJ1xuICAgIH1cblxuICAgIHB1YmxpYyByZWFkRnJvbUV4aXN0aW5nRmlsZSgpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmIChmcy5leGlzdHNTeW5jKHRoaXMuY29tbWFuZHNQYXRoKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBmcy5yZWFkRmlsZVN5bmModGhpcy5jb21tYW5kc1BhdGgsICd1dGY4JylcbiAgICAgICAgICAgICAgICBpZiAoZGF0YSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZShKU09OLnBhcnNlKGRhdGEpKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAvKiBEbyBub3RoaW5nICovXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgdXBkYXRlKGRhdGE6IHsgY29tbWFuZHM6IFtdLCBzY3JpcHRzOiBTY3JpcHRzLCBub25CU3RhY2tJbmZyYUExMXlDaHJvbWVPcHRpb25zOiB7fSB9KSB7XG4gICAgICAgIGlmIChkYXRhLnNjcmlwdHMpIHtcbiAgICAgICAgICAgIHRoaXMucGVyZm9ybVNjYW4gPSBkYXRhLnNjcmlwdHMuc2NhblxuICAgICAgICAgICAgdGhpcy5nZXRSZXN1bHRzID0gZGF0YS5zY3JpcHRzLmdldFJlc3VsdHNcbiAgICAgICAgICAgIHRoaXMuZ2V0UmVzdWx0c1N1bW1hcnkgPSBkYXRhLnNjcmlwdHMuZ2V0UmVzdWx0c1N1bW1hcnlcbiAgICAgICAgICAgIHRoaXMuc2F2ZVRlc3RSZXN1bHRzID0gZGF0YS5zY3JpcHRzLnNhdmVSZXN1bHRzXG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRhdGEuY29tbWFuZHMgJiYgZGF0YS5jb21tYW5kcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMuY29tbWFuZHNUb1dyYXAgPSBkYXRhLmNvbW1hbmRzXG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY2hyb21lT3B0aW9ucyA9IHRvQ2hyb21lT3B0aW9ucyhkYXRhLm5vbkJTdGFja0luZnJhQTExeUNocm9tZU9wdGlvbnMpXG4gICAgICAgIGlmIChjaHJvbWVPcHRpb25zKXtcbiAgICAgICAgICAgIHRoaXMuQ2hyb21lRXh0ZW5zaW9uID0gY2hyb21lT3B0aW9uc1xuICAgICAgICB9XG5cbiAgICB9XG5cbiAgICBwdWJsaWMgc3RvcmUoKSB7XG4gICAgICAgIGlmICghZnMuZXhpc3RzU3luYyh0aGlzLmJyb3dzZXJzdGFja0ZvbGRlclBhdGgpKXtcbiAgICAgICAgICAgIGZzLm1rZGlyU3luYyh0aGlzLmJyb3dzZXJzdGFja0ZvbGRlclBhdGgpXG4gICAgICAgIH1cblxuICAgICAgICBmcy53cml0ZUZpbGVTeW5jKHRoaXMuY29tbWFuZHNQYXRoLCBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICBjb21tYW5kczogdGhpcy5jb21tYW5kc1RvV3JhcCxcbiAgICAgICAgICAgIHNjcmlwdHM6IHtcbiAgICAgICAgICAgICAgICBzY2FuOiB0aGlzLnBlcmZvcm1TY2FuLFxuICAgICAgICAgICAgICAgIGdldFJlc3VsdHM6IHRoaXMuZ2V0UmVzdWx0cyxcbiAgICAgICAgICAgICAgICBnZXRSZXN1bHRzU3VtbWFyeTogdGhpcy5nZXRSZXN1bHRzU3VtbWFyeSxcbiAgICAgICAgICAgICAgICBzYXZlUmVzdWx0czogdGhpcy5zYXZlVGVzdFJlc3VsdHMsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbm9uQlN0YWNrSW5mcmFBMTF5Q2hyb21lT3B0aW9uczogdGhpcy5DaHJvbWVFeHRlbnNpb24sXG4gICAgICAgIH0pKVxuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgQWNjZXNzaWJpbGl0eVNjcmlwdHMuY2hlY2tBbmRHZXRJbnN0YW5jZSgpXG5leHBvcnQgeyBDb21tYW5kIH1cbiIsICJpbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnXG5pbXBvcnQgZnMgZnJvbSAnbm9kZTpmcydcblxuaW1wb3J0IHR5cGUgeyBUZXN0RGF0YSwgVXBsb2FkVHlwZSB9IGZyb20gJy4uL3R5cGVzLmpzJ1xuaW1wb3J0IHsgYmF0Y2hBbmRQb3N0RXZlbnRzIH0gZnJvbSAnLi4vdXRpbC5qcydcbmltcG9ydCB7IERBVEFfQkFUQ0hfRU5EUE9JTlQgfSBmcm9tICcuLi9jb25zdGFudHMuanMnXG5pbXBvcnQgeyBCU3RhY2tMb2dnZXIgfSBmcm9tICcuLi9ic3RhY2tMb2dnZXIuanMnXG5cbi8qKlxuICogQ3Jhc2gtcmVzaWxpZW50IGpvdXJuYWwgb2YgdGVzdCBhbmQgaG9vayBydW5zIHRoYXQgaGF2ZSBzZW50IFRlc3RSdW5TdGFydGVkIC9cbiAqIEhvb2tSdW5TdGFydGVkIGJ1dCBub3QgeWV0IHRoZSBtYXRjaGluZyBmaW5pc2guIEVhY2ggb3BlbiBydW4gaXMgcGVyc2lzdGVkIGFzIGEgc21hbGxcbiAqIGZpbGUgc28gdGhhdCBpZiB0aGUgd29ya2VyIChvciB0aGUgd2hvbGUgd2RpbyBwcm9jZXNzIHRyZWUpIGlzIGtpbGxlZCBtaWQtdGVzdCBvclxuICogbWlkLWhvb2ssIHRoZSBsYXVuY2hlcidzIHNodXRkb3duIHBhdGggb3IgdGhlIGRldGFjaGVkIGV4aXQgY2xlYW51cCBjYW4gc3RpbGwgc2VuZCBhXG4gKiBzeW50aGV0aWMgVGVzdFJ1bkZpbmlzaGVkIC8gSG9va1J1bkZpbmlzaGVkIFx1MjAxNCBvdGhlcndpc2UgdGhlIGVudGl0eSBzdGF5cyBcImluIHByb2dyZXNzXCJcbiAqIG9uIHRoZSBUZXN0IFJlcG9ydGluZyAmIEFuYWx5dGljcyBkYXNoYm9hcmQgdW50aWwgdGhlIGJhY2tlbmQgd2F0Y2hkb2cgdGltZXMgaXQgb3V0LFxuICogaW5mbGF0aW5nIHRoZSByZXBvcnRlZCBidWlsZCBkdXJhdGlvbiAoU0RLLTcxNjc6IGFuIG9ycGhhbmVkIEFGVEVSX0VBQ0ggY3VjdW1iZXIgaG9va1xuICogYWRkZWQgaXRzIDJoIGhvb2sgdGltZW91dCB0byB0aGUgYnVpbGQncyBkdXJhdGlvbiBvbiB0aGUgbmV3IGRhc2hib2FyZCkuXG4gKi9cblxuY29uc3QgT1BFTl9SVU5TX0RJUiA9IHBhdGguam9pbihwcm9jZXNzLmN3ZCgpLCAnbG9ncycsICdic3RhY2tfb3Blbl9ydW5zJylcblxuZXhwb3J0IGNvbnN0IE9SUEhBTl9GQUlMVVJFX1JFQVNPTiA9ICdUZXN0IHJ1biBkaWQgbm90IGNvbXBsZXRlOiB0aGUgcHJvY2VzcyB3YXMgaW50ZXJydXB0ZWQgb3IgdGVybWluYXRlZCBiZWZvcmUgdGhlIHRlc3QgZmluaXNoZWQgKGZpbmFsaXplZCBieSBCcm93c2VyU3RhY2sgU0RLIGV4aXQgY2xlYW51cCknXG5cbmZ1bmN0aW9uIG9wZW5SdW5GaWxlUGF0aCh1dWlkOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gcGF0aC5qb2luKE9QRU5fUlVOU19ESVIsIGBvcGVuLXJ1bi0ke3V1aWR9Lmpzb25gKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVjb3JkT3BlblJ1bih0ZXN0RGF0YTogVGVzdERhdGEpIHtcbiAgICBpZiAoIXRlc3REYXRhIHx8ICF0ZXN0RGF0YS51dWlkKSB7XG4gICAgICAgIHJldHVyblxuICAgIH1cbiAgICB0cnkge1xuICAgICAgICBmcy5ta2RpclN5bmMoT1BFTl9SVU5TX0RJUiwgeyByZWN1cnNpdmU6IHRydWUgfSlcbiAgICAgICAgZnMud3JpdGVGaWxlU3luYyhvcGVuUnVuRmlsZVBhdGgodGVzdERhdGEudXVpZCksIEpTT04uc3RyaW5naWZ5KHRlc3REYXRhKSlcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIEJTdGFja0xvZ2dlci5kZWJ1Zygnb3BlblJ1bnNKb3VybmFsOiBmYWlsZWQgdG8gcmVjb3JkIG9wZW4gcnVuOiAnICsgZSlcbiAgICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjbGVhck9wZW5SdW4odXVpZD86IHN0cmluZykge1xuICAgIGlmICghdXVpZCkge1xuICAgICAgICByZXR1cm5cbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgZnMucm1TeW5jKG9wZW5SdW5GaWxlUGF0aCh1dWlkKSwgeyBmb3JjZTogdHJ1ZSB9KVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgQlN0YWNrTG9nZ2VyLmRlYnVnKCdvcGVuUnVuc0pvdXJuYWw6IGZhaWxlZCB0byBjbGVhciBvcGVuIHJ1bjogJyArIGUpXG4gICAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gY29sbGVjdE9ycGhhbmVkUnVucygpOiBUZXN0RGF0YVtdIHtcbiAgICBjb25zdCBvcnBoYW5zOiBUZXN0RGF0YVtdID0gW11cbiAgICB0cnkge1xuICAgICAgICBpZiAoIWZzLmV4aXN0c1N5bmMoT1BFTl9SVU5TX0RJUikpIHtcbiAgICAgICAgICAgIHJldHVybiBvcnBoYW5zXG4gICAgICAgIH1cbiAgICAgICAgZm9yIChjb25zdCBmaWxlIG9mIGZzLnJlYWRkaXJTeW5jKE9QRU5fUlVOU19ESVIpKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIG9ycGhhbnMucHVzaChKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhwYXRoLmpvaW4oT1BFTl9SVU5TX0RJUiwgZmlsZSksICd1dGY4JykpKVxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIEJTdGFja0xvZ2dlci5kZWJ1Zyhgb3BlblJ1bnNKb3VybmFsOiBza2lwcGluZyB1bnJlYWRhYmxlIGpvdXJuYWwgZmlsZSAke2ZpbGV9OiAke2V9YClcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmcy5ybVN5bmMoT1BFTl9SVU5TX0RJUiwgeyByZWN1cnNpdmU6IHRydWUsIGZvcmNlOiB0cnVlIH0pXG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBCU3RhY2tMb2dnZXIuZGVidWcoJ29wZW5SdW5zSm91cm5hbDogZmFpbGVkIHRvIGNvbGxlY3Qgb3JwaGFuZWQgcnVuczogJyArIGUpXG4gICAgfVxuICAgIHJldHVybiBvcnBoYW5zXG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmaW5hbGl6ZU9ycGhhbmVkUnVucygpOiBQcm9taXNlPG51bWJlcj4ge1xuICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IG9ycGhhbnMgPSBjb2xsZWN0T3JwaGFuZWRSdW5zKClcbiAgICAgICAgaWYgKCFvcnBoYW5zLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIDBcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBmaW5pc2hlZEF0ID0gbmV3IERhdGUoKS50b0lTT1N0cmluZygpXG4gICAgICAgIGNvbnN0IGV2ZW50czogVXBsb2FkVHlwZVtdID0gb3JwaGFucy5tYXAoKHJ1bkRhdGEpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ZWRBdE1zID0gcnVuRGF0YS5zdGFydGVkX2F0ID8gbmV3IERhdGUocnVuRGF0YS5zdGFydGVkX2F0KS5nZXRUaW1lKCkgOiBOYU5cbiAgICAgICAgICAgIGNvbnN0IGZpbmlzaGVkUnVuID0ge1xuICAgICAgICAgICAgICAgIC4uLnJ1bkRhdGEsXG4gICAgICAgICAgICAgICAgZmluaXNoZWRfYXQ6IGZpbmlzaGVkQXQsXG4gICAgICAgICAgICAgICAgcmVzdWx0OiAnZmFpbGVkJyxcbiAgICAgICAgICAgICAgICBkdXJhdGlvbl9pbl9tczogTnVtYmVyLmlzTmFOKHN0YXJ0ZWRBdE1zKSA/IHVuZGVmaW5lZCA6IE1hdGgubWF4KDAsIERhdGUubm93KCkgLSBzdGFydGVkQXRNcyksXG4gICAgICAgICAgICAgICAgZmFpbHVyZTogW3sgYmFja3RyYWNlOiBbT1JQSEFOX0ZBSUxVUkVfUkVBU09OXSB9XSxcbiAgICAgICAgICAgICAgICBmYWlsdXJlX3JlYXNvbjogT1JQSEFOX0ZBSUxVUkVfUkVBU09OLFxuICAgICAgICAgICAgICAgIGZhaWx1cmVfdHlwZTogJ1VuaGFuZGxlZEVycm9yJ1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gSG9vayBwYXlsb2FkcyBjYXJyeSB0eXBlICdob29rJyAoc2FtZSBkaXNjcmltaW5hdG9yIHRoZSBsaXN0ZW5lciB1c2VzIHRvIHBpY2tcbiAgICAgICAgICAgIC8vIHRoZSBob29rX3J1bi90ZXN0X3J1biBlbnZlbG9wZSBrZXkpIFx1MjAxNCBmaW5hbGl6ZSB0aGVtIGFzIEhvb2tSdW5GaW5pc2hlZCBzbyB0aGVcbiAgICAgICAgICAgIC8vIGJhY2tlbmQgY2xvc2VzIHRoZSBob29rIGluc3RlYWQgb2YgZHJvcHBpbmcgYW4gdW5rbm93biB0ZXN0X3J1biB1dWlkLlxuICAgICAgICAgICAgaWYgKHJ1bkRhdGEudHlwZSA9PT0gJ2hvb2snKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgZXZlbnRfdHlwZTogJ0hvb2tSdW5GaW5pc2hlZCcsIGhvb2tfcnVuOiBmaW5pc2hlZFJ1biB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4geyBldmVudF90eXBlOiAnVGVzdFJ1bkZpbmlzaGVkJywgdGVzdF9ydW46IGZpbmlzaGVkUnVuIH1cbiAgICAgICAgfSlcbiAgICAgICAgYXdhaXQgYmF0Y2hBbmRQb3N0RXZlbnRzKERBVEFfQkFUQ0hfRU5EUE9JTlQsICdPUlBIQU5FRF9URVNUX1JVTl9GSU5BTElaQVRJT04nLCBldmVudHMpXG4gICAgICAgIEJTdGFja0xvZ2dlci5pbmZvKGBGaW5hbGl6ZWQgJHtldmVudHMubGVuZ3RofSBvcnBoYW5lZCB0ZXN0L2hvb2sgcnVuKHMpIGxlZnQgYmVoaW5kIGJ5IGFuIGludGVycnVwdGVkIHJ1bmApXG4gICAgICAgIHJldHVybiBldmVudHMubGVuZ3RoXG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBCU3RhY2tMb2dnZXIuZGVidWcoJ29wZW5SdW5zSm91cm5hbDogZmFpbGVkIHRvIGZpbmFsaXplIG9ycGhhbmVkIHJ1bnM6ICcgKyBlKVxuICAgICAgICByZXR1cm4gMFxuICAgIH1cbn1cbiIsICJpbXBvcnQgeyBnZXRFcnJvclN0cmluZywgc3RvcEJ1aWxkVXBzdHJlYW0sIHVwbG9hZExvZ3MgfSBmcm9tICcuL3V0aWwuanMnXG5pbXBvcnQgeyBmaW5hbGl6ZU9ycGhhbmVkUnVucyB9IGZyb20gJy4vdGVzdE9wcy9vcGVuUnVuc0pvdXJuYWwuanMnXG5pbXBvcnQgeyBCU3RhY2tMb2dnZXIgfSBmcm9tICcuL2JzdGFja0xvZ2dlci5qcydcbmltcG9ydCBmcyBmcm9tICdub2RlOmZzJ1xuaW1wb3J0IHV0aWwgZnJvbSAnbm9kZTp1dGlsJ1xuaW1wb3J0IHsgZmlyZUZ1bm5lbFJlcXVlc3QgfSBmcm9tICcuL2luc3RydW1lbnRhdGlvbi9mdW5uZWxJbnN0cnVtZW50YXRpb24uanMnXG5pbXBvcnQgeyBCUk9XU0VSU1RBQ0tfVEVTVEhVQl9VVUlELCBCUk9XU0VSU1RBQ0tfVEVTVEhVQl9KV1QsIEJST1dTRVJTVEFDS19PQlNFUlZBQklMSVRZIH0gZnJvbSAnLi9jb25zdGFudHMuanMnXG5pbXBvcnQgdHlwZSB7IEZ1bm5lbERhdGEgfSBmcm9tICcuL3R5cGVzLmpzJ1xuaW1wb3J0IFBlcmZvcm1hbmNlVGVzdGVyIGZyb20gJy4vaW5zdHJ1bWVudGF0aW9uL3BlcmZvcm1hbmNlL3BlcmZvcm1hbmNlLXRlc3Rlci5qcydcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQlN0YWNrQ2xlYW51cCB7XG4gICAgc3RhdGljIGFzeW5jIHN0YXJ0Q2xlYW51cCgpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIEdldCBmdW5uZWwgZGF0YSBvYmplY3QgZnJvbSBzYXZlZCBmaWxlXG4gICAgICAgICAgICBjb25zdCBmdW5uZWxEYXRhQ2xlYW51cCA9IHByb2Nlc3MuYXJndi5pbmNsdWRlcygnLS1mdW5uZWxEYXRhJylcbiAgICAgICAgICAgIGxldCBmdW5uZWxEYXRhOiBGdW5uZWxEYXRhIHwgbnVsbCA9IG51bGxcbiAgICAgICAgICAgIGlmIChmdW5uZWxEYXRhQ2xlYW51cCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gcHJvY2Vzcy5hcmd2LmluZGV4T2YoJy0tZnVubmVsRGF0YScpXG4gICAgICAgICAgICAgICAgY29uc3QgZmlsZVBhdGggPSBwcm9jZXNzLmFyZ3ZbaW5kZXggKyAxXVxuICAgICAgICAgICAgICAgIGZ1bm5lbERhdGEgPSBCU3RhY2tDbGVhbnVwLmdldEZ1bm5lbERhdGFGcm9tRmlsZShmaWxlUGF0aClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFNuYXBzaG90IGJlZm9yZSBzZW5kRnVubmVsRGF0YSBcdTIwMTQgZmlyZUZ1bm5lbFJlcXVlc3QgcmVkYWN0cyB0aGVcbiAgICAgICAgICAgIC8vIGNyZWRlbnRpYWxzIGluIHBsYWNlLlxuICAgICAgICAgICAgY29uc3QgZnVubmVsVXNlciA9IGZ1bm5lbERhdGE/LnVzZXJOYW1lXG4gICAgICAgICAgICBjb25zdCBmdW5uZWxLZXkgPSBmdW5uZWxEYXRhPy5hY2Nlc3NLZXlcblxuICAgICAgICAgICAgaWYgKHByb2Nlc3MuYXJndi5pbmNsdWRlcygnLS1vYnNlcnZhYmlsaXR5JykgJiYgZnVubmVsRGF0YSkge1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuZXhlY3V0ZU9ic2VydmFiaWxpdHlDbGVhbnVwKGZ1bm5lbERhdGEpXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChmdW5uZWxEYXRhQ2xlYW51cCAmJiBmdW5uZWxEYXRhKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5zZW5kRnVubmVsRGF0YShmdW5uZWxEYXRhKVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBSZXNjdWUgdGhlIFNESy1sb2cgdXBsb2FkIGZvciBydW5zIHdob3NlIGxhdW5jaGVyIG5ldmVyIHJlYWNoZWRcbiAgICAgICAgICAgIC8vIG9uQ29tcGxldGUgKHNpZ25hbCB0ZXJtaW5hdGlvbikgXHUyMDE0IGFmdGVyIGV2ZW50cywgYmVmb3JlIGV4aXQuXG4gICAgICAgICAgICBpZiAocHJvY2Vzcy5hcmd2LmluY2x1ZGVzKCctLXVwbG9hZExvZ3MnKSkge1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuZXhlY3V0ZUxvZ3NVcGxvYWQoZnVubmVsVXNlciwgZnVubmVsS2V5KVxuICAgICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIGNvbnN0IGVycm9yID0gZXJyIGFzIHN0cmluZ1xuICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLmVycm9yKGVycm9yKVxuICAgICAgICB9XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmIChwcm9jZXNzLmFyZ3YuaW5jbHVkZXMoJy0tcGVyZm9ybWFuY2VEYXRhJykpIHtcbiAgICAgICAgICAgICAgICBhd2FpdCBQZXJmb3JtYW5jZVRlc3Rlci51cGxvYWRFdmVudHNEYXRhKClcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZXIpIHtcbiAgICAgICAgICAgIEJTdGFja0xvZ2dlci5kZWJ1ZyhgRXJyb3IgaW4gc2VuZGluZyBldmVudHMgZGF0YSAke3V0aWwuZm9ybWF0KGVyKX1gKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgc3RhdGljIGFzeW5jIGV4ZWN1dGVMb2dzVXBsb2FkKGZ1bm5lbFVzZXI/OiBzdHJpbmcsIGZ1bm5lbEtleT86IHN0cmluZykge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgaW5kZXggPSBwcm9jZXNzLmFyZ3YuaW5kZXhPZignLS11cGxvYWRMb2dzJylcbiAgICAgICAgICAgIGNvbnN0IGNsaWVudEJ1aWxkVXVpZCA9IHByb2Nlc3MuYXJndltpbmRleCArIDFdXG4gICAgICAgICAgICBjb25zdCB1c2VyID0gZnVubmVsVXNlciB8fCBwcm9jZXNzLmVudi5CUk9XU0VSU1RBQ0tfVVNFUk5BTUVcbiAgICAgICAgICAgIGNvbnN0IGtleSA9IGZ1bm5lbEtleSB8fCBwcm9jZXNzLmVudi5CUk9XU0VSU1RBQ0tfQUNDRVNTX0tFWVxuICAgICAgICAgICAgaWYgKCFjbGllbnRCdWlsZFV1aWQgfHwgIXVzZXIgfHwgIWtleSkge1xuICAgICAgICAgICAgICAgIEJTdGFja0xvZ2dlci5kZWJ1ZygnU2tpcHBpbmcgbG9ncyB1cGxvYWQgaW4gY2xlYW51cDogbWlzc2luZyB1dWlkIG9yIGNyZWRlbnRpYWxzJylcbiAgICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIEJTdGFja0xvZ2dlci5kZWJ1ZyhgVXBsb2FkaW5nIFNESyBsb2dzIGZyb20gY2xlYW51cCBmb3IgJHtjbGllbnRCdWlsZFV1aWR9YClcbiAgICAgICAgICAgIGF3YWl0IHVwbG9hZExvZ3ModXNlciwga2V5LCBjbGllbnRCdWlsZFV1aWQpXG4gICAgICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgICAgICAgIEJTdGFja0xvZ2dlci5lcnJvcignRXJyb3IgdXBsb2FkaW5nIFNESyBsb2dzIGluIGNsZWFudXA6ICcgKyBnZXRFcnJvclN0cmluZyhlKSlcbiAgICAgICAgfVxuICAgIH1cbiAgICBzdGF0aWMgYXN5bmMgZXhlY3V0ZU9ic2VydmFiaWxpdHlDbGVhbnVwKGZ1bm5lbERhdGE6IEZ1bm5lbERhdGEpIHtcbiAgICAgICAgaWYgKCFwcm9jZXNzLmVudltCUk9XU0VSU1RBQ0tfVEVTVEhVQl9KV1RdKSB7XG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICBCU3RhY2tMb2dnZXIuZGVidWcoJ0V4ZWN1dGluZyBUZXN0IFJlcG9ydGluZyBhbmQgQW5hbHl0aWNzIGNsZWFudXAnKVxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gU0RLLTQ2NzE6IGZpbmFsaXplIGFueSB0ZXN0IHJ1bnMgb3JwaGFuZWQgYnkgdGhlIGludGVycnVwdGVkIHByb2Nlc3NcbiAgICAgICAgICAgIC8vIGJlZm9yZSB0aGUgYnVpbGQgaXRzZWxmIGlzIHN0b3BwZWQuXG4gICAgICAgICAgICBhd2FpdCBmaW5hbGl6ZU9ycGhhbmVkUnVucygpXG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBzdG9wQnVpbGRVcHN0cmVhbSgpXG4gICAgICAgICAgICBpZiAoKHByb2Nlc3MuZW52W0JST1dTRVJTVEFDS19PQlNFUlZBQklMSVRZXSkgJiYgcHJvY2Vzcy5lbnZbQlJPV1NFUlNUQUNLX1RFU1RIVUJfVVVJRF0pIHtcbiAgICAgICAgICAgICAgICBCU3RhY2tMb2dnZXIuaW5mbyhgXFxuVmlzaXQgaHR0cHM6Ly9hdXRvbWF0aW9uLmJyb3dzZXJzdGFjay5jb20vYnVpbGRzLyR7cHJvY2Vzcy5lbnZbQlJPV1NFUlNUQUNLX1RFU1RIVUJfVVVJRF19IHRvIHZpZXcgYnVpbGQgcmVwb3J0LCBpbnNpZ2h0cywgYW5kIG1hbnkgbW9yZSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gYWxsIGF0IG9uZSBwbGFjZSFcXG5gKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3Qgc3RhdHVzID0gKHJlc3VsdCAmJiByZXN1bHQuc3RhdHVzKSB8fCAnZmFpbGVkJ1xuICAgICAgICAgICAgY29uc3QgbWVzc2FnZSA9IChyZXN1bHQgJiYgcmVzdWx0Lm1lc3NhZ2UpXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZU8xMXlTdG9wRGF0YShmdW5uZWxEYXRhLCBzdGF0dXMsIHN0YXR1cyA9PT0gJ2ZhaWxlZCcgPyBtZXNzYWdlIDogdW5kZWZpbmVkKVxuICAgICAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICAgICAgICBCU3RhY2tMb2dnZXIuZXJyb3IoJ0Vycm9yIGluIHN0b3BwaW5nIFRlc3QgUmVwb3J0aW5nIGFuZCBBbmFseXRpY3MgYnVpbGQ6ICcgKyBlKVxuICAgICAgICAgICAgdGhpcy51cGRhdGVPMTF5U3RvcERhdGEoZnVubmVsRGF0YSwgJ2ZhaWxlZCcsIGUpXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzdGF0aWMgdXBkYXRlTzExeVN0b3BEYXRhKGZ1bm5lbERhdGE6IEZ1bm5lbERhdGEsIHN0YXR1czogc3RyaW5nLCBlcnJvcjogdW5rbm93biA9IHVuZGVmaW5lZCkge1xuICAgICAgICBjb25zdCB0b0RhdGEgPSBmdW5uZWxEYXRhPy5ldmVudF9wcm9wZXJ0aWVzPy5wcm9kdWN0VXNhZ2U/LnRlc3RPYnNlcnZhYmlsaXR5XG4gICAgICAgIC8vIFJldHVybiBpZiBubyBUZXN0IFJlcG9ydGluZyBhbmQgQW5hbHl0aWNzIGRhdGEgaW4gZnVubmVsIGRhdGFcbiAgICAgICAgaWYgKCF0b0RhdGEpIHtcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIGxldCBleGlzdGluZ1N0b3BEYXRhID0gdG9EYXRhLmV2ZW50cy5idWlsZEV2ZW50cy5maW5pc2hlZFxuICAgICAgICBleGlzdGluZ1N0b3BEYXRhID0gZXhpc3RpbmdTdG9wRGF0YSB8fCB7fVxuXG4gICAgICAgIGV4aXN0aW5nU3RvcERhdGEgPSB7XG4gICAgICAgICAgICAuLi5leGlzdGluZ1N0b3BEYXRhLFxuICAgICAgICAgICAgc3RhdHVzLFxuICAgICAgICAgICAgZXJyb3I6IGdldEVycm9yU3RyaW5nKGVycm9yKSxcbiAgICAgICAgICAgIHN0b3BwZWRGcm9tOiAnZXhpdEhvb2snXG4gICAgICAgIH1cbiAgICAgICAgdG9EYXRhLmV2ZW50cy5idWlsZEV2ZW50cy5maW5pc2hlZCA9IGV4aXN0aW5nU3RvcERhdGFcbiAgICB9XG5cbiAgICBzdGF0aWMgYXN5bmMgc2VuZEZ1bm5lbERhdGEoZnVubmVsRGF0YTogRnVubmVsRGF0YSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgZmlyZUZ1bm5lbFJlcXVlc3QoZnVubmVsRGF0YSlcbiAgICAgICAgICAgIEJTdGFja0xvZ2dlci5kZWJ1ZygnRnVubmVsIGRhdGEgc2VudCBzdWNjZXNzZnVsbHkgZnJvbSBjbGVhbnVwJylcbiAgICAgICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLmVycm9yKCdFcnJvciBpbiBzZW5kaW5nIGZ1bm5lbCBkYXRhOiAnICsgZSlcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHN0YXRpYyBnZXRGdW5uZWxEYXRhRnJvbUZpbGUoZmlsZVBhdGg6IHN0cmluZykge1xuICAgICAgICBpZiAoIWZpbGVQYXRoKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhmaWxlUGF0aCwgJ3V0ZjgnKVxuXG4gICAgICAgIGNvbnN0IGRhdGEgPSBKU09OLnBhcnNlKGNvbnRlbnQpXG4gICAgICAgIHRoaXMucmVtb3ZlRnVubmVsRGF0YUZpbGUoZmlsZVBhdGgpXG4gICAgICAgIHJldHVybiBkYXRhXG4gICAgfVxuXG4gICAgc3RhdGljIHJlbW92ZUZ1bm5lbERhdGFGaWxlKGZpbGVQYXRoPzogc3RyaW5nKSB7XG4gICAgICAgIGlmICghZmlsZVBhdGgpIHtcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIGZzLnJtU3luYyhmaWxlUGF0aCwgeyBmb3JjZTogdHJ1ZSB9KVxuICAgIH1cbn1cblxudm9pZCBCU3RhY2tDbGVhbnVwLnN0YXJ0Q2xlYW51cCgpXG4iLCAiaW1wb3J0IG9zIGZyb20gJ25vZGU6b3MnXG5pbXBvcnQgdXRpbCwgeyBmb3JtYXQgfSBmcm9tICdub2RlOnV0aWwnXG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnXG5pbXBvcnQgZnMgZnJvbSAnbm9kZTpmcydcbmltcG9ydCBVc2FnZVN0YXRzLCB7IHR5cGUgVXNhZ2VTdGF0IH0gZnJvbSAnLi4vdGVzdE9wcy91c2FnZVN0YXRzLmpzJ1xuaW1wb3J0IHsgQlN0YWNrTG9nZ2VyIH0gZnJvbSAnLi4vYnN0YWNrTG9nZ2VyLmpzJ1xuaW1wb3J0IHR5cGUgQnJvd3NlclN0YWNrQ29uZmlnIGZyb20gJy4uL2NvbmZpZy5qcydcbmltcG9ydCB7IEJTVEFDS19TRVJWSUNFX1ZFUlNJT04sIFdESU9fTkFNSU5HX1BSRUZJWCB9IGZyb20gJy4uL2NvbnN0YW50cy5qcydcbmltcG9ydCB7IGdldERhdGFGcm9tV29ya2VycyB9IGZyb20gJy4uL2RhdGEtc3RvcmUuanMnXG5pbXBvcnQgeyBnZXRQcm9kdWN0TWFwIH0gZnJvbSAnLi4vdGVzdEh1Yi91dGlscy5qcydcbmltcG9ydCBmZXRjaFdyYXAgZnJvbSAnLi4vZmV0Y2hXcmFwcGVyLmpzJ1xuaW1wb3J0IHR5cGUgeyBCcm93c2Vyc3RhY2tIZWFsaW5nIH0gZnJvbSAnQGJyb3dzZXJzdGFjay9haS1zZGstbm9kZSdcbmltcG9ydCB0eXBlIHsgRnVubmVsRGF0YSwgRXZlbnRQcm9wZXJ0aWVzIH0gZnJvbSAnLi4vdHlwZXMuanMnXG5pbXBvcnQgVGVzdE9wc0NvbmZpZyBmcm9tICcuLi90ZXN0T3BzL3Rlc3RPcHNDb25maWcuanMnXG5pbXBvcnQgQVBJVXRpbHMgZnJvbSAnLi4vY2xpL2FwaVV0aWxzLmpzJ1xuaW1wb3J0IFBlcmZvcm1hbmNlVGVzdGVyIGZyb20gJy4vcGVyZm9ybWFuY2UvcGVyZm9ybWFuY2UtdGVzdGVyLmpzJ1xuaW1wb3J0IHsgRVZFTlRTIH0gZnJvbSAnLi9wZXJmb3JtYW5jZS9jb25zdGFudHMuanMnXG5cbmFzeW5jIGZ1bmN0aW9uIGZpcmVGdW5uZWxUZXN0RXZlbnQoZXZlbnRUeXBlOiBzdHJpbmcsIGNvbmZpZzogQnJvd3NlclN0YWNrQ29uZmlnLCBpc0NMSUVuYWJsZWQgPSBmYWxzZSkge1xuICAgIGlmICghY29uZmlnLnVzZXJOYW1lIHx8ICFjb25maWcuYWNjZXNzS2V5KSB7XG4gICAgICAgIEJTdGFja0xvZ2dlci5kZWJ1ZygndXNlcm5hbWUvYWNjZXNza2V5IG5vdCBwYXNzZWQnKVxuICAgICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgICBjb25zdCBkYXRhID0gYnVpbGRFdmVudERhdGEoZXZlbnRUeXBlLCBjb25maWcsIGlzQ0xJRW5hYmxlZClcbiAgICAgICAgYXdhaXQgZmlyZUZ1bm5lbFJlcXVlc3QoZGF0YSlcbiAgICAgICAgQlN0YWNrTG9nZ2VyLmRlYnVnKCdGdW5uZWwgZXZlbnQgc3VjY2VzcycpXG4gICAgICAgIC8vIE9ubHkgdGhlIGZpbmlzaCBldmVudCBkaXNhcm1zIHRoZSBleGl0LXRpbWUgY2xlYW51cCByZXNlbmQgXHUyMDE0IG1hcmtpbmcgaXRcbiAgICAgICAgLy8gb24gU0RLVGVzdEF0dGVtcHRlZCBsZWZ0IGtpbGxlZCBydW5zIHdpdGggbm8gU0RLVGVzdFN1Y2Nlc3NmdWwgYXQgYWxsLlxuICAgICAgICBpZiAoZXZlbnRUeXBlID09PSAnU0RLVGVzdFN1Y2Nlc3NmdWwnKSB7XG4gICAgICAgICAgICBjb25maWcuc2VudEZ1bm5lbERhdGEoKVxuICAgICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgQlN0YWNrTG9nZ2VyLmRlYnVnKGBFeGNlcHRpb24gaW4gc2VuZGluZyBmdW5uZWwgZGF0YTogJHtmb3JtYXQoZXJyb3IpfWApXG4gICAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2VuZFN0YXJ0KGNvbmZpZzogQnJvd3NlclN0YWNrQ29uZmlnKSB7XG5cbiAgICAvLyBUcmFjayBmdW5uZWwgdGVzdCBhdHRlbXB0ZWQgZXZlbnRcbiAgICBQZXJmb3JtYW5jZVRlc3Rlci5zdGFydChFVkVOVFMuU0RLX0ZVTk5FTF9URVNUX0FUVEVNUFRFRClcbiAgICB0cnkge1xuICAgICAgICBhd2FpdCBmaXJlRnVubmVsVGVzdEV2ZW50KCdTREtUZXN0QXR0ZW1wdGVkJywgY29uZmlnKVxuICAgICAgICBQZXJmb3JtYW5jZVRlc3Rlci5lbmQoRVZFTlRTLlNES19GVU5ORUxfVEVTVF9BVFRFTVBURUQsIHRydWUpXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgUGVyZm9ybWFuY2VUZXN0ZXIuZW5kKEVWRU5UUy5TREtfRlVOTkVMX1RFU1RfQVRURU1QVEVELCBmYWxzZSwgZXJyb3IpXG4gICAgICAgIHRocm93IGVycm9yXG4gICAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2VuZEZpbmlzaChjb25maWc6IEJyb3dzZXJTdGFja0NvbmZpZywgaXNDTElFbmFibGVkID0gZmFsc2UpIHtcbiAgICAvLyBUcmFjayBmdW5uZWwgdGVzdCBzdWNjZXNzZnVsIGV2ZW50XG4gICAgUGVyZm9ybWFuY2VUZXN0ZXIuc3RhcnQoRVZFTlRTLlNES19GVU5ORUxfVEVTVF9TVUNDRVNTRlVMKVxuICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IGZpcmVGdW5uZWxUZXN0RXZlbnQoJ1NES1Rlc3RTdWNjZXNzZnVsJywgY29uZmlnLCBpc0NMSUVuYWJsZWQpXG4gICAgICAgIFBlcmZvcm1hbmNlVGVzdGVyLmVuZChFVkVOVFMuU0RLX0ZVTk5FTF9URVNUX1NVQ0NFU1NGVUwsIHRydWUpXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgUGVyZm9ybWFuY2VUZXN0ZXIuZW5kKEVWRU5UUy5TREtfRlVOTkVMX1RFU1RfU1VDQ0VTU0ZVTCwgZmFsc2UsIGVycm9yKVxuICAgICAgICB0aHJvdyBlcnJvclxuICAgIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNhdmVGdW5uZWxEYXRhKGV2ZW50VHlwZTogc3RyaW5nLCBjb25maWc6IEJyb3dzZXJTdGFja0NvbmZpZywgaXNDTElFbmFibGVkID0gZmFsc2UpOiBzdHJpbmcge1xuICAgIGNvbnN0IGRhdGEgPSBidWlsZEV2ZW50RGF0YShldmVudFR5cGUsIGNvbmZpZywgaXNDTElFbmFibGVkKVxuXG4gICAgQlN0YWNrTG9nZ2VyLmVuc3VyZUxvZ3NGb2xkZXIoKVxuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5qb2luKEJTdGFja0xvZ2dlci5sb2dGb2xkZXJQYXRoLCAnZnVubmVsRGF0YS5qc29uJylcbiAgICBmcy53cml0ZUZpbGVTeW5jKGZpbGVQYXRoLCBKU09OLnN0cmluZ2lmeShkYXRhKSlcbiAgICByZXR1cm4gZmlsZVBhdGhcbn1cblxuZnVuY3Rpb24gcmVkYWN0Q3JlZGVudGlhbHNGcm9tRnVubmVsRGF0YShkYXRhOiBGdW5uZWxEYXRhKSB7XG4gICAgaWYgKGRhdGEpIHtcbiAgICAgICAgaWYgKGRhdGEudXNlck5hbWUpIHtcbiAgICAgICAgICAgIGRhdGEudXNlck5hbWUgPSAnW1JFREFDVEVEXSdcbiAgICAgICAgfVxuICAgICAgICBpZiAoZGF0YS5hY2Nlc3NLZXkpIHtcbiAgICAgICAgICAgIGRhdGEuYWNjZXNzS2V5ID0gJ1tSRURBQ1RFRF0nXG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGRhdGFcbn1cblxuLy8gQ2FsbGVkIGZyb20gdHdvIGRpZmZlcmVudCBwcm9jZXNzXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZmlyZUZ1bm5lbFJlcXVlc3QoZGF0YTogRnVubmVsRGF0YSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHsgdXNlck5hbWUsIGFjY2Vzc0tleSB9ID0gZGF0YVxuICAgIHJlZGFjdENyZWRlbnRpYWxzRnJvbUZ1bm5lbERhdGEoZGF0YSlcblxuICAgIEJTdGFja0xvZ2dlci5kZWJ1ZygnU2VuZGluZyBTREsgZXZlbnQgd2l0aCBkYXRhICcgKyB1dGlsLmluc3BlY3QoZGF0YSwgeyBkZXB0aDogNiB9KSlcblxuICAgIGNvbnN0IGVuY29kZWRBdXRoID0gQnVmZmVyLmZyb20oYCR7dXNlck5hbWV9OiR7YWNjZXNzS2V5fWAsICd1dGY4JykudG9TdHJpbmcoJ2Jhc2U2NCcpXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaFdyYXAoQVBJVXRpbHMuRlVOTkVMX0lOU1RSVU1FTlRBVElPTl9VUkwsIHtcbiAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgICAgICBBdXRob3JpemF0aW9uOiBgQmFzaWMgJHtlbmNvZGVkQXV0aH1gLFxuICAgICAgICB9LFxuICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShkYXRhKVxuICAgIH0pXG4gICAgQlN0YWNrTG9nZ2VyLmRlYnVnKCdGdW5uZWwgRXZlbnQgUmVzcG9uc2U6ICcgKyBKU09OLnN0cmluZ2lmeShhd2FpdCByZXNwb25zZS50ZXh0KCkpKVxufVxuXG5mdW5jdGlvbiBnZXRQcm9kdWN0TGlzdChjb25maWc6IEJyb3dzZXJTdGFja0NvbmZpZykge1xuICAgIGNvbnN0IHByb2R1Y3RzOiBzdHJpbmdbXSA9IFtdXG4gICAgaWYgKGNvbmZpZy50ZXN0T2JzZXJ2YWJpbGl0eS5lbmFibGVkKSB7XG4gICAgICAgIHByb2R1Y3RzLnB1c2goJ29ic2VydmFiaWxpdHknKVxuICAgIH1cblxuICAgIGlmIChjb25maWcuYWNjZXNzaWJpbGl0eSkge1xuICAgICAgICBwcm9kdWN0cy5wdXNoKCdhY2Nlc3NpYmlsaXR5JylcbiAgICB9XG5cbiAgICBpZiAoY29uZmlnLnBlcmN5KSB7XG4gICAgICAgIHByb2R1Y3RzLnB1c2goJ3BlcmN5JylcbiAgICB9XG5cbiAgICBpZiAoY29uZmlnLmF1dG9tYXRlKSB7XG4gICAgICAgIHByb2R1Y3RzLnB1c2goJ2F1dG9tYXRlJylcbiAgICB9XG5cbiAgICBpZiAoY29uZmlnLmFwcEF1dG9tYXRlKSB7XG4gICAgICAgIHByb2R1Y3RzLnB1c2goJ2FwcC1hdXRvbWF0ZScpXG4gICAgfVxuICAgIHJldHVybiBwcm9kdWN0c1xufVxuXG5mdW5jdGlvbiBidWlsZEV2ZW50RGF0YShldmVudFR5cGU6IHN0cmluZywgY29uZmlnOiBCcm93c2VyU3RhY2tDb25maWcsIGlzQ0xJRW5hYmxlZCA9IGZhbHNlKSB7XG4gICAgY29uc3QgZXZlbnRQcm9wZXJ0aWVzOiBFdmVudFByb3BlcnRpZXMgPSB7XG4gICAgICAgIC8vIEZyYW1ld29yayBEZXRhaWxzXG4gICAgICAgIHNka1J1bklkOiBjb25maWc/LnNka1J1bklELFxuICAgICAgICB0ZXN0aHViX3V1aWQ6IFRlc3RPcHNDb25maWcuZ2V0SW5zdGFuY2UoKS5idWlsZEhhc2hlZElkLFxuICAgICAgICBsYW5ndWFnZV9mcmFtZXdvcms6IGdldExhbmd1YWdlRnJhbWV3b3JrKGNvbmZpZy5mcmFtZXdvcmspLFxuICAgICAgICByZWZlcnJlcjogZ2V0UmVmZXJyZXIoY29uZmlnLmZyYW1ld29yayksXG4gICAgICAgIGxhbmd1YWdlOiAnV2ViZHJpdmVySU8nLFxuICAgICAgICBsYW5ndWFnZVZlcnNpb246IHByb2Nlc3MudmVyc2lvbixcblxuICAgICAgICAvLyBCdWlsZCBEZXRhaWxzXG4gICAgICAgIGJ1aWxkTmFtZTogY29uZmlnLmJ1aWxkTmFtZSB8fCAndW5kZWZpbmVkJyxcbiAgICAgICAgYnVpbGRJZGVudGlmaWVyOiBTdHJpbmcoY29uZmlnLmJ1aWxkSWRlbnRpZmllciksXG5cbiAgICAgICAgLy8gSG9zdCBkZXRhaWxzXG4gICAgICAgIG9zOiBvcy50eXBlKCkgfHwgJ3Vua25vd24nLFxuICAgICAgICBob3N0bmFtZTogb3MuaG9zdG5hbWUoKSB8fCAndW5rbm93bicsXG5cbiAgICAgICAgLy8gUHJvZHVjdCBEZXRhaWxzXG4gICAgICAgIHByb2R1Y3RNYXA6IGdldFByb2R1Y3RNYXAoY29uZmlnKSxcbiAgICAgICAgcHJvZHVjdDogZ2V0UHJvZHVjdExpc3QoY29uZmlnKSxcblxuICAgICAgICAvLyBmcmFtZXdvcmsgZGV0YWlsc1xuICAgICAgICBmcmFtZXdvcms6IGNvbmZpZy5mcmFtZXdvcmssXG5cbiAgICAgICAgLy8gQ0xJIERldGFpbHNcbiAgICAgICAgaXNDTElFbmFibGVkOiBpc0NMSUVuYWJsZWRcbiAgICB9XG5cbiAgICBpZiAoZXZlbnRUeXBlID09PSAnU0RLVGVzdFN1Y2Nlc3NmdWwnKSB7XG4gICAgICAgIGNvbnN0IHdvcmtlckRhdGEgPSBnZXREYXRhRnJvbVdvcmtlcnMoKVxuICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgIGV2ZW50UHJvcGVydGllcy5wcm9kdWN0VXNhZ2UgPSBnZXRQcm9kdWN0VXNhZ2Uod29ya2VyRGF0YSlcbiAgICAgICAgaWYgKHByb2Nlc3MuZW52LkJTVEFDS19BMTFZX1BPTExJTkdfVElNRU9VVCkge1xuICAgICAgICAgICAgZXZlbnRQcm9wZXJ0aWVzLnBvbGxpbmdUaW1lb3V0ID0gcHJvY2Vzcy5lbnYuQlNUQUNLX0ExMVlfUE9MTElOR19USU1FT1VUIGFzIHN0cmluZ1xuICAgICAgICB9XG4gICAgICAgIC8vIElmIGFueSB3b3JrZXIgY2FsbGVkIGJyb3dzZXIucmVsb2FkU2Vzc2lvbigpLCBtYXJrIHRoZSBidWlsZCBzbyB0aGVcbiAgICAgICAgLy8gc2Vzc2lvbi1saW5raW5nIGRhc2hib2FyZCBjYW4gZXhjbHVkZSBpdHMgKGV4cGVjdGVkKSByZWxvYWQtb3JwaGFuZWQgc2Vzc2lvbnMuXG4gICAgICAgIHR5cGUgV29ya2VyUmVjb3JkID0geyByZWxvYWRIYXBwZW5lZD86IGJvb2xlYW47IHVzYWdlU3RhdHM/OiB1bmtub3duIH1cbiAgICAgICAgY29uc3QgcmVsb2FkSGFwcGVuZWQgPSB3b3JrZXJEYXRhLnNvbWUoKHdvcmtlcikgPT4gKHdvcmtlciBhcyBXb3JrZXJSZWNvcmQpLnJlbG9hZEhhcHBlbmVkID09PSB0cnVlKVxuICAgICAgICBpZiAocmVsb2FkSGFwcGVuZWQpIHtcbiAgICAgICAgICAgIGV2ZW50UHJvcGVydGllcy5maW5pc2hlZE1ldGFkYXRhID0geyByZWFzb246ICdzZXNzaW9uX3JlbG9hZGVkJyB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gQSBzaWduYWwtdGVybWluYXRlZCBydW4gbXVzdCBiZSBxdWVyeS1kZXRlY3RhYmxlIFx1MjAxNCBraWxsIHdpbnMgb3ZlclxuICAgICAgICAvLyByZWxvYWQgYXMgdGhlIGZpbmlzaCByZWFzb24uXG4gICAgICAgIGlmIChjb25maWcua2lsbFNpZ25hbCkge1xuICAgICAgICAgICAgZXZlbnRQcm9wZXJ0aWVzLmZpbmlzaGVkTWV0YWRhdGEgPSB7IHJlYXNvbjogJ3VzZXJfa2lsbGVkJywgc2lnbmFsOiBjb25maWcua2lsbFNpZ25hbCB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgICB1c2VyTmFtZTogY29uZmlnLnVzZXJOYW1lLFxuICAgICAgICBhY2Nlc3NLZXk6IGNvbmZpZy5hY2Nlc3NLZXksXG4gICAgICAgIGV2ZW50X3R5cGU6IGV2ZW50VHlwZSxcbiAgICAgICAgZGV0ZWN0ZWRGcmFtZXdvcms6IFdESU9fTkFNSU5HX1BSRUZJWCArIGNvbmZpZy5mcmFtZXdvcmssXG4gICAgICAgIGV2ZW50X3Byb3BlcnRpZXM6IGV2ZW50UHJvcGVydGllc1xuICAgIH0gYXMgdW5rbm93biBhcyBGdW5uZWxEYXRhXG5cbn1cblxuZnVuY3Rpb24gZ2V0UHJvZHVjdFVzYWdlKHdvcmtlcnNEYXRhOiB7IHVzYWdlU3RhdHM6IFVzYWdlU3RhdCB9W10pIHtcbiAgICByZXR1cm4ge1xuICAgICAgICB0ZXN0T2JzZXJ2YWJpbGl0eTogVXNhZ2VTdGF0cy5nZXRJbnN0YW5jZSgpLmdldEZvcm1hdHRlZERhdGEod29ya2Vyc0RhdGEpXG4gICAgfVxufVxuXG5mdW5jdGlvbiBnZXRMYW5ndWFnZUZyYW1ld29yayhmcmFtZXdvcms/OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gJ1dlYmRyaXZlcklPXycgKyBmcmFtZXdvcmtcbn1cblxuZnVuY3Rpb24gZ2V0UmVmZXJyZXIoZnJhbWV3b3JrPzogc3RyaW5nKSB7XG4gICAgY29uc3QgZnVsbE5hbWUgPSBmcmFtZXdvcmsgPyBXRElPX05BTUlOR19QUkVGSVggKyBmcmFtZXdvcmsgOiAnV2ViZHJpdmVySU8nXG4gICAgcmV0dXJuIGAke2Z1bGxOYW1lfS8ke0JTVEFDS19TRVJWSUNFX1ZFUlNJT059YFxufVxuXG5jb25zdCBzZW5kRXZlbnQgPSB7XG4gICAgdGNnRG93bjogKGNvbmZpZzogQnJvd3NlclN0YWNrQ29uZmlnKSA9PiBmaXJlRnVubmVsVGVzdEV2ZW50KCdTREtUZXN0VGNnRG93blJlc3BvbnNlJywgY29uZmlnKSxcbiAgICBpbnZhbGlkVGNnQXV0aDogKGNvbmZpZzogQnJvd3NlclN0YWNrQ29uZmlnKSA9PiBmaXJlRnVubmVsVGVzdEV2ZW50KCdTREtUZXN0SW52YWxpZFRjZ0F1dGhSZXNwb25zZVdpdGhVc2VySW1wYWN0JywgY29uZmlnKSxcbiAgICB0Y2dBdXRoRmFpbHVyZTogKGNvbmZpZzogQnJvd3NlclN0YWNrQ29uZmlnKSA9PiBmaXJlRnVubmVsVGVzdEV2ZW50KCdTREtUZXN0VGNnQXV0aEZhaWx1cmUnLCBjb25maWcpLFxuICAgIHRjZ3RJbml0U3VjY2Vzc2Z1bDogKGNvbmZpZzogQnJvd3NlclN0YWNrQ29uZmlnKSA9PiBmaXJlRnVubmVsVGVzdEV2ZW50KCdTREtUZXN0VGNndEluaXRTdWNjZXNzZnVsJywgY29uZmlnKSxcbiAgICBpbml0RmFpbGVkOiAoY29uZmlnOiBCcm93c2VyU3RhY2tDb25maWcpID0+IGZpcmVGdW5uZWxUZXN0RXZlbnQoJ1NES1Rlc3RJbml0RmFpbGVkUmVzcG9uc2UnLCBjb25maWcpLFxuICAgIHRjZ1Byb3h5RmFpbHVyZTogKGNvbmZpZzogQnJvd3NlclN0YWNrQ29uZmlnKSA9PiBmaXJlRnVubmVsVGVzdEV2ZW50KCdTREtUZXN0VGNnUHJveHlGYWlsdXJlJywgY29uZmlnKSxcbn1cblxuZnVuY3Rpb24gaXNQcm94eUVycm9yKGF1dGhSZXN1bHQ6IHsgc3RhdHVzPzogbnVtYmVyIH0pOiBib29sZWFuIHtcbiAgICByZXR1cm4gKGF1dGhSZXN1bHQgYXMgQnJvd3NlcnN0YWNrSGVhbGluZy5Jbml0RXJyb3JSZXNwb25zZSk/LnN0YXR1cyA9PT0gNTAyXG59XG5cbmZ1bmN0aW9uIGhhbmRsZVByb3h5RXJyb3IoY29uZmlnOiBCcm93c2VyU3RhY2tDb25maWcsIGlzU2VsZkhlYWxFbmFibGVkOiBib29sZWFuIHwgdW5kZWZpbmVkKSB7XG4gICAgc2VuZEV2ZW50LnRjZ1Byb3h5RmFpbHVyZShjb25maWcpXG4gICAgaWYgKGlzU2VsZkhlYWxFbmFibGVkKSB7XG4gICAgICAgIEJTdGFja0xvZ2dlci53YXJuKCdQcm94eSBFcnJvci4gRGlzYWJsaW5nIEhlYWxpbmcgZm9yIHRoaXMgc2Vzc2lvbi4nKVxuICAgIH1cbn1cblxuZnVuY3Rpb24gaGFuZGxlVXBncmFkZVJlcXVpcmVkKGlzU2VsZkhlYWxFbmFibGVkOiBib29sZWFuIHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKGlzU2VsZkhlYWxFbmFibGVkKSB7XG4gICAgICAgIEJTdGFja0xvZ2dlci53YXJuKCdQbGVhc2UgdXBncmFkZSBCcm93c2Vyc3RhY2sgU2VydmljZSB0byB0aGUgbGF0ZXN0IHZlcnNpb24gdG8gdXNlIHRoZSBzZWxmLWhlYWxpbmcgZmVhdHVyZS4nKVxuICAgIH1cbn1cblxuZnVuY3Rpb24gaGFuZGxlQXV0aGVudGljYXRpb25GYWlsdXJlKHN0YXR1czogbnVtYmVyLCBjb25maWc6IEJyb3dzZXJTdGFja0NvbmZpZywgaXNTZWxmSGVhbEVuYWJsZWQ6IGJvb2xlYW4gfCB1bmRlZmluZWQpIHtcbiAgICBpZiAoc3RhdHVzID49IDUwMCkge1xuICAgICAgICBpZiAoaXNTZWxmSGVhbEVuYWJsZWQpIHtcbiAgICAgICAgICAgIEJTdGFja0xvZ2dlci53YXJuKCdTb21ldGhpbmcgd2VudCB3cm9uZy4gRGlzYWJsaW5nIGhlYWxpbmcgZm9yIHRoaXMgc2Vzc2lvbi4gUGxlYXNlIHRyeSBhZ2FpbiBsYXRlci4nKVxuICAgICAgICB9XG4gICAgICAgIHNlbmRFdmVudC50Y2dEb3duKGNvbmZpZylcbiAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoaXNTZWxmSGVhbEVuYWJsZWQpIHtcbiAgICAgICAgICAgIEJTdGFja0xvZ2dlci53YXJuKCdBdXRoZW50aWNhdGlvbiBGYWlsZWQuIERpc2FibGluZyBIZWFsaW5nIGZvciB0aGlzIHNlc3Npb24uJylcbiAgICAgICAgfVxuICAgICAgICBzZW5kRXZlbnQudGNnQXV0aEZhaWx1cmUoY29uZmlnKVxuICAgIH1cbn1cblxuZnVuY3Rpb24gaGFuZGxlQXV0aGVudGljYXRpb25TdWNjZXNzKFxuICAgIGlzSGVhbGluZ0VuYWJsZWRGb3JVc2VyOiBib29sZWFuLFxuICAgIHVzZXJJZDogc3RyaW5nLFxuICAgIGNvbmZpZzogQnJvd3NlclN0YWNrQ29uZmlnLFxuICAgIGlzU2VsZkhlYWxFbmFibGVkOiBib29sZWFuIHwgdW5kZWZpbmVkXG4pIHtcbiAgICBpZiAoIWlzSGVhbGluZ0VuYWJsZWRGb3JVc2VyICYmIGlzU2VsZkhlYWxFbmFibGVkKSB7XG4gICAgICAgIEJTdGFja0xvZ2dlci53YXJuKCdIZWFsaW5nIGlzIG5vdCBlbmFibGVkIGZvciB5b3VyIGdyb3VwLCBwbGVhc2UgY29udGFjdCB0aGUgYWRtaW4nKVxuICAgIH0gZWxzZSBpZiAodXNlcklkICYmIGlzSGVhbGluZ0VuYWJsZWRGb3JVc2VyKSB7XG4gICAgICAgIHNlbmRFdmVudC50Y2d0SW5pdFN1Y2Nlc3NmdWwoY29uZmlnKVxuICAgIH1cbn1cblxuZnVuY3Rpb24gaGFuZGxlSW5pdGlhbGl6YXRpb25GYWlsdXJlKHN0YXR1czogbnVtYmVyLCBjb25maWc6IEJyb3dzZXJTdGFja0NvbmZpZywgaXNTZWxmSGVhbEVuYWJsZWQ6IGJvb2xlYW4gfCB1bmRlZmluZWQpIHtcbiAgICBpZiAoc3RhdHVzID49IDQwMCkge1xuICAgICAgICBzZW5kRXZlbnQuaW5pdEZhaWxlZChjb25maWcpXG4gICAgfSBlbHNlIGlmICghc3RhdHVzICYmIGlzU2VsZkhlYWxFbmFibGVkKSB7XG4gICAgICAgIHNlbmRFdmVudC5pbnZhbGlkVGNnQXV0aChjb25maWcpXG4gICAgfVxuXG4gICAgaWYgKGlzU2VsZkhlYWxFbmFibGVkKSB7XG4gICAgICAgIEJTdGFja0xvZ2dlci53YXJuKCdBdXRoZW50aWNhdGlvbiBGYWlsZWQuIEhlYWxpbmcgd2lsbCBiZSBkaXNhYmxlZCBmb3IgdGhpcyBzZXNzaW9uLicpXG4gICAgfVxufVxuXG5pbnRlcmZhY2UgQXV0aFJlc3VsdCB7XG4gICAgbWVzc2FnZTogc3RyaW5nXG4gICAgaXNBdXRoZW50aWNhdGVkOiBib29sZWFuXG4gICAgc3RhdHVzOiBudW1iZXJcbiAgICB1c2VySWQ6IHN0cmluZ1xuICAgIGdyb3VwSWQ6IHN0cmluZ1xuICAgIGlzSGVhbGluZ0VuYWJsZWQ6IGJvb2xlYW5cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGhhbmRsZUhlYWxpbmdJbnN0cnVtZW50YXRpb24oXG4gICAgYXV0aFJlc3VsdDogQXV0aFJlc3VsdCxcbiAgICBjb25maWc6IEJyb3dzZXJTdGFja0NvbmZpZyxcbiAgICBpc1NlbGZIZWFsRW5hYmxlZDogYm9vbGVhbiB8IHVuZGVmaW5lZCxcbikge1xuICAgIHRyeSB7XG4gICAgICAgIGlmIChpc1Byb3h5RXJyb3IoYXV0aFJlc3VsdCkpIHtcbiAgICAgICAgICAgIGhhbmRsZVByb3h5RXJyb3IoY29uZmlnLCBpc1NlbGZIZWFsRW5hYmxlZClcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgeyBtZXNzYWdlLCBpc0F1dGhlbnRpY2F0ZWQsIHN0YXR1cywgdXNlcklkLCBncm91cElkLCBpc0hlYWxpbmdFbmFibGVkOiBpc0hlYWxpbmdFbmFibGVkRm9yVXNlciB9ID0gYXV0aFJlc3VsdFxuXG4gICAgICAgIGlmIChtZXNzYWdlID09PSAnVXBncmFkZSByZXF1aXJlZCcpIHtcbiAgICAgICAgICAgIGhhbmRsZVVwZ3JhZGVSZXF1aXJlZChpc1NlbGZIZWFsRW5hYmxlZClcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFpc0F1dGhlbnRpY2F0ZWQpIHtcbiAgICAgICAgICAgIGhhbmRsZUF1dGhlbnRpY2F0aW9uRmFpbHVyZShzdGF0dXMsIGNvbmZpZywgaXNTZWxmSGVhbEVuYWJsZWQpXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpc0F1dGhlbnRpY2F0ZWQgJiYgdXNlcklkICYmIGdyb3VwSWQpIHtcbiAgICAgICAgICAgIGhhbmRsZUF1dGhlbnRpY2F0aW9uU3VjY2Vzcyhpc0hlYWxpbmdFbmFibGVkRm9yVXNlciwgdXNlcklkLCBjb25maWcsIGlzU2VsZkhlYWxFbmFibGVkKVxuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc3RhdHVzID49IDQwMCB8fCAhc3RhdHVzKSB7XG4gICAgICAgICAgICBoYW5kbGVJbml0aWFsaXphdGlvbkZhaWx1cmUoc3RhdHVzLCBjb25maWcsIGlzU2VsZkhlYWxFbmFibGVkKVxuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBCU3RhY2tMb2dnZXIuZGVidWcoJ0Vycm9yIGluIGhhbmRsaW5nIGhlYWxpbmcgaW5zdHJ1bWVudGF0aW9uOiAnICsgZXJyKVxuICAgIH1cbn1cbiIsICJpbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnXG5pbXBvcnQgZnMgZnJvbSAnbm9kZTpmcydcblxuaW1wb3J0IHsgQlN0YWNrTG9nZ2VyIH0gZnJvbSAnLi9ic3RhY2tMb2dnZXIuanMnXG5cbmNvbnN0IHdvcmtlcnNEYXRhRGlyUGF0aCA9IHBhdGguam9pbihwcm9jZXNzLmN3ZCgpLCAnbG9ncycsICd3b3JrZXJfZGF0YScpXG5cbmV4cG9ydCBmdW5jdGlvbiBnZXREYXRhRnJvbVdvcmtlcnMoKXtcbiAgICBjb25zdCB3b3JrZXJzRGF0YTogUmVjb3JkPHN0cmluZywgb2JqZWN0PltdID0gW11cblxuICAgIGlmICghZnMuZXhpc3RzU3luYyh3b3JrZXJzRGF0YURpclBhdGgpKSB7XG4gICAgICAgIHJldHVybiB3b3JrZXJzRGF0YVxuICAgIH1cblxuICAgIGNvbnN0IGZpbGVzID0gZnMucmVhZGRpclN5bmMod29ya2Vyc0RhdGFEaXJQYXRoKVxuICAgIGZpbGVzLmZvckVhY2goKGZpbGUpID0+IHtcbiAgICAgICAgQlN0YWNrTG9nZ2VyLmRlYnVnKCdSZWFkaW5nIHdvcmtlciBmaWxlICcgKyBmaWxlKVxuICAgICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGguam9pbih3b3JrZXJzRGF0YURpclBhdGgsIGZpbGUpXG4gICAgICAgIGNvbnN0IGZpbGVDb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKGZpbGVQYXRoLCAndXRmOCcpXG4gICAgICAgIGNvbnN0IHdvcmtlckRhdGEgPSBKU09OLnBhcnNlKGZpbGVDb250ZW50KVxuICAgICAgICB3b3JrZXJzRGF0YS5wdXNoKHdvcmtlckRhdGEpXG4gICAgfSlcblxuICAgIC8vIFJlbW92ZSB3b3JrZXIgZGF0YSBhZnRlciBhbGwgcmVhZGluZ1xuICAgIHJlbW92ZVdvcmtlcnNEYXRhRGlyKClcblxuICAgIHJldHVybiB3b3JrZXJzRGF0YVxufVxuXG5leHBvcnQgZnVuY3Rpb24gc2F2ZVdvcmtlckRhdGEoZGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pIHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGguam9pbih3b3JrZXJzRGF0YURpclBhdGgsICd3b3JrZXItZGF0YS0nICsgcHJvY2Vzcy5waWQgKyAnLmpzb24nKVxuXG4gICAgdHJ5IHtcbiAgICAgICAgY3JlYXRlV29ya2Vyc0RhdGFEaXIoKVxuICAgICAgICBmcy53cml0ZUZpbGVTeW5jKGZpbGVQYXRoLCBKU09OLnN0cmluZ2lmeShkYXRhKSlcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIEJTdGFja0xvZ2dlci5kZWJ1ZygnRXhjZXB0aW9uIGluIHNhdmluZyB3b3JrZXIgZGF0YTogJyArIGUpXG4gICAgfVxufVxuXG5mdW5jdGlvbiByZW1vdmVXb3JrZXJzRGF0YURpcigpOiBib29sZWFuIHtcbiAgICBmcy5ybVN5bmMod29ya2Vyc0RhdGFEaXJQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSwgZm9yY2U6IHRydWUgfSlcbiAgICByZXR1cm4gdHJ1ZVxufVxuXG5mdW5jdGlvbiBjcmVhdGVXb3JrZXJzRGF0YURpcigpIHtcbiAgICBpZiAoIWZzLmV4aXN0c1N5bmMod29ya2Vyc0RhdGFEaXJQYXRoKSkge1xuICAgICAgICBmcy5ta2RpclN5bmMod29ya2Vyc0RhdGFEaXJQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZVxufVxuIl0sCiAgIm1hcHBpbmdzIjogIjtBQUFBLFNBQVMsWUFBQUEsV0FBVSxZQUFBQyxXQUFVLFFBQUFDLE9BQU0sV0FBQUMsVUFBUyxRQUFBQyxPQUFNLGNBQWM7QUFDaEUsT0FBTyxZQUFZO0FBQ25CLE9BQU9DLFNBQVE7QUFDZixPQUFPLFVBQVU7QUFDakIsU0FBUyxRQUFRLGFBQUFDLGtCQUFpQjtBQUNsQyxPQUFPQyxXQUFVO0FBQ2pCLE9BQU9DLFdBQVU7QUFNakIsT0FBTyxpQkFBaUI7QUFDeEIsT0FBTyxlQUFlO0FBRXRCLFNBQVMsZUFBQUMsb0JBQW1COzs7QUNm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LFlBQVk7QUFDakQsdUJBQW1CLG9CQUFvQixDQUFDO0FBRXhDLHVCQUFtQjtBQUFBLE1BQ2YsR0FBRztBQUFBLE1BQ0g7QUFBQSxNQUNBLE9BQU8sZUFBZSxLQUFLO0FBQUEsTUFDM0IsYUFBYTtBQUFBLElBQ2pCO0FBQ0EsV0FBTyxPQUFPLFlBQVksV0FBVztBQUFBLEVBQ3pDO0FBQUEsRUFFQSxhQUFhLGVBQWUsWUFBd0I7QUFDaEQsUUFBSTtBQUNBLFlBQU0sa0JBQWtCLFVBQVU7QUFDbEMsbUJBQWEsTUFBTSw0Q0FBNEM7QUFBQSxJQUNuRSxTQUFTLEdBQVk7QUFDakIsbUJBQWEsTUFBTSxtQ0FBbUMsQ0FBQztBQUFBLElBQzNEO0FBQUEsRUFDSjtBQUFBLEVBRUEsT0FBTyxzQkFBc0IsVUFBa0I7QUFDM0MsUUFBSSxDQUFDLFVBQVU7QUFDWCxhQUFPO0FBQUEsSUFDWDtBQUVBLFVBQU0sVUFBVUMsS0FBRyxhQUFhLFVBQVUsTUFBTTtBQUVoRCxVQUFNLE9BQU8sS0FBSyxNQUFNLE9BQU87QUFDL0IsU0FBSyxxQkFBcUIsUUFBUTtBQUNsQyxXQUFPO0FBQUEsRUFDWDtBQUFBLEVBRUEsT0FBTyxxQkFBcUIsVUFBbUI7QUFDM0MsUUFBSSxDQUFDLFVBQVU7QUFDWDtBQUFBLElBQ0o7QUFDQSxJQUFBQSxLQUFHLE9BQU8sVUFBVSxFQUFFLE9BQU8sS0FBSyxDQUFDO0FBQUEsRUFDdkM7QUFDSjtBQUVBLEtBQUssY0FBYyxhQUFhOyIsCiAgIm5hbWVzIjogWyJob3N0bmFtZSIsICJwbGF0Zm9ybSIsICJ0eXBlIiwgInZlcnNpb24iLCAiYXJjaCIsICJmcyIsICJwcm9taXNpZnkiLCAicGF0aCIsICJ1dGlsIiwgInBlcmZvcm1hbmNlIiwgImZzIiwgInV0aWwiLCAicGF0aCIsICJhcmNoIiwgInBsYXRmb3JtIiwgInBhdGgiLCAiZnMiLCAiY2hhbGsiLCAibG9nZ2VyIiwgImxvZyIsICJsb2dnZXIiLCAiQlN0YWNrTG9nZ2VyIiwgInBhdGgiLCAiZnMiLCAiY2hhbGsiLCAiQlN0YWNrTG9nZ2VyIiwgImZzIiwgInBhdGgiLCAicGxhdGZvcm0iLCAiQlN0YWNrTG9nZ2VyIiwgImZzIiwgInZlcnNpb24iLCAicGF0aCIsICJwcm9jZXNzIiwgIm9wZW5SZWFkU3RyZWFtUHJvbWlzZSIsICJwYXRoIiwgImZzIiwgInV0aWwiLCAidHlwZSIsICJwbGF0Zm9ybSIsICJhcmNoIiwgImZzIiwgImZzIiwgImZzIiwgInBhdGgiLCAiZnMiLCAicGF0aCIsICJmcyIsICJwYXRoIiwgImdyb3VwIiwgInBhdGgiLCAiZnMiLCAicGF0aCIsICJmcyIsICJwcm9taXNpZnkiLCAidXRpbCIsICJwZXJmb3JtYW5jZSIsICJsYXVuY2hUZXN0U2Vzc2lvbiIsICJob3N0bmFtZSIsICJwbGF0Zm9ybSIsICJ0eXBlIiwgInZlcnNpb24iLCAiYXJjaCIsICJ1dGlsIiwgInN0b3BCdWlsZFVwc3RyZWFtIiwgInBhdGgiLCAiZnMiLCAicGF0aCIsICJnZXRQbGF0Zm9ybVZlcnNpb24iLCAiZ2V0UmVzb2x2ZWREZXZpY2VOYW1lIiwgInBhdGgiLCAiaGFzaCIsICJmcyIsICJwYXRoIiwgInBhdGgiLCAiZnMiLCAicGF0aCIsICJmcyIsICJwYXRoIiwgImZzIiwgInV0aWwiLCAib3MiLCAidXRpbCIsICJmb3JtYXQiLCAicGF0aCIsICJmcyIsICJwYXRoIiwgImZzIiwgInBhdGgiLCAidXRpbCIsICJ1dGlsIiwgImZzIl0KfQo=
|
|
4615
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL3V0aWwudHMiLCAiLi4vc3JjL2xvZ1BhdGNoZXIudHMiLCAiLi4vc3JjL2luc3RydW1lbnRhdGlvbi9wZXJmb3JtYW5jZS9wZXJmb3JtYW5jZS10ZXN0ZXIudHMiLCAiLi4vc3JjL2JzdGFja0xvZ2dlci50cyIsICIuLi9wYWNrYWdlLmpzb24iLCAiLi4vc3JjL2NvbnN0YW50cy50cyIsICIuLi9zcmMvY2xpL2NsaUxvZ2dlci50cyIsICIuLi9zcmMvY2xpL2FwaVV0aWxzLnRzIiwgIi4uL3NyYy9jbGkvY2xpVXRpbHMudHMiLCAiLi4vc3JjL2ZldGNoV3JhcHBlci50cyIsICIuLi9zcmMvaW5zdHJ1bWVudGF0aW9uL3BlcmZvcm1hbmNlL2NvbnN0YW50cy50cyIsICIuLi9zcmMvY2xpL2ZyYW1ld29ya3MvY29uc3RhbnRzL3Rlc3RGcmFtZXdvcmtDb25zdGFudHMudHMiLCAiLi4vc3JjL3Rlc3RIdWIvdXRpbHMudHMiLCAiLi4vc3JjL3Rlc3RvcmNoZXN0cmF0aW9uL3Rlc3RvcmNoZXJzdHJhdGlvbnV0aWxzLnRzIiwgIi4uL3NyYy9jcmFzaC1yZXBvcnRlci50cyIsICIuLi9zcmMvY29uZmlnQ2FwdHVyZS50cyIsICIuLi9zcmMvdGVzdE9wcy9mZWF0dXJlU3RhdHMudHMiLCAiLi4vc3JjL3Rlc3RPcHMvZmVhdHVyZVVzYWdlLnRzIiwgIi4uL3NyYy90ZXN0T3BzL3Rlc3RPcHNDb25maWcudHMiLCAiLi4vc3JjL3Rlc3RPcHMvdXNhZ2VTdGF0cy50cyIsICIuLi9zcmMvc2NyaXB0cy9hY2Nlc3NpYmlsaXR5LXNjcmlwdHMudHMiLCAiLi4vc3JjL3Rlc3RPcHMvb3BlblJ1bnNKb3VybmFsLnRzIiwgIi4uL3NyYy9jbGVhbnVwLnRzIiwgIi4uL3NyYy9pbnN0cnVtZW50YXRpb24vZnVubmVsSW5zdHJ1bWVudGF0aW9uLnRzIiwgIi4uL3NyYy9kYXRhLXN0b3JlLnRzIl0sCiAgInNvdXJjZVJvb3QiOiAiL2hvbWUvcnVubmVyL3dvcmsvd2Rpby1icm93c2Vyc3RhY2stc2VydmljZS93ZGlvLWJyb3dzZXJzdGFjay1zZXJ2aWNlL3BhY2thZ2VzL2Jyb3dzZXJzdGFjay1zZXJ2aWNlIiwKICAic291cmNlc0NvbnRlbnQiOiBbImltcG9ydCB7IGhvc3RuYW1lLCBwbGF0Zm9ybSwgdHlwZSwgdmVyc2lvbiwgYXJjaCwgdG1wZGlyIH0gZnJvbSAnbm9kZTpvcydcbmltcG9ydCBjcnlwdG8gZnJvbSAnbm9kZTpjcnlwdG8nXG5pbXBvcnQgZnMgZnJvbSAnbm9kZTpmcydcbmltcG9ydCB6bGliIGZyb20gJ25vZGU6emxpYidcbmltcG9ydCB7IGZvcm1hdCwgcHJvbWlzaWZ5IH0gZnJvbSAnbm9kZTp1dGlsJ1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJ1xuaW1wb3J0IHV0aWwgZnJvbSAnbm9kZTp1dGlsJ1xuXG5pbXBvcnQgdHlwZSB7IENhcGFiaWxpdGllcywgRnJhbWV3b3JrcywgT3B0aW9ucyB9IGZyb20gJ0B3ZGlvL3R5cGVzJ1xuaW1wb3J0IHR5cGUgeyBCZWZvcmVDb21tYW5kQXJncywgQWZ0ZXJDb21tYW5kQXJncyB9IGZyb20gJ0B3ZGlvL3JlcG9ydGVyJ1xuXG5pbXBvcnQgdHlwZSB7IEdpdFJlcG9JbmZvIH0gZnJvbSAnZ2l0LXJlcG8taW5mbydcbmltcG9ydCBnaXRSZXBvSW5mbyBmcm9tICdnaXQtcmVwby1pbmZvJ1xuaW1wb3J0IGdpdGNvbmZpZyBmcm9tICdnaXRjb25maWdsb2NhbCdcbmltcG9ydCB0eXBlIHsgQ29sb3JOYW1lIH0gZnJvbSAnY2hhbGsnXG5pbXBvcnQgeyBwZXJmb3JtYW5jZSB9IGZyb20gJ25vZGU6cGVyZl9ob29rcydcbmltcG9ydCBsb2dQYXRjaGVyIGZyb20gJy4vbG9nUGF0Y2hlci5qcydcbmltcG9ydCBQZXJmb3JtYW5jZVRlc3RlciBmcm9tICcuL2luc3RydW1lbnRhdGlvbi9wZXJmb3JtYW5jZS9wZXJmb3JtYW5jZS10ZXN0ZXIuanMnXG5pbXBvcnQgKiBhcyBQRVJGT1JNQU5DRV9TREtfRVZFTlRTIGZyb20gJy4vaW5zdHJ1bWVudGF0aW9uL3BlcmZvcm1hbmNlL2NvbnN0YW50cy5qcydcbmltcG9ydCB7IGxvZ0J1aWxkRXJyb3IsIGhhbmRsZUVycm9yRm9yT2JzZXJ2YWJpbGl0eSwgaGFuZGxlRXJyb3JGb3JBY2Nlc3NpYmlsaXR5LCBnZXRQcm9kdWN0TWFwRm9yQnVpbGRTdGFydENhbGwgfSBmcm9tICcuL3Rlc3RIdWIvdXRpbHMuanMnXG5pbXBvcnQgdHlwZSBCcm93c2VyU3RhY2tDb25maWcgZnJvbSAnLi9jb25maWcuanMnXG5pbXBvcnQgeyBPcmNoZXN0cmF0aW9uVXRpbHMgfSBmcm9tICcuL3Rlc3RvcmNoZXN0cmF0aW9uL3Rlc3RvcmNoZXJzdHJhdGlvbnV0aWxzLmpzJ1xuaW1wb3J0IHR5cGUgeyBFcnJvcnMgfSBmcm9tICcuL3Rlc3RIdWIvdXRpbHMuanMnXG5pbXBvcnQgdHlwZSB7IFVzZXJDb25maWcsIFVwbG9hZFR5cGUsIEJyb3dzZXJzdGFja0NvbmZpZywgQnJvd3NlcnN0YWNrT3B0aW9ucywgTGF1bmNoUmVzcG9uc2UgfSBmcm9tICcuL3R5cGVzLmpzJ1xuaW1wb3J0IHR5cGUgeyBJVGVzdENhc2VIb29rUGFyYW1ldGVyIH0gZnJvbSAnLi9jdWN1bWJlci10eXBlcy5qcydcbmltcG9ydCB7XG4gICAgQlJPV1NFUl9ERVNDUklQVElPTixcbiAgICBVUExPQURfTE9HU19FTkRQT0lOVCxcbiAgICBjb25zb2xlSG9sZGVyLFxuICAgIFRFU1RPUFNfQlVJTERfQ09NUExFVEVEX0VOVixcbiAgICBCUk9XU0VSU1RBQ0tfVEVTVEhVQl9KV1QsXG4gICAgQlJPV1NFUlNUQUNLX09CU0VSVkFCSUxJVFksXG4gICAgQlJPV1NFUlNUQUNLX0FDQ0VTU0lCSUxJVFksXG4gICAgQlJPV1NFUlNUQUNLX0xUUyxcbiAgICBCUk9XU0VSU1RBQ0tfTFRTX1NFU1NJT05fSUQsXG4gICAgVEVTVE9QU19TQ1JFRU5TSE9UX0VOVixcbiAgICBCUk9XU0VSU1RBQ0tfVEVTVEhVQl9VVUlELFxuICAgIEJST1dTRVJTVEFDS19LSUxMX1NJR05BTCxcbiAgICBQRVJGX01FQVNVUkVNRU5UX0VOVixcbiAgICBSRVJVTl9FTlYsXG4gICAgQlJPV1NFUlNUQUNLX1RFU1RfUExBTl9JRCxcbiAgICBNQVhfR0lUX01FVEFfREFUQV9TSVpFX0lOX0JZVEVTLFxuICAgIEdJVF9NRVRBX0RBVEFfVFJVTkNBVEVELFxuICAgIEFQUF9BTExZX0lTU1VFU19TVU1NQVJZX0VORFBPSU5ULFxuICAgIEFQUF9BTExZX0lTU1VFU19FTkRQT0lOVCxcbiAgICBDTElfREVCVUdfTE9HU19GSUxFLFxuICAgIFdESU9fTkFNSU5HX1BSRUZJWCxcbiAgICBTVE9QX0JVSUxEX01BWF9BVFRFTVBUUyxcbiAgICBTVE9QX0JVSUxEX0FUVEVNUFRfVElNRU9VVF9NUyxcbiAgICBTVE9QX0JVSUxEX1RPVEFMX0JVREdFVF9NUyxcbiAgICBTVE9QX0JVSUxEX0JBQ0tPRkZfQkFTRV9NU1xufSBmcm9tICcuL2NvbnN0YW50cy5qcydcbmltcG9ydCBDcmFzaFJlcG9ydGVyIGZyb20gJy4vY3Jhc2gtcmVwb3J0ZXIuanMnXG5pbXBvcnQgeyBCU3RhY2tMb2dnZXIgfSBmcm9tICcuL2JzdGFja0xvZ2dlci5qcydcbmltcG9ydCB7IGNvbGxlY3RDb25maWdGaWxlc0ZvclVwbG9hZCwgZGVkdXBlRW50cnlOYW1lLCBmaW5kUGFja2FnZUpzb25Gb3JVcGxvYWQsIGlzQXV0b0NhcHR1cmVMb2dzRGlzYWJsZWQsIHJlZGFjdFNlbnNpdGl2ZUNvbnRlbnQsIHJlbGF0aXZlRGlyVG9Dd2QgfSBmcm9tICcuL2NvbmZpZ0NhcHR1cmUuanMnXG5pbXBvcnQgVXNhZ2VTdGF0cyBmcm9tICcuL3Rlc3RPcHMvdXNhZ2VTdGF0cy5qcydcbmltcG9ydCBUZXN0T3BzQ29uZmlnIGZyb20gJy4vdGVzdE9wcy90ZXN0T3BzQ29uZmlnLmpzJ1xuaW1wb3J0IHR5cGUgeyBTdGFydEJpblNlc3Npb25SZXNwb25zZSB9IGZyb20gJy4vZ3JwYy9pbmRleC5qcydcbmltcG9ydCBBUElVdGlscyBmcm9tICcuL2NsaS9hcGlVdGlscy5qcydcbmltcG9ydCB7IGNyZWF0ZSB9IGZyb20gJ3RhcidcblxuaW1wb3J0IEFjY2Vzc2liaWxpdHlTY3JpcHRzIGZyb20gJy4vc2NyaXB0cy9hY2Nlc3NpYmlsaXR5LXNjcmlwdHMuanMnXG5cbmltcG9ydCB7IF9mZXRjaCBhcyBmZXRjaCB9IGZyb20gJy4vZmV0Y2hXcmFwcGVyLmpzJ1xuXG5jb25zdCBwR2l0Y29uZmlnID0gcHJvbWlzaWZ5KGdpdGNvbmZpZylcblxuZXhwb3J0IHR5cGUgR2l0TWV0YURhdGEgPSB7XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIHNoYTogc3RyaW5nO1xuICAgIHNob3J0X3NoYTogc3RyaW5nO1xuICAgIGJyYW5jaDogc3RyaW5nO1xuICAgIHRhZzogc3RyaW5nIHwgbnVsbDtcbiAgICBjb21taXR0ZXI6IHN0cmluZztcbiAgICBjb21taXR0ZXJfZGF0ZTogc3RyaW5nO1xuICAgIGF1dGhvcjogc3RyaW5nO1xuICAgIGF1dGhvcl9kYXRlOiBzdHJpbmc7XG4gICAgY29tbWl0X21lc3NhZ2U6IHN0cmluZztcbiAgICByb290OiBzdHJpbmc7XG4gICAgY29tbW9uX2dpdF9kaXI6IHN0cmluZztcbiAgICB3b3JrdHJlZV9naXRfZGlyOiBzdHJpbmc7XG4gICAgbGFzdF90YWc6IHN0cmluZyB8IG51bGw7XG4gICAgY29tbWl0c19zaW5jZV9sYXN0X3RhZzogbnVtYmVyO1xuICAgIHJlbW90ZXM6IEFycmF5PHsgbmFtZTogc3RyaW5nOyB1cmw6IHN0cmluZyB9Pjtcbn1cblxuZXhwb3J0IGNvbnN0IERFRkFVTFRfUkVRVUVTVF9DT05GSUcgPSB7XG4gICAgaGVhZGVyczoge1xuICAgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICAnWC1CU1RBQ0stT0JTJzogJ3RydWUnXG4gICAgfSxcbn1cblxuZXhwb3J0IGNvbnN0IENPTE9SUzogUmVjb3JkPHN0cmluZywgQ29sb3JOYW1lPiA9IHtcbiAgICBlcnJvcjogJ3JlZCcsXG4gICAgd2FybjogJ3llbGxvdycsXG4gICAgaW5mbzogJ2N5YW5CcmlnaHQnLFxuICAgIGRlYnVnOiAnZ3JlZW4nLFxuICAgIHRyYWNlOiAnY3lhbicsXG4gICAgcHJvZ3Jlc3M6ICdtYWdlbnRhJ1xufVxuXG4vKipcbiAqIGdldCBicm93c2VyIGRlc2NyaXB0aW9uIGZvciBCcm93c2Vyc3RhY2sgc2VydmljZVxuICogQHBhcmFtIGNhcCBicm93c2VyIGNhcGFibGl0aWVzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRCcm93c2VyRGVzY3JpcHRpb24oY2FwOiBXZWJkcml2ZXJJTy5DYXBhYmlsaXRpZXMpIHtcbiAgICBjYXAgPSBjYXAgfHwge31cbiAgICBpZiAoY2FwWydic3RhY2s6b3B0aW9ucyddKSB7XG4gICAgICAgIGNhcCA9IHsgLi4uY2FwLCAuLi5jYXBbJ2JzdGFjazpvcHRpb25zJ10gfSBhcyBXZWJkcml2ZXJJTy5DYXBhYmlsaXRpZXNcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGVzZSBrZXlzIGRlc2NyaWJlIHRoZSBicm93c2VyIHRoZSB0ZXN0IHdhcyBydW4gb25cbiAgICAgKi9cbiAgICByZXR1cm4gQlJPV1NFUl9ERVNDUklQVElPTlxuICAgICAgICAubWFwKChrKSA9PiAoY2FwKVtrIGFzIGtleW9mIHR5cGVvZiBjYXBdKVxuICAgICAgICAuZmlsdGVyKEJvb2xlYW4pXG4gICAgICAgIC5qb2luKCcgJylcbn1cblxuLyoqXG4gKiBnZXQgY29ycmVjdCBicm93c2VyIGNhcGFiaWxpdGllcyBvYmplY3QgaW4gYm90aCBtdWx0aXJlbW90ZSBhbmQgbm9ybWFsIHNldHVwc1xuICogQHBhcmFtIGJyb3dzZXIgYnJvd3NlciBvYmplY3RcbiAqIEBwYXJhbSBjYXBzIGJyb3dzZXIgY2FwYmlsaXRpZXMgb2JqZWN0LiBJbiBjYXNlIG9mIG11bHRpcmVtb3RlLCB0aGUgb2JqZWN0IGl0c2VsZiBzaG91bGQgaGF2ZSBhIHByb3BlcnR5IG5hbWVkICdjYXBhYmlsaXRpZXMnXG4gKiBAcGFyYW0gYnJvd3Nlck5hbWUgYnJvd3NlciBuYW1lIGluIGNhc2Ugb2YgbXVsdGlyZW1vdGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEJyb3dzZXJDYXBhYmlsaXRpZXMoYnJvd3NlcjogV2ViZHJpdmVySU8uQnJvd3NlciB8IFdlYmRyaXZlcklPLk11bHRpUmVtb3RlQnJvd3NlciwgY2Fwcz86IENhcGFiaWxpdGllcy5SZXNvbHZlZFRlc3RydW5uZXJDYXBhYmlsaXRpZXMsIGJyb3dzZXJOYW1lPzogc3RyaW5nKSB7XG4gICAgaWYgKCFicm93c2VyLmlzTXVsdGlyZW1vdGUpIHtcbiAgICAgICAgcmV0dXJuIHsgLi4uYnJvd3Nlci5jYXBhYmlsaXRpZXMsIC4uLmNhcHMgfSBhcyBXZWJkcml2ZXJJTy5DYXBhYmlsaXRpZXNcbiAgICB9XG5cbiAgICBjb25zdCBtdWx0aUNhcHMgPSBjYXBzIGFzIENhcGFiaWxpdGllcy5SZXF1ZXN0ZWRNdWx0aXJlbW90ZUNhcGFiaWxpdGllc1xuICAgIGNvbnN0IGdsb2JhbENhcCA9IGJyb3dzZXJOYW1lICYmIGJyb3dzZXIuZ2V0SW5zdGFuY2UoYnJvd3Nlck5hbWUpID8gYnJvd3Nlci5nZXRJbnN0YW5jZShicm93c2VyTmFtZSkuY2FwYWJpbGl0aWVzIDoge31cbiAgICBjb25zdCBjYXAgPSBicm93c2VyTmFtZSAmJiBtdWx0aUNhcHNbYnJvd3Nlck5hbWVdID8gbXVsdGlDYXBzW2Jyb3dzZXJOYW1lXS5jYXBhYmlsaXRpZXMgOiB7fVxuICAgIHJldHVybiB7IC4uLmdsb2JhbENhcCwgLi4uY2FwIH0gYXMgV2ViZHJpdmVySU8uQ2FwYWJpbGl0aWVzXG59XG5cbi8qKlxuICogY2hlY2sgZm9yIGJyb3dzZXJzdGFjayBXM0MgY2FwYWJpbGl0aWVzLiBEb2VzIG5vdCBzdXBwb3J0IGxlZ2FjeSBjYXBhYmlsaXRpZXNcbiAqIEBwYXJhbSBjYXAgYnJvd3NlciBjYXBhYmlsaXRpZXNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzQnJvd3NlcnN0YWNrQ2FwYWJpbGl0eShjYXA/OiBXZWJkcml2ZXJJTy5DYXBhYmlsaXRpZXMpIHtcbiAgICByZXR1cm4gQm9vbGVhbihcbiAgICAgICAgY2FwICYmXG4gICAgICAgICAgICBjYXBbJ2JzdGFjazpvcHRpb25zJ10gJiZcbiAgICAgICAgICAgIC8vIHJldHVybiBmYWxzZSBpZiB0aGUgb25seSBjYXAgaW4gYnN0YWNrOm9wdGlvbnMgaXMgd2Rpb1NlcnZpY2UsXG4gICAgICAgICAgICAvLyBhcyB0aGF0IGlzIGFkZGVkIGJ5IHRoZSBzZXJ2aWNlIGFuZCBub3QgcHJlc2VudCBpbiB1c2VyIHBhc3NlZCBjYXBzXG4gICAgICAgICAgICAhKFxuICAgICAgICAgICAgICAgIE9iamVjdC5rZXlzKGNhcFsnYnN0YWNrOm9wdGlvbnMnXSkubGVuZ3RoID09PSAxICYmXG4gICAgICAgICAgICAgICAgY2FwWydic3RhY2s6b3B0aW9ucyddLndkaW9TZXJ2aWNlXG4gICAgICAgICAgICApXG4gICAgKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0UGFyZW50U3VpdGVOYW1lKGZ1bGxUaXRsZTogc3RyaW5nLCB0ZXN0U3VpdGVUaXRsZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBmdWxsVGl0bGVXb3JkcyA9IGZ1bGxUaXRsZS5zcGxpdCgnICcpXG4gICAgY29uc3QgdGVzdFN1aXRlVGl0bGVXb3JkcyA9IHRlc3RTdWl0ZVRpdGxlLnNwbGl0KCcgJylcbiAgICBjb25zdCBzaG9ydGVzdExlbmd0aCA9IE1hdGgubWluKGZ1bGxUaXRsZVdvcmRzLmxlbmd0aCwgdGVzdFN1aXRlVGl0bGVXb3Jkcy5sZW5ndGgpXG4gICAgbGV0IGMgPSAwXG4gICAgbGV0IHBhcmVudFN1aXRlTmFtZSA9ICcnXG4gICAgd2hpbGUgKGMgPCBzaG9ydGVzdExlbmd0aCAmJiBmdWxsVGl0bGVXb3Jkc1tjXSA9PT0gdGVzdFN1aXRlVGl0bGVXb3Jkc1tjXSkge1xuICAgICAgICBwYXJlbnRTdWl0ZU5hbWUgKz0gZnVsbFRpdGxlV29yZHNbYysrXSArICcgJ1xuICAgIH1cbiAgICByZXR1cm4gcGFyZW50U3VpdGVOYW1lLnRyaW0oKVxufVxuXG5mdW5jdGlvbiBwcm9jZXNzRXJyb3IoZXJyb3I6IEVycm9yLCBmbjogRnVuY3Rpb24sIGFyZ3M6IHVua25vd25bXSkge1xuICAgIEJTdGFja0xvZ2dlci5lcnJvcihgRXJyb3IgaW4gZXhlY3V0aW5nICR7Zm4ubmFtZX0gd2l0aCBhcmdzICR7YXJnc306ICR7ZXJyb3J9YClcbiAgICBsZXQgYXJnc1N0cmluZzogc3RyaW5nXG4gICAgdHJ5IHtcbiAgICAgICAgYXJnc1N0cmluZyA9IEpTT04uc3RyaW5naWZ5KGFyZ3MpXG4gICAgfSBjYXRjaCB7XG4gICAgICAgIGFyZ3NTdHJpbmcgPSB1dGlsLmluc3BlY3QoYXJncywgeyBkZXB0aDogMiB9KVxuICAgIH1cbiAgICBDcmFzaFJlcG9ydGVyLnVwbG9hZENyYXNoUmVwb3J0KGBFcnJvciBpbiBleGVjdXRpbmcgJHtmbi5uYW1lfSB3aXRoIGFyZ3MgJHthcmdzU3RyaW5nfSA6ICR7ZXJyb3J9YCwgZXJyb3IgJiYgZXJyb3Iuc3RhY2sgfHwgJ3Vua25vd24gZXJyb3InKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gbzExeUVycm9ySGFuZGxlcihmbjogRnVuY3Rpb24pIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKC4uLmFyZ3M6IHVua25vd25bXSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgbGV0IGZ1bmN0aW9uVG9IYW5kbGUgPSBmblxuICAgICAgICAgICAgaWYgKHByb2Nlc3MuZW52W1BFUkZfTUVBU1VSRU1FTlRfRU5WXSkge1xuICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICAgICAgICAgICAgZnVuY3Rpb25Ub0hhbmRsZSA9IHBlcmZvcm1hbmNlLnRpbWVyaWZ5KGZ1bmN0aW9uVG9IYW5kbGUgYXMgYW55KVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gZnVuY3Rpb25Ub0hhbmRsZSguLi5hcmdzKVxuICAgICAgICAgICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIFByb21pc2UpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0LmNhdGNoKGVycm9yID0+IHByb2Nlc3NFcnJvcihlcnJvciwgZm4sIGFyZ3MpKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdFxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgcHJvY2Vzc0Vycm9yKGVycm9yIGFzIEVycm9yLCBmbiwgYXJncylcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGVycm9ySGFuZGxlcihmbjogRnVuY3Rpb24pIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKC4uLmFyZ3M6IHVua25vd25bXSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgZnVuY3Rpb25Ub0hhbmRsZSA9IGZuXG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBmdW5jdGlvblRvSGFuZGxlKC4uLmFyZ3MpXG4gICAgICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQuY2F0Y2goZXJyb3IgPT4gQlN0YWNrTG9nZ2VyLmVycm9yKGBFcnJvciBpbiBleGVjdXRpbmcgJHtmbi5uYW1lfSB3aXRoIGFyZ3MgJHthcmdzfTogJHtlcnJvcn1gKSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXN1bHRcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIEJTdGFja0xvZ2dlci5lcnJvcihgRXJyb3IgaW4gZXhlY3V0aW5nICR7Zm4ubmFtZX0gd2l0aCBhcmdzICR7YXJnc306ICR7ZXJyb3J9YClcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIG5vZGVSZXF1ZXN0KHJlcXVlc3RUeXBlOiBzdHJpbmcsIGFwaUVuZHBvaW50OiBzdHJpbmcsIG9wdGlvbnM6IFJlcXVlc3RJbml0LCBhcGlVcmw6IHN0cmluZywgdGltZW91dDogbnVtYmVyID0gMTIwMDAwKSB7XG4gICAgdHJ5IHtcblxuICAgICAgICBjb25zdCBjb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpXG4gICAgICAgIGNvbnN0IHRpbWVvdXRJZCA9IHNldFRpbWVvdXQoKCkgPT4gY29udHJvbGxlci5hYm9ydCgpLCB0aW1lb3V0KVxuXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goYCR7YXBpVXJsfS8ke2FwaUVuZHBvaW50fWAsIHtcbiAgICAgICAgICAgIG1ldGhvZDogcmVxdWVzdFR5cGUsXG4gICAgICAgICAgICBzaWduYWw6IGNvbnRyb2xsZXIuc2lnbmFsLFxuICAgICAgICAgICAgLi4ub3B0aW9uc1xuICAgICAgICB9KVxuXG4gICAgICAgIC8vIENsZWFyIHRoZSB0aW1lb3V0IGFzIHRoZSByZXF1ZXN0IGNvbXBsZXRlZCBzdWNjZXNzZnVsbHlcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXRJZClcblxuICAgICAgICByZXR1cm4gYXdhaXQgcmVzcG9uc2UuanNvbigpXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICAgIEJTdGFja0xvZ2dlci5kZWJ1ZyhgRXJyb3IgaW4gZmlyaW5nIHJlcXVlc3QgJHthcGlVcmx9LyR7YXBpRW5kcG9pbnR9OiAke2Zvcm1hdChlcnJvcil9YClcbiAgICAgICAgY29uc3QgaXNMb2dVcGxvYWQgPSBhcGlFbmRwb2ludCA9PT0gVVBMT0FEX0xPR1NfRU5EUE9JTlRcbiAgICAgICAgaWYgKGVycm9yICYmIGVycm9yLnJlc3BvbnNlKSB7XG4gICAgICAgICAgICBjb25zdCBlcnJvck1lc3NhZ2VKc29uID0gZXJyb3IucmVzcG9uc2UuYm9keSA/IEpTT04ucGFyc2UoZXJyb3IucmVzcG9uc2UuYm9keS50b1N0cmluZygpKSA6IG51bGxcbiAgICAgICAgICAgIGNvbnN0IGVycm9yTWVzc2FnZSA9IGVycm9yTWVzc2FnZUpzb24gPyBlcnJvck1lc3NhZ2VKc29uLm1lc3NhZ2UgOiBudWxsXG4gICAgICAgICAgICBpZiAoZXJyb3JNZXNzYWdlKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbWVzc2FnZSA9IGAke2Vycm9yTWVzc2FnZX0gLSAke2Vycm9yLnN0YWNrfWBcbiAgICAgICAgICAgICAgICBpZiAoaXNMb2dVcGxvYWQpIHtcbiAgICAgICAgICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLmRlYnVnKG1lc3NhZ2UpXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLmVycm9yKG1lc3NhZ2UpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoaXNMb2dVcGxvYWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRocm93IGVycm9yXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoaXNMb2dVcGxvYWQpIHtcbiAgICAgICAgICAgICAgICBCU3RhY2tMb2dnZXIuZGVidWcoYEZhaWxlZCB0byBmaXJlIGFwaSByZXF1ZXN0IGR1ZSB0byAke2Vycm9yfSAtICR7ZXJyb3Iuc3RhY2t9YClcbiAgICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIEJTdGFja0xvZ2dlci5kZWJ1ZyhgRmFpbGVkIHRvIGZpcmUgYXBpIHJlcXVlc3QgZHVlIHRvICR7ZXJyb3J9IC0gJHtlcnJvci5zdGFja31gKVxuICAgICAgICAgICAgdGhyb3cgZXJyb3JcbiAgICAgICAgfVxuICAgIH1cbn1cblxuLy8gaHR0cHM6Ly90dWdheWlsaWsubWVkaXVtLmNvbS9lcnJvci1oYW5kbGluZy12aWEtdHJ5LWNhdGNoLXByb3h5LWluLWphdmFzY3JpcHQtNTQxMTZkYmY3ODNmXG4vKlxuICAgIEEgY2xhc3Mgd3JhcHBlciBmb3IgZXJyb3IgaGFuZGxpbmcuIFRoZSB3cmFwcGVyIHdyYXBzIGFsbCB0aGUgbWV0aG9kcyBvZiB0aGUgY2xhc3Mgd2l0aCBhIGVycm9yIGhhbmRsZXIgZnVuY3Rpb24uXG4gICAgSWYgYW55IGV4Y2VwdGlvbiBvY2N1cnMgaW4gYW55IG9mIHRoZSBjbGFzcyBtZXRob2QsIHRoYXQgd2lsbCBnZXQgY2F1Z2h0IGluIHRoZSB3cmFwcGVyIHdoaWNoIGxvZ3MgYW5kIHJlcG9ydHMgdGhlIGVycm9yLlxuICovXG50eXBlIENsYXNzVHlwZSA9IHsgbmV3KC4uLmFyZ3M6IHVua25vd25bXSk6IHVua25vd247IH0gLy8gQSBnZW5lcmljIHR5cGUgZm9yIGEgY2xhc3NcbmV4cG9ydCBmdW5jdGlvbiBvMTF5Q2xhc3NFcnJvckhhbmRsZXI8VCBleHRlbmRzIENsYXNzVHlwZT4oZXJyb3JDbGFzczogVCk6IFQge1xuICAgIGNvbnN0IHByb3RvdHlwZSA9IGVycm9yQ2xhc3MucHJvdG90eXBlXG5cbiAgICBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMocHJvdG90eXBlKS5sZW5ndGggPCAyKSB7XG4gICAgICAgIHJldHVybiBlcnJvckNsYXNzXG4gICAgfVxuXG4gICAgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMocHJvdG90eXBlKS5mb3JFYWNoKChtZXRob2ROYW1lKSA9PiB7XG4gICAgICAgIGNvbnN0IG1ldGhvZCA9IHByb3RvdHlwZVttZXRob2ROYW1lXVxuICAgICAgICBpZiAodHlwZW9mIG1ldGhvZCA9PT0gJ2Z1bmN0aW9uJyAmJiBtZXRob2ROYW1lICE9PSAnY29uc3RydWN0b3InICYmIG1ldGhvZE5hbWUgIT09ICdjb21tYW5kV3JhcHBlcicpIHtcbiAgICAgICAgICAgIC8vIEluIG9yZGVyIHRvIHByZXNlcnZlIHRoaXMgY29udGV4dCwgbmVlZCB0byBkZWZpbmUgbGlrZSB0aGlzXG4gICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkocHJvdG90eXBlLCBtZXRob2ROYW1lLCB7XG4gICAgICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uKC4uLmFyZ3M6IHVua25vd25bXSkge1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gKHByb2Nlc3MuZW52W1BFUkZfTUVBU1VSRU1FTlRfRU5WXSA/IHBlcmZvcm1hbmNlLnRpbWVyaWZ5KG1ldGhvZCkgOiBtZXRob2QpLmNhbGwodGhpcywgLi4uYXJncylcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC5jYXRjaChlcnJvciA9PiBwcm9jZXNzRXJyb3IoZXJyb3IsIG1ldGhvZCwgYXJncykpXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0XG5cbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzRXJyb3IoZXJyIGFzIEVycm9yLCBtZXRob2QsIGFyZ3MpXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgfSlcblxuICAgIHJldHVybiBlcnJvckNsYXNzXG59XG5cbmV4cG9ydCBjb25zdCBwcm9jZXNzVGVzdE9ic2VydmFiaWxpdHlSZXNwb25zZSA9IChyZXNwb25zZTogTGF1bmNoUmVzcG9uc2UpID0+IHtcbiAgICBpZiAoIXJlc3BvbnNlLm9ic2VydmFiaWxpdHkpIHtcbiAgICAgICAgaGFuZGxlRXJyb3JGb3JPYnNlcnZhYmlsaXR5KG51bGwpXG4gICAgICAgIHJldHVyblxuICAgIH1cbiAgICBpZiAoIXJlc3BvbnNlLm9ic2VydmFiaWxpdHkuc3VjY2Vzcykge1xuICAgICAgICBoYW5kbGVFcnJvckZvck9ic2VydmFiaWxpdHkocmVzcG9uc2Uub2JzZXJ2YWJpbGl0eSBhcyBFcnJvcnMpXG4gICAgICAgIHJldHVyblxuICAgIH1cbiAgICBwcm9jZXNzLmVudltCUk9XU0VSU1RBQ0tfT0JTRVJWQUJJTElUWV0gPSAndHJ1ZSdcbiAgICBpZiAocmVzcG9uc2Uub2JzZXJ2YWJpbGl0eS5vcHRpb25zLmFsbG93X3NjcmVlbnNob3RzKSB7XG4gICAgICAgIHByb2Nlc3MuZW52W1RFU1RPUFNfU0NSRUVOU0hPVF9FTlZdID0gcmVzcG9uc2Uub2JzZXJ2YWJpbGl0eS5vcHRpb25zLmFsbG93X3NjcmVlbnNob3RzLnRvU3RyaW5nKClcbiAgICB9XG59XG5cbmludGVyZmFjZSBEYXRhRWxlbWVudCB7XG4gICAgW2tleTogc3RyaW5nXTogdW5rbm93blxufVxuXG5leHBvcnQgY29uc3QganNvbmlmeUFjY2Vzc2liaWxpdHlBcnJheSA9IChcbiAgICBkYXRhQXJyYXk6IERhdGFFbGVtZW50W10sXG4gICAga2V5TmFtZToga2V5b2YgRGF0YUVsZW1lbnQsXG4gICAgdmFsdWVOYW1lOiBrZXlvZiBEYXRhRWxlbWVudFxuKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPT4ge1xuICAgIGNvbnN0IHJlc3VsdDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fVxuICAgIGRhdGFBcnJheS5mb3JFYWNoKChlbGVtZW50OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikgPT4ge1xuICAgICAgICByZXN1bHRbZWxlbWVudFtrZXlOYW1lXSBhcyBzdHJpbmddID0gZWxlbWVudFt2YWx1ZU5hbWVdXG4gICAgfSlcbiAgICByZXR1cm4gcmVzdWx0XG59XG5cbmV4cG9ydCBjb25zdCBwcm9jZXNzQWNjZXNzaWJpbGl0eVJlc3BvbnNlID0gKHJlc3BvbnNlOiBMYXVuY2hSZXNwb25zZSB8IFN0YXJ0QmluU2Vzc2lvblJlc3BvbnNlLCBvcHRpb25zOiBCcm93c2Vyc3RhY2tDb25maWcgJiBPcHRpb25zLlRlc3RydW5uZXIpID0+IHtcbiAgICBpZiAoIXJlc3BvbnNlLmFjY2Vzc2liaWxpdHkpIHtcbiAgICAgICAgaWYgKG9wdGlvbnMuYWNjZXNzaWJpbGl0eSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgaGFuZGxlRXJyb3JGb3JBY2Nlc3NpYmlsaXR5KG51bGwpXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGlmICghcmVzcG9uc2UuYWNjZXNzaWJpbGl0eS5zdWNjZXNzKSB7XG4gICAgICAgIGhhbmRsZUVycm9yRm9yQWNjZXNzaWJpbGl0eShyZXNwb25zZS5hY2Nlc3NpYmlsaXR5IGFzIEVycm9ycylcbiAgICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKHJlc3BvbnNlLmFjY2Vzc2liaWxpdHkub3B0aW9ucykge1xuICAgICAgICBjb25zdCB7IGFjY2Vzc2liaWxpdHlUb2tlbiwgcG9sbGluZ1RpbWVvdXQsIHNjYW5uZXJWZXJzaW9uIH0gPSBqc29uaWZ5QWNjZXNzaWJpbGl0eUFycmF5KHJlc3BvbnNlLmFjY2Vzc2liaWxpdHkub3B0aW9ucy5jYXBhYmlsaXRpZXMgYXMgQXJyYXk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+LCAnbmFtZScsICd2YWx1ZScpXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGpzb25pZnlBY2Nlc3NpYmlsaXR5QXJyYXkocmVzcG9uc2UuYWNjZXNzaWJpbGl0eS5vcHRpb25zLmNhcGFiaWxpdGllcyBhcyBBcnJheTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4sICduYW1lJywgJ3ZhbHVlJylcbiAgICAgICAgY29uc3Qgc2NyaXB0c0pzb24gPSB7XG4gICAgICAgICAgICAnc2NyaXB0cyc6IGpzb25pZnlBY2Nlc3NpYmlsaXR5QXJyYXkocmVzcG9uc2UuYWNjZXNzaWJpbGl0eS5vcHRpb25zLnNjcmlwdHMgYXMgQXJyYXk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+LCAnbmFtZScsICdjb21tYW5kJyksXG4gICAgICAgICAgICAnY29tbWFuZHMnOiByZXNwb25zZS5hY2Nlc3NpYmlsaXR5Lm9wdGlvbnMuY29tbWFuZHNUb1dyYXA/LmNvbW1hbmRzID8/IFtdLFxuICAgICAgICAgICAgJ25vbkJTdGFja0luZnJhQTExeUNocm9tZU9wdGlvbnMnOiByZXN1bHRbJ2dvb2c6Y2hyb21lT3B0aW9ucyddXG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNjYW5uZXJWZXJzaW9uKSB7XG4gICAgICAgICAgICBwcm9jZXNzLmVudi5CU1RBQ0tfQTExWV9TQ0FOTkVSX1ZFUlNJT04gPSBzY2FubmVyVmVyc2lvbiBhcyBzdHJpbmdcbiAgICAgICAgICAgIEJTdGFja0xvZ2dlci5kZWJ1ZyhgQWNjZXNzaWJpbGl0eSBzY2FubmVyVmVyc2lvbiAke3NjYW5uZXJWZXJzaW9ufWApXG4gICAgICAgIH1cbiAgICAgICAgaWYgKGFjY2Vzc2liaWxpdHlUb2tlbikge1xuICAgICAgICAgICAgcHJvY2Vzcy5lbnYuQlNUQUNLX0ExMVlfSldUID0gYWNjZXNzaWJpbGl0eVRva2VuIGFzIHN0cmluZ1xuICAgICAgICAgICAgcHJvY2Vzcy5lbnZbQlJPV1NFUlNUQUNLX0FDQ0VTU0lCSUxJVFldID0gJ3RydWUnXG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBvbGxpbmdUaW1lb3V0KSB7XG4gICAgICAgICAgICBwcm9jZXNzLmVudi5CU1RBQ0tfQTExWV9QT0xMSU5HX1RJTUVPVVQgPSBwb2xsaW5nVGltZW91dCBhcyBzdHJpbmdcbiAgICAgICAgfVxuICAgICAgICBpZiAoc2NyaXB0c0pzb24pIHtcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgZml4IHR5cGVcbiAgICAgICAgICAgIEFjY2Vzc2liaWxpdHlTY3JpcHRzLnVwZGF0ZShzY3JpcHRzSnNvbilcbiAgICAgICAgICAgIEFjY2Vzc2liaWxpdHlTY3JpcHRzLnN0b3JlKClcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZXhwb3J0IGNvbnN0IHByb2Nlc3NMYXVuY2hCdWlsZFJlc3BvbnNlID0gKHJlc3BvbnNlOiBMYXVuY2hSZXNwb25zZSwgb3B0aW9uczogQnJvd3NlcnN0YWNrQ29uZmlnICYgT3B0aW9ucy5UZXN0cnVubmVyKSA9PiB7XG4gICAgaWYgKG9wdGlvbnMudGVzdE9ic2VydmFiaWxpdHkpIHtcbiAgICAgICAgcHJvY2Vzc1Rlc3RPYnNlcnZhYmlsaXR5UmVzcG9uc2UocmVzcG9uc2UpXG4gICAgfVxuICAgIHByb2Nlc3NBY2Nlc3NpYmlsaXR5UmVzcG9uc2UocmVzcG9uc2UsIG9wdGlvbnMpXG59XG5cbmV4cG9ydCBjb25zdCBsYXVuY2hUZXN0U2Vzc2lvbiA9IFBlcmZvcm1hbmNlVGVzdGVyLm1lYXN1cmVXcmFwcGVyKFBFUkZPUk1BTkNFX1NES19FVkVOVFMuVEVTVEhVQl9FVkVOVFMuU1RBUlQsIG8xMXlFcnJvckhhbmRsZXIoYXN5bmMgZnVuY3Rpb24gbGF1bmNoVGVzdFNlc3Npb24ob3B0aW9uczogQnJvd3NlcnN0YWNrQ29uZmlnICYgT3B0aW9ucy5UZXN0cnVubmVyLCBjb25maWc6IE9wdGlvbnMuVGVzdHJ1bm5lciwgYnNDb25maWc6IFVzZXJDb25maWcsIGJTdGFja0NvbmZpZzogQnJvd3NlclN0YWNrQ29uZmlnLCBhY2Nlc3NpYmlsaXR5QXV0b21hdGlvbj86IGJvb2xlYW4pIHtcbiAgICBjb25zdCBsYXVuY2hCdWlsZFVzYWdlID0gVXNhZ2VTdGF0cy5nZXRJbnN0YW5jZSgpLmxhdW5jaEJ1aWxkVXNhZ2VcbiAgICBsYXVuY2hCdWlsZFVzYWdlLnRyaWdnZXJlZCgpXG5cbiAgICBjb25zdCBkYXRhID0ge1xuICAgICAgICBmb3JtYXQ6ICdqc29uJyxcbiAgICAgICAgcHJvamVjdF9uYW1lOiBnZXRPYnNlcnZhYmlsaXR5UHJvamVjdChvcHRpb25zLCBic0NvbmZpZy5wcm9qZWN0TmFtZSksXG4gICAgICAgIG5hbWU6IGdldE9ic2VydmFiaWxpdHlCdWlsZChvcHRpb25zLCBic0NvbmZpZy5idWlsZE5hbWUpLFxuICAgICAgICBidWlsZF9pZGVudGlmaWVyOiBic0NvbmZpZy5idWlsZElkZW50aWZpZXIsXG4gICAgICAgIHN0YXJ0ZWRfYXQ6IChuZXcgRGF0ZSgpKS50b0lTT1N0cmluZygpLFxuICAgICAgICB0YWdzOiBnZXRPYnNlcnZhYmlsaXR5QnVpbGRUYWdzKG9wdGlvbnMsIGJzQ29uZmlnLmJ1aWxkVGFnKSxcbiAgICAgICAgaG9zdF9pbmZvOiB7XG4gICAgICAgICAgICBob3N0bmFtZTogaG9zdG5hbWUoKSxcbiAgICAgICAgICAgIHBsYXRmb3JtOiBwbGF0Zm9ybSgpLFxuICAgICAgICAgICAgdHlwZTogdHlwZSgpLFxuICAgICAgICAgICAgdmVyc2lvbjogdmVyc2lvbigpLFxuICAgICAgICAgICAgYXJjaDogYXJjaCgpXG4gICAgICAgIH0sXG4gICAgICAgIGNpX2luZm86IGdldENpSW5mbygpLFxuICAgICAgICBidWlsZF9ydW5faWRlbnRpZmllcjogcHJvY2Vzcy5lbnYuQlJPV1NFUlNUQUNLX0JVSUxEX1JVTl9JREVOVElGSUVSLFxuICAgICAgICBmYWlsZWRfdGVzdHNfcmVydW46IHByb2Nlc3MuZW52W1JFUlVOX0VOVl0gfHwgZmFsc2UsXG4gICAgICAgIHZlcnNpb25fY29udHJvbDogYXdhaXQgZ2V0R2l0TWV0YURhdGEoKSxcbiAgICAgICAgYWNjZXNzaWJpbGl0eToge1xuICAgICAgICAgICAgc2V0dGluZ3M6IG9wdGlvbnMuYWNjZXNzaWJpbGl0eU9wdGlvbnNcbiAgICAgICAgfSxcbiAgICAgICAgYnJvd3NlcnN0YWNrQXV0b21hdGlvbjogc2hvdWxkQWRkU2VydmljZVZlcnNpb24oY29uZmlnLCBvcHRpb25zLnRlc3RPYnNlcnZhYmlsaXR5KSxcbiAgICAgICAgZnJhbWV3b3JrX2RldGFpbHM6IHtcbiAgICAgICAgICAgIGZyYW1ld29ya05hbWU6IFdESU9fTkFNSU5HX1BSRUZJWCArIGNvbmZpZy5mcmFtZXdvcmssXG4gICAgICAgICAgICBmcmFtZXdvcmtWZXJzaW9uOiBic0NvbmZpZy5ic3RhY2tTZXJ2aWNlVmVyc2lvbixcbiAgICAgICAgICAgIHNka1ZlcnNpb246IGJzQ29uZmlnLmJzdGFja1NlcnZpY2VWZXJzaW9uLFxuICAgICAgICAgICAgbGFuZ3VhZ2U6ICdFQ01BU2NyaXB0JyxcbiAgICAgICAgICAgIHRlc3RGcmFtZXdvcms6IHtcbiAgICAgICAgICAgICAgICBuYW1lOiAnV2ViZHJpdmVySU8nLFxuICAgICAgICAgICAgICAgIHZlcnNpb246IGJzQ29uZmlnLmJzdGFja1NlcnZpY2VWZXJzaW9uXG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHByb2R1Y3RfbWFwOiBnZXRQcm9kdWN0TWFwRm9yQnVpbGRTdGFydENhbGwoYlN0YWNrQ29uZmlnLCBhY2Nlc3NpYmlsaXR5QXV0b21hdGlvbiksXG4gICAgICAgIGNvbmZpZzoge30sXG4gICAgICAgIHRlc3Rfb3JjaGVzdHJhdGlvbjogT3JjaGVzdHJhdGlvblV0aWxzLmdldEluc3RhbmNlKGNvbmZpZyk/LmdldEJ1aWxkU3RhcnREYXRhKCkgfHwge30sXG4gICAgICAgIHRlc3RfbWFuYWdlbWVudDoge1xuICAgICAgICAgICAgdGVzdF9wbGFuX2lkOiBnZXRUZXN0UGxhbklkKG9wdGlvbnMpXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoYWNjZXNzaWJpbGl0eUF1dG9tYXRpb24gJiYgKGlzVHVyYm9TY2FsZShvcHRpb25zKSB8fCBkYXRhLmJyb3dzZXJzdGFja0F1dG9tYXRpb24gPT09IGZhbHNlKSl7XG4gICAgICAgIGRhdGEuYWNjZXNzaWJpbGl0eS5zZXR0aW5ncyA/Pz0ge31cbiAgICAgICAgZGF0YS5hY2Nlc3NpYmlsaXR5LnNldHRpbmdzLmluY2x1ZGVFbmNvZGVkRXh0ZW5zaW9uID0gdHJ1ZVxuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICAgIGlmIChPYmplY3Qua2V5cyhDcmFzaFJlcG9ydGVyLnVzZXJDb25maWdGb3JSZXBvcnRpbmcpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgQ3Jhc2hSZXBvcnRlci51c2VyQ29uZmlnRm9yUmVwb3J0aW5nID0gcHJvY2Vzcy5lbnYuVVNFUl9DT05GSUdfRk9SX1JFUE9SVElORyAhPT0gdW5kZWZpbmVkID8gSlNPTi5wYXJzZShwcm9jZXNzLmVudi5VU0VSX0NPTkZJR19GT1JfUkVQT1JUSU5HKSA6IHt9XG4gICAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICByZXR1cm4gQlN0YWNrTG9nZ2VyLmVycm9yKGBbQ3Jhc2hfUmVwb3J0X1VwbG9hZF0gRmFpbGVkIHRvIHBhcnNlIHVzZXIgY29uZmlnIHdoaWxlIHNlbmRpbmcgYnVpbGQgc3RhcnQgZXZlbnQgZHVlIHRvICR7ZXJyb3J9YClcbiAgICB9XG4gICAgZGF0YS5jb25maWcgPSBDcmFzaFJlcG9ydGVyLnVzZXJDb25maWdGb3JSZXBvcnRpbmdcblxuICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHVybCA9IGAke0FQSVV0aWxzLkRBVEFfRU5EUE9JTlR9L2FwaS92Mi9idWlsZHNgXG4gICAgICAgIGNvbnN0IGVuY29kZWRBdXRoID0gQnVmZmVyLmZyb20oYCR7Z2V0T2JzZXJ2YWJpbGl0eVVzZXIob3B0aW9ucywgY29uZmlnKX06JHtnZXRPYnNlcnZhYmlsaXR5S2V5KG9wdGlvbnMsIGNvbmZpZyl9YCwgJ3V0ZjgnKS50b1N0cmluZygnYmFzZTY0JylcbiAgICAgICAgY29uc3QgaGVhZGVyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAgICAgICAgIC4uLkRFRkFVTFRfUkVRVUVTVF9DT05GSUcuaGVhZGVycyxcbiAgICAgICAgICAgIEF1dGhvcml6YXRpb246IGBCYXNpYyAke2VuY29kZWRBdXRofWAsXG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh1cmwsIHtcbiAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgICAgaGVhZGVycyxcbiAgICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KGRhdGEpXG4gICAgICAgIH0pXG4gICAgICAgIGNvbnN0IGpzb25SZXNwb25zZTogTGF1bmNoUmVzcG9uc2UgPSBhd2FpdCByZXNwb25zZS5qc29uKClcbiAgICAgICAgZGVsZXRlIGRhdGE/LmFjY2Vzc2liaWxpdHk/LnNldHRpbmdzPy5pbmNsdWRlRW5jb2RlZEV4dGVuc2lvblxuICAgICAgICBCU3RhY2tMb2dnZXIuZGVidWcoYFtTdGFydF9CdWlsZF0gU3VjY2VzcyByZXNwb25zZTogJHtKU09OLnN0cmluZ2lmeShqc29uUmVzcG9uc2UpfWApXG4gICAgICAgIEJTdGFja0xvZ2dlci5kZWJ1ZyhgVGVzdCBQbGFuIElkIHNlbnQgaW4gcmVxdWVzdDogJHtnZXRUZXN0UGxhbklkKG9wdGlvbnMpfWApXG4gICAgICAgIHByb2Nlc3MuZW52W1RFU1RPUFNfQlVJTERfQ09NUExFVEVEX0VOVl0gPSAndHJ1ZSdcbiAgICAgICAgaWYgKGpzb25SZXNwb25zZS5qd3QpIHtcbiAgICAgICAgICAgIHByb2Nlc3MuZW52W0JST1dTRVJTVEFDS19URVNUSFVCX0pXVF0gPSBqc29uUmVzcG9uc2Uuand0XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGpzb25SZXNwb25zZS5idWlsZF9oYXNoZWRfaWQpIHtcbiAgICAgICAgICAgIHByb2Nlc3MuZW52W0JST1dTRVJTVEFDS19URVNUSFVCX1VVSURdID0ganNvblJlc3BvbnNlLmJ1aWxkX2hhc2hlZF9pZFxuICAgICAgICAgICAgVGVzdE9wc0NvbmZpZy5nZXRJbnN0YW5jZSgpLmJ1aWxkSGFzaGVkSWQgPSBqc29uUmVzcG9uc2UuYnVpbGRfaGFzaGVkX2lkXG4gICAgICAgICAgICBCU3RhY2tMb2dnZXIuaW5mbyhgVGVzdGh1YiBzdGFydGVkIHdpdGggaWQ6ICR7VGVzdE9wc0NvbmZpZy5nZXRJbnN0YW5jZSgpPy5idWlsZEhhc2hlZElkfWApXG4gICAgICAgIH1cbiAgICAgICAgcHJvY2Vzc0xhdW5jaEJ1aWxkUmVzcG9uc2UoanNvblJlc3BvbnNlLCBvcHRpb25zKVxuICAgICAgICBsYXVuY2hCdWlsZFVzYWdlLnN1Y2Nlc3MoKVxuICAgICAgICByZXR1cm4ganNvblJlc3BvbnNlXG4gICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgICAgQlN0YWNrTG9nZ2VyLmRlYnVnKGBUZXN0SHViIGJ1aWxkIHN0YXJ0IGZhaWxlZDogJHtmb3JtYXQoZXJyb3IpfWApXG4gICAgICAgIGlmICghKGVycm9yIGFzIEVycm9yICYgeyBzdWNjZXNzOiBib29sZWFuIH0pLnN1Y2Nlc3MpIHtcbiAgICAgICAgICAgIGxhdW5jaEJ1aWxkVXNhZ2UuZmFpbGVkKGVycm9yKVxuICAgICAgICAgICAgbG9nQnVpbGRFcnJvcihlcnJvciBhcyBFcnJvcnMpXG4gICAgICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgICB9XG4gICAgfVxufSkpXG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG5leHBvcnQgY29uc3QgdmFsaWRhdGVDYXBzV2l0aEFwcEExMXkgPSAocGxhdGZvcm1NZXRhPzogeyBba2V5OiBzdHJpbmddOiBhbnk7IH0pID0+IHtcbiAgICAvKiBDaGVjayBpZiB0aGUgY3VycmVudCBkcml2ZXIgcGxhdGZvcm0gaXMgZWxpZ2libGUgZm9yIEFwcEFjY2Vzc2liaWxpdHkgc2NhbiAqL1xuICAgIGlmIChcbiAgICAgICAgKHBsYXRmb3JtTWV0YT8ucGxhdGZvcm1fbmFtZSAmJiBTdHJpbmcocGxhdGZvcm1NZXRhPy5wbGF0Zm9ybV9uYW1lKS50b0xvd2VyQ2FzZSgpID09PSAnYW5kcm9pZCcpICYmXG4gICAgICAgIChwbGF0Zm9ybU1ldGE/LnBsYXRmb3JtX3ZlcnNpb24gJiYgcGFyc2VJbnQocGxhdGZvcm1NZXRhPy5wbGF0Zm9ybV92ZXJzaW9uPy50b1N0cmluZygpKSA8IDExKVxuICAgICkge1xuICAgICAgICBCU3RhY2tMb2dnZXIud2FybignQXBwIEFjY2Vzc2liaWxpdHkgQXV0b21hdGlvbiB0ZXN0cyBhcmUgc3VwcG9ydGVkIG9uIE9TIHZlcnNpb24gMTEgYW5kIGFib3ZlIGZvciBBbmRyb2lkIGRldmljZXMuJylcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICAgIHJldHVybiB0cnVlXG59XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG5leHBvcnQgY29uc3QgdmFsaWRhdGVDYXBzV2l0aEExMXkgPSAoZGV2aWNlTmFtZT86IGFueSwgcGxhdGZvcm1NZXRhPzogeyBba2V5OiBzdHJpbmddOiBhbnk7IH0sIGNocm9tZU9wdGlvbnM/OiBhbnkpID0+IHtcbiAgICAvKiBDaGVjayBpZiB0aGUgY3VycmVudCBkcml2ZXIgcGxhdGZvcm0gaXMgZWxpZ2libGUgZm9yIEFjY2Vzc2liaWxpdHkgc2NhbiAqL1xuICAgIHRyeSB7XG4gICAgICAgIGlmIChkZXZpY2VOYW1lKSB7XG4gICAgICAgICAgICBCU3RhY2tMb2dnZXIud2FybignQWNjZXNzaWJpbGl0eSBBdXRvbWF0aW9uIHdpbGwgcnVuIG9ubHkgb24gRGVza3RvcCBicm93c2Vycy4nKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgIH1cblxuICAgICAgICBpZiAocGxhdGZvcm1NZXRhPy5icm93c2VyX25hbWU/LnRvTG93ZXJDYXNlKCkgIT09ICdjaHJvbWUnKSB7XG4gICAgICAgICAgICBCU3RhY2tMb2dnZXIud2FybignQWNjZXNzaWJpbGl0eSBBdXRvbWF0aW9uIHdpbGwgcnVuIG9ubHkgb24gQ2hyb21lIGJyb3dzZXJzLicpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBicm93c2VyVmVyc2lvbiA9IHBsYXRmb3JtTWV0YT8uYnJvd3Nlcl92ZXJzaW9uXG4gICAgICAgIGlmICggIWlzVW5kZWZpbmVkKGJyb3dzZXJWZXJzaW9uKSAmJiAhKGJyb3dzZXJWZXJzaW9uID09PSAnbGF0ZXN0JyB8fCBwYXJzZUZsb2F0KGJyb3dzZXJWZXJzaW9uICsgJycpID4gOTQpKSB7XG4gICAgICAgICAgICBCU3RhY2tMb2dnZXIud2FybignQWNjZXNzaWJpbGl0eSBBdXRvbWF0aW9uIHdpbGwgcnVuIG9ubHkgb24gQ2hyb21lIGJyb3dzZXIgdmVyc2lvbiBncmVhdGVyIHRoYW4gOTQuJylcbiAgICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNocm9tZU9wdGlvbnM/LmFyZ3M/LmluY2x1ZGVzKCctLWhlYWRsZXNzJykpIHtcbiAgICAgICAgICAgIEJTdGFja0xvZ2dlci53YXJuKCdBY2Nlc3NpYmlsaXR5IEF1dG9tYXRpb24gd2lsbCBub3QgcnVuIG9uIGxlZ2FjeSBoZWFkbGVzcyBtb2RlLiBTd2l0Y2ggdG8gbmV3IGhlYWRsZXNzIG1vZGUgb3IgYXZvaWQgdXNpbmcgaGVhZGxlc3MgbW9kZS4nKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBCU3RhY2tMb2dnZXIuZGVidWcoYEV4Y2VwdGlvbiBpbiBjaGVja2luZyBjYXBhYmlsaXRpZXMgY29tcGF0aWJpbGl0eSB3aXRoIEFjY2Vzc2liaWxpdHkuIEVycm9yOiAke2Vycm9yfWApXG4gICAgfVxuICAgIHJldHVybiBmYWxzZVxufVxuXG5leHBvcnQgY29uc3QgdmFsaWRhdGVDYXBzV2l0aE5vbkJzdGFja0ExMXkgPSAoYnJvd3Nlck5hbWU/OiBzdHJpbmcgfCB1bmRlZmluZWQsIGJyb3dzZXJWZXJzaW9uPzpzdHJpbmcgfCB1bmRlZmluZWQgKSAgPT4ge1xuXG4gICAgaWYgKGJyb3dzZXJOYW1lPy50b0xvd2VyQ2FzZSgpICE9PSAnY2hyb21lJykge1xuICAgICAgICBCU3RhY2tMb2dnZXIud2FybignQWNjZXNzaWJpbGl0eSBBdXRvbWF0aW9uIHdpbGwgcnVuIG9ubHkgb24gQ2hyb21lIGJyb3dzZXJzLicpXG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgICBpZiAoIWlzVW5kZWZpbmVkKGJyb3dzZXJWZXJzaW9uKSAmJiAhKGJyb3dzZXJWZXJzaW9uID09PSAnbGF0ZXN0JyB8fCBwYXJzZUZsb2F0KGJyb3dzZXJWZXJzaW9uICsgJycpID4gMTAwKSkge1xuICAgICAgICBCU3RhY2tMb2dnZXIud2FybignQWNjZXNzaWJpbGl0eSBBdXRvbWF0aW9uIHdpbGwgcnVuIG9ubHkgb24gQ2hyb21lIGJyb3dzZXIgdmVyc2lvbiBncmVhdGVyIHRoYW4gMTAwLicpXG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZVxuXG59XG5cbmV4cG9ydCBjb25zdCBzaG91bGRTY2FuVGVzdEZvckFjY2Vzc2liaWxpdHkgPSAoc3VpdGVUaXRsZTogc3RyaW5nIHwgdW5kZWZpbmVkLCB0ZXN0VGl0bGU6IHN0cmluZywgYWNjZXNzaWJpbGl0eU9wdGlvbnM/OiB7IFtrZXk6IHN0cmluZ106IHN0cmluZzsgfSwgd29ybGQ/OiB7IFtrZXk6IHN0cmluZ106IHVua25vd247IH0sIGlzQ3VjdW1iZXI/OiBib29sZWFuICkgPT4ge1xuICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGluY2x1ZGVUYWdzID0gQXJyYXkuaXNBcnJheShhY2Nlc3NpYmlsaXR5T3B0aW9ucz8uaW5jbHVkZVRhZ3NJblRlc3RpbmdTY29wZSkgPyBhY2Nlc3NpYmlsaXR5T3B0aW9ucz8uaW5jbHVkZVRhZ3NJblRlc3RpbmdTY29wZSA6IFtdXG4gICAgICAgIGNvbnN0IGV4Y2x1ZGVUYWdzID0gQXJyYXkuaXNBcnJheShhY2Nlc3NpYmlsaXR5T3B0aW9ucz8uZXhjbHVkZVRhZ3NJblRlc3RpbmdTY29wZSkgPyBhY2Nlc3NpYmlsaXR5T3B0aW9ucz8uZXhjbHVkZVRhZ3NJblRlc3RpbmdTY29wZSA6IFtdXG5cbiAgICAgICAgaWYgKGlzQ3VjdW1iZXIpIHtcbiAgICAgICAgICAgIGNvbnN0IHRhZ3NMaXN0OiBzdHJpbmdbXSA9IFtdXG4gICAgICAgICAgICA7KHdvcmxkPy5waWNrbGUgYXMgeyB0YWdzOiB7IG5hbWU6IHN0cmluZyB9W10gfSk/LnRhZ3MubWFwKCh0YWc6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nOyB9KSA9PiB0YWdzTGlzdC5wdXNoKHRhZy5uYW1lKSlcbiAgICAgICAgICAgIGNvbnN0IGV4Y2x1ZGVkID0gZXhjbHVkZVRhZ3M/LnNvbWUoKGV4Y2x1ZGUpID0+IHRhZ3NMaXN0LmluY2x1ZGVzKGV4Y2x1ZGUpKVxuICAgICAgICAgICAgY29uc3QgaW5jbHVkZWQgPSBpbmNsdWRlVGFncz8ubGVuZ3RoID09PSAwIHx8IGluY2x1ZGVUYWdzPy5zb21lKChpbmNsdWRlKSA9PiB0YWdzTGlzdC5pbmNsdWRlcyhpbmNsdWRlKSlcblxuICAgICAgICAgICAgcmV0dXJuICFleGNsdWRlZCAmJiBpbmNsdWRlZFxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZnVsbFRlc3ROYW1lID0gc3VpdGVUaXRsZSArICcgJyArIHRlc3RUaXRsZVxuICAgICAgICBjb25zdCBleGNsdWRlZCA9IGV4Y2x1ZGVUYWdzPy5zb21lKChleGNsdWRlKSA9PiBmdWxsVGVzdE5hbWUuaW5jbHVkZXMoZXhjbHVkZSkpXG4gICAgICAgIGNvbnN0IGluY2x1ZGVkID0gaW5jbHVkZVRhZ3M/Lmxlbmd0aCA9PT0gMCB8fCBpbmNsdWRlVGFncz8uc29tZSgoaW5jbHVkZSkgPT4gZnVsbFRlc3ROYW1lLmluY2x1ZGVzKGluY2x1ZGUpKVxuXG4gICAgICAgIHJldHVybiAhZXhjbHVkZWQgJiYgaW5jbHVkZWRcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBCU3RhY2tMb2dnZXIuZGVidWcoYEVycm9yIHdoaWxlIHZhbGlkYXRpbmcgdGVzdCBjYXNlIGZvciBhY2Nlc3NpYmlsaXR5IGJlZm9yZSBzY2FubmluZy4gRXJyb3IgOiAke2Vycm9yfWApXG4gICAgfVxuICAgIHJldHVybiBmYWxzZVxufVxuXG5leHBvcnQgY29uc3QgaXNBY2Nlc3NpYmlsaXR5QXV0b21hdGlvblNlc3Npb24gPSAoYWNjZXNzaWJpbGl0eUZsYWc/OiBib29sZWFuIHwgc3RyaW5nIHwgbnVsbCkgPT4ge1xuICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGhhc0ExMXlKd3RUb2tlbiA9IHR5cGVvZiBwcm9jZXNzLmVudi5CU1RBQ0tfQTExWV9KV1QgPT09ICdzdHJpbmcnICYmIHByb2Nlc3MuZW52LkJTVEFDS19BMTFZX0pXVC5sZW5ndGggPiAwICYmIHByb2Nlc3MuZW52LkJTVEFDS19BMTFZX0pXVCAhPT0gJ251bGwnICYmIHByb2Nlc3MuZW52LkJTVEFDS19BMTFZX0pXVCAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAgcmV0dXJuIGFjY2Vzc2liaWxpdHlGbGFnICYmIGhhc0ExMXlKd3RUb2tlblxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIEJTdGFja0xvZ2dlci5kZWJ1ZyhgRXhjZXB0aW9uIGluIHZlcmlmeWluZyB0aGUgQWNjZXNzaWJpbGl0eSBzZXNzaW9uIHdpdGggZXJyb3IgOiAke2Vycm9yfWApXG4gICAgfVxuICAgIHJldHVybiBmYWxzZVxufVxuXG5leHBvcnQgY29uc3QgQVBQX0FVVE9NQVRFX0NBUF9LRVlTID0gWydhcHBpdW06YXBwJywgJ2FwcGl1bTpidW5kbGVJZCcsICdhcHBpdW06YXBwUGFja2FnZScsICdhcHBpdW06YXBwQWN0aXZpdHknXSBhcyBjb25zdFxuXG4vLyBBbiBBcHAgQXV0b21hdGUgc2Vzc2lvbiBpcyBpZGVudGlmaWVkIGJ5IGFuIGFwcCBjYXBhYmlsaXR5IG9uIHRoZSBkcml2ZXIgY2Fwc1xuLy8gKGFwcGl1bTphcHAgLyBhcHBpdW06YnVuZGxlSWQgLyBhcHBpdW06YXBwUGFja2FnZSAvIGFwcGl1bTphcHBBY3Rpdml0eSAvIGFwcGl1bTpvcHRpb25zLmFwcCkuXG4vLyBTaGFyZWQgYnkgY29uZmlnLXRpbWUgZGV0ZWN0aW9uIGFuZCB0aGUgQ0xJIEF1dG9tYXRlL1BlcmN5IG1vZHVsZXMgc28gQXBwLUF1dG9tYXRlXG4vLyBlbmRwb2ludCByb3V0aW5nIHN0YXlzIGNvbnNpc3RlbnQgYWNyb3NzIGV2ZXJ5IHBsYWNlIHRoYXQgcmVzb2x2ZXMgaXQgZnJvbSBjYXBhYmlsaXRpZXMuXG5leHBvcnQgZnVuY3Rpb24gaGFzQXBwQ2FwKGNhcD86IFdlYmRyaXZlcklPLkNhcGFiaWxpdGllcyk6IGJvb2xlYW4ge1xuICAgIGlmICghY2FwIHx8IHR5cGVvZiBjYXAgIT09ICdvYmplY3QnKSB7XG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgICBjb25zdCByZWNvcmQgPSBjYXAgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgICBpZiAoQVBQX0FVVE9NQVRFX0NBUF9LRVlTLnNvbWUoa2V5ID0+ICFpc1VuZGVmaW5lZChyZWNvcmRba2V5XSkpKSB7XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuICAgIGNvbnN0IGFwcGl1bU9wdGlvbnMgPSByZWNvcmRbJ2FwcGl1bTpvcHRpb25zJ10gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWRcbiAgICByZXR1cm4gISEoYXBwaXVtT3B0aW9ucyAmJiAhaXNVbmRlZmluZWQoYXBwaXVtT3B0aW9ucy5hcHApKVxufVxuXG5leHBvcnQgY29uc3QgaXNBcHBBY2Nlc3NpYmlsaXR5QXV0b21hdGlvblNlc3Npb24gPSAoYWNjZXNzaWJpbGl0eUZsYWc/OiBib29sZWFuIHwgc3RyaW5nLCBpc0FwcEF1dG9tYXRlPzogYm9vbGVhbikgPT4ge1xuICAgIGNvbnN0IGFjY2Vzc2liaWxpdHlBdXRvbWF0aW9uID0gaXNBY2Nlc3NpYmlsaXR5QXV0b21hdGlvblNlc3Npb24oYWNjZXNzaWJpbGl0eUZsYWcpXG4gICAgcmV0dXJuIGFjY2Vzc2liaWxpdHlBdXRvbWF0aW9uICYmIGlzQXBwQXV0b21hdGVcbn1cblxuZXhwb3J0IGNvbnN0IGZvcm1hdFN0cmluZyA9ICh0ZW1wbGF0ZTogKHN0cmluZyB8IG51bGwpLCAuLi52YWx1ZXM6IChzdHJpbmcgfCBudWxsKVtdKTogc3RyaW5nID0+IHtcbiAgICBsZXQgaSA9IDBcbiAgICBpZiAodGVtcGxhdGUgPT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuICcnXG4gICAgfVxuICAgIHJldHVybiB0ZW1wbGF0ZS5yZXBsYWNlKC8lcy9nLCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gdmFsdWVzW2krK11cbiAgICAgICAgcmV0dXJuIHZhbHVlICE9PSBudWxsICYmIHZhbHVlICE9PSB1bmRlZmluZWQgPyB2YWx1ZSA6ICcnXG4gICAgfSlcbn1cblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbmV4cG9ydCBjb25zdCBfZ2V0UGFyYW1zRm9yQXBwQWNjZXNzaWJpbGl0eSA9ICggY29tbWFuZE5hbWU/OiBzdHJpbmcsIHRlc3ROYW1lPzogc3RyaW5nLCBob29rUnVuVXVpZD86IHN0cmluZyB8IG51bGwsIGlzR2xvYmFsSG9vaz86IGJvb2xlYW4gKTogeyB0aFRlc3RSdW5VdWlkOiBhbnksIHRoSG9va1J1blV1aWQ6IGFueSwgdGhCdWlsZFV1aWQ6IGFueSwgdGhKd3RUb2tlbjogYW55LCBhdXRoSGVhZGVyOiBhbnksIHNjYW5UaW1lc3RhbXA6IG51bWJlciwgbWV0aG9kOiBzdHJpbmcgfCB1bmRlZmluZWQsIHRlc3ROYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQgIH0gPT4ge1xuICAgIHJldHVybiB7XG4gICAgICAgIC8vIEEgc2NhbiBmcm9tIGEgV0RJTyBjb25maWctbGV2ZWwgaG9vayBiZWxvbmdzIHRvIG5vIHRlc3QuIFRFU1RfQU5BTFlUSUNTX0lEIGluIHRoYXRcbiAgICAgICAgLy8gd2luZG93IGhvbGRzIGEgdXVpZCB0aGUgZnJhbWV3b3JrIG1pbnRlZCBhdCBpbnN0YW5jZSBjcmVhdGlvbiBcdTIwMTQgYSB0ZXN0IHRoYXQgaGFzIG5vdFxuICAgICAgICAvLyBzdGFydGVkIFx1MjAxNCBzbyBzZW5kaW5nIGl0IHdvdWxkIGF0dHJpYnV0ZSB0aGUgc2NhbiB0byBhIHRlc3QgaXQgZGlkIG5vdCBjb21lIGZyb20uXG4gICAgICAgICd0aFRlc3RSdW5VdWlkJzogaXNHbG9iYWxIb29rID8gdW5kZWZpbmVkIDogcHJvY2Vzcy5lbnYuVEVTVF9BTkFMWVRJQ1NfSUQsXG4gICAgICAgIC8vIFByZXNlbnQgb25seSB3aGVuIHRoZSBzY2FuIGZpcmVzIGluc2lkZSBhIGhvb2sgKGRyb3BwZWQgYnkgSlNPTi5zdHJpbmdpZnkgd2hlbiB1bmRlZmluZWQsXG4gICAgICAgIC8vIHNvIGluLXRlc3Qgc2NhbnMgYXJlIHVuY2hhbmdlZCkuIFNlbGVuaXVtSHViIGFwcEFsbHlIYW5kbGVyIHJlbGF5cyB0aGlzIGFzIGBob29rX3J1bl91dWlkYC5cbiAgICAgICAgJ3RoSG9va1J1blV1aWQnOiBob29rUnVuVXVpZCB8fCB1bmRlZmluZWQsXG4gICAgICAgICd0aEJ1aWxkVXVpZCc6IHByb2Nlc3MuZW52LkJST1dTRVJTVEFDS19URVNUSFVCX1VVSUQsXG4gICAgICAgICd0aEp3dFRva2VuJzogcHJvY2Vzcy5lbnYuQlJPV1NFUlNUQUNLX1RFU1RIVUJfSldULFxuICAgICAgICAnYXV0aEhlYWRlcic6IHByb2Nlc3MuZW52LkJTVEFDS19BMTFZX0pXVCxcbiAgICAgICAgJ3NjYW5UaW1lc3RhbXAnOiBEYXRlLm5vdygpLFxuICAgICAgICAnbWV0aG9kJzogY29tbWFuZE5hbWUsXG4gICAgICAgICd0ZXN0TmFtZSc6IHRlc3ROYW1lXG4gICAgfVxufVxuXG4vKiBlc2xpbnQtZGlzYWJsZSAgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAqL1xuZXhwb3J0IGNvbnN0IHBlcmZvcm1BMTF5U2NhbiA9IGFzeW5jIChpc0FwcEF1dG9tYXRlOiBib29sZWFuLCBicm93c2VyOiBXZWJkcml2ZXJJTy5Ccm93c2VyIHwgV2ViZHJpdmVySU8uTXVsdGlSZW1vdGVCcm93c2VyLCBpc0Jyb3dzZXJTdGFja1Nlc3Npb24/OiBib29sZWFuLCBpc0FjY2Vzc2liaWxpdHk/OiBib29sZWFuIHwgc3RyaW5nLCAgY29tbWFuZE5hbWU/OiBzdHJpbmcsIHRlc3ROYW1lPzogc3RyaW5nLCBob29rUnVuVXVpZD86IHN0cmluZyB8IG51bGwsIGlzR2xvYmFsSG9vaz86IGJvb2xlYW4sKSA6IFByb21pc2U8eyBba2V5OiBzdHJpbmddOiBhbnk7IH0gfCB1bmRlZmluZWQ+ID0+IHtcblxuICAgIGlmICghaXNBY2Nlc3NpYmlsaXR5QXV0b21hdGlvblNlc3Npb24oaXNBY2Nlc3NpYmlsaXR5KSkge1xuICAgICAgICBCU3RhY2tMb2dnZXIud2FybignTm90IGFuIEFjY2Vzc2liaWxpdHkgQXV0b21hdGlvbiBzZXNzaW9uLCBjYW5ub3QgcGVyZm9ybSBBY2Nlc3NpYmlsaXR5IHNjYW4uJylcbiAgICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgICAgaWYgKGlzQXBwQWNjZXNzaWJpbGl0eUF1dG9tYXRpb25TZXNzaW9uKGlzQWNjZXNzaWJpbGl0eSwgaXNBcHBBdXRvbWF0ZSkpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdHM6IHVua25vd24gPSBhd2FpdCAoYnJvd3NlciBhcyBXZWJkcml2ZXJJTy5Ccm93c2VyKS5leGVjdXRlKGZvcm1hdFN0cmluZyhBY2Nlc3NpYmlsaXR5U2NyaXB0cy5wZXJmb3JtU2NhbiwgSlNPTi5zdHJpbmdpZnkoX2dldFBhcmFtc0ZvckFwcEFjY2Vzc2liaWxpdHkoY29tbWFuZE5hbWUsIHRlc3ROYW1lLCBob29rUnVuVXVpZCwgaXNHbG9iYWxIb29rKSkpIGFzIHN0cmluZywge30pXG4gICAgICAgICAgICBCU3RhY2tMb2dnZXIuZGVidWcodXRpbC5mb3JtYXQocmVzdWx0cyBhcyBzdHJpbmcpKVxuICAgICAgICAgICAgcmV0dXJuICggcmVzdWx0cyBhcyB7IFtrZXk6IHN0cmluZ106IGFueTsgfSB8IHVuZGVmaW5lZCApXG4gICAgICAgIH1cbiAgICAgICAgaWYgKEFjY2Vzc2liaWxpdHlTY3JpcHRzLnBlcmZvcm1TY2FuKSB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgZXhlY3V0ZUFjY2Vzc2liaWxpdHlTY3JpcHQoYnJvd3NlciwgQWNjZXNzaWJpbGl0eVNjcmlwdHMucGVyZm9ybVNjYW4sIHsgbWV0aG9kOiBjb21tYW5kTmFtZSB8fCAnJyB9KVxuICAgICAgICAgICAgcmV0dXJuICggcmVzdWx0cyBhcyB7IFtrZXk6IHN0cmluZ106IHVua25vd247IH0gfCB1bmRlZmluZWQgKVxuICAgICAgICB9XG4gICAgICAgIEJTdGFja0xvZ2dlci5lcnJvcignQWNjZXNzaWJpbGl0eVNjcmlwdHMucGVyZm9ybVNjYW4gaXMgbnVsbCcpXG4gICAgICAgIHJldHVyblxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBCU3RhY2tMb2dnZXIuZXJyb3IoJ0FjY2Vzc2liaWxpdHkgU2NhbiBjb3VsZCBub3QgYmUgcGVyZm9ybWVkIDogJyArIGVycilcbiAgICAgICAgcmV0dXJuXG4gICAgfVxufVxuXG5leHBvcnQgY29uc3QgZ2V0QTExeVJlc3VsdHMgPSBQZXJmb3JtYW5jZVRlc3Rlci5tZWFzdXJlV3JhcHBlcihQRVJGT1JNQU5DRV9TREtfRVZFTlRTLkExMVlfRVZFTlRTLkdFVF9SRVNVTFRTLCBhc3luYyAoaXNBcHBBdXRvbWF0ZTogYm9vbGVhbiwgYnJvd3NlcjogV2ViZHJpdmVySU8uQnJvd3NlciwgaXNCcm93c2VyU3RhY2tTZXNzaW9uPzogYm9vbGVhbiwgaXNBY2Nlc3NpYmlsaXR5PzogYm9vbGVhbiB8IHN0cmluZykgOiBQcm9taXNlPEFycmF5PHsgW2tleTogc3RyaW5nXTogYW55OyB9Pj4gPT4ge1xuXG4gICAgaWYgKCFpc0FjY2Vzc2liaWxpdHlBdXRvbWF0aW9uU2Vzc2lvbihpc0FjY2Vzc2liaWxpdHkpKSB7XG4gICAgICAgIEJTdGFja0xvZ2dlci53YXJuKCdOb3QgYW4gQWNjZXNzaWJpbGl0eSBBdXRvbWF0aW9uIHNlc3Npb24sIGNhbm5vdCByZXRyaWV2ZSBBY2Nlc3NpYmlsaXR5IHJlc3VsdHMuJylcbiAgICAgICAgcmV0dXJuIFtdXG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgICAgQlN0YWNrTG9nZ2VyLmRlYnVnKCdQZXJmb3JtaW5nIHNjYW4gYmVmb3JlIGdldHRpbmcgcmVzdWx0cycpXG4gICAgICAgIGF3YWl0IHBlcmZvcm1BMTF5U2Nhbihpc0FwcEF1dG9tYXRlLCBicm93c2VyLCBpc0Jyb3dzZXJTdGFja1Nlc3Npb24sIGlzQWNjZXNzaWJpbGl0eSlcbiAgICAgICAgaWYgKEFjY2Vzc2liaWxpdHlTY3JpcHRzLmdldFJlc3VsdHMpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdHM6IEFycmF5PHsgW2tleTogc3RyaW5nXTogdW5rbm93biB9PiA9IGF3YWl0IGV4ZWN1dGVBY2Nlc3NpYmlsaXR5U2NyaXB0KGJyb3dzZXIsIEFjY2Vzc2liaWxpdHlTY3JpcHRzLmdldFJlc3VsdHMpXG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0c1xuICAgICAgICB9XG4gICAgICAgIEJTdGFja0xvZ2dlci5lcnJvcignQWNjZXNzaWJpbGl0eVNjcmlwdHMuZ2V0UmVzdWx0cyBpcyBudWxsJylcbiAgICAgICAgcmV0dXJuIFtdXG4gICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgICBCU3RhY2tMb2dnZXIuZXJyb3IoJ05vIGFjY2Vzc2liaWxpdHkgcmVzdWx0cyB3ZXJlIGZvdW5kLicpXG4gICAgICAgIEJTdGFja0xvZ2dlci5kZWJ1ZyhgZ2V0QTExeVJlc3VsdHMgRmFpbGVkLiBFcnJvcjogJHtlcnJvcn1gKVxuICAgICAgICByZXR1cm4gW11cbiAgICB9XG59KVxuXG5leHBvcnQgY29uc3QgZ2V0QXBwQTExeVJlc3VsdHMgPSBQZXJmb3JtYW5jZVRlc3Rlci5tZWFzdXJlV3JhcHBlcihQRVJGT1JNQU5DRV9TREtfRVZFTlRTLkExMVlfRVZFTlRTLkdFVF9SRVNVTFRTLCBhc3luYyAoaXNBcHBBdXRvbWF0ZTogYm9vbGVhbiwgYnJvd3NlcjogV2ViZHJpdmVySU8uQnJvd3NlciwgIHRlc3ROYW1lOiBzdHJpbmcsIGlzQnJvd3NlclN0YWNrU2Vzc2lvbj86IGJvb2xlYW4sIGlzQWNjZXNzaWJpbGl0eT86IGJvb2xlYW4gfCBzdHJpbmcsIHNlc3Npb25JZD86IHN0cmluZyB8IG51bGwpIDogUHJvbWlzZTxBcnJheTx7IFtrZXk6IHN0cmluZ106IGFueTsgfT4+ID0+IHtcbiAgICBpZiAoIWlzQnJvd3NlclN0YWNrU2Vzc2lvbikge1xuICAgICAgICByZXR1cm4gW10gLy8gc2luY2Ugd2UgYXJlIHJ1bm5pbmcgb25seSBvbiBBdXRvbWF0ZSBhcyBvZiBub3dcbiAgICB9XG5cbiAgICBpZiAoIWlzQXBwQWNjZXNzaWJpbGl0eUF1dG9tYXRpb25TZXNzaW9uKGlzQWNjZXNzaWJpbGl0eSwgaXNBcHBBdXRvbWF0ZSkpIHtcbiAgICAgICAgQlN0YWNrTG9nZ2VyLndhcm4oJ05vdCBhbiBBY2Nlc3NpYmlsaXR5IEF1dG9tYXRpb24gc2Vzc2lvbiwgY2Fubm90IHJldHJpZXZlIEFjY2Vzc2liaWxpdHkgcmVzdWx0cyBzdW1tYXJ5LicpXG4gICAgICAgIHJldHVybiBbXVxuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGFwaVVybCA9IGAke0FQSVV0aWxzLkFQUF9BTExZX0VORFBPSU5UfS8ke0FQUF9BTExZX0lTU1VFU19FTkRQT0lOVH1gXG4gICAgICAgIGNvbnN0IGFwaVJlc3BvbmUgPSBhd2FpdCBnZXRBcHBBMTF5UmVzdWx0UmVzcG9uc2UoYXBpVXJsLCBpc0FwcEF1dG9tYXRlLCBicm93c2VyLCB0ZXN0TmFtZSwgaXNCcm93c2VyU3RhY2tTZXNzaW9uLCBpc0FjY2Vzc2liaWxpdHksIHNlc3Npb25JZClcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXBpUmVzcG9uZT8uZGF0YT8uZGF0YT8uaXNzdWVzXG4gICAgICAgIEJTdGFja0xvZ2dlci5kZWJ1ZyhgUG9sbGluZyBSZXN1bHQ6ICR7SlNPTi5zdHJpbmdpZnkocmVzdWx0KX1gKVxuICAgICAgICByZXR1cm4gcmVzdWx0XG4gICAgfSBjYXRjaCAoZXJyb3I6IGFueSkgIHtcbiAgICAgICAgQlN0YWNrTG9nZ2VyLmVycm9yKCdObyBhY2Nlc3NpYmlsaXR5IHN1bW1hcnkgd2FzIGZvdW5kLicpXG4gICAgICAgIEJTdGFja0xvZ2dlci5kZWJ1ZyhgZ2V0QXBwQTExeVJlc3VsdHMgRmFpbGVkLiBFcnJvcjogJHtlcnJvcn1gKVxuICAgICAgICByZXR1cm4gW11cbiAgICB9XG59KVxuXG5leHBvcnQgY29uc3QgZ2V0QXBwQTExeVJlc3VsdHNTdW1tYXJ5ID0gUGVyZm9ybWFuY2VUZXN0ZXIubWVhc3VyZVdyYXBwZXIoUEVSRk9STUFOQ0VfU0RLX0VWRU5UUy5BMTFZX0VWRU5UUy5HRVRfUkVTVUxUU19TVU1NQVJZLCBhc3luYyAoaXNBcHBBdXRvbWF0ZTogYm9vbGVhbiwgYnJvd3NlcjogV2ViZHJpdmVySU8uQnJvd3NlciwgdGVzdE5hbWU6IHN0cmluZywgaXNCcm93c2VyU3RhY2tTZXNzaW9uPzogYm9vbGVhbiwgaXNBY2Nlc3NpYmlsaXR5PzogYm9vbGVhbiB8IHN0cmluZywgc2Vzc2lvbklkPzogc3RyaW5nIHwgbnVsbCkgOiBQcm9taXNlPHsgW2tleTogc3RyaW5nXTogYW55OyB9PiA9PiB7XG4gICAgaWYgKCFpc0Jyb3dzZXJTdGFja1Nlc3Npb24pIHtcbiAgICAgICAgcmV0dXJuIHt9IC8vIHNpbmNlIHdlIGFyZSBydW5uaW5nIG9ubHkgb24gQXV0b21hdGUgYXMgb2Ygbm93XG4gICAgfVxuXG4gICAgaWYgKCFpc0FwcEFjY2Vzc2liaWxpdHlBdXRvbWF0aW9uU2Vzc2lvbihpc0FjY2Vzc2liaWxpdHksIGlzQXBwQXV0b21hdGUpKSB7XG4gICAgICAgIEJTdGFja0xvZ2dlci53YXJuKCdOb3QgYW4gQWNjZXNzaWJpbGl0eSBBdXRvbWF0aW9uIHNlc3Npb24sIGNhbm5vdCByZXRyaWV2ZSBBY2Nlc3NpYmlsaXR5IHJlc3VsdHMgc3VtbWFyeS4nKVxuICAgICAgICByZXR1cm4ge31cbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgICBjb25zdCBhcGlVcmwgPSBgJHtBUElVdGlscy5BUFBfQUxMWV9FTkRQT0lOVH0vJHtBUFBfQUxMWV9JU1NVRVNfU1VNTUFSWV9FTkRQT0lOVH1gXG4gICAgICAgIGNvbnN0IGFwaVJlc3BvbmUgPSBhd2FpdCBnZXRBcHBBMTF5UmVzdWx0UmVzcG9uc2UoYXBpVXJsLCBpc0FwcEF1dG9tYXRlLCBicm93c2VyLCB0ZXN0TmFtZSwgaXNCcm93c2VyU3RhY2tTZXNzaW9uLCBpc0FjY2Vzc2liaWxpdHksIHNlc3Npb25JZClcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXBpUmVzcG9uZT8uZGF0YT8uZGF0YT8uc3VtbWFyeVxuICAgICAgICBCU3RhY2tMb2dnZXIuZGVidWcoYFBvbGxpbmcgUmVzdWx0OiAke0pTT04uc3RyaW5naWZ5KHJlc3VsdCl9YClcbiAgICAgICAgcmV0dXJuIHJlc3VsdFxuICAgIH0gY2F0Y2gge1xuICAgICAgICBCU3RhY2tMb2dnZXIuZXJyb3IoJ05vIGFjY2Vzc2liaWxpdHkgc3VtbWFyeSB3YXMgZm91bmQuJylcbiAgICAgICAgcmV0dXJuIHt9XG4gICAgfVxufSlcblxuY29uc3QgZ2V0QXBwQTExeVJlc3VsdFJlc3BvbnNlID0gYXN5bmMgKGFwaVVybDogc3RyaW5nLCBpc0FwcEF1dG9tYXRlOiBib29sZWFuLCBicm93c2VyOiBXZWJkcml2ZXJJTy5Ccm93c2VyLCB0ZXN0TmFtZTogc3RyaW5nLCBpc0Jyb3dzZXJTdGFja1Nlc3Npb24/OiBib29sZWFuLCBpc0FjY2Vzc2liaWxpdHk/OiBib29sZWFuIHwgc3RyaW5nLCBzZXNzaW9uSWQ/OiBzdHJpbmcgfCBudWxsKSA6IFByb21pc2U8UG9sbGluZ1Jlc3VsdD4gPT4ge1xuICAgIEJTdGFja0xvZ2dlci5kZWJ1ZygnUGVyZm9ybWluZyBzY2FuIGJlZm9yZSBnZXR0aW5nIHJlc3VsdHMgc3VtbWFyeScpXG4gICAgYXdhaXQgcGVyZm9ybUExMXlTY2FuKGlzQXBwQXV0b21hdGUsIGJyb3dzZXIsIGlzQnJvd3NlclN0YWNrU2Vzc2lvbiwgaXNBY2Nlc3NpYmlsaXR5LCB1bmRlZmluZWQsIHRlc3ROYW1lKVxuICAgIGNvbnN0IHVwcGVyVGltZUxpbWl0ID0gcHJvY2Vzcy5lbnYuQlNUQUNLX0ExMVlfUE9MTElOR19USU1FT1VUID8gRGF0ZS5ub3coKSArIHBhcnNlSW50KHByb2Nlc3MuZW52LkJTVEFDS19BMTFZX1BPTExJTkdfVElNRU9VVCkgKiAxMDAwIDogRGF0ZS5ub3coKSArIDMwMDAwXG4gICAgY29uc3QgcGFyYW1zID0geyB0ZXN0X3J1bl91dWlkOiBwcm9jZXNzLmVudi5URVNUX0FOQUxZVElDU19JRCwgc2Vzc2lvbl9pZDogc2Vzc2lvbklkLCB0aW1lc3RhbXA6IERhdGUubm93KCkgfSAvLyBRdWVyeSBwYXJhbXMgdG8gcGFzc1xuICAgIGNvbnN0IGhlYWRlciA9IHsgQXV0aG9yaXphdGlvbjogYEJlYXJlciAke3Byb2Nlc3MuZW52LkJTVEFDS19BMTFZX0pXVH1gIH1cbiAgICBjb25zdCBhcGlSZXNwb25lID0gYXdhaXQgcG9sbEFwaShhcGlVcmwsIHBhcmFtcywgaGVhZGVyLCB1cHBlclRpbWVMaW1pdClcbiAgICBCU3RhY2tMb2dnZXIuZGVidWcoYFBvbGxpbmcgUmVzdWx0OiAke0pTT04uc3RyaW5naWZ5KGFwaVJlc3BvbmUpfWApXG4gICAgcmV0dXJuIGFwaVJlc3BvbmVcbn1cblxuZXhwb3J0IGNvbnN0IGdldEExMXlSZXN1bHRzU3VtbWFyeSA9IFBlcmZvcm1hbmNlVGVzdGVyLm1lYXN1cmVXcmFwcGVyKFBFUkZPUk1BTkNFX1NES19FVkVOVFMuQTExWV9FVkVOVFMuR0VUX1JFU1VMVFNfU1VNTUFSWSwgYXN5bmMgKGlzQXBwQXV0b21hdGU6IGJvb2xlYW4sIGJyb3dzZXI6IFdlYmRyaXZlcklPLkJyb3dzZXIsIGlzQnJvd3NlclN0YWNrU2Vzc2lvbj86IGJvb2xlYW4sIGlzQWNjZXNzaWJpbGl0eT86IGJvb2xlYW4gfCBzdHJpbmcpIDogUHJvbWlzZTx7IFtrZXk6IHN0cmluZ106IGFueTsgfT4gPT4ge1xuXG4gICAgaWYgKCFpc0FjY2Vzc2liaWxpdHlBdXRvbWF0aW9uU2Vzc2lvbihpc0FjY2Vzc2liaWxpdHkpKSB7XG4gICAgICAgIEJTdGFja0xvZ2dlci53YXJuKCdOb3QgYW4gQWNjZXNzaWJpbGl0eSBBdXRvbWF0aW9uIHNlc3Npb24sIGNhbm5vdCByZXRyaWV2ZSBBY2Nlc3NpYmlsaXR5IHJlc3VsdHMgc3VtbWFyeS4nKVxuICAgICAgICByZXR1cm4ge31cbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgICBCU3RhY2tMb2dnZXIuZGVidWcoJ1BlcmZvcm1pbmcgc2NhbiBiZWZvcmUgZ2V0dGluZyByZXN1bHRzIHN1bW1hcnknKVxuICAgICAgICBhd2FpdCBwZXJmb3JtQTExeVNjYW4oaXNBcHBBdXRvbWF0ZSwgYnJvd3NlciwgaXNCcm93c2VyU3RhY2tTZXNzaW9uLCBpc0FjY2Vzc2liaWxpdHkpXG4gICAgICAgIGlmIChBY2Nlc3NpYmlsaXR5U2NyaXB0cy5nZXRSZXN1bHRzU3VtbWFyeSkge1xuICAgICAgICAgICAgY29uc3Qgc3VtbWFyeVJlc3VsdHM6IHsgW2tleTogc3RyaW5nXTogdW5rbm93bjsgfSA9IGF3YWl0IGV4ZWN1dGVBY2Nlc3NpYmlsaXR5U2NyaXB0KGJyb3dzZXIsIEFjY2Vzc2liaWxpdHlTY3JpcHRzLmdldFJlc3VsdHNTdW1tYXJ5KVxuICAgICAgICAgICAgcmV0dXJuIHN1bW1hcnlSZXN1bHRzXG4gICAgICAgIH1cbiAgICAgICAgQlN0YWNrTG9nZ2VyLmVycm9yKCdBY2Nlc3NpYmlsaXR5U2NyaXB0cy5nZXRSZXN1bHRzU3VtbWFyeSBpcyBudWxsJylcbiAgICAgICAgcmV0dXJuIHt9XG4gICAgfSBjYXRjaCB7XG4gICAgICAgIEJTdGFja0xvZ2dlci5lcnJvcignTm8gYWNjZXNzaWJpbGl0eSBzdW1tYXJ5IHdhcyBmb3VuZC4nKVxuICAgICAgICByZXR1cm4ge31cbiAgICB9XG59KVxuXG4vKipcbiAqIFJlbmRlciBhbiBlcnJvciB0b2dldGhlciB3aXRoIGl0cyBgY2F1c2VgIGNoYWluLlxuICpcbiAqIE5vZGUncyBuYXRpdmUgZmV0Y2ggcmVwb3J0cyBldmVyeSB0cmFuc3BvcnQgZmFpbHVyZSBhcyB0aGUgc2FtZSBvcGFxdWVcbiAqIGBUeXBlRXJyb3I6IGZldGNoIGZhaWxlZGA7IHRoZSBhY3Rpb25hYmxlIGRldGFpbCAoRU5PVEZPVU5ELCBFQ09OTlJFU0VULCBhIHByb3h5XG4gKiByZWZ1c2FsKSBvbmx5IGxpdmVzIG9uIGBlcnJvci5jYXVzZWAsIHdoaWNoIHBsYWluIGludGVycG9sYXRpb24gZHJvcHMuIFdpdGhvdXQgdGhpc1xuICogYSBmYWlsZWQgYnVpbGQtc3RvcCBpcyBpbmRpc3Rpbmd1aXNoYWJsZSBmcm9tIGFueSBvdGhlciBuZXR3b3JrIGZhdWx0IGluIHRoZSBsb2dzLlxuICovXG5leHBvcnQgY29uc3QgZGVzY3JpYmVFcnJvcldpdGhDYXVzZSA9IChlcnJvcjogdW5rbm93biwgZGVwdGggPSAzKTogc3RyaW5nID0+IHtcbiAgICBpZiAoZXJyb3IgPT09IG51bGwgfHwgZXJyb3IgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gU3RyaW5nKGVycm9yKVxuICAgIH1cbiAgICBjb25zdCBkZXNjcmliZWQgPSBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gYCR7ZXJyb3IubmFtZX06ICR7ZXJyb3IubWVzc2FnZX1gIDogU3RyaW5nKGVycm9yKVxuICAgIGNvbnN0IGNhdXNlID0gKGVycm9yIGFzIHsgY2F1c2U/OiB1bmtub3duIH0pLmNhdXNlXG4gICAgaWYgKGNhdXNlID09PSBudWxsIHx8IGNhdXNlID09PSB1bmRlZmluZWQgfHwgZGVwdGggPD0gMSkge1xuICAgICAgICByZXR1cm4gZGVzY3JpYmVkXG4gICAgfVxuICAgIHJldHVybiBgJHtkZXNjcmliZWR9IDwtIGNhdXNlZCBieSAke2Rlc2NyaWJlRXJyb3JXaXRoQ2F1c2UoY2F1c2UsIGRlcHRoIC0gMSl9YFxufVxuXG5leHBvcnQgY29uc3Qgc3RvcEJ1aWxkVXBzdHJlYW0gPSBQZXJmb3JtYW5jZVRlc3Rlci5tZWFzdXJlV3JhcHBlcihQRVJGT1JNQU5DRV9TREtfRVZFTlRTLlRFU1RIVUJfRVZFTlRTLlNUT1AsIG8xMXlFcnJvckhhbmRsZXIoYXN5bmMgZnVuY3Rpb24gc3RvcEJ1aWxkVXBzdHJlYW0oKSB7XG4gICAgY29uc3Qgc3RvcEJ1aWxkVXNhZ2UgPSBVc2FnZVN0YXRzLmdldEluc3RhbmNlKCkuc3RvcEJ1aWxkVXNhZ2VcbiAgICBzdG9wQnVpbGRVc2FnZS50cmlnZ2VyZWQoKVxuICAgIGlmICghcHJvY2Vzcy5lbnZbVEVTVE9QU19CVUlMRF9DT01QTEVURURfRU5WXSkge1xuICAgICAgICBzdG9wQnVpbGRVc2FnZS5mYWlsZWQoJ0J1aWxkIGlzIG5vdCBjb21wbGV0ZWQgeWV0JylcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHN0YXR1czogJ2Vycm9yJyxcbiAgICAgICAgICAgIG1lc3NhZ2U6ICdCdWlsZCBpcyBub3QgY29tcGxldGVkIHlldCdcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGlmICghcHJvY2Vzcy5lbnZbQlJPV1NFUlNUQUNLX1RFU1RIVUJfSldUXSkge1xuICAgICAgICBzdG9wQnVpbGRVc2FnZS5mYWlsZWQoJ1Rva2VuL2J1aWxkSUQgaXMgdW5kZWZpbmVkLCBidWlsZCBjcmVhdGlvbiBtaWdodCBoYXZlIGZhaWxlZCcpXG4gICAgICAgIEJTdGFja0xvZ2dlci5kZWJ1ZygnW1NUT1BfQlVJTERdIE1pc3NpbmcgQXV0aGVudGljYXRpb24gVG9rZW4vIEJ1aWxkIElEJylcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHN0YXR1czogJ2Vycm9yJyxcbiAgICAgICAgICAgIG1lc3NhZ2U6ICdUb2tlbi9idWlsZElEIGlzIHVuZGVmaW5lZCwgYnVpbGQgY3JlYXRpb24gbWlnaHQgaGF2ZSBmYWlsZWQnXG4gICAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgZGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7XG4gICAgICAgICdzdG9wX3RpbWUnOiAobmV3IERhdGUoKSkudG9JU09TdHJpbmcoKVxuICAgIH1cbiAgICAvLyBTdGFtcCB0aGUga2lsbCByZWFzb24gb250byB0aGUgYnVpbGQgcmVjb3JkIHNvIHRlcm1pbmF0ZWQgcnVucyBhcmVcbiAgICAvLyBpZGVudGlmaWFibGUgc2VydmVyLXNpZGUsIG5vdCBvbmx5IHZpYSB0aGUgYW5hbHl0aWNzIGZ1bm5lbC5cbiAgICBjb25zdCBraWxsU2lnbmFsID0gcHJvY2Vzcy5lbnZbQlJPV1NFUlNUQUNLX0tJTExfU0lHTkFMXVxuICAgIGlmIChraWxsU2lnbmFsKSB7XG4gICAgICAgIGRhdGEuZmluaXNoZWRfbWV0YWRhdGEgPSBbeyByZWFzb246ICd1c2VyX2tpbGxlZCcsIHNpZ25hbDoga2lsbFNpZ25hbCB9XVxuICAgIH1cblxuICAgIGNvbnN0IHVybCA9IGAke0FQSVV0aWxzLkRBVEFfRU5EUE9JTlR9L2FwaS92MS9idWlsZHMvJHtwcm9jZXNzLmVudltCUk9XU0VSU1RBQ0tfVEVTVEhVQl9VVUlEXX0vc3RvcGBcbiAgICAvLyBTREstNzA2MTogdGhlIGJ1aWxkLXN0b3AgUFVUIGlzIHRoZSBzaWduYWwgdGhhdCBjbG9zZXMgdGhlIFRSQSBidWlsZC4gQSBzaW5nbGVcbiAgICAvLyBiZXN0LWVmZm9ydCByZXF1ZXN0IG1lYW5zIGEgdHJhbnNpZW50IGZhaWx1cmUvdGltZW91dCBsZWF2ZXMgdGhlIGJ1aWxkIHJ1bm5pbmdcbiAgICAvLyB1bnRpbCB0aGUgfjYwLW1pbiBzZXJ2ZXItc2lkZSBpbmFjdGl2aXR5IHRpbWVvdXQuIFJldHJ5IHdpdGggYmFja29mZiBhbmQgdHJlYXQgYVxuICAgIC8vIG5vbi0yeHggcmVzcG9uc2UgYXMgYSBmYWlsdXJlIHNvIHRoZSBidWlsZCByZWxpYWJseSByZWFjaGVzIGEgdGVybWluYWwgc3RhdGUuXG4gICAgLy8gU0RLLTcyMjk6IGEgY29ycG9yYXRlIEROUy9wcm94eSBibGlwIHJvdXRpbmVseSBvdXRsYXN0cyBhIHN1Yi1zZWNvbmQgcmV0cnkgd2luZG93LFxuICAgIC8vIGFuZCB0aGUgcmVxdWVzdCBoYWQgbm8gdGltZW91dCBhdCBhbGwsIHNvIGEgaHVuZyBjb25uZWN0aW9uIGNvdWxkIHN0YWxsIHNodXRkb3duXG4gICAgLy8gaW5kZWZpbml0ZWx5LiBFYWNoIGF0dGVtcHQgaXMgbm93IGluZGl2aWR1YWxseSBib3VuZGVkLCBhbmQgdGhlIHJldHJ5IGxvb3AgYXMgYVxuICAgIC8vIHdob2xlIGlzIGNhcHBlZCBieSBhIHdhbGwtY2xvY2sgZGVhZGxpbmUgKHRoaXMgcnVucyBkdXJpbmcgc2h1dGRvd24pLlxuICAgIGNvbnN0IGRlYWRsaW5lID0gRGF0ZS5ub3coKSArIFNUT1BfQlVJTERfVE9UQUxfQlVER0VUX01TXG4gICAgbGV0IGxhc3RFcnJvcjogdW5rbm93blxuICAgIGxldCBhdHRlbXB0cyA9IDBcbiAgICBmb3IgKGxldCBhdHRlbXB0ID0gMTsgYXR0ZW1wdCA8PSBTVE9QX0JVSUxEX01BWF9BVFRFTVBUUzsgYXR0ZW1wdCsrKSB7XG4gICAgICAgIGNvbnN0IGJ1ZGdldExlZnQgPSBkZWFkbGluZSAtIERhdGUubm93KClcbiAgICAgICAgaWYgKGJ1ZGdldExlZnQgPD0gMCkge1xuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgICAgICBhdHRlbXB0cyA9IGF0dGVtcHRcbiAgICAgICAgY29uc3QgY29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKVxuICAgICAgICBjb25zdCB0aW1lb3V0SWQgPSBzZXRUaW1lb3V0KCgpID0+IGNvbnRyb2xsZXIuYWJvcnQoKSwgTWF0aC5taW4oU1RPUF9CVUlMRF9BVFRFTVBUX1RJTUVPVVRfTVMsIGJ1ZGdldExlZnQpKVxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh1cmwsIHtcbiAgICAgICAgICAgICAgICBtZXRob2Q6ICdQVVQnLFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgICAgICAgICAgLi4uREVGQVVMVF9SRVFVRVNUX0NPTkZJRy5oZWFkZXJzLFxuICAgICAgICAgICAgICAgICAgICAnQXV0aG9yaXphdGlvbic6IGBCZWFyZXIgJHtwcm9jZXNzLmVudltCUk9XU0VSU1RBQ0tfVEVTVEhVQl9KV1RdfWBcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KGRhdGEpLFxuICAgICAgICAgICAgICAgIHNpZ25hbDogY29udHJvbGxlci5zaWduYWxcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBIVFRQICR7cmVzcG9uc2Uuc3RhdHVzfSAke3Jlc3BvbnNlLnN0YXR1c1RleHR9YClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIEJTdGFja0xvZ2dlci5kZWJ1ZyhgW1NUT1BfQlVJTERdIFN1Y2Nlc3MgcmVzcG9uc2U6ICR7YXdhaXQgcmVzcG9uc2UudGV4dCgpfWApXG4gICAgICAgICAgICBzdG9wQnVpbGRVc2FnZS5zdWNjZXNzKClcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgc3RhdHVzOiAnc3VjY2VzcycsXG4gICAgICAgICAgICAgICAgbWVzc2FnZTogJydcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgICAgICAgIC8vIEFuIGFib3J0ZWQgYXR0ZW1wdCBzdXJmYWNlcyBhcyBhIGdlbmVyaWMgQWJvcnRFcnJvcjsgbmFtZSB0aGUgcmVhbCByZWFzb24gc29cbiAgICAgICAgICAgIC8vIGEgc2xvdyBlbmRwb2ludCBpcyBub3QgbWlzdGFrZW4gZm9yIGFuIG91dHJpZ2h0IHRyYW5zcG9ydCBmYWlsdXJlLlxuICAgICAgICAgICAgbGFzdEVycm9yID0gY29udHJvbGxlci5zaWduYWwuYWJvcnRlZFxuICAgICAgICAgICAgICAgID8gbmV3IEVycm9yKGBidWlsZCBzdG9wIHJlcXVlc3QgdGltZWQgb3V0IGFmdGVyICR7TWF0aC5taW4oU1RPUF9CVUlMRF9BVFRFTVBUX1RJTUVPVVRfTVMsIGJ1ZGdldExlZnQpfW1zYClcbiAgICAgICAgICAgICAgICA6IGVycm9yXG4gICAgICAgICAgICBCU3RhY2tMb2dnZXIuZGVidWcoYFtTVE9QX0JVSUxEXSBBdHRlbXB0ICR7YXR0ZW1wdH0vJHtTVE9QX0JVSUxEX01BWF9BVFRFTVBUU30gZmFpbGVkLiBFcnJvcjogJHtkZXNjcmliZUVycm9yV2l0aENhdXNlKGxhc3RFcnJvcil9YClcbiAgICAgICAgICAgIGNvbnN0IGJhY2tvZmYgPSBTVE9QX0JVSUxEX0JBQ0tPRkZfQkFTRV9NUyAqIE1hdGgucG93KDIsIGF0dGVtcHQgLSAxKVxuICAgICAgICAgICAgaWYgKGF0dGVtcHQgPj0gU1RPUF9CVUlMRF9NQVhfQVRURU1QVFMgfHwgRGF0ZS5ub3coKSArIGJhY2tvZmYgPj0gZGVhZGxpbmUpIHtcbiAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgYmFja29mZikpXG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICBjbGVhclRpbWVvdXQodGltZW91dElkKVxuICAgICAgICB9XG4gICAgfVxuICAgIHN0b3BCdWlsZFVzYWdlLmZhaWxlZChsYXN0RXJyb3IpXG4gICAgQlN0YWNrTG9nZ2VyLmRlYnVnKGBbU1RPUF9CVUlMRF0gRmFpbGVkIGFmdGVyICR7YXR0ZW1wdHN9IGF0dGVtcHQocykuIEVycm9yOiAke2Rlc2NyaWJlRXJyb3JXaXRoQ2F1c2UobGFzdEVycm9yKX1gKVxuICAgIHJldHVybiB7XG4gICAgICAgIHN0YXR1czogJ2Vycm9yJyxcbiAgICAgICAgbWVzc2FnZTogKGxhc3RFcnJvciBhcyBFcnJvcik/Lm1lc3NhZ2UgPz8gJ3N0b3AgYnVpbGQgZmFpbGVkJ1xuICAgIH1cbn0pKVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q2lJbmZvICgpIHtcbiAgICBjb25zdCBlbnYgPSBwcm9jZXNzLmVudlxuICAgIC8vIEplbmtpbnNcbiAgICBpZiAoKHR5cGVvZiBlbnYuSkVOS0lOU19VUkwgPT09ICdzdHJpbmcnICYmIGVudi5KRU5LSU5TX1VSTC5sZW5ndGggPiAwKSB8fCAodHlwZW9mIGVudi5KRU5LSU5TX0hPTUUgPT09ICdzdHJpbmcnICYmIGVudi5KRU5LSU5TX0hPTUUubGVuZ3RoID4gMCkpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG5hbWU6ICdKZW5raW5zJyxcbiAgICAgICAgICAgIGJ1aWxkX3VybDogZW52LkJVSUxEX1VSTCxcbiAgICAgICAgICAgIGpvYl9uYW1lOiBlbnYuSk9CX05BTUUsXG4gICAgICAgICAgICBidWlsZF9udW1iZXI6IGVudi5CVUlMRF9OVU1CRVJcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBDaXJjbGVDSVxuICAgIGlmIChpc1RydWUoZW52LkNJKSAmJiBpc1RydWUoZW52LkNJUkNMRUNJKSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbmFtZTogJ0NpcmNsZUNJJyxcbiAgICAgICAgICAgIGJ1aWxkX3VybDogZW52LkNJUkNMRV9CVUlMRF9VUkwsXG4gICAgICAgICAgICBqb2JfbmFtZTogZW52LkNJUkNMRV9KT0IsXG4gICAgICAgICAgICBidWlsZF9udW1iZXI6IGVudi5DSVJDTEVfQlVJTERfTlVNXG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gVHJhdmlzIENJXG4gICAgaWYgKGlzVHJ1ZShlbnYuQ0kpICYmIGlzVHJ1ZShlbnYuVFJBVklTKSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbmFtZTogJ1RyYXZpcyBDSScsXG4gICAgICAgICAgICBidWlsZF91cmw6IGVudi5UUkFWSVNfQlVJTERfV0VCX1VSTCxcbiAgICAgICAgICAgIGpvYl9uYW1lOiBlbnYuVFJBVklTX0pPQl9OQU1FLFxuICAgICAgICAgICAgYnVpbGRfbnVtYmVyOiBlbnYuVFJBVklTX0JVSUxEX05VTUJFUlxuICAgICAgICB9XG4gICAgfVxuICAgIC8vIENvZGVzaGlwXG4gICAgaWYgKGlzVHJ1ZShlbnYuQ0kpICYmIGVudi5DSV9OQU1FID09PSAnY29kZXNoaXAnKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBuYW1lOiAnQ29kZXNoaXAnLFxuICAgICAgICAgICAgYnVpbGRfdXJsOiBudWxsLFxuICAgICAgICAgICAgam9iX25hbWU6IG51bGwsXG4gICAgICAgICAgICBidWlsZF9udW1iZXI6IG51bGxcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBCaXRidWNrZXRcbiAgICBpZiAoZW52LkJJVEJVQ0tFVF9CUkFOQ0ggJiYgZW52LkJJVEJVQ0tFVF9DT01NSVQpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG5hbWU6ICdCaXRidWNrZXQnLFxuICAgICAgICAgICAgYnVpbGRfdXJsOiBlbnYuQklUQlVDS0VUX0dJVF9IVFRQX09SSUdJTixcbiAgICAgICAgICAgIGpvYl9uYW1lOiBudWxsLFxuICAgICAgICAgICAgYnVpbGRfbnVtYmVyOiBlbnYuQklUQlVDS0VUX0JVSUxEX05VTUJFUlxuICAgICAgICB9XG4gICAgfVxuICAgIC8vIERyb25lXG4gICAgaWYgKGlzVHJ1ZShlbnYuQ0kpICYmIGlzVHJ1ZShlbnYuRFJPTkUpKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBuYW1lOiAnRHJvbmUnLFxuICAgICAgICAgICAgYnVpbGRfdXJsOiBlbnYuRFJPTkVfQlVJTERfTElOSyxcbiAgICAgICAgICAgIGpvYl9uYW1lOiBudWxsLFxuICAgICAgICAgICAgYnVpbGRfbnVtYmVyOiBlbnYuRFJPTkVfQlVJTERfTlVNQkVSXG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gU2VtYXBob3JlXG4gICAgaWYgKGlzVHJ1ZShlbnYuQ0kpICYmIGlzVHJ1ZShlbnYuU0VNQVBIT1JFKSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbmFtZTogJ1NlbWFwaG9yZScsXG4gICAgICAgICAgICBidWlsZF91cmw6IGVudi5TRU1BUEhPUkVfT1JHQU5JWkFUSU9OX1VSTCxcbiAgICAgICAgICAgIGpvYl9uYW1lOiBlbnYuU0VNQVBIT1JFX0pPQl9OQU1FLFxuICAgICAgICAgICAgYnVpbGRfbnVtYmVyOiBlbnYuU0VNQVBIT1JFX0pPQl9JRFxuICAgICAgICB9XG4gICAgfVxuICAgIC8vIEdpdExhYlxuICAgIGlmIChpc1RydWUoZW52LkNJKSAmJiBpc1RydWUoZW52LkdJVExBQl9DSSkpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG5hbWU6ICdHaXRMYWInLFxuICAgICAgICAgICAgYnVpbGRfdXJsOiBlbnYuQ0lfSk9CX1VSTCxcbiAgICAgICAgICAgIGpvYl9uYW1lOiBlbnYuQ0lfSk9CX05BTUUsXG4gICAgICAgICAgICBidWlsZF9udW1iZXI6IGVudi5DSV9KT0JfSURcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBCdWlsZGtpdGVcbiAgICBpZiAoaXNUcnVlKGVudi5DSSkgJiYgaXNUcnVlKGVudi5CVUlMREtJVEUpKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBuYW1lOiAnQnVpbGRraXRlJyxcbiAgICAgICAgICAgIGJ1aWxkX3VybDogZW52LkJVSUxES0lURV9CVUlMRF9VUkwsXG4gICAgICAgICAgICBqb2JfbmFtZTogZW52LkJVSUxES0lURV9MQUJFTCB8fCBlbnYuQlVJTERLSVRFX1BJUEVMSU5FX05BTUUsXG4gICAgICAgICAgICBidWlsZF9udW1iZXI6IGVudi5CVUlMREtJVEVfQlVJTERfTlVNQkVSXG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gVmlzdWFsIFN0dWRpbyBUZWFtIFNlcnZpY2VzXG4gICAgaWYgKGlzVHJ1ZShlbnYuVEZfQlVJTEQpICYmIGVudi5URl9CVUlMRF9CVUlMRE5VTUJFUikge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbmFtZTogJ1Zpc3VhbCBTdHVkaW8gVGVhbSBTZXJ2aWNlcycsXG4gICAgICAgICAgICBidWlsZF91cmw6IGAke2Vudi5TWVNURU1fVEVBTUZPVU5EQVRJT05TRVJWRVJVUkl9JHtlbnYuU1lTVEVNX1RFQU1QUk9KRUNUSUR9YCxcbiAgICAgICAgICAgIGpvYl9uYW1lOiBlbnYuU1lTVEVNX0RFRklOSVRJT05JRCxcbiAgICAgICAgICAgIGJ1aWxkX251bWJlcjogZW52LkJVSUxEX0JVSUxESURcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBBcHB2ZXlvclxuICAgIGlmIChpc1RydWUoZW52LkFQUFZFWU9SKSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbmFtZTogJ0FwcHZleW9yJyxcbiAgICAgICAgICAgIGJ1aWxkX3VybDogYCR7ZW52LkFQUFZFWU9SX1VSTH0vcHJvamVjdC8ke2Vudi5BUFBWRVlPUl9BQ0NPVU5UX05BTUV9LyR7ZW52LkFQUFZFWU9SX1BST0pFQ1RfU0xVR30vYnVpbGRzLyR7ZW52LkFQUFZFWU9SX0JVSUxEX0lEfWAsXG4gICAgICAgICAgICBqb2JfbmFtZTogZW52LkFQUFZFWU9SX0pPQl9OQU1FLFxuICAgICAgICAgICAgYnVpbGRfbnVtYmVyOiBlbnYuQVBQVkVZT1JfQlVJTERfTlVNQkVSXG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gQXp1cmUgQ0lcbiAgICBpZiAoZW52LkFaVVJFX0hUVFBfVVNFUl9BR0VOVCAmJiBlbnYuVEZfQlVJTEQpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG5hbWU6ICdBenVyZSBDSScsXG4gICAgICAgICAgICBidWlsZF91cmw6IGAke2Vudi5TWVNURU1fVEVBTUZPVU5EQVRJT05TRVJWRVJVUkl9JHtlbnYuU1lTVEVNX1RFQU1QUk9KRUNUSUR9YCxcbiAgICAgICAgICAgIGpvYl9uYW1lOiBlbnYuQlVJTERfQlVJTERJRCxcbiAgICAgICAgICAgIGJ1aWxkX251bWJlcjogZW52LkJVSUxEX0JVSUxESURcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBBV1MgQ29kZUJ1aWxkXG4gICAgaWYgKGVudi5DT0RFQlVJTERfQlVJTERfSUQgfHwgZW52LkNPREVCVUlMRF9SRVNPTFZFRF9TT1VSQ0VfVkVSU0lPTiB8fCBlbnYuQ09ERUJVSUxEX1NPVVJDRV9WRVJTSU9OKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBuYW1lOiAnQVdTIENvZGVCdWlsZCcsXG4gICAgICAgICAgICBidWlsZF91cmw6IGVudi5DT0RFQlVJTERfUFVCTElDX0JVSUxEX1VSTCxcbiAgICAgICAgICAgIGpvYl9uYW1lOiBlbnYuQ09ERUJVSUxEX0JVSUxEX0lELFxuICAgICAgICAgICAgYnVpbGRfbnVtYmVyOiBlbnYuQ09ERUJVSUxEX0JVSUxEX0lEXG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gQmFtYm9vXG4gICAgaWYgKGVudi5iYW1ib29fYnVpbGROdW1iZXIpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG5hbWU6ICdCYW1ib28nLFxuICAgICAgICAgICAgYnVpbGRfdXJsOiBlbnYuYmFtYm9vX2J1aWxkUmVzdWx0c1VybCxcbiAgICAgICAgICAgIGpvYl9uYW1lOiBlbnYuYmFtYm9vX3Nob3J0Sm9iTmFtZSxcbiAgICAgICAgICAgIGJ1aWxkX251bWJlcjogZW52LmJhbWJvb19idWlsZE51bWJlclxuICAgICAgICB9XG4gICAgfVxuICAgIC8vIFdlcmNrZXJcbiAgICBpZiAoZW52LldFUkNLRVIgfHwgZW52LldFUkNLRVJfTUFJTl9QSVBFTElORV9TVEFSVEVEKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBuYW1lOiAnV2VyY2tlcicsXG4gICAgICAgICAgICBidWlsZF91cmw6IGVudi5XRVJDS0VSX0JVSUxEX1VSTCxcbiAgICAgICAgICAgIGpvYl9uYW1lOiBlbnYuV0VSQ0tFUl9NQUlOX1BJUEVMSU5FX1NUQVJURUQgPyAnTWFpbiBQaXBlbGluZScgOiBudWxsLFxuICAgICAgICAgICAgYnVpbGRfbnVtYmVyOiBlbnYuV0VSQ0tFUl9HSVRfQ09NTUlUXG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gR29vZ2xlIENsb3VkXG4gICAgaWYgKGVudi5HQ1BfUFJPSkVDVCB8fCBlbnYuR0NMT1VEX1BST0pFQ1QgfHwgZW52LkdPT0dMRV9DTE9VRF9QUk9KRUNUKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBuYW1lOiAnR29vZ2xlIENsb3VkJyxcbiAgICAgICAgICAgIGJ1aWxkX3VybDogbnVsbCxcbiAgICAgICAgICAgIGpvYl9uYW1lOiBlbnYuUFJPSkVDVF9JRCxcbiAgICAgICAgICAgIGJ1aWxkX251bWJlcjogZW52LkJVSUxEX0lELFxuICAgICAgICB9XG4gICAgfVxuICAgIC8vIFNoaXBwYWJsZVxuICAgIGlmIChlbnYuU0hJUFBBQkxFKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBuYW1lOiAnU2hpcHBhYmxlJyxcbiAgICAgICAgICAgIGJ1aWxkX3VybDogZW52LlNISVBQQUJMRV9CVUlMRF9VUkwsXG4gICAgICAgICAgICBqb2JfbmFtZTogZW52LlNISVBQQUJMRV9KT0JfSUQgPyBgSm9iICMke2Vudi5TSElQUEFCTEVfSk9CX0lEfWAgOiBudWxsLFxuICAgICAgICAgICAgYnVpbGRfbnVtYmVyOiBlbnYuU0hJUFBBQkxFX0JVSUxEX05VTUJFUlxuICAgICAgICB9XG4gICAgfVxuICAgIC8vIE5ldGxpZnlcbiAgICBpZiAoaXNUcnVlKGVudi5ORVRMSUZZKSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbmFtZTogJ05ldGxpZnknLFxuICAgICAgICAgICAgYnVpbGRfdXJsOiBlbnYuREVQTE9ZX1VSTCxcbiAgICAgICAgICAgIGpvYl9uYW1lOiBlbnYuU0lURV9OQU1FLFxuICAgICAgICAgICAgYnVpbGRfbnVtYmVyOiBlbnYuQlVJTERfSURcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBHaXRodWIgQWN0aW9uc1xuICAgIGlmIChpc1RydWUoZW52LkdJVEhVQl9BQ1RJT05TKSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbmFtZTogJ0dpdEh1YiBBY3Rpb25zJyxcbiAgICAgICAgICAgIGJ1aWxkX3VybDogYCR7ZW52LkdJVEhVQl9TRVJWRVJfVVJMfS8ke2Vudi5HSVRIVUJfUkVQT1NJVE9SWX0vYWN0aW9ucy9ydW5zLyR7ZW52LkdJVEhVQl9SVU5fSUR9YCxcbiAgICAgICAgICAgIGpvYl9uYW1lOiBlbnYuR0lUSFVCX1dPUktGTE9XLFxuICAgICAgICAgICAgYnVpbGRfbnVtYmVyOiBlbnYuR0lUSFVCX1JVTl9JRCxcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBWZXJjZWxcbiAgICBpZiAoaXNUcnVlKGVudi5DSSkgJiYgZW52LlZFUkNFTCA9PT0gJzEnKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBuYW1lOiAnVmVyY2VsJyxcbiAgICAgICAgICAgIGJ1aWxkX3VybDogYGh0dHA6Ly8ke2Vudi5WRVJDRUxfVVJMfWAsXG4gICAgICAgICAgICBqb2JfbmFtZTogbnVsbCxcbiAgICAgICAgICAgIGJ1aWxkX251bWJlcjogbnVsbCxcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBUZWFtY2l0eVxuICAgIGlmIChlbnYuVEVBTUNJVFlfVkVSU0lPTikge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbmFtZTogJ1RlYW1jaXR5JyxcbiAgICAgICAgICAgIGJ1aWxkX3VybDogbnVsbCxcbiAgICAgICAgICAgIGpvYl9uYW1lOiBudWxsLFxuICAgICAgICAgICAgYnVpbGRfbnVtYmVyOiBlbnYuQlVJTERfTlVNQkVSLFxuICAgICAgICB9XG4gICAgfVxuICAgIC8vIENvbmNvdXJzZVxuICAgIGlmIChlbnYuQ09OQ09VUlNFIHx8IGVudi5DT05DT1VSU0VfVVJMIHx8IGVudi5DT05DT1VSU0VfVVNFUk5BTUUgfHwgZW52LkNPTkNPVVJTRV9URUFNKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBuYW1lOiAnQ29uY291cnNlJyxcbiAgICAgICAgICAgIGJ1aWxkX3VybDogbnVsbCxcbiAgICAgICAgICAgIGpvYl9uYW1lOiBlbnYuQlVJTERfSk9CX05BTUUgfHwgbnVsbCxcbiAgICAgICAgICAgIGJ1aWxkX251bWJlcjogZW52LkJVSUxEX0lEIHx8IG51bGwsXG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gR29DRFxuICAgIGlmIChlbnYuR09fSk9CX05BTUUpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG5hbWU6ICdHb0NEJyxcbiAgICAgICAgICAgIGJ1aWxkX3VybDogbnVsbCxcbiAgICAgICAgICAgIGpvYl9uYW1lOiBlbnYuR09fSk9CX05BTUUsXG4gICAgICAgICAgICBidWlsZF9udW1iZXI6IGVudi5HT19QSVBFTElORV9DT1VOVEVSLFxuICAgICAgICB9XG4gICAgfVxuICAgIC8vIENvZGVGcmVzaFxuICAgIGlmIChlbnYuQ0ZfQlVJTERfSUQpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG5hbWU6ICdDb2RlRnJlc2gnLFxuICAgICAgICAgICAgYnVpbGRfdXJsOiBlbnYuQ0ZfQlVJTERfVVJMLFxuICAgICAgICAgICAgam9iX25hbWU6IGVudi5DRl9QSVBFTElORV9OQU1FLFxuICAgICAgICAgICAgYnVpbGRfbnVtYmVyOiBlbnYuQ0ZfQlVJTERfSUQsXG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gaWYgbm8gbWF0Y2hlcywgcmV0dXJuIG51bGxcbiAgICByZXR1cm4gbnVsbFxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0R2l0TWV0YURhdGEgKCkge1xuICAgIGNvbnN0IGluZm86IEdpdFJlcG9JbmZvID0gZ2l0UmVwb0luZm8oKVxuICAgIGlmICghaW5mby5jb21tb25HaXREaXIpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGNvbnN0IHsgcmVtb3RlIH0gPSBhd2FpdCBwR2l0Y29uZmlnKGluZm8uY29tbW9uR2l0RGlyKVxuICAgIGNvbnN0IHJlbW90ZXMgPSByZW1vdGUgPyBPYmplY3Qua2V5cyhyZW1vdGUpLm1hcChyZW1vdGVOYW1lID0+ICAoeyBuYW1lOiByZW1vdGVOYW1lLCB1cmw6IHJlbW90ZVtyZW1vdGVOYW1lXS51cmwgfSkpIDogW11cblxuICAgIGxldCBnaXRNZXRhRGF0YSA6IEdpdE1ldGFEYXRhID0ge1xuICAgICAgICBuYW1lOiAnZ2l0JyxcbiAgICAgICAgc2hhOiBpbmZvLnNoYSxcbiAgICAgICAgc2hvcnRfc2hhOiBpbmZvLmFiYnJldmlhdGVkU2hhLFxuICAgICAgICBicmFuY2g6IGluZm8uYnJhbmNoLFxuICAgICAgICB0YWc6IGluZm8udGFnLFxuICAgICAgICBjb21taXR0ZXI6IGluZm8uY29tbWl0dGVyLFxuICAgICAgICBjb21taXR0ZXJfZGF0ZTogaW5mby5jb21taXR0ZXJEYXRlLFxuICAgICAgICBhdXRob3I6IGluZm8uYXV0aG9yLFxuICAgICAgICBhdXRob3JfZGF0ZTogaW5mby5hdXRob3JEYXRlLFxuICAgICAgICBjb21taXRfbWVzc2FnZTogaW5mby5jb21taXRNZXNzYWdlLFxuICAgICAgICByb290OiBpbmZvLnJvb3QsXG4gICAgICAgIGNvbW1vbl9naXRfZGlyOiBpbmZvLmNvbW1vbkdpdERpcixcbiAgICAgICAgd29ya3RyZWVfZ2l0X2RpcjogaW5mby53b3JrdHJlZUdpdERpcixcbiAgICAgICAgbGFzdF90YWc6IGluZm8ubGFzdFRhZyxcbiAgICAgICAgY29tbWl0c19zaW5jZV9sYXN0X3RhZzogaW5mby5jb21taXRzU2luY2VMYXN0VGFnLFxuICAgICAgICByZW1vdGVzOiByZW1vdGVzXG4gICAgfVxuXG4gICAgZ2l0TWV0YURhdGEgPSBjaGVja0FuZFRydW5jYXRlVkNTSW5mbyhnaXRNZXRhRGF0YSlcblxuICAgIHJldHVybiBnaXRNZXRhRGF0YVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0VW5pcXVlSWRlbnRpZmllcih0ZXN0OiBGcmFtZXdvcmtzLlRlc3QsIGZyYW1ld29yaz86IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKGZyYW1ld29yayA9PT0gJ2phc21pbmUnKSB7XG4gICAgICAgIHJldHVybiB0ZXN0LmZ1bGxOYW1lXG4gICAgfVxuXG4gICAgbGV0IHBhcmVudFRpdGxlID0gdGVzdC5wYXJlbnRcbiAgICAvLyBTb21ldGltZXMgcGFyZW50IHdpbGwgYmUgYW4gb2JqZWN0IGluc3RlYWQgb2YgYSBzdHJpbmdcbiAgICBpZiAodHlwZW9mIHBhcmVudFRpdGxlID09PSAnb2JqZWN0Jykge1xuICAgICAgICBwYXJlbnRUaXRsZSA9IChwYXJlbnRUaXRsZSBhcyB7IHRpdGxlOiBzdHJpbmcgfSkudGl0bGVcbiAgICB9XG4gICAgcmV0dXJuIGAke3BhcmVudFRpdGxlfSAtICR7dGVzdC50aXRsZX1gXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRVbmlxdWVJZGVudGlmaWVyRm9yQ3VjdW1iZXIod29ybGQ6IElUZXN0Q2FzZUhvb2tQYXJhbWV0ZXIpOiBzdHJpbmcge1xuICAgIHJldHVybiB3b3JsZC5waWNrbGUudXJpICsgJ18nICsgd29ybGQucGlja2xlLmFzdE5vZGVJZHMuam9pbignLCcpXG59XG5cbi8vIExvYWQgVGVzdGluZyBTZXJ2aWNlIChMVFMpIGdhdGluZyBoZWxwZXJzIFx1MjAxNCBtaXJyb3Igb2YgYnN0YWNrX3V0aWxzL2hlbHBlci5weVxuLy8gaXNfbG9hZF90ZXN0aW5nX3Nlc3Npb24oKSAvIGdldF9sdHNfc2Vzc2lvbl9pZCgpIGluIGJyb3dzZXJzdGFjay1weXRob24tc2RrXG4vLyAoYnJhbmNoIExUUy10cmEtcHl0aG9uLXN1cHBvcnQpLiBMVFMgcG9kLWl0ZXJhdGlvbnMgZXhwb3J0XG4vLyBCUk9XU0VSU1RBQ0tfTFRTX1NFU1NJT05fSUQgYmVmb3JlIGludm9raW5nIHRoZSB0ZXN0IHJ1bm5lcjsgcHJlc2VuY2Ugb2Zcbi8vIHRoYXQgZW52IHZhciBpcyB0aGUgc2luZ2xlIHNvdXJjZSBvZiB0cnV0aCBmb3IgXCJ0aGlzIHJ1biBpcyBhbiBMVFMgcG9kXG4vLyBpdGVyYXRpb25cIi4gT3B0aW9uYWwgQlJPV1NFUlNUQUNLX0xUUz10cnVlfDEgbGV0cyB0aGUgcnVubmVyIG9wdC1pbiB3aXRob3V0XG4vLyBzdXBwbHlpbmcgYSBzZXNzaW9uIGlkICh1c2VmdWwgZm9yIGxvY2FsIHJlcHJvKS5cbmV4cG9ydCBmdW5jdGlvbiBpc0xvYWRUZXN0aW5nU2Vzc2lvbigpOiBib29sZWFuIHtcbiAgICBpZiAocHJvY2Vzcy5lbnZbQlJPV1NFUlNUQUNLX0xUU19TRVNTSU9OX0lEXSkge1xuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cbiAgICBjb25zdCBmbGFnID0gcHJvY2Vzcy5lbnZbQlJPV1NFUlNUQUNLX0xUU11cbiAgICByZXR1cm4gZmxhZyA9PT0gJ3RydWUnIHx8IGZsYWcgPT09ICcxJ1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0THRzU2Vzc2lvbklkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHByb2Nlc3MuZW52W0JST1dTRVJTVEFDS19MVFNfU0VTU0lPTl9JRF0gfHwgJydcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldENsb3VkUHJvdmlkZXIoYnJvd3NlcjogV2ViZHJpdmVySU8uQnJvd3NlciB8IFdlYmRyaXZlcklPLk11bHRpUmVtb3RlQnJvd3Nlcik6IHN0cmluZyB7XG4gICAgLy8gTk9URTogZG8gTk9UIGJyYW5jaCBvbiBpc0xvYWRUZXN0aW5nU2Vzc2lvbigpIGhlcmUuIGdldENsb3VkUHJvdmlkZXIgaXNcbiAgICAvLyBzaGFyZWQgd2l0aCBBdXRvbWF0ZS1zaWRlIGd1YXJkcyAoYXV0b21hdGVNb2R1bGUgb25CZWZvcmUvb25BZnRlclRlc3QsXG4gICAgLy8gd2ViZHJpdmVySU9Nb2R1bGUgS0VZX0lTX0JST1dTRVJTVEFDS19IVUIsIGFjY2Vzc2liaWxpdHktaGFuZGxlcixcbiAgICAvLyBzZXJ2aWNlLnRzKSBcdTIwMTQgZmxpcHBpbmcgaXQgdG8gJ2Jyb3dzZXJzdGFjaycgdW5kZXIgTFRTIHdvdWxkIG1ha2VcbiAgICAvLyBpc0Jyb3dzZXJzdGFja1Nlc3Npb24oKSByZXR1cm4gdHJ1ZSBmb3IgbG9jYWwtU2VsZW5pdW0gcG9kIHNlc3Npb25zLFxuICAgIC8vIGNhdXNpbmcgbWFya1Nlc3Npb25OYW1lIC8gbWFya1Nlc3Npb25TdGF0dXMgdG8gUFVUIGFnYWluc3QgQXV0b21hdGVcbiAgICAvLyBSRVNUIEFQSXMgd2l0aCBzZXNzaW9uIGlkcyB0aGF0IGRvbid0IGV4aXN0IHRoZXJlLiBUZXN0SHViLXJlcG9ydGluZ1xuICAgIC8vIGNhbGxlcnMgdGhhdCBuZWVkICdicm93c2Vyc3RhY2snIHVuZGVyIExUUyBkZXJpdmUgaXQgbG9jYWxseSB3aXRoXG4gICAgLy8gYGlzTG9hZFRlc3RpbmdTZXNzaW9uKCkgPyAnYnJvd3NlcnN0YWNrJyA6IGdldENsb3VkUHJvdmlkZXIoYnJvd3NlcilgXG4gICAgLy8gKHNlZSByZXBvcnRlci50cywgaW5zaWdodHMtaGFuZGxlci50cykuXG4gICAgaWYgKGJyb3dzZXIgJiYgJ2luc3RhbmNlcycgaW4gYnJvd3Nlcikge1xuICAgICAgICAvLyBMb29wIHRocm91Z2ggYWxsIGluc3RhbmNlc1xuICAgICAgICBmb3IgKGNvbnN0IGluc3RhbmNlTmFtZSBvZiBicm93c2VyLmluc3RhbmNlcykge1xuICAgICAgICAgICAgY29uc3QgaW5zdGFuY2UgPSAoYnJvd3NlciBhcyBhbnkpW2luc3RhbmNlTmFtZV0gYXMgV2ViZHJpdmVySU8uQnJvd3NlclxuICAgICAgICAgICAgaWYgKGluc3RhbmNlLm9wdGlvbnMgJiYgaW5zdGFuY2Uub3B0aW9ucy5ob3N0bmFtZSAmJiBpbnN0YW5jZS5vcHRpb25zLmhvc3RuYW1lLmluY2x1ZGVzKCdicm93c2Vyc3RhY2snKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiAnYnJvd3NlcnN0YWNrJ1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSBlbHNlIGlmIChicm93c2VyLm9wdGlvbnMgJiYgYnJvd3Nlci5vcHRpb25zLmhvc3RuYW1lICYmIGJyb3dzZXIub3B0aW9ucy5ob3N0bmFtZS5pbmNsdWRlcygnYnJvd3NlcnN0YWNrJykpIHsgLy8gU2luZ2xlIGJyb3dzZXIgaW5zdGFuY2VcbiAgICAgICAgcmV0dXJuICdicm93c2Vyc3RhY2snXG4gICAgfVxuICAgIHJldHVybiAndW5rbm93bl9ncmlkJ1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNCcm93c2Vyc3RhY2tTZXNzaW9uKGJyb3dzZXI/OiBXZWJkcml2ZXJJTy5Ccm93c2VyIHwgV2ViZHJpdmVySU8uTXVsdGlSZW1vdGVCcm93c2VyKSB7XG4gICAgcmV0dXJuIGJyb3dzZXIgJiYgZ2V0Q2xvdWRQcm92aWRlcihicm93c2VyKS50b0xvd2VyQ2FzZSgpID09PSAnYnJvd3NlcnN0YWNrJ1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0U2NlbmFyaW9FeGFtcGxlcyh3b3JsZDogSVRlc3RDYXNlSG9va1BhcmFtZXRlcikge1xuICAgIGNvbnN0IHNjZW5hcmlvID0gd29ybGQucGlja2xlXG5cbiAgICAvLyBubyBleGFtcGxlcyBwcmVzZW50XG4gICAgaWYgKChzY2VuYXJpby5hc3ROb2RlSWRzICYmIHNjZW5hcmlvLmFzdE5vZGVJZHMubGVuZ3RoIDw9IDEpIHx8IHNjZW5hcmlvLmFzdE5vZGVJZHMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBwaWNrbGVJZDogc3RyaW5nID0gc2NlbmFyaW8uYXN0Tm9kZUlkc1swXVxuICAgIGNvbnN0IGV4YW1wbGVzSWQ6IHN0cmluZyA9IHNjZW5hcmlvLmFzdE5vZGVJZHNbMV1cbiAgICBjb25zdCBnaGVya2luRG9jdW1lbnRDaGlsZHJlbiA9IHdvcmxkLmdoZXJraW5Eb2N1bWVudC5mZWF0dXJlPy5jaGlsZHJlblxuXG4gICAgbGV0IGV4YW1wbGVzOiBzdHJpbmdbXSA9IFtdXG5cbiAgICBnaGVya2luRG9jdW1lbnRDaGlsZHJlbj8uZm9yRWFjaChjaGlsZCA9PiB7XG4gICAgICAgIGlmIChjaGlsZC5ydWxlKSB7XG4gICAgICAgICAgICAvLyBoYW5kbGUgaWYgcnVsZSBpcyBwcmVzZW50XG4gICAgICAgICAgICBjaGlsZC5ydWxlLmNoaWxkcmVuLmZvckVhY2goY2hpbGRMZXZlbDIgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChjaGlsZExldmVsMi5zY2VuYXJpbyAmJiBjaGlsZExldmVsMi5zY2VuYXJpby5pZCA9PT0gcGlja2xlSWQgJiYgY2hpbGRMZXZlbDIuc2NlbmFyaW8uZXhhbXBsZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFzc2VkRXhhbXBsZXMgPSBjaGlsZExldmVsMi5zY2VuYXJpby5leGFtcGxlcy5mbGF0TWFwKCh2YWwpID0+ICh2YWwudGFibGVCb2R5KSkuZmluZCgoaXRlbSkgPT4gaXRlbS5pZCA9PT0gZXhhbXBsZXNJZCk/LmNlbGxzLm1hcCgodmFsKSA9PiAodmFsLnZhbHVlKSlcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBhc3NlZEV4YW1wbGVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBleGFtcGxlcyA9IHBhc3NlZEV4YW1wbGVzXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KVxuICAgICAgICB9IGVsc2UgaWYgKGNoaWxkLnNjZW5hcmlvICYmIGNoaWxkLnNjZW5hcmlvLmlkID09PSBwaWNrbGVJZCAmJiBjaGlsZC5zY2VuYXJpby5leGFtcGxlcykge1xuICAgICAgICAgICAgLy8gaGFuZGxlIGlmIHNjZW5hcmlvIG91dHNpZGUgcnVsZVxuICAgICAgICAgICAgY29uc3QgcGFzc2VkRXhhbXBsZXMgPSBjaGlsZC5zY2VuYXJpby5leGFtcGxlcy5mbGF0TWFwKCh2YWwpID0+ICh2YWwudGFibGVCb2R5KSkuZmluZCgoaXRlbSkgPT4gaXRlbS5pZCA9PT0gZXhhbXBsZXNJZCk/LmNlbGxzLm1hcCgodmFsKSA9PiAodmFsLnZhbHVlKSlcbiAgICAgICAgICAgIGlmIChwYXNzZWRFeGFtcGxlcykge1xuICAgICAgICAgICAgICAgIGV4YW1wbGVzID0gcGFzc2VkRXhhbXBsZXNcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0pXG5cbiAgICBpZiAoZXhhbXBsZXMubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBleGFtcGxlc1xuICAgIH1cbiAgICByZXR1cm5cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlbW92ZUFuc2lDb2xvcnMobWVzc2FnZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAoIW1lc3NhZ2UpIHtcbiAgICAgICAgcmV0dXJuICcnXG4gICAgfVxuICAgIC8vIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vYS8yOTQ5NzY4MFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb250cm9sLXJlZ2V4XG4gICAgcmV0dXJuIG1lc3NhZ2UucmVwbGFjZSgvW1xcdTAwMWJcXHUwMDliXVtbKCkjOz9dKig/OlswLTldezEsNH0oPzo7WzAtOV17MCw0fSkqKT9bMC05QS1PUlpjZi1ucXJ5PT48XS9nLCAnJylcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldExvZ1RhZyhldmVudFR5cGU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKGV2ZW50VHlwZSA9PT0gJ1Rlc3RSdW5TdGFydGVkJyB8fCBldmVudFR5cGUgPT09ICdUZXN0UnVuRmluaXNoZWQnKSB7XG4gICAgICAgIHJldHVybiAnVGVzdF9VcGxvYWQnXG4gICAgfSBlbHNlIGlmIChldmVudFR5cGUgPT09ICdIb29rUnVuU3RhcnRlZCcgfHwgZXZlbnRUeXBlID09PSAnSG9va1J1bkZpbmlzaGVkJykge1xuICAgICAgICByZXR1cm4gJ0hvb2tfVXBsb2FkJ1xuICAgIH0gZWxzZSBpZiAoZXZlbnRUeXBlID09PSAnU2NyZWVuc2hvdENyZWF0ZWQnKSB7XG4gICAgICAgIHJldHVybiAnU2NyZWVuc2hvdF9VcGxvYWQnXG4gICAgfSBlbHNlIGlmIChldmVudFR5cGUgPT09ICdMb2dDcmVhdGVkJykge1xuICAgICAgICByZXR1cm4gJ0xvZ19VcGxvYWQnXG4gICAgfVxuICAgIHJldHVybiAndW5kZWZpbmVkJ1xufVxuXG4vLyBnZXQgaGllcmFyY2h5IGZvciBhIHBhcnRpY3VsYXIgdGVzdCAoY2FsbGVkIGJ5IHJlcG9ydGVyIGZvciBza2lwcGVkIHRlc3RzKVxuZXhwb3J0IGZ1bmN0aW9uIGdldEhpZXJhcmNoeShmdWxsVGl0bGU/OiBzdHJpbmcpIHtcbiAgICBpZiAoIWZ1bGxUaXRsZSkge1xuICAgICAgICByZXR1cm4gW11cbiAgICB9XG4gICAgcmV0dXJuIGZ1bGxUaXRsZS5zcGxpdCgnLicpLnNsaWNlKDAsIC0xKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0SG9va1R5cGUgKGhvb2tOYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmIChob29rTmFtZS5zdGFydHNXaXRoKCdcImJlZm9yZSBlYWNoXCInKSkge1xuICAgICAgICByZXR1cm4gJ0JFRk9SRV9FQUNIJ1xuICAgIH0gZWxzZSBpZiAoaG9va05hbWUuc3RhcnRzV2l0aCgnXCJiZWZvcmUgYWxsXCInKSkge1xuICAgICAgICByZXR1cm4gJ0JFRk9SRV9BTEwnXG4gICAgfSBlbHNlIGlmIChob29rTmFtZS5zdGFydHNXaXRoKCdcImFmdGVyIGVhY2hcIicpKSB7XG4gICAgICAgIHJldHVybiAnQUZURVJfRUFDSCdcbiAgICB9IGVsc2UgaWYgKGhvb2tOYW1lLnN0YXJ0c1dpdGgoJ1wiYWZ0ZXIgYWxsXCInKSkge1xuICAgICAgICByZXR1cm4gJ0FGVEVSX0FMTCdcbiAgICB9XG4gICAgcmV0dXJuICd1bmtub3duJ1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNTY3JlZW5zaG90Q29tbWFuZCAoYXJnczogQmVmb3JlQ29tbWFuZEFyZ3MgfCBBZnRlckNvbW1hbmRBcmdzKSB7XG4gICAgcmV0dXJuIGFyZ3MuZW5kcG9pbnQgJiYgYXJncy5lbmRwb2ludC5pbmNsdWRlcygnL3NjcmVlbnNob3QnKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNCU3RhY2tTZXNzaW9uKGNvbmZpZzogT3B0aW9ucy5UZXN0cnVubmVyKSB7XG4gICAgaWYgKHR5cGVvZiBjb25maWcudXNlciA9PT0gJ3N0cmluZycgJiYgdHlwZW9mIGNvbmZpZy5rZXkgPT09ICdzdHJpbmcnICYmIGNvbmZpZy5rZXkubGVuZ3RoID09PSAyMCkge1xuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2Vcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzQnJvd3NlcnN0YWNrSW5mcmEoY29uZmlnOiBCcm93c2Vyc3RhY2tDb25maWcgJiBPcHRpb25zLlRlc3RydW5uZXIsIGNhcHM/OiBDYXBhYmlsaXRpZXMuQnJvd3NlclN0YWNrQ2FwYWJpbGl0aWVzKTogYm9vbGVhbiB7XG4gICAgLy8gdGhpcyBpcyBhIHV0aWxpdHkgZnVuY3Rpb24gdG8gY2hlY2sgaWYgdGhlIGJhc2ljIHNlc3Npb24gb3IgbXVsdGkgcmVtb3RlIHNlc3Npb24gaXMgcnVubmluZyBvbiBCcm93c2Vyc3RhY2ssIG1haW5seSBieSBjaGVja2luZyB0aGUgaG9zdG5hbWUgcGFyYW1ldGVyIGluIHRoZSBnaXZlbiBjb25maWdcbiAgICAvLyBJbiBjYXNlIGhvc3RuYW1lIGlzIG5vdCBwcmVzZW50IGFueXdoZXJlIGluIHRoZSBjb25maWcsIGl0IHJldHVybnMgdHJ1ZSBieSBkZWZhdWx0IGFzIGhvc3RuYW1lIGlzIG5vdCBhIG1hbmRhdG9yeSBwYXJhbWV0ZXIgaW4gdGhlIGNvbmZpZ1xuXG4gICAgY29uc3QgaXNCcm93c2Vyc3RhY2sgPSAoc3RyOiBzdHJpbmcgKTogYm9vbGVhbiA9PiB7XG4gICAgICAgIHJldHVybiBzdHIgPT09ICdicm93c2Vyc3RhY2suY29tJyB8fCBzdHIuZW5kc1dpdGgoJy5icm93c2Vyc3RhY2suY29tJylcbiAgICB9XG5cbiAgICBpZiAoKGNvbmZpZy5ob3N0bmFtZSkgJiYgIWlzQnJvd3NlcnN0YWNrKGNvbmZpZy5ob3N0bmFtZSkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuXG4gICAgaWYgKGNhcHMgJiYgdHlwZW9mIGNhcHMgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGNhcHMpKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGNhcGFiaWxpdHkgb2YgY2Fwcykge1xuICAgICAgICAgICAgICAgIGlmICgoKGNhcGFiaWxpdHkgYXMgT3B0aW9ucy5UZXN0cnVubmVyKS5ob3N0bmFtZSkgJiYgIWlzQnJvd3NlcnN0YWNrKChjYXBhYmlsaXR5IGFzIE9wdGlvbnMuVGVzdHJ1bm5lcikuaG9zdG5hbWUgYXMgc3RyaW5nKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBjYXBzKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY2FwYWJpbGl0eSA9IGNhcHNba2V5IGFzIGtleW9mIENhcGFiaWxpdGllcy5Ccm93c2VyU3RhY2tDYXBhYmlsaXRpZXNdXG4gICAgICAgICAgICAgICAgaWYgKCgoY2FwYWJpbGl0eSBhcyBPcHRpb25zLlRlc3RydW5uZXIpLmhvc3RuYW1lKSAmJiAhaXNCcm93c2Vyc3RhY2soKGNhcGFiaWxpdHkgYXMgT3B0aW9ucy5UZXN0cnVubmVyKS5ob3N0bmFtZSBhcyBzdHJpbmcpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGlmICghaXNCU3RhY2tTZXNzaW9uKGNvbmZpZykpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWVcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEJyb3dzZXJTdGFja1VzZXJBbmRLZXkoY29uZmlnOiBPcHRpb25zLlRlc3RydW5uZXIsIG9wdGlvbnM6IE9wdGlvbnMuVGVzdHJ1bm5lcikge1xuXG4gICAgLy8gRmFsbGJhY2sgMTogRW52IHZhcmlhYmxlc1xuICAgIC8vIEZhbGxiYWNrIDI6IFNlcnZpY2UgdmFyaWFibGVzIGluIHdkaW8uY29uZi5qcyAodGhhdCBhcmUgcmVjZWl2ZWQgaW5zaWRlIG9wdGlvbnMgb2JqZWN0KVxuICAgIGNvbnN0IGVudk9yU2VydmljZVZhcmlhYmxlcyA9IHtcbiAgICAgICAgdXNlcjogZ2V0QnJvd3NlclN0YWNrVXNlcihvcHRpb25zKSxcbiAgICAgICAga2V5OiBnZXRCcm93c2VyU3RhY2tLZXkob3B0aW9ucylcbiAgICB9XG4gICAgaWYgKGVudk9yU2VydmljZVZhcmlhYmxlcy51c2VyICYmIGVudk9yU2VydmljZVZhcmlhYmxlcy5rZXkpIHtcbiAgICAgICAgcmV0dXJuIGVudk9yU2VydmljZVZhcmlhYmxlc1xuICAgIH1cblxuICAgIC8vIEZhbGxiYWNrIDM6IFNlcnZpY2UgdmFyaWFibGVzIGluIHRlc3RPYnNlcnZhYmlsaXR5T3B0aW9ucyBvYmplY3RcbiAgICAvLyBGYWxsYmFjayA0OiBTZXJ2aWNlIHZhcmlhYmxlcyBpbiB0aGUgdG9wIGxldmVsIGNvbmZpZyBvYmplY3RcbiAgICBjb25zdCBvMTF5VmFyaWFibGVzID0ge1xuICAgICAgICB1c2VyOiBnZXRPYnNlcnZhYmlsaXR5VXNlcihvcHRpb25zLCBjb25maWcpLFxuICAgICAgICBrZXk6IGdldE9ic2VydmFiaWxpdHlLZXkob3B0aW9ucywgY29uZmlnKVxuICAgIH1cbiAgICByZXR1cm4gbzExeVZhcmlhYmxlc1xuXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzaG91bGRBZGRTZXJ2aWNlVmVyc2lvbihjb25maWc6IE9wdGlvbnMuVGVzdHJ1bm5lciwgdGVzdE9ic2VydmFiaWxpdHk/OiBib29sZWFuLCBjYXBzPzogQ2FwYWJpbGl0aWVzLkJyb3dzZXJTdGFja0NhcGFiaWxpdGllcyk6IGJvb2xlYW4ge1xuICAgIGlmICgoY29uZmlnLnNlcnZpY2VzICYmIGNvbmZpZy5zZXJ2aWNlcy50b1N0cmluZygpLmluY2x1ZGVzKCdjaHJvbWVkcml2ZXInKSAmJiB0ZXN0T2JzZXJ2YWJpbGl0eSAhPT0gZmFsc2UpIHx8ICFpc0Jyb3dzZXJzdGFja0luZnJhKGNvbmZpZywgY2FwcykpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICAgIHJldHVybiB0cnVlXG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBiYXRjaEFuZFBvc3RFdmVudHMgKGV2ZW50VXJsOiBzdHJpbmcsIGtpbmQ6IHN0cmluZywgZGF0YTogVXBsb2FkVHlwZVtdKSB7XG4gICAgaWYgKCFwcm9jZXNzLmVudltURVNUT1BTX0JVSUxEX0NPTVBMRVRFRF9FTlZdKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignQnVpbGQgbm90IGNvbXBsZXRlZCB5ZXQnKVxuICAgIH1cblxuICAgIGNvbnN0IGp3dFRva2VuID0gcHJvY2Vzcy5lbnZbQlJPV1NFUlNUQUNLX1RFU1RIVUJfSldUXVxuICAgIGlmICghand0VG9rZW4pIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdNaXNzaW5nIGF1dGhlbnRpY2F0aW9uIFRva2VuJylcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgICBjb25zdCB1cmwgPSBgJHtBUElVdGlscy5EQVRBX0VORFBPSU5UfS8ke2V2ZW50VXJsfWBcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh1cmwsIHtcbiAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICAgICAgIC4uLkRFRkFVTFRfUkVRVUVTVF9DT05GSUcuaGVhZGVycyxcbiAgICAgICAgICAgICAgICAnQXV0aG9yaXphdGlvbic6IGBCZWFyZXIgJHtqd3RUb2tlbn1gXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoZGF0YSlcbiAgICAgICAgfSlcbiAgICAgICAgLy8gcmVhZCBhcyB0ZXh0IGZpcnN0OiBlcnJvciByZXNwb25zZXMgKDQwMS81eHgpIGFuZCBlbXB0eSBib2RpZXMgYXJlIG5vdCBKU09OLCBhbmQgYSBibGluZFxuICAgICAgICAvLyByZXNwb25zZS5qc29uKCkgc3VyZmFjZWQgdGhlbSBhcyBhIG1pc2xlYWRpbmcgXCJVbmV4cGVjdGVkIGVuZCBvZiBKU09OIGlucHV0XCJcbiAgICAgICAgY29uc3QgcmVzcG9uc2VCb2R5ID0gYXdhaXQgcmVzcG9uc2UudGV4dCgpXG4gICAgICAgIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgSFRUUCAke3Jlc3BvbnNlLnN0YXR1c30gJHtyZXNwb25zZS5zdGF0dXNUZXh0fSR7cmVzcG9uc2VCb2R5ID8gYCBcdTIwMTQgJHtyZXNwb25zZUJvZHkuc2xpY2UoMCwgMzAwKX1gIDogJyAoZW1wdHkgYm9keSknfWApXG4gICAgICAgIH1cbiAgICAgICAgQlN0YWNrTG9nZ2VyLmRlYnVnKGBbJHtraW5kfV0gU3VjY2VzcyByZXNwb25zZTogJHtyZXNwb25zZUJvZHl9YClcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBCU3RhY2tMb2dnZXIuZGVidWcoYFske2tpbmR9XSBFWENFUFRJT04gSU4gJHtraW5kfSBSRVFVRVNUIFRPIFRFU1QgUkVQT1JUSU5HIEFORCBBTkFMWVRJQ1MgOiAke2Vycm9yfWApXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignRXhjZXB0aW9uIGluIHJlcXVlc3QgJyArIGVycm9yKVxuICAgIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldE9ic2VydmFiaWxpdHlVc2VyKG9wdGlvbnM6IEJyb3dzZXJzdGFja0NvbmZpZyAmIE9wdGlvbnMuVGVzdHJ1bm5lciwgY29uZmlnOiBPcHRpb25zLlRlc3RydW5uZXIpIHtcbiAgICBpZiAocHJvY2Vzcy5lbnYuQlJPV1NFUlNUQUNLX1VTRVJOQU1FKSB7XG4gICAgICAgIHJldHVybiBwcm9jZXNzLmVudi5CUk9XU0VSU1RBQ0tfVVNFUk5BTUVcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMudGVzdE9ic2VydmFiaWxpdHlPcHRpb25zICYmIG9wdGlvbnMudGVzdE9ic2VydmFiaWxpdHlPcHRpb25zLnVzZXIpIHtcbiAgICAgICAgcmV0dXJuIG9wdGlvbnMudGVzdE9ic2VydmFiaWxpdHlPcHRpb25zLnVzZXJcbiAgICB9XG4gICAgcmV0dXJuIGNvbmZpZy51c2VyXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRPYnNlcnZhYmlsaXR5S2V5KG9wdGlvbnM6IEJyb3dzZXJzdGFja0NvbmZpZyAmIE9wdGlvbnMuVGVzdHJ1bm5lciwgY29uZmlnOiBPcHRpb25zLlRlc3RydW5uZXIpIHtcbiAgICBpZiAocHJvY2Vzcy5lbnYuQlJPV1NFUlNUQUNLX0FDQ0VTU19LRVkpIHtcbiAgICAgICAgcmV0dXJuIHByb2Nlc3MuZW52LkJST1dTRVJTVEFDS19BQ0NFU1NfS0VZXG4gICAgfVxuICAgIGlmIChvcHRpb25zLnRlc3RPYnNlcnZhYmlsaXR5T3B0aW9ucyAmJiBvcHRpb25zLnRlc3RPYnNlcnZhYmlsaXR5T3B0aW9ucy5rZXkpIHtcbiAgICAgICAgcmV0dXJuIG9wdGlvbnMudGVzdE9ic2VydmFiaWxpdHlPcHRpb25zLmtleVxuICAgIH1cbiAgICByZXR1cm4gY29uZmlnLmtleVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0T2JzZXJ2YWJpbGl0eVByb2plY3Qob3B0aW9uczogQnJvd3NlcnN0YWNrQ29uZmlnICYgT3B0aW9ucy5UZXN0cnVubmVyLCBic3RhY2tQcm9qZWN0TmFtZT86IHN0cmluZykge1xuICAgIGlmIChwcm9jZXNzLmVudi5URVNUX09CU0VSVkFCSUxJVFlfUFJPSkVDVF9OQU1FKSB7XG4gICAgICAgIHJldHVybiBwcm9jZXNzLmVudi5URVNUX09CU0VSVkFCSUxJVFlfUFJPSkVDVF9OQU1FXG4gICAgfVxuICAgIGlmIChvcHRpb25zLnRlc3RPYnNlcnZhYmlsaXR5T3B0aW9ucyAmJiBvcHRpb25zLnRlc3RPYnNlcnZhYmlsaXR5T3B0aW9ucy5wcm9qZWN0TmFtZSkge1xuICAgICAgICByZXR1cm4gb3B0aW9ucy50ZXN0T2JzZXJ2YWJpbGl0eU9wdGlvbnMucHJvamVjdE5hbWVcbiAgICB9XG4gICAgcmV0dXJuIGJzdGFja1Byb2plY3ROYW1lXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRPYnNlcnZhYmlsaXR5QnVpbGQob3B0aW9uczogQnJvd3NlcnN0YWNrQ29uZmlnICYgT3B0aW9ucy5UZXN0cnVubmVyLCBic3RhY2tCdWlsZE5hbWU/OiBzdHJpbmcpIHtcbiAgICBpZiAocHJvY2Vzcy5lbnYuVEVTVF9PQlNFUlZBQklMSVRZX0JVSUxEX05BTUUpIHtcbiAgICAgICAgcmV0dXJuIHByb2Nlc3MuZW52LlRFU1RfT0JTRVJWQUJJTElUWV9CVUlMRF9OQU1FXG4gICAgfVxuICAgIGlmIChvcHRpb25zLnRlc3RPYnNlcnZhYmlsaXR5T3B0aW9ucyAmJiBvcHRpb25zLnRlc3RPYnNlcnZhYmlsaXR5T3B0aW9ucy5idWlsZE5hbWUpIHtcbiAgICAgICAgcmV0dXJuIG9wdGlvbnMudGVzdE9ic2VydmFiaWxpdHlPcHRpb25zLmJ1aWxkTmFtZVxuICAgIH1cbiAgICByZXR1cm4gYnN0YWNrQnVpbGROYW1lIHx8IHBhdGguYmFzZW5hbWUocGF0aC5yZXNvbHZlKHByb2Nlc3MuY3dkKCkpKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0T2JzZXJ2YWJpbGl0eUJ1aWxkVGFncyhvcHRpb25zOiBCcm93c2Vyc3RhY2tDb25maWcgJiBPcHRpb25zLlRlc3RydW5uZXIsIGJzdGFja0J1aWxkVGFnPzogc3RyaW5nKTogc3RyaW5nW10ge1xuICAgIGlmIChwcm9jZXNzLmVudi5URVNUX09CU0VSVkFCSUxJVFlfQlVJTERfVEFHKSB7XG4gICAgICAgIHJldHVybiBwcm9jZXNzLmVudi5URVNUX09CU0VSVkFCSUxJVFlfQlVJTERfVEFHLnNwbGl0KCcsJylcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMudGVzdE9ic2VydmFiaWxpdHlPcHRpb25zICYmIG9wdGlvbnMudGVzdE9ic2VydmFiaWxpdHlPcHRpb25zLmJ1aWxkVGFnKSB7XG4gICAgICAgIHJldHVybiBvcHRpb25zLnRlc3RPYnNlcnZhYmlsaXR5T3B0aW9ucy5idWlsZFRhZ1xuICAgIH1cbiAgICBpZiAoYnN0YWNrQnVpbGRUYWcpIHtcbiAgICAgICAgcmV0dXJuIFtic3RhY2tCdWlsZFRhZ11cbiAgICB9XG4gICAgcmV0dXJuIFtdXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRUZXN0UGxhbklkKG9wdGlvbnM6IEJyb3dzZXJzdGFja0NvbmZpZyAmIE9wdGlvbnMuVGVzdHJ1bm5lcik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHByb2Nlc3MuZW52W0JST1dTRVJTVEFDS19URVNUX1BMQU5fSURdKSB7XG4gICAgICAgIHJldHVybiBwcm9jZXNzLmVudltCUk9XU0VSU1RBQ0tfVEVTVF9QTEFOX0lEXVxuICAgIH1cbiAgICBjb25zdCBDTElfQVJHID0gJy0tYnJvd3NlcnN0YWNrLnRlc3RNYW5hZ2VtZW50T3B0aW9ucy50ZXN0UGxhbklkJ1xuICAgIGNvbnN0IGFyZ0luZGV4ID0gcHJvY2Vzcy5hcmd2LmluZGV4T2YoQ0xJX0FSRylcbiAgICBpZiAoYXJnSW5kZXggIT09IC0xICYmIHByb2Nlc3MuYXJndlthcmdJbmRleCArIDFdKSB7XG4gICAgICAgIHJldHVybiBwcm9jZXNzLmFyZ3ZbYXJnSW5kZXggKyAxXVxuICAgIH1cbiAgICBjb25zdCBhcmdXaXRoRXF1YWxzID0gcHJvY2Vzcy5hcmd2LmZpbmQoKGFyZykgPT4gYXJnLnN0YXJ0c1dpdGgoYCR7Q0xJX0FSR309YCkpXG4gICAgaWYgKGFyZ1dpdGhFcXVhbHMpIHtcbiAgICAgICAgcmV0dXJuIGFyZ1dpdGhFcXVhbHMuc3BsaXQoJz0nKVsxXVxuICAgIH1cbiAgICBjb25zdCB0ZXN0UGxhbklkID0gb3B0aW9ucy50ZXN0TWFuYWdlbWVudE9wdGlvbnM/LnRlc3RQbGFuSWRcbiAgICBpZiAodHlwZW9mIHRlc3RQbGFuSWQgPT09ICdzdHJpbmcnICYmIHRlc3RQbGFuSWQudHJpbSgpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgcmV0dXJuIHRlc3RQbGFuSWQudHJpbSgpXG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWRcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEJyb3dzZXJTdGFja1VzZXIoY29uZmlnOiBPcHRpb25zLlRlc3RydW5uZXIpIHtcbiAgICBpZiAocHJvY2Vzcy5lbnYuQlJPV1NFUlNUQUNLX1VTRVJOQU1FKSB7XG4gICAgICAgIHJldHVybiBwcm9jZXNzLmVudi5CUk9XU0VSU1RBQ0tfVVNFUk5BTUUgYXMgc3RyaW5nXG4gICAgfVxuICAgIHJldHVybiBjb25maWcudXNlciBhcyBzdHJpbmdcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEJyb3dzZXJTdGFja0tleShjb25maWc6IE9wdGlvbnMuVGVzdHJ1bm5lcikge1xuICAgIGlmIChwcm9jZXNzLmVudi5CUk9XU0VSU1RBQ0tfQUNDRVNTX0tFWSkge1xuICAgICAgICByZXR1cm4gcHJvY2Vzcy5lbnYuQlJPV1NFUlNUQUNLX0FDQ0VTU19LRVlcbiAgICB9XG4gICAgcmV0dXJuIGNvbmZpZy5rZXlcbn1cblxuLy8gU2Vzc2lvbnMgYXV0aGVudGljYXRlIHdpdGggY29uZmlnLnVzZXIsIGJ1dCB0aGUgQ0xJIC8gVGVzdCBSZXBvcnRpbmcgYnVpbGQgcHJlZmVycyB0aGVcbi8vIGVudiBjcmVkZW50aWFscywgdGhlbiB0ZXN0T2JzZXJ2YWJpbGl0eU9wdGlvbnMudXNlciBcdTIwMTQgYSBtaXNtYXRjaCBzcGxpdHMgb25lIHJ1biBhY3Jvc3MgdHdvIGFjY291bnRzLlxuZXhwb3J0IGZ1bmN0aW9uIGdldENyZWRlbnRpYWxNaXNtYXRjaFdhcm5pbmcob3B0aW9uczogQnJvd3NlcnN0YWNrQ29uZmlnICYgT3B0aW9ucy5UZXN0cnVubmVyLCBjb25maWc6IE9wdGlvbnMuVGVzdHJ1bm5lcik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgaHViVXNlciA9IGNvbmZpZy51c2VyXG4gICAgaWYgKHR5cGVvZiBodWJVc2VyICE9PSAnc3RyaW5nJyB8fCBodWJVc2VyLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkXG4gICAgfVxuXG4gICAgbGV0IHNvdXJjZTogc3RyaW5nIHwgdW5kZWZpbmVkXG4gICAgbGV0IHJlcG9ydGluZ1VzZXI6IHN0cmluZyB8IHVuZGVmaW5lZFxuICAgIGZvciAoY29uc3QgZW52VmFyIG9mIFsnQlJPV1NFUlNUQUNLX1VTRVJOQU1FJywgJ0JST1dTRVJTVEFDS19VU0VSX05BTUUnXSkge1xuICAgICAgICBpZiAocHJvY2Vzcy5lbnZbZW52VmFyXSkge1xuICAgICAgICAgICAgc291cmNlID0gYHRoZSAke2VudlZhcn0gZW52aXJvbm1lbnQgdmFyaWFibGVgXG4gICAgICAgICAgICByZXBvcnRpbmdVc2VyID0gcHJvY2Vzcy5lbnZbZW52VmFyXVxuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAoIXNvdXJjZSAmJiBvcHRpb25zLnRlc3RPYnNlcnZhYmlsaXR5T3B0aW9ucz8udXNlcikge1xuICAgICAgICBzb3VyY2UgPSAndGVzdE9ic2VydmFiaWxpdHlPcHRpb25zLnVzZXInXG4gICAgICAgIHJlcG9ydGluZ1VzZXIgPSBvcHRpb25zLnRlc3RPYnNlcnZhYmlsaXR5T3B0aW9ucy51c2VyXG4gICAgfVxuXG4gICAgaWYgKCFzb3VyY2UgfHwgcmVwb3J0aW5nVXNlciA9PT0gaHViVXNlcikge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkXG4gICAgfVxuXG4gICAgcmV0dXJuIGBCcm93c2VyU3RhY2sgY3JlZGVudGlhbCBtaXNtYXRjaDogdGhlIFxcYHVzZXJcXGAgaW4geW91ciBXZWJkcml2ZXJJTyBjb25maWcgYW5kICR7c291cmNlfSBwb2ludCB0byBkaWZmZXJlbnQgQnJvd3NlclN0YWNrIGFjY291bnRzLiBgICtcbiAgICAgICAgYFRlc3Qgc2Vzc2lvbnMgYXJlIGNyZWF0ZWQgd2l0aCB0aGUgY29uZmlnIFxcYHVzZXJcXGAsIGJ1dCBUZXN0IFJlcG9ydGluZyAmIEFuYWx5dGljcyBidWlsZHMgYXJlIGNyZWF0ZWQgd2l0aCAke3NvdXJjZX0sIGAgK1xuICAgICAgICAnc28gdGhpcyBydW5cXCdzIHRlc3QgcmVzdWx0cyB3aWxsIG5vdCBhcHBlYXIgdW5kZXIgdGhlIHNhbWUgYWNjb3VudCBhcyBpdHMgc2Vzc2lvbnMuICcgK1xuICAgICAgICBgVXNlIHRoZSBzYW1lIEJyb3dzZXJTdGFjayBjcmVkZW50aWFscyBpbiBib3RoIHBsYWNlcyAob3IgcmVtb3ZlICR7c291cmNlfSkgdG8gc2VlIHRoZW0gdG9nZXRoZXIuYFxufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNVbmRlZmluZWQodmFsdWU6IHVua25vd24pIHtcbiAgICBsZXQgcmVzID0gKHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsdWUgPT09IG51bGwpXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmVzID0gcmVzIHx8IHZhbHVlID09PSAnJ1xuICAgIH1cbiAgICByZXR1cm4gcmVzXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1RydWUodmFsdWU/OiB1bmtub3duKSB7XG4gICAgcmV0dXJuICh2YWx1ZSArICcnKS50b0xvd2VyQ2FzZSgpID09PSAndHJ1ZSdcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzRmFsc2UodmFsdWU/OiB1bmtub3duKSB7XG4gICAgcmV0dXJuICh2YWx1ZSArICcnKS50b0xvd2VyQ2FzZSgpID09PSAnZmFsc2UnXG59XG5cbi8qKlxuICogc2tpcEFwcE92ZXJyaWRlIHZhbGlkYXRpb24gY2hva2Vwb2ludCBcdTIwMTQgcG9ydGVkIGZyb20gdGhlIE5vZGUgU0RLJ3NcbiAqIHZhbGlkYXRlU2tpcEFwcE92ZXJyaWRlIChoZWxwZXIuanMpIC8gSmF2YSBCcm93c2VyU3RhY2tKYXZhQWdlbnQucHJvY2Vzc0FwcE9wdGlvbnMuXG4gKiBDYWxsZWQgT05DRSBmcm9tIHRoZSBsYXVuY2hlciAobWFpbiBwcm9jZXNzLCBwcmUtc2Vzc2lvbikuIEVtaXRzIHRoZSBmaXhlZCB3YXJuaW5nLFxuICogaGFuZGxlcyB0aGUgdGhyZWUgZWRnZSBjYXNlcywgYW5kIGNsZWFycyB0aGUgYXBwIG9uIGNvbmZsaWN0IHNvIGl0IGlzIG5laXRoZXIgdXBsb2FkZWRcbiAqIG5vciBpbmplY3RlZC4gVGhlcmUgaXMgTk8gVGllci0yIGJyYW5jaDogZXZlcnkgV2ViZHJpdmVySU8gdGVzdCBmcmFtZXdvcmtcbiAqIChtb2NoYS9qYXNtaW5lL2N1Y3VtYmVyKSBzdXBwb3J0cyBBcHAgQXV0b21hdGUuXG4gKlxuICogVGhlIHN0YW5kYXJkIHdhcm5pbmcgYW5kIHRoZSBlZGdlLTIgZXJyb3IgYXJlIHZlcmJhdGltIHdpdGggdGhlIG90aGVyIEJyb3dzZXJTdGFjayBTREtzXG4gKiAoQnJvd3NlclN0YWNrSmF2YUFnZW50I3Byb2Nlc3NBcHBPcHRpb25zKS4gVGhlIGVkZ2UtMSBjb25mbGljdCB3YXJuaW5nIGlzIElOVEVOVElPTkFMTFkgYWRhcHRlZCBmb3JcbiAqIFdlYmRyaXZlcklPIFx1MjAxNCBpdCBzYXlzIFwiYnJvd3NlcnN0YWNrIHNlcnZpY2Ugb3B0aW9uc1wiICh3aGVyZSBXRElPIHJlYWRzIGBhcHBgKSwgbm90IFwiYnJvd3NlcnN0YWNrLnltbFwiIFx1MjAxNFxuICogc28gcGxlYXNlIGRvIE5PVCBcImZpeFwiIGl0IGJhY2sgdG8gdGhlIHltbCB3b3JkaW5nIHRvIG1hdGNoIHRoZSBvdGhlciBTREtzLlxuICogR3JhY2VmdWw6IG5ldmVyIHRocm93cyBleGNlcHQgdGhlIGRlbGliZXJhdGUgZWRnZS0yIGNvbmZpZyBlcnJvciAoZXhwbGljaXQgZmFsc2UgKyBubyBhcHApLFxuICogd2hpY2ggZmlyZXMgcHJlLXNlc3Npb24gc28gdGhlIHJ1biBhYm9ydHMgY2xlYW5seS5cbiAqXG4gKiBNdXRhdGVzIGBvcHRpb25zLmFwcGAgKGVkZ2UtMSkuIDMtc3RhdGUgdmlhIGlzVHJ1ZS9pc0ZhbHNlIFx1MjAxNCBuZXZlciBgIW9wdGlvbnMuc2tpcEFwcE92ZXJyaWRlYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlU2tpcEFwcE92ZXJyaWRlKG9wdGlvbnM/OiBCcm93c2Vyc3RhY2tDb25maWcgJiBCcm93c2Vyc3RhY2tPcHRpb25zKSB7XG4gICAgaWYgKGlzVW5kZWZpbmVkKG9wdGlvbnMpKSB7XG4gICAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IHNraXBBcHBPdmVycmlkZSA9IChvcHRpb25zIGFzIEJyb3dzZXJzdGFja0NvbmZpZykuc2tpcEFwcE92ZXJyaWRlXG4gICAgY29uc3QgYWxyZWFkeVdhcm5lZCA9IGlzVHJ1ZShwcm9jZXNzLmVudi5CUk9XU0VSU1RBQ0tfU0tJUF9BUFBfT1ZFUlJJREVfV0FSTkVEKVxuXG4gICAgLy8gU3RhbmRhcmQgd2FybmluZyBcdTIwMTQgZmlyZXMgd2hlbmV2ZXIgc2tpcEFwcE92ZXJyaWRlIGlzIHRydWUsIGJlZm9yZSBhbnkgZWRnZSByZXR1cm4uXG4gICAgaWYgKGlzVHJ1ZShza2lwQXBwT3ZlcnJpZGUpICYmICFhbHJlYWR5V2FybmVkKSB7XG4gICAgICAgIEJTdGFja0xvZ2dlci53YXJuKCdbQnJvd3NlclN0YWNrXSBcXCdza2lwQXBwT3ZlcnJpZGU6IHRydWVcXCcgaXMgc2V0LiBUaGUgU0RLIHdpbGwgdHJlYXQgdGhpcyBzZXNzaW9uIGFzIEFwcCBBdXRvbWF0ZSBhbmQgd2lsbCBOT1QgbWFuYWdlIGFwcCB1cGxvYWQgb3IgaW5qZWN0IGFwcCBjYXBhYmlsaXRpZXMuIElmIHlvdSBpbnRlbmRlZCB0byBydW4gYW4gQXV0b21hdGUgKGJyb3dzZXIvd2Vic2l0ZSkgc2Vzc2lvbiwgcmVtb3ZlIFxcJ3NraXBBcHBPdmVycmlkZVxcJyBcdTIwMTQgbGVhdmluZyBpdCBzZXQgd2lsbCBjYXVzZSBBdXRvbWF0ZSBzZXNzaW9ucyB0byBiZWhhdmUgaW5jb3JyZWN0bHkuJylcbiAgICAgICAgcHJvY2Vzcy5lbnYuQlJPV1NFUlNUQUNLX1NLSVBfQVBQX09WRVJSSURFX1dBUk5FRCA9ICd0cnVlJ1xuICAgIH1cblxuICAgIC8vIEVkZ2UgMTogYXBwIHNwZWNpZmllZCArIHNraXBBcHBPdmVycmlkZTp0cnVlIFx1MjE5MiB3YXJuLCBjbGVhciB0aGUgYXBwIHNvIGl0IGlzIG5vdFxuICAgIC8vIHVwbG9hZGVkL2luamVjdGVkLCBwcm9jZWVkIEFwcCBBdXRvbWF0ZS5cbiAgICBpZiAoaXNUcnVlKHNraXBBcHBPdmVycmlkZSkgJiYgIWlzVW5kZWZpbmVkKChvcHRpb25zIGFzIEJyb3dzZXJzdGFja0NvbmZpZykuYXBwKSkge1xuICAgICAgICBCU3RhY2tMb2dnZXIud2FybignQ29uZmxpY3QgZGV0ZWN0ZWQuIHNraXBBcHBPdmVycmlkZTogdHJ1ZSBpcyBhY3RpdmU7IGlnbm9yaW5nIHRoZSBhcHAgcHJvdmlkZWQgaW4gdGhlIGJyb3dzZXJzdGFjayBzZXJ2aWNlIG9wdGlvbnMuJylcbiAgICAgICAgOyhvcHRpb25zIGFzIEJyb3dzZXJzdGFja0NvbmZpZykuYXBwID0gdW5kZWZpbmVkXG4gICAgICAgIHJldHVyblxuICAgIH1cblxuICAgIC8vIEVkZ2UgMjogYXBwIG5vdCBzcGVjaWZpZWQgKyBza2lwQXBwT3ZlcnJpZGUgZXhwbGljaXRseSBmYWxzZSBcdTIxOTIgcHJlLXNlc3Npb24gY29uZmlnIGVycm9yLlxuICAgIGlmIChpc0ZhbHNlKHNraXBBcHBPdmVycmlkZSkgJiYgaXNVbmRlZmluZWQoKG9wdGlvbnMgYXMgQnJvd3NlcnN0YWNrQ29uZmlnKS5hcHApKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignQXBwIGNhcGFiaWxpdHkgaXMgbWlzc2luZy4gV2hlbiBza2lwQXBwT3ZlcnJpZGUgaXMgc2V0IHRvIFxcJ2ZhbHNlXFwnLCBhIHZhbGlkIGFwcCBjYXBhYmlsaXR5IChoYXNoL3NoYXJlYWJsZSBpZC9wYXRoL2N1c3RvbV9pZCkgbXVzdCBiZSBwcm92aWRlZC4nKVxuICAgIH1cblxuICAgIC8vIEVkZ2UgMyAoYW5kIGRlZmF1bHQpOiB1bnNldCArIG5vIGFwcCBcdTIxOTIgdW5jaGFuZ2VkIGJlaGF2aW9yIChuby1vcCkuXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmcmFtZXdvcmtTdXBwb3J0c0hvb2soaG9vazogc3RyaW5nLCBmcmFtZXdvcms/OiBzdHJpbmcpIHtcbiAgICBpZiAoZnJhbWV3b3JrID09PSAnbW9jaGEnICYmIChob29rID09PSAnYmVmb3JlJyB8fCBob29rID09PSAnYWZ0ZXInIHx8IGhvb2sgPT09ICdiZWZvcmVFYWNoJyB8fCBob29rID09PSAnYWZ0ZXJFYWNoJykpIHtcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG5cbiAgICBpZiAoZnJhbWV3b3JrID09PSAnY3VjdW1iZXInKSB7XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlXG59XG5cbmV4cG9ydCBjb25zdCBwYXRjaENvbnNvbGVMb2dzID0gbzExeUVycm9ySGFuZGxlcigoKSA9PiB7XG4gICAgY29uc3QgQlNUZXN0T3BzUGF0Y2hlciA9IG5ldyBsb2dQYXRjaGVyKHt9KVxuXG4gICAgT2JqZWN0LmtleXMoY29uc29sZUhvbGRlcikuZm9yRWFjaCgobWV0aG9kOiBrZXlvZiB0eXBlb2YgY29uc29sZSkgPT4ge1xuICAgICAgICBpZiAoIShtZXRob2QgaW4gY29uc29sZSkgfHwgbWV0aG9kID09PSAnQ29uc29sZScgfHwgdHlwZW9mIGNvbnNvbGVbbWV0aG9kXSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLmRlYnVnKGBTa2lwcGluZyBtZXRob2Q6ICR7bWV0aG9kfSwgZXhpc3RzOiAke21ldGhvZCBpbiBjb25zb2xlfSwgdHlwZTogJHt0eXBlb2YgY29uc29sZVttZXRob2RdfWApXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBvcmlnTWV0aG9kOiBGdW5jdGlvbiA9IGNvbnNvbGVbbWV0aG9kXS5iaW5kKGNvbnNvbGUpXG5cbiAgICAgICAgY29uc29sZVttZXRob2RdID0gKC4uLmFyZ3M6IHVua25vd25bXSkgPT4ge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBpZiAoIU9iamVjdC5rZXlzKEJTVGVzdE9wc1BhdGNoZXIpLmluY2x1ZGVzKG1ldGhvZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgb3JpZ01ldGhvZCguLi5hcmdzKVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIG9yaWdNZXRob2QoLi4uYXJncyk7XG4gICAgICAgICAgICAgICAgICAgIChCU1Rlc3RPcHNQYXRjaGVyIGFzIGFueSlbbWV0aG9kXSguLi5hcmdzKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLmRlYnVnKGBFcnJvciB3aGlsZSBwYXRjaGluZyBjb25zb2xlIGxvZ3MgOiAke2Vycm9yfWApXG4gICAgICAgICAgICAgICAgb3JpZ01ldGhvZCguLi5hcmdzKVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSlcbn0pXG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRGYWlsdXJlT2JqZWN0KGVycm9yOiBzdHJpbmd8RXJyb3IpIHtcbiAgICBjb25zdCBzdGFjayA9IChlcnJvciBhcyBFcnJvcikuc3RhY2tcbiAgICBjb25zdCBtZXNzYWdlID0gdHlwZW9mIGVycm9yID09PSAnc3RyaW5nJyA/IGVycm9yIDogZXJyb3IubWVzc2FnZVxuICAgIGNvbnN0IGJhY2t0cmFjZSA9IHN0YWNrID8gcmVtb3ZlQW5zaUNvbG9ycyhzdGFjay50b1N0cmluZygpKSA6ICcnXG5cbiAgICByZXR1cm4ge1xuICAgICAgICBmYWlsdXJlOiBbeyBiYWNrdHJhY2U6IFtiYWNrdHJhY2VdIH1dLFxuICAgICAgICBmYWlsdXJlX3JlYXNvbjogcmVtb3ZlQW5zaUNvbG9ycyhtZXNzYWdlLnRvU3RyaW5nKCkpLFxuICAgICAgICBmYWlsdXJlX3R5cGU6IG1lc3NhZ2UgPyAobWVzc2FnZS50b1N0cmluZygpLm1hdGNoKC9Bc3NlcnRpb25FcnJvci8pID8gJ0Fzc2VydGlvbkVycm9yJyA6ICdVbmhhbmRsZWRFcnJvcicpIDogbnVsbFxuICAgIH1cbn1cblxuZXhwb3J0IGNvbnN0IHNsZWVwID0gKG1zID0gMTAwKSA9PiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gc2V0VGltZW91dChyZXNvbHZlLCBtcykpXG5cbmV4cG9ydCBpbnRlcmZhY2UgVXBsb2FkTG9nc09wdGlvbnMge1xuICAgIC8qIG9wdC1vdXQsIG1pcnJvcmluZyB0aGUgTm9kZSBTREsncyBgZGlzYWJsZUF1dG9DYXB0dXJlTG9nc2AgKi9cbiAgICBkaXNhYmxlQXV0b0NhcHR1cmVMb2dzPzogYm9vbGVhblxuICAgIC8qIHBhcnNlZCB3ZGlvIGNvbmZpZywgdXNlZCB0byBsb2NhdGUgdGhlIHVzZXIncyBjb25maWcgZmlsZSAqL1xuICAgIGNvbmZpZz86IE9wdGlvbnMuVGVzdHJ1bm5lclxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdXBsb2FkTG9ncyh1c2VyOiBzdHJpbmcgfCB1bmRlZmluZWQsIGtleTogc3RyaW5nIHwgdW5kZWZpbmVkLCBjbGllbnRCdWlsZFV1aWQ6IHN0cmluZywgb3B0aW9uczogVXBsb2FkTG9nc09wdGlvbnMgPSB7fSkge1xuICAgIC8vIE1hbnVhbCBpbnN0cnVtZW50YXRpb246IHRhZyBldmVyeSByZXR1cm4gcGF0aCBvbiB0aGUgU0RLX1VQTE9BRF9MT0dTIGV2ZW50IHNvXG4gICAgLy8gdGhlIG1ldHJpYyBpZGVudGlmaWVzIHRoZSBzcGVjaWZpYyByZWFzb24gbG9ncyB3ZXJlIG5vdCB1cGxvYWRlZCAobm8gY3JlZHMsXG4gICAgLy8gcGVyLWZpbGUgY29weSBmYWlsdXJlLCB1cGxvYWQgbm8tcmVzcG9uc2UsIGV4Y2VwdGlvbikuIG1lYXN1cmVXcmFwcGVyIHdvdWxkXG4gICAgLy8gb3RoZXJ3aXNlIG1hcmsgYWxsIG5vbi10aHJvd2luZyBwYXRocyBhcyBzdWNjZXNzLlxuICAgIGNvbnN0IGV2ZW50TmFtZSA9IFBFUkZPUk1BTkNFX1NES19FVkVOVFMuRVZFTlRTLlNES19VUExPQURfTE9HU1xuICAgIGxldCBzdWNjZXNzID0gdHJ1ZVxuICAgIGxldCBmYWlsdXJlOiBzdHJpbmcgfCB1bmRlZmluZWRcbiAgICAvLyBTdGFnaW5nIGRpciBmb3IgdGhlIGFyY2hpdmUuIENyZWF0ZWQgcGVyIHJ1bjogdGhlIHByZXZpb3VzIGZpeGVkIGB0bXBkaXIoKS9sb2dzLnRhcmBcbiAgICAvLyBuYW1lcyBtZWFudCB0d28gY29uY3VycmVudCB3ZGlvIHJ1bnMgb24gb25lIENJIGhvc3QgY2xvYmJlcmVkIGFuZCB1bmxpbmtlZCBlYWNoXG4gICAgLy8gb3RoZXIncyBhcmNoaXZlcywgYW5kIGEgc291cmNlIGZpbGUgdGhhdCBhbHJlYWR5IGxpdmVkIGluIHRtcGRpciB3YXMgY29waWVkIG9udG9cbiAgICAvLyBpdHNlbGYgYW5kIHRoZW4gZGVsZXRlZCBieSBjbGVhbnVwLlxuICAgIGxldCBzdGFnaW5nRGlyOiBzdHJpbmcgfCB1bmRlZmluZWRcbiAgICBQZXJmb3JtYW5jZVRlc3Rlci5zdGFydChldmVudE5hbWUpXG5cbiAgICB0cnkge1xuICAgICAgICAvLyBpc0F1dG9DYXB0dXJlTG9nc0Rpc2FibGVkIChub3Qgb3B0aW9ucy5kaXNhYmxlQXV0b0NhcHR1cmVMb2dzKSBzbyB0aGUgZGV0YWNoZWRcbiAgICAgICAgLy8gY2xlYW51cCBwcm9jZXNzIFx1MjAxNCB3aGljaCBjYWxscyB0aGlzIHdpdGggbm8gb3B0aW9ucyBcdTIwMTQgc3RpbGwgaG9ub3VycyB0aGUgb3B0LW91dFxuICAgICAgICAvLyB2aWEgdGhlIGVudiB2YXIgdGhlIGxhdW5jaGVyIHB1Ymxpc2hlcy5cbiAgICAgICAgaWYgKGlzQXV0b0NhcHR1cmVMb2dzRGlzYWJsZWQob3B0aW9ucykpIHtcbiAgICAgICAgICAgIHN1Y2Nlc3MgPSBmYWxzZVxuICAgICAgICAgICAgZmFpbHVyZSA9ICdza2lwcGVkOiBkaXNhYmxlQXV0b0NhcHR1cmVMb2dzPXRydWUnXG4gICAgICAgICAgICBCU3RhY2tMb2dnZXIuZGVidWcoJ1NraXBwaW5nIGxvZyB1cGxvYWQsIGF1dG8tY2FwdHVyZSBpcyBkaXNhYmxlZCcpXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdXNlciB8fCAha2V5KSB7XG4gICAgICAgICAgICBzdWNjZXNzID0gZmFsc2VcbiAgICAgICAgICAgIGZhaWx1cmUgPSAnc2tpcHBlZDogbWlzc2luZ19jcmVkZW50aWFscydcbiAgICAgICAgICAgIEJTdGFja0xvZ2dlci5kZWJ1ZygnVXBsb2FkaW5nIGxvZ3MgZmFpbGVkIGR1ZSB0byBubyBjcmVkZW50aWFscycpXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIHN0YWdpbmdEaXIgPSBmcy5ta2R0ZW1wU3luYyhwYXRoLmpvaW4odG1wZGlyKCksICdic3RhY2std2Rpby1sb2dzLScpKVxuICAgICAgICBjb25zdCB0bXBEaXIgPSBzdGFnaW5nRGlyXG4gICAgICAgIGNvbnN0IHRhclBhdGggPSBwYXRoLmpvaW4odG1wRGlyLCAnbG9ncy50YXInKVxuICAgICAgICBjb25zdCB0YXJHelBhdGggPSBwYXRoLmpvaW4odG1wRGlyLCAnbG9ncy50YXIuZ3onKVxuXG4gICAgICAgIC8vIEFyY2hpdmUgZW50cmllcyBhcmUga2V5ZWQgYnkgYmFzZW5hbWUsIHNvIHR3byBzb3VyY2VzIHNoYXJpbmcgb25lIGJhc2VuYW1lIHdvdWxkXG4gICAgICAgIC8vIHNpbGVudGx5IG92ZXJ3cml0ZSBlYWNoIG90aGVyIFx1MjAxNCByZWFjaGFibGUgbm93IHRoYXQgdXNlci1zdXBwbGllZCBjb25maWcgcGF0aHNcbiAgICAgICAgLy8gKGUuZy4gY29uZmlncy93ZGlvLmNvbmYudHMgKyBzaGFyZWQvd2Rpby5jb25mLnRzKSBqb2luIHRoZSBhcmNoaXZlLlxuICAgICAgICAvLyBTYW1lIGhlbHBlciBjb2xsZWN0Q29uZmlnRmlsZXNGb3JVcGxvYWQgdXNlcywgc28gdGhlIHR3byBjYW5ub3QgZGlzYWdyZWUuXG4gICAgICAgIGNvbnN0IHRha2VuTmFtZXMgPSBuZXcgU2V0PHN0cmluZz4oWydsb2dzLnRhcicsICdsb2dzLnRhci5neiddKVxuICAgICAgICBjb25zdCBjb3BpZWRGaWxlTmFtZXM6IHN0cmluZ1tdID0gW11cbiAgICAgICAgY29uc3QgYXJjaGl2ZUFkZEZhaWx1cmVzOiBzdHJpbmdbXSA9IFtdXG4gICAgICAgIGNvbnN0IHVuaXF1ZU5hbWUgPSAoZmlsZVBhdGg6IHN0cmluZyk6IHN0cmluZyA9PiBkZWR1cGVFbnRyeU5hbWUoZmlsZVBhdGgsIHRha2VuTmFtZXMpXG5cbiAgICAgICAgLy8gU0RLLTcyNTA6IHRoZSB1c2VyJ3Mgd2RpbyBjb25maWcgKGFuZCB0aGUgbG9jYWwgZmlsZXMgaXQgaW1wb3J0cyksIGNyZWRlbnRpYWwtc2NydWJiZWQuXG4gICAgICAgIC8vIFNvZnQtZmFpbHVyZSBieSBkZXNpZ24gXHUyMDE0IGEgY29uZmlnIHdlIGNhbm5vdCByZWFkIG9yIGxvY2F0ZSBtdXN0IG5ldmVyIHN0b3AgdGhlXG4gICAgICAgIC8vIGxvZyB1cGxvYWQ7IHRoZSByZWFzb24gaXMgcmVjb3JkZWQgb24gdGhlIGV2ZW50IGluc3RlYWQuXG4gICAgICAgIGNvbnN0IHsgZmlsZXM6IGNvbmZpZ0ZpbGVzLCBmYWlsdXJlczogY29uZmlnRmFpbHVyZXMsIHN0cmF0ZWd5IH0gPSBjb2xsZWN0Q29uZmlnRmlsZXNGb3JVcGxvYWQob3B0aW9ucy5jb25maWcpXG5cbiAgICAgICAgLy8gcGFja2FnZS5qc29uIGdpdmVzIHRyaWFnZSB0aGUgZnJhbWV3b3JrL3NlcnZpY2UgdmVyc2lvbnMsIHdoaWNoIHRoZSBhcmNoaXZlIGNhcnJpZWRcbiAgICAgICAgLy8gYmVmb3JlIHRoaXMgY2hhbmdlLiBJdCBnb2VzIHRocm91Z2ggdGhlIHNhbWUgcmVkYWN0aW9uIGFzIHRoZSBjb25maWdzIHJhdGhlciB0aGFuXG4gICAgICAgIC8vIGJlaW5nIGNvcGllZCB2ZXJiYXRpbTogYHNjcmlwdHNgIHJvdXRpbmVseSBlbWJlZCB0b2tlbnMgKGAtLXRva2VuPWdocF8uLi5gKSwgYW5kIHRoZVxuICAgICAgICAvLyB3YWxrLXVwIGNhbiBzZWxlY3QgYSBtb25vcmVwby1yb290IG1hbmlmZXN0IGJyb2FkZXIgdGhhbiB0aGUgdGVzdCBwcm9qZWN0LiBPcmRpbmFyeVxuICAgICAgICAvLyBkZXBlbmRlbmN5L3ZlcnNpb24gbGluZXMgYXJlIHVuYWZmZWN0ZWQgYnkgdGhlIHNjcnViLlxuICAgICAgICAvLyBzbmFwc2hvdCBiZWZvcmUgcGFja2FnZS5qc29uIGpvaW5zIHRoZSBsaXN0LCBzbyBjb3VudHMgYW5kIG5hbWVzIHN0YXkgaG9uZXN0XG4gICAgICAgIGNvbnN0IGNhcHR1cmVkQ29uZmlnTmFtZXMgPSBjb25maWdGaWxlcy5tYXAoZiA9PiBmLm5hbWUpXG5cbiAgICAgICAgY29uc3QgcGFja2FnZUpzb25QYXRoID0gZmluZFBhY2thZ2VKc29uRm9yVXBsb2FkKClcbiAgICAgICAgaWYgKHBhY2thZ2VKc29uUGF0aCkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBjb25maWdGaWxlcy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogcGF0aC5iYXNlbmFtZShwYWNrYWdlSnNvblBhdGgpLFxuICAgICAgICAgICAgICAgICAgICBzb3VyY2VQYXRoOiBwYWNrYWdlSnNvblBhdGgsXG4gICAgICAgICAgICAgICAgICAgIGNvbnRlbnQ6IHJlZGFjdFNlbnNpdGl2ZUNvbnRlbnQoZnMucmVhZEZpbGVTeW5jKHBhY2thZ2VKc29uUGF0aCwgJ3V0ZjgnKSlcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgfSBjYXRjaCAocGtnRXJyKSB7XG4gICAgICAgICAgICAgICAgY29uZmlnRmFpbHVyZXMucHVzaChgcGFja2FnZS5qc29uOiAkeyhwa2dFcnIgYXMgRXJyb3IpPy5tZXNzYWdlIHx8IFN0cmluZyhwa2dFcnIpfWApXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChjb25zdCBjb25maWdGaWxlIG9mIGNvbmZpZ0ZpbGVzKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGVudHJ5TmFtZSA9IHVuaXF1ZU5hbWUoY29uZmlnRmlsZS5uYW1lKVxuICAgICAgICAgICAgICAgIGZzLndyaXRlRmlsZVN5bmMocGF0aC5qb2luKHRtcERpciwgZW50cnlOYW1lKSwgY29uZmlnRmlsZS5jb250ZW50KVxuICAgICAgICAgICAgICAgIGNvcGllZEZpbGVOYW1lcy5wdXNoKGVudHJ5TmFtZSlcbiAgICAgICAgICAgIH0gY2F0Y2ggKHdyaXRlRXJyKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbXNnID0gKHdyaXRlRXJyIGFzIEVycm9yKT8ubWVzc2FnZSB8fCBTdHJpbmcod3JpdGVFcnIpXG4gICAgICAgICAgICAgICAgY29uZmlnRmFpbHVyZXMucHVzaChgJHtjb25maWdGaWxlLm5hbWV9OiAke21zZ31gKVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIExvZ2dlZCBzZXBhcmF0ZWx5IGZyb20gcGFja2FnZS5qc29uOiBgY29uZmlnRmlsZXNgIGhhcyB0aGUgbWFuaWZlc3QgYXBwZW5kZWQgdG8gaXQsXG4gICAgICAgIC8vIGFuZCBgc3RyYXRlZ3lgIGlzIHVuZGVmaW5lZCBvbiBldmVyeSBmYWlsdXJlIHBhdGgsIHNvIGEgY29tYmluZWQgbGluZSByZWFkc1xuICAgICAgICAvLyBcIkF1dG8tY2FwdHVyZWQgMSBjb25maWcgZmlsZShzKSB2aWEgdW5kZWZpbmVkOiBwYWNrYWdlLmpzb25cIiBcdTIwMTQgaS5lLiBpdCBjbGFpbXMgYVxuICAgICAgICAvLyBjYXB0dXJlIHN1Y2NlZWRlZCBpbiBleGFjdGx5IHRoZSBjYXNlIHdoZXJlIG5vbmUgZGlkLlxuICAgICAgICBpZiAoY2FwdHVyZWRDb25maWdOYW1lcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBCU3RhY2tMb2dnZXIuZGVidWcoYEF1dG8tY2FwdHVyZWQgJHtjYXB0dXJlZENvbmZpZ05hbWVzLmxlbmd0aH0gY29uZmlnIGZpbGUocykgdmlhICR7c3RyYXRlZ3l9OiAke2NhcHR1cmVkQ29uZmlnTmFtZXMuam9pbignLCAnKX1gKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLmRlYnVnKGBObyB3ZGlvIGNvbmZpZyBjYXB0dXJlZCR7c3RyYXRlZ3kgPyBgIChzdHJhdGVneSAke3N0cmF0ZWd5fSlgIDogJyd9YClcbiAgICAgICAgfVxuICAgICAgICBpZiAocGFja2FnZUpzb25QYXRoKSB7XG4gICAgICAgICAgICBCU3RhY2tMb2dnZXIuZGVidWcoYEF1dG8tY2FwdHVyZWQgcGFja2FnZS5qc29uIGZyb20gJHtyZWxhdGl2ZURpclRvQ3dkKHBhdGguZGlybmFtZShwYWNrYWdlSnNvblBhdGgpKX1gKVxuICAgICAgICB9XG4gICAgICAgIGlmIChjb25maWdGYWlsdXJlcy5sZW5ndGggPiAwICYmIGZhaWx1cmUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgLy8gV2FybmluZyBvbmx5IFx1MjAxNCBgc3VjY2Vzc2Agc3RheXMgdHJ1ZSBzbyBhIG1pc3NpbmcgY29uZmlnIG5ldmVyIHJlYWRzIGFzIGFcbiAgICAgICAgICAgIC8vIGZhaWxlZCBsb2cgdXBsb2FkIChzYW1lIGNvbnRyYWN0IGFzIHRoZSBOb2RlIFNESydzIGByZWRhY3Rpb25fZmFpbGVkYCkuXG4gICAgICAgICAgICBmYWlsdXJlID0gYGNvbmZpZ19jYXB0dXJlOiAke2NvbmZpZ0ZhaWx1cmVzLmpvaW4oJzsgJyl9YC5zdWJzdHJpbmcoMCwgMzAwKVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gVGhlIHNlcnZpY2UgbG9nIGlzIHNuYXBzaG90dGVkIExBU1QsIGRlbGliZXJhdGVseS4gRXZlcnl0aGluZyBhYm92ZSAtLSB0aGUgcmVzb2x1dGlvblxuICAgICAgICAvLyBzdHJhdGVneSwgd2hhdCB3YXMgY2FwdHVyZWQsIGFuZCBhbnkgY2FwdHVyZSBmYWlsdXJlcyAtLSBpcyB3cml0dGVuIHRvIHRoYXQgbG9nXG4gICAgICAgIC8vIGZpcnN0LCBzbyBpdCBpcyBpbnNpZGUgdGhlIGNvcHkgdGhhdCBzaGlwcy4gQ29weWluZyBlYXJsaWVyIGlzIHdoeSB0aG9zZSBsaW5lcyB1c2VkXG4gICAgICAgIC8vIHRvIGV4aXN0IG9ubHkgaW4gdGhlIGRldmVsb3BlcidzIGxvY2FsIGZpbGUgYW5kIG5ldmVyIGluIHRoZSBkb3dubG9hZGVkIGJ1bmRsZS5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gT3JkZXJpbmcgYWxvbmUgaXMgbm90IGVub3VnaDogQlN0YWNrTG9nZ2VyIHdyaXRlcyB0aHJvdWdoIGFuIGFzeW5jIFdyaXRlU3RyZWFtLCBzb1xuICAgICAgICAvLyB0aG9zZSBsaW5lcyBhcmUgc3RpbGwgYnVmZmVyZWQgYXQgdGhpcyBwb2ludC4gRmx1c2ggYmVmb3JlIGNvcHlpbmcgb3IgdGhlIHNoaXBwZWRcbiAgICAgICAgLy8gY29weSBpcyBzaWxlbnRseSBtaXNzaW5nIGl0cyB0YWlsICh2ZXJpZmllZCBhZ2FpbnN0IGEgZG93bmxvYWRlZCBidW5kbGUpLlxuICAgICAgICBhd2FpdCBCU3RhY2tMb2dnZXIuZmx1c2hMb2dGaWxlKClcblxuICAgICAgICBjb25zdCBmaWxlc1RvQXJjaGl2ZSA9IFtcbiAgICAgICAgICAgIEJTdGFja0xvZ2dlci5sb2dGaWxlUGF0aCxcbiAgICAgICAgICAgIENMSV9ERUJVR19MT0dTX0ZJTEUsXG4gICAgICAgIF0uZmlsdGVyKChmKTogZiBpcyBzdHJpbmcgPT4gQm9vbGVhbihmKSAmJiBmcy5leGlzdHNTeW5jKGYgYXMgc3RyaW5nKSlcblxuICAgICAgICBmb3IgKGNvbnN0IGYgb2YgZmlsZXNUb0FyY2hpdmUpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZW50cnlOYW1lID0gdW5pcXVlTmFtZShmKVxuICAgICAgICAgICAgICAgIGZzLmNvcHlGaWxlU3luYyhmLCBwYXRoLmpvaW4odG1wRGlyLCBlbnRyeU5hbWUpKVxuICAgICAgICAgICAgICAgIGNvcGllZEZpbGVOYW1lcy5wdXNoKGVudHJ5TmFtZSlcbiAgICAgICAgICAgIH0gY2F0Y2ggKGNvcHlFcnIpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBtc2cgPSAoY29weUVyciBhcyBFcnJvcik/Lm1lc3NhZ2UgfHwgU3RyaW5nKGNvcHlFcnIpXG4gICAgICAgICAgICAgICAgYXJjaGl2ZUFkZEZhaWx1cmVzLnB1c2goYCR7cGF0aC5iYXNlbmFtZShmKX06ICR7bXNnfWApXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYXJjaGl2ZUFkZEZhaWx1cmVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHN1Y2Nlc3MgPSBmYWxzZVxuICAgICAgICAgICAgZmFpbHVyZSA9IGBhcmNoaXZlX2FkZF9mYWlsZWQgWyR7YXJjaGl2ZUFkZEZhaWx1cmVzLmxlbmd0aH1dOiAke2FyY2hpdmVBZGRGYWlsdXJlcy5qb2luKCc7ICcpfWAuc3Vic3RyaW5nKDAsIDMwMClcbiAgICAgICAgfVxuXG4gICAgICAgIEJTdGFja0xvZ2dlci5kZWJ1ZyhgQXV0by1jYXB0dXJlIGFyY2hpdmUgZW50cmllczogJHtjb3BpZWRGaWxlTmFtZXMuam9pbignLCAnKX1gKVxuXG4gICAgICAgIGF3YWl0IGNyZWF0ZShcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBmaWxlOiB0YXJQYXRoLFxuICAgICAgICAgICAgICAgIGN3ZDogdG1wRGlyLFxuICAgICAgICAgICAgICAgIHBvcnRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgICAgIG5vRGlyUmVjdXJzZTogdHJ1ZVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNvcGllZEZpbGVOYW1lc1xuICAgICAgICApXG5cbiAgICAgICAgYXdhaXQgbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgc291cmNlID0gZnMuY3JlYXRlUmVhZFN0cmVhbSh0YXJQYXRoKVxuICAgICAgICAgICAgY29uc3QgZGVzdCA9IGZzLmNyZWF0ZVdyaXRlU3RyZWFtKHRhckd6UGF0aClcbiAgICAgICAgICAgIGNvbnN0IGd6aXAgPSB6bGliLmNyZWF0ZUd6aXAoeyBsZXZlbDogMSB9KVxuXG4gICAgICAgICAgICBzb3VyY2UucGlwZShnemlwKS5waXBlKGRlc3QpXG4gICAgICAgICAgICBkZXN0Lm9uKCdmaW5pc2gnLCByZXNvbHZlKVxuICAgICAgICAgICAgZGVzdC5vbignZXJyb3InLCByZWplY3QpXG4gICAgICAgIH0pXG5cbiAgICAgICAgY29uc3QgZm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKVxuICAgICAgICAvLyBvcGVuQXNCbG9iIChOb2RlID49MjApIHJldHVybnMgYSBCbG9iIGJhY2tlZCBieSBhIGZpbGUgZGVzY3JpcHRvciBcdTIwMTQgdW5kaWNpXG4gICAgICAgIC8vIHN0cmVhbXMgZnJvbSBkaXNrIGR1cmluZyB0aGUgdXBsb2FkIGluc3RlYWQgb2YgbWF0ZXJpYWxpc2luZyB0aGUgZnVsbCBhcmNoaXZlXG4gICAgICAgIC8vIGluIFY4IGhlYXAgKHdoaWNoIHJlYWRGaWxlU3luYyArIG5ldyBCbG9iKFtCdWZmZXJdKSB3b3VsZCBkbyB0d2ljZSkuXG4gICAgICAgIC8vIE5vZGUgMTguMjAgKHN0aWxsIHN1cHBvcnRlZCBwZXIgYGVuZ2luZXNgKSBsYWNrcyBmcy5vcGVuQXNCbG9iLCBzbyBmYWxsIGJhY2tcbiAgICAgICAgLy8gdG8gcmVhZGluZyB0aGUgKHNtYWxsKSBsb2cgYXJjaGl2ZSBpbnRvIGEgQmxvYiB0aGVyZS5cbiAgICAgICAgY29uc3QgZmlsZSA9IHR5cGVvZiBmcy5vcGVuQXNCbG9iID09PSAnZnVuY3Rpb24nXG4gICAgICAgICAgICA/IGF3YWl0IGZzLm9wZW5Bc0Jsb2IodGFyR3pQYXRoLCB7IHR5cGU6ICdhcHBsaWNhdGlvbi94LWd6aXAnIH0pXG4gICAgICAgICAgICA6IG5ldyBCbG9iKFtmcy5yZWFkRmlsZVN5bmModGFyR3pQYXRoKV0sIHsgdHlwZTogJ2FwcGxpY2F0aW9uL3gtZ3ppcCcgfSlcbiAgICAgICAgZm9ybURhdGEuYXBwZW5kKCdkYXRhJywgZmlsZSwgJ2xvZ3MudGFyLmd6JylcbiAgICAgICAgZm9ybURhdGEuYXBwZW5kKCdjbGllbnRCdWlsZFV1aWQnLCBjbGllbnRCdWlsZFV1aWQpXG5cbiAgICAgICAgY29uc3QgYXV0aCA9IEJ1ZmZlci5mcm9tKGAke3VzZXJ9OiR7a2V5fWApLnRvU3RyaW5nKCdiYXNlNjQnKVxuICAgICAgICBjb25zdCByZXF1ZXN0T3B0aW9uczogUmVxdWVzdEluaXQgPSB7XG4gICAgICAgICAgICBib2R5OiBmb3JtRGF0YSBhcyBCb2R5SW5pdCxcbiAgICAgICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgICAgICAnQXV0aG9yaXphdGlvbic6IGBCYXNpYyAke2F1dGh9YFxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBub2RlUmVxdWVzdChcbiAgICAgICAgICAgICdQT1NUJywgVVBMT0FEX0xPR1NfRU5EUE9JTlQsIHJlcXVlc3RPcHRpb25zLCBBUElVdGlscy5VUExPQURfTE9HU19BRERSRVNTXG4gICAgICAgIClcblxuICAgICAgICAvLyBTdGFnaW5nIGRpciAoYXJjaGl2ZSArIGV2ZXJ5IGNvcGllZC9yZWRhY3RlZCBlbnRyeSkgaXMgcmVtb3ZlZCBpbiBgZmluYWxseWAuXG5cbiAgICAgICAgLy8gRGVsZXRlIHRoZSBTREsgQ0xJIGxvZyBmaWxlIGFmdGVyIHVwbG9hZFxuICAgICAgICBpZiAoZnMuZXhpc3RzU3luYyhDTElfREVCVUdfTE9HU19GSUxFKSkge1xuICAgICAgICAgICAgZnMudW5saW5rU3luYyhDTElfREVCVUdfTE9HU19GSUxFKVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFyZXNwb25zZSkge1xuICAgICAgICAgICAgLy8gbm9kZVJlcXVlc3Qgc3dhbGxvd3MgZXJyb3JzIGZvciB0aGUgbG9nLXVwbG9hZCBwYXRoIGFuZCByZXR1cm5zIHVuZGVmaW5lZDtcbiAgICAgICAgICAgIC8vIHJlY29yZCB0aGUgc2lsZW50IHVwbG9hZCBmYWlsdXJlIG9uIHRoZSBtZXRyaWMuXG4gICAgICAgICAgICBzdWNjZXNzID0gZmFsc2VcbiAgICAgICAgICAgIGZhaWx1cmUgPSAndXBsb2FkX25vX3Jlc3BvbnNlJ1xuICAgICAgICB9IGVsc2UgaWYgKHJlc3BvbnNlLnN0YXR1cyAmJiByZXNwb25zZS5zdGF0dXMgIT09ICdzdWNjZXNzJykge1xuICAgICAgICAgICAgLy8gU2VydmVyLXNpZGUgcmVqZWN0aW9uIChlLmcuIFwiRmlsZSBub3QgYXR0YWNoZWRcIikgXHUyMDE0IHJlc3BvbnNlIGlzIHRydXRoeVxuICAgICAgICAgICAgLy8gYnV0IHRoZSB1cGxvYWQgZGlkbid0IGFjdHVhbGx5IGxhbmQuXG4gICAgICAgICAgICBzdWNjZXNzID0gZmFsc2VcbiAgICAgICAgICAgIGZhaWx1cmUgPSBgdXBsb2FkX3N0YXR1czogJHtyZXNwb25zZS5zdGF0dXN9JHtyZXNwb25zZS5tZXNzYWdlID8gJyAtICcgKyBTdHJpbmcocmVzcG9uc2UubWVzc2FnZSkuc2xpY2UoMCwgMjAwKSA6ICcnfWBcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXNwb25zZVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHN1Y2Nlc3MgPSBmYWxzZVxuICAgICAgICBmYWlsdXJlID0gYHVwbG9hZExvZ3MgZXhjZXB0aW9uOiAke2dldEVycm9yU3RyaW5nKGVycm9yKX1gXG4gICAgICAgIEJTdGFja0xvZ2dlci5lcnJvcihgRXJyb3Igd2hpbGUgdXBsb2FkaW5nIGxvZ3M6ICR7Z2V0RXJyb3JTdHJpbmcoZXJyb3IpfWApXG4gICAgICAgIHJldHVybiBudWxsXG4gICAgfSBmaW5hbGx5IHtcbiAgICAgICAgaWYgKHN0YWdpbmdEaXIpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgZnMucm1TeW5jKHN0YWdpbmdEaXIsIHsgcmVjdXJzaXZlOiB0cnVlLCBmb3JjZTogdHJ1ZSB9KVxuICAgICAgICAgICAgfSBjYXRjaCAoY2xlYW51cEVycikge1xuICAgICAgICAgICAgICAgIEJTdGFja0xvZ2dlci5kZWJ1ZyhgRmFpbGVkIHRvIGNsZWFuIHVwIGxvZyBzdGFnaW5nIGRpciAke3N0YWdpbmdEaXJ9OiAke2dldEVycm9yU3RyaW5nKGNsZWFudXBFcnIpfWApXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgUGVyZm9ybWFuY2VUZXN0ZXIuZW5kKGV2ZW50TmFtZSwgc3VjY2VzcywgZmFpbHVyZSlcbiAgICB9XG59XG5cbmV4cG9ydCBjb25zdCBpc09iamVjdCA9IChvYmplY3Q6IHVua25vd24pID0+IHtcbiAgICByZXR1cm4gb2JqZWN0ICE9PSBudWxsICYmIHR5cGVvZiBvYmplY3QgPT09ICdvYmplY3QnICYmICFBcnJheS5pc0FycmF5KG9iamVjdClcbn1cblxuZXhwb3J0IGNvbnN0IE9iamVjdHNBcmVFcXVhbCA9IChvYmplY3QxOiBvYmplY3QsIG9iamVjdDI6IG9iamVjdCkgPT4ge1xuICAgIGNvbnN0IG9iamVjdEtleXMxID0gT2JqZWN0LmtleXMob2JqZWN0MSlcbiAgICBjb25zdCBvYmplY3RLZXlzMiA9IE9iamVjdC5rZXlzKG9iamVjdDIpXG4gICAgaWYgKG9iamVjdEtleXMxLmxlbmd0aCAhPT0gb2JqZWN0S2V5czIubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgICBmb3IgKGNvbnN0IGtleSBvZiBvYmplY3RLZXlzMSkge1xuICAgICAgICBjb25zdCB2YWx1ZTEgPSBvYmplY3QxW2tleSBhcyBrZXlvZiB0eXBlb2Ygb2JqZWN0MV1cbiAgICAgICAgY29uc3QgdmFsdWUyID0gb2JqZWN0MltrZXkgYXMga2V5b2YgdHlwZW9mIG9iamVjdDFdXG4gICAgICAgIGNvbnN0IGlzQm90aEFyZU9iamVjdHMgPSBpc09iamVjdCh2YWx1ZTEpICYmIGlzT2JqZWN0KHZhbHVlMilcbiAgICAgICAgaWYgKChpc0JvdGhBcmVPYmplY3RzICYmICFPYmplY3RzQXJlRXF1YWwodmFsdWUxLCB2YWx1ZTIpKSB8fCAoIWlzQm90aEFyZU9iamVjdHMgJiYgdmFsdWUxICE9PSB2YWx1ZTIpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZVxufVxuXG5leHBvcnQgY29uc3QgZ2V0UGxhdGZvcm1WZXJzaW9uID0gbzExeUVycm9ySGFuZGxlcihmdW5jdGlvbiBnZXRQbGF0Zm9ybVZlcnNpb24oY2FwczogV2ViZHJpdmVySU8uQ2FwYWJpbGl0aWVzLCB1c2VyQ2FwczogV2ViZHJpdmVySU8uQ2FwYWJpbGl0aWVzKSB7XG4gICAgaWYgKCFjYXBzICYmICF1c2VyQ2Fwcykge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkXG4gICAgfVxuXG4gICAgY29uc3QgYnN0YWNrT3B0aW9ucyA9ICh1c2VyQ2Fwcyk/LlsnYnN0YWNrOm9wdGlvbnMnXVxuICAgIGNvbnN0IGtleXMgPSBbJ3BsYXRmb3JtVmVyc2lvbicsICdwbGF0Zm9ybV92ZXJzaW9uJywgJ29zVmVyc2lvbicsICdvc192ZXJzaW9uJ11cblxuICAgIGZvciAoY29uc3Qga2V5IG9mIGtleXMpIHtcbiAgICAgICAgaWYgKGNhcHM/LltrZXkgYXMga2V5b2YgV2ViZHJpdmVySU8uQ2FwYWJpbGl0aWVzXSkge1xuICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLmRlYnVnKGBHb3QgJHtrZXl9IGZyb20gZHJpdmVyIGNhcHNgKVxuICAgICAgICAgICAgcmV0dXJuIFN0cmluZyhjYXBzPy5ba2V5IGFzIGtleW9mIFdlYmRyaXZlcklPLkNhcGFiaWxpdGllc10pXG4gICAgICAgIH0gZWxzZSBpZiAoYnN0YWNrT3B0aW9ucyAmJiBic3RhY2tPcHRpb25zPy5ba2V5IGFzIGtleW9mIENhcGFiaWxpdGllcy5Ccm93c2VyU3RhY2tDYXBhYmlsaXRpZXNdKSB7XG4gICAgICAgICAgICBCU3RhY2tMb2dnZXIuZGVidWcoYEdvdCAke2tleX0gZnJvbSB1c2VyIGJzdGFjayBvcHRpb25zYClcbiAgICAgICAgICAgIHJldHVybiBTdHJpbmcoYnN0YWNrT3B0aW9ucz8uW2tleSBhcyBrZXlvZiBDYXBhYmlsaXRpZXMuQnJvd3NlclN0YWNrQ2FwYWJpbGl0aWVzXSlcbiAgICAgICAgfSBlbHNlIGlmICh1c2VyQ2Fwc1trZXkgYXMga2V5b2YgV2ViZHJpdmVySU8uQ2FwYWJpbGl0aWVzXSkge1xuICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLmRlYnVnKGBHb3QgJHtrZXl9IGZyb20gdXNlciBjYXBzYClcbiAgICAgICAgICAgIHJldHVybiBTdHJpbmcodXNlckNhcHNba2V5IGFzIGtleW9mIFdlYmRyaXZlcklPLkNhcGFiaWxpdGllc10pXG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZFxufSlcblxuLyoqXG4gKiBSZXNvbHZlIGEgc3RhYmxlLCBodW1hbi1yZWFkYWJsZSBkZXZpY2UgaWRlbnRpZmllciBmb3IgdGhlXG4gKiBgZGV2aWNlYCBmaWVsZCBvbiB0ZXN0X3J1biBpbnRlZ3JhdGlvbnMgcGF5bG9hZHMuXG4gKlxuICogVGVzdEh1YiBkZWR1cGVzIHRlc3RfcnVucyBieSBhIGhhc2ggdGhhdCBpbmNsdWRlcyBgZGV2aWNlYC4gRm9yXG4gKiBBcHAtQXV0b21hdGUgZmxvd3MgdGhhdCBwYXNzIGEgcmVnZXggZGV2aWNlIHJlcXVlc3QgKGUuZy4gYC4qUGl4ZWwuKmApXG4gKiBhY3Jvc3MgbXVsdGlwbGUgcGxhdGZvcm1zLCB0aGUgU0RLIHByZXZpb3VzbHkgc2VudCB0aGUgaW5wdXQgcmVnZXhcbiAqIHN0cmluZywgY2F1c2luZyB0d28gcGFyYWxsZWwgc2Vzc2lvbnMgb24gcGh5c2ljYWxseSBkaWZmZXJlbnQgZGV2aWNlc1xuICogdG8gY29sbGlkZSBvbiB0aGUgaGFzaCBhbmQgbWVyZ2UuIFRoaXMgaGVscGVyIHByZWZlcnMgdGhlIEFwcGl1bVxuICogc2VydmVyLXJlc29sdmVkIGZpZWxkcyAoYGRldmljZU1vZGVsYCAvIGBhcHBpdW06ZGV2aWNlTW9kZWxgKSBiZWZvcmVcbiAqIGZhbGxpbmcgYmFjayB0byB0aGUgcmVxdWVzdGVkIGNhcGFiaWxpdGllcy5cbiAqXG4gKiBNdWx0aXJlbW90ZTogYGRyaXZlckNhcHNgIGZvciBhIGBNdWx0aVJlbW90ZUJyb3dzZXJgIGlzIGEgbWFwIG9mXG4gKiBge2luc3RhbmNlTmFtZTogV2ViZHJpdmVySU8uQ2FwYWJpbGl0aWVzLCBcdTIwMjZ9YCByYXRoZXIgdGhhbiBmbGF0IGNhcHM7XG4gKiB0aGUgaGVscGVyIGRldGVjdHMgdGhhdCBzaGFwZSBhbmQgd2Fsa3MgZWFjaCBpbnN0YW5jZS5cbiAqXG4gKiBAcGFyYW0gZHJpdmVyQ2FwcyAtIGxpdmUgZHJpdmVyIGNhcGFiaWxpdGllcyAoYGJyb3dzZXIuY2FwYWJpbGl0aWVzYClcbiAqICAgICAgICAgICAgICAgICAgICAgd2hlcmUgQXBwaXVtIHNlcnZlci1yZXNvbHZlZCBmaWVsZHMgYXJlIHBvcHVsYXRlZFxuICogQHBhcmFtIHJlcXVlc3RlZENhcHMgLSB1c2VyLXJlcXVlc3RlZCBjYXBhYmlsaXRpZXMgKHJ1bm5lciBjYXBzIC8geW1sKVxuICogICAgICAgICAgICAgICAgICAgICAgICB1c2VkIGFzIGEgZmFsbGJhY2tcbiAqL1xuZXhwb3J0IGNvbnN0IGdldFJlc29sdmVkRGV2aWNlTmFtZSA9IG8xMXlFcnJvckhhbmRsZXIoZnVuY3Rpb24gZ2V0UmVzb2x2ZWREZXZpY2VOYW1lKFxuICAgIGRyaXZlckNhcHM/OiBXZWJkcml2ZXJJTy5DYXBhYmlsaXRpZXMgfCBSZWNvcmQ8c3RyaW5nLCB7IGNhcGFiaWxpdGllcz86IFdlYmRyaXZlcklPLkNhcGFiaWxpdGllcyB9PixcbiAgICByZXF1ZXN0ZWRDYXBzPzogV2ViZHJpdmVySU8uQ2FwYWJpbGl0aWVzIHwgUmVjb3JkPHN0cmluZywgeyBjYXBhYmlsaXRpZXM/OiBXZWJkcml2ZXJJTy5DYXBhYmlsaXRpZXMgfT4sXG4pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGZsYXR0ZW5NdWx0aXJlbW90ZSA9IChcbiAgICAgICAgY2FwczogV2ViZHJpdmVySU8uQ2FwYWJpbGl0aWVzIHwgUmVjb3JkPHN0cmluZywgeyBjYXBhYmlsaXRpZXM/OiBXZWJkcml2ZXJJTy5DYXBhYmlsaXRpZXMgfT4gfCB1bmRlZmluZWQsXG4gICAgKTogV2ViZHJpdmVySU8uQ2FwYWJpbGl0aWVzW10gPT4ge1xuICAgICAgICBpZiAoIWNhcHMpIHtyZXR1cm4gW119XG4gICAgICAgIGNvbnN0IG9iaiA9IGNhcHMgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgICAgICAgaWYgKG9iai5kZXZpY2VNb2RlbCB8fCBvYmpbJ2FwcGl1bTpkZXZpY2VNb2RlbCddIHx8IG9iai5kZXZpY2VOYW1lIHx8IG9ialsnYnN0YWNrOm9wdGlvbnMnXSkge1xuICAgICAgICAgICAgLy8gbG9va3MgbGlrZSBmbGF0IGNhcHNcbiAgICAgICAgICAgIHJldHVybiBbY2FwcyBhcyBXZWJkcml2ZXJJTy5DYXBhYmlsaXRpZXNdXG4gICAgICAgIH1cbiAgICAgICAgLy8gbG9va3MgbGlrZSBhIG11bHRpcmVtb3RlIG1hcDoge2luc3RhbmNlTmFtZToge2NhcGFiaWxpdGllczogey4uLn19fVxuICAgICAgICByZXR1cm4gT2JqZWN0LnZhbHVlcyhvYmopXG4gICAgICAgICAgICAuZmlsdGVyKCh2KTogdiBpcyB7IGNhcGFiaWxpdGllcz86IFdlYmRyaXZlcklPLkNhcGFiaWxpdGllcyB9ID0+XG4gICAgICAgICAgICAgICAgdiAhPT0gbnVsbCAmJiB0eXBlb2YgdiA9PT0gJ29iamVjdCcgJiYgJ2NhcGFiaWxpdGllcycgaW4gKHYgYXMgb2JqZWN0KSlcbiAgICAgICAgICAgIC5tYXAodiA9PiB2LmNhcGFiaWxpdGllcyBhcyBXZWJkcml2ZXJJTy5DYXBhYmlsaXRpZXMpXG4gICAgICAgICAgICAuZmlsdGVyKEJvb2xlYW4pXG4gICAgfVxuXG4gICAgY29uc3Qgc291cmNlczogV2ViZHJpdmVySU8uQ2FwYWJpbGl0aWVzW10gPSBbXG4gICAgICAgIC4uLmZsYXR0ZW5NdWx0aXJlbW90ZShkcml2ZXJDYXBzKSxcbiAgICAgICAgLi4uZmxhdHRlbk11bHRpcmVtb3RlKHJlcXVlc3RlZENhcHMpLFxuICAgIF1cbiAgICBpZiAoIXNvdXJjZXMubGVuZ3RoKSB7cmV0dXJuIHVuZGVmaW5lZH1cblxuICAgIGNvbnN0IHBpY2tTdHJpbmcgPSAob2JqOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZCwga2V5OiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQgPT4ge1xuICAgICAgICBjb25zdCB2ID0gb2JqPy5ba2V5XVxuICAgICAgICByZXR1cm4gdHlwZW9mIHYgPT09ICdzdHJpbmcnICYmIHYubGVuZ3RoID4gMCA/IHYgOiB1bmRlZmluZWRcbiAgICB9XG4gICAgLy8gUHJlY2VkZW5jZTogcHJlZmVyIEFwcGl1bSBzZXJ2ZXItcmVzb2x2ZWQgZGV2aWNlTW9kZWw7IGZhbGwgYmFjayB0aHJvdWdoXG4gICAgLy8gcmVxdWVzdGVkIGNhcCB2YXJpYW50cy4gYGJzdGFjazpvcHRpb25zLmRldmljZU5hbWVgIGlzIHRoZSB1c2VyJ3MgcmVnZXhcbiAgICAvLyBmb3IgQXBwLUF1dG9tYXRlIHJ1bnMsIGtlcHQgYXMgYSBmYWxsYmFjayBmb3IgdGhlIG5vbi1yZXNvbHZlZCBjYXNlLlxuICAgIGNvbnN0IHBhdGhzOiBBcnJheTwoYzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pID0+IHN0cmluZyB8IHVuZGVmaW5lZD4gPSBbXG4gICAgICAgIGMgPT4gcGlja1N0cmluZyhjLCAnZGV2aWNlTW9kZWwnKSxcbiAgICAgICAgYyA9PiBwaWNrU3RyaW5nKGMsICdhcHBpdW06ZGV2aWNlTW9kZWwnKSxcbiAgICAgICAgYyA9PiBwaWNrU3RyaW5nKGNbJ2JzdGFjazpvcHRpb25zJ10gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQsICdkZXZpY2VOYW1lJyksXG4gICAgICAgIGMgPT4gcGlja1N0cmluZyhjLCAnYXBwaXVtOmRldmljZU5hbWUnKSxcbiAgICAgICAgYyA9PiBwaWNrU3RyaW5nKGMsICdkZXZpY2VOYW1lJyksXG4gICAgXVxuICAgIGZvciAoY29uc3QgcGF0aCBvZiBwYXRocykge1xuICAgICAgICBmb3IgKGNvbnN0IHNyYyBvZiBzb3VyY2VzKSB7XG4gICAgICAgICAgICBjb25zdCB2ID0gcGF0aChzcmMgYXMgdW5rbm93biBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilcbiAgICAgICAgICAgIGlmICh2KSB7cmV0dXJuIHZ9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZFxufSlcblxuZXhwb3J0IGNvbnN0IGdldEJhc2ljQXV0aEhlYWRlciA9ICh1c2VybmFtZTogc3RyaW5nLCBwYXNzd29yZDogc3RyaW5nKSA9PiB7XG4gICAgY29uc3QgZW5jb2RlZEF1dGggPSBCdWZmZXIuZnJvbShgJHt1c2VybmFtZX06JHtwYXNzd29yZH1gLCAndXRmOCcpLnRvU3RyaW5nKCdiYXNlNjQnKVxuICAgIHJldHVybiBgQmFzaWMgJHtlbmNvZGVkQXV0aH1gXG59XG5cbmV4cG9ydCBjb25zdCBpc09iamVjdEVtcHR5ID0gKG9iamVjdE5hbWU6IHVua25vd24pID0+IHtcbiAgICByZXR1cm4gKFxuICAgICAgICBvYmplY3ROYW1lICYmXG4gICAgICAgIE9iamVjdC5rZXlzKG9iamVjdE5hbWUpLmxlbmd0aCA9PT0gMCAmJlxuICAgICAgICBvYmplY3ROYW1lLmNvbnN0cnVjdG9yID09PSBPYmplY3RcbiAgICApXG59XG5cbmV4cG9ydCBjb25zdCBnZXRFcnJvclN0cmluZyA9IChlcnI6IHVua25vd24pID0+IHtcbiAgICBpZiAoIWVycikge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkXG4gICAgfVxuICAgIGlmICh0eXBlb2YgZXJyID09PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm4gIGVyciAvLyB3b3JrcywgYGVgIG5hcnJvd2VkIHRvIHN0cmluZ1xuICAgIH0gZWxzZSBpZiAoZXJyIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIGVyci5tZXNzYWdlIC8vIHdvcmtzLCBgZWAgbmFycm93ZWQgdG8gRXJyb3JcbiAgICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0cnVuY2F0ZVN0cmluZyhmaWVsZDogc3RyaW5nLCB0cnVuY2F0ZVNpemVJbkJ5dGVzOiBudW1iZXIpOiBzdHJpbmcge1xuICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGJ1ZmZlclNpemVJbkJ5dGVzID0gQnVmZmVyLmZyb20oR0lUX01FVEFfREFUQV9UUlVOQ0FURUQpLmxlbmd0aFxuXG4gICAgICAgIGNvbnN0IGZpZWxkQnVmZmVyT2JqID0gQnVmZmVyLmZyb20oZmllbGQpXG4gICAgICAgIGNvbnN0IGxlbk9mRmllbGRCdWZmZXJPYmogPSBmaWVsZEJ1ZmZlck9iai5sZW5ndGhcbiAgICAgICAgY29uc3QgZmluYWxMZW4gPSBNYXRoLmNlaWwobGVuT2ZGaWVsZEJ1ZmZlck9iaiAtIHRydW5jYXRlU2l6ZUluQnl0ZXMgLSBidWZmZXJTaXplSW5CeXRlcylcbiAgICAgICAgaWYgKGZpbmFsTGVuID4gMCkge1xuICAgICAgICAgICAgY29uc3QgdHJ1bmNhdGVkU3RyaW5nID0gZmllbGRCdWZmZXJPYmouc3ViYXJyYXkoMCwgZmluYWxMZW4pLnRvU3RyaW5nKCkgKyBHSVRfTUVUQV9EQVRBX1RSVU5DQVRFRFxuICAgICAgICAgICAgcmV0dXJuIHRydW5jYXRlZFN0cmluZ1xuICAgICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgQlN0YWNrTG9nZ2VyLmRlYnVnKGBFcnJvciB3aGlsZSB0cnVuY2F0aW5nIGZpZWxkLCBub3RoaW5nIHdhcyB0cnVuY2F0ZWQgaGVyZTogJHtlcnJvcn1gKVxuICAgIH1cbiAgICByZXR1cm4gZmllbGRcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFNpemVPZkpzb25PYmplY3RJbkJ5dGVzKGpzb25EYXRhOiBHaXRNZXRhRGF0YSk6IG51bWJlciB7XG4gICAgdHJ5IHtcbiAgICAgICAgY29uc3QgYnVmZmVyID0gQnVmZmVyLmZyb20oSlNPTi5zdHJpbmdpZnkoanNvbkRhdGEpKVxuXG4gICAgICAgIHJldHVybiBidWZmZXIubGVuZ3RoXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgQlN0YWNrTG9nZ2VyLmRlYnVnKGBTb21ldGhpbmcgd2VudCB3cm9uZyB3aGlsZSBjYWxjdWxhdGluZyBzaXplIG9mIEpTT04gb2JqZWN0OiAke2Vycm9yfWApXG4gICAgfVxuXG4gICAgcmV0dXJuIC0xXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjaGVja0FuZFRydW5jYXRlVkNTSW5mbyhnaXRNZXRhRGF0YTogR2l0TWV0YURhdGEpOiBHaXRNZXRhRGF0YSB7XG4gICAgY29uc3QgZ2l0TWV0YURhdGFTaXplSW5CeXRlcyA9IGdldFNpemVPZkpzb25PYmplY3RJbkJ5dGVzKGdpdE1ldGFEYXRhKVxuXG4gICAgaWYgKGdpdE1ldGFEYXRhU2l6ZUluQnl0ZXMgJiYgZ2l0TWV0YURhdGFTaXplSW5CeXRlcyA+IE1BWF9HSVRfTUVUQV9EQVRBX1NJWkVfSU5fQllURVMpIHtcbiAgICAgICAgY29uc3QgdHJ1bmNhdGVTaXplID0gZ2l0TWV0YURhdGFTaXplSW5CeXRlcyAtIE1BWF9HSVRfTUVUQV9EQVRBX1NJWkVfSU5fQllURVNcbiAgICAgICAgY29uc3QgdHJ1bmNhdGVkQ29tbWl0TWVzc2FnZSA9IHRydW5jYXRlU3RyaW5nKGdpdE1ldGFEYXRhLmNvbW1pdF9tZXNzYWdlLCB0cnVuY2F0ZVNpemUpXG4gICAgICAgIGdpdE1ldGFEYXRhLmNvbW1pdF9tZXNzYWdlID0gdHJ1bmNhdGVkQ29tbWl0TWVzc2FnZVxuICAgICAgICBCU3RhY2tMb2dnZXIuaW5mbyhgVGhlIGNvbW1pdCBoYXMgYmVlbiB0cnVuY2F0ZWQuIFNpemUgb2YgY29tbWl0IGFmdGVyIHRydW5jYXRpb24gaXMgJHsgZ2V0U2l6ZU9mSnNvbk9iamVjdEluQnl0ZXMoZ2l0TWV0YURhdGEpIC8gMTAyNCB9IEtCYClcbiAgICB9XG5cbiAgICByZXR1cm4gZ2l0TWV0YURhdGFcbn1cblxuZXhwb3J0IGNvbnN0IGhhc0Jyb3dzZXJOYW1lID0gKGNhcDogQ2FwYWJpbGl0aWVzLldlYmRyaXZlcklPQ29uZmlnKTogYm9vbGVhbiA9PiB7XG4gICAgaWYgKCFjYXAgfHwgIWNhcC5jYXBhYmlsaXRpZXMpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICAgIGNvbnN0IGJyb3dzZXJTdGFja0NhcGFiaWxpdGllcyA9IGNhcC5jYXBhYmlsaXRpZXMgYXMgQ2FwYWJpbGl0aWVzLkJyb3dzZXJTdGFja0NhcGFiaWxpdGllc1xuICAgIHJldHVybiBicm93c2VyU3RhY2tDYXBhYmlsaXRpZXMuYnJvd3Nlck5hbWUgIT09IHVuZGVmaW5lZFxufVxuXG5leHBvcnQgY29uc3QgaXNWYWxpZENhcHNGb3JIZWFsaW5nID0gKGNhcHM6IFdlYmRyaXZlcklPLkNhcGFiaWxpdGllcyk6IGJvb2xlYW4gPT4ge1xuXG4gICAgLy8gR2V0IGFsbCBjYXBhYmlsaXR5IHZhbHVlc1xuICAgIGNvbnN0IGNhcFZhbHVlcyA9IE9iamVjdC52YWx1ZXMoY2FwcylcblxuICAgIC8vIENoZWNrIGlmIHRoZXJlIGFyZSBhbnkgY2FwYWJpbGl0aWVzIGFuZCBpZiBhdCBsZWFzdCBvbmUgaGFzIGEgYnJvd3NlciBuYW1lXG4gICAgcmV0dXJuIGNhcFZhbHVlcy5sZW5ndGggPiAwICYmIGNhcFZhbHVlcy5zb21lKGhhc0Jyb3dzZXJOYW1lKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNUdXJib1NjYWxlKG9wdGlvbnM6IChCcm93c2Vyc3RhY2tDb25maWcgJiBCcm93c2Vyc3RhY2tPcHRpb25zKSB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBCb29sZWFuKG9wdGlvbnM/LnR1cmJvU2NhbGUpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRPYnNlcnZhYmlsaXR5UHJvZHVjdChvcHRpb25zOiAoQnJvd3NlcnN0YWNrQ29uZmlnICYgQnJvd3NlcnN0YWNrT3B0aW9ucykgfCB1bmRlZmluZWQsIGlzQXBwQXV0b21hdGU6IGJvb2xlYW4gfCB1bmRlZmluZWQpOiBzdHJpbmcge1xuICAgIHJldHVybiBpc0FwcEF1dG9tYXRlXG4gICAgICAgID8gJ2FwcC1hdXRvbWF0ZSdcbiAgICAgICAgOiAoaXNUdXJib1NjYWxlKG9wdGlvbnMpID8gJ3R1cmJvc2NhbGUnIDogJ2F1dG9tYXRlJylcbn1cblxudHlwZSBQb2xsaW5nUmVzdWx0ID0ge1xuICAgIGRhdGE6IGFueTtcbiAgICBoZWFkZXJzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICAgIG1lc3NhZ2U/OiBzdHJpbmc7IC8vIE9wdGlvbmFsIG1lc3NhZ2UgZm9yIHRpbWVvdXQgY2FzZXNcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHBvbGxBcGkoXG4gICAgdXJsOiBzdHJpbmcsXG4gICAgcGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICAgIGhlYWRlcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4sXG4gICAgdXBwZXJMaW1pdDogbnVtYmVyLFxuICAgIHN0YXJ0VGltZSA9IERhdGUubm93KClcbik6IFByb21pc2U8UG9sbGluZ1Jlc3VsdD4ge1xuICAgIHBhcmFtcy50aW1lc3RhbXAgPSBNYXRoLnJvdW5kKERhdGUubm93KCkgLyAxMDAwKVxuICAgIEJTdGFja0xvZ2dlci5kZWJ1ZyhgY3VycmVudCB0aW1lc3RhbXAgJHtwYXJhbXMudGltZXN0YW1wfWApXG5cbiAgICB0cnkge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IG1ha2VHZXRSZXF1ZXN0KHVybCwgcGFyYW1zLCBoZWFkZXJzKVxuICAgICAgICBjb25zdCByZXNwb25zZURhdGEgPSBhd2FpdCByZXNwb25zZS5qc29uKClcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGRhdGE6IHJlc3BvbnNlRGF0YSxcbiAgICAgICAgICAgIGhlYWRlcnM6IHJlc3BvbnNlLmhlYWRlcnMsXG4gICAgICAgICAgICBtZXNzYWdlOiAnUG9sbGluZyBzdWNjZWVkZWQuJyxcbiAgICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgICAgaWYgKGVycm9yLnJlc3BvbnNlICYmIGVycm9yLnJlc3BvbnNlLnN0YXR1cyA9PT0gNDA0KSB7XG4gICAgICAgICAgICBjb25zdCBuZXh0UG9sbFRpbWUgPSBwYXJzZUludChlcnJvci5yZXNwb25zZS5oZWFkZXJzLmdldCgnbmV4dF9wb2xsX3RpbWUnKSwgMTApICogMTAwMFxuICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLmRlYnVnKGB0aW1lSW5NaWxsaXMgJHtuZXh0UG9sbFRpbWV9YClcblxuICAgICAgICAgICAgaWYgKGlzTmFOKG5leHRQb2xsVGltZSkpIHtcbiAgICAgICAgICAgICAgICBCU3RhY2tMb2dnZXIud2FybignSW52YWxpZCBvciBtaXNzaW5nIGBuZXh0UG9sbFRpbWVgIGhlYWRlci4gU3RvcHBpbmcgcG9sbGluZy4nKVxuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGE6IHt9LFxuICAgICAgICAgICAgICAgICAgICBoZWFkZXJzOiBlcnJvci5yZXNwb25zZS5oZWFkZXJzLFxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiAnSW52YWxpZCBuZXh0UG9sbFRpbWUgaGVhZGVyIHZhbHVlLiBQb2xsaW5nIHN0b3BwZWQuJyxcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lID0gbmV4dFBvbGxUaW1lIC0gRGF0ZS5ub3coKVxuICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLmRlYnVnKFxuICAgICAgICAgICAgICAgIGBlbGFwc2VkVGltZSAke2VsYXBzZWRUaW1lfSB0aW1lSW5NaWxsaXMgJHtuZXh0UG9sbFRpbWV9IHVwcGVyTGltaXQgJHt1cHBlckxpbWl0fWBcbiAgICAgICAgICAgIClcblxuICAgICAgICAgICAgaWYgKG5leHRQb2xsVGltZSA+IHVwcGVyTGltaXQpIHtcbiAgICAgICAgICAgICAgICBCU3RhY2tMb2dnZXIud2FybignUG9sbGluZyBzdG9wcGVkIGR1ZSB0byB1cHBlciB0aW1lIGxpbWl0LicpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgZGF0YToge30sXG4gICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IGVycm9yLnJlc3BvbnNlLmhlYWRlcnMsXG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICdQb2xsaW5nIHN0b3BwZWQgZHVlIHRvIHVwcGVyIHRpbWUgbGltaXQuJyxcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIEJTdGFja0xvZ2dlci5kZWJ1ZyhgUG9sbGluZyBhZ2FpbiBpbiAke2VsYXBzZWRUaW1lfW1zIHdpdGggcGFyYW1zOmAsIHBhcmFtcylcbiAgICAgICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIGVsYXBzZWRUaW1lKSlcbiAgICAgICAgICAgIHJldHVybiBwb2xsQXBpKHVybCwgcGFyYW1zLCBoZWFkZXJzLCB1cHBlckxpbWl0LCBzdGFydFRpbWUpXG4gICAgICAgIH0gZWxzZSBpZiAoZXJyb3IucmVzcG9uc2UpIHtcbiAgICAgICAgICAgIGxldCBlcnJvck1lc3NhZ2UgPSBlcnJvci5yZXNwb25zZS5zdGF0dXNUZXh0XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhcnNlZEVycm9yID0gSlNPTi5wYXJzZShlcnJvci5yZXNwb25zZS5qc29uKCkpXG4gICAgICAgICAgICAgICAgZXJyb3JNZXNzYWdlID0gcGFyc2VkRXJyb3IubWVzc2FnZVxuICAgICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLmRlYnVnKGBFcnJvciBwYXJzaW5nIHBvbGxBcGkgcmVxdWVzdCBib2R5ICR7ZXJyb3IucmVzcG9uc2UuYm9keX1gKVxuICAgICAgICAgICAgICAgIGVycm9yTWVzc2FnZSA9ICdVbmtub3duIGVycm9yJ1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhyb3cge1xuICAgICAgICAgICAgICAgIGRhdGE6IHt9LFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IHt9LFxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGVycm9yTWVzc2FnZSxcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIEJTdGFja0xvZ2dlci5lcnJvcihgVW5leHBlY3RlZCBlcnJvciBvY2N1cnJlZDogJHtlcnJvcn1gKVxuICAgICAgICAgICAgcmV0dXJuIHsgZGF0YToge30sIGhlYWRlcnM6IHt9LCBtZXNzYWdlOiAnVW5leHBlY3RlZCBlcnJvciBvY2N1cnJlZC4nIH1cbiAgICAgICAgfVxuICAgIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gbWFrZUdldFJlcXVlc3QodXJsOiBzdHJpbmcsIHBhcmFtczogUmVjb3JkPHN0cmluZywgYW55PiwgaGVhZGVyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPik6IFByb21pc2U8UmVzcG9uc2U+IHtcbiAgICBjb25zdCB1cmxPYmogPSBuZXcgVVJMKHVybClcbiAgICBPYmplY3Qua2V5cyhwYXJhbXMpLmZvckVhY2goKGtleSkgPT4gdXJsT2JqLnNlYXJjaFBhcmFtcy5hcHBlbmQoa2V5LCBwYXJhbXNba2V5XSkpXG5cbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHVybE9iai50b1N0cmluZygpLCB7XG4gICAgICAgIG1ldGhvZDogJ0dFVCcsXG4gICAgICAgIGhlYWRlcnMsXG4gICAgfSlcbiAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICAgIGNvbnN0IGVycm9yOiBhbnkgPSBuZXcgRXJyb3IoJ1JlcXVlc3QgZmFpbGVkJylcbiAgICAgICAgZXJyb3IucmVzcG9uc2UgPSByZXNwb25zZVxuICAgICAgICB0aHJvdyBlcnJvclxuICAgIH1cblxuICAgIHJldHVybiByZXNwb25zZVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZXhlY3V0ZUFjY2Vzc2liaWxpdHlTY3JpcHQ8UmV0dXJuVHlwZT4oXG4gICAgYnJvd3NlcjogYW55LFxuICAgIGZuQm9keTogc3RyaW5nLFxuICAgIGFyZz86IHVua25vd25cbik6IFByb21pc2U8UmV0dXJuVHlwZT4ge1xuICAgIHJldHVybiBicm93c2VyLmV4ZWN1dGUoXG4gICAgICAgIGByZXR1cm4gKGZ1bmN0aW9uICguLi5ic3RhY2tTZGtBcmdzKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBic3RhY2tTZGtBcmdzWzBdO1xuICAgICAgICAgICAgICAgIGJzdGFja1Nka0FyZ3MucHVzaChyZXNvbHZlKTtcbiAgICAgICAgICAgICAgICAke2ZuQm9keS5yZXBsYWNlKC9hcmd1bWVudHMvZywgJ2JzdGFja1Nka0FyZ3MnKX1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KSgke2FyZyA/IEpTT04uc3RyaW5naWZ5KGFyZykgOiAnJ30pYFxuICAgIClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlSGFzaENvZGVGcm9tRmllbGRzKGZpZWxkczogQXJyYXk8c3RyaW5nIHwgb2JqZWN0Pikge1xuICAgIGNvbnN0IHNlcmlhbGl6ZSA9ICh2YWx1ZToge30pID0+IHtcbiAgICAgICAgaWYgKHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh2YWx1ZSwgT2JqZWN0LmtleXModmFsdWUpLnNvcnQoKSlcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gU3RyaW5nKHZhbHVlKVxuICAgIH1cblxuICAgIGNvbnN0IHNlcmlhbGl6ZWQgPSBmaWVsZHMubWFwKHNlcmlhbGl6ZSkuam9pbignfCcpXG4gICAgcmV0dXJuIGNyeXB0by5jcmVhdGVIYXNoKCdzaGEyNTYnKS51cGRhdGUoc2VyaWFsaXplZCkuZGlnZXN0KCdoZXgnKVxufVxuZXhwb3J0IGZ1bmN0aW9uIGdldEJvb2xlYW5WYWx1ZUZyb21TdHJpbmcodmFsdWU6IHN0cmluZyB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICAgIGlmICghdmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICAgIHJldHVybiBbJ3RydWUnXS5pbmNsdWRlcyh2YWx1ZS50cmltKCkudG9Mb3dlckNhc2UoKSlcbn1cblxuLyoqXG4gKiBTREstMzczNzogQ29lcmNlIHN0cmluZ2lmaWVkIGJvb2xlYW5zICgndHJ1ZScvJ2ZhbHNlJywgYW55IGNhc2UpIGluIGEgZmxhdFxuICogb3B0aW9ucyBvYmplY3QgdG8gcmVhbCBib29sZWFucywgbGVhdmluZyBldmVyeSBvdGhlciB2YWx1ZSB1bnRvdWNoZWQuIEJvb2xlYW4tXG4gKiB0eXBlZCBhY2Nlc3NpYmlsaXR5IG9wdGlvbnMgKGUuZy4gYXV0b1NjYW5uaW5nKSBhcmUgY29tbW9ubHkgc3VwcGxpZWQgYXNcbiAqIHN0cmluZ3MgZnJvbSBKUyBjb25maWcgLyBlbnY7IHdpdGhvdXQgY29lcmNpb24gdGhleSBmYWlsIFczQyBjYXBzIHZhbGlkYXRpb25cbiAqIGFuZCBhcmUgc2lsZW50bHkgZHJvcHBlZC4gT25seSB0aGUgZXhhY3Qgc3RyaW5ncyAndHJ1ZScvJ2ZhbHNlJyBhcmUgY29udmVydGVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29lcmNlU3RyaW5nQm9vbGVhbnM8VCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIHVua25vd24+PihvYmo6IFQpOiBUIHtcbiAgICBpZiAoIW9iaiB8fCB0eXBlb2Ygb2JqICE9PSAnb2JqZWN0JyB8fCBBcnJheS5pc0FycmF5KG9iaikpIHtcbiAgICAgICAgcmV0dXJuIG9ialxuICAgIH1cbiAgICBjb25zdCBvdXQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge31cbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhvYmopKSB7XG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBjb25zdCBub3JtYWxpc2VkID0gdmFsdWUudHJpbSgpLnRvTG93ZXJDYXNlKClcbiAgICAgICAgICAgIGlmIChub3JtYWxpc2VkID09PSAndHJ1ZScgfHwgbm9ybWFsaXNlZCA9PT0gJ2ZhbHNlJykge1xuICAgICAgICAgICAgICAgIG91dFtrZXldID0gbm9ybWFsaXNlZCA9PT0gJ3RydWUnXG4gICAgICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBvdXRba2V5XSA9IHZhbHVlXG4gICAgfVxuICAgIHJldHVybiBvdXQgYXMgVFxufVxuXG4vKipcbiAqIENoZWNrcyBpZiBhIGtleSBpcyBzYWZlIHRvIHVzZSBmb3Igb2JqZWN0IHByb3BlcnR5IGFzc2lnbm1lbnQgdG8gcHJldmVudCBwcm90b3R5cGUgcG9sbHV0aW9uXG4gKiBAcGFyYW0ga2V5IC0gVGhlIGtleSB0byBjaGVja1xuICogQHJldHVybnMgdHJ1ZSBpZiB0aGUga2V5IGlzIHNhZmUsIGZhbHNlIG90aGVyd2lzZVxuICovXG5mdW5jdGlvbiBpc1NhZmVLZXkoa2V5OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBjb25zdCBkYW5nZXJvdXNLZXlzID0gWydfX3Byb3RvX18nLCAnY29uc3RydWN0b3InLCAncHJvdG90eXBlJ11cbiAgICByZXR1cm4gIWRhbmdlcm91c0tleXMuaW5jbHVkZXMoa2V5KVxufVxuXG4vKipcbiAqIFZhbGlkYXRlIGJvb2xlYW4gdmFsdWUgZnJvbSBtaXhlZCB0eXBlcyAoYm9vbGVhbiBvciBzdHJpbmcpXG4gKiBPbmx5IGFjY2VwdHMgdHJ1ZSBib29sZWFuIG9yIHN0cmluZyBcInRydWVcIiAoY2FzZSBpbnNlbnNpdGl2ZSlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzVmFsaWRFbmFibGVkVmFsdWUodmFsdWU6IGJvb2xlYW4gfCBzdHJpbmcgfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCB8fCB2YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZSA9PT0gdHJ1ZVxuICAgIH1cbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm4gZ2V0Qm9vbGVhblZhbHVlRnJvbVN0cmluZyh2YWx1ZSlcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBtZXJnZURlZXAodGFyZ2V0OiBSZWNvcmQ8c3RyaW5nLCBhbnk+LCAuLi5zb3VyY2VzOiBhbnlbXSk6IFJlY29yZDxzdHJpbmcsIGFueT4ge1xuICAgIGlmICghc291cmNlcy5sZW5ndGgpIHtyZXR1cm4gdGFyZ2V0fVxuICAgIGNvbnN0IHNvdXJjZSA9IHNvdXJjZXMuc2hpZnQoKVxuXG4gICAgaWYgKGlzT2JqZWN0KHRhcmdldCkgJiYgaXNPYmplY3Qoc291cmNlKSkge1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBzb3VyY2UpIHtcbiAgICAgICAgICAgIC8vIFNraXAgZGFuZ2Vyb3VzIGtleXMgdGhhdCBjb3VsZCBsZWFkIHRvIHByb3RvdHlwZSBwb2xsdXRpb25cbiAgICAgICAgICAgIGlmICghaXNTYWZlS2V5KGtleSkpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBzb3VyY2VWYWx1ZSA9IHNvdXJjZVtrZXldXG4gICAgICAgICAgICBjb25zdCB0YXJnZXRWYWx1ZSA9IHRhcmdldFtrZXldXG5cbiAgICAgICAgICAgIGlmIChpc09iamVjdChzb3VyY2VWYWx1ZSkpIHtcbiAgICAgICAgICAgICAgICBpZiAoIXRhcmdldFZhbHVlIHx8ICFpc09iamVjdCh0YXJnZXRWYWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0W2tleV0gPSB7fVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBtZXJnZURlZXAodGFyZ2V0W2tleV0sIHNvdXJjZVZhbHVlKVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0YXJnZXRba2V5XSA9IHNvdXJjZVZhbHVlXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbWVyZ2VEZWVwKHRhcmdldCwgLi4uc291cmNlcylcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1lcmdlQ2hyb21lT3B0aW9ucyhiYXNlOiBDYXBhYmlsaXRpZXMuQ2hyb21lT3B0aW9ucywgb3ZlcnJpZGU6IFBhcnRpYWw8Q2FwYWJpbGl0aWVzLkNocm9tZU9wdGlvbnM+KTogQ2FwYWJpbGl0aWVzLkNocm9tZU9wdGlvbnMge1xuICAgIGNvbnN0IG1lcmdlZDogQ2FwYWJpbGl0aWVzLkNocm9tZU9wdGlvbnMgPSB7IC4uLmJhc2UgfVxuXG4gICAgaWYgKG92ZXJyaWRlLmFyZ3MpIHtcbiAgICAgICAgbWVyZ2VkLmFyZ3MgPSBbLi4uKGJhc2UuYXJncyB8fCBbXSksIC4uLm92ZXJyaWRlLmFyZ3NdXG4gICAgfVxuXG4gICAgaWYgKG92ZXJyaWRlLmV4dGVuc2lvbnMpIHtcbiAgICAgICAgbWVyZ2VkLmV4dGVuc2lvbnMgPSBbLi4uKGJhc2UuZXh0ZW5zaW9ucyB8fCBbXSksIC4uLm92ZXJyaWRlLmV4dGVuc2lvbnNdXG4gICAgfVxuXG4gICAgaWYgKG92ZXJyaWRlLnByZWZzKSB7XG4gICAgICAgIG1lcmdlZC5wcmVmcyA9IG1lcmdlRGVlcCh7IC4uLihiYXNlLnByZWZzIHx8IHt9KSB9LCBvdmVycmlkZS5wcmVmcylcbiAgICB9XG4gICAgcmV0dXJuIG1lcmdlZFxufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNOdWxsT3JFbXB0eShzdHJpbmc6IGFueSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhc3RyaW5nIHx8IHN0cmluZy50cmltKCkgPT09ICcnXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0hhc2goZW50aXR5OiBhbnkpIHtcbiAgICByZXR1cm4gQm9vbGVhbihlbnRpdHkgJiYgdHlwZW9mKGVudGl0eSkgPT09ICdvYmplY3QnICYmICFBcnJheS5pc0FycmF5KGVudGl0eSkpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBuZXN0ZWRLZXlWYWx1ZShoYXNoOiBhbnksIGtleXM6IEFycmF5PHN0cmluZz4pIHtcbiAgICByZXR1cm4ga2V5cy5yZWR1Y2UoKGhhc2gsIGtleSkgPT4gKGlzSGFzaChoYXNoKSA/IGhhc2hba2V5XSA6IHVuZGVmaW5lZCksIGhhc2gpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZW1vdmVEaXIoZGlyOiBzdHJpbmcpIHtcbiAgICBjb25zdCBsaXN0ID0gZnMucmVhZGRpclN5bmMoZGlyKVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBmaWxlbmFtZSA9IHBhdGguam9pbihkaXIsIGxpc3RbaV0pXG4gICAgICAgIGNvbnN0IHN0YXQgPSBmcy5zdGF0U3luYyhmaWxlbmFtZSlcblxuICAgICAgICBpZiAoZmlsZW5hbWUgPT09ICcuJyB8fCBmaWxlbmFtZSA9PT0gJy4uJykge1xuICAgICAgICAgICAgLy8gcGFzcyB0aGVzZSBmaWxlc1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXQuaXNEaXJlY3RvcnkoKSkge1xuICAgICAgICAgICAgLy8gcm1kaXIgcmVjdXJzaXZlbHlcbiAgICAgICAgICAgIHJlbW92ZURpcihmaWxlbmFtZSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIHJtIGZpbGVuYW1lXG4gICAgICAgICAgICBmcy51bmxpbmtTeW5jKGZpbGVuYW1lKVxuICAgICAgICB9XG4gICAgfVxuICAgIGZzLnJtZGlyU3luYyhkaXIpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVEaXIoZGlyOiBzdHJpbmcpIHtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhkaXIpKXtcbiAgICAgICAgcmVtb3ZlRGlyKGRpcilcbiAgICB9XG4gICAgZnMubWtkaXJTeW5jKGRpciwgeyByZWN1cnNpdmU6IHRydWUgfSlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzV3JpdGFibGUoZGlyUGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgdHJ5IHtcbiAgICAgICAgZnMuYWNjZXNzU3luYyhkaXJQYXRoLCBmcy5jb25zdGFudHMuV19PSylcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICB9IGNhdGNoIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gc2V0UmVhZFdyaXRlQWNjZXNzKGRpclBhdGg6IHN0cmluZykge1xuICAgIHRyeSB7XG4gICAgICAgIGZzLmNobW9kU3luYyhkaXJQYXRoLCAwbzY2NilcbiAgICAgICAgQlN0YWNrTG9nZ2VyLmRlYnVnKGBEaXJlY3RvcnkgJHtkaXJQYXRofSBpcyBub3cgcmVhZC93cml0ZSBhY2Nlc3NpYmxlLmApXG4gICAgfSBjYXRjaCAoZXJyOiBhbnkpIHtcbiAgICAgICAgQlN0YWNrTG9nZ2VyLmVycm9yKGBGYWlsZWQgdG8gc2V0IGRpcmVjdG9yeSBhY2Nlc3M6ICR7ZXJyLnN0YWNrfWApXG4gICAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0TW9jaGFUZXN0SGllcmFyY2h5KHRlc3Q6IEZyYW1ld29ya3MuVGVzdCkge1xuICAgIGNvbnN0IHZhbHVlOiBzdHJpbmdbXSA9IFtdXG4gICAgaWYgKHRlc3QuY3R4ICYmIHRlc3QuY3R4LnRlc3QpIHtcbiAgICAgICAgLy8gSWYgd2UgYWxyZWFkeSBoYXZlIHRoZSBwYXJlbnQgb2JqZWN0LCB1dGlsaXplIGl0IGVsc2UgZ2V0IGZyb20gY29udGV4dFxuICAgICAgICBsZXQgcGFyZW50ID0gdHlwZW9mIHRlc3QucGFyZW50ID09PSAnb2JqZWN0JyA/IHRlc3QucGFyZW50IDogdGVzdC5jdHgudGVzdC5wYXJlbnRcbiAgICAgICAgd2hpbGUgKHBhcmVudCAmJiBwYXJlbnQudGl0bGUgIT09ICcnKSB7XG4gICAgICAgICAgICB2YWx1ZS5wdXNoKHBhcmVudC50aXRsZSlcbiAgICAgICAgICAgIHBhcmVudCA9IHBhcmVudC5wYXJlbnRcbiAgICAgICAgfVxuICAgIH0gZWxzZSBpZiAodGVzdC5kZXNjcmlwdGlvbiAmJiB0ZXN0LmZ1bGxOYW1lKSB7XG4gICAgICAgIC8vIGZvciBKYXNtaW5lXG4gICAgICAgIHZhbHVlLnB1c2godGVzdC5kZXNjcmlwdGlvbilcbiAgICAgICAgLy8gU3RyaXAgdGhlIHRyYWlsaW5nIFwiIDxkZXNjcmlwdGlvbj5cIiBzdWZmaXggd2l0aG91dCBidWlsZGluZyBhIHJlZ2V4IGZyb21cbiAgICAgICAgLy8gYSB2YXJpYWJsZSAoYXZvaWRzIFJlRG9TIGFuZCByZWdleC1tZXRhY2hhcmFjdGVyIG1pc21hdGNoZXMgaW4gZGVzY3JpcHRpb25zKS5cbiAgICAgICAgY29uc3QgZGVzY1N1ZmZpeCA9IGAgJHt0ZXN0LmRlc2NyaXB0aW9ufWBcbiAgICAgICAgdmFsdWUucHVzaCh0ZXN0LmZ1bGxOYW1lLmVuZHNXaXRoKGRlc2NTdWZmaXgpID8gdGVzdC5mdWxsTmFtZS5zbGljZSgwLCAtZGVzY1N1ZmZpeC5sZW5ndGgpIDogdGVzdC5mdWxsTmFtZSlcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlLnJldmVyc2UoKVxufVxuXG4vLyBUaGUgbG9va2JlaGluZCBpcyBsb2FkLWJlYXJpbmc6IHdpdGhvdXQgaXQgZXZlcnkgYEBgIHN0YXJ0cyBhIG1hdGNoLCBzbyBhbiBhZGRyZXNzXG4vLyBsaWtlIGB1c2VyQGV4YW1wbGUuY29tYCBpbiBhIHRpdGxlIHlpZWxkcyBhIGJvZ3VzIGBAZXhhbXBsZWAgdGFnLlxuY29uc3QgVEVTVF9UQUdfUEFUVEVSTiA9IC8oPzwhW1xcdy1dKUBbXFx3LV0rL2dcblxuLyoqXG4gKiBNb2NoYSBhbmQgSmFzbWluZSBoYXZlIG5vIHRhZyBjb25zdHJ1Y3QsIHNvIGBAdGFnYCB0b2tlbnMgd3JpdHRlbiBpbnRvIHRoZSBzdWl0ZSBhbmRcbiAqIHRlc3QgdGl0bGVzIGFyZSB0aGUgdGFnIHNvdXJjZS4gVGhlIGxlYWRpbmcgYEBgIGlzIGtlcHQgc28gdGhlc2UgbWF0Y2ggdGhlIHBpY2tsZSB0YWdzXG4gKiB0aGUgQ3VjdW1iZXIgcGF0aCBpbiB0aGlzIHNlcnZpY2UgYWxyZWFkeSBmb3J3YXJkczsgbm90ZSB0aGUgbm9kZSBTREsgc3RyaXBzIGl0IGZvclxuICogSmVzdC9QbGF5d3JpZ2h0LCBzbyB0aGUgdHdvIFNES3MgZW1pdCBkaWZmZXJlbnQgc2hhcGVzIGZvciB0aGUgc2FtZSBsb2dpY2FsIHRhZy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFRlc3RUYWdzKHRlc3Q6IEZyYW1ld29ya3MuVGVzdCwgc2NvcGVzPzogc3RyaW5nW10pOiBzdHJpbmdbXSB7XG4gICAgY29uc3QgdGl0bGVzID0gWy4uLihzY29wZXMgPz8gZ2V0TW9jaGFUZXN0SGllcmFyY2h5KHRlc3QpKSwgdGVzdC50aXRsZSB8fCB0ZXN0LmRlc2NyaXB0aW9uIHx8ICcnXVxuICAgIGNvbnN0IHRhZ3M6IHN0cmluZ1tdID0gW11cbiAgICBmb3IgKGNvbnN0IHRpdGxlIG9mIHRpdGxlcykge1xuICAgICAgICBmb3IgKGNvbnN0IHRhZyBvZiB0aXRsZS5tYXRjaChURVNUX1RBR19QQVRURVJOKSB8fCBbXSkge1xuICAgICAgICAgICAgaWYgKCF0YWdzLmluY2x1ZGVzKHRhZykpIHtcbiAgICAgICAgICAgICAgICB0YWdzLnB1c2godGFnKVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0YWdzXG59XG5cbi8qKlxuICogVHJ1ZSBvbmx5IGZvciB0aGUgaHViLWludGVycHJldGVkIGBicm93c2Vyc3RhY2tfZXhlY3V0b3I6IHtcdTIwMjZ9YCBtYWdpYyBzdHJpbmcuXG4gKiBBbmNob3JlZCB0byB0aGUgc3RhcnQgKGxlYWRpbmcgd2hpdGVzcGFjZSB0b2xlcmF0ZWQpIGFuZCBjYXNlLXNlbnNpdGl2ZSwgbWF0Y2hpbmdcbiAqIGhvdyB0aGUgaHViIHJlYWRzIHRoZSBwYXlsb2FkIFx1MjAxNCBhIHBsYWluIHNjcmlwdCBtZXJlbHkgbWVudGlvbmluZyB0aGUgdG9rZW4gbXVzdCBub3RcbiAqIGJlIHJlcm91dGVkIG9mZiBpdHMgbm9ybWFsIHRyYW5zcG9ydC5cbiAqL1xuZXhwb3J0IGNvbnN0IGlzQnJvd3NlcnN0YWNrRXhlY3V0b3JTY3JpcHQgPSAoc2NyaXB0OiB1bmtub3duKTogc2NyaXB0IGlzIHN0cmluZyA9PlxuICAgIHR5cGVvZiBzY3JpcHQgPT09ICdzdHJpbmcnICYmIHNjcmlwdC50cmltU3RhcnQoKS5zdGFydHNXaXRoKCdicm93c2Vyc3RhY2tfZXhlY3V0b3I6JylcblxuZXhwb3J0IGNvbnN0IHBlcmZvcm1PMTF5U3luYyA9IGFzeW5jIChicm93c2VyOiBXZWJkcml2ZXJJTy5Ccm93c2VyKSA9PiB7XG4gICAgaWYgKGlzQnJvd3NlcnN0YWNrU2Vzc2lvbihicm93c2VyKSkge1xuICAgICAgICBhd2FpdCBicm93c2VyLmV4ZWN1dGUoYGJyb3dzZXJzdGFja19leGVjdXRvcjogJHtKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICBhY3Rpb246ICdhbm5vdGF0ZScsXG4gICAgICAgICAgICBhcmd1bWVudHM6IHtcbiAgICAgICAgICAgICAgICBkYXRhOiBgT2JzZXJ2YWJpbGl0eVN5bmM6JHtEYXRlLm5vdygpfWAsXG4gICAgICAgICAgICAgICAgbGV2ZWw6ICdkZWJ1ZydcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSl9YClcbiAgICB9XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIHRoZSBjYXBhYmlsaXRpZXMgcmVwcmVzZW50IGEgbXVsdGlyZW1vdGUgY29uZmlndXJhdGlvblxuICogQHBhcmFtIGNhcGFiaWxpdGllcyAtIFRoZSBjYXBhYmlsaXRpZXMgdG8gY2hlY2tcbiAqIEByZXR1cm5zIHRydWUgaWYgY2FwYWJpbGl0aWVzIHJlcHJlc2VudCBhbnkgbXVsdGlyZW1vdGUgY29uZmlndXJhdGlvbiAocmVndWxhciBvciBwYXJhbGxlbClcbiAqXG4gKiBAZXhhbXBsZVxuICogUmVndWxhciBtdWx0aXJlbW90ZSAob2JqZWN0KTpcbiAqIHsgYnJvd3NlckE6IHsgY2FwYWJpbGl0aWVzOiB7Li4ufSB9LCBicm93c2VyQjogeyBjYXBhYmlsaXRpZXM6IHsuLi59IH0gfVxuICpcbiAqIFBhcmFsbGVsIG11bHRpcmVtb3RlIChhcnJheSB3aXRoIG5lc3RlZCBzdHJ1Y3R1cmUpOlxuICogW3sgYnJvd3NlckE6IHsgY2FwYWJpbGl0aWVzOiB7Li4ufSB9LCBicm93c2VyQjogeyBjYXBhYmlsaXRpZXM6IHsuLi59IH0gfV1cbiAqXG4gKiBSZWd1bGFyIGNhcGFiaWxpdGllcyAoYXJyYXkpOlxuICogW3sgYnJvd3Nlck5hbWU6ICdjaHJvbWUnLCAuLi4gfV1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzTXVsdGlSZW1vdGVDYXBzKGNhcGFiaWxpdGllczogQ2FwYWJpbGl0aWVzLlRlc3RydW5uZXJDYXBhYmlsaXRpZXMpOiBib29sZWFuIHtcbiAgICAvLyBSZWd1bGFyIG11bHRpcmVtb3RlIGlzIGFuIG9iamVjdCAobm90IGFycmF5KVxuICAgIGlmICghQXJyYXkuaXNBcnJheShjYXBhYmlsaXRpZXMpKSB7XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuXG4gICAgLy8gRW1wdHkgYXJyYXkgaXMgbm90IG11bHRpcmVtb3RlXG4gICAgaWYgKGNhcGFiaWxpdGllcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuXG4gICAgLy8gUGFyYWxsZWwgbXVsdGlyZW1vdGUgaXMgYW4gYXJyYXkgd2l0aCBuZXN0ZWQgY2FwYWJpbGl0aWVzIHN0cnVjdHVyZVxuICAgIHJldHVybiBjYXBhYmlsaXRpZXMuZXZlcnkoY2FwID0+XG4gICAgICAgIE9iamVjdC52YWx1ZXMoY2FwKS5sZW5ndGggPiAwICYmXG4gICAgICAgIE9iamVjdC52YWx1ZXMoY2FwKS5ldmVyeShjID0+IGMgIT09IG51bGwgJiYgdHlwZW9mIGMgPT09ICdvYmplY3QnICYmIChjIGFzIHsgY2FwYWJpbGl0aWVzOiBXZWJkcml2ZXJJTy5DYXBhYmlsaXRpZXMgfSkuY2FwYWJpbGl0aWVzKVxuICAgIClcbn1cbiIsICJpbXBvcnQgVHJhbnNwb3J0IGZyb20gJ3dpbnN0b24tdHJhbnNwb3J0J1xuXG5jb25zdCBMT0dfTEVWRUxTID0ge1xuICAgIElORk86ICdJTkZPJywgRVJST1I6ICdFUlJPUicsIERFQlVHOiAnREVCVUcnLCBUUkFDRTogJ1RSQUNFJywgV0FSTjogJ1dBUk4nLFxufVxuXG5jbGFzcyBsb2dQYXRjaGVyIGV4dGVuZHMgVHJhbnNwb3J0IHtcbiAgICBsb2dUb1Rlc3RPcHMgPSAobGV2ZWwgPSBMT0dfTEVWRUxTLklORk8sIG1lc3NhZ2UgPSBbJyddIGFzIHVua25vd25bXSkgPT4ge1xuICAgICAgICAocHJvY2Vzcy5lbWl0IGFzIEZ1bmN0aW9uKShgYnM6YWRkTG9nOiR7cHJvY2Vzcy5waWR9YCwge1xuICAgICAgICAgICAgdGltZXN0YW1wOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgICAgICAgICBsZXZlbDogbGV2ZWwudG9VcHBlckNhc2UoKSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IGBcIiR7bWVzc2FnZS5qb2luKCcsICcpfVwiYCxcbiAgICAgICAgICAgIGtpbmQ6ICdURVNUX0xPRycsXG4gICAgICAgICAgICBodHRwX3Jlc3BvbnNlOiB7fVxuICAgICAgICB9KVxuICAgIH1cblxuICAgIC8qIFBhdGNoaW5nIHRoaXMgd291bGQgc2hvdyB1c2VyIGFuIGV4dGVuZGVkIHRyYWNlIG9uIHRoZWlyIGNsaSAqL1xuICAgIHRyYWNlID0gKC4uLm1lc3NhZ2U6IHVua25vd25bXSkgPT4ge1xuICAgICAgICB0aGlzLmxvZ1RvVGVzdE9wcyhMT0dfTEVWRUxTLlRSQUNFLCBtZXNzYWdlKVxuICAgIH1cblxuICAgIGRlYnVnID0gKC4uLm1lc3NhZ2U6IHVua25vd25bXSkgPT4ge1xuICAgICAgICB0aGlzLmxvZ1RvVGVzdE9wcyhMT0dfTEVWRUxTLkRFQlVHLCBtZXNzYWdlKVxuICAgIH1cblxuICAgIGluZm8gPSAoLi4ubWVzc2FnZTogdW5rbm93bltdKSA9PiB7XG4gICAgICAgIHRoaXMubG9nVG9UZXN0T3BzKExPR19MRVZFTFMuSU5GTywgbWVzc2FnZSlcbiAgICB9XG5cbiAgICB3YXJuID0gKC4uLm1lc3NhZ2U6IHVua25vd25bXSkgPT4ge1xuICAgICAgICB0aGlzLmxvZ1RvVGVzdE9wcyhMT0dfTEVWRUxTLldBUk4sIG1lc3NhZ2UpXG4gICAgfVxuXG4gICAgZXJyb3IgPSAoLi4ubWVzc2FnZTogdW5rbm93bltdKSA9PiB7XG4gICAgICAgIHRoaXMubG9nVG9UZXN0T3BzKExPR19MRVZFTFMuRVJST1IsIG1lc3NhZ2UpXG4gICAgfVxuXG4gICAgbG9nID0gKC4uLm1lc3NhZ2U6IHVua25vd25bXSkgPT4ge1xuICAgICAgICB0aGlzLmxvZ1RvVGVzdE9wcyhMT0dfTEVWRUxTLklORk8sIG1lc3NhZ2UpXG4gICAgfVxufVxuZXhwb3J0IGRlZmF1bHQgbG9nUGF0Y2hlclxuIiwgImltcG9ydCB7IGNyZWF0ZU9iamVjdENzdldyaXRlciB9IGZyb20gJ2Nzdi13cml0ZXInXG5pbXBvcnQgZnMgZnJvbSAnbm9kZTpmcydcbmltcG9ydCBmc1Byb21pc2UgZnJvbSAnbm9kZTpmcy9wcm9taXNlcydcbmltcG9ydCB0eXBlIHsgRW50cnlUeXBlIH0gZnJvbSAnbm9kZTpwZXJmX2hvb2tzJ1xuaW1wb3J0IHsgcGVyZm9ybWFuY2UsIFBlcmZvcm1hbmNlT2JzZXJ2ZXIgfSBmcm9tICdub2RlOnBlcmZfaG9va3MnXG5pbXBvcnQgdXRpbCBmcm9tICdub2RlOnV0aWwnXG5pbXBvcnQgd29ya2VyIGZyb20gJ25vZGU6d29ya2VyX3RocmVhZHMnXG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnXG5pbXBvcnQgeyBhcmNoLCBob3N0bmFtZSwgcGxhdGZvcm0sIHR5cGUsIHZlcnNpb24gfSBmcm9tICdub2RlOm9zJ1xuXG5pbXBvcnQgeyBCU3RhY2tMb2dnZXIgfSBmcm9tICcuLi8uLi9ic3RhY2tMb2dnZXIuanMnXG5pbXBvcnQgeyBQRVJGX01FQVNVUkVNRU5UX0VOViB9IGZyb20gJy4uLy4uL2NvbnN0YW50cy5qcydcbmltcG9ydCBBUElVdGlscyBmcm9tICcuLi8uLi9jbGkvYXBpVXRpbHMuanMnXG5pbXBvcnQgeyBDTElVdGlscyB9IGZyb20gJy4uLy4uL2NsaS9jbGlVdGlscy5qcydcbmltcG9ydCB7IEVWRU5UUyB9IGZyb20gJy4vY29uc3RhbnRzLmpzJ1xuaW1wb3J0IGZldGNoV3JhcCBmcm9tICcuLi8uLi9mZXRjaFdyYXBwZXIuanMnXG5pbXBvcnQgdHlwZSB7IENzdldyaXRlciB9IGZyb20gJ2Nzdi13cml0ZXIvc3JjL2xpYi9jc3Ytd3JpdGVyLmpzJ1xuaW1wb3J0IHR5cGUgeyBPYmplY3RNYXAgfSBmcm9tICdjc3Ytd3JpdGVyL3NyYy9saWIvbGFuZy9vYmplY3QuanMnXG5pbXBvcnQgdHlwZSB7IEJyb3dzZXIgfSBmcm9tICd3ZWJkcml2ZXJpbydcblxuLy8gVGVsZW1ldHJ5IG11c3QgbmV2ZXIgdGhyb3cgaW50byBidXNpbmVzcyBsb2dpYy4gTm9kZSAxOCdzIHBlcmZfaG9va3MgcmVqZWN0c1xuLy8gbmVnYXRpdmUgdGltZXN0YW1wcyAoZS5nLiBwZXJmb3JtYW5jZS5ub3coKSB1bmRlciBmYWtlZCB0aW1lcnMsIG9yIGFueSBvdGhlclxuLy8gZWRnZSkgd2l0aCBFUlJfUEVSRk9STUFOQ0VfSU5WQUxJRF9USU1FU1RBTVA7IE5vZGUgMjArIHRvbGVyYXRlcyB0aGVtLiBXcmFwcGluZ1xuLy8gbWFyay9tZWFzdXJlIGtlZXBzIGFuIGluc3RydW1lbnRhdGlvbiBmYWlsdXJlIGZyb20gYnJlYWtpbmcgYSBjYWxsZXIncyBob29rXG4vLyAoZS5nLiBhIHNlcnZpY2UgYmVmb3JlKCkpLCBhbmQgaXMgYSBuby1vcCBvbiB0aGUgaGFwcHkgcGF0aC5cbmZ1bmN0aW9uIHNhZmVNYXJrKG1hcmtOYW1lOiBzdHJpbmcpIHtcbiAgICB0cnkgeyBwZXJmb3JtYW5jZS5tYXJrKG1hcmtOYW1lKSB9IGNhdGNoIHsgLyogaW5zdHJ1bWVudGF0aW9uIG11c3Qgbm90IHRocm93ICovIH1cbn1cbmZ1bmN0aW9uIHNhZmVNZWFzdXJlKG1lYXN1cmVOYW1lOiBzdHJpbmcsIHN0YXJ0OiBzdHJpbmcsIGVuZDogc3RyaW5nKSB7XG4gICAgdHJ5IHsgcGVyZm9ybWFuY2UubWVhc3VyZShtZWFzdXJlTmFtZSwgc3RhcnQsIGVuZCkgfSBjYXRjaCB7IC8qIGluc3RydW1lbnRhdGlvbiBtdXN0IG5vdCB0aHJvdyAqLyB9XG59XG5cbnR5cGUgUGVyZm9ybWFuY2VEZXRhaWxzID0ge1xuICAgIHN1Y2Nlc3M/OiB0cnVlLFxuICAgIGZhaWx1cmU/OiBzdHJpbmcsXG4gICAgdGVzdE5hbWU/OiBzdHJpbmcsXG4gICAgd29ya2VyPzogc3RyaW5nIHwgbnVtYmVyLFxuICAgIGNsaWVudFdvcmtlcklkPzogc3RyaW5nLFxuICAgIGNvbW1hbmQ/OiBzdHJpbmcsXG4gICAgaG9va1R5cGU/OiBzdHJpbmcsXG4gICAgcGxhdGZvcm0/OiBzdHJpbmcgfCBudW1iZXJcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUGVyZm9ybWFuY2VUZXN0ZXIge1xuICAgIHN0YXRpYyBfb2JzZXJ2ZXI6IFBlcmZvcm1hbmNlT2JzZXJ2ZXJcbiAgICBzdGF0aWMgX2NzdldyaXRlcjogQ3N2V3JpdGVyPE9iamVjdE1hcDx7fT4+XG4gICAgcHJpdmF0ZSBzdGF0aWMgX2V2ZW50czogUGVyZm9ybWFuY2VFbnRyeVtdID0gW11cbiAgICBwcml2YXRlIHN0YXRpYyBfbWVhc3VyZWRFdmVudHM6IEFycmF5PFBlcmZvcm1hbmNlRW50cnkgfCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4gPSBbXVxuICAgIHByaXZhdGUgc3RhdGljIF9oYXNTdG9wcGVkR2VuZXJhdGlvbiA9IGZhbHNlXG4gICAgcHJpdmF0ZSBzdGF0aWMgX3N0b3BHZW5lcmF0ZUNhbGxDb3VudCA9IDBcbiAgICBzdGF0aWMgc3RhcnRlZCA9IGZhbHNlXG4gICAgc3RhdGljIGRldGFpbHM6IHsgW2tleTogc3RyaW5nXTogUGVyZm9ybWFuY2VEZXRhaWxzIH0gPSB7fVxuICAgIHN0YXRpYyBldmVudHNNYXA6IHsgW2tleTogc3RyaW5nXTogbnVtYmVyIH0gPSB7fVxuICAgIHN0YXRpYyBicm93c2VyPzogQnJvd3NlclxuICAgIHN0YXRpYyBzY2VuYXJpb1RoYXRSYW46IHN0cmluZ1tdXG4gICAgc3RhdGljIGpzb25SZXBvcnREaXJOYW1lID0gJ3BlcmZvcm1hbmNlLXJlcG9ydCdcbiAgICBzdGF0aWMganNvblJlcG9ydERpclBhdGggPSBwYXRoLmpvaW4ocHJvY2Vzcy5jd2QoKSwgJ2xvZ3MnLCB0aGlzLmpzb25SZXBvcnREaXJOYW1lKVxuICAgIHN0YXRpYyBqc29uUmVwb3J0RmlsZU5hbWUgPSBgJHt0aGlzLmpzb25SZXBvcnREaXJQYXRofS9wZXJmb3JtYW5jZS1yZXBvcnQtJHtQZXJmb3JtYW5jZVRlc3Rlci5nZXRQcm9jZXNzSWQoKX0uanNvbmBcblxuICAgIHN0YXRpYyBzdGFydE1vbml0b3JpbmcoY3N2TmFtZTogc3RyaW5nID0gJ3BlcmZvcm1hbmNlLXJlcG9ydC5jc3YnKSB7XG5cbiAgICAgICAgLy8gQ3JlYXRlIHBlcmZvcm1hbmNlLXJlcG9ydCBkaXIgaWYgbm90IGV4aXN0cyBhbHJlYWR5XG4gICAgICAgIGlmICghZnMuZXhpc3RzU3luYyh0aGlzLmpzb25SZXBvcnREaXJQYXRoKSkge1xuICAgICAgICAgICAgZnMubWtkaXJTeW5jKHRoaXMuanNvblJlcG9ydERpclBhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fb2JzZXJ2ZXIgPSBuZXcgUGVyZm9ybWFuY2VPYnNlcnZlcihsaXN0ID0+IHtcbiAgICAgICAgICAgIGxpc3QuZ2V0RW50cmllcygpXG4gICAgICAgICAgICAgICAgLmZpbHRlcigoZW50cnkpID0+IGVudHJ5LmVudHJ5VHlwZSA9PT0gJ21lYXN1cmUnKVxuICAgICAgICAgICAgICAgIC5mb3JFYWNoKGVudHJ5ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGZpbmFsRW50cnk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0gZW50cnkudG9KU09OKCkgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj5cblxuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBmaW5hbEVudHJ5LnN0YXJ0VGltZSA9PT0gJ251bWJlcicgJiYgdHlwZW9mIHBlcmZvcm1hbmNlLnRpbWVPcmlnaW4gPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgb3JpZ2luYWxTdGFydFRpbWUgPSBmaW5hbEVudHJ5LnN0YXJ0VGltZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsRW50cnkuc3RhcnRUaW1lID0gcGVyZm9ybWFuY2UudGltZU9yaWdpbiArIGZpbmFsRW50cnkuc3RhcnRUaW1lXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLmRlYnVnKGBUaW1lc3RhbXAgY29udmVyc2lvbiBmb3IgJHtlbnRyeS5uYW1lfTogJHtvcmlnaW5hbFN0YXJ0VGltZX0gLT4gJHtmaW5hbEVudHJ5LnN0YXJ0VGltZX0gKHRpbWVPcmlnaW46ICR7cGVyZm9ybWFuY2UudGltZU9yaWdpbn0pYClcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLmRlYnVnKGBFcnJvciBjb252ZXJ0aW5nIHN0YXJ0VGltZSB0byBlcG9jaDogJHt1dGlsLmZvcm1hdChlKX1gKVxuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuZGV0YWlsc1tlbnRyeS5uYW1lXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZmluYWxFbnRyeSA9IE9iamVjdC5hc3NpZ24oZmluYWxFbnRyeSwgdGhpcy5kZXRhaWxzW2VudHJ5Lm5hbWVdKVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmRldGFpbHNbZW50cnkubmFtZV1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbWVhc3VyZWRFdmVudHMucHVzaChmaW5hbEVudHJ5KVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICApXG5cbiAgICAgICAgICAgIGlmIChwcm9jZXNzLmVudltQRVJGX01FQVNVUkVNRU5UX0VOVl0pIHtcbiAgICAgICAgICAgICAgICBsaXN0LmdldEVudHJpZXMoKS5mb3JFYWNoKChlbnRyeSkgPT4gdGhpcy5fZXZlbnRzLnB1c2goZW50cnkpKVxuICAgICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgICBjb25zdCBlbnRyeVR5cGVzOiBFbnRyeVR5cGVbXSA9IFsnbWVhc3VyZSddXG4gICAgICAgIGlmIChwcm9jZXNzLmVudltQRVJGX01FQVNVUkVNRU5UX0VOVl0pIHtcbiAgICAgICAgICAgIGVudHJ5VHlwZXMucHVzaCgnZnVuY3Rpb24nKVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuX29ic2VydmVyLm9ic2VydmUoeyBidWZmZXJlZDogdHJ1ZSwgZW50cnlUeXBlczogZW50cnlUeXBlcyB9KVxuICAgICAgICB0aGlzLnN0YXJ0ZWQgPSB0cnVlXG4gICAgICAgIGlmIChwcm9jZXNzLmVudltQRVJGX01FQVNVUkVNRU5UX0VOVl0pIHtcbiAgICAgICAgICAgIHRoaXMuX2NzdldyaXRlciA9IGNyZWF0ZU9iamVjdENzdldyaXRlcih7XG4gICAgICAgICAgICAgICAgcGF0aDogY3N2TmFtZSxcbiAgICAgICAgICAgICAgICBoZWFkZXI6IFtcbiAgICAgICAgICAgICAgICAgICAgeyBpZDogJ25hbWUnLCB0aXRsZTogJ0Z1bmN0aW9uIE5hbWUnIH0sXG4gICAgICAgICAgICAgICAgICAgIHsgaWQ6ICd0aW1lJywgdGl0bGU6ICdFeGVjdXRpb24gVGltZSAobXMpJyB9XG4gICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHN0YXRpYyBjYWxjdWxhdGVUaW1lcyhtZXRob2RzOiBzdHJpbmdbXSkgOiBudW1iZXIge1xuICAgICAgICBjb25zdCB0aW1lczogeyBba2V5OiBzdHJpbmddOiBudW1iZXIgfSA9IHt9XG4gICAgICAgIHRoaXMuX2V2ZW50cy5tYXAoKGVudHJ5KSA9PiB7XG4gICAgICAgICAgICBpZiAoIXRpbWVzW2VudHJ5Lm5hbWVdKSB7XG4gICAgICAgICAgICAgICAgdGltZXNbZW50cnkubmFtZV0gPSAwXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aW1lc1tlbnRyeS5uYW1lXSArPSBlbnRyeS5kdXJhdGlvblxuICAgICAgICB9KVxuICAgICAgICBjb25zdCB0aW1lVGFrZW4gPSBtZXRob2RzLnJlZHVjZSgoYSwgYykgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRpbWVzW2NdICsgKGEgfHwgMClcbiAgICAgICAgfSwgMClcbiAgICAgICAgQlN0YWNrTG9nZ2VyLmRlYnVnKGBUaW1lIGZvciAke21ldGhvZHN9IGlzICR7dGltZVRha2VufWApXG4gICAgICAgIHJldHVybiB0aW1lVGFrZW5cbiAgICB9XG5cbiAgICBzdGF0aWMgYXN5bmMgc3RvcEFuZEdlbmVyYXRlKGZpbGVuYW1lOiBzdHJpbmcgPSAncGVyZm9ybWFuY2Utb3duLmh0bWwnKSB7XG4gICAgICAgIGlmICghdGhpcy5zdGFydGVkKSB7XG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgZXZlbnRzSnNvbiA9IEpTT04uc3RyaW5naWZ5KHRoaXMuX21lYXN1cmVkRXZlbnRzKVxuICAgICAgICAgICAgLy8gcmVtb3ZlIGVuY2xvc2luZyBhcnJheSBhbmQgYWRkIGEgdHJhaWxpbmcgY29tbWEgc28gdGhhdCB3ZVxuICAgICAgICAgICAgLy8gZG9udCBuZWVkIHRvIGJvdGggcmVhZCBhbmQgdGhlbiB3cml0ZSB0aGUgZmlsZSwgd2UgY2FuIHVzZSBhcHBlbmQgaW5zdGVhZFxuICAgICAgICAgICAgY29uc3QgZmluYWxKU09OU3RyID0gZXZlbnRzSnNvbi5zbGljZSgxLCAtMSkgKyAnLCdcbiAgICAgICAgICAgIGF3YWl0IGZzUHJvbWlzZS5hcHBlbmRGaWxlKHRoaXMuanNvblJlcG9ydEZpbGVOYW1lLCBmaW5hbEpTT05TdHIpXG4gICAgICAgIH0gY2F0Y2ggKGVyKSB7XG4gICAgICAgICAgICBCU3RhY2tMb2dnZXIuZGVidWcoYEZhaWxlZCB0byB3cml0ZSBldmVudHMgb2YgdGhlIHdvcmtlciB0byAke3RoaXMuanNvblJlcG9ydEZpbGVOYW1lfTogJHt1dGlsLmZvcm1hdChlcil9YClcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9vYnNlcnZlci5kaXNjb25uZWN0KClcblxuICAgICAgICBpZiAoIXByb2Nlc3MuZW52W1BFUkZfTUVBU1VSRU1FTlRfRU5WXSkge1xuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnN0YXJ0ZWQgPSBmYWxzZVxuXG4gICAgICAgIC8vIEdlbmVyYXRlIENTViBhbmQgSFRNTCByZXBvcnRzIHVzaW5nIGRpcmVjdGx5IGNvbGxlY3RlZCBldmVudHNcbiAgICAgICAgdGhpcy5nZW5lcmF0ZUNTVih0aGlzLl9ldmVudHMpXG5cbiAgICAgICAgY29uc3QgY29udGVudCA9IHRoaXMuZ2VuZXJhdGVSZXBvcnQodGhpcy5fZXZlbnRzKVxuICAgICAgICBjb25zdCBkaXIgPSBwYXRoLmpvaW4ocHJvY2Vzcy5jd2QoKSwgZmlsZW5hbWUpXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCBmc1Byb21pc2Uud3JpdGVGaWxlKGRpciwgY29udGVudClcbiAgICAgICAgICAgIEJTdGFja0xvZ2dlci5pbmZvKGBQZXJmb3JtYW5jZSByZXBvcnQgaXMgYXQgJHtwYXRofWApXG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLmVycm9yKGBFcnJvciBpbiB3cml0aW5nIGh0bWwgJHt1dGlsLmZvcm1hdChlcnIpfWApXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzdGF0aWMgZ2VuZXJhdGVSZXBvcnQoZW50cmllczogUGVyZm9ybWFuY2VFbnRyeVtdKSB7XG4gICAgICAgIGxldCBodG1sID0gJzwhRE9DVFlQRSBodG1sPjxodG1sPjxoZWFkPjx0aXRsZT5QZXJmb3JtYW5jZSBSZXBvcnQ8L3RpdGxlPjwvaGVhZD48Ym9keT4nXG4gICAgICAgIGh0bWwgKz0gJzxoMT5QZXJmb3JtYW5jZSBSZXBvcnQ8L2gxPidcbiAgICAgICAgaHRtbCArPSAnPHRhYmxlPjx0aGVhZD48dHI+PHRoPkZ1bmN0aW9uIE5hbWU8L3RoPjx0aD5EdXJhdGlvbiAobXMpPC90aD48L3RyPjwvdGhlYWQ+PHRib2R5PidcbiAgICAgICAgZW50cmllcy5mb3JFYWNoKChlbnRyeSkgPT4ge1xuICAgICAgICAgICAgaHRtbCArPSBgPHRyPjx0ZD4ke2VudHJ5Lm5hbWV9PC90ZD48dGQ+JHtlbnRyeS5kdXJhdGlvbn08L3RkPjwvdHI+YFxuICAgICAgICB9KVxuICAgICAgICBodG1sICs9ICc8L3Rib2R5PjwvdGFibGU+PC9ib2R5PjwvaHRtbD4nXG4gICAgICAgIHJldHVybiBodG1sXG4gICAgfVxuXG4gICAgc3RhdGljIGdlbmVyYXRlQ1NWKGVudHJpZXM6IFBlcmZvcm1hbmNlRW50cnlbXSkge1xuICAgICAgICBjb25zdCB0aW1lczogeyBba2V5OiBzdHJpbmddOiBudW1iZXIgfSA9IHt9XG4gICAgICAgIGVudHJpZXMubWFwKChlbnRyeSkgPT4ge1xuICAgICAgICAgICAgaWYgKCF0aW1lc1tlbnRyeS5uYW1lXSkge1xuICAgICAgICAgICAgICAgIHRpbWVzW2VudHJ5Lm5hbWVdID0gMFxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGltZXNbZW50cnkubmFtZV0gKz0gZW50cnkuZHVyYXRpb25cblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBuYW1lOiBlbnRyeS5uYW1lLFxuICAgICAgICAgICAgICAgIHRpbWU6IGVudHJ5LmR1cmF0aW9uXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICAgIGNvbnN0IGRhdCA9IE9iamVjdC5lbnRyaWVzKHRpbWVzKS5tYXAoKFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBuYW1lOiBrZXksXG4gICAgICAgICAgICAgICAgdGltZTogdmFsdWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICAgdGhpcy5fY3N2V3JpdGVyLndyaXRlUmVjb3JkcyhkYXQpXG4gICAgICAgICAgICAudGhlbigoKSA9PiBCU3RhY2tMb2dnZXIuaW5mbygnUGVyZm9ybWFuY2UgQ1NWIHJlcG9ydCBnZW5lcmF0ZWQgc3VjY2Vzc2Z1bGx5JykpXG4gICAgICAgICAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4gY29uc29sZS5lcnJvcihlcnJvcikpXG4gICAgfVxuXG4gICAgc3RhdGljIE1lYXN1cmUobGFiZWw6IHN0cmluZywgZGV0YWlsczogUGVyZm9ybWFuY2VEZXRhaWxzID0ge30pIHtcbiAgICAgICAgY29uc3Qgc2VsZiA9IHRoaXNcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIHRhcmdldDogb2JqZWN0LFxuICAgICAgICAgICAga2V5OiBzdHJpbmcgfCBzeW1ib2wsXG4gICAgICAgICAgICBkZXNjcmlwdG9yOiBUeXBlZFByb3BlcnR5RGVzY3JpcHRvcjxGdW5jdGlvbj4pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG9yaWdpbmFsTWV0aG9kOiBGdW5jdGlvbnx1bmRlZmluZWQgPSBkZXNjcmlwdG9yLnZhbHVlXG4gICAgICAgICAgICBpZiAoZGVzY3JpcHRvci52YWx1ZSkge1xuICAgICAgICAgICAgICAgIGRlc2NyaXB0b3IudmFsdWUgPSBmdW5jdGlvbiguLi5hcmdzOiBvYmplY3RbXSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gUGVyZm9ybWFuY2VUZXN0ZXIubWVhc3VyZS5hcHBseShzZWxmLCBbbGFiZWwsIG9yaWdpbmFsTWV0aG9kIGFzIEZ1bmN0aW9uLCB7IG1ldGhvZE5hbWU6IGtleS50b1N0cmluZygpLCAuLi5kZXRhaWxzIH0sIGFyZ3MsIHRoaXNdKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHN0YXRpYyBtZWFzdXJlV3JhcHBlcihuYW1lOiBzdHJpbmcsIGZuOiBGdW5jdGlvbiwgZGV0YWlsczogUGVyZm9ybWFuY2VEZXRhaWxzID0ge30pIHtcbiAgICAgICAgY29uc3Qgc2VsZiA9IHRoaXNcblxuICAgICAgICBkZXRhaWxzLndvcmtlciA9IFBlcmZvcm1hbmNlVGVzdGVyLmdldFByb2Nlc3NJZCgpXG4gICAgICAgIGRldGFpbHMudGVzdE5hbWUgPSBQZXJmb3JtYW5jZVRlc3Rlci5zY2VuYXJpb1RoYXRSYW4gJiYgUGVyZm9ybWFuY2VUZXN0ZXIuc2NlbmFyaW9UaGF0UmFuW1BlcmZvcm1hbmNlVGVzdGVyLnNjZW5hcmlvVGhhdFJhbi5sZW5ndGggLSAxXVxuICAgICAgICBkZXRhaWxzLnBsYXRmb3JtID0gUGVyZm9ybWFuY2VUZXN0ZXIuYnJvd3Nlcj8uc2Vzc2lvbklkXG5cbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICguLi5hcmdzOiAob2JqZWN0fGJvb2xlYW58dW5kZWZpbmVkfG51bGx8c3RyaW5nKVtdKSB7XG5cbiAgICAgICAgICAgIHJldHVybiBzZWxmLm1lYXN1cmUobmFtZSwgZm4sIGRldGFpbHMsIGFyZ3MpXG4gICAgICAgIH1cblxuICAgIH1cblxuICAgIHN0YXRpYyBpc0VuYWJsZWQoKSB7XG4gICAgICAgIHJldHVybiAhKHByb2Nlc3MuZW52LkJST1dTRVJTVEFDS19TREtfSU5TVFJVTUVOVEFUSU9OID09PSAnZmFsc2UnKVxuICAgIH1cblxuICAgIHN0YXRpYyBtZWFzdXJlKGxhYmVsOiBzdHJpbmcsIGZuOiBGdW5jdGlvbiwgZGV0YWlscyA9IHt9LCBhcmdzPzogKG9iamVjdHxib29sZWFufHVuZGVmaW5lZHxudWxsfHN0cmluZylbXSwgdGhpc0FyZzogb2JqZWN0fG51bGwgPSBudWxsKSB7XG4gICAgICAgIGlmICghdGhpcy5zdGFydGVkIHx8ICF0aGlzLmlzRW5hYmxlZCgpKSB7XG4gICAgICAgICAgICByZXR1cm4gZm4uYXBwbHkodGhpc0FyZywgYXJncylcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEdlbmVyYXRlIHVuaXF1ZSBtYXJrIG5hbWVzIGZvciB0aGlzIHNwZWNpZmljIGNhbGwgdG8gYXZvaWQgdGltaW5nIGNvbmZsaWN0c1xuICAgICAgICBjb25zdCB1bmlxdWVJZCA9IGAke0RhdGUubm93KCl9LSR7TWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc3Vic3RyaW5nKDcpfWBcbiAgICAgICAgY29uc3Qgc3RhcnRNYXJrID0gYCR7bGFiZWx9LXN0YXJ0LSR7dW5pcXVlSWR9YFxuICAgICAgICBjb25zdCBlbmRNYXJrID0gYCR7bGFiZWx9LWVuZC0ke3VuaXF1ZUlkfWBcblxuICAgICAgICAvLyBDcmVhdGUgdGhlIHN0YXJ0IG1hcmsgd2l0aCB1bmlxdWUgSURcbiAgICAgICAgc2FmZU1hcmsoc3RhcnRNYXJrKVxuXG4gICAgICAgIC8vIFN0b3JlIGRldGFpbHMgd2l0aCBtZWFzdXJlbWVudCBjb250ZXh0XG4gICAgICAgIGNvbnN0IGRldGFpbHNXaXRoQ29udGV4dCA9IHtcbiAgICAgICAgICAgIC4uLmRldGFpbHMsXG4gICAgICAgICAgICBtZWFzdXJlbWVudElkOiB1bmlxdWVJZFxuICAgICAgICB9XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHJldHVyblZhbCA9IGZuLmFwcGx5KHRoaXNBcmcsIGFyZ3MpXG5cbiAgICAgICAgICAgIGlmIChyZXR1cm5WYWwgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuVmFsXG4gICAgICAgICAgICAgICAgICAgICAgICAudGhlbih2ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBVc2Ugc3BlY2lmaWMgbWFya3MgZm9yIHRoaXMgY2FsbFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhZmVNYXJrKGVuZE1hcmspXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FmZU1lYXN1cmUobGFiZWwsIHN0YXJ0TWFyaywgZW5kTWFyaylcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGV0YWlsc1tsYWJlbF0gPSBPYmplY3QuYXNzaWduKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VjY2VzczogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFpbHVyZTogdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50V29ya2VySWQ6IFBlcmZvcm1hbmNlVGVzdGVyLmdldENsaWVudFdvcmtlcklkKCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtlcjogUGVyZm9ybWFuY2VUZXN0ZXIuZ2V0UHJvY2Vzc0lkKCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXRmb3JtOiBQZXJmb3JtYW5jZVRlc3Rlci5icm93c2VyPy5zZXNzaW9uSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3ROYW1lOiBQZXJmb3JtYW5jZVRlc3Rlci5zY2VuYXJpb1RoYXRSYW4/LnBvcCgpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgZGV0YWlsc1dpdGhDb250ZXh0KSwgdGhpcy5kZXRhaWxzW2xhYmVsXSB8fCB7fSkpXG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHYpXG4gICAgICAgICAgICAgICAgICAgICAgICB9KS5jYXRjaChlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYWZlTWFyayhlbmRNYXJrKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhZmVNZWFzdXJlKGxhYmVsLCBzdGFydE1hcmssIGVuZE1hcmspXG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRldGFpbHNbbGFiZWxdID0gT2JqZWN0LmFzc2lnbih7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWlsdXJlOiB1dGlsLmZvcm1hdChlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudFdvcmtlcklkOiBQZXJmb3JtYW5jZVRlc3Rlci5nZXRDbGllbnRXb3JrZXJJZCgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrZXI6IFBlcmZvcm1hbmNlVGVzdGVyLmdldFByb2Nlc3NJZCgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF0Zm9ybTogUGVyZm9ybWFuY2VUZXN0ZXIuYnJvd3Nlcj8uc2Vzc2lvbklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0TmFtZTogUGVyZm9ybWFuY2VUZXN0ZXIuc2NlbmFyaW9UaGF0UmFuPy5wb3AoKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGRldGFpbHNXaXRoQ29udGV4dCksIHRoaXMuZGV0YWlsc1tsYWJlbF0gfHwge30pKVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGUpXG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFN5bmNocm9ub3VzIGV4ZWN1dGlvblxuICAgICAgICAgICAgc2FmZU1hcmsoZW5kTWFyaylcbiAgICAgICAgICAgIHNhZmVNZWFzdXJlKGxhYmVsLCBzdGFydE1hcmssIGVuZE1hcmspXG5cbiAgICAgICAgICAgIHRoaXMuZGV0YWlsc1tsYWJlbF0gPSBPYmplY3QuYXNzaWduKHtcbiAgICAgICAgICAgICAgICBzdWNjZXNzOiB0cnVlLFxuICAgICAgICAgICAgICAgIGZhaWx1cmU6IHVuZGVmaW5lZFxuICAgICAgICAgICAgfSwgT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHtcbiAgICAgICAgICAgICAgICBjbGllbnRXb3JrZXJJZDogUGVyZm9ybWFuY2VUZXN0ZXIuZ2V0Q2xpZW50V29ya2VySWQoKSxcbiAgICAgICAgICAgICAgICB3b3JrZXI6IFBlcmZvcm1hbmNlVGVzdGVyLmdldFByb2Nlc3NJZCgpLFxuICAgICAgICAgICAgICAgIHBsYXRmb3JtOiBQZXJmb3JtYW5jZVRlc3Rlci5icm93c2VyPy5zZXNzaW9uSWQsXG4gICAgICAgICAgICAgICAgdGVzdE5hbWU6IFBlcmZvcm1hbmNlVGVzdGVyLnNjZW5hcmlvVGhhdFJhbj8ucG9wKClcbiAgICAgICAgICAgIH0sIGRldGFpbHNXaXRoQ29udGV4dCksIHRoaXMuZGV0YWlsc1tsYWJlbF0gfHwge30pKVxuXG4gICAgICAgICAgICByZXR1cm4gcmV0dXJuVmFsXG4gICAgICAgIH0gY2F0Y2ggKGVyKSB7XG4gICAgICAgICAgICBzYWZlTWFyayhlbmRNYXJrKVxuICAgICAgICAgICAgc2FmZU1lYXN1cmUobGFiZWwsIHN0YXJ0TWFyaywgZW5kTWFyaylcblxuICAgICAgICAgICAgdGhpcy5kZXRhaWxzW2xhYmVsXSA9IE9iamVjdC5hc3NpZ24oe1xuICAgICAgICAgICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICAgICAgICAgIGZhaWx1cmU6IHV0aWwuZm9ybWF0KGVyKVxuICAgICAgICAgICAgfSwgT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHtcbiAgICAgICAgICAgICAgICBjbGllbnRXb3JrZXJJZDogUGVyZm9ybWFuY2VUZXN0ZXIuZ2V0Q2xpZW50V29ya2VySWQoKSxcbiAgICAgICAgICAgICAgICB3b3JrZXI6IFBlcmZvcm1hbmNlVGVzdGVyLmdldFByb2Nlc3NJZCgpLFxuICAgICAgICAgICAgICAgIHBsYXRmb3JtOiBQZXJmb3JtYW5jZVRlc3Rlci5icm93c2VyPy5zZXNzaW9uSWQsXG4gICAgICAgICAgICAgICAgdGVzdE5hbWU6IFBlcmZvcm1hbmNlVGVzdGVyLnNjZW5hcmlvVGhhdFJhbj8ucG9wKClcbiAgICAgICAgICAgIH0sIGRldGFpbHNXaXRoQ29udGV4dCksIHRoaXMuZGV0YWlsc1tsYWJlbF0gfHwge30pKVxuXG4gICAgICAgICAgICB0aHJvdyBlclxuICAgICAgICB9XG4gICAgfVxuXG4gICAgc3RhdGljIHN0YXJ0KGV2ZW50OiBzdHJpbmcpIHtcbiAgICAgICAgY29uc3QgZmluYWxFdmVudCA9IGV2ZW50ICsgJy1zdGFydCdcbiAgICAgICAgaWYgKHRoaXMuZXZlbnRzTWFwW2ZpbmFsRXZlbnRdKSB7cmV0dXJufVxuICAgICAgICBzYWZlTWFyayhmaW5hbEV2ZW50KVxuICAgICAgICB0aGlzLmV2ZW50c01hcFtmaW5hbEV2ZW50XSA9IDFcbiAgICB9XG5cbiAgICBzdGF0aWMgZW5kKGV2ZW50OiBzdHJpbmcsIHN1Y2Nlc3MgPSB0cnVlLCBmYWlsdXJlPzogc3RyaW5nIHwgdW5rbm93biwgZGV0YWlscyA9IHt9KSB7XG4gICAgICAgIHNhZmVNYXJrKGV2ZW50ICsgJy1lbmQnKVxuICAgICAgICBzYWZlTWVhc3VyZShldmVudCwgZXZlbnQgKyAnLXN0YXJ0JywgZXZlbnQgKyAnLWVuZCcpXG4gICAgICAgIC8vIENsZWFyIHRoZSBzdGFydC1tYXJrIGd1YXJkIHNvIGEgc3Vic2VxdWVudCBzdGFydChldmVudCkgZm9yIHRoZSBzYW1lXG4gICAgICAgIC8vIGV2ZW50IGFjdHVhbGx5IG1hcmtzIGEgbmV3IHN0YXJ0LiBXaXRob3V0IHRoaXMsIHN0YXJ0KCkgc2hvcnQtY2lyY3VpdHNcbiAgICAgICAgLy8gYW5kIHRoZSBuZXh0IGVuZCgpIG1lYXN1cmVzIGZyb20gdGhlIG9yaWdpbmFsIHN0YXJ0IG1hcmsgXHUyMDE0IGluZmxhdGVkXG4gICAgICAgIC8vIGR1cmF0aW9ucyBpbiB0ZWxlbWV0cnkgb24gZXZlcnkgY2FsbCBhZnRlciB0aGUgZmlyc3QuXG4gICAgICAgIGRlbGV0ZSB0aGlzLmV2ZW50c01hcFtldmVudCArICctc3RhcnQnXVxuICAgICAgICB0aGlzLmRldGFpbHNbZXZlbnRdID0gT2JqZWN0LmFzc2lnbih7IHN1Y2Nlc3MsIGZhaWx1cmU6IHV0aWwuZm9ybWF0KGZhaWx1cmUpIH0sIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7XG4gICAgICAgICAgICBjbGllbnRXb3JrZXJJZDogUGVyZm9ybWFuY2VUZXN0ZXIuZ2V0Q2xpZW50V29ya2VySWQoKSxcbiAgICAgICAgICAgIHdvcmtlcjogUGVyZm9ybWFuY2VUZXN0ZXIuZ2V0UHJvY2Vzc0lkKCksXG4gICAgICAgICAgICBwbGF0Zm9ybTogUGVyZm9ybWFuY2VUZXN0ZXIuYnJvd3Nlcj8uc2Vzc2lvbklkLFxuICAgICAgICAgICAgdGVzdE5hbWU6IFBlcmZvcm1hbmNlVGVzdGVyLnNjZW5hcmlvVGhhdFJhbiAmJiBQZXJmb3JtYW5jZVRlc3Rlci5zY2VuYXJpb1RoYXRSYW5bUGVyZm9ybWFuY2VUZXN0ZXIuc2NlbmFyaW9UaGF0UmFuLmxlbmd0aCAtIDFdXG4gICAgICAgIH0sIGRldGFpbHMpLCB0aGlzLmRldGFpbHNbZXZlbnRdIHx8IHt9KSlcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgY2xpZW50IHdvcmtlciBJRCBpbiBmb3JtYXQgXCJ0aHJlYWRJZC1wcm9jZXNzSWRcIi5cbiAgICAgKiBUaGlzIG1ldGhvZCBwcm92aWRlcyBhIGNvbnNpc3RlbnQgaWRlbnRpZmllciBhY3Jvc3MgdGhlIFNESyBmb3IgdHJhY2tpbmdcbiAgICAgKiB3b3JrZXItc3BlY2lmaWMgZXZlbnRzIGFuZCBwZXJmb3JtYW5jZSBtZXRyaWNzLlxuICAgICAqXG4gICAgICogQHJldHVybnMgV29ya2VyIElEIHN0cmluZyBpbiBmb3JtYXQgXCJ0aHJlYWRJZC1wcm9jZXNzSWRcIlxuICAgICAqL1xuICAgIHN0YXRpYyBnZXRDbGllbnRXb3JrZXJJZCgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gQ0xJVXRpbHMuZ2V0Q2xpZW50V29ya2VySWQoKVxuICAgIH1cblxuICAgIHN0YXRpYyBnZXRQcm9jZXNzSWQoKSB7XG4gICAgICAgIHJldHVybiBgJHtwcm9jZXNzLnBpZH0tJHt3b3JrZXIudGhyZWFkSWR9YFxuICAgIH1cblxuICAgIHN0YXRpYyBzbGVlcCA9IChtcyA9IDEwMCkgPT4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgbXMpKVxuXG4gICAgc3RhdGljIGFzeW5jIHVwbG9hZEV2ZW50c0RhdGEoKSB7XG4gICAgICAgIC8vIFRyYWNrIG92ZXJhbGwga2V5IG1ldHJpY3Mgb3BlcmF0aW9uXG4gICAgICAgIHRoaXMuc3RhcnQoRVZFTlRTLlNES19TRU5EX0tFWV9NRVRSSUNTKVxuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCB3b3JrZXJJZCA9IGAke3Byb2Nlc3MucGlkfWBcbiAgICAgICAgICAgIEJTdGFja0xvZ2dlci5kZWJ1ZyhgW1BlcmZvcm1hbmNlIFVwbG9hZF0gU3RhcnRpbmcgdXBsb2FkIGZvciB3b3JrZXIgJHt3b3JrZXJJZH1gKVxuXG4gICAgICAgICAgICAvLyBUcmFjayBwcmVwYXJhdGlvbiBwaGFzZSAoY29sbGVjdGlvbiBhbmQgZGVkdXBsaWNhdGlvbilcbiAgICAgICAgICAgIHRoaXMuc3RhcnQoRVZFTlRTLlNES19LRVlfTUVUUklDU19QUkVQQVJBVElPTilcblxuICAgICAgICAgICAgLy8gQ29sbGVjdCBhbGwgbWVhc3VyZXMgZnJvbSBwZXJmb3JtYW5jZSByZXBvcnQgZmlsZXMgYW5kIGluLW1lbW9yeSBldmVudHNcbiAgICAgICAgICAgIGxldCBtZWFzdXJlczogUmVjb3JkPHN0cmluZywgdW5rbm93bj5bXSA9IFtdXG4gICAgICAgICAgICBpZiAoYXdhaXQgZnNQcm9taXNlLmFjY2Vzcyh0aGlzLmpzb25SZXBvcnREaXJQYXRoKS50aGVuKCgpID0+IHRydWUpLmNhdGNoKCgpID0+IGZhbHNlKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGZpbGVzID0gKGF3YWl0IGZzUHJvbWlzZS5yZWFkZGlyKHRoaXMuanNvblJlcG9ydERpclBhdGgpKS5tYXAoZmlsZSA9PiBwYXRoLnJlc29sdmUodGhpcy5qc29uUmVwb3J0RGlyUGF0aCwgZmlsZSkpXG4gICAgICAgICAgICAgICAgbWVhc3VyZXMgPSAoYXdhaXQgUHJvbWlzZS5hbGwoZmlsZXMubWFwKChmaWxlKSA9PiBmc1Byb21pc2UucmVhZEZpbGUoZmlsZSwgJ3V0Zi04JykpKSkubWFwKGVsID0+IGBbJHtlbC5zbGljZSgwLCAtMSl9XWApLm1hcChlbCA9PiBKU09OLnBhcnNlKGVsKSkuZmxhdCgpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBCU3RhY2tMb2dnZXIuZGVidWcoYFtQZXJmb3JtYW5jZSBVcGxvYWRdIFRvdGFsIGV2ZW50cyBmcm9tIGZpbGVzOiAke21lYXN1cmVzLmxlbmd0aH1gKVxuXG4gICAgICAgICAgICBpZiAodGhpcy5fbWVhc3VyZWRFdmVudHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIEJTdGFja0xvZ2dlci5kZWJ1ZyhgW1BlcmZvcm1hbmNlIFVwbG9hZF0gQWRkaW5nICR7dGhpcy5fbWVhc3VyZWRFdmVudHMubGVuZ3RofSBpbi1tZW1vcnkgZXZlbnRzYClcbiAgICAgICAgICAgICAgICBtZWFzdXJlcyA9IG1lYXN1cmVzLmNvbmNhdChcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbWVhc3VyZWRFdmVudHMubWFwKGUgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ29udmVydCBQZXJmb3JtYW5jZUVudHJ5IHRvIHBsYWluIG9iamVjdCBpZiBpdCBoYXMgdG9KU09OXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIChlIGFzIFBlcmZvcm1hbmNlRW50cnkpLnRvSlNPTiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoZSBhcyBQZXJmb3JtYW5jZUVudHJ5KS50b0pTT04oKSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBlbnN1cmVFcG9jaFRpbWVzID0gKGFycjogUmVjb3JkPHN0cmluZywgdW5rbm93bj5bXSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IG5vdyA9IERhdGUubm93KClcbiAgICAgICAgICAgICAgICBjb25zdCBjdXRvZmYgPSAxZTEyIC8vIH55ZWFyIDIwMDEsIG1zIGVwb2NoXG4gICAgICAgICAgICAgICAgY29uc3QgdGltZU9yaWdpbiA9IChcbiAgICAgICAgICAgICAgICAgICAgdHlwZW9mIHBlcmZvcm1hbmNlICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgcGVyZm9ybWFuY2UudGltZU9yaWdpbiA9PT0gJ251bWJlcidcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgID8gcGVyZm9ybWFuY2UudGltZU9yaWdpblxuICAgICAgICAgICAgICAgICAgICA6IChub3cgLSBwcm9jZXNzLnVwdGltZSgpICogMTAwMClcbiAgICAgICAgICAgICAgICByZXR1cm4gYXJyLm1hcChlbnRyeSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgZW50cnkuc3RhcnRUaW1lID09PSAnbnVtYmVyJyAmJiBlbnRyeS5zdGFydFRpbWUgPCBjdXRvZmYpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5LnN0YXJ0VGltZSA9IHRpbWVPcmlnaW4gKyBlbnRyeS5zdGFydFRpbWVcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW50cnlcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbWVhc3VyZXMgPSBlbnN1cmVFcG9jaFRpbWVzKG1lYXN1cmVzKVxuICAgICAgICAgICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKClcbiAgICAgICAgICAgIC8vIHl5eXktTU0tZGQnVCdISDptbTpzcy5TU1NTU1MgWlxuICAgICAgICAgICAgY29uc3Qgb3B0aW9uczogSW50bC5EYXRlVGltZUZvcm1hdE9wdGlvbnMgPSB7XG4gICAgICAgICAgICAgICAgdGltZVpvbmU6ICdVVEMnLFxuICAgICAgICAgICAgICAgIHllYXI6ICdudW1lcmljJyxcbiAgICAgICAgICAgICAgICBtb250aDogJzItZGlnaXQnLFxuICAgICAgICAgICAgICAgIGRheTogJzItZGlnaXQnLFxuICAgICAgICAgICAgICAgIGhvdXI6ICcyLWRpZ2l0JyxcbiAgICAgICAgICAgICAgICBtaW51dGU6ICcyLWRpZ2l0JyxcbiAgICAgICAgICAgICAgICBzZWNvbmQ6ICcyLWRpZ2l0JyxcbiAgICAgICAgICAgICAgICBmcmFjdGlvbmFsU2Vjb25kRGlnaXRzOiAzLCAvLyBUbyBpbmNsdWRlIG1pY3Jvc2Vjb25kc1xuICAgICAgICAgICAgICAgIGhvdXIxMjogZmFsc2VcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIEZvcm1hdCB0aGUgZGF0ZSBhbmQgcmVwbGFjZSB0aGUgZGVmYXVsdCBzZXBhcmF0b3IgZm9yIHRpbWUgem9uZVxuICAgICAgICAgICAgY29uc3QgZm9ybWF0dGVkRGF0ZSA9IG5ldyBJbnRsLkRhdGVUaW1lRm9ybWF0KCdlbi1HQicsIG9wdGlvbnMpXG4gICAgICAgICAgICAgICAgLmZvcm1hdFRvUGFydHMoZGF0ZSlcbiAgICAgICAgICAgICAgICAubWFwKCh7IHR5cGUsIHZhbHVlIH0pID0+IHR5cGUgPT09ICd0aW1lWm9uZU5hbWUnID8gJ1onIDogdmFsdWUpXG4gICAgICAgICAgICAgICAgLmpvaW4oJycpXG4gICAgICAgICAgICAgICAgLnJlcGxhY2UoJywnLCAnVCcpXG5cbiAgICAgICAgICAgIHRoaXMuZW5kKEVWRU5UUy5TREtfS0VZX01FVFJJQ1NfUFJFUEFSQVRJT04sIHRydWUpXG4gICAgICAgICAgICBjb25zdCBwYXlsb2FkID0ge1xuICAgICAgICAgICAgICAgIGV2ZW50X3R5cGU6ICdzZGtfZXZlbnRzJyxcbiAgICAgICAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICAgICAgICAgIHRlc3RodWJfdXVpZDogcHJvY2Vzcy5lbnYuUEVSRl9URVNUSFVCX1VVSUQgfHwgcHJvY2Vzcy5lbnYuU0RLX1JVTl9JRCxcbiAgICAgICAgICAgICAgICAgICAgY3JlYXRlZF9kYXk6IGZvcm1hdHRlZERhdGUsXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50X25hbWU6ICdTREtGZWF0dXJlUGVyZm9ybWFuY2UnLFxuICAgICAgICAgICAgICAgICAgICB1c2VyX2RhdGE6IHByb2Nlc3MuZW52LlBFUkZfVVNFUl9OQU1FLFxuICAgICAgICAgICAgICAgICAgICBob3N0X2luZm86IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGhvc3RuYW1lOiBob3N0bmFtZSgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgcGxhdGZvcm06IHBsYXRmb3JtKCksXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiB0eXBlKCksXG4gICAgICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uOiB2ZXJzaW9uKCksXG4gICAgICAgICAgICAgICAgICAgICAgICBhcmNoOiBhcmNoKClcbiAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50X2pzb246IHsgbWVhc3VyZXM6IG1lYXN1cmVzLCBzZGtSdW5JZDogcHJvY2Vzcy5lbnYuU0RLX1JVTl9JRCB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZmV0Y2hXcmFwKGAke0FQSVV0aWxzLkVEU19VUkx9L3NlbmRfc2RrX2V2ZW50c2AsIHtcbiAgICAgICAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICAgICAgICAgICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24vanNvbidcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHBheWxvYWQpXG4gICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICBCU3RhY2tMb2dnZXIuZGVidWcoYFtQZXJmb3JtYW5jZSBVcGxvYWRdIFN1Y2Nlc3NmdWxseSB1cGxvYWRlZCB0byBFRFM6ICR7dXRpbC5mb3JtYXQoYXdhaXQgcmVzdWx0LnRleHQoKSl9YClcblxuICAgICAgICAgICAgdGhpcy5lbmQoRVZFTlRTLlNES19TRU5EX0tFWV9NRVRSSUNTLCB0cnVlKVxuICAgICAgICB9IGNhdGNoIChlcikge1xuICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLmRlYnVnKGBbUGVyZm9ybWFuY2UgVXBsb2FkXSBGYWlsZWQgdG8gdXBsb2FkIGV2ZW50czogJHt1dGlsLmZvcm1hdChlcil9YClcbiAgICAgICAgICAgIHRoaXMuZW5kKEVWRU5UUy5TREtfS0VZX01FVFJJQ1NfUFJFUEFSQVRJT04sIGZhbHNlLCBlcilcbiAgICAgICAgICAgIHRoaXMuZW5kKEVWRU5UUy5TREtfU0VORF9LRVlfTUVUUklDUywgZmFsc2UsIGVyKVxuICAgICAgICB9XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmIChhd2FpdCBmc1Byb21pc2UuYWNjZXNzKHRoaXMuanNvblJlcG9ydERpclBhdGgpLnRoZW4oKCkgPT4gdHJ1ZSwgKCkgPT4gZmFsc2UpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZmlsZXMgPSBhd2FpdCBmc1Byb21pc2UucmVhZGRpcih0aGlzLmpzb25SZXBvcnREaXJQYXRoKVxuXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBmaWxlIG9mIGZpbGVzKSB7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGZzUHJvbWlzZS51bmxpbmsocGF0aC5qb2luKHRoaXMuanNvblJlcG9ydERpclBhdGgsIGZpbGUpKVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIEJTdGFja0xvZ2dlci5kZWJ1ZyhgW1BlcmZvcm1hbmNlIFVwbG9hZF0gQ2xlYW5lZCB1cCAke2ZpbGVzLmxlbmd0aH0gdGVtcG9yYXJ5IHJlcG9ydCBmaWxlc2ApXG4gICAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGVyKSB7XG4gICAgICAgICAgICBCU3RhY2tMb2dnZXIuZGVidWcoYFtQZXJmb3JtYW5jZSBVcGxvYWRdIEZhaWxlZCB0byBkZWxldGUgdGVtcG9yYXJ5IGZpbGVzOiAke3V0aWwuZm9ybWF0KGVyKX1gKVxuICAgICAgICB9XG4gICAgfVxufVxuIiwgImltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCdcbmltcG9ydCBmcyBmcm9tICdub2RlOmZzJ1xuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJ1xuXG5pbXBvcnQgbG9nZ2VyIGZyb20gJ0B3ZGlvL2xvZ2dlcidcblxuaW1wb3J0IHsgTE9HU19GSUxFIH0gZnJvbSAnLi9jb25zdGFudHMuanMnXG5pbXBvcnQgeyBDT0xPUlMgfSBmcm9tICcuL3V0aWwuanMnXG5cbmNvbnN0IGxvZyA9IGxvZ2dlcignQHdkaW8vYnJvd3NlcnN0YWNrLXNlcnZpY2UnKVxuXG5leHBvcnQgY2xhc3MgQlN0YWNrTG9nZ2VyIHtcbiAgICBwdWJsaWMgc3RhdGljIGxvZ0ZpbGVQYXRoID0gcGF0aC5qb2luKHByb2Nlc3MuY3dkKCksIExPR1NfRklMRSlcbiAgICBwdWJsaWMgc3RhdGljIGxvZ0ZvbGRlclBhdGggPSBwYXRoLmpvaW4ocHJvY2Vzcy5jd2QoKSwgJ2xvZ3MnKVxuICAgIHByaXZhdGUgc3RhdGljIGxvZ0ZpbGVTdHJlYW06IGZzLldyaXRlU3RyZWFtIHwgbnVsbFxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgcmVkYWN0Q3JlZGVudGlhbHMobG9nTWVzc2FnZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIGxvZ01lc3NhZ2VcbiAgICAgICAgICAgIC5yZXBsYWNlKC8oW1wiJ10/KD86dXNlcm5hbWV8dXNlck5hbWV8YWNjZXNza2V5fGFjY2Vzc0tleXx1c2VyfGtleSlbXCInXT9cXHMqWzo9XVxccypbXCInXT8pKFteXCInXFxzLH1dKykvZ2ksICckMScpXG4gICAgICAgICAgICAucmVwbGFjZSgvKFs/Jl0oPzp1c2VybmFtZXx1c2VyTmFtZXxhY2Nlc3Nfa2V5fGFjY2Vzc2tleXxhY2Nlc3NLZXl8dXNlcnxrZXkpPSkoW14mI1xcc10rKS9naSwgJyQxJylcbiAgICB9XG5cbiAgICBzdGF0aWMgbG9nVG9GaWxlKGxvZ01lc3NhZ2U6IHN0cmluZywgbG9nTGV2ZWw6IHN0cmluZykge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgcmVkYWN0ZWRNZXNzYWdlID0gdGhpcy5yZWRhY3RDcmVkZW50aWFscyhsb2dNZXNzYWdlKVxuICAgICAgICAgICAgaWYgKCF0aGlzLmxvZ0ZpbGVTdHJlYW0pIHtcbiAgICAgICAgICAgICAgICB0aGlzLmVuc3VyZUxvZ3NGb2xkZXIoKVxuICAgICAgICAgICAgICAgIHRoaXMubG9nRmlsZVN0cmVhbSA9IGZzLmNyZWF0ZVdyaXRlU3RyZWFtKHRoaXMubG9nRmlsZVBhdGgsIHsgZmxhZ3M6ICdhJyB9KVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMubG9nRmlsZVN0cmVhbSAmJiB0aGlzLmxvZ0ZpbGVTdHJlYW0ud3JpdGFibGUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ0ZpbGVTdHJlYW0ud3JpdGUodGhpcy5mb3JtYXRMb2cocmVkYWN0ZWRNZXNzYWdlLCBsb2dMZXZlbCkpXG4gICAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBsb2cuZGVidWcoYEZhaWxlZCB0byBsb2cgdG8gZmlsZS4gRXJyb3IgJHtlcnJvcn1gKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgZm9ybWF0TG9nKGxvZ01lc3NhZ2U6IHN0cmluZywgbGV2ZWw6IHN0cmluZykge1xuICAgICAgICByZXR1cm4gYCR7Y2hhbGsuZ3JheShuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCkpfSAke2NoYWxrW0NPTE9SU1tsZXZlbF1dKGxldmVsLnRvVXBwZXJDYXNlKCkpfSAke2NoYWxrLndoaXRlQnJpZ2h0KCdAd2Rpby9icm93c2Vyc3RhY2stc2VydmljZScpfSAke2xvZ01lc3NhZ2V9XFxuYFxuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgaW5mbyhtZXNzYWdlOiBzdHJpbmcpIHtcbiAgICAgICAgY29uc3QgcmVkYWN0ZWRNZXNzYWdlID0gdGhpcy5yZWRhY3RDcmVkZW50aWFscyhtZXNzYWdlKVxuICAgICAgICB0aGlzLmxvZ1RvRmlsZShyZWRhY3RlZE1lc3NhZ2UsICdpbmZvJylcbiAgICAgICAgbG9nLmluZm8ocmVkYWN0ZWRNZXNzYWdlKVxuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZXJyb3IobWVzc2FnZTogc3RyaW5nKSB7XG4gICAgICAgIGNvbnN0IHJlZGFjdGVkTWVzc2FnZSA9IHRoaXMucmVkYWN0Q3JlZGVudGlhbHMobWVzc2FnZSlcbiAgICAgICAgdGhpcy5sb2dUb0ZpbGUocmVkYWN0ZWRNZXNzYWdlLCAnZXJyb3InKVxuICAgICAgICBsb2cuZXJyb3IocmVkYWN0ZWRNZXNzYWdlKVxuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZGVidWcobWVzc2FnZTogc3RyaW5nLCBwYXJhbT86IHVua25vd24pIHtcbiAgICAgICAgY29uc3QgcmVkYWN0ZWRNZXNzYWdlID0gdGhpcy5yZWRhY3RDcmVkZW50aWFscyhtZXNzYWdlKVxuICAgICAgICB0aGlzLmxvZ1RvRmlsZShyZWRhY3RlZE1lc3NhZ2UsICdkZWJ1ZycpXG4gICAgICAgIGlmIChwYXJhbSkge1xuICAgICAgICAgICAgbG9nLmRlYnVnKHJlZGFjdGVkTWVzc2FnZSwgcGFyYW0pXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsb2cuZGVidWcocmVkYWN0ZWRNZXNzYWdlKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyB3YXJuKG1lc3NhZ2U6IHN0cmluZykge1xuICAgICAgICBjb25zdCByZWRhY3RlZE1lc3NhZ2UgPSB0aGlzLnJlZGFjdENyZWRlbnRpYWxzKG1lc3NhZ2UpXG4gICAgICAgIHRoaXMubG9nVG9GaWxlKHJlZGFjdGVkTWVzc2FnZSwgJ3dhcm4nKVxuICAgICAgICBsb2cud2FybihyZWRhY3RlZE1lc3NhZ2UpXG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyB0cmFjZShtZXNzYWdlOiBzdHJpbmcpIHtcbiAgICAgICAgY29uc3QgcmVkYWN0ZWRNZXNzYWdlID0gdGhpcy5yZWRhY3RDcmVkZW50aWFscyhtZXNzYWdlKVxuICAgICAgICB0aGlzLmxvZ1RvRmlsZShyZWRhY3RlZE1lc3NhZ2UsICd0cmFjZScpXG4gICAgICAgIGxvZy50cmFjZShyZWRhY3RlZE1lc3NhZ2UpXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRHJhaW4gd2hhdGV2ZXIgaXMgc3RpbGwgc2l0dGluZyBpbiB0aGUgbG9nIHN0cmVhbSdzIGJ1ZmZlciBvbnRvIGRpc2suXG4gICAgICpcbiAgICAgKiBgbG9nVG9GaWxlYCB3cml0ZXMgdG8gYW4gYXN5bmMgYGZzLldyaXRlU3RyZWFtYCwgc28gYSBsaW5lIGxvZ2dlZCBpbW1lZGlhdGVseSBiZWZvcmUgdGhlXG4gICAgICogYXJjaGl2ZSBpcyBidWlsdCBpcyB2ZXJ5IGxpa2VseSBOT1QgaW4gdGhlIGZpbGUgeWV0IFx1MjAxNCB0aGUgc3RyZWFtJ3MgYG9wZW5gIGlzIGFzeW5jIHRvbyxcbiAgICAgKiBzbyBlYXJseSBvbiB0aGUgZmlsZSBtYXkgbm90IGV4aXN0IGF0IGFsbC4gQW55dGhpbmcgdGhhdCBzbmFwc2hvdHMgdGhlIGxvZyAodGhlIGRlYnVnLWxvZ1xuICAgICAqIHVwbG9hZCkgbXVzdCBmbHVzaCBmaXJzdCBvciBpdCBzaGlwcyBhIHRydW5jYXRlZCBjb3B5LlxuICAgICAqXG4gICAgICogQSB6ZXJvLWxlbmd0aCB3cml0ZSdzIGNhbGxiYWNrIGZpcmVzIG9ubHkgYWZ0ZXIgZXZlcnkgY2h1bmsgcXVldWVkIGFoZWFkIG9mIGl0IGhhcyBiZWVuXG4gICAgICogaGFuZGVkIHRvIHRoZSBmcyBsYXllciwgd2hpY2ggZHJhaW5zIHRoZSBidWZmZXIgd2l0aG91dCBlbmRpbmcgdGhlIHN0cmVhbSBcdTIwMTQgdW5saWtlXG4gICAgICogYGNsZWFyTG9nZ2VyKClgLCBsb2dnaW5nIGNvbnRpbnVlcyB0byB3b3JrIGFmdGVyd2FyZHMuXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBhc3luYyBmbHVzaExvZ0ZpbGUodGltZW91dE1zID0gMjAwMCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBjb25zdCBzdHJlYW0gPSB0aGlzLmxvZ0ZpbGVTdHJlYW1cbiAgICAgICAgaWYgKCFzdHJlYW0gfHwgIXN0cmVhbS53cml0YWJsZSkge1xuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgICAgLy8gTmV2ZXIgbGV0IGEgc3R1Y2sgc3RyZWFtIGhvbGQgdXAgdGhlIHVwbG9hZDsgYSB0cnVuY2F0ZWQgbG9nIGJlYXRzIG5vIGxvZyBhdCBhbGwuXG4gICAgICAgIGF3YWl0IG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB0aW1lciA9IHNldFRpbWVvdXQocmVzb2x2ZSwgdGltZW91dE1zKVxuICAgICAgICAgICAgdGltZXIudW5yZWY/LigpXG4gICAgICAgICAgICBzdHJlYW0ud3JpdGUoJycsICgpID0+IHtcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQodGltZXIpXG4gICAgICAgICAgICAgICAgcmVzb2x2ZSgpXG4gICAgICAgICAgICB9KVxuICAgICAgICB9KVxuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgY2xlYXJMb2dnZXIoKSB7XG4gICAgICAgIGlmICh0aGlzLmxvZ0ZpbGVTdHJlYW0pIHtcbiAgICAgICAgICAgIHRoaXMubG9nRmlsZVN0cmVhbS5lbmQoKVxuICAgICAgICB9XG4gICAgICAgIHRoaXMubG9nRmlsZVN0cmVhbSA9IG51bGxcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGNsZWFyTG9nRmlsZSgpIHtcbiAgICAgICAgaWYgKGZzLmV4aXN0c1N5bmModGhpcy5sb2dGaWxlUGF0aCkpIHtcbiAgICAgICAgICAgIGZzLnRydW5jYXRlU3luYyh0aGlzLmxvZ0ZpbGVQYXRoKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBlbnN1cmVMb2dzRm9sZGVyKCkge1xuICAgICAgICBpZiAoIWZzLmV4aXN0c1N5bmModGhpcy5sb2dGb2xkZXJQYXRoKSl7XG4gICAgICAgICAgICBmcy5ta2RpclN5bmModGhpcy5sb2dGb2xkZXJQYXRoKVxuICAgICAgICB9XG4gICAgfVxufVxuIiwgIntcbiAgXCJuYW1lXCI6IFwiQHdkaW8vYnJvd3NlcnN0YWNrLXNlcnZpY2VcIixcbiAgXCJ2ZXJzaW9uXCI6IFwiOS4zOS42XCIsXG4gIFwiZGVzY3JpcHRpb25cIjogXCJXZWJkcml2ZXJJTyBzZXJ2aWNlIGZvciBiZXR0ZXIgQnJvd3NlcnN0YWNrIGludGVncmF0aW9uXCIsXG4gIFwiYXV0aG9yXCI6IFwiQnJvd3NlclN0YWNrIDxzdXBwb3J0QGJyb3dzZXJzdGFjay5jb20+XCIsXG4gIFwiaG9tZXBhZ2VcIjogXCJodHRwczovL2dpdGh1Yi5jb20vYnJvd3NlcnN0YWNrL3dkaW8tYnJvd3NlcnN0YWNrLXNlcnZpY2VcIixcbiAgXCJsaWNlbnNlXCI6IFwiTUlUXCIsXG4gIFwiZW5naW5lc1wiOiB7XG4gICAgXCJub2RlXCI6IFwiPj0xOC4yMC4wXCJcbiAgfSxcbiAgXCJyZXBvc2l0b3J5XCI6IHtcbiAgICBcInR5cGVcIjogXCJnaXRcIixcbiAgICBcInVybFwiOiBcImdpdCtodHRwczovL2dpdGh1Yi5jb20vYnJvd3NlcnN0YWNrL3dkaW8tYnJvd3NlcnN0YWNrLXNlcnZpY2UuZ2l0XCIsXG4gICAgXCJkaXJlY3RvcnlcIjogXCJwYWNrYWdlcy9icm93c2Vyc3RhY2stc2VydmljZVwiXG4gIH0sXG4gIFwia2V5d29yZHNcIjogW1xuICAgIFwid2ViZHJpdmVyaW9cIixcbiAgICBcIndkaW9cIixcbiAgICBcImJyb3dzZXJzdGFja1wiLFxuICAgIFwid2Rpby1zZXJ2aWNlXCJcbiAgXSxcbiAgXCJidWdzXCI6IHtcbiAgICBcInVybFwiOiBcImh0dHBzOi8vZ2l0aHViLmNvbS9icm93c2Vyc3RhY2svd2Rpby1icm93c2Vyc3RhY2stc2VydmljZS9pc3N1ZXNcIlxuICB9LFxuICBcInR5cGVcIjogXCJtb2R1bGVcIixcbiAgXCJ0eXBlc1wiOiBcIi4vYnVpbGQvaW5kZXguZC50c1wiLFxuICBcImV4cG9ydHNcIjoge1xuICAgIFwiLlwiOiB7XG4gICAgICBcInR5cGVzXCI6IFwiLi9idWlsZC9pbmRleC5kLnRzXCIsXG4gICAgICBcImltcG9ydFwiOiBcIi4vYnVpbGQvaW5kZXguanNcIlxuICAgIH0sXG4gICAgXCIuL2NsZWFudXBcIjoge1xuICAgICAgXCJ0eXBlc1wiOiBcIi4vYnVpbGQvY2xlYW51cC5kLnRzXCIsXG4gICAgICBcImltcG9ydFwiOiBcIi4vYnVpbGQvY2xlYW51cC5qc1wiLFxuICAgICAgXCJzb3VyY2VcIjogXCIuL3NyYy9jbGVhbnVwLnRzXCJcbiAgICB9XG4gIH0sXG4gIFwidHlwZVNjcmlwdFZlcnNpb25cIjogXCIzLjguM1wiLFxuICBcImZpbGVzXCI6IFtcbiAgICBcImJ1aWxkXCIsXG4gICAgXCJzcmMvcHJvdG8vKiovKi5wcm90b1wiLFxuICAgIFwiYnJvd3NlcnN0YWNrLXNlcnZpY2UuZC50c1wiLFxuICAgIFwiUkVBRE1FLm1kXCIsXG4gICAgXCJMSUNFTlNFXCJcbiAgXSxcbiAgXCJzY3JpcHRzXCI6IHtcbiAgICBcImNsZWFuXCI6IFwicmltcmFmIC4vYnVpbGQgc3JjL2dycGMvZ2VuZXJhdGVkXCIsXG4gICAgXCJnZW5lcmF0ZVwiOiBcImJ1ZiBnZW5lcmF0ZVwiLFxuICAgIFwiYnVpbGRcIjogXCJyaW1yYWYgLi9idWlsZCBzcmMvZ3JwYy9nZW5lcmF0ZWQgJiYgYnVmIGdlbmVyYXRlICYmIG5vZGUgLi9zY3JpcHRzL2J1aWxkLm1qcyAmJiB0c2MgLXAgdHNjb25maWcucHJvZC5qc29uXCIsXG4gICAgXCJidWlsZDp3YXRjaFwiOiBcIm5vZGUgLi9zY3JpcHRzL2J1aWxkLm1qcyAtLXdhdGNoXCIsXG4gICAgXCJ0ZXN0XCI6IFwidml0ZXN0IC0tcnVuXCIsXG4gICAgXCJ0ZXN0OndhdGNoXCI6IFwidml0ZXN0XCIsXG4gICAgXCJwcmVwYWNrXCI6IFwibnBtIHJ1biBidWlsZFwiXG4gIH0sXG4gIFwiZGVwZW5kZW5jaWVzXCI6IHtcbiAgICBcIkBicm93c2Vyc3RhY2svYWktc2RrLW5vZGVcIjogXCIxLjUuMTdcIixcbiAgICBcIkBidWZidWlsZC9wcm90b2J1ZlwiOiBcIl4yLjUuMlwiLFxuICAgIFwiQGdycGMvZ3JwYy1qc1wiOiBcIn4xLjEzLjVcIixcbiAgICBcIkBwZXJjeS9hcHBpdW0tYXBwXCI6IFwiXjIuMC45XCIsXG4gICAgXCJAcGVyY3kvc2VsZW5pdW0td2ViZHJpdmVyXCI6IFwiXjIuMi4yXCIsXG4gICAgXCJAcGVyY3kvd2ViZHJpdmVyaW9cIjogXCJeMy4zLjRcIixcbiAgICBcIkB0eXBlcy9naXRjb25maWdsb2NhbFwiOiBcIl4yLjAuMVwiLFxuICAgIFwiQHdkaW8vbG9nZ2VyXCI6IFwiXjkuMC4wXCIsXG4gICAgXCJAd2Rpby9yZXBvcnRlclwiOiBcIl45LjAuMFwiLFxuICAgIFwiQHdkaW8vdHlwZXNcIjogXCJeOS4wLjBcIixcbiAgICBcImJyb3dzZXJzdGFjay1sb2NhbFwiOiBcIl4xLjUuMVwiLFxuICAgIFwiY2hhbGtcIjogXCJeNS42LjJcIixcbiAgICBcImNzdi13cml0ZXJcIjogXCJeMS42LjBcIixcbiAgICBcImdpdC1yZXBvLWluZm9cIjogXCJeMi4xLjFcIixcbiAgICBcImdpdGNvbmZpZ2xvY2FsXCI6IFwiXjIuMS4wXCIsXG4gICAgXCJnbG9iXCI6IFwiXjExLjAuMFwiLFxuICAgIFwidGFyXCI6IFwiXjcuNS4xMVwiLFxuICAgIFwidW5kaWNpXCI6IFwiXjYuMjQuMFwiLFxuICAgIFwidXVpZFwiOiBcIl4xMS4xLjBcIixcbiAgICBcIndlYmRyaXZlcmlvXCI6IFwiXjkuMC4wXCIsXG4gICAgXCJ3aW5zdG9uLXRyYW5zcG9ydFwiOiBcIl40LjUuMFwiLFxuICAgIFwieWF1emxcIjogXCJeMy40LjBcIlxuICB9LFxuICBcInBlZXJEZXBlbmRlbmNpZXNcIjoge1xuICAgIFwiQHdkaW8vY2xpXCI6IFwiXjUuMC4wIHx8IF42LjAuMCB8fCBeNy4wLjAgfHwgXjguMC4wIHx8IF45LjAuMFwiXG4gIH0sXG4gIFwiZGV2RGVwZW5kZW5jaWVzXCI6IHtcbiAgICBcIkBidWZidWlsZC9idWZcIjogXCJeMS41NS4xXCIsXG4gICAgXCJAY2hhbmdlc2V0cy9jbGlcIjogXCJeMi4yNy45XCIsXG4gICAgXCJAdHlwZXMvbm9kZVwiOiBcIl4yMC4xLjBcIixcbiAgICBcIkB0eXBlcy90YXJcIjogXCJeNy4wLjg3XCIsXG4gICAgXCJAdHlwZXMveWF1emxcIjogXCJeMi4xMC4zXCIsXG4gICAgXCJAd2Rpby9nbG9iYWxzXCI6IFwiXjkuMC4wXCIsXG4gICAgXCJAd2Rpby9sb2dnZXJcIjogXCJeOS4wLjBcIixcbiAgICBcIkB3ZGlvL3JlcG9ydGVyXCI6IFwiXjkuMC4wXCIsXG4gICAgXCJAd2Rpby90eXBlc1wiOiBcIl45LjAuMFwiLFxuICAgIFwiZXNidWlsZFwiOiBcIl4wLjI3LjJcIixcbiAgICBcInJpbXJhZlwiOiBcIl42LjAuMVwiLFxuICAgIFwidHMtcHJvdG9cIjogXCJeMi43LjVcIixcbiAgICBcInR5cGVzY3JpcHRcIjogXCJeNS44LjNcIixcbiAgICBcInZpdGVzdFwiOiBcIl4zLjIuNFwiLFxuICAgIFwid2ViZHJpdmVyaW9cIjogXCJeOS4wLjBcIlxuICB9LFxuICBcInB1Ymxpc2hDb25maWdcIjoge1xuICAgIFwiYWNjZXNzXCI6IFwicHVibGljXCJcbiAgfVxufVxuIiwgImltcG9ydCB0eXBlIHsgQnJvd3NlcnN0YWNrQ29uZmlnIH0gZnJvbSAnLi90eXBlcy5qcydcbmltcG9ydCBwa2cgZnJvbSAnLi4vcGFja2FnZS5qc29uJyB3aXRoIHsgdHlwZTogJ2pzb24nIH1cblxuY29uc3QgYnN0YWNrU2VydmljZVZlcnNpb24gPSBwa2cudmVyc2lvblxuXG5leHBvcnQgY29uc3QgQlJPV1NFUl9ERVNDUklQVElPTiA9IFtcbiAgICAnZGV2aWNlJyxcbiAgICAnb3MnLFxuICAgICdvc1ZlcnNpb24nLFxuICAgICdvc192ZXJzaW9uJyxcbiAgICAnYnJvd3Nlck5hbWUnLFxuICAgICdicm93c2VyJyxcbiAgICAnYnJvd3NlclZlcnNpb24nLFxuICAgICdicm93c2VyX3ZlcnNpb24nXG5dIGFzIGNvbnN0XG5cbmV4cG9ydCBjb25zdCBWQUxJRF9BUFBfRVhURU5TSU9OID0gW1xuICAgICcuYXBrJyxcbiAgICAnLmFhYicsXG4gICAgJy5pcGEnXG5dXG5cbmV4cG9ydCBjb25zdCBERUZBVUxUX09QVElPTlM6IFBhcnRpYWw8QnJvd3NlcnN0YWNrQ29uZmlnPiA9IHtcbiAgICBzZXRTZXNzaW9uTmFtZTogdHJ1ZSxcbiAgICBzZXRTZXNzaW9uU3RhdHVzOiB0cnVlLFxuICAgIHRlc3RPYnNlcnZhYmlsaXR5OiB0cnVlXG59XG5cbmV4cG9ydCBjb25zdCBjb25zb2xlSG9sZGVyOiB0eXBlb2YgY29uc29sZSA9IE9iamVjdC5hc3NpZ24oe30sIGNvbnNvbGUpXG5cbmV4cG9ydCBjb25zdCBEQVRBX0VORFBPSU5UID0gJ2h0dHBzOi8vY29sbGVjdG9yLW9ic2VydmFiaWxpdHkuYnJvd3NlcnN0YWNrLmNvbSdcbmV4cG9ydCBjb25zdCBBUFBfQUxMWV9FTkRQT0lOVCA9ICdodHRwczovL2FwcC1hY2Nlc3NpYmlsaXR5LmJyb3dzZXJzdGFjay5jb20vYXV0b21hdGUnXG5leHBvcnQgY29uc3QgQVBQX0FMTFlfSVNTVUVTX0VORFBPSU5UID0gJ2FwaS92MS9pc3N1ZXMnXG5leHBvcnQgY29uc3QgQVBQX0FMTFlfSVNTVUVTX1NVTU1BUllfRU5EUE9JTlQgPSAnYXBpL3YxL2lzc3Vlcy1zdW1tYXJ5J1xuZXhwb3J0IGNvbnN0IERBVEFfRVZFTlRfRU5EUE9JTlQgPSAnYXBpL3YxL2V2ZW50J1xuZXhwb3J0IGNvbnN0IERBVEFfQkFUQ0hfRU5EUE9JTlQgPSAnYXBpL3YxL2JhdGNoJ1xuZXhwb3J0IGNvbnN0IERBVEFfU0NSRUVOU0hPVF9FTkRQT0lOVCA9ICdhcGkvdjEvc2NyZWVuc2hvdHMnXG5leHBvcnQgY29uc3QgREFUQV9CQVRDSF9TSVpFID0gMTAwMFxuZXhwb3J0IGNvbnN0IERBVEFfQkFUQ0hfSU5URVJWQUwgPSAyMDAwXG5leHBvcnQgY29uc3QgQkFUQ0hfRVZFTlRfVFlQRVMgPSBbJ0xvZ0NyZWF0ZWQnLCAnVGVzdFJ1blN0YXJ0ZWQnLCAnVGVzdFJ1bkZpbmlzaGVkJywgJ0hvb2tSdW5GaW5pc2hlZCcsICdIb29rUnVuU3RhcnRlZCcsICdTY3JlZW5zaG90Q3JlYXRlZCddXG5leHBvcnQgY29uc3QgREVGQVVMVF9XQUlUX1RJTUVPVVRfRk9SX1BFTkRJTkdfVVBMT0FEUyA9IDUwMDAgLy8gNXNcbmV4cG9ydCBjb25zdCBERUZBVUxUX1dBSVRfSU5URVJWQUxfRk9SX1BFTkRJTkdfVVBMT0FEUyA9IDEwMCAvLyAxMDBtc1xuZXhwb3J0IGNvbnN0IEJTVEFDS19TRVJWSUNFX1ZFUlNJT04gPSBic3RhY2tTZXJ2aWNlVmVyc2lvblxuXG5leHBvcnQgY29uc3QgTk9UX0FMTE9XRURfS0VZU19JTl9DQVBTID0gWydpbmNsdWRlVGFnc0luVGVzdGluZ1Njb3BlJywgJ2V4Y2x1ZGVUYWdzSW5UZXN0aW5nU2NvcGUnLCAndGVzdE1hbmFnZW1lbnRPcHRpb25zJywgJ3NraXBBcHBPdmVycmlkZScsICdwcmVmZXJTY2VuYXJpb05hbWUnXVxuZXhwb3J0IGNvbnN0IEJST1dTRVJTVEFDS19URVNUX1BMQU5fSUQgPSAnQlJPV1NFUlNUQUNLX1RFU1RfUExBTl9JRCdcblxuZXhwb3J0IGNvbnN0IExPR1NfRklMRSA9ICdsb2dzL2JzdGFjay13ZGlvLXNlcnZpY2UubG9nJ1xuZXhwb3J0IGNvbnN0IENMSV9ERUJVR19MT0dTX0ZJTEUgPSAnbG9nL3Nkay1jbGktZGVidWcubG9nJ1xuZXhwb3J0IGNvbnN0IFVQTE9BRF9MT0dTX0FERFJFU1MgPSAnaHR0cHM6Ly91cGxvYWQtb2JzZXJ2YWJpbGl0eS5icm93c2Vyc3RhY2suY29tJ1xuZXhwb3J0IGNvbnN0IFVQTE9BRF9MT0dTX0VORFBPSU5UID0gJ2NsaWVudC1sb2dzL3VwbG9hZCdcblxuZXhwb3J0IGNvbnN0IFBFUkNZX0xPR1NfRklMRSA9ICdsb2dzL3BlcmN5LmxvZydcblxuLyoqXG4gKiBBdXRvLWNhcHR1cmUgb2YgdGhlIHVzZXIncyB3ZGlvIGNvbmZpZyBmaWxlIChTREstNzI1MCkuXG4gKi9cblxuLypcbiAqIFNob3duIG9uY2UgcGVyIHJ1biB3aGVuIGF1dG8tY2FwdHVyZSBpcyBhY3RpdmUuIFRoZSBOb2RlIFNESyBkb2VzIHRoZSBzYW1lXG4gKiAoQnJvd3NlclN0YWNrU2V0dXAuanMgLT4gQVVUT0xPR0NBUFRVUkVfTk9USUZJQ0FUSU9OKTsgd2l0aG91dCBpdCBhIHdkaW8gY3VzdG9tZXIgZ2V0cyBub1xuICogcnVudGltZSBkaXNjbG9zdXJlIHRoYXQgdGhlaXIgY29uZmlnIGZpbGUgaXMgY29sbGVjdGVkLCBvbmx5IGEgY2hhbmdlc2V0IGVudHJ5IGFuZCBhIEpTRG9jXG4gKiBjb21tZW50LiBTaW5jZSB0aGUgcmVkYWN0aW9uIGlzIGtleS1uYW1lIGRyaXZlbiBhbmQgYmVzdC1lZmZvcnQsIHRoZSBub3RpY2UgaXMgcGFydCBvZiB0aGVcbiAqIGNvbnRyb2wgcmF0aGVyIHRoYW4gZGVjb3JhdGlvbi5cbiAqL1xuZXhwb3J0IGNvbnN0IEFVVE9MT0dDQVBUVVJFX05PVElGSUNBVElPTiA9ICdZb3VyIHdkaW8gY29uZmlnIGZpbGUsIHRoZSBsb2NhbCBjb25maWcgZmlsZXMgaXQgaW1wb3J0cyBhbmQgcGFja2FnZS5qc29uIGFyZSBjYXB0dXJlZCB3aXRoIHRoZSBkZWJ1ZyBsb2dzIGF0IHRoZSBlbmQgb2YgdGhlIHJ1biwgd2l0aCB2YWx1ZXMgdW5kZXIga25vd24gY3JlZGVudGlhbCBrZXlzIHJlbW92ZWQuIFRvIGRpc2FibGUsIHNldCBkaXNhYmxlQXV0b0NhcHR1cmVMb2dzOiB0cnVlIGluIHRoZSBicm93c2Vyc3RhY2sgc2VydmljZSBvcHRpb25zLidcblxuLyogQWJzb2x1dGUgcGF0aCBvZiB0aGUgcmVzb2x2ZWQgd2RpbyBjb25maWcsIHB1Ymxpc2hlZCBvbmNlIHNvIHRoZSB1cGxvYWQgcGF0aCBuZXZlciByZS1kZXJpdmVzIGl0ICovXG5leHBvcnQgY29uc3QgQlJPV1NFUlNUQUNLX1dESU9fQ09ORklHX0ZJTEVfUEFUSCA9ICdCUk9XU0VSU1RBQ0tfV0RJT19DT05GSUdfRklMRV9QQVRIJ1xuZXhwb3J0IGNvbnN0IEJST1dTRVJTVEFDS19ESVNBQkxFX0FVVE9fQ0FQVFVSRV9MT0dTID0gJ0JST1dTRVJTVEFDS19ESVNBQkxFX0FVVE9fQ0FQVFVSRV9MT0dTJ1xuLyogV2hpY2ggbGFkZGVyIHJ1bmcgcmVzb2x2ZWQgdGhlIGNvbmZpZywga2VwdCBzbyB0aGUgdXBsb2FkIHBhdGggcmVwb3J0cyB0aGUgVFJVRSBydW5nXG4gICBpbnN0ZWFkIG9mIHJlLXJlYWRpbmcgaXRzIG93biBlbnYgdmFyIGFuZCBhbHdheXMgc2F5aW5nICdlbnZfb3ZlcnJpZGUnICovXG5leHBvcnQgY29uc3QgQlJPV1NFUlNUQUNLX1dESU9fQ09ORklHX1NUUkFURUdZID0gJ0JST1dTRVJTVEFDS19XRElPX0NPTkZJR19TVFJBVEVHWSdcblxuLyogTWlycm9ycyBjcmVhdGUtd2RpbydzIFNVUFBPUlRFRF9DT05GSUdfRklMRV9FWFRFTlNJT04gKGlkZW50aWNhbCBpbiB3ZGlvIHY4IGFuZCB2OSkgKi9cbmV4cG9ydCBjb25zdCBTVVBQT1JURURfV0RJT19DT05GSUdfRVhURU5TSU9OUyA9IFsnLmpzJywgJy50cycsICcubWpzJywgJy5tdHMnLCAnLmNqcycsICcuY3RzJ11cbmV4cG9ydCBjb25zdCBERUZBVUxUX1dESU9fQ09ORklHX0JBU0VOQU1FID0gJ3dkaW8uY29uZidcbi8qIGB3ZGlvIDxjbWQ+YCB2ZXJicyB0aGF0IG11c3QgbmV2ZXIgYmUgbWlzdGFrZW4gZm9yIHRoZSBjb25maWcgcG9zaXRpb25hbCAqL1xuZXhwb3J0IGNvbnN0IFdESU9fQ0xJX1NVQkNPTU1BTkRTID0gWydydW4nLCAnaW5zdGFsbCcsICdyZXBsJywgJ2NvbmZpZyddXG5cbi8qIENvbmZpZ3MgYXJlIGtpbG9ieXRlczsgdGhlIGNhcCBvbmx5IGV4aXN0cyBzbyBhIG1pc2xhYmVsbGVkIHBhdGggY2Fubm90IGJsb2F0IHRoZSBhcmNoaXZlICovXG5leHBvcnQgY29uc3QgTUFYX0NBUFRVUkVEX0NPTkZJR19GSUxFX0JZVEVTID0gMTAyNCAqIDEwMjRcbmV4cG9ydCBjb25zdCBNQVhfQ0FQVFVSRURfQ09ORklHX0ZJTEVTID0gNlxuLyogSG93IGZhciB0byBmb2xsb3cgcmVsYXRpdmUgaW1wb3J0cyBvdXQgb2YgdGhlIGVudHJ5IGNvbmZpZyAoMSA9IGRpcmVjdCBpbXBvcnRzIG9ubHkpICovXG5leHBvcnQgY29uc3QgQ0FQVFVSRV9DT05GSUdfSU1QT1JUX0RFUFRIID0gMVxuLyogSG93IGZhciB0byB3YWxrIHVwIGZyb20gdGhlIGNvbmZpZyBkaXIgbG9va2luZyBmb3IgdGhlIHByb2plY3QncyBwYWNrYWdlLmpzb24gKi9cbmV4cG9ydCBjb25zdCBNQVhfUEFDS0FHRV9KU09OX1dBTEtfVVAgPSA1XG5cbi8qKlxuICogS2V5cyB3aG9zZSBsaW5lIGlzIHNjcnViYmVkIGJlZm9yZSBhIGNvbmZpZyBmaWxlIGVudGVycyB0aGUgYXJjaGl2ZS5cbiAqIGB1c2VyYCAvIGBrZXlgIGFyZSBXRElPJ3Mgb3duIHRvcC1sZXZlbCBjcmVkZW50aWFsIG9wdGlvbnMsIGhlbmNlIHRoZSBiYXJlIGVudHJpZXMuXG4gKi9cbi8qKlxuICogV29yZCBmYW1pbGllcyB0aGF0IG1ha2UgYW4gaWRlbnRpZmllciBzZW5zaXRpdmUgd2hlbiB0aGV5IGFwcGVhciBhcyBpdHMgU1VGRklYIFx1MjAxNFxuICogYGNsaWVudFNlY3JldGAsIGByZWZyZXNoVG9rZW5gLCBgcHJpdmF0ZUtleWAsIGBjbGllbnRfc2VjcmV0YC4gU3BsaXQgYnkgY2FzZSBzbyB0aGVcbiAqIGNhbWVsQ2FzZSBmb3JtIHJlcXVpcmVzIGEgY2FwaXRhbCAoZGlzdGluZ3Vpc2hpbmcgYHByaXZhdGVLZXlgIGZyb20gYGhvdGtleWApIGFuZCB0aGVcbiAqIHNuYWtlX2Nhc2UgZm9ybSByZXF1aXJlcyBhbiBleHBsaWNpdCBgX2AgKGRpc3Rpbmd1aXNoaW5nIGBjbGllbnRfc2VjcmV0YCBmcm9tIGBrZXl3b3JkYCkuXG4gKi9cbmV4cG9ydCBjb25zdCBDT01QT1VORF9TRUNSRVRfU1VGRklYRVNfQ0FNRUwgPSAnS2V5fFRva2VufFNlY3JldHxQYXNzd29yZHxQYXNzd2R8Q3JlZGVudGlhbCdcbmV4cG9ydCBjb25zdCBDT01QT1VORF9TRUNSRVRfU1VGRklYRVNfU05BS0UgPSAna2V5fHRva2VufHNlY3JldHxwYXNzd29yZHxwYXNzd2R8Y3JlZGVudGlhbCdcblxuLyoqXG4gKiBTZWNyZXRzIHRoYXQgc3BhbiBsaW5lcyBvciBoaWRlIGluc2lkZSBhIHZhbHVlLCB3aGljaCBhIGxpbmUva2V5LWFuY2hvcmVkIHNjcnViIGNhbm5vdFxuICogcmVhY2guIEFwcGxpZWQgYXMgd2hvbGUtYmxvY2sgcGFzc2VzIGJlZm9yZSB0aGUgbGluZSBwYXNzZXMuXG4gKi9cbi8qIGFuIGlubGluZSBQRU06IHRoZSBrZXkgYnl0ZXMgc2l0IG9uIGxpbmVzIHRoYXQgY2Fycnkgbm8ga2V5IG5hbWUgYXQgYWxsICovXG4vKlxuICogVGhlIGJvZHkgaXMgVEVNUEVSRUQgc28gaXQgY2Fubm90IGNyb3NzIGEgc2Vjb25kIGAtLS0tLUJFR0lOYDogd2l0aCBhIHBsYWluIGBbXFxzXFxTXSo/YCxcbiAqIGFuIFVOVEVSTUlOQVRFRCBibG9jayBlYXJsaWVyIGluIHRoZSBmaWxlIG1hdGNoZXMgdGhyb3VnaCB0byBhIGxhdGVyLCB1bnJlbGF0ZWQgYmxvY2snc1xuICogRU5EIG1hcmtlciBhbmQgZXZlcnl0aGluZyBpbiBiZXR3ZWVuIGlzIHJlcGxhY2VkIFx1MjAxNCBzaWxlbnRseSBkZXN0cm95aW5nIHVucmVsYXRlZCBjb25maWcuXG4gKiBCb3VuZGVkIGFzIHdlbGwsIHNvIHRoZSBzY2FuIHN0YXlzIGxpbmVhci5cbiAqL1xuZXhwb3J0IGNvbnN0IFBFTV9CTE9DS19SRUdFWCA9IC8oLS0tLS1CRUdJTiBbXi1cXHJcXG5dKy0tLS0tKSg/Oig/IS0tLS0tQkVHSU4pW1xcc1xcU10pezAsNjU1MzZ9PygtLS0tLUVORCBbXi1cXHJcXG5dKy0tLS0tKS9nXG4vKlxuICogQSBQRU0gb3BlbmVkIGJ1dCBuZXZlciBjbG9zZWQuIFRoZSBibG9jayByZWdleCBhYm92ZSBuZWVkcyB0aGUgRU5EIG1hcmtlciwgc28gd2l0aG91dCBpdFxuICogdGhlIGtleSBieXRlcyBzdXJ2aXZlIGV2ZXJ5IHBhc3MuIE1hdGNoZWQgYXMgQkVHSU4gKyB0aGUgcnVuIG9mIGJhc2U2NC1vbmx5IGxpbmVzIHRoYXRcbiAqIGZvbGxvd3MuIEEgcnVuIG11c3QgYmUgYXQgbGVhc3QgMjAgY2hhcmFjdGVycyBhbmQgZW5kIGF0IGEgbm9uLWJhc2U2NCBjaGFyYWN0ZXI6IGxldHRlcnNcbiAqIGFyZSB2YWxpZCBiYXNlNjQsIHNvIGEgc2hvcnRlci91bmJvdW5kZWQgcnVsZSBtYXRjaGVzIHBhcnQgb2YgYW4gb3JkaW5hcnkgbGluZSBzdWNoIGFzXG4gKiBgbmV4dE9wdGlvbjogMWAgYW5kIGVhdHMgaXQuIFN0b3BzIGF0IHRoZSBmaXJzdCBsaW5lIHRoYXQgZG9lcyBub3QgcXVhbGlmeSwgc28gYSBtYWxmb3JtZWRcbiAqIGJsb2NrIGNhbm5vdCBzd2FsbG93IHRoZSByZXN0IG9mIHRoZSBmaWxlLiBUaGUgdXBwZXIgYm91bmQgaXMgZ2VuZXJvdXMgKDggS0IpIGJlY2F1c2UgYVxuICoga2V5IHdyaXR0ZW4gdW53cmFwcGVkIG9uIE9ORSBsaW5lIHdvdWxkIG90aGVyd2lzZSBleGNlZWQgaXQgYW5kIGZhaWwgT1BFTiwgbGVhdmluZyB0aGUgYm9keVxuICogaW4gdGhlIGJ1bmRsZS5cbiAqL1xuZXhwb3J0IGNvbnN0IFBFTV9VTlRFUk1JTkFURURfUkVHRVggPSAvKC0tLS0tQkVHSU4gW14tXFxyXFxuXSstLS0tLSkoPzpcXHI/XFxuW0EtWmEtejAtOSsvPV17MjAsODE5Mn0oPz1bXkEtWmEtejAtOSsvPV18JCkpKy9nXG4vKlxuICogVXNlcmluZm8gaW4gQU5ZIHVybCB2YWx1ZSwgbm90IGp1c3QgdGhlIGBwcm94eVVybGAga2V5LiBUaGUgcGFzc3dvcmQgaGFsZiBpcyBvcHRpb25hbCBzb1xuICogc2luZ2xlLXRva2VuIGZvcm1zIChgaHR0cHM6Ly9naHBfeHh4QGdpdGh1Yi5jb21gLCBjb21tb24gaW4gQ0kgZ2l0L25wbSByZW1vdGVzKSBhcmUgY2F1Z2h0XG4gKiB0b28uIFF1YW50aWZpZXJzIGFyZSBCT1VOREVEOiB0aGUgdW5ib3VuZGVkIGZvcm0gd2FzIG1lYXN1cmFibHkgcXVhZHJhdGljICgxMDAgS0Igb2ZcbiAqIHdvcmQgY2hhcmFjdGVycyB0b29rIDYuMSBzLCA0eCBwZXIgZG91YmxpbmcpIGJlY2F1c2UgYm90aCBoYWx2ZXMgc2NhbiBmb3J3YXJkIGZvciBhbiBgQGBcbiAqIHRoYXQgbmV2ZXIgYXJyaXZlcy4gUmVhbCB1c2VyaW5mbyBpcyBzaG9ydCwgc28gdGhlIGJvdW5kcyBjaGFuZ2Ugbm8gcmVhbC13b3JsZCBtYXRjaC5cbiAqL1xuZXhwb3J0IGNvbnN0IFVSTF9VU0VSSU5GT19SRUdFWCA9IC8oW2EtekEtWl1bYS16QS1aMC05Ky4tXXswLDY0fTpcXC9cXC8pW15cXHMvQDpdezEsMjU2fSg/OjpbXlxccy9AXXswLDI1Nn0pP0AvZ1xuXG5leHBvcnQgY29uc3QgUkVEQUNURURfS0VZUyA9IFtcbiAgICAndXNlcicsICdrZXknLFxuICAgICd1c2VyTmFtZScsICdhY2Nlc3NLZXknLFxuICAgICdicm93c2Vyc3RhY2sudXNlcicsICdicm93c2Vyc3RhY2sua2V5JyxcbiAgICAnYnJvd3NlcnN0YWNrLnVzZXJOYW1lJywgJ2Jyb3dzZXJzdGFjay5hY2Nlc3NLZXknLFxuICAgICdwYXNzd29yZCcsICdwcm94eVBhc3N3b3JkJywgJ3Byb3h5VXNlcicsICdwcm94eVBhc3MnLFxuICAgICdsb2NhbFByb3h5VXNlcicsICdsb2NhbFByb3h5UGFzcycsICdwcm94eVVybCcsXG4gICAgJ2F1dGhUb2tlbicsICdhcGlLZXknLCAnYWNjZXNzVG9rZW4nLCAnc2VjcmV0JywgJ3Rva2VuJyxcbiAgICAnY3VzdG9tVmFyaWFibGVzJywgJ3VzZXJfZGF0YScsICdodHRwUHJveHknLCAnaHR0cHNQcm94eSdcbl1cblxuZXhwb3J0IGNvbnN0IFBFUkNZX0RPTV9DSEFOR0lOR19DT01NQU5EU19FTkRQT0lOVFMgPSBbXG4gICAgJy9zZXNzaW9uLzpzZXNzaW9uSWQvdXJsJyxcbiAgICAnL3Nlc3Npb24vOnNlc3Npb25JZC9mb3J3YXJkJyxcbiAgICAnL3Nlc3Npb24vOnNlc3Npb25JZC9iYWNrJyxcbiAgICAnL3Nlc3Npb24vOnNlc3Npb25JZC9yZWZyZXNoJyxcbiAgICAnL3Nlc3Npb24vOnNlc3Npb25JZC9zY3JlZW5zaG90JyxcbiAgICAnL3Nlc3Npb24vOnNlc3Npb25JZC9hY3Rpb25zJyxcbiAgICAnL3Nlc3Npb24vOnNlc3Npb25JZC9hcHBpdW0vZGV2aWNlL3NoYWtlJ1xuXVxuXG5leHBvcnQgY29uc3QgQ0FQVFVSRV9NT0RFUyA9IFsnY2xpY2snLCAnYXV0bycsICdzY3JlZW5zaG90JywgJ21hbnVhbCcsICd0ZXN0Y2FzZSddXG5leHBvcnQgY29uc3QgTE9HX0tJTkRfVVNBR0VfTUFQID0ge1xuICAgICdURVNUX0xPRyc6ICdsb2cnLFxuICAgICdURVNUX1NDUkVFTlNIT1QnOiAnc2NyZWVuc2hvdCcsXG4gICAgJ1RFU1RfU1RFUCc6ICdzdGVwJyxcbiAgICAnSFRUUCc6ICdodHRwJ1xufVxuXG5leHBvcnQgY29uc3QgRlVOTkVMX0lOU1RSVU1FTlRBVElPTl9VUkwgPSAnaHR0cHM6Ly9hcGkuYnJvd3NlcnN0YWNrLmNvbS9zZGsvdjEvZXZlbnQnXG5cbmV4cG9ydCBjb25zdCBFRFNfVVJMID0gJ2h0dHBzOi8vZWRzLmJyb3dzZXJzdGFjay5jb20nXG5cbmV4cG9ydCBjb25zdCBTVVBQT1JURURfQlJPV1NFUlNfRk9SX0FJID0gWydjaHJvbWUnLCAnbWljcm9zb2Z0ZWRnZScsICdmaXJlZm94J11cblxuZXhwb3J0IGNvbnN0IFRDR19VUkwgPSAnaHR0cHM6Ly90Y2cuYnJvd3NlcnN0YWNrLmNvbSdcblxuZXhwb3J0IGNvbnN0IFRDR19JTkZPID0ge1xuICAgIHRjZ1JlZ2lvbjogJ3VzZScsXG4gICAgdGNnVXJsOiBUQ0dfVVJMLFxufVxuXG4vLyBTbWFydCBTZWxlY3Rpb24gTW9kZSBDb25zdGFudHNcbmV4cG9ydCBjb25zdCBTTUFSVF9TRUxFQ1RJT05fTU9ERV9SRUxFVkFOVF9GSVJTVCA9ICdyZWxldmFudEZpcnN0J1xuZXhwb3J0IGNvbnN0IFNNQVJUX1NFTEVDVElPTl9NT0RFX1JFTEVWQU5UX09OTFkgPSAncmVsZXZhbnRPbmx5J1xuXG4vLyBFbnYgdmFyaWFibGVzIC0gRGVmaW5lIGFsbCB0aGUgZW52IHZhcmlhYmxlIGNvbnN0YW50cyBvdmVyIGhlcmVcblxuLy8gVG8gc3RvcmUgdGhlIEpXVCB0b2tlbiByZXR1cm5lZCB0aGUgc2Vzc2lvbiBsYXVuY2hcbmV4cG9ydCBjb25zdCBCUk9XU0VSU1RBQ0tfVEVTVEhVQl9KV1QgPSAnQlJPV1NFUlNUQUNLX1RFU1RIVUJfSldUJ1xuXG4vLyBUbyBzdG9yZSB0Y2cgYXV0aCByZXN1bHQgZm9yIHNlbGZIZWFsaW5nIGZlYXR1cmU6XG5leHBvcnQgY29uc3QgQlNUQUNLX1RDR19BVVRIX1JFU1VMVCA9ICdCU1RBQ0tfVENHX0FVVEhfUkVTVUxUJ1xuXG4vLyBUbyBzdG9yZSB0aGUgc2V0dGluZyBvZiB3aGV0aGVyIHRvIHNlbmQgc2NyZWVuc2hvdHMgb3Igbm90XG5leHBvcnQgY29uc3QgVEVTVE9QU19TQ1JFRU5TSE9UX0VOViA9ICdCU19URVNUT1BTX0FMTE9XX1NDUkVFTlNIT1RTJ1xuXG4vLyBUbyBzdG9yZSBidWlsZCBoYXNoZWQgaWRcbmV4cG9ydCBjb25zdCBCUk9XU0VSU1RBQ0tfVEVTVEhVQl9VVUlEID0gJ0JST1dTRVJTVEFDS19URVNUSFVCX1VVSUQnXG4vLyBJbnRlcnJ1cHQgc2lnbmFsLCBwcm9wYWdhdGVkIHZpYSBlbnYgc28gdGhlIGRldGFjaGVkIGNsZWFudXAgY2hpbGQgYW5kIGdSUENcbi8vIHN0b3AgcGF0aCBjYW4gc3RhbXAgdGhlIGtpbGwgcmVhc29uIG9udG8gdGhlIGJ1aWxkIHN0b3AuXG5leHBvcnQgY29uc3QgQlJPV1NFUlNUQUNLX0tJTExfU0lHTkFMID0gJ0JST1dTRVJTVEFDS19TREtfS0lMTF9TSUdOQUwnXG5cbi8vIFRvIHN0b3JlIHRlc3QgcnVuIHV1aWRcbmV4cG9ydCBjb25zdCBURVNUX0FOQUxZVElDU19JRCA9ICdURVNUX0FOQUxZVElDU19JRCdcblxuLy8gV2hldGhlciB0byBjb2xsZWN0IHBlcmZvcm1hbmNlIGluc3RydW1lbnRhdGlvbiBvciBub3RcbmV4cG9ydCBjb25zdCBQRVJGX01FQVNVUkVNRU5UX0VOViA9ICdCUk9XU0VSU1RBQ0tfTzExWV9QRVJGX01FQVNVUkVNRU5UJ1xuXG4vLyBXaGV0aGVyIHRoZSBjdXJyZW50IHJ1biBpcyByZXJ1biBvciBub3RcbmV4cG9ydCBjb25zdCBSRVJVTl9URVNUU19FTlYgPSAnQlJPV1NFUlNUQUNLX1JFUlVOX1RFU1RTJ1xuXG4vLyBUaGUgdGVzdHMgdGhhdCBuZWVkcyB0byBiZSByZXJ1blxuZXhwb3J0IGNvbnN0IFJFUlVOX0VOViA9ICdCUk9XU0VSU1RBQ0tfUkVSVU4nXG5cbi8vIFRvIHN0b3JlIHdoZXRoZXIgdGhlIGJ1aWxkIGxhdW5jaCBoYXMgY29tcGxldGVkIG9yIG5vdFxuZXhwb3J0IGNvbnN0IFRFU1RPUFNfQlVJTERfQ09NUExFVEVEX0VOViA9ICdCU19URVNUT1BTX0JVSUxEX0NPTVBMRVRFRCdcblxuLy8gV2hldGhlciBwZXJjeSBoYXMgc3RhcnRlZCBzdWNjZXNzZnVsbHkgb3Igbm90XG5leHBvcnQgY29uc3QgQlJPV1NFUlNUQUNLX1BFUkNZID0gJ0JST1dTRVJTVEFDS19QRVJDWSdcblxuLy8gV2hldGhlciBzZXNzaW9uIGlzIGEgYWNjZXNzaWJpbGl0eSBzZXNzaW9uXG5leHBvcnQgY29uc3QgQlJPV1NFUlNUQUNLX0FDQ0VTU0lCSUxJVFkgPSAnQlJPV1NFUlNUQUNLX0FDQ0VTU0lCSUxJVFknXG5cbi8vIFdoZXRoZXIgc2Vzc2lvbiBpcyBhIHRlc3QgcmVwb3J0aW5nIHNlc3Npb25cbmV4cG9ydCBjb25zdCBCUk9XU0VSU1RBQ0tfT0JTRVJWQUJJTElUWSA9ICdCUk9XU0VSU1RBQ0tfT0JTRVJWQUJJTElUWSdcblxuLy8gTG9hZCBUZXN0aW5nIFNlcnZpY2UgKExUUykgZW52IHZhcnM6IHRoZSBwb2QtaXRlcmF0aW9uIHNlc3Npb24gaWQgKGl0c1xuLy8gcHJlc2VuY2UgaXMgdGhlIHNpbmdsZSBzb3VyY2Ugb2YgdHJ1dGggZm9yIFwidGhpcyBydW4gaXMgYW4gTFRTIHBvZFxuLy8gaXRlcmF0aW9uXCIpIGFuZCBhbiBvcHRpb25hbCBvcHQtaW4gZmxhZyBmb3IgbG9jYWwgcmVwcm8gLyBDSSBydW5zIHRoYXRcbi8vIGRvbid0IGhhdmUgYSByZWFsIHNlc3Npb24gaWQuXG5leHBvcnQgY29uc3QgQlJPV1NFUlNUQUNLX0xUU19TRVNTSU9OX0lEID0gJ0JST1dTRVJTVEFDS19MVFNfU0VTU0lPTl9JRCdcbmV4cG9ydCBjb25zdCBCUk9XU0VSU1RBQ0tfTFRTID0gJ0JST1dTRVJTVEFDS19MVFMnXG5cbi8vIE5ldyBUZXN0IFJlcG9ydGluZyBhbmQgQW5hbHl0aWNzIGVudmlyb25tZW50IHZhcmlhYmxlc1xuZXhwb3J0IGNvbnN0IEJST1dTRVJTVEFDS19URVNUX1JFUE9SVElORyA9ICdCUk9XU0VSU1RBQ0tfVEVTVF9SRVBPUlRJTkcnXG5leHBvcnQgY29uc3QgQlJPV1NFUlNUQUNLX1RFU1RfUkVQT1JUSU5HX0RFQlVHID0gJ0JST1dTRVJTVEFDS19URVNUX1JFUE9SVElOR19ERUJVRydcbmV4cG9ydCBjb25zdCBURVNUX1JFUE9SVElOR19CVUlMRF9UQUcgPSAnVEVTVF9SRVBPUlRJTkdfQlVJTERfVEFHJ1xuZXhwb3J0IGNvbnN0IFRFU1RfUkVQT1JUSU5HX1BST0pFQ1RfTkFNRSA9ICdURVNUX1JFUE9SVElOR19QUk9KRUNUX05BTUUnXG5leHBvcnQgY29uc3QgVEVTVF9SRVBPUlRJTkdfQlVJTERfTkFNRSA9ICdURVNUX1JFUE9SVElOR19CVUlMRF9OQU1FJ1xuXG4vLyBNYXhpbXVtIHNpemUgb2YgVkNTIGluZm8gd2hpY2ggaXMgYWxsb3dlZFxuZXhwb3J0IGNvbnN0IE1BWF9HSVRfTUVUQV9EQVRBX1NJWkVfSU5fQllURVMgPSA2NCAqIDEwMjRcblxuLyogVGhlIHZhbHVlIHRvIGJlIGFwcGVuZGVkIGF0IHRoZSBlbmQgaWYgZ2l0IG1ldGFkYXRhIGlzIGxhcmdlciB0aGFuIE1BWF9HSVRfTUVUQV9EQVRBX1NJWkVfSU5fQllURVNcbiovXG5leHBvcnQgY29uc3QgR0lUX01FVEFfREFUQV9UUlVOQ0FURUQgPSAnLi4uW1RSVU5DQVRFRF0nXG5cbi8vIENMSSByZWxhdGVkIGNvbnN0YW50c1xuZXhwb3J0IGNvbnN0IENMSV9TVE9QX1RJTUVPVVQgPSA1MDAwIC8vIDUgc2Vjb25kc1xuZXhwb3J0IGNvbnN0IEJJTkFSWV9CVVNZX0VSUk9SX0NPREVTID0gWydFVFhUQlNZJywgJ0VCVVNZJ11cbmV4cG9ydCBjb25zdCBNQVhfU1BBV05fUkVUUklFUyA9IDNcbmV4cG9ydCBjb25zdCBTUEFXTl9SRVRSWV9ERUxBWV9NUyA9IDEwMDBcbmV4cG9ydCBjb25zdCBXRElPX05BTUlOR19QUkVGSVggPSAnV2ViZHJpdmVySU8tJ1xuZXhwb3J0IGNvbnN0IFBFUkZfTUVUUklDU19XQUlUX1RJTUUgPSAyMDAwXG5cbi8vIEJ1aWxkLXN0b3AgZGVsaXZlcnkgYnVkZ2V0LiBUaGUgc3RvcCBQVVQgaXMgdGhlIG9ubHkgc2lnbmFsIHRoYXQgY2xvc2VzIGEgVFJBIGJ1aWxkLFxuLy8gc28gYSB0cmFuc2llbnQgdHJhbnNwb3J0IGZhaWx1cmUgaXMgd29ydGggcmV0cnlpbmcgcGFzdCBhIHNob3J0IG5ldHdvcmsgYmxpcCBcdTIwMTQgYnV0IHRoZVxuLy8gd2hvbGUgdGhpbmcgcnVucyBkdXJpbmcgc2h1dGRvd24sIHNvIHRoZSB0b3RhbCBjb3N0IGlzIGNhcHBlZCBieSBhIHdhbGwtY2xvY2sgZGVhZGxpbmVcbi8vIHJhdGhlciB0aGFuIGJ5IGF0dGVtcHQgY291bnQgYWxvbmUuXG5leHBvcnQgY29uc3QgU1RPUF9CVUlMRF9NQVhfQVRURU1QVFMgPSA0XG5leHBvcnQgY29uc3QgU1RPUF9CVUlMRF9BVFRFTVBUX1RJTUVPVVRfTVMgPSAxMDAwMFxuZXhwb3J0IGNvbnN0IFNUT1BfQlVJTERfVE9UQUxfQlVER0VUX01TID0gMzAwMDBcbmV4cG9ydCBjb25zdCBTVE9QX0JVSUxEX0JBQ0tPRkZfQkFTRV9NUyA9IDEwMDBcblxuLy8gdXBsb2FkQXR0YWNobWVudCBpcyBjYWxsZWQgZnJvbSBpbnNpZGUgdGhlIGN1c3RvbWVyJ3MgdGVzdCBib2R5LCBzbyB0aGUgd2FpdCBmb3IgdGhlXG4vLyBiaW5hcnkncyBhY2sgaXMgYm91bmRlZDogdGhlIGV2ZW50IGlzIGFscmVhZHkgb24gdGhlIHdpcmUgd2hlbiB0aGUgdGltZXIgZmlyZXMsIGFuZCBhXG4vLyB3ZWRnZWQgYmluYXJ5IG11c3Qgbm90IHN0YWxsIHRoZSB0ZXN0IHRoYXQgY2FsbGVkIHVzLlxuZXhwb3J0IGNvbnN0IFVQTE9BRF9BVFRBQ0hNRU5UX0FDS19USU1FT1VUX01TID0gMTAwMDBcblxuLy8gQVBJIEVuZHBvaW50IGNvbnN0YW50c1xuZXhwb3J0IGNvbnN0IFVQREFURURfQ0xJX0VORFBPSU5UID0gJ3Nkay92MS91cGRhdGVfY2xpJ1xuXG4vKipcbiAqIE1vZHVsZSBIb29rIEV2ZW50cyAtIFBlcmZvcm1hbmNlIGV2ZW50IG5hbWVzIGZvciBtb2R1bGUgbGlmZWN5Y2xlIHRyYWNraW5nXG4gKiBVc2VkIGJ5IG1vZHVsZS1ob29rLXRyYWNrZXIudHMgdG8gaW5zdHJ1bWVudCBtb2R1bGUgaW5pdGlhbGl6YXRpb24gYW5kIGNsZWFudXBcbiAqL1xuZXhwb3J0IGNvbnN0IE1PRFVMRV9IT09LX0VWRU5UUyA9IHtcbiAgICAvLyBJbnN0cnVtZW50YXRpb24gbW9kdWxlXG4gICAgSU5TVFJVTUVOVEFUSU9OX09OX1NUQVJUOiAnTU9EVUxFX0lOU1RSVU1FTlRBVElPTl9PTl9TVEFSVCcsXG4gICAgSU5TVFJVTUVOVEFUSU9OX09OX1NUT1A6ICdNT0RVTEVfSU5TVFJVTUVOVEFUSU9OX09OX1NUT1AnLFxuXG4gICAgLy8gVGVzdEh1YiBtb2R1bGVcbiAgICBURVNUSFVCX09OX1NUQVJUOiAnTU9EVUxFX1RFU1RIVUJfT05fU1RBUlQnLFxuICAgIFRFU1RIVUJfT05fU1RPUDogJ01PRFVMRV9URVNUSFVCX09OX1NUT1AnLFxuXG4gICAgLy8gT2JzZXJ2YWJpbGl0eSBtb2R1bGVcbiAgICBPQlNFUlZBQklMSVRZX09OX1NUQVJUOiAnTU9EVUxFX09CU0VSVkFCSUxJVFlfT05fU1RBUlQnLFxuICAgIE9CU0VSVkFCSUxJVFlfT05fU1RPUDogJ01PRFVMRV9PQlNFUlZBQklMSVRZX09OX1NUT1AnLFxuXG4gICAgLy8gUGVyY3kgbW9kdWxlXG4gICAgUEVSQ1lfT05fU1RBUlQ6ICdNT0RVTEVfUEVSQ1lfT05fU1RBUlQnLFxuICAgIFBFUkNZX09OX1NUT1A6ICdNT0RVTEVfUEVSQ1lfT05fU1RPUCcsXG5cbiAgICAvLyBBY2Nlc3NpYmlsaXR5IG1vZHVsZVxuICAgIEFDQ0VTU0lCSUxJVFlfT05fU1RBUlQ6ICdNT0RVTEVfQUNDRVNTSUJJTElUWV9PTl9TVEFSVCcsXG4gICAgQUNDRVNTSUJJTElUWV9PTl9TVE9QOiAnTU9EVUxFX0FDQ0VTU0lCSUxJVFlfT05fU1RPUCcsXG4gICAgQUNDRVNTSUJJTElUWV9PTl9EUklWRVJfSU5JVDogJ01PRFVMRV9BQ0NFU1NJQklMSVRZX09OX0RSSVZFUl9JTklUJyxcblxuICAgIC8vIEFJIG1vZHVsZVxuICAgIEFJX09OX1NUQVJUOiAnTU9EVUxFX0FJX09OX1NUQVJUJyxcbiAgICBBSV9PTl9TVE9QOiAnTU9EVUxFX0FJX09OX1NUT1AnLFxuICAgIEFJX0JFRk9SRV9TRVNTSU9OOiAnTU9EVUxFX0FJX0JFRk9SRV9TRVNTSU9OJyxcbiAgICBBSV9PTl9EUklWRVJfSU5JVDogJ01PRFVMRV9BSV9PTl9EUklWRVJfSU5JVCcsXG5cbiAgICAvLyBMb2NhbCB0ZXN0aW5nIG1vZHVsZVxuICAgIExPQ0FMX09OX1NUQVJUOiAnTU9EVUxFX0xPQ0FMX09OX1NUQVJUJyxcbiAgICBMT0NBTF9PTl9TVE9QOiAnTU9EVUxFX0xPQ0FMX09OX1NUT1AnLFxuICAgIExPQ0FMX0lOSVRfU0VTU0lPTjogJ01PRFVMRV9MT0NBTF9JTklUX1NFU1NJT04nLFxuICAgIExPQ0FMX09OX0RSSVZFUl9JTklUOiAnTU9EVUxFX0xPQ0FMX09OX0RSSVZFUl9JTklUJyxcblxuICAgIC8vIEFwcCBBdXRvbWF0ZSBtb2R1bGVcbiAgICBBUFBBVVRPTUFURV9PTl9TVEFSVDogJ01PRFVMRV9BUFBBVVRPTUFURV9PTl9TVEFSVCcsXG4gICAgQVBQQVVUT01BVEVfT05fRFJJVkVSX0lOSVQ6ICdNT0RVTEVfQVBQQVVUT01BVEVfT05fRFJJVkVSX0lOSVQnLFxufSBhcyBjb25zdFxuIiwgImltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCdcbmltcG9ydCBmcyBmcm9tICdub2RlOmZzJ1xuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJ1xuXG5pbXBvcnQgbG9nZ2VyIGZyb20gJ0B3ZGlvL2xvZ2dlcidcblxuaW1wb3J0IHsgTE9HU19GSUxFIH0gZnJvbSAnLi4vY29uc3RhbnRzLmpzJ1xuaW1wb3J0IHsgQ09MT1JTIH0gZnJvbSAnLi4vdXRpbC5qcydcblxuY29uc3QgbG9nID0gbG9nZ2VyKCdAd2Rpby9icm93c2Vyc3RhY2stc2VydmljZS9jbGknKVxuXG5leHBvcnQgY2xhc3MgQlN0YWNrTG9nZ2VyIHtcbiAgICBwdWJsaWMgc3RhdGljIGxvZ0ZpbGVQYXRoID0gcGF0aC5qb2luKHByb2Nlc3MuY3dkKCksIExPR1NfRklMRSlcbiAgICBwdWJsaWMgc3RhdGljIGxvZ0ZvbGRlclBhdGggPSBwYXRoLmpvaW4ocHJvY2Vzcy5jd2QoKSwgJ2xvZ3MnKVxuICAgIHByaXZhdGUgc3RhdGljIGxvZ0ZpbGVTdHJlYW06IGZzLldyaXRlU3RyZWFtIHwgbnVsbFxuXG4gICAgc3RhdGljIGxvZ1RvRmlsZShsb2dNZXNzYWdlOiBzdHJpbmcsIGxvZ0xldmVsOiBzdHJpbmcpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmICghdGhpcy5sb2dGaWxlU3RyZWFtKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5lbnN1cmVMb2dzRm9sZGVyKClcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ0ZpbGVTdHJlYW0gPSBmcy5jcmVhdGVXcml0ZVN0cmVhbSh0aGlzLmxvZ0ZpbGVQYXRoLCB7IGZsYWdzOiAnYScgfSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLmxvZ0ZpbGVTdHJlYW0gJiYgdGhpcy5sb2dGaWxlU3RyZWFtLndyaXRhYmxlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2dGaWxlU3RyZWFtLndyaXRlKHRoaXMuZm9ybWF0TG9nKGxvZ01lc3NhZ2UsIGxvZ0xldmVsKSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGxvZy5kZWJ1ZyhgRmFpbGVkIHRvIGxvZyB0byBmaWxlLiBFcnJvciAke2Vycm9yfWApXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBmb3JtYXRMb2cobG9nTWVzc2FnZTogc3RyaW5nLCBsZXZlbDogc3RyaW5nKSB7XG4gICAgICAgIHJldHVybiBgJHtjaGFsay5ncmF5KG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSl9ICR7Y2hhbGtbQ09MT1JTW2xldmVsXV0obGV2ZWwudG9VcHBlckNhc2UoKSl9ICR7Y2hhbGsud2hpdGVCcmlnaHQoJ0B3ZGlvL2Jyb3dzZXJzdGFjay1zZXJ2aWNlJyl9ICR7bG9nTWVzc2FnZX1cXG5gXG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBpbmZvKG1lc3NhZ2U6IHN0cmluZykge1xuICAgICAgICB0aGlzLmxvZ1RvRmlsZShtZXNzYWdlLCAnaW5mbycpXG4gICAgICAgIGxvZy5pbmZvKG1lc3NhZ2UpXG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBlcnJvcihtZXNzYWdlOiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5sb2dUb0ZpbGUobWVzc2FnZSwgJ2Vycm9yJylcbiAgICAgICAgbG9nLmVycm9yKG1lc3NhZ2UpXG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBkZWJ1ZyhtZXNzYWdlOiBzdHJpbmcsIHBhcmFtPzogdW5rbm93bikge1xuICAgICAgICB0aGlzLmxvZ1RvRmlsZShtZXNzYWdlLCAnZGVidWcnKVxuICAgICAgICBpZiAocGFyYW0pIHtcbiAgICAgICAgICAgIGxvZy5kZWJ1ZyhtZXNzYWdlLCBwYXJhbSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxvZy5kZWJ1ZyhtZXNzYWdlKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyB3YXJuKG1lc3NhZ2U6IHN0cmluZykge1xuICAgICAgICB0aGlzLmxvZ1RvRmlsZShtZXNzYWdlLCAnd2FybicpXG4gICAgICAgIGxvZy53YXJuKG1lc3NhZ2UpXG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyB0cmFjZShtZXNzYWdlOiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5sb2dUb0ZpbGUobWVzc2FnZSwgJ3RyYWNlJylcbiAgICAgICAgbG9nLnRyYWNlKG1lc3NhZ2UpXG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBjbGVhckxvZ2dlcigpIHtcbiAgICAgICAgaWYgKHRoaXMubG9nRmlsZVN0cmVhbSkge1xuICAgICAgICAgICAgdGhpcy5sb2dGaWxlU3RyZWFtLmVuZCgpXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5sb2dGaWxlU3RyZWFtID0gbnVsbFxuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgY2xlYXJMb2dGaWxlKCkge1xuICAgICAgICBpZiAoZnMuZXhpc3RzU3luYyh0aGlzLmxvZ0ZpbGVQYXRoKSkge1xuICAgICAgICAgICAgZnMudHJ1bmNhdGVTeW5jKHRoaXMubG9nRmlsZVBhdGgpXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGVuc3VyZUxvZ3NGb2xkZXIoKSB7XG4gICAgICAgIGlmICghZnMuZXhpc3RzU3luYyh0aGlzLmxvZ0ZvbGRlclBhdGgpKXtcbiAgICAgICAgICAgIGZzLm1rZGlyU3luYyh0aGlzLmxvZ0ZvbGRlclBhdGgpXG4gICAgICAgIH1cbiAgICB9XG59XG4iLCAiaW1wb3J0IHsgQlN0YWNrTG9nZ2VyIH0gZnJvbSAnLi9jbGlMb2dnZXIuanMnXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEFQSVV0aWxzIHtcbiAgICBzdGF0aWMgRlVOTkVMX0lOU1RSVU1FTlRBVElPTl9VUkwgPSAnaHR0cHM6Ly9hcGkuYnJvd3NlcnN0YWNrLmNvbS9zZGsvdjEvZXZlbnQnXG4gICAgc3RhdGljIEJST1dTRVJTVEFDS19BVVRPTUFURV9BUElfVVJMID0gJ2h0dHBzOi8vYXBpLmJyb3dzZXJzdGFjay5jb20nXG4gICAgc3RhdGljIEJST1dTRVJTVEFDS19BQV9BUElfVVJMID0gJ2h0dHBzOi8vYXBpLmJyb3dzZXJzdGFjay5jb20nXG4gICAgc3RhdGljIEJST1dTRVJTVEFDS19QRVJDWV9BUElfVVJMID0gJ2h0dHBzOi8vYXBpLmJyb3dzZXJzdGFjay5jb20nXG4gICAgc3RhdGljIEJST1dTRVJTVEFDS19BVVRPTUFURV9BUElfQ0xPVURfVVJMID0gJ2h0dHBzOi8vYXBpLWNsb3VkLmJyb3dzZXJzdGFjay5jb20nXG4gICAgc3RhdGljIEJST1dTRVJTVEFDS19BQV9BUElfQ0xPVURfVVJMID0gJ2h0dHBzOi8vYXBpLWNsb3VkLmJyb3dzZXJzdGFjay5jb20nXG4gICAgc3RhdGljIEFQUF9BTExZX0VORFBPSU5UID0gJ2h0dHBzOi8vYXBwLWFjY2Vzc2liaWxpdHkuYnJvd3NlcnN0YWNrLmNvbS9hdXRvbWF0ZSdcbiAgICBzdGF0aWMgREFUQV9FTkRQT0lOVCA9ICdodHRwczovL2NvbGxlY3Rvci1vYnNlcnZhYmlsaXR5LmJyb3dzZXJzdGFjay5jb20nXG4gICAgc3RhdGljIFVQTE9BRF9MT0dTX0FERFJFU1MgPSAnaHR0cHM6Ly91cGxvYWQtb2JzZXJ2YWJpbGl0eS5icm93c2Vyc3RhY2suY29tJ1xuICAgIHN0YXRpYyBFRFNfVVJMID0gJ2h0dHBzOi8vZWRzLmJyb3dzZXJzdGFjay5jb20nXG5cbiAgICAvKipcbiAgICAgKiBPdmVybGF5IHRoZSBiaW5hcnktc3VwcGxpZWQgR1JSIGVuZHBvaW50cyBvbnRvIHRoZSBwdWJsaWMgZGVmYXVsdHMuIEV2ZXJ5IGZpZWxkIGlzXG4gICAgICogb3B0aW9uYWw6IGEgZGVnZW5lcmF0ZSBTdGFydEJpblNlc3Npb24vQ29ubmVjdEJpblNlc3Npb24gY29uZmlnIChhdXRoIGZhaWx1cmUsIGVtcHR5XG4gICAgICogcGF5bG9hZCkgdXNlZCB0byB0aHJvdyBoZXJlIGFuZCBhYm9ydCB0aGUgd2hvbGUgQ0xJIGJvb3RzdHJhcCwgdGFraW5nIGV2ZXJ5IHByb2R1Y3RcbiAgICAgKiBtb2R1bGUgd2l0aCBpdC4gTWlzc2luZyBlbnRyaWVzIG5vdyBqdXN0IGxlYXZlIHRoZSBjb3JyZXNwb25kaW5nIGRlZmF1bHQgaW4gcGxhY2UuXG4gICAgICovXG4gICAgc3RhdGljIHVwZGF0ZVVSTFNGb3JHUlIoYXBpcz86IEdSUlVybHMpIHtcbiAgICAgICAgaWYgKCFhcGlzKSB7XG4gICAgICAgICAgICBCU3RhY2tMb2dnZXIuZGVidWcoJ3VwZGF0ZVVSTFNGb3JHUlI6IG5vIGFwaXMgaW4gdGhlIGJpbi1zZXNzaW9uIGNvbmZpZzsga2VlcGluZyBkZWZhdWx0IGVuZHBvaW50cycpXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBtaXNzaW5nID0gW1xuICAgICAgICAgICAgWydhdXRvbWF0ZS5hcGknLCBhcGlzLmF1dG9tYXRlPy5hcGldLCBbJ2F1dG9tYXRlLnVwbG9hZCcsIGFwaXMuYXV0b21hdGU/LnVwbG9hZF0sXG4gICAgICAgICAgICBbJ2FwcEF1dG9tYXRlLmFwaScsIGFwaXMuYXBwQXV0b21hdGU/LmFwaV0sIFsnYXBwQXV0b21hdGUudXBsb2FkJywgYXBpcy5hcHBBdXRvbWF0ZT8udXBsb2FkXSxcbiAgICAgICAgICAgIFsncGVyY3kuYXBpJywgYXBpcy5wZXJjeT8uYXBpXSwgWydhcHBBY2Nlc3NpYmlsaXR5LmFwaScsIGFwaXMuYXBwQWNjZXNzaWJpbGl0eT8uYXBpXSxcbiAgICAgICAgICAgIFsnb2JzZXJ2YWJpbGl0eS5hcGknLCBhcGlzLm9ic2VydmFiaWxpdHk/LmFwaV0sIFsnb2JzZXJ2YWJpbGl0eS51cGxvYWQnLCBhcGlzLm9ic2VydmFiaWxpdHk/LnVwbG9hZF0sXG4gICAgICAgICAgICBbJ2Vkc0luc3RydW1lbnRhdGlvbi5hcGknLCBhcGlzLmVkc0luc3RydW1lbnRhdGlvbj8uYXBpXVxuICAgICAgICBdLmZpbHRlcigoWywgdmFsdWVdKSA9PiAhdmFsdWUpLm1hcCgoW25hbWVdKSA9PiBuYW1lKVxuICAgICAgICBpZiAobWlzc2luZy5sZW5ndGgpIHtcbiAgICAgICAgICAgIEJTdGFja0xvZ2dlci5kZWJ1ZyhgdXBkYXRlVVJMU0ZvckdSUjoga2VlcGluZyBkZWZhdWx0IGVuZHBvaW50cyBmb3IgJHttaXNzaW5nLmpvaW4oJywgJyl9YClcbiAgICAgICAgfVxuICAgICAgICBpZiAoYXBpcy5hdXRvbWF0ZT8uYXBpKSB7XG4gICAgICAgICAgICB0aGlzLkZVTk5FTF9JTlNUUlVNRU5UQVRJT05fVVJMID0gYCR7YXBpcy5hdXRvbWF0ZS5hcGl9L3Nkay92MS9ldmVudGBcbiAgICAgICAgICAgIHRoaXMuQlJPV1NFUlNUQUNLX0FVVE9NQVRFX0FQSV9VUkwgPSBhcGlzLmF1dG9tYXRlLmFwaVxuICAgICAgICB9XG4gICAgICAgIGlmIChhcGlzLmF1dG9tYXRlPy51cGxvYWQpIHtcbiAgICAgICAgICAgIHRoaXMuQlJPV1NFUlNUQUNLX0FVVE9NQVRFX0FQSV9DTE9VRF9VUkwgPSBhcGlzLmF1dG9tYXRlLnVwbG9hZFxuICAgICAgICB9XG4gICAgICAgIGlmIChhcGlzLmFwcEF1dG9tYXRlPy5hcGkpIHtcbiAgICAgICAgICAgIHRoaXMuQlJPV1NFUlNUQUNLX0FBX0FQSV9VUkwgPSBhcGlzLmFwcEF1dG9tYXRlLmFwaVxuICAgICAgICB9XG4gICAgICAgIGlmIChhcGlzLmFwcEF1dG9tYXRlPy51cGxvYWQpIHtcbiAgICAgICAgICAgIHRoaXMuQlJPV1NFUlNUQUNLX0FBX0FQSV9DTE9VRF9VUkwgPSBhcGlzLmFwcEF1dG9tYXRlLnVwbG9hZFxuICAgICAgICB9XG4gICAgICAgIGlmIChhcGlzLnBlcmN5Py5hcGkpIHtcbiAgICAgICAgICAgIHRoaXMuQlJPV1NFUlNUQUNLX1BFUkNZX0FQSV9VUkwgPSBhcGlzLnBlcmN5LmFwaVxuICAgICAgICB9XG4gICAgICAgIGlmIChhcGlzLmFwcEFjY2Vzc2liaWxpdHk/LmFwaSkge1xuICAgICAgICAgICAgdGhpcy5BUFBfQUxMWV9FTkRQT0lOVCA9IGAke2FwaXMuYXBwQWNjZXNzaWJpbGl0eS5hcGl9L2F1dG9tYXRlYFxuICAgICAgICB9XG4gICAgICAgIGlmIChhcGlzLm9ic2VydmFiaWxpdHk/LmFwaSkge1xuICAgICAgICAgICAgdGhpcy5EQVRBX0VORFBPSU5UID0gYXBpcy5vYnNlcnZhYmlsaXR5LmFwaVxuICAgICAgICB9XG4gICAgICAgIGlmIChhcGlzLm9ic2VydmFiaWxpdHk/LnVwbG9hZCkge1xuICAgICAgICAgICAgdGhpcy5VUExPQURfTE9HU19BRERSRVNTID0gYXBpcy5vYnNlcnZhYmlsaXR5LnVwbG9hZFxuICAgICAgICB9XG4gICAgICAgIGlmIChhcGlzLmVkc0luc3RydW1lbnRhdGlvbj8uYXBpKSB7XG4gICAgICAgICAgICB0aGlzLkVEU19VUkwgPSBhcGlzLmVkc0luc3RydW1lbnRhdGlvbi5hcGlcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsICJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcydcbmltcG9ydCBmc3AgZnJvbSAnbm9kZTpmcy9wcm9taXNlcydcbmltcG9ydCB7IHBsYXRmb3JtLCBhcmNoLCBob21lZGlyIH0gZnJvbSAnbm9kZTpvcydcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCdcbmltcG9ydCB1dGlsLCB7IHByb21pc2lmeSB9IGZyb20gJ25vZGU6dXRpbCdcbmltcG9ydCB7IGV4ZWMgfSBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnXG5pbXBvcnQgeyBSZWFkYWJsZSB9IGZyb20gJ25vZGU6c3RyZWFtJ1xuaW1wb3J0IHR5cGUgeyBaaXBGaWxlLCBPcHRpb25zIGFzIHlhdXpsT3B0aW9ucyB9IGZyb20gJ3lhdXpsJ1xuaW1wb3J0IHlhdXpsIGZyb20gJ3lhdXpsJ1xuaW1wb3J0IHsgdGhyZWFkSWQgfSBmcm9tICdub2RlOndvcmtlcl90aHJlYWRzJ1xuXG5pbXBvcnQgeyBfZmV0Y2ggYXMgZmV0Y2ggfSBmcm9tICcuLi9mZXRjaFdyYXBwZXIuanMnXG5cbmltcG9ydCB7XG4gICAgaXNOdWxsT3JFbXB0eSxcbiAgICBuZXN0ZWRLZXlWYWx1ZSxcbiAgICBjcmVhdGVEaXIsXG4gICAgaXNXcml0YWJsZSxcbiAgICBzZXRSZWFkV3JpdGVBY2Nlc3MsXG4gICAgaXNUcnVlLFxuICAgIGdldEJyb3dzZXJTdGFja1VzZXIsXG4gICAgZ2V0QnJvd3NlclN0YWNrS2V5LFxuICAgIGlzRmFsc2UsXG4gICAgaXNUdXJib1NjYWxlLFxuICAgIHNob3VsZEFkZFNlcnZpY2VWZXJzaW9uLFxufSBmcm9tICcuLi91dGlsLmpzJ1xuaW1wb3J0IFBlcmZvcm1hbmNlVGVzdGVyIGZyb20gJy4uL2luc3RydW1lbnRhdGlvbi9wZXJmb3JtYW5jZS9wZXJmb3JtYW5jZS10ZXN0ZXIuanMnXG5pbXBvcnQgeyBFVkVOVFMgYXMgUGVyZm9ybWFuY2VFdmVudHMgfSBmcm9tICcuLi9pbnN0cnVtZW50YXRpb24vcGVyZm9ybWFuY2UvY29uc3RhbnRzLmpzJ1xuaW1wb3J0IHsgQlN0YWNrTG9nZ2VyIGFzIGxvZ2dlciB9IGZyb20gJy4vY2xpTG9nZ2VyLmpzJ1xuaW1wb3J0IHsgVVBEQVRFRF9DTElfRU5EUE9JTlQsIEJTVEFDS19TRVJWSUNFX1ZFUlNJT04sIEJJTkFSWV9CVVNZX0VSUk9SX0NPREVTIH0gZnJvbSAnLi4vY29uc3RhbnRzLmpzJ1xuaW1wb3J0IHR5cGUgeyBPcHRpb25zLCBDYXBhYmlsaXRpZXMgfSBmcm9tICdAd2Rpby90eXBlcydcbmltcG9ydCB0eXBlIHtcbiAgICBCcm93c2Vyc3RhY2tDb25maWcsXG4gICAgQnJvd3NlcnN0YWNrT3B0aW9ucyxcbiAgICBUZXN0TWFuYWdlbWVudE9wdGlvbnMsXG4gICAgVGVzdE9ic2VydmFiaWxpdHlPcHRpb25zLFxufSBmcm9tICcuLi90eXBlcy5qcydcbmltcG9ydCB7IFRlc3RGcmFtZXdvcmtDb25zdGFudHMgfSBmcm9tICcuL2ZyYW1ld29ya3MvY29uc3RhbnRzL3Rlc3RGcmFtZXdvcmtDb25zdGFudHMuanMnXG5pbXBvcnQgQVBJVXRpbHMgZnJvbSAnLi9hcGlVdGlscy5qcydcblxuY29uc3QgQ0xJX0xPQ0tfVElNRU9VVF9NUyA9IDUgKiA2MCAqIDEwMDBcbmNvbnN0IENMSV9MT0NLX1BPTExfTVMgPSAxMDAwXG5jb25zdCBDTElfRE9XTkxPQURfVElNRU9VVF9NUyA9IDUgKiA2MCAqIDEwMDBcbmNvbnN0IENMSV9ET1dOTE9BRF9UTVBfUFJFRklYID0gJ2Rvd25sb2FkZWRfZmlsZV8nXG5jb25zdCBDTElfRE9XTkxPQURfVE1QX1NVRkZJWCA9ICcuemlwJ1xuXG5leHBvcnQgY2xhc3MgQ0xJVXRpbHMge1xuICAgIHN0YXRpYyBhdXRvbWF0aW9uRnJhbWV3b3JrRGV0YWlsID0ge31cbiAgICBzdGF0aWMgdGVzdEZyYW1ld29ya0RldGFpbCA9IHt9XG4gICAgc3RhdGljIENMSVN1cHBvcnRlZEZyYW1ld29ya3MgPSBbJ21vY2hhJywgJ2N1Y3VtYmVyJ11cblxuICAgIHN0YXRpYyBpc0RldmVsb3BtZW50RW52KCkge1xuICAgICAgICByZXR1cm4gcHJvY2Vzcy5lbnYuQlJPV1NFUlNUQUNLX0NMSV9FTlYgPT09ICdkZXZlbG9wbWVudCdcbiAgICB9XG5cbiAgICBzdGF0aWMgZ2V0Q0xJUGFyYW1zRm9yRGV2RW52KCk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4ge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgaWQ6IHByb2Nlc3MuZW52LkJST1dTRVJTVEFDS19DTElfRU5WIHx8ICcnLFxuICAgICAgICAgICAgbGlzdGVuOiBgdW5peDovdG1wL3Nkay1wbGF0Zm9ybS0ke3Byb2Nlc3MuZW52LkJST1dTRVJTVEFDS19DTElfRU5WfS5zb2NrYCxcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEJ1aWxkIGNvbmZpZyBvYmplY3QgZm9yIGJpbmFyeSBzZXNzaW9uIHJlcXVlc3RcbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgICAqIEB0aHJvd3Mge0Vycm9yfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXRCaW5Db25maWcoXG4gICAgICAgIGNvbmZpZzogT3B0aW9ucy5UZXN0cnVubmVyLFxuICAgICAgICBjYXBhYmlsaXRpZXM6XG4gICAgICAgICAgICB8IENhcGFiaWxpdGllcy5SZXF1ZXN0ZWRTdGFuZGFsb25lQ2FwYWJpbGl0aWVzXG4gICAgICAgICAgICB8IENhcGFiaWxpdGllcy5SZXF1ZXN0ZWRTdGFuZGFsb25lQ2FwYWJpbGl0aWVzW10sXG4gICAgICAgIG9wdGlvbnM6IEJyb3dzZXJzdGFja0NvbmZpZyAmIEJyb3dzZXJzdGFja09wdGlvbnMsXG4gICAgICAgIGJ1aWxkVGFnPzogc3RyaW5nLFxuICAgICkge1xuICAgICAgICBjb25zdCBtb2RpZmllZE9wdHM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0geyAuLi5vcHRpb25zIH1cbiAgICAgICAgaWYgKG1vZGlmaWVkT3B0cy5vcHRzKSB7XG4gICAgICAgICAgICBtb2RpZmllZE9wdHMuYnJvd3NlclN0YWNrTG9jYWxPcHRpb25zID0gbW9kaWZpZWRPcHRzLm9wdHNcbiAgICAgICAgICAgIGRlbGV0ZSBtb2RpZmllZE9wdHMub3B0c1xuICAgICAgICB9XG4gICAgICAgIGRlbGV0ZSBtb2RpZmllZE9wdHMudGVzdE1hbmFnZW1lbnRPcHRpb25zXG5cbiAgICAgICAgbW9kaWZpZWRPcHRzLnRlc3RDb250ZXh0T3B0aW9ucyA9IHtcbiAgICAgICAgICAgIHNraXBTZXNzaW9uTmFtZTogaXNGYWxzZShtb2RpZmllZE9wdHMuc2V0U2Vzc2lvbk5hbWUpLFxuICAgICAgICAgICAgc2tpcFNlc3Npb25TdGF0dXM6IGlzRmFsc2UobW9kaWZpZWRPcHRzLnNldFNlc3Npb25TdGF0dXMpLFxuICAgICAgICAgICAgc2Vzc2lvbk5hbWVPbWl0VGVzdFRpdGxlOiBtb2RpZmllZE9wdHMuc2Vzc2lvbk5hbWVPbWl0VGVzdFRpdGxlIHx8IGZhbHNlLFxuICAgICAgICAgICAgc2Vzc2lvbk5hbWVQcmVwZW5kVG9wTGV2ZWxTdWl0ZVRpdGxlOlxuICAgICAgICAgICAgICAgIG1vZGlmaWVkT3B0cy5zZXNzaW9uTmFtZVByZXBlbmRUb3BMZXZlbFN1aXRlVGl0bGUgfHwgZmFsc2UsXG4gICAgICAgICAgICBzZXNzaW9uTmFtZUZvcm1hdDogbW9kaWZpZWRPcHRzLnNlc3Npb25OYW1lRm9ybWF0IHx8ICcnLFxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY29tbW9uQnN0YWNrT3B0aW9ucyA9ICgoKSA9PiB7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgY2FwYWJpbGl0aWVzICYmXG4gICAgICAgICAgICAgICAgIUFycmF5LmlzQXJyYXkoY2FwYWJpbGl0aWVzKSAmJlxuICAgICAgICAgICAgICAgIHR5cGVvZiBjYXBhYmlsaXRpZXMgPT09ICdvYmplY3QnICYmXG4gICAgICAgICAgICAgICAgJ2JzdGFjazpvcHRpb25zJyBpbiAoY2FwYWJpbGl0aWVzIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgLy8gQ2FzdCBhZnRlciBndWFyZCB0byBzYXRpc2Z5IFR5cGVTY3JpcHRcbiAgICAgICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgICAgICAoXG4gICAgICAgICAgICAgICAgICAgICAgICBjYXBhYmlsaXRpZXMgYXMge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsnYnN0YWNrOm9wdGlvbnMnXT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICApWydic3RhY2s6b3B0aW9ucyddIHx8IHt9XG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHt9XG4gICAgICAgIH0pKClcblxuICAgICAgICBjb25zdCBpc05vbkJzdGFja0ExMXkgPVxuICAgICAgICAgICAgaXNUdXJib1NjYWxlKG9wdGlvbnMpIHx8XG4gICAgICAgICAgICAhc2hvdWxkQWRkU2VydmljZVZlcnNpb24oXG4gICAgICAgICAgICAgICAgY29uZmlnIGFzIE9wdGlvbnMuVGVzdHJ1bm5lcixcbiAgICAgICAgICAgICAgICBvcHRpb25zLnRlc3RPYnNlcnZhYmlsaXR5LFxuICAgICAgICAgICAgKVxuICAgICAgICBjb25zdCBvYnNlcnZhYmlsaXR5T3B0aW9uczogVGVzdE9ic2VydmFiaWxpdHlPcHRpb25zID1cbiAgICAgICAgICAgIG9wdGlvbnMudGVzdE9ic2VydmFiaWxpdHlPcHRpb25zIHx8IHt9XG4gICAgICAgIGNvbnN0IHRlc3RNYW5hZ2VtZW50T3B0aW9uczogVGVzdE1hbmFnZW1lbnRPcHRpb25zID1cbiAgICAgICAgICAgIG9wdGlvbnMudGVzdE1hbmFnZW1lbnRPcHRpb25zIHx8IHt9XG4gICAgICAgIGNvbnN0IHRlc3RQbGFuSWQgPSB0eXBlb2YgdGVzdE1hbmFnZW1lbnRPcHRpb25zLnRlc3RQbGFuSWQgPT09ICdzdHJpbmcnXG4gICAgICAgICAgICA/IHRlc3RNYW5hZ2VtZW50T3B0aW9ucy50ZXN0UGxhbklkLnRyaW0oKVxuICAgICAgICAgICAgOiAnJ1xuICAgICAgICBjb25zdCBiaW5jb25maWc6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge1xuICAgICAgICAgICAgdXNlck5hbWU6IG9ic2VydmFiaWxpdHlPcHRpb25zLnVzZXIgfHwgY29uZmlnLnVzZXIsXG4gICAgICAgICAgICBhY2Nlc3NLZXk6IG9ic2VydmFiaWxpdHlPcHRpb25zLmtleSB8fCBjb25maWcua2V5LFxuICAgICAgICAgICAgcGxhdGZvcm1zOiBbXSxcbiAgICAgICAgICAgIGlzTm9uQnN0YWNrQTExeVdESU86IGlzTm9uQnN0YWNrQTExeSxcbiAgICAgICAgICAgIC4uLm1vZGlmaWVkT3B0cyxcbiAgICAgICAgICAgIC4uLmNvbW1vbkJzdGFja09wdGlvbnMsXG4gICAgICAgIH1cblxuICAgICAgICBiaW5jb25maWcuYnVpbGROYW1lID0gb2JzZXJ2YWJpbGl0eU9wdGlvbnMuYnVpbGROYW1lIHx8IGJpbmNvbmZpZy5idWlsZE5hbWVcbiAgICAgICAgYmluY29uZmlnLnByb2plY3ROYW1lID0gb2JzZXJ2YWJpbGl0eU9wdGlvbnMucHJvamVjdE5hbWUgfHwgYmluY29uZmlnLnByb2plY3ROYW1lXG4gICAgICAgIGJpbmNvbmZpZy5idWlsZFRhZyA9IHRoaXMuZ2V0T2JzZXJ2YWJpbGl0eUJ1aWxkVGFncyhvYnNlcnZhYmlsaXR5T3B0aW9ucywgYnVpbGRUYWcpIHx8IFtdXG4gICAgICAgIGlmICh0ZXN0UGxhbklkLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGJpbmNvbmZpZy50ZXN0TWFuYWdlbWVudE9wdGlvbnMgPSB7XG4gICAgICAgICAgICAgICAgdGVzdFBsYW5JZCxcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNhcHMgPSBBcnJheS5pc0FycmF5KGNhcGFiaWxpdGllcykgPyBjYXBhYmlsaXRpZXMgOiBbY2FwYWJpbGl0aWVzXVxuICAgICAgICBmb3IgKGNvbnN0IGNhcCBvZiBjYXBzKSB7XG4gICAgICAgICAgICBjb25zdCBwbGF0Zm9ybTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fVxuICAgICAgICAgICAgY29uc3QgY2FwYWJpbGl0eSA9IGNhcCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuXG4gICAgICAgICAgICBPYmplY3Qua2V5cyhjYXBhYmlsaXR5KVxuICAgICAgICAgICAgICAgIC5maWx0ZXIoKGtleSkgPT4ga2V5ICE9PSAnYnN0YWNrOm9wdGlvbnMnKVxuICAgICAgICAgICAgICAgIC5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcGxhdGZvcm1ba2V5XSA9IGNhcGFiaWxpdHlba2V5XVxuICAgICAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgIGlmIChjYXBhYmlsaXR5Wydic3RhY2s6b3B0aW9ucyddKSB7XG4gICAgICAgICAgICAgICAgT2JqZWN0LmtleXMoXG4gICAgICAgICAgICAgICAgICAgIGNhcGFiaWxpdHlbJ2JzdGFjazpvcHRpb25zJ10gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gICAgICAgICAgICAgICAgKS5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcGxhdGZvcm1ba2V5XSA9IChcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhcGFiaWxpdHlbJ2JzdGFjazpvcHRpb25zJ10gYXMgUmVjb3JkPFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmtub3duXG4gICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIClba2V5XVxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAoYmluY29uZmlnLnBsYXRmb3JtcyBhcyBBcnJheTx1bmtub3duPikucHVzaChwbGF0Zm9ybSlcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoYmluY29uZmlnKVxuICAgIH1cblxuICAgIHN0YXRpYyBnZXRTZGtWZXJzaW9uKCkge1xuICAgICAgICByZXR1cm4gQlNUQUNLX1NFUlZJQ0VfVkVSU0lPTlxuICAgIH1cblxuICAgIHN0YXRpYyBnZXRTZGtMYW5ndWFnZSgpIHtcbiAgICAgICAgcmV0dXJuICdFQ01BU2NyaXB0J1xuICAgIH1cblxuICAgIHN0YXRpYyBhc3luYyBzZXR1cENsaVBhdGgoXG4gICAgICAgIGNvbmZpZzogT3B0aW9ucy5UZXN0cnVubmVyLFxuICAgICk6IFByb21pc2U8c3RyaW5nIHwgbnVsbD4ge1xuICAgICAgICBsb2dnZXIuZGVidWcoJ0NvbmZpZ3VyaW5nIENsaSBwYXRoLicpXG4gICAgICAgIGNvbnN0IGRldmVsb3BtZW50QmluYXJ5UGF0aCA9IHByb2Nlc3MuZW52LlNES19DTElfQklOX1BBVEggfHwgbnVsbFxuICAgICAgICBpZiAoIWlzTnVsbE9yRW1wdHkoZGV2ZWxvcG1lbnRCaW5hcnlQYXRoKSkge1xuICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGBEZXZlbG9wbWVudCBDbGkgUGF0aDogJHtkZXZlbG9wbWVudEJpbmFyeVBhdGh9YClcbiAgICAgICAgICAgIHJldHVybiBkZXZlbG9wbWVudEJpbmFyeVBhdGhcbiAgICAgICAgfVxuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBjbGlEaXIgPSB0aGlzLmdldENsaURpcigpXG4gICAgICAgICAgICBpZiAoaXNOdWxsT3JFbXB0eShjbGlEaXIpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyB3cml0YWJsZSBkaXJlY3RvcnkgYXZhaWxhYmxlIGZvciB0aGUgQ0xJJylcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGV4aXN0aW5nQ2xpUGF0aCA9IHRoaXMuZ2V0RXhpc3RpbmdDbGlQYXRoKGNsaURpcilcbiAgICAgICAgICAgIGNvbnN0IGZpbmFsQmluYXJ5UGF0aCA9IGF3YWl0IHRoaXMuY2hlY2tBbmRVcGRhdGVDbGkoXG4gICAgICAgICAgICAgICAgZXhpc3RpbmdDbGlQYXRoLFxuICAgICAgICAgICAgICAgIGNsaURpcixcbiAgICAgICAgICAgICAgICBjb25maWcsXG4gICAgICAgICAgICApXG4gICAgICAgICAgICBsb2dnZXIuZGVidWcoYFJlc29sdmVkIGJpbmFyeSBwYXRoOiAke2ZpbmFsQmluYXJ5UGF0aH1gKVxuICAgICAgICAgICAgcmV0dXJuIGZpbmFsQmluYXJ5UGF0aFxuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgICAgICAgICBgRXJyb3IgaW4gc2V0dGluZyB1cCBjbGkgcGF0aCBkaXJlY3RvcnksIEV4Y2VwdGlvbjogJHt1dGlsLmZvcm1hdChlcnIpfWAsXG4gICAgICAgICAgICApXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGxcbiAgICB9XG5cbiAgICBzdGF0aWMgYXN5bmMgY2hlY2tBbmRVcGRhdGVDbGkoXG4gICAgICAgIGV4aXN0aW5nQ2xpUGF0aDogc3RyaW5nLFxuICAgICAgICBjbGlEaXI6IHN0cmluZyxcbiAgICAgICAgY29uZmlnOiBPcHRpb25zLlRlc3RydW5uZXIsXG4gICAgKTogUHJvbWlzZTxzdHJpbmcgfCBudWxsPiB7XG4gICAgICAgIC8vIFNraXAgQ0xJIHVwZGF0ZSBpbiB3b3JrZXIgcHJvY2Vzc2VzIC0gb25seSBsYXVuY2hlciBzaG91bGQgdXBkYXRlXG4gICAgICAgIC8vIFdvcmtlcnMgYXJlIGlkZW50aWZpZWQgYnkgaGF2aW5nIEJST1dTRVJTVEFDS19URVNUSFVCX0pXVCBzZXQgKGJ1aWxkIGFscmVhZHkgc3RhcnRlZClcbiAgICAgICAgaWYgKHByb2Nlc3MuZW52LkJST1dTRVJTVEFDS19URVNUSFVCX0pXVCkge1xuICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKFxuICAgICAgICAgICAgICAgIGBXb3JrZXIgcHJvY2VzcyBkZXRlY3RlZCwgc2tpcHBpbmcgQ0xJIHVwZGF0ZS4gVXNpbmcgZXhpc3Rpbmc6ICR7ZXhpc3RpbmdDbGlQYXRofWAsXG4gICAgICAgICAgICApXG4gICAgICAgICAgICBpZiAoZXhpc3RpbmdDbGlQYXRoICYmIGZzLmV4aXN0c1N5bmMoZXhpc3RpbmdDbGlQYXRoKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBleGlzdGluZ0NsaVBhdGhcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxvZ2dlci53YXJuKFxuICAgICAgICAgICAgICAgICdXb3JrZXIgcHJvY2VzcyBoYXMgbm8gZXhpc3RpbmcgQ0xJIGJpbmFyeSwgYXR0ZW1wdGluZyBkb3dubG9hZCBhcyBmYWxsYmFjay4nLFxuICAgICAgICAgICAgKVxuICAgICAgICB9XG5cbiAgICAgICAgUGVyZm9ybWFuY2VUZXN0ZXIuc3RhcnQoUGVyZm9ybWFuY2VFdmVudHMuU0RLX0NMSV9DSEVDS19VUERBVEUpXG4gICAgICAgIGxvZ2dlci5pbmZvKGBDdXJyZW50IENMSSBQYXRoIEZvdW5kOiAke2V4aXN0aW5nQ2xpUGF0aH1gKVxuICAgICAgICBjb25zdCBxdWVyeVBhcmFtczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAgICAgICAgIHNka192ZXJzaW9uOiBDTElVdGlscy5nZXRTZGtWZXJzaW9uKCksXG4gICAgICAgICAgICBvczogcGxhdGZvcm0oKSxcbiAgICAgICAgICAgIG9zX2FyY2g6IGFyY2goKSxcbiAgICAgICAgICAgIGNsaV92ZXJzaW9uOiAnMCcsXG4gICAgICAgICAgICBzZGtfbGFuZ3VhZ2U6IHRoaXMuZ2V0U2RrTGFuZ3VhZ2UoKSxcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWlzTnVsbE9yRW1wdHkoZXhpc3RpbmdDbGlQYXRoKSkge1xuICAgICAgICAgICAgLy8gSWYgYmluYXJ5IGlzIGJ1c3kgKGJlaW5nIGV4ZWN1dGVkIGJ5IGFub3RoZXIgcHJvY2VzcyksIHNraXAgdmVyc2lvbiBjaGVja1xuICAgICAgICAgICAgLy8gYW5kIEFQSSBjYWxsIGVudGlyZWx5IFx1MjAxNCB1c2UgZXhpc3RpbmcgYmluYXJ5IGFzLWlzXG4gICAgICAgICAgICBpZiAodGhpcy5pc0JpbmFyeUJ1c3koZXhpc3RpbmdDbGlQYXRoKSkge1xuICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuKGBFeGlzdGluZyBiaW5hcnkgaXMgY3VycmVudGx5IGluIHVzZSwgc2tpcHBpbmcgdXBkYXRlOiAke2V4aXN0aW5nQ2xpUGF0aH1gKVxuICAgICAgICAgICAgICAgIFBlcmZvcm1hbmNlVGVzdGVyLmVuZChQZXJmb3JtYW5jZUV2ZW50cy5TREtfQ0xJX0NIRUNLX1VQREFURSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZXhpc3RpbmdDbGlQYXRoXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCB2ZXJzaW9uID0gYXdhaXQgdGhpcy5ydW5TaGVsbENvbW1hbmQoXG4gICAgICAgICAgICAgICAgYCR7ZXhpc3RpbmdDbGlQYXRofSB2ZXJzaW9uYCxcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIGlmICh2ZXJzaW9uLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoJ3RleHQgZmlsZSBidXN5JykpIHtcbiAgICAgICAgICAgICAgICBsb2dnZXIud2FybihgQmluYXJ5IGJ1c3kgZHVyaW5nIHZlcnNpb24gY2hlY2ssIHNraXBwaW5nIHVwZGF0ZTogJHtleGlzdGluZ0NsaVBhdGh9YClcbiAgICAgICAgICAgICAgICBQZXJmb3JtYW5jZVRlc3Rlci5lbmQoUGVyZm9ybWFuY2VFdmVudHMuU0RLX0NMSV9DSEVDS19VUERBVEUpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGV4aXN0aW5nQ2xpUGF0aFxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcXVlcnlQYXJhbXMuY2xpX3ZlcnNpb24gPSB2ZXJzaW9uXG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLnJlcXVlc3RUb1VwZGF0ZUNMSShxdWVyeVBhcmFtcywgY29uZmlnKVxuICAgICAgICBpZiAobmVzdGVkS2V5VmFsdWUocmVzcG9uc2UsIFsndXBkYXRlZF9jbGlfdmVyc2lvbiddKSkge1xuICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKFxuICAgICAgICAgICAgICAgIGBOZWVkIHRvIHVwZGF0ZSBiaW5hcnksIGN1cnJlbnQgYmluYXJ5IHZlcnNpb246ICR7cXVlcnlQYXJhbXMuY2xpX3ZlcnNpb259YCxcbiAgICAgICAgICAgIClcblxuICAgICAgICAgICAgY29uc3QgYnJvd3NlclN0YWNrQmluYXJ5VXJsID1cbiAgICAgICAgICAgICAgICBwcm9jZXNzLmVudi5CUk9XU0VSU1RBQ0tfQklOQVJZX1VSTCB8fCBudWxsXG4gICAgICAgICAgICBpZiAoIWlzTnVsbE9yRW1wdHkoYnJvd3NlclN0YWNrQmluYXJ5VXJsKSkge1xuICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgICAgICAgICAgICAgYFVzaW5nIEJST1dTRVJTVEFDS19CSU5BUllfVVJMOiAke2Jyb3dzZXJTdGFja0JpbmFyeVVybH1gLFxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICByZXNwb25zZS51cmwgPSBicm93c2VyU3RhY2tCaW5hcnlVcmxcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgZmluYWxCaW5hcnlQYXRoID0gYXdhaXQgdGhpcy5kb3dubG9hZExhdGVzdEJpbmFyeShcbiAgICAgICAgICAgICAgICBuZXN0ZWRLZXlWYWx1ZShyZXNwb25zZSwgWyd1cmwnXSksXG4gICAgICAgICAgICAgICAgY2xpRGlyLFxuICAgICAgICAgICAgICAgIG5lc3RlZEtleVZhbHVlKHJlc3BvbnNlLCBbJ3VwZGF0ZWRfY2xpX3ZlcnNpb24nXSksXG4gICAgICAgICAgICApXG4gICAgICAgICAgICBQZXJmb3JtYW5jZVRlc3Rlci5lbmQoUGVyZm9ybWFuY2VFdmVudHMuU0RLX0NMSV9DSEVDS19VUERBVEUpXG4gICAgICAgICAgICByZXR1cm4gZmluYWxCaW5hcnlQYXRoXG4gICAgICAgIH1cbiAgICAgICAgUGVyZm9ybWFuY2VUZXN0ZXIuZW5kKFBlcmZvcm1hbmNlRXZlbnRzLlNES19DTElfQ0hFQ0tfVVBEQVRFKVxuICAgICAgICByZXR1cm4gZXhpc3RpbmdDbGlQYXRoXG4gICAgfVxuXG4gICAgc3RhdGljIGdldENsaURpcigpIHtcbiAgICAgICAgY29uc3Qgd3JpdGFibGVEaXIgPSB0aGlzLmdldFdyaXRhYmxlRGlyKClcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmIChpc051bGxPckVtcHR5KHdyaXRhYmxlRGlyKSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignTm8gd3JpdGFibGUgZGlyZWN0b3J5IGF2YWlsYWJsZSBmb3IgdGhlIENMSScpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBjbGlEaXJQYXRoID0gcGF0aC5qb2luKHdyaXRhYmxlRGlyISwgJ2NsaScpXG4gICAgICAgICAgICBpZiAoIWZzLmV4aXN0c1N5bmMoY2xpRGlyUGF0aCkpIHtcbiAgICAgICAgICAgICAgICBjcmVhdGVEaXIoY2xpRGlyUGF0aClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBjbGlEaXJQYXRoXG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgbG9nZ2VyLmVycm9yKFxuICAgICAgICAgICAgICAgIGBFcnJvciBpbiBnZXR0aW5nIHdyaXRhYmxlIGRpcmVjdG9yeSwgd3JpdGFibGVEaXI9JHt1dGlsLmZvcm1hdChlcnIpfWAsXG4gICAgICAgICAgICApXG4gICAgICAgICAgICByZXR1cm4gJydcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHN0YXRpYyBnZXRXcml0YWJsZURpcigpIHtcbiAgICAgICAgY29uc3Qgd3JpdGFibGVEaXJPcHRpb25zID0gW1xuICAgICAgICAgICAgcHJvY2Vzcy5lbnYuQlJPV1NFUlNUQUNLX0ZJTEVTX0RJUixcbiAgICAgICAgICAgIHBhdGguam9pbihob21lZGlyKCksICcuYnJvd3NlcnN0YWNrJyksXG4gICAgICAgICAgICBwYXRoLmpvaW4oJ3RtcCcsICcuYnJvd3NlcnN0YWNrJyksXG4gICAgICAgIF1cblxuICAgICAgICBmb3IgKGNvbnN0IHBhdGggb2Ygd3JpdGFibGVEaXJPcHRpb25zKSB7XG4gICAgICAgICAgICBpZiAoaXNOdWxsT3JFbXB0eShwYXRoKSkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGlmIChmcy5leGlzdHNTeW5jKHBhdGghKSkge1xuICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoYEZpbGUgJHtwYXRofSBhbHJlYWR5IGV4aXN0YClcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFpc1dyaXRhYmxlKHBhdGghKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGBHaXZpbmcgd3JpdGUgcGVybWlzc2lvbiB0byAke3BhdGh9YClcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN1Y2Nlc3MgPSBzZXRSZWFkV3JpdGVBY2Nlc3MocGF0aCEpXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlzVHJ1ZShzdWNjZXNzKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgVW5hYmxlIHRvIHByb3ZpZGUgd3JpdGUgcGVybWlzc2lvbiB0byAke3BhdGh9YCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoYEZpbGUgZG9lcyBub3QgZXhpc3Q6ICR7cGF0aH1gKVxuICAgICAgICAgICAgICAgICAgICBjcmVhdGVEaXIocGF0aCEpXG4gICAgICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhgR2l2aW5nIHdyaXRlIHBlcm1pc3Npb24gdG8gJHtwYXRofWApXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHN1Y2Nlc3MgPSBzZXRSZWFkV3JpdGVBY2Nlc3MocGF0aCEpXG4gICAgICAgICAgICAgICAgICAgIGlmICghaXNUcnVlKHN1Y2Nlc3MpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIud2FybihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBgVW5hYmxlIHRvIHByb3ZpZGUgd3JpdGUgcGVybWlzc2lvbiB0byAke3BhdGh9YCxcbiAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gcGF0aFxuICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKFxuICAgICAgICAgICAgICAgICAgICBgVW5hYmxlIHRvIGdldCB3cml0YWJsZSBkaXJlY3RvcnksIGV4Y2VwdGlvbiAke3V0aWwuZm9ybWF0KGVycil9YCxcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGxcbiAgICB9XG5cbiAgICBzdGF0aWMgZ2V0RXhpc3RpbmdDbGlQYXRoKGNsaURpcjogc3RyaW5nKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgcGF0aCBleGlzdHMgYW5kIGlzIGEgZGlyZWN0b3J5XG4gICAgICAgICAgICBpZiAoIWZzLmV4aXN0c1N5bmMoY2xpRGlyKSB8fCAhZnMuc3RhdFN5bmMoY2xpRGlyKS5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICcnXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIExpc3QgYWxsIGZpbGVzIGluIHRoZSBkaXJlY3RvcnkgdGhhdCBzdGFydCB3aXRoIFwiYmluYXJ5LVwiXG4gICAgICAgICAgICBjb25zdCBhbGxCaW5hcmllcyA9IGZzXG4gICAgICAgICAgICAgICAgLnJlYWRkaXJTeW5jKGNsaURpcilcbiAgICAgICAgICAgICAgICAubWFwKChmaWxlOiBzdHJpbmcpID0+IHBhdGguam9pbihjbGlEaXIsIGZpbGUpKVxuICAgICAgICAgICAgICAgIC5maWx0ZXIoXG4gICAgICAgICAgICAgICAgICAgIChmaWxlUGF0aDogc3RyaW5nKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgZnMuc3RhdFN5bmMoZmlsZVBhdGgpLmlzRmlsZSgpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXRoLmJhc2VuYW1lKGZpbGVQYXRoKS5zdGFydHNXaXRoKCdiaW5hcnktJyksXG4gICAgICAgICAgICAgICAgKVxuXG4gICAgICAgICAgICBpZiAoYWxsQmluYXJpZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIC8vIEdldCB0aGUgbGF0ZXN0IGJpbmFyeSBieSBjb21wYXJpbmcgdGhlIGxhc3QgbW9kaWZpZWQgdGltZVxuICAgICAgICAgICAgICAgIGNvbnN0IGxhdGVzdEJpbmFyeSA9IGFsbEJpbmFyaWVzXG4gICAgICAgICAgICAgICAgICAgIC5tYXAoKGZpbGVQYXRoOiBzdHJpbmcpID0+ICh7XG4gICAgICAgICAgICAgICAgICAgICAgICBmaWxlUGF0aCxcbiAgICAgICAgICAgICAgICAgICAgICAgIG10aW1lOiBmcy5zdGF0U3luYyhmaWxlUGF0aCkubXRpbWUsXG4gICAgICAgICAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgICAgICAgICAucmVkdWNlKFxuICAgICAgICAgICAgICAgICAgICAgICAgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhdGVzdDogeyBmaWxlUGF0aDogc3RyaW5nOyBtdGltZTogRGF0ZSB9IHwgbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50OiB7IGZpbGVQYXRoOiBzdHJpbmc7IG10aW1lOiBEYXRlIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICApID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWxhdGVzdCB8fCAhbGF0ZXN0Lm10aW1lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjdXJyZW50XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnQubXRpbWUgPiBsYXRlc3QubXRpbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbGF0ZXN0XG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIHJldHVybiBsYXRlc3RCaW5hcnkgPyBsYXRlc3RCaW5hcnkuZmlsZVBhdGggOiAnJ1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gJycgLy8gTm8gYmluYXJ5IHByZXNlbnRcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICBsb2dnZXIuZXJyb3IoYEVycm9yIHdoaWxlIHJlYWRpbmcgQ0xJIHBhdGg6ICR7dXRpbC5mb3JtYXQoZXJyKX1gKVxuICAgICAgICAgICAgcmV0dXJuICcnXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzdGF0aWMgaXNCaW5hcnlCdXN5KGJpbmFyeVBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoaXNOdWxsT3JFbXB0eShiaW5hcnlQYXRoKSkge3JldHVybiBmYWxzZX1cbiAgICAgICAgaWYgKHBsYXRmb3JtKCkgPT09ICdkYXJ3aW4nKSB7cmV0dXJuIGZhbHNlfVxuICAgICAgICBpZiAoIWZzLmV4aXN0c1N5bmMoYmluYXJ5UGF0aCkpIHtyZXR1cm4gZmFsc2V9XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IGZkID0gZnMub3BlblN5bmMoYmluYXJ5UGF0aCwgJ3IrJylcbiAgICAgICAgICAgIGZzLmNsb3NlU3luYyhmZClcbiAgICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgICB9IGNhdGNoIChlcnI6IGFueSkge1xuICAgICAgICAgICAgaWYgKEJJTkFSWV9CVVNZX0VSUk9SX0NPREVTLmluY2x1ZGVzKGVyci5jb2RlKSkge1xuICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhgQmluYXJ5IGlzIGJ1c3k6ICR7YmluYXJ5UGF0aH1gKVxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsb2dnZXIuZGVidWcoYEVycm9yIGNoZWNraW5nIGlmIGJpbmFyeSBpcyBidXN5OiAke2Vyci5tZXNzYWdlfWApXG4gICAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHN0YXRpYyByZXF1ZXN0VG9VcGRhdGVDTEkgPSBhc3luYyAoXG4gICAgICAgIHF1ZXJ5UGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LFxuICAgICAgICBjb25maWc6IE9wdGlvbnMuVGVzdHJ1bm5lcixcbiAgICApID0+IHtcbiAgICAgICAgY29uc3QgcGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcyhxdWVyeVBhcmFtcylcbiAgICAgICAgY29uc3QgcmVxdWVzdEluaXQ6IFJlcXVlc3RJbml0ID0ge1xuICAgICAgICAgICAgbWV0aG9kOiAnR0VUJyxcbiAgICAgICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgICAgICBBdXRob3JpemF0aW9uOiBgQmFzaWMgJHtCdWZmZXIuZnJvbShgJHtnZXRCcm93c2VyU3RhY2tVc2VyKGNvbmZpZyl9OiR7Z2V0QnJvd3NlclN0YWNrS2V5KGNvbmZpZyl9YCkudG9TdHJpbmcoJ2Jhc2U2NCcpfWAsXG4gICAgICAgICAgICB9LFxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goXG4gICAgICAgICAgICBgJHtBUElVdGlscy5CUk9XU0VSU1RBQ0tfQVVUT01BVEVfQVBJX1VSTH0vJHtVUERBVEVEX0NMSV9FTkRQT0lOVH0/JHtwYXJhbXMudG9TdHJpbmcoKX1gLFxuICAgICAgICAgICAgcmVxdWVzdEluaXQsXG4gICAgICAgIClcbiAgICAgICAgY29uc3QganNvblJlc3BvbnNlID0gYXdhaXQgcmVzcG9uc2UuanNvbigpXG4gICAgICAgIGxvZ2dlci5kZWJ1ZyhgcmVzcG9uc2UgJHtKU09OLnN0cmluZ2lmeShqc29uUmVzcG9uc2UpfWApXG4gICAgICAgIHJldHVybiBqc29uUmVzcG9uc2VcbiAgICB9XG5cbiAgICBzdGF0aWMgcnVuU2hlbGxDb21tYW5kKFxuICAgICAgICBjbWRDb21tYW5kOiBzdHJpbmcsXG4gICAgICAgIHdvcmtpbmdEaXIgPSAnJyxcbiAgICApOiBQcm9taXNlPHN0cmluZz4ge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHByb2Nlc3MgPSBleGVjKFxuICAgICAgICAgICAgICAgIGNtZENvbW1hbmQsXG4gICAgICAgICAgICAgICAgeyBjd2Q6IHdvcmtpbmdEaXIsIHRpbWVvdXQ6IDUwMDAgfSxcbiAgICAgICAgICAgICAgICAoZXJyb3I6IEVycm9yLCBzdGRvdXQ6IHN0cmluZywgc3RkZXJyOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHN0ZGVyci50cmltKCkgfHwgJ1NIRUxMX0VYRUNVVEVfRVJST1InKVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShzdGRvdXQudHJpbSgpKVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIClcblxuICAgICAgICAgICAgLy8gRW5zdXJlIHRoZSBwcm9jZXNzIGlzIGtpbGxlZCBpZiBpdCBleGNlZWRzIHRoZSB0aW1lb3V0XG4gICAgICAgICAgICBwcm9jZXNzLm9uKCdlcnJvcicsICgpID0+IHtcbiAgICAgICAgICAgICAgICByZXNvbHZlKCdTSEVMTF9FWEVDVVRFX0VSUk9SJylcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH0pXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVmVyc2lvbiBlbmNvZGVkIGluIGEgYmluYXJ5IGRvd25sb2FkIFVSTCwgZS5nLlxuICAgICAqIGAuLi4vYmluYXJ5LW1hY29zLWFybTY0LTEuNDguMC56aXBgIC0+IGAxLjQ4LjBgLiBOdWxsIHdoZW4gdGhlIFVSTCBkb2VzXG4gICAgICogbm90IGNhcnJ5IG9uZSAoY3VzdG9tIEJST1dTRVJTVEFDS19CSU5BUllfVVJMKS5cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0VmVyc2lvbkZyb21CaW5hcnlVcmwoYmluRG93bmxvYWRVcmw6IHN0cmluZyk6IHN0cmluZyB8IG51bGwge1xuICAgICAgICByZXR1cm4gLy0oXFxkK1xcLlxcZCtcXC5cXGQrKVxcLnppcCg/OlxcP3wkKS8uZXhlYyhiaW5Eb3dubG9hZFVybCB8fCAnJyk/LlsxXSA/PyBudWxsXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogV2hldGhlciB0aGUgYmluYXJ5IG9uIGRpc2sgaXMgYWxyZWFkeSB0aGUgdmVyc2lvbiB3ZSB3ZXJlIGFza2VkIHRvIGZldGNoLlxuICAgICAqIEEgcGVlciB3b3JrZXIgd2lubmluZyB0aGUgZG93bmxvYWQgcmFjZSBsZWF2ZXMgdGhlICp0YXJnZXQqIHZlcnNpb24gaGVyZTtcbiAgICAgKiBhIG1lcmVseS1wcmUtZXhpc3RpbmcgYmluYXJ5IGlzIHN0YWxlLiBPbmx5IHRoZSBmb3JtZXIgbWF5IHNob3J0LWNpcmN1aXRcbiAgICAgKiB0aGUgZG93bmxvYWQgXHUyMDE0IHNlZSBgZG93bmxvYWRMYXRlc3RCaW5hcnlgLlxuICAgICAqL1xuICAgIHN0YXRpYyBhc3luYyBpc0JpbmFyeUF0VmVyc2lvbihcbiAgICAgICAgYmluYXJ5UGF0aDogc3RyaW5nLFxuICAgICAgICBleHBlY3RlZFZlcnNpb246IHN0cmluZyB8IG51bGwsXG4gICAgKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAgIGlmICghZXhwZWN0ZWRWZXJzaW9uKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgfVxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgYWN0dWFsID0gYXdhaXQgQ0xJVXRpbHMucnVuU2hlbGxDb21tYW5kKGAke2JpbmFyeVBhdGh9IHZlcnNpb25gKVxuICAgICAgICAgICAgcmV0dXJuIGFjdHVhbC50cmltKCkgPT09IGV4cGVjdGVkVmVyc2lvblxuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgc3RhdGljIGRvd25sb2FkTGF0ZXN0QmluYXJ5ID0gYXN5bmMgKFxuICAgICAgICBiaW5Eb3dubG9hZFVybDogc3RyaW5nLFxuICAgICAgICBjbGlEaXI6IHN0cmluZyxcbiAgICAgICAgZXhwZWN0ZWRWZXJzaW9uPzogc3RyaW5nIHwgbnVsbCxcbiAgICApOiBQcm9taXNlPHN0cmluZyB8IG51bGw+ID0+IHtcbiAgICAgICAgY29uc3QgbG9ja1BhdGggPSBwYXRoLmpvaW4oY2xpRGlyLCAnZG93bmxvYWQubG9jaycpXG4gICAgICAgIC8vIFByZWZlciB0aGUgdmVyc2lvbiB0aGUgc2VydmVyIHJlcG9ydGVkOyB0aGUgVVJMIGlzIG9ubHkgYSBmYWxsYmFjayBhbmRcbiAgICAgICAgLy8gY2FycmllcyBubyB2ZXJzaW9uIHdoZW4gQlJPV1NFUlNUQUNLX0JJTkFSWV9VUkwgb3ZlcnJpZGVzIGl0LlxuICAgICAgICBjb25zdCB0YXJnZXRWZXJzaW9uID1cbiAgICAgICAgICAgIGV4cGVjdGVkVmVyc2lvbiB8fCBDTElVdGlscy5nZXRWZXJzaW9uRnJvbUJpbmFyeVVybChiaW5Eb3dubG9hZFVybClcblxuICAgICAgICBjb25zdCBzbGVlcCA9IChtczogbnVtYmVyKSA9PiBuZXcgUHJvbWlzZSgocikgPT4gc2V0VGltZW91dChyLCBtcykpXG5cbiAgICAgICAgY29uc3QgcGFyc2VMb2NrRmlsZSA9ICgpID0+IHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhsb2NrUGF0aCwgJ3V0ZjgnKS50cmltKClcbiAgICAgICAgICAgICAgICBjb25zdCBbcGlkTGluZSwgdGltZXN0YW1wTGluZV0gPSBjb250ZW50LnNwbGl0KCdcXG4nKVxuICAgICAgICAgICAgICAgIGNvbnN0IHBpZCA9IE51bWJlci5wYXJzZUludChwaWRMaW5lLCAxMClcbiAgICAgICAgICAgICAgICBjb25zdCB0aW1lc3RhbXAgPSBOdW1iZXIucGFyc2VJbnQodGltZXN0YW1wTGluZSwgMTApXG4gICAgICAgICAgICAgICAgaWYgKCFOdW1iZXIuaXNGaW5pdGUocGlkKSB8fCAhTnVtYmVyLmlzRmluaXRlKHRpbWVzdGFtcCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgcGlkLCB0aW1lc3RhbXAgfVxuICAgICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGlzUHJvY2Vzc1J1bm5pbmcgPSAocGlkOiBudW1iZXIpID0+IHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgcHJvY2Vzcy5raWxsKHBpZCwgMClcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBhY3F1aXJlTG9jayA9IGFzeW5jIChcbiAgICAgICAgICAgIHRpbWVvdXRNcyA9IENMSV9MT0NLX1RJTUVPVVRfTVMsXG4gICAgICAgICAgICBwb2xsTXMgPSBDTElfTE9DS19QT0xMX01TLFxuICAgICAgICApOiBQcm9taXNlPCgoKSA9PiB2b2lkKSB8IHsgYWxyZWFkeUV4aXN0czogc3RyaW5nIH0+ID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gRGF0ZS5ub3coKVxuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnN0YW50LWNvbmRpdGlvbiAtLSBpbnRlbnRpb25hbCBwb2xsIGxvb3A7IGV4aXRzIHZpYSByZXR1cm4vdGhyb3cgYmVsb3dcbiAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZmQgPSBmcy5vcGVuU3luYyhsb2NrUGF0aCwgJ3d4JylcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZzLndyaXRlRmlsZVN5bmMoZmQsIGAke3Byb2Nlc3MucGlkfVxcbiR7RGF0ZS5ub3coKX1cXG5gKVxuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGludGVudGlvbmFsbHkgaWdub3JlIHdyaXRlIGVycm9yczsgdGhlIG9wZW4gZmQgc3RpbGwgaG9sZHNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBleGNsdXNpdmUgbG9jayBhbmQgd2lsbCBiZSBjbG9zZWQgaW4gY2xlYW51cFxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZzLmNsb3NlU3luYyhmZClcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZSBjbGVhbnVwIGVycm9yc1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcy51bmxpbmtTeW5jKGxvY2tQYXRoKVxuICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlIGNsZWFudXAgZXJyb3JzXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGVycm9yID0gZSBhcyB7IGNvZGU/OiBzdHJpbmcgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoZXJyb3IuY29kZSA9PT0gJ0VFWElTVCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxvY2tNZXRhID0gcGFyc2VMb2NrRmlsZSgpXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9ja01ldGEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsb2NrQWdlID0gRGF0ZS5ub3coKSAtIGxvY2tNZXRhLnRpbWVzdGFtcFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJ1bm5pbmcgPSBpc1Byb2Nlc3NSdW5uaW5nKGxvY2tNZXRhLnBpZClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXJ1bm5pbmcgfHwgbG9ja0FnZSA+IHRpbWVvdXRNcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIud2FybihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBTdGFsZSBDTEkgZG93bmxvYWQgbG9jayBkZXRlY3RlZCAocGlkPSR7bG9ja01ldGEucGlkfSwgYWdlPSR7bG9ja0FnZX1tcykuIFJlbW92aW5nIGxvY2suYCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnMudW5saW5rU3luYyhsb2NrUGF0aClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmUgY2xlYW51cCBlcnJvcnNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSB0YXJnZXQgYmluYXJ5IGFwcGVhcmVkIHdoaWxlIHdhaXRpbmdcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGV4aXN0aW5nQmluYXJ5ID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDTElVdGlscy5nZXRFeGlzdGluZ0NsaVBhdGgoY2xpRGlyKVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nQmluYXJ5ICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnMuZXhpc3RzU3luYyhleGlzdGluZ0JpbmFyeSkgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcy5zdGF0U3luYyhleGlzdGluZ0JpbmFyeSkuc2l6ZSA+IDAgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYXdhaXQgQ0xJVXRpbHMuaXNCaW5hcnlBdFZlcnNpb24oXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nQmluYXJ5LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRWZXJzaW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICkpXG4gICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBCaW5hcnkgdiR7dGFyZ2V0VmVyc2lvbn0gYXBwZWFyZWQgd2hpbGUgd2FpdGluZyBmb3IgbG9jazogJHtleGlzdGluZ0JpbmFyeX1gLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geyBhbHJlYWR5RXhpc3RzOiBleGlzdGluZ0JpbmFyeSB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoRGF0ZS5ub3coKSAtIHN0YXJ0ID4gdGltZW91dE1zKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgVGltZW91dCB3YWl0aW5nIGZvciBsb2NrOiAke2xvY2tQYXRofWAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgc2xlZXAocG9sbE1zKVxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY2xlYW51cFRlbXBvcmFyeURvd25sb2FkcyA9IChtYXhBZ2VNcyA9IENMSV9MT0NLX1RJTUVPVVRfTVMpID0+IHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKVxuICAgICAgICAgICAgICAgIC8vIE1hdGNoIGJvdGggZG93bmxvYWQgemlwcyAoZG93bmxvYWRlZF9maWxlXyouemlwKSBhbmQgb3JwaGFuIGV4dHJhY3RcbiAgICAgICAgICAgICAgICAvLyB0ZW1wIGZpbGVzICg8bmFtZT4udG1wLjxwaWQ+KSBsZWZ0IGJ5IGNyYXNoZWQgcGVlciB3b3JrZXJzLlxuICAgICAgICAgICAgICAgIGNvbnN0IHRtcEV4dHJhY3RSZSA9IC9cXC50bXBcXC5cXGQrJC9cbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGZzLnJlYWRkaXJTeW5jKGNsaURpcikpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaXNEb3dubG9hZFppcCA9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbnRyeS5zdGFydHNXaXRoKENMSV9ET1dOTE9BRF9UTVBfUFJFRklYKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgZW50cnkuZW5kc1dpdGgoQ0xJX0RPV05MT0FEX1RNUF9TVUZGSVgpXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGlzRXh0cmFjdFRtcCA9IHRtcEV4dHJhY3RSZS50ZXN0KGVudHJ5KVxuICAgICAgICAgICAgICAgICAgICBpZiAoIWlzRG93bmxvYWRaaXAgJiYgIWlzRXh0cmFjdFRtcCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGguam9pbihjbGlEaXIsIGVudHJ5KVxuICAgICAgICAgICAgICAgICAgICBsZXQgc3RhdHM6IGZzLlN0YXRzXG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdGF0cyA9IGZzLnN0YXRTeW5jKGZpbGVQYXRoKVxuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKG5vdyAtIHN0YXRzLm10aW1lTXMgPCBtYXhBZ2VNcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZnMudW5saW5rU3luYyhmaWxlUGF0aClcbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYEZhaWxlZCB0byBkZWxldGUgdGVtcCBDTEkgZmlsZSAke2ZpbGVQYXRofTogJHt1dGlsLmZvcm1hdChlcnIpfWAsXG4gICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoXG4gICAgICAgICAgICAgICAgICAgIGBGYWlsZWQgdG8gc2NhbiB0ZW1wIENMSSBmaWxlcyBpbiAke2NsaURpcn06ICR7dXRpbC5mb3JtYXQoZXJyKX1gLFxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIFBlcmZvcm1hbmNlVGVzdGVyLnN0YXJ0KFBlcmZvcm1hbmNlRXZlbnRzLlNES19DTElfRE9XTkxPQUQpXG4gICAgICAgIGxvZ2dlci5kZWJ1ZyhgRG93bmxvYWRpbmcgU0RLIGJpbmFyeSBmcm9tOiAke2JpbkRvd25sb2FkVXJsfWApXG5cbiAgICAgICAgbGV0IGRvd25sb2FkRW5kZWQgPSBmYWxzZVxuICAgICAgICBjb25zdCBlbmREb3dubG9hZCA9IChzdWNjZXNzID0gdHJ1ZSwgZXJyTXNnPzogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICBpZiAoZG93bmxvYWRFbmRlZCkge1xuICAgICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZG93bmxvYWRFbmRlZCA9IHRydWVcbiAgICAgICAgICAgIGlmIChzdWNjZXNzKSB7XG4gICAgICAgICAgICAgICAgUGVyZm9ybWFuY2VUZXN0ZXIuZW5kKFBlcmZvcm1hbmNlRXZlbnRzLlNES19DTElfRE9XTkxPQUQpXG4gICAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBQZXJmb3JtYW5jZVRlc3Rlci5lbmQoXG4gICAgICAgICAgICAgICAgUGVyZm9ybWFuY2VFdmVudHMuU0RLX0NMSV9ET1dOTE9BRCxcbiAgICAgICAgICAgICAgICBmYWxzZSxcbiAgICAgICAgICAgICAgICBlcnJNc2csXG4gICAgICAgICAgICApXG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcmVsZWFzZUxvY2s6ICgoKSA9PiB2b2lkKSB8IHVuZGVmaW5lZFxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgbG9ja1Jlc3VsdCA9IGF3YWl0IGFjcXVpcmVMb2NrKClcblxuICAgICAgICAgICAgLy8gQ2hlY2sgaWYgYmluYXJ5IGFscmVhZHkgZXhpc3RzIChhbm90aGVyIHByb2Nlc3MgZG93bmxvYWRlZCBpdClcbiAgICAgICAgICAgIGlmICh0eXBlb2YgbG9ja1Jlc3VsdCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgIGVuZERvd25sb2FkKClcbiAgICAgICAgICAgICAgICByZXR1cm4gbG9ja1Jlc3VsdC5hbHJlYWR5RXhpc3RzXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJlbGVhc2VMb2NrID0gbG9ja1Jlc3VsdFxuXG4gICAgICAgICAgICAvLyBSZS1jaGVjayBhZnRlciBhY3F1aXJpbmcgbG9jay4gT25seSBhIGJpbmFyeSBhbHJlYWR5IGF0IHRoZSB0YXJnZXRcbiAgICAgICAgICAgIC8vIHZlcnNpb24gbWVhbnMgYSBwZWVyIHdvbiB0aGUgcmFjZTsgYW55IG90aGVyIGJpbmFyeSBoZXJlIGlzIHRoZVxuICAgICAgICAgICAgLy8gc3RhbGUgb25lIHdlIHdlcmUgc2VudCB0byByZXBsYWNlLCBzbyBpdCBtdXN0IG5vdCBzaG9ydC1jaXJjdWl0XG4gICAgICAgICAgICAvLyB0aGUgZG93bmxvYWQuXG4gICAgICAgICAgICBjb25zdCBleGlzdGluZ0JpbmFyeSA9IENMSVV0aWxzLmdldEV4aXN0aW5nQ2xpUGF0aChjbGlEaXIpXG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgZXhpc3RpbmdCaW5hcnkgJiZcbiAgICAgICAgICAgICAgICBmcy5leGlzdHNTeW5jKGV4aXN0aW5nQmluYXJ5KSAmJlxuICAgICAgICAgICAgICAgIGZzLnN0YXRTeW5jKGV4aXN0aW5nQmluYXJ5KS5zaXplID4gMCAmJlxuICAgICAgICAgICAgICAgIChhd2FpdCBDTElVdGlscy5pc0JpbmFyeUF0VmVyc2lvbihleGlzdGluZ0JpbmFyeSwgdGFyZ2V0VmVyc2lvbikpXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoXG4gICAgICAgICAgICAgICAgICAgIGBCaW5hcnkgYWxyZWFkeSBhdCB2JHt0YXJnZXRWZXJzaW9ufSBhZnRlciBhY3F1aXJpbmcgbG9jazogJHtleGlzdGluZ0JpbmFyeX1gLFxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICBlbmREb3dubG9hZCgpXG4gICAgICAgICAgICAgICAgcmVsZWFzZUxvY2soKVxuICAgICAgICAgICAgICAgIHJldHVybiBleGlzdGluZ0JpbmFyeVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjbGVhbnVwVGVtcG9yYXJ5RG93bmxvYWRzKClcblxuICAgICAgICAgICAgY29uc3QgemlwRmlsZVBhdGggPSBwYXRoLmpvaW4oXG4gICAgICAgICAgICAgICAgY2xpRGlyLFxuICAgICAgICAgICAgICAgIGAke0NMSV9ET1dOTE9BRF9UTVBfUFJFRklYfSR7cHJvY2Vzcy5waWR9XyR7RGF0ZS5ub3coKX0ke0NMSV9ET1dOTE9BRF9UTVBfU1VGRklYfWAsXG4gICAgICAgICAgICApXG4gICAgICAgICAgICBjb25zdCBkb3dubG9hZGVkRmlsZVN0cmVhbSA9IGZzLmNyZWF0ZVdyaXRlU3RyZWFtKHppcEZpbGVQYXRoKVxuXG4gICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2U8c3RyaW5nIHwgbnVsbD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgICAgIC8vIFJlZ2lzdGVyZWQgYmVmb3JlIHRoZSBmaXJzdCBhd2FpdDogY3JlYXRlV3JpdGVTdHJlYW0gb3BlbnNcbiAgICAgICAgICAgICAgICAvLyBhc3luY2hyb25vdXNseSwgc28gYW4gZXJyb3IgY2FuIGxhbmQgYmVmb3JlIHByb2Nlc3NEb3dubG9hZFxuICAgICAgICAgICAgICAgIC8vIGdldHMgZmFyIGVub3VnaCB0byBhdHRhY2ggaXRzIG93biBoYW5kbGVyIFx1MjAxNCB3aXRoIG5vIGxpc3RlbmVyXG4gICAgICAgICAgICAgICAgLy8gdGhhdCBiZWNvbWVzIGFuIHVuY2F1Z2h0IGV4Y2VwdGlvbiBpbiB0aGUgdXNlcidzIHRlc3QgcHJvY2Vzcy5cbiAgICAgICAgICAgICAgICBkb3dubG9hZGVkRmlsZVN0cmVhbS5vbignZXJyb3InLCBmdW5jdGlvbiAoZXJyOiBFcnJvcikge1xuICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICBgR290IEVycm9yIHdoaWxlIGRvd25sb2FkaW5nIGNsaSBiaW5hcnkgZmlsZTogJHtlcnJ9YCxcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICBlbmREb3dubG9hZChmYWxzZSwgdXRpbC5mb3JtYXQoZXJyKSlcbiAgICAgICAgICAgICAgICAgICAgcmVsZWFzZUxvY2s/LigpXG4gICAgICAgICAgICAgICAgICAgIHJlamVjdChlcnIpXG4gICAgICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgICAgIGNvbnN0IHByb2Nlc3NEb3dubG9hZCA9IGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYWJvcnRDb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRpbWVvdXQgPSBzZXRUaW1lb3V0KFxuICAgICAgICAgICAgICAgICAgICAgICAgKCkgPT4gYWJvcnRDb250cm9sbGVyLmFib3J0KCksXG4gICAgICAgICAgICAgICAgICAgICAgICBDTElfRE9XTkxPQURfVElNRU9VVF9NUyxcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICBsZXQgcmVzcG9uc2U6IFJlc3BvbnNlXG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZSA9IGF3YWl0IGZldGNoKGJpbkRvd25sb2FkVXJsLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lnbmFsOiBhYm9ydENvbnRyb2xsZXIuc2lnbmFsLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0KVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmICghcmVzcG9uc2UuYm9keSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyByZXNwb25zZSBib2R5IHJlY2VpdmVkJylcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhcnJheUJ1ZmZlciA9IGF3YWl0IHJlc3BvbnNlLmFycmF5QnVmZmVyKClcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5vZGVTdHJlYW0gPSBSZWFkYWJsZS5mcm9tKFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgVWludDhBcnJheShhcnJheUJ1ZmZlciksXG4gICAgICAgICAgICAgICAgICAgICAgICBdKVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBub2RlU3RyZWFtLnBpcGUoZG93bmxvYWRlZEZpbGVTdHJlYW0pXG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNldCB1cCB0aGUgZG93bmxvYWRGaWxlU3RyZWFtIGhhbmRsZXIgYmVmb3JlIHBpcGVsaW5lXG4gICAgICAgICAgICAgICAgICAgICAgICBDTElVdGlscy5kb3dubG9hZEZpbGVTdHJlYW0oXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZG93bmxvYWRlZEZpbGVTdHJlYW0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgemlwRmlsZVBhdGgsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpRGlyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChyZXN1bHQ6IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmREb3dubG9hZCgpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbGVhc2VMb2NrPy4oKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHJlc3VsdClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChlcnI/OiBFcnJvcikgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmREb3dubG9hZChmYWxzZSwgdXRpbC5mb3JtYXQoZXJyKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsZWFzZUxvY2s/LigpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChlcnIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYEdvdCBFcnJvciBpbiBjbGkgYmluYXJ5IGRvd25sb2FkaW5nIHJlcXVlc3QgJHt1dGlsLmZvcm1hdChlcnIpfWAsXG4gICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICBlbmREb3dubG9hZChmYWxzZSwgdXRpbC5mb3JtYXQoZXJyKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlbGVhc2VMb2NrPy4oKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGVyciBhcyBFcnJvcilcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIEEgcmVqZWN0aW9uIGJlZm9yZSB0aGUgc3RyZWFtIGhhbmRsZXJzIGFyZSB3aXJlZCAoZS5nLiBmZXRjaFxuICAgICAgICAgICAgICAgIC8vIGl0c2VsZiBmYWlsaW5nKSB3b3VsZCBvdGhlcndpc2UgbGVhdmUgdGhpcyBwcm9taXNlIHBlbmRpbmdcbiAgICAgICAgICAgICAgICAvLyBmb3JldmVyIGFuZCBoYW5nIHRoZSBsYXVuY2hlci5cbiAgICAgICAgICAgICAgICBwcm9jZXNzRG93bmxvYWQoKS5jYXRjaCgoZXJyOiBFcnJvcikgPT4ge1xuICAgICAgICAgICAgICAgICAgICAvLyBOb3RoaW5nIGlzIHBpcGVkIGludG8gdGhlIHN0cmVhbSBvbiB0aGlzIHBhdGgsIHNvIGNsb3NlIGl0XG4gICAgICAgICAgICAgICAgICAgIC8vIGV4cGxpY2l0bHkgXHUyMDE0IG90aGVyd2lzZSB0aGUgZmQgYW5kIHRoZSB0ZW1wIHppcCBib3RoIGxlYWsuXG4gICAgICAgICAgICAgICAgICAgIGRvd25sb2FkZWRGaWxlU3RyZWFtLmRlc3Ryb3koKVxuICAgICAgICAgICAgICAgICAgICBlbmREb3dubG9hZChmYWxzZSwgdXRpbC5mb3JtYXQoZXJyKSlcbiAgICAgICAgICAgICAgICAgICAgcmVsZWFzZUxvY2s/LigpXG4gICAgICAgICAgICAgICAgICAgIHJlamVjdChlcnIpXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgcmVsZWFzZUxvY2s/LigpXG4gICAgICAgICAgICBlbmREb3dubG9hZChmYWxzZSwgdXRpbC5mb3JtYXQoZXJyKSlcbiAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgICAgICAgICBgRmFpbGVkIHRvIGRvd25sb2FkIGJpbmFyeSwgRXhjZXB0aW9uOiAke3V0aWwuZm9ybWF0KGVycil9YCxcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIHJldHVybiBudWxsXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzdGF0aWMgZG93bmxvYWRGaWxlU3RyZWFtKFxuICAgICAgICBkb3dubG9hZGVkRmlsZVN0cmVhbTogZnMuV3JpdGVTdHJlYW0sXG4gICAgICAgIHppcEZpbGVQYXRoOiBzdHJpbmcsXG4gICAgICAgIGNsaURpcjogc3RyaW5nLFxuICAgICAgICByZXNvbHZlOiAocGF0aDogc3RyaW5nKSA9PiB2b2lkLFxuICAgICAgICByZWplY3Q6IChyZWFzb24/OiBFcnJvcikgPT4gdm9pZCxcbiAgICApIHtcbiAgICAgICAgZG93bmxvYWRlZEZpbGVTdHJlYW0ub24oJ2Nsb3NlJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgY29uc3QgeWF1emxPcGVuUHJvbWlzZSA9IHByb21pc2lmeSh5YXV6bC5vcGVuKSBhcyAoXG4gICAgICAgICAgICAgICAgcGF0aDogc3RyaW5nLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IHlhdXpsT3B0aW9ucyxcbiAgICAgICAgICAgICkgPT4gUHJvbWlzZTxaaXBGaWxlPlxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBjb25zdCB6aXBmaWxlID0gYXdhaXQgeWF1emxPcGVuUHJvbWlzZSh6aXBGaWxlUGF0aCwge1xuICAgICAgICAgICAgICAgICAgICBsYXp5RW50cmllczogdHJ1ZSxcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIGxldCByZXNvbHZlZEJpbmFyeVBhdGg6IHN0cmluZyB8IG51bGwgPSBudWxsXG5cbiAgICAgICAgICAgICAgICB6aXBmaWxlLnJlYWRFbnRyeSgpXG4gICAgICAgICAgICAgICAgemlwZmlsZS5vbignZW50cnknLCBhc3luYyAoZW50cnkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKC9cXC8kLy50ZXN0KGVudHJ5LmZpbGVOYW1lKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgemlwZmlsZS5yZWFkRW50cnkoKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAvLyBaaXAtc2xpcCBndWFyZDogcmVqZWN0IGVudHJpZXMgd2hvc2UgcmVzb2x2ZWQgcGF0aCBlc2NhcGVzIGNsaURpclxuICAgICAgICAgICAgICAgICAgICAvLyAoQlJPV1NFUlNUQUNLX0JJTkFSWV9VUkwgbGV0cyB1c2VycyBzdXBwbHkgYXJiaXRyYXJ5IHppcHMpLlxuICAgICAgICAgICAgICAgICAgICBjb25zdCBjYW5kaWRhdGVQYXRoID0gcGF0aC5qb2luKGNsaURpciwgZW50cnkuZmlsZU5hbWUpXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc29sdmVkQ2FuZGlkYXRlID0gcGF0aC5yZXNvbHZlKGNhbmRpZGF0ZVBhdGgpXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc29sdmVkRGlyID0gcGF0aC5yZXNvbHZlKGNsaURpcikgKyBwYXRoLnNlcFxuICAgICAgICAgICAgICAgICAgICBpZiAoIXJlc29sdmVkQ2FuZGlkYXRlLnN0YXJ0c1dpdGgocmVzb2x2ZWREaXIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB6aXBmaWxlLmNsb3NlKClcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoYFppcC1zbGlwIGRldGVjdGVkOiBlbnRyeSBcIiR7ZW50cnkuZmlsZU5hbWV9XCIgcmVzb2x2ZXMgb3V0c2lkZSAke2NsaURpcn1gKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaXNCaW5hcnlFbnRyeSA9IHBhdGguYmFzZW5hbWUoZW50cnkuZmlsZU5hbWUpLnN0YXJ0c1dpdGgoJ2JpbmFyeS0nKVxuXG4gICAgICAgICAgICAgICAgICAgIGlmICghaXNCaW5hcnlFbnRyeSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZGlyZWN0U3RyZWFtID0gZnMuY3JlYXRlV3JpdGVTdHJlYW0oY2FuZGlkYXRlUGF0aClcbiAgICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdFN0cmVhbS5vbignZXJyb3InLCAod3JpdGVFcnIpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB6aXBmaWxlLmNsb3NlKClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWplY3Qod3JpdGVFcnIgYXMgRXJyb3IpXG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgb3BlblJlYWRTdHJlYW1Qcm9taXNlID0gcHJvbWlzaWZ5KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHppcGZpbGUub3BlblJlYWRTdHJlYW0sXG4gICAgICAgICAgICAgICAgICAgICAgICApLmJpbmQoemlwZmlsZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVhZFN0cmVhbSA9IGF3YWl0IG9wZW5SZWFkU3RyZWFtUHJvbWlzZShlbnRyeSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkU3RyZWFtLm9uKCdlbmQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdFN0cmVhbS5lbmQoKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3RTdHJlYW0ub24oJ2Nsb3NlJywgKCkgPT4gemlwZmlsZS5yZWFkRW50cnkoKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRTdHJlYW0ucGlwZShkaXJlY3RTdHJlYW0pXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoICh6aXBFcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB6aXBmaWxlLmNsb3NlKClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWplY3QoemlwRXJyIGFzIEVycm9yKVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAvLyBCaW5hcnkgZW50cnk6IGV4dHJhY3QgdG8gUElELXNjb3BlZCB0ZW1wIGZpbGUsIGNobW9kLCBhdG9taWMgcmVuYW1lIGlubGluZS5cbiAgICAgICAgICAgICAgICAgICAgLy8gUHJldmVudHMgRVRYVEJTWS9FQlVTWTogdGhlIGZpbGUgYmVpbmcgZXhlY3V0ZWQgaXMgbmV2ZXIgdGhlIGZpbGUgYmVpbmcgd3JpdHRlbi5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZmluYWxQYXRoID0gY2FuZGlkYXRlUGF0aFxuICAgICAgICAgICAgICAgICAgICBjb25zdCB0ZW1wUGF0aCA9IHBhdGguam9pbihjbGlEaXIsIGAke2VudHJ5LmZpbGVOYW1lfS50bXAuJHtwcm9jZXNzLnBpZH1gKVxuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHdyaXRlU3RyZWFtID0gZnMuY3JlYXRlV3JpdGVTdHJlYW0odGVtcFBhdGgpXG5cbiAgICAgICAgICAgICAgICAgICAgbGV0IHdyaXRlU3RyZWFtRXJyb3JlZCA9IGZhbHNlXG4gICAgICAgICAgICAgICAgICAgIHdyaXRlU3RyZWFtLm9uKCdlcnJvcicsICh3cml0ZUVycikgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVTdHJlYW1FcnJvcmVkID0gdHJ1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgZnNwLnVubGluayh0ZW1wUGF0aCkuY2F0Y2goKCkgPT4ge30pXG4gICAgICAgICAgICAgICAgICAgICAgICB6aXBmaWxlLmNsb3NlKClcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdCh3cml0ZUVyciBhcyBFcnJvcilcbiAgICAgICAgICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgICAgICAgICAvLyAnY2xvc2UnIGZpcmVzIGFmdGVyIHRoZSBmZCBpcyBjbG9zZWQ7IHNhZmUgZm9yIGZzcC5yZW5hbWUgb24gV2luZG93cyAod2hlcmUgJ2ZpbmlzaCcgbWF5IGZpcmUgYmVmb3JlIGZkIHJlbGVhc2UpLlxuICAgICAgICAgICAgICAgICAgICAvLyBhdXRvQ2xvc2U9dHJ1ZSBhbHNvIG1ha2VzICdjbG9zZScgZmlyZSBhZnRlciAnZXJyb3InIFx1MjAxNCBiYWlsIG91dCBpZiB0aGUgZXJyb3IgcGF0aCBhbHJlYWR5IHJlamVjdGVkLlxuICAgICAgICAgICAgICAgICAgICB3cml0ZVN0cmVhbS5vbignY2xvc2UnLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAod3JpdGVTdHJlYW1FcnJvcmVkKSB7IHJldHVybiB9XG4gICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGZzcC5jaG1vZCh0ZW1wUGF0aCwgJzA3NTUnKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGZzcC5yZW5hbWUodGVtcFBhdGgsIGZpbmFsUGF0aClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHJlbmFtZUVycjogYW55KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5hcnJvdyBmYWxsYmFjayB0byBjcm9zcy1kZXZpY2UgKEVYREVWKSBvbmx5XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZW5hbWVFcnIuY29kZSAhPT0gJ0VYREVWJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgcmVuYW1lRXJyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLndhcm4oYEF0b21pYyByZW5hbWUgZmFpbGVkIChjcm9zcy1kZXZpY2UpLCBmYWxsaW5nIGJhY2sgdG8gY29weTogJHtyZW5hbWVFcnIubWVzc2FnZX1gKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBmc3AuY29weUZpbGUodGVtcFBhdGgsIGZpbmFsUGF0aClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgZnNwLnVubGluayh0ZW1wUGF0aCkuY2F0Y2goKCkgPT4ge30pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcmVzb2x2ZWRCaW5hcnlQYXRoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmVkQmluYXJ5UGF0aCA9IGZpbmFsUGF0aFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB6aXBmaWxlLnJlYWRFbnRyeSgpXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBmc3AudW5saW5rKHRlbXBQYXRoKS5jYXRjaCgoKSA9PiB7fSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB6aXBmaWxlLmNsb3NlKClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWplY3QoZXJyIGFzIEVycm9yKVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG9wZW5SZWFkU3RyZWFtUHJvbWlzZSA9IHByb21pc2lmeShcbiAgICAgICAgICAgICAgICAgICAgICAgIHppcGZpbGUub3BlblJlYWRTdHJlYW0sXG4gICAgICAgICAgICAgICAgICAgICkuYmluZCh6aXBmaWxlKVxuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVhZFN0cmVhbSA9IGF3YWl0IG9wZW5SZWFkU3RyZWFtUHJvbWlzZShlbnRyeSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRTdHJlYW0ub24oJ2VuZCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZVN0cmVhbS5lbmQoKVxuICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRTdHJlYW0ucGlwZSh3cml0ZVN0cmVhbSlcbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoemlwRXJyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmc3AudW5saW5rKHRlbXBQYXRoKS5jYXRjaCgoKSA9PiB7fSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHppcGZpbGUuY2xvc2UoKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KHppcEVyciBhcyBFcnJvcilcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgICAgICB6aXBmaWxlLm9uKCdlcnJvcicsICh6aXBFcnIpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KHppcEVyciBhcyBFcnJvcilcbiAgICAgICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICAgICAgemlwZmlsZS5vbmNlKCdlbmQnLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGZzcC51bmxpbmsoemlwRmlsZVBhdGgpLmNhdGNoKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuKGBGYWlsZWQgdG8gZGVsZXRlIHppcCBmaWxlOiAke3ppcEZpbGVQYXRofWApXG4gICAgICAgICAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFyZXNvbHZlZEJpbmFyeVBhdGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHppcGZpbGUuY2xvc2UoKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcignTm8gYmluYXJ5LSogZW50cnkgZm91bmQgaW4gemlwOyBjYW5ub3QgY29tcGxldGUgQ0xJIGJpbmFyeSBleHRyYWN0aW9uJykpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB6aXBmaWxlLmNsb3NlKClcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShyZXNvbHZlZEJpbmFyeVBhdGgpXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgIHJlamVjdChlcnIgYXMgRXJyb3IpXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgfVxuXG4gICAgc3RhdGljIGdldFRlc3RGcmFtZXdvcmtEZXRhaWwoKSB7XG4gICAgICAgIGlmIChwcm9jZXNzLmVudi5CUk9XU0VSU1RBQ0tfVEVTVF9GUkFNRVdPUktfREVUQUlMKSB7XG4gICAgICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShwcm9jZXNzLmVudi5CUk9XU0VSU1RBQ0tfVEVTVF9GUkFNRVdPUktfREVUQUlMKVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLnRlc3RGcmFtZXdvcmtEZXRhaWxcbiAgICB9XG5cbiAgICBzdGF0aWMgZ2V0QXV0b21hdGlvbkZyYW1ld29ya0RldGFpbCgpIHtcbiAgICAgICAgaWYgKHByb2Nlc3MuZW52LkJST1dTRVJTVEFDS19BVVRPTUFUSU9OX0ZSQU1FV09SS19ERVRBSUwpIHtcbiAgICAgICAgICAgIHJldHVybiBKU09OLnBhcnNlKFxuICAgICAgICAgICAgICAgIHByb2Nlc3MuZW52LkJST1dTRVJTVEFDS19BVVRPTUFUSU9OX0ZSQU1FV09SS19ERVRBSUwsXG4gICAgICAgICAgICApXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuYXV0b21hdGlvbkZyYW1ld29ya0RldGFpbFxuICAgIH1cblxuICAgIHN0YXRpYyBzZXRGcmFtZXdvcmtEZXRhaWwoXG4gICAgICAgIHRlc3RGcmFtZXdvcms6IHN0cmluZyxcbiAgICAgICAgYXV0b21hdGlvbkZyYW1ld29yazogc3RyaW5nLFxuICAgICkge1xuICAgICAgICBpZiAoIXRlc3RGcmFtZXdvcmsgfHwgIWF1dG9tYXRpb25GcmFtZXdvcmspIHtcbiAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgICAgICAgICBgVGVzdCBvciBBdXRvbWF0aW9uIGZyYW1ld29yayBub3QgcHJvdmlkZWQgdGVzdEZyYW1ld29yaz0ke3Rlc3RGcmFtZXdvcmt9LCBhdXRvbWF0aW9uRnJhbWV3b3JrPSR7YXV0b21hdGlvbkZyYW1ld29ya31gLFxuICAgICAgICAgICAgKVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy50ZXN0RnJhbWV3b3JrRGV0YWlsID0ge1xuICAgICAgICAgICAgbmFtZTogdGVzdEZyYW1ld29yayxcbiAgICAgICAgICAgIHZlcnNpb246IHsgW3Rlc3RGcmFtZXdvcmtdOiBDTElVdGlscy5nZXRTZGtWZXJzaW9uKCkgfSxcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuYXV0b21hdGlvbkZyYW1ld29ya0RldGFpbCA9IHtcbiAgICAgICAgICAgIG5hbWU6IGF1dG9tYXRpb25GcmFtZXdvcmssXG4gICAgICAgICAgICB2ZXJzaW9uOiB7IFthdXRvbWF0aW9uRnJhbWV3b3JrXTogQ0xJVXRpbHMuZ2V0U2RrVmVyc2lvbigpIH0sXG4gICAgICAgIH1cblxuICAgICAgICBwcm9jZXNzLmVudi5CUk9XU0VSU1RBQ0tfQVVUT01BVElPTl9GUkFNRVdPUktfREVUQUlMID0gSlNPTi5zdHJpbmdpZnkoXG4gICAgICAgICAgICB0aGlzLmF1dG9tYXRpb25GcmFtZXdvcmtEZXRhaWwsXG4gICAgICAgIClcbiAgICAgICAgcHJvY2Vzcy5lbnYuQlJPV1NFUlNUQUNLX1RFU1RfRlJBTUVXT1JLX0RFVEFJTCA9IEpTT04uc3RyaW5naWZ5KFxuICAgICAgICAgICAgdGhpcy50ZXN0RnJhbWV3b3JrRGV0YWlsLFxuICAgICAgICApXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBjdXJyZW50IGluc3RhbmNlIG5hbWUgdXNpbmcgdGhyZWFkIGlkIGFuZCBwcm9jZXNzSWRcbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXRDdXJyZW50SW5zdGFuY2VOYW1lKCkge1xuICAgICAgICByZXR1cm4gYCR7cHJvY2Vzcy5waWR9OiR7dGhyZWFkSWR9YFxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdlbmVyYXRlIGEgdW5pcXVlIGNsaWVudCB3b3JrZXIgaWRlbnRpZmllciBjb21iaW5pbmcgdGhyZWFkIElEIGFuZCBwcm9jZXNzIElELlxuICAgICAqIFRoaXMgaWRlbnRpZmllciBpcyB1c2VkIHRvIHRyYWNrIHdvcmtlci1zcGVjaWZpYyBldmVudHMgYW5kIHBlcmZvcm1hbmNlIG1ldHJpY3NcbiAgICAgKiBhY3Jvc3MgZGlzdHJpYnV0ZWQgdGVzdCBleGVjdXRpb24uIEZvcm1hdCBtYXRjaGVzIHRoZSBQeXRob24gU0RLIGltcGxlbWVudGF0aW9uXG4gICAgICogZm9yIGNvbnNpc3RlbmN5IGFjcm9zcyBTREtzLlxuICAgICAqXG4gICAgICogRm9ybWF0OiBcInRocmVhZElkLXByb2Nlc3NJZFwiXG4gICAgICpcbiAgICAgKiBAcGFyYW0gY29udGV4dCAtIE9wdGlvbmFsIGV4ZWN1dGlvbiBjb250ZXh0IHdpdGggdGhyZWFkSWQgYW5kIHByb2Nlc3NJZFxuICAgICAqIEByZXR1cm5zIFdvcmtlciBJRCBzdHJpbmcgaW4gZm9ybWF0IFwidGhyZWFkSWQtcHJvY2Vzc0lkXCJcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGNvbnN0IHdvcmtlcklkID0gQ0xJVXRpbHMuZ2V0Q2xpZW50V29ya2VySWQoKSAvLyBSZXR1cm5zIFwiMS0xMjM0NVwiXG4gICAgICogY29uc3Qgd29ya2VySWQgPSBDTElVdGlscy5nZXRDbGllbnRXb3JrZXJJZCh7IHRocmVhZElkOiAxMjMsIHByb2Nlc3NJZDogNDU2IH0pIC8vIFJldHVybnMgXCIxMjMtNDU2XCJcbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0Q2xpZW50V29ya2VySWQoY29udGV4dD86IHsgdGhyZWFkSWQ/OiBzdHJpbmcgfCBudW1iZXI7IHByb2Nlc3NJZD86IHN0cmluZyB8IG51bWJlciB9KTogc3RyaW5nIHtcbiAgICAgICAgY29uc3Qgd29ya2VyVGhyZWFkSWQgPSBjb250ZXh0Py50aHJlYWRJZD8udG9TdHJpbmcoKSB8fCB0aHJlYWRJZC50b1N0cmluZygpXG4gICAgICAgIGNvbnN0IHdvcmtlclByb2Nlc3NJZCA9IGNvbnRleHQ/LnByb2Nlc3NJZD8udG9TdHJpbmcoKSB8fCBwcm9jZXNzLnBpZC50b1N0cmluZygpXG4gICAgICAgIHJldHVybiBgJHt3b3JrZXJUaHJlYWRJZH0tJHt3b3JrZXJQcm9jZXNzSWR9YFxuICAgIH1cblxuICAgIC8qKlxuICAgICAqXG4gICAgICogQHBhcmFtIHtUZXN0RnJhbWV3b3JrU3RhdGUgfCBBdXRvbWF0aW9uRnJhbWV3b3JrU3RhdGV9IGZyYW1ld29ya1N0YXRlXG4gICAgICogQHBhcmFtIHtIb29rU3RhdGV9IGhvb2tTdGF0ZVxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAgICovXG4gICAgc3RhdGljIGdldEhvb2tSZWdpc3RyeUtleShmcmFtZXdvcmtTdGF0ZTogU3RhdGUsIGhvb2tTdGF0ZTogU3RhdGUpIHtcbiAgICAgICAgcmV0dXJuIGAke2ZyYW1ld29ya1N0YXRlfToke2hvb2tTdGF0ZX1gXG4gICAgfVxuXG4gICAgc3RhdGljIG1hdGNoSG9va1JlZ2V4KGhvb2tTdGF0ZTogc3RyaW5nKSB7XG4gICAgICAgIGNvbnN0IHBhdHRlcm4gPSBuZXcgUmVnRXhwKFRlc3RGcmFtZXdvcmtDb25zdGFudHMuSE9PS19SRUdFWClcblxuICAgICAgICByZXR1cm4gcGF0dGVybi50ZXN0KGhvb2tTdGF0ZSlcbiAgICB9XG5cbiAgICBzdGF0aWMgZ2V0T2JzZXJ2YWJpbGl0eUJ1aWxkVGFncyhcbiAgICAgICAgb2JzZXJ2YWJpbGl0eU9wdGlvbnM6IFRlc3RPYnNlcnZhYmlsaXR5T3B0aW9ucyxcbiAgICAgICAgYnN0YWNrQnVpbGRUYWc/OiBzdHJpbmcsXG4gICAgKSB7XG4gICAgICAgIGlmIChwcm9jZXNzLmVudi5URVNUX09CU0VSVkFCSUxJVFlfQlVJTERfVEFHKSB7XG4gICAgICAgICAgICByZXR1cm4gcHJvY2Vzcy5lbnYuVEVTVF9PQlNFUlZBQklMSVRZX0JVSUxEX1RBRy5zcGxpdCgnLCcpXG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9ic2VydmFiaWxpdHlPcHRpb25zLmJ1aWxkVGFnKSB7XG4gICAgICAgICAgICByZXR1cm4gb2JzZXJ2YWJpbGl0eU9wdGlvbnMuYnVpbGRUYWdcbiAgICAgICAgfVxuICAgICAgICBpZiAoYnN0YWNrQnVpbGRUYWcpIHtcbiAgICAgICAgICAgIHJldHVybiBbYnN0YWNrQnVpbGRUYWddXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFtdXG4gICAgfVxuXG4gICAgc3RhdGljIGNoZWNrQ0xJU3VwcG9ydGVkRnJhbWV3b3JrcyhmcmFtZXdvcms6IHN0cmluZyB8IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAoZnJhbWV3b3JrID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLkNMSVN1cHBvcnRlZEZyYW1ld29ya3MuaW5jbHVkZXMoZnJhbWV3b3JrKVxuICAgIH1cbn1cbiIsICJpbXBvcnQgeyBmZXRjaCBhcyB1bmRpY2lGZXRjaCwgdHlwZSBSZXF1ZXN0SW5pdCBhcyBVbmRpY2lSZXF1ZXN0SW5pdCwgUHJveHlBZ2VudCB9IGZyb20gJ3VuZGljaSdcblxuZXhwb3J0IGNsYXNzIFJlc3BvbnNlRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gICAgcHVibGljIHJlc3BvbnNlOiBSZXNwb25zZVxuICAgIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZywgcmVzOiBSZXNwb25zZSkge1xuICAgICAgICBzdXBlcihtZXNzYWdlKVxuICAgICAgICB0aGlzLnJlc3BvbnNlID0gcmVzXG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBhc3luYyBmdW5jdGlvbiBmZXRjaFdyYXAoaW5wdXQ6IFJlcXVlc3RJbmZvIHwgVVJMLCBpbml0PzogUmVxdWVzdEluaXQpIHtcbiAgICBjb25zdCByZXMgPSBhd2FpdCBfZmV0Y2goaW5wdXQsIGluaXQpXG4gICAgaWYgKCFyZXMub2spIHtcbiAgICAgICAgdGhyb3cgbmV3IFJlc3BvbnNlRXJyb3IoYEVycm9yIHJlc3BvbnNlIGZyb20gc2VydmVyICR7cmVzLnN0YXR1c306ICAke2F3YWl0IHJlcy50ZXh0KCl9YCwgcmVzKVxuICAgIH1cbiAgICByZXR1cm4gcmVzXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfZmV0Y2goaW5wdXQ6IFJlcXVlc3RJbmZvIHwgVVJMLCBpbml0PzogUmVxdWVzdEluaXQpIHtcbiAgICBjb25zdCBwcm94eVVybCA9IHByb2Nlc3MuZW52LkhUVFBfUFJPWFkgfHwgcHJvY2Vzcy5lbnYuSFRUUFNfUFJPWFlcbiAgICBpZiAocHJveHlVcmwpIHtcbiAgICAgICAgY29uc3Qgbm9Qcm94eSA9IHByb2Nlc3MuZW52Lk5PX1BST1hZICYmIHByb2Nlc3MuZW52Lk5PX1BST1hZLnRyaW0oKVxuICAgICAgICAgICAgPyBwcm9jZXNzLmVudi5OT19QUk9YWS50cmltKCkuc3BsaXQoL1tcXHMsO10rLylcbiAgICAgICAgICAgIDogW11cbiAgICAgICAgY29uc3QgcmVxdWVzdCA9IG5ldyBSZXF1ZXN0KGlucHV0KVxuICAgICAgICBjb25zdCB1cmwgPSBuZXcgVVJMKHJlcXVlc3QudXJsKVxuICAgICAgICBpZiAoIW5vUHJveHkuc29tZSgoc3RyKSA9PiB1cmwuaG9zdG5hbWUuZW5kc1dpdGgoc3RyKSkpIHtcbiAgICAgICAgICAgIHJldHVybiB1bmRpY2lGZXRjaChcbiAgICAgICAgICAgICAgICByZXF1ZXN0LnVybCxcbiAgICAgICAgICAgICAgICB7IC4uLihpbml0IGFzIFVuZGljaVJlcXVlc3RJbml0KSwgZGlzcGF0Y2hlcjogbmV3IFByb3h5QWdlbnQocHJveHlVcmwpIH0sXG4gICAgICAgICAgICApIGFzIHVua25vd24gYXMgUHJvbWlzZTxSZXNwb25zZT5cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmV0Y2goaW5wdXQsIGluaXQpXG59XG4iLCAiZXhwb3J0IGNvbnN0IEVWRU5UUyA9IHtcbiAgICBTREtfU0VUVVA6ICdzZGs6c2V0dXAnLFxuICAgIFNES19DTEVBTlVQOiAnc2RrOmNsZWFudXAnLFxuICAgIFNES19QUkVfVEVTVDogJ3NkazpwcmUtdGVzdCcsXG4gICAgU0RLX1RFU1Q6ICdzZGs6dGVzdCcsXG4gICAgU0RLX1BPU1RfVEVTVDogJ3Nkazpwb3N0LXRlc3QnLFxuICAgIFNES19IT09LOiAnc2RrOmhvb2snLFxuICAgIFNES19EUklWRVI6ICdzZGs6ZHJpdmVyJyxcbiAgICBTREtfQTExWTogJ3NkazphMTF5JyxcbiAgICBTREtfTzExWTogJ3NkazpvMTF5JyxcbiAgICBTREtfQVVUT19DQVBUVVJFOiAnc2RrOmF1dG8tY2FwdHVyZScsXG4gICAgU0RLX1BST1hZX1NFVFVQOiAnc2RrOnByb3h5LXNldHVwJyxcbiAgICBTREtfVEVTVEhVQjogJ3Nkazp0ZXN0aHViJyxcbiAgICBTREtfQVVUT01BVEU6ICdzZGs6YXV0b21hdGUnLFxuICAgIFNES19BUFBfQVVUT01BVEU6ICdzZGs6YXBwLWF1dG9tYXRlJyxcbiAgICBTREtfVFVSQk9TQ0FMRTogJ3Nkazp0dXJib3NjYWxlJyxcbiAgICBTREtfUEVSQ1k6ICdzZGs6cGVyY3knLFxuICAgIFNES19QUkVfSU5JVElBTElaRTogJ3Nkazpkcml2ZXI6cHJlLWluaXRpYWxpemF0aW9uJyxcbiAgICBTREtfUE9TVF9JTklUSUFMSVpFOiAnc2RrOmRyaXZlcjpwb3N0LWluaXRpYWxpemF0aW9uJyxcbiAgICBTREtfQ0xJX0NIRUNLX1VQREFURTogJ3NkazpjbGk6Y2hlY2stdXBkYXRlJyxcbiAgICBTREtfQ0xJX0RPV05MT0FEOiAnc2RrOmNsaTpkb3dubG9hZCcsXG4gICAgU0RLX0NMSV9PTl9CT09UU1RSQVA6ICdzZGs6Y2xpOm9uLWJvb3RzdHJhcCcsXG4gICAgU0RLX0NMSV9PTl9DT05ORUNUOiAnc2RrOmNsaTpvbi1jb25uZWN0JyxcbiAgICBTREtfQ0xJX1NUQVJUOiAnc2RrOmNsaTpzdGFydCcsXG4gICAgU0RLX0NMSV9PTl9TVE9QOiAnc2RrOmNsaTpvbi1zdG9wJyxcbiAgICBTREtfQ09OTkVDVF9CSU5fU0VTU0lPTjogJ3Nkazpjb25uZWN0QmluU2Vzc2lvbicsXG4gICAgU0RLX1NUQVJUX0JJTl9TRVNTSU9OOiAnc2RrOnN0YXJ0QmluU2Vzc2lvbicsXG4gICAgLy8gTmV3IGV2ZW50cyBmcm9tIFB5dGhvbiBTREtcbiAgICBTREtfRFJJVkVSX0lOSVQ6ICdzZGs6ZHJpdmVySW5pdCcsXG4gICAgU0RLX0ZJTkRfTkVBUkVTVF9IVUI6ICdzZGs6ZmluZE5lYXJlc3RIdWInLFxuICAgIFNES19BVVRPTUFUSU9OX0ZSQU1FV09SS19JTklUOiAnc2RrOmF1dG9tYXRpb25GcmFtZXdvcmtJbml0JyxcbiAgICBTREtfQVVUT01BVElPTl9GUkFNRVdPUktfU1RBUlQ6ICdzZGs6YXV0b21hdGlvbkZyYW1ld29ya1N0YXJ0JyxcbiAgICBTREtfQVVUT01BVElPTl9GUkFNRVdPUktfU1RPUDogJ3NkazphdXRvbWF0aW9uRnJhbWV3b3JrU3RvcCcsXG4gICAgU0RLX0FDQ0VTU0lCSUxJVFlfQ09ORklHOiAnc2RrOmFjY2Vzc2liaWxpdHlDb25maWcnLFxuICAgIFNES19PQlNFUlZBQklMSVRZX0NPTkZJRzogJ3NkazpvYnNlcnZhYmlsaXR5Q29uZmlnJyxcbiAgICBTREtfQUlfU0VMRl9IRUFMX1NURVA6ICdzZGs6YWlTZWxmSGVhbFN0ZXAnLFxuICAgIFNES19BSV9TRUxGX0hFQUxfR0VUX1JFU1VMVDogJ3NkazphaVNlbGZIZWFsR2V0UmVzdWx0JyxcbiAgICBTREtfVEVTVF9GUkFNRVdPUktfRVZFTlQ6ICdzZGs6dGVzdEZyYW1ld29ya0V2ZW50JyxcbiAgICBTREtfVEVTVF9TRVNTSU9OX0VWRU5UOiAnc2RrOnRlc3RTZXNzaW9uRXZlbnQnLFxuICAgIFNES19DTElfTE9HX0NSRUFURURfRVZFTlQ6ICdzZGs6Y2xpOmxvZ0NyZWF0ZWRFdmVudCcsXG4gICAgU0RLX0NMSV9FTlFVRVVFX1RFU1RfRVZFTlQ6ICdzZGs6Y2xpOmVucXVldWVUZXN0RXZlbnQnLFxuICAgIFNES19PTl9TVE9QOiAnc2RrOm9uU3RvcCcsXG4gICAgU0RLX1NFTkRfTE9HUzogJ3NkazpzZW5kbG9ncycsXG4gICAgLy8gRnVubmVsIEV2ZW50c1xuICAgIFNES19GVU5ORUxfVEVTVF9BVFRFTVBURUQ6ICdzZGs6ZnVubmVsOnRlc3QtYXR0ZW1wdGVkJyxcbiAgICBTREtfRlVOTkVMX1RFU1RfU1VDQ0VTU0ZVTDogJ3NkazpmdW5uZWw6dGVzdC1zdWNjZXNzZnVsJyxcbiAgICAvLyBMb2cgVXBsb2FkIEV2ZW50c1xuICAgIFNES19VUExPQURfTE9HUzogJ3Nkazp1cGxvYWQtbG9ncycsXG4gICAgLy8gS2V5IE1ldHJpY3MgRXZlbnRzXG4gICAgU0RLX1NFTkRfS0VZX01FVFJJQ1M6ICdzZGs6c2VuZC1rZXktbWV0cmljcycsXG4gICAgU0RLX0tFWV9NRVRSSUNTX1BSRVBBUkFUSU9OOiAnc2RrOmtleS1tZXRyaWNzOnByZXBhcmF0aW9uJyxcbiAgICBTREtfS0VZX01FVFJJQ1NfVVBMT0FEOiAnc2RrOmtleS1tZXRyaWNzOnVwbG9hZCcsXG4gICAgLy8gQ0xJIEJpbmFyeSBFdmVudHNcbiAgICBTREtfQ0xJX0RPV05MT0FEX0JJTkFSWTogJ3NkazpjbGk6ZG93bmxvYWQtYmluYXJ5JyxcbiAgICBTREtfQ0xJX0JJTkFSWV9WRVJJRklDQVRJT046ICdzZGs6Y2xpOmJpbmFyeS12ZXJpZmljYXRpb24nLFxuICAgIC8vIENsZWFudXAgJiBTaHV0ZG93biBFdmVudHMgKHRyYWNraW5nIGdhcCBiZXR3ZWVuIGRyaXZlcjpxdWl0IGFuZCBmdW5uZWw6dGVzdC1zdWNjZXNzZnVsKVxuICAgIFNES19MSVNURU5FUl9XT1JLRVJfRU5EOiAnc2RrOmxpc3RlbmVyOndvcmtlci1lbmQnLFxuICAgIFNES19QRVJDWV9URUFSRE9XTjogJ3NkazpwZXJjeTp0ZWFyZG93bicsXG4gICAgU0RLX1dPUktFUl9TQVZFX0RBVEE6ICdzZGs6d29ya2VyOnNhdmUtZGF0YScsXG4gICAgU0RLX1BFUkZPUk1BTkNFX1JFUE9SVF9HRU46ICdzZGs6cGVyZm9ybWFuY2U6cmVwb3J0LWdlbmVyYXRpb24nLFxuICAgIFNES19QRVJGT1JNQU5DRV9KU09OX1dSSVRFOiAnc2RrOnBlcmZvcm1hbmNlOmpzb24td3JpdGUnLFxuICAgIFNES19QRVJGT1JNQU5DRV9IVE1MX0dFTjogJ3NkazpwZXJmb3JtYW5jZTpodG1sLWdlbmVyYXRpb24nLFxuICAgIC8vIERldmljZSBBbGxvY2F0aW9uIEV2ZW50ICh0cmFja2luZyBnYXAgYmV0d2VlbiBiZWZvcmVTZXNzaW9uIGFuZCBiZWZvcmUgaG9va3MpXG4gICAgU0RLX0RFVklDRV9BTExPQ0FUSU9OOiAnc2RrOmRldmljZS1hbGxvY2F0aW9uJ1xufVxuXG5leHBvcnQgY29uc3QgVEVTVEhVQl9FVkVOVFMgPSB7XG4gICAgU1RBUlQ6IGAke0VWRU5UUy5TREtfVEVTVEhVQn06c3RhcnRgLFxuICAgIFNUT1A6IGAke0VWRU5UUy5TREtfVEVTVEhVQn06c3RvcGBcbn1cblxuZXhwb3J0IGNvbnN0IEFVVE9NQVRFX0VWRU5UUyA9IHtcbiAgICBLRUVQX0FMSVZFOiBgJHtFVkVOVFMuU0RLX0FVVE9NQVRFfTprZWVwLWFsaXZlYCxcbiAgICBIVUJfTUFOQUdFTUVOVDogYCR7RVZFTlRTLlNES19BVVRPTUFURX06aHViLW1hbmFnZW1lbnRgLFxuICAgIExPQ0FMX1NUQVJUOiBgJHtFVkVOVFMuU0RLX0FVVE9NQVRFfTpsb2NhbC1zdGFydGAsXG4gICAgTE9DQUxfU1RPUDogYCR7RVZFTlRTLlNES19BVVRPTUFURX06bG9jYWwtc3RvcGAsXG4gICAgRFJJVkVSX01BTkFHRTogYCR7RVZFTlRTLlNES19BVVRPTUFURX06ZHJpdmVyLW1hbmFnZWAsXG4gICAgU0VTU0lPTl9OQU1FOiBgJHtFVkVOVFMuU0RLX0FVVE9NQVRFfTpzZXNzaW9uLW5hbWVgLFxuICAgIFNFU1NJT05fU1RBVFVTOiBgJHtFVkVOVFMuU0RLX0FVVE9NQVRFfTpzZXNzaW9uLXN0YXR1c2AsXG4gICAgU0VTU0lPTl9BTk5PVEFUSU9OOiBgJHtFVkVOVFMuU0RLX0FVVE9NQVRFfTpzZXNzaW9uLWFubm90YXRpb25gLFxuICAgIElETEVfVElNRU9VVDogYCR7RVZFTlRTLlNES19BVVRPTUFURX06aWRsZS10aW1lb3V0YCxcbiAgICBHRU5FUkFURV9DSV9BUlRJRkFDVDogYCR7RVZFTlRTLlNES19BVVRPTUFURX06Y2ktYXJ0aWZhY3RzYCxcbiAgICBQUklOVF9CVUlMRExJTks6IGAke0VWRU5UUy5TREtfQVVUT01BVEV9OnByaW50LWJ1aWxkbGlua2Bcbn1cblxuZXhwb3J0IGNvbnN0IEExMVlfRVZFTlRTID0ge1xuICAgIFBFUkZPUk1fU0NBTjogYCR7RVZFTlRTLlNES19BMTFZfTpkcml2ZXItcGVyZm9ybXNjYW5gLFxuICAgIFNBVkVfUkVTVUxUUzogYCR7RVZFTlRTLlNES19BMTFZfTpzYXZlLXJlc3VsdHNgLFxuICAgIEdFVF9SRVNVTFRTOiBgJHtFVkVOVFMuU0RLX0ExMVl9OmdldC1hY2Nlc3NpYmlsaXR5LXJlc3VsdHNgLFxuICAgIEdFVF9SRVNVTFRTX1NVTU1BUlk6IGAke0VWRU5UUy5TREtfQTExWX06Z2V0LWFjY2Vzc2liaWxpdHktcmVzdWx0cy1zdW1tYXJ5YFxufVxuXG5leHBvcnQgY29uc3QgUEVSQ1lfRVZFTlRTID0ge1xuICAgIERPV05MT0FEOiBgJHtFVkVOVFMuU0RLX1BFUkNZfTpkb3dubG9hZGAsXG4gICAgU0NSRUVOU0hPVDogYCR7RVZFTlRTLlNES19QRVJDWX06c2NyZWVuc2hvdGAsXG4gICAgU1RBUlQ6IGAke0VWRU5UUy5TREtfUEVSQ1l9OnN0YXJ0YCxcbiAgICBTVE9QOiBgJHtFVkVOVFMuU0RLX1BFUkNZfTpzdG9wYCxcbiAgICBBVVRPX0NBUFRVUkU6IGAke0VWRU5UUy5TREtfUEVSQ1l9OmF1dG8tY2FwdHVyZWAsXG4gICAgU05BUFNIT1Q6IGAke0VWRU5UUy5TREtfUEVSQ1l9OnNuYXBzaG90YCxcbiAgICBTQ1JFRU5TSE9UX0FQUDogYCR7RVZFTlRTLlNES19QRVJDWX06c2NyZWVuc2hvdC1hcHBgXG59XG5cbmV4cG9ydCBjb25zdCBPMTFZX0VWRU5UUyA9IHtcbiAgICBTWU5DOiBgJHtFVkVOVFMuU0RLX08xMVl9OnN5bmNgLFxuICAgIFRBS0VfU0NSRUVOU0hPVDogYCR7RVZFTlRTLlNES19PMTFZfTpkcml2ZXItdGFrZVNjcmVlblNob3RgLFxuICAgIFBSSU5UX0JVSUxETElOSzogYCR7RVZFTlRTLlNES19PMTFZfTpwcmludC1idWlsZGxpbmtgXG59XG5cbmV4cG9ydCBjb25zdCBIT09LX0VWRU5UUyA9IHtcbiAgICBCRUZPUkVfRUFDSDogYCR7RVZFTlRTLlNES19IT09LfTpiZWZvcmUtZWFjaGAsXG4gICAgQUZURVJfRUFDSDogYCR7RVZFTlRTLlNES19IT09LfTphZnRlci1lYWNoYCxcbiAgICBBRlRFUl9BTEw6IGAke0VWRU5UUy5TREtfSE9PS306YWZ0ZXItYWxsYCxcbiAgICBCRUZPUkVfQUxMOiBgJHtFVkVOVFMuU0RLX0hPT0t9OmJlZm9yZS1hbGxgLFxuICAgIEJFRk9SRTogYCR7RVZFTlRTLlNES19IT09LfTpiZWZvcmVgLFxuICAgIEFGVEVSOiBgJHtFVkVOVFMuU0RLX0hPT0t9OmFmdGVyYFxufVxuXG5leHBvcnQgY29uc3QgVFVSQk9TQ0FMRV9FVkVOVFMgPSB7XG4gICAgSFVCX01BTkFHRU1FTlQ6IGAke0VWRU5UUy5TREtfVFVSQk9TQ0FMRX06aHViLW1hbmFnZW1lbnRgLFxuICAgIFBSSU5UX0JVSUxETElOSzogYCR7RVZFTlRTLlNES19UVVJCT1NDQUxFfTpwcmludC1idWlsZGxpbmtgXG59XG5cbmV4cG9ydCBjb25zdCBBUFBfQVVUT01BVEVfRVZFTlRTID0ge1xuICAgIEFQUF9VUExPQUQ6IGAke0VWRU5UUy5TREtfQVBQX0FVVE9NQVRFfTphcHAtdXBsb2FkYFxufVxuXG5leHBvcnQgY29uc3QgRFJJVkVSX0VWRU5UID0ge1xuICAgIFFVSVQ6IGAke0VWRU5UUy5TREtfRFJJVkVSfTpxdWl0YCxcbiAgICBHRVQ6IGAke0VWRU5UUy5TREtfRFJJVkVSfTpnZXRgLFxuICAgIFBSRV9FWEVDVVRFOiBgJHtFVkVOVFMuU0RLX0RSSVZFUn06cHJlLWV4ZWN1dGVgLFxuICAgIFBPU1RfRVhFQ1VURTogYCR7RVZFTlRTLlNES19EUklWRVJ9OnBvc3QtZXhlY3V0ZWAsXG4gICAgSU5JVDogRVZFTlRTLlNES19EUklWRVJfSU5JVCxcbiAgICBQUkVfSU5JVElBTElaRTogRVZFTlRTLlNES19QUkVfSU5JVElBTElaRSxcbiAgICBQT1NUX0lOSVRJQUxJWkU6IEVWRU5UUy5TREtfUE9TVF9JTklUSUFMSVpFXG59XG5cbi8qKlxuICogRnJhbWV3b3JrIGxpZmVjeWNsZSBldmVudHMgZm9yIGF1dG9tYXRpb24gZnJhbWV3b3JrIHRyYWNraW5nXG4gKi9cbmV4cG9ydCBjb25zdCBGUkFNRVdPUktfRVZFTlRTID0ge1xuICAgIElOSVQ6IEVWRU5UUy5TREtfQVVUT01BVElPTl9GUkFNRVdPUktfSU5JVCxcbiAgICBTVEFSVDogRVZFTlRTLlNES19BVVRPTUFUSU9OX0ZSQU1FV09SS19TVEFSVCxcbiAgICBTVE9QOiBFVkVOVFMuU0RLX0FVVE9NQVRJT05fRlJBTUVXT1JLX1NUT1Bcbn1cblxuLyoqXG4gKiBNb2R1bGUgY29uZmlndXJhdGlvbiBldmVudHNcbiAqL1xuZXhwb3J0IGNvbnN0IENPTkZJR19FVkVOVFMgPSB7XG4gICAgQUNDRVNTSUJJTElUWTogRVZFTlRTLlNES19BQ0NFU1NJQklMSVRZX0NPTkZJRyxcbiAgICBPQlNFUlZBQklMSVRZOiBFVkVOVFMuU0RLX09CU0VSVkFCSUxJVFlfQ09ORklHXG59XG5cbi8qKlxuICogQUkgc2VsZi1oZWFsaW5nIGV2ZW50c1xuICovXG5leHBvcnQgY29uc3QgQUlfRVZFTlRTID0ge1xuICAgIFNFTEZfSEVBTF9TVEVQOiBFVkVOVFMuU0RLX0FJX1NFTEZfSEVBTF9TVEVQLFxuICAgIFNFTEZfSEVBTF9HRVRfUkVTVUxUOiBFVkVOVFMuU0RLX0FJX1NFTEZfSEVBTF9HRVRfUkVTVUxUXG59XG5cbi8qKlxuICogRXZlbnQgZGlzcGF0Y2hlciBldmVudHMgZm9yIHRlc3QgZnJhbWV3b3JrIGFuZCBzZXNzaW9uIHRyYWNraW5nXG4gKi9cbmV4cG9ydCBjb25zdCBESVNQQVRDSEVSX0VWRU5UUyA9IHtcbiAgICBURVNUX0ZSQU1FV09SSzogRVZFTlRTLlNES19URVNUX0ZSQU1FV09SS19FVkVOVCxcbiAgICBURVNUX1NFU1NJT046IEVWRU5UUy5TREtfVEVTVF9TRVNTSU9OX0VWRU5ULFxuICAgIExPR19DUkVBVEVEOiBFVkVOVFMuU0RLX0NMSV9MT0dfQ1JFQVRFRF9FVkVOVCxcbiAgICBFTlFVRVVFX1RFU1Q6IEVWRU5UUy5TREtfQ0xJX0VOUVVFVUVfVEVTVF9FVkVOVFxufVxuXG4iLCAiZXhwb3J0IGNvbnN0IFRlc3RGcmFtZXdvcmtDb25zdGFudHMgPSB7XG4gICAgS0VZX1RFU1RfVVVJRDogJ3Rlc3RfdXVpZCcsXG4gICAgS0VZX1RFU1RfSUQgOiAndGVzdF9pZCcsXG4gICAgS0VZX1RFU1RfTkFNRSA6ICd0ZXN0X25hbWUnLFxuICAgIEtFWV9URVNUX0ZJTEVfUEFUSCA6ICd0ZXN0X2ZpbGVfcGF0aCcsXG4gICAgS0VZX1RFU1RfVEFHUyA6ICd0ZXN0X3RhZ3MnLFxuICAgIEtFWV9URVNUX1JFU1VMVCA6ICd0ZXN0X3Jlc3VsdCcsXG4gICAgS0VZX1RFU1RfUkVTVUxUX0FUIDogJ3Rlc3RfcmVzdWx0X2F0JyxcbiAgICBLRVlfVEVTVF9TVEFSVEVEX0FUIDogJ3Rlc3Rfc3RhcnRlZF9hdCcsXG4gICAgS0VZX1RFU1RfRU5ERURfQVQgOiAndGVzdF9lbmRlZF9hdCcsXG4gICAgS0VZX1RFU1RfTE9DQVRJT04gOiAndGVzdF9sb2NhdGlvbicsXG4gICAgS0VZX1RFU1RfU0NPUEUgOiAndGVzdF9zY29wZScsXG4gICAgS0VZX1RFU1RfU0NPUEVTIDogJ3Rlc3Rfc2NvcGVzJyxcbiAgICBLRVlfVEVTVF9GUkFNRVdPUktfTkFNRSA6ICd0ZXN0X2ZyYW1ld29ya19uYW1lJyxcbiAgICBLRVlfVEVTVF9GUkFNRVdPUktfVkVSU0lPTiA6ICd0ZXN0X2ZyYW1ld29ya192ZXJzaW9uJyxcbiAgICBLRVlfVEVTVF9DT0RFIDogJ3Rlc3RfY29kZScsXG4gICAgS0VZX1RFU1RfUkVSVU5fTkFNRSA6ICd0ZXN0X3JlcnVuX25hbWUnLFxuICAgIEtFWV9QTEFURk9STV9JTkRFWCA6ICdwbGF0Zm9ybV9pbmRleCcsXG4gICAgS0VZX1RFU1RfRkFJTFVSRSA6ICd0ZXN0X2ZhaWx1cmUnLFxuICAgIEtFWV9URVNUX0ZBSUxVUkVfVFlQRSA6ICd0ZXN0X2ZhaWx1cmVfdHlwZScsXG4gICAgS0VZX1RFU1RfRkFJTFVSRV9SRUFTT04gOiAndGVzdF9mYWlsdXJlX3JlYXNvbicsXG4gICAgS0VZX1RFU1RfTE9HUyA6ICd0ZXN0X2xvZ3MnLFxuICAgIEtFWV9URVNUX01FVEEgOiAndGVzdF9tZXRhJyxcbiAgICBLRVlfQ1VTVE9NX1RBR1MgOiAnY3VzdG9tX21ldGFkYXRhJyxcbiAgICBLRVlfVEVTVF9ERUZFUlJFRCA6ICd0ZXN0X2RlZmVycmVkJyxcbiAgICBLRVlfU0VTU0lPTl9OQU1FIDogJ3Rlc3Rfc2Vzc2lvbl9uYW1lJyxcbiAgICBLRVlfQVVUT01BVEVfU0VTU0lPTl9OQU1FIDogJ2F1dG9tYXRlX3Nlc3Npb25fbmFtZScsXG4gICAgS0VZX0FVVE9NQVRFX1NFU1NJT05fU1RBVFVTOiAnYXV0b21hdGVfc2Vzc2lvbl9zdGF0dXMnLFxuICAgIEtFWV9BVVRPTUFURV9TRVNTSU9OX1JFQVNPTjogJ2F1dG9tYXRlX3Nlc3Npb25fcmVhc29uJyxcbiAgICBLRVlfRVZFTlRfU1RBUlRFRF9BVCA6ICdldmVudF9zdGFydGVkX2F0JyxcbiAgICBLRVlfRVZFTlRfRU5ERURfQVQgOiAnZXZlbnRfZW5kZWRfYXQnLFxuICAgIEtFWV9IT09LX0lEIDogJ2hvb2tfaWQnLFxuICAgIEtFWV9IT09LX1JFU1VMVCA6ICdob29rX3Jlc3VsdCcsXG4gICAgS0VZX0hPT0tfTE9HUyA6ICdob29rX2xvZ3MnLFxuICAgIEtFWV9IT09LX05BTUUgOiAnaG9va19uYW1lJyxcbiAgICBLRVlfSE9PS1NfU1RBUlRFRDogJ3Rlc3RfaG9va3Nfc3RhcnRlZCcsXG4gICAgS0VZX0hPT0tTX0ZJTklTSEVEOiAndGVzdF9ob29rc19maW5pc2hlZCcsXG4gICAgREVGQVVMVF9URVNUX1JFU1VMVCA6ICdwZW5kaW5nJyxcbiAgICBERUZBVUxUX0hPT0tfUkVTVUxUIDogJ3BlbmRpbmcnLFxuICAgIEtJTkRfU0NSRUVOU0hPVCA6ICdURVNUX1NDUkVFTlNIT1QnLFxuICAgIEtJTkRfTE9HIDogJ1RFU1RfTE9HJyxcbiAgICBLSU5EX0FUVEFDSE1FTlQgOiAnVEVTVF9BVFRBQ0hNRU5UJyxcbiAgICBIT09LX1JFR0VYIDogJ14oQkVGT1JFX3xBRlRFUl8pJyxcbn1cbiIsICJcbmltcG9ydCB7IEJST1dTRVJTVEFDS19QRVJDWSwgQlJPV1NFUlNUQUNLX09CU0VSVkFCSUxJVFksIEJST1dTRVJTVEFDS19BQ0NFU1NJQklMSVRZIH0gZnJvbSAnLi4vY29uc3RhbnRzLmpzJ1xuaW1wb3J0IHR5cGUgQnJvd3NlclN0YWNrQ29uZmlnIGZyb20gJy4uL2NvbmZpZy5qcydcbmltcG9ydCB7IEJTdGFja0xvZ2dlciB9IGZyb20gJy4uL2JzdGFja0xvZ2dlci5qcydcbmltcG9ydCB7IGlzVHJ1ZSwgaXNMb2FkVGVzdGluZ1Nlc3Npb24gfSBmcm9tICcuLi91dGlsLmpzJ1xuXG5pbnRlcmZhY2UgRXJyb3JUeXBlIHtcbiAgICBrZXk6IHN0cmluZ1xuICAgIG1lc3NhZ2U6IHN0cmluZ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEVycm9ycyB7XG4gICAgZXJyb3JzOiBFcnJvclR5cGVbXVxufVxuXG5leHBvcnQgY29uc3QgZ2V0UHJvZHVjdE1hcCA9IChjb25maWc6IEJyb3dzZXJTdGFja0NvbmZpZyk6IHsgW2tleTogc3RyaW5nXTogYm9vbGVhbiB9ID0+IHtcbiAgICAvLyBMVFMgZ2F0aW5nOiB1bmRlciBMVFMsIGF1dG9tYXRlIGlzIGZvcmNlZCBmYWxzZSAoTFRTIGJ1aWxkcyByb3V0ZSB0b1xuICAgIC8vIHRoZSBMVFMgaW50ZXJuYWwgaHViOyBrZWVwaW5nIGF1dG9tYXRlPXRydWUgdGFncyBUZXN0SHViIHNvdXJjZSBhc1xuICAgIC8vIFRPLEFVVCxMVFMgaW5zdGVhZCBvZiBUTyxMVFMgXHUyMDE0IHNlZSBweS1zZGsgZWE1M2Q5MTQpLiBUaGUgYGx0c2Aga2V5XG4gICAgLy8gaXRzZWxmIGlzIG9ubHkgZW1pdHRlZCB1bmRlciBMVFMgc28gbm9uLUxUUyBwYXlsb2FkcyBzdGF5IGJ5dGUtXG4gICAgLy8gaWRlbnRpY2FsIHRvIHRoZSBwcmUtTFRTLVBSIHNoYXBlIChhdm9pZHMgc3VycHJpc2luZyBhbnkgYmFja2VuZCB3aXRoXG4gICAgLy8gc3RyaWN0IHVua25vd24ta2V5IHZhbGlkYXRpb24pLlxuICAgIGNvbnN0IGx0cyA9IGlzTG9hZFRlc3RpbmdTZXNzaW9uKClcbiAgICBjb25zdCBlbnRyaWVzOiBbc3RyaW5nLCBib29sZWFuIHwgdW5kZWZpbmVkXVtdID0gW1xuICAgICAgICBbJ29ic2VydmFiaWxpdHknLCBjb25maWcudGVzdE9ic2VydmFiaWxpdHkuZW5hYmxlZF0sXG4gICAgICAgIFsnYWNjZXNzaWJpbGl0eScsICEhY29uZmlnLmFjY2Vzc2liaWxpdHldLFxuICAgICAgICBbJ3BlcmN5JywgY29uZmlnLnBlcmN5XSxcbiAgICAgICAgWydhdXRvbWF0ZScsIGx0cyA/IGZhbHNlIDogY29uZmlnLmF1dG9tYXRlXSxcbiAgICAgICAgWydhcHBfYXV0b21hdGUnLCBjb25maWcuYXBwQXV0b21hdGVdLFxuICAgIF1cbiAgICBpZiAobHRzKSB7XG4gICAgICAgIGVudHJpZXMucHVzaChbJ2x0cycsIHRydWVdKVxuICAgIH1cbiAgICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKGVudHJpZXMuZmlsdGVyKChbLCB2XSkgPT4gdiAhPT0gbnVsbCkpIGFzIHsgW2tleTogc3RyaW5nXTogYm9vbGVhbiB9XG59XG5cbmV4cG9ydCBjb25zdCBzaG91bGRQcm9jZXNzRXZlbnRGb3JUZXN0aHViID0gKGV2ZW50VHlwZTogc3RyaW5nKTogYm9vbGVhbiA9PiB7XG4gICAgLy8gTFRTIHNob3J0LWNpcmN1aXQ6IHdoZW4gcnVubmluZyBhcyBhbiBMVFMgbG9hZCB0ZXN0IChCUk9XU0VSU1RBQ0tfTFRTPXRydWVcbiAgICAvLyBmb3IgbG9jYWwgcmVwcm8sIG9yIEJST1dTRVJTVEFDS19MVFNfU0VTU0lPTl9JRCBzZXQgYnkgdGhlIHBvZCksIFRlc3RIdWJcbiAgICAvLyBldmVudCBlbWlzc2lvbiBtdXN0IGFsd2F5cyBmbG93IHJlZ2FyZGxlc3Mgb2YgdGhlIG9ic2VydmFiaWxpdHkgL1xuICAgIC8vIGFjY2Vzc2liaWxpdHkgLyBwZXJjeSBlbnYgZmxhZ3MuIFBvZCBydW5zIGRvIGV4cG9ydFxuICAgIC8vIEJST1dTRVJTVEFDS19PQlNFUlZBQklMSVRZLCBidXQgdGhlIGxvY2FsLXJlcHJvIGZsYWcgcGF0aCBkb2Vzbid0XG4gICAgLy8gZ3VhcmFudGVlIGl0IFx1MjAxNCB3aXRob3V0IHRoaXMgc2hvcnQtY2lyY3VpdCwgZ2V0UHJvZHVjdE1hcCBjb3JyZWN0bHlcbiAgICAvLyBlbWl0cyBsdHM6IHRydWUgd2hpbGUgZXZlcnkgb25UZXN0U3RhcnQgLyBvblRlc3RFbmQgLyBvbkhvb2tTdGFydFxuICAgIC8vIHNpbGVudGx5IG5vLW9wcy4gTWlycm9yIG9mIHRoZSB1bmNvbmRpdGlvbmFsIExUUyBldmVudCBmbG93IGluIHB5LXNkaydzXG4gICAgLy8gc2hvdWxkX3NlbmRfZXZlbnRfZm9yX3Rlc3RodWIoKSAoUFIgIzk5MykuXG4gICAgaWYgKGlzTG9hZFRlc3RpbmdTZXNzaW9uKCkpIHtcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG4gICAgaWYgKGlzVHJ1ZShwcm9jZXNzLmVudltCUk9XU0VSU1RBQ0tfT0JTRVJWQUJJTElUWV0pKSB7XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuICAgIGlmIChpc1RydWUocHJvY2Vzcy5lbnZbQlJPV1NFUlNUQUNLX0FDQ0VTU0lCSUxJVFldKSkge1xuICAgICAgICByZXR1cm4gIShbJ0hvb2tSdW5TdGFydGVkJywgJ0hvb2tSdW5GaW5pc2hlZCcsICdMb2dDcmVhdGVkJ10uaW5jbHVkZXMoZXZlbnRUeXBlKSlcbiAgICB9XG4gICAgaWYgKGlzVHJ1ZShwcm9jZXNzLmVudltCUk9XU0VSU1RBQ0tfUEVSQ1ldKSAmJiBldmVudFR5cGUpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICAgIC8vIEV2YWx1YXRlIHdpdGggaXNUcnVlIHNvIGEgcHJvZHVjdCBmbGFnIGV4cGxpY2l0bHkgc2V0IHRvIHRoZSBzdHJpbmcgJ2ZhbHNlJ1xuICAgIC8vIChlLmcuIG9ic2VydmFiaWxpdHkgdHVybmVkIG9mZiBhZnRlciBhIGZhaWxlZC9ibG9ja2VkIGJ1aWxkLXN0YXJ0KSByZWFkcyBhc1xuICAgIC8vIG9mZi4gUmF3IEJvb2xlYW4oJ2ZhbHNlJykgaXMgdHJ1dGh5LCB3aGljaCBrZXB0IGV2ZW50cyBmbG93aW5nIGZvciBhblxuICAgIC8vIG9ic2VydmFiaWxpdHktb25seSBzZXNzaW9uIGV2ZW4gYWZ0ZXIgdGhlIGZsYWcgd2FzIGRpc2FibGVkLlxuICAgIHJldHVybiBpc1RydWUocHJvY2Vzcy5lbnZbQlJPV1NFUlNUQUNLX0FDQ0VTU0lCSUxJVFldKSB8fCBpc1RydWUocHJvY2Vzcy5lbnZbQlJPV1NFUlNUQUNLX09CU0VSVkFCSUxJVFldKSB8fCBpc1RydWUocHJvY2Vzcy5lbnZbQlJPV1NFUlNUQUNLX1BFUkNZXSlcbn1cblxuZXhwb3J0IGNvbnN0IGhhbmRsZUVycm9yRm9yT2JzZXJ2YWJpbGl0eSA9IChlcnJvcjogRXJyb3JzIHwgbnVsbCk6IHZvaWQgPT4ge1xuICAgIHByb2Nlc3MuZW52W0JST1dTRVJTVEFDS19PQlNFUlZBQklMSVRZXSA9ICdmYWxzZSdcbiAgICBsb2dCdWlsZEVycm9yKGVycm9yLCAnVGVzdCBSZXBvcnRpbmcgYW5kIEFuYWx5dGljcycpXG59XG5cbmV4cG9ydCBjb25zdCBoYW5kbGVFcnJvckZvckFjY2Vzc2liaWxpdHkgPSAoZXJyb3I6IEVycm9ycyB8IG51bGwpOiB2b2lkID0+IHtcbiAgICBwcm9jZXNzLmVudltCUk9XU0VSU1RBQ0tfQUNDRVNTSUJJTElUWV0gPSAnZmFsc2UnXG4gICAgbG9nQnVpbGRFcnJvcihlcnJvciwgJ2FjY2Vzc2liaWxpdHknKVxufVxuXG5leHBvcnQgY29uc3QgbG9nQnVpbGRFcnJvciA9IChlcnJvcjogRXJyb3JzIHwgbnVsbCwgcHJvZHVjdDogc3RyaW5nID0gJycpOiB2b2lkID0+IHtcbiAgICBpZiAoIWVycm9yIHx8ICFlcnJvci5lcnJvcnMpIHtcbiAgICAgICAgQlN0YWNrTG9nZ2VyLmVycm9yKGAke3Byb2R1Y3QudG9VcHBlckNhc2UoKX0gQnVpbGQgY3JlYXRpb24gZmFpbGVkICR7ZXJyb3IhfWApXG4gICAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGZvciAoY29uc3QgZXJyb3JKc29uIG9mIGVycm9yLmVycm9ycykge1xuICAgICAgICBjb25zdCBlcnJvclR5cGUgPSBlcnJvckpzb24ua2V5XG4gICAgICAgIGNvbnN0IGVycm9yTWVzc2FnZSA9IGVycm9ySnNvbi5tZXNzYWdlXG4gICAgICAgIGlmIChlcnJvck1lc3NhZ2UpIHtcbiAgICAgICAgICAgIHN3aXRjaCAoZXJyb3JUeXBlKSB7XG4gICAgICAgICAgICBjYXNlICdFUlJPUl9JTlZBTElEX0NSRURFTlRJQUxTJzpcbiAgICAgICAgICAgICAgICBCU3RhY2tMb2dnZXIuZXJyb3IoZXJyb3JNZXNzYWdlKVxuICAgICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICBjYXNlICdFUlJPUl9BQ0NFU1NfREVOSUVEJzpcbiAgICAgICAgICAgICAgICBCU3RhY2tMb2dnZXIuaW5mbyhlcnJvck1lc3NhZ2UpXG4gICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgIGNhc2UgJ0VSUk9SX1NES19ERVBSRUNBVEVEJzpcbiAgICAgICAgICAgICAgICBCU3RhY2tMb2dnZXIuZXJyb3IoZXJyb3JNZXNzYWdlKVxuICAgICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIEJTdGFja0xvZ2dlci5lcnJvcihlcnJvck1lc3NhZ2UpXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmV4cG9ydCBjb25zdCBnZXRQcm9kdWN0TWFwRm9yQnVpbGRTdGFydENhbGwgPSAoY29uZmlnOiBCcm93c2VyU3RhY2tDb25maWcsIGFjY2Vzc2liaWxpdHlBdXRvbWF0aW9uPzogYm9vbGVhbiB8IG51bGwpOiB7IFtrZXk6IHN0cmluZ106IGJvb2xlYW4gfSA9PiB7XG4gICAgLy8gTFRTIGdhdGluZzogdW5kZXIgTFRTLCBhdXRvbWF0ZSBpcyBmb3JjZWQgZmFsc2UgKExUUyBidWlsZHMgcm91dGUgdG9cbiAgICAvLyB0aGUgTFRTIGludGVybmFsIGh1Yjsga2VlcGluZyBhdXRvbWF0ZT10cnVlIHRhZ3MgVGVzdEh1YiBzb3VyY2UgYXNcbiAgICAvLyBUTyxBVVQsTFRTIGluc3RlYWQgb2YgVE8sTFRTIFx1MjAxNCBzZWUgcHktc2RrIGVhNTNkOTE0KS4gVGhlIGBsdHNgIGtleVxuICAgIC8vIGl0c2VsZiBpcyBvbmx5IGVtaXR0ZWQgdW5kZXIgTFRTIHRvIGtlZXAgbm9uLUxUUyBwYXlsb2FkcyBieXRlLVxuICAgIC8vIGlkZW50aWNhbCB0byB0aGUgcHJlLUxUUy1QUiBzaGFwZS5cbiAgICBjb25zdCBsdHMgPSBpc0xvYWRUZXN0aW5nU2Vzc2lvbigpXG4gICAgY29uc3QgZW50cmllczogW3N0cmluZywgYm9vbGVhbiB8IHVuZGVmaW5lZCB8IG51bGxdW10gPSBbXG4gICAgICAgIFsnb2JzZXJ2YWJpbGl0eScsIGNvbmZpZy50ZXN0T2JzZXJ2YWJpbGl0eS5lbmFibGVkXSxcbiAgICAgICAgWydhY2Nlc3NpYmlsaXR5JywgYWNjZXNzaWJpbGl0eUF1dG9tYXRpb25dLFxuICAgICAgICBbJ3BlcmN5JywgY29uZmlnLnBlcmN5XSxcbiAgICAgICAgWydhdXRvbWF0ZScsIGx0cyA/IGZhbHNlIDogY29uZmlnLmF1dG9tYXRlXSxcbiAgICAgICAgWydhcHBfYXV0b21hdGUnLCBjb25maWcuYXBwQXV0b21hdGVdLFxuICAgIF1cbiAgICBpZiAobHRzKSB7XG4gICAgICAgIGVudHJpZXMucHVzaChbJ2x0cycsIHRydWVdKVxuICAgIH1cbiAgICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKGVudHJpZXMuZmlsdGVyKChbLCB2XSkgPT4gdiAhPT0gbnVsbCkpIGFzIHsgW2tleTogc3RyaW5nXTogYm9vbGVhbiB9XG59XG4iLCAiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnXG5cbmltcG9ydCB0eXBlIHsgT3B0aW9ucyB9IGZyb20gJ0B3ZGlvL3R5cGVzJ1xuXG5pbXBvcnQgeyBCU3RhY2tMb2dnZXIgfSBmcm9tICcuLi9ic3RhY2tMb2dnZXIuanMnXG5pbXBvcnQgeyBpc1ZhbGlkRW5hYmxlZFZhbHVlIH0gZnJvbSAnLi4vdXRpbC5qcydcbmltcG9ydCB7IFNNQVJUX1NFTEVDVElPTl9NT0RFX1JFTEVWQU5UX0ZJUlNULCBTTUFSVF9TRUxFQ1RJT05fTU9ERV9SRUxFVkFOVF9PTkxZIH0gZnJvbSAnLi4vY29uc3RhbnRzLmpzJ1xuXG5jb25zdCBSVU5fU01BUlRfU0VMRUNUSU9OID0gJ3J1blNtYXJ0U2VsZWN0aW9uJ1xuXG5jb25zdCBBTExPV0VEX09SQ0hFU1RSQVRJT05fS0VZUyA9IFtcbiAgICBSVU5fU01BUlRfU0VMRUNUSU9OXG5dXG5cbnR5cGUgU21hcnRTZWxlY3Rpb25SZXBvSW5mbyA9IHtcbiAgICB1cmw/OiBzdHJpbmdcbiAgICBmZWF0dXJlQnJhbmNoPzogc3RyaW5nXG4gICAgYmFzZUJyYW5jaD86IHN0cmluZ1xuICAgIG5hbWU/OiBzdHJpbmdcbiAgICBba2V5OiBzdHJpbmddOiB1bmtub3duXG59XG5cbnR5cGUgU21hcnRTZWxlY3Rpb25Tb3VyY2UgPSBzdHJpbmdbXSB8IFNtYXJ0U2VsZWN0aW9uUmVwb0luZm9bXSB8IG51bGxcblxudHlwZSBSdW5TbWFydFNlbGVjdGlvbkNvbmZpZyA9IHtcbiAgICBlbmFibGVkPzogYm9vbGVhbiB8IHN0cmluZ1xuICAgIG1vZGU/OiBzdHJpbmdcbiAgICBzb3VyY2U/OiBzdHJpbmcgfCBzdHJpbmdbXSB8IFNtYXJ0U2VsZWN0aW9uUmVwb0luZm9bXSB8IG51bGxcbn1cblxuY29uc3QgaXNQbGFpbk9iamVjdCA9ICh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0+IChcbiAgICB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICE9PSBudWxsICYmICFBcnJheS5pc0FycmF5KHZhbHVlKVxuKVxuXG5jb25zdCBhc1N0cmluZyA9ICh2YWx1ZTogdW5rbm93bik6IHN0cmluZyB8IHVuZGVmaW5lZCA9PiB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlXG4gICAgfVxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZS50b1N0cmluZygpXG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWRcbn1cblxuLyoqXG4gKiBDbGFzcyB0byBoYW5kbGUgdGVzdCBvcmRlcmluZyBmdW5jdGlvbmFsaXR5XG4gKi9cbmNsYXNzIFRlc3RPcmRlcmluZyB7XG4gICAgcHJpdmF0ZSBlbmFibGVkOiBib29sZWFuXG4gICAgcHJpdmF0ZSBuYW1lOiBzdHJpbmcgfCBudWxsXG5cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5lbmFibGVkID0gZmFsc2VcbiAgICAgICAgdGhpcy5uYW1lID0gbnVsbFxuICAgIH1cblxuICAgIGVuYWJsZShuYW1lOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5lbmFibGVkID0gdHJ1ZVxuICAgICAgICB0aGlzLm5hbWUgPSBuYW1lXG4gICAgfVxuXG4gICAgZGlzYWJsZSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5lbmFibGVkID0gZmFsc2VcbiAgICAgICAgdGhpcy5uYW1lID0gbnVsbFxuICAgIH1cblxuICAgIGdldEVuYWJsZWQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmVuYWJsZWRcbiAgICB9XG5cbiAgICBnZXROYW1lKCk6IHN0cmluZyB8IG51bGwge1xuICAgICAgICByZXR1cm4gdGhpcy5uYW1lXG4gICAgfVxufVxuXG4vKipcbiAqIFV0aWxpdHkgY2xhc3MgZm9yIHRlc3Qgb3JjaGVzdHJhdGlvblxuICovXG50eXBlIE9yY2hlc3RyYXRpb25Db25maWcgPSBPcHRpb25zLlRlc3RydW5uZXIgfCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuXG5leHBvcnQgY2xhc3MgT3JjaGVzdHJhdGlvblV0aWxzIHtcbiAgICBwcml2YXRlIHN0YXRpYyBfaW5zdGFuY2U6IE9yY2hlc3RyYXRpb25VdGlscyB8IG51bGwgPSBudWxsXG4gICAgcHJpdmF0ZSBydW5TbWFydFNlbGVjdGlvbjogYm9vbGVhblxuICAgIHByaXZhdGUgc21hcnRTZWxlY3Rpb25Nb2RlOiBzdHJpbmdcbiAgICBwcml2YXRlIHRlc3RPcmRlcmluZzogVGVzdE9yZGVyaW5nXG4gICAgcHJpdmF0ZSBzbWFydFNlbGVjdGlvblNvdXJjZTogU21hcnRTZWxlY3Rpb25Tb3VyY2VcbiAgICBwcml2YXRlIHByb2plY3ROYW1lPzogc3RyaW5nXG4gICAgcHJpdmF0ZSBidWlsZE5hbWU/OiBzdHJpbmdcbiAgICBwcml2YXRlIGJ1aWxkSWRlbnRpZmllcj86IHN0cmluZ1xuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIGNvbmZpZyBDb25maWd1cmF0aW9uIG9iamVjdFxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKGNvbmZpZzogT3JjaGVzdHJhdGlvbkNvbmZpZykge1xuICAgICAgICB0aGlzLnJ1blNtYXJ0U2VsZWN0aW9uID0gZmFsc2VcbiAgICAgICAgdGhpcy5zbWFydFNlbGVjdGlvbk1vZGUgPSBTTUFSVF9TRUxFQ1RJT05fTU9ERV9SRUxFVkFOVF9GSVJTVFxuICAgICAgICB0aGlzLnRlc3RPcmRlcmluZyA9IG5ldyBUZXN0T3JkZXJpbmcoKVxuICAgICAgICB0aGlzLnNtYXJ0U2VsZWN0aW9uU291cmNlID0gbnVsbCAvLyBTdG9yZSBzb3VyY2UgcGF0aHMgaWYgcHJvdmlkZWRcblxuICAgICAgICAvLyBDaGVjayBib3RoIHBvc3NpYmxlIGNvbmZpZ3VyYXRpb24gcGF0aHM6IGRpcmVjdCBvciBuZXN0ZWQgaW4gc2VydmljZXNcbiAgICAgICAgY29uc3QgY29uZmlnUmVjb3JkID0gaXNQbGFpbk9iamVjdChjb25maWcpID8gY29uZmlnIDoge31cbiAgICAgICAgbGV0IHRlc3RPcmNoT3B0aW9uczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSBpc1BsYWluT2JqZWN0KGNvbmZpZ1JlY29yZC50ZXN0T3JjaGVzdHJhdGlvbk9wdGlvbnMpXG4gICAgICAgICAgICA/IGNvbmZpZ1JlY29yZC50ZXN0T3JjaGVzdHJhdGlvbk9wdGlvbnNcbiAgICAgICAgICAgIDoge31cblxuICAgICAgICAvLyBJZiBub3QgZm91bmQgYXQgdG9wIGxldmVsLCBjaGVjayBpZiBpdCdzIGluIHRoZSBicm93c2Vyc3RhY2sgc2VydmljZSBjb25maWdcbiAgICAgICAgY29uc3Qgc2VydmljZXMgPSBBcnJheS5pc0FycmF5KGNvbmZpZ1JlY29yZC5zZXJ2aWNlcykgPyBjb25maWdSZWNvcmQuc2VydmljZXMgOiB1bmRlZmluZWRcbiAgICAgICAgaWYgKE9iamVjdC5rZXlzKHRlc3RPcmNoT3B0aW9ucykubGVuZ3RoID09PSAwICYmIEFycmF5LmlzQXJyYXkoc2VydmljZXMpKSB7XG4gICAgICAgICAgICAvLyBMb29rIGZvciBicm93c2Vyc3RhY2sgc2VydmljZSBjb25maWd1cmF0aW9uXG4gICAgICAgICAgICBmb3IgKGNvbnN0IHNlcnZpY2Ugb2Ygc2VydmljZXMpIHtcbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgIEFycmF5LmlzQXJyYXkoc2VydmljZSkgJiZcbiAgICAgICAgICAgICAgICAgICAgc2VydmljZVswXSA9PT0gJ2Jyb3dzZXJzdGFjaycgJiZcbiAgICAgICAgICAgICAgICAgICAgaXNQbGFpbk9iamVjdChzZXJ2aWNlWzFdKSAmJlxuICAgICAgICAgICAgICAgICAgICBpc1BsYWluT2JqZWN0KHNlcnZpY2VbMV0udGVzdE9yY2hlc3RyYXRpb25PcHRpb25zKVxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICB0ZXN0T3JjaE9wdGlvbnMgPSBzZXJ2aWNlWzFdLnRlc3RPcmNoZXN0cmF0aW9uT3B0aW9uc1xuICAgICAgICAgICAgICAgICAgICBCU3RhY2tMb2dnZXIuZGVidWcoJ1tjb25zdHJ1Y3Rvcl0gRm91bmQgdGVzdE9yY2hlc3RyYXRpb25PcHRpb25zIGluIGJyb3dzZXJzdGFjayBzZXJ2aWNlIGNvbmZpZycpXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gVHJ5IHRvIGdldCBydW5TbWFydFNlbGVjdGlvbiBvcHRpb25zXG4gICAgICAgIGNvbnN0IHJ1blNtYXJ0U2VsZWN0aW9uT3B0czogUnVuU21hcnRTZWxlY3Rpb25Db25maWcgPSBpc1BsYWluT2JqZWN0KHRlc3RPcmNoT3B0aW9uc1tSVU5fU01BUlRfU0VMRUNUSU9OXSlcbiAgICAgICAgICAgID8gdGVzdE9yY2hPcHRpb25zW1JVTl9TTUFSVF9TRUxFQ1RJT05dIGFzIFJ1blNtYXJ0U2VsZWN0aW9uQ29uZmlnXG4gICAgICAgICAgICA6IHt9XG5cbiAgICAgICAgdGhpcy5fc2V0UnVuU21hcnRTZWxlY3Rpb24oXG4gICAgICAgICAgICBydW5TbWFydFNlbGVjdGlvbk9wdHMuZW5hYmxlZCA/PyBmYWxzZSxcbiAgICAgICAgICAgIHJ1blNtYXJ0U2VsZWN0aW9uT3B0cy5tb2RlIHx8IFNNQVJUX1NFTEVDVElPTl9NT0RFX1JFTEVWQU5UX0ZJUlNULFxuICAgICAgICAgICAgcnVuU21hcnRTZWxlY3Rpb25PcHRzLnNvdXJjZSA/PyBudWxsXG4gICAgICAgIClcbiAgICAgICAgLy8gRXh0cmFjdCBidWlsZCBkZXRhaWxzIGZyb20gY2FwYWJpbGl0aWVzXG4gICAgICAgIHRoaXMuX2V4dHJhY3RCdWlsZERldGFpbHMoY29uZmlnKVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEV4dHJhY3QgYnVpbGQgZGV0YWlscyBmcm9tIGNhcGFiaWxpdGllc1xuICAgICAqL1xuICAgIHByaXZhdGUgX2V4dHJhY3RCdWlsZERldGFpbHMoY29uZmlnOiBPcmNoZXN0cmF0aW9uQ29uZmlnKTogdm9pZCB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBjb25maWdSZWNvcmQgPSBpc1BsYWluT2JqZWN0KGNvbmZpZykgPyBjb25maWcgOiB7fVxuICAgICAgICAgICAgY29uc3QgY2FwYWJpbGl0aWVzID0gKGNvbmZpZ1JlY29yZCBhcyB7IGNhcGFiaWxpdGllcz86IHVua25vd24gfSkuY2FwYWJpbGl0aWVzXG5cbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGNhcGFiaWxpdGllcykpIHtcbiAgICAgICAgICAgICAgICBjYXBhYmlsaXRpZXMuZm9yRWFjaChjYXBhYmlsaXR5ID0+IHRoaXMuX3BhcnNlQ2FwYWJpbGl0eShjYXBhYmlsaXR5KSlcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNQbGFpbk9iamVjdChjYXBhYmlsaXRpZXMpKSB7XG4gICAgICAgICAgICAgICAgLy8gSGFuZGxlIG11bHRpcmVtb3RlIGNhcGFiaWxpdGllc1xuICAgICAgICAgICAgICAgIE9iamVjdC52YWx1ZXMoY2FwYWJpbGl0aWVzKS5mb3JFYWNoKChjYXBzKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpc1BsYWluT2JqZWN0KGNhcHMpICYmICdjYXBhYmlsaXRpZXMnIGluIGNhcHMgJiYgaXNQbGFpbk9iamVjdChjYXBzLmNhcGFiaWxpdGllcykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3BhcnNlQ2FwYWJpbGl0eShjYXBzLmNhcGFiaWxpdGllcylcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIEJTdGFja0xvZ2dlci5kZWJ1ZyhgW19leHRyYWN0QnVpbGREZXRhaWxzXSBFeHRyYWN0ZWQgLSBwcm9qZWN0TmFtZTogJHt0aGlzLnByb2plY3ROYW1lfSwgYnVpbGROYW1lOiAke3RoaXMuYnVpbGROYW1lfSwgYnVpbGRJZGVudGlmaWVyOiAke3RoaXMuYnVpbGRJZGVudGlmaWVyfWApXG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBCU3RhY2tMb2dnZXIuZXJyb3IoYFtfZXh0cmFjdEJ1aWxkRGV0YWlsc10gJHtlcnJvcn1gKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfcGFyc2VDYXBhYmlsaXR5KGNhcGFiaWxpdHk6IHVua25vd24pOiB2b2lkIHtcbiAgICAgICAgaWYgKCFpc1BsYWluT2JqZWN0KGNhcGFiaWxpdHkpKSB7XG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGJzdGFja09wdGlvbnNSYXcgPSBjYXBhYmlsaXR5Wydic3RhY2s6b3B0aW9ucyddXG5cbiAgICAgICAgaWYgKGlzUGxhaW5PYmplY3QoYnN0YWNrT3B0aW9uc1JhdykpIHtcbiAgICAgICAgICAgIGNvbnN0IGJ1aWxkTmFtZSA9IGFzU3RyaW5nKGJzdGFja09wdGlvbnNSYXcuYnVpbGROYW1lKVxuICAgICAgICAgICAgY29uc3QgcHJvamVjdE5hbWUgPSBhc1N0cmluZyhic3RhY2tPcHRpb25zUmF3LnByb2plY3ROYW1lKVxuICAgICAgICAgICAgY29uc3QgYnVpbGRJZGVudGlmaWVyID0gYXNTdHJpbmcoYnN0YWNrT3B0aW9uc1Jhdy5idWlsZElkZW50aWZpZXIpXG5cbiAgICAgICAgICAgIGlmIChidWlsZE5hbWUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmJ1aWxkTmFtZSA9IGJ1aWxkTmFtZVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHByb2plY3ROYW1lKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wcm9qZWN0TmFtZSA9IHByb2plY3ROYW1lXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoYnVpbGRJZGVudGlmaWVyKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5idWlsZElkZW50aWZpZXIgPSBidWlsZElkZW50aWZpZXJcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGxlZ2FjeUJ1aWxkSWRlbnRpZmllciA9IGFzU3RyaW5nKGNhcGFiaWxpdHlbJ2Jyb3dzZXJzdGFjay5idWlsZElkZW50aWZpZXInXSlcbiAgICAgICAgICAgIGNvbnN0IGxlZ2FjeUJ1aWxkTmFtZSA9IGFzU3RyaW5nKGNhcGFiaWxpdHkuYnVpbGQpXG5cbiAgICAgICAgICAgIGlmIChsZWdhY3lCdWlsZElkZW50aWZpZXIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmJ1aWxkSWRlbnRpZmllciA9IGxlZ2FjeUJ1aWxkSWRlbnRpZmllclxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGxlZ2FjeUJ1aWxkTmFtZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuYnVpbGROYW1lID0gbGVnYWN5QnVpbGROYW1lXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgb3IgY3JlYXRlIGFuIGluc3RhbmNlIG9mIE9yY2hlc3RyYXRpb25VdGlsc1xuICAgICAqL1xuICAgIHN0YXRpYyBnZXRJbnN0YW5jZShjb25maWc/OiBPcmNoZXN0cmF0aW9uQ29uZmlnKTogT3JjaGVzdHJhdGlvblV0aWxzIHwgbnVsbCB7XG4gICAgICAgIGlmICghT3JjaGVzdHJhdGlvblV0aWxzLl9pbnN0YW5jZSAmJiBjb25maWcpIHtcbiAgICAgICAgICAgIE9yY2hlc3RyYXRpb25VdGlscy5faW5zdGFuY2UgPSBuZXcgT3JjaGVzdHJhdGlvblV0aWxzKGNvbmZpZylcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gT3JjaGVzdHJhdGlvblV0aWxzLl9pbnN0YW5jZVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBvcmNoZXN0cmF0aW9uIGRhdGEgZnJvbSBjb25maWdcbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0T3JjaGVzdHJhdGlvbkRhdGEoY29uZmlnOiBPcmNoZXN0cmF0aW9uQ29uZmlnKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICAgICAgICBjb25zdCBjb25maWdSZWNvcmQgPSBpc1BsYWluT2JqZWN0KGNvbmZpZykgPyBjb25maWcgOiB7fVxuICAgICAgICBjb25zdCBvcmNoZXN0cmF0aW9uRGF0YSA9IGlzUGxhaW5PYmplY3QoY29uZmlnUmVjb3JkLnRlc3RPcmNoZXN0cmF0aW9uT3B0aW9ucylcbiAgICAgICAgICAgID8gY29uZmlnUmVjb3JkLnRlc3RPcmNoZXN0cmF0aW9uT3B0aW9uc1xuICAgICAgICAgICAgOiB7fVxuICAgICAgICBjb25zdCByZXN1bHQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge31cblxuICAgICAgICBPYmplY3QuZW50cmllcyhvcmNoZXN0cmF0aW9uRGF0YSkuZm9yRWFjaCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICAgICAgICBpZiAoQUxMT1dFRF9PUkNIRVNUUkFUSU9OX0tFWVMuaW5jbHVkZXMoa2V5KSkge1xuICAgICAgICAgICAgICAgIHJlc3VsdFtrZXldID0gdmFsdWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSlcblxuICAgICAgICByZXR1cm4gcmVzdWx0XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHJ1biBzbWFydCBzZWxlY3Rpb24gc2V0dGluZ1xuICAgICAqL1xuICAgIGdldFJ1blNtYXJ0U2VsZWN0aW9uKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5ydW5TbWFydFNlbGVjdGlvblxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBzbWFydCBzZWxlY3Rpb24gbW9kZVxuICAgICAqL1xuICAgIGdldFNtYXJ0U2VsZWN0aW9uTW9kZSgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5zbWFydFNlbGVjdGlvbk1vZGVcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgc21hcnQgc2VsZWN0aW9uIHNvdXJjZVxuICAgICAqL1xuICAgIGdldFNtYXJ0U2VsZWN0aW9uU291cmNlKCk6IFNtYXJ0U2VsZWN0aW9uU291cmNlIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc21hcnRTZWxlY3Rpb25Tb3VyY2VcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgcHJvamVjdCBuYW1lXG4gICAgICovXG4gICAgZ2V0UHJvamVjdE5hbWUoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucHJvamVjdE5hbWVcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgYnVpbGQgbmFtZVxuICAgICAqL1xuICAgIGdldEJ1aWxkTmFtZSgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgICAgICByZXR1cm4gdGhpcy5idWlsZE5hbWVcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgYnVpbGQgaWRlbnRpZmllclxuICAgICAqL1xuICAgIGdldEJ1aWxkSWRlbnRpZmllcigpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgICAgICByZXR1cm4gdGhpcy5idWlsZElkZW50aWZpZXJcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXQgYnVpbGQgZGV0YWlsc1xuICAgICAqL1xuICAgIHNldEJ1aWxkRGV0YWlscyhwcm9qZWN0TmFtZT86IHN0cmluZywgYnVpbGROYW1lPzogc3RyaW5nLCBidWlsZElkZW50aWZpZXI/OiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5wcm9qZWN0TmFtZSA9IHByb2plY3ROYW1lXG4gICAgICAgIHRoaXMuYnVpbGROYW1lID0gYnVpbGROYW1lXG4gICAgICAgIHRoaXMuYnVpbGRJZGVudGlmaWVyID0gYnVpbGRJZGVudGlmaWVyXG4gICAgICAgIEJTdGFja0xvZ2dlci5kZWJ1ZyhgW3NldEJ1aWxkRGV0YWlsc10gU2V0IC0gcHJvamVjdE5hbWU6ICR7dGhpcy5wcm9qZWN0TmFtZX0sIGJ1aWxkTmFtZTogJHt0aGlzLmJ1aWxkTmFtZX0sIGJ1aWxkSWRlbnRpZmllcjogJHt0aGlzLmJ1aWxkSWRlbnRpZmllcn1gKVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldCBydW4gc21hcnQgc2VsZWN0aW9uXG4gICAgICovXG4gICAgcHJpdmF0ZSBfc2V0UnVuU21hcnRTZWxlY3Rpb24oZW5hYmxlZDogYm9vbGVhbiB8IHN0cmluZywgbW9kZTogc3RyaW5nLCBzb3VyY2U6IHN0cmluZ1tdIHwgU21hcnRTZWxlY3Rpb25SZXBvSW5mb1tdIHwgc3RyaW5nIHwgbnVsbCA9IG51bGwpOiB2b2lkIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIFByb3Blcmx5IHZhbGlkYXRlIGVuYWJsZWQgdmFsdWUgLSBvbmx5IGFjY2VwdCB0cnVlIGJvb2xlYW4gb3Igc3RyaW5nIFwidHJ1ZVwiXG4gICAgICAgICAgICB0aGlzLnJ1blNtYXJ0U2VsZWN0aW9uID0gaXNWYWxpZEVuYWJsZWRWYWx1ZShlbmFibGVkKVxuICAgICAgICAgICAgdGhpcy5zbWFydFNlbGVjdGlvbk1vZGUgPSBtb2RlXG4gICAgICAgICAgICB0aGlzLnNtYXJ0U2VsZWN0aW9uU291cmNlID0gW11cblxuICAgICAgICAgICAgLy8gTG9nIHRoZSBjb25maWd1cmF0aW9uIGZvciBkZWJ1Z2dpbmdcbiAgICAgICAgICAgIEJTdGFja0xvZ2dlci5kZWJ1ZyhgU2V0dGluZyBydW5TbWFydFNlbGVjdGlvbjogZW5hYmxlZD0ke3RoaXMucnVuU21hcnRTZWxlY3Rpb259LCBtb2RlPSR7dGhpcy5zbWFydFNlbGVjdGlvbk1vZGV9YClcbiAgICAgICAgICAgIGlmICh0aGlzLnJ1blNtYXJ0U2VsZWN0aW9uKSB7XG4gICAgICAgICAgICAgICAgLy8gTW9kZSB2YWxpZGF0aW9uIC0gb25seSB3aGVuIHNtYXJ0IHNlbGVjdGlvbiBpcyBlbmFibGVkXG4gICAgICAgICAgICAgICAgY29uc3QgdmFsaWRNb2RlcyA9IFtTTUFSVF9TRUxFQ1RJT05fTU9ERV9SRUxFVkFOVF9GSVJTVCwgU01BUlRfU0VMRUNUSU9OX01PREVfUkVMRVZBTlRfT05MWV1cbiAgICAgICAgICAgICAgICBpZiAoIXZhbGlkTW9kZXMuaW5jbHVkZXModGhpcy5zbWFydFNlbGVjdGlvbk1vZGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIEJTdGFja0xvZ2dlci53YXJuKGBJbnZhbGlkIHNtYXJ0IHNlbGVjdGlvbiBtb2RlICcke3RoaXMuc21hcnRTZWxlY3Rpb25Nb2RlfScgcHJvdmlkZWQuIERlZmF1bHRpbmcgdG8gJyR7U01BUlRfU0VMRUNUSU9OX01PREVfUkVMRVZBTlRfRklSU1R9Jy5gKVxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNtYXJ0U2VsZWN0aW9uTW9kZSA9IFNNQVJUX1NFTEVDVElPTl9NT0RFX1JFTEVWQU5UX0ZJUlNUXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChzb3VyY2UgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zbWFydFNlbGVjdGlvblNvdXJjZSA9IG51bGxcbiAgICAgICAgICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLmRlYnVnKCdObyBzb3VyY2UgcHJvdmlkZWQgZm9yIHNtYXJ0IHNlbGVjdGlvbjsgZGVmYXVsdGluZyB0byBudWxsLicpXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KHNvdXJjZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zbWFydFNlbGVjdGlvblNvdXJjZSA9IHNvdXJjZVxuICAgICAgICAgICAgICAgICAgICBCU3RhY2tMb2dnZXIuZGVidWcoYFNtYXJ0IHNlbGVjdGlvbiBzb3VyY2Ugc2V0IHRvIGFycmF5OiAke0pTT04uc3RyaW5naWZ5KHNvdXJjZSl9YClcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBzb3VyY2UgPT09ICdzdHJpbmcnICYmIHNvdXJjZS5lbmRzV2l0aCgnLmpzb24nKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNtYXJ0U2VsZWN0aW9uU291cmNlID0gdGhpcy5fbG9hZFNvdXJjZUZyb21GaWxlKHNvdXJjZSkgfHwgW11cbiAgICAgICAgICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLmRlYnVnKGBTbWFydCBzZWxlY3Rpb24gc291cmNlIGxvYWRlZCBmcm9tIGZpbGU6ICR7c291cmNlfWApXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuX3NldFRlc3RPcmRlcmluZygpXG4gICAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIEJTdGFja0xvZ2dlci5lcnJvcihgW19zZXRSdW5TbWFydFNlbGVjdGlvbl0gJHtlfWApXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQYXJzZSBKU09OIHNvdXJjZSBjb25maWd1cmF0aW9uIGZpbGUgYW5kIGZvcm1hdCBpdCBmb3Igc21hcnQgc2VsZWN0aW9uLlxuICAgICAqXG4gICAgICogQHBhcmFtIGZpbGVQYXRoIC0gUGF0aCB0byB0aGUgSlNPTiBjb25maWd1cmF0aW9uIGZpbGVcbiAgICAgKiBAcmV0dXJucyBGb3JtYXR0ZWQgbGlzdCBvZiByZXBvc2l0b3J5IGNvbmZpZ3VyYXRpb25zXG4gICAgICovXG4gICAgcHJpdmF0ZSBfbG9hZFNvdXJjZUZyb21GaWxlKGZpbGVQYXRoOiBzdHJpbmcpOiBTbWFydFNlbGVjdGlvblJlcG9JbmZvW10ge1xuICAgICAgICBpZiAoIWZzLmV4aXN0c1N5bmMoZmlsZVBhdGgpKSB7XG4gICAgICAgICAgICBCU3RhY2tMb2dnZXIuZXJyb3IoYFNvdXJjZSBmaWxlICcke2ZpbGVQYXRofScgZG9lcyBub3QgZXhpc3QuYClcbiAgICAgICAgICAgIHJldHVybiBbXVxuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGRhdGE6IHVua25vd24gPSBudWxsXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBmaWxlQ29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhmaWxlUGF0aCwgJ3V0ZjgnKVxuICAgICAgICAgICAgZGF0YSA9IEpTT04ucGFyc2UoZmlsZUNvbnRlbnQpXG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBjb25zdCBtZXNzYWdlID0gZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpXG4gICAgICAgICAgICBCU3RhY2tMb2dnZXIuZXJyb3IoYEVycm9yIHBhcnNpbmcgSlNPTiBmcm9tIHNvdXJjZSBmaWxlICcke2ZpbGVQYXRofSc6ICR7bWVzc2FnZX1gKVxuICAgICAgICAgICAgcmV0dXJuIFtdXG4gICAgICAgIH1cblxuICAgICAgICAvLyBDYWNoZSBmZWF0dXJlIGJyYW5jaCBtYXBwaW5ncyBmcm9tIGVudiB0byBhdm9pZCByZXBlYXRlZCBwYXJzaW5nXG4gICAgICAgIGxldCBmZWF0dXJlQnJhbmNoRW52TWFwOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHwgbnVsbCA9IG51bGxcblxuICAgICAgICBjb25zdCBsb2FkRmVhdHVyZUJyYW5jaE1hcHMgPSAoKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9PiB7XG4gICAgICAgICAgICBjb25zdCBlbnZWYXIgPSBwcm9jZXNzLmVudi5CUk9XU0VSU1RBQ0tfT1JDSEVTVFJBVElPTl9TTUFSVF9TRUxFQ1RJT05fRkVBVFVSRV9CUkFOQ0hFUyB8fCAnJ1xuICAgICAgICAgICAgbGV0IGVudk1hcDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9XG5cbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgZW52TWFwID0gZW52VmFyLnN0YXJ0c1dpdGgoJ3snKSAmJiBlbnZWYXIuZW5kc1dpdGgoJ30nKVxuICAgICAgICAgICAgICAgICAgICA/IEpTT04ucGFyc2UoZW52VmFyKVxuICAgICAgICAgICAgICAgICAgICA6IGVudlZhci5zcGxpdCgnLCcpXG4gICAgICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKGl0ZW0gPT4gaXRlbS5pbmNsdWRlcygnOicpKVxuICAgICAgICAgICAgICAgICAgICAgICAgLnJlZHVjZSgoYWNjOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LCBpdGVtOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBba2V5LCB2YWx1ZV0gPSBpdGVtLnNwbGl0KCc6JylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoa2V5ICYmIHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjY1trZXkudHJpbSgpXSA9IHZhbHVlLnRyaW0oKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYWNjXG4gICAgICAgICAgICAgICAgICAgICAgICB9LCB7fSlcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLmVycm9yKGBFcnJvciBwYXJzaW5nIGZlYXR1cmUgYnJhbmNoIG1hcHBpbmdzOiAke2Vycm9yfWApXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIEJTdGFja0xvZ2dlci5kZWJ1ZyhgRmVhdHVyZSBicmFuY2ggbWFwcGluZ3MgZnJvbSBlbnY6ICR7SlNPTi5zdHJpbmdpZnkoZW52TWFwKX1gKVxuICAgICAgICAgICAgcmV0dXJuIGVudk1hcFxuICAgICAgICB9XG5cbiAgICAgICAgZmVhdHVyZUJyYW5jaEVudk1hcCA9IGxvYWRGZWF0dXJlQnJhbmNoTWFwcygpXG5cbiAgICAgICAgY29uc3QgZ2V0RmVhdHVyZUJyYW5jaCA9IChuYW1lOiBzdHJpbmcsIHJlcG9JbmZvOiBTbWFydFNlbGVjdGlvblJlcG9JbmZvKTogc3RyaW5nIHwgbnVsbCA9PiB7XG4gICAgICAgICAgICAvLyAxLiBDaGVjayBpbiBlbnZpcm9ubWVudCB2YXJpYWJsZSBtYXBcbiAgICAgICAgICAgIGlmIChmZWF0dXJlQnJhbmNoRW52TWFwICYmIGZlYXR1cmVCcmFuY2hFbnZNYXBbbmFtZV0pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmVhdHVyZUJyYW5jaEVudk1hcFtuYW1lXVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gMi4gQ2hlY2sgaW4gcmVwb19pbmZvXG4gICAgICAgICAgICBpZiAocmVwb0luZm8uZmVhdHVyZUJyYW5jaCkge1xuICAgICAgICAgICAgICAgIHJldHVybiByZXBvSW5mby5mZWF0dXJlQnJhbmNoXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHR5cGVvZiBkYXRhID09PSAnb2JqZWN0JyAmJiBkYXRhICE9PSBudWxsICYmICFBcnJheS5pc0FycmF5KGRhdGEpKSB7XG4gICAgICAgICAgICBjb25zdCBmb3JtYXR0ZWREYXRhOiBTbWFydFNlbGVjdGlvblJlcG9JbmZvW10gPSBbXVxuICAgICAgICAgICAgY29uc3QgbmFtZVBhdHRlcm4gPSAvXltBLVowLTlfXSskL1xuXG4gICAgICAgICAgICBmb3IgKGNvbnN0IFtuYW1lLCByZXBvSW5mb10gb2YgT2JqZWN0LmVudHJpZXMoZGF0YSkpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWlzUGxhaW5PYmplY3QocmVwb0luZm8pKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgY29uc3QgdHlwZWRSZXBvSW5mbyA9IHJlcG9JbmZvIGFzIFNtYXJ0U2VsZWN0aW9uUmVwb0luZm9cblxuICAgICAgICAgICAgICAgIC8vIFZhbGlkYXRlIHRoYXQgdXJsIGlzIGEgc3RyaW5nIGFuZCBpcyBwcmVzZW50XG4gICAgICAgICAgICAgICAgaWYgKCF0eXBlZFJlcG9JbmZvLnVybCB8fCB0eXBlb2YgdHlwZWRSZXBvSW5mby51cmwgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgICAgIEJTdGFja0xvZ2dlci53YXJuKGBSZXBvc2l0b3J5IFVSTCBpcyBtaXNzaW5nIG9yIGludmFsaWQgZm9yIHNvdXJjZSAnJHtuYW1lfSc6ICR7SlNPTi5zdHJpbmdpZnkocmVwb0luZm8pfWApXG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gVmFsaWRhdGUgdGhhdCBiYXNlQnJhbmNoLCBpZiBwcm92aWRlZCwgaXMgYSBzdHJpbmdcbiAgICAgICAgICAgICAgICBpZiAodHlwZWRSZXBvSW5mby5iYXNlQnJhbmNoICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIHR5cGVkUmVwb0luZm8uYmFzZUJyYW5jaCAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLndhcm4oYEJhc2UgYnJhbmNoIG11c3QgYmUgYSBzdHJpbmcgZm9yIHNvdXJjZSAnJHtuYW1lfSc6ICR7SlNPTi5zdHJpbmdpZnkocmVwb0luZm8pfWApXG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gVmFsaWRhdGUgdGhhdCBmZWF0dXJlQnJhbmNoLCBpZiBwcm92aWRlZCwgaXMgYSBzdHJpbmdcbiAgICAgICAgICAgICAgICBpZiAodHlwZWRSZXBvSW5mby5mZWF0dXJlQnJhbmNoICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIHR5cGVkUmVwb0luZm8uZmVhdHVyZUJyYW5jaCAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLndhcm4oYEZlYXR1cmUgYnJhbmNoIG11c3QgYmUgYSBzdHJpbmcgZm9yIHNvdXJjZSAnJHtuYW1lfSc6ICR7SlNPTi5zdHJpbmdpZnkocmVwb0luZm8pfWApXG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gVmFsaWRhdGUgbmFtZVxuICAgICAgICAgICAgICAgIGlmICghbmFtZVBhdHRlcm4udGVzdChuYW1lKSkge1xuICAgICAgICAgICAgICAgICAgICBCU3RhY2tMb2dnZXIud2FybihgSW52YWxpZCBzb3VyY2UgaWRlbnRpZmllciBmb3JtYXQgZm9yICcke25hbWV9JzogJHtKU09OLnN0cmluZ2lmeShyZXBvSW5mbyl9YClcbiAgICAgICAgICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBWYWxpZGF0ZSBsZW5ndGhcbiAgICAgICAgICAgICAgICBpZiAobmFtZS5sZW5ndGggPiAzMCB8fCBuYW1lLmxlbmd0aCA8IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLndhcm4oYFNvdXJjZSBpZGVudGlmaWVyICcke25hbWV9JyBtdXN0IGhhdmUgYSBsZW5ndGggYmV0d2VlbiAxIGFuZCAzMCBjaGFyYWN0ZXJzLmApXG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gT25seSBjb25zaWRlciB1cmwsIGJhc2VCcmFuY2gsIGFuZCBmZWF0dXJlQnJhbmNoIC0gaWdub3JlIGFsbCBvdGhlciBrZXlzXG4gICAgICAgICAgICAgICAgY29uc3QgZmVhdHVyZUJyYW5jaCA9IGdldEZlYXR1cmVCcmFuY2gobmFtZSwgdHlwZWRSZXBvSW5mbylcblxuICAgICAgICAgICAgICAgIGNvbnN0IGZpbHRlcmVkUmVwb0luZm86IFNtYXJ0U2VsZWN0aW9uUmVwb0luZm8gPSB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICAgICAgICAgIHVybDogdHlwZWRSZXBvSW5mby51cmwsXG4gICAgICAgICAgICAgICAgICAgIGZlYXR1cmVCcmFuY2g6IGZlYXR1cmVCcmFuY2ggPz8gdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gT25seSBhZGQgYmFzZUJyYW5jaCBpZiBpdCdzIHByb3ZpZGVkXG4gICAgICAgICAgICAgICAgaWYgKHR5cGVkUmVwb0luZm8uYmFzZUJyYW5jaCkge1xuICAgICAgICAgICAgICAgICAgICBmaWx0ZXJlZFJlcG9JbmZvLmJhc2VCcmFuY2ggPSB0eXBlZFJlcG9JbmZvLmJhc2VCcmFuY2hcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoIWZpbHRlcmVkUmVwb0luZm8uZmVhdHVyZUJyYW5jaCB8fCBmaWx0ZXJlZFJlcG9JbmZvLmZlYXR1cmVCcmFuY2ggPT09ICcnKSB7XG4gICAgICAgICAgICAgICAgICAgIEJTdGFja0xvZ2dlci53YXJuKGBGZWF0dXJlIGJyYW5jaCBub3Qgc3BlY2lmaWVkIGZvciBzb3VyY2UgJyR7bmFtZX0nOiAke0pTT04uc3RyaW5naWZ5KHJlcG9JbmZvKX1gKVxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChmaWx0ZXJlZFJlcG9JbmZvLmJhc2VCcmFuY2ggJiYgZmlsdGVyZWRSZXBvSW5mby5iYXNlQnJhbmNoID09PSBmaWx0ZXJlZFJlcG9JbmZvLmZlYXR1cmVCcmFuY2gpIHtcbiAgICAgICAgICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLndhcm4oYEZlYXR1cmUgYnJhbmNoIGFuZCBiYXNlIGJyYW5jaCBjYW5ub3QgYmUgdGhlIHNhbWUgZm9yIHNvdXJjZSAnJHtuYW1lfSc6ICR7SlNPTi5zdHJpbmdpZnkocmVwb0luZm8pfWApXG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgZm9ybWF0dGVkRGF0YS5wdXNoKGZpbHRlcmVkUmVwb0luZm8pXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBmb3JtYXR0ZWREYXRhXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShkYXRhKSkge1xuICAgICAgICAgICAgcmV0dXJuIGRhdGEuZmlsdGVyKGlzUGxhaW5PYmplY3QpIGFzIFNtYXJ0U2VsZWN0aW9uUmVwb0luZm9bXVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIFtdXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0IHRlc3Qgb3JkZXJpbmcgYmFzZWQgb24gcHJpb3JpdGllc1xuICAgICAqL1xuICAgIHByaXZhdGUgX3NldFRlc3RPcmRlcmluZygpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMucnVuU21hcnRTZWxlY3Rpb24pIHsgLy8gSGlnaGVzdCBwcmlvcml0eVxuICAgICAgICAgICAgdGhpcy50ZXN0T3JkZXJpbmcuZW5hYmxlKFJVTl9TTUFSVF9TRUxFQ1RJT04pXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnRlc3RPcmRlcmluZy5kaXNhYmxlKClcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrIGlmIHRlc3Qgb3JkZXJpbmcgaXMgZW5hYmxlZFxuICAgICAqL1xuICAgIHRlc3RPcmRlcmluZ0VuYWJsZWQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLnRlc3RPcmRlcmluZy5nZXRFbmFibGVkKClcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGVzdCBvcmRlcmluZyBuYW1lXG4gICAgICovXG4gICAgZ2V0VGVzdE9yZGVyaW5nTmFtZSgpOiBzdHJpbmcgfCBudWxsIHtcbiAgICAgICAgaWYgKHRoaXMudGVzdE9yZGVyaW5nLmdldEVuYWJsZWQoKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudGVzdE9yZGVyaW5nLmdldE5hbWUoKVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRlc3Qgb3JjaGVzdHJhdGlvbiBtZXRhZGF0YVxuICAgICAqL1xuICAgIGdldFRlc3RPcmNoZXN0cmF0aW9uTWV0YWRhdGEoKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICAgICAgICBjb25zdCBkYXRhID0ge1xuICAgICAgICAgICAgJ3J1bl9zbWFydF9zZWxlY3Rpb24nOiB7XG4gICAgICAgICAgICAgICAgJ2VuYWJsZWQnOiB0aGlzLmdldFJ1blNtYXJ0U2VsZWN0aW9uKCksXG4gICAgICAgICAgICAgICAgJ21vZGUnOiB0aGlzLmdldFNtYXJ0U2VsZWN0aW9uTW9kZSgpLFxuICAgICAgICAgICAgICAgICdzb3VyY2UnOiB0aGlzLmdldFNtYXJ0U2VsZWN0aW9uU291cmNlKClcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZGF0YVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBidWlsZCBzdGFydCBkYXRhXG4gICAgICovXG4gICAgZ2V0QnVpbGRTdGFydERhdGEoKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgcnVuX3NtYXJ0X3NlbGVjdGlvbjoge1xuICAgICAgICAgICAgICAgIGVuYWJsZWQ6IHRoaXMuZ2V0UnVuU21hcnRTZWxlY3Rpb24oKSxcbiAgICAgICAgICAgICAgICBtb2RlOiB0aGlzLmdldFNtYXJ0U2VsZWN0aW9uTW9kZSgpXG4gICAgICAgICAgICAgICAgLy8gTm90IHNlbmRpbmcgXCJzb3VyY2VcIiB0byBUSCBidWlsZHNcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgT3JjaGVzdHJhdGlvblV0aWxzXG4iLCAiaW1wb3J0IHR5cGUgeyBDYXBhYmlsaXRpZXMsIE9wdGlvbnMgfSBmcm9tICdAd2Rpby90eXBlcydcblxuaW1wb3J0IHsgQlNUQUNLX1NFUlZJQ0VfVkVSU0lPTiwgQlJPV1NFUlNUQUNLX1RFU1RIVUJfVVVJRCwgV0RJT19OQU1JTkdfUFJFRklYIH0gZnJvbSAnLi9jb25zdGFudHMuanMnXG5pbXBvcnQgdHlwZSB7IEJyb3dzZXJzdGFja0NvbmZpZywgQ3JlZGVudGlhbHNGb3JDcmFzaFJlcG9ydFVwbG9hZCwgVXNlckNvbmZpZ2ZvclJlcG9ydGluZyB9IGZyb20gJy4vdHlwZXMuanMnXG5pbXBvcnQgeyBERUZBVUxUX1JFUVVFU1RfQ09ORklHLCBnZXRPYnNlcnZhYmlsaXR5S2V5LCBnZXRPYnNlcnZhYmlsaXR5VXNlciB9IGZyb20gJy4vdXRpbC5qcydcbmltcG9ydCB7IEJTdGFja0xvZ2dlciB9IGZyb20gJy4vYnN0YWNrTG9nZ2VyLmpzJ1xuaW1wb3J0IEFQSVV0aWxzIGZyb20gJy4vY2xpL2FwaVV0aWxzLmpzJ1xuXG5pbXBvcnQgeyBfZmV0Y2ggYXMgZmV0Y2ggfSBmcm9tICcuL2ZldGNoV3JhcHBlci5qcydcblxudHlwZSBEaWN0ID0gUmVjb3JkPHN0cmluZywgdW5rbm93bj5cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ3Jhc2hSZXBvcnRlciB7XG4gICAgLyogVXNlciB0ZXN0IGNvbmZpZyBmb3IgYnVpbGQgcnVuIG1pbnVzIFBJSSAqL1xuICAgIHB1YmxpYyBzdGF0aWMgdXNlckNvbmZpZ0ZvclJlcG9ydGluZzogVXNlckNvbmZpZ2ZvclJlcG9ydGluZyA9IHt9XG4gICAgLyogVXNlciBjcmVkZW50aWFscyB1c2VkIGZvciByZXBvcnRpbmcgY3Jhc2hlcyBpbiBicm93c2Vyc3RhY2sgc2VydmljZSAqL1xuICAgIHByaXZhdGUgc3RhdGljIGNyZWRlbnRpYWxzRm9yQ3Jhc2hSZXBvcnRVcGxvYWQ6IENyZWRlbnRpYWxzRm9yQ3Jhc2hSZXBvcnRVcGxvYWQgPSB7fVxuXG4gICAgc3RhdGljIHNldENyZWRlbnRpYWxzRm9yQ3Jhc2hSZXBvcnRVcGxvYWQob3B0aW9uczogQnJvd3NlcnN0YWNrQ29uZmlnICYgT3B0aW9ucy5UZXN0cnVubmVyLCBjb25maWc6IE9wdGlvbnMuVGVzdHJ1bm5lcikge1xuICAgICAgICB0aGlzLmNyZWRlbnRpYWxzRm9yQ3Jhc2hSZXBvcnRVcGxvYWQgPSB7XG4gICAgICAgICAgICB1c2VybmFtZTogZ2V0T2JzZXJ2YWJpbGl0eVVzZXIob3B0aW9ucywgY29uZmlnKSxcbiAgICAgICAgICAgIHBhc3N3b3JkOiBnZXRPYnNlcnZhYmlsaXR5S2V5KG9wdGlvbnMsIGNvbmZpZylcbiAgICAgICAgfVxuICAgICAgICBwcm9jZXNzLmVudi5DUkVERU5USUFMU19GT1JfQ1JBU0hfUkVQT1JUSU5HID0gSlNPTi5zdHJpbmdpZnkodGhpcy5jcmVkZW50aWFsc0ZvckNyYXNoUmVwb3J0VXBsb2FkKVxuICAgIH1cblxuICAgIHN0YXRpYyBzZXRDb25maWdEZXRhaWxzKHVzZXJDb25maWc6IE9wdGlvbnMuVGVzdHJ1bm5lciwgY2FwYWJpbGl0aWVzOiBDYXBhYmlsaXRpZXMuVGVzdHJ1bm5lckNhcGFiaWxpdGllcywgb3B0aW9uczogQnJvd3NlcnN0YWNrQ29uZmlnICYgT3B0aW9ucy5UZXN0cnVubmVyKSB7XG4gICAgICAgIGNvbnN0IGNvbmZpZ1dpdGhvdXRQSUkgPSB0aGlzLmZpbHRlclBJSSh1c2VyQ29uZmlnKVxuICAgICAgICBjb25zdCBmaWx0ZXJlZENhcGFiaWxpdGllcyA9IHRoaXMuZmlsdGVyQ2FwYWJpbGl0aWVzKGNhcGFiaWxpdGllcylcbiAgICAgICAgdGhpcy51c2VyQ29uZmlnRm9yUmVwb3J0aW5nID0ge1xuICAgICAgICAgICAgZnJhbWV3b3JrOiB1c2VyQ29uZmlnLmZyYW1ld29yayxcbiAgICAgICAgICAgIHNlcnZpY2VzOiBjb25maWdXaXRob3V0UElJLnNlcnZpY2VzLFxuICAgICAgICAgICAgY2FwYWJpbGl0aWVzOiBmaWx0ZXJlZENhcGFiaWxpdGllcyxcbiAgICAgICAgICAgIGVudjoge1xuICAgICAgICAgICAgICAgICdCUk9XU0VSU1RBQ0tfQlVJTEQnOiBwcm9jZXNzLmVudi5CUk9XU0VSU1RBQ0tfQlVJTEQsXG4gICAgICAgICAgICAgICAgJ0JST1dTRVJTVEFDS19CVUlMRF9OQU1FJzogcHJvY2Vzcy5lbnYuQlJPV1NFUlNUQUNLX0JVSUxEX05BTUUsXG4gICAgICAgICAgICAgICAgJ0JVSUxEX1RBRyc6IHByb2Nlc3MuZW52LkJVSUxEX1RBR1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHByb2Nlc3MuZW52LlVTRVJfQ09ORklHX0ZPUl9SRVBPUlRJTkcgPSBKU09OLnN0cmluZ2lmeSh0aGlzLnVzZXJDb25maWdGb3JSZXBvcnRpbmcpXG4gICAgICAgIHRoaXMuc2V0Q3JlZGVudGlhbHNGb3JDcmFzaFJlcG9ydFVwbG9hZChvcHRpb25zLCB1c2VyQ29uZmlnKVxuICAgIH1cblxuICAgIHN0YXRpYyBhc3luYyB1cGxvYWRDcmFzaFJlcG9ydChleGNlcHRpb246IHN0cmluZywgc3RhY2tUcmFjZTogc3RyaW5nKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuY3JlZGVudGlhbHNGb3JDcmFzaFJlcG9ydFVwbG9hZC51c2VybmFtZSB8fCAhdGhpcy5jcmVkZW50aWFsc0ZvckNyYXNoUmVwb3J0VXBsb2FkLnBhc3N3b3JkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jcmVkZW50aWFsc0ZvckNyYXNoUmVwb3J0VXBsb2FkID0gcHJvY2Vzcy5lbnYuQ1JFREVOVElBTFNfRk9SX0NSQVNIX1JFUE9SVElORyAhPT0gdW5kZWZpbmVkID8gSlNPTi5wYXJzZShwcm9jZXNzLmVudi5DUkVERU5USUFMU19GT1JfQ1JBU0hfUkVQT1JUSU5HKSA6IHRoaXMuY3JlZGVudGlhbHNGb3JDcmFzaFJlcG9ydFVwbG9hZFxuICAgICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgcmV0dXJuIEJTdGFja0xvZ2dlci5lcnJvcihgW0NyYXNoX1JlcG9ydF9VcGxvYWRdIEZhaWxlZCB0byBwYXJzZSB1c2VyIGNyZWRlbnRpYWxzIHdoaWxlIHJlcG9ydGluZyBjcmFzaCBkdWUgdG8gJHtlcnJvcn1gKVxuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy5jcmVkZW50aWFsc0ZvckNyYXNoUmVwb3J0VXBsb2FkLnVzZXJuYW1lIHx8ICF0aGlzLmNyZWRlbnRpYWxzRm9yQ3Jhc2hSZXBvcnRVcGxvYWQucGFzc3dvcmQpIHtcbiAgICAgICAgICAgIHJldHVybiBCU3RhY2tMb2dnZXIuZXJyb3IoJ1tDcmFzaF9SZXBvcnRfVXBsb2FkXSBGYWlsZWQgdG8gcGFyc2UgdXNlciBjcmVkZW50aWFscyB3aGlsZSByZXBvcnRpbmcgY3Jhc2gnKVxuICAgICAgICB9XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmIChPYmplY3Qua2V5cyh0aGlzLnVzZXJDb25maWdGb3JSZXBvcnRpbmcpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHRoaXMudXNlckNvbmZpZ0ZvclJlcG9ydGluZyA9IHByb2Nlc3MuZW52LlVTRVJfQ09ORklHX0ZPUl9SRVBPUlRJTkcgIT09IHVuZGVmaW5lZCA/IEpTT04ucGFyc2UocHJvY2Vzcy5lbnYuVVNFUl9DT05GSUdfRk9SX1JFUE9SVElORykgOiB7fVxuICAgICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLmVycm9yKGBbQ3Jhc2hfUmVwb3J0X1VwbG9hZF0gRmFpbGVkIHRvIHBhcnNlIHVzZXIgY29uZmlnIHdoaWxlIHJlcG9ydGluZyBjcmFzaCBkdWUgdG8gJHtlcnJvcn1gKVxuICAgICAgICAgICAgdGhpcy51c2VyQ29uZmlnRm9yUmVwb3J0aW5nID0ge31cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGRhdGEgPSB7XG4gICAgICAgICAgICBoYXNoZWRfaWQ6IHByb2Nlc3MuZW52W0JST1dTRVJTVEFDS19URVNUSFVCX1VVSURdLFxuICAgICAgICAgICAgb2JzZXJ2YWJpbGl0eV92ZXJzaW9uOiB7XG4gICAgICAgICAgICAgICAgZnJhbWV3b3JrTmFtZTogV0RJT19OQU1JTkdfUFJFRklYICsgKHRoaXMudXNlckNvbmZpZ0ZvclJlcG9ydGluZy5mcmFtZXdvcmsgfHwgJ251bGwnKSxcbiAgICAgICAgICAgICAgICBzZGtWZXJzaW9uOiBCU1RBQ0tfU0VSVklDRV9WRVJTSU9OXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZXhjZXB0aW9uOiB7XG4gICAgICAgICAgICAgICAgZXJyb3I6IGV4Y2VwdGlvbi50b1N0cmluZygpLFxuICAgICAgICAgICAgICAgIHN0YWNrVHJhY2U6IHN0YWNrVHJhY2VcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjb25maWc6IHRoaXMudXNlckNvbmZpZ0ZvclJlcG9ydGluZ1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHVybCA9IGAke0FQSVV0aWxzLkRBVEFfRU5EUE9JTlR9L2FwaS92MS9hbmFseXRpY3NgXG5cbiAgICAgICAgY29uc3QgZW5jb2RlZEF1dGggPSBCdWZmZXIuZnJvbShgJHt0aGlzLmNyZWRlbnRpYWxzRm9yQ3Jhc2hSZXBvcnRVcGxvYWQudXNlcm5hbWV9OiR7dGhpcy5jcmVkZW50aWFsc0ZvckNyYXNoUmVwb3J0VXBsb2FkLnBhc3N3b3JkfWAsICd1dGY4JykudG9TdHJpbmcoJ2Jhc2U2NCcpXG4gICAgICAgIGNvbnN0IGhlYWRlcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgICAgICAgICAuLi5ERUZBVUxUX1JFUVVFU1RfQ09ORklHLmhlYWRlcnMsXG4gICAgICAgICAgICBBdXRob3JpemF0aW9uOiBgQmFzaWMgJHtlbmNvZGVkQXV0aH1gLFxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh1cmwsIHtcbiAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoZGF0YSksXG4gICAgICAgICAgICBoZWFkZXJzXG4gICAgICAgIH0pXG5cbiAgICAgICAgaWYgKHJlc3BvbnNlLm9rKSB7XG4gICAgICAgICAgICBsZXQgYm9keSA9IGF3YWl0IHJlc3BvbnNlLnRleHQoKVxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBib2R5ID0gSlNPTi5zdHJpbmdpZnkoSlNPTi5wYXJzZShib2R5KSlcbiAgICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgICAgIC8vIFJlc3BvbnNlIGlzIG5vdCBKU09OLCB1c2UgdGV4dCBhcy1pc1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLmRlYnVnKGBbQ3Jhc2hfUmVwb3J0X1VwbG9hZF0gU3VjY2VzcyByZXNwb25zZTogJHtib2R5fWApXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBCU3RhY2tMb2dnZXIuZXJyb3IoYFtDcmFzaF9SZXBvcnRfVXBsb2FkXSBGYWlsZWQgZHVlIHRvICR7cmVzcG9uc2UuYm9keX1gKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgc3RhdGljIHJlY3Vyc2l2ZWx5UmVkYWN0S2V5c0Zyb21PYmplY3Qob2JqOiBEaWN0IHwgQXJyYXk8RGljdD4sIGtleXM6IHN0cmluZ1tdKSB7XG4gICAgICAgIGlmICghb2JqKSB7XG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShvYmopKSB7XG4gICAgICAgICAgICBvYmoubWFwKGVsZSA9PiB0aGlzLnJlY3Vyc2l2ZWx5UmVkYWN0S2V5c0Zyb21PYmplY3QoZWxlLCBrZXlzKSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgcHJvcCBpbiBvYmopIHtcbiAgICAgICAgICAgICAgICBpZiAoa2V5cy5pbmNsdWRlcyhwcm9wLnRvTG93ZXJDYXNlKCkpKSB7XG4gICAgICAgICAgICAgICAgICAgIG9ialtwcm9wXSA9ICdbUkVEQUNURURdJ1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIG9ialtwcm9wXSA9PT0gJ29iamVjdCcgJiYgb2JqW3Byb3BdICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVjdXJzaXZlbHlSZWRhY3RLZXlzRnJvbU9iamVjdChvYmpbcHJvcF0gYXMgRGljdCB8IEFycmF5PERpY3Q+LCBrZXlzKVxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIG9ialtwcm9wXSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhcnNlZCA9IEpTT04ucGFyc2Uob2JqW3Byb3BdIGFzIHN0cmluZylcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgcGFyc2VkID09PSAnb2JqZWN0JyAmJiBwYXJzZWQgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlY3Vyc2l2ZWx5UmVkYWN0S2V5c0Zyb21PYmplY3QocGFyc2VkIGFzIERpY3QgfCBBcnJheTxEaWN0Piwga2V5cylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmpbcHJvcF0gPSBKU09OLnN0cmluZ2lmeShwYXJzZWQpXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gTm90IHZhbGlkIEpTT04sIGxlYXZlIGFzLWlzXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzdGF0aWMgZGVsZXRlUElJS2V5c0Zyb21PYmplY3Qob2JqOiB7IFtrZXk6IHN0cmluZ106IHVua25vd24gfSkge1xuICAgICAgICBpZiAoIW9iaikge1xuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgICAgWyd1c2VyJywgJ3VzZXJuYW1lJywgJ2tleScsICdhY2Nlc3NLZXknXS5mb3JFYWNoKGtleSA9PiBkZWxldGUgb2JqW2tleV0pXG4gICAgfVxuXG4gICAgc3RhdGljIGZpbHRlckNhcGFiaWxpdGllcyhjYXBhYmlsaXRpZXM6IENhcGFiaWxpdGllcy5UZXN0cnVubmVyQ2FwYWJpbGl0aWVzKSB7XG4gICAgICAgIGNvbnN0IGNhcHNDb3B5ID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShjYXBhYmlsaXRpZXMpKVxuICAgICAgICB0aGlzLnJlY3Vyc2l2ZWx5UmVkYWN0S2V5c0Zyb21PYmplY3QoY2Fwc0NvcHksIFsnZXh0ZW5zaW9ucyddKVxuICAgICAgICByZXR1cm4gY2Fwc0NvcHlcbiAgICB9XG5cbiAgICBzdGF0aWMgZmlsdGVyUElJKHVzZXJDb25maWc6IE9wdGlvbnMuVGVzdHJ1bm5lcikge1xuICAgICAgICBjb25zdCBjb25maWdXaXRob3V0UElJID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh1c2VyQ29uZmlnKSlcbiAgICAgICAgdGhpcy5kZWxldGVQSUlLZXlzRnJvbU9iamVjdChjb25maWdXaXRob3V0UElJKVxuICAgICAgICBjb25zdCBmaW5hbFNlcnZpY2VzID0gW11cbiAgICAgICAgY29uc3QgaW5pdGlhbFNlcnZpY2VzID0gY29uZmlnV2l0aG91dFBJSS5zZXJ2aWNlc1xuICAgICAgICBkZWxldGUgY29uZmlnV2l0aG91dFBJSS5zZXJ2aWNlc1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBzZXJ2aWNlQXJyYXkgb2YgaW5pdGlhbFNlcnZpY2VzKSB7XG4gICAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoc2VydmljZUFycmF5KSAmJiBzZXJ2aWNlQXJyYXkubGVuZ3RoID49IDIgJiYgc2VydmljZUFycmF5WzBdID09PSAnYnJvd3NlcnN0YWNrJykge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpZHggPSAxOyBpZHggPCBzZXJ2aWNlQXJyYXkubGVuZ3RoOyBpZHgrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZWxldGVQSUlLZXlzRnJvbU9iamVjdChzZXJ2aWNlQXJyYXlbaWR4XSlcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZXJ2aWNlQXJyYXlbaWR4XSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEhhbmRsZSBib3RoIG5ldyB0ZXN0UmVwb3J0aW5nT3B0aW9ucyBhbmQgbGVnYWN5IHRlc3RPYnNlcnZhYmlsaXR5T3B0aW9uc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGVsZXRlUElJS2V5c0Zyb21PYmplY3Qoc2VydmljZUFycmF5W2lkeF0udGVzdFJlcG9ydGluZ09wdGlvbnMpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZWxldGVQSUlLZXlzRnJvbU9iamVjdChzZXJ2aWNlQXJyYXlbaWR4XS50ZXN0T2JzZXJ2YWJpbGl0eU9wdGlvbnMpXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZmluYWxTZXJ2aWNlcy5wdXNoKHNlcnZpY2VBcnJheSlcbiAgICAgICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgLyogV3JvbmcgY29uZmlndXJhdGlvbiBsaWtlIHN0cmluZ3MgaW5zdGVhZCBvZiBqc29uIG9iamVjdHMgY291bGQgYnJlYWsgdGhpcyBtZXRob2QsIG5lZWRzIG5vIGFjdGlvbiAqL1xuICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLmVycm9yKGBFcnJvciBpbiBwYXJzaW5nIHVzZXIgY29uZmlnIFBJSSB3aXRoIGVycm9yICR7ZXJyID8gKChlcnIgYXMgRXJyb3IpLnN0YWNrIHx8IGVycikgOiBlcnJ9YClcbiAgICAgICAgICAgIHJldHVybiBjb25maWdXaXRob3V0UElJXG4gICAgICAgIH1cbiAgICAgICAgY29uZmlnV2l0aG91dFBJSS5zZXJ2aWNlcyA9IGZpbmFsU2VydmljZXNcbiAgICAgICAgcmV0dXJuIGNvbmZpZ1dpdGhvdXRQSUlcbiAgICB9XG59XG4iLCAiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnXG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnXG5cbmltcG9ydCB0eXBlIHsgT3B0aW9ucyB9IGZyb20gJ0B3ZGlvL3R5cGVzJ1xuXG5pbXBvcnQgeyBCU3RhY2tMb2dnZXIgfSBmcm9tICcuL2JzdGFja0xvZ2dlci5qcydcbmltcG9ydCB7XG4gICAgQlJPV1NFUlNUQUNLX0RJU0FCTEVfQVVUT19DQVBUVVJFX0xPR1MsXG4gICAgQ09NUE9VTkRfU0VDUkVUX1NVRkZJWEVTX0NBTUVMLFxuICAgIENPTVBPVU5EX1NFQ1JFVF9TVUZGSVhFU19TTkFLRSxcbiAgICBQRU1fQkxPQ0tfUkVHRVgsXG4gICAgUEVNX1VOVEVSTUlOQVRFRF9SRUdFWCxcbiAgICBVUkxfVVNFUklORk9fUkVHRVgsXG4gICAgQlJPV1NFUlNUQUNLX1dESU9fQ09ORklHX0ZJTEVfUEFUSCxcbiAgICBCUk9XU0VSU1RBQ0tfV0RJT19DT05GSUdfU1RSQVRFR1ksXG4gICAgQ0FQVFVSRV9DT05GSUdfSU1QT1JUX0RFUFRILFxuICAgIERFRkFVTFRfV0RJT19DT05GSUdfQkFTRU5BTUUsXG4gICAgTUFYX0NBUFRVUkVEX0NPTkZJR19GSUxFUyxcbiAgICBNQVhfQ0FQVFVSRURfQ09ORklHX0ZJTEVfQllURVMsXG4gICAgTUFYX1BBQ0tBR0VfSlNPTl9XQUxLX1VQLFxuICAgIFJFREFDVEVEX0tFWVMsXG4gICAgU1VQUE9SVEVEX1dESU9fQ09ORklHX0VYVEVOU0lPTlMsXG4gICAgV0RJT19DTElfU1VCQ09NTUFORFNcbn0gZnJvbSAnLi9jb25zdGFudHMuanMnXG5cbmV4cG9ydCBpbnRlcmZhY2UgQ2FwdHVyZWRGaWxlIHtcbiAgICAvKiBhcmNoaXZlIGVudHJ5IG5hbWUgKGJhc2VuYW1lLCBkZS1kdXBsaWNhdGVkKSAqL1xuICAgIG5hbWU6IHN0cmluZ1xuICAgIC8qIGFic29sdXRlIHBhdGggdGhlIGNvbnRlbnQgY2FtZSBmcm9tICovXG4gICAgc291cmNlUGF0aDogc3RyaW5nXG4gICAgY29udGVudDogc3RyaW5nXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29uZmlnUGF0aFJlc29sdXRpb24ge1xuICAgIGNvbmZpZ1BhdGg/OiBzdHJpbmdcbiAgICAvKiB3aGljaCBsYWRkZXIgcnVuZyBhbnN3ZXJlZCBcdTIwMTQgcmVjb3JkZWQgb24gdGhlIFNES19VUExPQURfTE9HUyBldmVudCAqL1xuICAgIHN0cmF0ZWd5Pzogc3RyaW5nXG4gICAgLyogd2h5IG5vdGhpbmcgd2FzIGZvdW5kLCB3aGVuIGNvbmZpZ1BhdGggaXMgdW5kZWZpbmVkICovXG4gICAgcmVhc29uPzogc3RyaW5nXG59XG5cbmNvbnN0IGlzUmVhZGFibGVGaWxlID0gKGZpbGVQYXRoOiBzdHJpbmcpOiBib29sZWFuID0+IHtcbiAgICB0cnkge1xuICAgICAgICByZXR1cm4gZnMuZXhpc3RzU3luYyhmaWxlUGF0aCkgJiYgZnMuc3RhdFN5bmMoZmlsZVBhdGgpLmlzRmlsZSgpXG4gICAgfSBjYXRjaCB7XG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbn1cblxuLyoqXG4gKiBBY2NlcHQgYSBjb25maWcgcGF0aCB0aGUgd2F5IGBAd2Rpby9jbGlgIGRvZXM6IHRoZSB2YWx1ZSBhcyBzcGVsbGVkLCBlbHNlIHRoZSBzYW1lIHN0ZW1cbiAqIHByb2JlZCBhY3Jvc3MgdGhlIHN1cHBvcnRlZCBleHRlbnNpb25zLlxuICpcbiAqIFRoZSBwcm9iZSBpcyBub3QgZGVmZW5zaXZlIHBhZGRpbmcgXHUyMDE0IGl0IGlzIHJlcXVpcmVkLiBgY29tbWFuZHMvcnVuLnRzYCBoYW5kcyBgTGF1bmNoZXJgIHRoZVxuICogcGF0aCB0aGF0IGBjYW5BY2Nlc3NDb25maWdQYXRoYCBmb3VuZCwgYnV0IGxlYXZlcyBgY29uZmlnLXBhdGhgIHNldCB0byB3aGF0IHRoZSBVU0VSIHR5cGVkLFxuICogYW5kIGEgVHlwZVNjcmlwdCBwcm9qZWN0IGxlZ2FsbHkgc3BlbGxzIGEgYC50c2AgY29uZmlnIHdpdGggYC5qc2AuIFZlcmlmaWVkIGFnYWluc3QgYSByZWFsXG4gKiB3ZGlvIHJ1bjogYHdkaW8gcnVuIC4vY29uZmlncy9hLmNvbmYuanNgIHdpdGggb25seSBgY29uZmlncy9hLmNvbmYudHNgIG9uIGRpc2sgc3RhcnRzIGZpbmVcbiAqIGFuZCByZXBvcnRzIGBjb25maWctcGF0aDogJy4vY29uZmlncy9hLmNvbmYuanMnYCwgYSBwYXRoIHRoYXQgZG9lcyBub3QgZXhpc3QuXG4gKi9cbmNvbnN0IHJlc29sdmVDYW5kaWRhdGUgPSAodmFsdWU6IHVua25vd24pOiBzdHJpbmcgfCB1bmRlZmluZWQgPT4ge1xuICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICdzdHJpbmcnIHx8ICF2YWx1ZS50cmltKCkpIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZFxuICAgIH1cbiAgICB0cnkge1xuICAgICAgICBjb25zdCBmdWxsID0gcGF0aC5yZXNvbHZlKHByb2Nlc3MuY3dkKCksIHZhbHVlLnRyaW0oKSlcbiAgICAgICAgY29uc3QgZXh0ID0gcGF0aC5leHRuYW1lKGZ1bGwpXG4gICAgICAgIGNvbnN0IHN0ZW0gPSBTVVBQT1JURURfV0RJT19DT05GSUdfRVhURU5TSU9OUy5pbmNsdWRlcyhleHQpID8gZnVsbC5zbGljZSgwLCAtZXh0Lmxlbmd0aCkgOiBmdWxsXG4gICAgICAgIHJldHVybiBbZnVsbCwgLi4uU1VQUE9SVEVEX1dESU9fQ09ORklHX0VYVEVOU0lPTlMubWFwKChlKSA9PiBgJHtzdGVtfSR7ZX1gKV1cbiAgICAgICAgICAgIC5maW5kKGlzUmVhZGFibGVGaWxlKVxuICAgIH0gY2F0Y2gge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkXG4gICAgfVxufVxuXG4vKipcbiAqIGN3ZC1yZWxhdGl2ZSBmb3JtIG9mIGEgRklMRSBwYXRoLCBmb3IgYW55dGhpbmcgdGhhdCBnZXRzIHVwbG9hZGVkLlxuICpcbiAqIFRoZSBiYXNlbmFtZSBmYWxsYmFjayBpcyBzYWZlIGhlcmUgb25seSBiZWNhdXNlIGBwYXRoLnJlbGF0aXZlYCBpcyBuZXZlciBlbXB0eSBmb3IgYSBmaWxlIFx1MjAxNFxuICogYSBmaWxlIGlzIG5ldmVyIGVxdWFsIHRvIGN3ZC4gRG8gTk9UIHBhc3MgYSBkaXJlY3Rvcnk6IHNlZSBgcmVsYXRpdmVEaXJUb0N3ZGAuXG4gKi9cbmV4cG9ydCBjb25zdCByZWxhdGl2ZVRvQ3dkID0gKGZpbGVQYXRoOiBzdHJpbmcpOiBzdHJpbmcgPT4ge1xuICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBwYXRoLnJlbGF0aXZlKHByb2Nlc3MuY3dkKCksIGZpbGVQYXRoKSB8fCBwYXRoLmJhc2VuYW1lKGZpbGVQYXRoKVxuICAgIH0gY2F0Y2gge1xuICAgICAgICByZXR1cm4gcGF0aC5iYXNlbmFtZShmaWxlUGF0aClcbiAgICB9XG59XG5cbi8qKlxuICogY3dkLXJlbGF0aXZlIGZvcm0gb2YgYSBESVJFQ1RPUlkgcGF0aC5cbiAqXG4gKiBgcGF0aC5yZWxhdGl2ZShjd2QsIGN3ZClgIGlzIGAnJ2AsIHdoaWNoIGlzIHRoZSBDT01NT04gY2FzZSBoZXJlIChhIG1hbmlmZXN0IGF0IHRoZSBwcm9qZWN0XG4gKiByb290KSwgc28gYSBiYXNlbmFtZSBmYWxsYmFjayB3b3VsZCByZXBvcnQgdGhlIGZvbGRlciBuYW1lIFx1MjAxNCBhbmQgZm9yIGEgcHJvamVjdCBjaGVja2VkIG91dFxuICogZGlyZWN0bHkgaW4gYCRIT01FYCB0aGF0IGZvbGRlciBuYW1lIGlzIHRoZSBPUyB1c2VybmFtZSwgd2hpY2ggaXMgdGhlIGV4YWN0IGV4cG9zdXJlIHRoZVxuICogcmVsYXRpdmUtcGF0aCBoYW5kbGluZyBleGlzdHMgdG8gcHJldmVudC4gRW1wdHkgbWVhbnMgXCJjd2RcIiwgc28gcmVuZGVyIGl0IGFzIGAuYC5cbiAqL1xuZXhwb3J0IGNvbnN0IHJlbGF0aXZlRGlyVG9Dd2QgPSAoZGlyOiBzdHJpbmcpOiBzdHJpbmcgPT4ge1xuICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBwYXRoLnJlbGF0aXZlKHByb2Nlc3MuY3dkKCksIGRpcikgfHwgJy4nXG4gICAgfSBjYXRjaCB7XG4gICAgICAgIHJldHVybiAnLidcbiAgICB9XG59XG5cbi8qKlxuICogUmVzb2x2ZSB0aGUgYWJzb2x1dGUgcGF0aCBvZiB0aGUgdXNlcidzIHdkaW8gY29uZmlnIGZpbGUuXG4gKlxuICogV0RJTyBrZWVwcyB0aGUgcmVhbCBwYXRoIGluIGBDb25maWdQYXJzZXJgJ3MgcHJpdmF0ZSBgI2NvbmZpZ0ZpbGVQYXRoYCwgd2hpY2ggbm8gc2VydmljZSBjYW5cbiAqIHJlYWNoLCBzbyB0aGlzIHJlY29uc3RydWN0cyBpdCBmcm9tIHRoZSB2YWx1ZXMgdGhlIENMSSBkb2VzIGxlYXZlIG9uIHRoZSBtZXJnZWQgY29uZmlnIFx1MjAxNFxuICogbWlycm9yaW5nIGhvdyBgQHdkaW8vY2xpYCBpdHNlbGYgcmVzb2x2ZXMgaXQuIFRoZSBDTEkgbmV2ZXIgc2VhcmNoZXM6IGl0IHRha2VzIG9uZSBjYW5kaWRhdGVcbiAqIGFuZCBwcm9iZXMgb25lIHN0ZW0gYWNyb3NzIHRoZSBzdXBwb3J0ZWQgZXh0ZW5zaW9ucywgc28gbmVpdGhlciBkb2VzIHRoaXMuXG4gKlxuICogICAxLiBCUk9XU0VSU1RBQ0tfV0RJT19DT05GSUdfRklMRV9QQVRIICBcdTIwMTQgZXhwbGljaXQgb3ZlcnJpZGUgLyBzdXBwb3J0IGVzY2FwZSBoYXRjaFxuICogICAyLiBjb25maWdbJ2NvbmZpZy1wYXRoJ10gICAgICAgICAgICAgICBcdTIwMTQgeWFyZ3MnIGtlYmFiIGFsaWFzIG9mIHRoZSBgcnVuIDxjb25maWdQYXRoPmBcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbmFsICh2OCBhbmQgdjkgYWxpa2UpXG4gKiAgIDMuIGNvbmZpZy5fWzBdICAgICAgICAgICAgICAgICAgICAgICAgIFx1MjAxNCB0aGUgYmFyZSBgd2RpbyA8Y29uZmlnPmAgZm9ybSwgd2hpY2ggYHJ1bi50c2BcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdHNlbGYgcmVzb2x2ZXMgZnJvbSBgcGFyYW1zLl9bMF1gXG4gKiAgIDQuIHJvb3REaXIgKyB3ZGlvLmNvbmYuPGV4dD4gICAgICAgICAgIFx1MjAxNCBuby1hcmcgYHdkaW9gLCBhbmQgcHJvZ3JhbW1hdGljIGBuZXcgTGF1bmNoZXIoKWBcbiAqICAgNS4gY3dkICsgd2Rpby5jb25mLjxleHQ+ICAgICAgICAgICAgICAgXHUyMDE0IHdoZW4gdGhlIHVzZXIgb3ZlcnJpZGVzIGByb290RGlyYCBpbiB0aGVpciBjb25maWdcbiAqXG4gKiBgY29uZmlnLl9gIGlzIHJlYWQgcmF0aGVyIHRoYW4gcmF3IGBwcm9jZXNzLmFyZ3ZgOiBpdCBpcyB0aGUgc2FtZSBwb3NpdGlvbmFsIEFGVEVSIHlhcmdzIGhhc1xuICogYXBwbGllZCB3ZGlvJ3Mgb3duIG9wdGlvbiBkZWNsYXJhdGlvbnMuIFNjYW5uaW5nIGFyZ3YgbWVhbnMgcmUtaW1wbGVtZW50aW5nIHRoYXQgd2l0aCBhXG4gKiBoZXVyaXN0aWMgdGhhdCBjYW5ub3Qga25vdyB3aGljaCBmbGFncyBhcmUgYm9vbGVhbiBcdTIwMTQgYW5kIGB3ZGlvIC0td2F0Y2ggLi9hLmNvbmYudHNgIHB1dHMgdGhlXG4gKiByZWFsIGNvbmZpZyBpbiBgX1swXWAgd2hpbGUgYW55IFwic2tpcCBhIGZsYWcncyB2YWx1ZVwiIHJ1bGUgdGhyb3dzIGl0IGF3YXkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlV2Rpb0NvbmZpZ1BhdGgoY29uZmlnPzogT3B0aW9ucy5UZXN0cnVubmVyKTogQ29uZmlnUGF0aFJlc29sdXRpb24ge1xuICAgIGNvbnN0IHJlY29yZCA9IChjb25maWcgfHwge30pIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+XG5cbiAgICB0cnkge1xuICAgICAgICBjb25zdCBwb3NpdGlvbmFscyA9IEFycmF5LmlzQXJyYXkocmVjb3JkLl8pID8gcmVjb3JkLl8gYXMgdW5rbm93bltdIDogW11cbiAgICAgICAgY29uc3QgcG9zaXRpb25hbCA9IHBvc2l0aW9uYWxzLmZpbHRlcihcbiAgICAgICAgICAgIChlbnRyeSk6IGVudHJ5IGlzIHN0cmluZyA9PiB0eXBlb2YgZW50cnkgPT09ICdzdHJpbmcnICYmICFXRElPX0NMSV9TVUJDT01NQU5EUy5pbmNsdWRlcyhlbnRyeSlcbiAgICAgICAgKVswXVxuICAgICAgICBjb25zdCByb290RGlyID0gdHlwZW9mIHJlY29yZC5yb290RGlyID09PSAnc3RyaW5nJyA/IHJlY29yZC5yb290RGlyIDogdW5kZWZpbmVkXG5cbiAgICAgICAgY29uc3QgcnVuZ3M6IEFycmF5PFtzdHJpbmcsIHVua25vd25dPiA9IFtcbiAgICAgICAgICAgIFsnZW52X292ZXJyaWRlJywgcHJvY2Vzcy5lbnZbQlJPV1NFUlNUQUNLX1dESU9fQ09ORklHX0ZJTEVfUEFUSF1dLFxuICAgICAgICAgICAgWydjbGlfY29uZmlnX3BhdGgnLCByZWNvcmRbJ2NvbmZpZy1wYXRoJ11dLFxuICAgICAgICAgICAgWydjb25maWdfcG9zaXRpb25hbCcsIHBvc2l0aW9uYWxdLFxuICAgICAgICAgICAgWydyb290X2Rpcl9kZWZhdWx0Jywgcm9vdERpciAmJiBwYXRoLmpvaW4ocm9vdERpciwgREVGQVVMVF9XRElPX0NPTkZJR19CQVNFTkFNRSldLFxuICAgICAgICAgICAgWydjd2RfZGVmYXVsdCcsIERFRkFVTFRfV0RJT19DT05GSUdfQkFTRU5BTUVdXG4gICAgICAgIF1cblxuICAgICAgICBmb3IgKGNvbnN0IFtzdHJhdGVneSwgdmFsdWVdIG9mIHJ1bmdzKSB7XG4gICAgICAgICAgICBjb25zdCBjb25maWdQYXRoID0gcmVzb2x2ZUNhbmRpZGF0ZSh2YWx1ZSlcbiAgICAgICAgICAgIGlmIChjb25maWdQYXRoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgY29uZmlnUGF0aCwgc3RyYXRlZ3kgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHsgcmVhc29uOiAnY29uZmlnX25vdF9mb3VuZCcgfVxuICAgIH0gY2F0Y2gge1xuICAgICAgICByZXR1cm4geyByZWFzb246ICdjb25maWdfcmVzb2x2ZV9leGNlcHRpb24nIH1cbiAgICB9XG59XG5cbi8qKlxuICogUmVzb2x2ZSBvbmNlLCBhcyBlYXJseSBhcyBwb3NzaWJsZSwgYW5kIHB1Ymxpc2ggdGhlIGFuc3dlciBvbiB0aGUgZW52aXJvbm1lbnQgc28gdGhlXG4gKiB1cGxvYWQgcGF0aCAoYW5kIGFueSB3b3JrZXIpIHJlYWRzIHRoZSBTQU1FIHZhbHVlIGluc3RlYWQgb2YgcmUtZGVyaXZpbmcgaXQgZnJvbSBjd2QuXG4gKlxuICogUmUtcmVzb2x2aW5nIGF0IGFyY2hpdmUgdGltZSBpcyBwcmVjaXNlbHkgdGhlIGJ1ZyBTREstNTk5MyBmaXhlZCBpbiB0aGUgTm9kZSBTREs6IHRoZVxuICogYXJjaGl2ZSBzdGVwIHJlYWQgYGN3ZC9icm93c2Vyc3RhY2sueW1sYCB3aGlsZSBzdGFydHVwIGhhZCByZXNvbHZlZCBhIGRpZmZlcmVudCBwYXRoLFxuICogc2lsZW50bHkgZHJvcHBpbmcgdGhlIGNvbmZpZyBmb3IgZXZlcnkgbW9ub3JlcG8gLyBzdWJkaXIgQ0kgcnVuLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaW5pdFdkaW9Db25maWdQYXRoKGNvbmZpZz86IE9wdGlvbnMuVGVzdHJ1bm5lcik6IENvbmZpZ1BhdGhSZXNvbHV0aW9uIHtcbiAgICB0cnkge1xuICAgICAgICBjb25zdCBhbHJlYWR5UmVzb2x2ZWQgPSBwcm9jZXNzLmVudltCUk9XU0VSU1RBQ0tfV0RJT19DT05GSUdfRklMRV9QQVRIXVxuICAgICAgICBpZiAoYWxyZWFkeVJlc29sdmVkKSB7XG4gICAgICAgICAgICAvLyBSZXBvcnQgdGhlIHJ1bmcgdGhhdCBPUklHSU5BTExZIGFuc3dlcmVkLCBub3QgdGhlIGVudiB2YXIgdGhpcyBmdW5jdGlvblxuICAgICAgICAgICAgLy8gaXRzZWxmIHdyb3RlIFx1MjAxNCBvdGhlcndpc2UgZXZlcnkgcnVuIHJlcG9ydHMgYGVudl9vdmVycmlkZWAgYW5kIHRoZSBtZXRyaWNcbiAgICAgICAgICAgIC8vIGNhbiBuZXZlciB0ZWxsIHVzIGhvdyBvZnRlbiB0aGUgZmFsbGJhY2tzIGFyZSBjYXJyeWluZyBjdXN0b21lcnMuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGNvbmZpZ1BhdGg6IGFscmVhZHlSZXNvbHZlZCxcbiAgICAgICAgICAgICAgICBzdHJhdGVneTogcHJvY2Vzcy5lbnZbQlJPV1NFUlNUQUNLX1dESU9fQ09ORklHX1NUUkFURUdZXSB8fCAnZW52X292ZXJyaWRlJ1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVzb2x1dGlvbiA9IHJlc29sdmVXZGlvQ29uZmlnUGF0aChjb25maWcpXG4gICAgICAgIGlmIChyZXNvbHV0aW9uLmNvbmZpZ1BhdGgpIHtcbiAgICAgICAgICAgIHByb2Nlc3MuZW52W0JST1dTRVJTVEFDS19XRElPX0NPTkZJR19GSUxFX1BBVEhdID0gcmVzb2x1dGlvbi5jb25maWdQYXRoXG4gICAgICAgICAgICBpZiAocmVzb2x1dGlvbi5zdHJhdGVneSkge1xuICAgICAgICAgICAgICAgIHByb2Nlc3MuZW52W0JST1dTRVJTVEFDS19XRElPX0NPTkZJR19TVFJBVEVHWV0gPSByZXNvbHV0aW9uLnN0cmF0ZWd5XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBSZWxhdGl2ZSB0byBjd2Q6IHRoaXMgbG9nIGZpbGUgaXMgaXRzZWxmIHVwbG9hZGVkLCBhbmQgYW4gYWJzb2x1dGUgcGF0aCBsZWFrc1xuICAgICAgICAgICAgLy8gdGhlIE9TIHVzZXJuYW1lIGFuZCBkaXJlY3RvcnkgbGF5b3V0IChgL1VzZXJzL2phbmUuZG9lLy4uLmApLiBgcGF0aC5yZWxhdGl2ZWBcbiAgICAgICAgICAgIC8vIHN0aWxsIHlpZWxkcyBgLi4vLi4vc2hhcmVkL3dkaW8uY29uZi50c2AgZm9yIGEgY29uZmlnIG91dHNpZGUgY3dkLCBzbyB0aGVcbiAgICAgICAgICAgIC8vIG1vbm9yZXBvL3N1YmRpciBkaWFnbm9zdGljIFx1MjAxNCB3aGljaCBpcyB0aGUgd2hvbGUgcG9pbnQgb2YgbG9nZ2luZyBpdCBcdTIwMTQgc3Vydml2ZXMuXG4gICAgICAgICAgICAvLyBQYXRoIGJlZm9yZSBzdHJhdGVneTogQlN0YWNrTG9nZ2VyIHNjcnVicyBhbnkgYDwuLi4+a2V5OmAvYDwuLi4+dXNlcjpgIHByZWZpeGVkXG4gICAgICAgICAgICAvLyB2YWx1ZSwgc28gYSBzdHJhdGVneSBuYW1lIGVuZGluZyBpbiBga2V5YC9gdXNlcmAgaGVyZSB3b3VsZCByZWRhY3QgdGhlIHBhdGguXG4gICAgICAgICAgICBCU3RhY2tMb2dnZXIuZGVidWcoYFJlc29sdmVkIHdkaW8gY29uZmlnIGZpbGUgJHtyZWxhdGl2ZVRvQ3dkKHJlc29sdXRpb24uY29uZmlnUGF0aCl9IGZvciBhdXRvLWNhcHR1cmUgKHN0cmF0ZWd5ICR7cmVzb2x1dGlvbi5zdHJhdGVneX0pYClcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIEJTdGFja0xvZ2dlci5kZWJ1ZyhgQ291bGQgbm90IHJlc29sdmUgd2RpbyBjb25maWcgZmlsZSBmb3IgYXV0by1jYXB0dXJlOiAke3Jlc29sdXRpb24ucmVhc29ufWApXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc29sdXRpb25cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBCU3RhY2tMb2dnZXIuZGVidWcoYEVycm9yIHdoaWxlIHJlc29sdmluZyB3ZGlvIGNvbmZpZyBmaWxlOiAke2Vycm9yfWApXG4gICAgICAgIHJldHVybiB7IHJlYXNvbjogJ2NvbmZpZ19yZXNvbHZlX2V4Y2VwdGlvbicgfVxuICAgIH1cbn1cblxuLyoqXG4gKiBPcHQtb3V0IGZvciBhdXRvLWNhcHR1cmVkIGxvZ3MuIFNlcnZpY2Ugb3B0aW9uIGZpcnN0LCBlbnYgdmFyIGFzIHRoZSBDSSBlc2NhcGUgaGF0Y2hcbiAqIChjdXN0b21lcnMgY2Fubm90IGFsd2F5cyBlZGl0IGEgY29tbWl0dGVkIGNvbmZpZykuIE5hbWUgbWF0Y2hlcyB0aGUgTm9kZSBTREsnc1xuICogYGRpc2FibGVBdXRvQ2FwdHVyZUxvZ3NgIHNvIHRoZSBmbGFnIG1lYW5zIHRoZSBzYW1lIHRoaW5nIGFjcm9zcyBCcm93c2VyU3RhY2sgU0RLcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzQXV0b0NhcHR1cmVMb2dzRGlzYWJsZWQob3B0aW9ucz86IHsgZGlzYWJsZUF1dG9DYXB0dXJlTG9ncz86IGJvb2xlYW4gfSk6IGJvb2xlYW4ge1xuICAgIGlmIChvcHRpb25zPy5kaXNhYmxlQXV0b0NhcHR1cmVMb2dzID09PSB0cnVlKSB7XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuICAgIHJldHVybiBTdHJpbmcocHJvY2Vzcy5lbnZbQlJPV1NFUlNUQUNLX0RJU0FCTEVfQVVUT19DQVBUVVJFX0xPR1NdIHx8ICcnKS50b0xvd2VyQ2FzZSgpID09PSAndHJ1ZSdcbn1cblxuLyoqXG4gKiBNaXJyb3IgdGhlIHNlcnZpY2Ugb3B0aW9uIG9udG8gdGhlIGVudmlyb25tZW50IHNvIHRoZSBvcHQtb3V0IHN1cnZpdmVzIGludG8gdGhlXG4gKiBERVRBQ0hFRCBjbGVhbnVwIHByb2Nlc3MsIHdoaWNoIGdldHMgbm8gb3B0aW9ucyBvYmplY3QuXG4gKlxuICogV2l0aG91dCB0aGlzIHRoZSBvcHQtb3V0IGlzIHdvcnNlIHRoYW4gdXNlbGVzczogc2tpcHBpbmcgdGhlIHVwbG9hZCBsZWF2ZXNcbiAqIGBsb2dzVXBsb2FkZWRgIGZhbHNlLCB3aGljaCBpcyBleGFjdGx5IHRoZSBjb25kaXRpb24gdGhhdCBhcm1zIHRoZSBleGl0LXRpbWVcbiAqIGAtLXVwbG9hZExvZ3NgIHJlc2N1ZSBcdTIwMTQgc28gZXZlcnkgb3B0ZWQtb3V0IHJ1biBoYWQgaXRzIGNvbmZpZyByZWFkIGFuZCBQT1NUZWQgYnkgdGhlXG4gKiBjbGVhbnVwIGNoaWxkLiBSZXR1cm5zIHdoZXRoZXIgYXV0by1jYXB0dXJlIGlzIGRpc2FibGVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcHVibGlzaEF1dG9DYXB0dXJlRGlzYWJsZWQob3B0aW9ucz86IHsgZGlzYWJsZUF1dG9DYXB0dXJlTG9ncz86IGJvb2xlYW4gfSk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGRpc2FibGVkID0gaXNBdXRvQ2FwdHVyZUxvZ3NEaXNhYmxlZChvcHRpb25zKVxuICAgIGlmIChkaXNhYmxlZCkge1xuICAgICAgICBwcm9jZXNzLmVudltCUk9XU0VSU1RBQ0tfRElTQUJMRV9BVVRPX0NBUFRVUkVfTE9HU10gPSAndHJ1ZSdcbiAgICB9XG4gICAgcmV0dXJuIGRpc2FibGVkXG59XG5cbi8qKlxuICogTGluZS1sZXZlbCBjcmVkZW50aWFsIHNjcnViLCBwb3J0ZWQgZnJvbSB0aGUgTm9kZSBTREsncyBgcmVkYWN0U2Vuc2l0aXZlQ29udGVudGAuXG4gKlxuICogQW55IGxpbmUgbWVudGlvbmluZyBhIHNlbnNpdGl2ZSBrZXkgY29sbGFwc2VzIHRvIGA8a2V5PjogW1JFREFDVEVEXWAuIFdvcmQgYm91bmRhcmllc1xuICoga2VlcCBgaG90a2V5YCAvIGBrZXl3b3JkYCBmcm9tIHRyaXBwaW5nIHRoZSBiYXJlIGBrZXlgIGVudHJ5IHRoYXQgV0RJTydzIHRvcC1sZXZlbFxuICogY3JlZGVudGlhbCBvcHRpb25zIGZvcmNlIHVzIHRvIGNhcnJ5LiBgLmAgaXMgaW50ZW50aW9uYWxseSBOT1QgcGFydCBvZiB0aGUgYm91bmRhcnlcbiAqIGNsYXNzIHNvIGBic3RhY2tPcHRpb25zLmFjY2Vzc0tleSA9ICcuLi4nYCBzdGlsbCBtYXRjaGVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVkYWN0U2Vuc2l0aXZlQ29udGVudCh0ZXh0OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmICghdGV4dCkge1xuICAgICAgICByZXR1cm4gdGV4dFxuICAgIH1cblxuICAgIGNvbnN0IGVzY2FwZVJlZ2V4ID0gKHZhbHVlOiBzdHJpbmcpID0+IHZhbHVlLnJlcGxhY2UoL1suKis/XiR7fSgpfFtcXF1cXFxcXS9nLCAnXFxcXCQmJylcbiAgICAvLyBsb25nZXN0IGZpcnN0OiBhbHRlcm5hdGlvbiByZXR1cm5zIHRoZSBmaXJzdCBtYXRjaCwgbm90IHRoZSBsb25nZXN0IG9uZVxuICAgIGNvbnN0IGtleXMgPSBbLi4uUkVEQUNURURfS0VZU11cbiAgICAgICAgLnNvcnQoKGEsIGIpID0+IGIubGVuZ3RoIC0gYS5sZW5ndGgpXG4gICAgICAgIC5tYXAoZXNjYXBlUmVnZXgpXG4gICAgICAgIC5qb2luKCd8JylcbiAgICBjb25zdCByZWRhY3RSZWdleCA9IG5ldyBSZWdFeHAoYF4uKj8oPzwhW0EtWmEtejAtOV8kXSkoJHtrZXlzfSkoPyFbQS1aYS16MC05XyRdKS4qJGAsICdnbWknKVxuXG4gICAgLy8gQ29tcG91bmQgaWRlbnRpZmllcnMgZW5kaW5nIGluIGEgc2Vuc2l0aXZlIHdvcmQsIHdoaWNoIHRoZSB3aG9sZS13b3JkIHBhc3MgYWJvdmVcbiAgICAvLyBjYW5ub3Qgc2VlOiBpdHMgbG9va2JlaGluZCByZWplY3RzIHRoZSBwcmVjZWRpbmcgbGV0dGVyIGluIGBjbGllbnRTZWNyZXRgIC9cbiAgICAvLyBgcmVmcmVzaFRva2VuYCAvIGBwcml2YXRlS2V5YCwgYW5kIHRoZSBwcmVjZWRpbmcgYF9gIGluIGBjbGllbnRfc2VjcmV0YC5cbiAgICAvL1xuICAgIC8vIGNhbWVsQ2FzZSBzdGF5cyBjYXNlLVNFTlNJVElWRTogcmVxdWlyaW5nIGEgY2FwaXRhbGlzZWQgc3VmZml4IGlzIHdoYXQgc2VwYXJhdGVzXG4gICAgLy8gYHByaXZhdGVLZXlgIGZyb20gYGhvdGtleWAsIHNvIHRoaXMgY2xvc2VzIHRoZSBsZWFrIHdpdGhvdXQgdGhlIGZhbHNlIHBvc2l0aXZlcyBhXG4gICAgLy8gYmFyZSAva2V5fHRva2VufHNlY3JldC8gcGFzcyB3b3VsZCBwcm9kdWNlLiBUaGUgY29yZSBkb2VzIE5PVCByZXF1aXJlIGEgbG93ZXJjYXNlXG4gICAgLy8gY2hhciBiZWZvcmUgdGhlIHN1ZmZpeCBcdTIwMTQgdGhhdCBndWFyZCBvbmx5IGV2ZXIgZHVwbGljYXRlZCB0aGUgY2FzZS1zZW5zaXRpdml0eSwgd2hpbGVcbiAgICAvLyByZWplY3RpbmcgYWNyb255bSBwcmVmaXhlcyAoYEFQSVRva2VuYCwgYEpXVFNlY3JldGAsIGBTU0hLZXlgLCBgQVdTU2VjcmV0YCkuXG4gICAgLy8gSWRlbnRpZmllciBzY2FucyBhcmUgYm91bmRlZCBhdCA2NCBjaGFycy4gUmVhbCBjb25maWcga2V5cyBhcmUgZmFyIHNob3J0ZXIsIHNvIHRoaXNcbiAgICAvLyBjaGFuZ2VzIG5vIG1hdGNoOyBpdCBpcyBkZWZlbmNlLWluLWRlcHRoIGFnYWluc3QgYmFja3RyYWNraW5nIG9uIGEgcGF0aG9sb2dpY2FsIGxpbmVcbiAgICAvLyAoYSBtaW5pZmllZC9iYXNlNjQgcnVuKSwga2VlcGluZyBldmVyeSBzdGFydCBwb3NpdGlvbiBPKDEpIGluc3RlYWQgb2YgTyhuKS5cbiAgICBjb25zdCBjb21wb3VuZENhbWVsUmVnZXggPSBuZXcgUmVnRXhwKFxuICAgICAgICBgXi4qPyg/PCFbQS1aYS16MC05XyRdKShbQS1aYS16MC05XyRdezEsNjR9KD86JHtDT01QT1VORF9TRUNSRVRfU1VGRklYRVNfQ0FNRUx9KSlcXFxccypbOj1dLiokYCxcbiAgICAgICAgJ2dtJ1xuICAgIClcbiAgICAvLyBzbmFrZV9jYXNlIGlzIG1hdGNoZWQgY2FzZS1JTlNFTlNJVElWRUxZLCB3aGljaCBpcyBzYWZlIHByZWNpc2VseSBiZWNhdXNlIGl0IHJlcXVpcmVzXG4gICAgLy8gYW4gZXhwbGljaXQgYF9gIGJlZm9yZSB0aGUgc3VmZml4LiBUaGF0IGNvdmVycyBTQ1JFQU1JTkdfU05BS0VfQ0FTRSBcdTIwMTQgdGhlIGRvbWluYW50XG4gICAgLy8gY29udmVudGlvbiBmb3Igc2VjcmV0cyBpbiBjb25maWcvZW52IGZpbGVzIChgQVdTX1NFQ1JFVF9BQ0NFU1NfS0VZYCwgYEdJVEhVQl9UT0tFTmApIFx1MjAxNFxuICAgIC8vIHdoaWxlIGBrZXl3b3JkYCBhbmQgYG15X3NlY3JldGFyeWAgc3RpbGwgZmFsbCBvdXQsIHNpbmNlIG5laXRoZXIgaGFzIGBfPHN1ZmZpeD5gXG4gICAgLy8gaW1tZWRpYXRlbHkgYmVmb3JlIGFuIGFzc2lnbm1lbnQuXG4gICAgY29uc3QgY29tcG91bmRTbmFrZVJlZ2V4ID0gbmV3IFJlZ0V4cChcbiAgICAgICAgYF4uKj8oPzwhW0EtWmEtejAtOV8kXSkoW0EtWmEtejAtOV8kXXswLDY0fV8oPzoke0NPTVBPVU5EX1NFQ1JFVF9TVUZGSVhFU19TTkFLRX0pKVxcXFxzKls6PV0uKiRgLFxuICAgICAgICAnZ21pJ1xuICAgIClcblxuICAgIHJldHVybiB0ZXh0LnRvU3RyaW5nKClcbiAgICAgICAgLy8gQmxvY2stbGV2ZWwgcGFzc2VzIHJ1biBGSVJTVDogdGhleSBzcGFuIGxpbmVzLCBhbmQgdGhlIGxpbmUtYW5jaG9yZWQgcGFzc2VzIGJlbG93XG4gICAgICAgIC8vIGNhbiBvbmx5IGV2ZXIgc2VlIHRoZSBvbmUgbGluZSB0aGF0IGNhcnJpZXMgdGhlIGtleSBuYW1lLlxuICAgICAgICAucmVwbGFjZShQRU1fQkxPQ0tfUkVHRVgsICckMVtSRURBQ1RFRF0kMicpXG4gICAgICAgIC5yZXBsYWNlKFBFTV9VTlRFUk1JTkFURURfUkVHRVgsICckMVtSRURBQ1RFRF0nKVxuICAgICAgICAucmVwbGFjZShVUkxfVVNFUklORk9fUkVHRVgsICckMVtSRURBQ1RFRF1AJylcbiAgICAgICAgLnJlcGxhY2UocmVkYWN0UmVnZXgsICckMTogW1JFREFDVEVEXScpXG4gICAgICAgIC5yZXBsYWNlKGNvbXBvdW5kQ2FtZWxSZWdleCwgJyQxOiBbUkVEQUNURURdJylcbiAgICAgICAgLnJlcGxhY2UoY29tcG91bmRTbmFrZVJlZ2V4LCAnJDE6IFtSRURBQ1RFRF0nKVxufVxuXG5jb25zdCByZWFkQ2FwcGVkRmlsZSA9IChmaWxlUGF0aDogc3RyaW5nKTogeyBjb250ZW50Pzogc3RyaW5nLCByZWFzb24/OiBzdHJpbmcgfSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgICAgY29uc3Qgc2l6ZSA9IGZzLnN0YXRTeW5jKGZpbGVQYXRoKS5zaXplXG4gICAgICAgIGlmIChzaXplID4gTUFYX0NBUFRVUkVEX0NPTkZJR19GSUxFX0JZVEVTKSB7XG4gICAgICAgICAgICByZXR1cm4geyByZWFzb246IGAke3BhdGguYmFzZW5hbWUoZmlsZVBhdGgpfTogdG9vX2xhcmdlICgke3NpemV9IGJ5dGVzKWAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IGNvbnRlbnQ6IGZzLnJlYWRGaWxlU3luYyhmaWxlUGF0aCwgJ3V0ZjgnKSB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIHsgcmVhc29uOiBgJHtwYXRoLmJhc2VuYW1lKGZpbGVQYXRoKX06ICR7KGVycm9yIGFzIEVycm9yKT8ubWVzc2FnZSB8fCBTdHJpbmcoZXJyb3IpfWAgfVxuICAgIH1cbn1cblxuLyoqXG4gKiBSZXNvbHZlIGEgcmVsYXRpdmUgaW1wb3J0IHNwZWNpZmllciBhZ2FpbnN0IHRoZSBpbXBvcnRpbmcgZmlsZS5cbiAqXG4gKiBIYW5kbGVzIHRoZSBUeXBlU2NyaXB0LUVTTSBjb252ZW50aW9uIHdoZXJlIGAuL3NoYXJlZC5jb25mLmpzYCBvbiBkaXNrIGlzIGFjdHVhbGx5XG4gKiBgLi9zaGFyZWQuY29uZi50c2AsIHBsdXMgZXh0ZW5zaW9uLWxlc3MgYW5kIGRpcmVjdG9yeSAoYC9pbmRleC4qYCkgc3BlY2lmaWVycy5cbiAqL1xuLyoqXG4gKiBPbmx5IGZpbGVzIHRoYXQgYXJlIHRoZW1zZWx2ZXMgY29uZmlncyBhcmUgZm9sbG93ZWQuXG4gKlxuICogQSByZWxhdGl2ZSBzcGVjaWZpZXIgcmVzb2x2ZXMgdG8gd2hhdGV2ZXIgdGhlIGNvbmZpZyBoYXBwZW5zIHRvIGltcG9ydCwgd2hpY2ggaXMgZnJlcXVlbnRseVxuICogb3JkaW5hcnkgYXBwbGljYXRpb24gc291cmNlIChgLi9oZWxwZXJzL3V0aWxzLmpzYCkgcmF0aGVyIHRoYW4gY29uZmlndXJhdGlvbi4gQ2FwdHVyaW5nIHRoZVxuICogc3BsaXQtY29uZmlnIGNhc2UgKGBiYXNlLmNvbmYuanNgLCBgd2Rpby5zaGFyZWQuY29uZi50c2ApIGlzIHRoZSBwb2ludDsgc2hpcHBpbmcgYVxuICogY3VzdG9tZXIncyBhcHBsaWNhdGlvbiBtb2R1bGVzIGlzIG5vdC5cbiAqL1xuY29uc3QgaXNDb25maWdGaWxlTmFtZSA9IChmaWxlUGF0aDogc3RyaW5nKTogYm9vbGVhbiA9PiAvXFwuY29uZihpZyk/XFwuW14uXSskL2kudGVzdChwYXRoLmJhc2VuYW1lKGZpbGVQYXRoKSlcblxuY29uc3QgcmVzb2x2ZVJlbGF0aXZlSW1wb3J0ID0gKHNwZWNpZmllcjogc3RyaW5nLCBmcm9tRmlsZTogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkID0+IHtcbiAgICBjb25zdCBiYXNlID0gcGF0aC5yZXNvbHZlKHBhdGguZGlybmFtZShmcm9tRmlsZSksIHNwZWNpZmllcilcblxuICAgIGlmIChpc1JlYWRhYmxlRmlsZShiYXNlKSAmJiBTVVBQT1JURURfV0RJT19DT05GSUdfRVhURU5TSU9OUy5pbmNsdWRlcyhwYXRoLmV4dG5hbWUoYmFzZSkpKSB7XG4gICAgICAgIHJldHVybiBpc0NvbmZpZ0ZpbGVOYW1lKGJhc2UpID8gYmFzZSA6IHVuZGVmaW5lZFxuICAgIH1cblxuICAgIGNvbnN0IHdpdGhvdXRFeHQgPSBTVVBQT1JURURfV0RJT19DT05GSUdfRVhURU5TSU9OUy5pbmNsdWRlcyhwYXRoLmV4dG5hbWUoYmFzZSkpXG4gICAgICAgID8gYmFzZS5zbGljZSgwLCAtcGF0aC5leHRuYW1lKGJhc2UpLmxlbmd0aClcbiAgICAgICAgOiBiYXNlXG5cbiAgICBmb3IgKGNvbnN0IGV4dCBvZiBTVVBQT1JURURfV0RJT19DT05GSUdfRVhURU5TSU9OUykge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSBgJHt3aXRob3V0RXh0fSR7ZXh0fWBcbiAgICAgICAgaWYgKGlzUmVhZGFibGVGaWxlKGNhbmRpZGF0ZSkgJiYgaXNDb25maWdGaWxlTmFtZShjYW5kaWRhdGUpKSB7XG4gICAgICAgICAgICByZXR1cm4gY2FuZGlkYXRlXG4gICAgICAgIH1cbiAgICB9XG4gICAgZm9yIChjb25zdCBleHQgb2YgU1VQUE9SVEVEX1dESU9fQ09ORklHX0VYVEVOU0lPTlMpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gcGF0aC5qb2luKGJhc2UsIGBpbmRleCR7ZXh0fWApXG4gICAgICAgIGlmIChpc1JlYWRhYmxlRmlsZShjYW5kaWRhdGUpICYmIGlzQ29uZmlnRmlsZU5hbWUoY2FuZGlkYXRlKSkge1xuICAgICAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWRcbn1cblxuLyoqXG4gKiBDb2xsZWN0IGxvY2FsIGZpbGVzIGEgY29uZmlnIHB1bGxzIGluIChgd2Rpby5zaGFyZWQuY29uZi50c2Agc3R5bGUgc3BsaXRzKSwgc28gYVxuICogY2FwdHVyZWQgY29uZmlnIGlzIG5vdCBqdXN0IGEgdHdvLWxpbmUgZmlsZSB0aGF0IHNwcmVhZHMgYSBiYXNlIGNvbmZpZyB3ZSBuZXZlciBzZWUuXG4gKlxuICogT25seSBSRUxBVElWRSBzcGVjaWZpZXJzIGFyZSBmb2xsb3dlZCBcdTIwMTQgYmFyZSBzcGVjaWZpZXJzIGFyZSBucG0gcGFja2FnZXMsIG5ldmVyIHRoZVxuICogY3VzdG9tZXIncyBvd24gY29uZmlnLiBEZXB0aCBhbmQgY291bnQgYXJlIGNhcHBlZCBzbyB0aGlzIGNhbiBuZXZlciB3YWxrIGEgc291cmNlIHRyZWUuXG4gKi9cbmNvbnN0IGNvbGxlY3RMb2NhbEltcG9ydHMgPSAoZW50cnlQYXRoOiBzdHJpbmcsIGVudHJ5Q29udGVudDogc3RyaW5nLCBidWRnZXQ6IG51bWJlcik6IEFycmF5PHsgZmlsZVBhdGg6IHN0cmluZywgY29udGVudDogc3RyaW5nIH0+ID0+IHtcbiAgICBjb25zdCBmb3VuZDogQXJyYXk8eyBmaWxlUGF0aDogc3RyaW5nLCBjb250ZW50OiBzdHJpbmcgfT4gPSBbXVxuICAgIGNvbnN0IHNlZW4gPSBuZXcgU2V0KFtlbnRyeVBhdGhdKVxuICAgIGxldCBmcm9udGllcjogQXJyYXk8eyBmaWxlUGF0aDogc3RyaW5nLCBjb250ZW50OiBzdHJpbmcgfT4gPSBbeyBmaWxlUGF0aDogZW50cnlQYXRoLCBjb250ZW50OiBlbnRyeUNvbnRlbnQgfV1cblxuICAgIGZvciAobGV0IGRlcHRoID0gMDsgZGVwdGggPCBDQVBUVVJFX0NPTkZJR19JTVBPUlRfREVQVEggJiYgZm91bmQubGVuZ3RoIDwgYnVkZ2V0OyBkZXB0aCsrKSB7XG4gICAgICAgIGNvbnN0IG5leHQ6IEFycmF5PHsgZmlsZVBhdGg6IHN0cmluZywgY29udGVudDogc3RyaW5nIH0+ID0gW11cblxuICAgICAgICBmb3IgKGNvbnN0IHsgZmlsZVBhdGgsIGNvbnRlbnQgfSBvZiBmcm9udGllcikge1xuICAgICAgICAgICAgLy8gYGZyb20gJy4veCdgLCBgaW1wb3J0ICcuL3gnYCwgYGltcG9ydCgnLi94JylgLCBgcmVxdWlyZSgnLi94JylgXG4gICAgICAgICAgICBjb25zdCBpbXBvcnRSZWdleCA9IC8oPzpmcm9tfGltcG9ydHxyZXF1aXJlKVxccypcXCg/XFxzKlsnXCJdKFxcLlteJ1wiXSopWydcIl0vZ1xuICAgICAgICAgICAgbGV0IG1hdGNoOiBSZWdFeHBFeGVjQXJyYXkgfCBudWxsXG5cbiAgICAgICAgICAgIHdoaWxlICgobWF0Y2ggPSBpbXBvcnRSZWdleC5leGVjKGNvbnRlbnQpKSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGlmIChmb3VuZC5sZW5ndGggPj0gYnVkZ2V0KSB7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IHJlc29sdmVkID0gcmVzb2x2ZVJlbGF0aXZlSW1wb3J0KG1hdGNoWzFdLCBmaWxlUGF0aClcbiAgICAgICAgICAgICAgICBpZiAoIXJlc29sdmVkIHx8IHNlZW4uaGFzKHJlc29sdmVkKSB8fCByZXNvbHZlZC5pbmNsdWRlcyhgJHtwYXRoLnNlcH1ub2RlX21vZHVsZXMke3BhdGguc2VwfWApKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHNlZW4uYWRkKHJlc29sdmVkKVxuXG4gICAgICAgICAgICAgICAgY29uc3QgeyBjb250ZW50OiBpbXBvcnRlZENvbnRlbnQgfSA9IHJlYWRDYXBwZWRGaWxlKHJlc29sdmVkKVxuICAgICAgICAgICAgICAgIGlmIChpbXBvcnRlZENvbnRlbnQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBmb3VuZC5wdXNoKHsgZmlsZVBhdGg6IHJlc29sdmVkLCBjb250ZW50OiBpbXBvcnRlZENvbnRlbnQgfSlcbiAgICAgICAgICAgICAgICBuZXh0LnB1c2goeyBmaWxlUGF0aDogcmVzb2x2ZWQsIGNvbnRlbnQ6IGltcG9ydGVkQ29udGVudCB9KVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG5leHQubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgICAgIGZyb250aWVyID0gbmV4dFxuICAgIH1cblxuICAgIHJldHVybiBmb3VuZFxufVxuXG4vKipcbiAqIEdpdmUgZXZlcnkgYXJjaGl2ZSBlbnRyeSBhIHVuaXF1ZSBuYW1lLiBUd28gY29uZmlncyBjYW4gc2hhcmUgYSBiYXNlbmFtZVxuICogKGBjb25maWdzL3dkaW8uY29uZi50c2AgKyBgc2hhcmVkL3dkaW8uY29uZi50c2ApOyB3aXRob3V0IHRoaXMgdGhlIHNlY29uZCBzaWxlbnRseVxuICogb3ZlcndyaXRlcyB0aGUgZmlyc3QsIHNpbmNlIGFyY2hpdmUgZW50cmllcyBhcmUga2V5ZWQgYnkgYmFzZW5hbWUuXG4gKlxuICogU2hhcmVkIHdpdGggYHVwbG9hZExvZ3NgLCB3aGljaCBkZS1kdXBlcyB0aGUgY29waWVkIGxvZyBmaWxlcyBhZ2FpbnN0IHRoZXNlIGVudHJpZXMgXHUyMDE0XG4gKiBvbmUgaW1wbGVtZW50YXRpb24gc28gdGhlIHR3byBjYW4gbmV2ZXIgZGlzYWdyZWUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWR1cGVFbnRyeU5hbWUoZmlsZVBhdGg6IHN0cmluZywgdGFrZW46IFNldDxzdHJpbmc+KTogc3RyaW5nIHtcbiAgICBjb25zdCBiYXNlID0gcGF0aC5iYXNlbmFtZShmaWxlUGF0aClcbiAgICBpZiAoIXRha2VuLmhhcyhiYXNlKSkge1xuICAgICAgICB0YWtlbi5hZGQoYmFzZSlcbiAgICAgICAgcmV0dXJuIGJhc2VcbiAgICB9XG5cbiAgICBjb25zdCBleHQgPSBwYXRoLmV4dG5hbWUoYmFzZSlcbiAgICBjb25zdCBzdGVtID0gZXh0ID8gYmFzZS5zbGljZSgwLCAtZXh0Lmxlbmd0aCkgOiBiYXNlXG4gICAgbGV0IGluZGV4ID0gMVxuICAgIGxldCBjYW5kaWRhdGUgPSBgJHtzdGVtfS4ke2luZGV4fSR7ZXh0fWBcbiAgICB3aGlsZSAodGFrZW4uaGFzKGNhbmRpZGF0ZSkpIHtcbiAgICAgICAgaW5kZXgrK1xuICAgICAgICBjYW5kaWRhdGUgPSBgJHtzdGVtfS4ke2luZGV4fSR7ZXh0fWBcbiAgICB9XG4gICAgdGFrZW4uYWRkKGNhbmRpZGF0ZSlcbiAgICByZXR1cm4gY2FuZGlkYXRlXG59XG5cbi8qKlxuICogQnVpbGQgdGhlIHJlZGFjdGVkIGNvbmZpZyBlbnRyaWVzIGFkZGVkIHRvIHRoZSBhdXRvLWNhcHR1cmVkIGxvZyBhcmNoaXZlLlxuICpcbiAqIEJlc3QgZWZmb3J0IGJ5IGNvbnRyYWN0OiBhbnkgZmFpbHVyZSByZXR1cm5zIHdoYXQgd2FzIGdhdGhlcmVkIHNvIGZhciBhbmQgYSByZWFzb25cbiAqIHN0cmluZyBmb3IgdGhlIFNES19VUExPQURfTE9HUyBldmVudC4gSXQgbXVzdCBuZXZlciB0aHJvdyBcdTIwMTQgYSBkZWJ1ZyBhcnRpZmFjdCBpcyBuZXZlclxuICogd29ydGggZmFpbGluZyBhIGN1c3RvbWVyJ3MgdGVzdCBydW4gb3Zlci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbGxlY3RDb25maWdGaWxlc0ZvclVwbG9hZChjb25maWc/OiBPcHRpb25zLlRlc3RydW5uZXIpOiB7IGZpbGVzOiBDYXB0dXJlZEZpbGVbXSwgZmFpbHVyZXM6IHN0cmluZ1tdLCBzdHJhdGVneT86IHN0cmluZyB9IHtcbiAgICBjb25zdCBmYWlsdXJlczogc3RyaW5nW10gPSBbXVxuICAgIGNvbnN0IGZpbGVzOiBDYXB0dXJlZEZpbGVbXSA9IFtdXG4gICAgY29uc3QgdGFrZW5OYW1lcyA9IG5ldyBTZXQ8c3RyaW5nPigpXG5cbiAgICB0cnkge1xuICAgICAgICBjb25zdCByZXNvbHV0aW9uID0gaW5pdFdkaW9Db25maWdQYXRoKGNvbmZpZylcbiAgICAgICAgaWYgKCFyZXNvbHV0aW9uLmNvbmZpZ1BhdGgpIHtcbiAgICAgICAgICAgIGZhaWx1cmVzLnB1c2gocmVzb2x1dGlvbi5yZWFzb24gfHwgJ2NvbmZpZ19ub3RfZm91bmQnKVxuICAgICAgICAgICAgcmV0dXJuIHsgZmlsZXMsIGZhaWx1cmVzIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHsgY29udGVudCwgcmVhc29uIH0gPSByZWFkQ2FwcGVkRmlsZShyZXNvbHV0aW9uLmNvbmZpZ1BhdGgpXG4gICAgICAgIGlmIChjb250ZW50ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGZhaWx1cmVzLnB1c2gocmVhc29uIHx8ICdjb25maWdfcmVhZF9mYWlsZWQnKVxuICAgICAgICAgICAgcmV0dXJuIHsgZmlsZXMsIGZhaWx1cmVzLCBzdHJhdGVneTogcmVzb2x1dGlvbi5zdHJhdGVneSB9XG4gICAgICAgIH1cblxuICAgICAgICBmaWxlcy5wdXNoKHtcbiAgICAgICAgICAgIG5hbWU6IGRlZHVwZUVudHJ5TmFtZShyZXNvbHV0aW9uLmNvbmZpZ1BhdGgsIHRha2VuTmFtZXMpLFxuICAgICAgICAgICAgc291cmNlUGF0aDogcmVzb2x1dGlvbi5jb25maWdQYXRoLFxuICAgICAgICAgICAgY29udGVudDogcmVkYWN0U2Vuc2l0aXZlQ29udGVudChjb250ZW50KVxuICAgICAgICB9KVxuXG4gICAgICAgIGNvbnN0IHJlbWFpbmluZyA9IE1BWF9DQVBUVVJFRF9DT05GSUdfRklMRVMgLSBmaWxlcy5sZW5ndGhcbiAgICAgICAgaWYgKHJlbWFpbmluZyA+IDApIHtcbiAgICAgICAgICAgIC8vIGNvbnRlbnQgY29tZXMgYmFjayBmcm9tIHRoZSBkaXNjb3ZlcnkgcGFzcyBcdTIwMTQgcmUtcmVhZGluZyBoZXJlIHdvdWxkIGJlIGEgc2Vjb25kXG4gICAgICAgICAgICAvLyBkaXNrIHJlYWQgcGVyIGZpbGUgYW5kIGNvdWxkIGFyY2hpdmUgZGlmZmVyZW50IGJ5dGVzIHRoYW4gd2VyZSBzY2FubmVkLlxuICAgICAgICAgICAgZm9yIChjb25zdCBpbXBvcnRlZCBvZiBjb2xsZWN0TG9jYWxJbXBvcnRzKHJlc29sdXRpb24uY29uZmlnUGF0aCwgY29udGVudCwgcmVtYWluaW5nKSkge1xuICAgICAgICAgICAgICAgIGZpbGVzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBkZWR1cGVFbnRyeU5hbWUoaW1wb3J0ZWQuZmlsZVBhdGgsIHRha2VuTmFtZXMpLFxuICAgICAgICAgICAgICAgICAgICBzb3VyY2VQYXRoOiBpbXBvcnRlZC5maWxlUGF0aCxcbiAgICAgICAgICAgICAgICAgICAgY29udGVudDogcmVkYWN0U2Vuc2l0aXZlQ29udGVudChpbXBvcnRlZC5jb250ZW50KVxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4geyBmaWxlcywgZmFpbHVyZXMsIHN0cmF0ZWd5OiByZXNvbHV0aW9uLnN0cmF0ZWd5IH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBmYWlsdXJlcy5wdXNoKGBjb25maWdfY2FwdHVyZV9leGNlcHRpb246ICR7KGVycm9yIGFzIEVycm9yKT8ubWVzc2FnZSB8fCBTdHJpbmcoZXJyb3IpfWApXG4gICAgICAgIHJldHVybiB7IGZpbGVzLCBmYWlsdXJlcyB9XG4gICAgfVxufVxuXG4vKipcbiAqIFdhbGsgdXAgZnJvbSBgc3RhcnREaXJgIGxvb2tpbmcgZm9yIGBmaWxlTmFtZWAsIHN0b3BwaW5nIGF0IHRoZSBmaWxlc3lzdGVtIHJvb3Qgb3JcbiAqIGFmdGVyIE1BWF9QQUNLQUdFX0pTT05fV0FMS19VUCBsZXZlbHMuXG4gKi9cbmNvbnN0IGZpbmRVcHdhcmRzID0gKHN0YXJ0RGlyOiBzdHJpbmcsIGZpbGVOYW1lOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQgPT4ge1xuICAgIGxldCBjdXJyZW50ID0gc3RhcnREaXJcbiAgICBmb3IgKGxldCBkZXB0aCA9IDA7IGRlcHRoIDw9IE1BWF9QQUNLQUdFX0pTT05fV0FMS19VUDsgZGVwdGgrKykge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSBwYXRoLmpvaW4oY3VycmVudCwgZmlsZU5hbWUpXG4gICAgICAgIGlmIChpc1JlYWRhYmxlRmlsZShjYW5kaWRhdGUpKSB7XG4gICAgICAgICAgICByZXR1cm4gY2FuZGlkYXRlXG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcGFyZW50ID0gcGF0aC5kaXJuYW1lKGN1cnJlbnQpXG4gICAgICAgIGlmIChwYXJlbnQgPT09IGN1cnJlbnQpIHtcbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICAgICAgY3VycmVudCA9IHBhcmVudFxuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkXG59XG5cbi8qKlxuICogYHBhY2thZ2UuanNvbmAgZm9yIHRoZSBwcm9qZWN0IHRoZSBjb25maWcgYmVsb25ncyB0byBcdTIwMTQgZnJhbWV3b3JrIGFuZCBzZXJ2aWNlIHZlcnNpb25zXG4gKiBhcmUgdGhlIGZpcnN0IHRoaW5nIHRyaWFnZSBuZWVkcywgYW5kIHRoZSBhcmNoaXZlIGNhcnJpZWQgbmVpdGhlciBiZWZvcmUuXG4gKlxuICogV2Fsa3MgVVAgZnJvbSB0aGUgY29uZmlnJ3MgZGlyZWN0b3J5LCBiZWNhdXNlIGBjb25maWdzL3dkaW8uY29uZi50c2AgKGEgdmVyeSBjb21tb25cbiAqIGxheW91dCkgcHV0cyB0aGUgbWFuaWZlc3Qgb25lIG9yIG1vcmUgbGV2ZWxzIGFib3ZlIHRoZSBjb25maWcsIG5vdCBiZXNpZGUgaXQuXG4gKiBBcmNoaXZlZCB2ZXJiYXRpbTogaXQgaXMgYSBtYW5pZmVzdCwgbm90IGEgc2VjcmV0IHN0b3JlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZmluZFBhY2thZ2VKc29uRm9yVXBsb2FkKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgY29uZmlnUGF0aCA9IHByb2Nlc3MuZW52W0JST1dTRVJTVEFDS19XRElPX0NPTkZJR19GSUxFX1BBVEhdXG4gICAgY29uc3Qgc3RhcnREaXJzID0gW2NvbmZpZ1BhdGggPyBwYXRoLmRpcm5hbWUoY29uZmlnUGF0aCkgOiB1bmRlZmluZWQsIHByb2Nlc3MuY3dkKCldXG4gICAgICAgIC5maWx0ZXIoKGRpcik6IGRpciBpcyBzdHJpbmcgPT4gQm9vbGVhbihkaXIpKVxuXG4gICAgZm9yIChjb25zdCBkaXIgb2YgQXJyYXkuZnJvbShuZXcgU2V0KHN0YXJ0RGlycykpKSB7XG4gICAgICAgIGNvbnN0IGZvdW5kID0gZmluZFVwd2FyZHMoZGlyLCAncGFja2FnZS5qc29uJylcbiAgICAgICAgaWYgKGZvdW5kKSB7XG4gICAgICAgICAgICByZXR1cm4gZm91bmRcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkXG59XG4iLCAiaW1wb3J0IHsgQlN0YWNrTG9nZ2VyIH0gZnJvbSAnLi4vYnN0YWNrTG9nZ2VyLmpzJ1xuaW1wb3J0IHR5cGUgeyBGZWF0dXJlU3RhdHNPdmVydmlldyB9IGZyb20gJy4uL3R5cGVzLmpzJ1xuaW1wb3J0IHsgaXNPYmplY3RFbXB0eSB9IGZyb20gJy4uL3V0aWwuanMnXG5cbmludGVyZmFjZSBGZWF0dXJlU3RhdHNNYXAge1xuICAgIFtncm91cElkOiBzdHJpbmddOiBGZWF0dXJlU3RhdHM7XG59XG5cbmludGVyZmFjZSBKU09OQ29udmVyc2lvblNldHRpbmdzIHtcbiAgICBvbWl0R3JvdXBzPzogYm9vbGVhblxuICAgIG9ubHlHcm91cHM/OiBib29sZWFuXG4gICAgbmVzdGVkR3JvdXBzPzogYm9vbGVhblxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEZlYXR1cmUge1xuICAgIHRyaWdnZXJlZENvdW50OiBudW1iZXJcbiAgICBzZW50Q291bnQ6IG51bWJlclxuICAgIGZhaWxlZENvdW50OiBudW1iZXJcbiAgICBncm91cHM6IEZlYXR1cmVbXVxufVxuXG5jbGFzcyBGZWF0dXJlU3RhdHMge1xuICAgIHByaXZhdGUgdHJpZ2dlcmVkQ291bnQ6IG51bWJlciA9IDBcbiAgICBwcml2YXRlIHNlbnRDb3VudDogbnVtYmVyID0gMFxuICAgIHByaXZhdGUgZmFpbGVkQ291bnQ6IG51bWJlciA9IDBcbiAgICBwcml2YXRlIGdyb3VwczogRmVhdHVyZVN0YXRzTWFwID0ge31cblxuICAgIHB1YmxpYyBtYXJrKHN0YXR1czogc3RyaW5nLCBncm91cElkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgc3dpdGNoIChzdGF0dXMpIHtcbiAgICAgICAgY2FzZSAndHJpZ2dlcmVkJzpcbiAgICAgICAgICAgIHRoaXMudHJpZ2dlcmVkKGdyb3VwSWQpXG4gICAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlICdzdWNjZXNzJzpcbiAgICAgICAgY2FzZSAnc2VudCc6XG4gICAgICAgICAgICB0aGlzLnNlbnQoZ3JvdXBJZClcbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgJ2ZhaWxlZCc6XG4gICAgICAgICAgICB0aGlzLmZhaWxlZChncm91cElkKVxuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIEJTdGFja0xvZ2dlci5kZWJ1ZygnUmVxdWVzdCB0byBtYXJrIHVzYWdlIGZvciB1bmtub3duIHN0YXR1cyAtICcgKyBzdGF0dXMpXG4gICAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHRyaWdnZXJlZChncm91cElkPzogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIHRoaXMudHJpZ2dlcmVkQ291bnQgKz0gMVxuICAgICAgICBpZiAoZ3JvdXBJZCkge1xuICAgICAgICAgICAgdGhpcy5jcmVhdGVHcm91cChncm91cElkKS50cmlnZ2VyZWQoKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHNlbnQoZ3JvdXBJZD86IHN0cmluZyk6IHZvaWQge1xuICAgICAgICB0aGlzLnNlbnRDb3VudCArPSAxXG4gICAgICAgIGlmIChncm91cElkKSB7XG4gICAgICAgICAgICB0aGlzLmNyZWF0ZUdyb3VwKGdyb3VwSWQpLnNlbnQoKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGZhaWxlZChncm91cElkPzogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZmFpbGVkQ291bnQgKz0gMVxuICAgICAgICBpZiAoZ3JvdXBJZCkge1xuICAgICAgICAgICAgdGhpcy5jcmVhdGVHcm91cChncm91cElkKS5mYWlsZWQoKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHN1Y2Nlc3MoZ3JvdXBJZD86IHN0cmluZyk6IHZvaWQge1xuICAgICAgICB0aGlzLnNlbnQoZ3JvdXBJZClcbiAgICB9XG5cbiAgICBwdWJsaWMgY3JlYXRlR3JvdXAoZ3JvdXBJZDogc3RyaW5nKTogRmVhdHVyZVN0YXRzIHtcbiAgICAgICAgaWYgKCF0aGlzLmdyb3Vwc1tncm91cElkXSkge1xuICAgICAgICAgICAgdGhpcy5ncm91cHNbZ3JvdXBJZF0gPSBuZXcgRmVhdHVyZVN0YXRzKClcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5ncm91cHNbZ3JvdXBJZF1cbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0VHJpZ2dlcmVkQ291bnQoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudHJpZ2dlcmVkQ291bnRcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0U2VudENvdW50KCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLnNlbnRDb3VudFxuICAgIH1cblxuICAgIHB1YmxpYyBnZXRGYWlsZWRDb3VudCgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5mYWlsZWRDb3VudFxuICAgIH1cblxuICAgIHB1YmxpYyBnZXRVc2FnZUZvckdyb3VwKGdyb3VwSWQ6IHN0cmluZyk6IEZlYXR1cmVTdGF0cyB7XG4gICAgICAgIHJldHVybiB0aGlzLmdyb3Vwc1tncm91cElkXSB8fCBuZXcgRmVhdHVyZVN0YXRzKClcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0T3ZlcnZpZXcoKTogRmVhdHVyZVN0YXRzT3ZlcnZpZXcge1xuICAgICAgICByZXR1cm4geyB0cmlnZ2VyZWRDb3VudDogdGhpcy50cmlnZ2VyZWRDb3VudCwgc2VudENvdW50OiB0aGlzLnNlbnRDb3VudCwgZmFpbGVkQ291bnQ6IHRoaXMuZmFpbGVkQ291bnQgfVxuICAgIH1cblxuICAgIHB1YmxpYyBnZXRHcm91cHMoKTogRmVhdHVyZVN0YXRzTWFwIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ3JvdXBzXG4gICAgfVxuXG4gICAgcHVibGljIGFkZChmZWF0dXJlU3RhdHM6IEZlYXR1cmVTdGF0cyk6IHZvaWQge1xuICAgICAgICB0aGlzLnRyaWdnZXJlZENvdW50ICs9IGZlYXR1cmVTdGF0cy5nZXRUcmlnZ2VyZWRDb3VudCgpXG4gICAgICAgIHRoaXMuc2VudENvdW50ICs9IGZlYXR1cmVTdGF0cy5nZXRTZW50Q291bnQoKVxuICAgICAgICB0aGlzLmZhaWxlZENvdW50ICs9IGZlYXR1cmVTdGF0cy5nZXRGYWlsZWRDb3VudCgpXG5cbiAgICAgICAgT2JqZWN0LmVudHJpZXMoZmVhdHVyZVN0YXRzLmdldEdyb3VwcygpKS5mb3JFYWNoKChbZ3JvdXBJZCwgZ3JvdXBdKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmNyZWF0ZUdyb3VwKGdyb3VwSWQpLmFkZChncm91cClcbiAgICAgICAgfSlcbiAgICB9XG5cbiAgICAvLyBvbWl0R3JvdXBzOiB0cnVlL2ZhbHNlIC0+IEluY2x1ZGUgZ3JvdXBzIG9yIG5vdFxuICAgIC8vIG9ubHlHcm91cHM6IHRydWUvZmFsc2UgLT4gZGF0YSBpbmNsdWRlcyBvbmx5IGdyb3Vwc1xuICAgIC8vIG5lc3RlZEdyb3VwczogdHJ1ZS9mYWxzZSAtPiBncm91cHMgd2lsbCBiZSBuZXN0ZWQgaW4gZ3JvdXBzIGlmIHRydWVcbiAgICBwdWJsaWMgdG9KU09OKGNvbmZpZzogSlNPTkNvbnZlcnNpb25TZXR0aW5ncyA9IHt9KSB7XG4gICAgICAgIGNvbnN0IG92ZXJ2aWV3RGF0YTogRmVhdHVyZVN0YXRzT3ZlcnZpZXd8UmVjb3JkPHN0cmluZywgbmV2ZXI+ID0gIWNvbmZpZy5vbmx5R3JvdXBzID8ge1xuICAgICAgICAgICAgdHJpZ2dlcmVkQ291bnQ6IHRoaXMudHJpZ2dlcmVkQ291bnQsXG4gICAgICAgICAgICBzZW50Q291bnQ6IHRoaXMuc2VudENvdW50LFxuICAgICAgICAgICAgZmFpbGVkQ291bnQ6IHRoaXMuZmFpbGVkQ291bnRcbiAgICAgICAgfSA6IHt9XG5cbiAgICAgICAgY29uc3QgZ3JvdXBzRGF0YTogUmVjb3JkPHN0cmluZywgRmVhdHVyZVN0YXRzT3ZlcnZpZXc+ID0ge31cbiAgICAgICAgaWYgKCFjb25maWcub21pdEdyb3Vwcykge1xuICAgICAgICAgICAgT2JqZWN0LmVudHJpZXModGhpcy5ncm91cHMpLmZvckVhY2goKFtncm91cElkLCBncm91cF0pID0+IHtcbiAgICAgICAgICAgICAgICBncm91cHNEYXRhW2dyb3VwSWRdID0gKGdyb3VwLnRvSlNPTigpIGFzIEZlYXR1cmVTdGF0c092ZXJ2aWV3KSAvLyBDdXJyZW50bHkgTmVzdGVkIGdyb3VwcyBhcmUgb25seSBvdmVydmlld3NcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZ3JvdXAgPSBjb25maWcubmVzdGVkR3JvdXBzID8geyBncm91cHM6IGdyb3Vwc0RhdGEgfSA6IGdyb3Vwc0RhdGFcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgLi4ub3ZlcnZpZXdEYXRhLFxuICAgICAgICAgICAgLi4uZ3JvdXBcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZnJvbUpTT04oanNvbjogRmVhdHVyZSk6IEZlYXR1cmVTdGF0cyB7XG4gICAgICAgIGNvbnN0IHN0YXRzID0gbmV3IEZlYXR1cmVTdGF0cygpXG5cbiAgICAgICAgaWYgKCFqc29uIHx8IGlzT2JqZWN0RW1wdHkoanNvbikpIHtcbiAgICAgICAgICAgIHJldHVybiBzdGF0c1xuICAgICAgICB9XG4gICAgICAgIHN0YXRzLnRyaWdnZXJlZENvdW50ID0ganNvbi50cmlnZ2VyZWRDb3VudFxuICAgICAgICBzdGF0cy5zZW50Q291bnQgPSBqc29uLnNlbnRDb3VudFxuICAgICAgICBzdGF0cy5mYWlsZWRDb3VudCA9IGpzb24uZmFpbGVkQ291bnRcblxuICAgICAgICBpZiAoIWpzb24uZ3JvdXBzKSB7XG4gICAgICAgICAgICByZXR1cm4gc3RhdHNcbiAgICAgICAgfVxuICAgICAgICBPYmplY3QuZW50cmllcyhqc29uLmdyb3VwcykuZm9yRWFjaCgoW2dyb3VwSWQsIGdyb3VwXSkgPT4ge1xuICAgICAgICAgICAgc3RhdHMuZ3JvdXBzW2dyb3VwSWRdID0gRmVhdHVyZVN0YXRzLmZyb21KU09OKGdyb3VwKVxuICAgICAgICB9KVxuICAgICAgICByZXR1cm4gc3RhdHNcbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IEZlYXR1cmVTdGF0c1xuIiwgImltcG9ydCB7IGdldEVycm9yU3RyaW5nIH0gZnJvbSAnLi4vdXRpbC5qcydcblxuY2xhc3MgRmVhdHVyZVVzYWdlIHtcbiAgICBwcml2YXRlIGlzVHJpZ2dlcmVkPzogYm9vbGVhblxuICAgIHByaXZhdGUgc3RhdHVzPzogc3RyaW5nXG4gICAgcHJpdmF0ZSBlcnJvcj86IHN0cmluZ1xuXG4gICAgY29uc3RydWN0b3IoaXNUcmlnZ2VyZWQ/OiBib29sZWFuKSB7XG4gICAgICAgIGlmIChpc1RyaWdnZXJlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aGlzLmlzVHJpZ2dlcmVkID0gaXNUcmlnZ2VyZWRcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBnZXRUcmlnZ2VyZWQoKTogYm9vbGVhbiB8IHVuZGVmaW5lZCB7XG4gICAgICAgIHJldHVybiB0aGlzLmlzVHJpZ2dlcmVkXG4gICAgfVxuXG4gICAgcHVibGljIHNldFRyaWdnZXJlZCh0cmlnZ2VyZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAgICAgdGhpcy5pc1RyaWdnZXJlZCA9IHRyaWdnZXJlZFxuICAgIH1cblxuICAgIHB1YmxpYyBzZXRTdGF0dXMoc3RhdHVzOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5zdGF0dXMgPSBzdGF0dXNcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0RXJyb3IoZXJyb3I6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICB0aGlzLmVycm9yID0gZXJyb3JcbiAgICB9XG5cbiAgICBwdWJsaWMgdHJpZ2dlcmVkKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmlzVHJpZ2dlcmVkID0gdHJ1ZVxuICAgIH1cblxuICAgIHB1YmxpYyBmYWlsZWQoZTogdW5rbm93bik6IHZvaWQge1xuICAgICAgICB0aGlzLnN0YXR1cyA9ICdmYWlsZWQnXG4gICAgICAgIHRoaXMuZXJyb3IgPSBnZXRFcnJvclN0cmluZyhlKVxuICAgIH1cblxuICAgIHB1YmxpYyBzdWNjZXNzKCk6IHZvaWQge1xuICAgICAgICB0aGlzLnN0YXR1cyA9ICdzdWNjZXNzJ1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRTdGF0dXMoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RhdHVzXG4gICAgfVxuXG4gICAgcHVibGljIGdldEVycm9yKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgICAgIHJldHVybiB0aGlzLmVycm9yXG4gICAgfVxuXG4gICAgcHVibGljIHRvSlNPTigpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGlzVHJpZ2dlcmVkOiB0aGlzLmlzVHJpZ2dlcmVkLFxuICAgICAgICAgICAgc3RhdHVzOiB0aGlzLnN0YXR1cyxcbiAgICAgICAgICAgIGVycm9yOiB0aGlzLmVycm9yXG4gICAgICAgIH1cbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IEZlYXR1cmVVc2FnZVxuIiwgImNsYXNzIFRlc3RPcHNDb25maWcge1xuICAgIHByaXZhdGUgc3RhdGljIF9pbnN0YW5jZTogVGVzdE9wc0NvbmZpZ1xuICAgIHB1YmxpYyBidWlsZFN0b3BwZWQ6IGJvb2xlYW4gPSBmYWxzZVxuICAgIHB1YmxpYyBidWlsZEhhc2hlZElkPzogc3RyaW5nXG5cbiAgICBzdGF0aWMgZ2V0SW5zdGFuY2UoLi4uYXJnczogdW5rbm93bltdKSB7XG4gICAgICAgIGlmICghdGhpcy5faW5zdGFuY2UpIHtcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgcGFzc2luZyBhcmdzIHRvIGNvbnN0cnVjdG9yXG4gICAgICAgICAgICB0aGlzLl9pbnN0YW5jZSA9IG5ldyBUZXN0T3BzQ29uZmlnKC4uLmFyZ3MpXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX2luc3RhbmNlXG4gICAgfVxuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHB1YmxpYyBlbmFibGVkOiBib29sZWFuID0gdHJ1ZSxcbiAgICAgICAgcHVibGljIG1hbnVhbGx5U2V0OiBib29sZWFuID0gZmFsc2UsXG4gICAgKXtcbiAgICAgICAgVGVzdE9wc0NvbmZpZy5faW5zdGFuY2UgPSB0aGlzXG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBUZXN0T3BzQ29uZmlnXG4iLCAiaW1wb3J0IEZlYXR1cmVTdGF0cywgeyB0eXBlIEZlYXR1cmUgfSBmcm9tICcuL2ZlYXR1cmVTdGF0cy5qcydcbmltcG9ydCBGZWF0dXJlVXNhZ2UgZnJvbSAnLi9mZWF0dXJlVXNhZ2UuanMnXG5pbXBvcnQgeyBCU3RhY2tMb2dnZXIgfSBmcm9tICcuLi9ic3RhY2tMb2dnZXIuanMnXG5pbXBvcnQgVGVzdE9wc0NvbmZpZyBmcm9tICcuL3Rlc3RPcHNDb25maWcuanMnXG5pbXBvcnQgdHlwZSB7IFRPVXNhZ2VTdGF0cyB9IGZyb20gJy4uL3R5cGVzLmpzJ1xuXG5leHBvcnQgaW50ZXJmYWNlIFVzYWdlU3RhdCB7XG4gICAgdGVzdEV2ZW50czoge1xuICAgICAgICBzdGFydGVkOiBGZWF0dXJlXG4gICAgICAgIGZpbmlzaGVkOiBGZWF0dXJlXG4gICAgfVxuICAgIGhvb2tFdmVudHM6IHtcbiAgICAgICAgc3RhcnRlZDogRmVhdHVyZVxuICAgICAgICBmaW5pc2hlZDogRmVhdHVyZVxuICAgIH1cbiAgICBsb2dFdmVudHM6IEZlYXR1cmVcbiAgICBjYnRTZXNzaW9uRXZlbnRzOiBGZWF0dXJlXG4gICAgY2J0U2Vzc2lvblN0YXRzOiBGZWF0dXJlXG59XG5cbmNsYXNzIFVzYWdlU3RhdHMge1xuICAgIHB1YmxpYyBzdGF0aWMgaW5zdGFuY2U6IFVzYWdlU3RhdHNcbiAgICBwdWJsaWMgdGVzdFN0YXJ0ZWRTdGF0czogRmVhdHVyZVN0YXRzXG4gICAgcHVibGljIHRlc3RGaW5pc2hlZFN0YXRzOiBGZWF0dXJlU3RhdHNcbiAgICBwdWJsaWMgaG9va1N0YXJ0ZWRTdGF0czogRmVhdHVyZVN0YXRzXG4gICAgcHVibGljIGhvb2tGaW5pc2hlZFN0YXRzOiBGZWF0dXJlU3RhdHNcbiAgICBwdWJsaWMgY2J0U2Vzc2lvblN0YXRzOiBGZWF0dXJlU3RhdHNcbiAgICBwdWJsaWMgbG9nU3RhdHM6IEZlYXR1cmVTdGF0c1xuICAgIHB1YmxpYyBsYXVuY2hCdWlsZFVzYWdlOiBGZWF0dXJlVXNhZ2VcbiAgICBwdWJsaWMgc3RvcEJ1aWxkVXNhZ2U6IEZlYXR1cmVVc2FnZVxuXG4gICAgcHVibGljIHN0YXRpYyBnZXRJbnN0YW5jZSgpOiBVc2FnZVN0YXRzIHtcbiAgICAgICAgaWYgKCFVc2FnZVN0YXRzLmluc3RhbmNlKSB7XG4gICAgICAgICAgICBVc2FnZVN0YXRzLmluc3RhbmNlID0gbmV3IFVzYWdlU3RhdHMoKVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBVc2FnZVN0YXRzLmluc3RhbmNlXG4gICAgfVxuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMudGVzdFN0YXJ0ZWRTdGF0cyA9IG5ldyBGZWF0dXJlU3RhdHMoKVxuICAgICAgICB0aGlzLnRlc3RGaW5pc2hlZFN0YXRzID0gbmV3IEZlYXR1cmVTdGF0cygpXG4gICAgICAgIHRoaXMuaG9va1N0YXJ0ZWRTdGF0cyA9IG5ldyBGZWF0dXJlU3RhdHMoKVxuICAgICAgICB0aGlzLmhvb2tGaW5pc2hlZFN0YXRzID0gbmV3IEZlYXR1cmVTdGF0cygpXG4gICAgICAgIHRoaXMuY2J0U2Vzc2lvblN0YXRzID0gbmV3IEZlYXR1cmVTdGF0cygpXG4gICAgICAgIHRoaXMubG9nU3RhdHMgPSBuZXcgRmVhdHVyZVN0YXRzKClcbiAgICAgICAgdGhpcy5sYXVuY2hCdWlsZFVzYWdlID0gbmV3IEZlYXR1cmVVc2FnZSgpXG4gICAgICAgIHRoaXMuc3RvcEJ1aWxkVXNhZ2UgPSBuZXcgRmVhdHVyZVVzYWdlKClcbiAgICB9XG5cbiAgICBwdWJsaWMgYWRkKHVzYWdlU3RhdHM6IFVzYWdlU3RhdHMpOiB2b2lkIHtcbiAgICAgICAgdGhpcy50ZXN0U3RhcnRlZFN0YXRzLmFkZCh1c2FnZVN0YXRzLnRlc3RTdGFydGVkU3RhdHMpXG4gICAgICAgIHRoaXMudGVzdEZpbmlzaGVkU3RhdHMuYWRkKHVzYWdlU3RhdHMudGVzdEZpbmlzaGVkU3RhdHMpXG4gICAgICAgIHRoaXMuaG9va1N0YXJ0ZWRTdGF0cy5hZGQodXNhZ2VTdGF0cy5ob29rU3RhcnRlZFN0YXRzKVxuICAgICAgICB0aGlzLmhvb2tGaW5pc2hlZFN0YXRzLmFkZCh1c2FnZVN0YXRzLmhvb2tGaW5pc2hlZFN0YXRzKVxuICAgICAgICB0aGlzLmNidFNlc3Npb25TdGF0cy5hZGQodXNhZ2VTdGF0cy5jYnRTZXNzaW9uU3RhdHMpXG4gICAgICAgIHRoaXMubG9nU3RhdHMuYWRkKHVzYWdlU3RhdHMubG9nU3RhdHMpXG4gICAgfVxuXG4gICAgcHVibGljIGdldEZvcm1hdHRlZERhdGEod29ya2Vyc0RhdGE6IHsgdXNhZ2VTdGF0czogVXNhZ2VTdGF0IH1bXSkge1xuICAgICAgICB0aGlzLmFkZERhdGFGcm9tV29ya2Vycyh3b3JrZXJzRGF0YSlcbiAgICAgICAgY29uc3QgdGVzdE9wc0NvbmZpZyA9IFRlc3RPcHNDb25maWcuZ2V0SW5zdGFuY2UoKVxuICAgICAgICBjb25zdCB1c2FnZTogVE9Vc2FnZVN0YXRzID0ge1xuICAgICAgICAgICAgZW5hYmxlZDogdGVzdE9wc0NvbmZpZy5lbmFibGVkLFxuICAgICAgICAgICAgbWFudWFsbHlTZXQ6IHRlc3RPcHNDb25maWcubWFudWFsbHlTZXQsXG4gICAgICAgICAgICBidWlsZEhhc2hlZElkOiB0ZXN0T3BzQ29uZmlnLmJ1aWxkSGFzaGVkSWRcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdXNhZ2UuZW5hYmxlZCkge1xuICAgICAgICAgICAgcmV0dXJuIHVzYWdlXG4gICAgICAgIH1cblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdXNhZ2UuZXZlbnRzID0gdGhpcy5nZXRFdmVudHNEYXRhKClcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLmRlYnVnKCdleGNlcHRpb24gaW4gZ2V0Rm9ybWF0dGVkRGF0YTogJyArIGUpXG5cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdXNhZ2VcbiAgICB9XG5cbiAgICBwdWJsaWMgYWRkRGF0YUZyb21Xb3JrZXJzKHdvcmtlcnNEYXRhOiB7IHVzYWdlU3RhdHM6IFVzYWdlU3RhdCB9W10pIHtcbiAgICAgICAgd29ya2Vyc0RhdGEubWFwKHdvcmtlckRhdGEgPT4ge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBjb25zdCB1c2FnZVN0YXRzRm9yV29ya2VyID0gVXNhZ2VTdGF0cy5mcm9tSlNPTih3b3JrZXJEYXRhLnVzYWdlU3RhdHMpXG4gICAgICAgICAgICAgICAgdGhpcy5hZGQodXNhZ2VTdGF0c0ZvcldvcmtlcilcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICBCU3RhY2tMb2dnZXIuZGVidWcoJ0V4Y2VwdGlvbiBpbiBhZGRpbmcgd29ya2VyRGF0YTogJyArIGUpXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgfVxuXG4gICAgcHVibGljIGdldEV2ZW50c0RhdGEoKXtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGJ1aWxkRXZlbnRzOiB7XG4gICAgICAgICAgICAgICAgc3RhcnRlZDogdGhpcy5sYXVuY2hCdWlsZFVzYWdlLnRvSlNPTigpLFxuICAgICAgICAgICAgICAgIGZpbmlzaGVkOiB0aGlzLnN0b3BCdWlsZFVzYWdlLnRvSlNPTigpXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdGVzdEV2ZW50czoge1xuICAgICAgICAgICAgICAgIHN0YXJ0ZWQ6IHRoaXMudGVzdFN0YXJ0ZWRTdGF0cy50b0pTT04oKSxcbiAgICAgICAgICAgICAgICBmaW5pc2hlZDogdGhpcy50ZXN0RmluaXNoZWRTdGF0cy50b0pTT04oeyBvbWl0R3JvdXBzOiB0cnVlIH0pLFxuICAgICAgICAgICAgICAgIC4uLnRoaXMudGVzdEZpbmlzaGVkU3RhdHMudG9KU09OKHsgb25seUdyb3VwczogdHJ1ZSB9KVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGhvb2tFdmVudHM6IHtcbiAgICAgICAgICAgICAgICBzdGFydGVkOiB0aGlzLmhvb2tTdGFydGVkU3RhdHMudG9KU09OKCksXG4gICAgICAgICAgICAgICAgZmluaXNoZWQ6IHRoaXMuaG9va0ZpbmlzaGVkU3RhdHMudG9KU09OKHsgb21pdEdyb3VwczogdHJ1ZSB9KSxcbiAgICAgICAgICAgICAgICAuLi50aGlzLmhvb2tGaW5pc2hlZFN0YXRzLnRvSlNPTih7IG9ubHlHcm91cHM6IHRydWUgfSlcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBsb2dFdmVudHM6IHRoaXMubG9nU3RhdHMudG9KU09OKCksXG4gICAgICAgICAgICBjYnRTZXNzaW9uRXZlbnRzOiB0aGlzLmNidFNlc3Npb25TdGF0cy50b0pTT04oKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGdldERhdGFUb1NhdmUoKXtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHRlc3RFdmVudHM6IHtcbiAgICAgICAgICAgICAgICBzdGFydGVkOiB0aGlzLnRlc3RTdGFydGVkU3RhdHMudG9KU09OKCksXG4gICAgICAgICAgICAgICAgZmluaXNoZWQ6IHRoaXMudGVzdEZpbmlzaGVkU3RhdHMudG9KU09OKHsgbmVzdGVkR3JvdXBzOiB0cnVlIH0pLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGhvb2tFdmVudHM6IHtcbiAgICAgICAgICAgICAgICBzdGFydGVkOiB0aGlzLmhvb2tTdGFydGVkU3RhdHMudG9KU09OKCksXG4gICAgICAgICAgICAgICAgZmluaXNoZWQ6IHRoaXMuaG9va0ZpbmlzaGVkU3RhdHMudG9KU09OKHsgbmVzdGVkR3JvdXBzOiB0cnVlIH0pLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGxvZ0V2ZW50czogdGhpcy5sb2dTdGF0cy50b0pTT04oeyBuZXN0ZWRHcm91cHM6IHRydWUgfSksXG4gICAgICAgICAgICBjYnRTZXNzaW9uRXZlbnRzOiB0aGlzLmNidFNlc3Npb25TdGF0cy50b0pTT04oKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBmcm9tSlNPTihkYXRhOiBVc2FnZVN0YXQpIHtcbiAgICAgICAgY29uc3QgdXNhZ2VTdGF0cyA9IG5ldyBVc2FnZVN0YXRzKClcbiAgICAgICAgdXNhZ2VTdGF0cy50ZXN0U3RhcnRlZFN0YXRzID0gRmVhdHVyZVN0YXRzLmZyb21KU09OKGRhdGEudGVzdEV2ZW50cy5zdGFydGVkKVxuICAgICAgICB1c2FnZVN0YXRzLnRlc3RGaW5pc2hlZFN0YXRzID0gRmVhdHVyZVN0YXRzLmZyb21KU09OKGRhdGEudGVzdEV2ZW50cy5maW5pc2hlZClcbiAgICAgICAgdXNhZ2VTdGF0cy5ob29rU3RhcnRlZFN0YXRzID0gRmVhdHVyZVN0YXRzLmZyb21KU09OKGRhdGEuaG9va0V2ZW50cy5zdGFydGVkKVxuICAgICAgICB1c2FnZVN0YXRzLmhvb2tGaW5pc2hlZFN0YXRzID0gRmVhdHVyZVN0YXRzLmZyb21KU09OKGRhdGEuaG9va0V2ZW50cy5maW5pc2hlZClcbiAgICAgICAgdXNhZ2VTdGF0cy5sb2dTdGF0cyA9IEZlYXR1cmVTdGF0cy5mcm9tSlNPTihkYXRhLmxvZ0V2ZW50cylcbiAgICAgICAgdXNhZ2VTdGF0cy5jYnRTZXNzaW9uU3RhdHMgPSBGZWF0dXJlU3RhdHMuZnJvbUpTT04oZGF0YS5jYnRTZXNzaW9uU3RhdHMpXG4gICAgICAgIHJldHVybiB1c2FnZVN0YXRzXG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBVc2FnZVN0YXRzXG4iLCAiaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJ1xuaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnXG5pbXBvcnQgb3MgZnJvbSAnbm9kZTpvcydcbmltcG9ydCB7IEJTdGFja0xvZ2dlciB9IGZyb20gJy4uL2JzdGFja0xvZ2dlci5qcydcblxuaW50ZXJmYWNlIFNjcmlwdHMge1xuICAgIHNjYW46IHN0cmluZ1xuICAgIGdldFJlc3VsdHM6IHN0cmluZ1xuICAgIGdldFJlc3VsdHNTdW1tYXJ5OiBzdHJpbmdcbiAgICBzYXZlUmVzdWx0czogc3RyaW5nXG59XG5cbmludGVyZmFjZSBDb21tYW5kIHtcbiAgICBuYW1lOiBzdHJpbmdcbiAgICBjbGFzczogc3RyaW5nXG59XG5cbi8qKlxuICogVGhlIGJpbmFyeSB0eXBlcyBBY2Nlc3NpYmlsaXR5Q2FwYWJpbGl0eS52YWx1ZSBhcyBhIHByb3RvIHN0cmluZywgc28gZ29vZzpjaHJvbWVPcHRpb25zXG4gKiBhcnJpdmVzIEpTT04tZW5jb2RlZCBvdmVyIGdSUEMgd2hlcmUgdGhlIEhUVFAgbGF1bmNoIHJlc3BvbnNlIGRlbGl2ZXJzIGEgcGxhaW4gb2JqZWN0LlxuICogQWNjZXB0IGJvdGguIEFueXRoaW5nIHRoYXQgZG9lcyBub3QgcmVzb2x2ZSB0byBhbiBvYmplY3QgaXMgZHJvcHBlZCByYXRoZXIgdGhhbiB3cml0dGVuXG4gKiBpbnRvIGEgVzNDIGNhcGFiaWxpdHksIHdoaWNoIHRoZSBodWIgcmVqZWN0cyBvdXRyaWdodC5cbiAqL1xuZnVuY3Rpb24gdG9DaHJvbWVPcHRpb25zKHZhbHVlOiB1bmtub3duKTogeyBba2V5OiBzdHJpbmddOiB1bmtub3duIH0gfCBudWxsIHtcbiAgICAvLyBBbiBhYnNlbnQgZmllbGQgaXMgdGhlIGNvbW1vbiBjYXNlIGFuZCBub3QgYSBkcm9wIFx1MjAxNCB1cGRhdGUoKSBydW5zIG9uIGV2ZXJ5IGxhdW5jaCByZXNwb25zZVxuICAgIC8vIGFuZCBldmVyeSByZWFkRnJvbUV4aXN0aW5nRmlsZSgpLCBzbyByZXBvcnRpbmcgaXQgd291bGQgYnVyeSB0aGUgZHJvcCB0aGlzIGxvZ3MgZm9yLlxuICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHZhbHVlID09PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBudWxsXG4gICAgfVxuXG4gICAgbGV0IHBhcnNlZCA9IHZhbHVlXG4gICAgaWYgKHR5cGVvZiBwYXJzZWQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBwYXJzZWQgPSBKU09OLnBhcnNlKHBhcnNlZClcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAvLyBEcm9wcGluZyB0aGlzIGxlYXZlcyB0aGUgZXh0ZW5zaW9uIHVuaW5qZWN0ZWQgYW5kIHRoZSBhMTF5IHJlcG9ydCBlbXB0eSwgd2l0aCB0aGVcbiAgICAgICAgICAgIC8vIHJ1biBzdGlsbCBncmVlbiBcdTIwMTQgc28gdGhlIGRyb3AgaGFzIHRvIGJlIGZpbmRhYmxlIGluIHRoZSBsb2cuXG4gICAgICAgICAgICBCU3RhY2tMb2dnZXIuZGVidWcoYHRvQ2hyb21lT3B0aW9uczogZ29vZzpjaHJvbWVPcHRpb25zIGlzIG5vdCB2YWxpZCBKU09OLCBkcm9wcGluZyBpdDogJHtlcnJ9YClcbiAgICAgICAgICAgIHJldHVybiBudWxsXG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKHBhcnNlZCAmJiB0eXBlb2YgcGFyc2VkID09PSAnb2JqZWN0JyAmJiAhQXJyYXkuaXNBcnJheShwYXJzZWQpKSB7XG4gICAgICAgIHJldHVybiBwYXJzZWQgYXMgeyBba2V5OiBzdHJpbmddOiB1bmtub3duIH1cbiAgICB9XG4gICAgQlN0YWNrTG9nZ2VyLmRlYnVnKGB0b0Nocm9tZU9wdGlvbnM6IGdvb2c6Y2hyb21lT3B0aW9ucyByZXNvbHZlZCB0byAke3BhcnNlZCA9PT0gbnVsbCA/ICdudWxsJyA6IEFycmF5LmlzQXJyYXkocGFyc2VkKSA/ICdhbiBhcnJheScgOiB0eXBlb2YgcGFyc2VkfSwgbm90IGFuIG9iamVjdDsgZHJvcHBpbmcgaXRgKVxuICAgIHJldHVybiBudWxsXG59XG5cbmNsYXNzIEFjY2Vzc2liaWxpdHlTY3JpcHRzIHtcbiAgICBwcml2YXRlIHN0YXRpYyBpbnN0YW5jZTogQWNjZXNzaWJpbGl0eVNjcmlwdHMgfCBudWxsID0gbnVsbFxuXG4gICAgcHVibGljIHBlcmZvcm1TY2FuOiBzdHJpbmcgfCBudWxsID0gbnVsbFxuICAgIHB1YmxpYyBnZXRSZXN1bHRzOiBzdHJpbmcgfCBudWxsID0gbnVsbFxuICAgIHB1YmxpYyBnZXRSZXN1bHRzU3VtbWFyeTogc3RyaW5nIHwgbnVsbCA9IG51bGxcbiAgICBwdWJsaWMgc2F2ZVRlc3RSZXN1bHRzOiBzdHJpbmcgfCBudWxsID0gbnVsbFxuICAgIHB1YmxpYyBjb21tYW5kc1RvV3JhcDogQXJyYXk8Q29tbWFuZD4gfCBudWxsID0gbnVsbFxuICAgIHB1YmxpYyBDaHJvbWVFeHRlbnNpb246IHsgW2tleTogc3RyaW5nXTogdW5rbm93biB9ID0ge31cblxuICAgIHB1YmxpYyBicm93c2Vyc3RhY2tGb2xkZXJQYXRoID0gJydcbiAgICBwdWJsaWMgY29tbWFuZHNQYXRoID0gJydcblxuICAgIC8vIGRvbid0IGFsbG93IHRvIGNyZWF0ZSBpbnN0YW5jZXMgZnJvbSBpdCBvdGhlciB0aGFuIHRocm91Z2ggYGNoZWNrQW5kR2V0SW5zdGFuY2VgXG4gICAgcHJpdmF0ZSBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5icm93c2Vyc3RhY2tGb2xkZXJQYXRoID0gdGhpcy5nZXRXcml0YWJsZURpcigpXG4gICAgICAgIHRoaXMuY29tbWFuZHNQYXRoID0gcGF0aC5qb2luKHRoaXMuYnJvd3NlcnN0YWNrRm9sZGVyUGF0aCwgJ2NvbW1hbmRzLmpzb24nKVxuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgY2hlY2tBbmRHZXRJbnN0YW5jZSgpIHtcbiAgICAgICAgaWYgKCFBY2Nlc3NpYmlsaXR5U2NyaXB0cy5pbnN0YW5jZSkge1xuICAgICAgICAgICAgQWNjZXNzaWJpbGl0eVNjcmlwdHMuaW5zdGFuY2UgPSBuZXcgQWNjZXNzaWJpbGl0eVNjcmlwdHMoKVxuICAgICAgICAgICAgQWNjZXNzaWJpbGl0eVNjcmlwdHMuaW5zdGFuY2UucmVhZEZyb21FeGlzdGluZ0ZpbGUoKVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBBY2Nlc3NpYmlsaXR5U2NyaXB0cy5pbnN0YW5jZVxuICAgIH1cblxuICAgIC8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFycyAqL1xuICAgIHB1YmxpYyBnZXRXcml0YWJsZURpcigpOiBzdHJpbmcge1xuICAgICAgICBjb25zdCBvcmRlcmVkUGF0aHMgPSBbXG4gICAgICAgICAgICBwYXRoLmpvaW4ob3MuaG9tZWRpcigpLCAnLmJyb3dzZXJzdGFjaycpLFxuICAgICAgICAgICAgcHJvY2Vzcy5jd2QoKSxcbiAgICAgICAgICAgIG9zLnRtcGRpcigpXG4gICAgICAgIF1cbiAgICAgICAgZm9yIChjb25zdCBvcmRlcmVkUGF0aCBvZiBvcmRlcmVkUGF0aHMpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgaWYgKGZzLmV4aXN0c1N5bmMob3JkZXJlZFBhdGgpKSB7XG4gICAgICAgICAgICAgICAgICAgIGZzLmFjY2Vzc1N5bmMob3JkZXJlZFBhdGgpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBvcmRlcmVkUGF0aFxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGZzLm1rZGlyU3luYyhvcmRlcmVkUGF0aCwgeyByZWN1cnNpdmU6IHRydWUgfSlcbiAgICAgICAgICAgICAgICByZXR1cm4gb3JkZXJlZFBhdGhcblxuICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAvKiBuby1lbXB0eSAqL1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiAnJ1xuICAgIH1cblxuICAgIHB1YmxpYyByZWFkRnJvbUV4aXN0aW5nRmlsZSgpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmIChmcy5leGlzdHNTeW5jKHRoaXMuY29tbWFuZHNQYXRoKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBmcy5yZWFkRmlsZVN5bmModGhpcy5jb21tYW5kc1BhdGgsICd1dGY4JylcbiAgICAgICAgICAgICAgICBpZiAoZGF0YSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZShKU09OLnBhcnNlKGRhdGEpKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAvKiBEbyBub3RoaW5nICovXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgdXBkYXRlKGRhdGE6IHsgY29tbWFuZHM6IFtdLCBzY3JpcHRzOiBTY3JpcHRzLCBub25CU3RhY2tJbmZyYUExMXlDaHJvbWVPcHRpb25zOiB7fSB9KSB7XG4gICAgICAgIGlmIChkYXRhLnNjcmlwdHMpIHtcbiAgICAgICAgICAgIHRoaXMucGVyZm9ybVNjYW4gPSBkYXRhLnNjcmlwdHMuc2NhblxuICAgICAgICAgICAgdGhpcy5nZXRSZXN1bHRzID0gZGF0YS5zY3JpcHRzLmdldFJlc3VsdHNcbiAgICAgICAgICAgIHRoaXMuZ2V0UmVzdWx0c1N1bW1hcnkgPSBkYXRhLnNjcmlwdHMuZ2V0UmVzdWx0c1N1bW1hcnlcbiAgICAgICAgICAgIHRoaXMuc2F2ZVRlc3RSZXN1bHRzID0gZGF0YS5zY3JpcHRzLnNhdmVSZXN1bHRzXG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRhdGEuY29tbWFuZHMgJiYgZGF0YS5jb21tYW5kcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMuY29tbWFuZHNUb1dyYXAgPSBkYXRhLmNvbW1hbmRzXG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY2hyb21lT3B0aW9ucyA9IHRvQ2hyb21lT3B0aW9ucyhkYXRhLm5vbkJTdGFja0luZnJhQTExeUNocm9tZU9wdGlvbnMpXG4gICAgICAgIGlmIChjaHJvbWVPcHRpb25zKXtcbiAgICAgICAgICAgIHRoaXMuQ2hyb21lRXh0ZW5zaW9uID0gY2hyb21lT3B0aW9uc1xuICAgICAgICB9XG5cbiAgICB9XG5cbiAgICBwdWJsaWMgc3RvcmUoKSB7XG4gICAgICAgIGlmICghZnMuZXhpc3RzU3luYyh0aGlzLmJyb3dzZXJzdGFja0ZvbGRlclBhdGgpKXtcbiAgICAgICAgICAgIGZzLm1rZGlyU3luYyh0aGlzLmJyb3dzZXJzdGFja0ZvbGRlclBhdGgpXG4gICAgICAgIH1cblxuICAgICAgICBmcy53cml0ZUZpbGVTeW5jKHRoaXMuY29tbWFuZHNQYXRoLCBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICBjb21tYW5kczogdGhpcy5jb21tYW5kc1RvV3JhcCxcbiAgICAgICAgICAgIHNjcmlwdHM6IHtcbiAgICAgICAgICAgICAgICBzY2FuOiB0aGlzLnBlcmZvcm1TY2FuLFxuICAgICAgICAgICAgICAgIGdldFJlc3VsdHM6IHRoaXMuZ2V0UmVzdWx0cyxcbiAgICAgICAgICAgICAgICBnZXRSZXN1bHRzU3VtbWFyeTogdGhpcy5nZXRSZXN1bHRzU3VtbWFyeSxcbiAgICAgICAgICAgICAgICBzYXZlUmVzdWx0czogdGhpcy5zYXZlVGVzdFJlc3VsdHMsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbm9uQlN0YWNrSW5mcmFBMTF5Q2hyb21lT3B0aW9uczogdGhpcy5DaHJvbWVFeHRlbnNpb24sXG4gICAgICAgIH0pKVxuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgQWNjZXNzaWJpbGl0eVNjcmlwdHMuY2hlY2tBbmRHZXRJbnN0YW5jZSgpXG5leHBvcnQgeyBDb21tYW5kIH1cbiIsICJpbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnXG5pbXBvcnQgZnMgZnJvbSAnbm9kZTpmcydcblxuaW1wb3J0IHR5cGUgeyBUZXN0RGF0YSwgVXBsb2FkVHlwZSB9IGZyb20gJy4uL3R5cGVzLmpzJ1xuaW1wb3J0IHsgYmF0Y2hBbmRQb3N0RXZlbnRzIH0gZnJvbSAnLi4vdXRpbC5qcydcbmltcG9ydCB7IERBVEFfQkFUQ0hfRU5EUE9JTlQgfSBmcm9tICcuLi9jb25zdGFudHMuanMnXG5pbXBvcnQgeyBCU3RhY2tMb2dnZXIgfSBmcm9tICcuLi9ic3RhY2tMb2dnZXIuanMnXG5cbi8qKlxuICogQ3Jhc2gtcmVzaWxpZW50IGpvdXJuYWwgb2YgdGVzdCBhbmQgaG9vayBydW5zIHRoYXQgaGF2ZSBzZW50IFRlc3RSdW5TdGFydGVkIC9cbiAqIEhvb2tSdW5TdGFydGVkIGJ1dCBub3QgeWV0IHRoZSBtYXRjaGluZyBmaW5pc2guIEVhY2ggb3BlbiBydW4gaXMgcGVyc2lzdGVkIGFzIGEgc21hbGxcbiAqIGZpbGUgc28gdGhhdCBpZiB0aGUgd29ya2VyIChvciB0aGUgd2hvbGUgd2RpbyBwcm9jZXNzIHRyZWUpIGlzIGtpbGxlZCBtaWQtdGVzdCBvclxuICogbWlkLWhvb2ssIHRoZSBsYXVuY2hlcidzIHNodXRkb3duIHBhdGggb3IgdGhlIGRldGFjaGVkIGV4aXQgY2xlYW51cCBjYW4gc3RpbGwgc2VuZCBhXG4gKiBzeW50aGV0aWMgVGVzdFJ1bkZpbmlzaGVkIC8gSG9va1J1bkZpbmlzaGVkIFx1MjAxNCBvdGhlcndpc2UgdGhlIGVudGl0eSBzdGF5cyBcImluIHByb2dyZXNzXCJcbiAqIG9uIHRoZSBUZXN0IFJlcG9ydGluZyAmIEFuYWx5dGljcyBkYXNoYm9hcmQgdW50aWwgdGhlIGJhY2tlbmQgd2F0Y2hkb2cgdGltZXMgaXQgb3V0LFxuICogaW5mbGF0aW5nIHRoZSByZXBvcnRlZCBidWlsZCBkdXJhdGlvbiAoU0RLLTcxNjc6IGFuIG9ycGhhbmVkIEFGVEVSX0VBQ0ggY3VjdW1iZXIgaG9va1xuICogYWRkZWQgaXRzIDJoIGhvb2sgdGltZW91dCB0byB0aGUgYnVpbGQncyBkdXJhdGlvbiBvbiB0aGUgbmV3IGRhc2hib2FyZCkuXG4gKi9cblxuY29uc3QgT1BFTl9SVU5TX0RJUiA9IHBhdGguam9pbihwcm9jZXNzLmN3ZCgpLCAnbG9ncycsICdic3RhY2tfb3Blbl9ydW5zJylcblxuZXhwb3J0IGNvbnN0IE9SUEhBTl9GQUlMVVJFX1JFQVNPTiA9ICdUZXN0IHJ1biBkaWQgbm90IGNvbXBsZXRlOiB0aGUgcHJvY2VzcyB3YXMgaW50ZXJydXB0ZWQgb3IgdGVybWluYXRlZCBiZWZvcmUgdGhlIHRlc3QgZmluaXNoZWQgKGZpbmFsaXplZCBieSBCcm93c2VyU3RhY2sgU0RLIGV4aXQgY2xlYW51cCknXG5cbmZ1bmN0aW9uIG9wZW5SdW5GaWxlUGF0aCh1dWlkOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gcGF0aC5qb2luKE9QRU5fUlVOU19ESVIsIGBvcGVuLXJ1bi0ke3V1aWR9Lmpzb25gKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVjb3JkT3BlblJ1bih0ZXN0RGF0YTogVGVzdERhdGEpIHtcbiAgICBpZiAoIXRlc3REYXRhIHx8ICF0ZXN0RGF0YS51dWlkKSB7XG4gICAgICAgIHJldHVyblxuICAgIH1cbiAgICB0cnkge1xuICAgICAgICBmcy5ta2RpclN5bmMoT1BFTl9SVU5TX0RJUiwgeyByZWN1cnNpdmU6IHRydWUgfSlcbiAgICAgICAgZnMud3JpdGVGaWxlU3luYyhvcGVuUnVuRmlsZVBhdGgodGVzdERhdGEudXVpZCksIEpTT04uc3RyaW5naWZ5KHRlc3REYXRhKSlcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIEJTdGFja0xvZ2dlci5kZWJ1Zygnb3BlblJ1bnNKb3VybmFsOiBmYWlsZWQgdG8gcmVjb3JkIG9wZW4gcnVuOiAnICsgZSlcbiAgICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjbGVhck9wZW5SdW4odXVpZD86IHN0cmluZykge1xuICAgIGlmICghdXVpZCkge1xuICAgICAgICByZXR1cm5cbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgZnMucm1TeW5jKG9wZW5SdW5GaWxlUGF0aCh1dWlkKSwgeyBmb3JjZTogdHJ1ZSB9KVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgQlN0YWNrTG9nZ2VyLmRlYnVnKCdvcGVuUnVuc0pvdXJuYWw6IGZhaWxlZCB0byBjbGVhciBvcGVuIHJ1bjogJyArIGUpXG4gICAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gY29sbGVjdE9ycGhhbmVkUnVucygpOiBUZXN0RGF0YVtdIHtcbiAgICBjb25zdCBvcnBoYW5zOiBUZXN0RGF0YVtdID0gW11cbiAgICB0cnkge1xuICAgICAgICBpZiAoIWZzLmV4aXN0c1N5bmMoT1BFTl9SVU5TX0RJUikpIHtcbiAgICAgICAgICAgIHJldHVybiBvcnBoYW5zXG4gICAgICAgIH1cbiAgICAgICAgZm9yIChjb25zdCBmaWxlIG9mIGZzLnJlYWRkaXJTeW5jKE9QRU5fUlVOU19ESVIpKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIG9ycGhhbnMucHVzaChKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhwYXRoLmpvaW4oT1BFTl9SVU5TX0RJUiwgZmlsZSksICd1dGY4JykpKVxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIEJTdGFja0xvZ2dlci5kZWJ1Zyhgb3BlblJ1bnNKb3VybmFsOiBza2lwcGluZyB1bnJlYWRhYmxlIGpvdXJuYWwgZmlsZSAke2ZpbGV9OiAke2V9YClcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmcy5ybVN5bmMoT1BFTl9SVU5TX0RJUiwgeyByZWN1cnNpdmU6IHRydWUsIGZvcmNlOiB0cnVlIH0pXG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBCU3RhY2tMb2dnZXIuZGVidWcoJ29wZW5SdW5zSm91cm5hbDogZmFpbGVkIHRvIGNvbGxlY3Qgb3JwaGFuZWQgcnVuczogJyArIGUpXG4gICAgfVxuICAgIHJldHVybiBvcnBoYW5zXG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmaW5hbGl6ZU9ycGhhbmVkUnVucygpOiBQcm9taXNlPG51bWJlcj4ge1xuICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IG9ycGhhbnMgPSBjb2xsZWN0T3JwaGFuZWRSdW5zKClcbiAgICAgICAgaWYgKCFvcnBoYW5zLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIDBcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBmaW5pc2hlZEF0ID0gbmV3IERhdGUoKS50b0lTT1N0cmluZygpXG4gICAgICAgIGNvbnN0IGV2ZW50czogVXBsb2FkVHlwZVtdID0gb3JwaGFucy5tYXAoKHJ1bkRhdGEpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ZWRBdE1zID0gcnVuRGF0YS5zdGFydGVkX2F0ID8gbmV3IERhdGUocnVuRGF0YS5zdGFydGVkX2F0KS5nZXRUaW1lKCkgOiBOYU5cbiAgICAgICAgICAgIGNvbnN0IGZpbmlzaGVkUnVuID0ge1xuICAgICAgICAgICAgICAgIC4uLnJ1bkRhdGEsXG4gICAgICAgICAgICAgICAgZmluaXNoZWRfYXQ6IGZpbmlzaGVkQXQsXG4gICAgICAgICAgICAgICAgcmVzdWx0OiAnZmFpbGVkJyxcbiAgICAgICAgICAgICAgICBkdXJhdGlvbl9pbl9tczogTnVtYmVyLmlzTmFOKHN0YXJ0ZWRBdE1zKSA/IHVuZGVmaW5lZCA6IE1hdGgubWF4KDAsIERhdGUubm93KCkgLSBzdGFydGVkQXRNcyksXG4gICAgICAgICAgICAgICAgZmFpbHVyZTogW3sgYmFja3RyYWNlOiBbT1JQSEFOX0ZBSUxVUkVfUkVBU09OXSB9XSxcbiAgICAgICAgICAgICAgICBmYWlsdXJlX3JlYXNvbjogT1JQSEFOX0ZBSUxVUkVfUkVBU09OLFxuICAgICAgICAgICAgICAgIGZhaWx1cmVfdHlwZTogJ1VuaGFuZGxlZEVycm9yJ1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gSG9vayBwYXlsb2FkcyBjYXJyeSB0eXBlICdob29rJyAoc2FtZSBkaXNjcmltaW5hdG9yIHRoZSBsaXN0ZW5lciB1c2VzIHRvIHBpY2tcbiAgICAgICAgICAgIC8vIHRoZSBob29rX3J1bi90ZXN0X3J1biBlbnZlbG9wZSBrZXkpIFx1MjAxNCBmaW5hbGl6ZSB0aGVtIGFzIEhvb2tSdW5GaW5pc2hlZCBzbyB0aGVcbiAgICAgICAgICAgIC8vIGJhY2tlbmQgY2xvc2VzIHRoZSBob29rIGluc3RlYWQgb2YgZHJvcHBpbmcgYW4gdW5rbm93biB0ZXN0X3J1biB1dWlkLlxuICAgICAgICAgICAgaWYgKHJ1bkRhdGEudHlwZSA9PT0gJ2hvb2snKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgZXZlbnRfdHlwZTogJ0hvb2tSdW5GaW5pc2hlZCcsIGhvb2tfcnVuOiBmaW5pc2hlZFJ1biB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4geyBldmVudF90eXBlOiAnVGVzdFJ1bkZpbmlzaGVkJywgdGVzdF9ydW46IGZpbmlzaGVkUnVuIH1cbiAgICAgICAgfSlcbiAgICAgICAgYXdhaXQgYmF0Y2hBbmRQb3N0RXZlbnRzKERBVEFfQkFUQ0hfRU5EUE9JTlQsICdPUlBIQU5FRF9URVNUX1JVTl9GSU5BTElaQVRJT04nLCBldmVudHMpXG4gICAgICAgIEJTdGFja0xvZ2dlci5pbmZvKGBGaW5hbGl6ZWQgJHtldmVudHMubGVuZ3RofSBvcnBoYW5lZCB0ZXN0L2hvb2sgcnVuKHMpIGxlZnQgYmVoaW5kIGJ5IGFuIGludGVycnVwdGVkIHJ1bmApXG4gICAgICAgIHJldHVybiBldmVudHMubGVuZ3RoXG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBCU3RhY2tMb2dnZXIuZGVidWcoJ29wZW5SdW5zSm91cm5hbDogZmFpbGVkIHRvIGZpbmFsaXplIG9ycGhhbmVkIHJ1bnM6ICcgKyBlKVxuICAgICAgICByZXR1cm4gMFxuICAgIH1cbn1cbiIsICJpbXBvcnQgeyBnZXRFcnJvclN0cmluZywgc3RvcEJ1aWxkVXBzdHJlYW0sIHVwbG9hZExvZ3MgfSBmcm9tICcuL3V0aWwuanMnXG5pbXBvcnQgeyBmaW5hbGl6ZU9ycGhhbmVkUnVucyB9IGZyb20gJy4vdGVzdE9wcy9vcGVuUnVuc0pvdXJuYWwuanMnXG5pbXBvcnQgeyBCU3RhY2tMb2dnZXIgfSBmcm9tICcuL2JzdGFja0xvZ2dlci5qcydcbmltcG9ydCBmcyBmcm9tICdub2RlOmZzJ1xuaW1wb3J0IHV0aWwgZnJvbSAnbm9kZTp1dGlsJ1xuaW1wb3J0IHsgZmlyZUZ1bm5lbFJlcXVlc3QgfSBmcm9tICcuL2luc3RydW1lbnRhdGlvbi9mdW5uZWxJbnN0cnVtZW50YXRpb24uanMnXG5pbXBvcnQgeyBCUk9XU0VSU1RBQ0tfVEVTVEhVQl9VVUlELCBCUk9XU0VSU1RBQ0tfVEVTVEhVQl9KV1QsIEJST1dTRVJTVEFDS19PQlNFUlZBQklMSVRZIH0gZnJvbSAnLi9jb25zdGFudHMuanMnXG5pbXBvcnQgdHlwZSB7IEZ1bm5lbERhdGEgfSBmcm9tICcuL3R5cGVzLmpzJ1xuaW1wb3J0IFBlcmZvcm1hbmNlVGVzdGVyIGZyb20gJy4vaW5zdHJ1bWVudGF0aW9uL3BlcmZvcm1hbmNlL3BlcmZvcm1hbmNlLXRlc3Rlci5qcydcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQlN0YWNrQ2xlYW51cCB7XG4gICAgc3RhdGljIGFzeW5jIHN0YXJ0Q2xlYW51cCgpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIEdldCBmdW5uZWwgZGF0YSBvYmplY3QgZnJvbSBzYXZlZCBmaWxlXG4gICAgICAgICAgICBjb25zdCBmdW5uZWxEYXRhQ2xlYW51cCA9IHByb2Nlc3MuYXJndi5pbmNsdWRlcygnLS1mdW5uZWxEYXRhJylcbiAgICAgICAgICAgIGxldCBmdW5uZWxEYXRhOiBGdW5uZWxEYXRhIHwgbnVsbCA9IG51bGxcbiAgICAgICAgICAgIGlmIChmdW5uZWxEYXRhQ2xlYW51cCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gcHJvY2Vzcy5hcmd2LmluZGV4T2YoJy0tZnVubmVsRGF0YScpXG4gICAgICAgICAgICAgICAgY29uc3QgZmlsZVBhdGggPSBwcm9jZXNzLmFyZ3ZbaW5kZXggKyAxXVxuICAgICAgICAgICAgICAgIGZ1bm5lbERhdGEgPSBCU3RhY2tDbGVhbnVwLmdldEZ1bm5lbERhdGFGcm9tRmlsZShmaWxlUGF0aClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFNuYXBzaG90IGJlZm9yZSBzZW5kRnVubmVsRGF0YSBcdTIwMTQgZmlyZUZ1bm5lbFJlcXVlc3QgcmVkYWN0cyB0aGVcbiAgICAgICAgICAgIC8vIGNyZWRlbnRpYWxzIGluIHBsYWNlLlxuICAgICAgICAgICAgY29uc3QgZnVubmVsVXNlciA9IGZ1bm5lbERhdGE/LnVzZXJOYW1lXG4gICAgICAgICAgICBjb25zdCBmdW5uZWxLZXkgPSBmdW5uZWxEYXRhPy5hY2Nlc3NLZXlcblxuICAgICAgICAgICAgaWYgKHByb2Nlc3MuYXJndi5pbmNsdWRlcygnLS1vYnNlcnZhYmlsaXR5JykgJiYgZnVubmVsRGF0YSkge1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuZXhlY3V0ZU9ic2VydmFiaWxpdHlDbGVhbnVwKGZ1bm5lbERhdGEpXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChmdW5uZWxEYXRhQ2xlYW51cCAmJiBmdW5uZWxEYXRhKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5zZW5kRnVubmVsRGF0YShmdW5uZWxEYXRhKVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBSZXNjdWUgdGhlIFNESy1sb2cgdXBsb2FkIGZvciBydW5zIHdob3NlIGxhdW5jaGVyIG5ldmVyIHJlYWNoZWRcbiAgICAgICAgICAgIC8vIG9uQ29tcGxldGUgKHNpZ25hbCB0ZXJtaW5hdGlvbikgXHUyMDE0IGFmdGVyIGV2ZW50cywgYmVmb3JlIGV4aXQuXG4gICAgICAgICAgICBpZiAocHJvY2Vzcy5hcmd2LmluY2x1ZGVzKCctLXVwbG9hZExvZ3MnKSkge1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuZXhlY3V0ZUxvZ3NVcGxvYWQoZnVubmVsVXNlciwgZnVubmVsS2V5KVxuICAgICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIGNvbnN0IGVycm9yID0gZXJyIGFzIHN0cmluZ1xuICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLmVycm9yKGVycm9yKVxuICAgICAgICB9XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmIChwcm9jZXNzLmFyZ3YuaW5jbHVkZXMoJy0tcGVyZm9ybWFuY2VEYXRhJykpIHtcbiAgICAgICAgICAgICAgICBhd2FpdCBQZXJmb3JtYW5jZVRlc3Rlci51cGxvYWRFdmVudHNEYXRhKClcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZXIpIHtcbiAgICAgICAgICAgIEJTdGFja0xvZ2dlci5kZWJ1ZyhgRXJyb3IgaW4gc2VuZGluZyBldmVudHMgZGF0YSAke3V0aWwuZm9ybWF0KGVyKX1gKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgc3RhdGljIGFzeW5jIGV4ZWN1dGVMb2dzVXBsb2FkKGZ1bm5lbFVzZXI/OiBzdHJpbmcsIGZ1bm5lbEtleT86IHN0cmluZykge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgaW5kZXggPSBwcm9jZXNzLmFyZ3YuaW5kZXhPZignLS11cGxvYWRMb2dzJylcbiAgICAgICAgICAgIGNvbnN0IGNsaWVudEJ1aWxkVXVpZCA9IHByb2Nlc3MuYXJndltpbmRleCArIDFdXG4gICAgICAgICAgICBjb25zdCB1c2VyID0gZnVubmVsVXNlciB8fCBwcm9jZXNzLmVudi5CUk9XU0VSU1RBQ0tfVVNFUk5BTUVcbiAgICAgICAgICAgIGNvbnN0IGtleSA9IGZ1bm5lbEtleSB8fCBwcm9jZXNzLmVudi5CUk9XU0VSU1RBQ0tfQUNDRVNTX0tFWVxuICAgICAgICAgICAgaWYgKCFjbGllbnRCdWlsZFV1aWQgfHwgIXVzZXIgfHwgIWtleSkge1xuICAgICAgICAgICAgICAgIEJTdGFja0xvZ2dlci5kZWJ1ZygnU2tpcHBpbmcgbG9ncyB1cGxvYWQgaW4gY2xlYW51cDogbWlzc2luZyB1dWlkIG9yIGNyZWRlbnRpYWxzJylcbiAgICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIEJTdGFja0xvZ2dlci5kZWJ1ZyhgVXBsb2FkaW5nIFNESyBsb2dzIGZyb20gY2xlYW51cCBmb3IgJHtjbGllbnRCdWlsZFV1aWR9YClcbiAgICAgICAgICAgIGF3YWl0IHVwbG9hZExvZ3ModXNlciwga2V5LCBjbGllbnRCdWlsZFV1aWQpXG4gICAgICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgICAgICAgIEJTdGFja0xvZ2dlci5lcnJvcignRXJyb3IgdXBsb2FkaW5nIFNESyBsb2dzIGluIGNsZWFudXA6ICcgKyBnZXRFcnJvclN0cmluZyhlKSlcbiAgICAgICAgfVxuICAgIH1cbiAgICBzdGF0aWMgYXN5bmMgZXhlY3V0ZU9ic2VydmFiaWxpdHlDbGVhbnVwKGZ1bm5lbERhdGE6IEZ1bm5lbERhdGEpIHtcbiAgICAgICAgaWYgKCFwcm9jZXNzLmVudltCUk9XU0VSU1RBQ0tfVEVTVEhVQl9KV1RdKSB7XG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICBCU3RhY2tMb2dnZXIuZGVidWcoJ0V4ZWN1dGluZyBUZXN0IFJlcG9ydGluZyBhbmQgQW5hbHl0aWNzIGNsZWFudXAnKVxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gU0RLLTQ2NzE6IGZpbmFsaXplIGFueSB0ZXN0IHJ1bnMgb3JwaGFuZWQgYnkgdGhlIGludGVycnVwdGVkIHByb2Nlc3NcbiAgICAgICAgICAgIC8vIGJlZm9yZSB0aGUgYnVpbGQgaXRzZWxmIGlzIHN0b3BwZWQuXG4gICAgICAgICAgICBhd2FpdCBmaW5hbGl6ZU9ycGhhbmVkUnVucygpXG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBzdG9wQnVpbGRVcHN0cmVhbSgpXG4gICAgICAgICAgICBpZiAoKHByb2Nlc3MuZW52W0JST1dTRVJTVEFDS19PQlNFUlZBQklMSVRZXSkgJiYgcHJvY2Vzcy5lbnZbQlJPV1NFUlNUQUNLX1RFU1RIVUJfVVVJRF0pIHtcbiAgICAgICAgICAgICAgICBCU3RhY2tMb2dnZXIuaW5mbyhgXFxuVmlzaXQgaHR0cHM6Ly9hdXRvbWF0aW9uLmJyb3dzZXJzdGFjay5jb20vYnVpbGRzLyR7cHJvY2Vzcy5lbnZbQlJPV1NFUlNUQUNLX1RFU1RIVUJfVVVJRF19IHRvIHZpZXcgYnVpbGQgcmVwb3J0LCBpbnNpZ2h0cywgYW5kIG1hbnkgbW9yZSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gYWxsIGF0IG9uZSBwbGFjZSFcXG5gKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3Qgc3RhdHVzID0gKHJlc3VsdCAmJiByZXN1bHQuc3RhdHVzKSB8fCAnZmFpbGVkJ1xuICAgICAgICAgICAgY29uc3QgbWVzc2FnZSA9IChyZXN1bHQgJiYgcmVzdWx0Lm1lc3NhZ2UpXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZU8xMXlTdG9wRGF0YShmdW5uZWxEYXRhLCBzdGF0dXMsIHN0YXR1cyA9PT0gJ2ZhaWxlZCcgPyBtZXNzYWdlIDogdW5kZWZpbmVkKVxuICAgICAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICAgICAgICBCU3RhY2tMb2dnZXIuZXJyb3IoJ0Vycm9yIGluIHN0b3BwaW5nIFRlc3QgUmVwb3J0aW5nIGFuZCBBbmFseXRpY3MgYnVpbGQ6ICcgKyBlKVxuICAgICAgICAgICAgdGhpcy51cGRhdGVPMTF5U3RvcERhdGEoZnVubmVsRGF0YSwgJ2ZhaWxlZCcsIGUpXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzdGF0aWMgdXBkYXRlTzExeVN0b3BEYXRhKGZ1bm5lbERhdGE6IEZ1bm5lbERhdGEsIHN0YXR1czogc3RyaW5nLCBlcnJvcjogdW5rbm93biA9IHVuZGVmaW5lZCkge1xuICAgICAgICBjb25zdCB0b0RhdGEgPSBmdW5uZWxEYXRhPy5ldmVudF9wcm9wZXJ0aWVzPy5wcm9kdWN0VXNhZ2U/LnRlc3RPYnNlcnZhYmlsaXR5XG4gICAgICAgIC8vIFJldHVybiBpZiBubyBUZXN0IFJlcG9ydGluZyBhbmQgQW5hbHl0aWNzIGRhdGEgaW4gZnVubmVsIGRhdGFcbiAgICAgICAgaWYgKCF0b0RhdGEpIHtcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIGxldCBleGlzdGluZ1N0b3BEYXRhID0gdG9EYXRhLmV2ZW50cy5idWlsZEV2ZW50cy5maW5pc2hlZFxuICAgICAgICBleGlzdGluZ1N0b3BEYXRhID0gZXhpc3RpbmdTdG9wRGF0YSB8fCB7fVxuXG4gICAgICAgIGV4aXN0aW5nU3RvcERhdGEgPSB7XG4gICAgICAgICAgICAuLi5leGlzdGluZ1N0b3BEYXRhLFxuICAgICAgICAgICAgc3RhdHVzLFxuICAgICAgICAgICAgZXJyb3I6IGdldEVycm9yU3RyaW5nKGVycm9yKSxcbiAgICAgICAgICAgIHN0b3BwZWRGcm9tOiAnZXhpdEhvb2snXG4gICAgICAgIH1cbiAgICAgICAgdG9EYXRhLmV2ZW50cy5idWlsZEV2ZW50cy5maW5pc2hlZCA9IGV4aXN0aW5nU3RvcERhdGFcbiAgICB9XG5cbiAgICBzdGF0aWMgYXN5bmMgc2VuZEZ1bm5lbERhdGEoZnVubmVsRGF0YTogRnVubmVsRGF0YSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgZmlyZUZ1bm5lbFJlcXVlc3QoZnVubmVsRGF0YSlcbiAgICAgICAgICAgIEJTdGFja0xvZ2dlci5kZWJ1ZygnRnVubmVsIGRhdGEgc2VudCBzdWNjZXNzZnVsbHkgZnJvbSBjbGVhbnVwJylcbiAgICAgICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgICAgICAgQlN0YWNrTG9nZ2VyLmVycm9yKCdFcnJvciBpbiBzZW5kaW5nIGZ1bm5lbCBkYXRhOiAnICsgZSlcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHN0YXRpYyBnZXRGdW5uZWxEYXRhRnJvbUZpbGUoZmlsZVBhdGg6IHN0cmluZykge1xuICAgICAgICBpZiAoIWZpbGVQYXRoKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhmaWxlUGF0aCwgJ3V0ZjgnKVxuXG4gICAgICAgIGNvbnN0IGRhdGEgPSBKU09OLnBhcnNlKGNvbnRlbnQpXG4gICAgICAgIHRoaXMucmVtb3ZlRnVubmVsRGF0YUZpbGUoZmlsZVBhdGgpXG4gICAgICAgIHJldHVybiBkYXRhXG4gICAgfVxuXG4gICAgc3RhdGljIHJlbW92ZUZ1bm5lbERhdGFGaWxlKGZpbGVQYXRoPzogc3RyaW5nKSB7XG4gICAgICAgIGlmICghZmlsZVBhdGgpIHtcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIGZzLnJtU3luYyhmaWxlUGF0aCwgeyBmb3JjZTogdHJ1ZSB9KVxuICAgIH1cbn1cblxudm9pZCBCU3RhY2tDbGVhbnVwLnN0YXJ0Q2xlYW51cCgpXG4iLCAiaW1wb3J0IG9zIGZyb20gJ25vZGU6b3MnXG5pbXBvcnQgdXRpbCwgeyBmb3JtYXQgfSBmcm9tICdub2RlOnV0aWwnXG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnXG5pbXBvcnQgZnMgZnJvbSAnbm9kZTpmcydcbmltcG9ydCBVc2FnZVN0YXRzLCB7IHR5cGUgVXNhZ2VTdGF0IH0gZnJvbSAnLi4vdGVzdE9wcy91c2FnZVN0YXRzLmpzJ1xuaW1wb3J0IHsgQlN0YWNrTG9nZ2VyIH0gZnJvbSAnLi4vYnN0YWNrTG9nZ2VyLmpzJ1xuaW1wb3J0IHR5cGUgQnJvd3NlclN0YWNrQ29uZmlnIGZyb20gJy4uL2NvbmZpZy5qcydcbmltcG9ydCB7IEJTVEFDS19TRVJWSUNFX1ZFUlNJT04sIFdESU9fTkFNSU5HX1BSRUZJWCB9IGZyb20gJy4uL2NvbnN0YW50cy5qcydcbmltcG9ydCB7IGdldERhdGFGcm9tV29ya2VycyB9IGZyb20gJy4uL2RhdGEtc3RvcmUuanMnXG5pbXBvcnQgeyBnZXRQcm9kdWN0TWFwIH0gZnJvbSAnLi4vdGVzdEh1Yi91dGlscy5qcydcbmltcG9ydCBmZXRjaFdyYXAgZnJvbSAnLi4vZmV0Y2hXcmFwcGVyLmpzJ1xuaW1wb3J0IHR5cGUgeyBCcm93c2Vyc3RhY2tIZWFsaW5nIH0gZnJvbSAnQGJyb3dzZXJzdGFjay9haS1zZGstbm9kZSdcbmltcG9ydCB0eXBlIHsgRnVubmVsRGF0YSwgRXZlbnRQcm9wZXJ0aWVzIH0gZnJvbSAnLi4vdHlwZXMuanMnXG5pbXBvcnQgVGVzdE9wc0NvbmZpZyBmcm9tICcuLi90ZXN0T3BzL3Rlc3RPcHNDb25maWcuanMnXG5pbXBvcnQgQVBJVXRpbHMgZnJvbSAnLi4vY2xpL2FwaVV0aWxzLmpzJ1xuaW1wb3J0IFBlcmZvcm1hbmNlVGVzdGVyIGZyb20gJy4vcGVyZm9ybWFuY2UvcGVyZm9ybWFuY2UtdGVzdGVyLmpzJ1xuaW1wb3J0IHsgRVZFTlRTIH0gZnJvbSAnLi9wZXJmb3JtYW5jZS9jb25zdGFudHMuanMnXG5cbmFzeW5jIGZ1bmN0aW9uIGZpcmVGdW5uZWxUZXN0RXZlbnQoZXZlbnRUeXBlOiBzdHJpbmcsIGNvbmZpZzogQnJvd3NlclN0YWNrQ29uZmlnLCBpc0NMSUVuYWJsZWQgPSBmYWxzZSkge1xuICAgIGlmICghY29uZmlnLnVzZXJOYW1lIHx8ICFjb25maWcuYWNjZXNzS2V5KSB7XG4gICAgICAgIEJTdGFja0xvZ2dlci5kZWJ1ZygndXNlcm5hbWUvYWNjZXNza2V5IG5vdCBwYXNzZWQnKVxuICAgICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgICBjb25zdCBkYXRhID0gYnVpbGRFdmVudERhdGEoZXZlbnRUeXBlLCBjb25maWcsIGlzQ0xJRW5hYmxlZClcbiAgICAgICAgYXdhaXQgZmlyZUZ1bm5lbFJlcXVlc3QoZGF0YSlcbiAgICAgICAgQlN0YWNrTG9nZ2VyLmRlYnVnKCdGdW5uZWwgZXZlbnQgc3VjY2VzcycpXG4gICAgICAgIC8vIE9ubHkgdGhlIGZpbmlzaCBldmVudCBkaXNhcm1zIHRoZSBleGl0LXRpbWUgY2xlYW51cCByZXNlbmQgXHUyMDE0IG1hcmtpbmcgaXRcbiAgICAgICAgLy8gb24gU0RLVGVzdEF0dGVtcHRlZCBsZWZ0IGtpbGxlZCBydW5zIHdpdGggbm8gU0RLVGVzdFN1Y2Nlc3NmdWwgYXQgYWxsLlxuICAgICAgICBpZiAoZXZlbnRUeXBlID09PSAnU0RLVGVzdFN1Y2Nlc3NmdWwnKSB7XG4gICAgICAgICAgICBjb25maWcuc2VudEZ1bm5lbERhdGEoKVxuICAgICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgQlN0YWNrTG9nZ2VyLmRlYnVnKGBFeGNlcHRpb24gaW4gc2VuZGluZyBmdW5uZWwgZGF0YTogJHtmb3JtYXQoZXJyb3IpfWApXG4gICAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2VuZFN0YXJ0KGNvbmZpZzogQnJvd3NlclN0YWNrQ29uZmlnKSB7XG5cbiAgICAvLyBUcmFjayBmdW5uZWwgdGVzdCBhdHRlbXB0ZWQgZXZlbnRcbiAgICBQZXJmb3JtYW5jZVRlc3Rlci5zdGFydChFVkVOVFMuU0RLX0ZVTk5FTF9URVNUX0FUVEVNUFRFRClcbiAgICB0cnkge1xuICAgICAgICBhd2FpdCBmaXJlRnVubmVsVGVzdEV2ZW50KCdTREtUZXN0QXR0ZW1wdGVkJywgY29uZmlnKVxuICAgICAgICBQZXJmb3JtYW5jZVRlc3Rlci5lbmQoRVZFTlRTLlNES19GVU5ORUxfVEVTVF9BVFRFTVBURUQsIHRydWUpXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgUGVyZm9ybWFuY2VUZXN0ZXIuZW5kKEVWRU5UUy5TREtfRlVOTkVMX1RFU1RfQVRURU1QVEVELCBmYWxzZSwgZXJyb3IpXG4gICAgICAgIHRocm93IGVycm9yXG4gICAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2VuZEZpbmlzaChjb25maWc6IEJyb3dzZXJTdGFja0NvbmZpZywgaXNDTElFbmFibGVkID0gZmFsc2UpIHtcbiAgICAvLyBUcmFjayBmdW5uZWwgdGVzdCBzdWNjZXNzZnVsIGV2ZW50XG4gICAgUGVyZm9ybWFuY2VUZXN0ZXIuc3RhcnQoRVZFTlRTLlNES19GVU5ORUxfVEVTVF9TVUNDRVNTRlVMKVxuICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IGZpcmVGdW5uZWxUZXN0RXZlbnQoJ1NES1Rlc3RTdWNjZXNzZnVsJywgY29uZmlnLCBpc0NMSUVuYWJsZWQpXG4gICAgICAgIFBlcmZvcm1hbmNlVGVzdGVyLmVuZChFVkVOVFMuU0RLX0ZVTk5FTF9URVNUX1NVQ0NFU1NGVUwsIHRydWUpXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgUGVyZm9ybWFuY2VUZXN0ZXIuZW5kKEVWRU5UUy5TREtfRlVOTkVMX1RFU1RfU1VDQ0VTU0ZVTCwgZmFsc2UsIGVycm9yKVxuICAgICAgICB0aHJvdyBlcnJvclxuICAgIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNhdmVGdW5uZWxEYXRhKGV2ZW50VHlwZTogc3RyaW5nLCBjb25maWc6IEJyb3dzZXJTdGFja0NvbmZpZywgaXNDTElFbmFibGVkID0gZmFsc2UpOiBzdHJpbmcge1xuICAgIGNvbnN0IGRhdGEgPSBidWlsZEV2ZW50RGF0YShldmVudFR5cGUsIGNvbmZpZywgaXNDTElFbmFibGVkKVxuXG4gICAgQlN0YWNrTG9nZ2VyLmVuc3VyZUxvZ3NGb2xkZXIoKVxuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5qb2luKEJTdGFja0xvZ2dlci5sb2dGb2xkZXJQYXRoLCAnZnVubmVsRGF0YS5qc29uJylcbiAgICBmcy53cml0ZUZpbGVTeW5jKGZpbGVQYXRoLCBKU09OLnN0cmluZ2lmeShkYXRhKSlcbiAgICByZXR1cm4gZmlsZVBhdGhcbn1cblxuZnVuY3Rpb24gcmVkYWN0Q3JlZGVudGlhbHNGcm9tRnVubmVsRGF0YShkYXRhOiBGdW5uZWxEYXRhKSB7XG4gICAgaWYgKGRhdGEpIHtcbiAgICAgICAgaWYgKGRhdGEudXNlck5hbWUpIHtcbiAgICAgICAgICAgIGRhdGEudXNlck5hbWUgPSAnW1JFREFDVEVEXSdcbiAgICAgICAgfVxuICAgICAgICBpZiAoZGF0YS5hY2Nlc3NLZXkpIHtcbiAgICAgICAgICAgIGRhdGEuYWNjZXNzS2V5ID0gJ1tSRURBQ1RFRF0nXG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGRhdGFcbn1cblxuLy8gQ2FsbGVkIGZyb20gdHdvIGRpZmZlcmVudCBwcm9jZXNzXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZmlyZUZ1bm5lbFJlcXVlc3QoZGF0YTogRnVubmVsRGF0YSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHsgdXNlck5hbWUsIGFjY2Vzc0tleSB9ID0gZGF0YVxuICAgIHJlZGFjdENyZWRlbnRpYWxzRnJvbUZ1bm5lbERhdGEoZGF0YSlcblxuICAgIEJTdGFja0xvZ2dlci5kZWJ1ZygnU2VuZGluZyBTREsgZXZlbnQgd2l0aCBkYXRhICcgKyB1dGlsLmluc3BlY3QoZGF0YSwgeyBkZXB0aDogNiB9KSlcblxuICAgIGNvbnN0IGVuY29kZWRBdXRoID0gQnVmZmVyLmZyb20oYCR7dXNlck5hbWV9OiR7YWNjZXNzS2V5fWAsICd1dGY4JykudG9TdHJpbmcoJ2Jhc2U2NCcpXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaFdyYXAoQVBJVXRpbHMuRlVOTkVMX0lOU1RSVU1FTlRBVElPTl9VUkwsIHtcbiAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgICAgICBBdXRob3JpemF0aW9uOiBgQmFzaWMgJHtlbmNvZGVkQXV0aH1gLFxuICAgICAgICB9LFxuICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShkYXRhKVxuICAgIH0pXG4gICAgQlN0YWNrTG9nZ2VyLmRlYnVnKCdGdW5uZWwgRXZlbnQgUmVzcG9uc2U6ICcgKyBKU09OLnN0cmluZ2lmeShhd2FpdCByZXNwb25zZS50ZXh0KCkpKVxufVxuXG5mdW5jdGlvbiBnZXRQcm9kdWN0TGlzdChjb25maWc6IEJyb3dzZXJTdGFja0NvbmZpZykge1xuICAgIGNvbnN0IHByb2R1Y3RzOiBzdHJpbmdbXSA9IFtdXG4gICAgaWYgKGNvbmZpZy50ZXN0T2JzZXJ2YWJpbGl0eS5lbmFibGVkKSB7XG4gICAgICAgIHByb2R1Y3RzLnB1c2goJ29ic2VydmFiaWxpdHknKVxuICAgIH1cblxuICAgIGlmIChjb25maWcuYWNjZXNzaWJpbGl0eSkge1xuICAgICAgICBwcm9kdWN0cy5wdXNoKCdhY2Nlc3NpYmlsaXR5JylcbiAgICB9XG5cbiAgICBpZiAoY29uZmlnLnBlcmN5KSB7XG4gICAgICAgIHByb2R1Y3RzLnB1c2goJ3BlcmN5JylcbiAgICB9XG5cbiAgICBpZiAoY29uZmlnLmF1dG9tYXRlKSB7XG4gICAgICAgIHByb2R1Y3RzLnB1c2goJ2F1dG9tYXRlJylcbiAgICB9XG5cbiAgICBpZiAoY29uZmlnLmFwcEF1dG9tYXRlKSB7XG4gICAgICAgIHByb2R1Y3RzLnB1c2goJ2FwcC1hdXRvbWF0ZScpXG4gICAgfVxuICAgIHJldHVybiBwcm9kdWN0c1xufVxuXG5mdW5jdGlvbiBidWlsZEV2ZW50RGF0YShldmVudFR5cGU6IHN0cmluZywgY29uZmlnOiBCcm93c2VyU3RhY2tDb25maWcsIGlzQ0xJRW5hYmxlZCA9IGZhbHNlKSB7XG4gICAgY29uc3QgZXZlbnRQcm9wZXJ0aWVzOiBFdmVudFByb3BlcnRpZXMgPSB7XG4gICAgICAgIC8vIEZyYW1ld29yayBEZXRhaWxzXG4gICAgICAgIHNka1J1bklkOiBjb25maWc/LnNka1J1bklELFxuICAgICAgICB0ZXN0aHViX3V1aWQ6IFRlc3RPcHNDb25maWcuZ2V0SW5zdGFuY2UoKS5idWlsZEhhc2hlZElkLFxuICAgICAgICBsYW5ndWFnZV9mcmFtZXdvcms6IGdldExhbmd1YWdlRnJhbWV3b3JrKGNvbmZpZy5mcmFtZXdvcmspLFxuICAgICAgICByZWZlcnJlcjogZ2V0UmVmZXJyZXIoY29uZmlnLmZyYW1ld29yayksXG4gICAgICAgIGxhbmd1YWdlOiAnV2ViZHJpdmVySU8nLFxuICAgICAgICBsYW5ndWFnZVZlcnNpb246IHByb2Nlc3MudmVyc2lvbixcblxuICAgICAgICAvLyBCdWlsZCBEZXRhaWxzXG4gICAgICAgIGJ1aWxkTmFtZTogY29uZmlnLmJ1aWxkTmFtZSB8fCAndW5kZWZpbmVkJyxcbiAgICAgICAgYnVpbGRJZGVudGlmaWVyOiBTdHJpbmcoY29uZmlnLmJ1aWxkSWRlbnRpZmllciksXG5cbiAgICAgICAgLy8gSG9zdCBkZXRhaWxzXG4gICAgICAgIG9zOiBvcy50eXBlKCkgfHwgJ3Vua25vd24nLFxuICAgICAgICBob3N0bmFtZTogb3MuaG9zdG5hbWUoKSB8fCAndW5rbm93bicsXG5cbiAgICAgICAgLy8gUHJvZHVjdCBEZXRhaWxzXG4gICAgICAgIHByb2R1Y3RNYXA6IGdldFByb2R1Y3RNYXAoY29uZmlnKSxcbiAgICAgICAgcHJvZHVjdDogZ2V0UHJvZHVjdExpc3QoY29uZmlnKSxcblxuICAgICAgICAvLyBmcmFtZXdvcmsgZGV0YWlsc1xuICAgICAgICBmcmFtZXdvcms6IGNvbmZpZy5mcmFtZXdvcmssXG5cbiAgICAgICAgLy8gQ0xJIERldGFpbHNcbiAgICAgICAgaXNDTElFbmFibGVkOiBpc0NMSUVuYWJsZWRcbiAgICB9XG5cbiAgICBpZiAoZXZlbnRUeXBlID09PSAnU0RLVGVzdFN1Y2Nlc3NmdWwnKSB7XG4gICAgICAgIGNvbnN0IHdvcmtlckRhdGEgPSBnZXREYXRhRnJvbVdvcmtlcnMoKVxuICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgIGV2ZW50UHJvcGVydGllcy5wcm9kdWN0VXNhZ2UgPSBnZXRQcm9kdWN0VXNhZ2Uod29ya2VyRGF0YSlcbiAgICAgICAgaWYgKHByb2Nlc3MuZW52LkJTVEFDS19BMTFZX1BPTExJTkdfVElNRU9VVCkge1xuICAgICAgICAgICAgZXZlbnRQcm9wZXJ0aWVzLnBvbGxpbmdUaW1lb3V0ID0gcHJvY2Vzcy5lbnYuQlNUQUNLX0ExMVlfUE9MTElOR19USU1FT1VUIGFzIHN0cmluZ1xuICAgICAgICB9XG4gICAgICAgIC8vIElmIGFueSB3b3JrZXIgY2FsbGVkIGJyb3dzZXIucmVsb2FkU2Vzc2lvbigpLCBtYXJrIHRoZSBidWlsZCBzbyB0aGVcbiAgICAgICAgLy8gc2Vzc2lvbi1saW5raW5nIGRhc2hib2FyZCBjYW4gZXhjbHVkZSBpdHMgKGV4cGVjdGVkKSByZWxvYWQtb3JwaGFuZWQgc2Vzc2lvbnMuXG4gICAgICAgIHR5cGUgV29ya2VyUmVjb3JkID0geyByZWxvYWRIYXBwZW5lZD86IGJvb2xlYW47IHVzYWdlU3RhdHM/OiB1bmtub3duIH1cbiAgICAgICAgY29uc3QgcmVsb2FkSGFwcGVuZWQgPSB3b3JrZXJEYXRhLnNvbWUoKHdvcmtlcikgPT4gKHdvcmtlciBhcyBXb3JrZXJSZWNvcmQpLnJlbG9hZEhhcHBlbmVkID09PSB0cnVlKVxuICAgICAgICBpZiAocmVsb2FkSGFwcGVuZWQpIHtcbiAgICAgICAgICAgIGV2ZW50UHJvcGVydGllcy5maW5pc2hlZE1ldGFkYXRhID0geyByZWFzb246ICdzZXNzaW9uX3JlbG9hZGVkJyB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gQSBzaWduYWwtdGVybWluYXRlZCBydW4gbXVzdCBiZSBxdWVyeS1kZXRlY3RhYmxlIFx1MjAxNCBraWxsIHdpbnMgb3ZlclxuICAgICAgICAvLyByZWxvYWQgYXMgdGhlIGZpbmlzaCByZWFzb24uXG4gICAgICAgIGlmIChjb25maWcua2lsbFNpZ25hbCkge1xuICAgICAgICAgICAgZXZlbnRQcm9wZXJ0aWVzLmZpbmlzaGVkTWV0YWRhdGEgPSB7IHJlYXNvbjogJ3VzZXJfa2lsbGVkJywgc2lnbmFsOiBjb25maWcua2lsbFNpZ25hbCB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgICB1c2VyTmFtZTogY29uZmlnLnVzZXJOYW1lLFxuICAgICAgICBhY2Nlc3NLZXk6IGNvbmZpZy5hY2Nlc3NLZXksXG4gICAgICAgIGV2ZW50X3R5cGU6IGV2ZW50VHlwZSxcbiAgICAgICAgZGV0ZWN0ZWRGcmFtZXdvcms6IFdESU9fTkFNSU5HX1BSRUZJWCArIGNvbmZpZy5mcmFtZXdvcmssXG4gICAgICAgIGV2ZW50X3Byb3BlcnRpZXM6IGV2ZW50UHJvcGVydGllc1xuICAgIH0gYXMgdW5rbm93biBhcyBGdW5uZWxEYXRhXG5cbn1cblxuZnVuY3Rpb24gZ2V0UHJvZHVjdFVzYWdlKHdvcmtlcnNEYXRhOiB7IHVzYWdlU3RhdHM6IFVzYWdlU3RhdCB9W10pIHtcbiAgICByZXR1cm4ge1xuICAgICAgICB0ZXN0T2JzZXJ2YWJpbGl0eTogVXNhZ2VTdGF0cy5nZXRJbnN0YW5jZSgpLmdldEZvcm1hdHRlZERhdGEod29ya2Vyc0RhdGEpXG4gICAgfVxufVxuXG5mdW5jdGlvbiBnZXRMYW5ndWFnZUZyYW1ld29yayhmcmFtZXdvcms/OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gJ1dlYmRyaXZlcklPXycgKyBmcmFtZXdvcmtcbn1cblxuZnVuY3Rpb24gZ2V0UmVmZXJyZXIoZnJhbWV3b3JrPzogc3RyaW5nKSB7XG4gICAgY29uc3QgZnVsbE5hbWUgPSBmcmFtZXdvcmsgPyBXRElPX05BTUlOR19QUkVGSVggKyBmcmFtZXdvcmsgOiAnV2ViZHJpdmVySU8nXG4gICAgcmV0dXJuIGAke2Z1bGxOYW1lfS8ke0JTVEFDS19TRVJWSUNFX1ZFUlNJT059YFxufVxuXG5jb25zdCBzZW5kRXZlbnQgPSB7XG4gICAgdGNnRG93bjogKGNvbmZpZzogQnJvd3NlclN0YWNrQ29uZmlnKSA9PiBmaXJlRnVubmVsVGVzdEV2ZW50KCdTREtUZXN0VGNnRG93blJlc3BvbnNlJywgY29uZmlnKSxcbiAgICBpbnZhbGlkVGNnQXV0aDogKGNvbmZpZzogQnJvd3NlclN0YWNrQ29uZmlnKSA9PiBmaXJlRnVubmVsVGVzdEV2ZW50KCdTREtUZXN0SW52YWxpZFRjZ0F1dGhSZXNwb25zZVdpdGhVc2VySW1wYWN0JywgY29uZmlnKSxcbiAgICB0Y2dBdXRoRmFpbHVyZTogKGNvbmZpZzogQnJvd3NlclN0YWNrQ29uZmlnKSA9PiBmaXJlRnVubmVsVGVzdEV2ZW50KCdTREtUZXN0VGNnQXV0aEZhaWx1cmUnLCBjb25maWcpLFxuICAgIHRjZ3RJbml0U3VjY2Vzc2Z1bDogKGNvbmZpZzogQnJvd3NlclN0YWNrQ29uZmlnKSA9PiBmaXJlRnVubmVsVGVzdEV2ZW50KCdTREtUZXN0VGNndEluaXRTdWNjZXNzZnVsJywgY29uZmlnKSxcbiAgICBpbml0RmFpbGVkOiAoY29uZmlnOiBCcm93c2VyU3RhY2tDb25maWcpID0+IGZpcmVGdW5uZWxUZXN0RXZlbnQoJ1NES1Rlc3RJbml0RmFpbGVkUmVzcG9uc2UnLCBjb25maWcpLFxuICAgIHRjZ1Byb3h5RmFpbHVyZTogKGNvbmZpZzogQnJvd3NlclN0YWNrQ29uZmlnKSA9PiBmaXJlRnVubmVsVGVzdEV2ZW50KCdTREtUZXN0VGNnUHJveHlGYWlsdXJlJywgY29uZmlnKSxcbn1cblxuZnVuY3Rpb24gaXNQcm94eUVycm9yKGF1dGhSZXN1bHQ6IHsgc3RhdHVzPzogbnVtYmVyIH0pOiBib29sZWFuIHtcbiAgICByZXR1cm4gKGF1dGhSZXN1bHQgYXMgQnJvd3NlcnN0YWNrSGVhbGluZy5Jbml0RXJyb3JSZXNwb25zZSk/LnN0YXR1cyA9PT0gNTAyXG59XG5cbmZ1bmN0aW9uIGhhbmRsZVByb3h5RXJyb3IoY29uZmlnOiBCcm93c2VyU3RhY2tDb25maWcsIGlzU2VsZkhlYWxFbmFibGVkOiBib29sZWFuIHwgdW5kZWZpbmVkKSB7XG4gICAgc2VuZEV2ZW50LnRjZ1Byb3h5RmFpbHVyZShjb25maWcpXG4gICAgaWYgKGlzU2VsZkhlYWxFbmFibGVkKSB7XG4gICAgICAgIEJTdGFja0xvZ2dlci53YXJuKCdQcm94eSBFcnJvci4gRGlzYWJsaW5nIEhlYWxpbmcgZm9yIHRoaXMgc2Vzc2lvbi4nKVxuICAgIH1cbn1cblxuZnVuY3Rpb24gaGFuZGxlVXBncmFkZVJlcXVpcmVkKGlzU2VsZkhlYWxFbmFibGVkOiBib29sZWFuIHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKGlzU2VsZkhlYWxFbmFibGVkKSB7XG4gICAgICAgIEJTdGFja0xvZ2dlci53YXJuKCdQbGVhc2UgdXBncmFkZSBCcm93c2Vyc3RhY2sgU2VydmljZSB0byB0aGUgbGF0ZXN0IHZlcnNpb24gdG8gdXNlIHRoZSBzZWxmLWhlYWxpbmcgZmVhdHVyZS4nKVxuICAgIH1cbn1cblxuZnVuY3Rpb24gaGFuZGxlQXV0aGVudGljYXRpb25GYWlsdXJlKHN0YXR1czogbnVtYmVyLCBjb25maWc6IEJyb3dzZXJTdGFja0NvbmZpZywgaXNTZWxmSGVhbEVuYWJsZWQ6IGJvb2xlYW4gfCB1bmRlZmluZWQpIHtcbiAgICBpZiAoc3RhdHVzID49IDUwMCkge1xuICAgICAgICBpZiAoaXNTZWxmSGVhbEVuYWJsZWQpIHtcbiAgICAgICAgICAgIEJTdGFja0xvZ2dlci53YXJuKCdTb21ldGhpbmcgd2VudCB3cm9uZy4gRGlzYWJsaW5nIGhlYWxpbmcgZm9yIHRoaXMgc2Vzc2lvbi4gUGxlYXNlIHRyeSBhZ2FpbiBsYXRlci4nKVxuICAgICAgICB9XG4gICAgICAgIHNlbmRFdmVudC50Y2dEb3duKGNvbmZpZylcbiAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoaXNTZWxmSGVhbEVuYWJsZWQpIHtcbiAgICAgICAgICAgIEJTdGFja0xvZ2dlci53YXJuKCdBdXRoZW50aWNhdGlvbiBGYWlsZWQuIERpc2FibGluZyBIZWFsaW5nIGZvciB0aGlzIHNlc3Npb24uJylcbiAgICAgICAgfVxuICAgICAgICBzZW5kRXZlbnQudGNnQXV0aEZhaWx1cmUoY29uZmlnKVxuICAgIH1cbn1cblxuZnVuY3Rpb24gaGFuZGxlQXV0aGVudGljYXRpb25TdWNjZXNzKFxuICAgIGlzSGVhbGluZ0VuYWJsZWRGb3JVc2VyOiBib29sZWFuLFxuICAgIHVzZXJJZDogc3RyaW5nLFxuICAgIGNvbmZpZzogQnJvd3NlclN0YWNrQ29uZmlnLFxuICAgIGlzU2VsZkhlYWxFbmFibGVkOiBib29sZWFuIHwgdW5kZWZpbmVkXG4pIHtcbiAgICBpZiAoIWlzSGVhbGluZ0VuYWJsZWRGb3JVc2VyICYmIGlzU2VsZkhlYWxFbmFibGVkKSB7XG4gICAgICAgIEJTdGFja0xvZ2dlci53YXJuKCdIZWFsaW5nIGlzIG5vdCBlbmFibGVkIGZvciB5b3VyIGdyb3VwLCBwbGVhc2UgY29udGFjdCB0aGUgYWRtaW4nKVxuICAgIH0gZWxzZSBpZiAodXNlcklkICYmIGlzSGVhbGluZ0VuYWJsZWRGb3JVc2VyKSB7XG4gICAgICAgIHNlbmRFdmVudC50Y2d0SW5pdFN1Y2Nlc3NmdWwoY29uZmlnKVxuICAgIH1cbn1cblxuZnVuY3Rpb24gaGFuZGxlSW5pdGlhbGl6YXRpb25GYWlsdXJlKHN0YXR1czogbnVtYmVyLCBjb25maWc6IEJyb3dzZXJTdGFja0NvbmZpZywgaXNTZWxmSGVhbEVuYWJsZWQ6IGJvb2xlYW4gfCB1bmRlZmluZWQpIHtcbiAgICBpZiAoc3RhdHVzID49IDQwMCkge1xuICAgICAgICBzZW5kRXZlbnQuaW5pdEZhaWxlZChjb25maWcpXG4gICAgfSBlbHNlIGlmICghc3RhdHVzICYmIGlzU2VsZkhlYWxFbmFibGVkKSB7XG4gICAgICAgIHNlbmRFdmVudC5pbnZhbGlkVGNnQXV0aChjb25maWcpXG4gICAgfVxuXG4gICAgaWYgKGlzU2VsZkhlYWxFbmFibGVkKSB7XG4gICAgICAgIEJTdGFja0xvZ2dlci53YXJuKCdBdXRoZW50aWNhdGlvbiBGYWlsZWQuIEhlYWxpbmcgd2lsbCBiZSBkaXNhYmxlZCBmb3IgdGhpcyBzZXNzaW9uLicpXG4gICAgfVxufVxuXG5pbnRlcmZhY2UgQXV0aFJlc3VsdCB7XG4gICAgbWVzc2FnZTogc3RyaW5nXG4gICAgaXNBdXRoZW50aWNhdGVkOiBib29sZWFuXG4gICAgc3RhdHVzOiBudW1iZXJcbiAgICB1c2VySWQ6IHN0cmluZ1xuICAgIGdyb3VwSWQ6IHN0cmluZ1xuICAgIGlzSGVhbGluZ0VuYWJsZWQ6IGJvb2xlYW5cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGhhbmRsZUhlYWxpbmdJbnN0cnVtZW50YXRpb24oXG4gICAgYXV0aFJlc3VsdDogQXV0aFJlc3VsdCxcbiAgICBjb25maWc6IEJyb3dzZXJTdGFja0NvbmZpZyxcbiAgICBpc1NlbGZIZWFsRW5hYmxlZDogYm9vbGVhbiB8IHVuZGVmaW5lZCxcbikge1xuICAgIHRyeSB7XG4gICAgICAgIGlmIChpc1Byb3h5RXJyb3IoYXV0aFJlc3VsdCkpIHtcbiAgICAgICAgICAgIGhhbmRsZVByb3h5RXJyb3IoY29uZmlnLCBpc1NlbGZIZWFsRW5hYmxlZClcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgeyBtZXNzYWdlLCBpc0F1dGhlbnRpY2F0ZWQsIHN0YXR1cywgdXNlcklkLCBncm91cElkLCBpc0hlYWxpbmdFbmFibGVkOiBpc0hlYWxpbmdFbmFibGVkRm9yVXNlciB9ID0gYXV0aFJlc3VsdFxuXG4gICAgICAgIGlmIChtZXNzYWdlID09PSAnVXBncmFkZSByZXF1aXJlZCcpIHtcbiAgICAgICAgICAgIGhhbmRsZVVwZ3JhZGVSZXF1aXJlZChpc1NlbGZIZWFsRW5hYmxlZClcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFpc0F1dGhlbnRpY2F0ZWQpIHtcbiAgICAgICAgICAgIGhhbmRsZUF1dGhlbnRpY2F0aW9uRmFpbHVyZShzdGF0dXMsIGNvbmZpZywgaXNTZWxmSGVhbEVuYWJsZWQpXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpc0F1dGhlbnRpY2F0ZWQgJiYgdXNlcklkICYmIGdyb3VwSWQpIHtcbiAgICAgICAgICAgIGhhbmRsZUF1dGhlbnRpY2F0aW9uU3VjY2Vzcyhpc0hlYWxpbmdFbmFibGVkRm9yVXNlciwgdXNlcklkLCBjb25maWcsIGlzU2VsZkhlYWxFbmFibGVkKVxuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc3RhdHVzID49IDQwMCB8fCAhc3RhdHVzKSB7XG4gICAgICAgICAgICBoYW5kbGVJbml0aWFsaXphdGlvbkZhaWx1cmUoc3RhdHVzLCBjb25maWcsIGlzU2VsZkhlYWxFbmFibGVkKVxuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBCU3RhY2tMb2dnZXIuZGVidWcoJ0Vycm9yIGluIGhhbmRsaW5nIGhlYWxpbmcgaW5zdHJ1bWVudGF0aW9uOiAnICsgZXJyKVxuICAgIH1cbn1cbiIsICJpbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnXG5pbXBvcnQgZnMgZnJvbSAnbm9kZTpmcydcblxuaW1wb3J0IHsgQlN0YWNrTG9nZ2VyIH0gZnJvbSAnLi9ic3RhY2tMb2dnZXIuanMnXG5cbmNvbnN0IHdvcmtlcnNEYXRhRGlyUGF0aCA9IHBhdGguam9pbihwcm9jZXNzLmN3ZCgpLCAnbG9ncycsICd3b3JrZXJfZGF0YScpXG5cbmV4cG9ydCBmdW5jdGlvbiBnZXREYXRhRnJvbVdvcmtlcnMoKXtcbiAgICBjb25zdCB3b3JrZXJzRGF0YTogUmVjb3JkPHN0cmluZywgb2JqZWN0PltdID0gW11cblxuICAgIGlmICghZnMuZXhpc3RzU3luYyh3b3JrZXJzRGF0YURpclBhdGgpKSB7XG4gICAgICAgIHJldHVybiB3b3JrZXJzRGF0YVxuICAgIH1cblxuICAgIGNvbnN0IGZpbGVzID0gZnMucmVhZGRpclN5bmMod29ya2Vyc0RhdGFEaXJQYXRoKVxuICAgIGZpbGVzLmZvckVhY2goKGZpbGUpID0+IHtcbiAgICAgICAgQlN0YWNrTG9nZ2VyLmRlYnVnKCdSZWFkaW5nIHdvcmtlciBmaWxlICcgKyBmaWxlKVxuICAgICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGguam9pbih3b3JrZXJzRGF0YURpclBhdGgsIGZpbGUpXG4gICAgICAgIGNvbnN0IGZpbGVDb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKGZpbGVQYXRoLCAndXRmOCcpXG4gICAgICAgIGNvbnN0IHdvcmtlckRhdGEgPSBKU09OLnBhcnNlKGZpbGVDb250ZW50KVxuICAgICAgICB3b3JrZXJzRGF0YS5wdXNoKHdvcmtlckRhdGEpXG4gICAgfSlcblxuICAgIC8vIFJlbW92ZSB3b3JrZXIgZGF0YSBhZnRlciBhbGwgcmVhZGluZ1xuICAgIHJlbW92ZVdvcmtlcnNEYXRhRGlyKClcblxuICAgIHJldHVybiB3b3JrZXJzRGF0YVxufVxuXG5leHBvcnQgZnVuY3Rpb24gc2F2ZVdvcmtlckRhdGEoZGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pIHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGguam9pbih3b3JrZXJzRGF0YURpclBhdGgsICd3b3JrZXItZGF0YS0nICsgcHJvY2Vzcy5waWQgKyAnLmpzb24nKVxuXG4gICAgdHJ5IHtcbiAgICAgICAgY3JlYXRlV29ya2Vyc0RhdGFEaXIoKVxuICAgICAgICBmcy53cml0ZUZpbGVTeW5jKGZpbGVQYXRoLCBKU09OLnN0cmluZ2lmeShkYXRhKSlcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIEJTdGFja0xvZ2dlci5kZWJ1ZygnRXhjZXB0aW9uIGluIHNhdmluZyB3b3JrZXIgZGF0YTogJyArIGUpXG4gICAgfVxufVxuXG5mdW5jdGlvbiByZW1vdmVXb3JrZXJzRGF0YURpcigpOiBib29sZWFuIHtcbiAgICBmcy5ybVN5bmMod29ya2Vyc0RhdGFEaXJQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSwgZm9yY2U6IHRydWUgfSlcbiAgICByZXR1cm4gdHJ1ZVxufVxuXG5mdW5jdGlvbiBjcmVhdGVXb3JrZXJzRGF0YURpcigpIHtcbiAgICBpZiAoIWZzLmV4aXN0c1N5bmMod29ya2Vyc0RhdGFEaXJQYXRoKSkge1xuICAgICAgICBmcy5ta2RpclN5bmMod29ya2Vyc0RhdGFEaXJQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZVxufVxuIl0sCiAgIm1hcHBpbmdzIjogIjtBQUFBLFNBQVMsWUFBQUEsV0FBVSxZQUFBQyxXQUFVLFFBQUFDLE9BQU0sV0FBQUMsVUFBUyxRQUFBQyxPQUFNLGNBQWM7QUFDaEUsT0FBTyxZQUFZO0FBQ25CLE9BQU9DLFNBQVE7QUFDZixPQUFPLFVBQVU7QUFDakIsU0FBUyxRQUFRLGFBQUFDLGtCQUFpQjtBQUNsQyxPQUFPQyxXQUFVO0FBQ2pCLE9BQU9DLFdBQVU7QUFNakIsT0FBTyxpQkFBaUI7QUFDeEIsT0FBTyxlQUFlO0FBRXRCLFNBQVMsZUFBQUMsb0JBQW1COzs7QUNm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LFlBQVk7QUFDakQsdUJBQW1CLG9CQUFvQixDQUFDO0FBRXhDLHVCQUFtQjtBQUFBLE1BQ2YsR0FBRztBQUFBLE1BQ0g7QUFBQSxNQUNBLE9BQU8sZUFBZSxLQUFLO0FBQUEsTUFDM0IsYUFBYTtBQUFBLElBQ2pCO0FBQ0EsV0FBTyxPQUFPLFlBQVksV0FBVztBQUFBLEVBQ3pDO0FBQUEsRUFFQSxhQUFhLGVBQWUsWUFBd0I7QUFDaEQsUUFBSTtBQUNBLFlBQU0sa0JBQWtCLFVBQVU7QUFDbEMsbUJBQWEsTUFBTSw0Q0FBNEM7QUFBQSxJQUNuRSxTQUFTLEdBQVk7QUFDakIsbUJBQWEsTUFBTSxtQ0FBbUMsQ0FBQztBQUFBLElBQzNEO0FBQUEsRUFDSjtBQUFBLEVBRUEsT0FBTyxzQkFBc0IsVUFBa0I7QUFDM0MsUUFBSSxDQUFDLFVBQVU7QUFDWCxhQUFPO0FBQUEsSUFDWDtBQUVBLFVBQU0sVUFBVUMsS0FBRyxhQUFhLFVBQVUsTUFBTTtBQUVoRCxVQUFNLE9BQU8sS0FBSyxNQUFNLE9BQU87QUFDL0IsU0FBSyxxQkFBcUIsUUFBUTtBQUNsQyxXQUFPO0FBQUEsRUFDWDtBQUFBLEVBRUEsT0FBTyxxQkFBcUIsVUFBbUI7QUFDM0MsUUFBSSxDQUFDLFVBQVU7QUFDWDtBQUFBLElBQ0o7QUFDQSxJQUFBQSxLQUFHLE9BQU8sVUFBVSxFQUFFLE9BQU8sS0FBSyxDQUFDO0FBQUEsRUFDdkM7QUFDSjtBQUVBLEtBQUssY0FBYyxhQUFhOyIsCiAgIm5hbWVzIjogWyJob3N0bmFtZSIsICJwbGF0Zm9ybSIsICJ0eXBlIiwgInZlcnNpb24iLCAiYXJjaCIsICJmcyIsICJwcm9taXNpZnkiLCAicGF0aCIsICJ1dGlsIiwgInBlcmZvcm1hbmNlIiwgImZzIiwgInV0aWwiLCAicGF0aCIsICJhcmNoIiwgInBsYXRmb3JtIiwgInBhdGgiLCAiZnMiLCAiY2hhbGsiLCAibG9nZ2VyIiwgImxvZyIsICJsb2dnZXIiLCAiQlN0YWNrTG9nZ2VyIiwgInBhdGgiLCAiZnMiLCAiY2hhbGsiLCAiQlN0YWNrTG9nZ2VyIiwgImZzIiwgInBhdGgiLCAicGxhdGZvcm0iLCAiQlN0YWNrTG9nZ2VyIiwgImZzIiwgInZlcnNpb24iLCAicGF0aCIsICJwcm9jZXNzIiwgIm9wZW5SZWFkU3RyZWFtUHJvbWlzZSIsICJwYXRoIiwgImZzIiwgInV0aWwiLCAidHlwZSIsICJwbGF0Zm9ybSIsICJhcmNoIiwgImZzIiwgImZzIiwgImZzIiwgInBhdGgiLCAiZnMiLCAicGF0aCIsICJmcyIsICJwYXRoIiwgImdyb3VwIiwgInBhdGgiLCAiZnMiLCAicGF0aCIsICJmcyIsICJwcm9taXNpZnkiLCAidXRpbCIsICJwZXJmb3JtYW5jZSIsICJsYXVuY2hUZXN0U2Vzc2lvbiIsICJob3N0bmFtZSIsICJwbGF0Zm9ybSIsICJ0eXBlIiwgInZlcnNpb24iLCAiYXJjaCIsICJ1dGlsIiwgInN0b3BCdWlsZFVwc3RyZWFtIiwgInBhdGgiLCAiZnMiLCAicGF0aCIsICJnZXRQbGF0Zm9ybVZlcnNpb24iLCAiZ2V0UmVzb2x2ZWREZXZpY2VOYW1lIiwgInBhdGgiLCAiaGFzaCIsICJmcyIsICJwYXRoIiwgInBhdGgiLCAiZnMiLCAicGF0aCIsICJmcyIsICJwYXRoIiwgImZzIiwgInV0aWwiLCAib3MiLCAidXRpbCIsICJmb3JtYXQiLCAicGF0aCIsICJmcyIsICJwYXRoIiwgImZzIiwgInBhdGgiLCAidXRpbCIsICJ1dGlsIiwgImZzIl0KfQo=
|