@cartanova/qgrid-cli 2.10.10 → 2.11.0

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 (313) 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-BA7uQ-6c.js +31 -0
  204. package/bundle/web-dist/client/assets/index-Be2qCZmI.css +1 -0
  205. package/bundle/web-dist/client/assets/logs-C47OJGEI.js +1 -0
  206. package/bundle/web-dist/client/assets/monit-BS9no0dU.js +4 -0
  207. package/bundle/web-dist/client/assets/plus-sdACTfH0.js +1 -0
  208. package/bundle/web-dist/client/assets/refresh-cw-CY8o_1cT.js +1 -0
  209. package/bundle/web-dist/client/assets/request-model-BRtFuZvj.js +1 -0
  210. package/bundle/web-dist/client/assets/routes-kqgkUxE8.js +5 -0
  211. package/bundle/web-dist/client/assets/{services.generated-NP-ValHd.js → services.generated-CefiDXEv.js} +5 -5
  212. package/bundle/web-dist/client/assets/settings-DNDvFGSw.js +1 -0
  213. package/bundle/web-dist/client/assets/show-u8Np69q3.js +2 -0
  214. package/bundle/web-dist/client/assets/tokens-QvP410NW.js +1 -0
  215. package/bundle/web-dist/client/assets/total-cost-MnfKU8IN.js +1 -0
  216. package/bundle/web-dist/client/assets/use-oauth-login-flow-Bzdh28Ws.js +1 -0
  217. package/bundle/web-dist/client/assets/use-update-token-mutation-CfJKaxmR.js +1 -0
  218. package/bundle/web-dist/client/assets/vendor-react-CUFFrVN9.js +244 -0
  219. package/bundle/web-dist/client/assets/vendor-tanstack-Bf_jag9G.js +1 -0
  220. package/bundle/web-dist/client/index.html +6 -6
  221. package/bundle/web-dist/server/assets/clsx-D_N5PN_2.js +16 -0
  222. package/bundle/web-dist/server/assets/{lazyRouteComponent-CgBdabgd.js → lazyRouteComponent-D8iTIHyn.js} +129 -2
  223. package/bundle/web-dist/server/assets/logs-B3OTd9hy.js +825 -0
  224. package/bundle/web-dist/server/assets/{monit-ZPt66W5M.js → monit-B2hqorPe.js} +385 -126
  225. package/bundle/web-dist/server/assets/plus-DwG7h9kq.js +28 -0
  226. package/bundle/web-dist/server/assets/{react-dom-Ds75e4Jl.js → react-dom-BIYQzBqG.js} +2 -129
  227. package/bundle/web-dist/server/assets/refresh-cw-mMBkwOq0.js +44 -0
  228. package/bundle/web-dist/server/assets/{request-model-DjGldb-h.js → request-model-I6OdODSH.js} +15 -6
  229. package/bundle/web-dist/server/assets/{routes-Ct-k7nBA.js → routes-B95YlUv2.js} +760 -213
  230. package/bundle/web-dist/server/assets/{services.generated-BA4AcAf5.js → services.generated-DQATJ6qf.js} +12820 -12194
  231. package/bundle/web-dist/server/assets/settings-C3gbGk0m.js +830 -0
  232. package/bundle/web-dist/server/assets/{show-LSFIzvO2.js → show-Bxaj3rhH.js} +1350 -418
  233. package/bundle/web-dist/server/assets/tokens-CZjH3cB7.js +1038 -0
  234. package/bundle/web-dist/server/assets/total-cost-fTE9Xy82.js +18 -0
  235. package/bundle/web-dist/server/assets/use-oauth-login-flow-CKDHgc3U.js +2379 -0
  236. package/bundle/web-dist/server/assets/{use-update-token-mutation-pkArIzCP.js → use-update-token-mutation-BEbgOzaa.js} +1 -1
  237. package/bundle/web-dist/server/entry-server.generated.js +4295 -22810
  238. package/dist/cli.js +9 -9
  239. package/package.json +4 -11
  240. package/postinstall.mjs +12 -0
  241. package/skills/qgrid/SKILL.md +1 -0
  242. package/skills/qgrid/references/cli-env-and-server-boot.md +4 -1
  243. package/skills/qgrid/references/decision-rationale.md +23 -0
  244. package/skills/qgrid/references/grok-runtime.md +89 -0
  245. package/skills/qgrid/references/provider-runtime-differences.md +30 -29
  246. package/skills/qgrid/references/repo-map.md +10 -0
  247. package/skills/qgrid/references/token-auth-quota-lifecycle.md +56 -3
  248. package/bundle/dist/node_modules/.pnpm/@jridgewell_sourcemap-codec@1.5.5/node_modules/@jridgewell/sourcemap-codec/dist/sourcemap-codec.js +0 -406
  249. package/bundle/dist/node_modules/.pnpm/@vitest_expect@4.1.10/node_modules/@vitest/expect/dist/index.js +0 -1507
  250. package/bundle/dist/node_modules/.pnpm/@vitest_pretty-format@4.1.10/node_modules/@vitest/pretty-format/dist/index.js +0 -887
  251. package/bundle/dist/node_modules/.pnpm/@vitest_runner@4.1.10/node_modules/@vitest/runner/dist/chunk-artifact.js +0 -2756
  252. package/bundle/dist/node_modules/.pnpm/@vitest_runner@4.1.10/node_modules/@vitest/runner/dist/index.js +0 -8
  253. package/bundle/dist/node_modules/.pnpm/@vitest_runner@4.1.10/node_modules/@vitest/runner/dist/utils.js +0 -8
  254. package/bundle/dist/node_modules/.pnpm/@vitest_snapshot@4.1.10/node_modules/@vitest/snapshot/dist/index.js +0 -922
  255. package/bundle/dist/node_modules/.pnpm/@vitest_spy@4.1.10/node_modules/@vitest/spy/dist/index.js +0 -386
  256. package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.10/node_modules/@vitest/utils/dist/chunk-pathe.M-eThtNZ.js +0 -121
  257. package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.10/node_modules/@vitest/utils/dist/constants.js +0 -51
  258. package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.10/node_modules/@vitest/utils/dist/diff.js +0 -1317
  259. package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.10/node_modules/@vitest/utils/dist/display.js +0 -561
  260. package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.10/node_modules/@vitest/utils/dist/error.js +0 -40
  261. package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.10/node_modules/@vitest/utils/dist/helpers.js +0 -272
  262. package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.10/node_modules/@vitest/utils/dist/offset.js +0 -27
  263. package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.10/node_modules/@vitest/utils/dist/serialize.js +0 -77
  264. package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.10/node_modules/@vitest/utils/dist/source-map.js +0 -381
  265. package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.10/node_modules/@vitest/utils/dist/timers.js +0 -51
  266. package/bundle/dist/node_modules/.pnpm/chai@6.2.2/node_modules/chai/index.js +0 -2986
  267. package/bundle/dist/node_modules/.pnpm/expect-type@1.3.0/node_modules/expect-type/dist/branding.js +0 -10
  268. package/bundle/dist/node_modules/.pnpm/expect-type@1.3.0/node_modules/expect-type/dist/index.js +0 -109
  269. package/bundle/dist/node_modules/.pnpm/expect-type@1.3.0/node_modules/expect-type/dist/messages.js +0 -10
  270. package/bundle/dist/node_modules/.pnpm/expect-type@1.3.0/node_modules/expect-type/dist/overloads.js +0 -10
  271. package/bundle/dist/node_modules/.pnpm/expect-type@1.3.0/node_modules/expect-type/dist/utils.js +0 -10
  272. package/bundle/dist/node_modules/.pnpm/magic-string@0.30.21/node_modules/magic-string/dist/magic-string.es.js +0 -1126
  273. package/bundle/dist/node_modules/.pnpm/pathe@2.0.3/node_modules/pathe/dist/index.js +0 -21
  274. package/bundle/dist/node_modules/.pnpm/pathe@2.0.3/node_modules/pathe/dist/shared/pathe.M-eThtNZ.js +0 -432
  275. package/bundle/dist/node_modules/.pnpm/tinybench@2.9.0/node_modules/tinybench/dist/index.js +0 -517
  276. package/bundle/dist/node_modules/.pnpm/tinyrainbow@3.1.0/node_modules/tinyrainbow/dist/index.js +0 -101
  277. 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
  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/_commonjsHelpers.D26ty3Ew.js +0 -9
  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/benchmark.CX_oY03V.js +0 -41
  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/evaluatedModules.Dg1zASAC.js +0 -19
  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/index.Chj8NDwU.js +0 -202
  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/chunks/index.DdgEv5B1.js +0 -46
  283. 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
  284. 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
  285. 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
  286. 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
  287. package/bundle/dist/testing/setup-mocks.js +0 -16
  288. package/bundle/src/testing/setup-mocks.ts +0 -44
  289. package/bundle/web-dist/client/assets/index-Bw2s88Ot.css +0 -1
  290. package/bundle/web-dist/client/assets/index-DZwzUfI-.js +0 -106
  291. package/bundle/web-dist/client/assets/logs-Cog79DU5.js +0 -1
  292. package/bundle/web-dist/client/assets/monit-2auznBys.js +0 -1
  293. package/bundle/web-dist/client/assets/plus-B62CuqT8.js +0 -1
  294. package/bundle/web-dist/client/assets/refresh-cw-NNcU0Cmq.js +0 -1
  295. package/bundle/web-dist/client/assets/request-model-CojtinqK.js +0 -1
  296. package/bundle/web-dist/client/assets/routes-B0lTeLK-.js +0 -5
  297. package/bundle/web-dist/client/assets/settings-D8ZxZGSJ.js +0 -1
  298. package/bundle/web-dist/client/assets/show-CFSERlnM.js +0 -2
  299. package/bundle/web-dist/client/assets/tokens-CZXUyI7O.js +0 -1
  300. package/bundle/web-dist/client/assets/use-oauth-login-flow-hboOs3wG.js +0 -1
  301. package/bundle/web-dist/client/assets/use-update-token-mutation-BQHS0byG.js +0 -1
  302. package/bundle/web-dist/client/assets/vendor-react-DH4kUfK2.js +0 -9
  303. package/bundle/web-dist/client/assets/vendor-tanstack-DJRQAbrY.js +0 -1
  304. package/bundle/web-dist/server/assets/logs-BMyR98rU.js +0 -509
  305. package/bundle/web-dist/server/assets/plus-BZ9I0VgC.js +0 -19
  306. package/bundle/web-dist/server/assets/refresh-cw-CztCFis-.js +0 -23
  307. package/bundle/web-dist/server/assets/settings-CBUZ47Xx.js +0 -461
  308. package/bundle/web-dist/server/assets/tokens-DxrBW512.js +0 -448
  309. package/bundle/web-dist/server/assets/use-oauth-login-flow-Gn8flMK5.js +0 -178
  310. package/dist/cli.d.ts +0 -10
  311. /package/bundle/web-dist/client/assets/{cost-DH2jZbrw.js → cost-DB3HbU7T.js} +0 -0
  312. /package/bundle/web-dist/client/assets/{preload-helper-ca-nBW7U.js → preload-helper-DWTEM3RW.js} +0 -0
  313. /package/bundle/web-dist/server/assets/{cost-eEHeTRT5.js → cost-BC9yzyA9.js} +0 -0
@@ -1,6 +1,6 @@
1
+ import { z } from "zod";
1
2
  import { Buffer } from "node:buffer";
2
3
  import { getLogger } from "@logtape/logtape";
3
- import { z } from "zod";
4
4
  //#region src/application/qgrid/tool-emulation.ts
5
5
  const STRUCTURED_ENVELOPE_LIMITS = {
6
6
  maxUtf8Bytes: 512 * 1024,
@@ -36,8 +36,9 @@ function applyToolCallEmulation(result, tools, options) {
36
36
  if (!tools?.length) return answerOutput(result, result.text, images, runContext);
37
37
  const parsed = parseEnvelope(result.text, tools, answerKind);
38
38
  if (parsed.action === "tool_call") return toolCallOutput(result, parsed.toolCalls, images, runContext);
39
- return answerOutput(result, answerKind === "text" ? parsed.answer : JSON.stringify(parsed.answer), images, runContext);
39
+ return answerOutput(result, answerKind === "text" ? z.string().parse(parsed.answer) : JSON.stringify(parsed.answer), images, runContext);
40
40
  }
41
+ const commentaryToolCallControl = z.looseObject({ result: z.looseObject({ action: z.literal("tool_call") }) });
41
42
  function isToolCallEnvelope(text, tools, answerKind, phase) {
42
43
  if (phase === "commentary") {
43
44
  let value;
@@ -46,7 +47,7 @@ function isToolCallEnvelope(text, tools, answerKind, phase) {
46
47
  } catch {
47
48
  return false;
48
49
  }
49
- if (!value || typeof value !== "object" || !("result" in value) || !value.result || typeof value.result !== "object" || !("action" in value.result) || value.result.action !== "tool_call") return false;
50
+ if (!commentaryToolCallControl.safeParse(value).success) return false;
50
51
  }
51
52
  return parseEnvelope(text, tools, answerKind).action === "tool_call";
52
53
  }
@@ -57,8 +58,8 @@ function parseEnvelope(text, tools, answerKind) {
57
58
  value = JSON.parse(text);
58
59
  } catch (error) {
59
60
  const head = JSON.stringify(text.slice(0, 200));
60
- logger.warn(`tool envelope parse failed: ${error.message}; head=${head}`);
61
- throw new ToolCallEmulationError(`invalid tool envelope (response is not JSON — the model ignored the envelope contract; retry is the caller's decision): ${error.message}; response head: ${head}`);
61
+ logger.warn(`tool envelope parse failed: ${error instanceof Error ? error.message : String(error)}; head=${head}`);
62
+ throw new ToolCallEmulationError(`invalid tool envelope (response is not JSON — the model ignored the envelope contract; retry is the caller's decision): ${error instanceof Error ? error.message : String(error)}; response head: ${head}`);
62
63
  }
63
64
  assertStructuredEnvelopeComplexity(value);
64
65
  const validation = (answerKind === "text" ? TEXT_ENVELOPE : JSON_ENVELOPE).safeParse(value);
@@ -108,13 +109,16 @@ function findUnknownTool(toolCalls, tools) {
108
109
  }
109
110
  function appendImages(content, images) {
110
111
  if (!images?.length) return content;
111
- return [...content, ...images.map((image) => ({
112
- type: "image",
113
- data: image.data,
114
- ...image.mediaType ? { mediaType: image.mediaType } : {},
115
- revisedPrompt: image.revisedPrompt ?? null,
116
- ...image.generation ? { generation: image.generation } : {}
117
- }))];
112
+ return [...content, ...images.map((image) => {
113
+ const part = {
114
+ type: "image",
115
+ data: image.data,
116
+ revisedPrompt: image.revisedPrompt ?? null
117
+ };
118
+ if (image.mediaType) part.mediaType = image.mediaType;
119
+ if (image.generation) part.generation = image.generation;
120
+ return part;
121
+ })];
118
122
  }
119
123
  function assertStructuredEnvelopeComplexity(root) {
120
124
  const maxDepth = STRUCTURED_ENVELOPE_LIMITS.maxDepth;
@@ -128,8 +132,8 @@ function assertStructuredEnvelopeComplexity(root) {
128
132
  nodes += 1;
129
133
  if (nodes > STRUCTURED_ENVELOPE_LIMITS.maxNodes) throw new ToolCallEmulationError(`structured-output envelope exceeds node limit of ${STRUCTURED_ENVELOPE_LIMITS.maxNodes}`);
130
134
  if (current.depth > maxDepth) throw new ToolCallEmulationError(`structured-output envelope exceeds depth limit of ${maxDepth}`);
131
- if (typeof current.value === "number" && !Number.isFinite(current.value)) throw new ToolCallEmulationError("answer must be valid JSON");
132
- if (current.value === null || typeof current.value !== "object") continue;
135
+ if (current.value === Infinity || current.value === -Infinity) throw new ToolCallEmulationError("answer must be valid JSON");
136
+ if (!(current.value instanceof Object)) continue;
133
137
  for (const value of Object.values(current.value)) stack.push({
134
138
  value,
135
139
  depth: current.depth + 1
@@ -139,4 +143,4 @@ function assertStructuredEnvelopeComplexity(root) {
139
143
  //#endregion
140
144
  export { ToolCallEmulationError, applyToolCallEmulation, isToolCallEnvelope };
141
145
 
142
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9vbC1lbXVsYXRpb24uanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2FwcGxpY2F0aW9uL3FncmlkL3Rvb2wtZW11bGF0aW9uLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEJ1ZmZlciB9IGZyb20gXCJub2RlOmJ1ZmZlclwiO1xuXG5pbXBvcnQgeyBnZXRMb2dnZXIgfSBmcm9tIFwiQGxvZ3RhcGUvbG9ndGFwZVwiO1xuaW1wb3J0IHsgeiB9IGZyb20gXCJ6b2RcIjtcblxuLy8g7J2R64u1KOuqqOuNuCDstpzroKUpIGVudmVsb3BlIOydmCDsnpDsm5Ag7ZWc64+ELiBjYWxsZXIg7Iqk7YKk66eIIOyghOyymOumrCDtlZzrj4QoQ0FMTEVSX1NDSEVNQV9MSU1JVFMp7JmAIOqwkuydtFxuLy8g6rCZ7JWEIOuztOyXrOuPhCDshJzroZwg64uk66W4IOyekOybkOydhCDsp4DtgqTripQg64+F66a9IOyDgeyImOuLpCDigJQg7Iqk7YKk66eIIOq5iuydtOuKlCDsnbjsiqTthLTsiqQg6rmK7J2066W8IGJvdW5kIO2VmOyngFxuLy8g7JWK7Jy866+A66GcKOyerOq3gCAkcmVmIO2XiOyaqSkg7LqY65+sIO2VnOuPhOulvCDsobDsoJXtlbTrj4Qg7J2R64u1IOyImOyaqSDquLDspIDsnbQg65Sw6528IOybgOyngeyXrOyEoCDslYgg65Cc64ukLlxuY29uc3QgU1RSVUNUVVJFRF9FTlZFTE9QRV9MSU1JVFMgPSB7XG4gIG1heFV0ZjhCeXRlczogNTEyICogMTAyNCxcbiAgbWF4Tm9kZXM6IDIwXzAwMCxcbiAgbWF4RGVwdGg6IDEzMixcbn0gYXMgY29uc3Q7XG5pbXBvcnQge1xuICB0eXBlIEltYWdlR2VuZXJhdGlvbk1ldGFkYXRhLFxuICB0eXBlIFFncmlkQ29udGVudCxcbiAgdHlwZSBRZ3JpZFRocmVhZENvb3JkLFxuICB0eXBlIFFncmlkVG9vbCxcbiAgdHlwZSBRdWVyeU91dHB1dCxcbn0gZnJvbSBcIi4vcWdyaWQudHlwZXNcIjtcblxuY29uc3QgbG9nZ2VyID0gZ2V0TG9nZ2VyKFtcInFncmlkXCIsIFwidG9vbC1lbXVsYXRpb25cIl0pO1xuXG50eXBlIEVtdWxhdGlvblJlc3VsdCA9IE9taXQ8UXVlcnlPdXRwdXQsIFwiY29udGVudFwiIHwgXCJmaW5pc2hSZWFzb25cIiB8IFwicnVuQ29udGV4dFwiPjtcbnR5cGUgVG9vbENhbGwgPSB7IHRvb2xOYW1lOiBzdHJpbmc7IGFyZ3M6IHN0cmluZyB9O1xuXG4vLyBlbnZlbG9wZSDripQge3Jlc3VsdDogPHVuaW9uPn0g7ZWcIOqyuSDqtazsobAg4oCUIOyKpO2CpOuniCDqt7zqsbDripQgdG9vbC1lbXVsYXRpb24tc2NoZW1hLnRzIOywuOyhsC5cbi8vIGFuc3dlciDtg4DsnoXrp4wg7JqU7LKtIO2Yle2DnOyXkCDrlLDrnbwg64uk66W064ukOiB0b29scy1vbmx5IOuKlCBzdHJpbmco6re464yA66GcIOuwmO2ZmCksXG4vLyB0b29scytqc29uU2NoZW1hIOuKlCDsgqzsmqnsnpAg7Iqk7YKk66eI7J2YIEpTT04g6rCSKEpTT04uc3RyaW5naWZ5IOuhnCDrsJjtmZgpLlxuZnVuY3Rpb24gYnVpbGRFbnZlbG9wZVNjaGVtYShhbnN3ZXJLaW5kOiBBbnN3ZXJLaW5kKSB7XG4gIHJldHVybiB6LnN0cmljdE9iamVjdCh7XG4gICAgcmVzdWx0OiB6LmRpc2NyaW1pbmF0ZWRVbmlvbihcImFjdGlvblwiLCBbXG4gICAgICB6LnN0cmljdE9iamVjdCh7XG4gICAgICAgIGFjdGlvbjogei5saXRlcmFsKFwiYW5zd2VyXCIpLFxuICAgICAgICBhbnN3ZXI6XG4gICAgICAgICAgYW5zd2VyS2luZCA9PT0gXCJ0ZXh0XCJcbiAgICAgICAgICAgID8gei5zdHJpbmcoKVxuICAgICAgICAgICAgOiB6Lmpzb24oKS5yZWZpbmUoKGFuc3dlcikgPT4gYW5zd2VyICE9PSBudWxsLCB7XG4gICAgICAgICAgICAgICAgbWVzc2FnZTogXCJhbnN3ZXIgbXVzdCBiZSBub24tbnVsbFwiLFxuICAgICAgICAgICAgICB9KSxcbiAgICAgICAgdG9vbENhbGxzOiB6Lm51bGwoKSxcbiAgICAgIH0pLFxuICAgICAgei5zdHJpY3RPYmplY3Qoe1xuICAgICAgICBhY3Rpb246IHoubGl0ZXJhbChcInRvb2xfY2FsbFwiKSxcbiAgICAgICAgYW5zd2VyOiB6Lm51bGwoKSxcbiAgICAgICAgdG9vbENhbGxzOiB6XG4gICAgICAgICAgLmFycmF5KFxuICAgICAgICAgICAgei5zdHJpY3RPYmplY3Qoe1xuICAgICAgICAgICAgICB0b29sTmFtZTogei5zdHJpbmcoKSxcbiAgICAgICAgICAgICAgYXJnczogei5zdHJpbmcoKSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgIClcbiAgICAgICAgICAubWluKDEpLFxuICAgICAgfSksXG4gICAgXSksXG4gIH0pO1xufVxuXG5jb25zdCBURVhUX0VOVkVMT1BFID0gYnVpbGRFbnZlbG9wZVNjaGVtYShcInRleHRcIik7XG5jb25zdCBKU09OX0VOVkVMT1BFID0gYnVpbGRFbnZlbG9wZVNjaGVtYShcImpzb25cIik7XG50eXBlIEVudmVsb3BlUmVzcG9uc2UgPSB6LmluZmVyPHR5cGVvZiBKU09OX0VOVkVMT1BFPltcInJlc3VsdFwiXTtcblxuZXhwb3J0IGNsYXNzIFRvb2xDYWxsRW11bGF0aW9uRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZykge1xuICAgIHN1cGVyKGB0b29sLWNhbGwgZW11bGF0aW9uOiAke21lc3NhZ2V9YCk7XG4gICAgdGhpcy5uYW1lID0gXCJUb29sQ2FsbEVtdWxhdGlvbkVycm9yXCI7XG4gIH1cbn1cblxuLy8gUHJlc2VydmUgaW1hZ2UgYnl0ZXMgYW5kIHRoZSBwcm92aWRlcidzIHJlc29sdmVkIE1JTUUgdHlwZS5cbmludGVyZmFjZSBFbXVsYXRpb25JbWFnZSB7XG4gIGRhdGE6IHN0cmluZztcbiAgbWVkaWFUeXBlPzogRXh0cmFjdDxRZ3JpZENvbnRlbnQsIHsgdHlwZTogXCJpbWFnZVwiIH0+W1wibWVkaWFUeXBlXCJdO1xuICByZXZpc2VkUHJvbXB0Pzogc3RyaW5nIHwgbnVsbDtcbiAgZ2VuZXJhdGlvbj86IEltYWdlR2VuZXJhdGlvbk1ldGFkYXRhO1xufVxuXG4vLyBhbnN3ZXIg7J247L2U65SpIOyiheulmC4gZW52ZWxvcGUg65SU7L2U642U64qUIO2VnCDrsozsnbTqs6Ag7J20IOqwkuydgCBhbnN3ZXIg67iM656c7LmY7J2YIO2DgOyeheqzvFxuLy8g7LWc7KKFIOyngeugrO2ZlCh0ZXh0OiDqt7jrjIDroZwgLyBqc29uOiBKU09OLnN0cmluZ2lmeSnrp4wg6rCA66W464ukLlxuZXhwb3J0IHR5cGUgQW5zd2VyS2luZCA9IFwidGV4dFwiIHwgXCJqc29uXCI7XG5cbmludGVyZmFjZSBUb29sQ2FsbEVtdWxhdGlvbk9wdGlvbnMge1xuICB0aHJlYWRDb29yZD86IFFncmlkVGhyZWFkQ29vcmQ7XG4gIGltYWdlcz86IEVtdWxhdGlvbkltYWdlW107XG4gIC8vIO2VhOyImDog7Zi47Lac67aA6rCAIGFuc3dlciDsnbjsvZTrlKnsnYQg7ZWt7IOBIOuqheyLnO2VtOyVvCDtlZzri6QgKGlucHV0Lmpzb25TY2hlbWEg7Jyg66y066GcIO2MkOyglSkuXG4gIGFuc3dlcktpbmQ6IEFuc3dlcktpbmQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhcHBseVRvb2xDYWxsRW11bGF0aW9uKFxuICByZXN1bHQ6IEVtdWxhdGlvblJlc3VsdCxcbiAgdG9vbHM6IFFncmlkVG9vbFtdIHwgdW5kZWZpbmVkLFxuICBvcHRpb25zOiBUb29sQ2FsbEVtdWxhdGlvbk9wdGlvbnMsXG4pOiBRdWVyeU91dHB1dCB7XG4gIGNvbnN0IHsgdGhyZWFkQ29vcmQsIGltYWdlcywgYW5zd2VyS2luZCB9ID0gb3B0aW9ucztcbiAgY29uc3QgcnVuQ29udGV4dCA9IHRocmVhZENvb3JkID8geyB0aHJlYWRDb29yZCB9IDogdW5kZWZpbmVkO1xuXG4gIGlmICghdG9vbHM/Lmxlbmd0aCkge1xuICAgIHJldHVybiBhbnN3ZXJPdXRwdXQocmVzdWx0LCByZXN1bHQudGV4dCwgaW1hZ2VzLCBydW5Db250ZXh0KTtcbiAgfVxuXG4gIGNvbnN0IHBhcnNlZCA9IHBhcnNlRW52ZWxvcGUocmVzdWx0LnRleHQsIHRvb2xzLCBhbnN3ZXJLaW5kKTtcbiAgaWYgKHBhcnNlZC5hY3Rpb24gPT09IFwidG9vbF9jYWxsXCIpIHtcbiAgICByZXR1cm4gdG9vbENhbGxPdXRwdXQocmVzdWx0LCBwYXJzZWQudG9vbENhbGxzLCBpbWFnZXMsIHJ1bkNvbnRleHQpO1xuICB9XG5cbiAgcmV0dXJuIGFuc3dlck91dHB1dChcbiAgICByZXN1bHQsXG4gICAgYW5zd2VyS2luZCA9PT0gXCJ0ZXh0XCIgPyAocGFyc2VkLmFuc3dlciBhcyBzdHJpbmcpIDogSlNPTi5zdHJpbmdpZnkocGFyc2VkLmFuc3dlciksXG4gICAgaW1hZ2VzLFxuICAgIHJ1bkNvbnRleHQsXG4gICk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1Rvb2xDYWxsRW52ZWxvcGUoXG4gIHRleHQ6IHN0cmluZyxcbiAgdG9vbHM6IFFncmlkVG9vbFtdLFxuICBhbnN3ZXJLaW5kOiBBbnN3ZXJLaW5kLFxuICBwaGFzZT86IHN0cmluZyxcbik6IGJvb2xlYW4ge1xuICBpZiAocGhhc2UgPT09IFwiY29tbWVudGFyeVwiKSB7XG4gICAgLy8gQ29tbWVudGFyeSBpcyBub3QgdGhlIHN0cnVjdHVyZWQgYW5zd2VyLiBPbmx5IGFuIGV4cGxpY2l0IHRvb2wgY29udHJvbFxuICAgIC8vIG9iamVjdCBpcyBlbGlnaWJsZSwgYW5kIHRoYXQgb2JqZWN0IG11c3Qgc3RpbGwgcGFzcyB0aGUgc3RyaWN0IHBhcnNlci5cbiAgICBsZXQgdmFsdWU6IHVua25vd247XG4gICAgdHJ5IHtcbiAgICAgIHZhbHVlID0gSlNPTi5wYXJzZSh0ZXh0KTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKFxuICAgICAgIXZhbHVlIHx8XG4gICAgICB0eXBlb2YgdmFsdWUgIT09IFwib2JqZWN0XCIgfHxcbiAgICAgICEoXCJyZXN1bHRcIiBpbiB2YWx1ZSkgfHxcbiAgICAgICF2YWx1ZS5yZXN1bHQgfHxcbiAgICAgIHR5cGVvZiB2YWx1ZS5yZXN1bHQgIT09IFwib2JqZWN0XCIgfHxcbiAgICAgICEoXCJhY3Rpb25cIiBpbiB2YWx1ZS5yZXN1bHQpIHx8XG4gICAgICB2YWx1ZS5yZXN1bHQuYWN0aW9uICE9PSBcInRvb2xfY2FsbFwiXG4gICAgKVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiBwYXJzZUVudmVsb3BlKHRleHQsIHRvb2xzLCBhbnN3ZXJLaW5kKS5hY3Rpb24gPT09IFwidG9vbF9jYWxsXCI7XG59XG5cbmZ1bmN0aW9uIHBhcnNlRW52ZWxvcGUodGV4dDogc3RyaW5nLCB0b29sczogUWdyaWRUb29sW10sIGFuc3dlcktpbmQ6IEFuc3dlcktpbmQpIHtcbiAgaWYgKEJ1ZmZlci5ieXRlTGVuZ3RoKHRleHQsIFwidXRmOFwiKSA+IFNUUlVDVFVSRURfRU5WRUxPUEVfTElNSVRTLm1heFV0ZjhCeXRlcykge1xuICAgIHRocm93IG5ldyBUb29sQ2FsbEVtdWxhdGlvbkVycm9yKFxuICAgICAgYHRvb2wgZW52ZWxvcGUgZXhjZWVkcyBVVEYtOCBieXRlIGxpbWl0IG9mICR7U1RSVUNUVVJFRF9FTlZFTE9QRV9MSU1JVFMubWF4VXRmOEJ5dGVzfWAsXG4gICAgKTtcbiAgfVxuXG4gIGxldCB2YWx1ZTogdW5rbm93bjtcbiAgdHJ5IHtcbiAgICB2YWx1ZSA9IEpTT04ucGFyc2UodGV4dCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgLy8g6rSA7JqpIO2PtOuwsSDsl4bsnYwuIG9wZW5haSDripQgZW52ZWxvcGUg7J20IHN0cnVjdHVyZWQgb3V0cHV0IOycvOuhnCDqsJXsoJzrkJjrr4DroZwg7Jes6riwIOuPhOuLrO2VnFxuICAgIC8vIOu5hCBKU09OIOydgCDrsoTqt7jri6QuIGFudGhyb3BpYyDsnYAg6rOE7JW97J2EIO2UhOuhrO2UhO2KuOuhnOunjCDslYjrgrTtlZjrr4DroZwoU09OLTUzMikg67mEIEpTT04g7J20XG4gICAgLy8gXCLsmIjsg4Eg6rCA64ql7ZWcIOuqqOuNuCDsi6TtjKhcIuyngOunjCwg6re4656Y64+EIOq1rOygnO2VmOyngCDslYrripTri6Qg4oCUIOqzvOqxsOydmCDthY3siqTtirgg6rWs7KCc64qUIO2HtO2ZlFxuICAgIC8vIOu0ie2IrOulvCDri7Xrs4DsnLzroZwg7Z2Y66Ck67O064K0IOyhsOyaqe2VnCDsmKTsl7zsnYQg66eM65Ok7JeI64ukKDIwMjYtMDcgbWVkcGF0aCwgMTMuNWsg6rG0KS5cbiAgICAvLyDsoJXsp4HtlZwg7Iuk7Yyo6rCAIOuztOyXrOyVvCDshozruYTsnpDqsIAg7J6s7Iuc64+E7ZWY6rGw64KYIOq3vOuzuCDsm5DsnbjsnYQg6rOg7Lmc64ukLlxuICAgIC8vIOynhOuLqOyXkOuKlCDsnITrsJgg7JuQ66y47J2YIOuouOumrOqwgCDtlYTsmpTtlZjri6QoU09OLTQ5NSDsoITroYApIOKAlCBwYXJzZSDsl5Drn6wg7JyE7LmY66eM7Jy866Gc64qUXG4gICAgLy8gXCLtlITroZzspojroZwg64u17ZaI64qU7KeAIC8g7Y6c7Iqk6rCAIOuCqOyVmOuKlOyngCAvIEpTT04g7J20IOyemOuguOuKlOyngFwi66W8IOq1rOu2hO2VoCDsiJgg7JeG64ukLlxuICAgIGNvbnN0IGhlYWQgPSBKU09OLnN0cmluZ2lmeSh0ZXh0LnNsaWNlKDAsIDIwMCkpO1xuICAgIGxvZ2dlci53YXJuKGB0b29sIGVudmVsb3BlIHBhcnNlIGZhaWxlZDogJHsoZXJyb3IgYXMgRXJyb3IpLm1lc3NhZ2V9OyBoZWFkPSR7aGVhZH1gKTtcbiAgICB0aHJvdyBuZXcgVG9vbENhbGxFbXVsYXRpb25FcnJvcihcbiAgICAgIGBpbnZhbGlkIHRvb2wgZW52ZWxvcGUgKHJlc3BvbnNlIGlzIG5vdCBKU09OIOKAlCB0aGUgbW9kZWwgaWdub3JlZCB0aGUgZW52ZWxvcGUgY29udHJhY3Q7IHJldHJ5IGlzIHRoZSBjYWxsZXIncyBkZWNpc2lvbik6ICR7KGVycm9yIGFzIEVycm9yKS5tZXNzYWdlfTsgcmVzcG9uc2UgaGVhZDogJHtoZWFkfWAsXG4gICAgKTtcbiAgfVxuXG4gIGFzc2VydFN0cnVjdHVyZWRFbnZlbG9wZUNvbXBsZXhpdHkodmFsdWUpO1xuICBjb25zdCBzY2hlbWEgPSBhbnN3ZXJLaW5kID09PSBcInRleHRcIiA/IFRFWFRfRU5WRUxPUEUgOiBKU09OX0VOVkVMT1BFO1xuICBjb25zdCB2YWxpZGF0aW9uID0gc2NoZW1hLnNhZmVQYXJzZSh2YWx1ZSk7XG4gIGlmICghdmFsaWRhdGlvbi5zdWNjZXNzKSB7XG4gICAgY29uc3QgaXNzdWUgPSB2YWxpZGF0aW9uLmVycm9yLmlzc3Vlc1swXTtcbiAgICBjb25zdCBwYXRoID0gaXNzdWUgJiYgaXNzdWUucGF0aC5sZW5ndGggPiAwID8gYCBhdCAke2lzc3VlLnBhdGguam9pbihcIi5cIil9YCA6IFwiXCI7XG4gICAgY29uc3QgZGV0YWlsID0gaXNzdWU/Lm1lc3NhZ2UgPz8gXCJ1bmtub3duIHZhbGlkYXRpb24gaXNzdWVcIjtcbiAgICAvLyB2YWxpZCBKU09OIOydtOyngOunjCDqs4Tslb0g7JyE67CY7J24IOqyveyasOyXkOuPhCDsm5DrrLgg66i466as66W8IOuCqOq4tOuLpCDigJQgem9kIOqyveuhnOunjOycvOuhnOuKlFxuICAgIC8vIFwi7YKkIOyDneueteyduOyngCAvIOuemO2NvOuhnCDqsJDsjIzripTsp4AgLyDtg4DsnoXsnbQg7YuA66C464qU7KeAXCLsnZgg7Iuk66y87J2EIOuzvCDsiJgg7JeG64ukLlxuICAgIGNvbnN0IGhlYWQgPSBKU09OLnN0cmluZ2lmeSh0ZXh0LnNsaWNlKDAsIDIwMCkpO1xuICAgIGxvZ2dlci53YXJuKGB0b29sIGVudmVsb3BlIHZhbGlkYXRpb24gZmFpbGVkJHtwYXRofTogJHtkZXRhaWx9OyBoZWFkPSR7aGVhZH1gKTtcbiAgICB0aHJvdyBuZXcgVG9vbENhbGxFbXVsYXRpb25FcnJvcihcbiAgICAgIGBpbnZhbGlkIHRvb2wgZW52ZWxvcGUke3BhdGh9OiAke2RldGFpbH07IHJlc3BvbnNlIGhlYWQ6ICR7aGVhZH1gLFxuICAgICk7XG4gIH1cblxuICAvLyBab2QgY2xvbmVzIEpTT04gb2JqZWN0cyBhbmQgZHJvcHMgb3duIFwiX19wcm90b19fXCIga2V5cy4gVGhlIHBhcnNlZCBKU09OIGlzIHNhZmUgdG8gcmV0dXJuXG4gIC8vIGFmdGVyIHZhbGlkYXRpb24gYW5kIHByZXNlcnZlcyB0aGUgY2FsbGVyJ3MgZXhhY3Qgc3RydWN0dXJlZCB2YWx1ZS5cbiAgY29uc3QgcmVzcG9uc2UgPSAodmFsdWUgYXMgeyByZXN1bHQ6IEVudmVsb3BlUmVzcG9uc2UgfSkucmVzdWx0O1xuICBpZiAocmVzcG9uc2UuYWN0aW9uID09PSBcInRvb2xfY2FsbFwiKSB7XG4gICAgY29uc3QgdW5rbm93blRvb2wgPSBmaW5kVW5rbm93blRvb2wocmVzcG9uc2UudG9vbENhbGxzLCB0b29scyk7XG4gICAgaWYgKHVua25vd25Ub29sICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBUb29sQ2FsbEVtdWxhdGlvbkVycm9yKGB1bmtub3duIGVtdWxhdGVkIHRvb2w6ICR7dW5rbm93blRvb2x9YCk7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXNwb25zZTtcbn1cblxuZnVuY3Rpb24gdG9vbENhbGxPdXRwdXQoXG4gIHJlc3VsdDogRW11bGF0aW9uUmVzdWx0LFxuICB0b29sQ2FsbHM6IFRvb2xDYWxsW10sXG4gIGltYWdlczogRW11bGF0aW9uSW1hZ2VbXSB8IHVuZGVmaW5lZCxcbiAgcnVuQ29udGV4dDogUXVlcnlPdXRwdXRbXCJydW5Db250ZXh0XCJdLFxuKTogUXVlcnlPdXRwdXQge1xuICByZXR1cm4ge1xuICAgIC4uLnJlc3VsdCxcbiAgICBjb250ZW50OiBhcHBlbmRJbWFnZXMoXG4gICAgICB0b29sQ2FsbHMubWFwKCh0b29sQ2FsbCkgPT4gKHtcbiAgICAgICAgdHlwZTogXCJ0b29sLWNhbGxcIixcbiAgICAgICAgdG9vbENhbGxJZDogYGNhbGxfJHtNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zbGljZSgyLCAxMCl9YCxcbiAgICAgICAgdG9vbE5hbWU6IHRvb2xDYWxsLnRvb2xOYW1lLFxuICAgICAgICBpbnB1dDogdG9vbENhbGwuYXJncyxcbiAgICAgIH0pKSxcbiAgICAgIGltYWdlcyxcbiAgICApLFxuICAgIGZpbmlzaFJlYXNvbjogXCJ0b29sLWNhbGxzXCIsXG4gICAgcnVuQ29udGV4dCxcbiAgfTtcbn1cblxuZnVuY3Rpb24gYW5zd2VyT3V0cHV0KFxuICByZXN1bHQ6IEVtdWxhdGlvblJlc3VsdCxcbiAgdGV4dDogc3RyaW5nLFxuICBpbWFnZXM6IEVtdWxhdGlvbkltYWdlW10gfCB1bmRlZmluZWQsXG4gIHJ1bkNvbnRleHQ6IFF1ZXJ5T3V0cHV0W1wicnVuQ29udGV4dFwiXSxcbik6IFF1ZXJ5T3V0cHV0IHtcbiAgcmV0dXJuIHtcbiAgICAuLi5yZXN1bHQsXG4gICAgdGV4dCxcbiAgICBjb250ZW50OiBhcHBlbmRJbWFnZXMoW3sgdHlwZTogXCJ0ZXh0XCIsIHRleHQgfV0sIGltYWdlcyksXG4gICAgZmluaXNoUmVhc29uOiBcInN0b3BcIixcbiAgICBydW5Db250ZXh0LFxuICB9O1xufVxuXG5mdW5jdGlvbiBmaW5kVW5rbm93blRvb2wodG9vbENhbGxzOiBUb29sQ2FsbFtdLCB0b29sczogUWdyaWRUb29sW10pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCBrbm93blRvb2xOYW1lcyA9IG5ldyBTZXQodG9vbHMubWFwKCh0b29sKSA9PiB0b29sLm5hbWUpKTtcbiAgcmV0dXJuIHRvb2xDYWxscy5maW5kKCh0b29sQ2FsbCkgPT4gIWtub3duVG9vbE5hbWVzLmhhcyh0b29sQ2FsbC50b29sTmFtZSkpPy50b29sTmFtZTtcbn1cblxuZnVuY3Rpb24gYXBwZW5kSW1hZ2VzKGNvbnRlbnQ6IFFncmlkQ29udGVudFtdLCBpbWFnZXM/OiBFbXVsYXRpb25JbWFnZVtdKTogUWdyaWRDb250ZW50W10ge1xuICBpZiAoIWltYWdlcz8ubGVuZ3RoKSByZXR1cm4gY29udGVudDtcbiAgcmV0dXJuIFtcbiAgICAuLi5jb250ZW50LFxuICAgIC4uLmltYWdlcy5tYXAoXG4gICAgICAoaW1hZ2UpOiBRZ3JpZENvbnRlbnQgPT4gKHtcbiAgICAgICAgdHlwZTogXCJpbWFnZVwiLFxuICAgICAgICBkYXRhOiBpbWFnZS5kYXRhLFxuICAgICAgICAuLi4oaW1hZ2UubWVkaWFUeXBlID8geyBtZWRpYVR5cGU6IGltYWdlLm1lZGlhVHlwZSB9IDoge30pLFxuICAgICAgICByZXZpc2VkUHJvbXB0OiBpbWFnZS5yZXZpc2VkUHJvbXB0ID8/IG51bGwsXG4gICAgICAgIC4uLihpbWFnZS5nZW5lcmF0aW9uID8geyBnZW5lcmF0aW9uOiBpbWFnZS5nZW5lcmF0aW9uIH0gOiB7fSksXG4gICAgICB9KSxcbiAgICApLFxuICBdO1xufVxuXG5mdW5jdGlvbiBhc3NlcnRTdHJ1Y3R1cmVkRW52ZWxvcGVDb21wbGV4aXR5KHJvb3Q6IHVua25vd24pOiB2b2lkIHtcbiAgY29uc3QgbWF4RGVwdGggPSBTVFJVQ1RVUkVEX0VOVkVMT1BFX0xJTUlUUy5tYXhEZXB0aDtcbiAgY29uc3Qgc3RhY2sgPSBbeyB2YWx1ZTogcm9vdCwgZGVwdGg6IDAgfV07XG4gIGxldCBub2RlcyA9IDA7XG5cbiAgd2hpbGUgKHN0YWNrLmxlbmd0aCA+IDApIHtcbiAgICBjb25zdCBjdXJyZW50ID0gc3RhY2sucG9wKCkhO1xuICAgIG5vZGVzICs9IDE7XG4gICAgaWYgKG5vZGVzID4gU1RSVUNUVVJFRF9FTlZFTE9QRV9MSU1JVFMubWF4Tm9kZXMpIHtcbiAgICAgIHRocm93IG5ldyBUb29sQ2FsbEVtdWxhdGlvbkVycm9yKFxuICAgICAgICBgc3RydWN0dXJlZC1vdXRwdXQgZW52ZWxvcGUgZXhjZWVkcyBub2RlIGxpbWl0IG9mICR7U1RSVUNUVVJFRF9FTlZFTE9QRV9MSU1JVFMubWF4Tm9kZXN9YCxcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChjdXJyZW50LmRlcHRoID4gbWF4RGVwdGgpIHtcbiAgICAgIHRocm93IG5ldyBUb29sQ2FsbEVtdWxhdGlvbkVycm9yKFxuICAgICAgICBgc3RydWN0dXJlZC1vdXRwdXQgZW52ZWxvcGUgZXhjZWVkcyBkZXB0aCBsaW1pdCBvZiAke21heERlcHRofWAsXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGN1cnJlbnQudmFsdWUgPT09IFwibnVtYmVyXCIgJiYgIU51bWJlci5pc0Zpbml0ZShjdXJyZW50LnZhbHVlKSkge1xuICAgICAgdGhyb3cgbmV3IFRvb2xDYWxsRW11bGF0aW9uRXJyb3IoXCJhbnN3ZXIgbXVzdCBiZSB2YWxpZCBKU09OXCIpO1xuICAgIH1cbiAgICBpZiAoY3VycmVudC52YWx1ZSA9PT0gbnVsbCB8fCB0eXBlb2YgY3VycmVudC52YWx1ZSAhPT0gXCJvYmplY3RcIikgY29udGludWU7XG5cbiAgICBmb3IgKGNvbnN0IHZhbHVlIG9mIE9iamVjdC52YWx1ZXMoY3VycmVudC52YWx1ZSkpIHtcbiAgICAgIHN0YWNrLnB1c2goeyB2YWx1ZSwgZGVwdGg6IGN1cnJlbnQuZGVwdGggKyAxIH0pO1xuICAgIH1cbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7O0FBUUEsTUFBTSw2QkFBNkI7Q0FDakMsY0FBYyxNQUFNO0NBQ3BCLFVBQVU7Q0FDVixVQUFVO0FBQ1o7QUFTQSxNQUFNLFNBQVMsVUFBVSxDQUFDLFNBQVMsZ0JBQWdCLENBQUM7QUFRcEQsU0FBUyxvQkFBb0IsWUFBd0I7Q0FDbkQsT0FBTyxFQUFFLGFBQWEsRUFDcEIsUUFBUSxFQUFFLG1CQUFtQixVQUFVLENBQ3JDLEVBQUUsYUFBYTtFQUNiLFFBQVEsRUFBRSxRQUFRLFFBQVE7RUFDMUIsUUFDRSxlQUFlLFNBQ1gsRUFBRSxPQUFPLElBQ1QsRUFBRSxLQUFLLENBQUMsQ0FBQyxRQUFRLFdBQVcsV0FBVyxNQUFNLEVBQzNDLFNBQVMsMEJBQ1gsQ0FBQztFQUNQLFdBQVcsRUFBRSxLQUFLO0NB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
146
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9vbC1lbXVsYXRpb24uanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2FwcGxpY2F0aW9uL3FncmlkL3Rvb2wtZW11bGF0aW9uLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEJ1ZmZlciB9IGZyb20gXCJub2RlOmJ1ZmZlclwiO1xuXG5pbXBvcnQgeyBnZXRMb2dnZXIgfSBmcm9tIFwiQGxvZ3RhcGUvbG9ndGFwZVwiO1xuaW1wb3J0IHsgeiB9IGZyb20gXCJ6b2RcIjtcblxuaW1wb3J0IHsgdHlwZSBKc29uVmFsdWUgfSBmcm9tIFwiLi4vLi4vdXRpbHMvcHJvdmlkZXJzL2NvbW1vbi9wcm92aWRlci10eXBlc1wiO1xuXG4vLyDsnZHri7Uo66qo6424IOy2nOugpSkgZW52ZWxvcGUg7J2YIOyekOybkCDtlZzrj4QuIGNhbGxlciDsiqTtgqTrp4gg7KCE7LKY66asIO2VnOuPhChDQUxMRVJfU0NIRU1BX0xJTUlUUynsmYAg6rCS7J20XG4vLyDqsJnslYQg67O07Jes64+EIOyEnOuhnCDri6Trpbgg7J6Q7JuQ7J2EIOyngO2CpOuKlCDrj4Xrpr0g7IOB7IiY64ukIOKAlCDsiqTtgqTrp4gg6rmK7J2064qUIOyduOyKpO2EtOyKpCDquYrsnbTrpbwgYm91bmQg7ZWY7KeAXG4vLyDslYrsnLzrr4DroZwo7J6s6reAICRyZWYg7ZeI7JqpKSDsupjrn6wg7ZWc64+E66W8IOyhsOygle2VtOuPhCDsnZHri7Ug7IiY7JqpIOq4sOykgOydtCDrlLDrnbwg7JuA7KeB7Jes7ISgIOyViCDrkJzri6QuXG5jb25zdCBTVFJVQ1RVUkVEX0VOVkVMT1BFX0xJTUlUUyA9IHtcbiAgbWF4VXRmOEJ5dGVzOiA1MTIgKiAxMDI0LFxuICBtYXhOb2RlczogMjBfMDAwLFxuICBtYXhEZXB0aDogMTMyLFxufSBhcyBjb25zdDtcblxuaW1wb3J0IHtcbiAgdHlwZSBJbWFnZUdlbmVyYXRpb25NZXRhZGF0YSxcbiAgdHlwZSBRZ3JpZENvbnRlbnQsXG4gIHR5cGUgUWdyaWRUaHJlYWRDb29yZCxcbiAgdHlwZSBRZ3JpZFRvb2wsXG4gIHR5cGUgUXVlcnlPdXRwdXQsXG59IGZyb20gXCIuL3FncmlkLnR5cGVzXCI7XG5cbmNvbnN0IGxvZ2dlciA9IGdldExvZ2dlcihbXCJxZ3JpZFwiLCBcInRvb2wtZW11bGF0aW9uXCJdKTtcblxudHlwZSBFbXVsYXRpb25SZXN1bHQgPSBPbWl0PFF1ZXJ5T3V0cHV0LCBcImNvbnRlbnRcIiB8IFwiZmluaXNoUmVhc29uXCIgfCBcInJ1bkNvbnRleHRcIj47XG5cbnR5cGUgVG9vbENhbGwgPSB7IHRvb2xOYW1lOiBzdHJpbmc7IGFyZ3M6IHN0cmluZyB9O1xuXG4vLyBlbnZlbG9wZSDripQge3Jlc3VsdDogPHVuaW9uPn0g7ZWcIOqyuSDqtazsobAg4oCUIOyKpO2CpOuniCDqt7zqsbDripQgdG9vbC1lbXVsYXRpb24tc2NoZW1hLnRzIOywuOyhsC5cbi8vIGFuc3dlciDtg4DsnoXrp4wg7JqU7LKtIO2Yle2DnOyXkCDrlLDrnbwg64uk66W064ukOiB0b29scy1vbmx5IOuKlCBzdHJpbmco6re464yA66GcIOuwmO2ZmCksXG4vLyB0b29scytqc29uU2NoZW1hIOuKlCDsgqzsmqnsnpAg7Iqk7YKk66eI7J2YIEpTT04g6rCSKEpTT04uc3RyaW5naWZ5IOuhnCDrsJjtmZgpLlxuZnVuY3Rpb24gYnVpbGRFbnZlbG9wZVNjaGVtYShhbnN3ZXJLaW5kOiBBbnN3ZXJLaW5kKSB7XG4gIHJldHVybiB6LnN0cmljdE9iamVjdCh7XG4gICAgcmVzdWx0OiB6LmRpc2NyaW1pbmF0ZWRVbmlvbihcImFjdGlvblwiLCBbXG4gICAgICB6LnN0cmljdE9iamVjdCh7XG4gICAgICAgIGFjdGlvbjogei5saXRlcmFsKFwiYW5zd2VyXCIpLFxuICAgICAgICBhbnN3ZXI6XG4gICAgICAgICAgYW5zd2VyS2luZCA9PT0gXCJ0ZXh0XCJcbiAgICAgICAgICAgID8gei5zdHJpbmcoKVxuICAgICAgICAgICAgOiB6Lmpzb24oKS5yZWZpbmUoKGFuc3dlcikgPT4gYW5zd2VyICE9PSBudWxsLCB7XG4gICAgICAgICAgICAgICAgbWVzc2FnZTogXCJhbnN3ZXIgbXVzdCBiZSBub24tbnVsbFwiLFxuICAgICAgICAgICAgICB9KSxcbiAgICAgICAgdG9vbENhbGxzOiB6Lm51bGwoKSxcbiAgICAgIH0pLFxuICAgICAgei5zdHJpY3RPYmplY3Qoe1xuICAgICAgICBhY3Rpb246IHoubGl0ZXJhbChcInRvb2xfY2FsbFwiKSxcbiAgICAgICAgYW5zd2VyOiB6Lm51bGwoKSxcbiAgICAgICAgdG9vbENhbGxzOiB6XG4gICAgICAgICAgLmFycmF5KFxuICAgICAgICAgICAgei5zdHJpY3RPYmplY3Qoe1xuICAgICAgICAgICAgICB0b29sTmFtZTogei5zdHJpbmcoKSxcbiAgICAgICAgICAgICAgYXJnczogei5zdHJpbmcoKSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgIClcbiAgICAgICAgICAubWluKDEpLFxuICAgICAgfSksXG4gICAgXSksXG4gIH0pO1xufVxuXG5jb25zdCBURVhUX0VOVkVMT1BFID0gYnVpbGRFbnZlbG9wZVNjaGVtYShcInRleHRcIik7XG5jb25zdCBKU09OX0VOVkVMT1BFID0gYnVpbGRFbnZlbG9wZVNjaGVtYShcImpzb25cIik7XG5cbnR5cGUgRW52ZWxvcGVSZXNwb25zZSA9IHouaW5mZXI8dHlwZW9mIEpTT05fRU5WRUxPUEU+W1wicmVzdWx0XCJdO1xuXG5leHBvcnQgY2xhc3MgVG9vbENhbGxFbXVsYXRpb25FcnJvciBleHRlbmRzIEVycm9yIHtcbiAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nKSB7XG4gICAgc3VwZXIoYHRvb2wtY2FsbCBlbXVsYXRpb246ICR7bWVzc2FnZX1gKTtcbiAgICB0aGlzLm5hbWUgPSBcIlRvb2xDYWxsRW11bGF0aW9uRXJyb3JcIjtcbiAgfVxufVxuXG4vLyBQcmVzZXJ2ZSBpbWFnZSBieXRlcyBhbmQgdGhlIHByb3ZpZGVyJ3MgcmVzb2x2ZWQgTUlNRSB0eXBlLlxuaW50ZXJmYWNlIEVtdWxhdGlvbkltYWdlIHtcbiAgZGF0YTogc3RyaW5nO1xuICBtZWRpYVR5cGU/OiBFeHRyYWN0PFFncmlkQ29udGVudCwgeyB0eXBlOiBcImltYWdlXCIgfT5bXCJtZWRpYVR5cGVcIl07XG4gIHJldmlzZWRQcm9tcHQ/OiBzdHJpbmcgfCBudWxsO1xuICBnZW5lcmF0aW9uPzogSW1hZ2VHZW5lcmF0aW9uTWV0YWRhdGE7XG59XG5cbi8vIGFuc3dlciDsnbjsvZTrlKkg7KKF66WYLiBlbnZlbG9wZSDrlJTsvZTrjZTripQg7ZWcIOuyjOydtOqzoCDsnbQg6rCS7J2AIGFuc3dlciDruIzrnpzsuZjsnZgg7YOA7J6F6rO8XG4vLyDstZzsooUg7KeB66Cs7ZmUKHRleHQ6IOq3uOuMgOuhnCAvIGpzb246IEpTT04uc3RyaW5naWZ5KeunjCDqsIDrpbjri6QuXG5leHBvcnQgdHlwZSBBbnN3ZXJLaW5kID0gXCJ0ZXh0XCIgfCBcImpzb25cIjtcblxuaW50ZXJmYWNlIFRvb2xDYWxsRW11bGF0aW9uT3B0aW9ucyB7XG4gIHRocmVhZENvb3JkPzogUWdyaWRUaHJlYWRDb29yZDtcbiAgaW1hZ2VzPzogRW11bGF0aW9uSW1hZ2VbXTtcbiAgLy8g7ZWE7IiYOiDtmLjstpzrtoDqsIAgYW5zd2VyIOyduOy9lOuUqeydhCDtla3sg4Eg66qF7Iuc7ZW07JW8IO2VnOuLpCAoaW5wdXQuanNvblNjaGVtYSDsnKDrrLTroZwg7YyQ7KCVKS5cbiAgYW5zd2VyS2luZDogQW5zd2VyS2luZDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5VG9vbENhbGxFbXVsYXRpb24oXG4gIHJlc3VsdDogRW11bGF0aW9uUmVzdWx0LFxuICB0b29sczogUWdyaWRUb29sW10gfCB1bmRlZmluZWQsXG4gIG9wdGlvbnM6IFRvb2xDYWxsRW11bGF0aW9uT3B0aW9ucyxcbik6IFF1ZXJ5T3V0cHV0IHtcbiAgY29uc3QgeyB0aHJlYWRDb29yZCwgaW1hZ2VzLCBhbnN3ZXJLaW5kIH0gPSBvcHRpb25zO1xuICBjb25zdCBydW5Db250ZXh0ID0gdGhyZWFkQ29vcmQgPyB7IHRocmVhZENvb3JkIH0gOiB1bmRlZmluZWQ7XG5cbiAgaWYgKCF0b29scz8ubGVuZ3RoKSB7XG4gICAgcmV0dXJuIGFuc3dlck91dHB1dChyZXN1bHQsIHJlc3VsdC50ZXh0LCBpbWFnZXMsIHJ1bkNvbnRleHQpO1xuICB9XG5cbiAgY29uc3QgcGFyc2VkID0gcGFyc2VFbnZlbG9wZShyZXN1bHQudGV4dCwgdG9vbHMsIGFuc3dlcktpbmQpO1xuXG4gIGlmIChwYXJzZWQuYWN0aW9uID09PSBcInRvb2xfY2FsbFwiKSB7XG4gICAgcmV0dXJuIHRvb2xDYWxsT3V0cHV0KHJlc3VsdCwgcGFyc2VkLnRvb2xDYWxscywgaW1hZ2VzLCBydW5Db250ZXh0KTtcbiAgfVxuXG4gIHJldHVybiBhbnN3ZXJPdXRwdXQoXG4gICAgcmVzdWx0LFxuICAgIGFuc3dlcktpbmQgPT09IFwidGV4dFwiID8gei5zdHJpbmcoKS5wYXJzZShwYXJzZWQuYW5zd2VyKSA6IEpTT04uc3RyaW5naWZ5KHBhcnNlZC5hbnN3ZXIpLFxuICAgIGltYWdlcyxcbiAgICBydW5Db250ZXh0LFxuICApO1xufVxuXG5jb25zdCBjb21tZW50YXJ5VG9vbENhbGxDb250cm9sID0gei5sb29zZU9iamVjdCh7XG4gIHJlc3VsdDogei5sb29zZU9iamVjdCh7IGFjdGlvbjogei5saXRlcmFsKFwidG9vbF9jYWxsXCIpIH0pLFxufSk7XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1Rvb2xDYWxsRW52ZWxvcGUoXG4gIHRleHQ6IHN0cmluZyxcbiAgdG9vbHM6IFFncmlkVG9vbFtdLFxuICBhbnN3ZXJLaW5kOiBBbnN3ZXJLaW5kLFxuICBwaGFzZT86IHN0cmluZyxcbik6IGJvb2xlYW4ge1xuICBpZiAocGhhc2UgPT09IFwiY29tbWVudGFyeVwiKSB7XG4gICAgLy8gQ29tbWVudGFyeSBpcyBub3QgdGhlIHN0cnVjdHVyZWQgYW5zd2VyLiBPbmx5IGFuIGV4cGxpY2l0IHRvb2wgY29udHJvbFxuICAgIC8vIG9iamVjdCBpcyBlbGlnaWJsZSwgYW5kIHRoYXQgb2JqZWN0IG11c3Qgc3RpbGwgcGFzcyB0aGUgc3RyaWN0IHBhcnNlci5cbiAgICBsZXQgdmFsdWU6IEpzb25WYWx1ZTtcblxuICAgIHRyeSB7XG4gICAgICB2YWx1ZSA9IEpTT04ucGFyc2UodGV4dCk7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKCFjb21tZW50YXJ5VG9vbENhbGxDb250cm9sLnNhZmVQYXJzZSh2YWx1ZSkuc3VjY2VzcykgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIHBhcnNlRW52ZWxvcGUodGV4dCwgdG9vbHMsIGFuc3dlcktpbmQpLmFjdGlvbiA9PT0gXCJ0b29sX2NhbGxcIjtcbn1cblxuZnVuY3Rpb24gcGFyc2VFbnZlbG9wZSh0ZXh0OiBzdHJpbmcsIHRvb2xzOiBRZ3JpZFRvb2xbXSwgYW5zd2VyS2luZDogQW5zd2VyS2luZCkge1xuICBpZiAoQnVmZmVyLmJ5dGVMZW5ndGgodGV4dCwgXCJ1dGY4XCIpID4gU1RSVUNUVVJFRF9FTlZFTE9QRV9MSU1JVFMubWF4VXRmOEJ5dGVzKSB7XG4gICAgdGhyb3cgbmV3IFRvb2xDYWxsRW11bGF0aW9uRXJyb3IoXG4gICAgICBgdG9vbCBlbnZlbG9wZSBleGNlZWRzIFVURi04IGJ5dGUgbGltaXQgb2YgJHtTVFJVQ1RVUkVEX0VOVkVMT1BFX0xJTUlUUy5tYXhVdGY4Qnl0ZXN9YCxcbiAgICApO1xuICB9XG5cbiAgLy8gSlNPTi5wYXJzZSB3aXRob3V0IGEgcmV2aXZlciB5aWVsZHMgb25seSBKU09OIHZhbHVlcy5cbiAgbGV0IHZhbHVlOiBKc29uVmFsdWU7XG5cbiAgdHJ5IHtcbiAgICB2YWx1ZSA9IEpTT04ucGFyc2UodGV4dCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgLy8g6rSA7JqpIO2PtOuwsSDsl4bsnYwuIG9wZW5haSDripQgZW52ZWxvcGUg7J20IHN0cnVjdHVyZWQgb3V0cHV0IOycvOuhnCDqsJXsoJzrkJjrr4DroZwg7Jes6riwIOuPhOuLrO2VnFxuICAgIC8vIOu5hCBKU09OIOydgCDrsoTqt7jri6QuIGFudGhyb3BpYyDsnYAg6rOE7JW97J2EIO2UhOuhrO2UhO2KuOuhnOunjCDslYjrgrTtlZjrr4DroZwoU09OLTUzMikg67mEIEpTT04g7J20XG4gICAgLy8gXCLsmIjsg4Eg6rCA64ql7ZWcIOuqqOuNuCDsi6TtjKhcIuyngOunjCwg6re4656Y64+EIOq1rOygnO2VmOyngCDslYrripTri6Qg4oCUIOqzvOqxsOydmCDthY3siqTtirgg6rWs7KCc64qUIO2HtO2ZlFxuICAgIC8vIOu0ie2IrOulvCDri7Xrs4DsnLzroZwg7Z2Y66Ck67O064K0IOyhsOyaqe2VnCDsmKTsl7zsnYQg66eM65Ok7JeI64ukKDIwMjYtMDcgbWVkcGF0aCwgMTMuNWsg6rG0KS5cbiAgICAvLyDsoJXsp4HtlZwg7Iuk7Yyo6rCAIOuztOyXrOyVvCDshozruYTsnpDqsIAg7J6s7Iuc64+E7ZWY6rGw64KYIOq3vOuzuCDsm5DsnbjsnYQg6rOg7Lmc64ukLlxuICAgIC8vIOynhOuLqOyXkOuKlCDsnITrsJgg7JuQ66y47J2YIOuouOumrOqwgCDtlYTsmpTtlZjri6QoU09OLTQ5NSDsoITroYApIOKAlCBwYXJzZSDsl5Drn6wg7JyE7LmY66eM7Jy866Gc64qUXG4gICAgLy8gXCLtlITroZzspojroZwg64u17ZaI64qU7KeAIC8g7Y6c7Iqk6rCAIOuCqOyVmOuKlOyngCAvIEpTT04g7J20IOyemOuguOuKlOyngFwi66W8IOq1rOu2hO2VoCDsiJgg7JeG64ukLlxuICAgIGNvbnN0IGhlYWQgPSBKU09OLnN0cmluZ2lmeSh0ZXh0LnNsaWNlKDAsIDIwMCkpO1xuICAgIGxvZ2dlci53YXJuKFxuICAgICAgYHRvb2wgZW52ZWxvcGUgcGFyc2UgZmFpbGVkOiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKX07IGhlYWQ9JHtoZWFkfWAsXG4gICAgKTtcbiAgICB0aHJvdyBuZXcgVG9vbENhbGxFbXVsYXRpb25FcnJvcihcbiAgICAgIGBpbnZhbGlkIHRvb2wgZW52ZWxvcGUgKHJlc3BvbnNlIGlzIG5vdCBKU09OIOKAlCB0aGUgbW9kZWwgaWdub3JlZCB0aGUgZW52ZWxvcGUgY29udHJhY3Q7IHJldHJ5IGlzIHRoZSBjYWxsZXIncyBkZWNpc2lvbik6ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpfTsgcmVzcG9uc2UgaGVhZDogJHtoZWFkfWAsXG4gICAgKTtcbiAgfVxuXG4gIGFzc2VydFN0cnVjdHVyZWRFbnZlbG9wZUNvbXBsZXhpdHkodmFsdWUpO1xuICBjb25zdCBzY2hlbWEgPSBhbnN3ZXJLaW5kID09PSBcInRleHRcIiA/IFRFWFRfRU5WRUxPUEUgOiBKU09OX0VOVkVMT1BFO1xuICBjb25zdCB2YWxpZGF0aW9uID0gc2NoZW1hLnNhZmVQYXJzZSh2YWx1ZSk7XG5cbiAgaWYgKCF2YWxpZGF0aW9uLnN1Y2Nlc3MpIHtcbiAgICBjb25zdCBpc3N1ZSA9IHZhbGlkYXRpb24uZXJyb3IuaXNzdWVzWzBdO1xuICAgIGNvbnN0IHBhdGggPSBpc3N1ZSAmJiBpc3N1ZS5wYXRoLmxlbmd0aCA+IDAgPyBgIGF0ICR7aXNzdWUucGF0aC5qb2luKFwiLlwiKX1gIDogXCJcIjtcbiAgICBjb25zdCBkZXRhaWwgPSBpc3N1ZT8ubWVzc2FnZSA/PyBcInVua25vd24gdmFsaWRhdGlvbiBpc3N1ZVwiO1xuICAgIC8vIHZhbGlkIEpTT04g7J207KeA66eMIOqzhOyVvSDsnITrsJjsnbgg6rK97Jqw7JeQ64+EIOybkOusuCDrqLjrpqzrpbwg64Ko6ri064ukIOKAlCB6b2Qg6rK966Gc66eM7Jy866Gc64qUXG4gICAgLy8gXCLtgqQg7IOd65617J247KeAIC8g656Y7Y2866GcIOqwkOyMjOuKlOyngCAvIO2DgOyeheydtCDti4DroLjripTsp4BcIuydmCDsi6TrrLzsnYQg67O8IOyImCDsl4bri6QuXG4gICAgY29uc3QgaGVhZCA9IEpTT04uc3RyaW5naWZ5KHRleHQuc2xpY2UoMCwgMjAwKSk7XG4gICAgbG9nZ2VyLndhcm4oYHRvb2wgZW52ZWxvcGUgdmFsaWRhdGlvbiBmYWlsZWQke3BhdGh9OiAke2RldGFpbH07IGhlYWQ9JHtoZWFkfWApO1xuICAgIHRocm93IG5ldyBUb29sQ2FsbEVtdWxhdGlvbkVycm9yKFxuICAgICAgYGludmFsaWQgdG9vbCBlbnZlbG9wZSR7cGF0aH06ICR7ZGV0YWlsfTsgcmVzcG9uc2UgaGVhZDogJHtoZWFkfWAsXG4gICAgKTtcbiAgfVxuXG4gIC8vIFNBRkVUWTogc2NoZW1hLnNhZmVQYXJzZSh2YWx1ZSkgc3VjY2VlZGVkIGFib3ZlLCBzbyB2YWx1ZSBtYXRjaGVzIHsgcmVzdWx0OiBFbnZlbG9wZVJlc3BvbnNlIH0uXG4gIC8vIFpvZCBjbG9uZXMgSlNPTiBvYmplY3RzIGFuZCBkcm9wcyBvd24gXCJfX3Byb3RvX19cIiBrZXlzLCBzbyB0aGUgdmFsaWRhdGVkIHJhdyB2YWx1ZSBpcyByZXR1cm5lZFxuICAvLyB0byBwcmVzZXJ2ZSB0aGUgY2FsbGVyJ3MgZXhhY3Qgc3RydWN0dXJlZCBhbnN3ZXIuXG4gIGNvbnN0IHJlc3BvbnNlID0gKHZhbHVlIGFzIHsgcmVzdWx0OiBFbnZlbG9wZVJlc3BvbnNlIH0pLnJlc3VsdDtcblxuICBpZiAocmVzcG9uc2UuYWN0aW9uID09PSBcInRvb2xfY2FsbFwiKSB7XG4gICAgY29uc3QgdW5rbm93blRvb2wgPSBmaW5kVW5rbm93blRvb2wocmVzcG9uc2UudG9vbENhbGxzLCB0b29scyk7XG5cbiAgICBpZiAodW5rbm93blRvb2wgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IFRvb2xDYWxsRW11bGF0aW9uRXJyb3IoYHVua25vd24gZW11bGF0ZWQgdG9vbDogJHt1bmtub3duVG9vbH1gKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcmVzcG9uc2U7XG59XG5cbmZ1bmN0aW9uIHRvb2xDYWxsT3V0cHV0KFxuICByZXN1bHQ6IEVtdWxhdGlvblJlc3VsdCxcbiAgdG9vbENhbGxzOiBUb29sQ2FsbFtdLFxuICBpbWFnZXM6IEVtdWxhdGlvbkltYWdlW10gfCB1bmRlZmluZWQsXG4gIHJ1bkNvbnRleHQ6IFF1ZXJ5T3V0cHV0W1wicnVuQ29udGV4dFwiXSxcbik6IFF1ZXJ5T3V0cHV0IHtcbiAgcmV0dXJuIHtcbiAgICAuLi5yZXN1bHQsXG4gICAgY29udGVudDogYXBwZW5kSW1hZ2VzKFxuICAgICAgdG9vbENhbGxzLm1hcCgodG9vbENhbGwpID0+ICh7XG4gICAgICAgIHR5cGU6IFwidG9vbC1jYWxsXCIsXG4gICAgICAgIHRvb2xDYWxsSWQ6IGBjYWxsXyR7TWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc2xpY2UoMiwgMTApfWAsXG4gICAgICAgIHRvb2xOYW1lOiB0b29sQ2FsbC50b29sTmFtZSxcbiAgICAgICAgaW5wdXQ6IHRvb2xDYWxsLmFyZ3MsXG4gICAgICB9KSksXG4gICAgICBpbWFnZXMsXG4gICAgKSxcbiAgICBmaW5pc2hSZWFzb246IFwidG9vbC1jYWxsc1wiLFxuICAgIHJ1bkNvbnRleHQsXG4gIH07XG59XG5cbmZ1bmN0aW9uIGFuc3dlck91dHB1dChcbiAgcmVzdWx0OiBFbXVsYXRpb25SZXN1bHQsXG4gIHRleHQ6IHN0cmluZyxcbiAgaW1hZ2VzOiBFbXVsYXRpb25JbWFnZVtdIHwgdW5kZWZpbmVkLFxuICBydW5Db250ZXh0OiBRdWVyeU91dHB1dFtcInJ1bkNvbnRleHRcIl0sXG4pOiBRdWVyeU91dHB1dCB7XG4gIHJldHVybiB7XG4gICAgLi4ucmVzdWx0LFxuICAgIHRleHQsXG4gICAgY29udGVudDogYXBwZW5kSW1hZ2VzKFt7IHR5cGU6IFwidGV4dFwiLCB0ZXh0IH1dLCBpbWFnZXMpLFxuICAgIGZpbmlzaFJlYXNvbjogXCJzdG9wXCIsXG4gICAgcnVuQ29udGV4dCxcbiAgfTtcbn1cblxuZnVuY3Rpb24gZmluZFVua25vd25Ub29sKHRvb2xDYWxsczogVG9vbENhbGxbXSwgdG9vbHM6IFFncmlkVG9vbFtdKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3Qga25vd25Ub29sTmFtZXMgPSBuZXcgU2V0KHRvb2xzLm1hcCgodG9vbCkgPT4gdG9vbC5uYW1lKSk7XG5cbiAgcmV0dXJuIHRvb2xDYWxscy5maW5kKCh0b29sQ2FsbCkgPT4gIWtub3duVG9vbE5hbWVzLmhhcyh0b29sQ2FsbC50b29sTmFtZSkpPy50b29sTmFtZTtcbn1cblxuZnVuY3Rpb24gYXBwZW5kSW1hZ2VzKGNvbnRlbnQ6IFFncmlkQ29udGVudFtdLCBpbWFnZXM/OiBFbXVsYXRpb25JbWFnZVtdKTogUWdyaWRDb250ZW50W10ge1xuICBpZiAoIWltYWdlcz8ubGVuZ3RoKSByZXR1cm4gY29udGVudDtcblxuICByZXR1cm4gW1xuICAgIC4uLmNvbnRlbnQsXG4gICAgLi4uaW1hZ2VzLm1hcCgoaW1hZ2UpOiBRZ3JpZENvbnRlbnQgPT4ge1xuICAgICAgY29uc3QgcGFydDogRXh0cmFjdDxRZ3JpZENvbnRlbnQsIHsgdHlwZTogXCJpbWFnZVwiIH0+ID0ge1xuICAgICAgICB0eXBlOiBcImltYWdlXCIsXG4gICAgICAgIGRhdGE6IGltYWdlLmRhdGEsXG4gICAgICAgIHJldmlzZWRQcm9tcHQ6IGltYWdlLnJldmlzZWRQcm9tcHQgPz8gbnVsbCxcbiAgICAgIH07XG5cbiAgICAgIGlmIChpbWFnZS5tZWRpYVR5cGUpIHBhcnQubWVkaWFUeXBlID0gaW1hZ2UubWVkaWFUeXBlO1xuXG4gICAgICBpZiAoaW1hZ2UuZ2VuZXJhdGlvbikgcGFydC5nZW5lcmF0aW9uID0gaW1hZ2UuZ2VuZXJhdGlvbjtcblxuICAgICAgcmV0dXJuIHBhcnQ7XG4gICAgfSksXG4gIF07XG59XG5cbmZ1bmN0aW9uIGFzc2VydFN0cnVjdHVyZWRFbnZlbG9wZUNvbXBsZXhpdHkocm9vdDogSnNvblZhbHVlKTogdm9pZCB7XG4gIGNvbnN0IG1heERlcHRoID0gU1RSVUNUVVJFRF9FTlZFTE9QRV9MSU1JVFMubWF4RGVwdGg7XG4gIGNvbnN0IHN0YWNrOiBBcnJheTx7IHZhbHVlOiBKc29uVmFsdWUgfCB1bmRlZmluZWQ7IGRlcHRoOiBudW1iZXIgfT4gPSBbeyB2YWx1ZTogcm9vdCwgZGVwdGg6IDAgfV07XG4gIGxldCBub2RlcyA9IDA7XG5cbiAgd2hpbGUgKHN0YWNrLmxlbmd0aCA+IDApIHtcbiAgICBjb25zdCBjdXJyZW50ID0gc3RhY2sucG9wKCkhO1xuICAgIG5vZGVzICs9IDE7XG5cbiAgICBpZiAobm9kZXMgPiBTVFJVQ1RVUkVEX0VOVkVMT1BFX0xJTUlUUy5tYXhOb2Rlcykge1xuICAgICAgdGhyb3cgbmV3IFRvb2xDYWxsRW11bGF0aW9uRXJyb3IoXG4gICAgICAgIGBzdHJ1Y3R1cmVkLW91dHB1dCBlbnZlbG9wZSBleGNlZWRzIG5vZGUgbGltaXQgb2YgJHtTVFJVQ1RVUkVEX0VOVkVMT1BFX0xJTUlUUy5tYXhOb2Rlc31gLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoY3VycmVudC5kZXB0aCA+IG1heERlcHRoKSB7XG4gICAgICB0aHJvdyBuZXcgVG9vbENhbGxFbXVsYXRpb25FcnJvcihcbiAgICAgICAgYHN0cnVjdHVyZWQtb3V0cHV0IGVudmVsb3BlIGV4Y2VlZHMgZGVwdGggbGltaXQgb2YgJHttYXhEZXB0aH1gLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBKU09OLnBhcnNlIHR1cm5zIG91dC1vZi1yYW5nZSBsaXRlcmFscyBzdWNoIGFzIDFlOTk5IGludG8gwrFJbmZpbml0eTsgaXQgbmV2ZXIgeWllbGRzIE5hTi5cbiAgICBpZiAoY3VycmVudC52YWx1ZSA9PT0gSW5maW5pdHkgfHwgY3VycmVudC52YWx1ZSA9PT0gLUluZmluaXR5KSB7XG4gICAgICB0aHJvdyBuZXcgVG9vbENhbGxFbXVsYXRpb25FcnJvcihcImFuc3dlciBtdXN0IGJlIHZhbGlkIEpTT05cIik7XG4gICAgfVxuXG4gICAgLy8gT25seSBKU09OIGFycmF5cyBhbmQgb2JqZWN0cyBhcmUgT2JqZWN0IGluc3RhbmNlczsgcHJpbWl0aXZlcyBhbmQgbnVsbCBhcmUgbGVhdmVzLlxuICAgIGlmICghKGN1cnJlbnQudmFsdWUgaW5zdGFuY2VvZiBPYmplY3QpKSBjb250aW51ZTtcblxuICAgIGZvciAoY29uc3QgdmFsdWUgb2YgT2JqZWN0LnZhbHVlcyhjdXJyZW50LnZhbHVlKSkge1xuICAgICAgc3RhY2sucHVzaCh7IHZhbHVlLCBkZXB0aDogY3VycmVudC5kZXB0aCArIDEgfSk7XG4gICAgfVxuICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7QUFVQSxNQUFNLDZCQUE2QjtDQUNqQyxjQUFjLE1BQU07Q0FDcEIsVUFBVTtDQUNWLFVBQVU7QUFDWjtBQVVBLE1BQU0sU0FBUyxVQUFVLENBQUMsU0FBUyxnQkFBZ0IsQ0FBQztBQVNwRCxTQUFTLG9CQUFvQixZQUF3QjtDQUNuRCxPQUFPLEVBQUUsYUFBYSxFQUNwQixRQUFRLEVBQUUsbUJBQW1CLFVBQVUsQ0FDckMsRUFBRSxhQUFhO0VBQ2IsUUFBUSxFQUFFLFFBQVEsUUFBUTtFQUMxQixRQUNFLGVBQWUsU0FDWCxFQUFFLE9BQU8sSUFDVCxFQUFFLEtBQUssQ0FBQyxDQUFDLFFBQVEsV0FBVyxXQUFXLE1BQU0sRUFDM0MsU0FBUywwQkFDWCxDQUFDO0VBQ1AsV0FBVyxFQUFFLEtBQUs7Q0FDcEIsQ0FBQyxHQUNELEVBQUUsYUFBYTtFQUNiLFFBQVEsRUFBRSxRQUFRLFdBQVc7RUFDN0IsUUFBUSxFQUFFLEtBQUs7RUFDZixXQUFXLEVBQ1IsTUFDQyxFQUFFLGFBQWE7R0FDYixVQUFVLEVBQUUsT0FBTztHQUNuQixNQUFNLEVBQUUsT0FBTztFQUNqQixDQUFDLENBQ0gsQ0FBQyxDQUNBLElBQUksQ0FBQztDQUNWLENBQUMsQ0FDSCxDQUFDLEVBQ0gsQ0FBQztBQUNIO0FBRUEsTUFBTSxnQkFBZ0Isb0JBQW9CLE1BQU07QUFDaEQsTUFBTSxnQkFBZ0Isb0JBQW9CLE1BQU07QUFJaEQsSUFBYSx5QkFBYixjQUE0QyxNQUFNO0NBQ2hELFlBQVksU0FBaUI7RUFDM0IsTUFBTSx3QkFBd0IsU0FBUztFQUN2QyxLQUFLLE9B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
@@ -1,4 +1,14 @@
1
+ import { isJsonObject } from "../../utils/providers/common/provider-types.js";
2
+ import { z } from "zod";
1
3
  //#region src/application/request-log/json-schema-type-text.ts
4
+ /**
5
+ * JSON Schema → 간결한 TypeScript `type` 선언 텍스트.
6
+ *
7
+ * 라이브러리(json-schema-to-typescript 계열)는 interface + maxItems 튜플 유니온 등
8
+ * 장황한 출력을 내서 detail 화면 요약용으로 부적합하다. qgrid 가 받는 스키마는
9
+ * zod 직렬화 산물(object root, draft-07 부분집합)이라 이 정도 지원이면 충분하고,
10
+ * 모르는 키워드는 unknown 으로 접어 절대 던지지 않는다.
11
+ */
2
12
  /** TS/zod 표시 코드 공용 식별자 판별 — zod-code-format 의 키 unquote 도 이걸 쓴다. */
3
13
  const IDENT_SOURCE = "[A-Za-z_$][\\w$]*";
4
14
  const IDENT_RE = new RegExp(`^${IDENT_SOURCE}$`);
@@ -24,14 +34,21 @@ function renderZodEnum(values, enumValueLimit) {
24
34
  const visibleValues = enumValueLimit === void 0 ? values : values.slice(0, Math.max(0, enumValueLimit));
25
35
  const omittedCount = values.length - visibleValues.length;
26
36
  const suffix = omittedCount > 0 ? ` /* +${omittedCount} */` : "";
27
- if (values.every((value) => typeof value === "string")) return `z.enum([${visibleValues.map((value) => JSON.stringify(value)).join(", ")}${suffix}])`;
37
+ if (values.every((value) => z.string().safeParse(value).success)) return `z.enum([${visibleValues.map((value) => JSON.stringify(value)).join(", ")}${suffix}])`;
28
38
  const literals = visibleValues.map((value) => `z.literal(${JSON.stringify(value)})`);
29
39
  if (literals.length === 1 && omittedCount === 0) return literals[0] ?? "z.never()";
30
40
  return `z.union([${literals.join(", ")}${suffix}])`;
31
41
  }
42
+ function schemaProperties(schema) {
43
+ return isJsonObject(schema.properties) ? schema.properties : {};
44
+ }
45
+ function requiredKeys(schema) {
46
+ const required = schema.required;
47
+ return new Set(Array.isArray(required) ? required.flatMap((key) => z.string().safeParse(key).data ?? []) : []);
48
+ }
32
49
  function renderZodNode(node, depth, enumValueLimit) {
33
50
  if (node === true) return "z.unknown()";
34
- if (!node || typeof node !== "object" || Array.isArray(node)) return "z.unknown()";
51
+ if (!isJsonObject(node)) return "z.unknown()";
35
52
  const schema = node;
36
53
  if (Array.isArray(schema.enum)) return renderZodEnum(schema.enum, enumValueLimit);
37
54
  if (schema.const !== void 0) return `z.literal(${JSON.stringify(schema.const)})`;
@@ -46,8 +63,8 @@ function renderZodNode(node, depth, enumValueLimit) {
46
63
  return rendered.length === 1 ? rendered[0] ?? "z.unknown()" : `z.union([${rendered.join(", ")}])`;
47
64
  }
48
65
  if (type === "object" || type === void 0 && schema.properties) {
49
- const properties = schema.properties ?? {};
50
- const required = new Set(Array.isArray(schema.required) ? schema.required : []);
66
+ const properties = schemaProperties(schema);
67
+ const required = requiredKeys(schema);
51
68
  const keys = Object.keys(properties);
52
69
  if (keys.length === 0) return "z.object({})";
53
70
  const orderedKeys = [...keys.filter((key) => required.has(key)), ...keys.filter((key) => !required.has(key))];
@@ -56,7 +73,7 @@ function renderZodNode(node, depth, enumValueLimit) {
56
73
  const propertySchema = properties[key];
57
74
  const rendered = renderZodNode(propertySchema, depth + 1, enumValueLimit);
58
75
  const optional = required.has(key) ? rendered : `${rendered}.optional()`;
59
- const defaultValue = propertySchema && typeof propertySchema === "object" && !Array.isArray(propertySchema) && Object.hasOwn(propertySchema, "default") ? JSON.stringify(propertySchema.default) : void 0;
76
+ const defaultValue = isJsonObject(propertySchema) && Object.hasOwn(propertySchema, "default") ? JSON.stringify(propertySchema.default) : void 0;
60
77
  const defaultComment = defaultValue === void 0 ? "" : ` // default=${defaultValue}`;
61
78
  return `${inner}${renderKey(key)}: ${optional},${defaultComment}`;
62
79
  }).join("\n")}\n${" ".repeat(depth)}})`;
@@ -66,7 +83,7 @@ function renderZodNode(node, depth, enumValueLimit) {
66
83
  }
67
84
  function renderNode(node, depth) {
68
85
  if (node === true) return "unknown";
69
- if (!node || typeof node !== "object" || Array.isArray(node)) return "unknown";
86
+ if (!isJsonObject(node)) return "unknown";
70
87
  const schema = node;
71
88
  if (Array.isArray(schema.enum)) return schema.enum.map((value) => JSON.stringify(value)).join(" | ");
72
89
  if (schema.const !== void 0) return JSON.stringify(schema.const);
@@ -75,8 +92,8 @@ function renderNode(node, depth) {
75
92
  const type = schema.type;
76
93
  if (Array.isArray(type)) return [...new Set(type.map(renderPrimitive))].join(" | ");
77
94
  if (type === "object" || type === void 0 && schema.properties) {
78
- const properties = schema.properties ?? {};
79
- const required = new Set(Array.isArray(schema.required) ? schema.required : []);
95
+ const properties = schemaProperties(schema);
96
+ const required = requiredKeys(schema);
80
97
  const keys = Object.keys(properties);
81
98
  if (keys.length === 0) return "Record<string, unknown>";
82
99
  const inner = " ".repeat(depth + 1);
@@ -93,8 +110,8 @@ function renderNode(node, depth) {
93
110
  function renderParsedJsonSchemaTypeText(schema, name = "Response") {
94
111
  return `type ${name} = ${renderNode(schema, 0)}`;
95
112
  }
96
- /** Tool input 계약용 표시 전용 Zod shape. 검증 제약은 의도적으로 생략한다. */
97
- function renderJsonSchemaZodShapeText(schema, enumValueLimit) {
113
+ /** Tool input 계약용 표시 전용 Zod 코드. 검증 제약은 의도적으로 생략한다. */
114
+ function renderJsonSchemaZodText(schema, enumValueLimit) {
98
115
  return renderZodNode(schema, 0, enumValueLimit);
99
116
  }
100
117
  /** 실패(파싱 불가 등) 시 null — 호출부가 표시 자체를 생략한다. */
@@ -106,6 +123,6 @@ function renderJsonSchemaTypeText(schemaJson, name = "Response") {
106
123
  }
107
124
  }
108
125
  //#endregion
109
- export { IDENT_SOURCE, renderJsonSchemaTypeText, renderJsonSchemaZodShapeText, renderParsedJsonSchemaTypeText };
126
+ export { IDENT_SOURCE, renderJsonSchemaTypeText, renderJsonSchemaZodText, renderParsedJsonSchemaTypeText };
110
127
 
111
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoianNvbi1zY2hlbWEtdHlwZS10ZXh0LmpzIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9hcHBsaWNhdGlvbi9yZXF1ZXN0LWxvZy9qc29uLXNjaGVtYS10eXBlLXRleHQudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBKU09OIFNjaGVtYSDihpIg6rCE6rKw7ZWcIFR5cGVTY3JpcHQgYHR5cGVgIOyEoOyWuCDthY3siqTtirguXG4gKlxuICog65287J2067iM65+s66asKGpzb24tc2NoZW1hLXRvLXR5cGVzY3JpcHQg6rOE7Je0KeuKlCBpbnRlcmZhY2UgKyBtYXhJdGVtcyDtipztlIwg7Jyg64uI7JioIOuTsVxuICog7J6l7Zmp7ZWcIOy2nOugpeydhCDrgrTshJwgZGV0YWlsIO2ZlOuptCDsmpTslb3smqnsnLzroZwg67aA7KCB7ZWp7ZWY64ukLiBxZ3JpZCDqsIAg67Cb64qUIOyKpO2CpOuniOuKlFxuICogem9kIOyngeugrO2ZlCDsgrDrrLwob2JqZWN0IHJvb3QsIGRyYWZ0LTA3IOu2gOu2hOynke2VqSnsnbTrnbwg7J20IOygleuPhCDsp4Dsm5DsnbTrqbQg7Lap67aE7ZWY6rOgLFxuICog66qo66W064qUIO2CpOybjOuTnOuKlCB1bmtub3duIOycvOuhnCDsoJHslrQg7KCI64yAIOuNmOyngOyngCDslYrripTri6QuXG4gKi9cblxudHlwZSBTY2hlbWFOb2RlID0gUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG5cbi8qKiBUUy96b2Qg7ZGc7IucIOy9lOuTnCDqs7Xsmqkg7Iud67OE7J6QIO2MkOuzhCDigJQgem9kLWNvZGUtZm9ybWF0IOydmCDtgqQgdW5xdW90ZSDrj4Qg7J206rG4IOyTtOuLpC4gKi9cbmV4cG9ydCBjb25zdCBJREVOVF9TT1VSQ0UgPSBcIltBLVphLXpfJF1bXFxcXHckXSpcIjtcbmNvbnN0IElERU5UX1JFID0gbmV3IFJlZ0V4cChgXiR7SURFTlRfU09VUkNFfSRgKTtcblxuZnVuY3Rpb24gcmVuZGVyS2V5KGtleTogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIElERU5UX1JFLnRlc3Qoa2V5KSA/IGtleSA6IEpTT04uc3RyaW5naWZ5KGtleSk7XG59XG5cbmZ1bmN0aW9uIHJlbmRlclByaW1pdGl2ZSh0eXBlOiB1bmtub3duKTogc3RyaW5nIHtcbiAgaWYgKHR5cGUgPT09IFwic3RyaW5nXCIpIHJldHVybiBcInN0cmluZ1wiO1xuICBpZiAodHlwZSA9PT0gXCJudW1iZXJcIiB8fCB0eXBlID09PSBcImludGVnZXJcIikgcmV0dXJuIFwibnVtYmVyXCI7XG4gIGlmICh0eXBlID09PSBcImJvb2xlYW5cIikgcmV0dXJuIFwiYm9vbGVhblwiO1xuICBpZiAodHlwZSA9PT0gXCJudWxsXCIpIHJldHVybiBcIm51bGxcIjtcbiAgcmV0dXJuIFwidW5rbm93blwiO1xufVxuXG5mdW5jdGlvbiByZW5kZXJab2RQcmltaXRpdmUodHlwZTogdW5rbm93bik6IHN0cmluZyB7XG4gIGlmICh0eXBlID09PSBcInN0cmluZ1wiKSByZXR1cm4gXCJ6LnN0cmluZygpXCI7XG4gIGlmICh0eXBlID09PSBcIm51bWJlclwiIHx8IHR5cGUgPT09IFwiaW50ZWdlclwiKSByZXR1cm4gXCJ6Lm51bWJlcigpXCI7XG4gIGlmICh0eXBlID09PSBcImJvb2xlYW5cIikgcmV0dXJuIFwiei5ib29sZWFuKClcIjtcbiAgaWYgKHR5cGUgPT09IFwibnVsbFwiKSByZXR1cm4gXCJ6Lm51bGwoKVwiO1xuICByZXR1cm4gXCJ6LnVua25vd24oKVwiO1xufVxuXG5mdW5jdGlvbiByZW5kZXJab2RFbnVtKHZhbHVlczogdW5rbm93bltdLCBlbnVtVmFsdWVMaW1pdD86IG51bWJlcik6IHN0cmluZyB7XG4gIGlmICh2YWx1ZXMubGVuZ3RoID09PSAwKSByZXR1cm4gXCJ6Lm5ldmVyKClcIjtcblxuICBjb25zdCB2aXNpYmxlVmFsdWVzID1cbiAgICBlbnVtVmFsdWVMaW1pdCA9PT0gdW5kZWZpbmVkID8gdmFsdWVzIDogdmFsdWVzLnNsaWNlKDAsIE1hdGgubWF4KDAsIGVudW1WYWx1ZUxpbWl0KSk7XG4gIGNvbnN0IG9taXR0ZWRDb3VudCA9IHZhbHVlcy5sZW5ndGggLSB2aXNpYmxlVmFsdWVzLmxlbmd0aDtcbiAgY29uc3Qgc3VmZml4ID0gb21pdHRlZENvdW50ID4gMCA/IGAgLyogKyR7b21pdHRlZENvdW50fSAqL2AgOiBcIlwiO1xuXG4gIGlmICh2YWx1ZXMuZXZlcnkoKHZhbHVlKSA9PiB0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIpKSB7XG4gICAgcmV0dXJuIGB6LmVudW0oWyR7dmlzaWJsZVZhbHVlcy5tYXAoKHZhbHVlKSA9PiBKU09OLnN0cmluZ2lmeSh2YWx1ZSkpLmpvaW4oXCIsIFwiKX0ke3N1ZmZpeH1dKWA7XG4gIH1cblxuICBjb25zdCBsaXRlcmFscyA9IHZpc2libGVWYWx1ZXMubWFwKCh2YWx1ZSkgPT4gYHoubGl0ZXJhbCgke0pTT04uc3RyaW5naWZ5KHZhbHVlKX0pYCk7XG4gIGlmIChsaXRlcmFscy5sZW5ndGggPT09IDEgJiYgb21pdHRlZENvdW50ID09PSAwKSByZXR1cm4gbGl0ZXJhbHNbMF0gPz8gXCJ6Lm5ldmVyKClcIjtcbiAgcmV0dXJuIGB6LnVuaW9uKFske2xpdGVyYWxzLmpvaW4oXCIsIFwiKX0ke3N1ZmZpeH1dKWA7XG59XG5cbmZ1bmN0aW9uIHJlbmRlclpvZE5vZGUobm9kZTogdW5rbm93biwgZGVwdGg6IG51bWJlciwgZW51bVZhbHVlTGltaXQ/OiBudW1iZXIpOiBzdHJpbmcge1xuICBpZiAobm9kZSA9PT0gdHJ1ZSkgcmV0dXJuIFwiei51bmtub3duKClcIjtcbiAgaWYgKCFub2RlIHx8IHR5cGVvZiBub2RlICE9PSBcIm9iamVjdFwiIHx8IEFycmF5LmlzQXJyYXkobm9kZSkpIHJldHVybiBcInoudW5rbm93bigpXCI7XG4gIGNvbnN0IHNjaGVtYSA9IG5vZGUgYXMgU2NoZW1hTm9kZTtcblxuICBpZiAoQXJyYXkuaXNBcnJheShzY2hlbWEuZW51bSkpIHJldHVybiByZW5kZXJab2RFbnVtKHNjaGVtYS5lbnVtLCBlbnVtVmFsdWVMaW1pdCk7XG4gIGlmIChzY2hlbWEuY29uc3QgIT09IHVuZGVmaW5lZCkgcmV0dXJuIGB6LmxpdGVyYWwoJHtKU09OLnN0cmluZ2lmeShzY2hlbWEuY29uc3QpfSlgO1xuXG4gIGNvbnN0IHZhcmlhbnRzID0gKHNjaGVtYS5hbnlPZiA/PyBzY2hlbWEub25lT2YpIGFzIHVua25vd247XG4gIGlmIChBcnJheS5pc0FycmF5KHZhcmlhbnRzKSAmJiB2YXJpYW50cy5sZW5ndGggPiAwKSB7XG4gICAgY29uc3QgcmVuZGVyZWQgPSBbXG4gICAgICAuLi5uZXcgU2V0KHZhcmlhbnRzLm1hcCgodmFyaWFudCkgPT4gcmVuZGVyWm9kTm9kZSh2YXJpYW50LCBkZXB0aCwgZW51bVZhbHVlTGltaXQpKSksXG4gICAgXTtcbiAgICByZXR1cm4gcmVuZGVyZWQubGVuZ3RoID09PSAxXG4gICAgICA/IChyZW5kZXJlZFswXSA/PyBcInoudW5rbm93bigpXCIpXG4gICAgICA6IGB6LnVuaW9uKFske3JlbmRlcmVkLmpvaW4oXCIsIFwiKX1dKWA7XG4gIH1cblxuICBjb25zdCB0eXBlID0gc2NoZW1hLnR5cGU7XG4gIGlmIChBcnJheS5pc0FycmF5KHR5cGUpKSB7XG4gICAgY29uc3QgcmVuZGVyZWQgPSBbLi4ubmV3IFNldCh0eXBlLm1hcChyZW5kZXJab2RQcmltaXRpdmUpKV07XG4gICAgcmV0dXJuIHJlbmRlcmVkLmxlbmd0aCA9PT0gMVxuICAgICAgPyAocmVuZGVyZWRbMF0gPz8gXCJ6LnVua25vd24oKVwiKVxuICAgICAgOiBgei51bmlvbihbJHtyZW5kZXJlZC5qb2luKFwiLCBcIil9XSlgO1xuICB9XG5cbiAgaWYgKHR5cGUgPT09IFwib2JqZWN0XCIgfHwgKHR5cGUgPT09IHVuZGVmaW5lZCAmJiBzY2hlbWEucHJvcGVydGllcykpIHtcbiAgICBjb25zdCBwcm9wZXJ0aWVzID0gKHNjaGVtYS5wcm9wZXJ0aWVzID8/IHt9KSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICBjb25zdCByZXF1aXJlZCA9IG5ldyBTZXQoQXJyYXkuaXNBcnJheShzY2hlbWEucmVxdWlyZWQpID8gKHNjaGVtYS5yZXF1aXJlZCBhcyBzdHJpbmdbXSkgOiBbXSk7XG4gICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKHByb3BlcnRpZXMpO1xuICAgIGlmIChrZXlzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIFwiei5vYmplY3Qoe30pXCI7XG4gICAgY29uc3Qgb3JkZXJlZEtleXMgPSBbXG4gICAgICAuLi5rZXlzLmZpbHRlcigoa2V5KSA9PiByZXF1aXJlZC5oYXMoa2V5KSksXG4gICAgICAuLi5rZXlzLmZpbHRlcigoa2V5KSA9PiAhcmVxdWlyZWQuaGFzKGtleSkpLFxuICAgIF07XG5cbiAgICBjb25zdCBpbm5lciA9IFwiICBcIi5yZXBlYXQoZGVwdGggKyAxKTtcbiAgICBjb25zdCBsaW5lcyA9IG9yZGVyZWRLZXlzLm1hcCgoa2V5KSA9PiB7XG4gICAgICBjb25zdCBwcm9wZXJ0eVNjaGVtYSA9IHByb3BlcnRpZXNba2V5XTtcbiAgICAgIGNvbnN0IHJlbmRlcmVkID0gcmVuZGVyWm9kTm9kZShwcm9wZXJ0eVNjaGVtYSwgZGVwdGggKyAxLCBlbnVtVmFsdWVMaW1pdCk7XG4gICAgICBjb25zdCBvcHRpb25hbCA9IHJlcXVpcmVkLmhhcyhrZXkpID8gcmVuZGVyZWQgOiBgJHtyZW5kZXJlZH0ub3B0aW9uYWwoKWA7XG4gICAgICBjb25zdCBkZWZhdWx0VmFsdWUgPVxuICAgICAgICBwcm9wZXJ0eVNjaGVtYSAmJlxuICAgICAgICB0eXBlb2YgcHJvcGVydHlTY2hlbWEgPT09IFwib2JqZWN0XCIgJiZcbiAgICAgICAgIUFycmF5LmlzQXJyYXkocHJvcGVydHlTY2hlbWEpICYmXG4gICAgICAgIE9iamVjdC5oYXNPd24ocHJvcGVydHlTY2hlbWEsIFwiZGVmYXVsdFwiKVxuICAgICAgICAgID8gSlNPTi5zdHJpbmdpZnkoKHByb3BlcnR5U2NoZW1hIGFzIFNjaGVtYU5vZGUpLmRlZmF1bHQpXG4gICAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgICBjb25zdCBkZWZhdWx0Q29tbWVudCA9IGRlZmF1bHRWYWx1ZSA9PT0gdW5kZWZpbmVkID8gXCJcIiA6IGAgLy8gZGVmYXVsdD0ke2RlZmF1bHRWYWx1ZX1gO1xuICAgICAgcmV0dXJuIGAke2lubmVyfSR7cmVuZGVyS2V5KGtleSl9OiAke29wdGlvbmFsfSwke2RlZmF1bHRDb21tZW50fWA7XG4gICAgfSk7XG4gICAgcmV0dXJuIGB6Lm9iamVjdCh7XFxuJHtsaW5lcy5qb2luKFwiXFxuXCIpfVxcbiR7XCIgIFwiLnJlcGVhdChkZXB0aCl9fSlgO1xuICB9XG5cbiAgaWYgKHR5cGUgPT09IFwiYXJyYXlcIikge1xuICAgIHJldHVybiBgei5hcnJheSgke3JlbmRlclpvZE5vZGUoc2NoZW1hLml0ZW1zLCBkZXB0aCwgZW51bVZhbHVlTGltaXQpfSlgO1xuICB9XG5cbiAgcmV0dXJuIHJlbmRlclpvZFByaW1pdGl2ZSh0eXBlKTtcbn1cblxuZnVuY3Rpb24gcmVuZGVyTm9kZShub2RlOiB1bmtub3duLCBkZXB0aDogbnVtYmVyKTogc3RyaW5nIHtcbiAgaWYgKG5vZGUgPT09IHRydWUpIHJldHVybiBcInVua25vd25cIjtcbiAgaWYgKCFub2RlIHx8IHR5cGVvZiBub2RlICE9PSBcIm9iamVjdFwiIHx8IEFycmF5LmlzQXJyYXkobm9kZSkpIHJldHVybiBcInVua25vd25cIjtcbiAgY29uc3Qgc2NoZW1hID0gbm9kZSBhcyBTY2hlbWFOb2RlO1xuXG4gIGlmIChBcnJheS5pc0FycmF5KHNjaGVtYS5lbnVtKSkge1xuICAgIHJldHVybiBzY2hlbWEuZW51bS5tYXAoKHZhbHVlKSA9PiBKU09OLnN0cmluZ2lmeSh2YWx1ZSkpLmpvaW4oXCIgfCBcIik7XG4gIH1cbiAgaWYgKHNjaGVtYS5jb25zdCAhPT0gdW5kZWZpbmVkKSByZXR1cm4gSlNPTi5zdHJpbmdpZnkoc2NoZW1hLmNvbnN0KTtcblxuICBjb25zdCB2YXJpYW50cyA9IChzY2hlbWEuYW55T2YgPz8gc2NoZW1hLm9uZU9mKSBhcyB1bmtub3duO1xuICBpZiAoQXJyYXkuaXNBcnJheSh2YXJpYW50cykgJiYgdmFyaWFudHMubGVuZ3RoID4gMCkge1xuICAgIHJldHVybiBbLi4ubmV3IFNldCh2YXJpYW50cy5tYXAoKHZhcmlhbnQpID0+IHJlbmRlck5vZGUodmFyaWFudCwgZGVwdGgpKSldLmpvaW4oXCIgfCBcIik7XG4gIH1cblxuICBjb25zdCB0eXBlID0gc2NoZW1hLnR5cGU7XG4gIGlmIChBcnJheS5pc0FycmF5KHR5cGUpKSB7XG4gICAgcmV0dXJuIFsuLi5uZXcgU2V0KHR5cGUubWFwKHJlbmRlclByaW1pdGl2ZSkpXS5qb2luKFwiIHwgXCIpO1xuICB9XG5cbiAgaWYgKHR5cGUgPT09IFwib2JqZWN0XCIgfHwgKHR5cGUgPT09IHVuZGVmaW5lZCAmJiBzY2hlbWEucHJvcGVydGllcykpIHtcbiAgICBjb25zdCBwcm9wZXJ0aWVzID0gKHNjaGVtYS5wcm9wZXJ0aWVzID8/IHt9KSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICBjb25zdCByZXF1aXJlZCA9IG5ldyBTZXQoQXJyYXkuaXNBcnJheShzY2hlbWEucmVxdWlyZWQpID8gKHNjaGVtYS5yZXF1aXJlZCBhcyBzdHJpbmdbXSkgOiBbXSk7XG4gICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKHByb3BlcnRpZXMpO1xuICAgIGlmIChrZXlzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIFwiUmVjb3JkPHN0cmluZywgdW5rbm93bj5cIjtcbiAgICBjb25zdCBpbm5lciA9IFwiICBcIi5yZXBlYXQoZGVwdGggKyAxKTtcbiAgICBjb25zdCBsaW5lcyA9IGtleXMubWFwKFxuICAgICAgKGtleSkgPT5cbiAgICAgICAgYCR7aW5uZXJ9JHtyZW5kZXJLZXkoa2V5KX0ke3JlcXVpcmVkLmhhcyhrZXkpID8gXCJcIiA6IFwiP1wifTogJHtyZW5kZXJOb2RlKHByb3BlcnRpZXNba2V5XSwgZGVwdGggKyAxKX1gLFxuICAgICk7XG4gICAgcmV0dXJuIGB7XFxuJHtsaW5lcy5qb2luKFwiXFxuXCIpfVxcbiR7XCIgIFwiLnJlcGVhdChkZXB0aCl9fWA7XG4gIH1cblxuICBpZiAodHlwZSA9PT0gXCJhcnJheVwiKSB7XG4gICAgY29uc3QgaXRlbSA9IHJlbmRlck5vZGUoc2NoZW1hLml0ZW1zLCBkZXB0aCk7XG4gICAgLy8g7Jyg64uI7JioIOyalOyGjOuKlCDqtITtmLjqsIAg7JeG7Jy866m0IGBBIHwgQltdYCDroZwg7J6Y66q7IOydve2ejOuLpC5cbiAgICBpZiAoaXRlbS5pbmNsdWRlcyhcIiB8IFwiKSkgcmV0dXJuIGAoJHtpdGVtfSlbXWA7XG4gICAgcmV0dXJuIGAke2l0ZW19W11gO1xuICB9XG5cbiAgcmV0dXJuIHJlbmRlclByaW1pdGl2ZSh0eXBlKTtcbn1cblxuLyoqIOydtOuvuCDtjIzsi7HrkJwg7Iqk7YKk66eIIOqwkuyaqSDigJQg7Zi47Lac67aA6rCAIOqwmeydgCBKU09OIOydhCDrkZAg67KIIO2MjOyLse2VmOyngCDslYrqsowg7ZWc64ukLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlbmRlclBhcnNlZEpzb25TY2hlbWFUeXBlVGV4dChzY2hlbWE6IHVua25vd24sIG5hbWUgPSBcIlJlc3BvbnNlXCIpOiBzdHJpbmcge1xuICByZXR1cm4gYHR5cGUgJHtuYW1lfSA9ICR7cmVuZGVyTm9kZShzY2hlbWEsIDApfWA7XG59XG5cbi8qKiBUb29sIGlucHV0IOqzhOyVveyaqSDtkZzsi5wg7KCE7JqpIFpvZCBzaGFwZS4g6rKA7KadIOygnOyVveydgCDsnZjrj4TsoIHsnLzroZwg7IOd65617ZWc64ukLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlbmRlckpzb25TY2hlbWFab2RTaGFwZVRleHQoc2NoZW1hOiB1bmtub3duLCBlbnVtVmFsdWVMaW1pdD86IG51bWJlcik6IHN0cmluZyB7XG4gIHJldHVybiByZW5kZXJab2ROb2RlKHNjaGVtYSwgMCwgZW51bVZhbHVlTGltaXQpO1xufVxuXG4vKiog7Iuk7YyoKO2MjOyLsSDrtojqsIAg65OxKSDsi5wgbnVsbCDigJQg7Zi47Lac67aA6rCAIO2RnOyLnCDsnpDssrTrpbwg7IOd65617ZWc64ukLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlbmRlckpzb25TY2hlbWFUeXBlVGV4dChzY2hlbWFKc29uOiBzdHJpbmcsIG5hbWUgPSBcIlJlc3BvbnNlXCIpOiBzdHJpbmcgfCBudWxsIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gcmVuZGVyUGFyc2VkSnNvblNjaGVtYVR5cGVUZXh0KEpTT04ucGFyc2Uoc2NoZW1hSnNvbikgYXMgdW5rbm93biwgbmFtZSk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBudWxsO1xuICB9XG59XG4iXSwibWFwcGluZ3MiOiI7O0FBWUEsTUFBYSxlQUFlO0FBQzVCLE1BQU0sV0FBVyxJQUFJLE9BQU8sSUFBSSxhQUFhLEVBQUU7QUFFL0MsU0FBUyxVQUFVLEtBQXFCO0NBQ3RDLE9BQU8sU0FBUyxLQUFLLEdBQUcsSUFBSSxNQUFNLEtBQUssVUFBVSxHQUFHO0FBQ3REO0FBRUEsU0FBUyxnQkFBZ0IsTUFBdUI7Q0FDOUMsSUFBSSxTQUFTLFVBQVUsT0FBTztDQUM5QixJQUFJLFNBQVMsWUFBWSxTQUFTLFdBQVcsT0FBTztDQUNwRCxJQUFJLFNBQVMsV0FBVyxPQUFPO0NBQy9CLElBQUksU0FBUyxRQUFRLE9BQU87Q0FDNUIsT0FBTztBQUNUO0FBRUEsU0FBUyxtQkFBbUIsTUFBdUI7Q0FDakQsSUFBSSxTQUFTLFVBQVUsT0FBTztDQUM5QixJQUFJLFNBQVMsWUFBWSxTQUFTLFdBQVcsT0FBTztDQUNwRCxJQUFJLFNBQVMsV0FBVyxPQUFPO0NBQy9CLElBQUksU0FBUyxRQUFRLE9BQU87Q0FDNUIsT0FBTztBQUNUO0FBRUEsU0FBUyxjQUFjLFFBQW1CLGdCQUFpQztDQUN6RSxJQUFJLE9BQU8sV0FBVyxHQUFHLE9BQU87Q0FFaEMsTUFBTSxnQkFDSixtQkFBbUIsU0FBWSxTQUFTLE9BQU8sTUFBTSxHQUFHLEtBQUssSUFBSSxHQUFH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
128
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoianNvbi1zY2hlbWEtdHlwZS10ZXh0LmpzIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9hcHBsaWNhdGlvbi9yZXF1ZXN0LWxvZy9qc29uLXNjaGVtYS10eXBlLXRleHQudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBKU09OIFNjaGVtYSDihpIg6rCE6rKw7ZWcIFR5cGVTY3JpcHQgYHR5cGVgIOyEoOyWuCDthY3siqTtirguXG4gKlxuICog65287J2067iM65+s66asKGpzb24tc2NoZW1hLXRvLXR5cGVzY3JpcHQg6rOE7Je0KeuKlCBpbnRlcmZhY2UgKyBtYXhJdGVtcyDtipztlIwg7Jyg64uI7JioIOuTsVxuICog7J6l7Zmp7ZWcIOy2nOugpeydhCDrgrTshJwgZGV0YWlsIO2ZlOuptCDsmpTslb3smqnsnLzroZwg67aA7KCB7ZWp7ZWY64ukLiBxZ3JpZCDqsIAg67Cb64qUIOyKpO2CpOuniOuKlFxuICogem9kIOyngeugrO2ZlCDsgrDrrLwob2JqZWN0IHJvb3QsIGRyYWZ0LTA3IOu2gOu2hOynke2VqSnsnbTrnbwg7J20IOygleuPhCDsp4Dsm5DsnbTrqbQg7Lap67aE7ZWY6rOgLFxuICog66qo66W064qUIO2CpOybjOuTnOuKlCB1bmtub3duIOycvOuhnCDsoJHslrQg7KCI64yAIOuNmOyngOyngCDslYrripTri6QuXG4gKi9cblxuaW1wb3J0IHsgeiB9IGZyb20gXCJ6b2RcIjtcblxuaW1wb3J0IHtcbiAgaXNKc29uT2JqZWN0LFxuICB0eXBlIEpzb25PYmplY3QsXG4gIHR5cGUgSnNvblZhbHVlLFxufSBmcm9tIFwiLi4vLi4vdXRpbHMvcHJvdmlkZXJzL2NvbW1vbi9wcm92aWRlci10eXBlc1wiO1xuXG4vKiogVFMvem9kIO2RnOyLnCDsvZTrk5wg6rO17JqpIOyLneuzhOyekCDtjJDrs4Qg4oCUIHpvZC1jb2RlLWZvcm1hdCDsnZgg7YKkIHVucXVvdGUg64+EIOydtOqxuCDsk7Tri6QuICovXG5leHBvcnQgY29uc3QgSURFTlRfU09VUkNFID0gXCJbQS1aYS16XyRdW1xcXFx3JF0qXCI7XG5jb25zdCBJREVOVF9SRSA9IG5ldyBSZWdFeHAoYF4ke0lERU5UX1NPVVJDRX0kYCk7XG5cbmZ1bmN0aW9uIHJlbmRlcktleShrZXk6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBJREVOVF9SRS50ZXN0KGtleSkgPyBrZXkgOiBKU09OLnN0cmluZ2lmeShrZXkpO1xufVxuXG5mdW5jdGlvbiByZW5kZXJQcmltaXRpdmUodHlwZTogSnNvblZhbHVlIHwgdW5kZWZpbmVkKTogc3RyaW5nIHtcbiAgaWYgKHR5cGUgPT09IFwic3RyaW5nXCIpIHJldHVybiBcInN0cmluZ1wiO1xuXG4gIGlmICh0eXBlID09PSBcIm51bWJlclwiIHx8IHR5cGUgPT09IFwiaW50ZWdlclwiKSByZXR1cm4gXCJudW1iZXJcIjtcblxuICBpZiAodHlwZSA9PT0gXCJib29sZWFuXCIpIHJldHVybiBcImJvb2xlYW5cIjtcblxuICBpZiAodHlwZSA9PT0gXCJudWxsXCIpIHJldHVybiBcIm51bGxcIjtcblxuICByZXR1cm4gXCJ1bmtub3duXCI7XG59XG5cbmZ1bmN0aW9uIHJlbmRlclpvZFByaW1pdGl2ZSh0eXBlOiBKc29uVmFsdWUgfCB1bmRlZmluZWQpOiBzdHJpbmcge1xuICBpZiAodHlwZSA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIFwiei5zdHJpbmcoKVwiO1xuXG4gIGlmICh0eXBlID09PSBcIm51bWJlclwiIHx8IHR5cGUgPT09IFwiaW50ZWdlclwiKSByZXR1cm4gXCJ6Lm51bWJlcigpXCI7XG5cbiAgaWYgKHR5cGUgPT09IFwiYm9vbGVhblwiKSByZXR1cm4gXCJ6LmJvb2xlYW4oKVwiO1xuXG4gIGlmICh0eXBlID09PSBcIm51bGxcIikgcmV0dXJuIFwiei5udWxsKClcIjtcblxuICByZXR1cm4gXCJ6LnVua25vd24oKVwiO1xufVxuXG5mdW5jdGlvbiByZW5kZXJab2RFbnVtKHZhbHVlczogSnNvblZhbHVlW10sIGVudW1WYWx1ZUxpbWl0PzogbnVtYmVyKTogc3RyaW5nIHtcbiAgaWYgKHZhbHVlcy5sZW5ndGggPT09IDApIHJldHVybiBcInoubmV2ZXIoKVwiO1xuXG4gIGNvbnN0IHZpc2libGVWYWx1ZXMgPVxuICAgIGVudW1WYWx1ZUxpbWl0ID09PSB1bmRlZmluZWQgPyB2YWx1ZXMgOiB2YWx1ZXMuc2xpY2UoMCwgTWF0aC5tYXgoMCwgZW51bVZhbHVlTGltaXQpKTtcblxuICBjb25zdCBvbWl0dGVkQ291bnQgPSB2YWx1ZXMubGVuZ3RoIC0gdmlzaWJsZVZhbHVlcy5sZW5ndGg7XG4gIGNvbnN0IHN1ZmZpeCA9IG9taXR0ZWRDb3VudCA+IDAgPyBgIC8qICske29taXR0ZWRDb3VudH0gKi9gIDogXCJcIjtcblxuICBpZiAodmFsdWVzLmV2ZXJ5KCh2YWx1ZSkgPT4gei5zdHJpbmcoKS5zYWZlUGFyc2UodmFsdWUpLnN1Y2Nlc3MpKSB7XG4gICAgcmV0dXJuIGB6LmVudW0oWyR7dmlzaWJsZVZhbHVlcy5tYXAoKHZhbHVlKSA9PiBKU09OLnN0cmluZ2lmeSh2YWx1ZSkpLmpvaW4oXCIsIFwiKX0ke3N1ZmZpeH1dKWA7XG4gIH1cblxuICBjb25zdCBsaXRlcmFscyA9IHZpc2libGVWYWx1ZXMubWFwKCh2YWx1ZSkgPT4gYHoubGl0ZXJhbCgke0pTT04uc3RyaW5naWZ5KHZhbHVlKX0pYCk7XG5cbiAgaWYgKGxpdGVyYWxzLmxlbmd0aCA9PT0gMSAmJiBvbWl0dGVkQ291bnQgPT09IDApIHJldHVybiBsaXRlcmFsc1swXSA/PyBcInoubmV2ZXIoKVwiO1xuXG4gIHJldHVybiBgei51bmlvbihbJHtsaXRlcmFscy5qb2luKFwiLCBcIil9JHtzdWZmaXh9XSlgO1xufVxuXG5mdW5jdGlvbiBzY2hlbWFQcm9wZXJ0aWVzKHNjaGVtYTogSnNvbk9iamVjdCk6IEpzb25PYmplY3Qge1xuICByZXR1cm4gaXNKc29uT2JqZWN0KHNjaGVtYS5wcm9wZXJ0aWVzKSA/IHNjaGVtYS5wcm9wZXJ0aWVzIDoge307XG59XG5cbmZ1bmN0aW9uIHJlcXVpcmVkS2V5cyhzY2hlbWE6IEpzb25PYmplY3QpOiBTZXQ8c3RyaW5nPiB7XG4gIGNvbnN0IHJlcXVpcmVkID0gc2NoZW1hLnJlcXVpcmVkO1xuXG4gIHJldHVybiBuZXcgU2V0KFxuICAgIEFycmF5LmlzQXJyYXkocmVxdWlyZWQpID8gcmVxdWlyZWQuZmxhdE1hcCgoa2V5KSA9PiB6LnN0cmluZygpLnNhZmVQYXJzZShrZXkpLmRhdGEgPz8gW10pIDogW10sXG4gICk7XG59XG5cbmZ1bmN0aW9uIHJlbmRlclpvZE5vZGUoXG4gIG5vZGU6IEpzb25WYWx1ZSB8IHVuZGVmaW5lZCxcbiAgZGVwdGg6IG51bWJlcixcbiAgZW51bVZhbHVlTGltaXQ/OiBudW1iZXIsXG4pOiBzdHJpbmcge1xuICBpZiAobm9kZSA9PT0gdHJ1ZSkgcmV0dXJuIFwiei51bmtub3duKClcIjtcblxuICBpZiAoIWlzSnNvbk9iamVjdChub2RlKSkgcmV0dXJuIFwiei51bmtub3duKClcIjtcbiAgY29uc3Qgc2NoZW1hID0gbm9kZTtcblxuICBpZiAoQXJyYXkuaXNBcnJheShzY2hlbWEuZW51bSkpIHJldHVybiByZW5kZXJab2RFbnVtKHNjaGVtYS5lbnVtLCBlbnVtVmFsdWVMaW1pdCk7XG5cbiAgaWYgKHNjaGVtYS5jb25zdCAhPT0gdW5kZWZpbmVkKSByZXR1cm4gYHoubGl0ZXJhbCgke0pTT04uc3RyaW5naWZ5KHNjaGVtYS5jb25zdCl9KWA7XG5cbiAgY29uc3QgdmFyaWFudHMgPSBzY2hlbWEuYW55T2YgPz8gc2NoZW1hLm9uZU9mO1xuXG4gIGlmIChBcnJheS5pc0FycmF5KHZhcmlhbnRzKSAmJiB2YXJpYW50cy5sZW5ndGggPiAwKSB7XG4gICAgY29uc3QgcmVuZGVyZWQgPSBbXG4gICAgICAuLi5uZXcgU2V0KHZhcmlhbnRzLm1hcCgodmFyaWFudCkgPT4gcmVuZGVyWm9kTm9kZSh2YXJpYW50LCBkZXB0aCwgZW51bVZhbHVlTGltaXQpKSksXG4gICAgXTtcblxuICAgIHJldHVybiByZW5kZXJlZC5sZW5ndGggPT09IDFcbiAgICAgID8gKHJlbmRlcmVkWzBdID8/IFwiei51bmtub3duKClcIilcbiAgICAgIDogYHoudW5pb24oWyR7cmVuZGVyZWQuam9pbihcIiwgXCIpfV0pYDtcbiAgfVxuXG4gIGNvbnN0IHR5cGUgPSBzY2hlbWEudHlwZTtcblxuICBpZiAoQXJyYXkuaXNBcnJheSh0eXBlKSkge1xuICAgIGNvbnN0IHJlbmRlcmVkID0gWy4uLm5ldyBTZXQodHlwZS5tYXAocmVuZGVyWm9kUHJpbWl0aXZlKSldO1xuXG4gICAgcmV0dXJuIHJlbmRlcmVkLmxlbmd0aCA9PT0gMVxuICAgICAgPyAocmVuZGVyZWRbMF0gPz8gXCJ6LnVua25vd24oKVwiKVxuICAgICAgOiBgei51bmlvbihbJHtyZW5kZXJlZC5qb2luKFwiLCBcIil9XSlgO1xuICB9XG5cbiAgaWYgKHR5cGUgPT09IFwib2JqZWN0XCIgfHwgKHR5cGUgPT09IHVuZGVmaW5lZCAmJiBzY2hlbWEucHJvcGVydGllcykpIHtcbiAgICBjb25zdCBwcm9wZXJ0aWVzID0gc2NoZW1hUHJvcGVydGllcyhzY2hlbWEpO1xuICAgIGNvbnN0IHJlcXVpcmVkID0gcmVxdWlyZWRLZXlzKHNjaGVtYSk7XG4gICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKHByb3BlcnRpZXMpO1xuXG4gICAgaWYgKGtleXMubGVuZ3RoID09PSAwKSByZXR1cm4gXCJ6Lm9iamVjdCh7fSlcIjtcblxuICAgIGNvbnN0IG9yZGVyZWRLZXlzID0gW1xuICAgICAgLi4ua2V5cy5maWx0ZXIoKGtleSkgPT4gcmVxdWlyZWQuaGFzKGtleSkpLFxuICAgICAgLi4ua2V5cy5maWx0ZXIoKGtleSkgPT4gIXJlcXVpcmVkLmhhcyhrZXkpKSxcbiAgICBdO1xuXG4gICAgY29uc3QgaW5uZXIgPSBcIiAgXCIucmVwZWF0KGRlcHRoICsgMSk7XG5cbiAgICBjb25zdCBsaW5lcyA9IG9yZGVyZWRLZXlzLm1hcCgoa2V5KSA9PiB7XG4gICAgICBjb25zdCBwcm9wZXJ0eVNjaGVtYSA9IHByb3BlcnRpZXNba2V5XTtcbiAgICAgIGNvbnN0IHJlbmRlcmVkID0gcmVuZGVyWm9kTm9kZShwcm9wZXJ0eVNjaGVtYSwgZGVwdGggKyAxLCBlbnVtVmFsdWVMaW1pdCk7XG4gICAgICBjb25zdCBvcHRpb25hbCA9IHJlcXVpcmVkLmhhcyhrZXkpID8gcmVuZGVyZWQgOiBgJHtyZW5kZXJlZH0ub3B0aW9uYWwoKWA7XG5cbiAgICAgIGNvbnN0IGRlZmF1bHRWYWx1ZSA9XG4gICAgICAgIGlzSnNvbk9iamVjdChwcm9wZXJ0eVNjaGVtYSkgJiYgT2JqZWN0Lmhhc093bihwcm9wZXJ0eVNjaGVtYSwgXCJkZWZhdWx0XCIpXG4gICAgICAgICAgPyBKU09OLnN0cmluZ2lmeShwcm9wZXJ0eVNjaGVtYS5kZWZhdWx0KVxuICAgICAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgICBjb25zdCBkZWZhdWx0Q29tbWVudCA9IGRlZmF1bHRWYWx1ZSA9PT0gdW5kZWZpbmVkID8gXCJcIiA6IGAgLy8gZGVmYXVsdD0ke2RlZmF1bHRWYWx1ZX1gO1xuXG4gICAgICByZXR1cm4gYCR7aW5uZXJ9JHtyZW5kZXJLZXkoa2V5KX06ICR7b3B0aW9uYWx9LCR7ZGVmYXVsdENvbW1lbnR9YDtcbiAgICB9KTtcblxuICAgIHJldHVybiBgei5vYmplY3Qoe1xcbiR7bGluZXMuam9pbihcIlxcblwiKX1cXG4ke1wiICBcIi5yZXBlYXQoZGVwdGgpfX0pYDtcbiAgfVxuXG4gIGlmICh0eXBlID09PSBcImFycmF5XCIpIHtcbiAgICByZXR1cm4gYHouYXJyYXkoJHtyZW5kZXJab2ROb2RlKHNjaGVtYS5pdGVtcywgZGVwdGgsIGVudW1WYWx1ZUxpbWl0KX0pYDtcbiAgfVxuXG4gIHJldHVybiByZW5kZXJab2RQcmltaXRpdmUodHlwZSk7XG59XG5cbmZ1bmN0aW9uIHJlbmRlck5vZGUobm9kZTogSnNvblZhbHVlIHwgdW5kZWZpbmVkLCBkZXB0aDogbnVtYmVyKTogc3RyaW5nIHtcbiAgaWYgKG5vZGUgPT09IHRydWUpIHJldHVybiBcInVua25vd25cIjtcblxuICBpZiAoIWlzSnNvbk9iamVjdChub2RlKSkgcmV0dXJuIFwidW5rbm93blwiO1xuICBjb25zdCBzY2hlbWEgPSBub2RlO1xuXG4gIGlmIChBcnJheS5pc0FycmF5KHNjaGVtYS5lbnVtKSkge1xuICAgIHJldHVybiBzY2hlbWEuZW51bS5tYXAoKHZhbHVlKSA9PiBKU09OLnN0cmluZ2lmeSh2YWx1ZSkpLmpvaW4oXCIgfCBcIik7XG4gIH1cblxuICBpZiAoc2NoZW1hLmNvbnN0ICE9PSB1bmRlZmluZWQpIHJldHVybiBKU09OLnN0cmluZ2lmeShzY2hlbWEuY29uc3QpO1xuXG4gIGNvbnN0IHZhcmlhbnRzID0gc2NoZW1hLmFueU9mID8/IHNjaGVtYS5vbmVPZjtcblxuICBpZiAoQXJyYXkuaXNBcnJheSh2YXJpYW50cykgJiYgdmFyaWFudHMubGVuZ3RoID4gMCkge1xuICAgIHJldHVybiBbLi4ubmV3IFNldCh2YXJpYW50cy5tYXAoKHZhcmlhbnQpID0+IHJlbmRlck5vZGUodmFyaWFudCwgZGVwdGgpKSldLmpvaW4oXCIgfCBcIik7XG4gIH1cblxuICBjb25zdCB0eXBlID0gc2NoZW1hLnR5cGU7XG5cbiAgaWYgKEFycmF5LmlzQXJyYXkodHlwZSkpIHtcbiAgICByZXR1cm4gWy4uLm5ldyBTZXQodHlwZS5tYXAocmVuZGVyUHJpbWl0aXZlKSldLmpvaW4oXCIgfCBcIik7XG4gIH1cblxuICBpZiAodHlwZSA9PT0gXCJvYmplY3RcIiB8fCAodHlwZSA9PT0gdW5kZWZpbmVkICYmIHNjaGVtYS5wcm9wZXJ0aWVzKSkge1xuICAgIGNvbnN0IHByb3BlcnRpZXMgPSBzY2hlbWFQcm9wZXJ0aWVzKHNjaGVtYSk7XG4gICAgY29uc3QgcmVxdWlyZWQgPSByZXF1aXJlZEtleXMoc2NoZW1hKTtcbiAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMocHJvcGVydGllcyk7XG5cbiAgICBpZiAoa2V5cy5sZW5ndGggPT09IDApIHJldHVybiBcIlJlY29yZDxzdHJpbmcsIHVua25vd24+XCI7XG4gICAgY29uc3QgaW5uZXIgPSBcIiAgXCIucmVwZWF0KGRlcHRoICsgMSk7XG5cbiAgICBjb25zdCBsaW5lcyA9IGtleXMubWFwKFxuICAgICAgKGtleSkgPT5cbiAgICAgICAgYCR7aW5uZXJ9JHtyZW5kZXJLZXkoa2V5KX0ke3JlcXVpcmVkLmhhcyhrZXkpID8gXCJcIiA6IFwiP1wifTogJHtyZW5kZXJOb2RlKHByb3BlcnRpZXNba2V5XSwgZGVwdGggKyAxKX1gLFxuICAgICk7XG5cbiAgICByZXR1cm4gYHtcXG4ke2xpbmVzLmpvaW4oXCJcXG5cIil9XFxuJHtcIiAgXCIucmVwZWF0KGRlcHRoKX19YDtcbiAgfVxuXG4gIGlmICh0eXBlID09PSBcImFycmF5XCIpIHtcbiAgICBjb25zdCBpdGVtID0gcmVuZGVyTm9kZShzY2hlbWEuaXRlbXMsIGRlcHRoKTtcblxuICAgIC8vIOycoOuLiOyYqCDsmpTshozripQg6rSE7Zi46rCAIOyXhuycvOuptCBgQSB8IEJbXWAg66GcIOyemOuquyDsnb3tnozri6QuXG4gICAgaWYgKGl0ZW0uaW5jbHVkZXMoXCIgfCBcIikpIHJldHVybiBgKCR7aXRlbX0pW11gO1xuXG4gICAgcmV0dXJuIGAke2l0ZW19W11gO1xuICB9XG5cbiAgcmV0dXJuIHJlbmRlclByaW1pdGl2ZSh0eXBlKTtcbn1cblxuLyoqIOydtOuvuCDtjIzsi7HrkJwg7Iqk7YKk66eIIOqwkuyaqSDigJQg7Zi47Lac67aA6rCAIOqwmeydgCBKU09OIOydhCDrkZAg67KIIO2MjOyLse2VmOyngCDslYrqsowg7ZWc64ukLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlbmRlclBhcnNlZEpzb25TY2hlbWFUeXBlVGV4dChzY2hlbWE6IEpzb25WYWx1ZSwgbmFtZSA9IFwiUmVzcG9uc2VcIik6IHN0cmluZyB7XG4gIHJldHVybiBgdHlwZSAke25hbWV9ID0gJHtyZW5kZXJOb2RlKHNjaGVtYSwgMCl9YDtcbn1cblxuLyoqIFRvb2wgaW5wdXQg6rOE7JW97JqpIO2RnOyLnCDsoITsmqkgWm9kIOy9lOuTnC4g6rKA7KadIOygnOyVveydgCDsnZjrj4TsoIHsnLzroZwg7IOd65617ZWc64ukLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlbmRlckpzb25TY2hlbWFab2RUZXh0KHNjaGVtYTogSnNvblZhbHVlLCBlbnVtVmFsdWVMaW1pdD86IG51bWJlcik6IHN0cmluZyB7XG4gIHJldHVybiByZW5kZXJab2ROb2RlKHNjaGVtYSwgMCwgZW51bVZhbHVlTGltaXQpO1xufVxuXG4vKiog7Iuk7YyoKO2MjOyLsSDrtojqsIAg65OxKSDsi5wgbnVsbCDigJQg7Zi47Lac67aA6rCAIO2RnOyLnCDsnpDssrTrpbwg7IOd65617ZWc64ukLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlbmRlckpzb25TY2hlbWFUeXBlVGV4dChzY2hlbWFKc29uOiBzdHJpbmcsIG5hbWUgPSBcIlJlc3BvbnNlXCIpOiBzdHJpbmcgfCBudWxsIHtcbiAgdHJ5IHtcbiAgICAvLyBKU09OLnBhcnNlIHdpdGhvdXQgYSByZXZpdmVyIHlpZWxkcyBvbmx5IEpTT04gdmFsdWVzLlxuICAgIGNvbnN0IHNjaGVtYTogSnNvblZhbHVlID0gSlNPTi5wYXJzZShzY2hlbWFKc29uKTtcblxuICAgIHJldHVybiByZW5kZXJQYXJzZWRKc29uU2NoZW1hVHlwZVRleHQoc2NoZW1hLCBuYW1lKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7O0FBa0JBLE1BQWEsZUFBZTtBQUM1QixNQUFNLFdBQVcsSUFBSSxPQUFPLElBQUksYUFBYSxFQUFFO0FBRS9DLFNBQVMsVUFBVSxLQUFxQjtDQUN0QyxPQUFPLFNBQVMsS0FBSyxHQUFHLElBQUksTUFBTSxLQUFLLFVBQVUsR0FBRztBQUN0RDtBQUVBLFNBQVMsZ0JBQWdCLE1BQXFDO0NBQzVELElBQUksU0FBUyxVQUFVLE9BQU87Q0FFOUIsSUFBSSxTQUFTLFlBQVksU0FBUyxXQUFXLE9BQU87Q0FFcEQsSUFBSSxTQUFTLFdBQVcsT0FBTztD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