@cartanova/qgrid-cli 1.5.6 → 1.6.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (59) hide show
  1. package/bundle/dist/application/qgrid/oauth.js +1 -1
  2. package/bundle/dist/application/qgrid/qgrid.dispatcher.js +167 -0
  3. package/bundle/dist/application/qgrid/qgrid.frame.js +45 -37
  4. package/bundle/dist/application/qgrid/qgrid.types.js +6 -16
  5. package/bundle/dist/application/queries.generated.js +2 -1
  6. package/bundle/dist/application/request-log/request-log.model.js +15 -2
  7. package/bundle/dist/application/request-log/request-log.types.js +6 -2
  8. package/bundle/dist/application/sonamu.generated.js +14 -6
  9. package/bundle/dist/application/sonamu.generated.sso.js +5 -2
  10. package/bundle/dist/i18n/sd.generated.js +7 -4
  11. package/bundle/dist/migrations/20260423180818_alter_request_logs_add1_alter1.js +17 -0
  12. package/bundle/dist/migrations/20260423182017_alter_request_logs_add2_drop1_alter1.js +19 -0
  13. package/bundle/dist/migrations/20260423183613_alter_request_logs_add1_alter1.js +16 -0
  14. package/bundle/dist/sonamu.config.js +6 -9
  15. package/bundle/src/application/qgrid/oauth.ts +1 -1
  16. package/bundle/src/application/qgrid/qgrid.dispatcher.ts +184 -0
  17. package/bundle/src/application/qgrid/qgrid.frame.ts +38 -51
  18. package/bundle/src/application/qgrid/qgrid.types.ts +3 -14
  19. package/bundle/src/application/queries.generated.ts +3 -0
  20. package/bundle/src/application/request-log/request-log.entity.json +33 -17
  21. package/bundle/src/application/request-log/request-log.model.ts +26 -2
  22. package/bundle/src/application/request-log/request-log.types.ts +6 -2
  23. package/bundle/src/application/sonamu.generated.http +17 -2
  24. package/bundle/src/application/sonamu.generated.sso.ts +9 -6
  25. package/bundle/src/application/sonamu.generated.ts +25 -5
  26. package/bundle/src/i18n/sd.generated.ts +6 -3
  27. package/bundle/src/migrations/20260423180818_alter_request_logs_add1_alter1.ts +18 -0
  28. package/bundle/src/migrations/20260423182017_alter_request_logs_add2_drop1_alter1.ts +20 -0
  29. package/bundle/src/migrations/20260423183613_alter_request_logs_add1_alter1.ts +15 -0
  30. package/bundle/src/sonamu.config.ts +4 -7
  31. package/bundle/web-dist/client/assets/index-BfL_bTVI.css +1 -0
  32. package/bundle/web-dist/client/assets/index-CMOHJBal.js +78 -0
  33. package/bundle/web-dist/client/assets/logs-B2pDXaji.js +1 -0
  34. package/bundle/web-dist/client/assets/{routes-CqzIoGYg.js → routes-fpJMuLAs.js} +1 -1
  35. package/bundle/web-dist/client/assets/{sd.generated-Duipc8HN.js → sd.generated-CIOZewtL.js} +1 -1
  36. package/bundle/web-dist/client/assets/services.generated-B2N0iPav.js +1 -0
  37. package/bundle/web-dist/client/assets/{show-BuMxiSr1.js → show-DFVBcmXm.js} +2 -2
  38. package/bundle/web-dist/client/assets/tokens--LyDCm10.js +1 -0
  39. package/bundle/web-dist/client/index.html +3 -3
  40. package/bundle/web-dist/server/assets/{copy-BPyN_0Dp.js → copy-CKCGxwII.js} +1 -1
  41. package/bundle/web-dist/server/assets/{lazyRouteComponent-Bmjwy0OA.js → lazyRouteComponent-BlvOfJIF.js} +2 -2
  42. package/bundle/web-dist/server/assets/{logs-BgcF7jVg.js → logs-BYIBD0yv.js} +172 -80
  43. package/bundle/web-dist/server/assets/{routes-DVA-nsZ-.js → routes-p2n4SfAB.js} +2 -2
  44. package/bundle/web-dist/server/assets/{sd.generated-CDVQy4CJ.js → sd.generated-CIg_jf8e.js} +6 -3
  45. package/bundle/web-dist/server/assets/{services.generated-DWyvb1vb.js → services.generated-DIeiDdqy.js} +21 -4
  46. package/bundle/web-dist/server/assets/{shim-CqVZY710.js → shim-Dq_Izqnc.js} +1 -1
  47. package/bundle/web-dist/server/assets/{show-BnKnfNFP.js → show-DZ_U1u-N.js} +30 -9
  48. package/bundle/web-dist/server/assets/{tokens-7z55hPRV.js → tokens-DOybPnNU.js} +19 -21
  49. package/bundle/web-dist/server/entry-server.generated.js +12 -8
  50. package/package.json +1 -1
  51. package/bundle/dist/application/qgrid/pool.js +0 -128
  52. package/bundle/dist/application/qgrid/worker.js +0 -189
  53. package/bundle/src/application/qgrid/pool.ts +0 -165
  54. package/bundle/src/application/qgrid/worker.ts +0 -240
  55. package/bundle/web-dist/client/assets/index-BRZCFaFz.css +0 -1
  56. package/bundle/web-dist/client/assets/index-BnqlZB1V.js +0 -78
  57. package/bundle/web-dist/client/assets/logs-KoJtGoEG.js +0 -1
  58. package/bundle/web-dist/client/assets/services.generated-Ccs6tru4.js +0 -1
  59. package/bundle/web-dist/client/assets/tokens--z-eVto5.js +0 -1
@@ -137,4 +137,4 @@ async function fetchUsage(accessToken) {
137
137
  //#endregion
138
138
  export { buildAuthUrl, exchangeCodeForTokens, fetchUsage, generatePKCE, refreshAccessToken };
139
139
 
140
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib2F1dGguanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2FwcGxpY2F0aW9uL3FncmlkL29hdXRoLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogT0F1dGgg7Jyg7Yu4IOKAlCBDbGF1ZGUgQ29kZSDshozsiqTsnZggT0F1dGgg7ZSM66Gc7JqwIOq3uOuMgOuhnCDsnqztmIRcbiAqL1xuaW1wb3J0IHsgY3JlYXRlSGFzaCwgcmFuZG9tQnl0ZXMgfSBmcm9tIFwibm9kZTpjcnlwdG9cIjtcblxuaW1wb3J0IHR5cGUgeyBVc2FnZVJlc3BvbnNlIH0gZnJvbSBcIi4vcWdyaWQudHlwZXNcIjtcblxuY29uc3QgQ0xJRU5UX0lEID0gXCI5ZDFjMjUwYS1lNjFiLTQ0ZDktODhlZC01OTQ0ZDE5NjJmNWVcIjtcbmNvbnN0IEFVVEhPUklaRV9VUkwgPSBcImh0dHBzOi8vY2xhdWRlLmNvbS9jYWkvb2F1dGgvYXV0aG9yaXplXCI7XG5jb25zdCBUT0tFTl9VUkwgPSBcImh0dHBzOi8vcGxhdGZvcm0uY2xhdWRlLmNvbS92MS9vYXV0aC90b2tlblwiO1xuXG4vLyBsb2dpbiDsi5wg7IKs7JqpIChhdXRob3JpemUgVVJMKVxuY29uc3QgQUxMX1NDT1BFUyA9IFtcbiAgXCJvcmc6Y3JlYXRlX2FwaV9rZXlcIixcbiAgXCJ1c2VyOnByb2ZpbGVcIixcbiAgXCJ1c2VyOmluZmVyZW5jZVwiLFxuICBcInVzZXI6c2Vzc2lvbnM6Y2xhdWRlX2NvZGVcIixcbiAgXCJ1c2VyOm1jcF9zZXJ2ZXJzXCIsXG4gIFwidXNlcjpmaWxlX3VwbG9hZFwiLFxuXTtcblxuLy8gcmVmcmVzaCDsi5wg7IKs7JqpIChvcmc6Y3JlYXRlX2FwaV9rZXkg7KCc7Jm4KVxuY29uc3QgUkVGUkVTSF9TQ09QRVMgPSBbXG4gIFwidXNlcjpwcm9maWxlXCIsXG4gIFwidXNlcjppbmZlcmVuY2VcIixcbiAgXCJ1c2VyOnNlc3Npb25zOmNsYXVkZV9jb2RlXCIsXG4gIFwidXNlcjptY3Bfc2VydmVyc1wiLFxuICBcInVzZXI6ZmlsZV91cGxvYWRcIixcbl07XG5cbmZ1bmN0aW9uIGJhc2U2NFVSTEVuY29kZShidWZmZXI6IEJ1ZmZlcik6IHN0cmluZyB7XG4gIHJldHVybiBidWZmZXIudG9TdHJpbmcoXCJiYXNlNjRcIikucmVwbGFjZSgvXFwrL2csIFwiLVwiKS5yZXBsYWNlKC9cXC8vZywgXCJfXCIpLnJlcGxhY2UoLz0vZywgXCJcIik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZW5lcmF0ZVBLQ0UoKTogeyBjb2RlVmVyaWZpZXI6IHN0cmluZzsgY29kZUNoYWxsZW5nZTogc3RyaW5nOyBzdGF0ZTogc3RyaW5nIH0ge1xuICBjb25zdCBjb2RlVmVyaWZpZXIgPSBiYXNlNjRVUkxFbmNvZGUocmFuZG9tQnl0ZXMoMzIpKTtcbiAgY29uc3QgY29kZUNoYWxsZW5nZSA9IGJhc2U2NFVSTEVuY29kZShjcmVhdGVIYXNoKFwic2hhMjU2XCIpLnVwZGF0ZShjb2RlVmVyaWZpZXIpLmRpZ2VzdCgpKTtcbiAgY29uc3Qgc3RhdGUgPSBiYXNlNjRVUkxFbmNvZGUocmFuZG9tQnl0ZXMoMzIpKTtcbiAgcmV0dXJuIHsgY29kZVZlcmlmaWVyLCBjb2RlQ2hhbGxlbmdlLCBzdGF0ZSB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRBdXRoVXJsKGNvZGVDaGFsbGVuZ2U6IHN0cmluZywgc3RhdGU6IHN0cmluZywgcmVkaXJlY3RVcmk6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHVybCA9IG5ldyBVUkwoQVVUSE9SSVpFX1VSTCk7XG4gIHVybC5zZWFyY2hQYXJhbXMuYXBwZW5kKFwiY29kZVwiLCBcInRydWVcIik7XG4gIHVybC5zZWFyY2hQYXJhbXMuYXBwZW5kKFwiY2xpZW50X2lkXCIsIENMSUVOVF9JRCk7XG4gIHVybC5zZWFyY2hQYXJhbXMuYXBwZW5kKFwicmVzcG9uc2VfdHlwZVwiLCBcImNvZGVcIik7XG4gIHVybC5zZWFyY2hQYXJhbXMuYXBwZW5kKFwicmVkaXJlY3RfdXJpXCIsIHJlZGlyZWN0VXJpKTtcbiAgdXJsLnNlYXJjaFBhcmFtcy5hcHBlbmQoXCJzY29wZVwiLCBBTExfU0NPUEVTLmpvaW4oXCIgXCIpKTtcbiAgdXJsLnNlYXJjaFBhcmFtcy5hcHBlbmQoXCJjb2RlX2NoYWxsZW5nZVwiLCBjb2RlQ2hhbGxlbmdlKTtcbiAgdXJsLnNlYXJjaFBhcmFtcy5hcHBlbmQoXCJjb2RlX2NoYWxsZW5nZV9tZXRob2RcIiwgXCJTMjU2XCIpO1xuICB1cmwuc2VhcmNoUGFyYW1zLmFwcGVuZChcInN0YXRlXCIsIHN0YXRlKTtcbiAgcmV0dXJuIHVybC50b1N0cmluZygpO1xufVxuXG5leHBvcnQgdHlwZSBPQXV0aFRva2VucyA9IHtcbiAgYWNjZXNzVG9rZW46IHN0cmluZztcbiAgcmVmcmVzaFRva2VuOiBzdHJpbmc7XG4gIGV4cGlyZXNBdDogbnVtYmVyO1xuICBzY29wZTogc3RyaW5nO1xuICBhY2NvdW50VXVpZD86IHN0cmluZztcbiAgZW1haWxBZGRyZXNzPzogc3RyaW5nO1xufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGV4Y2hhbmdlQ29kZUZvclRva2VucyhcbiAgY29kZTogc3RyaW5nLFxuICBjb2RlVmVyaWZpZXI6IHN0cmluZyxcbiAgc3RhdGU6IHN0cmluZyxcbiAgcmVkaXJlY3RVcmk6IHN0cmluZyxcbik6IFByb21pc2U8T0F1dGhUb2tlbnM+IHtcbiAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goVE9LRU5fVVJMLCB7XG4gICAgbWV0aG9kOiBcIlBPU1RcIixcbiAgICBoZWFkZXJzOiB7IFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiIH0sXG4gICAgYm9keTogSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgZ3JhbnRfdHlwZTogXCJhdXRob3JpemF0aW9uX2NvZGVcIixcbiAgICAgIGNvZGUsXG4gICAgICByZWRpcmVjdF91cmk6IHJlZGlyZWN0VXJpLFxuICAgICAgY2xpZW50X2lkOiBDTElFTlRfSUQsXG4gICAgICBjb2RlX3ZlcmlmaWVyOiBjb2RlVmVyaWZpZXIsXG4gICAgICBzdGF0ZSxcbiAgICB9KSxcbiAgfSk7XG4gIGlmICghcmVzLm9rKSB7XG4gICAgY29uc3QgdGV4dCA9IGF3YWl0IHJlcy50ZXh0KCk7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBUb2tlbiBleGNoYW5nZSBmYWlsZWQgKCR7cmVzLnN0YXR1c30pOiAke3RleHR9YCk7XG4gIH1cblxuICBjb25zdCBkYXRhID0gKGF3YWl0IHJlcy5qc29uKCkpIGFzIHtcbiAgICBhY2Nlc3NfdG9rZW46IHN0cmluZztcbiAgICByZWZyZXNoX3Rva2VuOiBzdHJpbmc7XG4gICAgZXhwaXJlc19pbjogbnVtYmVyO1xuICAgIHNjb3BlOiBzdHJpbmc7XG4gICAgYWNjb3VudD86IHsgdXVpZDogc3RyaW5nOyBlbWFpbF9hZGRyZXNzOiBzdHJpbmcgfTtcbiAgfTtcblxuICByZXR1cm4ge1xuICAgIGFjY2Vzc1Rva2VuOiBkYXRhLmFjY2Vzc190b2tlbixcbiAgICByZWZyZXNoVG9rZW46IGRhdGEucmVmcmVzaF90b2tlbixcbiAgICBleHBpcmVzQXQ6IERhdGUubm93KCkgKyBkYXRhLmV4cGlyZXNfaW4gKiAxMDAwLFxuICAgIHNjb3BlOiBkYXRhLnNjb3BlLFxuICAgIGFjY291bnRVdWlkOiBkYXRhLmFjY291bnQ/LnV1aWQsXG4gICAgZW1haWxBZGRyZXNzOiBkYXRhLmFjY291bnQ/LmVtYWlsX2FkZHJlc3MsXG4gIH07XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZWZyZXNoQWNjZXNzVG9rZW4ocmVmcmVzaFRva2VuOiBzdHJpbmcpOiBQcm9taXNlPE9BdXRoVG9rZW5zPiB7XG4gIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKFRPS0VOX1VSTCwge1xuICAgIG1ldGhvZDogXCJQT1NUXCIsXG4gICAgaGVhZGVyczogeyBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIiB9LFxuICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgIGdyYW50X3R5cGU6IFwicmVmcmVzaF90b2tlblwiLFxuICAgICAgcmVmcmVzaF90b2tlbjogcmVmcmVzaFRva2VuLFxuICAgICAgY2xpZW50X2lkOiBDTElFTlRfSUQsXG4gICAgICBzY29wZTogUkVGUkVTSF9TQ09QRVMuam9pbihcIiBcIiksXG4gICAgfSksXG4gIH0pO1xuICBpZiAoIXJlcy5vaykge1xuICAgIGNvbnN0IHRleHQgPSBhd2FpdCByZXMudGV4dCgpO1xuICAgIHRocm93IG5ldyBFcnJvcihgVG9rZW4gcmVmcmVzaCBmYWlsZWQgKCR7cmVzLnN0YXR1c30pOiAke3RleHR9YCk7XG4gIH1cbiAgY29uc3QgZGF0YSA9IChhd2FpdCByZXMuanNvbigpKSBhcyB7XG4gICAgYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG4gICAgcmVmcmVzaF90b2tlbjogc3RyaW5nO1xuICAgIGV4cGlyZXNfaW46IG51bWJlcjtcbiAgICBzY29wZTogc3RyaW5nO1xuICB9O1xuXG4gIHJldHVybiB7XG4gICAgYWNjZXNzVG9rZW46IGRhdGEuYWNjZXNzX3Rva2VuLFxuICAgIHJlZnJlc2hUb2tlbjogZGF0YS5yZWZyZXNoX3Rva2VuID8/IHJlZnJlc2hUb2tlbixcbiAgICBleHBpcmVzQXQ6IERhdGUubm93KCkgKyBkYXRhLmV4cGlyZXNfaW4gKiAxMDAwLFxuICAgIHNjb3BlOiBkYXRhLnNjb3BlLFxuICB9O1xufVxuXG5jb25zdCB1c2FnZUNhY2hlOiBSZWNvcmQ8c3RyaW5nLCB7IGRhdGE6IFVzYWdlUmVzcG9uc2U7IGNhY2hlZEF0OiBudW1iZXIgfT4gPSB7fTtcbmNvbnN0IFVTQUdFX0FQSV9DQUNIRV9UVEwgPSA2MF8wMDA7IC8vIDHrtoRcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZldGNoVXNhZ2UoYWNjZXNzVG9rZW46IHN0cmluZyk6IFByb21pc2U8VXNhZ2VSZXNwb25zZT4ge1xuICBjb25zdCBjYWNoZUtleSA9IGFjY2Vzc1Rva2VuLnNsaWNlKC0xMCk7XG4gIGNvbnN0IGNhY2hlZCA9IHVzYWdlQ2FjaGVbY2FjaGVLZXldO1xuICBpZiAoY2FjaGVkICYmIERhdGUubm93KCkgLSBjYWNoZWQuY2FjaGVkQXQgPCBVU0FHRV9BUElfQ0FDSEVfVFRMKSB7XG4gICAgY29uc29sZS5sb2coYFt1c2FnZV0gY2FjaGUgaGl0OiAke2NhY2hlS2V5fWApO1xuICAgIHJldHVybiBjYWNoZWQuZGF0YTtcbiAgfVxuXG4gIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKFwiaHR0cHM6Ly9hcGkuYW50aHJvcGljLmNvbS9hcGkvb2F1dGgvdXNhZ2VcIiwge1xuICAgIGhlYWRlcnM6IHtcbiAgICAgIEF1dGhvcml6YXRpb246IGBCZWFyZXIgJHthY2Nlc3NUb2tlbn1gLFxuICAgICAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIsXG4gICAgICBcImFudGhyb3BpYy1iZXRhXCI6IFwib2F1dGgtMjAyNS0wNC0yMFwiLFxuICAgIH0sXG4gICAgc2lnbmFsOiBBYm9ydFNpZ25hbC50aW1lb3V0KDUwMDApLFxuICB9KTtcbiAgaWYgKCFyZXMub2spIHtcbiAgICBjb25zdCB0ZXh0ID0gYXdhaXQgcmVzLnRleHQoKTtcblxuICAgIC8vIO2MjOyLsSDsi5zrj4TtlbTshJwg7JeQ65+sIOuplOyLnOyngCDstpTstpxcbiAgICBsZXQgZXJyb3JNZXNzYWdlID0gYEVycm9yICR7cmVzLnN0YXR1c31gO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBwYXJzZWQgPSBKU09OLnBhcnNlKHRleHQpO1xuICAgICAgZXJyb3JNZXNzYWdlID0gcGFyc2VkLmVycm9yPy5tZXNzYWdlID8/IGVycm9yTWVzc2FnZTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIO2MjOyLsSDslYgg65CY66m0IOq4sOuzuCDrqZTsi5zsp4BcbiAgICB9XG5cbiAgICBjb25zb2xlLndhcm4oYFt1c2FnZV0gJHtyZXMuc3RhdHVzfTogJHtlcnJvck1lc3NhZ2V9YCk7XG5cbiAgICAvLyDsnbTsoIQg7ISx6rO1IOy6kOyLnCDsnojsnLzrqbQg7Jyg7KeAXG4gICAgaWYgKGNhY2hlZD8uZGF0YSAmJiAhY2FjaGVkLmRhdGEuZXJyb3IpIHJldHVybiBjYWNoZWQuZGF0YTtcblxuICAgIC8vIOyLpO2MqOuPhCDsupDsi5wgKOuwmOuztSDtmLjstpwg67Cp7KeAKVxuICAgIGNvbnN0IGVycm9yUmVzdWx0ID0geyBlcnJvcjogZXJyb3JNZXNzYWdlIH07XG4gICAgdXNhZ2VDYWNoZVtjYWNoZUtleV0gPSB7IGRhdGE6IGVycm9yUmVzdWx0LCBjYWNoZWRBdDogRGF0ZS5ub3coKSB9O1xuICAgIHJldHVybiBlcnJvclJlc3VsdDtcbiAgfVxuXG4gIGNvbnN0IGRhdGEgPSAoYXdhaXQgcmVzLmpzb24oKSkgYXMgVXNhZ2VSZXNwb25zZTtcbiAgLy8gY2FjaGUgaW52YWxpZGF0ZVxuICB1c2FnZUNhY2hlW2NhY2hlS2V5XSA9IHsgZGF0YSwgY2FjaGVkQXQ6IERhdGUubm93KCkgfTtcbiAgcmV0dXJuIGRhdGE7XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7OztBQU9BLE1BQU0sWUFBWTtBQUNsQixNQUFNLGdCQUFnQjtBQUN0QixNQUFNLFlBQVk7QUFHbEIsTUFBTSxhQUFhO0NBQ2pCO0NBQ0E7Q0FDQTtDQUNBO0NBQ0E7Q0FDQTtDQUNEO0FBR0QsTUFBTSxpQkFBaUI7Q0FDckI7Q0FDQTtDQUNBO0NBQ0E7Q0FDQTtDQUNEO0FBRUQsU0FBUyxnQkFBZ0IsUUFBd0I7QUFDL0MsUUFBTyxPQUFPLFNBQVMsU0FBUyxDQUFDLFFBQVEsT0FBTyxJQUFJLENBQUMsUUFBUSxPQUFPLElBQUksQ0FBQyxRQUFRLE1BQU0sR0FBRzs7QUFHNUYsU0FBZ0IsZUFBK0U7Q0FDN0YsTUFBTSxlQUFlLGdCQUFnQixZQUFZLEdBQUcsQ0FBQztBQUdyRCxRQUFPO0VBQUU7RUFBYyxlQUZELGdCQUFnQixXQUFXLFNBQVMsQ0FBQyxPQUFPLGFBQWEsQ0FBQyxRQUFRLENBQUM7RUFFbkQsT0FEeEIsZ0JBQWdCLFlBQVksR0FBRyxDQUFDO0VBQ0Q7O0FBRy9DLFNBQWdCLGFBQWEsZUFB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
140
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib2F1dGguanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2FwcGxpY2F0aW9uL3FncmlkL29hdXRoLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogT0F1dGgg7Jyg7Yu4IOKAlCBDbGF1ZGUgQ29kZSDshozsiqTsnZggT0F1dGgg7ZSM66Gc7JqwIOq3uOuMgOuhnCDsnqztmIRcbiAqL1xuaW1wb3J0IHsgY3JlYXRlSGFzaCwgcmFuZG9tQnl0ZXMgfSBmcm9tIFwibm9kZTpjcnlwdG9cIjtcblxuaW1wb3J0IHsgdHlwZSBVc2FnZVJlc3BvbnNlIH0gZnJvbSBcIi4vcWdyaWQudHlwZXNcIjtcblxuY29uc3QgQ0xJRU5UX0lEID0gXCI5ZDFjMjUwYS1lNjFiLTQ0ZDktODhlZC01OTQ0ZDE5NjJmNWVcIjtcbmNvbnN0IEFVVEhPUklaRV9VUkwgPSBcImh0dHBzOi8vY2xhdWRlLmNvbS9jYWkvb2F1dGgvYXV0aG9yaXplXCI7XG5jb25zdCBUT0tFTl9VUkwgPSBcImh0dHBzOi8vcGxhdGZvcm0uY2xhdWRlLmNvbS92MS9vYXV0aC90b2tlblwiO1xuXG4vLyBsb2dpbiDsi5wg7IKs7JqpIChhdXRob3JpemUgVVJMKVxuY29uc3QgQUxMX1NDT1BFUyA9IFtcbiAgXCJvcmc6Y3JlYXRlX2FwaV9rZXlcIixcbiAgXCJ1c2VyOnByb2ZpbGVcIixcbiAgXCJ1c2VyOmluZmVyZW5jZVwiLFxuICBcInVzZXI6c2Vzc2lvbnM6Y2xhdWRlX2NvZGVcIixcbiAgXCJ1c2VyOm1jcF9zZXJ2ZXJzXCIsXG4gIFwidXNlcjpmaWxlX3VwbG9hZFwiLFxuXTtcblxuLy8gcmVmcmVzaCDsi5wg7IKs7JqpIChvcmc6Y3JlYXRlX2FwaV9rZXkg7KCc7Jm4KVxuY29uc3QgUkVGUkVTSF9TQ09QRVMgPSBbXG4gIFwidXNlcjpwcm9maWxlXCIsXG4gIFwidXNlcjppbmZlcmVuY2VcIixcbiAgXCJ1c2VyOnNlc3Npb25zOmNsYXVkZV9jb2RlXCIsXG4gIFwidXNlcjptY3Bfc2VydmVyc1wiLFxuICBcInVzZXI6ZmlsZV91cGxvYWRcIixcbl07XG5cbmZ1bmN0aW9uIGJhc2U2NFVSTEVuY29kZShidWZmZXI6IEJ1ZmZlcik6IHN0cmluZyB7XG4gIHJldHVybiBidWZmZXIudG9TdHJpbmcoXCJiYXNlNjRcIikucmVwbGFjZSgvXFwrL2csIFwiLVwiKS5yZXBsYWNlKC9cXC8vZywgXCJfXCIpLnJlcGxhY2UoLz0vZywgXCJcIik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZW5lcmF0ZVBLQ0UoKTogeyBjb2RlVmVyaWZpZXI6IHN0cmluZzsgY29kZUNoYWxsZW5nZTogc3RyaW5nOyBzdGF0ZTogc3RyaW5nIH0ge1xuICBjb25zdCBjb2RlVmVyaWZpZXIgPSBiYXNlNjRVUkxFbmNvZGUocmFuZG9tQnl0ZXMoMzIpKTtcbiAgY29uc3QgY29kZUNoYWxsZW5nZSA9IGJhc2U2NFVSTEVuY29kZShjcmVhdGVIYXNoKFwic2hhMjU2XCIpLnVwZGF0ZShjb2RlVmVyaWZpZXIpLmRpZ2VzdCgpKTtcbiAgY29uc3Qgc3RhdGUgPSBiYXNlNjRVUkxFbmNvZGUocmFuZG9tQnl0ZXMoMzIpKTtcbiAgcmV0dXJuIHsgY29kZVZlcmlmaWVyLCBjb2RlQ2hhbGxlbmdlLCBzdGF0ZSB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRBdXRoVXJsKGNvZGVDaGFsbGVuZ2U6IHN0cmluZywgc3RhdGU6IHN0cmluZywgcmVkaXJlY3RVcmk6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHVybCA9IG5ldyBVUkwoQVVUSE9SSVpFX1VSTCk7XG4gIHVybC5zZWFyY2hQYXJhbXMuYXBwZW5kKFwiY29kZVwiLCBcInRydWVcIik7XG4gIHVybC5zZWFyY2hQYXJhbXMuYXBwZW5kKFwiY2xpZW50X2lkXCIsIENMSUVOVF9JRCk7XG4gIHVybC5zZWFyY2hQYXJhbXMuYXBwZW5kKFwicmVzcG9uc2VfdHlwZVwiLCBcImNvZGVcIik7XG4gIHVybC5zZWFyY2hQYXJhbXMuYXBwZW5kKFwicmVkaXJlY3RfdXJpXCIsIHJlZGlyZWN0VXJpKTtcbiAgdXJsLnNlYXJjaFBhcmFtcy5hcHBlbmQoXCJzY29wZVwiLCBBTExfU0NPUEVTLmpvaW4oXCIgXCIpKTtcbiAgdXJsLnNlYXJjaFBhcmFtcy5hcHBlbmQoXCJjb2RlX2NoYWxsZW5nZVwiLCBjb2RlQ2hhbGxlbmdlKTtcbiAgdXJsLnNlYXJjaFBhcmFtcy5hcHBlbmQoXCJjb2RlX2NoYWxsZW5nZV9tZXRob2RcIiwgXCJTMjU2XCIpO1xuICB1cmwuc2VhcmNoUGFyYW1zLmFwcGVuZChcInN0YXRlXCIsIHN0YXRlKTtcbiAgcmV0dXJuIHVybC50b1N0cmluZygpO1xufVxuXG5leHBvcnQgdHlwZSBPQXV0aFRva2VucyA9IHtcbiAgYWNjZXNzVG9rZW46IHN0cmluZztcbiAgcmVmcmVzaFRva2VuOiBzdHJpbmc7XG4gIGV4cGlyZXNBdDogbnVtYmVyO1xuICBzY29wZTogc3RyaW5nO1xuICBhY2NvdW50VXVpZD86IHN0cmluZztcbiAgZW1haWxBZGRyZXNzPzogc3RyaW5nO1xufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGV4Y2hhbmdlQ29kZUZvclRva2VucyhcbiAgY29kZTogc3RyaW5nLFxuICBjb2RlVmVyaWZpZXI6IHN0cmluZyxcbiAgc3RhdGU6IHN0cmluZyxcbiAgcmVkaXJlY3RVcmk6IHN0cmluZyxcbik6IFByb21pc2U8T0F1dGhUb2tlbnM+IHtcbiAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goVE9LRU5fVVJMLCB7XG4gICAgbWV0aG9kOiBcIlBPU1RcIixcbiAgICBoZWFkZXJzOiB7IFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiIH0sXG4gICAgYm9keTogSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgZ3JhbnRfdHlwZTogXCJhdXRob3JpemF0aW9uX2NvZGVcIixcbiAgICAgIGNvZGUsXG4gICAgICByZWRpcmVjdF91cmk6IHJlZGlyZWN0VXJpLFxuICAgICAgY2xpZW50X2lkOiBDTElFTlRfSUQsXG4gICAgICBjb2RlX3ZlcmlmaWVyOiBjb2RlVmVyaWZpZXIsXG4gICAgICBzdGF0ZSxcbiAgICB9KSxcbiAgfSk7XG4gIGlmICghcmVzLm9rKSB7XG4gICAgY29uc3QgdGV4dCA9IGF3YWl0IHJlcy50ZXh0KCk7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBUb2tlbiBleGNoYW5nZSBmYWlsZWQgKCR7cmVzLnN0YXR1c30pOiAke3RleHR9YCk7XG4gIH1cblxuICBjb25zdCBkYXRhID0gKGF3YWl0IHJlcy5qc29uKCkpIGFzIHtcbiAgICBhY2Nlc3NfdG9rZW46IHN0cmluZztcbiAgICByZWZyZXNoX3Rva2VuOiBzdHJpbmc7XG4gICAgZXhwaXJlc19pbjogbnVtYmVyO1xuICAgIHNjb3BlOiBzdHJpbmc7XG4gICAgYWNjb3VudD86IHsgdXVpZDogc3RyaW5nOyBlbWFpbF9hZGRyZXNzOiBzdHJpbmcgfTtcbiAgfTtcblxuICByZXR1cm4ge1xuICAgIGFjY2Vzc1Rva2VuOiBkYXRhLmFjY2Vzc190b2tlbixcbiAgICByZWZyZXNoVG9rZW46IGRhdGEucmVmcmVzaF90b2tlbixcbiAgICBleHBpcmVzQXQ6IERhdGUubm93KCkgKyBkYXRhLmV4cGlyZXNfaW4gKiAxMDAwLFxuICAgIHNjb3BlOiBkYXRhLnNjb3BlLFxuICAgIGFjY291bnRVdWlkOiBkYXRhLmFjY291bnQ/LnV1aWQsXG4gICAgZW1haWxBZGRyZXNzOiBkYXRhLmFjY291bnQ/LmVtYWlsX2FkZHJlc3MsXG4gIH07XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZWZyZXNoQWNjZXNzVG9rZW4ocmVmcmVzaFRva2VuOiBzdHJpbmcpOiBQcm9taXNlPE9BdXRoVG9rZW5zPiB7XG4gIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKFRPS0VOX1VSTCwge1xuICAgIG1ldGhvZDogXCJQT1NUXCIsXG4gICAgaGVhZGVyczogeyBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIiB9LFxuICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgIGdyYW50X3R5cGU6IFwicmVmcmVzaF90b2tlblwiLFxuICAgICAgcmVmcmVzaF90b2tlbjogcmVmcmVzaFRva2VuLFxuICAgICAgY2xpZW50X2lkOiBDTElFTlRfSUQsXG4gICAgICBzY29wZTogUkVGUkVTSF9TQ09QRVMuam9pbihcIiBcIiksXG4gICAgfSksXG4gIH0pO1xuICBpZiAoIXJlcy5vaykge1xuICAgIGNvbnN0IHRleHQgPSBhd2FpdCByZXMudGV4dCgpO1xuICAgIHRocm93IG5ldyBFcnJvcihgVG9rZW4gcmVmcmVzaCBmYWlsZWQgKCR7cmVzLnN0YXR1c30pOiAke3RleHR9YCk7XG4gIH1cbiAgY29uc3QgZGF0YSA9IChhd2FpdCByZXMuanNvbigpKSBhcyB7XG4gICAgYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG4gICAgcmVmcmVzaF90b2tlbjogc3RyaW5nO1xuICAgIGV4cGlyZXNfaW46IG51bWJlcjtcbiAgICBzY29wZTogc3RyaW5nO1xuICB9O1xuXG4gIHJldHVybiB7XG4gICAgYWNjZXNzVG9rZW46IGRhdGEuYWNjZXNzX3Rva2VuLFxuICAgIHJlZnJlc2hUb2tlbjogZGF0YS5yZWZyZXNoX3Rva2VuID8/IHJlZnJlc2hUb2tlbixcbiAgICBleHBpcmVzQXQ6IERhdGUubm93KCkgKyBkYXRhLmV4cGlyZXNfaW4gKiAxMDAwLFxuICAgIHNjb3BlOiBkYXRhLnNjb3BlLFxuICB9O1xufVxuXG5jb25zdCB1c2FnZUNhY2hlOiBSZWNvcmQ8c3RyaW5nLCB7IGRhdGE6IFVzYWdlUmVzcG9uc2U7IGNhY2hlZEF0OiBudW1iZXIgfT4gPSB7fTtcbmNvbnN0IFVTQUdFX0FQSV9DQUNIRV9UVEwgPSA2MF8wMDA7IC8vIDHrtoRcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZldGNoVXNhZ2UoYWNjZXNzVG9rZW46IHN0cmluZyk6IFByb21pc2U8VXNhZ2VSZXNwb25zZT4ge1xuICBjb25zdCBjYWNoZUtleSA9IGFjY2Vzc1Rva2VuLnNsaWNlKC0xMCk7XG4gIGNvbnN0IGNhY2hlZCA9IHVzYWdlQ2FjaGVbY2FjaGVLZXldO1xuICBpZiAoY2FjaGVkICYmIERhdGUubm93KCkgLSBjYWNoZWQuY2FjaGVkQXQgPCBVU0FHRV9BUElfQ0FDSEVfVFRMKSB7XG4gICAgY29uc29sZS5sb2coYFt1c2FnZV0gY2FjaGUgaGl0OiAke2NhY2hlS2V5fWApO1xuICAgIHJldHVybiBjYWNoZWQuZGF0YTtcbiAgfVxuXG4gIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKFwiaHR0cHM6Ly9hcGkuYW50aHJvcGljLmNvbS9hcGkvb2F1dGgvdXNhZ2VcIiwge1xuICAgIGhlYWRlcnM6IHtcbiAgICAgIEF1dGhvcml6YXRpb246IGBCZWFyZXIgJHthY2Nlc3NUb2tlbn1gLFxuICAgICAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIsXG4gICAgICBcImFudGhyb3BpYy1iZXRhXCI6IFwib2F1dGgtMjAyNS0wNC0yMFwiLFxuICAgIH0sXG4gICAgc2lnbmFsOiBBYm9ydFNpZ25hbC50aW1lb3V0KDUwMDApLFxuICB9KTtcbiAgaWYgKCFyZXMub2spIHtcbiAgICBjb25zdCB0ZXh0ID0gYXdhaXQgcmVzLnRleHQoKTtcblxuICAgIC8vIO2MjOyLsSDsi5zrj4TtlbTshJwg7JeQ65+sIOuplOyLnOyngCDstpTstpxcbiAgICBsZXQgZXJyb3JNZXNzYWdlID0gYEVycm9yICR7cmVzLnN0YXR1c31gO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBwYXJzZWQgPSBKU09OLnBhcnNlKHRleHQpO1xuICAgICAgZXJyb3JNZXNzYWdlID0gcGFyc2VkLmVycm9yPy5tZXNzYWdlID8/IGVycm9yTWVzc2FnZTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIO2MjOyLsSDslYgg65CY66m0IOq4sOuzuCDrqZTsi5zsp4BcbiAgICB9XG5cbiAgICBjb25zb2xlLndhcm4oYFt1c2FnZV0gJHtyZXMuc3RhdHVzfTogJHtlcnJvck1lc3NhZ2V9YCk7XG5cbiAgICAvLyDsnbTsoIQg7ISx6rO1IOy6kOyLnCDsnojsnLzrqbQg7Jyg7KeAXG4gICAgaWYgKGNhY2hlZD8uZGF0YSAmJiAhY2FjaGVkLmRhdGEuZXJyb3IpIHJldHVybiBjYWNoZWQuZGF0YTtcblxuICAgIC8vIOyLpO2MqOuPhCDsupDsi5wgKOuwmOuztSDtmLjstpwg67Cp7KeAKVxuICAgIGNvbnN0IGVycm9yUmVzdWx0ID0geyBlcnJvcjogZXJyb3JNZXNzYWdlIH07XG4gICAgdXNhZ2VDYWNoZVtjYWNoZUtleV0gPSB7IGRhdGE6IGVycm9yUmVzdWx0LCBjYWNoZWRBdDogRGF0ZS5ub3coKSB9O1xuICAgIHJldHVybiBlcnJvclJlc3VsdDtcbiAgfVxuXG4gIGNvbnN0IGRhdGEgPSAoYXdhaXQgcmVzLmpzb24oKSkgYXMgVXNhZ2VSZXNwb25zZTtcbiAgLy8gY2FjaGUgaW52YWxpZGF0ZVxuICB1c2FnZUNhY2hlW2NhY2hlS2V5XSA9IHsgZGF0YSwgY2FjaGVkQXQ6IERhdGUubm93KCkgfTtcbiAgcmV0dXJuIGRhdGE7XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7OztBQU9BLE1BQU0sWUFBWTtBQUNsQixNQUFNLGdCQUFnQjtBQUN0QixNQUFNLFlBQVk7QUFHbEIsTUFBTSxhQUFhO0NBQ2pCO0NBQ0E7Q0FDQTtDQUNBO0NBQ0E7Q0FDQTtDQUNEO0FBR0QsTUFBTSxpQkFBaUI7Q0FDckI7Q0FDQTtDQUNBO0NBQ0E7Q0FDQTtDQUNEO0FBRUQsU0FBUyxnQkFBZ0IsUUFBd0I7QUFDL0MsUUFBTyxPQUFPLFNBQVMsU0FBUyxDQUFDLFFBQVEsT0FBTyxJQUFJLENBQUMsUUFBUSxPQUFPLElBQUksQ0FBQyxRQUFRLE1BQU0sR0FBRzs7QUFHNUYsU0FBZ0IsZUFBK0U7Q0FDN0YsTUFBTSxlQUFlLGdCQUFnQixZQUFZLEdBQUcsQ0FBQztBQUdyRCxRQUFPO0VBQUU7RUFBYyxlQUZELGdCQUFnQixXQUFXLFNBQVMsQ0FBQyxPQUFPLGFBQWEsQ0FBQyxRQUFRLENBQUM7RUFFbkQsT0FEeEIsZ0JBQWdCLFlBQVksR0FBRyxDQUFDO0VBQ0Q7O0FBRy9DLFNBQWdCLGFBQWEsZUFB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
@@ -0,0 +1,167 @@
1
+ import "../../_virtual/_rolldown/runtime.js";
2
+ import { ProcessError, QuotaError, TimeoutError, maskToken } from "./qgrid.types.js";
3
+ import { spawn } from "node:child_process";
4
+ import { mkdirSync } from "node:fs";
5
+ //#region src/application/qgrid/qgrid.dispatcher.ts
6
+ /**
7
+ * QgridDispatcher — OAuth 토큰 선택 + claude CLI fresh spawn 디스패처 싱글턴.
8
+ *
9
+ * - 매 요청마다 새 claude CLI 프로세스 spawn → 응답 후 종료
10
+ * - system 은 --append-system-prompt 로 분리 전달 (user turn 오염 방지)
11
+ * - least-used round-robin 으로 토큰 선택
12
+ * - QuotaError 는 그대로 상위 전파 (자동 failover 없음, UI 에서 수동 토글)
13
+ *
14
+ * env allowlist: PATH, TMPDIR, CLAUDE_CODE_OAUTH_TOKEN + CLAUDE_CODE_DISABLE_*
15
+ */
16
+ const DEFAULT_MODEL = "sonnet";
17
+ const DEFAULT_TIMEOUT_MS = 6e5;
18
+ var QgridDispatcherClass = class {
19
+ tokens = /* @__PURE__ */ new Map();
20
+ requestCounts = /* @__PURE__ */ new Map();
21
+ rrIndex = 0;
22
+ constructor() {
23
+ mkdirSync("/tmp/qgrid", { recursive: true });
24
+ }
25
+ getStats() {
26
+ return [...this.tokens.entries()].map(([token, name]) => ({
27
+ token,
28
+ name,
29
+ requests: this.requestCounts.get(token) ?? 0
30
+ }));
31
+ }
32
+ selectToken() {
33
+ const entries = [...this.tokens.entries()];
34
+ if (entries.length === 0) return null;
35
+ const minCount = Math.min(...entries.map(([t]) => this.requestCounts.get(t) ?? 0));
36
+ const idle = entries.filter(([t]) => (this.requestCounts.get(t) ?? 0) === minCount);
37
+ const picked = idle[this.rrIndex % idle.length];
38
+ this.rrIndex++;
39
+ return {
40
+ token: picked[0],
41
+ name: picked[1]
42
+ };
43
+ }
44
+ async query(input, timeoutMs) {
45
+ const sel = this.selectToken();
46
+ if (!sel) throw new QuotaError("No tokens available");
47
+ this.requestCounts.set(sel.token, (this.requestCounts.get(sel.token) ?? 0) + 1);
48
+ console.log(`[qgrid] → ${sel.name} (model: ${input.model ?? DEFAULT_MODEL})`);
49
+ return {
50
+ ...await executeClaude(input, sel.token, timeoutMs ?? DEFAULT_TIMEOUT_MS),
51
+ tokenName: sel.name,
52
+ model: input.model ?? DEFAULT_MODEL
53
+ };
54
+ }
55
+ addToken(token, name) {
56
+ if (this.tokens.has(token)) return;
57
+ this.tokens.set(token, name);
58
+ this.requestCounts.set(token, 0);
59
+ }
60
+ removeToken(token) {
61
+ this.tokens.delete(token);
62
+ this.requestCounts.delete(token);
63
+ }
64
+ hasToken(token) {
65
+ return this.tokens.has(token);
66
+ }
67
+ };
68
+ async function executeClaude(input, token, timeoutMs) {
69
+ const model = input.model ?? DEFAULT_MODEL;
70
+ const timeout = input.timeout ?? timeoutMs;
71
+ const args = [
72
+ "-p",
73
+ "--output-format",
74
+ "stream-json",
75
+ "--verbose",
76
+ "--max-turns",
77
+ "1",
78
+ "--permission-mode",
79
+ "bypassPermissions",
80
+ "--setting-sources",
81
+ "project",
82
+ "--model",
83
+ model
84
+ ];
85
+ if (input.system) args.push("--append-system-prompt", input.system);
86
+ args.push(input.prompt);
87
+ const env = {
88
+ PATH: process.env.PATH,
89
+ TMPDIR: process.env.TMPDIR,
90
+ CLAUDE_CODE_OAUTH_TOKEN: token,
91
+ CLAUDE_CODE_DISABLE_AUTO_MEMORY: "1",
92
+ CLAUDE_CODE_DISABLE_ADAPTIVE_THINKING: "1",
93
+ CLAUDE_CODE_DISABLE_1M_CONTEXT: "1"
94
+ };
95
+ return new Promise((resolve, reject) => {
96
+ const child = spawn("claude", args, {
97
+ stdio: [
98
+ "ignore",
99
+ "pipe",
100
+ "ignore"
101
+ ],
102
+ env,
103
+ cwd: "/tmp/qgrid"
104
+ });
105
+ let buffer = "";
106
+ let settled = false;
107
+ const timer = setTimeout(() => {
108
+ if (settled) return;
109
+ settled = true;
110
+ child.kill();
111
+ reject(new TimeoutError(`Timeout after ${timeout / 1e3}s (token: ${maskToken(token)})`));
112
+ }, timeout);
113
+ child.stdout?.on("data", (d) => {
114
+ if (settled) return;
115
+ buffer += d.toString();
116
+ const lines = buffer.split("\n");
117
+ buffer = lines.pop() ?? "";
118
+ for (const line of lines) {
119
+ if (!line.trim()) continue;
120
+ try {
121
+ const j = JSON.parse(line);
122
+ if (j.type === "result" && !settled) {
123
+ let text = j.result ?? "";
124
+ text = text.replace(/^```(?:json)?\s*\n?/i, "").replace(/\n?```\s*$/i, "");
125
+ if (text.startsWith("You've hit")) {
126
+ settled = true;
127
+ clearTimeout(timer);
128
+ reject(new QuotaError(`Quota exhausted (token: ${maskToken(token)})`));
129
+ return;
130
+ }
131
+ const u = j.usage ?? {};
132
+ settled = true;
133
+ clearTimeout(timer);
134
+ resolve({
135
+ text,
136
+ usage: {
137
+ input_tokens: u.input_tokens ?? 0,
138
+ output_tokens: u.output_tokens ?? 0,
139
+ cache_creation_input_tokens: u.cache_creation_input_tokens ?? 0,
140
+ cache_read_input_tokens: u.cache_read_input_tokens ?? 0
141
+ },
142
+ durationMs: j.duration_ms ?? 0,
143
+ costUsd: j.total_cost_usd ?? 0
144
+ });
145
+ }
146
+ } catch {}
147
+ }
148
+ });
149
+ child.on("close", () => {
150
+ if (settled) return;
151
+ settled = true;
152
+ clearTimeout(timer);
153
+ reject(new ProcessError(`CLI process closed without result (token: ${maskToken(token)})`));
154
+ });
155
+ child.on("error", (err) => {
156
+ if (settled) return;
157
+ settled = true;
158
+ clearTimeout(timer);
159
+ reject(new ProcessError(`CLI process error: ${err.message} (token: ${maskToken(token)})`));
160
+ });
161
+ });
162
+ }
163
+ const QgridDispatcher = new QgridDispatcherClass();
164
+ //#endregion
165
+ export { QgridDispatcher };
166
+
167
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicWdyaWQuZGlzcGF0Y2hlci5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYXBwbGljYXRpb24vcWdyaWQvcWdyaWQuZGlzcGF0Y2hlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFFncmlkRGlzcGF0Y2hlciDigJQgT0F1dGgg7Yag7YGwIOyEoO2DnSArIGNsYXVkZSBDTEkgZnJlc2ggc3Bhd24g65SU7Iqk7Yyo7LKYIOyLseq4gO2EtC5cbiAqXG4gKiAtIOunpCDsmpTssq3rp4jri6Qg7IOIIGNsYXVkZSBDTEkg7ZSE66Gc7IS47IqkIHNwYXduIOKGkiDsnZHri7Ug7ZuEIOyiheujjFxuICogLSBzeXN0ZW0g7J2AIC0tYXBwZW5kLXN5c3RlbS1wcm9tcHQg66GcIOu2hOumrCDsoITri6wgKHVzZXIgdHVybiDsmKTsl7wg67Cp7KeAKVxuICogLSBsZWFzdC11c2VkIHJvdW5kLXJvYmluIOycvOuhnCDthqDtgbAg7ISg7YOdXG4gKiAtIFF1b3RhRXJyb3Ig64qUIOq3uOuMgOuhnCDsg4HsnIQg7KCE7YyMICjsnpDrj5kgZmFpbG92ZXIg7JeG7J2MLCBVSSDsl5DshJwg7IiY64+ZIO2GoOq4gClcbiAqXG4gKiBlbnYgYWxsb3dsaXN0OiBQQVRILCBUTVBESVIsIENMQVVERV9DT0RFX09BVVRIX1RPS0VOICsgQ0xBVURFX0NPREVfRElTQUJMRV8qXG4gKi9cbmltcG9ydCB7IHNwYXduIH0gZnJvbSBcIm5vZGU6Y2hpbGRfcHJvY2Vzc1wiO1xuaW1wb3J0IHsgbWtkaXJTeW5jIH0gZnJvbSBcIm5vZGU6ZnNcIjtcblxuaW1wb3J0IHsgdHlwZSBDbGlSZXN1bHQsIHR5cGUgUXVlcnlJbnB1dCwgdHlwZSBUb2tlblN0YXRzIH0gZnJvbSBcIi4vcWdyaWQudHlwZXNcIjtcbmltcG9ydCB7IG1hc2tUb2tlbiwgUHJvY2Vzc0Vycm9yLCBRdW90YUVycm9yLCBUaW1lb3V0RXJyb3IgfSBmcm9tIFwiLi9xZ3JpZC50eXBlc1wiO1xuXG5jb25zdCBERUZBVUxUX01PREVMID0gXCJzb25uZXRcIjtcbmNvbnN0IERFRkFVTFRfVElNRU9VVF9NUyA9IDYwMF8wMDA7XG5cbmNsYXNzIFFncmlkRGlzcGF0Y2hlckNsYXNzIHtcbiAgdG9rZW5zID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcbiAgcmVxdWVzdENvdW50cyA9IG5ldyBNYXA8c3RyaW5nLCBudW1iZXI+KCk7XG4gIHJySW5kZXggPSAwO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIG1rZGlyU3luYyhcIi90bXAvcWdyaWRcIiwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gIH1cblxuICBnZXRTdGF0cygpOiBUb2tlblN0YXRzW10ge1xuICAgIHJldHVybiBbLi4udGhpcy50b2tlbnMuZW50cmllcygpXS5tYXAoKFt0b2tlbiwgbmFtZV0pID0+ICh7XG4gICAgICB0b2tlbixcbiAgICAgIG5hbWUsXG4gICAgICByZXF1ZXN0czogdGhpcy5yZXF1ZXN0Q291bnRzLmdldCh0b2tlbikgPz8gMCxcbiAgICB9KSk7XG4gIH1cblxuICBzZWxlY3RUb2tlbigpOiB7IHRva2VuOiBzdHJpbmc7IG5hbWU6IHN0cmluZyB9IHwgbnVsbCB7XG4gICAgY29uc3QgZW50cmllcyA9IFsuLi50aGlzLnRva2Vucy5lbnRyaWVzKCldO1xuICAgIGlmIChlbnRyaWVzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIG51bGw7XG5cbiAgICBjb25zdCBtaW5Db3VudCA9IE1hdGgubWluKC4uLmVudHJpZXMubWFwKChbdF0pID0+IHRoaXMucmVxdWVzdENvdW50cy5nZXQodCkgPz8gMCkpO1xuICAgIGNvbnN0IGlkbGUgPSBlbnRyaWVzLmZpbHRlcigoW3RdKSA9PiAodGhpcy5yZXF1ZXN0Q291bnRzLmdldCh0KSA/PyAwKSA9PT0gbWluQ291bnQpO1xuICAgIGNvbnN0IHBpY2tlZCA9IGlkbGVbdGhpcy5yckluZGV4ICUgaWRsZS5sZW5ndGhdITtcbiAgICB0aGlzLnJySW5kZXgrKztcbiAgICByZXR1cm4geyB0b2tlbjogcGlja2VkWzBdLCBuYW1lOiBwaWNrZWRbMV0gfTtcbiAgfVxuXG4gIGFzeW5jIHF1ZXJ5KGlucHV0OiBRdWVyeUlucHV0LCB0aW1lb3V0TXM/OiBudW1iZXIpOiBQcm9taXNlPENsaVJlc3VsdD4ge1xuICAgIGNvbnN0IHNlbCA9IHRoaXMuc2VsZWN0VG9rZW4oKTtcbiAgICBpZiAoIXNlbCkgdGhyb3cgbmV3IFF1b3RhRXJyb3IoXCJObyB0b2tlbnMgYXZhaWxhYmxlXCIpO1xuXG4gICAgLy8gYXdhaXQg7KCE7JeQIGNvdW50IOyEoOuwmOyYgS4g67OR66CsIOyalOyyreydtCDrj5nsi5zsl5Ag64+E7LCp7ZW064+EIOqwgeyekCDri6Trpbgg7Yag7YGw7J2EIOqzoOultOuPhOuhnS5cbiAgICB0aGlzLnJlcXVlc3RDb3VudHMuc2V0KHNlbC50b2tlbiwgKHRoaXMucmVxdWVzdENvdW50cy5nZXQoc2VsLnRva2VuKSA/PyAwKSArIDEpO1xuXG4gICAgY29uc29sZS5sb2coYFtxZ3JpZF0g4oaSICR7c2VsLm5hbWV9IChtb2RlbDogJHtpbnB1dC5tb2RlbCA/PyBERUZBVUxUX01PREVMfSlgKTtcblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGV4ZWN1dGVDbGF1ZGUoaW5wdXQsIHNlbC50b2tlbiwgdGltZW91dE1zID8/IERFRkFVTFRfVElNRU9VVF9NUyk7XG4gICAgcmV0dXJuIHsgLi4ucmVzdWx0LCB0b2tlbk5hbWU6IHNlbC5uYW1lLCBtb2RlbDogaW5wdXQubW9kZWwgPz8gREVGQVVMVF9NT0RFTCB9O1xuICB9XG5cbiAgYWRkVG9rZW4odG9rZW46IHN0cmluZywgbmFtZTogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKHRoaXMudG9rZW5zLmhhcyh0b2tlbikpIHJldHVybjtcbiAgICB0aGlzLnRva2Vucy5zZXQodG9rZW4sIG5hbWUpO1xuICAgIHRoaXMucmVxdWVzdENvdW50cy5zZXQodG9rZW4sIDApO1xuICB9XG5cbiAgcmVtb3ZlVG9rZW4odG9rZW46IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMudG9rZW5zLmRlbGV0ZSh0b2tlbik7XG4gICAgdGhpcy5yZXF1ZXN0Q291bnRzLmRlbGV0ZSh0b2tlbik7XG4gIH1cblxuICBoYXNUb2tlbih0b2tlbjogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMudG9rZW5zLmhhcyh0b2tlbik7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gZXhlY3V0ZUNsYXVkZShcbiAgaW5wdXQ6IFF1ZXJ5SW5wdXQsXG4gIHRva2VuOiBzdHJpbmcsXG4gIHRpbWVvdXRNczogbnVtYmVyLFxuKTogUHJvbWlzZTxDbGlSZXN1bHQ+IHtcbiAgY29uc3QgbW9kZWwgPSBpbnB1dC5tb2RlbCA/PyBERUZBVUxUX01PREVMO1xuICBjb25zdCB0aW1lb3V0ID0gaW5wdXQudGltZW91dCA/PyB0aW1lb3V0TXM7XG5cbiAgY29uc3QgYXJnczogc3RyaW5nW10gPSBbXG4gICAgXCItcFwiLFxuICAgIFwiLS1vdXRwdXQtZm9ybWF0XCIsXG4gICAgXCJzdHJlYW0tanNvblwiLFxuICAgIFwiLS12ZXJib3NlXCIsXG4gICAgXCItLW1heC10dXJuc1wiLFxuICAgIFwiMVwiLFxuICAgIFwiLS1wZXJtaXNzaW9uLW1vZGVcIixcbiAgICBcImJ5cGFzc1Blcm1pc3Npb25zXCIsXG4gICAgXCItLXNldHRpbmctc291cmNlc1wiLFxuICAgIFwicHJvamVjdFwiLFxuICAgIFwiLS1tb2RlbFwiLFxuICAgIG1vZGVsLFxuICBdO1xuICBpZiAoaW5wdXQuc3lzdGVtKSB7XG4gICAgYXJncy5wdXNoKFwiLS1hcHBlbmQtc3lzdGVtLXByb21wdFwiLCBpbnB1dC5zeXN0ZW0pO1xuICB9XG4gIGFyZ3MucHVzaChpbnB1dC5wcm9tcHQpO1xuXG4gIGNvbnN0IGVudjogTm9kZUpTLlByb2Nlc3NFbnYgPSB7XG4gICAgUEFUSDogcHJvY2Vzcy5lbnYuUEFUSCxcbiAgICBUTVBESVI6IHByb2Nlc3MuZW52LlRNUERJUixcbiAgICBDTEFVREVfQ09ERV9PQVVUSF9UT0tFTjogdG9rZW4sXG4gICAgQ0xBVURFX0NPREVfRElTQUJMRV9BVVRPX01FTU9SWTogXCIxXCIsXG4gICAgQ0xBVURFX0NPREVfRElTQUJMRV9BREFQVElWRV9USElOS0lORzogXCIxXCIsXG4gICAgQ0xBVURFX0NPREVfRElTQUJMRV8xTV9DT05URVhUOiBcIjFcIixcbiAgfTtcblxuICByZXR1cm4gbmV3IFByb21pc2U8Q2xpUmVzdWx0PigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgY29uc3QgY2hpbGQgPSBzcGF3bihcImNsYXVkZVwiLCBhcmdzLCB7XG4gICAgICBzdGRpbzogW1wiaWdub3JlXCIsIFwicGlwZVwiLCBcImlnbm9yZVwiXSxcbiAgICAgIGVudixcbiAgICAgIGN3ZDogXCIvdG1wL3FncmlkXCIsXG4gICAgfSk7XG5cbiAgICBsZXQgYnVmZmVyID0gXCJcIjtcbiAgICBsZXQgc2V0dGxlZCA9IGZhbHNlO1xuICAgIGNvbnN0IHRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBpZiAoc2V0dGxlZCkgcmV0dXJuO1xuICAgICAgc2V0dGxlZCA9IHRydWU7XG4gICAgICBjaGlsZC5raWxsKCk7XG4gICAgICByZWplY3QobmV3IFRpbWVvdXRFcnJvcihgVGltZW91dCBhZnRlciAke3RpbWVvdXQgLyAxMDAwfXMgKHRva2VuOiAke21hc2tUb2tlbih0b2tlbil9KWApKTtcbiAgICB9LCB0aW1lb3V0KTtcblxuICAgIGNoaWxkLnN0ZG91dD8ub24oXCJkYXRhXCIsIChkOiBCdWZmZXIpID0+IHtcbiAgICAgIGlmIChzZXR0bGVkKSByZXR1cm47XG4gICAgICBidWZmZXIgKz0gZC50b1N0cmluZygpO1xuICAgICAgY29uc3QgbGluZXMgPSBidWZmZXIuc3BsaXQoXCJcXG5cIik7XG4gICAgICBidWZmZXIgPSBsaW5lcy5wb3AoKSA/PyBcIlwiO1xuICAgICAgZm9yIChjb25zdCBsaW5lIG9mIGxpbmVzKSB7XG4gICAgICAgIGlmICghbGluZS50cmltKCkpIGNvbnRpbnVlO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IGogPSBKU09OLnBhcnNlKGxpbmUpO1xuICAgICAgICAgIGlmIChqLnR5cGUgPT09IFwicmVzdWx0XCIgJiYgIXNldHRsZWQpIHtcbiAgICAgICAgICAgIGxldCB0ZXh0OiBzdHJpbmcgPSBqLnJlc3VsdCA/PyBcIlwiO1xuICAgICAgICAgICAgdGV4dCA9IHRleHQucmVwbGFjZSgvXmBgYCg/Ompzb24pP1xccypcXG4/L2ksIFwiXCIpLnJlcGxhY2UoL1xcbj9gYGBcXHMqJC9pLCBcIlwiKTtcblxuICAgICAgICAgICAgaWYgKHRleHQuc3RhcnRzV2l0aChcIllvdSd2ZSBoaXRcIikpIHtcbiAgICAgICAgICAgICAgc2V0dGxlZCA9IHRydWU7XG4gICAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lcik7XG4gICAgICAgICAgICAgIHJlamVjdChuZXcgUXVvdGFFcnJvcihgUXVvdGEgZXhoYXVzdGVkICh0b2tlbjogJHttYXNrVG9rZW4odG9rZW4pfSlgKSk7XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgdSA9IGoudXNhZ2UgPz8ge307XG4gICAgICAgICAgICBzZXR0bGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lcik7XG4gICAgICAgICAgICByZXNvbHZlKHtcbiAgICAgICAgICAgICAgdGV4dCxcbiAgICAgICAgICAgICAgdXNhZ2U6IHtcbiAgICAgICAgICAgICAgICBpbnB1dF90b2tlbnM6IHUuaW5wdXRfdG9rZW5zID8/IDAsXG4gICAgICAgICAgICAgICAgb3V0cHV0X3Rva2VuczogdS5vdXRwdXRfdG9rZW5zID8/IDAsXG4gICAgICAgICAgICAgICAgY2FjaGVfY3JlYXRpb25faW5wdXRfdG9rZW5zOiB1LmNhY2hlX2NyZWF0aW9uX2lucHV0X3Rva2VucyA/PyAwLFxuICAgICAgICAgICAgICAgIGNhY2hlX3JlYWRfaW5wdXRfdG9rZW5zOiB1LmNhY2hlX3JlYWRfaW5wdXRfdG9rZW5zID8/IDAsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIGR1cmF0aW9uTXM6IGouZHVyYXRpb25fbXMgPz8gMCxcbiAgICAgICAgICAgICAgY29zdFVzZDogai50b3RhbF9jb3N0X3VzZCA/PyAwLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIHt9XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBjaGlsZC5vbihcImNsb3NlXCIsICgpID0+IHtcbiAgICAgIGlmIChzZXR0bGVkKSByZXR1cm47XG4gICAgICBzZXR0bGVkID0gdHJ1ZTtcbiAgICAgIGNsZWFyVGltZW91dCh0aW1lcik7XG4gICAgICByZWplY3QobmV3IFByb2Nlc3NFcnJvcihgQ0xJIHByb2Nlc3MgY2xvc2VkIHdpdGhvdXQgcmVzdWx0ICh0b2tlbjogJHttYXNrVG9rZW4odG9rZW4pfSlgKSk7XG4gICAgfSk7XG5cbiAgICBjaGlsZC5vbihcImVycm9yXCIsIChlcnIpID0+IHtcbiAgICAgIGlmIChzZXR0bGVkKSByZXR1cm47XG4gICAgICBzZXR0bGVkID0gdHJ1ZTtcbiAgICAgIGNsZWFyVGltZW91dCh0aW1lcik7XG4gICAgICByZWplY3QobmV3IFByb2Nlc3NFcnJvcihgQ0xJIHByb2Nlc3MgZXJyb3I6ICR7ZXJyLm1lc3NhZ2V9ICh0b2tlbjogJHttYXNrVG9rZW4odG9rZW4pfSlgKSk7XG4gICAgfSk7XG4gIH0pO1xufVxuXG5leHBvcnQgY29uc3QgUWdyaWREaXNwYXRjaGVyID0gbmV3IFFncmlkRGlzcGF0Y2hlckNsYXNzKCk7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7OztBQWdCQSxNQUFNLGdCQUFnQjtBQUN0QixNQUFNLHFCQUFxQjtBQUUzQixJQUFNLHVCQUFOLE1BQTJCO0NBQ3pCLHlCQUFTLElBQUksS0FBcUI7Q0FDbEMsZ0NBQWdCLElBQUksS0FBcUI7Q0FDekMsVUFBVTtDQUVWLGNBQWM7QUFDWixZQUFV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
@@ -1,6 +1,6 @@
1
1
  import "../../_virtual/_rolldown/runtime.js";
2
2
  import { buildAuthUrl, exchangeCodeForTokens, fetchUsage, generatePKCE, refreshAccessToken } from "./oauth.js";
3
- import { getPool } from "./pool.js";
3
+ import { QgridDispatcher } from "./qgrid.dispatcher.js";
4
4
  import { __decorateMetadata } from "../../_virtual/_@oxc-project_runtime@0.122.0/helpers/decorateMetadata.js";
5
5
  import { __decorate } from "../../_virtual/_@oxc-project_runtime@0.122.0/helpers/decorate.js";
6
6
  import { MICRO_USD, RequestLogModel } from "../request-log/request-log.model.js";
@@ -12,15 +12,18 @@ var QgridFrameClass = class extends BaseFrameClass {
12
12
  constructor() {
13
13
  super("Qgrid");
14
14
  }
15
- async query(prompt, system, timeout) {
16
- const pool = getPool();
17
- const result = await pool.query({
15
+ async query(prompt, system, timeout, model, projectName) {
16
+ const result = await QgridDispatcher.query({
18
17
  system,
19
- prompt
18
+ prompt,
19
+ model
20
20
  }, timeout);
21
21
  RequestLogModel.save([{
22
- token_name: pool.getLastUsedWorkerName(),
23
- query: system ? `[System]\n${system}\n\n[User]\n${prompt}` : prompt,
22
+ token_name: result.tokenName,
23
+ project_name: projectName && projectName.length > 0 ? projectName : null,
24
+ model_name: result.model ?? null,
25
+ user_prompt: prompt,
26
+ system_prompt: system ?? null,
24
27
  response: result.text,
25
28
  input_tokens: result.usage.input_tokens,
26
29
  output_tokens: result.usage.output_tokens,
@@ -32,22 +35,24 @@ var QgridFrameClass = class extends BaseFrameClass {
32
35
  return result;
33
36
  }
34
37
  async stats() {
35
- return getPool().getStats();
38
+ return QgridDispatcher.getStats();
36
39
  }
37
40
  async totalCost(tokenName) {
38
41
  return { usd: await RequestLogModel.totalCost({ token_name: tokenName }) };
39
42
  }
43
+ async projectNames() {
44
+ return { names: await RequestLogModel.distinctProjectNames() };
45
+ }
40
46
  async addToken(token, name, refreshToken) {
41
47
  await TokenModel.save([{
42
48
  token,
43
49
  name,
44
50
  ...refreshToken && refreshToken.length > 0 ? { refresh_token: refreshToken } : {}
45
51
  }]);
46
- getPool().createWorkers(token, name);
52
+ QgridDispatcher.addToken(token, name);
47
53
  return { added: true };
48
54
  }
49
55
  async updateToken(token, name, newToken, refreshToken) {
50
- const pool = getPool();
51
56
  const entry = await TokenModel.findByToken("A", token);
52
57
  if (!entry) return { updated: false };
53
58
  const hasNewToken = newToken !== void 0 && newToken.length > 0;
@@ -59,28 +64,24 @@ var QgridFrameClass = class extends BaseFrameClass {
59
64
  ...hasRefreshToken ? { refresh_token: refreshToken } : {}
60
65
  }]);
61
66
  if (hasNewToken) {
62
- pool.destroyWorkers(token);
63
- pool.createWorkers(newToken, name ?? entry.name);
67
+ QgridDispatcher.removeToken(token);
68
+ QgridDispatcher.addToken(newToken, name ?? entry.name);
64
69
  }
65
70
  return { updated: true };
66
71
  }
67
72
  async removeToken(token) {
68
- const pool = getPool();
69
- if (!pool.workers.has(token)) return { removed: false };
73
+ if (!QgridDispatcher.hasToken(token)) return { removed: false };
70
74
  const entry = await TokenModel.findByToken("A", token);
71
75
  if (entry) await TokenModel.del([entry.id]);
72
- pool.destroyWorkers(token);
76
+ QgridDispatcher.removeToken(token);
73
77
  return { removed: true };
74
78
  }
75
79
  /**
76
- *
77
80
  * @param id token_id
78
- * 토큰 활성화/비활성화 토글 (pool 워커 생성/제거 & DB의 active 필드 업데이트)
79
- *
81
+ * 토큰 활성화/비활성화 토글 (dispatcher 등록/제거 & DB의 active 필드 업데이트)
80
82
  * @returns 토큰 활성화 여부
81
83
  */
82
84
  async toggleToken(id) {
83
- const pool = getPool();
84
85
  const entry = await TokenModel.findOne("A", { id });
85
86
  if (!entry) return { active: false };
86
87
  const newActive = !entry.active;
@@ -90,8 +91,8 @@ var QgridFrameClass = class extends BaseFrameClass {
90
91
  active: newActive,
91
92
  name: entry.name
92
93
  }]);
93
- if (newActive) pool.createWorkers(entry.token, entry.name);
94
- else pool.destroyWorkers(entry.token);
94
+ if (newActive) QgridDispatcher.addToken(entry.token, entry.name);
95
+ else QgridDispatcher.removeToken(entry.token);
95
96
  return { active: newActive };
96
97
  }
97
98
  async oauthStart(name) {
@@ -107,7 +108,6 @@ var QgridFrameClass = class extends BaseFrameClass {
107
108
  return { authUrl };
108
109
  }
109
110
  async handleOAuthCallback(code, state, reply) {
110
- const pool = getPool();
111
111
  const pending = pendingOAuth.get(state);
112
112
  if (!pending) return reply.redirect("/?oauth=error&reason=invalid_state");
113
113
  pendingOAuth.delete(state);
@@ -115,9 +115,9 @@ var QgridFrameClass = class extends BaseFrameClass {
115
115
  const tokens = await exchangeCodeForTokens(code, pending.codeVerifier, state, pending.redirectUri);
116
116
  if (tokens.accountUuid) {
117
117
  const oldEntries = await TokenModel.findByAccountUuid("A", tokens.accountUuid);
118
- for (const old of oldEntries) {
119
- pool.destroyWorkers(old.token);
120
- await TokenModel.del([old.id]);
118
+ if (oldEntries.length > 0) {
119
+ for (const old of oldEntries) QgridDispatcher.removeToken(old.token);
120
+ await TokenModel.del(oldEntries.map((o) => o.id));
121
121
  }
122
122
  }
123
123
  await TokenModel.save([{
@@ -127,27 +127,26 @@ var QgridFrameClass = class extends BaseFrameClass {
127
127
  expires_at: tokens.expiresAt ? BigInt(tokens.expiresAt) : null,
128
128
  account_uuid: tokens.accountUuid
129
129
  }]);
130
- pool.createWorkers(tokens.accessToken, pending.name);
130
+ QgridDispatcher.addToken(tokens.accessToken, pending.name);
131
131
  return reply.redirect(`/?oauth=success&name=${encodeURIComponent(pending.name)}`);
132
132
  } catch (e) {
133
133
  return reply.redirect(`/?oauth=error&reason=${encodeURIComponent(e.message)}`);
134
134
  }
135
135
  }
136
136
  async usage(tokenName) {
137
- const pool = getPool();
138
137
  const { rows: allTokens } = await TokenModel.findMany("A");
139
138
  const entry = tokenName ? allTokens.find((e) => e.name === tokenName) : allTokens.findLast((e) => e.active);
140
139
  if (!entry) return { error: "NOT_FOUND" };
141
140
  let accessToken = entry.token;
142
141
  if (entry.expires_at && Number(entry.expires_at) < Date.now() && entry.refresh_token) try {
143
- accessToken = await this.refreshToken(pool, entry);
142
+ accessToken = await this.refreshToken(entry);
144
143
  } catch (e) {
145
144
  console.warn(`[usage] refresh failed for ${entry.name}: ${e.message}`);
146
145
  return { error: "re-login required" };
147
146
  }
148
147
  const result = await fetchUsage(accessToken);
149
148
  if (result.error && entry.refresh_token) try {
150
- accessToken = await this.refreshToken(pool, entry);
149
+ accessToken = await this.refreshToken(entry);
151
150
  return await fetchUsage(accessToken);
152
151
  } catch (e) {
153
152
  console.warn(`[usage] refresh failed for ${entry.name}: ${e.message}`);
@@ -155,7 +154,7 @@ var QgridFrameClass = class extends BaseFrameClass {
155
154
  }
156
155
  return result;
157
156
  }
158
- async refreshToken(pool, token) {
157
+ async refreshToken(token) {
159
158
  if (!token.refresh_token) throw new Error("No refresh token");
160
159
  const refreshed = await refreshAccessToken(token.refresh_token);
161
160
  await TokenModel.save([{
@@ -165,16 +164,14 @@ var QgridFrameClass = class extends BaseFrameClass {
165
164
  expires_at: BigInt(refreshed.expiresAt),
166
165
  name: token.name ?? ""
167
166
  }]);
168
- pool.destroyWorkers(token.token);
169
- pool.createWorkers(refreshed.accessToken, token.name);
167
+ QgridDispatcher.removeToken(token.token);
168
+ QgridDispatcher.addToken(refreshed.accessToken, token.name);
170
169
  return refreshed.accessToken;
171
170
  }
172
171
  async health() {
173
- const pool = getPool();
174
172
  return {
175
173
  status: "ok",
176
- workers: [...pool.workers.values()].flat().length,
177
- activeTokens: pool.workers.size - pool.quotaExhausted.size
174
+ activeTokens: QgridDispatcher.tokens.size
178
175
  };
179
176
  }
180
177
  };
@@ -187,7 +184,9 @@ __decorate([
187
184
  __decorateMetadata("design:paramtypes", [
188
185
  String,
189
186
  String,
190
- Number
187
+ Number,
188
+ String,
189
+ String
191
190
  ]),
192
191
  __decorateMetadata("design:returntype", Promise)
193
192
  ], QgridFrameClass.prototype, "query", null);
@@ -209,6 +208,15 @@ __decorate([
209
208
  __decorateMetadata("design:paramtypes", [String]),
210
209
  __decorateMetadata("design:returntype", Promise)
211
210
  ], QgridFrameClass.prototype, "totalCost", null);
211
+ __decorate([
212
+ api({
213
+ httpMethod: "GET",
214
+ clients: ["axios", "tanstack-query"]
215
+ }),
216
+ __decorateMetadata("design:type", Function),
217
+ __decorateMetadata("design:paramtypes", []),
218
+ __decorateMetadata("design:returntype", Promise)
219
+ ], QgridFrameClass.prototype, "projectNames", null);
212
220
  __decorate([
213
221
  api({
214
222
  httpMethod: "POST",
@@ -285,4 +293,4 @@ const QgridFrame = new QgridFrameClass();
285
293
  //#endregion
286
294
  export { QgridFrame };
287
295
 
288
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicWdyaWQuZnJhbWUuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2FwcGxpY2F0aW9uL3FncmlkL3FncmlkLmZyYW1lLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHR5cGUgRmFzdGlmeVJlcGx5IH0gZnJvbSBcImZhc3RpZnlcIjtcbmltcG9ydCB7IGFwaSwgQmFzZUZyYW1lQ2xhc3MgfSBmcm9tIFwic29uYW11XCI7XG5cbmltcG9ydCB7IE1JQ1JPX1VTRCwgUmVxdWVzdExvZ01vZGVsIH0gZnJvbSBcIi4uL3JlcXVlc3QtbG9nL3JlcXVlc3QtbG9nLm1vZGVsXCI7XG5pbXBvcnQgeyBUb2tlbk1vZGVsIH0gZnJvbSBcIi4uL3Rva2VuL3Rva2VuLm1vZGVsXCI7XG5pbXBvcnQgeyB0eXBlIFJlZnJlc2hUb2tlblBhcmFtcyB9IGZyb20gXCIuLi90b2tlbi90b2tlbi50eXBlc1wiO1xuaW1wb3J0IHtcbiAgYnVpbGRBdXRoVXJsLFxuICBleGNoYW5nZUNvZGVGb3JUb2tlbnMsXG4gIGZldGNoVXNhZ2UsXG4gIGdlbmVyYXRlUEtDRSxcbiAgcmVmcmVzaEFjY2Vzc1Rva2VuLFxufSBmcm9tIFwiLi9vYXV0aFwiO1xuaW1wb3J0IHsgdHlwZSBDbGF1ZGVQb29sLCBnZXRQb29sIH0gZnJvbSBcIi4vcG9vbFwiO1xuaW1wb3J0IHtcbiAgdHlwZSBDbGlSZXN1bHQsXG4gIHR5cGUgSGVhbHRoUmVzcG9uc2UsXG4gIHR5cGUgT0F1dGhTdGFydFJlc3VsdCxcbiAgdHlwZSBUb2tlblN0YXRzLFxuICB0eXBlIFVzYWdlUmVzcG9uc2UsXG59IGZyb20gXCIuL3FncmlkLnR5cGVzXCI7XG5cbi8vIFBLQ0Ug7IS47IWYIOuplOuqqOumrCDsoIDsnqUgKHN0YXRlIOKGkiB7IGNvZGVWZXJpZmllciwgbmFtZSwgcmVkaXJlY3RVcmkgfSlcbmNvbnN0IHBlbmRpbmdPQXV0aCA9IG5ldyBNYXA8c3RyaW5nLCB7IGNvZGVWZXJpZmllcjogc3RyaW5nOyBuYW1lOiBzdHJpbmc7IHJlZGlyZWN0VXJpOiBzdHJpbmcgfT4oKTtcblxuY2xhc3MgUWdyaWRGcmFtZUNsYXNzIGV4dGVuZHMgQmFzZUZyYW1lQ2xhc3Mge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcihcIlFncmlkXCIpO1xuICB9XG5cbiAgQGFwaSh7IGh0dHBNZXRob2Q6IFwiUE9TVFwiLCBjbGllbnRzOiBbXCJheGlvc1wiLCBcInRhbnN0YWNrLW11dGF0aW9uXCJdIH0pXG4gIGFzeW5jIHF1ZXJ5KHByb21wdDogc3RyaW5nLCBzeXN0ZW0/OiBzdHJpbmcsIHRpbWVvdXQ/OiBudW1iZXIpOiBQcm9taXNlPENsaVJlc3VsdD4ge1xuICAgIGNvbnN0IHBvb2wgPSBnZXRQb29sKCk7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcG9vbC5xdWVyeSh7IHN5c3RlbSwgcHJvbXB0IH0sIHRpbWVvdXQpO1xuXG4gICAgLy8g66Gc6re4IOq4sOuhnSDsi6TtjKjtlbTrj4Qg7L+866asIOqysOqzvOuKlCDrsJjtmZhcbiAgICBSZXF1ZXN0TG9nTW9kZWwuc2F2ZShbXG4gICAgICB7XG4gICAgICAgIHRva2VuX25hbWU6IHBvb2wuZ2V0TGFzdFVzZWRXb3JrZXJOYW1lKCksXG4gICAgICAgIHF1ZXJ5OiBzeXN0ZW0gPyBgW1N5c3RlbV1cXG4ke3N5c3RlbX1cXG5cXG5bVXNlcl1cXG4ke3Byb21wdH1gIDogcHJvbXB0LFxuICAgICAgICByZXNwb25zZTogcmVzdWx0LnRleHQsXG4gICAgICAgIGlucHV0X3Rva2VuczogcmVzdWx0LnVzYWdlLmlucHV0X3Rva2VucyxcbiAgICAgICAgb3V0cHV0X3Rva2VuczogcmVzdWx0LnVzYWdlLm91dHB1dF90b2tlbnMsXG4gICAgICAgIGNhY2hlX3JlYWRfdG9rZW5zOiByZXN1bHQudXNhZ2UuY2FjaGVfcmVhZF9pbnB1dF90b2tlbnMsXG4gICAgICAgIGNhY2hlX2NyZWF0aW9uX3Rva2VuczogcmVzdWx0LnVzYWdlLmNhY2hlX2NyZWF0aW9uX2lucHV0X3Rva2VucyxcbiAgICAgICAgZHVyYXRpb25fbXM6IHJlc3VsdC5kdXJhdGlvbk1zLFxuICAgICAgICBjb3N0X3VzZDogcmVzdWx0LmNvc3RVc2QgIT09IG51bGwgPyBNYXRoLnJvdW5kKHJlc3VsdC5jb3N0VXNkICogTUlDUk9fVVNEKSA6IG51bGwsXG4gICAgICB9LFxuICAgIF0pLmNhdGNoKChlKSA9PiBjb25zb2xlLmVycm9yKFwicmVxdWVzdExvZyBzYXZlIGZhaWxlZDpcIiwgZSkpO1xuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIEBhcGkoeyBodHRwTWV0aG9kOiBcIkdFVFwiLCBjbGllbnRzOiBbXCJheGlvc1wiLCBcInRhbnN0YWNrLXF1ZXJ5XCJdIH0pXG4gIGFzeW5jIHN0YXRzKCk6IFByb21pc2U8VG9rZW5TdGF0c1tdPiB7XG4gICAgcmV0dXJuIGdldFBvb2woKS5nZXRTdGF0cygpO1xuICB9XG5cbiAgQGFwaSh7IGh0dHBNZXRob2Q6IFwiR0VUXCIsIGNsaWVudHM6IFtcImF4aW9zXCIsIFwidGFuc3RhY2stcXVlcnlcIl0gfSlcbiAgYXN5bmMgdG90YWxDb3N0KHRva2VuTmFtZT86IHN0cmluZyk6IFByb21pc2U8eyB1c2Q6IG51bWJlciB9PiB7XG4gICAgcmV0dXJuIHsgdXNkOiBhd2FpdCBSZXF1ZXN0TG9nTW9kZWwudG90YWxDb3N0KHsgdG9rZW5fbmFtZTogdG9rZW5OYW1lIH0pIH07XG4gIH1cblxuICBAYXBpKHsgaHR0cE1ldGhvZDogXCJQT1NUXCIsIGNsaWVudHM6IFtcImF4aW9zXCIsIFwidGFuc3RhY2stbXV0YXRpb25cIl0gfSlcbiAgYXN5bmMgYWRkVG9rZW4odG9rZW46IHN0cmluZywgbmFtZTogc3RyaW5nLCByZWZyZXNoVG9rZW4/OiBzdHJpbmcpOiBQcm9taXNlPHsgYWRkZWQ6IGJvb2xlYW4gfT4ge1xuICAgIGF3YWl0IFRva2VuTW9kZWwuc2F2ZShbXG4gICAgICB7XG4gICAgICAgIHRva2VuLFxuICAgICAgICBuYW1lLFxuICAgICAgICAuLi4ocmVmcmVzaFRva2VuICYmIHJlZnJlc2hUb2tlbi5sZW5ndGggPiAwID8geyByZWZyZXNoX3Rva2VuOiByZWZyZXNoVG9rZW4gfSA6IHt9KSxcbiAgICAgIH0sXG4gICAgXSk7XG4gICAgZ2V0UG9vbCgpLmNyZWF0ZVdvcmtlcnModG9rZW4sIG5hbWUpO1xuICAgIHJldHVybiB7IGFkZGVkOiB0cnVlIH07XG4gIH1cblxuICBAYXBpKHsgaHR0cE1ldGhvZDogXCJQT1NUXCIsIGNsaWVudHM6IFtcImF4aW9zXCIsIFwidGFuc3RhY2stbXV0YXRpb25cIl0gfSlcbiAgYXN5bmMgdXBkYXRlVG9rZW4oXG4gICAgdG9rZW46IHN0cmluZyxcbiAgICBuYW1lPzogc3RyaW5nLFxuICAgIG5ld1Rva2VuPzogc3RyaW5nLFxuICAgIHJlZnJlc2hUb2tlbj86IHN0cmluZyxcbiAgKTogUHJvbWlzZTx7IHVwZGF0ZWQ6IGJvb2xlYW4gfT4ge1xuICAgIGNvbnN0IHBvb2wgPSBnZXRQb29sKCk7XG4gICAgY29uc3QgZW50cnkgPSBhd2FpdCBUb2tlbk1vZGVsLmZpbmRCeVRva2VuKFwiQVwiLCB0b2tlbik7XG4gICAgaWYgKCFlbnRyeSkgcmV0dXJuIHsgdXBkYXRlZDogZmFsc2UgfTtcblxuICAgIGNvbnN0IGhhc05ld1Rva2VuID0gbmV3VG9rZW4gIT09IHVuZGVmaW5lZCAmJiBuZXdUb2tlbi5sZW5ndGggPiAwO1xuICAgIGNvbnN0IGhhc1JlZnJlc2hUb2tlbiA9IHJlZnJlc2hUb2tlbiAhPT0gdW5kZWZpbmVkICYmIHJlZnJlc2hUb2tlbi5sZW5ndGggPiAwO1xuICAgIGF3YWl0IFRva2VuTW9kZWwuc2F2ZShbXG4gICAgICB7XG4gICAgICAgIGlkOiBlbnRyeS5pZCxcbiAgICAgICAgdG9rZW46IGhhc05ld1Rva2VuID8gbmV3VG9rZW4gOiBlbnRyeS50b2tlbixcbiAgICAgICAgbmFtZTogbmFtZSAhPT0gdW5kZWZpbmVkID8gbmFtZSA6IGVudHJ5Lm5hbWUsXG4gICAgICAgIC4uLihoYXNSZWZyZXNoVG9rZW4gPyB7IHJlZnJlc2hfdG9rZW46IHJlZnJlc2hUb2tlbiB9IDoge30pLFxuICAgICAgfSxcbiAgICBdKTtcblxuICAgIGlmIChoYXNOZXdUb2tlbikge1xuICAgICAgcG9vbC5kZXN0cm95V29ya2Vycyh0b2tlbik7XG4gICAgICBwb29sLmNyZWF0ZVdvcmtlcnMobmV3VG9rZW4sIG5hbWUgPz8gZW50cnkubmFtZSk7XG4gICAgfVxuICAgIHJldHVybiB7IHVwZGF0ZWQ6IHRydWUgfTtcbiAgfVxuXG4gIEBhcGkoeyBodHRwTWV0aG9kOiBcIlBPU1RcIiwgY2xpZW50czogW1wiYXhpb3NcIiwgXCJ0YW5zdGFjay1tdXRhdGlvblwiXSB9KVxuICBhc3luYyByZW1vdmVUb2tlbih0b2tlbjogc3RyaW5nKTogUHJvbWlzZTx7IHJlbW92ZWQ6IGJvb2xlYW4gfT4ge1xuICAgIGNvbnN0IHBvb2wgPSBnZXRQb29sKCk7XG4gICAgaWYgKCFwb29sLndvcmtlcnMuaGFzKHRva2VuKSkgcmV0dXJuIHsgcmVtb3ZlZDogZmFsc2UgfTtcblxuICAgIGNvbnN0IGVudHJ5ID0gYXdhaXQgVG9rZW5Nb2RlbC5maW5kQnlUb2tlbihcIkFcIiwgdG9rZW4pO1xuICAgIGlmIChlbnRyeSkgYXdhaXQgVG9rZW5Nb2RlbC5kZWwoW2VudHJ5LmlkXSk7XG4gICAgcG9vbC5kZXN0cm95V29ya2Vycyh0b2tlbik7XG4gICAgcmV0dXJuIHsgcmVtb3ZlZDogdHJ1ZSB9O1xuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSBpZCB0b2tlbl9pZFxuICAgKiDthqDtgbAg7Zmc7ISx7ZmUL+u5hO2ZnOyEse2ZlCDthqDquIAgKHBvb2wg7JuM7LukIOyDneyEsS/soJzqsbAgJiBEQuydmCBhY3RpdmUg7ZWE65OcIOyXheuNsOydtO2KuClcbiAgICpcbiAgICogQHJldHVybnMg7Yag7YGwIO2ZnOyEse2ZlCDsl6zrtoBcbiAgICovXG4gIEBhcGkoeyBodHRwTWV0aG9kOiBcIlBPU1RcIiwgY2xpZW50czogW1wiYXhpb3NcIiwgXCJ0YW5zdGFjay1tdXRhdGlvblwiXSB9KVxuICBhc3luYyB0b2dnbGVUb2tlbihpZDogbnVtYmVyKTogUHJvbWlzZTx7IGFjdGl2ZTogYm9vbGVhbiB9PiB7XG4gICAgY29uc3QgcG9vbCA9IGdldFBvb2woKTtcbiAgICBjb25zdCBlbnRyeSA9IGF3YWl0IFRva2VuTW9kZWwuZmluZE9uZShcIkFcIiwgeyBpZCB9KTtcbiAgICBpZiAoIWVudHJ5KSByZXR1cm4geyBhY3RpdmU6IGZhbHNlIH07XG5cbiAgICBjb25zdCBuZXdBY3RpdmUgPSAhZW50cnkuYWN0aXZlO1xuICAgIGF3YWl0IFRva2VuTW9kZWwuc2F2ZShbeyBpZCwgdG9rZW46IGVudHJ5LnRva2VuLCBhY3RpdmU6IG5ld0FjdGl2ZSwgbmFtZTogZW50cnkubmFtZSB9XSk7XG5cbiAgICAvLyDthqDtgbDsnZgg7IOI66Gc7Jq0IOyDge2DnOqwgCDtmZzshLHtmZTrqbQv67mE7Zmc7ISx7ZmU66m0XG4gICAgaWYgKG5ld0FjdGl2ZSkge1xuICAgICAgLy8g7JuM7LukIOyDneyEsVxuICAgICAgcG9vbC5jcmVhdGVXb3JrZXJzKGVudHJ5LnRva2VuLCBlbnRyeS5uYW1lKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8g7JuM7LukIOygnOqxsFxuICAgICAgcG9vbC5kZXN0cm95V29ya2VycyhlbnRyeS50b2tlbik7XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgYWN0aXZlOiBuZXdBY3RpdmUgfTtcbiAgfVxuXG4gIC8vIE9BdXRoIOuhnOq3uOyduDogYXV0aFVybCDsg53shLEgKO2UhOuhoO2KuOyXkOyEnCDsnbQgQVBJIO2YuOy2nCDtm4QgYXV0aFVybOuhnCDrpqzri6TsnbTroIntirgpXG4gIEBhcGkoeyBodHRwTWV0aG9kOiBcIlBPU1RcIiwgY2xpZW50czogW1wiYXhpb3NcIiwgXCJ0YW5zdGFjay1tdXRhdGlvblwiXSB9KVxuICBhc3luYyBvYXV0aFN0YXJ0KG5hbWU6IHN0cmluZyk6IFByb21pc2U8T0F1dGhTdGFydFJlc3VsdD4ge1xuICAgIGNvbnN0IHsgY29kZVZlcmlmaWVyLCBjb2RlQ2hhbGxlbmdlLCBzdGF0ZSB9ID0gZ2VuZXJhdGVQS0NFKCk7XG5cbiAgICBjb25zdCBzZXJ2ZXJQb3J0ID0gcHJvY2Vzcy5lbnYuUE9SVCA/PyBcIjQ0OTAwXCI7XG4gICAgY29uc3QgcmVkaXJlY3RVcmkgPSBgaHR0cDovL2xvY2FsaG9zdDoke3NlcnZlclBvcnR9L2NhbGxiYWNrYDtcbiAgICBjb25zdCBhdXRoVXJsID0gYnVpbGRBdXRoVXJsKGNvZGVDaGFsbGVuZ2UsIHN0YXRlLCByZWRpcmVjdFVyaSk7XG5cbiAgICAvLyBQS0NF66W8IOuplOuqqOumrOyXkCDsoIDsnqUgKDXrtoQgVFRMKVxuICAgIHBlbmRpbmdPQXV0aC5zZXQoc3RhdGUsIHsgY29kZVZlcmlmaWVyLCBuYW1lLCByZWRpcmVjdFVyaSB9KTtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHBlbmRpbmdPQXV0aC5kZWxldGUoc3RhdGUpLCAzMDBfMDAwKTtcblxuICAgIHJldHVybiB7IGF1dGhVcmwgfTtcbiAgfVxuXG4gIC8vIE9BdXRoIOy9nOuwsSDsspjrpqwg4oCUIHNvbmFtdS5jb25maWcudHPsnZggY3VzdG9tIOudvOyasO2KuOyXkOyEnCDtmLjstpzrkKhcbiAgYXN5bmMgaGFuZGxlT0F1dGhDYWxsYmFjayhjb2RlOiBzdHJpbmcsIHN0YXRlOiBzdHJpbmcsIHJlcGx5OiBGYXN0aWZ5UmVwbHkpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBwb29sID0gZ2V0UG9vbCgpO1xuICAgIGNvbnN0IHBlbmRpbmcgPSBwZW5kaW5nT0F1dGguZ2V0KHN0YXRlKTtcbiAgICBpZiAoIXBlbmRpbmcpIHtcbiAgICAgIHJldHVybiByZXBseS5yZWRpcmVjdChcIi8/b2F1dGg9ZXJyb3ImcmVhc29uPWludmFsaWRfc3RhdGVcIik7XG4gICAgfVxuICAgIHBlbmRpbmdPQXV0aC5kZWxldGUoc3RhdGUpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHRva2VucyA9IGF3YWl0IGV4Y2hhbmdlQ29kZUZvclRva2VucyhcbiAgICAgICAgY29kZSxcbiAgICAgICAgcGVuZGluZy5jb2RlVmVyaWZpZXIsXG4gICAgICAgIHN0YXRlLFxuICAgICAgICBwZW5kaW5nLnJlZGlyZWN0VXJpLFxuICAgICAgKTtcblxuICAgICAgLy8g6rCZ7J2AIOqzhOygleydmCDsnbTsoIQg7Yag7YGw7J20IOyeiOycvOuptCDqtZDssrRcbiAgICAgIGlmICh0b2tlbnMuYWNjb3VudFV1aWQpIHtcbiAgICAgICAgY29uc3Qgb2xkRW50cmllcyA9IGF3YWl0IFRva2VuTW9kZWwuZmluZEJ5QWNjb3VudFV1aWQoXCJBXCIsIHRva2Vucy5hY2NvdW50VXVpZCk7XG4gICAgICAgIGZvciAoY29uc3Qgb2xkIG9mIG9sZEVudHJpZXMpIHtcbiAgICAgICAgICBwb29sLmRlc3Ryb3lXb3JrZXJzKG9sZC50b2tlbik7XG4gICAgICAgICAgYXdhaXQgVG9rZW5Nb2RlbC5kZWwoW29sZC5pZF0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIOyDiCDthqDtgbAg7KCA7J6lICsgcG9vbOyXkCDrk7HroZ1cbiAgICAgIGF3YWl0IFRva2VuTW9kZWwuc2F2ZShbXG4gICAgICAgIHtcbiAgICAgICAgICB0b2tlbjogdG9rZW5zLmFjY2Vzc1Rva2VuLFxuICAgICAgICAgIG5hbWU6IHBlbmRpbmcubmFtZSxcbiAgICAgICAgICByZWZyZXNoX3Rva2VuOiB0b2tlbnMucmVmcmVzaFRva2VuLFxuICAgICAgICAgIGV4cGlyZXNfYXQ6IHRva2Vucy5leHBpcmVzQXQgPyBCaWdJbnQodG9rZW5zLmV4cGlyZXNBdCkgOiBudWxsLFxuICAgICAgICAgIGFjY291bnRfdXVpZDogdG9rZW5zLmFjY291bnRVdWlkLFxuICAgICAgICB9LFxuICAgICAgXSk7XG4gICAgICBwb29sLmNyZWF0ZVdvcmtlcnModG9rZW5zLmFjY2Vzc1Rva2VuLCBwZW5kaW5nLm5hbWUpO1xuXG4gICAgICByZXR1cm4gcmVwbHkucmVkaXJlY3QoYC8/b2F1dGg9c3VjY2VzcyZuYW1lPSR7ZW5jb2RlVVJJQ29tcG9uZW50KHBlbmRpbmcubmFtZSl9YCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgcmV0dXJuIHJlcGx5LnJlZGlyZWN0KGAvP29hdXRoPWVycm9yJnJlYXNvbj0ke2VuY29kZVVSSUNvbXBvbmVudCgoZSBhcyBFcnJvcikubWVzc2FnZSl9YCk7XG4gICAgfVxuICB9XG5cbiAgLy8g7Yag7YGwIOyCrOyaqeufiSDsobDtmowgKE9BdXRoIHVzYWdlIEFQSSlcbiAgQGFwaSh7IGh0dHBNZXRob2Q6IFwiR0VUXCIsIGNsaWVudHM6IFtcImF4aW9zXCIsIFwidGFuc3RhY2stcXVlcnlcIl0gfSlcbiAgYXN5bmMgdXNhZ2UodG9rZW5OYW1lPzogc3RyaW5nKTogUHJvbWlzZTxVc2FnZVJlc3BvbnNlPiB7XG4gICAgY29uc3QgcG9vbCA9IGdldFBvb2woKTtcbiAgICBjb25zdCB7IHJvd3M6IGFsbFRva2VucyB9ID0gYXdhaXQgVG9rZW5Nb2RlbC5maW5kTWFueShcIkFcIik7XG4gICAgY29uc3QgZW50cnkgPSB0b2tlbk5hbWVcbiAgICAgID8gYWxsVG9rZW5zLmZpbmQoKGUpID0+IGUubmFtZSA9PT0gdG9rZW5OYW1lKVxuICAgICAgOiBhbGxUb2tlbnMuZmluZExhc3QoKGUpID0+IGUuYWN0aXZlKTtcblxuICAgIGlmICghZW50cnkpIHJldHVybiB7IGVycm9yOiBcIk5PVF9GT1VORFwiIH07XG5cbiAgICAvLyDrp4zro4wg7ZmV7J24ICsgcmVmcmVzaCDsi5zrj4RcbiAgICBsZXQgYWNjZXNzVG9rZW4gPSBlbnRyeS50b2tlbjtcbiAgICBjb25zdCBpc0V4cGlyZWQgPSBlbnRyeS5leHBpcmVzX2F0ICYmIE51bWJlcihlbnRyeS5leHBpcmVzX2F0KSA8IERhdGUubm93KCk7XG5cbiAgICBpZiAoaXNFeHBpcmVkICYmIGVudHJ5LnJlZnJlc2hfdG9rZW4pIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGFjY2Vzc1Rva2VuID0gYXdhaXQgdGhpcy5yZWZyZXNoVG9rZW4ocG9vbCwgZW50cnkpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjb25zb2xlLndhcm4oYFt1c2FnZV0gcmVmcmVzaCBmYWlsZWQgZm9yICR7ZW50cnkubmFtZX06ICR7KGUgYXMgRXJyb3IpLm1lc3NhZ2V9YCk7XG4gICAgICAgIHJldHVybiB7IGVycm9yOiBcInJlLWxvZ2luIHJlcXVpcmVkXCIgfTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyB1c2FnZSDtmLjstpxcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBmZXRjaFVzYWdlKGFjY2Vzc1Rva2VuKTtcblxuICAgIC8vIOyduOymnSDsl5Drn6zrqbQgcmVmcmVzaF90b2tlbuycvOuhnCDsnqzsi5zrj4RcbiAgICBpZiAocmVzdWx0LmVycm9yICYmIGVudHJ5LnJlZnJlc2hfdG9rZW4pIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGFjY2Vzc1Rva2VuID0gYXdhaXQgdGhpcy5yZWZyZXNoVG9rZW4ocG9vbCwgZW50cnkpO1xuICAgICAgICByZXR1cm4gYXdhaXQgZmV0Y2hVc2FnZShhY2Nlc3NUb2tlbik7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihgW3VzYWdlXSByZWZyZXNoIGZhaWxlZCBmb3IgJHtlbnRyeS5uYW1lfTogJHsoZSBhcyBFcnJvcikubWVzc2FnZX1gKTtcbiAgICAgICAgcmV0dXJuIHsgZXJyb3I6IFwicmUtbG9naW4gcmVxdWlyZWRcIiB9O1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBhc3luYyByZWZyZXNoVG9rZW4ocG9vbDogQ2xhdWRlUG9vbCwgdG9rZW46IFJlZnJlc2hUb2tlblBhcmFtcyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgaWYgKCF0b2tlbi5yZWZyZXNoX3Rva2VuKSB0aHJvdyBuZXcgRXJyb3IoXCJObyByZWZyZXNoIHRva2VuXCIpO1xuICAgIGNvbnN0IHJlZnJlc2hlZCA9IGF3YWl0IHJlZnJlc2hBY2Nlc3NUb2tlbih0b2tlbi5yZWZyZXNoX3Rva2VuKTtcbiAgICBhd2FpdCBUb2tlbk1vZGVsLnNhdmUoW1xuICAgICAge1xuICAgICAgICBpZDogdG9rZW4uaWQsXG4gICAgICAgIHRva2VuOiByZWZyZXNoZWQuYWNjZXNzVG9rZW4sXG4gICAgICAgIHJlZnJlc2hfdG9rZW46IHJlZnJlc2hlZC5yZWZyZXNoVG9rZW4sXG4gICAgICAgIGV4cGlyZXNfYXQ6IEJpZ0ludChyZWZyZXNoZWQuZXhwaXJlc0F0KSxcbiAgICAgICAgbmFtZTogdG9rZW4ubmFtZSA/PyBcIlwiLFxuICAgICAgfSxcbiAgICBdKTtcbiAgICBwb29sLmRlc3Ryb3lXb3JrZXJzKHRva2VuLnRva2VuKTtcbiAgICBwb29sLmNyZWF0ZVdvcmtlcnMocmVmcmVzaGVkLmFjY2Vzc1Rva2VuLCB0b2tlbi5uYW1lKTtcbiAgICByZXR1cm4gcmVmcmVzaGVkLmFjY2Vzc1Rva2VuO1xuICB9XG5cbiAgQGFwaSh7IGh0dHBNZXRob2Q6IFwiR0VUXCIsIGNsaWVudHM6IFtcImF4aW9zXCIsIFwidGFuc3RhY2stcXVlcnlcIl0gfSlcbiAgYXN5bmMgaGVhbHRoKCk6IFByb21pc2U8SGVhbHRoUmVzcG9uc2U+IHtcbiAgICBjb25zdCBwb29sID0gZ2V0UG9vbCgpO1xuICAgIHJldHVybiB7XG4gICAgICBzdGF0dXM6IFwib2tcIixcbiAgICAgIHdvcmtlcnM6IFsuLi5wb29sLndvcmtlcnMudmFsdWVzKCldLmZsYXQoKS5sZW5ndGgsXG4gICAgICBhY3RpdmVUb2tlbnM6IHBvb2wud29ya2Vycy5zaXplIC0gcG9vbC5xdW90YUV4aGF1c3RlZC5zaXplLFxuICAgIH07XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IFFncmlkRnJhbWUgPSBuZXcgUWdyaWRGcmFtZUNsYXNzKCk7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQXVCQSxNQUFNLCtCQUFlLElBQUksS0FBMEU7QUFFbkcsSUFBTSxrQkFBTixjQUE4QixlQUFlO0NB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
296
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicWdyaWQuZnJhbWUuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2FwcGxpY2F0aW9uL3FncmlkL3FncmlkLmZyYW1lLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHR5cGUgRmFzdGlmeVJlcGx5IH0gZnJvbSBcImZhc3RpZnlcIjtcbmltcG9ydCB7IGFwaSwgQmFzZUZyYW1lQ2xhc3MgfSBmcm9tIFwic29uYW11XCI7XG5cbmltcG9ydCB7IE1JQ1JPX1VTRCwgUmVxdWVzdExvZ01vZGVsIH0gZnJvbSBcIi4uL3JlcXVlc3QtbG9nL3JlcXVlc3QtbG9nLm1vZGVsXCI7XG5pbXBvcnQgeyBUb2tlbk1vZGVsIH0gZnJvbSBcIi4uL3Rva2VuL3Rva2VuLm1vZGVsXCI7XG5pbXBvcnQgeyB0eXBlIFJlZnJlc2hUb2tlblBhcmFtcyB9IGZyb20gXCIuLi90b2tlbi90b2tlbi50eXBlc1wiO1xuaW1wb3J0IHtcbiAgYnVpbGRBdXRoVXJsLFxuICBleGNoYW5nZUNvZGVGb3JUb2tlbnMsXG4gIGZldGNoVXNhZ2UsXG4gIGdlbmVyYXRlUEtDRSxcbiAgcmVmcmVzaEFjY2Vzc1Rva2VuLFxufSBmcm9tIFwiLi9vYXV0aFwiO1xuaW1wb3J0IHsgUWdyaWREaXNwYXRjaGVyIH0gZnJvbSBcIi4vcWdyaWQuZGlzcGF0Y2hlclwiO1xuaW1wb3J0IHtcbiAgdHlwZSBDbGlSZXN1bHQsXG4gIHR5cGUgSGVhbHRoUmVzcG9uc2UsXG4gIHR5cGUgT0F1dGhTdGFydFJlc3VsdCxcbiAgdHlwZSBUb2tlblN0YXRzLFxuICB0eXBlIFVzYWdlUmVzcG9uc2UsXG59IGZyb20gXCIuL3FncmlkLnR5cGVzXCI7XG5cbmNvbnN0IHBlbmRpbmdPQXV0aCA9IG5ldyBNYXA8c3RyaW5nLCB7IGNvZGVWZXJpZmllcjogc3RyaW5nOyBuYW1lOiBzdHJpbmc7IHJlZGlyZWN0VXJpOiBzdHJpbmcgfT4oKTtcblxuY2xhc3MgUWdyaWRGcmFtZUNsYXNzIGV4dGVuZHMgQmFzZUZyYW1lQ2xhc3Mge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcihcIlFncmlkXCIpO1xuICB9XG5cbiAgQGFwaSh7IGh0dHBNZXRob2Q6IFwiUE9TVFwiLCBjbGllbnRzOiBbXCJheGlvc1wiLCBcInRhbnN0YWNrLW11dGF0aW9uXCJdIH0pXG4gIGFzeW5jIHF1ZXJ5KFxuICAgIHByb21wdDogc3RyaW5nLFxuICAgIHN5c3RlbT86IHN0cmluZyxcbiAgICB0aW1lb3V0PzogbnVtYmVyLFxuICAgIG1vZGVsPzogc3RyaW5nLFxuICAgIHByb2plY3ROYW1lPzogc3RyaW5nLFxuICApOiBQcm9taXNlPENsaVJlc3VsdD4ge1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IFFncmlkRGlzcGF0Y2hlci5xdWVyeSh7IHN5c3RlbSwgcHJvbXB0LCBtb2RlbCB9LCB0aW1lb3V0KTtcblxuICAgIFJlcXVlc3RMb2dNb2RlbC5zYXZlKFtcbiAgICAgIHtcbiAgICAgICAgdG9rZW5fbmFtZTogcmVzdWx0LnRva2VuTmFtZSxcbiAgICAgICAgcHJvamVjdF9uYW1lOiBwcm9qZWN0TmFtZSAmJiBwcm9qZWN0TmFtZS5sZW5ndGggPiAwID8gcHJvamVjdE5hbWUgOiBudWxsLFxuICAgICAgICBtb2RlbF9uYW1lOiByZXN1bHQubW9kZWwgPz8gbnVsbCxcbiAgICAgICAgdXNlcl9wcm9tcHQ6IHByb21wdCxcbiAgICAgICAgc3lzdGVtX3Byb21wdDogc3lzdGVtID8/IG51bGwsXG4gICAgICAgIHJlc3BvbnNlOiByZXN1bHQudGV4dCxcbiAgICAgICAgaW5wdXRfdG9rZW5zOiByZXN1bHQudXNhZ2UuaW5wdXRfdG9rZW5zLFxuICAgICAgICBvdXRwdXRfdG9rZW5zOiByZXN1bHQudXNhZ2Uub3V0cHV0X3Rva2VucyxcbiAgICAgICAgY2FjaGVfcmVhZF90b2tlbnM6IHJlc3VsdC51c2FnZS5jYWNoZV9yZWFkX2lucHV0X3Rva2VucyxcbiAgICAgICAgY2FjaGVfY3JlYXRpb25fdG9rZW5zOiByZXN1bHQudXNhZ2UuY2FjaGVfY3JlYXRpb25faW5wdXRfdG9rZW5zLFxuICAgICAgICBkdXJhdGlvbl9tczogcmVzdWx0LmR1cmF0aW9uTXMsXG4gICAgICAgIGNvc3RfdXNkOiByZXN1bHQuY29zdFVzZCAhPT0gbnVsbCA/IE1hdGgucm91bmQocmVzdWx0LmNvc3RVc2QgKiBNSUNST19VU0QpIDogbnVsbCxcbiAgICAgIH0sXG4gICAgXSkuY2F0Y2goKGUpID0+IGNvbnNvbGUuZXJyb3IoXCJyZXF1ZXN0TG9nIHNhdmUgZmFpbGVkOlwiLCBlKSk7XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgQGFwaSh7IGh0dHBNZXRob2Q6IFwiR0VUXCIsIGNsaWVudHM6IFtcImF4aW9zXCIsIFwidGFuc3RhY2stcXVlcnlcIl0gfSlcbiAgYXN5bmMgc3RhdHMoKTogUHJvbWlzZTxUb2tlblN0YXRzW10+IHtcbiAgICByZXR1cm4gUWdyaWREaXNwYXRjaGVyLmdldFN0YXRzKCk7XG4gIH1cblxuICBAYXBpKHsgaHR0cE1ldGhvZDogXCJHRVRcIiwgY2xpZW50czogW1wiYXhpb3NcIiwgXCJ0YW5zdGFjay1xdWVyeVwiXSB9KVxuICBhc3luYyB0b3RhbENvc3QodG9rZW5OYW1lPzogc3RyaW5nKTogUHJvbWlzZTx7IHVzZDogbnVtYmVyIH0+IHtcbiAgICByZXR1cm4geyB1c2Q6IGF3YWl0IFJlcXVlc3RMb2dNb2RlbC50b3RhbENvc3QoeyB0b2tlbl9uYW1lOiB0b2tlbk5hbWUgfSkgfTtcbiAgfVxuXG4gIEBhcGkoeyBodHRwTWV0aG9kOiBcIkdFVFwiLCBjbGllbnRzOiBbXCJheGlvc1wiLCBcInRhbnN0YWNrLXF1ZXJ5XCJdIH0pXG4gIGFzeW5jIHByb2plY3ROYW1lcygpOiBQcm9taXNlPHsgbmFtZXM6IHN0cmluZ1tdIH0+IHtcbiAgICByZXR1cm4geyBuYW1lczogYXdhaXQgUmVxdWVzdExvZ01vZGVsLmRpc3RpbmN0UHJvamVjdE5hbWVzKCkgfTtcbiAgfVxuXG4gIEBhcGkoeyBodHRwTWV0aG9kOiBcIlBPU1RcIiwgY2xpZW50czogW1wiYXhpb3NcIiwgXCJ0YW5zdGFjay1tdXRhdGlvblwiXSB9KVxuICBhc3luYyBhZGRUb2tlbih0b2tlbjogc3RyaW5nLCBuYW1lOiBzdHJpbmcsIHJlZnJlc2hUb2tlbj86IHN0cmluZyk6IFByb21pc2U8eyBhZGRlZDogYm9vbGVhbiB9PiB7XG4gICAgYXdhaXQgVG9rZW5Nb2RlbC5zYXZlKFtcbiAgICAgIHtcbiAgICAgICAgdG9rZW4sXG4gICAgICAgIG5hbWUsXG4gICAgICAgIC4uLihyZWZyZXNoVG9rZW4gJiYgcmVmcmVzaFRva2VuLmxlbmd0aCA+IDAgPyB7IHJlZnJlc2hfdG9rZW46IHJlZnJlc2hUb2tlbiB9IDoge30pLFxuICAgICAgfSxcbiAgICBdKTtcbiAgICBRZ3JpZERpc3BhdGNoZXIuYWRkVG9rZW4odG9rZW4sIG5hbWUpO1xuICAgIHJldHVybiB7IGFkZGVkOiB0cnVlIH07XG4gIH1cblxuICBAYXBpKHsgaHR0cE1ldGhvZDogXCJQT1NUXCIsIGNsaWVudHM6IFtcImF4aW9zXCIsIFwidGFuc3RhY2stbXV0YXRpb25cIl0gfSlcbiAgYXN5bmMgdXBkYXRlVG9rZW4oXG4gICAgdG9rZW46IHN0cmluZyxcbiAgICBuYW1lPzogc3RyaW5nLFxuICAgIG5ld1Rva2VuPzogc3RyaW5nLFxuICAgIHJlZnJlc2hUb2tlbj86IHN0cmluZyxcbiAgKTogUHJvbWlzZTx7IHVwZGF0ZWQ6IGJvb2xlYW4gfT4ge1xuICAgIGNvbnN0IGVudHJ5ID0gYXdhaXQgVG9rZW5Nb2RlbC5maW5kQnlUb2tlbihcIkFcIiwgdG9rZW4pO1xuICAgIGlmICghZW50cnkpIHJldHVybiB7IHVwZGF0ZWQ6IGZhbHNlIH07XG5cbiAgICBjb25zdCBoYXNOZXdUb2tlbiA9IG5ld1Rva2VuICE9PSB1bmRlZmluZWQgJiYgbmV3VG9rZW4ubGVuZ3RoID4gMDtcbiAgICBjb25zdCBoYXNSZWZyZXNoVG9rZW4gPSByZWZyZXNoVG9rZW4gIT09IHVuZGVmaW5lZCAmJiByZWZyZXNoVG9rZW4ubGVuZ3RoID4gMDtcbiAgICBhd2FpdCBUb2tlbk1vZGVsLnNhdmUoW1xuICAgICAge1xuICAgICAgICBpZDogZW50cnkuaWQsXG4gICAgICAgIHRva2VuOiBoYXNOZXdUb2tlbiA/IG5ld1Rva2VuIDogZW50cnkudG9rZW4sXG4gICAgICAgIG5hbWU6IG5hbWUgIT09IHVuZGVmaW5lZCA/IG5hbWUgOiBlbnRyeS5uYW1lLFxuICAgICAgICAuLi4oaGFzUmVmcmVzaFRva2VuID8geyByZWZyZXNoX3Rva2VuOiByZWZyZXNoVG9rZW4gfSA6IHt9KSxcbiAgICAgIH0sXG4gICAgXSk7XG5cbiAgICBpZiAoaGFzTmV3VG9rZW4pIHtcbiAgICAgIFFncmlkRGlzcGF0Y2hlci5yZW1vdmVUb2tlbih0b2tlbik7XG4gICAgICBRZ3JpZERpc3BhdGNoZXIuYWRkVG9rZW4obmV3VG9rZW4sIG5hbWUgPz8gZW50cnkubmFtZSk7XG4gICAgfVxuICAgIHJldHVybiB7IHVwZGF0ZWQ6IHRydWUgfTtcbiAgfVxuXG4gIEBhcGkoeyBodHRwTWV0aG9kOiBcIlBPU1RcIiwgY2xpZW50czogW1wiYXhpb3NcIiwgXCJ0YW5zdGFjay1tdXRhdGlvblwiXSB9KVxuICBhc3luYyByZW1vdmVUb2tlbih0b2tlbjogc3RyaW5nKTogUHJvbWlzZTx7IHJlbW92ZWQ6IGJvb2xlYW4gfT4ge1xuICAgIGlmICghUWdyaWREaXNwYXRjaGVyLmhhc1Rva2VuKHRva2VuKSkgcmV0dXJuIHsgcmVtb3ZlZDogZmFsc2UgfTtcblxuICAgIGNvbnN0IGVudHJ5ID0gYXdhaXQgVG9rZW5Nb2RlbC5maW5kQnlUb2tlbihcIkFcIiwgdG9rZW4pO1xuICAgIGlmIChlbnRyeSkgYXdhaXQgVG9rZW5Nb2RlbC5kZWwoW2VudHJ5LmlkXSk7XG4gICAgUWdyaWREaXNwYXRjaGVyLnJlbW92ZVRva2VuKHRva2VuKTtcbiAgICByZXR1cm4geyByZW1vdmVkOiB0cnVlIH07XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIGlkIHRva2VuX2lkXG4gICAqIO2GoO2BsCDtmZzshLHtmZQv67mE7Zmc7ISx7ZmUIO2GoOq4gCAoZGlzcGF0Y2hlciDrk7HroZ0v7KCc6rGwICYgRELsnZggYWN0aXZlIO2VhOuTnCDsl4XrjbDsnbTtirgpXG4gICAqIEByZXR1cm5zIO2GoO2BsCDtmZzshLHtmZQg7Jes67aAXG4gICAqL1xuICBAYXBpKHsgaHR0cE1ldGhvZDogXCJQT1NUXCIsIGNsaWVudHM6IFtcImF4aW9zXCIsIFwidGFuc3RhY2stbXV0YXRpb25cIl0gfSlcbiAgYXN5bmMgdG9nZ2xlVG9rZW4oaWQ6IG51bWJlcik6IFByb21pc2U8eyBhY3RpdmU6IGJvb2xlYW4gfT4ge1xuICAgIGNvbnN0IGVudHJ5ID0gYXdhaXQgVG9rZW5Nb2RlbC5maW5kT25lKFwiQVwiLCB7IGlkIH0pO1xuICAgIGlmICghZW50cnkpIHJldHVybiB7IGFjdGl2ZTogZmFsc2UgfTtcblxuICAgIGNvbnN0IG5ld0FjdGl2ZSA9ICFlbnRyeS5hY3RpdmU7XG4gICAgYXdhaXQgVG9rZW5Nb2RlbC5zYXZlKFt7IGlkLCB0b2tlbjogZW50cnkudG9rZW4sIGFjdGl2ZTogbmV3QWN0aXZlLCBuYW1lOiBlbnRyeS5uYW1lIH1dKTtcblxuICAgIGlmIChuZXdBY3RpdmUpIHtcbiAgICAgIFFncmlkRGlzcGF0Y2hlci5hZGRUb2tlbihlbnRyeS50b2tlbiwgZW50cnkubmFtZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIFFncmlkRGlzcGF0Y2hlci5yZW1vdmVUb2tlbihlbnRyeS50b2tlbik7XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgYWN0aXZlOiBuZXdBY3RpdmUgfTtcbiAgfVxuXG4gIEBhcGkoeyBodHRwTWV0aG9kOiBcIlBPU1RcIiwgY2xpZW50czogW1wiYXhpb3NcIiwgXCJ0YW5zdGFjay1tdXRhdGlvblwiXSB9KVxuICBhc3luYyBvYXV0aFN0YXJ0KG5hbWU6IHN0cmluZyk6IFByb21pc2U8T0F1dGhTdGFydFJlc3VsdD4ge1xuICAgIGNvbnN0IHsgY29kZVZlcmlmaWVyLCBjb2RlQ2hhbGxlbmdlLCBzdGF0ZSB9ID0gZ2VuZXJhdGVQS0NFKCk7XG5cbiAgICBjb25zdCBzZXJ2ZXJQb3J0ID0gcHJvY2Vzcy5lbnYuUE9SVCA/PyBcIjQ0OTAwXCI7XG4gICAgY29uc3QgcmVkaXJlY3RVcmkgPSBgaHR0cDovL2xvY2FsaG9zdDoke3NlcnZlclBvcnR9L2NhbGxiYWNrYDtcbiAgICBjb25zdCBhdXRoVXJsID0gYnVpbGRBdXRoVXJsKGNvZGVDaGFsbGVuZ2UsIHN0YXRlLCByZWRpcmVjdFVyaSk7XG5cbiAgICBwZW5kaW5nT0F1dGguc2V0KHN0YXRlLCB7IGNvZGVWZXJpZmllciwgbmFtZSwgcmVkaXJlY3RVcmkgfSk7XG4gICAgc2V0VGltZW91dCgoKSA9PiBwZW5kaW5nT0F1dGguZGVsZXRlKHN0YXRlKSwgMzAwXzAwMCk7XG5cbiAgICByZXR1cm4geyBhdXRoVXJsIH07XG4gIH1cblxuICBhc3luYyBoYW5kbGVPQXV0aENhbGxiYWNrKGNvZGU6IHN0cmluZywgc3RhdGU6IHN0cmluZywgcmVwbHk6IEZhc3RpZnlSZXBseSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHBlbmRpbmcgPSBwZW5kaW5nT0F1dGguZ2V0KHN0YXRlKTtcbiAgICBpZiAoIXBlbmRpbmcpIHtcbiAgICAgIHJldHVybiByZXBseS5yZWRpcmVjdChcIi8/b2F1dGg9ZXJyb3ImcmVhc29uPWludmFsaWRfc3RhdGVcIik7XG4gICAgfVxuICAgIHBlbmRpbmdPQXV0aC5kZWxldGUoc3RhdGUpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHRva2VucyA9IGF3YWl0IGV4Y2hhbmdlQ29kZUZvclRva2VucyhcbiAgICAgICAgY29kZSxcbiAgICAgICAgcGVuZGluZy5jb2RlVmVyaWZpZXIsXG4gICAgICAgIHN0YXRlLFxuICAgICAgICBwZW5kaW5nLnJlZGlyZWN0VXJpLFxuICAgICAgKTtcblxuICAgICAgaWYgKHRva2Vucy5hY2NvdW50VXVpZCkge1xuICAgICAgICBjb25zdCBvbGRFbnRyaWVzID0gYXdhaXQgVG9rZW5Nb2RlbC5maW5kQnlBY2NvdW50VXVpZChcIkFcIiwgdG9rZW5zLmFjY291bnRVdWlkKTtcbiAgICAgICAgaWYgKG9sZEVudHJpZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGZvciAoY29uc3Qgb2xkIG9mIG9sZEVudHJpZXMpIFFncmlkRGlzcGF0Y2hlci5yZW1vdmVUb2tlbihvbGQudG9rZW4pO1xuICAgICAgICAgIGF3YWl0IFRva2VuTW9kZWwuZGVsKG9sZEVudHJpZXMubWFwKChvKSA9PiBvLmlkKSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgYXdhaXQgVG9rZW5Nb2RlbC5zYXZlKFtcbiAgICAgICAge1xuICAgICAgICAgIHRva2VuOiB0b2tlbnMuYWNjZXNzVG9rZW4sXG4gICAgICAgICAgbmFtZTogcGVuZGluZy5uYW1lLFxuICAgICAgICAgIHJlZnJlc2hfdG9rZW46IHRva2Vucy5yZWZyZXNoVG9rZW4sXG4gICAgICAgICAgZXhwaXJlc19hdDogdG9rZW5zLmV4cGlyZXNBdCA/IEJpZ0ludCh0b2tlbnMuZXhwaXJlc0F0KSA6IG51bGwsXG4gICAgICAgICAgYWNjb3VudF91dWlkOiB0b2tlbnMuYWNjb3VudFV1aWQsXG4gICAgICAgIH0sXG4gICAgICBdKTtcbiAgICAgIFFncmlkRGlzcGF0Y2hlci5hZGRUb2tlbih0b2tlbnMuYWNjZXNzVG9rZW4sIHBlbmRpbmcubmFtZSk7XG5cbiAgICAgIHJldHVybiByZXBseS5yZWRpcmVjdChgLz9vYXV0aD1zdWNjZXNzJm5hbWU9JHtlbmNvZGVVUklDb21wb25lbnQocGVuZGluZy5uYW1lKX1gKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICByZXR1cm4gcmVwbHkucmVkaXJlY3QoYC8/b2F1dGg9ZXJyb3ImcmVhc29uPSR7ZW5jb2RlVVJJQ29tcG9uZW50KChlIGFzIEVycm9yKS5tZXNzYWdlKX1gKTtcbiAgICB9XG4gIH1cblxuICBAYXBpKHsgaHR0cE1ldGhvZDogXCJHRVRcIiwgY2xpZW50czogW1wiYXhpb3NcIiwgXCJ0YW5zdGFjay1xdWVyeVwiXSB9KVxuICBhc3luYyB1c2FnZSh0b2tlbk5hbWU/OiBzdHJpbmcpOiBQcm9taXNlPFVzYWdlUmVzcG9uc2U+IHtcbiAgICBjb25zdCB7IHJvd3M6IGFsbFRva2VucyB9ID0gYXdhaXQgVG9rZW5Nb2RlbC5maW5kTWFueShcIkFcIik7XG4gICAgY29uc3QgZW50cnkgPSB0b2tlbk5hbWVcbiAgICAgID8gYWxsVG9rZW5zLmZpbmQoKGUpID0+IGUubmFtZSA9PT0gdG9rZW5OYW1lKVxuICAgICAgOiBhbGxUb2tlbnMuZmluZExhc3QoKGUpID0+IGUuYWN0aXZlKTtcblxuICAgIGlmICghZW50cnkpIHJldHVybiB7IGVycm9yOiBcIk5PVF9GT1VORFwiIH07XG5cbiAgICBsZXQgYWNjZXNzVG9rZW4gPSBlbnRyeS50b2tlbjtcbiAgICBjb25zdCBpc0V4cGlyZWQgPSBlbnRyeS5leHBpcmVzX2F0ICYmIE51bWJlcihlbnRyeS5leHBpcmVzX2F0KSA8IERhdGUubm93KCk7XG5cbiAgICBpZiAoaXNFeHBpcmVkICYmIGVudHJ5LnJlZnJlc2hfdG9rZW4pIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGFjY2Vzc1Rva2VuID0gYXdhaXQgdGhpcy5yZWZyZXNoVG9rZW4oZW50cnkpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjb25zb2xlLndhcm4oYFt1c2FnZV0gcmVmcmVzaCBmYWlsZWQgZm9yICR7ZW50cnkubmFtZX06ICR7KGUgYXMgRXJyb3IpLm1lc3NhZ2V9YCk7XG4gICAgICAgIHJldHVybiB7IGVycm9yOiBcInJlLWxvZ2luIHJlcXVpcmVkXCIgfTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBmZXRjaFVzYWdlKGFjY2Vzc1Rva2VuKTtcblxuICAgIGlmIChyZXN1bHQuZXJyb3IgJiYgZW50cnkucmVmcmVzaF90b2tlbikge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYWNjZXNzVG9rZW4gPSBhd2FpdCB0aGlzLnJlZnJlc2hUb2tlbihlbnRyeSk7XG4gICAgICAgIHJldHVybiBhd2FpdCBmZXRjaFVzYWdlKGFjY2Vzc1Rva2VuKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY29uc29sZS53YXJuKGBbdXNhZ2VdIHJlZnJlc2ggZmFpbGVkIGZvciAke2VudHJ5Lm5hbWV9OiAkeyhlIGFzIEVycm9yKS5tZXNzYWdlfWApO1xuICAgICAgICByZXR1cm4geyBlcnJvcjogXCJyZS1sb2dpbiByZXF1aXJlZFwiIH07XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIGFzeW5jIHJlZnJlc2hUb2tlbih0b2tlbjogUmVmcmVzaFRva2VuUGFyYW1zKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBpZiAoIXRva2VuLnJlZnJlc2hfdG9rZW4pIHRocm93IG5ldyBFcnJvcihcIk5vIHJlZnJlc2ggdG9rZW5cIik7XG4gICAgY29uc3QgcmVmcmVzaGVkID0gYXdhaXQgcmVmcmVzaEFjY2Vzc1Rva2VuKHRva2VuLnJlZnJlc2hfdG9rZW4pO1xuICAgIGF3YWl0IFRva2VuTW9kZWwuc2F2ZShbXG4gICAgICB7XG4gICAgICAgIGlkOiB0b2tlbi5pZCxcbiAgICAgICAgdG9rZW46IHJlZnJlc2hlZC5hY2Nlc3NUb2tlbixcbiAgICAgICAgcmVmcmVzaF90b2tlbjogcmVmcmVzaGVkLnJlZnJlc2hUb2tlbixcbiAgICAgICAgZXhwaXJlc19hdDogQmlnSW50KHJlZnJlc2hlZC5leHBpcmVzQXQpLFxuICAgICAgICBuYW1lOiB0b2tlbi5uYW1lID8/IFwiXCIsXG4gICAgICB9LFxuICAgIF0pO1xuICAgIFFncmlkRGlzcGF0Y2hlci5yZW1vdmVUb2tlbih0b2tlbi50b2tlbik7XG4gICAgUWdyaWREaXNwYXRjaGVyLmFkZFRva2VuKHJlZnJlc2hlZC5hY2Nlc3NUb2tlbiwgdG9rZW4ubmFtZSk7XG4gICAgcmV0dXJuIHJlZnJlc2hlZC5hY2Nlc3NUb2tlbjtcbiAgfVxuXG4gIEBhcGkoeyBodHRwTWV0aG9kOiBcIkdFVFwiLCBjbGllbnRzOiBbXCJheGlvc1wiLCBcInRhbnN0YWNrLXF1ZXJ5XCJdIH0pXG4gIGFzeW5jIGhlYWx0aCgpOiBQcm9taXNlPEhlYWx0aFJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHsgc3RhdHVzOiBcIm9rXCIsIGFjdGl2ZVRva2VuczogUWdyaWREaXNwYXRjaGVyLnRva2Vucy5zaXplIH07XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IFFncmlkRnJhbWUgPSBuZXcgUWdyaWRGcmFtZUNsYXNzKCk7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQXNCQSxNQUFNLCtCQUFlLElBQUksS0FBMEU7QUFFbkcsSUFBTSxrQkFBTixjQUE4QixlQUFlO0NBQzNDLGNBQWM7QUFDWixRQUFNLFFBQVE7O0NBR2hCLE1BQ00sTUFDSixRQUNBLFFBQ0EsU0FDQSxPQUNBLGFBQ29CO0VBQ3BCLE1BQU0sU0FBUyxNQUFNLGdCQUFnQixNQUFNO0dBQUU7R0FBUTtHQUFRO0dBQU8sRUFBRSxRQUFRO0FBRTlFLGtCQUFnQixLQUFLLENBQ25CO0dBQ0UsWUFBWSxPQUFPO0dBQ25CLGNBQWMsZUFBZSxZQUFZLFNBQVMsSUFBSSxjQUFjO0dBQ3BFLFlBQVksT0FBTyxTQUFTO0dBQzVCLGFBQWE7R0FDYixlQUFlLFVBQVU7R0FDekIsVUFBVSxPQUFPO0dBQ2pCLGNBQWMsT0FBTyxNQUFNO0dBQzNCLGVBQWUsT0FBTyxNQUFNO0dBQzVCLG1CQUFtQixPQUFPLE1BQU07R0FDaEMsdUJBQXVCLE9BQU8sTUFBTTtHQUNwQyxhQUFhLE9BQU87R0FDcEIsVUFBVSxPQUFPLFlBQVksT0FBTyxLQUFLLE1BQU0sT0FBTyxVQUFVLFVBQVUsR0FBRztHQUM5RSxDQUNGLENBQUMsQ0FBQyxPQUFPLE1BQU0sUUFBUSxNQUFNLDJCQUEyQixFQUFFLENBQUM7QUFFNUQsU0FBTzs7Q0FHVCxNQUNNLFFBQStCO0FBQ25DLFNBQU8sZ0JBQWdCLFVBQVU7O0NBR25DLE1BQ00sVUFBVSxXQUE4QztBQUM1RCxTQUFPLEVB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
@@ -4,10 +4,13 @@ import { z } from "zod";
4
4
  const QueryInput = z.object({
5
5
  system: z.string().optional(),
6
6
  prompt: z.string(),
7
+ model: z.string().optional(),
7
8
  timeout: z.number().optional()
8
9
  });
9
10
  const CliResult = z.object({
10
11
  text: z.string(),
12
+ tokenName: z.string().optional(),
13
+ model: z.string().optional(),
11
14
  usage: z.object({
12
15
  input_tokens: z.number(),
13
16
  output_tokens: z.number(),
@@ -17,17 +20,6 @@ const CliResult = z.object({
17
20
  durationMs: z.number(),
18
21
  costUsd: z.number()
19
22
  });
20
- const PoolConfig = z.object({
21
- tokens: z.array(z.object({
22
- token: z.string(),
23
- name: z.string()
24
- })),
25
- size: z.number().optional(),
26
- model: z.string().optional(),
27
- timeout: z.number().optional(),
28
- cwd: z.string().optional(),
29
- maxCalls: z.number().optional()
30
- });
31
23
  const AddTokenInput = z.object({
32
24
  token: z.string(),
33
25
  name: z.string()
@@ -36,8 +28,7 @@ const RemoveTokenInput = z.object({ token: z.string() });
36
28
  const TokenStats = z.object({
37
29
  token: z.string(),
38
30
  name: z.string(),
39
- requests: z.number(),
40
- active: z.boolean()
31
+ requests: z.number()
41
32
  });
42
33
  const OAuthStartResult = z.object({ authUrl: z.string() });
43
34
  const RateLimit = z.object({
@@ -61,7 +52,6 @@ const UsageResponse = z.object({
61
52
  });
62
53
  const HealthResponse = z.object({
63
54
  status: z.string(),
64
- workers: z.number(),
65
55
  activeTokens: z.number()
66
56
  });
67
57
  var QuotaError = class extends Error {
@@ -77,6 +67,6 @@ function maskToken(token) {
77
67
  return token.length > 4 ? `...${token.slice(-4)}` : token;
78
68
  }
79
69
  //#endregion
80
- export { AddTokenInput, CliResult, HealthResponse, OAuthStartResult, PoolConfig, ProcessError, QueryInput, QuotaError, RemoveTokenInput, TimeoutError, TokenStats, UsageResponse, maskToken };
70
+ export { AddTokenInput, CliResult, HealthResponse, OAuthStartResult, ProcessError, QueryInput, QuotaError, RemoveTokenInput, TimeoutError, TokenStats, UsageResponse, maskToken };
81
71
 
82
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicWdyaWQudHlwZXMuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2FwcGxpY2F0aW9uL3FncmlkL3FncmlkLnR5cGVzLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHogfSBmcm9tIFwiem9kXCI7XG5cbi8vIOKUgOKUgOKUgCBRdWVyeSDilIDilIDilIBcblxuZXhwb3J0IGNvbnN0IFF1ZXJ5SW5wdXQgPSB6Lm9iamVjdCh7XG4gIHN5c3RlbTogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICBwcm9tcHQ6IHouc3RyaW5nKCksXG4gIHRpbWVvdXQ6IHoubnVtYmVyKCkub3B0aW9uYWwoKSxcbn0pO1xuZXhwb3J0IHR5cGUgUXVlcnlJbnB1dCA9IHouaW5mZXI8dHlwZW9mIFF1ZXJ5SW5wdXQ+O1xuXG5leHBvcnQgY29uc3QgQ2xpUmVzdWx0ID0gei5vYmplY3Qoe1xuICB0ZXh0OiB6LnN0cmluZygpLFxuICB1c2FnZTogei5vYmplY3Qoe1xuICAgIGlucHV0X3Rva2Vuczogei5udW1iZXIoKSxcbiAgICBvdXRwdXRfdG9rZW5zOiB6Lm51bWJlcigpLFxuICAgIGNhY2hlX2NyZWF0aW9uX2lucHV0X3Rva2Vuczogei5udW1iZXIoKSxcbiAgICBjYWNoZV9yZWFkX2lucHV0X3Rva2Vuczogei5udW1iZXIoKSxcbiAgfSksXG4gIGR1cmF0aW9uTXM6IHoubnVtYmVyKCksXG4gIGNvc3RVc2Q6IHoubnVtYmVyKCksXG59KTtcbmV4cG9ydCB0eXBlIENsaVJlc3VsdCA9IHouaW5mZXI8dHlwZW9mIENsaVJlc3VsdD47XG5cbi8vIOKUgOKUgOKUgCBQb29sIENvbmZpZyDilIDilIDilIBcblxuZXhwb3J0IGNvbnN0IFBvb2xDb25maWcgPSB6Lm9iamVjdCh7XG4gIHRva2Vuczogei5hcnJheSh6Lm9iamVjdCh7IHRva2VuOiB6LnN0cmluZygpLCBuYW1lOiB6LnN0cmluZygpIH0pKSxcbiAgc2l6ZTogei5udW1iZXIoKS5vcHRpb25hbCgpLFxuICBtb2RlbDogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICB0aW1lb3V0OiB6Lm51bWJlcigpLm9wdGlvbmFsKCksXG4gIGN3ZDogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICBtYXhDYWxsczogei5udW1iZXIoKS5vcHRpb25hbCgpLFxufSk7XG5leHBvcnQgdHlwZSBQb29sQ29uZmlnID0gei5pbmZlcjx0eXBlb2YgUG9vbENvbmZpZz47XG5cbi8vIOKUgOKUgOKUgCBUb2tlbiBNYW5hZ2VtZW50IOKUgOKUgOKUgFxuXG5leHBvcnQgY29uc3QgQWRkVG9rZW5JbnB1dCA9IHoub2JqZWN0KHtcbiAgdG9rZW46IHouc3RyaW5nKCksXG4gIG5hbWU6IHouc3RyaW5nKCksXG59KTtcbmV4cG9ydCB0eXBlIEFkZFRva2VuSW5wdXQgPSB6LmluZmVyPHR5cGVvZiBBZGRUb2tlbklucHV0PjtcblxuZXhwb3J0IGNvbnN0IFJlbW92ZVRva2VuSW5wdXQgPSB6Lm9iamVjdCh7XG4gIHRva2VuOiB6LnN0cmluZygpLFxufSk7XG5leHBvcnQgdHlwZSBSZW1vdmVUb2tlbklucHV0ID0gei5pbmZlcjx0eXBlb2YgUmVtb3ZlVG9rZW5JbnB1dD47XG5cbmV4cG9ydCBjb25zdCBUb2tlblN0YXRzID0gei5vYmplY3Qoe1xuICB0b2tlbjogei5zdHJpbmcoKSxcbiAgbmFtZTogei5zdHJpbmcoKSxcbiAgcmVxdWVzdHM6IHoubnVtYmVyKCksXG4gIGFjdGl2ZTogei5ib29sZWFuKCksXG59KTtcbmV4cG9ydCB0eXBlIFRva2VuU3RhdHMgPSB6LmluZmVyPHR5cGVvZiBUb2tlblN0YXRzPjtcblxuLy8g4pSA4pSA4pSAIE9BdXRoIOKUgOKUgOKUgFxuXG5leHBvcnQgY29uc3QgT0F1dGhTdGFydFJlc3VsdCA9IHoub2JqZWN0KHtcbiAgYXV0aFVybDogei5zdHJpbmcoKSxcbn0pO1xuZXhwb3J0IHR5cGUgT0F1dGhTdGFydFJlc3VsdCA9IHouaW5mZXI8dHlwZW9mIE9BdXRoU3RhcnRSZXN1bHQ+O1xuXG5jb25zdCBSYXRlTGltaXQgPSB6XG4gIC5vYmplY3Qoe1xuICAgIHV0aWxpemF0aW9uOiB6Lm51bWJlcigpLm51bGxhYmxlKCksXG4gICAgcmVzZXRzX2F0OiB6LnN0cmluZygpLm51bGxhYmxlKCksXG4gIH0pXG4gIC5udWxsYWJsZSgpO1xuXG5leHBvcnQgY29uc3QgVXNhZ2VSZXNwb25zZSA9IHoub2JqZWN0KHtcbiAgZXJyb3I6IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgZml2ZV9ob3VyOiBSYXRlTGltaXQub3B0aW9uYWwoKSxcbiAgc2V2ZW5fZGF5OiBSYXRlTGltaXQub3B0aW9uYWwoKSxcbiAgc2V2ZW5fZGF5X29wdXM6IFJhdGVMaW1pdC5vcHRpb25hbCgpLFxuICBzZXZlbl9kYXlfc29ubmV0OiBSYXRlTGltaXQub3B0aW9uYWwoKSxcbiAgc2V2ZW5fZGF5X29hdXRoX2FwcHM6IFJhdGVMaW1pdC5vcHRpb25hbCgpLFxuICBzZXZlbl9kYXlfY293b3JrOiBSYXRlTGltaXQub3B0aW9uYWwoKSxcbiAgZXh0cmFfdXNhZ2U6IHpcbiAgICAub2JqZWN0KHtcbiAgICAgIGlzX2VuYWJsZWQ6IHouYm9vbGVhbigpLFxuICAgICAgbW9udGhseV9saW1pdDogei5udW1iZXIoKS5udWxsYWJsZSgpLFxuICAgICAgdXNlZF9jcmVkaXRzOiB6Lm51bWJlcigpLm51bGxhYmxlKCksXG4gICAgICB1dGlsaXphdGlvbjogei5udW1iZXIoKS5udWxsYWJsZSgpLFxuICAgIH0pXG4gICAgLm51bGxhYmxlKClcbiAgICAub3B0aW9uYWwoKSxcbn0pO1xuZXhwb3J0IHR5cGUgVXNhZ2VSZXNwb25zZSA9IHouaW5mZXI8dHlwZW9mIFVzYWdlUmVzcG9uc2U+O1xuXG4vLyDilIDilIDilIAgSGVhbHRoIOKUgOKUgOKUgFxuXG5leHBvcnQgY29uc3QgSGVhbHRoUmVzcG9uc2UgPSB6Lm9iamVjdCh7XG4gIHN0YXR1czogei5zdHJpbmcoKSxcbiAgd29ya2Vyczogei5udW1iZXIoKSxcbiAgYWN0aXZlVG9rZW5zOiB6Lm51bWJlcigpLFxufSk7XG5leHBvcnQgdHlwZSBIZWFsdGhSZXNwb25zZSA9IHouaW5mZXI8dHlwZW9mIEhlYWx0aFJlc3BvbnNlPjtcblxuLy8g4pSA4pSA4pSAIEVycm9ycyDilIDilIDilIBcblxuZXhwb3J0IGNsYXNzIFF1b3RhRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIHJlYWRvbmx5IGNvZGUgPSBcIlFVT1RBX0VYSEFVU1RFRFwiIGFzIGNvbnN0O1xufVxuZXhwb3J0IGNsYXNzIFRpbWVvdXRFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgcmVhZG9ubHkgY29kZSA9IFwiVElNRU9VVFwiIGFzIGNvbnN0O1xufVxuZXhwb3J0IGNsYXNzIFByb2Nlc3NFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgcmVhZG9ubHkgY29kZSA9IFwiUFJPQ0VTU19FUlJPUlwiIGFzIGNvbnN0O1xufVxuXG4vLyDilIDilIDilIAgVXRpbHMg4pSA4pSA4pSAXG5cbmV4cG9ydCBmdW5jdGlvbiBtYXNrVG9rZW4odG9rZW46IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiB0b2tlbi5sZW5ndGggPiA0ID8gYC4uLiR7dG9rZW4uc2xpY2UoLTQpfWAgOiB0b2tlbjtcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7O0FBSUEsTUFBYSxhQUFhLEVBQUUsT0FBTztDQUNqQyxRQUFRLEVBQUUsUUFBUSxDQUFDLFVBQVU7Q0FDN0IsUUFBUSxFQUFFLFFBQVE7Q0FDbEIsU0FBUyxFQUFFLFFBQVEsQ0FBQyxVQUFVO0NBQy9CLENBQUM7QUFHRixNQUFhLFlBQVksRUFBRSxPQUFPO0NBQ2hDLE1BQU0sRUFBRSxRQUFRO0NBQ2hCLE9BQU8sRUFBRSxPQUFPO0VBQ2QsY0FBYyxFQUFFLFFBQVE7RUFDeEIsZUFBZSxFQUFFLFFBQVE7RUFDekIsNkJBQTZCLEVBQUUsUUFBUTtFQUN2Qyx5QkFBeUIsRUFBRSxRQUFRO0VBQ3BDLENBQUM7Q0FDRixZQUFZLEVBQUUsUUFBUTtDQUN0QixTQUFTLEVBQUUsUUFBUTtDQUNwQixDQUFDO0FBS0YsTUFBYSxhQUFhLEVBQUUsT0FBTztDQUNqQyxRQUFRLEVBQUUsTUFBTSxFQUFFLE9BQU87RUFBRSxPQUFPLEVBQUUsUUFBUTtFQUFFLE1BQU0sRUFBRSxRQUFRO0VBQUUsQ0FBQyxDQUFDO0NBQ2xFLE1BQU0sRUFBRSxRQUFRLENBQUMsVUFBVTtDQUMzQixPQUFPLEVBQUUsUUFBUSxDQUFDLFVBQVU7Q0FDNUIsU0FBUyxFQUFFLFFBQVEsQ0FBQyxVQUFVO0NBQzlCLEtBQUssRUFBRSxRQUFRLENBQUMsVUFBVTtDQUMxQixVQUFVLEVBQUUsUUFBUSxDQUFDLFVBQVU7Q0FDaEMsQ0FBQztBQUtGLE1BQWEsZ0JBQWdCLEVBQUUsT0FBTztDQUNwQyxPQUFPLEVBQUUsUUFBUTtDQUNqQixNQUFNLEVBQUUsUUFBUTtDQUNqQixDQUFDO0FBR0YsTUFBYSxtQkFBbUIsRUFBRSxPQUFPLEVBQ3ZDLE9BQU8sRUFBRSxRQUFRLEVBQ2xCLENBQUM7QUFHRixNQUFhLGFBQWEsRUFBRSxPQUFPO0NBQ2pDLE9BQU8sRUFBRSxRQUFRO0NBQ2pCLE1BQU0sRUFBRSxRQUFRO0NBQ2hCLFVBQVUsRUFBRSxRQUFRO0NBQ3BCLFFBQVEsRUFBRSxTQUFTO0NBQ3BCLENBQUM7QUFLRixNQUFhLG1CQUFtQixFQUFFLE9BQU8sRUFDdkMsU0FBUyxFQUFFLFFBQVEsRUFDcEIsQ0FBQztBQUdGLE1BQU0sWUFBWSxFQUNmLE9BQU87Q0FDTixhQUFhLEVBQUUsUUFBUSxDQUFDLFVBQVU7Q0FDbEMsV0FBVyxFQUFFLFFBQVEsQ0FBQyxVQUFVO0NBQ2pDLENBQUMsQ0FDRCxVQUFVO0FBRWIsTUFBYSxnQkFBZ0IsRUFBRSxPQUFPO0NBQ3BDLE9BQU8sRUFBRSxRQUFRLENBQUMsVUFBVTtDQUM1QixXQUFXLFVBQVUsVUFBVTtDQUMvQixXQUFXLFVBQVUsVUFBVTtDQUMvQixnQkFBZ0IsVUFBVSxVQUFVO0NBQ3BDLGtCQUFrQixVQUFVLFVBQVU7Q0FDdEMsc0JBQXNCLFVBQVUsVUFBVTtDQUMxQyxrQkFBa0IsVUFBVSxVQUFVO0NBQ3RDLGFBQWEsRUFDVixPQUFPO0VBQ04sWUFBWSxFQUFFLFNBQVM7RUFDdkIsZUFBZSxFQUFFLFFBQVEsQ0FBQyxVQUFVO0VBQ3BDLGNBQWMsRUFBRSxRQUFRLENBQUMsVUFBVTtFQUNuQyxhQUFhLEVBQUUsUUFBUSxDQUFDLFVBQVU7RUFDbkMsQ0FBQyxDQUNELFVBQVUsQ0FDVixVQUFVO0NBQ2QsQ0FBQztBQUtGLE1BQWEsaUJBQWlCLEVBQUUsT0FBTztDQUNyQyxRQUFRLEVBQUUsUUFBUTtDQUNsQixTQUFTLEVBQUUsUUFBUTtDQUNuQixjQUFjLEVBQUUsUUFBUTtDQUN6QixDQUFDO0FBS0YsSUFBYSxhQUFiLGNBQWdDLE1BQU07Q0FDcEMsT0FBZ0I7O0FBRWxCLElBQWEsZUFBYixjQUFrQyxNQUFNO0NBQ3RDLE9BQWdCOztBQUVsQixJQUFhLGVBQWIsY0FBa0MsTUFBTTtDQUN0QyxPQUFnQjs7QUFLbEIsU0FBZ0IsVUFBVSxPQUF1QjtBQUMvQyxRQUFPLE1BQU0sU0FBUyxJQUFJLE1BQU0sTUFBTSxNQUFNLEdBQUcsS0FBSyJ9
72
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicWdyaWQudHlwZXMuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2FwcGxpY2F0aW9uL3FncmlkL3FncmlkLnR5cGVzLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHogfSBmcm9tIFwiem9kXCI7XG5cbi8vIOKUgOKUgOKUgCBRdWVyeSDilIDilIDilIBcblxuZXhwb3J0IGNvbnN0IFF1ZXJ5SW5wdXQgPSB6Lm9iamVjdCh7XG4gIHN5c3RlbTogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICBwcm9tcHQ6IHouc3RyaW5nKCksXG4gIG1vZGVsOiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG4gIHRpbWVvdXQ6IHoubnVtYmVyKCkub3B0aW9uYWwoKSxcbn0pO1xuZXhwb3J0IHR5cGUgUXVlcnlJbnB1dCA9IHouaW5mZXI8dHlwZW9mIFF1ZXJ5SW5wdXQ+O1xuXG5leHBvcnQgY29uc3QgQ2xpUmVzdWx0ID0gei5vYmplY3Qoe1xuICB0ZXh0OiB6LnN0cmluZygpLFxuICB0b2tlbk5hbWU6IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgbW9kZWw6IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgdXNhZ2U6IHoub2JqZWN0KHtcbiAgICBpbnB1dF90b2tlbnM6IHoubnVtYmVyKCksXG4gICAgb3V0cHV0X3Rva2Vuczogei5udW1iZXIoKSxcbiAgICBjYWNoZV9jcmVhdGlvbl9pbnB1dF90b2tlbnM6IHoubnVtYmVyKCksXG4gICAgY2FjaGVfcmVhZF9pbnB1dF90b2tlbnM6IHoubnVtYmVyKCksXG4gIH0pLFxuICBkdXJhdGlvbk1zOiB6Lm51bWJlcigpLFxuICBjb3N0VXNkOiB6Lm51bWJlcigpLFxufSk7XG5leHBvcnQgdHlwZSBDbGlSZXN1bHQgPSB6LmluZmVyPHR5cGVvZiBDbGlSZXN1bHQ+O1xuXG4vLyDilIDilIDilIAgVG9rZW4gTWFuYWdlbWVudCDilIDilIDilIBcblxuZXhwb3J0IGNvbnN0IEFkZFRva2VuSW5wdXQgPSB6Lm9iamVjdCh7XG4gIHRva2VuOiB6LnN0cmluZygpLFxuICBuYW1lOiB6LnN0cmluZygpLFxufSk7XG5leHBvcnQgdHlwZSBBZGRUb2tlbklucHV0ID0gei5pbmZlcjx0eXBlb2YgQWRkVG9rZW5JbnB1dD47XG5cbmV4cG9ydCBjb25zdCBSZW1vdmVUb2tlbklucHV0ID0gei5vYmplY3Qoe1xuICB0b2tlbjogei5zdHJpbmcoKSxcbn0pO1xuZXhwb3J0IHR5cGUgUmVtb3ZlVG9rZW5JbnB1dCA9IHouaW5mZXI8dHlwZW9mIFJlbW92ZVRva2VuSW5wdXQ+O1xuXG5leHBvcnQgY29uc3QgVG9rZW5TdGF0cyA9IHoub2JqZWN0KHtcbiAgdG9rZW46IHouc3RyaW5nKCksXG4gIG5hbWU6IHouc3RyaW5nKCksXG4gIHJlcXVlc3RzOiB6Lm51bWJlcigpLFxufSk7XG5leHBvcnQgdHlwZSBUb2tlblN0YXRzID0gei5pbmZlcjx0eXBlb2YgVG9rZW5TdGF0cz47XG5cbi8vIOKUgOKUgOKUgCBPQXV0aCDilIDilIDilIBcblxuZXhwb3J0IGNvbnN0IE9BdXRoU3RhcnRSZXN1bHQgPSB6Lm9iamVjdCh7XG4gIGF1dGhVcmw6IHouc3RyaW5nKCksXG59KTtcbmV4cG9ydCB0eXBlIE9BdXRoU3RhcnRSZXN1bHQgPSB6LmluZmVyPHR5cGVvZiBPQXV0aFN0YXJ0UmVzdWx0PjtcblxuY29uc3QgUmF0ZUxpbWl0ID0gelxuICAub2JqZWN0KHtcbiAgICB1dGlsaXphdGlvbjogei5udW1iZXIoKS5udWxsYWJsZSgpLFxuICAgIHJlc2V0c19hdDogei5zdHJpbmcoKS5udWxsYWJsZSgpLFxuICB9KVxuICAubnVsbGFibGUoKTtcblxuZXhwb3J0IGNvbnN0IFVzYWdlUmVzcG9uc2UgPSB6Lm9iamVjdCh7XG4gIGVycm9yOiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG4gIGZpdmVfaG91cjogUmF0ZUxpbWl0Lm9wdGlvbmFsKCksXG4gIHNldmVuX2RheTogUmF0ZUxpbWl0Lm9wdGlvbmFsKCksXG4gIHNldmVuX2RheV9vcHVzOiBSYXRlTGltaXQub3B0aW9uYWwoKSxcbiAgc2V2ZW5fZGF5X3Nvbm5ldDogUmF0ZUxpbWl0Lm9wdGlvbmFsKCksXG4gIHNldmVuX2RheV9vYXV0aF9hcHBzOiBSYXRlTGltaXQub3B0aW9uYWwoKSxcbiAgc2V2ZW5fZGF5X2Nvd29yazogUmF0ZUxpbWl0Lm9wdGlvbmFsKCksXG4gIGV4dHJhX3VzYWdlOiB6XG4gICAgLm9iamVjdCh7XG4gICAgICBpc19lbmFibGVkOiB6LmJvb2xlYW4oKSxcbiAgICAgIG1vbnRobHlfbGltaXQ6IHoubnVtYmVyKCkubnVsbGFibGUoKSxcbiAgICAgIHVzZWRfY3JlZGl0czogei5udW1iZXIoKS5udWxsYWJsZSgpLFxuICAgICAgdXRpbGl6YXRpb246IHoubnVtYmVyKCkubnVsbGFibGUoKSxcbiAgICB9KVxuICAgIC5udWxsYWJsZSgpXG4gICAgLm9wdGlvbmFsKCksXG59KTtcbmV4cG9ydCB0eXBlIFVzYWdlUmVzcG9uc2UgPSB6LmluZmVyPHR5cGVvZiBVc2FnZVJlc3BvbnNlPjtcblxuLy8g4pSA4pSA4pSAIEhlYWx0aCDilIDilIDilIBcblxuZXhwb3J0IGNvbnN0IEhlYWx0aFJlc3BvbnNlID0gei5vYmplY3Qoe1xuICBzdGF0dXM6IHouc3RyaW5nKCksXG4gIGFjdGl2ZVRva2Vuczogei5udW1iZXIoKSxcbn0pO1xuZXhwb3J0IHR5cGUgSGVhbHRoUmVzcG9uc2UgPSB6LmluZmVyPHR5cGVvZiBIZWFsdGhSZXNwb25zZT47XG5cbi8vIOKUgOKUgOKUgCBFcnJvcnMg4pSA4pSA4pSAXG5cbmV4cG9ydCBjbGFzcyBRdW90YUVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICByZWFkb25seSBjb2RlID0gXCJRVU9UQV9FWEhBVVNURURcIiBhcyBjb25zdDtcbn1cbmV4cG9ydCBjbGFzcyBUaW1lb3V0RXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIHJlYWRvbmx5IGNvZGUgPSBcIlRJTUVPVVRcIiBhcyBjb25zdDtcbn1cbmV4cG9ydCBjbGFzcyBQcm9jZXNzRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIHJlYWRvbmx5IGNvZGUgPSBcIlBST0NFU1NfRVJST1JcIiBhcyBjb25zdDtcbn1cblxuLy8g4pSA4pSA4pSAIFV0aWxzIOKUgOKUgOKUgFxuXG5leHBvcnQgZnVuY3Rpb24gbWFza1Rva2VuKHRva2VuOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gdG9rZW4ubGVuZ3RoID4gNCA/IGAuLi4ke3Rva2VuLnNsaWNlKC00KX1gIDogdG9rZW47XG59XG4iXSwibWFwcGluZ3MiOiI7OztBQUlBLE1BQWEsYUFBYSxFQUFFLE9BQU87Q0FDakMsUUFBUSxFQUFFLFFBQVEsQ0FBQyxVQUFVO0NBQzdCLFFBQVEsRUFBRSxRQUFRO0NBQ2xCLE9BQU8sRUFBRSxRQUFRLENBQUMsVUFBVTtDQUM1QixTQUFTLEVBQUUsUUFBUSxDQUFDLFVBQVU7Q0FDL0IsQ0FBQztBQUdGLE1BQWEsWUFBWSxFQUFFLE9BQU87Q0FDaEMsTUFBTSxFQUFFLFFBQVE7Q0FDaEIsV0FBVyxFQUFFLFFBQVEsQ0FBQyxVQUFVO0NBQ2hDLE9BQU8sRUFBRSxRQUFRLENBQUMsVUFBVTtDQUM1QixPQUFPLEVBQUUsT0FBTztFQUNkLGNBQWMsRUFBRSxRQUFRO0VBQ3hCLGVBQWUsRUFBRSxRQUFRO0VBQ3pCLDZCQUE2QixFQUFFLFFBQVE7RUFDdkMseUJBQXlCLEVBQUUsUUFBUTtFQUNwQyxDQUFDO0NBQ0YsWUFBWSxFQUFFLFFBQVE7Q0FDdEIsU0FBUyxFQUFFLFFBQVE7Q0FDcEIsQ0FBQztBQUtGLE1BQWEsZ0JBQWdCLEVBQUUsT0FBTztDQUNwQyxPQUFPLEVBQUUsUUFBUTtDQUNqQixNQUFNLEVBQUUsUUFBUTtDQUNqQixDQUFDO0FBR0YsTUFBYSxtQkFBbUIsRUFBRSxPQUFPLEVBQ3ZDLE9BQU8sRUFBRSxRQUFRLEVBQ2xCLENBQUM7QUFHRixNQUFhLGFBQWEsRUFBRSxPQUFPO0NBQ2pDLE9BQU8sRUFBRSxRQUFRO0NBQ2pCLE1BQU0sRUFBRSxRQUFRO0NBQ2hCLFVBQVUsRUFBRSxRQUFRO0NBQ3JCLENBQUM7QUFLRixNQUFhLG1CQUFtQixFQUFFLE9BQU8sRUFDdkMsU0FBUyxFQUFFLFFBQVEsRUFDcEIsQ0FBQztBQUdGLE1BQU0sWUFBWSxFQUNmLE9BQU87Q0FDTixhQUFhLEVBQUUsUUFBUSxDQUFDLFVBQVU7Q0FDbEMsV0FBVyxFQUFFLFFBQVEsQ0FBQyxVQUFVO0NBQ2pDLENBQUMsQ0FDRCxVQUFVO0FBRWIsTUFBYSxnQkFBZ0IsRUFBRSxPQUFPO0NBQ3BDLE9BQU8sRUFBRSxRQUFRLENBQUMsVUFBVTtDQUM1QixXQUFXLFVBQVUsVUFBVTtDQUMvQixXQUFXLFVBQVUsVUFBVTtDQUMvQixnQkFBZ0IsVUFBVSxVQUFVO0NBQ3BDLGtCQUFrQixVQUFVLFVBQVU7Q0FDdEMsc0JBQXNCLFVBQVUsVUFBVTtDQUMxQyxrQkFBa0IsVUFBVSxVQUFVO0NBQ3RDLGFBQWEsRUFDVixPQUFPO0VBQ04sWUFBWSxFQUFFLFNBQVM7RUFDdkIsZUFBZSxFQUFFLFFBQVEsQ0FBQyxVQUFVO0VBQ3BDLGNBQWMsRUFBRSxRQUFRLENBQUMsVUFBVTtFQUNuQyxhQUFhLEVBQUUsUUFBUSxDQUFDLFVBQVU7RUFDbkMsQ0FBQyxDQUNELFVBQVUsQ0FDVixVQUFVO0NBQ2QsQ0FBQztBQUtGLE1BQWEsaUJBQWlCLEVBQUUsT0FBTztDQUNyQyxRQUFRLEVBQUUsUUFBUTtDQUNsQixjQUFjLEVBQUUsUUFBUTtDQUN6QixDQUFDO0FBS0YsSUFBYSxhQUFiLGNBQWdDLE1BQU07Q0FDcEMsT0FBZ0I7O0FBRWxCLElBQWEsZUFBYixjQUFrQyxNQUFNO0NBQ3RDLE9BQWdCOztBQUVsQixJQUFhLGVBQWIsY0FBa0MsTUFBTTtDQUN0QyxPQUFnQjs7QUFLbEIsU0FBZ0IsVUFBVSxPQUF1QjtBQUMvQyxRQUFPLE1BQU0sU0FBUyxJQUFJLE1BQU0sTUFBTSxNQUFNLEdBQUcsS0FBSyJ9