cdk-nextjs 0.7.6 → 0.7.7
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 +3 -3
- package/.jsii.tabl.json +1 -1
- package/README.md +12 -3
- package/assets/lambdas/post-deploy/post-deploy.lambda/index.js +31 -13
- package/docs/caching-guide.md +11 -1
- package/docs/harness-coverage.md +2 -1
- package/lib/adapter/aws-cache-store.d.ts +214 -3
- package/lib/adapter/aws-cache-store.js +470 -35
- package/lib/adapter/aws-cache-store.test.js +675 -3
- package/lib/adapter/cache-handler.mjs +421 -30
- package/lib/adapter/use-cache-common.d.ts +53 -1
- package/lib/adapter/use-cache-common.js +121 -14
- package/lib/adapter/use-cache-common.test.js +138 -1
- package/lib/adapter/use-cache-default-handler.js +36 -6
- package/lib/adapter/use-cache-default-handler.mjs +525 -42
- package/lib/adapter/use-cache-handlers.test.js +247 -7
- package/lib/adapter/use-cache-remote-handler.js +9 -7
- package/lib/adapter/use-cache-remote-handler.mjs +516 -40
- package/lib/lambdas/post-deploy/prune-revalidation-table.d.ts +2 -1
- package/lib/lambdas/post-deploy/prune-revalidation-table.js +35 -13
- package/lib/lambdas/post-deploy/prune-revalidation-table.test.js +19 -1
- package/lib/nextjs-api.js +1 -1
- package/lib/nextjs-build/nextjs-build.js +1 -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 +18 -4
- package/lib/runtime/core.test.js +17 -1
- package/lib/runtime/lambda.mjs +16 -3
- package/lib/runtime/server.mjs +16 -3
- package/lib/runtime/tag-manifest.d.ts +15 -0
- package/lib/runtime/tag-manifest.js +24 -0
- package/lib/runtime/tag-manifest.test.d.ts +1 -0
- package/lib/runtime/tag-manifest.test.js +21 -0
- package/package.json +1 -1
package/lib/runtime/core.js
CHANGED
|
@@ -33,6 +33,7 @@ const middleware_1 = require("./middleware");
|
|
|
33
33
|
const next_modules_1 = require("./next-modules");
|
|
34
34
|
const public_files_1 = require("./public-files");
|
|
35
35
|
const static_files_1 = require("./static-files");
|
|
36
|
+
const tag_manifest_1 = require("./tag-manifest");
|
|
36
37
|
const util_1 = require("./util");
|
|
37
38
|
class NextjsRuntime {
|
|
38
39
|
options;
|
|
@@ -224,7 +225,7 @@ class NextjsRuntime {
|
|
|
224
225
|
// Middleware may have rewritten request headers via
|
|
225
226
|
// `NextResponse.next({ request: { headers } })`.
|
|
226
227
|
req.headers = (0, request_1.toIncomingHttpHeaders)(result.requestHeaders);
|
|
227
|
-
|
|
228
|
+
const options = {
|
|
228
229
|
waitUntil,
|
|
229
230
|
requestMeta: {
|
|
230
231
|
// The resolved query, stated rather than left to be re-derived.
|
|
@@ -294,7 +295,16 @@ class NextjsRuntime {
|
|
|
294
295
|
// mocked `req`/`res`).
|
|
295
296
|
revalidate: (config) => this.revalidate(config, request),
|
|
296
297
|
},
|
|
297
|
-
}
|
|
298
|
+
};
|
|
299
|
+
const render = () => handler(req, (0, response_1.asServerResponse)(res), options);
|
|
300
|
+
// Caught up here, not in `refreshTags`: Next.js awaits that inside the
|
|
301
|
+
// first `'use cache'` lookup, and a wait there cuts the static stage
|
|
302
|
+
// short. Only for a page: nothing else has a static stage to protect,
|
|
303
|
+
// and a route handler that reads the cache waits in `refreshTags`
|
|
304
|
+
// instead.
|
|
305
|
+
await (result.entrypoint.type === "app-page"
|
|
306
|
+
? (0, tag_manifest_1.catchUpTags)(render)
|
|
307
|
+
: render());
|
|
298
308
|
// A Pages API route owns the end of its response: `stream.pipe(res)`,
|
|
299
309
|
// an `externalResolver` proxy, or a callback that calls `res.json()`
|
|
300
310
|
// later all return from the handler before they are done writing, and
|
|
@@ -600,7 +610,11 @@ class NextjsRuntime {
|
|
|
600
610
|
if (target.kind === "entrypoint") {
|
|
601
611
|
const handler = await this.entrypoints.load(target.entrypoint);
|
|
602
612
|
req.url = requestedUrl ?? req.url;
|
|
603
|
-
|
|
613
|
+
const render = () => handler(req, (0, response_1.asServerResponse)(res), { waitUntil });
|
|
614
|
+
// App Router's `/_not-found` is a page render too: see `route`.
|
|
615
|
+
await (target.entrypoint.type === "app-page"
|
|
616
|
+
? (0, tag_manifest_1.catchUpTags)(render)
|
|
617
|
+
: render());
|
|
604
618
|
if (!res.writableEnded) {
|
|
605
619
|
res.end();
|
|
606
620
|
}
|
|
@@ -1213,4 +1227,4 @@ async function sendWebResponse(res, response) {
|
|
|
1213
1227
|
}
|
|
1214
1228
|
res.end();
|
|
1215
1229
|
}
|
|
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==
|
|
1230
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29yZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydW50aW1lL2NvcmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBdytCQSx3REFnQkM7QUFtREQsc0RBK0JDO0FBbUJELGtDQTBEQztBQWlJRCw4QkEyQ0M7QUFuMENELHNEQUFzRDtBQUN0RDs7Ozs7Ozs7Ozs7R0FXRztBQUNILCtDQUE0QztBQUU1Qyx5Q0FBaUM7QUFDakMsNkNBQWlEO0FBQ2pELG1EQUFvRDtBQUNwRCx5Q0FLb0I7QUFDcEIsK0NBSXVCO0FBQ3ZCLDRDQUE0RTtBQUM1RSw4Q0FJeUI7QUFDekIsc0NBQXVEO0FBQ3ZELG1DQUF1RTtBQUN2RSx5Q0FNb0I7QUFDcEIsNkNBQWdEO0FBQ2hELGlEQUt3QjtBQUN4QixpREFBa0U7QUFDbEUsaURBQW9FO0FBQ3BFLGlEQUE2QztBQUM3QyxpQ0FBMEU7QUErRDFFLE1BQWEsYUFBYTtJQVVZO0lBVG5CLFdBQVcsQ0FBcUI7SUFDaEMsVUFBVSxDQUFhO0lBQ3ZCLFVBQVUsQ0FBb0I7SUFDOUIsTUFBTSxDQUF3QjtJQUMvQywyQ0FBMkM7SUFDMUIsY0FBYyxDQUF5QztJQUN4RSxrRUFBa0U7SUFDakQsWUFBWSxDQUFVO0lBRXZDLFlBQW9DLE9BQTZCO1FBQTdCLFlBQU8sR0FBUCxPQUFPLENBQXNCO1FBQy9ELE1BQU0sRUFBRSxRQUFRLEVBQUUsY0FBYyxFQUFFLEdBQUcsT0FBTyxDQUFDO1FBQzdDLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxnQ0FBa0IsQ0FBQyxjQUFjLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDcEUsd0RBQXdEO1FBQ3hELE1BQU0sV0FBVyxHQUFHLElBQUEsaUNBQWtCLEVBQUMsY0FBYyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQ2pFLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxxQkFBVSxDQUFDO1lBQy9CLFFBQVE7WUFDUixXQUFXLEVBQUUsV0FBVyxDQUFDLEtBQUs7U0FDL0IsQ0FB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QUFDO1lBQ3ZDLE9BQU87UUFDVCxDQUFDO0lBQ0gsQ0FBQztJQUNELEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNaLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBpbXBvcnQvbm8tZXh0cmFuZW91cy1kZXBlbmRlbmNpZXMgKi9cbi8qKlxuICogVGhlIHJ1bnRpbWUgY29yZTogb25lIGBoYW5kbGUocmVxdWVzdCwgc2luaylgIHRoYXQgYm90aCBzaGVsbHMgd3JhcC5cbiAqXG4gKiBUaGUgTGFtYmRhIHNoZWxsIChgbGFtYmRhLm10c2ApIGFuZCB0aGUgY29udGFpbmVyIHNoZWxsIChgc2VydmVyLm10c2ApIGRvXG4gKiBub3RoaW5nIGJ1dCB0dXJuIHRoZWlyIGlucHV0IGludG8gYSB7QGxpbmsgUnVudGltZVJlcXVlc3R9IGFuZCB0aGVpciBvdXRwdXQgaW50b1xuICogYSB7QGxpbmsgUmVzcG9uc2VTaW5rfS4gRXZlcnl0aGluZyBlbHNlIOKAlCBzeW50aGVzaXppbmcgYHJlcWAvYHJlc2AsIGRpc3BhdGNoLFxuICogbWlkZGxld2FyZSwgZW50cnlwb2ludCBpbnZvY2F0aW9uLCBzdGF0aWMgZmlsZXMsIGltYWdlIG9wdGltaXphdGlvbiwgZ3ppcCxcbiAqIGB3YWl0VW50aWxgIOKAlCBoYXBwZW5zIGhlcmUsIHNvIHRoZSBjb250YWluZXIgZTJlIHN1aXRlIGV4ZXJjaXNlcyB0aGUgc2FtZSBjb2RlXG4gKiBMYW1iZGEgcnVucy4gVGhhdCBpcyBkZWxpYmVyYXRlOiB0aGUgY29udGFpbmVyIHBhdGggdXNlZCB0byBnZXQgcmVhbFxuICogYG5vZGU6aHR0cGAgb2JqZWN0cyBmcm9tIExhbWJkYSBXZWIgQWRhcHRlciwgd2hpY2ggbWVhbnQgY29udGFpbmVyIHRlc3RzIHByb3ZlZFxuICogbm90aGluZyBhYm91dCBMYW1iZGEuXG4gKi9cbmltcG9ydCB7IHJlYWRGaWxlIH0gZnJvbSBcIm5vZGU6ZnMvcHJvbWlzZXNcIjtcbmltcG9ydCB0eXBlIHsgSW5jb21pbmdIdHRwSGVhZGVycyB9IGZyb20gXCJub2RlOmh0dHBcIjtcbmltcG9ydCB7IGpvaW4gfSBmcm9tIFwibm9kZTpwYXRoXCI7XG5pbXBvcnQgeyBSZWFkYWJsZSwgV3JpdGFibGUgfSBmcm9tIFwibm9kZTpzdHJlYW1cIjtcbmltcG9ydCB7IGNhc2VDYW5vbmljYWxQYXRoIH0gZnJvbSBcIi4vY2FzZS1yZWRpcmVjdFwiO1xuaW1wb3J0IHtcbiAgRGlzcGF0Y2hlcixcbiAgb3V0T2ZCYW5kUm91dGVQYXJhbXMsXG4gIFN0YXR1c1RhcmdldCxcbiAgc3RhdHVzVGFyZ2V0cyxcbn0gZnJvbSBcIi4vZGlzcGF0Y2hcIjtcbmltcG9ydCB7XG4gIEVudHJ5cG9pbnRIYW5kbGVyLFxuICBFbnRyeXBvaW50UmVnaXN0cnksXG4gIFJvdXRlSW5PdGhlckdyb3VwRXJyb3IsXG59IGZyb20gXCIuL2VudHJ5cG9pbnRzXCI7XG5pbXBvcnQgeyBTaGltSW5jb21pbmdNZXNzYWdlLCB0b0luY29taW5nSHR0cEhlYWRlcnMgfSBmcm9tIFwiLi9odHRwL3JlcXVlc3RcIjtcbmltcG9ydCB7XG4gIGFzU2VydmVyUmVzcG9uc2UsXG4gIFJlc3BvbnNlSGVhZCxcbiAgU2hpbVNlcnZlclJlc3BvbnNlLFxufSBmcm9tIFwiLi9odHRwL3Jlc3BvbnNlXCI7XG5pbXBvcnQgeyBwaXBlVG9TaW5rLCBSZXNwb25zZVNpbmsgfSBmcm9tIFwiLi9odHRwL3NpbmtcIjtcbmltcG9ydCB7IEludGVybmFsSW1hZ2VSZXNwb25zZSwgUnVudGltZUltYWdlT3B0aW1pemVyIH0gZnJvbSBcIi4vaW1hZ2VcIjtcbmltcG9ydCB7XG4gIEFkYXB0ZXJNYW5pZmVzdCxcbiAgZGVwbG95ZWRNYW5pZmVzdFBhdGgsXG4gIEZVTkNUSU9OX0dST1VQX0VOVl9WQVIsXG4gIE1BTklGRVNUX0ZJTEVfTkFNRSxcbiAgUkVWQUxJREFURURfUEFHRV9IT09LLFxufSBmcm9tIFwiLi9tYW5pZmVzdFwiO1xuaW1wb3J0IHsgTWlkZGxld2FyZVJ1bm5lciB9IGZyb20gXCIuL21pZGRsZXdhcmVcIjtcbmltcG9ydCB7XG4gIGxvYWRFbnZGaWxlcyxcbiAgcmVnaXN0ZXJJbnN0cnVtZW50YXRpb24sXG4gIHNldHVwTm9kZUVudmlyb25tZW50LFxuICB1c2VOZXh0RnJvbSxcbn0gZnJvbSBcIi4vbmV4dC1tb2R1bGVzXCI7XG5pbXBvcnQgeyBwdWJsaWNEaXJLZXksIHJlc29sdmVQdWJsaWNGaWxlcyB9IGZyb20gXCIuL3B1YmxpYy1maWxlc1wiO1xuaW1wb3J0IHsgc2VydmVTM1B1YmxpY0ZpbGUsIHNlcnZlU3RhdGljRmlsZSB9IGZyb20gXCIuL3N0YXRpYy1maWxlc1wiO1xuaW1wb3J0IHsgY2F0Y2hVcFRhZ3MgfSBmcm9tIFwiLi90YWctbWFuaWZlc3RcIjtcbmltcG9ydCB7IGRyYWluZWQsIGZpcnN0VmFsdWUsIHRvU2VhcmNoLCB3aXRob3V0UGF0aFByZWZpeCB9IGZyb20gXCIuL3V0aWxcIjtcblxuLyoqIE9uZSByZXF1ZXN0LCBub3JtYWxpemVkIGJ5IGEgc2hlbGwuICovXG5leHBvcnQgaW50ZXJmYWNlIFJ1bnRpbWVSZXF1ZXN0IHtcbiAgcmVhZG9ubHkgbWV0aG9kOiBzdHJpbmc7XG4gIC8qKiBPcmlnaW4tZm9ybSB0YXJnZXQgZXhhY3RseSBhcyByZWNlaXZlZDogcGF0aCArIHF1ZXJ5LCBuZXZlciBhYnNvbHV0ZS4gKi9cbiAgcmVhZG9ubHkgdXJsOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGhlYWRlcnM6IEluY29taW5nSHR0cEhlYWRlcnM7XG4gIHJlYWRvbmx5IGJvZHk/OiBSZWFkYWJsZSB8IEJ1ZmZlcjtcbiAgcmVhZG9ubHkgcmVtb3RlQWRkcmVzcz86IHN0cmluZztcbiAgLyoqIGBmYWxzZWAgYmVoaW5kIGEgVExTLXRlcm1pbmF0aW5nIEFMQi4gT25seSBhZmZlY3RzIHRoZSBzeW50aGVzaXplZCBzb2NrZXQuICovXG4gIHJlYWRvbmx5IGVuY3J5cHRlZD86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBBYm9ydGVkIHdoZW4gdGhlIGNsaWVudCBkaXNjb25uZWN0cy4gV2lyaW5nIGl0IHRvIGByZXMuZGVzdHJveSgpYCBpcyB3aGF0XG4gICAqIG1ha2VzIGByZXF1ZXN0LnNpZ25hbC5vbmFib3J0YCBmaXJlIGluc2lkZSByb3V0ZSBoYW5kbGVycy5cbiAgICovXG4gIHJlYWRvbmx5IHNpZ25hbD86IEFib3J0U2lnbmFsO1xuICAvKipcbiAgICogV2hldGhlciBgeC1mb3J3YXJkZWQtaG9zdGAgbmFtZXMgdGhlIGhvc3QgdGhlIGNsaWVudCBhc2tlZCBmb3IuIE9ubHkgdGhlXG4gICAqIHNoZWxsIGNhbiBrbm93OiBpdCBpcyBgdHJ1ZWAgZm9yIGEgRnVuY3Rpb24gVVJMIGV2ZW50IHdob3NlIFNpZ1Y0IExhbWJkYVxuICAgKiB2ZXJpZmllZC4gVGhhdCBpcyBhbnkgSUFNLWF1dGhvcml6ZWQgaW52b2tlciDigJQgaW4gcHJhY3RpY2UgQ2xvdWRGcm9udCdzXG4gICAqIE9yaWdpbiBBY2Nlc3MgQ29udHJvbCwgd2hvc2Ugdmlld2VyLXJlcXVlc3QgZnVuY3Rpb24gb3ZlcndyaXRlcyB0aGUgaGVhZGVyXG4gICAqIHdpdGggdGhlIHZpZXdlcidzIGBIb3N0YCAoQ2xvdWRGcm9udCBoYXMgdG8gcmVwbGFjZSBgSG9zdGAgaXRzZWxmIHdpdGggdGhlXG4gICAqIEZ1bmN0aW9uIFVSTCdzIGRvbWFpbiksIHBsdXMgcHJpbmNpcGFscyBncmFudGVkIGBsYW1iZGE6SW52b2tlRnVuY3Rpb25VcmxgLFxuICAgKiB3aG8gY291bGQgcmVwbGFjZSB0aGUgZnVuY3Rpb24ncyBjb2RlIGFueXdheS4gSXQgaXMgYWxzbyB3aGF0XG4gICAqIGBwcm94eUV4dGVybmFsYCBkcm9wcyBPQUMncyBzaWduYXR1cmUgb24uIEV2ZXJ5d2hlcmUgZWxzZSB0aGUgaGVhZGVyIGlzXG4gICAqIHdoYXRldmVyIHRoZSBjbGllbnQgc2VudCwgYW5kIGl0IGlzXG4gICAqIGlnbm9yZWQsIGFzIGBuZXh0IHN0YXJ0YCBpZ25vcmVzIGl0IHdpdGhvdXQgYGV4cGVyaW1lbnRhbC50cnVzdEhvc3RIZWFkZXJgLlxuICAgKi9cbiAgcmVhZG9ubHkgdHJ1c3RGb3J3YXJkZWRIb3N0PzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIFNldCBieSB7QGxpbmsgTmV4dGpzUnVudGltZS5oYW5kbGVJbnRlcm5hbGx5fSBmb3IgdGhlIGluLXByb2Nlc3MgcmVxdWVzdHMgaXRcbiAgICogbWFrZXM6IGNhbGxlZCB3aXRoIHRoZSBgUm91dGVJbk90aGVyR3JvdXBFcnJvcmAgdGhlIHJvdXRlIHRocmV3LCBpbnN0ZWFkIG9mXG4gICAqIGxvZ2dpbmcgdGhlIG1pc3JvdXRlZC1yZXF1ZXN0IHdhcm5pbmcsIHdoaWNoIGRlc2NyaWJlcyBhIENsb3VkRnJvbnQgb3IgQVBJXG4gICAqIEdhdGV3YXkgcHJvYmxlbSB0aGlzIGlzIG5vdC5cbiAgICovXG4gIHJlYWRvbmx5IG9uUm91dGVJbk90aGVyR3JvdXA/OiAoZXJyb3I6IFJvdXRlSW5PdGhlckdyb3VwRXJyb3IpID0+IHZvaWQ7XG59XG5cbi8qKlxuICogYFJldmFsaWRhdGVGbmAncyBhcmd1bWVudCAoYG5leHQvZGlzdC9zZXJ2ZXIvbGliL3JvdXRlci11dGlscy9yb3V0ZXItc2VydmVyLWNvbnRleHRgKSxcbiAqIHJlc3RhdGVkIGJlY2F1c2UgdGhhdCBtb2R1bGUgaXMgbm90IHBhcnQgb2YgYG5leHRgJ3MgcHVibGlzaGVkIHR5cGUgc3VyZmFjZS5cbiAqL1xuaW50ZXJmYWNlIFJldmFsaWRhdGVDb25maWcge1xuICByZWFkb25seSB1cmxQYXRoOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGhlYWRlcnM6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIHwgc3RyaW5nW10gfTtcbiAgcmVhZG9ubHkgb3B0czogeyB1bnN0YWJsZV9vbmx5R2VuZXJhdGVkPzogYm9vbGVhbiB9O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE5leHRqc1J1bnRpbWVPcHRpb25zIHtcbiAgLyoqXG4gICAqIEFic29sdXRlIHBhdGggdG8gdGhlIGRlcGxveW1lbnQgcm9vdCDigJQgdGhlIHN0YWdlZCB0cmVlIGV2ZXJ5IG1hbmlmZXN0IGtleVxuICAgKiByZXNvbHZlcyBhZ2FpbnN0LiBgTEFNQkRBX1RBU0tfUk9PVGAgZm9yIEZ1bmN0aW9ucywgdGhlIGltYWdlIGBXT1JLRElSYCBmb3JcbiAgICogQ29udGFpbmVyczsgYm90aCBzaGVsbHMgZGVyaXZlIGl0IGZyb20gdGhlaXIgb3duIGxvY2F0aW9uIGluc3RlYWQuXG4gICAqL1xuICByZWFkb25seSBkZXBsb3ltZW50Um9vdDogc3RyaW5nO1xuICByZWFkb25seSBtYW5pZmVzdDogQWRhcHRlck1hbmlmZXN0O1xuICAvKiogYENES19ORVhUSlNfU1RBVElDX0FTU0VUU19CVUNLRVRfTkFNRWAuICovXG4gIHJlYWRvbmx5IGJ1Y2tldD86IHN0cmluZztcbiAgLyoqIGBDREtfTkVYVEpTX1NUQVRJQ19BU1NFVFNfS0VZX1BSRUZJWGAuICovXG4gIHJlYWRvbmx5IGJ1Y2tldEtleVByZWZpeD86IHN0cmluZztcbn1cblxuZXhwb3J0IGNsYXNzIE5leHRqc1J1bnRpbWUge1xuICBwcml2YXRlIHJlYWRvbmx5IGVudHJ5cG9pbnRzOiBFbnRyeXBvaW50UmVnaXN0cnk7XG4gIHByaXZhdGUgcmVhZG9ubHkgZGlzcGF0Y2hlcjogRGlzcGF0Y2hlcjtcbiAgcHJpdmF0ZSByZWFkb25seSBtaWRkbGV3YXJlPzogTWlkZGxld2FyZVJ1bm5lcjtcbiAgcHJpdmF0ZSByZWFkb25seSBpbWFnZXM6IFJ1bnRpbWVJbWFnZU9wdGltaXplcjtcbiAgLyoqIFRoZSA1MDAgbGFkZGVyOyBzZWUgYHN0YXR1c1RhcmdldHNgLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IGVycm9yVGFyZ2V0Rm9yOiAodXJsOiBVUkwgfCB1bmRlZmluZWQpID0+IFN0YXR1c1RhcmdldDtcbiAgLyoqIFRoZSBhc3NldHMgYnVja2V0LCB3aGVuIGBwdWJsaWMvYCBmaWxlcyBhcmUgc2VydmVkIGZyb20gaXQuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgcHVibGljQnVja2V0Pzogc3RyaW5nO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IG9wdGlvbnM6IE5leHRqc1J1bnRpbWVPcHRpb25zKSB7XG4gICAgY29uc3QgeyBtYW5pZmVzdCwgZGVwbG95bWVudFJvb3QgfSA9IG9wdGlvbnM7XG4gICAgdGhpcy5lbnRyeXBvaW50cyA9IG5ldyBFbnRyeXBvaW50UmVnaXN0cnkoZGVwbG95bWVudFJvb3QsIG1hbmlmZXN0KTtcbiAgICAvLyBMaXN0ZWQgb25jZSwgYXQgY29sZCBzdGFydDsgc2VlIGByZXNvbHZlUHVibGljRmlsZXNgLlxuICAgIGNvbnN0IHB1YmxpY0ZpbGVzID0gcmVzb2x2ZVB1YmxpY0ZpbGVzKGRlcGxveW1lbnRSb290LCBtYW5pZmVzdCk7XG4gICAgdGhpcy5kaXNwYXRjaGVyID0gbmV3IERpc3BhdGNoZXIoe1xuICAgICAgbWFuaWZlc3QsXG4gICAgICBwdWJsaWNGaWxlczogcHVibGljRmlsZXMuZmlsZXMsXG4gICAgfSk7XG4gICAgLy8gT24gZGlzayBvdGhlcndpc2UsIHdpdGggYC5uZXh0L3N0YXRpY2AuXG4gICAgdGhpcy5wdWJsaWNCdWNrZXQgPSBwdWJsaWNGaWxlcy5pblMzID8gb3B0aW9ucy5idWNrZXQgOiB1bmRlZmluZWQ7XG4gICAgdGhpcy5lcnJvclRhcmdldEZvciA9IHN0YXR1c1RhcmdldHMobWFuaWZlc3QsIDUwMCk7XG4gICAgdGhpcy5pbWFnZXMgPSBuZXcgUnVudGltZUltYWdlT3B0aW1pemVyKHtcbiAgICAgIGRlcGxveW1lbnRSb290LFxuICAgICAgbWFuaWZlc3QsXG4gICAgICBidWNrZXQ6IHRoaXMucHVibGljQnVja2V0ID8/IFwiXCIsXG4gICAgICBidWNrZXRLZXlQcmVmaXg6IG9wdGlvbnMuYnVja2V0S2V5UHJlZml4ID8/IFwiXCIsXG4gICAgICBmZXRjaEludGVybmFsOiAoaHJlZiwgcmVxLCBtYXhpbXVtQm9keSkgPT5cbiAgICAgICAgdGhpcy5mZXRjaEludGVybmFsKGhyZWYsIHJlcSwgbWF4aW11bUJvZHkpLFxuICAgIH0pO1xuICAgIC8vIFRoZSBydW5uZXIgaXMgc2hhcmVkIOKAlCBpdCBtZW1vaXplcyB0aGUgbG9hZGVkIG1pZGRsZXdhcmUgbW9kdWxlIOKAlCB3aGlsZSB0aGVcbiAgICAvLyBgaW52b2tlTWlkZGxld2FyZWAgY2FsbGJhY2sgaXQgcHJvZHVjZXMgaXMgcGVyIHJlcXVlc3QuXG4gICAgdGhpcy5taWRkbGV3YXJlID0gbWFuaWZlc3QubWlkZGxld2FyZVxuICAgICAgPyBuZXcgTWlkZGxld2FyZVJ1bm5lcih7XG4gICAgICAgICAgbWlkZGxld2FyZTogbWFuaWZlc3QubWlkZGxld2FyZSxcbiAgICAgICAgICByb290OiBkZXBsb3ltZW50Um9vdCxcbiAgICAgICAgfSlcbiAgICAgIDogdW5kZWZpbmVkO1xuICB9XG5cbiAgcHVibGljIGdldCBtYW5pZmVzdCgpOiBBZGFwdGVyTWFuaWZlc3Qge1xuICAgIHJldHVybiB0aGlzLm9wdGlvbnMubWFuaWZlc3Q7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgaGFuZGxlKFxuICAgIHJlcXVlc3Q6IFJ1bnRpbWVSZXF1ZXN0LFxuICAgIHNpbms6IFJlc3BvbnNlU2luayxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgeyBtYW5pZmVzdCB9ID0gdGhpcy5vcHRpb25zO1xuICAgIGNvbnN0IHBlbmRpbmc6IEFycmF5PFByb21pc2U8dW5rbm93bj4+ID0gW107XG4gICAgY29uc3Qgd2FpdFVudGlsID0gKHByb21pc2U6IFByb21pc2U8dW5rbm93bj4pID0+IHtcbiAgICAgIHBlbmRpbmcucHVzaChwcm9taXNlKTtcbiAgICB9O1xuXG4gICAgY29uc3QgYm9keSA9IHNwbGl0Qm9keShyZXF1ZXN0LmJvZHksIHRoaXMubWlkZGxld2FyZSAhPT0gdW5kZWZpbmVkKTtcbiAgICBjb25zdCByZXEgPSBuZXcgU2hpbUluY29taW5nTWVzc2FnZSh7XG4gICAgICBtZXRob2Q6IHJlcXVlc3QubWV0aG9kLFxuICAgICAgdXJsOiByZXF1ZXN0LnVybCxcbiAgICAgIGhlYWRlcnM6IHdpdGhvdXRJbnRlcm5hbEhlYWRlcnMoXG4gICAgICAgIHJlcXVlc3QuaGVhZGVycyxcbiAgICAgICAgcmVxdWVzdC51cmwsXG4gICAgICAgIG1hbmlmZXN0LmNvbmZpZy5iYXNlUGF0aCxcbiAgICAgICksXG4gICAgICBib2R5OiBib2R5LmZvclJlcXVlc3QsXG4gICAgICByZW1vdGVBZGRyZXNzOiByZXF1ZXN0LnJlbW90ZUFkZHJlc3MsXG4gICAgICBlbmNyeXB0ZWQ6IHJlcXVlc3QuZW5jcnlwdGVkLFxuICAgICAgdHJ1c3RGb3J3YXJkZWRIb3N0OiByZXF1ZXN0LnRydXN0Rm9yd2FyZGVkSG9zdCxcbiAgICB9KTtcbiAgICBjb25zdCByZXMgPSBuZXcgU2hpbVNlcnZlclJlc3BvbnNlKCk7XG4gICAgLy8gTmV4dC5qcyByZWFkcyBgcmVzLnJlcWAgaW4gYSBmZXcgZXJyb3IgcGF0aHMuXG4gICAgcmVzLnJlcSA9IHJlcTtcbiAgICByZXF1ZXN0LnNpZ25hbD8uYWRkRXZlbnRMaXN0ZW5lcihcImFib3J0XCIsICgpID0+IHJlcy5kZXN0cm95KCksIHtcbiAgICAgIG9uY2U6IHRydWUsXG4gICAgfSk7XG5cbiAgICAvLyBUaGUgcmVqZWN0aW9uIGhhbmRsZXIgaXMgYXR0YWNoZWQgaGVyZSByYXRoZXIgdGhhbiBhdCB0aGUgYGF3YWl0YCBiZWxvdy5cbiAgICAvLyBgcm91dGUoKWAgYXdhaXRzIHJlYWwgSS9PLCBzbyBhIHN0cmVhbSB0aGF0IGJyZWFrcyB3aGlsZSBpdCBydW5zIHdvdWxkXG4gICAgLy8gbGVhdmUgdGhpcyBwcm9taXNlIHJlamVjdGVkIHdpdGggbm8gaGFuZGxlciBhdHRhY2hlZCBmb3IgYSBmdWxsIGV2ZW50LWxvb3BcbiAgICAvLyB0dXJuIOKAlCBhbmQgTm9kZSAyNCBkZWZhdWx0cyB0byBgLS11bmhhbmRsZWQtcmVqZWN0aW9ucz10aHJvd2AsIHdoaWNoIG9uXG4gICAgLy8gdGhlIGNvbnRhaW5lciBzaGVsbCB0YWtlcyB0aGUgd2hvbGUgdGFzayBkb3duIGFuZCBhYm9ydHMgZXZlcnkgb3RoZXJcbiAgICAvLyBpbi1mbGlnaHQgcmVxdWVzdCBvbiBpdC4gQSBtaWQtc3RyZWFtIEVQSVBFIGZyb20gb25lIGNsaWVudCBkaXNjb25uZWN0IGlzXG4gICAgLy8gbm90IGdyb3VuZHMgZm9yIHRoYXQuXG4gICAgLy9cbiAgICAvLyBUaGUgZXJyb3IgaXMgbG9nZ2VkLCBub3QgcmV0aHJvd246IHRoZSBzdHJlYW0gYnJva2UgYWZ0ZXIgKG9yIHdoaWxlKSB0aGVcbiAgICAvLyBoZWFkIHdlbnQgb3V0IOKAlCBhIGNsaWVudCBkaXNjb25uZWN0LCBvciBgc2VuZEVycm9yYCBkZXN0cm95aW5nIGFcbiAgICAvLyBoYWxmLXdyaXR0ZW4gcmVzcG9uc2Ug4oCUIGFuZCBuZWl0aGVyIGlzIGFuIGludm9jYXRpb24gZmFpbHVyZS4gUmV0aHJvd2luZ1xuICAgIC8vIHdvdWxkIG1ha2UgTGFtYmRhIHJldHJ5IGEgcmVxdWVzdCB0aGUgY2xpZW50IGFscmVhZHkgYWJhbmRvbmVkLlxuICAgIGNvbnN0IGZpbmlzaGVkID0gcGlwZVRvU2luayhyZXEsIHJlcywgc2luaywge1xuICAgICAgY29tcHJlc3M6IG1hbmlmZXN0LmNvbmZpZy5jb21wcmVzcyxcbiAgICB9KS5jYXRjaCgoZXJyb3I6IHVua25vd24pID0+IHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXCJUaGUgcmVzcG9uc2Ugc3RyZWFtIGRpZCBub3QgY29tcGxldGU6XCIsIGVycm9yKTtcbiAgICB9KTtcblxuICAgIC8vIEZvciB0aGUgZXJyb3IgcGFnZSdzIGxvY2FsZTsgdW5zZXQgd2hlbiB0aGUgdGhyb3cgaXMgYGFic29sdXRlVXJsYCdzLlxuICAgIGxldCB1cmw6IFVSTCB8IHVuZGVmaW5lZDtcbiAgICB0cnkge1xuICAgICAgLy8gQmVmb3JlIGFueXRoaW5nIHBhcnNlcyB0aGUgdGFyZ2V0LCBpbmNsdWRpbmcgYGFic29sdXRlVXJsYCAtIGBuZXcgVVJMYFxuICAgICAgLy8gcmVhZHMgYSBsZWFkaW5nIGAvL2AgYXMgcHJvdG9jb2wtcmVsYXRpdmUgYW5kIHdvdWxkIHRha2UgdGhlIGZpcnN0IHBhdGhcbiAgICAgIC8vIHNlZ21lbnQgZm9yIHRoZSBob3N0LlxuICAgICAgY29uc3QgY29sbGFwc2VkID0gY29sbGFwc2VSZXBlYXRlZFNsYXNoZXMocmVxdWVzdC51cmwpO1xuICAgICAgaWYgKGNvbGxhcHNlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHNlbmRSZWRpcmVjdChyZXMsIGNvbGxhcHNlZCwgMzA4KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIEluc2lkZSB0aGUgdHJ5OiBgYWJzb2x1dGVVcmxgIGJ1aWxkcyBhIGBVUkxgIG91dCBvZiB0aGUgcmVxdWVzdCBsaW5lXG4gICAgICAgIC8vIGFuZCB0aGUgZm9yd2FyZGVkIGhlYWRlcnMsIGFuZCBhIHRocm93IGhlcmUgaGFzIHRvIHJlYWNoIHRoZSBlcnJvclxuICAgICAgICAvLyBsYWRkZXIgbGlrZSBhbnkgb3RoZXIuIE91dHNpZGUgaXQsIG9uIHRoZSBMYW1iZGEgc2hlbGxzIOKAlCB3aG9zZVxuICAgICAgICAvLyBoYW5kbGVycyB3cmFwIG5vdGhpbmcg4oCUIHRoZSBzYW1lIHRocm93IGlzIGFuIGludm9jYXRpb24gZXJyb3IgYW5kIGFcbiAgICAgICAgLy8gNTAyLlxuICAgICAgICB1cmwgPSBhYnNvbHV0ZVVybChyZXF1ZXN0KTtcbiAgICAgICAgYXdhaXQgdGhpcy5yb3V0ZShyZXEsIHJlcywgdXJsLCBib2R5LCB3YWl0VW50aWwsIHJlcXVlc3QpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBhd2FpdCB0aGlzLnNlbmRFcnJvcihyZXEsIHJlcywgd2FpdFVudGlsLCBlcnJvciwgdXJsKTtcbiAgICB9XG5cbiAgICBhd2FpdCBmaW5pc2hlZDtcblxuICAgIC8vIExhbWJkYSBmcmVlemVzIHRoZSBleGVjdXRpb24gZW52aXJvbm1lbnQgdGhlIG1vbWVudCB0aGUgaGFuZGxlciByZXNvbHZlcyDigJRcbiAgICAvLyB0aGVyZSBpcyBubyBwb3N0LXJlc3BvbnNlIGtlZXBhbGl2ZSDigJQgc28gYmFja2dyb3VuZCB3b3JrIHJlZ2lzdGVyZWQgd2l0aFxuICAgIC8vIGB3YWl0VW50aWxgIChub3RhYmx5IElTUiByZXZhbGlkYXRpb24pIGhhcyB0byBiZSBhd2FpdGVkIGhlcmUuIEFmdGVyIHRoZVxuICAgIC8vIHJlc3BvbnNlIHN0cmVhbSBoYXMgY2xvc2VkLCBzbyBjbGllbnQgbGF0ZW5jeSBpcyB1bmFmZmVjdGVkOyBiaWxsZWRcbiAgICAvLyBkdXJhdGlvbiBleHRlbmRzLCB3aGljaCBpcyB0aGUgY29ycmVjdCB0cmFkZSBhZ2FpbnN0IGEgcmV2YWxpZGF0aW9uIHRoYXRcbiAgICAvLyBuZXZlciBjb21wbGV0ZXMuXG4gICAgLy9cbiAgICAvLyBEcmFpbmVkIHVudGlsIG5vdGhpbmcgbmV3IGFycml2ZXMsIG5vdCBhd2FpdGVkIG9uY2U6IGB3YWl0VW50aWxgIGtlZXBzXG4gICAgLy8gYmVpbmcgY2FsbGVkIGFmdGVyIHRoZSByZXNwb25zZSDigJQgTmV4dCdzIGBBZnRlckNvbnRleHRgIHJlZ2lzdGVycyBpdHNcbiAgICAvLyBjYWxsYmFjayBxdWV1ZSBvbiB0aGUgZmlyc3QgYGFmdGVyKClgLCBhbmQgYW4gYGFmdGVyKHByb21pc2UpYCBtYWRlIGZyb21cbiAgICAvLyBpbnNpZGUgYSBydW5uaW5nIGNhbGxiYWNrLCBvciBhIGJhY2tncm91bmQgcmVnZW5lcmF0aW9uIHRoYXQgaXRzZWxmIGNhbGxzXG4gICAgLy8gYGFmdGVyKClgLCByZWdpc3RlcnMgbW9yZS4gQSBzaW5nbGUgYGFsbFNldHRsZWRgIHNuYXBzaG90cyB0aGUgYXJyYXkgYW5kXG4gICAgLy8gbGV0cyBMYW1iZGEgZnJlZXplIG9uIHRoYXQgbGF0ZSB3b3JrLlxuICAgIGxldCBzZXR0bGVkQ291bnQgPSAwO1xuICAgIHdoaWxlIChzZXR0bGVkQ291bnQgPCBwZW5kaW5nLmxlbmd0aCkge1xuICAgICAgY29uc3QgYmF0Y2ggPSBwZW5kaW5nLnNsaWNlKHNldHRsZWRDb3VudCk7XG4gICAgICBzZXR0bGVkQ291bnQgPSBwZW5kaW5nLmxlbmd0aDtcbiAgICAgIGNvbnN0IHNldHRsZWQgPSBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQoYmF0Y2gpO1xuICAgICAgZm9yIChjb25zdCByZXN1bHQgb2Ygc2V0dGxlZCkge1xuICAgICAgICBpZiAocmVzdWx0LnN0YXR1cyA9PT0gXCJyZWplY3RlZFwiKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihcIkEgd2FpdFVudGlsKCkgcHJvbWlzZSByZWplY3RlZDpcIiwgcmVzdWx0LnJlYXNvbik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHJvdXRlKFxuICAgIHJlcTogU2hpbUluY29taW5nTWVzc2FnZSxcbiAgICByZXM6IFNoaW1TZXJ2ZXJSZXNwb25zZSxcbiAgICB1cmw6IFVSTCxcbiAgICBib2R5OiBTcGxpdEJvZHksXG4gICAgd2FpdFVudGlsOiAocHJvbWlzZTogUHJvbWlzZTx1bmtub3duPikgPT4gdm9pZCxcbiAgICByZXF1ZXN0OiBSdW50aW1lUmVxdWVzdCxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5kaXNwYXRjaGVyLmRpc3BhdGNoKHtcbiAgICAgIG1ldGhvZDogcmVxLm1ldGhvZCA/PyBcIkdFVFwiLFxuICAgICAgdXJsLFxuICAgICAgaGVhZGVyczogbmV3IEhlYWRlcnModG9XZWJIZWFkZXJzKHJlcS5oZWFkZXJzKSksXG4gICAgICBib2R5OiBib2R5LmZvckRpc3BhdGNoLFxuICAgICAgaW52b2tlTWlkZGxld2FyZTogdGhpcy5taWRkbGV3YXJlPy5pbnZva2VyRm9yKHtcbiAgICAgICAgd2FpdFVudGlsLFxuICAgICAgICBzaWduYWw6IHJlcXVlc3Quc2lnbmFsLFxuICAgICAgfSksXG4gICAgfSk7XG4gICAgYm9keS5yZWxlYXNlVW5yZWFkKHJlc3VsdC5raW5kID09PSBcIm1pZGRsZXdhcmUtcmVzcG9uZGVkXCIpO1xuXG4gICAgYXBwbHlIZWFkZXJzKHJlcywgcmVzdWx0LnJlc3BvbnNlSGVhZGVycyk7XG4gICAgaWYgKHJlc3VsdC5zdGF0dXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmVzLnN0YXR1c0NvZGUgPSByZXN1bHQuc3RhdHVzO1xuICAgIH1cblxuICAgIHN3aXRjaCAocmVzdWx0LmtpbmQpIHtcbiAgICAgIGNhc2UgXCJlbnRyeXBvaW50XCI6IHtcbiAgICAgICAgbGV0IGhhbmRsZXI6IEVudHJ5cG9pbnRIYW5kbGVyO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGhhbmRsZXIgPSBhd2FpdCB0aGlzLmVudHJ5cG9pbnRzLmxvYWQocmVzdWx0LmVudHJ5cG9pbnQpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGlmICghKGVycm9yIGluc3RhbmNlb2YgUm91dGVJbk90aGVyR3JvdXBFcnJvcikpIHRocm93IGVycm9yO1xuICAgICAgICAgIC8vIEEgVVJMIHRoZSBlZGdlIHNlbnQgaGVyZSBvbmx5IGJlY2F1c2Ugb2YgaXRzIGNhc2UgZ29lcyB0byBpdHNcbiAgICAgICAgICAvLyBjYW5vbmljYWwgc3BlbGxpbmcsIHdoaWNoIHRoZSBlZGdlIHJvdXRlcyB0byB0aGUgb3duaW5nIGdyb3VwLlxuICAgICAgICAgIGNvbnN0IGNhbm9uaWNhbCA9IGNhc2VDYW5vbmljYWxQYXRoKFxuICAgICAgICAgICAgdXJsLnBhdGhuYW1lLFxuICAgICAgICAgICAgcmVzdWx0LnJlc29sdmVkUGF0aG5hbWUsXG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMubWFuaWZlc3QsXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAoY2Fub25pY2FsKSB7XG4gICAgICAgICAgICBzZW5kUmVkaXJlY3QocmVzLCBgJHtjYW5vbmljYWx9JHt1cmwuc2VhcmNofWAsIDMwOCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChyZXF1ZXN0Lm9uUm91dGVJbk90aGVyR3JvdXApIHtcbiAgICAgICAgICAgIC8vIEV4cGxhaW5lZCBieSB0aGUgY2FsbGVyIG9mIGBoYW5kbGVJbnRlcm5hbGx5YCwgd2hpY2gga25vd3Mgd2h5IGl0XG4gICAgICAgICAgICAvLyBoYXBwZW5lZC5cbiAgICAgICAgICAgIHJlcXVlc3Qub25Sb3V0ZUluT3RoZXJHcm91cChlcnJvcik7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIExvZ2dlZCwgYmVjYXVzZSBpdCBpcyBhbHNvIHdoYXQgYSBtaXNyb3V0ZWQgZ3JvdXAgbG9va3MgbGlrZTsgc2VlXG4gICAgICAgICAgICAvLyBgUm91dGVJbk90aGVyR3JvdXBFcnJvcmAgZm9yIHdoeSBpdCBpcyBhIDQwNC5cbiAgICAgICAgICAgIGNvbnNvbGUud2FybihlcnJvci5tZXNzYWdlKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYXdhaXQgdGhpcy5zZW5kVW5tYXRjaGVkKFxuICAgICAgICAgICAgcmVxLFxuICAgICAgICAgICAgcmVzLFxuICAgICAgICAgICAgd2FpdFVudGlsLFxuICAgICAgICAgICAgeyBwYXRobmFtZTogdXJsLnBhdGhuYW1lLCByZXF1ZXN0SGVhZGVyczogcmVzdWx0LnJlcXVlc3RIZWFkZXJzIH0sXG4gICAgICAgICAgICB1cmwsXG4gICAgICAgICAgKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gVGhlIGludm9jYXRpb24gdGFyZ2V0LCBub3QgdGhlIHJlcXVlc3RlZCBVUkw6IGByZXNvbHZlUm91dGVzYCBoYXNcbiAgICAgICAgLy8gYXBwbGllZCByZXdyaXRlcywgc3RyaXBwZWQgaTE4biBwcmVmaXhlcywgYW5kIGFwcGVuZGVkIHRoZSBgbnh0UGBcbiAgICAgICAgLy8gcm91dGUgcGFyYW1zIGFzIHF1ZXJ5IHZhbHVlcy4gVGhhdCBpcyBleGFjdGx5IHRoZSBjb250cmFjdCBOZXh0LmpzXG4gICAgICAgIC8vIGRvY3VtZW50cyBmb3IgYSBwcm94eSBpbiBmcm9udCBvZiBhIGZ1bmN0aW9uIOKAlCBgUm91dGVNb2R1bGUucHJlcGFyZWBcbiAgICAgICAgLy8gcmVjb3ZlcnMgYHBhcmFtc2AgZnJvbSB0aGVzZSBxdWVyeSB2YWx1ZXMg4oCUIHNvIHRoYXQgY29udHJhY3QsIG5vdFxuICAgICAgICAvLyBgcmVxdWVzdE1ldGEucGFyYW1zYCwgaXMgaG93IHBhcmFtcyBnZXQgcGFzc2VkLiBUaGUgb25lIGV4Y2VwdGlvbiBpc1xuICAgICAgICAvLyBhIGNhcHR1cmUgdGhlIGNvbnRyYWN0IHdvdWxkIGNvcnJ1cHQ7IHNlZSBgb3V0T2ZCYW5kUm91dGVQYXJhbXNgLlxuICAgICAgICBjb25zdCBvdXRPZkJhbmQgPSBvdXRPZkJhbmRSb3V0ZVBhcmFtcyhcbiAgICAgICAgICByZXN1bHQuaW52b2NhdGlvblRhcmdldC5xdWVyeSxcbiAgICAgICAgICByZXN1bHQucmVzb2x2ZWRQYXRobmFtZSxcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgaW52b2NhdGlvblF1ZXJ5ID1cbiAgICAgICAgICBvdXRPZkJhbmQ/LnF1ZXJ5ID8/IHJlc3VsdC5pbnZvY2F0aW9uVGFyZ2V0LnF1ZXJ5O1xuICAgICAgICBjb25zdCB7IHBhdGhuYW1lIH0gPSByZXN1bHQuaW52b2NhdGlvblRhcmdldDtcbiAgICAgICAgY29uc3Qgc2VhcmNoID0gdG9TZWFyY2goaW52b2NhdGlvblF1ZXJ5KTtcbiAgICAgICAgcmVxLnVybCA9IHNlYXJjaCA/IGAke3BhdGhuYW1lfT8ke3NlYXJjaH1gIDogcGF0aG5hbWU7XG4gICAgICAgIC8vIE1pZGRsZXdhcmUgbWF5IGhhdmUgcmV3cml0dGVuIHJlcXVlc3QgaGVhZGVycyB2aWFcbiAgICAgICAgLy8gYE5leHRSZXNwb25zZS5uZXh0KHsgcmVxdWVzdDogeyBoZWFkZXJzIH0gfSlgLlxuICAgICAgICByZXEuaGVhZGVycyA9IHRvSW5jb21pbmdIdHRwSGVhZGVycyhyZXN1bHQucmVxdWVzdEhlYWRlcnMpO1xuICAgICAgICBjb25zdCBvcHRpb25zOiBQYXJhbWV0ZXJzPHR5cGVvZiBoYW5kbGVyPlsyXSA9IHtcbiAgICAgICAgICB3YWl0VW50aWwsXG4gICAgICAgICAgcmVxdWVzdE1ldGE6IHtcbiAgICAgICAgICAgIC8vIFRoZSByZXNvbHZlZCBxdWVyeSwgc3RhdGVkIHJhdGhlciB0aGFuIGxlZnQgdG8gYmUgcmUtZGVyaXZlZC5cbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvLyBgUm91dGVNb2R1bGUucHJlcGFyZWAgcnVucyBgaGFuZGxlUmV3cml0ZXNgIGFnYWluc3QgYHJlcS51cmxgXG4gICAgICAgICAgICAvLyB1bmNvbmRpdGlvbmFsbHksIGFuZCBgcmVxLnVybGAgaXMgdGhlICphbHJlYWR5IHJld3JpdHRlbiogdGFyZ2V0LlxuICAgICAgICAgICAgLy8gQSBgYmVmb3JlRmlsZXNgIHJld3JpdGUgd2hvc2UgY29uZGl0aW9uIHN0aWxsIGhvbGRzIGFmdGVyIGl0IGhhc1xuICAgICAgICAgICAgLy8gYmVlbiBhcHBsaWVkIHRoZXJlZm9yZSBnZXRzIGFwcGxpZWQgdHdpY2U6IGluXG4gICAgICAgICAgICAvLyBgdGVzdC9lMmUvbGluay13aXRoLWFwaS1yZXdyaXRlYCB0aGUgcnVsZVxuICAgICAgICAgICAgLy8gYC86cGF0aCguKilgICsgYGhhczogcXVlcnkganNvbj10cnVlYCAtPiBgL2FwaS9qc29uP2Zyb209LzpwYXRoYFxuICAgICAgICAgICAgLy8gbWF0Y2hlZCBgL2FwaS9qc29uP2pzb249dHJ1ZSZmcm9tPS9zb21lL3JvdXRlL2ZvcmAgYSBzZWNvbmQgdGltZVxuICAgICAgICAgICAgLy8gYW5kIG92ZXJ3cm90ZSBgZnJvbWAgd2l0aCBgL2FwaS9qc29uYC4gYG5leHQgc3RhcnRgIGVzY2FwZXMgaXRcbiAgICAgICAgICAgIC8vIGJlY2F1c2UgaXRzIHJvdXRlciBsZWF2ZXMgYHJlcS51cmxgIGFzIHRoZSBVUkwgdGhlIGNsaWVudCBzZW50LCBzb1xuICAgICAgICAgICAgLy8gdGhlIG9uZSBwYXNzIGBwcmVwYXJlYCBtYWtlcyBpcyB0aGUgb25seSBvbmUuXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy8gYHByZXBhcmVgIHByZWZlcnMgdGhpcyBtZXRhIG92ZXIgaXRzIG93biBgcGFyc2VkVXJsLnF1ZXJ5YFxuICAgICAgICAgICAgLy8gKFwid2hlbiBkZXBsb3llZCBwcm94aWVzIHdpbGwgYWRkIHF1ZXJ5IHZhbHVlcyBmcm9tIHJlc29sdmluZyB0aGVcbiAgICAgICAgICAgIC8vIHJvdXRlcyB0byBwYXNzIHRvIGZ1bmN0aW9uXCIpLCB3aGljaCBpcyB0aGUgZG9jdW1lbnRlZCBkaXZpc2lvbiBvZlxuICAgICAgICAgICAgLy8gbGFib3VyIGZvciBhIHByb3h5IGluIGZyb250IG9mIGEgZnVuY3Rpb24gLSBhbmQgaXQgaXMgdGhlIHNhbWVcbiAgICAgICAgICAgIC8vIGRpdmlzaW9uIHRoZSBgcmVxLnVybGAgYWJvdmUgcmVsaWVzIG9uLiBTZXR0aW5nIGl0IGRvZXMgbm90IHN0b3BcbiAgICAgICAgICAgIC8vIHRoZSBzZWNvbmQgcmV3cml0ZSBwYXNzLCBpdCBqdXN0IHN0b3BzIHRoYXQgcGFzcyBmcm9tIGJlaW5nIHdoYXRcbiAgICAgICAgICAgIC8vIHRoZSByb3V0ZSBzZWVzLlxuICAgICAgICAgICAgcXVlcnk6IHsgLi4uaW52b2NhdGlvblF1ZXJ5IH0sXG4gICAgICAgICAgICAvLyBTZXQgb25seSBmb3IgYSBjYXB0dXJlIHRoZSBxdWVyeSBjb250cmFjdCBjYW5ub3QgY2FycnksIGFuZCB0aGVuXG4gICAgICAgICAgICAvLyBpbiBwbGFjZSBvZiBpdCByYXRoZXIgdGhhbiBhbG9uZ3NpZGUuXG4gICAgICAgICAgICAuLi4ob3V0T2ZCYW5kID8geyBwYXJhbXM6IG91dE9mQmFuZC5wYXJhbXMgfSA6IHt9KSxcbiAgICAgICAgICAgIC8vIFdpdGhvdXQgdGhpcywgYFJvdXRlTW9kdWxlLnByZXBhcmVgIGZhbGxzIGJhY2sgdG9cbiAgICAgICAgICAgIC8vIGBodHRwOi8vbG9jYWxob3N0JHtyZXEudXJsfWAgYW5kIGV2ZXJ5IGFic29sdXRlIFVSTCBhIHJvdXRlXG4gICAgICAgICAgICAvLyBoYW5kbGVyIGJ1aWxkcyBpcyB3cm9uZy4gYHJlbGF0aXZlUHJvamVjdERpcmAgaXMgZGVsaWJlcmF0ZWx5XG4gICAgICAgICAgICAvLyAqbm90KiBwYXNzZWQ6IHRoZSBydW50aW1lIGBjaGRpcmBzIHRvIHRoZSBwcm9qZWN0IGRpciwgc28gdGhlXG4gICAgICAgICAgICAvLyB2YWx1ZSBOZXh0LmpzIGlubGluZWQgYXQgYnVpbGQgdGltZSAoXCJcIikgaXMgYWxyZWFkeSBjb3JyZWN0LCBhbmRcbiAgICAgICAgICAgIC8vIGBhcHAtcGFnZS1ydW50aW1lLmpzYCBpZ25vcmVzIHRoZSByZXF1ZXN0TWV0YSBvdmVycmlkZSBhbnl3YXkuXG4gICAgICAgICAgICBpbml0VVJMOiB1cmwuaHJlZixcbiAgICAgICAgICAgIC8vIEZlZWRzIGByb3V0ZXJTZXJ2ZXJDb250ZXh0Lmhvc3RuYW1lYCAoYHJvdXRlLW1vZHVsZS5qc2BcbiAgICAgICAgICAgIC8vIGBnZXRSb3V0ZXJTZXJ2ZXJDb250ZXh0YCkuIEluY2x1ZGVzIHRoZSBwb3J0LCBiZWNhdXNlIGl0IGlzXG4gICAgICAgICAgICAvLyBjb25jYXRlbmF0ZWQgaW50byBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgaG9zdG5hbWU6IHVybC5ob3N0LFxuICAgICAgICAgICAgLy8gQm90aCByb3V0ZXJzIGNhbGwgdGhpcyBmb3IgYSBgbm90Rm91bmQ6IHRydWVgIC8gYG5vdEZvdW5kKClgIHRoYXRcbiAgICAgICAgICAgIC8vIHRoZSBlbnRyeXBvaW50IGl0c2VsZiBjYW5ub3QgcmVuZGVyLCBhbmQgZmFsbCBiYWNrIHRvXG4gICAgICAgICAgICAvLyBgcmVzLmVuZCgnVGhpcyBwYWdlIGNvdWxkIG5vdCBiZSBmb3VuZCcpYCDigJQgbm8gc3RhdHVzLCBubyBhcHAgNDA0XG4gICAgICAgICAgICAvLyBwYWdlIOKAlCB3aGVuIGl0IGlzIGFic2VudC4gVGhlIGByZXFgL2ByZXNgIHRoZXkgcGFzcyBhcmUgdGhlIG9uZXNcbiAgICAgICAgICAgIC8vIGhhbmRlZCBpbiBqdXN0IGFib3ZlLCBzbyB0aGUgY2FwdHVyZWQgcGFpciBpcyB1c2VkIGluc3RlYWQgb2ZcbiAgICAgICAgICAgIC8vIHJlLWRlcml2aW5nIHRoZW0uXG4gICAgICAgICAgICByZW5kZXI0MDQ6IGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgYXdhaXQgdGhpcy5zZW5kTm90Rm91bmQoXG4gICAgICAgICAgICAgICAgcmVxLFxuICAgICAgICAgICAgICAgIHJlcyxcbiAgICAgICAgICAgICAgICB3YWl0VW50aWwsXG4gICAgICAgICAgICAgICAgdGhpcy5kaXNwYXRjaGVyLm5vdEZvdW5kRm9yKHVybCksXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgLy8gYHJlcy5yZXZhbGlkYXRlKClgIGZyb20gYSBQYWdlcyBBUEkgcm91dGUuIFdpdGhvdXQgaXQsIE5leHQuanNcbiAgICAgICAgICAgIC8vIGZhbGxzIGJhY2sgdG8gYGZldGNoKCdodHRwczovLycgKyByZXEuaGVhZGVycy5ob3N0ICsgdXJsUGF0aClgIOKAlFxuICAgICAgICAgICAgLy8gYW5kIG9ubHkgd2hlbiBgZXhwZXJpbWVudGFsLnRydXN0SG9zdEhlYWRlcmAgaXMgc2V0LCB3aGljaCBpdCBpc1xuICAgICAgICAgICAgLy8gbm90LCBzbyBgcmVzLnJldmFsaWRhdGUoKWAgdGhyZXdcbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvLyAgIEZhaWxlZCB0byByZXZhbGlkYXRlIC86IEludmFyaWFudDogbWlzc2luZyBpbnRlcm5hbFxuICAgICAgICAgICAgLy8gICByb3V0ZXItc2VydmVyLW1ldGhvZHMgdGhpcyBpcyBhbiBpbnRlcm5hbCBidWdcbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvLyBhbmQgYHRlc3QvZTJlL3JldmFsaWRhdGUtcmVhc29uYCBzYXcgYHN0YWxlYCB3aGVyZSBgbmV4dCBzdGFydGBcbiAgICAgICAgICAgIC8vIHJlcG9ydHMgYG9uLWRlbWFuZGA6IHRoZSByb3V0ZSBzdGlsbCByZS1yZW5kZXJlZCwganVzdCBhcyBhblxuICAgICAgICAgICAgLy8gb3JkaW5hcnkgc3RhbGUgcmVnZW5lcmF0aW9uIHJhdGhlciB0aGFuIHRoZSBvbi1kZW1hbmQgb25lIGl0XG4gICAgICAgICAgICAvLyBhc2tlZCBmb3IuXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy8gQW5zd2VyaW5nIGl0IGluIHByb2Nlc3MgcmF0aGVyIHRoYW4gYnkgc2V0dGluZ1xuICAgICAgICAgICAgLy8gYHRydXN0SG9zdEhlYWRlcmA6IHRoZSBmZXRjaCBwYXRoIHdvdWxkIGxlYXZlIHRoZSBmdW5jdGlvbiwgY3Jvc3NcbiAgICAgICAgICAgIC8vIENsb3VkRnJvbnQgYW5kIGNvbWUgYmFjayDigJQgYSBzZWNvbmQgYmlsbGVkIGludm9jYXRpb24sIGFcbiAgICAgICAgICAgIC8vIGRlcGVuZGVuY3kgb24gYHgtcHJlcmVuZGVyLXJldmFsaWRhdGVgIHN1cnZpdmluZyB0aGUgZWRnZSwgYW5kIGFcbiAgICAgICAgICAgIC8vIHJlYXNvbiB0byB0cnVzdCBhIGNsaWVudC1zdXBwbGllZCBgSG9zdGAuIE5leHQuanMncyBvd25cbiAgICAgICAgICAgIC8vIG5vbi1zZXJ2ZXJsZXNzIGFuc3dlciBpcyB0aGUgc2FtZSBzaGFwZSBhcyB0aGlzIG9uZVxuICAgICAgICAgICAgLy8gKGBOZXh0U2VydmVyI3JldmFsaWRhdGVgIHJ1bnMgaXRzIHJlcXVlc3QgaGFuZGxlciBhZ2FpbnN0IGFcbiAgICAgICAgICAgIC8vIG1vY2tlZCBgcmVxYC9gcmVzYCkuXG4gICAgICAgICAgICByZXZhbGlkYXRlOiAoY29uZmlnOiBSZXZhbGlkYXRlQ29uZmlnKSA9PlxuICAgICAgICAgICAgICB0aGlzLnJldmFsaWRhdGUoY29uZmlnLCByZXF1ZXN0KSxcbiAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgICAgICBjb25zdCByZW5kZXIgPSAoKSA9PiBoYW5kbGVyKHJlcSwgYXNTZXJ2ZXJSZXNwb25zZShyZXMpLCBvcHRpb25zKTtcbiAgICAgICAgLy8gQ2F1Z2h0IHVwIGhlcmUsIG5vdCBpbiBgcmVmcmVzaFRhZ3NgOiBOZXh0LmpzIGF3YWl0cyB0aGF0IGluc2lkZSB0aGVcbiAgICAgICAgLy8gZmlyc3QgYCd1c2UgY2FjaGUnYCBsb29rdXAsIGFuZCBhIHdhaXQgdGhlcmUgY3V0cyB0aGUgc3RhdGljIHN0YWdlXG4gICAgICAgIC8vIHNob3J0LiBPbmx5IGZvciBhIHBhZ2U6IG5vdGhpbmcgZWxzZSBoYXMgYSBzdGF0aWMgc3RhZ2UgdG8gcHJvdGVjdCxcbiAgICAgICAgLy8gYW5kIGEgcm91dGUgaGFuZGxlciB0aGF0IHJlYWRzIHRoZSBjYWNoZSB3YWl0cyBpbiBgcmVmcmVzaFRhZ3NgXG4gICAgICAgIC8vIGluc3RlYWQuXG4gICAgICAgIGF3YWl0IChyZXN1bHQuZW50cnlwb2ludC50eXBlID09PSBcImFwcC1wYWdlXCJcbiAgICAgICAgICA/IGNhdGNoVXBUYWdzKHJlbmRlcilcbiAgICAgICAgICA6IHJlbmRlcigpKTtcbiAgICAgICAgLy8gQSBQYWdlcyBBUEkgcm91dGUgb3ducyB0aGUgZW5kIG9mIGl0cyByZXNwb25zZTogYHN0cmVhbS5waXBlKHJlcylgLFxuICAgICAgICAvLyBhbiBgZXh0ZXJuYWxSZXNvbHZlcmAgcHJveHksIG9yIGEgY2FsbGJhY2sgdGhhdCBjYWxscyBgcmVzLmpzb24oKWBcbiAgICAgICAgLy8gbGF0ZXIgYWxsIHJldHVybiBmcm9tIHRoZSBoYW5kbGVyIGJlZm9yZSB0aGV5IGFyZSBkb25lIHdyaXRpbmcsIGFuZFxuICAgICAgICAvLyBlbmRpbmcgaGVyZSBzZW50IGFuIGVtcHR5IDIwMCBhbmQgbWFkZSB0aGVpciB3cml0ZXMgdGhyb3dcbiAgICAgICAgLy8gYEVSUl9TVFJFQU1fV1JJVEVfQUZURVJfRU5EYC4gYG5leHQgc3RhcnRgJ3MgYGFwaVJlc29sdmVyYCBsZWF2ZXMgaXRcbiAgICAgICAgLy8gb3BlbiB0b28g4oCUIG9uZSB0aGF0IG5ldmVyIGVuZHMgc3RhbGxzLCB0aGVyZSBhcyBoZXJlLiBgaGFuZGxlYCBhd2FpdHNcbiAgICAgICAgLy8gdGhlIHJlc3BvbnNlIGl0c2VsZiwgc28gbm90aGluZyBpcyBjdXQgc2hvcnQgYnkgcmV0dXJuaW5nLlxuICAgICAgICBpZiAoIXJlcy53cml0YWJsZUVuZGVkICYmIHJlc3VsdC5lbnRyeXBvaW50LnR5cGUgIT09IFwicGFnZS1hcGlcIikge1xuICAgICAgICAgIHJlcy5lbmQoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNhc2UgXCJzdGF0aWMtZmlsZVwiOiB7XG4gICAgICAgIGNvbnN0IHN0YXR1c1BhZ2UgPVxuICAgICAgICAgIHJlc3VsdC5zb3VyY2UgPT09IFwic2VydmVyXCJcbiAgICAgICAgICAgID8gdGhpcy5zdGF0dXNQYWdlU3RhdHVzKHJlc3VsdC5wYXRobmFtZSlcbiAgICAgICAgICAgIDogdW5kZWZpbmVkO1xuICAgICAgICAvLyBgbmV4dCBzdGFydGAgc2VydmVzIGEgYHB1YmxpYy9gIG9yIGBfbmV4dC9zdGF0aWNgIGZpbGUgdG8gR0VUIGFuZFxuICAgICAgICAvLyBIRUFEIG9ubHksIGFuZCBgc2VuZGAgd291bGQgc2VydmUgaXQgdG8gYW55IG1ldGhvZC4gVGhlIHNhbWUgZ29lcyBmb3JcbiAgICAgICAgLy8gYW4gYXV0by1leHBvcnRlZCBQYWdlcyBSb3V0ZXIgcGFnZSAoYGJhc2Utc2VydmVyLmpzYFxuICAgICAgICAvLyBgcmVuZGVyVG9SZXNwb25zZVdpdGhDb21wb25lbnRzSW1wbGA6IGEgc3RyaW5nIGBDb21wb25lbnRgIGFuc3dlcnNcbiAgICAgICAgLy8gYW55dGhpbmcgZWxzZSB3aXRoIGEgNDA1KSwgZXhjZXB0IHRoZSA0MDQgYW5kIDUwMCBwYWdlcy5cbiAgICAgICAgaWYgKFxuICAgICAgICAgIHJlcS5tZXRob2QgIT09IFwiR0VUXCIgJiZcbiAgICAgICAgICByZXEubWV0aG9kICE9PSBcIkhFQURcIiAmJlxuICAgICAgICAgIChyZXN1bHQuc291cmNlICE9PSBcInNlcnZlclwiIHx8XG4gICAgICAgICAgICAoc3RhdHVzUGFnZSA9PT0gdW5kZWZpbmVkICYmIHJlc3VsdC5maWxlUGF0aC5lbmRzV2l0aChcIi5odG1sXCIpKSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgc2VuZE1ldGhvZE5vdEFsbG93ZWQocmVzKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gXCJlbnN1cmUgY29ycmVjdCBzdGF0dXMgaXMgc2V0IHdoZW4gdmlzaXRpbmcgYSBzdGF0dXMgcGFnZSBkaXJlY3RseVwiOlxuICAgICAgICAvLyBgbmV4dCBzdGFydGAgYW5zd2VycyBgLzQwNGAgd2l0aCBhIDQwNCBhbmQgYC81MDBgIHdpdGggYSA1MDAsIG5vdCB0aGVcbiAgICAgICAgLy8gMjAwIHRoZWlyIHByZXJlbmRlcmVkIEhUTUwgd291bGQgb3RoZXJ3aXNlIGdvIG91dCB3aXRoLlxuICAgICAgICBpZiAoc3RhdHVzUGFnZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgcmVzLnN0YXR1c0NvZGUgPSBzdGF0dXNQYWdlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGV0YWcgPSB0aGlzLm9wdGlvbnMubWFuaWZlc3QuY29uZmlnLmdlbmVyYXRlRXRhZ3M7XG4gICAgICAgIGNvbnN0IHB1YmxpY0RpciA9IGAke3B1YmxpY0RpcktleSh0aGlzLm9wdGlvbnMubWFuaWZlc3QpfS9gO1xuICAgICAgICBjb25zdCBzZXJ2ZWQgPVxuICAgICAgICAgIChhd2FpdCBzZXJ2ZVN0YXRpY0ZpbGUoXG4gICAgICAgICAgICByZXEsXG4gICAgICAgICAgICByZXMsXG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMuZGVwbG95bWVudFJvb3QsXG4gICAgICAgICAgICByZXN1bHQuZmlsZVBhdGgsXG4gICAgICAgICAgICB7IGV0YWcgfSxcbiAgICAgICAgICApKSB8fFxuICAgICAgICAgIC8vIExpc3RlZCBidXQgbm90IHN0YWdlZDogYSBMYW1iZGEgcm9vdCwgd2hvc2UgYHB1YmxpYy9gIGlzIGluIFMzLlxuICAgICAgICAgIChyZXN1bHQuc291cmNlID09PSBcInB1YmxpY1wiICYmXG4gICAgICAgICAgICAhIXRoaXMucHVibGljQnVja2V0ICYmXG4gICAgICAgICAgICAoYXdhaXQgc2VydmVTM1B1YmxpY0ZpbGUocmVxLCByZXMsIHtcbiAgICAgICAgICAgICAgYnVja2V0OiB0aGlzLnB1YmxpY0J1Y2tldCxcbiAgICAgICAgICAgICAga2V5UHJlZml4OiB0aGlzLm9wdGlvbnMuYnVja2V0S2V5UHJlZml4ID8/IFwiXCIsXG4gICAgICAgICAgICAgIGZpbGU6IHJlc3VsdC5maWxlUGF0aC5zbGljZShwdWJsaWNEaXIubGVuZ3RoKSxcbiAgICAgICAgICAgICAgZXRhZyxcbiAgICAgICAgICAgIH0pKSk7XG4gICAgICAgIGlmICghc2VydmVkKSB7XG4gICAgICAgICAgLy8gVGhlIHJvdXRpbmcgcnVsZSB0aGF0IG1hdGNoZWQgYSBidWlsZCBhc3NldCBhbHJlYWR5IHNldCBpdHNcbiAgICAgICAgICAvLyB5ZWFyLWxvbmcgYGltbXV0YWJsZWAgQ2FjaGUtQ29udHJvbCwgd2hpY2ggYHNlbmRVbm1hdGNoZWRgXG4gICAgICAgICAgLy8gcmVwbGFjZXM6IHVuZGVyIGl0IHRoZSA0MDQgd291bGQgYmUgY2FjaGVkIGF0IHRoZSBlZGdlIGFuZCBpblxuICAgICAgICAgIC8vIGJyb3dzZXJzIGZvciB0aGF0IGxvbmcsIGFuZCBhIGNodW5rIHRoYXQgc2hvd3MgdXAgb24gdGhlIG5leHRcbiAgICAgICAgICAvLyBkZXBsb3kgd291bGQgc3RheSBtaXNzaW5nLlxuICAgICAgICAgIGF3YWl0IHRoaXMuc2VuZFVubWF0Y2hlZChyZXEsIHJlcywgd2FpdFVudGlsLCByZXN1bHQsIHVybCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjYXNlIFwiaW1hZ2Utb3B0aW1pemF0aW9uXCI6XG4gICAgICAgIGlmICghdGhpcy5pbWFnZXMuaXNFbmFibGVkKCkpIHtcbiAgICAgICAgICBhd2FpdCB0aGlzLnNlbmRVbm1hdGNoZWQoXG4gICAgICAgICAgICByZXEsXG4gICAgICAgICAgICByZXMsXG4gICAgICAgICAgICB3YWl0VW50aWwsXG4gICAgICAgICAgICB7IHBhdGhuYW1lOiB1cmwucGF0aG5hbWUsIHJlcXVlc3RIZWFkZXJzOiByZXN1bHQucmVxdWVzdEhlYWRlcnMgfSxcbiAgICAgICAgICAgIHVybCxcbiAgICAgICAgICApO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICByZXEuaGVhZGVycyA9IHRvSW5jb21pbmdIdHRwSGVhZGVycyhyZXN1bHQucmVxdWVzdEhlYWRlcnMpO1xuICAgICAgICBhd2FpdCB0aGlzLmltYWdlcy5oYW5kbGUocmVxLCByZXMsIHJlc3VsdC51cmwsIHdhaXRVbnRpbCk7XG4gICAgICAgIHJldHVybjtcblxuICAgICAgY2FzZSBcInJlZGlyZWN0XCI6XG4gICAgICAgIHNlbmRSZWRpcmVjdChyZXMsIHJlc3VsdC5sb2NhdGlvbiwgcmVzdWx0LnN0YXR1cyk7XG4gICAgICAgIHJldHVybjtcblxuICAgICAgY2FzZSBcImV4dGVybmFsLXJld3JpdGVcIjpcbiAgICAgICAgYXdhaXQgcHJveHlFeHRlcm5hbChyZXEsIHJlcywgcmVzdWx0LnVybCwgcmVzdWx0LnJlcXVlc3RIZWFkZXJzKTtcbiAgICAgICAgcmV0dXJuO1xuXG4gICAgICBjYXNlIFwibWlkZGxld2FyZS1yZXNwb25kZWRcIjpcbiAgICAgICAgYXdhaXQgc2VuZFdlYlJlc3BvbnNlKHJlcywgcmVzdWx0LnJlc3BvbnNlKTtcbiAgICAgICAgcmV0dXJuO1xuXG4gICAgICBjYXNlIFwicmVzcG9uc2VcIjpcbiAgICAgICAgcmVzLmVuZCgpO1xuICAgICAgICByZXR1cm47XG5cbiAgICAgIGNhc2UgXCJub3QtZm91bmRcIjpcbiAgICAgICAgYXdhaXQgdGhpcy5zZW5kVW5tYXRjaGVkKHJlcSwgcmVzLCB3YWl0VW50aWwsIHJlc3VsdCwgdXJsKTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiA0MDQgb3IgNTAwIHdoZW4gYHBhdGhuYW1lYCBpcyB0aGUgcHJlcmVuZGVyZWQgYC80MDRgIG9yIGAvNTAwYCBwYWdlIOKAlCB1bmRlclxuICAgKiBgYmFzZVBhdGhgIGFuZCwgaW4gYW4gaTE4biBhcHAsIGFueSBsb2NhbGUgKGAvZnIvNDA0YCkg4oCUIGFuZCBgdW5kZWZpbmVkYFxuICAgKiBvdGhlcndpc2UuIGBuZXh0IHN0YXJ0YCBtYXRjaGVzIHRoZSBwYWdlLCBub3QgdGhlIFVSTCwgc28gdGhlIGxvY2FsZSBkb2VzXG4gICAqIG5vdCBtYXR0ZXIuXG4gICAqL1xuICBwcml2YXRlIHN0YXR1c1BhZ2VTdGF0dXMocGF0aG5hbWU6IHN0cmluZyk6IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgeyBiYXNlUGF0aCwgaTE4biB9ID0gdGhpcy5vcHRpb25zLm1hbmlmZXN0LmNvbmZpZztcbiAgICBsZXQgcGFnZSA9IHdpdGhvdXRQYXRoUHJlZml4KHBhdGhuYW1lLCBiYXNlUGF0aCk7XG4gICAgY29uc3QgbG9jYWxlcyA9IChpMThuIGFzIHsgbG9jYWxlcz86IHJlYWRvbmx5IHN0cmluZ1tdIH0gfCBudWxsKT8ubG9jYWxlcztcbiAgICBmb3IgKGNvbnN0IGxvY2FsZSBvZiBsb2NhbGVzID8/IFtdKSB7XG4gICAgICBjb25zdCBzdHJpcHBlZCA9IHdpdGhvdXRQYXRoUHJlZml4KHBhZ2UsIGAvJHtsb2NhbGV9YCk7XG4gICAgICBpZiAoc3RyaXBwZWQgIT09IHBhZ2UpIHtcbiAgICAgICAgcGFnZSA9IHN0cmlwcGVkO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHBhZ2UgPT09IFwiLzQwNFwiKSByZXR1cm4gNDA0O1xuICAgIGlmIChwYWdlID09PSBcIi81MDBcIikgcmV0dXJuIDUwMDtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIGBuZXh0IHN0YXJ0YCdzIGFuc3dlciB0byBhIHBhdGggbm90aGluZyBzZXJ2ZXMgKGByb3V0ZXItc2VydmVyLmpzYCwgdGhlXG4gICAqIFwiNDA0IGNhc2VcIiksIGZvciBib3RoIHdheXMgb2YgZ2V0dGluZyBoZXJlOiBkaXNwYXRjaCBtYXRjaGVkIG5vdGhpbmcsIG9yIGl0XG4gICAqIG1hdGNoZWQgYSBidWlsZCBhc3NldCB0aGF0IGlzIG5vdCBpbiB0aGUgcGFja2FnZS5cbiAgICpcbiAgICogTm8tc3RvcmUsIGFsd2F5cy4gQSBwcmVyZW5kZXJlZCBgL19ub3QtZm91bmRgIHdvdWxkIG90aGVyd2lzZSBzZW5kIGl0c1xuICAgKiBjYWNoZSBlbnRyeSdzIHllYXItbG9uZyBgcy1tYXhhZ2VgLCBhbmQgdGhlIENETiB3b3VsZCBrZWVwIHRoZSA0MDQgcGFzdCB0aGVcbiAgICogZGVwbG95IHRoYXQgYWRkcyB0aGUgcm91dGUuIFNldCByYXRoZXIgdGhhbiBmb3JjZWQ6IE5leHQncyBwYWdlIGhhbmRsZXJzXG4gICAqIG9ubHkgd3JpdGUgYSBgQ2FjaGUtQ29udHJvbGAgd2hlbiBub25lIGlzIHNldCAoYHNlbmRSZW5kZXJSZXN1bHRgLFxuICAgKiBgcGFnZXMtaGFuZGxlci5qc2ApLCB3aGljaCBpcyBleGFjdGx5IGhvdyBgbmV4dCBzdGFydGAncyBvd24gbm8tc3RvcmUgaGVyZVxuICAgKiBzdXJ2aXZlcyB0aGUgcmVuZGVyLiBgcmVuZGVyNDA0YCBpcyBub3QgdGhpcyBwYXRoOiBhIGBub3RGb3VuZCgpYCBmcm9tIGFuXG4gICAqIElTUiBwYWdlIGlzIGNhY2hlYWJsZSBmb3IgdGhhdCBwYWdlJ3MgcmV2YWxpZGF0ZSBwZXJpb2QuXG4gICAqXG4gICAqIEEgbWlzc2luZyBgX25leHQvc3RhdGljYCBmaWxlLCBhbmQgYSBHRVQgb3IgSEVBRCB3aG9zZSBgU2VjLUZldGNoLURlc3RgXG4gICAqIHNheXMgaXQgY2Fubm90IGRpc3BsYXkgSFRNTCAoYW4gYDxpbWc+YCwgYSBzY3JpcHQsIGEgZm9udCksIGdldCBhXG4gICAqIHBsYWluLXRleHQgYE5vdCBGb3VuZGAgaW5zdGVhZCBvZiB0aGUgcmVuZGVyZWQgcGFnZSDigJQgbm90aGluZyB3b3VsZCBzaG93XG4gICAqIGl0LCBhbmQgcmVuZGVyaW5nIGl0IGlzIHRoZSBleHBlbnNpdmUgcGFydC5cbiAgICpcbiAgICogRXZlcnl0aGluZyBlbHNlIHJlbmRlcnMgdGhlIGFwcCdzIDQwNCBhcyB0aGUgcGF0aCB0aGF0IHdhcyBhc2tlZCBmb3IsIG5vdFxuICAgKiBhcyBgL19ub3QtZm91bmRgOiB0aGUgQXBwIFJvdXRlciBzZXJpYWxpemVzIHRoZSBjYW5vbmljYWwgVVJMIGludG8gdGhlIFJTQ1xuICAgKiBwYXlsb2FkLCBzbyBhIGNsaWVudCBoeWRyYXRlZCBvZmYgYSBgL19ub3QtZm91bmRgIHBheWxvYWQgcmVwb3J0cyB0aGUgd3JvbmdcbiAgICogYHVzZVBhdGhuYW1lKClgIGFuZCBwdXNoZXMgdGhlIHdyb25nIGhpc3RvcnkgZW50cnkuIEl0IHJlbmRlcnMgd2l0aCB0aGVcbiAgICogcmVxdWVzdCBoZWFkZXJzIG1pZGRsZXdhcmUgc2V0LCB0b28g4oCUIGEgQ1NQIG5vbmNlLCBzYXkuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHNlbmRVbm1hdGNoZWQoXG4gICAgcmVxOiBTaGltSW5jb21pbmdNZXNzYWdlLFxuICAgIHJlczogU2hpbVNlcnZlclJlc3BvbnNlLFxuICAgIHdhaXRVbnRpbDogKHByb21pc2U6IFByb21pc2U8dW5rbm93bj4pID0+IHZvaWQsXG4gICAgcmVzdWx0OiB7IHJlYWRvbmx5IHBhdGhuYW1lOiBzdHJpbmc7IHJlYWRvbmx5IHJlcXVlc3RIZWFkZXJzOiBIZWFkZXJzIH0sXG4gICAgdXJsOiBVUkwsXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJlcy5zZXRIZWFkZXIoXCJDYWNoZS1Db250cm9sXCIsIE5PX1NUT1JFKTtcbiAgICBjb25zdCB7IGJhc2VQYXRoLCBhc3NldFByZWZpeCB9ID0gdGhpcy5vcHRpb25zLm1hbmlmZXN0LmNvbmZpZztcbiAgICBjb25zdCBwYXRobmFtZSA9IHdpdGhvdXRQYXRoUHJlZml4KFxuICAgICAgd2l0aG91dFBhdGhQcmVmaXgocmVzdWx0LnBhdGhuYW1lLCBiYXNlUGF0aCksXG4gICAgICBhc3NldFByZWZpeCxcbiAgICApO1xuICAgIGlmIChcbiAgICAgIHBhdGhuYW1lLnN0YXJ0c1dpdGgoXCIvX25leHQvc3RhdGljL1wiKSB8fFxuICAgICAgKChyZXEubWV0aG9kID09PSBcIkdFVFwiIHx8IHJlcS5tZXRob2QgPT09IFwiSEVBRFwiKSAmJlxuICAgICAgICBOT05fSFRNTF9TRUNfRkVUQ0hfREVTVFMuaGFzKFxuICAgICAgICAgIGZpcnN0VmFsdWUocmVxLmhlYWRlcnNbXCJzZWMtZmV0Y2gtZGVzdFwiXSkgPz8gXCJcIixcbiAgICAgICAgKSlcbiAgICApIHtcbiAgICAgIHJlcy5zdGF0dXNDb2RlID0gNDA0O1xuICAgICAgcmVzLnNldEhlYWRlcihcIkNvbnRlbnQtVHlwZVwiLCBcInRleHQvcGxhaW47IGNoYXJzZXQ9dXRmLThcIik7XG4gICAgICByZXMuZW5kKFwiTm90IEZvdW5kXCIpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICByZXEuaGVhZGVycyA9IHRvSW5jb21pbmdIdHRwSGVhZGVycyhyZXN1bHQucmVxdWVzdEhlYWRlcnMpO1xuICAgIGF3YWl0IHRoaXMuc2VuZE5vdEZvdW5kKFxuICAgICAgcmVxLFxuICAgICAgcmVzLFxuICAgICAgd2FpdFVudGlsLFxuICAgICAgdGhpcy5kaXNwYXRjaGVyLm5vdEZvdW5kRm9yKHVybCksXG4gICAgICBgJHtyZXN1bHQucGF0aG5hbWV9JHt1cmwuc2VhcmNofWAsXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBPbmUgb24tZGVtYW5kIHJldmFsaWRhdGlvbiwgcnVuIGFnYWluc3QgdGhpcyBydW50aW1lIHJhdGhlciB0aGFuIG92ZXIgdGhlXG4gICAqIG5ldHdvcmsuIFdpcmVkIGluIGFzIGByZXF1ZXN0TWV0YS5yZXZhbGlkYXRlYDsgc2VlIHRoZSBjb21tZW50IHRoZXJlLlxuICAgKlxuICAgKiBUaGUgcmVzcG9uc2UgaXMgdGhyb3duIGF3YXkg4oCUIG9ubHkgaXRzIHN0YXR1cyBtYXR0ZXJzIOKAlCBidXQgaXQgZ29lcyB0aHJvdWdoXG4gICAqIHRoZSBmdWxsIHtAbGluayBoYW5kbGV9LCBzbyB0aGUgZW50cnlwb2ludCBzZWVzIGEgcmVxdWVzdCB3aXRoXG4gICAqIGB4LXByZXJlbmRlci1yZXZhbGlkYXRlYCBvbiBpdCBhbmQgd3JpdGVzIHRoZSBmcmVzaCBlbnRyeSB0aHJvdWdoIHRoZSBjYWNoZVxuICAgKiBoYW5kbGVyIGV4YWN0bHkgYXMgYSByZXF1ZXN0IGZyb20gb3V0c2lkZSB3b3VsZC4gYGhhbmRsZWAgYXdhaXRzIGl0cyBvd25cbiAgICogYHdhaXRVbnRpbGAgd29yaywgc28gdGhlIG5ldyBlbnRyeSBpcyBjb21taXR0ZWQgYmVmb3JlIGByZXMucmV2YWxpZGF0ZSgpYFxuICAgKiByZXNvbHZlcywgd2hpY2ggaXMgd2hhdCBjYWxsZXJzIHRoYXQgcmV2YWxpZGF0ZSBhbmQgdGhlbiByZWRpcmVjdCBkZXBlbmQgb24uXG4gICAqXG4gICAqIFRoZSBhY2NlcHQvdGhyb3cgcnVsZSBpcyBgTmV4dFNlcnZlciNyZXZhbGlkYXRlYCdzLCB2ZXJiYXRpbTogYSByZXZhbGlkYXRpb25cbiAgICogaXMgc3VjY2Vzc2Z1bCBpZiBpdCB3YXMgY2FjaGVkIG9yIGFuc3dlcmVkIDIwMCwgYW5kIGBub3RGb3VuZDogdHJ1ZWBcbiAgICogbGVnaXRpbWF0ZWx5IGFuc3dlcnMgNDA0IGZvciBhbiBgdW5zdGFibGVfb25seUdlbmVyYXRlZGAgY2FsbGVyLiBBbnl0aGluZ1xuICAgKiBlbHNlIHRocm93cywgYW5kIGByZXMucmV2YWxpZGF0ZSgpYCB0dXJucyBpdCBpbnRvIGBGYWlsZWQgdG8gcmV2YWxpZGF0ZVxuICAgKiA8cGF0aD46IDxtZXNzYWdlPmAuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHJldmFsaWRhdGUoXG4gICAgY29uZmlnOiBSZXZhbGlkYXRlQ29uZmlnLFxuICAgIG9yaWdpbjogUnVudGltZVJlcXVlc3QsXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHsgaGVhZCwgb3RoZXJHcm91cCB9ID0gYXdhaXQgdGhpcy5oYW5kbGVJbnRlcm5hbGx5KFxuICAgICAge1xuICAgICAgICBtZXRob2Q6IFwiR0VUXCIsXG4gICAgICAgIHVybDogY29uZmlnLnVybFBhdGgsXG4gICAgICAgIC8vIFRoZSBjYWxsZXIncyBhdXRob3JpdHksIG5vdCB0aGUgcmV2YWxpZGF0ZWQgcGF0aCdzOiBpdCBpcyB3aGF0XG4gICAgICAgIC8vIGBhYnNvbHV0ZVVybGAgYnVpbGRzIHRoZSByZXF1ZXN0IFVSTCBmcm9tLCBhbmQgYSByZXZhbGlkYXRpb24gaXMgZm9yXG4gICAgICAgIC8vIHRoZSBvcmlnaW4gYmVpbmcgc2VydmVkLiBUaGUgZm9yd2FyZGVkIHBhaXIgd2l0aCBpdCDigJQgYmVoaW5kXG4gICAgICAgIC8vIENsb3VkRnJvbnQgYGhvc3RgIGlzIHRoZSBGdW5jdGlvbiBVUkwsIGFuZCBhIHJlbmRlciB0aGF0IGJ1aWx0IGl0c1xuICAgICAgICAvLyBhYnNvbHV0ZSBVUkxzIGZyb20gdGhhdCB3b3VsZCBjYWNoZSBsaW5rcyB0byB0aGUgcmF3IGZ1bmN0aW9uLlxuICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgLi4uY29uZmlnLmhlYWRlcnMsXG4gICAgICAgICAgaG9zdDogb3JpZ2luLmhlYWRlcnMuaG9zdCxcbiAgICAgICAgICAuLi5waWNrRGVmaW5lZChvcmlnaW4uaGVhZGVycywgW1xuICAgICAgICAgICAgXCJ4LWZvcndhcmRlZC1ob3N0XCIsXG4gICAgICAgICAgICBcIngtZm9yd2FyZGVkLXByb3RvXCIsXG4gICAgICAgICAgXSksXG4gICAgICAgIH0sXG4gICAgICAgIGVuY3J5cHRlZDogb3JpZ2luLmVuY3J5cHRlZCxcbiAgICAgICAgdHJ1c3RGb3J3YXJkZWRIb3N0OiBvcmlnaW4udHJ1c3RGb3J3YXJkZWRIb3N0LFxuICAgICAgfSxcbiAgICAgIHt9LFxuICAgICk7XG5cbiAgICBjb25zdCBzdGF0dXMgPSBoZWFkPy5zdGF0dXNDb2RlID8/IDUwMDtcbiAgICBpZiAob3RoZXJHcm91cCkge1xuICAgICAgY29uc3Qgc2VsZiA9IHByb2Nlc3MuZW52W0ZVTkNUSU9OX0dST1VQX0VOVl9WQVJdO1xuICAgICAgLy8gQSBwYWdlIHBhY2thZ2VkIGludG8gYW5vdGhlciBgZnVuY3Rpb25Hcm91cHNgIGdyb3VwOiBpdCBpcyByZW5kZXJlZCBpblxuICAgICAgLy8gcHJvY2VzcywgYW5kIHRoaXMgZnVuY3Rpb24gZG9lcyBub3QgaGF2ZSB0aGUgcGFnZSdzIGNvZGUuIENoZWNrZWRcbiAgICAgIC8vIGZpcnN0IGJlY2F1c2UgaXQgcmVuZGVycyBhcyBhIDQwNCwgd2hpY2ggYHVuc3RhYmxlX29ubHlHZW5lcmF0ZWRgXG4gICAgICAvLyB3b3VsZCBvdGhlcndpc2UgYWNjZXB0LlxuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgSW52YWxpZCByZXNwb25zZSAke3N0YXR1c306IFwiJHtjb25maWcudXJsUGF0aH1cIiBiZWxvbmdzIHRvIGAgK1xuICAgICAgICAgIGBcXGBmdW5jdGlvbkdyb3Vwc1xcYCBncm91cCBcIiR7b3RoZXJHcm91cC5vd25lcn1cIiwgYW5kIGAgK1xuICAgICAgICAgIGByZXMucmV2YWxpZGF0ZSgpIGNhbiBvbmx5IHJldmFsaWRhdGUgcGFnZXMgaW4gdGhlIGdyb3VwIGl0IHJ1bnMgYCArXG4gICAgICAgICAgYGluIChcIiR7c2VsZn1cIikuIENhbGwgaXQgZnJvbSBhbiBBUEkgcm91dGUgaW4gZ3JvdXAgYCArXG4gICAgICAgICAgYFwiJHtvdGhlckdyb3VwLm93bmVyfVwiLCBvciB1c2UgcmV2YWxpZGF0ZVBhdGgoKS9yZXZhbGlkYXRlVGFnKCksIGAgK1xuICAgICAgICAgIGB3aGljaCB3b3JrIGZyb20gYW55IGdyb3VwLmAsXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICBoZWFkPy5oZWFkZXJzW1wieC1uZXh0anMtY2FjaGVcIl0gIT09IFwiUkVWQUxJREFURURcIiAmJlxuICAgICAgc3RhdHVzICE9PSAyMDAgJiZcbiAgICAgICEoc3RhdHVzID09PSA0MDQgJiYgY29uZmlnLm9wdHMudW5zdGFibGVfb25seUdlbmVyYXRlZClcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCByZXNwb25zZSAke3N0YXR1c31gKTtcbiAgICB9XG5cbiAgICBhd2FpdCBpbnZhbGlkYXRlUmV2YWxpZGF0ZWRQYWdlKGNvbmZpZy51cmxQYXRoLCB0aGlzLm9wdGlvbnMubWFuaWZlc3QpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFuIGltYWdlIG9wdGltaXphdGlvbiBzb3VyY2UgdGhhdCBpcyBub3QgYSBmaWxlOiBgPEltYWdlIHNyYz1cIi9hcGkvYXZhdGFyXCI+YFxuICAgKiBzZXJ2ZWQgYnkgYSByb3V0ZSBoYW5kbGVyLiBXaXJlZCBpbiBhcyB0aGUgb3B0aW1pemVyJ3MgYGZldGNoSW50ZXJuYWxgLCBhbmRcbiAgICogcnVuIGluIHByb2Nlc3MgZm9yIHRoZSByZWFzb25zIHtAbGluayByZXZhbGlkYXRlfSBpcyDigJQgYG5leHQgc3RhcnRgIGZldGNoZXNcbiAgICogdGhlIHNvdXJjZSBmcm9tIGl0c2VsZiBvdmVyIGxvb3BiYWNrLCB3aGljaCBoZXJlIHdvdWxkIGJlIGEgc2Vjb25kIGJpbGxlZFxuICAgKiBpbnZvY2F0aW9uIHRocm91Z2ggQ2xvdWRGcm9udC5cbiAgICpcbiAgICogT25seSB0aGUgYXV0aG9yaXR5IGlzIGZvcndhcmRlZCwgYXMgYG5leHQgc3RhcnRgJ3MgYGZldGNoSW50ZXJuYWxJbWFnZWBcbiAgICogZm9yd2FyZHMgbm9uZSBvZiB0aGUgdmlld2VyJ3MgaGVhZGVyczogdGhlIHNvdXJjZSBpcyBjYWNoZWQgYW5kIHNlcnZlZCB0b1xuICAgKiBldmVyeW9uZSwgc28gaXQgbXVzdCBub3QgZGVwZW5kIG9uIG9uZSB2aWV3ZXIncyBjb29raWVzLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBmZXRjaEludGVybmFsKFxuICAgIGhyZWY6IHN0cmluZyxcbiAgICByZXE6IFNoaW1JbmNvbWluZ01lc3NhZ2UsXG4gICAgbWF4aW11bUJvZHk6IG51bWJlcixcbiAgKTogUHJvbWlzZTxJbnRlcm5hbEltYWdlUmVzcG9uc2U+IHtcbiAgICBjb25zdCByZXF1ZXN0OiBSdW50aW1lUmVxdWVzdCA9IHtcbiAgICAgIG1ldGhvZDogXCJHRVRcIixcbiAgICAgIHVybDogaHJlZixcbiAgICAgIGhlYWRlcnM6IHBpY2tEZWZpbmVkKHJlcS5oZWFkZXJzLCBbXG4gICAgICAgIFwiaG9zdFwiLFxuICAgICAgICBcIngtZm9yd2FyZGVkLWhvc3RcIixcbiAgICAgICAgXCJ4LWZvcndhcmRlZC1wcm90b1wiLFxuICAgICAgXSksXG4gICAgICBlbmNyeXB0ZWQ6IChyZXEuc29ja2V0IGFzIHsgZW5jcnlwdGVkPzogYm9vbGVhbiB9IHwgdW5kZWZpbmVkKT8uZW5jcnlwdGVkLFxuICAgICAgdHJ1c3RGb3J3YXJkZWRIb3N0OiByZXEudHJ1c3RGb3J3YXJkZWRIb3N0LFxuICAgIH07XG4gICAgY29uc3QgeyBoZWFkLCBib2R5LCBvdGhlckdyb3VwLCB0b29MYXJnZSB9ID0gYXdhaXQgdGhpcy5oYW5kbGVJbnRlcm5hbGx5KFxuICAgICAgcmVxdWVzdCxcbiAgICAgIHsgbWF4aW11bUJvZHkgfSxcbiAgICApO1xuICAgIGlmICh0b29MYXJnZSkge1xuICAgICAgcmV0dXJuIHsgc3RhdHVzQ29kZTogMCwgaGVhZGVyczoge30sIGJvZHk6IEJ1ZmZlci5hbGxvYygwKSwgdG9vTGFyZ2UgfTtcbiAgICB9XG4gICAgaWYgKG90aGVyR3JvdXApIHtcbiAgICAgIC8vIFRoZSBlZGdlIHNlbmRzIGV2ZXJ5IGAvX25leHQvaW1hZ2VgIHJlcXVlc3QgdG8gdGhlIGRlZmF1bHQgZ3JvdXAsIGFuZFxuICAgICAgLy8gdGhlIHNvdXJjZSBpcyByZW5kZXJlZCBpbiBwcm9jZXNzLCBzbyBhIHJvdXRlIHBhY2thZ2VkIGludG8gYW5vdGhlclxuICAgICAgLy8gZ3JvdXAgaXMgb3V0IG9mIHJlYWNoOiB0aGUgb3B0aW1pemVyIGFuc3dlcnMgKGFuZCBsb2dzKSBhIDUwMi5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHN0YXR1c0NvZGU6IDAsXG4gICAgICAgIGhlYWRlcnM6IHt9LFxuICAgICAgICBib2R5OiBCdWZmZXIuYWxsb2MoMCksXG4gICAgICAgIG90aGVyR3JvdXA6IG90aGVyR3JvdXAub3duZXIsXG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgc3RhdHVzQ29kZTogaGVhZD8uc3RhdHVzQ29kZSA/PyAwLFxuICAgICAgaGVhZGVyczogaGVhZD8uaGVhZGVycyA/PyB7fSxcbiAgICAgIGJvZHksXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBPbmUgcmVxdWVzdCB0aHJvdWdoIHtAbGluayBoYW5kbGV9LCBhbnN3ZXJlZCB0byB0aGlzIHJ1bnRpbWUgaW5zdGVhZCBvZiBhXG4gICAqIGNsaWVudDogdGhlIGhlYWQsIHRoZSBib2R5IHdoZW4gaXQgaXMgd2FudGVkLCBhbmQgdGhlIGVycm9yIHdoZW4gdGhlIHJvdXRlXG4gICAqIGlzIHBhY2thZ2VkIGludG8gYW5vdGhlciBgZnVuY3Rpb25Hcm91cHNgIGdyb3VwLiBgaGFuZGxlYCBhd2FpdHMgdGhlXG4gICAqIHJlcXVlc3QncyBgd2FpdFVudGlsYCB3b3JrIHRvbywgc28gd2hhdGV2ZXIgdGhlIHJlbmRlciB3cm90ZSBpcyBjb21taXR0ZWQgYnlcbiAgICogdGhlIHRpbWUgdGhpcyByZXNvbHZlcy5cbiAgICpcbiAgICogVGhlIGJvZHkgaXMga2VwdCBvbmx5IHdoZW4gYG1heGltdW1Cb2R5YCBpcyBzZXQuIE9uZSBwYXN0IGl0IGZhaWxzIHRoZVxuICAgKiByZXNwb25zZSBzdHJlYW0sIHdoaWNoIHN0b3BzIHRoZSByb3V0ZSB3cml0aW5nLCBhbmQgY29tZXMgYmFjayBhc1xuICAgKiBgdG9vTGFyZ2VgIHJhdGhlciB0aGFuIGhlbGQgaW4gbWVtb3J5LlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBoYW5kbGVJbnRlcm5hbGx5KFxuICAgIHJlcXVlc3Q6IFJ1bnRpbWVSZXF1ZXN0LFxuICAgIG9wdGlvbnM6IHsgcmVhZG9ubHkgbWF4aW11bUJvZHk/OiBudW1iZXIgfSxcbiAgKTogUHJvbWlzZTx7XG4gICAgaGVhZD86IFJlc3BvbnNlSGVhZDtcbiAgICBib2R5OiBCdWZmZXI7XG4gICAgb3RoZXJHcm91cD86IFJvdXRlSW5PdGhlckdyb3VwRXJyb3I7XG4gICAgdG9vTGFyZ2U6IGJvb2xlYW47XG4gIH0+IHtcbiAgICBsZXQgaGVhZDogUmVzcG9uc2VIZWFkIHwgdW5kZWZpbmVkO1xuICAgIGNvbnN0IGNodW5rczogQnVmZmVyW10gPSBbXTtcbiAgICBsZXQgc2l6ZSA9IDA7XG4gICAgbGV0IHRvb0xhcmdlID0gZmFsc2U7XG4gICAgbGV0IG90aGVyR3JvdXA6IFJvdXRlSW5PdGhlckdyb3VwRXJyb3IgfCB1bmRlZmluZWQ7XG4gICAgY29uc3Qgb25Sb3V0ZUluT3RoZXJHcm91cCA9IChlcnJvcjogUm91dGVJbk90aGVyR3JvdXBFcnJvcikgPT4ge1xuICAgICAgb3RoZXJHcm91cCA9IGVycm9yO1xuICAgIH07XG4gICAgYXdhaXQgdGhpcy5oYW5kbGUoXG4gICAgICB7IC4uLnJlcXVlc3QsIG9uUm91dGVJbk90aGVyR3JvdXAgfSxcbiAgICAgIHtcbiAgICAgICAgYmVnaW4ocmVzcG9uc2VIZWFkKSB7XG4gICAgICAgICAgaGVhZCA9IHJlc3BvbnNlSGVhZDtcbiAgICAgICAgICByZXR1cm4gbmV3IFdyaXRhYmxlKHtcbiAgICAgICAgICAgIHdyaXRlKGNodW5rOiBCdWZmZXIsIF9lbmNvZGluZywgY2FsbGJhY2spIHtcbiAgICAgICAgICAgICAgaWYgKG9wdGlvbnMubWF4aW11bUJvZHkgPT09IHVuZGVmaW5lZCkgcmV0dXJuIGNhbGxiYWNrKCk7XG4gICAgICAgICAgICAgIHNpemUgKz0gY2h1bmsuYnl0ZUxlbmd0aDtcbiAgICAgICAgICAgICAgaWYgKHNpemUgPiBvcHRpb25zLm1heGltdW1Cb2R5KSB7XG4gICAgICAgICAgICAgICAgdG9vTGFyZ2UgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayhuZXcgRXJyb3IoXCJPdmVyIGltYWdlcy5tYXhpbXVtUmVzcG9uc2VCb2R5XCIpKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBjaHVua3MucHVzaChCdWZmZXIuZnJvbShjaHVuaykpO1xuICAgICAgICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgKTtcbiAgICByZXR1cm4ge1xuICAgICAgaGVhZCxcbiAgICAgIGJvZHk6IHRvb0xhcmdlID8gQnVmZmVyLmFsbG9jKDApIDogQnVmZmVyLmNvbmNhdChjaHVua3MpLFxuICAgICAgb3RoZXJHcm91cCxcbiAgICAgIHRvb0xhcmdlLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQXBwIFJvdXRlciBidWlsZHMgYW4gaW52b2NhYmxlIGAvX25vdC1mb3VuZGAsIFBhZ2VzIFJvdXRlciBhIHByZXJlbmRlcmVkXG4gICAqIGA0MDQuaHRtbGAgKHBlciBsb2NhbGUgdW5kZXIgaTE4bikgb3IgZWxzZSBgL19lcnJvcmA7IHNlZSBgc3RhdHVzVGFyZ2V0c2AuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHNlbmROb3RGb3VuZChcbiAgICByZXE6IFNoaW1JbmNvbWluZ01lc3NhZ2UsXG4gICAgcmVzOiBTaGltU2VydmVyUmVzcG9uc2UsXG4gICAgd2FpdFVudGlsOiAocHJvbWlzZTogUHJvbWlzZTx1bmtub3duPikgPT4gdm9pZCxcbiAgICB0YXJnZXQ6IFN0YXR1c1RhcmdldCxcbiAgICAvKipcbiAgICAgKiBXaGF0IHRvIHJlbmRlciB0aGUgNDA0IGFzLiBPbWl0dGVkIGJ5IGByZW5kZXI0MDRgLCB3aGljaCBpcyBjYWxsZWRcbiAgICAgKiBtaWQtcmVuZGVyIHdpdGggYHJlcS51cmxgIGFscmVhZHkgcG9pbnRpbmcgYXQgdGhlIHJvdXRlIHRoYXQgZ2F2ZSB1cCDigJRcbiAgICAgKiB0aGUgcGF0aCBOZXh0LmpzIHdvdWxkIHJlbmRlciB0aGF0IDQwNCBmb3IuXG4gICAgICovXG4gICAgcmVxdWVzdGVkVXJsPzogc3RyaW5nLFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXMuc3RhdHVzQ29kZSA9IDQwNDtcblxuICAgIGlmICh0YXJnZXQua2luZCA9PT0gXCJlbnRyeXBvaW50XCIpIHtcbiAgICAgIGNvbnN0IGhhbmRsZXIgPSBhd2FpdCB0aGlzLmVudHJ5cG9pbnRzLmxvYWQodGFyZ2V0LmVudHJ5cG9pbnQpO1xuICAgICAgcmVxLnVybCA9IHJlcXVlc3RlZFVybCA/PyByZXEudXJsO1xuICAgICAgY29uc3QgcmVuZGVyID0gKCkgPT4gaGFuZGxlcihyZXEsIGFzU2VydmVyUmVzcG9uc2UocmVzKSwgeyB3YWl0VW50aWwgfSk7XG4gICAgICAvLyBBcHAgUm91dGVyJ3MgYC9fbm90LWZvdW5kYCBpcyBhIHBhZ2UgcmVuZGVyIHRvbzogc2VlIGByb3V0ZWAuXG4gICAgICBhd2FpdCAodGFyZ2V0LmVudHJ5cG9pbnQudHlwZSA9PT0gXCJhcHAtcGFnZVwiXG4gICAgICAgID8gY2F0Y2hVcFRhZ3MocmVuZGVyKVxuICAgICAgICA6IHJlbmRlcigpKTtcbiAgICAgIGlmICghcmVzLndyaXRhYmxlRW5kZWQpIHtcbiAgICAgICAgcmVzLmVuZCgpO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChcbiAgICAgIHRhcmdldC5raW5kID09PSBcInN0YXRpYy1maWxlXCIgJiZcbiAgICAgIChhd2FpdCB0aGlzLnNlbmRIdG1sRmlsZShyZXMsIHRhcmdldCkpXG4gICAgKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgcmVzLnNldEhlYWRlcihcIkNvbnRlbnQtVHlwZVwiLCBcInRleHQvcGxhaW47IGNoYXJzZXQ9dXRmLThcIik7XG4gICAgcmVzLmVuZChcIlRoaXMgcGFnZSBjb3VsZCBub3QgYmUgZm91bmQuXCIpO1xuICB9XG5cbiAgLyoqXG4gICAqIFR1cm4gYSB0aHJvd24gZXJyb3IgaW50byBhIHJlc3BvbnNlLCByZW5kZXJpbmcgdGhlIGFwcCdzIGVycm9yIHBhZ2Ugd2hlbiBpdFxuICAgKiBoYXMgb25lLlxuICAgKlxuICAgKiBOZXh0LmpzJ3Mgb3duIHBhZ2UgaGFuZGxlcnMgY2F0Y2gsIHJlcG9ydCBhbmQgdGhlbiAqcmV0aHJvdyogKFwicmV0aHJvdyBzb1xuICAgKiB0aGF0IHdlIGNhbiBoYW5kbGUgc2VydmluZyBlcnJvciBwYWdlXCIsIGBwYWdlcy1oYW5kbGVyLnRzYCksIHdoaWNoIG1ha2VzIHRoZVxuICAgKiBlcnJvciBwYWdlIHRoZSBob3N0J3Mgam9iIOKAlCB0aGUgc2FtZSBkaXZpc2lvbiBvZiBsYWJvciBhcyBgcmVuZGVyNDA0YC4gV2l0aG91dFxuICAgKiB0aGlzIGxhZGRlciBldmVyeSB0aHJvdyBhbnN3ZXJlZCBhIGJhcmUgYHRleHQvcGxhaW5gIDUwMCBhbmQgYSBjdXN0b21cbiAgICogYHBhZ2VzL19lcnJvcmAgd2FzIGRlYWQgY29kZSAoYHRlc3QvZTJlL2FzeW5jLW1vZHVsZXNgLCB3aG9zZSBgL21ha2UtZXJyb3JgXG4gICAqIHRocm93cyBpbiBgZ2V0U2VydmVyU2lkZVByb3BzYCkuXG4gICAqXG4gICAqIE9uY2UgdGhlIGhlYWQgaXMgb3V0IHRoZXJlIGlzIG5vdGhpbmcgdG8gc2F5IOKAlCBkZXN0cm95aW5nIHRoZSBzdHJlYW0gaXMgd2hhdFxuICAgKiB0ZWxscyB0aGUgY2xpZW50IHRoZSByZXNwb25zZSBpcyB0cnVuY2F0ZWQgcmF0aGVyIHRoYW4gY29tcGxldGUuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHNlbmRFcnJvcihcbiAgICByZXE6IFNoaW1JbmNvbWluZ01lc3NhZ2UsXG4gICAgcmVzOiBTaGltU2VydmVyUmVzcG9uc2UsXG4gICAgd2FpdFVudGlsOiAocHJvbWlzZTogUHJvbWlzZTx1bmtub3duPikgPT4gdm9pZCxcbiAgICBlcnJvcjogdW5rbm93bixcbiAgICAvKiogVGhlIHJlcXVlc3QsIGFzIHJlY2VpdmVkOiB3aGljaCBsb2NhbGUncyBwcmVyZW5kZXJlZCA1MDAgdG8gc2VuZC4gKi9cbiAgICB1cmw6IFVSTCB8IHVuZGVmaW5lZCxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc29sZS5lcnJvcihcIlVuaGFuZGxlZCBlcnJvciB3aGlsZSBoYW5kbGluZyB0aGUgcmVxdWVzdDpcIiwgZXJyb3IpO1xuICAgIGlmIChyZXMuaGVhZGVyc1NlbnQpIHtcbiAgICAgIHJlcy5kZXN0cm95KGFzRXJyb3IoZXJyb3IpKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgcmVzLnN0YXR1c0NvZGUgPSA1MDA7XG4gICAgLy8gQSBmYWlsZWQgcmVuZGVyIG1heSBoYXZlIHNldCBoZWFkZXJzIGRlc2NyaWJpbmcgYSBib2R5IHRoYXQgbmV2ZXJcbiAgICAvLyBhcnJpdmVkLiBFdmVyeSBydW5nIGJlbG93IHNlbmRzIGEgZGlmZmVyZW50IGJvZHksIHNvIHRoZXkgZ28gZmlyc3Q6IGFcbiAgICAvLyBzdGFsZSBgQ29udGVudC1MZW5ndGhgIG9uIGEgNTAwLmh0bWwgb2YgYW5vdGhlciBzaXplIGhhbmdzIHRoZSBjbGllbnQgb3JcbiAgICAvLyBkZXN5bmNzIGEga2VlcC1hbGl2ZSBjb25uZWN0aW9uLlxuICAgIHJlcy5yZW1vdmVIZWFkZXIoXCJDb250ZW50LUxlbmd0aFwiKTtcbiAgICByZXMucmVtb3ZlSGVhZGVyKFwiRVRhZ1wiKTtcbiAgICAvLyBFdmVyeSBydW5nLCB0aGUgZXJyb3ItcGFnZSBlbnRyeXBvaW50IGluY2x1ZGVkOiBvdGhlcndpc2UgdGhlIHRocm93aW5nXG4gICAgLy8gcmVuZGVyJ3MgYHMtbWF4YWdlYCAob3IgYSBgaGVhZGVycygpYCBydWxlJ3MpIHJpZGVzIGFsb25nIGFuZCBDbG91ZEZyb250XG4gICAgLy8gY2FjaGVzIHRoZSA1MDAuIGBuZXh0IHN0YXJ0YCBzZXRzIGl0IGJlZm9yZSByZW5kZXJpbmcgdGhlIGVycm9yIHBhZ2UgdG9vLlxuICAgIHJlcy5zZXRIZWFkZXIoXCJDYWNoZS1Db250cm9sXCIsIE5PX1NUT1JFKTtcbiAgICBjb25zdCB0YXJnZXQgPSB0aGlzLmVycm9yVGFyZ2V0Rm9yKHVybCk7XG5cbiAgICBpZiAodGFyZ2V0LmtpbmQgPT09IFwiZW50cnlwb2ludFwiKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBoYW5kbGVyID0gYXdhaXQgdGhpcy5lbnRyeXBvaW50cy5sb2FkKHRhcmdldC5lbnRyeXBvaW50KTtcbiAgICAgICAgLy8gYHJlcS51cmxgIGlzIGxlZnQgYWxvbmU6IHRoZSBlcnJvciBwYWdlIHJlbmRlcnMgZm9yIHRoZSBVUkwgdGhhdCB3YXNcbiAgICAgICAgLy8gYXNrZWQgZm9yLCBhbmQgYF9lcnJvcmAncyBgZ2V0SW5pdGlhbFByb3BzYCByZWFkcyB0aGUgc3RhdHVzIG9mZiBgcmVzYCxcbiAgICAgICAgLy8gd2hpY2ggaXMgd2h5IHRoZSA1MDAgYWJvdmUgaXMgc2V0IGZpcnN0LlxuICAgICAgICBhd2FpdCBoYW5kbGVyKHJlcSwgYXNTZXJ2ZXJSZXNwb25zZShyZXMpLCB7IHdhaXRVbnRpbCB9KTtcbiAgICAgICAgaWYgKCFyZXMud3JpdGFibGVFbmRlZCkge1xuICAgICAgICAgIHJlcy5lbmQoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgICB9IGNhdGNoIChlcnJvclBhZ2VFcnJvcikge1xuICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgIFwiVGhlIGVycm9yIHBhZ2UgaXRzZWxmIGZhaWxlZCB0byByZW5kZXI6XCIsXG4gICAgICAgICAgZXJyb3JQYWdlRXJyb3IsXG4gICAgICAgICk7XG4gICAgICAgIGlmIChyZXMuaGVhZGVyc1NlbnQpIHtcbiAgICAgICAgICByZXMuZGVzdHJveShhc0Vycm9yKGVycm9yUGFnZUVycm9yKSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgdGFyZ2V0LmtpbmQgPT09IFwic3RhdGljLWZpbGVcIiAmJlxuICAgICAgKGF3YWl0IHRoaXMuc2VuZEh0bWxGaWxlKHJlcywgdGFyZ2V0KSlcbiAgICApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBBZ2FpbjogYW4gZXJyb3IgcGFnZSB0aGF0IHRocmV3IG1heSBoYXZlIGRlc2NyaWJlZCBpdHMgb3duIGJvZHkgdG9vLlxuICAgIHJlcy5yZW1vdmVIZWFkZXIoXCJDb250ZW50LUxlbmd0aFwiKTtcbiAgICByZXMucmVtb3ZlSGVhZGVyKFwiRVRhZ1wiKTtcbiAgICByZXMuc3RhdHVzQ29kZSA9IDUwMDtcbiAgICByZXMuc2V0SGVhZGVyKFwiQ29udGVudC1UeXBlXCIsIFwidGV4dC9wbGFpbjsgY2hhcnNldD11dGYtOFwiKTtcbiAgICByZXMuc2V0SGVhZGVyKFwiQ2FjaGUtQ29udHJvbFwiLCBOT19TVE9SRSk7XG4gICAgcmVzLmVuZChcIkludGVybmFsIFNlcnZlciBFcnJvclwiKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBIHByZXJlbmRlcmVkIDQwNCBvciA1MDAgcGFnZSwgb3IgYGZhbHNlYCB3aGVuIGl0IGNhbm5vdCBiZSByZWFkIGFuZCB0aGVcbiAgICogY2FsbGVyJ3MgcGxhaW4tdGV4dCBmYWxsYmFjayBzaG91bGQgYW5zd2VyLiBSZWFkIHJhdGhlciB0aGFuIGBzZXJ2ZVN0YXRpY2AsXG4gICAqIHdoaWNoIGtlZXBzIHRoZSBzdGF0dXMgYWxyZWFkeSBzZXQgYnV0IHdvdWxkIGFuc3dlciBhIGBSYW5nZWAgcmVxdWVzdCB3aXRoXG4gICAqIGEgMjA2IG9mIHRoZSBlcnJvciBwYWdlLCBhbmQgYWRkIGBFVGFnYCwgYExhc3QtTW9kaWZpZWRgIGFuZCwgd2hlcmUgbm9uZSBpc1xuICAgKiBzZXQgeWV0LCBhIHB1YmxpYyBgQ2FjaGUtQ29udHJvbGAgdG8gaXQuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHNlbmRIdG1sRmlsZShcbiAgICByZXM6IFNoaW1TZXJ2ZXJSZXNwb25zZSxcbiAgICB0YXJnZXQ6IHsgcmVhZG9ubHkgZmlsZVBhdGg6IHN0cmluZyB9LFxuICApOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBsZXQgaHRtbDogQnVmZmVyO1xuICAgIHRyeSB7XG4gICAgICBodG1sID0gYXdhaXQgcmVhZEZpbGUoam9pbih0aGlzLm9wdGlvbnMuZGVwbG95bWVudFJvb3QsIHRhcmdldC5maWxlUGF0aCkpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXMuc2V0SGVhZGVyKFwiQ29udGVudC1UeXBlXCIsIFwidGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04XCIpO1xuICAgIHJlcy5lbmQoaHRtbCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbn1cblxuLyoqXG4gKiBXaGF0IG5leHQgc2VuZHMgd2l0aCBhbiBlcnJvciBpdCByZW5kZXJlZCBpdHNlbGYuIFdpdGhvdXQgaXQgYSBgQ2FjaGUtQ29udHJvbGBcbiAqIGxlZnQgYmVoaW5kIGJ5IHRoZSByZW5kZXIgdGhhdCB0aHJldyBjYW4gZ2V0IGEgNTAwIGNhY2hlZCBhdCB0aGUgZWRnZS5cbiAqL1xuY29uc3QgTk9fU1RPUkUgPSBcInByaXZhdGUsIG5vLWNhY2hlLCBuby1zdG9yZSwgbWF4LWFnZT0wLCBtdXN0LXJldmFsaWRhdGVcIjtcblxuLyoqXG4gKiBgU2VjLUZldGNoLURlc3RgIHZhbHVlcyB0aGF0IGNhbiBuZXZlciBkaXNwbGF5IGFuIEhUTUwgcmVzcG9uc2UsIGZyb21cbiAqIGBuZXh0L2Rpc3Qvc2VydmVyL2xpYi9pcy1ub24taHRtbC1zZWMtZmV0Y2gtZGVzdC5qc2AuIFJlc3RhdGVkIHJhdGhlciB0aGFuXG4gKiByZXF1aXJlZCwgYmVjYXVzZSB0aGF0IG1vZHVsZSBpcyByZWNlbnQgYW5kIHRoZSBhcHAncyBgbmV4dGAgbWF5IHByZWRhdGUgaXQ6XG4gKiBhIGZhaWxlZCByZXF1aXJlIGhlcmUgd291bGQgdHVybiBldmVyeSA0MDQgaW50byBhIDUwMC4gRXhjbHVkZXMgYGRvY3VtZW50YCxcbiAqIGBpZnJhbWVgIGFuZCB0aGUgbGlrZSwgYW5kIGBlbXB0eWAg4oCUIGBmZXRjaCgpYCwgd2hpY2ggaXMgaG93IFJTQyByZXF1ZXN0cyBnby5cbiAqL1xuY29uc3QgTk9OX0hUTUxfU0VDX0ZFVENIX0RFU1RTOiBSZWFkb25seVNldDxzdHJpbmc+ID0gbmV3IFNldChbXG4gIFwiYXVkaW9cIixcbiAgXCJhdWRpb3dvcmtsZXRcIixcbiAgXCJmb250XCIsXG4gIFwiaW1hZ2VcIixcbiAgXCJqc29uXCIsXG4gIFwibWFuaWZlc3RcIixcbiAgXCJwYWludHdvcmtsZXRcIixcbiAgXCJyZXBvcnRcIixcbiAgXCJzY3JpcHRcIixcbiAgXCJzZXJ2aWNld29ya2VyXCIsXG4gIFwic2hhcmVkd29ya2VyXCIsXG4gIFwic3R5bGVcIixcbiAgXCJ0cmFja1wiLFxuICBcInZpZGVvXCIsXG4gIFwid2ViaWRlbnRpdHlcIixcbiAgXCJ3b3JrZXJcIixcbiAgXCJ4c2x0XCIsXG5dKTtcblxuLyoqXG4gKiBgSU5URVJOQUxfSEVBREVSU2AgZnJvbSBgbmV4dC9kaXN0L3NlcnZlci9saWIvc2VydmVyLWlwYy91dGlscy5qc2AgKE5leHRcbiAqIDE2LjMpLCB3aGljaCBgbmV4dCBzdGFydGAgZGVsZXRlcyBmcm9tIGV2ZXJ5IHJlcXVlc3QgYmVmb3JlIHJvdXRpbmcgaXRcbiAqIChgZmlsdGVySW50ZXJuYWxIZWFkZXJzYCBpbiBgcm91dGVyLXNlcnZlci5qc2ApLiBUaGV5IGFyZSBzaWduYWxzIGJldHdlZW5cbiAqIE5leHQncyBvd24gcm91dGVyIGFuZCByZW5kZXIgbGF5ZXJzOyBob25vcmluZyBvbmUgYSBjbGllbnQgc2VudCBsZXRzIGl0IHN0ZWVyXG4gKiB0aG9zZSBsYXllcnMg4oCUIGBuZXh0LXJlc3VtZWAgbWFrZXMgYSBQUFIgcGFnZSByZXN1bWUgZnJvbSBhIHBvc3Rwb25lZCBzdGF0ZVxuICogdGhlIGNsaWVudCBzdXBwbGllcy4gUmVzdGF0ZWQgcmF0aGVyIHRoYW4gcmVxdWlyZWQsIGxpa2VcbiAqIHtAbGluayBOT05fSFRNTF9TRUNfRkVUQ0hfREVTVFN9LlxuICovXG5jb25zdCBJTlRFUk5BTF9IRUFERVJTOiBSZWFkb25seVNldDxzdHJpbmc+ID0gbmV3IFNldChbXG4gIFwieC1taWRkbGV3YXJlLXJld3JpdGVcIixcbiAgXCJ4LW1pZGRsZXdhcmUtcmVkaXJlY3RcIixcbiAgXCJ4LW1pZGRsZXdhcmUtc2V0LWNvb2tpZVwiLFxuICBcIngtbWlkZGxld2FyZS1za2lwXCIsXG4gIFwieC1taWRkbGV3YXJlLW92ZXJyaWRlLWhlYWRlcnNcIixcbiAgXCJ4LW1pZGRsZXdhcmUtbmV4dFwiLFxuICBcIngtbm93LXJvdXRlLW1hdGNoZXNcIixcbiAgXCJ4LW1hdGNoZWQtcGF0aFwiLFxuICBcIngtbmV4dGpzLWRhdGFcIixcbiAgXCJ4LW5leHQtcmVzdW1lLXN0YXRlLWxlbmd0aFwiLFxuICBcIm5leHQtcmVzdW1lXCIsXG5dKTtcblxuLyoqXG4gKiBUaGUgcmVxdWVzdCBoZWFkZXJzIHdpdGgge0BsaW5rIElOVEVSTkFMX0hFQURFUlN9IHJlbW92ZWQsIGFuZCBgeC1uZXh0anMtZGF0YWBcbiAqIHB1dCBiYWNrIGZvciBhIGBfbmV4dC9kYXRhYCByZXF1ZXN0LCB3aGljaCBpcyB3aGF0IGBuZXh0IHN0YXJ0YCdzXG4gKiBgcmVzb2x2ZVJvdXRlc2AgZG9lcyAoYHNldElzTmV4dERhdGFSZXF1ZXN0YCkgcmlnaHQgYWZ0ZXIgc3RyaXBwaW5nIGl0OiB0aGVcbiAqIGhlYWRlciBpcyBpbnRlcm5hbCwgYnV0IE5leHQncyBoYW5kbGVycyBhbmQgbWlkZGxld2FyZSBzdGlsbCByZWFkIGl0IOKAlCBpdCBpc1xuICogaG93IGEgZGF0YSByZXF1ZXN0IGdldHMgYHgtbmV4dGpzLW1hdGNoZWQtcGF0aGAg4oCUIHNvIGEgcmVhbCBkYXRhIHJlcXVlc3QgaGFzXG4gKiB0byBrZWVwIGl0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gd2l0aG91dEludGVybmFsSGVhZGVycyhcbiAgaGVhZGVyczogSW5jb21pbmdIdHRwSGVhZGVycyxcbiAgdGFyZ2V0OiBzdHJpbmcsXG4gIGJhc2VQYXRoOiBzdHJpbmcsXG4pOiBJbmNvbWluZ0h0dHBIZWFkZXJzIHtcbiAgY29uc3QgZmlsdGVyZWQ6IEluY29taW5nSHR0cEhlYWRlcnMgPSB7fTtcbiAgZm9yIChjb25zdCBbbmFtZSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGhlYWRlcnMpKSB7XG4gICAgaWYgKCFJTlRFUk5BTF9IRUFERVJTLmhhcyhuYW1lKSkge1xuICAgICAgZmlsdGVyZWRbbmFtZV0gPSB2YWx1ZTtcbiAgICB9XG4gIH1cbiAgY29uc3QgcGF0aG5hbWUgPSB3aXRob3V0UGF0aFByZWZpeCh0YXJnZXQuc3BsaXQoXCI/XCIpWzBdLCBiYXNlUGF0aCk7XG4gIGlmIChwYXRobmFtZS5zdGFydHNXaXRoKFwiL19uZXh0L2RhdGEvXCIpICYmIHBhdGhuYW1lLmVuZHNXaXRoKFwiLmpzb25cIikpIHtcbiAgICBmaWx0ZXJlZFtcIngtbmV4dGpzLWRhdGFcIl0gPSBcIjFcIjtcbiAgfVxuICByZXR1cm4gZmlsdGVyZWQ7XG59XG5cbi8qKiBFdmVyeSByb3V0ZSB0byBpbnZhbGlkYXRlLCBlYWNoIG9uY2UsIGluIG9uZSBDbG91ZEZyb250IGludmFsaWRhdGlvbi4gKi9cbnR5cGUgUmV2YWxpZGF0ZWRQYWdlSG9vayA9IChyb3V0ZXM6IHJlYWRvbmx5IHN0cmluZ1tdKSA9PiBQcm9taXNlPHZvaWQ+O1xuXG4vKipcbiAqIEludmFsaWRhdGUgdGhlIENETiBjb3BpZXMgb2YgYSBwYWdlIGByZXMucmV2YWxpZGF0ZSgpYCBqdXN0IHJlZ2VuZXJhdGVkOiBpdHNcbiAqIEhUTUwgYW5kIFJTQyBwYXlsb2FkLCBhbmQgaXRzIFBhZ2VzIFJvdXRlciBgX25leHQvZGF0YWAgSlNPTi4gV2l0aG91dCB0aGlzIHRoZVxuICogZnJlc2ggZW50cnkgc2F0IGJlaGluZCBDbG91ZEZyb250J3MgY29weSBvZiB0aGUgb2xkIG9uZSBmb3IgdGhlIHBhZ2UncyB3aG9sZVxuICogYHMtbWF4YWdlYCDigJQgYSB5ZWFyLCBmb3IgYW4gb24tZGVtYW5kLW9ubHkgSVNSIHBhZ2UuIGByZXZhbGlkYXRlUGF0aGAgYW5kXG4gKiBgcmV2YWxpZGF0ZVRhZ2AgZ28gdGhyb3VnaCB0aGUgY2FjaGUgaGFuZGxlcidzIGByZXZhbGlkYXRlVGFnYCwgd2hpY2ggYWxyZWFkeVxuICogaW52YWxpZGF0ZXM7IGByZXMucmV2YWxpZGF0ZSgpYCBkb2VzIG5vdCB0b3VjaCBpdC5cbiAqXG4gKiBFdmVyeSByb3V0ZSBpcyB3aXRob3V0IGBiYXNlUGF0aGAsIHdoaWNoIHRoZSBob29rIHByZWZpeGVzLiBBIG5vLW9wIG91dHNpZGVcbiAqIHRoZSBHbG9iYWwgY29uc3RydWN0cywgd2hlcmUgbm8gaG9vayBpcyByZWdpc3RlcmVkLlxuICovXG5hc3luYyBmdW5jdGlvbiBpbnZhbGlkYXRlUmV2YWxpZGF0ZWRQYWdlKFxuICB1cmxQYXRoOiBzdHJpbmcsXG4gIG1hbmlmZXN0OiBBZGFwdGVyTWFuaWZlc3QsXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgaG9vayA9IChnbG9iYWxUaGlzIGFzIFJlY29yZDxzeW1ib2wsIHVua25vd24+KVtcbiAgICBSRVZBTElEQVRFRF9QQUdFX0hPT0tcbiAgXSBhcyBSZXZhbGlkYXRlZFBhZ2VIb29rIHwgdW5kZWZpbmVkO1xuICBpZiAodHlwZW9mIGhvb2sgIT09IFwiZnVuY3Rpb25cIikge1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCByb3V0ZSA9IHdpdGhvdXRQYXRoUHJlZml4KFxuICAgIHVybFBhdGguc3BsaXQoXCI/XCIpWzBdLFxuICAgIG1hbmlmZXN0LmNvbmZpZy5iYXNlUGF0aCxcbiAgKTtcbiAgdHJ5IHtcbiAgICAvLyBPbmUgY2FsbCwgZGVkdXBsaWNhdGVkOiB0aGUgZGVmYXVsdCBsb2NhbGUncyB0d28gcGFpcnMgc2hhcmUgYSBkYXRhXG4gICAgLy8gcm91dGUsIGFuZCBlYWNoIGludmFsaWRhdGlvbiBwYXRoIGNvdW50cyBhZ2FpbnN0IENsb3VkRnJvbnQncyBxdW90YS5cbiAgICBhd2FpdCBob29rKFsuLi5uZXcgU2V0KHJldmFsaWRhdGVkUGFnZVJvdXRlcyhyb3V0ZSwgbWFuaWZlc3QpLmZsYXQoKSldKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAvLyBUaGUgcmVnZW5lcmF0aW9uIGl0c2VsZiBzdWNjZWVkZWQ7IHRoZSBlZGdlIGNhdGNoZXMgdXAgYXQgYHMtbWF4YWdlYC5cbiAgICBjb25zb2xlLndhcm4oYENvdWxkIG5vdCBpbnZhbGlkYXRlIHRoZSBDRE4gY29weSBvZiAke3VybFBhdGh9OmAsIGVycm9yKTtcbiAgfVxufVxuXG4vKipcbiAqIFRoZSBgW3JvdXRlLCBkYXRhUm91dGVdYCBwYWlycyBhIHJldmFsaWRhdGVkIHBhZ2UgaXMgY2FjaGVkIHVuZGVyIGF0IHRoZSBlZGdlLlxuICpcbiAqIEluIGFuIGkxOG4gYXBwIHRoZSBOZXh0IGNsaWVudCBhbHdheXMgcHV0cyB0aGUgbG9jYWxlIGluIGEgZGF0YSBocmVmLCB0aGVcbiAqIGRlZmF1bHQgbG9jYWxlIGluY2x1ZGVkIChgL19uZXh0L2RhdGEvPGlkPi9lbi9ibG9nLmpzb25gLCBhbmQgYOKApi9lbi5qc29uYCBmb3JcbiAqIHRoZSByb290KSwgc28gdGhlIHVucHJlZml4ZWQgZGF0YSByb3V0ZSBuYW1lcyBub3RoaW5nIENsb3VkRnJvbnQgaG9sZHMuIFRoZVxuICogcGFnZSBpcyBvbmUgbG9jYWxlJ3Mg4oCUIGByZXMucmV2YWxpZGF0ZShcIi9ibG9nXCIpYCByZWdlbmVyYXRlcyB0aGUgZGVmYXVsdFxuICogbG9jYWxlJ3MsIGBcIi9mci9ibG9nXCJgIEZyZW5jaCDigJQgYW5kIHRoZSBkZWZhdWx0IGxvY2FsZSdzIEhUTUwgaXMgcmVhY2hhYmxlLFxuICogYW5kIGNhY2hlZCwgYm90aCB3aXRoIGFuZCB3aXRob3V0IGl0cyBwcmVmaXgsIHNvIGl0cyB0d28gcGFpcnMgc2hhcmUgYSBkYXRhXG4gKiByb3V0ZSwgd2hpY2ggdGhlIGNhbGxlciBzZW5kcyBvbmNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmV2YWxpZGF0ZWRQYWdlUm91dGVzKFxuICByb3V0ZTogc3RyaW5nLFxuICBtYW5pZmVzdDogUGljazxBZGFwdGVyTWFuaWZlc3QsIFwiYnVpbGRJZFwiIHwgXCJjb25maWdcIj4sXG4pOiBBcnJheTxbc3RyaW5nLCBzdHJpbmddPiB7XG4gIGNvbnN0IGRhdGFSb3V0ZSA9IChwYWdlOiBzdHJpbmcpID0+XG4gICAgYC9fbmV4dC9kYXRhLyR7bWFuaWZlc3QuYnVpbGRJZH0ke1xuICAgICAgcGFnZSA9PT0gXCIvXCIgPyBcIi9pbmRleFwiIDogcGFnZS5yZXBsYWNlKC9cXC8rJC8sIFwiXCIpXG4gICAgfS5qc29uYDtcbiAgY29uc3QgaTE4biA9IG1hbmlmZXN0LmNvbmZpZy5pMThuIGFzIHtcbiAgICByZWFkb25seSBsb2NhbGVzPzogcmVhZG9ubHkgc3RyaW5nW107XG4gICAgcmVhZG9ubHkgZGVmYXVsdExvY2FsZT86IHN0cmluZztcbiAgfSB8IG51bGw7XG4gIGlmICghaTE4bj8uZGVmYXVsdExvY2FsZSkge1xuICAgIHJldHVybiBbW3JvdXRlLCBkYXRhUm91dGUocm91dGUpXV07XG4gIH1cbiAgY29uc3QgeyBkZWZhdWx0TG9jYWxlIH0gPSBpMThuO1xuICBjb25zdCBzZWdtZW50ID0gcm91dGUuc3BsaXQoXCIvXCIpWzFdID8/IFwiXCI7XG4gIGNvbnN0IGxvY2FsZSA9IChpMThuLmxvY2FsZXMgPz8gW10pLmluY2x1ZGVzKHNlZ21lbnQpXG4gICAgPyBzZWdtZW50XG4gICAgOiBkZWZhdWx0TG9jYWxlO1xuICBjb25zdCBwYWdlID1cbiAgICBsb2NhbGUgPT09IHNlZ21lbnQgPyB3aXRob3V0UGF0aFByZWZpeChyb3V0ZSwgYC8ke3NlZ21lbnR9YCkgOiByb3V0ZTtcbiAgY29uc3QgbG9jYWxpemVkID0gcGFnZSA9PT0gXCIvXCIgPyBgLyR7bG9jYWxlfWAgOiBgLyR7bG9jYWxlfSR7cGFnZX1gO1xuICAvLyBUaGUgcm9vdCdzIGRhdGEgcm91dGUgaXMgdGhlIGxvY2FsZSBpdHNlbGYsIG5vdCBgLzxsb2NhbGU+L2luZGV4YC5cbiAgY29uc3QgbG9jYWxpemVkRGF0YSA9IGAvX25leHQvZGF0YS8ke21hbmlmZXN0LmJ1aWxkSWR9JHtsb2NhbGl6ZWQucmVwbGFjZSgvXFwvKyQvLCBcIlwiKX0uanNvbmA7XG4gIHJldHVybiBsb2NhbGUgPT09IGRlZmF1bHRMb2NhbGVcbiAgICA/IFtcbiAgICAgICAgW3BhZ2UsIGxvY2FsaXplZERhdGFdLFxuICAgICAgICBbbG9jYWxpemVkLCBsb2NhbGl6ZWREYXRhXSxcbiAgICAgIF1cbiAgICA6IFtbbG9jYWxpemVkLCBsb2NhbGl6ZWREYXRhXV07XG59XG5cbmZ1bmN0aW9uIGFzRXJyb3IoZXJyb3I6IHVua25vd24pOiBFcnJvciB7XG4gIHJldHVybiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IgOiBuZXcgRXJyb3IoU3RyaW5nKGVycm9yKSk7XG59XG5cbi8qKlxuICogUmVhZCB0aGUgbWFuaWZlc3QgYW5kIHBpbiB0aGUgbGF5b3V0IGl0IGRlc2NyaWJlcy5cbiAqXG4gKiBgcHJvY2Vzcy5jd2QoKWAgaXMgbG9hZC1iZWFyaW5nIGFuZCB0aGVyZSBpcyBleGFjdGx5IG9uZSBjaGFuY2UgdG8gZ2V0IGl0XG4gKiByaWdodDogTmV4dC5qcyBpbmxpbmVzIGByZWxhdGl2ZShidWlsZEN3ZCwgcHJvamVjdERpcilgIGludG8gZXZlcnkgZW50cnlwb2ludFxuICogYW5kIHJlc29sdmVzIGl0IGFnYWluc3QgdGhlICpydW50aW1lKiBjd2QgdG8gZmluZFxuICogYHJlcXVpcmVkLXNlcnZlci1maWxlcy5qc29uYCwgdGhlIHByZXJlbmRlciBtYW5pZmVzdCwgYW5kIHRoZSBhcHAncyBjaHVua3MuXG4gKiBgYXNzZXJ0QnVpbGRDd2RgIGluIGBidWlsZC1vdXRwdXRzLnRzYCBrZWVwcyB0aGF0IGlubGluZWQgdmFsdWUgYFwiXCJgLCBzbyB0aGVcbiAqIHdob2xlIGludmFyaWFudCByZWR1Y2VzIHRvIFwiY3dkIGlzIHRoZSBzdGFnZWQgcHJvamVjdCBkaXJcIiDigJQgYXNzZXJ0ZWQgcmF0aGVyXG4gKiB0aGFuIGFzc3VtZWQsIGJlY2F1c2UgZ2V0dGluZyBpdCB3cm9uZyBwcm9kdWNlcyBhXG4gKiBgQ2Fubm90IGZpbmQgbW9kdWxlIOKApi9yZXF1aXJlZC1zZXJ2ZXItZmlsZXMuanNvbmAgZnJvbSBpbnNpZGUgY29tcGlsZWQgTmV4dC5qc1xuICogY29kZSB3aXRoIG5vIGluZGljYXRpb24gdGhhdCB0aGUgbGF5b3V0IGlzIHRoZSBwcm9ibGVtLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbG9hZFJ1bnRpbWUoXG4gIGRlcGxveW1lbnRSb290OiBzdHJpbmcsXG4pOiBQcm9taXNlPE5leHRqc1J1bnRpbWU+IHtcbiAgY29uc3QgbWFuaWZlc3RQYXRoID0gZGVwbG95ZWRNYW5pZmVzdFBhdGgoZGVwbG95bWVudFJvb3QpO1xuICBsZXQgbWFuaWZlc3Q6IEFkYXB0ZXJNYW5pZmVzdDtcbiAgdHJ5IHtcbiAgICBtYW5pZmVzdCA9IEpTT04ucGFyc2UoYXdhaXQgcmVhZEZpbGUobWFuaWZlc3RQYXRoLCBcInV0Zi04XCIpKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgQ291bGQgbm90IHJlYWQgdGhlIGNkay1uZXh0anMgYWRhcHRlciBtYW5pZmVzdCBhdCBcIiR7bWFuaWZlc3RQYXRofVwiLiBgICtcbiAgICAgICAgYFRoZSBkZXBsb3ltZW50IHBhY2thZ2UgaXMgaW5jb21wbGV0ZTogc3ludGggY29waWVzIGAgK1xuICAgICAgICBgJHtNQU5JRkVTVF9GSUxFX05BTUV9IGluIG5leHQgdG8gdGhlIGJ1bmRsZWQgcnVudGltZS5gLFxuICAgICAgeyBjYXVzZTogZXJyb3IgfSxcbiAgICApO1xuICB9XG5cbiAgY29uc3QgcHJvamVjdERpciA9IGpvaW4oZGVwbG95bWVudFJvb3QsIG1hbmlmZXN0LnJlbGF0aXZlUHJvamVjdERpcik7XG4gIGNvbnN0IHByb2JlID0gam9pbihcbiAgICBwcm9qZWN0RGlyLFxuICAgIG1hbmlmZXN0LmNvbmZpZy5kaXN0RGlyLFxuICAgIFwicmVxdWlyZWQtc2VydmVyLWZpbGVzLmpzb25cIixcbiAgKTtcbiAgdHJ5IHtcbiAgICBhd2FpdCByZWFkRmlsZShwcm9iZSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYFRoZSBkZXBsb3ltZW50IHJvb3QgXCIke2RlcGxveW1lbnRSb290fVwiIGRvZXMgbm90IGNvbnRhaW4gdGhlIHN0YWdlZCBgICtcbiAgICAgICAgYE5leHQuanMgcHJvamVjdDogZXhwZWN0ZWQgXCIke3Byb2JlfVwiIHRvIGV4aXN0LiBFdmVyeSBidWlsdCBlbnRyeXBvaW50IGAgK1xuICAgICAgICBgcmVzb2x2ZXMgaXRzIG93biBwYXRocyBhZ2FpbnN0IHByb2Nlc3MuY3dkKCksIHNvIHRoaXMgbGF5b3V0IGlzIHBhcnQgYCArXG4gICAgICAgIGBvZiB0aGUgY29udHJhY3QsIG5vdCBhIGNvbnZlbmllbmNlLmAsXG4gICAgICB7IGNhdXNlOiBlcnJvciB9LFxuICAgICk7XG4gIH1cbiAgLy8gYG5leHQgc3RhcnRgIGZvcmNlcyB0aGlzLCBhbmQgZXh0ZXJuYWxpemVkIHBhY2thZ2VzIChSZWFjdCBmb3IgUGFnZXMgUm91dGVyXG4gIC8vIFNTUiwgYW55dGhpbmcgaW4gYHNlcnZlckV4dGVybmFsUGFja2FnZXNgKSBwaWNrIHRoZWlyIGRldiBvciBwcm9kIGJ1aWxkIGZyb21cbiAgLy8gaXQgYXQgcmVxdWlyZSB0aW1lLiBUaGUgQ29udGFpbmVycyBEb2NrZXJmaWxlcyBzZXQgaXQgYW5kIHRoZSBGdW5jdGlvbnNcbiAgLy8gY29uc3RydWN0cyBkbyB0b287IHRoaXMgY292ZXJzIGEgaGFuZC13aXJlZCBmdW5jdGlvbi4gQmVmb3JlIGFueSBgcmVxdWlyZWAuXG4gIC8vIChgbmV4dGAncyB0eXBpbmdzIGRlY2xhcmUgTk9ERV9FTlYgcmVhZC1vbmx5LilcbiAgKHByb2Nlc3MuZW52IGFzIFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4pLk5PREVfRU5WID8/PSBcInByb2R1Y3Rpb25cIjtcbiAgcHJvY2Vzcy5jaGRpcihwcm9qZWN0RGlyKTtcbiAgLy8gQmVmb3JlIGFueXRoaW5nIGNhbiBzZXJ2ZSBhIHJlcXVlc3Q6IHRoZSBydW50aW1lJ3Mgb3duIGBuZXh0YCBpbXBvcnRzIHJlc29sdmVcbiAgLy8gb3V0IG9mIHRoZSBzdGFnZWQgYXBwLCBub3Qgb3V0IG9mIHRoZSBzaGVsbCdzIGRpcmVjdG9yeS4gU2VlIGBuZXh0LW1vZHVsZXMudHNgLlxuICB1c2VOZXh0RnJvbShwcm9qZWN0RGlyKTtcbiAgLy8gQmVmb3JlIGFueSBlbnRyeXBvaW50IGNhbiByZWFkIHRoZW0gYXQgbW9kdWxlIHNjb3BlLlxuICBsb2FkRW52RmlsZXMocHJvamVjdERpcik7XG4gIC8vIFRoZW4sIGJlZm9yZSBhbnkgZW50cnlwb2ludCAob3IgbWlkZGxld2FyZSkgY2FuIGJlIGxvYWRlZDogTmV4dCdzIG93blxuICAvLyBub2RlLWVudmlyb25tZW50IGJvb3RzdHJhcC4gU2VlIGBzZXR1cE5vZGVFbnZpcm9ubWVudGAuXG4gIHNldHVwTm9kZUVudmlyb25tZW50KCk7XG4gIC8vIEFuZCBsYXN0LCBvbmNlIHRoZSBlbnZpcm9ubWVudCBpcyByZWFkeTogYHJlZ2lzdGVyKClgLCBiZWZvcmUgYW55IGVudHJ5cG9pbnRcbiAgLy8gb3IgbWlkZGxld2FyZSBtb2R1bGUgaXMgZXZhbHVhdGVkLiBTZWUgYHJlZ2lzdGVySW5zdHJ1bWVudGF0aW9uYC5cbiAgYXdhaXQgcmVnaXN0ZXJJbnN0cnVtZW50YXRpb24ocHJvamVjdERpciwgbWFuaWZlc3QuY29uZmlnLmRpc3REaXIpO1xuXG4gIHJldHVybiBuZXcgTmV4dGpzUnVudGltZSh7XG4gICAgZGVwbG95bWVudFJvb3QsXG4gICAgbWFuaWZlc3QsXG4gICAgYnVja2V0OiBwcm9jZXNzLmVudi5DREtfTkVYVEpTX1NUQVRJQ19BU1NFVFNfQlVDS0VUX05BTUUsXG4gICAgYnVja2V0S2V5UHJlZml4OiBwcm9jZXNzLmVudi5DREtfTkVYVEpTX1NUQVRJQ19BU1NFVFNfS0VZX1BSRUZJWCxcbiAgfSk7XG59XG5cbi8qKlxuICogQSBzeW50YWN0aWNhbGx5IHZhbGlkIGBob3N0Wzpwb3J0XWA6IGEgcmVnaXN0ZXJlZCBuYW1lIG9yIGEgYnJhY2tldGVkIElQdjZcbiAqIGxpdGVyYWwsIG9wdGlvbmFsbHkgd2l0aCBhIHBvcnQuIEFueXRoaW5nIGVsc2UgY2Fubm90IGJlIHRoZSBhdXRob3JpdHkgb2YgYVxuICogVVJMLlxuICovXG5jb25zdCBIT1NUX0FVVEhPUklUWSA9IC9eKD86XFxbWzAtOUEtRmEtZjouXStcXF18WzAtOUEtWmEtei5fLV0rKSg/OjpcXGR7MSw1fSk/JC87XG5cbi8qKlxuICogVGhlIGZpcnN0IHZhbHVlIHRoYXQgaXMgYWN0dWFsbHkgdXNhYmxlIGFzIGFuIGF1dGhvcml0eSwgb3IgYHVuZGVmaW5lZGAuXG4gKlxuICogYHgtZm9yd2FyZGVkLWhvc3RgIGNhbiBhcnJpdmUgYXMgYSBsaXN0IHdoZW4gbW9yZSB0aGFuIG9uZSBwcm94eSBhcHBlbmRzIHRvXG4gKiBpdC4gVmFsaWRhdGluZyBpcyB3aGF0IGtlZXBzIGEgbWFsZm9ybWVkIHZhbHVlIGZyb20gbWFraW5nIHRoZSBgVVJMYFxuICogY29uc3RydWN0b3IgdGhyb3cg4oCUIHdoaWNoIG9uIHRoZSBMYW1iZGEgc2hlbGxzIGlzIGFuIGludm9jYXRpb24gZXJyb3IgYW5kIGFcbiAqIDUwMiwgbm90IGEgcmVzcG9uc2UuXG4gKi9cbmZ1bmN0aW9uIHZhbGlkQXV0aG9yaXR5KFxuICB2YWx1ZTogc3RyaW5nIHwgc3RyaW5nW10gfCB1bmRlZmluZWQsXG4pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCBjYW5kaWRhdGUgPSBmaXJzdFZhbHVlKHZhbHVlKT8uc3BsaXQoXCIsXCIpWzBdLnRyaW0oKTtcbiAgcmV0dXJuIGNhbmRpZGF0ZSAmJiBIT1NUX0FVVEhPUklUWS50ZXN0KGNhbmRpZGF0ZSkgPyBjYW5kaWRhdGUgOiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogYHJlc29sdmVSb3V0ZXNgIG5lZWRzIGFuIGFic29sdXRlIFVSTCwgYW5kIGl0IGJlY29tZXMgdGhlIG9yaWdpbiBldmVyeVxuICogYWJzb2x1dGUgVVJMIHRoZSBhcHAgYnVpbGRzIHN0YXJ0cyB3aXRoIOKAlCBgcmVxLm5leHRVcmwub3JpZ2luYCBpbiBtaWRkbGV3YXJlLFxuICogYGluaXRVUkxgIGZvciBhIHJvdXRlIGhhbmRsZXIg4oCUIHNvIGl0cyBob3N0IGhhcyB0byBiZSBvbmUgdGhlIGNsaWVudCBjYW5ub3RcbiAqIHBpY2suXG4gKlxuICogVGhhdCBpcyBgSG9zdGAgb24gZXZlcnkgZGVwbG95bWVudCBidXQgb25lOiBDbG91ZEZyb250IGZvcndhcmRzIHRoZSB2aWV3ZXInc1xuICogYEhvc3RgIHRvIGEgY29udGFpbmVyIG9yaWdpbiAoYEFMTF9WSUVXRVJgKSwgYW4gQUxCIHBhc3NlcyBpdCB0aHJvdWdoLCBhbmQgQVBJXG4gKiBHYXRld2F5IHNldHMgaXRzIG93biBkb21haW4uIFRoZSBleGNlcHRpb24gaXMgYSBMYW1iZGEgRnVuY3Rpb24gVVJMLCB3aGVyZVxuICogQ2xvdWRGcm9udCBoYXMgdG8gc2VuZCB0aGUgVVJMJ3Mgb3duIGRvbWFpbiBhcyBgSG9zdGAgYW5kIHB1dHMgdGhlIHZpZXdlcidzIGluXG4gKiBgeC1mb3J3YXJkZWQtaG9zdGA7IHNlZSB7QGxpbmsgUnVudGltZVJlcXVlc3QudHJ1c3RGb3J3YXJkZWRIb3N0fS4gQW55d2hlcmVcbiAqIGVsc2UgdGhlIGhlYWRlciBpcyB0aGUgY2xpZW50J3MsIGFuZCBob25vcmluZyBpdCBsZXQgYSByZXF1ZXN0IHdpdGhcbiAqIGBYLUZvcndhcmRlZC1Ib3N0OiBldmlsLmV4YW1wbGVgIHBvaW50IGEgcGFzc3dvcmQtcmVzZXQgbGluayBhdCBldmlsLmV4YW1wbGUg4oCUXG4gKiBhbmQsIG9uIEdsb2JhbCBDb250YWluZXJzLCBoYXZlIENsb3VkRnJvbnQgY2FjaGUgdGhhdCBwYWdlLCBzaW5jZSB0aGUgaGVhZGVyXG4gKiBpcyBub3QgaW4gaXRzIGNhY2hlIGtleS5cbiAqL1xuZnVuY3Rpb24gYWJzb2x1dGVVcmwocmVxdWVzdDogUnVudGltZVJlcXVlc3QpOiBVUkwge1xuICBjb25zdCBob3N0ID1cbiAgICAocmVxdWVzdC50cnVzdEZvcndhcmRlZEhvc3RcbiAgICAgID8gdmFsaWRBdXRob3JpdHkocmVxdWVzdC5oZWFkZXJzW1wieC1mb3J3YXJkZWQtaG9zdFwiXSlcbiAgICAgIDogdW5kZWZpbmVkKSA/P1xuICAgIHZhbGlkQXV0aG9yaXR5KHJlcXVlc3QuaGVhZGVycy5ob3N0KSA/P1xuICAgIFwibG9jYWxob3N0XCI7XG4gIC8vIEJlaGluZCBDbG91ZEZyb250IG9uIEdsb2JhbCBDb250YWluZXJzIHRoZSBjb250YWluZXIgc2hlbGwgaGFzIGFscmVhZHkgcHV0XG4gIC8vIHRoZSB2aWV3ZXIncyBwcm90b2NvbCBoZXJlOyBzZWUgYHRydXN0Q2xvdWRGcm9udFByb3RvYCBpbiBodHRwL25vZGUtc2VydmVyLnRzLlxuICBjb25zdCBmb3J3YXJkZWRQcm90byA9IGZpcnN0VmFsdWUocmVxdWVzdC5oZWFkZXJzW1wieC1mb3J3YXJkZWQtcHJvdG9cIl0pXG4gICAgPy5zcGxpdChcIixcIilbMF1cbiAgICAudHJpbSgpXG4gICAgLnRvTG93ZXJDYXNlKCk7XG4gIC8vIENsaWVudC1zdXBwbGllZCB3aGVyZSBubyBwcm94eSBvdmVyd3JpdGVzIGl0LCBidXQgaGFybWxlc3M6IHRoZSBob3N0IGlzXG4gIC8vIGFscmVhZHkgZml4ZWQsIGFuZCBhbnl0aGluZyBidXQgdGhlc2UgdHdvIHdvdWxkIG5vdCBwYXJzZS5cbiAgY29uc3QgcHJvdG8gPVxuICAgIGZvcndhcmRlZFByb3RvID09PSBcImh0dHBcIiB8fCBmb3J3YXJkZWRQcm90byA9PT0gXCJodHRwc1wiXG4gICAgICA/IGZvcndhcmRlZFByb3RvXG4gICAgICA6IHJlcXVlc3QuZW5jcnlwdGVkID09PSBmYWxzZVxuICAgICAgICA/IFwiaHR0cFwiXG4gICAgICAgIDogXCJodHRwc1wiO1xuICByZXR1cm4gbmV3IFVSTChyZXF1ZXN0LnVybCwgYCR7cHJvdG99Oi8vJHtob3N0fWApO1xufVxuXG5mdW5jdGlvbiBwaWNrRGVmaW5lZChcbiAgaGVhZGVyczogSW5jb21pbmdIdHRwSGVhZGVycyxcbiAgbmFtZXM6IHJlYWRvbmx5IHN0cmluZ1tdLFxuKTogSW5jb21pbmdIdHRwSGVhZGVycyB7XG4gIGNvbnN0IHBpY2tlZDogSW5jb21pbmdIdHRwSGVhZGVycyA9IHt9O1xuICBmb3IgKGNvbnN0IG5hbWUgb2YgbmFtZXMpIHtcbiAgICBpZiAoaGVhZGVyc1tuYW1lXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBwaWNrZWRbbmFtZV0gPSBoZWFkZXJzW25hbWVdO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcGlja2VkO1xufVxuXG4vKipcbiAqIGBub3JtYWxpemVSZXBlYXRlZFNsYXNoZXNgIChgbmV4dC9kaXN0L3NoYXJlZC9saWIvdXRpbHMuanNgKSwgYXBwbGllZCB3aGVyZVxuICogTmV4dC5qcyBhcHBsaWVzIGl0OiBiZWZvcmUgcm91dGluZywgYXMgYSAzMDggdG8gdGhlIGNvbGxhcHNlZCBwYXRoLlxuICogYGJhc2Utc2VydmVyLnRzYCBkb2VzIGBpZiAodXJsTm9RdWVyeT8ubWF0Y2goLyhcXFxcfFxcL1xcLykvKSlcbiAqIHJlcy5yZWRpcmVjdChub3JtYWxpemVSZXBlYXRlZFNsYXNoZXMocmVxLnVybCksIDMwOClgLCBzbyBgL2EvL2JgIGFuZCBgL2FcXGJgXG4gKiBib3RoIGFuc3dlciBhIHJlZGlyZWN0IHRvIGAvYS9iYCByYXRoZXIgdGhhbiBhIDQwNCAtIGFuZCBgQG5leHQvcm91dGluZ2Anc1xuICogYHJlc29sdmVSb3V0ZXNgIGRvZXMgbm90IGRvIGl0IGZvciB1cywgd2hpY2ggaXMgaG93IGAvL2AgcmVhY2hlZCB0aGlzIHJ1bnRpbWUgYXNcbiAqIGEgNTAwIGFuZCBgL2FwaS8vanNvbmAgYXMgYSA0MDQuXG4gKlxuICogRW5jb2RlZCBiYWNrc2xhc2hlcyBhcmUgbGVmdCBhbG9uZSwgYXMgTmV4dC5qcyBsZWF2ZXMgdGhlbTogYCU1Q2AgaXMgYSBsaXRlcmFsXG4gKiBjaGFyYWN0ZXIgaW4gYSBwYXRoIHNlZ21lbnQsIG5vdCBhIHNlcGFyYXRvci5cbiAqXG4gKiBSZXR1cm5zIGB1bmRlZmluZWRgIHdoZW4gdGhlcmUgaXMgbm90aGluZyB0byBjb2xsYXBzZSwgd2hpY2ggaXMgdGhlIGNvbW1vbiBjYXNlLlxuICovXG5mdW5jdGlvbiBjb2xsYXBzZVJlcGVhdGVkU2xhc2hlcyh0YXJnZXQ6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHBhcnRzID0gdGFyZ2V0LnNwbGl0KFwiP1wiKTtcbiAgY29uc3QgcGF0aG5hbWUgPSBwYXJ0c1swXTtcbiAgaWYgKCEvXFxcXHxcXC9cXC8vLnRlc3QocGF0aG5hbWUpKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICBjb25zdCBxdWVyeSA9IHBhcnRzLmxlbmd0aCA+IDEgPyBgPyR7cGFydHMuc2xpY2UoMSkuam9pbihcIj9cIil9YCA6IFwiXCI7XG4gIHJldHVybiBwYXRobmFtZS5yZXBsYWNlKC9cXFxcL2csIFwiL1wiKS5yZXBsYWNlKC9cXC9cXC8rL2csIFwiL1wiKSArIHF1ZXJ5O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNwbGl0Qm9keSB7XG4gIC8qKiBXaGF0IGByZXFgIHJlYWRzOiB0aGUgZW50cnlwb2ludCdzIGNvcHkuICovXG4gIHJlYWRvbmx5IGZvclJlcXVlc3Q/OiBSZWFkYWJsZSB8IEJ1ZmZlcjtcbiAgLyoqIFdoYXQgYHJlc29sdmVSb3V0ZXNgIGhhbmRzIG1pZGRsZXdhcmUuICovXG4gIHJlYWRvbmx5IGZvckRpc3BhdGNoOiBSZWFkYWJsZVN0cmVhbTtcbiAgLyoqXG4gICAqIENhbGxlZCBvbmNlIGRpc3BhdGNoIGhhcyByZXR1cm5lZCwgd2l0aCB3aGV0aGVyIG1pZGRsZXdhcmUgYW5zd2VyZWQgdGhlXG4gICAqIHJlcXVlc3QgaXRzZWxmLiBMZXRzIGdvIG9mIHdoaWNoZXZlciBjb3B5IG5vdGhpbmcgd2lsbCByZWFkIGFueSBtb3JlLlxuICAgKi9cbiAgcmVsZWFzZVVucmVhZChtaWRkbGV3YXJlUmVzcG9uZGVkOiBib29sZWFuKTogdm9pZDtcbn1cblxuLyoqXG4gKiBgcmVzb2x2ZVJvdXRlc2AgaGFuZHMgYHJlcXVlc3RCb2R5YCB0byBtaWRkbGV3YXJlLCB3aGljaCBjb25zdW1lcyBpdCwgd2hpbGUgdGhlXG4gKiBlbnRyeXBvaW50IG5lZWRzIHRoZSBzYW1lIGJ5dGVzIOKAlCB0aGUgc2FtZSBwcm9ibGVtIGBuZXh0LXNlcnZlcmAgc29sdmVzIHdpdGhcbiAqIGBnZXRDbG9uZWFibGVCb2R5KClgLiBPbmx5IHNwbGl0IHdoZW4gdGhlcmUgaXMgbWlkZGxld2FyZSB0byBmZWVkOiB0ZWVpbmcgY29zdHNcbiAqIGEgYnVmZmVyIGNvcHkgb2YgZXZlcnkgdXBsb2FkIG9uIGEgcGF0aCB0aGF0IHdvdWxkIG90aGVyd2lzZSBiZSBhIHN0cmFpZ2h0IHBpcGUuXG4gKlxuICogQSBgdGVlKClgIGJ1ZmZlcnMsIGZvciB0aGUgYnJhbmNoIHRoYXQgaXMgYmVoaW5kLCBldmVyeSBjaHVuayB0aGUgb3RoZXIgb25lXG4gKiBoYXMgcmVhZCDigJQgc28gYSBicmFuY2ggdGhhdCBpcyBuZXZlciByZWFkIGhvbGRzIHRoZSB3aG9sZSBib2R5LiBNaWRkbGV3YXJlXG4gKiB0aGF0IGRvZXNuJ3QgcmVhZCB0aGUgYm9keSBpcyB0aGUgY29tbW9uIGNhc2UgKGFuZCBpdHMgbWF0Y2hlciBtYXkgbm90IGV2ZW5cbiAqIGhhdmUgcnVuIGl0KSwgYWZ0ZXIgd2hpY2ggdGhlIGVudHJ5cG9pbnQgc3RyZWFtaW5nIGFuIHVwbG9hZCB3b3VsZCBwaWxlIGFsbFxuICogb2YgaXQgdXAgaW4gdGhlIG1pZGRsZXdhcmUgYnJhbmNoOiB0aGUgd2hvbGUgdXBsb2FkIGluIG1lbW9yeSwgb24gYVxuICogY29udGFpbmVyIHRoYXQgc2VydmVzIG90aGVyIHJlcXVlc3RzLiBTbyBvbmNlIGRpc3BhdGNoIHJldHVybnMsIHRoZSBicmFuY2hcbiAqIHdpdGggbm8gcmVhZGVyIGxlZnQgaXMgY2FuY2VsbGVkIOKAlCB0aGUgbWlkZGxld2FyZSBvbmUsIG9yIHRoZSBlbnRyeXBvaW50IG9uZVxuICogd2hlbiBtaWRkbGV3YXJlIGFuc3dlcmVkIGFuZCBgcmVxYCB3aWxsIG5ldmVyIGJlIHJlYWQuIENhbmNlbGxpbmcgb25lXG4gKiBicmFuY2ggbGVhdmVzIHRoZSBzb3VyY2UgYW5kIHRoZSBvdGhlciBicmFuY2ggcnVubmluZy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNwbGl0Qm9keShcbiAgYm9keTogUmVhZGFibGUgfCBCdWZmZXIgfCB1bmRlZmluZWQsXG4gIGhhc01pZGRsZXdhcmU6IGJvb2xlYW4sXG4pOiBTcGxpdEJvZHkge1xuICBjb25zdCByZWxlYXNlTm90aGluZyA9ICgpOiB2b2lkID0+IHt9O1xuICBpZiAoYm9keSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGZvckRpc3BhdGNoOiBuZXcgQmxvYihbXSkuc3RyZWFtKCksXG4gICAgICByZWxlYXNlVW5yZWFkOiByZWxlYXNlTm90aGluZyxcbiAgICB9O1xuICB9XG4gIGlmICghaGFzTWlkZGxld2FyZSkge1xuICAgIHJldHVybiB7XG4gICAgICBmb3JSZXF1ZXN0OiBib2R5LFxuICAgICAgZm9yRGlzcGF0Y2g6IG5ldyBCbG9iKFtdKS5zdHJlYW0oKSxcbiAgICAgIHJlbGVhc2VVbnJlYWQ6IHJlbGVhc2VOb3RoaW5nLFxuICAgIH07XG4gIH1cbiAgaWYgKEJ1ZmZlci5pc0J1ZmZlcihib2R5KSkge1xuICAgIC8vIEFscmVhZHkgZnVsbHkgaW4gbWVtb3J5LCBzbyBcInRlZWluZ1wiIGlzIGp1c3QgcmVhZGluZyBpdCB0d2ljZS5cbiAgICByZXR1cm4ge1xuICAgICAgZm9yUmVxdWVzdDogYm9keSxcbiAgICAgIGZvckRpc3BhdGNoOiBuZXcgQmxvYihbYm9keV0pLnN0cmVhbSgpLFxuICAgICAgcmVsZWFzZVVucmVhZDogcmVsZWFzZU5vdGhpbmcsXG4gICAgfTtcbiAgfVxuICBjb25zdCBbZm9yTWlkZGxld2FyZSwgZm9yRW50cnlwb2ludF0gPSBSZWFkYWJsZS50b1dlYihib2R5KS50ZWUoKTtcbiAgY29uc3QgZm9yUmVxdWVzdCA9IFJlYWRhYmxlLmZyb21XZWIoZm9yRW50cnlwb2ludCBhcyBuZXZlcik7XG4gIHJldHVybiB7XG4gICAgZm9yUmVxdWVzdCxcbiAgICBmb3JEaXNwYXRjaDogZm9yTWlkZGxld2FyZSBhcyBSZWFkYWJsZVN0cmVhbSxcbiAgICByZWxlYXNlVW5yZWFkKG1pZGRsZXdhcmVSZXNwb25kZWQpIHtcbiAgICAgIGlmIChtaWRkbGV3YXJlUmVzcG9uZGVkKSB7XG4gICAgICAgIC8vIGBmcm9tV2ViYCBob2xkcyB0aGUgYnJhbmNoJ3MgcmVhZGVyLCBzbyBpdCBpcyBkZXN0cm95ZWQgcmF0aGVyIHRoYW5cbiAgICAgICAgLy8gY2FuY2VsbGVkOyBpdHMgYF9kZXN0cm95YCBjYW5jZWxzIHRoZSByZWFkZXIuXG4gICAgICAgIGZvclJlcXVlc3QuZGVzdHJveSgpO1xuICAgICAgfSBlbHNlIGlmICghZm9yTWlkZGxld2FyZS5sb2NrZWQpIHtcbiAgICAgICAgLy8gTG9ja2VkIG1lYW5zIG1pZGRsZXdhcmUgdG9vayBhIHJlYWRlcjogaXQgaXMgcmVhZGluZywgb3IgaGFzIHJlYWQsXG4gICAgICAgIC8vIHRoZSBib2R5IGl0c2VsZiwgYW5kIGEgbG9ja2VkIHN0cmVhbSBjYW5ub3QgYmUgY2FuY2VsbGVkIGFueXdheS5cbiAgICAgICAgZm9yTWlkZGxld2FyZS5jYW5jZWwoKS5jYXRjaCgoKSA9PiB7fSk7XG4gICAgICB9XG4gICAgfSxcbiAgfTtcbn1cblxuLyoqIGBJbmNvbWluZ0h0dHBIZWFkZXJzYCDihpIgdGhlIGZsYXQgZW50cmllcyBhIGBIZWFkZXJzYCBjb25zdHJ1Y3RvciBhY2NlcHRzLiAqL1xuZnVuY3Rpb24gdG9XZWJIZWFkZXJzKGhlYWRlcnM6IEluY29taW5nSHR0cEhlYWRlcnMpOiBBcnJheTxbc3RyaW5nLCBzdHJpbmddPiB7XG4gIGNvbnN0IGVudHJpZXM6IEFycmF5PFtzdHJpbmcsIHN0cmluZ10+ID0gW107XG4gIGZvciAoY29uc3QgW25hbWUsIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhoZWFkZXJzKSkge1xuICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBzaW5nbGUgb2YgQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZSA6IFt2YWx1ZV0pIHtcbiAgICAgIGVudHJpZXMucHVzaChbbmFtZSwgc2luZ2xlXSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBlbnRyaWVzO1xufVxuXG4vKipcbiAqIGBoZWFkZXJzKClgIHJ1bGVzLCB0aGUgaW1tdXRhYmxlIGBjYWNoZS1jb250cm9sYCBmb3IgYnVpbGQgYXNzZXRzLCBhbmQgYW55dGhpbmdcbiAqIG1pZGRsZXdhcmUgc2V0IHdpdGggYE5leHRSZXNwb25zZS5uZXh0KHsgaGVhZGVycyB9KWAuIEFwcGxpZWQgYmVmb3JlIHRoZVxuICogZW50cnlwb2ludCBydW5zIHNvIHRoYXQgYSByb3V0ZSBjYW4gc3RpbGwgb3ZlcnJpZGUgaXRzIG93bi5cbiAqL1xuZnVuY3Rpb24gYXBwbHlIZWFkZXJzKHJlczogU2hpbVNlcnZlclJlc3BvbnNlLCBoZWFkZXJzOiBIZWFkZXJzKTogdm9pZCB7XG4gIGZvciAoY29uc3QgW25hbWUsIHZhbHVlXSBvZiBoZWFkZXJzLmVudHJpZXMoKSkge1xuICAgIC8vIGBlbnRyaWVzKClgIHlpZWxkcyBgc2V0LWNvb2tpZWAgb25jZSBwZXIgY29va2llLCBzbyBhcHBlbmRpbmcgdGhlIHdob2xlXG4gICAgLy8gYGdldFNldENvb2tpZSgpYCBhcnJheSBoZXJlIHdvdWxkIGVtaXQgTsKyIG9mIHRoZW0g4oCUIHR3byBjb29raWVzIHNldCBieVxuICAgIC8vIG1pZGRsZXdhcmUgYXJyaXZlZCBhcyBbXCJhPTFcIixcImI9MlwiLFwiYT0xXCIsXCJiPTJcIl0uIEhhbmRsZWQgb25jZSwgb3V0c2lkZS5cbiAgICBpZiAobmFtZSA9PT0gXCJzZXQtY29va2llXCIpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICByZXMuc2V0SGVhZGVyKG5hbWUsIHZhbHVlKTtcbiAgfVxuICBmb3IgKGNvbnN0IGNvb2tpZSBvZiBoZWFkZXJzLmdldFNldENvb2tpZSgpKSB7XG4gICAgcmVzLmFwcGVuZEhlYWRlcihcInNldC1jb29raWVcIiwgY29va2llKTtcbiAgfVxufVxuXG4vKipcbiAqIE1pcnJvcnMgTmV4dC5qcydzIG93biByZWRpcmVjdCByZXNwb25zZSAoYGJhc2Utc2VydmVyLnRzYCk6IHRoZSBkZXN0aW5hdGlvbiBpc1xuICogYWxzbyB0aGUgYm9keSwgYW5kIGEgMzA4IGNhcnJpZXMgYSBgUmVmcmVzaGAgaGVhZGVyIGJlY2F1c2Ugc29tZSBjbGllbnRzIGFuZFxuICogaW50ZXJtZWRpYXJpZXMgc3RpbGwgZG8gbm90IGltcGxlbWVudCAzMDguXG4gKi9cbmZ1bmN0aW9uIHNlbmRSZWRpcmVjdChcbiAgcmVzOiBTaGltU2VydmVyUmVzcG9uc2UsXG4gIGxvY2F0aW9uOiBzdHJpbmcsXG4gIHN0YXR1czogbnVtYmVyLFxuKTogdm9pZCB7XG4gIHJlcy5zdGF0dXNDb2RlID0gc3RhdHVzO1xuICByZXMuc2V0SGVhZGVyKFwiTG9jYXRpb25cIiwgbG9jYXRpb24pO1xuICBpZiAoc3RhdHVzID09PSAzMDgpIHtcbiAgICByZXMuc2V0SGVhZGVyKFwiUmVmcmVzaFwiLCBgMDt1cmw9JHtsb2NhdGlvbn1gKTtcbiAgfVxuICByZXMuc2V0SGVhZGVyKFwiQ29udGVudC1UeXBlXCIsIFwidGV4dC9wbGFpbjsgY2hhcnNldD11dGYtOFwiKTtcbiAgcmVzLmVuZChsb2NhdGlvbik7XG59XG5cbi8qKlxuICogYG5leHQgc3RhcnRgJ3MgYW5zd2VyIHRvIGEgUE9TVCwgUFVUIG9yIERFTEVURSBmb3IgYSBzdGF0aWMgZmlsZTogNDA1IHdpdGhcbiAqIGBBbGxvdzogR0VULCBIRUFEYCAoYHJvdXRlci1zZXJ2ZXIuanNgKS4gSXQgcmVuZGVycyB0aGF0IHRocm91Z2ggYC9fZXJyb3JgO1xuICogdGhpcyBpcyB0aGUgcGxhaW4tdGV4dCBlcXVpdmFsZW50LCBzaW5jZSB0aGUgc3RhdHVzIGFuZCBgQWxsb3dgIGFyZSB3aGF0IGFcbiAqIGNsaWVudCBhY3RzIG9uLlxuICovXG5mdW5jdGlvbiBzZW5kTWV0aG9kTm90QWxsb3dlZChyZXM6IFNoaW1TZXJ2ZXJSZXNwb25zZSk6IHZvaWQge1xuICByZXMuc3RhdHVzQ29kZSA9IDQwNTtcbiAgcmVzLnNldEhlYWRlcihcIkFsbG93XCIsIFwiR0VULCBIRUFEXCIpO1xuICByZXMuc2V0SGVhZGVyKFwiQ29udGVudC1UeXBlXCIsIFwidGV4dC9wbGFpbjsgY2hhcnNldD11dGYtOFwiKTtcbiAgcmVzLmVuZChcIk1ldGhvZCBOb3QgQWxsb3dlZFwiKTtcbn1cblxuLyoqXG4gKiBSZXF1ZXN0IGhlYWRlcnMge0BsaW5rIHByb3h5RXh0ZXJuYWx9IGRvZXMgbm90IGZvcndhcmQuIFRoZSB1cHN0cmVhbSdzIG93blxuICogYEhvc3RgIG11c3Qgd2luOyB0aGUgcmVzdCBkZXNjcmliZSBvdXIgY29ubmVjdGlvbiwgbm90IHRoZSBwcm94aWVkIG9uZSwgYW5kXG4gKiB1bmRpY2kgdGhyb3dzIG9uIG1vc3Qgb2YgdGhlbSwgd2hpY2ggd291bGQgYW5zd2VyIHRoZSByZXF1ZXN0IHdpdGggYSA1MDAuXG4gKiBOZXh0LmpzJ3MgbGlzdCBmb3IgdGhlIHJlcXVlc3RzIGl0IG1ha2VzIHdpdGggdW5kaWNpIChgaXBjRm9yYmlkZGVuSGVhZGVyc2AsXG4gKiBgbmV4dC9kaXN0L3NlcnZlci9saWIvc2VydmVyLWlwYy91dGlscy5qc2ApLCBwbHVzIGBob3N0YCBhbmQgYHVwZ3JhZGVgLCBtaW51c1xuICogYGNvbnRlbnQtZW5jb2RpbmdgOiBOZXh0IHN0cmlwcyB0aGF0IG92ZXIgYSBib2R5IGl0IGhhcyBhbHJlYWR5IGRlY29kZWQsIHdoaWxlXG4gKiB0aGlzIG9uZSBpcyBmb3J3YXJkZWQgYXMgcmVjZWl2ZWQsIHN0aWxsIGVuY29kZWQuXG4gKi9cbmNvbnN0IFBST1hZX0RST1BQRURfSEVBREVSUzogcmVhZG9ubHkgc3RyaW5nW10gPSBbXG4gIFwiaG9zdFwiLFxuICBcInVwZ3JhZGVcIixcbiAgXCJhY2NlcHQtZW5jb2RpbmdcIixcbiAgXCJrZWVwYWxpdmVcIixcbiAgXCJrZWVwLWFsaXZlXCIsXG4gIFwidHJhbnNmZXItZW5jb2RpbmdcIixcbiAgXCJjb25uZWN0aW9uXCIsXG4gIFwiZXhwZWN0XCIsXG5dO1xuXG4vKipcbiAqIFRoZSBTaWdWNCBzaWduYXR1cmUgT3JpZ2luIEFjY2VzcyBDb250cm9sIHB1dCBvbiBhIHJlcXVlc3QgdG8gdGhlIEZ1bmN0aW9uXG4gKiBVUkwsIGFsc28gZHJvcHBlZCBieSB7QGxpbmsgcHJveHlFeHRlcm5hbH0gd2hlbiB0aGUgcmVxdWVzdCB3YXMgSUFNLXZlcmlmaWVkOlxuICogZm9yd2FyZGVkLCBpdCB3b3VsZCBsZXQgdGhlIHRoaXJkLXBhcnR5IG9yaWdpbiByZXBsYXkgdGhlIHJlcXVlc3QgYWdhaW5zdFxuICogdGhlIEZ1bmN0aW9uIFVSTC4gQW55d2hlcmUgZWxzZSB0aGVzZSBhcmUgdGhlIGNsaWVudCdzIG93biwgYW5kIGFyZVxuICogZm9yd2FyZGVkIGFzIGBuZXh0IHN0YXJ0YCBmb3J3YXJkcyB0aGVtLlxuICovXG5jb25zdCBTSUdWNF9IRUFERVJTOiByZWFkb25seSBzdHJpbmdbXSA9IFtcbiAgXCJhdXRob3JpemF0aW9uXCIsXG4gIFwieC1hbXotZGF0ZVwiLFxuICBcIngtYW16LWNvbnRlbnQtc2hhMjU2XCIsXG4gIFwieC1hbXotc2VjdXJpdHktdG9rZW5cIixcbl07XG5cbi8qKiBBIGBuZXh0LmNvbmZpZ2AgcmV3cml0ZSB3aG9zZSBkZXN0aW5hdGlvbiBpcyBhbm90aGVyIG9yaWdpbi4gKi9cbmFzeW5jIGZ1bmN0aW9uIHByb3h5RXh0ZXJuYWwoXG4gIHJlcTogU2hpbUluY29taW5nTWVzc2FnZSxcbiAgcmVzOiBTaGltU2VydmVyUmVzcG9uc2UsXG4gIHVybDogVVJMLFxuICByZXF1ZXN0SGVhZGVyczogSGVhZGVycyxcbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBtZXRob2QgPSByZXEubWV0aG9kID8/IFwiR0VUXCI7XG4gIGNvbnN0IGhhc0JvZHkgPSBtZXRob2QgIT09IFwiR0VUXCIgJiYgbWV0aG9kICE9PSBcIkhFQURcIjtcbiAgY29uc3QgaGVhZGVycyA9IG5ldyBIZWFkZXJzKHJlcXVlc3RIZWFkZXJzKTtcbiAgZm9yIChjb25zdCBuYW1lIG9mIFBST1hZX0RST1BQRURfSEVBREVSUykge1xuICAgIGhlYWRlcnMuZGVsZXRlKG5hbWUpO1xuICB9XG4gIGlmIChyZXEudHJ1c3RGb3J3YXJkZWRIb3N0KSB7XG4gICAgZm9yIChjb25zdCBuYW1lIG9mIFNJR1Y0X0hFQURFUlMpIHtcbiAgICAgIGhlYWRlcnMuZGVsZXRlKG5hbWUpO1xuICAgIH1cbiAgfVxuICBjb25zdCB1cHN0cmVhbSA9IGF3YWl0IGZldGNoKHVybCwge1xuICAgIG1ldGhvZCxcbiAgICBoZWFkZXJzLFxuICAgIGJvZHk6IGhhc0JvZHkgPyAoUmVhZGFibGUudG9XZWIocmVxKSBhcyBSZWFkYWJsZVN0cmVhbSkgOiB1bmRlZmluZWQsXG4gICAgcmVkaXJlY3Q6IFwibWFudWFsXCIsXG4gICAgLi4uKGhhc0JvZHkgPyB7IGR1cGxleDogXCJoYWxmXCIgfSA6IHt9KSxcbiAgfSBhcyBSZXF1ZXN0SW5pdCk7XG4gIGF3YWl0IHNlbmRXZWJSZXNwb25zZShyZXMsIHVwc3RyZWFtKTtcbn1cblxuLyoqXG4gKiBIZWFkZXJzIGRlc2NyaWJpbmcgdGhlIGZyYW1pbmcgb2YgYSBib2R5IHRoYXQgaXMgbm8gbG9uZ2VyIHRoZSBib2R5IGJlaW5nXG4gKiBzZW50LCBkcm9wcGVkIGZyb20gZXZlcnkgYFJlc3BvbnNlYCB7QGxpbmsgc2VuZFdlYlJlc3BvbnNlfSBmb3J3YXJkcy5cbiAqXG4gKiBBIHByb3hpZWQgb3JpZ2luJ3MgYFJlc3BvbnNlYCBjYW1lIGJhY2sgZnJvbSBgZmV0Y2hgLCBhbmQgc28sIG9mdGVuLCBkaWRcbiAqIG1pZGRsZXdhcmUncyBvd24gKGByZXR1cm4gZmV0Y2godXBzdHJlYW0pYCBpbiBgcHJveHkudHNgLCBzaW5jZSBtaWRkbGV3YXJlXG4gKiBydW5zIGluIHByb2Nlc3MgYW5kIGl0cyBgZmV0Y2hgIGlzIHVuZGljaSkuIHVuZGljaSBkZWNvZGVzIHRoZSBib2R5IOKAlCBnemlwLFxuICogZGVmbGF0ZSwgYnIsIHpzdGQg4oCUIGFuZCBsZWF2ZXMgYGNvbnRlbnQtZW5jb2RpbmdgIGFuZCBgY29udGVudC1sZW5ndGhgXG4gKiBkZXNjcmliaW5nIHRoZSBlbmNvZGVkIGJ5dGVzIGl0IGFscmVhZHkgdGhyZXcgYXdheS4gRm9yd2FyZGluZyB0aGVtIGVtaXRzXG4gKiBwbGFpbnRleHQgbGFiZWxsZWQgYGd6aXBgICh0aGUgYnJvd3NlciBmYWlscyB0aGUgd2hvbGUgcmVzcG9uc2Ugd2l0aFxuICogYEVSUl9DT05URU5UX0RFQ09ESU5HX0ZBSUxFRGApIHVuZGVyIGEgYENvbnRlbnQtTGVuZ3RoYCB0aGF0IGlzIHRvbyBzaG9ydCxcbiAqIGFuZCBgc2hvdWxkR3ppcGAgdGhlbiBkZWNsaW5lcyB0byBjb21wcmVzcyBpdCBiZWNhdXNlIGBjb250ZW50LWVuY29kaW5nYCBpc1xuICogYWxyZWFkeSBzZXQsIHNvIG5vdGhpbmcgZG93bnN0cmVhbSByZXBhaXJzIGl0LiBgdHJhbnNmZXItZW5jb2RpbmdgIGlzXG4gKiBob3AtYnktaG9wOiBpdCBkZXNjcmliZWQgdGhlIHVwc3RyZWFtIGNvbm5lY3Rpb24sIG5vdCB0aGlzIG9uZS5cbiAqXG4gKiBTdG9jayBOZXh0LmpzIGRyb3BzIHRoZSBzYW1lIHRocmVlIGZyb20gZXZlcnkgbWlkZGxld2FyZSByZXNwb25zZVxuICogKGBGT1JCSURERU5fSEVBREVSU2AgaW4gYG5leHQvZGlzdC9zZXJ2ZXIvd2ViL3NhbmRib3gvc2FuZGJveC5qc2ApLCBzb1xuICogbWlkZGxld2FyZSBjYW5ub3QgbGFiZWwgYSBib2R5IGl0IGVuY29kZWQgaXRzZWxmIHRoZXJlIGVpdGhlci5cbiAqL1xuY29uc3QgU1RBTEVfRlJBTUlOR19IRUFERVJTOiBSZWFkb25seVNldDxzdHJpbmc+ID0gbmV3IFNldChbXG4gIFwiY29udGVudC1lbmNvZGluZ1wiLFxuICBcImNvbnRlbnQtbGVuZ3RoXCIsXG4gIFwidHJhbnNmZXItZW5jb2RpbmdcIixcbl0pO1xuXG4vKiogU3RyZWFtIGEgYFJlc3BvbnNlYCDigJQgbWlkZGxld2FyZSdzIG93biwgb3IgYSBwcm94aWVkIG9yaWdpbidzIOKAlCBpbnRvIGByZXNgLiAqL1xuYXN5bmMgZnVuY3Rpb24gc2VuZFdlYlJlc3BvbnNlKFxuICByZXM6IFNoaW1TZXJ2ZXJSZXNwb25zZSxcbiAgcmVzcG9uc2U6IFJlc3BvbnNlLFxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJlcy5zdGF0dXNDb2RlID0gcmVzcG9uc2Uuc3RhdHVzO1xuICBpZiAocmVzcG9uc2Uuc3RhdHVzVGV4dCkge1xuICAgIHJlcy5zdGF0dXNNZXNzYWdlID0gcmVzcG9uc2Uuc3RhdHVzVGV4dDtcbiAgfVxuICBjb25zdCBoZWFkZXJzID0gbmV3IEhlYWRlcnMocmVzcG9uc2UuaGVhZGVycyk7XG4gIGZvciAoY29uc3QgbmFtZSBvZiBTVEFMRV9GUkFNSU5HX0hFQURFUlMpIHtcbiAgICBoZWFkZXJzLmRlbGV0ZShuYW1lKTtcbiAgfVxuICBhcHBseUhlYWRlcnMocmVzLCBoZWFkZXJzKTtcbiAgaWYgKCFyZXNwb25zZS5ib2R5KSB7XG4gICAgcmVzLmVuZCgpO1xuICAgIHJldHVybjtcbiAgfVxuICBmb3IgYXdhaXQgKGNvbnN0IGNodW5rIG9mIHJlc3BvbnNlLmJvZHkgYXMgdW5rbm93biBhcyBBc3luY0l0ZXJhYmxlPFVpbnQ4QXJyYXk+KSB7XG4gICAgLy8gTGVhdmluZyB0aGUgbG9vcCBjYW5jZWxzIHRoZSBib2R5LCB3aGljaCBpcyB3aGF0IHN0b3BzIGEgcHJveGllZCBvcmlnaW5cbiAgICAvLyBmcm9tIGJlaW5nIHJlYWQgdG8gdGhlIGVuZCBmb3IgYSBjbGllbnQgdGhhdCBoYXMgYWxyZWFkeSBnb25lLlxuICAgIGlmIChyZXMuZGVzdHJveWVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIFBhY2VkIGJ5IHRoZSBjbGllbnQ6IHdpdGhvdXQgd2FpdGluZyBmb3IgYGRyYWluYCwgYSBsYXJnZSBwcm94aWVkIGJvZHlcbiAgICAvLyBoZWFkZWQgZm9yIGEgc2xvdyBjbGllbnQgaXMgYnVmZmVyZWQgd2hvbGUgaW4gbWVtb3J5LlxuICAgIGNvbnN0IGFjY2VwdGVkID0gcmVzLndyaXRlKGNodW5rKTtcbiAgICAvLyBTZXQgYnkgdGhlIHNpbmsgd2hlbiBpdCBjb21wcmVzc2VzLiBXaXRob3V0IGl0IHRoZSBjaHVuayBzaXRzIGluIHpsaWInc1xuICAgIC8vIGJ1ZmZlciwgYW5kIGEgc3RyZWFtZWQgYm9keSDigJQgc2VydmVyLXNlbnQgZXZlbnRzIHRocm91Z2ggYSByZXdyaXRlLCBhXG4gICAgLy8gbWlkZGxld2FyZSBgUmVhZGFibGVTdHJlYW1gIOKAlCByZWFjaGVzIHRoZSBjbGllbnQgYWxsIGF0IG9uY2UsIGF0IHRoZSBlbmQuXG4gICAgLy8gTmV4dC5qcyBmbHVzaGVzIGFmdGVyIGV2ZXJ5IGNodW5rIGZvciB0aGUgc2FtZSByZWFzb24gKGBwaXBlLXJlYWRhYmxlYCkuXG4gICAgcmVzLmZsdXNoPy4oKTtcbiAgICBpZiAoIWFjY2VwdGVkICYmICEoYXdhaXQgZHJhaW5lZChyZXMpKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxuICByZXMuZW5kKCk7XG59XG4iXX0=
|