cdk-nextjs 0.7.0 → 0.7.2
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/.jsii +38 -38
- package/README.md +1 -0
- package/docs/breaking-changes.md +4 -2
- package/docs/native-dependencies-guide.md +223 -0
- package/lib/adapter/adapter.mjs +4 -1
- package/lib/adapter/build-outputs.js +8 -3
- package/lib/adapter/build-outputs.test.js +3 -1
- package/lib/nextjs-api.js +1 -1
- package/lib/nextjs-build/nextjs-build.d.ts +25 -0
- package/lib/nextjs-build/nextjs-build.js +103 -2
- package/lib/nextjs-build/nextjs-build.test.js +50 -1
- package/lib/nextjs-cache.js +1 -1
- package/lib/nextjs-compute/nextjs-containers.js +1 -1
- package/lib/nextjs-compute/nextjs-functions.js +1 -1
- package/lib/nextjs-distribution.js +1 -1
- package/lib/nextjs-post-deploy.js +1 -1
- package/lib/nextjs-static-assets.js +1 -1
- package/lib/root-constructs/nextjs-base-construct.js +1 -1
- package/lib/root-constructs/nextjs-global-containers.js +1 -1
- package/lib/root-constructs/nextjs-global-functions.js +1 -1
- package/lib/root-constructs/nextjs-regional-containers.js +1 -1
- package/lib/root-constructs/nextjs-regional-functions.js +1 -1
- package/lib/runtime/core.js +4 -1
- package/lib/runtime/core.test.js +9 -1
- package/lib/runtime/lambda.mjs +5 -0
- package/lib/runtime/next-modules.d.ts +16 -0
- package/lib/runtime/next-modules.js +21 -1
- package/lib/runtime/server.mjs +5 -0
- package/package.json +1 -1
package/lib/runtime/core.js
CHANGED
|
@@ -887,6 +887,9 @@ async function loadRuntime(deploymentRoot) {
|
|
|
887
887
|
// Then, before any entrypoint (or middleware) can be loaded: Next's own
|
|
888
888
|
// node-environment bootstrap. See `setupNodeEnvironment`.
|
|
889
889
|
(0, next_modules_1.setupNodeEnvironment)();
|
|
890
|
+
// And last, once the environment is ready: `register()`, before any entrypoint
|
|
891
|
+
// or middleware module is evaluated. See `registerInstrumentation`.
|
|
892
|
+
await (0, next_modules_1.registerInstrumentation)(projectDir, manifest.config.distDir);
|
|
890
893
|
return new NextjsRuntime({
|
|
891
894
|
deploymentRoot,
|
|
892
895
|
manifest,
|
|
@@ -1210,4 +1213,4 @@ async function sendWebResponse(res, response) {
|
|
|
1210
1213
|
}
|
|
1211
1214
|
res.end();
|
|
1212
1215
|
}
|
|
1213
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29yZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydW50aW1lL2NvcmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBeTlCQSx3REFnQkM7QUFtREQsc0RBK0JDO0FBbUJELGtDQXVEQztBQWlJRCw4QkEyQ0M7QUFqekNELHNEQUFzRDtBQUN0RDs7Ozs7Ozs7Ozs7R0FXRztBQUNILCtDQUE0QztBQUU1Qyx5Q0FBaUM7QUFDakMsNkNBQWlEO0FBQ2pELG1EQUFvRDtBQUNwRCx5Q0FLb0I7QUFDcEIsK0NBSXVCO0FBQ3ZCLDRDQUE0RTtBQUM1RSw4Q0FJeUI7QUFDekIsc0NBQXVEO0FBQ3ZELG1DQUF1RTtBQUN2RSx5Q0FNb0I7QUFDcEIsNkNBQWdEO0FBQ2hELGlEQUl3QjtBQUN4QixpREFBa0U7QUFDbEUsaURBQW9FO0FBQ3BFLGlDQUEwRTtBQStEMUUsTUFBYSxhQUFhO0lBVVk7SUFUbkIsV0FBVyxDQUFxQjtJQUNoQyxVQUFVLENBQWE7SUFDdkIsVUFBVSxDQUFvQjtJQUM5QixNQUFNLENBQXdCO0lBQy9DLDJDQUEyQztJQUMxQixjQUFjLENBQXlDO0lBQ3hFLGtFQUFrRTtJQUNqRCxZQUFZLENBQVU7SUFFdkMsWUFBb0MsT0FBNkI7UUFBN0IsWUFBTyxHQUFQLE9BQU8sQ0FBc0I7UUFDL0QsTUFBTSxFQUFFLFFBQVEsRUFBRSxjQUFjLEVBQUUsR0FBRyxPQUFPLENBQUM7UUFDN0MsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLGdDQUFrQixDQUFDLGNBQWMsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUNwRSx3REFBd0Q7UUFDeEQsTUFBTSxXQUFXLEdBQUcsSUFBQSxpQ0FBa0IsRUFBQyxjQUFjLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDakUsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLHFCQUFVLENBQUM7WUFDL0IsUUFBUTtZQUNSLFdBQVcsRUFBRSxXQUFXLENBQUMsS0FBSztTQUMvQixDQUFDLENBQUM7UUFDSCww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S0FBSyxJQUFJLFFBQVEsQ0FBQyxJQUE0QyxFQUFFLENBQUM7UUFDaEYsMEVBQTBFO1FBQzFFLGlFQUFpRTtRQUNqRSxJQUFJLEdBQUcsQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUNsQixPQUFPO1FBQ1QsQ0FBQztRQUNELHlFQUF5RTtRQUN6RSx3REFBd0Q7UUFDeEQsTUFBTSxRQUFRLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNsQywwRUFBMEU7UUFDMUUsd0VBQXdFO1FBQ3hFLDRFQUE0RTtRQUM1RSwyRUFBMkU7UUFDM0UsR0FBRyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUM7UUFDZCxJQUFJLENBQUMsUUFBUSxJQUFJLENBQUMsQ0FBQyxNQUFNLElBQUEsY0FBTyxFQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUN2QyxPQUFPO1FBQ1QsQ0FBQztJQUNILENBQUM7SUFDRCxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDWixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgaW1wb3J0L25vLWV4dHJhbmVvdXMtZGVwZW5kZW5jaWVzICovXG4vKipcbiAqIFRoZSBydW50aW1lIGNvcmU6IG9uZSBgaGFuZGxlKHJlcXVlc3QsIHNpbmspYCB0aGF0IGJvdGggc2hlbGxzIHdyYXAuXG4gKlxuICogVGhlIExhbWJkYSBzaGVsbCAoYGxhbWJkYS5tdHNgKSBhbmQgdGhlIGNvbnRhaW5lciBzaGVsbCAoYHNlcnZlci5tdHNgKSBkb1xuICogbm90aGluZyBidXQgdHVybiB0aGVpciBpbnB1dCBpbnRvIGEge0BsaW5rIFJ1bnRpbWVSZXF1ZXN0fSBhbmQgdGhlaXIgb3V0cHV0IGludG9cbiAqIGEge0BsaW5rIFJlc3BvbnNlU2lua30uIEV2ZXJ5dGhpbmcgZWxzZSDigJQgc3ludGhlc2l6aW5nIGByZXFgL2ByZXNgLCBkaXNwYXRjaCxcbiAqIG1pZGRsZXdhcmUsIGVudHJ5cG9pbnQgaW52b2NhdGlvbiwgc3RhdGljIGZpbGVzLCBpbWFnZSBvcHRpbWl6YXRpb24sIGd6aXAsXG4gKiBgd2FpdFVudGlsYCDigJQgaGFwcGVucyBoZXJlLCBzbyB0aGUgY29udGFpbmVyIGUyZSBzdWl0ZSBleGVyY2lzZXMgdGhlIHNhbWUgY29kZVxuICogTGFtYmRhIHJ1bnMuIFRoYXQgaXMgZGVsaWJlcmF0ZTogdGhlIGNvbnRhaW5lciBwYXRoIHVzZWQgdG8gZ2V0IHJlYWxcbiAqIGBub2RlOmh0dHBgIG9iamVjdHMgZnJvbSBMYW1iZGEgV2ViIEFkYXB0ZXIsIHdoaWNoIG1lYW50IGNvbnRhaW5lciB0ZXN0cyBwcm92ZWRcbiAqIG5vdGhpbmcgYWJvdXQgTGFtYmRhLlxuICovXG5pbXBvcnQgeyByZWFkRmlsZSB9IGZyb20gXCJub2RlOmZzL3Byb21pc2VzXCI7XG5pbXBvcnQgdHlwZSB7IEluY29taW5nSHR0cEhlYWRlcnMgfSBmcm9tIFwibm9kZTpodHRwXCI7XG5pbXBvcnQgeyBqb2luIH0gZnJvbSBcIm5vZGU6cGF0aFwiO1xuaW1wb3J0IHsgUmVhZGFibGUsIFdyaXRhYmxlIH0gZnJvbSBcIm5vZGU6c3RyZWFtXCI7XG5pbXBvcnQgeyBjYXNlQ2Fub25pY2FsUGF0aCB9IGZyb20gXCIuL2Nhc2UtcmVkaXJlY3RcIjtcbmltcG9ydCB7XG4gIERpc3BhdGNoZXIsXG4gIG91dE9mQmFuZFJvdXRlUGFyYW1zLFxuICBTdGF0dXNUYXJnZXQsXG4gIHN0YXR1c1RhcmdldHMsXG59IGZyb20gXCIuL2Rpc3BhdGNoXCI7XG5pbXBvcnQge1xuICBFbnRyeXBvaW50SGFuZGxlcixcbiAgRW50cnlwb2ludFJlZ2lzdHJ5LFxuICBSb3V0ZUluT3RoZXJHcm91cEVycm9yLFxufSBmcm9tIFwiLi9lbnRyeXBvaW50c1wiO1xuaW1wb3J0IHsgU2hpbUluY29taW5nTWVzc2FnZSwgdG9JbmNvbWluZ0h0dHBIZWFkZXJzIH0gZnJvbSBcIi4vaHR0cC9yZXF1ZXN0XCI7XG5pbXBvcnQge1xuICBhc1NlcnZlclJlc3BvbnNlLFxuICBSZXNwb25zZUhlYWQsXG4gIFNoaW1TZXJ2ZXJSZXNwb25zZSxcbn0gZnJvbSBcIi4vaHR0cC9yZXNwb25zZVwiO1xuaW1wb3J0IHsgcGlwZVRvU2luaywgUmVzcG9uc2VTaW5rIH0gZnJvbSBcIi4vaHR0cC9zaW5rXCI7XG5pbXBvcnQgeyBJbnRlcm5hbEltYWdlUmVzcG9uc2UsIFJ1bnRpbWVJbWFnZU9wdGltaXplciB9IGZyb20gXCIuL2ltYWdlXCI7XG5pbXBvcnQge1xuICBBZGFwdGVyTWFuaWZlc3QsXG4gIGRlcGxveWVkTWFuaWZlc3RQYXRoLFxuICBGVU5DVElPTl9HUk9VUF9FTlZfVkFSLFxuICBNQU5JRkVTVF9GSUxFX05BTUUsXG4gIFJFVkFMSURBVEVEX1BBR0VfSE9PSyxcbn0gZnJvbSBcIi4vbWFuaWZlc3RcIjtcbmltcG9ydCB7IE1pZGRsZXdhcmVSdW5uZXIgfSBmcm9tIFwiLi9taWRkbGV3YXJlXCI7XG5pbXBvcnQge1xuICBsb2FkRW52RmlsZXMsXG4gIHNldHVwTm9kZUVudmlyb25tZW50LFxuICB1c2VOZXh0RnJvbSxcbn0gZnJvbSBcIi4vbmV4dC1tb2R1bGVzXCI7XG5pbXBvcnQgeyBwdWJsaWNEaXJLZXksIHJlc29sdmVQdWJsaWNGaWxlcyB9IGZyb20gXCIuL3B1YmxpYy1maWxlc1wiO1xuaW1wb3J0IHsgc2VydmVTM1B1YmxpY0ZpbGUsIHNlcnZlU3RhdGljRmlsZSB9IGZyb20gXCIuL3N0YXRpYy1maWxlc1wiO1xuaW1wb3J0IHsgZHJhaW5lZCwgZmlyc3RWYWx1ZSwgdG9TZWFyY2gsIHdpdGhvdXRQYXRoUHJlZml4IH0gZnJvbSBcIi4vdXRpbFwiO1xuXG4vKiogT25lIHJlcXVlc3QsIG5vcm1hbGl6ZWQgYnkgYSBzaGVsbC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUnVudGltZVJlcXVlc3Qge1xuICByZWFkb25seSBtZXRob2Q6IHN0cmluZztcbiAgLyoqIE9yaWdpbi1mb3JtIHRhcmdldCBleGFjdGx5IGFzIHJlY2VpdmVkOiBwYXRoICsgcXVlcnksIG5ldmVyIGFic29sdXRlLiAqL1xuICByZWFkb25seSB1cmw6IHN0cmluZztcbiAgcmVhZG9ubHkgaGVhZGVyczogSW5jb21pbmdIdHRwSGVhZGVycztcbiAgcmVhZG9ubHkgYm9keT86IFJlYWRhYmxlIHwgQnVmZmVyO1xuICByZWFkb25seSByZW1vdGVBZGRyZXNzPzogc3RyaW5nO1xuICAvKiogYGZhbHNlYCBiZWhpbmQgYSBUTFMtdGVybWluYXRpbmcgQUxCLiBPbmx5IGFmZmVjdHMgdGhlIHN5bnRoZXNpemVkIHNvY2tldC4gKi9cbiAgcmVhZG9ubHkgZW5jcnlwdGVkPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIEFib3J0ZWQgd2hlbiB0aGUgY2xpZW50IGRpc2Nvbm5lY3RzLiBXaXJpbmcgaXQgdG8gYHJlcy5kZXN0cm95KClgIGlzIHdoYXRcbiAgICogbWFrZXMgYHJlcXVlc3Quc2lnbmFsLm9uYWJvcnRgIGZpcmUgaW5zaWRlIHJvdXRlIGhhbmRsZXJzLlxuICAgKi9cbiAgcmVhZG9ubHkgc2lnbmFsPzogQWJvcnRTaWduYWw7XG4gIC8qKlxuICAgKiBXaGV0aGVyIGB4LWZvcndhcmRlZC1ob3N0YCBuYW1lcyB0aGUgaG9zdCB0aGUgY2xpZW50IGFza2VkIGZvci4gT25seSB0aGVcbiAgICogc2hlbGwgY2FuIGtub3c6IGl0IGlzIGB0cnVlYCBmb3IgYSBGdW5jdGlvbiBVUkwgZXZlbnQgd2hvc2UgU2lnVjQgTGFtYmRhXG4gICAqIHZlcmlmaWVkLiBUaGF0IGlzIGFueSBJQU0tYXV0aG9yaXplZCBpbnZva2VyIOKAlCBpbiBwcmFjdGljZSBDbG91ZEZyb250J3NcbiAgICogT3JpZ2luIEFjY2VzcyBDb250cm9sLCB3aG9zZSB2aWV3ZXItcmVxdWVzdCBmdW5jdGlvbiBvdmVyd3JpdGVzIHRoZSBoZWFkZXJcbiAgICogd2l0aCB0aGUgdmlld2VyJ3MgYEhvc3RgIChDbG91ZEZyb250IGhhcyB0byByZXBsYWNlIGBIb3N0YCBpdHNlbGYgd2l0aCB0aGVcbiAgICogRnVuY3Rpb24gVVJMJ3MgZG9tYWluKSwgcGx1cyBwcmluY2lwYWxzIGdyYW50ZWQgYGxhbWJkYTpJbnZva2VGdW5jdGlvblVybGAsXG4gICAqIHdobyBjb3VsZCByZXBsYWNlIHRoZSBmdW5jdGlvbidzIGNvZGUgYW55d2F5LiBJdCBpcyBhbHNvIHdoYXRcbiAgICogYHByb3h5RXh0ZXJuYWxgIGRyb3BzIE9BQydzIHNpZ25hdHVyZSBvbi4gRXZlcnl3aGVyZSBlbHNlIHRoZSBoZWFkZXIgaXNcbiAgICogd2hhdGV2ZXIgdGhlIGNsaWVudCBzZW50LCBhbmQgaXQgaXNcbiAgICogaWdub3JlZCwgYXMgYG5leHQgc3RhcnRgIGlnbm9yZXMgaXQgd2l0aG91dCBgZXhwZXJpbWVudGFsLnRydXN0SG9zdEhlYWRlcmAuXG4gICAqL1xuICByZWFkb25seSB0cnVzdEZvcndhcmRlZEhvc3Q/OiBib29sZWFuO1xuICAvKipcbiAgICogU2V0IGJ5IHtAbGluayBOZXh0anNSdW50aW1lLmhhbmRsZUludGVybmFsbHl9IGZvciB0aGUgaW4tcHJvY2VzcyByZXF1ZXN0cyBpdFxuICAgKiBtYWtlczogY2FsbGVkIHdpdGggdGhlIGBSb3V0ZUluT3RoZXJHcm91cEVycm9yYCB0aGUgcm91dGUgdGhyZXcsIGluc3RlYWQgb2ZcbiAgICogbG9nZ2luZyB0aGUgbWlzcm91dGVkLXJlcXVlc3Qgd2FybmluZywgd2hpY2ggZGVzY3JpYmVzIGEgQ2xvdWRGcm9udCBvciBBUElcbiAgICogR2F0ZXdheSBwcm9ibGVtIHRoaXMgaXMgbm90LlxuICAgKi9cbiAgcmVhZG9ubHkgb25Sb3V0ZUluT3RoZXJHcm91cD86IChlcnJvcjogUm91dGVJbk90aGVyR3JvdXBFcnJvcikgPT4gdm9pZDtcbn1cblxuLyoqXG4gKiBgUmV2YWxpZGF0ZUZuYCdzIGFyZ3VtZW50IChgbmV4dC9kaXN0L3NlcnZlci9saWIvcm91dGVyLXV0aWxzL3JvdXRlci1zZXJ2ZXItY29udGV4dGApLFxuICogcmVzdGF0ZWQgYmVjYXVzZSB0aGF0IG1vZHVsZSBpcyBub3QgcGFydCBvZiBgbmV4dGAncyBwdWJsaXNoZWQgdHlwZSBzdXJmYWNlLlxuICovXG5pbnRlcmZhY2UgUmV2YWxpZGF0ZUNvbmZpZyB7XG4gIHJlYWRvbmx5IHVybFBhdGg6IHN0cmluZztcbiAgcmVhZG9ubHkgaGVhZGVyczogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfCBzdHJpbmdbXSB9O1xuICByZWFkb25seSBvcHRzOiB7IHVuc3RhYmxlX29ubHlHZW5lcmF0ZWQ/OiBib29sZWFuIH07XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTmV4dGpzUnVudGltZU9wdGlvbnMge1xuICAvKipcbiAgICogQWJzb2x1dGUgcGF0aCB0byB0aGUgZGVwbG95bWVudCByb290IOKAlCB0aGUgc3RhZ2VkIHRyZWUgZXZlcnkgbWFuaWZlc3Qga2V5XG4gICAqIHJlc29sdmVzIGFnYWluc3QuIGBMQU1CREFfVEFTS19ST09UYCBmb3IgRnVuY3Rpb25zLCB0aGUgaW1hZ2UgYFdPUktESVJgIGZvclxuICAgKiBDb250YWluZXJzOyBib3RoIHNoZWxscyBkZXJpdmUgaXQgZnJvbSB0aGVpciBvd24gbG9jYXRpb24gaW5zdGVhZC5cbiAgICovXG4gIHJlYWRvbmx5IGRlcGxveW1lbnRSb290OiBzdHJpbmc7XG4gIHJlYWRvbmx5IG1hbmlmZXN0OiBBZGFwdGVyTWFuaWZlc3Q7XG4gIC8qKiBgQ0RLX05FWFRKU19TVEFUSUNfQVNTRVRTX0JVQ0tFVF9OQU1FYC4gKi9cbiAgcmVhZG9ubHkgYnVja2V0Pzogc3RyaW5nO1xuICAvKiogYENES19ORVhUSlNfU1RBVElDX0FTU0VUU19LRVlfUFJFRklYYC4gKi9cbiAgcmVhZG9ubHkgYnVja2V0S2V5UHJlZml4Pzogc3RyaW5nO1xufVxuXG5leHBvcnQgY2xhc3MgTmV4dGpzUnVudGltZSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgZW50cnlwb2ludHM6IEVudHJ5cG9pbnRSZWdpc3RyeTtcbiAgcHJpdmF0ZSByZWFkb25seSBkaXNwYXRjaGVyOiBEaXNwYXRjaGVyO1xuICBwcml2YXRlIHJlYWRvbmx5IG1pZGRsZXdhcmU/OiBNaWRkbGV3YXJlUnVubmVyO1xuICBwcml2YXRlIHJlYWRvbmx5IGltYWdlczogUnVudGltZUltYWdlT3B0aW1pemVyO1xuICAvKiogVGhlIDUwMCBsYWRkZXI7IHNlZSBgc3RhdHVzVGFyZ2V0c2AuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgZXJyb3JUYXJnZXRGb3I6ICh1cmw6IFVSTCB8IHVuZGVmaW5lZCkgPT4gU3RhdHVzVGFyZ2V0O1xuICAvKiogVGhlIGFzc2V0cyBidWNrZXQsIHdoZW4gYHB1YmxpYy9gIGZpbGVzIGFyZSBzZXJ2ZWQgZnJvbSBpdC4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBwdWJsaWNCdWNrZXQ/OiBzdHJpbmc7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgb3B0aW9uczogTmV4dGpzUnVudGltZU9wdGlvbnMpIHtcbiAgICBjb25zdCB7IG1hbmlmZXN0LCBkZXBsb3ltZW50Um9vdCB9ID0gb3B0aW9ucztcbiAgICB0aGlzLmVudHJ5cG9pbnRzID0gbmV3IEVudHJ5cG9pbnRSZWdpc3RyeShkZXBsb3ltZW50Um9vdCwgbWFuaWZlc3QpO1xuICAgIC8vIExpc3RlZCBvbmNlLCBhdCBjb2xkIHN0YXJ0OyBzZWUgYHJlc29sdmVQdWJsaWNGaWxlc2AuXG4gICAgY29uc3QgcHVibGljRmlsZXMgPSByZXNvbHZlUHVibGljRmlsZXMoZGVwbG95bWVudFJvb3QsIG1hbmlmZXN0KTtcbiAgICB0aGlzLmRpc3BhdGNoZXIgPSBuZXcgRGlzcGF0Y2hlcih7XG4gICAgICBtYW5pZmVzdCxcbiAgICAgIHB1YmxpY0ZpbGVzOiBwdWJsaWNGaWxlcy5maWxlcyxcbiAgICB9KTtcbiAgICAvLyBPbiBkaXNrIG90aGVyd2lzZSwgd2l0aCBgLm5leHQvc3RhdGljYC5cbiAgICB0aGlzLnB1YmxpY0J1Y2tldCA9IHB1YmxpY0ZpbGVzLmluUzMgPyBvcHRpb25zLmJ1Y2tldCA6IHVuZGVmaW5lZDtcbiAgICB0aGlzLmVycm9yVGFyZ2V0Rm9yID0gc3RhdHVzVGFyZ2V0cyhtYW5pZmVzdCwgNTAwKTtcbiAgICB0aGlzLmltYWdlcyA9IG5ldyBSdW50aW1lSW1hZ2VPcHRpbWl6ZXIoe1xuICAgICAgZGVwbG95bWVudFJvb3QsXG4gICAgICBtYW5pZmVzdCxcbiAgICAgIGJ1Y2tldDogdGhpcy5wdWJsaWNCdWNrZXQgPz8gXCJcIixcbiAgICAgIGJ1Y2tldEtleVByZWZpeDogb3B0aW9ucy5idWNrZXRLZXlQcmVmaXggPz8gXCJcIixcbiAgICAgIGZldGNoSW50ZXJuYWw6IChocmVmLCByZXEsIG1heGltdW1Cb2R5KSA9PlxuICAgICAgICB0aGlzLmZldGNoSW50ZXJuYWwoaHJlZiwgcmVxLCBtYXhpbXVtQm9keSksXG4gICAgfSk7XG4gICAgLy8gVGhlIHJ1bm5lciBpcyBzaGFyZWQg4oCUIGl0IG1lbW9pemVzIHRoZSBsb2FkZWQgbWlkZGxld2FyZSBtb2R1bGUg4oCUIHdoaWxlIHRoZVxuICAgIC8vIGBpbnZva2VNaWRkbGV3YXJlYCBjYWxsYmFjayBpdCBwcm9kdWNlcyBpcyBwZXIgcmVxdWVzdC5cbiAgICB0aGlzLm1pZGRsZXdhcmUgPSBtYW5pZmVzdC5taWRkbGV3YXJlXG4gICAgICA/IG5ldyBNaWRkbGV3YXJlUnVubmVyKHtcbiAgICAgICAgICBtaWRkbGV3YXJlOiBtYW5pZmVzdC5taWRkbGV3YXJlLFxuICAgICAgICAgIHJvb3Q6IGRlcGxveW1lbnRSb290LFxuICAgICAgICB9KVxuICAgICAgOiB1bmRlZmluZWQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IG1hbmlmZXN0KCk6IEFkYXB0ZXJNYW5pZmVzdCB7XG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5tYW5pZmVzdDtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBoYW5kbGUoXG4gICAgcmVxdWVzdDogUnVudGltZVJlcXVlc3QsXG4gICAgc2luazogUmVzcG9uc2VTaW5rLFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB7IG1hbmlmZXN0IH0gPSB0aGlzLm9wdGlvbnM7XG4gICAgY29uc3QgcGVuZGluZzogQXJyYXk8UHJvbWlzZTx1bmtub3duPj4gPSBbXTtcbiAgICBjb25zdCB3YWl0VW50aWwgPSAocHJvbWlzZTogUHJvbWlzZTx1bmtub3duPikgPT4ge1xuICAgICAgcGVuZGluZy5wdXNoKHByb21pc2UpO1xuICAgIH07XG5cbiAgICBjb25zdCBib2R5ID0gc3BsaXRCb2R5KHJlcXVlc3QuYm9keSwgdGhpcy5taWRkbGV3YXJlICE9PSB1bmRlZmluZWQpO1xuICAgIGNvbnN0IHJlcSA9IG5ldyBTaGltSW5jb21pbmdNZXNzYWdlKHtcbiAgICAgIG1ldGhvZDogcmVxdWVzdC5tZXRob2QsXG4gICAgICB1cmw6IHJlcXVlc3QudXJsLFxuICAgICAgaGVhZGVyczogd2l0aG91dEludGVybmFsSGVhZGVycyhcbiAgICAgICAgcmVxdWVzdC5oZWFkZXJzLFxuICAgICAgICByZXF1ZXN0LnVybCxcbiAgICAgICAgbWFuaWZlc3QuY29uZmlnLmJhc2VQYXRoLFxuICAgICAgKSxcbiAgICAgIGJvZHk6IGJvZHkuZm9yUmVxdWVzdCxcbiAgICAgIHJlbW90ZUFkZHJlc3M6IHJlcXVlc3QucmVtb3RlQWRkcmVzcyxcbiAgICAgIGVuY3J5cHRlZDogcmVxdWVzdC5lbmNyeXB0ZWQsXG4gICAgICB0cnVzdEZvcndhcmRlZEhvc3Q6IHJlcXVlc3QudHJ1c3RGb3J3YXJkZWRIb3N0LFxuICAgIH0pO1xuICAgIGNvbnN0IHJlcyA9IG5ldyBTaGltU2VydmVyUmVzcG9uc2UoKTtcbiAgICAvLyBOZXh0LmpzIHJlYWRzIGByZXMucmVxYCBpbiBhIGZldyBlcnJvciBwYXRocy5cbiAgICByZXMucmVxID0gcmVxO1xuICAgIHJlcXVlc3Quc2lnbmFsPy5hZGRFdmVudExpc3RlbmVyKFwiYWJvcnRcIiwgKCkgPT4gcmVzLmRlc3Ryb3koKSwge1xuICAgICAgb25jZTogdHJ1ZSxcbiAgICB9KTtcblxuICAgIC8vIFRoZSByZWplY3Rpb24gaGFuZGxlciBpcyBhdHRhY2hlZCBoZXJlIHJhdGhlciB0aGFuIGF0IHRoZSBgYXdhaXRgIGJlbG93LlxuICAgIC8vIGByb3V0ZSgpYCBhd2FpdHMgcmVhbCBJL08sIHNvIGEgc3RyZWFtIHRoYXQgYnJlYWtzIHdoaWxlIGl0IHJ1bnMgd291bGRcbiAgICAvLyBsZWF2ZSB0aGlzIHByb21pc2UgcmVqZWN0ZWQgd2l0aCBubyBoYW5kbGVyIGF0dGFjaGVkIGZvciBhIGZ1bGwgZXZlbnQtbG9vcFxuICAgIC8vIHR1cm4g4oCUIGFuZCBOb2RlIDI0IGRlZmF1bHRzIHRvIGAtLXVuaGFuZGxlZC1yZWplY3Rpb25zPXRocm93YCwgd2hpY2ggb25cbiAgICAvLyB0aGUgY29udGFpbmVyIHNoZWxsIHRha2VzIHRoZSB3aG9sZSB0YXNrIGRvd24gYW5kIGFib3J0cyBldmVyeSBvdGhlclxuICAgIC8vIGluLWZsaWdodCByZXF1ZXN0IG9uIGl0LiBBIG1pZC1zdHJlYW0gRVBJUEUgZnJvbSBvbmUgY2xpZW50IGRpc2Nvbm5lY3QgaXNcbiAgICAvLyBub3QgZ3JvdW5kcyBmb3IgdGhhdC5cbiAgICAvL1xuICAgIC8vIFRoZSBlcnJvciBpcyBsb2dnZWQsIG5vdCByZXRocm93bjogdGhlIHN0cmVhbSBicm9rZSBhZnRlciAob3Igd2hpbGUpIHRoZVxuICAgIC8vIGhlYWQgd2VudCBvdXQg4oCUIGEgY2xpZW50IGRpc2Nvbm5lY3QsIG9yIGBzZW5kRXJyb3JgIGRlc3Ryb3lpbmcgYVxuICAgIC8vIGhhbGYtd3JpdHRlbiByZXNwb25zZSDigJQgYW5kIG5laXRoZXIgaXMgYW4gaW52b2NhdGlvbiBmYWlsdXJlLiBSZXRocm93aW5nXG4gICAgLy8gd291bGQgbWFrZSBMYW1iZGEgcmV0cnkgYSByZXF1ZXN0IHRoZSBjbGllbnQgYWxyZWFkeSBhYmFuZG9uZWQuXG4gICAgY29uc3QgZmluaXNoZWQgPSBwaXBlVG9TaW5rKHJlcSwgcmVzLCBzaW5rLCB7XG4gICAgICBjb21wcmVzczogbWFuaWZlc3QuY29uZmlnLmNvbXByZXNzLFxuICAgIH0pLmNhdGNoKChlcnJvcjogdW5rbm93bikgPT4ge1xuICAgICAgY29uc29sZS5lcnJvcihcIlRoZSByZXNwb25zZSBzdHJlYW0gZGlkIG5vdCBjb21wbGV0ZTpcIiwgZXJyb3IpO1xuICAgIH0pO1xuXG4gICAgLy8gRm9yIHRoZSBlcnJvciBwYWdlJ3MgbG9jYWxlOyB1bnNldCB3aGVuIHRoZSB0aHJvdyBpcyBgYWJzb2x1dGVVcmxgJ3MuXG4gICAgbGV0IHVybDogVVJMIHwgdW5kZWZpbmVkO1xuICAgIHRyeSB7XG4gICAgICAvLyBCZWZvcmUgYW55dGhpbmcgcGFyc2VzIHRoZSB0YXJnZXQsIGluY2x1ZGluZyBgYWJzb2x1dGVVcmxgIC0gYG5ldyBVUkxgXG4gICAgICAvLyByZWFkcyBhIGxlYWRpbmcgYC8vYCBhcyBwcm90b2NvbC1yZWxhdGl2ZSBhbmQgd291bGQgdGFrZSB0aGUgZmlyc3QgcGF0aFxuICAgICAgLy8gc2VnbWVudCBmb3IgdGhlIGhvc3QuXG4gICAgICBjb25zdCBjb2xsYXBzZWQgPSBjb2xsYXBzZVJlcGVhdGVkU2xhc2hlcyhyZXF1ZXN0LnVybCk7XG4gICAgICBpZiAoY29sbGFwc2VkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgc2VuZFJlZGlyZWN0KHJlcywgY29sbGFwc2VkLCAzMDgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gSW5zaWRlIHRoZSB0cnk6IGBhYnNvbHV0ZVVybGAgYnVpbGRzIGEgYFVSTGAgb3V0IG9mIHRoZSByZXF1ZXN0IGxpbmVcbiAgICAgICAgLy8gYW5kIHRoZSBmb3J3YXJkZWQgaGVhZGVycywgYW5kIGEgdGhyb3cgaGVyZSBoYXMgdG8gcmVhY2ggdGhlIGVycm9yXG4gICAgICAgIC8vIGxhZGRlciBsaWtlIGFueSBvdGhlci4gT3V0c2lkZSBpdCwgb24gdGhlIExhbWJkYSBzaGVsbHMg4oCUIHdob3NlXG4gICAgICAgIC8vIGhhbmRsZXJzIHdyYXAgbm90aGluZyDigJQgdGhlIHNhbWUgdGhyb3cgaXMgYW4gaW52b2NhdGlvbiBlcnJvciBhbmQgYVxuICAgICAgICAvLyA1MDIuXG4gICAgICAgIHVybCA9IGFic29sdXRlVXJsKHJlcXVlc3QpO1xuICAgICAgICBhd2FpdCB0aGlzLnJvdXRlKHJlcSwgcmVzLCB1cmwsIGJvZHksIHdhaXRVbnRpbCwgcmVxdWVzdCk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGF3YWl0IHRoaXMuc2VuZEVycm9yKHJlcSwgcmVzLCB3YWl0VW50aWwsIGVycm9yLCB1cmwpO1xuICAgIH1cblxuICAgIGF3YWl0IGZpbmlzaGVkO1xuXG4gICAgLy8gTGFtYmRhIGZyZWV6ZXMgdGhlIGV4ZWN1dGlvbiBlbnZpcm9ubWVudCB0aGUgbW9tZW50IHRoZSBoYW5kbGVyIHJlc29sdmVzIOKAlFxuICAgIC8vIHRoZXJlIGlzIG5vIHBvc3QtcmVzcG9uc2Uga2VlcGFsaXZlIOKAlCBzbyBiYWNrZ3JvdW5kIHdvcmsgcmVnaXN0ZXJlZCB3aXRoXG4gICAgLy8gYHdhaXRVbnRpbGAgKG5vdGFibHkgSVNSIHJldmFsaWRhdGlvbikgaGFzIHRvIGJlIGF3YWl0ZWQgaGVyZS4gQWZ0ZXIgdGhlXG4gICAgLy8gcmVzcG9uc2Ugc3RyZWFtIGhhcyBjbG9zZWQsIHNvIGNsaWVudCBsYXRlbmN5IGlzIHVuYWZmZWN0ZWQ7IGJpbGxlZFxuICAgIC8vIGR1cmF0aW9uIGV4dGVuZHMsIHdoaWNoIGlzIHRoZSBjb3JyZWN0IHRyYWRlIGFnYWluc3QgYSByZXZhbGlkYXRpb24gdGhhdFxuICAgIC8vIG5ldmVyIGNvbXBsZXRlcy5cbiAgICAvL1xuICAgIC8vIERyYWluZWQgdW50aWwgbm90aGluZyBuZXcgYXJyaXZlcywgbm90IGF3YWl0ZWQgb25jZTogYHdhaXRVbnRpbGAga2VlcHNcbiAgICAvLyBiZWluZyBjYWxsZWQgYWZ0ZXIgdGhlIHJlc3BvbnNlIOKAlCBOZXh0J3MgYEFmdGVyQ29udGV4dGAgcmVnaXN0ZXJzIGl0c1xuICAgIC8vIGNhbGxiYWNrIHF1ZXVlIG9uIHRoZSBmaXJzdCBgYWZ0ZXIoKWAsIGFuZCBhbiBgYWZ0ZXIocHJvbWlzZSlgIG1hZGUgZnJvbVxuICAgIC8vIGluc2lkZSBhIHJ1bm5pbmcgY2FsbGJhY2ssIG9yIGEgYmFja2dyb3VuZCByZWdlbmVyYXRpb24gdGhhdCBpdHNlbGYgY2FsbHNcbiAgICAvLyBgYWZ0ZXIoKWAsIHJlZ2lzdGVycyBtb3JlLiBBIHNpbmdsZSBgYWxsU2V0dGxlZGAgc25hcHNob3RzIHRoZSBhcnJheSBhbmRcbiAgICAvLyBsZXRzIExhbWJkYSBmcmVlemUgb24gdGhhdCBsYXRlIHdvcmsuXG4gICAgbGV0IHNldHRsZWRDb3VudCA9IDA7XG4gICAgd2hpbGUgKHNldHRsZWRDb3VudCA8IHBlbmRpbmcubGVuZ3RoKSB7XG4gICAgICBjb25zdCBiYXRjaCA9IHBlbmRpbmcuc2xpY2Uoc2V0dGxlZENvdW50KTtcbiAgICAgIHNldHRsZWRDb3VudCA9IHBlbmRpbmcubGVuZ3RoO1xuICAgICAgY29uc3Qgc2V0dGxlZCA9IGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChiYXRjaCk7XG4gICAgICBmb3IgKGNvbnN0IHJlc3VsdCBvZiBzZXR0bGVkKSB7XG4gICAgICAgIGlmIChyZXN1bHQuc3RhdHVzID09PSBcInJlamVjdGVkXCIpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKFwiQSB3YWl0VW50aWwoKSBwcm9taXNlIHJlamVjdGVkOlwiLCByZXN1bHQucmVhc29uKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcm91dGUoXG4gICAgcmVxOiBTaGltSW5jb21pbmdNZXNzYWdlLFxuICAgIHJlczogU2hpbVNlcnZlclJlc3BvbnNlLFxuICAgIHVybDogVVJMLFxuICAgIGJvZHk6IFNwbGl0Qm9keSxcbiAgICB3YWl0VW50aWw6IChwcm9taXNlOiBQcm9taXNlPHVua25vd24+KSA9PiB2b2lkLFxuICAgIHJlcXVlc3Q6IFJ1bnRpbWVSZXF1ZXN0LFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmRpc3BhdGNoZXIuZGlzcGF0Y2goe1xuICAgICAgbWV0aG9kOiByZXEubWV0aG9kID8/IFwiR0VUXCIsXG4gICAgICB1cmwsXG4gICAgICBoZWFkZXJzOiBuZXcgSGVhZGVycyh0b1dlYkhlYWRlcnMocmVxLmhlYWRlcnMpKSxcbiAgICAgIGJvZHk6IGJvZHkuZm9yRGlzcGF0Y2gsXG4gICAgICBpbnZva2VNaWRkbGV3YXJlOiB0aGlzLm1pZGRsZXdhcmU/Lmludm9rZXJGb3Ioe1xuICAgICAgICB3YWl0VW50aWwsXG4gICAgICAgIHNpZ25hbDogcmVxdWVzdC5zaWduYWwsXG4gICAgICB9KSxcbiAgICB9KTtcbiAgICBib2R5LnJlbGVhc2VVbnJlYWQocmVzdWx0LmtpbmQgPT09IFwibWlkZGxld2FyZS1yZXNwb25kZWRcIik7XG5cbiAgICBhcHBseUhlYWRlcnMocmVzLCByZXN1bHQucmVzcG9uc2VIZWFkZXJzKTtcbiAgICBpZiAocmVzdWx0LnN0YXR1cyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXMuc3RhdHVzQ29kZSA9IHJlc3VsdC5zdGF0dXM7XG4gICAgfVxuXG4gICAgc3dpdGNoIChyZXN1bHQua2luZCkge1xuICAgICAgY2FzZSBcImVudHJ5cG9pbnRcIjoge1xuICAgICAgICBsZXQgaGFuZGxlcjogRW50cnlwb2ludEhhbmRsZXI7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgaGFuZGxlciA9IGF3YWl0IHRoaXMuZW50cnlwb2ludHMubG9hZChyZXN1bHQuZW50cnlwb2ludCk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgaWYgKCEoZXJyb3IgaW5zdGFuY2VvZiBSb3V0ZUluT3RoZXJHcm91cEVycm9yKSkgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgLy8gQSBVUkwgdGhlIGVkZ2Ugc2VudCBoZXJlIG9ubHkgYmVjYXVzZSBvZiBpdHMgY2FzZSBnb2VzIHRvIGl0c1xuICAgICAgICAgIC8vIGNhbm9uaWNhbCBzcGVsbGluZywgd2hpY2ggdGhlIGVkZ2Ugcm91dGVzIHRvIHRoZSBvd25pbmcgZ3JvdXAuXG4gICAgICAgICAgY29uc3QgY2Fub25pY2FsID0gY2FzZUNhbm9uaWNhbFBhdGgoXG4gICAgICAgICAgICB1cmwucGF0aG5hbWUsXG4gICAgICAgICAgICByZXN1bHQucmVzb2x2ZWRQYXRobmFtZSxcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5tYW5pZmVzdCxcbiAgICAgICAgICApO1xuICAgICAgICAgIGlmIChjYW5vbmljYWwpIHtcbiAgICAgICAgICAgIHNlbmRSZWRpcmVjdChyZXMsIGAke2Nhbm9uaWNhbH0ke3VybC5zZWFyY2h9YCwgMzA4KTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHJlcXVlc3Qub25Sb3V0ZUluT3RoZXJHcm91cCkge1xuICAgICAgICAgICAgLy8gRXhwbGFpbmVkIGJ5IHRoZSBjYWxsZXIgb2YgYGhhbmRsZUludGVybmFsbHlgLCB3aGljaCBrbm93cyB3aHkgaXRcbiAgICAgICAgICAgIC8vIGhhcHBlbmVkLlxuICAgICAgICAgICAgcmVxdWVzdC5vblJvdXRlSW5PdGhlckdyb3VwKGVycm9yKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gTG9nZ2VkLCBiZWNhdXNlIGl0IGlzIGFsc28gd2hhdCBhIG1pc3JvdXRlZCBncm91cCBsb29rcyBsaWtlOyBzZWVcbiAgICAgICAgICAgIC8vIGBSb3V0ZUluT3RoZXJHcm91cEVycm9yYCBmb3Igd2h5IGl0IGlzIGEgNDA0LlxuICAgICAgICAgICAgY29uc29sZS53YXJuKGVycm9yLm1lc3NhZ2UpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBhd2FpdCB0aGlzLnNlbmRVbm1hdGNoZWQoXG4gICAgICAgICAgICByZXEsXG4gICAgICAgICAgICByZXMsXG4gICAgICAgICAgICB3YWl0VW50aWwsXG4gICAgICAgICAgICB7IHBhdGhuYW1lOiB1cmwucGF0aG5hbWUsIHJlcXVlc3RIZWFkZXJzOiByZXN1bHQucmVxdWVzdEhlYWRlcnMgfSxcbiAgICAgICAgICAgIHVybCxcbiAgICAgICAgICApO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyBUaGUgaW52b2NhdGlvbiB0YXJnZXQsIG5vdCB0aGUgcmVxdWVzdGVkIFVSTDogYHJlc29sdmVSb3V0ZXNgIGhhc1xuICAgICAgICAvLyBhcHBsaWVkIHJld3JpdGVzLCBzdHJpcHBlZCBpMThuIHByZWZpeGVzLCBhbmQgYXBwZW5kZWQgdGhlIGBueHRQYFxuICAgICAgICAvLyByb3V0ZSBwYXJhbXMgYXMgcXVlcnkgdmFsdWVzLiBUaGF0IGlzIGV4YWN0bHkgdGhlIGNvbnRyYWN0IE5leHQuanNcbiAgICAgICAgLy8gZG9jdW1lbnRzIGZvciBhIHByb3h5IGluIGZyb250IG9mIGEgZnVuY3Rpb24g4oCUIGBSb3V0ZU1vZHVsZS5wcmVwYXJlYFxuICAgICAgICAvLyByZWNvdmVycyBgcGFyYW1zYCBmcm9tIHRoZXNlIHF1ZXJ5IHZhbHVlcyDigJQgc28gdGhhdCBjb250cmFjdCwgbm90XG4gICAgICAgIC8vIGByZXF1ZXN0TWV0YS5wYXJhbXNgLCBpcyBob3cgcGFyYW1zIGdldCBwYXNzZWQuIFRoZSBvbmUgZXhjZXB0aW9uIGlzXG4gICAgICAgIC8vIGEgY2FwdHVyZSB0aGUgY29udHJhY3Qgd291bGQgY29ycnVwdDsgc2VlIGBvdXRPZkJhbmRSb3V0ZVBhcmFtc2AuXG4gICAgICAgIGNvbnN0IG91dE9mQmFuZCA9IG91dE9mQmFuZFJvdXRlUGFyYW1zKFxuICAgICAgICAgIHJlc3VsdC5pbnZvY2F0aW9uVGFyZ2V0LnF1ZXJ5LFxuICAgICAgICAgIHJlc3VsdC5yZXNvbHZlZFBhdGhuYW1lLFxuICAgICAgICApO1xuICAgICAgICBjb25zdCBpbnZvY2F0aW9uUXVlcnkgPVxuICAgICAgICAgIG91dE9mQmFuZD8ucXVlcnkgPz8gcmVzdWx0Lmludm9jYXRpb25UYXJnZXQucXVlcnk7XG4gICAgICAgIGNvbnN0IHsgcGF0aG5hbWUgfSA9IHJlc3VsdC5pbnZvY2F0aW9uVGFyZ2V0O1xuICAgICAgICBjb25zdCBzZWFyY2ggPSB0b1NlYXJjaChpbnZvY2F0aW9uUXVlcnkpO1xuICAgICAgICByZXEudXJsID0gc2VhcmNoID8gYCR7cGF0aG5hbWV9PyR7c2VhcmNofWAgOiBwYXRobmFtZTtcbiAgICAgICAgLy8gTWlkZGxld2FyZSBtYXkgaGF2ZSByZXdyaXR0ZW4gcmVxdWVzdCBoZWFkZXJzIHZpYVxuICAgICAgICAvLyBgTmV4dFJlc3BvbnNlLm5leHQoeyByZXF1ZXN0OiB7IGhlYWRlcnMgfSB9KWAuXG4gICAgICAgIHJlcS5oZWFkZXJzID0gdG9JbmNvbWluZ0h0dHBIZWFkZXJzKHJlc3VsdC5yZXF1ZXN0SGVhZGVycyk7XG4gICAgICAgIGF3YWl0IGhhbmRsZXIocmVxLCBhc1NlcnZlclJlc3BvbnNlKHJlcyksIHtcbiAgICAgICAgICB3YWl0VW50aWwsXG4gICAgICAgICAgcmVxdWVzdE1ldGE6IHtcbiAgICAgICAgICAgIC8vIFRoZSByZXNvbHZlZCBxdWVyeSwgc3RhdGVkIHJhdGhlciB0aGFuIGxlZnQgdG8gYmUgcmUtZGVyaXZlZC5cbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvLyBgUm91dGVNb2R1bGUucHJlcGFyZWAgcnVucyBgaGFuZGxlUmV3cml0ZXNgIGFnYWluc3QgYHJlcS51cmxgXG4gICAgICAgICAgICAvLyB1bmNvbmRpdGlvbmFsbHksIGFuZCBgcmVxLnVybGAgaXMgdGhlICphbHJlYWR5IHJld3JpdHRlbiogdGFyZ2V0LlxuICAgICAgICAgICAgLy8gQSBgYmVmb3JlRmlsZXNgIHJld3JpdGUgd2hvc2UgY29uZGl0aW9uIHN0aWxsIGhvbGRzIGFmdGVyIGl0IGhhc1xuICAgICAgICAgICAgLy8gYmVlbiBhcHBsaWVkIHRoZXJlZm9yZSBnZXRzIGFwcGxpZWQgdHdpY2U6IGluXG4gICAgICAgICAgICAvLyBgdGVzdC9lMmUvbGluay13aXRoLWFwaS1yZXdyaXRlYCB0aGUgcnVsZVxuICAgICAgICAgICAgLy8gYC86cGF0aCguKilgICsgYGhhczogcXVlcnkganNvbj10cnVlYCAtPiBgL2FwaS9qc29uP2Zyb209LzpwYXRoYFxuICAgICAgICAgICAgLy8gbWF0Y2hlZCBgL2FwaS9qc29uP2pzb249dHJ1ZSZmcm9tPS9zb21lL3JvdXRlL2ZvcmAgYSBzZWNvbmQgdGltZVxuICAgICAgICAgICAgLy8gYW5kIG92ZXJ3cm90ZSBgZnJvbWAgd2l0aCBgL2FwaS9qc29uYC4gYG5leHQgc3RhcnRgIGVzY2FwZXMgaXRcbiAgICAgICAgICAgIC8vIGJlY2F1c2UgaXRzIHJvdXRlciBsZWF2ZXMgYHJlcS51cmxgIGFzIHRoZSBVUkwgdGhlIGNsaWVudCBzZW50LCBzb1xuICAgICAgICAgICAgLy8gdGhlIG9uZSBwYXNzIGBwcmVwYXJlYCBtYWtlcyBpcyB0aGUgb25seSBvbmUuXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy8gYHByZXBhcmVgIHByZWZlcnMgdGhpcyBtZXRhIG92ZXIgaXRzIG93biBgcGFyc2VkVXJsLnF1ZXJ5YFxuICAgICAgICAgICAgLy8gKFwid2hlbiBkZXBsb3llZCBwcm94aWVzIHdpbGwgYWRkIHF1ZXJ5IHZhbHVlcyBmcm9tIHJlc29sdmluZyB0aGVcbiAgICAgICAgICAgIC8vIHJvdXRlcyB0byBwYXNzIHRvIGZ1bmN0aW9uXCIpLCB3aGljaCBpcyB0aGUgZG9jdW1lbnRlZCBkaXZpc2lvbiBvZlxuICAgICAgICAgICAgLy8gbGFib3VyIGZvciBhIHByb3h5IGluIGZyb250IG9mIGEgZnVuY3Rpb24gLSBhbmQgaXQgaXMgdGhlIHNhbWVcbiAgICAgICAgICAgIC8vIGRpdmlzaW9uIHRoZSBgcmVxLnVybGAgYWJvdmUgcmVsaWVzIG9uLiBTZXR0aW5nIGl0IGRvZXMgbm90IHN0b3BcbiAgICAgICAgICAgIC8vIHRoZSBzZWNvbmQgcmV3cml0ZSBwYXNzLCBpdCBqdXN0IHN0b3BzIHRoYXQgcGFzcyBmcm9tIGJlaW5nIHdoYXRcbiAgICAgICAgICAgIC8vIHRoZSByb3V0ZSBzZWVzLlxuICAgICAgICAgICAgcXVlcnk6IHsgLi4uaW52b2NhdGlvblF1ZXJ5IH0sXG4gICAgICAgICAgICAvLyBTZXQgb25seSBmb3IgYSBjYXB0dXJlIHRoZSBxdWVyeSBjb250cmFjdCBjYW5ub3QgY2FycnksIGFuZCB0aGVuXG4gICAgICAgICAgICAvLyBpbiBwbGFjZSBvZiBpdCByYXRoZXIgdGhhbiBhbG9uZ3NpZGUuXG4gICAgICAgICAgICAuLi4ob3V0T2ZCYW5kID8geyBwYXJhbXM6IG91dE9mQmFuZC5wYXJhbXMgfSA6IHt9KSxcbiAgICAgICAgICAgIC8vIFdpdGhvdXQgdGhpcywgYFJvdXRlTW9kdWxlLnByZXBhcmVgIGZhbGxzIGJhY2sgdG9cbiAgICAgICAgICAgIC8vIGBodHRwOi8vbG9jYWxob3N0JHtyZXEudXJsfWAgYW5kIGV2ZXJ5IGFic29sdXRlIFVSTCBhIHJvdXRlXG4gICAgICAgICAgICAvLyBoYW5kbGVyIGJ1aWxkcyBpcyB3cm9uZy4gYHJlbGF0aXZlUHJvamVjdERpcmAgaXMgZGVsaWJlcmF0ZWx5XG4gICAgICAgICAgICAvLyAqbm90KiBwYXNzZWQ6IHRoZSBydW50aW1lIGBjaGRpcmBzIHRvIHRoZSBwcm9qZWN0IGRpciwgc28gdGhlXG4gICAgICAgICAgICAvLyB2YWx1ZSBOZXh0LmpzIGlubGluZWQgYXQgYnVpbGQgdGltZSAoXCJcIikgaXMgYWxyZWFkeSBjb3JyZWN0LCBhbmRcbiAgICAgICAgICAgIC8vIGBhcHAtcGFnZS1ydW50aW1lLmpzYCBpZ25vcmVzIHRoZSByZXF1ZXN0TWV0YSBvdmVycmlkZSBhbnl3YXkuXG4gICAgICAgICAgICBpbml0VVJMOiB1cmwuaHJlZixcbiAgICAgICAgICAgIC8vIEZlZWRzIGByb3V0ZXJTZXJ2ZXJDb250ZXh0Lmhvc3RuYW1lYCAoYHJvdXRlLW1vZHVsZS5qc2BcbiAgICAgICAgICAgIC8vIGBnZXRSb3V0ZXJTZXJ2ZXJDb250ZXh0YCkuIEluY2x1ZGVzIHRoZSBwb3J0LCBiZWNhdXNlIGl0IGlzXG4gICAgICAgICAgICAvLyBjb25jYXRlbmF0ZWQgaW50byBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgaG9zdG5hbWU6IHVybC5ob3N0LFxuICAgICAgICAgICAgLy8gQm90aCByb3V0ZXJzIGNhbGwgdGhpcyBmb3IgYSBgbm90Rm91bmQ6IHRydWVgIC8gYG5vdEZvdW5kKClgIHRoYXRcbiAgICAgICAgICAgIC8vIHRoZSBlbnRyeXBvaW50IGl0c2VsZiBjYW5ub3QgcmVuZGVyLCBhbmQgZmFsbCBiYWNrIHRvXG4gICAgICAgICAgICAvLyBgcmVzLmVuZCgnVGhpcyBwYWdlIGNvdWxkIG5vdCBiZSBmb3VuZCcpYCDigJQgbm8gc3RhdHVzLCBubyBhcHAgNDA0XG4gICAgICAgICAgICAvLyBwYWdlIOKAlCB3aGVuIGl0IGlzIGFic2VudC4gVGhlIGByZXFgL2ByZXNgIHRoZXkgcGFzcyBhcmUgdGhlIG9uZXNcbiAgICAgICAgICAgIC8vIGhhbmRlZCBpbiBqdXN0IGFib3ZlLCBzbyB0aGUgY2FwdHVyZWQgcGFpciBpcyB1c2VkIGluc3RlYWQgb2ZcbiAgICAgICAgICAgIC8vIHJlLWRlcml2aW5nIHRoZW0uXG4gICAgICAgICAgICByZW5kZXI0MDQ6IGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgYXdhaXQgdGhpcy5zZW5kTm90Rm91bmQoXG4gICAgICAgICAgICAgICAgcmVxLFxuICAgICAgICAgICAgICAgIHJlcyxcbiAgICAgICAgICAgICAgICB3YWl0VW50aWwsXG4gICAgICAgICAgICAgICAgdGhpcy5kaXNwYXRjaGVyLm5vdEZvdW5kRm9yKHVybCksXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgLy8gYHJlcy5yZXZhbGlkYXRlKClgIGZyb20gYSBQYWdlcyBBUEkgcm91dGUuIFdpdGhvdXQgaXQsIE5leHQuanNcbiAgICAgICAgICAgIC8vIGZhbGxzIGJhY2sgdG8gYGZldGNoKCdodHRwczovLycgKyByZXEuaGVhZGVycy5ob3N0ICsgdXJsUGF0aClgIOKAlFxuICAgICAgICAgICAgLy8gYW5kIG9ubHkgd2hlbiBgZXhwZXJpbWVudGFsLnRydXN0SG9zdEhlYWRlcmAgaXMgc2V0LCB3aGljaCBpdCBpc1xuICAgICAgICAgICAgLy8gbm90LCBzbyBgcmVzLnJldmFsaWRhdGUoKWAgdGhyZXdcbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvLyAgIEZhaWxlZCB0byByZXZhbGlkYXRlIC86IEludmFyaWFudDogbWlzc2luZyBpbnRlcm5hbFxuICAgICAgICAgICAgLy8gICByb3V0ZXItc2VydmVyLW1ldGhvZHMgdGhpcyBpcyBhbiBpbnRlcm5hbCBidWdcbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvLyBhbmQgYHRlc3QvZTJlL3JldmFsaWRhdGUtcmVhc29uYCBzYXcgYHN0YWxlYCB3aGVyZSBgbmV4dCBzdGFydGBcbiAgICAgICAgICAgIC8vIHJlcG9ydHMgYG9uLWRlbWFuZGA6IHRoZSByb3V0ZSBzdGlsbCByZS1yZW5kZXJlZCwganVzdCBhcyBhblxuICAgICAgICAgICAgLy8gb3JkaW5hcnkgc3RhbGUgcmVnZW5lcmF0aW9uIHJhdGhlciB0aGFuIHRoZSBvbi1kZW1hbmQgb25lIGl0XG4gICAgICAgICAgICAvLyBhc2tlZCBmb3IuXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy8gQW5zd2VyaW5nIGl0IGluIHByb2Nlc3MgcmF0aGVyIHRoYW4gYnkgc2V0dGluZ1xuICAgICAgICAgICAgLy8gYHRydXN0SG9zdEhlYWRlcmA6IHRoZSBmZXRjaCBwYXRoIHdvdWxkIGxlYXZlIHRoZSBmdW5jdGlvbiwgY3Jvc3NcbiAgICAgICAgICAgIC8vIENsb3VkRnJvbnQgYW5kIGNvbWUgYmFjayDigJQgYSBzZWNvbmQgYmlsbGVkIGludm9jYXRpb24sIGFcbiAgICAgICAgICAgIC8vIGRlcGVuZGVuY3kgb24gYHgtcHJlcmVuZGVyLXJldmFsaWRhdGVgIHN1cnZpdmluZyB0aGUgZWRnZSwgYW5kIGFcbiAgICAgICAgICAgIC8vIHJlYXNvbiB0byB0cnVzdCBhIGNsaWVudC1zdXBwbGllZCBgSG9zdGAuIE5leHQuanMncyBvd25cbiAgICAgICAgICAgIC8vIG5vbi1zZXJ2ZXJsZXNzIGFuc3dlciBpcyB0aGUgc2FtZSBzaGFwZSBhcyB0aGlzIG9uZVxuICAgICAgICAgICAgLy8gKGBOZXh0U2VydmVyI3JldmFsaWRhdGVgIHJ1bnMgaXRzIHJlcXVlc3QgaGFuZGxlciBhZ2FpbnN0IGFcbiAgICAgICAgICAgIC8vIG1vY2tlZCBgcmVxYC9gcmVzYCkuXG4gICAgICAgICAgICByZXZhbGlkYXRlOiAoY29uZmlnOiBSZXZhbGlkYXRlQ29uZmlnKSA9PlxuICAgICAgICAgICAgICB0aGlzLnJldmFsaWRhdGUoY29uZmlnLCByZXF1ZXN0KSxcbiAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICAgICAgLy8gQSBQYWdlcyBBUEkgcm91dGUgb3ducyB0aGUgZW5kIG9mIGl0cyByZXNwb25zZTogYHN0cmVhbS5waXBlKHJlcylgLFxuICAgICAgICAvLyBhbiBgZXh0ZXJuYWxSZXNvbHZlcmAgcHJveHksIG9yIGEgY2FsbGJhY2sgdGhhdCBjYWxscyBgcmVzLmpzb24oKWBcbiAgICAgICAgLy8gbGF0ZXIgYWxsIHJldHVybiBmcm9tIHRoZSBoYW5kbGVyIGJlZm9yZSB0aGV5IGFyZSBkb25lIHdyaXRpbmcsIGFuZFxuICAgICAgICAvLyBlbmRpbmcgaGVyZSBzZW50IGFuIGVtcHR5IDIwMCBhbmQgbWFkZSB0aGVpciB3cml0ZXMgdGhyb3dcbiAgICAgICAgLy8gYEVSUl9TVFJFQU1fV1JJVEVfQUZURVJfRU5EYC4gYG5leHQgc3RhcnRgJ3MgYGFwaVJlc29sdmVyYCBsZWF2ZXMgaXRcbiAgICAgICAgLy8gb3BlbiB0b28g4oCUIG9uZSB0aGF0IG5ldmVyIGVuZHMgc3RhbGxzLCB0aGVyZSBhcyBoZXJlLiBgaGFuZGxlYCBhd2FpdHNcbiAgICAgICAgLy8gdGhlIHJlc3BvbnNlIGl0c2VsZiwgc28gbm90aGluZyBpcyBjdXQgc2hvcnQgYnkgcmV0dXJuaW5nLlxuICAgICAgICBpZiAoIXJlcy53cml0YWJsZUVuZGVkICYmIHJlc3VsdC5lbnRyeXBvaW50LnR5cGUgIT09IFwicGFnZS1hcGlcIikge1xuICAgICAgICAgIHJlcy5lbmQoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNhc2UgXCJzdGF0aWMtZmlsZVwiOiB7XG4gICAgICAgIGNvbnN0IHN0YXR1c1BhZ2UgPVxuICAgICAgICAgIHJlc3VsdC5zb3VyY2UgPT09IFwic2VydmVyXCJcbiAgICAgICAgICAgID8gdGhpcy5zdGF0dXNQYWdlU3RhdHVzKHJlc3VsdC5wYXRobmFtZSlcbiAgICAgICAgICAgIDogdW5kZWZpbmVkO1xuICAgICAgICAvLyBgbmV4dCBzdGFydGAgc2VydmVzIGEgYHB1YmxpYy9gIG9yIGBfbmV4dC9zdGF0aWNgIGZpbGUgdG8gR0VUIGFuZFxuICAgICAgICAvLyBIRUFEIG9ubHksIGFuZCBgc2VuZGAgd291bGQgc2VydmUgaXQgdG8gYW55IG1ldGhvZC4gVGhlIHNhbWUgZ29lcyBmb3JcbiAgICAgICAgLy8gYW4gYXV0by1leHBvcnRlZCBQYWdlcyBSb3V0ZXIgcGFnZSAoYGJhc2Utc2VydmVyLmpzYFxuICAgICAgICAvLyBgcmVuZGVyVG9SZXNwb25zZVdpdGhDb21wb25lbnRzSW1wbGA6IGEgc3RyaW5nIGBDb21wb25lbnRgIGFuc3dlcnNcbiAgICAgICAgLy8gYW55dGhpbmcgZWxzZSB3aXRoIGEgNDA1KSwgZXhjZXB0IHRoZSA0MDQgYW5kIDUwMCBwYWdlcy5cbiAgICAgICAgaWYgKFxuICAgICAgICAgIHJlcS5tZXRob2QgIT09IFwiR0VUXCIgJiZcbiAgICAgICAgICByZXEubWV0aG9kICE9PSBcIkhFQURcIiAmJlxuICAgICAgICAgIChyZXN1bHQuc291cmNlICE9PSBcInNlcnZlclwiIHx8XG4gICAgICAgICAgICAoc3RhdHVzUGFnZSA9PT0gdW5kZWZpbmVkICYmIHJlc3VsdC5maWxlUGF0aC5lbmRzV2l0aChcIi5odG1sXCIpKSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgc2VuZE1ldGhvZE5vdEFsbG93ZWQocmVzKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gXCJlbnN1cmUgY29ycmVjdCBzdGF0dXMgaXMgc2V0IHdoZW4gdmlzaXRpbmcgYSBzdGF0dXMgcGFnZSBkaXJlY3RseVwiOlxuICAgICAgICAvLyBgbmV4dCBzdGFydGAgYW5zd2VycyBgLzQwNGAgd2l0aCBhIDQwNCBhbmQgYC81MDBgIHdpdGggYSA1MDAsIG5vdCB0aGVcbiAgICAgICAgLy8gMjAwIHRoZWlyIHByZXJlbmRlcmVkIEhUTUwgd291bGQgb3RoZXJ3aXNlIGdvIG91dCB3aXRoLlxuICAgICAgICBpZiAoc3RhdHVzUGFnZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgcmVzLnN0YXR1c0NvZGUgPSBzdGF0dXNQYWdlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGV0YWcgPSB0aGlzLm9wdGlvbnMubWFuaWZlc3QuY29uZmlnLmdlbmVyYXRlRXRhZ3M7XG4gICAgICAgIGNvbnN0IHB1YmxpY0RpciA9IGAke3B1YmxpY0RpcktleSh0aGlzLm9wdGlvbnMubWFuaWZlc3QpfS9gO1xuICAgICAgICBjb25zdCBzZXJ2ZWQgPVxuICAgICAgICAgIChhd2FpdCBzZXJ2ZVN0YXRpY0ZpbGUoXG4gICAgICAgICAgICByZXEsXG4gICAgICAgICAgICByZXMsXG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMuZGVwbG95bWVudFJvb3QsXG4gICAgICAgICAgICByZXN1bHQuZmlsZVBhdGgsXG4gICAgICAgICAgICB7IGV0YWcgfSxcbiAgICAgICAgICApKSB8fFxuICAgICAgICAgIC8vIExpc3RlZCBidXQgbm90IHN0YWdlZDogYSBMYW1iZGEgcm9vdCwgd2hvc2UgYHB1YmxpYy9gIGlzIGluIFMzLlxuICAgICAgICAgIChyZXN1bHQuc291cmNlID09PSBcInB1YmxpY1wiICYmXG4gICAgICAgICAgICAhIXRoaXMucHVibGljQnVja2V0ICYmXG4gICAgICAgICAgICAoYXdhaXQgc2VydmVTM1B1YmxpY0ZpbGUocmVxLCByZXMsIHtcbiAgICAgICAgICAgICAgYnVja2V0OiB0aGlzLnB1YmxpY0J1Y2tldCxcbiAgICAgICAgICAgICAga2V5UHJlZml4OiB0aGlzLm9wdGlvbnMuYnVja2V0S2V5UHJlZml4ID8/IFwiXCIsXG4gICAgICAgICAgICAgIGZpbGU6IHJlc3VsdC5maWxlUGF0aC5zbGljZShwdWJsaWNEaXIubGVuZ3RoKSxcbiAgICAgICAgICAgICAgZXRhZyxcbiAgICAgICAgICAgIH0pKSk7XG4gICAgICAgIGlmICghc2VydmVkKSB7XG4gICAgICAgICAgLy8gVGhlIHJvdXRpbmcgcnVsZSB0aGF0IG1hdGNoZWQgYSBidWlsZCBhc3NldCBhbHJlYWR5IHNldCBpdHNcbiAgICAgICAgICAvLyB5ZWFyLWxvbmcgYGltbXV0YWJsZWAgQ2FjaGUtQ29udHJvbCwgd2hpY2ggYHNlbmRVbm1hdGNoZWRgXG4gICAgICAgICAgLy8gcmVwbGFjZXM6IHVuZGVyIGl0IHRoZSA0MDQgd291bGQgYmUgY2FjaGVkIGF0IHRoZSBlZGdlIGFuZCBpblxuICAgICAgICAgIC8vIGJyb3dzZXJzIGZvciB0aGF0IGxvbmcsIGFuZCBhIGNodW5rIHRoYXQgc2hvd3MgdXAgb24gdGhlIG5leHRcbiAgICAgICAgICAvLyBkZXBsb3kgd291bGQgc3RheSBtaXNzaW5nLlxuICAgICAgICAgIGF3YWl0IHRoaXMuc2VuZFVubWF0Y2hlZChyZXEsIHJlcywgd2FpdFVudGlsLCByZXN1bHQsIHVybCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjYXNlIFwiaW1hZ2Utb3B0aW1pemF0aW9uXCI6XG4gICAgICAgIGlmICghdGhpcy5pbWFnZXMuaXNFbmFibGVkKCkpIHtcbiAgICAgICAgICBhd2FpdCB0aGlzLnNlbmRVbm1hdGNoZWQoXG4gICAgICAgICAgICByZXEsXG4gICAgICAgICAgICByZXMsXG4gICAgICAgICAgICB3YWl0VW50aWwsXG4gICAgICAgICAgICB7IHBhdGhuYW1lOiB1cmwucGF0aG5hbWUsIHJlcXVlc3RIZWFkZXJzOiByZXN1bHQucmVxdWVzdEhlYWRlcnMgfSxcbiAgICAgICAgICAgIHVybCxcbiAgICAgICAgICApO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICByZXEuaGVhZGVycyA9IHRvSW5jb21pbmdIdHRwSGVhZGVycyhyZXN1bHQucmVxdWVzdEhlYWRlcnMpO1xuICAgICAgICBhd2FpdCB0aGlzLmltYWdlcy5oYW5kbGUocmVxLCByZXMsIHJlc3VsdC51cmwsIHdhaXRVbnRpbCk7XG4gICAgICAgIHJldHVybjtcblxuICAgICAgY2FzZSBcInJlZGlyZWN0XCI6XG4gICAgICAgIHNlbmRSZWRpcmVjdChyZXMsIHJlc3VsdC5sb2NhdGlvbiwgcmVzdWx0LnN0YXR1cyk7XG4gICAgICAgIHJldHVybjtcblxuICAgICAgY2FzZSBcImV4dGVybmFsLXJld3JpdGVcIjpcbiAgICAgICAgYXdhaXQgcHJveHlFeHRlcm5hbChyZXEsIHJlcywgcmVzdWx0LnVybCwgcmVzdWx0LnJlcXVlc3RIZWFkZXJzKTtcbiAgICAgICAgcmV0dXJuO1xuXG4gICAgICBjYXNlIFwibWlkZGxld2FyZS1yZXNwb25kZWRcIjpcbiAgICAgICAgYXdhaXQgc2VuZFdlYlJlc3BvbnNlKHJlcywgcmVzdWx0LnJlc3BvbnNlKTtcbiAgICAgICAgcmV0dXJuO1xuXG4gICAgICBjYXNlIFwicmVzcG9uc2VcIjpcbiAgICAgICAgcmVzLmVuZCgpO1xuICAgICAgICByZXR1cm47XG5cbiAgICAgIGNhc2UgXCJub3QtZm91bmRcIjpcbiAgICAgICAgYXdhaXQgdGhpcy5zZW5kVW5tYXRjaGVkKHJlcSwgcmVzLCB3YWl0VW50aWwsIHJlc3VsdCwgdXJsKTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiA0MDQgb3IgNTAwIHdoZW4gYHBhdGhuYW1lYCBpcyB0aGUgcHJlcmVuZGVyZWQgYC80MDRgIG9yIGAvNTAwYCBwYWdlIOKAlCB1bmRlclxuICAgKiBgYmFzZVBhdGhgIGFuZCwgaW4gYW4gaTE4biBhcHAsIGFueSBsb2NhbGUgKGAvZnIvNDA0YCkg4oCUIGFuZCBgdW5kZWZpbmVkYFxuICAgKiBvdGhlcndpc2UuIGBuZXh0IHN0YXJ0YCBtYXRjaGVzIHRoZSBwYWdlLCBub3QgdGhlIFVSTCwgc28gdGhlIGxvY2FsZSBkb2VzXG4gICAqIG5vdCBtYXR0ZXIuXG4gICAqL1xuICBwcml2YXRlIHN0YXR1c1BhZ2VTdGF0dXMocGF0aG5hbWU6IHN0cmluZyk6IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgeyBiYXNlUGF0aCwgaTE4biB9ID0gdGhpcy5vcHRpb25zLm1hbmlmZXN0LmNvbmZpZztcbiAgICBsZXQgcGFnZSA9IHdpdGhvdXRQYXRoUHJlZml4KHBhdGhuYW1lLCBiYXNlUGF0aCk7XG4gICAgY29uc3QgbG9jYWxlcyA9IChpMThuIGFzIHsgbG9jYWxlcz86IHJlYWRvbmx5IHN0cmluZ1tdIH0gfCBudWxsKT8ubG9jYWxlcztcbiAgICBmb3IgKGNvbnN0IGxvY2FsZSBvZiBsb2NhbGVzID8/IFtdKSB7XG4gICAgICBjb25zdCBzdHJpcHBlZCA9IHdpdGhvdXRQYXRoUHJlZml4KHBhZ2UsIGAvJHtsb2NhbGV9YCk7XG4gICAgICBpZiAoc3RyaXBwZWQgIT09IHBhZ2UpIHtcbiAgICAgICAgcGFnZSA9IHN0cmlwcGVkO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHBhZ2UgPT09IFwiLzQwNFwiKSByZXR1cm4gNDA0O1xuICAgIGlmIChwYWdlID09PSBcIi81MDBcIikgcmV0dXJuIDUwMDtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIGBuZXh0IHN0YXJ0YCdzIGFuc3dlciB0byBhIHBhdGggbm90aGluZyBzZXJ2ZXMgKGByb3V0ZXItc2VydmVyLmpzYCwgdGhlXG4gICAqIFwiNDA0IGNhc2VcIiksIGZvciBib3RoIHdheXMgb2YgZ2V0dGluZyBoZXJlOiBkaXNwYXRjaCBtYXRjaGVkIG5vdGhpbmcsIG9yIGl0XG4gICAqIG1hdGNoZWQgYSBidWlsZCBhc3NldCB0aGF0IGlzIG5vdCBpbiB0aGUgcGFja2FnZS5cbiAgICpcbiAgICogTm8tc3RvcmUsIGFsd2F5cy4gQSBwcmVyZW5kZXJlZCBgL19ub3QtZm91bmRgIHdvdWxkIG90aGVyd2lzZSBzZW5kIGl0c1xuICAgKiBjYWNoZSBlbnRyeSdzIHllYXItbG9uZyBgcy1tYXhhZ2VgLCBhbmQgdGhlIENETiB3b3VsZCBrZWVwIHRoZSA0MDQgcGFzdCB0aGVcbiAgICogZGVwbG95IHRoYXQgYWRkcyB0aGUgcm91dGUuIFNldCByYXRoZXIgdGhhbiBmb3JjZWQ6IE5leHQncyBwYWdlIGhhbmRsZXJzXG4gICAqIG9ubHkgd3JpdGUgYSBgQ2FjaGUtQ29udHJvbGAgd2hlbiBub25lIGlzIHNldCAoYHNlbmRSZW5kZXJSZXN1bHRgLFxuICAgKiBgcGFnZXMtaGFuZGxlci5qc2ApLCB3aGljaCBpcyBleGFjdGx5IGhvdyBgbmV4dCBzdGFydGAncyBvd24gbm8tc3RvcmUgaGVyZVxuICAgKiBzdXJ2aXZlcyB0aGUgcmVuZGVyLiBgcmVuZGVyNDA0YCBpcyBub3QgdGhpcyBwYXRoOiBhIGBub3RGb3VuZCgpYCBmcm9tIGFuXG4gICAqIElTUiBwYWdlIGlzIGNhY2hlYWJsZSBmb3IgdGhhdCBwYWdlJ3MgcmV2YWxpZGF0ZSBwZXJpb2QuXG4gICAqXG4gICAqIEEgbWlzc2luZyBgX25leHQvc3RhdGljYCBmaWxlLCBhbmQgYSBHRVQgb3IgSEVBRCB3aG9zZSBgU2VjLUZldGNoLURlc3RgXG4gICAqIHNheXMgaXQgY2Fubm90IGRpc3BsYXkgSFRNTCAoYW4gYDxpbWc+YCwgYSBzY3JpcHQsIGEgZm9udCksIGdldCBhXG4gICAqIHBsYWluLXRleHQgYE5vdCBGb3VuZGAgaW5zdGVhZCBvZiB0aGUgcmVuZGVyZWQgcGFnZSDigJQgbm90aGluZyB3b3VsZCBzaG93XG4gICAqIGl0LCBhbmQgcmVuZGVyaW5nIGl0IGlzIHRoZSBleHBlbnNpdmUgcGFydC5cbiAgICpcbiAgICogRXZlcnl0aGluZyBlbHNlIHJlbmRlcnMgdGhlIGFwcCdzIDQwNCBhcyB0aGUgcGF0aCB0aGF0IHdhcyBhc2tlZCBmb3IsIG5vdFxuICAgKiBhcyBgL19ub3QtZm91bmRgOiB0aGUgQXBwIFJvdXRlciBzZXJpYWxpemVzIHRoZSBjYW5vbmljYWwgVVJMIGludG8gdGhlIFJTQ1xuICAgKiBwYXlsb2FkLCBzbyBhIGNsaWVudCBoeWRyYXRlZCBvZmYgYSBgL19ub3QtZm91bmRgIHBheWxvYWQgcmVwb3J0cyB0aGUgd3JvbmdcbiAgICogYHVzZVBhdGhuYW1lKClgIGFuZCBwdXNoZXMgdGhlIHdyb25nIGhpc3RvcnkgZW50cnkuIEl0IHJlbmRlcnMgd2l0aCB0aGVcbiAgICogcmVxdWVzdCBoZWFkZXJzIG1pZGRsZXdhcmUgc2V0LCB0b28g4oCUIGEgQ1NQIG5vbmNlLCBzYXkuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHNlbmRVbm1hdGNoZWQoXG4gICAgcmVxOiBTaGltSW5jb21pbmdNZXNzYWdlLFxuICAgIHJlczogU2hpbVNlcnZlclJlc3BvbnNlLFxuICAgIHdhaXRVbnRpbDogKHByb21pc2U6IFByb21pc2U8dW5rbm93bj4pID0+IHZvaWQsXG4gICAgcmVzdWx0OiB7IHJlYWRvbmx5IHBhdGhuYW1lOiBzdHJpbmc7IHJlYWRvbmx5IHJlcXVlc3RIZWFkZXJzOiBIZWFkZXJzIH0sXG4gICAgdXJsOiBVUkwsXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJlcy5zZXRIZWFkZXIoXCJDYWNoZS1Db250cm9sXCIsIE5PX1NUT1JFKTtcbiAgICBjb25zdCB7IGJhc2VQYXRoLCBhc3NldFByZWZpeCB9ID0gdGhpcy5vcHRpb25zLm1hbmlmZXN0LmNvbmZpZztcbiAgICBjb25zdCBwYXRobmFtZSA9IHdpdGhvdXRQYXRoUHJlZml4KFxuICAgICAgd2l0aG91dFBhdGhQcmVmaXgocmVzdWx0LnBhdGhuYW1lLCBiYXNlUGF0aCksXG4gICAgICBhc3NldFByZWZpeCxcbiAgICApO1xuICAgIGlmIChcbiAgICAgIHBhdGhuYW1lLnN0YXJ0c1dpdGgoXCIvX25leHQvc3RhdGljL1wiKSB8fFxuICAgICAgKChyZXEubWV0aG9kID09PSBcIkdFVFwiIHx8IHJlcS5tZXRob2QgPT09IFwiSEVBRFwiKSAmJlxuICAgICAgICBOT05fSFRNTF9TRUNfRkVUQ0hfREVTVFMuaGFzKFxuICAgICAgICAgIGZpcnN0VmFsdWUocmVxLmhlYWRlcnNbXCJzZWMtZmV0Y2gtZGVzdFwiXSkgPz8gXCJcIixcbiAgICAgICAgKSlcbiAgICApIHtcbiAgICAgIHJlcy5zdGF0dXNDb2RlID0gNDA0O1xuICAgICAgcmVzLnNldEhlYWRlcihcIkNvbnRlbnQtVHlwZVwiLCBcInRleHQvcGxhaW47IGNoYXJzZXQ9dXRmLThcIik7XG4gICAgICByZXMuZW5kKFwiTm90IEZvdW5kXCIpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICByZXEuaGVhZGVycyA9IHRvSW5jb21pbmdIdHRwSGVhZGVycyhyZXN1bHQucmVxdWVzdEhlYWRlcnMpO1xuICAgIGF3YWl0IHRoaXMuc2VuZE5vdEZvdW5kKFxuICAgICAgcmVxLFxuICAgICAgcmVzLFxuICAgICAgd2FpdFVudGlsLFxuICAgICAgdGhpcy5kaXNwYXRjaGVyLm5vdEZvdW5kRm9yKHVybCksXG4gICAgICBgJHtyZXN1bHQucGF0aG5hbWV9JHt1cmwuc2VhcmNofWAsXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBPbmUgb24tZGVtYW5kIHJldmFsaWRhdGlvbiwgcnVuIGFnYWluc3QgdGhpcyBydW50aW1lIHJhdGhlciB0aGFuIG92ZXIgdGhlXG4gICAqIG5ldHdvcmsuIFdpcmVkIGluIGFzIGByZXF1ZXN0TWV0YS5yZXZhbGlkYXRlYDsgc2VlIHRoZSBjb21tZW50IHRoZXJlLlxuICAgKlxuICAgKiBUaGUgcmVzcG9uc2UgaXMgdGhyb3duIGF3YXkg4oCUIG9ubHkgaXRzIHN0YXR1cyBtYXR0ZXJzIOKAlCBidXQgaXQgZ29lcyB0aHJvdWdoXG4gICAqIHRoZSBmdWxsIHtAbGluayBoYW5kbGV9LCBzbyB0aGUgZW50cnlwb2ludCBzZWVzIGEgcmVxdWVzdCB3aXRoXG4gICAqIGB4LXByZXJlbmRlci1yZXZhbGlkYXRlYCBvbiBpdCBhbmQgd3JpdGVzIHRoZSBmcmVzaCBlbnRyeSB0aHJvdWdoIHRoZSBjYWNoZVxuICAgKiBoYW5kbGVyIGV4YWN0bHkgYXMgYSByZXF1ZXN0IGZyb20gb3V0c2lkZSB3b3VsZC4gYGhhbmRsZWAgYXdhaXRzIGl0cyBvd25cbiAgICogYHdhaXRVbnRpbGAgd29yaywgc28gdGhlIG5ldyBlbnRyeSBpcyBjb21taXR0ZWQgYmVmb3JlIGByZXMucmV2YWxpZGF0ZSgpYFxuICAgKiByZXNvbHZlcywgd2hpY2ggaXMgd2hhdCBjYWxsZXJzIHRoYXQgcmV2YWxpZGF0ZSBhbmQgdGhlbiByZWRpcmVjdCBkZXBlbmQgb24uXG4gICAqXG4gICAqIFRoZSBhY2NlcHQvdGhyb3cgcnVsZSBpcyBgTmV4dFNlcnZlciNyZXZhbGlkYXRlYCdzLCB2ZXJiYXRpbTogYSByZXZhbGlkYXRpb25cbiAgICogaXMgc3VjY2Vzc2Z1bCBpZiBpdCB3YXMgY2FjaGVkIG9yIGFuc3dlcmVkIDIwMCwgYW5kIGBub3RGb3VuZDogdHJ1ZWBcbiAgICogbGVnaXRpbWF0ZWx5IGFuc3dlcnMgNDA0IGZvciBhbiBgdW5zdGFibGVfb25seUdlbmVyYXRlZGAgY2FsbGVyLiBBbnl0aGluZ1xuICAgKiBlbHNlIHRocm93cywgYW5kIGByZXMucmV2YWxpZGF0ZSgpYCB0dXJucyBpdCBpbnRvIGBGYWlsZWQgdG8gcmV2YWxpZGF0ZVxuICAgKiA8cGF0aD46IDxtZXNzYWdlPmAuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHJldmFsaWRhdGUoXG4gICAgY29uZmlnOiBSZXZhbGlkYXRlQ29uZmlnLFxuICAgIG9yaWdpbjogUnVudGltZVJlcXVlc3QsXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHsgaGVhZCwgb3RoZXJHcm91cCB9ID0gYXdhaXQgdGhpcy5oYW5kbGVJbnRlcm5hbGx5KFxuICAgICAge1xuICAgICAgICBtZXRob2Q6IFwiR0VUXCIsXG4gICAgICAgIHVybDogY29uZmlnLnVybFBhdGgsXG4gICAgICAgIC8vIFRoZSBjYWxsZXIncyBhdXRob3JpdHksIG5vdCB0aGUgcmV2YWxpZGF0ZWQgcGF0aCdzOiBpdCBpcyB3aGF0XG4gICAgICAgIC8vIGBhYnNvbHV0ZVVybGAgYnVpbGRzIHRoZSByZXF1ZXN0IFVSTCBmcm9tLCBhbmQgYSByZXZhbGlkYXRpb24gaXMgZm9yXG4gICAgICAgIC8vIHRoZSBvcmlnaW4gYmVpbmcgc2VydmVkLiBUaGUgZm9yd2FyZGVkIHBhaXIgd2l0aCBpdCDigJQgYmVoaW5kXG4gICAgICAgIC8vIENsb3VkRnJvbnQgYGhvc3RgIGlzIHRoZSBGdW5jdGlvbiBVUkwsIGFuZCBhIHJlbmRlciB0aGF0IGJ1aWx0IGl0c1xuICAgICAgICAvLyBhYnNvbHV0ZSBVUkxzIGZyb20gdGhhdCB3b3VsZCBjYWNoZSBsaW5rcyB0byB0aGUgcmF3IGZ1bmN0aW9uLlxuICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgLi4uY29uZmlnLmhlYWRlcnMsXG4gICAgICAgICAgaG9zdDogb3JpZ2luLmhlYWRlcnMuaG9zdCxcbiAgICAgICAgICAuLi5waWNrRGVmaW5lZChvcmlnaW4uaGVhZGVycywgW1xuICAgICAgICAgICAgXCJ4LWZvcndhcmRlZC1ob3N0XCIsXG4gICAgICAgICAgICBcIngtZm9yd2FyZGVkLXByb3RvXCIsXG4gICAgICAgICAgXSksXG4gICAgICAgIH0sXG4gICAgICAgIGVuY3J5cHRlZDogb3JpZ2luLmVuY3J5cHRlZCxcbiAgICAgICAgdHJ1c3RGb3J3YXJkZWRIb3N0OiBvcmlnaW4udHJ1c3RGb3J3YXJkZWRIb3N0LFxuICAgICAgfSxcbiAgICAgIHt9LFxuICAgICk7XG5cbiAgICBjb25zdCBzdGF0dXMgPSBoZWFkPy5zdGF0dXNDb2RlID8/IDUwMDtcbiAgICBpZiAob3RoZXJHcm91cCkge1xuICAgICAgY29uc3Qgc2VsZiA9IHByb2Nlc3MuZW52W0ZVTkNUSU9OX0dST1VQX0VOVl9WQVJdO1xuICAgICAgLy8gQSBwYWdlIHBhY2thZ2VkIGludG8gYW5vdGhlciBgZnVuY3Rpb25Hcm91cHNgIGdyb3VwOiBpdCBpcyByZW5kZXJlZCBpblxuICAgICAgLy8gcHJvY2VzcywgYW5kIHRoaXMgZnVuY3Rpb24gZG9lcyBub3QgaGF2ZSB0aGUgcGFnZSdzIGNvZGUuIENoZWNrZWRcbiAgICAgIC8vIGZpcnN0IGJlY2F1c2UgaXQgcmVuZGVycyBhcyBhIDQwNCwgd2hpY2ggYHVuc3RhYmxlX29ubHlHZW5lcmF0ZWRgXG4gICAgICAvLyB3b3VsZCBvdGhlcndpc2UgYWNjZXB0LlxuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgSW52YWxpZCByZXNwb25zZSAke3N0YXR1c306IFwiJHtjb25maWcudXJsUGF0aH1cIiBiZWxvbmdzIHRvIGAgK1xuICAgICAgICAgIGBcXGBmdW5jdGlvbkdyb3Vwc1xcYCBncm91cCBcIiR7b3RoZXJHcm91cC5vd25lcn1cIiwgYW5kIGAgK1xuICAgICAgICAgIGByZXMucmV2YWxpZGF0ZSgpIGNhbiBvbmx5IHJldmFsaWRhdGUgcGFnZXMgaW4gdGhlIGdyb3VwIGl0IHJ1bnMgYCArXG4gICAgICAgICAgYGluIChcIiR7c2VsZn1cIikuIENhbGwgaXQgZnJvbSBhbiBBUEkgcm91dGUgaW4gZ3JvdXAgYCArXG4gICAgICAgICAgYFwiJHtvdGhlckdyb3VwLm93bmVyfVwiLCBvciB1c2UgcmV2YWxpZGF0ZVBhdGgoKS9yZXZhbGlkYXRlVGFnKCksIGAgK1xuICAgICAgICAgIGB3aGljaCB3b3JrIGZyb20gYW55IGdyb3VwLmAsXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICBoZWFkPy5oZWFkZXJzW1wieC1uZXh0anMtY2FjaGVcIl0gIT09IFwiUkVWQUxJREFURURcIiAmJlxuICAgICAgc3RhdHVzICE9PSAyMDAgJiZcbiAgICAgICEoc3RhdHVzID09PSA0MDQgJiYgY29uZmlnLm9wdHMudW5zdGFibGVfb25seUdlbmVyYXRlZClcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCByZXNwb25zZSAke3N0YXR1c31gKTtcbiAgICB9XG5cbiAgICBhd2FpdCBpbnZhbGlkYXRlUmV2YWxpZGF0ZWRQYWdlKGNvbmZpZy51cmxQYXRoLCB0aGlzLm9wdGlvbnMubWFuaWZlc3QpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFuIGltYWdlIG9wdGltaXphdGlvbiBzb3VyY2UgdGhhdCBpcyBub3QgYSBmaWxlOiBgPEltYWdlIHNyYz1cIi9hcGkvYXZhdGFyXCI+YFxuICAgKiBzZXJ2ZWQgYnkgYSByb3V0ZSBoYW5kbGVyLiBXaXJlZCBpbiBhcyB0aGUgb3B0aW1pemVyJ3MgYGZldGNoSW50ZXJuYWxgLCBhbmRcbiAgICogcnVuIGluIHByb2Nlc3MgZm9yIHRoZSByZWFzb25zIHtAbGluayByZXZhbGlkYXRlfSBpcyDigJQgYG5leHQgc3RhcnRgIGZldGNoZXNcbiAgICogdGhlIHNvdXJjZSBmcm9tIGl0c2VsZiBvdmVyIGxvb3BiYWNrLCB3aGljaCBoZXJlIHdvdWxkIGJlIGEgc2Vjb25kIGJpbGxlZFxuICAgKiBpbnZvY2F0aW9uIHRocm91Z2ggQ2xvdWRGcm9udC5cbiAgICpcbiAgICogT25seSB0aGUgYXV0aG9yaXR5IGlzIGZvcndhcmRlZCwgYXMgYG5leHQgc3RhcnRgJ3MgYGZldGNoSW50ZXJuYWxJbWFnZWBcbiAgICogZm9yd2FyZHMgbm9uZSBvZiB0aGUgdmlld2VyJ3MgaGVhZGVyczogdGhlIHNvdXJjZSBpcyBjYWNoZWQgYW5kIHNlcnZlZCB0b1xuICAgKiBldmVyeW9uZSwgc28gaXQgbXVzdCBub3QgZGVwZW5kIG9uIG9uZSB2aWV3ZXIncyBjb29raWVzLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBmZXRjaEludGVybmFsKFxuICAgIGhyZWY6IHN0cmluZyxcbiAgICByZXE6IFNoaW1JbmNvbWluZ01lc3NhZ2UsXG4gICAgbWF4aW11bUJvZHk6IG51bWJlcixcbiAgKTogUHJvbWlzZTxJbnRlcm5hbEltYWdlUmVzcG9uc2U+IHtcbiAgICBjb25zdCByZXF1ZXN0OiBSdW50aW1lUmVxdWVzdCA9IHtcbiAgICAgIG1ldGhvZDogXCJHRVRcIixcbiAgICAgIHVybDogaHJlZixcbiAgICAgIGhlYWRlcnM6IHBpY2tEZWZpbmVkKHJlcS5oZWFkZXJzLCBbXG4gICAgICAgIFwiaG9zdFwiLFxuICAgICAgICBcIngtZm9yd2FyZGVkLWhvc3RcIixcbiAgICAgICAgXCJ4LWZvcndhcmRlZC1wcm90b1wiLFxuICAgICAgXSksXG4gICAgICBlbmNyeXB0ZWQ6IChyZXEuc29ja2V0IGFzIHsgZW5jcnlwdGVkPzogYm9vbGVhbiB9IHwgdW5kZWZpbmVkKT8uZW5jcnlwdGVkLFxuICAgICAgdHJ1c3RGb3J3YXJkZWRIb3N0OiByZXEudHJ1c3RGb3J3YXJkZWRIb3N0LFxuICAgIH07XG4gICAgY29uc3QgeyBoZWFkLCBib2R5LCBvdGhlckdyb3VwLCB0b29MYXJnZSB9ID0gYXdhaXQgdGhpcy5oYW5kbGVJbnRlcm5hbGx5KFxuICAgICAgcmVxdWVzdCxcbiAgICAgIHsgbWF4aW11bUJvZHkgfSxcbiAgICApO1xuICAgIGlmICh0b29MYXJnZSkge1xuICAgICAgcmV0dXJuIHsgc3RhdHVzQ29kZTogMCwgaGVhZGVyczoge30sIGJvZHk6IEJ1ZmZlci5hbGxvYygwKSwgdG9vTGFyZ2UgfTtcbiAgICB9XG4gICAgaWYgKG90aGVyR3JvdXApIHtcbiAgICAgIC8vIFRoZSBlZGdlIHNlbmRzIGV2ZXJ5IGAvX25leHQvaW1hZ2VgIHJlcXVlc3QgdG8gdGhlIGRlZmF1bHQgZ3JvdXAsIGFuZFxuICAgICAgLy8gdGhlIHNvdXJjZSBpcyByZW5kZXJlZCBpbiBwcm9jZXNzLCBzbyBhIHJvdXRlIHBhY2thZ2VkIGludG8gYW5vdGhlclxuICAgICAgLy8gZ3JvdXAgaXMgb3V0IG9mIHJlYWNoOiB0aGUgb3B0aW1pemVyIGFuc3dlcnMgKGFuZCBsb2dzKSBhIDUwMi5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHN0YXR1c0NvZGU6IDAsXG4gICAgICAgIGhlYWRlcnM6IHt9LFxuICAgICAgICBib2R5OiBCdWZmZXIuYWxsb2MoMCksXG4gICAgICAgIG90aGVyR3JvdXA6IG90aGVyR3JvdXAub3duZXIsXG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgc3RhdHVzQ29kZTogaGVhZD8uc3RhdHVzQ29kZSA/PyAwLFxuICAgICAgaGVhZGVyczogaGVhZD8uaGVhZGVycyA/PyB7fSxcbiAgICAgIGJvZHksXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBPbmUgcmVxdWVzdCB0aHJvdWdoIHtAbGluayBoYW5kbGV9LCBhbnN3ZXJlZCB0byB0aGlzIHJ1bnRpbWUgaW5zdGVhZCBvZiBhXG4gICAqIGNsaWVudDogdGhlIGhlYWQsIHRoZSBib2R5IHdoZW4gaXQgaXMgd2FudGVkLCBhbmQgdGhlIGVycm9yIHdoZW4gdGhlIHJvdXRlXG4gICAqIGlzIHBhY2thZ2VkIGludG8gYW5vdGhlciBgZnVuY3Rpb25Hcm91cHNgIGdyb3VwLiBgaGFuZGxlYCBhd2FpdHMgdGhlXG4gICAqIHJlcXVlc3QncyBgd2FpdFVudGlsYCB3b3JrIHRvbywgc28gd2hhdGV2ZXIgdGhlIHJlbmRlciB3cm90ZSBpcyBjb21taXR0ZWQgYnlcbiAgICogdGhlIHRpbWUgdGhpcyByZXNvbHZlcy5cbiAgICpcbiAgICogVGhlIGJvZHkgaXMga2VwdCBvbmx5IHdoZW4gYG1heGltdW1Cb2R5YCBpcyBzZXQuIE9uZSBwYXN0IGl0IGZhaWxzIHRoZVxuICAgKiByZXNwb25zZSBzdHJlYW0sIHdoaWNoIHN0b3BzIHRoZSByb3V0ZSB3cml0aW5nLCBhbmQgY29tZXMgYmFjayBhc1xuICAgKiBgdG9vTGFyZ2VgIHJhdGhlciB0aGFuIGhlbGQgaW4gbWVtb3J5LlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBoYW5kbGVJbnRlcm5hbGx5KFxuICAgIHJlcXVlc3Q6IFJ1bnRpbWVSZXF1ZXN0LFxuICAgIG9wdGlvbnM6IHsgcmVhZG9ubHkgbWF4aW11bUJvZHk/OiBudW1iZXIgfSxcbiAgKTogUHJvbWlzZTx7XG4gICAgaGVhZD86IFJlc3BvbnNlSGVhZDtcbiAgICBib2R5OiBCdWZmZXI7XG4gICAgb3RoZXJHcm91cD86IFJvdXRlSW5PdGhlckdyb3VwRXJyb3I7XG4gICAgdG9vTGFyZ2U6IGJvb2xlYW47XG4gIH0+IHtcbiAgICBsZXQgaGVhZDogUmVzcG9uc2VIZWFkIHwgdW5kZWZpbmVkO1xuICAgIGNvbnN0IGNodW5rczogQnVmZmVyW10gPSBbXTtcbiAgICBsZXQgc2l6ZSA9IDA7XG4gICAgbGV0IHRvb0xhcmdlID0gZmFsc2U7XG4gICAgbGV0IG90aGVyR3JvdXA6IFJvdXRlSW5PdGhlckdyb3VwRXJyb3IgfCB1bmRlZmluZWQ7XG4gICAgY29uc3Qgb25Sb3V0ZUluT3RoZXJHcm91cCA9IChlcnJvcjogUm91dGVJbk90aGVyR3JvdXBFcnJvcikgPT4ge1xuICAgICAgb3RoZXJHcm91cCA9IGVycm9yO1xuICAgIH07XG4gICAgYXdhaXQgdGhpcy5oYW5kbGUoXG4gICAgICB7IC4uLnJlcXVlc3QsIG9uUm91dGVJbk90aGVyR3JvdXAgfSxcbiAgICAgIHtcbiAgICAgICAgYmVnaW4ocmVzcG9uc2VIZWFkKSB7XG4gICAgICAgICAgaGVhZCA9IHJlc3BvbnNlSGVhZDtcbiAgICAgICAgICByZXR1cm4gbmV3IFdyaXRhYmxlKHtcbiAgICAgICAgICAgIHdyaXRlKGNodW5rOiBCdWZmZXIsIF9lbmNvZGluZywgY2FsbGJhY2spIHtcbiAgICAgICAgICAgICAgaWYgKG9wdGlvbnMubWF4aW11bUJvZHkgPT09IHVuZGVmaW5lZCkgcmV0dXJuIGNhbGxiYWNrKCk7XG4gICAgICAgICAgICAgIHNpemUgKz0gY2h1bmsuYnl0ZUxlbmd0aDtcbiAgICAgICAgICAgICAgaWYgKHNpemUgPiBvcHRpb25zLm1heGltdW1Cb2R5KSB7XG4gICAgICAgICAgICAgICAgdG9vTGFyZ2UgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayhuZXcgRXJyb3IoXCJPdmVyIGltYWdlcy5tYXhpbXVtUmVzcG9uc2VCb2R5XCIpKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBjaHVua3MucHVzaChCdWZmZXIuZnJvbShjaHVuaykpO1xuICAgICAgICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgKTtcbiAgICByZXR1cm4ge1xuICAgICAgaGVhZCxcbiAgICAgIGJvZHk6IHRvb0xhcmdlID8gQnVmZmVyLmFsbG9jKDApIDogQnVmZmVyLmNvbmNhdChjaHVua3MpLFxuICAgICAgb3RoZXJHcm91cCxcbiAgICAgIHRvb0xhcmdlLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQXBwIFJvdXRlciBidWlsZHMgYW4gaW52b2NhYmxlIGAvX25vdC1mb3VuZGAsIFBhZ2VzIFJvdXRlciBhIHByZXJlbmRlcmVkXG4gICAqIGA0MDQuaHRtbGAgKHBlciBsb2NhbGUgdW5kZXIgaTE4bikgb3IgZWxzZSBgL19lcnJvcmA7IHNlZSBgc3RhdHVzVGFyZ2V0c2AuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHNlbmROb3RGb3VuZChcbiAgICByZXE6IFNoaW1JbmNvbWluZ01lc3NhZ2UsXG4gICAgcmVzOiBTaGltU2VydmVyUmVzcG9uc2UsXG4gICAgd2FpdFVudGlsOiAocHJvbWlzZTogUHJvbWlzZTx1bmtub3duPikgPT4gdm9pZCxcbiAgICB0YXJnZXQ6IFN0YXR1c1RhcmdldCxcbiAgICAvKipcbiAgICAgKiBXaGF0IHRvIHJlbmRlciB0aGUgNDA0IGFzLiBPbWl0dGVkIGJ5IGByZW5kZXI0MDRgLCB3aGljaCBpcyBjYWxsZWRcbiAgICAgKiBtaWQtcmVuZGVyIHdpdGggYHJlcS51cmxgIGFscmVhZHkgcG9pbnRpbmcgYXQgdGhlIHJvdXRlIHRoYXQgZ2F2ZSB1cCDigJRcbiAgICAgKiB0aGUgcGF0aCBOZXh0LmpzIHdvdWxkIHJlbmRlciB0aGF0IDQwNCBmb3IuXG4gICAgICovXG4gICAgcmVxdWVzdGVkVXJsPzogc3RyaW5nLFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXMuc3RhdHVzQ29kZSA9IDQwNDtcblxuICAgIGlmICh0YXJnZXQua2luZCA9PT0gXCJlbnRyeXBvaW50XCIpIHtcbiAgICAgIGNvbnN0IGhhbmRsZXIgPSBhd2FpdCB0aGlzLmVudHJ5cG9pbnRzLmxvYWQodGFyZ2V0LmVudHJ5cG9pbnQpO1xuICAgICAgcmVxLnVybCA9IHJlcXVlc3RlZFVybCA/PyByZXEudXJsO1xuICAgICAgYXdhaXQgaGFuZGxlcihyZXEsIGFzU2VydmVyUmVzcG9uc2UocmVzKSwgeyB3YWl0VW50aWwgfSk7XG4gICAgICBpZiAoIXJlcy53cml0YWJsZUVuZGVkKSB7XG4gICAgICAgIHJlcy5lbmQoKTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICB0YXJnZXQua2luZCA9PT0gXCJzdGF0aWMtZmlsZVwiICYmXG4gICAgICAoYXdhaXQgdGhpcy5zZW5kSHRtbEZpbGUocmVzLCB0YXJnZXQpKVxuICAgICkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHJlcy5zZXRIZWFkZXIoXCJDb250ZW50LVR5cGVcIiwgXCJ0ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04XCIpO1xuICAgIHJlcy5lbmQoXCJUaGlzIHBhZ2UgY291bGQgbm90IGJlIGZvdW5kLlwiKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUdXJuIGEgdGhyb3duIGVycm9yIGludG8gYSByZXNwb25zZSwgcmVuZGVyaW5nIHRoZSBhcHAncyBlcnJvciBwYWdlIHdoZW4gaXRcbiAgICogaGFzIG9uZS5cbiAgICpcbiAgICogTmV4dC5qcydzIG93biBwYWdlIGhhbmRsZXJzIGNhdGNoLCByZXBvcnQgYW5kIHRoZW4gKnJldGhyb3cqIChcInJldGhyb3cgc29cbiAgICogdGhhdCB3ZSBjYW4gaGFuZGxlIHNlcnZpbmcgZXJyb3IgcGFnZVwiLCBgcGFnZXMtaGFuZGxlci50c2ApLCB3aGljaCBtYWtlcyB0aGVcbiAgICogZXJyb3IgcGFnZSB0aGUgaG9zdCdzIGpvYiDigJQgdGhlIHNhbWUgZGl2aXNpb24gb2YgbGFib3IgYXMgYHJlbmRlcjQwNGAuIFdpdGhvdXRcbiAgICogdGhpcyBsYWRkZXIgZXZlcnkgdGhyb3cgYW5zd2VyZWQgYSBiYXJlIGB0ZXh0L3BsYWluYCA1MDAgYW5kIGEgY3VzdG9tXG4gICAqIGBwYWdlcy9fZXJyb3JgIHdhcyBkZWFkIGNvZGUgKGB0ZXN0L2UyZS9hc3luYy1tb2R1bGVzYCwgd2hvc2UgYC9tYWtlLWVycm9yYFxuICAgKiB0aHJvd3MgaW4gYGdldFNlcnZlclNpZGVQcm9wc2ApLlxuICAgKlxuICAgKiBPbmNlIHRoZSBoZWFkIGlzIG91dCB0aGVyZSBpcyBub3RoaW5nIHRvIHNheSDigJQgZGVzdHJveWluZyB0aGUgc3RyZWFtIGlzIHdoYXRcbiAgICogdGVsbHMgdGhlIGNsaWVudCB0aGUgcmVzcG9uc2UgaXMgdHJ1bmNhdGVkIHJhdGhlciB0aGFuIGNvbXBsZXRlLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBzZW5kRXJyb3IoXG4gICAgcmVxOiBTaGltSW5jb21pbmdNZXNzYWdlLFxuICAgIHJlczogU2hpbVNlcnZlclJlc3BvbnNlLFxuICAgIHdhaXRVbnRpbDogKHByb21pc2U6IFByb21pc2U8dW5rbm93bj4pID0+IHZvaWQsXG4gICAgZXJyb3I6IHVua25vd24sXG4gICAgLyoqIFRoZSByZXF1ZXN0LCBhcyByZWNlaXZlZDogd2hpY2ggbG9jYWxlJ3MgcHJlcmVuZGVyZWQgNTAwIHRvIHNlbmQuICovXG4gICAgdXJsOiBVUkwgfCB1bmRlZmluZWQsXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnNvbGUuZXJyb3IoXCJVbmhhbmRsZWQgZXJyb3Igd2hpbGUgaGFuZGxpbmcgdGhlIHJlcXVlc3Q6XCIsIGVycm9yKTtcbiAgICBpZiAocmVzLmhlYWRlcnNTZW50KSB7XG4gICAgICByZXMuZGVzdHJveShhc0Vycm9yKGVycm9yKSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHJlcy5zdGF0dXNDb2RlID0gNTAwO1xuICAgIC8vIEEgZmFpbGVkIHJlbmRlciBtYXkgaGF2ZSBzZXQgaGVhZGVycyBkZXNjcmliaW5nIGEgYm9keSB0aGF0IG5ldmVyXG4gICAgLy8gYXJyaXZlZC4gRXZlcnkgcnVuZyBiZWxvdyBzZW5kcyBhIGRpZmZlcmVudCBib2R5LCBzbyB0aGV5IGdvIGZpcnN0OiBhXG4gICAgLy8gc3RhbGUgYENvbnRlbnQtTGVuZ3RoYCBvbiBhIDUwMC5odG1sIG9mIGFub3RoZXIgc2l6ZSBoYW5ncyB0aGUgY2xpZW50IG9yXG4gICAgLy8gZGVzeW5jcyBhIGtlZXAtYWxpdmUgY29ubmVjdGlvbi5cbiAgICByZXMucmVtb3ZlSGVhZGVyKFwiQ29udGVudC1MZW5ndGhcIik7XG4gICAgcmVzLnJlbW92ZUhlYWRlcihcIkVUYWdcIik7XG4gICAgLy8gRXZlcnkgcnVuZywgdGhlIGVycm9yLXBhZ2UgZW50cnlwb2ludCBpbmNsdWRlZDogb3RoZXJ3aXNlIHRoZSB0aHJvd2luZ1xuICAgIC8vIHJlbmRlcidzIGBzLW1heGFnZWAgKG9yIGEgYGhlYWRlcnMoKWAgcnVsZSdzKSByaWRlcyBhbG9uZyBhbmQgQ2xvdWRGcm9udFxuICAgIC8vIGNhY2hlcyB0aGUgNTAwLiBgbmV4dCBzdGFydGAgc2V0cyBpdCBiZWZvcmUgcmVuZGVyaW5nIHRoZSBlcnJvciBwYWdlIHRvby5cbiAgICByZXMuc2V0SGVhZGVyKFwiQ2FjaGUtQ29udHJvbFwiLCBOT19TVE9SRSk7XG4gICAgY29uc3QgdGFyZ2V0ID0gdGhpcy5lcnJvclRhcmdldEZvcih1cmwpO1xuXG4gICAgaWYgKHRhcmdldC5raW5kID09PSBcImVudHJ5cG9pbnRcIikge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgaGFuZGxlciA9IGF3YWl0IHRoaXMuZW50cnlwb2ludHMubG9hZCh0YXJnZXQuZW50cnlwb2ludCk7XG4gICAgICAgIC8vIGByZXEudXJsYCBpcyBsZWZ0IGFsb25lOiB0aGUgZXJyb3IgcGFnZSByZW5kZXJzIGZvciB0aGUgVVJMIHRoYXQgd2FzXG4gICAgICAgIC8vIGFza2VkIGZvciwgYW5kIGBfZXJyb3JgJ3MgYGdldEluaXRpYWxQcm9wc2AgcmVhZHMgdGhlIHN0YXR1cyBvZmYgYHJlc2AsXG4gICAgICAgIC8vIHdoaWNoIGlzIHdoeSB0aGUgNTAwIGFib3ZlIGlzIHNldCBmaXJzdC5cbiAgICAgICAgYXdhaXQgaGFuZGxlcihyZXEsIGFzU2VydmVyUmVzcG9uc2UocmVzKSwgeyB3YWl0VW50aWwgfSk7XG4gICAgICAgIGlmICghcmVzLndyaXRhYmxlRW5kZWQpIHtcbiAgICAgICAgICByZXMuZW5kKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSBjYXRjaCAoZXJyb3JQYWdlRXJyb3IpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICBcIlRoZSBlcnJvciBwYWdlIGl0c2VsZiBmYWlsZWQgdG8gcmVuZGVyOlwiLFxuICAgICAgICAgIGVycm9yUGFnZUVycm9yLFxuICAgICAgICApO1xuICAgICAgICBpZiAocmVzLmhlYWRlcnNTZW50KSB7XG4gICAgICAgICAgcmVzLmRlc3Ryb3koYXNFcnJvcihlcnJvclBhZ2VFcnJvcikpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChcbiAgICAgIHRhcmdldC5raW5kID09PSBcInN0YXRpYy1maWxlXCIgJiZcbiAgICAgIChhd2FpdCB0aGlzLnNlbmRIdG1sRmlsZShyZXMsIHRhcmdldCkpXG4gICAgKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gQWdhaW46IGFuIGVycm9yIHBhZ2UgdGhhdCB0aHJldyBtYXkgaGF2ZSBkZXNjcmliZWQgaXRzIG93biBib2R5IHRvby5cbiAgICByZXMucmVtb3ZlSGVhZGVyKFwiQ29udGVudC1MZW5ndGhcIik7XG4gICAgcmVzLnJlbW92ZUhlYWRlcihcIkVUYWdcIik7XG4gICAgcmVzLnN0YXR1c0NvZGUgPSA1MDA7XG4gICAgcmVzLnNldEhlYWRlcihcIkNvbnRlbnQtVHlwZVwiLCBcInRleHQvcGxhaW47IGNoYXJzZXQ9dXRmLThcIik7XG4gICAgcmVzLnNldEhlYWRlcihcIkNhY2hlLUNvbnRyb2xcIiwgTk9fU1RPUkUpO1xuICAgIHJlcy5lbmQoXCJJbnRlcm5hbCBTZXJ2ZXIgRXJyb3JcIik7XG4gIH1cblxuICAvKipcbiAgICogQSBwcmVyZW5kZXJlZCA0MDQgb3IgNTAwIHBhZ2UsIG9yIGBmYWxzZWAgd2hlbiBpdCBjYW5ub3QgYmUgcmVhZCBhbmQgdGhlXG4gICAqIGNhbGxlcidzIHBsYWluLXRleHQgZmFsbGJhY2sgc2hvdWxkIGFuc3dlci4gUmVhZCByYXRoZXIgdGhhbiBgc2VydmVTdGF0aWNgLFxuICAgKiB3aGljaCBrZWVwcyB0aGUgc3RhdHVzIGFscmVhZHkgc2V0IGJ1dCB3b3VsZCBhbnN3ZXIgYSBgUmFuZ2VgIHJlcXVlc3Qgd2l0aFxuICAgKiBhIDIwNiBvZiB0aGUgZXJyb3IgcGFnZSwgYW5kIGFkZCBgRVRhZ2AsIGBMYXN0LU1vZGlmaWVkYCBhbmQsIHdoZXJlIG5vbmUgaXNcbiAgICogc2V0IHlldCwgYSBwdWJsaWMgYENhY2hlLUNvbnRyb2xgIHRvIGl0LlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBzZW5kSHRtbEZpbGUoXG4gICAgcmVzOiBTaGltU2VydmVyUmVzcG9uc2UsXG4gICAgdGFyZ2V0OiB7IHJlYWRvbmx5IGZpbGVQYXRoOiBzdHJpbmcgfSxcbiAgKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgbGV0IGh0bWw6IEJ1ZmZlcjtcbiAgICB0cnkge1xuICAgICAgaHRtbCA9IGF3YWl0IHJlYWRGaWxlKGpvaW4odGhpcy5vcHRpb25zLmRlcGxveW1lbnRSb290LCB0YXJnZXQuZmlsZVBhdGgpKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmVzLnNldEhlYWRlcihcIkNvbnRlbnQtVHlwZVwiLCBcInRleHQvaHRtbDsgY2hhcnNldD11dGYtOFwiKTtcbiAgICByZXMuZW5kKGh0bWwpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG59XG5cbi8qKlxuICogV2hhdCBuZXh0IHNlbmRzIHdpdGggYW4gZXJyb3IgaXQgcmVuZGVyZWQgaXRzZWxmLiBXaXRob3V0IGl0IGEgYENhY2hlLUNvbnRyb2xgXG4gKiBsZWZ0IGJlaGluZCBieSB0aGUgcmVuZGVyIHRoYXQgdGhyZXcgY2FuIGdldCBhIDUwMCBjYWNoZWQgYXQgdGhlIGVkZ2UuXG4gKi9cbmNvbnN0IE5PX1NUT1JFID0gXCJwcml2YXRlLCBuby1jYWNoZSwgbm8tc3RvcmUsIG1heC1hZ2U9MCwgbXVzdC1yZXZhbGlkYXRlXCI7XG5cbi8qKlxuICogYFNlYy1GZXRjaC1EZXN0YCB2YWx1ZXMgdGhhdCBjYW4gbmV2ZXIgZGlzcGxheSBhbiBIVE1MIHJlc3BvbnNlLCBmcm9tXG4gKiBgbmV4dC9kaXN0L3NlcnZlci9saWIvaXMtbm9uLWh0bWwtc2VjLWZldGNoLWRlc3QuanNgLiBSZXN0YXRlZCByYXRoZXIgdGhhblxuICogcmVxdWlyZWQsIGJlY2F1c2UgdGhhdCBtb2R1bGUgaXMgcmVjZW50IGFuZCB0aGUgYXBwJ3MgYG5leHRgIG1heSBwcmVkYXRlIGl0OlxuICogYSBmYWlsZWQgcmVxdWlyZSBoZXJlIHdvdWxkIHR1cm4gZXZlcnkgNDA0IGludG8gYSA1MDAuIEV4Y2x1ZGVzIGBkb2N1bWVudGAsXG4gKiBgaWZyYW1lYCBhbmQgdGhlIGxpa2UsIGFuZCBgZW1wdHlgIOKAlCBgZmV0Y2goKWAsIHdoaWNoIGlzIGhvdyBSU0MgcmVxdWVzdHMgZ28uXG4gKi9cbmNvbnN0IE5PTl9IVE1MX1NFQ19GRVRDSF9ERVNUUzogUmVhZG9ubHlTZXQ8c3RyaW5nPiA9IG5ldyBTZXQoW1xuICBcImF1ZGlvXCIsXG4gIFwiYXVkaW93b3JrbGV0XCIsXG4gIFwiZm9udFwiLFxuICBcImltYWdlXCIsXG4gIFwianNvblwiLFxuICBcIm1hbmlmZXN0XCIsXG4gIFwicGFpbnR3b3JrbGV0XCIsXG4gIFwicmVwb3J0XCIsXG4gIFwic2NyaXB0XCIsXG4gIFwic2VydmljZXdvcmtlclwiLFxuICBcInNoYXJlZHdvcmtlclwiLFxuICBcInN0eWxlXCIsXG4gIFwidHJhY2tcIixcbiAgXCJ2aWRlb1wiLFxuICBcIndlYmlkZW50aXR5XCIsXG4gIFwid29ya2VyXCIsXG4gIFwieHNsdFwiLFxuXSk7XG5cbi8qKlxuICogYElOVEVSTkFMX0hFQURFUlNgIGZyb20gYG5leHQvZGlzdC9zZXJ2ZXIvbGliL3NlcnZlci1pcGMvdXRpbHMuanNgIChOZXh0XG4gKiAxNi4zKSwgd2hpY2ggYG5leHQgc3RhcnRgIGRlbGV0ZXMgZnJvbSBldmVyeSByZXF1ZXN0IGJlZm9yZSByb3V0aW5nIGl0XG4gKiAoYGZpbHRlckludGVybmFsSGVhZGVyc2AgaW4gYHJvdXRlci1zZXJ2ZXIuanNgKS4gVGhleSBhcmUgc2lnbmFscyBiZXR3ZWVuXG4gKiBOZXh0J3Mgb3duIHJvdXRlciBhbmQgcmVuZGVyIGxheWVyczsgaG9ub3Jpbmcgb25lIGEgY2xpZW50IHNlbnQgbGV0cyBpdCBzdGVlclxuICogdGhvc2UgbGF5ZXJzIOKAlCBgbmV4dC1yZXN1bWVgIG1ha2VzIGEgUFBSIHBhZ2UgcmVzdW1lIGZyb20gYSBwb3N0cG9uZWQgc3RhdGVcbiAqIHRoZSBjbGllbnQgc3VwcGxpZXMuIFJlc3RhdGVkIHJhdGhlciB0aGFuIHJlcXVpcmVkLCBsaWtlXG4gKiB7QGxpbmsgTk9OX0hUTUxfU0VDX0ZFVENIX0RFU1RTfS5cbiAqL1xuY29uc3QgSU5URVJOQUxfSEVBREVSUzogUmVhZG9ubHlTZXQ8c3RyaW5nPiA9IG5ldyBTZXQoW1xuICBcIngtbWlkZGxld2FyZS1yZXdyaXRlXCIsXG4gIFwieC1taWRkbGV3YXJlLXJlZGlyZWN0XCIsXG4gIFwieC1taWRkbGV3YXJlLXNldC1jb29raWVcIixcbiAgXCJ4LW1pZGRsZXdhcmUtc2tpcFwiLFxuICBcIngtbWlkZGxld2FyZS1vdmVycmlkZS1oZWFkZXJzXCIsXG4gIFwieC1taWRkbGV3YXJlLW5leHRcIixcbiAgXCJ4LW5vdy1yb3V0ZS1tYXRjaGVzXCIsXG4gIFwieC1tYXRjaGVkLXBhdGhcIixcbiAgXCJ4LW5leHRqcy1kYXRhXCIsXG4gIFwieC1uZXh0LXJlc3VtZS1zdGF0ZS1sZW5ndGhcIixcbiAgXCJuZXh0LXJlc3VtZVwiLFxuXSk7XG5cbi8qKlxuICogVGhlIHJlcXVlc3QgaGVhZGVycyB3aXRoIHtAbGluayBJTlRFUk5BTF9IRUFERVJTfSByZW1vdmVkLCBhbmQgYHgtbmV4dGpzLWRhdGFgXG4gKiBwdXQgYmFjayBmb3IgYSBgX25leHQvZGF0YWAgcmVxdWVzdCwgd2hpY2ggaXMgd2hhdCBgbmV4dCBzdGFydGAnc1xuICogYHJlc29sdmVSb3V0ZXNgIGRvZXMgKGBzZXRJc05leHREYXRhUmVxdWVzdGApIHJpZ2h0IGFmdGVyIHN0cmlwcGluZyBpdDogdGhlXG4gKiBoZWFkZXIgaXMgaW50ZXJuYWwsIGJ1dCBOZXh0J3MgaGFuZGxlcnMgYW5kIG1pZGRsZXdhcmUgc3RpbGwgcmVhZCBpdCDigJQgaXQgaXNcbiAqIGhvdyBhIGRhdGEgcmVxdWVzdCBnZXRzIGB4LW5leHRqcy1tYXRjaGVkLXBhdGhgIOKAlCBzbyBhIHJlYWwgZGF0YSByZXF1ZXN0IGhhc1xuICogdG8ga2VlcCBpdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdpdGhvdXRJbnRlcm5hbEhlYWRlcnMoXG4gIGhlYWRlcnM6IEluY29taW5nSHR0cEhlYWRlcnMsXG4gIHRhcmdldDogc3RyaW5nLFxuICBiYXNlUGF0aDogc3RyaW5nLFxuKTogSW5jb21pbmdIdHRwSGVhZGVycyB7XG4gIGNvbnN0IGZpbHRlcmVkOiBJbmNvbWluZ0h0dHBIZWFkZXJzID0ge307XG4gIGZvciAoY29uc3QgW25hbWUsIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhoZWFkZXJzKSkge1xuICAgIGlmICghSU5URVJOQUxfSEVBREVSUy5oYXMobmFtZSkpIHtcbiAgICAgIGZpbHRlcmVkW25hbWVdID0gdmFsdWU7XG4gICAgfVxuICB9XG4gIGNvbnN0IHBhdGhuYW1lID0gd2l0aG91dFBhdGhQcmVmaXgodGFyZ2V0LnNwbGl0KFwiP1wiKVswXSwgYmFzZVBhdGgpO1xuICBpZiAocGF0aG5hbWUuc3RhcnRzV2l0aChcIi9fbmV4dC9kYXRhL1wiKSAmJiBwYXRobmFtZS5lbmRzV2l0aChcIi5qc29uXCIpKSB7XG4gICAgZmlsdGVyZWRbXCJ4LW5leHRqcy1kYXRhXCJdID0gXCIxXCI7XG4gIH1cbiAgcmV0dXJuIGZpbHRlcmVkO1xufVxuXG4vKiogRXZlcnkgcm91dGUgdG8gaW52YWxpZGF0ZSwgZWFjaCBvbmNlLCBpbiBvbmUgQ2xvdWRGcm9udCBpbnZhbGlkYXRpb24uICovXG50eXBlIFJldmFsaWRhdGVkUGFnZUhvb2sgPSAocm91dGVzOiByZWFkb25seSBzdHJpbmdbXSkgPT4gUHJvbWlzZTx2b2lkPjtcblxuLyoqXG4gKiBJbnZhbGlkYXRlIHRoZSBDRE4gY29waWVzIG9mIGEgcGFnZSBgcmVzLnJldmFsaWRhdGUoKWAganVzdCByZWdlbmVyYXRlZDogaXRzXG4gKiBIVE1MIGFuZCBSU0MgcGF5bG9hZCwgYW5kIGl0cyBQYWdlcyBSb3V0ZXIgYF9uZXh0L2RhdGFgIEpTT04uIFdpdGhvdXQgdGhpcyB0aGVcbiAqIGZyZXNoIGVudHJ5IHNhdCBiZWhpbmQgQ2xvdWRGcm9udCdzIGNvcHkgb2YgdGhlIG9sZCBvbmUgZm9yIHRoZSBwYWdlJ3Mgd2hvbGVcbiAqIGBzLW1heGFnZWAg4oCUIGEgeWVhciwgZm9yIGFuIG9uLWRlbWFuZC1vbmx5IElTUiBwYWdlLiBgcmV2YWxpZGF0ZVBhdGhgIGFuZFxuICogYHJldmFsaWRhdGVUYWdgIGdvIHRocm91Z2ggdGhlIGNhY2hlIGhhbmRsZXIncyBgcmV2YWxpZGF0ZVRhZ2AsIHdoaWNoIGFscmVhZHlcbiAqIGludmFsaWRhdGVzOyBgcmVzLnJldmFsaWRhdGUoKWAgZG9lcyBub3QgdG91Y2ggaXQuXG4gKlxuICogRXZlcnkgcm91dGUgaXMgd2l0aG91dCBgYmFzZVBhdGhgLCB3aGljaCB0aGUgaG9vayBwcmVmaXhlcy4gQSBuby1vcCBvdXRzaWRlXG4gKiB0aGUgR2xvYmFsIGNvbnN0cnVjdHMsIHdoZXJlIG5vIGhvb2sgaXMgcmVnaXN0ZXJlZC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gaW52YWxpZGF0ZVJldmFsaWRhdGVkUGFnZShcbiAgdXJsUGF0aDogc3RyaW5nLFxuICBtYW5pZmVzdDogQWRhcHRlck1hbmlmZXN0LFxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGhvb2sgPSAoZ2xvYmFsVGhpcyBhcyBSZWNvcmQ8c3ltYm9sLCB1bmtub3duPilbXG4gICAgUkVWQUxJREFURURfUEFHRV9IT09LXG4gIF0gYXMgUmV2YWxpZGF0ZWRQYWdlSG9vayB8IHVuZGVmaW5lZDtcbiAgaWYgKHR5cGVvZiBob29rICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgY29uc3Qgcm91dGUgPSB3aXRob3V0UGF0aFByZWZpeChcbiAgICB1cmxQYXRoLnNwbGl0KFwiP1wiKVswXSxcbiAgICBtYW5pZmVzdC5jb25maWcuYmFzZVBhdGgsXG4gICk7XG4gIHRyeSB7XG4gICAgLy8gT25lIGNhbGwsIGRlZHVwbGljYXRlZDogdGhlIGRlZmF1bHQgbG9jYWxlJ3MgdHdvIHBhaXJzIHNoYXJlIGEgZGF0YVxuICAgIC8vIHJvdXRlLCBhbmQgZWFjaCBpbnZhbGlkYXRpb24gcGF0aCBjb3VudHMgYWdhaW5zdCBDbG91ZEZyb250J3MgcXVvdGEuXG4gICAgYXdhaXQgaG9vayhbLi4ubmV3IFNldChyZXZhbGlkYXRlZFBhZ2VSb3V0ZXMocm91dGUsIG1hbmlmZXN0KS5mbGF0KCkpXSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgLy8gVGhlIHJlZ2VuZXJhdGlvbiBpdHNlbGYgc3VjY2VlZGVkOyB0aGUgZWRnZSBjYXRjaGVzIHVwIGF0IGBzLW1heGFnZWAuXG4gICAgY29uc29sZS53YXJuKGBDb3VsZCBub3QgaW52YWxpZGF0ZSB0aGUgQ0ROIGNvcHkgb2YgJHt1cmxQYXRofTpgLCBlcnJvcik7XG4gIH1cbn1cblxuLyoqXG4gKiBUaGUgYFtyb3V0ZSwgZGF0YVJvdXRlXWAgcGFpcnMgYSByZXZhbGlkYXRlZCBwYWdlIGlzIGNhY2hlZCB1bmRlciBhdCB0aGUgZWRnZS5cbiAqXG4gKiBJbiBhbiBpMThuIGFwcCB0aGUgTmV4dCBjbGllbnQgYWx3YXlzIHB1dHMgdGhlIGxvY2FsZSBpbiBhIGRhdGEgaHJlZiwgdGhlXG4gKiBkZWZhdWx0IGxvY2FsZSBpbmNsdWRlZCAoYC9fbmV4dC9kYXRhLzxpZD4vZW4vYmxvZy5qc29uYCwgYW5kIGDigKYvZW4uanNvbmAgZm9yXG4gKiB0aGUgcm9vdCksIHNvIHRoZSB1bnByZWZpeGVkIGRhdGEgcm91dGUgbmFtZXMgbm90aGluZyBDbG91ZEZyb250IGhvbGRzLiBUaGVcbiAqIHBhZ2UgaXMgb25lIGxvY2FsZSdzIOKAlCBgcmVzLnJldmFsaWRhdGUoXCIvYmxvZ1wiKWAgcmVnZW5lcmF0ZXMgdGhlIGRlZmF1bHRcbiAqIGxvY2FsZSdzLCBgXCIvZnIvYmxvZ1wiYCBGcmVuY2gg4oCUIGFuZCB0aGUgZGVmYXVsdCBsb2NhbGUncyBIVE1MIGlzIHJlYWNoYWJsZSxcbiAqIGFuZCBjYWNoZWQsIGJvdGggd2l0aCBhbmQgd2l0aG91dCBpdHMgcHJlZml4LCBzbyBpdHMgdHdvIHBhaXJzIHNoYXJlIGEgZGF0YVxuICogcm91dGUsIHdoaWNoIHRoZSBjYWxsZXIgc2VuZHMgb25jZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJldmFsaWRhdGVkUGFnZVJvdXRlcyhcbiAgcm91dGU6IHN0cmluZyxcbiAgbWFuaWZlc3Q6IFBpY2s8QWRhcHRlck1hbmlmZXN0LCBcImJ1aWxkSWRcIiB8IFwiY29uZmlnXCI+LFxuKTogQXJyYXk8W3N0cmluZywgc3RyaW5nXT4ge1xuICBjb25zdCBkYXRhUm91dGUgPSAocGFnZTogc3RyaW5nKSA9PlxuICAgIGAvX25leHQvZGF0YS8ke21hbmlmZXN0LmJ1aWxkSWR9JHtcbiAgICAgIHBhZ2UgPT09IFwiL1wiID8gXCIvaW5kZXhcIiA6IHBhZ2UucmVwbGFjZSgvXFwvKyQvLCBcIlwiKVxuICAgIH0uanNvbmA7XG4gIGNvbnN0IGkxOG4gPSBtYW5pZmVzdC5jb25maWcuaTE4biBhcyB7XG4gICAgcmVhZG9ubHkgbG9jYWxlcz86IHJlYWRvbmx5IHN0cmluZ1tdO1xuICAgIHJlYWRvbmx5IGRlZmF1bHRMb2NhbGU/OiBzdHJpbmc7XG4gIH0gfCBudWxsO1xuICBpZiAoIWkxOG4/LmRlZmF1bHRMb2NhbGUpIHtcbiAgICByZXR1cm4gW1tyb3V0ZSwgZGF0YVJvdXRlKHJvdXRlKV1dO1xuICB9XG4gIGNvbnN0IHsgZGVmYXVsdExvY2FsZSB9ID0gaTE4bjtcbiAgY29uc3Qgc2VnbWVudCA9IHJvdXRlLnNwbGl0KFwiL1wiKVsxXSA/PyBcIlwiO1xuICBjb25zdCBsb2NhbGUgPSAoaTE4bi5sb2NhbGVzID8/IFtdKS5pbmNsdWRlcyhzZWdtZW50KVxuICAgID8gc2VnbWVudFxuICAgIDogZGVmYXVsdExvY2FsZTtcbiAgY29uc3QgcGFnZSA9XG4gICAgbG9jYWxlID09PSBzZWdtZW50ID8gd2l0aG91dFBhdGhQcmVmaXgocm91dGUsIGAvJHtzZWdtZW50fWApIDogcm91dGU7XG4gIGNvbnN0IGxvY2FsaXplZCA9IHBhZ2UgPT09IFwiL1wiID8gYC8ke2xvY2FsZX1gIDogYC8ke2xvY2FsZX0ke3BhZ2V9YDtcbiAgLy8gVGhlIHJvb3QncyBkYXRhIHJvdXRlIGlzIHRoZSBsb2NhbGUgaXRzZWxmLCBub3QgYC88bG9jYWxlPi9pbmRleGAuXG4gIGNvbnN0IGxvY2FsaXplZERhdGEgPSBgL19uZXh0L2RhdGEvJHttYW5pZmVzdC5idWlsZElkfSR7bG9jYWxpemVkLnJlcGxhY2UoL1xcLyskLywgXCJcIil9Lmpzb25gO1xuICByZXR1cm4gbG9jYWxlID09PSBkZWZhdWx0TG9jYWxlXG4gICAgPyBbXG4gICAgICAgIFtwYWdlLCBsb2NhbGl6ZWREYXRhXSxcbiAgICAgICAgW2xvY2FsaXplZCwgbG9jYWxpemVkRGF0YV0sXG4gICAgICBdXG4gICAgOiBbW2xvY2FsaXplZCwgbG9jYWxpemVkRGF0YV1dO1xufVxuXG5mdW5jdGlvbiBhc0Vycm9yKGVycm9yOiB1bmtub3duKTogRXJyb3Ige1xuICByZXR1cm4gZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yIDogbmV3IEVycm9yKFN0cmluZyhlcnJvcikpO1xufVxuXG4vKipcbiAqIFJlYWQgdGhlIG1hbmlmZXN0IGFuZCBwaW4gdGhlIGxheW91dCBpdCBkZXNjcmliZXMuXG4gKlxuICogYHByb2Nlc3MuY3dkKClgIGlzIGxvYWQtYmVhcmluZyBhbmQgdGhlcmUgaXMgZXhhY3RseSBvbmUgY2hhbmNlIHRvIGdldCBpdFxuICogcmlnaHQ6IE5leHQuanMgaW5saW5lcyBgcmVsYXRpdmUoYnVpbGRDd2QsIHByb2plY3REaXIpYCBpbnRvIGV2ZXJ5IGVudHJ5cG9pbnRcbiAqIGFuZCByZXNvbHZlcyBpdCBhZ2FpbnN0IHRoZSAqcnVudGltZSogY3dkIHRvIGZpbmRcbiAqIGByZXF1aXJlZC1zZXJ2ZXItZmlsZXMuanNvbmAsIHRoZSBwcmVyZW5kZXIgbWFuaWZlc3QsIGFuZCB0aGUgYXBwJ3MgY2h1bmtzLlxuICogYGFzc2VydEJ1aWxkQ3dkYCBpbiBgYnVpbGQtb3V0cHV0cy50c2Aga2VlcHMgdGhhdCBpbmxpbmVkIHZhbHVlIGBcIlwiYCwgc28gdGhlXG4gKiB3aG9sZSBpbnZhcmlhbnQgcmVkdWNlcyB0byBcImN3ZCBpcyB0aGUgc3RhZ2VkIHByb2plY3QgZGlyXCIg4oCUIGFzc2VydGVkIHJhdGhlclxuICogdGhhbiBhc3N1bWVkLCBiZWNhdXNlIGdldHRpbmcgaXQgd3JvbmcgcHJvZHVjZXMgYVxuICogYENhbm5vdCBmaW5kIG1vZHVsZSDigKYvcmVxdWlyZWQtc2VydmVyLWZpbGVzLmpzb25gIGZyb20gaW5zaWRlIGNvbXBpbGVkIE5leHQuanNcbiAqIGNvZGUgd2l0aCBubyBpbmRpY2F0aW9uIHRoYXQgdGhlIGxheW91dCBpcyB0aGUgcHJvYmxlbS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxvYWRSdW50aW1lKFxuICBkZXBsb3ltZW50Um9vdDogc3RyaW5nLFxuKTogUHJvbWlzZTxOZXh0anNSdW50aW1lPiB7XG4gIGNvbnN0IG1hbmlmZXN0UGF0aCA9IGRlcGxveWVkTWFuaWZlc3RQYXRoKGRlcGxveW1lbnRSb290KTtcbiAgbGV0IG1hbmlmZXN0OiBBZGFwdGVyTWFuaWZlc3Q7XG4gIHRyeSB7XG4gICAgbWFuaWZlc3QgPSBKU09OLnBhcnNlKGF3YWl0IHJlYWRGaWxlKG1hbmlmZXN0UGF0aCwgXCJ1dGYtOFwiKSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYENvdWxkIG5vdCByZWFkIHRoZSBjZGstbmV4dGpzIGFkYXB0ZXIgbWFuaWZlc3QgYXQgXCIke21hbmlmZXN0UGF0aH1cIi4gYCArXG4gICAgICAgIGBUaGUgZGVwbG95bWVudCBwYWNrYWdlIGlzIGluY29tcGxldGU6IHN5bnRoIGNvcGllcyBgICtcbiAgICAgICAgYCR7TUFOSUZFU1RfRklMRV9OQU1FfSBpbiBuZXh0IHRvIHRoZSBidW5kbGVkIHJ1bnRpbWUuYCxcbiAgICAgIHsgY2F1c2U6IGVycm9yIH0sXG4gICAgKTtcbiAgfVxuXG4gIGNvbnN0IHByb2plY3REaXIgPSBqb2luKGRlcGxveW1lbnRSb290LCBtYW5pZmVzdC5yZWxhdGl2ZVByb2plY3REaXIpO1xuICBjb25zdCBwcm9iZSA9IGpvaW4oXG4gICAgcHJvamVjdERpcixcbiAgICBtYW5pZmVzdC5jb25maWcuZGlzdERpcixcbiAgICBcInJlcXVpcmVkLXNlcnZlci1maWxlcy5qc29uXCIsXG4gICk7XG4gIHRyeSB7XG4gICAgYXdhaXQgcmVhZEZpbGUocHJvYmUpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBUaGUgZGVwbG95bWVudCByb290IFwiJHtkZXBsb3ltZW50Um9vdH1cIiBkb2VzIG5vdCBjb250YWluIHRoZSBzdGFnZWQgYCArXG4gICAgICAgIGBOZXh0LmpzIHByb2plY3Q6IGV4cGVjdGVkIFwiJHtwcm9iZX1cIiB0byBleGlzdC4gRXZlcnkgYnVpbHQgZW50cnlwb2ludCBgICtcbiAgICAgICAgYHJlc29sdmVzIGl0cyBvd24gcGF0aHMgYWdhaW5zdCBwcm9jZXNzLmN3ZCgpLCBzbyB0aGlzIGxheW91dCBpcyBwYXJ0IGAgK1xuICAgICAgICBgb2YgdGhlIGNvbnRyYWN0LCBub3QgYSBjb252ZW5pZW5jZS5gLFxuICAgICAgeyBjYXVzZTogZXJyb3IgfSxcbiAgICApO1xuICB9XG4gIC8vIGBuZXh0IHN0YXJ0YCBmb3JjZXMgdGhpcywgYW5kIGV4dGVybmFsaXplZCBwYWNrYWdlcyAoUmVhY3QgZm9yIFBhZ2VzIFJvdXRlclxuICAvLyBTU1IsIGFueXRoaW5nIGluIGBzZXJ2ZXJFeHRlcm5hbFBhY2thZ2VzYCkgcGljayB0aGVpciBkZXYgb3IgcHJvZCBidWlsZCBmcm9tXG4gIC8vIGl0IGF0IHJlcXVpcmUgdGltZS4gVGhlIENvbnRhaW5lcnMgRG9ja2VyZmlsZXMgc2V0IGl0IGFuZCB0aGUgRnVuY3Rpb25zXG4gIC8vIGNvbnN0cnVjdHMgZG8gdG9vOyB0aGlzIGNvdmVycyBhIGhhbmQtd2lyZWQgZnVuY3Rpb24uIEJlZm9yZSBhbnkgYHJlcXVpcmVgLlxuICAvLyAoYG5leHRgJ3MgdHlwaW5ncyBkZWNsYXJlIE5PREVfRU5WIHJlYWQtb25seS4pXG4gIChwcm9jZXNzLmVudiBhcyBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+KS5OT0RFX0VOViA/Pz0gXCJwcm9kdWN0aW9uXCI7XG4gIHByb2Nlc3MuY2hkaXIocHJvamVjdERpcik7XG4gIC8vIEJlZm9yZSBhbnl0aGluZyBjYW4gc2VydmUgYSByZXF1ZXN0OiB0aGUgcnVudGltZSdzIG93biBgbmV4dGAgaW1wb3J0cyByZXNvbHZlXG4gIC8vIG91dCBvZiB0aGUgc3RhZ2VkIGFwcCwgbm90IG91dCBvZiB0aGUgc2hlbGwncyBkaXJlY3RvcnkuIFNlZSBgbmV4dC1tb2R1bGVzLnRzYC5cbiAgdXNlTmV4dEZyb20ocHJvamVjdERpcik7XG4gIC8vIEJlZm9yZSBhbnkgZW50cnlwb2ludCBjYW4gcmVhZCB0aGVtIGF0IG1vZHVsZSBzY29wZS5cbiAgbG9hZEVudkZpbGVzKHByb2plY3REaXIpO1xuICAvLyBUaGVuLCBiZWZvcmUgYW55IGVudHJ5cG9pbnQgKG9yIG1pZGRsZXdhcmUpIGNhbiBiZSBsb2FkZWQ6IE5leHQncyBvd25cbiAgLy8gbm9kZS1lbnZpcm9ubWVudCBib290c3RyYXAuIFNlZSBgc2V0dXBOb2RlRW52aXJvbm1lbnRgLlxuICBzZXR1cE5vZGVFbnZpcm9ubWVudCgpO1xuXG4gIHJldHVybiBuZXcgTmV4dGpzUnVudGltZSh7XG4gICAgZGVwbG95bWVudFJvb3QsXG4gICAgbWFuaWZlc3QsXG4gICAgYnVja2V0OiBwcm9jZXNzLmVudi5DREtfTkVYVEpTX1NUQVRJQ19BU1NFVFNfQlVDS0VUX05BTUUsXG4gICAgYnVja2V0S2V5UHJlZml4OiBwcm9jZXNzLmVudi5DREtfTkVYVEpTX1NUQVRJQ19BU1NFVFNfS0VZX1BSRUZJWCxcbiAgfSk7XG59XG5cbi8qKlxuICogQSBzeW50YWN0aWNhbGx5IHZhbGlkIGBob3N0Wzpwb3J0XWA6IGEgcmVnaXN0ZXJlZCBuYW1lIG9yIGEgYnJhY2tldGVkIElQdjZcbiAqIGxpdGVyYWwsIG9wdGlvbmFsbHkgd2l0aCBhIHBvcnQuIEFueXRoaW5nIGVsc2UgY2Fubm90IGJlIHRoZSBhdXRob3JpdHkgb2YgYVxuICogVVJMLlxuICovXG5jb25zdCBIT1NUX0FVVEhPUklUWSA9IC9eKD86XFxbWzAtOUEtRmEtZjouXStcXF18WzAtOUEtWmEtei5fLV0rKSg/OjpcXGR7MSw1fSk/JC87XG5cbi8qKlxuICogVGhlIGZpcnN0IHZhbHVlIHRoYXQgaXMgYWN0dWFsbHkgdXNhYmxlIGFzIGFuIGF1dGhvcml0eSwgb3IgYHVuZGVmaW5lZGAuXG4gKlxuICogYHgtZm9yd2FyZGVkLWhvc3RgIGNhbiBhcnJpdmUgYXMgYSBsaXN0IHdoZW4gbW9yZSB0aGFuIG9uZSBwcm94eSBhcHBlbmRzIHRvXG4gKiBpdC4gVmFsaWRhdGluZyBpcyB3aGF0IGtlZXBzIGEgbWFsZm9ybWVkIHZhbHVlIGZyb20gbWFraW5nIHRoZSBgVVJMYFxuICogY29uc3RydWN0b3IgdGhyb3cg4oCUIHdoaWNoIG9uIHRoZSBMYW1iZGEgc2hlbGxzIGlzIGFuIGludm9jYXRpb24gZXJyb3IgYW5kIGFcbiAqIDUwMiwgbm90IGEgcmVzcG9uc2UuXG4gKi9cbmZ1bmN0aW9uIHZhbGlkQXV0aG9yaXR5KFxuICB2YWx1ZTogc3RyaW5nIHwgc3RyaW5nW10gfCB1bmRlZmluZWQsXG4pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCBjYW5kaWRhdGUgPSBmaXJzdFZhbHVlKHZhbHVlKT8uc3BsaXQoXCIsXCIpWzBdLnRyaW0oKTtcbiAgcmV0dXJuIGNhbmRpZGF0ZSAmJiBIT1NUX0FVVEhPUklUWS50ZXN0KGNhbmRpZGF0ZSkgPyBjYW5kaWRhdGUgOiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogYHJlc29sdmVSb3V0ZXNgIG5lZWRzIGFuIGFic29sdXRlIFVSTCwgYW5kIGl0IGJlY29tZXMgdGhlIG9yaWdpbiBldmVyeVxuICogYWJzb2x1dGUgVVJMIHRoZSBhcHAgYnVpbGRzIHN0YXJ0cyB3aXRoIOKAlCBgcmVxLm5leHRVcmwub3JpZ2luYCBpbiBtaWRkbGV3YXJlLFxuICogYGluaXRVUkxgIGZvciBhIHJvdXRlIGhhbmRsZXIg4oCUIHNvIGl0cyBob3N0IGhhcyB0byBiZSBvbmUgdGhlIGNsaWVudCBjYW5ub3RcbiAqIHBpY2suXG4gKlxuICogVGhhdCBpcyBgSG9zdGAgb24gZXZlcnkgZGVwbG95bWVudCBidXQgb25lOiBDbG91ZEZyb250IGZvcndhcmRzIHRoZSB2aWV3ZXInc1xuICogYEhvc3RgIHRvIGEgY29udGFpbmVyIG9yaWdpbiAoYEFMTF9WSUVXRVJgKSwgYW4gQUxCIHBhc3NlcyBpdCB0aHJvdWdoLCBhbmQgQVBJXG4gKiBHYXRld2F5IHNldHMgaXRzIG93biBkb21haW4uIFRoZSBleGNlcHRpb24gaXMgYSBMYW1iZGEgRnVuY3Rpb24gVVJMLCB3aGVyZVxuICogQ2xvdWRGcm9udCBoYXMgdG8gc2VuZCB0aGUgVVJMJ3Mgb3duIGRvbWFpbiBhcyBgSG9zdGAgYW5kIHB1dHMgdGhlIHZpZXdlcidzIGluXG4gKiBgeC1mb3J3YXJkZWQtaG9zdGA7IHNlZSB7QGxpbmsgUnVudGltZVJlcXVlc3QudHJ1c3RGb3J3YXJkZWRIb3N0fS4gQW55d2hlcmVcbiAqIGVsc2UgdGhlIGhlYWRlciBpcyB0aGUgY2xpZW50J3MsIGFuZCBob25vcmluZyBpdCBsZXQgYSByZXF1ZXN0IHdpdGhcbiAqIGBYLUZvcndhcmRlZC1Ib3N0OiBldmlsLmV4YW1wbGVgIHBvaW50IGEgcGFzc3dvcmQtcmVzZXQgbGluayBhdCBldmlsLmV4YW1wbGUg4oCUXG4gKiBhbmQsIG9uIEdsb2JhbCBDb250YWluZXJzLCBoYXZlIENsb3VkRnJvbnQgY2FjaGUgdGhhdCBwYWdlLCBzaW5jZSB0aGUgaGVhZGVyXG4gKiBpcyBub3QgaW4gaXRzIGNhY2hlIGtleS5cbiAqL1xuZnVuY3Rpb24gYWJzb2x1dGVVcmwocmVxdWVzdDogUnVudGltZVJlcXVlc3QpOiBVUkwge1xuICBjb25zdCBob3N0ID1cbiAgICAocmVxdWVzdC50cnVzdEZvcndhcmRlZEhvc3RcbiAgICAgID8gdmFsaWRBdXRob3JpdHkocmVxdWVzdC5oZWFkZXJzW1wieC1mb3J3YXJkZWQtaG9zdFwiXSlcbiAgICAgIDogdW5kZWZpbmVkKSA/P1xuICAgIHZhbGlkQXV0aG9yaXR5KHJlcXVlc3QuaGVhZGVycy5ob3N0KSA/P1xuICAgIFwibG9jYWxob3N0XCI7XG4gIC8vIEJlaGluZCBDbG91ZEZyb250IG9uIEdsb2JhbCBDb250YWluZXJzIHRoZSBjb250YWluZXIgc2hlbGwgaGFzIGFscmVhZHkgcHV0XG4gIC8vIHRoZSB2aWV3ZXIncyBwcm90b2NvbCBoZXJlOyBzZWUgYHRydXN0Q2xvdWRGcm9udFByb3RvYCBpbiBodHRwL25vZGUtc2VydmVyLnRzLlxuICBjb25zdCBmb3J3YXJkZWRQcm90byA9IGZpcnN0VmFsdWUocmVxdWVzdC5oZWFkZXJzW1wieC1mb3J3YXJkZWQtcHJvdG9cIl0pXG4gICAgPy5zcGxpdChcIixcIilbMF1cbiAgICAudHJpbSgpXG4gICAgLnRvTG93ZXJDYXNlKCk7XG4gIC8vIENsaWVudC1zdXBwbGllZCB3aGVyZSBubyBwcm94eSBvdmVyd3JpdGVzIGl0LCBidXQgaGFybWxlc3M6IHRoZSBob3N0IGlzXG4gIC8vIGFscmVhZHkgZml4ZWQsIGFuZCBhbnl0aGluZyBidXQgdGhlc2UgdHdvIHdvdWxkIG5vdCBwYXJzZS5cbiAgY29uc3QgcHJvdG8gPVxuICAgIGZvcndhcmRlZFByb3RvID09PSBcImh0dHBcIiB8fCBmb3J3YXJkZWRQcm90byA9PT0gXCJodHRwc1wiXG4gICAgICA/IGZvcndhcmRlZFByb3RvXG4gICAgICA6IHJlcXVlc3QuZW5jcnlwdGVkID09PSBmYWxzZVxuICAgICAgICA/IFwiaHR0cFwiXG4gICAgICAgIDogXCJodHRwc1wiO1xuICByZXR1cm4gbmV3IFVSTChyZXF1ZXN0LnVybCwgYCR7cHJvdG99Oi8vJHtob3N0fWApO1xufVxuXG5mdW5jdGlvbiBwaWNrRGVmaW5lZChcbiAgaGVhZGVyczogSW5jb21pbmdIdHRwSGVhZGVycyxcbiAgbmFtZXM6IHJlYWRvbmx5IHN0cmluZ1tdLFxuKTogSW5jb21pbmdIdHRwSGVhZGVycyB7XG4gIGNvbnN0IHBpY2tlZDogSW5jb21pbmdIdHRwSGVhZGVycyA9IHt9O1xuICBmb3IgKGNvbnN0IG5hbWUgb2YgbmFtZXMpIHtcbiAgICBpZiAoaGVhZGVyc1tuYW1lXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBwaWNrZWRbbmFtZV0gPSBoZWFkZXJzW25hbWVdO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcGlja2VkO1xufVxuXG4vKipcbiAqIGBub3JtYWxpemVSZXBlYXRlZFNsYXNoZXNgIChgbmV4dC9kaXN0L3NoYXJlZC9saWIvdXRpbHMuanNgKSwgYXBwbGllZCB3aGVyZVxuICogTmV4dC5qcyBhcHBsaWVzIGl0OiBiZWZvcmUgcm91dGluZywgYXMgYSAzMDggdG8gdGhlIGNvbGxhcHNlZCBwYXRoLlxuICogYGJhc2Utc2VydmVyLnRzYCBkb2VzIGBpZiAodXJsTm9RdWVyeT8ubWF0Y2goLyhcXFxcfFxcL1xcLykvKSlcbiAqIHJlcy5yZWRpcmVjdChub3JtYWxpemVSZXBlYXRlZFNsYXNoZXMocmVxLnVybCksIDMwOClgLCBzbyBgL2EvL2JgIGFuZCBgL2FcXGJgXG4gKiBib3RoIGFuc3dlciBhIHJlZGlyZWN0IHRvIGAvYS9iYCByYXRoZXIgdGhhbiBhIDQwNCAtIGFuZCBgQG5leHQvcm91dGluZ2Anc1xuICogYHJlc29sdmVSb3V0ZXNgIGRvZXMgbm90IGRvIGl0IGZvciB1cywgd2hpY2ggaXMgaG93IGAvL2AgcmVhY2hlZCB0aGlzIHJ1bnRpbWUgYXNcbiAqIGEgNTAwIGFuZCBgL2FwaS8vanNvbmAgYXMgYSA0MDQuXG4gKlxuICogRW5jb2RlZCBiYWNrc2xhc2hlcyBhcmUgbGVmdCBhbG9uZSwgYXMgTmV4dC5qcyBsZWF2ZXMgdGhlbTogYCU1Q2AgaXMgYSBsaXRlcmFsXG4gKiBjaGFyYWN0ZXIgaW4gYSBwYXRoIHNlZ21lbnQsIG5vdCBhIHNlcGFyYXRvci5cbiAqXG4gKiBSZXR1cm5zIGB1bmRlZmluZWRgIHdoZW4gdGhlcmUgaXMgbm90aGluZyB0byBjb2xsYXBzZSwgd2hpY2ggaXMgdGhlIGNvbW1vbiBjYXNlLlxuICovXG5mdW5jdGlvbiBjb2xsYXBzZVJlcGVhdGVkU2xhc2hlcyh0YXJnZXQ6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHBhcnRzID0gdGFyZ2V0LnNwbGl0KFwiP1wiKTtcbiAgY29uc3QgcGF0aG5hbWUgPSBwYXJ0c1swXTtcbiAgaWYgKCEvXFxcXHxcXC9cXC8vLnRlc3QocGF0aG5hbWUpKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICBjb25zdCBxdWVyeSA9IHBhcnRzLmxlbmd0aCA+IDEgPyBgPyR7cGFydHMuc2xpY2UoMSkuam9pbihcIj9cIil9YCA6IFwiXCI7XG4gIHJldHVybiBwYXRobmFtZS5yZXBsYWNlKC9cXFxcL2csIFwiL1wiKS5yZXBsYWNlKC9cXC9cXC8rL2csIFwiL1wiKSArIHF1ZXJ5O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNwbGl0Qm9keSB7XG4gIC8qKiBXaGF0IGByZXFgIHJlYWRzOiB0aGUgZW50cnlwb2ludCdzIGNvcHkuICovXG4gIHJlYWRvbmx5IGZvclJlcXVlc3Q/OiBSZWFkYWJsZSB8IEJ1ZmZlcjtcbiAgLyoqIFdoYXQgYHJlc29sdmVSb3V0ZXNgIGhhbmRzIG1pZGRsZXdhcmUuICovXG4gIHJlYWRvbmx5IGZvckRpc3BhdGNoOiBSZWFkYWJsZVN0cmVhbTtcbiAgLyoqXG4gICAqIENhbGxlZCBvbmNlIGRpc3BhdGNoIGhhcyByZXR1cm5lZCwgd2l0aCB3aGV0aGVyIG1pZGRsZXdhcmUgYW5zd2VyZWQgdGhlXG4gICAqIHJlcXVlc3QgaXRzZWxmLiBMZXRzIGdvIG9mIHdoaWNoZXZlciBjb3B5IG5vdGhpbmcgd2lsbCByZWFkIGFueSBtb3JlLlxuICAgKi9cbiAgcmVsZWFzZVVucmVhZChtaWRkbGV3YXJlUmVzcG9uZGVkOiBib29sZWFuKTogdm9pZDtcbn1cblxuLyoqXG4gKiBgcmVzb2x2ZVJvdXRlc2AgaGFuZHMgYHJlcXVlc3RCb2R5YCB0byBtaWRkbGV3YXJlLCB3aGljaCBjb25zdW1lcyBpdCwgd2hpbGUgdGhlXG4gKiBlbnRyeXBvaW50IG5lZWRzIHRoZSBzYW1lIGJ5dGVzIOKAlCB0aGUgc2FtZSBwcm9ibGVtIGBuZXh0LXNlcnZlcmAgc29sdmVzIHdpdGhcbiAqIGBnZXRDbG9uZWFibGVCb2R5KClgLiBPbmx5IHNwbGl0IHdoZW4gdGhlcmUgaXMgbWlkZGxld2FyZSB0byBmZWVkOiB0ZWVpbmcgY29zdHNcbiAqIGEgYnVmZmVyIGNvcHkgb2YgZXZlcnkgdXBsb2FkIG9uIGEgcGF0aCB0aGF0IHdvdWxkIG90aGVyd2lzZSBiZSBhIHN0cmFpZ2h0IHBpcGUuXG4gKlxuICogQSBgdGVlKClgIGJ1ZmZlcnMsIGZvciB0aGUgYnJhbmNoIHRoYXQgaXMgYmVoaW5kLCBldmVyeSBjaHVuayB0aGUgb3RoZXIgb25lXG4gKiBoYXMgcmVhZCDigJQgc28gYSBicmFuY2ggdGhhdCBpcyBuZXZlciByZWFkIGhvbGRzIHRoZSB3aG9sZSBib2R5LiBNaWRkbGV3YXJlXG4gKiB0aGF0IGRvZXNuJ3QgcmVhZCB0aGUgYm9keSBpcyB0aGUgY29tbW9uIGNhc2UgKGFuZCBpdHMgbWF0Y2hlciBtYXkgbm90IGV2ZW5cbiAqIGhhdmUgcnVuIGl0KSwgYWZ0ZXIgd2hpY2ggdGhlIGVudHJ5cG9pbnQgc3RyZWFtaW5nIGFuIHVwbG9hZCB3b3VsZCBwaWxlIGFsbFxuICogb2YgaXQgdXAgaW4gdGhlIG1pZGRsZXdhcmUgYnJhbmNoOiB0aGUgd2hvbGUgdXBsb2FkIGluIG1lbW9yeSwgb24gYVxuICogY29udGFpbmVyIHRoYXQgc2VydmVzIG90aGVyIHJlcXVlc3RzLiBTbyBvbmNlIGRpc3BhdGNoIHJldHVybnMsIHRoZSBicmFuY2hcbiAqIHdpdGggbm8gcmVhZGVyIGxlZnQgaXMgY2FuY2VsbGVkIOKAlCB0aGUgbWlkZGxld2FyZSBvbmUsIG9yIHRoZSBlbnRyeXBvaW50IG9uZVxuICogd2hlbiBtaWRkbGV3YXJlIGFuc3dlcmVkIGFuZCBgcmVxYCB3aWxsIG5ldmVyIGJlIHJlYWQuIENhbmNlbGxpbmcgb25lXG4gKiBicmFuY2ggbGVhdmVzIHRoZSBzb3VyY2UgYW5kIHRoZSBvdGhlciBicmFuY2ggcnVubmluZy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNwbGl0Qm9keShcbiAgYm9keTogUmVhZGFibGUgfCBCdWZmZXIgfCB1bmRlZmluZWQsXG4gIGhhc01pZGRsZXdhcmU6IGJvb2xlYW4sXG4pOiBTcGxpdEJvZHkge1xuICBjb25zdCByZWxlYXNlTm90aGluZyA9ICgpOiB2b2lkID0+IHt9O1xuICBpZiAoYm9keSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGZvckRpc3BhdGNoOiBuZXcgQmxvYihbXSkuc3RyZWFtKCksXG4gICAgICByZWxlYXNlVW5yZWFkOiByZWxlYXNlTm90aGluZyxcbiAgICB9O1xuICB9XG4gIGlmICghaGFzTWlkZGxld2FyZSkge1xuICAgIHJldHVybiB7XG4gICAgICBmb3JSZXF1ZXN0OiBib2R5LFxuICAgICAgZm9yRGlzcGF0Y2g6IG5ldyBCbG9iKFtdKS5zdHJlYW0oKSxcbiAgICAgIHJlbGVhc2VVbnJlYWQ6IHJlbGVhc2VOb3RoaW5nLFxuICAgIH07XG4gIH1cbiAgaWYgKEJ1ZmZlci5pc0J1ZmZlcihib2R5KSkge1xuICAgIC8vIEFscmVhZHkgZnVsbHkgaW4gbWVtb3J5LCBzbyBcInRlZWluZ1wiIGlzIGp1c3QgcmVhZGluZyBpdCB0d2ljZS5cbiAgICByZXR1cm4ge1xuICAgICAgZm9yUmVxdWVzdDogYm9keSxcbiAgICAgIGZvckRpc3BhdGNoOiBuZXcgQmxvYihbYm9keV0pLnN0cmVhbSgpLFxuICAgICAgcmVsZWFzZVVucmVhZDogcmVsZWFzZU5vdGhpbmcsXG4gICAgfTtcbiAgfVxuICBjb25zdCBbZm9yTWlkZGxld2FyZSwgZm9yRW50cnlwb2ludF0gPSBSZWFkYWJsZS50b1dlYihib2R5KS50ZWUoKTtcbiAgY29uc3QgZm9yUmVxdWVzdCA9IFJlYWRhYmxlLmZyb21XZWIoZm9yRW50cnlwb2ludCBhcyBuZXZlcik7XG4gIHJldHVybiB7XG4gICAgZm9yUmVxdWVzdCxcbiAgICBmb3JEaXNwYXRjaDogZm9yTWlkZGxld2FyZSBhcyBSZWFkYWJsZVN0cmVhbSxcbiAgICByZWxlYXNlVW5yZWFkKG1pZGRsZXdhcmVSZXNwb25kZWQpIHtcbiAgICAgIGlmIChtaWRkbGV3YXJlUmVzcG9uZGVkKSB7XG4gICAgICAgIC8vIGBmcm9tV2ViYCBob2xkcyB0aGUgYnJhbmNoJ3MgcmVhZGVyLCBzbyBpdCBpcyBkZXN0cm95ZWQgcmF0aGVyIHRoYW5cbiAgICAgICAgLy8gY2FuY2VsbGVkOyBpdHMgYF9kZXN0cm95YCBjYW5jZWxzIHRoZSByZWFkZXIuXG4gICAgICAgIGZvclJlcXVlc3QuZGVzdHJveSgpO1xuICAgICAgfSBlbHNlIGlmICghZm9yTWlkZGxld2FyZS5sb2NrZWQpIHtcbiAgICAgICAgLy8gTG9ja2VkIG1lYW5zIG1pZGRsZXdhcmUgdG9vayBhIHJlYWRlcjogaXQgaXMgcmVhZGluZywgb3IgaGFzIHJlYWQsXG4gICAgICAgIC8vIHRoZSBib2R5IGl0c2VsZiwgYW5kIGEgbG9ja2VkIHN0cmVhbSBjYW5ub3QgYmUgY2FuY2VsbGVkIGFueXdheS5cbiAgICAgICAgZm9yTWlkZGxld2FyZS5jYW5jZWwoKS5jYXRjaCgoKSA9PiB7fSk7XG4gICAgICB9XG4gICAgfSxcbiAgfTtcbn1cblxuLyoqIGBJbmNvbWluZ0h0dHBIZWFkZXJzYCDihpIgdGhlIGZsYXQgZW50cmllcyBhIGBIZWFkZXJzYCBjb25zdHJ1Y3RvciBhY2NlcHRzLiAqL1xuZnVuY3Rpb24gdG9XZWJIZWFkZXJzKGhlYWRlcnM6IEluY29taW5nSHR0cEhlYWRlcnMpOiBBcnJheTxbc3RyaW5nLCBzdHJpbmddPiB7XG4gIGNvbnN0IGVudHJpZXM6IEFycmF5PFtzdHJpbmcsIHN0cmluZ10+ID0gW107XG4gIGZvciAoY29uc3QgW25hbWUsIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhoZWFkZXJzKSkge1xuICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBzaW5nbGUgb2YgQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZSA6IFt2YWx1ZV0pIHtcbiAgICAgIGVudHJpZXMucHVzaChbbmFtZSwgc2luZ2xlXSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBlbnRyaWVzO1xufVxuXG4vKipcbiAqIGBoZWFkZXJzKClgIHJ1bGVzLCB0aGUgaW1tdXRhYmxlIGBjYWNoZS1jb250cm9sYCBmb3IgYnVpbGQgYXNzZXRzLCBhbmQgYW55dGhpbmdcbiAqIG1pZGRsZXdhcmUgc2V0IHdpdGggYE5leHRSZXNwb25zZS5uZXh0KHsgaGVhZGVycyB9KWAuIEFwcGxpZWQgYmVmb3JlIHRoZVxuICogZW50cnlwb2ludCBydW5zIHNvIHRoYXQgYSByb3V0ZSBjYW4gc3RpbGwgb3ZlcnJpZGUgaXRzIG93bi5cbiAqL1xuZnVuY3Rpb24gYXBwbHlIZWFkZXJzKHJlczogU2hpbVNlcnZlclJlc3BvbnNlLCBoZWFkZXJzOiBIZWFkZXJzKTogdm9pZCB7XG4gIGZvciAoY29uc3QgW25hbWUsIHZhbHVlXSBvZiBoZWFkZXJzLmVudHJpZXMoKSkge1xuICAgIC8vIGBlbnRyaWVzKClgIHlpZWxkcyBgc2V0LWNvb2tpZWAgb25jZSBwZXIgY29va2llLCBzbyBhcHBlbmRpbmcgdGhlIHdob2xlXG4gICAgLy8gYGdldFNldENvb2tpZSgpYCBhcnJheSBoZXJlIHdvdWxkIGVtaXQgTsKyIG9mIHRoZW0g4oCUIHR3byBjb29raWVzIHNldCBieVxuICAgIC8vIG1pZGRsZXdhcmUgYXJyaXZlZCBhcyBbXCJhPTFcIixcImI9MlwiLFwiYT0xXCIsXCJiPTJcIl0uIEhhbmRsZWQgb25jZSwgb3V0c2lkZS5cbiAgICBpZiAobmFtZSA9PT0gXCJzZXQtY29va2llXCIpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICByZXMuc2V0SGVhZGVyKG5hbWUsIHZhbHVlKTtcbiAgfVxuICBmb3IgKGNvbnN0IGNvb2tpZSBvZiBoZWFkZXJzLmdldFNldENvb2tpZSgpKSB7XG4gICAgcmVzLmFwcGVuZEhlYWRlcihcInNldC1jb29raWVcIiwgY29va2llKTtcbiAgfVxufVxuXG4vKipcbiAqIE1pcnJvcnMgTmV4dC5qcydzIG93biByZWRpcmVjdCByZXNwb25zZSAoYGJhc2Utc2VydmVyLnRzYCk6IHRoZSBkZXN0aW5hdGlvbiBpc1xuICogYWxzbyB0aGUgYm9keSwgYW5kIGEgMzA4IGNhcnJpZXMgYSBgUmVmcmVzaGAgaGVhZGVyIGJlY2F1c2Ugc29tZSBjbGllbnRzIGFuZFxuICogaW50ZXJtZWRpYXJpZXMgc3RpbGwgZG8gbm90IGltcGxlbWVudCAzMDguXG4gKi9cbmZ1bmN0aW9uIHNlbmRSZWRpcmVjdChcbiAgcmVzOiBTaGltU2VydmVyUmVzcG9uc2UsXG4gIGxvY2F0aW9uOiBzdHJpbmcsXG4gIHN0YXR1czogbnVtYmVyLFxuKTogdm9pZCB7XG4gIHJlcy5zdGF0dXNDb2RlID0gc3RhdHVzO1xuICByZXMuc2V0SGVhZGVyKFwiTG9jYXRpb25cIiwgbG9jYXRpb24pO1xuICBpZiAoc3RhdHVzID09PSAzMDgpIHtcbiAgICByZXMuc2V0SGVhZGVyKFwiUmVmcmVzaFwiLCBgMDt1cmw9JHtsb2NhdGlvbn1gKTtcbiAgfVxuICByZXMuc2V0SGVhZGVyKFwiQ29udGVudC1UeXBlXCIsIFwidGV4dC9wbGFpbjsgY2hhcnNldD11dGYtOFwiKTtcbiAgcmVzLmVuZChsb2NhdGlvbik7XG59XG5cbi8qKlxuICogYG5leHQgc3RhcnRgJ3MgYW5zd2VyIHRvIGEgUE9TVCwgUFVUIG9yIERFTEVURSBmb3IgYSBzdGF0aWMgZmlsZTogNDA1IHdpdGhcbiAqIGBBbGxvdzogR0VULCBIRUFEYCAoYHJvdXRlci1zZXJ2ZXIuanNgKS4gSXQgcmVuZGVycyB0aGF0IHRocm91Z2ggYC9fZXJyb3JgO1xuICogdGhpcyBpcyB0aGUgcGxhaW4tdGV4dCBlcXVpdmFsZW50LCBzaW5jZSB0aGUgc3RhdHVzIGFuZCBgQWxsb3dgIGFyZSB3aGF0IGFcbiAqIGNsaWVudCBhY3RzIG9uLlxuICovXG5mdW5jdGlvbiBzZW5kTWV0aG9kTm90QWxsb3dlZChyZXM6IFNoaW1TZXJ2ZXJSZXNwb25zZSk6IHZvaWQge1xuICByZXMuc3RhdHVzQ29kZSA9IDQwNTtcbiAgcmVzLnNldEhlYWRlcihcIkFsbG93XCIsIFwiR0VULCBIRUFEXCIpO1xuICByZXMuc2V0SGVhZGVyKFwiQ29udGVudC1UeXBlXCIsIFwidGV4dC9wbGFpbjsgY2hhcnNldD11dGYtOFwiKTtcbiAgcmVzLmVuZChcIk1ldGhvZCBOb3QgQWxsb3dlZFwiKTtcbn1cblxuLyoqXG4gKiBSZXF1ZXN0IGhlYWRlcnMge0BsaW5rIHByb3h5RXh0ZXJuYWx9IGRvZXMgbm90IGZvcndhcmQuIFRoZSB1cHN0cmVhbSdzIG93blxuICogYEhvc3RgIG11c3Qgd2luOyB0aGUgcmVzdCBkZXNjcmliZSBvdXIgY29ubmVjdGlvbiwgbm90IHRoZSBwcm94aWVkIG9uZSwgYW5kXG4gKiB1bmRpY2kgdGhyb3dzIG9uIG1vc3Qgb2YgdGhlbSwgd2hpY2ggd291bGQgYW5zd2VyIHRoZSByZXF1ZXN0IHdpdGggYSA1MDAuXG4gKiBOZXh0LmpzJ3MgbGlzdCBmb3IgdGhlIHJlcXVlc3RzIGl0IG1ha2VzIHdpdGggdW5kaWNpIChgaXBjRm9yYmlkZGVuSGVhZGVyc2AsXG4gKiBgbmV4dC9kaXN0L3NlcnZlci9saWIvc2VydmVyLWlwYy91dGlscy5qc2ApLCBwbHVzIGBob3N0YCBhbmQgYHVwZ3JhZGVgLCBtaW51c1xuICogYGNvbnRlbnQtZW5jb2RpbmdgOiBOZXh0IHN0cmlwcyB0aGF0IG92ZXIgYSBib2R5IGl0IGhhcyBhbHJlYWR5IGRlY29kZWQsIHdoaWxlXG4gKiB0aGlzIG9uZSBpcyBmb3J3YXJkZWQgYXMgcmVjZWl2ZWQsIHN0aWxsIGVuY29kZWQuXG4gKi9cbmNvbnN0IFBST1hZX0RST1BQRURfSEVBREVSUzogcmVhZG9ubHkgc3RyaW5nW10gPSBbXG4gIFwiaG9zdFwiLFxuICBcInVwZ3JhZGVcIixcbiAgXCJhY2NlcHQtZW5jb2RpbmdcIixcbiAgXCJrZWVwYWxpdmVcIixcbiAgXCJrZWVwLWFsaXZlXCIsXG4gIFwidHJhbnNmZXItZW5jb2RpbmdcIixcbiAgXCJjb25uZWN0aW9uXCIsXG4gIFwiZXhwZWN0XCIsXG5dO1xuXG4vKipcbiAqIFRoZSBTaWdWNCBzaWduYXR1cmUgT3JpZ2luIEFjY2VzcyBDb250cm9sIHB1dCBvbiBhIHJlcXVlc3QgdG8gdGhlIEZ1bmN0aW9uXG4gKiBVUkwsIGFsc28gZHJvcHBlZCBieSB7QGxpbmsgcHJveHlFeHRlcm5hbH0gd2hlbiB0aGUgcmVxdWVzdCB3YXMgSUFNLXZlcmlmaWVkOlxuICogZm9yd2FyZGVkLCBpdCB3b3VsZCBsZXQgdGhlIHRoaXJkLXBhcnR5IG9yaWdpbiByZXBsYXkgdGhlIHJlcXVlc3QgYWdhaW5zdFxuICogdGhlIEZ1bmN0aW9uIFVSTC4gQW55d2hlcmUgZWxzZSB0aGVzZSBhcmUgdGhlIGNsaWVudCdzIG93biwgYW5kIGFyZVxuICogZm9yd2FyZGVkIGFzIGBuZXh0IHN0YXJ0YCBmb3J3YXJkcyB0aGVtLlxuICovXG5jb25zdCBTSUdWNF9IRUFERVJTOiByZWFkb25seSBzdHJpbmdbXSA9IFtcbiAgXCJhdXRob3JpemF0aW9uXCIsXG4gIFwieC1hbXotZGF0ZVwiLFxuICBcIngtYW16LWNvbnRlbnQtc2hhMjU2XCIsXG4gIFwieC1hbXotc2VjdXJpdHktdG9rZW5cIixcbl07XG5cbi8qKiBBIGBuZXh0LmNvbmZpZ2AgcmV3cml0ZSB3aG9zZSBkZXN0aW5hdGlvbiBpcyBhbm90aGVyIG9yaWdpbi4gKi9cbmFzeW5jIGZ1bmN0aW9uIHByb3h5RXh0ZXJuYWwoXG4gIHJlcTogU2hpbUluY29taW5nTWVzc2FnZSxcbiAgcmVzOiBTaGltU2VydmVyUmVzcG9uc2UsXG4gIHVybDogVVJMLFxuICByZXF1ZXN0SGVhZGVyczogSGVhZGVycyxcbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBtZXRob2QgPSByZXEubWV0aG9kID8/IFwiR0VUXCI7XG4gIGNvbnN0IGhhc0JvZHkgPSBtZXRob2QgIT09IFwiR0VUXCIgJiYgbWV0aG9kICE9PSBcIkhFQURcIjtcbiAgY29uc3QgaGVhZGVycyA9IG5ldyBIZWFkZXJzKHJlcXVlc3RIZWFkZXJzKTtcbiAgZm9yIChjb25zdCBuYW1lIG9mIFBST1hZX0RST1BQRURfSEVBREVSUykge1xuICAgIGhlYWRlcnMuZGVsZXRlKG5hbWUpO1xuICB9XG4gIGlmIChyZXEudHJ1c3RGb3J3YXJkZWRIb3N0KSB7XG4gICAgZm9yIChjb25zdCBuYW1lIG9mIFNJR1Y0X0hFQURFUlMpIHtcbiAgICAgIGhlYWRlcnMuZGVsZXRlKG5hbWUpO1xuICAgIH1cbiAgfVxuICBjb25zdCB1cHN0cmVhbSA9IGF3YWl0IGZldGNoKHVybCwge1xuICAgIG1ldGhvZCxcbiAgICBoZWFkZXJzLFxuICAgIGJvZHk6IGhhc0JvZHkgPyAoUmVhZGFibGUudG9XZWIocmVxKSBhcyBSZWFkYWJsZVN0cmVhbSkgOiB1bmRlZmluZWQsXG4gICAgcmVkaXJlY3Q6IFwibWFudWFsXCIsXG4gICAgLi4uKGhhc0JvZHkgPyB7IGR1cGxleDogXCJoYWxmXCIgfSA6IHt9KSxcbiAgfSBhcyBSZXF1ZXN0SW5pdCk7XG4gIGF3YWl0IHNlbmRXZWJSZXNwb25zZShyZXMsIHVwc3RyZWFtKTtcbn1cblxuLyoqXG4gKiBIZWFkZXJzIGRlc2NyaWJpbmcgdGhlIGZyYW1pbmcgb2YgYSBib2R5IHRoYXQgaXMgbm8gbG9uZ2VyIHRoZSBib2R5IGJlaW5nXG4gKiBzZW50LCBkcm9wcGVkIGZyb20gZXZlcnkgYFJlc3BvbnNlYCB7QGxpbmsgc2VuZFdlYlJlc3BvbnNlfSBmb3J3YXJkcy5cbiAqXG4gKiBBIHByb3hpZWQgb3JpZ2luJ3MgYFJlc3BvbnNlYCBjYW1lIGJhY2sgZnJvbSBgZmV0Y2hgLCBhbmQgc28sIG9mdGVuLCBkaWRcbiAqIG1pZGRsZXdhcmUncyBvd24gKGByZXR1cm4gZmV0Y2godXBzdHJlYW0pYCBpbiBgcHJveHkudHNgLCBzaW5jZSBtaWRkbGV3YXJlXG4gKiBydW5zIGluIHByb2Nlc3MgYW5kIGl0cyBgZmV0Y2hgIGlzIHVuZGljaSkuIHVuZGljaSBkZWNvZGVzIHRoZSBib2R5IOKAlCBnemlwLFxuICogZGVmbGF0ZSwgYnIsIHpzdGQg4oCUIGFuZCBsZWF2ZXMgYGNvbnRlbnQtZW5jb2RpbmdgIGFuZCBgY29udGVudC1sZW5ndGhgXG4gKiBkZXNjcmliaW5nIHRoZSBlbmNvZGVkIGJ5dGVzIGl0IGFscmVhZHkgdGhyZXcgYXdheS4gRm9yd2FyZGluZyB0aGVtIGVtaXRzXG4gKiBwbGFpbnRleHQgbGFiZWxsZWQgYGd6aXBgICh0aGUgYnJvd3NlciBmYWlscyB0aGUgd2hvbGUgcmVzcG9uc2Ugd2l0aFxuICogYEVSUl9DT05URU5UX0RFQ09ESU5HX0ZBSUxFRGApIHVuZGVyIGEgYENvbnRlbnQtTGVuZ3RoYCB0aGF0IGlzIHRvbyBzaG9ydCxcbiAqIGFuZCBgc2hvdWxkR3ppcGAgdGhlbiBkZWNsaW5lcyB0byBjb21wcmVzcyBpdCBiZWNhdXNlIGBjb250ZW50LWVuY29kaW5nYCBpc1xuICogYWxyZWFkeSBzZXQsIHNvIG5vdGhpbmcgZG93bnN0cmVhbSByZXBhaXJzIGl0LiBgdHJhbnNmZXItZW5jb2RpbmdgIGlzXG4gKiBob3AtYnktaG9wOiBpdCBkZXNjcmliZWQgdGhlIHVwc3RyZWFtIGNvbm5lY3Rpb24sIG5vdCB0aGlzIG9uZS5cbiAqXG4gKiBTdG9jayBOZXh0LmpzIGRyb3BzIHRoZSBzYW1lIHRocmVlIGZyb20gZXZlcnkgbWlkZGxld2FyZSByZXNwb25zZVxuICogKGBGT1JCSURERU5fSEVBREVSU2AgaW4gYG5leHQvZGlzdC9zZXJ2ZXIvd2ViL3NhbmRib3gvc2FuZGJveC5qc2ApLCBzb1xuICogbWlkZGxld2FyZSBjYW5ub3QgbGFiZWwgYSBib2R5IGl0IGVuY29kZWQgaXRzZWxmIHRoZXJlIGVpdGhlci5cbiAqL1xuY29uc3QgU1RBTEVfRlJBTUlOR19IRUFERVJTOiBSZWFkb25seVNldDxzdHJpbmc+ID0gbmV3IFNldChbXG4gIFwiY29udGVudC1lbmNvZGluZ1wiLFxuICBcImNvbnRlbnQtbGVuZ3RoXCIsXG4gIFwidHJhbnNmZXItZW5jb2RpbmdcIixcbl0pO1xuXG4vKiogU3RyZWFtIGEgYFJlc3BvbnNlYCDigJQgbWlkZGxld2FyZSdzIG93biwgb3IgYSBwcm94aWVkIG9yaWdpbidzIOKAlCBpbnRvIGByZXNgLiAqL1xuYXN5bmMgZnVuY3Rpb24gc2VuZFdlYlJlc3BvbnNlKFxuICByZXM6IFNoaW1TZXJ2ZXJSZXNwb25zZSxcbiAgcmVzcG9uc2U6IFJlc3BvbnNlLFxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJlcy5zdGF0dXNDb2RlID0gcmVzcG9uc2Uuc3RhdHVzO1xuICBpZiAocmVzcG9uc2Uuc3RhdHVzVGV4dCkge1xuICAgIHJlcy5zdGF0dXNNZXNzYWdlID0gcmVzcG9uc2Uuc3RhdHVzVGV4dDtcbiAgfVxuICBjb25zdCBoZWFkZXJzID0gbmV3IEhlYWRlcnMocmVzcG9uc2UuaGVhZGVycyk7XG4gIGZvciAoY29uc3QgbmFtZSBvZiBTVEFMRV9GUkFNSU5HX0hFQURFUlMpIHtcbiAgICBoZWFkZXJzLmRlbGV0ZShuYW1lKTtcbiAgfVxuICBhcHBseUhlYWRlcnMocmVzLCBoZWFkZXJzKTtcbiAgaWYgKCFyZXNwb25zZS5ib2R5KSB7XG4gICAgcmVzLmVuZCgpO1xuICAgIHJldHVybjtcbiAgfVxuICBmb3IgYXdhaXQgKGNvbnN0IGNodW5rIG9mIHJlc3BvbnNlLmJvZHkgYXMgdW5rbm93biBhcyBBc3luY0l0ZXJhYmxlPFVpbnQ4QXJyYXk+KSB7XG4gICAgLy8gTGVhdmluZyB0aGUgbG9vcCBjYW5jZWxzIHRoZSBib2R5LCB3aGljaCBpcyB3aGF0IHN0b3BzIGEgcHJveGllZCBvcmlnaW5cbiAgICAvLyBmcm9tIGJlaW5nIHJlYWQgdG8gdGhlIGVuZCBmb3IgYSBjbGllbnQgdGhhdCBoYXMgYWxyZWFkeSBnb25lLlxuICAgIGlmIChyZXMuZGVzdHJveWVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIFBhY2VkIGJ5IHRoZSBjbGllbnQ6IHdpdGhvdXQgd2FpdGluZyBmb3IgYGRyYWluYCwgYSBsYXJnZSBwcm94aWVkIGJvZHlcbiAgICAvLyBoZWFkZWQgZm9yIGEgc2xvdyBjbGllbnQgaXMgYnVmZmVyZWQgd2hvbGUgaW4gbWVtb3J5LlxuICAgIGNvbnN0IGFjY2VwdGVkID0gcmVzLndyaXRlKGNodW5rKTtcbiAgICAvLyBTZXQgYnkgdGhlIHNpbmsgd2hlbiBpdCBjb21wcmVzc2VzLiBXaXRob3V0IGl0IHRoZSBjaHVuayBzaXRzIGluIHpsaWInc1xuICAgIC8vIGJ1ZmZlciwgYW5kIGEgc3RyZWFtZWQgYm9keSDigJQgc2VydmVyLXNlbnQgZXZlbnRzIHRocm91Z2ggYSByZXdyaXRlLCBhXG4gICAgLy8gbWlkZGxld2FyZSBgUmVhZGFibGVTdHJlYW1gIOKAlCByZWFjaGVzIHRoZSBjbGllbnQgYWxsIGF0IG9uY2UsIGF0IHRoZSBlbmQuXG4gICAgLy8gTmV4dC5qcyBmbHVzaGVzIGFmdGVyIGV2ZXJ5IGNodW5rIGZvciB0aGUgc2FtZSByZWFzb24gKGBwaXBlLXJlYWRhYmxlYCkuXG4gICAgcmVzLmZsdXNoPy4oKTtcbiAgICBpZiAoIWFjY2VwdGVkICYmICEoYXdhaXQgZHJhaW5lZChyZXMpKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxuICByZXMuZW5kKCk7XG59XG4iXX0=
|
|
1216
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29yZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydW50aW1lL2NvcmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBMDlCQSx3REFnQkM7QUFtREQsc0RBK0JDO0FBbUJELGtDQTBEQztBQWlJRCw4QkEyQ0M7QUFyekNELHNEQUFzRDtBQUN0RDs7Ozs7Ozs7Ozs7R0FXRztBQUNILCtDQUE0QztBQUU1Qyx5Q0FBaUM7QUFDakMsNkNBQWlEO0FBQ2pELG1EQUFvRDtBQUNwRCx5Q0FLb0I7QUFDcEIsK0NBSXVCO0FBQ3ZCLDRDQUE0RTtBQUM1RSw4Q0FJeUI7QUFDekIsc0NBQXVEO0FBQ3ZELG1DQUF1RTtBQUN2RSx5Q0FNb0I7QUFDcEIsNkNBQWdEO0FBQ2hELGlEQUt3QjtBQUN4QixpREFBa0U7QUFDbEUsaURBQW9FO0FBQ3BFLGlDQUEwRTtBQStEMUUsTUFBYSxhQUFhO0lBVVk7SUFUbkIsV0FBVyxDQUFxQjtJQUNoQyxVQUFVLENBQWE7SUFDdkIsVUFBVSxDQUFvQjtJQUM5QixNQUFNLENBQXdCO0lBQy9DLDJDQUEyQztJQUMxQixjQUFjLENBQXlDO0lBQ3hFLGtFQUFrRTtJQUNqRCxZQUFZLENBQVU7SUFFdkMsWUFBb0MsT0FBNkI7UUFBN0IsWUFBTyxHQUFQLE9BQU8sQ0FBc0I7UUFDL0QsTUFBTSxFQUFFLFFBQVEsRUFBRSxjQUFjLEVBQUUsR0FBRyxPQUFPLENBQUM7UUFDN0MsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLGdDQUFrQixDQUFDLGNBQWMsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUNwRSx3REFBd0Q7UUFDeEQsTUFBTSxXQUFXLEdBQUcsSUFBQSxpQ0FBa0IsRUFBQyxjQUFjLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDakUsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLHFCQUFVLENBQUM7WUFDL0IsUUFBUTtZQUNSLFdBQVcsRUFBRSxXQUFXLENBQUMsS0FBSztTQUMvQixDQUFDLENBQUM7UUFDSCww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QVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNuQixHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDVixPQUFPO0lBQ1QsQ0FBQztJQUNELElBQUksS0FBSyxFQUFFLE1BQU0sS0FBSyxJQUFJLFFBQVEsQ0FBQyxJQUE0QyxFQUFFLENBQUM7UUFDaEYsMEVBQTBFO1FBQzFFLGlFQUFpRTtRQUNqRSxJQUFJLEdBQUcsQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUNsQixPQUFPO1FBQ1QsQ0FBQztRQUNELHlFQUF5RTtRQUN6RSx3REFBd0Q7UUFDeEQsTUFBTSxRQUFRLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNsQywwRUFBMEU7UUFDMUUsd0VBQXdFO1FBQ3hFLDRFQUE0RTtRQUM1RSwyRUFBMkU7UUFDM0UsR0FBRyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUM7UUFDZCxJQUFJLENBQUMsUUFBUSxJQUFJLENBQUMsQ0FBQyxNQUFNLElBQUEsY0FBTyxFQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUN2QyxPQUFPO1FBQ1QsQ0FBQztJQUNILENBQUM7SUFDRCxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDWixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgaW1wb3J0L25vLWV4dHJhbmVvdXMtZGVwZW5kZW5jaWVzICovXG4vKipcbiAqIFRoZSBydW50aW1lIGNvcmU6IG9uZSBgaGFuZGxlKHJlcXVlc3QsIHNpbmspYCB0aGF0IGJvdGggc2hlbGxzIHdyYXAuXG4gKlxuICogVGhlIExhbWJkYSBzaGVsbCAoYGxhbWJkYS5tdHNgKSBhbmQgdGhlIGNvbnRhaW5lciBzaGVsbCAoYHNlcnZlci5tdHNgKSBkb1xuICogbm90aGluZyBidXQgdHVybiB0aGVpciBpbnB1dCBpbnRvIGEge0BsaW5rIFJ1bnRpbWVSZXF1ZXN0fSBhbmQgdGhlaXIgb3V0cHV0IGludG9cbiAqIGEge0BsaW5rIFJlc3BvbnNlU2lua30uIEV2ZXJ5dGhpbmcgZWxzZSDigJQgc3ludGhlc2l6aW5nIGByZXFgL2ByZXNgLCBkaXNwYXRjaCxcbiAqIG1pZGRsZXdhcmUsIGVudHJ5cG9pbnQgaW52b2NhdGlvbiwgc3RhdGljIGZpbGVzLCBpbWFnZSBvcHRpbWl6YXRpb24sIGd6aXAsXG4gKiBgd2FpdFVudGlsYCDigJQgaGFwcGVucyBoZXJlLCBzbyB0aGUgY29udGFpbmVyIGUyZSBzdWl0ZSBleGVyY2lzZXMgdGhlIHNhbWUgY29kZVxuICogTGFtYmRhIHJ1bnMuIFRoYXQgaXMgZGVsaWJlcmF0ZTogdGhlIGNvbnRhaW5lciBwYXRoIHVzZWQgdG8gZ2V0IHJlYWxcbiAqIGBub2RlOmh0dHBgIG9iamVjdHMgZnJvbSBMYW1iZGEgV2ViIEFkYXB0ZXIsIHdoaWNoIG1lYW50IGNvbnRhaW5lciB0ZXN0cyBwcm92ZWRcbiAqIG5vdGhpbmcgYWJvdXQgTGFtYmRhLlxuICovXG5pbXBvcnQgeyByZWFkRmlsZSB9IGZyb20gXCJub2RlOmZzL3Byb21pc2VzXCI7XG5pbXBvcnQgdHlwZSB7IEluY29taW5nSHR0cEhlYWRlcnMgfSBmcm9tIFwibm9kZTpodHRwXCI7XG5pbXBvcnQgeyBqb2luIH0gZnJvbSBcIm5vZGU6cGF0aFwiO1xuaW1wb3J0IHsgUmVhZGFibGUsIFdyaXRhYmxlIH0gZnJvbSBcIm5vZGU6c3RyZWFtXCI7XG5pbXBvcnQgeyBjYXNlQ2Fub25pY2FsUGF0aCB9IGZyb20gXCIuL2Nhc2UtcmVkaXJlY3RcIjtcbmltcG9ydCB7XG4gIERpc3BhdGNoZXIsXG4gIG91dE9mQmFuZFJvdXRlUGFyYW1zLFxuICBTdGF0dXNUYXJnZXQsXG4gIHN0YXR1c1RhcmdldHMsXG59IGZyb20gXCIuL2Rpc3BhdGNoXCI7XG5pbXBvcnQge1xuICBFbnRyeXBvaW50SGFuZGxlcixcbiAgRW50cnlwb2ludFJlZ2lzdHJ5LFxuICBSb3V0ZUluT3RoZXJHcm91cEVycm9yLFxufSBmcm9tIFwiLi9lbnRyeXBvaW50c1wiO1xuaW1wb3J0IHsgU2hpbUluY29taW5nTWVzc2FnZSwgdG9JbmNvbWluZ0h0dHBIZWFkZXJzIH0gZnJvbSBcIi4vaHR0cC9yZXF1ZXN0XCI7XG5pbXBvcnQge1xuICBhc1NlcnZlclJlc3BvbnNlLFxuICBSZXNwb25zZUhlYWQsXG4gIFNoaW1TZXJ2ZXJSZXNwb25zZSxcbn0gZnJvbSBcIi4vaHR0cC9yZXNwb25zZVwiO1xuaW1wb3J0IHsgcGlwZVRvU2luaywgUmVzcG9uc2VTaW5rIH0gZnJvbSBcIi4vaHR0cC9zaW5rXCI7XG5pbXBvcnQgeyBJbnRlcm5hbEltYWdlUmVzcG9uc2UsIFJ1bnRpbWVJbWFnZU9wdGltaXplciB9IGZyb20gXCIuL2ltYWdlXCI7XG5pbXBvcnQge1xuICBBZGFwdGVyTWFuaWZlc3QsXG4gIGRlcGxveWVkTWFuaWZlc3RQYXRoLFxuICBGVU5DVElPTl9HUk9VUF9FTlZfVkFSLFxuICBNQU5JRkVTVF9GSUxFX05BTUUsXG4gIFJFVkFMSURBVEVEX1BBR0VfSE9PSyxcbn0gZnJvbSBcIi4vbWFuaWZlc3RcIjtcbmltcG9ydCB7IE1pZGRsZXdhcmVSdW5uZXIgfSBmcm9tIFwiLi9taWRkbGV3YXJlXCI7XG5pbXBvcnQge1xuICBsb2FkRW52RmlsZXMsXG4gIHJlZ2lzdGVySW5zdHJ1bWVudGF0aW9uLFxuICBzZXR1cE5vZGVFbnZpcm9ubWVudCxcbiAgdXNlTmV4dEZyb20sXG59IGZyb20gXCIuL25leHQtbW9kdWxlc1wiO1xuaW1wb3J0IHsgcHVibGljRGlyS2V5LCByZXNvbHZlUHVibGljRmlsZXMgfSBmcm9tIFwiLi9wdWJsaWMtZmlsZXNcIjtcbmltcG9ydCB7IHNlcnZlUzNQdWJsaWNGaWxlLCBzZXJ2ZVN0YXRpY0ZpbGUgfSBmcm9tIFwiLi9zdGF0aWMtZmlsZXNcIjtcbmltcG9ydCB7IGRyYWluZWQsIGZpcnN0VmFsdWUsIHRvU2VhcmNoLCB3aXRob3V0UGF0aFByZWZpeCB9IGZyb20gXCIuL3V0aWxcIjtcblxuLyoqIE9uZSByZXF1ZXN0LCBub3JtYWxpemVkIGJ5IGEgc2hlbGwuICovXG5leHBvcnQgaW50ZXJmYWNlIFJ1bnRpbWVSZXF1ZXN0IHtcbiAgcmVhZG9ubHkgbWV0aG9kOiBzdHJpbmc7XG4gIC8qKiBPcmlnaW4tZm9ybSB0YXJnZXQgZXhhY3RseSBhcyByZWNlaXZlZDogcGF0aCArIHF1ZXJ5LCBuZXZlciBhYnNvbHV0ZS4gKi9cbiAgcmVhZG9ubHkgdXJsOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGhlYWRlcnM6IEluY29taW5nSHR0cEhlYWRlcnM7XG4gIHJlYWRvbmx5IGJvZHk/OiBSZWFkYWJsZSB8IEJ1ZmZlcjtcbiAgcmVhZG9ubHkgcmVtb3RlQWRkcmVzcz86IHN0cmluZztcbiAgLyoqIGBmYWxzZWAgYmVoaW5kIGEgVExTLXRlcm1pbmF0aW5nIEFMQi4gT25seSBhZmZlY3RzIHRoZSBzeW50aGVzaXplZCBzb2NrZXQuICovXG4gIHJlYWRvbmx5IGVuY3J5cHRlZD86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBBYm9ydGVkIHdoZW4gdGhlIGNsaWVudCBkaXNjb25uZWN0cy4gV2lyaW5nIGl0IHRvIGByZXMuZGVzdHJveSgpYCBpcyB3aGF0XG4gICAqIG1ha2VzIGByZXF1ZXN0LnNpZ25hbC5vbmFib3J0YCBmaXJlIGluc2lkZSByb3V0ZSBoYW5kbGVycy5cbiAgICovXG4gIHJlYWRvbmx5IHNpZ25hbD86IEFib3J0U2lnbmFsO1xuICAvKipcbiAgICogV2hldGhlciBgeC1mb3J3YXJkZWQtaG9zdGAgbmFtZXMgdGhlIGhvc3QgdGhlIGNsaWVudCBhc2tlZCBmb3IuIE9ubHkgdGhlXG4gICAqIHNoZWxsIGNhbiBrbm93OiBpdCBpcyBgdHJ1ZWAgZm9yIGEgRnVuY3Rpb24gVVJMIGV2ZW50IHdob3NlIFNpZ1Y0IExhbWJkYVxuICAgKiB2ZXJpZmllZC4gVGhhdCBpcyBhbnkgSUFNLWF1dGhvcml6ZWQgaW52b2tlciDigJQgaW4gcHJhY3RpY2UgQ2xvdWRGcm9udCdzXG4gICAqIE9yaWdpbiBBY2Nlc3MgQ29udHJvbCwgd2hvc2Ugdmlld2VyLXJlcXVlc3QgZnVuY3Rpb24gb3ZlcndyaXRlcyB0aGUgaGVhZGVyXG4gICAqIHdpdGggdGhlIHZpZXdlcidzIGBIb3N0YCAoQ2xvdWRGcm9udCBoYXMgdG8gcmVwbGFjZSBgSG9zdGAgaXRzZWxmIHdpdGggdGhlXG4gICAqIEZ1bmN0aW9uIFVSTCdzIGRvbWFpbiksIHBsdXMgcHJpbmNpcGFscyBncmFudGVkIGBsYW1iZGE6SW52b2tlRnVuY3Rpb25VcmxgLFxuICAgKiB3aG8gY291bGQgcmVwbGFjZSB0aGUgZnVuY3Rpb24ncyBjb2RlIGFueXdheS4gSXQgaXMgYWxzbyB3aGF0XG4gICAqIGBwcm94eUV4dGVybmFsYCBkcm9wcyBPQUMncyBzaWduYXR1cmUgb24uIEV2ZXJ5d2hlcmUgZWxzZSB0aGUgaGVhZGVyIGlzXG4gICAqIHdoYXRldmVyIHRoZSBjbGllbnQgc2VudCwgYW5kIGl0IGlzXG4gICAqIGlnbm9yZWQsIGFzIGBuZXh0IHN0YXJ0YCBpZ25vcmVzIGl0IHdpdGhvdXQgYGV4cGVyaW1lbnRhbC50cnVzdEhvc3RIZWFkZXJgLlxuICAgKi9cbiAgcmVhZG9ubHkgdHJ1c3RGb3J3YXJkZWRIb3N0PzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIFNldCBieSB7QGxpbmsgTmV4dGpzUnVudGltZS5oYW5kbGVJbnRlcm5hbGx5fSBmb3IgdGhlIGluLXByb2Nlc3MgcmVxdWVzdHMgaXRcbiAgICogbWFrZXM6IGNhbGxlZCB3aXRoIHRoZSBgUm91dGVJbk90aGVyR3JvdXBFcnJvcmAgdGhlIHJvdXRlIHRocmV3LCBpbnN0ZWFkIG9mXG4gICAqIGxvZ2dpbmcgdGhlIG1pc3JvdXRlZC1yZXF1ZXN0IHdhcm5pbmcsIHdoaWNoIGRlc2NyaWJlcyBhIENsb3VkRnJvbnQgb3IgQVBJXG4gICAqIEdhdGV3YXkgcHJvYmxlbSB0aGlzIGlzIG5vdC5cbiAgICovXG4gIHJlYWRvbmx5IG9uUm91dGVJbk90aGVyR3JvdXA/OiAoZXJyb3I6IFJvdXRlSW5PdGhlckdyb3VwRXJyb3IpID0+IHZvaWQ7XG59XG5cbi8qKlxuICogYFJldmFsaWRhdGVGbmAncyBhcmd1bWVudCAoYG5leHQvZGlzdC9zZXJ2ZXIvbGliL3JvdXRlci11dGlscy9yb3V0ZXItc2VydmVyLWNvbnRleHRgKSxcbiAqIHJlc3RhdGVkIGJlY2F1c2UgdGhhdCBtb2R1bGUgaXMgbm90IHBhcnQgb2YgYG5leHRgJ3MgcHVibGlzaGVkIHR5cGUgc3VyZmFjZS5cbiAqL1xuaW50ZXJmYWNlIFJldmFsaWRhdGVDb25maWcge1xuICByZWFkb25seSB1cmxQYXRoOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGhlYWRlcnM6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIHwgc3RyaW5nW10gfTtcbiAgcmVhZG9ubHkgb3B0czogeyB1bnN0YWJsZV9vbmx5R2VuZXJhdGVkPzogYm9vbGVhbiB9O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE5leHRqc1J1bnRpbWVPcHRpb25zIHtcbiAgLyoqXG4gICAqIEFic29sdXRlIHBhdGggdG8gdGhlIGRlcGxveW1lbnQgcm9vdCDigJQgdGhlIHN0YWdlZCB0cmVlIGV2ZXJ5IG1hbmlmZXN0IGtleVxuICAgKiByZXNvbHZlcyBhZ2FpbnN0LiBgTEFNQkRBX1RBU0tfUk9PVGAgZm9yIEZ1bmN0aW9ucywgdGhlIGltYWdlIGBXT1JLRElSYCBmb3JcbiAgICogQ29udGFpbmVyczsgYm90aCBzaGVsbHMgZGVyaXZlIGl0IGZyb20gdGhlaXIgb3duIGxvY2F0aW9uIGluc3RlYWQuXG4gICAqL1xuICByZWFkb25seSBkZXBsb3ltZW50Um9vdDogc3RyaW5nO1xuICByZWFkb25seSBtYW5pZmVzdDogQWRhcHRlck1hbmlmZXN0O1xuICAvKiogYENES19ORVhUSlNfU1RBVElDX0FTU0VUU19CVUNLRVRfTkFNRWAuICovXG4gIHJlYWRvbmx5IGJ1Y2tldD86IHN0cmluZztcbiAgLyoqIGBDREtfTkVYVEpTX1NUQVRJQ19BU1NFVFNfS0VZX1BSRUZJWGAuICovXG4gIHJlYWRvbmx5IGJ1Y2tldEtleVByZWZpeD86IHN0cmluZztcbn1cblxuZXhwb3J0IGNsYXNzIE5leHRqc1J1bnRpbWUge1xuICBwcml2YXRlIHJlYWRvbmx5IGVudHJ5cG9pbnRzOiBFbnRyeXBvaW50UmVnaXN0cnk7XG4gIHByaXZhdGUgcmVhZG9ubHkgZGlzcGF0Y2hlcjogRGlzcGF0Y2hlcjtcbiAgcHJpdmF0ZSByZWFkb25seSBtaWRkbGV3YXJlPzogTWlkZGxld2FyZVJ1bm5lcjtcbiAgcHJpdmF0ZSByZWFkb25seSBpbWFnZXM6IFJ1bnRpbWVJbWFnZU9wdGltaXplcjtcbiAgLyoqIFRoZSA1MDAgbGFkZGVyOyBzZWUgYHN0YXR1c1RhcmdldHNgLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IGVycm9yVGFyZ2V0Rm9yOiAodXJsOiBVUkwgfCB1bmRlZmluZWQpID0+IFN0YXR1c1RhcmdldDtcbiAgLyoqIFRoZSBhc3NldHMgYnVja2V0LCB3aGVuIGBwdWJsaWMvYCBmaWxlcyBhcmUgc2VydmVkIGZyb20gaXQuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgcHVibGljQnVja2V0Pzogc3RyaW5nO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IG9wdGlvbnM6IE5leHRqc1J1bnRpbWVPcHRpb25zKSB7XG4gICAgY29uc3QgeyBtYW5pZmVzdCwgZGVwbG95bWVudFJvb3QgfSA9IG9wdGlvbnM7XG4gICAgdGhpcy5lbnRyeXBvaW50cyA9IG5ldyBFbnRyeXBvaW50UmVnaXN0cnkoZGVwbG95bWVudFJvb3QsIG1hbmlmZXN0KTtcbiAgICAvLyBMaXN0ZWQgb25jZSwgYXQgY29sZCBzdGFydDsgc2VlIGByZXNvbHZlUHVibGljRmlsZXNgLlxuICAgIGNvbnN0IHB1YmxpY0ZpbGVzID0gcmVzb2x2ZVB1YmxpY0ZpbGVzKGRlcGxveW1lbnRSb290LCBtYW5pZmVzdCk7XG4gICAgdGhpcy5kaXNwYXRjaGVyID0gbmV3IERpc3BhdGNoZXIoe1xuICAgICAgbWFuaWZlc3QsXG4gICAgICBwdWJsaWNGaWxlczogcHVibGljRmlsZXMuZmlsZXMsXG4gICAgfSk7XG4gICAgLy8gT24gZGlzayBvdGhlcndpc2UsIHdpdGggYC5uZXh0L3N0YXRpY2AuXG4gICAgdGhpcy5wdWJsaWNCdWNrZXQgPSBwdWJsaWNGaWxlcy5pblMzID8gb3B0aW9ucy5idWNrZXQgOiB1bmRlZmluZWQ7XG4gICAgdGhpcy5lcnJvclRhcmdldEZvciA9IHN0YXR1c1RhcmdldHMobWFuaWZlc3QsIDUwMCk7XG4gICAgdGhpcy5pbWFnZXMgPSBuZXcgUnVudGltZUltYWdlT3B0aW1pemVyKHtcbiAgICAgIGRlcGxveW1lbnRSb290LFxuICAgICAgbWFuaWZlc3QsXG4gICAgICBidWNrZXQ6IHRoaXMucHVibGljQnVja2V0ID8/IFwiXCIsXG4gICAgICBidWNrZXRLZXlQcmVmaXg6IG9wdGlvbnMuYnVja2V0S2V5UHJlZml4ID8/IFwiXCIsXG4gICAgICBmZXRjaEludGVybmFsOiAoaHJlZiwgcmVxLCBtYXhpbXVtQm9keSkgPT5cbiAgICAgICAgdGhpcy5mZXRjaEludGVybmFsKGhyZWYsIHJlcSwgbWF4aW11bUJvZHkpLFxuICAgIH0pO1xuICAgIC8vIFRoZSBydW5uZXIgaXMgc2hhcmVkIOKAlCBpdCBtZW1vaXplcyB0aGUgbG9hZGVkIG1pZGRsZXdhcmUgbW9kdWxlIOKAlCB3aGlsZSB0aGVcbiAgICAvLyBgaW52b2tlTWlkZGxld2FyZWAgY2FsbGJhY2sgaXQgcHJvZHVjZXMgaXMgcGVyIHJlcXVlc3QuXG4gICAgdGhpcy5taWRkbGV3YXJlID0gbWFuaWZlc3QubWlkZGxld2FyZVxuICAgICAgPyBuZXcgTWlkZGxld2FyZVJ1bm5lcih7XG4gICAgICAgICAgbWlkZGxld2FyZTogbWFuaWZlc3QubWlkZGxld2FyZSxcbiAgICAgICAgICByb290OiBkZXBsb3ltZW50Um9vdCxcbiAgICAgICAgfSlcbiAgICAgIDogdW5kZWZpbmVkO1xuICB9XG5cbiAgcHVibGljIGdldCBtYW5pZmVzdCgpOiBBZGFwdGVyTWFuaWZlc3Qge1xuICAgIHJldHVybiB0aGlzLm9wdGlvbnMubWFuaWZlc3Q7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgaGFuZGxlKFxuICAgIHJlcXVlc3Q6IFJ1bnRpbWVSZXF1ZXN0LFxuICAgIHNpbms6IFJlc3BvbnNlU2luayxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgeyBtYW5pZmVzdCB9ID0gdGhpcy5vcHRpb25zO1xuICAgIGNvbnN0IHBlbmRpbmc6IEFycmF5PFByb21pc2U8dW5rbm93bj4+ID0gW107XG4gICAgY29uc3Qgd2FpdFVudGlsID0gKHByb21pc2U6IFByb21pc2U8dW5rbm93bj4pID0+IHtcbiAgICAgIHBlbmRpbmcucHVzaChwcm9taXNlKTtcbiAgICB9O1xuXG4gICAgY29uc3QgYm9keSA9IHNwbGl0Qm9keShyZXF1ZXN0LmJvZHksIHRoaXMubWlkZGxld2FyZSAhPT0gdW5kZWZpbmVkKTtcbiAgICBjb25zdCByZXEgPSBuZXcgU2hpbUluY29taW5nTWVzc2FnZSh7XG4gICAgICBtZXRob2Q6IHJlcXVlc3QubWV0aG9kLFxuICAgICAgdXJsOiByZXF1ZXN0LnVybCxcbiAgICAgIGhlYWRlcnM6IHdpdGhvdXRJbnRlcm5hbEhlYWRlcnMoXG4gICAgICAgIHJlcXVlc3QuaGVhZGVycyxcbiAgICAgICAgcmVxdWVzdC51cmwsXG4gICAgICAgIG1hbmlmZXN0LmNvbmZpZy5iYXNlUGF0aCxcbiAgICAgICksXG4gICAgICBib2R5OiBib2R5LmZvclJlcXVlc3QsXG4gICAgICByZW1vdGVBZGRyZXNzOiByZXF1ZXN0LnJlbW90ZUFkZHJlc3MsXG4gICAgICBlbmNyeXB0ZWQ6IHJlcXVlc3QuZW5jcnlwdGVkLFxuICAgICAgdHJ1c3RGb3J3YXJkZWRIb3N0OiByZXF1ZXN0LnRydXN0Rm9yd2FyZGVkSG9zdCxcbiAgICB9KTtcbiAgICBjb25zdCByZXMgPSBuZXcgU2hpbVNlcnZlclJlc3BvbnNlKCk7XG4gICAgLy8gTmV4dC5qcyByZWFkcyBgcmVzLnJlcWAgaW4gYSBmZXcgZXJyb3IgcGF0aHMuXG4gICAgcmVzLnJlcSA9IHJlcTtcbiAgICByZXF1ZXN0LnNpZ25hbD8uYWRkRXZlbnRMaXN0ZW5lcihcImFib3J0XCIsICgpID0+IHJlcy5kZXN0cm95KCksIHtcbiAgICAgIG9uY2U6IHRydWUsXG4gICAgfSk7XG5cbiAgICAvLyBUaGUgcmVqZWN0aW9uIGhhbmRsZXIgaXMgYXR0YWNoZWQgaGVyZSByYXRoZXIgdGhhbiBhdCB0aGUgYGF3YWl0YCBiZWxvdy5cbiAgICAvLyBgcm91dGUoKWAgYXdhaXRzIHJlYWwgSS9PLCBzbyBhIHN0cmVhbSB0aGF0IGJyZWFrcyB3aGlsZSBpdCBydW5zIHdvdWxkXG4gICAgLy8gbGVhdmUgdGhpcyBwcm9taXNlIHJlamVjdGVkIHdpdGggbm8gaGFuZGxlciBhdHRhY2hlZCBmb3IgYSBmdWxsIGV2ZW50LWxvb3BcbiAgICAvLyB0dXJuIOKAlCBhbmQgTm9kZSAyNCBkZWZhdWx0cyB0byBgLS11bmhhbmRsZWQtcmVqZWN0aW9ucz10aHJvd2AsIHdoaWNoIG9uXG4gICAgLy8gdGhlIGNvbnRhaW5lciBzaGVsbCB0YWtlcyB0aGUgd2hvbGUgdGFzayBkb3duIGFuZCBhYm9ydHMgZXZlcnkgb3RoZXJcbiAgICAvLyBpbi1mbGlnaHQgcmVxdWVzdCBvbiBpdC4gQSBtaWQtc3RyZWFtIEVQSVBFIGZyb20gb25lIGNsaWVudCBkaXNjb25uZWN0IGlzXG4gICAgLy8gbm90IGdyb3VuZHMgZm9yIHRoYXQuXG4gICAgLy9cbiAgICAvLyBUaGUgZXJyb3IgaXMgbG9nZ2VkLCBub3QgcmV0aHJvd246IHRoZSBzdHJlYW0gYnJva2UgYWZ0ZXIgKG9yIHdoaWxlKSB0aGVcbiAgICAvLyBoZWFkIHdlbnQgb3V0IOKAlCBhIGNsaWVudCBkaXNjb25uZWN0LCBvciBgc2VuZEVycm9yYCBkZXN0cm95aW5nIGFcbiAgICAvLyBoYWxmLXdyaXR0ZW4gcmVzcG9uc2Ug4oCUIGFuZCBuZWl0aGVyIGlzIGFuIGludm9jYXRpb24gZmFpbHVyZS4gUmV0aHJvd2luZ1xuICAgIC8vIHdvdWxkIG1ha2UgTGFtYmRhIHJldHJ5IGEgcmVxdWVzdCB0aGUgY2xpZW50IGFscmVhZHkgYWJhbmRvbmVkLlxuICAgIGNvbnN0IGZpbmlzaGVkID0gcGlwZVRvU2luayhyZXEsIHJlcywgc2luaywge1xuICAgICAgY29tcHJlc3M6IG1hbmlmZXN0LmNvbmZpZy5jb21wcmVzcyxcbiAgICB9KS5jYXRjaCgoZXJyb3I6IHVua25vd24pID0+IHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXCJUaGUgcmVzcG9uc2Ugc3RyZWFtIGRpZCBub3QgY29tcGxldGU6XCIsIGVycm9yKTtcbiAgICB9KTtcblxuICAgIC8vIEZvciB0aGUgZXJyb3IgcGFnZSdzIGxvY2FsZTsgdW5zZXQgd2hlbiB0aGUgdGhyb3cgaXMgYGFic29sdXRlVXJsYCdzLlxuICAgIGxldCB1cmw6IFVSTCB8IHVuZGVmaW5lZDtcbiAgICB0cnkge1xuICAgICAgLy8gQmVmb3JlIGFueXRoaW5nIHBhcnNlcyB0aGUgdGFyZ2V0LCBpbmNsdWRpbmcgYGFic29sdXRlVXJsYCAtIGBuZXcgVVJMYFxuICAgICAgLy8gcmVhZHMgYSBsZWFkaW5nIGAvL2AgYXMgcHJvdG9jb2wtcmVsYXRpdmUgYW5kIHdvdWxkIHRha2UgdGhlIGZpcnN0IHBhdGhcbiAgICAgIC8vIHNlZ21lbnQgZm9yIHRoZSBob3N0LlxuICAgICAgY29uc3QgY29sbGFwc2VkID0gY29sbGFwc2VSZXBlYXRlZFNsYXNoZXMocmVxdWVzdC51cmwpO1xuICAgICAgaWYgKGNvbGxhcHNlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHNlbmRSZWRpcmVjdChyZXMsIGNvbGxhcHNlZCwgMzA4KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIEluc2lkZSB0aGUgdHJ5OiBgYWJzb2x1dGVVcmxgIGJ1aWxkcyBhIGBVUkxgIG91dCBvZiB0aGUgcmVxdWVzdCBsaW5lXG4gICAgICAgIC8vIGFuZCB0aGUgZm9yd2FyZGVkIGhlYWRlcnMsIGFuZCBhIHRocm93IGhlcmUgaGFzIHRvIHJlYWNoIHRoZSBlcnJvclxuICAgICAgICAvLyBsYWRkZXIgbGlrZSBhbnkgb3RoZXIuIE91dHNpZGUgaXQsIG9uIHRoZSBMYW1iZGEgc2hlbGxzIOKAlCB3aG9zZVxuICAgICAgICAvLyBoYW5kbGVycyB3cmFwIG5vdGhpbmcg4oCUIHRoZSBzYW1lIHRocm93IGlzIGFuIGludm9jYXRpb24gZXJyb3IgYW5kIGFcbiAgICAgICAgLy8gNTAyLlxuICAgICAgICB1cmwgPSBhYnNvbHV0ZVVybChyZXF1ZXN0KTtcbiAgICAgICAgYXdhaXQgdGhpcy5yb3V0ZShyZXEsIHJlcywgdXJsLCBib2R5LCB3YWl0VW50aWwsIHJlcXVlc3QpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBhd2FpdCB0aGlzLnNlbmRFcnJvcihyZXEsIHJlcywgd2FpdFVudGlsLCBlcnJvciwgdXJsKTtcbiAgICB9XG5cbiAgICBhd2FpdCBmaW5pc2hlZDtcblxuICAgIC8vIExhbWJkYSBmcmVlemVzIHRoZSBleGVjdXRpb24gZW52aXJvbm1lbnQgdGhlIG1vbWVudCB0aGUgaGFuZGxlciByZXNvbHZlcyDigJRcbiAgICAvLyB0aGVyZSBpcyBubyBwb3N0LXJlc3BvbnNlIGtlZXBhbGl2ZSDigJQgc28gYmFja2dyb3VuZCB3b3JrIHJlZ2lzdGVyZWQgd2l0aFxuICAgIC8vIGB3YWl0VW50aWxgIChub3RhYmx5IElTUiByZXZhbGlkYXRpb24pIGhhcyB0byBiZSBhd2FpdGVkIGhlcmUuIEFmdGVyIHRoZVxuICAgIC8vIHJlc3BvbnNlIHN0cmVhbSBoYXMgY2xvc2VkLCBzbyBjbGllbnQgbGF0ZW5jeSBpcyB1bmFmZmVjdGVkOyBiaWxsZWRcbiAgICAvLyBkdXJhdGlvbiBleHRlbmRzLCB3aGljaCBpcyB0aGUgY29ycmVjdCB0cmFkZSBhZ2FpbnN0IGEgcmV2YWxpZGF0aW9uIHRoYXRcbiAgICAvLyBuZXZlciBjb21wbGV0ZXMuXG4gICAgLy9cbiAgICAvLyBEcmFpbmVkIHVudGlsIG5vdGhpbmcgbmV3IGFycml2ZXMsIG5vdCBhd2FpdGVkIG9uY2U6IGB3YWl0VW50aWxgIGtlZXBzXG4gICAgLy8gYmVpbmcgY2FsbGVkIGFmdGVyIHRoZSByZXNwb25zZSDigJQgTmV4dCdzIGBBZnRlckNvbnRleHRgIHJlZ2lzdGVycyBpdHNcbiAgICAvLyBjYWxsYmFjayBxdWV1ZSBvbiB0aGUgZmlyc3QgYGFmdGVyKClgLCBhbmQgYW4gYGFmdGVyKHByb21pc2UpYCBtYWRlIGZyb21cbiAgICAvLyBpbnNpZGUgYSBydW5uaW5nIGNhbGxiYWNrLCBvciBhIGJhY2tncm91bmQgcmVnZW5lcmF0aW9uIHRoYXQgaXRzZWxmIGNhbGxzXG4gICAgLy8gYGFmdGVyKClgLCByZWdpc3RlcnMgbW9yZS4gQSBzaW5nbGUgYGFsbFNldHRsZWRgIHNuYXBzaG90cyB0aGUgYXJyYXkgYW5kXG4gICAgLy8gbGV0cyBMYW1iZGEgZnJlZXplIG9uIHRoYXQgbGF0ZSB3b3JrLlxuICAgIGxldCBzZXR0bGVkQ291bnQgPSAwO1xuICAgIHdoaWxlIChzZXR0bGVkQ291bnQgPCBwZW5kaW5nLmxlbmd0aCkge1xuICAgICAgY29uc3QgYmF0Y2ggPSBwZW5kaW5nLnNsaWNlKHNldHRsZWRDb3VudCk7XG4gICAgICBzZXR0bGVkQ291bnQgPSBwZW5kaW5nLmxlbmd0aDtcbiAgICAgIGNvbnN0IHNldHRsZWQgPSBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQoYmF0Y2gpO1xuICAgICAgZm9yIChjb25zdCByZXN1bHQgb2Ygc2V0dGxlZCkge1xuICAgICAgICBpZiAocmVzdWx0LnN0YXR1cyA9PT0gXCJyZWplY3RlZFwiKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihcIkEgd2FpdFVudGlsKCkgcHJvbWlzZSByZWplY3RlZDpcIiwgcmVzdWx0LnJlYXNvbik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHJvdXRlKFxuICAgIHJlcTogU2hpbUluY29taW5nTWVzc2FnZSxcbiAgICByZXM6IFNoaW1TZXJ2ZXJSZXNwb25zZSxcbiAgICB1cmw6IFVSTCxcbiAgICBib2R5OiBTcGxpdEJvZHksXG4gICAgd2FpdFVudGlsOiAocHJvbWlzZTogUHJvbWlzZTx1bmtub3duPikgPT4gdm9pZCxcbiAgICByZXF1ZXN0OiBSdW50aW1lUmVxdWVzdCxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5kaXNwYXRjaGVyLmRpc3BhdGNoKHtcbiAgICAgIG1ldGhvZDogcmVxLm1ldGhvZCA/PyBcIkdFVFwiLFxuICAgICAgdXJsLFxuICAgICAgaGVhZGVyczogbmV3IEhlYWRlcnModG9XZWJIZWFkZXJzKHJlcS5oZWFkZXJzKSksXG4gICAgICBib2R5OiBib2R5LmZvckRpc3BhdGNoLFxuICAgICAgaW52b2tlTWlkZGxld2FyZTogdGhpcy5taWRkbGV3YXJlPy5pbnZva2VyRm9yKHtcbiAgICAgICAgd2FpdFVudGlsLFxuICAgICAgICBzaWduYWw6IHJlcXVlc3Quc2lnbmFsLFxuICAgICAgfSksXG4gICAgfSk7XG4gICAgYm9keS5yZWxlYXNlVW5yZWFkKHJlc3VsdC5raW5kID09PSBcIm1pZGRsZXdhcmUtcmVzcG9uZGVkXCIpO1xuXG4gICAgYXBwbHlIZWFkZXJzKHJlcywgcmVzdWx0LnJlc3BvbnNlSGVhZGVycyk7XG4gICAgaWYgKHJlc3VsdC5zdGF0dXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmVzLnN0YXR1c0NvZGUgPSByZXN1bHQuc3RhdHVzO1xuICAgIH1cblxuICAgIHN3aXRjaCAocmVzdWx0LmtpbmQpIHtcbiAgICAgIGNhc2UgXCJlbnRyeXBvaW50XCI6IHtcbiAgICAgICAgbGV0IGhhbmRsZXI6IEVudHJ5cG9pbnRIYW5kbGVyO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGhhbmRsZXIgPSBhd2FpdCB0aGlzLmVudHJ5cG9pbnRzLmxvYWQocmVzdWx0LmVudHJ5cG9pbnQpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGlmICghKGVycm9yIGluc3RhbmNlb2YgUm91dGVJbk90aGVyR3JvdXBFcnJvcikpIHRocm93IGVycm9yO1xuICAgICAgICAgIC8vIEEgVVJMIHRoZSBlZGdlIHNlbnQgaGVyZSBvbmx5IGJlY2F1c2Ugb2YgaXRzIGNhc2UgZ29lcyB0byBpdHNcbiAgICAgICAgICAvLyBjYW5vbmljYWwgc3BlbGxpbmcsIHdoaWNoIHRoZSBlZGdlIHJvdXRlcyB0byB0aGUgb3duaW5nIGdyb3VwLlxuICAgICAgICAgIGNvbnN0IGNhbm9uaWNhbCA9IGNhc2VDYW5vbmljYWxQYXRoKFxuICAgICAgICAgICAgdXJsLnBhdGhuYW1lLFxuICAgICAgICAgICAgcmVzdWx0LnJlc29sdmVkUGF0aG5hbWUsXG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMubWFuaWZlc3QsXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAoY2Fub25pY2FsKSB7XG4gICAgICAgICAgICBzZW5kUmVkaXJlY3QocmVzLCBgJHtjYW5vbmljYWx9JHt1cmwuc2VhcmNofWAsIDMwOCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChyZXF1ZXN0Lm9uUm91dGVJbk90aGVyR3JvdXApIHtcbiAgICAgICAgICAgIC8vIEV4cGxhaW5lZCBieSB0aGUgY2FsbGVyIG9mIGBoYW5kbGVJbnRlcm5hbGx5YCwgd2hpY2gga25vd3Mgd2h5IGl0XG4gICAgICAgICAgICAvLyBoYXBwZW5lZC5cbiAgICAgICAgICAgIHJlcXVlc3Qub25Sb3V0ZUluT3RoZXJHcm91cChlcnJvcik7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIExvZ2dlZCwgYmVjYXVzZSBpdCBpcyBhbHNvIHdoYXQgYSBtaXNyb3V0ZWQgZ3JvdXAgbG9va3MgbGlrZTsgc2VlXG4gICAgICAgICAgICAvLyBgUm91dGVJbk90aGVyR3JvdXBFcnJvcmAgZm9yIHdoeSBpdCBpcyBhIDQwNC5cbiAgICAgICAgICAgIGNvbnNvbGUud2FybihlcnJvci5tZXNzYWdlKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYXdhaXQgdGhpcy5zZW5kVW5tYXRjaGVkKFxuICAgICAgICAgICAgcmVxLFxuICAgICAgICAgICAgcmVzLFxuICAgICAgICAgICAgd2FpdFVudGlsLFxuICAgICAgICAgICAgeyBwYXRobmFtZTogdXJsLnBhdGhuYW1lLCByZXF1ZXN0SGVhZGVyczogcmVzdWx0LnJlcXVlc3RIZWFkZXJzIH0sXG4gICAgICAgICAgICB1cmwsXG4gICAgICAgICAgKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gVGhlIGludm9jYXRpb24gdGFyZ2V0LCBub3QgdGhlIHJlcXVlc3RlZCBVUkw6IGByZXNvbHZlUm91dGVzYCBoYXNcbiAgICAgICAgLy8gYXBwbGllZCByZXdyaXRlcywgc3RyaXBwZWQgaTE4biBwcmVmaXhlcywgYW5kIGFwcGVuZGVkIHRoZSBgbnh0UGBcbiAgICAgICAgLy8gcm91dGUgcGFyYW1zIGFzIHF1ZXJ5IHZhbHVlcy4gVGhhdCBpcyBleGFjdGx5IHRoZSBjb250cmFjdCBOZXh0LmpzXG4gICAgICAgIC8vIGRvY3VtZW50cyBmb3IgYSBwcm94eSBpbiBmcm9udCBvZiBhIGZ1bmN0aW9uIOKAlCBgUm91dGVNb2R1bGUucHJlcGFyZWBcbiAgICAgICAgLy8gcmVjb3ZlcnMgYHBhcmFtc2AgZnJvbSB0aGVzZSBxdWVyeSB2YWx1ZXMg4oCUIHNvIHRoYXQgY29udHJhY3QsIG5vdFxuICAgICAgICAvLyBgcmVxdWVzdE1ldGEucGFyYW1zYCwgaXMgaG93IHBhcmFtcyBnZXQgcGFzc2VkLiBUaGUgb25lIGV4Y2VwdGlvbiBpc1xuICAgICAgICAvLyBhIGNhcHR1cmUgdGhlIGNvbnRyYWN0IHdvdWxkIGNvcnJ1cHQ7IHNlZSBgb3V0T2ZCYW5kUm91dGVQYXJhbXNgLlxuICAgICAgICBjb25zdCBvdXRPZkJhbmQgPSBvdXRPZkJhbmRSb3V0ZVBhcmFtcyhcbiAgICAgICAgICByZXN1bHQuaW52b2NhdGlvblRhcmdldC5xdWVyeSxcbiAgICAgICAgICByZXN1bHQucmVzb2x2ZWRQYXRobmFtZSxcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgaW52b2NhdGlvblF1ZXJ5ID1cbiAgICAgICAgICBvdXRPZkJhbmQ/LnF1ZXJ5ID8/IHJlc3VsdC5pbnZvY2F0aW9uVGFyZ2V0LnF1ZXJ5O1xuICAgICAgICBjb25zdCB7IHBhdGhuYW1lIH0gPSByZXN1bHQuaW52b2NhdGlvblRhcmdldDtcbiAgICAgICAgY29uc3Qgc2VhcmNoID0gdG9TZWFyY2goaW52b2NhdGlvblF1ZXJ5KTtcbiAgICAgICAgcmVxLnVybCA9IHNlYXJjaCA/IGAke3BhdGhuYW1lfT8ke3NlYXJjaH1gIDogcGF0aG5hbWU7XG4gICAgICAgIC8vIE1pZGRsZXdhcmUgbWF5IGhhdmUgcmV3cml0dGVuIHJlcXVlc3QgaGVhZGVycyB2aWFcbiAgICAgICAgLy8gYE5leHRSZXNwb25zZS5uZXh0KHsgcmVxdWVzdDogeyBoZWFkZXJzIH0gfSlgLlxuICAgICAgICByZXEuaGVhZGVycyA9IHRvSW5jb21pbmdIdHRwSGVhZGVycyhyZXN1bHQucmVxdWVzdEhlYWRlcnMpO1xuICAgICAgICBhd2FpdCBoYW5kbGVyKHJlcSwgYXNTZXJ2ZXJSZXNwb25zZShyZXMpLCB7XG4gICAgICAgICAgd2FpdFVudGlsLFxuICAgICAgICAgIHJlcXVlc3RNZXRhOiB7XG4gICAgICAgICAgICAvLyBUaGUgcmVzb2x2ZWQgcXVlcnksIHN0YXRlZCByYXRoZXIgdGhhbiBsZWZ0IHRvIGJlIHJlLWRlcml2ZWQuXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy8gYFJvdXRlTW9kdWxlLnByZXBhcmVgIHJ1bnMgYGhhbmRsZVJld3JpdGVzYCBhZ2FpbnN0IGByZXEudXJsYFxuICAgICAgICAgICAgLy8gdW5jb25kaXRpb25hbGx5LCBhbmQgYHJlcS51cmxgIGlzIHRoZSAqYWxyZWFkeSByZXdyaXR0ZW4qIHRhcmdldC5cbiAgICAgICAgICAgIC8vIEEgYGJlZm9yZUZpbGVzYCByZXdyaXRlIHdob3NlIGNvbmRpdGlvbiBzdGlsbCBob2xkcyBhZnRlciBpdCBoYXNcbiAgICAgICAgICAgIC8vIGJlZW4gYXBwbGllZCB0aGVyZWZvcmUgZ2V0cyBhcHBsaWVkIHR3aWNlOiBpblxuICAgICAgICAgICAgLy8gYHRlc3QvZTJlL2xpbmstd2l0aC1hcGktcmV3cml0ZWAgdGhlIHJ1bGVcbiAgICAgICAgICAgIC8vIGAvOnBhdGgoLiopYCArIGBoYXM6IHF1ZXJ5IGpzb249dHJ1ZWAgLT4gYC9hcGkvanNvbj9mcm9tPS86cGF0aGBcbiAgICAgICAgICAgIC8vIG1hdGNoZWQgYC9hcGkvanNvbj9qc29uPXRydWUmZnJvbT0vc29tZS9yb3V0ZS9mb3JgIGEgc2Vjb25kIHRpbWVcbiAgICAgICAgICAgIC8vIGFuZCBvdmVyd3JvdGUgYGZyb21gIHdpdGggYC9hcGkvanNvbmAuIGBuZXh0IHN0YXJ0YCBlc2NhcGVzIGl0XG4gICAgICAgICAgICAvLyBiZWNhdXNlIGl0cyByb3V0ZXIgbGVhdmVzIGByZXEudXJsYCBhcyB0aGUgVVJMIHRoZSBjbGllbnQgc2VudCwgc29cbiAgICAgICAgICAgIC8vIHRoZSBvbmUgcGFzcyBgcHJlcGFyZWAgbWFrZXMgaXMgdGhlIG9ubHkgb25lLlxuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vIGBwcmVwYXJlYCBwcmVmZXJzIHRoaXMgbWV0YSBvdmVyIGl0cyBvd24gYHBhcnNlZFVybC5xdWVyeWBcbiAgICAgICAgICAgIC8vIChcIndoZW4gZGVwbG95ZWQgcHJveGllcyB3aWxsIGFkZCBxdWVyeSB2YWx1ZXMgZnJvbSByZXNvbHZpbmcgdGhlXG4gICAgICAgICAgICAvLyByb3V0ZXMgdG8gcGFzcyB0byBmdW5jdGlvblwiKSwgd2hpY2ggaXMgdGhlIGRvY3VtZW50ZWQgZGl2aXNpb24gb2ZcbiAgICAgICAgICAgIC8vIGxhYm91ciBmb3IgYSBwcm94eSBpbiBmcm9udCBvZiBhIGZ1bmN0aW9uIC0gYW5kIGl0IGlzIHRoZSBzYW1lXG4gICAgICAgICAgICAvLyBkaXZpc2lvbiB0aGUgYHJlcS51cmxgIGFib3ZlIHJlbGllcyBvbi4gU2V0dGluZyBpdCBkb2VzIG5vdCBzdG9wXG4gICAgICAgICAgICAvLyB0aGUgc2Vjb25kIHJld3JpdGUgcGFzcywgaXQganVzdCBzdG9wcyB0aGF0IHBhc3MgZnJvbSBiZWluZyB3aGF0XG4gICAgICAgICAgICAvLyB0aGUgcm91dGUgc2Vlcy5cbiAgICAgICAgICAgIHF1ZXJ5OiB7IC4uLmludm9jYXRpb25RdWVyeSB9LFxuICAgICAgICAgICAgLy8gU2V0IG9ubHkgZm9yIGEgY2FwdHVyZSB0aGUgcXVlcnkgY29udHJhY3QgY2Fubm90IGNhcnJ5LCBhbmQgdGhlblxuICAgICAgICAgICAgLy8gaW4gcGxhY2Ugb2YgaXQgcmF0aGVyIHRoYW4gYWxvbmdzaWRlLlxuICAgICAgICAgICAgLi4uKG91dE9mQmFuZCA/IHsgcGFyYW1zOiBvdXRPZkJhbmQucGFyYW1zIH0gOiB7fSksXG4gICAgICAgICAgICAvLyBXaXRob3V0IHRoaXMsIGBSb3V0ZU1vZHVsZS5wcmVwYXJlYCBmYWxscyBiYWNrIHRvXG4gICAgICAgICAgICAvLyBgaHR0cDovL2xvY2FsaG9zdCR7cmVxLnVybH1gIGFuZCBldmVyeSBhYnNvbHV0ZSBVUkwgYSByb3V0ZVxuICAgICAgICAgICAgLy8gaGFuZGxlciBidWlsZHMgaXMgd3JvbmcuIGByZWxhdGl2ZVByb2plY3REaXJgIGlzIGRlbGliZXJhdGVseVxuICAgICAgICAgICAgLy8gKm5vdCogcGFzc2VkOiB0aGUgcnVudGltZSBgY2hkaXJgcyB0byB0aGUgcHJvamVjdCBkaXIsIHNvIHRoZVxuICAgICAgICAgICAgLy8gdmFsdWUgTmV4dC5qcyBpbmxpbmVkIGF0IGJ1aWxkIHRpbWUgKFwiXCIpIGlzIGFscmVhZHkgY29ycmVjdCwgYW5kXG4gICAgICAgICAgICAvLyBgYXBwLXBhZ2UtcnVudGltZS5qc2AgaWdub3JlcyB0aGUgcmVxdWVzdE1ldGEgb3ZlcnJpZGUgYW55d2F5LlxuICAgICAgICAgICAgaW5pdFVSTDogdXJsLmhyZWYsXG4gICAgICAgICAgICAvLyBGZWVkcyBgcm91dGVyU2VydmVyQ29udGV4dC5ob3N0bmFtZWAgKGByb3V0ZS1tb2R1bGUuanNgXG4gICAgICAgICAgICAvLyBgZ2V0Um91dGVyU2VydmVyQ29udGV4dGApLiBJbmNsdWRlcyB0aGUgcG9ydCwgYmVjYXVzZSBpdCBpc1xuICAgICAgICAgICAgLy8gY29uY2F0ZW5hdGVkIGludG8gYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGhvc3RuYW1lOiB1cmwuaG9zdCxcbiAgICAgICAgICAgIC8vIEJvdGggcm91dGVycyBjYWxsIHRoaXMgZm9yIGEgYG5vdEZvdW5kOiB0cnVlYCAvIGBub3RGb3VuZCgpYCB0aGF0XG4gICAgICAgICAgICAvLyB0aGUgZW50cnlwb2ludCBpdHNlbGYgY2Fubm90IHJlbmRlciwgYW5kIGZhbGwgYmFjayB0b1xuICAgICAgICAgICAgLy8gYHJlcy5lbmQoJ1RoaXMgcGFnZSBjb3VsZCBub3QgYmUgZm91bmQnKWAg4oCUIG5vIHN0YXR1cywgbm8gYXBwIDQwNFxuICAgICAgICAgICAgLy8gcGFnZSDigJQgd2hlbiBpdCBpcyBhYnNlbnQuIFRoZSBgcmVxYC9gcmVzYCB0aGV5IHBhc3MgYXJlIHRoZSBvbmVzXG4gICAgICAgICAgICAvLyBoYW5kZWQgaW4ganVzdCBhYm92ZSwgc28gdGhlIGNhcHR1cmVkIHBhaXIgaXMgdXNlZCBpbnN0ZWFkIG9mXG4gICAgICAgICAgICAvLyByZS1kZXJpdmluZyB0aGVtLlxuICAgICAgICAgICAgcmVuZGVyNDA0OiBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgIGF3YWl0IHRoaXMuc2VuZE5vdEZvdW5kKFxuICAgICAgICAgICAgICAgIHJlcSxcbiAgICAgICAgICAgICAgICByZXMsXG4gICAgICAgICAgICAgICAgd2FpdFVudGlsLFxuICAgICAgICAgICAgICAgIHRoaXMuZGlzcGF0Y2hlci5ub3RGb3VuZEZvcih1cmwpLFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIC8vIGByZXMucmV2YWxpZGF0ZSgpYCBmcm9tIGEgUGFnZXMgQVBJIHJvdXRlLiBXaXRob3V0IGl0LCBOZXh0LmpzXG4gICAgICAgICAgICAvLyBmYWxscyBiYWNrIHRvIGBmZXRjaCgnaHR0cHM6Ly8nICsgcmVxLmhlYWRlcnMuaG9zdCArIHVybFBhdGgpYCDigJRcbiAgICAgICAgICAgIC8vIGFuZCBvbmx5IHdoZW4gYGV4cGVyaW1lbnRhbC50cnVzdEhvc3RIZWFkZXJgIGlzIHNldCwgd2hpY2ggaXQgaXNcbiAgICAgICAgICAgIC8vIG5vdCwgc28gYHJlcy5yZXZhbGlkYXRlKClgIHRocmV3XG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy8gICBGYWlsZWQgdG8gcmV2YWxpZGF0ZSAvOiBJbnZhcmlhbnQ6IG1pc3NpbmcgaW50ZXJuYWxcbiAgICAgICAgICAgIC8vICAgcm91dGVyLXNlcnZlci1tZXRob2RzIHRoaXMgaXMgYW4gaW50ZXJuYWwgYnVnXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy8gYW5kIGB0ZXN0L2UyZS9yZXZhbGlkYXRlLXJlYXNvbmAgc2F3IGBzdGFsZWAgd2hlcmUgYG5leHQgc3RhcnRgXG4gICAgICAgICAgICAvLyByZXBvcnRzIGBvbi1kZW1hbmRgOiB0aGUgcm91dGUgc3RpbGwgcmUtcmVuZGVyZWQsIGp1c3QgYXMgYW5cbiAgICAgICAgICAgIC8vIG9yZGluYXJ5IHN0YWxlIHJlZ2VuZXJhdGlvbiByYXRoZXIgdGhhbiB0aGUgb24tZGVtYW5kIG9uZSBpdFxuICAgICAgICAgICAgLy8gYXNrZWQgZm9yLlxuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vIEFuc3dlcmluZyBpdCBpbiBwcm9jZXNzIHJhdGhlciB0aGFuIGJ5IHNldHRpbmdcbiAgICAgICAgICAgIC8vIGB0cnVzdEhvc3RIZWFkZXJgOiB0aGUgZmV0Y2ggcGF0aCB3b3VsZCBsZWF2ZSB0aGUgZnVuY3Rpb24sIGNyb3NzXG4gICAgICAgICAgICAvLyBDbG91ZEZyb250IGFuZCBjb21lIGJhY2sg4oCUIGEgc2Vjb25kIGJpbGxlZCBpbnZvY2F0aW9uLCBhXG4gICAgICAgICAgICAvLyBkZXBlbmRlbmN5IG9uIGB4LXByZXJlbmRlci1yZXZhbGlkYXRlYCBzdXJ2aXZpbmcgdGhlIGVkZ2UsIGFuZCBhXG4gICAgICAgICAgICAvLyByZWFzb24gdG8gdHJ1c3QgYSBjbGllbnQtc3VwcGxpZWQgYEhvc3RgLiBOZXh0LmpzJ3Mgb3duXG4gICAgICAgICAgICAvLyBub24tc2VydmVybGVzcyBhbnN3ZXIgaXMgdGhlIHNhbWUgc2hhcGUgYXMgdGhpcyBvbmVcbiAgICAgICAgICAgIC8vIChgTmV4dFNlcnZlciNyZXZhbGlkYXRlYCBydW5zIGl0cyByZXF1ZXN0IGhhbmRsZXIgYWdhaW5zdCBhXG4gICAgICAgICAgICAvLyBtb2NrZWQgYHJlcWAvYHJlc2ApLlxuICAgICAgICAgICAgcmV2YWxpZGF0ZTogKGNvbmZpZzogUmV2YWxpZGF0ZUNvbmZpZykgPT5cbiAgICAgICAgICAgICAgdGhpcy5yZXZhbGlkYXRlKGNvbmZpZywgcmVxdWVzdCksXG4gICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgICAgIC8vIEEgUGFnZXMgQVBJIHJvdXRlIG93bnMgdGhlIGVuZCBvZiBpdHMgcmVzcG9uc2U6IGBzdHJlYW0ucGlwZShyZXMpYCxcbiAgICAgICAgLy8gYW4gYGV4dGVybmFsUmVzb2x2ZXJgIHByb3h5LCBvciBhIGNhbGxiYWNrIHRoYXQgY2FsbHMgYHJlcy5qc29uKClgXG4gICAgICAgIC8vIGxhdGVyIGFsbCByZXR1cm4gZnJvbSB0aGUgaGFuZGxlciBiZWZvcmUgdGhleSBhcmUgZG9uZSB3cml0aW5nLCBhbmRcbiAgICAgICAgLy8gZW5kaW5nIGhlcmUgc2VudCBhbiBlbXB0eSAyMDAgYW5kIG1hZGUgdGhlaXIgd3JpdGVzIHRocm93XG4gICAgICAgIC8vIGBFUlJfU1RSRUFNX1dSSVRFX0FGVEVSX0VORGAuIGBuZXh0IHN0YXJ0YCdzIGBhcGlSZXNvbHZlcmAgbGVhdmVzIGl0XG4gICAgICAgIC8vIG9wZW4gdG9vIOKAlCBvbmUgdGhhdCBuZXZlciBlbmRzIHN0YWxscywgdGhlcmUgYXMgaGVyZS4gYGhhbmRsZWAgYXdhaXRzXG4gICAgICAgIC8vIHRoZSByZXNwb25zZSBpdHNlbGYsIHNvIG5vdGhpbmcgaXMgY3V0IHNob3J0IGJ5IHJldHVybmluZy5cbiAgICAgICAgaWYgKCFyZXMud3JpdGFibGVFbmRlZCAmJiByZXN1bHQuZW50cnlwb2ludC50eXBlICE9PSBcInBhZ2UtYXBpXCIpIHtcbiAgICAgICAgICByZXMuZW5kKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjYXNlIFwic3RhdGljLWZpbGVcIjoge1xuICAgICAgICBjb25zdCBzdGF0dXNQYWdlID1cbiAgICAgICAgICByZXN1bHQuc291cmNlID09PSBcInNlcnZlclwiXG4gICAgICAgICAgICA/IHRoaXMuc3RhdHVzUGFnZVN0YXR1cyhyZXN1bHQucGF0aG5hbWUpXG4gICAgICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgICAgLy8gYG5leHQgc3RhcnRgIHNlcnZlcyBhIGBwdWJsaWMvYCBvciBgX25leHQvc3RhdGljYCBmaWxlIHRvIEdFVCBhbmRcbiAgICAgICAgLy8gSEVBRCBvbmx5LCBhbmQgYHNlbmRgIHdvdWxkIHNlcnZlIGl0IHRvIGFueSBtZXRob2QuIFRoZSBzYW1lIGdvZXMgZm9yXG4gICAgICAgIC8vIGFuIGF1dG8tZXhwb3J0ZWQgUGFnZXMgUm91dGVyIHBhZ2UgKGBiYXNlLXNlcnZlci5qc2BcbiAgICAgICAgLy8gYHJlbmRlclRvUmVzcG9uc2VXaXRoQ29tcG9uZW50c0ltcGxgOiBhIHN0cmluZyBgQ29tcG9uZW50YCBhbnN3ZXJzXG4gICAgICAgIC8vIGFueXRoaW5nIGVsc2Ugd2l0aCBhIDQwNSksIGV4Y2VwdCB0aGUgNDA0IGFuZCA1MDAgcGFnZXMuXG4gICAgICAgIGlmIChcbiAgICAgICAgICByZXEubWV0aG9kICE9PSBcIkdFVFwiICYmXG4gICAgICAgICAgcmVxLm1ldGhvZCAhPT0gXCJIRUFEXCIgJiZcbiAgICAgICAgICAocmVzdWx0LnNvdXJjZSAhPT0gXCJzZXJ2ZXJcIiB8fFxuICAgICAgICAgICAgKHN0YXR1c1BhZ2UgPT09IHVuZGVmaW5lZCAmJiByZXN1bHQuZmlsZVBhdGguZW5kc1dpdGgoXCIuaHRtbFwiKSkpXG4gICAgICAgICkge1xuICAgICAgICAgIHNlbmRNZXRob2ROb3RBbGxvd2VkKHJlcyk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vIFwiZW5zdXJlIGNvcnJlY3Qgc3RhdHVzIGlzIHNldCB3aGVuIHZpc2l0aW5nIGEgc3RhdHVzIHBhZ2UgZGlyZWN0bHlcIjpcbiAgICAgICAgLy8gYG5leHQgc3RhcnRgIGFuc3dlcnMgYC80MDRgIHdpdGggYSA0MDQgYW5kIGAvNTAwYCB3aXRoIGEgNTAwLCBub3QgdGhlXG4gICAgICAgIC8vIDIwMCB0aGVpciBwcmVyZW5kZXJlZCBIVE1MIHdvdWxkIG90aGVyd2lzZSBnbyBvdXQgd2l0aC5cbiAgICAgICAgaWYgKHN0YXR1c1BhZ2UgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHJlcy5zdGF0dXNDb2RlID0gc3RhdHVzUGFnZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBldGFnID0gdGhpcy5vcHRpb25zLm1hbmlmZXN0LmNvbmZpZy5nZW5lcmF0ZUV0YWdzO1xuICAgICAgICBjb25zdCBwdWJsaWNEaXIgPSBgJHtwdWJsaWNEaXJLZXkodGhpcy5vcHRpb25zLm1hbmlmZXN0KX0vYDtcbiAgICAgICAgY29uc3Qgc2VydmVkID1cbiAgICAgICAgICAoYXdhaXQgc2VydmVTdGF0aWNGaWxlKFxuICAgICAgICAgICAgcmVxLFxuICAgICAgICAgICAgcmVzLFxuICAgICAgICAgICAgdGhpcy5vcHRpb25zLmRlcGxveW1lbnRSb290LFxuICAgICAgICAgICAgcmVzdWx0LmZpbGVQYXRoLFxuICAgICAgICAgICAgeyBldGFnIH0sXG4gICAgICAgICAgKSkgfHxcbiAgICAgICAgICAvLyBMaXN0ZWQgYnV0IG5vdCBzdGFnZWQ6IGEgTGFtYmRhIHJvb3QsIHdob3NlIGBwdWJsaWMvYCBpcyBpbiBTMy5cbiAgICAgICAgICAocmVzdWx0LnNvdXJjZSA9PT0gXCJwdWJsaWNcIiAmJlxuICAgICAgICAgICAgISF0aGlzLnB1YmxpY0J1Y2tldCAmJlxuICAgICAgICAgICAgKGF3YWl0IHNlcnZlUzNQdWJsaWNGaWxlKHJlcSwgcmVzLCB7XG4gICAgICAgICAgICAgIGJ1Y2tldDogdGhpcy5wdWJsaWNCdWNrZXQsXG4gICAgICAgICAgICAgIGtleVByZWZpeDogdGhpcy5vcHRpb25zLmJ1Y2tldEtleVByZWZpeCA/PyBcIlwiLFxuICAgICAgICAgICAgICBmaWxlOiByZXN1bHQuZmlsZVBhdGguc2xpY2UocHVibGljRGlyLmxlbmd0aCksXG4gICAgICAgICAgICAgIGV0YWcsXG4gICAgICAgICAgICB9KSkpO1xuICAgICAgICBpZiAoIXNlcnZlZCkge1xuICAgICAgICAgIC8vIFRoZSByb3V0aW5nIHJ1bGUgdGhhdCBtYXRjaGVkIGEgYnVpbGQgYXNzZXQgYWxyZWFkeSBzZXQgaXRzXG4gICAgICAgICAgLy8geWVhci1sb25nIGBpbW11dGFibGVgIENhY2hlLUNvbnRyb2wsIHdoaWNoIGBzZW5kVW5tYXRjaGVkYFxuICAgICAgICAgIC8vIHJlcGxhY2VzOiB1bmRlciBpdCB0aGUgNDA0IHdvdWxkIGJlIGNhY2hlZCBhdCB0aGUgZWRnZSBhbmQgaW5cbiAgICAgICAgICAvLyBicm93c2VycyBmb3IgdGhhdCBsb25nLCBhbmQgYSBjaHVuayB0aGF0IHNob3dzIHVwIG9uIHRoZSBuZXh0XG4gICAgICAgICAgLy8gZGVwbG95IHdvdWxkIHN0YXkgbWlzc2luZy5cbiAgICAgICAgICBhd2FpdCB0aGlzLnNlbmRVbm1hdGNoZWQocmVxLCByZXMsIHdhaXRVbnRpbCwgcmVzdWx0LCB1cmwpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY2FzZSBcImltYWdlLW9wdGltaXphdGlvblwiOlxuICAgICAgICBpZiAoIXRoaXMuaW1hZ2VzLmlzRW5hYmxlZCgpKSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy5zZW5kVW5tYXRjaGVkKFxuICAgICAgICAgICAgcmVxLFxuICAgICAgICAgICAgcmVzLFxuICAgICAgICAgICAgd2FpdFVudGlsLFxuICAgICAgICAgICAgeyBwYXRobmFtZTogdXJsLnBhdGhuYW1lLCByZXF1ZXN0SGVhZGVyczogcmVzdWx0LnJlcXVlc3RIZWFkZXJzIH0sXG4gICAgICAgICAgICB1cmwsXG4gICAgICAgICAgKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgcmVxLmhlYWRlcnMgPSB0b0luY29taW5nSHR0cEhlYWRlcnMocmVzdWx0LnJlcXVlc3RIZWFkZXJzKTtcbiAgICAgICAgYXdhaXQgdGhpcy5pbWFnZXMuaGFuZGxlKHJlcSwgcmVzLCByZXN1bHQudXJsLCB3YWl0VW50aWwpO1xuICAgICAgICByZXR1cm47XG5cbiAgICAgIGNhc2UgXCJyZWRpcmVjdFwiOlxuICAgICAgICBzZW5kUmVkaXJlY3QocmVzLCByZXN1bHQubG9jYXRpb24sIHJlc3VsdC5zdGF0dXMpO1xuICAgICAgICByZXR1cm47XG5cbiAgICAgIGNhc2UgXCJleHRlcm5hbC1yZXdyaXRlXCI6XG4gICAgICAgIGF3YWl0IHByb3h5RXh0ZXJuYWwocmVxLCByZXMsIHJlc3VsdC51cmwsIHJlc3VsdC5yZXF1ZXN0SGVhZGVycyk7XG4gICAgICAgIHJldHVybjtcblxuICAgICAgY2FzZSBcIm1pZGRsZXdhcmUtcmVzcG9uZGVkXCI6XG4gICAgICAgIGF3YWl0IHNlbmRXZWJSZXNwb25zZShyZXMsIHJlc3VsdC5yZXNwb25zZSk7XG4gICAgICAgIHJldHVybjtcblxuICAgICAgY2FzZSBcInJlc3BvbnNlXCI6XG4gICAgICAgIHJlcy5lbmQoKTtcbiAgICAgICAgcmV0dXJuO1xuXG4gICAgICBjYXNlIFwibm90LWZvdW5kXCI6XG4gICAgICAgIGF3YWl0IHRoaXMuc2VuZFVubWF0Y2hlZChyZXEsIHJlcywgd2FpdFVudGlsLCByZXN1bHQsIHVybCk7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogNDA0IG9yIDUwMCB3aGVuIGBwYXRobmFtZWAgaXMgdGhlIHByZXJlbmRlcmVkIGAvNDA0YCBvciBgLzUwMGAgcGFnZSDigJQgdW5kZXJcbiAgICogYGJhc2VQYXRoYCBhbmQsIGluIGFuIGkxOG4gYXBwLCBhbnkgbG9jYWxlIChgL2ZyLzQwNGApIOKAlCBhbmQgYHVuZGVmaW5lZGBcbiAgICogb3RoZXJ3aXNlLiBgbmV4dCBzdGFydGAgbWF0Y2hlcyB0aGUgcGFnZSwgbm90IHRoZSBVUkwsIHNvIHRoZSBsb2NhbGUgZG9lc1xuICAgKiBub3QgbWF0dGVyLlxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0dXNQYWdlU3RhdHVzKHBhdGhuYW1lOiBzdHJpbmcpOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IHsgYmFzZVBhdGgsIGkxOG4gfSA9IHRoaXMub3B0aW9ucy5tYW5pZmVzdC5jb25maWc7XG4gICAgbGV0IHBhZ2UgPSB3aXRob3V0UGF0aFByZWZpeChwYXRobmFtZSwgYmFzZVBhdGgpO1xuICAgIGNvbnN0IGxvY2FsZXMgPSAoaTE4biBhcyB7IGxvY2FsZXM/OiByZWFkb25seSBzdHJpbmdbXSB9IHwgbnVsbCk/LmxvY2FsZXM7XG4gICAgZm9yIChjb25zdCBsb2NhbGUgb2YgbG9jYWxlcyA/PyBbXSkge1xuICAgICAgY29uc3Qgc3RyaXBwZWQgPSB3aXRob3V0UGF0aFByZWZpeChwYWdlLCBgLyR7bG9jYWxlfWApO1xuICAgICAgaWYgKHN0cmlwcGVkICE9PSBwYWdlKSB7XG4gICAgICAgIHBhZ2UgPSBzdHJpcHBlZDtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChwYWdlID09PSBcIi80MDRcIikgcmV0dXJuIDQwNDtcbiAgICBpZiAocGFnZSA9PT0gXCIvNTAwXCIpIHJldHVybiA1MDA7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBgbmV4dCBzdGFydGAncyBhbnN3ZXIgdG8gYSBwYXRoIG5vdGhpbmcgc2VydmVzIChgcm91dGVyLXNlcnZlci5qc2AsIHRoZVxuICAgKiBcIjQwNCBjYXNlXCIpLCBmb3IgYm90aCB3YXlzIG9mIGdldHRpbmcgaGVyZTogZGlzcGF0Y2ggbWF0Y2hlZCBub3RoaW5nLCBvciBpdFxuICAgKiBtYXRjaGVkIGEgYnVpbGQgYXNzZXQgdGhhdCBpcyBub3QgaW4gdGhlIHBhY2thZ2UuXG4gICAqXG4gICAqIE5vLXN0b3JlLCBhbHdheXMuIEEgcHJlcmVuZGVyZWQgYC9fbm90LWZvdW5kYCB3b3VsZCBvdGhlcndpc2Ugc2VuZCBpdHNcbiAgICogY2FjaGUgZW50cnkncyB5ZWFyLWxvbmcgYHMtbWF4YWdlYCwgYW5kIHRoZSBDRE4gd291bGQga2VlcCB0aGUgNDA0IHBhc3QgdGhlXG4gICAqIGRlcGxveSB0aGF0IGFkZHMgdGhlIHJvdXRlLiBTZXQgcmF0aGVyIHRoYW4gZm9yY2VkOiBOZXh0J3MgcGFnZSBoYW5kbGVyc1xuICAgKiBvbmx5IHdyaXRlIGEgYENhY2hlLUNvbnRyb2xgIHdoZW4gbm9uZSBpcyBzZXQgKGBzZW5kUmVuZGVyUmVzdWx0YCxcbiAgICogYHBhZ2VzLWhhbmRsZXIuanNgKSwgd2hpY2ggaXMgZXhhY3RseSBob3cgYG5leHQgc3RhcnRgJ3Mgb3duIG5vLXN0b3JlIGhlcmVcbiAgICogc3Vydml2ZXMgdGhlIHJlbmRlci4gYHJlbmRlcjQwNGAgaXMgbm90IHRoaXMgcGF0aDogYSBgbm90Rm91bmQoKWAgZnJvbSBhblxuICAgKiBJU1IgcGFnZSBpcyBjYWNoZWFibGUgZm9yIHRoYXQgcGFnZSdzIHJldmFsaWRhdGUgcGVyaW9kLlxuICAgKlxuICAgKiBBIG1pc3NpbmcgYF9uZXh0L3N0YXRpY2AgZmlsZSwgYW5kIGEgR0VUIG9yIEhFQUQgd2hvc2UgYFNlYy1GZXRjaC1EZXN0YFxuICAgKiBzYXlzIGl0IGNhbm5vdCBkaXNwbGF5IEhUTUwgKGFuIGA8aW1nPmAsIGEgc2NyaXB0LCBhIGZvbnQpLCBnZXQgYVxuICAgKiBwbGFpbi10ZXh0IGBOb3QgRm91bmRgIGluc3RlYWQgb2YgdGhlIHJlbmRlcmVkIHBhZ2Ug4oCUIG5vdGhpbmcgd291bGQgc2hvd1xuICAgKiBpdCwgYW5kIHJlbmRlcmluZyBpdCBpcyB0aGUgZXhwZW5zaXZlIHBhcnQuXG4gICAqXG4gICAqIEV2ZXJ5dGhpbmcgZWxzZSByZW5kZXJzIHRoZSBhcHAncyA0MDQgYXMgdGhlIHBhdGggdGhhdCB3YXMgYXNrZWQgZm9yLCBub3RcbiAgICogYXMgYC9fbm90LWZvdW5kYDogdGhlIEFwcCBSb3V0ZXIgc2VyaWFsaXplcyB0aGUgY2Fub25pY2FsIFVSTCBpbnRvIHRoZSBSU0NcbiAgICogcGF5bG9hZCwgc28gYSBjbGllbnQgaHlkcmF0ZWQgb2ZmIGEgYC9fbm90LWZvdW5kYCBwYXlsb2FkIHJlcG9ydHMgdGhlIHdyb25nXG4gICAqIGB1c2VQYXRobmFtZSgpYCBhbmQgcHVzaGVzIHRoZSB3cm9uZyBoaXN0b3J5IGVudHJ5LiBJdCByZW5kZXJzIHdpdGggdGhlXG4gICAqIHJlcXVlc3QgaGVhZGVycyBtaWRkbGV3YXJlIHNldCwgdG9vIOKAlCBhIENTUCBub25jZSwgc2F5LlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBzZW5kVW5tYXRjaGVkKFxuICAgIHJlcTogU2hpbUluY29taW5nTWVzc2FnZSxcbiAgICByZXM6IFNoaW1TZXJ2ZXJSZXNwb25zZSxcbiAgICB3YWl0VW50aWw6IChwcm9taXNlOiBQcm9taXNlPHVua25vd24+KSA9PiB2b2lkLFxuICAgIHJlc3VsdDogeyByZWFkb25seSBwYXRobmFtZTogc3RyaW5nOyByZWFkb25seSByZXF1ZXN0SGVhZGVyczogSGVhZGVycyB9LFxuICAgIHVybDogVVJMLFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXMuc2V0SGVhZGVyKFwiQ2FjaGUtQ29udHJvbFwiLCBOT19TVE9SRSk7XG4gICAgY29uc3QgeyBiYXNlUGF0aCwgYXNzZXRQcmVmaXggfSA9IHRoaXMub3B0aW9ucy5tYW5pZmVzdC5jb25maWc7XG4gICAgY29uc3QgcGF0aG5hbWUgPSB3aXRob3V0UGF0aFByZWZpeChcbiAgICAgIHdpdGhvdXRQYXRoUHJlZml4KHJlc3VsdC5wYXRobmFtZSwgYmFzZVBhdGgpLFxuICAgICAgYXNzZXRQcmVmaXgsXG4gICAgKTtcbiAgICBpZiAoXG4gICAgICBwYXRobmFtZS5zdGFydHNXaXRoKFwiL19uZXh0L3N0YXRpYy9cIikgfHxcbiAgICAgICgocmVxLm1ldGhvZCA9PT0gXCJHRVRcIiB8fCByZXEubWV0aG9kID09PSBcIkhFQURcIikgJiZcbiAgICAgICAgTk9OX0hUTUxfU0VDX0ZFVENIX0RFU1RTLmhhcyhcbiAgICAgICAgICBmaXJzdFZhbHVlKHJlcS5oZWFkZXJzW1wic2VjLWZldGNoLWRlc3RcIl0pID8/IFwiXCIsXG4gICAgICAgICkpXG4gICAgKSB7XG4gICAgICByZXMuc3RhdHVzQ29kZSA9IDQwNDtcbiAgICAgIHJlcy5zZXRIZWFkZXIoXCJDb250ZW50LVR5cGVcIiwgXCJ0ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04XCIpO1xuICAgICAgcmVzLmVuZChcIk5vdCBGb3VuZFwiKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgcmVxLmhlYWRlcnMgPSB0b0luY29taW5nSHR0cEhlYWRlcnMocmVzdWx0LnJlcXVlc3RIZWFkZXJzKTtcbiAgICBhd2FpdCB0aGlzLnNlbmROb3RGb3VuZChcbiAgICAgIHJlcSxcbiAgICAgIHJlcyxcbiAgICAgIHdhaXRVbnRpbCxcbiAgICAgIHRoaXMuZGlzcGF0Y2hlci5ub3RGb3VuZEZvcih1cmwpLFxuICAgICAgYCR7cmVzdWx0LnBhdGhuYW1lfSR7dXJsLnNlYXJjaH1gLFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogT25lIG9uLWRlbWFuZCByZXZhbGlkYXRpb24sIHJ1biBhZ2FpbnN0IHRoaXMgcnVudGltZSByYXRoZXIgdGhhbiBvdmVyIHRoZVxuICAgKiBuZXR3b3JrLiBXaXJlZCBpbiBhcyBgcmVxdWVzdE1ldGEucmV2YWxpZGF0ZWA7IHNlZSB0aGUgY29tbWVudCB0aGVyZS5cbiAgICpcbiAgICogVGhlIHJlc3BvbnNlIGlzIHRocm93biBhd2F5IOKAlCBvbmx5IGl0cyBzdGF0dXMgbWF0dGVycyDigJQgYnV0IGl0IGdvZXMgdGhyb3VnaFxuICAgKiB0aGUgZnVsbCB7QGxpbmsgaGFuZGxlfSwgc28gdGhlIGVudHJ5cG9pbnQgc2VlcyBhIHJlcXVlc3Qgd2l0aFxuICAgKiBgeC1wcmVyZW5kZXItcmV2YWxpZGF0ZWAgb24gaXQgYW5kIHdyaXRlcyB0aGUgZnJlc2ggZW50cnkgdGhyb3VnaCB0aGUgY2FjaGVcbiAgICogaGFuZGxlciBleGFjdGx5IGFzIGEgcmVxdWVzdCBmcm9tIG91dHNpZGUgd291bGQuIGBoYW5kbGVgIGF3YWl0cyBpdHMgb3duXG4gICAqIGB3YWl0VW50aWxgIHdvcmssIHNvIHRoZSBuZXcgZW50cnkgaXMgY29tbWl0dGVkIGJlZm9yZSBgcmVzLnJldmFsaWRhdGUoKWBcbiAgICogcmVzb2x2ZXMsIHdoaWNoIGlzIHdoYXQgY2FsbGVycyB0aGF0IHJldmFsaWRhdGUgYW5kIHRoZW4gcmVkaXJlY3QgZGVwZW5kIG9uLlxuICAgKlxuICAgKiBUaGUgYWNjZXB0L3Rocm93IHJ1bGUgaXMgYE5leHRTZXJ2ZXIjcmV2YWxpZGF0ZWAncywgdmVyYmF0aW06IGEgcmV2YWxpZGF0aW9uXG4gICAqIGlzIHN1Y2Nlc3NmdWwgaWYgaXQgd2FzIGNhY2hlZCBvciBhbnN3ZXJlZCAyMDAsIGFuZCBgbm90Rm91bmQ6IHRydWVgXG4gICAqIGxlZ2l0aW1hdGVseSBhbnN3ZXJzIDQwNCBmb3IgYW4gYHVuc3RhYmxlX29ubHlHZW5lcmF0ZWRgIGNhbGxlci4gQW55dGhpbmdcbiAgICogZWxzZSB0aHJvd3MsIGFuZCBgcmVzLnJldmFsaWRhdGUoKWAgdHVybnMgaXQgaW50byBgRmFpbGVkIHRvIHJldmFsaWRhdGVcbiAgICogPHBhdGg+OiA8bWVzc2FnZT5gLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyByZXZhbGlkYXRlKFxuICAgIGNvbmZpZzogUmV2YWxpZGF0ZUNvbmZpZyxcbiAgICBvcmlnaW46IFJ1bnRpbWVSZXF1ZXN0LFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB7IGhlYWQsIG90aGVyR3JvdXAgfSA9IGF3YWl0IHRoaXMuaGFuZGxlSW50ZXJuYWxseShcbiAgICAgIHtcbiAgICAgICAgbWV0aG9kOiBcIkdFVFwiLFxuICAgICAgICB1cmw6IGNvbmZpZy51cmxQYXRoLFxuICAgICAgICAvLyBUaGUgY2FsbGVyJ3MgYXV0aG9yaXR5LCBub3QgdGhlIHJldmFsaWRhdGVkIHBhdGgnczogaXQgaXMgd2hhdFxuICAgICAgICAvLyBgYWJzb2x1dGVVcmxgIGJ1aWxkcyB0aGUgcmVxdWVzdCBVUkwgZnJvbSwgYW5kIGEgcmV2YWxpZGF0aW9uIGlzIGZvclxuICAgICAgICAvLyB0aGUgb3JpZ2luIGJlaW5nIHNlcnZlZC4gVGhlIGZvcndhcmRlZCBwYWlyIHdpdGggaXQg4oCUIGJlaGluZFxuICAgICAgICAvLyBDbG91ZEZyb250IGBob3N0YCBpcyB0aGUgRnVuY3Rpb24gVVJMLCBhbmQgYSByZW5kZXIgdGhhdCBidWlsdCBpdHNcbiAgICAgICAgLy8gYWJzb2x1dGUgVVJMcyBmcm9tIHRoYXQgd291bGQgY2FjaGUgbGlua3MgdG8gdGhlIHJhdyBmdW5jdGlvbi5cbiAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgIC4uLmNvbmZpZy5oZWFkZXJzLFxuICAgICAgICAgIGhvc3Q6IG9yaWdpbi5oZWFkZXJzLmhvc3QsXG4gICAgICAgICAgLi4ucGlja0RlZmluZWQob3JpZ2luLmhlYWRlcnMsIFtcbiAgICAgICAgICAgIFwieC1mb3J3YXJkZWQtaG9zdFwiLFxuICAgICAgICAgICAgXCJ4LWZvcndhcmRlZC1wcm90b1wiLFxuICAgICAgICAgIF0pLFxuICAgICAgICB9LFxuICAgICAgICBlbmNyeXB0ZWQ6IG9yaWdpbi5lbmNyeXB0ZWQsXG4gICAgICAgIHRydXN0Rm9yd2FyZGVkSG9zdDogb3JpZ2luLnRydXN0Rm9yd2FyZGVkSG9zdCxcbiAgICAgIH0sXG4gICAgICB7fSxcbiAgICApO1xuXG4gICAgY29uc3Qgc3RhdHVzID0gaGVhZD8uc3RhdHVzQ29kZSA/PyA1MDA7XG4gICAgaWYgKG90aGVyR3JvdXApIHtcbiAgICAgIGNvbnN0IHNlbGYgPSBwcm9jZXNzLmVudltGVU5DVElPTl9HUk9VUF9FTlZfVkFSXTtcbiAgICAgIC8vIEEgcGFnZSBwYWNrYWdlZCBpbnRvIGFub3RoZXIgYGZ1bmN0aW9uR3JvdXBzYCBncm91cDogaXQgaXMgcmVuZGVyZWQgaW5cbiAgICAgIC8vIHByb2Nlc3MsIGFuZCB0aGlzIGZ1bmN0aW9uIGRvZXMgbm90IGhhdmUgdGhlIHBhZ2UncyBjb2RlLiBDaGVja2VkXG4gICAgICAvLyBmaXJzdCBiZWNhdXNlIGl0IHJlbmRlcnMgYXMgYSA0MDQsIHdoaWNoIGB1bnN0YWJsZV9vbmx5R2VuZXJhdGVkYFxuICAgICAgLy8gd291bGQgb3RoZXJ3aXNlIGFjY2VwdC5cbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYEludmFsaWQgcmVzcG9uc2UgJHtzdGF0dXN9OiBcIiR7Y29uZmlnLnVybFBhdGh9XCIgYmVsb25ncyB0byBgICtcbiAgICAgICAgICBgXFxgZnVuY3Rpb25Hcm91cHNcXGAgZ3JvdXAgXCIke290aGVyR3JvdXAub3duZXJ9XCIsIGFuZCBgICtcbiAgICAgICAgICBgcmVzLnJldmFsaWRhdGUoKSBjYW4gb25seSByZXZhbGlkYXRlIHBhZ2VzIGluIHRoZSBncm91cCBpdCBydW5zIGAgK1xuICAgICAgICAgIGBpbiAoXCIke3NlbGZ9XCIpLiBDYWxsIGl0IGZyb20gYW4gQVBJIHJvdXRlIGluIGdyb3VwIGAgK1xuICAgICAgICAgIGBcIiR7b3RoZXJHcm91cC5vd25lcn1cIiwgb3IgdXNlIHJldmFsaWRhdGVQYXRoKCkvcmV2YWxpZGF0ZVRhZygpLCBgICtcbiAgICAgICAgICBgd2hpY2ggd29yayBmcm9tIGFueSBncm91cC5gLFxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKFxuICAgICAgaGVhZD8uaGVhZGVyc1tcIngtbmV4dGpzLWNhY2hlXCJdICE9PSBcIlJFVkFMSURBVEVEXCIgJiZcbiAgICAgIHN0YXR1cyAhPT0gMjAwICYmXG4gICAgICAhKHN0YXR1cyA9PT0gNDA0ICYmIGNvbmZpZy5vcHRzLnVuc3RhYmxlX29ubHlHZW5lcmF0ZWQpXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgcmVzcG9uc2UgJHtzdGF0dXN9YCk7XG4gICAgfVxuXG4gICAgYXdhaXQgaW52YWxpZGF0ZVJldmFsaWRhdGVkUGFnZShjb25maWcudXJsUGF0aCwgdGhpcy5vcHRpb25zLm1hbmlmZXN0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBbiBpbWFnZSBvcHRpbWl6YXRpb24gc291cmNlIHRoYXQgaXMgbm90IGEgZmlsZTogYDxJbWFnZSBzcmM9XCIvYXBpL2F2YXRhclwiPmBcbiAgICogc2VydmVkIGJ5IGEgcm91dGUgaGFuZGxlci4gV2lyZWQgaW4gYXMgdGhlIG9wdGltaXplcidzIGBmZXRjaEludGVybmFsYCwgYW5kXG4gICAqIHJ1biBpbiBwcm9jZXNzIGZvciB0aGUgcmVhc29ucyB7QGxpbmsgcmV2YWxpZGF0ZX0gaXMg4oCUIGBuZXh0IHN0YXJ0YCBmZXRjaGVzXG4gICAqIHRoZSBzb3VyY2UgZnJvbSBpdHNlbGYgb3ZlciBsb29wYmFjaywgd2hpY2ggaGVyZSB3b3VsZCBiZSBhIHNlY29uZCBiaWxsZWRcbiAgICogaW52b2NhdGlvbiB0aHJvdWdoIENsb3VkRnJvbnQuXG4gICAqXG4gICAqIE9ubHkgdGhlIGF1dGhvcml0eSBpcyBmb3J3YXJkZWQsIGFzIGBuZXh0IHN0YXJ0YCdzIGBmZXRjaEludGVybmFsSW1hZ2VgXG4gICAqIGZvcndhcmRzIG5vbmUgb2YgdGhlIHZpZXdlcidzIGhlYWRlcnM6IHRoZSBzb3VyY2UgaXMgY2FjaGVkIGFuZCBzZXJ2ZWQgdG9cbiAgICogZXZlcnlvbmUsIHNvIGl0IG11c3Qgbm90IGRlcGVuZCBvbiBvbmUgdmlld2VyJ3MgY29va2llcy5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZmV0Y2hJbnRlcm5hbChcbiAgICBocmVmOiBzdHJpbmcsXG4gICAgcmVxOiBTaGltSW5jb21pbmdNZXNzYWdlLFxuICAgIG1heGltdW1Cb2R5OiBudW1iZXIsXG4gICk6IFByb21pc2U8SW50ZXJuYWxJbWFnZVJlc3BvbnNlPiB7XG4gICAgY29uc3QgcmVxdWVzdDogUnVudGltZVJlcXVlc3QgPSB7XG4gICAgICBtZXRob2Q6IFwiR0VUXCIsXG4gICAgICB1cmw6IGhyZWYsXG4gICAgICBoZWFkZXJzOiBwaWNrRGVmaW5lZChyZXEuaGVhZGVycywgW1xuICAgICAgICBcImhvc3RcIixcbiAgICAgICAgXCJ4LWZvcndhcmRlZC1ob3N0XCIsXG4gICAgICAgIFwieC1mb3J3YXJkZWQtcHJvdG9cIixcbiAgICAgIF0pLFxuICAgICAgZW5jcnlwdGVkOiAocmVxLnNvY2tldCBhcyB7IGVuY3J5cHRlZD86IGJvb2xlYW4gfSB8IHVuZGVmaW5lZCk/LmVuY3J5cHRlZCxcbiAgICAgIHRydXN0Rm9yd2FyZGVkSG9zdDogcmVxLnRydXN0Rm9yd2FyZGVkSG9zdCxcbiAgICB9O1xuICAgIGNvbnN0IHsgaGVhZCwgYm9keSwgb3RoZXJHcm91cCwgdG9vTGFyZ2UgfSA9IGF3YWl0IHRoaXMuaGFuZGxlSW50ZXJuYWxseShcbiAgICAgIHJlcXVlc3QsXG4gICAgICB7IG1heGltdW1Cb2R5IH0sXG4gICAgKTtcbiAgICBpZiAodG9vTGFyZ2UpIHtcbiAgICAgIHJldHVybiB7IHN0YXR1c0NvZGU6IDAsIGhlYWRlcnM6IHt9LCBib2R5OiBCdWZmZXIuYWxsb2MoMCksIHRvb0xhcmdlIH07XG4gICAgfVxuICAgIGlmIChvdGhlckdyb3VwKSB7XG4gICAgICAvLyBUaGUgZWRnZSBzZW5kcyBldmVyeSBgL19uZXh0L2ltYWdlYCByZXF1ZXN0IHRvIHRoZSBkZWZhdWx0IGdyb3VwLCBhbmRcbiAgICAgIC8vIHRoZSBzb3VyY2UgaXMgcmVuZGVyZWQgaW4gcHJvY2Vzcywgc28gYSByb3V0ZSBwYWNrYWdlZCBpbnRvIGFub3RoZXJcbiAgICAgIC8vIGdyb3VwIGlzIG91dCBvZiByZWFjaDogdGhlIG9wdGltaXplciBhbnN3ZXJzIChhbmQgbG9ncykgYSA1MDIuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBzdGF0dXNDb2RlOiAwLFxuICAgICAgICBoZWFkZXJzOiB7fSxcbiAgICAgICAgYm9keTogQnVmZmVyLmFsbG9jKDApLFxuICAgICAgICBvdGhlckdyb3VwOiBvdGhlckdyb3VwLm93bmVyLFxuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIHN0YXR1c0NvZGU6IGhlYWQ/LnN0YXR1c0NvZGUgPz8gMCxcbiAgICAgIGhlYWRlcnM6IGhlYWQ/LmhlYWRlcnMgPz8ge30sXG4gICAgICBib2R5LFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogT25lIHJlcXVlc3QgdGhyb3VnaCB7QGxpbmsgaGFuZGxlfSwgYW5zd2VyZWQgdG8gdGhpcyBydW50aW1lIGluc3RlYWQgb2YgYVxuICAgKiBjbGllbnQ6IHRoZSBoZWFkLCB0aGUgYm9keSB3aGVuIGl0IGlzIHdhbnRlZCwgYW5kIHRoZSBlcnJvciB3aGVuIHRoZSByb3V0ZVxuICAgKiBpcyBwYWNrYWdlZCBpbnRvIGFub3RoZXIgYGZ1bmN0aW9uR3JvdXBzYCBncm91cC4gYGhhbmRsZWAgYXdhaXRzIHRoZVxuICAgKiByZXF1ZXN0J3MgYHdhaXRVbnRpbGAgd29yayB0b28sIHNvIHdoYXRldmVyIHRoZSByZW5kZXIgd3JvdGUgaXMgY29tbWl0dGVkIGJ5XG4gICAqIHRoZSB0aW1lIHRoaXMgcmVzb2x2ZXMuXG4gICAqXG4gICAqIFRoZSBib2R5IGlzIGtlcHQgb25seSB3aGVuIGBtYXhpbXVtQm9keWAgaXMgc2V0LiBPbmUgcGFzdCBpdCBmYWlscyB0aGVcbiAgICogcmVzcG9uc2Ugc3RyZWFtLCB3aGljaCBzdG9wcyB0aGUgcm91dGUgd3JpdGluZywgYW5kIGNvbWVzIGJhY2sgYXNcbiAgICogYHRvb0xhcmdlYCByYXRoZXIgdGhhbiBoZWxkIGluIG1lbW9yeS5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgaGFuZGxlSW50ZXJuYWxseShcbiAgICByZXF1ZXN0OiBSdW50aW1lUmVxdWVzdCxcbiAgICBvcHRpb25zOiB7IHJlYWRvbmx5IG1heGltdW1Cb2R5PzogbnVtYmVyIH0sXG4gICk6IFByb21pc2U8e1xuICAgIGhlYWQ/OiBSZXNwb25zZUhlYWQ7XG4gICAgYm9keTogQnVmZmVyO1xuICAgIG90aGVyR3JvdXA/OiBSb3V0ZUluT3RoZXJHcm91cEVycm9yO1xuICAgIHRvb0xhcmdlOiBib29sZWFuO1xuICB9PiB7XG4gICAgbGV0IGhlYWQ6IFJlc3BvbnNlSGVhZCB8IHVuZGVmaW5lZDtcbiAgICBjb25zdCBjaHVua3M6IEJ1ZmZlcltdID0gW107XG4gICAgbGV0IHNpemUgPSAwO1xuICAgIGxldCB0b29MYXJnZSA9IGZhbHNlO1xuICAgIGxldCBvdGhlckdyb3VwOiBSb3V0ZUluT3RoZXJHcm91cEVycm9yIHwgdW5kZWZpbmVkO1xuICAgIGNvbnN0IG9uUm91dGVJbk90aGVyR3JvdXAgPSAoZXJyb3I6IFJvdXRlSW5PdGhlckdyb3VwRXJyb3IpID0+IHtcbiAgICAgIG90aGVyR3JvdXAgPSBlcnJvcjtcbiAgICB9O1xuICAgIGF3YWl0IHRoaXMuaGFuZGxlKFxuICAgICAgeyAuLi5yZXF1ZXN0LCBvblJvdXRlSW5PdGhlckdyb3VwIH0sXG4gICAgICB7XG4gICAgICAgIGJlZ2luKHJlc3BvbnNlSGVhZCkge1xuICAgICAgICAgIGhlYWQgPSByZXNwb25zZUhlYWQ7XG4gICAgICAgICAgcmV0dXJuIG5ldyBXcml0YWJsZSh7XG4gICAgICAgICAgICB3cml0ZShjaHVuazogQnVmZmVyLCBfZW5jb2RpbmcsIGNhbGxiYWNrKSB7XG4gICAgICAgICAgICAgIGlmIChvcHRpb25zLm1heGltdW1Cb2R5ID09PSB1bmRlZmluZWQpIHJldHVybiBjYWxsYmFjaygpO1xuICAgICAgICAgICAgICBzaXplICs9IGNodW5rLmJ5dGVMZW5ndGg7XG4gICAgICAgICAgICAgIGlmIChzaXplID4gb3B0aW9ucy5tYXhpbXVtQm9keSkge1xuICAgICAgICAgICAgICAgIHRvb0xhcmdlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2sobmV3IEVycm9yKFwiT3ZlciBpbWFnZXMubWF4aW11bVJlc3BvbnNlQm9keVwiKSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgY2h1bmtzLnB1c2goQnVmZmVyLmZyb20oY2h1bmspKTtcbiAgICAgICAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGhlYWQsXG4gICAgICBib2R5OiB0b29MYXJnZSA/IEJ1ZmZlci5hbGxvYygwKSA6IEJ1ZmZlci5jb25jYXQoY2h1bmtzKSxcbiAgICAgIG90aGVyR3JvdXAsXG4gICAgICB0b29MYXJnZSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEFwcCBSb3V0ZXIgYnVpbGRzIGFuIGludm9jYWJsZSBgL19ub3QtZm91bmRgLCBQYWdlcyBSb3V0ZXIgYSBwcmVyZW5kZXJlZFxuICAgKiBgNDA0Lmh0bWxgIChwZXIgbG9jYWxlIHVuZGVyIGkxOG4pIG9yIGVsc2UgYC9fZXJyb3JgOyBzZWUgYHN0YXR1c1RhcmdldHNgLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBzZW5kTm90Rm91bmQoXG4gICAgcmVxOiBTaGltSW5jb21pbmdNZXNzYWdlLFxuICAgIHJlczogU2hpbVNlcnZlclJlc3BvbnNlLFxuICAgIHdhaXRVbnRpbDogKHByb21pc2U6IFByb21pc2U8dW5rbm93bj4pID0+IHZvaWQsXG4gICAgdGFyZ2V0OiBTdGF0dXNUYXJnZXQsXG4gICAgLyoqXG4gICAgICogV2hhdCB0byByZW5kZXIgdGhlIDQwNCBhcy4gT21pdHRlZCBieSBgcmVuZGVyNDA0YCwgd2hpY2ggaXMgY2FsbGVkXG4gICAgICogbWlkLXJlbmRlciB3aXRoIGByZXEudXJsYCBhbHJlYWR5IHBvaW50aW5nIGF0IHRoZSByb3V0ZSB0aGF0IGdhdmUgdXAg4oCUXG4gICAgICogdGhlIHBhdGggTmV4dC5qcyB3b3VsZCByZW5kZXIgdGhhdCA0MDQgZm9yLlxuICAgICAqL1xuICAgIHJlcXVlc3RlZFVybD86IHN0cmluZyxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmVzLnN0YXR1c0NvZGUgPSA0MDQ7XG5cbiAgICBpZiAodGFyZ2V0LmtpbmQgPT09IFwiZW50cnlwb2ludFwiKSB7XG4gICAgICBjb25zdCBoYW5kbGVyID0gYXdhaXQgdGhpcy5lbnRyeXBvaW50cy5sb2FkKHRhcmdldC5lbnRyeXBvaW50KTtcbiAgICAgIHJlcS51cmwgPSByZXF1ZXN0ZWRVcmwgPz8gcmVxLnVybDtcbiAgICAgIGF3YWl0IGhhbmRsZXIocmVxLCBhc1NlcnZlclJlc3BvbnNlKHJlcyksIHsgd2FpdFVudGlsIH0pO1xuICAgICAgaWYgKCFyZXMud3JpdGFibGVFbmRlZCkge1xuICAgICAgICByZXMuZW5kKCk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgdGFyZ2V0LmtpbmQgPT09IFwic3RhdGljLWZpbGVcIiAmJlxuICAgICAgKGF3YWl0IHRoaXMuc2VuZEh0bWxGaWxlKHJlcywgdGFyZ2V0KSlcbiAgICApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICByZXMuc2V0SGVhZGVyKFwiQ29udGVudC1UeXBlXCIsIFwidGV4dC9wbGFpbjsgY2hhcnNldD11dGYtOFwiKTtcbiAgICByZXMuZW5kKFwiVGhpcyBwYWdlIGNvdWxkIG5vdCBiZSBmb3VuZC5cIik7XG4gIH1cblxuICAvKipcbiAgICogVHVybiBhIHRocm93biBlcnJvciBpbnRvIGEgcmVzcG9uc2UsIHJlbmRlcmluZyB0aGUgYXBwJ3MgZXJyb3IgcGFnZSB3aGVuIGl0XG4gICAqIGhhcyBvbmUuXG4gICAqXG4gICAqIE5leHQuanMncyBvd24gcGFnZSBoYW5kbGVycyBjYXRjaCwgcmVwb3J0IGFuZCB0aGVuICpyZXRocm93KiAoXCJyZXRocm93IHNvXG4gICAqIHRoYXQgd2UgY2FuIGhhbmRsZSBzZXJ2aW5nIGVycm9yIHBhZ2VcIiwgYHBhZ2VzLWhhbmRsZXIudHNgKSwgd2hpY2ggbWFrZXMgdGhlXG4gICAqIGVycm9yIHBhZ2UgdGhlIGhvc3QncyBqb2Ig4oCUIHRoZSBzYW1lIGRpdmlzaW9uIG9mIGxhYm9yIGFzIGByZW5kZXI0MDRgLiBXaXRob3V0XG4gICAqIHRoaXMgbGFkZGVyIGV2ZXJ5IHRocm93IGFuc3dlcmVkIGEgYmFyZSBgdGV4dC9wbGFpbmAgNTAwIGFuZCBhIGN1c3RvbVxuICAgKiBgcGFnZXMvX2Vycm9yYCB3YXMgZGVhZCBjb2RlIChgdGVzdC9lMmUvYXN5bmMtbW9kdWxlc2AsIHdob3NlIGAvbWFrZS1lcnJvcmBcbiAgICogdGhyb3dzIGluIGBnZXRTZXJ2ZXJTaWRlUHJvcHNgKS5cbiAgICpcbiAgICogT25jZSB0aGUgaGVhZCBpcyBvdXQgdGhlcmUgaXMgbm90aGluZyB0byBzYXkg4oCUIGRlc3Ryb3lpbmcgdGhlIHN0cmVhbSBpcyB3aGF0XG4gICAqIHRlbGxzIHRoZSBjbGllbnQgdGhlIHJlc3BvbnNlIGlzIHRydW5jYXRlZCByYXRoZXIgdGhhbiBjb21wbGV0ZS5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgc2VuZEVycm9yKFxuICAgIHJlcTogU2hpbUluY29taW5nTWVzc2FnZSxcbiAgICByZXM6IFNoaW1TZXJ2ZXJSZXNwb25zZSxcbiAgICB3YWl0VW50aWw6IChwcm9taXNlOiBQcm9taXNlPHVua25vd24+KSA9PiB2b2lkLFxuICAgIGVycm9yOiB1bmtub3duLFxuICAgIC8qKiBUaGUgcmVxdWVzdCwgYXMgcmVjZWl2ZWQ6IHdoaWNoIGxvY2FsZSdzIHByZXJlbmRlcmVkIDUwMCB0byBzZW5kLiAqL1xuICAgIHVybDogVVJMIHwgdW5kZWZpbmVkLFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zb2xlLmVycm9yKFwiVW5oYW5kbGVkIGVycm9yIHdoaWxlIGhhbmRsaW5nIHRoZSByZXF1ZXN0OlwiLCBlcnJvcik7XG4gICAgaWYgKHJlcy5oZWFkZXJzU2VudCkge1xuICAgICAgcmVzLmRlc3Ryb3koYXNFcnJvcihlcnJvcikpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICByZXMuc3RhdHVzQ29kZSA9IDUwMDtcbiAgICAvLyBBIGZhaWxlZCByZW5kZXIgbWF5IGhhdmUgc2V0IGhlYWRlcnMgZGVzY3JpYmluZyBhIGJvZHkgdGhhdCBuZXZlclxuICAgIC8vIGFycml2ZWQuIEV2ZXJ5IHJ1bmcgYmVsb3cgc2VuZHMgYSBkaWZmZXJlbnQgYm9keSwgc28gdGhleSBnbyBmaXJzdDogYVxuICAgIC8vIHN0YWxlIGBDb250ZW50LUxlbmd0aGAgb24gYSA1MDAuaHRtbCBvZiBhbm90aGVyIHNpemUgaGFuZ3MgdGhlIGNsaWVudCBvclxuICAgIC8vIGRlc3luY3MgYSBrZWVwLWFsaXZlIGNvbm5lY3Rpb24uXG4gICAgcmVzLnJlbW92ZUhlYWRlcihcIkNvbnRlbnQtTGVuZ3RoXCIpO1xuICAgIHJlcy5yZW1vdmVIZWFkZXIoXCJFVGFnXCIpO1xuICAgIC8vIEV2ZXJ5IHJ1bmcsIHRoZSBlcnJvci1wYWdlIGVudHJ5cG9pbnQgaW5jbHVkZWQ6IG90aGVyd2lzZSB0aGUgdGhyb3dpbmdcbiAgICAvLyByZW5kZXIncyBgcy1tYXhhZ2VgIChvciBhIGBoZWFkZXJzKClgIHJ1bGUncykgcmlkZXMgYWxvbmcgYW5kIENsb3VkRnJvbnRcbiAgICAvLyBjYWNoZXMgdGhlIDUwMC4gYG5leHQgc3RhcnRgIHNldHMgaXQgYmVmb3JlIHJlbmRlcmluZyB0aGUgZXJyb3IgcGFnZSB0b28uXG4gICAgcmVzLnNldEhlYWRlcihcIkNhY2hlLUNvbnRyb2xcIiwgTk9fU1RPUkUpO1xuICAgIGNvbnN0IHRhcmdldCA9IHRoaXMuZXJyb3JUYXJnZXRGb3IodXJsKTtcblxuICAgIGlmICh0YXJnZXQua2luZCA9PT0gXCJlbnRyeXBvaW50XCIpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGhhbmRsZXIgPSBhd2FpdCB0aGlzLmVudHJ5cG9pbnRzLmxvYWQodGFyZ2V0LmVudHJ5cG9pbnQpO1xuICAgICAgICAvLyBgcmVxLnVybGAgaXMgbGVmdCBhbG9uZTogdGhlIGVycm9yIHBhZ2UgcmVuZGVycyBmb3IgdGhlIFVSTCB0aGF0IHdhc1xuICAgICAgICAvLyBhc2tlZCBmb3IsIGFuZCBgX2Vycm9yYCdzIGBnZXRJbml0aWFsUHJvcHNgIHJlYWRzIHRoZSBzdGF0dXMgb2ZmIGByZXNgLFxuICAgICAgICAvLyB3aGljaCBpcyB3aHkgdGhlIDUwMCBhYm92ZSBpcyBzZXQgZmlyc3QuXG4gICAgICAgIGF3YWl0IGhhbmRsZXIocmVxLCBhc1NlcnZlclJlc3BvbnNlKHJlcyksIHsgd2FpdFVudGlsIH0pO1xuICAgICAgICBpZiAoIXJlcy53cml0YWJsZUVuZGVkKSB7XG4gICAgICAgICAgcmVzLmVuZCgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybjtcbiAgICAgIH0gY2F0Y2ggKGVycm9yUGFnZUVycm9yKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgXCJUaGUgZXJyb3IgcGFnZSBpdHNlbGYgZmFpbGVkIHRvIHJlbmRlcjpcIixcbiAgICAgICAgICBlcnJvclBhZ2VFcnJvcixcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKHJlcy5oZWFkZXJzU2VudCkge1xuICAgICAgICAgIHJlcy5kZXN0cm95KGFzRXJyb3IoZXJyb3JQYWdlRXJyb3IpKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICB0YXJnZXQua2luZCA9PT0gXCJzdGF0aWMtZmlsZVwiICYmXG4gICAgICAoYXdhaXQgdGhpcy5zZW5kSHRtbEZpbGUocmVzLCB0YXJnZXQpKVxuICAgICkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIEFnYWluOiBhbiBlcnJvciBwYWdlIHRoYXQgdGhyZXcgbWF5IGhhdmUgZGVzY3JpYmVkIGl0cyBvd24gYm9keSB0b28uXG4gICAgcmVzLnJlbW92ZUhlYWRlcihcIkNvbnRlbnQtTGVuZ3RoXCIpO1xuICAgIHJlcy5yZW1vdmVIZWFkZXIoXCJFVGFnXCIpO1xuICAgIHJlcy5zdGF0dXNDb2RlID0gNTAwO1xuICAgIHJlcy5zZXRIZWFkZXIoXCJDb250ZW50LVR5cGVcIiwgXCJ0ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04XCIpO1xuICAgIHJlcy5zZXRIZWFkZXIoXCJDYWNoZS1Db250cm9sXCIsIE5PX1NUT1JFKTtcbiAgICByZXMuZW5kKFwiSW50ZXJuYWwgU2VydmVyIEVycm9yXCIpO1xuICB9XG5cbiAgLyoqXG4gICAqIEEgcHJlcmVuZGVyZWQgNDA0IG9yIDUwMCBwYWdlLCBvciBgZmFsc2VgIHdoZW4gaXQgY2Fubm90IGJlIHJlYWQgYW5kIHRoZVxuICAgKiBjYWxsZXIncyBwbGFpbi10ZXh0IGZhbGxiYWNrIHNob3VsZCBhbnN3ZXIuIFJlYWQgcmF0aGVyIHRoYW4gYHNlcnZlU3RhdGljYCxcbiAgICogd2hpY2gga2VlcHMgdGhlIHN0YXR1cyBhbHJlYWR5IHNldCBidXQgd291bGQgYW5zd2VyIGEgYFJhbmdlYCByZXF1ZXN0IHdpdGhcbiAgICogYSAyMDYgb2YgdGhlIGVycm9yIHBhZ2UsIGFuZCBhZGQgYEVUYWdgLCBgTGFzdC1Nb2RpZmllZGAgYW5kLCB3aGVyZSBub25lIGlzXG4gICAqIHNldCB5ZXQsIGEgcHVibGljIGBDYWNoZS1Db250cm9sYCB0byBpdC5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgc2VuZEh0bWxGaWxlKFxuICAgIHJlczogU2hpbVNlcnZlclJlc3BvbnNlLFxuICAgIHRhcmdldDogeyByZWFkb25seSBmaWxlUGF0aDogc3RyaW5nIH0sXG4gICk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGxldCBodG1sOiBCdWZmZXI7XG4gICAgdHJ5IHtcbiAgICAgIGh0bWwgPSBhd2FpdCByZWFkRmlsZShqb2luKHRoaXMub3B0aW9ucy5kZXBsb3ltZW50Um9vdCwgdGFyZ2V0LmZpbGVQYXRoKSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJlcy5zZXRIZWFkZXIoXCJDb250ZW50LVR5cGVcIiwgXCJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLThcIik7XG4gICAgcmVzLmVuZChodG1sKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxufVxuXG4vKipcbiAqIFdoYXQgbmV4dCBzZW5kcyB3aXRoIGFuIGVycm9yIGl0IHJlbmRlcmVkIGl0c2VsZi4gV2l0aG91dCBpdCBhIGBDYWNoZS1Db250cm9sYFxuICogbGVmdCBiZWhpbmQgYnkgdGhlIHJlbmRlciB0aGF0IHRocmV3IGNhbiBnZXQgYSA1MDAgY2FjaGVkIGF0IHRoZSBlZGdlLlxuICovXG5jb25zdCBOT19TVE9SRSA9IFwicHJpdmF0ZSwgbm8tY2FjaGUsIG5vLXN0b3JlLCBtYXgtYWdlPTAsIG11c3QtcmV2YWxpZGF0ZVwiO1xuXG4vKipcbiAqIGBTZWMtRmV0Y2gtRGVzdGAgdmFsdWVzIHRoYXQgY2FuIG5ldmVyIGRpc3BsYXkgYW4gSFRNTCByZXNwb25zZSwgZnJvbVxuICogYG5leHQvZGlzdC9zZXJ2ZXIvbGliL2lzLW5vbi1odG1sLXNlYy1mZXRjaC1kZXN0LmpzYC4gUmVzdGF0ZWQgcmF0aGVyIHRoYW5cbiAqIHJlcXVpcmVkLCBiZWNhdXNlIHRoYXQgbW9kdWxlIGlzIHJlY2VudCBhbmQgdGhlIGFwcCdzIGBuZXh0YCBtYXkgcHJlZGF0ZSBpdDpcbiAqIGEgZmFpbGVkIHJlcXVpcmUgaGVyZSB3b3VsZCB0dXJuIGV2ZXJ5IDQwNCBpbnRvIGEgNTAwLiBFeGNsdWRlcyBgZG9jdW1lbnRgLFxuICogYGlmcmFtZWAgYW5kIHRoZSBsaWtlLCBhbmQgYGVtcHR5YCDigJQgYGZldGNoKClgLCB3aGljaCBpcyBob3cgUlNDIHJlcXVlc3RzIGdvLlxuICovXG5jb25zdCBOT05fSFRNTF9TRUNfRkVUQ0hfREVTVFM6IFJlYWRvbmx5U2V0PHN0cmluZz4gPSBuZXcgU2V0KFtcbiAgXCJhdWRpb1wiLFxuICBcImF1ZGlvd29ya2xldFwiLFxuICBcImZvbnRcIixcbiAgXCJpbWFnZVwiLFxuICBcImpzb25cIixcbiAgXCJtYW5pZmVzdFwiLFxuICBcInBhaW50d29ya2xldFwiLFxuICBcInJlcG9ydFwiLFxuICBcInNjcmlwdFwiLFxuICBcInNlcnZpY2V3b3JrZXJcIixcbiAgXCJzaGFyZWR3b3JrZXJcIixcbiAgXCJzdHlsZVwiLFxuICBcInRyYWNrXCIsXG4gIFwidmlkZW9cIixcbiAgXCJ3ZWJpZGVudGl0eVwiLFxuICBcIndvcmtlclwiLFxuICBcInhzbHRcIixcbl0pO1xuXG4vKipcbiAqIGBJTlRFUk5BTF9IRUFERVJTYCBmcm9tIGBuZXh0L2Rpc3Qvc2VydmVyL2xpYi9zZXJ2ZXItaXBjL3V0aWxzLmpzYCAoTmV4dFxuICogMTYuMyksIHdoaWNoIGBuZXh0IHN0YXJ0YCBkZWxldGVzIGZyb20gZXZlcnkgcmVxdWVzdCBiZWZvcmUgcm91dGluZyBpdFxuICogKGBmaWx0ZXJJbnRlcm5hbEhlYWRlcnNgIGluIGByb3V0ZXItc2VydmVyLmpzYCkuIFRoZXkgYXJlIHNpZ25hbHMgYmV0d2VlblxuICogTmV4dCdzIG93biByb3V0ZXIgYW5kIHJlbmRlciBsYXllcnM7IGhvbm9yaW5nIG9uZSBhIGNsaWVudCBzZW50IGxldHMgaXQgc3RlZXJcbiAqIHRob3NlIGxheWVycyDigJQgYG5leHQtcmVzdW1lYCBtYWtlcyBhIFBQUiBwYWdlIHJlc3VtZSBmcm9tIGEgcG9zdHBvbmVkIHN0YXRlXG4gKiB0aGUgY2xpZW50IHN1cHBsaWVzLiBSZXN0YXRlZCByYXRoZXIgdGhhbiByZXF1aXJlZCwgbGlrZVxuICoge0BsaW5rIE5PTl9IVE1MX1NFQ19GRVRDSF9ERVNUU30uXG4gKi9cbmNvbnN0IElOVEVSTkFMX0hFQURFUlM6IFJlYWRvbmx5U2V0PHN0cmluZz4gPSBuZXcgU2V0KFtcbiAgXCJ4LW1pZGRsZXdhcmUtcmV3cml0ZVwiLFxuICBcIngtbWlkZGxld2FyZS1yZWRpcmVjdFwiLFxuICBcIngtbWlkZGxld2FyZS1zZXQtY29va2llXCIsXG4gIFwieC1taWRkbGV3YXJlLXNraXBcIixcbiAgXCJ4LW1pZGRsZXdhcmUtb3ZlcnJpZGUtaGVhZGVyc1wiLFxuICBcIngtbWlkZGxld2FyZS1uZXh0XCIsXG4gIFwieC1ub3ctcm91dGUtbWF0Y2hlc1wiLFxuICBcIngtbWF0Y2hlZC1wYXRoXCIsXG4gIFwieC1uZXh0anMtZGF0YVwiLFxuICBcIngtbmV4dC1yZXN1bWUtc3RhdGUtbGVuZ3RoXCIsXG4gIFwibmV4dC1yZXN1bWVcIixcbl0pO1xuXG4vKipcbiAqIFRoZSByZXF1ZXN0IGhlYWRlcnMgd2l0aCB7QGxpbmsgSU5URVJOQUxfSEVBREVSU30gcmVtb3ZlZCwgYW5kIGB4LW5leHRqcy1kYXRhYFxuICogcHV0IGJhY2sgZm9yIGEgYF9uZXh0L2RhdGFgIHJlcXVlc3QsIHdoaWNoIGlzIHdoYXQgYG5leHQgc3RhcnRgJ3NcbiAqIGByZXNvbHZlUm91dGVzYCBkb2VzIChgc2V0SXNOZXh0RGF0YVJlcXVlc3RgKSByaWdodCBhZnRlciBzdHJpcHBpbmcgaXQ6IHRoZVxuICogaGVhZGVyIGlzIGludGVybmFsLCBidXQgTmV4dCdzIGhhbmRsZXJzIGFuZCBtaWRkbGV3YXJlIHN0aWxsIHJlYWQgaXQg4oCUIGl0IGlzXG4gKiBob3cgYSBkYXRhIHJlcXVlc3QgZ2V0cyBgeC1uZXh0anMtbWF0Y2hlZC1wYXRoYCDigJQgc28gYSByZWFsIGRhdGEgcmVxdWVzdCBoYXNcbiAqIHRvIGtlZXAgaXQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB3aXRob3V0SW50ZXJuYWxIZWFkZXJzKFxuICBoZWFkZXJzOiBJbmNvbWluZ0h0dHBIZWFkZXJzLFxuICB0YXJnZXQ6IHN0cmluZyxcbiAgYmFzZVBhdGg6IHN0cmluZyxcbik6IEluY29taW5nSHR0cEhlYWRlcnMge1xuICBjb25zdCBmaWx0ZXJlZDogSW5jb21pbmdIdHRwSGVhZGVycyA9IHt9O1xuICBmb3IgKGNvbnN0IFtuYW1lLCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoaGVhZGVycykpIHtcbiAgICBpZiAoIUlOVEVSTkFMX0hFQURFUlMuaGFzKG5hbWUpKSB7XG4gICAgICBmaWx0ZXJlZFtuYW1lXSA9IHZhbHVlO1xuICAgIH1cbiAgfVxuICBjb25zdCBwYXRobmFtZSA9IHdpdGhvdXRQYXRoUHJlZml4KHRhcmdldC5zcGxpdChcIj9cIilbMF0sIGJhc2VQYXRoKTtcbiAgaWYgKHBhdGhuYW1lLnN0YXJ0c1dpdGgoXCIvX25leHQvZGF0YS9cIikgJiYgcGF0aG5hbWUuZW5kc1dpdGgoXCIuanNvblwiKSkge1xuICAgIGZpbHRlcmVkW1wieC1uZXh0anMtZGF0YVwiXSA9IFwiMVwiO1xuICB9XG4gIHJldHVybiBmaWx0ZXJlZDtcbn1cblxuLyoqIEV2ZXJ5IHJvdXRlIHRvIGludmFsaWRhdGUsIGVhY2ggb25jZSwgaW4gb25lIENsb3VkRnJvbnQgaW52YWxpZGF0aW9uLiAqL1xudHlwZSBSZXZhbGlkYXRlZFBhZ2VIb29rID0gKHJvdXRlczogcmVhZG9ubHkgc3RyaW5nW10pID0+IFByb21pc2U8dm9pZD47XG5cbi8qKlxuICogSW52YWxpZGF0ZSB0aGUgQ0ROIGNvcGllcyBvZiBhIHBhZ2UgYHJlcy5yZXZhbGlkYXRlKClgIGp1c3QgcmVnZW5lcmF0ZWQ6IGl0c1xuICogSFRNTCBhbmQgUlNDIHBheWxvYWQsIGFuZCBpdHMgUGFnZXMgUm91dGVyIGBfbmV4dC9kYXRhYCBKU09OLiBXaXRob3V0IHRoaXMgdGhlXG4gKiBmcmVzaCBlbnRyeSBzYXQgYmVoaW5kIENsb3VkRnJvbnQncyBjb3B5IG9mIHRoZSBvbGQgb25lIGZvciB0aGUgcGFnZSdzIHdob2xlXG4gKiBgcy1tYXhhZ2VgIOKAlCBhIHllYXIsIGZvciBhbiBvbi1kZW1hbmQtb25seSBJU1IgcGFnZS4gYHJldmFsaWRhdGVQYXRoYCBhbmRcbiAqIGByZXZhbGlkYXRlVGFnYCBnbyB0aHJvdWdoIHRoZSBjYWNoZSBoYW5kbGVyJ3MgYHJldmFsaWRhdGVUYWdgLCB3aGljaCBhbHJlYWR5XG4gKiBpbnZhbGlkYXRlczsgYHJlcy5yZXZhbGlkYXRlKClgIGRvZXMgbm90IHRvdWNoIGl0LlxuICpcbiAqIEV2ZXJ5IHJvdXRlIGlzIHdpdGhvdXQgYGJhc2VQYXRoYCwgd2hpY2ggdGhlIGhvb2sgcHJlZml4ZXMuIEEgbm8tb3Agb3V0c2lkZVxuICogdGhlIEdsb2JhbCBjb25zdHJ1Y3RzLCB3aGVyZSBubyBob29rIGlzIHJlZ2lzdGVyZWQuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGludmFsaWRhdGVSZXZhbGlkYXRlZFBhZ2UoXG4gIHVybFBhdGg6IHN0cmluZyxcbiAgbWFuaWZlc3Q6IEFkYXB0ZXJNYW5pZmVzdCxcbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBob29rID0gKGdsb2JhbFRoaXMgYXMgUmVjb3JkPHN5bWJvbCwgdW5rbm93bj4pW1xuICAgIFJFVkFMSURBVEVEX1BBR0VfSE9PS1xuICBdIGFzIFJldmFsaWRhdGVkUGFnZUhvb2sgfCB1bmRlZmluZWQ7XG4gIGlmICh0eXBlb2YgaG9vayAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IHJvdXRlID0gd2l0aG91dFBhdGhQcmVmaXgoXG4gICAgdXJsUGF0aC5zcGxpdChcIj9cIilbMF0sXG4gICAgbWFuaWZlc3QuY29uZmlnLmJhc2VQYXRoLFxuICApO1xuICB0cnkge1xuICAgIC8vIE9uZSBjYWxsLCBkZWR1cGxpY2F0ZWQ6IHRoZSBkZWZhdWx0IGxvY2FsZSdzIHR3byBwYWlycyBzaGFyZSBhIGRhdGFcbiAgICAvLyByb3V0ZSwgYW5kIGVhY2ggaW52YWxpZGF0aW9uIHBhdGggY291bnRzIGFnYWluc3QgQ2xvdWRGcm9udCdzIHF1b3RhLlxuICAgIGF3YWl0IGhvb2soWy4uLm5ldyBTZXQocmV2YWxpZGF0ZWRQYWdlUm91dGVzKHJvdXRlLCBtYW5pZmVzdCkuZmxhdCgpKV0pO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIC8vIFRoZSByZWdlbmVyYXRpb24gaXRzZWxmIHN1Y2NlZWRlZDsgdGhlIGVkZ2UgY2F0Y2hlcyB1cCBhdCBgcy1tYXhhZ2VgLlxuICAgIGNvbnNvbGUud2FybihgQ291bGQgbm90IGludmFsaWRhdGUgdGhlIENETiBjb3B5IG9mICR7dXJsUGF0aH06YCwgZXJyb3IpO1xuICB9XG59XG5cbi8qKlxuICogVGhlIGBbcm91dGUsIGRhdGFSb3V0ZV1gIHBhaXJzIGEgcmV2YWxpZGF0ZWQgcGFnZSBpcyBjYWNoZWQgdW5kZXIgYXQgdGhlIGVkZ2UuXG4gKlxuICogSW4gYW4gaTE4biBhcHAgdGhlIE5leHQgY2xpZW50IGFsd2F5cyBwdXRzIHRoZSBsb2NhbGUgaW4gYSBkYXRhIGhyZWYsIHRoZVxuICogZGVmYXVsdCBsb2NhbGUgaW5jbHVkZWQgKGAvX25leHQvZGF0YS88aWQ+L2VuL2Jsb2cuanNvbmAsIGFuZCBg4oCmL2VuLmpzb25gIGZvclxuICogdGhlIHJvb3QpLCBzbyB0aGUgdW5wcmVmaXhlZCBkYXRhIHJvdXRlIG5hbWVzIG5vdGhpbmcgQ2xvdWRGcm9udCBob2xkcy4gVGhlXG4gKiBwYWdlIGlzIG9uZSBsb2NhbGUncyDigJQgYHJlcy5yZXZhbGlkYXRlKFwiL2Jsb2dcIilgIHJlZ2VuZXJhdGVzIHRoZSBkZWZhdWx0XG4gKiBsb2NhbGUncywgYFwiL2ZyL2Jsb2dcImAgRnJlbmNoIOKAlCBhbmQgdGhlIGRlZmF1bHQgbG9jYWxlJ3MgSFRNTCBpcyByZWFjaGFibGUsXG4gKiBhbmQgY2FjaGVkLCBib3RoIHdpdGggYW5kIHdpdGhvdXQgaXRzIHByZWZpeCwgc28gaXRzIHR3byBwYWlycyBzaGFyZSBhIGRhdGFcbiAqIHJvdXRlLCB3aGljaCB0aGUgY2FsbGVyIHNlbmRzIG9uY2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXZhbGlkYXRlZFBhZ2VSb3V0ZXMoXG4gIHJvdXRlOiBzdHJpbmcsXG4gIG1hbmlmZXN0OiBQaWNrPEFkYXB0ZXJNYW5pZmVzdCwgXCJidWlsZElkXCIgfCBcImNvbmZpZ1wiPixcbik6IEFycmF5PFtzdHJpbmcsIHN0cmluZ10+IHtcbiAgY29uc3QgZGF0YVJvdXRlID0gKHBhZ2U6IHN0cmluZykgPT5cbiAgICBgL19uZXh0L2RhdGEvJHttYW5pZmVzdC5idWlsZElkfSR7XG4gICAgICBwYWdlID09PSBcIi9cIiA/IFwiL2luZGV4XCIgOiBwYWdlLnJlcGxhY2UoL1xcLyskLywgXCJcIilcbiAgICB9Lmpzb25gO1xuICBjb25zdCBpMThuID0gbWFuaWZlc3QuY29uZmlnLmkxOG4gYXMge1xuICAgIHJlYWRvbmx5IGxvY2FsZXM/OiByZWFkb25seSBzdHJpbmdbXTtcbiAgICByZWFkb25seSBkZWZhdWx0TG9jYWxlPzogc3RyaW5nO1xuICB9IHwgbnVsbDtcbiAgaWYgKCFpMThuPy5kZWZhdWx0TG9jYWxlKSB7XG4gICAgcmV0dXJuIFtbcm91dGUsIGRhdGFSb3V0ZShyb3V0ZSldXTtcbiAgfVxuICBjb25zdCB7IGRlZmF1bHRMb2NhbGUgfSA9IGkxOG47XG4gIGNvbnN0IHNlZ21lbnQgPSByb3V0ZS5zcGxpdChcIi9cIilbMV0gPz8gXCJcIjtcbiAgY29uc3QgbG9jYWxlID0gKGkxOG4ubG9jYWxlcyA/PyBbXSkuaW5jbHVkZXMoc2VnbWVudClcbiAgICA/IHNlZ21lbnRcbiAgICA6IGRlZmF1bHRMb2NhbGU7XG4gIGNvbnN0IHBhZ2UgPVxuICAgIGxvY2FsZSA9PT0gc2VnbWVudCA/IHdpdGhvdXRQYXRoUHJlZml4KHJvdXRlLCBgLyR7c2VnbWVudH1gKSA6IHJvdXRlO1xuICBjb25zdCBsb2NhbGl6ZWQgPSBwYWdlID09PSBcIi9cIiA/IGAvJHtsb2NhbGV9YCA6IGAvJHtsb2NhbGV9JHtwYWdlfWA7XG4gIC8vIFRoZSByb290J3MgZGF0YSByb3V0ZSBpcyB0aGUgbG9jYWxlIGl0c2VsZiwgbm90IGAvPGxvY2FsZT4vaW5kZXhgLlxuICBjb25zdCBsb2NhbGl6ZWREYXRhID0gYC9fbmV4dC9kYXRhLyR7bWFuaWZlc3QuYnVpbGRJZH0ke2xvY2FsaXplZC5yZXBsYWNlKC9cXC8rJC8sIFwiXCIpfS5qc29uYDtcbiAgcmV0dXJuIGxvY2FsZSA9PT0gZGVmYXVsdExvY2FsZVxuICAgID8gW1xuICAgICAgICBbcGFnZSwgbG9jYWxpemVkRGF0YV0sXG4gICAgICAgIFtsb2NhbGl6ZWQsIGxvY2FsaXplZERhdGFdLFxuICAgICAgXVxuICAgIDogW1tsb2NhbGl6ZWQsIGxvY2FsaXplZERhdGFdXTtcbn1cblxuZnVuY3Rpb24gYXNFcnJvcihlcnJvcjogdW5rbm93bik6IEVycm9yIHtcbiAgcmV0dXJuIGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvciA6IG5ldyBFcnJvcihTdHJpbmcoZXJyb3IpKTtcbn1cblxuLyoqXG4gKiBSZWFkIHRoZSBtYW5pZmVzdCBhbmQgcGluIHRoZSBsYXlvdXQgaXQgZGVzY3JpYmVzLlxuICpcbiAqIGBwcm9jZXNzLmN3ZCgpYCBpcyBsb2FkLWJlYXJpbmcgYW5kIHRoZXJlIGlzIGV4YWN0bHkgb25lIGNoYW5jZSB0byBnZXQgaXRcbiAqIHJpZ2h0OiBOZXh0LmpzIGlubGluZXMgYHJlbGF0aXZlKGJ1aWxkQ3dkLCBwcm9qZWN0RGlyKWAgaW50byBldmVyeSBlbnRyeXBvaW50XG4gKiBhbmQgcmVzb2x2ZXMgaXQgYWdhaW5zdCB0aGUgKnJ1bnRpbWUqIGN3ZCB0byBmaW5kXG4gKiBgcmVxdWlyZWQtc2VydmVyLWZpbGVzLmpzb25gLCB0aGUgcHJlcmVuZGVyIG1hbmlmZXN0LCBhbmQgdGhlIGFwcCdzIGNodW5rcy5cbiAqIGBhc3NlcnRCdWlsZEN3ZGAgaW4gYGJ1aWxkLW91dHB1dHMudHNgIGtlZXBzIHRoYXQgaW5saW5lZCB2YWx1ZSBgXCJcImAsIHNvIHRoZVxuICogd2hvbGUgaW52YXJpYW50IHJlZHVjZXMgdG8gXCJjd2QgaXMgdGhlIHN0YWdlZCBwcm9qZWN0IGRpclwiIOKAlCBhc3NlcnRlZCByYXRoZXJcbiAqIHRoYW4gYXNzdW1lZCwgYmVjYXVzZSBnZXR0aW5nIGl0IHdyb25nIHByb2R1Y2VzIGFcbiAqIGBDYW5ub3QgZmluZCBtb2R1bGUg4oCmL3JlcXVpcmVkLXNlcnZlci1maWxlcy5qc29uYCBmcm9tIGluc2lkZSBjb21waWxlZCBOZXh0LmpzXG4gKiBjb2RlIHdpdGggbm8gaW5kaWNhdGlvbiB0aGF0IHRoZSBsYXlvdXQgaXMgdGhlIHByb2JsZW0uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBsb2FkUnVudGltZShcbiAgZGVwbG95bWVudFJvb3Q6IHN0cmluZyxcbik6IFByb21pc2U8TmV4dGpzUnVudGltZT4ge1xuICBjb25zdCBtYW5pZmVzdFBhdGggPSBkZXBsb3llZE1hbmlmZXN0UGF0aChkZXBsb3ltZW50Um9vdCk7XG4gIGxldCBtYW5pZmVzdDogQWRhcHRlck1hbmlmZXN0O1xuICB0cnkge1xuICAgIG1hbmlmZXN0ID0gSlNPTi5wYXJzZShhd2FpdCByZWFkRmlsZShtYW5pZmVzdFBhdGgsIFwidXRmLThcIikpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBDb3VsZCBub3QgcmVhZCB0aGUgY2RrLW5leHRqcyBhZGFwdGVyIG1hbmlmZXN0IGF0IFwiJHttYW5pZmVzdFBhdGh9XCIuIGAgK1xuICAgICAgICBgVGhlIGRlcGxveW1lbnQgcGFja2FnZSBpcyBpbmNvbXBsZXRlOiBzeW50aCBjb3BpZXMgYCArXG4gICAgICAgIGAke01BTklGRVNUX0ZJTEVfTkFNRX0gaW4gbmV4dCB0byB0aGUgYnVuZGxlZCBydW50aW1lLmAsXG4gICAgICB7IGNhdXNlOiBlcnJvciB9LFxuICAgICk7XG4gIH1cblxuICBjb25zdCBwcm9qZWN0RGlyID0gam9pbihkZXBsb3ltZW50Um9vdCwgbWFuaWZlc3QucmVsYXRpdmVQcm9qZWN0RGlyKTtcbiAgY29uc3QgcHJvYmUgPSBqb2luKFxuICAgIHByb2plY3REaXIsXG4gICAgbWFuaWZlc3QuY29uZmlnLmRpc3REaXIsXG4gICAgXCJyZXF1aXJlZC1zZXJ2ZXItZmlsZXMuanNvblwiLFxuICApO1xuICB0cnkge1xuICAgIGF3YWl0IHJlYWRGaWxlKHByb2JlKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgVGhlIGRlcGxveW1lbnQgcm9vdCBcIiR7ZGVwbG95bWVudFJvb3R9XCIgZG9lcyBub3QgY29udGFpbiB0aGUgc3RhZ2VkIGAgK1xuICAgICAgICBgTmV4dC5qcyBwcm9qZWN0OiBleHBlY3RlZCBcIiR7cHJvYmV9XCIgdG8gZXhpc3QuIEV2ZXJ5IGJ1aWx0IGVudHJ5cG9pbnQgYCArXG4gICAgICAgIGByZXNvbHZlcyBpdHMgb3duIHBhdGhzIGFnYWluc3QgcHJvY2Vzcy5jd2QoKSwgc28gdGhpcyBsYXlvdXQgaXMgcGFydCBgICtcbiAgICAgICAgYG9mIHRoZSBjb250cmFjdCwgbm90IGEgY29udmVuaWVuY2UuYCxcbiAgICAgIHsgY2F1c2U6IGVycm9yIH0sXG4gICAgKTtcbiAgfVxuICAvLyBgbmV4dCBzdGFydGAgZm9yY2VzIHRoaXMsIGFuZCBleHRlcm5hbGl6ZWQgcGFja2FnZXMgKFJlYWN0IGZvciBQYWdlcyBSb3V0ZXJcbiAgLy8gU1NSLCBhbnl0aGluZyBpbiBgc2VydmVyRXh0ZXJuYWxQYWNrYWdlc2ApIHBpY2sgdGhlaXIgZGV2IG9yIHByb2QgYnVpbGQgZnJvbVxuICAvLyBpdCBhdCByZXF1aXJlIHRpbWUuIFRoZSBDb250YWluZXJzIERvY2tlcmZpbGVzIHNldCBpdCBhbmQgdGhlIEZ1bmN0aW9uc1xuICAvLyBjb25zdHJ1Y3RzIGRvIHRvbzsgdGhpcyBjb3ZlcnMgYSBoYW5kLXdpcmVkIGZ1bmN0aW9uLiBCZWZvcmUgYW55IGByZXF1aXJlYC5cbiAgLy8gKGBuZXh0YCdzIHR5cGluZ3MgZGVjbGFyZSBOT0RFX0VOViByZWFkLW9ubHkuKVxuICAocHJvY2Vzcy5lbnYgYXMgUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPikuTk9ERV9FTlYgPz89IFwicHJvZHVjdGlvblwiO1xuICBwcm9jZXNzLmNoZGlyKHByb2plY3REaXIpO1xuICAvLyBCZWZvcmUgYW55dGhpbmcgY2FuIHNlcnZlIGEgcmVxdWVzdDogdGhlIHJ1bnRpbWUncyBvd24gYG5leHRgIGltcG9ydHMgcmVzb2x2ZVxuICAvLyBvdXQgb2YgdGhlIHN0YWdlZCBhcHAsIG5vdCBvdXQgb2YgdGhlIHNoZWxsJ3MgZGlyZWN0b3J5LiBTZWUgYG5leHQtbW9kdWxlcy50c2AuXG4gIHVzZU5leHRGcm9tKHByb2plY3REaXIpO1xuICAvLyBCZWZvcmUgYW55IGVudHJ5cG9pbnQgY2FuIHJlYWQgdGhlbSBhdCBtb2R1bGUgc2NvcGUuXG4gIGxvYWRFbnZGaWxlcyhwcm9qZWN0RGlyKTtcbiAgLy8gVGhlbiwgYmVmb3JlIGFueSBlbnRyeXBvaW50IChvciBtaWRkbGV3YXJlKSBjYW4gYmUgbG9hZGVkOiBOZXh0J3Mgb3duXG4gIC8vIG5vZGUtZW52aXJvbm1lbnQgYm9vdHN0cmFwLiBTZWUgYHNldHVwTm9kZUVudmlyb25tZW50YC5cbiAgc2V0dXBOb2RlRW52aXJvbm1lbnQoKTtcbiAgLy8gQW5kIGxhc3QsIG9uY2UgdGhlIGVudmlyb25tZW50IGlzIHJlYWR5OiBgcmVnaXN0ZXIoKWAsIGJlZm9yZSBhbnkgZW50cnlwb2ludFxuICAvLyBvciBtaWRkbGV3YXJlIG1vZHVsZSBpcyBldmFsdWF0ZWQuIFNlZSBgcmVnaXN0ZXJJbnN0cnVtZW50YXRpb25gLlxuICBhd2FpdCByZWdpc3Rlckluc3RydW1lbnRhdGlvbihwcm9qZWN0RGlyLCBtYW5pZmVzdC5jb25maWcuZGlzdERpcik7XG5cbiAgcmV0dXJuIG5ldyBOZXh0anNSdW50aW1lKHtcbiAgICBkZXBsb3ltZW50Um9vdCxcbiAgICBtYW5pZmVzdCxcbiAgICBidWNrZXQ6IHByb2Nlc3MuZW52LkNES19ORVhUSlNfU1RBVElDX0FTU0VUU19CVUNLRVRfTkFNRSxcbiAgICBidWNrZXRLZXlQcmVmaXg6IHByb2Nlc3MuZW52LkNES19ORVhUSlNfU1RBVElDX0FTU0VUU19LRVlfUFJFRklYLFxuICB9KTtcbn1cblxuLyoqXG4gKiBBIHN5bnRhY3RpY2FsbHkgdmFsaWQgYGhvc3RbOnBvcnRdYDogYSByZWdpc3RlcmVkIG5hbWUgb3IgYSBicmFja2V0ZWQgSVB2NlxuICogbGl0ZXJhbCwgb3B0aW9uYWxseSB3aXRoIGEgcG9ydC4gQW55dGhpbmcgZWxzZSBjYW5ub3QgYmUgdGhlIGF1dGhvcml0eSBvZiBhXG4gKiBVUkwuXG4gKi9cbmNvbnN0IEhPU1RfQVVUSE9SSVRZID0gL14oPzpcXFtbMC05QS1GYS1mOi5dK1xcXXxbMC05QS1aYS16Ll8tXSspKD86OlxcZHsxLDV9KT8kLztcblxuLyoqXG4gKiBUaGUgZmlyc3QgdmFsdWUgdGhhdCBpcyBhY3R1YWxseSB1c2FibGUgYXMgYW4gYXV0aG9yaXR5LCBvciBgdW5kZWZpbmVkYC5cbiAqXG4gKiBgeC1mb3J3YXJkZWQtaG9zdGAgY2FuIGFycml2ZSBhcyBhIGxpc3Qgd2hlbiBtb3JlIHRoYW4gb25lIHByb3h5IGFwcGVuZHMgdG9cbiAqIGl0LiBWYWxpZGF0aW5nIGlzIHdoYXQga2VlcHMgYSBtYWxmb3JtZWQgdmFsdWUgZnJvbSBtYWtpbmcgdGhlIGBVUkxgXG4gKiBjb25zdHJ1Y3RvciB0aHJvdyDigJQgd2hpY2ggb24gdGhlIExhbWJkYSBzaGVsbHMgaXMgYW4gaW52b2NhdGlvbiBlcnJvciBhbmQgYVxuICogNTAyLCBub3QgYSByZXNwb25zZS5cbiAqL1xuZnVuY3Rpb24gdmFsaWRBdXRob3JpdHkoXG4gIHZhbHVlOiBzdHJpbmcgfCBzdHJpbmdbXSB8IHVuZGVmaW5lZCxcbik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGNhbmRpZGF0ZSA9IGZpcnN0VmFsdWUodmFsdWUpPy5zcGxpdChcIixcIilbMF0udHJpbSgpO1xuICByZXR1cm4gY2FuZGlkYXRlICYmIEhPU1RfQVVUSE9SSVRZLnRlc3QoY2FuZGlkYXRlKSA/IGNhbmRpZGF0ZSA6IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBgcmVzb2x2ZVJvdXRlc2AgbmVlZHMgYW4gYWJzb2x1dGUgVVJMLCBhbmQgaXQgYmVjb21lcyB0aGUgb3JpZ2luIGV2ZXJ5XG4gKiBhYnNvbHV0ZSBVUkwgdGhlIGFwcCBidWlsZHMgc3RhcnRzIHdpdGgg4oCUIGByZXEubmV4dFVybC5vcmlnaW5gIGluIG1pZGRsZXdhcmUsXG4gKiBgaW5pdFVSTGAgZm9yIGEgcm91dGUgaGFuZGxlciDigJQgc28gaXRzIGhvc3QgaGFzIHRvIGJlIG9uZSB0aGUgY2xpZW50IGNhbm5vdFxuICogcGljay5cbiAqXG4gKiBUaGF0IGlzIGBIb3N0YCBvbiBldmVyeSBkZXBsb3ltZW50IGJ1dCBvbmU6IENsb3VkRnJvbnQgZm9yd2FyZHMgdGhlIHZpZXdlcidzXG4gKiBgSG9zdGAgdG8gYSBjb250YWluZXIgb3JpZ2luIChgQUxMX1ZJRVdFUmApLCBhbiBBTEIgcGFzc2VzIGl0IHRocm91Z2gsIGFuZCBBUElcbiAqIEdhdGV3YXkgc2V0cyBpdHMgb3duIGRvbWFpbi4gVGhlIGV4Y2VwdGlvbiBpcyBhIExhbWJkYSBGdW5jdGlvbiBVUkwsIHdoZXJlXG4gKiBDbG91ZEZyb250IGhhcyB0byBzZW5kIHRoZSBVUkwncyBvd24gZG9tYWluIGFzIGBIb3N0YCBhbmQgcHV0cyB0aGUgdmlld2VyJ3MgaW5cbiAqIGB4LWZvcndhcmRlZC1ob3N0YDsgc2VlIHtAbGluayBSdW50aW1lUmVxdWVzdC50cnVzdEZvcndhcmRlZEhvc3R9LiBBbnl3aGVyZVxuICogZWxzZSB0aGUgaGVhZGVyIGlzIHRoZSBjbGllbnQncywgYW5kIGhvbm9yaW5nIGl0IGxldCBhIHJlcXVlc3Qgd2l0aFxuICogYFgtRm9yd2FyZGVkLUhvc3Q6IGV2aWwuZXhhbXBsZWAgcG9pbnQgYSBwYXNzd29yZC1yZXNldCBsaW5rIGF0IGV2aWwuZXhhbXBsZSDigJRcbiAqIGFuZCwgb24gR2xvYmFsIENvbnRhaW5lcnMsIGhhdmUgQ2xvdWRGcm9udCBjYWNoZSB0aGF0IHBhZ2UsIHNpbmNlIHRoZSBoZWFkZXJcbiAqIGlzIG5vdCBpbiBpdHMgY2FjaGUga2V5LlxuICovXG5mdW5jdGlvbiBhYnNvbHV0ZVVybChyZXF1ZXN0OiBSdW50aW1lUmVxdWVzdCk6IFVSTCB7XG4gIGNvbnN0IGhvc3QgPVxuICAgIChyZXF1ZXN0LnRydXN0Rm9yd2FyZGVkSG9zdFxuICAgICAgPyB2YWxpZEF1dGhvcml0eShyZXF1ZXN0LmhlYWRlcnNbXCJ4LWZvcndhcmRlZC1ob3N0XCJdKVxuICAgICAgOiB1bmRlZmluZWQpID8/XG4gICAgdmFsaWRBdXRob3JpdHkocmVxdWVzdC5oZWFkZXJzLmhvc3QpID8/XG4gICAgXCJsb2NhbGhvc3RcIjtcbiAgLy8gQmVoaW5kIENsb3VkRnJvbnQgb24gR2xvYmFsIENvbnRhaW5lcnMgdGhlIGNvbnRhaW5lciBzaGVsbCBoYXMgYWxyZWFkeSBwdXRcbiAgLy8gdGhlIHZpZXdlcidzIHByb3RvY29sIGhlcmU7IHNlZSBgdHJ1c3RDbG91ZEZyb250UHJvdG9gIGluIGh0dHAvbm9kZS1zZXJ2ZXIudHMuXG4gIGNvbnN0IGZvcndhcmRlZFByb3RvID0gZmlyc3RWYWx1ZShyZXF1ZXN0LmhlYWRlcnNbXCJ4LWZvcndhcmRlZC1wcm90b1wiXSlcbiAgICA/LnNwbGl0KFwiLFwiKVswXVxuICAgIC50cmltKClcbiAgICAudG9Mb3dlckNhc2UoKTtcbiAgLy8gQ2xpZW50LXN1cHBsaWVkIHdoZXJlIG5vIHByb3h5IG92ZXJ3cml0ZXMgaXQsIGJ1dCBoYXJtbGVzczogdGhlIGhvc3QgaXNcbiAgLy8gYWxyZWFkeSBmaXhlZCwgYW5kIGFueXRoaW5nIGJ1dCB0aGVzZSB0d28gd291bGQgbm90IHBhcnNlLlxuICBjb25zdCBwcm90byA9XG4gICAgZm9yd2FyZGVkUHJvdG8gPT09IFwiaHR0cFwiIHx8IGZvcndhcmRlZFByb3RvID09PSBcImh0dHBzXCJcbiAgICAgID8gZm9yd2FyZGVkUHJvdG9cbiAgICAgIDogcmVxdWVzdC5lbmNyeXB0ZWQgPT09IGZhbHNlXG4gICAgICAgID8gXCJodHRwXCJcbiAgICAgICAgOiBcImh0dHBzXCI7XG4gIHJldHVybiBuZXcgVVJMKHJlcXVlc3QudXJsLCBgJHtwcm90b306Ly8ke2hvc3R9YCk7XG59XG5cbmZ1bmN0aW9uIHBpY2tEZWZpbmVkKFxuICBoZWFkZXJzOiBJbmNvbWluZ0h0dHBIZWFkZXJzLFxuICBuYW1lczogcmVhZG9ubHkgc3RyaW5nW10sXG4pOiBJbmNvbWluZ0h0dHBIZWFkZXJzIHtcbiAgY29uc3QgcGlja2VkOiBJbmNvbWluZ0h0dHBIZWFkZXJzID0ge307XG4gIGZvciAoY29uc3QgbmFtZSBvZiBuYW1lcykge1xuICAgIGlmIChoZWFkZXJzW25hbWVdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHBpY2tlZFtuYW1lXSA9IGhlYWRlcnNbbmFtZV07XG4gICAgfVxuICB9XG4gIHJldHVybiBwaWNrZWQ7XG59XG5cbi8qKlxuICogYG5vcm1hbGl6ZVJlcGVhdGVkU2xhc2hlc2AgKGBuZXh0L2Rpc3Qvc2hhcmVkL2xpYi91dGlscy5qc2ApLCBhcHBsaWVkIHdoZXJlXG4gKiBOZXh0LmpzIGFwcGxpZXMgaXQ6IGJlZm9yZSByb3V0aW5nLCBhcyBhIDMwOCB0byB0aGUgY29sbGFwc2VkIHBhdGguXG4gKiBgYmFzZS1zZXJ2ZXIudHNgIGRvZXMgYGlmICh1cmxOb1F1ZXJ5Py5tYXRjaCgvKFxcXFx8XFwvXFwvKS8pKVxuICogcmVzLnJlZGlyZWN0KG5vcm1hbGl6ZVJlcGVhdGVkU2xhc2hlcyhyZXEudXJsKSwgMzA4KWAsIHNvIGAvYS8vYmAgYW5kIGAvYVxcYmBcbiAqIGJvdGggYW5zd2VyIGEgcmVkaXJlY3QgdG8gYC9hL2JgIHJhdGhlciB0aGFuIGEgNDA0IC0gYW5kIGBAbmV4dC9yb3V0aW5nYCdzXG4gKiBgcmVzb2x2ZVJvdXRlc2AgZG9lcyBub3QgZG8gaXQgZm9yIHVzLCB3aGljaCBpcyBob3cgYC8vYCByZWFjaGVkIHRoaXMgcnVudGltZSBhc1xuICogYSA1MDAgYW5kIGAvYXBpLy9qc29uYCBhcyBhIDQwNC5cbiAqXG4gKiBFbmNvZGVkIGJhY2tzbGFzaGVzIGFyZSBsZWZ0IGFsb25lLCBhcyBOZXh0LmpzIGxlYXZlcyB0aGVtOiBgJTVDYCBpcyBhIGxpdGVyYWxcbiAqIGNoYXJhY3RlciBpbiBhIHBhdGggc2VnbWVudCwgbm90IGEgc2VwYXJhdG9yLlxuICpcbiAqIFJldHVybnMgYHVuZGVmaW5lZGAgd2hlbiB0aGVyZSBpcyBub3RoaW5nIHRvIGNvbGxhcHNlLCB3aGljaCBpcyB0aGUgY29tbW9uIGNhc2UuXG4gKi9cbmZ1bmN0aW9uIGNvbGxhcHNlUmVwZWF0ZWRTbGFzaGVzKHRhcmdldDogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgcGFydHMgPSB0YXJnZXQuc3BsaXQoXCI/XCIpO1xuICBjb25zdCBwYXRobmFtZSA9IHBhcnRzWzBdO1xuICBpZiAoIS9cXFxcfFxcL1xcLy8udGVzdChwYXRobmFtZSkpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIGNvbnN0IHF1ZXJ5ID0gcGFydHMubGVuZ3RoID4gMSA/IGA/JHtwYXJ0cy5zbGljZSgxKS5qb2luKFwiP1wiKX1gIDogXCJcIjtcbiAgcmV0dXJuIHBhdGhuYW1lLnJlcGxhY2UoL1xcXFwvZywgXCIvXCIpLnJlcGxhY2UoL1xcL1xcLysvZywgXCIvXCIpICsgcXVlcnk7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3BsaXRCb2R5IHtcbiAgLyoqIFdoYXQgYHJlcWAgcmVhZHM6IHRoZSBlbnRyeXBvaW50J3MgY29weS4gKi9cbiAgcmVhZG9ubHkgZm9yUmVxdWVzdD86IFJlYWRhYmxlIHwgQnVmZmVyO1xuICAvKiogV2hhdCBgcmVzb2x2ZVJvdXRlc2AgaGFuZHMgbWlkZGxld2FyZS4gKi9cbiAgcmVhZG9ubHkgZm9yRGlzcGF0Y2g6IFJlYWRhYmxlU3RyZWFtO1xuICAvKipcbiAgICogQ2FsbGVkIG9uY2UgZGlzcGF0Y2ggaGFzIHJldHVybmVkLCB3aXRoIHdoZXRoZXIgbWlkZGxld2FyZSBhbnN3ZXJlZCB0aGVcbiAgICogcmVxdWVzdCBpdHNlbGYuIExldHMgZ28gb2Ygd2hpY2hldmVyIGNvcHkgbm90aGluZyB3aWxsIHJlYWQgYW55IG1vcmUuXG4gICAqL1xuICByZWxlYXNlVW5yZWFkKG1pZGRsZXdhcmVSZXNwb25kZWQ6IGJvb2xlYW4pOiB2b2lkO1xufVxuXG4vKipcbiAqIGByZXNvbHZlUm91dGVzYCBoYW5kcyBgcmVxdWVzdEJvZHlgIHRvIG1pZGRsZXdhcmUsIHdoaWNoIGNvbnN1bWVzIGl0LCB3aGlsZSB0aGVcbiAqIGVudHJ5cG9pbnQgbmVlZHMgdGhlIHNhbWUgYnl0ZXMg4oCUIHRoZSBzYW1lIHByb2JsZW0gYG5leHQtc2VydmVyYCBzb2x2ZXMgd2l0aFxuICogYGdldENsb25lYWJsZUJvZHkoKWAuIE9ubHkgc3BsaXQgd2hlbiB0aGVyZSBpcyBtaWRkbGV3YXJlIHRvIGZlZWQ6IHRlZWluZyBjb3N0c1xuICogYSBidWZmZXIgY29weSBvZiBldmVyeSB1cGxvYWQgb24gYSBwYXRoIHRoYXQgd291bGQgb3RoZXJ3aXNlIGJlIGEgc3RyYWlnaHQgcGlwZS5cbiAqXG4gKiBBIGB0ZWUoKWAgYnVmZmVycywgZm9yIHRoZSBicmFuY2ggdGhhdCBpcyBiZWhpbmQsIGV2ZXJ5IGNodW5rIHRoZSBvdGhlciBvbmVcbiAqIGhhcyByZWFkIOKAlCBzbyBhIGJyYW5jaCB0aGF0IGlzIG5ldmVyIHJlYWQgaG9sZHMgdGhlIHdob2xlIGJvZHkuIE1pZGRsZXdhcmVcbiAqIHRoYXQgZG9lc24ndCByZWFkIHRoZSBib2R5IGlzIHRoZSBjb21tb24gY2FzZSAoYW5kIGl0cyBtYXRjaGVyIG1heSBub3QgZXZlblxuICogaGF2ZSBydW4gaXQpLCBhZnRlciB3aGljaCB0aGUgZW50cnlwb2ludCBzdHJlYW1pbmcgYW4gdXBsb2FkIHdvdWxkIHBpbGUgYWxsXG4gKiBvZiBpdCB1cCBpbiB0aGUgbWlkZGxld2FyZSBicmFuY2g6IHRoZSB3aG9sZSB1cGxvYWQgaW4gbWVtb3J5LCBvbiBhXG4gKiBjb250YWluZXIgdGhhdCBzZXJ2ZXMgb3RoZXIgcmVxdWVzdHMuIFNvIG9uY2UgZGlzcGF0Y2ggcmV0dXJucywgdGhlIGJyYW5jaFxuICogd2l0aCBubyByZWFkZXIgbGVmdCBpcyBjYW5jZWxsZWQg4oCUIHRoZSBtaWRkbGV3YXJlIG9uZSwgb3IgdGhlIGVudHJ5cG9pbnQgb25lXG4gKiB3aGVuIG1pZGRsZXdhcmUgYW5zd2VyZWQgYW5kIGByZXFgIHdpbGwgbmV2ZXIgYmUgcmVhZC4gQ2FuY2VsbGluZyBvbmVcbiAqIGJyYW5jaCBsZWF2ZXMgdGhlIHNvdXJjZSBhbmQgdGhlIG90aGVyIGJyYW5jaCBydW5uaW5nLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc3BsaXRCb2R5KFxuICBib2R5OiBSZWFkYWJsZSB8IEJ1ZmZlciB8IHVuZGVmaW5lZCxcbiAgaGFzTWlkZGxld2FyZTogYm9vbGVhbixcbik6IFNwbGl0Qm9keSB7XG4gIGNvbnN0IHJlbGVhc2VOb3RoaW5nID0gKCk6IHZvaWQgPT4ge307XG4gIGlmIChib2R5ID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4ge1xuICAgICAgZm9yRGlzcGF0Y2g6IG5ldyBCbG9iKFtdKS5zdHJlYW0oKSxcbiAgICAgIHJlbGVhc2VVbnJlYWQ6IHJlbGVhc2VOb3RoaW5nLFxuICAgIH07XG4gIH1cbiAgaWYgKCFoYXNNaWRkbGV3YXJlKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGZvclJlcXVlc3Q6IGJvZHksXG4gICAgICBmb3JEaXNwYXRjaDogbmV3IEJsb2IoW10pLnN0cmVhbSgpLFxuICAgICAgcmVsZWFzZVVucmVhZDogcmVsZWFzZU5vdGhpbmcsXG4gICAgfTtcbiAgfVxuICBpZiAoQnVmZmVyLmlzQnVmZmVyKGJvZHkpKSB7XG4gICAgLy8gQWxyZWFkeSBmdWxseSBpbiBtZW1vcnksIHNvIFwidGVlaW5nXCIgaXMganVzdCByZWFkaW5nIGl0IHR3aWNlLlxuICAgIHJldHVybiB7XG4gICAgICBmb3JSZXF1ZXN0OiBib2R5LFxuICAgICAgZm9yRGlzcGF0Y2g6IG5ldyBCbG9iKFtib2R5XSkuc3RyZWFtKCksXG4gICAgICByZWxlYXNlVW5yZWFkOiByZWxlYXNlTm90aGluZyxcbiAgICB9O1xuICB9XG4gIGNvbnN0IFtmb3JNaWRkbGV3YXJlLCBmb3JFbnRyeXBvaW50XSA9IFJlYWRhYmxlLnRvV2ViKGJvZHkpLnRlZSgpO1xuICBjb25zdCBmb3JSZXF1ZXN0ID0gUmVhZGFibGUuZnJvbVdlYihmb3JFbnRyeXBvaW50IGFzIG5ldmVyKTtcbiAgcmV0dXJuIHtcbiAgICBmb3JSZXF1ZXN0LFxuICAgIGZvckRpc3BhdGNoOiBmb3JNaWRkbGV3YXJlIGFzIFJlYWRhYmxlU3RyZWFtLFxuICAgIHJlbGVhc2VVbnJlYWQobWlkZGxld2FyZVJlc3BvbmRlZCkge1xuICAgICAgaWYgKG1pZGRsZXdhcmVSZXNwb25kZWQpIHtcbiAgICAgICAgLy8gYGZyb21XZWJgIGhvbGRzIHRoZSBicmFuY2gncyByZWFkZXIsIHNvIGl0IGlzIGRlc3Ryb3llZCByYXRoZXIgdGhhblxuICAgICAgICAvLyBjYW5jZWxsZWQ7IGl0cyBgX2Rlc3Ryb3lgIGNhbmNlbHMgdGhlIHJlYWRlci5cbiAgICAgICAgZm9yUmVxdWVzdC5kZXN0cm95KCk7XG4gICAgICB9IGVsc2UgaWYgKCFmb3JNaWRkbGV3YXJlLmxvY2tlZCkge1xuICAgICAgICAvLyBMb2NrZWQgbWVhbnMgbWlkZGxld2FyZSB0b29rIGEgcmVhZGVyOiBpdCBpcyByZWFkaW5nLCBvciBoYXMgcmVhZCxcbiAgICAgICAgLy8gdGhlIGJvZHkgaXRzZWxmLCBhbmQgYSBsb2NrZWQgc3RyZWFtIGNhbm5vdCBiZSBjYW5jZWxsZWQgYW55d2F5LlxuICAgICAgICBmb3JNaWRkbGV3YXJlLmNhbmNlbCgpLmNhdGNoKCgpID0+IHt9KTtcbiAgICAgIH1cbiAgICB9LFxuICB9O1xufVxuXG4vKiogYEluY29taW5nSHR0cEhlYWRlcnNgIOKGkiB0aGUgZmxhdCBlbnRyaWVzIGEgYEhlYWRlcnNgIGNvbnN0cnVjdG9yIGFjY2VwdHMuICovXG5mdW5jdGlvbiB0b1dlYkhlYWRlcnMoaGVhZGVyczogSW5jb21pbmdIdHRwSGVhZGVycyk6IEFycmF5PFtzdHJpbmcsIHN0cmluZ10+IHtcbiAgY29uc3QgZW50cmllczogQXJyYXk8W3N0cmluZywgc3RyaW5nXT4gPSBbXTtcbiAgZm9yIChjb25zdCBbbmFtZSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGhlYWRlcnMpKSB7XG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IHNpbmdsZSBvZiBBcnJheS5pc0FycmF5KHZhbHVlKSA/IHZhbHVlIDogW3ZhbHVlXSkge1xuICAgICAgZW50cmllcy5wdXNoKFtuYW1lLCBzaW5nbGVdKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGVudHJpZXM7XG59XG5cbi8qKlxuICogYGhlYWRlcnMoKWAgcnVsZXMsIHRoZSBpbW11dGFibGUgYGNhY2hlLWNvbnRyb2xgIGZvciBidWlsZCBhc3NldHMsIGFuZCBhbnl0aGluZ1xuICogbWlkZGxld2FyZSBzZXQgd2l0aCBgTmV4dFJlc3BvbnNlLm5leHQoeyBoZWFkZXJzIH0pYC4gQXBwbGllZCBiZWZvcmUgdGhlXG4gKiBlbnRyeXBvaW50IHJ1bnMgc28gdGhhdCBhIHJvdXRlIGNhbiBzdGlsbCBvdmVycmlkZSBpdHMgb3duLlxuICovXG5mdW5jdGlvbiBhcHBseUhlYWRlcnMocmVzOiBTaGltU2VydmVyUmVzcG9uc2UsIGhlYWRlcnM6IEhlYWRlcnMpOiB2b2lkIHtcbiAgZm9yIChjb25zdCBbbmFtZSwgdmFsdWVdIG9mIGhlYWRlcnMuZW50cmllcygpKSB7XG4gICAgLy8gYGVudHJpZXMoKWAgeWllbGRzIGBzZXQtY29va2llYCBvbmNlIHBlciBjb29raWUsIHNvIGFwcGVuZGluZyB0aGUgd2hvbGVcbiAgICAvLyBgZ2V0U2V0Q29va2llKClgIGFycmF5IGhlcmUgd291bGQgZW1pdCBOwrIgb2YgdGhlbSDigJQgdHdvIGNvb2tpZXMgc2V0IGJ5XG4gICAgLy8gbWlkZGxld2FyZSBhcnJpdmVkIGFzIFtcImE9MVwiLFwiYj0yXCIsXCJhPTFcIixcImI9MlwiXS4gSGFuZGxlZCBvbmNlLCBvdXRzaWRlLlxuICAgIGlmIChuYW1lID09PSBcInNldC1jb29raWVcIikge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIHJlcy5zZXRIZWFkZXIobmFtZSwgdmFsdWUpO1xuICB9XG4gIGZvciAoY29uc3QgY29va2llIG9mIGhlYWRlcnMuZ2V0U2V0Q29va2llKCkpIHtcbiAgICByZXMuYXBwZW5kSGVhZGVyKFwic2V0LWNvb2tpZVwiLCBjb29raWUpO1xuICB9XG59XG5cbi8qKlxuICogTWlycm9ycyBOZXh0LmpzJ3Mgb3duIHJlZGlyZWN0IHJlc3BvbnNlIChgYmFzZS1zZXJ2ZXIudHNgKTogdGhlIGRlc3RpbmF0aW9uIGlzXG4gKiBhbHNvIHRoZSBib2R5LCBhbmQgYSAzMDggY2FycmllcyBhIGBSZWZyZXNoYCBoZWFkZXIgYmVjYXVzZSBzb21lIGNsaWVudHMgYW5kXG4gKiBpbnRlcm1lZGlhcmllcyBzdGlsbCBkbyBub3QgaW1wbGVtZW50IDMwOC5cbiAqL1xuZnVuY3Rpb24gc2VuZFJlZGlyZWN0KFxuICByZXM6IFNoaW1TZXJ2ZXJSZXNwb25zZSxcbiAgbG9jYXRpb246IHN0cmluZyxcbiAgc3RhdHVzOiBudW1iZXIsXG4pOiB2b2lkIHtcbiAgcmVzLnN0YXR1c0NvZGUgPSBzdGF0dXM7XG4gIHJlcy5zZXRIZWFkZXIoXCJMb2NhdGlvblwiLCBsb2NhdGlvbik7XG4gIGlmIChzdGF0dXMgPT09IDMwOCkge1xuICAgIHJlcy5zZXRIZWFkZXIoXCJSZWZyZXNoXCIsIGAwO3VybD0ke2xvY2F0aW9ufWApO1xuICB9XG4gIHJlcy5zZXRIZWFkZXIoXCJDb250ZW50LVR5cGVcIiwgXCJ0ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04XCIpO1xuICByZXMuZW5kKGxvY2F0aW9uKTtcbn1cblxuLyoqXG4gKiBgbmV4dCBzdGFydGAncyBhbnN3ZXIgdG8gYSBQT1NULCBQVVQgb3IgREVMRVRFIGZvciBhIHN0YXRpYyBmaWxlOiA0MDUgd2l0aFxuICogYEFsbG93OiBHRVQsIEhFQURgIChgcm91dGVyLXNlcnZlci5qc2ApLiBJdCByZW5kZXJzIHRoYXQgdGhyb3VnaCBgL19lcnJvcmA7XG4gKiB0aGlzIGlzIHRoZSBwbGFpbi10ZXh0IGVxdWl2YWxlbnQsIHNpbmNlIHRoZSBzdGF0dXMgYW5kIGBBbGxvd2AgYXJlIHdoYXQgYVxuICogY2xpZW50IGFjdHMgb24uXG4gKi9cbmZ1bmN0aW9uIHNlbmRNZXRob2ROb3RBbGxvd2VkKHJlczogU2hpbVNlcnZlclJlc3BvbnNlKTogdm9pZCB7XG4gIHJlcy5zdGF0dXNDb2RlID0gNDA1O1xuICByZXMuc2V0SGVhZGVyKFwiQWxsb3dcIiwgXCJHRVQsIEhFQURcIik7XG4gIHJlcy5zZXRIZWFkZXIoXCJDb250ZW50LVR5cGVcIiwgXCJ0ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04XCIpO1xuICByZXMuZW5kKFwiTWV0aG9kIE5vdCBBbGxvd2VkXCIpO1xufVxuXG4vKipcbiAqIFJlcXVlc3QgaGVhZGVycyB7QGxpbmsgcHJveHlFeHRlcm5hbH0gZG9lcyBub3QgZm9yd2FyZC4gVGhlIHVwc3RyZWFtJ3Mgb3duXG4gKiBgSG9zdGAgbXVzdCB3aW47IHRoZSByZXN0IGRlc2NyaWJlIG91ciBjb25uZWN0aW9uLCBub3QgdGhlIHByb3hpZWQgb25lLCBhbmRcbiAqIHVuZGljaSB0aHJvd3Mgb24gbW9zdCBvZiB0aGVtLCB3aGljaCB3b3VsZCBhbnN3ZXIgdGhlIHJlcXVlc3Qgd2l0aCBhIDUwMC5cbiAqIE5leHQuanMncyBsaXN0IGZvciB0aGUgcmVxdWVzdHMgaXQgbWFrZXMgd2l0aCB1bmRpY2kgKGBpcGNGb3JiaWRkZW5IZWFkZXJzYCxcbiAqIGBuZXh0L2Rpc3Qvc2VydmVyL2xpYi9zZXJ2ZXItaXBjL3V0aWxzLmpzYCksIHBsdXMgYGhvc3RgIGFuZCBgdXBncmFkZWAsIG1pbnVzXG4gKiBgY29udGVudC1lbmNvZGluZ2A6IE5leHQgc3RyaXBzIHRoYXQgb3ZlciBhIGJvZHkgaXQgaGFzIGFscmVhZHkgZGVjb2RlZCwgd2hpbGVcbiAqIHRoaXMgb25lIGlzIGZvcndhcmRlZCBhcyByZWNlaXZlZCwgc3RpbGwgZW5jb2RlZC5cbiAqL1xuY29uc3QgUFJPWFlfRFJPUFBFRF9IRUFERVJTOiByZWFkb25seSBzdHJpbmdbXSA9IFtcbiAgXCJob3N0XCIsXG4gIFwidXBncmFkZVwiLFxuICBcImFjY2VwdC1lbmNvZGluZ1wiLFxuICBcImtlZXBhbGl2ZVwiLFxuICBcImtlZXAtYWxpdmVcIixcbiAgXCJ0cmFuc2Zlci1lbmNvZGluZ1wiLFxuICBcImNvbm5lY3Rpb25cIixcbiAgXCJleHBlY3RcIixcbl07XG5cbi8qKlxuICogVGhlIFNpZ1Y0IHNpZ25hdHVyZSBPcmlnaW4gQWNjZXNzIENvbnRyb2wgcHV0IG9uIGEgcmVxdWVzdCB0byB0aGUgRnVuY3Rpb25cbiAqIFVSTCwgYWxzbyBkcm9wcGVkIGJ5IHtAbGluayBwcm94eUV4dGVybmFsfSB3aGVuIHRoZSByZXF1ZXN0IHdhcyBJQU0tdmVyaWZpZWQ6XG4gKiBmb3J3YXJkZWQsIGl0IHdvdWxkIGxldCB0aGUgdGhpcmQtcGFydHkgb3JpZ2luIHJlcGxheSB0aGUgcmVxdWVzdCBhZ2FpbnN0XG4gKiB0aGUgRnVuY3Rpb24gVVJMLiBBbnl3aGVyZSBlbHNlIHRoZXNlIGFyZSB0aGUgY2xpZW50J3Mgb3duLCBhbmQgYXJlXG4gKiBmb3J3YXJkZWQgYXMgYG5leHQgc3RhcnRgIGZvcndhcmRzIHRoZW0uXG4gKi9cbmNvbnN0IFNJR1Y0X0hFQURFUlM6IHJlYWRvbmx5IHN0cmluZ1tdID0gW1xuICBcImF1dGhvcml6YXRpb25cIixcbiAgXCJ4LWFtei1kYXRlXCIsXG4gIFwieC1hbXotY29udGVudC1zaGEyNTZcIixcbiAgXCJ4LWFtei1zZWN1cml0eS10b2tlblwiLFxuXTtcblxuLyoqIEEgYG5leHQuY29uZmlnYCByZXdyaXRlIHdob3NlIGRlc3RpbmF0aW9uIGlzIGFub3RoZXIgb3JpZ2luLiAqL1xuYXN5bmMgZnVuY3Rpb24gcHJveHlFeHRlcm5hbChcbiAgcmVxOiBTaGltSW5jb21pbmdNZXNzYWdlLFxuICByZXM6IFNoaW1TZXJ2ZXJSZXNwb25zZSxcbiAgdXJsOiBVUkwsXG4gIHJlcXVlc3RIZWFkZXJzOiBIZWFkZXJzLFxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IG1ldGhvZCA9IHJlcS5tZXRob2QgPz8gXCJHRVRcIjtcbiAgY29uc3QgaGFzQm9keSA9IG1ldGhvZCAhPT0gXCJHRVRcIiAmJiBtZXRob2QgIT09IFwiSEVBRFwiO1xuICBjb25zdCBoZWFkZXJzID0gbmV3IEhlYWRlcnMocmVxdWVzdEhlYWRlcnMpO1xuICBmb3IgKGNvbnN0IG5hbWUgb2YgUFJPWFlfRFJPUFBFRF9IRUFERVJTKSB7XG4gICAgaGVhZGVycy5kZWxldGUobmFtZSk7XG4gIH1cbiAgaWYgKHJlcS50cnVzdEZvcndhcmRlZEhvc3QpIHtcbiAgICBmb3IgKGNvbnN0IG5hbWUgb2YgU0lHVjRfSEVBREVSUykge1xuICAgICAgaGVhZGVycy5kZWxldGUobmFtZSk7XG4gICAgfVxuICB9XG4gIGNvbnN0IHVwc3RyZWFtID0gYXdhaXQgZmV0Y2godXJsLCB7XG4gICAgbWV0aG9kLFxuICAgIGhlYWRlcnMsXG4gICAgYm9keTogaGFzQm9keSA/IChSZWFkYWJsZS50b1dlYihyZXEpIGFzIFJlYWRhYmxlU3RyZWFtKSA6IHVuZGVmaW5lZCxcbiAgICByZWRpcmVjdDogXCJtYW51YWxcIixcbiAgICAuLi4oaGFzQm9keSA/IHsgZHVwbGV4OiBcImhhbGZcIiB9IDoge30pLFxuICB9IGFzIFJlcXVlc3RJbml0KTtcbiAgYXdhaXQgc2VuZFdlYlJlc3BvbnNlKHJlcywgdXBzdHJlYW0pO1xufVxuXG4vKipcbiAqIEhlYWRlcnMgZGVzY3JpYmluZyB0aGUgZnJhbWluZyBvZiBhIGJvZHkgdGhhdCBpcyBubyBsb25nZXIgdGhlIGJvZHkgYmVpbmdcbiAqIHNlbnQsIGRyb3BwZWQgZnJvbSBldmVyeSBgUmVzcG9uc2VgIHtAbGluayBzZW5kV2ViUmVzcG9uc2V9IGZvcndhcmRzLlxuICpcbiAqIEEgcHJveGllZCBvcmlnaW4ncyBgUmVzcG9uc2VgIGNhbWUgYmFjayBmcm9tIGBmZXRjaGAsIGFuZCBzbywgb2Z0ZW4sIGRpZFxuICogbWlkZGxld2FyZSdzIG93biAoYHJldHVybiBmZXRjaCh1cHN0cmVhbSlgIGluIGBwcm94eS50c2AsIHNpbmNlIG1pZGRsZXdhcmVcbiAqIHJ1bnMgaW4gcHJvY2VzcyBhbmQgaXRzIGBmZXRjaGAgaXMgdW5kaWNpKS4gdW5kaWNpIGRlY29kZXMgdGhlIGJvZHkg4oCUIGd6aXAsXG4gKiBkZWZsYXRlLCBiciwgenN0ZCDigJQgYW5kIGxlYXZlcyBgY29udGVudC1lbmNvZGluZ2AgYW5kIGBjb250ZW50LWxlbmd0aGBcbiAqIGRlc2NyaWJpbmcgdGhlIGVuY29kZWQgYnl0ZXMgaXQgYWxyZWFkeSB0aHJldyBhd2F5LiBGb3J3YXJkaW5nIHRoZW0gZW1pdHNcbiAqIHBsYWludGV4dCBsYWJlbGxlZCBgZ3ppcGAgKHRoZSBicm93c2VyIGZhaWxzIHRoZSB3aG9sZSByZXNwb25zZSB3aXRoXG4gKiBgRVJSX0NPTlRFTlRfREVDT0RJTkdfRkFJTEVEYCkgdW5kZXIgYSBgQ29udGVudC1MZW5ndGhgIHRoYXQgaXMgdG9vIHNob3J0LFxuICogYW5kIGBzaG91bGRHemlwYCB0aGVuIGRlY2xpbmVzIHRvIGNvbXByZXNzIGl0IGJlY2F1c2UgYGNvbnRlbnQtZW5jb2RpbmdgIGlzXG4gKiBhbHJlYWR5IHNldCwgc28gbm90aGluZyBkb3duc3RyZWFtIHJlcGFpcnMgaXQuIGB0cmFuc2Zlci1lbmNvZGluZ2AgaXNcbiAqIGhvcC1ieS1ob3A6IGl0IGRlc2NyaWJlZCB0aGUgdXBzdHJlYW0gY29ubmVjdGlvbiwgbm90IHRoaXMgb25lLlxuICpcbiAqIFN0b2NrIE5leHQuanMgZHJvcHMgdGhlIHNhbWUgdGhyZWUgZnJvbSBldmVyeSBtaWRkbGV3YXJlIHJlc3BvbnNlXG4gKiAoYEZPUkJJRERFTl9IRUFERVJTYCBpbiBgbmV4dC9kaXN0L3NlcnZlci93ZWIvc2FuZGJveC9zYW5kYm94LmpzYCksIHNvXG4gKiBtaWRkbGV3YXJlIGNhbm5vdCBsYWJlbCBhIGJvZHkgaXQgZW5jb2RlZCBpdHNlbGYgdGhlcmUgZWl0aGVyLlxuICovXG5jb25zdCBTVEFMRV9GUkFNSU5HX0hFQURFUlM6IFJlYWRvbmx5U2V0PHN0cmluZz4gPSBuZXcgU2V0KFtcbiAgXCJjb250ZW50LWVuY29kaW5nXCIsXG4gIFwiY29udGVudC1sZW5ndGhcIixcbiAgXCJ0cmFuc2Zlci1lbmNvZGluZ1wiLFxuXSk7XG5cbi8qKiBTdHJlYW0gYSBgUmVzcG9uc2VgIOKAlCBtaWRkbGV3YXJlJ3Mgb3duLCBvciBhIHByb3hpZWQgb3JpZ2luJ3Mg4oCUIGludG8gYHJlc2AuICovXG5hc3luYyBmdW5jdGlvbiBzZW5kV2ViUmVzcG9uc2UoXG4gIHJlczogU2hpbVNlcnZlclJlc3BvbnNlLFxuICByZXNwb25zZTogUmVzcG9uc2UsXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmVzLnN0YXR1c0NvZGUgPSByZXNwb25zZS5zdGF0dXM7XG4gIGlmIChyZXNwb25zZS5zdGF0dXNUZXh0KSB7XG4gICAgcmVzLnN0YXR1c01lc3NhZ2UgPSByZXNwb25zZS5zdGF0dXNUZXh0O1xuICB9XG4gIGNvbnN0IGhlYWRlcnMgPSBuZXcgSGVhZGVycyhyZXNwb25zZS5oZWFkZXJzKTtcbiAgZm9yIChjb25zdCBuYW1lIG9mIFNUQUxFX0ZSQU1JTkdfSEVBREVSUykge1xuICAgIGhlYWRlcnMuZGVsZXRlKG5hbWUpO1xuICB9XG4gIGFwcGx5SGVhZGVycyhyZXMsIGhlYWRlcnMpO1xuICBpZiAoIXJlc3BvbnNlLmJvZHkpIHtcbiAgICByZXMuZW5kKCk7XG4gICAgcmV0dXJuO1xuICB9XG4gIGZvciBhd2FpdCAoY29uc3QgY2h1bmsgb2YgcmVzcG9uc2UuYm9keSBhcyB1bmtub3duIGFzIEFzeW5jSXRlcmFibGU8VWludDhBcnJheT4pIHtcbiAgICAvLyBMZWF2aW5nIHRoZSBsb29wIGNhbmNlbHMgdGhlIGJvZHksIHdoaWNoIGlzIHdoYXQgc3RvcHMgYSBwcm94aWVkIG9yaWdpblxuICAgIC8vIGZyb20gYmVpbmcgcmVhZCB0byB0aGUgZW5kIGZvciBhIGNsaWVudCB0aGF0IGhhcyBhbHJlYWR5IGdvbmUuXG4gICAgaWYgKHJlcy5kZXN0cm95ZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gUGFjZWQgYnkgdGhlIGNsaWVudDogd2l0aG91dCB3YWl0aW5nIGZvciBgZHJhaW5gLCBhIGxhcmdlIHByb3hpZWQgYm9keVxuICAgIC8vIGhlYWRlZCBmb3IgYSBzbG93IGNsaWVudCBpcyBidWZmZXJlZCB3aG9sZSBpbiBtZW1vcnkuXG4gICAgY29uc3QgYWNjZXB0ZWQgPSByZXMud3JpdGUoY2h1bmspO1xuICAgIC8vIFNldCBieSB0aGUgc2luayB3aGVuIGl0IGNvbXByZXNzZXMuIFdpdGhvdXQgaXQgdGhlIGNodW5rIHNpdHMgaW4gemxpYidzXG4gICAgLy8gYnVmZmVyLCBhbmQgYSBzdHJlYW1lZCBib2R5IOKAlCBzZXJ2ZXItc2VudCBldmVudHMgdGhyb3VnaCBhIHJld3JpdGUsIGFcbiAgICAvLyBtaWRkbGV3YXJlIGBSZWFkYWJsZVN0cmVhbWAg4oCUIHJlYWNoZXMgdGhlIGNsaWVudCBhbGwgYXQgb25jZSwgYXQgdGhlIGVuZC5cbiAgICAvLyBOZXh0LmpzIGZsdXNoZXMgYWZ0ZXIgZXZlcnkgY2h1bmsgZm9yIHRoZSBzYW1lIHJlYXNvbiAoYHBpcGUtcmVhZGFibGVgKS5cbiAgICByZXMuZmx1c2g/LigpO1xuICAgIGlmICghYWNjZXB0ZWQgJiYgIShhd2FpdCBkcmFpbmVkKHJlcykpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9XG4gIHJlcy5lbmQoKTtcbn1cbiJdfQ==
|