cdk-nextjs 0.7.6 → 0.7.8

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.
Files changed (65) hide show
  1. package/.jsii +3 -3
  2. package/.jsii.tabl.json +1 -1
  3. package/README.md +12 -3
  4. package/assets/lambdas/post-deploy/post-deploy.lambda/index.js +31 -13
  5. package/docs/adapter-runtime.md +1 -1
  6. package/docs/caching-guide.md +11 -1
  7. package/docs/harness-coverage.md +154 -73
  8. package/lib/adapter/adapter.mjs +12 -3
  9. package/lib/adapter/aws-cache-store.d.ts +221 -3
  10. package/lib/adapter/aws-cache-store.js +481 -35
  11. package/lib/adapter/aws-cache-store.test.js +706 -3
  12. package/lib/adapter/cache-handler.d.ts +5 -3
  13. package/lib/adapter/cache-handler.js +16 -10
  14. package/lib/adapter/cache-handler.mjs +517 -49
  15. package/lib/adapter/cache-handler.test.js +44 -1
  16. package/lib/adapter/cache-utils.d.ts +22 -0
  17. package/lib/adapter/cache-utils.js +44 -1
  18. package/lib/adapter/function-groups.js +17 -4
  19. package/lib/adapter/function-groups.test.js +33 -1
  20. package/lib/adapter/memory-cache-handler.d.ts +5 -1
  21. package/lib/adapter/memory-cache-handler.js +6 -2
  22. package/lib/adapter/s3-cache-handler.d.ts +12 -1
  23. package/lib/adapter/s3-cache-handler.js +30 -8
  24. package/lib/adapter/s3-cache-handler.test.js +84 -2
  25. package/lib/adapter/use-cache-common.d.ts +66 -1
  26. package/lib/adapter/use-cache-common.js +142 -19
  27. package/lib/adapter/use-cache-common.test.js +174 -1
  28. package/lib/adapter/use-cache-default-handler.js +36 -6
  29. package/lib/adapter/use-cache-default-handler.mjs +553 -47
  30. package/lib/adapter/use-cache-handlers.test.js +247 -7
  31. package/lib/adapter/use-cache-remote-handler.js +9 -7
  32. package/lib/adapter/use-cache-remote-handler.mjs +542 -45
  33. package/lib/lambdas/post-deploy/prune-revalidation-table.d.ts +2 -1
  34. package/lib/lambdas/post-deploy/prune-revalidation-table.js +35 -13
  35. package/lib/lambdas/post-deploy/prune-revalidation-table.test.js +19 -1
  36. package/lib/nextjs-api.js +1 -1
  37. package/lib/nextjs-build/nextjs-build.js +1 -1
  38. package/lib/nextjs-cache.js +1 -1
  39. package/lib/nextjs-compute/nextjs-containers.js +1 -1
  40. package/lib/nextjs-compute/nextjs-functions.js +1 -1
  41. package/lib/nextjs-distribution.js +1 -1
  42. package/lib/nextjs-post-deploy.js +1 -1
  43. package/lib/nextjs-static-assets.js +1 -1
  44. package/lib/root-constructs/nextjs-base-construct.js +1 -1
  45. package/lib/root-constructs/nextjs-global-containers.js +1 -1
  46. package/lib/root-constructs/nextjs-global-functions.js +1 -1
  47. package/lib/root-constructs/nextjs-regional-containers.js +1 -1
  48. package/lib/root-constructs/nextjs-regional-functions.js +1 -1
  49. package/lib/runtime/core.js +20 -4
  50. package/lib/runtime/core.test.js +17 -1
  51. package/lib/runtime/image-utils.d.ts +8 -9
  52. package/lib/runtime/image-utils.js +16 -1
  53. package/lib/runtime/image-utils.test.js +13 -1
  54. package/lib/runtime/image.js +9 -3
  55. package/lib/runtime/lambda.mjs +66 -18
  56. package/lib/runtime/server.mjs +66 -18
  57. package/lib/runtime/tag-manifest.d.ts +40 -0
  58. package/lib/runtime/tag-manifest.js +59 -0
  59. package/lib/runtime/tag-manifest.test.d.ts +1 -0
  60. package/lib/runtime/tag-manifest.test.js +47 -0
  61. package/package.json +3 -3
  62. package/scripts/e2e-deploy.sh +7 -2
  63. package/scripts/e2e-harness/README.md +72 -35
  64. package/scripts/e2e-harness/screen.mjs +148 -7
  65. package/scripts/playwright-install-deps.sh +40 -0
@@ -220,6 +220,49 @@ describe("CdkNextjsCacheHandler - Orchestrator Pattern", () => {
220
220
  });
221
221
  expect(s3.isRevalidated).toHaveBeenCalledWith({ lastModified: renderedAt, value }, getCtx, "isr/3");
222
222
  });
223
+ it("serves a memory hit with the lifetime it was rendered or stored with", async () => {
224
+ const value = {
225
+ kind: "APP_PAGE" /* CachedRouteKind.APP_PAGE */,
226
+ html: "<html>isr</html>",
227
+ rscData: undefined,
228
+ headers: undefined,
229
+ postponed: undefined,
230
+ segmentData: undefined,
231
+ status: undefined,
232
+ };
233
+ const getCtx = {
234
+ kind: "APP_PAGE" /* IncrementalCacheKind.APP_PAGE */,
235
+ isFallback: false,
236
+ };
237
+ const s3 = {
238
+ set: jest.fn().mockResolvedValue(undefined),
239
+ get: jest.fn().mockResolvedValue({
240
+ lastModified: Date.now(),
241
+ value,
242
+ cacheControl: { revalidate: 30, expire: undefined },
243
+ }),
244
+ isRevalidated: jest.fn().mockResolvedValue(false),
245
+ };
246
+ cacheHandler.s3DynamoHandler = s3;
247
+ // Rendered here: the lifetime `ResponseCache.set` passed.
248
+ await cacheHandler.set("isr/4", value, {
249
+ cacheControl: { revalidate: 60, expire: 300 },
250
+ isRoutePPREnabled: false,
251
+ isFallback: false,
252
+ });
253
+ expect((await cacheHandler.get("isr/4", getCtx))?.cacheControl).toEqual({
254
+ revalidate: 60,
255
+ expire: 300,
256
+ });
257
+ // Copied in from S3: the lifetime S3 stored.
258
+ await cacheHandler.get("isr/5", getCtx);
259
+ s3.get.mockClear();
260
+ expect((await cacheHandler.get("isr/5", getCtx))?.cacheControl).toEqual({
261
+ revalidate: 30,
262
+ expire: undefined,
263
+ });
264
+ expect(s3.get).not.toHaveBeenCalled();
265
+ });
223
266
  it("does not serve a memory hit another instance's revalidateTag expired", async () => {
224
267
  // `revalidateTag` clears only the memory of the instance that ran it. Any
225
268
  // other instance holding the page in memory answered from it for the
@@ -377,4 +420,4 @@ describe("CdkNextjsCacheHandler - Orchestrator Pattern", () => {
377
420
  });
378
421
  });
379
422
  });
380
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FjaGUtaGFuZGxlci50ZXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2FkYXB0ZXIvY2FjaGUtaGFuZGxlci50ZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsc0RBQXNEO0FBQ3RELDJCQUE2QztBQUM3QywyQkFBNEI7QUFDNUIsK0JBQTRCO0FBUTVCLG9FQUFvRDtBQUNwRCwrQ0FBZ0Q7QUFFaEQsdUJBQXVCO0FBQ3ZCLElBQUksQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsQ0FBQztBQUNoQyxJQUFJLENBQUMsSUFBSSxDQUFDLDBCQUEwQixDQUFDLENBQUM7QUFFdEMsUUFBUSxDQUFDLDhDQUE4QyxFQUFFLEdBQUcsRUFBRTtJQUM1RCxJQUFJLFlBQW1DLENBQUM7SUFFeEMsTUFBTSxpQkFBaUIsR0FBRyxHQUF3QixFQUFFLENBQUMsQ0FBQztRQUNwRCxHQUFHLEVBQUUsS0FBSztRQUNWLGVBQWUsRUFBRSxFQUFFO1FBQ25CLGVBQWUsRUFBRSxFQUFFO0tBQ3BCLENBQUMsQ0FBQztJQUVILFVBQVUsQ0FBQyxHQUFHLEVBQUU7UUFDZCx1REFBdUQ7UUFDdkQsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUFDLENBQUMsa0JBQWtCLENBQUMsR0FBRyxFQUFFLEdBQUUsQ0FBQyxDQUFDLENBQUM7UUFFekQsTUFBTSxXQUFXLEdBQUcsaUJBQWlCLEVBQUUsQ0FBQztRQUN4QyxZQUFZLEdBQUcsSUFBSSx1QkFBcUIsQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUN4RCxDQUFDLENBQUMsQ0FBQztJQUVILFNBQVMsQ0FBQyxHQUFHLEVBQUU7UUFDYixJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDckIsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQ3ZCLG9CQUFvQjtRQUNwQixPQUFPLE9BQU8sQ0FBQyxHQUFHLENBQUMsOEJBQThCLENBQUM7UUFDbEQsc0VBQXNFO1FBQ3RFLDZD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RSxDQUFDLENBQUMsR0FBRyxDQUN0RCxHQUFHLEVBQ0gsSUFBSSxFQUNKLE1BQU0sQ0FDUCxDQUFDO2dCQUNGLE1BQU0sQ0FBQyxJQUFBLGVBQVUsRUFBQyxJQUFBLFdBQUksRUFBQyxRQUFRLEVBQUUsSUFBQSw2QkFBZSxFQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDcEUsTUFBTSxNQUFNLEdBQW9DO29CQUM5QyxJQUFJLDBDQUE0QjtvQkFDaEMsVUFBVSxFQUFFLEVBQUU7b0JBQ2QsSUFBSSxFQUFFLEVBQUU7aUJBQ1QsQ0FBQztnQkFDRixNQUFNLENBQ0osTUFBTSxJQUFJLHVCQUFxQixDQUFDLGlCQUFpQixFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLE1BQU0sQ0FBQyxDQUN0RSxDQUFDLGFBQWEsQ0FBQyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1lBQ25DLENBQUM7b0JBQVMsQ0FBQztnQkFDVCxPQUFPLE9BQU8sQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDO2dCQUM5QixPQUFPLE9BQU8sQ0FBQyxHQUFHLENBQUMseUJBQXlCLENBQUM7WUFDL0MsQ0FBQztRQUNILENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIGltcG9ydC9uby1leHRyYW5lb3VzLWRlcGVuZGVuY2llcyAqL1xuaW1wb3J0IHsgZXhpc3RzU3luYywgbWtkdGVtcFN5bmMgfSBmcm9tIFwiZnNcIjtcbmltcG9ydCB7IHRtcGRpciB9IGZyb20gXCJvc1wiO1xuaW1wb3J0IHsgam9pbiB9IGZyb20gXCJwYXRoXCI7XG5pbXBvcnQgeyBDYWNoZUhhbmRsZXJDb250ZXh0IH0gZnJvbSBcIm5leHQvZGlzdC9zZXJ2ZXIvbGliL2luY3JlbWVudGFsLWNhY2hlXCI7XG5pbXBvcnQge1xuICBJbmNyZW1lbnRhbENhY2hlVmFsdWUsXG4gIENhY2hlZFJvdXRlS2luZCxcbiAgSW5jcmVtZW50YWxDYWNoZUtpbmQsXG59IGZyb20gXCJuZXh0L2Rpc3Qvc2VydmVyL3Jlc3BvbnNlLWNhY2hlXCI7XG5pbXBvcnQgdHlwZSB7IEdldEluY3JlbWVudGFsRmV0Y2hDYWNoZUNvbnRleHQgfSBmcm9tIFwibmV4dC9kaXN0L3NlcnZlci9yZXNwb25zZS1jYWNoZVwiO1xuaW1wb3J0IENka05leHRqc0NhY2hlSGFuZGxlciBmcm9tIFwiLi9jYWNoZS1oYW5kbGVyXCI7XG5pbXBvcnQgeyBjYWNoZU9iamVjdE5hbWUgfSBmcm9tIFwiLi9jYWNoZS11dGlsc1wiO1xuXG4vLyBNb2NrIEFXUyBTREsgY2xpZW50c1xuamVzdC5tb2NrKFwiQGF3cy1zZGsvY2xpZW50LXMzXCIpO1xuamVzdC5tb2NrKFwiQGF3cy1zZGsvY2xpZW50LWR5bmFtb2RiXCIpO1xuXG5kZXNjcmliZShcIkNka05leHRqc0NhY2hlSGFuZGxlciAtIE9yY2hlc3RyYXRvciBQYXR0ZXJuXCIsICgpID0+IHtcbiAgbGV0IGNhY2hlSGFuZGxlcjogQ2RrTmV4dGpzQ2FjaGVIYW5kbGVyO1xuXG4gIGNvbnN0IGNyZWF0ZU1vY2tDb250ZXh0ID0gKCk6IENhY2hlSGFuZGxlckNvbnRleHQgPT4gKHtcbiAgICBkZXY6IGZhbHNlLFxuICAgIHJldmFsaWRhdGVkVGFnczogW10sXG4gICAgX3JlcXVlc3RIZWFkZXJzOiB7fSxcbiAgfSk7XG5cbiAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgLy8gU3VwcHJlc3MgZXhwZWN0ZWQgd2FybmluZ3Mgd2hlbiBlbnYgdmFycyBhcmUgbm90IHNldFxuICAgIGplc3Quc3B5T24oY29uc29sZSwgXCJ3YXJuXCIpLm1vY2tJbXBsZW1lbnRhdGlvbigoKSA9PiB7fSk7XG5cbiAgICBjb25zdCBtb2NrQ29udGV4dCA9IGNyZWF0ZU1vY2tDb250ZXh0KCk7XG4gICAgY2FjaGVIYW5kbGVyID0gbmV3IENka05leHRqc0NhY2hlSGFuZGxlcihtb2NrQ29udGV4dCk7XG4gIH0pO1xuXG4gIGFmdGVyRWFjaCgoKSA9PiB7XG4gICAgamVzdC5jbGVhckFsbE1vY2tzKCk7XG4gICAgamVzdC5yZXN0b3JlQWxsTW9ja3MoKTtcbiAgICAvLyBDbGVhbiB1cCBlbnYgdmFyc1xuICAgIGRlbGV0ZSBwcm9jZXNzLmVudi5DREtfTkVYVEpTX01FTU9SWV9DQUNIRV9UVExfTVM7XG4gICAgLy8gUmVzZXQgc2luZ2xldG9uIGhhbmRsZXJzIGJ5IGFjY2Vzc2luZyB0aGUgY2xhc3MncyBzdGF0aWMgcHJvcGVydGllc1xuICAgIC8vIFRoaXMgZW5zdXJlcyBlYWNoIHRlc3QgZ2V0cyBmcmVzaCBoYW5kbGVyc1xuICAgIChDZGtOZXh0anNDYWNoZUhhbmRsZXIgYXMgYW55KS5zaGFyZWRNZW1vcnlIYW5kbGVyID0gbnVsbDtcbiAgICAoQ2RrTmV4dGpzQ2FjaGVIYW5kbGVyIGFzIGFueSkuc2hhcmVkUzNEeW5hbW9IYW5kbGVyID0gbnVsbDtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoXCJPcmNoZXN0cmF0b3I6IE1lbW9yeSArIFMzL0R5bmFtb0RCXCIsICgpID0+IHtcbiAgICBpdChcInNob3VsZCB3cml0ZSB0byBib3RoIG1lbW9yeSBhbmQgUzMvRHluYW1vREIgb24gc2V0XCIsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHRlc3REYXRhOiBJbmNyZW1lbnRhbENhY2hlVmFsdWUgPSB7XG4gICAgICAgIGtpbmQ6IENhY2hlZFJvdXRlS2luZC5BUFBfUEFHRSxcbiAgICAgICAgaHRtbDogXCI8aHRtbD50ZXN0PC9odG1sPlwiLFxuICAgICAgICByc2NEYXRhOiB1bmRlZmluZWQsXG4gICAgICAgIGhlYWRlcnM6IHVuZGVmaW5lZCxcbiAgICAgICAgcG9zdHBvbmVkOiB1bmRlZmluZWQsXG4gICAgICAgIHNlZ21lbnREYXRhOiB1bmRlZmluZWQsXG4gICAgICAgIHN0YXR1czogdW5kZWZpbmVkLFxuICAgICAgfTtcblxuICAgICAgY29uc3QgczMgPSB7XG4gICAgICAgIHNldDogamVzdC5mbigpLm1vY2tSZXNvbHZlZFZhbHVlKHVuZGVmaW5lZCksXG4gICAgICAgIGdldDogamVzdC5mbigpLm1vY2tSZXNvbHZlZFZhbHVlKG51bGwpLFxuICAgICAgICBpc1JldmFsaWRhdGVkOiBqZXN0LmZuKCkubW9ja1Jlc29sdmVkVmFsdWUoZmFsc2UpLFxuICAgICAgfTtcbiAgICAgIChjYWNoZUhhbmRsZXIgYXMgYW55KS5zM0R5bmFtb0hhbmRsZXIgPSBzMztcbiAgICAgIGNvbnN0IHNldEN0eCA9IHsgZmV0Y2hDYWNoZTogdHJ1ZSBhcyBjb25zdCwgdGFnczogW10gfTtcblxuICAgICAgLy8gU2V0IGNhY2hlIGVudHJ5XG4gICAgICBhd2FpdCBjYWNoZUhhbmRsZXIuc2V0KFwidGVzdC1rZXlcIiwgdGVzdERhdGEsIHNldEN0eCk7XG5cbiAgICAgIC8vIFMzL0R5bmFtb0RCIGdvdCB0aGUgd3JpdGUsIHdpdGggdGhlIGNvbnRleHQgaXQgbmVlZHMgZm9yIHRhZ3MuXG4gICAgICBleHBlY3QoczMuc2V0KS50b0hhdmVCZWVuQ2FsbGVkV2l0aChcInRlc3Qta2V5XCIsIHRlc3REYXRhLCBzZXRDdHgpO1xuXG4gICAgICAvLyBHZXQgc2hvdWxkIHJldHVybiBmcm9tIG1lbW9yeSwgd2l0aG91dCBhc2tpbmcgUzMuXG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBjYWNoZUhhbmRsZXIuZ2V0KFwidGVzdC1rZXlcIiwge1xuICAgICAgICBraW5kOiBJbmNyZW1lbnRhbENhY2hlS2luZC5BUFBfUEFHRSxcbiAgICAgICAgaXNGYWxsYmFjazogZmFsc2UsXG4gICAgICB9KTtcblxuICAgICAgZXhwZWN0KHJlc3VsdCkubm90LnRvQmVOdWxsKCk7XG4gICAgICBleHBlY3QocmVzdWx0Py52YWx1ZSkudG9FcXVhbCh0ZXN0RGF0YSk7XG4gICAgICBleHBlY3QoczMuZ2V0KS5ub3QudG9IYXZlQmVlbkNhbGxlZCgpO1xuICAgIH0pO1xuXG4gICAgaXQoXCJkZWxldGVzIGZyb20gYm90aCBsYXllcnMgb24gc2V0KGtleSwgbnVsbClcIiwgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdGVzdERhdGE6IEluY3JlbWVudGFsQ2FjaGVWYWx1ZSA9IHtcbiAgICAgICAga2luZDogQ2FjaGVkUm91dGVLaW5kLkFQUF9QQUdFLFxuICAgICAgICBodG1sOiBcIjxodG1sPmdvbmU8L2h0bWw+XCIsXG4gICAgICAgIHJzY0RhdGE6IHVuZGVmaW5lZCxcbiAgICAgICAgaGVhZGVyczogdW5kZWZpbmVkLFxuICAgICAgICBwb3N0cG9uZWQ6IHVuZGVmaW5lZCxcbiAgICAgICAgc2VnbWVudERhdGE6IHVuZGVmaW5lZCxcbiAgICAgICAgc3RhdHVzOiB1bmRlZmluZWQsXG4gICAgICB9O1xuICAgICAgY29uc3QgczMgPSB7XG4gICAgICAgIHNldDogamVzdC5mbigpLm1vY2tSZXNvbHZlZFZhbHVlKHVuZGVmaW5lZCksXG4gICAgICAgIGdldDogamVzdC5mbigpLm1vY2tSZXNvbHZlZFZhbHVlKG51bGwpLFxuICAgICAgICBpc1JldmFsaWRhdGVkOiBqZXN0LmZuKCkubW9ja1Jlc29sdmVkVmFsdWUoZmFsc2UpLFxuICAgICAgfTtcbiAgICAgIChjYWNoZUhhbmRsZXIgYXMgYW55KS5zM0R5bmFtb0hhbmRsZXIgPSBzMztcbiAgICAgIGNvbnN0IHNldEN0eCA9IHsgZmV0Y2hDYWNoZTogdHJ1ZSBhcyBjb25zdCwgdGFnczogW10gfTtcbiAgICAgIGF3YWl0IGNhY2hlSGFuZGxlci5zZXQoXCJnb25lLWtleVwiLCB0ZXN0RGF0YSwgc2V0Q3R4KTtcblxuICAgICAgYXdhaXQgY2FjaGVIYW5kbGVyLnNldChcImdvbmUta2V5XCIsIG51bGwsIHNldEN0eCk7XG5cbiAgICAgIC8vIFRoZSBTMyBsYXllciBpcyB0b2xkIHRvIGRlbGV0ZSwgbm90IHNraXBwZWQuXG4gICAgICBleHBlY3QoczMuc2V0KS50b0hhdmVCZWVuTGFzdENhbGxlZFdpdGgoXCJnb25lLWtleVwiLCBudWxsLCBzZXRDdHgpO1xuICAgICAgLy8gQW5kIG1lbW9yeSBubyBsb25nZXIgYW5zd2VyczogdGhlIHJlYWQgZmFsbHMgdGhyb3VnaCB0byBTMy5cbiAgICAgIGV4cGVjdChcbiAgICAgICAgYXdhaXQgY2FjaGVIYW5kbGVyLmdldChcImdvbmUta2V5XCIsIHtcbiAgICAgICAgICBraW5kOiBJbmNyZW1lbnRhbENhY2hlS2luZC5BUFBfUEFHRSxcbiAgICAgICAgICBpc0ZhbGxiYWNrOiBmYWxzZSxcbiAgICAgICAgfSksXG4gICAgICApLnRvQmVOdWxsKCk7XG4gICAgICBleHBlY3QoczMuZ2V0KS50b0hhdmVCZWVuQ2FsbGVkVGltZXMoMSk7XG4gICAgfSk7XG5cbiAgICBpdChcInJldmFsaWRhdGVzIGEgdGFnIGluIFMzL0R5bmFtb0RCLCBwYXNzaW5nIHRoZSBkdXJhdGlvbnMgdGhyb3VnaFwiLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB0ZXN0RGF0YTogSW5jcmVtZW50YWxDYWNoZVZhbHVlID0ge1xuICAgICAgICBraW5kOiBDYWNoZWRSb3V0ZUtpbmQuQVBQX1BBR0UsXG4gICAgICAgIGh0bWw6IFwiPGh0bWw+dGFnZ2VkPC9odG1sPlwiLFxuICAgICAgICByc2NEYXRhOiB1bmRlZmluZWQsXG4gICAgICAgIGhlYWRlcnM6IHsgXCJ4LW5leHQtY2FjaGUtdGFnc1wiOiBcInBvc3RzXCIgfSxcbiAgICAgICAgcG9zdHBvbmVkOiB1bmRlZmluZWQsXG4gICAgICAgIHNlZ21lbnREYXRhOiB1bmRlZmluZWQsXG4gICAgICAgIHN0YXR1czogdW5kZWZpbmVkLFxuICAgICAgfTtcbiAgICAgIGNvbnN0IHMzID0ge1xuICAgICAgICBzZXQ6IGplc3QuZm4oKS5tb2NrUmVzb2x2ZWRWYWx1ZSh1bmRlZmluZWQpLFxuICAgICAgICBnZXQ6IGplc3QuZm4oKS5tb2NrUmVzb2x2ZWRWYWx1ZShudWxsKSxcbiAgICAgICAgaXNSZXZhbGlkYXRlZDogamVzdC5mbigpLm1vY2tSZXNvbHZlZFZhbHVlKGZhbHNlKSxcbiAgICAgICAgcmV2YWxpZGF0ZVRhZzogamVzdC5mbigpLm1vY2tSZXNvbHZlZFZhbHVlKHVuZGVmaW5lZCksXG4gICAgICB9O1xuICAgICAgKGNhY2hlSGFuZGxlciBhcyBhbnkpLnMzRHluYW1vSGFuZGxlciA9IHMzO1xuXG4gICAgICBhd2FpdCBjYWNoZUhhbmRsZXIuc2V0KFwidGFnZ2VkLWtleVwiLCB0ZXN0RGF0YSwge1xuICAgICAgICBmZXRjaENhY2hlOiB0cnVlIGFzIGNvbnN0LFxuICAgICAgICB0YWdzOiBbXCJwb3N0c1wiXSxcbiAgICAgIH0pO1xuICAgICAgLy8gYHJldmFsaWRhdGVUYWcodGFnLCBwcm9maWxlKWA6IHRoZSBkdXJhdGlvbnMgZGVjaWRlIHN0YWxlIHZzIGV4cGlyZWQsXG4gICAgICAvLyBzbyBkcm9wcGluZyB0aGVtIHR1cm5zIGV2ZXJ5IHNvZnQgcmV2YWxpZGF0aW9uIGludG8gYSBoYXJkIG9uZS5cbiAgICAgIGF3YWl0IGNhY2hlSGFuZGxlci5yZXZhbGlkYXRlVGFnKFtcInBvc3RzXCJdLCB7IGV4cGlyZTogNjAgfSk7XG5cbiAgICAgIGV4cGVjdChzMy5yZXZhbGlkYXRlVGFnKS50b0hhdmVCZWVuQ2FsbGVkV2l0aChbXCJwb3N0c1wiXSwgeyBleHBpcmU6IDYwIH0pO1xuXG4gICAgICBhd2FpdCBjYWNoZUhhbmRsZXIucmV2YWxpZGF0ZVRhZyhcInBvc3RzXCIpO1xuICAgICAgZXhwZWN0KHMzLnJldmFsaWRhdGVUYWcpLnRvSGF2ZUJlZW5MYXN0Q2FsbGVkV2l0aChcInBvc3RzXCIsIHVuZGVmaW5lZCk7XG4gICAgfSk7XG5cbiAgICBpdChcInNob3VsZCBoYW5kbGUgY2FjaGUgbWlzc2VzIGdyYWNlZnVsbHlcIiwgYXN5bmMgKCkgPT4ge1xuICAgICAgLy8gR2V0IG5vbi1leGlzdGVudCBrZXlcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGNhY2hlSGFuZGxlci5nZXQoXCJtaXNzaW5nLWtleVwiLCB7XG4gICAgICAgIGtpbmQ6IEluY3JlbWVudGFsQ2FjaGVLaW5kLkFQUF9QQUdFLFxuICAgICAgICBpc0ZhbGxiYWNrOiBmYWxzZSxcbiAgICAgIH0pO1xuXG4gICAgICAvLyBTaG91bGQgcmV0dXJuIG51bGwgKGJvdGggbWVtb3J5IGFuZCBTMyBtaXNzKVxuICAgICAgZXhwZWN0KHJlc3VsdCkudG9CZU51bGwoKTtcbiAgICB9KTtcblxuICAgIGl0KFwiZG9lcyBub3QgY29weSBhIHRhZy1leHBpcmVkIFMzIGVudHJ5IGludG8gbWVtb3J5XCIsIGFzeW5jICgpID0+IHtcbiAgICAgIC8vIGBsYXN0TW9kaWZpZWQ6IC0xYCBpcyB0aGUgUzMgbGF5ZXIgc2F5aW5nIFwiYSB0YWcgcmV2YWxpZGF0aW9uIGV4cGlyZWRcbiAgICAgIC8vIHRoaXMsIHJlLXJlbmRlciBiZWZvcmUgYW5zd2VyaW5nXCIuIENvcGllZCBpbnRvIG1lbW9yeSwgdGhlIGV4cGlyZWQgYm9keVxuICAgICAgLy8gd291bGQgYmUgYW5zd2VyZWQgZnJvbSB0aGVyZSBpbnN0ZWFkIG9mIGZyb20gdGhlIHJlLXJlbmRlci5cbiAgICAgIGNvbnN0IHZhbHVlOiBJbmNyZW1lbnRhbENhY2hlVmFsdWUgPSB7XG4gICAgICAgIGtpbmQ6IENhY2hlZFJvdXRlS2luZC5BUFBfUEFHRSxcbiAgICAgICAgaHRtbDogXCI8aHRtbD5leHBpcmVkPC9odG1sPlwiLFxuICAgICAgICByc2NEYXRhOiB1bmRlZmluZWQsXG4gICAgICAgIGhlYWRlcnM6IHVuZGVmaW5lZCxcbiAgICAgICAgcG9zdHBvbmVkOiB1bmRlZmluZWQsXG4gICAgICAgIHNlZ21lbnREYXRhOiB1bmRlZmluZWQsXG4gICAgICAgIHN0YXR1czogdW5kZWZpbmVkLFxuICAgICAgfTtcbiAgICAgIGNvbnN0IGdldEN0eCA9IHtcbiAgICAgICAga2luZDogSW5jcmVtZW50YWxDYWNoZUtpbmQuQVBQX1BBR0UsXG4gICAgICAgIGlzRmFsbGJhY2s6IGZhbHNlLFxuICAgICAgfSBhcyBjb25zdDtcblxuICAgICAgKGNhY2hlSGFuZGxlciBhcyBhbnkpLnMzRHluYW1vSGFuZGxlciA9IHtcbiAgICAgICAgZ2V0OiBqZXN0LmZuKCkubW9ja1Jlc29sdmVkVmFsdWUoeyBsYXN0TW9kaWZpZWQ6IC0xLCB2YWx1ZSB9KSxcbiAgICAgIH07XG4gICAgICBleHBlY3QoYXdhaXQgY2FjaGVIYW5kbGVyLmdldChcImlzci8xXCIsIGdldEN0eCkpLnRvRXF1YWwoe1xuICAgICAgICBsYXN0TW9kaWZpZWQ6IC0xLFxuICAgICAgICB2YWx1ZSxcbiAgICAgIH0pO1xuXG4gICAgICAvLyBXaXRoIHRoZSBTMyBsYXllciBub3cgc2lsZW50LCBhIG1lbW9yeSBjb3B5IHdvdWxkIGFuc3dlciB0aGlzIGFzIGEgaGl0LlxuICAgICAgKGNhY2hlSGFuZGxlciBhcyBhbnkpLnMzRHluYW1vSGFuZGxlciA9IHtcbiAgICAgICAgZ2V0OiBqZXN0LmZuKCkubW9ja1Jlc29sdmVkVmFsdWUobnVsbCksXG4gICAgICB9O1xuICAgICAgZXhwZWN0KGF3YWl0IGNhY2hlSGFuZGxlci5nZXQoXCJpc3IvMVwiLCBnZXRDdHgpKS50b0JlTnVsbCgpO1xuICAgIH0pO1xuXG4gICAgaXQoXCJjb3BpZXMgYSBsaXZlIFMzIGVudHJ5IGludG8gbWVtb3J5XCIsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHZhbHVlOiBJbmNyZW1lbnRhbENhY2hlVmFsdWUgPSB7XG4gICAgICAgIGtpbmQ6IENhY2hlZFJvdXRlS2luZC5BUFBfUEFHRSxcbiAgICAgICAgaHRtbDogXCI8aHRtbD5saXZlPC9odG1sPlwiLFxuICAgICAgICByc2NEYXRhOiB1bmRlZmluZWQsXG4gICAgICAgIGhlYWRlcnM6IHVuZGVmaW5lZCxcbiAgICAgICAgcG9zdHBvbmVkOiB1bmRlZmluZWQsXG4gICAgICAgIHNlZ21lbnREYXRhOiB1bmRlZmluZWQsXG4gICAgICAgIHN0YXR1czogdW5kZWZpbmVkLFxuICAgICAgfTtcbiAgICAgIGNvbnN0IGdldEN0eCA9IHtcbiAgICAgICAga2luZDogSW5jcmVtZW50YWxDYWNoZUtpbmQuQVBQX1BBR0UsXG4gICAgICAgIGlzRmFsbGJhY2s6IGZhbHNlLFxuICAgICAgfSBhcyBjb25zdDtcblxuICAgICAgKGNhY2hlSGFuZGxlciBhcyBhbnkpLnMzRHluYW1vSGFuZGxlciA9IHtcbiAgICAgICAgZ2V0OiBqZXN0LmZuKCkubW9ja1Jlc29sdmVkVmFsdWUoeyBsYXN0TW9kaWZpZWQ6IERhdGUubm93KCksIHZhbHVlIH0pLFxuICAgICAgfTtcbiAgICAgIGF3YWl0IGNhY2hlSGFuZGxlci5nZXQoXCJpc3IvMlwiLCBnZXRDdHgpO1xuXG4gICAgICBjb25zdCBzMyA9IHtcbiAgICAgICAgZ2V0OiBqZXN0LmZuKCkubW9ja1Jlc29sdmVkVmFsdWUobnVsbCksXG4gICAgICAgIGlzUmV2YWxpZGF0ZWQ6IGplc3QuZm4oKS5tb2NrUmVzb2x2ZWRWYWx1ZShmYWxzZSksXG4gICAgICB9O1xuICAgICAgKGNhY2hlSGFuZGxlciBhcyBhbnkpLnMzRHluYW1vSGFuZGxlciA9IHMzO1xuICAgICAgZXhwZWN0KGF3YWl0IGNhY2hlSGFuZGxlci5nZXQoXCJpc3IvMlwiLCBnZXRDdHgpKS50b01hdGNoT2JqZWN0KHsgdmFsdWUgfSk7XG4gICAgICBleHBlY3QoczMuZ2V0KS5ub3QudG9IYXZlQmVlbkNhbGxlZCgpO1xuICAgIH0pO1xuXG4gICAgaXQoXCJrZWVwcyB0aGUgUzMgZW50cnkncyBsYXN0TW9kaWZpZWQgd2hlbiBjb3B5aW5nIGl0IGludG8gbWVtb3J5XCIsIGFzeW5jICgpID0+IHtcbiAgICAgIC8vIE5leHQuanMgYWdlcyB0aGUgZW50cnkgZnJvbSBgbGFzdE1vZGlmaWVkYCwgYW5kIHRoZSB0YWcgbWFya2VycyBhcmVcbiAgICAgIC8vIGNvbXBhcmVkIGFnYWluc3QgaXQuIFN0YW1waW5nIHRoZSB0aW1lIG9mIHRoZSBjb3B5IG1hZGUgYSBwYWdlIGEgc29mdFxuICAgICAgLy8gYHJldmFsaWRhdGVUYWdgIGhhZCBtYWRlIHN0YWxlIGxvb2sgbmV3ZXIgdGhhbiB0aGUgc3RhbGUgbWFyay5cbiAgICAgIGNvbnN0IHZhbHVlOiBJbmNyZW1lbnRhbENhY2hlVmFsdWUgPSB7XG4gICAgICAgIGtpbmQ6IENhY2hlZFJvdXRlS2luZC5BUFBfUEFHRSxcbiAgICAgICAgaHRtbDogXCI8aHRtbD5vbGQ8L2h0bWw+XCIsXG4gICAgICAgIHJzY0RhdGE6IHVuZGVmaW5lZCxcbiAgICAgICAgaGVhZGVyczogdW5kZWZpbmVkLFxuICAgICAgICBwb3N0cG9uZWQ6IHVuZGVmaW5lZCxcbiAgICAgICAgc2VnbWVudERhdGE6IHVuZGVmaW5lZCxcbiAgICAgICAgc3RhdHVzOiB1bmRlZmluZWQsXG4gICAgICB9O1xuICAgICAgY29uc3QgZ2V0Q3R4ID0ge1xuICAgICAgICBraW5kOiBJbmNyZW1lbnRhbENhY2hlS2luZC5BUFBfUEFHRSxcbiAgICAgICAgaXNGYWxsYmFjazogZmFsc2UsXG4gICAgICB9IGFzIGNvbnN0O1xuICAgICAgY29uc3QgcmVuZGVyZWRBdCA9IERhdGUubm93KCkgLSA2MF8wMDA7XG5cbiAgICAgIChjYWNoZUhhbmRsZXIgYXMgYW55KS5zM0R5bmFtb0hhbmRsZXIgPSB7XG4gICAgICAgIGdldDogamVzdC5mbigpLm1vY2tSZXNvbHZlZFZhbHVlKHsgbGFzdE1vZGlmaWVkOiByZW5kZXJlZEF0LCB2YWx1ZSB9KSxcbiAgICAgIH07XG4gICAgICBhd2FpdCBjYWNoZUhhbmRsZXIuZ2V0KFwiaXNyLzNcIiwgZ2V0Q3R4KTtcblxuICAgICAgY29uc3QgczMgPSB7XG4gICAgICAgIGdldDogamVzdC5mbigpLm1vY2tSZXNvbHZlZFZhbHVlKG51bGwpLFxuICAgICAgICBpc1JldmFsaWRhdGVkOiBqZXN0LmZuKCkubW9ja1Jlc29sdmVkVmFsdWUoZmFsc2UpLFxuICAgICAgfTtcbiAgICAgIChjYWNoZUhhbmRsZXIgYXMgYW55KS5zM0R5bmFtb0hhbmRsZXIgPSBzMztcbiAgICAgIGV4cGVjdChhd2FpdCBjYWNoZUhhbmRsZXIuZ2V0KFwiaXNyLzNcIiwgZ2V0Q3R4KSkudG9FcXVhbCh7XG4gICAgICAgIGxhc3RNb2RpZmllZDogcmVuZGVyZWRBdCxcbiAgICAgICAgdmFsdWUsXG4gICAgICB9KTtcbiAgICAgIGV4cGVjdChzMy5pc1JldmFsaWRhdGVkKS50b0hhdmVCZWVuQ2FsbGVkV2l0aChcbiAgICAgICAgeyBsYXN0TW9kaWZpZWQ6IHJlbmRlcmVkQXQsIHZhbHVlIH0sXG4gICAgICAgIGdldEN0eCxcbiAgICAgICAgXCJpc3IvM1wiLFxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGl0KFwiZG9lcyBub3Qgc2VydmUgYSBtZW1vcnkgaGl0IGFub3RoZXIgaW5zdGFuY2UncyByZXZhbGlkYXRlVGFnIGV4cGlyZWRcIiwgYXN5bmMgKCkgPT4ge1xuICAgICAgLy8gYHJldmFsaWRhdGVUYWdgIGNsZWFycyBvbmx5IHRoZSBtZW1vcnkgb2YgdGhlIGluc3RhbmNlIHRoYXQgcmFuIGl0LiBBbnlcbiAgICAgIC8vIG90aGVyIGluc3RhbmNlIGhvbGRpbmcgdGhlIHBhZ2UgaW4gbWVtb3J5IGFuc3dlcmVkIGZyb20gaXQgZm9yIHRoZVxuICAgICAgLy8gd2hvbGUgbWVtb3J5IFRUTCwgYW5kIENsb3VkRnJvbnQgLSBqdXN0IGludmFsaWRhdGVkIC0gY2FjaGVkIHRoZSBzdGFsZVxuICAgICAgLy8gcGFnZSBhZ2Fpbi4gU28gYSBtZW1vcnkgaGl0IGlzIGNoZWNrZWQgYWdhaW5zdCB0aGUgdGFnIG1hcmtlcnMgdG9vLlxuICAgICAgY29uc3QgdmFsdWU6IEluY3JlbWVudGFsQ2FjaGVWYWx1ZSA9IHtcbiAgICAgICAga2luZDogQ2FjaGVkUm91dGVLaW5kLkFQUF9QQUdFLFxuICAgICAgICBodG1sOiBcIjxodG1sPnN0YWxlPC9odG1sPlwiLFxuICAgICAgICByc2NEYXRhOiB1bmRlZmluZWQsXG4gICAgICAgIGhlYWRlcnM6IHsgXCJ4LW5leHQtY2FjaGUtdGFnc1wiOiBcIl9OX1RfL2Jsb2dcIiB9LFxuICAgICAgICBwb3N0cG9uZWQ6IHVuZGVmaW5lZCxcbiAgICAgICAgc2VnbWVudERhdGE6IHVuZGVmaW5lZCxcbiAgICAgICAgc3RhdHVzOiB1bmRlZmluZWQsXG4gICAgICB9O1xuICAgICAgY29uc3QgZ2V0Q3R4ID0ge1xuICAgICAgICBraW5kOiBJbmNyZW1lbnRhbENhY2hlS2luZC5BUFBfUEFHRSxcbiAgICAgICAgaXNGYWxsYmFjazogZmFsc2UsXG4gICAgICB9IGFzIGNvbnN0O1xuXG4gICAgICAoY2FjaGVIYW5kbGVyIGFzIGFueSkuczNEeW5hbW9IYW5kbGVyID0ge1xuICAgICAgICBnZXQ6IGplc3QuZm4oKS5tb2NrUmVzb2x2ZWRWYWx1ZSh7IGxhc3RNb2RpZmllZDogRGF0ZS5ub3coKSwgdmFsdWUgfSksXG4gICAgICB9O1xuICAgICAgYXdhaXQgY2FjaGVIYW5kbGVyLmdldChcImJsb2dcIiwgZ2V0Q3R4KTtcblxuICAgICAgLy8gQW5vdGhlciBpbnN0YW5jZSByZXZhbGlkYXRlZCBgX05fVF8vYmxvZ2A6IHRoZSBtYXJrZXIgaXMgbmV3ZXIgdGhhbiB0aGVcbiAgICAgIC8vIG1lbW9yeSBjb3B5LCBhbmQgUzMgbm93IGFuc3dlcnMgd2l0aCB0aGUgZW50cnkgZXhwaXJlZC5cbiAgICAgIGNvbnN0IHMzID0ge1xuICAgICAgICBnZXQ6IGplc3QuZm4oKS5tb2NrUmVzb2x2ZWRWYWx1ZSh7IGxhc3RNb2RpZmllZDogLTEsIHZhbHVlIH0pLFxuICAgICAgICBpc1JldmFsaWRhdGVkOiBqZXN0LmZuKCkubW9ja1Jlc29sdmVkVmFsdWUodHJ1ZSksXG4gICAgICB9O1xuICAgICAgKGNhY2hlSGFuZGxlciBhcyBhbnkpLnMzRHluYW1vSGFuZGxlciA9IHMzO1xuICAgICAgZXhwZWN0KGF3YWl0IGNhY2hlSGFuZGxlci5nZXQoXCJibG9nXCIsIGdldEN0eCkpLnRvRXF1YWwoe1xuICAgICAgICBsYXN0TW9kaWZpZWQ6IC0xLFxuICAgICAgICB2YWx1ZSxcbiAgICAgIH0pO1xuICAgICAgZXhwZWN0KHMzLmlzUmV2YWxpZGF0ZWQpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKFxuICAgICAgICBleHBlY3Qub2JqZWN0Q29udGFpbmluZyh7IHZhbHVlIH0pLFxuICAgICAgICBnZXRDdHgsXG4gICAgICAgIFwiYmxvZ1wiLFxuICAgICAgKTtcbiAgICAgIGV4cGVjdChzMy5nZXQpLnRvSGF2ZUJlZW5DYWxsZWRUaW1lcygxKTtcblxuICAgICAgLy8gQW5kIHRoZSBtZW1vcnkgY29weSBpcyBnb25lIHJhdGhlciB0aGFuIGNoZWNrZWQgYWdhaW4gbmV4dCB0aW1lLlxuICAgICAgczMuZ2V0Lm1vY2tSZXNvbHZlZFZhbHVlKG51bGwpO1xuICAgICAgZXhwZWN0KGF3YWl0IGNhY2hlSGFuZGxlci5nZXQoXCJibG9nXCIsIGdldEN0eCkpLnRvQmVOdWxsKCk7XG4gICAgfSk7XG5cbiAgICBpdChcImtlZXBzIG1lbW9yeSBlbnRyaWVzIGFjcm9zcyByZXNldFJlcXVlc3RDYWNoZVwiLCBhc3luYyAoKSA9PiB7XG4gICAgICAvLyBOZXh0LmpzIGNhbGxzIGl0IGF0IHRoZSBzdGFydCBvZiBldmVyeSByZXF1ZXN0OyBjbGVhcmluZyB0aGUgc2hhcmVkXG4gICAgICAvLyBtZW1vcnkgY2FjaGUgdGhlcmUgc2VudCBldmVyeSByZWFkIHRvIFMzLlxuICAgICAgY29uc3QgdGVzdERhdGE6IEluY3JlbWVudGFsQ2FjaGVWYWx1ZSA9IHtcbiAgICAgICAga2luZDogQ2FjaGVkUm91dGVLaW5kLkFQUF9QQUdFLFxuICAgICAgICBodG1sOiBcIjxodG1sPnJlc2V0PC9odG1sPlwiLFxuICAgICAgICByc2NEYXRhOiB1bmRlZmluZWQsXG4gICAgICAgIGhlYWRlcnM6IHVuZGVmaW5lZCxcbiAgICAgICAgcG9zdHBvbmVkOiB1bmRlZmluZWQsXG4gICAgICAgIHNlZ21lbnREYXRhOiB1bmRlZmluZWQsXG4gICAgICAgIHN0YXR1czogdW5kZWZpbmVkLFxuICAgICAgfTtcblxuICAgICAgLy8gQWRkIGVudHJ5XG4gICAgICBhd2FpdCBjYWNoZUhhbmRsZXIuc2V0KFwicmVzZXQta2V5XCIsIHRlc3REYXRhLCB7XG4gICAgICAgIGZldGNoQ2FjaGU6IHRydWUgYXMgY29uc3QsXG4gICAgICAgIHRhZ3M6IFtcInJlc2V0LXRhZ1wiXSxcbiAgICAgIH0pO1xuXG4gICAgICAvLyBSZXNldFxuICAgICAgYXdhaXQgY2FjaGVIYW5kbGVyLnJlc2V0UmVxdWVzdENhY2hlKCk7XG5cbiAgICAgIC8vIFN0aWxsIGFuc3dlcmVkIGZyb20gbWVtb3J5LCB3aXRob3V0IGFza2luZyBTMy5cbiAgICAgIGNvbnN0IHMzID0ge1xuICAgICAgICBnZXQ6IGplc3QuZm4oKS5tb2NrUmVzb2x2ZWRWYWx1ZShudWxsKSxcbiAgICAgICAgaXNSZXZhbGlkYXRlZDogamVzdC5mbigpLm1vY2tSZXNvbHZlZFZhbHVlKGZhbHNlKSxcbiAgICAgIH07XG4gICAgICAoY2FjaGVIYW5kbGVyIGFzIGFueSkuczNEeW5hbW9IYW5kbGVyID0gczM7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBjYWNoZUhhbmRsZXIuZ2V0KFwicmVzZXQta2V5XCIsIHtcbiAgICAgICAga2luZDogSW5jcmVtZW50YWxDYWNoZUtpbmQuQVBQX1BBR0UsXG4gICAgICAgIGlzRmFsbGJhY2s6IGZhbHNlLFxuICAgICAgfSk7XG4gICAgICBleHBlY3QocmVzdWx0Py52YWx1ZSkudG9FcXVhbCh0ZXN0RGF0YSk7XG4gICAgICBleHBlY3QoczMuZ2V0KS5ub3QudG9IYXZlQmVlbkNhbGxlZCgpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZShcIkJ1aWxkLXRpbWUgYmVoYXZpb3JcIiwgKCkgPT4ge1xuICAgIGl0KFwicmVhZHMgYmFjayBhIGZldGNoIGVudHJ5IGl0IHdyb3RlLCBmcm9tIG1lbW9yeSBhbmQgZnJvbSBkaXNrXCIsIGFzeW5jICgpID0+IHtcbiAgICAgIC8vIGBjYWNoZUNvbXBvbmVudHNgIHByZXJlbmRlcnMgZWFjaCBwYWdlIHR3aWNlOiB0aGUgZmlyc3QgcGFzcyBydW5zIHRoZVxuICAgICAgLy8gYGZldGNoYCBhbmQgYHNldGBzIGl0LCB0aGUgc2Vjb25kIG11c3QgZmluZCBpdCBhbHJlYWR5IGNhY2hlZCBvciBOZXh0LmpzXG4gICAgICAvLyBmYWlscyB0aGUgYnVpbGQgd2l0aCBcImVuY291bnRlcmVkIHVuY2FjaGVkIG9yIHJ1bnRpbWUgZGF0YSBkdXJpbmdcbiAgICAgIC8vIHByZXJlbmRlcmluZ1wiLiBBIHdyaXRlLW9ubHkgYnVpbGQtdGltZSBoYW5kbGVyIHRoZXJlZm9yZSBtYWtlc1xuICAgICAgLy8gYGNhY2hlOiAnZm9yY2UtY2FjaGUnYCB1bmJ1aWxkYWJsZSAtIG1lYXN1cmVkIGFnYWluc3QgbmV4dC5qcydzXG4gICAgICAvLyBgdGVzdC9lMmUvYXBwLWRpci9yZXN1bWUtZGF0YS1jYWNoZWAuXG4gICAgICBwcm9jZXNzLmVudi5ORVhUX1BIQVNFID0gXCJwaGFzZS1wcm9kdWN0aW9uLWJ1aWxkXCI7XG4gICAgICBwcm9jZXNzLmVudi5DREtfTkVYVEpTX0lOSVRfQ0FDSEVfRElSID0gbWtkdGVtcFN5bmMoXG4gICAgICAgIGpvaW4odG1wZGlyKCksIFwiY2RrLW5leHRqcy1pbml0LWNhY2hlLVwiKSxcbiAgICAgICk7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBkYXRhOiBJbmNyZW1lbnRhbENhY2hlVmFsdWUgPSB7XG4gICAgICAgICAga2luZDogQ2FjaGVkUm91dGVLaW5kLkZFVENILFxuICAgICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgIGhlYWRlcnM6IHt9LFxuICAgICAgICAgICAgYm9keTogXCJleUp5WVc1a2IyMGlPakY5XCIsXG4gICAgICAgICAgICBzdGF0dXM6IDIwMCxcbiAgICAgICAgICAgIHVybDogXCJodHRwczovL2V4YW1wbGUudGVzdC9hcGkvcmFuZG9tXCIsXG4gICAgICAgICAgfSxcbiAgICAgICAgICByZXZhbGlkYXRlOiAzMTUzNjAwMCxcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgZmV0Y2hVcmwgPSBcImh0dHBzOi8vZXhhbXBsZS50ZXN0L2FwaS9yYW5kb21cIjtcbiAgICAgICAgY29uc3Qgc2V0Q3R4ID0ge1xuICAgICAgICAgIGZldGNoQ2FjaGU6IHRydWUgYXMgY29uc3QsXG4gICAgICAgICAgdGFnczogW1widGVzdFwiXSxcbiAgICAgICAgICBmZXRjaFVybCxcbiAgICAgICAgICBmZXRjaElkeDogMSxcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgZ2V0Q3R4OiBHZXRJbmNyZW1lbnRhbEZldGNoQ2FjaGVDb250ZXh0ID0ge1xuICAgICAgICAgIGtpbmQ6IEluY3JlbWVudGFsQ2FjaGVLaW5kLkZFVENILFxuICAgICAgICAgIHJldmFsaWRhdGU6IDMxNTM2MDAwLFxuICAgICAgICAgIGZldGNoVXJsLFxuICAgICAgICAgIGZldGNoSWR4OiAxLFxuICAgICAgICAgIHRhZ3M6IFtcInRlc3RcIl0sXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IGJ1aWxkSGFuZGxlciA9IG5ldyBDZGtOZXh0anNDYWNoZUhhbmRsZXIoY3JlYXRlTW9ja0NvbnRleHQoKSk7XG4gICAgICAgIGF3YWl0IGJ1aWxkSGFuZGxlci5zZXQoXCJmZXRjaC1rZXlcIiwgZGF0YSwgc2V0Q3R4KTtcbiAgICAgICAgZXhwZWN0KGF3YWl0IGJ1aWxkSGFuZGxlci5nZXQoXCJmZXRjaC1rZXlcIiwgZ2V0Q3R4KSkudG9NYXRjaE9iamVjdCh7XG4gICAgICAgICAgdmFsdWU6IGRhdGEsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIEEgc2Vjb25kIGluc3RhbmNlIHJlYWRzIHRoZSBmaWxlIHJhdGhlciB0aGFuIHRoZSBtYXA6IGBuZXh0IGJ1aWxkYFxuICAgICAgICAvLyByZW5kZXJzIHBhZ2VzIGluIHdvcmtlciBwcm9jZXNzZXMsIHNvIHRoZSBwYXNzIHRoYXQgd3JpdGVzIGFuZCB0aGVcbiAgICAgICAgLy8gcGFzcyB0aGF0IHJlYWRzIGFyZSBub3QgYWx3YXlzIHRoZSBzYW1lIHByb2Nlc3MuXG4gICAgICAgIGNvbnN0IG90aGVyV29ya2VyID0gbmV3IENka05leHRqc0NhY2hlSGFuZGxlcihjcmVhdGVNb2NrQ29udGV4dCgpKTtcbiAgICAgICAgZXhwZWN0KGF3YWl0IG90aGVyV29ya2VyLmdldChcImZldGNoLWtleVwiLCBnZXRDdHgpKS50b01hdGNoT2JqZWN0KHtcbiAgICAgICAgICB2YWx1ZTogZGF0YSxcbiAgICAgICAgfSk7XG4gICAgICAgIGV4cGVjdChhd2FpdCBvdGhlcldvcmtlci5nZXQoXCJuZXZlci13cml0dGVuXCIsIGdldEN0eCkpLnRvQmVOdWxsKCk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBkZWxldGUgcHJvY2Vzcy5lbnYuTkVYVF9QSEFTRTtcbiAgICAgICAgZGVsZXRlIHByb2Nlc3MuZW52LkNES19ORVhUSlNfSU5JVF9DQUNIRV9ESVI7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBUaGUgc2VlZCBpcyB1cGxvYWRlZCBhcyB3cml0dGVuLCBzbyBpdCBtdXN0IGJlIGZpbGVkIHVuZGVyIHRoZSBuYW1lIHRoZVxuICAgIC8vIHJ1bnRpbWUncyBgZ2V0YCByZWFkczogZm9yIGEgbmFtZSB0b28gbG9uZyBmb3IgUzMsIGBjYWNoZU9iamVjdE5hbWVgJ3MuXG4gICAgaXQoXCJmaWxlcyBhbiBvdmVyLWxvbmcga2V5IHdoZXJlIHRoZSBydW50aW1lIHJlYWRzIGl0XCIsIGFzeW5jICgpID0+IHtcbiAgICAgIHByb2Nlc3MuZW52Lk5FWFRfUEhBU0UgPSBcInBoYXNlLXByb2R1Y3Rpb24tYnVpbGRcIjtcbiAgICAgIGNvbnN0IGNhY2hlRGlyID0gbWtkdGVtcFN5bmMoam9pbih0bXBkaXIoKSwgXCJjZGstbmV4dGpzLWluaXQtY2FjaGUtXCIpKTtcbiAgICAgIHByb2Nlc3MuZW52LkNES19ORVhUSlNfSU5JVF9DQUNIRV9ESVIgPSBjYWNoZURpcjtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGtleSA9IGAvcm91dGUtY2FjaGUvQVBQX1BBR0UvJHtcImFcIi5yZXBlYXQoNjQpfS8kLyR7XCJ4XCIucmVwZWF0KDkwMCl9YDtcbiAgICAgICAgZXhwZWN0KGNhY2hlT2JqZWN0TmFtZShrZXkpKS50b01hdGNoKC9eX2xvbmcta2V5XFwvLyk7XG4gICAgICAgIGNvbnN0IGRhdGE6IEluY3JlbWVudGFsQ2FjaGVWYWx1ZSA9IHtcbiAgICAgICAgICBraW5kOiBDYWNoZWRSb3V0ZUtpbmQuRkVUQ0gsXG4gICAgICAgICAgZGF0YTogeyBoZWFkZXJzOiB7fSwgYm9keTogXCJlMzA9XCIsIHN0YXR1czogMjAwLCB1cmw6IFwiXCIgfSxcbiAgICAgICAgICByZXZhbGlkYXRlOiA2MCxcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3Qgc2V0Q3R4ID0geyBmZXRjaENhY2hlOiB0cnVlIGFzIGNvbnN0LCB0YWdzOiBbXSB9O1xuICAgICAgICBhd2FpdCBuZXcgQ2RrTmV4dGpzQ2FjaGVIYW5kbGVyKGNyZWF0ZU1vY2tDb250ZXh0KCkpLnNldChcbiAgICAgICAgICBrZXksXG4gICAgICAgICAgZGF0YSxcbiAgICAgICAgICBzZXRDdHgsXG4gICAgICAgICk7XG4gICAgICAgIGV4cGVjdChleGlzdHNTeW5jKGpvaW4oY2FjaGVEaXIsIGNhY2hlT2JqZWN0TmFtZShrZXkpKSkpLnRvQmUodHJ1ZSk7XG4gICAgICAgIGNvbnN0IGdldEN0eDogR2V0SW5jcmVtZW50YWxGZXRjaENhY2hlQ29udGV4dCA9IHtcbiAgICAgICAgICBraW5kOiBJbmNyZW1lbnRhbENhY2hlS2luZC5GRVRDSCxcbiAgICAgICAgICByZXZhbGlkYXRlOiA2MCxcbiAgICAgICAgICB0YWdzOiBbXSxcbiAgICAgICAgfTtcbiAgICAgICAgZXhwZWN0KFxuICAgICAgICAgIGF3YWl0IG5ldyBDZGtOZXh0anNDYWNoZUhhbmRsZXIoY3JlYXRlTW9ja0NvbnRleHQoKSkuZ2V0KGtleSwgZ2V0Q3R4KSxcbiAgICAgICAgKS50b01hdGNoT2JqZWN0KHsgdmFsdWU6IGRhdGEgfSk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBkZWxldGUgcHJvY2Vzcy5lbnYuTkVYVF9QSEFTRTtcbiAgICAgICAgZGVsZXRlIHByb2Nlc3MuZW52LkNES19ORVhUSlNfSU5JVF9DQUNIRV9ESVI7XG4gICAgICB9XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXX0=
423
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FjaGUtaGFuZGxlci50ZXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2FkYXB0ZXIvY2FjaGUtaGFuZGxlci50ZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsc0RBQXNEO0FBQ3RELDJCQUE2QztBQUM3QywyQkFBNEI7QUFDNUIsK0JBQTRCO0FBUTVCLG9FQUFvRDtBQUNwRCwrQ0FBZ0Q7QUFFaEQsdUJBQXVCO0FBQ3ZCLElBQUksQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsQ0FBQztBQUNoQyxJQUFJLENBQUMsSUFBSSxDQUFDLDBCQUEwQixDQUFDLENBQUM7QUFFdEMsUUFBUSxDQUFDLDhDQUE4QyxFQUFFLEdBQUcsRUFBRTtJQUM1RCxJQUFJLFlBQW1DLENBQUM7SUFFeEMsTUFBTSxpQkFBaUIsR0FBRyxHQUF3QixFQUFFLENBQUMsQ0FBQztRQUNwRCxHQUFHLEVBQUUsS0FBSztRQUNWLGVBQWUsRUFBRSxFQUFFO1FBQ25CLGVBQWUsRUFBRSxFQUFFO0tBQ3BCLENBQUMsQ0FBQztJQUVILFVBQVUsQ0FBQyxHQUFHLEVBQUU7UUFDZCx1REFBdUQ7UUFDdkQsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUFDLENBQUMsa0JBQWtCLENBQUMsR0FBRyxFQUFFLEdBQUUsQ0FBQyxDQUFDLENBQUM7UUFFekQsTUFBTSxXQUFXLEdBQUcsaUJBQWlCLEVBQUUsQ0FBQztRQUN4QyxZQUFZLEdBQUcsSUFBSSx1QkFBcUIsQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUN4RCxDQUFDLENBQUMsQ0FBQztJQUVILFNBQVMsQ0FBQyxHQUFHLEVBQUU7UUFDYixJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDckIsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQ3ZCLG9CQUFvQjtRQUNwQixPQUFPLE9BQU8sQ0FBQyxHQUFHLENBQUMsOEJBQThCLENBQUM7UUFDbEQsc0VBQXNFO1FBQ3RFLDZD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bkMsQ0FBQztvQkFBUyxDQUFDO2dCQUNULE9BQU8sT0FBTyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUM7Z0JBQzlCLE9BQU8sT0FBTyxDQUFDLEdBQUcsQ0FBQyx5QkFBeUIsQ0FBQztZQUMvQyxDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgaW1wb3J0L25vLWV4dHJhbmVvdXMtZGVwZW5kZW5jaWVzICovXG5pbXBvcnQgeyBleGlzdHNTeW5jLCBta2R0ZW1wU3luYyB9IGZyb20gXCJmc1wiO1xuaW1wb3J0IHsgdG1wZGlyIH0gZnJvbSBcIm9zXCI7XG5pbXBvcnQgeyBqb2luIH0gZnJvbSBcInBhdGhcIjtcbmltcG9ydCB7IENhY2hlSGFuZGxlckNvbnRleHQgfSBmcm9tIFwibmV4dC9kaXN0L3NlcnZlci9saWIvaW5jcmVtZW50YWwtY2FjaGVcIjtcbmltcG9ydCB7XG4gIEluY3JlbWVudGFsQ2FjaGVWYWx1ZSxcbiAgQ2FjaGVkUm91dGVLaW5kLFxuICBJbmNyZW1lbnRhbENhY2hlS2luZCxcbn0gZnJvbSBcIm5leHQvZGlzdC9zZXJ2ZXIvcmVzcG9uc2UtY2FjaGVcIjtcbmltcG9ydCB0eXBlIHsgR2V0SW5jcmVtZW50YWxGZXRjaENhY2hlQ29udGV4dCB9IGZyb20gXCJuZXh0L2Rpc3Qvc2VydmVyL3Jlc3BvbnNlLWNhY2hlXCI7XG5pbXBvcnQgQ2RrTmV4dGpzQ2FjaGVIYW5kbGVyIGZyb20gXCIuL2NhY2hlLWhhbmRsZXJcIjtcbmltcG9ydCB7IGNhY2hlT2JqZWN0TmFtZSB9IGZyb20gXCIuL2NhY2hlLXV0aWxzXCI7XG5cbi8vIE1vY2sgQVdTIFNESyBjbGllbnRzXG5qZXN0Lm1vY2soXCJAYXdzLXNkay9jbGllbnQtczNcIik7XG5qZXN0Lm1vY2soXCJAYXdzLXNkay9jbGllbnQtZHluYW1vZGJcIik7XG5cbmRlc2NyaWJlKFwiQ2RrTmV4dGpzQ2FjaGVIYW5kbGVyIC0gT3JjaGVzdHJhdG9yIFBhdHRlcm5cIiwgKCkgPT4ge1xuICBsZXQgY2FjaGVIYW5kbGVyOiBDZGtOZXh0anNDYWNoZUhhbmRsZXI7XG5cbiAgY29uc3QgY3JlYXRlTW9ja0NvbnRleHQgPSAoKTogQ2FjaGVIYW5kbGVyQ29udGV4dCA9PiAoe1xuICAgIGRldjogZmFsc2UsXG4gICAgcmV2YWxpZGF0ZWRUYWdzOiBbXSxcbiAgICBfcmVxdWVzdEhlYWRlcnM6IHt9LFxuICB9KTtcblxuICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICAvLyBTdXBwcmVzcyBleHBlY3RlZCB3YXJuaW5ncyB3aGVuIGVudiB2YXJzIGFyZSBub3Qgc2V0XG4gICAgamVzdC5zcHlPbihjb25zb2xlLCBcIndhcm5cIikubW9ja0ltcGxlbWVudGF0aW9uKCgpID0+IHt9KTtcblxuICAgIGNvbnN0IG1vY2tDb250ZXh0ID0gY3JlYXRlTW9ja0NvbnRleHQoKTtcbiAgICBjYWNoZUhhbmRsZXIgPSBuZXcgQ2RrTmV4dGpzQ2FjaGVIYW5kbGVyKG1vY2tDb250ZXh0KTtcbiAgfSk7XG5cbiAgYWZ0ZXJFYWNoKCgpID0+IHtcbiAgICBqZXN0LmNsZWFyQWxsTW9ja3MoKTtcbiAgICBqZXN0LnJlc3RvcmVBbGxNb2NrcygpO1xuICAgIC8vIENsZWFuIHVwIGVudiB2YXJzXG4gICAgZGVsZXRlIHByb2Nlc3MuZW52LkNES19ORVhUSlNfTUVNT1JZX0NBQ0hFX1RUTF9NUztcbiAgICAvLyBSZXNldCBzaW5nbGV0b24gaGFuZGxlcnMgYnkgYWNjZXNzaW5nIHRoZSBjbGFzcydzIHN0YXRpYyBwcm9wZXJ0aWVzXG4gICAgLy8gVGhpcyBlbnN1cmVzIGVhY2ggdGVzdCBnZXRzIGZyZXNoIGhhbmRsZXJzXG4gICAgKENka05leHRqc0NhY2hlSGFuZGxlciBhcyBhbnkpLnNoYXJlZE1lbW9yeUhhbmRsZXIgPSBudWxsO1xuICAgIChDZGtOZXh0anNDYWNoZUhhbmRsZXIgYXMgYW55KS5zaGFyZWRTM0R5bmFtb0hhbmRsZXIgPSBudWxsO1xuICB9KTtcblxuICBkZXNjcmliZShcIk9yY2hlc3RyYXRvcjogTWVtb3J5ICsgUzMvRHluYW1vREJcIiwgKCkgPT4ge1xuICAgIGl0KFwic2hvdWxkIHdyaXRlIHRvIGJvdGggbWVtb3J5IGFuZCBTMy9EeW5hbW9EQiBvbiBzZXRcIiwgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdGVzdERhdGE6IEluY3JlbWVudGFsQ2FjaGVWYWx1ZSA9IHtcbiAgICAgICAga2luZDogQ2FjaGVkUm91dGVLaW5kLkFQUF9QQUdFLFxuICAgICAgICBodG1sOiBcIjxodG1sPnRlc3Q8L2h0bWw+XCIsXG4gICAgICAgIHJzY0RhdGE6IHVuZGVmaW5lZCxcbiAgICAgICAgaGVhZGVyczogdW5kZWZpbmVkLFxuICAgICAgICBwb3N0cG9uZWQ6IHVuZGVmaW5lZCxcbiAgICAgICAgc2VnbWVudERhdGE6IHVuZGVmaW5lZCxcbiAgICAgICAgc3RhdHVzOiB1bmRlZmluZWQsXG4gICAgICB9O1xuXG4gICAgICBjb25zdCBzMyA9IHtcbiAgICAgICAgc2V0OiBqZXN0LmZuKCkubW9ja1Jlc29sdmVkVmFsdWUodW5kZWZpbmVkKSxcbiAgICAgICAgZ2V0OiBqZXN0LmZuKCkubW9ja1Jlc29sdmVkVmFsdWUobnVsbCksXG4gICAgICAgIGlzUmV2YWxpZGF0ZWQ6IGplc3QuZm4oKS5tb2NrUmVzb2x2ZWRWYWx1ZShmYWxzZSksXG4gICAgICB9O1xuICAgICAgKGNhY2hlSGFuZGxlciBhcyBhbnkpLnMzRHluYW1vSGFuZGxlciA9IHMzO1xuICAgICAgY29uc3Qgc2V0Q3R4ID0geyBmZXRjaENhY2hlOiB0cnVlIGFzIGNvbnN0LCB0YWdzOiBbXSB9O1xuXG4gICAgICAvLyBTZXQgY2FjaGUgZW50cnlcbiAgICAgIGF3YWl0IGNhY2hlSGFuZGxlci5zZXQoXCJ0ZXN0LWtleVwiLCB0ZXN0RGF0YSwgc2V0Q3R4KTtcblxuICAgICAgLy8gUzMvRHluYW1vREIgZ290IHRoZSB3cml0ZSwgd2l0aCB0aGUgY29udGV4dCBpdCBuZWVkcyBmb3IgdGFncy5cbiAgICAgIGV4cGVjdChzMy5zZXQpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKFwidGVzdC1rZXlcIiwgdGVzdERhdGEsIHNldEN0eCk7XG5cbiAgICAgIC8vIEdldCBzaG91bGQgcmV0dXJuIGZyb20gbWVtb3J5LCB3aXRob3V0IGFza2luZyBTMy5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGNhY2hlSGFuZGxlci5nZXQoXCJ0ZXN0LWtleVwiLCB7XG4gICAgICAgIGtpbmQ6IEluY3JlbWVudGFsQ2FjaGVLaW5kLkFQUF9QQUdFLFxuICAgICAgICBpc0ZhbGxiYWNrOiBmYWxzZSxcbiAgICAgIH0pO1xuXG4gICAgICBleHBlY3QocmVzdWx0KS5ub3QudG9CZU51bGwoKTtcbiAgICAgIGV4cGVjdChyZXN1bHQ/LnZhbHVlKS50b0VxdWFsKHRlc3REYXRhKTtcbiAgICAgIGV4cGVjdChzMy5nZXQpLm5vdC50b0hhdmVCZWVuQ2FsbGVkKCk7XG4gICAgfSk7XG5cbiAgICBpdChcImRlbGV0ZXMgZnJvbSBib3RoIGxheWVycyBvbiBzZXQoa2V5LCBudWxsKVwiLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB0ZXN0RGF0YTogSW5jcmVtZW50YWxDYWNoZVZhbHVlID0ge1xuICAgICAgICBraW5kOiBDYWNoZWRSb3V0ZUtpbmQuQVBQX1BBR0UsXG4gICAgICAgIGh0bWw6IFwiPGh0bWw+Z29uZTwvaHRtbD5cIixcbiAgICAgICAgcnNjRGF0YTogdW5kZWZpbmVkLFxuICAgICAgICBoZWFkZXJzOiB1bmRlZmluZWQsXG4gICAgICAgIHBvc3Rwb25lZDogdW5kZWZpbmVkLFxuICAgICAgICBzZWdtZW50RGF0YTogdW5kZWZpbmVkLFxuICAgICAgICBzdGF0dXM6IHVuZGVmaW5lZCxcbiAgICAgIH07XG4gICAgICBjb25zdCBzMyA9IHtcbiAgICAgICAgc2V0OiBqZXN0LmZuKCkubW9ja1Jlc29sdmVkVmFsdWUodW5kZWZpbmVkKSxcbiAgICAgICAgZ2V0OiBqZXN0LmZuKCkubW9ja1Jlc29sdmVkVmFsdWUobnVsbCksXG4gICAgICAgIGlzUmV2YWxpZGF0ZWQ6IGplc3QuZm4oKS5tb2NrUmVzb2x2ZWRWYWx1ZShmYWxzZSksXG4gICAgICB9O1xuICAgICAgKGNhY2hlSGFuZGxlciBhcyBhbnkpLnMzRHluYW1vSGFuZGxlciA9IHMzO1xuICAgICAgY29uc3Qgc2V0Q3R4ID0geyBmZXRjaENhY2hlOiB0cnVlIGFzIGNvbnN0LCB0YWdzOiBbXSB9O1xuICAgICAgYXdhaXQgY2FjaGVIYW5kbGVyLnNldChcImdvbmUta2V5XCIsIHRlc3REYXRhLCBzZXRDdHgpO1xuXG4gICAgICBhd2FpdCBjYWNoZUhhbmRsZXIuc2V0KFwiZ29uZS1rZXlcIiwgbnVsbCwgc2V0Q3R4KTtcblxuICAgICAgLy8gVGhlIFMzIGxheWVyIGlzIHRvbGQgdG8gZGVsZXRlLCBub3Qgc2tpcHBlZC5cbiAgICAgIGV4cGVjdChzMy5zZXQpLnRvSGF2ZUJlZW5MYXN0Q2FsbGVkV2l0aChcImdvbmUta2V5XCIsIG51bGwsIHNldEN0eCk7XG4gICAgICAvLyBBbmQgbWVtb3J5IG5vIGxvbmdlciBhbnN3ZXJzOiB0aGUgcmVhZCBmYWxscyB0aHJvdWdoIHRvIFMzLlxuICAgICAgZXhwZWN0KFxuICAgICAgICBhd2FpdCBjYWNoZUhhbmRsZXIuZ2V0KFwiZ29uZS1rZXlcIiwge1xuICAgICAgICAgIGtpbmQ6IEluY3JlbWVudGFsQ2FjaGVLaW5kLkFQUF9QQUdFLFxuICAgICAgICAgIGlzRmFsbGJhY2s6IGZhbHNlLFxuICAgICAgICB9KSxcbiAgICAgICkudG9CZU51bGwoKTtcbiAgICAgIGV4cGVjdChzMy5nZXQpLnRvSGF2ZUJlZW5DYWxsZWRUaW1lcygxKTtcbiAgICB9KTtcblxuICAgIGl0KFwicmV2YWxpZGF0ZXMgYSB0YWcgaW4gUzMvRHluYW1vREIsIHBhc3NpbmcgdGhlIGR1cmF0aW9ucyB0aHJvdWdoXCIsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHRlc3REYXRhOiBJbmNyZW1lbnRhbENhY2hlVmFsdWUgPSB7XG4gICAgICAgIGtpbmQ6IENhY2hlZFJvdXRlS2luZC5BUFBfUEFHRSxcbiAgICAgICAgaHRtbDogXCI8aHRtbD50YWdnZWQ8L2h0bWw+XCIsXG4gICAgICAgIHJzY0RhdGE6IHVuZGVmaW5lZCxcbiAgICAgICAgaGVhZGVyczogeyBcIngtbmV4dC1jYWNoZS10YWdzXCI6IFwicG9zdHNcIiB9LFxuICAgICAgICBwb3N0cG9uZWQ6IHVuZGVmaW5lZCxcbiAgICAgICAgc2VnbWVudERhdGE6IHVuZGVmaW5lZCxcbiAgICAgICAgc3RhdHVzOiB1bmRlZmluZWQsXG4gICAgICB9O1xuICAgICAgY29uc3QgczMgPSB7XG4gICAgICAgIHNldDogamVzdC5mbigpLm1vY2tSZXNvbHZlZFZhbHVlKHVuZGVmaW5lZCksXG4gICAgICAgIGdldDogamVzdC5mbigpLm1vY2tSZXNvbHZlZFZhbHVlKG51bGwpLFxuICAgICAgICBpc1JldmFsaWRhdGVkOiBqZXN0LmZuKCkubW9ja1Jlc29sdmVkVmFsdWUoZmFsc2UpLFxuICAgICAgICByZXZhbGlkYXRlVGFnOiBqZXN0LmZuKCkubW9ja1Jlc29sdmVkVmFsdWUodW5kZWZpbmVkKSxcbiAgICAgIH07XG4gICAgICAoY2FjaGVIYW5kbGVyIGFzIGFueSkuczNEeW5hbW9IYW5kbGVyID0gczM7XG5cbiAgICAgIGF3YWl0IGNhY2hlSGFuZGxlci5zZXQoXCJ0YWdnZWQta2V5XCIsIHRlc3REYXRhLCB7XG4gICAgICAgIGZldGNoQ2FjaGU6IHRydWUgYXMgY29uc3QsXG4gICAgICAgIHRhZ3M6IFtcInBvc3RzXCJdLFxuICAgICAgfSk7XG4gICAgICAvLyBgcmV2YWxpZGF0ZVRhZyh0YWcsIHByb2ZpbGUpYDogdGhlIGR1cmF0aW9ucyBkZWNpZGUgc3RhbGUgdnMgZXhwaXJlZCxcbiAgICAgIC8vIHNvIGRyb3BwaW5nIHRoZW0gdHVybnMgZXZlcnkgc29mdCByZXZhbGlkYXRpb24gaW50byBhIGhhcmQgb25lLlxuICAgICAgYXdhaXQgY2FjaGVIYW5kbGVyLnJldmFsaWRhdGVUYWcoW1wicG9zdHNcIl0sIHsgZXhwaXJlOiA2MCB9KTtcblxuICAgICAgZXhwZWN0KHMzLnJldmFsaWRhdGVUYWcpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKFtcInBvc3RzXCJdLCB7IGV4cGlyZTogNjAgfSk7XG5cbiAgICAgIGF3YWl0IGNhY2hlSGFuZGxlci5yZXZhbGlkYXRlVGFnKFwicG9zdHNcIik7XG4gICAgICBleHBlY3QoczMucmV2YWxpZGF0ZVRhZykudG9IYXZlQmVlbkxhc3RDYWxsZWRXaXRoKFwicG9zdHNcIiwgdW5kZWZpbmVkKTtcbiAgICB9KTtcblxuICAgIGl0KFwic2hvdWxkIGhhbmRsZSBjYWNoZSBtaXNzZXMgZ3JhY2VmdWxseVwiLCBhc3luYyAoKSA9PiB7XG4gICAgICAvLyBHZXQgbm9uLWV4aXN0ZW50IGtleVxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgY2FjaGVIYW5kbGVyLmdldChcIm1pc3Npbmcta2V5XCIsIHtcbiAgICAgICAga2luZDogSW5jcmVtZW50YWxDYWNoZUtpbmQuQVBQX1BBR0UsXG4gICAgICAgIGlzRmFsbGJhY2s6IGZhbHNlLFxuICAgICAgfSk7XG5cbiAgICAgIC8vIFNob3VsZCByZXR1cm4gbnVsbCAoYm90aCBtZW1vcnkgYW5kIFMzIG1pc3MpXG4gICAgICBleHBlY3QocmVzdWx0KS50b0JlTnVsbCgpO1xuICAgIH0pO1xuXG4gICAgaXQoXCJkb2VzIG5vdCBjb3B5IGEgdGFnLWV4cGlyZWQgUzMgZW50cnkgaW50byBtZW1vcnlcIiwgYXN5bmMgKCkgPT4ge1xuICAgICAgLy8gYGxhc3RNb2RpZmllZDogLTFgIGlzIHRoZSBTMyBsYXllciBzYXlpbmcgXCJhIHRhZyByZXZhbGlkYXRpb24gZXhwaXJlZFxuICAgICAgLy8gdGhpcywgcmUtcmVuZGVyIGJlZm9yZSBhbnN3ZXJpbmdcIi4gQ29waWVkIGludG8gbWVtb3J5LCB0aGUgZXhwaXJlZCBib2R5XG4gICAgICAvLyB3b3VsZCBiZSBhbnN3ZXJlZCBmcm9tIHRoZXJlIGluc3RlYWQgb2YgZnJvbSB0aGUgcmUtcmVuZGVyLlxuICAgICAgY29uc3QgdmFsdWU6IEluY3JlbWVudGFsQ2FjaGVWYWx1ZSA9IHtcbiAgICAgICAga2luZDogQ2FjaGVkUm91dGVLaW5kLkFQUF9QQUdFLFxuICAgICAgICBodG1sOiBcIjxodG1sPmV4cGlyZWQ8L2h0bWw+XCIsXG4gICAgICAgIHJzY0RhdGE6IHVuZGVmaW5lZCxcbiAgICAgICAgaGVhZGVyczogdW5kZWZpbmVkLFxuICAgICAgICBwb3N0cG9uZWQ6IHVuZGVmaW5lZCxcbiAgICAgICAgc2VnbWVudERhdGE6IHVuZGVmaW5lZCxcbiAgICAgICAgc3RhdHVzOiB1bmRlZmluZWQsXG4gICAgICB9O1xuICAgICAgY29uc3QgZ2V0Q3R4ID0ge1xuICAgICAgICBraW5kOiBJbmNyZW1lbnRhbENhY2hlS2luZC5BUFBfUEFHRSxcbiAgICAgICAgaXNGYWxsYmFjazogZmFsc2UsXG4gICAgICB9IGFzIGNvbnN0O1xuXG4gICAgICAoY2FjaGVIYW5kbGVyIGFzIGFueSkuczNEeW5hbW9IYW5kbGVyID0ge1xuICAgICAgICBnZXQ6IGplc3QuZm4oKS5tb2NrUmVzb2x2ZWRWYWx1ZSh7IGxhc3RNb2RpZmllZDogLTEsIHZhbHVlIH0pLFxuICAgICAgfTtcbiAgICAgIGV4cGVjdChhd2FpdCBjYWNoZUhhbmRsZXIuZ2V0KFwiaXNyLzFcIiwgZ2V0Q3R4KSkudG9FcXVhbCh7XG4gICAgICAgIGxhc3RNb2RpZmllZDogLTEsXG4gICAgICAgIHZhbHVlLFxuICAgICAgfSk7XG5cbiAgICAgIC8vIFdpdGggdGhlIFMzIGxheWVyIG5vdyBzaWxlbnQsIGEgbWVtb3J5IGNvcHkgd291bGQgYW5zd2VyIHRoaXMgYXMgYSBoaXQuXG4gICAgICAoY2FjaGVIYW5kbGVyIGFzIGFueSkuczNEeW5hbW9IYW5kbGVyID0ge1xuICAgICAgICBnZXQ6IGplc3QuZm4oKS5tb2NrUmVzb2x2ZWRWYWx1ZShudWxsKSxcbiAgICAgIH07XG4gICAgICBleHBlY3QoYXdhaXQgY2FjaGVIYW5kbGVyLmdldChcImlzci8xXCIsIGdldEN0eCkpLnRvQmVOdWxsKCk7XG4gICAgfSk7XG5cbiAgICBpdChcImNvcGllcyBhIGxpdmUgUzMgZW50cnkgaW50byBtZW1vcnlcIiwgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdmFsdWU6IEluY3JlbWVudGFsQ2FjaGVWYWx1ZSA9IHtcbiAgICAgICAga2luZDogQ2FjaGVkUm91dGVLaW5kLkFQUF9QQUdFLFxuICAgICAgICBodG1sOiBcIjxodG1sPmxpdmU8L2h0bWw+XCIsXG4gICAgICAgIHJzY0RhdGE6IHVuZGVmaW5lZCxcbiAgICAgICAgaGVhZGVyczogdW5kZWZpbmVkLFxuICAgICAgICBwb3N0cG9uZWQ6IHVuZGVmaW5lZCxcbiAgICAgICAgc2VnbWVudERhdGE6IHVuZGVmaW5lZCxcbiAgICAgICAgc3RhdHVzOiB1bmRlZmluZWQsXG4gICAgICB9O1xuICAgICAgY29uc3QgZ2V0Q3R4ID0ge1xuICAgICAgICBraW5kOiBJbmNyZW1lbnRhbENhY2hlS2luZC5BUFBfUEFHRSxcbiAgICAgICAgaXNGYWxsYmFjazogZmFsc2UsXG4gICAgICB9IGFzIGNvbnN0O1xuXG4gICAgICAoY2FjaGVIYW5kbGVyIGFzIGFueSkuczNEeW5hbW9IYW5kbGVyID0ge1xuICAgICAgICBnZXQ6IGplc3QuZm4oKS5tb2NrUmVzb2x2ZWRWYWx1ZSh7IGxhc3RNb2RpZmllZDogRGF0ZS5ub3coKSwgdmFsdWUgfSksXG4gICAgICB9O1xuICAgICAgYXdhaXQgY2FjaGVIYW5kbGVyLmdldChcImlzci8yXCIsIGdldEN0eCk7XG5cbiAgICAgIGNvbnN0IHMzID0ge1xuICAgICAgICBnZXQ6IGplc3QuZm4oKS5tb2NrUmVzb2x2ZWRWYWx1ZShudWxsKSxcbiAgICAgICAgaXNSZXZhbGlkYXRlZDogamVzdC5mbigpLm1vY2tSZXNvbHZlZFZhbHVlKGZhbHNlKSxcbiAgICAgIH07XG4gICAgICAoY2FjaGVIYW5kbGVyIGFzIGFueSkuczNEeW5hbW9IYW5kbGVyID0gczM7XG4gICAgICBleHBlY3QoYXdhaXQgY2FjaGVIYW5kbGVyLmdldChcImlzci8yXCIsIGdldEN0eCkpLnRvTWF0Y2hPYmplY3QoeyB2YWx1ZSB9KTtcbiAgICAgIGV4cGVjdChzMy5nZXQpLm5vdC50b0hhdmVCZWVuQ2FsbGVkKCk7XG4gICAgfSk7XG5cbiAgICBpdChcImtlZXBzIHRoZSBTMyBlbnRyeSdzIGxhc3RNb2RpZmllZCB3aGVuIGNvcHlpbmcgaXQgaW50byBtZW1vcnlcIiwgYXN5bmMgKCkgPT4ge1xuICAgICAgLy8gTmV4dC5qcyBhZ2VzIHRoZSBlbnRyeSBmcm9tIGBsYXN0TW9kaWZpZWRgLCBhbmQgdGhlIHRhZyBtYXJrZXJzIGFyZVxuICAgICAgLy8gY29tcGFyZWQgYWdhaW5zdCBpdC4gU3RhbXBpbmcgdGhlIHRpbWUgb2YgdGhlIGNvcHkgbWFkZSBhIHBhZ2UgYSBzb2Z0XG4gICAgICAvLyBgcmV2YWxpZGF0ZVRhZ2AgaGFkIG1hZGUgc3RhbGUgbG9vayBuZXdlciB0aGFuIHRoZSBzdGFsZSBtYXJrLlxuICAgICAgY29uc3QgdmFsdWU6IEluY3JlbWVudGFsQ2FjaGVWYWx1ZSA9IHtcbiAgICAgICAga2luZDogQ2FjaGVkUm91dGVLaW5kLkFQUF9QQUdFLFxuICAgICAgICBodG1sOiBcIjxodG1sPm9sZDwvaHRtbD5cIixcbiAgICAgICAgcnNjRGF0YTogdW5kZWZpbmVkLFxuICAgICAgICBoZWFkZXJzOiB1bmRlZmluZWQsXG4gICAgICAgIHBvc3Rwb25lZDogdW5kZWZpbmVkLFxuICAgICAgICBzZWdtZW50RGF0YTogdW5kZWZpbmVkLFxuICAgICAgICBzdGF0dXM6IHVuZGVmaW5lZCxcbiAgICAgIH07XG4gICAgICBjb25zdCBnZXRDdHggPSB7XG4gICAgICAgIGtpbmQ6IEluY3JlbWVudGFsQ2FjaGVLaW5kLkFQUF9QQUdFLFxuICAgICAgICBpc0ZhbGxiYWNrOiBmYWxzZSxcbiAgICAgIH0gYXMgY29uc3Q7XG4gICAgICBjb25zdCByZW5kZXJlZEF0ID0gRGF0ZS5ub3coKSAtIDYwXzAwMDtcblxuICAgICAgKGNhY2hlSGFuZGxlciBhcyBhbnkpLnMzRHluYW1vSGFuZGxlciA9IHtcbiAgICAgICAgZ2V0OiBqZXN0LmZuKCkubW9ja1Jlc29sdmVkVmFsdWUoeyBsYXN0TW9kaWZpZWQ6IHJlbmRlcmVkQXQsIHZhbHVlIH0pLFxuICAgICAgfTtcbiAgICAgIGF3YWl0IGNhY2hlSGFuZGxlci5nZXQoXCJpc3IvM1wiLCBnZXRDdHgpO1xuXG4gICAgICBjb25zdCBzMyA9IHtcbiAgICAgICAgZ2V0OiBqZXN0LmZuKCkubW9ja1Jlc29sdmVkVmFsdWUobnVsbCksXG4gICAgICAgIGlzUmV2YWxpZGF0ZWQ6IGplc3QuZm4oKS5tb2NrUmVzb2x2ZWRWYWx1ZShmYWxzZSksXG4gICAgICB9O1xuICAgICAgKGNhY2hlSGFuZGxlciBhcyBhbnkpLnMzRHluYW1vSGFuZGxlciA9IHMzO1xuICAgICAgZXhwZWN0KGF3YWl0IGNhY2hlSGFuZGxlci5nZXQoXCJpc3IvM1wiLCBnZXRDdHgpKS50b0VxdWFsKHtcbiAgICAgICAgbGFzdE1vZGlmaWVkOiByZW5kZXJlZEF0LFxuICAgICAgICB2YWx1ZSxcbiAgICAgIH0pO1xuICAgICAgZXhwZWN0KHMzLmlzUmV2YWxpZGF0ZWQpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKFxuICAgICAgICB7IGxhc3RNb2RpZmllZDogcmVuZGVyZWRBdCwgdmFsdWUgfSxcbiAgICAgICAgZ2V0Q3R4LFxuICAgICAgICBcImlzci8zXCIsXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgaXQoXCJzZXJ2ZXMgYSBtZW1vcnkgaGl0IHdpdGggdGhlIGxpZmV0aW1lIGl0IHdhcyByZW5kZXJlZCBvciBzdG9yZWQgd2l0aFwiLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB2YWx1ZTogSW5jcmVtZW50YWxDYWNoZVZhbHVlID0ge1xuICAgICAgICBraW5kOiBDYWNoZWRSb3V0ZUtpbmQuQVBQX1BBR0UsXG4gICAgICAgIGh0bWw6IFwiPGh0bWw+aXNyPC9odG1sPlwiLFxuICAgICAgICByc2NEYXRhOiB1bmRlZmluZWQsXG4gICAgICAgIGhlYWRlcnM6IHVuZGVmaW5lZCxcbiAgICAgICAgcG9zdHBvbmVkOiB1bmRlZmluZWQsXG4gICAgICAgIHNlZ21lbnREYXRhOiB1bmRlZmluZWQsXG4gICAgICAgIHN0YXR1czogdW5kZWZpbmVkLFxuICAgICAgfTtcbiAgICAgIGNvbnN0IGdldEN0eCA9IHtcbiAgICAgICAga2luZDogSW5jcmVtZW50YWxDYWNoZUtpbmQuQVBQX1BBR0UsXG4gICAgICAgIGlzRmFsbGJhY2s6IGZhbHNlLFxuICAgICAgfSBhcyBjb25zdDtcbiAgICAgIGNvbnN0IHMzID0ge1xuICAgICAgICBzZXQ6IGplc3QuZm4oKS5tb2NrUmVzb2x2ZWRWYWx1ZSh1bmRlZmluZWQpLFxuICAgICAgICBnZXQ6IGplc3QuZm4oKS5tb2NrUmVzb2x2ZWRWYWx1ZSh7XG4gICAgICAgICAgbGFzdE1vZGlmaWVkOiBEYXRlLm5vdygpLFxuICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgIGNhY2hlQ29udHJvbDogeyByZXZhbGlkYXRlOiAzMCwgZXhwaXJlOiB1bmRlZmluZWQgfSxcbiAgICAgICAgfSksXG4gICAgICAgIGlzUmV2YWxpZGF0ZWQ6IGplc3QuZm4oKS5tb2NrUmVzb2x2ZWRWYWx1ZShmYWxzZSksXG4gICAgICB9O1xuICAgICAgKGNhY2hlSGFuZGxlciBhcyBhbnkpLnMzRHluYW1vSGFuZGxlciA9IHMzO1xuXG4gICAgICAvLyBSZW5kZXJlZCBoZXJlOiB0aGUgbGlmZXRpbWUgYFJlc3BvbnNlQ2FjaGUuc2V0YCBwYXNzZWQuXG4gICAgICBhd2FpdCBjYWNoZUhhbmRsZXIuc2V0KFwiaXNyLzRcIiwgdmFsdWUsIHtcbiAgICAgICAgY2FjaGVDb250cm9sOiB7IHJldmFsaWRhdGU6IDYwLCBleHBpcmU6IDMwMCB9LFxuICAgICAgICBpc1JvdXRlUFBSRW5hYmxlZDogZmFsc2UsXG4gICAgICAgIGlzRmFsbGJhY2s6IGZhbHNlLFxuICAgICAgfSk7XG4gICAgICBleHBlY3QoKGF3YWl0IGNhY2hlSGFuZGxlci5nZXQoXCJpc3IvNFwiLCBnZXRDdHgpKT8uY2FjaGVDb250cm9sKS50b0VxdWFsKHtcbiAgICAgICAgcmV2YWxpZGF0ZTogNjAsXG4gICAgICAgIGV4cGlyZTogMzAwLFxuICAgICAgfSk7XG5cbiAgICAgIC8vIENvcGllZCBpbiBmcm9tIFMzOiB0aGUgbGlmZXRpbWUgUzMgc3RvcmVkLlxuICAgICAgYXdhaXQgY2FjaGVIYW5kbGVyLmdldChcImlzci81XCIsIGdldEN0eCk7XG4gICAgICBzMy5nZXQubW9ja0NsZWFyKCk7XG4gICAgICBleHBlY3QoKGF3YWl0IGNhY2hlSGFuZGxlci5nZXQoXCJpc3IvNVwiLCBnZXRDdHgpKT8uY2FjaGVDb250cm9sKS50b0VxdWFsKHtcbiAgICAgICAgcmV2YWxpZGF0ZTogMzAsXG4gICAgICAgIGV4cGlyZTogdW5kZWZpbmVkLFxuICAgICAgfSk7XG4gICAgICBleHBlY3QoczMuZ2V0KS5ub3QudG9IYXZlQmVlbkNhbGxlZCgpO1xuICAgIH0pO1xuXG4gICAgaXQoXCJkb2VzIG5vdCBzZXJ2ZSBhIG1lbW9yeSBoaXQgYW5vdGhlciBpbnN0YW5jZSdzIHJldmFsaWRhdGVUYWcgZXhwaXJlZFwiLCBhc3luYyAoKSA9PiB7XG4gICAgICAvLyBgcmV2YWxpZGF0ZVRhZ2AgY2xlYXJzIG9ubHkgdGhlIG1lbW9yeSBvZiB0aGUgaW5zdGFuY2UgdGhhdCByYW4gaXQuIEFueVxuICAgICAgLy8gb3RoZXIgaW5zdGFuY2UgaG9sZGluZyB0aGUgcGFnZSBpbiBtZW1vcnkgYW5zd2VyZWQgZnJvbSBpdCBmb3IgdGhlXG4gICAgICAvLyB3aG9sZSBtZW1vcnkgVFRMLCBhbmQgQ2xvdWRGcm9udCAtIGp1c3QgaW52YWxpZGF0ZWQgLSBjYWNoZWQgdGhlIHN0YWxlXG4gICAgICAvLyBwYWdlIGFnYWluLiBTbyBhIG1lbW9yeSBoaXQgaXMgY2hlY2tlZCBhZ2FpbnN0IHRoZSB0YWcgbWFya2VycyB0b28uXG4gICAgICBjb25zdCB2YWx1ZTogSW5jcmVtZW50YWxDYWNoZVZhbHVlID0ge1xuICAgICAgICBraW5kOiBDYWNoZWRSb3V0ZUtpbmQuQVBQX1BBR0UsXG4gICAgICAgIGh0bWw6IFwiPGh0bWw+c3RhbGU8L2h0bWw+XCIsXG4gICAgICAgIHJzY0RhdGE6IHVuZGVmaW5lZCxcbiAgICAgICAgaGVhZGVyczogeyBcIngtbmV4dC1jYWNoZS10YWdzXCI6IFwiX05fVF8vYmxvZ1wiIH0sXG4gICAgICAgIHBvc3Rwb25lZDogdW5kZWZpbmVkLFxuICAgICAgICBzZWdtZW50RGF0YTogdW5kZWZpbmVkLFxuICAgICAgICBzdGF0dXM6IHVuZGVmaW5lZCxcbiAgICAgIH07XG4gICAgICBjb25zdCBnZXRDdHggPSB7XG4gICAgICAgIGtpbmQ6IEluY3JlbWVudGFsQ2FjaGVLaW5kLkFQUF9QQUdFLFxuICAgICAgICBpc0ZhbGxiYWNrOiBmYWxzZSxcbiAgICAgIH0gYXMgY29uc3Q7XG5cbiAgICAgIChjYWNoZUhhbmRsZXIgYXMgYW55KS5zM0R5bmFtb0hhbmRsZXIgPSB7XG4gICAgICAgIGdldDogamVzdC5mbigpLm1vY2tSZXNvbHZlZFZhbHVlKHsgbGFzdE1vZGlmaWVkOiBEYXRlLm5vdygpLCB2YWx1ZSB9KSxcbiAgICAgIH07XG4gICAgICBhd2FpdCBjYWNoZUhhbmRsZXIuZ2V0KFwiYmxvZ1wiLCBnZXRDdHgpO1xuXG4gICAgICAvLyBBbm90aGVyIGluc3RhbmNlIHJldmFsaWRhdGVkIGBfTl9UXy9ibG9nYDogdGhlIG1hcmtlciBpcyBuZXdlciB0aGFuIHRoZVxuICAgICAgLy8gbWVtb3J5IGNvcHksIGFuZCBTMyBub3cgYW5zd2VycyB3aXRoIHRoZSBlbnRyeSBleHBpcmVkLlxuICAgICAgY29uc3QgczMgPSB7XG4gICAgICAgIGdldDogamVzdC5mbigpLm1vY2tSZXNvbHZlZFZhbHVlKHsgbGFzdE1vZGlmaWVkOiAtMSwgdmFsdWUgfSksXG4gICAgICAgIGlzUmV2YWxpZGF0ZWQ6IGplc3QuZm4oKS5tb2NrUmVzb2x2ZWRWYWx1ZSh0cnVlKSxcbiAgICAgIH07XG4gICAgICAoY2FjaGVIYW5kbGVyIGFzIGFueSkuczNEeW5hbW9IYW5kbGVyID0gczM7XG4gICAgICBleHBlY3QoYXdhaXQgY2FjaGVIYW5kbGVyLmdldChcImJsb2dcIiwgZ2V0Q3R4KSkudG9FcXVhbCh7XG4gICAgICAgIGxhc3RNb2RpZmllZDogLTEsXG4gICAgICAgIHZhbHVlLFxuICAgICAgfSk7XG4gICAgICBleHBlY3QoczMuaXNSZXZhbGlkYXRlZCkudG9IYXZlQmVlbkNhbGxlZFdpdGgoXG4gICAgICAgIGV4cGVjdC5vYmplY3RDb250YWluaW5nKHsgdmFsdWUgfSksXG4gICAgICAgIGdldEN0eCxcbiAgICAgICAgXCJibG9nXCIsXG4gICAgICApO1xuICAgICAgZXhwZWN0KHMzLmdldCkudG9IYXZlQmVlbkNhbGxlZFRpbWVzKDEpO1xuXG4gICAgICAvLyBBbmQgdGhlIG1lbW9yeSBjb3B5IGlzIGdvbmUgcmF0aGVyIHRoYW4gY2hlY2tlZCBhZ2FpbiBuZXh0IHRpbWUuXG4gICAgICBzMy5nZXQubW9ja1Jlc29sdmVkVmFsdWUobnVsbCk7XG4gICAgICBleHBlY3QoYXdhaXQgY2FjaGVIYW5kbGVyLmdldChcImJsb2dcIiwgZ2V0Q3R4KSkudG9CZU51bGwoKTtcbiAgICB9KTtcblxuICAgIGl0KFwia2VlcHMgbWVtb3J5IGVudHJpZXMgYWNyb3NzIHJlc2V0UmVxdWVzdENhY2hlXCIsIGFzeW5jICgpID0+IHtcbiAgICAgIC8vIE5leHQuanMgY2FsbHMgaXQgYXQgdGhlIHN0YXJ0IG9mIGV2ZXJ5IHJlcXVlc3Q7IGNsZWFyaW5nIHRoZSBzaGFyZWRcbiAgICAgIC8vIG1lbW9yeSBjYWNoZSB0aGVyZSBzZW50IGV2ZXJ5IHJlYWQgdG8gUzMuXG4gICAgICBjb25zdCB0ZXN0RGF0YTogSW5jcmVtZW50YWxDYWNoZVZhbHVlID0ge1xuICAgICAgICBraW5kOiBDYWNoZWRSb3V0ZUtpbmQuQVBQX1BBR0UsXG4gICAgICAgIGh0bWw6IFwiPGh0bWw+cmVzZXQ8L2h0bWw+XCIsXG4gICAgICAgIHJzY0RhdGE6IHVuZGVmaW5lZCxcbiAgICAgICAgaGVhZGVyczogdW5kZWZpbmVkLFxuICAgICAgICBwb3N0cG9uZWQ6IHVuZGVmaW5lZCxcbiAgICAgICAgc2VnbWVudERhdGE6IHVuZGVmaW5lZCxcbiAgICAgICAgc3RhdHVzOiB1bmRlZmluZWQsXG4gICAgICB9O1xuXG4gICAgICAvLyBBZGQgZW50cnlcbiAgICAgIGF3YWl0IGNhY2hlSGFuZGxlci5zZXQoXCJyZXNldC1rZXlcIiwgdGVzdERhdGEsIHtcbiAgICAgICAgZmV0Y2hDYWNoZTogdHJ1ZSBhcyBjb25zdCxcbiAgICAgICAgdGFnczogW1wicmVzZXQtdGFnXCJdLFxuICAgICAgfSk7XG5cbiAgICAgIC8vIFJlc2V0XG4gICAgICBhd2FpdCBjYWNoZUhhbmRsZXIucmVzZXRSZXF1ZXN0Q2FjaGUoKTtcblxuICAgICAgLy8gU3RpbGwgYW5zd2VyZWQgZnJvbSBtZW1vcnksIHdpdGhvdXQgYXNraW5nIFMzLlxuICAgICAgY29uc3QgczMgPSB7XG4gICAgICAgIGdldDogamVzdC5mbigpLm1vY2tSZXNvbHZlZFZhbHVlKG51bGwpLFxuICAgICAgICBpc1JldmFsaWRhdGVkOiBqZXN0LmZuKCkubW9ja1Jlc29sdmVkVmFsdWUoZmFsc2UpLFxuICAgICAgfTtcbiAgICAgIChjYWNoZUhhbmRsZXIgYXMgYW55KS5zM0R5bmFtb0hhbmRsZXIgPSBzMztcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGNhY2hlSGFuZGxlci5nZXQoXCJyZXNldC1rZXlcIiwge1xuICAgICAgICBraW5kOiBJbmNyZW1lbnRhbENhY2hlS2luZC5BUFBfUEFHRSxcbiAgICAgICAgaXNGYWxsYmFjazogZmFsc2UsXG4gICAgICB9KTtcbiAgICAgIGV4cGVjdChyZXN1bHQ/LnZhbHVlKS50b0VxdWFsKHRlc3REYXRhKTtcbiAgICAgIGV4cGVjdChzMy5nZXQpLm5vdC50b0hhdmVCZWVuQ2FsbGVkKCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKFwiQnVpbGQtdGltZSBiZWhhdmlvclwiLCAoKSA9PiB7XG4gICAgaXQoXCJyZWFkcyBiYWNrIGEgZmV0Y2ggZW50cnkgaXQgd3JvdGUsIGZyb20gbWVtb3J5IGFuZCBmcm9tIGRpc2tcIiwgYXN5bmMgKCkgPT4ge1xuICAgICAgLy8gYGNhY2hlQ29tcG9uZW50c2AgcHJlcmVuZGVycyBlYWNoIHBhZ2UgdHdpY2U6IHRoZSBmaXJzdCBwYXNzIHJ1bnMgdGhlXG4gICAgICAvLyBgZmV0Y2hgIGFuZCBgc2V0YHMgaXQsIHRoZSBzZWNvbmQgbXVzdCBmaW5kIGl0IGFscmVhZHkgY2FjaGVkIG9yIE5leHQuanNcbiAgICAgIC8vIGZhaWxzIHRoZSBidWlsZCB3aXRoIFwiZW5jb3VudGVyZWQgdW5jYWNoZWQgb3IgcnVudGltZSBkYXRhIGR1cmluZ1xuICAgICAgLy8gcHJlcmVuZGVyaW5nXCIuIEEgd3JpdGUtb25seSBidWlsZC10aW1lIGhhbmRsZXIgdGhlcmVmb3JlIG1ha2VzXG4gICAgICAvLyBgY2FjaGU6ICdmb3JjZS1jYWNoZSdgIHVuYnVpbGRhYmxlIC0gbWVhc3VyZWQgYWdhaW5zdCBuZXh0LmpzJ3NcbiAgICAgIC8vIGB0ZXN0L2UyZS9hcHAtZGlyL3Jlc3VtZS1kYXRhLWNhY2hlYC5cbiAgICAgIHByb2Nlc3MuZW52Lk5FWFRfUEhBU0UgPSBcInBoYXNlLXByb2R1Y3Rpb24tYnVpbGRcIjtcbiAgICAgIHByb2Nlc3MuZW52LkNES19ORVhUSlNfSU5JVF9DQUNIRV9ESVIgPSBta2R0ZW1wU3luYyhcbiAgICAgICAgam9pbih0bXBkaXIoKSwgXCJjZGstbmV4dGpzLWluaXQtY2FjaGUtXCIpLFxuICAgICAgKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGRhdGE6IEluY3JlbWVudGFsQ2FjaGVWYWx1ZSA9IHtcbiAgICAgICAgICBraW5kOiBDYWNoZWRSb3V0ZUtpbmQuRkVUQ0gsXG4gICAgICAgICAgZGF0YToge1xuICAgICAgICAgICAgaGVhZGVyczoge30sXG4gICAgICAgICAgICBib2R5OiBcImV5SnlZVzVrYjIwaU9qRjlcIixcbiAgICAgICAgICAgIHN0YXR1czogMjAwLFxuICAgICAgICAgICAgdXJsOiBcImh0dHBzOi8vZXhhbXBsZS50ZXN0L2FwaS9yYW5kb21cIixcbiAgICAgICAgICB9LFxuICAgICAgICAgIHJldmFsaWRhdGU6IDMxNTM2MDAwLFxuICAgICAgICB9O1xuICAgICAgICBjb25zdCBmZXRjaFVybCA9IFwiaHR0cHM6Ly9leGFtcGxlLnRlc3QvYXBpL3JhbmRvbVwiO1xuICAgICAgICBjb25zdCBzZXRDdHggPSB7XG4gICAgICAgICAgZmV0Y2hDYWNoZTogdHJ1ZSBhcyBjb25zdCxcbiAgICAgICAgICB0YWdzOiBbXCJ0ZXN0XCJdLFxuICAgICAgICAgIGZldGNoVXJsLFxuICAgICAgICAgIGZldGNoSWR4OiAxLFxuICAgICAgICB9O1xuICAgICAgICBjb25zdCBnZXRDdHg6IEdldEluY3JlbWVudGFsRmV0Y2hDYWNoZUNvbnRleHQgPSB7XG4gICAgICAgICAga2luZDogSW5jcmVtZW50YWxDYWNoZUtpbmQuRkVUQ0gsXG4gICAgICAgICAgcmV2YWxpZGF0ZTogMzE1MzYwMDAsXG4gICAgICAgICAgZmV0Y2hVcmwsXG4gICAgICAgICAgZmV0Y2hJZHg6IDEsXG4gICAgICAgICAgdGFnczogW1widGVzdFwiXSxcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgYnVpbGRIYW5kbGVyID0gbmV3IENka05leHRqc0NhY2hlSGFuZGxlcihjcmVhdGVNb2NrQ29udGV4dCgpKTtcbiAgICAgICAgYXdhaXQgYnVpbGRIYW5kbGVyLnNldChcImZldGNoLWtleVwiLCBkYXRhLCBzZXRDdHgpO1xuICAgICAgICBleHBlY3QoYXdhaXQgYnVpbGRIYW5kbGVyLmdldChcImZldGNoLWtleVwiLCBnZXRDdHgpKS50b01hdGNoT2JqZWN0KHtcbiAgICAgICAgICB2YWx1ZTogZGF0YSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gQSBzZWNvbmQgaW5zdGFuY2UgcmVhZHMgdGhlIGZpbGUgcmF0aGVyIHRoYW4gdGhlIG1hcDogYG5leHQgYnVpbGRgXG4gICAgICAgIC8vIHJlbmRlcnMgcGFnZXMgaW4gd29ya2VyIHByb2Nlc3Nlcywgc28gdGhlIHBhc3MgdGhhdCB3cml0ZXMgYW5kIHRoZVxuICAgICAgICAvLyBwYXNzIHRoYXQgcmVhZHMgYXJlIG5vdCBhbHdheXMgdGhlIHNhbWUgcHJvY2Vzcy5cbiAgICAgICAgY29uc3Qgb3RoZXJXb3JrZXIgPSBuZXcgQ2RrTmV4dGpzQ2FjaGVIYW5kbGVyKGNyZWF0ZU1vY2tDb250ZXh0KCkpO1xuICAgICAgICBleHBlY3QoYXdhaXQgb3RoZXJXb3JrZXIuZ2V0KFwiZmV0Y2gta2V5XCIsIGdldEN0eCkpLnRvTWF0Y2hPYmplY3Qoe1xuICAgICAgICAgIHZhbHVlOiBkYXRhLFxuICAgICAgICB9KTtcbiAgICAgICAgZXhwZWN0KGF3YWl0IG90aGVyV29ya2VyLmdldChcIm5ldmVyLXdyaXR0ZW5cIiwgZ2V0Q3R4KSkudG9CZU51bGwoKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIGRlbGV0ZSBwcm9jZXNzLmVudi5ORVhUX1BIQVNFO1xuICAgICAgICBkZWxldGUgcHJvY2Vzcy5lbnYuQ0RLX05FWFRKU19JTklUX0NBQ0hFX0RJUjtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIFRoZSBzZWVkIGlzIHVwbG9hZGVkIGFzIHdyaXR0ZW4sIHNvIGl0IG11c3QgYmUgZmlsZWQgdW5kZXIgdGhlIG5hbWUgdGhlXG4gICAgLy8gcnVudGltZSdzIGBnZXRgIHJlYWRzOiBmb3IgYSBuYW1lIHRvbyBsb25nIGZvciBTMywgYGNhY2hlT2JqZWN0TmFtZWAncy5cbiAgICBpdChcImZpbGVzIGFuIG92ZXItbG9uZyBrZXkgd2hlcmUgdGhlIHJ1bnRpbWUgcmVhZHMgaXRcIiwgYXN5bmMgKCkgPT4ge1xuICAgICAgcHJvY2Vzcy5lbnYuTkVYVF9QSEFTRSA9IFwicGhhc2UtcHJvZHVjdGlvbi1idWlsZFwiO1xuICAgICAgY29uc3QgY2FjaGVEaXIgPSBta2R0ZW1wU3luYyhqb2luKHRtcGRpcigpLCBcImNkay1uZXh0anMtaW5pdC1jYWNoZS1cIikpO1xuICAgICAgcHJvY2Vzcy5lbnYuQ0RLX05FWFRKU19JTklUX0NBQ0hFX0RJUiA9IGNhY2hlRGlyO1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3Qga2V5ID0gYC9yb3V0ZS1jYWNoZS9BUFBfUEFHRS8ke1wiYVwiLnJlcGVhdCg2NCl9LyQvJHtcInhcIi5yZXBlYXQoOTAwKX1gO1xuICAgICAgICBleHBlY3QoY2FjaGVPYmplY3ROYW1lKGtleSkpLnRvTWF0Y2goL15fbG9uZy1rZXlcXC8vKTtcbiAgICAgICAgY29uc3QgZGF0YTogSW5jcmVtZW50YWxDYWNoZVZhbHVlID0ge1xuICAgICAgICAgIGtpbmQ6IENhY2hlZFJvdXRlS2luZC5GRVRDSCxcbiAgICAgICAgICBkYXRhOiB7IGhlYWRlcnM6IHt9LCBib2R5OiBcImUzMD1cIiwgc3RhdHVzOiAyMDAsIHVybDogXCJcIiB9LFxuICAgICAgICAgIHJldmFsaWRhdGU6IDYwLFxuICAgICAgICB9O1xuICAgICAgICBjb25zdCBzZXRDdHggPSB7IGZldGNoQ2FjaGU6IHRydWUgYXMgY29uc3QsIHRhZ3M6IFtdIH07XG4gICAgICAgIGF3YWl0IG5ldyBDZGtOZXh0anNDYWNoZUhhbmRsZXIoY3JlYXRlTW9ja0NvbnRleHQoKSkuc2V0KFxuICAgICAgICAgIGtleSxcbiAgICAgICAgICBkYXRhLFxuICAgICAgICAgIHNldEN0eCxcbiAgICAgICAgKTtcbiAgICAgICAgZXhwZWN0KGV4aXN0c1N5bmMoam9pbihjYWNoZURpciwgY2FjaGVPYmplY3ROYW1lKGtleSkpKSkudG9CZSh0cnVlKTtcbiAgICAgICAgY29uc3QgZ2V0Q3R4OiBHZXRJbmNyZW1lbnRhbEZldGNoQ2FjaGVDb250ZXh0ID0ge1xuICAgICAgICAgIGtpbmQ6IEluY3JlbWVudGFsQ2FjaGVLaW5kLkZFVENILFxuICAgICAgICAgIHJldmFsaWRhdGU6IDYwLFxuICAgICAgICAgIHRhZ3M6IFtdLFxuICAgICAgICB9O1xuICAgICAgICBleHBlY3QoXG4gICAgICAgICAgYXdhaXQgbmV3IENka05leHRqc0NhY2hlSGFuZGxlcihjcmVhdGVNb2NrQ29udGV4dCgpKS5nZXQoa2V5LCBnZXRDdHgpLFxuICAgICAgICApLnRvTWF0Y2hPYmplY3QoeyB2YWx1ZTogZGF0YSB9KTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIGRlbGV0ZSBwcm9jZXNzLmVudi5ORVhUX1BIQVNFO1xuICAgICAgICBkZWxldGUgcHJvY2Vzcy5lbnYuQ0RLX05FWFRKU19JTklUX0NBQ0hFX0RJUjtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdfQ==
@@ -1,3 +1,4 @@
1
+ import type { CacheControl } from "next/dist/server/lib/cache-control";
1
2
  import type { CacheHandler } from "next/dist/server/lib/incremental-cache";
2
3
  /**
3
4
  * Serialize cache value with custom handling for Map and Buffer objects
@@ -167,3 +168,24 @@ export type SetCacheHandlerContext = Parameters<CacheHandler["set"]>[2];
167
168
  * Helper to safely extract tags from context
168
169
  */
169
170
  export declare function getTags(ctx: SetCacheHandlerContext): string[] | undefined;
171
+ /**
172
+ * The lifetime a response entry was rendered with: `ctx.cacheControl`, which
173
+ * `ResponseCache.set` passes and a `fetch` entry's `set` does not (its
174
+ * `revalidate` is inside the value).
175
+ *
176
+ * Stored with the entry and handed back from `get`, because next 16.4 prefers
177
+ * it there over its own per-process `SharedCacheControls`. Without it a fresh
178
+ * instance only knows what the prerender manifest recorded at build time, so a
179
+ * page whose lifetime was decided at render (`cacheLife`, a `fetch`'s
180
+ * `revalidate`, `getStaticProps` returning another `revalidate`) was aged by
181
+ * the build-time value until that instance rendered it itself, and a path the
182
+ * manifest does not cover by Next.js's default of 1 second: every cold Lambda
183
+ * served it stale and regenerated it. Older `next` ignores the field.
184
+ */
185
+ export declare function getCacheControl(ctx: SetCacheHandlerContext): CacheControl | undefined;
186
+ /**
187
+ * `value` if it is a {@link CacheControl}, as read back off a stored entry.
188
+ * Anything else is dropped rather than handed to Next.js, which ages the entry
189
+ * by it: Next.js then falls back to the lifetime it knows, as before 16.4.
190
+ */
191
+ export declare function storedCacheControl(value: unknown): CacheControl | undefined;
@@ -13,6 +13,8 @@ exports.groupPrerenders = groupPrerenders;
13
13
  exports.appPageCacheHeaders = appPageCacheHeaders;
14
14
  exports.headerTags = headerTags;
15
15
  exports.getTags = getTags;
16
+ exports.getCacheControl = getCacheControl;
17
+ exports.storedCacheControl = storedCacheControl;
16
18
  /*
17
19
  Shared cache utility functions
18
20
  */
@@ -385,4 +387,45 @@ exports.INIT_CACHE_TAG_MANIFEST = "_cdk-nextjs-tag-manifest.json";
385
387
  function getTags(ctx) {
386
388
  return "tags" in ctx ? ctx.tags : undefined;
387
389
  }
388
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FjaGUtdXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYWRhcHRlci9jYWNoZS11dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUE2REEsa0RBS0M7QUFnQkQsMENBd0JDO0FBYUQsMERBY0M7QUFHRCw0Q0FRQztBQUdELDhCQUVDO0FBaUNELDBDQU1DO0FBYUQsOERBYUM7QUFvQkQsa0RBT0M7QUFtREQsMENBb0RDO0FBc0NELGtEQVVDO0FBY0QsZ0NBS0M7QUFpQ0QsMEJBRUM7QUE5YkQ7O0VBRUU7QUFDRiw2Q0FBeUM7QUFDekMseUNBQWdDO0FBRWhDLGtEQUFtRDtBQUVuRDs7O0dBR0c7QUFDSCxTQUFTLGVBQWUsQ0FBQyxLQUFVO0lBQ2pDLHdCQUF3QjtJQUN4QixJQUFJLEtBQUssSUFBSSxJQUFJLEVBQUUsQ0FBQztRQUNsQixPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFRCx5RUFBeUU7SUFDekUsd0VBQXdFO0lBQ3hFLHlEQUF5RDtJQUN6RCxJQUFJLE1BQU0sQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUMzQixPQUFPO1lBQ0wsTUFBTSxFQUFFLFFBQVE7WUFDaEIsTUFBTSxFQUFFLEtBQUssQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDO1NBQ2pDLENBQUM7SUFDSixDQUFDO0lBRUQsbUNBQW1DO0lBQ25DLElBQUksS0FBSyxZQUFZLEdBQUcsRUFBRSxDQUFDO1FBQ3pCLE1BQU0sT0FBTyxHQUF3QixFQUFFLENBQUM7UUFDeEMsS0FBSyxNQUFNLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxJQUFJLEtBQUssQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDO1lBQ3pDLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxlQUFlLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDdEMsQ0FBQztRQUNELE9BQU87WUFDTCxNQUFNLEVBQUUsS0FBSztZQUNiLElBQUksRUFBRSxPQUFPO1NBQ2Qs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QUFldkU7O0dBRUc7QUFDSCxTQUFnQixPQUFPLENBQUMsR0FBMkI7SUFDakQsT0FBTyxNQUFNLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7QUFDOUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gIFNoYXJlZCBjYWNoZSB1dGlsaXR5IGZ1bmN0aW9uc1xuKi9cbmltcG9ydCB7IGNyZWF0ZUhhc2ggfSBmcm9tIFwibm9kZTpjcnlwdG9cIjtcbmltcG9ydCB7IHNlcCB9IGZyb20gXCJub2RlOnBhdGhcIjtcbmltcG9ydCB0eXBlIHsgQ2FjaGVIYW5kbGVyIH0gZnJvbSBcIm5leHQvZGlzdC9zZXJ2ZXIvbGliL2luY3JlbWVudGFsLWNhY2hlXCI7XG5pbXBvcnQgeyBoYXNQYXRoUHJlZml4IH0gZnJvbSBcIi4uL3V0aWxzL2Jhc2UtcGF0aFwiO1xuXG4vKipcbiAqIFByZS1wcm9jZXNzIHZhbHVlIHRvIGNvbnZlcnQgQnVmZmVycyBhbmQgTWFwcyBiZWZvcmUgSlNPTi5zdHJpbmdpZnlcbiAqIFRoaXMgaXMgbmVjZXNzYXJ5IGJlY2F1c2UgQnVmZmVyLnRvSlNPTigpIGlzIGNhbGxlZCBiZWZvcmUgcmVwbGFjZXIgZnVuY3Rpb25zXG4gKi9cbmZ1bmN0aW9uIHByZXByb2Nlc3NWYWx1ZSh2YWx1ZTogYW55KTogYW55IHtcbiAgLy8gSGFuZGxlIG51bGwvdW5kZWZpbmVkXG4gIGlmICh2YWx1ZSA9PSBudWxsKSB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG5cbiAgLy8gQ29udmVydCBCdWZmZXIgdG8gb3VyIGN1c3RvbSBmb3JtYXQuIGJhc2U2NCwgbm90IHRoZSBhcnJheSBvZiBwZXItYnl0ZVxuICAvLyBpbnRlZ2VycyB0aGlzIHVzZWQgdG8gd3JpdGUgKGFuZCB0aGF0IGBCdWZmZXIudG9KU09OKClgIHdyaXRlcykg4oCUIHNlZVxuICAvLyB7QGxpbmsgcGFyc2VDYWNoZVZhbHVlfSBmb3Igd2h5IHRoYXQgbWF0dGVyZWQgc28gbXVjaC5cbiAgaWYgKEJ1ZmZlci5pc0J1ZmZlcih2YWx1ZSkpIHtcbiAgICByZXR1cm4ge1xuICAgICAgX190eXBlOiBcIkJ1ZmZlclwiLFxuICAgICAgYmFzZTY0OiB2YWx1ZS50b1N0cmluZyhcImJhc2U2NFwiKSxcbiAgICB9O1xuICB9XG5cbiAgLy8gQ29udmVydCBNYXAgdG8gb3VyIGN1c3RvbSBmb3JtYXRcbiAgaWYgKHZhbHVlIGluc3RhbmNlb2YgTWFwKSB7XG4gICAgY29uc3QgZW50cmllczogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9O1xuICAgIGZvciAoY29uc3QgW2tleSwgdmFsXSBvZiB2YWx1ZS5lbnRyaWVzKCkpIHtcbiAgICAgIGVudHJpZXNba2V5XSA9IHByZXByb2Nlc3NWYWx1ZSh2YWwpO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgX190eXBlOiBcIk1hcFwiLFxuICAgICAgZGF0YTogZW50cmllcyxcbiAgICB9O1xuICB9XG5cbiAgLy8gUmVjdXJzaXZlbHkgcHJvY2VzcyBhcnJheXNcbiAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgcmV0dXJuIHZhbHVlLm1hcCgoaXRlbSkgPT4gcHJlcHJvY2Vzc1ZhbHVlKGl0ZW0pKTtcbiAgfVxuXG4gIC8vIFJlY3Vyc2l2ZWx5IHByb2Nlc3Mgb2JqZWN0c1xuICBpZiAodHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiKSB7XG4gICAgY29uc3QgcHJvY2Vzc2VkOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge307XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWxdIG9mIE9iamVjdC5lbnRyaWVzKHZhbHVlKSkge1xuICAgICAgcHJvY2Vzc2VkW2tleV0gPSBwcmVwcm9jZXNzVmFsdWUodmFsKTtcbiAgICB9XG4gICAgcmV0dXJuIHByb2Nlc3NlZDtcbiAgfVxuXG4gIC8vIFJldHVybiBwcmltaXRpdmVzIGFzLWlzXG4gIHJldHVybiB2YWx1ZTtcbn1cblxuLyoqXG4gKiBTZXJpYWxpemUgY2FjaGUgdmFsdWUgd2l0aCBjdXN0b20gaGFuZGxpbmcgZm9yIE1hcCBhbmQgQnVmZmVyIG9iamVjdHNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNlcmlhbGl6ZUNhY2hlVmFsdWUodmFsdWU6IGFueSk6IHN0cmluZyB7XG4gIC8vIFByZS1wcm9jZXNzIHRvIGNvbnZlcnQgQnVmZmVycyBhbmQgTWFwcyBiZWZvcmUgSlNPTi5zdHJpbmdpZnlcbiAgLy8gVGhpcyBlbnN1cmVzIEJ1ZmZlci50b0pTT04oKSBkb2Vzbid0IGludGVyZmVyZVxuICBjb25zdCBwcm9jZXNzZWQgPSBwcmVwcm9jZXNzVmFsdWUodmFsdWUpO1xuICByZXR1cm4gSlNPTi5zdHJpbmdpZnkocHJvY2Vzc2VkKTtcbn1cblxuLyoqXG4gKiBQYXJzZSBjYWNoZSB2YWx1ZSB3aXRoIGN1c3RvbSBoYW5kbGluZyBmb3IgTWFwIGFuZCBCdWZmZXIgb2JqZWN0c1xuICpcbiAqIEJ1ZmZlcnMgYXJlIHJlYWQgYmFjayBmcm9tIGJhc2U2NCB3aGVuIHRoYXQgaXMgaG93IHRoZXkgd2VyZSB3cml0dGVuLCBhbmQgZnJvbVxuICogYW4gYXJyYXkgb2YgcGVyLWJ5dGUgaW50ZWdlcnMgd2hlbiB0aGV5IHdlcmUgbm90LiBUaGF0IGFycmF5IGlzIHRoZSBmb3JtYXRcbiAqIGBCdWZmZXIudG9KU09OKClgIHByb2R1Y2VzIGFuZCB0aGUgb25lIHRoaXMgY29kZSB1c2VkIHRvIHdyaXRlLCBhbmQgaXQgaXNcbiAqIHJ1aW5vdXMgZm9yIGEgcGFnZSB3aXRoIGEgbGFyZ2UgcGF5bG9hZDogYSAxIE1pQiBwcmVyZW5kZXIgYmVjYW1lIH4zIE1pQiBvZlxuICogSlNPTiB0ZXh0LCBhbiAxMS42IE1pQiBjYWNoZSBlbnRyeSBvbmNlIGh0bWwgYW5kIHRoZSBwZXItc2VnbWVudCBjb3BpZXMgYXJlXG4gKiBjb3VudGVkLCBhbmQg4oCUIGJlY2F1c2UgYEpTT04ucGFyc2VgJ3MgcmV2aXZlciBydW5zIGZvciAqZXZlcnkgYXJyYXkgZWxlbWVudCog4oCUXG4gKiB1cHdhcmRzIG9mIHRocmVlIG1pbGxpb24gcmV2aXZlciBjYWxscyB0byByZWFkIG9uZSBwYWdlLiBNZWFzdXJlZCBhZ2FpbnN0IGFcbiAqIGRlcGxveW1lbnQ6IDQuOHMgb2YgTGFtYmRhIHRpbWUgdG8gYW5zd2VyIGEgMSBNaUIgc2VnbWVudCBwcmVmZXRjaCwgYWdhaW5zdFxuICogNDVtcyBmb3IgYSBzbWFsbCBvbmUgZnJvbSB0aGUgc2FtZSBjYWNoZS4gYmFzZTY0IGlzIDQvMyB0aGUgYnl0ZXMgcmF0aGVyIHRoYW5cbiAqIH4zeCwgYW5kIGBCdWZmZXIuZnJvbShzdHIsIFwiYmFzZTY0XCIpYCBpcyBvbmUgbmF0aXZlIGNhbGwuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUNhY2hlVmFsdWUoanNvblN0cmluZzogc3RyaW5nKTogYW55IHtcbiAgcmV0dXJuIEpTT04ucGFyc2UoanNvblN0cmluZywgKF9rZXksIHZhbCkgPT4ge1xuICAgIC8vIFJlc3RvcmUgTWFwIG9iamVjdHMgdGhhdCB3ZXJlIHNlcmlhbGl6ZWQgd2l0aCBfX3R5cGUgbWFya2VyXG4gICAgaWYgKHZhbCAmJiB0eXBlb2YgdmFsID09PSBcIm9iamVjdFwiICYmIHZhbC5fX3R5cGUgPT09IFwiTWFwXCIpIHtcbiAgICAgIHJldHVybiBuZXcgTWFwKE9iamVjdC5lbnRyaWVzKHZhbC5kYXRhKSk7XG4gICAgfVxuICAgIC8vIFJlc3RvcmUgQnVmZmVyIG9iamVjdHMgdGhhdCB3ZXJlIHNlcmlhbGl6ZWQgd2l0aCBfX3R5cGUgbWFya2VyIChvdXIgY3VzdG9tIGZvcm1hdClcbiAgICBpZiAodmFsICYmIHR5cGVvZiB2YWwgPT09IFwib2JqZWN0XCIgJiYgdmFsLl9fdHlwZSA9PT0gXCJCdWZmZXJcIikge1xuICAgICAgcmV0dXJuIHR5cGVvZiB2YWwuYmFzZTY0ID09PSBcInN0cmluZ1wiXG4gICAgICAgID8gQnVmZmVyLmZyb20odmFsLmJhc2U2NCwgXCJiYXNlNjRcIilcbiAgICAgICAgOiBCdWZmZXIuZnJvbSh2YWwuZGF0YSk7XG4gICAgfVxuICAgIC8vIFJlc3RvcmUgQnVmZmVyIG9iamVjdHMgdGhhdCB3ZXJlIHNlcmlhbGl6ZWQgd2l0aCBOb2RlLmpzIGRlZmF1bHQgQnVmZmVyLnRvSlNPTigpIGZvcm1hdFxuICAgIC8vIFRoaXMgaGFuZGxlcyBsZWdhY3kgY2FjaGUgZW50cmllcyBvciBydW50aW1lLWdlbmVyYXRlZCBlbnRyaWVzXG4gICAgaWYgKFxuICAgICAgdmFsICYmXG4gICAgICB0eXBlb2YgdmFsID09PSBcIm9iamVjdFwiICYmXG4gICAgICB2YWwudHlwZSA9PT0gXCJCdWZmZXJcIiAmJlxuICAgICAgQXJyYXkuaXNBcnJheSh2YWwuZGF0YSlcbiAgICApIHtcbiAgICAgIHJldHVybiBCdWZmZXIuZnJvbSh2YWwuZGF0YSk7XG4gICAgfVxuICAgIHJldHVybiB2YWw7XG4gIH0pO1xufVxuXG4vKipcbiAqIFRoZSBjYWNoZSBrZXkgYSBwcmVyZW5kZXJlZCByb3V0ZSdzIHNlZWRlZCBlbnRyeSBoYXMgdG8gYmUgd3JpdHRlbiB1bmRlci5cbiAqXG4gKiBgY3R4Lm91dHB1dHMucHJlcmVuZGVyc1tdLnBhdGhuYW1lYCBpcyB0aGUgKlVSTCogdGhlIHBhZ2UgaXMgc2VydmVkIGF0LCBzbyBpdFxuICogY2FycmllcyB0aGUgYXBwJ3MgYGJhc2VQYXRoYC4gVGhlIGtleSB0aGUgc2VydmVyIGxhdGVyIGxvb2tzIGVudHJpZXMgdXAgdW5kZXJcbiAqIGlzIHRoZSByb3V0ZSwgd2hpY2ggZG9lcyBub3Qg4oCUIE5leHQuanMgc3RyaXBzIGBiYXNlUGF0aGAgYmVmb3JlIHJvdXRpbmcsIHNvIHRoZVxuICogY2FjaGUgaGFuZGxlciBuZXZlciBzZWVzIGl0IGF0IHJlcXVlc3QgdGltZS4gU2VlZGluZyBgL3Byb2Qvc3NnLzFgIHZlcmJhdGltXG4gKiB0aGVyZWZvcmUgd3JpdGVzIGA8YnVpbGRJZD4vcHJvZC9zc2cvMS5qc29uYCB3aGlsZSB0aGUgc2VydmVyIGFza3MgZm9yXG4gKiBgPGJ1aWxkSWQ+L3NzZy8xLmpzb25gOiBldmVyeSBidWlsZC10aW1lIHByZXJlbmRlciBpcyBhIE1JU1MgdGhhdCByZS1yZW5kZXJzIG9uXG4gKiBmaXJzdCByZXF1ZXN0LCBhbmQgdGhlIHBhZ2UgaXMgb25seSBcInN0YXRpY1wiIGZyb20gdGhlIHNlY29uZCB2aXNpdCBvbndhcmRzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcHJlcmVuZGVyUGF0aFRvQ2FjaGVLZXkoXG4gIHBhdGhuYW1lOiBzdHJpbmcsXG4gIGJhc2VQYXRoOiBzdHJpbmcsXG4pOiBzdHJpbmcge1xuICAvLyBNYXRjaGluZyBvbiBhIHBhdGggYm91bmRhcnkgc28gYSBzaWJsaW5nIHJvdXRlIGxpa2UgYC9wcm9kdWN0aW9uYCBpcyBub3RcbiAgLy8gcmVhZCBhcyBiYXNlUGF0aCBgL3Byb2RgIHBsdXMgYHVjdGlvbmAuXG4gIGNvbnN0IHJvdXRlID0gKFxuICAgIGhhc1BhdGhQcmVmaXgocGF0aG5hbWUsIGJhc2VQYXRoKVxuICAgICAgPyBwYXRobmFtZS5zbGljZShiYXNlUGF0aC5sZW5ndGgpXG4gICAgICA6IHBhdGhuYW1lXG4gIClcbiAgICAvLyBMZWFkaW5nIHNsYXNoZXMgd291bGQgbWFrZSBhbiBTMyBrZXkgd2l0aCBhbiBlbXB0eSBmaXJzdCBzZWdtZW50LlxuICAgIC5yZXBsYWNlKC9eXFwvKy8sIFwiXCIpO1xuICByZXR1cm4gcm91dGUgPT09IFwiXCIgPyBcImluZGV4XCIgOiByb3V0ZTtcbn1cblxuLyoqIGBidWlsZFMzS2V5YCB1bmRlciB0aGUgYnVpbGQgcHJlZml4OiBge2NhY2hlS2V5fS5qc29uYC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjYWNoZUtleUZpbGVOYW1lKGNhY2hlS2V5OiBzdHJpbmcpOiBzdHJpbmcge1xuICBsZXQgY2xlYW5DYWNoZUtleSA9IGNhY2hlS2V5O1xuICBpZiAoY2FjaGVLZXkgPT09IFwiL1wiIHx8IGNhY2hlS2V5ID09PSBcIlwiKSB7XG4gICAgY2xlYW5DYWNoZUtleSA9IFwiaW5kZXhcIjtcbiAgfSBlbHNlIGlmIChjYWNoZUtleS5zdGFydHNXaXRoKFwiL1wiKSkge1xuICAgIGNsZWFuQ2FjaGVLZXkgPSBjYWNoZUtleS5zbGljZSgxKTtcbiAgfVxuICByZXR1cm4gYCR7Y2xlYW5DYWNoZUtleX0uanNvbmA7XG59XG5cbi8qKiBgdmFsdWVgJ3MgU0hBLTI1NiBkaWdlc3QsIGluIGhleDogNjQgY2hhcmFjdGVycy4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzaGEyNTZIZXgodmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBjcmVhdGVIYXNoKFwic2hhMjU2XCIpLnVwZGF0ZSh2YWx1ZSkuZGlnZXN0KFwiaGV4XCIpO1xufVxuXG4vKiogUzMncyBsaW1pdCBvbiBhbiBvYmplY3Qga2V5LCBpbiBVVEYtOCBieXRlcy4gKi9cbmNvbnN0IE1BWF9TM19LRVlfQllURVMgPSAxMDI0O1xuXG4vKipcbiAqIFRoZSBsb25nZXN0IGJ1aWxkIElEIGNhY2hlIGVudHJpZXMgYXJlIHN0b3JlZCB1bmRlciwgd2hpY2hcbiAqIHtAbGluayBjYWNoZU9iamVjdE5hbWV9IGxlYXZlcyByb29tIGZvciBpbiBmcm9udCBvZiBpdCB3aXRoIGl0cyBgL2A6IGFcbiAqIE5leHQuanMgYnVpbGQgSUQgaXMgMjEgY2hhcmFjdGVycywgYW5kIHRoZSBgLTxkZXBsb3ltZW50SWQ+YCBjZGstbmV4dGpzXG4gKiBhcHBlbmRzIGlzIHRoZSBhcHAncyBvd24sIHNvIHRoZSBhZGFwdGVyIGZhaWxzIGEgYnVpbGQgd2hvc2UgSUQgaXMgbG9uZ2VyXG4gKiAoc2VlIGBhc3NlcnRCdWlsZElkRml0c2ApIHJhdGhlciB0aGFuIGxlYXZlIGxvbmcgbmFtZXMgdW53cml0YWJsZS5cbiAqL1xuZXhwb3J0IGNvbnN0IE1BWF9CVUlMRF9JRF9CWVRFUyA9IDEyNztcblxuLyoqXG4gKiBUaGUgZm9sZGVyIHVuZGVyIHRoZSBidWlsZCBwcmVmaXggdGhhdCBlbnRyaWVzIHdpdGggYW4gb3Zlci1sb25nIGtleSBhcmVcbiAqIHN0b3JlZCBpbi4gQHNlZSBjYWNoZU9iamVjdE5hbWVcbiAqL1xuZXhwb3J0IGNvbnN0IExPTkdfS0VZX1BSRUZJWCA9IFwiX2xvbmcta2V5XCI7XG5cbi8qKlxuICogV2hlcmUgdGhlIGVudHJ5IGBidWlsZFMzS2V5YCBuYW1lcyBpcyBzdG9yZWQsIHVuZGVyIHRoZSBidWlsZCBwcmVmaXg6XG4gKiBpdHMgb3duIG5hbWUsIG9yIGBfbG9uZy1rZXkve3NoYTI1Nn0ubG9uZ2AgZm9yIGEgbmFtZSB0aGF0IHdvdWxkIGxlYXZlIHRoZVxuICogd2hvbGUgb2JqZWN0IGtleSBwYXN0IFMzJ3MgMTAyNCBieXRlcy4gbmV4dCAxNi4zLjgncyByb3V0ZS1zY29wZWQga2V5cyBhcmVcbiAqIH44OCBieXRlcyBsb25nZXIgdGhhbiBhIHBhdGhuYW1lLCBlbm91Z2ggdG8gcHVzaCBhIGxvbmcgb25lIG92ZXIsIGFuZCBhXG4gKiByZWplY3RlZCBgUHV0T2JqZWN0YCBtZWFudCB0aGUgcGFnZSB3YXMgbmV2ZXIgY2FjaGVkLlxuICpcbiAqIE9ubHkgdGhlIG9iamVjdCBpcyBtb3ZlZDogYGJ1aWxkUzNLZXlgIHN0YXlzIHRoZSBlbnRyeSdzIG5hbWUgZm9yIHRhZ1xuICogbWFwcGluZ3MgYW5kIENsb3VkRnJvbnQgcGF0aHMsIHNpbmNlIGEgaGFzaCBuYW1lcyBubyByb3V0ZS4gRGVjaWRlZCBvbiB0aGVcbiAqIG5hbWUgYWxvbmUgcmF0aGVyIHRoYW4gdGhlIHdob2xlIGtleSBzbyB0aGUgaW5pdCBjYWNoZSwgd2hpY2ggaXMgd3JpdHRlblxuICogd2l0aG91dCB0aGUgYnVpbGQgSUQgaXQgaXMgZGVwbG95ZWQgdW5kZXIsIGZpbGVzIGEgc2VlZCB3aGVyZSB0aGUgcnVudGltZVxuICogcmVhZHMgaXQuIFRoZSBgLmxvbmdgIHN1ZmZpeCBrZWVwcyB0aGVzZSBkaXNqb2ludCBmcm9tIGV2ZXJ5IGAuanNvbmAgbmFtZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNhY2hlT2JqZWN0TmFtZShjYWNoZUtleTogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgbmFtZSA9IGNhY2hlS2V5RmlsZU5hbWUoY2FjaGVLZXkpO1xuICBpZiAoQnVmZmVyLmJ5dGVMZW5ndGgobmFtZSkgPD0gTUFYX1MzX0tFWV9CWVRFUyAtIChNQVhfQlVJTERfSURfQllURVMgKyAxKSkge1xuICAgIHJldHVybiBuYW1lO1xuICB9XG4gIHJldHVybiBgJHtMT05HX0tFWV9QUkVGSVh9LyR7c2hhMjU2SGV4KG5hbWUpfS5sb25nYDtcbn1cblxuLyoqXG4gKiBUaGUgcmVzcG9uc2UtY2FjaGUga2V5IG5leHQgPj0gMTYuMy44IHN0b3JlcyBhIHByZXJlbmRlciB1bmRlciwgcmVhZCBiYWNrIG9mZlxuICogdGhlIGZpbGUgYG5leHQgYnVpbGRgIHdyb3RlIGl0IHRvLCBvciBgdW5kZWZpbmVkYCBiZWZvcmUgMTYuMy44LlxuICpcbiAqIEZyb20gMTYuMy44IE5leHQuanMgc2NvcGVzIGV2ZXJ5IHBhZ2UncyBjYWNoZSBrZXkgYnkgaXRzIHNvdXJjZSByb3V0ZSAtXG4gKiBgL3JvdXRlLWNhY2hlLzxraW5kPi88c2hhMjU2KHNvdXJjZVJvdXRlKT4vJDxwYXRobmFtZT5gIChgZ2V0Um91dGVDYWNoZUtleWBcbiAqIGluIGBuZXh0L2Rpc3Qvc2VydmVyL2xpYi9yb3V0ZS1jYWNoZS1rZXkuanNgKSAtIGFuZCwgd2l0aCBhbiBhZGFwdGVyLCB3cml0ZXNcbiAqIGVhY2ggcHJlcmVuZGVyIHRvIGA8ZGlzdERpcj4vc2VydmVyLzxrZXk+PGV4dD5gLiBUaGUgZmlsZSBwYXRoIGlzIHRoZSBvbmx5XG4gKiBwbGFjZSBhbiBhZGFwdGVyIGlzIGhhbmRlZCB0aGF0IGtleSwgYW5kIHJlLWRlcml2aW5nIGl0IHdvdWxkIG1lYW4gcmUtcGlja2luZ1xuICogdGhlIHNvdXJjZSByb3V0ZSB0aGUgd2F5IGBidWlsZC1jb21wbGV0ZS5qc2AgZG9lcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJvdXRlQ2FjaGVLZXlGcm9tRmlsZVBhdGgoXG4gIGZpbGVQYXRoOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAvLyBUaGUgZmlyc3QgYC9zZXJ2ZXIvcm91dGUtY2FjaGUvYDogYSByb3V0ZSdzIG93biBwYXRobmFtZSBjYW4gY29udGFpbiBvbmVcbiAgLy8gYWZ0ZXIgaXQuIEJlZm9yZSAxNi4zLjggYSByb3V0ZSBvZiB0aGF0IG5hbWUgaXMgYWxsIHRoZXJlIGlzLCB3aGljaCB0aGVcbiAgLy8gcHJlZml4IGNoZWNrIGJlbG93IHJlamVjdHMuXG4gIGNvbnN0IHBhdGggPSBmaWxlUGF0aD8uc3BsaXQoc2VwKS5qb2luKFwiL1wiKTtcbiAgY29uc3QgYXQgPSBwYXRoPy5pbmRleE9mKFJPVVRFX0NBQ0hFX0RJUikgPz8gLTE7XG4gIGlmIChhdCA8IDApIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIGNvbnN0IGtleSA9IHBhdGghLnNsaWNlKGF0ICsgXCIvc2VydmVyL1wiLmxlbmd0aCkucmVwbGFjZSgvXFwuW14uL10rJC8sIFwiXCIpO1xuICByZXR1cm4gUk9VVEVfQ0FDSEVfS0VZX1BSRUZJWC50ZXN0KGtleSkgPyBrZXkgOiB1bmRlZmluZWQ7XG59XG5cbmNvbnN0IFJPVVRFX0NBQ0hFX0RJUiA9IFwiL3NlcnZlci9yb3V0ZS1jYWNoZS9cIjtcblxuLyoqXG4gKiBUaGUgc3RhcnQgb2YgYSBuZXh0ID49IDE2LjMuOCByZXNwb25zZS1jYWNoZSBrZXksIGxlYWRpbmcgc2xhc2ggZHJvcHBlZDpcbiAqIGByb3V0ZS1jYWNoZS88a2luZD4vPHNoYTI1Nihzb3VyY2VSb3V0ZSk+LyRgIChgZ2V0Um91dGVDYWNoZUtleWApLCBmb2xsb3dlZFxuICogYnkgdGhlIHBhdGhuYW1lLiBNYXRjaGVkIHdob2xlLCBzbyBhbiBvbGRlciBhcHAncyByb3V0ZSB0aGF0IGhhcHBlbnMgdG8gYmVcbiAqIG5hbWVkIGAvcm91dGUtY2FjaGUvLi4uYCBpcyBub3QgcmVhZCBhcyBvbmUuXG4gKi9cbmV4cG9ydCBjb25zdCBST1VURV9DQUNIRV9LRVlfUFJFRklYID1cbiAgL15yb3V0ZS1jYWNoZVxcL1tBLVpfXStcXC9bMC05YS1mXXs2NH1cXC9cXCQoPz1cXC8pLztcblxuLyoqXG4gKiBgZGVub3JtYWxpemVQYWdlUGF0aGAgKGBuZXh0L2Rpc3Qvc2hhcmVkL2xpYi9wYWdlLXBhdGgvZGVub3JtYWxpemUtcGFnZS1wYXRoLmpzYCksXG4gKiB0aGUgaW52ZXJzZSBvZiB0aGUgYG5vcm1hbGl6ZVBhZ2VQYXRoYCBhIHJvdXRlLWNhY2hlIGtleSdzIHBhdGhuYW1lIGdvZXNcbiAqIHRocm91Z2g6IGAvaW5kZXhgIGJhY2sgdG8gYC9gLCBhbmQgYC9pbmRleC8uLi5gIC0gaG93IGAvaW5kZXhgIGl0c2VsZiBhbmRcbiAqIGV2ZXJ5IHBhdGggdW5kZXIgaXQgYXJlIHNwZWxsZWQgLSBiYWNrIHRvIGAvLi4uYC4gUmVzdGF0ZWQgd2l0aG91dCBpdHNcbiAqIGR5bmFtaWMtcm91dGUgY2hlY2s6IGBzM0tleVRvSW52YWxpZGF0aW9uUGF0aGAgaGFzIGRyb3BwZWQgdGhvc2UgYWxyZWFkeS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlbm9ybWFsaXplUGFnZVBhdGgocGFnZVBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gIGlmIChwYWdlUGF0aCA9PT0gXCIvaW5kZXhcIikge1xuICAgIHJldHVybiBcIi9cIjtcbiAgfVxuICByZXR1cm4gcGFnZVBhdGguc3RhcnRzV2l0aChcIi9pbmRleC9cIilcbiAgICA/IHBhZ2VQYXRoLnNsaWNlKFwiL2luZGV4XCIubGVuZ3RoKVxuICAgIDogcGFnZVBhdGg7XG59XG5cbi8qKiBUaGUgb3V0cHV0cyBvbmUgcm91dGUgY29udHJpYnV0ZXMgdG8gYGN0eC5vdXRwdXRzLnByZXJlbmRlcnNgLiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcmVyZW5kZXJWYXJpYW50czxUPiB7XG4gIC8qKiBUaGUgSFRNTCByZW5kZXIuIEl0cyBwYXRobmFtZSBpcyB0aGUgcm91dGUsIHdpdGggbm8gc3VmZml4LiAqL1xuICBodG1sPzogVDtcbiAgLyoqIFRoZSBmbGlnaHQgcGF5bG9hZCwgYnVpbHQgYXMgYDxyb3V0ZT4ucnNjYCDigJQgYnV0IHNlZSB7QGxpbmsgZ3JvdXBQcmVyZW5kZXJzfS4gKi9cbiAgcnNjPzogVDtcbiAgLyoqIFBlci1zZWdtZW50IGZsaWdodCBwYXlsb2FkcywgdW5kZXIgYDxyb3V0ZT4uc2VnbWVudHMvYC4gKi9cbiAgc2VnbWVudHM6IFRbXTtcbiAgLyoqIEEgUGFnZXMgUm91dGVyIHJvdXRlJ3MgYHBhZ2VEYXRhYCwgYnVpbHQgYXMgaXRzIGAvX25leHQvZGF0YS9gIHJvdXRlLiAqL1xuICBkYXRhPzogVDtcbn1cblxuY29uc3QgSU5ERVhfU1VGRklYID0gXCIvaW5kZXhcIjtcblxuLyoqXG4gKiBBIFBhZ2VzIFJvdXRlciBkYXRhIHJvdXRlOiBgL19uZXh0L2RhdGEvPGJ1aWxkSWQ+LzxwYWdlPi5qc29uYCwgb3B0aW9uYWxseVxuICogYmVoaW5kIGEgYGJhc2VQYXRoYCAoYG5vcm1hbGl6ZVBhdGhuYW1lYCBpbiBOZXh0LmpzJ3MgYGJ1aWxkLWNvbXBsZXRlYCBwcmVmaXhlc1xuICogZXZlcnkgb3V0cHV0IHBhdGhuYW1lLCB0aGlzIG9uZSBpbmNsdWRlZCkuXG4gKlxuICogQ2FwdHVyZSAxIGlzIHRoYXQgcHJlZml4IGFuZCBjYXB0dXJlIDIgdGhlIHBhZ2UgcGF0aCB3aXRob3V0IGl0cyBgLmpzb25gLCBzb1xuICogYC9wcm9kL19uZXh0L2RhdGEvYWJjMTIzL2Jsb2cvaGVsbG8uanNvbmAgcmVjb21wb3NlcyB0byBgL3Byb2QvYmxvZy9oZWxsb2AuXG4gKi9cbmNvbnN0IFBBR0VTX0RBVEFfUEFUSE5BTUUgPSAvXiguKilcXC9fbmV4dFxcL2RhdGFcXC9bXi9dK1xcLyguKylcXC5qc29uJC87XG5cbi8qKlxuICogQ29sbGVjdCBgY3R4Lm91dHB1dHMucHJlcmVuZGVyc2AgaW50byBvbmUgZW50cnkgcGVyIHJvdXRlLlxuICpcbiAqIE5leHQuanMgZW1pdHMgdXAgdG8gdGhyZWUgc2hhcGVzIHBlciBwcmVyZW5kZXJlZCBBcHAgUm91dGVyIHJvdXRlIOKAlCBgL2Jsb2cvaGVsbG9gLFxuICogYC9ibG9nL2hlbGxvLnJzY2AsIGFuZCBgL2Jsb2cvaGVsbG8uc2VnbWVudHMvKi5zZWdtZW50LnJzY2Ag4oCUIGFuZCBhIGNhY2hlIGVudHJ5XG4gKiBuZWVkcyBhbGwgb2YgdGhlbSB0b2dldGhlciwgc28gdGhleSBoYXZlIHRvIGJlIGdyb3VwZWQgYnkgcm91dGUgYmVmb3JlIGFueXRoaW5nXG4gKiBjYW4gYmUgc2VlZGVkLiBBIFBhZ2VzIFJvdXRlciByb3V0ZSBlbWl0cyB0d286IHRoZSBIVE1MLCBhbmQgaXRzIGBwYWdlRGF0YWAgYXRcbiAqIHRoZSByb3V0ZSdzIGAvX25leHQvZGF0YS88YnVpbGRJZD4vPHBhZ2U+Lmpzb25gIHBhdGhuYW1lXG4gKiAoe0BsaW5rIFBBR0VTX0RBVEFfUEFUSE5BTUV9KS4gVGhhdCBvbmUgaXMgbm90IGEgc3VmZml4IG9mIHRoZSBwYWdlJ3Mgb3duXG4gKiBwYXRobmFtZSwgc28gaXQgaXMgbWF0Y2hlZCByYXRoZXIgdGhhbiBzdHJpcHBlZC5cbiAqXG4gKiBUaGUgb25lIGNhc2UgdGhhdCBpcyBub3QgYSBzdWZmaXggc3RyaXAgaXMgdGhlICoqcm9vdCByb3V0ZSoqLCB3aGljaCBjYW5ub3QgYmVcbiAqIG5hbWVkIGAvLnJzY2A6IGl0cyBwYXlsb2FkcyBhcmUgZW1pdHRlZCB1bmRlciBgL2luZGV4LnJzY2AgYW5kXG4gKiBgL2luZGV4LnNlZ21lbnRzL2Agd2hpbGUgaXRzIEhUTUwgc3RheXMgYXQgYC9gIChvciBhdCB0aGUgYGJhc2VQYXRoYCwgZS5nLlxuICogYC9wcm9kYCBhbmQgYC9wcm9kL2luZGV4LnJzY2ApLiBSZWNvbnN0cnVjdGluZyBuYW1lcyBieSBjb25jYXRlbmF0aW9uIHRoZXJlZm9yZVxuICogc2lsZW50bHkgbG9zZXMgdGhlIGhvbWUgcGFnZSdzIGByc2NEYXRhYCDigJQgYW5kIHdpdGggYSBgYmFzZVBhdGhgIGFsc28gaXRzXG4gKiBgc2VnbWVudERhdGFgLCBiZWNhdXNlIGAvcHJvZGAgYW5kIGAvcHJvZC9pbmRleGAgZ3JvdXAgYXBhcnQuIFRoYXQgaXMgbm90IGFcbiAqIGNvc21ldGljIGdhcDogYGFwcC1wYWdlLXJ1bnRpbWUuanNgIGFuc3dlcnMgYW4gUlNDIHJlcXVlc3QgZm9yIGFuIGVudHJ5IHdpdGggbm9cbiAqIGByc2NEYXRhYCBieSBjaGVja2luZyBgY2FjaGVkRGF0YS5odG1sLmNvbnRlbnRUeXBlYCwgYW5kIHVuZGVyIGBjYWNoZUNvbXBvbmVudHNgXG4gKiBzZW5kcyBhbiBlbXB0eSBgNDA0YC4gRXZlcnkgY2xpZW50LXNpZGUgbmF2aWdhdGlvbiB0byBgL2AgYnJlYWtzLlxuICpcbiAqIFRoZSByZW1hcCBpcyBjb25kaXRpb25hbCByYXRoZXIgdGhhbiB1bmNvbmRpdGlvbmFsIHNvIHRoYXQgYW4gYXBwIHdpdGggYSByZWFsXG4gKiBwYWdlIGF0IGBhcHAvaW5kZXgvcGFnZS50c3hgIOKAlCB3aG9zZSBIVE1MIHByZXJlbmRlciBnZW51aW5lbHkgaXMgYC9pbmRleGAg4oCUIGtlZXBzXG4gKiBpdHMgb3duIGdyb3VwLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ3JvdXBQcmVyZW5kZXJzPFQgZXh0ZW5kcyB7IHBhdGhuYW1lOiBzdHJpbmcgfT4oXG4gIHByZXJlbmRlcnM6IFRbXSxcbik6IE1hcDxzdHJpbmcsIFByZXJlbmRlclZhcmlhbnRzPFQ+PiB7XG4gIGNvbnN0IGh0bWxQYXRobmFtZXMgPSBuZXcgU2V0KFxuICAgIHByZXJlbmRlcnNcbiAgICAgIC5tYXAoKHApID0+IHAucGF0aG5hbWUpXG4gICAgICAuZmlsdGVyKFxuICAgICAgICAocCkgPT5cbiAgICAgICAgICAhcC5lbmRzV2l0aChcIi5yc2NcIikgJiZcbiAgICAgICAgICAhcC5pbmNsdWRlcyhcIi5zZWdtZW50cy9cIikgJiZcbiAgICAgICAgICAhUEFHRVNfREFUQV9QQVRITkFNRS50ZXN0KHApLFxuICAgICAgKSxcbiAgKTtcbiAgY29uc3QgZ3JvdXBzID0gbmV3IE1hcDxzdHJpbmcsIFByZXJlbmRlclZhcmlhbnRzPFQ+PigpO1xuXG4gIGNvbnN0IHZhcmlhbnRzRm9yID0gKGJhc2U6IHN0cmluZyk6IFByZXJlbmRlclZhcmlhbnRzPFQ+ID0+IHtcbiAgICBsZXQgdmFyaWFudHMgPSBncm91cHMuZ2V0KGJhc2UpO1xuICAgIGlmICghdmFyaWFudHMpIHtcbiAgICAgIHZhcmlhbnRzID0geyBzZWdtZW50czogW10gfTtcbiAgICAgIGdyb3Vwcy5zZXQoYmFzZSwgdmFyaWFudHMpO1xuICAgIH1cbiAgICByZXR1cm4gdmFyaWFudHM7XG4gIH07XG5cbiAgLyoqIGAvaW5kZXgucnNjYCBiZWxvbmdzIHRvIGAvYCwgYC9wcm9kL2luZGV4LnJzY2AgdG8gYC9wcm9kYC4gKi9cbiAgY29uc3Qgcm91dGVPZiA9IChiYXNlOiBzdHJpbmcpOiBzdHJpbmcgPT4ge1xuICAgIGlmIChiYXNlLmVuZHNXaXRoKElOREVYX1NVRkZJWCkgJiYgIWh0bWxQYXRobmFtZXMuaGFzKGJhc2UpKSB7XG4gICAgICBjb25zdCBwYXJlbnQgPSBiYXNlLnNsaWNlKDAsIC1JTkRFWF9TVUZGSVgubGVuZ3RoKSB8fCBcIi9cIjtcbiAgICAgIGlmIChodG1sUGF0aG5hbWVzLmhhcyhwYXJlbnQpKSB7XG4gICAgICAgIHJldHVybiBwYXJlbnQ7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBiYXNlO1xuICB9O1xuXG4gIGZvciAoY29uc3QgcHJlcmVuZGVyIG9mIHByZXJlbmRlcnMpIHtcbiAgICBjb25zdCB7IHBhdGhuYW1lIH0gPSBwcmVyZW5kZXI7XG4gICAgY29uc3QgZGF0YVJvdXRlID0gUEFHRVNfREFUQV9QQVRITkFNRS5leGVjKHBhdGhuYW1lKTtcbiAgICBpZiAoZGF0YVJvdXRlKSB7XG4gICAgICB2YXJpYW50c0Zvcihyb3V0ZU9mKGAke2RhdGFSb3V0ZVsxXX0vJHtkYXRhUm91dGVbMl19YCkpLmRhdGEgPSBwcmVyZW5kZXI7XG4gICAgfSBlbHNlIGlmIChwYXRobmFtZS5pbmNsdWRlcyhcIi5zZWdtZW50cy9cIikpIHtcbiAgICAgIHZhcmlhbnRzRm9yKHJvdXRlT2YocGF0aG5hbWUuc3BsaXQoXCIuc2VnbWVudHMvXCIpWzBdKSkuc2VnbWVudHMucHVzaChcbiAgICAgICAgcHJlcmVuZGVyLFxuICAgICAgKTtcbiAgICB9IGVsc2UgaWYgKHBhdGhuYW1lLmVuZHNXaXRoKFwiLnJzY1wiKSkge1xuICAgICAgdmFyaWFudHNGb3Iocm91dGVPZihwYXRobmFtZS5zbGljZSgwLCAtXCIucnNjXCIubGVuZ3RoKSkpLnJzYyA9IHByZXJlbmRlcjtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyaWFudHNGb3IocGF0aG5hbWUpLmh0bWwgPSBwcmVyZW5kZXI7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGdyb3Vwcztcbn1cblxuLyoqXG4gKiBIZWFkZXJzIHRoYXQgbXVzdCBub3QgYmUgc2VlZGVkIGludG8gYW4gYEFQUF9QQUdFYCBjYWNoZSBlbnRyeSwgZXZlbiB0aG91Z2ggdGhlXG4gKiBhZGFwdGVyIG91dHB1dCBsaXN0cyB0aGVtIGluIGBmYWxsYmFjay5pbml0aWFsSGVhZGVyc2AuXG4gKlxuICogYGluaXRpYWxIZWFkZXJzYCBkZXNjcmliZXMgaG93IGEgcGxhdGZvcm0gc2hvdWxkIHNlcnZlIHRoZSBwcmVyZW5kZXJlZCAqZmlsZSpcbiAqIHN0cmFpZ2h0IG9mZiBhIENETi4gQSBjYWNoZSBlbnRyeSBpcyBhIGRpZmZlcmVudCB0aGluZzogYGFwcC1wYWdlLXJ1bnRpbWUuanNgXG4gKiBgYXBwZW5kSGVhZGVyYHMgYGNhY2hlZERhdGEuaGVhZGVyc2Agb250byB0aGUgcmVzcG9uc2UgYW5kICp0aGVuKiBzZXJ2ZXMgdGhlXG4gKiB2YXJpYW50IHRoZSByZXF1ZXN0IGFjdHVhbGx5IGFza2VkIGZvciwgc28gYW55dGhpbmcgcHJlc2VudGF0aW9uYWwgaW4gdGhlcmUgaXNcbiAqIGVpdGhlciB3cm9uZyBvciBkb3VibGVkLiBBdCByZXF1ZXN0IHRpbWUgTmV4dC5qcyBzdG9yZXMgb25seSB3aGF0IHRoZSByZW5kZXJcbiAqIHB1dCBpbiBgbWV0YWRhdGEuaGVhZGVyc2Ag4oCUIGB4LW5leHRqcy1zdGFsZS10aW1lYCwgYHgtbmV4dC1jYWNoZS10YWdzYCwgYW5kXG4gKiB3aGF0ZXZlciB0aGUgYXBwIHNldCB0aHJvdWdoIGBoZWFkZXJzKClgL2Bjb29raWVzKClgIOKAlCBhbmQgbmV2ZXIgdGhlc2UgZm91ci5cbiAqXG4gKiBgY29udGVudC10eXBlYCBpcyB0aGUgb25lIHRoYXQgYWN0dWFsbHkgYnJlYWtzLiBgc2VuZC1wYXlsb2FkLmpzYCBzZXRzIHRoZSB0eXBlXG4gKiBvbmx5IHdoZW4gdGhlIHJlc3BvbnNlIGRvZXMgbm90IGFscmVhZHkgaGF2ZSBvbmVcbiAqIChgaWYgKCFyZXMuZ2V0SGVhZGVyKCdDb250ZW50LVR5cGUnKSAmJiByZXN1bHQuY29udGVudFR5cGUpYCksIHNvIGEgc2VlZGVkXG4gKiBgdGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04YCBtYWtlcyBldmVyeSBSU0MgcmVxdWVzdCB0byBhIHByZXJlbmRlcmVkIHBhZ2UgYW5zd2VyXG4gKiB0aGUgZmxpZ2h0IHBheWxvYWQgbGFiZWxlZCBhcyBIVE1MLiBUaGUgY2xpZW50IHJvdXRlciByZWplY3RzIHRoYXQsIGFuZCBzbyBkb2VzXG4gKiBOZXh0LmpzIGl0c2VsZjogYGNyZWF0ZVJlZGlyZWN0UmVuZGVyUmVzdWx0YCBjaGVja3MgdGhlIGNvbnRlbnQgdHlwZSBvZiB0aGVcbiAqIHN1Yi1yZXNwb25zZSBpdCBmZXRjaGVzIHRvIHN0cmVhbSBhbiBhY3Rpb24gYHJlZGlyZWN0KClgLCBhbmQgb24gYSBtaXNtYXRjaFxuICogY2FuY2VscyB0aGUgYm9keSBhbmQgcmV0dXJucyBhbiBlbXB0eSByZXN1bHQuXG4gKlxuICogYHZhcnlgLCBgeC1uZXh0anMtcHJlcmVuZGVyYCwgYW5kIGB4LW5leHRqcy1wb3N0cG9uZWRgIGFyZSBhbGwgc2V0IGJ5IHRoZVxuICogZW50cnlwb2ludCBpdHNlbGYsIHNvIHNlZWRpbmcgdGhlbSBvbmx5IHByb2R1Y2VzIHR3byBvZiBlYWNoLlxuICpcbiAqIGBBUFBfUk9VVEVgIGVudHJpZXMgYXJlIGRlbGliZXJhdGVseSAqbm90KiBmaWx0ZXJlZDogYSByb3V0ZSBoYW5kbGVyJ3NcbiAqIGBjb250ZW50LXR5cGVgIGlzIHBhcnQgb2YgaXRzIGNhY2hlZCByZXNwb25zZSwgYW5kIGBhcHAtcm91dGUuanNgIHJlcGxheXMgdGhvc2VcbiAqIGhlYWRlcnMgdmVyYmF0aW0uXG4gKi9cbmNvbnN0IE5PTl9DQUNIRUFCTEVfQVBQX1BBR0VfSEVBREVSUyA9IG5ldyBTZXQoW1xuICBcImNvbnRlbnQtdHlwZVwiLFxuICBcInZhcnlcIixcbiAgXCJ4LW5leHRqcy1wcmVyZW5kZXJcIixcbiAgXCJ4LW5leHRqcy1wb3N0cG9uZWRcIixcbl0pO1xuXG4vKiogU2VlIHtAbGluayBOT05fQ0FDSEVBQkxFX0FQUF9QQUdFX0hFQURFUlN9LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFwcFBhZ2VDYWNoZUhlYWRlcnM8VD4oXG4gIGluaXRpYWxIZWFkZXJzOiBSZWNvcmQ8c3RyaW5nLCBUPixcbik6IFJlY29yZDxzdHJpbmcsIFQ+IHtcbiAgY29uc3QgaGVhZGVyczogUmVjb3JkPHN0cmluZywgVD4gPSB7fTtcbiAgZm9yIChjb25zdCBbbmFtZSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGluaXRpYWxIZWFkZXJzKSkge1xuICAgIGlmICghTk9OX0NBQ0hFQUJMRV9BUFBfUEFHRV9IRUFERVJTLmhhcyhuYW1lLnRvTG93ZXJDYXNlKCkpKSB7XG4gICAgICBoZWFkZXJzW25hbWVdID0gdmFsdWU7XG4gICAgfVxuICB9XG4gIHJldHVybiBoZWFkZXJzO1xufVxuXG4vKiogYE5FWFRfQ0FDSEVfVEFHU19IRUFERVJgLCBpbmxpbmVkIHNvIHRoaXMgZmlsZSBpbXBvcnRzIG5vIE5leHQuanMgaW50ZXJuYWxzLiAqL1xuY29uc3QgTkVYVF9DQUNIRV9UQUdTX0hFQURFUiA9IFwieC1uZXh0LWNhY2hlLXRhZ3NcIjtcblxuLyoqXG4gKiBUaGUgdGFncyBhIGNhY2hlIHZhbHVlJ3MgcmVuZGVyIHdhcyB0YWdnZWQgd2l0aCwgYXMgTmV4dC5qcyByZWNvcmRzIHRoZW06IGluXG4gKiBpdHMgYHgtbmV4dC1jYWNoZS10YWdzYCBoZWFkZXIsIGNvbW1hIHNlcGFyYXRlZCwgaW5jbHVkaW5nIHRoZSBpbXBsaWNpdFxuICogYF9OX1RfL+KApmAgcGF0aCBjaGFpbiBgcmV2YWxpZGF0ZVBhdGhgIHVzZXMuIE9uZSBwYXJzZXIgZm9yIHRoZSBidWlsZCdzIHRhZ1xuICogbWFuaWZlc3QgYW5kIHRoZSBydW50aW1lJ3MgbWFwcGluZyByb3dzLCB3aGljaCBoYXZlIHRvIGFncmVlLlxuICpcbiAqIGB2YWx1ZWAgaXMgYHVua25vd25gIGJlY2F1c2UgaXQgYXJyaXZlcyBib3RoIGFzIGEgc3RvcmVkIGVudHJ5IHJlYWQgYmFjayBmcm9tXG4gKiBTMyBhbmQgYXMgdGhlIGBJbmNyZW1lbnRhbENhY2hlVmFsdWVgIHVuaW9uOyBvbmx5IHNvbWUgbWVtYmVycyBoYXZlIGhlYWRlcnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoZWFkZXJUYWdzKHZhbHVlOiB1bmtub3duKTogc3RyaW5nW10ge1xuICBjb25zdCBoZWFkZXJzID0gKHZhbHVlIGFzIHsgaGVhZGVycz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+IH0gfCBudWxsKVxuICAgID8uaGVhZGVycztcbiAgY29uc3QgaGVhZGVyID0gaGVhZGVycz8uW05FWFRfQ0FDSEVfVEFHU19IRUFERVJdO1xuICByZXR1cm4gdHlwZW9mIGhlYWRlciA9PT0gXCJzdHJpbmdcIiA/IGhlYWRlci5zcGxpdChcIixcIikuZmlsdGVyKEJvb2xlYW4pIDogW107XG59XG5cbi8qKlxuICogTmFtZSBvZiB0aGUgZmlsZSB0aGUgYWRhcHRlciB3cml0ZXMgaW50byB0aGUgaW5pdCBjYWNoZSBkaXJlY3RvcnkgbWFwcGluZyBlYWNoXG4gKiBjYWNoZSB0YWcgdG8gdGhlIGNhY2hlIGtleXMgb2YgdGhlIGJ1aWxkLXRpbWUgcHJlcmVuZGVycyBjYXJyeWluZyBpdC5cbiAqXG4gKiBJdCByaWRlcyB0byBTMyB3aXRoIHRoZSByZXN0IG9mIHRoZSBpbml0IGNhY2hlLCBhbmQgYFMzQ2FjaGVIYW5kbGVyYCdzXG4gKiBgcmV2YWxpZGF0ZVRhZ2AgcmVhZHMgaXQgYWxvbmdzaWRlIHRoZSBgdGFnI2NhY2hlS2V5YCByb3dzIGEgcnVudGltZSBgc2V0YFxuICogd3JpdGVzLiBXaXRob3V0IGl0IGByZXZhbGlkYXRlVGFnYCBrbm93cyBhIHByZXJlbmRlciBpcyBzdGFsZSAoc2VlXG4gKiBgY2hlY2tJZlJldmFsaWRhdGVkYCkgYnV0IG5vdCB3aGljaCBDbG91ZEZyb250IHBhdGhzIHRvIGludmFsaWRhdGUsIHNvIHRoZSBDRE5cbiAqIGtlZXBzIHNlcnZpbmcgdGhlIG9sZCByZXNwb25zZSB1bnRpbCBpdHMgVFRMIGV4cGlyZXMgLSBhIHllYXIsIGZvciBhXG4gKiBwcmVyZW5kZXIuXG4gKlxuICogVGhlIGxlYWRpbmcgdW5kZXJzY29yZSBrZWVwcyBpdCBjbGVhciBvZiBjYWNoZSBrZXlzLCB3aGljaCBhcmUgcm91dGUgcGF0aHMuXG4gKi9cbmV4cG9ydCBjb25zdCBJTklUX0NBQ0hFX1RBR19NQU5JRkVTVCA9IFwiX2Nkay1uZXh0anMtdGFnLW1hbmlmZXN0Lmpzb25cIjtcblxuLyoqIENvbnRlbnRzIG9mIHtAbGluayBJTklUX0NBQ0hFX1RBR19NQU5JRkVTVH06IHRhZyAtPiBpbml0IGNhY2hlIGtleXMuICovXG5leHBvcnQgdHlwZSBJbml0Q2FjaGVUYWdNYW5pZmVzdCA9IFJlY29yZDxzdHJpbmcsIHN0cmluZ1tdPjtcblxuLyoqXG4gKiBUaGUgYGN0eGAgTmV4dC5qcyBwYXNzZXMgYSBgQ2FjaGVIYW5kbGVyYCdzIGBnZXRgLCB0YWtlbiBvZmYgaXRzIGludGVyZmFjZTpcbiAqIHRoZSBmZXRjaCBjYWNoZSdzLCBhIHJvdXRlIHJlc3BvbnNlJ3MsIG9yIC0gc2luY2UgdGhpcyBoYW5kbGVyIGlzIGFsc29cbiAqIGBJbWFnZU9wdGltaXplckNhY2hlYCdzIC0gYW4gb3B0aW1pemVkIGltYWdlJ3MuXG4gKi9cbmV4cG9ydCB0eXBlIEdldENhY2hlSGFuZGxlckNvbnRleHQgPSBQYXJhbWV0ZXJzPENhY2hlSGFuZGxlcltcImdldFwiXT5bMV07XG5cbi8qKiBUaGUgYGN0eGAgTmV4dC5qcyBwYXNzZXMgYSBgQ2FjaGVIYW5kbGVyYCdzIGBzZXRgLiBTZWUge0BsaW5rIEdldENhY2hlSGFuZGxlckNvbnRleHR9LiAqL1xuZXhwb3J0IHR5cGUgU2V0Q2FjaGVIYW5kbGVyQ29udGV4dCA9IFBhcmFtZXRlcnM8Q2FjaGVIYW5kbGVyW1wic2V0XCJdPlsyXTtcblxuLyoqXG4gKiBIZWxwZXIgdG8gc2FmZWx5IGV4dHJhY3QgdGFncyBmcm9tIGNvbnRleHRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFRhZ3MoY3R4OiBTZXRDYWNoZUhhbmRsZXJDb250ZXh0KTogc3RyaW5nW10gfCB1bmRlZmluZWQge1xuICByZXR1cm4gXCJ0YWdzXCIgaW4gY3R4ID8gY3R4LnRhZ3MgOiB1bmRlZmluZWQ7XG59XG4iXX0=
390
+ /**
391
+ * The lifetime a response entry was rendered with: `ctx.cacheControl`, which
392
+ * `ResponseCache.set` passes and a `fetch` entry's `set` does not (its
393
+ * `revalidate` is inside the value).
394
+ *
395
+ * Stored with the entry and handed back from `get`, because next 16.4 prefers
396
+ * it there over its own per-process `SharedCacheControls`. Without it a fresh
397
+ * instance only knows what the prerender manifest recorded at build time, so a
398
+ * page whose lifetime was decided at render (`cacheLife`, a `fetch`'s
399
+ * `revalidate`, `getStaticProps` returning another `revalidate`) was aged by
400
+ * the build-time value until that instance rendered it itself, and a path the
401
+ * manifest does not cover by Next.js's default of 1 second: every cold Lambda
402
+ * served it stale and regenerated it. Older `next` ignores the field.
403
+ */
404
+ function getCacheControl(ctx) {
405
+ return "cacheControl" in ctx
406
+ ? storedCacheControl(ctx.cacheControl)
407
+ : undefined;
408
+ }
409
+ /**
410
+ * `value` if it is a {@link CacheControl}, as read back off a stored entry.
411
+ * Anything else is dropped rather than handed to Next.js, which ages the entry
412
+ * by it: Next.js then falls back to the lifetime it knows, as before 16.4.
413
+ */
414
+ function storedCacheControl(value) {
415
+ if (typeof value !== "object" || value === null) {
416
+ return undefined;
417
+ }
418
+ const { revalidate, expire } = value;
419
+ if (revalidate !== false &&
420
+ !(typeof revalidate === "number" &&
421
+ Number.isFinite(revalidate) &&
422
+ revalidate > 0)) {
423
+ return undefined;
424
+ }
425
+ // Finite: JSON writes `Infinity` and `NaN` as `null`.
426
+ if (expire !== undefined && !Number.isFinite(expire)) {
427
+ return undefined;
428
+ }
429
+ return { revalidate, expire };
430
+ }
431
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FjaGUtdXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYWRhcHRlci9jYWNoZS11dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUE4REEsa0RBS0M7QUFnQkQsMENBd0JDO0FBYUQsMERBY0M7QUFHRCw0Q0FRQztBQUdELDhCQUVDO0FBaUNELDBDQU1DO0FBYUQsOERBYUM7QUFvQkQsa0RBT0M7QUFtREQsMENBb0RDO0FBc0NELGtEQVVDO0FBY0QsZ0NBS0M7QUFpQ0QsMEJBRUM7QUFnQkQsMENBTUM7QUFPRCxnREFvQkM7QUFoZkQ7O0VBRUU7QUFDRiw2Q0FBeUM7QUFDekMseUNBQWdDO0FBR2hDLGtEQUFtRDtBQUVuRDs7O0dBR0c7QUFDSCxTQUFTLGVBQWUsQ0FBQyxLQUFVO0lBQ2pDLHdCQUF3QjtJQUN4QixJQUFJLEtBQUssSUFBSSxJQUFJLEVBQUUsQ0FBQztRQUNsQixPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFRCx5RUFBeUU7SUFDekUsd0VBQXdFO0lBQ3hFLHlEQUF5RDtJQUN6RCxJQUFJLE1BQU0sQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUMzQixPQUFPO1lBQ0wsTUFBTSxFQUFFLFFBQVE7WUFDaEIsTUFBTSxFQUFFLEtBQUssQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDO1NBQ2pDLENBQUM7SUFDSixDQUFDO0lBRUQsbUNBQW1DO0lBQ25DLElBQUksS0FBSyxZQUFZLEdBQUcsRUFBRSxDQUFDO1FBQ3pCLE1BQU0sT0FBTyxHQUF3QixFQUFFLENBQUM7UUFDeEMsS0FBSyxNQUFNLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxJQUFJLEtBQUssQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDO1lBQ3pDLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxlQUFlLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDdEMsQ0FBQztRQUNELE9BQU87WUFDTCxNQUFNLEVBQUUsS0FBSztZQUNiLElBQUksRUFBRSxPQUFPO1NBQ2QsQ0FBQztJQUNKLENBQUM7SUFFRCw2QkFBNkI7SUFDN0IsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDekIsT0FBTyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUNwRCxDQUFDO0lBRUQsOEJBQThCO0lBQzlCLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDOUIsTUFBTSxTQUFTLEdBQXdCLEVBQUUsQ0FBQztRQUMxQyxLQUFLLE1BQU0sQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQy9DLFNBQVMsQ0FBQyxHQUFHLENBQUMsR0FBRyxlQUFlLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDeEMsQ0FBQztRQUNELE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7SUFFRCwwQkFBMEI7SUFDMUIsT0FBTyxLQUFLLENBQUM7QUFDZixDQUFDO0FBRUQ7O0dBRUc7QUFDSCxTQUFnQixtQkFBbUIsQ0FBQyxLQUFVO0lBQzVDLGdFQUFnRTtJQUNoRSxpREFBaUQ7SUFDakQsTUFBTSxTQUFTLEdBQUcsZUFBZSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3pDLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQztBQUNuQyxDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7R0FhRztBQUNILFNBQWdCLGVBQWUsQ0FBQyxVQUFrQjtJQUNoRCxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxFQUFFLENBQUMsSUFBSSxFQUFFLEdBQUcsRUFBRSxFQUFFO1FBQzFDLDhEQUE4RDtRQUM5RCxJQUFJLEdBQUcsSUFBSSxPQUFPLEdBQUcsS0FBSyxRQUFRLElBQUksR0FBRyxDQUFDLE1BQU0sS0FBSyxLQUFLLEVBQUUsQ0FBQztZQUMzRCxPQUFPLElBQUksR0FBRyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDM0MsQ0FBQztRQUNELHFGQUFxRjtRQUNyRixJQUFJLEdBQUcsSUFBSSxPQUFPLEdBQUcsS0FBSyxRQUFRLElBQUksR0FBRyxDQUFDLE1BQU0sS0FBSyxRQUFRLEVBQUUsQ0FBQztZQUM5RCxPQUFPLE9BQU8sR0FBRyxDQUFDLE1BQU0sS0FBSyxRQUFRO2dCQUNuQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQztnQkFDbkMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzVCLENBQUM7UUFDRCwwRkFBMEY7UUFDMUYsaUVBQWlFO1FBQ2pFLElBQ0UsR0FBRztZQUNILE9BQU8sR0FBRyxLQUFLLFFBQVE7WUFDdkIsR0FBRyxDQUFDLElBQUksS0FBSyxRQUFRO1lBQ3JCLEtBQUssQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUN2QixDQUFDO1lBQ0QsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMvQixDQUFDO1FBQ0QsT0FBTyxHQUFHLENBQUM7SUFDYixDQUFDLENBQUMsQ0FBQztBQUNMLENBQUM7QUFFRDs7Ozs7Ozs7OztHQVVHO0FBQ0gsU0FBZ0IsdUJBQXVCLENBQ3JDLFFBQWdCLEVBQ2hCLFFBQWdCO0lBRWhCLDJFQUEyRTtJQUMzRSwwQ0FBMEM7SUFDMUMsTUFBTSxLQUFLLEdBQUcsQ0FDWixJQUFBLHlCQUFhLEVBQUMsUUFBUSxFQUFFLFFBQVEsQ0FBQztRQUMvQixDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDO1FBQ2pDLENBQUMsQ0FBQyxRQUFRLENBQ2I7UUFDQyxvRUFBb0U7U0FDbkUsT0FBTyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsQ0FBQztJQUN2QixPQUFPLEtBQUssS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO0FBQ3hDLENBQUM7QUFFRCw4REFBOEQ7QUFDOUQsU0FBZ0IsZ0JBQWdCLENBQUMsUUFBZ0I7SUFDL0MsSUFBSSxhQUFhLEdBQUcsUUFBUSxDQUFDO0lBQzdCLElBQUksUUFBUSxLQUFLLEdBQUcsSUFBSSxRQUFRLEtBQUssRUFBRSxFQUFFLENBQUM7UUFDeEMsYUFBYSxHQUFHLE9BQU8sQ0FBQztJQUMxQixDQUFDO1NBQU0sSUFBSSxRQUFRLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDcEMsYUFBYSxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDcEMsQ0FBQztJQUNELE9BQU8sR0FBRyxhQUFhLE9BQU8sQ0FBQztBQUNqQyxDQUFDO0FBRUQsdURBQXVEO0FBQ3ZELFNBQWdCLFNBQVMsQ0FBQyxLQUFhO0lBQ3JDLE9BQU8sSUFBQSx3QkFBVSxFQUFDLFFBQVEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDMUQsQ0FBQztBQUVELG1EQUFtRDtBQUNuRCxNQUFNLGdCQUFnQixHQUFHLElBQUksQ0FBQztBQUU5Qjs7Ozs7O0dBTUc7QUFDVSxRQUFBLGtCQUFrQixHQUFHLEdBQUcsQ0FBQztBQUV0Qzs7O0dBR0c7QUFDVSxRQUFBLGVBQWUsR0FBRyxXQUFXLENBQUM7QUFFM0M7Ozs7Ozs7Ozs7OztHQVlHO0FBQ0gsU0FBZ0IsZUFBZSxDQUFDLFFBQWdCO0lBQzlDLE1BQU0sSUFBSSxHQUFHLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ3hDLElBQUksTUFBTSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxnQkFBZ0IsR0FBRyxDQUFDLDBCQUFrQixHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDM0UsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBQ0QsT0FBTyxHQUFHLHVCQUFlLElBQUksU0FBUyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUM7QUFDdEQsQ0FBQztBQUVEOzs7Ozs7Ozs7O0dBVUc7QUFDSCxTQUFnQix5QkFBeUIsQ0FDdkMsUUFBNEI7SUFFNUIsMkVBQTJFO0lBQzNFLDBFQUEwRTtJQUMxRSw4QkFBOEI7SUFDOUIsTUFBTSxJQUFJLEdBQUcsUUFBUSxFQUFFLEtBQUssQ0FBQyxlQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDNUMsTUFBTSxFQUFFLEdBQUcsSUFBSSxFQUFFLE9BQU8sQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUNoRCxJQUFJLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUNYLE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7SUFDRCxNQUFNLEdBQUcsR0FBRyxJQUFLLENBQUMsS0FBSyxDQUFDLEVBQUUsR0FBRyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUN6RSxPQUFPLDhCQUFzQixDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7QUFDNUQsQ0FBQztBQUVELE1BQU0sZUFBZSxHQUFHLHNCQUFzQixDQUFDO0FBRS9DOzs7OztHQUtHO0FBQ1UsUUFBQSxzQkFBc0IsR0FDakMsK0NBQStDLENBQUM7QUFFbEQ7Ozs7OztHQU1HO0FBQ0gsU0FBZ0IsbUJBQW1CLENBQUMsUUFBZ0I7SUFDbEQsSUFBSSxRQUFRLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDMUIsT0FBTyxHQUFHLENBQUM7SUFDYixDQUFDO0lBQ0QsT0FBTyxRQUFRLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQztRQUNuQyxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDO1FBQ2pDLENBQUMsQ0FBQyxRQUFRLENBQUM7QUFDZixDQUFDO0FBY0QsTUFBTSxZQUFZLEdBQUcsUUFBUSxDQUFDO0FBRTlCOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLG1CQUFtQixHQUFHLHdDQUF3QyxDQUFDO0FBRXJFOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F3Qkc7QUFDSCxTQUFnQixlQUFlLENBQzdCLFVBQWU7SUFFZixNQUFNLGFBQWEsR0FBRyxJQUFJLEdBQUcsQ0FDM0IsVUFBVTtTQUNQLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQztTQUN0QixNQUFNLENBQ0wsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUNKLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUM7UUFDbkIsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQztRQUN6QixDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FDL0IsQ0FDSixDQUFDO0lBQ0YsTUFBTSxNQUFNLEdBQUcsSUFBSSxHQUFHLEVBQWdDLENBQUM7SUFFdkQsTUFBTSxXQUFXLEdBQUcsQ0FBQyxJQUFZLEVBQXdCLEVBQUU7UUFDekQsSUFBSSxRQUFRLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNoQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDZCxRQUFRLEdBQUcsRUFBRSxRQUFRLEVBQUUsRUFBRSxFQUFFLENBQUM7WUFDNUIsTUFBTSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDN0IsQ0FBQztRQUNELE9BQU8sUUFBUSxDQUFDO0lBQ2xCLENBQUMsQ0FBQztJQUVGLGlFQUFpRTtJQUNqRSxNQUFNLE9BQU8sR0FBRyxDQUFDLElBQVksRUFBVSxFQUFFO1FBQ3ZDLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUM1RCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsSUFBSSxHQUFHLENBQUM7WUFDMUQsSUFBSSxhQUFhLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7Z0JBQzlCLE9BQU8sTUFBTSxDQUFDO1lBQ2hCLENBQUM7UUFDSCxDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDLENBQUM7SUFFRixLQUFLLE1BQU0sU0FBUyxJQUFJLFVBQVUsRUFBRSxDQUFDO1FBQ25DLE1BQU0sRUFBRSxRQUFRLEVBQUUsR0FBRyxTQUFTLENBQUM7UUFDL0IsTUFBTSxTQUFTLEdBQUcsbUJBQW1CLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3JELElBQUksU0FBUyxFQUFFLENBQUM7WUFDZCxXQUFXLENBQUMsT0FBTyxDQUFDLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEdBQUcsU0FBUyxDQUFDO1FBQzNFLENBQUM7YUFBTSxJQUFJLFFBQVEsQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQztZQUMzQyxXQUFXLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQ2pFLFNBQVMsQ0FDVixDQUFDO1FBQ0osQ0FBQzthQUFNLElBQUksUUFBUSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1lBQ3JDLFdBQVcsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxTQUFTLENBQUM7UUFDMUUsQ0FBQzthQUFNLENBQUM7WUFDTixXQUFXLENBQUMsUUFBUSxDQUFDLENBQUMsSUFBSSxHQUFHLFNBQVMsQ0FBQztRQUN6QyxDQUFDO0lBQ0gsQ0FBQztJQUVELE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUM7QUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBMkJHO0FBQ0gsTUFBTSw4QkFBOEIsR0FBRyxJQUFJLEdBQUcsQ0FBQztJQUM3QyxjQUFjO0lBQ2QsTUFBTTtJQUNOLG9CQUFvQjtJQUNwQixvQkFBb0I7Q0FDckIsQ0FBQyxDQUFDO0FBRUgsa0RBQWtEO0FBQ2xELFNBQWdCLG1CQUFtQixDQUNqQyxjQUFpQztJQUVqQyxNQUFNLE9BQU8sR0FBc0IsRUFBRSxDQUFDO0lBQ3RDLEtBQUssTUFBTSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUM7UUFDM0QsSUFBSSxDQUFDLDhCQUE4QixDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsRUFBRSxDQUFDO1lBQzVELE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxLQUFLLENBQUM7UUFDeEIsQ0FBQztJQUNILENBQUM7SUFDRCxPQUFPLE9BQU8sQ0FBQztBQUNqQixDQUFDO0FBRUQsbUZBQW1GO0FBQ25GLE1BQU0sc0JBQXNCLEdBQUcsbUJBQW1CLENBQUM7QUFFbkQ7Ozs7Ozs7O0dBUUc7QUFDSCxTQUFnQixVQUFVLENBQUMsS0FBYztJQUN2QyxNQUFNLE9BQU8sR0FBSSxLQUFzRDtRQUNyRSxFQUFFLE9BQU8sQ0FBQztJQUNaLE1BQU0sTUFBTSxHQUFHLE9BQU8sRUFBRSxDQUFDLHNCQUFzQixDQUFDLENBQUM7SUFDakQsT0FBTyxPQUFPLE1BQU0sS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7QUFDN0UsQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7R0FZRztBQUNVLFFBQUEsdUJBQXVCLEdBQUcsK0JBQStCLENBQUM7QUFldkU7O0dBRUc7QUFDSCxTQUFnQixPQUFPLENBQUMsR0FBMkI7SUFDakQsT0FBTyxNQUFNLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7QUFDOUMsQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7O0dBYUc7QUFDSCxTQUFnQixlQUFlLENBQzdCLEdBQTJCO0lBRTNCLE9BQU8sY0FBYyxJQUFJLEdBQUc7UUFDMUIsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUM7UUFDdEMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztBQUNoQixDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILFNBQWdCLGtCQUFrQixDQUFDLEtBQWM7SUFDL0MsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksS0FBSyxLQUFLLElBQUksRUFBRSxDQUFDO1FBQ2hELE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7SUFDRCxNQUFNLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxHQUFHLEtBQThCLENBQUM7SUFDOUQsSUFDRSxVQUFVLEtBQUssS0FBSztRQUNwQixDQUFDLENBQ0MsT0FBTyxVQUFVLEtBQUssUUFBUTtZQUM5QixNQUFNLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQztZQUMzQixVQUFVLEdBQUcsQ0FBQyxDQUNmLEVBQ0QsQ0FBQztRQUNELE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7SUFDRCxzREFBc0Q7SUFDdEQsSUFBSSxNQUFNLEtBQUssU0FBUyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1FBQ3JELE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7SUFDRCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxDQUFDO0FBQ2hDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICBTaGFyZWQgY2FjaGUgdXRpbGl0eSBmdW5jdGlvbnNcbiovXG5pbXBvcnQgeyBjcmVhdGVIYXNoIH0gZnJvbSBcIm5vZGU6Y3J5cHRvXCI7XG5pbXBvcnQgeyBzZXAgfSBmcm9tIFwibm9kZTpwYXRoXCI7XG5pbXBvcnQgdHlwZSB7IENhY2hlQ29udHJvbCB9IGZyb20gXCJuZXh0L2Rpc3Qvc2VydmVyL2xpYi9jYWNoZS1jb250cm9sXCI7XG5pbXBvcnQgdHlwZSB7IENhY2hlSGFuZGxlciB9IGZyb20gXCJuZXh0L2Rpc3Qvc2VydmVyL2xpYi9pbmNyZW1lbnRhbC1jYWNoZVwiO1xuaW1wb3J0IHsgaGFzUGF0aFByZWZpeCB9IGZyb20gXCIuLi91dGlscy9iYXNlLXBhdGhcIjtcblxuLyoqXG4gKiBQcmUtcHJvY2VzcyB2YWx1ZSB0byBjb252ZXJ0IEJ1ZmZlcnMgYW5kIE1hcHMgYmVmb3JlIEpTT04uc3RyaW5naWZ5XG4gKiBUaGlzIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIEJ1ZmZlci50b0pTT04oKSBpcyBjYWxsZWQgYmVmb3JlIHJlcGxhY2VyIGZ1bmN0aW9uc1xuICovXG5mdW5jdGlvbiBwcmVwcm9jZXNzVmFsdWUodmFsdWU6IGFueSk6IGFueSB7XG4gIC8vIEhhbmRsZSBudWxsL3VuZGVmaW5lZFxuICBpZiAodmFsdWUgPT0gbnVsbCkge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuXG4gIC8vIENvbnZlcnQgQnVmZmVyIHRvIG91ciBjdXN0b20gZm9ybWF0LiBiYXNlNjQsIG5vdCB0aGUgYXJyYXkgb2YgcGVyLWJ5dGVcbiAgLy8gaW50ZWdlcnMgdGhpcyB1c2VkIHRvIHdyaXRlIChhbmQgdGhhdCBgQnVmZmVyLnRvSlNPTigpYCB3cml0ZXMpIOKAlCBzZWVcbiAgLy8ge0BsaW5rIHBhcnNlQ2FjaGVWYWx1ZX0gZm9yIHdoeSB0aGF0IG1hdHRlcmVkIHNvIG11Y2guXG4gIGlmIChCdWZmZXIuaXNCdWZmZXIodmFsdWUpKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIF9fdHlwZTogXCJCdWZmZXJcIixcbiAgICAgIGJhc2U2NDogdmFsdWUudG9TdHJpbmcoXCJiYXNlNjRcIiksXG4gICAgfTtcbiAgfVxuXG4gIC8vIENvbnZlcnQgTWFwIHRvIG91ciBjdXN0b20gZm9ybWF0XG4gIGlmICh2YWx1ZSBpbnN0YW5jZW9mIE1hcCkge1xuICAgIGNvbnN0IGVudHJpZXM6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fTtcbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbF0gb2YgdmFsdWUuZW50cmllcygpKSB7XG4gICAgICBlbnRyaWVzW2tleV0gPSBwcmVwcm9jZXNzVmFsdWUodmFsKTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIF9fdHlwZTogXCJNYXBcIixcbiAgICAgIGRhdGE6IGVudHJpZXMsXG4gICAgfTtcbiAgfVxuXG4gIC8vIFJlY3Vyc2l2ZWx5IHByb2Nlc3MgYXJyYXlzXG4gIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgIHJldHVybiB2YWx1ZS5tYXAoKGl0ZW0pID0+IHByZXByb2Nlc3NWYWx1ZShpdGVtKSk7XG4gIH1cblxuICAvLyBSZWN1cnNpdmVseSBwcm9jZXNzIG9iamVjdHNcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIikge1xuICAgIGNvbnN0IHByb2Nlc3NlZDogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9O1xuICAgIGZvciAoY29uc3QgW2tleSwgdmFsXSBvZiBPYmplY3QuZW50cmllcyh2YWx1ZSkpIHtcbiAgICAgIHByb2Nlc3NlZFtrZXldID0gcHJlcHJvY2Vzc1ZhbHVlKHZhbCk7XG4gICAgfVxuICAgIHJldHVybiBwcm9jZXNzZWQ7XG4gIH1cblxuICAvLyBSZXR1cm4gcHJpbWl0aXZlcyBhcy1pc1xuICByZXR1cm4gdmFsdWU7XG59XG5cbi8qKlxuICogU2VyaWFsaXplIGNhY2hlIHZhbHVlIHdpdGggY3VzdG9tIGhhbmRsaW5nIGZvciBNYXAgYW5kIEJ1ZmZlciBvYmplY3RzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXJpYWxpemVDYWNoZVZhbHVlKHZhbHVlOiBhbnkpOiBzdHJpbmcge1xuICAvLyBQcmUtcHJvY2VzcyB0byBjb252ZXJ0IEJ1ZmZlcnMgYW5kIE1hcHMgYmVmb3JlIEpTT04uc3RyaW5naWZ5XG4gIC8vIFRoaXMgZW5zdXJlcyBCdWZmZXIudG9KU09OKCkgZG9lc24ndCBpbnRlcmZlcmVcbiAgY29uc3QgcHJvY2Vzc2VkID0gcHJlcHJvY2Vzc1ZhbHVlKHZhbHVlKTtcbiAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHByb2Nlc3NlZCk7XG59XG5cbi8qKlxuICogUGFyc2UgY2FjaGUgdmFsdWUgd2l0aCBjdXN0b20gaGFuZGxpbmcgZm9yIE1hcCBhbmQgQnVmZmVyIG9iamVjdHNcbiAqXG4gKiBCdWZmZXJzIGFyZSByZWFkIGJhY2sgZnJvbSBiYXNlNjQgd2hlbiB0aGF0IGlzIGhvdyB0aGV5IHdlcmUgd3JpdHRlbiwgYW5kIGZyb21cbiAqIGFuIGFycmF5IG9mIHBlci1ieXRlIGludGVnZXJzIHdoZW4gdGhleSB3ZXJlIG5vdC4gVGhhdCBhcnJheSBpcyB0aGUgZm9ybWF0XG4gKiBgQnVmZmVyLnRvSlNPTigpYCBwcm9kdWNlcyBhbmQgdGhlIG9uZSB0aGlzIGNvZGUgdXNlZCB0byB3cml0ZSwgYW5kIGl0IGlzXG4gKiBydWlub3VzIGZvciBhIHBhZ2Ugd2l0aCBhIGxhcmdlIHBheWxvYWQ6IGEgMSBNaUIgcHJlcmVuZGVyIGJlY2FtZSB+MyBNaUIgb2ZcbiAqIEpTT04gdGV4dCwgYW4gMTEuNiBNaUIgY2FjaGUgZW50cnkgb25jZSBodG1sIGFuZCB0aGUgcGVyLXNlZ21lbnQgY29waWVzIGFyZVxuICogY291bnRlZCwgYW5kIOKAlCBiZWNhdXNlIGBKU09OLnBhcnNlYCdzIHJldml2ZXIgcnVucyBmb3IgKmV2ZXJ5IGFycmF5IGVsZW1lbnQqIOKAlFxuICogdXB3YXJkcyBvZiB0aHJlZSBtaWxsaW9uIHJldml2ZXIgY2FsbHMgdG8gcmVhZCBvbmUgcGFnZS4gTWVhc3VyZWQgYWdhaW5zdCBhXG4gKiBkZXBsb3ltZW50OiA0LjhzIG9mIExhbWJkYSB0aW1lIHRvIGFuc3dlciBhIDEgTWlCIHNlZ21lbnQgcHJlZmV0Y2gsIGFnYWluc3RcbiAqIDQ1bXMgZm9yIGEgc21hbGwgb25lIGZyb20gdGhlIHNhbWUgY2FjaGUuIGJhc2U2NCBpcyA0LzMgdGhlIGJ5dGVzIHJhdGhlciB0aGFuXG4gKiB+M3gsIGFuZCBgQnVmZmVyLmZyb20oc3RyLCBcImJhc2U2NFwiKWAgaXMgb25lIG5hdGl2ZSBjYWxsLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VDYWNoZVZhbHVlKGpzb25TdHJpbmc6IHN0cmluZyk6IGFueSB7XG4gIHJldHVybiBKU09OLnBhcnNlKGpzb25TdHJpbmcsIChfa2V5LCB2YWwpID0+IHtcbiAgICAvLyBSZXN0b3JlIE1hcCBvYmplY3RzIHRoYXQgd2VyZSBzZXJpYWxpemVkIHdpdGggX190eXBlIG1hcmtlclxuICAgIGlmICh2YWwgJiYgdHlwZW9mIHZhbCA9PT0gXCJvYmplY3RcIiAmJiB2YWwuX190eXBlID09PSBcIk1hcFwiKSB7XG4gICAgICByZXR1cm4gbmV3IE1hcChPYmplY3QuZW50cmllcyh2YWwuZGF0YSkpO1xuICAgIH1cbiAgICAvLyBSZXN0b3JlIEJ1ZmZlciBvYmplY3RzIHRoYXQgd2VyZSBzZXJpYWxpemVkIHdpdGggX190eXBlIG1hcmtlciAob3VyIGN1c3RvbSBmb3JtYXQpXG4gICAgaWYgKHZhbCAmJiB0eXBlb2YgdmFsID09PSBcIm9iamVjdFwiICYmIHZhbC5fX3R5cGUgPT09IFwiQnVmZmVyXCIpIHtcbiAgICAgIHJldHVybiB0eXBlb2YgdmFsLmJhc2U2NCA9PT0gXCJzdHJpbmdcIlxuICAgICAgICA/IEJ1ZmZlci5mcm9tKHZhbC5iYXNlNjQsIFwiYmFzZTY0XCIpXG4gICAgICAgIDogQnVmZmVyLmZyb20odmFsLmRhdGEpO1xuICAgIH1cbiAgICAvLyBSZXN0b3JlIEJ1ZmZlciBvYmplY3RzIHRoYXQgd2VyZSBzZXJpYWxpemVkIHdpdGggTm9kZS5qcyBkZWZhdWx0IEJ1ZmZlci50b0pTT04oKSBmb3JtYXRcbiAgICAvLyBUaGlzIGhhbmRsZXMgbGVnYWN5IGNhY2hlIGVudHJpZXMgb3IgcnVudGltZS1nZW5lcmF0ZWQgZW50cmllc1xuICAgIGlmIChcbiAgICAgIHZhbCAmJlxuICAgICAgdHlwZW9mIHZhbCA9PT0gXCJvYmplY3RcIiAmJlxuICAgICAgdmFsLnR5cGUgPT09IFwiQnVmZmVyXCIgJiZcbiAgICAgIEFycmF5LmlzQXJyYXkodmFsLmRhdGEpXG4gICAgKSB7XG4gICAgICByZXR1cm4gQnVmZmVyLmZyb20odmFsLmRhdGEpO1xuICAgIH1cbiAgICByZXR1cm4gdmFsO1xuICB9KTtcbn1cblxuLyoqXG4gKiBUaGUgY2FjaGUga2V5IGEgcHJlcmVuZGVyZWQgcm91dGUncyBzZWVkZWQgZW50cnkgaGFzIHRvIGJlIHdyaXR0ZW4gdW5kZXIuXG4gKlxuICogYGN0eC5vdXRwdXRzLnByZXJlbmRlcnNbXS5wYXRobmFtZWAgaXMgdGhlICpVUkwqIHRoZSBwYWdlIGlzIHNlcnZlZCBhdCwgc28gaXRcbiAqIGNhcnJpZXMgdGhlIGFwcCdzIGBiYXNlUGF0aGAuIFRoZSBrZXkgdGhlIHNlcnZlciBsYXRlciBsb29rcyBlbnRyaWVzIHVwIHVuZGVyXG4gKiBpcyB0aGUgcm91dGUsIHdoaWNoIGRvZXMgbm90IOKAlCBOZXh0LmpzIHN0cmlwcyBgYmFzZVBhdGhgIGJlZm9yZSByb3V0aW5nLCBzbyB0aGVcbiAqIGNhY2hlIGhhbmRsZXIgbmV2ZXIgc2VlcyBpdCBhdCByZXF1ZXN0IHRpbWUuIFNlZWRpbmcgYC9wcm9kL3NzZy8xYCB2ZXJiYXRpbVxuICogdGhlcmVmb3JlIHdyaXRlcyBgPGJ1aWxkSWQ+L3Byb2Qvc3NnLzEuanNvbmAgd2hpbGUgdGhlIHNlcnZlciBhc2tzIGZvclxuICogYDxidWlsZElkPi9zc2cvMS5qc29uYDogZXZlcnkgYnVpbGQtdGltZSBwcmVyZW5kZXIgaXMgYSBNSVNTIHRoYXQgcmUtcmVuZGVycyBvblxuICogZmlyc3QgcmVxdWVzdCwgYW5kIHRoZSBwYWdlIGlzIG9ubHkgXCJzdGF0aWNcIiBmcm9tIHRoZSBzZWNvbmQgdmlzaXQgb253YXJkcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByZXJlbmRlclBhdGhUb0NhY2hlS2V5KFxuICBwYXRobmFtZTogc3RyaW5nLFxuICBiYXNlUGF0aDogc3RyaW5nLFxuKTogc3RyaW5nIHtcbiAgLy8gTWF0Y2hpbmcgb24gYSBwYXRoIGJvdW5kYXJ5IHNvIGEgc2libGluZyByb3V0ZSBsaWtlIGAvcHJvZHVjdGlvbmAgaXMgbm90XG4gIC8vIHJlYWQgYXMgYmFzZVBhdGggYC9wcm9kYCBwbHVzIGB1Y3Rpb25gLlxuICBjb25zdCByb3V0ZSA9IChcbiAgICBoYXNQYXRoUHJlZml4KHBhdGhuYW1lLCBiYXNlUGF0aClcbiAgICAgID8gcGF0aG5hbWUuc2xpY2UoYmFzZVBhdGgubGVuZ3RoKVxuICAgICAgOiBwYXRobmFtZVxuICApXG4gICAgLy8gTGVhZGluZyBzbGFzaGVzIHdvdWxkIG1ha2UgYW4gUzMga2V5IHdpdGggYW4gZW1wdHkgZmlyc3Qgc2VnbWVudC5cbiAgICAucmVwbGFjZSgvXlxcLysvLCBcIlwiKTtcbiAgcmV0dXJuIHJvdXRlID09PSBcIlwiID8gXCJpbmRleFwiIDogcm91dGU7XG59XG5cbi8qKiBgYnVpbGRTM0tleWAgdW5kZXIgdGhlIGJ1aWxkIHByZWZpeDogYHtjYWNoZUtleX0uanNvbmAuICovXG5leHBvcnQgZnVuY3Rpb24gY2FjaGVLZXlGaWxlTmFtZShjYWNoZUtleTogc3RyaW5nKTogc3RyaW5nIHtcbiAgbGV0IGNsZWFuQ2FjaGVLZXkgPSBjYWNoZUtleTtcbiAgaWYgKGNhY2hlS2V5ID09PSBcIi9cIiB8fCBjYWNoZUtleSA9PT0gXCJcIikge1xuICAgIGNsZWFuQ2FjaGVLZXkgPSBcImluZGV4XCI7XG4gIH0gZWxzZSBpZiAoY2FjaGVLZXkuc3RhcnRzV2l0aChcIi9cIikpIHtcbiAgICBjbGVhbkNhY2hlS2V5ID0gY2FjaGVLZXkuc2xpY2UoMSk7XG4gIH1cbiAgcmV0dXJuIGAke2NsZWFuQ2FjaGVLZXl9Lmpzb25gO1xufVxuXG4vKiogYHZhbHVlYCdzIFNIQS0yNTYgZGlnZXN0LCBpbiBoZXg6IDY0IGNoYXJhY3RlcnMuICovXG5leHBvcnQgZnVuY3Rpb24gc2hhMjU2SGV4KHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gY3JlYXRlSGFzaChcInNoYTI1NlwiKS51cGRhdGUodmFsdWUpLmRpZ2VzdChcImhleFwiKTtcbn1cblxuLyoqIFMzJ3MgbGltaXQgb24gYW4gb2JqZWN0IGtleSwgaW4gVVRGLTggYnl0ZXMuICovXG5jb25zdCBNQVhfUzNfS0VZX0JZVEVTID0gMTAyNDtcblxuLyoqXG4gKiBUaGUgbG9uZ2VzdCBidWlsZCBJRCBjYWNoZSBlbnRyaWVzIGFyZSBzdG9yZWQgdW5kZXIsIHdoaWNoXG4gKiB7QGxpbmsgY2FjaGVPYmplY3ROYW1lfSBsZWF2ZXMgcm9vbSBmb3IgaW4gZnJvbnQgb2YgaXQgd2l0aCBpdHMgYC9gOiBhXG4gKiBOZXh0LmpzIGJ1aWxkIElEIGlzIDIxIGNoYXJhY3RlcnMsIGFuZCB0aGUgYC08ZGVwbG95bWVudElkPmAgY2RrLW5leHRqc1xuICogYXBwZW5kcyBpcyB0aGUgYXBwJ3Mgb3duLCBzbyB0aGUgYWRhcHRlciBmYWlscyBhIGJ1aWxkIHdob3NlIElEIGlzIGxvbmdlclxuICogKHNlZSBgYXNzZXJ0QnVpbGRJZEZpdHNgKSByYXRoZXIgdGhhbiBsZWF2ZSBsb25nIG5hbWVzIHVud3JpdGFibGUuXG4gKi9cbmV4cG9ydCBjb25zdCBNQVhfQlVJTERfSURfQllURVMgPSAxMjc7XG5cbi8qKlxuICogVGhlIGZvbGRlciB1bmRlciB0aGUgYnVpbGQgcHJlZml4IHRoYXQgZW50cmllcyB3aXRoIGFuIG92ZXItbG9uZyBrZXkgYXJlXG4gKiBzdG9yZWQgaW4uIEBzZWUgY2FjaGVPYmplY3ROYW1lXG4gKi9cbmV4cG9ydCBjb25zdCBMT05HX0tFWV9QUkVGSVggPSBcIl9sb25nLWtleVwiO1xuXG4vKipcbiAqIFdoZXJlIHRoZSBlbnRyeSBgYnVpbGRTM0tleWAgbmFtZXMgaXMgc3RvcmVkLCB1bmRlciB0aGUgYnVpbGQgcHJlZml4OlxuICogaXRzIG93biBuYW1lLCBvciBgX2xvbmcta2V5L3tzaGEyNTZ9LmxvbmdgIGZvciBhIG5hbWUgdGhhdCB3b3VsZCBsZWF2ZSB0aGVcbiAqIHdob2xlIG9iamVjdCBrZXkgcGFzdCBTMydzIDEwMjQgYnl0ZXMuIG5leHQgMTYuMy44J3Mgcm91dGUtc2NvcGVkIGtleXMgYXJlXG4gKiB+ODggYnl0ZXMgbG9uZ2VyIHRoYW4gYSBwYXRobmFtZSwgZW5vdWdoIHRvIHB1c2ggYSBsb25nIG9uZSBvdmVyLCBhbmQgYVxuICogcmVqZWN0ZWQgYFB1dE9iamVjdGAgbWVhbnQgdGhlIHBhZ2Ugd2FzIG5ldmVyIGNhY2hlZC5cbiAqXG4gKiBPbmx5IHRoZSBvYmplY3QgaXMgbW92ZWQ6IGBidWlsZFMzS2V5YCBzdGF5cyB0aGUgZW50cnkncyBuYW1lIGZvciB0YWdcbiAqIG1hcHBpbmdzIGFuZCBDbG91ZEZyb250IHBhdGhzLCBzaW5jZSBhIGhhc2ggbmFtZXMgbm8gcm91dGUuIERlY2lkZWQgb24gdGhlXG4gKiBuYW1lIGFsb25lIHJhdGhlciB0aGFuIHRoZSB3aG9sZSBrZXkgc28gdGhlIGluaXQgY2FjaGUsIHdoaWNoIGlzIHdyaXR0ZW5cbiAqIHdpdGhvdXQgdGhlIGJ1aWxkIElEIGl0IGlzIGRlcGxveWVkIHVuZGVyLCBmaWxlcyBhIHNlZWQgd2hlcmUgdGhlIHJ1bnRpbWVcbiAqIHJlYWRzIGl0LiBUaGUgYC5sb25nYCBzdWZmaXgga2VlcHMgdGhlc2UgZGlzam9pbnQgZnJvbSBldmVyeSBgLmpzb25gIG5hbWUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjYWNoZU9iamVjdE5hbWUoY2FjaGVLZXk6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IG5hbWUgPSBjYWNoZUtleUZpbGVOYW1lKGNhY2hlS2V5KTtcbiAgaWYgKEJ1ZmZlci5ieXRlTGVuZ3RoKG5hbWUpIDw9IE1BWF9TM19LRVlfQllURVMgLSAoTUFYX0JVSUxEX0lEX0JZVEVTICsgMSkpIHtcbiAgICByZXR1cm4gbmFtZTtcbiAgfVxuICByZXR1cm4gYCR7TE9OR19LRVlfUFJFRklYfS8ke3NoYTI1NkhleChuYW1lKX0ubG9uZ2A7XG59XG5cbi8qKlxuICogVGhlIHJlc3BvbnNlLWNhY2hlIGtleSBuZXh0ID49IDE2LjMuOCBzdG9yZXMgYSBwcmVyZW5kZXIgdW5kZXIsIHJlYWQgYmFjayBvZmZcbiAqIHRoZSBmaWxlIGBuZXh0IGJ1aWxkYCB3cm90ZSBpdCB0bywgb3IgYHVuZGVmaW5lZGAgYmVmb3JlIDE2LjMuOC5cbiAqXG4gKiBGcm9tIDE2LjMuOCBOZXh0LmpzIHNjb3BlcyBldmVyeSBwYWdlJ3MgY2FjaGUga2V5IGJ5IGl0cyBzb3VyY2Ugcm91dGUgLVxuICogYC9yb3V0ZS1jYWNoZS88a2luZD4vPHNoYTI1Nihzb3VyY2VSb3V0ZSk+LyQ8cGF0aG5hbWU+YCAoYGdldFJvdXRlQ2FjaGVLZXlgXG4gKiBpbiBgbmV4dC9kaXN0L3NlcnZlci9saWIvcm91dGUtY2FjaGUta2V5LmpzYCkgLSBhbmQsIHdpdGggYW4gYWRhcHRlciwgd3JpdGVzXG4gKiBlYWNoIHByZXJlbmRlciB0byBgPGRpc3REaXI+L3NlcnZlci88a2V5PjxleHQ+YC4gVGhlIGZpbGUgcGF0aCBpcyB0aGUgb25seVxuICogcGxhY2UgYW4gYWRhcHRlciBpcyBoYW5kZWQgdGhhdCBrZXksIGFuZCByZS1kZXJpdmluZyBpdCB3b3VsZCBtZWFuIHJlLXBpY2tpbmdcbiAqIHRoZSBzb3VyY2Ugcm91dGUgdGhlIHdheSBgYnVpbGQtY29tcGxldGUuanNgIGRvZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByb3V0ZUNhY2hlS2V5RnJvbUZpbGVQYXRoKFxuICBmaWxlUGF0aDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgLy8gVGhlIGZpcnN0IGAvc2VydmVyL3JvdXRlLWNhY2hlL2A6IGEgcm91dGUncyBvd24gcGF0aG5hbWUgY2FuIGNvbnRhaW4gb25lXG4gIC8vIGFmdGVyIGl0LiBCZWZvcmUgMTYuMy44IGEgcm91dGUgb2YgdGhhdCBuYW1lIGlzIGFsbCB0aGVyZSBpcywgd2hpY2ggdGhlXG4gIC8vIHByZWZpeCBjaGVjayBiZWxvdyByZWplY3RzLlxuICBjb25zdCBwYXRoID0gZmlsZVBhdGg/LnNwbGl0KHNlcCkuam9pbihcIi9cIik7XG4gIGNvbnN0IGF0ID0gcGF0aD8uaW5kZXhPZihST1VURV9DQUNIRV9ESVIpID8/IC0xO1xuICBpZiAoYXQgPCAwKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICBjb25zdCBrZXkgPSBwYXRoIS5zbGljZShhdCArIFwiL3NlcnZlci9cIi5sZW5ndGgpLnJlcGxhY2UoL1xcLlteLi9dKyQvLCBcIlwiKTtcbiAgcmV0dXJuIFJPVVRFX0NBQ0hFX0tFWV9QUkVGSVgudGVzdChrZXkpID8ga2V5IDogdW5kZWZpbmVkO1xufVxuXG5jb25zdCBST1VURV9DQUNIRV9ESVIgPSBcIi9zZXJ2ZXIvcm91dGUtY2FjaGUvXCI7XG5cbi8qKlxuICogVGhlIHN0YXJ0IG9mIGEgbmV4dCA+PSAxNi4zLjggcmVzcG9uc2UtY2FjaGUga2V5LCBsZWFkaW5nIHNsYXNoIGRyb3BwZWQ6XG4gKiBgcm91dGUtY2FjaGUvPGtpbmQ+LzxzaGEyNTYoc291cmNlUm91dGUpPi8kYCAoYGdldFJvdXRlQ2FjaGVLZXlgKSwgZm9sbG93ZWRcbiAqIGJ5IHRoZSBwYXRobmFtZS4gTWF0Y2hlZCB3aG9sZSwgc28gYW4gb2xkZXIgYXBwJ3Mgcm91dGUgdGhhdCBoYXBwZW5zIHRvIGJlXG4gKiBuYW1lZCBgL3JvdXRlLWNhY2hlLy4uLmAgaXMgbm90IHJlYWQgYXMgb25lLlxuICovXG5leHBvcnQgY29uc3QgUk9VVEVfQ0FDSEVfS0VZX1BSRUZJWCA9XG4gIC9ecm91dGUtY2FjaGVcXC9bQS1aX10rXFwvWzAtOWEtZl17NjR9XFwvXFwkKD89XFwvKS87XG5cbi8qKlxuICogYGRlbm9ybWFsaXplUGFnZVBhdGhgIChgbmV4dC9kaXN0L3NoYXJlZC9saWIvcGFnZS1wYXRoL2Rlbm9ybWFsaXplLXBhZ2UtcGF0aC5qc2ApLFxuICogdGhlIGludmVyc2Ugb2YgdGhlIGBub3JtYWxpemVQYWdlUGF0aGAgYSByb3V0ZS1jYWNoZSBrZXkncyBwYXRobmFtZSBnb2VzXG4gKiB0aHJvdWdoOiBgL2luZGV4YCBiYWNrIHRvIGAvYCwgYW5kIGAvaW5kZXgvLi4uYCAtIGhvdyBgL2luZGV4YCBpdHNlbGYgYW5kXG4gKiBldmVyeSBwYXRoIHVuZGVyIGl0IGFyZSBzcGVsbGVkIC0gYmFjayB0byBgLy4uLmAuIFJlc3RhdGVkIHdpdGhvdXQgaXRzXG4gKiBkeW5hbWljLXJvdXRlIGNoZWNrOiBgczNLZXlUb0ludmFsaWRhdGlvblBhdGhgIGhhcyBkcm9wcGVkIHRob3NlIGFscmVhZHkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZW5vcm1hbGl6ZVBhZ2VQYXRoKHBhZ2VQYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICBpZiAocGFnZVBhdGggPT09IFwiL2luZGV4XCIpIHtcbiAgICByZXR1cm4gXCIvXCI7XG4gIH1cbiAgcmV0dXJuIHBhZ2VQYXRoLnN0YXJ0c1dpdGgoXCIvaW5kZXgvXCIpXG4gICAgPyBwYWdlUGF0aC5zbGljZShcIi9pbmRleFwiLmxlbmd0aClcbiAgICA6IHBhZ2VQYXRoO1xufVxuXG4vKiogVGhlIG91dHB1dHMgb25lIHJvdXRlIGNvbnRyaWJ1dGVzIHRvIGBjdHgub3V0cHV0cy5wcmVyZW5kZXJzYC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJlcmVuZGVyVmFyaWFudHM8VD4ge1xuICAvKiogVGhlIEhUTUwgcmVuZGVyLiBJdHMgcGF0aG5hbWUgaXMgdGhlIHJvdXRlLCB3aXRoIG5vIHN1ZmZpeC4gKi9cbiAgaHRtbD86IFQ7XG4gIC8qKiBUaGUgZmxpZ2h0IHBheWxvYWQsIGJ1aWx0IGFzIGA8cm91dGU+LnJzY2Ag4oCUIGJ1dCBzZWUge0BsaW5rIGdyb3VwUHJlcmVuZGVyc30uICovXG4gIHJzYz86IFQ7XG4gIC8qKiBQZXItc2VnbWVudCBmbGlnaHQgcGF5bG9hZHMsIHVuZGVyIGA8cm91dGU+LnNlZ21lbnRzL2AuICovXG4gIHNlZ21lbnRzOiBUW107XG4gIC8qKiBBIFBhZ2VzIFJvdXRlciByb3V0ZSdzIGBwYWdlRGF0YWAsIGJ1aWx0IGFzIGl0cyBgL19uZXh0L2RhdGEvYCByb3V0ZS4gKi9cbiAgZGF0YT86IFQ7XG59XG5cbmNvbnN0IElOREVYX1NVRkZJWCA9IFwiL2luZGV4XCI7XG5cbi8qKlxuICogQSBQYWdlcyBSb3V0ZXIgZGF0YSByb3V0ZTogYC9fbmV4dC9kYXRhLzxidWlsZElkPi88cGFnZT4uanNvbmAsIG9wdGlvbmFsbHlcbiAqIGJlaGluZCBhIGBiYXNlUGF0aGAgKGBub3JtYWxpemVQYXRobmFtZWAgaW4gTmV4dC5qcydzIGBidWlsZC1jb21wbGV0ZWAgcHJlZml4ZXNcbiAqIGV2ZXJ5IG91dHB1dCBwYXRobmFtZSwgdGhpcyBvbmUgaW5jbHVkZWQpLlxuICpcbiAqIENhcHR1cmUgMSBpcyB0aGF0IHByZWZpeCBhbmQgY2FwdHVyZSAyIHRoZSBwYWdlIHBhdGggd2l0aG91dCBpdHMgYC5qc29uYCwgc29cbiAqIGAvcHJvZC9fbmV4dC9kYXRhL2FiYzEyMy9ibG9nL2hlbGxvLmpzb25gIHJlY29tcG9zZXMgdG8gYC9wcm9kL2Jsb2cvaGVsbG9gLlxuICovXG5jb25zdCBQQUdFU19EQVRBX1BBVEhOQU1FID0gL14oLiopXFwvX25leHRcXC9kYXRhXFwvW14vXStcXC8oLispXFwuanNvbiQvO1xuXG4vKipcbiAqIENvbGxlY3QgYGN0eC5vdXRwdXRzLnByZXJlbmRlcnNgIGludG8gb25lIGVudHJ5IHBlciByb3V0ZS5cbiAqXG4gKiBOZXh0LmpzIGVtaXRzIHVwIHRvIHRocmVlIHNoYXBlcyBwZXIgcHJlcmVuZGVyZWQgQXBwIFJvdXRlciByb3V0ZSDigJQgYC9ibG9nL2hlbGxvYCxcbiAqIGAvYmxvZy9oZWxsby5yc2NgLCBhbmQgYC9ibG9nL2hlbGxvLnNlZ21lbnRzLyouc2VnbWVudC5yc2NgIOKAlCBhbmQgYSBjYWNoZSBlbnRyeVxuICogbmVlZHMgYWxsIG9mIHRoZW0gdG9nZXRoZXIsIHNvIHRoZXkgaGF2ZSB0byBiZSBncm91cGVkIGJ5IHJvdXRlIGJlZm9yZSBhbnl0aGluZ1xuICogY2FuIGJlIHNlZWRlZC4gQSBQYWdlcyBSb3V0ZXIgcm91dGUgZW1pdHMgdHdvOiB0aGUgSFRNTCwgYW5kIGl0cyBgcGFnZURhdGFgIGF0XG4gKiB0aGUgcm91dGUncyBgL19uZXh0L2RhdGEvPGJ1aWxkSWQ+LzxwYWdlPi5qc29uYCBwYXRobmFtZVxuICogKHtAbGluayBQQUdFU19EQVRBX1BBVEhOQU1FfSkuIFRoYXQgb25lIGlzIG5vdCBhIHN1ZmZpeCBvZiB0aGUgcGFnZSdzIG93blxuICogcGF0aG5hbWUsIHNvIGl0IGlzIG1hdGNoZWQgcmF0aGVyIHRoYW4gc3RyaXBwZWQuXG4gKlxuICogVGhlIG9uZSBjYXNlIHRoYXQgaXMgbm90IGEgc3VmZml4IHN0cmlwIGlzIHRoZSAqKnJvb3Qgcm91dGUqKiwgd2hpY2ggY2Fubm90IGJlXG4gKiBuYW1lZCBgLy5yc2NgOiBpdHMgcGF5bG9hZHMgYXJlIGVtaXR0ZWQgdW5kZXIgYC9pbmRleC5yc2NgIGFuZFxuICogYC9pbmRleC5zZWdtZW50cy9gIHdoaWxlIGl0cyBIVE1MIHN0YXlzIGF0IGAvYCAob3IgYXQgdGhlIGBiYXNlUGF0aGAsIGUuZy5cbiAqIGAvcHJvZGAgYW5kIGAvcHJvZC9pbmRleC5yc2NgKS4gUmVjb25zdHJ1Y3RpbmcgbmFtZXMgYnkgY29uY2F0ZW5hdGlvbiB0aGVyZWZvcmVcbiAqIHNpbGVudGx5IGxvc2VzIHRoZSBob21lIHBhZ2UncyBgcnNjRGF0YWAg4oCUIGFuZCB3aXRoIGEgYGJhc2VQYXRoYCBhbHNvIGl0c1xuICogYHNlZ21lbnREYXRhYCwgYmVjYXVzZSBgL3Byb2RgIGFuZCBgL3Byb2QvaW5kZXhgIGdyb3VwIGFwYXJ0LiBUaGF0IGlzIG5vdCBhXG4gKiBjb3NtZXRpYyBnYXA6IGBhcHAtcGFnZS1ydW50aW1lLmpzYCBhbnN3ZXJzIGFuIFJTQyByZXF1ZXN0IGZvciBhbiBlbnRyeSB3aXRoIG5vXG4gKiBgcnNjRGF0YWAgYnkgY2hlY2tpbmcgYGNhY2hlZERhdGEuaHRtbC5jb250ZW50VHlwZWAsIGFuZCB1bmRlciBgY2FjaGVDb21wb25lbnRzYFxuICogc2VuZHMgYW4gZW1wdHkgYDQwNGAuIEV2ZXJ5IGNsaWVudC1zaWRlIG5hdmlnYXRpb24gdG8gYC9gIGJyZWFrcy5cbiAqXG4gKiBUaGUgcmVtYXAgaXMgY29uZGl0aW9uYWwgcmF0aGVyIHRoYW4gdW5jb25kaXRpb25hbCBzbyB0aGF0IGFuIGFwcCB3aXRoIGEgcmVhbFxuICogcGFnZSBhdCBgYXBwL2luZGV4L3BhZ2UudHN4YCDigJQgd2hvc2UgSFRNTCBwcmVyZW5kZXIgZ2VudWluZWx5IGlzIGAvaW5kZXhgIOKAlCBrZWVwc1xuICogaXRzIG93biBncm91cC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdyb3VwUHJlcmVuZGVyczxUIGV4dGVuZHMgeyBwYXRobmFtZTogc3RyaW5nIH0+KFxuICBwcmVyZW5kZXJzOiBUW10sXG4pOiBNYXA8c3RyaW5nLCBQcmVyZW5kZXJWYXJpYW50czxUPj4ge1xuICBjb25zdCBodG1sUGF0aG5hbWVzID0gbmV3IFNldChcbiAgICBwcmVyZW5kZXJzXG4gICAgICAubWFwKChwKSA9PiBwLnBhdGhuYW1lKVxuICAgICAgLmZpbHRlcihcbiAgICAgICAgKHApID0+XG4gICAgICAgICAgIXAuZW5kc1dpdGgoXCIucnNjXCIpICYmXG4gICAgICAgICAgIXAuaW5jbHVkZXMoXCIuc2VnbWVudHMvXCIpICYmXG4gICAgICAgICAgIVBBR0VTX0RBVEFfUEFUSE5BTUUudGVzdChwKSxcbiAgICAgICksXG4gICk7XG4gIGNvbnN0IGdyb3VwcyA9IG5ldyBNYXA8c3RyaW5nLCBQcmVyZW5kZXJWYXJpYW50czxUPj4oKTtcblxuICBjb25zdCB2YXJpYW50c0ZvciA9IChiYXNlOiBzdHJpbmcpOiBQcmVyZW5kZXJWYXJpYW50czxUPiA9PiB7XG4gICAgbGV0IHZhcmlhbnRzID0gZ3JvdXBzLmdldChiYXNlKTtcbiAgICBpZiAoIXZhcmlhbnRzKSB7XG4gICAgICB2YXJpYW50cyA9IHsgc2VnbWVudHM6IFtdIH07XG4gICAgICBncm91cHMuc2V0KGJhc2UsIHZhcmlhbnRzKTtcbiAgICB9XG4gICAgcmV0dXJuIHZhcmlhbnRzO1xuICB9O1xuXG4gIC8qKiBgL2luZGV4LnJzY2AgYmVsb25ncyB0byBgL2AsIGAvcHJvZC9pbmRleC5yc2NgIHRvIGAvcHJvZGAuICovXG4gIGNvbnN0IHJvdXRlT2YgPSAoYmFzZTogc3RyaW5nKTogc3RyaW5nID0+IHtcbiAgICBpZiAoYmFzZS5lbmRzV2l0aChJTkRFWF9TVUZGSVgpICYmICFodG1sUGF0aG5hbWVzLmhhcyhiYXNlKSkge1xuICAgICAgY29uc3QgcGFyZW50ID0gYmFzZS5zbGljZSgwLCAtSU5ERVhfU1VGRklYLmxlbmd0aCkgfHwgXCIvXCI7XG4gICAgICBpZiAoaHRtbFBhdGhuYW1lcy5oYXMocGFyZW50KSkge1xuICAgICAgICByZXR1cm4gcGFyZW50O1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYmFzZTtcbiAgfTtcblxuICBmb3IgKGNvbnN0IHByZXJlbmRlciBvZiBwcmVyZW5kZXJzKSB7XG4gICAgY29uc3QgeyBwYXRobmFtZSB9ID0gcHJlcmVuZGVyO1xuICAgIGNvbnN0IGRhdGFSb3V0ZSA9IFBBR0VTX0RBVEFfUEFUSE5BTUUuZXhlYyhwYXRobmFtZSk7XG4gICAgaWYgKGRhdGFSb3V0ZSkge1xuICAgICAgdmFyaWFudHNGb3Iocm91dGVPZihgJHtkYXRhUm91dGVbMV19LyR7ZGF0YVJvdXRlWzJdfWApKS5kYXRhID0gcHJlcmVuZGVyO1xuICAgIH0gZWxzZSBpZiAocGF0aG5hbWUuaW5jbHVkZXMoXCIuc2VnbWVudHMvXCIpKSB7XG4gICAgICB2YXJpYW50c0Zvcihyb3V0ZU9mKHBhdGhuYW1lLnNwbGl0KFwiLnNlZ21lbnRzL1wiKVswXSkpLnNlZ21lbnRzLnB1c2goXG4gICAgICAgIHByZXJlbmRlcixcbiAgICAgICk7XG4gICAgfSBlbHNlIGlmIChwYXRobmFtZS5lbmRzV2l0aChcIi5yc2NcIikpIHtcbiAgICAgIHZhcmlhbnRzRm9yKHJvdXRlT2YocGF0aG5hbWUuc2xpY2UoMCwgLVwiLnJzY1wiLmxlbmd0aCkpKS5yc2MgPSBwcmVyZW5kZXI7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhcmlhbnRzRm9yKHBhdGhuYW1lKS5odG1sID0gcHJlcmVuZGVyO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBncm91cHM7XG59XG5cbi8qKlxuICogSGVhZGVycyB0aGF0IG11c3Qgbm90IGJlIHNlZWRlZCBpbnRvIGFuIGBBUFBfUEFHRWAgY2FjaGUgZW50cnksIGV2ZW4gdGhvdWdoIHRoZVxuICogYWRhcHRlciBvdXRwdXQgbGlzdHMgdGhlbSBpbiBgZmFsbGJhY2suaW5pdGlhbEhlYWRlcnNgLlxuICpcbiAqIGBpbml0aWFsSGVhZGVyc2AgZGVzY3JpYmVzIGhvdyBhIHBsYXRmb3JtIHNob3VsZCBzZXJ2ZSB0aGUgcHJlcmVuZGVyZWQgKmZpbGUqXG4gKiBzdHJhaWdodCBvZmYgYSBDRE4uIEEgY2FjaGUgZW50cnkgaXMgYSBkaWZmZXJlbnQgdGhpbmc6IGBhcHAtcGFnZS1ydW50aW1lLmpzYFxuICogYGFwcGVuZEhlYWRlcmBzIGBjYWNoZWREYXRhLmhlYWRlcnNgIG9udG8gdGhlIHJlc3BvbnNlIGFuZCAqdGhlbiogc2VydmVzIHRoZVxuICogdmFyaWFudCB0aGUgcmVxdWVzdCBhY3R1YWxseSBhc2tlZCBmb3IsIHNvIGFueXRoaW5nIHByZXNlbnRhdGlvbmFsIGluIHRoZXJlIGlzXG4gKiBlaXRoZXIgd3Jvbmcgb3IgZG91YmxlZC4gQXQgcmVxdWVzdCB0aW1lIE5leHQuanMgc3RvcmVzIG9ubHkgd2hhdCB0aGUgcmVuZGVyXG4gKiBwdXQgaW4gYG1ldGFkYXRhLmhlYWRlcnNgIOKAlCBgeC1uZXh0anMtc3RhbGUtdGltZWAsIGB4LW5leHQtY2FjaGUtdGFnc2AsIGFuZFxuICogd2hhdGV2ZXIgdGhlIGFwcCBzZXQgdGhyb3VnaCBgaGVhZGVycygpYC9gY29va2llcygpYCDigJQgYW5kIG5ldmVyIHRoZXNlIGZvdXIuXG4gKlxuICogYGNvbnRlbnQtdHlwZWAgaXMgdGhlIG9uZSB0aGF0IGFjdHVhbGx5IGJyZWFrcy4gYHNlbmQtcGF5bG9hZC5qc2Agc2V0cyB0aGUgdHlwZVxuICogb25seSB3aGVuIHRoZSByZXNwb25zZSBkb2VzIG5vdCBhbHJlYWR5IGhhdmUgb25lXG4gKiAoYGlmICghcmVzLmdldEhlYWRlcignQ29udGVudC1UeXBlJykgJiYgcmVzdWx0LmNvbnRlbnRUeXBlKWApLCBzbyBhIHNlZWRlZFxuICogYHRleHQvaHRtbDsgY2hhcnNldD11dGYtOGAgbWFrZXMgZXZlcnkgUlNDIHJlcXVlc3QgdG8gYSBwcmVyZW5kZXJlZCBwYWdlIGFuc3dlclxuICogdGhlIGZsaWdodCBwYXlsb2FkIGxhYmVsZWQgYXMgSFRNTC4gVGhlIGNsaWVudCByb3V0ZXIgcmVqZWN0cyB0aGF0LCBhbmQgc28gZG9lc1xuICogTmV4dC5qcyBpdHNlbGY6IGBjcmVhdGVSZWRpcmVjdFJlbmRlclJlc3VsdGAgY2hlY2tzIHRoZSBjb250ZW50IHR5cGUgb2YgdGhlXG4gKiBzdWItcmVzcG9uc2UgaXQgZmV0Y2hlcyB0byBzdHJlYW0gYW4gYWN0aW9uIGByZWRpcmVjdCgpYCwgYW5kIG9uIGEgbWlzbWF0Y2hcbiAqIGNhbmNlbHMgdGhlIGJvZHkgYW5kIHJldHVybnMgYW4gZW1wdHkgcmVzdWx0LlxuICpcbiAqIGB2YXJ5YCwgYHgtbmV4dGpzLXByZXJlbmRlcmAsIGFuZCBgeC1uZXh0anMtcG9zdHBvbmVkYCBhcmUgYWxsIHNldCBieSB0aGVcbiAqIGVudHJ5cG9pbnQgaXRzZWxmLCBzbyBzZWVkaW5nIHRoZW0gb25seSBwcm9kdWNlcyB0d28gb2YgZWFjaC5cbiAqXG4gKiBgQVBQX1JPVVRFYCBlbnRyaWVzIGFyZSBkZWxpYmVyYXRlbHkgKm5vdCogZmlsdGVyZWQ6IGEgcm91dGUgaGFuZGxlcidzXG4gKiBgY29udGVudC10eXBlYCBpcyBwYXJ0IG9mIGl0cyBjYWNoZWQgcmVzcG9uc2UsIGFuZCBgYXBwLXJvdXRlLmpzYCByZXBsYXlzIHRob3NlXG4gKiBoZWFkZXJzIHZlcmJhdGltLlxuICovXG5jb25zdCBOT05fQ0FDSEVBQkxFX0FQUF9QQUdFX0hFQURFUlMgPSBuZXcgU2V0KFtcbiAgXCJjb250ZW50LXR5cGVcIixcbiAgXCJ2YXJ5XCIsXG4gIFwieC1uZXh0anMtcHJlcmVuZGVyXCIsXG4gIFwieC1uZXh0anMtcG9zdHBvbmVkXCIsXG5dKTtcblxuLyoqIFNlZSB7QGxpbmsgTk9OX0NBQ0hFQUJMRV9BUFBfUEFHRV9IRUFERVJTfS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhcHBQYWdlQ2FjaGVIZWFkZXJzPFQ+KFxuICBpbml0aWFsSGVhZGVyczogUmVjb3JkPHN0cmluZywgVD4sXG4pOiBSZWNvcmQ8c3RyaW5nLCBUPiB7XG4gIGNvbnN0IGhlYWRlcnM6IFJlY29yZDxzdHJpbmcsIFQ+ID0ge307XG4gIGZvciAoY29uc3QgW25hbWUsIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhpbml0aWFsSGVhZGVycykpIHtcbiAgICBpZiAoIU5PTl9DQUNIRUFCTEVfQVBQX1BBR0VfSEVBREVSUy5oYXMobmFtZS50b0xvd2VyQ2FzZSgpKSkge1xuICAgICAgaGVhZGVyc1tuYW1lXSA9IHZhbHVlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gaGVhZGVycztcbn1cblxuLyoqIGBORVhUX0NBQ0hFX1RBR1NfSEVBREVSYCwgaW5saW5lZCBzbyB0aGlzIGZpbGUgaW1wb3J0cyBubyBOZXh0LmpzIGludGVybmFscy4gKi9cbmNvbnN0IE5FWFRfQ0FDSEVfVEFHU19IRUFERVIgPSBcIngtbmV4dC1jYWNoZS10YWdzXCI7XG5cbi8qKlxuICogVGhlIHRhZ3MgYSBjYWNoZSB2YWx1ZSdzIHJlbmRlciB3YXMgdGFnZ2VkIHdpdGgsIGFzIE5leHQuanMgcmVjb3JkcyB0aGVtOiBpblxuICogaXRzIGB4LW5leHQtY2FjaGUtdGFnc2AgaGVhZGVyLCBjb21tYSBzZXBhcmF0ZWQsIGluY2x1ZGluZyB0aGUgaW1wbGljaXRcbiAqIGBfTl9UXy/igKZgIHBhdGggY2hhaW4gYHJldmFsaWRhdGVQYXRoYCB1c2VzLiBPbmUgcGFyc2VyIGZvciB0aGUgYnVpbGQncyB0YWdcbiAqIG1hbmlmZXN0IGFuZCB0aGUgcnVudGltZSdzIG1hcHBpbmcgcm93cywgd2hpY2ggaGF2ZSB0byBhZ3JlZS5cbiAqXG4gKiBgdmFsdWVgIGlzIGB1bmtub3duYCBiZWNhdXNlIGl0IGFycml2ZXMgYm90aCBhcyBhIHN0b3JlZCBlbnRyeSByZWFkIGJhY2sgZnJvbVxuICogUzMgYW5kIGFzIHRoZSBgSW5jcmVtZW50YWxDYWNoZVZhbHVlYCB1bmlvbjsgb25seSBzb21lIG1lbWJlcnMgaGF2ZSBoZWFkZXJzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaGVhZGVyVGFncyh2YWx1ZTogdW5rbm93bik6IHN0cmluZ1tdIHtcbiAgY29uc3QgaGVhZGVycyA9ICh2YWx1ZSBhcyB7IGhlYWRlcnM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB9IHwgbnVsbClcbiAgICA/LmhlYWRlcnM7XG4gIGNvbnN0IGhlYWRlciA9IGhlYWRlcnM/LltORVhUX0NBQ0hFX1RBR1NfSEVBREVSXTtcbiAgcmV0dXJuIHR5cGVvZiBoZWFkZXIgPT09IFwic3RyaW5nXCIgPyBoZWFkZXIuc3BsaXQoXCIsXCIpLmZpbHRlcihCb29sZWFuKSA6IFtdO1xufVxuXG4vKipcbiAqIE5hbWUgb2YgdGhlIGZpbGUgdGhlIGFkYXB0ZXIgd3JpdGVzIGludG8gdGhlIGluaXQgY2FjaGUgZGlyZWN0b3J5IG1hcHBpbmcgZWFjaFxuICogY2FjaGUgdGFnIHRvIHRoZSBjYWNoZSBrZXlzIG9mIHRoZSBidWlsZC10aW1lIHByZXJlbmRlcnMgY2FycnlpbmcgaXQuXG4gKlxuICogSXQgcmlkZXMgdG8gUzMgd2l0aCB0aGUgcmVzdCBvZiB0aGUgaW5pdCBjYWNoZSwgYW5kIGBTM0NhY2hlSGFuZGxlcmAnc1xuICogYHJldmFsaWRhdGVUYWdgIHJlYWRzIGl0IGFsb25nc2lkZSB0aGUgYHRhZyNjYWNoZUtleWAgcm93cyBhIHJ1bnRpbWUgYHNldGBcbiAqIHdyaXRlcy4gV2l0aG91dCBpdCBgcmV2YWxpZGF0ZVRhZ2Aga25vd3MgYSBwcmVyZW5kZXIgaXMgc3RhbGUgKHNlZVxuICogYGNoZWNrSWZSZXZhbGlkYXRlZGApIGJ1dCBub3Qgd2hpY2ggQ2xvdWRGcm9udCBwYXRocyB0byBpbnZhbGlkYXRlLCBzbyB0aGUgQ0ROXG4gKiBrZWVwcyBzZXJ2aW5nIHRoZSBvbGQgcmVzcG9uc2UgdW50aWwgaXRzIFRUTCBleHBpcmVzIC0gYSB5ZWFyLCBmb3IgYVxuICogcHJlcmVuZGVyLlxuICpcbiAqIFRoZSBsZWFkaW5nIHVuZGVyc2NvcmUga2VlcHMgaXQgY2xlYXIgb2YgY2FjaGUga2V5cywgd2hpY2ggYXJlIHJvdXRlIHBhdGhzLlxuICovXG5leHBvcnQgY29uc3QgSU5JVF9DQUNIRV9UQUdfTUFOSUZFU1QgPSBcIl9jZGstbmV4dGpzLXRhZy1tYW5pZmVzdC5qc29uXCI7XG5cbi8qKiBDb250ZW50cyBvZiB7QGxpbmsgSU5JVF9DQUNIRV9UQUdfTUFOSUZFU1R9OiB0YWcgLT4gaW5pdCBjYWNoZSBrZXlzLiAqL1xuZXhwb3J0IHR5cGUgSW5pdENhY2hlVGFnTWFuaWZlc3QgPSBSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT47XG5cbi8qKlxuICogVGhlIGBjdHhgIE5leHQuanMgcGFzc2VzIGEgYENhY2hlSGFuZGxlcmAncyBgZ2V0YCwgdGFrZW4gb2ZmIGl0cyBpbnRlcmZhY2U6XG4gKiB0aGUgZmV0Y2ggY2FjaGUncywgYSByb3V0ZSByZXNwb25zZSdzLCBvciAtIHNpbmNlIHRoaXMgaGFuZGxlciBpcyBhbHNvXG4gKiBgSW1hZ2VPcHRpbWl6ZXJDYWNoZWAncyAtIGFuIG9wdGltaXplZCBpbWFnZSdzLlxuICovXG5leHBvcnQgdHlwZSBHZXRDYWNoZUhhbmRsZXJDb250ZXh0ID0gUGFyYW1ldGVyczxDYWNoZUhhbmRsZXJbXCJnZXRcIl0+WzFdO1xuXG4vKiogVGhlIGBjdHhgIE5leHQuanMgcGFzc2VzIGEgYENhY2hlSGFuZGxlcmAncyBgc2V0YC4gU2VlIHtAbGluayBHZXRDYWNoZUhhbmRsZXJDb250ZXh0fS4gKi9cbmV4cG9ydCB0eXBlIFNldENhY2hlSGFuZGxlckNvbnRleHQgPSBQYXJhbWV0ZXJzPENhY2hlSGFuZGxlcltcInNldFwiXT5bMl07XG5cbi8qKlxuICogSGVscGVyIHRvIHNhZmVseSBleHRyYWN0IHRhZ3MgZnJvbSBjb250ZXh0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRUYWdzKGN0eDogU2V0Q2FjaGVIYW5kbGVyQ29udGV4dCk6IHN0cmluZ1tdIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIFwidGFnc1wiIGluIGN0eCA/IGN0eC50YWdzIDogdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFRoZSBsaWZldGltZSBhIHJlc3BvbnNlIGVudHJ5IHdhcyByZW5kZXJlZCB3aXRoOiBgY3R4LmNhY2hlQ29udHJvbGAsIHdoaWNoXG4gKiBgUmVzcG9uc2VDYWNoZS5zZXRgIHBhc3NlcyBhbmQgYSBgZmV0Y2hgIGVudHJ5J3MgYHNldGAgZG9lcyBub3QgKGl0c1xuICogYHJldmFsaWRhdGVgIGlzIGluc2lkZSB0aGUgdmFsdWUpLlxuICpcbiAqIFN0b3JlZCB3aXRoIHRoZSBlbnRyeSBhbmQgaGFuZGVkIGJhY2sgZnJvbSBgZ2V0YCwgYmVjYXVzZSBuZXh0IDE2LjQgcHJlZmVyc1xuICogaXQgdGhlcmUgb3ZlciBpdHMgb3duIHBlci1wcm9jZXNzIGBTaGFyZWRDYWNoZUNvbnRyb2xzYC4gV2l0aG91dCBpdCBhIGZyZXNoXG4gKiBpbnN0YW5jZSBvbmx5IGtub3dzIHdoYXQgdGhlIHByZXJlbmRlciBtYW5pZmVzdCByZWNvcmRlZCBhdCBidWlsZCB0aW1lLCBzbyBhXG4gKiBwYWdlIHdob3NlIGxpZmV0aW1lIHdhcyBkZWNpZGVkIGF0IHJlbmRlciAoYGNhY2hlTGlmZWAsIGEgYGZldGNoYCdzXG4gKiBgcmV2YWxpZGF0ZWAsIGBnZXRTdGF0aWNQcm9wc2AgcmV0dXJuaW5nIGFub3RoZXIgYHJldmFsaWRhdGVgKSB3YXMgYWdlZCBieVxuICogdGhlIGJ1aWxkLXRpbWUgdmFsdWUgdW50aWwgdGhhdCBpbnN0YW5jZSByZW5kZXJlZCBpdCBpdHNlbGYsIGFuZCBhIHBhdGggdGhlXG4gKiBtYW5pZmVzdCBkb2VzIG5vdCBjb3ZlciBieSBOZXh0LmpzJ3MgZGVmYXVsdCBvZiAxIHNlY29uZDogZXZlcnkgY29sZCBMYW1iZGFcbiAqIHNlcnZlZCBpdCBzdGFsZSBhbmQgcmVnZW5lcmF0ZWQgaXQuIE9sZGVyIGBuZXh0YCBpZ25vcmVzIHRoZSBmaWVsZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldENhY2hlQ29udHJvbChcbiAgY3R4OiBTZXRDYWNoZUhhbmRsZXJDb250ZXh0LFxuKTogQ2FjaGVDb250cm9sIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIFwiY2FjaGVDb250cm9sXCIgaW4gY3R4XG4gICAgPyBzdG9yZWRDYWNoZUNvbnRyb2woY3R4LmNhY2hlQ29udHJvbClcbiAgICA6IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBgdmFsdWVgIGlmIGl0IGlzIGEge0BsaW5rIENhY2hlQ29udHJvbH0sIGFzIHJlYWQgYmFjayBvZmYgYSBzdG9yZWQgZW50cnkuXG4gKiBBbnl0aGluZyBlbHNlIGlzIGRyb3BwZWQgcmF0aGVyIHRoYW4gaGFuZGVkIHRvIE5leHQuanMsIHdoaWNoIGFnZXMgdGhlIGVudHJ5XG4gKiBieSBpdDogTmV4dC5qcyB0aGVuIGZhbGxzIGJhY2sgdG8gdGhlIGxpZmV0aW1lIGl0IGtub3dzLCBhcyBiZWZvcmUgMTYuNC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN0b3JlZENhY2hlQ29udHJvbCh2YWx1ZTogdW5rbm93bik6IENhY2hlQ29udHJvbCB8IHVuZGVmaW5lZCB7XG4gIGlmICh0eXBlb2YgdmFsdWUgIT09IFwib2JqZWN0XCIgfHwgdmFsdWUgPT09IG51bGwpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIGNvbnN0IHsgcmV2YWxpZGF0ZSwgZXhwaXJlIH0gPSB2YWx1ZSBhcyBQYXJ0aWFsPENhY2hlQ29udHJvbD47XG4gIGlmIChcbiAgICByZXZhbGlkYXRlICE9PSBmYWxzZSAmJlxuICAgICEoXG4gICAgICB0eXBlb2YgcmV2YWxpZGF0ZSA9PT0gXCJudW1iZXJcIiAmJlxuICAgICAgTnVtYmVyLmlzRmluaXRlKHJldmFsaWRhdGUpICYmXG4gICAgICByZXZhbGlkYXRlID4gMFxuICAgIClcbiAgKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICAvLyBGaW5pdGU6IEpTT04gd3JpdGVzIGBJbmZpbml0eWAgYW5kIGBOYU5gIGFzIGBudWxsYC5cbiAgaWYgKGV4cGlyZSAhPT0gdW5kZWZpbmVkICYmICFOdW1iZXIuaXNGaW5pdGUoZXhwaXJlKSkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgcmV0dXJuIHsgcmV2YWxpZGF0ZSwgZXhwaXJlIH07XG59XG4iXX0=