@cartanova/qgrid-cli 2.10.10 → 2.11.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 (302) hide show
  1. package/bundle/dist/_virtual/_rolldown/runtime.js +1 -10
  2. package/bundle/dist/application/monit/log-buffer.js +12 -6
  3. package/bundle/dist/application/monit/monit.frame.js +11 -3
  4. package/bundle/dist/application/monit/monit.types.js +1 -1
  5. package/bundle/dist/application/qgrid/conv-routing.js +9 -6
  6. package/bundle/dist/application/qgrid/expired-token-reminder.js +2 -2
  7. package/bundle/dist/application/qgrid/oauth.js +31 -4
  8. package/bundle/dist/application/qgrid/qgrid-image-generation.js +1 -1
  9. package/bundle/dist/application/qgrid/qgrid-response-format.js +21 -19
  10. package/bundle/dist/application/qgrid/qgrid-run-lifecycle.js +40 -33
  11. package/bundle/dist/application/qgrid/qgrid.dispatcher.js +128 -93
  12. package/bundle/dist/application/qgrid/qgrid.frame.js +930 -49
  13. package/bundle/dist/application/qgrid/qgrid.types.js +212 -5
  14. package/bundle/dist/application/qgrid/schema-prompt.js +75 -48
  15. package/bundle/dist/application/qgrid/slack-user-map.js +1 -1
  16. package/bundle/dist/application/qgrid/token-death.js +1 -1
  17. package/bundle/dist/application/qgrid/token-subscriber.js +83 -30
  18. package/bundle/dist/application/qgrid/token-trigger-setup.js +1 -1
  19. package/bundle/dist/application/qgrid/token-window-keepalive.js +8 -6
  20. package/bundle/dist/application/qgrid/tool-emulation-schema.js +13 -13
  21. package/bundle/dist/application/qgrid/tool-emulation.js +19 -15
  22. package/bundle/dist/application/request-log/json-schema-type-text.js +29 -12
  23. package/bundle/dist/application/request-log/request-log.model.js +83 -70
  24. package/bundle/dist/application/request-log/request-log.types.js +1 -1
  25. package/bundle/dist/application/request-log/zod-code-format.js +1 -1
  26. package/bundle/dist/application/request-log-step/request-log-step.model.js +1 -1
  27. package/bundle/dist/application/request-log-step/request-log-step.types.js +1 -1
  28. package/bundle/dist/application/setting/setting.constant.js +1 -1
  29. package/bundle/dist/application/setting/setting.model.js +2 -2
  30. package/bundle/dist/application/setting/setting.store.js +2 -2
  31. package/bundle/dist/application/setting/setting.types.js +1 -1
  32. package/bundle/dist/application/sonamu.generated.js +32 -16
  33. package/bundle/dist/application/sonamu.generated.sso.js +1 -1
  34. package/bundle/dist/application/token/token.model.js +26 -9
  35. package/bundle/dist/application/token/token.types.js +20 -3
  36. package/bundle/dist/i18n/en.js +15 -1
  37. package/bundle/dist/i18n/ko.js +15 -1
  38. package/bundle/dist/i18n/sd.generated.js +1 -1
  39. package/bundle/dist/migrations/20260807133553_manual__backfill_request_log_cost.js +8 -6
  40. package/bundle/dist/server-bootstrap.js +4 -2
  41. package/bundle/dist/server-error-handler.js +1 -1
  42. package/bundle/dist/sonamu.config.js +37 -8
  43. package/bundle/dist/startup-migrations.js +17 -7
  44. package/bundle/dist/testing/global.js +1 -1
  45. package/bundle/dist/testing/schema-bench.js +0 -0
  46. package/bundle/dist/testing/test-database-name.js +1 -1
  47. package/bundle/dist/utils/providers/anthropic/anthropic-constants.js +1 -1
  48. package/bundle/dist/utils/providers/anthropic/anthropic-dispatcher.js +11 -5
  49. package/bundle/dist/utils/providers/anthropic/anthropic-quota.js +4 -4
  50. package/bundle/dist/utils/providers/anthropic/anthropic-thinking.js +1 -1
  51. package/bundle/dist/utils/providers/anthropic/claude-session.js +20 -19
  52. package/bundle/dist/utils/providers/anthropic/fence-strip.js +1 -1
  53. package/bundle/dist/utils/providers/anthropic/stream-json-adapter.js +49 -23
  54. package/bundle/dist/utils/providers/common/credentials.js +5 -1
  55. package/bundle/dist/utils/providers/common/effort.js +3 -3
  56. package/bundle/dist/utils/providers/common/model-cost.js +69 -14
  57. package/bundle/dist/utils/providers/common/provider-types.js +29 -1
  58. package/bundle/dist/utils/providers/common/schema-validation.js +78 -40
  59. package/bundle/dist/utils/providers/common/smooth-weighted-round-robin.js +1 -1
  60. package/bundle/dist/utils/providers/common/strictifier.js +62 -43
  61. package/bundle/dist/utils/providers/common/thinking.js +3 -2
  62. package/bundle/dist/utils/providers/common/ttft.js +1 -1
  63. package/bundle/dist/utils/providers/grok/grok-backend-protocol.js +427 -0
  64. package/bundle/dist/utils/providers/grok/grok-constants.js +55 -0
  65. package/bundle/dist/utils/providers/grok/grok-direct-client.js +196 -0
  66. package/bundle/dist/utils/providers/grok/grok-dispatcher.js +1313 -0
  67. package/bundle/dist/utils/providers/grok/grok-headers.js +118 -0
  68. package/bundle/dist/utils/providers/grok/grok-media-client.js +420 -0
  69. package/bundle/dist/utils/providers/grok/grok-models.js +114 -0
  70. package/bundle/dist/utils/providers/grok/grok-oauth.js +455 -0
  71. package/bundle/dist/utils/providers/grok/grok-quota.js +119 -0
  72. package/bundle/dist/utils/providers/grok/grok-refresh.js +192 -0
  73. package/bundle/dist/utils/providers/grok/grok-types.js +186 -0
  74. package/bundle/dist/utils/providers/grok/grok-voice-client.js +199 -0
  75. package/bundle/dist/utils/providers/grok/index.js +11 -0
  76. package/bundle/dist/utils/providers/openai/openai-backend-protocol.js +111 -83
  77. package/bundle/dist/utils/providers/openai/openai-callback-relay.js +3 -2
  78. package/bundle/dist/utils/providers/openai/openai-constants.js +1 -1
  79. package/bundle/dist/utils/providers/openai/openai-direct-client.js +23 -7
  80. package/bundle/dist/utils/providers/openai/openai-dispatcher.js +143 -106
  81. package/bundle/dist/utils/providers/openai/openai-image-generation.js +48 -33
  82. package/bundle/dist/utils/providers/openai/openai-oauth.js +28 -13
  83. package/bundle/dist/utils/providers/openai/openai-quota.js +38 -27
  84. package/bundle/dist/utils/providers/openai/openai-refresh.js +17 -9
  85. package/bundle/dist/utils/providers/openai/openai-sse.js +1 -1
  86. package/bundle/dist/utils/providers/openai/openai-transport-config.js +1 -1
  87. package/bundle/dist/utils/quiet-hours.js +1 -1
  88. package/bundle/dist/utils/slack-notify.js +14 -8
  89. package/bundle/dist/utils/subset-loaders.js +4 -5
  90. package/bundle/src/application/monit/log-buffer.ts +23 -9
  91. package/bundle/src/application/monit/monit.frame.ts +22 -5
  92. package/bundle/src/application/monit/monit.types.ts +6 -0
  93. package/bundle/src/application/qgrid/conv-routing.test.ts +76 -4
  94. package/bundle/src/application/qgrid/conv-routing.ts +35 -9
  95. package/bundle/src/application/qgrid/expired-token-reminder.ts +9 -1
  96. package/bundle/src/application/qgrid/oauth.ts +51 -15
  97. package/bundle/src/application/qgrid/qgrid-image-generation.ts +9 -0
  98. package/bundle/src/application/qgrid/qgrid-response-format.ts +50 -25
  99. package/bundle/src/application/qgrid/qgrid-run-lifecycle.test.ts +19 -0
  100. package/bundle/src/application/qgrid/qgrid-run-lifecycle.ts +84 -40
  101. package/bundle/src/application/qgrid/qgrid.dispatcher.test.ts +97 -0
  102. package/bundle/src/application/qgrid/qgrid.dispatcher.ts +274 -126
  103. package/bundle/src/application/qgrid/qgrid.frame.test.ts +1013 -3
  104. package/bundle/src/application/qgrid/qgrid.frame.ts +1415 -60
  105. package/bundle/src/application/qgrid/qgrid.types.ts +335 -0
  106. package/bundle/src/application/qgrid/schema-prompt.ts +105 -41
  107. package/bundle/src/application/qgrid/slack-user-map.ts +5 -0
  108. package/bundle/src/application/qgrid/token-death.ts +4 -0
  109. package/bundle/src/application/qgrid/token-subscriber.test.ts +21 -19
  110. package/bundle/src/application/qgrid/token-subscriber.ts +186 -53
  111. package/bundle/src/application/qgrid/token-trigger-setup.ts +2 -0
  112. package/bundle/src/application/qgrid/token-window-keepalive.ts +49 -6
  113. package/bundle/src/application/qgrid/tool-emulation-schema.ts +33 -29
  114. package/bundle/src/application/qgrid/tool-emulation.ts +52 -27
  115. package/bundle/src/application/request-log/json-schema-type-text.test.ts +5 -5
  116. package/bundle/src/application/request-log/json-schema-type-text.ts +81 -26
  117. package/bundle/src/application/request-log/request-log.model.test.ts +111 -4
  118. package/bundle/src/application/request-log/request-log.model.ts +277 -146
  119. package/bundle/src/application/request-log/request-log.types.ts +6 -0
  120. package/bundle/src/application/request-log/zod-code-format.ts +11 -0
  121. package/bundle/src/application/request-log-step/request-log-step.model.ts +1 -0
  122. package/bundle/src/application/request-log-step/request-log-step.types.ts +2 -0
  123. package/bundle/src/application/setting/setting.constant.ts +9 -0
  124. package/bundle/src/application/setting/setting.model.ts +12 -2
  125. package/bundle/src/application/setting/setting.store.ts +5 -1
  126. package/bundle/src/application/setting/setting.types.ts +8 -0
  127. package/bundle/src/application/sonamu.generated.http +133 -0
  128. package/bundle/src/application/sonamu.generated.sso.ts +2 -0
  129. package/bundle/src/application/sonamu.generated.ts +15 -0
  130. package/bundle/src/application/token/token.identity.test.ts +20 -0
  131. package/bundle/src/application/token/token.model.ts +66 -7
  132. package/bundle/src/application/token/token.types.ts +24 -1
  133. package/bundle/src/i18n/en.ts +19 -0
  134. package/bundle/src/i18n/ko.ts +21 -0
  135. package/bundle/src/i18n/sd.generated.ts +23 -2
  136. package/bundle/src/migrations/20260807133553_manual__backfill_request_log_cost.ts +16 -8
  137. package/bundle/src/server-bootstrap.ts +4 -2
  138. package/bundle/src/server-error-handler.ts +1 -0
  139. package/bundle/src/sonamu.config.ts +69 -7
  140. package/bundle/src/startup-migrations.ts +27 -9
  141. package/bundle/src/testing/global.ts +20 -0
  142. package/bundle/src/testing/schema-bench.ts +105 -30
  143. package/bundle/src/testing/test-database-name.ts +2 -0
  144. package/bundle/src/utils/providers/anthropic/anthropic-constants.ts +8 -0
  145. package/bundle/src/utils/providers/anthropic/anthropic-dispatcher.ts +41 -6
  146. package/bundle/src/utils/providers/anthropic/anthropic-quota.ts +7 -3
  147. package/bundle/src/utils/providers/anthropic/anthropic-thinking.ts +6 -0
  148. package/bundle/src/utils/providers/anthropic/claude-session.ts +58 -24
  149. package/bundle/src/utils/providers/anthropic/fence-strip.ts +11 -0
  150. package/bundle/src/utils/providers/anthropic/stream-json-adapter.ts +110 -45
  151. package/bundle/src/utils/providers/common/credentials.ts +8 -0
  152. package/bundle/src/utils/providers/common/effort.ts +9 -2
  153. package/bundle/src/utils/providers/common/model-cost.test.ts +48 -1
  154. package/bundle/src/utils/providers/common/model-cost.ts +259 -158
  155. package/bundle/src/utils/providers/common/provider-dispatcher.ts +98 -2
  156. package/bundle/src/utils/providers/common/provider-types.ts +46 -3
  157. package/bundle/src/utils/providers/common/schema-validation.test.ts +5 -1
  158. package/bundle/src/utils/providers/common/schema-validation.ts +124 -56
  159. package/bundle/src/utils/providers/common/smooth-weighted-round-robin.ts +4 -0
  160. package/bundle/src/utils/providers/common/strictifier.ts +185 -59
  161. package/bundle/src/utils/providers/common/thinking.ts +2 -2
  162. package/bundle/src/utils/providers/common/ttft.ts +4 -2
  163. package/bundle/src/utils/providers/grok/__fixtures__/golden-responses-1.0.60.json +164 -0
  164. package/bundle/src/utils/providers/grok/grok-backend-protocol.test.ts +325 -0
  165. package/bundle/src/utils/providers/grok/grok-backend-protocol.ts +721 -0
  166. package/bundle/src/utils/providers/grok/grok-constants.ts +105 -0
  167. package/bundle/src/utils/providers/grok/grok-direct-client.test.ts +179 -0
  168. package/bundle/src/utils/providers/grok/grok-direct-client.ts +313 -0
  169. package/bundle/src/utils/providers/grok/grok-dispatcher.test.ts +1395 -0
  170. package/bundle/src/utils/providers/grok/grok-dispatcher.ts +2105 -0
  171. package/bundle/src/utils/providers/grok/grok-headers.test.ts +149 -0
  172. package/bundle/src/utils/providers/grok/grok-headers.ts +199 -0
  173. package/bundle/src/utils/providers/grok/grok-media-client.test.ts +446 -0
  174. package/bundle/src/utils/providers/grok/grok-media-client.ts +703 -0
  175. package/bundle/src/utils/providers/grok/grok-models.test.ts +96 -0
  176. package/bundle/src/utils/providers/grok/grok-models.ts +161 -0
  177. package/bundle/src/utils/providers/grok/grok-oauth.test.ts +406 -0
  178. package/bundle/src/utils/providers/grok/grok-oauth.ts +771 -0
  179. package/bundle/src/utils/providers/grok/grok-quota.test.ts +142 -0
  180. package/bundle/src/utils/providers/grok/grok-quota.ts +198 -0
  181. package/bundle/src/utils/providers/grok/grok-refresh.test.ts +239 -0
  182. package/bundle/src/utils/providers/grok/grok-refresh.ts +325 -0
  183. package/bundle/src/utils/providers/grok/grok-types.test.ts +252 -0
  184. package/bundle/src/utils/providers/grok/grok-types.ts +374 -0
  185. package/bundle/src/utils/providers/grok/grok-voice-client.test.ts +321 -0
  186. package/bundle/src/utils/providers/grok/grok-voice-client.ts +284 -0
  187. package/bundle/src/utils/providers/grok/index.ts +20 -0
  188. package/bundle/src/utils/providers/openai/openai-backend-protocol.ts +221 -137
  189. package/bundle/src/utils/providers/openai/openai-callback-relay.ts +12 -1
  190. package/bundle/src/utils/providers/openai/openai-constants.ts +2 -0
  191. package/bundle/src/utils/providers/openai/openai-direct-client.ts +111 -21
  192. package/bundle/src/utils/providers/openai/openai-dispatcher.ts +322 -169
  193. package/bundle/src/utils/providers/openai/openai-image-generation.ts +116 -36
  194. package/bundle/src/utils/providers/openai/openai-oauth.ts +48 -20
  195. package/bundle/src/utils/providers/openai/openai-quota.ts +77 -46
  196. package/bundle/src/utils/providers/openai/openai-refresh.ts +42 -18
  197. package/bundle/src/utils/providers/openai/openai-sse.ts +27 -3
  198. package/bundle/src/utils/providers/openai/openai-transport-config.ts +2 -0
  199. package/bundle/src/utils/quiet-hours.ts +12 -1
  200. package/bundle/src/utils/slack-notify.ts +44 -13
  201. package/bundle/src/utils/subset-loaders.ts +7 -7
  202. package/bundle/web-dist/client/assets/clsx-5XM_pHvN.js +1 -0
  203. package/bundle/web-dist/client/assets/index-Be2qCZmI.css +1 -0
  204. package/bundle/web-dist/client/assets/index-C96h3feE.js +32 -0
  205. package/bundle/web-dist/client/assets/logs-DBM6U0QD.js +1 -0
  206. package/bundle/web-dist/client/assets/monit-BBjXa7vB.js +1 -0
  207. package/bundle/web-dist/client/assets/routes-Crz_PQzi.js +5 -0
  208. package/bundle/web-dist/client/assets/{services.generated-NP-ValHd.js → services.generated-B5lc3aIC.js} +5 -5
  209. package/bundle/web-dist/client/assets/settings-Cdwm3OBB.js +1 -0
  210. package/bundle/web-dist/client/assets/show-DBUhALT1.js +2 -0
  211. package/bundle/web-dist/client/assets/tokens-CVQAVJTo.js +1 -0
  212. package/bundle/web-dist/client/assets/total-cost-MnfKU8IN.js +1 -0
  213. package/bundle/web-dist/client/assets/use-oauth-login-flow-BfxYI4Oh.js +1 -0
  214. package/bundle/web-dist/client/assets/use-update-token-mutation-qKBC2sn7.js +1 -0
  215. package/bundle/web-dist/client/assets/{vendor-tanstack-DJRQAbrY.js → vendor-tanstack-DRPs09ai.js} +1 -1
  216. package/bundle/web-dist/client/index.html +5 -5
  217. package/bundle/web-dist/server/assets/clsx-D_N5PN_2.js +16 -0
  218. package/bundle/web-dist/server/assets/{lazyRouteComponent-CgBdabgd.js → lazyRouteComponent-AKiHfZWp.js} +129 -2
  219. package/bundle/web-dist/server/assets/{logs-BMyR98rU.js → logs-B7QmGJq3.js} +18 -14
  220. package/bundle/web-dist/server/assets/{monit-ZPt66W5M.js → monit-DFt7x3bh.js} +13 -12
  221. package/bundle/web-dist/server/assets/{plus-BZ9I0VgC.js → plus-DaYQRpBt.js} +1 -1
  222. package/bundle/web-dist/server/assets/{react-dom-Ds75e4Jl.js → react-dom-Cv23mm1K.js} +2 -129
  223. package/bundle/web-dist/server/assets/{refresh-cw-CztCFis-.js → refresh-cw-BpXNsAy-.js} +1 -1
  224. package/bundle/web-dist/server/assets/{request-model-DjGldb-h.js → request-model-eHE6YbaF.js} +1 -1
  225. package/bundle/web-dist/server/assets/{routes-Ct-k7nBA.js → routes-_Y-PJfgO.js} +110 -39
  226. package/bundle/web-dist/server/assets/{services.generated-BA4AcAf5.js → services.generated-CMJ8AHbO.js} +582 -172
  227. package/bundle/web-dist/server/assets/{settings-CBUZ47Xx.js → settings-JwJKxn2e.js} +14 -14
  228. package/bundle/web-dist/server/assets/{show-LSFIzvO2.js → show-BEv6z1v_.js} +90 -60
  229. package/bundle/web-dist/server/assets/{tokens-DxrBW512.js → tokens-CNT4mI-f.js} +162 -50
  230. package/bundle/web-dist/server/assets/total-cost-fTE9Xy82.js +18 -0
  231. package/bundle/web-dist/server/assets/use-oauth-login-flow-jkAkT3X6.js +2345 -0
  232. package/bundle/web-dist/server/assets/{use-update-token-mutation-pkArIzCP.js → use-update-token-mutation-Sm6kh02m.js} +1 -1
  233. package/bundle/web-dist/server/entry-server.generated.js +1644 -21655
  234. package/dist/cli.js +9 -9
  235. package/package.json +4 -11
  236. package/postinstall.mjs +12 -0
  237. package/skills/qgrid/SKILL.md +1 -0
  238. package/skills/qgrid/references/cli-env-and-server-boot.md +4 -1
  239. package/skills/qgrid/references/decision-rationale.md +23 -0
  240. package/skills/qgrid/references/grok-runtime.md +89 -0
  241. package/skills/qgrid/references/provider-runtime-differences.md +30 -29
  242. package/skills/qgrid/references/repo-map.md +10 -0
  243. package/skills/qgrid/references/token-auth-quota-lifecycle.md +56 -3
  244. package/bundle/dist/node_modules/.pnpm/@jridgewell_sourcemap-codec@1.5.5/node_modules/@jridgewell/sourcemap-codec/dist/sourcemap-codec.js +0 -406
  245. package/bundle/dist/node_modules/.pnpm/@vitest_expect@4.1.10/node_modules/@vitest/expect/dist/index.js +0 -1507
  246. package/bundle/dist/node_modules/.pnpm/@vitest_pretty-format@4.1.10/node_modules/@vitest/pretty-format/dist/index.js +0 -887
  247. package/bundle/dist/node_modules/.pnpm/@vitest_runner@4.1.10/node_modules/@vitest/runner/dist/chunk-artifact.js +0 -2756
  248. package/bundle/dist/node_modules/.pnpm/@vitest_runner@4.1.10/node_modules/@vitest/runner/dist/index.js +0 -8
  249. package/bundle/dist/node_modules/.pnpm/@vitest_runner@4.1.10/node_modules/@vitest/runner/dist/utils.js +0 -8
  250. package/bundle/dist/node_modules/.pnpm/@vitest_snapshot@4.1.10/node_modules/@vitest/snapshot/dist/index.js +0 -922
  251. package/bundle/dist/node_modules/.pnpm/@vitest_spy@4.1.10/node_modules/@vitest/spy/dist/index.js +0 -386
  252. package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.10/node_modules/@vitest/utils/dist/chunk-pathe.M-eThtNZ.js +0 -121
  253. package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.10/node_modules/@vitest/utils/dist/constants.js +0 -51
  254. package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.10/node_modules/@vitest/utils/dist/diff.js +0 -1317
  255. package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.10/node_modules/@vitest/utils/dist/display.js +0 -561
  256. package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.10/node_modules/@vitest/utils/dist/error.js +0 -40
  257. package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.10/node_modules/@vitest/utils/dist/helpers.js +0 -272
  258. package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.10/node_modules/@vitest/utils/dist/offset.js +0 -27
  259. package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.10/node_modules/@vitest/utils/dist/serialize.js +0 -77
  260. package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.10/node_modules/@vitest/utils/dist/source-map.js +0 -381
  261. package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.10/node_modules/@vitest/utils/dist/timers.js +0 -51
  262. package/bundle/dist/node_modules/.pnpm/chai@6.2.2/node_modules/chai/index.js +0 -2986
  263. package/bundle/dist/node_modules/.pnpm/expect-type@1.3.0/node_modules/expect-type/dist/branding.js +0 -10
  264. package/bundle/dist/node_modules/.pnpm/expect-type@1.3.0/node_modules/expect-type/dist/index.js +0 -109
  265. package/bundle/dist/node_modules/.pnpm/expect-type@1.3.0/node_modules/expect-type/dist/messages.js +0 -10
  266. package/bundle/dist/node_modules/.pnpm/expect-type@1.3.0/node_modules/expect-type/dist/overloads.js +0 -10
  267. package/bundle/dist/node_modules/.pnpm/expect-type@1.3.0/node_modules/expect-type/dist/utils.js +0 -10
  268. package/bundle/dist/node_modules/.pnpm/magic-string@0.30.21/node_modules/magic-string/dist/magic-string.es.js +0 -1126
  269. package/bundle/dist/node_modules/.pnpm/pathe@2.0.3/node_modules/pathe/dist/index.js +0 -21
  270. package/bundle/dist/node_modules/.pnpm/pathe@2.0.3/node_modules/pathe/dist/shared/pathe.M-eThtNZ.js +0 -432
  271. package/bundle/dist/node_modules/.pnpm/tinybench@2.9.0/node_modules/tinybench/dist/index.js +0 -517
  272. package/bundle/dist/node_modules/.pnpm/tinyrainbow@3.1.0/node_modules/tinyrainbow/dist/index.js +0 -101
  273. package/bundle/dist/node_modules/.pnpm/vite@8.0.3_@emnapi_core@1.11.2_@emnapi_runtime@1.11.2_@types_node@25.0.7_esbuild@0.27.4_5b35fc1fb85d2af4d105e0d74f940f50/node_modules/vite/dist/node/module-runner.js +0 -1265
  274. package/bundle/dist/node_modules/.pnpm/vitest@4.1.10_@opentelemetry_api@1.9.0_@types_node@25.0.7_@vitest_coverage-v8@4.1.10_vi_a1977b93af7bb69308bcb1dbab39b618/node_modules/vitest/dist/chunks/_commonjsHelpers.D26ty3Ew.js +0 -9
  275. package/bundle/dist/node_modules/.pnpm/vitest@4.1.10_@opentelemetry_api@1.9.0_@types_node@25.0.7_@vitest_coverage-v8@4.1.10_vi_a1977b93af7bb69308bcb1dbab39b618/node_modules/vitest/dist/chunks/benchmark.CX_oY03V.js +0 -41
  276. package/bundle/dist/node_modules/.pnpm/vitest@4.1.10_@opentelemetry_api@1.9.0_@types_node@25.0.7_@vitest_coverage-v8@4.1.10_vi_a1977b93af7bb69308bcb1dbab39b618/node_modules/vitest/dist/chunks/evaluatedModules.Dg1zASAC.js +0 -19
  277. package/bundle/dist/node_modules/.pnpm/vitest@4.1.10_@opentelemetry_api@1.9.0_@types_node@25.0.7_@vitest_coverage-v8@4.1.10_vi_a1977b93af7bb69308bcb1dbab39b618/node_modules/vitest/dist/chunks/index.Chj8NDwU.js +0 -202
  278. package/bundle/dist/node_modules/.pnpm/vitest@4.1.10_@opentelemetry_api@1.9.0_@types_node@25.0.7_@vitest_coverage-v8@4.1.10_vi_a1977b93af7bb69308bcb1dbab39b618/node_modules/vitest/dist/chunks/index.DdgEv5B1.js +0 -46
  279. package/bundle/dist/node_modules/.pnpm/vitest@4.1.10_@opentelemetry_api@1.9.0_@types_node@25.0.7_@vitest_coverage-v8@4.1.10_vi_a1977b93af7bb69308bcb1dbab39b618/node_modules/vitest/dist/chunks/rpc.MzXet3jl.js +0 -119
  280. package/bundle/dist/node_modules/.pnpm/vitest@4.1.10_@opentelemetry_api@1.9.0_@types_node@25.0.7_@vitest_coverage-v8@4.1.10_vi_a1977b93af7bb69308bcb1dbab39b618/node_modules/vitest/dist/chunks/test.DNmyFkvJ.js +0 -3044
  281. package/bundle/dist/node_modules/.pnpm/vitest@4.1.10_@opentelemetry_api@1.9.0_@types_node@25.0.7_@vitest_coverage-v8@4.1.10_vi_a1977b93af7bb69308bcb1dbab39b618/node_modules/vitest/dist/chunks/utils.BX5Fg8C4.js +0 -59
  282. package/bundle/dist/node_modules/.pnpm/vitest@4.1.10_@opentelemetry_api@1.9.0_@types_node@25.0.7_@vitest_coverage-v8@4.1.10_vi_a1977b93af7bb69308bcb1dbab39b618/node_modules/vitest/dist/index.js +0 -28
  283. package/bundle/dist/testing/setup-mocks.js +0 -16
  284. package/bundle/src/testing/setup-mocks.ts +0 -44
  285. package/bundle/web-dist/client/assets/index-Bw2s88Ot.css +0 -1
  286. package/bundle/web-dist/client/assets/index-DZwzUfI-.js +0 -106
  287. package/bundle/web-dist/client/assets/logs-Cog79DU5.js +0 -1
  288. package/bundle/web-dist/client/assets/monit-2auznBys.js +0 -1
  289. package/bundle/web-dist/client/assets/routes-B0lTeLK-.js +0 -5
  290. package/bundle/web-dist/client/assets/settings-D8ZxZGSJ.js +0 -1
  291. package/bundle/web-dist/client/assets/show-CFSERlnM.js +0 -2
  292. package/bundle/web-dist/client/assets/tokens-CZXUyI7O.js +0 -1
  293. package/bundle/web-dist/client/assets/use-oauth-login-flow-hboOs3wG.js +0 -1
  294. package/bundle/web-dist/client/assets/use-update-token-mutation-BQHS0byG.js +0 -1
  295. package/bundle/web-dist/server/assets/use-oauth-login-flow-Gn8flMK5.js +0 -178
  296. package/dist/cli.d.ts +0 -10
  297. /package/bundle/web-dist/client/assets/{cost-DH2jZbrw.js → cost-DB3HbU7T.js} +0 -0
  298. /package/bundle/web-dist/client/assets/{plus-B62CuqT8.js → plus-BsQdY7PS.js} +0 -0
  299. /package/bundle/web-dist/client/assets/{preload-helper-ca-nBW7U.js → preload-helper-DWTEM3RW.js} +0 -0
  300. /package/bundle/web-dist/client/assets/{refresh-cw-NNcU0Cmq.js → refresh-cw-D9IUmT23.js} +0 -0
  301. /package/bundle/web-dist/client/assets/{request-model-CojtinqK.js → request-model-Bpp_rkK8.js} +0 -0
  302. /package/bundle/web-dist/server/assets/{cost-eEHeTRT5.js → cost-BC9yzyA9.js} +0 -0
@@ -1,3 +1,4 @@
1
+ import { isJsonObject, jsonString } from "../common/provider-types.js";
1
2
  import { ImageGenerationMetadata } from "../../../application/qgrid/qgrid.types.js";
2
3
  import { CHATGPT_CODEX_RESPONSES_URL, OpenAIProtocolError, imageMimeType } from "./openai-backend-protocol.js";
3
4
  import { z } from "zod";
@@ -16,53 +17,65 @@ const PNG_SIGNATURE = Buffer.from([
16
17
  26,
17
18
  10
18
19
  ]);
20
+ const TEXT_PART_TYPES = /* @__PURE__ */ new Set([
21
+ "input_text",
22
+ "output_text",
23
+ "text"
24
+ ]);
25
+ function imageUrlOf(value) {
26
+ return jsonString(value) ?? (isJsonObject(value) ? jsonString(value.url) : void 0);
27
+ }
19
28
  function buildStandaloneImageRequest(options) {
20
29
  if (options.outputSchema || options.tools?.length) throw new OpenAIProtocolError("Standalone image generation does not support tools or structured output");
21
30
  if (!options.imageGeneration) throw new OpenAIProtocolError("Standalone images require image generation to be enabled");
22
- const controls = typeof options.imageGeneration === "object" ? options.imageGeneration : {};
31
+ const controls = options.imageGeneration === true ? {} : options.imageGeneration;
23
32
  if (options.model !== "gpt-image-2" && controls.background !== "transparent") throw new OpenAIProtocolError("Standalone images require an explicit transparent background request");
24
33
  if (controls.output_format && controls.output_format !== "png") throw new OpenAIProtocolError("Standalone image generation only supports PNG output");
25
34
  const text = [];
26
35
  const images = [];
27
36
  if (options.instructions) text.push(`System instructions:\n${options.instructions}`);
28
37
  for (const item of options.history) {
38
+ if (!isJsonObject(item)) throw new OpenAIProtocolError("Unsupported conversation item for standalone image generation");
29
39
  if (item.type === "reasoning") continue;
30
- if (item.type === "image_generation_call" && typeof item.result === "string") {
31
- images.push({ image_url: `data:${imageMimeType(item.result, item.output_format)};base64,${item.result}` });
40
+ const result = jsonString(item.result);
41
+ if (item.type === "image_generation_call" && result !== void 0) {
42
+ images.push({ image_url: `data:${imageMimeType(result, item.output_format)};base64,${result}` });
32
43
  continue;
33
44
  }
34
- if (item.type !== "message" && typeof item.role !== "string") throw new OpenAIProtocolError("Unsupported conversation item for standalone image generation");
35
- if (typeof item.content === "string") {
36
- text.push(`${item.role ?? "user"}:\n${item.content}`);
45
+ const role = jsonString(item.role);
46
+ if (item.type !== "message" && role === void 0) throw new OpenAIProtocolError("Unsupported conversation item for standalone image generation");
47
+ const speaker = role ?? "user";
48
+ const content = jsonString(item.content);
49
+ if (content !== void 0) {
50
+ text.push(`${speaker}:\n${content}`);
37
51
  continue;
38
52
  }
39
53
  if (!Array.isArray(item.content)) throw new OpenAIProtocolError("Unsupported message content for standalone image generation");
40
54
  for (const part of item.content) {
41
- if (!part || typeof part !== "object") throw new OpenAIProtocolError("Unsupported message part for standalone image generation");
42
- if ([
43
- "input_text",
44
- "output_text",
45
- "text"
46
- ].includes(part.type) && typeof part.text === "string") text.push(`${item.role ?? "user"}:\n${part.text}`);
55
+ if (!isJsonObject(part)) throw new OpenAIProtocolError("Unsupported message part for standalone image generation");
56
+ const partType = jsonString(part.type);
57
+ const partText = jsonString(part.text);
58
+ if (partType !== void 0 && TEXT_PART_TYPES.has(partType) && partText !== void 0) text.push(`${speaker}:\n${partText}`);
47
59
  else if (part.type === "input_image" || part.type === "image_url") {
48
- const url = typeof part.image_url === "string" ? part.image_url : part.image_url?.url;
49
- if (typeof url !== "string" || !/^(https:\/\/|data:image\/)/i.test(url)) throw new OpenAIProtocolError("Image references must be HTTPS URLs or image data URLs");
60
+ const url = imageUrlOf(part.image_url);
61
+ if (url === void 0 || !/^(https:\/\/|data:image\/)/i.test(url)) throw new OpenAIProtocolError("Image references must be HTTPS URLs or image data URLs");
50
62
  images.push({ image_url: url });
51
63
  } else throw new OpenAIProtocolError("Unsupported message part for standalone image generation");
52
64
  }
53
65
  }
54
66
  if (images.length > 5) throw new OpenAIProtocolError("Standalone image editing supports at most 5 reference images");
55
67
  if (!text.some((part) => part.trim())) throw new OpenAIProtocolError("Image prompt is empty");
68
+ const body = {
69
+ model: "gpt-image-2",
70
+ prompt: text.join("\n\n")
71
+ };
72
+ if (controls.background) body.background = controls.background;
73
+ if (controls.quality) body.quality = controls.quality;
74
+ if (controls.size) body.size = controls.size;
75
+ if (images.length) body.images = images;
56
76
  return {
57
77
  url: CHATGPT_CODEX_RESPONSES_URL.replace(/\/responses$/, `/images/${images.length ? "edits" : "generations"}`),
58
- body: {
59
- model: "gpt-image-2",
60
- prompt: text.join("\n\n"),
61
- ...controls.background ? { background: controls.background } : {},
62
- ...controls.quality ? { quality: controls.quality } : {},
63
- ...controls.size ? { size: controls.size } : {},
64
- ...images.length ? { images } : {}
65
- }
78
+ body
66
79
  };
67
80
  }
68
81
  function inspectGeneratedPng(base64, requireTransparency) {
@@ -132,23 +145,25 @@ async function readStandaloneImageResponse(response, requireTransparency) {
132
145
  const background = parsed.background ?? (requireTransparency ? "transparent" : void 0);
133
146
  return parsed.data.map((item, index) => {
134
147
  const dimensions = inspectGeneratedPng(item.b64_json, requireTransparency);
135
- return {
148
+ const generation = {
149
+ route: "codex-images",
150
+ model: parsed.model ?? "gpt-image-2",
151
+ size: `${dimensions.width}x${dimensions.height}`
152
+ };
153
+ if (background) generation.background = background;
154
+ if (parsed.quality) generation.quality = parsed.quality;
155
+ if (index === 0 && parsed.usage) generation.usage = parsed.usage;
156
+ const event = {
136
157
  type: "image",
137
158
  base64: item.b64_json,
138
159
  mimeType: "image/png",
139
- ...item.revised_prompt ? { revisedPrompt: item.revised_prompt } : {},
140
- generation: {
141
- route: "codex-images",
142
- model: parsed.model ?? "gpt-image-2",
143
- ...background ? { background } : {},
144
- size: `${dimensions.width}x${dimensions.height}`,
145
- ...parsed.quality ? { quality: parsed.quality } : {},
146
- ...index === 0 && parsed.usage ? { usage: parsed.usage } : {}
147
- }
160
+ generation
148
161
  };
162
+ if (item.revised_prompt) event.revisedPrompt = item.revised_prompt;
163
+ return event;
149
164
  });
150
165
  }
151
166
  //#endregion
152
167
  export { buildStandaloneImageRequest, readStandaloneImageResponse };
153
168
 
154
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3BlbmFpLWltYWdlLWdlbmVyYXRpb24uanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3V0aWxzL3Byb3ZpZGVycy9vcGVuYWkvb3BlbmFpLWltYWdlLWdlbmVyYXRpb24udHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUE5HIH0gZnJvbSBcInBuZ2pzXCI7XG5pbXBvcnQgeyB6IH0gZnJvbSBcInpvZFwiO1xuXG5pbXBvcnQgeyBJbWFnZUdlbmVyYXRpb25NZXRhZGF0YSB9IGZyb20gXCIuLi8uLi8uLi9hcHBsaWNhdGlvbi9xZ3JpZC9xZ3JpZC50eXBlc1wiO1xuaW1wb3J0IHtcbiAgQ0hBVEdQVF9DT0RFWF9SRVNQT05TRVNfVVJMLFxuICBpbWFnZU1pbWVUeXBlLFxuICBPcGVuQUlQcm90b2NvbEVycm9yLFxuICB0eXBlIE9wZW5BSU5vcm1hbGl6ZWRFdmVudCxcbiAgdHlwZSBPcGVuQUlSZXNwb25zZXNPcHRpb25zLFxufSBmcm9tIFwiLi9vcGVuYWktYmFja2VuZC1wcm90b2NvbFwiO1xuXG5jb25zdCBNQVhfUE5HX0JZVEVTID0gMzIgKiAxMDI0ICogMTAyNDtcbmNvbnN0IE1BWF9JTUFHRV9QSVhFTFMgPSA0MDk2ICogNDA5NjtcbmNvbnN0IE1BWF9SRVNQT05TRV9CWVRFUyA9IDY0ICogMTAyNCAqIDEwMjQ7XG5jb25zdCBQTkdfU0lHTkFUVVJFID0gQnVmZmVyLmZyb20oWzEzNywgODAsIDc4LCA3MSwgMTMsIDEwLCAyNiwgMTBdKTtcblxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkU3RhbmRhbG9uZUltYWdlUmVxdWVzdChvcHRpb25zOiBPcGVuQUlSZXNwb25zZXNPcHRpb25zKSB7XG4gIGlmIChvcHRpb25zLm91dHB1dFNjaGVtYSB8fCBvcHRpb25zLnRvb2xzPy5sZW5ndGgpIHtcbiAgICB0aHJvdyBuZXcgT3BlbkFJUHJvdG9jb2xFcnJvcihcbiAgICAgIFwiU3RhbmRhbG9uZSBpbWFnZSBnZW5lcmF0aW9uIGRvZXMgbm90IHN1cHBvcnQgdG9vbHMgb3Igc3RydWN0dXJlZCBvdXRwdXRcIixcbiAgICApO1xuICB9XG4gIGlmICghb3B0aW9ucy5pbWFnZUdlbmVyYXRpb24pIHtcbiAgICB0aHJvdyBuZXcgT3BlbkFJUHJvdG9jb2xFcnJvcihcIlN0YW5kYWxvbmUgaW1hZ2VzIHJlcXVpcmUgaW1hZ2UgZ2VuZXJhdGlvbiB0byBiZSBlbmFibGVkXCIpO1xuICB9XG4gIGNvbnN0IGNvbnRyb2xzID0gdHlwZW9mIG9wdGlvbnMuaW1hZ2VHZW5lcmF0aW9uID09PSBcIm9iamVjdFwiID8gb3B0aW9ucy5pbWFnZUdlbmVyYXRpb24gOiB7fTtcbiAgaWYgKG9wdGlvbnMubW9kZWwgIT09IFwiZ3B0LWltYWdlLTJcIiAmJiBjb250cm9scy5iYWNrZ3JvdW5kICE9PSBcInRyYW5zcGFyZW50XCIpIHtcbiAgICB0aHJvdyBuZXcgT3BlbkFJUHJvdG9jb2xFcnJvcihcbiAgICAgIFwiU3RhbmRhbG9uZSBpbWFnZXMgcmVxdWlyZSBhbiBleHBsaWNpdCB0cmFuc3BhcmVudCBiYWNrZ3JvdW5kIHJlcXVlc3RcIixcbiAgICApO1xuICB9XG4gIGlmIChjb250cm9scy5vdXRwdXRfZm9ybWF0ICYmIGNvbnRyb2xzLm91dHB1dF9mb3JtYXQgIT09IFwicG5nXCIpIHtcbiAgICB0aHJvdyBuZXcgT3BlbkFJUHJvdG9jb2xFcnJvcihcIlN0YW5kYWxvbmUgaW1hZ2UgZ2VuZXJhdGlvbiBvbmx5IHN1cHBvcnRzIFBORyBvdXRwdXRcIik7XG4gIH1cbiAgY29uc3QgdGV4dDogc3RyaW5nW10gPSBbXTtcbiAgY29uc3QgaW1hZ2VzOiBBcnJheTx7IGltYWdlX3VybDogc3RyaW5nIH0+ID0gW107XG4gIGlmIChvcHRpb25zLmluc3RydWN0aW9ucykgdGV4dC5wdXNoKGBTeXN0ZW0gaW5zdHJ1Y3Rpb25zOlxcbiR7b3B0aW9ucy5pbnN0cnVjdGlvbnN9YCk7XG4gIGZvciAoY29uc3QgaXRlbSBvZiBvcHRpb25zLmhpc3RvcnkpIHtcbiAgICBpZiAoaXRlbS50eXBlID09PSBcInJlYXNvbmluZ1wiKSBjb250aW51ZTtcbiAgICBpZiAoaXRlbS50eXBlID09PSBcImltYWdlX2dlbmVyYXRpb25fY2FsbFwiICYmIHR5cGVvZiBpdGVtLnJlc3VsdCA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgaW1hZ2VzLnB1c2goe1xuICAgICAgICBpbWFnZV91cmw6IGBkYXRhOiR7aW1hZ2VNaW1lVHlwZShpdGVtLnJlc3VsdCwgaXRlbS5vdXRwdXRfZm9ybWF0KX07YmFzZTY0LCR7aXRlbS5yZXN1bHR9YCxcbiAgICAgIH0pO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmIChpdGVtLnR5cGUgIT09IFwibWVzc2FnZVwiICYmIHR5cGVvZiBpdGVtLnJvbGUgIT09IFwic3RyaW5nXCIpIHtcbiAgICAgIHRocm93IG5ldyBPcGVuQUlQcm90b2NvbEVycm9yKFxuICAgICAgICBcIlVuc3VwcG9ydGVkIGNvbnZlcnNhdGlvbiBpdGVtIGZvciBzdGFuZGFsb25lIGltYWdlIGdlbmVyYXRpb25cIixcbiAgICAgICk7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgaXRlbS5jb250ZW50ID09PSBcInN0cmluZ1wiKSB7XG4gICAgICB0ZXh0LnB1c2goYCR7aXRlbS5yb2xlID8/IFwidXNlclwifTpcXG4ke2l0ZW0uY29udGVudH1gKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoaXRlbS5jb250ZW50KSkge1xuICAgICAgdGhyb3cgbmV3IE9wZW5BSVByb3RvY29sRXJyb3IoXCJVbnN1cHBvcnRlZCBtZXNzYWdlIGNvbnRlbnQgZm9yIHN0YW5kYWxvbmUgaW1hZ2UgZ2VuZXJhdGlvblwiKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBwYXJ0IG9mIGl0ZW0uY29udGVudCkge1xuICAgICAgaWYgKCFwYXJ0IHx8IHR5cGVvZiBwYXJ0ICE9PSBcIm9iamVjdFwiKSB7XG4gICAgICAgIHRocm93IG5ldyBPcGVuQUlQcm90b2NvbEVycm9yKFwiVW5zdXBwb3J0ZWQgbWVzc2FnZSBwYXJ0IGZvciBzdGFuZGFsb25lIGltYWdlIGdlbmVyYXRpb25cIik7XG4gICAgICB9XG4gICAgICBpZiAoXG4gICAgICAgIFtcImlucHV0X3RleHRcIiwgXCJvdXRwdXRfdGV4dFwiLCBcInRleHRcIl0uaW5jbHVkZXMocGFydC50eXBlKSAmJlxuICAgICAgICB0eXBlb2YgcGFydC50ZXh0ID09PSBcInN0cmluZ1wiXG4gICAgICApIHtcbiAgICAgICAgdGV4dC5wdXNoKGAke2l0ZW0ucm9sZSA/PyBcInVzZXJcIn06XFxuJHtwYXJ0LnRleHR9YCk7XG4gICAgICB9IGVsc2UgaWYgKHBhcnQudHlwZSA9PT0gXCJpbnB1dF9pbWFnZVwiIHx8IHBhcnQudHlwZSA9PT0gXCJpbWFnZV91cmxcIikge1xuICAgICAgICBjb25zdCB1cmwgPSB0eXBlb2YgcGFydC5pbWFnZV91cmwgPT09IFwic3RyaW5nXCIgPyBwYXJ0LmltYWdlX3VybCA6IHBhcnQuaW1hZ2VfdXJsPy51cmw7XG4gICAgICAgIGlmICh0eXBlb2YgdXJsICE9PSBcInN0cmluZ1wiIHx8ICEvXihodHRwczpcXC9cXC98ZGF0YTppbWFnZVxcLykvaS50ZXN0KHVybCkpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgT3BlbkFJUHJvdG9jb2xFcnJvcihcIkltYWdlIHJlZmVyZW5jZXMgbXVzdCBiZSBIVFRQUyBVUkxzIG9yIGltYWdlIGRhdGEgVVJMc1wiKTtcbiAgICAgICAgfVxuICAgICAgICBpbWFnZXMucHVzaCh7IGltYWdlX3VybDogdXJsIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IE9wZW5BSVByb3RvY29sRXJyb3IoXCJVbnN1cHBvcnRlZCBtZXNzYWdlIHBhcnQgZm9yIHN0YW5kYWxvbmUgaW1hZ2UgZ2VuZXJhdGlvblwiKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgaWYgKGltYWdlcy5sZW5ndGggPiA1KVxuICAgIHRocm93IG5ldyBPcGVuQUlQcm90b2NvbEVycm9yKFwiU3RhbmRhbG9uZSBpbWFnZSBlZGl0aW5nIHN1cHBvcnRzIGF0IG1vc3QgNSByZWZlcmVuY2UgaW1hZ2VzXCIpO1xuICBpZiAoIXRleHQuc29tZSgocGFydCkgPT4gcGFydC50cmltKCkpKSB0aHJvdyBuZXcgT3BlbkFJUHJvdG9jb2xFcnJvcihcIkltYWdlIHByb21wdCBpcyBlbXB0eVwiKTtcbiAgcmV0dXJuIHtcbiAgICB1cmw6IENIQVRHUFRfQ09ERVhfUkVTUE9OU0VTX1VSTC5yZXBsYWNlKFxuICAgICAgL1xcL3Jlc3BvbnNlcyQvLFxuICAgICAgYC9pbWFnZXMvJHtpbWFnZXMubGVuZ3RoID8gXCJlZGl0c1wiIDogXCJnZW5lcmF0aW9uc1wifWAsXG4gICAgKSxcbiAgICBib2R5OiB7XG4gICAgICBtb2RlbDogXCJncHQtaW1hZ2UtMlwiLFxuICAgICAgcHJvbXB0OiB0ZXh0LmpvaW4oXCJcXG5cXG5cIiksXG4gICAgICAuLi4oY29udHJvbHMuYmFja2dyb3VuZCA/IHsgYmFja2dyb3VuZDogY29udHJvbHMuYmFja2dyb3VuZCB9IDoge30pLFxuICAgICAgLi4uKGNvbnRyb2xzLnF1YWxpdHkgPyB7IHF1YWxpdHk6IGNvbnRyb2xzLnF1YWxpdHkgfSA6IHt9KSxcbiAgICAgIC4uLihjb250cm9scy5zaXplID8geyBzaXplOiBjb250cm9scy5zaXplIH0gOiB7fSksXG4gICAgICAuLi4oaW1hZ2VzLmxlbmd0aCA/IHsgaW1hZ2VzIH0gOiB7fSksXG4gICAgfSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gaW5zcGVjdEdlbmVyYXRlZFBuZyhcbiAgYmFzZTY0OiBzdHJpbmcsXG4gIHJlcXVpcmVUcmFuc3BhcmVuY3k6IGJvb2xlYW4sXG4pOiB7IHdpZHRoOiBudW1iZXI7IGhlaWdodDogbnVtYmVyIH0ge1xuICBpZiAoYmFzZTY0Lmxlbmd0aCA+IE1hdGguY2VpbChNQVhfUE5HX0JZVEVTIC8gMykgKiA0IHx8ICEvXltBLVphLXowLTkrL10rPXswLDJ9JC8udGVzdChiYXNlNjQpKSB7XG4gICAgdGhyb3cgbmV3IE9wZW5BSVByb3RvY29sRXJyb3IoXCJJbnZhbGlkIG9yIG92ZXJzaXplZCBnZW5lcmF0ZWQgUE5HXCIpO1xuICB9XG4gIGNvbnN0IGJ5dGVzID0gQnVmZmVyLmZyb20oYmFzZTY0LCBcImJhc2U2NFwiKTtcbiAgaWYgKFxuICAgIGJ5dGVzLmxlbmd0aCA8IDMzIHx8XG4gICAgIWJ5dGVzLnN1YmFycmF5KDAsIDgpLmVxdWFscyhQTkdfU0lHTkFUVVJFKSB8fFxuICAgIGJ5dGVzLnRvU3RyaW5nKFwiYXNjaWlcIiwgMTIsIDE2KSAhPT0gXCJJSERSXCJcbiAgKSB7XG4gICAgdGhyb3cgbmV3IE9wZW5BSVByb3RvY29sRXJyb3IoXCJJbWFnZSBnZW5lcmF0aW9uIGRpZCBub3QgcmV0dXJuIGEgUE5HXCIpO1xuICB9XG4gIGNvbnN0IHdpZHRoID0gYnl0ZXMucmVhZFVJbnQzMkJFKDE2KTtcbiAgY29uc3QgaGVpZ2h0ID0gYnl0ZXMucmVhZFVJbnQzMkJFKDIwKTtcbiAgaWYgKCF3aWR0aCB8fCAhaGVpZ2h0IHx8IHdpZHRoICogaGVpZ2h0ID4gTUFYX0lNQUdFX1BJWEVMUykge1xuICAgIHRocm93IG5ldyBPcGVuQUlQcm90b2NvbEVycm9yKFwiR2VuZXJhdGVkIFBORyBkaW1lbnNpb25zIGV4Y2VlZCB0aGUgZGVjb2RpbmcgbGltaXRcIik7XG4gIH1cbiAgbGV0IGltYWdlOiBQTkc7XG4gIHRyeSB7XG4gICAgaW1hZ2UgPSBQTkcuc3luYy5yZWFkKGJ5dGVzKTtcbiAgfSBjYXRjaCB7XG4gICAgdGhyb3cgbmV3IE9wZW5BSVByb3RvY29sRXJyb3IoXCJJbWFnZSBnZW5lcmF0aW9uIHJldHVybmVkIGFuIGludmFsaWQgUE5HXCIpO1xuICB9XG4gIGlmICghcmVxdWlyZVRyYW5zcGFyZW5jeSkgcmV0dXJuIHsgd2lkdGg6IGltYWdlLndpZHRoLCBoZWlnaHQ6IGltYWdlLmhlaWdodCB9O1xuICAvLyBBbiBhbHBoYSBjaGFubmVsIGFsb25lIGNhbiBzdGlsbCBiZSBmdWxseSBvcGFxdWUgb3IgaGF2ZSBubyB2aXNpYmxlIGNvbnRlbnQuXG4gIGxldCB0cmFuc3BhcmVudCA9IGZhbHNlO1xuICBsZXQgdmlzaWJsZSA9IGZhbHNlO1xuICBmb3IgKGxldCBpID0gMzsgaSA8IGltYWdlLmRhdGEubGVuZ3RoOyBpICs9IDQpIHtcbiAgICB0cmFuc3BhcmVudCB8fD0gaW1hZ2UuZGF0YVtpXSA9PT0gMDtcbiAgICB2aXNpYmxlIHx8PSBpbWFnZS5kYXRhW2ldISA+IDA7XG4gICAgaWYgKHRyYW5zcGFyZW50ICYmIHZpc2libGUpIHJldHVybiB7IHdpZHRoOiBpbWFnZS53aWR0aCwgaGVpZ2h0OiBpbWFnZS5oZWlnaHQgfTtcbiAgfVxuICB0aHJvdyBuZXcgT3BlbkFJUHJvdG9jb2xFcnJvcihcbiAgICBcIkltYWdlIGdlbmVyYXRpb24gZGlkIG5vdCByZXR1cm4gdmlzaWJsZSBjb250ZW50IG9uIGEgdHJhbnNwYXJlbnQgYmFja2dyb3VuZFwiLFxuICApO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVhZFN0YW5kYWxvbmVJbWFnZVJlc3BvbnNlKFxuICByZXNwb25zZTogUmVzcG9uc2UsXG4gIHJlcXVpcmVUcmFuc3BhcmVuY3k6IGJvb2xlYW4sXG4pOiBQcm9taXNlPE9wZW5BSU5vcm1hbGl6ZWRFdmVudFtdPiB7XG4gIGlmICghcmVzcG9uc2UuYm9keSkgdGhyb3cgbmV3IE9wZW5BSVByb3RvY29sRXJyb3IoXCJJbWFnZSByZXNwb25zZSBoYWQgbm8gYm9keVwiKTtcbiAgY29uc3QgcmVhZGVyID0gcmVzcG9uc2UuYm9keS5nZXRSZWFkZXIoKTtcbiAgY29uc3QgY2h1bmtzOiBVaW50OEFycmF5W10gPSBbXTtcbiAgbGV0IHNpemUgPSAwO1xuICB0cnkge1xuICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICBjb25zdCB7IGRvbmUsIHZhbHVlIH0gPSBhd2FpdCByZWFkZXIucmVhZCgpO1xuICAgICAgaWYgKGRvbmUpIGJyZWFrO1xuICAgICAgc2l6ZSArPSB2YWx1ZS5ieXRlTGVuZ3RoO1xuICAgICAgaWYgKHNpemUgPiBNQVhfUkVTUE9OU0VfQllURVMpIHtcbiAgICAgICAgYXdhaXQgcmVhZGVyLmNhbmNlbCgpO1xuICAgICAgICB0aHJvdyBuZXcgT3BlbkFJUHJvdG9jb2xFcnJvcihcIkltYWdlIHJlc3BvbnNlIGV4Y2VlZGVkIHRoZSBzaXplIGxpbWl0XCIpO1xuICAgICAgfVxuICAgICAgY2h1bmtzLnB1c2godmFsdWUpO1xuICAgIH1cbiAgfSBmaW5hbGx5IHtcbiAgICByZWFkZXIucmVsZWFzZUxvY2soKTtcbiAgfVxuICBjb25zdCBzY2hlbWEgPSB6Lm9iamVjdCh7XG4gICAgZGF0YTogelxuICAgICAgLmFycmF5KHoub2JqZWN0KHsgYjY0X2pzb246IHouc3RyaW5nKCkubWluKDEpLCByZXZpc2VkX3Byb21wdDogei5zdHJpbmcoKS5udWxsaXNoKCkgfSkpXG4gICAgICAubWluKDEpXG4gICAgICAubWF4KDE2KSxcbiAgICBxdWFsaXR5OiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG4gICAgbW9kZWw6IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgICBiYWNrZ3JvdW5kOiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG4gICAgdXNhZ2U6IEltYWdlR2VuZXJhdGlvbk1ldGFkYXRhLnNoYXBlLnVzYWdlLFxuICB9KTtcbiAgbGV0IHBhcnNlZDogei5pbmZlcjx0eXBlb2Ygc2NoZW1hPjtcbiAgdHJ5IHtcbiAgICBwYXJzZWQgPSBzY2hlbWEucGFyc2UoSlNPTi5wYXJzZShCdWZmZXIuY29uY2F0KGNodW5rcykudG9TdHJpbmcoXCJ1dGY4XCIpKSk7XG4gIH0gY2F0Y2gge1xuICAgIHRocm93IG5ldyBPcGVuQUlQcm90b2NvbEVycm9yKFwiSW52YWxpZCBzdGFuZGFsb25lIGltYWdlIHJlc3BvbnNlXCIpO1xuICB9XG4gIGNvbnN0IGJhY2tncm91bmQgPSBwYXJzZWQuYmFja2dyb3VuZCA/PyAocmVxdWlyZVRyYW5zcGFyZW5jeSA/IFwidHJhbnNwYXJlbnRcIiA6IHVuZGVmaW5lZCk7XG4gIHJldHVybiBwYXJzZWQuZGF0YS5tYXAoKGl0ZW0sIGluZGV4KSA9PiB7XG4gICAgY29uc3QgZGltZW5zaW9ucyA9IGluc3BlY3RHZW5lcmF0ZWRQbmcoaXRlbS5iNjRfanNvbiwgcmVxdWlyZVRyYW5zcGFyZW5jeSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6IFwiaW1hZ2VcIixcbiAgICAgIGJhc2U2NDogaXRlbS5iNjRfanNvbixcbiAgICAgIG1pbWVUeXBlOiBcImltYWdlL3BuZ1wiLFxuICAgICAgLi4uKGl0ZW0ucmV2aXNlZF9wcm9tcHQgPyB7IHJldmlzZWRQcm9tcHQ6IGl0ZW0ucmV2aXNlZF9wcm9tcHQgfSA6IHt9KSxcbiAgICAgIGdlbmVyYXRpb246IHtcbiAgICAgICAgcm91dGU6IFwiY29kZXgtaW1hZ2VzXCIsXG4gICAgICAgIG1vZGVsOiBwYXJzZWQubW9kZWwgPz8gXCJncHQtaW1hZ2UtMlwiLFxuICAgICAgICAuLi4oYmFja2dyb3VuZCA/IHsgYmFja2dyb3VuZCB9IDoge30pLFxuICAgICAgICBzaXplOiBgJHtkaW1lbnNpb25zLndpZHRofXgke2RpbWVuc2lvbnMuaGVpZ2h0fWAsXG4gICAgICAgIC4uLihwYXJzZWQucXVhbGl0eSA/IHsgcXVhbGl0eTogcGFyc2VkLnF1YWxpdHkgfSA6IHt9KSxcbiAgICAgICAgLi4uKGluZGV4ID09PSAwICYmIHBhcnNlZC51c2FnZSA/IHsgdXNhZ2U6IHBhcnNlZC51c2FnZSB9IDoge30pLFxuICAgICAgfSxcbiAgICB9O1xuICB9KTtcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFZQSxNQUFNLGdCQUFnQixLQUFLLE9BQU87QUFDbEMsTUFBTSxtQkFBbUIsT0FBTztBQUNoQyxNQUFNLHFCQUFxQixLQUFLLE9BQU87QUFDdkMsTUFBTSxnQkFBZ0IsT0FBTyxLQUFLO0NBQUM7Q0FBSztDQUFJO0NBQUk7Q0FBSTtDQUFJO0NBQUk7Q0FBSTtBQUFFLENBQUM7QUFFbkUsU0FBZ0IsNEJBQTRCLFNBQWlDO0NB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
169
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3BlbmFpLWltYWdlLWdlbmVyYXRpb24uanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3V0aWxzL3Byb3ZpZGVycy9vcGVuYWkvb3BlbmFpLWltYWdlLWdlbmVyYXRpb24udHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUE5HIH0gZnJvbSBcInBuZ2pzXCI7XG5pbXBvcnQgeyB6IH0gZnJvbSBcInpvZFwiO1xuXG5pbXBvcnQgeyBJbWFnZUdlbmVyYXRpb25NZXRhZGF0YSB9IGZyb20gXCIuLi8uLi8uLi9hcHBsaWNhdGlvbi9xZ3JpZC9xZ3JpZC50eXBlc1wiO1xuaW1wb3J0IHsgaXNKc29uT2JqZWN0LCB0eXBlIEpzb25WYWx1ZSwganNvblN0cmluZyB9IGZyb20gXCIuLi9jb21tb24vcHJvdmlkZXItdHlwZXNcIjtcbmltcG9ydCB7XG4gIENIQVRHUFRfQ09ERVhfUkVTUE9OU0VTX1VSTCxcbiAgaW1hZ2VNaW1lVHlwZSxcbiAgT3BlbkFJUHJvdG9jb2xFcnJvcixcbiAgdHlwZSBPcGVuQUlOb3JtYWxpemVkRXZlbnQsXG4gIHR5cGUgT3BlbkFJUmVzcG9uc2VzT3B0aW9ucyxcbn0gZnJvbSBcIi4vb3BlbmFpLWJhY2tlbmQtcHJvdG9jb2xcIjtcblxuY29uc3QgTUFYX1BOR19CWVRFUyA9IDMyICogMTAyNCAqIDEwMjQ7XG5jb25zdCBNQVhfSU1BR0VfUElYRUxTID0gNDA5NiAqIDQwOTY7XG5jb25zdCBNQVhfUkVTUE9OU0VfQllURVMgPSA2NCAqIDEwMjQgKiAxMDI0O1xuY29uc3QgUE5HX1NJR05BVFVSRSA9IEJ1ZmZlci5mcm9tKFsxMzcsIDgwLCA3OCwgNzEsIDEzLCAxMCwgMjYsIDEwXSk7XG5jb25zdCBURVhUX1BBUlRfVFlQRVMgPSBuZXcgU2V0KFtcImlucHV0X3RleHRcIiwgXCJvdXRwdXRfdGV4dFwiLCBcInRleHRcIl0pO1xuXG4vKiogUmVxdWVzdCBib2R5IGZvciB0aGUgc3RhbmRhbG9uZSBDb2RleCBpbWFnZXMgZW5kcG9pbnQ7IGNvbnRyb2xzIGFyZSBmb3J3YXJkZWQgb25seSB3aGVuIHNldC4gKi9cbnR5cGUgU3RhbmRhbG9uZUltYWdlQm9keSA9IHtcbiAgbW9kZWw6IFwiZ3B0LWltYWdlLTJcIjtcbiAgcHJvbXB0OiBzdHJpbmc7XG4gIGJhY2tncm91bmQ/OiBKc29uVmFsdWU7XG4gIHF1YWxpdHk/OiBKc29uVmFsdWU7XG4gIHNpemU/OiBKc29uVmFsdWU7XG4gIGltYWdlcz86IEFycmF5PHsgaW1hZ2VfdXJsOiBzdHJpbmcgfT47XG59O1xuXG5mdW5jdGlvbiBpbWFnZVVybE9mKHZhbHVlOiBKc29uVmFsdWUgfCB1bmRlZmluZWQpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICByZXR1cm4ganNvblN0cmluZyh2YWx1ZSkgPz8gKGlzSnNvbk9iamVjdCh2YWx1ZSkgPyBqc29uU3RyaW5nKHZhbHVlLnVybCkgOiB1bmRlZmluZWQpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRTdGFuZGFsb25lSW1hZ2VSZXF1ZXN0KG9wdGlvbnM6IE9wZW5BSVJlc3BvbnNlc09wdGlvbnMpIHtcbiAgaWYgKG9wdGlvbnMub3V0cHV0U2NoZW1hIHx8IG9wdGlvbnMudG9vbHM/Lmxlbmd0aCkge1xuICAgIHRocm93IG5ldyBPcGVuQUlQcm90b2NvbEVycm9yKFxuICAgICAgXCJTdGFuZGFsb25lIGltYWdlIGdlbmVyYXRpb24gZG9lcyBub3Qgc3VwcG9ydCB0b29scyBvciBzdHJ1Y3R1cmVkIG91dHB1dFwiLFxuICAgICk7XG4gIH1cblxuICBpZiAoIW9wdGlvbnMuaW1hZ2VHZW5lcmF0aW9uKSB7XG4gICAgdGhyb3cgbmV3IE9wZW5BSVByb3RvY29sRXJyb3IoXCJTdGFuZGFsb25lIGltYWdlcyByZXF1aXJlIGltYWdlIGdlbmVyYXRpb24gdG8gYmUgZW5hYmxlZFwiKTtcbiAgfVxuXG4gIGNvbnN0IGNvbnRyb2xzID0gb3B0aW9ucy5pbWFnZUdlbmVyYXRpb24gPT09IHRydWUgPyB7fSA6IG9wdGlvbnMuaW1hZ2VHZW5lcmF0aW9uO1xuXG4gIGlmIChvcHRpb25zLm1vZGVsICE9PSBcImdwdC1pbWFnZS0yXCIgJiYgY29udHJvbHMuYmFja2dyb3VuZCAhPT0gXCJ0cmFuc3BhcmVudFwiKSB7XG4gICAgdGhyb3cgbmV3IE9wZW5BSVByb3RvY29sRXJyb3IoXG4gICAgICBcIlN0YW5kYWxvbmUgaW1hZ2VzIHJlcXVpcmUgYW4gZXhwbGljaXQgdHJhbnNwYXJlbnQgYmFja2dyb3VuZCByZXF1ZXN0XCIsXG4gICAgKTtcbiAgfVxuXG4gIGlmIChjb250cm9scy5vdXRwdXRfZm9ybWF0ICYmIGNvbnRyb2xzLm91dHB1dF9mb3JtYXQgIT09IFwicG5nXCIpIHtcbiAgICB0aHJvdyBuZXcgT3BlbkFJUHJvdG9jb2xFcnJvcihcIlN0YW5kYWxvbmUgaW1hZ2UgZ2VuZXJhdGlvbiBvbmx5IHN1cHBvcnRzIFBORyBvdXRwdXRcIik7XG4gIH1cblxuICBjb25zdCB0ZXh0OiBzdHJpbmdbXSA9IFtdO1xuICBjb25zdCBpbWFnZXM6IEFycmF5PHsgaW1hZ2VfdXJsOiBzdHJpbmcgfT4gPSBbXTtcblxuICBpZiAob3B0aW9ucy5pbnN0cnVjdGlvbnMpIHRleHQucHVzaChgU3lzdGVtIGluc3RydWN0aW9uczpcXG4ke29wdGlvbnMuaW5zdHJ1Y3Rpb25zfWApO1xuXG4gIGZvciAoY29uc3QgaXRlbSBvZiBvcHRpb25zLmhpc3RvcnkpIHtcbiAgICBpZiAoIWlzSnNvbk9iamVjdChpdGVtKSkge1xuICAgICAgdGhyb3cgbmV3IE9wZW5BSVByb3RvY29sRXJyb3IoXG4gICAgICAgIFwiVW5zdXBwb3J0ZWQgY29udmVyc2F0aW9uIGl0ZW0gZm9yIHN0YW5kYWxvbmUgaW1hZ2UgZ2VuZXJhdGlvblwiLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoaXRlbS50eXBlID09PSBcInJlYXNvbmluZ1wiKSBjb250aW51ZTtcblxuICAgIGNvbnN0IHJlc3VsdCA9IGpzb25TdHJpbmcoaXRlbS5yZXN1bHQpO1xuXG4gICAgaWYgKGl0ZW0udHlwZSA9PT0gXCJpbWFnZV9nZW5lcmF0aW9uX2NhbGxcIiAmJiByZXN1bHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaW1hZ2VzLnB1c2goe1xuICAgICAgICBpbWFnZV91cmw6IGBkYXRhOiR7aW1hZ2VNaW1lVHlwZShyZXN1bHQsIGl0ZW0ub3V0cHV0X2Zvcm1hdCl9O2Jhc2U2NCwke3Jlc3VsdH1gLFxuICAgICAgfSk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBjb25zdCByb2xlID0ganNvblN0cmluZyhpdGVtLnJvbGUpO1xuXG4gICAgaWYgKGl0ZW0udHlwZSAhPT0gXCJtZXNzYWdlXCIgJiYgcm9sZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgT3BlbkFJUHJvdG9jb2xFcnJvcihcbiAgICAgICAgXCJVbnN1cHBvcnRlZCBjb252ZXJzYXRpb24gaXRlbSBmb3Igc3RhbmRhbG9uZSBpbWFnZSBnZW5lcmF0aW9uXCIsXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IHNwZWFrZXIgPSByb2xlID8/IFwidXNlclwiO1xuICAgIGNvbnN0IGNvbnRlbnQgPSBqc29uU3RyaW5nKGl0ZW0uY29udGVudCk7XG5cbiAgICBpZiAoY29udGVudCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0ZXh0LnB1c2goYCR7c3BlYWtlcn06XFxuJHtjb250ZW50fWApO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGl0ZW0uY29udGVudCkpIHtcbiAgICAgIHRocm93IG5ldyBPcGVuQUlQcm90b2NvbEVycm9yKFwiVW5zdXBwb3J0ZWQgbWVzc2FnZSBjb250ZW50IGZvciBzdGFuZGFsb25lIGltYWdlIGdlbmVyYXRpb25cIik7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBwYXJ0IG9mIGl0ZW0uY29udGVudCkge1xuICAgICAgaWYgKCFpc0pzb25PYmplY3QocGFydCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IE9wZW5BSVByb3RvY29sRXJyb3IoXCJVbnN1cHBvcnRlZCBtZXNzYWdlIHBhcnQgZm9yIHN0YW5kYWxvbmUgaW1hZ2UgZ2VuZXJhdGlvblwiKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcGFydFR5cGUgPSBqc29uU3RyaW5nKHBhcnQudHlwZSk7XG4gICAgICBjb25zdCBwYXJ0VGV4dCA9IGpzb25TdHJpbmcocGFydC50ZXh0KTtcblxuICAgICAgaWYgKHBhcnRUeXBlICE9PSB1bmRlZmluZWQgJiYgVEVYVF9QQVJUX1RZUEVTLmhhcyhwYXJ0VHlwZSkgJiYgcGFydFRleHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0ZXh0LnB1c2goYCR7c3BlYWtlcn06XFxuJHtwYXJ0VGV4dH1gKTtcbiAgICAgIH0gZWxzZSBpZiAocGFydC50eXBlID09PSBcImlucHV0X2ltYWdlXCIgfHwgcGFydC50eXBlID09PSBcImltYWdlX3VybFwiKSB7XG4gICAgICAgIGNvbnN0IHVybCA9IGltYWdlVXJsT2YocGFydC5pbWFnZV91cmwpO1xuXG4gICAgICAgIGlmICh1cmwgPT09IHVuZGVmaW5lZCB8fCAhL14oaHR0cHM6XFwvXFwvfGRhdGE6aW1hZ2VcXC8pL2kudGVzdCh1cmwpKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IE9wZW5BSVByb3RvY29sRXJyb3IoXCJJbWFnZSByZWZlcmVuY2VzIG11c3QgYmUgSFRUUFMgVVJMcyBvciBpbWFnZSBkYXRhIFVSTHNcIik7XG4gICAgICAgIH1cblxuICAgICAgICBpbWFnZXMucHVzaCh7IGltYWdlX3VybDogdXJsIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IE9wZW5BSVByb3RvY29sRXJyb3IoXCJVbnN1cHBvcnRlZCBtZXNzYWdlIHBhcnQgZm9yIHN0YW5kYWxvbmUgaW1hZ2UgZ2VuZXJhdGlvblwiKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAoaW1hZ2VzLmxlbmd0aCA+IDUpXG4gICAgdGhyb3cgbmV3IE9wZW5BSVByb3RvY29sRXJyb3IoXCJTdGFuZGFsb25lIGltYWdlIGVkaXRpbmcgc3VwcG9ydHMgYXQgbW9zdCA1IHJlZmVyZW5jZSBpbWFnZXNcIik7XG5cbiAgaWYgKCF0ZXh0LnNvbWUoKHBhcnQpID0+IHBhcnQudHJpbSgpKSkgdGhyb3cgbmV3IE9wZW5BSVByb3RvY29sRXJyb3IoXCJJbWFnZSBwcm9tcHQgaXMgZW1wdHlcIik7XG5cbiAgY29uc3QgYm9keTogU3RhbmRhbG9uZUltYWdlQm9keSA9IHsgbW9kZWw6IFwiZ3B0LWltYWdlLTJcIiwgcHJvbXB0OiB0ZXh0LmpvaW4oXCJcXG5cXG5cIikgfTtcblxuICBpZiAoY29udHJvbHMuYmFja2dyb3VuZCkgYm9keS5iYWNrZ3JvdW5kID0gY29udHJvbHMuYmFja2dyb3VuZDtcblxuICBpZiAoY29udHJvbHMucXVhbGl0eSkgYm9keS5xdWFsaXR5ID0gY29udHJvbHMucXVhbGl0eTtcblxuICBpZiAoY29udHJvbHMuc2l6ZSkgYm9keS5zaXplID0gY29udHJvbHMuc2l6ZTtcblxuICBpZiAoaW1hZ2VzLmxlbmd0aCkgYm9keS5pbWFnZXMgPSBpbWFnZXM7XG5cbiAgcmV0dXJuIHtcbiAgICB1cmw6IENIQVRHUFRfQ09ERVhfUkVTUE9OU0VTX1VSTC5yZXBsYWNlKFxuICAgICAgL1xcL3Jlc3BvbnNlcyQvLFxuICAgICAgYC9pbWFnZXMvJHtpbWFnZXMubGVuZ3RoID8gXCJlZGl0c1wiIDogXCJnZW5lcmF0aW9uc1wifWAsXG4gICAgKSxcbiAgICBib2R5LFxuICB9O1xufVxuXG5pbnRlcmZhY2UgUG5nRGltZW5zaW9ucyB7XG4gIHdpZHRoOiBudW1iZXI7XG4gIGhlaWdodDogbnVtYmVyO1xufVxuXG5mdW5jdGlvbiBpbnNwZWN0R2VuZXJhdGVkUG5nKGJhc2U2NDogc3RyaW5nLCByZXF1aXJlVHJhbnNwYXJlbmN5OiBib29sZWFuKTogUG5nRGltZW5zaW9ucyB7XG4gIGlmIChiYXNlNjQubGVuZ3RoID4gTWF0aC5jZWlsKE1BWF9QTkdfQllURVMgLyAzKSAqIDQgfHwgIS9eW0EtWmEtejAtOSsvXSs9ezAsMn0kLy50ZXN0KGJhc2U2NCkpIHtcbiAgICB0aHJvdyBuZXcgT3BlbkFJUHJvdG9jb2xFcnJvcihcIkludmFsaWQgb3Igb3ZlcnNpemVkIGdlbmVyYXRlZCBQTkdcIik7XG4gIH1cblxuICBjb25zdCBieXRlcyA9IEJ1ZmZlci5mcm9tKGJhc2U2NCwgXCJiYXNlNjRcIik7XG5cbiAgaWYgKFxuICAgIGJ5dGVzLmxlbmd0aCA8IDMzIHx8XG4gICAgIWJ5dGVzLnN1YmFycmF5KDAsIDgpLmVxdWFscyhQTkdfU0lHTkFUVVJFKSB8fFxuICAgIGJ5dGVzLnRvU3RyaW5nKFwiYXNjaWlcIiwgMTIsIDE2KSAhPT0gXCJJSERSXCJcbiAgKSB7XG4gICAgdGhyb3cgbmV3IE9wZW5BSVByb3RvY29sRXJyb3IoXCJJbWFnZSBnZW5lcmF0aW9uIGRpZCBub3QgcmV0dXJuIGEgUE5HXCIpO1xuICB9XG5cbiAgY29uc3Qgd2lkdGggPSBieXRlcy5yZWFkVUludDMyQkUoMTYpO1xuICBjb25zdCBoZWlnaHQgPSBieXRlcy5yZWFkVUludDMyQkUoMjApO1xuXG4gIGlmICghd2lkdGggfHwgIWhlaWdodCB8fCB3aWR0aCAqIGhlaWdodCA+IE1BWF9JTUFHRV9QSVhFTFMpIHtcbiAgICB0aHJvdyBuZXcgT3BlbkFJUHJvdG9jb2xFcnJvcihcIkdlbmVyYXRlZCBQTkcgZGltZW5zaW9ucyBleGNlZWQgdGhlIGRlY29kaW5nIGxpbWl0XCIpO1xuICB9XG5cbiAgbGV0IGltYWdlOiBQTkc7XG5cbiAgdHJ5IHtcbiAgICBpbWFnZSA9IFBORy5zeW5jLnJlYWQoYnl0ZXMpO1xuICB9IGNhdGNoIHtcbiAgICB0aHJvdyBuZXcgT3BlbkFJUHJvdG9jb2xFcnJvcihcIkltYWdlIGdlbmVyYXRpb24gcmV0dXJuZWQgYW4gaW52YWxpZCBQTkdcIik7XG4gIH1cblxuICBpZiAoIXJlcXVpcmVUcmFuc3BhcmVuY3kpIHJldHVybiB7IHdpZHRoOiBpbWFnZS53aWR0aCwgaGVpZ2h0OiBpbWFnZS5oZWlnaHQgfTtcbiAgLy8gQW4gYWxwaGEgY2hhbm5lbCBhbG9uZSBjYW4gc3RpbGwgYmUgZnVsbHkgb3BhcXVlIG9yIGhhdmUgbm8gdmlzaWJsZSBjb250ZW50LlxuICBsZXQgdHJhbnNwYXJlbnQgPSBmYWxzZTtcbiAgbGV0IHZpc2libGUgPSBmYWxzZTtcblxuICBmb3IgKGxldCBpID0gMzsgaSA8IGltYWdlLmRhdGEubGVuZ3RoOyBpICs9IDQpIHtcbiAgICB0cmFuc3BhcmVudCB8fD0gaW1hZ2UuZGF0YVtpXSA9PT0gMDtcbiAgICB2aXNpYmxlIHx8PSBpbWFnZS5kYXRhW2ldISA+IDA7XG5cbiAgICBpZiAodHJhbnNwYXJlbnQgJiYgdmlzaWJsZSkgcmV0dXJuIHsgd2lkdGg6IGltYWdlLndpZHRoLCBoZWlnaHQ6IGltYWdlLmhlaWdodCB9O1xuICB9XG5cbiAgdGhyb3cgbmV3IE9wZW5BSVByb3RvY29sRXJyb3IoXG4gICAgXCJJbWFnZSBnZW5lcmF0aW9uIGRpZCBub3QgcmV0dXJuIHZpc2libGUgY29udGVudCBvbiBhIHRyYW5zcGFyZW50IGJhY2tncm91bmRcIixcbiAgKTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlYWRTdGFuZGFsb25lSW1hZ2VSZXNwb25zZShcbiAgcmVzcG9uc2U6IFJlc3BvbnNlLFxuICByZXF1aXJlVHJhbnNwYXJlbmN5OiBib29sZWFuLFxuKTogUHJvbWlzZTxPcGVuQUlOb3JtYWxpemVkRXZlbnRbXT4ge1xuICBpZiAoIXJlc3BvbnNlLmJvZHkpIHRocm93IG5ldyBPcGVuQUlQcm90b2NvbEVycm9yKFwiSW1hZ2UgcmVzcG9uc2UgaGFkIG5vIGJvZHlcIik7XG4gIGNvbnN0IHJlYWRlciA9IHJlc3BvbnNlLmJvZHkuZ2V0UmVhZGVyKCk7XG4gIGNvbnN0IGNodW5rczogVWludDhBcnJheVtdID0gW107XG4gIGxldCBzaXplID0gMDtcblxuICB0cnkge1xuICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICBjb25zdCB7IGRvbmUsIHZhbHVlIH0gPSBhd2FpdCByZWFkZXIucmVhZCgpO1xuXG4gICAgICBpZiAoZG9uZSkgYnJlYWs7XG4gICAgICBzaXplICs9IHZhbHVlLmJ5dGVMZW5ndGg7XG5cbiAgICAgIGlmIChzaXplID4gTUFYX1JFU1BPTlNFX0JZVEVTKSB7XG4gICAgICAgIGF3YWl0IHJlYWRlci5jYW5jZWwoKTtcbiAgICAgICAgdGhyb3cgbmV3IE9wZW5BSVByb3RvY29sRXJyb3IoXCJJbWFnZSByZXNwb25zZSBleGNlZWRlZCB0aGUgc2l6ZSBsaW1pdFwiKTtcbiAgICAgIH1cblxuICAgICAgY2h1bmtzLnB1c2godmFsdWUpO1xuICAgIH1cbiAgfSBmaW5hbGx5IHtcbiAgICByZWFkZXIucmVsZWFzZUxvY2soKTtcbiAgfVxuXG4gIGNvbnN0IHNjaGVtYSA9IHoub2JqZWN0KHtcbiAgICBkYXRhOiB6XG4gICAgICAuYXJyYXkoei5vYmplY3QoeyBiNjRfanNvbjogei5zdHJpbmcoKS5taW4oMSksIHJldmlzZWRfcHJvbXB0OiB6LnN0cmluZygpLm51bGxpc2goKSB9KSlcbiAgICAgIC5taW4oMSlcbiAgICAgIC5tYXgoMTYpLFxuICAgIHF1YWxpdHk6IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgICBtb2RlbDogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICAgIGJhY2tncm91bmQ6IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgICB1c2FnZTogSW1hZ2VHZW5lcmF0aW9uTWV0YWRhdGEuc2hhcGUudXNhZ2UsXG4gIH0pO1xuXG4gIGxldCBwYXJzZWQ6IHouaW5mZXI8dHlwZW9mIHNjaGVtYT47XG5cbiAgdHJ5IHtcbiAgICBwYXJzZWQgPSBzY2hlbWEucGFyc2UoSlNPTi5wYXJzZShCdWZmZXIuY29uY2F0KGNodW5rcykudG9TdHJpbmcoXCJ1dGY4XCIpKSk7XG4gIH0gY2F0Y2gge1xuICAgIHRocm93IG5ldyBPcGVuQUlQcm90b2NvbEVycm9yKFwiSW52YWxpZCBzdGFuZGFsb25lIGltYWdlIHJlc3BvbnNlXCIpO1xuICB9XG5cbiAgY29uc3QgYmFja2dyb3VuZCA9IHBhcnNlZC5iYWNrZ3JvdW5kID8/IChyZXF1aXJlVHJhbnNwYXJlbmN5ID8gXCJ0cmFuc3BhcmVudFwiIDogdW5kZWZpbmVkKTtcblxuICByZXR1cm4gcGFyc2VkLmRhdGEubWFwKChpdGVtLCBpbmRleCkgPT4ge1xuICAgIGNvbnN0IGRpbWVuc2lvbnMgPSBpbnNwZWN0R2VuZXJhdGVkUG5nKGl0ZW0uYjY0X2pzb24sIHJlcXVpcmVUcmFuc3BhcmVuY3kpO1xuXG4gICAgY29uc3QgZ2VuZXJhdGlvbjogSW1hZ2VHZW5lcmF0aW9uTWV0YWRhdGEgPSB7XG4gICAgICByb3V0ZTogXCJjb2RleC1pbWFnZXNcIixcbiAgICAgIG1vZGVsOiBwYXJzZWQubW9kZWwgPz8gXCJncHQtaW1hZ2UtMlwiLFxuICAgICAgc2l6ZTogYCR7ZGltZW5zaW9ucy53aWR0aH14JHtkaW1lbnNpb25zLmhlaWdodH1gLFxuICAgIH07XG5cbiAgICBpZiAoYmFja2dyb3VuZCkgZ2VuZXJhdGlvbi5iYWNrZ3JvdW5kID0gYmFja2dyb3VuZDtcblxuICAgIGlmIChwYXJzZWQucXVhbGl0eSkgZ2VuZXJhdGlvbi5xdWFsaXR5ID0gcGFyc2VkLnF1YWxpdHk7XG5cbiAgICBpZiAoaW5kZXggPT09IDAgJiYgcGFyc2VkLnVzYWdlKSBnZW5lcmF0aW9uLnVzYWdlID0gcGFyc2VkLnVzYWdlO1xuXG4gICAgY29uc3QgZXZlbnQ6IE9wZW5BSU5vcm1hbGl6ZWRFdmVudCA9IHtcbiAgICAgIHR5cGU6IFwiaW1hZ2VcIixcbiAgICAgIGJhc2U2NDogaXRlbS5iNjRfanNvbixcbiAgICAgIG1pbWVUeXBlOiBcImltYWdlL3BuZ1wiLFxuICAgICAgZ2VuZXJhdGlvbixcbiAgICB9O1xuXG4gICAgaWYgKGl0ZW0ucmV2aXNlZF9wcm9tcHQpIGV2ZW50LnJldmlzZWRQcm9tcHQgPSBpdGVtLnJldmlzZWRfcHJvbXB0O1xuXG4gICAgcmV0dXJuIGV2ZW50O1xuICB9KTtcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBYUEsTUFBTSxnQkFBZ0IsS0FBSyxPQUFPO0FBQ2xDLE1BQU0sbUJBQW1CLE9BQU87QUFDaEMsTUFBTSxxQkFBcUIsS0FBSyxPQUFPO0FBQ3ZDLE1BQU0sZ0JBQWdCLE9BQU8sS0FBSztDQUFDO0NBQUs7Q0FBSTtDQUFJO0NBQUk7Q0FBSTtDQUFJO0NBQUk7QUFBRSxDQUFDO0FBQ25FLE1BQU0sa0NBQWtCLElBQUksSUFBSTtDQUFDO0NBQWM7Q0FBZTtBQUFNLENBQUM7QUFZckUsU0FBUyxXQUFXLE9BQWtEO0NBQ3BFLE9BQU8sV0FBVyxLQUFLLE1BQU0sYUFBYSxLQUFLLElBQUksV0FBVyxNQUFNLEdBQUcsSUFBSTtBQUM3RTtBQUVBLFNBQWdCLDRCQUE0QixTQUFpQztDQUMzRSxJQUFJLFFBQVEsZ0JBQWdCLFFBQVEsT0FBTyxRQUN6QyxNQUFNLElBQUksb0JBQ1IseUVBQ0Y7Q0FHRixJQUFJLENBQUMsUUFBUSxpQkFDWCxNQUFNLElBQUksb0JBQW9CLDBEQUEwRDtDQUcxRixNQUFNLFdBQVcsUUFBUSxvQkFBb0IsT0FBTyxDQUFDLElBQUksUUFBUTtDQUVqRSxJQUFJLFFBQVEsVUFBVSxpQkFBaUIsU0FBUyxlQUFlLGVBQzdELE1BQU0sSUFBSSxvQkFDUixzRUFDRjtDQUdGLElBQUksU0FBUyxpQkFBaUIsU0FBUyxrQkFBa0IsT0FDdkQsTUFBTSxJQUFJLG9CQUFvQixzREFBc0Q7Q0FHdEYsTUFBTSxPQUFpQixDQUFDO0NBQ3hCLE1BQU0sU0FBdUMsQ0FBQztDQUU5QyxJQUFJLFFBQVEsY0FBYyxLQUFLLEtBQUsseUJBQXlCLFFBQVEsY0FBYztDQUVuRixLQUFLLE1BQU0sUUFBUSxRQUFRLFNBQVM7RUFDbEMsSUFBSSxDQUFDLGFBQWEsSUFBSSxHQUNwQixNQUFNLElBQUksb0JBQ1IsK0RBQ0Y7RUFHRixJQUFJLEtBQUssU0FBUyxhQUFhO0VBRS9CLE1BQU0sU0FBUyxXQUFXLEtBQUssTUFBTTtFQUVyQyxJQUFJLEtBQUssU0FBUywyQkFBMkIsV0FBVyxRQUFXO0dBQ2pFLE9BQU8sS0FBSyxFQUNWLFdBQVcsUUFBUSxjQUFjLFFBQVEsS0FBSyxhQUFhLEVBQUUsVUFBVSxTQUN6RSxDQUFDO0dBQ0Q7RUFDRjtFQUVBLE1BQU0sT0FBTyxXQUFXLEtBQUssSUFBSTtFQUVqQyxJQUFJLEtBQUssU0FBUyxhQUFhLFNBQVMsUUFDdEMsTUFBTSxJQUFJLG9CQUNSLCtEQUNGO0VBR0YsTUFBTSxVQUFVLFFBQVE7RUFDeEIsTUFBTSxVQUFVLFdBQVcsS0FBSyxPQUFPO0VBRXZDLElBQUksWUFBWSxRQUFXO0dBQ3pCLEtBQUssS0FBSyxHQUFHLFFBQVEsS0FBSyxTQUFTO0dBQ25DO0VBQ0Y7RUFFQSxJQUFJLENBQUMsTUFBTSxRQUFRLEtBQUssT0FBTyxHQUM3QixNQUFNLElBQUksb0JBQW9CLDZEQUE2RDtFQUc3RixLQUFLLE1BQU0sUUFBUSxLQUFLLFNBQVM7R0FDL0IsSUFBSSxDQUFDLGFBQWEsSUFBSSxHQUNwQixNQUFNLElBQUksb0JBQW9CLDBEQUEwRDtHQUcxRixNQUFNLFdBQVcsV0FBVyxLQUFLLElBQUk7R0FDckMsTUFBTSxXQUFXLFdBQVcsS0FBSyxJQUFJO0dBRXJDLElBQUksYUFBYSxVQUFhLGdCQUFnQixJQUFJLFFBQVEsS0FBSyxhQUFhLFFBQzFFLEtBQUssS0FBSyxHQUFHLFFBQVEsS0FBSyxVQUFVO1FBQy9CLElBQUksS0FBSyxTQUFTLGlCQUFpQixLQUFLLFNBQVMsYUFBYTtJQUNuRSxNQUFNLE1BQU0sV0FBVyxLQUFLLFNBQVM7SUFFckMsSUFBSSxRQUFRLFVBQWEsQ0FBQyw4QkFBOEIsS0FBSyxHQUFHLEdBQzlELE1BQU0sSUFBSSxvQkFBb0Isd0RBQXdEO0lBR3hGLE9BQU8sS0FBSyxFQUFFLFdBQVcsSUFBSSxDQUFDO0dBQ2hDLE9BQ0UsTUFBTSxJQUFJLG9CQUFvQiwwREFBMEQ7RUFFNUY7Q0FDRjtDQUVBLElBQUksT0FBTyxTQUFTLEdBQ2xCLE1BQU0sSUFBSSxvQkFBb0IsOERBQThEO0NBRTlGLElBQUksQ0FBQyxLQUFLLE1BQU0sU0FBUyxLQUFLLEtBQUssQ0FBQyxHQUFHLE1BQU0sSUFBSSxvQkFBb0IsdUJBQXVCO0NBRTVGLE1BQU0sT0FBNEI7RUFBRSxPQUFPO0VBQWUsUUFBUSxLQUFLLEtBQUssTUFBTTtDQUFFO0NBRXBGLElBQUksU0FBUyxZQUFZLEtBQUssYUFBYSxTQUFTO0NBRXBELElBQUksU0FBUyxTQUFTLEtBQUssVUFBVSxTQUFTO0NBRTlDLElBQUksU0FBUyxNQUFNLEtBQUssT0FBTyxTQUFTO0NBRXhDLElBQUksT0FBTyxRQUFRLEtBQUssU0FBUztDQUVqQyxPQUFPO0VBQ0wsS0FBSyw0QkFBNEIsUUFDL0IsZ0JBQ0EsV0FBVyxPQUFPLFNBQVMsVUFBVSxlQUN2QztFQUNBO0NBQ0Y7QUFDRjtBQU9BLFNBQVMsb0JBQW9CLFFBQWdCLHFCQUE2QztDQUN4RixJQUFJLE9BQU8sU0FBUyxLQUFLLEtBQUssZ0JBQWdCLENBQUMsSUFBSSxLQUFLLENBQUMseUJBQXlCLEtBQUssTUFBTSxHQUMzRixNQUFNLElBQUksb0JBQW9CLG9DQUFvQztDQUdwRSxNQUFNLFFBQVEsT0FBTyxLQUFLLFFBQVEsUUFBUTtDQUUxQyxJQUNFLE1BQU0sU0FBUyxNQUNmLENBQUMsTUFBTSxTQUFTLEdBQUcsQ0FBQyxDQUFDLENBQUMsT0FBTyxhQUFhLEtBQzFDLE1BQU0sU0FBUyxTQUFTLElBQUksRUFBRSxNQUFNLFFBRXBDLE1BQU0sSUFBSSxvQkFBb0IsdUNBQXVDO0NBR3ZFLE1BQU0sUUFBUSxNQUFNLGFBQWEsRUFBRTtDQUNuQyxNQUFNLFNBQVMsTUFBTSxhQUFhLEVBQUU7Q0FFcEMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxVQUFVLFFBQVEsU0FBUyxrQkFDeEMsTUFBTSxJQUFJLG9CQUFvQixvREFBb0Q7Q0FHcEYsSUFBSTtDQUVKLElBQUk7RUFDRixRQUFRLElBQUksS0FBSyxLQUFLLEtBQUs7Q0FDN0IsUUFBUTtFQUNOLE1BQU0sSUFBSSxvQkFBb0IsMENBQTBDO0NBQzFFO0NBRUEsSUFBSSxDQUFDLHFCQUFxQixPQUFPO0VBQUUsT0FBTyxNQUFNO0VBQU8sUUFBUSxNQUFNO0NBQU87Q0FFNUUsSUFBSSxjQUFjO0NBQ2xCLElBQUksVUFBVTtDQUVkLEtBQUssSUFBSSxJQUFJLEdBQUcsSUFBSSxNQUFNLEtBQUssUUFBUSxLQUFLLEdBQUc7RUFDN0MsZ0JBQWdCLE1BQU0sS0FBSyxPQUFPO0VBQ2xDLFlBQVksTUFBTSxLQUFLLEtBQU07RUFFN0IsSUFBSSxlQUFlLFNBQVMsT0FBTztHQUFFLE9BQU8sTUFBTTtHQUFPLFFBQVEsTUFBTTtFQUFPO0NBQ2hGO0NBRUEsTUFBTSxJQUFJLG9CQUNSLDZFQUNGO0FBQ0Y7QUFFQSxlQUFzQiw0QkFDcEIsVUFDQSxxQkFDa0M7Q0FDbEMsSUFBSSxDQUFDLFNBQVMsTUFBTSxNQUFNLElBQUksb0JBQW9CLDRCQUE0QjtDQUM5RSxNQUFNLFNBQVMsU0FBUyxLQUFLLFVBQVU7Q0FDdkMsTUFBTSxTQUF1QixDQUFDO0NBQzlCLElBQUksT0FBTztDQUVYLElBQUk7RUFDRixPQUFPLE1BQU07R0FDWCxNQUFNLEVBQUUsTUFBTSxVQUFVLE1BQU0sT0FBTyxLQUFLO0dBRTFDLElBQUksTUFBTTtHQUNWLFFBQVEsTUFBTTtHQUVkLElBQUksT0FBTyxvQkFBb0I7SUFDN0IsTUFBTSxPQUFPLE9BQU87SUFDcEIsTUFBTSxJQUFJLG9CQUFvQix3Q0FBd0M7R0FDeEU7R0FFQSxPQUFPLEtBQUssS0FBSztFQUNuQjtDQUNGLFVBQVU7RUFDUixPQUFPLFlBQVk7Q0FDckI7Q0FFQSxNQUFNLFNBQVMsRUFBRSxPQUFPO0VBQ3RCLE1BQU0sRUFDSCxNQUFNLEVBQUUsT0FBTztHQUFFLFVBQVUsRUFBRSxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUM7R0FBRyxnQkFBZ0IsRUFBRSxPQUFPLENBQUMsQ0FBQyxRQUFRO0VBQUUsQ0FBQyxDQUFDLENBQUMsQ0FDdEYsSUFBSSxDQUFDLENBQUMsQ0FDTixJQUFJLEVBQUU7RUFDVCxTQUFTLEVBQUUsT0FBTyxDQUFDLENBQUMsU0FBUztFQUM3QixPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUMsU0FBUztFQUMzQixZQUFZLEVBQUUsT0FBTyxDQUFDLENBQUMsU0FBUztFQUNoQyxPQUFPLHdCQUF3QixNQUFNO0NBQ3ZDLENBQUM7Q0FFRCxJQUFJO0NBRUosSUFBSTtFQUNGLFNBQVMsT0FBTyxNQUFNLEtBQUssTUFBTSxPQUFPLE9BQU8sTUFBTSxDQUFDLENBQUMsU0FBUyxNQUFNLENBQUMsQ0FBQztDQUMxRSxRQUFRO0VBQ04sTUFBTSxJQUFJLG9CQUFvQixtQ0FBbUM7Q0FDbkU7Q0FFQSxNQUFNLGFBQWEsT0FBTyxlQUFlLHNCQUFzQixnQkFBZ0I7Q0FFL0UsT0FBTyxPQUFPLEtBQUssS0FBSyxNQUFNLFVBQVU7RUFDdEMsTUFBTSxhQUFhLG9CQUFvQixLQUFLLFVBQVUsbUJBQW1CO0VBRXpFLE1BQU0sYUFBc0M7R0FDMUMsT0FBTztHQUNQLE9BQU8sT0FBTyxTQUFTO0dBQ3ZCLE1BQU0sR0FBRyxXQUFXLE1BQU0sR0FBRyxXQUFXO0VBQzFDO0VBRUEsSUFBSSxZQUFZLFdBQVcsYUFBYTtFQUV4QyxJQUFJLE9BQU8sU0FBUyxXQUFXLFVBQVUsT0FBTztFQUVoRCxJQUFJLFVBQVUsS0FBSyxPQUFPLE9BQU8sV0FBVyxRQUFRLE9BQU87RUFFM0QsTUFBTSxRQUErQjtHQUNuQyxNQUFNO0dBQ04sUUFBUSxLQUFLO0dBQ2IsVUFBVTtHQUNWO0VBQ0Y7RUFFQSxJQUFJLEtBQUssZ0JBQWdCLE1BQU0sZ0JBQWdCLEtBQUs7RUFFcEQsT0FBTztDQUNULENBQUM7QUFDSCJ9
@@ -1,7 +1,21 @@
1
1
  import { OPENAI_AUTHORIZE_URL, OPENAI_CLIENT_ID, OPENAI_ORIGINATOR, OPENAI_SCOPES, OPENAI_TOKEN_URL } from "./openai-constants.js";
2
+ import { z } from "zod";
2
3
  import crypto from "node:crypto";
3
4
  //#region src/utils/providers/openai/openai-oauth.ts
4
5
  const OPENAI_AUTH_CLAIM = "https://api.openai.com/auth";
6
+ const openAITokenClaimsSchema = z.looseObject({
7
+ exp: z.number().optional().catch(void 0),
8
+ [OPENAI_AUTH_CLAIM]: z.looseObject({
9
+ chatgpt_account_id: z.string().optional().catch(void 0),
10
+ chatgpt_plan_type: z.string().optional().catch(void 0)
11
+ }).optional().catch(void 0)
12
+ });
13
+ const openAITokenExchangeResponseSchema = z.looseObject({
14
+ id_token: z.string().optional(),
15
+ access_token: z.string().optional(),
16
+ refresh_token: z.string().optional(),
17
+ expires_in: z.number().optional()
18
+ });
5
19
  function generateOpenAIPKCE() {
6
20
  const codeVerifier = crypto.randomBytes(64).toString("base64url");
7
21
  return {
@@ -36,14 +50,13 @@ function parseOpenAITokenClaims(jwt) {
36
50
  } catch {
37
51
  throw new Error("invalid OpenAI JWT payload");
38
52
  }
39
- if (!payload || typeof payload !== "object") throw new Error("invalid OpenAI JWT payload");
40
- const claims = payload;
41
- const auth = claims[OPENAI_AUTH_CLAIM];
42
- const nested = auth && typeof auth === "object" ? auth : {};
53
+ const claims = openAITokenClaimsSchema.safeParse(payload);
54
+ if (!claims.success) throw new Error("invalid OpenAI JWT payload");
55
+ const auth = claims.data[OPENAI_AUTH_CLAIM];
43
56
  return {
44
- expiresAt: typeof claims.exp === "number" ? claims.exp * 1e3 : void 0,
45
- accountId: typeof nested.chatgpt_account_id === "string" ? nested.chatgpt_account_id : void 0,
46
- planType: typeof nested.chatgpt_plan_type === "string" ? nested.chatgpt_plan_type : void 0
57
+ expiresAt: claims.data.exp === void 0 ? void 0 : claims.data.exp * 1e3,
58
+ accountId: auth?.chatgpt_account_id,
59
+ planType: auth?.chatgpt_plan_type
47
60
  };
48
61
  }
49
62
  async function exchangeOpenAICode(code, codeVerifier, redirectUri) {
@@ -62,23 +75,25 @@ async function exchangeOpenAICode(code, codeVerifier, redirectUri) {
62
75
  await response.body?.cancel().catch(() => void 0);
63
76
  throw new Error(`OPENAI_TOKEN_EXCHANGE_HTTP_${response.status}`);
64
77
  }
65
- const tokens = await response.json();
78
+ const tokens = openAITokenExchangeResponseSchema.parse(await response.json());
66
79
  if (!tokens.id_token || !tokens.access_token || !tokens.refresh_token) throw new Error("OpenAI token exchange returned incomplete credentials");
67
80
  const idClaims = parseOpenAITokenClaims(tokens.id_token);
68
81
  const accessClaims = parseOpenAITokenClaims(tokens.access_token);
69
82
  const accountId = idClaims.accountId ?? accessClaims.accountId;
70
83
  if (!accountId) throw new Error("OpenAI token did not include a ChatGPT account id");
71
- return {
84
+ const credentials = {
72
85
  accessToken: tokens.access_token,
73
86
  refreshToken: tokens.refresh_token,
74
87
  idToken: tokens.id_token,
75
88
  accessTokenExpiresAt: accessClaims.expiresAt ?? (tokens.expires_in ? Date.now() + tokens.expires_in * 1e3 : Date.now()),
76
- ...idClaims.expiresAt ? { idTokenExpiresAt: idClaims.expiresAt } : {},
77
- accountId,
78
- ...idClaims.planType ?? accessClaims.planType ? { planType: idClaims.planType ?? accessClaims.planType } : {}
89
+ accountId
79
90
  };
91
+ if (idClaims.expiresAt) credentials.idTokenExpiresAt = idClaims.expiresAt;
92
+ const planType = idClaims.planType ?? accessClaims.planType;
93
+ if (planType) credentials.planType = planType;
94
+ return credentials;
80
95
  }
81
96
  //#endregion
82
97
  export { buildOpenAIAuthUrl, exchangeOpenAICode, generateOpenAIPKCE, parseOpenAITokenClaims };
83
98
 
84
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3BlbmFpLW9hdXRoLmpzIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy91dGlscy9wcm92aWRlcnMvb3BlbmFpL29wZW5haS1vYXV0aC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgY3J5cHRvIGZyb20gXCJub2RlOmNyeXB0b1wiO1xuXG5pbXBvcnQge1xuICBPUEVOQUlfQVVUSE9SSVpFX1VSTCxcbiAgT1BFTkFJX0NMSUVOVF9JRCxcbiAgT1BFTkFJX09SSUdJTkFUT1IsXG4gIE9QRU5BSV9TQ09QRVMsXG4gIE9QRU5BSV9UT0tFTl9VUkwsXG59IGZyb20gXCIuL29wZW5haS1jb25zdGFudHNcIjtcblxuY29uc3QgT1BFTkFJX0FVVEhfQ0xBSU0gPSBcImh0dHBzOi8vYXBpLm9wZW5haS5jb20vYXV0aFwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIE9wZW5BSVBLQ0Uge1xuICBjb2RlVmVyaWZpZXI6IHN0cmluZztcbiAgY29kZUNoYWxsZW5nZTogc3RyaW5nO1xuICBzdGF0ZTogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE9wZW5BSVRva2VuQ2xhaW1zIHtcbiAgZXhwaXJlc0F0PzogbnVtYmVyO1xuICBhY2NvdW50SWQ/OiBzdHJpbmc7XG4gIHBsYW5UeXBlPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE9wZW5BSUV4Y2hhbmdlZENyZWRlbnRpYWxzIHtcbiAgYWNjZXNzVG9rZW46IHN0cmluZztcbiAgcmVmcmVzaFRva2VuOiBzdHJpbmc7XG4gIGlkVG9rZW46IHN0cmluZztcbiAgYWNjZXNzVG9rZW5FeHBpcmVzQXQ6IG51bWJlcjtcbiAgaWRUb2tlbkV4cGlyZXNBdD86IG51bWJlcjtcbiAgYWNjb3VudElkOiBzdHJpbmc7XG4gIHBsYW5UeXBlPzogc3RyaW5nO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVPcGVuQUlQS0NFKCk6IE9wZW5BSVBLQ0Uge1xuICBjb25zdCBjb2RlVmVyaWZpZXIgPSBjcnlwdG8ucmFuZG9tQnl0ZXMoNjQpLnRvU3RyaW5nKFwiYmFzZTY0dXJsXCIpO1xuICByZXR1cm4ge1xuICAgIGNvZGVWZXJpZmllcixcbiAgICBjb2RlQ2hhbGxlbmdlOiBjcnlwdG8uY3JlYXRlSGFzaChcInNoYTI1NlwiKS51cGRhdGUoY29kZVZlcmlmaWVyKS5kaWdlc3QoXCJiYXNlNjR1cmxcIiksXG4gICAgc3RhdGU6IGNyeXB0by5yYW5kb21CeXRlcygzMikudG9TdHJpbmcoXCJiYXNlNjR1cmxcIiksXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZE9wZW5BSUF1dGhVcmwoXG4gIGNvZGVDaGFsbGVuZ2U6IHN0cmluZyxcbiAgc3RhdGU6IHN0cmluZyxcbiAgcmVkaXJlY3RVcmk6IHN0cmluZyxcbik6IHN0cmluZyB7XG4gIGNvbnN0IHVybCA9IG5ldyBVUkwoT1BFTkFJX0FVVEhPUklaRV9VUkwpO1xuICB1cmwuc2VhcmNoID0gbmV3IFVSTFNlYXJjaFBhcmFtcyh7XG4gICAgcmVzcG9uc2VfdHlwZTogXCJjb2RlXCIsXG4gICAgY2xpZW50X2lkOiBPUEVOQUlfQ0xJRU5UX0lELFxuICAgIHJlZGlyZWN0X3VyaTogcmVkaXJlY3RVcmksXG4gICAgc2NvcGU6IE9QRU5BSV9TQ09QRVMsXG4gICAgY29kZV9jaGFsbGVuZ2U6IGNvZGVDaGFsbGVuZ2UsXG4gICAgY29kZV9jaGFsbGVuZ2VfbWV0aG9kOiBcIlMyNTZcIixcbiAgICBpZF90b2tlbl9hZGRfb3JnYW5pemF0aW9uczogXCJ0cnVlXCIsXG4gICAgY29kZXhfY2xpX3NpbXBsaWZpZWRfZmxvdzogXCJ0cnVlXCIsXG4gICAgc3RhdGUsXG4gICAgb3JpZ2luYXRvcjogT1BFTkFJX09SSUdJTkFUT1IsXG4gIH0pLnRvU3RyaW5nKCk7XG4gIHJldHVybiB1cmwudG9TdHJpbmcoKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlT3BlbkFJVG9rZW5DbGFpbXMoand0OiBzdHJpbmcpOiBPcGVuQUlUb2tlbkNsYWltcyB7XG4gIGNvbnN0IHBhcnRzID0gand0LnNwbGl0KFwiLlwiKTtcbiAgY29uc3QgcGF5bG9hZFBhcnQgPSBwYXJ0c1sxXTtcbiAgaWYgKHBhcnRzLmxlbmd0aCAhPT0gMyB8fCBwYXJ0cy5zb21lKChwYXJ0KSA9PiAhcGFydCkgfHwgIXBheWxvYWRQYXJ0KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiaW52YWxpZCBPcGVuQUkgSldUIGZvcm1hdFwiKTtcbiAgfVxuXG4gIGxldCBwYXlsb2FkOiB1bmtub3duO1xuICB0cnkge1xuICAgIHBheWxvYWQgPSBKU09OLnBhcnNlKEJ1ZmZlci5mcm9tKHBheWxvYWRQYXJ0LCBcImJhc2U2NHVybFwiKS50b1N0cmluZyhcInV0ZjhcIikpO1xuICB9IGNhdGNoIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJpbnZhbGlkIE9wZW5BSSBKV1QgcGF5bG9hZFwiKTtcbiAgfVxuICBpZiAoIXBheWxvYWQgfHwgdHlwZW9mIHBheWxvYWQgIT09IFwib2JqZWN0XCIpIHRocm93IG5ldyBFcnJvcihcImludmFsaWQgT3BlbkFJIEpXVCBwYXlsb2FkXCIpO1xuXG4gIGNvbnN0IGNsYWltcyA9IHBheWxvYWQgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIGNvbnN0IGF1dGggPSBjbGFpbXNbT1BFTkFJX0FVVEhfQ0xBSU1dO1xuICBjb25zdCBuZXN0ZWQgPSBhdXRoICYmIHR5cGVvZiBhdXRoID09PSBcIm9iamVjdFwiID8gKGF1dGggYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pIDoge307XG4gIHJldHVybiB7XG4gICAgZXhwaXJlc0F0OiB0eXBlb2YgY2xhaW1zLmV4cCA9PT0gXCJudW1iZXJcIiA/IGNsYWltcy5leHAgKiAxMDAwIDogdW5kZWZpbmVkLFxuICAgIGFjY291bnRJZDpcbiAgICAgIHR5cGVvZiBuZXN0ZWQuY2hhdGdwdF9hY2NvdW50X2lkID09PSBcInN0cmluZ1wiID8gbmVzdGVkLmNoYXRncHRfYWNjb3VudF9pZCA6IHVuZGVmaW5lZCxcbiAgICBwbGFuVHlwZTogdHlwZW9mIG5lc3RlZC5jaGF0Z3B0X3BsYW5fdHlwZSA9PT0gXCJzdHJpbmdcIiA/IG5lc3RlZC5jaGF0Z3B0X3BsYW5fdHlwZSA6IHVuZGVmaW5lZCxcbiAgfTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGV4Y2hhbmdlT3BlbkFJQ29kZShcbiAgY29kZTogc3RyaW5nLFxuICBjb2RlVmVyaWZpZXI6IHN0cmluZyxcbiAgcmVkaXJlY3RVcmk6IHN0cmluZyxcbik6IFByb21pc2U8T3BlbkFJRXhjaGFuZ2VkQ3JlZGVudGlhbHM+IHtcbiAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChPUEVOQUlfVE9LRU5fVVJMLCB7XG4gICAgbWV0aG9kOiBcIlBPU1RcIixcbiAgICBoZWFkZXJzOiB7IFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkXCIgfSxcbiAgICBib2R5OiBuZXcgVVJMU2VhcmNoUGFyYW1zKHtcbiAgICAgIGdyYW50X3R5cGU6IFwiYXV0aG9yaXphdGlvbl9jb2RlXCIsXG4gICAgICBjb2RlLFxuICAgICAgcmVkaXJlY3RfdXJpOiByZWRpcmVjdFVyaSxcbiAgICAgIGNsaWVudF9pZDogT1BFTkFJX0NMSUVOVF9JRCxcbiAgICAgIGNvZGVfdmVyaWZpZXI6IGNvZGVWZXJpZmllcixcbiAgICB9KSxcbiAgfSk7XG4gIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAvLyBUb2tlbiBlbmRwb2ludCBib2RpZXMgY2FuIGVjaG8gY3JlZGVudGlhbHMgb3IgcHJvdmlkZXIgZGlhZ25vc3RpY3M7IG5ldmVyIGV4cG9zZSB0aGVtLlxuICAgIGF3YWl0IHJlc3BvbnNlLmJvZHk/LmNhbmNlbCgpLmNhdGNoKCgpID0+IHVuZGVmaW5lZCk7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBPUEVOQUlfVE9LRU5fRVhDSEFOR0VfSFRUUF8ke3Jlc3BvbnNlLnN0YXR1c31gKTtcbiAgfVxuXG4gIGNvbnN0IHRva2VucyA9IChhd2FpdCByZXNwb25zZS5qc29uKCkpIGFzIHtcbiAgICBpZF90b2tlbj86IHN0cmluZztcbiAgICBhY2Nlc3NfdG9rZW4/OiBzdHJpbmc7XG4gICAgcmVmcmVzaF90b2tlbj86IHN0cmluZztcbiAgICBleHBpcmVzX2luPzogbnVtYmVyO1xuICB9O1xuICBpZiAoIXRva2Vucy5pZF90b2tlbiB8fCAhdG9rZW5zLmFjY2Vzc190b2tlbiB8fCAhdG9rZW5zLnJlZnJlc2hfdG9rZW4pIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJPcGVuQUkgdG9rZW4gZXhjaGFuZ2UgcmV0dXJuZWQgaW5jb21wbGV0ZSBjcmVkZW50aWFsc1wiKTtcbiAgfVxuXG4gIGNvbnN0IGlkQ2xhaW1zID0gcGFyc2VPcGVuQUlUb2tlbkNsYWltcyh0b2tlbnMuaWRfdG9rZW4pO1xuICBjb25zdCBhY2Nlc3NDbGFpbXMgPSBwYXJzZU9wZW5BSVRva2VuQ2xhaW1zKHRva2Vucy5hY2Nlc3NfdG9rZW4pO1xuICBjb25zdCBhY2NvdW50SWQgPSBpZENsYWltcy5hY2NvdW50SWQgPz8gYWNjZXNzQ2xhaW1zLmFjY291bnRJZDtcbiAgaWYgKCFhY2NvdW50SWQpIHRocm93IG5ldyBFcnJvcihcIk9wZW5BSSB0b2tlbiBkaWQgbm90IGluY2x1ZGUgYSBDaGF0R1BUIGFjY291bnQgaWRcIik7XG5cbiAgcmV0dXJuIHtcbiAgICBhY2Nlc3NUb2tlbjogdG9rZW5zLmFjY2Vzc190b2tlbixcbiAgICByZWZyZXNoVG9rZW46IHRva2Vucy5yZWZyZXNoX3Rva2VuLFxuICAgIGlkVG9rZW46IHRva2Vucy5pZF90b2tlbixcbiAgICBhY2Nlc3NUb2tlbkV4cGlyZXNBdDpcbiAgICAgIGFjY2Vzc0NsYWltcy5leHBpcmVzQXQgPz9cbiAgICAgICh0b2tlbnMuZXhwaXJlc19pbiA/IERhdGUubm93KCkgKyB0b2tlbnMuZXhwaXJlc19pbiAqIDEwMDAgOiBEYXRlLm5vdygpKSxcbiAgICAuLi4oaWRDbGFpbXMuZXhwaXJlc0F0ID8geyBpZFRva2VuRXhwaXJlc0F0OiBpZENsYWltcy5leHBpcmVzQXQgfSA6IHt9KSxcbiAgICBhY2NvdW50SWQsXG4gICAgLi4uKChpZENsYWltcy5wbGFuVHlwZSA/PyBhY2Nlc3NDbGFpbXMucGxhblR5cGUpXG4gICAgICA/IHsgcGxhblR5cGU6IGlkQ2xhaW1zLnBsYW5UeXBlID8/IGFjY2Vzc0NsYWltcy5wbGFuVHlwZSB9XG4gICAgICA6IHt9KSxcbiAgfTtcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7O0FBVUEsTUFBTSxvQkFBb0I7QUF3QjFCLFNBQWdCLHFCQUFpQztDQUMvQyxNQUFNLGVBQWUsT0FBTyxZQUFZLEVBQUUsQ0FBQyxDQUFDLFNBQVMsV0FBVztDQUNoRSxPQUFPO0VBQ0w7RUFDQSxlQUFlLE9BQU8sV0FBVyxRQUFRLENBQUMsQ0FBQyxPQUFPLFlBQVksQ0FBQyxDQUFDLE9BQU8sV0FBVztFQUNsRixPQUFPLE9BQU8sWUFBWSxFQUFFLENBQUMsQ0FBQyxTQUFTLFdBQVc7Q0FDcEQ7QUFDRjtBQUVBLFNBQWdCLG1CQUNkLGVBQ0EsT0FDQSxhQUNRO0NBQ1IsTUFBTSxNQUFNLElBQUksSUFBSSxvQkFBb0I7Q0FDeEMsSUFBSSxTQUFTLElBQUksZ0JBQWdCO0VBQy9CLGVBQWU7RUFDZixXQUFXO0VBQ1gsY0FBYztFQUNkLE9BQU87RUFDUCxnQkFBZ0I7RUFDaEIsdUJBQXVCO0VBQ3ZCLDRCQUE0QjtFQUM1QiwyQkFBMkI7RUFDM0I7RUFDQSxZQUFZO0NBQ2QsQ0FBQyxDQUFDLENBQUMsU0FBUztDQUNaLE9BQU8sSUFBSSxTQUFTO0FBQ3RCO0FBRUEsU0FBZ0IsdUJBQXVCLEtBQWdDO0NBQ3JFLE1BQU0sUUFBUSxJQUFJLE1BQU0sR0FBRztDQUMzQixNQUFNLGNBQWMsTUFBTTtDQUMxQixJQUFJLE1BQU0sV0FBVyxLQUFLLE1BQU0sTUFBTSxTQUFTLENBQUMsSUFBSSxLQUFLLENBQUMsYUFDeEQsTUFBTSxJQUFJLE1BQU0sMkJBQTJCO0NBRzdDLElBQUk7Q0FDSixJQUFJO0VBQ0YsVUFBVSxLQUFLLE1BQU0sT0FBTyxLQUFLLGFBQWEsV0FBVyxDQUFDLENBQUMsU0FBUyxNQUFNLENBQUM7Q0FDN0UsUUFBUTtFQUNOLE1BQU0sSUFBSSxNQUFNLDRCQUE0QjtDQUM5QztDQUNBLElBQUksQ0FBQyxXQUFXLE9BQU8sWUFBWSxVQUFVLE1BQU0sSUFBSSxNQUFNLDRCQUE0QjtDQUV6RixNQUFNLFNBQVM7Q0FDZixNQUFNLE9BQU8sT0FBTztDQUNwQixNQUFNLFNBQVMsUUFBUSxPQUFPLFNBQVMsV0FBWSxPQUFtQyxDQUFDO0NBQ3ZGLE9BQU87RUFDTCxXQUFXLE9BQU8sT0FBTyxRQUFRLFdBQVcsT0FBTyxNQUFNLE1BQU87RUFDaEUsV0FDRSxPQUFPLE9BQU8sdUJBQXVCLFdBQVcsT0FBTyxxQkFBcUI7RUFDOUUsVUFBVSxPQUFPLE9BQU8sc0JBQXNCLFdBQVcsT0FBTyxvQkFBb0I7Q0FDdEY7QUFDRjtBQUVBLGVBQXNCLG1CQUNwQixNQUNBLGNBQ0EsYUFDcUM7Q0FDckMsTUFBTSxXQUFXLE1BQU0sTUFBTSxrQkFBa0I7RUFDN0MsUUFBUTtFQUNSLFNBQVMsRUFBRSxnQkFBZ0Isb0NBQW9DO0VBQy9ELE1BQU0sSUFBSSxnQkFBZ0I7R0FDeEIsWUFBWTtHQUNaO0dBQ0EsY0FBYztHQUNkLFdBQVc7R0FDWCxlQUFlO0VBQ2pCLENBQUM7Q0FDSCxDQUFDO0NBQ0QsSUFBSSxDQUFDLFNBQVMsSUFBSTtFQUVoQixNQUFNLFNBQVMsTUFBTSxPQUFPLENBQUMsQ0FBQyxZQUFZLE1BQVM7RUFDbkQsTUFBTSxJQUFJLE1BQU0sOEJBQThCLFNBQVMsUUFBUTtDQUNqRTtDQUVBLE1BQU0sU0FBVSxNQUFNLFNBQVMsS0FBSztDQU1wQyxJQUFJLENBQUMsT0FBTyxZQUFZLENBQUMsT0FBTyxnQkFBZ0IsQ0FBQyxPQUFPLGVBQ3RELE1BQU0sSUFBSSxNQUFNLHVEQUF1RDtDQUd6RSxNQUFNLFdBQVcsdUJBQXVCLE9BQU8sUUFBUTtDQUN2RCxNQUFNLGVBQWUsdUJBQXVCLE9BQU8sWUFBWTtDQUMvRCxNQUFNLFlBQVksU0FBUyxhQUFhLGFBQWE7Q0FDckQsSUFBSSxDQUFDLFdBQVcsTUFBTSxJQUFJLE1BQU0sbURBQW1EO0NBRW5GLE9BQU87RUFDTCxhQUFhLE9BQU87RUFDcEIsY0FBYyxPQUFPO0VBQ3JCLFNBQVMsT0FBTztFQUNoQixzQkFDRSxhQUFhLGNBQ1osT0FBTyxhQUFhLEtBQUssSUFBSSxJQUFJLE9BQU8sYUFBYSxNQUFPLEtBQUssSUFBSTtFQUN4RSxHQUFJLFNBQVMsWUFBWSxFQUFFLGtCQUFrQixTQUFTLFVBQVUsSUFBSSxDQUFDO0VBQ3JFO0VBQ0EsR0FBSyxTQUFTLFlBQVksYUFBYSxXQUNuQyxFQUFFLFVBQVUsU0FBUyxZQUFZLGFBQWEsU0FBUyxJQUN2RCxDQUFDO0NBQ1A7QUFDRiJ9
99
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3BlbmFpLW9hdXRoLmpzIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy91dGlscy9wcm92aWRlcnMvb3BlbmFpL29wZW5haS1vYXV0aC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgY3J5cHRvIGZyb20gXCJub2RlOmNyeXB0b1wiO1xuXG5pbXBvcnQgeyB6IH0gZnJvbSBcInpvZFwiO1xuXG5pbXBvcnQgeyB0eXBlIEpzb25WYWx1ZSB9IGZyb20gXCIuLi9jb21tb24vcHJvdmlkZXItdHlwZXNcIjtcbmltcG9ydCB7XG4gIE9QRU5BSV9BVVRIT1JJWkVfVVJMLFxuICBPUEVOQUlfQ0xJRU5UX0lELFxuICBPUEVOQUlfT1JJR0lOQVRPUixcbiAgT1BFTkFJX1NDT1BFUyxcbiAgT1BFTkFJX1RPS0VOX1VSTCxcbn0gZnJvbSBcIi4vb3BlbmFpLWNvbnN0YW50c1wiO1xuXG5jb25zdCBPUEVOQUlfQVVUSF9DTEFJTSA9IFwiaHR0cHM6Ly9hcGkub3BlbmFpLmNvbS9hdXRoXCI7XG5cbi8vIE1pc3R5cGVkIGNsYWltcyByZWFkIGFzIGFic2VudCwgbWF0Y2hpbmcgaG93IHRoZSBjYWxsZXJzIHRyZWF0IG1pc3Npbmcgb25lcy5cbmNvbnN0IG9wZW5BSVRva2VuQ2xhaW1zU2NoZW1hID0gei5sb29zZU9iamVjdCh7XG4gIGV4cDogei5udW1iZXIoKS5vcHRpb25hbCgpLmNhdGNoKHVuZGVmaW5lZCksXG4gIFtPUEVOQUlfQVVUSF9DTEFJTV06IHpcbiAgICAubG9vc2VPYmplY3Qoe1xuICAgICAgY2hhdGdwdF9hY2NvdW50X2lkOiB6LnN0cmluZygpLm9wdGlvbmFsKCkuY2F0Y2godW5kZWZpbmVkKSxcbiAgICAgIGNoYXRncHRfcGxhbl90eXBlOiB6LnN0cmluZygpLm9wdGlvbmFsKCkuY2F0Y2godW5kZWZpbmVkKSxcbiAgICB9KVxuICAgIC5vcHRpb25hbCgpXG4gICAgLmNhdGNoKHVuZGVmaW5lZCksXG59KTtcblxuY29uc3Qgb3BlbkFJVG9rZW5FeGNoYW5nZVJlc3BvbnNlU2NoZW1hID0gei5sb29zZU9iamVjdCh7XG4gIGlkX3Rva2VuOiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG4gIGFjY2Vzc190b2tlbjogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICByZWZyZXNoX3Rva2VuOiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG4gIGV4cGlyZXNfaW46IHoubnVtYmVyKCkub3B0aW9uYWwoKSxcbn0pO1xuXG5leHBvcnQgaW50ZXJmYWNlIE9wZW5BSVBLQ0Uge1xuICBjb2RlVmVyaWZpZXI6IHN0cmluZztcbiAgY29kZUNoYWxsZW5nZTogc3RyaW5nO1xuICBzdGF0ZTogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE9wZW5BSVRva2VuQ2xhaW1zIHtcbiAgZXhwaXJlc0F0PzogbnVtYmVyO1xuICBhY2NvdW50SWQ/OiBzdHJpbmc7XG4gIHBsYW5UeXBlPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE9wZW5BSUV4Y2hhbmdlZENyZWRlbnRpYWxzIHtcbiAgYWNjZXNzVG9rZW46IHN0cmluZztcbiAgcmVmcmVzaFRva2VuOiBzdHJpbmc7XG4gIGlkVG9rZW46IHN0cmluZztcbiAgYWNjZXNzVG9rZW5FeHBpcmVzQXQ6IG51bWJlcjtcbiAgaWRUb2tlbkV4cGlyZXNBdD86IG51bWJlcjtcbiAgYWNjb3VudElkOiBzdHJpbmc7XG4gIHBsYW5UeXBlPzogc3RyaW5nO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVPcGVuQUlQS0NFKCk6IE9wZW5BSVBLQ0Uge1xuICBjb25zdCBjb2RlVmVyaWZpZXIgPSBjcnlwdG8ucmFuZG9tQnl0ZXMoNjQpLnRvU3RyaW5nKFwiYmFzZTY0dXJsXCIpO1xuXG4gIHJldHVybiB7XG4gICAgY29kZVZlcmlmaWVyLFxuICAgIGNvZGVDaGFsbGVuZ2U6IGNyeXB0by5jcmVhdGVIYXNoKFwic2hhMjU2XCIpLnVwZGF0ZShjb2RlVmVyaWZpZXIpLmRpZ2VzdChcImJhc2U2NHVybFwiKSxcbiAgICBzdGF0ZTogY3J5cHRvLnJhbmRvbUJ5dGVzKDMyKS50b1N0cmluZyhcImJhc2U2NHVybFwiKSxcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkT3BlbkFJQXV0aFVybChcbiAgY29kZUNoYWxsZW5nZTogc3RyaW5nLFxuICBzdGF0ZTogc3RyaW5nLFxuICByZWRpcmVjdFVyaTogc3RyaW5nLFxuKTogc3RyaW5nIHtcbiAgY29uc3QgdXJsID0gbmV3IFVSTChPUEVOQUlfQVVUSE9SSVpFX1VSTCk7XG4gIHVybC5zZWFyY2ggPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHtcbiAgICByZXNwb25zZV90eXBlOiBcImNvZGVcIixcbiAgICBjbGllbnRfaWQ6IE9QRU5BSV9DTElFTlRfSUQsXG4gICAgcmVkaXJlY3RfdXJpOiByZWRpcmVjdFVyaSxcbiAgICBzY29wZTogT1BFTkFJX1NDT1BFUyxcbiAgICBjb2RlX2NoYWxsZW5nZTogY29kZUNoYWxsZW5nZSxcbiAgICBjb2RlX2NoYWxsZW5nZV9tZXRob2Q6IFwiUzI1NlwiLFxuICAgIGlkX3Rva2VuX2FkZF9vcmdhbml6YXRpb25zOiBcInRydWVcIixcbiAgICBjb2RleF9jbGlfc2ltcGxpZmllZF9mbG93OiBcInRydWVcIixcbiAgICBzdGF0ZSxcbiAgICBvcmlnaW5hdG9yOiBPUEVOQUlfT1JJR0lOQVRPUixcbiAgfSkudG9TdHJpbmcoKTtcblxuICByZXR1cm4gdXJsLnRvU3RyaW5nKCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZU9wZW5BSVRva2VuQ2xhaW1zKGp3dDogc3RyaW5nKTogT3BlbkFJVG9rZW5DbGFpbXMge1xuICBjb25zdCBwYXJ0cyA9IGp3dC5zcGxpdChcIi5cIik7XG4gIGNvbnN0IHBheWxvYWRQYXJ0ID0gcGFydHNbMV07XG5cbiAgaWYgKHBhcnRzLmxlbmd0aCAhPT0gMyB8fCBwYXJ0cy5zb21lKChwYXJ0KSA9PiAhcGFydCkgfHwgIXBheWxvYWRQYXJ0KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiaW52YWxpZCBPcGVuQUkgSldUIGZvcm1hdFwiKTtcbiAgfVxuXG4gIGxldCBwYXlsb2FkOiBKc29uVmFsdWU7XG5cbiAgdHJ5IHtcbiAgICAvLyBKU09OLnBhcnNlIHdpdGhvdXQgYSByZXZpdmVyIHlpZWxkcyBvbmx5IEpTT04gdmFsdWVzLlxuICAgIHBheWxvYWQgPSBKU09OLnBhcnNlKEJ1ZmZlci5mcm9tKHBheWxvYWRQYXJ0LCBcImJhc2U2NHVybFwiKS50b1N0cmluZyhcInV0ZjhcIikpO1xuICB9IGNhdGNoIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJpbnZhbGlkIE9wZW5BSSBKV1QgcGF5bG9hZFwiKTtcbiAgfVxuXG4gIGNvbnN0IGNsYWltcyA9IG9wZW5BSVRva2VuQ2xhaW1zU2NoZW1hLnNhZmVQYXJzZShwYXlsb2FkKTtcblxuICBpZiAoIWNsYWltcy5zdWNjZXNzKSB0aHJvdyBuZXcgRXJyb3IoXCJpbnZhbGlkIE9wZW5BSSBKV1QgcGF5bG9hZFwiKTtcbiAgY29uc3QgYXV0aCA9IGNsYWltcy5kYXRhW09QRU5BSV9BVVRIX0NMQUlNXTtcblxuICByZXR1cm4ge1xuICAgIGV4cGlyZXNBdDogY2xhaW1zLmRhdGEuZXhwID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiBjbGFpbXMuZGF0YS5leHAgKiAxMDAwLFxuICAgIGFjY291bnRJZDogYXV0aD8uY2hhdGdwdF9hY2NvdW50X2lkLFxuICAgIHBsYW5UeXBlOiBhdXRoPy5jaGF0Z3B0X3BsYW5fdHlwZSxcbiAgfTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGV4Y2hhbmdlT3BlbkFJQ29kZShcbiAgY29kZTogc3RyaW5nLFxuICBjb2RlVmVyaWZpZXI6IHN0cmluZyxcbiAgcmVkaXJlY3RVcmk6IHN0cmluZyxcbik6IFByb21pc2U8T3BlbkFJRXhjaGFuZ2VkQ3JlZGVudGlhbHM+IHtcbiAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChPUEVOQUlfVE9LRU5fVVJMLCB7XG4gICAgbWV0aG9kOiBcIlBPU1RcIixcbiAgICBoZWFkZXJzOiB7IFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkXCIgfSxcbiAgICBib2R5OiBuZXcgVVJMU2VhcmNoUGFyYW1zKHtcbiAgICAgIGdyYW50X3R5cGU6IFwiYXV0aG9yaXphdGlvbl9jb2RlXCIsXG4gICAgICBjb2RlLFxuICAgICAgcmVkaXJlY3RfdXJpOiByZWRpcmVjdFVyaSxcbiAgICAgIGNsaWVudF9pZDogT1BFTkFJX0NMSUVOVF9JRCxcbiAgICAgIGNvZGVfdmVyaWZpZXI6IGNvZGVWZXJpZmllcixcbiAgICB9KSxcbiAgfSk7XG5cbiAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgIC8vIFRva2VuIGVuZHBvaW50IGJvZGllcyBjYW4gZWNobyBjcmVkZW50aWFscyBvciBwcm92aWRlciBkaWFnbm9zdGljczsgbmV2ZXIgZXhwb3NlIHRoZW0uXG4gICAgYXdhaXQgcmVzcG9uc2UuYm9keT8uY2FuY2VsKCkuY2F0Y2goKCkgPT4gdW5kZWZpbmVkKTtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYE9QRU5BSV9UT0tFTl9FWENIQU5HRV9IVFRQXyR7cmVzcG9uc2Uuc3RhdHVzfWApO1xuICB9XG5cbiAgY29uc3QgdG9rZW5zID0gb3BlbkFJVG9rZW5FeGNoYW5nZVJlc3BvbnNlU2NoZW1hLnBhcnNlKGF3YWl0IHJlc3BvbnNlLmpzb24oKSk7XG5cbiAgaWYgKCF0b2tlbnMuaWRfdG9rZW4gfHwgIXRva2Vucy5hY2Nlc3NfdG9rZW4gfHwgIXRva2Vucy5yZWZyZXNoX3Rva2VuKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiT3BlbkFJIHRva2VuIGV4Y2hhbmdlIHJldHVybmVkIGluY29tcGxldGUgY3JlZGVudGlhbHNcIik7XG4gIH1cblxuICBjb25zdCBpZENsYWltcyA9IHBhcnNlT3BlbkFJVG9rZW5DbGFpbXModG9rZW5zLmlkX3Rva2VuKTtcbiAgY29uc3QgYWNjZXNzQ2xhaW1zID0gcGFyc2VPcGVuQUlUb2tlbkNsYWltcyh0b2tlbnMuYWNjZXNzX3Rva2VuKTtcbiAgY29uc3QgYWNjb3VudElkID0gaWRDbGFpbXMuYWNjb3VudElkID8/IGFjY2Vzc0NsYWltcy5hY2NvdW50SWQ7XG5cbiAgaWYgKCFhY2NvdW50SWQpIHRocm93IG5ldyBFcnJvcihcIk9wZW5BSSB0b2tlbiBkaWQgbm90IGluY2x1ZGUgYSBDaGF0R1BUIGFjY291bnQgaWRcIik7XG5cbiAgY29uc3QgY3JlZGVudGlhbHM6IE9wZW5BSUV4Y2hhbmdlZENyZWRlbnRpYWxzID0ge1xuICAgIGFjY2Vzc1Rva2VuOiB0b2tlbnMuYWNjZXNzX3Rva2VuLFxuICAgIHJlZnJlc2hUb2tlbjogdG9rZW5zLnJlZnJlc2hfdG9rZW4sXG4gICAgaWRUb2tlbjogdG9rZW5zLmlkX3Rva2VuLFxuICAgIGFjY2Vzc1Rva2VuRXhwaXJlc0F0OlxuICAgICAgYWNjZXNzQ2xhaW1zLmV4cGlyZXNBdCA/P1xuICAgICAgKHRva2Vucy5leHBpcmVzX2luID8gRGF0ZS5ub3coKSArIHRva2Vucy5leHBpcmVzX2luICogMTAwMCA6IERhdGUubm93KCkpLFxuICAgIGFjY291bnRJZCxcbiAgfTtcblxuICBpZiAoaWRDbGFpbXMuZXhwaXJlc0F0KSBjcmVkZW50aWFscy5pZFRva2VuRXhwaXJlc0F0ID0gaWRDbGFpbXMuZXhwaXJlc0F0O1xuICBjb25zdCBwbGFuVHlwZSA9IGlkQ2xhaW1zLnBsYW5UeXBlID8/IGFjY2Vzc0NsYWltcy5wbGFuVHlwZTtcblxuICBpZiAocGxhblR5cGUpIGNyZWRlbnRpYWxzLnBsYW5UeXBlID0gcGxhblR5cGU7XG5cbiAgcmV0dXJuIGNyZWRlbnRpYWxzO1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7O0FBYUEsTUFBTSxvQkFBb0I7QUFHMUIsTUFBTSwwQkFBMEIsRUFBRSxZQUFZO0NBQzVDLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxNQUFNLE1BQVM7RUFDekMsb0JBQW9CLEVBQ2xCLFlBQVk7RUFDWCxvQkFBb0IsRUFB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
@@ -1,3 +1,4 @@
1
+ import { isJsonObject, jsonString } from "../common/provider-types.js";
1
2
  import { buildCodexIdentityHeaders } from "./openai-backend-protocol.js";
2
3
  //#region src/utils/providers/openai/openai-quota.ts
3
4
  const CHATGPT_WHAM_USAGE_URL = "https://chatgpt.com/backend-api/wham/usage";
@@ -5,7 +6,7 @@ async function readDirect(options) {
5
6
  const read = (credentials) => (options.fetch ?? fetch)(CHATGPT_WHAM_USAGE_URL, {
6
7
  method: "GET",
7
8
  headers: buildCodexIdentityHeaders(credentials.accessToken, credentials.accountId),
8
- ...options.signal ? { signal: options.signal } : {}
9
+ signal: options.signal
9
10
  });
10
11
  let response = await read(options.credentials);
11
12
  if (response.status === 401 && options.refreshCredentials) {
@@ -21,8 +22,11 @@ async function readDirect(options) {
21
22
  cachedAt: Date.now()
22
23
  };
23
24
  }
25
+ function jsonObjectOrEmpty(value) {
26
+ return isJsonObject(value) ? value : {};
27
+ }
24
28
  function windowFrom(value) {
25
- if (!value || typeof value !== "object") return null;
29
+ if (!isJsonObject(value)) return null;
26
30
  const source = value;
27
31
  const usedPercent = Number(source.usedPercent ?? source.used_percent);
28
32
  if (!Number.isFinite(usedPercent)) return null;
@@ -36,22 +40,29 @@ function windowFrom(value) {
36
40
  };
37
41
  }
38
42
  function snapshotFrom(value) {
39
- const source = value && typeof value === "object" ? value : {};
40
- const limitId = source.limitId ?? source.limit_id;
41
- const limitName = source.limitName ?? source.limit_name;
43
+ const source = jsonObjectOrEmpty(value);
42
44
  return {
43
- limitId: typeof limitId === "string" ? limitId : null,
44
- limitName: typeof limitName === "string" ? limitName : null,
45
+ limitId: jsonString(source.limitId ?? source.limit_id) ?? null,
46
+ limitName: jsonString(source.limitName ?? source.limit_name) ?? null,
45
47
  primary: windowFrom(source.primary ?? source.primary_window),
46
48
  secondary: windowFrom(source.secondary ?? source.secondary_window),
47
49
  credits: source.credits ?? null,
48
- planType: typeof (source.planType ?? source.plan_type) === "string" ? String(source.planType ?? source.plan_type) : null,
49
- rateLimitReachedType: typeof (source.rateLimitReachedType ?? source.rate_limit_reached) === "string" ? String(source.rateLimitReachedType ?? source.rate_limit_reached) : null
50
+ planType: jsonString(source.planType ?? source.plan_type) ?? null,
51
+ rateLimitReachedType: jsonString(source.rateLimitReachedType ?? source.rate_limit_reached) ?? null
50
52
  };
51
53
  }
52
- function normalizeWhamUsage(body) {
53
- if (body.rateLimits && typeof body.rateLimits === "object") return body;
54
- const container = body.rate_limits && typeof body.rate_limits === "object" ? body.rate_limits : body;
54
+ /** Normalizes snapshots that already use the app-server (camelCase) shape. */
55
+ function normalizeAppServerUsage(body) {
56
+ const byId = isJsonObject(body.rateLimitsByLimitId) ? Object.fromEntries(Object.entries(body.rateLimitsByLimitId).map(([id, snapshot]) => [id, snapshotFrom(snapshot)])) : null;
57
+ return {
58
+ rateLimits: snapshotFrom(body.rateLimits),
59
+ rateLimitsByLimitId: byId
60
+ };
61
+ }
62
+ function normalizeWhamUsage(value) {
63
+ const body = jsonObjectOrEmpty(value);
64
+ if (isJsonObject(body.rateLimits)) return normalizeAppServerUsage(body);
65
+ const container = isJsonObject(body.rate_limits) ? body.rate_limits : body;
55
66
  const shared = {
56
67
  plan_type: body.plan_type ?? container.plan_type,
57
68
  credits: body.credits ?? container.credits,
@@ -59,51 +70,51 @@ function normalizeWhamUsage(body) {
59
70
  };
60
71
  const primary = snapshotFrom({
61
72
  ...shared,
62
- ...container.rate_limit ?? container
73
+ ...jsonObjectOrEmpty(container.rate_limit ?? container)
63
74
  });
64
75
  const additional = Array.isArray(container.additional_rate_limits) ? container.additional_rate_limits : Array.isArray(body.additional_rate_limits) ? body.additional_rate_limits : [];
65
- const byId = {};
76
+ const byId = /* @__PURE__ */ new Map();
66
77
  for (const entry of additional) {
67
- if (!entry || typeof entry !== "object") continue;
68
- const wrapper = entry;
78
+ if (!isJsonObject(entry)) continue;
69
79
  const snapshot = snapshotFrom({
70
80
  ...shared,
71
- ...wrapper.rate_limit ?? wrapper
81
+ ...jsonObjectOrEmpty(entry.rate_limit ?? entry)
72
82
  });
73
- if (snapshot.limitId) byId[snapshot.limitId] = snapshot;
83
+ if (snapshot.limitId) byId.set(snapshot.limitId, snapshot);
74
84
  }
75
85
  return {
76
86
  rateLimits: primary,
77
- rateLimitsByLimitId: Object.keys(byId).length ? byId : null
87
+ rateLimitsByLimitId: byId.size ? Object.fromEntries(byId) : null
78
88
  };
79
89
  }
80
90
  async function readOpenAIQuotaUsage(source) {
81
91
  try {
82
- const direct = typeof source !== "function";
83
- const { data, cachedAt } = await (typeof source === "function" ? source() : readDirect(source));
92
+ const direct = "credentials" in source;
93
+ const { data, cachedAt } = await ("credentials" in source ? readDirect(source) : source());
84
94
  const rateLimits = data.rateLimits;
85
95
  const primary = rateLimits?.primary;
86
- if (!primary || typeof primary.usedPercent !== "number" || !Number.isFinite(primary.usedPercent)) return {
96
+ if (!primary || !Number.isFinite(primary.usedPercent)) return {
87
97
  kind: "lookup_failed",
88
98
  reason: "primary usedPercent unavailable"
89
99
  };
90
- return {
100
+ const result = {
91
101
  kind: "ok",
92
102
  utilizationPct: primary.usedPercent,
93
103
  cacheAgeMs: Math.max(Date.now() - cachedAt, 0),
94
104
  windowDurationMins: primary.windowDurationMins,
95
105
  resetsAt: primary.resetsAt,
96
- limitId: rateLimits.limitId,
97
- ...direct ? { raw: data } : {}
106
+ limitId: rateLimits.limitId
98
107
  };
108
+ if (direct) result.raw = data;
109
+ return result;
99
110
  } catch (e) {
100
111
  return {
101
112
  kind: "lookup_failed",
102
- reason: e.message
113
+ reason: e instanceof Error ? e.message : String(e)
103
114
  };
104
115
  }
105
116
  }
106
117
  //#endregion
107
118
  export { CHATGPT_WHAM_USAGE_URL, readOpenAIQuotaUsage };
108
119
 
109
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3BlbmFpLXF1b3RhLmpzIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy91dGlscy9wcm92aWRlcnMvb3BlbmFpL29wZW5haS1xdW90YS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyB0eXBlIE9wZW5BSUNyZWRlbnRpYWxzIH0gZnJvbSBcIi4uLy4uLy4uL2FwcGxpY2F0aW9uL3Rva2VuL3Rva2VuLnR5cGVzXCI7XG5pbXBvcnQgeyB0eXBlIFF1b3RhUmF0ZUxpbWl0cywgdHlwZSBRdW90YVJhdGVMaW1pdFNuYXBzaG90IH0gZnJvbSBcIi4uL2NvbW1vbi9wcm92aWRlci10eXBlc1wiO1xuaW1wb3J0IHsgYnVpbGRDb2RleElkZW50aXR5SGVhZGVycyB9IGZyb20gXCIuL29wZW5haS1iYWNrZW5kLXByb3RvY29sXCI7XG5cbmV4cG9ydCBjb25zdCBDSEFUR1BUX1dIQU1fVVNBR0VfVVJMID0gXCJodHRwczovL2NoYXRncHQuY29tL2JhY2tlbmQtYXBpL3doYW0vdXNhZ2VcIiBhcyBjb25zdDtcblxuZXhwb3J0IHR5cGUgT3BlbkFJUmF0ZUxpbWl0c1dpdGhNZXRhID0ge1xuICBkYXRhOiBRdW90YVJhdGVMaW1pdHM7XG4gIGNhY2hlZEF0OiBudW1iZXI7XG59O1xuXG5leHBvcnQgdHlwZSBPcGVuQUlRdW90YVVzYWdlUmVzdWx0ID1cbiAgfCB7XG4gICAgICBraW5kOiBcIm9rXCI7XG4gICAgICB1dGlsaXphdGlvblBjdDogbnVtYmVyO1xuICAgICAgY2FjaGVBZ2VNczogbnVtYmVyO1xuICAgICAgd2luZG93RHVyYXRpb25NaW5zOiBudW1iZXIgfCBudWxsO1xuICAgICAgcmVzZXRzQXQ6IG51bWJlciB8IG51bGw7XG4gICAgICBsaW1pdElkOiBzdHJpbmcgfCBudWxsO1xuICAgICAgcmF3PzogUXVvdGFSYXRlTGltaXRzO1xuICAgIH1cbiAgfCB7IGtpbmQ6IFwibG9va3VwX2ZhaWxlZFwiOyByZWFzb246IHN0cmluZyB9O1xuXG5leHBvcnQgaW50ZXJmYWNlIE9wZW5BSVF1b3RhSHR0cE9wdGlvbnMge1xuICBjcmVkZW50aWFsczogUGljazxPcGVuQUlDcmVkZW50aWFscywgXCJhY2Nlc3NUb2tlblwiIHwgXCJhY2NvdW50SWRcIj47XG4gIHJlZnJlc2hDcmVkZW50aWFscz86ICgpID0+IFByb21pc2U8UGljazxPcGVuQUlDcmVkZW50aWFscywgXCJhY2Nlc3NUb2tlblwiIHwgXCJhY2NvdW50SWRcIj4+O1xuICBmZXRjaD86IHR5cGVvZiBmZXRjaDtcbiAgc2lnbmFsPzogQWJvcnRTaWduYWw7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlYWREaXJlY3Qob3B0aW9uczogT3BlbkFJUXVvdGFIdHRwT3B0aW9ucyk6IFByb21pc2U8T3BlbkFJUmF0ZUxpbWl0c1dpdGhNZXRhPiB7XG4gIGNvbnN0IHJlYWQgPSAoY3JlZGVudGlhbHM6IE9wZW5BSVF1b3RhSHR0cE9wdGlvbnNbXCJjcmVkZW50aWFsc1wiXSkgPT5cbiAgICAob3B0aW9ucy5mZXRjaCA/PyBmZXRjaCkoQ0hBVEdQVF9XSEFNX1VTQUdFX1VSTCwge1xuICAgICAgbWV0aG9kOiBcIkdFVFwiLFxuICAgICAgaGVhZGVyczogYnVpbGRDb2RleElkZW50aXR5SGVhZGVycyhjcmVkZW50aWFscy5hY2Nlc3NUb2tlbiwgY3JlZGVudGlhbHMuYWNjb3VudElkKSxcbiAgICAgIC4uLihvcHRpb25zLnNpZ25hbCA/IHsgc2lnbmFsOiBvcHRpb25zLnNpZ25hbCB9IDoge30pLFxuICAgIH0pO1xuICBsZXQgcmVzcG9uc2UgPSBhd2FpdCByZWFkKG9wdGlvbnMuY3JlZGVudGlhbHMpO1xuICBpZiAocmVzcG9uc2Uuc3RhdHVzID09PSA0MDEgJiYgb3B0aW9ucy5yZWZyZXNoQ3JlZGVudGlhbHMpIHtcbiAgICBhd2FpdCByZXNwb25zZS5ib2R5Py5jYW5jZWwoKTtcbiAgICBvcHRpb25zLnNpZ25hbD8udGhyb3dJZkFib3J0ZWQoKTtcbiAgICBjb25zdCBjcmVkZW50aWFscyA9IGF3YWl0IG9wdGlvbnMucmVmcmVzaENyZWRlbnRpYWxzKCk7XG4gICAgb3B0aW9ucy5zaWduYWw/LnRocm93SWZBYm9ydGVkKCk7XG4gICAgcmVzcG9uc2UgPSBhd2FpdCByZWFkKGNyZWRlbnRpYWxzKTtcbiAgfVxuICBpZiAoIXJlc3BvbnNlLm9rKSB0aHJvdyBuZXcgRXJyb3IoYE9wZW5BSSBxdW90YSBsb29rdXAgZmFpbGVkOiBIVFRQICR7cmVzcG9uc2Uuc3RhdHVzfWApO1xuICBjb25zdCBib2R5ID0gKGF3YWl0IHJlc3BvbnNlLmpzb24oKSkgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIGNvbnN0IGRhdGEgPSBub3JtYWxpemVXaGFtVXNhZ2UoYm9keSk7XG4gIHJldHVybiB7IGRhdGEsIGNhY2hlZEF0OiBEYXRlLm5vdygpIH07XG59XG5cbmZ1bmN0aW9uIHdpbmRvd0Zyb20odmFsdWU6IHVua25vd24pIHtcbiAgaWYgKCF2YWx1ZSB8fCB0eXBlb2YgdmFsdWUgIT09IFwib2JqZWN0XCIpIHJldHVybiBudWxsO1xuICBjb25zdCBzb3VyY2UgPSB2YWx1ZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgY29uc3QgdXNlZFBlcmNlbnQgPSBOdW1iZXIoc291cmNlLnVzZWRQZXJjZW50ID8/IHNvdXJjZS51c2VkX3BlcmNlbnQpO1xuICBpZiAoIU51bWJlci5pc0Zpbml0ZSh1c2VkUGVyY2VudCkpIHJldHVybiBudWxsO1xuICBjb25zdCBkdXJhdGlvbk1pbnMgPSBzb3VyY2Uud2luZG93RHVyYXRpb25NaW5zID8/IHNvdXJjZS53aW5kb3dfbWludXRlcztcbiAgY29uc3QgZHVyYXRpb25TZWNvbmRzID0gc291cmNlLmxpbWl0V2luZG93U2Vjb25kcyA/PyBzb3VyY2UubGltaXRfd2luZG93X3NlY29uZHM7XG4gIGNvbnN0IHJlc2V0cyA9IHNvdXJjZS5yZXNldHNBdCA/PyBzb3VyY2UucmVzZXRfYXQ7XG4gIHJldHVybiB7XG4gICAgdXNlZFBlcmNlbnQsXG4gICAgd2luZG93RHVyYXRpb25NaW5zOlxuICAgICAgZHVyYXRpb25NaW5zICE9PSBudWxsICYmIGR1cmF0aW9uTWlucyAhPT0gdW5kZWZpbmVkXG4gICAgICAgID8gTnVtYmVyKGR1cmF0aW9uTWlucylcbiAgICAgICAgOiBkdXJhdGlvblNlY29uZHMgIT09IG51bGwgJiYgZHVyYXRpb25TZWNvbmRzICE9PSB1bmRlZmluZWRcbiAgICAgICAgICA/IE51bWJlcihkdXJhdGlvblNlY29uZHMpIC8gNjBcbiAgICAgICAgICA6IG51bGwsXG4gICAgcmVzZXRzQXQ6IHJlc2V0cyA9PT0gbnVsbCB8fCByZXNldHMgPT09IHVuZGVmaW5lZCA/IG51bGwgOiBOdW1iZXIocmVzZXRzKSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gc25hcHNob3RGcm9tKHZhbHVlOiB1bmtub3duKTogUXVvdGFSYXRlTGltaXRTbmFwc2hvdCB7XG4gIGNvbnN0IHNvdXJjZSA9ICh2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgPyB2YWx1ZSA6IHt9KSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgY29uc3QgbGltaXRJZCA9IHNvdXJjZS5saW1pdElkID8/IHNvdXJjZS5saW1pdF9pZDtcbiAgY29uc3QgbGltaXROYW1lID0gc291cmNlLmxpbWl0TmFtZSA/PyBzb3VyY2UubGltaXRfbmFtZTtcbiAgcmV0dXJuIHtcbiAgICBsaW1pdElkOiB0eXBlb2YgbGltaXRJZCA9PT0gXCJzdHJpbmdcIiA/IGxpbWl0SWQgOiBudWxsLFxuICAgIGxpbWl0TmFtZTogdHlwZW9mIGxpbWl0TmFtZSA9PT0gXCJzdHJpbmdcIiA/IGxpbWl0TmFtZSA6IG51bGwsXG4gICAgcHJpbWFyeTogd2luZG93RnJvbShzb3VyY2UucHJpbWFyeSA/PyBzb3VyY2UucHJpbWFyeV93aW5kb3cpLFxuICAgIHNlY29uZGFyeTogd2luZG93RnJvbShzb3VyY2Uuc2Vjb25kYXJ5ID8/IHNvdXJjZS5zZWNvbmRhcnlfd2luZG93KSxcbiAgICBjcmVkaXRzOiAoc291cmNlLmNyZWRpdHMgPz8gbnVsbCkgYXMgUXVvdGFSYXRlTGltaXRTbmFwc2hvdFtcImNyZWRpdHNcIl0sXG4gICAgcGxhblR5cGU6XG4gICAgICB0eXBlb2YgKHNvdXJjZS5wbGFuVHlwZSA/PyBzb3VyY2UucGxhbl90eXBlKSA9PT0gXCJzdHJpbmdcIlxuICAgICAgICA/IFN0cmluZyhzb3VyY2UucGxhblR5cGUgPz8gc291cmNlLnBsYW5fdHlwZSlcbiAgICAgICAgOiBudWxsLFxuICAgIHJhdGVMaW1pdFJlYWNoZWRUeXBlOlxuICAgICAgdHlwZW9mIChzb3VyY2UucmF0ZUxpbWl0UmVhY2hlZFR5cGUgPz8gc291cmNlLnJhdGVfbGltaXRfcmVhY2hlZCkgPT09IFwic3RyaW5nXCJcbiAgICAgICAgPyBTdHJpbmcoc291cmNlLnJhdGVMaW1pdFJlYWNoZWRUeXBlID8/IHNvdXJjZS5yYXRlX2xpbWl0X3JlYWNoZWQpXG4gICAgICAgIDogbnVsbCxcbiAgfTtcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplV2hhbVVzYWdlKGJvZHk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogUXVvdGFSYXRlTGltaXRzIHtcbiAgaWYgKGJvZHkucmF0ZUxpbWl0cyAmJiB0eXBlb2YgYm9keS5yYXRlTGltaXRzID09PSBcIm9iamVjdFwiKSB7XG4gICAgcmV0dXJuIGJvZHkgYXMgUXVvdGFSYXRlTGltaXRzO1xuICB9XG4gIGNvbnN0IGNvbnRhaW5lciA9XG4gICAgYm9keS5yYXRlX2xpbWl0cyAmJiB0eXBlb2YgYm9keS5yYXRlX2xpbWl0cyA9PT0gXCJvYmplY3RcIlxuICAgICAgPyAoYm9keS5yYXRlX2xpbWl0cyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilcbiAgICAgIDogYm9keTtcbiAgY29uc3Qgc2hhcmVkID0ge1xuICAgIHBsYW5fdHlwZTogYm9keS5wbGFuX3R5cGUgPz8gY29udGFpbmVyLnBsYW5fdHlwZSxcbiAgICBjcmVkaXRzOiBib2R5LmNyZWRpdHMgPz8gY29udGFpbmVyLmNyZWRpdHMsXG4gICAgcmF0ZV9saW1pdF9yZWFjaGVkOiBib2R5LnJhdGVfbGltaXRfcmVhY2hlZCA/PyBjb250YWluZXIucmF0ZV9saW1pdF9yZWFjaGVkLFxuICB9O1xuICBjb25zdCBwcmltYXJ5ID0gc25hcHNob3RGcm9tKHtcbiAgICAuLi5zaGFyZWQsXG4gICAgLi4uKChjb250YWluZXIucmF0ZV9saW1pdCA/PyBjb250YWluZXIpIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KSxcbiAgfSk7XG4gIGNvbnN0IGFkZGl0aW9uYWwgPSBBcnJheS5pc0FycmF5KGNvbnRhaW5lci5hZGRpdGlvbmFsX3JhdGVfbGltaXRzKVxuICAgID8gY29udGFpbmVyLmFkZGl0aW9uYWxfcmF0ZV9saW1pdHNcbiAgICA6IEFycmF5LmlzQXJyYXkoYm9keS5hZGRpdGlvbmFsX3JhdGVfbGltaXRzKVxuICAgICAgPyBib2R5LmFkZGl0aW9uYWxfcmF0ZV9saW1pdHNcbiAgICAgIDogW107XG4gIGNvbnN0IGJ5SWQ6IFJlY29yZDxzdHJpbmcsIFF1b3RhUmF0ZUxpbWl0U25hcHNob3Q+ID0ge307XG4gIGZvciAoY29uc3QgZW50cnkgb2YgYWRkaXRpb25hbCkge1xuICAgIGlmICghZW50cnkgfHwgdHlwZW9mIGVudHJ5ICE9PSBcIm9iamVjdFwiKSBjb250aW51ZTtcbiAgICBjb25zdCB3cmFwcGVyID0gZW50cnkgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgY29uc3Qgc25hcHNob3QgPSBzbmFwc2hvdEZyb20oe1xuICAgICAgLi4uc2hhcmVkLFxuICAgICAgLi4uKCh3cmFwcGVyLnJhdGVfbGltaXQgPz8gd3JhcHBlcikgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pLFxuICAgIH0pO1xuICAgIGlmIChzbmFwc2hvdC5saW1pdElkKSBieUlkW3NuYXBzaG90LmxpbWl0SWRdID0gc25hcHNob3Q7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICByYXRlTGltaXRzOiBwcmltYXJ5LFxuICAgIHJhdGVMaW1pdHNCeUxpbWl0SWQ6IE9iamVjdC5rZXlzKGJ5SWQpLmxlbmd0aCA/IGJ5SWQgOiBudWxsLFxuICB9O1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVhZE9wZW5BSVF1b3RhVXNhZ2UoXG4gIHNvdXJjZTogKCgpID0+IFByb21pc2U8T3BlbkFJUmF0ZUxpbWl0c1dpdGhNZXRhPikgfCBPcGVuQUlRdW90YUh0dHBPcHRpb25zLFxuKTogUHJvbWlzZTxPcGVuQUlRdW90YVVzYWdlUmVzdWx0PiB7XG4gIHRyeSB7XG4gICAgY29uc3QgZGlyZWN0ID0gdHlwZW9mIHNvdXJjZSAhPT0gXCJmdW5jdGlvblwiO1xuICAgIGNvbnN0IHsgZGF0YSwgY2FjaGVkQXQgfSA9IGF3YWl0ICh0eXBlb2Ygc291cmNlID09PSBcImZ1bmN0aW9uXCIgPyBzb3VyY2UoKSA6IHJlYWREaXJlY3Qoc291cmNlKSk7XG4gICAgY29uc3QgcmF0ZUxpbWl0cyA9IGRhdGEucmF0ZUxpbWl0cztcbiAgICBjb25zdCBwcmltYXJ5ID0gcmF0ZUxpbWl0cz8ucHJpbWFyeTtcblxuICAgIGlmIChcbiAgICAgICFwcmltYXJ5IHx8XG4gICAgICB0eXBlb2YgcHJpbWFyeS51c2VkUGVyY2VudCAhPT0gXCJudW1iZXJcIiB8fFxuICAgICAgIU51bWJlci5pc0Zpbml0ZShwcmltYXJ5LnVzZWRQZXJjZW50KVxuICAgICkge1xuICAgICAgcmV0dXJuIHsga2luZDogXCJsb29rdXBfZmFpbGVkXCIsIHJlYXNvbjogXCJwcmltYXJ5IHVzZWRQZXJjZW50IHVuYXZhaWxhYmxlXCIgfTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAga2luZDogXCJva1wiLFxuICAgICAgdXRpbGl6YXRpb25QY3Q6IHByaW1hcnkudXNlZFBlcmNlbnQsXG4gICAgICBjYWNoZUFnZU1zOiBNYXRoLm1heChEYXRlLm5vdygpIC0gY2FjaGVkQXQsIDApLFxuICAgICAgd2luZG93RHVyYXRpb25NaW5zOiBwcmltYXJ5LndpbmRvd0R1cmF0aW9uTWlucyxcbiAgICAgIHJlc2V0c0F0OiBwcmltYXJ5LnJlc2V0c0F0LFxuICAgICAgbGltaXRJZDogcmF0ZUxpbWl0cy5saW1pdElkLFxuICAgICAgLi4uKGRpcmVjdCA/IHsgcmF3OiBkYXRhIH0gOiB7fSksXG4gICAgfTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiB7IGtpbmQ6IFwibG9va3VwX2ZhaWxlZFwiLCByZWFzb246IChlIGFzIEVycm9yKS5tZXNzYWdlIH07XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7QUFJQSxNQUFhLHlCQUF5QjtBQTBCdEMsZUFBZSxXQUFXLFNBQW9FO0NBQzVGLE1BQU0sUUFBUSxpQkFDWCxRQUFRLFNBQVMsTUFBQSxDQUFPLHdCQUF3QjtFQUMvQyxRQUFRO0VBQ1IsU0FBUywwQkFBMEIsWUFBWSxhQUFhLFlBQVksU0FBUztFQUNqRixHQUFJLFFBQVEsU0FBUyxFQUFFLFFBQVEsUUFBUSxPQUFPLElBQUksQ0FBQztDQUNyRCxDQUFDO0NBQ0gsSUFBSSxXQUFXLE1BQU0sS0FBSyxRQUFRLFdBQVc7Q0FDN0MsSUFBSSxTQUFTLFdBQVcsT0FBTyxRQUFRLG9CQUFvQjtFQUN6RCxNQUFNLFNBQVMsTUFBTSxPQUFPO0VBQzVCLFFBQVEsUUFBUSxlQUFlO0VBQy9CLE1BQU0sY0FBYyxNQUFNLFFBQVEsbUJBQW1CO0VBQ3JELFFBQVEsUUFBUSxlQUFlO0VBQy9CLFdBQVcsTUFBTSxLQUFLLFdBQVc7Q0FDbkM7Q0FDQSxJQUFJLENBQUMsU0FBUyxJQUFJLE1BQU0sSUFBSSxNQUFNLG9DQUFvQyxTQUFTLFFBQVE7Q0FHdkYsT0FBTztFQUFFLE1BREksbUJBQW1CLE1BRFosU0FBUyxLQUFLLENBRXpCO0VBQU0sVUFBVSxLQUFLLElBQUk7Q0FBRTtBQUN0QztBQUVBLFNBQVMsV0FBVyxPQUFnQjtDQUNsQyxJQUFJLENBQUMsU0FBUyxPQUFPLFVBQVUsVUFBVSxPQUFPO0NBQ2hELE1BQU0sU0FBUztDQUNmLE1BQU0sY0FBYyxPQUFPLE9BQU8sZUFBZSxPQUFPLFlBQVk7Q0FDcEUsSUFB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
120
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3BlbmFpLXF1b3RhLmpzIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy91dGlscy9wcm92aWRlcnMvb3BlbmFpL29wZW5haS1xdW90YS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyB0eXBlIE9wZW5BSUNyZWRlbnRpYWxzIH0gZnJvbSBcIi4uLy4uLy4uL2FwcGxpY2F0aW9uL3Rva2VuL3Rva2VuLnR5cGVzXCI7XG5pbXBvcnQge1xuICBpc0pzb25PYmplY3QsXG4gIHR5cGUgSnNvbk9iamVjdCxcbiAgdHlwZSBKc29uVmFsdWUsXG4gIGpzb25TdHJpbmcsXG4gIHR5cGUgUXVvdGFSYXRlTGltaXRzLFxuICB0eXBlIFF1b3RhUmF0ZUxpbWl0U25hcHNob3QsXG4gIHR5cGUgUXVvdGFSYXRlTGltaXRXaW5kb3csXG59IGZyb20gXCIuLi9jb21tb24vcHJvdmlkZXItdHlwZXNcIjtcbmltcG9ydCB7IGJ1aWxkQ29kZXhJZGVudGl0eUhlYWRlcnMgfSBmcm9tIFwiLi9vcGVuYWktYmFja2VuZC1wcm90b2NvbFwiO1xuXG5leHBvcnQgY29uc3QgQ0hBVEdQVF9XSEFNX1VTQUdFX1VSTCA9IFwiaHR0cHM6Ly9jaGF0Z3B0LmNvbS9iYWNrZW5kLWFwaS93aGFtL3VzYWdlXCIgYXMgY29uc3Q7XG5cbmV4cG9ydCB0eXBlIE9wZW5BSVJhdGVMaW1pdHNXaXRoTWV0YSA9IHtcbiAgZGF0YTogUXVvdGFSYXRlTGltaXRzO1xuICBjYWNoZWRBdDogbnVtYmVyO1xufTtcblxuZXhwb3J0IHR5cGUgT3BlbkFJUXVvdGFVc2FnZVJlc3VsdCA9XG4gIHwge1xuICAgICAga2luZDogXCJva1wiO1xuICAgICAgdXRpbGl6YXRpb25QY3Q6IG51bWJlcjtcbiAgICAgIGNhY2hlQWdlTXM6IG51bWJlcjtcbiAgICAgIHdpbmRvd0R1cmF0aW9uTWluczogbnVtYmVyIHwgbnVsbDtcbiAgICAgIHJlc2V0c0F0OiBudW1iZXIgfCBudWxsO1xuICAgICAgbGltaXRJZDogc3RyaW5nIHwgbnVsbDtcbiAgICAgIHJhdz86IFF1b3RhUmF0ZUxpbWl0cztcbiAgICB9XG4gIHwgeyBraW5kOiBcImxvb2t1cF9mYWlsZWRcIjsgcmVhc29uOiBzdHJpbmcgfTtcblxuZXhwb3J0IGludGVyZmFjZSBPcGVuQUlRdW90YUh0dHBPcHRpb25zIHtcbiAgY3JlZGVudGlhbHM6IFBpY2s8T3BlbkFJQ3JlZGVudGlhbHMsIFwiYWNjZXNzVG9rZW5cIiB8IFwiYWNjb3VudElkXCI+O1xuICByZWZyZXNoQ3JlZGVudGlhbHM/OiAoKSA9PiBQcm9taXNlPFBpY2s8T3BlbkFJQ3JlZGVudGlhbHMsIFwiYWNjZXNzVG9rZW5cIiB8IFwiYWNjb3VudElkXCI+PjtcbiAgZmV0Y2g/OiB0eXBlb2YgZmV0Y2g7XG4gIHNpZ25hbD86IEFib3J0U2lnbmFsO1xufVxuXG5hc3luYyBmdW5jdGlvbiByZWFkRGlyZWN0KG9wdGlvbnM6IE9wZW5BSVF1b3RhSHR0cE9wdGlvbnMpOiBQcm9taXNlPE9wZW5BSVJhdGVMaW1pdHNXaXRoTWV0YT4ge1xuICBjb25zdCByZWFkID0gKGNyZWRlbnRpYWxzOiBPcGVuQUlRdW90YUh0dHBPcHRpb25zW1wiY3JlZGVudGlhbHNcIl0pID0+XG4gICAgKG9wdGlvbnMuZmV0Y2ggPz8gZmV0Y2gpKENIQVRHUFRfV0hBTV9VU0FHRV9VUkwsIHtcbiAgICAgIG1ldGhvZDogXCJHRVRcIixcbiAgICAgIGhlYWRlcnM6IGJ1aWxkQ29kZXhJZGVudGl0eUhlYWRlcnMoY3JlZGVudGlhbHMuYWNjZXNzVG9rZW4sIGNyZWRlbnRpYWxzLmFjY291bnRJZCksXG4gICAgICBzaWduYWw6IG9wdGlvbnMuc2lnbmFsLFxuICAgIH0pO1xuXG4gIGxldCByZXNwb25zZSA9IGF3YWl0IHJlYWQob3B0aW9ucy5jcmVkZW50aWFscyk7XG5cbiAgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PT0gNDAxICYmIG9wdGlvbnMucmVmcmVzaENyZWRlbnRpYWxzKSB7XG4gICAgYXdhaXQgcmVzcG9uc2UuYm9keT8uY2FuY2VsKCk7XG4gICAgb3B0aW9ucy5zaWduYWw/LnRocm93SWZBYm9ydGVkKCk7XG4gICAgY29uc3QgY3JlZGVudGlhbHMgPSBhd2FpdCBvcHRpb25zLnJlZnJlc2hDcmVkZW50aWFscygpO1xuICAgIG9wdGlvbnMuc2lnbmFsPy50aHJvd0lmQWJvcnRlZCgpO1xuICAgIHJlc3BvbnNlID0gYXdhaXQgcmVhZChjcmVkZW50aWFscyk7XG4gIH1cblxuICBpZiAoIXJlc3BvbnNlLm9rKSB0aHJvdyBuZXcgRXJyb3IoYE9wZW5BSSBxdW90YSBsb29rdXAgZmFpbGVkOiBIVFRQICR7cmVzcG9uc2Uuc3RhdHVzfWApO1xuICAvLyBSZXNwb25zZS5qc29uKCkgcGFyc2VzIEpTT04gdGV4dCwgd2hpY2ggeWllbGRzIG9ubHkgSlNPTiB2YWx1ZXMuXG4gIGNvbnN0IGJvZHk6IEpzb25WYWx1ZSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcbiAgY29uc3QgZGF0YSA9IG5vcm1hbGl6ZVdoYW1Vc2FnZShib2R5KTtcblxuICByZXR1cm4geyBkYXRhLCBjYWNoZWRBdDogRGF0ZS5ub3coKSB9O1xufVxuXG5mdW5jdGlvbiBqc29uT2JqZWN0T3JFbXB0eSh2YWx1ZTogSnNvblZhbHVlIHwgdW5kZWZpbmVkKTogSnNvbk9iamVjdCB7XG4gIHJldHVybiBpc0pzb25PYmplY3QodmFsdWUpID8gdmFsdWUgOiB7fTtcbn1cblxuZnVuY3Rpb24gd2luZG93RnJvbSh2YWx1ZTogSnNvblZhbHVlIHwgdW5kZWZpbmVkKTogUXVvdGFSYXRlTGltaXRXaW5kb3cgfCBudWxsIHtcbiAgaWYgKCFpc0pzb25PYmplY3QodmFsdWUpKSByZXR1cm4gbnVsbDtcbiAgY29uc3Qgc291cmNlID0gdmFsdWU7XG4gIGNvbnN0IHVzZWRQZXJjZW50ID0gTnVtYmVyKHNvdXJjZS51c2VkUGVyY2VudCA/PyBzb3VyY2UudXNlZF9wZXJjZW50KTtcblxuICBpZiAoIU51bWJlci5pc0Zpbml0ZSh1c2VkUGVyY2VudCkpIHJldHVybiBudWxsO1xuICBjb25zdCBkdXJhdGlvbk1pbnMgPSBzb3VyY2Uud2luZG93RHVyYXRpb25NaW5zID8/IHNvdXJjZS53aW5kb3dfbWludXRlcztcbiAgY29uc3QgZHVyYXRpb25TZWNvbmRzID0gc291cmNlLmxpbWl0V2luZG93U2Vjb25kcyA/PyBzb3VyY2UubGltaXRfd2luZG93X3NlY29uZHM7XG4gIGNvbnN0IHJlc2V0cyA9IHNvdXJjZS5yZXNldHNBdCA/PyBzb3VyY2UucmVzZXRfYXQ7XG5cbiAgcmV0dXJuIHtcbiAgICB1c2VkUGVyY2VudCxcbiAgICB3aW5kb3dEdXJhdGlvbk1pbnM6XG4gICAgICBkdXJhdGlvbk1pbnMgIT09IG51bGwgJiYgZHVyYXRpb25NaW5zICE9PSB1bmRlZmluZWRcbiAgICAgICAgPyBOdW1iZXIoZHVyYXRpb25NaW5zKVxuICAgICAgICA6IGR1cmF0aW9uU2Vjb25kcyAhPT0gbnVsbCAmJiBkdXJhdGlvblNlY29uZHMgIT09IHVuZGVmaW5lZFxuICAgICAgICAgID8gTnVtYmVyKGR1cmF0aW9uU2Vjb25kcykgLyA2MFxuICAgICAgICAgIDogbnVsbCxcbiAgICByZXNldHNBdDogcmVzZXRzID09PSBudWxsIHx8IHJlc2V0cyA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IE51bWJlcihyZXNldHMpLFxuICB9O1xufVxuXG5mdW5jdGlvbiBzbmFwc2hvdEZyb20odmFsdWU6IEpzb25WYWx1ZSB8IHVuZGVmaW5lZCk6IFF1b3RhUmF0ZUxpbWl0U25hcHNob3Qge1xuICBjb25zdCBzb3VyY2UgPSBqc29uT2JqZWN0T3JFbXB0eSh2YWx1ZSk7XG5cbiAgcmV0dXJuIHtcbiAgICBsaW1pdElkOiBqc29uU3RyaW5nKHNvdXJjZS5saW1pdElkID8/IHNvdXJjZS5saW1pdF9pZCkgPz8gbnVsbCxcbiAgICBsaW1pdE5hbWU6IGpzb25TdHJpbmcoc291cmNlLmxpbWl0TmFtZSA/PyBzb3VyY2UubGltaXRfbmFtZSkgPz8gbnVsbCxcbiAgICBwcmltYXJ5OiB3aW5kb3dGcm9tKHNvdXJjZS5wcmltYXJ5ID8/IHNvdXJjZS5wcmltYXJ5X3dpbmRvdyksXG4gICAgc2Vjb25kYXJ5OiB3aW5kb3dGcm9tKHNvdXJjZS5zZWNvbmRhcnkgPz8gc291cmNlLnNlY29uZGFyeV93aW5kb3cpLFxuICAgIGNyZWRpdHM6IHNvdXJjZS5jcmVkaXRzID8/IG51bGwsXG4gICAgcGxhblR5cGU6IGpzb25TdHJpbmcoc291cmNlLnBsYW5UeXBlID8/IHNvdXJjZS5wbGFuX3R5cGUpID8/IG51bGwsXG4gICAgcmF0ZUxpbWl0UmVhY2hlZFR5cGU6XG4gICAgICBqc29uU3RyaW5nKHNvdXJjZS5yYXRlTGltaXRSZWFjaGVkVHlwZSA/PyBzb3VyY2UucmF0ZV9saW1pdF9yZWFjaGVkKSA/PyBudWxsLFxuICB9O1xufVxuXG4vKiogTm9ybWFsaXplcyBzbmFwc2hvdHMgdGhhdCBhbHJlYWR5IHVzZSB0aGUgYXBwLXNlcnZlciAoY2FtZWxDYXNlKSBzaGFwZS4gKi9cbmZ1bmN0aW9uIG5vcm1hbGl6ZUFwcFNlcnZlclVzYWdlKGJvZHk6IEpzb25PYmplY3QpOiBRdW90YVJhdGVMaW1pdHMge1xuICBjb25zdCBieUlkID0gaXNKc29uT2JqZWN0KGJvZHkucmF0ZUxpbWl0c0J5TGltaXRJZClcbiAgICA/IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgICAgT2JqZWN0LmVudHJpZXMoYm9keS5yYXRlTGltaXRzQnlMaW1pdElkKS5tYXAoKFtpZCwgc25hcHNob3RdKSA9PiBbXG4gICAgICAgICAgaWQsXG4gICAgICAgICAgc25hcHNob3RGcm9tKHNuYXBzaG90KSxcbiAgICAgICAgXSksXG4gICAgICApXG4gICAgOiBudWxsO1xuXG4gIHJldHVybiB7IHJhdGVMaW1pdHM6IHNuYXBzaG90RnJvbShib2R5LnJhdGVMaW1pdHMpLCByYXRlTGltaXRzQnlMaW1pdElkOiBieUlkIH07XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZVdoYW1Vc2FnZSh2YWx1ZTogSnNvblZhbHVlKTogUXVvdGFSYXRlTGltaXRzIHtcbiAgY29uc3QgYm9keSA9IGpzb25PYmplY3RPckVtcHR5KHZhbHVlKTtcblxuICBpZiAoaXNKc29uT2JqZWN0KGJvZHkucmF0ZUxpbWl0cykpIHJldHVybiBub3JtYWxpemVBcHBTZXJ2ZXJVc2FnZShib2R5KTtcblxuICBjb25zdCBjb250YWluZXIgPSBpc0pzb25PYmplY3QoYm9keS5yYXRlX2xpbWl0cykgPyBib2R5LnJhdGVfbGltaXRzIDogYm9keTtcblxuICBjb25zdCBzaGFyZWQ6IEpzb25PYmplY3QgPSB7XG4gICAgcGxhbl90eXBlOiBib2R5LnBsYW5fdHlwZSA/PyBjb250YWluZXIucGxhbl90eXBlLFxuICAgIGNyZWRpdHM6IGJvZHkuY3JlZGl0cyA/PyBjb250YWluZXIuY3JlZGl0cyxcbiAgICByYXRlX2xpbWl0X3JlYWNoZWQ6IGJvZHkucmF0ZV9saW1pdF9yZWFjaGVkID8/IGNvbnRhaW5lci5yYXRlX2xpbWl0X3JlYWNoZWQsXG4gIH07XG5cbiAgY29uc3QgcHJpbWFyeSA9IHNuYXBzaG90RnJvbSh7XG4gICAgLi4uc2hhcmVkLFxuICAgIC4uLmpzb25PYmplY3RPckVtcHR5KGNvbnRhaW5lci5yYXRlX2xpbWl0ID8/IGNvbnRhaW5lciksXG4gIH0pO1xuXG4gIGNvbnN0IGFkZGl0aW9uYWwgPSBBcnJheS5pc0FycmF5KGNvbnRhaW5lci5hZGRpdGlvbmFsX3JhdGVfbGltaXRzKVxuICAgID8gY29udGFpbmVyLmFkZGl0aW9uYWxfcmF0ZV9saW1pdHNcbiAgICA6IEFycmF5LmlzQXJyYXkoYm9keS5hZGRpdGlvbmFsX3JhdGVfbGltaXRzKVxuICAgICAgPyBib2R5LmFkZGl0aW9uYWxfcmF0ZV9saW1pdHNcbiAgICAgIDogW107XG5cbiAgY29uc3QgYnlJZCA9IG5ldyBNYXA8c3RyaW5nLCBRdW90YVJhdGVMaW1pdFNuYXBzaG90PigpO1xuXG4gIGZvciAoY29uc3QgZW50cnkgb2YgYWRkaXRpb25hbCkge1xuICAgIGlmICghaXNKc29uT2JqZWN0KGVudHJ5KSkgY29udGludWU7XG5cbiAgICBjb25zdCBzbmFwc2hvdCA9IHNuYXBzaG90RnJvbSh7XG4gICAgICAuLi5zaGFyZWQsXG4gICAgICAuLi5qc29uT2JqZWN0T3JFbXB0eShlbnRyeS5yYXRlX2xpbWl0ID8/IGVudHJ5KSxcbiAgICB9KTtcblxuICAgIGlmIChzbmFwc2hvdC5saW1pdElkKSBieUlkLnNldChzbmFwc2hvdC5saW1pdElkLCBzbmFwc2hvdCk7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHJhdGVMaW1pdHM6IHByaW1hcnksXG4gICAgcmF0ZUxpbWl0c0J5TGltaXRJZDogYnlJZC5zaXplID8gT2JqZWN0LmZyb21FbnRyaWVzKGJ5SWQpIDogbnVsbCxcbiAgfTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlYWRPcGVuQUlRdW90YVVzYWdlKFxuICBzb3VyY2U6ICgoKSA9PiBQcm9taXNlPE9wZW5BSVJhdGVMaW1pdHNXaXRoTWV0YT4pIHwgT3BlbkFJUXVvdGFIdHRwT3B0aW9ucyxcbik6IFByb21pc2U8T3BlbkFJUXVvdGFVc2FnZVJlc3VsdD4ge1xuICB0cnkge1xuICAgIGNvbnN0IGRpcmVjdCA9IFwiY3JlZGVudGlhbHNcIiBpbiBzb3VyY2U7XG4gICAgY29uc3QgeyBkYXRhLCBjYWNoZWRBdCB9ID0gYXdhaXQgKFwiY3JlZGVudGlhbHNcIiBpbiBzb3VyY2UgPyByZWFkRGlyZWN0KHNvdXJjZSkgOiBzb3VyY2UoKSk7XG4gICAgY29uc3QgcmF0ZUxpbWl0cyA9IGRhdGEucmF0ZUxpbWl0cztcbiAgICBjb25zdCBwcmltYXJ5ID0gcmF0ZUxpbWl0cz8ucHJpbWFyeTtcblxuICAgIGlmICghcHJpbWFyeSB8fCAhTnVtYmVyLmlzRmluaXRlKHByaW1hcnkudXNlZFBlcmNlbnQpKSB7XG4gICAgICByZXR1cm4geyBraW5kOiBcImxvb2t1cF9mYWlsZWRcIiwgcmVhc29uOiBcInByaW1hcnkgdXNlZFBlcmNlbnQgdW5hdmFpbGFibGVcIiB9O1xuICAgIH1cblxuICAgIGNvbnN0IHJlc3VsdDogT3BlbkFJUXVvdGFVc2FnZVJlc3VsdCA9IHtcbiAgICAgIGtpbmQ6IFwib2tcIixcbiAgICAgIHV0aWxpemF0aW9uUGN0OiBwcmltYXJ5LnVzZWRQZXJjZW50LFxuICAgICAgY2FjaGVBZ2VNczogTWF0aC5tYXgoRGF0ZS5ub3coKSAtIGNhY2hlZEF0LCAwKSxcbiAgICAgIHdpbmRvd0R1cmF0aW9uTWluczogcHJpbWFyeS53aW5kb3dEdXJhdGlvbk1pbnMsXG4gICAgICByZXNldHNBdDogcHJpbWFyeS5yZXNldHNBdCxcbiAgICAgIGxpbWl0SWQ6IHJhdGVMaW1pdHMubGltaXRJZCxcbiAgICB9O1xuXG4gICAgaWYgKGRpcmVjdCkgcmVzdWx0LnJhdyA9IGRhdGE7XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9IGNhdGNoIChlKSB7XG4gICAgcmV0dXJuIHsga2luZDogXCJsb29rdXBfZmFpbGVkXCIsIHJlYXNvbjogZSBpbnN0YW5jZW9mIEVycm9yID8gZS5tZXNzYWdlIDogU3RyaW5nKGUpIH07XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7O0FBWUEsTUFBYSx5QkFBeUI7QUEwQnRDLGVBQWUsV0FBVyxTQUFvRTtDQUM1RixNQUFNLFFBQVEsaUJBQ1gsUUFBUSxTQUFTLE1BQUEsQ0FBTyx3QkFBd0I7RUFDL0MsUUFBUTtFQUNSLFNBQVMsMEJBQTBCLFlBQVksYUFBYSxZQUFZLFNBQVM7RUFDakYsUUFBUSxRQUFRO0NBQ2xCLENBQUM7Q0FFSCxJQUFJLFdBQVcsTUFBTSxLQUFLLFFBQVEsV0FBVztDQUU3QyxJQUFJLFNBQVMsV0FBVyxPQUFPLFFBQVEsb0JBQW9CO0VBQ3pELE1BQU0sU0FBUyxNQUFNLE9BQU87RUFDNUIsUUFBUSxRQUFRLGVBQWU7RUFDL0IsTUFBTSxjQUFjLE1BQU0sUUFBUSxtQkFBbUI7RUFDckQsUUFBUSxRQUFRLGVBQWU7RUFDL0IsV0FBVyxNQUFNLEtBQUssV0FBVztDQUNuQztDQUVBLElBQUksQ0FBQyxTQUFTLElBQUksTUFBTSxJQUFJLE1BQU0sb0NBQW9DLFNBQVMsUUFBUTtD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