@cartanova/qgrid-cli 2.9.4 → 2.9.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bundle/dist/application/qgrid/expired-token-reminder.js +6 -5
- package/bundle/dist/application/qgrid/qgrid-image-generation.js +12 -3
- package/bundle/dist/application/qgrid/qgrid-response-format.js +14 -12
- package/bundle/dist/application/qgrid/qgrid-run-lifecycle.js +2 -2
- package/bundle/dist/application/qgrid/qgrid.types.js +44 -4
- package/bundle/dist/application/qgrid/tool-emulation.js +4 -2
- package/bundle/dist/application/setting/setting.model.js +8 -2
- package/bundle/dist/utils/providers/openai/openai-backend-protocol.js +22 -3
- package/bundle/dist/utils/providers/openai/openai-direct-client.js +39 -1
- package/bundle/dist/utils/providers/openai/openai-dispatcher.js +47 -21
- package/bundle/dist/utils/providers/openai/openai-image-generation.js +146 -0
- package/bundle/dist/utils/providers/openai/openai-quota.js +11 -3
- package/bundle/dist/utils/providers/openai/openai-refresh.js +7 -5
- package/bundle/dist/utils/slack-notify.js +8 -4
- package/bundle/src/application/qgrid/expired-token-reminder.test.ts +6 -1
- package/bundle/src/application/qgrid/expired-token-reminder.ts +10 -4
- package/bundle/src/application/qgrid/qgrid-image-generation.test.ts +53 -0
- package/bundle/src/application/qgrid/qgrid-image-generation.ts +32 -2
- package/bundle/src/application/qgrid/qgrid-response-format.test.ts +32 -1
- package/bundle/src/application/qgrid/qgrid-response-format.ts +28 -18
- package/bundle/src/application/qgrid/qgrid-run-lifecycle.test.ts +32 -0
- package/bundle/src/application/qgrid/qgrid-run-lifecycle.ts +1 -1
- package/bundle/src/application/qgrid/qgrid.types.ts +47 -5
- package/bundle/src/application/qgrid/tool-emulation.test.ts +25 -0
- package/bundle/src/application/qgrid/tool-emulation.ts +6 -1
- package/bundle/src/application/setting/setting.model.test.ts +20 -0
- package/bundle/src/application/setting/setting.model.ts +10 -2
- package/bundle/src/application/sonamu.generated.http +4 -2
- package/bundle/src/utils/providers/common/provider-dispatcher.ts +8 -2
- package/bundle/src/utils/providers/openai/openai-backend-protocol.test.ts +23 -0
- package/bundle/src/utils/providers/openai/openai-backend-protocol.ts +27 -2
- package/bundle/src/utils/providers/openai/openai-direct-client.ts +48 -1
- package/bundle/src/utils/providers/openai/openai-dispatcher.test.ts +155 -2
- package/bundle/src/utils/providers/openai/openai-dispatcher.ts +54 -19
- package/bundle/src/utils/providers/openai/openai-image-generation.test.ts +152 -0
- package/bundle/src/utils/providers/openai/openai-image-generation.ts +183 -0
- package/bundle/src/utils/providers/openai/openai-quota.test.ts +32 -0
- package/bundle/src/utils/providers/openai/openai-quota.ts +15 -8
- package/bundle/src/utils/providers/openai/openai-refresh.test.ts +18 -0
- package/bundle/src/utils/providers/openai/openai-refresh.ts +11 -4
- package/bundle/src/utils/slack-notify.test.ts +14 -0
- package/bundle/src/utils/slack-notify.ts +19 -3
- package/bundle/web-dist/client/assets/{index-fogJvajr.js → index-BtVmANcA.js} +3 -3
- package/bundle/web-dist/client/assets/{logs-CsY2cqvt.js → logs-BCuaLfPL.js} +1 -1
- package/bundle/web-dist/client/assets/{monit-ChgaLEcD.js → monit-BkGkzl6m.js} +1 -1
- package/bundle/web-dist/client/assets/{routes-BvyiTnOZ.js → routes-DqY8SXcB.js} +1 -1
- package/bundle/web-dist/client/assets/{settings-ZR2J9rWb.js → settings-DbkDAJfh.js} +1 -1
- package/bundle/web-dist/client/assets/{show-CjwO4-So.js → show-Dx5JFzwy.js} +1 -1
- package/bundle/web-dist/client/assets/{tokens-Bx-hG1gm.js → tokens-DHahzDQJ.js} +1 -1
- package/bundle/web-dist/client/assets/{use-oauth-login-flow-Bqax_icS.js → use-oauth-login-flow-Cjdnj_8D.js} +1 -1
- package/bundle/web-dist/client/index.html +1 -1
- package/bundle/web-dist/server/entry-server.generated.js +1 -1
- package/package.json +2 -1
- package/skills/qgrid/SKILL.md +8 -1
- package/skills/qgrid/references/ai-sdk-provider-contract.md +4 -2
- package/skills/qgrid/references/decision-rationale.md +2 -2
- package/skills/qgrid/references/openai-codex-runtime.md +9 -1
- package/skills/qgrid/references/request-log-run-lifecycle.md +1 -1
- package/skills/qgrid/references/token-auth-quota-lifecycle.md +1 -1
|
@@ -99,7 +99,9 @@ function appendImages(content, images) {
|
|
|
99
99
|
return [...content, ...images.map((image) => ({
|
|
100
100
|
type: "image",
|
|
101
101
|
data: image.data,
|
|
102
|
-
|
|
102
|
+
...image.mediaType ? { mediaType: image.mediaType } : {},
|
|
103
|
+
revisedPrompt: image.revisedPrompt ?? null,
|
|
104
|
+
...image.generation ? { generation: image.generation } : {}
|
|
103
105
|
}))];
|
|
104
106
|
}
|
|
105
107
|
function assertStructuredEnvelopeComplexity(root) {
|
|
@@ -125,4 +127,4 @@ function assertStructuredEnvelopeComplexity(root) {
|
|
|
125
127
|
//#endregion
|
|
126
128
|
export { ToolCallEmulationError, applyToolCallEmulation };
|
|
127
129
|
|
|
128
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9vbC1lbXVsYXRpb24uanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2FwcGxpY2F0aW9uL3FncmlkL3Rvb2wtZW11bGF0aW9uLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEJ1ZmZlciB9IGZyb20gXCJub2RlOmJ1ZmZlclwiO1xuXG5pbXBvcnQgeyBnZXRMb2dnZXIgfSBmcm9tIFwiQGxvZ3RhcGUvbG9ndGFwZVwiO1xuaW1wb3J0IHsgeiB9IGZyb20gXCJ6b2RcIjtcblxuLy8g7J2R64u1KOuqqOuNuCDstpzroKUpIGVudmVsb3BlIOydmCDsnpDsm5Ag7ZWc64+ELiBjYWxsZXIg7Iqk7YKk66eIIOyghOyymOumrCDtlZzrj4QoQ0FMTEVSX1NDSEVNQV9MSU1JVFMp7JmAIOqwkuydtFxuLy8g6rCZ7JWEIOuztOyXrOuPhCDshJzroZwg64uk66W4IOyekOybkOydhCDsp4DtgqTripQg64+F66a9IOyDgeyImOuLpCDigJQg7Iqk7YKk66eIIOq5iuydtOuKlCDsnbjsiqTthLTsiqQg6rmK7J2066W8IGJvdW5kIO2VmOyngFxuLy8g7JWK7Jy866+A66GcKOyerOq3gCAkcmVmIO2XiOyaqSkg7LqY65+sIO2VnOuPhOulvCDsobDsoJXtlbTrj4Qg7J2R64u1IOyImOyaqSDquLDspIDsnbQg65Sw6528IOybgOyngeyXrOyEoCDslYgg65Cc64ukLlxuY29uc3QgU1RSVUNUVVJFRF9FTlZFTE9QRV9MSU1JVFMgPSB7XG4gIG1heFV0ZjhCeXRlczogNTEyICogMTAyNCxcbiAgbWF4Tm9kZXM6IDIwXzAwMCxcbiAgbWF4RGVwdGg6IDEzMixcbn0gYXMgY29uc3Q7XG5pbXBvcnQge1xuICB0eXBlIFFncmlkQ29udGVudCxcbiAgdHlwZSBRZ3JpZFRocmVhZENvb3JkLFxuICB0eXBlIFFncmlkVG9vbCxcbiAgdHlwZSBRdWVyeU91dHB1dCxcbn0gZnJvbSBcIi4vcWdyaWQudHlwZXNcIjtcblxuY29uc3QgbG9nZ2VyID0gZ2V0TG9nZ2VyKFtcInFncmlkXCIsIFwidG9vbC1lbXVsYXRpb25cIl0pO1xuXG50eXBlIEVtdWxhdGlvblJlc3VsdCA9IE9taXQ8UXVlcnlPdXRwdXQsIFwiY29udGVudFwiIHwgXCJmaW5pc2hSZWFzb25cIiB8IFwicnVuQ29udGV4dFwiPjtcbnR5cGUgVG9vbENhbGwgPSB7IHRvb2xOYW1lOiBzdHJpbmc7IGFyZ3M6IHN0cmluZyB9O1xuXG4vLyBlbnZlbG9wZSDripQge3Jlc3VsdDogPHVuaW9uPn0g7ZWcIOqyuSDqtazsobAg4oCUIOyKpO2CpOuniCDqt7zqsbDripQgdG9vbC1lbXVsYXRpb24tc2NoZW1hLnRzIOywuOyhsC5cbi8vIGFuc3dlciDtg4DsnoXrp4wg7JqU7LKtIO2Yle2DnOyXkCDrlLDrnbwg64uk66W064ukOiB0b29scy1vbmx5IOuKlCBzdHJpbmco6re464yA66GcIOuwmO2ZmCksXG4vLyB0b29scytqc29uU2NoZW1hIOuKlCDsgqzsmqnsnpAg7Iqk7YKk66eI7J2YIEpTT04g6rCSKEpTT04uc3RyaW5naWZ5IOuhnCDrsJjtmZgpLlxuZnVuY3Rpb24gYnVpbGRFbnZlbG9wZVNjaGVtYShhbnN3ZXJLaW5kOiBBbnN3ZXJLaW5kKSB7XG4gIHJldHVybiB6LnN0cmljdE9iamVjdCh7XG4gICAgcmVzdWx0OiB6LmRpc2NyaW1pbmF0ZWRVbmlvbihcImFjdGlvblwiLCBbXG4gICAgICB6LnN0cmljdE9iamVjdCh7XG4gICAgICAgIGFjdGlvbjogei5saXRlcmFsKFwiYW5zd2VyXCIpLFxuICAgICAgICBhbnN3ZXI6XG4gICAgICAgICAgYW5zd2VyS2luZCA9PT0gXCJ0ZXh0XCJcbiAgICAgICAgICAgID8gei5zdHJpbmcoKVxuICAgICAgICAgICAgOiB6Lmpzb24oKS5yZWZpbmUoKGFuc3dlcikgPT4gYW5zd2VyICE9PSBudWxsLCB7XG4gICAgICAgICAgICAgICAgbWVzc2FnZTogXCJhbnN3ZXIgbXVzdCBiZSBub24tbnVsbFwiLFxuICAgICAgICAgICAgICB9KSxcbiAgICAgICAgdG9vbENhbGxzOiB6Lm51bGwoKSxcbiAgICAgIH0pLFxuICAgICAgei5zdHJpY3RPYmplY3Qoe1xuICAgICAgICBhY3Rpb246IHoubGl0ZXJhbChcInRvb2xfY2FsbFwiKSxcbiAgICAgICAgYW5zd2VyOiB6Lm51bGwoKSxcbiAgICAgICAgdG9vbENhbGxzOiB6XG4gICAgICAgICAgLmFycmF5KFxuICAgICAgICAgICAgei5zdHJpY3RPYmplY3Qoe1xuICAgICAgICAgICAgICB0b29sTmFtZTogei5zdHJpbmcoKSxcbiAgICAgICAgICAgICAgYXJnczogei5zdHJpbmcoKSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgIClcbiAgICAgICAgICAubWluKDEpLFxuICAgICAgfSksXG4gICAgXSksXG4gIH0pO1xufVxuXG5jb25zdCBURVhUX0VOVkVMT1BFID0gYnVpbGRFbnZlbG9wZVNjaGVtYShcInRleHRcIik7XG5jb25zdCBKU09OX0VOVkVMT1BFID0gYnVpbGRFbnZlbG9wZVNjaGVtYShcImpzb25cIik7XG50eXBlIEVudmVsb3BlUmVzcG9uc2UgPSB6LmluZmVyPHR5cGVvZiBKU09OX0VOVkVMT1BFPltcInJlc3VsdFwiXTtcblxuZXhwb3J0IGNsYXNzIFRvb2xDYWxsRW11bGF0aW9uRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZykge1xuICAgIHN1cGVyKGB0b29sLWNhbGwgZW11bGF0aW9uOiAke21lc3NhZ2V9YCk7XG4gICAgdGhpcy5uYW1lID0gXCJUb29sQ2FsbEVtdWxhdGlvbkVycm9yXCI7XG4gIH1cbn1cblxuLy8gZGlzcGF0Y2hlciDqsIAg64SY6riw64qUIOydtOuvuOyngCDqsrDqs7wuIHFncmlkIOuKlCBiYXNlNjQgcGF5bG9hZCDrp4wg7KCE64us7ZWY6rOgIO2PrOunt+ydgCDrs7TsnqXtlZjsp4Ag7JWK64qU64ukLlxuaW50ZXJmYWNlIEVtdWxhdGlvbkltYWdlIHtcbiAgZGF0YTogc3RyaW5nO1xuICByZXZpc2VkUHJvbXB0Pzogc3RyaW5nIHwgbnVsbDtcbn1cblxuLy8gYW5zd2VyIOyduOy9lOuUqSDsooXrpZguIGVudmVsb3BlIOuUlOy9lOuNlOuKlCDtlZwg67KM7J206rOgIOydtCDqsJLsnYAgYW5zd2VyIOu4jOuenOy5mOydmCDtg4DsnoXqs7xcbi8vIOy1nOyihSDsp4HroKztmZQodGV4dDog6re464yA66GcIC8ganNvbjogSlNPTi5zdHJpbmdpZnkp66eMIOqwgOuluOuLpC5cbmV4cG9ydCB0eXBlIEFuc3dlcktpbmQgPSBcInRleHRcIiB8IFwianNvblwiO1xuXG5pbnRlcmZhY2UgVG9vbENhbGxFbXVsYXRpb25PcHRpb25zIHtcbiAgdGhyZWFkQ29vcmQ/OiBRZ3JpZFRocmVhZENvb3JkO1xuICBpbWFnZXM/OiBFbXVsYXRpb25JbWFnZVtdO1xuICAvLyDtlYTsiJg6IO2YuOy2nOu2gOqwgCBhbnN3ZXIg7J247L2U65Sp7J2EIO2VreyDgSDrqoXsi5ztlbTslbwg7ZWc64ukIChpbnB1dC5qc29uU2NoZW1hIOycoOustOuhnCDtjJDsoJUpLlxuICBhbnN3ZXJLaW5kOiBBbnN3ZXJLaW5kO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYXBwbHlUb29sQ2FsbEVtdWxhdGlvbihcbiAgcmVzdWx0OiBFbXVsYXRpb25SZXN1bHQsXG4gIHRvb2xzOiBRZ3JpZFRvb2xbXSB8IHVuZGVmaW5lZCxcbiAgb3B0aW9uczogVG9vbENhbGxFbXVsYXRpb25PcHRpb25zLFxuKTogUXVlcnlPdXRwdXQge1xuICBjb25zdCB7IHRocmVhZENvb3JkLCBpbWFnZXMsIGFuc3dlcktpbmQgfSA9IG9wdGlvbnM7XG4gIGNvbnN0IHJ1bkNvbnRleHQgPSB0aHJlYWRDb29yZCA/IHsgdGhyZWFkQ29vcmQgfSA6IHVuZGVmaW5lZDtcblxuICBpZiAoIXRvb2xzPy5sZW5ndGgpIHtcbiAgICByZXR1cm4gYW5zd2VyT3V0cHV0KHJlc3VsdCwgcmVzdWx0LnRleHQsIGltYWdlcywgcnVuQ29udGV4dCk7XG4gIH1cblxuICBjb25zdCBwYXJzZWQgPSBwYXJzZUVudmVsb3BlKHJlc3VsdC50ZXh0LCB0b29scywgYW5zd2VyS2luZCk7XG4gIGlmIChwYXJzZWQuYWN0aW9uID09PSBcInRvb2xfY2FsbFwiKSB7XG4gICAgcmV0dXJuIHRvb2xDYWxsT3V0cHV0KHJlc3VsdCwgcGFyc2VkLnRvb2xDYWxscywgaW1hZ2VzLCBydW5Db250ZXh0KTtcbiAgfVxuXG4gIHJldHVybiBhbnN3ZXJPdXRwdXQoXG4gICAgcmVzdWx0LFxuICAgIGFuc3dlcktpbmQgPT09IFwidGV4dFwiID8gKHBhcnNlZC5hbnN3ZXIgYXMgc3RyaW5nKSA6IEpTT04uc3RyaW5naWZ5KHBhcnNlZC5hbnN3ZXIpLFxuICAgIGltYWdlcyxcbiAgICBydW5Db250ZXh0LFxuICApO1xufVxuXG5mdW5jdGlvbiBwYXJzZUVudmVsb3BlKHRleHQ6IHN0cmluZywgdG9vbHM6IFFncmlkVG9vbFtdLCBhbnN3ZXJLaW5kOiBBbnN3ZXJLaW5kKSB7XG4gIGlmIChCdWZmZXIuYnl0ZUxlbmd0aCh0ZXh0LCBcInV0ZjhcIikgPiBTVFJVQ1RVUkVEX0VOVkVMT1BFX0xJTUlUUy5tYXhVdGY4Qnl0ZXMpIHtcbiAgICB0aHJvdyBuZXcgVG9vbENhbGxFbXVsYXRpb25FcnJvcihcbiAgICAgIGB0b29sIGVudmVsb3BlIGV4Y2VlZHMgVVRGLTggYnl0ZSBsaW1pdCBvZiAke1NUUlVDVFVSRURfRU5WRUxPUEVfTElNSVRTLm1heFV0ZjhCeXRlc31gLFxuICAgICk7XG4gIH1cblxuICBsZXQgdmFsdWU6IHVua25vd247XG4gIHRyeSB7XG4gICAgdmFsdWUgPSBKU09OLnBhcnNlKHRleHQpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIC8vIOq0gOyaqSDtj7TrsLEg7JeG7J2MLiBvcGVuYWkg64qUIGVudmVsb3BlIOydtCBzdHJ1Y3R1cmVkIG91dHB1dCDsnLzroZwg6rCV7KCc65CY66+A66GcIOyXrOq4sCDrj4Tri6ztlZxcbiAgICAvLyDruYQgSlNPTiDsnYAg67KE6re464ukLiBhbnRocm9waWMg7J2AIOqzhOyVveydhCDtlITroaztlITtirjroZzrp4wg7JWI64K07ZWY66+A66GcKFNPTi01MzIpIOu5hCBKU09OIOydtFxuICAgIC8vIFwi7JiI7IOBIOqwgOuKpe2VnCDrqqjrjbgg7Iuk7YyoXCLsp4Drp4wsIOq3uOuemOuPhCDqtazsoJztlZjsp4Ag7JWK64qU64ukIOKAlCDqs7zqsbDsnZgg7YWN7Iqk7Yq4IOq1rOygnOuKlCDth7TtmZRcbiAgICAvLyDrtIntiKzrpbwg64u167OA7Jy866GcIO2dmOugpOuztOuCtCDsobDsmqntlZwg7Jik7Je87J2EIOunjOuTpOyXiOuLpCgyMDI2LTA3IG1lZHBhdGgsIDEzLjVrIOqxtCkuXG4gICAgLy8g7KCV7KeB7ZWcIOyLpO2MqOqwgCDrs7Tsl6zslbwg7IaM67mE7J6Q6rCAIOyerOyLnOuPhO2VmOqxsOuCmCDqt7zrs7gg7JuQ7J247J2EIOqzoOy5nOuLpC5cbiAgICAvLyDsp4Tri6jsl5DripQg7JyE67CYIOybkOusuOydmCDrqLjrpqzqsIAg7ZWE7JqU7ZWY64ukKFNPTi00OTUg7KCE66GAKSDigJQgcGFyc2Ug7JeQ65+sIOychOy5mOunjOycvOuhnOuKlFxuICAgIC8vIFwi7ZSE66Gc7KaI66GcIOuLte2WiOuKlOyngCAvIO2OnOyKpOqwgCDrgqjslZjripTsp4AgLyBKU09OIOydtCDsnpjroLjripTsp4BcIuulvCDqtazrtoTtlaAg7IiYIOyXhuuLpC5cbiAgICBjb25zdCBoZWFkID0gSlNPTi5zdHJpbmdpZnkodGV4dC5zbGljZSgwLCAyMDApKTtcbiAgICBsb2dnZXIud2FybihgdG9vbCBlbnZlbG9wZSBwYXJzZSBmYWlsZWQ6ICR7KGVycm9yIGFzIEVycm9yKS5tZXNzYWdlfTsgaGVhZD0ke2hlYWR9YCk7XG4gICAgdGhyb3cgbmV3IFRvb2xDYWxsRW11bGF0aW9uRXJyb3IoXG4gICAgICBgaW52YWxpZCB0b29sIGVudmVsb3BlIChyZXNwb25zZSBpcyBub3QgSlNPTiDigJQgdGhlIG1vZGVsIGlnbm9yZWQgdGhlIGVudmVsb3BlIGNvbnRyYWN0OyByZXRyeSBpcyB0aGUgY2FsbGVyJ3MgZGVjaXNpb24pOiAkeyhlcnJvciBhcyBFcnJvcikubWVzc2FnZX07IHJlc3BvbnNlIGhlYWQ6ICR7aGVhZH1gLFxuICAgICk7XG4gIH1cblxuICBhc3NlcnRTdHJ1Y3R1cmVkRW52ZWxvcGVDb21wbGV4aXR5KHZhbHVlKTtcbiAgY29uc3Qgc2NoZW1hID0gYW5zd2VyS2luZCA9PT0gXCJ0ZXh0XCIgPyBURVhUX0VOVkVMT1BFIDogSlNPTl9FTlZFTE9QRTtcbiAgY29uc3QgdmFsaWRhdGlvbiA9IHNjaGVtYS5zYWZlUGFyc2UodmFsdWUpO1xuICBpZiAoIXZhbGlkYXRpb24uc3VjY2Vzcykge1xuICAgIGNvbnN0IGlzc3VlID0gdmFsaWRhdGlvbi5lcnJvci5pc3N1ZXNbMF07XG4gICAgY29uc3QgcGF0aCA9IGlzc3VlICYmIGlzc3VlLnBhdGgubGVuZ3RoID4gMCA/IGAgYXQgJHtpc3N1ZS5wYXRoLmpvaW4oXCIuXCIpfWAgOiBcIlwiO1xuICAgIGNvbnN0IGRldGFpbCA9IGlzc3VlPy5tZXNzYWdlID8/IFwidW5rbm93biB2YWxpZGF0aW9uIGlzc3VlXCI7XG4gICAgLy8gdmFsaWQgSlNPTiDsnbTsp4Drp4wg6rOE7JW9IOychOuwmOyduCDqsr3smrDsl5Drj4Qg7JuQ66y4IOuouOumrOulvCDrgqjquLTri6Qg4oCUIHpvZCDqsr3roZzrp4zsnLzroZzripRcbiAgICAvLyBcIu2CpCDsg53rnrXsnbjsp4AgLyDrnpjtjbzroZwg6rCQ7IyM64qU7KeAIC8g7YOA7J6F7J20IO2LgOuguOuKlOyngFwi7J2YIOyLpOusvOydhCDrs7wg7IiYIOyXhuuLpC5cbiAgICBjb25zdCBoZWFkID0gSlNPTi5zdHJpbmdpZnkodGV4dC5zbGljZSgwLCAyMDApKTtcbiAgICBsb2dnZXIud2FybihgdG9vbCBlbnZlbG9wZSB2YWxpZGF0aW9uIGZhaWxlZCR7cGF0aH06ICR7ZGV0YWlsfTsgaGVhZD0ke2hlYWR9YCk7XG4gICAgdGhyb3cgbmV3IFRvb2xDYWxsRW11bGF0aW9uRXJyb3IoXG4gICAgICBgaW52YWxpZCB0b29sIGVudmVsb3BlJHtwYXRofTogJHtkZXRhaWx9OyByZXNwb25zZSBoZWFkOiAke2hlYWR9YCxcbiAgICApO1xuICB9XG5cbiAgLy8gWm9kIGNsb25lcyBKU09OIG9iamVjdHMgYW5kIGRyb3BzIG93biBcIl9fcHJvdG9fX1wiIGtleXMuIFRoZSBwYXJzZWQgSlNPTiBpcyBzYWZlIHRvIHJldHVyblxuICAvLyBhZnRlciB2YWxpZGF0aW9uIGFuZCBwcmVzZXJ2ZXMgdGhlIGNhbGxlcidzIGV4YWN0IHN0cnVjdHVyZWQgdmFsdWUuXG4gIGNvbnN0IHJlc3BvbnNlID0gKHZhbHVlIGFzIHsgcmVzdWx0OiBFbnZlbG9wZVJlc3BvbnNlIH0pLnJlc3VsdDtcbiAgaWYgKHJlc3BvbnNlLmFjdGlvbiA9PT0gXCJ0b29sX2NhbGxcIikge1xuICAgIGNvbnN0IHVua25vd25Ub29sID0gZmluZFVua25vd25Ub29sKHJlc3BvbnNlLnRvb2xDYWxscywgdG9vbHMpO1xuICAgIGlmICh1bmtub3duVG9vbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgVG9vbENhbGxFbXVsYXRpb25FcnJvcihgdW5rbm93biBlbXVsYXRlZCB0b29sOiAke3Vua25vd25Ub29sfWApO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzcG9uc2U7XG59XG5cbmZ1bmN0aW9uIHRvb2xDYWxsT3V0cHV0KFxuICByZXN1bHQ6IEVtdWxhdGlvblJlc3VsdCxcbiAgdG9vbENhbGxzOiBUb29sQ2FsbFtdLFxuICBpbWFnZXM6IEVtdWxhdGlvbkltYWdlW10gfCB1bmRlZmluZWQsXG4gIHJ1bkNvbnRleHQ6IFF1ZXJ5T3V0cHV0W1wicnVuQ29udGV4dFwiXSxcbik6IFF1ZXJ5T3V0cHV0IHtcbiAgcmV0dXJuIHtcbiAgICAuLi5yZXN1bHQsXG4gICAgY29udGVudDogYXBwZW5kSW1hZ2VzKFxuICAgICAgdG9vbENhbGxzLm1hcCgodG9vbENhbGwpID0+ICh7XG4gICAgICAgIHR5cGU6IFwidG9vbC1jYWxsXCIsXG4gICAgICAgIHRvb2xDYWxsSWQ6IGBjYWxsXyR7TWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc2xpY2UoMiwgMTApfWAsXG4gICAgICAgIHRvb2xOYW1lOiB0b29sQ2FsbC50b29sTmFtZSxcbiAgICAgICAgaW5wdXQ6IHRvb2xDYWxsLmFyZ3MsXG4gICAgICB9KSksXG4gICAgICBpbWFnZXMsXG4gICAgKSxcbiAgICBmaW5pc2hSZWFzb246IFwidG9vbC1jYWxsc1wiLFxuICAgIHJ1bkNvbnRleHQsXG4gIH07XG59XG5cbmZ1bmN0aW9uIGFuc3dlck91dHB1dChcbiAgcmVzdWx0OiBFbXVsYXRpb25SZXN1bHQsXG4gIHRleHQ6IHN0cmluZyxcbiAgaW1hZ2VzOiBFbXVsYXRpb25JbWFnZVtdIHwgdW5kZWZpbmVkLFxuICBydW5Db250ZXh0OiBRdWVyeU91dHB1dFtcInJ1bkNvbnRleHRcIl0sXG4pOiBRdWVyeU91dHB1dCB7XG4gIHJldHVybiB7XG4gICAgLi4ucmVzdWx0LFxuICAgIHRleHQsXG4gICAgY29udGVudDogYXBwZW5kSW1hZ2VzKFt7IHR5cGU6IFwidGV4dFwiLCB0ZXh0IH1dLCBpbWFnZXMpLFxuICAgIGZpbmlzaFJlYXNvbjogXCJzdG9wXCIsXG4gICAgcnVuQ29udGV4dCxcbiAgfTtcbn1cblxuZnVuY3Rpb24gZmluZFVua25vd25Ub29sKHRvb2xDYWxsczogVG9vbENhbGxbXSwgdG9vbHM6IFFncmlkVG9vbFtdKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3Qga25vd25Ub29sTmFtZXMgPSBuZXcgU2V0KHRvb2xzLm1hcCgodG9vbCkgPT4gdG9vbC5uYW1lKSk7XG4gIHJldHVybiB0b29sQ2FsbHMuZmluZCgodG9vbENhbGwpID0+ICFrbm93blRvb2xOYW1lcy5oYXModG9vbENhbGwudG9vbE5hbWUpKT8udG9vbE5hbWU7XG59XG5cbmZ1bmN0aW9uIGFwcGVuZEltYWdlcyhjb250ZW50OiBRZ3JpZENvbnRlbnRbXSwgaW1hZ2VzPzogRW11bGF0aW9uSW1hZ2VbXSk6IFFncmlkQ29udGVudFtdIHtcbiAgaWYgKCFpbWFnZXM/Lmxlbmd0aCkgcmV0dXJuIGNvbnRlbnQ7XG4gIHJldHVybiBbXG4gICAgLi4uY29udGVudCxcbiAgICAuLi5pbWFnZXMubWFwKFxuICAgICAgKGltYWdlKTogUWdyaWRDb250ZW50ID0+ICh7XG4gICAgICAgIHR5cGU6IFwiaW1hZ2VcIixcbiAgICAgICAgZGF0YTogaW1hZ2UuZGF0YSxcbiAgICAgICAgcmV2aXNlZFByb21wdDogaW1hZ2UucmV2aXNlZFByb21wdCA/PyBudWxsLFxuICAgICAgfSksXG4gICAgKSxcbiAgXTtcbn1cblxuZnVuY3Rpb24gYXNzZXJ0U3RydWN0dXJlZEVudmVsb3BlQ29tcGxleGl0eShyb290OiB1bmtub3duKTogdm9pZCB7XG4gIGNvbnN0IG1heERlcHRoID0gU1RSVUNUVVJFRF9FTlZFTE9QRV9MSU1JVFMubWF4RGVwdGg7XG4gIGNvbnN0IHN0YWNrID0gW3sgdmFsdWU6IHJvb3QsIGRlcHRoOiAwIH1dO1xuICBsZXQgbm9kZXMgPSAwO1xuXG4gIHdoaWxlIChzdGFjay5sZW5ndGggPiAwKSB7XG4gICAgY29uc3QgY3VycmVudCA9IHN0YWNrLnBvcCgpITtcbiAgICBub2RlcyArPSAxO1xuICAgIGlmIChub2RlcyA+IFNUUlVDVFVSRURfRU5WRUxPUEVfTElNSVRTLm1heE5vZGVzKSB7XG4gICAgICB0aHJvdyBuZXcgVG9vbENhbGxFbXVsYXRpb25FcnJvcihcbiAgICAgICAgYHN0cnVjdHVyZWQtb3V0cHV0IGVudmVsb3BlIGV4Y2VlZHMgbm9kZSBsaW1pdCBvZiAke1NUUlVDVFVSRURfRU5WRUxPUEVfTElNSVRTLm1heE5vZGVzfWAsXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoY3VycmVudC5kZXB0aCA+IG1heERlcHRoKSB7XG4gICAgICB0aHJvdyBuZXcgVG9vbENhbGxFbXVsYXRpb25FcnJvcihcbiAgICAgICAgYHN0cnVjdHVyZWQtb3V0cHV0IGVudmVsb3BlIGV4Y2VlZHMgZGVwdGggbGltaXQgb2YgJHttYXhEZXB0aH1gLFxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBjdXJyZW50LnZhbHVlID09PSBcIm51bWJlclwiICYmICFOdW1iZXIuaXNGaW5pdGUoY3VycmVudC52YWx1ZSkpIHtcbiAgICAgIHRocm93IG5ldyBUb29sQ2FsbEVtdWxhdGlvbkVycm9yKFwiYW5zd2VyIG11c3QgYmUgdmFsaWQgSlNPTlwiKTtcbiAgICB9XG4gICAgaWYgKGN1cnJlbnQudmFsdWUgPT09IG51bGwgfHwgdHlwZW9mIGN1cnJlbnQudmFsdWUgIT09IFwib2JqZWN0XCIpIGNvbnRpbnVlO1xuXG4gICAgZm9yIChjb25zdCB2YWx1ZSBvZiBPYmplY3QudmFsdWVzKGN1cnJlbnQudmFsdWUpKSB7XG4gICAgICBzdGFjay5wdXNoKHsgdmFsdWUsIGRlcHRoOiBjdXJyZW50LmRlcHRoICsgMSB9KTtcbiAgICB9XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7OztBQVFBLE1BQU0sNkJBQTZCO0NBQ2pDLGNBQWMsTUFBTTtDQUNwQixVQUFVO0NBQ1YsVUFBVTtBQUNaO0FBUUEsTUFBTSxTQUFTLFVBQVUsQ0FBQyxTQUFTLGdCQUFnQixDQUFDO0FBUXBELFNBQVMsb0JBQW9CLFlBQXdCO0NBQ25ELE9BQU8sRUFBRSxhQUFhLEVBQ3BCLFFBQVEsRUFBRSxtQkFBbUIsVUFBVSxDQUNyQyxFQUFFLGFBQWE7RUFDYixRQUFRLEVBQUUsUUFBUSxRQUFRO0VBQzFCLFFBQ0UsZUFBZSxTQUNYLEVBQUUsT0FBTyxJQUNULEVBQUUsS0FBSyxDQUFDLENBQUMsUUFBUSxXQUFXLFdBQVcsTUFBTSxFQUMzQyxTQUFTLDBCQUNYLENBQUM7RUFDUCxXQUFXLEVBQUUsS0FBSztDQUNwQixDQUFDLEdBQ0QsRUFBRSxhQUFhO0VBQ2IsUUFBUSxFQUFFLFFBQVEsV0FBVztFQUM3QixRQUFRLEVBQUUsS0FBSztFQUNmLFdBQVcsRUFDUixNQUNDLEVBQUUsYUFBYTtHQUNiLFVBQVUsRUFBRSxPQUFPO0dBQ25CLE1BQU0sRUFBRSxP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
|
|
130
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9vbC1lbXVsYXRpb24uanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2FwcGxpY2F0aW9uL3FncmlkL3Rvb2wtZW11bGF0aW9uLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEJ1ZmZlciB9IGZyb20gXCJub2RlOmJ1ZmZlclwiO1xuXG5pbXBvcnQgeyBnZXRMb2dnZXIgfSBmcm9tIFwiQGxvZ3RhcGUvbG9ndGFwZVwiO1xuaW1wb3J0IHsgeiB9IGZyb20gXCJ6b2RcIjtcblxuLy8g7J2R64u1KOuqqOuNuCDstpzroKUpIGVudmVsb3BlIOydmCDsnpDsm5Ag7ZWc64+ELiBjYWxsZXIg7Iqk7YKk66eIIOyghOyymOumrCDtlZzrj4QoQ0FMTEVSX1NDSEVNQV9MSU1JVFMp7JmAIOqwkuydtFxuLy8g6rCZ7JWEIOuztOyXrOuPhCDshJzroZwg64uk66W4IOyekOybkOydhCDsp4DtgqTripQg64+F66a9IOyDgeyImOuLpCDigJQg7Iqk7YKk66eIIOq5iuydtOuKlCDsnbjsiqTthLTsiqQg6rmK7J2066W8IGJvdW5kIO2VmOyngFxuLy8g7JWK7Jy866+A66GcKOyerOq3gCAkcmVmIO2XiOyaqSkg7LqY65+sIO2VnOuPhOulvCDsobDsoJXtlbTrj4Qg7J2R64u1IOyImOyaqSDquLDspIDsnbQg65Sw6528IOybgOyngeyXrOyEoCDslYgg65Cc64ukLlxuY29uc3QgU1RSVUNUVVJFRF9FTlZFTE9QRV9MSU1JVFMgPSB7XG4gIG1heFV0ZjhCeXRlczogNTEyICogMTAyNCxcbiAgbWF4Tm9kZXM6IDIwXzAwMCxcbiAgbWF4RGVwdGg6IDEzMixcbn0gYXMgY29uc3Q7XG5pbXBvcnQge1xuICB0eXBlIEltYWdlR2VuZXJhdGlvbk1ldGFkYXRhLFxuICB0eXBlIFFncmlkQ29udGVudCxcbiAgdHlwZSBRZ3JpZFRocmVhZENvb3JkLFxuICB0eXBlIFFncmlkVG9vbCxcbiAgdHlwZSBRdWVyeU91dHB1dCxcbn0gZnJvbSBcIi4vcWdyaWQudHlwZXNcIjtcblxuY29uc3QgbG9nZ2VyID0gZ2V0TG9nZ2VyKFtcInFncmlkXCIsIFwidG9vbC1lbXVsYXRpb25cIl0pO1xuXG50eXBlIEVtdWxhdGlvblJlc3VsdCA9IE9taXQ8UXVlcnlPdXRwdXQsIFwiY29udGVudFwiIHwgXCJmaW5pc2hSZWFzb25cIiB8IFwicnVuQ29udGV4dFwiPjtcbnR5cGUgVG9vbENhbGwgPSB7IHRvb2xOYW1lOiBzdHJpbmc7IGFyZ3M6IHN0cmluZyB9O1xuXG4vLyBlbnZlbG9wZSDripQge3Jlc3VsdDogPHVuaW9uPn0g7ZWcIOqyuSDqtazsobAg4oCUIOyKpO2CpOuniCDqt7zqsbDripQgdG9vbC1lbXVsYXRpb24tc2NoZW1hLnRzIOywuOyhsC5cbi8vIGFuc3dlciDtg4DsnoXrp4wg7JqU7LKtIO2Yle2DnOyXkCDrlLDrnbwg64uk66W064ukOiB0b29scy1vbmx5IOuKlCBzdHJpbmco6re464yA66GcIOuwmO2ZmCksXG4vLyB0b29scytqc29uU2NoZW1hIOuKlCDsgqzsmqnsnpAg7Iqk7YKk66eI7J2YIEpTT04g6rCSKEpTT04uc3RyaW5naWZ5IOuhnCDrsJjtmZgpLlxuZnVuY3Rpb24gYnVpbGRFbnZlbG9wZVNjaGVtYShhbnN3ZXJLaW5kOiBBbnN3ZXJLaW5kKSB7XG4gIHJldHVybiB6LnN0cmljdE9iamVjdCh7XG4gICAgcmVzdWx0OiB6LmRpc2NyaW1pbmF0ZWRVbmlvbihcImFjdGlvblwiLCBbXG4gICAgICB6LnN0cmljdE9iamVjdCh7XG4gICAgICAgIGFjdGlvbjogei5saXRlcmFsKFwiYW5zd2VyXCIpLFxuICAgICAgICBhbnN3ZXI6XG4gICAgICAgICAgYW5zd2VyS2luZCA9PT0gXCJ0ZXh0XCJcbiAgICAgICAgICAgID8gei5zdHJpbmcoKVxuICAgICAgICAgICAgOiB6Lmpzb24oKS5yZWZpbmUoKGFuc3dlcikgPT4gYW5zd2VyICE9PSBudWxsLCB7XG4gICAgICAgICAgICAgICAgbWVzc2FnZTogXCJhbnN3ZXIgbXVzdCBiZSBub24tbnVsbFwiLFxuICAgICAgICAgICAgICB9KSxcbiAgICAgICAgdG9vbENhbGxzOiB6Lm51bGwoKSxcbiAgICAgIH0pLFxuICAgICAgei5zdHJpY3RPYmplY3Qoe1xuICAgICAgICBhY3Rpb246IHoubGl0ZXJhbChcInRvb2xfY2FsbFwiKSxcbiAgICAgICAgYW5zd2VyOiB6Lm51bGwoKSxcbiAgICAgICAgdG9vbENhbGxzOiB6XG4gICAgICAgICAgLmFycmF5KFxuICAgICAgICAgICAgei5zdHJpY3RPYmplY3Qoe1xuICAgICAgICAgICAgICB0b29sTmFtZTogei5zdHJpbmcoKSxcbiAgICAgICAgICAgICAgYXJnczogei5zdHJpbmcoKSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgIClcbiAgICAgICAgICAubWluKDEpLFxuICAgICAgfSksXG4gICAgXSksXG4gIH0pO1xufVxuXG5jb25zdCBURVhUX0VOVkVMT1BFID0gYnVpbGRFbnZlbG9wZVNjaGVtYShcInRleHRcIik7XG5jb25zdCBKU09OX0VOVkVMT1BFID0gYnVpbGRFbnZlbG9wZVNjaGVtYShcImpzb25cIik7XG50eXBlIEVudmVsb3BlUmVzcG9uc2UgPSB6LmluZmVyPHR5cGVvZiBKU09OX0VOVkVMT1BFPltcInJlc3VsdFwiXTtcblxuZXhwb3J0IGNsYXNzIFRvb2xDYWxsRW11bGF0aW9uRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZykge1xuICAgIHN1cGVyKGB0b29sLWNhbGwgZW11bGF0aW9uOiAke21lc3NhZ2V9YCk7XG4gICAgdGhpcy5uYW1lID0gXCJUb29sQ2FsbEVtdWxhdGlvbkVycm9yXCI7XG4gIH1cbn1cblxuLy8gUHJlc2VydmUgaW1hZ2UgYnl0ZXMgYW5kIHRoZSBwcm92aWRlcidzIHJlc29sdmVkIE1JTUUgdHlwZS5cbmludGVyZmFjZSBFbXVsYXRpb25JbWFnZSB7XG4gIGRhdGE6IHN0cmluZztcbiAgbWVkaWFUeXBlPzogRXh0cmFjdDxRZ3JpZENvbnRlbnQsIHsgdHlwZTogXCJpbWFnZVwiIH0+W1wibWVkaWFUeXBlXCJdO1xuICByZXZpc2VkUHJvbXB0Pzogc3RyaW5nIHwgbnVsbDtcbiAgZ2VuZXJhdGlvbj86IEltYWdlR2VuZXJhdGlvbk1ldGFkYXRhO1xufVxuXG4vLyBhbnN3ZXIg7J247L2U65SpIOyiheulmC4gZW52ZWxvcGUg65SU7L2U642U64qUIO2VnCDrsozsnbTqs6Ag7J20IOqwkuydgCBhbnN3ZXIg67iM656c7LmY7J2YIO2DgOyeheqzvFxuLy8g7LWc7KKFIOyngeugrO2ZlCh0ZXh0OiDqt7jrjIDroZwgLyBqc29uOiBKU09OLnN0cmluZ2lmeSnrp4wg6rCA66W464ukLlxuZXhwb3J0IHR5cGUgQW5zd2VyS2luZCA9IFwidGV4dFwiIHwgXCJqc29uXCI7XG5cbmludGVyZmFjZSBUb29sQ2FsbEVtdWxhdGlvbk9wdGlvbnMge1xuICB0aHJlYWRDb29yZD86IFFncmlkVGhyZWFkQ29vcmQ7XG4gIGltYWdlcz86IEVtdWxhdGlvbkltYWdlW107XG4gIC8vIO2VhOyImDog7Zi47Lac67aA6rCAIGFuc3dlciDsnbjsvZTrlKnsnYQg7ZWt7IOBIOuqheyLnO2VtOyVvCDtlZzri6QgKGlucHV0Lmpzb25TY2hlbWEg7Jyg66y066GcIO2MkOyglSkuXG4gIGFuc3dlcktpbmQ6IEFuc3dlcktpbmQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhcHBseVRvb2xDYWxsRW11bGF0aW9uKFxuICByZXN1bHQ6IEVtdWxhdGlvblJlc3VsdCxcbiAgdG9vbHM6IFFncmlkVG9vbFtdIHwgdW5kZWZpbmVkLFxuICBvcHRpb25zOiBUb29sQ2FsbEVtdWxhdGlvbk9wdGlvbnMsXG4pOiBRdWVyeU91dHB1dCB7XG4gIGNvbnN0IHsgdGhyZWFkQ29vcmQsIGltYWdlcywgYW5zd2VyS2luZCB9ID0gb3B0aW9ucztcbiAgY29uc3QgcnVuQ29udGV4dCA9IHRocmVhZENvb3JkID8geyB0aHJlYWRDb29yZCB9IDogdW5kZWZpbmVkO1xuXG4gIGlmICghdG9vbHM/Lmxlbmd0aCkge1xuICAgIHJldHVybiBhbnN3ZXJPdXRwdXQocmVzdWx0LCByZXN1bHQudGV4dCwgaW1hZ2VzLCBydW5Db250ZXh0KTtcbiAgfVxuXG4gIGNvbnN0IHBhcnNlZCA9IHBhcnNlRW52ZWxvcGUocmVzdWx0LnRleHQsIHRvb2xzLCBhbnN3ZXJLaW5kKTtcbiAgaWYgKHBhcnNlZC5hY3Rpb24gPT09IFwidG9vbF9jYWxsXCIpIHtcbiAgICByZXR1cm4gdG9vbENhbGxPdXRwdXQocmVzdWx0LCBwYXJzZWQudG9vbENhbGxzLCBpbWFnZXMsIHJ1bkNvbnRleHQpO1xuICB9XG5cbiAgcmV0dXJuIGFuc3dlck91dHB1dChcbiAgICByZXN1bHQsXG4gICAgYW5zd2VyS2luZCA9PT0gXCJ0ZXh0XCIgPyAocGFyc2VkLmFuc3dlciBhcyBzdHJpbmcpIDogSlNPTi5zdHJpbmdpZnkocGFyc2VkLmFuc3dlciksXG4gICAgaW1hZ2VzLFxuICAgIHJ1bkNvbnRleHQsXG4gICk7XG59XG5cbmZ1bmN0aW9uIHBhcnNlRW52ZWxvcGUodGV4dDogc3RyaW5nLCB0b29sczogUWdyaWRUb29sW10sIGFuc3dlcktpbmQ6IEFuc3dlcktpbmQpIHtcbiAgaWYgKEJ1ZmZlci5ieXRlTGVuZ3RoKHRleHQsIFwidXRmOFwiKSA+IFNUUlVDVFVSRURfRU5WRUxPUEVfTElNSVRTLm1heFV0ZjhCeXRlcykge1xuICAgIHRocm93IG5ldyBUb29sQ2FsbEVtdWxhdGlvbkVycm9yKFxuICAgICAgYHRvb2wgZW52ZWxvcGUgZXhjZWVkcyBVVEYtOCBieXRlIGxpbWl0IG9mICR7U1RSVUNUVVJFRF9FTlZFTE9QRV9MSU1JVFMubWF4VXRmOEJ5dGVzfWAsXG4gICAgKTtcbiAgfVxuXG4gIGxldCB2YWx1ZTogdW5rbm93bjtcbiAgdHJ5IHtcbiAgICB2YWx1ZSA9IEpTT04ucGFyc2UodGV4dCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgLy8g6rSA7JqpIO2PtOuwsSDsl4bsnYwuIG9wZW5haSDripQgZW52ZWxvcGUg7J20IHN0cnVjdHVyZWQgb3V0cHV0IOycvOuhnCDqsJXsoJzrkJjrr4DroZwg7Jes6riwIOuPhOuLrO2VnFxuICAgIC8vIOu5hCBKU09OIOydgCDrsoTqt7jri6QuIGFudGhyb3BpYyDsnYAg6rOE7JW97J2EIO2UhOuhrO2UhO2KuOuhnOunjCDslYjrgrTtlZjrr4DroZwoU09OLTUzMikg67mEIEpTT04g7J20XG4gICAgLy8gXCLsmIjsg4Eg6rCA64ql7ZWcIOuqqOuNuCDsi6TtjKhcIuyngOunjCwg6re4656Y64+EIOq1rOygnO2VmOyngCDslYrripTri6Qg4oCUIOqzvOqxsOydmCDthY3siqTtirgg6rWs7KCc64qUIO2HtO2ZlFxuICAgIC8vIOu0ie2IrOulvCDri7Xrs4DsnLzroZwg7Z2Y66Ck67O064K0IOyhsOyaqe2VnCDsmKTsl7zsnYQg66eM65Ok7JeI64ukKDIwMjYtMDcgbWVkcGF0aCwgMTMuNWsg6rG0KS5cbiAgICAvLyDsoJXsp4HtlZwg7Iuk7Yyo6rCAIOuztOyXrOyVvCDshozruYTsnpDqsIAg7J6s7Iuc64+E7ZWY6rGw64KYIOq3vOuzuCDsm5DsnbjsnYQg6rOg7Lmc64ukLlxuICAgIC8vIOynhOuLqOyXkOuKlCDsnITrsJgg7JuQ66y47J2YIOuouOumrOqwgCDtlYTsmpTtlZjri6QoU09OLTQ5NSDsoITroYApIOKAlCBwYXJzZSDsl5Drn6wg7JyE7LmY66eM7Jy866Gc64qUXG4gICAgLy8gXCLtlITroZzspojroZwg64u17ZaI64qU7KeAIC8g7Y6c7Iqk6rCAIOuCqOyVmOuKlOyngCAvIEpTT04g7J20IOyemOuguOuKlOyngFwi66W8IOq1rOu2hO2VoCDsiJgg7JeG64ukLlxuICAgIGNvbnN0IGhlYWQgPSBKU09OLnN0cmluZ2lmeSh0ZXh0LnNsaWNlKDAsIDIwMCkpO1xuICAgIGxvZ2dlci53YXJuKGB0b29sIGVudmVsb3BlIHBhcnNlIGZhaWxlZDogJHsoZXJyb3IgYXMgRXJyb3IpLm1lc3NhZ2V9OyBoZWFkPSR7aGVhZH1gKTtcbiAgICB0aHJvdyBuZXcgVG9vbENhbGxFbXVsYXRpb25FcnJvcihcbiAgICAgIGBpbnZhbGlkIHRvb2wgZW52ZWxvcGUgKHJlc3BvbnNlIGlzIG5vdCBKU09OIOKAlCB0aGUgbW9kZWwgaWdub3JlZCB0aGUgZW52ZWxvcGUgY29udHJhY3Q7IHJldHJ5IGlzIHRoZSBjYWxsZXIncyBkZWNpc2lvbik6ICR7KGVycm9yIGFzIEVycm9yKS5tZXNzYWdlfTsgcmVzcG9uc2UgaGVhZDogJHtoZWFkfWAsXG4gICAgKTtcbiAgfVxuXG4gIGFzc2VydFN0cnVjdHVyZWRFbnZlbG9wZUNvbXBsZXhpdHkodmFsdWUpO1xuICBjb25zdCBzY2hlbWEgPSBhbnN3ZXJLaW5kID09PSBcInRleHRcIiA/IFRFWFRfRU5WRUxPUEUgOiBKU09OX0VOVkVMT1BFO1xuICBjb25zdCB2YWxpZGF0aW9uID0gc2NoZW1hLnNhZmVQYXJzZSh2YWx1ZSk7XG4gIGlmICghdmFsaWRhdGlvbi5zdWNjZXNzKSB7XG4gICAgY29uc3QgaXNzdWUgPSB2YWxpZGF0aW9uLmVycm9yLmlzc3Vlc1swXTtcbiAgICBjb25zdCBwYXRoID0gaXNzdWUgJiYgaXNzdWUucGF0aC5sZW5ndGggPiAwID8gYCBhdCAke2lzc3VlLnBhdGguam9pbihcIi5cIil9YCA6IFwiXCI7XG4gICAgY29uc3QgZGV0YWlsID0gaXNzdWU/Lm1lc3NhZ2UgPz8gXCJ1bmtub3duIHZhbGlkYXRpb24gaXNzdWVcIjtcbiAgICAvLyB2YWxpZCBKU09OIOydtOyngOunjCDqs4Tslb0g7JyE67CY7J24IOqyveyasOyXkOuPhCDsm5DrrLgg66i466as66W8IOuCqOq4tOuLpCDigJQgem9kIOqyveuhnOunjOycvOuhnOuKlFxuICAgIC8vIFwi7YKkIOyDneueteyduOyngCAvIOuemO2NvOuhnCDqsJDsjIzripTsp4AgLyDtg4DsnoXsnbQg7YuA66C464qU7KeAXCLsnZgg7Iuk66y87J2EIOuzvCDsiJgg7JeG64ukLlxuICAgIGNvbnN0IGhlYWQgPSBKU09OLnN0cmluZ2lmeSh0ZXh0LnNsaWNlKDAsIDIwMCkpO1xuICAgIGxvZ2dlci53YXJuKGB0b29sIGVudmVsb3BlIHZhbGlkYXRpb24gZmFpbGVkJHtwYXRofTogJHtkZXRhaWx9OyBoZWFkPSR7aGVhZH1gKTtcbiAgICB0aHJvdyBuZXcgVG9vbENhbGxFbXVsYXRpb25FcnJvcihcbiAgICAgIGBpbnZhbGlkIHRvb2wgZW52ZWxvcGUke3BhdGh9OiAke2RldGFpbH07IHJlc3BvbnNlIGhlYWQ6ICR7aGVhZH1gLFxuICAgICk7XG4gIH1cblxuICAvLyBab2QgY2xvbmVzIEpTT04gb2JqZWN0cyBhbmQgZHJvcHMgb3duIFwiX19wcm90b19fXCIga2V5cy4gVGhlIHBhcnNlZCBKU09OIGlzIHNhZmUgdG8gcmV0dXJuXG4gIC8vIGFmdGVyIHZhbGlkYXRpb24gYW5kIHByZXNlcnZlcyB0aGUgY2FsbGVyJ3MgZXhhY3Qgc3RydWN0dXJlZCB2YWx1ZS5cbiAgY29uc3QgcmVzcG9uc2UgPSAodmFsdWUgYXMgeyByZXN1bHQ6IEVudmVsb3BlUmVzcG9uc2UgfSkucmVzdWx0O1xuICBpZiAocmVzcG9uc2UuYWN0aW9uID09PSBcInRvb2xfY2FsbFwiKSB7XG4gICAgY29uc3QgdW5rbm93blRvb2wgPSBmaW5kVW5rbm93blRvb2wocmVzcG9uc2UudG9vbENhbGxzLCB0b29scyk7XG4gICAgaWYgKHVua25vd25Ub29sICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBUb29sQ2FsbEVtdWxhdGlvbkVycm9yKGB1bmtub3duIGVtdWxhdGVkIHRvb2w6ICR7dW5rbm93blRvb2x9YCk7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXNwb25zZTtcbn1cblxuZnVuY3Rpb24gdG9vbENhbGxPdXRwdXQoXG4gIHJlc3VsdDogRW11bGF0aW9uUmVzdWx0LFxuICB0b29sQ2FsbHM6IFRvb2xDYWxsW10sXG4gIGltYWdlczogRW11bGF0aW9uSW1hZ2VbXSB8IHVuZGVmaW5lZCxcbiAgcnVuQ29udGV4dDogUXVlcnlPdXRwdXRbXCJydW5Db250ZXh0XCJdLFxuKTogUXVlcnlPdXRwdXQge1xuICByZXR1cm4ge1xuICAgIC4uLnJlc3VsdCxcbiAgICBjb250ZW50OiBhcHBlbmRJbWFnZXMoXG4gICAgICB0b29sQ2FsbHMubWFwKCh0b29sQ2FsbCkgPT4gKHtcbiAgICAgICAgdHlwZTogXCJ0b29sLWNhbGxcIixcbiAgICAgICAgdG9vbENhbGxJZDogYGNhbGxfJHtNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zbGljZSgyLCAxMCl9YCxcbiAgICAgICAgdG9vbE5hbWU6IHRvb2xDYWxsLnRvb2xOYW1lLFxuICAgICAgICBpbnB1dDogdG9vbENhbGwuYXJncyxcbiAgICAgIH0pKSxcbiAgICAgIGltYWdlcyxcbiAgICApLFxuICAgIGZpbmlzaFJlYXNvbjogXCJ0b29sLWNhbGxzXCIsXG4gICAgcnVuQ29udGV4dCxcbiAgfTtcbn1cblxuZnVuY3Rpb24gYW5zd2VyT3V0cHV0KFxuICByZXN1bHQ6IEVtdWxhdGlvblJlc3VsdCxcbiAgdGV4dDogc3RyaW5nLFxuICBpbWFnZXM6IEVtdWxhdGlvbkltYWdlW10gfCB1bmRlZmluZWQsXG4gIHJ1bkNvbnRleHQ6IFF1ZXJ5T3V0cHV0W1wicnVuQ29udGV4dFwiXSxcbik6IFF1ZXJ5T3V0cHV0IHtcbiAgcmV0dXJuIHtcbiAgICAuLi5yZXN1bHQsXG4gICAgdGV4dCxcbiAgICBjb250ZW50OiBhcHBlbmRJbWFnZXMoW3sgdHlwZTogXCJ0ZXh0XCIsIHRleHQgfV0sIGltYWdlcyksXG4gICAgZmluaXNoUmVhc29uOiBcInN0b3BcIixcbiAgICBydW5Db250ZXh0LFxuICB9O1xufVxuXG5mdW5jdGlvbiBmaW5kVW5rbm93blRvb2wodG9vbENhbGxzOiBUb29sQ2FsbFtdLCB0b29sczogUWdyaWRUb29sW10pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCBrbm93blRvb2xOYW1lcyA9IG5ldyBTZXQodG9vbHMubWFwKCh0b29sKSA9PiB0b29sLm5hbWUpKTtcbiAgcmV0dXJuIHRvb2xDYWxscy5maW5kKCh0b29sQ2FsbCkgPT4gIWtub3duVG9vbE5hbWVzLmhhcyh0b29sQ2FsbC50b29sTmFtZSkpPy50b29sTmFtZTtcbn1cblxuZnVuY3Rpb24gYXBwZW5kSW1hZ2VzKGNvbnRlbnQ6IFFncmlkQ29udGVudFtdLCBpbWFnZXM/OiBFbXVsYXRpb25JbWFnZVtdKTogUWdyaWRDb250ZW50W10ge1xuICBpZiAoIWltYWdlcz8ubGVuZ3RoKSByZXR1cm4gY29udGVudDtcbiAgcmV0dXJuIFtcbiAgICAuLi5jb250ZW50LFxuICAgIC4uLmltYWdlcy5tYXAoXG4gICAgICAoaW1hZ2UpOiBRZ3JpZENvbnRlbnQgPT4gKHtcbiAgICAgICAgdHlwZTogXCJpbWFnZVwiLFxuICAgICAgICBkYXRhOiBpbWFnZS5kYXRhLFxuICAgICAgICAuLi4oaW1hZ2UubWVkaWFUeXBlID8geyBtZWRpYVR5cGU6IGltYWdlLm1lZGlhVHlwZSB9IDoge30pLFxuICAgICAgICByZXZpc2VkUHJvbXB0OiBpbWFnZS5yZXZpc2VkUHJvbXB0ID8/IG51bGwsXG4gICAgICAgIC4uLihpbWFnZS5nZW5lcmF0aW9uID8geyBnZW5lcmF0aW9uOiBpbWFnZS5nZW5lcmF0aW9uIH0gOiB7fSksXG4gICAgICB9KSxcbiAgICApLFxuICBdO1xufVxuXG5mdW5jdGlvbiBhc3NlcnRTdHJ1Y3R1cmVkRW52ZWxvcGVDb21wbGV4aXR5KHJvb3Q6IHVua25vd24pOiB2b2lkIHtcbiAgY29uc3QgbWF4RGVwdGggPSBTVFJVQ1RVUkVEX0VOVkVMT1BFX0xJTUlUUy5tYXhEZXB0aDtcbiAgY29uc3Qgc3RhY2sgPSBbeyB2YWx1ZTogcm9vdCwgZGVwdGg6IDAgfV07XG4gIGxldCBub2RlcyA9IDA7XG5cbiAgd2hpbGUgKHN0YWNrLmxlbmd0aCA+IDApIHtcbiAgICBjb25zdCBjdXJyZW50ID0gc3RhY2sucG9wKCkhO1xuICAgIG5vZGVzICs9IDE7XG4gICAgaWYgKG5vZGVzID4gU1RSVUNUVVJFRF9FTlZFTE9QRV9MSU1JVFMubWF4Tm9kZXMpIHtcbiAgICAgIHRocm93IG5ldyBUb29sQ2FsbEVtdWxhdGlvbkVycm9yKFxuICAgICAgICBgc3RydWN0dXJlZC1vdXRwdXQgZW52ZWxvcGUgZXhjZWVkcyBub2RlIGxpbWl0IG9mICR7U1RSVUNUVVJFRF9FTlZFTE9QRV9MSU1JVFMubWF4Tm9kZXN9YCxcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChjdXJyZW50LmRlcHRoID4gbWF4RGVwdGgpIHtcbiAgICAgIHRocm93IG5ldyBUb29sQ2FsbEVtdWxhdGlvbkVycm9yKFxuICAgICAgICBgc3RydWN0dXJlZC1vdXRwdXQgZW52ZWxvcGUgZXhjZWVkcyBkZXB0aCBsaW1pdCBvZiAke21heERlcHRofWAsXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGN1cnJlbnQudmFsdWUgPT09IFwibnVtYmVyXCIgJiYgIU51bWJlci5pc0Zpbml0ZShjdXJyZW50LnZhbHVlKSkge1xuICAgICAgdGhyb3cgbmV3IFRvb2xDYWxsRW11bGF0aW9uRXJyb3IoXCJhbnN3ZXIgbXVzdCBiZSB2YWxpZCBKU09OXCIpO1xuICAgIH1cbiAgICBpZiAoY3VycmVudC52YWx1ZSA9PT0gbnVsbCB8fCB0eXBlb2YgY3VycmVudC52YWx1ZSAhPT0gXCJvYmplY3RcIikgY29udGludWU7XG5cbiAgICBmb3IgKGNvbnN0IHZhbHVlIG9mIE9iamVjdC52YWx1ZXMoY3VycmVudC52YWx1ZSkpIHtcbiAgICAgIHN0YWNrLnB1c2goeyB2YWx1ZSwgZGVwdGg6IGN1cnJlbnQuZGVwdGggKyAxIH0pO1xuICAgIH1cbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7O0FBUUEsTUFBTSw2QkFBNkI7Q0FDakMsY0FBYyxNQUFNO0NBQ3BCLFVBQVU7Q0FDVixVQUFVO0FBQ1o7QUFTQSxNQUFNLFNBQVMsVUFBVSxDQUFDLFNBQVMsZ0JBQWdCLENBQUM7QUFRcEQsU0FBUyxvQkFBb0IsWUFBd0I7Q0FDbkQsT0FBTyxFQUFFLGFBQWEsRUFDcEIsUUFBUSxFQUFFLG1CQUFtQixVQUFVLENBQ3JDLEVBQUUsYUFBYTtFQUNiLFFBQVEsRUFBRSxRQUFRLFFBQVE7RUFDMUIsUUFDRSxlQUFlLFNBQ1gsRUFBRSxP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
|
|
@@ -6,6 +6,7 @@ import { detectSupervisor } from "../../utils/process-supervisor.js";
|
|
|
6
6
|
import { armServerRestartExit, beginServerRestart } from "../../utils/server-restart.js";
|
|
7
7
|
import { SETTING_DEFS, TOKEN_WINDOW_KEEPALIVE_RUNNER_ENV_KEY, findSettingDef, maskSecret, validateSettingValue } from "./setting.constant.js";
|
|
8
8
|
import { getSetting, isStored, resetSetting, saveSetting } from "./setting.store.js";
|
|
9
|
+
import { SlackNotificationError } from "../../utils/slack-notify.js";
|
|
9
10
|
import { BadRequestException, BaseModelClass, NotFoundException, SoException, Sonamu, api, asArray, exhaustive } from "sonamu";
|
|
10
11
|
import { getLogger } from "@logtape/logtape";
|
|
11
12
|
//#region src/application/setting/setting.model.ts
|
|
@@ -215,7 +216,12 @@ var SettingModelClass = class extends BaseModelClass {
|
|
|
215
216
|
*/
|
|
216
217
|
async triggerExpiryReminder() {
|
|
217
218
|
const { sendExpiredTokenReminderNow } = await import("../qgrid/expired-token-reminder.js");
|
|
218
|
-
|
|
219
|
+
try {
|
|
220
|
+
return { sent: await sendExpiredTokenReminderNow() };
|
|
221
|
+
} catch (error) {
|
|
222
|
+
if (error instanceof SlackNotificationError) throw new BadRequestException(error.message);
|
|
223
|
+
throw error;
|
|
224
|
+
}
|
|
219
225
|
}
|
|
220
226
|
/**
|
|
221
227
|
* 서버를 재시작한다 — 정확히는 스스로 종료하고, pm2 가 다시 띄우는 것에 맡긴다.
|
|
@@ -314,4 +320,4 @@ const SettingModel = new SettingModelClass();
|
|
|
314
320
|
//#endregion
|
|
315
321
|
export { SettingModel };
|
|
316
322
|
|
|
317
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2V0dGluZy5tb2RlbC5qcyIsIm5hbWVzIjpbInNhdmVTdG9yZWRTZXR0aW5nIiwicmVzZXRTdG9yZWRTZXR0aW5nIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2FwcGxpY2F0aW9uL3NldHRpbmcvc2V0dGluZy5tb2RlbC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBnZXRMb2dnZXIgfSBmcm9tIFwiQGxvZ3RhcGUvbG9ndGFwZVwiO1xuaW1wb3J0IHtcbiAgQmFzZU1vZGVsQ2xhc3MsXG4gIHR5cGUgTGlzdFJlc3VsdCxcbiAgYXNBcnJheSxcbiAgTm90Rm91bmRFeGNlcHRpb24sXG4gIEJhZFJlcXVlc3RFeGNlcHRpb24sXG4gIFNvRXhjZXB0aW9uLFxuICBTb25hbXUsXG4gIGFwaSxcbiAgZXhoYXVzdGl2ZSxcbn0gZnJvbSBcInNvbmFtdVwiO1xuXG5pbXBvcnQgeyBTRCB9IGZyb20gXCIuLi8uLi9pMThuL3NkLmdlbmVyYXRlZFwiO1xuaW1wb3J0IHsgZGV0ZWN0U3VwZXJ2aXNvciB9IGZyb20gXCIuLi8uLi91dGlscy9wcm9jZXNzLXN1cGVydmlzb3JcIjtcbmltcG9ydCB7IGFybVNlcnZlclJlc3RhcnRFeGl0LCBiZWdpblNlcnZlclJlc3RhcnQgfSBmcm9tIFwiLi4vLi4vdXRpbHMvc2VydmVyLXJlc3RhcnRcIjtcbmltcG9ydCB7IHR5cGUgU2V0dGluZ1N1YnNldEtleSwgdHlwZSBTZXR0aW5nU3Vic2V0TWFwcGluZyB9IGZyb20gXCIuLi9zb25hbXUuZ2VuZXJhdGVkXCI7XG5pbXBvcnQgeyBzZXR0aW5nU3Vic2V0UXVlcmllcywgc2V0dGluZ0xvYWRlclF1ZXJpZXMgfSBmcm9tIFwiLi4vc29uYW11LmdlbmVyYXRlZC5zc29cIjtcbmltcG9ydCB7XG4gIGZpbmRTZXR0aW5nRGVmLFxuICBtYXNrU2VjcmV0LFxuICBTRVRUSU5HX0RFRlMsXG4gIFRPS0VOX1dJTkRPV19LRUVQQUxJVkVfUlVOTkVSX0VOVl9LRVksXG4gIHZhbGlkYXRlU2V0dGluZ1ZhbHVlLFxufSBmcm9tIFwiLi9zZXR0aW5nLmNvbnN0YW50XCI7XG5pbXBvcnQge1xuICBnZXRTZXR0aW5nLFxuICBpc1N0b3JlZCxcbiAgcmVzZXRTZXR0aW5nIGFzIHJlc2V0U3RvcmVkU2V0dGluZyxcbiAgc2F2ZVNldHRpbmcgYXMgc2F2ZVN0b3JlZFNldHRpbmcsXG59IGZyb20gXCIuL3NldHRpbmcuc3RvcmVcIjtcbmltcG9ydCB7XG4gIHR5cGUgUnVudGltZUluZm9JdGVtLFxuICB0eXBlIFNldHRpbmdBcHBsaWVzLFxuICB0eXBlIFNldHRpbmdJdGVtLFxuICB0eXBlIFNldHRpbmdMaXN0UGFyYW1zLFxuICB0eXBlIFNldHRpbmdTYXZlUGFyYW1zLFxuICB0eXBlIFNldHRpbmdzUmVzcG9uc2UsXG4gIHR5cGUgU3VwZXJ2aXNvcktpbmQsXG59IGZyb20gXCIuL3NldHRpbmcudHlwZXNcIjtcblxuY29uc3QgbG9nZ2VyID0gZ2V0TG9nZ2VyKFtcInFncmlkXCIsIFwic2V0dGluZ1wiXSk7XG5cbmNsYXNzIEZvcmJpZGRlbkV4Y2VwdGlvbiBleHRlbmRzIFNvRXhjZXB0aW9uIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoNDAzLCBTRChcImVycm9yLmZvcmJpZGRlblwiKSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZmlyc3RIZWFkZXJWYWx1ZSh2YWx1ZTogc3RyaW5nIHwgc3RyaW5nW10gfCB1bmRlZmluZWQpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICByZXR1cm4gKEFycmF5LmlzQXJyYXkodmFsdWUpID8gdmFsdWVbMF0gOiB2YWx1ZSk/LnNwbGl0KFwiLFwiKVswXT8udHJpbSgpO1xufVxuXG4vKiogT3JpZ2luIOyXhuuKlCDsmrTsmIEgQ0xJIOyalOyyreydgCDthrXqs7zsi5ztgqTrkJgsIOu4jOudvOyasOyggCDqtZDssKgg7Lac7LKYIFBPU1Qg64qUIOunieuKlOuLpC4gKi9cbmZ1bmN0aW9uIGFzc2VydFJlc3RhcnRPcmlnaW4oKTogdm9pZCB7XG4gIGNvbnN0IHsgaGVhZGVycyB9ID0gU29uYW11LmdldENvbnRleHQoKTtcbiAgY29uc3Qgb3JpZ2luID0gZmlyc3RIZWFkZXJWYWx1ZShoZWFkZXJzLm9yaWdpbik7XG4gIGlmIChoZWFkZXJzLm9yaWdpbiA9PT0gdW5kZWZpbmVkKSByZXR1cm47XG4gIGlmICghb3JpZ2luKSB0aHJvdyBuZXcgRm9yYmlkZGVuRXhjZXB0aW9uKCk7XG5cbiAgY29uc3QgaG9zdCA9IGZpcnN0SGVhZGVyVmFsdWUoaGVhZGVyc1tcIngtZm9yd2FyZGVkLWhvc3RcIl0pID8/IGZpcnN0SGVhZGVyVmFsdWUoaGVhZGVycy5ob3N0KTtcbiAgdHJ5IHtcbiAgICBpZiAoIWhvc3QgfHwgbmV3IFVSTChvcmlnaW4pLmhvc3QgIT09IGhvc3QpIHRocm93IG5ldyBGb3JiaWRkZW5FeGNlcHRpb24oKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBGb3JiaWRkZW5FeGNlcHRpb24pIHRocm93IGVycm9yO1xuICAgIHRocm93IG5ldyBGb3JiaWRkZW5FeGNlcHRpb24oKTtcbiAgfVxufVxuXG4vKlxuICBTZXR0aW5nIE1vZGVsXG4qL1xuY2xhc3MgU2V0dGluZ01vZGVsQ2xhc3MgZXh0ZW5kcyBCYXNlTW9kZWxDbGFzczxcbiAgU2V0dGluZ1N1YnNldEtleSxcbiAgU2V0dGluZ1N1YnNldE1hcHBpbmcsXG4gIHR5cGVvZiBzZXR0aW5nU3Vic2V0UXVlcmllcyxcbiAgdHlwZW9mIHNldHRpbmdMb2FkZXJRdWVyaWVzXG4+IHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoXCJTZXR0aW5nXCIsIHNldHRpbmdTdWJzZXRRdWVyaWVzLCBzZXR0aW5nTG9hZGVyUXVlcmllcyk7XG4gIH1cblxuICBAYXBpKHsgaHR0cE1ldGhvZDogXCJHRVRcIiwgY2xpZW50czogW1wiYXhpb3NcIiwgXCJ0YW5zdGFjay1xdWVyeVwiXSwgcmVzb3VyY2VOYW1lOiBcIlNldHRpbmdcIiB9KVxuICBhc3luYyBmaW5kQnlJZDxUIGV4dGVuZHMgU2V0dGluZ1N1YnNldEtleT4oXG4gICAgc3Vic2V0OiBULFxuICAgIGlkOiBudW1iZXIsXG4gICk6IFByb21pc2U8U2V0dGluZ1N1YnNldE1hcHBpbmdbVF0+IHtcbiAgICBjb25zdCB7IHJvd3MgfSA9IGF3YWl0IHRoaXMuZmluZE1hbnkoc3Vic2V0LCB7XG4gICAgICBpZCxcbiAgICAgIG51bTogMSxcbiAgICAgIHBhZ2U6IDEsXG4gICAgfSk7XG4gICAgaWYgKCFyb3dzWzBdKSB7XG4gICAgICB0aHJvdyBuZXcgTm90Rm91bmRFeGNlcHRpb24oU0QoXCJlcnJvci5lbnRpdHlOb3RGb3VuZFwiKShcIlNldHRpbmdcIiwgaWQpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcm93c1swXTtcbiAgfVxuXG4gIGFzeW5jIGZpbmRPbmU8VCBleHRlbmRzIFNldHRpbmdTdWJzZXRLZXk+KFxuICAgIHN1YnNldDogVCxcbiAgICBsaXN0UGFyYW1zOiBTZXR0aW5nTGlzdFBhcmFtcyxcbiAgKTogUHJvbWlzZTxTZXR0aW5nU3Vic2V0TWFwcGluZ1tUXSB8IG51bGw+IHtcbiAgICBjb25zdCB7IHJvd3MgfSA9IGF3YWl0IHRoaXMuZmluZE1hbnkoc3Vic2V0LCB7XG4gICAgICAuLi5saXN0UGFyYW1zLFxuICAgICAgbnVtOiAxLFxuICAgICAgcGFnZTogMSxcbiAgICB9KTtcblxuICAgIHJldHVybiByb3dzWzBdID8/IG51bGw7XG4gIH1cblxuICBAYXBpKHsgaHR0cE1ldGhvZDogXCJHRVRcIiwgY2xpZW50czogW1wiYXhpb3NcIiwgXCJ0YW5zdGFjay1xdWVyeVwiXSwgcmVzb3VyY2VOYW1lOiBcIlNldHRpbmdzXCIgfSlcbiAgYXN5bmMgZmluZE1hbnk8VCBleHRlbmRzIFNldHRpbmdTdWJzZXRLZXksIExQIGV4dGVuZHMgU2V0dGluZ0xpc3RQYXJhbXM+KFxuICAgIHN1YnNldDogVCxcbiAgICByYXdQYXJhbXM/OiBMUCxcbiAgKTogUHJvbWlzZTxMaXN0UmVzdWx0PExQLCBTZXR0aW5nU3Vic2V0TWFwcGluZ1tUXT4+IHtcbiAgICAvLyBwYXJhbXMgd2l0aCBkZWZhdWx0c1xuICAgIGNvbnN0IHBhcmFtcyA9IHtcbiAgICAgIG51bTogMjQsXG4gICAgICBwYWdlOiAxLFxuICAgICAgc2VhcmNoOiBcImtleVwiIGFzIGNvbnN0LFxuICAgICAgb3JkZXJCeTogXCJrZXktYXNjXCIgYXMgY29uc3QsXG4gICAgICAuLi5yYXdQYXJhbXMsXG4gICAgfSBzYXRpc2ZpZXMgU2V0dGluZ0xpc3RQYXJhbXM7XG5cbiAgICAvLyBidWlsZCBxdWVyaWVzXG4gICAgY29uc3QgeyBxYiwgb25TdWJzZXQ6IF8gfSA9IHRoaXMuZ2V0U3Vic2V0UXVlcmllcyhzdWJzZXQpO1xuXG4gICAgLy8gaWRcbiAgICBpZiAocGFyYW1zLmlkKSB7XG4gICAgICBxYi53aGVyZUluKFwic2V0dGluZ3MuaWRcIiwgYXNBcnJheShwYXJhbXMuaWQpKTtcbiAgICB9XG5cbiAgICAvLyBrZXkg4oCUIHRvRmlsdGVyIHByb3Ag7J207KeA66eMIOyKpOy6kO2PtOuUqeydtCDrp4zrk6TslrTso7zsp4Ag7JWK7JWEIOyngeygkSDqsbTri6QuXG4gICAgaWYgKHBhcmFtcy5rZXkpIHtcbiAgICAgIHFiLndoZXJlKFwic2V0dGluZ3Mua2V5XCIsIHBhcmFtcy5rZXkpO1xuICAgIH1cblxuICAgIC8vIHNlYXJjaC1rZXl3b3JkXG4gICAgaWYgKHBhcmFtcy5zZWFyY2ggJiYgcGFyYW1zLmtleXdvcmQgJiYgcGFyYW1zLmtleXdvcmQubGVuZ3RoID4gMCkge1xuICAgICAgaWYgKHBhcmFtcy5zZWFyY2ggPT09IFwia2V5XCIpIHtcbiAgICAgICAgcWIud2hlcmUoXCJzZXR0aW5ncy5rZXlcIiwgXCJsaWtlXCIsIGAlJHtwYXJhbXMua2V5d29yZH0lYCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgQmFkUmVxdWVzdEV4Y2VwdGlvbihTRChcImVycm9yLnVua25vd25TZWFyY2hGaWVsZFwiKShwYXJhbXMuc2VhcmNoKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gb3JkZXJCeVxuICAgIGlmIChwYXJhbXMub3JkZXJCeSkge1xuICAgICAgLy8gZGVmYXVsdCBvcmRlckJ5XG4gICAgICBpZiAocGFyYW1zLm9yZGVyQnkgPT09IFwia2V5LWFzY1wiKSB7XG4gICAgICAgIHFiLm9yZGVyQnkoXCJzZXR0aW5ncy5rZXlcIiwgXCJhc2NcIik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBleGhhdXN0aXZlKHBhcmFtcy5vcmRlckJ5KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBlbmhhbmNlcnMgPSB0aGlzLmNyZWF0ZUVuaGFuY2Vycyh7XG4gICAgICBBOiAocm93KSA9PiAoe1xuICAgICAgICAuLi5yb3csXG4gICAgICAgIC8vIOyEnOu4jOyFi+uzhOuhnCB2aXJ0dWFsIO2VhOuTnCDqs4TsgrDroZzsp4Eg7LaU6rCAXG4gICAgICB9KSxcbiAgICB9KTtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGVTdWJzZXRRdWVyeSh7XG4gICAgICBzdWJzZXQsXG4gICAgICBxYixcbiAgICAgIHBhcmFtcyxcbiAgICAgIGVuaGFuY2VycyxcbiAgICAgIGRlYnVnOiBmYWxzZSxcbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIHNhdmUoc3BhOiBTZXR0aW5nU2F2ZVBhcmFtc1tdKTogUHJvbWlzZTxudW1iZXJbXT4ge1xuICAgIGNvbnN0IHdkYiA9IHRoaXMuZ2V0UHVyaShcIndcIik7XG5cbiAgICAvLyByZWdpc3RlclxuICAgIHNwYS5mb3JFYWNoKChzcCkgPT4ge1xuICAgICAgd2RiLnViUmVnaXN0ZXIoXCJzZXR0aW5nc1wiLCBzcCk7XG4gICAgfSk7XG5cbiAgICAvLyB0cmFuc2FjdGlvblxuICAgIHJldHVybiB3ZGIudHJhbnNhY3Rpb24oYXN5bmMgKHRyeCkgPT4ge1xuICAgICAgY29uc3QgaWRzID0gYXdhaXQgdHJ4LnViVXBzZXJ0KFwic2V0dGluZ3NcIik7XG5cbiAgICAgIHJldHVybiBpZHM7XG4gICAgfSk7XG4gIH1cblxuICBhc3luYyBkZWwoaWRzOiBudW1iZXJbXSk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgY29uc3Qgd2RiID0gdGhpcy5nZXRQdXJpKFwid1wiKTtcblxuICAgIC8vIHRyYW5zYWN0aW9uXG4gICAgYXdhaXQgd2RiLnRyYW5zYWN0aW9uKGFzeW5jICh0cngpID0+IHtcbiAgICAgIHJldHVybiB0cngudGFibGUoXCJzZXR0aW5nc1wiKS53aGVyZUluKFwic2V0dGluZ3MuaWRcIiwgaWRzKS5kZWxldGUoKTtcbiAgICB9KTtcblxuICAgIHJldHVybiBpZHMubGVuZ3RoO1xuICB9XG5cbiAgLyoqIOyggOyepeuQnCDshKTsoJUg7KCE7LK066W8IGtleeKGknZhbHVlIOuhnC4g67aA7YyFIOyLnCDtlZwg67KIIOydveyWtCDrqZTrqqjrpqzsl5Ag7Jis66aw64ukLiAqL1xuICBhc3luYyBmaW5kQWxsQXNNYXAoKTogUHJvbWlzZTxNYXA8c3RyaW5nLCBzdHJpbmc+PiB7XG4gICAgY29uc3QgeyByb3dzIH0gPSBhd2FpdCB0aGlzLmZpbmRNYW55KFwiQVwiLCB7IG51bTogMCwgcGFnZTogMSB9KTtcbiAgICByZXR1cm4gbmV3IE1hcChyb3dzLm1hcCgocikgPT4gW3Iua2V5LCByLnZhbHVlXSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIGtleSDroZwgdXBzZXJ0IO2VnOuLpC4gYHNhdmVgIOuKlCBpZCDquLDspIDsnbTrnbwga2V5IOykkeuzteydhCDqsbjrn6zrgrTsp4Ag66q77ZW0LCDquLDsobQg7ZaJ7J2EIOuovOyggCDssL7slYRcbiAgICogaWQg66W8IOyLpOyWtCDrs7Trgrjri6QuXG4gICAqL1xuICBhc3luYyBzZXRCeUtleShrZXk6IHN0cmluZywgdmFsdWU6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGV4aXN0aW5nID0gYXdhaXQgdGhpcy5maW5kT25lKFwiQVwiLCB7IGtleSwgbnVtOiAxLCBwYWdlOiAxIH0pO1xuICAgIGF3YWl0IHRoaXMuc2F2ZShbXG4gICAgICB7XG4gICAgICAgIC4uLihleGlzdGluZyA/IHsgaWQ6IGV4aXN0aW5nLmlkIH0gOiB7fSksXG4gICAgICAgIGtleSxcbiAgICAgICAgdmFsdWUsXG4gICAgICAgIHVwZGF0ZWRfYXQ6IG5ldyBEYXRlKCksXG4gICAgICB9LFxuICAgIF0pO1xuICB9XG5cbiAgLyoqIOyggOyepeqwkuydhCDsp4Dsm4wgZW52IOq4sOuzuOqwkuycvOuhnCDrkJjrj4zrprDri6QuICovXG4gIGFzeW5jIGNsZWFyQnlLZXkoa2V5OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBleGlzdGluZyA9IGF3YWl0IHRoaXMuZmluZE9uZShcIkFcIiwgeyBrZXksIG51bTogMSwgcGFnZTogMSB9KTtcbiAgICBpZiAoZXhpc3RpbmcpIGF3YWl0IHRoaXMuZGVsKFtleGlzdGluZy5pZF0pO1xuICB9XG5cbiAgLyoqXG4gICAqIO2OuOynkSDqsIDriqXtlZwg7ISk7KCV6rO8IOydveq4sCDsoITsmqkg65+w7YOA7J6EIOygleuztC4g7Y647KeRIOuMgOyDgeydgCBgU0VUVElOR19ERUZTYCDsl5Ag7KCV7J2Y65CcIOqyg+u/kOydtOuLpCDigJRcbiAgICogREIg7KCR7IaNIOygleuztOuCmCDtj6ztirjripQg7ISc67KE6rCAIOucqOq4sCDsoITsl5Ag7ZWE7JqU7ZW0IO2ZlOuptOyXkOyEnCDrsJTqv4Ag7IiYIOyXhuuLpC5cbiAgICovXG4gIEBhcGkoeyBodHRwTWV0aG9kOiBcIkdFVFwiLCBjbGllbnRzOiBbXCJheGlvc1wiLCBcInRhbnN0YWNrLXF1ZXJ5XCJdLCByZXNvdXJjZU5hbWU6IFwiU2V0dGluZ0xpc3RcIiB9KVxuICBhc3luYyBsaXN0U2V0dGluZ3MoKTogUHJvbWlzZTxTZXR0aW5nc1Jlc3BvbnNlPiB7XG4gICAgY29uc3Qgc2V0dGluZ3M6IFNldHRpbmdJdGVtW10gPSBTRVRUSU5HX0RFRlMubWFwKChkZWYpID0+IHtcbiAgICAgIC8vIOyggOyepeqwkuuPhCBlbnYg64+EIOyXhuycvOuptCDsvZTrk5wg6riw67O46rCS7J20IOyLpOygnOuhnCDsoIHsmqkg7KSR7J2064ukLiDruYjsubjsnLzroZwg65GQ66m0IO2ZlOuptOqzvFxuICAgICAgLy8g65+w7YOA7J6E7J20IOyWtOq4i+uCmCDrs7Tsnbjri6QuXG4gICAgICBjb25zdCBzdG9yZWQgPSBpc1N0b3JlZChkZWYua2V5KTtcbiAgICAgIGNvbnN0IHJhdyA9IGdldFNldHRpbmcoZGVmLmtleSwgZGVmLmVudktleSk7XG4gICAgICBjb25zdCBlZmZlY3RpdmUgPSByYXcgPz8gZGVmLmZhbGxiYWNrO1xuICAgICAgY29uc3Qgc291cmNlID0gc3RvcmVkID8gXCJkYlwiIDogcmF3ICE9PSB1bmRlZmluZWQgPyBcImVudlwiIDogXCJkZWZhdWx0XCI7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGtleTogZGVmLmtleSxcbiAgICAgICAgZ3JvdXA6IGRlZi5ncm91cCxcbiAgICAgICAgbGFiZWw6IGRlZi5sYWJlbCxcbiAgICAgICAga2luZDogZGVmLmtpbmQsXG4gICAgICAgIGFwcGxpZXM6IGRlZi5hcHBsaWVzLFxuICAgICAgICAvLyDriIgg7Yag6riA7J2EIOychO2VtCBzZWNyZXQg64+EIOybkOuzuOydhCDrgrTroKTrs7Trgrjri6QuIOydtCDsl5Trk5ztj6zsnbjtirjripQg67Cw7Y+sIOqyveqzhOyXkOyEnFxuICAgICAgICAvLyDrsJjrk5zsi5wg7J247Kad7ZW07JW8IO2VnOuLpC5cbiAgICAgICAgdmFsdWU6IGVmZmVjdGl2ZSxcbiAgICAgICAgc291cmNlLFxuICAgICAgICBtaW46IGRlZi5taW4gPz8gbnVsbCxcbiAgICAgICAgbWF4OiBkZWYubWF4ID8/IG51bGwsXG4gICAgICAgIHByZXNldHM6IGRlZi5wcmVzZXRzID8/IFtdLFxuICAgICAgICBoZWxwOiBkZWYuaGVscCA/PyBudWxsLFxuICAgICAgfTtcbiAgICB9KTtcblxuICAgIHJldHVybiB7XG4gICAgICBzZXR0aW5ncyxcbiAgICAgIHJ1bnRpbWU6IHRoaXMucnVudGltZUluZm8oKSxcbiAgICAgIHN1cGVydmlzb3I6IGRldGVjdFN1cGVydmlzb3IoKSxcbiAgICAgIGtlZXBhbGl2ZVJ1bm5lckVuYWJsZWQ6IHByb2Nlc3MuZW52W1RPS0VOX1dJTkRPV19LRUVQQUxJVkVfUlVOTkVSX0VOVl9LRVldID09PSBcInRydWVcIixcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBydW50aW1lSW5mbygpOiBSdW50aW1lSW5mb0l0ZW1bXSB7XG4gICAgY29uc3QgZW52ID0gcHJvY2Vzcy5lbnY7XG4gICAgY29uc3QgcGFzc3dvcmQgPSBlbnYuUUdSSURfREJfUEFTU1dPUkQgPz8gZW52LlNPTkFNVV9EQl9QQVNTV09SRCA/PyBcIlwiO1xuICAgIHJldHVybiBbXG4gICAgICB7IGxhYmVsOiBcIk5PREVfRU5WXCIsIHZhbHVlOiBlbnYuTk9ERV9FTlYgPz8gXCItXCIgfSxcbiAgICAgIHsgbGFiZWw6IFwiSE9TVFwiLCB2YWx1ZTogZW52LkhPU1QgPz8gXCJsb2NhbGhvc3RcIiB9LFxuICAgICAgeyBsYWJlbDogXCJQT1JUXCIsIHZhbHVlOiBlbnYuUE9SVCA/PyBcIjQ0OTAwXCIgfSxcbiAgICAgIHsgbGFiZWw6IFwiREIgSG9zdFwiLCB2YWx1ZTogZW52LlFHUklEX0RCX0hPU1QgPz8gZW52LlNPTkFNVV9EQl9IT1NUID8/IFwiLVwiIH0sXG4gICAgICB7IGxhYmVsOiBcIkRCIFBvcnRcIiwgdmFsdWU6IGVudi5RR1JJRF9EQl9QT1JUID8/IGVudi5TT05BTVVfREJfUE9SVCA/PyBcIi1cIiB9LFxuICAgICAgeyBsYWJlbDogXCJEQiBOYW1lXCIsIHZhbHVlOiBlbnYuUUdSSURfREJfTkFNRSA/PyBlbnYuU09OQU1VX0RCX05BTUUgPz8gXCItXCIgfSxcbiAgICAgIHsgbGFiZWw6IFwiREIgVXNlclwiLCB2YWx1ZTogZW52LlFHUklEX0RCX1VTRVIgPz8gZW52LlNPTkFNVV9EQl9VU0VSID8/IFwiLVwiIH0sXG4gICAgICB7IGxhYmVsOiBcIkRCIFBhc3N3b3JkXCIsIHZhbHVlOiBwYXNzd29yZCA/IG1hc2tTZWNyZXQocGFzc3dvcmQpIDogXCItXCIgfSxcbiAgICBdO1xuICB9XG5cbiAgQGFwaSh7IGh0dHBNZXRob2Q6IFwiUE9TVFwiLCBjbGllbnRzOiBbXCJheGlvc1wiLCBcInRhbnN0YWNrLW11dGF0aW9uXCJdIH0pXG4gIGFzeW5jIHVwZGF0ZVNldHRpbmcoa2V5OiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpOiBQcm9taXNlPHsgYXBwbGllczogU2V0dGluZ0FwcGxpZXMgfT4ge1xuICAgIGNvbnN0IGRlZiA9IGZpbmRTZXR0aW5nRGVmKGtleSk7XG4gICAgaWYgKCFkZWYpIHRocm93IG5ldyBCYWRSZXF1ZXN0RXhjZXB0aW9uKFNEKFwic2V0dGluZy51bmtub3duS2V5XCIpKGtleSkpO1xuXG4gICAgY29uc3QgdmFsaWRhdGlvbiA9IHZhbGlkYXRlU2V0dGluZ1ZhbHVlKGRlZiwgdmFsdWUpO1xuICAgIGlmICghdmFsaWRhdGlvbi5vaykge1xuICAgICAgdGhyb3cgbmV3IEJhZFJlcXVlc3RFeGNlcHRpb24oU0QoXCJzZXR0aW5nLmludmFsaWRWYWx1ZVwiKSh2YWxpZGF0aW9uLmVycm9yKSk7XG4gICAgfVxuXG4gICAgYXdhaXQgc2F2ZVN0b3JlZFNldHRpbmcoa2V5LCB2YWxpZGF0aW9uLnZhbHVlKTtcbiAgICByZXR1cm4geyBhcHBsaWVzOiBkZWYuYXBwbGllcyB9O1xuICB9XG5cbiAgLyoqIOyggOyepeqwkuydhCDsp4Dsm4wgZW52IOq4sOuzuOqwkuycvOuhnCDrkJjrj4zrprDri6QuICovXG4gIEBhcGkoeyBodHRwTWV0aG9kOiBcIlBPU1RcIiwgY2xpZW50czogW1wiYXhpb3NcIiwgXCJ0YW5zdGFjay1tdXRhdGlvblwiXSB9KVxuICBhc3luYyByZXNldFNldHRpbmcoa2V5OiBzdHJpbmcpOiBQcm9taXNlPHsgYXBwbGllczogU2V0dGluZ0FwcGxpZXMgfT4ge1xuICAgIGNvbnN0IGRlZiA9IGZpbmRTZXR0aW5nRGVmKGtleSk7XG4gICAgaWYgKCFkZWYpIHRocm93IG5ldyBCYWRSZXF1ZXN0RXhjZXB0aW9uKFNEKFwic2V0dGluZy51bmtub3duS2V5XCIpKGtleSkpO1xuXG4gICAgYXdhaXQgcmVzZXRTdG9yZWRTZXR0aW5nKGtleSk7XG4gICAgcmV0dXJuIHsgYXBwbGllczogZGVmLmFwcGxpZXMgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDrp4zro4wg7JWM66a87J2EIOyngOq4iCDtlZwg67KIIOuztOuCuOuLpC4g7KO86riw66W8IOq4sOuLpOumrOyngCDslYrqs6Ag7ISk7KCV7J20IOygnOuMgOuhnCDrtpnsl4jripTsp4Ag7ZmV7J247ZWY6rGw64KYLFxuICAgKiDsnqzroZzqt7jsnbjsnYQg7J6s7LSJ7ZWgIOuVjCDsk7Tri6QuIOuztOuCuCDqsbTsiJjrpbwg64+M66Ck7KSYIFwi67O064K8IOuMgOyDgSDsl4bsnYxcIuqzvCDqtazrtoTtlZzri6QuXG4gICAqL1xuICBAYXBpKHsgaHR0cE1ldGhvZDogXCJQT1NUXCIsIGNsaWVudHM6IFtcImF4aW9zXCIsIFwidGFuc3RhY2stbXV0YXRpb25cIl0gfSlcbiAgYXN5bmMgdHJpZ2dlckV4cGlyeVJlbWluZGVyKCk6IFByb21pc2U8eyBzZW50OiBudW1iZXIgfT4ge1xuICAgIC8vIOuPmeyggSBpbXBvcnQg66GcIOyVjOumvCDrqqjrk4jsnYQg7Zi47LacIOyLnOygkOyXkOunjCDrgYzslrTsmKjri6QuIOygleyggeycvOuhnCDqsbjrqbRcbiAgICAvLyBzZXR0aW5nLm1vZGVsIOKGkiBleHBpcmVkLXRva2VuLXJlbWluZGVyIOKGkiB0b2tlbi5tb2RlbCDqsr3roZzqsIAg7IOd6rKoLFxuICAgIC8vIHRva2VuLm1vZGVsIOydhCBtb2NrIO2VmOuKlCDthYzsiqTtirjqsIAg7Iuk7KCcIOuqqOuTiOydhCDrqLzsoIAg66Gc65Oc7ZWY6rKMIOuQnOuLpC5cbiAgICBjb25zdCB7IHNlbmRFeHBpcmVkVG9rZW5SZW1pbmRlck5vdyB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vcWdyaWQvZXhwaXJlZC10b2tlbi1yZW1pbmRlclwiKTtcbiAgICByZXR1cm4geyBzZW50OiBhd2FpdCBzZW5kRXhwaXJlZFRva2VuUmVtaW5kZXJOb3coKSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIOyEnOuyhOulvCDsnqzsi5zsnpHtlZzri6Qg4oCUIOygle2Zle2eiOuKlCDsiqTsiqTroZwg7KKF66OM7ZWY6rOgLCBwbTIg6rCAIOuLpOyLnCDrnYTsmrDripQg6rKD7JeQIOunoeq4tOuLpC5cbiAgICpcbiAgICogYHJlc3RhcnRgIOuhnCDtkZzsi5zrkJwg7JuM7LukIOyEpOygleydgCBkaXNwYXRjaGVyIOyDneyEseyekOyXkOyEnCDtlZwg67KI66eMIOydve2eiOuvgOuhnCDsnbQg6rK966GcIOunkOqzoOuKlFxuICAgKiDrsJjsmIHtlaAg67Cp67KV7J20IOyXhuyXiOuLpC4g7KeA6riI6rmM7KeA64qUIFNTSCDroZwgYHBtMiByZXN0YXJ0YCDrpbwg7LOQ7JW8IO2WiOuLpC5cbiAgICpcbiAgICog67aA7IiYIO2aqOqzvOqwgCDtlZjrgpgg642UIOyeiOuLpDogcG0yIOuKlCBgZWNvc3lzdGVtLmNvbmZpZy5janNgIOydmCDsm5Drnpgg66qF66C57Jy866GcIOuLpOyLnCDrnYTsmrDqs6AsXG4gICAqIOq3uCDrqoXroLnsl5AgYC0tc2tpcC11cGRhdGVgIOqwgCDsl4bsnLzrqbQgQ0xJIOqwgCBucG0g7LWc7IugIOuyhOyghOydhCDrsJvslYQg7Jis66aw64ukLiDspokg7J6s7Iuc7J6R7J2AXG4gICAqIOuwsO2PrOydtOq4sOuPhCDtlZjri6Qg4oCUIO2ZlOuptCDrrLjqtazqsIAg7J20IOyCrOyLpOydhCDtlajqu5gg7JWM66aw64ukLlxuICAgKi9cbiAgQGFwaSh7IGh0dHBNZXRob2Q6IFwiUE9TVFwiLCBjbGllbnRzOiBbXCJheGlvc1wiLCBcInRhbnN0YWNrLW11dGF0aW9uXCJdIH0pXG4gIGFzeW5jIHJlc3RhcnRTZXJ2ZXIoKTogUHJvbWlzZTx7IHN1cGVydmlzb3I6IFN1cGVydmlzb3JLaW5kIH0+IHtcbiAgICBhc3NlcnRSZXN0YXJ0T3JpZ2luKCk7XG4gICAgY29uc3Qgc3VwZXJ2aXNvciA9IGRldGVjdFN1cGVydmlzb3IoKTtcbiAgICBpZiAoIXN1cGVydmlzb3IpIHtcbiAgICAgIC8vIOuLpOyLnCDrnYTsm4zspIQg7KO87LK06rCAIOyXhuycvOuptCDsooXro4zqsIAg6rOnIOygleyngOuLpC4g7IK066a0IOyImCDsl4bripTrjbAg7KO97J207KeAIOyViuuKlOuLpC5cbiAgICAgIHRocm93IG5ldyBCYWRSZXF1ZXN0RXhjZXB0aW9uKFNEKFwic2V0dGluZy5ub1N1cGVydmlzb3JcIikoKSk7XG4gICAgfVxuXG4gICAgY29uc3QgeyByZXBseSB9ID0gU29uYW11LmdldENvbnRleHQoKTtcbiAgICBjb25zdCBzdGFydGVkID0gYmVnaW5TZXJ2ZXJSZXN0YXJ0KCk7XG4gICAgaWYgKHN0YXJ0ZWQpIHtcbiAgICAgIGxvZ2dlci53YXJuKGByZXN0YXJ0IHJlcXVlc3RlZCB2aWEgZGFzaGJvYXJkLCBleGl0aW5nIGZvciAke3N1cGVydmlzb3J9IHRvIHJlc3Bhd25gKTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgLy8g7KCV7KCBIGltcG9ydOuhnCBxZ3JpZC5mcmFtZS90b2tlbiDqt7jrnpjtlITrpbwg64u56rKo7Jik66m0IOuqqOuTiCDrqqkg7YWM7Iqk7Yq46rCAIOyYpOyXvOuQnOuLpC5cbiAgICAgICAgLy8g7J6s7Iuc7J6R7J20IOyLpOygnOuhnCDtmZXsoJXrkJwg7Iuc7KCQ7JeQIGFjdGl2ZSBuYXRpdmUgcnVuIOygle2VqeyEsSDsspjrpqzrp4wg66Gc65Oc7ZWc64ukLlxuICAgICAgICBjb25zdCB7IGZpbmlzaEFjdGl2ZU5hdGl2ZVJ1bnNGb3JSZXN0YXJ0IH0gPSBhd2FpdCBpbXBvcnQoXCIuLi9xZ3JpZC9xZ3JpZC1ydW4tbGlmZWN5Y2xlXCIpO1xuICAgICAgICBhd2FpdCBmaW5pc2hBY3RpdmVOYXRpdmVSdW5zRm9yUmVzdGFydCgpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgLy8g7KCV7ZWp7ISxIOyymOumrOqwgCDsi6TtjKjtlbTrj4Qg7J2R64u17J20IGZsdXNoIOuQnCDrkqTsl5DripQg7J6s7Iuc7J6R7J2EIOuBneq5jOyngCDsp4TtlontlZzri6QuXG4gICAgICAgIGFybVNlcnZlclJlc3RhcnRFeGl0KHJlcGx5LnJhdyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgc3VwZXJ2aXNvciB9O1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCBTZXR0aW5nTW9kZWwgPSBuZXcgU2V0dGluZ01vZGVsQ2xhc3MoKTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUF5Q0EsTUFBTSxTQUFTLFVBQVUsQ0FBQyxTQUFTLFNBQVMsQ0FBQztBQUU3QyxJQUFNLHFCQUFOLGNBQWlDLFlBQVk7Q0FDM0MsY0FBYztFQUNaLE1BQU0sS0FBSyxHQUFHLGlCQUFpQixDQUFDO0NBQ2xDO0FBQ0Y7QUFFQSxTQUFTLGlCQUFpQixPQUEwRDtDQUNsRixRQUFRLE1BQU0sUUFBUSxLQUFLLElBQUksTUFBTSxLQUFLLE1BQUEsRUFBUSxNQUFNLEdBQUcsQ0FBQyxDQUFDLEVBQUUsRUFBRSxLQUFLO0FBQ3hFOztBQUdBLFNBQVMsc0JBQTRCO0NBQ25DLE1BQU0sRUFBRSxZQUFZLE9BQU8sV0FBVztDQUN0QyxNQUFNLFNBQVMsaUJBQWlCLFFBQVEsTUFBTTtDQUM5QyxJQUFJLFFBQVEsV0FBVyxRQUFXO0NBQ2xDLElBQUksQ0FBQyxRQUFRLE1BQU0sSUFBSSxtQkFBbUI7Q0FFMUMsTUFBTSxPQUFPLGlCQUFpQixRQUFRLG1CQUFtQixLQUFLLGlCQUFpQixRQUFRLElBQUk7Q0FDM0YsSUFBSTtFQUNGLElBQUksQ0FBQyxRQUFRLElBQUksSUFBSSxNQUFNLENBQUMsQ0FBQyxTQUFTLE1BQU0sTUFBTSxJQUFJLG1CQUFtQjtDQUMzRSxTQUFTLE9BQU87RUFDZCxJQUFJLGlCQUFpQixvQkFBb0IsTUFBTTtFQUMvQyxNQUFNLElBQUksbUJBQW1CO0NBQy9CO0FBQ0Y7QUFL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
|
|
323
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2V0dGluZy5tb2RlbC5qcyIsIm5hbWVzIjpbInNhdmVTdG9yZWRTZXR0aW5nIiwicmVzZXRTdG9yZWRTZXR0aW5nIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2FwcGxpY2F0aW9uL3NldHRpbmcvc2V0dGluZy5tb2RlbC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBnZXRMb2dnZXIgfSBmcm9tIFwiQGxvZ3RhcGUvbG9ndGFwZVwiO1xuaW1wb3J0IHtcbiAgQmFzZU1vZGVsQ2xhc3MsXG4gIHR5cGUgTGlzdFJlc3VsdCxcbiAgYXNBcnJheSxcbiAgTm90Rm91bmRFeGNlcHRpb24sXG4gIEJhZFJlcXVlc3RFeGNlcHRpb24sXG4gIFNvRXhjZXB0aW9uLFxuICBTb25hbXUsXG4gIGFwaSxcbiAgZXhoYXVzdGl2ZSxcbn0gZnJvbSBcInNvbmFtdVwiO1xuXG5pbXBvcnQgeyBTRCwgdHlwZSBMb2NhbGl6ZWRTdHJpbmcgfSBmcm9tIFwiLi4vLi4vaTE4bi9zZC5nZW5lcmF0ZWRcIjtcbmltcG9ydCB7IGRldGVjdFN1cGVydmlzb3IgfSBmcm9tIFwiLi4vLi4vdXRpbHMvcHJvY2Vzcy1zdXBlcnZpc29yXCI7XG5pbXBvcnQgeyBhcm1TZXJ2ZXJSZXN0YXJ0RXhpdCwgYmVnaW5TZXJ2ZXJSZXN0YXJ0IH0gZnJvbSBcIi4uLy4uL3V0aWxzL3NlcnZlci1yZXN0YXJ0XCI7XG5pbXBvcnQgeyBTbGFja05vdGlmaWNhdGlvbkVycm9yIH0gZnJvbSBcIi4uLy4uL3V0aWxzL3NsYWNrLW5vdGlmeVwiO1xuaW1wb3J0IHsgdHlwZSBTZXR0aW5nU3Vic2V0S2V5LCB0eXBlIFNldHRpbmdTdWJzZXRNYXBwaW5nIH0gZnJvbSBcIi4uL3NvbmFtdS5nZW5lcmF0ZWRcIjtcbmltcG9ydCB7IHNldHRpbmdTdWJzZXRRdWVyaWVzLCBzZXR0aW5nTG9hZGVyUXVlcmllcyB9IGZyb20gXCIuLi9zb25hbXUuZ2VuZXJhdGVkLnNzb1wiO1xuaW1wb3J0IHtcbiAgZmluZFNldHRpbmdEZWYsXG4gIG1hc2tTZWNyZXQsXG4gIFNFVFRJTkdfREVGUyxcbiAgVE9LRU5fV0lORE9XX0tFRVBBTElWRV9SVU5ORVJfRU5WX0tFWSxcbiAgdmFsaWRhdGVTZXR0aW5nVmFsdWUsXG59IGZyb20gXCIuL3NldHRpbmcuY29uc3RhbnRcIjtcbmltcG9ydCB7XG4gIGdldFNldHRpbmcsXG4gIGlzU3RvcmVkLFxuICByZXNldFNldHRpbmcgYXMgcmVzZXRTdG9yZWRTZXR0aW5nLFxuICBzYXZlU2V0dGluZyBhcyBzYXZlU3RvcmVkU2V0dGluZyxcbn0gZnJvbSBcIi4vc2V0dGluZy5zdG9yZVwiO1xuaW1wb3J0IHtcbiAgdHlwZSBSdW50aW1lSW5mb0l0ZW0sXG4gIHR5cGUgU2V0dGluZ0FwcGxpZXMsXG4gIHR5cGUgU2V0dGluZ0l0ZW0sXG4gIHR5cGUgU2V0dGluZ0xpc3RQYXJhbXMsXG4gIHR5cGUgU2V0dGluZ1NhdmVQYXJhbXMsXG4gIHR5cGUgU2V0dGluZ3NSZXNwb25zZSxcbiAgdHlwZSBTdXBlcnZpc29yS2luZCxcbn0gZnJvbSBcIi4vc2V0dGluZy50eXBlc1wiO1xuXG5jb25zdCBsb2dnZXIgPSBnZXRMb2dnZXIoW1wicWdyaWRcIiwgXCJzZXR0aW5nXCJdKTtcblxuY2xhc3MgRm9yYmlkZGVuRXhjZXB0aW9uIGV4dGVuZHMgU29FeGNlcHRpb24ge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcig0MDMsIFNEKFwiZXJyb3IuZm9yYmlkZGVuXCIpKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBmaXJzdEhlYWRlclZhbHVlKHZhbHVlOiBzdHJpbmcgfCBzdHJpbmdbXSB8IHVuZGVmaW5lZCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZVswXSA6IHZhbHVlKT8uc3BsaXQoXCIsXCIpWzBdPy50cmltKCk7XG59XG5cbi8qKiBPcmlnaW4g7JeG64qUIOyatOyYgSBDTEkg7JqU7LKt7J2AIO2GteqzvOyLnO2CpOuQmCwg67iM65287Jqw7KCAIOq1kOywqCDstpzsspggUE9TVCDripQg66eJ64qU64ukLiAqL1xuZnVuY3Rpb24gYXNzZXJ0UmVzdGFydE9yaWdpbigpOiB2b2lkIHtcbiAgY29uc3QgeyBoZWFkZXJzIH0gPSBTb25hbXUuZ2V0Q29udGV4dCgpO1xuICBjb25zdCBvcmlnaW4gPSBmaXJzdEhlYWRlclZhbHVlKGhlYWRlcnMub3JpZ2luKTtcbiAgaWYgKGhlYWRlcnMub3JpZ2luID09PSB1bmRlZmluZWQpIHJldHVybjtcbiAgaWYgKCFvcmlnaW4pIHRocm93IG5ldyBGb3JiaWRkZW5FeGNlcHRpb24oKTtcblxuICBjb25zdCBob3N0ID0gZmlyc3RIZWFkZXJWYWx1ZShoZWFkZXJzW1wieC1mb3J3YXJkZWQtaG9zdFwiXSkgPz8gZmlyc3RIZWFkZXJWYWx1ZShoZWFkZXJzLmhvc3QpO1xuICB0cnkge1xuICAgIGlmICghaG9zdCB8fCBuZXcgVVJMKG9yaWdpbikuaG9zdCAhPT0gaG9zdCkgdGhyb3cgbmV3IEZvcmJpZGRlbkV4Y2VwdGlvbigpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEZvcmJpZGRlbkV4Y2VwdGlvbikgdGhyb3cgZXJyb3I7XG4gICAgdGhyb3cgbmV3IEZvcmJpZGRlbkV4Y2VwdGlvbigpO1xuICB9XG59XG5cbi8qXG4gIFNldHRpbmcgTW9kZWxcbiovXG5jbGFzcyBTZXR0aW5nTW9kZWxDbGFzcyBleHRlbmRzIEJhc2VNb2RlbENsYXNzPFxuICBTZXR0aW5nU3Vic2V0S2V5LFxuICBTZXR0aW5nU3Vic2V0TWFwcGluZyxcbiAgdHlwZW9mIHNldHRpbmdTdWJzZXRRdWVyaWVzLFxuICB0eXBlb2Ygc2V0dGluZ0xvYWRlclF1ZXJpZXNcbj4ge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcihcIlNldHRpbmdcIiwgc2V0dGluZ1N1YnNldFF1ZXJpZXMsIHNldHRpbmdMb2FkZXJRdWVyaWVzKTtcbiAgfVxuXG4gIEBhcGkoeyBodHRwTWV0aG9kOiBcIkdFVFwiLCBjbGllbnRzOiBbXCJheGlvc1wiLCBcInRhbnN0YWNrLXF1ZXJ5XCJdLCByZXNvdXJjZU5hbWU6IFwiU2V0dGluZ1wiIH0pXG4gIGFzeW5jIGZpbmRCeUlkPFQgZXh0ZW5kcyBTZXR0aW5nU3Vic2V0S2V5PihcbiAgICBzdWJzZXQ6IFQsXG4gICAgaWQ6IG51bWJlcixcbiAgKTogUHJvbWlzZTxTZXR0aW5nU3Vic2V0TWFwcGluZ1tUXT4ge1xuICAgIGNvbnN0IHsgcm93cyB9ID0gYXdhaXQgdGhpcy5maW5kTWFueShzdWJzZXQsIHtcbiAgICAgIGlkLFxuICAgICAgbnVtOiAxLFxuICAgICAgcGFnZTogMSxcbiAgICB9KTtcbiAgICBpZiAoIXJvd3NbMF0pIHtcbiAgICAgIHRocm93IG5ldyBOb3RGb3VuZEV4Y2VwdGlvbihTRChcImVycm9yLmVudGl0eU5vdEZvdW5kXCIpKFwiU2V0dGluZ1wiLCBpZCkpO1xuICAgIH1cblxuICAgIHJldHVybiByb3dzWzBdO1xuICB9XG5cbiAgYXN5bmMgZmluZE9uZTxUIGV4dGVuZHMgU2V0dGluZ1N1YnNldEtleT4oXG4gICAgc3Vic2V0OiBULFxuICAgIGxpc3RQYXJhbXM6IFNldHRpbmdMaXN0UGFyYW1zLFxuICApOiBQcm9taXNlPFNldHRpbmdTdWJzZXRNYXBwaW5nW1RdIHwgbnVsbD4ge1xuICAgIGNvbnN0IHsgcm93cyB9ID0gYXdhaXQgdGhpcy5maW5kTWFueShzdWJzZXQsIHtcbiAgICAgIC4uLmxpc3RQYXJhbXMsXG4gICAgICBudW06IDEsXG4gICAgICBwYWdlOiAxLFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHJvd3NbMF0gPz8gbnVsbDtcbiAgfVxuXG4gIEBhcGkoeyBodHRwTWV0aG9kOiBcIkdFVFwiLCBjbGllbnRzOiBbXCJheGlvc1wiLCBcInRhbnN0YWNrLXF1ZXJ5XCJdLCByZXNvdXJjZU5hbWU6IFwiU2V0dGluZ3NcIiB9KVxuICBhc3luYyBmaW5kTWFueTxUIGV4dGVuZHMgU2V0dGluZ1N1YnNldEtleSwgTFAgZXh0ZW5kcyBTZXR0aW5nTGlzdFBhcmFtcz4oXG4gICAgc3Vic2V0OiBULFxuICAgIHJhd1BhcmFtcz86IExQLFxuICApOiBQcm9taXNlPExpc3RSZXN1bHQ8TFAsIFNldHRpbmdTdWJzZXRNYXBwaW5nW1RdPj4ge1xuICAgIC8vIHBhcmFtcyB3aXRoIGRlZmF1bHRzXG4gICAgY29uc3QgcGFyYW1zID0ge1xuICAgICAgbnVtOiAyNCxcbiAgICAgIHBhZ2U6IDEsXG4gICAgICBzZWFyY2g6IFwia2V5XCIgYXMgY29uc3QsXG4gICAgICBvcmRlckJ5OiBcImtleS1hc2NcIiBhcyBjb25zdCxcbiAgICAgIC4uLnJhd1BhcmFtcyxcbiAgICB9IHNhdGlzZmllcyBTZXR0aW5nTGlzdFBhcmFtcztcblxuICAgIC8vIGJ1aWxkIHF1ZXJpZXNcbiAgICBjb25zdCB7IHFiLCBvblN1YnNldDogXyB9ID0gdGhpcy5nZXRTdWJzZXRRdWVyaWVzKHN1YnNldCk7XG5cbiAgICAvLyBpZFxuICAgIGlmIChwYXJhbXMuaWQpIHtcbiAgICAgIHFiLndoZXJlSW4oXCJzZXR0aW5ncy5pZFwiLCBhc0FycmF5KHBhcmFtcy5pZCkpO1xuICAgIH1cblxuICAgIC8vIGtleSDigJQgdG9GaWx0ZXIgcHJvcCDsnbTsp4Drp4wg7Iqk7LqQ7Y+065Sp7J20IOunjOuTpOyWtOyjvOyngCDslYrslYQg7KeB7KCRIOqxtOuLpC5cbiAgICBpZiAocGFyYW1zLmtleSkge1xuICAgICAgcWIud2hlcmUoXCJzZXR0aW5ncy5rZXlcIiwgcGFyYW1zLmtleSk7XG4gICAgfVxuXG4gICAgLy8gc2VhcmNoLWtleXdvcmRcbiAgICBpZiAocGFyYW1zLnNlYXJjaCAmJiBwYXJhbXMua2V5d29yZCAmJiBwYXJhbXMua2V5d29yZC5sZW5ndGggPiAwKSB7XG4gICAgICBpZiAocGFyYW1zLnNlYXJjaCA9PT0gXCJrZXlcIikge1xuICAgICAgICBxYi53aGVyZShcInNldHRpbmdzLmtleVwiLCBcImxpa2VcIiwgYCUke3BhcmFtcy5rZXl3b3JkfSVgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBCYWRSZXF1ZXN0RXhjZXB0aW9uKFNEKFwiZXJyb3IudW5rbm93blNlYXJjaEZpZWxkXCIpKHBhcmFtcy5zZWFyY2gpKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBvcmRlckJ5XG4gICAgaWYgKHBhcmFtcy5vcmRlckJ5KSB7XG4gICAgICAvLyBkZWZhdWx0IG9yZGVyQnlcbiAgICAgIGlmIChwYXJhbXMub3JkZXJCeSA9PT0gXCJrZXktYXNjXCIpIHtcbiAgICAgICAgcWIub3JkZXJCeShcInNldHRpbmdzLmtleVwiLCBcImFzY1wiKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGV4aGF1c3RpdmUocGFyYW1zLm9yZGVyQnkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGVuaGFuY2VycyA9IHRoaXMuY3JlYXRlRW5oYW5jZXJzKHtcbiAgICAgIEE6IChyb3cpID0+ICh7XG4gICAgICAgIC4uLnJvdyxcbiAgICAgICAgLy8g7ISc67iM7IWL67OE66GcIHZpcnR1YWwg7ZWE65OcIOqzhOyCsOuhnOyngSDstpTqsIBcbiAgICAgIH0pLFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZVN1YnNldFF1ZXJ5KHtcbiAgICAgIHN1YnNldCxcbiAgICAgIHFiLFxuICAgICAgcGFyYW1zLFxuICAgICAgZW5oYW5jZXJzLFxuICAgICAgZGVidWc6IGZhbHNlLFxuICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgc2F2ZShzcGE6IFNldHRpbmdTYXZlUGFyYW1zW10pOiBQcm9taXNlPG51bWJlcltdPiB7XG4gICAgY29uc3Qgd2RiID0gdGhpcy5nZXRQdXJpKFwid1wiKTtcblxuICAgIC8vIHJlZ2lzdGVyXG4gICAgc3BhLmZvckVhY2goKHNwKSA9PiB7XG4gICAgICB3ZGIudWJSZWdpc3RlcihcInNldHRpbmdzXCIsIHNwKTtcbiAgICB9KTtcblxuICAgIC8vIHRyYW5zYWN0aW9uXG4gICAgcmV0dXJuIHdkYi50cmFuc2FjdGlvbihhc3luYyAodHJ4KSA9PiB7XG4gICAgICBjb25zdCBpZHMgPSBhd2FpdCB0cngudWJVcHNlcnQoXCJzZXR0aW5nc1wiKTtcblxuICAgICAgcmV0dXJuIGlkcztcbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIGRlbChpZHM6IG51bWJlcltdKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICBjb25zdCB3ZGIgPSB0aGlzLmdldFB1cmkoXCJ3XCIpO1xuXG4gICAgLy8gdHJhbnNhY3Rpb25cbiAgICBhd2FpdCB3ZGIudHJhbnNhY3Rpb24oYXN5bmMgKHRyeCkgPT4ge1xuICAgICAgcmV0dXJuIHRyeC50YWJsZShcInNldHRpbmdzXCIpLndoZXJlSW4oXCJzZXR0aW5ncy5pZFwiLCBpZHMpLmRlbGV0ZSgpO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIGlkcy5sZW5ndGg7XG4gIH1cblxuICAvKiog7KCA7J6l65CcIOyEpOyglSDsoITssrTrpbwga2V54oaSdmFsdWUg66GcLiDrtoDtjIUg7IucIO2VnCDrsogg7J297Ja0IOuplOuqqOumrOyXkCDsmKzrprDri6QuICovXG4gIGFzeW5jIGZpbmRBbGxBc01hcCgpOiBQcm9taXNlPE1hcDxzdHJpbmcsIHN0cmluZz4+IHtcbiAgICBjb25zdCB7IHJvd3MgfSA9IGF3YWl0IHRoaXMuZmluZE1hbnkoXCJBXCIsIHsgbnVtOiAwLCBwYWdlOiAxIH0pO1xuICAgIHJldHVybiBuZXcgTWFwKHJvd3MubWFwKChyKSA9PiBbci5rZXksIHIudmFsdWVdKSk7XG4gIH1cblxuICAvKipcbiAgICoga2V5IOuhnCB1cHNlcnQg7ZWc64ukLiBgc2F2ZWAg64qUIGlkIOq4sOykgOydtOudvCBrZXkg7KSR67O17J2EIOqxuOufrOuCtOyngCDrqrvtlbQsIOq4sOyhtCDtlonsnYQg66i87KCAIOywvuyVhFxuICAgKiBpZCDrpbwg7Iuk7Ja0IOuztOuCuOuLpC5cbiAgICovXG4gIGFzeW5jIHNldEJ5S2V5KGtleTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgZXhpc3RpbmcgPSBhd2FpdCB0aGlzLmZpbmRPbmUoXCJBXCIsIHsga2V5LCBudW06IDEsIHBhZ2U6IDEgfSk7XG4gICAgYXdhaXQgdGhpcy5zYXZlKFtcbiAgICAgIHtcbiAgICAgICAgLi4uKGV4aXN0aW5nID8geyBpZDogZXhpc3RpbmcuaWQgfSA6IHt9KSxcbiAgICAgICAga2V5LFxuICAgICAgICB2YWx1ZSxcbiAgICAgICAgdXBkYXRlZF9hdDogbmV3IERhdGUoKSxcbiAgICAgIH0sXG4gICAgXSk7XG4gIH1cblxuICAvKiog7KCA7J6l6rCS7J2EIOyngOybjCBlbnYg6riw67O46rCS7Jy866GcIOuQmOuPjOumsOuLpC4gKi9cbiAgYXN5bmMgY2xlYXJCeUtleShrZXk6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGV4aXN0aW5nID0gYXdhaXQgdGhpcy5maW5kT25lKFwiQVwiLCB7IGtleSwgbnVtOiAxLCBwYWdlOiAxIH0pO1xuICAgIGlmIChleGlzdGluZykgYXdhaXQgdGhpcy5kZWwoW2V4aXN0aW5nLmlkXSk7XG4gIH1cblxuICAvKipcbiAgICog7Y647KeRIOqwgOuKpe2VnCDshKTsoJXqs7wg7J296riwIOyghOyaqSDrn7Dtg4DsnoQg7KCV67O0LiDtjrjsp5Eg64yA7IOB7J2AIGBTRVRUSU5HX0RFRlNgIOyXkCDsoJXsnZjrkJwg6rKD67+Q7J2064ukIOKAlFxuICAgKiBEQiDsoJHsho0g7KCV67O064KYIO2PrO2KuOuKlCDshJzrsoTqsIAg65yo6riwIOyghOyXkCDtlYTsmpTtlbQg7ZmU66m07JeQ7IScIOuwlOq/gCDsiJgg7JeG64ukLlxuICAgKi9cbiAgQGFwaSh7IGh0dHBNZXRob2Q6IFwiR0VUXCIsIGNsaWVudHM6IFtcImF4aW9zXCIsIFwidGFuc3RhY2stcXVlcnlcIl0sIHJlc291cmNlTmFtZTogXCJTZXR0aW5nTGlzdFwiIH0pXG4gIGFzeW5jIGxpc3RTZXR0aW5ncygpOiBQcm9taXNlPFNldHRpbmdzUmVzcG9uc2U+IHtcbiAgICBjb25zdCBzZXR0aW5nczogU2V0dGluZ0l0ZW1bXSA9IFNFVFRJTkdfREVGUy5tYXAoKGRlZikgPT4ge1xuICAgICAgLy8g7KCA7J6l6rCS64+EIGVudiDrj4Qg7JeG7Jy866m0IOy9lOuTnCDquLDrs7jqsJLsnbQg7Iuk7KCc66GcIOyggeyaqSDspJHsnbTri6QuIOu5iOy5uOycvOuhnCDrkZDrqbQg7ZmU66m06rO8XG4gICAgICAvLyDrn7Dtg4DsnoTsnbQg7Ja06riL64KYIOuztOyduOuLpC5cbiAgICAgIGNvbnN0IHN0b3JlZCA9IGlzU3RvcmVkKGRlZi5rZXkpO1xuICAgICAgY29uc3QgcmF3ID0gZ2V0U2V0dGluZyhkZWYua2V5LCBkZWYuZW52S2V5KTtcbiAgICAgIGNvbnN0IGVmZmVjdGl2ZSA9IHJhdyA/PyBkZWYuZmFsbGJhY2s7XG4gICAgICBjb25zdCBzb3VyY2UgPSBzdG9yZWQgPyBcImRiXCIgOiByYXcgIT09IHVuZGVmaW5lZCA/IFwiZW52XCIgOiBcImRlZmF1bHRcIjtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAga2V5OiBkZWYua2V5LFxuICAgICAgICBncm91cDogZGVmLmdyb3VwLFxuICAgICAgICBsYWJlbDogZGVmLmxhYmVsLFxuICAgICAgICBraW5kOiBkZWYua2luZCxcbiAgICAgICAgYXBwbGllczogZGVmLmFwcGxpZXMsXG4gICAgICAgIC8vIOuIiCDthqDquIDsnYQg7JyE7ZW0IHNlY3JldCDrj4Qg7JuQ67O47J2EIOuCtOugpOuztOuCuOuLpC4g7J20IOyXlOuTnO2PrOyduO2KuOuKlCDrsLDtj6wg6rK96rOE7JeQ7IScXG4gICAgICAgIC8vIOuwmOuTnOyLnCDsnbjspp3tlbTslbwg7ZWc64ukLlxuICAgICAgICB2YWx1ZTogZWZmZWN0aXZlLFxuICAgICAgICBzb3VyY2UsXG4gICAgICAgIG1pbjogZGVmLm1pbiA/PyBudWxsLFxuICAgICAgICBtYXg6IGRlZi5tYXggPz8gbnVsbCxcbiAgICAgICAgcHJlc2V0czogZGVmLnByZXNldHMgPz8gW10sXG4gICAgICAgIGhlbHA6IGRlZi5oZWxwID8/IG51bGwsXG4gICAgICB9O1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHNldHRpbmdzLFxuICAgICAgcnVudGltZTogdGhpcy5ydW50aW1lSW5mbygpLFxuICAgICAgc3VwZXJ2aXNvcjogZGV0ZWN0U3VwZXJ2aXNvcigpLFxuICAgICAga2VlcGFsaXZlUnVubmVyRW5hYmxlZDogcHJvY2Vzcy5lbnZbVE9LRU5fV0lORE9XX0tFRVBBTElWRV9SVU5ORVJfRU5WX0tFWV0gPT09IFwidHJ1ZVwiLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIHJ1bnRpbWVJbmZvKCk6IFJ1bnRpbWVJbmZvSXRlbVtdIHtcbiAgICBjb25zdCBlbnYgPSBwcm9jZXNzLmVudjtcbiAgICBjb25zdCBwYXNzd29yZCA9IGVudi5RR1JJRF9EQl9QQVNTV09SRCA/PyBlbnYuU09OQU1VX0RCX1BBU1NXT1JEID8/IFwiXCI7XG4gICAgcmV0dXJuIFtcbiAgICAgIHsgbGFiZWw6IFwiTk9ERV9FTlZcIiwgdmFsdWU6IGVudi5OT0RFX0VOViA/PyBcIi1cIiB9LFxuICAgICAgeyBsYWJlbDogXCJIT1NUXCIsIHZhbHVlOiBlbnYuSE9TVCA/PyBcImxvY2FsaG9zdFwiIH0sXG4gICAgICB7IGxhYmVsOiBcIlBPUlRcIiwgdmFsdWU6IGVudi5QT1JUID8/IFwiNDQ5MDBcIiB9LFxuICAgICAgeyBsYWJlbDogXCJEQiBIb3N0XCIsIHZhbHVlOiBlbnYuUUdSSURfREJfSE9TVCA/PyBlbnYuU09OQU1VX0RCX0hPU1QgPz8gXCItXCIgfSxcbiAgICAgIHsgbGFiZWw6IFwiREIgUG9ydFwiLCB2YWx1ZTogZW52LlFHUklEX0RCX1BPUlQgPz8gZW52LlNPTkFNVV9EQl9QT1JUID8/IFwiLVwiIH0sXG4gICAgICB7IGxhYmVsOiBcIkRCIE5hbWVcIiwgdmFsdWU6IGVudi5RR1JJRF9EQl9OQU1FID8/IGVudi5TT05BTVVfREJfTkFNRSA/PyBcIi1cIiB9LFxuICAgICAgeyBsYWJlbDogXCJEQiBVc2VyXCIsIHZhbHVlOiBlbnYuUUdSSURfREJfVVNFUiA/PyBlbnYuU09OQU1VX0RCX1VTRVIgPz8gXCItXCIgfSxcbiAgICAgIHsgbGFiZWw6IFwiREIgUGFzc3dvcmRcIiwgdmFsdWU6IHBhc3N3b3JkID8gbWFza1NlY3JldChwYXNzd29yZCkgOiBcIi1cIiB9LFxuICAgIF07XG4gIH1cblxuICBAYXBpKHsgaHR0cE1ldGhvZDogXCJQT1NUXCIsIGNsaWVudHM6IFtcImF4aW9zXCIsIFwidGFuc3RhY2stbXV0YXRpb25cIl0gfSlcbiAgYXN5bmMgdXBkYXRlU2V0dGluZyhrZXk6IHN0cmluZywgdmFsdWU6IHN0cmluZyk6IFByb21pc2U8eyBhcHBsaWVzOiBTZXR0aW5nQXBwbGllcyB9PiB7XG4gICAgY29uc3QgZGVmID0gZmluZFNldHRpbmdEZWYoa2V5KTtcbiAgICBpZiAoIWRlZikgdGhyb3cgbmV3IEJhZFJlcXVlc3RFeGNlcHRpb24oU0QoXCJzZXR0aW5nLnVua25vd25LZXlcIikoa2V5KSk7XG5cbiAgICBjb25zdCB2YWxpZGF0aW9uID0gdmFsaWRhdGVTZXR0aW5nVmFsdWUoZGVmLCB2YWx1ZSk7XG4gICAgaWYgKCF2YWxpZGF0aW9uLm9rKSB7XG4gICAgICB0aHJvdyBuZXcgQmFkUmVxdWVzdEV4Y2VwdGlvbihTRChcInNldHRpbmcuaW52YWxpZFZhbHVlXCIpKHZhbGlkYXRpb24uZXJyb3IpKTtcbiAgICB9XG5cbiAgICBhd2FpdCBzYXZlU3RvcmVkU2V0dGluZyhrZXksIHZhbGlkYXRpb24udmFsdWUpO1xuICAgIHJldHVybiB7IGFwcGxpZXM6IGRlZi5hcHBsaWVzIH07XG4gIH1cblxuICAvKiog7KCA7J6l6rCS7J2EIOyngOybjCBlbnYg6riw67O46rCS7Jy866GcIOuQmOuPjOumsOuLpC4gKi9cbiAgQGFwaSh7IGh0dHBNZXRob2Q6IFwiUE9TVFwiLCBjbGllbnRzOiBbXCJheGlvc1wiLCBcInRhbnN0YWNrLW11dGF0aW9uXCJdIH0pXG4gIGFzeW5jIHJlc2V0U2V0dGluZyhrZXk6IHN0cmluZyk6IFByb21pc2U8eyBhcHBsaWVzOiBTZXR0aW5nQXBwbGllcyB9PiB7XG4gICAgY29uc3QgZGVmID0gZmluZFNldHRpbmdEZWYoa2V5KTtcbiAgICBpZiAoIWRlZikgdGhyb3cgbmV3IEJhZFJlcXVlc3RFeGNlcHRpb24oU0QoXCJzZXR0aW5nLnVua25vd25LZXlcIikoa2V5KSk7XG5cbiAgICBhd2FpdCByZXNldFN0b3JlZFNldHRpbmcoa2V5KTtcbiAgICByZXR1cm4geyBhcHBsaWVzOiBkZWYuYXBwbGllcyB9O1xuICB9XG5cbiAgLyoqXG4gICAqIOunjOujjCDslYzrprzsnYQg7KeA6riIIO2VnCDrsogg67O064K464ukLiDso7zquLDrpbwg6riw64uk66as7KeAIOyViuqzoCDshKTsoJXsnbQg7KCc64yA66GcIOu2meyXiOuKlOyngCDtmZXsnbjtlZjqsbDrgpgsXG4gICAqIOyerOuhnOq3uOyduOydhCDsnqzstIntlaAg65WMIOyTtOuLpC4g67O064K4IOqxtOyImOulvCDrj4zroKTspJggXCLrs7Trgrwg64yA7IOBIOyXhuydjFwi6rO8IOq1rOu2hO2VnOuLpC5cbiAgICovXG4gIEBhcGkoeyBodHRwTWV0aG9kOiBcIlBPU1RcIiwgY2xpZW50czogW1wiYXhpb3NcIiwgXCJ0YW5zdGFjay1tdXRhdGlvblwiXSB9KVxuICBhc3luYyB0cmlnZ2VyRXhwaXJ5UmVtaW5kZXIoKTogUHJvbWlzZTx7IHNlbnQ6IG51bWJlciB9PiB7XG4gICAgLy8g64+Z7KCBIGltcG9ydCDroZwg7JWM66a8IOuqqOuTiOydhCDtmLjstpwg7Iuc7KCQ7JeQ66eMIOuBjOyWtOyYqOuLpC4g7KCV7KCB7Jy866GcIOqxuOuptFxuICAgIC8vIHNldHRpbmcubW9kZWwg4oaSIGV4cGlyZWQtdG9rZW4tcmVtaW5kZXIg4oaSIHRva2VuLm1vZGVsIOqyveuhnOqwgCDsg53qsqgsXG4gICAgLy8gdG9rZW4ubW9kZWwg7J2EIG1vY2sg7ZWY64qUIO2FjOyKpO2KuOqwgCDsi6TsoJwg66qo65OI7J2EIOuovOyggCDroZzrk5ztlZjqsowg65Cc64ukLlxuICAgIGNvbnN0IHsgc2VuZEV4cGlyZWRUb2tlblJlbWluZGVyTm93IH0gPSBhd2FpdCBpbXBvcnQoXCIuLi9xZ3JpZC9leHBpcmVkLXRva2VuLXJlbWluZGVyXCIpO1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4geyBzZW50OiBhd2FpdCBzZW5kRXhwaXJlZFRva2VuUmVtaW5kZXJOb3coKSB9O1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBTbGFja05vdGlmaWNhdGlvbkVycm9yKSB7XG4gICAgICAgIHRocm93IG5ldyBCYWRSZXF1ZXN0RXhjZXB0aW9uKGVycm9yLm1lc3NhZ2UgYXMgTG9jYWxpemVkU3RyaW5nKTtcbiAgICAgIH1cbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiDshJzrsoTrpbwg7J6s7Iuc7J6R7ZWc64ukIOKAlCDsoJXtmZXtnojripQg7Iqk7Iqk66GcIOyiheujjO2VmOqzoCwgcG0yIOqwgCDri6Tsi5wg652E7Jqw64qUIOqyg+yXkCDrp6HquLTri6QuXG4gICAqXG4gICAqIGByZXN0YXJ0YCDroZwg7ZGc7Iuc65CcIOybjOy7pCDshKTsoJXsnYAgZGlzcGF0Y2hlciDsg53shLHsnpDsl5DshJwg7ZWcIOuyiOunjCDsnb3tnojrr4DroZwg7J20IOqyveuhnCDrp5Dqs6DripRcbiAgICog67CY7JiB7ZWgIOuwqeuyleydtCDsl4bsl4jri6QuIOyngOq4iOq5jOyngOuKlCBTU0gg66GcIGBwbTIgcmVzdGFydGAg66W8IOyzkOyVvCDtlojri6QuXG4gICAqXG4gICAqIOu2gOyImCDtmqjqs7zqsIAg7ZWY64KYIOuNlCDsnojri6Q6IHBtMiDripQgYGVjb3N5c3RlbS5jb25maWcuY2pzYCDsnZgg7JuQ656YIOuqheugueycvOuhnCDri6Tsi5wg652E7Jqw6rOgLFxuICAgKiDqt7gg66qF66C57JeQIGAtLXNraXAtdXBkYXRlYCDqsIAg7JeG7Jy866m0IENMSSDqsIAgbnBtIOy1nOyLoCDrsoTsoITsnYQg67Cb7JWEIOyYrOumsOuLpC4g7KaJIOyerOyLnOyekeydgFxuICAgKiDrsLDtj6zsnbTquLDrj4Qg7ZWY64ukIOKAlCDtmZTrqbQg66y46rWs6rCAIOydtCDsgqzsi6TsnYQg7ZWo6ruYIOyVjOumsOuLpC5cbiAgICovXG4gIEBhcGkoeyBodHRwTWV0aG9kOiBcIlBPU1RcIiwgY2xpZW50czogW1wiYXhpb3NcIiwgXCJ0YW5zdGFjay1tdXRhdGlvblwiXSB9KVxuICBhc3luYyByZXN0YXJ0U2VydmVyKCk6IFByb21pc2U8eyBzdXBlcnZpc29yOiBTdXBlcnZpc29yS2luZCB9PiB7XG4gICAgYXNzZXJ0UmVzdGFydE9yaWdpbigpO1xuICAgIGNvbnN0IHN1cGVydmlzb3IgPSBkZXRlY3RTdXBlcnZpc29yKCk7XG4gICAgaWYgKCFzdXBlcnZpc29yKSB7XG4gICAgICAvLyDri6Tsi5wg652E7JuM7KSEIOyjvOyytOqwgCDsl4bsnLzrqbQg7KKF66OM6rCAIOqzpyDsoJXsp4Dri6QuIOyCtOumtCDsiJgg7JeG64qU642wIOyjveydtOyngCDslYrripTri6QuXG4gICAgICB0aHJvdyBuZXcgQmFkUmVxdWVzdEV4Y2VwdGlvbihTRChcInNldHRpbmcubm9TdXBlcnZpc29yXCIpKCkpO1xuICAgIH1cblxuICAgIGNvbnN0IHsgcmVwbHkgfSA9IFNvbmFtdS5nZXRDb250ZXh0KCk7XG4gICAgY29uc3Qgc3RhcnRlZCA9IGJlZ2luU2VydmVyUmVzdGFydCgpO1xuICAgIGlmIChzdGFydGVkKSB7XG4gICAgICBsb2dnZXIud2FybihgcmVzdGFydCByZXF1ZXN0ZWQgdmlhIGRhc2hib2FyZCwgZXhpdGluZyBmb3IgJHtzdXBlcnZpc29yfSB0byByZXNwYXduYCk7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIC8vIOygleyggSBpbXBvcnTroZwgcWdyaWQuZnJhbWUvdG9rZW4g6re4656Y7ZSE66W8IOuLueqyqOyYpOuptCDrqqjrk4gg66qpIO2FjOyKpO2KuOqwgCDsmKTsl7zrkJzri6QuXG4gICAgICAgIC8vIOyerOyLnOyekeydtCDsi6TsoJzroZwg7ZmV7KCV65CcIOyLnOygkOyXkCBhY3RpdmUgbmF0aXZlIHJ1biDsoJXtlanshLEg7LKY66as66eMIOuhnOuTnO2VnOuLpC5cbiAgICAgICAgY29uc3QgeyBmaW5pc2hBY3RpdmVOYXRpdmVSdW5zRm9yUmVzdGFydCB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vcWdyaWQvcWdyaWQtcnVuLWxpZmVjeWNsZVwiKTtcbiAgICAgICAgYXdhaXQgZmluaXNoQWN0aXZlTmF0aXZlUnVuc0ZvclJlc3RhcnQoKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIC8vIOygle2VqeyEsSDsspjrpqzqsIAg7Iuk7Yyo7ZW064+EIOydkeuLteydtCBmbHVzaCDrkJwg65Kk7JeQ64qUIOyerOyLnOyekeydhCDrgZ3quYzsp4Ag7KeE7ZaJ7ZWc64ukLlxuICAgICAgICBhcm1TZXJ2ZXJSZXN0YXJ0RXhpdChyZXBseS5yYXcpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7IHN1cGVydmlzb3IgfTtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgU2V0dGluZ01vZGVsID0gbmV3IFNldHRpbmdNb2RlbENsYXNzKCk7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7OztBQTBDQSxNQUFNLFNBQVMsVUFBVSxDQUFDLFNBQVMsU0FBUyxDQUFDO0FBRTdDLElBQU0scUJBQU4sY0FBaUMsWUFBWTtDQUMzQyxjQUFjO0VBQ1osTUFBTSxLQUFLLEdBQUcsaUJBQWlCLENBQUM7Q0FDbEM7QUFDRjtBQUVBLFNBQVMsaUJBQWlCLE9BQTBEO0NBQ2xGLFFBQVEsTUFBTSxRQUFRLEtBQUssSUFBSSxNQUFNLEtBQUssTUFBQSxFQUFRLE1BQU0sR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLEtBQUs7QUFDeEU7O0FBR0EsU0FBUyxzQkFBNEI7Q0FDbkMsTUFBTSxFQUFFLFlBQVksT0FBTyxXQUFXO0NBQ3RDLE1BQU0sU0FBUyxpQkFBaUIsUUFB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
|
|
@@ -91,6 +91,25 @@ function usageFrom(value) {
|
|
|
91
91
|
totalTokens: Number(usage.total_tokens ?? 0)
|
|
92
92
|
};
|
|
93
93
|
}
|
|
94
|
+
function imageMimeType(base64, outputFormat) {
|
|
95
|
+
const header = Buffer.from(base64.slice(0, 24), "base64");
|
|
96
|
+
if (header.subarray(0, 8).equals(Buffer.from([
|
|
97
|
+
137,
|
|
98
|
+
80,
|
|
99
|
+
78,
|
|
100
|
+
71,
|
|
101
|
+
13,
|
|
102
|
+
10,
|
|
103
|
+
26,
|
|
104
|
+
10
|
|
105
|
+
]))) return "image/png";
|
|
106
|
+
if (header[0] === 255 && header[1] === 216 && header[2] === 255) return "image/jpeg";
|
|
107
|
+
if (header.toString("ascii", 0, 4) === "RIFF" && header.toString("ascii", 8, 12) === "WEBP") return "image/webp";
|
|
108
|
+
if (outputFormat === "jpeg") return "image/jpeg";
|
|
109
|
+
if (outputFormat === "webp") return "image/webp";
|
|
110
|
+
if (outputFormat === void 0 || outputFormat === "png") return "image/png";
|
|
111
|
+
throw new OpenAIProtocolError(`Unsupported image output format: ${String(outputFormat)}`);
|
|
112
|
+
}
|
|
94
113
|
function normalizeOpenAIEvent(raw) {
|
|
95
114
|
if (!raw || typeof raw !== "object") return void 0;
|
|
96
115
|
const event = raw;
|
|
@@ -112,7 +131,7 @@ function normalizeOpenAIEvent(raw) {
|
|
|
112
131
|
type: "image",
|
|
113
132
|
...typeof item.id === "string" ? { id: item.id } : {},
|
|
114
133
|
base64: item.result,
|
|
115
|
-
mimeType:
|
|
134
|
+
mimeType: imageMimeType(item.result, item.output_format),
|
|
116
135
|
...typeof item.revised_prompt === "string" ? { revisedPrompt: item.revised_prompt } : typeof item.revisedPrompt === "string" ? { revisedPrompt: item.revisedPrompt } : {}
|
|
117
136
|
};
|
|
118
137
|
return {
|
|
@@ -139,6 +158,6 @@ function normalizeOpenAIEvent(raw) {
|
|
|
139
158
|
}
|
|
140
159
|
}
|
|
141
160
|
//#endregion
|
|
142
|
-
export { CHATGPT_CODEX_RESPONSES_URL, CODEX_CLI_ORIGINATOR, CODEX_CLI_VERSION, OpenAIProtocolError, buildCodexIdentityHeaders, buildOpenAIResponsesRequest, codexCliUserAgent, normalizeOpenAIEvent };
|
|
161
|
+
export { CHATGPT_CODEX_RESPONSES_URL, CODEX_CLI_ORIGINATOR, CODEX_CLI_VERSION, OpenAIProtocolError, buildCodexIdentityHeaders, buildOpenAIResponsesRequest, codexCliUserAgent, imageMimeType, normalizeOpenAIEvent };
|
|
143
162
|
|
|
144
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3BlbmFpLWJhY2tlbmQtcHJvdG9jb2wuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3V0aWxzL3Byb3ZpZGVycy9vcGVuYWkvb3BlbmFpLWJhY2tlbmQtcHJvdG9jb2wudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IG9zIGZyb20gXCJub2RlOm9zXCI7XG5cbmltcG9ydCB7IHR5cGUgT3BlbkFJRWZmb3J0IH0gZnJvbSBcIi4uL2NvbW1vbi9lZmZvcnRcIjtcblxuZXhwb3J0IGNvbnN0IENIQVRHUFRfQ09ERVhfUkVTUE9OU0VTX1VSTCA9XG4gIFwiaHR0cHM6Ly9jaGF0Z3B0LmNvbS9iYWNrZW5kLWFwaS9jb2RleC9yZXNwb25zZXNcIiBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IENPREVYX0NMSV9PUklHSU5BVE9SID0gXCJjb2RleF9jbGlfcnNcIiBhcyBjb25zdDtcbmV4cG9ydCBjb25zdCBDT0RFWF9DTElfVkVSU0lPTiA9IFwiMC4xNDcuMFwiIGFzIGNvbnN0O1xuXG5leHBvcnQgaW50ZXJmYWNlIENvZGV4VXNlckFnZW50UGxhdGZvcm0ge1xuICBvc1R5cGU6IHN0cmluZztcbiAgb3NWZXJzaW9uOiBzdHJpbmc7XG4gIGFyY2hpdGVjdHVyZTogc3RyaW5nO1xuICB0ZXJtaW5hbDogc3RyaW5nO1xufVxuXG5mdW5jdGlvbiBjb2RleFBsYXRmb3JtKCk6IENvZGV4VXNlckFnZW50UGxhdGZvcm0ge1xuICBjb25zdCBuYW1lczogUGFydGlhbDxSZWNvcmQ8Tm9kZUpTLlBsYXRmb3JtLCBzdHJpbmc+PiA9IHtcbiAgICBkYXJ3aW46IFwiTWFjIE9TXCIsXG4gICAgbGludXg6IFwiTGludXhcIixcbiAgICB3aW4zMjogXCJXaW5kb3dzXCIsXG4gIH07XG4gIGNvbnN0IHRlcm1pbmFsID0gcHJvY2Vzcy5lbnYuVEVSTV9QUk9HUkFNO1xuICBjb25zdCB0ZXJtaW5hbFZlcnNpb24gPSBwcm9jZXNzLmVudi5URVJNX1BST0dSQU1fVkVSU0lPTjtcbiAgcmV0dXJuIHtcbiAgICBvc1R5cGU6IG5hbWVzW3Byb2Nlc3MucGxhdGZvcm1dID8/IHByb2Nlc3MucGxhdGZvcm0sXG4gICAgb3NWZXJzaW9uOiBvcy5yZWxlYXNlKCksXG4gICAgYXJjaGl0ZWN0dXJlOiBwcm9jZXNzLmFyY2gsXG4gICAgdGVybWluYWw6IHRlcm1pbmFsID8gYCR7dGVybWluYWx9JHt0ZXJtaW5hbFZlcnNpb24gPyBgLyR7dGVybWluYWxWZXJzaW9ufWAgOiBcIlwifWAgOiBcInVua25vd25cIixcbiAgfTtcbn1cblxuLyoqIE1hdGNoZXMgdGhlIHBsYXRmb3JtL3Rlcm1pbmFsIHN1ZmZpeCBlbWl0dGVkIGJ5IHRoZSBwaW5uZWQgUnVzdCBDb2RleCBDTEkuICovXG5leHBvcnQgZnVuY3Rpb24gY29kZXhDbGlVc2VyQWdlbnQocGxhdGZvcm06IENvZGV4VXNlckFnZW50UGxhdGZvcm0gPSBjb2RleFBsYXRmb3JtKCkpOiBzdHJpbmcge1xuICByZXR1cm4gYGNvZGV4X2NsaV9ycy8ke0NPREVYX0NMSV9WRVJTSU9OfSAoJHtwbGF0Zm9ybS5vc1R5cGV9ICR7cGxhdGZvcm0ub3NWZXJzaW9ufTsgJHtwbGF0Zm9ybS5hcmNoaXRlY3R1cmV9KSAke3BsYXRmb3JtLnRlcm1pbmFsfWA7XG59XG5cbmV4cG9ydCB0eXBlIEpzb25WYWx1ZSA9XG4gIHwgbnVsbFxuICB8IGJvb2xlYW5cbiAgfCBudW1iZXJcbiAgfCBzdHJpbmdcbiAgfCBKc29uVmFsdWVbXVxuICB8IHsgW2tleTogc3RyaW5nXTogSnNvblZhbHVlIH07XG5cbi8qKiBSYXcgUmVzcG9uc2VzIEFQSSBpdGVtcy4gS2VlcGluZyB0aGVzZSBvcGFxdWUgcHJlc2VydmVzIHRoZSBjb21wbGV0ZSBjb252ZXJzYXRpb24gaGlzdG9yeS4gKi9cbmV4cG9ydCB0eXBlIE9wZW5BSVJlc3BvbnNlSXRlbSA9IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuXG5leHBvcnQgaW50ZXJmYWNlIE9wZW5BSU91dHB1dFNjaGVtYSB7XG4gIG5hbWU/OiBzdHJpbmc7XG4gIHNjaGVtYTogSnNvblZhbHVlO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE9wZW5BSVJlc3BvbnNlc09wdGlvbnMge1xuICBtb2RlbDogc3RyaW5nO1xuICBpbnN0cnVjdGlvbnM/OiBzdHJpbmc7XG4gIGhpc3Rvcnk6IHJlYWRvbmx5IE9wZW5BSVJlc3BvbnNlSXRlbVtdO1xuICB0b29scz86IHJlYWRvbmx5IE9wZW5BSVJlc3BvbnNlSXRlbVtdO1xuICB0b29sQ2hvaWNlPzogc3RyaW5nIHwgT3BlbkFJUmVzcG9uc2VJdGVtO1xuICBwYXJhbGxlbFRvb2xDYWxscz86IGJvb2xlYW47XG4gIHJlYXNvbmluZz86IHtcbiAgICBlZmZvcnQ/OiBPcGVuQUlFZmZvcnQ7XG4gICAgc3VtbWFyeT86IFwiYXV0b1wiIHwgXCJjb25jaXNlXCIgfCBcImRldGFpbGVkXCI7XG4gIH07XG4gIHZlcmJvc2l0eT86IFwibG93XCIgfCBcIm1lZGl1bVwiIHwgXCJoaWdoXCI7XG4gIHNlcnZpY2VUaWVyPzogc3RyaW5nO1xuICBwcm9tcHRDYWNoZUtleT86IHN0cmluZztcbiAgb3V0cHV0U2NoZW1hPzogT3BlbkFJT3V0cHV0U2NoZW1hO1xuICBpbWFnZUdlbmVyYXRpb24/OiBib29sZWFuIHwgT3BlbkFJUmVzcG9uc2VJdGVtO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE9wZW5BSVJlc3BvbnNlc1JlcXVlc3Qge1xuICBtb2RlbDogc3RyaW5nO1xuICBpbnN0cnVjdGlvbnM/OiBzdHJpbmc7XG4gIGlucHV0OiBPcGVuQUlSZXNwb25zZUl0ZW1bXTtcbiAgdG9vbHM/OiBPcGVuQUlSZXNwb25zZUl0ZW1bXTtcbiAgdG9vbF9jaG9pY2U6IHN0cmluZyB8IE9wZW5BSVJlc3BvbnNlSXRlbTtcbiAgcGFyYWxsZWxfdG9vbF9jYWxsczogYm9vbGVhbjtcbiAgcmVhc29uaW5nOiBPcGVuQUlSZXNwb25zZXNPcHRpb25zW1wicmVhc29uaW5nXCJdIHwgbnVsbDtcbiAgc3RvcmU6IGZhbHNlO1xuICBzdHJlYW06IHRydWU7XG4gIGluY2x1ZGU6IHN0cmluZ1tdO1xuICBzZXJ2aWNlX3RpZXI/OiBzdHJpbmc7XG4gIHByb21wdF9jYWNoZV9rZXk/OiBzdHJpbmc7XG4gIHRleHQ/OiB7XG4gICAgdmVyYm9zaXR5PzogXCJsb3dcIiB8IFwibWVkaXVtXCIgfCBcImhpZ2hcIjtcbiAgICBmb3JtYXQ/OiB7XG4gICAgICB0eXBlOiBcImpzb25fc2NoZW1hXCI7XG4gICAgICBzdHJpY3Q6IHRydWU7XG4gICAgICBzY2hlbWE6IEpzb25WYWx1ZTtcbiAgICAgIG5hbWU6IHN0cmluZztcbiAgICB9O1xuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRPcGVuQUlSZXNwb25zZXNSZXF1ZXN0KFxuICBvcHRpb25zOiBPcGVuQUlSZXNwb25zZXNPcHRpb25zLFxuKTogT3BlbkFJUmVzcG9uc2VzUmVxdWVzdCB7XG4gIGNvbnN0IHRvb2xzID0gb3B0aW9ucy50b29scyA/IFsuLi5vcHRpb25zLnRvb2xzXSA6IFtdO1xuICBpZiAob3B0aW9ucy5pbWFnZUdlbmVyYXRpb24pIHtcbiAgICB0b29scy5wdXNoKFxuICAgICAgb3B0aW9ucy5pbWFnZUdlbmVyYXRpb24gPT09IHRydWVcbiAgICAgICAgPyB7IHR5cGU6IFwiaW1hZ2VfZ2VuZXJhdGlvblwiIH1cbiAgICAgICAgOiB7IHR5cGU6IFwiaW1hZ2VfZ2VuZXJhdGlvblwiLCAuLi5vcHRpb25zLmltYWdlR2VuZXJhdGlvbiB9LFxuICAgICk7XG4gIH1cblxuICBjb25zdCB0ZXh0ID1cbiAgICBvcHRpb25zLnZlcmJvc2l0eSB8fCBvcHRpb25zLm91dHB1dFNjaGVtYVxuICAgICAgPyB7XG4gICAgICAgICAgLi4uKG9wdGlvbnMudmVyYm9zaXR5ID8geyB2ZXJib3NpdHk6IG9wdGlvbnMudmVyYm9zaXR5IH0gOiB7fSksXG4gICAgICAgICAgLi4uKG9wdGlvbnMub3V0cHV0U2NoZW1hXG4gICAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgICBmb3JtYXQ6IHtcbiAgICAgICAgICAgICAgICAgIHR5cGU6IFwianNvbl9zY2hlbWFcIiBhcyBjb25zdCxcbiAgICAgICAgICAgICAgICAgIHN0cmljdDogdHJ1ZSBhcyBjb25zdCxcbiAgICAgICAgICAgICAgICAgIHNjaGVtYTogb3B0aW9ucy5vdXRwdXRTY2hlbWEuc2NoZW1hLFxuICAgICAgICAgICAgICAgICAgbmFtZTogb3B0aW9ucy5vdXRwdXRTY2hlbWEubmFtZSA/PyBcImNvZGV4X291dHB1dF9zY2hlbWFcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA6IHt9KSxcbiAgICAgICAgfVxuICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgcmV0dXJuIHtcbiAgICBtb2RlbDogb3B0aW9ucy5tb2RlbCxcbiAgICAuLi4ob3B0aW9ucy5pbnN0cnVjdGlvbnMgPyB7IGluc3RydWN0aW9uczogb3B0aW9ucy5pbnN0cnVjdGlvbnMgfSA6IHt9KSxcbiAgICAvLyBDb3B5IHRoZSBhcnJheSwgbm90IGl0cyBpdGVtczogcmF3IGl0ZW1zIG11c3QgYXJyaXZlIGJ5dGUtZm9yLWJ5dGUgZXF1aXZhbGVudC5cbiAgICBpbnB1dDogWy4uLm9wdGlvbnMuaGlzdG9yeV0sXG4gICAgLi4uKHRvb2xzLmxlbmd0aCA/IHsgdG9vbHMgfSA6IHt9KSxcbiAgICB0b29sX2Nob2ljZTogb3B0aW9ucy50b29sQ2hvaWNlID8/IFwiYXV0b1wiLFxuICAgIHBhcmFsbGVsX3Rvb2xfY2FsbHM6IG9wdGlvbnMucGFyYWxsZWxUb29sQ2FsbHMgPz8gdHJ1ZSxcbiAgICByZWFzb25pbmc6IG9wdGlvbnMucmVhc29uaW5nID8/IG51bGwsXG4gICAgc3RvcmU6IGZhbHNlLFxuICAgIHN0cmVhbTogdHJ1ZSxcbiAgICBpbmNsdWRlOiBbXCJyZWFzb25pbmcuZW5jcnlwdGVkX2NvbnRlbnRcIl0sXG4gICAgLi4uKG9wdGlvbnMuc2VydmljZVRpZXIgPyB7IHNlcnZpY2VfdGllcjogb3B0aW9ucy5zZXJ2aWNlVGllciB9IDoge30pLFxuICAgIC4uLihvcHRpb25zLnByb21wdENhY2hlS2V5ID8geyBwcm9tcHRfY2FjaGVfa2V5OiBvcHRpb25zLnByb21wdENhY2hlS2V5IH0gOiB7fSksXG4gICAgLi4uKHRleHQgPyB7IHRleHQgfSA6IHt9KSxcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkQ29kZXhJZGVudGl0eUhlYWRlcnMoXG4gIGFjY2Vzc1Rva2VuOiBzdHJpbmcsXG4gIGFjY291bnRJZDogc3RyaW5nLFxuICBjb3JyZWxhdGlvbj86IHsgc2Vzc2lvbklkPzogc3RyaW5nOyB0aHJlYWRJZD86IHN0cmluZzsgY2xpZW50UmVxdWVzdElkPzogc3RyaW5nIH0sXG4pOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHtcbiAgcmV0dXJuIHtcbiAgICBBY2NlcHQ6IFwidGV4dC9ldmVudC1zdHJlYW1cIixcbiAgICBBdXRob3JpemF0aW9uOiBgQmVhcmVyICR7YWNjZXNzVG9rZW59YCxcbiAgICBcIkNoYXRHUFQtQWNjb3VudC1JRFwiOiBhY2NvdW50SWQsXG4gICAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIsXG4gICAgb3JpZ2luYXRvcjogQ09ERVhfQ0xJX09SSUdJTkFUT1IsXG4gICAgXCJVc2VyLUFnZW50XCI6IGNvZGV4Q2xpVXNlckFnZW50KCksXG4gICAgLi4uKGNvcnJlbGF0aW9uPy5zZXNzaW9uSWQgPyB7IFwic2Vzc2lvbi1pZFwiOiBjb3JyZWxhdGlvbi5zZXNzaW9uSWQgfSA6IHt9KSxcbiAgICAuLi4oY29ycmVsYXRpb24/LnRocmVhZElkID8geyBcInRocmVhZC1pZFwiOiBjb3JyZWxhdGlvbi50aHJlYWRJZCB9IDoge30pLFxuICAgIC4uLihjb3JyZWxhdGlvbj8uY2xpZW50UmVxdWVzdElkID8geyBcIngtY2xpZW50LXJlcXVlc3QtaWRcIjogY29ycmVsYXRpb24uY2xpZW50UmVxdWVzdElkIH0gOiB7fSksXG4gIH07XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgT3BlbkFJVXNhZ2Uge1xuICBpbnB1dFRva2VuczogbnVtYmVyO1xuICBjYWNoZWRJbnB1dFRva2VuczogbnVtYmVyO1xuICBvdXRwdXRUb2tlbnM6IG51bWJlcjtcbiAgcmVhc29uaW5nVG9rZW5zOiBudW1iZXI7XG4gIHRvdGFsVG9rZW5zOiBudW1iZXI7XG59XG5cbmV4cG9ydCB0eXBlIE9wZW5BSU5vcm1hbGl6ZWRFdmVudCA9XG4gIHwgeyB0eXBlOiBcImNyZWF0ZWRcIjsgcmVzcG9uc2VJZD86IHN0cmluZyB9XG4gIHwgeyB0eXBlOiBcInRleHQtZGVsdGFcIjsgdGV4dDogc3RyaW5nIH1cbiAgfCB7IHR5cGU6IFwiaW1hZ2VcIjsgaWQ/OiBzdHJpbmc7IGJhc2U2NDogc3RyaW5nOyBtaW1lVHlwZTogXCJpbWFnZS9wbmdcIjsgcmV2aXNlZFByb21wdD86IHN0cmluZyB9XG4gIHwgeyB0eXBlOiBcIm91dHB1dC1pdGVtXCI7IGl0ZW06IE9wZW5BSVJlc3BvbnNlSXRlbSB9XG4gIHwgeyB0eXBlOiBcImNvbXBsZXRlZFwiOyByZXNwb25zZUlkOiBzdHJpbmc7IHVzYWdlPzogT3BlbkFJVXNhZ2U7IG1vZGVsPzogc3RyaW5nIH1cbiAgfCB7IHR5cGU6IFwiZXJyb3JcIjsgZXJyb3I6IE9wZW5BSVByb3RvY29sRXJyb3IgfTtcblxuZXhwb3J0IGNsYXNzIE9wZW5BSVByb3RvY29sRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIG1lc3NhZ2U6IHN0cmluZyxcbiAgICBwdWJsaWMgcmVhZG9ubHkgY29kZT86IHN0cmluZyxcbiAgICBwdWJsaWMgcmVhZG9ubHkgc3RhdHVzPzogbnVtYmVyLFxuICAgIHB1YmxpYyByZWFkb25seSByZXRyeUFmdGVyTXM/OiBudW1iZXIsXG4gICkge1xuICAgIHN1cGVyKG1lc3NhZ2UpO1xuICAgIHRoaXMubmFtZSA9IFwiT3BlbkFJUHJvdG9jb2xFcnJvclwiO1xuICB9XG59XG5cbmZ1bmN0aW9uIHVzYWdlRnJvbSh2YWx1ZTogdW5rbm93bik6IE9wZW5BSVVzYWdlIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCF2YWx1ZSB8fCB0eXBlb2YgdmFsdWUgIT09IFwib2JqZWN0XCIpIHJldHVybiB1bmRlZmluZWQ7XG4gIGNvbnN0IHVzYWdlID0gdmFsdWUgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIGNvbnN0IGlucHV0RGV0YWlscyA9ICh1c2FnZS5pbnB1dF90b2tlbnNfZGV0YWlscyA/PyB7fSkgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIGNvbnN0IG91dHB1dERldGFpbHMgPSAodXNhZ2Uub3V0cHV0X3Rva2Vuc19kZXRhaWxzID8/IHt9KSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgcmV0dXJuIHtcbiAgICBpbnB1dFRva2VuczogTnVtYmVyKHVzYWdlLmlucHV0X3Rva2VucyA/PyAwKSxcbiAgICBjYWNoZWRJbnB1dFRva2VuczogTnVtYmVyKGlucHV0RGV0YWlscy5jYWNoZWRfdG9rZW5zID8/IDApLFxuICAgIG91dHB1dFRva2VuczogTnVtYmVyKHVzYWdlLm91dHB1dF90b2tlbnMgPz8gMCksXG4gICAgcmVhc29uaW5nVG9rZW5zOiBOdW1iZXIob3V0cHV0RGV0YWlscy5yZWFzb25pbmdfdG9rZW5zID8/IDApLFxuICAgIHRvdGFsVG9rZW5zOiBOdW1iZXIodXNhZ2UudG90YWxfdG9rZW5zID8/IDApLFxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplT3BlbkFJRXZlbnQocmF3OiB1bmtub3duKTogT3BlbkFJTm9ybWFsaXplZEV2ZW50IHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFyYXcgfHwgdHlwZW9mIHJhdyAhPT0gXCJvYmplY3RcIikgcmV0dXJuIHVuZGVmaW5lZDtcbiAgY29uc3QgZXZlbnQgPSByYXcgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIGNvbnN0IHR5cGUgPSBTdHJpbmcoZXZlbnQudHlwZSA/PyBcIlwiKTtcbiAgaWYgKHR5cGUgPT09IFwicmVzcG9uc2UuY3JlYXRlZFwiKSB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBldmVudC5yZXNwb25zZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZDtcbiAgICByZXR1cm4geyB0eXBlOiBcImNyZWF0ZWRcIiwgLi4uKHJlc3BvbnNlPy5pZCA/IHsgcmVzcG9uc2VJZDogU3RyaW5nKHJlc3BvbnNlLmlkKSB9IDoge30pIH07XG4gIH1cbiAgaWYgKHR5cGUgPT09IFwicmVzcG9uc2Uub3V0cHV0X3RleHQuZGVsdGFcIiAmJiB0eXBlb2YgZXZlbnQuZGVsdGEgPT09IFwic3RyaW5nXCIpIHtcbiAgICByZXR1cm4geyB0eXBlOiBcInRleHQtZGVsdGFcIiwgdGV4dDogZXZlbnQuZGVsdGEgfTtcbiAgfVxuICBpZiAoXG4gICAgKHR5cGUgPT09IFwicmVzcG9uc2Uub3V0cHV0X2l0ZW0uYWRkZWRcIiB8fCB0eXBlID09PSBcInJlc3BvbnNlLm91dHB1dF9pdGVtLmRvbmVcIikgJiZcbiAgICBldmVudC5pdGVtICYmXG4gICAgdHlwZW9mIGV2ZW50Lml0ZW0gPT09IFwib2JqZWN0XCJcbiAgKSB7XG4gICAgY29uc3QgaXRlbSA9IGV2ZW50Lml0ZW0gYXMgT3BlbkFJUmVzcG9uc2VJdGVtO1xuICAgIGlmIChpdGVtLnR5cGUgPT09IFwiaW1hZ2VfZ2VuZXJhdGlvbl9jYWxsXCIgJiYgdHlwZW9mIGl0ZW0ucmVzdWx0ID09PSBcInN0cmluZ1wiKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0eXBlOiBcImltYWdlXCIsXG4gICAgICAgIC4uLih0eXBlb2YgaXRlbS5pZCA9PT0gXCJzdHJpbmdcIiA/IHsgaWQ6IGl0ZW0uaWQgfSA6IHt9KSxcbiAgICAgICAgYmFzZTY0OiBpdGVtLnJlc3VsdCxcbiAgICAgICAgbWltZVR5cGU6IFwiaW1hZ2UvcG5nXCIsXG4gICAgICAgIC4uLih0eXBlb2YgaXRlbS5yZXZpc2VkX3Byb21wdCA9PT0gXCJzdHJpbmdcIlxuICAgICAgICAgID8geyByZXZpc2VkUHJvbXB0OiBpdGVtLnJldmlzZWRfcHJvbXB0IH1cbiAgICAgICAgICA6IHR5cGVvZiBpdGVtLnJldmlzZWRQcm9tcHQgPT09IFwic3RyaW5nXCJcbiAgICAgICAgICAgID8geyByZXZpc2VkUHJvbXB0OiBpdGVtLnJldmlzZWRQcm9tcHQgfVxuICAgICAgICAgICAgOiB7fSksXG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4geyB0eXBlOiBcIm91dHB1dC1pdGVtXCIsIGl0ZW0gfTtcbiAgfVxuICBpZiAodHlwZSA9PT0gXCJyZXNwb25zZS5jb21wbGV0ZWRcIikge1xuICAgIGNvbnN0IHJlc3BvbnNlID0gKGV2ZW50LnJlc3BvbnNlID8/IHt9KSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogXCJjb21wbGV0ZWRcIixcbiAgICAgIHJlc3BvbnNlSWQ6IFN0cmluZyhyZXNwb25zZS5pZCA/PyBcIlwiKSxcbiAgICAgIC4uLihyZXNwb25zZS51c2FnZSA/IHsgdXNhZ2U6IHVzYWdlRnJvbShyZXNwb25zZS51c2FnZSkgfSA6IHt9KSxcbiAgICAgIC4uLih0eXBlb2YgcmVzcG9uc2UubW9kZWwgPT09IFwic3RyaW5nXCIgPyB7IG1vZGVsOiByZXNwb25zZS5tb2RlbCB9IDoge30pLFxuICAgIH07XG4gIH1cbiAgaWYgKHR5cGUgPT09IFwiZXJyb3JcIiB8fCB0eXBlID09PSBcInJlc3BvbnNlLmZhaWxlZFwiIHx8IHR5cGUgPT09IFwicmVzcG9uc2UuaW5jb21wbGV0ZVwiKSB7XG4gICAgY29uc3Qgc291cmNlID0gKGV2ZW50LmVycm9yID8/IGV2ZW50LnJlc3BvbnNlID8/IGV2ZW50KSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICBjb25zdCBuZXN0ZWQgPSAoc291cmNlLmVycm9yID8/IHNvdXJjZSkgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6IFwiZXJyb3JcIixcbiAgICAgIGVycm9yOiBuZXcgT3BlbkFJUHJvdG9jb2xFcnJvcihcbiAgICAgICAgU3RyaW5nKG5lc3RlZC5tZXNzYWdlID8/IGBPcGVuQUkgc3RyZWFtIGVuZGVkIHdpdGggJHt0eXBlfWApLFxuICAgICAgICB0eXBlb2YgbmVzdGVkLmNvZGUgPT09IFwic3RyaW5nXCIgPyBuZXN0ZWQuY29kZSA6IHVuZGVmaW5lZCxcbiAgICAgICksXG4gICAgfTtcbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuIl0sIm1hcHBpbmdzIjoiOztBQUlBLE1BQWEsOEJBQ1g7QUFFRixNQUFhLHVCQUF1QjtBQUNwQyxNQUFhLG9CQUFvQjtBQVNqQyxTQUFTLGdCQUF3QztDQUMvQyxNQUFNLFFBQWtEO0VBQ3RELFFBQVE7RUFDUixPQUFPO0VBQ1AsT0FBTztDQUNUO0NBQ0EsTUFBTSxXQUFXLFFBQVEsSUFBSTtDQUM3QixNQUFNLGtCQUFrQixRQUFRLElBQUk7Q0FDcEMsT0FBTztFQUNMLFFBQVEsTUFBTSxRQUFRLGFBQWEsUUFBUTtFQUMzQyxXQUFXLEdBQUcsUUFBUTtFQUN0QixjQUFjLFFBQVE7RUFDdEIsVUFBVSxXQUFXLEdBQUcsV0FBVyxrQkFBa0IsSUFBSSxvQkFBb0IsT0FBTztDQUN0RjtBQUNGOztBQUdBLFNBQWdCLGtCQUFrQixXQUFtQyxjQUFjLEdBQVc7Q0FDNUYsT0FBTyxnQkFBZ0Isa0JBQWtCLElBQUksU0FBUyxPQUFPLEdBQUcsU0FBUyxVQUFVLElBQUksU0FBUyxhQUFhLElBQUksU0FBUztBQUM1SDtBQTREQSxTQUFnQiw0QkFDZCxTQUN3QjtDQUN4QixNQUFNLFFBQVEsUUFBUSxRQUFRLENBQUMsR0FBRyxRQUFRLEtBQUssSUFBSSxDQUFDO0NBQ3BELElBQUksUUFBUSxpQkFDVixNQUFNLEtBQ0osUUFBUSxvQkFBb0IsT0FDeEIsRUFBRSxNQUFNLG1CQUFtQixJQUMzQjtFQUFFLE1BQU07RUFBb0IsR0FBRyxRQUFRO0NBQWdCLENBQzdEO0NBR0YsTUFBTSxPQUNKLFFB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
|
|
163
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3BlbmFpLWJhY2tlbmQtcHJvdG9jb2wuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3V0aWxzL3Byb3ZpZGVycy9vcGVuYWkvb3BlbmFpLWJhY2tlbmQtcHJvdG9jb2wudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IG9zIGZyb20gXCJub2RlOm9zXCI7XG5cbmltcG9ydCB7IHR5cGUgSW1hZ2VHZW5lcmF0aW9uTWV0YWRhdGEgfSBmcm9tIFwiLi4vLi4vLi4vYXBwbGljYXRpb24vcWdyaWQvcWdyaWQudHlwZXNcIjtcbmltcG9ydCB7IHR5cGUgT3BlbkFJRWZmb3J0IH0gZnJvbSBcIi4uL2NvbW1vbi9lZmZvcnRcIjtcblxuZXhwb3J0IGNvbnN0IENIQVRHUFRfQ09ERVhfUkVTUE9OU0VTX1VSTCA9XG4gIFwiaHR0cHM6Ly9jaGF0Z3B0LmNvbS9iYWNrZW5kLWFwaS9jb2RleC9yZXNwb25zZXNcIiBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IENPREVYX0NMSV9PUklHSU5BVE9SID0gXCJjb2RleF9jbGlfcnNcIiBhcyBjb25zdDtcbmV4cG9ydCBjb25zdCBDT0RFWF9DTElfVkVSU0lPTiA9IFwiMC4xNDcuMFwiIGFzIGNvbnN0O1xuXG5leHBvcnQgaW50ZXJmYWNlIENvZGV4VXNlckFnZW50UGxhdGZvcm0ge1xuICBvc1R5cGU6IHN0cmluZztcbiAgb3NWZXJzaW9uOiBzdHJpbmc7XG4gIGFyY2hpdGVjdHVyZTogc3RyaW5nO1xuICB0ZXJtaW5hbDogc3RyaW5nO1xufVxuXG5mdW5jdGlvbiBjb2RleFBsYXRmb3JtKCk6IENvZGV4VXNlckFnZW50UGxhdGZvcm0ge1xuICBjb25zdCBuYW1lczogUGFydGlhbDxSZWNvcmQ8Tm9kZUpTLlBsYXRmb3JtLCBzdHJpbmc+PiA9IHtcbiAgICBkYXJ3aW46IFwiTWFjIE9TXCIsXG4gICAgbGludXg6IFwiTGludXhcIixcbiAgICB3aW4zMjogXCJXaW5kb3dzXCIsXG4gIH07XG4gIGNvbnN0IHRlcm1pbmFsID0gcHJvY2Vzcy5lbnYuVEVSTV9QUk9HUkFNO1xuICBjb25zdCB0ZXJtaW5hbFZlcnNpb24gPSBwcm9jZXNzLmVudi5URVJNX1BST0dSQU1fVkVSU0lPTjtcbiAgcmV0dXJuIHtcbiAgICBvc1R5cGU6IG5hbWVzW3Byb2Nlc3MucGxhdGZvcm1dID8/IHByb2Nlc3MucGxhdGZvcm0sXG4gICAgb3NWZXJzaW9uOiBvcy5yZWxlYXNlKCksXG4gICAgYXJjaGl0ZWN0dXJlOiBwcm9jZXNzLmFyY2gsXG4gICAgdGVybWluYWw6IHRlcm1pbmFsID8gYCR7dGVybWluYWx9JHt0ZXJtaW5hbFZlcnNpb24gPyBgLyR7dGVybWluYWxWZXJzaW9ufWAgOiBcIlwifWAgOiBcInVua25vd25cIixcbiAgfTtcbn1cblxuLyoqIE1hdGNoZXMgdGhlIHBsYXRmb3JtL3Rlcm1pbmFsIHN1ZmZpeCBlbWl0dGVkIGJ5IHRoZSBwaW5uZWQgUnVzdCBDb2RleCBDTEkuICovXG5leHBvcnQgZnVuY3Rpb24gY29kZXhDbGlVc2VyQWdlbnQocGxhdGZvcm06IENvZGV4VXNlckFnZW50UGxhdGZvcm0gPSBjb2RleFBsYXRmb3JtKCkpOiBzdHJpbmcge1xuICByZXR1cm4gYGNvZGV4X2NsaV9ycy8ke0NPREVYX0NMSV9WRVJTSU9OfSAoJHtwbGF0Zm9ybS5vc1R5cGV9ICR7cGxhdGZvcm0ub3NWZXJzaW9ufTsgJHtwbGF0Zm9ybS5hcmNoaXRlY3R1cmV9KSAke3BsYXRmb3JtLnRlcm1pbmFsfWA7XG59XG5cbmV4cG9ydCB0eXBlIEpzb25WYWx1ZSA9XG4gIHwgbnVsbFxuICB8IGJvb2xlYW5cbiAgfCBudW1iZXJcbiAgfCBzdHJpbmdcbiAgfCBKc29uVmFsdWVbXVxuICB8IHsgW2tleTogc3RyaW5nXTogSnNvblZhbHVlIH07XG5cbi8qKiBSYXcgUmVzcG9uc2VzIEFQSSBpdGVtcy4gS2VlcGluZyB0aGVzZSBvcGFxdWUgcHJlc2VydmVzIHRoZSBjb21wbGV0ZSBjb252ZXJzYXRpb24gaGlzdG9yeS4gKi9cbmV4cG9ydCB0eXBlIE9wZW5BSVJlc3BvbnNlSXRlbSA9IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuXG5leHBvcnQgaW50ZXJmYWNlIE9wZW5BSU91dHB1dFNjaGVtYSB7XG4gIG5hbWU/OiBzdHJpbmc7XG4gIHNjaGVtYTogSnNvblZhbHVlO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE9wZW5BSVJlc3BvbnNlc09wdGlvbnMge1xuICBtb2RlbDogc3RyaW5nO1xuICBpbnN0cnVjdGlvbnM/OiBzdHJpbmc7XG4gIGhpc3Rvcnk6IHJlYWRvbmx5IE9wZW5BSVJlc3BvbnNlSXRlbVtdO1xuICB0b29scz86IHJlYWRvbmx5IE9wZW5BSVJlc3BvbnNlSXRlbVtdO1xuICB0b29sQ2hvaWNlPzogc3RyaW5nIHwgT3BlbkFJUmVzcG9uc2VJdGVtO1xuICBwYXJhbGxlbFRvb2xDYWxscz86IGJvb2xlYW47XG4gIHJlYXNvbmluZz86IHtcbiAgICBlZmZvcnQ/OiBPcGVuQUlFZmZvcnQ7XG4gICAgc3VtbWFyeT86IFwiYXV0b1wiIHwgXCJjb25jaXNlXCIgfCBcImRldGFpbGVkXCI7XG4gIH07XG4gIHZlcmJvc2l0eT86IFwibG93XCIgfCBcIm1lZGl1bVwiIHwgXCJoaWdoXCI7XG4gIHNlcnZpY2VUaWVyPzogc3RyaW5nO1xuICBwcm9tcHRDYWNoZUtleT86IHN0cmluZztcbiAgb3V0cHV0U2NoZW1hPzogT3BlbkFJT3V0cHV0U2NoZW1hO1xuICBpbWFnZUdlbmVyYXRpb24/OiBib29sZWFuIHwgT3BlbkFJUmVzcG9uc2VJdGVtO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE9wZW5BSVJlc3BvbnNlc1JlcXVlc3Qge1xuICBtb2RlbDogc3RyaW5nO1xuICBpbnN0cnVjdGlvbnM/OiBzdHJpbmc7XG4gIGlucHV0OiBPcGVuQUlSZXNwb25zZUl0ZW1bXTtcbiAgdG9vbHM/OiBPcGVuQUlSZXNwb25zZUl0ZW1bXTtcbiAgdG9vbF9jaG9pY2U6IHN0cmluZyB8IE9wZW5BSVJlc3BvbnNlSXRlbTtcbiAgcGFyYWxsZWxfdG9vbF9jYWxsczogYm9vbGVhbjtcbiAgcmVhc29uaW5nOiBPcGVuQUlSZXNwb25zZXNPcHRpb25zW1wicmVhc29uaW5nXCJdIHwgbnVsbDtcbiAgc3RvcmU6IGZhbHNlO1xuICBzdHJlYW06IHRydWU7XG4gIGluY2x1ZGU6IHN0cmluZ1tdO1xuICBzZXJ2aWNlX3RpZXI/OiBzdHJpbmc7XG4gIHByb21wdF9jYWNoZV9rZXk/OiBzdHJpbmc7XG4gIHRleHQ/OiB7XG4gICAgdmVyYm9zaXR5PzogXCJsb3dcIiB8IFwibWVkaXVtXCIgfCBcImhpZ2hcIjtcbiAgICBmb3JtYXQ/OiB7XG4gICAgICB0eXBlOiBcImpzb25fc2NoZW1hXCI7XG4gICAgICBzdHJpY3Q6IHRydWU7XG4gICAgICBzY2hlbWE6IEpzb25WYWx1ZTtcbiAgICAgIG5hbWU6IHN0cmluZztcbiAgICB9O1xuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRPcGVuQUlSZXNwb25zZXNSZXF1ZXN0KFxuICBvcHRpb25zOiBPcGVuQUlSZXNwb25zZXNPcHRpb25zLFxuKTogT3BlbkFJUmVzcG9uc2VzUmVxdWVzdCB7XG4gIGNvbnN0IHRvb2xzID0gb3B0aW9ucy50b29scyA/IFsuLi5vcHRpb25zLnRvb2xzXSA6IFtdO1xuICBpZiAob3B0aW9ucy5pbWFnZUdlbmVyYXRpb24pIHtcbiAgICB0b29scy5wdXNoKFxuICAgICAgb3B0aW9ucy5pbWFnZUdlbmVyYXRpb24gPT09IHRydWVcbiAgICAgICAgPyB7IHR5cGU6IFwiaW1hZ2VfZ2VuZXJhdGlvblwiIH1cbiAgICAgICAgOiB7IHR5cGU6IFwiaW1hZ2VfZ2VuZXJhdGlvblwiLCAuLi5vcHRpb25zLmltYWdlR2VuZXJhdGlvbiB9LFxuICAgICk7XG4gIH1cblxuICBjb25zdCB0ZXh0ID1cbiAgICBvcHRpb25zLnZlcmJvc2l0eSB8fCBvcHRpb25zLm91dHB1dFNjaGVtYVxuICAgICAgPyB7XG4gICAgICAgICAgLi4uKG9wdGlvbnMudmVyYm9zaXR5ID8geyB2ZXJib3NpdHk6IG9wdGlvbnMudmVyYm9zaXR5IH0gOiB7fSksXG4gICAgICAgICAgLi4uKG9wdGlvbnMub3V0cHV0U2NoZW1hXG4gICAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgICBmb3JtYXQ6IHtcbiAgICAgICAgICAgICAgICAgIHR5cGU6IFwianNvbl9zY2hlbWFcIiBhcyBjb25zdCxcbiAgICAgICAgICAgICAgICAgIHN0cmljdDogdHJ1ZSBhcyBjb25zdCxcbiAgICAgICAgICAgICAgICAgIHNjaGVtYTogb3B0aW9ucy5vdXRwdXRTY2hlbWEuc2NoZW1hLFxuICAgICAgICAgICAgICAgICAgbmFtZTogb3B0aW9ucy5vdXRwdXRTY2hlbWEubmFtZSA/PyBcImNvZGV4X291dHB1dF9zY2hlbWFcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA6IHt9KSxcbiAgICAgICAgfVxuICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgcmV0dXJuIHtcbiAgICBtb2RlbDogb3B0aW9ucy5tb2RlbCxcbiAgICAuLi4ob3B0aW9ucy5pbnN0cnVjdGlvbnMgPyB7IGluc3RydWN0aW9uczogb3B0aW9ucy5pbnN0cnVjdGlvbnMgfSA6IHt9KSxcbiAgICAvLyBDb3B5IHRoZSBhcnJheSwgbm90IGl0cyBpdGVtczogcmF3IGl0ZW1zIG11c3QgYXJyaXZlIGJ5dGUtZm9yLWJ5dGUgZXF1aXZhbGVudC5cbiAgICBpbnB1dDogWy4uLm9wdGlvbnMuaGlzdG9yeV0sXG4gICAgLi4uKHRvb2xzLmxlbmd0aCA/IHsgdG9vbHMgfSA6IHt9KSxcbiAgICB0b29sX2Nob2ljZTogb3B0aW9ucy50b29sQ2hvaWNlID8/IFwiYXV0b1wiLFxuICAgIHBhcmFsbGVsX3Rvb2xfY2FsbHM6IG9wdGlvbnMucGFyYWxsZWxUb29sQ2FsbHMgPz8gdHJ1ZSxcbiAgICByZWFzb25pbmc6IG9wdGlvbnMucmVhc29uaW5nID8/IG51bGwsXG4gICAgc3RvcmU6IGZhbHNlLFxuICAgIHN0cmVhbTogdHJ1ZSxcbiAgICBpbmNsdWRlOiBbXCJyZWFzb25pbmcuZW5jcnlwdGVkX2NvbnRlbnRcIl0sXG4gICAgLi4uKG9wdGlvbnMuc2VydmljZVRpZXIgPyB7IHNlcnZpY2VfdGllcjogb3B0aW9ucy5zZXJ2aWNlVGllciB9IDoge30pLFxuICAgIC4uLihvcHRpb25zLnByb21wdENhY2hlS2V5ID8geyBwcm9tcHRfY2FjaGVfa2V5OiBvcHRpb25zLnByb21wdENhY2hlS2V5IH0gOiB7fSksXG4gICAgLi4uKHRleHQgPyB7IHRleHQgfSA6IHt9KSxcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkQ29kZXhJZGVudGl0eUhlYWRlcnMoXG4gIGFjY2Vzc1Rva2VuOiBzdHJpbmcsXG4gIGFjY291bnRJZDogc3RyaW5nLFxuICBjb3JyZWxhdGlvbj86IHsgc2Vzc2lvbklkPzogc3RyaW5nOyB0aHJlYWRJZD86IHN0cmluZzsgY2xpZW50UmVxdWVzdElkPzogc3RyaW5nIH0sXG4pOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHtcbiAgcmV0dXJuIHtcbiAgICBBY2NlcHQ6IFwidGV4dC9ldmVudC1zdHJlYW1cIixcbiAgICBBdXRob3JpemF0aW9uOiBgQmVhcmVyICR7YWNjZXNzVG9rZW59YCxcbiAgICBcIkNoYXRHUFQtQWNjb3VudC1JRFwiOiBhY2NvdW50SWQsXG4gICAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIsXG4gICAgb3JpZ2luYXRvcjogQ09ERVhfQ0xJX09SSUdJTkFUT1IsXG4gICAgXCJVc2VyLUFnZW50XCI6IGNvZGV4Q2xpVXNlckFnZW50KCksXG4gICAgLi4uKGNvcnJlbGF0aW9uPy5zZXNzaW9uSWQgPyB7IFwic2Vzc2lvbi1pZFwiOiBjb3JyZWxhdGlvbi5zZXNzaW9uSWQgfSA6IHt9KSxcbiAgICAuLi4oY29ycmVsYXRpb24/LnRocmVhZElkID8geyBcInRocmVhZC1pZFwiOiBjb3JyZWxhdGlvbi50aHJlYWRJZCB9IDoge30pLFxuICAgIC4uLihjb3JyZWxhdGlvbj8uY2xpZW50UmVxdWVzdElkID8geyBcIngtY2xpZW50LXJlcXVlc3QtaWRcIjogY29ycmVsYXRpb24uY2xpZW50UmVxdWVzdElkIH0gOiB7fSksXG4gIH07XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgT3BlbkFJVXNhZ2Uge1xuICBpbnB1dFRva2VuczogbnVtYmVyO1xuICBjYWNoZWRJbnB1dFRva2VuczogbnVtYmVyO1xuICBvdXRwdXRUb2tlbnM6IG51bWJlcjtcbiAgcmVhc29uaW5nVG9rZW5zOiBudW1iZXI7XG4gIHRvdGFsVG9rZW5zOiBudW1iZXI7XG59XG5cbmV4cG9ydCB0eXBlIE9wZW5BSU5vcm1hbGl6ZWRFdmVudCA9XG4gIHwgeyB0eXBlOiBcImNyZWF0ZWRcIjsgcmVzcG9uc2VJZD86IHN0cmluZyB9XG4gIHwgeyB0eXBlOiBcInRleHQtZGVsdGFcIjsgdGV4dDogc3RyaW5nIH1cbiAgfCB7XG4gICAgICB0eXBlOiBcImltYWdlXCI7XG4gICAgICBpZD86IHN0cmluZztcbiAgICAgIGJhc2U2NDogc3RyaW5nO1xuICAgICAgbWltZVR5cGU6IFwiaW1hZ2UvcG5nXCIgfCBcImltYWdlL2pwZWdcIiB8IFwiaW1hZ2Uvd2VicFwiO1xuICAgICAgcmV2aXNlZFByb21wdD86IHN0cmluZztcbiAgICAgIGdlbmVyYXRpb24/OiBJbWFnZUdlbmVyYXRpb25NZXRhZGF0YTtcbiAgICB9XG4gIHwgeyB0eXBlOiBcIm91dHB1dC1pdGVtXCI7IGl0ZW06IE9wZW5BSVJlc3BvbnNlSXRlbSB9XG4gIHwgeyB0eXBlOiBcImNvbXBsZXRlZFwiOyByZXNwb25zZUlkOiBzdHJpbmc7IHVzYWdlPzogT3BlbkFJVXNhZ2U7IG1vZGVsPzogc3RyaW5nIH1cbiAgfCB7IHR5cGU6IFwiZXJyb3JcIjsgZXJyb3I6IE9wZW5BSVByb3RvY29sRXJyb3IgfTtcblxuZXhwb3J0IGNsYXNzIE9wZW5BSVByb3RvY29sRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIG1lc3NhZ2U6IHN0cmluZyxcbiAgICBwdWJsaWMgcmVhZG9ubHkgY29kZT86IHN0cmluZyxcbiAgICBwdWJsaWMgcmVhZG9ubHkgc3RhdHVzPzogbnVtYmVyLFxuICAgIHB1YmxpYyByZWFkb25seSByZXRyeUFmdGVyTXM/OiBudW1iZXIsXG4gICkge1xuICAgIHN1cGVyKG1lc3NhZ2UpO1xuICAgIHRoaXMubmFtZSA9IFwiT3BlbkFJUHJvdG9jb2xFcnJvclwiO1xuICB9XG59XG5cbmZ1bmN0aW9uIHVzYWdlRnJvbSh2YWx1ZTogdW5rbm93bik6IE9wZW5BSVVzYWdlIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCF2YWx1ZSB8fCB0eXBlb2YgdmFsdWUgIT09IFwib2JqZWN0XCIpIHJldHVybiB1bmRlZmluZWQ7XG4gIGNvbnN0IHVzYWdlID0gdmFsdWUgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIGNvbnN0IGlucHV0RGV0YWlscyA9ICh1c2FnZS5pbnB1dF90b2tlbnNfZGV0YWlscyA/PyB7fSkgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIGNvbnN0IG91dHB1dERldGFpbHMgPSAodXNhZ2Uub3V0cHV0X3Rva2Vuc19kZXRhaWxzID8/IHt9KSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgcmV0dXJuIHtcbiAgICBpbnB1dFRva2VuczogTnVtYmVyKHVzYWdlLmlucHV0X3Rva2VucyA/PyAwKSxcbiAgICBjYWNoZWRJbnB1dFRva2VuczogTnVtYmVyKGlucHV0RGV0YWlscy5jYWNoZWRfdG9rZW5zID8/IDApLFxuICAgIG91dHB1dFRva2VuczogTnVtYmVyKHVzYWdlLm91dHB1dF90b2tlbnMgPz8gMCksXG4gICAgcmVhc29uaW5nVG9rZW5zOiBOdW1iZXIob3V0cHV0RGV0YWlscy5yZWFzb25pbmdfdG9rZW5zID8/IDApLFxuICAgIHRvdGFsVG9rZW5zOiBOdW1iZXIodXNhZ2UudG90YWxfdG9rZW5zID8/IDApLFxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaW1hZ2VNaW1lVHlwZShcbiAgYmFzZTY0OiBzdHJpbmcsXG4gIG91dHB1dEZvcm1hdD86IHVua25vd24sXG4pOiBcImltYWdlL3BuZ1wiIHwgXCJpbWFnZS9qcGVnXCIgfCBcImltYWdlL3dlYnBcIiB7XG4gIC8vIEluc3BlY3Qgb25seSB0aGUgaGVhZGVyLCB3aXRob3V0IGRlY29kaW5nIGEgcG90ZW50aWFsbHkgbGFyZ2UgaW1hZ2UgdHdpY2UuXG4gIGNvbnN0IGhlYWRlciA9IEJ1ZmZlci5mcm9tKGJhc2U2NC5zbGljZSgwLCAyNCksIFwiYmFzZTY0XCIpO1xuICBpZiAoaGVhZGVyLnN1YmFycmF5KDAsIDgpLmVxdWFscyhCdWZmZXIuZnJvbShbMTM3LCA4MCwgNzgsIDcxLCAxMywgMTAsIDI2LCAxMF0pKSlcbiAgICByZXR1cm4gXCJpbWFnZS9wbmdcIjtcbiAgaWYgKGhlYWRlclswXSA9PT0gMjU1ICYmIGhlYWRlclsxXSA9PT0gMjE2ICYmIGhlYWRlclsyXSA9PT0gMjU1KSByZXR1cm4gXCJpbWFnZS9qcGVnXCI7XG4gIGlmIChoZWFkZXIudG9TdHJpbmcoXCJhc2NpaVwiLCAwLCA0KSA9PT0gXCJSSUZGXCIgJiYgaGVhZGVyLnRvU3RyaW5nKFwiYXNjaWlcIiwgOCwgMTIpID09PSBcIldFQlBcIilcbiAgICByZXR1cm4gXCJpbWFnZS93ZWJwXCI7XG4gIGlmIChvdXRwdXRGb3JtYXQgPT09IFwianBlZ1wiKSByZXR1cm4gXCJpbWFnZS9qcGVnXCI7XG4gIGlmIChvdXRwdXRGb3JtYXQgPT09IFwid2VicFwiKSByZXR1cm4gXCJpbWFnZS93ZWJwXCI7XG4gIGlmIChvdXRwdXRGb3JtYXQgPT09IHVuZGVmaW5lZCB8fCBvdXRwdXRGb3JtYXQgPT09IFwicG5nXCIpIHJldHVybiBcImltYWdlL3BuZ1wiO1xuICB0aHJvdyBuZXcgT3BlbkFJUHJvdG9jb2xFcnJvcihgVW5zdXBwb3J0ZWQgaW1hZ2Ugb3V0cHV0IGZvcm1hdDogJHtTdHJpbmcob3V0cHV0Rm9ybWF0KX1gKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZU9wZW5BSUV2ZW50KHJhdzogdW5rbm93bik6IE9wZW5BSU5vcm1hbGl6ZWRFdmVudCB8IHVuZGVmaW5lZCB7XG4gIGlmICghcmF3IHx8IHR5cGVvZiByYXcgIT09IFwib2JqZWN0XCIpIHJldHVybiB1bmRlZmluZWQ7XG4gIGNvbnN0IGV2ZW50ID0gcmF3IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICBjb25zdCB0eXBlID0gU3RyaW5nKGV2ZW50LnR5cGUgPz8gXCJcIik7XG4gIGlmICh0eXBlID09PSBcInJlc3BvbnNlLmNyZWF0ZWRcIikge1xuICAgIGNvbnN0IHJlc3BvbnNlID0gZXZlbnQucmVzcG9uc2UgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIHsgdHlwZTogXCJjcmVhdGVkXCIsIC4uLihyZXNwb25zZT8uaWQgPyB7IHJlc3BvbnNlSWQ6IFN0cmluZyhyZXNwb25zZS5pZCkgfSA6IHt9KSB9O1xuICB9XG4gIGlmICh0eXBlID09PSBcInJlc3BvbnNlLm91dHB1dF90ZXh0LmRlbHRhXCIgJiYgdHlwZW9mIGV2ZW50LmRlbHRhID09PSBcInN0cmluZ1wiKSB7XG4gICAgcmV0dXJuIHsgdHlwZTogXCJ0ZXh0LWRlbHRhXCIsIHRleHQ6IGV2ZW50LmRlbHRhIH07XG4gIH1cbiAgaWYgKFxuICAgICh0eXBlID09PSBcInJlc3BvbnNlLm91dHB1dF9pdGVtLmFkZGVkXCIgfHwgdHlwZSA9PT0gXCJyZXNwb25zZS5vdXRwdXRfaXRlbS5kb25lXCIpICYmXG4gICAgZXZlbnQuaXRlbSAmJlxuICAgIHR5cGVvZiBldmVudC5pdGVtID09PSBcIm9iamVjdFwiXG4gICkge1xuICAgIGNvbnN0IGl0ZW0gPSBldmVudC5pdGVtIGFzIE9wZW5BSVJlc3BvbnNlSXRlbTtcbiAgICBpZiAoaXRlbS50eXBlID09PSBcImltYWdlX2dlbmVyYXRpb25fY2FsbFwiICYmIHR5cGVvZiBpdGVtLnJlc3VsdCA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZTogXCJpbWFnZVwiLFxuICAgICAgICAuLi4odHlwZW9mIGl0ZW0uaWQgPT09IFwic3RyaW5nXCIgPyB7IGlkOiBpdGVtLmlkIH0gOiB7fSksXG4gICAgICAgIGJhc2U2NDogaXRlbS5yZXN1bHQsXG4gICAgICAgIG1pbWVUeXBlOiBpbWFnZU1pbWVUeXBlKGl0ZW0ucmVzdWx0LCBpdGVtLm91dHB1dF9mb3JtYXQpLFxuICAgICAgICAuLi4odHlwZW9mIGl0ZW0ucmV2aXNlZF9wcm9tcHQgPT09IFwic3RyaW5nXCJcbiAgICAgICAgICA/IHsgcmV2aXNlZFByb21wdDogaXRlbS5yZXZpc2VkX3Byb21wdCB9XG4gICAgICAgICAgOiB0eXBlb2YgaXRlbS5yZXZpc2VkUHJvbXB0ID09PSBcInN0cmluZ1wiXG4gICAgICAgICAgICA/IHsgcmV2aXNlZFByb21wdDogaXRlbS5yZXZpc2VkUHJvbXB0IH1cbiAgICAgICAgICAgIDoge30pLFxuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIHsgdHlwZTogXCJvdXRwdXQtaXRlbVwiLCBpdGVtIH07XG4gIH1cbiAgaWYgKHR5cGUgPT09IFwicmVzcG9uc2UuY29tcGxldGVkXCIpIHtcbiAgICBjb25zdCByZXNwb25zZSA9IChldmVudC5yZXNwb25zZSA/PyB7fSkgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6IFwiY29tcGxldGVkXCIsXG4gICAgICByZXNwb25zZUlkOiBTdHJpbmcocmVzcG9uc2UuaWQgPz8gXCJcIiksXG4gICAgICAuLi4ocmVzcG9uc2UudXNhZ2UgPyB7IHVzYWdlOiB1c2FnZUZyb20ocmVzcG9uc2UudXNhZ2UpIH0gOiB7fSksXG4gICAgICAuLi4odHlwZW9mIHJlc3BvbnNlLm1vZGVsID09PSBcInN0cmluZ1wiID8geyBtb2RlbDogcmVzcG9uc2UubW9kZWwgfSA6IHt9KSxcbiAgICB9O1xuICB9XG4gIGlmICh0eXBlID09PSBcImVycm9yXCIgfHwgdHlwZSA9PT0gXCJyZXNwb25zZS5mYWlsZWRcIiB8fCB0eXBlID09PSBcInJlc3BvbnNlLmluY29tcGxldGVcIikge1xuICAgIGNvbnN0IHNvdXJjZSA9IChldmVudC5lcnJvciA/PyBldmVudC5yZXNwb25zZSA/PyBldmVudCkgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgY29uc3QgbmVzdGVkID0gKHNvdXJjZS5lcnJvciA/PyBzb3VyY2UpIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgIHJldHVybiB7XG4gICAgICB0eXBlOiBcImVycm9yXCIsXG4gICAgICBlcnJvcjogbmV3IE9wZW5BSVByb3RvY29sRXJyb3IoXG4gICAgICAgIFN0cmluZyhuZXN0ZWQubWVzc2FnZSA/PyBgT3BlbkFJIHN0cmVhbSBlbmRlZCB3aXRoICR7dHlwZX1gKSxcbiAgICAgICAgdHlwZW9mIG5lc3RlZC5jb2RlID09PSBcInN0cmluZ1wiID8gbmVzdGVkLmNvZGUgOiB1bmRlZmluZWQsXG4gICAgICApLFxuICAgIH07XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7QUFLQSxNQUFhLDhCQUNYO0FBRUYsTUFBYSx1QkFBdUI7QUFDcEMsTUFBYSxvQkFBb0I7QUFTakMsU0FBUyxnQkFBd0M7Q0FDL0MsTUFBTSxRQUFrRDtFQUN0RCxRQUFRO0VBQ1IsT0FBTztFQUNQLE9BQU87Q0FDVDtDQUNBLE1BQU0sV0FBVyxRQUFRLElBQUk7Q0FDN0IsTUFBTSxrQkFBa0IsUUFBUSxJQUFJO0NBQ3BDLE9BQU87RUFDTCxRQUFRLE1BQU0sUUFBUSxhQUFhLFFBQVE7RUFDM0MsV0FBVyxHQUFHLFFBQVE7RUFDdEIsY0FBYyxRQUFRO0VBQ3RCLFVBQVUsV0FBVyxHQUFHLFdBQVcsa0JBQWtCLElBQUksb0JBQW9CLE9BQU87Q0FDdEY7QUFDRjs7QUFHQSxTQUFnQixrQkFBa0IsV0FBbUMsY0FBYyxHQUFXO0NBQzVGLE9BQU8sZ0JBQWdCLGtCQUFrQixJQUFJLFNBQVMsT0FBTyxH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
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { CHATGPT_CODEX_RESPONSES_URL, OpenAIProtocolError, buildCodexIdentityHeaders, buildOpenAIResponsesRequest, normalizeOpenAIEvent } from "./openai-backend-protocol.js";
|
|
2
|
+
import { buildStandaloneImageRequest, readStandaloneImageResponse } from "./openai-image-generation.js";
|
|
2
3
|
import { normalizeOpenAISSE } from "./openai-sse.js";
|
|
3
4
|
import crypto from "node:crypto";
|
|
4
5
|
import WsClient from "ws";
|
|
@@ -299,11 +300,16 @@ var OpenAIHttpsTransport = class {
|
|
|
299
300
|
}
|
|
300
301
|
};
|
|
301
302
|
var OpenAIDirectClient = class {
|
|
303
|
+
options;
|
|
302
304
|
transport;
|
|
305
|
+
imageCredentials;
|
|
303
306
|
constructor(options) {
|
|
307
|
+
this.options = options;
|
|
308
|
+
this.imageCredentials = options.credentials;
|
|
304
309
|
this.transport = options.transport ?? (options.transportKind === "websocket" ? new OpenAIWebSocketTransport(options) : new OpenAIHttpsTransport(options));
|
|
305
310
|
}
|
|
306
311
|
responses(options, signal) {
|
|
312
|
+
if (typeof options.imageGeneration === "object" && options.imageGeneration.background === "transparent") return this.standaloneImages(options, signal);
|
|
307
313
|
const clientRequestId = crypto.randomUUID();
|
|
308
314
|
const affinityId = options.promptCacheKey ? cacheAffinityUuid(options.promptCacheKey) : clientRequestId;
|
|
309
315
|
return this.transport.stream({
|
|
@@ -317,6 +323,38 @@ var OpenAIDirectClient = class {
|
|
|
317
323
|
clientRequestId
|
|
318
324
|
});
|
|
319
325
|
}
|
|
326
|
+
async *standaloneImages(options, signal) {
|
|
327
|
+
const request = buildStandaloneImageRequest(options);
|
|
328
|
+
const requestId = crypto.randomUUID();
|
|
329
|
+
for (let attempt = 0; attempt < 2; attempt++) {
|
|
330
|
+
signal?.throwIfAborted();
|
|
331
|
+
const response = await (this.options.fetch ?? fetch)(request.url, {
|
|
332
|
+
method: "POST",
|
|
333
|
+
headers: {
|
|
334
|
+
...buildCodexIdentityHeaders(this.imageCredentials.accessToken, this.imageCredentials.accountId),
|
|
335
|
+
Accept: "application/json",
|
|
336
|
+
"x-codex-image-turn-id": requestId
|
|
337
|
+
},
|
|
338
|
+
body: JSON.stringify(request.body),
|
|
339
|
+
signal
|
|
340
|
+
});
|
|
341
|
+
if (response.status === 401 && attempt === 0 && this.options.refreshCredentials) {
|
|
342
|
+
await response.body?.cancel();
|
|
343
|
+
this.imageCredentials = await this.options.refreshCredentials();
|
|
344
|
+
continue;
|
|
345
|
+
}
|
|
346
|
+
if (!response.ok) throw await responseError(response);
|
|
347
|
+
const images = await readStandaloneImageResponse(response);
|
|
348
|
+
signal?.throwIfAborted();
|
|
349
|
+
yield* images;
|
|
350
|
+
yield {
|
|
351
|
+
type: "completed",
|
|
352
|
+
responseId: requestId,
|
|
353
|
+
model: "gpt-image-2"
|
|
354
|
+
};
|
|
355
|
+
return;
|
|
356
|
+
}
|
|
357
|
+
}
|
|
320
358
|
close() {
|
|
321
359
|
this.transport.close?.();
|
|
322
360
|
}
|
|
@@ -324,4 +362,4 @@ var OpenAIDirectClient = class {
|
|
|
324
362
|
//#endregion
|
|
325
363
|
export { OpenAIDirectClient, OpenAIHttpsTransport, OpenAIWebSocketTransport };
|
|
326
364
|
|
|
327
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3BlbmFpLWRpcmVjdC1jbGllbnQuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3V0aWxzL3Byb3ZpZGVycy9vcGVuYWkvb3BlbmFpLWRpcmVjdC1jbGllbnQudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGNyeXB0byBmcm9tIFwibm9kZTpjcnlwdG9cIjtcblxuaW1wb3J0IFdzQ2xpZW50LCB7IHR5cGUgQ2xpZW50T3B0aW9ucywgdHlwZSBSYXdEYXRhIH0gZnJvbSBcIndzXCI7XG5cbmltcG9ydCB7XG4gIGJ1aWxkQ29kZXhJZGVudGl0eUhlYWRlcnMsXG4gIGJ1aWxkT3BlbkFJUmVzcG9uc2VzUmVxdWVzdCxcbiAgQ0hBVEdQVF9DT0RFWF9SRVNQT05TRVNfVVJMLFxuICBub3JtYWxpemVPcGVuQUlFdmVudCxcbiAgT3BlbkFJUHJvdG9jb2xFcnJvcixcbiAgdHlwZSBPcGVuQUlOb3JtYWxpemVkRXZlbnQsXG4gIHR5cGUgT3BlbkFJUmVzcG9uc2VzT3B0aW9ucyxcbiAgdHlwZSBPcGVuQUlSZXNwb25zZXNSZXF1ZXN0LFxufSBmcm9tIFwiLi9vcGVuYWktYmFja2VuZC1wcm90b2NvbFwiO1xuaW1wb3J0IHsgbm9ybWFsaXplT3BlbkFJU1NFLCB0eXBlIE9wZW5BSUV2ZW50U3RyZWFtIH0gZnJvbSBcIi4vb3BlbmFpLXNzZVwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIE9wZW5BSURpcmVjdENyZWRlbnRpYWxzIHtcbiAgYWNjZXNzVG9rZW46IHN0cmluZztcbiAgYWNjb3VudElkOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgT3BlbkFJVHJhbnNwb3J0UmVxdWVzdCB7XG4gIGJvZHk6IE9wZW5BSVJlc3BvbnNlc1JlcXVlc3Q7XG4gIHNpZ25hbD86IEFib3J0U2lnbmFsO1xuICBzZXNzaW9uSWQ6IHN0cmluZztcbiAgdGhyZWFkSWQ6IHN0cmluZztcbiAgY2xpZW50UmVxdWVzdElkOiBzdHJpbmc7XG59XG5cbi8qKiBUcmFuc3BvcnQtaW5kZXBlbmRlbnQgc3RyZWFtaW5nIGludGVyZmFjZTsgSFRUUFMgaXMgdGhlIGZpcnN0IGltcGxlbWVudGF0aW9uLiAqL1xuZXhwb3J0IGludGVyZmFjZSBPcGVuQUlSZXNwb25zZXNUcmFuc3BvcnQge1xuICBzdHJlYW0ocmVxdWVzdDogT3BlbkFJVHJhbnNwb3J0UmVxdWVzdCk6IE9wZW5BSUV2ZW50U3RyZWFtO1xuICBjbG9zZT8oKTogdm9pZDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBPcGVuQUlIdHRwc1RyYW5zcG9ydE9wdGlvbnMge1xuICBjcmVkZW50aWFsczogT3BlbkFJRGlyZWN0Q3JlZGVudGlhbHM7XG4gIGZldGNoPzogdHlwZW9mIGZldGNoO1xuICByZWZyZXNoQ3JlZGVudGlhbHM/OiAoKSA9PiBQcm9taXNlPE9wZW5BSURpcmVjdENyZWRlbnRpYWxzPjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBPcGVuQUlXZWJTb2NrZXRMaWtlIHtcbiAgb24oZXZlbnQ6IFwib3BlblwiLCBsaXN0ZW5lcjogKCkgPT4gdm9pZCk6IHRoaXM7XG4gIG9uKGV2ZW50OiBcIm1lc3NhZ2VcIiwgbGlzdGVuZXI6IChkYXRhOiBSYXdEYXRhLCBpc0JpbmFyeTogYm9vbGVhbikgPT4gdm9pZCk6IHRoaXM7XG4gIG9uKGV2ZW50OiBcImNsb3NlXCIsIGxpc3RlbmVyOiAoY29kZTogbnVtYmVyLCByZWFzb246IEJ1ZmZlcikgPT4gdm9pZCk6IHRoaXM7XG4gIG9uKGV2ZW50OiBcImVycm9yXCIsIGxpc3RlbmVyOiAoZXJyb3I6IEVycm9yKSA9PiB2b2lkKTogdGhpcztcbiAgb24oXG4gICAgZXZlbnQ6IFwidW5leHBlY3RlZC1yZXNwb25zZVwiLFxuICAgIGxpc3RlbmVyOiAocmVxdWVzdDogdW5rbm93biwgcmVzcG9uc2U6IHsgc3RhdHVzQ29kZT86IG51bWJlciB9KSA9PiB2b2lkLFxuICApOiB0aGlzO1xuICBvZmYoZXZlbnQ6IHN0cmluZywgbGlzdGVuZXI6ICguLi5hcmdzOiBuZXZlcltdKSA9PiB2b2lkKTogdGhpcztcbiAgc2VuZChkYXRhOiBzdHJpbmcsIGNhbGxiYWNrPzogKGVycm9yPzogRXJyb3IpID0+IHZvaWQpOiB2b2lkO1xuICBjbG9zZShjb2RlPzogbnVtYmVyLCByZWFzb24/OiBzdHJpbmcpOiB2b2lkO1xuICB0ZXJtaW5hdGUoKTogdm9pZDtcbn1cblxuZXhwb3J0IHR5cGUgT3BlbkFJV2ViU29ja2V0RmFjdG9yeSA9ICh1cmw6IHN0cmluZywgb3B0aW9uczogQ2xpZW50T3B0aW9ucykgPT4gT3BlbkFJV2ViU29ja2V0TGlrZTtcblxuZXhwb3J0IGludGVyZmFjZSBPcGVuQUlXZWJTb2NrZXRUcmFuc3BvcnRPcHRpb25zIGV4dGVuZHMgT3BlbkFJSHR0cHNUcmFuc3BvcnRPcHRpb25zIHtcbiAgd2ViU29ja2V0RmFjdG9yeT86IE9wZW5BSVdlYlNvY2tldEZhY3Rvcnk7XG59XG5cbnR5cGUgU29ja2V0UmVjb3JkID1cbiAgfCB7IGtpbmQ6IFwib3BlblwiIH1cbiAgfCB7IGtpbmQ6IFwibWVzc2FnZVwiOyBkYXRhOiBSYXdEYXRhOyBpc0JpbmFyeTogYm9vbGVhbiB9XG4gIHwgeyBraW5kOiBcImNsb3NlXCI7IGNvZGU6IG51bWJlcjsgcmVhc29uOiBzdHJpbmcgfVxuICB8IHsga2luZDogXCJlcnJvclwiOyBlcnJvcjogRXJyb3IgfVxuICB8IHsga2luZDogXCJyZWplY3RlZFwiOyBzdGF0dXM/OiBudW1iZXIgfTtcblxuY29uc3QgTUFYX0JVRkZFUkVEX1NPQ0tFVF9SRUNPUkRTID0gMTYwMDtcblxuZnVuY3Rpb24gd2Vic29ja2V0VXJsKHVybDogc3RyaW5nKTogc3RyaW5nIHtcbiAgbGV0IHBhcnNlZDogVVJMO1xuICB0cnkge1xuICAgIHBhcnNlZCA9IG5ldyBVUkwodXJsKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICB0aHJvdyBuZXcgT3BlbkFJUHJvdG9jb2xFcnJvcihgSW52YWxpZCBPcGVuQUkgUmVzcG9uc2VzIFVSTDogJHtTdHJpbmcoZXJyb3IpfWApO1xuICB9XG4gIHBhcnNlZC5wcm90b2NvbCA9IHBhcnNlZC5wcm90b2NvbCA9PT0gXCJodHRwczpcIiA/IFwid3NzOlwiIDogXCJ3czpcIjtcbiAgcmV0dXJuIHBhcnNlZC50b1N0cmluZygpO1xufVxuXG5mdW5jdGlvbiByYXdEYXRhVGV4dChkYXRhOiBSYXdEYXRhKTogc3RyaW5nIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkoZGF0YSkpIHJldHVybiBCdWZmZXIuY29uY2F0KGRhdGEpLnRvU3RyaW5nKCk7XG4gIGlmIChkYXRhIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpIHJldHVybiBCdWZmZXIuZnJvbShuZXcgVWludDhBcnJheShkYXRhKSkudG9TdHJpbmcoKTtcbiAgcmV0dXJuIEJ1ZmZlci5mcm9tKGRhdGEpLnRvU3RyaW5nKCk7XG59XG5cbmZ1bmN0aW9uIHNvY2tldEV2ZW50cyhzb2NrZXQ6IE9wZW5BSVdlYlNvY2tldExpa2UsIHNpZ25hbD86IEFib3J0U2lnbmFsKSB7XG4gIGNvbnN0IHJlY29yZHM6IFNvY2tldFJlY29yZFtdID0gW107XG4gIGNvbnN0IHdhaXRlcnM6IEFycmF5PChyZWNvcmQ6IFNvY2tldFJlY29yZCkgPT4gdm9pZD4gPSBbXTtcbiAgbGV0IGFjdGl2ZSA9IHRydWU7XG4gIGNvbnN0IHB1c2ggPSAocmVjb3JkOiBTb2NrZXRSZWNvcmQpID0+IHtcbiAgICBpZiAoIWFjdGl2ZSkgcmV0dXJuO1xuICAgIGNvbnN0IHdhaXRlciA9IHdhaXRlcnMuc2hpZnQoKTtcbiAgICBpZiAod2FpdGVyKSB3YWl0ZXIocmVjb3JkKTtcbiAgICBlbHNlIGlmIChyZWNvcmRzLmxlbmd0aCA8IE1BWF9CVUZGRVJFRF9TT0NLRVRfUkVDT1JEUykgcmVjb3Jkcy5wdXNoKHJlY29yZCk7XG4gICAgZWxzZSB7XG4gICAgICBhY3RpdmUgPSBmYWxzZTtcbiAgICAgIHJlY29yZHMubGVuZ3RoID0gMDtcbiAgICAgIHNvY2tldC50ZXJtaW5hdGUoKTtcbiAgICAgIGNvbnN0IG92ZXJmbG93ID0ge1xuICAgICAgICBraW5kOiBcImVycm9yXCIgYXMgY29uc3QsXG4gICAgICAgIGVycm9yOiBuZXcgT3BlbkFJUHJvdG9jb2xFcnJvcihcbiAgICAgICAgICBgT3BlbkFJIFdlYlNvY2tldCBleGNlZWRlZCB0aGUgJHtNQVhfQlVGRkVSRURfU09DS0VUX1JFQ09SRFN9LXJlY29yZCByZWNlaXZlIGJ1ZmZlcmAsXG4gICAgICAgICAgXCJ3ZWJzb2NrZXRfYmFja3ByZXNzdXJlXCIsXG4gICAgICAgICksXG4gICAgICB9O1xuICAgICAgY29uc3Qgb3ZlcmZsb3dXYWl0ZXIgPSB3YWl0ZXJzLnNoaWZ0KCk7XG4gICAgICBpZiAob3ZlcmZsb3dXYWl0ZXIpIG92ZXJmbG93V2FpdGVyKG92ZXJmbG93KTtcbiAgICAgIGVsc2UgcmVjb3Jkcy5wdXNoKG92ZXJmbG93KTtcbiAgICB9XG4gIH07XG4gIGNvbnN0IG9uT3BlbiA9ICgpID0+IHB1c2goeyBraW5kOiBcIm9wZW5cIiB9KTtcbiAgY29uc3Qgb25NZXNzYWdlID0gKGRhdGE6IFJhd0RhdGEsIGlzQmluYXJ5OiBib29sZWFuKSA9PiBwdXNoKHsga2luZDogXCJtZXNzYWdlXCIsIGRhdGEsIGlzQmluYXJ5IH0pO1xuICBjb25zdCBvbkNsb3NlID0gKGNvZGU6IG51bWJlciwgcmVhc29uOiBCdWZmZXIpID0+XG4gICAgcHVzaCh7IGtpbmQ6IFwiY2xvc2VcIiwgY29kZSwgcmVhc29uOiByZWFzb24udG9TdHJpbmcoKSB9KTtcbiAgY29uc3Qgb25FcnJvciA9IChlcnJvcjogRXJyb3IpID0+IHB1c2goeyBraW5kOiBcImVycm9yXCIsIGVycm9yIH0pO1xuICBjb25zdCBvblVuZXhwZWN0ZWRSZXNwb25zZSA9IChfcmVxdWVzdDogdW5rbm93biwgcmVzcG9uc2U6IHsgc3RhdHVzQ29kZT86IG51bWJlciB9KSA9PlxuICAgIHB1c2goeyBraW5kOiBcInJlamVjdGVkXCIsIHN0YXR1czogcmVzcG9uc2Uuc3RhdHVzQ29kZSB9KTtcbiAgc29ja2V0Lm9uKFwib3BlblwiLCBvbk9wZW4pO1xuICBzb2NrZXQub24oXCJtZXNzYWdlXCIsIG9uTWVzc2FnZSk7XG4gIHNvY2tldC5vbihcImNsb3NlXCIsIG9uQ2xvc2UpO1xuICBzb2NrZXQub24oXCJlcnJvclwiLCBvbkVycm9yKTtcbiAgc29ja2V0Lm9uKFwidW5leHBlY3RlZC1yZXNwb25zZVwiLCBvblVuZXhwZWN0ZWRSZXNwb25zZSk7XG4gIGNvbnN0IG9uQWJvcnQgPSAoKSA9PiB7XG4gICAgc29ja2V0LnRlcm1pbmF0ZSgpO1xuICAgIHB1c2goeyBraW5kOiBcImVycm9yXCIsIGVycm9yOiBhYm9ydEVycm9yKHNpZ25hbCkgfSk7XG4gIH07XG4gIHNpZ25hbD8uYWRkRXZlbnRMaXN0ZW5lcihcImFib3J0XCIsIG9uQWJvcnQsIHsgb25jZTogdHJ1ZSB9KTtcbiAgcmV0dXJuIHtcbiAgICBuZXh0OiAoKSA9PlxuICAgICAgcmVjb3Jkcy5sZW5ndGhcbiAgICAgICAgPyBQcm9taXNlLnJlc29sdmUocmVjb3Jkcy5zaGlmdCgpISlcbiAgICAgICAgOiBuZXcgUHJvbWlzZTxTb2NrZXRSZWNvcmQ+KChyZXNvbHZlKSA9PiB3YWl0ZXJzLnB1c2gocmVzb2x2ZSkpLFxuICAgIGNsZWFudXA6ICgpID0+IHtcbiAgICAgIGFjdGl2ZSA9IGZhbHNlO1xuICAgICAgc2lnbmFsPy5yZW1vdmVFdmVudExpc3RlbmVyKFwiYWJvcnRcIiwgb25BYm9ydCk7XG4gICAgICBzb2NrZXQub2ZmKFwib3BlblwiLCBvbk9wZW4pO1xuICAgICAgc29ja2V0Lm9mZihcIm1lc3NhZ2VcIiwgb25NZXNzYWdlKTtcbiAgICAgIHNvY2tldC5vZmYoXCJjbG9zZVwiLCBvbkNsb3NlKTtcbiAgICAgIHNvY2tldC5vZmYoXCJlcnJvclwiLCBvbkVycm9yKTtcbiAgICAgIHNvY2tldC5vZmYoXCJ1bmV4cGVjdGVkLXJlc3BvbnNlXCIsIG9uVW5leHBlY3RlZFJlc3BvbnNlKTtcbiAgICAgIHJlY29yZHMubGVuZ3RoID0gMDtcbiAgICAgIGNvbnN0IGNsb3NlZCA9IHtcbiAgICAgICAga2luZDogXCJlcnJvclwiIGFzIGNvbnN0LFxuICAgICAgICBlcnJvcjogbmV3IE9wZW5BSVByb3RvY29sRXJyb3IoXCJPcGVuQUkgV2ViU29ja2V0IGV2ZW50IHN0cmVhbSB3YXMgY2xvc2VkXCIpLFxuICAgICAgfTtcbiAgICAgIGZvciAoY29uc3Qgd2FpdGVyIG9mIHdhaXRlcnMuc3BsaWNlKDApKSB3YWl0ZXIoY2xvc2VkKTtcbiAgICB9LFxuICAgIGRldGFjaEFib3J0OiAoKSA9PiBzaWduYWw/LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJhYm9ydFwiLCBvbkFib3J0KSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gYWJvcnRFcnJvcihzaWduYWw/OiBBYm9ydFNpZ25hbCk6IEVycm9yIHtcbiAgcmV0dXJuIHNpZ25hbD8ucmVhc29uIGluc3RhbmNlb2YgRXJyb3JcbiAgICA/IHNpZ25hbC5yZWFzb25cbiAgICA6IG5ldyBET01FeGNlcHRpb24oXCJBYm9ydGVkXCIsIFwiQWJvcnRFcnJvclwiKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gbmV4dFBvb2xlZFJlY29yZChcbiAgZXZlbnRzOiBSZXR1cm5UeXBlPHR5cGVvZiBzb2NrZXRFdmVudHM+LFxuICBzb2NrZXQ6IE9wZW5BSVdlYlNvY2tldExpa2UsXG4gIHNpZ25hbD86IEFib3J0U2lnbmFsLFxuKTogUHJvbWlzZTxTb2NrZXRSZWNvcmQ+IHtcbiAgaWYgKCFzaWduYWwpIHJldHVybiBldmVudHMubmV4dCgpO1xuICBpZiAoc2lnbmFsLmFib3J0ZWQpIHRocm93IGFib3J0RXJyb3Ioc2lnbmFsKTtcbiAgcmV0dXJuIG5ldyBQcm9taXNlPFNvY2tldFJlY29yZD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIGNvbnN0IG9uQWJvcnQgPSAoKSA9PiB7XG4gICAgICBzb2NrZXQudGVybWluYXRlKCk7XG4gICAgICByZWplY3QoYWJvcnRFcnJvcihzaWduYWwpKTtcbiAgICB9O1xuICAgIHNpZ25hbC5hZGRFdmVudExpc3RlbmVyKFwiYWJvcnRcIiwgb25BYm9ydCwgeyBvbmNlOiB0cnVlIH0pO1xuICAgIHZvaWQgZXZlbnRzXG4gICAgICAubmV4dCgpXG4gICAgICAudGhlbihyZXNvbHZlLCByZWplY3QpXG4gICAgICAuZmluYWxseSgoKSA9PiB7XG4gICAgICAgIHNpZ25hbC5yZW1vdmVFdmVudExpc3RlbmVyKFwiYWJvcnRcIiwgb25BYm9ydCk7XG4gICAgICB9KTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGNhY2hlQWZmaW5pdHlVdWlkKGtleTogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgaGV4ID0gY3J5cHRvLmNyZWF0ZUhhc2goXCJzaGEyNTZcIikudXBkYXRlKGtleSkuZGlnZXN0KFwiaGV4XCIpLnNsaWNlKDAsIDMyKS5zcGxpdChcIlwiKTtcbiAgaGV4WzEyXSA9IFwiNFwiO1xuICBoZXhbMTZdID0gKChOdW1iZXIucGFyc2VJbnQoaGV4WzE2XSEsIDE2KSAmIDB4MykgfCAweDgpLnRvU3RyaW5nKDE2KTtcbiAgcmV0dXJuIGAke2hleC5zbGljZSgwLCA4KS5qb2luKFwiXCIpfS0ke2hleC5zbGljZSg4LCAxMikuam9pbihcIlwiKX0tJHtoZXguc2xpY2UoMTIsIDE2KS5qb2luKFwiXCIpfS0ke2hleC5zbGljZSgxNiwgMjApLmpvaW4oXCJcIil9LSR7aGV4LnNsaWNlKDIwKS5qb2luKFwiXCIpfWA7XG59XG5cbnR5cGUgQWZmaW5pdHlDb25uZWN0aW9uID0ge1xuICBzb2NrZXQ6IE9wZW5BSVdlYlNvY2tldExpa2U7XG4gIGV2ZW50czogUmV0dXJuVHlwZTx0eXBlb2Ygc29ja2V0RXZlbnRzPjtcbiAgY2xvc2VkPzogYm9vbGVhbjtcbn07XG5cbmV4cG9ydCBjbGFzcyBPcGVuQUlXZWJTb2NrZXRUcmFuc3BvcnQgaW1wbGVtZW50cyBPcGVuQUlSZXNwb25zZXNUcmFuc3BvcnQge1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBNQVhfQUZGSU5JVFlfQ09OTkVDVElPTlMgPSAxNjtcbiAgcHJpdmF0ZSBjcmVkZW50aWFsczogT3BlbkFJRGlyZWN0Q3JlZGVudGlhbHM7XG4gIHByaXZhdGUgcmVhZG9ubHkgcmVmcmVzaENyZWRlbnRpYWxzPzogKCkgPT4gUHJvbWlzZTxPcGVuQUlEaXJlY3RDcmVkZW50aWFscz47XG4gIHByaXZhdGUgcmVhZG9ubHkgd2ViU29ja2V0RmFjdG9yeTogT3BlbkFJV2ViU29ja2V0RmFjdG9yeTtcbiAgcHJpdmF0ZSByZWFkb25seSBhZmZpbml0eUNvbm5lY3Rpb25zID0gbmV3IE1hcDxzdHJpbmcsIEFmZmluaXR5Q29ubmVjdGlvbj4oKTtcbiAgcHJpdmF0ZSByZWFkb25seSBidXN5QWZmaW5pdGllcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IE9wZW5BSVdlYlNvY2tldFRyYW5zcG9ydE9wdGlvbnMpIHtcbiAgICB0aGlzLmNyZWRlbnRpYWxzID0gb3B0aW9ucy5jcmVkZW50aWFscztcbiAgICB0aGlzLnJlZnJlc2hDcmVkZW50aWFscyA9IG9wdGlvbnMucmVmcmVzaENyZWRlbnRpYWxzO1xuICAgIHRoaXMud2ViU29ja2V0RmFjdG9yeSA9XG4gICAgICBvcHRpb25zLndlYlNvY2tldEZhY3RvcnkgPz8gKCh1cmwsIHdzT3B0aW9ucykgPT4gbmV3IFdzQ2xpZW50KHVybCwgd3NPcHRpb25zKSk7XG4gIH1cblxuICBzdHJlYW0ocmVxdWVzdDogT3BlbkFJVHJhbnNwb3J0UmVxdWVzdCk6IE9wZW5BSUV2ZW50U3RyZWFtIHtcbiAgICByZXR1cm4gdGhpcy5ydW4ocmVxdWVzdCk7XG4gIH1cblxuICBjbG9zZSgpOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IHsgc29ja2V0LCBldmVudHMgfSBvZiB0aGlzLmFmZmluaXR5Q29ubmVjdGlvbnMudmFsdWVzKCkpIHtcbiAgICAgIGV2ZW50cy5jbGVhbnVwKCk7XG4gICAgICBzb2NrZXQuY2xvc2UoMTAwMCwgXCJ0cmFuc3BvcnQgY2xvc2VkXCIpO1xuICAgIH1cbiAgICB0aGlzLmFmZmluaXR5Q29ubmVjdGlvbnMuY2xlYXIoKTtcbiAgICB0aGlzLmJ1c3lBZmZpbml0aWVzLmNsZWFyKCk7XG4gIH1cblxuICAvKipcbiAgICog7LqQ7Iuc7JeQIOyXsOqysOydhCDrk7HroZ3tlZzri6QuIOyekOumrOqwgCDsl4bsnLzrqbQg7Jyg7Zy0IOyXsOqysOunjCDstpXstpztlZjqs6AsIOyghOu2gCDsgqzsmqkg7KSR7J2066m0XG4gICAqIOynhO2WiSDspJHsnbgg7J2R64u17J2EIOuBiuuKlCDrjIDsi6Ag65Ox66Gd7J2EIO2PrOq4sO2VnOuLpChmYWxzZSDihpIg7J20IOyalOyyreydgCDsnbztmozshLEg7IaM7LyT7Jy866GcIOyymOumrCkuXG4gICAqL1xuICBwcml2YXRlIHJlbWVtYmVyQWZmaW5pdHlDb25uZWN0aW9uKHRocmVhZElkOiBzdHJpbmcsIGNvbm5lY3Rpb246IEFmZmluaXR5Q29ubmVjdGlvbik6IGJvb2xlYW4ge1xuICAgIGlmIChcbiAgICAgICF0aGlzLmFmZmluaXR5Q29ubmVjdGlvbnMuaGFzKHRocmVhZElkKSAmJlxuICAgICAgdGhpcy5hZmZpbml0eUNvbm5lY3Rpb25zLnNpemUgPj0gT3BlbkFJV2ViU29ja2V0VHJhbnNwb3J0Lk1BWF9BRkZJTklUWV9DT05ORUNUSU9OU1xuICAgICkge1xuICAgICAgY29uc3QgaWRsZUtleSA9IFsuLi50aGlzLmFmZmluaXR5Q29ubmVjdGlvbnMua2V5cygpXS5maW5kKFxuICAgICAgICAoa2V5KSA9PiAhdGhpcy5idXN5QWZmaW5pdGllcy5oYXMoa2V5KSxcbiAgICAgICk7XG4gICAgICBpZiAoaWRsZUtleSA9PT0gdW5kZWZpbmVkKSByZXR1cm4gZmFsc2U7XG4gICAgICBjb25zdCBpZGxlID0gdGhpcy5hZmZpbml0eUNvbm5lY3Rpb25zLmdldChpZGxlS2V5KSE7XG4gICAgICBpZGxlLmV2ZW50cy5jbGVhbnVwKCk7XG4gICAgICBpZGxlLnNvY2tldC5jbG9zZSgxMDAwLCBcImFmZmluaXR5IGNhY2hlIGV2aWN0ZWRcIik7XG4gICAgICB0aGlzLmFmZmluaXR5Q29ubmVjdGlvbnMuZGVsZXRlKGlkbGVLZXkpO1xuICAgIH1cbiAgICB0aGlzLmFmZmluaXR5Q29ubmVjdGlvbnMuc2V0KHRocmVhZElkLCBjb25uZWN0aW9uKTtcbiAgICAvLyDsnKDtnLQg7IOB7YOc7JeQ7IScIGJhY2tlbmQg6rCAIOuBiuydgCDshozsvJPsnYQg64uk7J2MIOyalOyyreydtCDsp5HslrTrk6Tsp4Ag7JWK64+E66GdIOy6kOyLnOyXkOyEnCDsoJzqsbDtlZzri6QuXG4gICAgY29uc3QgZHJvcCA9ICgpID0+IHtcbiAgICAgIGNvbm5lY3Rpb24uY2xvc2VkID0gdHJ1ZTtcbiAgICAgIGlmICh0aGlzLmJ1c3lBZmZpbml0aWVzLmhhcyh0aHJlYWRJZCkpIHJldHVybjtcbiAgICAgIGlmICh0aGlzLmFmZmluaXR5Q29ubmVjdGlvbnMuZ2V0KHRocmVhZElkKSAhPT0gY29ubmVjdGlvbikgcmV0dXJuO1xuICAgICAgdGhpcy5hZmZpbml0eUNvbm5lY3Rpb25zLmRlbGV0ZSh0aHJlYWRJZCk7XG4gICAgICBjb25uZWN0aW9uLmV2ZW50cy5jbGVhbnVwKCk7XG4gICAgfTtcbiAgICBjb25uZWN0aW9uLnNvY2tldC5vbihcImNsb3NlXCIsIGRyb3ApO1xuICAgIGNvbm5lY3Rpb24uc29ja2V0Lm9uKFwiZXJyb3JcIiwgZHJvcCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jICpydW4ocmVxdWVzdDogT3BlbkFJVHJhbnNwb3J0UmVxdWVzdCk6IEFzeW5jR2VuZXJhdG9yPE9wZW5BSU5vcm1hbGl6ZWRFdmVudD4ge1xuICAgIGxldCByZWZyZXNoZWQgPSBmYWxzZTtcbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgaWYgKHJlcXVlc3Quc2lnbmFsPy5hYm9ydGVkKSB0aHJvdyBhYm9ydEVycm9yKHJlcXVlc3Quc2lnbmFsKTtcbiAgICAgIGNvbnN0IGhhc0FmZmluaXR5ID0gcmVxdWVzdC5ib2R5LnByb21wdF9jYWNoZV9rZXkgIT09IHVuZGVmaW5lZDtcbiAgICAgIGNvbnN0IHJldGFpbkNvbm5lY3Rpb24gPSBoYXNBZmZpbml0eSAmJiAhdGhpcy5idXN5QWZmaW5pdGllcy5oYXMocmVxdWVzdC50aHJlYWRJZCk7XG4gICAgICBpZiAocmV0YWluQ29ubmVjdGlvbikgdGhpcy5idXN5QWZmaW5pdGllcy5hZGQocmVxdWVzdC50aHJlYWRJZCk7XG4gICAgICBjb25zdCBlbnRyeSA9IHJldGFpbkNvbm5lY3Rpb24gPyB0aGlzLmFmZmluaXR5Q29ubmVjdGlvbnMuZ2V0KHJlcXVlc3QudGhyZWFkSWQpIDogdW5kZWZpbmVkO1xuICAgICAgaWYgKGVudHJ5Py5jbG9zZWQpIHtcbiAgICAgICAgdGhpcy5hZmZpbml0eUNvbm5lY3Rpb25zLmRlbGV0ZShyZXF1ZXN0LnRocmVhZElkKTtcbiAgICAgICAgZW50cnkuZXZlbnRzLmNsZWFudXAoKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGNhY2hlZCA9IGVudHJ5Py5jbG9zZWQgPyB1bmRlZmluZWQgOiBlbnRyeTtcbiAgICAgIC8vIOy6kOyLnCDrk7HroZ3sl5Ag7Iuk7Yyo7ZWY66m0IOydtCDsmpTssq3snYAg7J6s7IKs7JqpIOuMgOyDgeydtCDslYTri4jri6QuXG4gICAgICBsZXQgcmV0YWluZWQgPSByZXRhaW5Db25uZWN0aW9uO1xuICAgICAgY29uc3Qgc29ja2V0ID1cbiAgICAgICAgY2FjaGVkPy5zb2NrZXQgPz9cbiAgICAgICAgdGhpcy53ZWJTb2NrZXRGYWN0b3J5KHdlYnNvY2tldFVybChDSEFUR1BUX0NPREVYX1JFU1BPTlNFU19VUkwpLCB7XG4gICAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICAgLi4uYnVpbGRDb2RleElkZW50aXR5SGVhZGVycyh0aGlzLmNyZWRlbnRpYWxzLmFjY2Vzc1Rva2VuLCB0aGlzLmNyZWRlbnRpYWxzLmFjY291bnRJZCwge1xuICAgICAgICAgICAgICBzZXNzaW9uSWQ6IHJlcXVlc3Quc2Vzc2lvbklkLFxuICAgICAgICAgICAgICB0aHJlYWRJZDogcmVxdWVzdC50aHJlYWRJZCxcbiAgICAgICAgICAgICAgY2xpZW50UmVxdWVzdElkOiByZXF1ZXN0LmNsaWVudFJlcXVlc3RJZCxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgXCJPcGVuQUktQmV0YVwiOiBcInJlc3BvbnNlc193ZWJzb2NrZXRzPTIwMjYtMDItMDZcIixcbiAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICAgIGNvbnN0IGV2ZW50cyA9IGNhY2hlZD8uZXZlbnRzID8/IHNvY2tldEV2ZW50cyhzb2NrZXQsIHJlcXVlc3Quc2lnbmFsKTtcbiAgICAgIGxldCBjb21wbGV0ZWQgPSBmYWxzZTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGlmICghY2FjaGVkKSB7XG4gICAgICAgICAgY29uc3QgaGFuZHNoYWtlID0gYXdhaXQgZXZlbnRzLm5leHQoKTtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBoYW5kc2hha2Uua2luZCA9PT0gXCJyZWplY3RlZFwiICYmXG4gICAgICAgICAgICBoYW5kc2hha2Uuc3RhdHVzID09PSA0MDEgJiZcbiAgICAgICAgICAgICFyZWZyZXNoZWQgJiZcbiAgICAgICAgICAgIHRoaXMucmVmcmVzaENyZWRlbnRpYWxzXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBzb2NrZXQudGVybWluYXRlKCk7XG4gICAgICAgICAgICB0aGlzLmNyZWRlbnRpYWxzID0gYXdhaXQgdGhpcy5yZWZyZXNoQ3JlZGVudGlhbHMoKTtcbiAgICAgICAgICAgIHJlZnJlc2hlZCA9IHRydWU7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGhhbmRzaGFrZS5raW5kID09PSBcInJlamVjdGVkXCIpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBPcGVuQUlQcm90b2NvbEVycm9yKFxuICAgICAgICAgICAgICBgT3BlbkFJIFdlYlNvY2tldCBoYW5kc2hha2UgcmVqZWN0ZWQke2hhbmRzaGFrZS5zdGF0dXMgPyBgIHdpdGggSFRUUCAke2hhbmRzaGFrZS5zdGF0dXN9YCA6IFwiXCJ9YCxcbiAgICAgICAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICAgICAgICBoYW5kc2hha2Uuc3RhdHVzLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGhhbmRzaGFrZS5raW5kID09PSBcImVycm9yXCIpIHRocm93IGhhbmRzaGFrZS5lcnJvcjtcbiAgICAgICAgICBpZiAoaGFuZHNoYWtlLmtpbmQgIT09IFwib3BlblwiKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgT3BlbkFJUHJvdG9jb2xFcnJvcihcIk9wZW5BSSBXZWJTb2NrZXQgY2xvc2VkIGJlZm9yZSB0aGUgaGFuZHNoYWtlIGNvbXBsZXRlZFwiKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHJldGFpbkNvbm5lY3Rpb24pIHtcbiAgICAgICAgICAgIHJldGFpbmVkID0gdGhpcy5yZW1lbWJlckFmZmluaXR5Q29ubmVjdGlvbihyZXF1ZXN0LnRocmVhZElkLCB7IHNvY2tldCwgZXZlbnRzIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGF3YWl0IG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICBzb2NrZXQuc2VuZChKU09OLnN0cmluZ2lmeSh7IHR5cGU6IFwicmVzcG9uc2UuY3JlYXRlXCIsIC4uLnJlcXVlc3QuYm9keSB9KSwgKGVycm9yKSA9PlxuICAgICAgICAgICAgZXJyb3IgPyByZWplY3QoZXJyb3IpIDogcmVzb2x2ZSgpLFxuICAgICAgICAgICk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgICAgY29uc3QgcmVjb3JkID0gY2FjaGVkXG4gICAgICAgICAgICA/IGF3YWl0IG5leHRQb29sZWRSZWNvcmQoZXZlbnRzLCBzb2NrZXQsIHJlcXVlc3Quc2lnbmFsKVxuICAgICAgICAgICAgOiBhd2FpdCBldmVudHMubmV4dCgpO1xuICAgICAgICAgIGlmIChyZWNvcmQua2luZCA9PT0gXCJtZXNzYWdlXCIpIHtcbiAgICAgICAgICAgIGlmIChyZWNvcmQuaXNCaW5hcnkpIHtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IE9wZW5BSVByb3RvY29sRXJyb3IoXCJPcGVuQUkgV2ViU29ja2V0IHNlbnQgYW4gdW5leHBlY3RlZCBiaW5hcnkgbWVzc2FnZVwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCByYXc6IHVua25vd247XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICByYXcgPSBKU09OLnBhcnNlKHJhd0RhdGFUZXh0KHJlY29yZC5kYXRhKSk7XG4gICAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IE9wZW5BSVByb3RvY29sRXJyb3IoXCJPcGVuQUkgV2ViU29ja2V0IHNlbnQgaW52YWxpZCBKU09OXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgZXZlbnQgPSBub3JtYWxpemVPcGVuQUlFdmVudChyYXcpO1xuICAgICAgICAgICAgaWYgKCFldmVudCkgY29udGludWU7XG4gICAgICAgICAgICBpZiAoZXZlbnQudHlwZSA9PT0gXCJjb21wbGV0ZWRcIikge1xuICAgICAgICAgICAgICBjb21wbGV0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgICBpZiAocmV0YWluZWQpIGV2ZW50cy5kZXRhY2hBYm9ydCgpO1xuICAgICAgICAgICAgICBlbHNlIHNvY2tldC5jbG9zZSgxMDAwLCBcInJlc3BvbnNlIGNvbXBsZXRlZFwiKTtcbiAgICAgICAgICAgICAgeWllbGQgZXZlbnQ7XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHlpZWxkIGV2ZW50O1xuICAgICAgICAgICAgaWYgKGV2ZW50LnR5cGUgPT09IFwiZXJyb3JcIikgdGhyb3cgZXZlbnQuZXJyb3I7XG4gICAgICAgICAgfSBlbHNlIGlmIChyZWNvcmQua2luZCA9PT0gXCJlcnJvclwiKSB7XG4gICAgICAgICAgICB0aHJvdyByZWNvcmQuZXJyb3I7XG4gICAgICAgICAgfSBlbHNlIGlmIChyZWNvcmQua2luZCA9PT0gXCJjbG9zZVwiKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgT3BlbkFJUHJvdG9jb2xFcnJvcihcbiAgICAgICAgICAgICAgYE9wZW5BSSBXZWJTb2NrZXQgY2xvc2VkIGJlZm9yZSBhIHRlcm1pbmFsIHJlc3BvbnNlIGV2ZW50ICgke3JlY29yZC5jb2RlfSR7cmVjb3JkLnJlYXNvbiA/IGA6ICR7cmVjb3JkLnJlYXNvbn1gIDogXCJcIn0pYCxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBPcGVuQUlQcm90b2NvbEVycm9yKFwiT3BlbkFJIFdlYlNvY2tldCBlbWl0dGVkIGFuIHVuZXhwZWN0ZWQgaGFuZHNoYWtlIGV2ZW50XCIpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgaWYgKCFjb21wbGV0ZWQgfHwgIXJldGFpbmVkKSB7XG4gICAgICAgICAgaWYgKHJldGFpbmVkKSB0aGlzLmFmZmluaXR5Q29ubmVjdGlvbnMuZGVsZXRlKHJlcXVlc3QudGhyZWFkSWQpO1xuICAgICAgICAgIGV2ZW50cy5jbGVhbnVwKCk7XG4gICAgICAgICAgaWYgKCFjb21wbGV0ZWQpIHNvY2tldC50ZXJtaW5hdGUoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocmV0YWluQ29ubmVjdGlvbikgdGhpcy5idXN5QWZmaW5pdGllcy5kZWxldGUocmVxdWVzdC50aHJlYWRJZCk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlc3BvbnNlRXJyb3IocmVzcG9uc2U6IFJlc3BvbnNlKTogUHJvbWlzZTxPcGVuQUlQcm90b2NvbEVycm9yPiB7XG4gIGNvbnN0IHRleHQgPSBhd2FpdCByZXNwb25zZS50ZXh0KCkuY2F0Y2goKCkgPT4gXCJcIik7XG4gIGxldCBtZXNzYWdlID0gdGV4dCB8fCByZXNwb25zZS5zdGF0dXNUZXh0IHx8IGBIVFRQICR7cmVzcG9uc2Uuc3RhdHVzfWA7XG4gIGxldCBjb2RlOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIHRyeSB7XG4gICAgY29uc3QgcGFyc2VkID0gSlNPTi5wYXJzZSh0ZXh0KSBhcyB7XG4gICAgICBlcnJvcj86IHsgbWVzc2FnZT86IHN0cmluZzsgY29kZT86IHN0cmluZyB9IHwgc3RyaW5nO1xuICAgICAgbWVzc2FnZT86IHN0cmluZztcbiAgICAgIGNvZGU/OiBzdHJpbmc7XG4gICAgfTtcbiAgICBjb25zdCBlcnJvciA9IHBhcnNlZC5lcnJvcjtcbiAgICBtZXNzYWdlID1cbiAgICAgICh0eXBlb2YgZXJyb3IgPT09IFwib2JqZWN0XCIgPyBlcnJvci5tZXNzYWdlIDogdW5kZWZpbmVkKSA/P1xuICAgICAgcGFyc2VkLm1lc3NhZ2UgPz9cbiAgICAgICh0eXBlb2YgZXJyb3IgPT09IFwic3RyaW5nXCIgPyBlcnJvciA6IG1lc3NhZ2UpO1xuICAgIGNvZGUgPSAodHlwZW9mIGVycm9yID09PSBcIm9iamVjdFwiID8gZXJyb3IuY29kZSA6IHVuZGVmaW5lZCkgPz8gcGFyc2VkLmNvZGU7XG4gIH0gY2F0Y2gge1xuICAgIGNvZGUgPSB1bmRlZmluZWQ7XG4gIH1cbiAgcmV0dXJuIG5ldyBPcGVuQUlQcm90b2NvbEVycm9yKG1lc3NhZ2UsIGNvZGUsIHJlc3BvbnNlLnN0YXR1cyk7XG59XG5cbmV4cG9ydCBjbGFzcyBPcGVuQUlIdHRwc1RyYW5zcG9ydCBpbXBsZW1lbnRzIE9wZW5BSVJlc3BvbnNlc1RyYW5zcG9ydCB7XG4gIHByaXZhdGUgY3JlZGVudGlhbHM6IE9wZW5BSURpcmVjdENyZWRlbnRpYWxzO1xuICBwcml2YXRlIHJlYWRvbmx5IGZldGNoSW1wbDogdHlwZW9mIGZldGNoO1xuICBwcml2YXRlIHJlYWRvbmx5IHJlZnJlc2hDcmVkZW50aWFscz86ICgpID0+IFByb21pc2U8T3BlbkFJRGlyZWN0Q3JlZGVudGlhbHM+O1xuXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IE9wZW5BSUh0dHBzVHJhbnNwb3J0T3B0aW9ucykge1xuICAgIHRoaXMuY3JlZGVudGlhbHMgPSBvcHRpb25zLmNyZWRlbnRpYWxzO1xuICAgIHRoaXMuZmV0Y2hJbXBsID0gb3B0aW9ucy5mZXRjaCA/PyBmZXRjaDtcbiAgICB0aGlzLnJlZnJlc2hDcmVkZW50aWFscyA9IG9wdGlvbnMucmVmcmVzaENyZWRlbnRpYWxzO1xuICB9XG5cbiAgc3RyZWFtKHJlcXVlc3Q6IE9wZW5BSVRyYW5zcG9ydFJlcXVlc3QpOiBPcGVuQUlFdmVudFN0cmVhbSB7XG4gICAgcmV0dXJuIHRoaXMucnVuKHJlcXVlc3QpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyAqcnVuKHJlcXVlc3Q6IE9wZW5BSVRyYW5zcG9ydFJlcXVlc3QpOiBBc3luY0dlbmVyYXRvcjxPcGVuQUlOb3JtYWxpemVkRXZlbnQ+IHtcbiAgICBsZXQgcmVmcmVzaGVkID0gZmFsc2U7XG5cbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmZldGNoSW1wbChDSEFUR1BUX0NPREVYX1JFU1BPTlNFU19VUkwsIHtcbiAgICAgICAgbWV0aG9kOiBcIlBPU1RcIixcbiAgICAgICAgaGVhZGVyczogYnVpbGRDb2RleElkZW50aXR5SGVhZGVycyhcbiAgICAgICAgICB0aGlzLmNyZWRlbnRpYWxzLmFjY2Vzc1Rva2VuLFxuICAgICAgICAgIHRoaXMuY3JlZGVudGlhbHMuYWNjb3VudElkLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHNlc3Npb25JZDogcmVxdWVzdC5zZXNzaW9uSWQsXG4gICAgICAgICAgICB0aHJlYWRJZDogcmVxdWVzdC50aHJlYWRJZCxcbiAgICAgICAgICAgIGNsaWVudFJlcXVlc3RJZDogcmVxdWVzdC5jbGllbnRSZXF1ZXN0SWQsXG4gICAgICAgICAgfSxcbiAgICAgICAgKSxcbiAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkocmVxdWVzdC5ib2R5KSxcbiAgICAgICAgc2lnbmFsOiByZXF1ZXN0LnNpZ25hbCxcbiAgICAgIH0pO1xuXG4gICAgICBpZiAocmVzcG9uc2Uuc3RhdHVzID09PSA0MDEgJiYgIXJlZnJlc2hlZCAmJiB0aGlzLnJlZnJlc2hDcmVkZW50aWFscykge1xuICAgICAgICBhd2FpdCByZXNwb25zZS5ib2R5Py5jYW5jZWwoKTtcbiAgICAgICAgdGhpcy5jcmVkZW50aWFscyA9IGF3YWl0IHRoaXMucmVmcmVzaENyZWRlbnRpYWxzKCk7XG4gICAgICAgIHJlZnJlc2hlZCA9IHRydWU7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKCFyZXNwb25zZS5vaykgdGhyb3cgYXdhaXQgcmVzcG9uc2VFcnJvcihyZXNwb25zZSk7XG4gICAgICBpZiAoIXJlc3BvbnNlLmJvZHkpIHRocm93IG5ldyBPcGVuQUlQcm90b2NvbEVycm9yKFwiT3BlbkFJIHJlc3BvbnNlIGhhZCBubyBib2R5XCIpO1xuXG4gICAgICBmb3IgYXdhaXQgKGNvbnN0IGV2ZW50IG9mIG5vcm1hbGl6ZU9wZW5BSVNTRShyZXNwb25zZS5ib2R5KSkge1xuICAgICAgICB5aWVsZCBldmVudDtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBPcGVuQUlEaXJlY3RDbGllbnRPcHRpb25zIGV4dGVuZHMgT3BlbkFJSHR0cHNUcmFuc3BvcnRPcHRpb25zIHtcbiAgdHJhbnNwb3J0PzogT3BlbkFJUmVzcG9uc2VzVHJhbnNwb3J0O1xuICB0cmFuc3BvcnRLaW5kPzogXCJodHRwc1wiIHwgXCJ3ZWJzb2NrZXRcIjtcbiAgd2ViU29ja2V0RmFjdG9yeT86IE9wZW5BSVdlYlNvY2tldEZhY3Rvcnk7XG59XG5cbmV4cG9ydCBjbGFzcyBPcGVuQUlEaXJlY3RDbGllbnQge1xuICBwcml2YXRlIHJlYWRvbmx5IHRyYW5zcG9ydDogT3BlbkFJUmVzcG9uc2VzVHJhbnNwb3J0O1xuXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IE9wZW5BSURpcmVjdENsaWVudE9wdGlvbnMpIHtcbiAgICB0aGlzLnRyYW5zcG9ydCA9XG4gICAgICBvcHRpb25zLnRyYW5zcG9ydCA/P1xuICAgICAgKG9wdGlvbnMudHJhbnNwb3J0S2luZCA9PT0gXCJ3ZWJzb2NrZXRcIlxuICAgICAgICA/IG5ldyBPcGVuQUlXZWJTb2NrZXRUcmFuc3BvcnQob3B0aW9ucylcbiAgICAgICAgOiBuZXcgT3BlbkFJSHR0cHNUcmFuc3BvcnQob3B0aW9ucykpO1xuICB9XG5cbiAgcmVzcG9uc2VzKG9wdGlvbnM6IE9wZW5BSVJlc3BvbnNlc09wdGlvbnMsIHNpZ25hbD86IEFib3J0U2lnbmFsKTogT3BlbkFJRXZlbnRTdHJlYW0ge1xuICAgIGNvbnN0IGNsaWVudFJlcXVlc3RJZCA9IGNyeXB0by5yYW5kb21VVUlEKCk7XG4gICAgY29uc3QgYWZmaW5pdHlJZCA9IG9wdGlvbnMucHJvbXB0Q2FjaGVLZXlcbiAgICAgID8gY2FjaGVBZmZpbml0eVV1aWQob3B0aW9ucy5wcm9tcHRDYWNoZUtleSlcbiAgICAgIDogY2xpZW50UmVxdWVzdElkO1xuICAgIHJldHVybiB0aGlzLnRyYW5zcG9ydC5zdHJlYW0oe1xuICAgICAgYm9keTogYnVpbGRPcGVuQUlSZXNwb25zZXNSZXF1ZXN0KFxuICAgICAgICBvcHRpb25zLnByb21wdENhY2hlS2V5ID8geyAuLi5vcHRpb25zLCBwcm9tcHRDYWNoZUtleTogYWZmaW5pdHlJZCB9IDogb3B0aW9ucyxcbiAgICAgICksXG4gICAgICBzaWduYWwsXG4gICAgICBzZXNzaW9uSWQ6IGFmZmluaXR5SWQsXG4gICAgICAvLyBwcm9tcHRDYWNoZUtleSBpcyBhbHJlYWR5IGEgb25lLXdheSBTREsgYWZmaW5pdHkgdmFsdWUsIG5ldmVyIGEgcmF3IHNlc3Npb25LZXkuXG4gICAgICB0aHJlYWRJZDogYWZmaW5pdHlJZCxcbiAgICAgIGNsaWVudFJlcXVlc3RJZCxcbiAgICB9KTtcbiAgfVxuXG4gIGNsb3NlKCk6IHZvaWQge1xuICAgIHRoaXMudHJhbnNwb3J0LmNsb3NlPy4oKTtcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7OztBQXFFQSxNQUFNLDhCQUE4QjtBQUVwQyxTQUFTLGFBQWEsS0FBcUI7Q0FDekMsSUFBSTtDQUNKLElBQUk7RUFDRixTQUFTLElBQUksSUFBSSxHQUFHO0NBQ3RCLFNBQVMsT0FBTztFQUNkLE1BQU0sSUFBSSxvQkFBb0IsaUNBQWlDLE9BQU8sS0FBSyxHQUFHO0NBQ2hGO0NBQ0EsT0FBTyxXQUFXLE9BQU8sYUFBYSxXQUFXLFNBQVM7Q0FDMUQsT0FBTyxPQUFPLFNBQVM7QUFDekI7QUFFQSxTQUFTLFlBQVksTUFBdUI7Q0FDMUMsSUFBSSxNQUFNLFFBQVEsSUFBSSxHQUFHLE9BQU8sT0FBTyxPQUFPLElBQUksQ0FBQyxDQUFDLFNBQVM7Q0FDN0QsSUFBSSxnQkFBZ0IsYUFBYSxPQUFPLE9BQU8sS0FBSyxJQUFJLFdBQVcsSUFBSSxDQUFDLENBQUMsQ0FBQyxTQUFTO0NBQ25GLE9BQU8sT0FBTyxLQUFLLElBQUksQ0FBQyxDQUFDLFNBQVM7QUFDcEM7QUFFQSxTQUFTLGFBQWEsUUFBNkIsUUFBc0I7Q0FDdkUsTUFBTSxVQUEwQixDQUFDO0NBQ2pDLE1BQU0sVUFBaUQsQ0FBQztDQUN4RCxJQUFJLFNBQVM7Q0FDYixNQUFNLFFBQVEsV0FBeUI7RUFDckMsSUFBSSxDQUFDLFFBQVE7RUFDYixNQUFNLFNBQVMsUUFBUSxNQUFNO0VBQzdCLElBQUksUUFBUSxPQUFPLE1BQU07T0FDcEIsSUFBSSxRQUFRLFNBQVMsNkJBQTZCLFFBQVEsS0FBSyxNQUFNO09BQ3JFO0dBQ0gsU0FBUztHQUNULFFBQVEsU0FBUztHQUNqQixPQUFPLFVBQVU7R0FDakIsTUFBTSxXQUFXO0lBQ2YsTUFBTTtJQUNOLE9BQU8sSUFBSSxvQkFDVCxpQ0FBaUMsNEJBQTRCLHlCQUM3RCx3QkFDRjtHQUNGO0dB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
|
|
365
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3BlbmFpLWRpcmVjdC1jbGllbnQuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3V0aWxzL3Byb3ZpZGVycy9vcGVuYWkvb3BlbmFpLWRpcmVjdC1jbGllbnQudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGNyeXB0byBmcm9tIFwibm9kZTpjcnlwdG9cIjtcblxuaW1wb3J0IFdzQ2xpZW50LCB7IHR5cGUgQ2xpZW50T3B0aW9ucywgdHlwZSBSYXdEYXRhIH0gZnJvbSBcIndzXCI7XG5cbmltcG9ydCB7XG4gIGJ1aWxkQ29kZXhJZGVudGl0eUhlYWRlcnMsXG4gIGJ1aWxkT3BlbkFJUmVzcG9uc2VzUmVxdWVzdCxcbiAgQ0hBVEdQVF9DT0RFWF9SRVNQT05TRVNfVVJMLFxuICBub3JtYWxpemVPcGVuQUlFdmVudCxcbiAgT3BlbkFJUHJvdG9jb2xFcnJvcixcbiAgdHlwZSBPcGVuQUlOb3JtYWxpemVkRXZlbnQsXG4gIHR5cGUgT3BlbkFJUmVzcG9uc2VzT3B0aW9ucyxcbiAgdHlwZSBPcGVuQUlSZXNwb25zZXNSZXF1ZXN0LFxufSBmcm9tIFwiLi9vcGVuYWktYmFja2VuZC1wcm90b2NvbFwiO1xuaW1wb3J0IHtcbiAgYnVpbGRTdGFuZGFsb25lSW1hZ2VSZXF1ZXN0LFxuICByZWFkU3RhbmRhbG9uZUltYWdlUmVzcG9uc2UsXG59IGZyb20gXCIuL29wZW5haS1pbWFnZS1nZW5lcmF0aW9uXCI7XG5pbXBvcnQgeyBub3JtYWxpemVPcGVuQUlTU0UsIHR5cGUgT3BlbkFJRXZlbnRTdHJlYW0gfSBmcm9tIFwiLi9vcGVuYWktc3NlXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgT3BlbkFJRGlyZWN0Q3JlZGVudGlhbHMge1xuICBhY2Nlc3NUb2tlbjogc3RyaW5nO1xuICBhY2NvdW50SWQ6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBPcGVuQUlUcmFuc3BvcnRSZXF1ZXN0IHtcbiAgYm9keTogT3BlbkFJUmVzcG9uc2VzUmVxdWVzdDtcbiAgc2lnbmFsPzogQWJvcnRTaWduYWw7XG4gIHNlc3Npb25JZDogc3RyaW5nO1xuICB0aHJlYWRJZDogc3RyaW5nO1xuICBjbGllbnRSZXF1ZXN0SWQ6IHN0cmluZztcbn1cblxuLyoqIFRyYW5zcG9ydC1pbmRlcGVuZGVudCBzdHJlYW1pbmcgaW50ZXJmYWNlOyBIVFRQUyBpcyB0aGUgZmlyc3QgaW1wbGVtZW50YXRpb24uICovXG5leHBvcnQgaW50ZXJmYWNlIE9wZW5BSVJlc3BvbnNlc1RyYW5zcG9ydCB7XG4gIHN0cmVhbShyZXF1ZXN0OiBPcGVuQUlUcmFuc3BvcnRSZXF1ZXN0KTogT3BlbkFJRXZlbnRTdHJlYW07XG4gIGNsb3NlPygpOiB2b2lkO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE9wZW5BSUh0dHBzVHJhbnNwb3J0T3B0aW9ucyB7XG4gIGNyZWRlbnRpYWxzOiBPcGVuQUlEaXJlY3RDcmVkZW50aWFscztcbiAgZmV0Y2g/OiB0eXBlb2YgZmV0Y2g7XG4gIHJlZnJlc2hDcmVkZW50aWFscz86ICgpID0+IFByb21pc2U8T3BlbkFJRGlyZWN0Q3JlZGVudGlhbHM+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE9wZW5BSVdlYlNvY2tldExpa2Uge1xuICBvbihldmVudDogXCJvcGVuXCIsIGxpc3RlbmVyOiAoKSA9PiB2b2lkKTogdGhpcztcbiAgb24oZXZlbnQ6IFwibWVzc2FnZVwiLCBsaXN0ZW5lcjogKGRhdGE6IFJhd0RhdGEsIGlzQmluYXJ5OiBib29sZWFuKSA9PiB2b2lkKTogdGhpcztcbiAgb24oZXZlbnQ6IFwiY2xvc2VcIiwgbGlzdGVuZXI6IChjb2RlOiBudW1iZXIsIHJlYXNvbjogQnVmZmVyKSA9PiB2b2lkKTogdGhpcztcbiAgb24oZXZlbnQ6IFwiZXJyb3JcIiwgbGlzdGVuZXI6IChlcnJvcjogRXJyb3IpID0+IHZvaWQpOiB0aGlzO1xuICBvbihcbiAgICBldmVudDogXCJ1bmV4cGVjdGVkLXJlc3BvbnNlXCIsXG4gICAgbGlzdGVuZXI6IChyZXF1ZXN0OiB1bmtub3duLCByZXNwb25zZTogeyBzdGF0dXNDb2RlPzogbnVtYmVyIH0pID0+IHZvaWQsXG4gICk6IHRoaXM7XG4gIG9mZihldmVudDogc3RyaW5nLCBsaXN0ZW5lcjogKC4uLmFyZ3M6IG5ldmVyW10pID0+IHZvaWQpOiB0aGlzO1xuICBzZW5kKGRhdGE6IHN0cmluZywgY2FsbGJhY2s/OiAoZXJyb3I/OiBFcnJvcikgPT4gdm9pZCk6IHZvaWQ7XG4gIGNsb3NlKGNvZGU/OiBudW1iZXIsIHJlYXNvbj86IHN0cmluZyk6IHZvaWQ7XG4gIHRlcm1pbmF0ZSgpOiB2b2lkO1xufVxuXG5leHBvcnQgdHlwZSBPcGVuQUlXZWJTb2NrZXRGYWN0b3J5ID0gKHVybDogc3RyaW5nLCBvcHRpb25zOiBDbGllbnRPcHRpb25zKSA9PiBPcGVuQUlXZWJTb2NrZXRMaWtlO1xuXG5leHBvcnQgaW50ZXJmYWNlIE9wZW5BSVdlYlNvY2tldFRyYW5zcG9ydE9wdGlvbnMgZXh0ZW5kcyBPcGVuQUlIdHRwc1RyYW5zcG9ydE9wdGlvbnMge1xuICB3ZWJTb2NrZXRGYWN0b3J5PzogT3BlbkFJV2ViU29ja2V0RmFjdG9yeTtcbn1cblxudHlwZSBTb2NrZXRSZWNvcmQgPVxuICB8IHsga2luZDogXCJvcGVuXCIgfVxuICB8IHsga2luZDogXCJtZXNzYWdlXCI7IGRhdGE6IFJhd0RhdGE7IGlzQmluYXJ5OiBib29sZWFuIH1cbiAgfCB7IGtpbmQ6IFwiY2xvc2VcIjsgY29kZTogbnVtYmVyOyByZWFzb246IHN0cmluZyB9XG4gIHwgeyBraW5kOiBcImVycm9yXCI7IGVycm9yOiBFcnJvciB9XG4gIHwgeyBraW5kOiBcInJlamVjdGVkXCI7IHN0YXR1cz86IG51bWJlciB9O1xuXG5jb25zdCBNQVhfQlVGRkVSRURfU09DS0VUX1JFQ09SRFMgPSAxNjAwO1xuXG5mdW5jdGlvbiB3ZWJzb2NrZXRVcmwodXJsOiBzdHJpbmcpOiBzdHJpbmcge1xuICBsZXQgcGFyc2VkOiBVUkw7XG4gIHRyeSB7XG4gICAgcGFyc2VkID0gbmV3IFVSTCh1cmwpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHRocm93IG5ldyBPcGVuQUlQcm90b2NvbEVycm9yKGBJbnZhbGlkIE9wZW5BSSBSZXNwb25zZXMgVVJMOiAke1N0cmluZyhlcnJvcil9YCk7XG4gIH1cbiAgcGFyc2VkLnByb3RvY29sID0gcGFyc2VkLnByb3RvY29sID09PSBcImh0dHBzOlwiID8gXCJ3c3M6XCIgOiBcIndzOlwiO1xuICByZXR1cm4gcGFyc2VkLnRvU3RyaW5nKCk7XG59XG5cbmZ1bmN0aW9uIHJhd0RhdGFUZXh0KGRhdGE6IFJhd0RhdGEpOiBzdHJpbmcge1xuICBpZiAoQXJyYXkuaXNBcnJheShkYXRhKSkgcmV0dXJuIEJ1ZmZlci5jb25jYXQoZGF0YSkudG9TdHJpbmcoKTtcbiAgaWYgKGRhdGEgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikgcmV0dXJuIEJ1ZmZlci5mcm9tKG5ldyBVaW50OEFycmF5KGRhdGEpKS50b1N0cmluZygpO1xuICByZXR1cm4gQnVmZmVyLmZyb20oZGF0YSkudG9TdHJpbmcoKTtcbn1cblxuZnVuY3Rpb24gc29ja2V0RXZlbnRzKHNvY2tldDogT3BlbkFJV2ViU29ja2V0TGlrZSwgc2lnbmFsPzogQWJvcnRTaWduYWwpIHtcbiAgY29uc3QgcmVjb3JkczogU29ja2V0UmVjb3JkW10gPSBbXTtcbiAgY29uc3Qgd2FpdGVyczogQXJyYXk8KHJlY29yZDogU29ja2V0UmVjb3JkKSA9PiB2b2lkPiA9IFtdO1xuICBsZXQgYWN0aXZlID0gdHJ1ZTtcbiAgY29uc3QgcHVzaCA9IChyZWNvcmQ6IFNvY2tldFJlY29yZCkgPT4ge1xuICAgIGlmICghYWN0aXZlKSByZXR1cm47XG4gICAgY29uc3Qgd2FpdGVyID0gd2FpdGVycy5zaGlmdCgpO1xuICAgIGlmICh3YWl0ZXIpIHdhaXRlcihyZWNvcmQpO1xuICAgIGVsc2UgaWYgKHJlY29yZHMubGVuZ3RoIDwgTUFYX0JVRkZFUkVEX1NPQ0tFVF9SRUNPUkRTKSByZWNvcmRzLnB1c2gocmVjb3JkKTtcbiAgICBlbHNlIHtcbiAgICAgIGFjdGl2ZSA9IGZhbHNlO1xuICAgICAgcmVjb3Jkcy5sZW5ndGggPSAwO1xuICAgICAgc29ja2V0LnRlcm1pbmF0ZSgpO1xuICAgICAgY29uc3Qgb3ZlcmZsb3cgPSB7XG4gICAgICAgIGtpbmQ6IFwiZXJyb3JcIiBhcyBjb25zdCxcbiAgICAgICAgZXJyb3I6IG5ldyBPcGVuQUlQcm90b2NvbEVycm9yKFxuICAgICAgICAgIGBPcGVuQUkgV2ViU29ja2V0IGV4Y2VlZGVkIHRoZSAke01BWF9CVUZGRVJFRF9TT0NLRVRfUkVDT1JEU30tcmVjb3JkIHJlY2VpdmUgYnVmZmVyYCxcbiAgICAgICAgICBcIndlYnNvY2tldF9iYWNrcHJlc3N1cmVcIixcbiAgICAgICAgKSxcbiAgICAgIH07XG4gICAgICBjb25zdCBvdmVyZmxvd1dhaXRlciA9IHdhaXRlcnMuc2hpZnQoKTtcbiAgICAgIGlmIChvdmVyZmxvd1dhaXRlcikgb3ZlcmZsb3dXYWl0ZXIob3ZlcmZsb3cpO1xuICAgICAgZWxzZSByZWNvcmRzLnB1c2gob3ZlcmZsb3cpO1xuICAgIH1cbiAgfTtcbiAgY29uc3Qgb25PcGVuID0gKCkgPT4gcHVzaCh7IGtpbmQ6IFwib3BlblwiIH0pO1xuICBjb25zdCBvbk1lc3NhZ2UgPSAoZGF0YTogUmF3RGF0YSwgaXNCaW5hcnk6IGJvb2xlYW4pID0+IHB1c2goeyBraW5kOiBcIm1lc3NhZ2VcIiwgZGF0YSwgaXNCaW5hcnkgfSk7XG4gIGNvbnN0IG9uQ2xvc2UgPSAoY29kZTogbnVtYmVyLCByZWFzb246IEJ1ZmZlcikgPT5cbiAgICBwdXNoKHsga2luZDogXCJjbG9zZVwiLCBjb2RlLCByZWFzb246IHJlYXNvbi50b1N0cmluZygpIH0pO1xuICBjb25zdCBvbkVycm9yID0gKGVycm9yOiBFcnJvcikgPT4gcHVzaCh7IGtpbmQ6IFwiZXJyb3JcIiwgZXJyb3IgfSk7XG4gIGNvbnN0IG9uVW5leHBlY3RlZFJlc3BvbnNlID0gKF9yZXF1ZXN0OiB1bmtub3duLCByZXNwb25zZTogeyBzdGF0dXNDb2RlPzogbnVtYmVyIH0pID0+XG4gICAgcHVzaCh7IGtpbmQ6IFwicmVqZWN0ZWRcIiwgc3RhdHVzOiByZXNwb25zZS5zdGF0dXNDb2RlIH0pO1xuICBzb2NrZXQub24oXCJvcGVuXCIsIG9uT3Blbik7XG4gIHNvY2tldC5vbihcIm1lc3NhZ2VcIiwgb25NZXNzYWdlKTtcbiAgc29ja2V0Lm9uKFwiY2xvc2VcIiwgb25DbG9zZSk7XG4gIHNvY2tldC5vbihcImVycm9yXCIsIG9uRXJyb3IpO1xuICBzb2NrZXQub24oXCJ1bmV4cGVjdGVkLXJlc3BvbnNlXCIsIG9uVW5leHBlY3RlZFJlc3BvbnNlKTtcbiAgY29uc3Qgb25BYm9ydCA9ICgpID0+IHtcbiAgICBzb2NrZXQudGVybWluYXRlKCk7XG4gICAgcHVzaCh7IGtpbmQ6IFwiZXJyb3JcIiwgZXJyb3I6IGFib3J0RXJyb3Ioc2lnbmFsKSB9KTtcbiAgfTtcbiAgc2lnbmFsPy5hZGRFdmVudExpc3RlbmVyKFwiYWJvcnRcIiwgb25BYm9ydCwgeyBvbmNlOiB0cnVlIH0pO1xuICByZXR1cm4ge1xuICAgIG5leHQ6ICgpID0+XG4gICAgICByZWNvcmRzLmxlbmd0aFxuICAgICAgICA/IFByb21pc2UucmVzb2x2ZShyZWNvcmRzLnNoaWZ0KCkhKVxuICAgICAgICA6IG5ldyBQcm9taXNlPFNvY2tldFJlY29yZD4oKHJlc29sdmUpID0+IHdhaXRlcnMucHVzaChyZXNvbHZlKSksXG4gICAgY2xlYW51cDogKCkgPT4ge1xuICAgICAgYWN0aXZlID0gZmFsc2U7XG4gICAgICBzaWduYWw/LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJhYm9ydFwiLCBvbkFib3J0KTtcbiAgICAgIHNvY2tldC5vZmYoXCJvcGVuXCIsIG9uT3Blbik7XG4gICAgICBzb2NrZXQub2ZmKFwibWVzc2FnZVwiLCBvbk1lc3NhZ2UpO1xuICAgICAgc29ja2V0Lm9mZihcImNsb3NlXCIsIG9uQ2xvc2UpO1xuICAgICAgc29ja2V0Lm9mZihcImVycm9yXCIsIG9uRXJyb3IpO1xuICAgICAgc29ja2V0Lm9mZihcInVuZXhwZWN0ZWQtcmVzcG9uc2VcIiwgb25VbmV4cGVjdGVkUmVzcG9uc2UpO1xuICAgICAgcmVjb3Jkcy5sZW5ndGggPSAwO1xuICAgICAgY29uc3QgY2xvc2VkID0ge1xuICAgICAgICBraW5kOiBcImVycm9yXCIgYXMgY29uc3QsXG4gICAgICAgIGVycm9yOiBuZXcgT3BlbkFJUHJvdG9jb2xFcnJvcihcIk9wZW5BSSBXZWJTb2NrZXQgZXZlbnQgc3RyZWFtIHdhcyBjbG9zZWRcIiksXG4gICAgICB9O1xuICAgICAgZm9yIChjb25zdCB3YWl0ZXIgb2Ygd2FpdGVycy5zcGxpY2UoMCkpIHdhaXRlcihjbG9zZWQpO1xuICAgIH0sXG4gICAgZGV0YWNoQWJvcnQ6ICgpID0+IHNpZ25hbD8ucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImFib3J0XCIsIG9uQWJvcnQpLFxuICB9O1xufVxuXG5mdW5jdGlvbiBhYm9ydEVycm9yKHNpZ25hbD86IEFib3J0U2lnbmFsKTogRXJyb3Ige1xuICByZXR1cm4gc2lnbmFsPy5yZWFzb24gaW5zdGFuY2VvZiBFcnJvclxuICAgID8gc2lnbmFsLnJlYXNvblxuICAgIDogbmV3IERPTUV4Y2VwdGlvbihcIkFib3J0ZWRcIiwgXCJBYm9ydEVycm9yXCIpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBuZXh0UG9vbGVkUmVjb3JkKFxuICBldmVudHM6IFJldHVyblR5cGU8dHlwZW9mIHNvY2tldEV2ZW50cz4sXG4gIHNvY2tldDogT3BlbkFJV2ViU29ja2V0TGlrZSxcbiAgc2lnbmFsPzogQWJvcnRTaWduYWwsXG4pOiBQcm9taXNlPFNvY2tldFJlY29yZD4ge1xuICBpZiAoIXNpZ25hbCkgcmV0dXJuIGV2ZW50cy5uZXh0KCk7XG4gIGlmIChzaWduYWwuYWJvcnRlZCkgdGhyb3cgYWJvcnRFcnJvcihzaWduYWwpO1xuICByZXR1cm4gbmV3IFByb21pc2U8U29ja2V0UmVjb3JkPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgY29uc3Qgb25BYm9ydCA9ICgpID0+IHtcbiAgICAgIHNvY2tldC50ZXJtaW5hdGUoKTtcbiAgICAgIHJlamVjdChhYm9ydEVycm9yKHNpZ25hbCkpO1xuICAgIH07XG4gICAgc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoXCJhYm9ydFwiLCBvbkFib3J0LCB7IG9uY2U6IHRydWUgfSk7XG4gICAgdm9pZCBldmVudHNcbiAgICAgIC5uZXh0KClcbiAgICAgIC50aGVuKHJlc29sdmUsIHJlamVjdClcbiAgICAgIC5maW5hbGx5KCgpID0+IHtcbiAgICAgICAgc2lnbmFsLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJhYm9ydFwiLCBvbkFib3J0KTtcbiAgICAgIH0pO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gY2FjaGVBZmZpbml0eVV1aWQoa2V5OiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBoZXggPSBjcnlwdG8uY3JlYXRlSGFzaChcInNoYTI1NlwiKS51cGRhdGUoa2V5KS5kaWdlc3QoXCJoZXhcIikuc2xpY2UoMCwgMzIpLnNwbGl0KFwiXCIpO1xuICBoZXhbMTJdID0gXCI0XCI7XG4gIGhleFsxNl0gPSAoKE51bWJlci5wYXJzZUludChoZXhbMTZdISwgMTYpICYgMHgzKSB8IDB4OCkudG9TdHJpbmcoMTYpO1xuICByZXR1cm4gYCR7aGV4LnNsaWNlKDAsIDgpLmpvaW4oXCJcIil9LSR7aGV4LnNsaWNlKDgsIDEyKS5qb2luKFwiXCIpfS0ke2hleC5zbGljZSgxMiwgMTYpLmpvaW4oXCJcIil9LSR7aGV4LnNsaWNlKDE2LCAyMCkuam9pbihcIlwiKX0tJHtoZXguc2xpY2UoMjApLmpvaW4oXCJcIil9YDtcbn1cblxudHlwZSBBZmZpbml0eUNvbm5lY3Rpb24gPSB7XG4gIHNvY2tldDogT3BlbkFJV2ViU29ja2V0TGlrZTtcbiAgZXZlbnRzOiBSZXR1cm5UeXBlPHR5cGVvZiBzb2NrZXRFdmVudHM+O1xuICBjbG9zZWQ/OiBib29sZWFuO1xufTtcblxuZXhwb3J0IGNsYXNzIE9wZW5BSVdlYlNvY2tldFRyYW5zcG9ydCBpbXBsZW1lbnRzIE9wZW5BSVJlc3BvbnNlc1RyYW5zcG9ydCB7XG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IE1BWF9BRkZJTklUWV9DT05ORUNUSU9OUyA9IDE2O1xuICBwcml2YXRlIGNyZWRlbnRpYWxzOiBPcGVuQUlEaXJlY3RDcmVkZW50aWFscztcbiAgcHJpdmF0ZSByZWFkb25seSByZWZyZXNoQ3JlZGVudGlhbHM/OiAoKSA9PiBQcm9taXNlPE9wZW5BSURpcmVjdENyZWRlbnRpYWxzPjtcbiAgcHJpdmF0ZSByZWFkb25seSB3ZWJTb2NrZXRGYWN0b3J5OiBPcGVuQUlXZWJTb2NrZXRGYWN0b3J5O1xuICBwcml2YXRlIHJlYWRvbmx5IGFmZmluaXR5Q29ubmVjdGlvbnMgPSBuZXcgTWFwPHN0cmluZywgQWZmaW5pdHlDb25uZWN0aW9uPigpO1xuICBwcml2YXRlIHJlYWRvbmx5IGJ1c3lBZmZpbml0aWVzID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgY29uc3RydWN0b3Iob3B0aW9uczogT3BlbkFJV2ViU29ja2V0VHJhbnNwb3J0T3B0aW9ucykge1xuICAgIHRoaXMuY3JlZGVudGlhbHMgPSBvcHRpb25zLmNyZWRlbnRpYWxzO1xuICAgIHRoaXMucmVmcmVzaENyZWRlbnRpYWxzID0gb3B0aW9ucy5yZWZyZXNoQ3JlZGVudGlhbHM7XG4gICAgdGhpcy53ZWJTb2NrZXRGYWN0b3J5ID1cbiAgICAgIG9wdGlvbnMud2ViU29ja2V0RmFjdG9yeSA/PyAoKHVybCwgd3NPcHRpb25zKSA9PiBuZXcgV3NDbGllbnQodXJsLCB3c09wdGlvbnMpKTtcbiAgfVxuXG4gIHN0cmVhbShyZXF1ZXN0OiBPcGVuQUlUcmFuc3BvcnRSZXF1ZXN0KTogT3BlbkFJRXZlbnRTdHJlYW0ge1xuICAgIHJldHVybiB0aGlzLnJ1bihyZXF1ZXN0KTtcbiAgfVxuXG4gIGNsb3NlKCk6IHZvaWQge1xuICAgIGZvciAoY29uc3QgeyBzb2NrZXQsIGV2ZW50cyB9IG9mIHRoaXMuYWZmaW5pdHlDb25uZWN0aW9ucy52YWx1ZXMoKSkge1xuICAgICAgZXZlbnRzLmNsZWFudXAoKTtcbiAgICAgIHNvY2tldC5jbG9zZSgxMDAwLCBcInRyYW5zcG9ydCBjbG9zZWRcIik7XG4gICAgfVxuICAgIHRoaXMuYWZmaW5pdHlDb25uZWN0aW9ucy5jbGVhcigpO1xuICAgIHRoaXMuYnVzeUFmZmluaXRpZXMuY2xlYXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDsupDsi5zsl5Ag7Jew6rKw7J2EIOuTseuhne2VnOuLpC4g7J6Q66as6rCAIOyXhuycvOuptCDsnKDtnLQg7Jew6rKw66eMIOy2ley2nO2VmOqzoCwg7KCE67aAIOyCrOyaqSDspJHsnbTrqbRcbiAgICog7KeE7ZaJIOykkeyduCDsnZHri7XsnYQg64GK64qUIOuMgOyLoCDrk7HroZ3snYQg7Y+s6riw7ZWc64ukKGZhbHNlIOKGkiDsnbQg7JqU7LKt7J2AIOydvO2ajOyEsSDshozsvJPsnLzroZwg7LKY66asKS5cbiAgICovXG4gIHByaXZhdGUgcmVtZW1iZXJBZmZpbml0eUNvbm5lY3Rpb24odGhyZWFkSWQ6IHN0cmluZywgY29ubmVjdGlvbjogQWZmaW5pdHlDb25uZWN0aW9uKTogYm9vbGVhbiB7XG4gICAgaWYgKFxuICAgICAgIXRoaXMuYWZmaW5pdHlDb25uZWN0aW9ucy5oYXModGhyZWFkSWQpICYmXG4gICAgICB0aGlzLmFmZmluaXR5Q29ubmVjdGlvbnMuc2l6ZSA+PSBPcGVuQUlXZWJTb2NrZXRUcmFuc3BvcnQuTUFYX0FGRklOSVRZX0NPTk5FQ1RJT05TXG4gICAgKSB7XG4gICAgICBjb25zdCBpZGxlS2V5ID0gWy4uLnRoaXMuYWZmaW5pdHlDb25uZWN0aW9ucy5rZXlzKCldLmZpbmQoXG4gICAgICAgIChrZXkpID0+ICF0aGlzLmJ1c3lBZmZpbml0aWVzLmhhcyhrZXkpLFxuICAgICAgKTtcbiAgICAgIGlmIChpZGxlS2V5ID09PSB1bmRlZmluZWQpIHJldHVybiBmYWxzZTtcbiAgICAgIGNvbnN0IGlkbGUgPSB0aGlzLmFmZmluaXR5Q29ubmVjdGlvbnMuZ2V0KGlkbGVLZXkpITtcbiAgICAgIGlkbGUuZXZlbnRzLmNsZWFudXAoKTtcbiAgICAgIGlkbGUuc29ja2V0LmNsb3NlKDEwMDAsIFwiYWZmaW5pdHkgY2FjaGUgZXZpY3RlZFwiKTtcbiAgICAgIHRoaXMuYWZmaW5pdHlDb25uZWN0aW9ucy5kZWxldGUoaWRsZUtleSk7XG4gICAgfVxuICAgIHRoaXMuYWZmaW5pdHlDb25uZWN0aW9ucy5zZXQodGhyZWFkSWQsIGNvbm5lY3Rpb24pO1xuICAgIC8vIOycoO2ctCDsg4Htg5zsl5DshJwgYmFja2VuZCDqsIAg64GK7J2AIOyGjOy8k+ydhCDri6TsnYwg7JqU7LKt7J20IOynkeyWtOuTpOyngCDslYrrj4TroZ0g7LqQ7Iuc7JeQ7IScIOygnOqxsO2VnOuLpC5cbiAgICBjb25zdCBkcm9wID0gKCkgPT4ge1xuICAgICAgY29ubmVjdGlvbi5jbG9zZWQgPSB0cnVlO1xuICAgICAgaWYgKHRoaXMuYnVzeUFmZmluaXRpZXMuaGFzKHRocmVhZElkKSkgcmV0dXJuO1xuICAgICAgaWYgKHRoaXMuYWZmaW5pdHlDb25uZWN0aW9ucy5nZXQodGhyZWFkSWQpICE9PSBjb25uZWN0aW9uKSByZXR1cm47XG4gICAgICB0aGlzLmFmZmluaXR5Q29ubmVjdGlvbnMuZGVsZXRlKHRocmVhZElkKTtcbiAgICAgIGNvbm5lY3Rpb24uZXZlbnRzLmNsZWFudXAoKTtcbiAgICB9O1xuICAgIGNvbm5lY3Rpb24uc29ja2V0Lm9uKFwiY2xvc2VcIiwgZHJvcCk7XG4gICAgY29ubmVjdGlvbi5zb2NrZXQub24oXCJlcnJvclwiLCBkcm9wKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgKnJ1bihyZXF1ZXN0OiBPcGVuQUlUcmFuc3BvcnRSZXF1ZXN0KTogQXN5bmNHZW5lcmF0b3I8T3BlbkFJTm9ybWFsaXplZEV2ZW50PiB7XG4gICAgbGV0IHJlZnJlc2hlZCA9IGZhbHNlO1xuICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICBpZiAocmVxdWVzdC5zaWduYWw/LmFib3J0ZWQpIHRocm93IGFib3J0RXJyb3IocmVxdWVzdC5zaWduYWwpO1xuICAgICAgY29uc3QgaGFzQWZmaW5pdHkgPSByZXF1ZXN0LmJvZHkucHJvbXB0X2NhY2hlX2tleSAhPT0gdW5kZWZpbmVkO1xuICAgICAgY29uc3QgcmV0YWluQ29ubmVjdGlvbiA9IGhhc0FmZmluaXR5ICYmICF0aGlzLmJ1c3lBZmZpbml0aWVzLmhhcyhyZXF1ZXN0LnRocmVhZElkKTtcbiAgICAgIGlmIChyZXRhaW5Db25uZWN0aW9uKSB0aGlzLmJ1c3lBZmZpbml0aWVzLmFkZChyZXF1ZXN0LnRocmVhZElkKTtcbiAgICAgIGNvbnN0IGVudHJ5ID0gcmV0YWluQ29ubmVjdGlvbiA/IHRoaXMuYWZmaW5pdHlDb25uZWN0aW9ucy5nZXQocmVxdWVzdC50aHJlYWRJZCkgOiB1bmRlZmluZWQ7XG4gICAgICBpZiAoZW50cnk/LmNsb3NlZCkge1xuICAgICAgICB0aGlzLmFmZmluaXR5Q29ubmVjdGlvbnMuZGVsZXRlKHJlcXVlc3QudGhyZWFkSWQpO1xuICAgICAgICBlbnRyeS5ldmVudHMuY2xlYW51cCgpO1xuICAgICAgfVxuICAgICAgY29uc3QgY2FjaGVkID0gZW50cnk/LmNsb3NlZCA/IHVuZGVmaW5lZCA6IGVudHJ5O1xuICAgICAgLy8g7LqQ7IucIOuTseuhneyXkCDsi6TtjKjtlZjrqbQg7J20IOyalOyyreydgCDsnqzsgqzsmqkg64yA7IOB7J20IOyVhOuLiOuLpC5cbiAgICAgIGxldCByZXRhaW5lZCA9IHJldGFpbkNvbm5lY3Rpb247XG4gICAgICBjb25zdCBzb2NrZXQgPVxuICAgICAgICBjYWNoZWQ/LnNvY2tldCA/P1xuICAgICAgICB0aGlzLndlYlNvY2tldEZhY3Rvcnkod2Vic29ja2V0VXJsKENIQVRHUFRfQ09ERVhfUkVTUE9OU0VTX1VSTCksIHtcbiAgICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICAuLi5idWlsZENvZGV4SWRlbnRpdHlIZWFkZXJzKHRoaXMuY3JlZGVudGlhbHMuYWNjZXNzVG9rZW4sIHRoaXMuY3JlZGVudGlhbHMuYWNjb3VudElkLCB7XG4gICAgICAgICAgICAgIHNlc3Npb25JZDogcmVxdWVzdC5zZXNzaW9uSWQsXG4gICAgICAgICAgICAgIHRocmVhZElkOiByZXF1ZXN0LnRocmVhZElkLFxuICAgICAgICAgICAgICBjbGllbnRSZXF1ZXN0SWQ6IHJlcXVlc3QuY2xpZW50UmVxdWVzdElkLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBcIk9wZW5BSS1CZXRhXCI6IFwicmVzcG9uc2VzX3dlYnNvY2tldHM9MjAyNi0wMi0wNlwiLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgICAgY29uc3QgZXZlbnRzID0gY2FjaGVkPy5ldmVudHMgPz8gc29ja2V0RXZlbnRzKHNvY2tldCwgcmVxdWVzdC5zaWduYWwpO1xuICAgICAgbGV0IGNvbXBsZXRlZCA9IGZhbHNlO1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKCFjYWNoZWQpIHtcbiAgICAgICAgICBjb25zdCBoYW5kc2hha2UgPSBhd2FpdCBldmVudHMubmV4dCgpO1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIGhhbmRzaGFrZS5raW5kID09PSBcInJlamVjdGVkXCIgJiZcbiAgICAgICAgICAgIGhhbmRzaGFrZS5zdGF0dXMgPT09IDQwMSAmJlxuICAgICAgICAgICAgIXJlZnJlc2hlZCAmJlxuICAgICAgICAgICAgdGhpcy5yZWZyZXNoQ3JlZGVudGlhbHNcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIHNvY2tldC50ZXJtaW5hdGUoKTtcbiAgICAgICAgICAgIHRoaXMuY3JlZGVudGlhbHMgPSBhd2FpdCB0aGlzLnJlZnJlc2hDcmVkZW50aWFscygpO1xuICAgICAgICAgICAgcmVmcmVzaGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoaGFuZHNoYWtlLmtpbmQgPT09IFwicmVqZWN0ZWRcIikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IE9wZW5BSVByb3RvY29sRXJyb3IoXG4gICAgICAgICAgICAgIGBPcGVuQUkgV2ViU29ja2V0IGhhbmRzaGFrZSByZWplY3RlZCR7aGFuZHNoYWtlLnN0YXR1cyA/IGAgd2l0aCBIVFRQICR7aGFuZHNoYWtlLnN0YXR1c31gIDogXCJcIn1gLFxuICAgICAgICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgICAgICAgIGhhbmRzaGFrZS5zdGF0dXMsXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoaGFuZHNoYWtlLmtpbmQgPT09IFwiZXJyb3JcIikgdGhyb3cgaGFuZHNoYWtlLmVycm9yO1xuICAgICAgICAgIGlmIChoYW5kc2hha2Uua2luZCAhPT0gXCJvcGVuXCIpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBPcGVuQUlQcm90b2NvbEVycm9yKFwiT3BlbkFJIFdlYlNvY2tldCBjbG9zZWQgYmVmb3JlIHRoZSBoYW5kc2hha2UgY29tcGxldGVkXCIpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAocmV0YWluQ29ubmVjdGlvbikge1xuICAgICAgICAgICAgcmV0YWluZWQgPSB0aGlzLnJlbWVtYmVyQWZmaW5pdHlDb25uZWN0aW9uKHJlcXVlc3QudGhyZWFkSWQsIHsgc29ja2V0LCBldmVudHMgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgYXdhaXQgbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgIHNvY2tldC5zZW5kKEpTT04uc3RyaW5naWZ5KHsgdHlwZTogXCJyZXNwb25zZS5jcmVhdGVcIiwgLi4ucmVxdWVzdC5ib2R5IH0pLCAoZXJyb3IpID0+XG4gICAgICAgICAgICBlcnJvciA/IHJlamVjdChlcnJvcikgOiByZXNvbHZlKCksXG4gICAgICAgICAgKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgICBjb25zdCByZWNvcmQgPSBjYWNoZWRcbiAgICAgICAgICAgID8gYXdhaXQgbmV4dFBvb2xlZFJlY29yZChldmVudHMsIHNvY2tldCwgcmVxdWVzdC5zaWduYWwpXG4gICAgICAgICAgICA6IGF3YWl0IGV2ZW50cy5uZXh0KCk7XG4gICAgICAgICAgaWYgKHJlY29yZC5raW5kID09PSBcIm1lc3NhZ2VcIikge1xuICAgICAgICAgICAgaWYgKHJlY29yZC5pc0JpbmFyeSkge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgT3BlbkFJUHJvdG9jb2xFcnJvcihcIk9wZW5BSSBXZWJTb2NrZXQgc2VudCBhbiB1bmV4cGVjdGVkIGJpbmFyeSBtZXNzYWdlXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IHJhdzogdW5rbm93bjtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIHJhdyA9IEpTT04ucGFyc2UocmF3RGF0YVRleHQocmVjb3JkLmRhdGEpKTtcbiAgICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgT3BlbkFJUHJvdG9jb2xFcnJvcihcIk9wZW5BSSBXZWJTb2NrZXQgc2VudCBpbnZhbGlkIEpTT05cIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBldmVudCA9IG5vcm1hbGl6ZU9wZW5BSUV2ZW50KHJhdyk7XG4gICAgICAgICAgICBpZiAoIWV2ZW50KSBjb250aW51ZTtcbiAgICAgICAgICAgIGlmIChldmVudC50eXBlID09PSBcImNvbXBsZXRlZFwiKSB7XG4gICAgICAgICAgICAgIGNvbXBsZXRlZCA9IHRydWU7XG4gICAgICAgICAgICAgIGlmIChyZXRhaW5lZCkgZXZlbnRzLmRldGFjaEFib3J0KCk7XG4gICAgICAgICAgICAgIGVsc2Ugc29ja2V0LmNsb3NlKDEwMDAsIFwicmVzcG9uc2UgY29tcGxldGVkXCIpO1xuICAgICAgICAgICAgICB5aWVsZCBldmVudDtcbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgeWllbGQgZXZlbnQ7XG4gICAgICAgICAgICBpZiAoZXZlbnQudHlwZSA9PT0gXCJlcnJvclwiKSB0aHJvdyBldmVudC5lcnJvcjtcbiAgICAgICAgICB9IGVsc2UgaWYgKHJlY29yZC5raW5kID09PSBcImVycm9yXCIpIHtcbiAgICAgICAgICAgIHRocm93IHJlY29yZC5lcnJvcjtcbiAgICAgICAgICB9IGVsc2UgaWYgKHJlY29yZC5raW5kID09PSBcImNsb3NlXCIpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBPcGVuQUlQcm90b2NvbEVycm9yKFxuICAgICAgICAgICAgICBgT3BlbkFJIFdlYlNvY2tldCBjbG9zZWQgYmVmb3JlIGEgdGVybWluYWwgcmVzcG9uc2UgZXZlbnQgKCR7cmVjb3JkLmNvZGV9JHtyZWNvcmQucmVhc29uID8gYDogJHtyZWNvcmQucmVhc29ufWAgOiBcIlwifSlgLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IE9wZW5BSVByb3RvY29sRXJyb3IoXCJPcGVuQUkgV2ViU29ja2V0IGVtaXR0ZWQgYW4gdW5leHBlY3RlZCBoYW5kc2hha2UgZXZlbnRcIik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBpZiAoIWNvbXBsZXRlZCB8fCAhcmV0YWluZWQpIHtcbiAgICAgICAgICBpZiAocmV0YWluZWQpIHRoaXMuYWZmaW5pdHlDb25uZWN0aW9ucy5kZWxldGUocmVxdWVzdC50aHJlYWRJZCk7XG4gICAgICAgICAgZXZlbnRzLmNsZWFudXAoKTtcbiAgICAgICAgICBpZiAoIWNvbXBsZXRlZCkgc29ja2V0LnRlcm1pbmF0ZSgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyZXRhaW5Db25uZWN0aW9uKSB0aGlzLmJ1c3lBZmZpbml0aWVzLmRlbGV0ZShyZXF1ZXN0LnRocmVhZElkKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVzcG9uc2VFcnJvcihyZXNwb25zZTogUmVzcG9uc2UpOiBQcm9taXNlPE9wZW5BSVByb3RvY29sRXJyb3I+IHtcbiAgY29uc3QgdGV4dCA9IGF3YWl0IHJlc3BvbnNlLnRleHQoKS5jYXRjaCgoKSA9PiBcIlwiKTtcbiAgbGV0IG1lc3NhZ2UgPSB0ZXh0IHx8IHJlc3BvbnNlLnN0YXR1c1RleHQgfHwgYEhUVFAgJHtyZXNwb25zZS5zdGF0dXN9YDtcbiAgbGV0IGNvZGU6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgdHJ5IHtcbiAgICBjb25zdCBwYXJzZWQgPSBKU09OLnBhcnNlKHRleHQpIGFzIHtcbiAgICAgIGVycm9yPzogeyBtZXNzYWdlPzogc3RyaW5nOyBjb2RlPzogc3RyaW5nIH0gfCBzdHJpbmc7XG4gICAgICBtZXNzYWdlPzogc3RyaW5nO1xuICAgICAgY29kZT86IHN0cmluZztcbiAgICB9O1xuICAgIGNvbnN0IGVycm9yID0gcGFyc2VkLmVycm9yO1xuICAgIG1lc3NhZ2UgPVxuICAgICAgKHR5cGVvZiBlcnJvciA9PT0gXCJvYmplY3RcIiA/IGVycm9yLm1lc3NhZ2UgOiB1bmRlZmluZWQpID8/XG4gICAgICBwYXJzZWQubWVzc2FnZSA/P1xuICAgICAgKHR5cGVvZiBlcnJvciA9PT0gXCJzdHJpbmdcIiA/IGVycm9yIDogbWVzc2FnZSk7XG4gICAgY29kZSA9ICh0eXBlb2YgZXJyb3IgPT09IFwib2JqZWN0XCIgPyBlcnJvci5jb2RlIDogdW5kZWZpbmVkKSA/PyBwYXJzZWQuY29kZTtcbiAgfSBjYXRjaCB7XG4gICAgY29kZSA9IHVuZGVmaW5lZDtcbiAgfVxuICByZXR1cm4gbmV3IE9wZW5BSVByb3RvY29sRXJyb3IobWVzc2FnZSwgY29kZSwgcmVzcG9uc2Uuc3RhdHVzKTtcbn1cblxuZXhwb3J0IGNsYXNzIE9wZW5BSUh0dHBzVHJhbnNwb3J0IGltcGxlbWVudHMgT3BlbkFJUmVzcG9uc2VzVHJhbnNwb3J0IHtcbiAgcHJpdmF0ZSBjcmVkZW50aWFsczogT3BlbkFJRGlyZWN0Q3JlZGVudGlhbHM7XG4gIHByaXZhdGUgcmVhZG9ubHkgZmV0Y2hJbXBsOiB0eXBlb2YgZmV0Y2g7XG4gIHByaXZhdGUgcmVhZG9ubHkgcmVmcmVzaENyZWRlbnRpYWxzPzogKCkgPT4gUHJvbWlzZTxPcGVuQUlEaXJlY3RDcmVkZW50aWFscz47XG5cbiAgY29uc3RydWN0b3Iob3B0aW9uczogT3BlbkFJSHR0cHNUcmFuc3BvcnRPcHRpb25zKSB7XG4gICAgdGhpcy5jcmVkZW50aWFscyA9IG9wdGlvbnMuY3JlZGVudGlhbHM7XG4gICAgdGhpcy5mZXRjaEltcGwgPSBvcHRpb25zLmZldGNoID8/IGZldGNoO1xuICAgIHRoaXMucmVmcmVzaENyZWRlbnRpYWxzID0gb3B0aW9ucy5yZWZyZXNoQ3JlZGVudGlhbHM7XG4gIH1cblxuICBzdHJlYW0ocmVxdWVzdDogT3BlbkFJVHJhbnNwb3J0UmVxdWVzdCk6IE9wZW5BSUV2ZW50U3RyZWFtIHtcbiAgICByZXR1cm4gdGhpcy5ydW4ocmVxdWVzdCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jICpydW4ocmVxdWVzdDogT3BlbkFJVHJhbnNwb3J0UmVxdWVzdCk6IEFzeW5jR2VuZXJhdG9yPE9wZW5BSU5vcm1hbGl6ZWRFdmVudD4ge1xuICAgIGxldCByZWZyZXNoZWQgPSBmYWxzZTtcblxuICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuZmV0Y2hJbXBsKENIQVRHUFRfQ09ERVhfUkVTUE9OU0VTX1VSTCwge1xuICAgICAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgICAgICBoZWFkZXJzOiBidWlsZENvZGV4SWRlbnRpdHlIZWFkZXJzKFxuICAgICAgICAgIHRoaXMuY3JlZGVudGlhbHMuYWNjZXNzVG9rZW4sXG4gICAgICAgICAgdGhpcy5jcmVkZW50aWFscy5hY2NvdW50SWQsXG4gICAgICAgICAge1xuICAgICAgICAgICAgc2Vzc2lvbklkOiByZXF1ZXN0LnNlc3Npb25JZCxcbiAgICAgICAgICAgIHRocmVhZElkOiByZXF1ZXN0LnRocmVhZElkLFxuICAgICAgICAgICAgY2xpZW50UmVxdWVzdElkOiByZXF1ZXN0LmNsaWVudFJlcXVlc3RJZCxcbiAgICAgICAgICB9LFxuICAgICAgICApLFxuICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShyZXF1ZXN0LmJvZHkpLFxuICAgICAgICBzaWduYWw6IHJlcXVlc3Quc2lnbmFsLFxuICAgICAgfSk7XG5cbiAgICAgIGlmIChyZXNwb25zZS5zdGF0dXMgPT09IDQwMSAmJiAhcmVmcmVzaGVkICYmIHRoaXMucmVmcmVzaENyZWRlbnRpYWxzKSB7XG4gICAgICAgIGF3YWl0IHJlc3BvbnNlLmJvZHk/LmNhbmNlbCgpO1xuICAgICAgICB0aGlzLmNyZWRlbnRpYWxzID0gYXdhaXQgdGhpcy5yZWZyZXNoQ3JlZGVudGlhbHMoKTtcbiAgICAgICAgcmVmcmVzaGVkID0gdHJ1ZTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAoIXJlc3BvbnNlLm9rKSB0aHJvdyBhd2FpdCByZXNwb25zZUVycm9yKHJlc3BvbnNlKTtcbiAgICAgIGlmICghcmVzcG9uc2UuYm9keSkgdGhyb3cgbmV3IE9wZW5BSVByb3RvY29sRXJyb3IoXCJPcGVuQUkgcmVzcG9uc2UgaGFkIG5vIGJvZHlcIik7XG5cbiAgICAgIGZvciBhd2FpdCAoY29uc3QgZXZlbnQgb2Ygbm9ybWFsaXplT3BlbkFJU1NFKHJlc3BvbnNlLmJvZHkpKSB7XG4gICAgICAgIHlpZWxkIGV2ZW50O1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIE9wZW5BSURpcmVjdENsaWVudE9wdGlvbnMgZXh0ZW5kcyBPcGVuQUlIdHRwc1RyYW5zcG9ydE9wdGlvbnMge1xuICB0cmFuc3BvcnQ/OiBPcGVuQUlSZXNwb25zZXNUcmFuc3BvcnQ7XG4gIHRyYW5zcG9ydEtpbmQ/OiBcImh0dHBzXCIgfCBcIndlYnNvY2tldFwiO1xuICB3ZWJTb2NrZXRGYWN0b3J5PzogT3BlbkFJV2ViU29ja2V0RmFjdG9yeTtcbn1cblxuZXhwb3J0IGNsYXNzIE9wZW5BSURpcmVjdENsaWVudCB7XG4gIHByaXZhdGUgcmVhZG9ubHkgdHJhbnNwb3J0OiBPcGVuQUlSZXNwb25zZXNUcmFuc3BvcnQ7XG4gIHByaXZhdGUgaW1hZ2VDcmVkZW50aWFsczogT3BlbkFJRGlyZWN0Q3JlZGVudGlhbHM7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBvcHRpb25zOiBPcGVuQUlEaXJlY3RDbGllbnRPcHRpb25zKSB7XG4gICAgdGhpcy5pbWFnZUNyZWRlbnRpYWxzID0gb3B0aW9ucy5jcmVkZW50aWFscztcbiAgICB0aGlzLnRyYW5zcG9ydCA9XG4gICAgICBvcHRpb25zLnRyYW5zcG9ydCA/P1xuICAgICAgKG9wdGlvbnMudHJhbnNwb3J0S2luZCA9PT0gXCJ3ZWJzb2NrZXRcIlxuICAgICAgICA/IG5ldyBPcGVuQUlXZWJTb2NrZXRUcmFuc3BvcnQob3B0aW9ucylcbiAgICAgICAgOiBuZXcgT3BlbkFJSHR0cHNUcmFuc3BvcnQob3B0aW9ucykpO1xuICB9XG5cbiAgcmVzcG9uc2VzKG9wdGlvbnM6IE9wZW5BSVJlc3BvbnNlc09wdGlvbnMsIHNpZ25hbD86IEFib3J0U2lnbmFsKTogT3BlbkFJRXZlbnRTdHJlYW0ge1xuICAgIGlmIChcbiAgICAgIHR5cGVvZiBvcHRpb25zLmltYWdlR2VuZXJhdGlvbiA9PT0gXCJvYmplY3RcIiAmJlxuICAgICAgb3B0aW9ucy5pbWFnZUdlbmVyYXRpb24uYmFja2dyb3VuZCA9PT0gXCJ0cmFuc3BhcmVudFwiXG4gICAgKSB7XG4gICAgICByZXR1cm4gdGhpcy5zdGFuZGFsb25lSW1hZ2VzKG9wdGlvbnMsIHNpZ25hbCk7XG4gICAgfVxuICAgIGNvbnN0IGNsaWVudFJlcXVlc3RJZCA9IGNyeXB0by5yYW5kb21VVUlEKCk7XG4gICAgY29uc3QgYWZmaW5pdHlJZCA9IG9wdGlvbnMucHJvbXB0Q2FjaGVLZXlcbiAgICAgID8gY2FjaGVBZmZpbml0eVV1aWQob3B0aW9ucy5wcm9tcHRDYWNoZUtleSlcbiAgICAgIDogY2xpZW50UmVxdWVzdElkO1xuICAgIHJldHVybiB0aGlzLnRyYW5zcG9ydC5zdHJlYW0oe1xuICAgICAgYm9keTogYnVpbGRPcGVuQUlSZXNwb25zZXNSZXF1ZXN0KFxuICAgICAgICBvcHRpb25zLnByb21wdENhY2hlS2V5ID8geyAuLi5vcHRpb25zLCBwcm9tcHRDYWNoZUtleTogYWZmaW5pdHlJZCB9IDogb3B0aW9ucyxcbiAgICAgICksXG4gICAgICBzaWduYWwsXG4gICAgICBzZXNzaW9uSWQ6IGFmZmluaXR5SWQsXG4gICAgICAvLyBwcm9tcHRDYWNoZUtleSBpcyBhbHJlYWR5IGEgb25lLXdheSBTREsgYWZmaW5pdHkgdmFsdWUsIG5ldmVyIGEgcmF3IHNlc3Npb25LZXkuXG4gICAgICB0aHJlYWRJZDogYWZmaW5pdHlJZCxcbiAgICAgIGNsaWVudFJlcXVlc3RJZCxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgKnN0YW5kYWxvbmVJbWFnZXMoXG4gICAgb3B0aW9uczogT3BlbkFJUmVzcG9uc2VzT3B0aW9ucyxcbiAgICBzaWduYWw/OiBBYm9ydFNpZ25hbCxcbiAgKTogT3BlbkFJRXZlbnRTdHJlYW0ge1xuICAgIGNvbnN0IHJlcXVlc3QgPSBidWlsZFN0YW5kYWxvbmVJbWFnZVJlcXVlc3Qob3B0aW9ucyk7XG4gICAgY29uc3QgcmVxdWVzdElkID0gY3J5cHRvLnJhbmRvbVVVSUQoKTtcbiAgICBmb3IgKGxldCBhdHRlbXB0ID0gMDsgYXR0ZW1wdCA8IDI7IGF0dGVtcHQrKykge1xuICAgICAgc2lnbmFsPy50aHJvd0lmQWJvcnRlZCgpO1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCAodGhpcy5vcHRpb25zLmZldGNoID8/IGZldGNoKShyZXF1ZXN0LnVybCwge1xuICAgICAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgLi4uYnVpbGRDb2RleElkZW50aXR5SGVhZGVycyhcbiAgICAgICAgICAgIHRoaXMuaW1hZ2VDcmVkZW50aWFscy5hY2Nlc3NUb2tlbixcbiAgICAgICAgICAgIHRoaXMuaW1hZ2VDcmVkZW50aWFscy5hY2NvdW50SWQsXG4gICAgICAgICAgKSxcbiAgICAgICAgICBBY2NlcHQ6IFwiYXBwbGljYXRpb24vanNvblwiLFxuICAgICAgICAgIFwieC1jb2RleC1pbWFnZS10dXJuLWlkXCI6IHJlcXVlc3RJZCxcbiAgICAgICAgfSxcbiAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkocmVxdWVzdC5ib2R5KSxcbiAgICAgICAgc2lnbmFsLFxuICAgICAgfSk7XG4gICAgICBpZiAocmVzcG9uc2Uuc3RhdHVzID09PSA0MDEgJiYgYXR0ZW1wdCA9PT0gMCAmJiB0aGlzLm9wdGlvbnMucmVmcmVzaENyZWRlbnRpYWxzKSB7XG4gICAgICAgIGF3YWl0IHJlc3BvbnNlLmJvZHk/LmNhbmNlbCgpO1xuICAgICAgICB0aGlzLmltYWdlQ3JlZGVudGlhbHMgPSBhd2FpdCB0aGlzLm9wdGlvbnMucmVmcmVzaENyZWRlbnRpYWxzKCk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKCFyZXNwb25zZS5vaykgdGhyb3cgYXdhaXQgcmVzcG9uc2VFcnJvcihyZXNwb25zZSk7XG4gICAgICBjb25zdCBpbWFnZXMgPSBhd2FpdCByZWFkU3RhbmRhbG9uZUltYWdlUmVzcG9uc2UocmVzcG9uc2UpO1xuICAgICAgc2lnbmFsPy50aHJvd0lmQWJvcnRlZCgpO1xuICAgICAgeWllbGQqIGltYWdlcztcbiAgICAgIHlpZWxkIHsgdHlwZTogXCJjb21wbGV0ZWRcIiwgcmVzcG9uc2VJZDogcmVxdWVzdElkLCBtb2RlbDogXCJncHQtaW1hZ2UtMlwiIH07XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9XG5cbiAgY2xvc2UoKTogdm9pZCB7XG4gICAgdGhp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
|