@cartanova/qgrid-cli 2.5.5 → 2.5.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.ko.md +0 -1
- package/README.md +0 -1
- package/bundle/dist/application/qgrid/qgrid.dispatcher.js +7 -7
- package/bundle/dist/application/qgrid/qgrid.frame.js +1 -8
- package/bundle/dist/application/qgrid/qgrid.types.js +2 -15
- package/bundle/dist/application/qgrid/tool-emulation-schema.js +39 -19
- package/bundle/dist/application/qgrid/tool-emulation.js +31 -44
- package/bundle/dist/utils/providers/openai/codex-worker.js +16 -7
- package/bundle/dist/utils/providers/openai/openai-worker-pool-config.js +4 -5
- package/bundle/src/application/qgrid/qgrid.dispatcher.test.ts +22 -8
- package/bundle/src/application/qgrid/qgrid.dispatcher.ts +8 -8
- package/bundle/src/application/qgrid/qgrid.frame.test.ts +2 -17
- package/bundle/src/application/qgrid/qgrid.frame.ts +0 -10
- package/bundle/src/application/qgrid/qgrid.types.ts +23 -45
- package/bundle/src/application/qgrid/tool-emulation-schema.test.ts +35 -15
- package/bundle/src/application/qgrid/tool-emulation-schema.ts +49 -32
- package/bundle/src/application/qgrid/tool-emulation.test.ts +92 -144
- package/bundle/src/application/qgrid/tool-emulation.ts +64 -76
- package/bundle/src/utils/providers/openai/codex-worker.test.ts +147 -0
- package/bundle/src/utils/providers/openai/codex-worker.ts +29 -5
- package/bundle/src/utils/providers/openai/openai-dispatcher.test.ts +13 -4
- package/bundle/src/utils/providers/openai/openai-worker-pool-config.ts +3 -9
- package/bundle/web-dist/client/assets/index-B-cZKEyf.css +1 -0
- package/bundle/web-dist/client/assets/{index-CN_kMswh.js → index-Bm7RpZcx.js} +3 -3
- package/bundle/web-dist/client/assets/{logs-6nYj9OKL.js → logs-BrJdk9XJ.js} +1 -1
- package/bundle/web-dist/client/assets/{monit-CaPH9Uwc.js → monit-BuFCoBCr.js} +1 -1
- package/bundle/web-dist/client/assets/{routes-Dh5HPi-b.js → routes-d-Fwxdg8.js} +1 -1
- package/bundle/web-dist/client/assets/{show-Be_LVd9d.js → show-Z5UX7FtU.js} +1 -1
- package/bundle/web-dist/client/assets/{tokens-CAi3zu_0.js → tokens-OA2V76xd.js} +1 -1
- package/bundle/web-dist/client/index.html +2 -2
- package/bundle/web-dist/server/entry-server.generated.js +1 -1
- package/package.json +1 -1
- package/skills/qgrid/SKILL.md +1 -1
- package/skills/qgrid/references/ai-sdk-provider-contract.md +1 -1
- package/skills/qgrid/references/cli-env-and-server-boot.md +2 -3
- package/skills/qgrid/references/decision-rationale.md +1 -1
- package/skills/qgrid/references/openai-codex-runtime.md +6 -3
- package/skills/qgrid/references/repo-map.md +1 -1
- package/skills/qgrid/references/request-log-run-lifecycle.md +1 -1
- package/skills/qgrid/references/tool-calling-and-multiturn.md +44 -26
- package/skills/qgrid/references/verification-and-debugging.md +2 -2
- package/bundle/web-dist/client/assets/index-yZcjDoV0.css +0 -1
|
@@ -325,15 +325,17 @@ var CodexAppServerWorker = class CodexAppServerWorker {
|
|
|
325
325
|
try {
|
|
326
326
|
ttftTracker.markStart();
|
|
327
327
|
await this.startTurnOnThread(threadId, req);
|
|
328
|
+
return {
|
|
329
|
+
...await resultPromise,
|
|
330
|
+
threadId
|
|
331
|
+
};
|
|
328
332
|
} catch (e) {
|
|
329
333
|
this.failActiveTurn(e);
|
|
330
334
|
await resultPromise.catch(() => {});
|
|
331
335
|
throw e;
|
|
336
|
+
} finally {
|
|
337
|
+
if (req.imageGeneration) this.unsubscribeThread(threadId);
|
|
332
338
|
}
|
|
333
|
-
return {
|
|
334
|
-
...await resultPromise,
|
|
335
|
-
threadId
|
|
336
|
-
};
|
|
337
339
|
}
|
|
338
340
|
async executeTurnStream(req, cb, existingThreadId) {
|
|
339
341
|
let threadId;
|
|
@@ -366,14 +368,21 @@ var CodexAppServerWorker = class CodexAppServerWorker {
|
|
|
366
368
|
}
|
|
367
369
|
sweepIdleThreads() {
|
|
368
370
|
const now = Date.now();
|
|
369
|
-
for (const [id, meta] of this.threadMeta) if (now - meta.lastUsedAt > CodexAppServerWorker.THREAD_IDLE_TTL_MS) this.
|
|
371
|
+
for (const [id, meta] of this.threadMeta) if (now - meta.lastUsedAt > CodexAppServerWorker.THREAD_IDLE_TTL_MS) this.evictThread(id);
|
|
370
372
|
const limit = CodexAppServerWorker.MAX_THREADS_PER_WORKER - 1;
|
|
371
373
|
if (this.threadMeta.size > limit) {
|
|
372
374
|
const sorted = [...this.threadMeta.entries()].toSorted((a, b) => a[1].lastUsedAt - b[1].lastUsedAt);
|
|
373
375
|
const over = this.threadMeta.size - limit;
|
|
374
|
-
for (let i = 0; i < over; i++) this.
|
|
376
|
+
for (let i = 0; i < over; i++) this.evictThread(sorted[i][0]);
|
|
375
377
|
}
|
|
376
378
|
}
|
|
379
|
+
evictThread(threadId) {
|
|
380
|
+
this.threadMeta.delete(threadId);
|
|
381
|
+
this.unsubscribeThread(threadId);
|
|
382
|
+
}
|
|
383
|
+
unsubscribeThread(threadId) {
|
|
384
|
+
this.rpc?.request("thread/unsubscribe", { threadId }).catch(() => {});
|
|
385
|
+
}
|
|
377
386
|
async interruptTurn(threadId, turnId) {
|
|
378
387
|
if (!this.rpc || !this.ready) return;
|
|
379
388
|
try {
|
|
@@ -603,4 +612,4 @@ var CodexAppServerWorker = class CodexAppServerWorker {
|
|
|
603
612
|
//#endregion
|
|
604
613
|
export { CODEX_CONFIG_TOML, CodexAppServerWorker };
|
|
605
614
|
|
|
606
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29kZXgtd29ya2VyLmpzIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy91dGlscy9wcm92aWRlcnMvb3BlbmFpL2NvZGV4LXdvcmtlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBzcGF3biwgdHlwZSBDaGlsZFByb2Nlc3MgfSBmcm9tIFwibm9kZTpjaGlsZF9wcm9jZXNzXCI7XG5pbXBvcnQgeyBta2RpclN5bmMsIHJlYWRGaWxlU3luYywgcm1TeW5jLCB3cml0ZUZpbGVTeW5jIH0gZnJvbSBcIm5vZGU6ZnNcIjtcbmltcG9ydCB7IHRtcGRpciB9IGZyb20gXCJub2RlOm9zXCI7XG5pbXBvcnQgeyBqb2luIH0gZnJvbSBcIm5vZGU6cGF0aFwiO1xuXG5pbXBvcnQgeyBnZXRMb2dnZXIgfSBmcm9tIFwiQGxvZ3RhcGUvbG9ndGFwZVwiO1xuXG5pbXBvcnQge1xuICBDT0RFWF9JTUFHRV9HRU5FUkFUSU9OX01PREVMLFxuICByZXNvbHZlSW1hZ2VHZW5lcmF0aW9uT3B0aW9ucyxcbn0gZnJvbSBcIi4uLy4uLy4uL2FwcGxpY2F0aW9uL3FncmlkL3FncmlkLWltYWdlLWdlbmVyYXRpb25cIjtcbmltcG9ydCB7IHR5cGUgSW1hZ2VHZW5lcmF0aW9uT3B0aW9ucyB9IGZyb20gXCIuLi8uLi8uLi9hcHBsaWNhdGlvbi9xZ3JpZC9xZ3JpZC50eXBlc1wiO1xuaW1wb3J0IHsgdHlwZSBNb2RlbCB9IGZyb20gXCIuLi8uLi8uLi9jb2RleC1wcm90b2NvbC92Mi9Nb2RlbFwiO1xuaW1wb3J0IHsgdHlwZSBNb2RlbExpc3RSZXNwb25zZSB9IGZyb20gXCIuLi8uLi8uLi9jb2RleC1wcm90b2NvbC92Mi9Nb2RlbExpc3RSZXNwb25zZVwiO1xuaW1wb3J0IHsgdHlwZSBNb2RlbFByb3ZpZGVyQ2FwYWJpbGl0aWVzUmVhZFJlc3BvbnNlIH0gZnJvbSBcIi4uLy4uLy4uL2NvZGV4LXByb3RvY29sL3YyL01vZGVsUHJvdmlkZXJDYXBhYmlsaXRpZXNSZWFkUmVzcG9uc2VcIjtcbmltcG9ydCB7IHR5cGUgVGhyZWFkSW5qZWN0SXRlbXNQYXJhbXMgfSBmcm9tIFwiLi4vLi4vLi4vY29kZXgtcHJvdG9jb2wvdjIvVGhyZWFkSW5qZWN0SXRlbXNQYXJhbXNcIjtcbmltcG9ydCB7IHR5cGUgVGhyZWFkU3RhcnRQYXJhbXMgfSBmcm9tIFwiLi4vLi4vLi4vY29kZXgtcHJvdG9jb2wvdjIvVGhyZWFkU3RhcnRQYXJhbXNcIjtcbmltcG9ydCB7IHR5cGUgVGhyZWFkU3RhcnRSZXNwb25zZSB9IGZyb20gXCIuLi8uLi8uLi9jb2RleC1wcm90b2NvbC92Mi9UaHJlYWRTdGFydFJlc3BvbnNlXCI7XG5pbXBvcnQgeyB0eXBlIFRva2VuVXNhZ2VCcmVha2Rvd24gfSBmcm9tIFwiLi4vLi4vLi4vY29kZXgtcHJvdG9jb2wvdjIvVG9rZW5Vc2FnZUJyZWFrZG93blwiO1xuaW1wb3J0IHsgdHlwZSBUdXJuU3RhcnRQYXJhbXMgfSBmcm9tIFwiLi4vLi4vLi4vY29kZXgtcHJvdG9jb2wvdjIvVHVyblN0YXJ0UGFyYW1zXCI7XG5pbXBvcnQgeyB0eXBlIFR1cm5TdGFydFJlc3BvbnNlIH0gZnJvbSBcIi4uLy4uLy4uL2NvZGV4LXByb3RvY29sL3YyL1R1cm5TdGFydFJlc3BvbnNlXCI7XG5pbXBvcnQgeyB0eXBlIFN0cmVhbUNhbGxiYWNrcyBhcyBDb21tb25TdHJlYW1DYWxsYmFja3MgfSBmcm9tIFwiLi4vY29tbW9uL3Byb3ZpZGVyLWRpc3BhdGNoZXJcIjtcbmltcG9ydCB7IGNyZWF0ZVR0ZnRUcmFja2VyIH0gZnJvbSBcIi4uL2NvbW1vbi90dGZ0XCI7XG5pbXBvcnQgeyBDb2RleFJwY0NsaWVudCB9IGZyb20gXCIuL2NvZGV4LXJwY1wiO1xuXG5jb25zdCBsb2dnZXIgPSBnZXRMb2dnZXIoW1wicWdyaWRcIiwgXCJjb2RleC13b3JrZXJcIl0pO1xuXG5jb25zdCBNQVhfUkVTVEFSVF9BVFRFTVBUUyA9IDM7XG5jb25zdCBSRVNUQVJUX0JBQ0tPRkZfQkFTRV9NUyA9IDFfMDAwO1xuXG4vLyDilIDilIAgVHlwZXMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbmV4cG9ydCBpbnRlcmZhY2UgV29ya2VyQ29uZmlnIHtcbiAgdG9rZW5JZDogbnVtYmVyO1xuICB0b2tlbk5hbWU6IHN0cmluZztcbiAgYWNjZXNzVG9rZW46IHN0cmluZztcbiAgYWNjb3VudElkOiBzdHJpbmc7XG4gIHBsYW5UeXBlPzogc3RyaW5nO1xuICB3b3JrZXJJbmRleD86IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUdXJuUmVxdWVzdCB7XG4gIGlucHV0OiBUdXJuU3RhcnRQYXJhbXNbXCJpbnB1dFwiXTtcbiAgb3V0cHV0U2NoZW1hPzogVHVyblN0YXJ0UGFyYW1zW1wib3V0cHV0U2NoZW1hXCJdO1xuICBlZmZvcnQ/OiBzdHJpbmc7XG4gIG1vZGVsPzogc3RyaW5nO1xuICBkZXZlbG9wZXJJbnN0cnVjdGlvbnM/OiBzdHJpbmc7XG4gIGhpc3Rvcnk/OiBUaHJlYWRJbmplY3RJdGVtc1BhcmFtc1tcIml0ZW1zXCJdO1xuICB2ZXJib3NpdHk/OiBzdHJpbmc7XG4gIHJlYXNvbmluZ1N1bW1hcnk/OiBzdHJpbmc7XG4gIHNlcnZpY2VUaWVyPzogc3RyaW5nO1xuICAvLyDsnbQgdHVybiDsl5DshJwgY29kZXgg64K07J6lIGltYWdlX2dlbmVyYXRpb24gdG9vbCDsnYQg7Lyg64ukLlxuICAvLyB0aHJlYWQg64uo7JyE66Gc66eMIO2ZnOyEse2ZlOuQmOupsCjsoITsl60gY29uZmlnIOuKlCBpbWFnZV9nZW5lcmF0aW9uPWZhbHNlIOycoOyngCksXG4gIC8vIO2UjOuemOq3uCDsl4bripQg7JqU7LKt7J2AIHRvb2wg6rWs7ISx7J20IO2YhO2WieqzvCDrj5nsnbztlZjri6QuXG4gIGltYWdlR2VuZXJhdGlvbj86IGJvb2xlYW47XG4gIGltYWdlR2VuZXJhdGlvbk9wdGlvbnM/OiBJbWFnZUdlbmVyYXRpb25PcHRpb25zO1xufVxuXG4vLyDtlZwgdHVybiDsl5DshJwg7IOd7ISx65CcIOydtOuvuOyngCDtlZjrgpguIGNvZGV4IGltYWdlR2VuZXJhdGlvbiBpdGVtIOyXkOyEnCDtjIzsg50uXG5leHBvcnQgaW50ZXJmYWNlIFR1cm5JbWFnZSB7XG4gIGRhdGE6IHN0cmluZzsgLy8gYmFzZTY0IGltYWdlIHBheWxvYWQgKGl0ZW0ucmVzdWx0KVxuICByZXZpc2VkUHJvbXB0OiBzdHJpbmcgfCBudWxsO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFR1cm5SZXN1bHQge1xuICB0ZXh0OiBzdHJpbmc7XG4gIHVzYWdlOiBUb2tlblVzYWdlQnJlYWtkb3duO1xuICBkdXJhdGlvbk1zOiBudW1iZXI7XG4gIHR0ZnRNczogbnVtYmVyIHwgbnVsbDtcbiAgbW9kZWw6IHN0cmluZztcbiAgLy8g7J2066+47KeAIHR1cm4g7JeQ7ISc66eMIOyxhOybjOynkC4g7JmE7ISxIOydtOuvuOyngOqwgCDsl4bsnLzrqbQg67mIIOuwsOyXtC91bmRlZmluZWQuXG4gIGltYWdlcz86IFR1cm5JbWFnZVtdO1xuICAvLyDsnbTrr7jsp4AgdG9vbCDtmLjstpzsnbQg6rSA7Lih65CQ64qU7KeAKGl0ZW0vc3RhcnRlZCDrmJDripQgaGFzUmVzdWx0IOyeiOuKlCBjb21wbGV0ZWQpLlxuICAvLyDsnbTrr7jsp4AgMOqwnOydvCDrlYwg7J6s7Iuc64+EIOqwgOuKpSDsi6TtjKgoXCLsi5zrj4Qg7ZuEIOuvuOyZhOyEsVwiKeyZgCDsnqzsi5zrj4Qg66y07J21KFwidG9vbCDrr7jtmLjstpxcIinsnYQg6rWs67aELlxuICBpbWFnZUF0dGVtcHRlZD86IGJvb2xlYW47XG59XG5cbmV4cG9ydCB0eXBlIFN0cmVhbUNhbGxiYWNrcyA9IENvbW1vblN0cmVhbUNhbGxiYWNrczxUdXJuUmVzdWx0PjtcblxudHlwZSBSZWZyZXNoYWJsZVdvcmtlckNyZWRlbnRpYWxzID0gUGljazxXb3JrZXJDb25maWcsIFwiYWNjZXNzVG9rZW5cIiB8IFwiYWNjb3VudElkXCIgfCBcInBsYW5UeXBlXCI+O1xudHlwZSBBY3RpdmVUdXJuQWJvcnQgPSAoZXJyb3I6IEVycm9yKSA9PiB2b2lkO1xuXG4vLyB0aHJlYWQvc3RhcnQg6rO17Ya1IOyYteyFmFxuY29uc3QgVEhSRUFEX0RFRkFVTFRTID0ge1xuICBzYW5kYm94OiBcInJlYWQtb25seVwiLFxuICBhcHByb3ZhbFBvbGljeTogXCJuZXZlclwiLFxuICBjb25maWc6IHtcbiAgICBhcHBzOiB7IF9kZWZhdWx0OiB7IGVuYWJsZWQ6IGZhbHNlLCBkZXN0cnVjdGl2ZV9lbmFibGVkOiBmYWxzZSwgb3Blbl93b3JsZF9lbmFibGVkOiBmYWxzZSB9IH0sXG4gIH0sXG59IHNhdGlzZmllcyBQYXJ0aWFsPFRocmVhZFN0YXJ0UGFyYW1zPjtcblxuY29uc3QgQkFTRV9JTlNUUlVDVElPTlMgPVxuICBcIllvdSBhcmUgYSBoZWxwZnVsIGFzc2lzdGFudC4gRG8gbm90IHVzZSBhbnkgdG9vbHMgc3VjaCBhcyBzaGVsbCwgZmlsZSBvcGVyYXRpb25zLCBvciB3ZWIgc2VhcmNoLiBSZXNwb25kIHdpdGggdGV4dCBvbmx5LlwiO1xuXG4vLyDsnbTrr7jsp4Ag7IOd7ISxIHRocmVhZCDsoITsmqkgaW5zdHJ1Y3Rpb24uIOq4sOuzuCBCQVNFX0lOU1RSVUNUSU9OUyDsnZggXCJ0ZXh0IG9ubHlcIiDsp4Dsi5zqsIBcbi8vIOyLpOyniCDslrXsoJzquLDsnbTrr4DroZwoY29kZXggaW1hZ2VfZ2VuZXJhdGlvbiBmZWF0dXJlIOuKlCBkZWZhdWx0LW9uKSwg7J2066+47KeAIOuqqOuTnOyXkOyEnOuKlFxuLy8gaW1hZ2VfZ2VuZXJhdGlvbiB0b29sIOyCrOyaqeydhCDrqoXsi5zsoIHsnLzroZwg7ZeI7Jqp7ZWc64ukLiBzaGVsbC93ZWIg65OxIOuCmOuouOyngCB0b29sIOydgCDsl6zsoITtnogg6riI7KeALlxuY29uc3QgSU1BR0VfQkFTRV9JTlNUUlVDVElPTlMgPVxuICBcIllvdSBhcmUgYSBoZWxwZnVsIGFzc2lzdGFudC4gV2hlbiBhc2tlZCB0byBjcmVhdGUgYW4gaW1hZ2UsIHVzZSB0aGUgaW1hZ2VfZ2VuZXJhdGlvbiB0b29sIHRvIHByb2R1Y2UgaXQuIERvIG5vdCB1c2UgYW55IG90aGVyIHRvb2xzIHN1Y2ggYXMgc2hlbGwsIGZpbGUgb3BlcmF0aW9ucywgb3Igd2ViIHNlYXJjaC5cIjtcblxuZnVuY3Rpb24gaW1hZ2VCYXNlSW5zdHJ1Y3Rpb25zKG9wdGlvbnM6IEltYWdlR2VuZXJhdGlvbk9wdGlvbnMgfCB1bmRlZmluZWQpOiBzdHJpbmcge1xuICBjb25zdCByZXNvbHZlZCA9IHJlc29sdmVJbWFnZUdlbmVyYXRpb25PcHRpb25zKG9wdGlvbnMpO1xuICByZXR1cm4gYCR7SU1BR0VfQkFTRV9JTlNUUlVDVElPTlN9IFJlcXVlc3RlZCBpbWFnZSBvdXRwdXQ6IG1vZGVsICR7Q09ERVhfSU1BR0VfR0VORVJBVElPTl9NT0RFTH0sIHF1YWxpdHkgJHtyZXNvbHZlZC5xdWFsaXR5fSwgc2l6ZSAke3Jlc29sdmVkLnNpemV9LCBmb3JtYXQgcG5nLmA7XG59XG5cbi8vIOyLpOy4oeyDgSDsmYTro4wgaXRlbSDsnZggc3RhdHVzIOuKlCBcImdlbmVyYXRpbmdcIiDsnLzroZwg7JmA64+EIHJlc3VsdCDsl5Ag7JmE7ISxIGJhc2U2NCDqsIAg7Iuk66aw64ukLlxuLy8g65Sw65287IScIOyZhOyEsSDtjJDsoJXsnYAgc3RhdHVzIOusuOyekOyXtOydtCDslYTri4jrnbwgcmVzdWx0IOydmCDsnKDtmqjshLEo67mE7Ja07J6I7KeAIOyViuqzoCDtkZzspIAgYmFzZTY0IOyduOyngCnsnLzroZwg7ZWc64ukLlxuZnVuY3Rpb24gaXNDb21wbGV0ZWRJbWFnZVJlc3VsdChyZXN1bHQ6IHVua25vd24pOiByZXN1bHQgaXMgc3RyaW5nIHtcbiAgaWYgKHR5cGVvZiByZXN1bHQgIT09IFwic3RyaW5nXCIpIHJldHVybiBmYWxzZTtcbiAgY29uc3QgdHJpbW1lZCA9IHJlc3VsdC50cmltKCk7XG4gIGlmICh0cmltbWVkLmxlbmd0aCA9PT0gMCB8fCB0cmltbWVkLnN0YXJ0c1dpdGgoXCJkYXRhOlwiKSkgcmV0dXJuIGZhbHNlO1xuICBpZiAoIS9eW0EtWmEtejAtOSsvXSs9ezAsMn0kLy50ZXN0KHRyaW1tZWQpIHx8IHRyaW1tZWQubGVuZ3RoICUgNCAhPT0gMCkgcmV0dXJuIGZhbHNlO1xuICByZXR1cm4gdHJ1ZTtcbn1cblxuLy8gY29kZXjqsIAg66ekIOyalOyyreyXkCDsnpDrj5kg7KO87J6F7ZWY64qUIOuCtOyepSB0b29sKHNoZWxsL3dlYl9zZWFyY2gvc3Bhd25fYWdlbnQg65OxIDE06rCcKeqzvFxuLy8gaW5zdHJ1Y3Rpb24g67iU66GdKHBlcm1pc3Npb25zL2Vudmlyb25tZW50X2NvbnRleHQvc2tpbGxzLCB+MTBLQinsnYQg67mE7Zmc7ISx7ZmUXG4vLyAkQ09ERVhfSE9NRS9jb25maWcudG9tbCDroZwg7I2o64Sj7Jy866m0IGNvZGV4IOu2gO2MhSDsi5wgc2NhblxuLy8g7Ya17KCc67aI6rCAOiB1cGRhdGVfcGxhbi9yZXF1ZXN0X3VzZXJfaW5wdXRcbmV4cG9ydCBjb25zdCBDT0RFWF9DT05GSUdfVE9NTCA9IGB3ZWJfc2VhcmNoID0gXCJkaXNhYmxlZFwiXG5pbmNsdWRlX3Blcm1pc3Npb25zX2luc3RydWN0aW9ucyA9IGZhbHNlXG5pbmNsdWRlX2FwcHNfaW5zdHJ1Y3Rpb25zID0gZmFsc2VcbmluY2x1ZGVfZW52aXJvbm1lbnRfY29udGV4dCA9IGZhbHNlXG5cbltmZWF0dXJlc11cbnNoZWxsX3Rvb2wgPSBmYWxzZVxudG9vbF9zZWFyY2ggPSBmYWxzZVxudG9vbF9zdWdnZXN0ID0gZmFsc2Vcbm11bHRpX2FnZW50ID0gZmFsc2VcbmltYWdlX2dlbmVyYXRpb24gPSBmYWxzZVxuYXBwcyA9IGZhbHNlXG5wbHVnaW5zID0gZmFsc2VcblxuW3Rvb2xzXVxudmlld19pbWFnZSA9IGZhbHNlXG5cbltza2lsbHNdXG5pbmNsdWRlX2luc3RydWN0aW9ucyA9IGZhbHNlXG5cbltza2lsbHMuYnVuZGxlZF1cbmVuYWJsZWQgPSBmYWxzZVxuYDtcblxuLy8g4pSA4pSAIFdvcmtlciDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuZXhwb3J0IGNsYXNzIENvZGV4QXBwU2VydmVyV29ya2VyIHtcbiAgcHJpdmF0ZSBwcm9jOiBDaGlsZFByb2Nlc3MgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBycGM6IENvZGV4UnBjQ2xpZW50IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgY29kZXhIb21lOiBzdHJpbmc7XG4gIHByaXZhdGUgcmVzdGFydEF0dGVtcHRzID0gMDtcbiAgcHJpdmF0ZSByZWFkeSA9IGZhbHNlO1xuICBwcml2YXRlIGRlc3Ryb3llZCA9IGZhbHNlO1xuICBwcml2YXRlIGJ1c3kgPSBmYWxzZTtcbiAgcHJpdmF0ZSBhY3RpdmVUdXJuQWJvcnQ/OiBBY3RpdmVUdXJuQWJvcnQ7XG4gIGFjdGl2ZSA9IHRydWU7XG4gIG9uUmVhZHk/OiAoKSA9PiB2b2lkO1xuICAvLyByZXN0YXJ0IOyLnCBycGMg6rCd7LK06rCAIOyDiOuhnCDsg53shLHrkJjrr4DroZwsIO2VuOuTpOufrOulvCDrs7TqtIDtlojri6TqsIAg66ekIHNwYXdu66eI64ukIOyerOuwlOyduOuUqe2VnOuLpC5cbiAgc2VydmVyUmVxdWVzdEhhbmRsZXI/OiAobWV0aG9kOiBzdHJpbmcsIHBhcmFtczogdW5rbm93bikgPT4gUHJvbWlzZTx1bmtub3duPjtcblxuICAvLyB0aHJlYWQg7J6s7IKs7JqpKHByb21wdCBjYWNoZSk6IHdvcmtlciDqsIAg7IOd7ISx7ZWcIHRocmVhZCDrk6TsnZgg66mU7YOALlxuICAvLyBlcGhlbWVyYWwgdGhyZWFkIOuKlCDsnbQg7ZSE66Gc7IS47IqkIOuplOuqqOumrOyXkOunjCDsobTsnqztlZjrr4DroZwgcmVzdGFydCDsi5wg7KCE67aAIOustO2aqC5cbiAgcHJpdmF0ZSB0aHJlYWRNZXRhID0gbmV3IE1hcDxzdHJpbmcsIHsgbGFzdFVzZWRBdDogbnVtYmVyIH0+KCk7XG4gIC8vIHNwYXduIOy5tOyatO2EsC4gcmVzdGFydCDrp4jri6Qg7Kad6rCAIOKGkiBjb252IO2VuOuTpOydmCBlcG9jaCDsmYAg64yA7KGw7ZW0IHN0YWxlIHRocmVhZCDqsJDsp4AuXG4gIHByaXZhdGUgZXBvY2hDb3VudGVyID0gMDtcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgVEhSRUFEX0lETEVfVFRMX01TID0gMTAgKiA2MF8wMDA7XG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IE1BWF9USFJFQURTX1BFUl9XT1JLRVIgPSAxNjtcbiAgLy8g7J2066+47KeAIOqyjOydtO2KuCDqsoDspp3smqkg7LqQ7IucLiBzcGF3biDri6jsnITroZwg66y07Zqo7ZmUKHJlc3RhcnQg7IucIGNsZWFyKS5cbiAgLy8gY2FwYWJpbGl0eSDripQgcHJvdmlkZXIg64uo7JyEIGJvb2xlYW4sIOuqqOuNuCDrqYDti7Drqqjri6wg7Jes67aA64qUIG1vZGVsL2xpc3Qg66GcIO2ZleyduC5cbiAgcHJpdmF0ZSBjYWNoZWRDYXBhYmlsaXRpZXM/OiBNb2RlbFByb3ZpZGVyQ2FwYWJpbGl0aWVzUmVhZFJlc3BvbnNlO1xuICBwcml2YXRlIGNhY2hlZE1vZGVscz86IE1hcDxzdHJpbmcsIE1vZGVsPjtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGNvbmZpZzogV29ya2VyQ29uZmlnKSB7XG4gICAgY29uc3Qgc3VmZml4ID0gY29uZmlnLndvcmtlckluZGV4ICE9PSB1bmRlZmluZWQgPyBgLSR7Y29uZmlnLndvcmtlckluZGV4fWAgOiBcIlwiO1xuICAgIHRoaXMuY29kZXhIb21lID0gam9pbih0bXBkaXIoKSwgXCJxZ3JpZC1jb2RleFwiLCBgJHtjb25maWcudG9rZW5JZH0ke3N1ZmZpeH1gKTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBMaWZlY3ljbGUg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgcHJpdmF0ZSBhc3luYyBzcGF3bkFuZEluaXQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8g7IOIIGNvZGV4IO2UhOuhnOyEuOyKpCDihpIg6riw7KG0IGVwaGVtZXJhbCB0aHJlYWQg7KCE67aAIOustO2aqC4gZXBvY2gg7Kad6rCA66GcIHN0YWxlIOqwkOyngC5cbiAgICB0aGlzLmVwb2NoQ291bnRlcisrO1xuICAgIHRoaXMudGhyZWFkTWV0YS5jbGVhcigpO1xuICAgIC8vIOyDiCDtlITroZzshLjsiqQg4oaSIGNhcGFiaWxpdHkvbW9kZWwg7LqQ7IucIOustO2aqCjroZzqt7jsnbgg6rOE7KCVL+uyhOyghOydtCDrsJTrgIzsl4jsnYQg7IiYIOyeiOydjCkuXG4gICAgdGhpcy5jYWNoZWRDYXBhYmlsaXRpZXMgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5jYWNoZWRNb2RlbHMgPSB1bmRlZmluZWQ7XG4gICAgY29uc3QgY3dkID0gYCR7dGhpcy5jb2RleEhvbWV9L2N3ZGA7XG4gICAgcm1TeW5jKHRoaXMuY29kZXhIb21lLCB7IHJlY3Vyc2l2ZTogdHJ1ZSwgZm9yY2U6IHRydWUgfSk7XG4gICAgbWtkaXJTeW5jKGN3ZCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgLy8gY29kZXgg64K07J6lIHRvb2wvd2ViX3NlYXJjaC9pbnN0cnVjdGlvbiDruJTroZ0g67mE7Zmc7ISx7ZmUXG4gICAgd3JpdGVGaWxlU3luYyhgJHt0aGlzLmNvZGV4SG9tZX0vY29uZmlnLnRvbWxgLCBDT0RFWF9DT05GSUdfVE9NTCk7XG5cbiAgICB0aGlzLnByb2MgPSBzcGF3bihcImNvZGV4XCIsIFtcImFwcC1zZXJ2ZXJcIiwgXCItLWxpc3RlblwiLCBcInN0ZGlvOi8vXCJdLCB7XG4gICAgICBzdGRpbzogW1wicGlwZVwiLCBcInBpcGVcIiwgXCJwaXBlXCJdLFxuICAgICAgY3dkLFxuICAgICAgZW52OiB7XG4gICAgICAgIFBBVEg6IHByb2Nlc3MuZW52LlBBVEgsXG4gICAgICAgIFRNUERJUjogcHJvY2Vzcy5lbnYuVE1QRElSLFxuICAgICAgICBDT0RFWF9IT01FOiB0aGlzLmNvZGV4SG9tZSxcbiAgICAgICAgLy8gZW52aXJvbm1lbnQg67mE7Zmc7ISx7ZmUIOKGkiBoYXNfZW52aXJvbm1lbnQ9ZmFsc2Ug4oaSIHNoZWxsL2FwcGx5X3BhdGNoL3ZpZXdfaW1hZ2Ug7KCc6rGwXG4gICAgICAgIENPREVYX0VYRUNfU0VSVkVSX1VSTDogXCJub25lXCIsXG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgdGhpcy5wcm9jLm9uKFwiZXhpdFwiLCAoY29kZSkgPT4ge1xuICAgICAgbG9nZ2VyLmluZm8oYHdvcmtlciAke3RoaXMuY29uZmlnLnRva2VuTmFtZX0gZXhpdGVkIChjb2RlPSR7Y29kZX0pYCk7XG4gICAgICB0aGlzLmZhaWxBY3RpdmVUdXJuKFxuICAgICAgICBuZXcgRXJyb3IoYGNvZGV4IHdvcmtlciBleGl0ZWQgd2hpbGUgdHVybiB3YXMgcnVubmluZyAoY29kZT0ke2NvZGUgPz8gXCJ1bmtub3duXCJ9KWApLFxuICAgICAgKTtcbiAgICAgIHRoaXMucmVhZHkgPSBmYWxzZTtcbiAgICAgIHRoaXMucnBjID0gbnVsbDtcbiAgICAgIHRoaXMucHJvYyA9IG51bGw7XG4gICAgICBpZiAoIXRoaXMuZGVzdHJveWVkKSB0aGlzLnNjaGVkdWxlUmVzdGFydCgpO1xuICAgIH0pO1xuXG4gICAgdGhpcy5ycGMgPSBuZXcgQ29kZXhScGNDbGllbnQodGhpcy5wcm9jKTtcbiAgICAvLyByZXN0YXJ0IO2bhOyXkOuPhCByZWZyZXNoIHNlcnZlci1yZXF1ZXN0IO2VuOuTpOufrOulvCDsnKDsp4AgKOyXhuycvOuptCBjb2RleCDthqDtgbAg7ZqM7KCEIOyLpO2MqCDihpIgc2Vzc2lvbiBleHBpcmVkKVxuICAgIHRoaXMuYmluZFNlcnZlclJlcXVlc3RIYW5kbGVyKCk7XG5cbiAgICBhd2FpdCB0aGlzLnJwYy5yZXF1ZXN0KFwiaW5pdGlhbGl6ZVwiLCB7XG4gICAgICBjbGllbnRJbmZvOiB7IG5hbWU6IFwicWdyaWRcIiwgdmVyc2lvbjogXCIxLjAuMFwiIH0sXG4gICAgICBjYXBhYmlsaXRpZXM6IHsgZXhwZXJpbWVudGFsQXBpOiB0cnVlIH0sXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHdhaXRGb3JMb2dpbkNvbXBsZXRlZCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgY29uc3QgdGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4gcmVqZWN0KG5ldyBFcnJvcihcImxvZ2luIHRpbWVvdXRcIikpLCAxMjBfMDAwKTtcbiAgICAgIHRoaXMucnBjIS5vbk5vdGlmaWNhdGlvbihcImFjY291bnQvbG9naW4vY29tcGxldGVkXCIsIChwKSA9PiB7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0KTtcbiAgICAgICAgaWYgKHAuc3VjY2VzcykgcmVzb2x2ZSgpO1xuICAgICAgICBlbHNlIHJlamVjdChuZXcgRXJyb3IoYGxvZ2luIGZhaWxlZDogJHtwLmVycm9yID8/IFwidW5rbm93blwifWApKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgaW5pdGlhbGl6ZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLnNwYXduQW5kSW5pdCgpO1xuXG4gICAgYXdhaXQgdGhpcy5ycGMhLnJlcXVlc3QoXCJhY2NvdW50L2xvZ2luL3N0YXJ0XCIsIHtcbiAgICAgIHR5cGU6IFwiY2hhdGdwdEF1dGhUb2tlbnNcIixcbiAgICAgIGFjY2Vzc1Rva2VuOiB0aGlzLmNvbmZpZy5hY2Nlc3NUb2tlbixcbiAgICAgIGNoYXRncHRBY2NvdW50SWQ6IHRoaXMuY29uZmlnLmFjY291bnRJZCxcbiAgICAgIC4uLih0aGlzLmNvbmZpZy5wbGFuVHlwZSA/IHsgY2hhdGdwdFBsYW5UeXBlOiB0aGlzLmNvbmZpZy5wbGFuVHlwZSB9IDoge30pLFxuICAgIH0pO1xuXG4gICAgYXdhaXQgdGhpcy53YWl0Rm9yTG9naW5Db21wbGV0ZWQoKTtcbiAgICB0aGlzLnJlYWR5ID0gdHJ1ZTtcbiAgICB0aGlzLnJlc3RhcnRBdHRlbXB0cyA9IDA7XG4gIH1cblxuICBhc3luYyBzdGFydEJyb3dzZXJMb2dpbigpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGF3YWl0IHRoaXMuc3Bhd25BbmRJbml0KCk7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5ycGMhLnJlcXVlc3Q8eyBhdXRoVXJsOiBzdHJpbmcgfT4oXCJhY2NvdW50L2xvZ2luL3N0YXJ0XCIsIHtcbiAgICAgIHR5cGU6IFwiY2hhdGdwdFwiLFxuICAgIH0pO1xuICAgIGxvZ2dlci5pbmZvKGB3b3JrZXIgJHt0aGlzLmNvbmZpZy50b2tlbk5hbWV9IGJyb3dzZXIgbG9naW4gc3RhcnRlZGApO1xuICAgIHJldHVybiByZXN1bHQuYXV0aFVybDtcbiAgfVxuXG4gIGFzeW5jIHdhaXRGb3JCcm93c2VyTG9naW5Db21wbGV0ZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLndhaXRGb3JMb2dpbkNvbXBsZXRlZCgpO1xuICAgIHRoaXMucmVhZHkgPSB0cnVlO1xuICAgIHRoaXMucmVzdGFydEF0dGVtcHRzID0gMDtcbiAgICBsb2dnZXIuaW5mbyhgd29ya2VyICR7dGhpcy5jb25maWcudG9rZW5OYW1lfSBicm93c2VyIGxvZ2luIGNvbXBsZXRlZGApO1xuICB9XG5cbiAgYXN5bmMgcmVhZE1hbmFnZWRDcmVkZW50aWFscygpOiBQcm9taXNlPHtcbiAgICBhY2Nlc3NUb2tlbjogc3RyaW5nO1xuICAgIHJlZnJlc2hUb2tlbjogc3RyaW5nO1xuICAgIGlkVG9rZW4/OiBzdHJpbmc7XG4gICAgYWNjb3VudElkOiBzdHJpbmc7XG4gIH0gfCBudWxsPiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJhdyA9IEpTT04ucGFyc2UocmVhZEZpbGVTeW5jKGAke3RoaXMuY29kZXhIb21lfS9hdXRoLmpzb25gLCBcInV0Zi04XCIpKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGFjY2Vzc1Rva2VuOiByYXcudG9rZW5zPy5hY2Nlc3NfdG9rZW4gPz8gXCJcIixcbiAgICAgICAgcmVmcmVzaFRva2VuOiByYXcudG9rZW5zPy5yZWZyZXNoX3Rva2VuID8/IFwiXCIsXG4gICAgICAgIGlkVG9rZW46IHJhdy50b2tlbnM/LmlkX3Rva2VuLFxuICAgICAgICBhY2NvdW50SWQ6IHJhdy50b2tlbnM/LmFjY291bnRfaWQgPz8gXCJcIixcbiAgICAgIH07XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICBhc3luYyBraWxsKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuZGVzdHJveWVkID0gdHJ1ZTtcbiAgICB0aGlzLnJlYWR5ID0gZmFsc2U7XG4gICAgdGhpcy5mYWlsQWN0aXZlVHVybihuZXcgRXJyb3IoXCJjb2RleCB3b3JrZXIgc3RvcHBlZFwiKSk7XG4gICAgdGhpcy5ycGM/LmRlc3Ryb3koKTtcblxuICAgIGlmICh0aGlzLnByb2MpIHtcbiAgICAgIHRoaXMucHJvYy5raWxsKFwiU0lHVEVSTVwiKTtcbiAgICAgIGF3YWl0IG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlKSA9PiB7XG4gICAgICAgIGNvbnN0IHRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5wcm9jPy5raWxsKFwiU0lHS0lMTFwiKTtcbiAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgIH0sIDNfMDAwKTtcbiAgICAgICAgdGhpcy5wcm9jIS5vbihcImV4aXRcIiwgKCkgPT4ge1xuICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lcik7XG4gICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBybVN5bmModGhpcy5jb2RleEhvbWUsIHsgcmVjdXJzaXZlOiB0cnVlLCBmb3JjZTogdHJ1ZSB9KTtcbiAgICB9IGNhdGNoIHt9XG4gIH1cblxuICBnZXQgaXNSZWFkeSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5yZWFkeSAmJiAhdGhpcy5kZXN0cm95ZWQ7XG4gIH1cbiAgZ2V0IGlzRGVzdHJveWVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmRlc3Ryb3llZDtcbiAgfVxuICBnZXQgdG9rZW5JZCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmNvbmZpZy50b2tlbklkO1xuICB9XG4gIGdldCB3b3JrZXJJbmRleCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmNvbmZpZy53b3JrZXJJbmRleCA/PyAwO1xuICB9XG4gIGdldCB0b2tlbk5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5jb25maWcudG9rZW5OYW1lO1xuICB9XG5cbiAgY2FuUmV1c2VGb3JUb2tlbihfdG9rZW5OYW1lOiBzdHJpbmcsIGNyZWRlbnRpYWxzOiBSZWZyZXNoYWJsZVdvcmtlckNyZWRlbnRpYWxzKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMuY29uZmlnLmFjY291bnRJZCA9PT0gY3JlZGVudGlhbHMuYWNjb3VudElkICYmXG4gICAgICAodGhpcy5jb25maWcucGxhblR5cGUgPz8gdW5kZWZpbmVkKSA9PT0gKGNyZWRlbnRpYWxzLnBsYW5UeXBlID8/IHVuZGVmaW5lZClcbiAgICApO1xuICB9XG5cbiAgdXBkYXRlVG9rZW5TdGF0ZSh0b2tlbk5hbWU6IHN0cmluZywgY3JlZGVudGlhbHM6IFJlZnJlc2hhYmxlV29ya2VyQ3JlZGVudGlhbHMpOiB2b2lkIHtcbiAgICB0aGlzLmNvbmZpZy50b2tlbk5hbWUgPSB0b2tlbk5hbWU7XG4gICAgdGhpcy5jb25maWcuYWNjZXNzVG9rZW4gPSBjcmVkZW50aWFscy5hY2Nlc3NUb2tlbjtcbiAgICB0aGlzLmNvbmZpZy5hY2NvdW50SWQgPSBjcmVkZW50aWFscy5hY2NvdW50SWQ7XG4gICAgaWYgKGNyZWRlbnRpYWxzLnBsYW5UeXBlKSB7XG4gICAgICB0aGlzLmNvbmZpZy5wbGFuVHlwZSA9IGNyZWRlbnRpYWxzLnBsYW5UeXBlO1xuICAgIH0gZWxzZSB7XG4gICAgICBkZWxldGUgdGhpcy5jb25maWcucGxhblR5cGU7XG4gICAgfVxuICB9XG5cbiAgLy8g4pSA4pSAIFJhdGUgbGltaXRzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIGFzeW5jIGdldFJhdGVMaW1pdHMoKTogUHJvbWlzZTx1bmtub3duPiB7XG4gICAgaWYgKCF0aGlzLnJwYyB8fCAhdGhpcy5yZWFkeSkgdGhyb3cgbmV3IEVycm9yKFwid29ya2VyIG5vdCByZWFkeVwiKTtcbiAgICByZXR1cm4gdGhpcy5ycGMucmVxdWVzdChcImFjY291bnQvcmF0ZUxpbWl0cy9yZWFkXCIsIHt9KTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBJbWFnZSBnZW5lcmF0aW9uIGdhdGUg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gIC8vIOydtOuvuOyngCB0b29sIOydgCBjb2RleCDsl5DshJwgKEF1dGhNb2RlOjpDaGF0Z3B0KSBBTkQgKGltYWdlX2dlbmVyYXRpb24gZmVhdHVyZSlcbiAgLy8gQU5EICjrqqjrjbgg66mA7Yuw66qo64usKSAz7KSRIOqyjOydtO2KuOuLpC4gcWdyaWQg64qUIE9BdXRoIOyghOyaqeydtOqzoCBmZWF0dXJlIOuKlCB0aHJlYWQg7JeQ7IScXG4gIC8vIOy8nOuvgOuhnCwgZGlzcGF0Y2hlciDqsIAg7IKs7KCEIOqygOymne2VoCDrgqjsnYAg7KGw6rG07J2AIGNhcGFiaWxpdHkocHJvdmlkZXIpICsg66qo6424IOupgO2LsOuqqOuLrOydtOuLpC5cblxuICBwcml2YXRlIGFzeW5jIGxvYWRDYXBhYmlsaXRpZXMoKTogUHJvbWlzZTxNb2RlbFByb3ZpZGVyQ2FwYWJpbGl0aWVzUmVhZFJlc3BvbnNlPiB7XG4gICAgaWYgKCF0aGlzLnJwYyB8fCAhdGhpcy5yZWFkeSkgdGhyb3cgbmV3IEVycm9yKFwid29ya2VyIG5vdCByZWFkeVwiKTtcbiAgICBpZiAoIXRoaXMuY2FjaGVkQ2FwYWJpbGl0aWVzKSB7XG4gICAgICB0aGlzLmNhY2hlZENhcGFiaWxpdGllcyA9IGF3YWl0IHRoaXMucnBjLnJlcXVlc3Q8TW9kZWxQcm92aWRlckNhcGFiaWxpdGllc1JlYWRSZXNwb25zZT4oXG4gICAgICAgIFwibW9kZWxQcm92aWRlci9jYXBhYmlsaXRpZXMvcmVhZFwiLFxuICAgICAgICB7fSxcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmNhY2hlZENhcGFiaWxpdGllcztcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgbG9hZE1vZGVscygpOiBQcm9taXNlPE1hcDxzdHJpbmcsIE1vZGVsPj4ge1xuICAgIGlmICghdGhpcy5ycGMgfHwgIXRoaXMucmVhZHkpIHRocm93IG5ldyBFcnJvcihcIndvcmtlciBub3QgcmVhZHlcIik7XG4gICAgaWYgKCF0aGlzLmNhY2hlZE1vZGVscykge1xuICAgICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy5ycGMucmVxdWVzdDxNb2RlbExpc3RSZXNwb25zZT4oXCJtb2RlbC9saXN0XCIsIHt9KTtcbiAgICAgIHRoaXMuY2FjaGVkTW9kZWxzID0gbmV3IE1hcChyZXMuZGF0YS5tYXAoKG0pID0+IFttLm1vZGVsLCBtXSkpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5jYWNoZWRNb2RlbHM7XG4gIH1cblxuICAvLyDso7zslrTsp4Qg66qo6424KOuvuOyngOygleydtOuptCB0aHJlYWQg6riw67O4IOuqqOuNuCnroZwg7J2066+47KeAIOyDneyEseydtCDqsIDriqXtlZzsp4Ag6rKA7KadLlxuICAvLyDrtojqsIAg7IKs7Jyg66W8IOusuOyekOyXtOuhnCDrsJjtmZjtlZjqs6AsIOqwgOuKpe2VmOuptCBudWxsIOydhCDrsJjtmZjtlZzri6QuXG4gIGFzeW5jIGNoZWNrSW1hZ2VHZW5lcmF0aW9uU3VwcG9ydChtb2RlbD86IHN0cmluZyk6IFByb21pc2U8c3RyaW5nIHwgbnVsbD4ge1xuICAgIGlmICghdGhpcy5ycGMgfHwgIXRoaXMucmVhZHkpIHJldHVybiBcIndvcmtlciBub3QgcmVhZHlcIjtcbiAgICBjb25zdCBjYXBzID0gYXdhaXQgdGhpcy5sb2FkQ2FwYWJpbGl0aWVzKCk7XG4gICAgaWYgKCFjYXBzLmltYWdlR2VuZXJhdGlvbikgcmV0dXJuIFwicHJvdmlkZXIgZG9lcyBub3Qgc3VwcG9ydCBpbWFnZSBnZW5lcmF0aW9uXCI7XG4gICAgLy8g66qo6424IOupgO2LsOuqqOuLrCDqsoDspp0uIG1vZGVsIOuvuOyngOygleydtOuptCBwcm92aWRlciBjYXBhYmlsaXR5IOunjOycvOuhnCDthrXqs7zsi5ztgqTqs6AsXG4gICAgLy8g7Iuk7KCcIOyggeyaqSDrqqjrjbjsnZgg66mA7Yuw66qo64usIOyXrOu2gOuKlCB0dXJuIOyLpO2WiSDqsrDqs7wo7J2066+47KeAIDDqsJwg4oaSIFUzIOyLpO2MqCDrtoTrpZgp6rCAIOyeoeuKlOuLpC5cbiAgICBpZiAobW9kZWwpIHtcbiAgICAgIGNvbnN0IG1vZGVscyA9IGF3YWl0IHRoaXMubG9hZE1vZGVscygpO1xuICAgICAgY29uc3QgaW5mbyA9IG1vZGVscy5nZXQobW9kZWwpO1xuICAgICAgaWYgKGluZm8gJiYgIWluZm8uaW5wdXRNb2RhbGl0aWVzLmluY2x1ZGVzKFwiaW1hZ2VcIikpIHtcbiAgICAgICAgcmV0dXJuIGBtb2RlbCAke21vZGVsfSBpcyBub3QgbXVsdGltb2RhbCAobm8gaW1hZ2UgaW5wdXQgbW9kYWxpdHkpYDtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvLyDilIDilIAgU2VydmVyLXJlcXVlc3QgZGVsZWdhdGlvbiDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICBzZXRTZXJ2ZXJSZXF1ZXN0SGFuZGxlcihoYW5kbGVyOiAobWV0aG9kOiBzdHJpbmcsIHBhcmFtczogdW5rbm93bikgPT4gUHJvbWlzZTx1bmtub3duPik6IHZvaWQge1xuICAgIHRoaXMuc2VydmVyUmVxdWVzdEhhbmRsZXIgPSBoYW5kbGVyO1xuICAgIHRoaXMuYmluZFNlcnZlclJlcXVlc3RIYW5kbGVyKCk7XG4gIH1cblxuICAvLyBzcGF3bkFuZEluaXTsl5DshJwgcnBjIOyDneyEsSDsp4Htm4Qg7Zi47LacLiByZXN0YXJ066GcIHJwY+qwgCDsg4jroZwg66eM65Ok7Ja07KC464+EIO2VuOuTpOufrOqwgCDsnKDsp4DrkJzri6QuXG4gIGJpbmRTZXJ2ZXJSZXF1ZXN0SGFuZGxlcigpOiB2b2lkIHtcbiAgICBjb25zdCBoYW5kbGVyID0gdGhpcy5zZXJ2ZXJSZXF1ZXN0SGFuZGxlcjtcbiAgICBpZiAoIWhhbmRsZXIpIHJldHVybjtcbiAgICB0aGlzLnJwYz8ub25TZXJ2ZXJSZXF1ZXN0KFwiYWNjb3VudC9jaGF0Z3B0QXV0aFRva2Vucy9yZWZyZXNoXCIsIChwYXJhbXMpID0+XG4gICAgICBoYW5kbGVyKFwiYWNjb3VudC9jaGF0Z3B0QXV0aFRva2Vucy9yZWZyZXNoXCIsIHBhcmFtcyksXG4gICAgKTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBUdXJuIGV4ZWN1dGlvbiDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICB0cnlBY3F1aXJlVHVybigpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5idXN5KSByZXR1cm4gZmFsc2U7XG4gICAgdGhpcy5idXN5ID0gdHJ1ZTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICByZWxlYXNlVHVybigpOiB2b2lkIHtcbiAgICB0aGlzLmJ1c3kgPSBmYWxzZTtcbiAgfVxuICBnZXQgaGFzQ2FwYWNpdHkoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICF0aGlzLmJ1c3k7XG4gIH1cblxuICAvLyDsg4ggdGhyZWFkIOyDneyEsSAodGhyZWFkL3N0YXJ0ICsg7ZWE7JqUIOyLnCBoaXN0b3J5IGluamVjdCkuIOyyqyB0dXJuIC8g7Y+067CxIOqyveuhnOyaqS5cbiAgLy8g7ZuE7IaNIHR1cm4g7J2AIGNyZWF0ZVRocmVhZCDsl4bsnbQgc3RhcnRUdXJuT25UaHJlYWQg66eMIO2YuOy2nO2VtCBjb252ZXJzYXRpb25faWQg66W8IOqzoOygle2VnOuLpC5cbiAgLy8gdGhyZWFkIOydmCDquLDrs7ggbW9kZWwg64+EIOuwmO2ZmCAocmVxLm1vZGVsIOuvuOyngOyglSDsi5wgZmFsbGJhY2spLlxuICBhc3luYyBjcmVhdGVUaHJlYWQocmVxOiBUdXJuUmVxdWVzdCk6IFByb21pc2U8eyB0aHJlYWRJZDogc3RyaW5nOyBtb2RlbDogc3RyaW5nIH0+IHtcbiAgICBpZiAoIXRoaXMucnBjIHx8ICF0aGlzLnJlYWR5KSB0aHJvdyBuZXcgRXJyb3IoXCJ3b3JrZXIgbm90IHJlYWR5XCIpO1xuICAgIHRoaXMuc3dlZXBJZGxlVGhyZWFkcygpO1xuXG4gICAgY29uc3QgdGhyZWFkQ29uZmlnOiBUaHJlYWRTdGFydFBhcmFtc1tcImNvbmZpZ1wiXSA9IHtcbiAgICAgIC4uLlRIUkVBRF9ERUZBVUxUUy5jb25maWcsXG4gICAgICAuLi4ocmVxLnZlcmJvc2l0eSA/IHsgbW9kZWxfdmVyYm9zaXR5OiByZXEudmVyYm9zaXR5IH0gOiB7fSksXG4gICAgICAvLyDsnbTrr7jsp4Ag66qo65OcOiB0aHJlYWQg64uo7JyE66Gc66eMIGltYWdlX2dlbmVyYXRpb24gZmVhdHVyZSDrpbwg7Lyg64ukLlxuICAgICAgLy8g7KCE7JetIGNvbmZpZy50b21sIOydgCBpbWFnZV9nZW5lcmF0aW9uPWZhbHNlIOycoOyngCjthY3siqTtirggdGhyZWFkIOydtOykkSDssKjri6gpLFxuICAgICAgLy8gZG90dGVkIENMSS3siqTtg4Dsnbwgb3ZlcnJpZGUg7YKk66GcIOydtCB0aHJlYWQg7JeQ7ISc66eMIO2ZnOyEse2ZlCjsi6TsuKEg7ZmV7J24KS5cbiAgICAgIC4uLihyZXEuaW1hZ2VHZW5lcmF0aW9uID8geyBcImZlYXR1cmVzLmltYWdlX2dlbmVyYXRpb25cIjogdHJ1ZSB9IDoge30pLFxuICAgIH07XG4gICAgY29uc3QgeyB0aHJlYWQsIG1vZGVsOiB0aHJlYWRNb2RlbCB9ID0gYXdhaXQgdGhpcy5ycGMucmVxdWVzdDxUaHJlYWRTdGFydFJlc3BvbnNlPihcbiAgICAgIFwidGhyZWFkL3N0YXJ0XCIsXG4gICAgICB7XG4gICAgICAgIGVwaGVtZXJhbDogdHJ1ZSxcbiAgICAgICAgY3dkOiBgJHt0aGlzLmNvZGV4SG9tZX0vY3dkYCxcbiAgICAgICAgYmFzZUluc3RydWN0aW9uczogcmVxLmltYWdlR2VuZXJhdGlvblxuICAgICAgICAgID8gaW1hZ2VCYXNlSW5zdHJ1Y3Rpb25zKHJlcS5pbWFnZUdlbmVyYXRpb25PcHRpb25zKVxuICAgICAgICAgIDogQkFTRV9JTlNUUlVDVElPTlMsXG4gICAgICAgIGRldmVsb3Blckluc3RydWN0aW9uczogcmVxLmRldmVsb3Blckluc3RydWN0aW9ucyA/PyBcIlwiLFxuICAgICAgICBzYW5kYm94OiBUSFJFQURfREVGQVVMVFMuc2FuZGJveCxcbiAgICAgICAgYXBwcm92YWxQb2xpY3k6IFRIUkVBRF9ERUZBVUxUUy5hcHByb3ZhbFBvbGljeSxcbiAgICAgICAgY29uZmlnOiB0aHJlYWRDb25maWcsXG4gICAgICB9IHNhdGlzZmllcyBQYXJ0aWFsPFRocmVhZFN0YXJ0UGFyYW1zPixcbiAgICApO1xuXG4gICAgY29uc3QgdGhyZWFkSWQgPSB0aHJlYWQuaWQ7XG4gICAgaWYgKHJlcS5oaXN0b3J5Py5sZW5ndGgpIHtcbiAgICAgIGF3YWl0IHRoaXMucnBjLnJlcXVlc3QoXCJ0aHJlYWQvaW5qZWN0X2l0ZW1zXCIsIHtcbiAgICAgICAgdGhyZWFkSWQsXG4gICAgICAgIGl0ZW1zOiByZXEuaGlzdG9yeSxcbiAgICAgIH0gc2F0aXNmaWVzIFRocmVhZEluamVjdEl0ZW1zUGFyYW1zKTtcbiAgICB9XG4gICAgLy8g7J2066+47KeAIHR1cm4g7J2AIOyerOyCrOyaqeyXkOyEnCDsoJzsmbgoUjgpOiBiYXNlNjQg6rCAIHRocmVhZCDrqZTrqqjrpqzCt+y6kOyLnCBwcmVmaXgg7JeQXG4gICAgLy8g7IOB7KO87ZWY64qUIOqyg+ydhCDrp4nqs6AsIOydtOuvuOyngCB0aHJlYWQg66W8IDEg7ZqM7Jqp7Jy866GcIOuRlOuLpC4gdGhyZWFkTWV0YSDrr7jrk7HroZ0g4oaSXG4gICAgLy8g7ZuE7IaNIHJldXNlIOyhsO2ajOyXkOyEnCDsnbQgdGhyZWFkIOuKlCDtm4Trs7TqsIAg65CY7KeAIOyViuuKlOuLpC5cbiAgICBpZiAoIXJlcS5pbWFnZUdlbmVyYXRpb24pIHtcbiAgICAgIHRoaXMudGhyZWFkTWV0YS5zZXQodGhyZWFkSWQsIHsgbGFzdFVzZWRBdDogRGF0ZS5ub3coKSB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4geyB0aHJlYWRJZCwgbW9kZWw6IHJlcS5tb2RlbCA/PyB0aHJlYWRNb2RlbCB9O1xuICB9XG5cbiAgLy8g6riw7KG0IHRocmVhZCDsl5AgdHVybiDrp4wg7Iuk7ZaJIChpbmplY3Qg7JeG7J2MKS4gY29udmVyc2F0aW9uX2lkIOycoOyngCDihpIgcHJvbXB0IGNhY2hlIOyggeykkS5cbiAgcHJpdmF0ZSBhc3luYyBzdGFydFR1cm5PblRocmVhZCh0aHJlYWRJZDogc3RyaW5nLCByZXE6IFR1cm5SZXF1ZXN0KTogUHJvbWlzZTx7IHR1cm5JZDogc3RyaW5nIH0+IHtcbiAgICBpZiAoIXRoaXMucnBjIHx8ICF0aGlzLnJlYWR5KSB0aHJvdyBuZXcgRXJyb3IoXCJ3b3JrZXIgbm90IHJlYWR5XCIpO1xuXG4gICAgY29uc3QgeyB0dXJuIH0gPSBhd2FpdCB0aGlzLnJwYy5yZXF1ZXN0PFR1cm5TdGFydFJlc3BvbnNlPihcInR1cm4vc3RhcnRcIiwge1xuICAgICAgdGhyZWFkSWQsXG4gICAgICBpbnB1dDogcmVxLmlucHV0LFxuICAgICAgLi4uKHJlcS5vdXRwdXRTY2hlbWEgPyB7IG91dHB1dFNjaGVtYTogcmVxLm91dHB1dFNjaGVtYSB9IDoge30pLFxuICAgICAgLi4uKHJlcS5lZmZvcnQgPyB7IGVmZm9ydDogcmVxLmVmZm9ydCB9IDoge30pLFxuICAgICAgLi4uKHJlcS5tb2RlbCA/IHsgbW9kZWw6IHJlcS5tb2RlbCB9IDoge30pLFxuICAgICAgLi4uKHJlcS5yZWFzb25pbmdTdW1tYXJ5ID8geyBzdW1tYXJ5OiByZXEucmVhc29uaW5nU3VtbWFyeSB9IDoge30pLFxuICAgICAgLi4uKHJlcS5zZXJ2aWNlVGllciA/IHsgc2VydmljZVRpZXI6IHJlcS5zZXJ2aWNlVGllciB9IDoge30pLFxuICAgIH0pO1xuICAgIGNvbnN0IG1ldGEgPSB0aGlzLnRocmVhZE1ldGEuZ2V0KHRocmVhZElkKTtcbiAgICBpZiAobWV0YSkgbWV0YS5sYXN0VXNlZEF0ID0gRGF0ZS5ub3coKTtcbiAgICByZXR1cm4geyB0dXJuSWQ6IHR1cm4uaWQgfTtcbiAgfVxuXG4gIC8vIGV4aXN0aW5nVGhyZWFkSWQg7J6I7Jy866m0IOq3uCB0aHJlYWQg7J6s7IKs7JqpKO2bhOyGjSB0dXJuKSwg7JeG7Jy866m0IOyDiCB0aHJlYWQg7IOd7ISxKOyyqyB0dXJuKS5cbiAgLy8g7Zi47LacIO2bhCDsgqzsmqntlZwgdGhyZWFkSWQg66W8IOuwmO2ZmO2VtCBkaXNwYXRjaGVyIOqwgCBjb252IO2VuOuTpOydhCDrsJzquIntlZzri6QuXG4gIGFzeW5jIGV4ZWN1dGVUdXJuKFxuICAgIHJlcTogVHVyblJlcXVlc3QsXG4gICAgZXhpc3RpbmdUaHJlYWRJZD86IHN0cmluZyxcbiAgKTogUHJvbWlzZTxUdXJuUmVzdWx0ICYgeyB0aHJlYWRJZDogc3RyaW5nIH0+IHtcbiAgICBsZXQgdGhyZWFkSWQ6IHN0cmluZztcbiAgICBsZXQgbW9kZWw6IHN0cmluZztcbiAgICBpZiAoZXhpc3RpbmdUaHJlYWRJZCkge1xuICAgICAgdGhyZWFkSWQgPSBleGlzdGluZ1RocmVhZElkO1xuICAgICAgbW9kZWwgPSByZXEubW9kZWwgPz8gXCJcIjtcbiAgICB9IGVsc2Uge1xuICAgICAgKHsgdGhyZWFkSWQsIG1vZGVsIH0gPSBhd2FpdCB0aGlzLmNyZWF0ZVRocmVhZChyZXEpKTtcbiAgICB9XG4gICAgY29uc3QgdHRmdFRyYWNrZXIgPSBjcmVhdGVUdGZ0VHJhY2tlcigpO1xuICAgIGNvbnN0IHJlc3VsdFByb21pc2UgPSB0aGlzLmNvbnN1bWVUdXJuTm90aWZpY2F0aW9ucyh0aHJlYWRJZCwgbW9kZWwsIHR0ZnRUcmFja2VyKTtcbiAgICB0cnkge1xuICAgICAgdHRmdFRyYWNrZXIubWFya1N0YXJ0KCk7XG4gICAgICBhd2FpdCB0aGlzLnN0YXJ0VHVybk9uVGhyZWFkKHRocmVhZElkLCByZXEpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRoaXMuZmFpbEFjdGl2ZVR1cm4oZSBhcyBFcnJvcik7XG4gICAgICBhd2FpdCByZXN1bHRQcm9taXNlLmNhdGNoKCgpID0+IHt9KTtcbiAgICAgIHRocm93IGU7XG4gICAgfVxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJlc3VsdFByb21pc2U7XG4gICAgcmV0dXJuIHsgLi4ucmVzdWx0LCB0aHJlYWRJZCB9O1xuICB9XG5cbiAgYXN5bmMgZXhlY3V0ZVR1cm5TdHJlYW0oXG4gICAgcmVxOiBUdXJuUmVxdWVzdCxcbiAgICBjYjogU3RyZWFtQ2FsbGJhY2tzLFxuICAgIGV4aXN0aW5nVGhyZWFkSWQ/OiBzdHJpbmcsXG4gICk6IFByb21pc2U8eyB0aHJlYWRJZDogc3RyaW5nIH0+IHtcbiAgICBsZXQgdGhyZWFkSWQ6IHN0cmluZztcbiAgICBsZXQgbW9kZWw6IHN0cmluZztcbiAgICBpZiAoZXhpc3RpbmdUaHJlYWRJZCkge1xuICAgICAgdGhyZWFkSWQgPSBleGlzdGluZ1RocmVhZElkO1xuICAgICAgbW9kZWwgPSByZXEubW9kZWwgPz8gXCJcIjtcbiAgICB9IGVsc2Uge1xuICAgICAgKHsgdGhyZWFkSWQsIG1vZGVsIH0gPSBhd2FpdCB0aGlzLmNyZWF0ZVRocmVhZChyZXEpKTtcbiAgICB9XG4gICAgY2Iub25UaHJlYWRJZD8uKHRocmVhZElkKTtcbiAgICBjb25zdCB0dGZ0VHJhY2tlciA9IGNyZWF0ZVR0ZnRUcmFja2VyKCk7XG4gICAgY29uc3QgcmVzdWx0UHJvbWlzZSA9IHRoaXMuY29uc3VtZVN0cmVhbU5vdGlmaWNhdGlvbnModGhyZWFkSWQsIG1vZGVsLCBjYiwgdHRmdFRyYWNrZXIpO1xuICAgIGxldCB0dXJuSWQ6IHN0cmluZztcbiAgICB0cnkge1xuICAgICAgdHRmdFRyYWNrZXIubWFya1N0YXJ0KCk7XG4gICAgICAoeyB0dXJuSWQgfSA9IGF3YWl0IHRoaXMuc3RhcnRUdXJuT25UaHJlYWQodGhyZWFkSWQsIHJlcSkpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRoaXMuZmFpbEFjdGl2ZVR1cm4oZSBhcyBFcnJvcik7XG4gICAgICBhd2FpdCByZXN1bHRQcm9taXNlLmNhdGNoKCgpID0+IHt9KTtcbiAgICAgIHRocm93IGU7XG4gICAgfVxuICAgIGNiLm9uVHVybklkPy4odHVybklkKTtcbiAgICBhd2FpdCByZXN1bHRQcm9taXNlO1xuICAgIHJldHVybiB7IHRocmVhZElkIH07XG4gIH1cblxuICAvLyDilIDilIAgdGhyZWFkIOyerOyCrOyaqSDsp4Dsm5Ag4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgZ2V0IGVwb2NoKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuZXBvY2hDb3VudGVyO1xuICB9XG5cbiAgaGFzVGhyZWFkKHRocmVhZElkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy50aHJlYWRNZXRhLmhhcyh0aHJlYWRJZCk7XG4gIH1cblxuICAvLyBpZGxlIFRUTCDstIjqs7wgLyDqsJzsiJgg7IOB7ZWcIOy0iOqzvCB0aHJlYWQg66W8IOygleumrC4gY3JlYXRlVGhyZWFkIOyngeyghCBsYXp5IO2YuOy2nC5cbiAgLy8gY29kZXggZXBoZW1lcmFsIHRocmVhZCDripQg66qF7Iuc7KCBIGNsb3NlIFJQQyDsl4bsnbQg66e17JeQ7IScIOygnOqxsCDihpIg642UIOydtOyDgSB0dXJuIOyViCDrs7Trg4QuXG4gIHN3ZWVwSWRsZVRocmVhZHMoKTogdm9pZCB7XG4gICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgICBmb3IgKGNvbnN0IFtpZCwgbWV0YV0gb2YgdGhpcy50aHJlYWRNZXRhKSB7XG4gICAgICBpZiAobm93IC0gbWV0YS5sYXN0VXNlZEF0ID4gQ29kZXhBcHBTZXJ2ZXJXb3JrZXIuVEhSRUFEX0lETEVfVFRMX01TKSB7XG4gICAgICAgIHRoaXMudGhyZWFkTWV0YS5kZWxldGUoaWQpO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBjcmVhdGVUaHJlYWQg7KeB7KCEIO2YuOy2nCDihpIg7IOIIHRocmVhZCAxIOqwnOqwgCDqs6cg7LaU6rCA65Cc64ukLiDstpTqsIAg7ZuE7JeQ64+EIE1BWCDrpbwg64SY7KeAIOyViuuPhOuhnVxuICAgIC8vIE1BWC0xIOydtO2VmOuhnCDspITsl6wg65GU64ukKOq3uOuemOyVvCDsg53shLEg7KeB7ZuEIOygle2Zle2eiCBNQVgpLiBMUlU6IGxhc3RVc2VkQXQg7Jik66aE7LCo7Iic7Jy866GcIOygnOqxsC5cbiAgICBjb25zdCBsaW1pdCA9IENvZGV4QXBwU2VydmVyV29ya2VyLk1BWF9USFJFQURTX1BFUl9XT1JLRVIgLSAxO1xuICAgIGlmICh0aGlzLnRocmVhZE1ldGEuc2l6ZSA+IGxpbWl0KSB7XG4gICAgICBjb25zdCBzb3J0ZWQgPSBbLi4udGhpcy50aHJlYWRNZXRhLmVudHJpZXMoKV0udG9Tb3J0ZWQoXG4gICAgICAgIChhLCBiKSA9PiBhWzFdLmxhc3RVc2VkQXQgLSBiWzFdLmxhc3RVc2VkQXQsXG4gICAgICApO1xuICAgICAgY29uc3Qgb3ZlciA9IHRoaXMudGhyZWFkTWV0YS5zaXplIC0gbGltaXQ7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG92ZXI7IGkrKykgdGhpcy50aHJlYWRNZXRhLmRlbGV0ZShzb3J0ZWRbaV0hWzBdKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBpbnRlcnJ1cHRUdXJuKHRocmVhZElkOiBzdHJpbmcsIHR1cm5JZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCF0aGlzLnJwYyB8fCAhdGhpcy5yZWFkeSkgcmV0dXJuO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLnJwYy5yZXF1ZXN0KFwidHVybi9pbnRlcnJ1cHRcIiwgeyB0aHJlYWRJZCwgdHVybklkIH0pO1xuICAgIH0gY2F0Y2gge31cbiAgfVxuXG4gIHByaXZhdGUgZmFpbEFjdGl2ZVR1cm4oZXJyb3I6IEVycm9yKTogdm9pZCB7XG4gICAgY29uc3QgYWJvcnQgPSB0aGlzLmFjdGl2ZVR1cm5BYm9ydDtcbiAgICB0aGlzLmFjdGl2ZVR1cm5BYm9ydCA9IHVuZGVmaW5lZDtcbiAgICBhYm9ydD8uKGVycm9yKTtcbiAgfVxuXG4gIHByaXZhdGUgY2xlYW51cEdlbmVyYXRlZEltYWdlcygpOiB2b2lkIHtcbiAgICB0cnkge1xuICAgICAgcm1TeW5jKGAke3RoaXMuY29kZXhIb21lfS9nZW5lcmF0ZWRfaW1hZ2VzYCwgeyByZWN1cnNpdmU6IHRydWUsIGZvcmNlOiB0cnVlIH0pO1xuICAgIH0gY2F0Y2gge31cbiAgfVxuXG4gIHByaXZhdGUgY29uc3VtZVR1cm5Ob3RpZmljYXRpb25zKFxuICAgIHRocmVhZElkOiBzdHJpbmcsXG4gICAgbW9kZWw6IHN0cmluZyxcbiAgICB0dGZ0VHJhY2tlciA9IGNyZWF0ZVR0ZnRUcmFja2VyKCksXG4gICk6IFByb21pc2U8VHVyblJlc3VsdD4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZTxUdXJuUmVzdWx0PigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBsZXQgc2V0dGxlZCA9IGZhbHNlO1xuICAgICAgbGV0IGFib3J0OiBBY3RpdmVUdXJuQWJvcnQ7XG4gICAgICBjb25zdCB0aW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGZpbmlzaFdpdGhFcnJvcihuZXcgRXJyb3IoXCJ0dXJuIHRpbWVvdXQgKDYwMHMpXCIpKTtcbiAgICAgIH0sIDYwMF8wMDApO1xuXG4gICAgICBsZXQgdGV4dCA9IFwiXCI7XG4gICAgICBsZXQgdXNhZ2U6IFRva2VuVXNhZ2VCcmVha2Rvd24gPSB7XG4gICAgICAgIHRvdGFsVG9rZW5zOiAwLFxuICAgICAgICBpbnB1dFRva2VuczogMCxcbiAgICAgICAgb3V0cHV0VG9rZW5zOiAwLFxuICAgICAgICBjYWNoZWRJbnB1dFRva2VuczogMCxcbiAgICAgICAgcmVhc29uaW5nT3V0cHV0VG9rZW5zOiAwLFxuICAgICAgfTtcbiAgICAgIGxldCBkdXJhdGlvbk1zID0gMDtcbiAgICAgIGNvbnN0IGltYWdlcyA9IG5ldyBNYXA8c3RyaW5nLCBUdXJuSW1hZ2U+KCk7IC8vIGl0ZW0uaWQg4oaSIOydtOuvuOyngCAoZGVkdXApXG4gICAgICBsZXQgaW1hZ2VBdHRlbXB0ZWQgPSBmYWxzZTtcblxuICAgICAgY29uc3QgY2xlYW51cCA9ICgpID0+IHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xuICAgICAgICBpZiAodGhpcy5hY3RpdmVUdXJuQWJvcnQgPT09IGFib3J0KSB0aGlzLmFjdGl2ZVR1cm5BYm9ydCA9IHVuZGVmaW5lZDtcbiAgICAgICAgZm9yIChjb25zdCBuIG9mIFtcbiAgICAgICAgICBcIml0ZW0vc3RhcnRlZFwiLFxuICAgICAgICAgIFwiaXRlbS9jb21wbGV0ZWRcIixcbiAgICAgICAgICBcIml0ZW0vYWdlbnRNZXNzYWdlL2RlbHRhXCIsXG4gICAgICAgICAgXCJ0dXJuL2NvbXBsZXRlZFwiLFxuICAgICAgICAgIFwidGhyZWFkL3Rva2VuVXNhZ2UvdXBkYXRlZFwiLFxuICAgICAgICAgIFwiZXJyb3JcIixcbiAgICAgICAgXSBhcyBjb25zdCkge1xuICAgICAgICAgIHRoaXMucnBjPy5vbk5vdGlmaWNhdGlvbihuLCAoKSA9PiB7fSk7XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IGZpbmlzaFdpdGhFcnJvciA9IChlcnJvcjogRXJyb3IpID0+IHtcbiAgICAgICAgaWYgKHNldHRsZWQpIHJldHVybjtcbiAgICAgICAgc2V0dGxlZCA9IHRydWU7XG4gICAgICAgIGNsZWFudXAoKTtcbiAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IGZpbmlzaFdpdGhSZXN1bHQgPSAocmVzdWx0OiBUdXJuUmVzdWx0KSA9PiB7XG4gICAgICAgIGlmIChzZXR0bGVkKSByZXR1cm47XG4gICAgICAgIHNldHRsZWQgPSB0cnVlO1xuICAgICAgICBjbGVhbnVwKCk7XG4gICAgICAgIGlmIChyZXN1bHQuaW1hZ2VBdHRlbXB0ZWQpIHRoaXMuY2xlYW51cEdlbmVyYXRlZEltYWdlcygpO1xuICAgICAgICByZXNvbHZlKHJlc3VsdCk7XG4gICAgICB9O1xuXG4gICAgICBhYm9ydCA9IGZpbmlzaFdpdGhFcnJvcjtcbiAgICAgIHRoaXMuYWN0aXZlVHVybkFib3J0ID0gYWJvcnQ7XG5cbiAgICAgIC8vIOydtOuvuOyngCB0b29sIO2YuOy2nCDqtIDsuKEo7J6s7Iuc64+EIO2MkOygleyaqSkuIHN0YXJ0ZWQg64qUIHJlc3VsdCDsl4bsnbQg7Jik66+A66GcXG4gICAgICAvLyBhdHRlbXB0ZWQg7Iug7Zi466Gc66eMIOyTsOqzoCwg7JmE7ISxIOydtOuvuOyngOuKlCBjb21wbGV0ZWQg7JeQ7IScIHJlc3VsdCDsnKDtmqjshLHsnLzroZwg7YyQ7KCV7ZWc64ukLlxuICAgICAgdGhpcy5ycGMhLm9uTm90aWZpY2F0aW9uKFwiaXRlbS9zdGFydGVkXCIsIChwKSA9PiB7XG4gICAgICAgIGlmIChwLnRocmVhZElkICE9PSB0aHJlYWRJZCkgcmV0dXJuO1xuICAgICAgICBpZiAocC5pdGVtLnR5cGUgPT09IFwiaW1hZ2VHZW5lcmF0aW9uXCIpIGltYWdlQXR0ZW1wdGVkID0gdHJ1ZTtcbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLnJwYyEub25Ob3RpZmljYXRpb24oXCJpdGVtL2NvbXBsZXRlZFwiLCAocCkgPT4ge1xuICAgICAgICBpZiAocC50aHJlYWRJZCAhPT0gdGhyZWFkSWQpIHJldHVybjtcbiAgICAgICAgaWYgKHAuaXRlbS50eXBlID09PSBcImFnZW50TWVzc2FnZVwiKSB7XG4gICAgICAgICAgdGV4dCA9IHAuaXRlbS50ZXh0O1xuICAgICAgICB9IGVsc2UgaWYgKHAuaXRlbS50eXBlID09PSBcImltYWdlR2VuZXJhdGlvblwiKSB7XG4gICAgICAgICAgaW1hZ2VBdHRlbXB0ZWQgPSB0cnVlO1xuICAgICAgICAgIGlmIChpc0NvbXBsZXRlZEltYWdlUmVzdWx0KHAuaXRlbS5yZXN1bHQpKSB7XG4gICAgICAgICAgICBpbWFnZXMuc2V0KHAuaXRlbS5pZCwgeyBkYXRhOiBwLml0ZW0ucmVzdWx0LCByZXZpc2VkUHJvbXB0OiBwLml0ZW0ucmV2aXNlZFByb21wdCB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLnJwYyEub25Ob3RpZmljYXRpb24oXCJpdGVtL2FnZW50TWVzc2FnZS9kZWx0YVwiLCAocCkgPT4ge1xuICAgICAgICBpZiAocC50aHJlYWRJZCAhPT0gdGhyZWFkSWQpIHJldHVybjtcbiAgICAgICAgdHRmdFRyYWNrZXIucmVjb3JkRmlyc3REZWx0YSgpO1xuICAgICAgICB0ZXh0ICs9IHAuZGVsdGE7XG4gICAgICB9KTtcblxuICAgICAgdGhpcy5ycGMhLm9uTm90aWZpY2F0aW9uKFwidGhyZWFkL3Rva2VuVXNhZ2UvdXBkYXRlZFwiLCAocCkgPT4ge1xuICAgICAgICBpZiAocC50aHJlYWRJZCAhPT0gdGhyZWFkSWQpIHJldHVybjtcbiAgICAgICAgLy8gdGhyZWFkIOyerOyCrOyaqSDsi5wgLnRvdGFsIOydgCDrjIDtmZQg7KCE7LK0IOuIhOyggeydtOudvCwgY29sZCDsmIDrjZgg7J207KCEIHR1cm4g6rmM7KeAIOyEnuyXrFxuICAgICAgICAvLyDsnbQg7JqU7LKtIOyekOyytOydmCBjYWNoZSDsoIHspJHrpaDsnbQg7Z2s7ISd65Cc64ukKOyYiDogdHVybjEgY29sZCAwJSArIHR1cm4yIDkwJSDihpIgNDglIOuhnCDquLDroZ0pLlxuICAgICAgICAvLyAubGFzdCDripQg7J2067KIIHR1cm4g66eM7J2YIHVzYWdlIOudvCByZXF1ZXN0X2xvZyDqsIAg6re4IOyalOyyreydmCDsi6TsoJwg7Yag7YGw7J2EIOygle2Zle2eiCDrsJjsmIHtlZzri6QuXG4gICAgICAgIHVzYWdlID0gcC50b2tlblVzYWdlLmxhc3Q7XG4gICAgICB9KTtcblxuICAgICAgdGhpcy5ycGMhLm9uTm90aWZpY2F0aW9uKFwidHVybi9jb21wbGV0ZWRcIiwgKHApID0+IHtcbiAgICAgICAgaWYgKHAudGhyZWFkSWQgIT09IHRocmVhZElkKSByZXR1cm47XG4gICAgICAgIGR1cmF0aW9uTXMgPSBwLnR1cm4uZHVyYXRpb25NcyA/PyAwO1xuICAgICAgICBpZiAocC50dXJuLnN0YXR1cyA9PT0gXCJjb21wbGV0ZWRcIikge1xuICAgICAgICAgIGZpbmlzaFdpdGhSZXN1bHQoe1xuICAgICAgICAgICAgdGV4dCxcbiAgICAgICAgICAgIHVzYWdlLFxuICAgICAgICAgICAgZHVyYXRpb25NcyxcbiAgICAgICAgICAgIHR0ZnRNczogdHRmdFRyYWNrZXIudmFsdWUoKSxcbiAgICAgICAgICAgIG1vZGVsLFxuICAgICAgICAgICAgaW1hZ2VzOiBpbWFnZXMuc2l6ZSA+IDAgPyBbLi4uaW1hZ2VzLnZhbHVlcygpXSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGltYWdlQXR0ZW1wdGVkLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIHR1cm4g7Iuk7YyoL+ykkeuLqCDsi5wg67aA67aEIOydtOuvuOyngOuKlCDtj5DquLAo7ISx6rO17Jy866GcIOyKueqyqe2VmOyngCDslYrsnYwpLlxuICAgICAgICAgIGZpbmlzaFdpdGhFcnJvcihuZXcgRXJyb3IoYHR1cm4gZmFpbGVkOiAke0pTT04uc3RyaW5naWZ5KHAudHVybi5lcnJvcil9YCkpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgdGhpcy5ycGMhLm9uTm90aWZpY2F0aW9uKFwiZXJyb3JcIiwgKHApID0+IHtcbiAgICAgICAgaWYgKHAudGhyZWFkSWQgIT09IHRocmVhZElkKSByZXR1cm47XG4gICAgICAgIGlmICghcC53aWxsUmV0cnkpIHtcbiAgICAgICAgICBmaW5pc2hXaXRoRXJyb3IobmV3IEVycm9yKGBjb2RleCBlcnJvcjogJHtwLmVycm9yLm1lc3NhZ2V9YCkpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgY29uc3VtZVN0cmVhbU5vdGlmaWNhdGlvbnMoXG4gICAgdGhyZWFkSWQ6IHN0cmluZyxcbiAgICBtb2RlbDogc3RyaW5nLFxuICAgIGNiOiBTdHJlYW1DYWxsYmFja3MsXG4gICAgdHRmdFRyYWNrZXIgPSBjcmVhdGVUdGZ0VHJhY2tlcigpLFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgbGV0IHNldHRsZWQgPSBmYWxzZTtcbiAgICAgIGxldCBhYm9ydDogQWN0aXZlVHVybkFib3J0O1xuICAgICAgY29uc3QgdGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBmaW5pc2hXaXRoRXJyb3IobmV3IEVycm9yKFwidHVybiB0aW1lb3V0ICg2MDBzKVwiKSk7XG4gICAgICB9LCA2MDBfMDAwKTtcblxuICAgICAgbGV0IHRleHQgPSBcIlwiO1xuICAgICAgbGV0IHVzYWdlOiBUb2tlblVzYWdlQnJlYWtkb3duID0ge1xuICAgICAgICB0b3RhbFRva2VuczogMCxcbiAgICAgICAgaW5wdXRUb2tlbnM6IDAsXG4gICAgICAgIG91dHB1dFRva2VuczogMCxcbiAgICAgICAgY2FjaGVkSW5wdXRUb2tlbnM6IDAsXG4gICAgICAgIHJlYXNvbmluZ091dHB1dFRva2VuczogMCxcbiAgICAgIH07XG4gICAgICBjb25zdCBpbWFnZXMgPSBuZXcgTWFwPHN0cmluZywgVHVybkltYWdlPigpOyAvLyBpdGVtLmlkIOKGkiDsnbTrr7jsp4AgKGRlZHVwKVxuICAgICAgbGV0IGltYWdlQXR0ZW1wdGVkID0gZmFsc2U7XG5cbiAgICAgIGNvbnN0IGNsZWFudXAgPSAoKSA9PiB7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0KTtcbiAgICAgICAgaWYgKHRoaXMuYWN0aXZlVHVybkFib3J0ID09PSBhYm9ydCkgdGhpcy5hY3RpdmVUdXJuQWJvcnQgPSB1bmRlZmluZWQ7XG4gICAgICAgIGZvciAoY29uc3QgbiBvZiBbXG4gICAgICAgICAgXCJpdGVtL3N0YXJ0ZWRcIixcbiAgICAgICAgICBcIml0ZW0vY29tcGxldGVkXCIsXG4gICAgICAgICAgXCJpdGVtL2FnZW50TWVzc2FnZS9kZWx0YVwiLFxuICAgICAgICAgIFwidHVybi9jb21wbGV0ZWRcIixcbiAgICAgICAgICBcInRocmVhZC90b2tlblVzYWdlL3VwZGF0ZWRcIixcbiAgICAgICAgICBcImVycm9yXCIsXG4gICAgICAgIF0gYXMgY29uc3QpIHtcbiAgICAgICAgICB0aGlzLnJwYz8ub25Ob3RpZmljYXRpb24obiwgKCkgPT4ge30pO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBjb25zdCBmaW5pc2hXaXRoRXJyb3IgPSAoZXJyb3I6IEVycm9yKSA9PiB7XG4gICAgICAgIGlmIChzZXR0bGVkKSByZXR1cm47XG4gICAgICAgIHNldHRsZWQgPSB0cnVlO1xuICAgICAgICBjbGVhbnVwKCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY2Iub25FcnJvcihlcnJvcik7XG4gICAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgICAgfSBjYXRjaCAoY2FsbGJhY2tFcnJvcikge1xuICAgICAgICAgIHJlamVjdChjYWxsYmFja0Vycm9yKTtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgY29uc3QgZmluaXNoV2l0aENvbXBsZXRlID0gKHJlc3VsdDogVHVyblJlc3VsdCkgPT4ge1xuICAgICAgICBpZiAoc2V0dGxlZCkgcmV0dXJuO1xuICAgICAgICBzZXR0bGVkID0gdHJ1ZTtcbiAgICAgICAgY2xlYW51cCgpO1xuICAgICAgICBpZiAocmVzdWx0LmltYWdlQXR0ZW1wdGVkKSB0aGlzLmNsZWFudXBHZW5lcmF0ZWRJbWFnZXMoKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjYi5vbkNvbXBsZXRlKHJlc3VsdCk7XG4gICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICB9IGNhdGNoIChjYWxsYmFja0Vycm9yKSB7XG4gICAgICAgICAgcmVqZWN0KGNhbGxiYWNrRXJyb3IpO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBhYm9ydCA9IGZpbmlzaFdpdGhFcnJvcjtcbiAgICAgIHRoaXMuYWN0aXZlVHVybkFib3J0ID0gYWJvcnQ7XG5cbiAgICAgIHRoaXMucnBjIS5vbk5vdGlmaWNhdGlvbihcIml0ZW0vYWdlbnRNZXNzYWdlL2RlbHRhXCIsIChwKSA9PiB7XG4gICAgICAgIGlmIChwLnRocmVhZElkICE9PSB0aHJlYWRJZCkgcmV0dXJuO1xuICAgICAgICB0dGZ0VHJhY2tlci5yZWNvcmRGaXJzdERlbHRhKCk7XG4gICAgICAgIHRleHQgKz0gcC5kZWx0YTtcbiAgICAgICAgY2Iub25EZWx0YShwLmRlbHRhKTtcbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLnJwYyEub25Ob3RpZmljYXRpb24oXCJpdGVtL3N0YXJ0ZWRcIiwgKHApID0+IHtcbiAgICAgICAgaWYgKHAudGhyZWFkSWQgIT09IHRocmVhZElkKSByZXR1cm47XG4gICAgICAgIGlmIChwLml0ZW0udHlwZSA9PT0gXCJpbWFnZUdlbmVyYXRpb25cIikgaW1hZ2VBdHRlbXB0ZWQgPSB0cnVlO1xuICAgICAgfSk7XG5cbiAgICAgIHRoaXMucnBjIS5vbk5vdGlmaWNhdGlvbihcIml0ZW0vY29tcGxldGVkXCIsIChwKSA9PiB7XG4gICAgICAgIGlmIChwLnRocmVhZElkICE9PSB0aHJlYWRJZCkgcmV0dXJuO1xuICAgICAgICBpZiAocC5pdGVtLnR5cGUgPT09IFwiYWdlbnRNZXNzYWdlXCIpIHtcbiAgICAgICAgICB0ZXh0ID0gcC5pdGVtLnRleHQ7XG4gICAgICAgIH0gZWxzZSBpZiAocC5pdGVtLnR5cGUgPT09IFwiaW1hZ2VHZW5lcmF0aW9uXCIpIHtcbiAgICAgICAgICBpbWFnZUF0dGVtcHRlZCA9IHRydWU7XG4gICAgICAgICAgaWYgKGlzQ29tcGxldGVkSW1hZ2VSZXN1bHQocC5pdGVtLnJlc3VsdCkpIHtcbiAgICAgICAgICAgIGltYWdlcy5zZXQocC5pdGVtLmlkLCB7IGRhdGE6IHAuaXRlbS5yZXN1bHQsIHJldmlzZWRQcm9tcHQ6IHAuaXRlbS5yZXZpc2VkUHJvbXB0IH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIHRoaXMucnBjIS5vbk5vdGlmaWNhdGlvbihcInRocmVhZC90b2tlblVzYWdlL3VwZGF0ZWRcIiwgKHApID0+IHtcbiAgICAgICAgaWYgKHAudGhyZWFkSWQgIT09IHRocmVhZElkKSByZXR1cm47XG4gICAgICAgIC8vIHRocmVhZCDsnqzsgqzsmqkg7IucIC50b3RhbCDsnYAg64yA7ZmUIOyghOyytCDriITsoIHsnbTrnbwsIGNvbGQg7JiA642YIOydtOyghCB0dXJuIOq5jOyngCDshJ7sl6xcbiAgICAgICAgLy8g7J20IOyalOyyrSDsnpDssrTsnZggY2FjaGUg7KCB7KSR66Wg7J20IO2drOyEneuQnOuLpCjsmIg6IHR1cm4xIGNvbGQgMCUgKyB0dXJuMiA5MCUg4oaSIDQ4JSDroZwg6riw66GdKS5cbiAgICAgICAgLy8gLmxhc3Qg64qUIOydtOuyiCB0dXJuIOunjOydmCB1c2FnZSDrnbwgcmVxdWVzdF9sb2cg6rCAIOq3uCDsmpTssq3snZgg7Iuk7KCcIO2GoO2BsOydhCDsoJXtmZXtnogg67CY7JiB7ZWc64ukLlxuICAgICAgICB1c2FnZSA9IHAudG9rZW5Vc2FnZS5sYXN0O1xuICAgICAgfSk7XG5cbiAgICAgIHRoaXMucnBjIS5vbk5vdGlmaWNhdGlvbihcInR1cm4vY29tcGxldGVkXCIsIChwKSA9PiB7XG4gICAgICAgIGlmIChwLnRocmVhZElkICE9PSB0aHJlYWRJZCkgcmV0dXJuO1xuICAgICAgICBpZiAocC50dXJuLnN0YXR1cyA9PT0gXCJjb21wbGV0ZWRcIikge1xuICAgICAgICAgIGZpbmlzaFdpdGhDb21wbGV0ZSh7XG4gICAgICAgICAgICB0ZXh0LFxuICAgICAgICAgICAgdXNhZ2UsXG4gICAgICAgICAgICBkdXJhdGlvbk1zOiBwLnR1cm4uZHVyYXRpb25NcyA/PyAwLFxuICAgICAgICAgICAgdHRmdE1zOiB0dGZ0VHJhY2tlci52YWx1ZSgpLFxuICAgICAgICAgICAgbW9kZWwsXG4gICAgICAgICAgICBpbWFnZXM6IGltYWdlcy5zaXplID4gMCA/IFsuLi5pbWFnZXMudmFsdWVzKCldIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgaW1hZ2VBdHRlbXB0ZWQsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZmluaXNoV2l0aEVycm9yKG5ldyBFcnJvcihgdHVybiAke3AudHVybi5zdGF0dXN9OiAke0pTT04uc3RyaW5naWZ5KHAudHVybi5lcnJvcil9YCkpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgdGhpcy5ycGMhLm9uTm90aWZpY2F0aW9uKFwiZXJyb3JcIiwgKHApID0+IHtcbiAgICAgICAgaWYgKHAudGhyZWFkSWQgIT09IHRocmVhZElkKSByZXR1cm47XG4gICAgICAgIGlmICghcC53aWxsUmV0cnkpIHtcbiAgICAgICAgICBmaW5pc2hXaXRoRXJyb3IobmV3IEVycm9yKGBjb2RleCBlcnJvcjogJHtwLmVycm9yLm1lc3NhZ2V9YCkpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBSZXN0YXJ0IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIHByaXZhdGUgc2NoZWR1bGVSZXN0YXJ0KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmRlc3Ryb3llZCB8fCB0aGlzLnJlc3RhcnRBdHRlbXB0cyA+PSBNQVhfUkVTVEFSVF9BVFRFTVBUUykge1xuICAgICAgaWYgKHRoaXMucmVzdGFydEF0dGVtcHRzID49IE1BWF9SRVNUQVJUX0FUVEVNUFRTKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKGB3b3JrZXIgJHt0aGlzLmNvbmZpZy50b2tlbk5hbWV9IG1heCByZXN0YXJ0IGF0dGVtcHRzIHJlYWNoZWRgKTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnJlc3RhcnRBdHRlbXB0cysrO1xuICAgIGNvbnN0IGJhc2VEZWxheSA9IFJFU1RBUlRfQkFDS09GRl9CQVNFX01TICogMiAqKiAodGhpcy5yZXN0YXJ0QXR0ZW1wdHMgLSAxKTtcbiAgICBjb25zdCBzdGFnZ2VyID0gKHRoaXMuY29uZmlnLndvcmtlckluZGV4ID8/IDApICogMl8wMDA7XG4gICAgY29uc3QgZGVsYXkgPSBiYXNlRGVsYXkgKyBzdGFnZ2VyO1xuICAgIGxvZ2dlci5pbmZvKFxuICAgICAgYHdvcmtlciAke3RoaXMuY29uZmlnLnRva2VuTmFtZX1bJHt0aGlzLmNvbmZpZy53b3JrZXJJbmRleCA/PyAwfV0gcmVzdGFydGluZyBpbiAke2RlbGF5fW1zIChhdHRlbXB0ICR7dGhpcy5yZXN0YXJ0QXR0ZW1wdHN9KWAsXG4gICAgKTtcblxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgaWYgKHRoaXMuZGVzdHJveWVkKSByZXR1cm47XG4gICAgICB0aGlzLmluaXRpYWxpemUoKVxuICAgICAgICAudGhlbigoKSA9PiB0aGlzLm9uUmVhZHk/LigpKVxuICAgICAgICAuY2F0Y2goKGUpID0+IHtcbiAgICAgICAgICBsb2dnZXIud2Fybihgd29ya2VyICR7dGhpcy5jb25maWcudG9rZW5OYW1lfSByZXN0YXJ0IGZhaWxlZDogJHsoZSBhcyBFcnJvcikubWVzc2FnZX1gKTtcbiAgICAgICAgICB0aGlzLnNjaGVkdWxlUmVzdGFydCgpO1xuICAgICAgICB9KTtcbiAgICB9LCBkZWxheSk7XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBeUJBLE1BQU0sU0FBUyxV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
|
|
615
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29kZXgtd29ya2VyLmpzIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy91dGlscy9wcm92aWRlcnMvb3BlbmFpL2NvZGV4LXdvcmtlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBzcGF3biwgdHlwZSBDaGlsZFByb2Nlc3MgfSBmcm9tIFwibm9kZTpjaGlsZF9wcm9jZXNzXCI7XG5pbXBvcnQgeyBta2RpclN5bmMsIHJlYWRGaWxlU3luYywgcm1TeW5jLCB3cml0ZUZpbGVTeW5jIH0gZnJvbSBcIm5vZGU6ZnNcIjtcbmltcG9ydCB7IHRtcGRpciB9IGZyb20gXCJub2RlOm9zXCI7XG5pbXBvcnQgeyBqb2luIH0gZnJvbSBcIm5vZGU6cGF0aFwiO1xuXG5pbXBvcnQgeyBnZXRMb2dnZXIgfSBmcm9tIFwiQGxvZ3RhcGUvbG9ndGFwZVwiO1xuXG5pbXBvcnQge1xuICBDT0RFWF9JTUFHRV9HRU5FUkFUSU9OX01PREVMLFxuICByZXNvbHZlSW1hZ2VHZW5lcmF0aW9uT3B0aW9ucyxcbn0gZnJvbSBcIi4uLy4uLy4uL2FwcGxpY2F0aW9uL3FncmlkL3FncmlkLWltYWdlLWdlbmVyYXRpb25cIjtcbmltcG9ydCB7IHR5cGUgSW1hZ2VHZW5lcmF0aW9uT3B0aW9ucyB9IGZyb20gXCIuLi8uLi8uLi9hcHBsaWNhdGlvbi9xZ3JpZC9xZ3JpZC50eXBlc1wiO1xuaW1wb3J0IHsgdHlwZSBNb2RlbCB9IGZyb20gXCIuLi8uLi8uLi9jb2RleC1wcm90b2NvbC92Mi9Nb2RlbFwiO1xuaW1wb3J0IHsgdHlwZSBNb2RlbExpc3RSZXNwb25zZSB9IGZyb20gXCIuLi8uLi8uLi9jb2RleC1wcm90b2NvbC92Mi9Nb2RlbExpc3RSZXNwb25zZVwiO1xuaW1wb3J0IHsgdHlwZSBNb2RlbFByb3ZpZGVyQ2FwYWJpbGl0aWVzUmVhZFJlc3BvbnNlIH0gZnJvbSBcIi4uLy4uLy4uL2NvZGV4LXByb3RvY29sL3YyL01vZGVsUHJvdmlkZXJDYXBhYmlsaXRpZXNSZWFkUmVzcG9uc2VcIjtcbmltcG9ydCB7IHR5cGUgVGhyZWFkSW5qZWN0SXRlbXNQYXJhbXMgfSBmcm9tIFwiLi4vLi4vLi4vY29kZXgtcHJvdG9jb2wvdjIvVGhyZWFkSW5qZWN0SXRlbXNQYXJhbXNcIjtcbmltcG9ydCB7IHR5cGUgVGhyZWFkU3RhcnRQYXJhbXMgfSBmcm9tIFwiLi4vLi4vLi4vY29kZXgtcHJvdG9jb2wvdjIvVGhyZWFkU3RhcnRQYXJhbXNcIjtcbmltcG9ydCB7IHR5cGUgVGhyZWFkU3RhcnRSZXNwb25zZSB9IGZyb20gXCIuLi8uLi8uLi9jb2RleC1wcm90b2NvbC92Mi9UaHJlYWRTdGFydFJlc3BvbnNlXCI7XG5pbXBvcnQgeyB0eXBlIFRva2VuVXNhZ2VCcmVha2Rvd24gfSBmcm9tIFwiLi4vLi4vLi4vY29kZXgtcHJvdG9jb2wvdjIvVG9rZW5Vc2FnZUJyZWFrZG93blwiO1xuaW1wb3J0IHsgdHlwZSBUdXJuU3RhcnRQYXJhbXMgfSBmcm9tIFwiLi4vLi4vLi4vY29kZXgtcHJvdG9jb2wvdjIvVHVyblN0YXJ0UGFyYW1zXCI7XG5pbXBvcnQgeyB0eXBlIFR1cm5TdGFydFJlc3BvbnNlIH0gZnJvbSBcIi4uLy4uLy4uL2NvZGV4LXByb3RvY29sL3YyL1R1cm5TdGFydFJlc3BvbnNlXCI7XG5pbXBvcnQgeyB0eXBlIFN0cmVhbUNhbGxiYWNrcyBhcyBDb21tb25TdHJlYW1DYWxsYmFja3MgfSBmcm9tIFwiLi4vY29tbW9uL3Byb3ZpZGVyLWRpc3BhdGNoZXJcIjtcbmltcG9ydCB7IGNyZWF0ZVR0ZnRUcmFja2VyIH0gZnJvbSBcIi4uL2NvbW1vbi90dGZ0XCI7XG5pbXBvcnQgeyBDb2RleFJwY0NsaWVudCB9IGZyb20gXCIuL2NvZGV4LXJwY1wiO1xuXG5jb25zdCBsb2dnZXIgPSBnZXRMb2dnZXIoW1wicWdyaWRcIiwgXCJjb2RleC13b3JrZXJcIl0pO1xuXG5jb25zdCBNQVhfUkVTVEFSVF9BVFRFTVBUUyA9IDM7XG5jb25zdCBSRVNUQVJUX0JBQ0tPRkZfQkFTRV9NUyA9IDFfMDAwO1xuXG4vLyDilIDilIAgVHlwZXMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbmV4cG9ydCBpbnRlcmZhY2UgV29ya2VyQ29uZmlnIHtcbiAgdG9rZW5JZDogbnVtYmVyO1xuICB0b2tlbk5hbWU6IHN0cmluZztcbiAgYWNjZXNzVG9rZW46IHN0cmluZztcbiAgYWNjb3VudElkOiBzdHJpbmc7XG4gIHBsYW5UeXBlPzogc3RyaW5nO1xuICB3b3JrZXJJbmRleD86IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUdXJuUmVxdWVzdCB7XG4gIGlucHV0OiBUdXJuU3RhcnRQYXJhbXNbXCJpbnB1dFwiXTtcbiAgb3V0cHV0U2NoZW1hPzogVHVyblN0YXJ0UGFyYW1zW1wib3V0cHV0U2NoZW1hXCJdO1xuICBlZmZvcnQ/OiBzdHJpbmc7XG4gIG1vZGVsPzogc3RyaW5nO1xuICBkZXZlbG9wZXJJbnN0cnVjdGlvbnM/OiBzdHJpbmc7XG4gIGhpc3Rvcnk/OiBUaHJlYWRJbmplY3RJdGVtc1BhcmFtc1tcIml0ZW1zXCJdO1xuICB2ZXJib3NpdHk/OiBzdHJpbmc7XG4gIHJlYXNvbmluZ1N1bW1hcnk/OiBzdHJpbmc7XG4gIHNlcnZpY2VUaWVyPzogc3RyaW5nO1xuICAvLyDsnbQgdHVybiDsl5DshJwgY29kZXgg64K07J6lIGltYWdlX2dlbmVyYXRpb24gdG9vbCDsnYQg7Lyg64ukLlxuICAvLyB0aHJlYWQg64uo7JyE66Gc66eMIO2ZnOyEse2ZlOuQmOupsCjsoITsl60gY29uZmlnIOuKlCBpbWFnZV9nZW5lcmF0aW9uPWZhbHNlIOycoOyngCksXG4gIC8vIO2UjOuemOq3uCDsl4bripQg7JqU7LKt7J2AIHRvb2wg6rWs7ISx7J20IO2YhO2WieqzvCDrj5nsnbztlZjri6QuXG4gIGltYWdlR2VuZXJhdGlvbj86IGJvb2xlYW47XG4gIGltYWdlR2VuZXJhdGlvbk9wdGlvbnM/OiBJbWFnZUdlbmVyYXRpb25PcHRpb25zO1xufVxuXG4vLyDtlZwgdHVybiDsl5DshJwg7IOd7ISx65CcIOydtOuvuOyngCDtlZjrgpguIGNvZGV4IGltYWdlR2VuZXJhdGlvbiBpdGVtIOyXkOyEnCDtjIzsg50uXG5leHBvcnQgaW50ZXJmYWNlIFR1cm5JbWFnZSB7XG4gIGRhdGE6IHN0cmluZzsgLy8gYmFzZTY0IGltYWdlIHBheWxvYWQgKGl0ZW0ucmVzdWx0KVxuICByZXZpc2VkUHJvbXB0OiBzdHJpbmcgfCBudWxsO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFR1cm5SZXN1bHQge1xuICB0ZXh0OiBzdHJpbmc7XG4gIHVzYWdlOiBUb2tlblVzYWdlQnJlYWtkb3duO1xuICBkdXJhdGlvbk1zOiBudW1iZXI7XG4gIHR0ZnRNczogbnVtYmVyIHwgbnVsbDtcbiAgbW9kZWw6IHN0cmluZztcbiAgLy8g7J2066+47KeAIHR1cm4g7JeQ7ISc66eMIOyxhOybjOynkC4g7JmE7ISxIOydtOuvuOyngOqwgCDsl4bsnLzrqbQg67mIIOuwsOyXtC91bmRlZmluZWQuXG4gIGltYWdlcz86IFR1cm5JbWFnZVtdO1xuICAvLyDsnbTrr7jsp4AgdG9vbCDtmLjstpzsnbQg6rSA7Lih65CQ64qU7KeAKGl0ZW0vc3RhcnRlZCDrmJDripQgaGFzUmVzdWx0IOyeiOuKlCBjb21wbGV0ZWQpLlxuICAvLyDsnbTrr7jsp4AgMOqwnOydvCDrlYwg7J6s7Iuc64+EIOqwgOuKpSDsi6TtjKgoXCLsi5zrj4Qg7ZuEIOuvuOyZhOyEsVwiKeyZgCDsnqzsi5zrj4Qg66y07J21KFwidG9vbCDrr7jtmLjstpxcIinsnYQg6rWs67aELlxuICBpbWFnZUF0dGVtcHRlZD86IGJvb2xlYW47XG59XG5cbmV4cG9ydCB0eXBlIFN0cmVhbUNhbGxiYWNrcyA9IENvbW1vblN0cmVhbUNhbGxiYWNrczxUdXJuUmVzdWx0PjtcblxudHlwZSBSZWZyZXNoYWJsZVdvcmtlckNyZWRlbnRpYWxzID0gUGljazxXb3JrZXJDb25maWcsIFwiYWNjZXNzVG9rZW5cIiB8IFwiYWNjb3VudElkXCIgfCBcInBsYW5UeXBlXCI+O1xudHlwZSBBY3RpdmVUdXJuQWJvcnQgPSAoZXJyb3I6IEVycm9yKSA9PiB2b2lkO1xuXG4vLyB0aHJlYWQvc3RhcnQg6rO17Ya1IOyYteyFmFxuY29uc3QgVEhSRUFEX0RFRkFVTFRTID0ge1xuICBzYW5kYm94OiBcInJlYWQtb25seVwiLFxuICBhcHByb3ZhbFBvbGljeTogXCJuZXZlclwiLFxuICBjb25maWc6IHtcbiAgICBhcHBzOiB7IF9kZWZhdWx0OiB7IGVuYWJsZWQ6IGZhbHNlLCBkZXN0cnVjdGl2ZV9lbmFibGVkOiBmYWxzZSwgb3Blbl93b3JsZF9lbmFibGVkOiBmYWxzZSB9IH0sXG4gIH0sXG59IHNhdGlzZmllcyBQYXJ0aWFsPFRocmVhZFN0YXJ0UGFyYW1zPjtcblxuY29uc3QgQkFTRV9JTlNUUlVDVElPTlMgPVxuICBcIllvdSBhcmUgYSBoZWxwZnVsIGFzc2lzdGFudC4gRG8gbm90IHVzZSBhbnkgdG9vbHMgc3VjaCBhcyBzaGVsbCwgZmlsZSBvcGVyYXRpb25zLCBvciB3ZWIgc2VhcmNoLiBSZXNwb25kIHdpdGggdGV4dCBvbmx5LlwiO1xuXG4vLyDsnbTrr7jsp4Ag7IOd7ISxIHRocmVhZCDsoITsmqkgaW5zdHJ1Y3Rpb24uIOq4sOuzuCBCQVNFX0lOU1RSVUNUSU9OUyDsnZggXCJ0ZXh0IG9ubHlcIiDsp4Dsi5zqsIBcbi8vIOyLpOyniCDslrXsoJzquLDsnbTrr4DroZwoY29kZXggaW1hZ2VfZ2VuZXJhdGlvbiBmZWF0dXJlIOuKlCBkZWZhdWx0LW9uKSwg7J2066+47KeAIOuqqOuTnOyXkOyEnOuKlFxuLy8gaW1hZ2VfZ2VuZXJhdGlvbiB0b29sIOyCrOyaqeydhCDrqoXsi5zsoIHsnLzroZwg7ZeI7Jqp7ZWc64ukLiBzaGVsbC93ZWIg65OxIOuCmOuouOyngCB0b29sIOydgCDsl6zsoITtnogg6riI7KeALlxuY29uc3QgSU1BR0VfQkFTRV9JTlNUUlVDVElPTlMgPVxuICBcIllvdSBhcmUgYSBoZWxwZnVsIGFzc2lzdGFudC4gV2hlbiBhc2tlZCB0byBjcmVhdGUgYW4gaW1hZ2UsIHVzZSB0aGUgaW1hZ2VfZ2VuZXJhdGlvbiB0b29sIHRvIHByb2R1Y2UgaXQuIERvIG5vdCB1c2UgYW55IG90aGVyIHRvb2xzIHN1Y2ggYXMgc2hlbGwsIGZpbGUgb3BlcmF0aW9ucywgb3Igd2ViIHNlYXJjaC5cIjtcblxuZnVuY3Rpb24gaW1hZ2VCYXNlSW5zdHJ1Y3Rpb25zKG9wdGlvbnM6IEltYWdlR2VuZXJhdGlvbk9wdGlvbnMgfCB1bmRlZmluZWQpOiBzdHJpbmcge1xuICBjb25zdCByZXNvbHZlZCA9IHJlc29sdmVJbWFnZUdlbmVyYXRpb25PcHRpb25zKG9wdGlvbnMpO1xuICByZXR1cm4gYCR7SU1BR0VfQkFTRV9JTlNUUlVDVElPTlN9IFJlcXVlc3RlZCBpbWFnZSBvdXRwdXQ6IG1vZGVsICR7Q09ERVhfSU1BR0VfR0VORVJBVElPTl9NT0RFTH0sIHF1YWxpdHkgJHtyZXNvbHZlZC5xdWFsaXR5fSwgc2l6ZSAke3Jlc29sdmVkLnNpemV9LCBmb3JtYXQgcG5nLmA7XG59XG5cbi8vIOyLpOy4oeyDgSDsmYTro4wgaXRlbSDsnZggc3RhdHVzIOuKlCBcImdlbmVyYXRpbmdcIiDsnLzroZwg7JmA64+EIHJlc3VsdCDsl5Ag7JmE7ISxIGJhc2U2NCDqsIAg7Iuk66aw64ukLlxuLy8g65Sw65287IScIOyZhOyEsSDtjJDsoJXsnYAgc3RhdHVzIOusuOyekOyXtOydtCDslYTri4jrnbwgcmVzdWx0IOydmCDsnKDtmqjshLEo67mE7Ja07J6I7KeAIOyViuqzoCDtkZzspIAgYmFzZTY0IOyduOyngCnsnLzroZwg7ZWc64ukLlxuZnVuY3Rpb24gaXNDb21wbGV0ZWRJbWFnZVJlc3VsdChyZXN1bHQ6IHVua25vd24pOiByZXN1bHQgaXMgc3RyaW5nIHtcbiAgaWYgKHR5cGVvZiByZXN1bHQgIT09IFwic3RyaW5nXCIpIHJldHVybiBmYWxzZTtcbiAgY29uc3QgdHJpbW1lZCA9IHJlc3VsdC50cmltKCk7XG4gIGlmICh0cmltbWVkLmxlbmd0aCA9PT0gMCB8fCB0cmltbWVkLnN0YXJ0c1dpdGgoXCJkYXRhOlwiKSkgcmV0dXJuIGZhbHNlO1xuICBpZiAoIS9eW0EtWmEtejAtOSsvXSs9ezAsMn0kLy50ZXN0KHRyaW1tZWQpIHx8IHRyaW1tZWQubGVuZ3RoICUgNCAhPT0gMCkgcmV0dXJuIGZhbHNlO1xuICByZXR1cm4gdHJ1ZTtcbn1cblxuLy8gY29kZXjqsIAg66ekIOyalOyyreyXkCDsnpDrj5kg7KO87J6F7ZWY64qUIOuCtOyepSB0b29sKHNoZWxsL3dlYl9zZWFyY2gvc3Bhd25fYWdlbnQg65OxIDE06rCcKeqzvFxuLy8gaW5zdHJ1Y3Rpb24g67iU66GdKHBlcm1pc3Npb25zL2Vudmlyb25tZW50X2NvbnRleHQvc2tpbGxzLCB+MTBLQinsnYQg67mE7Zmc7ISx7ZmUXG4vLyAkQ09ERVhfSE9NRS9jb25maWcudG9tbCDroZwg7I2o64Sj7Jy866m0IGNvZGV4IOu2gO2MhSDsi5wgc2NhblxuLy8g7Ya17KCc67aI6rCAOiB1cGRhdGVfcGxhbi9yZXF1ZXN0X3VzZXJfaW5wdXRcbmV4cG9ydCBjb25zdCBDT0RFWF9DT05GSUdfVE9NTCA9IGB3ZWJfc2VhcmNoID0gXCJkaXNhYmxlZFwiXG5pbmNsdWRlX3Blcm1pc3Npb25zX2luc3RydWN0aW9ucyA9IGZhbHNlXG5pbmNsdWRlX2FwcHNfaW5zdHJ1Y3Rpb25zID0gZmFsc2VcbmluY2x1ZGVfZW52aXJvbm1lbnRfY29udGV4dCA9IGZhbHNlXG5cbltmZWF0dXJlc11cbnNoZWxsX3Rvb2wgPSBmYWxzZVxudG9vbF9zZWFyY2ggPSBmYWxzZVxudG9vbF9zdWdnZXN0ID0gZmFsc2Vcbm11bHRpX2FnZW50ID0gZmFsc2VcbmltYWdlX2dlbmVyYXRpb24gPSBmYWxzZVxuYXBwcyA9IGZhbHNlXG5wbHVnaW5zID0gZmFsc2VcblxuW3Rvb2xzXVxudmlld19pbWFnZSA9IGZhbHNlXG5cbltza2lsbHNdXG5pbmNsdWRlX2luc3RydWN0aW9ucyA9IGZhbHNlXG5cbltza2lsbHMuYnVuZGxlZF1cbmVuYWJsZWQgPSBmYWxzZVxuYDtcblxuLy8g4pSA4pSAIFdvcmtlciDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuZXhwb3J0IGNsYXNzIENvZGV4QXBwU2VydmVyV29ya2VyIHtcbiAgcHJpdmF0ZSBwcm9jOiBDaGlsZFByb2Nlc3MgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBycGM6IENvZGV4UnBjQ2xpZW50IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgY29kZXhIb21lOiBzdHJpbmc7XG4gIHByaXZhdGUgcmVzdGFydEF0dGVtcHRzID0gMDtcbiAgcHJpdmF0ZSByZWFkeSA9IGZhbHNlO1xuICBwcml2YXRlIGRlc3Ryb3llZCA9IGZhbHNlO1xuICBwcml2YXRlIGJ1c3kgPSBmYWxzZTtcbiAgcHJpdmF0ZSBhY3RpdmVUdXJuQWJvcnQ/OiBBY3RpdmVUdXJuQWJvcnQ7XG4gIGFjdGl2ZSA9IHRydWU7XG4gIG9uUmVhZHk/OiAoKSA9PiB2b2lkO1xuICAvLyByZXN0YXJ0IOyLnCBycGMg6rCd7LK06rCAIOyDiOuhnCDsg53shLHrkJjrr4DroZwsIO2VuOuTpOufrOulvCDrs7TqtIDtlojri6TqsIAg66ekIHNwYXdu66eI64ukIOyerOuwlOyduOuUqe2VnOuLpC5cbiAgc2VydmVyUmVxdWVzdEhhbmRsZXI/OiAobWV0aG9kOiBzdHJpbmcsIHBhcmFtczogdW5rbm93bikgPT4gUHJvbWlzZTx1bmtub3duPjtcblxuICAvLyB0aHJlYWQg7J6s7IKs7JqpKHByb21wdCBjYWNoZSk6IHdvcmtlciDqsIAg7IOd7ISx7ZWcIHRocmVhZCDrk6TsnZgg66mU7YOALlxuICAvLyBlcGhlbWVyYWwgdGhyZWFkIOuKlCDsnbQg7ZSE66Gc7IS47IqkIOuplOuqqOumrOyXkOunjCDsobTsnqztlZjrr4DroZwgcmVzdGFydCDsi5wg7KCE67aAIOustO2aqC5cbiAgcHJpdmF0ZSB0aHJlYWRNZXRhID0gbmV3IE1hcDxzdHJpbmcsIHsgbGFzdFVzZWRBdDogbnVtYmVyIH0+KCk7XG4gIC8vIHNwYXduIOy5tOyatO2EsC4gcmVzdGFydCDrp4jri6Qg7Kad6rCAIOKGkiBjb252IO2VuOuTpOydmCBlcG9jaCDsmYAg64yA7KGw7ZW0IHN0YWxlIHRocmVhZCDqsJDsp4AuXG4gIHByaXZhdGUgZXBvY2hDb3VudGVyID0gMDtcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgVEhSRUFEX0lETEVfVFRMX01TID0gMTAgKiA2MF8wMDA7XG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IE1BWF9USFJFQURTX1BFUl9XT1JLRVIgPSAxNjtcbiAgLy8g7J2066+47KeAIOqyjOydtO2KuCDqsoDspp3smqkg7LqQ7IucLiBzcGF3biDri6jsnITroZwg66y07Zqo7ZmUKHJlc3RhcnQg7IucIGNsZWFyKS5cbiAgLy8gY2FwYWJpbGl0eSDripQgcHJvdmlkZXIg64uo7JyEIGJvb2xlYW4sIOuqqOuNuCDrqYDti7Drqqjri6wg7Jes67aA64qUIG1vZGVsL2xpc3Qg66GcIO2ZleyduC5cbiAgcHJpdmF0ZSBjYWNoZWRDYXBhYmlsaXRpZXM/OiBNb2RlbFByb3ZpZGVyQ2FwYWJpbGl0aWVzUmVhZFJlc3BvbnNlO1xuICBwcml2YXRlIGNhY2hlZE1vZGVscz86IE1hcDxzdHJpbmcsIE1vZGVsPjtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGNvbmZpZzogV29ya2VyQ29uZmlnKSB7XG4gICAgY29uc3Qgc3VmZml4ID0gY29uZmlnLndvcmtlckluZGV4ICE9PSB1bmRlZmluZWQgPyBgLSR7Y29uZmlnLndvcmtlckluZGV4fWAgOiBcIlwiO1xuICAgIHRoaXMuY29kZXhIb21lID0gam9pbih0bXBkaXIoKSwgXCJxZ3JpZC1jb2RleFwiLCBgJHtjb25maWcudG9rZW5JZH0ke3N1ZmZpeH1gKTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBMaWZlY3ljbGUg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgcHJpdmF0ZSBhc3luYyBzcGF3bkFuZEluaXQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8g7IOIIGNvZGV4IO2UhOuhnOyEuOyKpCDihpIg6riw7KG0IGVwaGVtZXJhbCB0aHJlYWQg7KCE67aAIOustO2aqC4gZXBvY2gg7Kad6rCA66GcIHN0YWxlIOqwkOyngC5cbiAgICB0aGlzLmVwb2NoQ291bnRlcisrO1xuICAgIHRoaXMudGhyZWFkTWV0YS5jbGVhcigpO1xuICAgIC8vIOyDiCDtlITroZzshLjsiqQg4oaSIGNhcGFiaWxpdHkvbW9kZWwg7LqQ7IucIOustO2aqCjroZzqt7jsnbgg6rOE7KCVL+uyhOyghOydtCDrsJTrgIzsl4jsnYQg7IiYIOyeiOydjCkuXG4gICAgdGhpcy5jYWNoZWRDYXBhYmlsaXRpZXMgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5jYWNoZWRNb2RlbHMgPSB1bmRlZmluZWQ7XG4gICAgY29uc3QgY3dkID0gYCR7dGhpcy5jb2RleEhvbWV9L2N3ZGA7XG4gICAgcm1TeW5jKHRoaXMuY29kZXhIb21lLCB7IHJlY3Vyc2l2ZTogdHJ1ZSwgZm9yY2U6IHRydWUgfSk7XG4gICAgbWtkaXJTeW5jKGN3ZCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgLy8gY29kZXgg64K07J6lIHRvb2wvd2ViX3NlYXJjaC9pbnN0cnVjdGlvbiDruJTroZ0g67mE7Zmc7ISx7ZmUXG4gICAgd3JpdGVGaWxlU3luYyhgJHt0aGlzLmNvZGV4SG9tZX0vY29uZmlnLnRvbWxgLCBDT0RFWF9DT05GSUdfVE9NTCk7XG5cbiAgICB0aGlzLnByb2MgPSBzcGF3bihcImNvZGV4XCIsIFtcImFwcC1zZXJ2ZXJcIiwgXCItLWxpc3RlblwiLCBcInN0ZGlvOi8vXCJdLCB7XG4gICAgICBzdGRpbzogW1wicGlwZVwiLCBcInBpcGVcIiwgXCJwaXBlXCJdLFxuICAgICAgY3dkLFxuICAgICAgZW52OiB7XG4gICAgICAgIFBBVEg6IHByb2Nlc3MuZW52LlBBVEgsXG4gICAgICAgIFRNUERJUjogcHJvY2Vzcy5lbnYuVE1QRElSLFxuICAgICAgICBDT0RFWF9IT01FOiB0aGlzLmNvZGV4SG9tZSxcbiAgICAgICAgLy8gZW52aXJvbm1lbnQg67mE7Zmc7ISx7ZmUIOKGkiBoYXNfZW52aXJvbm1lbnQ9ZmFsc2Ug4oaSIHNoZWxsL2FwcGx5X3BhdGNoL3ZpZXdfaW1hZ2Ug7KCc6rGwXG4gICAgICAgIENPREVYX0VYRUNfU0VSVkVSX1VSTDogXCJub25lXCIsXG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgdGhpcy5wcm9jLm9uKFwiZXhpdFwiLCAoY29kZSkgPT4ge1xuICAgICAgbG9nZ2VyLmluZm8oYHdvcmtlciAke3RoaXMuY29uZmlnLnRva2VuTmFtZX0gZXhpdGVkIChjb2RlPSR7Y29kZX0pYCk7XG4gICAgICB0aGlzLmZhaWxBY3RpdmVUdXJuKFxuICAgICAgICBuZXcgRXJyb3IoYGNvZGV4IHdvcmtlciBleGl0ZWQgd2hpbGUgdHVybiB3YXMgcnVubmluZyAoY29kZT0ke2NvZGUgPz8gXCJ1bmtub3duXCJ9KWApLFxuICAgICAgKTtcbiAgICAgIHRoaXMucmVhZHkgPSBmYWxzZTtcbiAgICAgIHRoaXMucnBjID0gbnVsbDtcbiAgICAgIHRoaXMucHJvYyA9IG51bGw7XG4gICAgICBpZiAoIXRoaXMuZGVzdHJveWVkKSB0aGlzLnNjaGVkdWxlUmVzdGFydCgpO1xuICAgIH0pO1xuXG4gICAgdGhpcy5ycGMgPSBuZXcgQ29kZXhScGNDbGllbnQodGhpcy5wcm9jKTtcbiAgICAvLyByZXN0YXJ0IO2bhOyXkOuPhCByZWZyZXNoIHNlcnZlci1yZXF1ZXN0IO2VuOuTpOufrOulvCDsnKDsp4AgKOyXhuycvOuptCBjb2RleCDthqDtgbAg7ZqM7KCEIOyLpO2MqCDihpIgc2Vzc2lvbiBleHBpcmVkKVxuICAgIHRoaXMuYmluZFNlcnZlclJlcXVlc3RIYW5kbGVyKCk7XG5cbiAgICBhd2FpdCB0aGlzLnJwYy5yZXF1ZXN0KFwiaW5pdGlhbGl6ZVwiLCB7XG4gICAgICBjbGllbnRJbmZvOiB7IG5hbWU6IFwicWdyaWRcIiwgdmVyc2lvbjogXCIxLjAuMFwiIH0sXG4gICAgICBjYXBhYmlsaXRpZXM6IHsgZXhwZXJpbWVudGFsQXBpOiB0cnVlIH0sXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHdhaXRGb3JMb2dpbkNvbXBsZXRlZCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgY29uc3QgdGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4gcmVqZWN0KG5ldyBFcnJvcihcImxvZ2luIHRpbWVvdXRcIikpLCAxMjBfMDAwKTtcbiAgICAgIHRoaXMucnBjIS5vbk5vdGlmaWNhdGlvbihcImFjY291bnQvbG9naW4vY29tcGxldGVkXCIsIChwKSA9PiB7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0KTtcbiAgICAgICAgaWYgKHAuc3VjY2VzcykgcmVzb2x2ZSgpO1xuICAgICAgICBlbHNlIHJlamVjdChuZXcgRXJyb3IoYGxvZ2luIGZhaWxlZDogJHtwLmVycm9yID8/IFwidW5rbm93blwifWApKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgaW5pdGlhbGl6ZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLnNwYXduQW5kSW5pdCgpO1xuXG4gICAgYXdhaXQgdGhpcy5ycGMhLnJlcXVlc3QoXCJhY2NvdW50L2xvZ2luL3N0YXJ0XCIsIHtcbiAgICAgIHR5cGU6IFwiY2hhdGdwdEF1dGhUb2tlbnNcIixcbiAgICAgIGFjY2Vzc1Rva2VuOiB0aGlzLmNvbmZpZy5hY2Nlc3NUb2tlbixcbiAgICAgIGNoYXRncHRBY2NvdW50SWQ6IHRoaXMuY29uZmlnLmFjY291bnRJZCxcbiAgICAgIC4uLih0aGlzLmNvbmZpZy5wbGFuVHlwZSA/IHsgY2hhdGdwdFBsYW5UeXBlOiB0aGlzLmNvbmZpZy5wbGFuVHlwZSB9IDoge30pLFxuICAgIH0pO1xuXG4gICAgYXdhaXQgdGhpcy53YWl0Rm9yTG9naW5Db21wbGV0ZWQoKTtcbiAgICB0aGlzLnJlYWR5ID0gdHJ1ZTtcbiAgICB0aGlzLnJlc3RhcnRBdHRlbXB0cyA9IDA7XG4gIH1cblxuICBhc3luYyBzdGFydEJyb3dzZXJMb2dpbigpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGF3YWl0IHRoaXMuc3Bhd25BbmRJbml0KCk7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5ycGMhLnJlcXVlc3Q8eyBhdXRoVXJsOiBzdHJpbmcgfT4oXCJhY2NvdW50L2xvZ2luL3N0YXJ0XCIsIHtcbiAgICAgIHR5cGU6IFwiY2hhdGdwdFwiLFxuICAgIH0pO1xuICAgIGxvZ2dlci5pbmZvKGB3b3JrZXIgJHt0aGlzLmNvbmZpZy50b2tlbk5hbWV9IGJyb3dzZXIgbG9naW4gc3RhcnRlZGApO1xuICAgIHJldHVybiByZXN1bHQuYXV0aFVybDtcbiAgfVxuXG4gIGFzeW5jIHdhaXRGb3JCcm93c2VyTG9naW5Db21wbGV0ZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLndhaXRGb3JMb2dpbkNvbXBsZXRlZCgpO1xuICAgIHRoaXMucmVhZHkgPSB0cnVlO1xuICAgIHRoaXMucmVzdGFydEF0dGVtcHRzID0gMDtcbiAgICBsb2dnZXIuaW5mbyhgd29ya2VyICR7dGhpcy5jb25maWcudG9rZW5OYW1lfSBicm93c2VyIGxvZ2luIGNvbXBsZXRlZGApO1xuICB9XG5cbiAgYXN5bmMgcmVhZE1hbmFnZWRDcmVkZW50aWFscygpOiBQcm9taXNlPHtcbiAgICBhY2Nlc3NUb2tlbjogc3RyaW5nO1xuICAgIHJlZnJlc2hUb2tlbjogc3RyaW5nO1xuICAgIGlkVG9rZW4/OiBzdHJpbmc7XG4gICAgYWNjb3VudElkOiBzdHJpbmc7XG4gIH0gfCBudWxsPiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJhdyA9IEpTT04ucGFyc2UocmVhZEZpbGVTeW5jKGAke3RoaXMuY29kZXhIb21lfS9hdXRoLmpzb25gLCBcInV0Zi04XCIpKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGFjY2Vzc1Rva2VuOiByYXcudG9rZW5zPy5hY2Nlc3NfdG9rZW4gPz8gXCJcIixcbiAgICAgICAgcmVmcmVzaFRva2VuOiByYXcudG9rZW5zPy5yZWZyZXNoX3Rva2VuID8/IFwiXCIsXG4gICAgICAgIGlkVG9rZW46IHJhdy50b2tlbnM/LmlkX3Rva2VuLFxuICAgICAgICBhY2NvdW50SWQ6IHJhdy50b2tlbnM/LmFjY291bnRfaWQgPz8gXCJcIixcbiAgICAgIH07XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICBhc3luYyBraWxsKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuZGVzdHJveWVkID0gdHJ1ZTtcbiAgICB0aGlzLnJlYWR5ID0gZmFsc2U7XG4gICAgdGhpcy5mYWlsQWN0aXZlVHVybihuZXcgRXJyb3IoXCJjb2RleCB3b3JrZXIgc3RvcHBlZFwiKSk7XG4gICAgdGhpcy5ycGM/LmRlc3Ryb3koKTtcblxuICAgIGlmICh0aGlzLnByb2MpIHtcbiAgICAgIHRoaXMucHJvYy5raWxsKFwiU0lHVEVSTVwiKTtcbiAgICAgIGF3YWl0IG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlKSA9PiB7XG4gICAgICAgIGNvbnN0IHRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5wcm9jPy5raWxsKFwiU0lHS0lMTFwiKTtcbiAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgIH0sIDNfMDAwKTtcbiAgICAgICAgdGhpcy5wcm9jIS5vbihcImV4aXRcIiwgKCkgPT4ge1xuICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lcik7XG4gICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBybVN5bmModGhpcy5jb2RleEhvbWUsIHsgcmVjdXJzaXZlOiB0cnVlLCBmb3JjZTogdHJ1ZSB9KTtcbiAgICB9IGNhdGNoIHt9XG4gIH1cblxuICBnZXQgaXNSZWFkeSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5yZWFkeSAmJiAhdGhpcy5kZXN0cm95ZWQ7XG4gIH1cbiAgZ2V0IGlzRGVzdHJveWVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmRlc3Ryb3llZDtcbiAgfVxuICBnZXQgdG9rZW5JZCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmNvbmZpZy50b2tlbklkO1xuICB9XG4gIGdldCB3b3JrZXJJbmRleCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmNvbmZpZy53b3JrZXJJbmRleCA/PyAwO1xuICB9XG4gIGdldCB0b2tlbk5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5jb25maWcudG9rZW5OYW1lO1xuICB9XG5cbiAgY2FuUmV1c2VGb3JUb2tlbihfdG9rZW5OYW1lOiBzdHJpbmcsIGNyZWRlbnRpYWxzOiBSZWZyZXNoYWJsZVdvcmtlckNyZWRlbnRpYWxzKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMuY29uZmlnLmFjY291bnRJZCA9PT0gY3JlZGVudGlhbHMuYWNjb3VudElkICYmXG4gICAgICAodGhpcy5jb25maWcucGxhblR5cGUgPz8gdW5kZWZpbmVkKSA9PT0gKGNyZWRlbnRpYWxzLnBsYW5UeXBlID8/IHVuZGVmaW5lZClcbiAgICApO1xuICB9XG5cbiAgdXBkYXRlVG9rZW5TdGF0ZSh0b2tlbk5hbWU6IHN0cmluZywgY3JlZGVudGlhbHM6IFJlZnJlc2hhYmxlV29ya2VyQ3JlZGVudGlhbHMpOiB2b2lkIHtcbiAgICB0aGlzLmNvbmZpZy50b2tlbk5hbWUgPSB0b2tlbk5hbWU7XG4gICAgdGhpcy5jb25maWcuYWNjZXNzVG9rZW4gPSBjcmVkZW50aWFscy5hY2Nlc3NUb2tlbjtcbiAgICB0aGlzLmNvbmZpZy5hY2NvdW50SWQgPSBjcmVkZW50aWFscy5hY2NvdW50SWQ7XG4gICAgaWYgKGNyZWRlbnRpYWxzLnBsYW5UeXBlKSB7XG4gICAgICB0aGlzLmNvbmZpZy5wbGFuVHlwZSA9IGNyZWRlbnRpYWxzLnBsYW5UeXBlO1xuICAgIH0gZWxzZSB7XG4gICAgICBkZWxldGUgdGhpcy5jb25maWcucGxhblR5cGU7XG4gICAgfVxuICB9XG5cbiAgLy8g4pSA4pSAIFJhdGUgbGltaXRzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIGFzeW5jIGdldFJhdGVMaW1pdHMoKTogUHJvbWlzZTx1bmtub3duPiB7XG4gICAgaWYgKCF0aGlzLnJwYyB8fCAhdGhpcy5yZWFkeSkgdGhyb3cgbmV3IEVycm9yKFwid29ya2VyIG5vdCByZWFkeVwiKTtcbiAgICByZXR1cm4gdGhpcy5ycGMucmVxdWVzdChcImFjY291bnQvcmF0ZUxpbWl0cy9yZWFkXCIsIHt9KTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBJbWFnZSBnZW5lcmF0aW9uIGdhdGUg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gIC8vIOydtOuvuOyngCB0b29sIOydgCBjb2RleCDsl5DshJwgKEF1dGhNb2RlOjpDaGF0Z3B0KSBBTkQgKGltYWdlX2dlbmVyYXRpb24gZmVhdHVyZSlcbiAgLy8gQU5EICjrqqjrjbgg66mA7Yuw66qo64usKSAz7KSRIOqyjOydtO2KuOuLpC4gcWdyaWQg64qUIE9BdXRoIOyghOyaqeydtOqzoCBmZWF0dXJlIOuKlCB0aHJlYWQg7JeQ7IScXG4gIC8vIOy8nOuvgOuhnCwgZGlzcGF0Y2hlciDqsIAg7IKs7KCEIOqygOymne2VoCDrgqjsnYAg7KGw6rG07J2AIGNhcGFiaWxpdHkocHJvdmlkZXIpICsg66qo6424IOupgO2LsOuqqOuLrOydtOuLpC5cblxuICBwcml2YXRlIGFzeW5jIGxvYWRDYXBhYmlsaXRpZXMoKTogUHJvbWlzZTxNb2RlbFByb3ZpZGVyQ2FwYWJpbGl0aWVzUmVhZFJlc3BvbnNlPiB7XG4gICAgaWYgKCF0aGlzLnJwYyB8fCAhdGhpcy5yZWFkeSkgdGhyb3cgbmV3IEVycm9yKFwid29ya2VyIG5vdCByZWFkeVwiKTtcbiAgICBpZiAoIXRoaXMuY2FjaGVkQ2FwYWJpbGl0aWVzKSB7XG4gICAgICB0aGlzLmNhY2hlZENhcGFiaWxpdGllcyA9IGF3YWl0IHRoaXMucnBjLnJlcXVlc3Q8TW9kZWxQcm92aWRlckNhcGFiaWxpdGllc1JlYWRSZXNwb25zZT4oXG4gICAgICAgIFwibW9kZWxQcm92aWRlci9jYXBhYmlsaXRpZXMvcmVhZFwiLFxuICAgICAgICB7fSxcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmNhY2hlZENhcGFiaWxpdGllcztcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgbG9hZE1vZGVscygpOiBQcm9taXNlPE1hcDxzdHJpbmcsIE1vZGVsPj4ge1xuICAgIGlmICghdGhpcy5ycGMgfHwgIXRoaXMucmVhZHkpIHRocm93IG5ldyBFcnJvcihcIndvcmtlciBub3QgcmVhZHlcIik7XG4gICAgaWYgKCF0aGlzLmNhY2hlZE1vZGVscykge1xuICAgICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy5ycGMucmVxdWVzdDxNb2RlbExpc3RSZXNwb25zZT4oXCJtb2RlbC9saXN0XCIsIHt9KTtcbiAgICAgIHRoaXMuY2FjaGVkTW9kZWxzID0gbmV3IE1hcChyZXMuZGF0YS5tYXAoKG0pID0+IFttLm1vZGVsLCBtXSkpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5jYWNoZWRNb2RlbHM7XG4gIH1cblxuICAvLyDso7zslrTsp4Qg66qo6424KOuvuOyngOygleydtOuptCB0aHJlYWQg6riw67O4IOuqqOuNuCnroZwg7J2066+47KeAIOyDneyEseydtCDqsIDriqXtlZzsp4Ag6rKA7KadLlxuICAvLyDrtojqsIAg7IKs7Jyg66W8IOusuOyekOyXtOuhnCDrsJjtmZjtlZjqs6AsIOqwgOuKpe2VmOuptCBudWxsIOydhCDrsJjtmZjtlZzri6QuXG4gIGFzeW5jIGNoZWNrSW1hZ2VHZW5lcmF0aW9uU3VwcG9ydChtb2RlbD86IHN0cmluZyk6IFByb21pc2U8c3RyaW5nIHwgbnVsbD4ge1xuICAgIGlmICghdGhpcy5ycGMgfHwgIXRoaXMucmVhZHkpIHJldHVybiBcIndvcmtlciBub3QgcmVhZHlcIjtcbiAgICBjb25zdCBjYXBzID0gYXdhaXQgdGhpcy5sb2FkQ2FwYWJpbGl0aWVzKCk7XG4gICAgaWYgKCFjYXBzLmltYWdlR2VuZXJhdGlvbikgcmV0dXJuIFwicHJvdmlkZXIgZG9lcyBub3Qgc3VwcG9ydCBpbWFnZSBnZW5lcmF0aW9uXCI7XG4gICAgLy8g66qo6424IOupgO2LsOuqqOuLrCDqsoDspp0uIG1vZGVsIOuvuOyngOygleydtOuptCBwcm92aWRlciBjYXBhYmlsaXR5IOunjOycvOuhnCDthrXqs7zsi5ztgqTqs6AsXG4gICAgLy8g7Iuk7KCcIOyggeyaqSDrqqjrjbjsnZgg66mA7Yuw66qo64usIOyXrOu2gOuKlCB0dXJuIOyLpO2WiSDqsrDqs7wo7J2066+47KeAIDDqsJwg4oaSIFUzIOyLpO2MqCDrtoTrpZgp6rCAIOyeoeuKlOuLpC5cbiAgICBpZiAobW9kZWwpIHtcbiAgICAgIGNvbnN0IG1vZGVscyA9IGF3YWl0IHRoaXMubG9hZE1vZGVscygpO1xuICAgICAgY29uc3QgaW5mbyA9IG1vZGVscy5nZXQobW9kZWwpO1xuICAgICAgaWYgKGluZm8gJiYgIWluZm8uaW5wdXRNb2RhbGl0aWVzLmluY2x1ZGVzKFwiaW1hZ2VcIikpIHtcbiAgICAgICAgcmV0dXJuIGBtb2RlbCAke21vZGVsfSBpcyBub3QgbXVsdGltb2RhbCAobm8gaW1hZ2UgaW5wdXQgbW9kYWxpdHkpYDtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvLyDilIDilIAgU2VydmVyLXJlcXVlc3QgZGVsZWdhdGlvbiDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICBzZXRTZXJ2ZXJSZXF1ZXN0SGFuZGxlcihoYW5kbGVyOiAobWV0aG9kOiBzdHJpbmcsIHBhcmFtczogdW5rbm93bikgPT4gUHJvbWlzZTx1bmtub3duPik6IHZvaWQge1xuICAgIHRoaXMuc2VydmVyUmVxdWVzdEhhbmRsZXIgPSBoYW5kbGVyO1xuICAgIHRoaXMuYmluZFNlcnZlclJlcXVlc3RIYW5kbGVyKCk7XG4gIH1cblxuICAvLyBzcGF3bkFuZEluaXTsl5DshJwgcnBjIOyDneyEsSDsp4Htm4Qg7Zi47LacLiByZXN0YXJ066GcIHJwY+qwgCDsg4jroZwg66eM65Ok7Ja07KC464+EIO2VuOuTpOufrOqwgCDsnKDsp4DrkJzri6QuXG4gIGJpbmRTZXJ2ZXJSZXF1ZXN0SGFuZGxlcigpOiB2b2lkIHtcbiAgICBjb25zdCBoYW5kbGVyID0gdGhpcy5zZXJ2ZXJSZXF1ZXN0SGFuZGxlcjtcbiAgICBpZiAoIWhhbmRsZXIpIHJldHVybjtcbiAgICB0aGlzLnJwYz8ub25TZXJ2ZXJSZXF1ZXN0KFwiYWNjb3VudC9jaGF0Z3B0QXV0aFRva2Vucy9yZWZyZXNoXCIsIChwYXJhbXMpID0+XG4gICAgICBoYW5kbGVyKFwiYWNjb3VudC9jaGF0Z3B0QXV0aFRva2Vucy9yZWZyZXNoXCIsIHBhcmFtcyksXG4gICAgKTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBUdXJuIGV4ZWN1dGlvbiDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICB0cnlBY3F1aXJlVHVybigpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5idXN5KSByZXR1cm4gZmFsc2U7XG4gICAgdGhpcy5idXN5ID0gdHJ1ZTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICByZWxlYXNlVHVybigpOiB2b2lkIHtcbiAgICB0aGlzLmJ1c3kgPSBmYWxzZTtcbiAgfVxuICBnZXQgaGFzQ2FwYWNpdHkoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICF0aGlzLmJ1c3k7XG4gIH1cblxuICAvLyDsg4ggdGhyZWFkIOyDneyEsSAodGhyZWFkL3N0YXJ0ICsg7ZWE7JqUIOyLnCBoaXN0b3J5IGluamVjdCkuIOyyqyB0dXJuIC8g7Y+067CxIOqyveuhnOyaqS5cbiAgLy8g7ZuE7IaNIHR1cm4g7J2AIGNyZWF0ZVRocmVhZCDsl4bsnbQgc3RhcnRUdXJuT25UaHJlYWQg66eMIO2YuOy2nO2VtCBjb252ZXJzYXRpb25faWQg66W8IOqzoOygle2VnOuLpC5cbiAgLy8gdGhyZWFkIOydmCDquLDrs7ggbW9kZWwg64+EIOuwmO2ZmCAocmVxLm1vZGVsIOuvuOyngOyglSDsi5wgZmFsbGJhY2spLlxuICBhc3luYyBjcmVhdGVUaHJlYWQocmVxOiBUdXJuUmVxdWVzdCk6IFByb21pc2U8eyB0aHJlYWRJZDogc3RyaW5nOyBtb2RlbDogc3RyaW5nIH0+IHtcbiAgICBpZiAoIXRoaXMucnBjIHx8ICF0aGlzLnJlYWR5KSB0aHJvdyBuZXcgRXJyb3IoXCJ3b3JrZXIgbm90IHJlYWR5XCIpO1xuICAgIHRoaXMuc3dlZXBJZGxlVGhyZWFkcygpO1xuXG4gICAgY29uc3QgdGhyZWFkQ29uZmlnOiBUaHJlYWRTdGFydFBhcmFtc1tcImNvbmZpZ1wiXSA9IHtcbiAgICAgIC4uLlRIUkVBRF9ERUZBVUxUUy5jb25maWcsXG4gICAgICAuLi4ocmVxLnZlcmJvc2l0eSA/IHsgbW9kZWxfdmVyYm9zaXR5OiByZXEudmVyYm9zaXR5IH0gOiB7fSksXG4gICAgICAvLyDsnbTrr7jsp4Ag66qo65OcOiB0aHJlYWQg64uo7JyE66Gc66eMIGltYWdlX2dlbmVyYXRpb24gZmVhdHVyZSDrpbwg7Lyg64ukLlxuICAgICAgLy8g7KCE7JetIGNvbmZpZy50b21sIOydgCBpbWFnZV9nZW5lcmF0aW9uPWZhbHNlIOycoOyngCjthY3siqTtirggdGhyZWFkIOydtOykkSDssKjri6gpLFxuICAgICAgLy8gZG90dGVkIENMSS3siqTtg4Dsnbwgb3ZlcnJpZGUg7YKk66GcIOydtCB0aHJlYWQg7JeQ7ISc66eMIO2ZnOyEse2ZlCjsi6TsuKEg7ZmV7J24KS5cbiAgICAgIC4uLihyZXEuaW1hZ2VHZW5lcmF0aW9uID8geyBcImZlYXR1cmVzLmltYWdlX2dlbmVyYXRpb25cIjogdHJ1ZSB9IDoge30pLFxuICAgIH07XG4gICAgY29uc3QgeyB0aHJlYWQsIG1vZGVsOiB0aHJlYWRNb2RlbCB9ID0gYXdhaXQgdGhpcy5ycGMucmVxdWVzdDxUaHJlYWRTdGFydFJlc3BvbnNlPihcbiAgICAgIFwidGhyZWFkL3N0YXJ0XCIsXG4gICAgICB7XG4gICAgICAgIGVwaGVtZXJhbDogdHJ1ZSxcbiAgICAgICAgY3dkOiBgJHt0aGlzLmNvZGV4SG9tZX0vY3dkYCxcbiAgICAgICAgYmFzZUluc3RydWN0aW9uczogcmVxLmltYWdlR2VuZXJhdGlvblxuICAgICAgICAgID8gaW1hZ2VCYXNlSW5zdHJ1Y3Rpb25zKHJlcS5pbWFnZUdlbmVyYXRpb25PcHRpb25zKVxuICAgICAgICAgIDogQkFTRV9JTlNUUlVDVElPTlMsXG4gICAgICAgIGRldmVsb3Blckluc3RydWN0aW9uczogcmVxLmRldmVsb3Blckluc3RydWN0aW9ucyA/PyBcIlwiLFxuICAgICAgICBzYW5kYm94OiBUSFJFQURfREVGQVVMVFMuc2FuZGJveCxcbiAgICAgICAgYXBwcm92YWxQb2xpY3k6IFRIUkVBRF9ERUZBVUxUUy5hcHByb3ZhbFBvbGljeSxcbiAgICAgICAgY29uZmlnOiB0aHJlYWRDb25maWcsXG4gICAgICB9IHNhdGlzZmllcyBQYXJ0aWFsPFRocmVhZFN0YXJ0UGFyYW1zPixcbiAgICApO1xuXG4gICAgY29uc3QgdGhyZWFkSWQgPSB0aHJlYWQuaWQ7XG4gICAgaWYgKHJlcS5oaXN0b3J5Py5sZW5ndGgpIHtcbiAgICAgIGF3YWl0IHRoaXMucnBjLnJlcXVlc3QoXCJ0aHJlYWQvaW5qZWN0X2l0ZW1zXCIsIHtcbiAgICAgICAgdGhyZWFkSWQsXG4gICAgICAgIGl0ZW1zOiByZXEuaGlzdG9yeSxcbiAgICAgIH0gc2F0aXNmaWVzIFRocmVhZEluamVjdEl0ZW1zUGFyYW1zKTtcbiAgICB9XG4gICAgLy8g7J2066+47KeAIHR1cm4g7J2AIOyerOyCrOyaqeyXkOyEnCDsoJzsmbgoUjgpOiBiYXNlNjQg6rCAIHRocmVhZCDrqZTrqqjrpqzCt+y6kOyLnCBwcmVmaXgg7JeQXG4gICAgLy8g7IOB7KO87ZWY64qUIOqyg+ydhCDrp4nqs6AsIOydtOuvuOyngCB0aHJlYWQg66W8IDEg7ZqM7Jqp7Jy866GcIOuRlOuLpC4gdGhyZWFkTWV0YSDrr7jrk7HroZ0g4oaSXG4gICAgLy8g7ZuE7IaNIHJldXNlIOyhsO2ajOyXkOyEnCDsnbQgdGhyZWFkIOuKlCDtm4Trs7TqsIAg65CY7KeAIOyViuuKlOuLpC5cbiAgICBpZiAoIXJlcS5pbWFnZUdlbmVyYXRpb24pIHtcbiAgICAgIHRoaXMudGhyZWFkTWV0YS5zZXQodGhyZWFkSWQsIHsgbGFzdFVzZWRBdDogRGF0ZS5ub3coKSB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4geyB0aHJlYWRJZCwgbW9kZWw6IHJlcS5tb2RlbCA/PyB0aHJlYWRNb2RlbCB9O1xuICB9XG5cbiAgLy8g6riw7KG0IHRocmVhZCDsl5AgdHVybiDrp4wg7Iuk7ZaJIChpbmplY3Qg7JeG7J2MKS4gY29udmVyc2F0aW9uX2lkIOycoOyngCDihpIgcHJvbXB0IGNhY2hlIOyggeykkS5cbiAgcHJpdmF0ZSBhc3luYyBzdGFydFR1cm5PblRocmVhZCh0aHJlYWRJZDogc3RyaW5nLCByZXE6IFR1cm5SZXF1ZXN0KTogUHJvbWlzZTx7IHR1cm5JZDogc3RyaW5nIH0+IHtcbiAgICBpZiAoIXRoaXMucnBjIHx8ICF0aGlzLnJlYWR5KSB0aHJvdyBuZXcgRXJyb3IoXCJ3b3JrZXIgbm90IHJlYWR5XCIpO1xuXG4gICAgY29uc3QgeyB0dXJuIH0gPSBhd2FpdCB0aGlzLnJwYy5yZXF1ZXN0PFR1cm5TdGFydFJlc3BvbnNlPihcInR1cm4vc3RhcnRcIiwge1xuICAgICAgdGhyZWFkSWQsXG4gICAgICBpbnB1dDogcmVxLmlucHV0LFxuICAgICAgLi4uKHJlcS5vdXRwdXRTY2hlbWEgPyB7IG91dHB1dFNjaGVtYTogcmVxLm91dHB1dFNjaGVtYSB9IDoge30pLFxuICAgICAgLi4uKHJlcS5lZmZvcnQgPyB7IGVmZm9ydDogcmVxLmVmZm9ydCB9IDoge30pLFxuICAgICAgLi4uKHJlcS5tb2RlbCA/IHsgbW9kZWw6IHJlcS5tb2RlbCB9IDoge30pLFxuICAgICAgLi4uKHJlcS5yZWFzb25pbmdTdW1tYXJ5ID8geyBzdW1tYXJ5OiByZXEucmVhc29uaW5nU3VtbWFyeSB9IDoge30pLFxuICAgICAgLi4uKHJlcS5zZXJ2aWNlVGllciA/IHsgc2VydmljZVRpZXI6IHJlcS5zZXJ2aWNlVGllciB9IDoge30pLFxuICAgIH0pO1xuICAgIGNvbnN0IG1ldGEgPSB0aGlzLnRocmVhZE1ldGEuZ2V0KHRocmVhZElkKTtcbiAgICBpZiAobWV0YSkgbWV0YS5sYXN0VXNlZEF0ID0gRGF0ZS5ub3coKTtcbiAgICByZXR1cm4geyB0dXJuSWQ6IHR1cm4uaWQgfTtcbiAgfVxuXG4gIC8vIGV4aXN0aW5nVGhyZWFkSWQg7J6I7Jy866m0IOq3uCB0aHJlYWQg7J6s7IKs7JqpKO2bhOyGjSB0dXJuKSwg7JeG7Jy866m0IOyDiCB0aHJlYWQg7IOd7ISxKOyyqyB0dXJuKS5cbiAgLy8g7Zi47LacIO2bhCDsgqzsmqntlZwgdGhyZWFkSWQg66W8IOuwmO2ZmO2VtCBkaXNwYXRjaGVyIOqwgCBjb252IO2VuOuTpOydhCDrsJzquIntlZzri6QuXG4gIGFzeW5jIGV4ZWN1dGVUdXJuKFxuICAgIHJlcTogVHVyblJlcXVlc3QsXG4gICAgZXhpc3RpbmdUaHJlYWRJZD86IHN0cmluZyxcbiAgKTogUHJvbWlzZTxUdXJuUmVzdWx0ICYgeyB0aHJlYWRJZDogc3RyaW5nIH0+IHtcbiAgICBsZXQgdGhyZWFkSWQ6IHN0cmluZztcbiAgICBsZXQgbW9kZWw6IHN0cmluZztcbiAgICBpZiAoZXhpc3RpbmdUaHJlYWRJZCkge1xuICAgICAgdGhyZWFkSWQgPSBleGlzdGluZ1RocmVhZElkO1xuICAgICAgbW9kZWwgPSByZXEubW9kZWwgPz8gXCJcIjtcbiAgICB9IGVsc2Uge1xuICAgICAgKHsgdGhyZWFkSWQsIG1vZGVsIH0gPSBhd2FpdCB0aGlzLmNyZWF0ZVRocmVhZChyZXEpKTtcbiAgICB9XG4gICAgY29uc3QgdHRmdFRyYWNrZXIgPSBjcmVhdGVUdGZ0VHJhY2tlcigpO1xuICAgIGNvbnN0IHJlc3VsdFByb21pc2UgPSB0aGlzLmNvbnN1bWVUdXJuTm90aWZpY2F0aW9ucyh0aHJlYWRJZCwgbW9kZWwsIHR0ZnRUcmFja2VyKTtcbiAgICB0cnkge1xuICAgICAgdHRmdFRyYWNrZXIubWFya1N0YXJ0KCk7XG4gICAgICBhd2FpdCB0aGlzLnN0YXJ0VHVybk9uVGhyZWFkKHRocmVhZElkLCByZXEpO1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcmVzdWx0UHJvbWlzZTtcbiAgICAgIHJldHVybiB7IC4uLnJlc3VsdCwgdGhyZWFkSWQgfTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aGlzLmZhaWxBY3RpdmVUdXJuKGUgYXMgRXJyb3IpO1xuICAgICAgYXdhaXQgcmVzdWx0UHJvbWlzZS5jYXRjaCgoKSA9PiB7fSk7XG4gICAgICB0aHJvdyBlO1xuICAgIH0gZmluYWxseSB7XG4gICAgICAvLyDsnbTrr7jsp4AgdGhyZWFkIOuKlCAxIO2ajOyaqSBjb2xkIHRocmVhZCDsnbjrjbAgdGhyZWFkTWV0YSDsl5Ag65Ox66Gd65CY7KeAIOyViuyVhFxuICAgICAgLy8gc3dlZXAg7J20IOuquyDsnqHripTri6QuIE1CIOq4iSBiYXNlNjQg6rCAIOyDgeyjvO2VmOuvgOuhnCB0dXJuIOyiheujjCDsponsi5wo7ISx6rO1L+yLpO2MqFxuICAgICAgLy8g67aI66y4KSDqtazrj4XsnYQg64GK7Ja0IGNvZGV4IDMw67aEIOyWuOuhnOuTnCDrjIDsg4HsnLzroZwg66eM65Og64ukLlxuICAgICAgaWYgKHJlcS5pbWFnZUdlbmVyYXRpb24pIHRoaXMudW5zdWJzY3JpYmVUaHJlYWQodGhyZWFkSWQpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGV4ZWN1dGVUdXJuU3RyZWFtKFxuICAgIHJlcTogVHVyblJlcXVlc3QsXG4gICAgY2I6IFN0cmVhbUNhbGxiYWNrcyxcbiAgICBleGlzdGluZ1RocmVhZElkPzogc3RyaW5nLFxuICApOiBQcm9taXNlPHsgdGhyZWFkSWQ6IHN0cmluZyB9PiB7XG4gICAgbGV0IHRocmVhZElkOiBzdHJpbmc7XG4gICAgbGV0IG1vZGVsOiBzdHJpbmc7XG4gICAgaWYgKGV4aXN0aW5nVGhyZWFkSWQpIHtcbiAgICAgIHRocmVhZElkID0gZXhpc3RpbmdUaHJlYWRJZDtcbiAgICAgIG1vZGVsID0gcmVxLm1vZGVsID8/IFwiXCI7XG4gICAgfSBlbHNlIHtcbiAgICAgICh7IHRocmVhZElkLCBtb2RlbCB9ID0gYXdhaXQgdGhpcy5jcmVhdGVUaHJlYWQocmVxKSk7XG4gICAgfVxuICAgIGNiLm9uVGhyZWFkSWQ/Lih0aHJlYWRJZCk7XG4gICAgY29uc3QgdHRmdFRyYWNrZXIgPSBjcmVhdGVUdGZ0VHJhY2tlcigpO1xuICAgIGNvbnN0IHJlc3VsdFByb21pc2UgPSB0aGlzLmNvbnN1bWVTdHJlYW1Ob3RpZmljYXRpb25zKHRocmVhZElkLCBtb2RlbCwgY2IsIHR0ZnRUcmFja2VyKTtcbiAgICBsZXQgdHVybklkOiBzdHJpbmc7XG4gICAgdHJ5IHtcbiAgICAgIHR0ZnRUcmFja2VyLm1hcmtTdGFydCgpO1xuICAgICAgKHsgdHVybklkIH0gPSBhd2FpdCB0aGlzLnN0YXJ0VHVybk9uVGhyZWFkKHRocmVhZElkLCByZXEpKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aGlzLmZhaWxBY3RpdmVUdXJuKGUgYXMgRXJyb3IpO1xuICAgICAgYXdhaXQgcmVzdWx0UHJvbWlzZS5jYXRjaCgoKSA9PiB7fSk7XG4gICAgICB0aHJvdyBlO1xuICAgIH1cbiAgICBjYi5vblR1cm5JZD8uKHR1cm5JZCk7XG4gICAgYXdhaXQgcmVzdWx0UHJvbWlzZTtcbiAgICByZXR1cm4geyB0aHJlYWRJZCB9O1xuICB9XG5cbiAgLy8g4pSA4pSAIHRocmVhZCDsnqzsgqzsmqkg7KeA7JuQIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIGdldCBlcG9jaCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmVwb2NoQ291bnRlcjtcbiAgfVxuXG4gIGhhc1RocmVhZCh0aHJlYWRJZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMudGhyZWFkTWV0YS5oYXModGhyZWFkSWQpO1xuICB9XG5cbiAgLy8gaWRsZSBUVEwg7LSI6rO8IC8g6rCc7IiYIOyDge2VnCDstIjqs7wgdGhyZWFkIOulvCDsoJXrpqwuIGNyZWF0ZVRocmVhZCDsp4HsoIQgbGF6eSDtmLjstpwuXG4gIC8vIOuntSDsoJzqsbAo7J6s7IKs7JqpIOudvOyasO2MhSDssKjri6gp7JmAIO2VqOq7mCB0aHJlYWQvdW5zdWJzY3JpYmUg66W8IOuztOuCuOuLpCDigJQgY29kZXgg64qUXG4gIC8vIFwi6rWs64+F7J6QIDAgKyBpZGxlXCIg7J20IDMw67aEKFRIUkVBRF9VTkxPQURJTkdfREVMQVksIO2VmOuTnOy9lOuUqSkg7KeA7IaN65CcIHRocmVhZCDrpbxcbiAgLy8g66mU66qo66as7JeQ7IScIOyekOuPmSDslrjroZzrk5ztlZjripTrjbAsIHRocmVhZC9zdGFydCDqsIAg7J20IOy7pOuEpeyFmOydhCDsnpDrj5kg6rWs64+F7J6Q66GcIOuTseuhne2VtFxuICAvLyDrkZDquLAg65WM66y47JeQIHVuc3Vic2NyaWJlIOyXhuydtOuKlCDqt7gg7Ja466Gc65Oc6rCAIOyYgeybkO2eiCDrsJzrj5ntlZjsp4Ag7JWK64qU64ukKFNPTi01MTYg7Iuk7KadKS5cbiAgc3dlZXBJZGxlVGhyZWFkcygpOiB2b2lkIHtcbiAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICAgIGZvciAoY29uc3QgW2lkLCBtZXRhXSBvZiB0aGlzLnRocmVhZE1ldGEpIHtcbiAgICAgIGlmIChub3cgLSBtZXRhLmxhc3RVc2VkQXQgPiBDb2RleEFwcFNlcnZlcldvcmtlci5USFJFQURfSURMRV9UVExfTVMpIHtcbiAgICAgICAgdGhpcy5ldmljdFRocmVhZChpZCk7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIGNyZWF0ZVRocmVhZCDsp4HsoIQg7Zi47LacIOKGkiDsg4ggdGhyZWFkIDEg6rCc6rCAIOqzpyDstpTqsIDrkJzri6QuIOy2lOqwgCDtm4Tsl5Drj4QgTUFYIOulvCDrhJjsp4Ag7JWK64+E66GdXG4gICAgLy8gTUFYLTEg7J207ZWY66GcIOykhOyXrCDrkZTri6Qo6re4656Y7JW8IOyDneyEsSDsp4Htm4Qg7KCV7ZmV7Z6IIE1BWCkuIExSVTogbGFzdFVzZWRBdCDsmKTrpoTssKjsiJzsnLzroZwg7KCc6rGwLlxuICAgIGNvbnN0IGxpbWl0ID0gQ29kZXhBcHBTZXJ2ZXJXb3JrZXIuTUFYX1RIUkVBRFNfUEVSX1dPUktFUiAtIDE7XG4gICAgaWYgKHRoaXMudGhyZWFkTWV0YS5zaXplID4gbGltaXQpIHtcbiAgICAgIGNvbnN0IHNvcnRlZCA9IFsuLi50aGlzLnRocmVhZE1ldGEuZW50cmllcygpXS50b1NvcnRlZChcbiAgICAgICAgKGEsIGIpID0+IGFbMV0ubGFzdFVzZWRBdCAtIGJbMV0ubGFzdFVzZWRBdCxcbiAgICAgICk7XG4gICAgICBjb25zdCBvdmVyID0gdGhpcy50aHJlYWRNZXRhLnNpemUgLSBsaW1pdDtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgb3ZlcjsgaSsrKSB0aGlzLmV2aWN0VGhyZWFkKHNvcnRlZFtpXSFbMF0pO1xuICAgIH1cbiAgfVxuXG4gIC8vIHRocmVhZCDsnqzsgqzsmqkg7Y+s6riwOiDrp7Ug7KCc6rGwKOudvOyasO2MhSDssKjri6gp7JmAIOq1rOuPhSDtlbTsoJzrpbwg7ZWcIOuLqOychOuhnCDrrLbripTri6QuXG4gIC8vIHVuc3Vic2NyaWJlIO2VnCB0aHJlYWQg7JeQIHR1cm4g7J2EIOuztOuCtOuptCDslYzrprzsnbQg7J20IOy7pOuEpeyFmOycvOuhnCDsmKTsp4Ag7JWK7Jy866+A66GcXG4gIC8vIOuRkCDrj5nsnpHsnYAg67CY65Oc7IucIO2VqOq7mOyXrOyVvCDtlZzri6QuXG4gIHByaXZhdGUgZXZpY3RUaHJlYWQodGhyZWFkSWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMudGhyZWFkTWV0YS5kZWxldGUodGhyZWFkSWQpO1xuICAgIHRoaXMudW5zdWJzY3JpYmVUaHJlYWQodGhyZWFkSWQpO1xuICB9XG5cbiAgLy8g7J6s7IKs7Jqp7J2EIO2PrOq4sO2VnCB0aHJlYWQg7J2YIOq1rOuPheydhCDrgYrripTri6QuIOq1rOuPheyekOqwgCDsl4bslrTsp4QgaWRsZSB0aHJlYWQg64qUIGNvZGV4IOqwgFxuICAvLyAzMOu2hCDrkqQg66mU66qo66as7JeQ7IScIOyekOuPmSDslrjroZzrk5ztlZzri6QoU09OLTUxNiDsi6Tspp0pLiBmaXJlLWFuZC1mb3JnZXQ6IOyLpO2MqO2VtOuPhFxuICAvLyDrrLTtlbQocmVzdGFydCDsi5wg7ZSE66Gc7IS47Iqk7Ke4IO2ajOyImCkuIHRocmVhZE1ldGEg7JeQIOyXhuuKlCDsnbTrr7jsp4AgMe2ajOyaqSB0aHJlYWQg64qUXG4gIC8vIGV2aWN0VGhyZWFkIOuMgOyLoCDsnbQg66mU7ISc65Oc66W8IOyngeygkSDtmLjstpztlZzri6QuXG4gIHByaXZhdGUgdW5zdWJzY3JpYmVUaHJlYWQodGhyZWFkSWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMucnBjPy5yZXF1ZXN0KFwidGhyZWFkL3Vuc3Vic2NyaWJlXCIsIHsgdGhyZWFkSWQgfSkuY2F0Y2goKCkgPT4ge30pO1xuICB9XG5cbiAgYXN5bmMgaW50ZXJydXB0VHVybih0aHJlYWRJZDogc3RyaW5nLCB0dXJuSWQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghdGhpcy5ycGMgfHwgIXRoaXMucmVhZHkpIHJldHVybjtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5ycGMucmVxdWVzdChcInR1cm4vaW50ZXJydXB0XCIsIHsgdGhyZWFkSWQsIHR1cm5JZCB9KTtcbiAgICB9IGNhdGNoIHt9XG4gIH1cblxuICBwcml2YXRlIGZhaWxBY3RpdmVUdXJuKGVycm9yOiBFcnJvcik6IHZvaWQge1xuICAgIGNvbnN0IGFib3J0ID0gdGhpcy5hY3RpdmVUdXJuQWJvcnQ7XG4gICAgdGhpcy5hY3RpdmVUdXJuQWJvcnQgPSB1bmRlZmluZWQ7XG4gICAgYWJvcnQ/LihlcnJvcik7XG4gIH1cblxuICBwcml2YXRlIGNsZWFudXBHZW5lcmF0ZWRJbWFnZXMoKTogdm9pZCB7XG4gICAgdHJ5IHtcbiAgICAgIHJtU3luYyhgJHt0aGlzLmNvZGV4SG9tZX0vZ2VuZXJhdGVkX2ltYWdlc2AsIHsgcmVjdXJzaXZlOiB0cnVlLCBmb3JjZTogdHJ1ZSB9KTtcbiAgICB9IGNhdGNoIHt9XG4gIH1cblxuICBwcml2YXRlIGNvbnN1bWVUdXJuTm90aWZpY2F0aW9ucyhcbiAgICB0aHJlYWRJZDogc3RyaW5nLFxuICAgIG1vZGVsOiBzdHJpbmcsXG4gICAgdHRmdFRyYWNrZXIgPSBjcmVhdGVUdGZ0VHJhY2tlcigpLFxuICApOiBQcm9taXNlPFR1cm5SZXN1bHQ+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2U8VHVyblJlc3VsdD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgbGV0IHNldHRsZWQgPSBmYWxzZTtcbiAgICAgIGxldCBhYm9ydDogQWN0aXZlVHVybkFib3J0O1xuICAgICAgY29uc3QgdGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBmaW5pc2hXaXRoRXJyb3IobmV3IEVycm9yKFwidHVybiB0aW1lb3V0ICg2MDBzKVwiKSk7XG4gICAgICB9LCA2MDBfMDAwKTtcblxuICAgICAgbGV0IHRleHQgPSBcIlwiO1xuICAgICAgbGV0IHVzYWdlOiBUb2tlblVzYWdlQnJlYWtkb3duID0ge1xuICAgICAgICB0b3RhbFRva2VuczogMCxcbiAgICAgICAgaW5wdXRUb2tlbnM6IDAsXG4gICAgICAgIG91dHB1dFRva2VuczogMCxcbiAgICAgICAgY2FjaGVkSW5wdXRUb2tlbnM6IDAsXG4gICAgICAgIHJlYXNvbmluZ091dHB1dFRva2VuczogMCxcbiAgICAgIH07XG4gICAgICBsZXQgZHVyYXRpb25NcyA9IDA7XG4gICAgICBjb25zdCBpbWFnZXMgPSBuZXcgTWFwPHN0cmluZywgVHVybkltYWdlPigpOyAvLyBpdGVtLmlkIOKGkiDsnbTrr7jsp4AgKGRlZHVwKVxuICAgICAgbGV0IGltYWdlQXR0ZW1wdGVkID0gZmFsc2U7XG5cbiAgICAgIGNvbnN0IGNsZWFudXAgPSAoKSA9PiB7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0KTtcbiAgICAgICAgaWYgKHRoaXMuYWN0aXZlVHVybkFib3J0ID09PSBhYm9ydCkgdGhpcy5hY3RpdmVUdXJuQWJvcnQgPSB1bmRlZmluZWQ7XG4gICAgICAgIGZvciAoY29uc3QgbiBvZiBbXG4gICAgICAgICAgXCJpdGVtL3N0YXJ0ZWRcIixcbiAgICAgICAgICBcIml0ZW0vY29tcGxldGVkXCIsXG4gICAgICAgICAgXCJpdGVtL2FnZW50TWVzc2FnZS9kZWx0YVwiLFxuICAgICAgICAgIFwidHVybi9jb21wbGV0ZWRcIixcbiAgICAgICAgICBcInRocmVhZC90b2tlblVzYWdlL3VwZGF0ZWRcIixcbiAgICAgICAgICBcImVycm9yXCIsXG4gICAgICAgIF0gYXMgY29uc3QpIHtcbiAgICAgICAgICB0aGlzLnJwYz8ub25Ob3RpZmljYXRpb24obiwgKCkgPT4ge30pO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBjb25zdCBmaW5pc2hXaXRoRXJyb3IgPSAoZXJyb3I6IEVycm9yKSA9PiB7XG4gICAgICAgIGlmIChzZXR0bGVkKSByZXR1cm47XG4gICAgICAgIHNldHRsZWQgPSB0cnVlO1xuICAgICAgICBjbGVhbnVwKCk7XG4gICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICB9O1xuXG4gICAgICBjb25zdCBmaW5pc2hXaXRoUmVzdWx0ID0gKHJlc3VsdDogVHVyblJlc3VsdCkgPT4ge1xuICAgICAgICBpZiAoc2V0dGxlZCkgcmV0dXJuO1xuICAgICAgICBzZXR0bGVkID0gdHJ1ZTtcbiAgICAgICAgY2xlYW51cCgpO1xuICAgICAgICBpZiAocmVzdWx0LmltYWdlQXR0ZW1wdGVkKSB0aGlzLmNsZWFudXBHZW5lcmF0ZWRJbWFnZXMoKTtcbiAgICAgICAgcmVzb2x2ZShyZXN1bHQpO1xuICAgICAgfTtcblxuICAgICAgYWJvcnQgPSBmaW5pc2hXaXRoRXJyb3I7XG4gICAgICB0aGlzLmFjdGl2ZVR1cm5BYm9ydCA9IGFib3J0O1xuXG4gICAgICAvLyDsnbTrr7jsp4AgdG9vbCDtmLjstpwg6rSA7LihKOyerOyLnOuPhCDtjJDsoJXsmqkpLiBzdGFydGVkIOuKlCByZXN1bHQg7JeG7J20IOyYpOuvgOuhnFxuICAgICAgLy8gYXR0ZW1wdGVkIOyLoO2YuOuhnOunjCDsk7Dqs6AsIOyZhOyEsSDsnbTrr7jsp4DripQgY29tcGxldGVkIOyXkOyEnCByZXN1bHQg7Jyg7Zqo7ISx7Jy866GcIO2MkOygle2VnOuLpC5cbiAgICAgIHRoaXMucnBjIS5vbk5vdGlmaWNhdGlvbihcIml0ZW0vc3RhcnRlZFwiLCAocCkgPT4ge1xuICAgICAgICBpZiAocC50aHJlYWRJZCAhPT0gdGhyZWFkSWQpIHJldHVybjtcbiAgICAgICAgaWYgKHAuaXRlbS50eXBlID09PSBcImltYWdlR2VuZXJhdGlvblwiKSBpbWFnZUF0dGVtcHRlZCA9IHRydWU7XG4gICAgICB9KTtcblxuICAgICAgdGhpcy5ycGMhLm9uTm90aWZpY2F0aW9uKFwiaXRlbS9jb21wbGV0ZWRcIiwgKHApID0+IHtcbiAgICAgICAgaWYgKHAudGhyZWFkSWQgIT09IHRocmVhZElkKSByZXR1cm47XG4gICAgICAgIGlmIChwLml0ZW0udHlwZSA9PT0gXCJhZ2VudE1lc3NhZ2VcIikge1xuICAgICAgICAgIHRleHQgPSBwLml0ZW0udGV4dDtcbiAgICAgICAgfSBlbHNlIGlmIChwLml0ZW0udHlwZSA9PT0gXCJpbWFnZUdlbmVyYXRpb25cIikge1xuICAgICAgICAgIGltYWdlQXR0ZW1wdGVkID0gdHJ1ZTtcbiAgICAgICAgICBpZiAoaXNDb21wbGV0ZWRJbWFnZVJlc3VsdChwLml0ZW0ucmVzdWx0KSkge1xuICAgICAgICAgICAgaW1hZ2VzLnNldChwLml0ZW0uaWQsIHsgZGF0YTogcC5pdGVtLnJlc3VsdCwgcmV2aXNlZFByb21wdDogcC5pdGVtLnJldmlzZWRQcm9tcHQgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgdGhpcy5ycGMhLm9uTm90aWZpY2F0aW9uKFwiaXRlbS9hZ2VudE1lc3NhZ2UvZGVsdGFcIiwgKHApID0+IHtcbiAgICAgICAgaWYgKHAudGhyZWFkSWQgIT09IHRocmVhZElkKSByZXR1cm47XG4gICAgICAgIHR0ZnRUcmFja2VyLnJlY29yZEZpcnN0RGVsdGEoKTtcbiAgICAgICAgdGV4dCArPSBwLmRlbHRhO1xuICAgICAgfSk7XG5cbiAgICAgIHRoaXMucnBjIS5vbk5vdGlmaWNhdGlvbihcInRocmVhZC90b2tlblVzYWdlL3VwZGF0ZWRcIiwgKHApID0+IHtcbiAgICAgICAgaWYgKHAudGhyZWFkSWQgIT09IHRocmVhZElkKSByZXR1cm47XG4gICAgICAgIC8vIHRocmVhZCDsnqzsgqzsmqkg7IucIC50b3RhbCDsnYAg64yA7ZmUIOyghOyytCDriITsoIHsnbTrnbwsIGNvbGQg7JiA642YIOydtOyghCB0dXJuIOq5jOyngCDshJ7sl6xcbiAgICAgICAgLy8g7J20IOyalOyyrSDsnpDssrTsnZggY2FjaGUg7KCB7KSR66Wg7J20IO2drOyEneuQnOuLpCjsmIg6IHR1cm4xIGNvbGQgMCUgKyB0dXJuMiA5MCUg4oaSIDQ4JSDroZwg6riw66GdKS5cbiAgICAgICAgLy8gLmxhc3Qg64qUIOydtOuyiCB0dXJuIOunjOydmCB1c2FnZSDrnbwgcmVxdWVzdF9sb2cg6rCAIOq3uCDsmpTssq3snZgg7Iuk7KCcIO2GoO2BsOydhCDsoJXtmZXtnogg67CY7JiB7ZWc64ukLlxuICAgICAgICB1c2FnZSA9IHAudG9rZW5Vc2FnZS5sYXN0O1xuICAgICAgfSk7XG5cbiAgICAgIHRoaXMucnBjIS5vbk5vdGlmaWNhdGlvbihcInR1cm4vY29tcGxldGVkXCIsIChwKSA9PiB7XG4gICAgICAgIGlmIChwLnRocmVhZElkICE9PSB0aHJlYWRJZCkgcmV0dXJuO1xuICAgICAgICBkdXJhdGlvbk1zID0gcC50dXJuLmR1cmF0aW9uTXMgPz8gMDtcbiAgICAgICAgaWYgKHAudHVybi5zdGF0dXMgPT09IFwiY29tcGxldGVkXCIpIHtcbiAgICAgICAgICBmaW5pc2hXaXRoUmVzdWx0KHtcbiAgICAgICAgICAgIHRleHQsXG4gICAgICAgICAgICB1c2FnZSxcbiAgICAgICAgICAgIGR1cmF0aW9uTXMsXG4gICAgICAgICAgICB0dGZ0TXM6IHR0ZnRUcmFja2VyLnZhbHVlKCksXG4gICAgICAgICAgICBtb2RlbCxcbiAgICAgICAgICAgIGltYWdlczogaW1hZ2VzLnNpemUgPiAwID8gWy4uLmltYWdlcy52YWx1ZXMoKV0gOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBpbWFnZUF0dGVtcHRlZCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyB0dXJuIOyLpO2MqC/spJHri6gg7IucIOu2gOu2hCDsnbTrr7jsp4DripQg7Y+Q6riwKOyEseqzteycvOuhnCDsirnqsqntlZjsp4Ag7JWK7J2MKS5cbiAgICAgICAgICBmaW5pc2hXaXRoRXJyb3IobmV3IEVycm9yKGB0dXJuIGZhaWxlZDogJHtKU09OLnN0cmluZ2lmeShwLnR1cm4uZXJyb3IpfWApKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIHRoaXMucnBjIS5vbk5vdGlmaWNhdGlvbihcImVycm9yXCIsIChwKSA9PiB7XG4gICAgICAgIGlmIChwLnRocmVhZElkICE9PSB0aHJlYWRJZCkgcmV0dXJuO1xuICAgICAgICBpZiAoIXAud2lsbFJldHJ5KSB7XG4gICAgICAgICAgZmluaXNoV2l0aEVycm9yKG5ldyBFcnJvcihgY29kZXggZXJyb3I6ICR7cC5lcnJvci5tZXNzYWdlfWApKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGNvbnN1bWVTdHJlYW1Ob3RpZmljYXRpb25zKFxuICAgIHRocmVhZElkOiBzdHJpbmcsXG4gICAgbW9kZWw6IHN0cmluZyxcbiAgICBjYjogU3RyZWFtQ2FsbGJhY2tzLFxuICAgIHR0ZnRUcmFja2VyID0gY3JlYXRlVHRmdFRyYWNrZXIoKSxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGxldCBzZXR0bGVkID0gZmFsc2U7XG4gICAgICBsZXQgYWJvcnQ6IEFjdGl2ZVR1cm5BYm9ydDtcbiAgICAgIGNvbnN0IHRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgZmluaXNoV2l0aEVycm9yKG5ldyBFcnJvcihcInR1cm4gdGltZW91dCAoNjAwcylcIikpO1xuICAgICAgfSwgNjAwXzAwMCk7XG5cbiAgICAgIGxldCB0ZXh0ID0gXCJcIjtcbiAgICAgIGxldCB1c2FnZTogVG9rZW5Vc2FnZUJyZWFrZG93biA9IHtcbiAgICAgICAgdG90YWxUb2tlbnM6IDAsXG4gICAgICAgIGlucHV0VG9rZW5zOiAwLFxuICAgICAgICBvdXRwdXRUb2tlbnM6IDAsXG4gICAgICAgIGNhY2hlZElucHV0VG9rZW5zOiAwLFxuICAgICAgICByZWFzb25pbmdPdXRwdXRUb2tlbnM6IDAsXG4gICAgICB9O1xuICAgICAgY29uc3QgaW1hZ2VzID0gbmV3IE1hcDxzdHJpbmcsIFR1cm5JbWFnZT4oKTsgLy8gaXRlbS5pZCDihpIg7J2066+47KeAIChkZWR1cClcbiAgICAgIGxldCBpbWFnZUF0dGVtcHRlZCA9IGZhbHNlO1xuXG4gICAgICBjb25zdCBjbGVhbnVwID0gKCkgPT4ge1xuICAgICAgICBjbGVhclRpbWVvdXQodGltZW91dCk7XG4gICAgICAgIGlmICh0aGlzLmFjdGl2ZVR1cm5BYm9ydCA9PT0gYWJvcnQpIHRoaXMuYWN0aXZlVHVybkFib3J0ID0gdW5kZWZpbmVkO1xuICAgICAgICBmb3IgKGNvbnN0IG4gb2YgW1xuICAgICAgICAgIFwiaXRlbS9zdGFydGVkXCIsXG4gICAgICAgICAgXCJpdGVtL2NvbXBsZXRlZFwiLFxuICAgICAgICAgIFwiaXRlbS9hZ2VudE1lc3NhZ2UvZGVsdGFcIixcbiAgICAgICAgICBcInR1cm4vY29tcGxldGVkXCIsXG4gICAgICAgICAgXCJ0aHJlYWQvdG9rZW5Vc2FnZS91cGRhdGVkXCIsXG4gICAgICAgICAgXCJlcnJvclwiLFxuICAgICAgICBdIGFzIGNvbnN0KSB7XG4gICAgICAgICAgdGhpcy5ycGM/Lm9uTm90aWZpY2F0aW9uKG4sICgpID0+IHt9KTtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgY29uc3QgZmluaXNoV2l0aEVycm9yID0gKGVycm9yOiBFcnJvcikgPT4ge1xuICAgICAgICBpZiAoc2V0dGxlZCkgcmV0dXJuO1xuICAgICAgICBzZXR0bGVkID0gdHJ1ZTtcbiAgICAgICAgY2xlYW51cCgpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNiLm9uRXJyb3IoZXJyb3IpO1xuICAgICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICAgIH0gY2F0Y2ggKGNhbGxiYWNrRXJyb3IpIHtcbiAgICAgICAgICByZWplY3QoY2FsbGJhY2tFcnJvcik7XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IGZpbmlzaFdpdGhDb21wbGV0ZSA9IChyZXN1bHQ6IFR1cm5SZXN1bHQpID0+IHtcbiAgICAgICAgaWYgKHNldHRsZWQpIHJldHVybjtcbiAgICAgICAgc2V0dGxlZCA9IHRydWU7XG4gICAgICAgIGNsZWFudXAoKTtcbiAgICAgICAgaWYgKHJlc3VsdC5pbWFnZUF0dGVtcHRlZCkgdGhpcy5jbGVhbnVwR2VuZXJhdGVkSW1hZ2VzKCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY2Iub25Db21wbGV0ZShyZXN1bHQpO1xuICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgfSBjYXRjaCAoY2FsbGJhY2tFcnJvcikge1xuICAgICAgICAgIHJlamVjdChjYWxsYmFja0Vycm9yKTtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgYWJvcnQgPSBmaW5pc2hXaXRoRXJyb3I7XG4gICAgICB0aGlzLmFjdGl2ZVR1cm5BYm9ydCA9IGFib3J0O1xuXG4gICAgICB0aGlzLnJwYyEub25Ob3RpZmljYXRpb24oXCJpdGVtL2FnZW50TWVzc2FnZS9kZWx0YVwiLCAocCkgPT4ge1xuICAgICAgICBpZiAocC50aHJlYWRJZCAhPT0gdGhyZWFkSWQpIHJldHVybjtcbiAgICAgICAgdHRmdFRyYWNrZXIucmVjb3JkRmlyc3REZWx0YSgpO1xuICAgICAgICB0ZXh0ICs9IHAuZGVsdGE7XG4gICAgICAgIGNiLm9uRGVsdGEocC5kZWx0YSk7XG4gICAgICB9KTtcblxuICAgICAgdGhpcy5ycGMhLm9uTm90aWZpY2F0aW9uKFwiaXRlbS9zdGFydGVkXCIsIChwKSA9PiB7XG4gICAgICAgIGlmIChwLnRocmVhZElkICE9PSB0aHJlYWRJZCkgcmV0dXJuO1xuICAgICAgICBpZiAocC5pdGVtLnR5cGUgPT09IFwiaW1hZ2VHZW5lcmF0aW9uXCIpIGltYWdlQXR0ZW1wdGVkID0gdHJ1ZTtcbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLnJwYyEub25Ob3RpZmljYXRpb24oXCJpdGVtL2NvbXBsZXRlZFwiLCAocCkgPT4ge1xuICAgICAgICBpZiAocC50aHJlYWRJZCAhPT0gdGhyZWFkSWQpIHJldHVybjtcbiAgICAgICAgaWYgKHAuaXRlbS50eXBlID09PSBcImFnZW50TWVzc2FnZVwiKSB7XG4gICAgICAgICAgdGV4dCA9IHAuaXRlbS50ZXh0O1xuICAgICAgICB9IGVsc2UgaWYgKHAuaXRlbS50eXBlID09PSBcImltYWdlR2VuZXJhdGlvblwiKSB7XG4gICAgICAgICAgaW1hZ2VBdHRlbXB0ZWQgPSB0cnVlO1xuICAgICAgICAgIGlmIChpc0NvbXBsZXRlZEltYWdlUmVzdWx0KHAuaXRlbS5yZXN1bHQpKSB7XG4gICAgICAgICAgICBpbWFnZXMuc2V0KHAuaXRlbS5pZCwgeyBkYXRhOiBwLml0ZW0ucmVzdWx0LCByZXZpc2VkUHJvbXB0OiBwLml0ZW0ucmV2aXNlZFByb21wdCB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLnJwYyEub25Ob3RpZmljYXRpb24oXCJ0aHJlYWQvdG9rZW5Vc2FnZS91cGRhdGVkXCIsIChwKSA9PiB7XG4gICAgICAgIGlmIChwLnRocmVhZElkICE9PSB0aHJlYWRJZCkgcmV0dXJuO1xuICAgICAgICAvLyB0aHJlYWQg7J6s7IKs7JqpIOyLnCAudG90YWwg7J2AIOuMgO2ZlCDsoITssrQg64iE7KCB7J206528LCBjb2xkIOyYgOuNmCDsnbTsoIQgdHVybiDquYzsp4Ag7ISe7JesXG4gICAgICAgIC8vIOydtCDsmpTssq0g7J6Q7LK07J2YIGNhY2hlIOyggeykkeuloOydtCDtnazshJ3rkJzri6Qo7JiIOiB0dXJuMSBjb2xkIDAlICsgdHVybjIgOTAlIOKGkiA0OCUg66GcIOq4sOuhnSkuXG4gICAgICAgIC8vIC5sYXN0IOuKlCDsnbTrsoggdHVybiDrp4zsnZggdXNhZ2Ug6528IHJlcXVlc3RfbG9nIOqwgCDqt7gg7JqU7LKt7J2YIOyLpOygnCDthqDtgbDsnYQg7KCV7ZmV7Z6IIOuwmOyYge2VnOuLpC5cbiAgICAgICAgdXNhZ2UgPSBwLnRva2VuVXNhZ2UubGFzdDtcbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLnJwYyEub25Ob3RpZmljYXRpb24oXCJ0dXJuL2NvbXBsZXRlZFwiLCAocCkgPT4ge1xuICAgICAgICBpZiAocC50aHJlYWRJZCAhPT0gdGhyZWFkSWQpIHJldHVybjtcbiAgICAgICAgaWYgKHAudHVybi5zdGF0dXMgPT09IFwiY29tcGxldGVkXCIpIHtcbiAgICAgICAgICBmaW5pc2hXaXRoQ29tcGxldGUoe1xuICAgICAgICAgICAgdGV4dCxcbiAgICAgICAgICAgIHVzYWdlLFxuICAgICAgICAgICAgZHVyYXRpb25NczogcC50dXJuLmR1cmF0aW9uTXMgPz8gMCxcbiAgICAgICAgICAgIHR0ZnRNczogdHRmdFRyYWNrZXIudmFsdWUoKSxcbiAgICAgICAgICAgIG1vZGVsLFxuICAgICAgICAgICAgaW1hZ2VzOiBpbWFnZXMuc2l6ZSA+IDAgPyBbLi4uaW1hZ2VzLnZhbHVlcygpXSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGltYWdlQXR0ZW1wdGVkLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGZpbmlzaFdpdGhFcnJvcihuZXcgRXJyb3IoYHR1cm4gJHtwLnR1cm4uc3RhdHVzfTogJHtKU09OLnN0cmluZ2lmeShwLnR1cm4uZXJyb3IpfWApKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIHRoaXMucnBjIS5vbk5vdGlmaWNhdGlvbihcImVycm9yXCIsIChwKSA9PiB7XG4gICAgICAgIGlmIChwLnRocmVhZElkICE9PSB0aHJlYWRJZCkgcmV0dXJuO1xuICAgICAgICBpZiAoIXAud2lsbFJldHJ5KSB7XG4gICAgICAgICAgZmluaXNoV2l0aEVycm9yKG5ldyBFcnJvcihgY29kZXggZXJyb3I6ICR7cC5lcnJvci5tZXNzYWdlfWApKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICAvLyDilIDilIAgUmVzdGFydCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICBwcml2YXRlIHNjaGVkdWxlUmVzdGFydCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5kZXN0cm95ZWQgfHwgdGhpcy5yZXN0YXJ0QXR0ZW1wdHMgPj0gTUFYX1JFU1RBUlRfQVRURU1QVFMpIHtcbiAgICAgIGlmICh0aGlzLnJlc3RhcnRBdHRlbXB0cyA+PSBNQVhfUkVTVEFSVF9BVFRFTVBUUykge1xuICAgICAgICBsb2dnZXIud2Fybihgd29ya2VyICR7dGhpcy5jb25maWcudG9rZW5OYW1lfSBtYXggcmVzdGFydCBhdHRlbXB0cyByZWFjaGVkYCk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5yZXN0YXJ0QXR0ZW1wdHMrKztcbiAgICBjb25zdCBiYXNlRGVsYXkgPSBSRVNUQVJUX0JBQ0tPRkZfQkFTRV9NUyAqIDIgKiogKHRoaXMucmVzdGFydEF0dGVtcHRzIC0gMSk7XG4gICAgY29uc3Qgc3RhZ2dlciA9ICh0aGlzLmNvbmZpZy53b3JrZXJJbmRleCA/PyAwKSAqIDJfMDAwO1xuICAgIGNvbnN0IGRlbGF5ID0gYmFzZURlbGF5ICsgc3RhZ2dlcjtcbiAgICBsb2dnZXIuaW5mbyhcbiAgICAgIGB3b3JrZXIgJHt0aGlzLmNvbmZpZy50b2tlbk5hbWV9WyR7dGhpcy5jb25maWcud29ya2VySW5kZXggPz8gMH1dIHJlc3RhcnRpbmcgaW4gJHtkZWxheX1tcyAoYXR0ZW1wdCAke3RoaXMucmVzdGFydEF0dGVtcHRzfSlgLFxuICAgICk7XG5cbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGlmICh0aGlzLmRlc3Ryb3llZCkgcmV0dXJuO1xuICAgICAgdGhpcy5pbml0aWFsaXplKClcbiAgICAgICAgLnRoZW4oKCkgPT4gdGhpcy5vblJlYWR5Py4oKSlcbiAgICAgICAgLmNhdGNoKChlKSA9PiB7XG4gICAgICAgICAgbG9nZ2VyLndhcm4oYHdvcmtlciAke3RoaXMuY29uZmlnLnRva2VuTmFtZX0gcmVzdGFydCBmYWlsZWQ6ICR7KGUgYXMgRXJyb3IpLm1lc3NhZ2V9YCk7XG4gICAgICAgICAgdGhpcy5zY2hlZHVsZVJlc3RhcnQoKTtcbiAgICAgICAgfSk7XG4gICAgfSwgZGVsYXkpO1xuICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQXlCQSxNQUFNLFNBQVMsVUFBVSxDQUFDLFNBQVMsY0FBYyxDQUFDO0FBRWxELE1BQU0sdUJBQXVCO0FBQzdCLE1BQU0sMEJBQTBCO0FBdURoQyxNQUFNLGtCQUFrQjtDQUN0QixTQUFTO0NBQ1QsZ0JBQWdCO0NBQ2hCLFFBQVEsRUFDTixNQUFNLEVBQUUsVUFBVTtFQUFFLFNBQVM7RUFBTyxxQkFBcUI7RUFBTyxvQkFBb0I7Q0FBTSxFQUFFLEVBQzlGO0FBQ0Y7QUFFQSxNQUFNLG9CQUNKO0FBS0YsTUFBTSwwQkFDSjtBQUVG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
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
//#region src/utils/providers/openai/openai-worker-pool-config.ts
|
|
2
2
|
const MAX_OPENAI_WORKERS_PER_TOKEN = 20;
|
|
3
|
-
const DEFAULT_OPENAI_MIN_WORKERS_PER_TOKEN =
|
|
4
|
-
const DEFAULT_OPENAI_MAX_WORKERS_PER_TOKEN =
|
|
3
|
+
const DEFAULT_OPENAI_MIN_WORKERS_PER_TOKEN = 1;
|
|
4
|
+
const DEFAULT_OPENAI_MAX_WORKERS_PER_TOKEN = 3;
|
|
5
5
|
const OPENAI_WORKER_BASE_RSS_GIB = .71;
|
|
6
6
|
const OPENAI_WORKER_RSS_GIB = .157;
|
|
7
7
|
function boundedInteger(value, fallback, min, max) {
|
|
@@ -16,8 +16,7 @@ function boundedNumber(value, fallback, min) {
|
|
|
16
16
|
}
|
|
17
17
|
function resolveOpenAIWorkerPoolConfig(env = process.env) {
|
|
18
18
|
const autoscale = env.QGRID_OPENAI_AUTOSCALE !== "false" && env.QGRID_OPENAI_AUTOSCALE !== "0";
|
|
19
|
-
const
|
|
20
|
-
const minWorkersPerToken = boundedInteger(env.QGRID_OPENAI_MIN_WORKERS_PER_TOKEN, legacyWorkers, 1, 20);
|
|
19
|
+
const minWorkersPerToken = boundedInteger(env.QGRID_OPENAI_MIN_WORKERS_PER_TOKEN, DEFAULT_OPENAI_MIN_WORKERS_PER_TOKEN, 1, 20);
|
|
21
20
|
return {
|
|
22
21
|
autoscale,
|
|
23
22
|
minWorkersPerToken,
|
|
@@ -34,4 +33,4 @@ function estimateOpenAIWorkerRssGiB(totalWorkers) {
|
|
|
34
33
|
//#endregion
|
|
35
34
|
export { MAX_OPENAI_WORKERS_PER_TOKEN, OPENAI_WORKER_BASE_RSS_GIB, OPENAI_WORKER_RSS_GIB, estimateOpenAIWorkerRssGiB, resolveOpenAIWorkerPoolConfig };
|
|
36
35
|
|
|
37
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,
|
|
36
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3BlbmFpLXdvcmtlci1wb29sLWNvbmZpZy5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvdXRpbHMvcHJvdmlkZXJzL29wZW5haS9vcGVuYWktd29ya2VyLXBvb2wtY29uZmlnLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBjb25zdCBNQVhfT1BFTkFJX1dPUktFUlNfUEVSX1RPS0VOID0gMjA7XG5jb25zdCBERUZBVUxUX09QRU5BSV9NSU5fV09SS0VSU19QRVJfVE9LRU4gPSAxO1xuY29uc3QgREVGQVVMVF9PUEVOQUlfTUFYX1dPUktFUlNfUEVSX1RPS0VOID0gMztcblxuZXhwb3J0IGNvbnN0IE9QRU5BSV9XT1JLRVJfQkFTRV9SU1NfR0lCID0gMC43MTtcbmV4cG9ydCBjb25zdCBPUEVOQUlfV09SS0VSX1JTU19HSUIgPSAwLjE1NztcblxuZXhwb3J0IHR5cGUgT3BlbkFJV29ya2VyUG9vbENvbmZpZyA9IHtcbiAgYXV0b3NjYWxlOiBib29sZWFuO1xuICBtaW5Xb3JrZXJzUGVyVG9rZW46IG51bWJlcjtcbiAgbWF4V29ya2Vyc1BlclRva2VuOiBudW1iZXI7XG4gIHNjYWxlSW50ZXJ2YWxNczogbnVtYmVyO1xuICBzY2FsZURvd25JZGxlTXM6IG51bWJlcjtcbiAgbWF4RXN0aW1hdGVkUnNzR2lCOiBudW1iZXI7XG4gIG1pbkhvc3RBdmFpbGFibGVHaUI6IG51bWJlcjtcbn07XG5cbmZ1bmN0aW9uIGJvdW5kZWRJbnRlZ2VyKFxuICB2YWx1ZTogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICBmYWxsYmFjazogbnVtYmVyLFxuICBtaW46IG51bWJlcixcbiAgbWF4OiBudW1iZXIsXG4pOiBudW1iZXIge1xuICBjb25zdCBwYXJzZWQgPSBOdW1iZXIodmFsdWUpO1xuICBpZiAoIU51bWJlci5pc0Zpbml0ZShwYXJzZWQpKSByZXR1cm4gZmFsbGJhY2s7XG4gIHJldHVybiBNYXRoLm1heChtaW4sIE1hdGgubWluKE1hdGguZmxvb3IocGFyc2VkKSwgbWF4KSk7XG59XG5cbmZ1bmN0aW9uIGJvdW5kZWROdW1iZXIodmFsdWU6IHN0cmluZyB8IHVuZGVmaW5lZCwgZmFsbGJhY2s6IG51bWJlciwgbWluOiBudW1iZXIpOiBudW1iZXIge1xuICBjb25zdCBwYXJzZWQgPSBOdW1iZXIodmFsdWUpO1xuICBpZiAoIU51bWJlci5pc0Zpbml0ZShwYXJzZWQpKSByZXR1cm4gZmFsbGJhY2s7XG4gIHJldHVybiBNYXRoLm1heChtaW4sIHBhcnNlZCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlT3BlbkFJV29ya2VyUG9vbENvbmZpZyhcbiAgZW52OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+ID0gcHJvY2Vzcy5lbnYsXG4pOiBPcGVuQUlXb3JrZXJQb29sQ29uZmlnIHtcbiAgY29uc3QgYXV0b3NjYWxlID0gZW52LlFHUklEX09QRU5BSV9BVVRPU0NBTEUgIT09IFwiZmFsc2VcIiAmJiBlbnYuUUdSSURfT1BFTkFJX0FVVE9TQ0FMRSAhPT0gXCIwXCI7XG4gIGNvbnN0IG1pbldvcmtlcnNQZXJUb2tlbiA9IGJvdW5kZWRJbnRlZ2VyKFxuICAgIGVudi5RR1JJRF9PUEVOQUlfTUlOX1dPUktFUlNfUEVSX1RPS0VOLFxuICAgIERFRkFVTFRfT1BFTkFJX01JTl9XT1JLRVJTX1BFUl9UT0tFTixcbiAgICAxLFxuICAgIE1BWF9PUEVOQUlfV09SS0VSU19QRVJfVE9LRU4sXG4gICk7XG4gIHJldHVybiB7XG4gICAgYXV0b3NjYWxlLFxuICAgIG1pbldvcmtlcnNQZXJUb2tlbixcbiAgICAvLyBhdXRvc2NhbGUg7J20IOq6vOyngOuptCBtYXgg64qUIG1pbiDsnLzroZwg6rOg7KCV65CY66+A66GcIGVudiDtjIzsi7Eg7J6Q7LK06rCAIGF1dG9zY2FsZSDrtoTquLAg7JWI7JeQ66eMIOyeiOuLpC5cbiAgICBtYXhXb3JrZXJzUGVyVG9rZW46IGF1dG9zY2FsZVxuICAgICAgPyBNYXRoLm1heChcbiAgICAgICAgICBtaW5Xb3JrZXJzUGVyVG9rZW4sXG4gICAgICAgICAgYm91bmRlZEludGVnZXIoXG4gICAgICAgICAgICBlbnYuUUdSSURfT1BFTkFJX01BWF9XT1JLRVJTX1BFUl9UT0tFTixcbiAgICAgICAgICAgIERFRkFVTFRfT1BFTkFJX01BWF9XT1JLRVJTX1BFUl9UT0tFTixcbiAgICAgICAgICAgIDEsXG4gICAgICAgICAgICBNQVhfT1BFTkFJX1dPUktFUlNfUEVSX1RPS0VOLFxuICAgICAgICAgICksXG4gICAgICAgIClcbiAgICAgIDogbWluV29ya2Vyc1BlclRva2VuLFxuICAgIHNjYWxlSW50ZXJ2YWxNczogYm91bmRlZEludGVnZXIoZW52LlFHUklEX09QRU5BSV9TQ0FMRV9JTlRFUlZBTF9NUywgNV8wMDAsIDI1MCwgMzAwXzAwMCksXG4gICAgc2NhbGVEb3duSWRsZU1zOiBib3VuZGVkSW50ZWdlcihcbiAgICAgIGVudi5RR1JJRF9PUEVOQUlfU0NBTEVfRE9XTl9JRExFX01TLFxuICAgICAgMTAgKiA2MF8wMDAsXG4gICAgICAxXzAwMCxcbiAgICAgIDI0ICogNjAgKiA2MF8wMDAsXG4gICAgKSxcbiAgICBtYXhFc3RpbWF0ZWRSc3NHaUI6IGJvdW5kZWROdW1iZXIoZW52LlFHUklEX09QRU5BSV9NQVhfRVNUSU1BVEVEX1JTU19HSUIsIDE2LCAxKSxcbiAgICBtaW5Ib3N0QXZhaWxhYmxlR2lCOiBib3VuZGVkTnVtYmVyKGVudi5RR1JJRF9PUEVOQUlfTUlOX0hPU1RfQVZBSUxBQkxFX0dJQiwgMjAsIDApLFxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZXN0aW1hdGVPcGVuQUlXb3JrZXJSc3NHaUIodG90YWxXb3JrZXJzOiBudW1iZXIpOiBudW1iZXIge1xuICByZXR1cm4gT1BFTkFJX1dPUktFUl9CQVNFX1JTU19HSUIgKyBPUEVOQUlfV09SS0VSX1JTU19HSUIgKiB0b3RhbFdvcmtlcnM7XG59XG4iXSwibWFwcGluZ3MiOiI7QUFBQSxNQUFhLCtCQUErQjtBQUM1QyxNQUFNLHVDQUF1QztBQUM3QyxNQUFNLHVDQUF1QztBQUU3QyxNQUFhLDZCQUE2QjtBQUMxQyxNQUFhLHdCQUF3QjtBQVlyQyxTQUFTLGVBQ1AsT0FDQSxVQUNBLEtBQ0EsS0FDUTtDQUNSLE1BQU0sU0FBUyxPQUFPLEtBQUs7Q0FDM0IsSUFBSSxDQUFDLE9BQU8sU0FBUyxNQUFNLEdBQUcsT0FBTztDQUNyQyxPQUFPLEtBQUssSUFBSSxLQUFLLEtBQUssSUFBSSxLQUFLLE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQztBQUN4RDtBQUVBLFNBQVMsY0FBYyxPQUEyQixVQUFrQixLQUFxQjtDQUN2RixNQUFNLFNBQVMsT0FBTyxLQUFLO0NBQzNCLElBQUksQ0FBQyxPQUFPLFNBQVMsTUFBTSxHQUFHLE9BQU87Q0FDckMsT0FBTyxLQUFLLElBQUksS0FBSyxNQUFNO0FBQzdCO0FBRUEsU0FBZ0IsOEJBQ2QsTUFBMEMsUUFBUSxLQUMxQjtDQUN4QixNQUFNLFlBQVksSUFBSSwyQkFBMkIsV0FBVyxJQUFJLDJCQUEyQjtDQUMzRixNQUFNLHFCQUFxQixlQUN6QixJQUFJLG9DQUNKLHNDQUNBLEdBQUEsRUFFRjtDQUNBLE9BQU87RUFDTDtFQUNBO0VBRUEsb0JBQW9CLFlBQ2hCLEtBQUssSUFDSCxvQkFDQSxlQUNFLElBQUksb0NBQ0osc0NBQ0EsR0FBQSxFQUVGLENBQ0YsSUFDQTtFQUNKLGlCQUFpQixlQUFlLElBQUksZ0NBQWdDLEtBQU8sS0FBSyxHQUFPO0VBQ3ZGLGlCQUFpQixlQUNmLElBQUksaUNBQ0osS0FBSyxLQUNMLEtBQ0EsT0FBVSxHQUNaO0VBQ0Esb0JBQW9CLGNBQWMsSUFBSSxvQ0FBb0MsSUFBSSxDQUFDO0VBQy9FLHFCQUFxQixjQUFjLElBQUkscUNBQXFDLElBQUksQ0FBQztDQUNuRjtBQUNGO0FBRUEsU0FBZ0IsMkJBQTJCLGNBQThCO0NBQ3ZFLE9BQU8sNkJBQTZCLHdCQUF3QjtBQUM5RCJ9
|
|
@@ -466,7 +466,11 @@ describe("QgridDispatcherClass", () => {
|
|
|
466
466
|
},
|
|
467
467
|
}),
|
|
468
468
|
}) as {
|
|
469
|
-
properties?: {
|
|
469
|
+
properties?: {
|
|
470
|
+
result?: {
|
|
471
|
+
anyOf?: Array<{ properties?: { answer?: { $ref?: string } } }>;
|
|
472
|
+
};
|
|
473
|
+
};
|
|
470
474
|
$defs?: {
|
|
471
475
|
__qgrid_user_output?: {
|
|
472
476
|
required?: string[];
|
|
@@ -484,7 +488,7 @@ describe("QgridDispatcherClass", () => {
|
|
|
484
488
|
};
|
|
485
489
|
const userSchema = schema.$defs?.__qgrid_user_output;
|
|
486
490
|
|
|
487
|
-
expect(schema.properties?.
|
|
491
|
+
expect(schema.properties?.result?.anyOf?.[0]?.properties?.answer?.$ref).toBe(
|
|
488
492
|
"#/$defs/__qgrid_user_output",
|
|
489
493
|
);
|
|
490
494
|
expect(userSchema).toMatchObject({
|
|
@@ -640,7 +644,7 @@ describe("QgridDispatcherClass", () => {
|
|
|
640
644
|
const generate = vi.fn(async (req: GenerateRequest) => {
|
|
641
645
|
request = req;
|
|
642
646
|
return providerResult({
|
|
643
|
-
text: '{"action":"answer","answer":{"
|
|
647
|
+
text: '{"result":{"action":"answer","answer":{"payload":"ok"},"toolCalls":null}}',
|
|
644
648
|
});
|
|
645
649
|
});
|
|
646
650
|
if (provider === "openai") dispatcher.openaiDispatcher = { generate } as never;
|
|
@@ -654,7 +658,7 @@ describe("QgridDispatcherClass", () => {
|
|
|
654
658
|
request = req;
|
|
655
659
|
cb.onComplete(
|
|
656
660
|
providerResult({
|
|
657
|
-
text: '{"action":"answer","answer":{"
|
|
661
|
+
text: '{"result":{"action":"answer","answer":{"payload":"ok"},"toolCalls":null}}',
|
|
658
662
|
}),
|
|
659
663
|
);
|
|
660
664
|
},
|
|
@@ -679,10 +683,20 @@ describe("QgridDispatcherClass", () => {
|
|
|
679
683
|
|
|
680
684
|
expect(request?.outputSchema).toMatchObject({
|
|
681
685
|
properties: {
|
|
682
|
-
|
|
686
|
+
result: {
|
|
683
687
|
anyOf: [
|
|
684
|
-
{
|
|
685
|
-
|
|
688
|
+
{
|
|
689
|
+
properties: {
|
|
690
|
+
action: { enum: ["answer"] },
|
|
691
|
+
answer: { $ref: "#/$defs/__qgrid_user_output" },
|
|
692
|
+
},
|
|
693
|
+
},
|
|
694
|
+
{
|
|
695
|
+
properties: {
|
|
696
|
+
action: { enum: ["tool_call"] },
|
|
697
|
+
toolCalls: { minItems: 1 },
|
|
698
|
+
},
|
|
699
|
+
},
|
|
686
700
|
],
|
|
687
701
|
},
|
|
688
702
|
},
|
|
@@ -694,7 +708,7 @@ describe("QgridDispatcherClass", () => {
|
|
|
694
708
|
},
|
|
695
709
|
},
|
|
696
710
|
});
|
|
697
|
-
expect(mappedText).toBe('{"
|
|
711
|
+
expect(mappedText).toBe('{"payload":"ok"}');
|
|
698
712
|
},
|
|
699
713
|
);
|
|
700
714
|
|
|
@@ -68,8 +68,8 @@ export class QgridDispatcherClass {
|
|
|
68
68
|
async query(input: QueryInput, abortSignal?: AbortSignal): Promise<QueryOutput> {
|
|
69
69
|
const route = parseProviderRoute(input.model);
|
|
70
70
|
const outputSchema = buildAndValidateStrictOutputSchema(input, route.provider);
|
|
71
|
-
//
|
|
72
|
-
const
|
|
71
|
+
// answer 인코딩 판정: jsonSchema 있으면 사용자 스키마 JSON, 없으면 평문 string. 4개 방출 지점이 공유.
|
|
72
|
+
const answerKind = input.jsonSchema ? ("json" as const) : ("text" as const);
|
|
73
73
|
|
|
74
74
|
// provider prefix routing: 'openai/gpt-5.4' → OpenAIDispatcher
|
|
75
75
|
if (route.provider === "openai") {
|
|
@@ -102,7 +102,7 @@ export class QgridDispatcherClass {
|
|
|
102
102
|
return applyToolCallEmulation(toEmulationResult(result), input.tools, {
|
|
103
103
|
threadCoord: coord,
|
|
104
104
|
images: result.images,
|
|
105
|
-
|
|
105
|
+
answerKind,
|
|
106
106
|
});
|
|
107
107
|
} else if (route.provider === "anthropic") {
|
|
108
108
|
if (!this.anthropicDispatcher) throw new QuotaError("Anthropic dispatcher not initialized");
|
|
@@ -124,7 +124,7 @@ export class QgridDispatcherClass {
|
|
|
124
124
|
|
|
125
125
|
return applyToolCallEmulation(toEmulationResult(result), input.tools, {
|
|
126
126
|
threadCoord: issueConvContext(result.threadCoord, decision),
|
|
127
|
-
|
|
127
|
+
answerKind,
|
|
128
128
|
});
|
|
129
129
|
}
|
|
130
130
|
|
|
@@ -138,8 +138,8 @@ export class QgridDispatcherClass {
|
|
|
138
138
|
): Promise<void> {
|
|
139
139
|
const route = parseProviderRoute(input.model);
|
|
140
140
|
const outputSchema = buildAndValidateStrictOutputSchema(input, route.provider);
|
|
141
|
-
//
|
|
142
|
-
const
|
|
141
|
+
// answer 인코딩 판정: jsonSchema 있으면 사용자 스키마 JSON, 없으면 평문 string. 4개 방출 지점이 공유.
|
|
142
|
+
const answerKind = input.jsonSchema ? ("json" as const) : ("text" as const);
|
|
143
143
|
|
|
144
144
|
if (route.provider === "openai") {
|
|
145
145
|
if (!this.openaiDispatcher) throw new QuotaError("OpenAI dispatcher not initialized");
|
|
@@ -171,7 +171,7 @@ export class QgridDispatcherClass {
|
|
|
171
171
|
cb.onComplete(
|
|
172
172
|
applyToolCallEmulation(toEmulationResult(turnResult), input.tools, {
|
|
173
173
|
threadCoord: issueConvContext(turnResult.threadCoord, decision),
|
|
174
|
-
|
|
174
|
+
answerKind,
|
|
175
175
|
}),
|
|
176
176
|
);
|
|
177
177
|
},
|
|
@@ -204,7 +204,7 @@ export class QgridDispatcherClass {
|
|
|
204
204
|
cb.onComplete(
|
|
205
205
|
applyToolCallEmulation(toEmulationResult(turnResult), input.tools, {
|
|
206
206
|
threadCoord: issuedCoord,
|
|
207
|
-
|
|
207
|
+
answerKind,
|
|
208
208
|
}),
|
|
209
209
|
);
|
|
210
210
|
},
|
|
@@ -343,19 +343,6 @@ describe("QgridFrame.query request logging", () => {
|
|
|
343
343
|
expect(finishRunWithErrorMock).toHaveBeenCalledWith(41, "request log unavailable", args);
|
|
344
344
|
});
|
|
345
345
|
|
|
346
|
-
it("rejects legacy logMode instead of silently enabling logging", async () => {
|
|
347
|
-
const legacyInput = {
|
|
348
|
-
prompt: "hi",
|
|
349
|
-
model: "openai/gpt-5-codex",
|
|
350
|
-
logMode: "none",
|
|
351
|
-
} as unknown as Parameters<typeof QgridFrame.query>[0];
|
|
352
|
-
|
|
353
|
-
await expect(QgridFrame.query(legacyInput)).rejects.toThrow(/logMode is no longer supported/);
|
|
354
|
-
|
|
355
|
-
expect(beforeQueryMock).not.toHaveBeenCalled();
|
|
356
|
-
expect(dispatcherQueryMock).not.toHaveBeenCalled();
|
|
357
|
-
});
|
|
358
|
-
|
|
359
346
|
it.each([
|
|
360
347
|
["malformed JSON", '{"type":"object"'],
|
|
361
348
|
["unsupported top-level array schema", '{"type":"array","items":{"type":"string"}}'],
|
|
@@ -703,9 +690,7 @@ describe("QgridFrame.query request logging", () => {
|
|
|
703
690
|
expect(dispatcherQueryMock).not.toHaveBeenCalled();
|
|
704
691
|
});
|
|
705
692
|
|
|
706
|
-
it("
|
|
707
|
-
expect(QueryInput.safeParse({ prompt: "hi", logMode: "none" }).success).toBe(false);
|
|
708
|
-
expect(QueryInput.safeParse({ prompt: "hi", logMode: undefined }).success).toBe(false);
|
|
693
|
+
it("accepts logger: false in the wire schema", () => {
|
|
709
694
|
expect(QueryInput.safeParse({ prompt: "hi", logger: false }).success).toBe(true);
|
|
710
695
|
});
|
|
711
696
|
|
|
@@ -1082,7 +1067,7 @@ describe("QgridFrame.queryStream request logging", () => {
|
|
|
1082
1067
|
expect(generateStream).toHaveBeenCalledOnce();
|
|
1083
1068
|
expect(finishRunWithErrorMock).toHaveBeenCalledWith(
|
|
1084
1069
|
52,
|
|
1085
|
-
expect.stringContaining("invalid
|
|
1070
|
+
expect.stringContaining("invalid tool envelope"),
|
|
1086
1071
|
args,
|
|
1087
1072
|
);
|
|
1088
1073
|
const errorMessage = finishRunWithErrorMock.mock.calls[0]?.[1];
|
|
@@ -95,13 +95,6 @@ function rejectImageGenerationStream(args: QueryInput): void {
|
|
|
95
95
|
);
|
|
96
96
|
}
|
|
97
97
|
|
|
98
|
-
function rejectLegacyLogMode(args: QueryInput): void {
|
|
99
|
-
if (!Object.hasOwn(args, "logMode")) return;
|
|
100
|
-
throw new BadRequestException(
|
|
101
|
-
"qgrid: logMode is no longer supported; use logger: false to disable request logging." as LocalizedString,
|
|
102
|
-
);
|
|
103
|
-
}
|
|
104
|
-
|
|
105
98
|
function rejectInvalidCallerSchemas(args: QueryInput): void {
|
|
106
99
|
if (args.jsonSchema === undefined && !args.tools?.length) return;
|
|
107
100
|
|
|
@@ -172,7 +165,6 @@ class QgridFrameClass extends BaseFrameClass {
|
|
|
172
165
|
|
|
173
166
|
@api({ httpMethod: "POST", clients: ["axios", "tanstack-mutation"] })
|
|
174
167
|
async query(args: QueryInput): Promise<QueryOutput> {
|
|
175
|
-
rejectLegacyLogMode(args);
|
|
176
168
|
rejectInvalidCallerSchemas(args);
|
|
177
169
|
const disconnect = createHttpDisconnectHandle();
|
|
178
170
|
try {
|
|
@@ -222,7 +214,6 @@ class QgridFrameClass extends BaseFrameClass {
|
|
|
222
214
|
|
|
223
215
|
@api({ httpMethod: "POST", clients: ["axios", "tanstack-mutation"] })
|
|
224
216
|
async prepareStream(args: QueryInput): Promise<{ streamId: string }> {
|
|
225
|
-
rejectLegacyLogMode(args);
|
|
226
217
|
rejectImageGenerationStream(args);
|
|
227
218
|
rejectInvalidCallerSchemas(args);
|
|
228
219
|
const streamId = crypto.randomUUID();
|
|
@@ -237,7 +228,6 @@ class QgridFrameClass extends BaseFrameClass {
|
|
|
237
228
|
const args = pendingStreams.get(streamId);
|
|
238
229
|
pendingStreams.delete(streamId);
|
|
239
230
|
if (!args) throw new Error("invalid or expired streamId");
|
|
240
|
-
rejectLegacyLogMode(args);
|
|
241
231
|
rejectImageGenerationStream(args);
|
|
242
232
|
|
|
243
233
|
const ctx = Sonamu.getContext();
|