@waniwani/sdk 0.19.9 → 0.20.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 (741) hide show
  1. package/dist/chat/embed.js +1 -1
  2. package/dist/chat/index.d.ts +2 -28
  3. package/dist/chat/index.js +8 -15
  4. package/dist/chat/index.js.map +1 -1
  5. package/dist/chat/styles.css +1 -1
  6. package/dist/mcp/index.d.ts +18 -443
  7. package/dist/mcp/index.js +5 -5
  8. package/dist/mcp/index.js.map +1 -1
  9. package/dist/mcp/react.d.ts +1 -645
  10. package/dist/mcp/react.js +1 -66
  11. package/dist/mcp/react.js.map +1 -1
  12. package/package.json +1 -41
  13. package/dist/abap-3IAGZ3PS.js +0 -2
  14. package/dist/abap-3IAGZ3PS.js.map +0 -1
  15. package/dist/actionscript-3-C46RIPM4.js +0 -2
  16. package/dist/actionscript-3-C46RIPM4.js.map +0 -1
  17. package/dist/ada-DNTYS66P.js +0 -2
  18. package/dist/ada-DNTYS66P.js.map +0 -1
  19. package/dist/andromeeda-XSK3JERF.js +0 -2
  20. package/dist/andromeeda-XSK3JERF.js.map +0 -1
  21. package/dist/angular-html-GK625GFM.js +0 -2
  22. package/dist/angular-html-GK625GFM.js.map +0 -1
  23. package/dist/angular-ts-BBPQXDS2.js +0 -2
  24. package/dist/angular-ts-BBPQXDS2.js.map +0 -1
  25. package/dist/apache-DU26FTNI.js +0 -2
  26. package/dist/apache-DU26FTNI.js.map +0 -1
  27. package/dist/apex-OU63AG2P.js +0 -2
  28. package/dist/apex-OU63AG2P.js.map +0 -1
  29. package/dist/apl-JGB4KP74.js +0 -2
  30. package/dist/apl-JGB4KP74.js.map +0 -1
  31. package/dist/applescript-TT4XSRXH.js +0 -2
  32. package/dist/applescript-TT4XSRXH.js.map +0 -1
  33. package/dist/ara-Q7AJDKA4.js +0 -2
  34. package/dist/ara-Q7AJDKA4.js.map +0 -1
  35. package/dist/asciidoc-WADBFJPS.js +0 -2
  36. package/dist/asciidoc-WADBFJPS.js.map +0 -1
  37. package/dist/asm-D3LJR7GV.js +0 -2
  38. package/dist/asm-D3LJR7GV.js.map +0 -1
  39. package/dist/astro-K7JGTCPV.js +0 -2
  40. package/dist/astro-K7JGTCPV.js.map +0 -1
  41. package/dist/aurora-x-CGSVHL4H.js +0 -2
  42. package/dist/aurora-x-CGSVHL4H.js.map +0 -1
  43. package/dist/awk-DCAM52A7.js +0 -2
  44. package/dist/awk-DCAM52A7.js.map +0 -1
  45. package/dist/ayu-dark-XYI57HMC.js +0 -2
  46. package/dist/ayu-dark-XYI57HMC.js.map +0 -1
  47. package/dist/ayu-light-4PSGMDIC.js +0 -2
  48. package/dist/ayu-light-4PSGMDIC.js.map +0 -1
  49. package/dist/ayu-mirage-DU5SNMZX.js +0 -2
  50. package/dist/ayu-mirage-DU5SNMZX.js.map +0 -1
  51. package/dist/ballerina-44XARFEK.js +0 -2
  52. package/dist/ballerina-44XARFEK.js.map +0 -1
  53. package/dist/bat-WM4RL2AB.js +0 -2
  54. package/dist/bat-WM4RL2AB.js.map +0 -1
  55. package/dist/beancount-5PUWGPVT.js +0 -2
  56. package/dist/beancount-5PUWGPVT.js.map +0 -1
  57. package/dist/berry-YAK4XTWX.js +0 -2
  58. package/dist/berry-YAK4XTWX.js.map +0 -1
  59. package/dist/bibtex-2ISWNMJJ.js +0 -2
  60. package/dist/bibtex-2ISWNMJJ.js.map +0 -1
  61. package/dist/bicep-EOACOM4G.js +0 -2
  62. package/dist/bicep-EOACOM4G.js.map +0 -1
  63. package/dist/blade-RWJJQSLU.js +0 -2
  64. package/dist/blade-RWJJQSLU.js.map +0 -1
  65. package/dist/bsl-TNLQPNE3.js +0 -2
  66. package/dist/bsl-TNLQPNE3.js.map +0 -1
  67. package/dist/c-G7V525MX.js +0 -2
  68. package/dist/c-G7V525MX.js.map +0 -1
  69. package/dist/c3-CDQIRWGP.js +0 -2
  70. package/dist/c3-CDQIRWGP.js.map +0 -1
  71. package/dist/cadence-U32GKKTR.js +0 -2
  72. package/dist/cadence-U32GKKTR.js.map +0 -1
  73. package/dist/cairo-26RR6N4F.js +0 -2
  74. package/dist/cairo-26RR6N4F.js.map +0 -1
  75. package/dist/catppuccin-frappe-UZ4N3Z4I.js +0 -2
  76. package/dist/catppuccin-frappe-UZ4N3Z4I.js.map +0 -1
  77. package/dist/catppuccin-latte-GCOWYLZG.js +0 -2
  78. package/dist/catppuccin-latte-GCOWYLZG.js.map +0 -1
  79. package/dist/catppuccin-macchiato-PJD7W5WJ.js +0 -2
  80. package/dist/catppuccin-macchiato-PJD7W5WJ.js.map +0 -1
  81. package/dist/catppuccin-mocha-RRH4FOBS.js +0 -2
  82. package/dist/catppuccin-mocha-RRH4FOBS.js.map +0 -1
  83. package/dist/chat/express-js/index.d.ts +0 -551
  84. package/dist/chat/express-js/index.js +0 -10
  85. package/dist/chat/express-js/index.js.map +0 -1
  86. package/dist/chat/next-js/index.d.ts +0 -512
  87. package/dist/chat/next-js/index.js +0 -10
  88. package/dist/chat/next-js/index.js.map +0 -1
  89. package/dist/chat/server/index.d.ts +0 -145
  90. package/dist/chat/server/index.js +0 -2
  91. package/dist/chat/server/index.js.map +0 -1
  92. package/dist/chunk-2JA3PUM5.js +0 -2
  93. package/dist/chunk-2JA3PUM5.js.map +0 -1
  94. package/dist/chunk-2NQMCQ7O.js +0 -2
  95. package/dist/chunk-2NQMCQ7O.js.map +0 -1
  96. package/dist/chunk-5336KK5F.js +0 -2
  97. package/dist/chunk-5336KK5F.js.map +0 -1
  98. package/dist/chunk-5MP5AWBX.js +0 -2
  99. package/dist/chunk-5MP5AWBX.js.map +0 -1
  100. package/dist/chunk-5XSU7WGG.js +0 -2
  101. package/dist/chunk-5XSU7WGG.js.map +0 -1
  102. package/dist/chunk-5XYD2WP7.js +0 -2
  103. package/dist/chunk-5XYD2WP7.js.map +0 -1
  104. package/dist/chunk-6HXHFO4V.js +0 -2
  105. package/dist/chunk-6HXHFO4V.js.map +0 -1
  106. package/dist/chunk-6NKC4ZWB.js +0 -2
  107. package/dist/chunk-6NKC4ZWB.js.map +0 -1
  108. package/dist/chunk-6NZAGCJE.js +0 -2
  109. package/dist/chunk-6NZAGCJE.js.map +0 -1
  110. package/dist/chunk-ATNVRAQT.js +0 -2
  111. package/dist/chunk-ATNVRAQT.js.map +0 -1
  112. package/dist/chunk-CESPFCBH.js +0 -2
  113. package/dist/chunk-CESPFCBH.js.map +0 -1
  114. package/dist/chunk-D622GSMB.js +0 -2
  115. package/dist/chunk-D622GSMB.js.map +0 -1
  116. package/dist/chunk-DP6SAQTK.js +0 -3
  117. package/dist/chunk-DP6SAQTK.js.map +0 -1
  118. package/dist/chunk-EDNJDK7E.js +0 -2
  119. package/dist/chunk-EDNJDK7E.js.map +0 -1
  120. package/dist/chunk-EIMGOVMA.js +0 -2
  121. package/dist/chunk-EIMGOVMA.js.map +0 -1
  122. package/dist/chunk-F5JZ4PC2.js +0 -2
  123. package/dist/chunk-F5JZ4PC2.js.map +0 -1
  124. package/dist/chunk-GMELQP3T.js +0 -2
  125. package/dist/chunk-GMELQP3T.js.map +0 -1
  126. package/dist/chunk-HFFYDWFN.js +0 -2
  127. package/dist/chunk-HFFYDWFN.js.map +0 -1
  128. package/dist/chunk-IL2UKTRC.js +0 -2
  129. package/dist/chunk-IL2UKTRC.js.map +0 -1
  130. package/dist/chunk-IPSY5OIT.js +0 -2
  131. package/dist/chunk-IPSY5OIT.js.map +0 -1
  132. package/dist/chunk-IRS2AGXK.js +0 -2
  133. package/dist/chunk-IRS2AGXK.js.map +0 -1
  134. package/dist/chunk-L4BGOZXV.js +0 -2
  135. package/dist/chunk-L4BGOZXV.js.map +0 -1
  136. package/dist/chunk-LAG2OMSH.js +0 -2
  137. package/dist/chunk-LAG2OMSH.js.map +0 -1
  138. package/dist/chunk-LMG77D32.js +0 -2
  139. package/dist/chunk-LMG77D32.js.map +0 -1
  140. package/dist/chunk-LPD7BHH5.js +0 -2
  141. package/dist/chunk-LPD7BHH5.js.map +0 -1
  142. package/dist/chunk-MLY24DR2.js +0 -2
  143. package/dist/chunk-MLY24DR2.js.map +0 -1
  144. package/dist/chunk-NE26G5AT.js +0 -2
  145. package/dist/chunk-NE26G5AT.js.map +0 -1
  146. package/dist/chunk-OHRY6PPX.js +0 -2
  147. package/dist/chunk-OHRY6PPX.js.map +0 -1
  148. package/dist/chunk-OJQVGZV3.js +0 -2
  149. package/dist/chunk-OJQVGZV3.js.map +0 -1
  150. package/dist/chunk-ORTYTFGK.js +0 -2
  151. package/dist/chunk-ORTYTFGK.js.map +0 -1
  152. package/dist/chunk-P7NSD3M4.js +0 -2
  153. package/dist/chunk-P7NSD3M4.js.map +0 -1
  154. package/dist/chunk-PXEOO2Q3.js +0 -2
  155. package/dist/chunk-PXEOO2Q3.js.map +0 -1
  156. package/dist/chunk-PYLRF5BB.js +0 -8
  157. package/dist/chunk-PYLRF5BB.js.map +0 -1
  158. package/dist/chunk-QP24BTOT.js +0 -2
  159. package/dist/chunk-QP24BTOT.js.map +0 -1
  160. package/dist/chunk-R6LESDWJ.js +0 -2
  161. package/dist/chunk-R6LESDWJ.js.map +0 -1
  162. package/dist/chunk-REK5PMSH.js +0 -2
  163. package/dist/chunk-REK5PMSH.js.map +0 -1
  164. package/dist/chunk-RXLAF3LU.js +0 -2
  165. package/dist/chunk-RXLAF3LU.js.map +0 -1
  166. package/dist/chunk-RZKVTH7F.js +0 -9
  167. package/dist/chunk-RZKVTH7F.js.map +0 -1
  168. package/dist/chunk-S2PPVC2B.js +0 -2
  169. package/dist/chunk-S2PPVC2B.js.map +0 -1
  170. package/dist/chunk-SREBMPDB.js +0 -2
  171. package/dist/chunk-SREBMPDB.js.map +0 -1
  172. package/dist/chunk-VDGF5EL2.js +0 -2
  173. package/dist/chunk-VDGF5EL2.js.map +0 -1
  174. package/dist/chunk-W22LK3TM.js +0 -2
  175. package/dist/chunk-W22LK3TM.js.map +0 -1
  176. package/dist/chunk-W4SPRY5O.js +0 -2
  177. package/dist/chunk-W4SPRY5O.js.map +0 -1
  178. package/dist/chunk-WJGP36CH.js +0 -2
  179. package/dist/chunk-WJGP36CH.js.map +0 -1
  180. package/dist/chunk-YGW7RGXA.js +0 -2
  181. package/dist/chunk-YGW7RGXA.js.map +0 -1
  182. package/dist/chunk-YJSOBBUY.js +0 -2
  183. package/dist/chunk-YJSOBBUY.js.map +0 -1
  184. package/dist/chunk-YP6YTC7R.js +0 -115
  185. package/dist/chunk-YP6YTC7R.js.map +0 -1
  186. package/dist/chunk-YTXGYW4C.js +0 -2
  187. package/dist/chunk-YTXGYW4C.js.map +0 -1
  188. package/dist/chunk-Z7GLL6ID.js +0 -2
  189. package/dist/chunk-Z7GLL6ID.js.map +0 -1
  190. package/dist/clarity-4JIHRN2V.js +0 -2
  191. package/dist/clarity-4JIHRN2V.js.map +0 -1
  192. package/dist/clojure-PKTTXYYS.js +0 -2
  193. package/dist/clojure-PKTTXYYS.js.map +0 -1
  194. package/dist/cmake-HXKHWGGH.js +0 -2
  195. package/dist/cmake-HXKHWGGH.js.map +0 -1
  196. package/dist/cobol-ZFZ6ZP6X.js +0 -2
  197. package/dist/cobol-ZFZ6ZP6X.js.map +0 -1
  198. package/dist/code-block-37QAKDTI-Y3BUEJRG.js +0 -3
  199. package/dist/code-block-37QAKDTI-Y3BUEJRG.js.map +0 -1
  200. package/dist/codeowners-WCXRHQ2R.js +0 -2
  201. package/dist/codeowners-WCXRHQ2R.js.map +0 -1
  202. package/dist/codeql-XZZ2USHF.js +0 -2
  203. package/dist/codeql-XZZ2USHF.js.map +0 -1
  204. package/dist/coffee-SGQWHBUL.js +0 -2
  205. package/dist/coffee-SGQWHBUL.js.map +0 -1
  206. package/dist/common-lisp-IK3DGBCK.js +0 -2
  207. package/dist/common-lisp-IK3DGBCK.js.map +0 -1
  208. package/dist/coq-UPTUVPLH.js +0 -2
  209. package/dist/coq-UPTUVPLH.js.map +0 -1
  210. package/dist/cpp-HLYUQ6RF.js +0 -2
  211. package/dist/cpp-HLYUQ6RF.js.map +0 -1
  212. package/dist/crystal-UPNOBGN4.js +0 -2
  213. package/dist/crystal-UPNOBGN4.js.map +0 -1
  214. package/dist/csharp-6EXQ7B24.js +0 -2
  215. package/dist/csharp-6EXQ7B24.js.map +0 -1
  216. package/dist/css-MH4LSMNV.js +0 -2
  217. package/dist/css-MH4LSMNV.js.map +0 -1
  218. package/dist/csv-CRTD5FOL.js +0 -2
  219. package/dist/csv-CRTD5FOL.js.map +0 -1
  220. package/dist/cue-IFMTDLM2.js +0 -2
  221. package/dist/cue-IFMTDLM2.js.map +0 -1
  222. package/dist/cypher-WH7754G7.js +0 -2
  223. package/dist/cypher-WH7754G7.js.map +0 -1
  224. package/dist/d-VFMGCSG3.js +0 -2
  225. package/dist/d-VFMGCSG3.js.map +0 -1
  226. package/dist/dark-plus-PSM5XP2I.js +0 -2
  227. package/dist/dark-plus-PSM5XP2I.js.map +0 -1
  228. package/dist/dart-CSERBUPM.js +0 -2
  229. package/dist/dart-CSERBUPM.js.map +0 -1
  230. package/dist/dax-Y4DTPR3K.js +0 -2
  231. package/dist/dax-Y4DTPR3K.js.map +0 -1
  232. package/dist/desktop-UYAYGPQT.js +0 -2
  233. package/dist/desktop-UYAYGPQT.js.map +0 -1
  234. package/dist/diff-BJDM3N45.js +0 -2
  235. package/dist/diff-BJDM3N45.js.map +0 -1
  236. package/dist/docker-UOM4Q7PD.js +0 -2
  237. package/dist/docker-UOM4Q7PD.js.map +0 -1
  238. package/dist/dotenv-LK44WBD3.js +0 -2
  239. package/dist/dotenv-LK44WBD3.js.map +0 -1
  240. package/dist/dracula-2VHT5LK5.js +0 -2
  241. package/dist/dracula-2VHT5LK5.js.map +0 -1
  242. package/dist/dracula-soft-MSCUO73T.js +0 -2
  243. package/dist/dracula-soft-MSCUO73T.js.map +0 -1
  244. package/dist/dream-maker-7RP4JRQH.js +0 -2
  245. package/dist/dream-maker-7RP4JRQH.js.map +0 -1
  246. package/dist/edge-XE5XFLFP.js +0 -2
  247. package/dist/edge-XE5XFLFP.js.map +0 -1
  248. package/dist/elixir-EXRA4QJX.js +0 -2
  249. package/dist/elixir-EXRA4QJX.js.map +0 -1
  250. package/dist/elm-THYL2NRS.js +0 -2
  251. package/dist/elm-THYL2NRS.js.map +0 -1
  252. package/dist/emacs-lisp-YHLQYGNI.js +0 -2
  253. package/dist/emacs-lisp-YHLQYGNI.js.map +0 -1
  254. package/dist/erb-LRUOJBTB.js +0 -2
  255. package/dist/erb-LRUOJBTB.js.map +0 -1
  256. package/dist/erlang-UNX5MMGA.js +0 -2
  257. package/dist/erlang-UNX5MMGA.js.map +0 -1
  258. package/dist/everforest-dark-AGVJEQ35.js +0 -2
  259. package/dist/everforest-dark-AGVJEQ35.js.map +0 -1
  260. package/dist/everforest-light-62GPFKVJ.js +0 -2
  261. package/dist/everforest-light-62GPFKVJ.js.map +0 -1
  262. package/dist/fennel-HYSSBG3N.js +0 -2
  263. package/dist/fennel-HYSSBG3N.js.map +0 -1
  264. package/dist/fish-PTKGQOJI.js +0 -2
  265. package/dist/fish-PTKGQOJI.js.map +0 -1
  266. package/dist/fluent-LEZHPPJV.js +0 -2
  267. package/dist/fluent-LEZHPPJV.js.map +0 -1
  268. package/dist/fortran-fixed-form-J5AMEFMB.js +0 -2
  269. package/dist/fortran-fixed-form-J5AMEFMB.js.map +0 -1
  270. package/dist/fortran-free-form-S3BNTBLS.js +0 -2
  271. package/dist/fortran-free-form-S3BNTBLS.js.map +0 -1
  272. package/dist/fsharp-H4OIW62Z.js +0 -2
  273. package/dist/fsharp-H4OIW62Z.js.map +0 -1
  274. package/dist/gdresource-A6NTYFLM.js +0 -2
  275. package/dist/gdresource-A6NTYFLM.js.map +0 -1
  276. package/dist/gdscript-YQUSJRNZ.js +0 -2
  277. package/dist/gdscript-YQUSJRNZ.js.map +0 -1
  278. package/dist/gdshader-S5432GFE.js +0 -2
  279. package/dist/gdshader-S5432GFE.js.map +0 -1
  280. package/dist/genie-RNVG5N7L.js +0 -2
  281. package/dist/genie-RNVG5N7L.js.map +0 -1
  282. package/dist/gherkin-E5R62T6O.js +0 -2
  283. package/dist/gherkin-E5R62T6O.js.map +0 -1
  284. package/dist/git-commit-QGH6XOBG.js +0 -2
  285. package/dist/git-commit-QGH6XOBG.js.map +0 -1
  286. package/dist/git-rebase-XTCZTXU4.js +0 -2
  287. package/dist/git-rebase-XTCZTXU4.js.map +0 -1
  288. package/dist/github-dark-5OJVMBCE.js +0 -2
  289. package/dist/github-dark-5OJVMBCE.js.map +0 -1
  290. package/dist/github-dark-default-4WERFSZW.js +0 -2
  291. package/dist/github-dark-default-4WERFSZW.js.map +0 -1
  292. package/dist/github-dark-dimmed-7VD3SZKC.js +0 -2
  293. package/dist/github-dark-dimmed-7VD3SZKC.js.map +0 -1
  294. package/dist/github-dark-high-contrast-FVMMS656.js +0 -2
  295. package/dist/github-dark-high-contrast-FVMMS656.js.map +0 -1
  296. package/dist/github-light-SE4LEKO7.js +0 -2
  297. package/dist/github-light-SE4LEKO7.js.map +0 -1
  298. package/dist/github-light-default-TV7BYQGI.js +0 -2
  299. package/dist/github-light-default-TV7BYQGI.js.map +0 -1
  300. package/dist/github-light-high-contrast-WKO4I3G7.js +0 -2
  301. package/dist/github-light-high-contrast-WKO4I3G7.js.map +0 -1
  302. package/dist/gleam-W5WZ7CST.js +0 -2
  303. package/dist/gleam-W5WZ7CST.js.map +0 -1
  304. package/dist/glimmer-js-JA25I4AE.js +0 -2
  305. package/dist/glimmer-js-JA25I4AE.js.map +0 -1
  306. package/dist/glimmer-ts-CKELYRRF.js +0 -2
  307. package/dist/glimmer-ts-CKELYRRF.js.map +0 -1
  308. package/dist/glsl-PVW2OPUD.js +0 -2
  309. package/dist/glsl-PVW2OPUD.js.map +0 -1
  310. package/dist/gn-FCAO7WI5.js +0 -2
  311. package/dist/gn-FCAO7WI5.js.map +0 -1
  312. package/dist/gnuplot-Q6SE5CHZ.js +0 -2
  313. package/dist/gnuplot-Q6SE5CHZ.js.map +0 -1
  314. package/dist/go-CPCZAAWX.js +0 -2
  315. package/dist/go-CPCZAAWX.js.map +0 -1
  316. package/dist/graphql-UN5O7U5U.js +0 -2
  317. package/dist/graphql-UN5O7U5U.js.map +0 -1
  318. package/dist/groovy-PJAEBBJY.js +0 -2
  319. package/dist/groovy-PJAEBBJY.js.map +0 -1
  320. package/dist/gruvbox-dark-hard-LOYZQIGI.js +0 -2
  321. package/dist/gruvbox-dark-hard-LOYZQIGI.js.map +0 -1
  322. package/dist/gruvbox-dark-medium-UIMSJJ6K.js +0 -2
  323. package/dist/gruvbox-dark-medium-UIMSJJ6K.js.map +0 -1
  324. package/dist/gruvbox-dark-soft-PU6RNTTO.js +0 -2
  325. package/dist/gruvbox-dark-soft-PU6RNTTO.js.map +0 -1
  326. package/dist/gruvbox-light-hard-ZQJ7XSZF.js +0 -2
  327. package/dist/gruvbox-light-hard-ZQJ7XSZF.js.map +0 -1
  328. package/dist/gruvbox-light-medium-CD3ZGYV6.js +0 -2
  329. package/dist/gruvbox-light-medium-CD3ZGYV6.js.map +0 -1
  330. package/dist/gruvbox-light-soft-S74MAGOM.js +0 -2
  331. package/dist/gruvbox-light-soft-S74MAGOM.js.map +0 -1
  332. package/dist/hack-QIUJFE3G.js +0 -2
  333. package/dist/hack-QIUJFE3G.js.map +0 -1
  334. package/dist/haml-JQIESO7E.js +0 -2
  335. package/dist/haml-JQIESO7E.js.map +0 -1
  336. package/dist/handlebars-UBV5AWUH.js +0 -2
  337. package/dist/handlebars-UBV5AWUH.js.map +0 -1
  338. package/dist/haskell-NX6XRMNO.js +0 -2
  339. package/dist/haskell-NX6XRMNO.js.map +0 -1
  340. package/dist/haxe-7YNB7FVC.js +0 -2
  341. package/dist/haxe-7YNB7FVC.js.map +0 -1
  342. package/dist/hcl-ZF75ASCX.js +0 -2
  343. package/dist/hcl-ZF75ASCX.js.map +0 -1
  344. package/dist/hjson-65TX6QOC.js +0 -2
  345. package/dist/hjson-65TX6QOC.js.map +0 -1
  346. package/dist/hlsl-U2O526MI.js +0 -2
  347. package/dist/hlsl-U2O526MI.js.map +0 -1
  348. package/dist/horizon-EAAZ4KVN.js +0 -2
  349. package/dist/horizon-EAAZ4KVN.js.map +0 -1
  350. package/dist/houston-UNRWGR67.js +0 -2
  351. package/dist/houston-UNRWGR67.js.map +0 -1
  352. package/dist/html-AWDHWPK7.js +0 -2
  353. package/dist/html-AWDHWPK7.js.map +0 -1
  354. package/dist/html-derivative-QY3ZIV7G.js +0 -2
  355. package/dist/html-derivative-QY3ZIV7G.js.map +0 -1
  356. package/dist/http-KIGXJYY6.js +0 -2
  357. package/dist/http-KIGXJYY6.js.map +0 -1
  358. package/dist/hurl-BZB5LDD5.js +0 -2
  359. package/dist/hurl-BZB5LDD5.js.map +0 -1
  360. package/dist/hxml-IGTXIURH.js +0 -2
  361. package/dist/hxml-IGTXIURH.js.map +0 -1
  362. package/dist/hy-CLDGXJYP.js +0 -2
  363. package/dist/hy-CLDGXJYP.js.map +0 -1
  364. package/dist/imba-NWHLCVE5.js +0 -2
  365. package/dist/imba-NWHLCVE5.js.map +0 -1
  366. package/dist/ini-R6WYP7NC.js +0 -2
  367. package/dist/ini-R6WYP7NC.js.map +0 -1
  368. package/dist/java-DHBXDMBM.js +0 -2
  369. package/dist/java-DHBXDMBM.js.map +0 -1
  370. package/dist/javascript-GNUEDNHO.js +0 -2
  371. package/dist/javascript-GNUEDNHO.js.map +0 -1
  372. package/dist/jinja-AEVQQKWS.js +0 -2
  373. package/dist/jinja-AEVQQKWS.js.map +0 -1
  374. package/dist/jison-64A6IJCV.js +0 -2
  375. package/dist/jison-64A6IJCV.js.map +0 -1
  376. package/dist/json-2ELCHKXT.js +0 -2
  377. package/dist/json-2ELCHKXT.js.map +0 -1
  378. package/dist/json5-QRH5UJYD.js +0 -2
  379. package/dist/json5-QRH5UJYD.js.map +0 -1
  380. package/dist/jsonc-IXPVR4NY.js +0 -2
  381. package/dist/jsonc-IXPVR4NY.js.map +0 -1
  382. package/dist/jsonl-C57GMUK5.js +0 -2
  383. package/dist/jsonl-C57GMUK5.js.map +0 -1
  384. package/dist/jsonnet-VNADFLKI.js +0 -2
  385. package/dist/jsonnet-VNADFLKI.js.map +0 -1
  386. package/dist/jssm-CW4ZYDSF.js +0 -2
  387. package/dist/jssm-CW4ZYDSF.js.map +0 -1
  388. package/dist/jsx-YTENXENT.js +0 -2
  389. package/dist/jsx-YTENXENT.js.map +0 -1
  390. package/dist/julia-75QR2XDN.js +0 -2
  391. package/dist/julia-75QR2XDN.js.map +0 -1
  392. package/dist/kanagawa-dragon-BOSCCB42.js +0 -2
  393. package/dist/kanagawa-dragon-BOSCCB42.js.map +0 -1
  394. package/dist/kanagawa-lotus-NXMB2IVI.js +0 -2
  395. package/dist/kanagawa-lotus-NXMB2IVI.js.map +0 -1
  396. package/dist/kanagawa-wave-YOHS63UF.js +0 -2
  397. package/dist/kanagawa-wave-YOHS63UF.js.map +0 -1
  398. package/dist/kdl-X3AS2HRT.js +0 -2
  399. package/dist/kdl-X3AS2HRT.js.map +0 -1
  400. package/dist/kotlin-WGITM75W.js +0 -2
  401. package/dist/kotlin-WGITM75W.js.map +0 -1
  402. package/dist/kusto-LT46F7AO.js +0 -2
  403. package/dist/kusto-LT46F7AO.js.map +0 -1
  404. package/dist/laserwave-TS4AG4VO.js +0 -2
  405. package/dist/laserwave-TS4AG4VO.js.map +0 -1
  406. package/dist/latex-R4PJ7JDY.js +0 -2
  407. package/dist/latex-R4PJ7JDY.js.map +0 -1
  408. package/dist/lean-DYWOENAS.js +0 -2
  409. package/dist/lean-DYWOENAS.js.map +0 -1
  410. package/dist/legacy/chat/express-js/index.d.ts +0 -551
  411. package/dist/legacy/chat/express-js/index.js +0 -10
  412. package/dist/legacy/chat/express-js/index.js.map +0 -1
  413. package/dist/legacy/chat/next-js/index.d.ts +0 -512
  414. package/dist/legacy/chat/next-js/index.js +0 -10
  415. package/dist/legacy/chat/next-js/index.js.map +0 -1
  416. package/dist/legacy/index.d.ts +0 -1820
  417. package/dist/legacy/index.js +0 -123
  418. package/dist/legacy/index.js.map +0 -1
  419. package/dist/legacy/mcp/react.d.ts +0 -645
  420. package/dist/legacy/mcp/react.js +0 -68
  421. package/dist/legacy/mcp/react.js.map +0 -1
  422. package/dist/less-ZYJT7MPU.js +0 -2
  423. package/dist/less-ZYJT7MPU.js.map +0 -1
  424. package/dist/light-plus-2HYW3NJ6.js +0 -2
  425. package/dist/light-plus-2HYW3NJ6.js.map +0 -1
  426. package/dist/liquid-S4LVU77Y.js +0 -2
  427. package/dist/liquid-S4LVU77Y.js.map +0 -1
  428. package/dist/llvm-WBQ7MHV7.js +0 -2
  429. package/dist/llvm-WBQ7MHV7.js.map +0 -1
  430. package/dist/log-AXKDFD3L.js +0 -2
  431. package/dist/log-AXKDFD3L.js.map +0 -1
  432. package/dist/logo-E23LAFZY.js +0 -2
  433. package/dist/logo-E23LAFZY.js.map +0 -1
  434. package/dist/lua-QQ5QEPPO.js +0 -2
  435. package/dist/lua-QQ5QEPPO.js.map +0 -1
  436. package/dist/luau-D432BEB5.js +0 -2
  437. package/dist/luau-D432BEB5.js.map +0 -1
  438. package/dist/make-QFMWQJMG.js +0 -2
  439. package/dist/make-QFMWQJMG.js.map +0 -1
  440. package/dist/markdown-D756RUOP.js +0 -2
  441. package/dist/markdown-D756RUOP.js.map +0 -1
  442. package/dist/marko-WVASNOGB.js +0 -2
  443. package/dist/marko-WVASNOGB.js.map +0 -1
  444. package/dist/material-theme-KPDVFAGV.js +0 -2
  445. package/dist/material-theme-KPDVFAGV.js.map +0 -1
  446. package/dist/material-theme-darker-GVSTMSNT.js +0 -2
  447. package/dist/material-theme-darker-GVSTMSNT.js.map +0 -1
  448. package/dist/material-theme-lighter-JWZNUXUH.js +0 -2
  449. package/dist/material-theme-lighter-JWZNUXUH.js.map +0 -1
  450. package/dist/material-theme-ocean-MU4N3XNQ.js +0 -2
  451. package/dist/material-theme-ocean-MU4N3XNQ.js.map +0 -1
  452. package/dist/material-theme-palenight-VMWD73WM.js +0 -2
  453. package/dist/material-theme-palenight-VMWD73WM.js.map +0 -1
  454. package/dist/matlab-ZKZ7YBAH.js +0 -2
  455. package/dist/matlab-ZKZ7YBAH.js.map +0 -1
  456. package/dist/mcp-apps-client-WEXKWHUI.js +0 -3
  457. package/dist/mcp-apps-client-WEXKWHUI.js.map +0 -1
  458. package/dist/mcp-apps-client-Z5ICFYSR.js +0 -2
  459. package/dist/mcp-apps-client-Z5ICFYSR.js.map +0 -1
  460. package/dist/mdc-NDTDGSIG.js +0 -2
  461. package/dist/mdc-NDTDGSIG.js.map +0 -1
  462. package/dist/mdx-34BL2O4O.js +0 -2
  463. package/dist/mdx-34BL2O4O.js.map +0 -1
  464. package/dist/mermaid-4DMBBIKO-DV4JRUY5.js +0 -2
  465. package/dist/mermaid-4DMBBIKO-DV4JRUY5.js.map +0 -1
  466. package/dist/mermaid-54Z3SAII.js +0 -2
  467. package/dist/mermaid-54Z3SAII.js.map +0 -1
  468. package/dist/min-dark-ASEVSA24.js +0 -2
  469. package/dist/min-dark-ASEVSA24.js.map +0 -1
  470. package/dist/min-light-3H54BB3D.js +0 -2
  471. package/dist/min-light-3H54BB3D.js.map +0 -1
  472. package/dist/mipsasm-NKQWJEL7.js +0 -2
  473. package/dist/mipsasm-NKQWJEL7.js.map +0 -1
  474. package/dist/mojo-KRRNBH7O.js +0 -2
  475. package/dist/mojo-KRRNBH7O.js.map +0 -1
  476. package/dist/monokai-5QWQOFN6.js +0 -2
  477. package/dist/monokai-5QWQOFN6.js.map +0 -1
  478. package/dist/moonbit-LQ7JL5LZ.js +0 -2
  479. package/dist/moonbit-LQ7JL5LZ.js.map +0 -1
  480. package/dist/move-4VWCI4YQ.js +0 -2
  481. package/dist/move-4VWCI4YQ.js.map +0 -1
  482. package/dist/narrat-4QSDQDLH.js +0 -2
  483. package/dist/narrat-4QSDQDLH.js.map +0 -1
  484. package/dist/nextflow-DPCEWQNZ.js +0 -2
  485. package/dist/nextflow-DPCEWQNZ.js.map +0 -1
  486. package/dist/nginx-DXHAXQRH.js +0 -2
  487. package/dist/nginx-DXHAXQRH.js.map +0 -1
  488. package/dist/night-owl-4QQBS2UX.js +0 -2
  489. package/dist/night-owl-4QQBS2UX.js.map +0 -1
  490. package/dist/night-owl-light-HR6A2OQO.js +0 -2
  491. package/dist/night-owl-light-HR6A2OQO.js.map +0 -1
  492. package/dist/nim-Z6EEJ7SX.js +0 -2
  493. package/dist/nim-Z6EEJ7SX.js.map +0 -1
  494. package/dist/nix-WAYR4BYU.js +0 -2
  495. package/dist/nix-WAYR4BYU.js.map +0 -1
  496. package/dist/nord-XK3AUNCF.js +0 -2
  497. package/dist/nord-XK3AUNCF.js.map +0 -1
  498. package/dist/nushell-26KZW4VL.js +0 -2
  499. package/dist/nushell-26KZW4VL.js.map +0 -1
  500. package/dist/objective-c-246HWLKT.js +0 -2
  501. package/dist/objective-c-246HWLKT.js.map +0 -1
  502. package/dist/objective-cpp-RJUXXPYQ.js +0 -2
  503. package/dist/objective-cpp-RJUXXPYQ.js.map +0 -1
  504. package/dist/ocaml-P7NGS7PR.js +0 -2
  505. package/dist/ocaml-P7NGS7PR.js.map +0 -1
  506. package/dist/odin-UPPZCJGN.js +0 -2
  507. package/dist/odin-UPPZCJGN.js.map +0 -1
  508. package/dist/one-dark-pro-ZV7CEA5M.js +0 -2
  509. package/dist/one-dark-pro-ZV7CEA5M.js.map +0 -1
  510. package/dist/one-light-FKZJCKM6.js +0 -2
  511. package/dist/one-light-FKZJCKM6.js.map +0 -1
  512. package/dist/openai-client-PUBKF5TI.js +0 -5
  513. package/dist/openai-client-PUBKF5TI.js.map +0 -1
  514. package/dist/openai-client-VRJPAPFR.js +0 -4
  515. package/dist/openai-client-VRJPAPFR.js.map +0 -1
  516. package/dist/openscad-JRK6K3FL.js +0 -2
  517. package/dist/openscad-JRK6K3FL.js.map +0 -1
  518. package/dist/pascal-RDFLUHHA.js +0 -2
  519. package/dist/pascal-RDFLUHHA.js.map +0 -1
  520. package/dist/perl-5IQEFQG3.js +0 -2
  521. package/dist/perl-5IQEFQG3.js.map +0 -1
  522. package/dist/php-UQGWKJAF.js +0 -2
  523. package/dist/php-UQGWKJAF.js.map +0 -1
  524. package/dist/pkl-PAM76VXP.js +0 -2
  525. package/dist/pkl-PAM76VXP.js.map +0 -1
  526. package/dist/plastic-SXCQPKYC.js +0 -2
  527. package/dist/plastic-SXCQPKYC.js.map +0 -1
  528. package/dist/platform-LKQFC3AJ.js +0 -3
  529. package/dist/platform-LKQFC3AJ.js.map +0 -1
  530. package/dist/platform-ZNBJH5XX.js +0 -2
  531. package/dist/platform-ZNBJH5XX.js.map +0 -1
  532. package/dist/plsql-3Y6UMFEG.js +0 -2
  533. package/dist/plsql-3Y6UMFEG.js.map +0 -1
  534. package/dist/po-GNTAKCTE.js +0 -2
  535. package/dist/po-GNTAKCTE.js.map +0 -1
  536. package/dist/poimandres-S3UYVG4O.js +0 -2
  537. package/dist/poimandres-S3UYVG4O.js.map +0 -1
  538. package/dist/polar-EVTMRLGV.js +0 -2
  539. package/dist/polar-EVTMRLGV.js.map +0 -1
  540. package/dist/postcss-42343LW7.js +0 -2
  541. package/dist/postcss-42343LW7.js.map +0 -1
  542. package/dist/powerquery-M34PNR4X.js +0 -2
  543. package/dist/powerquery-M34PNR4X.js.map +0 -1
  544. package/dist/powershell-IR7ICFQW.js +0 -2
  545. package/dist/powershell-IR7ICFQW.js.map +0 -1
  546. package/dist/prisma-RXSIFLZX.js +0 -2
  547. package/dist/prisma-RXSIFLZX.js.map +0 -1
  548. package/dist/prolog-YBBQ4UD5.js +0 -2
  549. package/dist/prolog-YBBQ4UD5.js.map +0 -1
  550. package/dist/proto-U4FF45G6.js +0 -2
  551. package/dist/proto-U4FF45G6.js.map +0 -1
  552. package/dist/pug-XHTBJJNO.js +0 -2
  553. package/dist/pug-XHTBJJNO.js.map +0 -1
  554. package/dist/puppet-HWOKIYJP.js +0 -2
  555. package/dist/puppet-HWOKIYJP.js.map +0 -1
  556. package/dist/purescript-D45AJS5J.js +0 -2
  557. package/dist/purescript-D45AJS5J.js.map +0 -1
  558. package/dist/python-QWA7UE2I.js +0 -2
  559. package/dist/python-QWA7UE2I.js.map +0 -1
  560. package/dist/qml-RHCWFR3S.js +0 -2
  561. package/dist/qml-RHCWFR3S.js.map +0 -1
  562. package/dist/qmldir-FBDC3XMZ.js +0 -2
  563. package/dist/qmldir-FBDC3XMZ.js.map +0 -1
  564. package/dist/qss-AD3WZQ45.js +0 -2
  565. package/dist/qss-AD3WZQ45.js.map +0 -1
  566. package/dist/r-NHIAHDOD.js +0 -2
  567. package/dist/r-NHIAHDOD.js.map +0 -1
  568. package/dist/racket-7G65C5N5.js +0 -2
  569. package/dist/racket-7G65C5N5.js.map +0 -1
  570. package/dist/raku-IWS7BLGD.js +0 -2
  571. package/dist/raku-IWS7BLGD.js.map +0 -1
  572. package/dist/razor-UMC4HKIF.js +0 -2
  573. package/dist/razor-UMC4HKIF.js.map +0 -1
  574. package/dist/red-A6OC2HVL.js +0 -2
  575. package/dist/red-A6OC2HVL.js.map +0 -1
  576. package/dist/reg-V4XLWESR.js +0 -2
  577. package/dist/reg-V4XLWESR.js.map +0 -1
  578. package/dist/regexp-XP4MR635.js +0 -2
  579. package/dist/regexp-XP4MR635.js.map +0 -1
  580. package/dist/rel-DE6UXATM.js +0 -2
  581. package/dist/rel-DE6UXATM.js.map +0 -1
  582. package/dist/riscv-5PDXBPPL.js +0 -2
  583. package/dist/riscv-5PDXBPPL.js.map +0 -1
  584. package/dist/ron-WD6BJFDY.js +0 -2
  585. package/dist/ron-WD6BJFDY.js.map +0 -1
  586. package/dist/rose-pine-GLWOWPBK.js +0 -2
  587. package/dist/rose-pine-GLWOWPBK.js.map +0 -1
  588. package/dist/rose-pine-dawn-HYE6T7LV.js +0 -2
  589. package/dist/rose-pine-dawn-HYE6T7LV.js.map +0 -1
  590. package/dist/rose-pine-moon-VHVTDDVO.js +0 -2
  591. package/dist/rose-pine-moon-VHVTDDVO.js.map +0 -1
  592. package/dist/rosmsg-7LDUCZRQ.js +0 -2
  593. package/dist/rosmsg-7LDUCZRQ.js.map +0 -1
  594. package/dist/rst-HCGHBPBZ.js +0 -2
  595. package/dist/rst-HCGHBPBZ.js.map +0 -1
  596. package/dist/ruby-ML25RVXY.js +0 -2
  597. package/dist/ruby-ML25RVXY.js.map +0 -1
  598. package/dist/rust-Z2NYMT2Z.js +0 -2
  599. package/dist/rust-Z2NYMT2Z.js.map +0 -1
  600. package/dist/sas-A4JCTK6H.js +0 -2
  601. package/dist/sas-A4JCTK6H.js.map +0 -1
  602. package/dist/sass-75VDP7DE.js +0 -2
  603. package/dist/sass-75VDP7DE.js.map +0 -1
  604. package/dist/scala-7TJ4N6KC.js +0 -2
  605. package/dist/scala-7TJ4N6KC.js.map +0 -1
  606. package/dist/scheme-5XARZMKT.js +0 -2
  607. package/dist/scheme-5XARZMKT.js.map +0 -1
  608. package/dist/scss-4QR2BXFS.js +0 -2
  609. package/dist/scss-4QR2BXFS.js.map +0 -1
  610. package/dist/sdbl-6M55AJVA.js +0 -2
  611. package/dist/sdbl-6M55AJVA.js.map +0 -1
  612. package/dist/shaderlab-322XNY5V.js +0 -2
  613. package/dist/shaderlab-322XNY5V.js.map +0 -1
  614. package/dist/shellscript-F23VVVTW.js +0 -2
  615. package/dist/shellscript-F23VVVTW.js.map +0 -1
  616. package/dist/shellsession-G65XJMCC.js +0 -2
  617. package/dist/shellsession-G65XJMCC.js.map +0 -1
  618. package/dist/slack-dark-OPW5CYSY.js +0 -2
  619. package/dist/slack-dark-OPW5CYSY.js.map +0 -1
  620. package/dist/slack-ochin-WTVMYBFH.js +0 -2
  621. package/dist/slack-ochin-WTVMYBFH.js.map +0 -1
  622. package/dist/smalltalk-LALIO5SC.js +0 -2
  623. package/dist/smalltalk-LALIO5SC.js.map +0 -1
  624. package/dist/snazzy-light-5UQ56PC5.js +0 -2
  625. package/dist/snazzy-light-5UQ56PC5.js.map +0 -1
  626. package/dist/solarized-dark-DSMP6D7D.js +0 -2
  627. package/dist/solarized-dark-DSMP6D7D.js.map +0 -1
  628. package/dist/solarized-light-3IZTZCIV.js +0 -2
  629. package/dist/solarized-light-3IZTZCIV.js.map +0 -1
  630. package/dist/solidity-TQUKTJZZ.js +0 -2
  631. package/dist/solidity-TQUKTJZZ.js.map +0 -1
  632. package/dist/soy-ALTWCQTO.js +0 -2
  633. package/dist/soy-ALTWCQTO.js.map +0 -1
  634. package/dist/sparql-ARI3MVK7.js +0 -2
  635. package/dist/sparql-ARI3MVK7.js.map +0 -1
  636. package/dist/splunk-QEFG3NPJ.js +0 -2
  637. package/dist/splunk-QEFG3NPJ.js.map +0 -1
  638. package/dist/sql-SBP7VV3V.js +0 -2
  639. package/dist/sql-SBP7VV3V.js.map +0 -1
  640. package/dist/ssh-config-SC6RC6IV.js +0 -2
  641. package/dist/ssh-config-SC6RC6IV.js.map +0 -1
  642. package/dist/stata-MNI5YOQU.js +0 -2
  643. package/dist/stata-MNI5YOQU.js.map +0 -1
  644. package/dist/stylus-YYWEHAK3.js +0 -2
  645. package/dist/stylus-YYWEHAK3.js.map +0 -1
  646. package/dist/surrealql-5X7LI3J6.js +0 -2
  647. package/dist/surrealql-5X7LI3J6.js.map +0 -1
  648. package/dist/svelte-6TT7H4YP.js +0 -2
  649. package/dist/svelte-6TT7H4YP.js.map +0 -1
  650. package/dist/swift-JEBLU4EM.js +0 -2
  651. package/dist/swift-JEBLU4EM.js.map +0 -1
  652. package/dist/synthwave-84-JWI6CVJZ.js +0 -2
  653. package/dist/synthwave-84-JWI6CVJZ.js.map +0 -1
  654. package/dist/system-verilog-46QRSGNM.js +0 -2
  655. package/dist/system-verilog-46QRSGNM.js.map +0 -1
  656. package/dist/systemd-3PUVCSI7.js +0 -2
  657. package/dist/systemd-3PUVCSI7.js.map +0 -1
  658. package/dist/talonscript-AK4LB3KC.js +0 -2
  659. package/dist/talonscript-AK4LB3KC.js.map +0 -1
  660. package/dist/tasl-VHTYBUVI.js +0 -2
  661. package/dist/tasl-VHTYBUVI.js.map +0 -1
  662. package/dist/tcl-UUMKHRHL.js +0 -2
  663. package/dist/tcl-UUMKHRHL.js.map +0 -1
  664. package/dist/templ-WN3SJLUV.js +0 -2
  665. package/dist/templ-WN3SJLUV.js.map +0 -1
  666. package/dist/terraform-GCGIT2RL.js +0 -2
  667. package/dist/terraform-GCGIT2RL.js.map +0 -1
  668. package/dist/tex-L55DZDKV.js +0 -2
  669. package/dist/tex-L55DZDKV.js.map +0 -1
  670. package/dist/tokyo-night-SRK4SADJ.js +0 -2
  671. package/dist/tokyo-night-SRK4SADJ.js.map +0 -1
  672. package/dist/toml-7AH4HFBN.js +0 -2
  673. package/dist/toml-7AH4HFBN.js.map +0 -1
  674. package/dist/ts-tags-NAJDOQCO.js +0 -2
  675. package/dist/ts-tags-NAJDOQCO.js.map +0 -1
  676. package/dist/tsv-EB3LRXYX.js +0 -2
  677. package/dist/tsv-EB3LRXYX.js.map +0 -1
  678. package/dist/tsx-Y5YXGNIX.js +0 -2
  679. package/dist/tsx-Y5YXGNIX.js.map +0 -1
  680. package/dist/turtle-KM6UGYIQ.js +0 -2
  681. package/dist/turtle-KM6UGYIQ.js.map +0 -1
  682. package/dist/twig-GIY7NVAA.js +0 -2
  683. package/dist/twig-GIY7NVAA.js.map +0 -1
  684. package/dist/typescript-ZF5AMNEZ.js +0 -2
  685. package/dist/typescript-ZF5AMNEZ.js.map +0 -1
  686. package/dist/typespec-6JSRRA42.js +0 -2
  687. package/dist/typespec-6JSRRA42.js.map +0 -1
  688. package/dist/typst-ZOSAUKL5.js +0 -2
  689. package/dist/typst-ZOSAUKL5.js.map +0 -1
  690. package/dist/v-HVLBO3DI.js +0 -2
  691. package/dist/v-HVLBO3DI.js.map +0 -1
  692. package/dist/vala-WWRVCJNF.js +0 -2
  693. package/dist/vala-WWRVCJNF.js.map +0 -1
  694. package/dist/vb-XFFF4O73.js +0 -2
  695. package/dist/vb-XFFF4O73.js.map +0 -1
  696. package/dist/verilog-XTDPJNP7.js +0 -2
  697. package/dist/verilog-XTDPJNP7.js.map +0 -1
  698. package/dist/vesper-WIZFPFI7.js +0 -2
  699. package/dist/vesper-WIZFPFI7.js.map +0 -1
  700. package/dist/vhdl-OCZJ2AOZ.js +0 -2
  701. package/dist/vhdl-OCZJ2AOZ.js.map +0 -1
  702. package/dist/viml-PVA3ZJ5L.js +0 -2
  703. package/dist/viml-PVA3ZJ5L.js.map +0 -1
  704. package/dist/vitesse-black-PEGI4HJX.js +0 -2
  705. package/dist/vitesse-black-PEGI4HJX.js.map +0 -1
  706. package/dist/vitesse-dark-M2ZAGPXG.js +0 -2
  707. package/dist/vitesse-dark-M2ZAGPXG.js.map +0 -1
  708. package/dist/vitesse-light-RICZI4IG.js +0 -2
  709. package/dist/vitesse-light-RICZI4IG.js.map +0 -1
  710. package/dist/vue-V6GLJNYA.js +0 -2
  711. package/dist/vue-V6GLJNYA.js.map +0 -1
  712. package/dist/vue-html-G4DE7FYD.js +0 -2
  713. package/dist/vue-html-G4DE7FYD.js.map +0 -1
  714. package/dist/vue-vine-KB45C76H.js +0 -2
  715. package/dist/vue-vine-KB45C76H.js.map +0 -1
  716. package/dist/vyper-SBDFKHRI.js +0 -2
  717. package/dist/vyper-SBDFKHRI.js.map +0 -1
  718. package/dist/wasm-ISCPKFD2.js +0 -2
  719. package/dist/wasm-ISCPKFD2.js.map +0 -1
  720. package/dist/wasm-SXNE4SKX.js +0 -2
  721. package/dist/wasm-SXNE4SKX.js.map +0 -1
  722. package/dist/wenyan-PMSCJP7P.js +0 -2
  723. package/dist/wenyan-PMSCJP7P.js.map +0 -1
  724. package/dist/wgsl-DOXQU7M4.js +0 -2
  725. package/dist/wgsl-DOXQU7M4.js.map +0 -1
  726. package/dist/wikitext-LGNEKWDX.js +0 -2
  727. package/dist/wikitext-LGNEKWDX.js.map +0 -1
  728. package/dist/wit-G62U2KBE.js +0 -2
  729. package/dist/wit-G62U2KBE.js.map +0 -1
  730. package/dist/wolfram-YTZHUYN6.js +0 -2
  731. package/dist/wolfram-YTZHUYN6.js.map +0 -1
  732. package/dist/xml-WGLM4CWK.js +0 -2
  733. package/dist/xml-WGLM4CWK.js.map +0 -1
  734. package/dist/xsl-KAAH2GEK.js +0 -2
  735. package/dist/xsl-KAAH2GEK.js.map +0 -1
  736. package/dist/yaml-JGEBDSVI.js +0 -2
  737. package/dist/yaml-JGEBDSVI.js.map +0 -1
  738. package/dist/zenscript-QQQPZNJ7.js +0 -2
  739. package/dist/zenscript-QQQPZNJ7.js.map +0 -1
  740. package/dist/zig-6LJUAPBA.js +0 -2
  741. package/dist/zig-6LJUAPBA.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/legacy/index.ts","../../src/legacy/mcp/resources/index.ts","../../src/legacy/mcp/resources/create-resource.ts","../../src/legacy/mcp/resources/meta.ts","../../src/legacy/mcp/tools/create-tool.ts","../../src/mcp/server/scoped-client.ts","../../src/tracking/revenue.ts","../../src/mcp/server/utils.ts","../../src/shared/meta-keys.ts","../../src/legacy/mcp/react/index.ts","../../src/legacy/mcp/react/components/initialize-next-in-iframe.tsx","../../src/legacy/mcp/react/dev/index.ts","../../src/legacy/mcp/react/dev/dev-controls.tsx","../../src/legacy/mcp/react/dev/mock-openai.ts","../../src/legacy/mcp/react/hooks/index.ts","../../src/legacy/mcp/react/hooks/unstable-use-send-follow-up.tsx","../../src/mcp/react/context.ts","../../src/legacy/mcp/react/hooks/use-call-tool.ts","../../src/legacy/mcp/react/hooks/use-widget.ts","../../src/legacy/mcp/react/widgets/widget-client.ts","../../src/legacy/mcp/react/hooks/use-display-mode.ts","../../src/legacy/mcp/react/hooks/use-flow-action.ts","../../src/legacy/mcp/react/hooks/use-tool-output.ts","../../src/legacy/mcp/react/hooks/use-is-chatgpt-app.ts","../../src/legacy/mcp/react/hooks/use-locale.ts","../../src/legacy/mcp/react/hooks/use-max-height.ts","../../src/legacy/mcp/react/hooks/use-open-external.ts","../../src/legacy/mcp/react/hooks/use-request-display-mode.ts","../../src/legacy/mcp/react/hooks/use-safe-area.ts","../../src/legacy/mcp/react/hooks/use-send-follow-up.ts","../../src/legacy/mcp/react/hooks/use-theme.ts","../../src/legacy/mcp/react/hooks/use-tool-response-metadata.ts","../../src/legacy/mcp/react/hooks/use-update-model-context.ts","../../src/legacy/mcp/react/hooks/use-widget-state.ts","../../src/legacy/mcp/react/widgets/loading-widget.tsx","../../src/legacy/chat/next-js/index.ts","../../src/legacy/chat/server/api-handler.ts","../../src/utils/logger.ts","../../src/legacy/chat/server/@types.ts","../../src/legacy/chat/server/@utils.ts","../../src/legacy/chat/server/handle-chat.ts","../../src/error.ts","../../src/legacy/chat/server/geo.ts","../../src/legacy/chat/server/model-context.ts","../../src/legacy/chat/server/handle-resource.ts","../../src/legacy/chat/server/handle-tool.ts","../../src/legacy/chat/server/handle-tools-list.ts","../../src/legacy/chat/server/mcp-config-resolver.ts","../../src/legacy/chat/web/chat-card.tsx","../../src/chat/web/ai-elements/conversation.tsx","../../node_modules/lucide-react/dist/esm/lucide-react.js","../../node_modules/shared/src/utils/mergeClasses.ts","../../node_modules/shared/src/utils/toKebabCase.ts","../../node_modules/shared/src/utils/toCamelCase.ts","../../node_modules/shared/src/utils/toPascalCase.ts","../../node_modules/lucide-react/src/defaultAttributes.ts","../../node_modules/shared/src/utils/hasA11yProp.ts","../../node_modules/lucide-react/src/Icon.ts","../../node_modules/lucide-react/src/createLucideIcon.ts","../../node_modules/lucide-react/src/icons/arrow-down.ts","../../node_modules/lucide-react/src/icons/arrow-up.ts","../../node_modules/lucide-react/src/icons/check.ts","../../node_modules/lucide-react/src/icons/chevron-down.ts","../../node_modules/lucide-react/src/icons/chevron-right.ts","../../node_modules/lucide-react/src/icons/clipboard-copy.ts","../../node_modules/lucide-react/src/icons/clock.ts","../../node_modules/lucide-react/src/icons/file.ts","../../node_modules/lucide-react/src/icons/globe.ts","../../node_modules/lucide-react/src/icons/loader.ts","../../node_modules/lucide-react/src/icons/paperclip.ts","../../node_modules/lucide-react/src/icons/square.ts","../../node_modules/lucide-react/src/icons/wrench.ts","../../node_modules/lucide-react/src/icons/x.ts","../../node_modules/lucide-react/src/icons/zap.ts","../../node_modules/use-stick-to-bottom/dist/useStickToBottom.js","../../node_modules/use-stick-to-bottom/dist/StickToBottom.js","../../src/chat/web/lib/utils.ts","../../src/chat/web/ui/button.tsx","../../src/chat/web/ai-elements/prompt-input.tsx","../../node_modules/nanoid/index.js","../../node_modules/nanoid/url-alphabet/index.js","../../src/chat/web/i18n/index.ts","../../src/chat/web/i18n/context.tsx","../../src/chat/web/i18n/detect.ts","../../src/chat/web/i18n/types.ts","../../src/chat/web/i18n/locales/index.ts","../../src/chat/web/i18n/locales/en.ts","../../src/chat/web/i18n/locales/es.ts","../../src/chat/web/i18n/locales/fr.ts","../../src/chat/web/i18n/format.ts","../../src/chat/web/components/chat-queue.tsx","../../src/chat/web/ai-elements/queue.tsx","../../src/chat/web/components/export-session.tsx","../../src/chat/web/components/message-list.tsx","../../src/chat/web/ai-elements/attachments.tsx","../../src/chat/web/ai-elements/chain-of-thought.tsx","../../src/chat/web/ai-elements/reasoning.tsx","../../node_modules/streamdown/dist/index.js","../../src/chat/web/ai-elements/shimmer.tsx","../../src/chat/web/ai-elements/message.tsx","../../node_modules/@streamdown/cjk/dist/index.js","../../node_modules/remark-cjk-friendly/dist/index.js","../../node_modules/micromark-extension-cjk-friendly/dist/index.js","../../node_modules/micromark-util-symbol/lib/default.js","../../node_modules/micromark-util-symbol/lib/codes.js","../../node_modules/micromark-util-symbol/lib/constants.js","../../node_modules/micromark-util-symbol/lib/types.js","../../node_modules/micromark-extension-cjk-friendly-util/dist/index.js","../../node_modules/get-east-asian-width/index.js","../../node_modules/get-east-asian-width/lookup.js","../../node_modules/remark-cjk-friendly-gfm-strikethrough/dist/index.js","../../node_modules/micromark-extension-cjk-friendly-gfm-strikethrough/dist/index.js","../../node_modules/@streamdown/code/dist/index.js","../../node_modules/shiki/dist/index.mjs","../../node_modules/shiki/dist/bundle-full.mjs","../../node_modules/@shikijs/core/dist/index.mjs","../../node_modules/@shikijs/types/dist/index.mjs","../../node_modules/@shikijs/vscode-textmate/dist/index.js","../../node_modules/hast-util-to-html/index.js","../../node_modules/hast-util-to-html/lib/index.js","../../node_modules/hast-util-to-html/lib/handle/index.js","../../node_modules/hast-util-to-html/lib/handle/comment.js","../../node_modules/stringify-entities/lib/index.js","../../node_modules/stringify-entities/lib/core.js","../../node_modules/stringify-entities/lib/util/format-smart.js","../../node_modules/stringify-entities/lib/util/to-hexadecimal.js","../../node_modules/stringify-entities/lib/util/to-decimal.js","../../node_modules/stringify-entities/lib/util/to-named.js","../../node_modules/character-entities-legacy/index.js","../../node_modules/character-entities-html4/index.js","../../node_modules/stringify-entities/lib/constant/dangerous.js","../../node_modules/hast-util-to-html/lib/handle/doctype.js","../../node_modules/hast-util-to-html/lib/handle/element.js","../../node_modules/hast-util-to-html/lib/omission/closing.js","../../node_modules/hast-util-to-html/lib/omission/util/siblings.js","../../node_modules/hast-util-to-html/lib/omission/omission.js","../../node_modules/hast-util-to-html/lib/omission/opening.js","../../node_modules/hast-util-to-html/lib/handle/raw.js","../../node_modules/hast-util-to-html/lib/handle/text.js","../../node_modules/hast-util-to-html/lib/handle/root.js","../../node_modules/shiki/dist/langs.mjs","../../node_modules/shiki/dist/themes.mjs","../../node_modules/@shikijs/engine-oniguruma/dist/index.mjs","../../src/chat/web/hooks/use-smooth-stream.ts","../../src/chat/web/ai-elements/tool.tsx","../../src/chat/web/ai-elements/working-indicator.tsx","../../src/chat/web/components/mcp-app-frame.tsx","../../src/chat/web/components/welcome-screen.tsx","../../src/chat/web/components/widget-error-boundary.tsx","../../src/chat/web/components/powered-by.tsx","../../src/chat/web/components/suggestions.tsx","../../src/chat/web/components/thread-menu.tsx","../../src/chat/web/hooks/use-call-tool.ts","../../src/chat/web/hooks/use-chat-engine.ts","../../src/chat/web/embed/widget-events-context.tsx","../../src/chat/web/embed/widget-events.ts","../../src/chat/web/lib/api-url.ts","../../src/chat/web/lib/lenient-chat-transport.ts","../../src/chat/web/lib/thread-store.ts","../../src/chat/web/lib/memory-user-id.ts","../../src/chat/web/lib/visitor-context.ts","../../src/chat/web/hooks/use-config.ts","../../src/chat/web/hooks/use-suggestion-row.ts","../../src/chat/web/lib/resolve-suggestions.ts","../../src/chat/web/hooks/turn-suggestions.ts","../../src/chat/web/hooks/use-typing-placeholder.ts","../../src/chat/web/lib/resource-endpoint.ts","../../src/chat/web/theme.ts"],"sourcesContent":["// Legacy SDK surface, mounted at `@waniwani/sdk/legacy`. Bundles the\n// MCP-widget-in-host primitives (createTool, createResource, WidgetProvider,\n// the host bridge hooks, platform detection) and the chat-server Next.js\n// adapter that customer MCPs originally built against.\n//\n// Express adapter is intentionally NOT re-exported here — it imports\n// `node:stream` at module scope, which breaks browser bundles that resolve\n// `@waniwani/sdk/legacy`. Import it from `@waniwani/sdk/legacy/express-js`.\n//\n// New code should not use any of this — use `createFlow` from\n// `@waniwani/sdk/mcp` instead. The exports stay alive indefinitely for\n// customer MCPs already on this stack.\n\n// ----------------------------------------------------------------------------\n// Server-side MCP primitives\n// ----------------------------------------------------------------------------\n\n// Resources\nexport type {\n\tRegisteredResource,\n\tResourceConfig,\n\tWidgetCSP,\n} from \"./mcp/resources\";\nexport { createResource } from \"./mcp/resources\";\n// Tool creation\nexport { createTool, registerTools } from \"./mcp/tools/create-tool\";\nexport type {\n\tMcpServer,\n\tRegisteredTool,\n\tToolConfig,\n\tToolHandler,\n\tToolHandlerContext,\n\tToolToolCallback,\n\tZodRawShapeCompat,\n} from \"./mcp/tools/types\";\n\n// ----------------------------------------------------------------------------\n// Client-side MCP-widget React surface\n// ----------------------------------------------------------------------------\n\nexport * from \"./mcp/react\";\n\n// ----------------------------------------------------------------------------\n// Chat-server Next.js adapter\n// ----------------------------------------------------------------------------\n\nexport * from \"./chat/next-js\";\n\n// ----------------------------------------------------------------------------\n// Legacy chat UI — `ChatCard` was the original always-visible card layout.\n// New code should use `WaniwaniChat` (hosted) or `ChatEmbed` (BYO backend)\n// from `@waniwani/sdk/chat`.\n// ----------------------------------------------------------------------------\n\nexport { ChatCard, type ChatCardProps } from \"./chat/web/chat-card\";\n","export { createResource } from \"./create-resource\";\nexport { buildToolMeta, MIME_TYPE_MCP, MIME_TYPE_OPENAI } from \"./meta\";\nexport type { RegisteredResource, ResourceConfig, WidgetCSP } from \"./types\";\n","import {\n\tbuildMcpAppsResourceMeta,\n\tbuildOpenAIResourceMeta,\n\tfetchHtml,\n\tMIME_TYPE_MCP,\n\tMIME_TYPE_OPENAI,\n} from \"./meta\";\nimport type { McpServer, RegisteredResource, ResourceConfig } from \"./types\";\n\n/**\n * Creates a reusable UI resource (HTML template) that can be attached\n * to tools or flow nodes.\n *\n * @deprecated Prefer `createFlow` with `showWidget` from `@waniwani/sdk/mcp` for new code.\n * `createResource` is preserved for back-compat with existing customer MCPs but is no longer\n * documented; it will move to `@waniwani/sdk/legacy` in a future minor release.\n *\n * @example\n * ```ts\n * const pricingUI = createResource({\n * id: \"pricing_table\",\n * title: \"Pricing Table\",\n * baseUrl: \"https://my-app.com\",\n * htmlPath: \"/widgets/pricing\",\n * widgetDomain: \"my-app.com\",\n * });\n *\n * await pricingUI.register(server);\n * ```\n */\nexport function createResource(config: ResourceConfig): RegisteredResource {\n\tconst {\n\t\tid,\n\t\ttitle,\n\t\tdescription,\n\t\tbaseUrl,\n\t\thtmlPath,\n\t\twidgetDomain,\n\t\tprefersBorder = true,\n\t\tautoHeight = true,\n\t} = config;\n\n\t// Auto-generate CSP from baseUrl if not explicitly provided\n\tlet widgetCSP = config.widgetCSP ?? {\n\t\tconnect_domains: [baseUrl],\n\t\tresource_domains: [baseUrl],\n\t};\n\n\t// In development with localhost, add extra CSP domains for\n\t// Next.js dev features (WebSocket HMR, Turbopack font serving)\n\tif (process.env.NODE_ENV === \"development\") {\n\t\ttry {\n\t\t\tconst { hostname } = new URL(baseUrl);\n\t\t\tif (hostname === \"localhost\" || hostname === \"127.0.0.1\") {\n\t\t\t\twidgetCSP = {\n\t\t\t\t\t...widgetCSP,\n\t\t\t\t\tconnect_domains: [\n\t\t\t\t\t\t...(widgetCSP.connect_domains || []),\n\t\t\t\t\t\t`ws://${hostname}:*`,\n\t\t\t\t\t\t`wss://${hostname}:*`,\n\t\t\t\t\t],\n\t\t\t\t\tresource_domains: [\n\t\t\t\t\t\t...(widgetCSP.resource_domains || []),\n\t\t\t\t\t\t`http://${hostname}:*`,\n\t\t\t\t\t],\n\t\t\t\t};\n\t\t\t}\n\t\t} catch {\n\t\t\t// Invalid baseUrl — skip dev CSP additions\n\t\t}\n\t}\n\n\tconst openaiUri = `ui://widgets/apps-sdk/${id}.html`;\n\tconst mcpUri = `ui://widgets/ext-apps/${id}.html`;\n\n\t// Lazy HTML — fetched once, shared across all calls\n\tlet htmlPromise: Promise<string> | null = null;\n\tconst getHtml = () => {\n\t\tif (!htmlPromise) {\n\t\t\thtmlPromise = fetchHtml(baseUrl, htmlPath);\n\t\t}\n\t\treturn htmlPromise;\n\t};\n\n\t// Use description for UI metadata\n\tconst uiDescription = description;\n\n\tasync function register(server: McpServer): Promise<void> {\n\t\tconst html = await getHtml();\n\n\t\t// Register OpenAI Apps SDK resource\n\t\tserver.registerResource(\n\t\t\t`${id}-openai-widget`,\n\t\t\topenaiUri,\n\t\t\t{\n\t\t\t\ttitle,\n\t\t\t\tdescription: uiDescription,\n\t\t\t\tmimeType: MIME_TYPE_OPENAI,\n\t\t\t\t_meta: {\n\t\t\t\t\t\"openai/widgetDescription\": uiDescription,\n\t\t\t\t\t\"openai/widgetPrefersBorder\": prefersBorder,\n\t\t\t\t},\n\t\t\t},\n\t\t\tasync (uri) => ({\n\t\t\t\tcontents: [\n\t\t\t\t\t{\n\t\t\t\t\t\turi: uri.href,\n\t\t\t\t\t\tmimeType: MIME_TYPE_OPENAI,\n\t\t\t\t\t\ttext: html,\n\t\t\t\t\t\t_meta: buildOpenAIResourceMeta({\n\t\t\t\t\t\t\tdescription: uiDescription,\n\t\t\t\t\t\t\tprefersBorder,\n\t\t\t\t\t\t\twidgetDomain,\n\t\t\t\t\t\t\twidgetCSP,\n\t\t\t\t\t\t}),\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t}),\n\t\t);\n\n\t\t// Register MCP Apps resource\n\t\tserver.registerResource(\n\t\t\t`${id}-mcp-widget`,\n\t\t\tmcpUri,\n\t\t\t{\n\t\t\t\ttitle,\n\t\t\t\tdescription: uiDescription,\n\t\t\t\tmimeType: MIME_TYPE_MCP,\n\t\t\t\t_meta: {\n\t\t\t\t\tui: {\n\t\t\t\t\t\tprefersBorder,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tasync (uri) => ({\n\t\t\t\tcontents: [\n\t\t\t\t\t{\n\t\t\t\t\t\turi: uri.href,\n\t\t\t\t\t\tmimeType: MIME_TYPE_MCP,\n\t\t\t\t\t\ttext: html,\n\t\t\t\t\t\t_meta: buildMcpAppsResourceMeta({\n\t\t\t\t\t\t\tdescription: uiDescription,\n\t\t\t\t\t\t\tprefersBorder,\n\t\t\t\t\t\t\twidgetCSP,\n\t\t\t\t\t\t}),\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t}),\n\t\t);\n\t}\n\n\treturn {\n\t\tid,\n\t\ttitle,\n\t\tdescription,\n\t\topenaiUri,\n\t\tmcpUri,\n\t\tautoHeight,\n\t\tregister,\n\t};\n}\n","import type { WidgetCSP } from \"./types\";\n\n/**\n * MIME types for widget resources.\n * OpenAI Apps SDK uses \"text/html+skybridge\"\n * MCP Apps uses \"text/html;profile=mcp-app\"\n */\nexport const MIME_TYPE_OPENAI = \"text/html+skybridge\";\nexport const MIME_TYPE_MCP = \"text/html;profile=mcp-app\";\n\n// ---- HTML fetching ----\n\nexport const fetchHtml = async (\n\tbaseUrl: string,\n\tpath: string,\n): Promise<string> => {\n\tconst normalizedBase = baseUrl.endsWith(\"/\") ? baseUrl.slice(0, -1) : baseUrl;\n\tconst result = await fetch(`${normalizedBase}${path}`);\n\treturn await result.text();\n};\n\n// ---- OpenAI resource metadata ----\n\ninterface OpenAIResourceMeta {\n\t[key: string]: unknown;\n\t\"openai/widgetDescription\"?: string;\n\t\"openai/widgetPrefersBorder\"?: boolean;\n\t\"openai/widgetDomain\"?: string;\n\t\"openai/widgetCSP\"?: WidgetCSP;\n}\n\nexport function buildOpenAIResourceMeta(config: {\n\tdescription?: string;\n\tprefersBorder?: boolean;\n\twidgetDomain: string;\n\twidgetCSP?: WidgetCSP;\n}): OpenAIResourceMeta {\n\treturn {\n\t\t\"openai/widgetDescription\": config.description,\n\t\t\"openai/widgetPrefersBorder\": config.prefersBorder,\n\t\t\"openai/widgetDomain\": config.widgetDomain,\n\t\t...(config.widgetCSP && { \"openai/widgetCSP\": config.widgetCSP }),\n\t};\n}\n\n// ---- MCP Apps resource metadata ----\n\ninterface McpAppsResourceMeta {\n\t[key: string]: unknown;\n\tui?: {\n\t\tcsp?: {\n\t\t\tconnectDomains?: string[];\n\t\t\tresourceDomains?: string[];\n\t\t\tframeDomains?: string[];\n\t\t\tredirectDomains?: string[];\n\t\t};\n\t\tprefersBorder?: boolean;\n\t};\n}\n\nexport function buildMcpAppsResourceMeta(config: {\n\tdescription?: string;\n\tprefersBorder?: boolean;\n\twidgetCSP?: WidgetCSP;\n}): McpAppsResourceMeta {\n\tconst csp = config.widgetCSP\n\t\t? {\n\t\t\t\tconnectDomains: config.widgetCSP.connect_domains,\n\t\t\t\tresourceDomains: config.widgetCSP.resource_domains,\n\t\t\t\tframeDomains: config.widgetCSP.frame_domains,\n\t\t\t\tredirectDomains: config.widgetCSP.redirect_domains,\n\t\t\t}\n\t\t: undefined;\n\n\t// NOTE: we intentionally do NOT emit `ui.domain` here. Claude's MCP Apps\n\t// host validates `ui.domain` against the format \"{hash}.claudemcpcontent.com\"\n\t// and rejects any other value (e.g. a self-hosted widget origin) with:\n\t// Invalid ui.domain format: expected \"{hash}.claudemcpcontent.com\", got \"<our domain>\".\n\t// The widget origin is already conveyed via the CSP domains above, so the\n\t// field is redundant for MCP Apps. The OpenAI Apps SDK path keeps its own\n\t// `openai/widgetDomain` (see buildOpenAIResourceMeta), which OpenAI accepts.\n\treturn {\n\t\tui: {\n\t\t\t...(csp && { csp }),\n\t\t\t...(config.prefersBorder !== undefined && {\n\t\t\t\tprefersBorder: config.prefersBorder,\n\t\t\t}),\n\t\t},\n\t};\n}\n\n// ---- Tool metadata (references resource URIs) ----\n\nexport function buildToolMeta(config: {\n\topenaiTemplateUri?: string;\n\tmcpTemplateUri?: string;\n\tinvoking: string;\n\tinvoked: string;\n\tautoHeight?: boolean;\n}) {\n\treturn {\n\t\t// OpenAI metadata\n\t\t...(config.openaiTemplateUri && {\n\t\t\t\"openai/outputTemplate\": config.openaiTemplateUri,\n\t\t}),\n\t\t\"openai/toolInvocation/invoking\": config.invoking,\n\t\t\"openai/toolInvocation/invoked\": config.invoked,\n\t\t\"openai/widgetAccessible\": true,\n\t\t\"openai/resultCanProduceWidget\": true,\n\t\t// MCP Apps metadata (nested)\n\t\t...(config.mcpTemplateUri && {\n\t\t\tui: {\n\t\t\t\tresourceUri: config.mcpTemplateUri,\n\t\t\t\t...(config.autoHeight && { autoHeight: true }),\n\t\t\t},\n\t\t}),\n\t\t// MCP Apps backward-compat flat key (for older hosts)\n\t\t...(config.mcpTemplateUri && {\n\t\t\t\"ui/resourceUri\": config.mcpTemplateUri,\n\t\t}),\n\t};\n}\n","import type { ToolCallback } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport type { ShapeOutput } from \"@modelcontextprotocol/sdk/server/zod-compat.js\";\nimport type { RequestHandlerExtra } from \"@modelcontextprotocol/sdk/shared/protocol.js\";\nimport type {\n\tServerNotification,\n\tServerRequest,\n} from \"@modelcontextprotocol/sdk/types.js\";\nimport type { z } from \"zod\";\nimport { extractScopedClient } from \"../../../mcp/server/scoped-client\";\nimport { buildToolMeta } from \"../resources/meta\";\nimport type {\n\tMcpServer,\n\tRegisteredTool,\n\tToolConfig,\n\tToolHandler,\n} from \"./types\";\n\n/**\n * Creates an MCP tool with minimal boilerplate.\n *\n * When `handler()` returns `data`, the tool includes it as MCP `structuredContent`.\n * When `config.resource` is provided, the tool also returns widget metadata.\n *\n * @deprecated Prefer `createFlow` from `@waniwani/sdk/mcp` for new code. `createTool`\n * is preserved for back-compat with existing customer MCPs but is no longer documented;\n * it will move to `@waniwani/sdk/legacy` in a future minor release.\n *\n * @example\n * ```ts\n * // Widget tool (with resource)\n * const pricingTool = createTool({\n * resource: pricingUI,\n * description: \"Show pricing comparison\",\n * inputSchema: { postalCode: z.string() },\n * }, async ({ postalCode }) => ({\n * text: \"Pricing loaded\",\n * data: { postalCode, prices: [] },\n * }));\n *\n * // Plain tool (no resource)\n * const searchTool = createTool({\n * id: \"search\",\n * title: \"Search\",\n * description: \"Search the knowledge base\",\n * inputSchema: { query: z.string() },\n * }, async ({ query }) => ({\n * text: `Results for \"${query}\"`,\n * }));\n * ```\n */\nexport function createTool<TInput extends z.ZodRawShape>(\n\tconfig: ToolConfig<TInput>,\n\thandler: ToolHandler<TInput>,\n): RegisteredTool {\n\tconst {\n\t\tresource,\n\t\tdescription,\n\t\tinputSchema,\n\t\tannotations,\n\t\tautoInjectResultText = true,\n\t} = config;\n\n\tconst id = config.id ?? resource?.id;\n\tconst title = config.title ?? resource?.title;\n\n\tif (!id) {\n\t\tthrow new Error(\n\t\t\t\"createTool: `id` is required when no resource is provided\",\n\t\t);\n\t}\n\tif (!title) {\n\t\tthrow new Error(\n\t\t\t\"createTool: `title` is required when no resource is provided\",\n\t\t);\n\t}\n\n\t// Build widget metadata only when resource is present\n\tconst toolMeta = resource\n\t\t? buildToolMeta({\n\t\t\t\topenaiTemplateUri: resource.openaiUri,\n\t\t\t\tmcpTemplateUri: resource.mcpUri,\n\t\t\t\tinvoking: config.invoking ?? \"Loading...\",\n\t\t\t\tinvoked: config.invoked ?? \"Loaded\",\n\t\t\t\tautoHeight: resource.autoHeight,\n\t\t\t})\n\t\t: undefined;\n\n\treturn {\n\t\tid,\n\t\ttitle,\n\t\tdescription,\n\n\t\tasync register(server: McpServer): Promise<void> {\n\t\t\tserver.registerTool(\n\t\t\t\tid,\n\t\t\t\t{\n\t\t\t\t\ttitle,\n\t\t\t\t\tdescription,\n\t\t\t\t\tinputSchema,\n\t\t\t\t\tannotations,\n\t\t\t\t\t...(toolMeta && { _meta: toolMeta }),\n\t\t\t\t},\n\t\t\t\t(async (args: ShapeOutput<TInput>, extra: unknown) => {\n\t\t\t\t\tconst requestExtra = extra as RequestHandlerExtra<\n\t\t\t\t\t\tServerRequest,\n\t\t\t\t\t\tServerNotification\n\t\t\t\t\t>;\n\t\t\t\t\tconst _meta: Record<string, unknown> = requestExtra._meta ?? {};\n\t\t\t\t\tconst waniwani = extractScopedClient(requestExtra);\n\n\t\t\t\t\tconst result = await handler(args, { extra: { _meta }, waniwani });\n\n\t\t\t\t\t// Widget tool: return structuredContent + widget metadata\n\t\t\t\t\tif (resource && result.data) {\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tcontent: [{ type: \"text\", text: result.text }],\n\t\t\t\t\t\t\tstructuredContent: result.data,\n\t\t\t\t\t\t\t_meta: {\n\t\t\t\t\t\t\t\t...toolMeta,\n\t\t\t\t\t\t\t\t..._meta,\n\t\t\t\t\t\t\t\t...(autoInjectResultText === false\n\t\t\t\t\t\t\t\t\t? { \"waniwani/autoInjectResultText\": false }\n\t\t\t\t\t\t\t\t\t: {}),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\n\t\t\t\t\t// Plain tool: return text content, plus structuredContent when provided.\n\t\t\t\t\treturn {\n\t\t\t\t\t\tcontent: [{ type: \"text\" as const, text: result.text }],\n\t\t\t\t\t\t...(result.data ? { structuredContent: result.data } : {}),\n\t\t\t\t\t\t...(autoInjectResultText === false\n\t\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\t\t_meta: {\n\t\t\t\t\t\t\t\t\t\t\"waniwani/autoInjectResultText\": false,\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t: {}),\n\t\t\t\t\t};\n\t\t\t\t}) as unknown as ToolCallback<TInput>,\n\t\t\t);\n\t\t},\n\t};\n}\n\n/**\n * Registers multiple tools on the server.\n *\n * @deprecated Prefer `createFlow` + `.register()` for new code. Preserved for back-compat\n * with existing customer MCPs; will move to `@waniwani/sdk/legacy` in a future minor release.\n */\nexport async function registerTools(\n\tserver: McpServer,\n\ttools: RegisteredTool[],\n): Promise<void> {\n\tawait Promise.all(tools.map((t) => t.register(server)));\n}\n","import type { KbClient } from \"../../kb/types.js\";\nimport type {\n\tCallableTrack,\n\tTrackFn,\n\tTrackInput,\n\tTrackingClient,\n} from \"../../tracking/@types.js\";\nimport { createRevenueApi } from \"../../tracking/revenue.js\";\nimport {\n\textractExternalUserId,\n\textractSessionId,\n\textractVisitorId,\n} from \"./utils.js\";\n\n/**\n * Well-known key used to attach the scoped client to the MCP `extra` object.\n * Read by `createTool` and flow compilation to surface it in handler contexts.\n */\nexport const SCOPED_CLIENT_KEY = \"waniwani/client\";\n\n/**\n * A request-scoped Waniwani client with meta pre-attached.\n *\n * Available as `context.waniwani` inside `createTool` handlers and flow nodes\n * when the server is wrapped with `withWaniwani()`.\n */\nexport interface ScopedWaniWaniClient {\n\t/**\n\t * The session id this request's events correlate to, resolved from the\n\t * request meta. Read it to link the session to your own records (store it\n\t * on a lead, then send an off-platform `converted` with the same\n\t * `sessionId` later). `undefined` when the host provided no session id.\n\t */\n\treadonly sessionId?: string;\n\t/**\n\t * The anonymous visitor id, resolved from the request meta. Present on the\n\t * web chat surface (a persisted per-device id threaded through as\n\t * `waniwani/visitorId`); `undefined` on hosts that do not supply one, such\n\t * as Claude. Ingest accepts it as an identity in its own right, so use it\n\t * to correlate events before a session or user id exists.\n\t */\n\treadonly visitorId?: string;\n\t/**\n\t * The external user id, resolved from the request meta (e.g. `openai/userId`\n\t * for ChatGPT's anonymous users, or a host-provided `externalUserId`). Read\n\t * it alongside `sessionId`/`visitorId` — whichever the current host provides.\n\t * `undefined` when the host supplied no user id.\n\t */\n\treadonly externalUserId?: string;\n\t/**\n\t * Track an event — request meta is automatically merged. Also exposes the\n\t * revenue helpers flat (`track.priceShown()`, `track.converted()`, …), which\n\t * inherit the same scoped meta (so identity is carried from the request).\n\t */\n\ttrack: TrackFn;\n\t/** Identify a user — request meta is automatically merged. */\n\tidentify(\n\t\tuserId: string,\n\t\tproperties?: Record<string, unknown>,\n\t): Promise<{ eventId: string }>;\n\t/** Knowledge base client (no meta needed). */\n\treadonly kb: KbClient;\n\t/** @internal Resolved API config from withWaniwani(). */\n\treadonly _config?: { apiUrl?: string; apiKey?: string };\n}\n\n/**\n * Extract the scoped client from the MCP `extra` object.\n * Returns undefined if `withWaniwani()` is not wrapping the server.\n */\nexport function extractScopedClient(\n\textra: unknown,\n): ScopedWaniWaniClient | undefined {\n\tif (typeof extra === \"object\" && extra !== null) {\n\t\treturn (extra as Record<string, unknown>)[SCOPED_CLIENT_KEY] as\n\t\t\t| ScopedWaniWaniClient\n\t\t\t| undefined;\n\t}\n\treturn undefined;\n}\n\nexport function createScopedClient(\n\tbase: { track: CallableTrack; identify: TrackingClient[\"identify\"] } & {\n\t\treadonly kb: KbClient;\n\t},\n\tmeta: Record<string, unknown>,\n\tconfig?: { apiUrl?: string; apiKey?: string },\n): ScopedWaniWaniClient {\n\tconst trackOnce = (event: TrackInput): Promise<{ eventId: string }> =>\n\t\tbase.track({ ...event, meta: { ...meta, ...event.meta } });\n\n\treturn {\n\t\tsessionId: extractSessionId(meta),\n\t\tvisitorId: extractVisitorId(meta),\n\t\texternalUserId: extractExternalUserId(meta),\n\t\ttrack: Object.assign(trackOnce, createRevenueApi(trackOnce)),\n\t\tidentify(userId, properties) {\n\t\t\treturn base.identify(userId, properties, meta);\n\t\t},\n\t\tkb: base.kb,\n\t\t_config: config,\n\t};\n}\n","import type { RevenueTrackingApi, TrackInput } from \"./@types.js\";\n\n/** Enqueue one event and resolve to its id. */\ntype Emit = (event: TrackInput) => Promise<{ eventId: string }>;\n\n/**\n * Build the flat `track.*` revenue helpers over an `emit` function. Shared\n * by the top-level client and the request-scoped client (which injects meta\n * into `emit`) so both expose the same revenue API (WAN-386).\n *\n * Each helper maps its flat input to a typed first-class revenue event; the\n * remaining tracking context (sessionId / externalUserId / meta) is forwarded\n * as-is. Identity (one of those, or meta-derived) is required by the ingest\n * API — see the warning emitted from the client's `emit`.\n */\nexport function createRevenueApi(emit: Emit): RevenueTrackingApi {\n\treturn {\n\t\tpriceShown: ({ amount, currency, itemId, label, ...context }) =>\n\t\t\temit({\n\t\t\t\tevent: \"price_shown\",\n\t\t\t\tproperties: { amount, currency, itemId, label },\n\t\t\t\t...context,\n\t\t\t}),\n\t\tpricesCompared: ({ options, ...context }) =>\n\t\t\temit({ event: \"prices_compared\", properties: { options }, ...context }),\n\t\toptionSelected: ({ id, amount, currency, ...context }) =>\n\t\t\temit({\n\t\t\t\tevent: \"option_selected\",\n\t\t\t\tproperties: { id, amount, currency },\n\t\t\t\t...context,\n\t\t\t}),\n\t\tleadQualified: (input) => {\n\t\t\tconst { externalId, email, name, ...context } = input ?? {};\n\t\t\treturn emit({\n\t\t\t\tevent: \"lead_qualified\",\n\t\t\t\tproperties: { externalId, email, name },\n\t\t\t\t...context,\n\t\t\t});\n\t\t},\n\t\tconverted: ({ amount, currency, occurredAt, ...context }) =>\n\t\t\temit({\n\t\t\t\tevent: \"converted\",\n\t\t\t\tproperties: { amount, currency, occurredAt },\n\t\t\t\t...context,\n\t\t\t}),\n\t};\n}\n","// ============================================================================\n// Meta key extraction helpers\n// ============================================================================\n\n/** Pick the first non-empty string value from `meta` matching the given keys. */\nfunction pickFirst(\n\tmeta: Record<string, unknown>,\n\tkeys: readonly string[],\n): string | undefined {\n\tfor (const key of keys) {\n\t\tconst value = meta[key];\n\t\tif (typeof value === \"string\" && value.length > 0) {\n\t\t\treturn value;\n\t\t}\n\t}\n\treturn undefined;\n}\n\n// --- Key lists (ordered by priority) ---\n\nconst SESSION_ID_KEYS = [\n\t\"waniwani/sessionId\",\n\t\"openai/sessionId\",\n\t\"openai/session\",\n\t\"sessionId\",\n\t\"conversationId\",\n\t\"mcp-session-id\",\n] as const;\n\nconst REQUEST_ID_KEYS = [\n\t\"waniwani/requestId\",\n\t\"openai/requestId\",\n\t\"requestId\",\n\t\"mcp/requestId\",\n] as const;\n\nconst TRACE_ID_KEYS = [\n\t\"waniwani/traceId\",\n\t\"openai/traceId\",\n\t\"traceId\",\n\t\"mcp/traceId\",\n\t\"openai/requestId\",\n\t\"requestId\",\n] as const;\n\nconst EXTERNAL_USER_ID_KEYS = [\n\t\"waniwani/userId\",\n\t\"openai/userId\",\n\t\"externalUserId\",\n\t\"userId\",\n\t\"actorId\",\n] as const;\n\nconst VISITOR_ID_KEYS = [\"waniwani/visitorId\", \"visitorId\"] as const;\n\nconst CORRELATION_ID_KEYS = [\"correlationId\", \"openai/requestId\"] as const;\n\nconst TURN_COUNT_KEYS = [\"waniwani/turnCount\"] as const;\n\n/** Meta key for flow execution path (nodesVisited, flowId). */\nexport const FLOW_META_KEY = \"waniwani/flow\" as const;\n\nexport type { SuggestionsMeta } from \"../../shared/meta-keys\";\nexport { SUGGESTIONS_META_KEY } from \"../../shared/meta-keys\";\n\n/**\n * Meta key under which `withWaniwani` injects the widget tracking config\n * (`{ endpoint, token, sessionId, source, geoLocation }`) into tool response\n * `_meta`. The frontend client reads it to track without any manual wiring.\n * Older SDKs wrote the same object under the bare `waniwani` key.\n */\nexport const WIDGET_CONFIG_META_KEY = \"waniwani/widget\" as const;\n\n// --- Extractors ---\n\nexport function extractSessionId(\n\tmeta: Record<string, unknown> | undefined,\n): string | undefined {\n\treturn meta ? pickFirst(meta, SESSION_ID_KEYS) : undefined;\n}\n\nexport function extractRequestId(\n\tmeta: Record<string, unknown> | undefined,\n): string | undefined {\n\treturn meta ? pickFirst(meta, REQUEST_ID_KEYS) : undefined;\n}\n\nexport function extractTraceId(\n\tmeta: Record<string, unknown> | undefined,\n): string | undefined {\n\treturn meta ? pickFirst(meta, TRACE_ID_KEYS) : undefined;\n}\n\nexport function extractExternalUserId(\n\tmeta: Record<string, unknown> | undefined,\n): string | undefined {\n\treturn meta ? pickFirst(meta, EXTERNAL_USER_ID_KEYS) : undefined;\n}\n\nexport function extractVisitorId(\n\tmeta: Record<string, unknown> | undefined,\n): string | undefined {\n\treturn meta ? pickFirst(meta, VISITOR_ID_KEYS) : undefined;\n}\n\nexport function extractCorrelationId(\n\tmeta: Record<string, unknown> | undefined,\n): string | undefined {\n\treturn meta ? pickFirst(meta, CORRELATION_ID_KEYS) : undefined;\n}\n\n/**\n * Number of user messages in the current chat session, as counted by the\n * Waniwani app before dispatching the MCP request. Useful for MCPs that\n * gate behavior on conversation length (e.g. compulsory email verification\n * after N turns) without each MCP having to track turn state itself.\n *\n * Forwarded as `waniwani/turnCount` (non-negative integer).\n */\nexport function extractTurnCount(\n\tmeta: Record<string, unknown> | undefined,\n): number | undefined {\n\tif (!meta) {\n\t\treturn undefined;\n\t}\n\tfor (const key of TURN_COUNT_KEYS) {\n\t\tconst value = meta[key];\n\t\tif (typeof value === \"number\" && Number.isFinite(value) && value >= 0) {\n\t\t\treturn value;\n\t\t}\n\t}\n\treturn undefined;\n}\n\nconst SOURCE_SESSION_KEYS = [\n\t{ key: \"openai/sessionId\", source: \"chatgpt\" },\n\t{ key: \"openai/session\", source: \"chatgpt\" },\n] as const;\n\n/**\n * Client identifiers advertised via MCP `initialize` → `clientInfo.name` that\n * the SDK maps to a known source. Match is case-insensitive substring on the\n * advertised name, so this catches \"Claude\", \"Claude Code\", \"claude-ai\", etc.\n * without having to enumerate every surface.\n *\n * ChatGPT is primarily identified by its `openai/*` session key (see\n * SOURCE_SESSION_KEYS), but a session without that key still resolves here from\n * the advertised client name so assistant traffic is attributed consistently.\n * First match wins, so order the needles most-specific first.\n */\nconst CLIENT_INFO_NAME_SOURCES: ReadonlyArray<{\n\tneedle: string;\n\tsource: string;\n}> = [\n\t{ needle: \"claude\", source: \"claude\" },\n\t{ needle: \"chatgpt\", source: \"chatgpt\" },\n\t{ needle: \"openai\", source: \"chatgpt\" },\n\t{ needle: \"gemini\", source: \"gemini\" },\n];\n\nexport type ExtractSourceClientInfo = {\n\tname?: string;\n\tversion?: string;\n};\n\nexport function extractSource(\n\tmeta: Record<string, unknown> | undefined,\n\tclientInfo?: ExtractSourceClientInfo,\n): string | undefined {\n\tif (meta) {\n\t\tconst explicit = meta[\"waniwani/source\"];\n\t\tif (typeof explicit === \"string\" && explicit.length > 0) {\n\t\t\treturn explicit;\n\t\t}\n\t\tfor (const { key, source } of SOURCE_SESSION_KEYS) {\n\t\t\tconst value = meta[key];\n\t\t\tif (typeof value === \"string\" && value.length > 0) {\n\t\t\t\treturn source;\n\t\t\t}\n\t\t}\n\t}\n\t// Fall back to MCP `initialize` clientInfo.name when no _meta key matches.\n\t// Claude surfaces (Code, Desktop, claude.ai connector, Anthropic API MCP\n\t// connector) don't expose a namespaced session id in _meta but do advertise\n\t// themselves in the handshake. Per-MCP-session clientInfo is captured by the\n\t// MCP transport and exposed via server.getClientVersion().\n\tconst name = clientInfo?.name;\n\tif (typeof name === \"string\" && name.length > 0) {\n\t\tconst lower = name.toLowerCase();\n\t\tfor (const { needle, source } of CLIENT_INFO_NAME_SOURCES) {\n\t\t\tif (lower.includes(needle)) {\n\t\t\t\treturn source;\n\t\t\t}\n\t\t}\n\t}\n\treturn undefined;\n}\n\n/**\n * HTTP request headers that identify a known caller when neither `_meta` nor\n * `clientInfo` carries a source. This is the most robust Claude signal: every\n * Claude surface sends `User-Agent: Claude-User` and `x-anthropic-client` on\n * MCP HTTP requests, whereas the MCP transport carries no session id and the\n * `initialize` `clientInfo` may not be surfaced on stateless deployments.\n */\nfunction headerValue(\n\theaders: Record<string, unknown>,\n\tkey: string,\n): string | undefined {\n\t// HTTP header names are case-insensitive; the transport may preserve the\n\t// original casing, so match the key case-insensitively rather than assuming\n\t// it was lowercased.\n\tconst lowerKey = key.toLowerCase();\n\tlet raw = headers[key] ?? headers[lowerKey];\n\tif (raw === undefined) {\n\t\tfor (const headerKey of Object.keys(headers)) {\n\t\t\tif (headerKey.toLowerCase() === lowerKey) {\n\t\t\t\traw = headers[headerKey];\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\tconst value = Array.isArray(raw) ? raw[0] : raw;\n\treturn typeof value === \"string\" && value.length > 0 ? value : undefined;\n}\n\nexport function extractSourceFromHeaders(\n\theaders: Record<string, unknown> | undefined,\n): string | undefined {\n\tif (!headers) {\n\t\treturn undefined;\n\t}\n\tconst userAgent = headerValue(headers, \"user-agent\");\n\tconst anthropicClient = headerValue(headers, \"x-anthropic-client\");\n\tif (\n\t\t(userAgent && /claude/i.test(userAgent)) ||\n\t\t(anthropicClient && /claude|anthropic/i.test(anthropicClient))\n\t) {\n\t\treturn \"claude\";\n\t}\n\t// ChatGPT / OpenAI surfaces without an `openai/*` session key still send an\n\t// OpenAI user-agent (e.g. `ChatGPT-User`), so attribute them here too.\n\tif (userAgent && /chatgpt|openai/i.test(userAgent)) {\n\t\treturn \"chatgpt\";\n\t}\n\treturn undefined;\n}\n","/**\n * `_meta` keys shared between the MCP server surface and the browser chat\n * bundle. Kept in `shared/` so both import the same string literal instead of\n * duplicating it, without the chat bundle pulling in server code.\n */\n\n/**\n * Suggested answers for the flow's current step. Every flow tool result\n * carries this key — a non-empty array only when the step has exactly one\n * open question (the only case where a single pill is an unambiguous\n * answer), an empty array otherwise. The chat widget renders a non-empty\n * array as pills and treats the key's presence, empty or not, as\n * authoritative for the turn; other MCP hosts ignore the key.\n */\nexport const SUGGESTIONS_META_KEY = \"waniwani/suggestions\" as const;\n\n/** Shape stored under {@link SUGGESTIONS_META_KEY}. */\nexport type SuggestionsMeta = {\n\tsuggestions: string[];\n};\n","// Legacy MCP-widget React surface. Mounted at `@waniwani/sdk/legacy/react`\n// and re-exported from `@waniwani/sdk/mcp/react` for back-compat.\n//\n// The MCP-widget-in-host pattern (createResource + createTool + WidgetProvider\n// + the host bridge hooks) is no longer the recommended way to build new code.\n// Use `createFlow` from `@waniwani/sdk/mcp` instead. These exports stay alive\n// indefinitely for the ~14 customer MCPs already on this stack.\n\n// Components\nexport { InitializeNextJsInIframe } from \"./components/initialize-next-in-iframe\";\n// Dev tools\nexport {\n\tDevModeProvider,\n\tgetMockState,\n\tinitializeMockOpenAI,\n\tupdateMockDisplayMode,\n\tupdateMockGlobal,\n\tupdateMockTheme,\n\tupdateMockToolOutput,\n} from \"./dev/index\";\n// Client-side types\nexport type {\n\tDeviceType,\n\tDisplayMode,\n\tSafeArea,\n\tSafeAreaInsets,\n\tTheme,\n\tUnknownObject,\n\tUserAgent,\n} from \"./hooks/@types\";\n// Hooks\nexport type {\n\tFlowActionResult,\n\tModelContextContentBlock,\n\tModelContextUpdate,\n\tSendFollowUpOptions,\n\tUnstableSendFollowUpWithGhostGuardResult,\n} from \"./hooks/index\";\nexport {\n\tunstable_useSendFollowUpWithGhostGuard,\n\tuseCallTool,\n\tuseDisplayMode,\n\tuseFlowAction,\n\tuseIsChatGptApp,\n\tuseLocale,\n\tuseMaxHeight,\n\tuseOpenExternal,\n\tuseRequestDisplayMode,\n\tuseSafeArea,\n\tuseSendFollowUp,\n\tuseTheme,\n\tuseToolOutput,\n\tuseToolResponseMetadata,\n\tuseUpdateModelContext,\n\tuseWidgetClient,\n\tuseWidgetState,\n\tWidgetProvider,\n} from \"./hooks/index\";\nexport { LoadingWidget } from \"./widgets/loading-widget\";\n// Platform detection\nexport type { WidgetPlatform } from \"./widgets/platform\";\nexport { detectPlatform, isMCPApps, isOpenAI } from \"./widgets/platform\";\n// Widget client types\nexport type {\n\tHostContext,\n\tToolCallResult,\n\tToolResult,\n\tUnifiedWidgetClient,\n} from \"./widgets/widget-client\";\n","/**\n * Patches `history`, `<html>` mutations and `window.fetch` so a Next.js\n * widget can run inside a cross-origin iframe host. Reads its config from\n * `window.innerBaseUrl` and `window.__wwPassthroughOrigins`, which the\n * surrounding `<script>` tags set before this runs.\n *\n * Exported so tests can drive it directly. Production code never imports\n * it — the component below stringifies it into the SSR HTML.\n */\nexport function applyIframePatches(): void {\n\tconst baseUrl = window.innerBaseUrl;\n\tconst passthroughOrigins: string[] =\n\t\t(window as unknown as { __wwPassthroughOrigins: string[] })\n\t\t\t.__wwPassthroughOrigins ?? [];\n\tconst htmlElement = document.documentElement;\n\tconst observer = new MutationObserver((mutations) => {\n\t\tmutations.forEach((mutation) => {\n\t\t\tif (mutation.type === \"attributes\" && mutation.target === htmlElement) {\n\t\t\t\tconst attrName = mutation.attributeName;\n\t\t\t\t// Preserve class/style for theming (html.dark) and lang for i18n\n\t\t\t\tif (\n\t\t\t\t\tattrName &&\n\t\t\t\t\tattrName !== \"suppresshydrationwarning\" &&\n\t\t\t\t\tattrName !== \"lang\" &&\n\t\t\t\t\tattrName !== \"class\" &&\n\t\t\t\t\tattrName !== \"style\"\n\t\t\t\t) {\n\t\t\t\t\thtmlElement.removeAttribute(attrName);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t});\n\tobserver.observe(htmlElement, {\n\t\tattributes: true,\n\t\tattributeOldValue: true,\n\t});\n\n\tconst originalReplaceState = history.replaceState.bind(history);\n\thistory.replaceState = (\n\t\t_s: unknown,\n\t\tunused: string,\n\t\turl?: string | URL | null,\n\t) => {\n\t\ttry {\n\t\t\tconst u = new URL(String(url ?? \"\"), window.location.href);\n\t\t\toriginalReplaceState(null, unused, u.pathname + u.search + u.hash);\n\t\t} catch {\n\t\t\t/* SecurityError in sandboxed iframe */\n\t\t}\n\t};\n\n\tconst originalPushState = history.pushState.bind(history);\n\thistory.pushState = (\n\t\t_s: unknown,\n\t\tunused: string,\n\t\turl?: string | URL | null,\n\t) => {\n\t\ttry {\n\t\t\tconst u = new URL(String(url ?? \"\"), window.location.href);\n\t\t\toriginalPushState(null, unused, u.pathname + u.search + u.hash);\n\t\t} catch {\n\t\t\t/* SecurityError in sandboxed iframe */\n\t\t}\n\t};\n\n\tconst appOrigin = new URL(baseUrl).origin;\n\tconst isInIframe = window.self !== window.top;\n\n\twindow.addEventListener(\n\t\t\"click\",\n\t\t(e) => {\n\t\t\tconst a = (e?.target as HTMLElement)?.closest(\"a\");\n\t\t\tif (!a || !a.href) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst url = new URL(a.href, window.location.href);\n\t\t\tif (url.origin !== window.location.origin && url.origin !== appOrigin) {\n\t\t\t\ttry {\n\t\t\t\t\tif (window.openai) {\n\t\t\t\t\t\twindow.openai?.openExternal({ href: a.href });\n\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t}\n\t\t\t\t} catch {\n\t\t\t\t\tconsole.warn(\"openExternal failed, likely not in OpenAI client\");\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\ttrue,\n\t);\n\n\tif (isInIframe && window.location.origin !== appOrigin) {\n\t\tconst originalFetch = window.fetch;\n\n\t\t(window as { fetch: typeof window.fetch }).fetch = ((\n\t\t\tinput: URL | RequestInfo,\n\t\t\tinit?: RequestInit,\n\t\t): Promise<Response> => {\n\t\t\t// Only string inputs without a scheme (or `//host`) are treated\n\t\t\t// as relative. URL/Request instances are always absolute, so\n\t\t\t// the caller already chose the target host.\n\t\t\tconst isRelativeString =\n\t\t\t\ttypeof input === \"string\" &&\n\t\t\t\t!/^[a-z][a-z0-9+.-]*:/i.test(input) &&\n\t\t\t\t!input.startsWith(\"//\");\n\n\t\t\tlet url: URL;\n\t\t\tif (typeof input === \"string\" || input instanceof URL) {\n\t\t\t\turl = new URL(input, window.location.href);\n\t\t\t} else {\n\t\t\t\turl = new URL(input.url, window.location.href);\n\t\t\t}\n\n\t\t\tif (url.origin === appOrigin) {\n\t\t\t\tif (typeof input === \"string\" || input instanceof URL) {\n\t\t\t\t\tinput = url.toString();\n\t\t\t\t} else {\n\t\t\t\t\tinput = new Request(url.toString(), input);\n\t\t\t\t}\n\n\t\t\t\treturn originalFetch.call(window, input, {\n\t\t\t\t\t...init,\n\t\t\t\t\tmode: \"cors\",\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tif (passthroughOrigins.indexOf(url.origin) !== -1) {\n\t\t\t\treturn originalFetch.call(window, input, init);\n\t\t\t}\n\n\t\t\t// Rewrite *relative* same-origin requests to the widget's real\n\t\t\t// `baseUrl`. Absolute URLs are left alone — they're the\n\t\t\t// caller's explicit target (e.g. SDK transport posting to the\n\t\t\t// Waniwani API on the same origin as the iframe).\n\t\t\tif (isRelativeString && url.origin === window.location.origin) {\n\t\t\t\tconst newUrl = new URL(baseUrl);\n\t\t\t\tnewUrl.pathname = url.pathname;\n\t\t\t\tnewUrl.search = url.search;\n\t\t\t\tnewUrl.hash = url.hash;\n\t\t\t\turl = newUrl;\n\t\t\t\tinput = url.toString();\n\n\t\t\t\treturn originalFetch.call(window, input, {\n\t\t\t\t\t...init,\n\t\t\t\t\tmode: \"cors\",\n\t\t\t\t});\n\t\t\t}\n\n\t\t\treturn originalFetch.call(window, input, init);\n\t\t}) as typeof window.fetch;\n\n\t\tconst wsAppOrigin = appOrigin.replace(/^http/, \"ws\");\n\t\tconst OriginalWebSocket = window.WebSocket;\n\t\tconst PatchedWebSocket = ((\n\t\t\turl: string | URL,\n\t\t\tprotocols?: string | string[],\n\t\t) => {\n\t\t\tconst parsed = new URL(String(url), window.location.href);\n\t\t\tif (\n\t\t\t\tparsed.origin === window.location.origin ||\n\t\t\t\tparsed.origin === window.location.origin.replace(/^http/, \"ws\")\n\t\t\t) {\n\t\t\t\tconst rewritten = new URL(wsAppOrigin);\n\t\t\t\trewritten.pathname = parsed.pathname;\n\t\t\t\trewritten.search = parsed.search;\n\t\t\t\trewritten.hash = parsed.hash;\n\t\t\t\treturn new OriginalWebSocket(rewritten.toString(), protocols);\n\t\t\t}\n\t\t\treturn new OriginalWebSocket(url, protocols);\n\t\t}) as unknown as typeof WebSocket;\n\t\tPatchedWebSocket.prototype = OriginalWebSocket.prototype;\n\t\tObject.assign(PatchedWebSocket, {\n\t\t\tCONNECTING: OriginalWebSocket.CONNECTING,\n\t\t\tOPEN: OriginalWebSocket.OPEN,\n\t\t\tCLOSING: OriginalWebSocket.CLOSING,\n\t\t\tCLOSED: OriginalWebSocket.CLOSED,\n\t\t});\n\t\t(window as { WebSocket: typeof WebSocket }).WebSocket = PatchedWebSocket;\n\t}\n}\n\nconst PATCH_SCRIPT = `(${applyIframePatches.toString()})()`;\n\n/**\n * Initializes & patches Next.js functionality so an app can run as a\n * widget inside a cross-origin iframe. Used by every MCP widget host —\n * ChatGPT's sandbox, the embed's `/api/mcp/chat/resource` proxy, and any\n * future host that renders the widget on a domain other than its own\n * `baseUrl`.\n *\n * See `applyIframePatches` for the patch behavior.\n *\n * More background on the ChatGPT case:\n * https://vercel.com/blog/running-next-js-inside-chatgpt-a-deep-dive-into-native-app-integration\n *\n * @deprecated Legacy MCP-widget-in-host stack (used with `createResource`/`createTool`).\n * Preserved for back-compat; will move to `@waniwani/sdk/legacy/react` in a future minor\n * release.\n */\nexport function InitializeNextJsInIframe({\n\tbaseUrl,\n\tpassthroughOrigins,\n}: {\n\tbaseUrl: string;\n\t/**\n\t * Origins whose fetches should skip the relative same-origin → baseUrl\n\t * rewrite. Only needed for relative-URL calls that resolve to an\n\t * origin you do not want forwarded to `baseUrl` — absolute URLs are\n\t * never rewritten regardless of this list.\n\t */\n\tpassthroughOrigins?: string[];\n}) {\n\treturn (\n\t\t<>\n\t\t\t<base href={baseUrl}></base>\n\t\t\t<script>{`window.innerBaseUrl = ${JSON.stringify(baseUrl)}`}</script>\n\t\t\t<script>{`window.__wwPassthroughOrigins = ${JSON.stringify(passthroughOrigins ?? [])}`}</script>\n\t\t\t<script>{`window.__isChatGptApp = typeof window.openai !== \"undefined\";`}</script>\n\t\t\t<script>{PATCH_SCRIPT}</script>\n\t\t</>\n\t);\n}\n","/**\n * Dev-mode tooling for the legacy MCP-widget-in-host stack.\n *\n * @deprecated Legacy MCP-widget-in-host stack. Preserved for back-compat; will move to\n * `@waniwani/sdk/legacy/react` in a future minor release.\n *\n * @module\n */\n\nexport { DevModeProvider } from \"./dev-controls\";\nexport {\n\tgetMockState,\n\tinitializeMockOpenAI,\n\tupdateMockDisplayMode,\n\tupdateMockGlobal,\n\tupdateMockTheme,\n\tupdateMockToolOutput,\n} from \"./mock-openai\";\n","\"use client\";\n\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport type { DisplayMode, Theme } from \"../hooks/@types\";\nimport { SetGlobalsEvent } from \"../hooks/@types\";\nimport {\n\tgetMockState,\n\tinitializeMockOpenAI,\n\tupdateMockDisplayMode,\n\tupdateMockTheme,\n\tupdateMockToolOutput,\n} from \"./mock-openai\";\n\nconst MOCK_SAFE_AREA_HEIGHT = 150;\n\n// ============================================================================\n// SVG Icons\n// ============================================================================\n\nfunction DevIcon({ className }: { className?: string }) {\n\treturn (\n\t\t<svg\n\t\t\tclassName={className}\n\t\t\tviewBox=\"0 0 24 24\"\n\t\t\tfill=\"none\"\n\t\t\trole=\"img\"\n\t\t\taria-label=\"Dev Controls\"\n\t\t>\n\t\t\t{/* Minimal: two stacked squares offset */}\n\t\t\t<rect\n\t\t\t\tx=\"4\"\n\t\t\t\ty=\"4\"\n\t\t\t\twidth=\"10\"\n\t\t\t\theight=\"10\"\n\t\t\t\trx=\"2\"\n\t\t\t\tstroke=\"currentColor\"\n\t\t\t\tstrokeWidth=\"1.5\"\n\t\t\t/>\n\t\t\t<rect\n\t\t\t\tx=\"10\"\n\t\t\t\ty=\"10\"\n\t\t\t\twidth=\"10\"\n\t\t\t\theight=\"10\"\n\t\t\t\trx=\"2\"\n\t\t\t\tstroke=\"currentColor\"\n\t\t\t\tstrokeWidth=\"1.5\"\n\t\t\t\tfill=\"currentColor\"\n\t\t\t\tfillOpacity=\"0.15\"\n\t\t\t/>\n\t\t</svg>\n\t);\n}\n\nfunction CloseIcon({ className }: { className?: string }) {\n\treturn (\n\t\t<svg\n\t\t\taria-hidden=\"true\"\n\t\t\tclassName={className}\n\t\t\tviewBox=\"0 0 24 24\"\n\t\t\tfill=\"none\"\n\t\t\tstroke=\"currentColor\"\n\t\t\tstrokeWidth=\"2\"\n\t\t\tstrokeLinecap=\"round\"\n\t\t\tstrokeLinejoin=\"round\"\n\t\t>\n\t\t\t<path d=\"M18 6L6 18M6 6l12 12\" />\n\t\t</svg>\n\t);\n}\n\nfunction InlineIcon({ className }: { className?: string }) {\n\treturn (\n\t\t<svg\n\t\t\taria-hidden=\"true\"\n\t\t\tclassName={className}\n\t\t\tviewBox=\"0 0 16 16\"\n\t\t\tfill=\"none\"\n\t\t>\n\t\t\t<rect\n\t\t\t\tx=\"2\"\n\t\t\t\ty=\"4\"\n\t\t\t\twidth=\"12\"\n\t\t\t\theight=\"8\"\n\t\t\t\trx=\"1.5\"\n\t\t\t\tstroke=\"currentColor\"\n\t\t\t\tstrokeWidth=\"1.25\"\n\t\t\t/>\n\t\t</svg>\n\t);\n}\n\nfunction PipIcon({ className }: { className?: string }) {\n\treturn (\n\t\t<svg\n\t\t\taria-hidden=\"true\"\n\t\t\tclassName={className}\n\t\t\tviewBox=\"0 0 16 16\"\n\t\t\tfill=\"none\"\n\t\t>\n\t\t\t<rect\n\t\t\t\tx=\"1.5\"\n\t\t\t\ty=\"3\"\n\t\t\t\twidth=\"13\"\n\t\t\t\theight=\"10\"\n\t\t\t\trx=\"1.5\"\n\t\t\t\tstroke=\"currentColor\"\n\t\t\t\tstrokeWidth=\"1.25\"\n\t\t\t/>\n\t\t\t<rect x=\"8.5\" y=\"7\" width=\"5\" height=\"4\" rx=\"0.75\" fill=\"currentColor\" />\n\t\t</svg>\n\t);\n}\n\nfunction FullscreenIcon({ className }: { className?: string }) {\n\treturn (\n\t\t<svg\n\t\t\taria-hidden=\"true\"\n\t\t\tclassName={className}\n\t\t\tviewBox=\"0 0 16 16\"\n\t\t\tfill=\"none\"\n\t\t>\n\t\t\t<path\n\t\t\t\td=\"M2 5.5V3.5C2 2.95 2.45 2.5 3 2.5H5.5M10.5 2.5H13C13.55 2.5 14 2.95 14 3.5V5.5M14 10.5V12.5C14 13.05 13.55 13.5 13 13.5H10.5M5.5 13.5H3C2.45 13.5 2 13.05 2 12.5V10.5\"\n\t\t\t\tstroke=\"currentColor\"\n\t\t\t\tstrokeWidth=\"1.25\"\n\t\t\t\tstrokeLinecap=\"round\"\n\t\t\t\tstrokeLinejoin=\"round\"\n\t\t\t/>\n\t\t</svg>\n\t);\n}\n\nfunction SunIcon({ className }: { className?: string }) {\n\treturn (\n\t\t<svg\n\t\t\taria-hidden=\"true\"\n\t\t\tclassName={className}\n\t\t\tviewBox=\"0 0 16 16\"\n\t\t\tfill=\"none\"\n\t\t>\n\t\t\t<circle cx=\"8\" cy=\"8\" r=\"2.5\" stroke=\"currentColor\" strokeWidth=\"1.25\" />\n\t\t\t<path\n\t\t\t\td=\"M8 2v1.5M8 12.5V14M2 8h1.5M12.5 8H14M4.11 4.11l1.06 1.06M10.83 10.83l1.06 1.06M4.11 11.89l1.06-1.06M10.83 5.17l1.06-1.06\"\n\t\t\t\tstroke=\"currentColor\"\n\t\t\t\tstrokeWidth=\"1.25\"\n\t\t\t\tstrokeLinecap=\"round\"\n\t\t\t/>\n\t\t</svg>\n\t);\n}\n\nfunction MoonIcon({ className }: { className?: string }) {\n\treturn (\n\t\t<svg\n\t\t\taria-hidden=\"true\"\n\t\t\tclassName={className}\n\t\t\tviewBox=\"0 0 16 16\"\n\t\t\tfill=\"none\"\n\t\t>\n\t\t\t<path\n\t\t\t\td=\"M13.5 9.5a5.5 5.5 0 01-7-7 5.5 5.5 0 107 7z\"\n\t\t\t\tstroke=\"currentColor\"\n\t\t\t\tstrokeWidth=\"1.25\"\n\t\t\t\tstrokeLinecap=\"round\"\n\t\t\t\tstrokeLinejoin=\"round\"\n\t\t\t/>\n\t\t</svg>\n\t);\n}\n\nfunction ResetIcon({ className }: { className?: string }) {\n\treturn (\n\t\t<svg\n\t\t\taria-hidden=\"true\"\n\t\t\tclassName={className}\n\t\t\tviewBox=\"0 0 16 16\"\n\t\t\tfill=\"none\"\n\t\t>\n\t\t\t<path\n\t\t\t\td=\"M2.5 8a5.5 5.5 0 019.37-3.9M13.5 8a5.5 5.5 0 01-9.37 3.9\"\n\t\t\t\tstroke=\"currentColor\"\n\t\t\t\tstrokeWidth=\"1.25\"\n\t\t\t\tstrokeLinecap=\"round\"\n\t\t\t/>\n\t\t\t<path\n\t\t\t\td=\"M12.5 2v3h-3M3.5 14v-3h3\"\n\t\t\t\tstroke=\"currentColor\"\n\t\t\t\tstrokeWidth=\"1.25\"\n\t\t\t\tstrokeLinecap=\"round\"\n\t\t\t\tstrokeLinejoin=\"round\"\n\t\t\t/>\n\t\t</svg>\n\t);\n}\n\n// ============================================================================\n// Styles\n// ============================================================================\n\nconst panelAnimationStyles = `\n @keyframes devPanelSlideIn {\n 0% {\n opacity: 0;\n transform: translateY(12px) scale(0.98);\n }\n 100% {\n opacity: 1;\n transform: translateY(0) scale(1);\n }\n }\n\n @keyframes devPanelSlideOut {\n 0% {\n opacity: 1;\n transform: translateY(0) scale(1);\n }\n 100% {\n opacity: 0;\n transform: translateY(8px) scale(0.98);\n }\n }\n\n .dev-panel-enter {\n animation: devPanelSlideIn 200ms cubic-bezier(0.16, 1, 0.3, 1) forwards;\n }\n\n .dev-panel-exit {\n animation: devPanelSlideOut 150ms cubic-bezier(0.4, 0, 1, 1) forwards;\n }\n\n .dev-json-editor::-webkit-scrollbar {\n width: 6px;\n height: 6px;\n }\n\n .dev-json-editor::-webkit-scrollbar-track {\n background: transparent;\n }\n\n .dev-json-editor::-webkit-scrollbar-thumb {\n background: rgba(255, 255, 255, 0.1);\n border-radius: 3px;\n }\n\n .dev-json-editor::-webkit-scrollbar-thumb:hover {\n background: rgba(255, 255, 255, 0.15);\n }\n`;\n\n// ============================================================================\n// Components\n// ============================================================================\n\ninterface DevControlsProps {\n\tdefaultProps?: Record<string, unknown>;\n\twidgetPaths?: string[];\n}\n\n/**\n * @deprecated Legacy MCP-widget-in-host stack. Preserved for back-compat; will move to\n * `@waniwani/sdk/legacy/react` in a future minor release.\n */\nexport function DevModeProvider({\n\tdefaultProps,\n\twidgetPaths,\n\tchildren,\n}: DevControlsProps & { children: React.ReactNode }) {\n\tconst [isInitialized, setIsInitialized] = useState(false);\n\tconst [isWidgetPage, setIsWidgetPage] = useState(false);\n\n\tuseEffect(() => {\n\t\t// When loaded inside the MCP harness iframe, skip the OpenAI mock\n\t\t// so the real MCPAppsWidgetClient + App class is used instead.\n\t\tconst params = new URLSearchParams(window.location.search);\n\t\tif (params.get(\"platform\") === \"mcp-apps\") {\n\t\t\tsetIsInitialized(true);\n\t\t\treturn;\n\t\t}\n\n\t\t// Check if current path is a widget page\n\t\tif (widgetPaths && widgetPaths.length > 0) {\n\t\t\tconst currentPath = window.location.pathname;\n\t\t\tconst isWidget = widgetPaths.some(\n\t\t\t\t(path) => currentPath === path || currentPath.startsWith(`${path}/`),\n\t\t\t);\n\t\t\tsetIsWidgetPage(isWidget);\n\n\t\t\tif (isWidget) {\n\t\t\t\tinitializeMockOpenAI(defaultProps);\n\t\t\t}\n\t\t} else {\n\t\t\t// If no widgetPaths specified, treat all pages as widget pages (backwards compat)\n\t\t\tinitializeMockOpenAI(defaultProps);\n\t\t\tsetIsWidgetPage(true);\n\t\t}\n\t\tsetIsInitialized(true);\n\t}, [defaultProps, widgetPaths]);\n\n\tif (!isInitialized) {\n\t\treturn null;\n\t}\n\n\t// If not a widget page, just render children without the dev frame\n\tif (!isWidgetPage) {\n\t\treturn <>{children}</>;\n\t}\n\n\treturn (\n\t\t<>\n\t\t\t<WidgetPreviewFrame>{children}</WidgetPreviewFrame>\n\t\t\t<DevControls defaultProps={defaultProps} />\n\t\t</>\n\t);\n}\n\nfunction WidgetPreviewFrame({ children }: { children: React.ReactNode }) {\n\treturn (\n\t\t<div className=\"min-h-screen bg-[#212121] flex items-center justify-center p-8\">\n\t\t\t<div\n\t\t\t\tclassName=\"relative w-full max-w-md overflow-hidden rounded-2xl sm:rounded-3xl border border-[#414141]\"\n\t\t\t\tstyle={{\n\t\t\t\t\tboxShadow: \"0px 0px 0px 1px #414141, 0px 4px 14px rgba(0,0,0,0.24)\",\n\t\t\t\t}}\n\t\t\t>\n\t\t\t\t{children}\n\t\t\t</div>\n\t\t</div>\n\t);\n}\n\n// ============================================================================\n// Segmented Control\n// ============================================================================\n\ninterface SegmentOption<T extends string> {\n\tvalue: T;\n\tlabel: string;\n\ticon: React.ReactNode;\n}\n\ninterface SegmentedControlProps<T extends string> {\n\toptions: SegmentOption<T>[];\n\tvalue: T;\n\tonChange: (value: T) => void;\n}\n\nfunction SegmentedControl<T extends string>({\n\toptions,\n\tvalue,\n\tonChange,\n}: SegmentedControlProps<T>) {\n\tconst activeIndex = options.findIndex((opt) => opt.value === value);\n\n\treturn (\n\t\t<div\n\t\t\tclassName=\"relative flex p-0.5 rounded-lg\"\n\t\t\tstyle={{\n\t\t\t\tbackground: \"rgba(255, 255, 255, 0.04)\",\n\t\t\t\tborder: \"1px solid rgba(255, 255, 255, 0.06)\",\n\t\t\t}}\n\t\t>\n\t\t\t{/* Sliding indicator */}\n\t\t\t<div\n\t\t\t\tclassName=\"absolute top-0.5 bottom-0.5 rounded-md transition-transform duration-150 ease-out\"\n\t\t\t\tstyle={{\n\t\t\t\t\twidth: `calc(${100 / options.length}% - 2px)`,\n\t\t\t\t\tleft: \"2px\",\n\t\t\t\t\ttransform: `translateX(calc(${activeIndex * 100}% + ${activeIndex * 2}px))`,\n\t\t\t\t\tbackground: \"rgba(255, 255, 255, 0.1)\",\n\t\t\t\t}}\n\t\t\t/>\n\n\t\t\t{options.map((option) => (\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tkey={option.value}\n\t\t\t\t\tonClick={() => onChange(option.value)}\n\t\t\t\t\tclassName={`\n relative z-10 flex-1 flex items-center justify-center gap-1.5 px-2 py-1.5\n text-xs font-medium rounded-md transition-colors duration-150\n ${value === option.value ? \"text-white\" : \"text-gray-400 hover:text-gray-300\"}\n `}\n\t\t\t\t>\n\t\t\t\t\t{option.icon}\n\t\t\t\t\t<span className=\"capitalize\">{option.label}</span>\n\t\t\t\t</button>\n\t\t\t))}\n\t\t</div>\n\t);\n}\n\n// ============================================================================\n// Main DevControls Component\n// ============================================================================\n\nfunction DevControls({ defaultProps }: DevControlsProps) {\n\tconst [isOpen, setIsOpen] = useState(() => {\n\t\tif (typeof window === \"undefined\") {\n\t\t\treturn false;\n\t\t}\n\t\treturn localStorage.getItem(\"dev-controls-open\") === \"true\";\n\t});\n\tconst [isAnimating, setIsAnimating] = useState(false);\n\tconst [shouldRender, setShouldRender] = useState(isOpen);\n\tconst [displayMode, setDisplayMode] = useState<DisplayMode>(\"inline\");\n\tconst [theme, setTheme] = useState<Theme>(\"dark\");\n\tconst [showSafeArea, setShowSafeArea] = useState(false);\n\tconst [propsJson, setPropsJson] = useState(() =>\n\t\tJSON.stringify(defaultProps ?? {}, null, 2),\n\t);\n\tconst [jsonError, setJsonError] = useState<string | null>(null);\n\tconst debounceRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\tconst panelRef = useRef<HTMLDivElement>(null);\n\tconst containerRef = useRef<HTMLDivElement>(null);\n\n\t// Initialize from mock state\n\tuseEffect(() => {\n\t\tconst state = getMockState();\n\t\tsetDisplayMode(state.displayMode);\n\t\tsetTheme(state.theme);\n\t}, []);\n\n\t// Update safeArea when toggled\n\tuseEffect(() => {\n\t\tif (typeof window === \"undefined\") {\n\t\t\treturn;\n\t\t}\n\t\tif (!window.openai) {\n\t\t\t// biome-ignore lint/suspicious/noExplicitAny: window.openai may not exist yet\n\t\t\t(window as any).openai = {};\n\t\t}\n\t\twindow.openai.safeArea = {\n\t\t\tinsets: {\n\t\t\t\ttop: 0,\n\t\t\t\tbottom: showSafeArea ? MOCK_SAFE_AREA_HEIGHT : 0,\n\t\t\t\tleft: 0,\n\t\t\t\tright: 0,\n\t\t\t},\n\t\t};\n\t\twindow.dispatchEvent(\n\t\t\tnew SetGlobalsEvent({ globals: { safeArea: window.openai.safeArea } }),\n\t\t);\n\t}, [showSafeArea]);\n\n\t// Persist open state\n\tuseEffect(() => {\n\t\tlocalStorage.setItem(\"dev-controls-open\", String(isOpen));\n\t}, [isOpen]);\n\n\tconst openPanel = useCallback(() => {\n\t\tsetShouldRender(true);\n\t\t// Small delay to ensure DOM is ready for animation\n\t\trequestAnimationFrame(() => {\n\t\t\tsetIsOpen(true);\n\t\t});\n\t}, []);\n\n\tconst closePanel = useCallback(() => {\n\t\tsetIsAnimating(true);\n\t\tsetIsOpen(false);\n\t\t// Wait for exit animation\n\t\tsetTimeout(() => {\n\t\t\tsetShouldRender(false);\n\t\t\tsetIsAnimating(false);\n\t\t}, 150);\n\t}, []);\n\n\tconst togglePanel = useCallback(() => {\n\t\tif (isOpen) {\n\t\t\tclosePanel();\n\t\t} else {\n\t\t\topenPanel();\n\t\t}\n\t}, [isOpen, openPanel, closePanel]);\n\n\t// Keyboard shortcuts\n\tuseEffect(() => {\n\t\tconst handleKeyDown = (e: KeyboardEvent) => {\n\t\t\t// Cmd/Ctrl + Shift + D to toggle\n\t\t\tif ((e.metaKey || e.ctrlKey) && e.shiftKey && e.key === \"d\") {\n\t\t\t\te.preventDefault();\n\t\t\t\ttogglePanel();\n\t\t\t}\n\t\t\t// Escape to close\n\t\t\tif (e.key === \"Escape\" && isOpen) {\n\t\t\t\tclosePanel();\n\t\t\t}\n\t\t};\n\n\t\twindow.addEventListener(\"keydown\", handleKeyDown);\n\t\treturn () => window.removeEventListener(\"keydown\", handleKeyDown);\n\t}, [isOpen, togglePanel, closePanel]);\n\n\t// Click outside to close\n\tuseEffect(() => {\n\t\tif (!isOpen) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst handleClickOutside = (e: MouseEvent) => {\n\t\t\tif (\n\t\t\t\tcontainerRef.current &&\n\t\t\t\t!containerRef.current.contains(e.target as Node)\n\t\t\t) {\n\t\t\t\tclosePanel();\n\t\t\t}\n\t\t};\n\n\t\tdocument.addEventListener(\"mousedown\", handleClickOutside);\n\t\treturn () => document.removeEventListener(\"mousedown\", handleClickOutside);\n\t}, [isOpen, closePanel]);\n\n\tconst handleDisplayModeChange = useCallback((mode: DisplayMode) => {\n\t\tsetDisplayMode(mode);\n\t\tupdateMockDisplayMode(mode);\n\t}, []);\n\n\tconst handleThemeChange = useCallback((newTheme: Theme) => {\n\t\tsetTheme(newTheme);\n\t\tupdateMockTheme(newTheme);\n\t}, []);\n\n\tconst applyProps = useCallback((json: string) => {\n\t\ttry {\n\t\t\tconst parsed = JSON.parse(json);\n\t\t\tsetJsonError(null);\n\t\t\tupdateMockToolOutput(parsed);\n\t\t} catch {\n\t\t\tsetJsonError(\"Invalid JSON\");\n\t\t}\n\t}, []);\n\n\tconst handlePropsChange = useCallback(\n\t\t(json: string) => {\n\t\t\tsetPropsJson(json);\n\t\t\tif (debounceRef.current) {\n\t\t\t\tclearTimeout(debounceRef.current);\n\t\t\t}\n\t\t\tdebounceRef.current = setTimeout(() => {\n\t\t\t\tapplyProps(json);\n\t\t\t}, 500);\n\t\t},\n\t\t[applyProps],\n\t);\n\n\tconst handlePropsBlur = useCallback(() => {\n\t\tif (debounceRef.current) {\n\t\t\tclearTimeout(debounceRef.current);\n\t\t}\n\t\tapplyProps(propsJson);\n\t}, [applyProps, propsJson]);\n\n\tconst handleReset = useCallback(() => {\n\t\tconst defaultJson = JSON.stringify(defaultProps ?? {}, null, 2);\n\t\tsetPropsJson(defaultJson);\n\t\tsetJsonError(null);\n\t\tupdateMockToolOutput(defaultProps ?? {});\n\t\tsetDisplayMode(\"inline\");\n\t\tupdateMockDisplayMode(\"inline\");\n\t\tsetTheme(\"dark\");\n\t\tupdateMockTheme(\"dark\");\n\t}, [defaultProps]);\n\n\tconst displayModeOptions: SegmentOption<DisplayMode>[] = [\n\t\t{\n\t\t\tvalue: \"inline\",\n\t\t\tlabel: \"inline\",\n\t\t\ticon: <InlineIcon className=\"w-3.5 h-3.5\" />,\n\t\t},\n\t\t{ value: \"pip\", label: \"pip\", icon: <PipIcon className=\"w-3.5 h-3.5\" /> },\n\t\t{\n\t\t\tvalue: \"fullscreen\",\n\t\t\tlabel: \"full\",\n\t\t\ticon: <FullscreenIcon className=\"w-3.5 h-3.5\" />,\n\t\t},\n\t];\n\n\tconst themeOptions: SegmentOption<Theme>[] = [\n\t\t{\n\t\t\tvalue: \"light\",\n\t\t\tlabel: \"light\",\n\t\t\ticon: <SunIcon className=\"w-3.5 h-3.5\" />,\n\t\t},\n\t\t{\n\t\t\tvalue: \"dark\",\n\t\t\tlabel: \"dark\",\n\t\t\ticon: <MoonIcon className=\"w-3.5 h-3.5\" />,\n\t\t},\n\t];\n\n\treturn (\n\t\t<>\n\t\t\t{/* Inject animation styles */}\n\t\t\t{/** biome-ignore lint/security/noDangerouslySetInnerHtml: we need to inject styles into the DOM */}\n\t\t\t<style dangerouslySetInnerHTML={{ __html: panelAnimationStyles }} />\n\n\t\t\t<div\n\t\t\t\tref={containerRef}\n\t\t\t\tclassName=\"fixed bottom-4 right-4 z-[9999] font-['Inter',_system-ui,_sans-serif]\"\n\t\t\t>\n\t\t\t\t{/* Toggle Button */}\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tonClick={togglePanel}\n\t\t\t\t\tclassName=\"group relative flex items-center justify-center w-11 h-11 rounded-xl transition-all duration-200 ease-out hover:scale-105 active:scale-95\"\n\t\t\t\t\tstyle={{\n\t\t\t\t\t\tbackground: \"rgba(14, 14, 16, 0.95)\",\n\t\t\t\t\t\tbackdropFilter: \"blur(16px)\",\n\t\t\t\t\t\tWebkitBackdropFilter: \"blur(16px)\",\n\t\t\t\t\t\tborder: \"1px solid rgba(255, 255, 255, 0.08)\",\n\t\t\t\t\t\tboxShadow: `\n 0 4px 12px rgba(0, 0, 0, 0.4),\n 0 0 0 1px rgba(255, 255, 255, 0.05),\n inset 0 1px 0 rgba(255, 255, 255, 0.04)\n `,\n\t\t\t\t\t}}\n\t\t\t\t\taria-label=\"Toggle Dev Controls\"\n\t\t\t\t\taria-expanded={isOpen}\n\t\t\t\t>\n\t\t\t\t\t<DevIcon\n\t\t\t\t\t\tclassName={`w-5 h-5 transition-all duration-200 ${\n\t\t\t\t\t\t\tisOpen\n\t\t\t\t\t\t\t\t? \"text-indigo-400 scale-110\"\n\t\t\t\t\t\t\t\t: \"text-gray-300 group-hover:text-white\"\n\t\t\t\t\t\t}`}\n\t\t\t\t\t/>\n\n\t\t\t\t\t{/* Subtle glow on hover */}\n\t\t\t\t\t<div\n\t\t\t\t\t\tclassName=\"absolute inset-0 rounded-xl opacity-0 group-hover:opacity-100 transition-opacity duration-200 pointer-events-none\"\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\tbackground:\n\t\t\t\t\t\t\t\t\"radial-gradient(circle at center, rgba(99, 102, 241, 0.15) 0%, transparent 70%)\",\n\t\t\t\t\t\t}}\n\t\t\t\t\t/>\n\t\t\t\t</button>\n\n\t\t\t\t{/* Panel */}\n\t\t\t\t{shouldRender && (\n\t\t\t\t\t<div\n\t\t\t\t\t\tref={panelRef}\n\t\t\t\t\t\tclassName={`absolute bottom-14 right-0 w-80 ${\n\t\t\t\t\t\t\tisOpen && !isAnimating ? \"dev-panel-enter\" : \"dev-panel-exit\"\n\t\t\t\t\t\t}`}\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\tmaxHeight: \"calc(100vh - 120px)\",\n\t\t\t\t\t\t\tbackground: \"rgba(14, 14, 16, 0.92)\",\n\t\t\t\t\t\t\tbackdropFilter: \"blur(24px)\",\n\t\t\t\t\t\t\tWebkitBackdropFilter: \"blur(24px)\",\n\t\t\t\t\t\t\tborder: \"1px solid rgba(255, 255, 255, 0.06)\",\n\t\t\t\t\t\t\tborderRadius: \"16px\",\n\t\t\t\t\t\t\tboxShadow: `\n 0 25px 50px -12px rgba(0, 0, 0, 0.6),\n 0 0 0 1px rgba(255, 255, 255, 0.05),\n inset 0 1px 0 rgba(255, 255, 255, 0.04)\n `,\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\t{/* Header */}\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tclassName=\"flex items-center justify-between px-4 py-3\"\n\t\t\t\t\t\t\tstyle={{ borderBottom: \"1px solid rgba(255, 255, 255, 0.06)\" }}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<div className=\"flex items-center gap-2\">\n\t\t\t\t\t\t\t\t<DevIcon className=\"w-4 h-4 text-gray-400\" />\n\t\t\t\t\t\t\t\t<span className=\"text-sm font-medium text-white\">\n\t\t\t\t\t\t\t\t\tDev Controls\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t\t<div className=\"flex items-center gap-2\">\n\t\t\t\t\t\t\t\t{/* Keyboard shortcut badge */}\n\t\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\t\tclassName=\"text-[10px] font-medium text-gray-500 px-1.5 py-0.5 rounded\"\n\t\t\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\t\t\tbackground: \"rgba(255, 255, 255, 0.04)\",\n\t\t\t\t\t\t\t\t\t\tborder: \"1px solid rgba(255, 255, 255, 0.06)\",\n\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{typeof navigator !== \"undefined\" &&\n\t\t\t\t\t\t\t\t\tnavigator.platform?.includes(\"Mac\")\n\t\t\t\t\t\t\t\t\t\t? \"⌘⇧D\"\n\t\t\t\t\t\t\t\t\t\t: \"Ctrl+Shift+D\"}\n\t\t\t\t\t\t\t\t</span>\n\n\t\t\t\t\t\t\t\t{/* Close button */}\n\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\tonClick={closePanel}\n\t\t\t\t\t\t\t\t\tclassName=\"p-1 rounded-md text-gray-500 hover:text-gray-300 hover:bg-white/5 transition-colors\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<CloseIcon className=\"w-4 h-4\" />\n\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t{/* Content */}\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tclassName=\"p-4 space-y-5 overflow-y-auto\"\n\t\t\t\t\t\t\tstyle={{ maxHeight: \"calc(100vh - 200px)\" }}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{/* Display Mode */}\n\t\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t\t<label\n\t\t\t\t\t\t\t\t\thtmlFor=\"display-mode\"\n\t\t\t\t\t\t\t\t\tclassName=\"text-[11px] font-medium uppercase tracking-wider text-gray-500 block mb-2\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\tDisplay Mode\n\t\t\t\t\t\t\t\t</label>\n\t\t\t\t\t\t\t\t<SegmentedControl\n\t\t\t\t\t\t\t\t\toptions={displayModeOptions}\n\t\t\t\t\t\t\t\t\tvalue={displayMode}\n\t\t\t\t\t\t\t\t\tonChange={handleDisplayModeChange}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t\t{/* Theme */}\n\t\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t\t<label\n\t\t\t\t\t\t\t\t\thtmlFor=\"theme\"\n\t\t\t\t\t\t\t\t\tclassName=\"text-[11px] font-medium uppercase tracking-wider text-gray-500 block mb-2\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\tTheme\n\t\t\t\t\t\t\t\t</label>\n\t\t\t\t\t\t\t\t<SegmentedControl\n\t\t\t\t\t\t\t\t\toptions={themeOptions}\n\t\t\t\t\t\t\t\t\tvalue={theme}\n\t\t\t\t\t\t\t\t\tonChange={handleThemeChange}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t\t{/* Safe Area Mock */}\n\t\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t\t<label\n\t\t\t\t\t\t\t\t\thtmlFor=\"safe-area\"\n\t\t\t\t\t\t\t\t\tclassName=\"text-[11px] font-medium uppercase tracking-wider text-gray-500 block mb-2\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\tSafe Area (Chat Input)\n\t\t\t\t\t\t\t\t</label>\n\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\tonClick={() => setShowSafeArea(!showSafeArea)}\n\t\t\t\t\t\t\t\t\tclassName={`w-full flex items-center justify-between px-3 py-2.5 rounded-lg text-xs font-medium transition-all duration-150 ${\n\t\t\t\t\t\t\t\t\t\tshowSafeArea ? \"text-emerald-400\" : \"text-gray-400\"\n\t\t\t\t\t\t\t\t\t}`}\n\t\t\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\t\t\tbackground: showSafeArea\n\t\t\t\t\t\t\t\t\t\t\t? \"rgba(34, 197, 94, 0.1)\"\n\t\t\t\t\t\t\t\t\t\t\t: \"rgba(255, 255, 255, 0.04)\",\n\t\t\t\t\t\t\t\t\t\tborder: showSafeArea\n\t\t\t\t\t\t\t\t\t\t\t? \"1px solid rgba(34, 197, 94, 0.3)\"\n\t\t\t\t\t\t\t\t\t\t\t: \"1px solid rgba(255, 255, 255, 0.06)\",\n\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<span>Mock ChatGPT Input Bar</span>\n\t\t\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\t\t\tclassName={`px-2 py-0.5 rounded text-[10px] font-semibold ${\n\t\t\t\t\t\t\t\t\t\t\tshowSafeArea\n\t\t\t\t\t\t\t\t\t\t\t\t? \"bg-emerald-500/20 text-emerald-400\"\n\t\t\t\t\t\t\t\t\t\t\t\t: \"bg-gray-500/20 text-gray-500\"\n\t\t\t\t\t\t\t\t\t\t}`}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t{showSafeArea ? \"ON\" : \"OFF\"}\n\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t{showSafeArea && (\n\t\t\t\t\t\t\t\t\t<p className=\"text-[10px] text-gray-500 mt-1.5\">\n\t\t\t\t\t\t\t\t\t\tbottom: {MOCK_SAFE_AREA_HEIGHT}px\n\t\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t\t{/* Widget Props */}\n\t\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t\t<label\n\t\t\t\t\t\t\t\t\thtmlFor=\"widget-props\"\n\t\t\t\t\t\t\t\t\tclassName=\"text-[11px] font-medium uppercase tracking-wider text-gray-500 block mb-2\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\tWidget Props\n\t\t\t\t\t\t\t\t</label>\n\t\t\t\t\t\t\t\t<textarea\n\t\t\t\t\t\t\t\t\tvalue={propsJson}\n\t\t\t\t\t\t\t\t\tonChange={(e) => handlePropsChange(e.target.value)}\n\t\t\t\t\t\t\t\t\tonBlur={handlePropsBlur}\n\t\t\t\t\t\t\t\t\tclassName=\"dev-json-editor w-full min-h-[160px] text-xs text-gray-200 p-3 rounded-lg resize-none focus:outline-none transition-colors\"\n\t\t\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\t\t\tbackground: \"rgba(0, 0, 0, 0.3)\",\n\t\t\t\t\t\t\t\t\t\tborder: jsonError\n\t\t\t\t\t\t\t\t\t\t\t? \"1px solid rgba(239, 68, 68, 0.5)\"\n\t\t\t\t\t\t\t\t\t\t\t: \"1px solid rgba(255, 255, 255, 0.06)\",\n\t\t\t\t\t\t\t\t\t\tfontFamily:\n\t\t\t\t\t\t\t\t\t\t\t\"'JetBrains Mono', 'SF Mono', 'Fira Code', monospace\",\n\t\t\t\t\t\t\t\t\t\tlineHeight: 1.6,\n\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\tonFocus={(e) => {\n\t\t\t\t\t\t\t\t\t\tif (!jsonError) {\n\t\t\t\t\t\t\t\t\t\t\te.target.style.borderColor = \"rgba(99, 102, 241, 0.5)\";\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\tonBlurCapture={(e) => {\n\t\t\t\t\t\t\t\t\t\tif (!jsonError) {\n\t\t\t\t\t\t\t\t\t\t\te.target.style.borderColor = \"rgba(255, 255, 255, 0.06)\";\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\tspellCheck={false}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t{jsonError && (\n\t\t\t\t\t\t\t\t\t<p className=\"text-red-400 text-[11px] mt-1.5 flex items-center gap-1\">\n\t\t\t\t\t\t\t\t\t\t<svg\n\t\t\t\t\t\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t\t\t\t\t\t\taria-label=\"Error\"\n\t\t\t\t\t\t\t\t\t\t\tclassName=\"w-3 h-3\"\n\t\t\t\t\t\t\t\t\t\t\tviewBox=\"0 0 16 16\"\n\t\t\t\t\t\t\t\t\t\t\tfill=\"currentColor\"\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t<path d=\"M8 1.5a6.5 6.5 0 100 13 6.5 6.5 0 000-13zM7 4.5h2v4H7v-4zm0 5h2v2H7v-2z\" />\n\t\t\t\t\t\t\t\t\t\t</svg>\n\t\t\t\t\t\t\t\t\t\t{jsonError}\n\t\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t\t{/* Reset Button */}\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\tonClick={handleReset}\n\t\t\t\t\t\t\t\tclassName=\"w-full flex items-center justify-center gap-2 px-3 py-2 rounded-lg text-xs font-medium text-gray-400 transition-all duration-150 hover:text-gray-200\"\n\t\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\t\tbackground: \"rgba(255, 255, 255, 0.04)\",\n\t\t\t\t\t\t\t\t\tborder: \"1px solid rgba(255, 255, 255, 0.06)\",\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\tonMouseEnter={(e) => {\n\t\t\t\t\t\t\t\t\te.currentTarget.style.background =\n\t\t\t\t\t\t\t\t\t\t\"rgba(255, 255, 255, 0.08)\";\n\t\t\t\t\t\t\t\t\te.currentTarget.style.borderColor =\n\t\t\t\t\t\t\t\t\t\t\"rgba(255, 255, 255, 0.1)\";\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\tonMouseLeave={(e) => {\n\t\t\t\t\t\t\t\t\te.currentTarget.style.background =\n\t\t\t\t\t\t\t\t\t\t\"rgba(255, 255, 255, 0.04)\";\n\t\t\t\t\t\t\t\t\te.currentTarget.style.borderColor =\n\t\t\t\t\t\t\t\t\t\t\"rgba(255, 255, 255, 0.06)\";\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<ResetIcon className=\"w-3.5 h-3.5\" />\n\t\t\t\t\t\t\t\tReset to Defaults\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\t\t\t</div>\n\n\t\t\t{/* Mock ChatGPT Input Bar */}\n\t\t\t{showSafeArea && (\n\t\t\t\t<div\n\t\t\t\t\tclassName=\"fixed bottom-0 left-0 right-0 z-[9998] flex items-center justify-center pointer-events-none\"\n\t\t\t\t\tstyle={{\n\t\t\t\t\t\theight: `${MOCK_SAFE_AREA_HEIGHT}px`,\n\t\t\t\t\t\tbackground:\n\t\t\t\t\t\t\t\"linear-gradient(to top, #1a1a1a 0%, #1a1a1a 80%, transparent 100%)\",\n\t\t\t\t\t}}\n\t\t\t\t>\n\t\t\t\t\t<div className=\"w-full max-w-2xl mx-4 px-4 py-3 rounded-2xl bg-[#2f2f2f] border border-[#424242] flex items-center gap-3\">\n\t\t\t\t\t\t<div className=\"w-8 h-8 rounded-full bg-[#424242] flex items-center justify-center\">\n\t\t\t\t\t\t\t<svg\n\t\t\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t\t\t\tclassName=\"w-4 h-4 text-gray-400\"\n\t\t\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\t\t\tviewBox=\"0 0 24 24\"\n\t\t\t\t\t\t\t\tstroke=\"currentColor\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<path\n\t\t\t\t\t\t\t\t\tstrokeLinecap=\"round\"\n\t\t\t\t\t\t\t\t\tstrokeLinejoin=\"round\"\n\t\t\t\t\t\t\t\t\tstrokeWidth={2}\n\t\t\t\t\t\t\t\t\td=\"M12 4v16m8-8H4\"\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t</svg>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div className=\"flex-1 text-gray-400 text-sm\">\n\t\t\t\t\t\t\tAsk me anything...\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div className=\"w-8 h-8 rounded-full bg-[#424242] flex items-center justify-center\">\n\t\t\t\t\t\t\t<svg\n\t\t\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t\t\t\tclassName=\"w-4 h-4 text-gray-400\"\n\t\t\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\t\t\tviewBox=\"0 0 24 24\"\n\t\t\t\t\t\t\t\tstroke=\"currentColor\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<path\n\t\t\t\t\t\t\t\t\tstrokeLinecap=\"round\"\n\t\t\t\t\t\t\t\t\tstrokeLinejoin=\"round\"\n\t\t\t\t\t\t\t\t\tstrokeWidth={2}\n\t\t\t\t\t\t\t\t\td=\"M19 11a7 7 0 01-7 7m0 0a7 7 0 01-7-7m7 7v4m0 0H8m4 0h4m-4-8a3 3 0 01-3-3V5a3 3 0 116 0v6a3 3 0 01-3 3z\"\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t</svg>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div className=\"absolute bottom-1 text-[10px] text-gray-600 font-mono\">\n\t\t\t\t\t\tMock SafeArea: bottom={MOCK_SAFE_AREA_HEIGHT}px\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</>\n\t);\n}\n","import {\n\ttype DisplayMode,\n\ttype OpenAIGlobals,\n\tSetGlobalsEvent,\n\ttype Theme,\n} from \"../hooks/@types\";\n\nconst DEFAULT_MOCK_CONFIG: Omit<OpenAIGlobals, \"setWidgetState\"> = {\n\ttheme: \"dark\",\n\tuserAgent: {\n\t\tdevice: { type: \"desktop\" },\n\t\tcapabilities: { hover: true, touch: false },\n\t},\n\tlocale: \"en\",\n\tmaxHeight: 800,\n\tdisplayMode: \"inline\",\n\tsafeArea: { insets: { top: 0, bottom: 0, left: 0, right: 0 } },\n\ttoolInput: {},\n\ttoolOutput: null,\n\ttoolResponseMetadata: null,\n\twidgetState: null,\n};\n\nlet mockState: Omit<OpenAIGlobals, \"setWidgetState\"> = {\n\t...DEFAULT_MOCK_CONFIG,\n};\n\nexport function initializeMockOpenAI(\n\tinitialToolOutput?: Record<string, unknown>,\n): void {\n\tif (typeof window === \"undefined\") {\n\t\treturn;\n\t}\n\tif (window.openai) {\n\t\treturn; // Already initialized (real ChatGPT or previous mock)\n\t}\n\n\tmockState = {\n\t\t...DEFAULT_MOCK_CONFIG,\n\t\ttoolOutput: initialToolOutput ?? null,\n\t};\n\n\twindow.openai = {\n\t\t...mockState,\n\t\t// Mock API functions\n\t\trequestDisplayMode: async ({ mode }) => {\n\t\t\tupdateMockGlobal(\"displayMode\", mode);\n\t\t\treturn { mode };\n\t\t},\n\t\tcallTool: async (name, args) => {\n\t\t\tconsole.log(`[DevMode] callTool: ${name}`, args);\n\t\t\treturn { result: JSON.stringify({ mock: true, tool: name, args }) };\n\t\t},\n\t\tsendFollowUpMessage: async ({ prompt }) => {\n\t\t\tconsole.log(`[DevMode] sendFollowUpMessage: ${prompt}`);\n\t\t},\n\t\topenExternal: ({ href }) => {\n\t\t\tconsole.log(`[DevMode] openExternal: ${href}`);\n\t\t\twindow.open(href, \"_blank\");\n\t\t},\n\t\tsetWidgetState: async (state) => {\n\t\t\tupdateMockGlobal(\"widgetState\", state);\n\t\t},\n\t};\n\n\t// Dispatch initial event so hooks pick up the values\n\twindow.dispatchEvent(new SetGlobalsEvent({ globals: mockState }));\n}\n\nexport function updateMockGlobal<K extends keyof OpenAIGlobals>(\n\tkey: K,\n\tvalue: OpenAIGlobals[K],\n): void {\n\tif (typeof window === \"undefined\" || !window.openai) {\n\t\treturn;\n\t}\n\n\t(mockState as Record<string, unknown>)[key] = value;\n\t(window.openai as Record<string, unknown>)[key] = value;\n\n\twindow.dispatchEvent(new SetGlobalsEvent({ globals: { [key]: value } }));\n}\n\nexport function getMockState(): typeof mockState {\n\treturn { ...mockState };\n}\n\nexport function updateMockToolOutput(props: Record<string, unknown>): void {\n\tupdateMockGlobal(\"toolOutput\", props);\n}\n\nexport function updateMockDisplayMode(mode: DisplayMode): void {\n\tupdateMockGlobal(\"displayMode\", mode);\n}\n\nexport function updateMockTheme(theme: Theme): void {\n\tupdateMockGlobal(\"theme\", theme);\n}\n","// Legacy MCP-widget-in-host React hooks. Re-exported from\n// `@waniwani/sdk/mcp/react` for back-compat. New code should not use these.\n\nexport type {\n\tModelContextContentBlock,\n\tModelContextUpdate,\n} from \"../../../../shared/model-context\";\n// Types\nexport type * from \"./@types\";\nexport type { UnstableSendFollowUpWithGhostGuardResult } from \"./unstable-use-send-follow-up\";\nexport { unstable_useSendFollowUpWithGhostGuard } from \"./unstable-use-send-follow-up\";\nexport { useCallTool } from \"./use-call-tool\";\nexport { useDisplayMode } from \"./use-display-mode\";\nexport type { FlowActionResult } from \"./use-flow-action\";\nexport { useFlowAction } from \"./use-flow-action\";\nexport { useIsChatGptApp } from \"./use-is-chatgpt-app\";\nexport { useLocale } from \"./use-locale\";\nexport { useMaxHeight } from \"./use-max-height\";\n// Action hooks\nexport { useOpenExternal } from \"./use-open-external\";\nexport { useRequestDisplayMode } from \"./use-request-display-mode\";\nexport { useSafeArea } from \"./use-safe-area\";\nexport type { SendFollowUpOptions } from \"./use-send-follow-up\";\nexport { useSendFollowUp } from \"./use-send-follow-up\";\nexport { useTheme } from \"./use-theme\";\n// Data hooks\nexport { useToolOutput } from \"./use-tool-output\";\nexport { useToolResponseMetadata } from \"./use-tool-response-metadata\";\nexport { useUpdateModelContext } from \"./use-update-model-context\";\nexport { useWidgetClient, WidgetProvider } from \"./use-widget\";\n// State hooks\nexport { useWidgetState } from \"./use-widget-state\";\n","\"use client\";\n\nimport {\n\ttype JSX,\n\ttype ReactNode,\n\tuseCallback,\n\tuseContext,\n\tuseLayoutEffect,\n\tuseMemo,\n\tuseRef,\n} from \"react\";\nimport { WidgetClientContext } from \"../../../../mcp/react/context\";\nimport type { SendFollowUpOptions } from \"./use-send-follow-up\";\n\nconst ADVANCED_KEY_PREFIX = \"waniwani:send-follow-up:advanced:\";\nconst ADVANCED_WINDOW_MS = 10_000;\n\ntype AdvancedRecord = { at: number; byMountId: string };\n\nfunction advancedKeyFor(viewUUID: string | undefined): string {\n\treturn `${ADVANCED_KEY_PREFIX}${viewUUID ?? \"default\"}`;\n}\n\nfunction readAdvanced(viewUUID: string | undefined): AdvancedRecord | null {\n\ttry {\n\t\tconst raw = globalThis.localStorage?.getItem(advancedKeyFor(viewUUID));\n\t\tif (!raw) {\n\t\t\treturn null;\n\t\t}\n\t\tconst parsed = JSON.parse(raw) as AdvancedRecord;\n\t\tif (\n\t\t\ttypeof parsed?.at !== \"number\" ||\n\t\t\ttypeof parsed?.byMountId !== \"string\"\n\t\t) {\n\t\t\treturn null;\n\t\t}\n\t\treturn parsed;\n\t} catch {\n\t\treturn null;\n\t}\n}\n\nfunction markAdvanced(viewUUID: string | undefined, byMountId: string): void {\n\ttry {\n\t\tglobalThis.localStorage?.setItem(\n\t\t\tadvancedKeyFor(viewUUID),\n\t\t\tJSON.stringify({ at: Date.now(), byMountId } satisfies AdvancedRecord),\n\t\t);\n\t} catch {\n\t\t// quota / security errors — best effort\n\t}\n}\n\n/**\n * Same heuristic the legacy `InitializeNextJsInIframe` helper uses\n * (`typeof window.openai !== \"undefined\"`), but evaluated at call time so\n * it works in any iframe ChatGPT loads — we can't depend on\n * `useIsChatGptApp` because that reads `window.__isChatGptApp`, which is\n * only set by the Next.js helper. Widgets built directly on skybridge\n * never get that flag.\n */\nfunction isChatGptHost(): boolean {\n\tif (typeof window === \"undefined\") {\n\t\treturn false;\n\t}\n\t// biome-ignore lint/suspicious/noExplicitAny: ChatGPT injects `window.openai`\n\treturn typeof (window as any).openai === \"object\";\n}\n\ninterface ChatGPTHostBridge {\n\ttoolResponseMetadata?: { viewUUID?: unknown } | null;\n}\n\nfunction getChatGptHostBridge(): ChatGPTHostBridge | null {\n\tif (!isChatGptHost()) {\n\t\treturn null;\n\t}\n\t// biome-ignore lint/suspicious/noExplicitAny: ChatGPT injects `window.openai`\n\treturn (window as any).openai as ChatGPTHostBridge;\n}\n\n/**\n * Collapses the iframe document to 0×0 with a transparent background by\n * overriding `<html>` and `<body>` inline styles. The host's auto-resize\n * (ResizeObserver on documentElement/body) then notifies ChatGPT that the\n * iframe should shrink — without this, ChatGPT keeps the iframe at its\n * default size with whatever background the widget's CSS paints.\n */\nfunction GhostSuppressor(): null {\n\tuseLayoutEffect(() => {\n\t\tconst html = document.documentElement;\n\t\tconst body = document.body;\n\t\tconst prevHtmlStyle = html.getAttribute(\"style\");\n\t\tconst prevBodyStyle = body.getAttribute(\"style\");\n\t\tconst zero =\n\t\t\t\"margin:0!important;padding:0!important;border:0!important;background:transparent!important;background-color:transparent!important;height:0!important;min-height:0!important;max-height:0!important;overflow:hidden!important;\";\n\t\thtml.setAttribute(\"style\", zero);\n\t\tbody.setAttribute(\"style\", zero);\n\t\treturn () => {\n\t\t\tif (prevHtmlStyle === null) {\n\t\t\t\thtml.removeAttribute(\"style\");\n\t\t\t} else {\n\t\t\t\thtml.setAttribute(\"style\", prevHtmlStyle);\n\t\t\t}\n\t\t\tif (prevBodyStyle === null) {\n\t\t\t\tbody.removeAttribute(\"style\");\n\t\t\t} else {\n\t\t\t\tbody.setAttribute(\"style\", prevBodyStyle);\n\t\t\t}\n\t\t};\n\t}, []);\n\treturn null;\n}\n\nexport interface UnstableSendFollowUpWithGhostGuardResult {\n\t/** Wrapped `sendFollowUp`. Same signature as the one you passed in. */\n\tsendFollowUp: (prompt: string, options?: SendFollowUpOptions) => void;\n\t/**\n\t * Wrap your widget's root render with this so the suppression can take\n\t * effect. On non-ChatGPT hosts it is a transparent pass-through.\n\t */\n\tGuard: (props: { children: ReactNode }) => JSX.Element | null;\n}\n\n/**\n * ⚠️ EXPERIMENTAL — DO NOT USE UNLESS YOU UNDERSTAND THE TRADE-OFFS ⚠️\n *\n * Wraps an existing `sendFollowUp` with ghost-guard suppression specific\n * to ChatGPT. ChatGPT renders the source widget a SECOND time alongside\n * the new user message a widget emits via `sendFollowUpMessage`. The\n * second iframe is a brand-new React tree with no link to the original;\n * skybridge's `useViewState` persistence does not survive across them.\n * The result is a visible duplicate widget for ~1s before ChatGPT\n * collapses one of them.\n *\n * On ChatGPT the hook adds a per-`viewUUID` `localStorage` write before\n * each `sendFollowUp` call, and the returned `Guard` checks that record\n * on mount — if it sees a record set by a different `mountId` within\n * `ADVANCED_WINDOW_MS`, it collapses the iframe to 0×0.\n *\n * On every other host (Waniwani embed, MCP Apps, etc.) the hook is a\n * pure pass-through: `sendFollowUp` is your function unchanged and\n * `Guard` is a transparent fragment.\n *\n * The hook does NOT require `WidgetProvider`. It reads the widget's\n * `viewUUID` from `WidgetClientContext` when one is available and falls\n * back to `window.openai.toolResponseMetadata.viewUUID` otherwise.\n *\n * Caveats:\n * - Relies on ChatGPT's widget iframes sharing a single `localStorage`\n * scope — verified at the time of writing but not guaranteed.\n * - 10s suppression window per `viewUUID`. Two unrelated `sendFollowUp`\n * calls inside 10s with the same viewUUID could mistakenly suppress one.\n * - The `Guard` MUST wrap the widget's root render. If you forget it,\n * the localStorage write happens but nothing is suppressed.\n *\n * @param sendFollowUp - The underlying `sendFollowUp` to wrap. On ChatGPT the\n * hook adds the per-`viewUUID` localStorage write before delegating; on any\n * other host the hook is a pure pass-through. Typically the value of\n * `useSendFollowUpMessage()` from `skybridge/web` or `useSendFollowUp()`\n * from this module.\n *\n * @example\n * function MyWidget() {\n * const sendFollowUpMessage = useSendFollowUpMessage(); // skybridge/web\n * const { sendFollowUp, Guard } =\n * unstable_useSendFollowUpWithGhostGuard(sendFollowUpMessage);\n *\n * // The Guard MUST wrap the widget's root render, otherwise the ghost\n * // iframe will not be suppressed.\n * return (\n * <Guard>\n * <div className=\"my-widget\">\n * <button onClick={() => sendFollowUp(\"I uploaded my bill\")}>\n * Continue\n * </button>\n * </div>\n * </Guard>\n * );\n * }\n *\n * @experimental Subject to change or removal without notice.\n */\nexport function unstable_useSendFollowUpWithGhostGuard(\n\tsendFollowUp: (prompt: string) => void | Promise<void>,\n): UnstableSendFollowUpWithGhostGuardResult {\n\tconst client = useContext(WidgetClientContext);\n\tconst innerRef = useRef(sendFollowUp);\n\tinnerRef.current = sendFollowUp;\n\n\t// Read viewUUID from whichever source is available: the widget client\n\t// (when wrapped in WidgetProvider) or the raw ChatGPT host global.\n\tconst clientMetadata = client?.getToolResponseMetadata?.() ?? null;\n\tconst hostMetadata = getChatGptHostBridge()?.toolResponseMetadata ?? null;\n\tconst metadata = clientMetadata ?? hostMetadata;\n\tconst viewUUID =\n\t\tmetadata &&\n\t\ttypeof (metadata as { viewUUID?: unknown }).viewUUID === \"string\"\n\t\t\t? (metadata as { viewUUID: string }).viewUUID\n\t\t\t: undefined;\n\n\tconst mountIdRef = useRef<string>(\"\");\n\tif (mountIdRef.current === \"\") {\n\t\tmountIdRef.current = crypto.randomUUID();\n\t}\n\n\tconst wrappedSendFollowUp = useCallback(\n\t\t(prompt: string, _options?: SendFollowUpOptions) => {\n\t\t\tif (isChatGptHost()) {\n\t\t\t\tmarkAdvanced(viewUUID, mountIdRef.current);\n\t\t\t}\n\t\t\ttry {\n\t\t\t\tvoid Promise.resolve(innerRef.current(prompt)).catch((err) => {\n\t\t\t\t\tconsole.error(\"[unstable_useSendFollowUpWithGhostGuard]\", err);\n\t\t\t\t});\n\t\t\t} catch (err) {\n\t\t\t\tconsole.error(\"[unstable_useSendFollowUpWithGhostGuard]\", err);\n\t\t\t}\n\t\t},\n\t\t[viewUUID],\n\t);\n\n\tconst Guard = useMemo(() => {\n\t\tconst mountId = mountIdRef.current;\n\t\treturn function Guard({\n\t\t\tchildren,\n\t\t}: {\n\t\t\tchildren: ReactNode;\n\t\t}): JSX.Element | null {\n\t\t\tif (!isChatGptHost()) {\n\t\t\t\treturn <>{children}</>;\n\t\t\t}\n\t\t\tconst advanced = readAdvanced(viewUUID);\n\t\t\tif (\n\t\t\t\tadvanced &&\n\t\t\t\tadvanced.byMountId !== mountId &&\n\t\t\t\tDate.now() - advanced.at < ADVANCED_WINDOW_MS\n\t\t\t) {\n\t\t\t\treturn <GhostSuppressor />;\n\t\t\t}\n\t\t\treturn <>{children}</>;\n\t\t};\n\t}, [viewUUID]);\n\n\treturn { sendFollowUp: wrappedSendFollowUp, Guard };\n}\n","\"use client\";\n\n/**\n * Shared widget-client context, owned and consumed exclusively by the legacy\n * `WidgetProvider` (`src/legacy/mcp/react/hooks/use-widget.ts`) and\n * `unstable-use-send-follow-up`. `useWaniwani` resolves config from explicit\n * options or the `toolResponseMetadata` passed to it and does not read this\n * context.\n *\n * Kept at this path for back-compat with legacy imports; it belongs in\n * `src/legacy/` and may move there in a future cleanup.\n */\n\nimport { createContext } from \"react\";\nimport type { UnifiedWidgetClient } from \"../../legacy/mcp/react/widgets/widget-client\";\n\nexport const WidgetClientContext = createContext<UnifiedWidgetClient | null>(\n\tnull,\n);\n","\"use client\";\n\nimport { useCallback } from \"react\";\nimport type { ToolCallResult } from \"../widgets/widget-client\";\nimport { useWidgetClient } from \"./use-widget\";\n\n/**\n * Get a function to call other tools.\n * Works on both OpenAI widgets and MCP Apps.\n *\n * @deprecated Legacy MCP-widget-in-host stack. Preserved for back-compat; will move to\n * `@waniwani/sdk/legacy/react` in a future minor release.\n * @returns A function to call tools with their name and arguments\n */\nexport function useCallTool(): (\n\tname: string,\n\targs: Record<string, unknown>,\n) => Promise<ToolCallResult> {\n\tconst client = useWidgetClient();\n\treturn useCallback(\n\t\t(name: string, args: Record<string, unknown>) =>\n\t\t\tclient.callTool(name, args),\n\t\t[client],\n\t);\n}\n","\"use client\";\n\nimport React, {\n\ttype ReactNode,\n\tuseCallback,\n\tuseContext,\n\tuseEffect,\n\tuseState,\n\tuseSyncExternalStore,\n} from \"react\";\nimport { WidgetClientContext } from \"../../../../mcp/react/context\";\nimport {\n\tcreateWidgetClient,\n\ttype UnifiedWidgetClient,\n} from \"../widgets/widget-client\";\nimport type { DisplayMode, SafeArea, Theme, UnknownObject } from \"./@types\";\n\n// `WidgetClientContext` lives in non-legacy at `src/mcp/react/context.ts` so\n// the non-legacy `useWaniwani` hook can read it without depending on legacy\n// runtime. Re-exported here for back-compat with any code that imported it\n// from this path.\nexport { WidgetClientContext };\n\n/**\n * Provider props\n */\ninterface WidgetProviderProps {\n\tchildren: ReactNode;\n\t/** Optional loading component while connecting */\n\tloading?: ReactNode;\n\t/** Optional error component */\n\tonError?: (error: Error) => ReactNode;\n}\n\n/**\n * Provider component that initializes the correct widget client based on platform.\n * Wrap your widget component with this provider.\n *\n * @deprecated Part of the legacy MCP-widget-in-host stack (used with `createResource` /\n * `createTool`). Preserved for back-compat; will move to `@waniwani/sdk/legacy/react` in\n * a future minor release. For new code, use `createFlow` from `@waniwani/sdk/mcp` and\n * `useWaniwani` from `@waniwani/sdk/mcp/react`.\n *\n * @example\n * ```tsx\n * function App() {\n * return (\n * <WidgetProvider loading={<Spinner />}>\n * <MyWidget />\n * </WidgetProvider>\n * );\n * }\n * ```\n */\nexport function WidgetProvider({\n\tchildren,\n\tloading = null,\n\tonError,\n}: WidgetProviderProps) {\n\tconst [client, setClient] = useState<UnifiedWidgetClient | null>(null);\n\tconst [error, setError] = useState<Error | null>(null);\n\tconst [isConnecting, setIsConnecting] = useState(true);\n\n\tuseEffect(() => {\n\t\tlet mounted = true;\n\t\tlet activeClient: UnifiedWidgetClient | null = null;\n\n\t\tasync function initClient() {\n\t\t\ttry {\n\t\t\t\tconst widgetClient = await createWidgetClient();\n\n\t\t\t\tawait widgetClient.connect();\n\n\t\t\t\tif (mounted) {\n\t\t\t\t\tactiveClient = widgetClient;\n\t\t\t\t\tsetClient(widgetClient);\n\t\t\t\t\tsetIsConnecting(false);\n\t\t\t\t} else {\n\t\t\t\t\t// Component unmounted during connect — clean up\n\t\t\t\t\twidgetClient.close();\n\t\t\t\t}\n\t\t\t} catch (err) {\n\t\t\t\tif (mounted) {\n\t\t\t\t\tconsole.error(\"error\", err);\n\t\t\t\t\tsetError(err instanceof Error ? err : new Error(String(err)));\n\t\t\t\t\tsetIsConnecting(false);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tinitClient();\n\n\t\treturn () => {\n\t\t\tmounted = false;\n\t\t\tactiveClient?.close();\n\t\t};\n\t}, []);\n\n\t// Sync theme to <html> class so consumers can use html.dark { ... } or dark: variants\n\tuseEffect(() => {\n\t\tif (!client) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst syncTheme = (theme: Theme) => {\n\t\t\tdocument.documentElement.classList.toggle(\"dark\", theme === \"dark\");\n\t\t\tdocument.documentElement.style.colorScheme =\n\t\t\t\ttheme === \"dark\" ? \"dark\" : \"auto\";\n\t\t};\n\n\t\tsyncTheme(client.getTheme());\n\t\treturn client.onThemeChange(syncTheme);\n\t}, [client]);\n\n\tif (error && onError) {\n\t\treturn React.createElement(React.Fragment, null, onError(error));\n\t}\n\n\tif (isConnecting || !client) {\n\t\treturn React.createElement(React.Fragment, null, loading);\n\t}\n\n\treturn React.createElement(\n\t\tWidgetClientContext.Provider,\n\t\t{ value: client },\n\t\tchildren,\n\t);\n}\n\n/**\n * Keys that can be selected from the widget client.\n */\ntype WidgetKey =\n\t| \"toolOutput\"\n\t| \"theme\"\n\t| \"displayMode\"\n\t| \"locale\"\n\t| \"safeArea\"\n\t| \"maxHeight\"\n\t| \"toolResponseMetadata\"\n\t| \"widgetState\";\n\n/**\n * Value types for each widget key.\n */\ntype WidgetKeyValues = {\n\ttoolOutput: Record<string, unknown> | null;\n\ttheme: Theme;\n\tdisplayMode: DisplayMode;\n\tlocale: string;\n\tsafeArea: SafeArea | null;\n\tmaxHeight: number | null;\n\ttoolResponseMetadata: UnknownObject | null;\n\twidgetState: UnknownObject | null;\n};\n\n/**\n * Get the unified widget client instance.\n * Must be used within a WidgetProvider.\n *\n * @deprecated Legacy MCP-widget-in-host stack. Preserved for back-compat; will move to\n * `@waniwani/sdk/legacy/react` in a future minor release.\n *\n * @example\n * ```tsx\n * // Full client for actions\n * const client = useWidgetClient();\n * client.callTool(\"foo\", {});\n *\n * // Key selector for reactive values\n * const toolOutput = useWidgetClient(\"toolOutput\");\n * const theme = useWidgetClient(\"theme\");\n * ```\n */\nexport function useWidgetClient(): UnifiedWidgetClient;\nexport function useWidgetClient<K extends WidgetKey>(\n\tkey: K,\n): WidgetKeyValues[K];\nexport function useWidgetClient<K extends WidgetKey>(key?: K) {\n\tconst client = useContext(WidgetClientContext);\n\n\tif (!client) {\n\t\tthrow new Error(\"useWidgetClient must be used within a WidgetProvider\");\n\t}\n\n\t// Key selector - use useSyncExternalStore\n\tconst subscribe = useCallback(\n\t\t(onChange: () => void) => {\n\t\t\tif (key === \"toolOutput\") {\n\t\t\t\treturn client.onToolResult(() => onChange());\n\t\t\t}\n\t\t\tif (key === \"theme\") {\n\t\t\t\treturn client.onThemeChange(() => onChange());\n\t\t\t}\n\t\t\tif (key === \"displayMode\") {\n\t\t\t\treturn client.onDisplayModeChange(() => onChange());\n\t\t\t}\n\t\t\tif (key === \"safeArea\") {\n\t\t\t\treturn client.onSafeAreaChange(() => onChange());\n\t\t\t}\n\t\t\tif (key === \"maxHeight\") {\n\t\t\t\treturn client.onMaxHeightChange(() => onChange());\n\t\t\t}\n\t\t\tif (key === \"toolResponseMetadata\") {\n\t\t\t\treturn client.onToolResponseMetadataChange(() => onChange());\n\t\t\t}\n\t\t\tif (key === \"widgetState\") {\n\t\t\t\treturn client.onWidgetStateChange(() => onChange());\n\t\t\t}\n\t\t\treturn () => {};\n\t\t},\n\t\t[client, key],\n\t);\n\n\tconst getSnapshot = useCallback(() => {\n\t\tif (key === \"toolOutput\") {\n\t\t\treturn client.getToolOutput();\n\t\t}\n\t\tif (key === \"theme\") {\n\t\t\treturn client.getTheme();\n\t\t}\n\t\tif (key === \"displayMode\") {\n\t\t\treturn client.getDisplayMode();\n\t\t}\n\t\tif (key === \"locale\") {\n\t\t\treturn client.getLocale();\n\t\t}\n\t\tif (key === \"safeArea\") {\n\t\t\treturn client.getSafeArea();\n\t\t}\n\t\tif (key === \"maxHeight\") {\n\t\t\treturn client.getMaxHeight();\n\t\t}\n\t\tif (key === \"toolResponseMetadata\") {\n\t\t\treturn client.getToolResponseMetadata();\n\t\t}\n\t\tif (key === \"widgetState\") {\n\t\t\treturn client.getWidgetState();\n\t\t}\n\t\treturn null;\n\t}, [client, key]);\n\n\tconst store = useSyncExternalStore(subscribe, getSnapshot, getSnapshot);\n\n\t// No key - return full client\n\tif (!key) {\n\t\treturn client;\n\t}\n\n\treturn store;\n}\n","import type { CallToolResult as McpCallToolResult } from \"@modelcontextprotocol/sdk/types.js\";\nimport type { ModelContextUpdate } from \"../../../../shared/model-context\";\nimport type {\n\tDisplayMode,\n\tSafeArea,\n\tTheme,\n\tUnknownObject,\n} from \"../hooks/@types\";\n\n/**\n * Result from calling a tool\n */\nexport type ToolCallResult = McpCallToolResult;\n\n/**\n * Tool result notification (what the host pushes to the widget)\n */\nexport type ToolResult = McpCallToolResult;\n\n/**\n * Host context - all values available from the host.\n */\nexport type HostContext = {\n\ttheme: Theme;\n\tlocale: string;\n\tdisplayMode: DisplayMode;\n\tmaxHeight: number | null;\n\tsafeArea: SafeArea | null;\n\ttoolOutput: UnknownObject | null;\n\ttoolResponseMetadata: UnknownObject | null;\n\twidgetState: UnknownObject | null;\n};\n\n/**\n * Store interface for useSyncExternalStore compatibility.\n */\nexport type HostContextStore<K extends keyof HostContext> = {\n\tsubscribe: (onStoreChange: () => void) => () => void;\n\tgetSnapshot: () => HostContext[K];\n};\n\n/**\n * Unified widget client interface that works on both OpenAI and MCP Apps.\n *\n * Platform-specific behavior:\n * - Display mode: OpenAI-only. MCP Apps returns \"inline\" and requestDisplayMode is a no-op.\n * - Follow-up messages: Unified API, different underlying implementations.\n */\nexport interface UnifiedWidgetClient {\n\t/**\n\t * Connect to the host. Must be called before using other methods.\n\t * On OpenAI, this is a no-op (already connected via window.openai).\n\t * On MCP Apps, this establishes the postMessage connection.\n\t */\n\tconnect(): Promise<void>;\n\n\t/**\n\t * Close the connection to the host and clean up resources.\n\t * On OpenAI, this is a no-op.\n\t * On MCP Apps, this closes the transport and removes event listeners.\n\t */\n\tclose(): Promise<void>;\n\n\t/**\n\t * Get the tool output (structured content returned by the tool handler).\n\t * This is the main data source for widget rendering.\n\t */\n\tgetToolOutput<T = Record<string, unknown>>(): T | null;\n\n\t/**\n\t * Register a callback for when tool results are received.\n\t * On OpenAI, this subscribes to toolOutput changes.\n\t * On MCP Apps, this sets app.ontoolresult.\n\t */\n\tonToolResult(callback: (result: ToolResult) => void): () => void;\n\n\t/**\n\t * Call another tool on the server.\n\t */\n\tcallTool(\n\t\tname: string,\n\t\targs: Record<string, unknown>,\n\t): Promise<ToolCallResult>;\n\n\t/**\n\t * Open an external URL.\n\t * On OpenAI: openai.openExternal({ href })\n\t * On MCP Apps: app.sendOpenLink(url)\n\t */\n\topenExternal(url: string): void;\n\n\t/**\n\t * Send a follow-up message to the AI.\n\t * On OpenAI: openai.sendFollowUpMessage({ prompt })\n\t * On MCP Apps: app.sendMessages([{ role: 'user', content: { type: 'text', text: prompt } }])\n\t */\n\tsendFollowUp(prompt: string): void | Promise<void>;\n\n\t/**\n\t * Update hidden model context for the next assistant turn.\n\t * On MCP Apps this uses the standard `ui/update-model-context` request.\n\t * On other hosts this may fall back to best-effort behavior.\n\t */\n\tupdateModelContext(context: ModelContextUpdate): Promise<void> | void;\n\n\t/**\n\t * Get the current theme.\n\t */\n\tgetTheme(): Theme;\n\n\t/**\n\t * Subscribe to theme changes.\n\t */\n\tonThemeChange(callback: (theme: Theme) => void): () => void;\n\n\t/**\n\t * Get the current locale.\n\t */\n\tgetLocale(): string;\n\n\t/**\n\t * Get the current display mode.\n\t * OpenAI-only: returns \"pip\" | \"inline\" | \"fullscreen\"\n\t * MCP Apps: always returns \"inline\"\n\t */\n\tgetDisplayMode(): DisplayMode;\n\n\t/**\n\t * Request a display mode change.\n\t * OpenAI-only: requests the mode from the host.\n\t * MCP Apps: no-op (returns current mode).\n\t */\n\trequestDisplayMode(mode: DisplayMode): Promise<DisplayMode>;\n\n\t/**\n\t * Subscribe to display mode changes.\n\t * OpenAI-only: subscribes to displayMode changes.\n\t * MCP Apps: callback is never called.\n\t */\n\tonDisplayModeChange(callback: (mode: DisplayMode) => void): () => void;\n\n\t/**\n\t * Get the safe area insets.\n\t * OpenAI-only: returns insets from window.openai.safeArea.\n\t * MCP Apps: returns null.\n\t */\n\tgetSafeArea(): SafeArea | null;\n\n\t/**\n\t * Subscribe to safe area changes.\n\t * OpenAI-only: subscribes to safeArea changes.\n\t * MCP Apps: callback is never called.\n\t */\n\tonSafeAreaChange(callback: (safeArea: SafeArea | null) => void): () => void;\n\n\t/**\n\t * Get the max height constraint.\n\t * OpenAI-only: returns maxHeight from window.openai.maxHeight.\n\t * MCP Apps: returns null.\n\t */\n\tgetMaxHeight(): number | null;\n\n\t/**\n\t * Subscribe to max height changes.\n\t * OpenAI-only: subscribes to maxHeight changes.\n\t * MCP Apps: callback is never called.\n\t */\n\tonMaxHeightChange(callback: (maxHeight: number | null) => void): () => void;\n\n\t/**\n\t * Get the tool response metadata.\n\t * OpenAI: returns metadata from window.openai.toolResponseMetadata.\n\t * MCP Apps: returns `_meta` from the latest `ui/notifications/tool-result`, if provided by host.\n\t */\n\tgetToolResponseMetadata(): UnknownObject | null;\n\n\t/**\n\t * Subscribe to tool response metadata changes.\n\t * OpenAI: subscribes to toolResponseMetadata changes.\n\t * MCP Apps: fires when tool result `_meta` changes.\n\t */\n\tonToolResponseMetadataChange(\n\t\tcallback: (metadata: UnknownObject | null) => void,\n\t): () => void;\n\n\t/**\n\t * Get the widget state.\n\t * OpenAI-only: returns state from window.openai.widgetState.\n\t * MCP Apps: returns null.\n\t */\n\tgetWidgetState(): UnknownObject | null;\n\n\t/**\n\t * Subscribe to widget state changes.\n\t * OpenAI-only: subscribes to widgetState changes.\n\t * MCP Apps: callback is never called.\n\t */\n\tonWidgetStateChange(\n\t\tcallback: (state: UnknownObject | null) => void,\n\t): () => void;\n}\n\n/**\n * Creates a unified widget client for the current platform.\n */\nexport async function createWidgetClient(): Promise<UnifiedWidgetClient> {\n\tconst { detectPlatform } = await import(\"./platform\");\n\tconst platform = detectPlatform();\n\n\tif (platform === \"openai\") {\n\t\tconst { OpenAIWidgetClient } = await import(\"./openai-client\");\n\t\treturn new OpenAIWidgetClient();\n\t} else {\n\t\tconst { MCPAppsWidgetClient } = await import(\"./mcp-apps-client\");\n\t\treturn new MCPAppsWidgetClient();\n\t}\n}\n","\"use client\";\n\nimport type { DisplayMode } from \"./@types\";\nimport { useWidgetClient } from \"./use-widget\";\n\n/**\n * Get the current display mode.\n * Works on both OpenAI widgets and MCP Apps.\n *\n * @deprecated Legacy MCP-widget-in-host stack. Preserved for back-compat; will move to\n * `@waniwani/sdk/legacy/react` in a future minor release.\n * @returns The current display mode (\"pip\" | \"inline\" | \"fullscreen\")\n */\nexport function useDisplayMode(): DisplayMode {\n\treturn useWidgetClient(\"displayMode\");\n}\n","\"use client\";\n\nimport { useToolOutput } from \"./use-tool-output\";\n\n// ── Types ────────────────────────────────────────────────────\n\n/** Return type of the useFlowAction hook */\nexport type FlowActionResult<T> = {\n\t/** Current widget data from structuredContent. */\n\tdata: T | null;\n};\n\n// ── Hook ─────────────────────────────────────────────────────\n\n/**\n * Hook for reading flow widget data from structuredContent.\n * Lightweight wrapper over `useToolOutput` — will be extended\n * with flow-specific features in the future.\n *\n * @deprecated Legacy MCP-widget-in-host stack. Preserved for back-compat; will move to\n * `@waniwani/sdk/legacy/react` in a future minor release.\n *\n * @example\n * ```tsx\n * const { data } = useFlowAction<{ plans: string[] }>();\n * if (!data) return null;\n * return <PricingTable plans={data.plans} />;\n * ```\n */\nexport function useFlowAction<\n\tT extends Record<string, unknown>,\n>(): FlowActionResult<T> {\n\tconst data = useToolOutput<T>();\n\treturn { data };\n}\n","\"use client\";\n\nimport { useWidgetClient } from \"./use-widget\";\n\n/**\n * Get the tool output (structured content returned by the tool handler).\n * Works on both OpenAI widgets and MCP Apps.\n *\n * @deprecated Legacy MCP-widget-in-host stack. Preserved for back-compat; will move to\n * `@waniwani/sdk/legacy/react` in a future minor release.\n * @returns The tool output or null\n */\nexport function useToolOutput<T extends Record<string, unknown>>(): T | null {\n\treturn useWidgetClient(\"toolOutput\") as T | null;\n}\n","\"use client\";\n\nimport { useSyncExternalStore } from \"react\";\n\n/**\n * Check if running in ChatGPT app (OpenAI-only).\n * Returns false on MCP Apps.\n *\n * @deprecated Legacy MCP-widget-in-host stack. Preserved for back-compat; will move to\n * `@waniwani/sdk/legacy/react` in a future minor release.\n * @returns Whether the widget is running in ChatGPT app\n */\nexport function useIsChatGptApp(): boolean {\n\treturn useSyncExternalStore(\n\t\t() => () => {},\n\t\t() => {\n\t\t\tif (typeof window === \"undefined\") {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\t// biome-ignore lint/suspicious/noExplicitAny: __isChatGptApp is injected by ChatGPT\n\t\t\treturn (window as any).__isChatGptApp === true;\n\t\t},\n\t\t() => false,\n\t);\n}\n","\"use client\";\n\nimport { useWidgetClient } from \"./use-widget\";\n\n/**\n * Get the current locale.\n * Works on both OpenAI widgets and MCP Apps.\n *\n * @deprecated Legacy MCP-widget-in-host stack. Preserved for back-compat; will move to\n * `@waniwani/sdk/legacy/react` in a future minor release.\n * @returns The current locale string (e.g., \"en-US\")\n */\nexport function useLocale(): string {\n\treturn useWidgetClient(\"locale\");\n}\n","\"use client\";\n\nimport { useWidgetClient } from \"./use-widget\";\n\n/**\n * Get the maximum height available for the widget (OpenAI-only).\n * Useful for responsive layouts that need to adapt to container constraints.\n * Returns null on MCP Apps.\n *\n * @deprecated Legacy MCP-widget-in-host stack. Preserved for back-compat; will move to\n * `@waniwani/sdk/legacy/react` in a future minor release.\n * @returns The maximum height in pixels, or null if not available\n */\nexport function useMaxHeight(): number | null {\n\treturn useWidgetClient(\"maxHeight\");\n}\n","\"use client\";\n\nimport { useCallback } from \"react\";\nimport { useWidgetClient } from \"./use-widget\";\n\n/**\n * Get a function to open external URLs.\n * Works on both OpenAI widgets and MCP Apps.\n *\n * @deprecated Legacy MCP-widget-in-host stack. Preserved for back-compat; will move to\n * `@waniwani/sdk/legacy/react` in a future minor release.\n * @returns A function that opens external URLs\n */\nexport function useOpenExternal(): (url: string) => void {\n\tconst client = useWidgetClient();\n\treturn useCallback((url: string) => client.openExternal(url), [client]);\n}\n","\"use client\";\n\nimport { useCallback } from \"react\";\nimport type { DisplayMode } from \"./@types\";\nimport { useWidgetClient } from \"./use-widget\";\n\n/**\n * Get a function to request display mode changes.\n * On MCP Apps, this may be a no-op depending on host support.\n *\n * @deprecated Legacy MCP-widget-in-host stack. Preserved for back-compat; will move to\n * `@waniwani/sdk/legacy/react` in a future minor release.\n * @returns A function to request a specific display mode\n */\nexport function useRequestDisplayMode(): (\n\tmode: DisplayMode,\n) => Promise<DisplayMode> {\n\tconst client = useWidgetClient();\n\treturn useCallback(\n\t\t(mode: DisplayMode) => client.requestDisplayMode(mode),\n\t\t[client],\n\t);\n}\n","\"use client\";\n\nimport type { SafeArea } from \"./@types\";\nimport { useWidgetClient } from \"./use-widget\";\n\n/**\n * Get safe area insets (OpenAI-only).\n * Useful for ensuring UI elements don't get hidden behind the chat input.\n * Returns null on MCP Apps.\n *\n * @deprecated Legacy MCP-widget-in-host stack. Preserved for back-compat; will move to\n * `@waniwani/sdk/legacy/react` in a future minor release.\n * @returns The safe area insets, or null if not available\n */\nexport function useSafeArea(): SafeArea | null {\n\treturn useWidgetClient(\"safeArea\");\n}\n","\"use client\";\n\nimport { useCallback } from \"react\";\nimport {\n\thasModelContext,\n\ttype ModelContextUpdate,\n} from \"../../../../shared/model-context\";\nimport { useWidgetClient } from \"./use-widget\";\n\nexport interface SendFollowUpOptions {\n\tmodelContext?: ModelContextUpdate | null;\n}\n\n/**\n * Get a function to send follow-up messages to the AI.\n * Works on both OpenAI widgets and MCP Apps.\n *\n * @deprecated Legacy MCP-widget-in-host stack. Preserved for back-compat; will move to\n * `@waniwani/sdk/legacy/react` in a future minor release.\n * @returns A function that sends a follow-up message\n */\nexport function useSendFollowUp(): (\n\tprompt: string,\n\toptions?: SendFollowUpOptions,\n) => void {\n\tconst client = useWidgetClient();\n\treturn useCallback(\n\t\t(prompt: string, options?: SendFollowUpOptions) => {\n\t\t\tvoid (async () => {\n\t\t\t\tif (hasModelContext(options?.modelContext)) {\n\t\t\t\t\tawait Promise.resolve(\n\t\t\t\t\t\tclient.updateModelContext(options.modelContext),\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tawait Promise.resolve(client.sendFollowUp(prompt));\n\t\t\t})().catch((error) => {\n\t\t\t\tconsole.error(\"Failed to send follow-up message:\", error);\n\t\t\t});\n\t\t},\n\t\t[client],\n\t);\n}\n","\"use client\";\n\nimport type { Theme } from \"./@types\";\nimport { useWidgetClient } from \"./use-widget\";\n\n/**\n * Get the current theme.\n * Works on both OpenAI widgets and MCP Apps.\n *\n * @deprecated Legacy MCP-widget-in-host stack. Preserved for back-compat; will move to\n * `@waniwani/sdk/legacy/react` in a future minor release.\n * @returns The current theme (\"light\" | \"dark\")\n */\nexport function useTheme(): Theme {\n\treturn useWidgetClient(\"theme\");\n}\n","\"use client\";\n\nimport type { UnknownObject } from \"./@types\";\nimport { useWidgetClient } from \"./use-widget\";\n\n/**\n * Get tool response metadata.\n * Contains host/tool metadata (for example identifiers like\n * `openai/widgetSessionId` and custom tool `_meta` fields).\n * Returns null when the host does not provide metadata.\n *\n * @deprecated Legacy MCP-widget-in-host stack. Preserved for back-compat; will move to\n * `@waniwani/sdk/legacy/react` in a future minor release.\n * @returns The tool response metadata object or null if not available\n */\nexport function useToolResponseMetadata(): UnknownObject | null {\n\treturn useWidgetClient(\"toolResponseMetadata\");\n}\n","\"use client\";\n\nimport { useCallback } from \"react\";\nimport type { ModelContextUpdate } from \"../../../../shared/model-context\";\nimport { useWidgetClient } from \"./use-widget\";\n\n/**\n * Get a function to update hidden model context for the next assistant turn.\n * Uses the MCP Apps `ui/update-model-context` request when available.\n *\n * @deprecated Legacy MCP-widget-in-host stack. Preserved for back-compat; will move to\n * `@waniwani/sdk/legacy/react` in a future minor release.\n */\nexport function useUpdateModelContext(): (\n\tcontext: ModelContextUpdate,\n) => Promise<void> {\n\tconst client = useWidgetClient();\n\n\treturn useCallback(\n\t\tasync (context: ModelContextUpdate) => {\n\t\t\tawait Promise.resolve(client.updateModelContext(context));\n\t\t},\n\t\t[client],\n\t);\n}\n","\"use client\";\n\nimport { type SetStateAction, useCallback, useEffect, useState } from \"react\";\nimport { detectPlatform } from \"../widgets/platform\";\nimport type { UnknownObject } from \"./@types\";\nimport { useWidgetClient } from \"./use-widget\";\n\n/**\n * Widget state that persists across widget lifecycles (OpenAI-only).\n * State is synchronized with the ChatGPT parent window and survives widget minimize/restore.\n * On MCP Apps, returns [null, no-op].\n *\n * @deprecated Legacy MCP-widget-in-host stack. Preserved for back-compat; will move to\n * `@waniwani/sdk/legacy/react` in a future minor release.\n * @param defaultState - Initial state value or function to compute it\n * @returns A tuple of [state, setState] similar to useState\n */\nexport function useWidgetState<T extends UnknownObject>(\n\tdefaultState?: T | (() => T | null) | null,\n): readonly [T | null, (state: SetStateAction<T | null>) => void] {\n\tconst widgetStateFromWindow = useWidgetClient(\"widgetState\") as T | null;\n\n\tconst [widgetState, _setWidgetState] = useState<T | null>(() => {\n\t\tif (widgetStateFromWindow != null) {\n\t\t\treturn widgetStateFromWindow;\n\t\t}\n\t\treturn typeof defaultState === \"function\"\n\t\t\t? defaultState()\n\t\t\t: (defaultState ?? null);\n\t});\n\n\tuseEffect(() => {\n\t\t_setWidgetState(widgetStateFromWindow);\n\t}, [widgetStateFromWindow]);\n\n\tconst setWidgetState = useCallback((state: SetStateAction<T | null>) => {\n\t\t_setWidgetState((prevState) => {\n\t\t\tconst newState = typeof state === \"function\" ? state(prevState) : state;\n\n\t\t\tif (detectPlatform() === \"openai\" && newState != null) {\n\t\t\t\twindow.openai?.setWidgetState(newState);\n\t\t\t}\n\n\t\t\treturn newState;\n\t\t});\n\t}, []);\n\n\treturn [widgetState, setWidgetState] as const;\n}\n","/**\n * Default loading fallback for legacy MCP widgets.\n *\n * @deprecated Legacy MCP-widget-in-host stack. Preserved for back-compat; will move to\n * `@waniwani/sdk/legacy/react` in a future minor release.\n */\nexport const LoadingWidget = () => {\n\treturn (\n\t\t<div className=\"flex flex-col items-center justify-center h-full min-h-[120px] gap-4\">\n\t\t\t{/* Animated dots */}\n\t\t\t<div className=\"flex gap-2\">\n\t\t\t\t<div className=\"w-3 h-3 rounded-full bg-gradient-to-r from-blue-400 to-cyan-400 animate-bounce [animation-delay:-0.3s]\" />\n\t\t\t\t<div className=\"w-3 h-3 rounded-full bg-gradient-to-r from-cyan-400 to-teal-400 animate-bounce [animation-delay:-0.15s]\" />\n\t\t\t\t<div className=\"w-3 h-3 rounded-full bg-gradient-to-r from-teal-400 to-emerald-400 animate-bounce\" />\n\t\t\t</div>\n\n\t\t\t{/* Shimmer text */}\n\t\t\t<p className=\"text-sm font-medium text-transparent bg-clip-text bg-gradient-to-r from-slate-400 via-slate-200 to-slate-400 bg-[length:200%_100%] animate-[shimmer_1.5s_ease-in-out_infinite]\">\n\t\t\t\tLoading widget...\n\t\t\t</p>\n\n\t\t\t{/* Pulsing ring */}\n\t\t\t<div className=\"absolute inset-0 flex items-center justify-center pointer-events-none\">\n\t\t\t\t<div className=\"w-16 h-16 rounded-full border-2 border-blue-400/20 animate-ping\" />\n\t\t\t</div>\n\n\t\t\t<style>{`\n @keyframes shimmer {\n 0% { background-position: 200% 0; }\n 100% { background-position: -200% 0; }\n }\n `}</style>\n\t\t</div>\n\t);\n};\n","// Waniwani SDK - Next.js Adapter\n\nimport type { WaniWaniClient } from \"../../../types.js\";\nimport { createApiHandler } from \"../server/api-handler.js\";\nimport type { NextJsHandlerOptions, NextJsHandlerResult } from \"./@types.js\";\n\nexport type { NextJsHandlerOptions, NextJsHandlerResult } from \"./@types.js\";\n\nlet deprecationWarned = false;\n\n/**\n * Create Next.js route handlers from a Waniwani client.\n *\n * Returns `{ GET, POST }` for use with catch-all routes.\n * Mount at `app/api/waniwani/[[...path]]/route.ts`:\n *\n * - `POST /api/waniwani` → chat (proxied to Waniwani API)\n * - `GET /api/waniwani/resource?uri=…` → MCP resource content\n *\n * @deprecated The chat-server catch-all adapters are being phased out. The chat widget\n * will talk directly to `app.waniwani.ai` in a future release, removing the need for a\n * self-hosted BFF. This export is preserved for back-compat with existing customer MCPs\n * but is no longer documented; it will move to `@waniwani/sdk/legacy/next-js` in a future\n * minor release.\n *\n * @example\n * ```typescript\n * // app/api/waniwani/[[...path]]/route.ts\n * import { waniwani } from \"@waniwani/sdk\";\n * import { toNextJsHandler } from \"@waniwani/sdk/next-js\";\n *\n * const wani = waniwani();\n *\n * export const { GET, POST } = toNextJsHandler(wani, {\n * chat: {\n * systemPrompt: \"You are a helpful assistant.\",\n * mcpServerUrl: process.env.MCP_SERVER_URL!,\n * },\n * });\n * ```\n */\nexport function toNextJsHandler(\n\tclient: WaniWaniClient,\n\toptions: NextJsHandlerOptions,\n): NextJsHandlerResult {\n\tif (!deprecationWarned && process.env.NODE_ENV !== \"test\") {\n\t\tconsole.warn(\n\t\t\t\"[waniwani-sdk] toNextJsHandler is deprecated; switch to toExpressJsHandler from @waniwani/sdk/express-js. It will be removed in a follow-up release.\",\n\t\t);\n\t\tdeprecationWarned = true;\n\t}\n\n\tconst { apiKey, apiUrl } = client._config;\n\n\tconst debugEnabled = options?.debug ?? process.env.WANIWANI_DEBUG === \"1\";\n\n\tconst handler = createApiHandler({\n\t\t...options?.chat,\n\t\tapiKey,\n\t\tapiUrl,\n\t\tsource: options?.source,\n\t\tdebug: debugEnabled,\n\t});\n\n\treturn {\n\t\tPOST: handler.routePost,\n\t\tGET: handler.routeGet,\n\t\tPATCH: handler.routePatch,\n\t\tOPTIONS: () => handler.handleOptions(),\n\t};\n}\n","// API Handler - Composes chat and resource handlers into a unified API handler\n\nimport { createLogger } from \"../../../utils/logger.js\";\nimport {\n\ttype ApiHandler,\n\ttype ApiHandlerOptions,\n\tresolveWebSearchConfig,\n} from \"./@types\";\nimport { createCors, createJsonResponse } from \"./@utils\";\nimport { createChatRequestHandler } from \"./handle-chat\";\nimport { createResourceHandler } from \"./handle-resource\";\nimport { createToolHandler } from \"./handle-tool\";\nimport { createToolsListHandler } from \"./handle-tools-list\";\nimport { createMcpConfigResolver } from \"./mcp-config-resolver\";\n\nconst DEFAULT_API_URL = \"https://app.waniwani.ai\";\n\n/**\n * Compose chat + resource + tool + tools-list handlers into a unified API handler.\n *\n * @deprecated The chat-server catch-all is being phased out — the chat widget will talk\n * directly to `app.waniwani.ai` in a future release. Preserved for back-compat with\n * `toNextJsHandler` and `toExpressJsHandler` consumers; will move to `@waniwani/sdk/legacy`\n * in a future minor release.\n */\nexport function createApiHandler(options: ApiHandlerOptions = {}): ApiHandler {\n\tconst {\n\t\tapiKey = process.env.WANIWANI_API_KEY,\n\t\tapiUrl = DEFAULT_API_URL,\n\t\tsource,\n\t\tsystemPrompt,\n\t\tmaxSteps = 5,\n\t\tbeforeRequest,\n\t\tmcpServerUrl,\n\t\tdebug = false,\n\t\twebSearch,\n\t} = options;\n\n\tconst log = createLogger(\"router\", debug);\n\tconst cors = createCors();\n\tconst json = createJsonResponse(cors);\n\n\tconst resolveConfig = createMcpConfigResolver(apiUrl, apiKey);\n\n\tconst handleChat = createChatRequestHandler({\n\t\tapiKey,\n\t\tapiUrl,\n\t\tsource,\n\t\tsystemPrompt,\n\t\tmaxSteps,\n\t\tbeforeRequest,\n\t\tmcpServerUrl,\n\t\tresolveConfig,\n\t\tdebug,\n\t\twebSearch: resolveWebSearchConfig(webSearch),\n\t});\n\n\tconst handleResource = createResourceHandler({\n\t\tmcpServerUrl,\n\t\tresolveConfig,\n\t\tdebug,\n\t});\n\n\tconst handleToolsList = createToolsListHandler({\n\t\tmcpServerUrl,\n\t\tresolveConfig,\n\t\tdebug,\n\t});\n\n\tconst handleTool = createToolHandler({\n\t\tmcpServerUrl,\n\t\tresolveConfig,\n\t\tdebug,\n\t\tsource,\n\t});\n\n\tconst evalEnabled = process.env.WANIWANI_EVAL === \"1\";\n\n\tasync function routeGet(request: Request): Promise<Response> {\n\t\tlog(\"→ GET\", request.url);\n\t\ttry {\n\t\t\tconst url = new URL(request.url);\n\t\t\tconst segments = url.pathname\n\t\t\t\t.replace(/\\/$/, \"\")\n\t\t\t\t.split(\"/\")\n\t\t\t\t.filter(Boolean);\n\t\t\tconst subRoute = segments.at(-1);\n\t\t\tlog(\"pathname:\", url.pathname, \"subRoute:\", subRoute);\n\n\t\t\tif (evalEnabled && subRoute === \"scenarios\") {\n\t\t\t\tlog(\"dispatching to scenarios handler (proxy to app API)\");\n\t\t\t\ttry {\n\t\t\t\t\tconst res = await fetch(`${apiUrl}/api/mcp/scenarios`, {\n\t\t\t\t\t\theaders: {\n\t\t\t\t\t\t\t...(apiKey ? { Authorization: `Bearer ${apiKey}` } : {}),\n\t\t\t\t\t\t},\n\t\t\t\t\t});\n\t\t\t\t\tconst data = await res.json();\n\t\t\t\t\treturn json(data.data ?? data, 200);\n\t\t\t\t} catch {\n\t\t\t\t\treturn json([], 200);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (subRoute === \"resource\") {\n\t\t\t\tlog(\"dispatching to resource handler\");\n\t\t\t\tconst response = await handleResource(url);\n\t\t\t\tlog(\"← resource handler returned\", response.status);\n\t\t\t\treturn cors(response);\n\t\t\t}\n\n\t\t\tif (subRoute === \"config\") {\n\t\t\t\tlog(\"dispatching to config handler\");\n\t\t\t\treturn json({ debug, eval: evalEnabled }, 200);\n\t\t\t}\n\n\t\t\tif (subRoute === \"tools\") {\n\t\t\t\tlog(\"dispatching to tools-list handler\");\n\t\t\t\tconst response = await handleToolsList();\n\t\t\t\tlog(\"← tools-list handler returned\", response.status);\n\t\t\t\treturn cors(response);\n\t\t\t}\n\n\t\t\tlog(\"← 404 no matching sub-route for\", subRoute);\n\t\t\treturn json({ error: \"Not found\" }, 404);\n\t\t} catch (error) {\n\t\t\tconsole.error(\"[waniwani:router] GET handler error:\", error);\n\t\t\tconst message =\n\t\t\t\terror instanceof Error ? error.message : \"Unknown error occurred\";\n\t\t\tlog(\"← 500 from caught error\");\n\t\t\treturn json({ error: message }, 500);\n\t\t}\n\t}\n\n\tasync function routePost(request: Request): Promise<Response> {\n\t\tlog(\"→ POST\", request.url);\n\t\ttry {\n\t\t\tconst url = new URL(request.url);\n\t\t\tconst segments = url.pathname\n\t\t\t\t.replace(/\\/$/, \"\")\n\t\t\t\t.split(\"/\")\n\t\t\t\t.filter(Boolean);\n\t\t\tconst subRoute = segments.at(-1);\n\t\t\tlog(\"pathname:\", url.pathname, \"subRoute:\", subRoute);\n\n\t\t\tif (evalEnabled && subRoute === \"scenarios\") {\n\t\t\t\tlog(\"dispatching to save-scenario handler (proxy to app API)\");\n\t\t\t\ttry {\n\t\t\t\t\tconst body = await request.json();\n\t\t\t\t\tconst res = await fetch(`${apiUrl}/api/mcp/scenarios`, {\n\t\t\t\t\t\tmethod: \"POST\",\n\t\t\t\t\t\theaders: {\n\t\t\t\t\t\t\t\"Content-Type\": \"application/json\",\n\t\t\t\t\t\t\t...(apiKey ? { Authorization: `Bearer ${apiKey}` } : {}),\n\t\t\t\t\t\t},\n\t\t\t\t\t\tbody: JSON.stringify(body),\n\t\t\t\t\t});\n\t\t\t\t\tconst data = await res.json();\n\t\t\t\t\tif (!res.ok) {\n\t\t\t\t\t\treturn json(\n\t\t\t\t\t\t\t{ error: data.message ?? \"Failed to save scenario\" },\n\t\t\t\t\t\t\tres.status,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\treturn json({ ok: true, scenario: data.data }, 200);\n\t\t\t\t} catch (e) {\n\t\t\t\t\tconst msg =\n\t\t\t\t\t\te instanceof Error ? e.message : \"Failed to save scenario\";\n\t\t\t\t\treturn json({ error: msg }, 400);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (subRoute === \"tool\") {\n\t\t\t\tlog(\"dispatching to tool handler\");\n\t\t\t\tconst response = await handleTool(request);\n\t\t\t\tlog(\"← tool handler returned\", response.status);\n\t\t\t\treturn cors(response);\n\t\t\t}\n\n\t\t\t// Default: treat as chat request\n\t\t\tlog(\"dispatching to chat handler\");\n\t\t\tconst chatResponse = await handleChat(request);\n\t\t\treturn cors(chatResponse);\n\t\t} catch (error) {\n\t\t\tconsole.error(\"[waniwani:router] POST handler error:\", error);\n\t\t\tconst message =\n\t\t\t\terror instanceof Error ? error.message : \"Unknown error occurred\";\n\t\t\tlog(\"← 500 from caught error\");\n\t\t\treturn json({ error: message }, 500);\n\t\t}\n\t}\n\n\tasync function routePatch(request: Request): Promise<Response> {\n\t\tlog(\"→ PATCH\", request.url);\n\t\ttry {\n\t\t\tconst url = new URL(request.url);\n\t\t\tconst segments = url.pathname\n\t\t\t\t.replace(/\\/$/, \"\")\n\t\t\t\t.split(\"/\")\n\t\t\t\t.filter(Boolean);\n\t\t\tconst scenarioId = segments.at(-1);\n\t\t\tconst subRoute = segments.at(-2);\n\t\t\tlog(\"pathname:\", url.pathname, \"subRoute:\", subRoute, \"id:\", scenarioId);\n\n\t\t\tif (evalEnabled && subRoute === \"scenarios\" && scenarioId) {\n\t\t\t\tlog(\"dispatching to update-scenario handler (proxy to app API)\");\n\t\t\t\ttry {\n\t\t\t\t\tconst body = await request.json();\n\t\t\t\t\tconst res = await fetch(`${apiUrl}/api/mcp/scenarios/${scenarioId}`, {\n\t\t\t\t\t\tmethod: \"PATCH\",\n\t\t\t\t\t\theaders: {\n\t\t\t\t\t\t\t\"Content-Type\": \"application/json\",\n\t\t\t\t\t\t\t...(apiKey ? { Authorization: `Bearer ${apiKey}` } : {}),\n\t\t\t\t\t\t},\n\t\t\t\t\t\tbody: JSON.stringify(body),\n\t\t\t\t\t});\n\t\t\t\t\tconst data = await res.json();\n\t\t\t\t\tif (!res.ok) {\n\t\t\t\t\t\treturn json(\n\t\t\t\t\t\t\t{ error: data.message ?? \"Failed to update scenario\" },\n\t\t\t\t\t\t\tres.status,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\treturn json({ ok: true, scenario: data.data }, 200);\n\t\t\t\t} catch (e) {\n\t\t\t\t\tconst msg =\n\t\t\t\t\t\te instanceof Error ? e.message : \"Failed to update scenario\";\n\t\t\t\t\treturn json({ error: msg }, 400);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlog(\"← 404 no matching sub-route for PATCH\", subRoute);\n\t\t\treturn json({ error: \"Not found\" }, 404);\n\t\t} catch (error) {\n\t\t\tconsole.error(\"[waniwani:router] PATCH handler error:\", error);\n\t\t\tconst message =\n\t\t\t\terror instanceof Error ? error.message : \"Unknown error occurred\";\n\t\t\tlog(\"← 500 from caught error\");\n\t\t\treturn json({ error: message }, 500);\n\t\t}\n\t}\n\n\tfunction handleOptions(): Response {\n\t\treturn cors(new Response(null, { status: 204 }));\n\t}\n\n\treturn {\n\t\thandleChat,\n\t\thandleResource,\n\t\thandleTool,\n\t\trouteGet,\n\t\troutePost,\n\t\troutePatch,\n\t\thandleOptions,\n\t};\n}\n","type LogLevel = \"debug\" | \"warn\" | \"error\" | \"none\";\n\nconst LEVELS: Record<LogLevel, number> = {\n\tdebug: 0,\n\twarn: 1,\n\terror: 2,\n\tnone: 3,\n};\n\nfunction getGlobalLevel(): LogLevel {\n\tconst explicit = process.env.WANIWANI_LOG_LEVEL as LogLevel | undefined;\n\tif (explicit && explicit in LEVELS) {\n\t\treturn explicit;\n\t}\n\tif (process.env.WANIWANI_DEBUG) {\n\t\treturn \"debug\";\n\t}\n\treturn \"none\";\n}\n\n/**\n * Creates a namespaced logger that writes to console when the log level permits.\n *\n * When `enabled` is omitted the logger checks `WANIWANI_LOG_LEVEL` (or falls\n * back to `WANIWANI_DEBUG` for backward compat). Pass an explicit boolean to\n * override the env-var check (e.g. from a user-facing `debug` option).\n *\n * @example\n * const log = createLogger(\"chat\"); // env-var driven\n * const log = createLogger(\"chat\", debug); // explicit override\n */\nexport function createLogger(\n\tnamespace: string,\n\tenabled?: boolean,\n): (...args: unknown[]) => void {\n\tconst active = enabled ?? getGlobalLevel() === \"debug\";\n\treturn active\n\t\t? (...args: unknown[]) => console.log(`[waniwani:${namespace}]`, ...args)\n\t\t: () => {};\n}\n","// Waniwani SDK - Chat Server Types\n\nimport type { UIMessage } from \"ai\";\nimport type { ModelContextUpdate } from \"../../../shared/model-context\";\nimport type { GeoLocation } from \"./geo\";\n\n// ============================================================================\n// Visitor Context\n// ============================================================================\n\n/** Client-side visitor context sent in the request body */\nexport interface ClientVisitorContext {\n\ttimezone: string;\n\tlanguage: string;\n\tlanguages: string[];\n\tdeviceType: \"mobile\" | \"tablet\" | \"desktop\";\n\treferrer: string;\n\tvisitorId: string;\n}\n\n/** Combined visitor context: server geo + client context */\nexport interface VisitorMeta {\n\tgeo: GeoLocation;\n\tclient: ClientVisitorContext | null;\n}\n\n// ============================================================================\n// Before Request Hook\n// ============================================================================\n\nexport interface BeforeRequestContext {\n\t/** The conversation messages from the client */\n\tmessages: UIMessage[];\n\t/** Session identifier for conversation continuity */\n\tsessionId?: string;\n\t/** Hidden widget-provided model context for the next assistant turn */\n\tmodelContext?: ModelContextUpdate;\n\t/** The original HTTP Request object */\n\trequest: Request;\n\t/** Server-extracted geo location + client-provided visitor context */\n\tvisitor: VisitorMeta;\n}\n\nexport type BeforeRequestResult = {\n\t/** Override messages (e.g., filtered, augmented) */\n\tmessages?: UIMessage[];\n\t/** Override the system prompt for this request */\n\tsystemPrompt?: string;\n\t/** Override sessionId */\n\tsessionId?: string;\n\t/** Override hidden widget-provided model context */\n\tmodelContext?: ModelContextUpdate;\n};\n\n// ============================================================================\n// Web Search\n// ============================================================================\n\nexport interface WebSearchConfig {\n\t/** Restrict web search results to these domains */\n\tincludeDomains?: string[];\n\t/** Exclude these domains from web search results */\n\texcludeDomains?: string[];\n}\n\n// ============================================================================\n// Chat Options (namespaced under `chat` in framework adapters)\n// ============================================================================\n\nexport interface ChatOptions {\n\t/**\n\t * System prompt for the assistant.\n\t * Can be overridden per-request via `beforeRequest`.\n\t */\n\tsystemPrompt?: string;\n\n\t/**\n\t * Maximum number of tool call steps. Defaults to 5.\n\t */\n\tmaxSteps?: number;\n\n\t/**\n\t * Hook called before each request is forwarded to the Waniwani API.\n\t * - Return void to use defaults.\n\t * - Return an object to override messages, systemPrompt, or sessionId.\n\t * - Throw to reject the request (the error message is returned as JSON).\n\t */\n\tbeforeRequest?: (\n\t\tcontext: BeforeRequestContext,\n\t) =>\n\t\t| Promise<BeforeRequestResult | undefined>\n\t\t| BeforeRequestResult\n\t\t| undefined;\n\n\t/**\n\t * Override the MCP server URL directly, bypassing config resolution.\n\t * Useful for development/testing when pointing to a local MCP server.\n\t */\n\tmcpServerUrl?: string;\n\n\t/**\n\t * Enable web search as an additional tool alongside MCP tools.\n\t * Pass `true` to enable with defaults, or a config object to restrict domains.\n\t */\n\twebSearch?: boolean | WebSearchConfig;\n}\n\n// ============================================================================\n// API Handler Options\n// ============================================================================\n\nexport interface ApiHandlerOptions {\n\t/**\n\t * Identifies this chatbar instance in analytics.\n\t * Forwarded as `waniwani/source` in MCP request metadata.\n\t */\n\tsource?: string;\n\n\t/**\n\t * Your Waniwani API key.\n\t * Defaults to process.env.WANIWANI_API_KEY.\n\t */\n\tapiKey?: string;\n\n\t/**\n\t * The base URL of the Waniwani API.\n\t * Defaults to https://app.waniwani.ai.\n\t */\n\tapiUrl?: string;\n\n\t/**\n\t * System prompt for the assistant.\n\t * Can be overridden per-request via `beforeRequest`.\n\t */\n\tsystemPrompt?: string;\n\n\t/**\n\t * Maximum number of tool call steps. Defaults to 5.\n\t */\n\tmaxSteps?: number;\n\n\t/**\n\t * Hook called before each request is forwarded to the Waniwani API.\n\t * - Return void to use defaults.\n\t * - Return an object to override messages, systemPrompt, or sessionId.\n\t * - Throw to reject the request (the error message is returned as JSON).\n\t */\n\tbeforeRequest?: (\n\t\tcontext: BeforeRequestContext,\n\t) =>\n\t\t| Promise<BeforeRequestResult | undefined>\n\t\t| BeforeRequestResult\n\t\t| undefined;\n\n\t/**\n\t * Override the MCP server URL directly, bypassing config resolution.\n\t * Useful for development/testing when pointing to a local MCP server.\n\t */\n\tmcpServerUrl?: string;\n\n\t/**\n\t * Enable verbose debug logging for all handler steps.\n\t * Logs request details, response codes, resolved URLs, and caught errors.\n\t */\n\tdebug?: boolean;\n\n\t/**\n\t * Enable web search as an additional tool alongside MCP tools.\n\t * Pass `true` to enable with defaults, or a config object to restrict domains.\n\t */\n\twebSearch?: boolean | WebSearchConfig;\n}\n\n// ============================================================================\n// API Handler Result\n// ============================================================================\n\nexport interface ApiHandler {\n\t/** Proxies chat messages to the Waniwani API */\n\thandleChat: (request: Request) => Promise<Response>;\n\t/** Serves MCP resource content (HTML widgets) */\n\thandleResource: (url: URL) => Promise<Response>;\n\t/** Calls an MCP server tool and returns JSON */\n\thandleTool: (request: Request) => Promise<Response>;\n\t/** Routes GET sub-paths (e.g. /resource) */\n\trouteGet: (request: Request) => Promise<Response>;\n\t/** Routes POST sub-paths (e.g. /tool), defaults to chat */\n\troutePost: (request: Request) => Promise<Response>;\n\t/** Routes PATCH sub-paths (e.g. /scenarios/:id) */\n\troutePatch: (request: Request) => Promise<Response>;\n\t/** Handles CORS preflight requests */\n\thandleOptions: () => Response;\n}\n\n// ============================================================================\n// Internal Dependencies (shared across sub-handlers)\n// ============================================================================\n\ninterface McpEnvironmentConfig {\n\tmcpServerUrl: string;\n}\n\ntype ConfigResolver = () => Promise<McpEnvironmentConfig>;\n\nexport interface ApiHandlerDeps {\n\tapiKey: string | undefined;\n\tapiUrl: string;\n\tsource: string | undefined;\n\tsystemPrompt: string | undefined;\n\tmaxSteps: number;\n\tbeforeRequest: ApiHandlerOptions[\"beforeRequest\"];\n\tmcpServerUrl: string | undefined;\n\tresolveConfig: ConfigResolver;\n\tdebug: boolean;\n\twebSearch?: WebSearchConfig;\n}\n\n/** Normalize `true` to `{}` so the upstream API always receives an object or undefined */\nexport function resolveWebSearchConfig(\n\tvalue: boolean | WebSearchConfig | undefined,\n): WebSearchConfig | undefined {\n\tif (value === true) {\n\t\treturn {};\n\t}\n\tif (value === false || value === undefined) {\n\t\treturn undefined;\n\t}\n\treturn value;\n}\n\nexport interface ResourceHandlerDeps {\n\tmcpServerUrl: string | undefined;\n\tresolveConfig: ConfigResolver;\n\tdebug: boolean;\n\tsource?: string;\n}\n","// Shared helpers for chat server handlers\n\nexport type CorsFunction = (response: Response) => Response;\n\nexport function createCors(): CorsFunction {\n\treturn function applyCors(response: Response): Response {\n\t\tresponse.headers.set(\"Access-Control-Allow-Origin\", \"*\");\n\t\tresponse.headers.set(\n\t\t\t\"Access-Control-Allow-Methods\",\n\t\t\t\"GET, POST, PATCH, OPTIONS\",\n\t\t);\n\t\tresponse.headers.set(\n\t\t\t\"Access-Control-Allow-Headers\",\n\t\t\t\"Content-Type, Authorization, X-Session-Id, X-Client-User-Agent\",\n\t\t);\n\t\tresponse.headers.set(\"Access-Control-Expose-Headers\", \"X-Session-Id\");\n\t\treturn response;\n\t};\n}\n\nexport function createJsonResponse(cors: CorsFunction) {\n\treturn function json(data: object, status: number): Response {\n\t\treturn cors(\n\t\t\tnew Response(JSON.stringify(data), {\n\t\t\t\theaders: { \"Content-Type\": \"application/json\" },\n\t\t\t\tstatus,\n\t\t\t}),\n\t\t);\n\t};\n}\n","// Handle Chat - Proxies chat requests to the Waniwani API\n\nimport { WaniWaniError } from \"../../../error\";\nimport { createLogger } from \"../../../utils/logger.js\";\nimport type {\n\tApiHandlerDeps,\n\tClientVisitorContext,\n\tVisitorMeta,\n} from \"./@types\";\nimport { extractGeoFromHeaders } from \"./geo\";\nimport { applyModelContextToSystemPrompt } from \"./model-context\";\n\nexport function createChatRequestHandler(deps: ApiHandlerDeps) {\n\tconst {\n\t\tapiKey,\n\t\tapiUrl,\n\t\tsource,\n\t\tsystemPrompt,\n\t\tmaxSteps,\n\t\tbeforeRequest,\n\t\tmcpServerUrl: mcpServerUrlOverride,\n\t\tresolveConfig,\n\t\tdebug,\n\t\twebSearch,\n\t} = deps;\n\n\tconst log = createLogger(\"chat\", debug);\n\n\treturn async function handleChat(request: Request): Promise<Response> {\n\t\tlog(\"→ POST\", request.url);\n\t\ttry {\n\t\t\t// 1. Parse request body\n\t\t\tconst body = await request.json();\n\t\t\tlet messages = body.messages ?? [];\n\t\t\tlet sessionId: string | undefined = body.sessionId;\n\t\t\tlet modelContext = body.modelContext;\n\t\t\tlet effectiveSystemPrompt = systemPrompt;\n\t\t\tconst extra: Record<string, unknown> | undefined =\n\t\t\t\ttypeof body.extra === \"object\" &&\n\t\t\t\tbody.extra !== null &&\n\t\t\t\t!Array.isArray(body.extra)\n\t\t\t\t\t? body.extra\n\t\t\t\t\t: undefined;\n\n\t\t\t// Extract visitor context (client-side + server-side geo)\n\t\t\tconst clientVisitorContext: ClientVisitorContext | null =\n\t\t\t\tbody.visitorContext ?? null;\n\t\t\tconst geo = extractGeoFromHeaders(request);\n\t\t\tconst visitor: VisitorMeta = { geo, client: clientVisitorContext };\n\n\t\t\tlog(\n\t\t\t\t\"body parsed — messages:\",\n\t\t\t\tmessages.length,\n\t\t\t\t\"sessionId:\",\n\t\t\t\tsessionId ?? \"(none)\",\n\t\t\t\t\"geo:\",\n\t\t\t\tJSON.stringify(geo),\n\t\t\t);\n\n\t\t\t// 2. Run beforeRequest hook\n\t\t\tif (beforeRequest) {\n\t\t\t\tlog(\"running beforeRequest hook\");\n\t\t\t\ttry {\n\t\t\t\t\tconst result = await beforeRequest({\n\t\t\t\t\t\tmessages,\n\t\t\t\t\t\tsessionId,\n\t\t\t\t\t\tmodelContext,\n\t\t\t\t\t\trequest,\n\t\t\t\t\t\tvisitor,\n\t\t\t\t\t});\n\n\t\t\t\t\tif (result) {\n\t\t\t\t\t\tif (result.messages) {\n\t\t\t\t\t\t\tmessages = result.messages;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (result.systemPrompt !== undefined) {\n\t\t\t\t\t\t\teffectiveSystemPrompt = result.systemPrompt;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (result.sessionId !== undefined) {\n\t\t\t\t\t\t\tsessionId = result.sessionId;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (result.modelContext !== undefined) {\n\t\t\t\t\t\t\tmodelContext = result.modelContext;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tlog(\n\t\t\t\t\t\t\"beforeRequest hook done — messages:\",\n\t\t\t\t\t\tmessages.length,\n\t\t\t\t\t\t\"sessionId:\",\n\t\t\t\t\t\tsessionId ?? \"(none)\",\n\t\t\t\t\t);\n\t\t\t\t} catch (hookError) {\n\t\t\t\t\tconsole.error(\"[waniwani:chat] beforeRequest hook error:\", hookError);\n\t\t\t\t\tconst status =\n\t\t\t\t\t\thookError instanceof WaniWaniError ? hookError.status : 400;\n\t\t\t\t\tconst message =\n\t\t\t\t\t\thookError instanceof Error ? hookError.message : \"Request rejected\";\n\t\t\t\t\tlog(\"← returning\", status, \"from hook error\");\n\t\t\t\t\treturn Response.json({ error: message }, { status });\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// 3. Resolve MCP server URL\n\t\t\tconst mcpServerUrl =\n\t\t\t\tmcpServerUrlOverride ?? (await resolveConfig()).mcpServerUrl;\n\t\t\tlog(\"mcpServerUrl:\", mcpServerUrl);\n\t\t\teffectiveSystemPrompt = applyModelContextToSystemPrompt(\n\t\t\t\teffectiveSystemPrompt,\n\t\t\t\tmodelContext,\n\t\t\t);\n\n\t\t\t// 4. Forward to Waniwani API\n\t\t\tconst upstreamUrl = `${apiUrl}/api/mcp/chat`;\n\t\t\tlog(\"forwarding to\", upstreamUrl);\n\t\t\tconst clientUserAgent = request.headers.get(\"user-agent\");\n\n\t\t\tconst response = await fetch(upstreamUrl, {\n\t\t\t\tmethod: \"POST\",\n\t\t\t\theaders: {\n\t\t\t\t\t\"Content-Type\": \"application/json\",\n\t\t\t\t\t\"X-WaniWani-Stream-Protocol\": \"2\",\n\t\t\t\t\t...(apiKey ? { Authorization: `Bearer ${apiKey}` } : {}),\n\t\t\t\t\t...(clientUserAgent\n\t\t\t\t\t\t? { \"X-Client-User-Agent\": clientUserAgent }\n\t\t\t\t\t\t: {}),\n\t\t\t\t},\n\t\t\t\tbody: JSON.stringify({\n\t\t\t\t\tmessages,\n\t\t\t\t\tmcpServerUrl,\n\t\t\t\t\tsessionId,\n\t\t\t\t\tsource,\n\t\t\t\t\tsystemPrompt: effectiveSystemPrompt,\n\t\t\t\t\tmaxSteps,\n\t\t\t\t\tvisitor,\n\t\t\t\t\twebSearch,\n\t\t\t\t\t...(extra && { extra }),\n\t\t\t\t}),\n\t\t\t\tsignal: request.signal,\n\t\t\t});\n\n\t\t\tlog(\"upstream response status:\", response.status);\n\n\t\t\tif (!response.ok) {\n\t\t\t\tconst errorBody = await response.text().catch(() => \"\");\n\t\t\t\tlog(\"← returning\", response.status, \"upstream error:\", errorBody);\n\t\t\t\treturn new Response(errorBody, {\n\t\t\t\t\tstatus: response.status,\n\t\t\t\t\theaders: {\n\t\t\t\t\t\t\"Content-Type\":\n\t\t\t\t\t\t\tresponse.headers.get(\"Content-Type\") ?? \"application/json\",\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t}\n\n\t\t\t// 5. Stream the response back\n\t\t\tconst headers = new Headers({\n\t\t\t\t\"Content-Type\":\n\t\t\t\t\tresponse.headers.get(\"Content-Type\") ?? \"text/event-stream\",\n\t\t\t});\n\t\t\tconst upstreamSessionId = response.headers.get(\"x-session-id\");\n\t\t\tif (upstreamSessionId) {\n\t\t\t\theaders.set(\"x-session-id\", upstreamSessionId);\n\t\t\t}\n\n\t\t\tlog(\n\t\t\t\t\"← streaming response\",\n\t\t\t\tresponse.status,\n\t\t\t\t\"body null?\",\n\t\t\t\tresponse.body === null,\n\t\t\t);\n\t\t\treturn new Response(response.body, {\n\t\t\t\tstatus: response.status,\n\t\t\t\theaders,\n\t\t\t});\n\t\t} catch (error) {\n\t\t\tconsole.error(\"[waniwani:chat] handler error:\", error);\n\t\t\tconst message =\n\t\t\t\terror instanceof Error ? error.message : \"Unknown error occurred\";\n\t\t\tconst status = error instanceof WaniWaniError ? error.status : 500;\n\t\t\tlog(\"← returning\", status, \"from caught error\");\n\t\t\treturn Response.json({ error: message }, { status });\n\t\t}\n\t};\n}\n","// Waniwani SDK - Errors\n\nexport class WaniWaniError extends Error {\n\tconstructor(\n\t\tmessage: string,\n\t\tpublic status: number,\n\t) {\n\t\tsuper(message);\n\t\tthis.name = \"WaniWaniError\";\n\t}\n}\n","// Geo — Extract location metadata from platform request headers\n\n/**\n * Server-side geolocation extracted from platform headers (Vercel, Cloudflare).\n * All fields are optional — in local dev, no headers are present.\n */\nexport interface GeoLocation {\n\tcity?: string;\n\tcountry?: string;\n\tcountryRegion?: string;\n\tlatitude?: string;\n\tlongitude?: string;\n\ttimezone?: string;\n\tip?: string;\n}\n\n/**\n * Extracts geolocation from server-side request headers.\n *\n * Supports Vercel (`x-vercel-ip-*`), Cloudflare (`cf-ip*`, `cf-connecting-ip`),\n * and generic IP headers (`x-real-ip`, `x-forwarded-for`).\n *\n * Returns a `GeoLocation` with all fields optional (empty object in local dev).\n */\nexport function extractGeoFromHeaders(request: Request): GeoLocation {\n\tconst h = request.headers;\n\n\t// Vercel URL-encodes city names (e.g. \"S%C3%A3o%20Paulo\")\n\tconst rawCity = h.get(\"x-vercel-ip-city\") ?? h.get(\"cf-ipcity\") ?? undefined;\n\tconst city = rawCity ? safeDecodeURI(rawCity) : undefined;\n\n\tconst country =\n\t\th.get(\"x-vercel-ip-country\") ?? h.get(\"cf-ipcountry\") ?? undefined;\n\tconst countryRegion = h.get(\"x-vercel-ip-country-region\") ?? undefined;\n\tconst latitude =\n\t\th.get(\"x-vercel-ip-latitude\") ?? h.get(\"cf-iplatitude\") ?? undefined;\n\tconst longitude =\n\t\th.get(\"x-vercel-ip-longitude\") ?? h.get(\"cf-iplongitude\") ?? undefined;\n\tconst timezone =\n\t\th.get(\"x-vercel-ip-timezone\") ?? h.get(\"cf-iptimezone\") ?? undefined;\n\tconst ip =\n\t\th.get(\"x-real-ip\") ??\n\t\th.get(\"x-forwarded-for\")?.split(\",\")[0]?.trim() ??\n\t\th.get(\"cf-connecting-ip\") ??\n\t\tundefined;\n\n\treturn { city, country, countryRegion, latitude, longitude, timezone, ip };\n}\n\nfunction safeDecodeURI(value: string): string {\n\ttry {\n\t\treturn decodeURIComponent(value);\n\t} catch {\n\t\treturn value;\n\t}\n}\n","import {\n\tformatModelContextForPrompt,\n\thasModelContext,\n\ttype ModelContextUpdate,\n} from \"../../../shared/model-context\";\n\nexport function applyModelContextToSystemPrompt(\n\tsystemPrompt: string | undefined,\n\tmodelContext: ModelContextUpdate | undefined,\n): string | undefined {\n\tif (!hasModelContext(modelContext)) {\n\t\treturn systemPrompt;\n\t}\n\n\tconst widgetContext = formatModelContextForPrompt(modelContext);\n\tif (!widgetContext) {\n\t\treturn systemPrompt;\n\t}\n\n\treturn [systemPrompt, widgetContext].filter(Boolean).join(\"\\n\\n\");\n}\n","// Handle Resource - Serves MCP resource content (HTML widgets)\n\nimport { WaniWaniError } from \"../../../error\";\nimport { createLogger } from \"../../../utils/logger.js\";\nimport type { ResourceHandlerDeps } from \"./@types\";\n\nexport function createResourceHandler(deps: ResourceHandlerDeps) {\n\tconst { mcpServerUrl: mcpServerUrlOverride, resolveConfig, debug } = deps;\n\n\tconst log = createLogger(\"resource\", debug);\n\n\treturn async function handleResource(url: URL): Promise<Response> {\n\t\tlog(\"→ GET\", url.toString());\n\t\ttry {\n\t\t\tconst uri = url.searchParams.get(\"uri\");\n\t\t\tlog(\"uri:\", uri ?? \"(missing)\");\n\n\t\t\tif (!uri) {\n\t\t\t\tlog(\"← 400 missing uri\");\n\t\t\t\treturn Response.json(\n\t\t\t\t\t{ error: \"Missing uri query parameter\" },\n\t\t\t\t\t{ status: 400 },\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tconst mcpServerUrl =\n\t\t\t\tmcpServerUrlOverride ?? (await resolveConfig()).mcpServerUrl;\n\t\t\tlog(\"mcpServerUrl:\", mcpServerUrl);\n\n\t\t\t// Dynamic imports — these are optional peer dependencies\n\t\t\tlet createMCPClient: typeof import(\"@ai-sdk/mcp\")[\"createMCPClient\"];\n\t\t\tlet StreamableHTTPClientTransport: typeof import(\"@modelcontextprotocol/sdk/client/streamableHttp.js\")[\"StreamableHTTPClientTransport\"];\n\n\t\t\ttry {\n\t\t\t\t[{ createMCPClient }, { StreamableHTTPClientTransport }] =\n\t\t\t\t\tawait Promise.all([\n\t\t\t\t\t\timport(\"@ai-sdk/mcp\"),\n\t\t\t\t\t\timport(\"@modelcontextprotocol/sdk/client/streamableHttp.js\"),\n\t\t\t\t\t]);\n\t\t\t\tlog(\"MCP deps loaded\");\n\t\t\t} catch (importError) {\n\t\t\t\tconsole.error(\n\t\t\t\t\t\"[waniwani:resource] MCP deps import failed:\",\n\t\t\t\t\timportError,\n\t\t\t\t);\n\t\t\t\treturn Response.json(\n\t\t\t\t\t{\n\t\t\t\t\t\terror:\n\t\t\t\t\t\t\t\"MCP resource handler requires @ai-sdk/mcp and @modelcontextprotocol/sdk. Install them to enable resource serving.\",\n\t\t\t\t\t},\n\t\t\t\t\t{ status: 501 },\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tlog(\"creating MCP client for\", mcpServerUrl);\n\t\t\tconst mcp = await createMCPClient({\n\t\t\t\ttransport: new StreamableHTTPClientTransport(new URL(mcpServerUrl)),\n\t\t\t});\n\n\t\t\ttry {\n\t\t\t\tlog(\"reading resource:\", uri);\n\t\t\t\tconst result = await mcp.readResource({ uri });\n\t\t\t\tlog(\"resource contents count:\", result.contents.length);\n\n\t\t\t\tconst content = result.contents[0];\n\t\t\t\tif (!content) {\n\t\t\t\t\tlog(\"← 404 resource not found\");\n\t\t\t\t\treturn Response.json(\n\t\t\t\t\t\t{ error: \"Resource not found\" },\n\t\t\t\t\t\t{ status: 404 },\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tlet html: string | undefined;\n\t\t\t\tif (\"text\" in content && typeof content.text === \"string\") {\n\t\t\t\t\thtml = content.text;\n\t\t\t\t} else if (\"blob\" in content && typeof content.blob === \"string\") {\n\t\t\t\t\thtml = atob(content.blob);\n\t\t\t\t}\n\n\t\t\t\tif (!html) {\n\t\t\t\t\tlog(\"← 404 resource has no content, keys:\", Object.keys(content));\n\t\t\t\t\treturn Response.json(\n\t\t\t\t\t\t{ error: \"Resource has no content\" },\n\t\t\t\t\t\t{ status: 404 },\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tlog(\"← 200 HTML length:\", html.length);\n\t\t\t\treturn new Response(html, {\n\t\t\t\t\theaders: {\n\t\t\t\t\t\t\"Content-Type\": \"text/html\",\n\t\t\t\t\t\t\"Cache-Control\": \"private, max-age=300\",\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t} finally {\n\t\t\t\tawait mcp.close();\n\t\t\t\tlog(\"MCP client closed\");\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tconsole.error(\"[waniwani:resource] handler error:\", error);\n\t\t\tconst message =\n\t\t\t\terror instanceof Error ? error.message : \"Unknown error occurred\";\n\t\t\tconst status = error instanceof WaniWaniError ? error.status : 500;\n\t\t\tlog(\"← returning\", status, \"from caught error\");\n\t\t\treturn Response.json({ error: message }, { status });\n\t\t}\n\t};\n}\n","// Handle Tool - Calls MCP server tools directly and returns JSON results\n\nimport { WaniWaniError } from \"../../../error\";\nimport { createLogger } from \"../../../utils/logger.js\";\nimport type { ResourceHandlerDeps } from \"./@types\";\n\nexport function createToolHandler(deps: ResourceHandlerDeps) {\n\tconst {\n\t\tmcpServerUrl: mcpServerUrlOverride,\n\t\tresolveConfig,\n\t\tdebug,\n\t\tsource,\n\t} = deps;\n\n\tconst log = createLogger(\"tool\", debug);\n\n\treturn async function handleTool(request: Request): Promise<Response> {\n\t\tlog(\"→ POST\", request.url);\n\t\ttry {\n\t\t\tconst body = await request.json();\n\t\t\tconst { name, arguments: args } = body as {\n\t\t\t\tname: string;\n\t\t\t\targuments: Record<string, unknown>;\n\t\t\t};\n\t\t\tconst requestSessionId = request.headers.get(\"x-session-id\")?.trim();\n\n\t\t\tif (!name || typeof name !== \"string\") {\n\t\t\t\tlog(\"← 400 missing tool name\");\n\t\t\t\treturn Response.json({ error: \"Missing tool name\" }, { status: 400 });\n\t\t\t}\n\n\t\t\tlog(\n\t\t\t\t\"tool:\",\n\t\t\t\tname,\n\t\t\t\t\"args:\",\n\t\t\t\tJSON.stringify(args),\n\t\t\t\t\"sessionId:\",\n\t\t\t\trequestSessionId || \"(none)\",\n\t\t\t);\n\n\t\t\tconst mcpServerUrl =\n\t\t\t\tmcpServerUrlOverride ?? (await resolveConfig()).mcpServerUrl;\n\t\t\tlog(\"mcpServerUrl:\", mcpServerUrl);\n\n\t\t\t// Dynamic imports — these are optional peer dependencies\n\t\t\tlet Client: typeof import(\"@modelcontextprotocol/sdk/client/index.js\")[\"Client\"];\n\t\t\tlet StreamableHTTPClientTransport: typeof import(\"@modelcontextprotocol/sdk/client/streamableHttp.js\")[\"StreamableHTTPClientTransport\"];\n\n\t\t\ttry {\n\t\t\t\t[{ Client }, { StreamableHTTPClientTransport }] = await Promise.all([\n\t\t\t\t\timport(\"@modelcontextprotocol/sdk/client/index.js\"),\n\t\t\t\t\timport(\"@modelcontextprotocol/sdk/client/streamableHttp.js\"),\n\t\t\t\t]);\n\t\t\t\tlog(\"MCP deps loaded\");\n\t\t\t} catch (importError) {\n\t\t\t\tconsole.error(\"[waniwani:tool] MCP deps import failed:\", importError);\n\t\t\t\treturn Response.json(\n\t\t\t\t\t{\n\t\t\t\t\t\terror:\n\t\t\t\t\t\t\t\"MCP tool handler requires @modelcontextprotocol/sdk. Install it to enable tool calls.\",\n\t\t\t\t\t},\n\t\t\t\t\t{ status: 501 },\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tlog(\"creating MCP client for\", mcpServerUrl);\n\t\t\tconst transport = new StreamableHTTPClientTransport(\n\t\t\t\tnew URL(mcpServerUrl),\n\t\t\t);\n\t\t\tconst client = new Client({\n\t\t\t\tname: \"waniwani-tool-caller\",\n\t\t\t\tversion: \"1.0.0\",\n\t\t\t});\n\t\t\tawait client.connect(transport);\n\n\t\t\ttry {\n\t\t\t\tlog(\"calling tool:\", name);\n\t\t\t\tconst _meta: Record<string, unknown> = {};\n\t\t\t\tif (requestSessionId) {\n\t\t\t\t\t_meta[\"waniwani/sessionId\"] = requestSessionId;\n\t\t\t\t}\n\t\t\t\tif (source) {\n\t\t\t\t\t_meta[\"waniwani/source\"] = source;\n\t\t\t\t}\n\t\t\t\tconst result = await client.callTool({\n\t\t\t\t\tname,\n\t\t\t\t\targuments: args ?? {},\n\t\t\t\t\t...(Object.keys(_meta).length > 0 ? { _meta } : {}),\n\t\t\t\t} as {\n\t\t\t\t\tname: string;\n\t\t\t\t\targuments: Record<string, unknown>;\n\t\t\t\t\t_meta?: Record<string, unknown>;\n\t\t\t\t});\n\t\t\t\tlog(\"tool result received\");\n\n\t\t\t\treturn Response.json({\n\t\t\t\t\tcontent: result.content,\n\t\t\t\t\tstructuredContent: result.structuredContent,\n\t\t\t\t\t_meta: result._meta,\n\t\t\t\t\tisError: result.isError,\n\t\t\t\t});\n\t\t\t} finally {\n\t\t\t\tawait client.close();\n\t\t\t\tlog(\"MCP client closed\");\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tconsole.error(\"[waniwani:tool] handler error:\", error);\n\t\t\tconst message =\n\t\t\t\terror instanceof Error ? error.message : \"Unknown error occurred\";\n\t\t\tconst status = error instanceof WaniWaniError ? error.status : 500;\n\t\t\tlog(\"← returning\", status, \"from caught error\");\n\t\t\treturn Response.json({ error: message }, { status });\n\t\t}\n\t};\n}\n","// Handle Tools List - Returns the MCP server's tool catalog including per-tool\n// `_meta`, so the chat UI can cache it in the browser and resolve widget\n// binding (`_meta.ui.resourceUri`, `_meta[\"openai/outputTemplate\"]`, etc.) by\n// tool name at render time.\n//\n// This mirrors the pattern used by MCPJam's `/api/web/tools/list` route and\n// matches the MCP Apps spec (\"hosts identify UI-enabled tools through\n// `_meta.ui.resourceUri` metadata on the tool definition\"). Kept as an\n// ephemeral operation — one MCP client per HTTP request — so it works on\n// serverless platforms without sticky sessions.\n\nimport { WaniWaniError } from \"../../../error\";\nimport { createLogger } from \"../../../utils/logger.js\";\nimport type { ResourceHandlerDeps } from \"./@types\";\n\n/** Shape returned to the browser. Matches the MCP `tools/list` response. */\nexport interface HandleToolsListResponse {\n\ttools: Array<{\n\t\tname: string;\n\t\ttitle?: string;\n\t\tdescription?: string;\n\t\tinputSchema?: unknown;\n\t\toutputSchema?: unknown;\n\t\tannotations?: unknown;\n\t\t_meta?: Record<string, unknown>;\n\t}>;\n\tnextCursor?: string;\n}\n\nexport function createToolsListHandler(deps: ResourceHandlerDeps) {\n\tconst { mcpServerUrl: mcpServerUrlOverride, resolveConfig, debug } = deps;\n\n\tconst log = createLogger(\"tools-list\", debug);\n\n\treturn async function handleToolsList(): Promise<Response> {\n\t\tlog(\"→ GET tools/list\");\n\t\ttry {\n\t\t\tconst mcpServerUrl =\n\t\t\t\tmcpServerUrlOverride ?? (await resolveConfig()).mcpServerUrl;\n\t\t\tlog(\"mcpServerUrl:\", mcpServerUrl);\n\n\t\t\t// Dynamic imports — these are optional peer dependencies\n\t\t\tlet createMCPClient: typeof import(\"@ai-sdk/mcp\")[\"createMCPClient\"];\n\t\t\tlet StreamableHTTPClientTransport: typeof import(\"@modelcontextprotocol/sdk/client/streamableHttp.js\")[\"StreamableHTTPClientTransport\"];\n\n\t\t\ttry {\n\t\t\t\t[{ createMCPClient }, { StreamableHTTPClientTransport }] =\n\t\t\t\t\tawait Promise.all([\n\t\t\t\t\t\timport(\"@ai-sdk/mcp\"),\n\t\t\t\t\t\timport(\"@modelcontextprotocol/sdk/client/streamableHttp.js\"),\n\t\t\t\t\t]);\n\t\t\t\tlog(\"MCP deps loaded\");\n\t\t\t} catch (importError) {\n\t\t\t\tconsole.error(\n\t\t\t\t\t\"[waniwani:tools-list] MCP deps import failed:\",\n\t\t\t\t\timportError,\n\t\t\t\t);\n\t\t\t\treturn Response.json(\n\t\t\t\t\t{\n\t\t\t\t\t\terror:\n\t\t\t\t\t\t\t\"MCP tools list handler requires @ai-sdk/mcp and @modelcontextprotocol/sdk. Install them to enable tool discovery.\",\n\t\t\t\t\t},\n\t\t\t\t\t{ status: 501 },\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tlog(\"creating MCP client for\", mcpServerUrl);\n\t\t\tconst mcp = await createMCPClient({\n\t\t\t\ttransport: new StreamableHTTPClientTransport(new URL(mcpServerUrl)),\n\t\t\t});\n\n\t\t\ttry {\n\t\t\t\tlog(\"listing tools\");\n\t\t\t\tconst result = await mcp.listTools();\n\t\t\t\tlog(\"tools count:\", result.tools.length);\n\n\t\t\t\tconst response: HandleToolsListResponse = {\n\t\t\t\t\ttools: result.tools.map((tool) => ({\n\t\t\t\t\t\tname: tool.name,\n\t\t\t\t\t\t...(tool.title !== undefined && { title: tool.title }),\n\t\t\t\t\t\t...(tool.description !== undefined && {\n\t\t\t\t\t\t\tdescription: tool.description,\n\t\t\t\t\t\t}),\n\t\t\t\t\t\t...(tool.inputSchema !== undefined && {\n\t\t\t\t\t\t\tinputSchema: tool.inputSchema,\n\t\t\t\t\t\t}),\n\t\t\t\t\t\t...(tool.outputSchema !== undefined && {\n\t\t\t\t\t\t\toutputSchema: tool.outputSchema,\n\t\t\t\t\t\t}),\n\t\t\t\t\t\t...(tool.annotations !== undefined && {\n\t\t\t\t\t\t\tannotations: tool.annotations,\n\t\t\t\t\t\t}),\n\t\t\t\t\t\t...(tool._meta !== undefined && { _meta: tool._meta }),\n\t\t\t\t\t})),\n\t\t\t\t\t...(result.nextCursor !== undefined && {\n\t\t\t\t\t\tnextCursor: result.nextCursor,\n\t\t\t\t\t}),\n\t\t\t\t};\n\n\t\t\t\tlog(\"← 200\");\n\t\t\t\treturn Response.json(response, {\n\t\t\t\t\theaders: {\n\t\t\t\t\t\t// Catalog can be safely cached briefly. Browsers get a fresh\n\t\t\t\t\t\t// copy per ChatCard mount but don't hammer the MCP server\n\t\t\t\t\t\t// when the user refreshes quickly.\n\t\t\t\t\t\t\"Cache-Control\": \"private, max-age=60\",\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t} finally {\n\t\t\t\tawait mcp.close();\n\t\t\t\tlog(\"MCP client closed\");\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tconsole.error(\"[waniwani:tools-list] handler error:\", error);\n\t\t\tconst message =\n\t\t\t\terror instanceof Error ? error.message : \"Unknown error occurred\";\n\t\t\tconst status = error instanceof WaniWaniError ? error.status : 500;\n\t\t\tlog(\"← returning\", status, \"from caught error\");\n\t\t\treturn Response.json({ error: message }, { status });\n\t\t}\n\t};\n}\n","// MCP Config Resolver - Lazy-loads and caches MCP environment config\n\nimport { WaniWaniError } from \"../../../error\";\n\ninterface McpEnvironmentConfig {\n\tmcpServerUrl: string;\n}\n\nconst TTL_MS = 5 * 60 * 1000; // 5 minutes\n\nexport function createMcpConfigResolver(\n\tapiUrl: string,\n\tapiKey: string | undefined,\n) {\n\tlet cached: { config: McpEnvironmentConfig; expiresAt: number } | null = null;\n\tlet inflight: Promise<McpEnvironmentConfig> | null = null;\n\n\treturn async function resolve(): Promise<McpEnvironmentConfig> {\n\t\tif (cached && Date.now() < cached.expiresAt) {\n\t\t\treturn cached.config;\n\t\t}\n\n\t\t// Deduplicate concurrent requests (cold start scenario)\n\t\tif (inflight) {\n\t\t\treturn inflight;\n\t\t}\n\n\t\tinflight = (async () => {\n\t\t\tif (!apiKey) {\n\t\t\t\tthrow new WaniWaniError(\n\t\t\t\t\t\"WANIWANI_API_KEY is required for createChatHandler\",\n\t\t\t\t\t401,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tconst response = await fetch(`${apiUrl}/api/mcp/environments/config`, {\n\t\t\t\tmethod: \"GET\",\n\t\t\t\theaders: {\n\t\t\t\t\tAuthorization: `Bearer ${apiKey}`,\n\t\t\t\t\t\"Content-Type\": \"application/json\",\n\t\t\t\t},\n\t\t\t});\n\n\t\t\tif (!response.ok) {\n\t\t\t\tconst body = await response.text().catch(() => \"\");\n\t\t\t\tthrow new WaniWaniError(\n\t\t\t\t\t`Failed to resolve MCP environment config: ${response.status} ${body}`,\n\t\t\t\t\tresponse.status,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tconst data = (await response.json()) as McpEnvironmentConfig;\n\t\t\tcached = { config: data, expiresAt: Date.now() + TTL_MS };\n\t\t\treturn data;\n\t\t})();\n\n\t\ttry {\n\t\t\treturn await inflight;\n\t\t} finally {\n\t\t\tinflight = null;\n\t\t}\n\t};\n}\n","\"use client\";\n\nimport {\n\tforwardRef,\n\tuseCallback,\n\tuseEffect,\n\tuseImperativeHandle,\n\tuseRef,\n\tuseState,\n} from \"react\";\nimport type {\n\tChatBaseProps,\n\tChatHandle,\n\tChatTheme,\n} from \"../../../chat/web/@types\";\nimport {\n\tConversation,\n\tConversationContent,\n\tConversationScrollButton,\n} from \"../../../chat/web/ai-elements/conversation\";\nimport {\n\tPromptInput,\n\tPromptInputAddAttachments,\n\tPromptInputSubmit,\n\tPromptInputTextarea,\n} from \"../../../chat/web/ai-elements/prompt-input\";\nimport { ChatQueue } from \"../../../chat/web/components/chat-queue\";\nimport { ExportSessionButton } from \"../../../chat/web/components/export-session\";\nimport { MessageList } from \"../../../chat/web/components/message-list\";\nimport { PoweredBy } from \"../../../chat/web/components/powered-by\";\nimport { Suggestions } from \"../../../chat/web/components/suggestions\";\nimport { ThreadMenu } from \"../../../chat/web/components/thread-menu\";\nimport { useCallTool } from \"../../../chat/web/hooks/use-call-tool\";\nimport { useChatEngine } from \"../../../chat/web/hooks/use-chat-engine\";\nimport { useConfig } from \"../../../chat/web/hooks/use-config\";\nimport { useSuggestionRow } from \"../../../chat/web/hooks/use-suggestion-row\";\nimport { useTypingPlaceholder } from \"../../../chat/web/hooks/use-typing-placeholder\";\nimport { buildResourceEndpoint } from \"../../../chat/web/lib/resource-endpoint\";\nimport { cn } from \"../../../chat/web/lib/utils\";\nimport { mergeTheme, themeToCSSProperties } from \"../../../chat/web/theme\";\nimport type { ModelContextUpdate } from \"../../../shared/model-context\";\n\n/** @deprecated Use `WaniwaniChat` (hosted, React) or the `<script>` embed for new code. `ChatCard` is preserved for back-compat only and lives under `@waniwani/sdk/legacy`. */\nexport interface ChatCardProps extends ChatBaseProps {\n\t/** Title shown in the card header. Defaults to \"Assistant\". */\n\ttitle?: string;\n\t/** Subtitle or status text shown under the title. */\n\tsubtitle?: string;\n\t/** Show the status dot in the header. Defaults to true. */\n\tshowStatus?: boolean;\n\t/** Card width. Accepts a pixel number or any CSS value (e.g. \"100%\", \"50vw\"). Defaults to 500. */\n\twidth?: number | string;\n\t/** Card height. Accepts a pixel number or any CSS value (e.g. \"100%\", \"80vh\"). Defaults to 600. */\n\theight?: number | string;\n\t/** Additional class names applied to the root element (e.g. Tailwind classes). */\n\tclassName?: string;\n\t/** Theme overrides. Legacy API; new code should use the `appearance` field on `WaniwaniChat` / `ChatEmbed`. */\n\ttheme?: ChatTheme;\n}\n\n/**\n * @deprecated Use `WaniwaniChat` from `@waniwani/sdk/chat` for new code.\n * `ChatCard` is preserved for back-compat with customer MCPs that pre-date\n * the hosted-tier React component. It is also re-exported from\n * `@waniwani/sdk/chat` for now; that re-export will be removed in a future\n * minor release — import from `@waniwani/sdk/legacy` going forward.\n */\nexport const ChatCard = forwardRef<ChatHandle, ChatCardProps>(\n\tfunction ChatCard(props, ref) {\n\t\tconst {\n\t\t\ttheme: userTheme,\n\t\t\ttitle = \"Assistant\",\n\n\t\t\twidth,\n\t\t\theight,\n\t\t\tclassName,\n\t\t\tallowAttachments = false,\n\t\t\twelcomeMessage,\n\t\t\twelcome,\n\t\t\tplaceholder = \"Ask me anything...\",\n\t\t\ttriggerEvent = \"triggerDemoRequest\",\n\t\t\tapi,\n\t\t\tdebug,\n\t\t\tenableThreadHistory = false,\n\t\t\tshowToolCalls = true,\n\t\t} = props;\n\n\t\tconst effectiveApi = api ?? \"/api/waniwani\";\n\t\tconst effectiveResourceEndpoint = buildResourceEndpoint(\n\t\t\teffectiveApi,\n\t\t\tprops.headers,\n\t\t);\n\n\t\tconst resolvedTheme = mergeTheme(userTheme);\n\t\t// Emit only user-set keys so the stylesheet fallback chains stay live\n\t\t// (e.g. bubble text ← primaryForeground); defaults come from tailwind.css.\n\t\tconst cssVars = themeToCSSProperties(userTheme ?? {});\n\t\t// Legacy heuristic: dark when the background's perceived luminance is low.\n\t\t// New code uses the explicit `appearance.theme` preset instead.\n\t\tconst hex = resolvedTheme.backgroundColor.replace(\"#\", \"\");\n\t\tconst r = parseInt(hex.substring(0, 2), 16);\n\t\tconst g = parseInt(hex.substring(2, 4), 16);\n\t\tconst b = parseInt(hex.substring(4, 6), 16);\n\t\tconst isDark = (r * 299 + g * 587 + b * 114) / 1000 < 128;\n\n\t\tconst config = useConfig(\n\t\t\teffectiveApi,\n\t\t\tprops.headers,\n\t\t\tprops.skipRemoteConfig,\n\t\t);\n\t\tconst effectiveDebug = debug ?? config.debug;\n\n\t\tconst engine = useChatEngine({ ...props, api: effectiveApi });\n\t\tconst handleCallTool = useCallTool({\n\t\t\t...props,\n\t\t\tapi: effectiveApi,\n\t\t\tsessionId: engine.sessionId,\n\t\t});\n\n\t\tconst animatedPlaceholder = useTypingPlaceholder(placeholder, !engine.text);\n\n\t\tconst [isHighlighted, setIsHighlighted] = useState(false);\n\t\tconst [fullscreenToolCallId, setFullscreenToolCallId] = useState<\n\t\t\tstring | null\n\t\t>(null);\n\t\tconst cardRef = useRef<HTMLDivElement>(null);\n\t\tconst highlightTimerRef = useRef<ReturnType<typeof setTimeout>>(undefined);\n\n\t\tconst focusInput = useCallback(() => {\n\t\t\tconst container = cardRef.current;\n\t\t\tif (!container) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcontainer.scrollIntoView({ behavior: \"smooth\", block: \"center\" });\n\t\t\tconst textarea = container.querySelector(\"textarea\");\n\t\t\tif (textarea) {\n\t\t\t\tsetTimeout(() => textarea.focus(), 300);\n\t\t\t}\n\t\t\tsetIsHighlighted(true);\n\t\t\tclearTimeout(highlightTimerRef.current);\n\t\t\thighlightTimerRef.current = setTimeout(\n\t\t\t\t() => setIsHighlighted(false),\n\t\t\t\t2000,\n\t\t\t);\n\t\t}, []);\n\n\t\tconst suggestionsState = useSuggestionRow({\n\t\t\tmessages: engine.messages,\n\t\t\tstatus: engine.status,\n\t\t\tsuggestions: props.suggestions,\n\t\t});\n\n\t\tconst handleWidgetMessage = useCallback(\n\t\t\t(message: {\n\t\t\t\trole: string;\n\t\t\t\tcontent: Array<{ type: string; text?: string }>;\n\t\t\t\tmodelContext?: ModelContextUpdate;\n\t\t\t}) => {\n\t\t\t\tconst text = message.content\n\t\t\t\t\t.map((c) => c.text ?? \"\")\n\t\t\t\t\t.join(\"\")\n\t\t\t\t\t.trim();\n\t\t\t\tif (text) {\n\t\t\t\t\tengine.handleSubmit({\n\t\t\t\t\t\ttext,\n\t\t\t\t\t\tfiles: [],\n\t\t\t\t\t\tmodelContext: message.modelContext,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t},\n\t\t\t[engine.handleSubmit],\n\t\t);\n\n\t\tconst handleSuggestionSelect = useCallback(\n\t\t\t(suggestion: string) => {\n\t\t\t\tsuggestionsState.clear();\n\t\t\t\tengine.handleSubmit({ text: suggestion, files: [] });\n\t\t\t},\n\t\t\t[suggestionsState.clear, engine.handleSubmit],\n\t\t);\n\n\t\tuseImperativeHandle(\n\t\t\tref,\n\t\t\t() => ({\n\t\t\t\tsendMessage: (text: string) => {\n\t\t\t\t\tengine.handleSubmit({ text, files: [] });\n\t\t\t\t\tfocusInput();\n\t\t\t\t},\n\t\t\t\tsendMessageAndWait: (text: string) => engine.sendMessageAndWait(text),\n\t\t\t\treset: engine.reset,\n\t\t\t\tfocus: focusInput,\n\t\t\t\tget messages() {\n\t\t\t\t\treturn engine.messages;\n\t\t\t\t},\n\t\t\t\tget sessionId() {\n\t\t\t\t\treturn engine.sessionId;\n\t\t\t\t},\n\t\t\t}),\n\t\t\t[\n\t\t\t\tengine.handleSubmit,\n\t\t\t\tengine.sendMessageAndWait,\n\t\t\t\tengine.reset,\n\t\t\t\tengine.messages,\n\t\t\t\tengine.sessionId,\n\t\t\t\tfocusInput,\n\t\t\t],\n\t\t);\n\n\t\t// Listen for custom trigger event (e.g. \"triggerDemoRequest\")\n\t\tuseEffect(() => {\n\t\t\tif (!triggerEvent) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst handler = (e: Event) => {\n\t\t\t\tconst detail = (e as CustomEvent).detail;\n\t\t\t\tconst message =\n\t\t\t\t\ttypeof detail?.message === \"string\" ? detail.message : undefined;\n\t\t\t\tif (message) {\n\t\t\t\t\tengine.handleSubmit({ text: message, files: [] });\n\t\t\t\t}\n\t\t\t\tfocusInput();\n\t\t\t};\n\t\t\twindow.addEventListener(triggerEvent, handler);\n\t\t\treturn () => window.removeEventListener(triggerEvent, handler);\n\t\t}, [triggerEvent, engine.handleSubmit, focusInput]);\n\n\t\treturn (\n\t\t\t<div\n\t\t\t\tref={cardRef}\n\t\t\t\tstyle={{ ...cssVars, width, height }}\n\t\t\t\tdata-waniwani-chat=\"\"\n\t\t\t\tdata-waniwani-layout=\"card\"\n\t\t\t\t{...(isDark ? { \"data-waniwani-dark\": \"\" } : {})}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"ww:flex ww:flex-col ww:font-[family-name:var(--ww-font)] ww:text-foreground ww:bg-background ww:rounded-[var(--ww-radius)] ww:overflow-hidden\",\n\t\t\t\t\tisHighlighted &&\n\t\t\t\t\t\t\"ww:ring-2 ww:ring-blue-400/70 ww:ring-offset-2 ww:ring-offset-background\",\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t>\n\t\t\t\t{/* Header */}\n\t\t\t\t<div\n\t\t\t\t\tclassName=\"ww:shrink-0 ww:flex ww:items-center ww:gap-2 ww:px-6 ww:py-3\"\n\t\t\t\t\tstyle={{\n\t\t\t\t\t\tbackgroundColor: resolvedTheme.headerBackgroundColor,\n\t\t\t\t\t\tcolor: resolvedTheme.headerTextColor,\n\t\t\t\t\t}}\n\t\t\t\t>\n\t\t\t\t\t<div className=\"ww:text-sm ww:font-semibold ww:truncate ww:flex-1 ww:min-w-0\">\n\t\t\t\t\t\t{title}\n\t\t\t\t\t</div>\n\t\t\t\t\t<ExportSessionButton\n\t\t\t\t\t\tmessages={engine.messages}\n\t\t\t\t\t\tevalEnabled={config.eval}\n\t\t\t\t\t\tapi={effectiveApi}\n\t\t\t\t\t/>\n\t\t\t\t\t{enableThreadHistory && (\n\t\t\t\t\t\t<ThreadMenu\n\t\t\t\t\t\t\tthreads={engine.threads}\n\t\t\t\t\t\t\tactiveThreadId={engine.activeThreadId}\n\t\t\t\t\t\t\tonNewThread={engine.startNewThread}\n\t\t\t\t\t\t\tonSelectThread={(id) => {\n\t\t\t\t\t\t\t\tvoid engine.switchThread(id);\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\tonDeleteThread={(id) => {\n\t\t\t\t\t\t\t\tvoid engine.deleteThread(id);\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t/>\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\n\t\t\t\t{/* Messages */}\n\t\t\t\t<Conversation className=\"ww:flex-1 ww:min-h-0 ww:bg-background\">\n\t\t\t\t\t<ConversationContent\n\t\t\t\t\t\tscrollClassName={\n\t\t\t\t\t\t\tfullscreenToolCallId\n\t\t\t\t\t\t\t\t? \"ww:!relative ww:!overflow-hidden\"\n\t\t\t\t\t\t\t\t: undefined\n\t\t\t\t\t\t}\n\t\t\t\t\t>\n\t\t\t\t\t\t<MessageList\n\t\t\t\t\t\t\tmessages={engine.messages}\n\t\t\t\t\t\t\tstatus={engine.status}\n\t\t\t\t\t\t\twelcomeMessage={welcomeMessage}\n\t\t\t\t\t\t\twelcome={welcome}\n\t\t\t\t\t\t\tonSuggestionSelect={handleSuggestionSelect}\n\t\t\t\t\t\t\tresourceEndpoint={effectiveResourceEndpoint}\n\t\t\t\t\t\t\tchatSessionId={engine.sessionId}\n\t\t\t\t\t\t\tisDark={isDark}\n\t\t\t\t\t\t\tonFollowUp={handleWidgetMessage}\n\t\t\t\t\t\t\tonCallTool={handleCallTool}\n\t\t\t\t\t\t\tfullscreenToolCallId={fullscreenToolCallId}\n\t\t\t\t\t\t\tdebug={effectiveDebug}\n\t\t\t\t\t\t\tshowToolCalls={showToolCalls}\n\t\t\t\t\t\t\ttoolDefinitions={engine.toolDefinitions}\n\t\t\t\t\t\t\tonWidgetDisplayModeChange={(mode, widget) => {\n\t\t\t\t\t\t\t\tsetFullscreenToolCallId(\n\t\t\t\t\t\t\t\t\tmode === \"fullscreen\" ? widget.toolCallId : null,\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</ConversationContent>\n\t\t\t\t\t<ConversationScrollButton />\n\t\t\t\t</Conversation>\n\n\t\t\t\t{/* Suggestions — hide when fullscreen */}\n\t\t\t\t<div style={fullscreenToolCallId ? { display: \"none\" } : undefined}>\n\t\t\t\t\t<Suggestions\n\t\t\t\t\t\tsuggestions={suggestionsState.suggestions}\n\t\t\t\t\t\tisLoading={suggestionsState.isLoading}\n\t\t\t\t\t\tonSelect={handleSuggestionSelect}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\n\t\t\t\t{/* Queue — hide when fullscreen */}\n\t\t\t\t<div style={fullscreenToolCallId ? { display: \"none\" } : undefined}>\n\t\t\t\t\t<ChatQueue\n\t\t\t\t\t\tqueuedMessages={engine.queuedMessages}\n\t\t\t\t\t\tonRemove={engine.removeQueuedMessage}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\n\t\t\t\t{/* Input — hide when fullscreen */}\n\t\t\t\t<div style={fullscreenToolCallId ? { display: \"none\" } : undefined}>\n\t\t\t\t\t<div className=\"ww:shrink-0 ww:px-4 ww:pb-8 ww:pt-2 ww:bg-background\">\n\t\t\t\t\t\t<div className=\"ww:mx-auto ww:w-full ww:max-w-3xl\">\n\t\t\t\t\t\t\t<PromptInput\n\t\t\t\t\t\t\t\tonSubmit={engine.handleSubmit}\n\t\t\t\t\t\t\t\tglobalDrop={allowAttachments}\n\t\t\t\t\t\t\t\tmultiple={allowAttachments}\n\t\t\t\t\t\t\t\tclassName=\"ww:rounded-2xl ww:border-border ww:bg-input\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<div className=\"ww:flex ww:items-center ww:gap-1 ww:pl-4 ww:pr-3 ww:py-2.5\">\n\t\t\t\t\t\t\t\t\t{allowAttachments && <PromptInputAddAttachments />}\n\t\t\t\t\t\t\t\t\t<PromptInputTextarea\n\t\t\t\t\t\t\t\t\t\tonChange={engine.handleTextChange}\n\t\t\t\t\t\t\t\t\t\tvalue={engine.text}\n\t\t\t\t\t\t\t\t\t\tplaceholder={animatedPlaceholder}\n\t\t\t\t\t\t\t\t\t\tclassName=\"ww:min-h-0 ww:py-1 ww:px-0\"\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t<PromptInputSubmit\n\t\t\t\t\t\t\t\t\t\tstatus={engine.status}\n\t\t\t\t\t\t\t\t\t\tdisabled={engine.queueFull}\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</PromptInput>\n\t\t\t\t\t\t\t<PoweredBy />\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t);\n\t},\n);\n","\"use client\";\n\nimport { ArrowDownIcon } from \"lucide-react\";\nimport type { ComponentProps } from \"react\";\nimport { useCallback } from \"react\";\nimport { StickToBottom, useStickToBottomContext } from \"use-stick-to-bottom\";\nimport { cn } from \"../lib/utils\";\nimport { Button } from \"../ui/button\";\n\nexport type ConversationProps = ComponentProps<typeof StickToBottom>;\n\nexport const Conversation = ({ className, ...props }: ConversationProps) => (\n\t<StickToBottom\n\t\tclassName={cn(\"ww:relative ww:flex-1 ww:overflow-y-hidden\", className)}\n\t\tinitial=\"smooth\"\n\t\tresize=\"smooth\"\n\t\trole=\"log\"\n\t\t{...props}\n\t/>\n);\n\nexport type ConversationContentProps = ComponentProps<\n\ttypeof StickToBottom.Content\n>;\n\nexport const ConversationContent = ({\n\tclassName,\n\t...props\n}: ConversationContentProps) => (\n\t<StickToBottom.Content\n\t\tclassName={cn(\n\t\t\t\"ww:flex ww:flex-col ww:gap-6 ww:px-4 ww:py-6 ww:mx-auto ww:w-full ww:max-w-3xl\",\n\t\t\tclassName,\n\t\t)}\n\t\t{...props}\n\t/>\n);\n\nexport type ConversationScrollButtonProps = ComponentProps<typeof Button>;\n\nexport const ConversationScrollButton = ({\n\tclassName,\n\t...props\n}: ConversationScrollButtonProps) => {\n\tconst { isAtBottom, scrollToBottom } = useStickToBottomContext();\n\n\tconst handleScrollToBottom = useCallback(() => {\n\t\tscrollToBottom();\n\t}, [scrollToBottom]);\n\n\treturn (\n\t\t!isAtBottom && (\n\t\t\t<Button\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"ww:absolute ww:bottom-4 ww:left-[50%] ww:translate-x-[-50%] ww:rounded-full\",\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t\tonClick={handleScrollToBottom}\n\t\t\t\tsize=\"icon\"\n\t\t\t\tvariant=\"outline\"\n\t\t\t\t{...props}\n\t\t\t>\n\t\t\t\t<ArrowDownIcon className=\"ww:size-4\" />\n\t\t\t</Button>\n\t\t)\n\t);\n};\n","/**\n * @license lucide-react v0.563.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport * as index from './icons/index.js';\nexport { index as icons };\nexport { default as Fingerprint, default as FingerprintIcon, default as FingerprintPattern, default as FingerprintPatternIcon, default as LucideFingerprint, default as LucideFingerprintPattern } from './icons/fingerprint-pattern.js';\nexport { default as AlarmCheck, default as AlarmCheckIcon, default as AlarmClockCheck, default as AlarmClockCheckIcon, default as LucideAlarmCheck, default as LucideAlarmClockCheck } from './icons/alarm-clock-check.js';\nexport { default as AlarmClockMinus, default as AlarmClockMinusIcon, default as AlarmMinus, default as AlarmMinusIcon, default as LucideAlarmClockMinus, default as LucideAlarmMinus } from './icons/alarm-clock-minus.js';\nexport { default as AlarmClockPlus, default as AlarmClockPlusIcon, default as AlarmPlus, default as AlarmPlusIcon, default as LucideAlarmClockPlus, default as LucideAlarmPlus } from './icons/alarm-clock-plus.js';\nexport { default as ArrowDownAZ, default as ArrowDownAZIcon, default as ArrowDownAz, default as ArrowDownAzIcon, default as LucideArrowDownAZ, default as LucideArrowDownAz } from './icons/arrow-down-a-z.js';\nexport { default as ArrowDownWideNarrow, default as ArrowDownWideNarrowIcon, default as LucideArrowDownWideNarrow, default as LucideSortDesc, default as SortDesc, default as SortDescIcon } from './icons/arrow-down-wide-narrow.js';\nexport { default as ArrowDownZA, default as ArrowDownZAIcon, default as ArrowDownZa, default as ArrowDownZaIcon, default as LucideArrowDownZA, default as LucideArrowDownZa } from './icons/arrow-down-z-a.js';\nexport { default as ArrowUpAZ, default as ArrowUpAZIcon, default as ArrowUpAz, default as ArrowUpAzIcon, default as LucideArrowUpAZ, default as LucideArrowUpAz } from './icons/arrow-up-a-z.js';\nexport { default as ArrowUpNarrowWide, default as ArrowUpNarrowWideIcon, default as LucideArrowUpNarrowWide, default as LucideSortAsc, default as SortAsc, default as SortAscIcon } from './icons/arrow-up-narrow-wide.js';\nexport { default as ArrowUpZA, default as ArrowUpZAIcon, default as ArrowUpZa, default as ArrowUpZaIcon, default as LucideArrowUpZA, default as LucideArrowUpZa } from './icons/arrow-up-z-a.js';\nexport { default as Axis3D, default as Axis3DIcon, default as Axis3d, default as Axis3dIcon, default as LucideAxis3D, default as LucideAxis3d } from './icons/axis-3d.js';\nexport { default as BadgeCheck, default as BadgeCheckIcon, default as LucideBadgeCheck, default as LucideVerified, default as Verified, default as VerifiedIcon } from './icons/badge-check.js';\nexport { default as BadgeHelp, default as BadgeHelpIcon, default as BadgeQuestionMark, default as BadgeQuestionMarkIcon, default as LucideBadgeHelp, default as LucideBadgeQuestionMark } from './icons/badge-question-mark.js';\nexport { default as BetweenHorizonalEnd, default as BetweenHorizonalEndIcon, default as BetweenHorizontalEnd, default as BetweenHorizontalEndIcon, default as LucideBetweenHorizonalEnd, default as LucideBetweenHorizontalEnd } from './icons/between-horizontal-end.js';\nexport { default as BetweenHorizonalStart, default as BetweenHorizonalStartIcon, default as BetweenHorizontalStart, default as BetweenHorizontalStartIcon, default as LucideBetweenHorizonalStart, default as LucideBetweenHorizontalStart } from './icons/between-horizontal-start.js';\nexport { default as BookDashed, default as BookDashedIcon, default as BookTemplate, default as BookTemplateIcon, default as LucideBookDashed, default as LucideBookTemplate } from './icons/book-dashed.js';\nexport { default as Braces, default as BracesIcon, default as CurlyBraces, default as CurlyBracesIcon, default as LucideBraces, default as LucideCurlyBraces } from './icons/braces.js';\nexport { default as Captions, default as CaptionsIcon, default as LucideCaptions, default as LucideSubtitles, default as Subtitles, default as SubtitlesIcon } from './icons/captions.js';\nexport { default as AreaChart, default as AreaChartIcon, default as ChartArea, default as ChartAreaIcon, default as LucideAreaChart, default as LucideChartArea } from './icons/chart-area.js';\nexport { default as BarChartHorizontalBig, default as BarChartHorizontalBigIcon, default as ChartBarBig, default as ChartBarBigIcon, default as LucideBarChartHorizontalBig, default as LucideChartBarBig } from './icons/chart-bar-big.js';\nexport { default as BarChartHorizontal, default as BarChartHorizontalIcon, default as ChartBar, default as ChartBarIcon, default as LucideBarChartHorizontal, default as LucideChartBar } from './icons/chart-bar.js';\nexport { default as BarChartBig, default as BarChartBigIcon, default as ChartColumnBig, default as ChartColumnBigIcon, default as LucideBarChartBig, default as LucideChartColumnBig } from './icons/chart-column-big.js';\nexport { default as CandlestickChart, default as CandlestickChartIcon, default as ChartCandlestick, default as ChartCandlestickIcon, default as LucideCandlestickChart, default as LucideChartCandlestick } from './icons/chart-candlestick.js';\nexport { default as BarChart4, default as BarChart4Icon, default as ChartColumnIncreasing, default as ChartColumnIncreasingIcon, default as LucideBarChart4, default as LucideChartColumnIncreasing } from './icons/chart-column-increasing.js';\nexport { default as BarChart3, default as BarChart3Icon, default as ChartColumn, default as ChartColumnIcon, default as LucideBarChart3, default as LucideChartColumn } from './icons/chart-column.js';\nexport { default as ChartLine, default as ChartLineIcon, default as LineChart, default as LineChartIcon, default as LucideChartLine, default as LucideLineChart } from './icons/chart-line.js';\nexport { default as BarChart, default as BarChartIcon, default as ChartNoAxesColumnIncreasing, default as ChartNoAxesColumnIncreasingIcon, default as LucideBarChart, default as LucideChartNoAxesColumnIncreasing } from './icons/chart-no-axes-column-increasing.js';\nexport { default as BarChart2, default as BarChart2Icon, default as ChartNoAxesColumn, default as ChartNoAxesColumnIcon, default as LucideBarChart2, default as LucideChartNoAxesColumn } from './icons/chart-no-axes-column.js';\nexport { default as ChartNoAxesGantt, default as ChartNoAxesGanttIcon, default as GanttChart, default as GanttChartIcon, default as LucideChartNoAxesGantt, default as LucideGanttChart } from './icons/chart-no-axes-gantt.js';\nexport { default as ChartPie, default as ChartPieIcon, default as LucideChartPie, default as LucidePieChart, default as PieChart, default as PieChartIcon } from './icons/chart-pie.js';\nexport { default as ChartScatter, default as ChartScatterIcon, default as LucideChartScatter, default as LucideScatterChart, default as ScatterChart, default as ScatterChartIcon } from './icons/chart-scatter.js';\nexport { default as Chrome, default as ChromeIcon, default as Chromium, default as ChromiumIcon, default as LucideChrome, default as LucideChromium } from './icons/chromium.js';\nexport { default as AlertCircle, default as AlertCircleIcon, default as CircleAlert, default as CircleAlertIcon, default as LucideAlertCircle, default as LucideCircleAlert } from './icons/circle-alert.js';\nexport { default as ArrowDownCircle, default as ArrowDownCircleIcon, default as CircleArrowDown, default as CircleArrowDownIcon, default as LucideArrowDownCircle, default as LucideCircleArrowDown } from './icons/circle-arrow-down.js';\nexport { default as ArrowLeftCircle, default as ArrowLeftCircleIcon, default as CircleArrowLeft, default as CircleArrowLeftIcon, default as LucideArrowLeftCircle, default as LucideCircleArrowLeft } from './icons/circle-arrow-left.js';\nexport { default as ArrowDownLeftFromCircle, default as ArrowDownLeftFromCircleIcon, default as CircleArrowOutDownLeft, default as CircleArrowOutDownLeftIcon, default as LucideArrowDownLeftFromCircle, default as LucideCircleArrowOutDownLeft } from './icons/circle-arrow-out-down-left.js';\nexport { default as ArrowDownRightFromCircle, default as ArrowDownRightFromCircleIcon, default as CircleArrowOutDownRight, default as CircleArrowOutDownRightIcon, default as LucideArrowDownRightFromCircle, default as LucideCircleArrowOutDownRight } from './icons/circle-arrow-out-down-right.js';\nexport { default as ArrowUpLeftFromCircle, default as ArrowUpLeftFromCircleIcon, default as CircleArrowOutUpLeft, default as CircleArrowOutUpLeftIcon, default as LucideArrowUpLeftFromCircle, default as LucideCircleArrowOutUpLeft } from './icons/circle-arrow-out-up-left.js';\nexport { default as ArrowUpRightFromCircle, default as ArrowUpRightFromCircleIcon, default as CircleArrowOutUpRight, default as CircleArrowOutUpRightIcon, default as LucideArrowUpRightFromCircle, default as LucideCircleArrowOutUpRight } from './icons/circle-arrow-out-up-right.js';\nexport { default as ArrowRightCircle, default as ArrowRightCircleIcon, default as CircleArrowRight, default as CircleArrowRightIcon, default as LucideArrowRightCircle, default as LucideCircleArrowRight } from './icons/circle-arrow-right.js';\nexport { default as ArrowUpCircle, default as ArrowUpCircleIcon, default as CircleArrowUp, default as CircleArrowUpIcon, default as LucideArrowUpCircle, default as LucideCircleArrowUp } from './icons/circle-arrow-up.js';\nexport { default as CheckCircle, default as CheckCircleIcon, default as CircleCheckBig, default as CircleCheckBigIcon, default as LucideCheckCircle, default as LucideCircleCheckBig } from './icons/circle-check-big.js';\nexport { default as CheckCircle2, default as CheckCircle2Icon, default as CircleCheck, default as CircleCheckIcon, default as LucideCheckCircle2, default as LucideCircleCheck } from './icons/circle-check.js';\nexport { default as ChevronDownCircle, default as ChevronDownCircleIcon, default as CircleChevronDown, default as CircleChevronDownIcon, default as LucideChevronDownCircle, default as LucideCircleChevronDown } from './icons/circle-chevron-down.js';\nexport { default as ChevronLeftCircle, default as ChevronLeftCircleIcon, default as CircleChevronLeft, default as CircleChevronLeftIcon, default as LucideChevronLeftCircle, default as LucideCircleChevronLeft } from './icons/circle-chevron-left.js';\nexport { default as ChevronRightCircle, default as ChevronRightCircleIcon, default as CircleChevronRight, default as CircleChevronRightIcon, default as LucideChevronRightCircle, default as LucideCircleChevronRight } from './icons/circle-chevron-right.js';\nexport { default as ChevronUpCircle, default as ChevronUpCircleIcon, default as CircleChevronUp, default as CircleChevronUpIcon, default as LucideChevronUpCircle, default as LucideCircleChevronUp } from './icons/circle-chevron-up.js';\nexport { default as CircleDivide, default as CircleDivideIcon, default as DivideCircle, default as DivideCircleIcon, default as LucideCircleDivide, default as LucideDivideCircle } from './icons/circle-divide.js';\nexport { default as CircleMinus, default as CircleMinusIcon, default as LucideCircleMinus, default as LucideMinusCircle, default as MinusCircle, default as MinusCircleIcon } from './icons/circle-minus.js';\nexport { default as CircleParkingOff, default as CircleParkingOffIcon, default as LucideCircleParkingOff, default as LucideParkingCircleOff, default as ParkingCircleOff, default as ParkingCircleOffIcon } from './icons/circle-parking-off.js';\nexport { default as CircleParking, default as CircleParkingIcon, default as LucideCircleParking, default as LucideParkingCircle, default as ParkingCircle, default as ParkingCircleIcon } from './icons/circle-parking.js';\nexport { default as CircleGauge, default as CircleGaugeIcon, default as GaugeCircle, default as GaugeCircleIcon, default as LucideCircleGauge, default as LucideGaugeCircle } from './icons/circle-gauge.js';\nexport { default as CirclePause, default as CirclePauseIcon, default as LucideCirclePause, default as LucidePauseCircle, default as PauseCircle, default as PauseCircleIcon } from './icons/circle-pause.js';\nexport { default as CirclePercent, default as CirclePercentIcon, default as LucideCirclePercent, default as LucidePercentCircle, default as PercentCircle, default as PercentCircleIcon } from './icons/circle-percent.js';\nexport { default as CirclePlay, default as CirclePlayIcon, default as LucideCirclePlay, default as LucidePlayCircle, default as PlayCircle, default as PlayCircleIcon } from './icons/circle-play.js';\nexport { default as CirclePower, default as CirclePowerIcon, default as LucideCirclePower, default as LucidePowerCircle, default as PowerCircle, default as PowerCircleIcon } from './icons/circle-power.js';\nexport { default as CirclePlus, default as CirclePlusIcon, default as LucideCirclePlus, default as LucidePlusCircle, default as PlusCircle, default as PlusCircleIcon } from './icons/circle-plus.js';\nexport { default as CircleHelp, default as CircleHelpIcon, default as CircleQuestionMark, default as CircleQuestionMarkIcon, default as HelpCircle, default as HelpCircleIcon, default as LucideCircleHelp, default as LucideCircleQuestionMark, default as LucideHelpCircle } from './icons/circle-question-mark.js';\nexport { default as CircleSlash2, default as CircleSlash2Icon, default as CircleSlashed, default as CircleSlashedIcon, default as LucideCircleSlash2, default as LucideCircleSlashed } from './icons/circle-slash-2.js';\nexport { default as CircleStop, default as CircleStopIcon, default as LucideCircleStop, default as LucideStopCircle, default as StopCircle, default as StopCircleIcon } from './icons/circle-stop.js';\nexport { default as CircleUserRound, default as CircleUserRoundIcon, default as LucideCircleUserRound, default as LucideUserCircle2, default as UserCircle2, default as UserCircle2Icon } from './icons/circle-user-round.js';\nexport { default as CircleUser, default as CircleUserIcon, default as LucideCircleUser, default as LucideUserCircle, default as UserCircle, default as UserCircleIcon } from './icons/circle-user.js';\nexport { default as CircleX, default as CircleXIcon, default as LucideCircleX, default as LucideXCircle, default as XCircle, default as XCircleIcon } from './icons/circle-x.js';\nexport { default as ClipboardPenLine, default as ClipboardPenLineIcon, default as ClipboardSignature, default as ClipboardSignatureIcon, default as LucideClipboardPenLine, default as LucideClipboardSignature } from './icons/clipboard-pen-line.js';\nexport { default as ClipboardEdit, default as ClipboardEditIcon, default as ClipboardPen, default as ClipboardPenIcon, default as LucideClipboardEdit, default as LucideClipboardPen } from './icons/clipboard-pen.js';\nexport { default as CloudDownload, default as CloudDownloadIcon, default as DownloadCloud, default as DownloadCloudIcon, default as LucideCloudDownload, default as LucideDownloadCloud } from './icons/cloud-download.js';\nexport { default as CloudUpload, default as CloudUploadIcon, default as LucideCloudUpload, default as LucideUploadCloud, default as UploadCloud, default as UploadCloudIcon } from './icons/cloud-upload.js';\nexport { default as Code2, default as Code2Icon, default as CodeXml, default as CodeXmlIcon, default as LucideCode2, default as LucideCodeXml } from './icons/code-xml.js';\nexport { default as Columns, default as Columns2, default as Columns2Icon, default as ColumnsIcon, default as LucideColumns, default as LucideColumns2 } from './icons/columns-2.js';\nexport { default as Columns3Cog, default as Columns3CogIcon, default as ColumnsSettings, default as ColumnsSettingsIcon, default as LucideColumns3Cog, default as LucideColumnsSettings, default as LucideTableConfig, default as TableConfig, default as TableConfigIcon } from './icons/columns-3-cog.js';\nexport { default as Columns3, default as Columns3Icon, default as LucideColumns3, default as LucidePanelsLeftRight, default as PanelsLeftRight, default as PanelsLeftRightIcon } from './icons/columns-3.js';\nexport { default as Contact2, default as Contact2Icon, default as ContactRound, default as ContactRoundIcon, default as LucideContact2, default as LucideContactRound } from './icons/contact-round.js';\nexport { default as DiamondPercent, default as DiamondPercentIcon, default as LucideDiamondPercent, default as LucidePercentDiamond, default as PercentDiamond, default as PercentDiamondIcon } from './icons/diamond-percent.js';\nexport { default as Earth, default as EarthIcon, default as Globe2, default as Globe2Icon, default as LucideEarth, default as LucideGlobe2 } from './icons/earth.js';\nexport { default as EllipsisVertical, default as EllipsisVerticalIcon, default as LucideEllipsisVertical, default as LucideMoreVertical, default as MoreVertical, default as MoreVerticalIcon } from './icons/ellipsis-vertical.js';\nexport { default as Ellipsis, default as EllipsisIcon, default as LucideEllipsis, default as LucideMoreHorizontal, default as MoreHorizontal, default as MoreHorizontalIcon } from './icons/ellipsis.js';\nexport { default as FileAxis3D, default as FileAxis3DIcon, default as FileAxis3d, default as FileAxis3dIcon, default as LucideFileAxis3D, default as LucideFileAxis3d } from './icons/file-axis-3d.js';\nexport { default as FileBadge, default as FileBadge2, default as FileBadge2Icon, default as FileBadgeIcon, default as LucideFileBadge, default as LucideFileBadge2 } from './icons/file-badge.js';\nexport { default as FileBracesCorner, default as FileBracesCornerIcon, default as FileJson2, default as FileJson2Icon, default as LucideFileBracesCorner, default as LucideFileJson2 } from './icons/file-braces-corner.js';\nexport { default as FileBarChart, default as FileBarChartIcon, default as FileChartColumnIncreasing, default as FileChartColumnIncreasingIcon, default as LucideFileBarChart, default as LucideFileChartColumnIncreasing } from './icons/file-chart-column-increasing.js';\nexport { default as FileBraces, default as FileBracesIcon, default as FileJson, default as FileJsonIcon, default as LucideFileBraces, default as LucideFileJson } from './icons/file-braces.js';\nexport { default as FileChartLine, default as FileChartLineIcon, default as FileLineChart, default as FileLineChartIcon, default as LucideFileChartLine, default as LucideFileLineChart } from './icons/file-chart-line.js';\nexport { default as FileBarChart2, default as FileBarChart2Icon, default as FileChartColumn, default as FileChartColumnIcon, default as LucideFileBarChart2, default as LucideFileChartColumn } from './icons/file-chart-column.js';\nexport { default as FileChartPie, default as FileChartPieIcon, default as FilePieChart, default as FilePieChartIcon, default as LucideFileChartPie, default as LucideFilePieChart } from './icons/file-chart-pie.js';\nexport { default as FileCheck2, default as FileCheck2Icon, default as FileCheckCorner, default as FileCheckCornerIcon, default as LucideFileCheck2, default as LucideFileCheckCorner } from './icons/file-check-corner.js';\nexport { default as FileCode2, default as FileCode2Icon, default as FileCodeCorner, default as FileCodeCornerIcon, default as LucideFileCode2, default as LucideFileCodeCorner } from './icons/file-code-corner.js';\nexport { default as FileCog, default as FileCog2, default as FileCog2Icon, default as FileCogIcon, default as LucideFileCog, default as LucideFileCog2 } from './icons/file-cog.js';\nexport { default as FileExclamationPoint, default as FileExclamationPointIcon, default as FileWarning, default as FileWarningIcon, default as LucideFileExclamationPoint, default as LucideFileWarning } from './icons/file-exclamation-point.js';\nexport { default as FileAudio, default as FileAudio2, default as FileAudio2Icon, default as FileAudioIcon, default as FileHeadphone, default as FileHeadphoneIcon, default as LucideFileAudio, default as LucideFileAudio2, default as LucideFileHeadphone } from './icons/file-headphone.js';\nexport { default as FileKey, default as FileKey2, default as FileKey2Icon, default as FileKeyIcon, default as LucideFileKey, default as LucideFileKey2 } from './icons/file-key.js';\nexport { default as FileLock, default as FileLock2, default as FileLock2Icon, default as FileLockIcon, default as LucideFileLock, default as LucideFileLock2 } from './icons/file-lock.js';\nexport { default as FileMinus2, default as FileMinus2Icon, default as FileMinusCorner, default as FileMinusCornerIcon, default as LucideFileMinus2, default as LucideFileMinusCorner } from './icons/file-minus-corner.js';\nexport { default as FilePenLine, default as FilePenLineIcon, default as FileSignature, default as FileSignatureIcon, default as LucideFilePenLine, default as LucideFileSignature } from './icons/file-pen-line.js';\nexport { default as FilePlay, default as FilePlayIcon, default as FileVideo, default as FileVideoIcon, default as LucideFilePlay, default as LucideFileVideo } from './icons/file-play.js';\nexport { default as FileEdit, default as FileEditIcon, default as FilePen, default as FilePenIcon, default as LucideFileEdit, default as LucideFilePen } from './icons/file-pen.js';\nexport { default as FilePlus2, default as FilePlus2Icon, default as FilePlusCorner, default as FilePlusCornerIcon, default as LucideFilePlus2, default as LucideFilePlusCorner } from './icons/file-plus-corner.js';\nexport { default as FileQuestion, default as FileQuestionIcon, default as FileQuestionMark, default as FileQuestionMarkIcon, default as LucideFileQuestion, default as LucideFileQuestionMark } from './icons/file-question-mark.js';\nexport { default as FileSearch2, default as FileSearch2Icon, default as FileSearchCorner, default as FileSearchCornerIcon, default as LucideFileSearch2, default as LucideFileSearchCorner } from './icons/file-search-corner.js';\nexport { default as FileSignal, default as FileSignalIcon, default as FileVolume2, default as FileVolume2Icon, default as LucideFileSignal, default as LucideFileVolume2 } from './icons/file-signal.js';\nexport { default as FileType2, default as FileType2Icon, default as FileTypeCorner, default as FileTypeCornerIcon, default as LucideFileType2, default as LucideFileTypeCorner } from './icons/file-type-corner.js';\nexport { default as FileVideo2, default as FileVideo2Icon, default as FileVideoCamera, default as FileVideoCameraIcon, default as LucideFileVideo2, default as LucideFileVideoCamera } from './icons/file-video-camera.js';\nexport { default as FileX2, default as FileX2Icon, default as FileXCorner, default as FileXCornerIcon, default as LucideFileX2, default as LucideFileXCorner } from './icons/file-x-corner.js';\nexport { default as FolderCog, default as FolderCog2, default as FolderCog2Icon, default as FolderCogIcon, default as LucideFolderCog, default as LucideFolderCog2 } from './icons/folder-cog.js';\nexport { default as FolderEdit, default as FolderEditIcon, default as FolderPen, default as FolderPenIcon, default as LucideFolderEdit, default as LucideFolderPen } from './icons/folder-pen.js';\nexport { default as FilterX, default as FilterXIcon, default as FunnelX, default as FunnelXIcon, default as LucideFilterX, default as LucideFunnelX } from './icons/funnel-x.js';\nexport { default as Filter, default as FilterIcon, default as Funnel, default as FunnelIcon, default as LucideFilter, default as LucideFunnel } from './icons/funnel.js';\nexport { default as GitCommit, default as GitCommitHorizontal, default as GitCommitHorizontalIcon, default as GitCommitIcon, default as LucideGitCommit, default as LucideGitCommitHorizontal } from './icons/git-commit-horizontal.js';\nexport { default as Grid2X2Check, default as Grid2X2CheckIcon, default as Grid2x2Check, default as Grid2x2CheckIcon, default as LucideGrid2X2Check, default as LucideGrid2x2Check } from './icons/grid-2x2-check.js';\nexport { default as Grid2X2Plus, default as Grid2X2PlusIcon, default as Grid2x2Plus, default as Grid2x2PlusIcon, default as LucideGrid2X2Plus, default as LucideGrid2x2Plus } from './icons/grid-2x2-plus.js';\nexport { default as Grid2X2X, default as Grid2X2XIcon, default as Grid2x2X, default as Grid2x2XIcon, default as LucideGrid2X2X, default as LucideGrid2x2X } from './icons/grid-2x2-x.js';\nexport { default as Grid2X2, default as Grid2X2Icon, default as Grid2x2, default as Grid2x2Icon, default as LucideGrid2X2, default as LucideGrid2x2 } from './icons/grid-2x2.js';\nexport { default as Grid, default as Grid3X3, default as Grid3X3Icon, default as Grid3x3, default as Grid3x3Icon, default as GridIcon, default as LucideGrid, default as LucideGrid3X3, default as LucideGrid3x3 } from './icons/grid-3x3.js';\nexport { default as Grab, default as GrabIcon, default as HandGrab, default as HandGrabIcon, default as LucideGrab, default as LucideHandGrab } from './icons/hand-grab.js';\nexport { default as HandHelping, default as HandHelpingIcon, default as HelpingHand, default as HelpingHandIcon, default as LucideHandHelping, default as LucideHelpingHand } from './icons/hand-helping.js';\nexport { default as Home, default as HomeIcon, default as House, default as HouseIcon, default as LucideHome, default as LucideHouse } from './icons/house.js';\nexport { default as IceCream2, default as IceCream2Icon, default as IceCreamBowl, default as IceCreamBowlIcon, default as LucideIceCream2, default as LucideIceCreamBowl } from './icons/ice-cream-bowl.js';\nexport { default as IceCream, default as IceCreamCone, default as IceCreamConeIcon, default as IceCreamIcon, default as LucideIceCream, default as LucideIceCreamCone } from './icons/ice-cream-cone.js';\nexport { default as Laptop2, default as Laptop2Icon, default as LaptopMinimal, default as LaptopMinimalIcon, default as LucideLaptop2, default as LucideLaptopMinimal } from './icons/laptop-minimal.js';\nexport { default as Layers, default as Layers3, default as Layers3Icon, default as LayersIcon, default as LucideLayers, default as LucideLayers3 } from './icons/layers.js';\nexport { default as IndentDecrease, default as IndentDecreaseIcon, default as ListIndentDecrease, default as ListIndentDecreaseIcon, default as LucideIndentDecrease, default as LucideListIndentDecrease, default as LucideOutdent, default as Outdent, default as OutdentIcon } from './icons/list-indent-decrease.js';\nexport { default as Indent, default as IndentIcon, default as IndentIncrease, default as IndentIncreaseIcon, default as ListIndentIncrease, default as ListIndentIncreaseIcon, default as LucideIndent, default as LucideIndentIncrease, default as LucideListIndentIncrease } from './icons/list-indent-increase.js';\nexport { default as Loader2, default as Loader2Icon, default as LoaderCircle, default as LoaderCircleIcon, default as LucideLoader2, default as LucideLoaderCircle } from './icons/loader-circle.js';\nexport { default as LockKeyholeOpen, default as LockKeyholeOpenIcon, default as LucideLockKeyholeOpen, default as LucideUnlockKeyhole, default as UnlockKeyhole, default as UnlockKeyholeIcon } from './icons/lock-keyhole-open.js';\nexport { default as LockOpen, default as LockOpenIcon, default as LucideLockOpen, default as LucideUnlock, default as Unlock, default as UnlockIcon } from './icons/lock-open.js';\nexport { default as LucideMailQuestion, default as LucideMailQuestionMark, default as MailQuestion, default as MailQuestionIcon, default as MailQuestionMark, default as MailQuestionMarkIcon } from './icons/mail-question-mark.js';\nexport { default as LocationEdit, default as LocationEditIcon, default as LucideLocationEdit, default as LucideMapPinPen, default as MapPinPen, default as MapPinPenIcon } from './icons/map-pin-pen.js';\nexport { default as LucideMessageCircleQuestion, default as LucideMessageCircleQuestionMark, default as MessageCircleQuestion, default as MessageCircleQuestionIcon, default as MessageCircleQuestionMark, default as MessageCircleQuestionMarkIcon } from './icons/message-circle-question-mark.js';\nexport { default as LucideMic2, default as LucideMicVocal, default as Mic2, default as Mic2Icon, default as MicVocal, default as MicVocalIcon } from './icons/mic-vocal.js';\nexport { default as LucideMove3D, default as LucideMove3d, default as Move3D, default as Move3DIcon, default as Move3d, default as Move3dIcon } from './icons/move-3d.js';\nexport { default as AlertOctagon, default as AlertOctagonIcon, default as LucideAlertOctagon, default as LucideOctagonAlert, default as OctagonAlert, default as OctagonAlertIcon } from './icons/octagon-alert.js';\nexport { default as LucideOctagonPause, default as LucidePauseOctagon, default as OctagonPause, default as OctagonPauseIcon, default as PauseOctagon, default as PauseOctagonIcon } from './icons/octagon-pause.js';\nexport { default as LucideOctagonX, default as LucideXOctagon, default as OctagonX, default as OctagonXIcon, default as XOctagon, default as XOctagonIcon } from './icons/octagon-x.js';\nexport { default as LucidePaintbrush2, default as LucidePaintbrushVertical, default as Paintbrush2, default as Paintbrush2Icon, default as PaintbrushVertical, default as PaintbrushVerticalIcon } from './icons/paintbrush-vertical.js';\nexport { default as LucidePanelLeftClose, default as LucideSidebarClose, default as PanelLeftClose, default as PanelLeftCloseIcon, default as SidebarClose, default as SidebarCloseIcon } from './icons/panel-left-close.js';\nexport { default as LucidePanelBottomDashed, default as LucidePanelBottomInactive, default as PanelBottomDashed, default as PanelBottomDashedIcon, default as PanelBottomInactive, default as PanelBottomInactiveIcon } from './icons/panel-bottom-dashed.js';\nexport { default as LucidePanelLeftDashed, default as LucidePanelLeftInactive, default as PanelLeftDashed, default as PanelLeftDashedIcon, default as PanelLeftInactive, default as PanelLeftInactiveIcon } from './icons/panel-left-dashed.js';\nexport { default as LucidePanelLeft, default as LucideSidebar, default as PanelLeft, default as PanelLeftIcon, default as Sidebar, default as SidebarIcon } from './icons/panel-left.js';\nexport { default as LucidePanelLeftOpen, default as LucideSidebarOpen, default as PanelLeftOpen, default as PanelLeftOpenIcon, default as SidebarOpen, default as SidebarOpenIcon } from './icons/panel-left-open.js';\nexport { default as LucidePanelRightDashed, default as LucidePanelRightInactive, default as PanelRightDashed, default as PanelRightDashedIcon, default as PanelRightInactive, default as PanelRightInactiveIcon } from './icons/panel-right-dashed.js';\nexport { default as LucidePanelTopDashed, default as LucidePanelTopInactive, default as PanelTopDashed, default as PanelTopDashedIcon, default as PanelTopInactive, default as PanelTopInactiveIcon } from './icons/panel-top-dashed.js';\nexport { default as Layout, default as LayoutIcon, default as LucideLayout, default as LucidePanelsTopLeft, default as PanelsTopLeft, default as PanelsTopLeftIcon } from './icons/panels-top-left.js';\nexport { default as Edit3, default as Edit3Icon, default as LucideEdit3, default as LucidePenLine, default as PenLine, default as PenLineIcon } from './icons/pen-line.js';\nexport { default as Edit2, default as Edit2Icon, default as LucideEdit2, default as LucidePen, default as Pen, default as PenIcon } from './icons/pen.js';\nexport { default as LucidePlugZap, default as LucidePlugZap2, default as PlugZap, default as PlugZap2, default as PlugZap2Icon, default as PlugZapIcon } from './icons/plug-zap.js';\nexport { default as FormInput, default as FormInputIcon, default as LucideFormInput, default as LucideRectangleEllipsis, default as RectangleEllipsis, default as RectangleEllipsisIcon } from './icons/rectangle-ellipsis.js';\nexport { default as LucideRotate3D, default as LucideRotate3d, default as Rotate3D, default as Rotate3DIcon, default as Rotate3d, default as Rotate3dIcon } from './icons/rotate-3d.js';\nexport { default as LucideRows, default as LucideRows2, default as Rows, default as Rows2, default as Rows2Icon, default as RowsIcon } from './icons/rows-2.js';\nexport { default as LucidePanelsTopBottom, default as LucideRows3, default as PanelsTopBottom, default as PanelsTopBottomIcon, default as Rows3, default as Rows3Icon } from './icons/rows-3.js';\nexport { default as LucideScale3D, default as LucideScale3d, default as Scale3D, default as Scale3DIcon, default as Scale3d, default as Scale3dIcon } from './icons/scale-3d.js';\nexport { default as LucideSendHorizonal, default as LucideSendHorizontal, default as SendHorizonal, default as SendHorizonalIcon, default as SendHorizontal, default as SendHorizontalIcon } from './icons/send-horizontal.js';\nexport { default as LucideShieldQuestion, default as LucideShieldQuestionMark, default as ShieldQuestion, default as ShieldQuestionIcon, default as ShieldQuestionMark, default as ShieldQuestionMarkIcon } from './icons/shield-question-mark.js';\nexport { default as LucideShieldClose, default as LucideShieldX, default as ShieldClose, default as ShieldCloseIcon, default as ShieldX, default as ShieldXIcon } from './icons/shield-x.js';\nexport { default as LucideSliders, default as LucideSlidersVertical, default as Sliders, default as SlidersIcon, default as SlidersVertical, default as SlidersVerticalIcon } from './icons/sliders-vertical.js';\nexport { default as LucideSparkles, default as LucideStars, default as Sparkles, default as SparklesIcon, default as Stars, default as StarsIcon } from './icons/sparkles.js';\nexport { default as ActivitySquare, default as ActivitySquareIcon, default as LucideActivitySquare, default as LucideSquareActivity, default as SquareActivity, default as SquareActivityIcon } from './icons/square-activity.js';\nexport { default as ArrowDownLeftSquare, default as ArrowDownLeftSquareIcon, default as LucideArrowDownLeftSquare, default as LucideSquareArrowDownLeft, default as SquareArrowDownLeft, default as SquareArrowDownLeftIcon } from './icons/square-arrow-down-left.js';\nexport { default as ArrowDownRightSquare, default as ArrowDownRightSquareIcon, default as LucideArrowDownRightSquare, default as LucideSquareArrowDownRight, default as SquareArrowDownRight, default as SquareArrowDownRightIcon } from './icons/square-arrow-down-right.js';\nexport { default as ArrowDownSquare, default as ArrowDownSquareIcon, default as LucideArrowDownSquare, default as LucideSquareArrowDown, default as SquareArrowDown, default as SquareArrowDownIcon } from './icons/square-arrow-down.js';\nexport { default as ArrowLeftSquare, default as ArrowLeftSquareIcon, default as LucideArrowLeftSquare, default as LucideSquareArrowLeft, default as SquareArrowLeft, default as SquareArrowLeftIcon } from './icons/square-arrow-left.js';\nexport { default as ArrowDownLeftFromSquare, default as ArrowDownLeftFromSquareIcon, default as LucideArrowDownLeftFromSquare, default as LucideSquareArrowOutDownLeft, default as SquareArrowOutDownLeft, default as SquareArrowOutDownLeftIcon } from './icons/square-arrow-out-down-left.js';\nexport { default as ArrowDownRightFromSquare, default as ArrowDownRightFromSquareIcon, default as LucideArrowDownRightFromSquare, default as LucideSquareArrowOutDownRight, default as SquareArrowOutDownRight, default as SquareArrowOutDownRightIcon } from './icons/square-arrow-out-down-right.js';\nexport { default as ArrowUpLeftFromSquare, default as ArrowUpLeftFromSquareIcon, default as LucideArrowUpLeftFromSquare, default as LucideSquareArrowOutUpLeft, default as SquareArrowOutUpLeft, default as SquareArrowOutUpLeftIcon } from './icons/square-arrow-out-up-left.js';\nexport { default as ArrowUpRightFromSquare, default as ArrowUpRightFromSquareIcon, default as LucideArrowUpRightFromSquare, default as LucideSquareArrowOutUpRight, default as SquareArrowOutUpRight, default as SquareArrowOutUpRightIcon } from './icons/square-arrow-out-up-right.js';\nexport { default as ArrowRightSquare, default as ArrowRightSquareIcon, default as LucideArrowRightSquare, default as LucideSquareArrowRight, default as SquareArrowRight, default as SquareArrowRightIcon } from './icons/square-arrow-right.js';\nexport { default as ArrowUpLeftSquare, default as ArrowUpLeftSquareIcon, default as LucideArrowUpLeftSquare, default as LucideSquareArrowUpLeft, default as SquareArrowUpLeft, default as SquareArrowUpLeftIcon } from './icons/square-arrow-up-left.js';\nexport { default as ArrowUpRightSquare, default as ArrowUpRightSquareIcon, default as LucideArrowUpRightSquare, default as LucideSquareArrowUpRight, default as SquareArrowUpRight, default as SquareArrowUpRightIcon } from './icons/square-arrow-up-right.js';\nexport { default as ArrowUpSquare, default as ArrowUpSquareIcon, default as LucideArrowUpSquare, default as LucideSquareArrowUp, default as SquareArrowUp, default as SquareArrowUpIcon } from './icons/square-arrow-up.js';\nexport { default as AsteriskSquare, default as AsteriskSquareIcon, default as LucideAsteriskSquare, default as LucideSquareAsterisk, default as SquareAsterisk, default as SquareAsteriskIcon } from './icons/square-asterisk.js';\nexport { default as LucideScissorsSquareDashedBottom, default as LucideSquareBottomDashedScissors, default as ScissorsSquareDashedBottom, default as ScissorsSquareDashedBottomIcon, default as SquareBottomDashedScissors, default as SquareBottomDashedScissorsIcon } from './icons/square-bottom-dashed-scissors.js';\nexport { default as GanttChartSquare, default as GanttChartSquareIcon, default as LucideGanttChartSquare, default as LucideSquareChartGantt, default as LucideSquareGanttChart, default as SquareChartGantt, default as SquareChartGanttIcon, default as SquareGanttChart, default as SquareGanttChartIcon } from './icons/square-chart-gantt.js';\nexport { default as CheckSquare, default as CheckSquareIcon, default as LucideCheckSquare, default as LucideSquareCheckBig, default as SquareCheckBig, default as SquareCheckBigIcon } from './icons/square-check-big.js';\nexport { default as CheckSquare2, default as CheckSquare2Icon, default as LucideCheckSquare2, default as LucideSquareCheck, default as SquareCheck, default as SquareCheckIcon } from './icons/square-check.js';\nexport { default as ChevronDownSquare, default as ChevronDownSquareIcon, default as LucideChevronDownSquare, default as LucideSquareChevronDown, default as SquareChevronDown, default as SquareChevronDownIcon } from './icons/square-chevron-down.js';\nexport { default as ChevronLeftSquare, default as ChevronLeftSquareIcon, default as LucideChevronLeftSquare, default as LucideSquareChevronLeft, default as SquareChevronLeft, default as SquareChevronLeftIcon } from './icons/square-chevron-left.js';\nexport { default as ChevronRightSquare, default as ChevronRightSquareIcon, default as LucideChevronRightSquare, default as LucideSquareChevronRight, default as SquareChevronRight, default as SquareChevronRightIcon } from './icons/square-chevron-right.js';\nexport { default as ChevronUpSquare, default as ChevronUpSquareIcon, default as LucideChevronUpSquare, default as LucideSquareChevronUp, default as SquareChevronUp, default as SquareChevronUpIcon } from './icons/square-chevron-up.js';\nexport { default as CodeSquare, default as CodeSquareIcon, default as LucideCodeSquare, default as LucideSquareCode, default as SquareCode, default as SquareCodeIcon } from './icons/square-code.js';\nexport { default as KanbanSquareDashed, default as KanbanSquareDashedIcon, default as LucideKanbanSquareDashed, default as LucideSquareDashedKanban, default as SquareDashedKanban, default as SquareDashedKanbanIcon } from './icons/square-dashed-kanban.js';\nexport { default as LucideMousePointerSquareDashed, default as LucideSquareDashedMousePointer, default as MousePointerSquareDashed, default as MousePointerSquareDashedIcon, default as SquareDashedMousePointer, default as SquareDashedMousePointerIcon } from './icons/square-dashed-mouse-pointer.js';\nexport { default as BoxSelect, default as BoxSelectIcon, default as LucideBoxSelect, default as LucideSquareDashed, default as SquareDashed, default as SquareDashedIcon } from './icons/square-dashed.js';\nexport { default as DivideSquare, default as DivideSquareIcon, default as LucideDivideSquare, default as LucideSquareDivide, default as SquareDivide, default as SquareDivideIcon } from './icons/square-divide.js';\nexport { default as DotSquare, default as DotSquareIcon, default as LucideDotSquare, default as LucideSquareDot, default as SquareDot, default as SquareDotIcon } from './icons/square-dot.js';\nexport { default as FunctionSquare, default as FunctionSquareIcon, default as LucideFunctionSquare, default as LucideSquareFunction, default as SquareFunction, default as SquareFunctionIcon } from './icons/square-function.js';\nexport { default as EqualSquare, default as EqualSquareIcon, default as LucideEqualSquare, default as LucideSquareEqual, default as SquareEqual, default as SquareEqualIcon } from './icons/square-equal.js';\nexport { default as KanbanSquare, default as KanbanSquareIcon, default as LucideKanbanSquare, default as LucideSquareKanban, default as SquareKanban, default as SquareKanbanIcon } from './icons/square-kanban.js';\nexport { default as LibrarySquare, default as LibrarySquareIcon, default as LucideLibrarySquare, default as LucideSquareLibrary, default as SquareLibrary, default as SquareLibraryIcon } from './icons/square-library.js';\nexport { default as LucideMSquare, default as LucideSquareM, default as MSquare, default as MSquareIcon, default as SquareM, default as SquareMIcon } from './icons/square-m.js';\nexport { default as LucideMinusSquare, default as LucideSquareMinus, default as MinusSquare, default as MinusSquareIcon, default as SquareMinus, default as SquareMinusIcon } from './icons/square-minus.js';\nexport { default as LucideMenuSquare, default as LucideSquareMenu, default as MenuSquare, default as MenuSquareIcon, default as SquareMenu, default as SquareMenuIcon } from './icons/square-menu.js';\nexport { default as Inspect, default as InspectIcon, default as LucideInspect, default as LucideSquareMousePointer, default as SquareMousePointer, default as SquareMousePointerIcon } from './icons/square-mouse-pointer.js';\nexport { default as LucideParkingSquareOff, default as LucideSquareParkingOff, default as ParkingSquareOff, default as ParkingSquareOffIcon, default as SquareParkingOff, default as SquareParkingOffIcon } from './icons/square-parking-off.js';\nexport { default as LucideParkingSquare, default as LucideSquareParking, default as ParkingSquare, default as ParkingSquareIcon, default as SquareParking, default as SquareParkingIcon } from './icons/square-parking.js';\nexport { default as Edit, default as EditIcon, default as LucideEdit, default as LucidePenBox, default as LucidePenSquare, default as LucideSquarePen, default as PenBox, default as PenBoxIcon, default as PenSquare, default as PenSquareIcon, default as SquarePen, default as SquarePenIcon } from './icons/square-pen.js';\nexport { default as LucidePercentSquare, default as LucideSquarePercent, default as PercentSquare, default as PercentSquareIcon, default as SquarePercent, default as SquarePercentIcon } from './icons/square-percent.js';\nexport { default as LucidePiSquare, default as LucideSquarePi, default as PiSquare, default as PiSquareIcon, default as SquarePi, default as SquarePiIcon } from './icons/square-pi.js';\nexport { default as LucidePilcrowSquare, default as LucideSquarePilcrow, default as PilcrowSquare, default as PilcrowSquareIcon, default as SquarePilcrow, default as SquarePilcrowIcon } from './icons/square-pilcrow.js';\nexport { default as LucidePlaySquare, default as LucideSquarePlay, default as PlaySquare, default as PlaySquareIcon, default as SquarePlay, default as SquarePlayIcon } from './icons/square-play.js';\nexport { default as LucidePlusSquare, default as LucideSquarePlus, default as PlusSquare, default as PlusSquareIcon, default as SquarePlus, default as SquarePlusIcon } from './icons/square-plus.js';\nexport { default as LucidePowerSquare, default as LucideSquarePower, default as PowerSquare, default as PowerSquareIcon, default as SquarePower, default as SquarePowerIcon } from './icons/square-power.js';\nexport { default as LucideScissorsSquare, default as LucideSquareScissors, default as ScissorsSquare, default as ScissorsSquareIcon, default as SquareScissors, default as SquareScissorsIcon } from './icons/square-scissors.js';\nexport { default as LucideSlashSquare, default as LucideSquareSlash, default as SlashSquare, default as SlashSquareIcon, default as SquareSlash, default as SquareSlashIcon } from './icons/square-slash.js';\nexport { default as LucideSplitSquareHorizontal, default as LucideSquareSplitHorizontal, default as SplitSquareHorizontal, default as SplitSquareHorizontalIcon, default as SquareSplitHorizontal, default as SquareSplitHorizontalIcon } from './icons/square-split-horizontal.js';\nexport { default as LucideSplitSquareVertical, default as LucideSquareSplitVertical, default as SplitSquareVertical, default as SplitSquareVerticalIcon, default as SquareSplitVertical, default as SquareSplitVerticalIcon } from './icons/square-split-vertical.js';\nexport { default as LucideSigmaSquare, default as LucideSquareSigma, default as SigmaSquare, default as SigmaSquareIcon, default as SquareSigma, default as SquareSigmaIcon } from './icons/square-sigma.js';\nexport { default as LucideSquareTerminal, default as LucideTerminalSquare, default as SquareTerminal, default as SquareTerminalIcon, default as TerminalSquare, default as TerminalSquareIcon } from './icons/square-terminal.js';\nexport { default as LucideSquareUserRound, default as LucideUserSquare2, default as SquareUserRound, default as SquareUserRoundIcon, default as UserSquare2, default as UserSquare2Icon } from './icons/square-user-round.js';\nexport { default as LucideSquareUser, default as LucideUserSquare, default as SquareUser, default as SquareUserIcon, default as UserSquare, default as UserSquareIcon } from './icons/square-user.js';\nexport { default as LucideSquareX, default as LucideXSquare, default as SquareX, default as SquareXIcon, default as XSquare, default as XSquareIcon } from './icons/square-x.js';\nexport { default as AlignCenter, default as AlignCenterIcon, default as LucideAlignCenter, default as LucideTextAlignCenter, default as TextAlignCenter, default as TextAlignCenterIcon } from './icons/text-align-center.js';\nexport { default as LucideTestTube2, default as LucideTestTubeDiagonal, default as TestTube2, default as TestTube2Icon, default as TestTubeDiagonal, default as TestTubeDiagonalIcon } from './icons/test-tube-diagonal.js';\nexport { default as AlignRight, default as AlignRightIcon, default as LucideAlignRight, default as LucideTextAlignEnd, default as TextAlignEnd, default as TextAlignEndIcon } from './icons/text-align-end.js';\nexport { default as AlignLeft, default as AlignLeftIcon, default as LucideAlignLeft, default as LucideText, default as LucideTextAlignStart, default as Text, default as TextAlignStart, default as TextAlignStartIcon, default as TextIcon } from './icons/text-align-start.js';\nexport { default as AlignJustify, default as AlignJustifyIcon, default as LucideAlignJustify, default as LucideTextAlignJustify, default as TextAlignJustify, default as TextAlignJustifyIcon } from './icons/text-align-justify.js';\nexport { default as LetterText, default as LetterTextIcon, default as LucideLetterText, default as LucideTextInitial, default as TextInitial, default as TextInitialIcon } from './icons/text-initial.js';\nexport { default as LucideTextSelect, default as LucideTextSelection, default as TextSelect, default as TextSelectIcon, default as TextSelection, default as TextSelectionIcon } from './icons/text-select.js';\nexport { default as LucideTextWrap, default as LucideWrapText, default as TextWrap, default as TextWrapIcon, default as WrapText, default as WrapTextIcon } from './icons/text-wrap.js';\nexport { default as LucideTrain, default as LucideTramFront, default as Train, default as TrainIcon, default as TramFront, default as TramFrontIcon } from './icons/tram-front.js';\nexport { default as LucidePalmtree, default as LucideTreePalm, default as Palmtree, default as PalmtreeIcon, default as TreePalm, default as TreePalmIcon } from './icons/tree-palm.js';\nexport { default as AlertTriangle, default as AlertTriangleIcon, default as LucideAlertTriangle, default as LucideTriangleAlert, default as TriangleAlert, default as TriangleAlertIcon } from './icons/triangle-alert.js';\nexport { default as LucideTv2, default as LucideTvMinimal, default as Tv2, default as Tv2Icon, default as TvMinimal, default as TvMinimalIcon } from './icons/tv-minimal.js';\nexport { default as LucideSchool2, default as LucideUniversity, default as School2, default as School2Icon, default as University, default as UniversityIcon } from './icons/university.js';\nexport { default as LucideUserCheck2, default as LucideUserRoundCheck, default as UserCheck2, default as UserCheck2Icon, default as UserRoundCheck, default as UserRoundCheckIcon } from './icons/user-round-check.js';\nexport { default as LucideUserCog2, default as LucideUserRoundCog, default as UserCog2, default as UserCog2Icon, default as UserRoundCog, default as UserRoundCogIcon } from './icons/user-round-cog.js';\nexport { default as LucideUserMinus2, default as LucideUserRoundMinus, default as UserMinus2, default as UserMinus2Icon, default as UserRoundMinus, default as UserRoundMinusIcon } from './icons/user-round-minus.js';\nexport { default as LucideUserPlus2, default as LucideUserRoundPlus, default as UserPlus2, default as UserPlus2Icon, default as UserRoundPlus, default as UserRoundPlusIcon } from './icons/user-round-plus.js';\nexport { default as LucideUserRoundX, default as LucideUserX2, default as UserRoundX, default as UserRoundXIcon, default as UserX2, default as UserX2Icon } from './icons/user-round-x.js';\nexport { default as LucideUser2, default as LucideUserRound, default as User2, default as User2Icon, default as UserRound, default as UserRoundIcon } from './icons/user-round.js';\nexport { default as LucideUsers2, default as LucideUsersRound, default as Users2, default as Users2Icon, default as UsersRound, default as UsersRoundIcon } from './icons/users-round.js';\nexport { default as ForkKnifeCrossed, default as ForkKnifeCrossedIcon, default as LucideForkKnifeCrossed, default as LucideUtensilsCrossed, default as UtensilsCrossed, default as UtensilsCrossedIcon } from './icons/utensils-crossed.js';\nexport { default as ForkKnife, default as ForkKnifeIcon, default as LucideForkKnife, default as LucideUtensils, default as Utensils, default as UtensilsIcon } from './icons/utensils.js';\nexport { default as LucideWallet2, default as LucideWalletMinimal, default as Wallet2, default as Wallet2Icon, default as WalletMinimal, default as WalletMinimalIcon } from './icons/wallet-minimal.js';\nexport { default as LucideWand2, default as LucideWandSparkles, default as Wand2, default as Wand2Icon, default as WandSparkles, default as WandSparklesIcon } from './icons/wand-sparkles.js';\nexport { default as AArrowDown, default as AArrowDownIcon, default as LucideAArrowDown } from './icons/a-arrow-down.js';\nexport { default as AArrowUp, default as AArrowUpIcon, default as LucideAArrowUp } from './icons/a-arrow-up.js';\nexport { default as ALargeSmall, default as ALargeSmallIcon, default as LucideALargeSmall } from './icons/a-large-small.js';\nexport { default as Accessibility, default as AccessibilityIcon, default as LucideAccessibility } from './icons/accessibility.js';\nexport { default as Activity, default as ActivityIcon, default as LucideActivity } from './icons/activity.js';\nexport { default as Airplay, default as AirplayIcon, default as LucideAirplay } from './icons/airplay.js';\nexport { default as AirVent, default as AirVentIcon, default as LucideAirVent } from './icons/air-vent.js';\nexport { default as AlarmClockOff, default as AlarmClockOffIcon, default as LucideAlarmClockOff } from './icons/alarm-clock-off.js';\nexport { default as AlarmClock, default as AlarmClockIcon, default as LucideAlarmClock } from './icons/alarm-clock.js';\nexport { default as AlarmSmoke, default as AlarmSmokeIcon, default as LucideAlarmSmoke } from './icons/alarm-smoke.js';\nexport { default as Album, default as AlbumIcon, default as LucideAlbum } from './icons/album.js';\nexport { default as AlignCenterHorizontal, default as AlignCenterHorizontalIcon, default as LucideAlignCenterHorizontal } from './icons/align-center-horizontal.js';\nexport { default as AlignCenterVertical, default as AlignCenterVerticalIcon, default as LucideAlignCenterVertical } from './icons/align-center-vertical.js';\nexport { default as AlignEndHorizontal, default as AlignEndHorizontalIcon, default as LucideAlignEndHorizontal } from './icons/align-end-horizontal.js';\nexport { default as AlignEndVertical, default as AlignEndVerticalIcon, default as LucideAlignEndVertical } from './icons/align-end-vertical.js';\nexport { default as AlignHorizontalDistributeCenter, default as AlignHorizontalDistributeCenterIcon, default as LucideAlignHorizontalDistributeCenter } from './icons/align-horizontal-distribute-center.js';\nexport { default as AlignHorizontalDistributeEnd, default as AlignHorizontalDistributeEndIcon, default as LucideAlignHorizontalDistributeEnd } from './icons/align-horizontal-distribute-end.js';\nexport { default as AlignHorizontalDistributeStart, default as AlignHorizontalDistributeStartIcon, default as LucideAlignHorizontalDistributeStart } from './icons/align-horizontal-distribute-start.js';\nexport { default as AlignHorizontalJustifyCenter, default as AlignHorizontalJustifyCenterIcon, default as LucideAlignHorizontalJustifyCenter } from './icons/align-horizontal-justify-center.js';\nexport { default as AlignHorizontalJustifyEnd, default as AlignHorizontalJustifyEndIcon, default as LucideAlignHorizontalJustifyEnd } from './icons/align-horizontal-justify-end.js';\nexport { default as AlignHorizontalJustifyStart, default as AlignHorizontalJustifyStartIcon, default as LucideAlignHorizontalJustifyStart } from './icons/align-horizontal-justify-start.js';\nexport { default as AlignHorizontalSpaceAround, default as AlignHorizontalSpaceAroundIcon, default as LucideAlignHorizontalSpaceAround } from './icons/align-horizontal-space-around.js';\nexport { default as AlignHorizontalSpaceBetween, default as AlignHorizontalSpaceBetweenIcon, default as LucideAlignHorizontalSpaceBetween } from './icons/align-horizontal-space-between.js';\nexport { default as AlignStartHorizontal, default as AlignStartHorizontalIcon, default as LucideAlignStartHorizontal } from './icons/align-start-horizontal.js';\nexport { default as AlignStartVertical, default as AlignStartVerticalIcon, default as LucideAlignStartVertical } from './icons/align-start-vertical.js';\nexport { default as AlignVerticalDistributeCenter, default as AlignVerticalDistributeCenterIcon, default as LucideAlignVerticalDistributeCenter } from './icons/align-vertical-distribute-center.js';\nexport { default as AlignVerticalDistributeEnd, default as AlignVerticalDistributeEndIcon, default as LucideAlignVerticalDistributeEnd } from './icons/align-vertical-distribute-end.js';\nexport { default as AlignVerticalDistributeStart, default as AlignVerticalDistributeStartIcon, default as LucideAlignVerticalDistributeStart } from './icons/align-vertical-distribute-start.js';\nexport { default as AlignVerticalJustifyCenter, default as AlignVerticalJustifyCenterIcon, default as LucideAlignVerticalJustifyCenter } from './icons/align-vertical-justify-center.js';\nexport { default as AlignVerticalJustifyEnd, default as AlignVerticalJustifyEndIcon, default as LucideAlignVerticalJustifyEnd } from './icons/align-vertical-justify-end.js';\nexport { default as AlignVerticalJustifyStart, default as AlignVerticalJustifyStartIcon, default as LucideAlignVerticalJustifyStart } from './icons/align-vertical-justify-start.js';\nexport { default as AlignVerticalSpaceAround, default as AlignVerticalSpaceAroundIcon, default as LucideAlignVerticalSpaceAround } from './icons/align-vertical-space-around.js';\nexport { default as AlignVerticalSpaceBetween, default as AlignVerticalSpaceBetweenIcon, default as LucideAlignVerticalSpaceBetween } from './icons/align-vertical-space-between.js';\nexport { default as Ambulance, default as AmbulanceIcon, default as LucideAmbulance } from './icons/ambulance.js';\nexport { default as Ampersand, default as AmpersandIcon, default as LucideAmpersand } from './icons/ampersand.js';\nexport { default as Amphora, default as AmphoraIcon, default as LucideAmphora } from './icons/amphora.js';\nexport { default as Ampersands, default as AmpersandsIcon, default as LucideAmpersands } from './icons/ampersands.js';\nexport { default as Anchor, default as AnchorIcon, default as LucideAnchor } from './icons/anchor.js';\nexport { default as Angry, default as AngryIcon, default as LucideAngry } from './icons/angry.js';\nexport { default as Antenna, default as AntennaIcon, default as LucideAntenna } from './icons/antenna.js';\nexport { default as Annoyed, default as AnnoyedIcon, default as LucideAnnoyed } from './icons/annoyed.js';\nexport { default as Aperture, default as ApertureIcon, default as LucideAperture } from './icons/aperture.js';\nexport { default as Anvil, default as AnvilIcon, default as LucideAnvil } from './icons/anvil.js';\nexport { default as AppWindowMac, default as AppWindowMacIcon, default as LucideAppWindowMac } from './icons/app-window-mac.js';\nexport { default as AppWindow, default as AppWindowIcon, default as LucideAppWindow } from './icons/app-window.js';\nexport { default as Apple, default as AppleIcon, default as LucideApple } from './icons/apple.js';\nexport { default as ArchiveRestore, default as ArchiveRestoreIcon, default as LucideArchiveRestore } from './icons/archive-restore.js';\nexport { default as Archive, default as ArchiveIcon, default as LucideArchive } from './icons/archive.js';\nexport { default as Armchair, default as ArmchairIcon, default as LucideArmchair } from './icons/armchair.js';\nexport { default as ArchiveX, default as ArchiveXIcon, default as LucideArchiveX } from './icons/archive-x.js';\nexport { default as ArrowBigDownDash, default as ArrowBigDownDashIcon, default as LucideArrowBigDownDash } from './icons/arrow-big-down-dash.js';\nexport { default as ArrowBigDown, default as ArrowBigDownIcon, default as LucideArrowBigDown } from './icons/arrow-big-down.js';\nexport { default as ArrowBigLeftDash, default as ArrowBigLeftDashIcon, default as LucideArrowBigLeftDash } from './icons/arrow-big-left-dash.js';\nexport { default as ArrowBigLeft, default as ArrowBigLeftIcon, default as LucideArrowBigLeft } from './icons/arrow-big-left.js';\nexport { default as ArrowBigRightDash, default as ArrowBigRightDashIcon, default as LucideArrowBigRightDash } from './icons/arrow-big-right-dash.js';\nexport { default as ArrowBigRight, default as ArrowBigRightIcon, default as LucideArrowBigRight } from './icons/arrow-big-right.js';\nexport { default as ArrowBigUpDash, default as ArrowBigUpDashIcon, default as LucideArrowBigUpDash } from './icons/arrow-big-up-dash.js';\nexport { default as ArrowBigUp, default as ArrowBigUpIcon, default as LucideArrowBigUp } from './icons/arrow-big-up.js';\nexport { default as ArrowDownFromLine, default as ArrowDownFromLineIcon, default as LucideArrowDownFromLine } from './icons/arrow-down-from-line.js';\nexport { default as ArrowDownLeft, default as ArrowDownLeftIcon, default as LucideArrowDownLeft } from './icons/arrow-down-left.js';\nexport { default as ArrowDownNarrowWide, default as ArrowDownNarrowWideIcon, default as LucideArrowDownNarrowWide } from './icons/arrow-down-narrow-wide.js';\nexport { default as ArrowDownRight, default as ArrowDownRightIcon, default as LucideArrowDownRight } from './icons/arrow-down-right.js';\nexport { default as ArrowDownToDot, default as ArrowDownToDotIcon, default as LucideArrowDownToDot } from './icons/arrow-down-to-dot.js';\nexport { default as ArrowDownToLine, default as ArrowDownToLineIcon, default as LucideArrowDownToLine } from './icons/arrow-down-to-line.js';\nexport { default as ArrowDownUp, default as ArrowDownUpIcon, default as LucideArrowDownUp } from './icons/arrow-down-up.js';\nexport { default as ArrowDown, default as ArrowDownIcon, default as LucideArrowDown } from './icons/arrow-down.js';\nexport { default as ArrowLeftFromLine, default as ArrowLeftFromLineIcon, default as LucideArrowLeftFromLine } from './icons/arrow-left-from-line.js';\nexport { default as ArrowLeftRight, default as ArrowLeftRightIcon, default as LucideArrowLeftRight } from './icons/arrow-left-right.js';\nexport { default as ArrowLeftToLine, default as ArrowLeftToLineIcon, default as LucideArrowLeftToLine } from './icons/arrow-left-to-line.js';\nexport { default as ArrowLeft, default as ArrowLeftIcon, default as LucideArrowLeft } from './icons/arrow-left.js';\nexport { default as ArrowRightFromLine, default as ArrowRightFromLineIcon, default as LucideArrowRightFromLine } from './icons/arrow-right-from-line.js';\nexport { default as ArrowRightLeft, default as ArrowRightLeftIcon, default as LucideArrowRightLeft } from './icons/arrow-right-left.js';\nexport { default as ArrowRightToLine, default as ArrowRightToLineIcon, default as LucideArrowRightToLine } from './icons/arrow-right-to-line.js';\nexport { default as ArrowRight, default as ArrowRightIcon, default as LucideArrowRight } from './icons/arrow-right.js';\nexport { default as ArrowUpDown, default as ArrowUpDownIcon, default as LucideArrowUpDown } from './icons/arrow-up-down.js';\nexport { default as ArrowUpFromDot, default as ArrowUpFromDotIcon, default as LucideArrowUpFromDot } from './icons/arrow-up-from-dot.js';\nexport { default as ArrowUpFromLine, default as ArrowUpFromLineIcon, default as LucideArrowUpFromLine } from './icons/arrow-up-from-line.js';\nexport { default as ArrowUpLeft, default as ArrowUpLeftIcon, default as LucideArrowUpLeft } from './icons/arrow-up-left.js';\nexport { default as ArrowUpRight, default as ArrowUpRightIcon, default as LucideArrowUpRight } from './icons/arrow-up-right.js';\nexport { default as ArrowUpToLine, default as ArrowUpToLineIcon, default as LucideArrowUpToLine } from './icons/arrow-up-to-line.js';\nexport { default as ArrowUpWideNarrow, default as ArrowUpWideNarrowIcon, default as LucideArrowUpWideNarrow } from './icons/arrow-up-wide-narrow.js';\nexport { default as ArrowUp, default as ArrowUpIcon, default as LucideArrowUp } from './icons/arrow-up.js';\nexport { default as ArrowsUpFromLine, default as ArrowsUpFromLineIcon, default as LucideArrowsUpFromLine } from './icons/arrows-up-from-line.js';\nexport { default as Asterisk, default as AsteriskIcon, default as LucideAsterisk } from './icons/asterisk.js';\nexport { default as AtSign, default as AtSignIcon, default as LucideAtSign } from './icons/at-sign.js';\nexport { default as Atom, default as AtomIcon, default as LucideAtom } from './icons/atom.js';\nexport { default as AudioLines, default as AudioLinesIcon, default as LucideAudioLines } from './icons/audio-lines.js';\nexport { default as AudioWaveform, default as AudioWaveformIcon, default as LucideAudioWaveform } from './icons/audio-waveform.js';\nexport { default as Award, default as AwardIcon, default as LucideAward } from './icons/award.js';\nexport { default as Axe, default as AxeIcon, default as LucideAxe } from './icons/axe.js';\nexport { default as Baby, default as BabyIcon, default as LucideBaby } from './icons/baby.js';\nexport { default as Backpack, default as BackpackIcon, default as LucideBackpack } from './icons/backpack.js';\nexport { default as BadgeAlert, default as BadgeAlertIcon, default as LucideBadgeAlert } from './icons/badge-alert.js';\nexport { default as BadgeCent, default as BadgeCentIcon, default as LucideBadgeCent } from './icons/badge-cent.js';\nexport { default as BadgeDollarSign, default as BadgeDollarSignIcon, default as LucideBadgeDollarSign } from './icons/badge-dollar-sign.js';\nexport { default as BadgeEuro, default as BadgeEuroIcon, default as LucideBadgeEuro } from './icons/badge-euro.js';\nexport { default as BadgeInfo, default as BadgeInfoIcon, default as LucideBadgeInfo } from './icons/badge-info.js';\nexport { default as BadgeIndianRupee, default as BadgeIndianRupeeIcon, default as LucideBadgeIndianRupee } from './icons/badge-indian-rupee.js';\nexport { default as BadgeJapaneseYen, default as BadgeJapaneseYenIcon, default as LucideBadgeJapaneseYen } from './icons/badge-japanese-yen.js';\nexport { default as BadgeMinus, default as BadgeMinusIcon, default as LucideBadgeMinus } from './icons/badge-minus.js';\nexport { default as BadgePercent, default as BadgePercentIcon, default as LucideBadgePercent } from './icons/badge-percent.js';\nexport { default as BadgePlus, default as BadgePlusIcon, default as LucideBadgePlus } from './icons/badge-plus.js';\nexport { default as BadgePoundSterling, default as BadgePoundSterlingIcon, default as LucideBadgePoundSterling } from './icons/badge-pound-sterling.js';\nexport { default as BadgeRussianRuble, default as BadgeRussianRubleIcon, default as LucideBadgeRussianRuble } from './icons/badge-russian-ruble.js';\nexport { default as BadgeSwissFranc, default as BadgeSwissFrancIcon, default as LucideBadgeSwissFranc } from './icons/badge-swiss-franc.js';\nexport { default as BadgeTurkishLira, default as BadgeTurkishLiraIcon, default as LucideBadgeTurkishLira } from './icons/badge-turkish-lira.js';\nexport { default as BadgeX, default as BadgeXIcon, default as LucideBadgeX } from './icons/badge-x.js';\nexport { default as Badge, default as BadgeIcon, default as LucideBadge } from './icons/badge.js';\nexport { default as BaggageClaim, default as BaggageClaimIcon, default as LucideBaggageClaim } from './icons/baggage-claim.js';\nexport { default as Balloon, default as BalloonIcon, default as LucideBalloon } from './icons/balloon.js';\nexport { default as Ban, default as BanIcon, default as LucideBan } from './icons/ban.js';\nexport { default as Bandage, default as BandageIcon, default as LucideBandage } from './icons/bandage.js';\nexport { default as BanknoteArrowDown, default as BanknoteArrowDownIcon, default as LucideBanknoteArrowDown } from './icons/banknote-arrow-down.js';\nexport { default as Banana, default as BananaIcon, default as LucideBanana } from './icons/banana.js';\nexport { default as BanknoteArrowUp, default as BanknoteArrowUpIcon, default as LucideBanknoteArrowUp } from './icons/banknote-arrow-up.js';\nexport { default as BanknoteX, default as BanknoteXIcon, default as LucideBanknoteX } from './icons/banknote-x.js';\nexport { default as Banknote, default as BanknoteIcon, default as LucideBanknote } from './icons/banknote.js';\nexport { default as Barcode, default as BarcodeIcon, default as LucideBarcode } from './icons/barcode.js';\nexport { default as Barrel, default as BarrelIcon, default as LucideBarrel } from './icons/barrel.js';\nexport { default as Baseline, default as BaselineIcon, default as LucideBaseline } from './icons/baseline.js';\nexport { default as Bath, default as BathIcon, default as LucideBath } from './icons/bath.js';\nexport { default as BatteryCharging, default as BatteryChargingIcon, default as LucideBatteryCharging } from './icons/battery-charging.js';\nexport { default as BatteryFull, default as BatteryFullIcon, default as LucideBatteryFull } from './icons/battery-full.js';\nexport { default as BatteryLow, default as BatteryLowIcon, default as LucideBatteryLow } from './icons/battery-low.js';\nexport { default as BatteryMedium, default as BatteryMediumIcon, default as LucideBatteryMedium } from './icons/battery-medium.js';\nexport { default as BatteryPlus, default as BatteryPlusIcon, default as LucideBatteryPlus } from './icons/battery-plus.js';\nexport { default as BatteryWarning, default as BatteryWarningIcon, default as LucideBatteryWarning } from './icons/battery-warning.js';\nexport { default as Battery, default as BatteryIcon, default as LucideBattery } from './icons/battery.js';\nexport { default as Beaker, default as BeakerIcon, default as LucideBeaker } from './icons/beaker.js';\nexport { default as BeanOff, default as BeanOffIcon, default as LucideBeanOff } from './icons/bean-off.js';\nexport { default as Bean, default as BeanIcon, default as LucideBean } from './icons/bean.js';\nexport { default as BedDouble, default as BedDoubleIcon, default as LucideBedDouble } from './icons/bed-double.js';\nexport { default as BedSingle, default as BedSingleIcon, default as LucideBedSingle } from './icons/bed-single.js';\nexport { default as Bed, default as BedIcon, default as LucideBed } from './icons/bed.js';\nexport { default as Beef, default as BeefIcon, default as LucideBeef } from './icons/beef.js';\nexport { default as Beer, default as BeerIcon, default as LucideBeer } from './icons/beer.js';\nexport { default as BeerOff, default as BeerOffIcon, default as LucideBeerOff } from './icons/beer-off.js';\nexport { default as BellDot, default as BellDotIcon, default as LucideBellDot } from './icons/bell-dot.js';\nexport { default as BellMinus, default as BellMinusIcon, default as LucideBellMinus } from './icons/bell-minus.js';\nexport { default as BellElectric, default as BellElectricIcon, default as LucideBellElectric } from './icons/bell-electric.js';\nexport { default as BellOff, default as BellOffIcon, default as LucideBellOff } from './icons/bell-off.js';\nexport { default as BellPlus, default as BellPlusIcon, default as LucideBellPlus } from './icons/bell-plus.js';\nexport { default as BellRing, default as BellRingIcon, default as LucideBellRing } from './icons/bell-ring.js';\nexport { default as Bell, default as BellIcon, default as LucideBell } from './icons/bell.js';\nexport { default as BetweenVerticalEnd, default as BetweenVerticalEndIcon, default as LucideBetweenVerticalEnd } from './icons/between-vertical-end.js';\nexport { default as BicepsFlexed, default as BicepsFlexedIcon, default as LucideBicepsFlexed } from './icons/biceps-flexed.js';\nexport { default as Bike, default as BikeIcon, default as LucideBike } from './icons/bike.js';\nexport { default as BetweenVerticalStart, default as BetweenVerticalStartIcon, default as LucideBetweenVerticalStart } from './icons/between-vertical-start.js';\nexport { default as Binary, default as BinaryIcon, default as LucideBinary } from './icons/binary.js';\nexport { default as Binoculars, default as BinocularsIcon, default as LucideBinoculars } from './icons/binoculars.js';\nexport { default as Biohazard, default as BiohazardIcon, default as LucideBiohazard } from './icons/biohazard.js';\nexport { default as Bird, default as BirdIcon, default as LucideBird } from './icons/bird.js';\nexport { default as Birdhouse, default as BirdhouseIcon, default as LucideBirdhouse } from './icons/birdhouse.js';\nexport { default as Bitcoin, default as BitcoinIcon, default as LucideBitcoin } from './icons/bitcoin.js';\nexport { default as Blend, default as BlendIcon, default as LucideBlend } from './icons/blend.js';\nexport { default as Blinds, default as BlindsIcon, default as LucideBlinds } from './icons/blinds.js';\nexport { default as Blocks, default as BlocksIcon, default as LucideBlocks } from './icons/blocks.js';\nexport { default as BluetoothOff, default as BluetoothOffIcon, default as LucideBluetoothOff } from './icons/bluetooth-off.js';\nexport { default as BluetoothConnected, default as BluetoothConnectedIcon, default as LucideBluetoothConnected } from './icons/bluetooth-connected.js';\nexport { default as BluetoothSearching, default as BluetoothSearchingIcon, default as LucideBluetoothSearching } from './icons/bluetooth-searching.js';\nexport { default as Bluetooth, default as BluetoothIcon, default as LucideBluetooth } from './icons/bluetooth.js';\nexport { default as Bold, default as BoldIcon, default as LucideBold } from './icons/bold.js';\nexport { default as Bolt, default as BoltIcon, default as LucideBolt } from './icons/bolt.js';\nexport { default as Bomb, default as BombIcon, default as LucideBomb } from './icons/bomb.js';\nexport { default as Bone, default as BoneIcon, default as LucideBone } from './icons/bone.js';\nexport { default as BookA, default as BookAIcon, default as LucideBookA } from './icons/book-a.js';\nexport { default as BookAlert, default as BookAlertIcon, default as LucideBookAlert } from './icons/book-alert.js';\nexport { default as BookAudio, default as BookAudioIcon, default as LucideBookAudio } from './icons/book-audio.js';\nexport { default as BookCheck, default as BookCheckIcon, default as LucideBookCheck } from './icons/book-check.js';\nexport { default as BookCopy, default as BookCopyIcon, default as LucideBookCopy } from './icons/book-copy.js';\nexport { default as BookDown, default as BookDownIcon, default as LucideBookDown } from './icons/book-down.js';\nexport { default as BookHeadphones, default as BookHeadphonesIcon, default as LucideBookHeadphones } from './icons/book-headphones.js';\nexport { default as BookHeart, default as BookHeartIcon, default as LucideBookHeart } from './icons/book-heart.js';\nexport { default as BookImage, default as BookImageIcon, default as LucideBookImage } from './icons/book-image.js';\nexport { default as BookKey, default as BookKeyIcon, default as LucideBookKey } from './icons/book-key.js';\nexport { default as BookLock, default as BookLockIcon, default as LucideBookLock } from './icons/book-lock.js';\nexport { default as BookMarked, default as BookMarkedIcon, default as LucideBookMarked } from './icons/book-marked.js';\nexport { default as BookMinus, default as BookMinusIcon, default as LucideBookMinus } from './icons/book-minus.js';\nexport { default as BookOpenCheck, default as BookOpenCheckIcon, default as LucideBookOpenCheck } from './icons/book-open-check.js';\nexport { default as BookOpenText, default as BookOpenTextIcon, default as LucideBookOpenText } from './icons/book-open-text.js';\nexport { default as BookOpen, default as BookOpenIcon, default as LucideBookOpen } from './icons/book-open.js';\nexport { default as BookPlus, default as BookPlusIcon, default as LucideBookPlus } from './icons/book-plus.js';\nexport { default as BookSearch, default as BookSearchIcon, default as LucideBookSearch } from './icons/book-search.js';\nexport { default as BookText, default as BookTextIcon, default as LucideBookText } from './icons/book-text.js';\nexport { default as BookType, default as BookTypeIcon, default as LucideBookType } from './icons/book-type.js';\nexport { default as BookUp, default as BookUpIcon, default as LucideBookUp } from './icons/book-up.js';\nexport { default as BookUser, default as BookUserIcon, default as LucideBookUser } from './icons/book-user.js';\nexport { default as BookUp2, default as BookUp2Icon, default as LucideBookUp2 } from './icons/book-up-2.js';\nexport { default as BookX, default as BookXIcon, default as LucideBookX } from './icons/book-x.js';\nexport { default as Book, default as BookIcon, default as LucideBook } from './icons/book.js';\nexport { default as BookmarkCheck, default as BookmarkCheckIcon, default as LucideBookmarkCheck } from './icons/bookmark-check.js';\nexport { default as BookmarkPlus, default as BookmarkPlusIcon, default as LucideBookmarkPlus } from './icons/bookmark-plus.js';\nexport { default as BookmarkX, default as BookmarkXIcon, default as LucideBookmarkX } from './icons/bookmark-x.js';\nexport { default as BookmarkMinus, default as BookmarkMinusIcon, default as LucideBookmarkMinus } from './icons/bookmark-minus.js';\nexport { default as Bookmark, default as BookmarkIcon, default as LucideBookmark } from './icons/bookmark.js';\nexport { default as BoomBox, default as BoomBoxIcon, default as LucideBoomBox } from './icons/boom-box.js';\nexport { default as BotMessageSquare, default as BotMessageSquareIcon, default as LucideBotMessageSquare } from './icons/bot-message-square.js';\nexport { default as BotOff, default as BotOffIcon, default as LucideBotOff } from './icons/bot-off.js';\nexport { default as Bot, default as BotIcon, default as LucideBot } from './icons/bot.js';\nexport { default as BottleWine, default as BottleWineIcon, default as LucideBottleWine } from './icons/bottle-wine.js';\nexport { default as BowArrow, default as BowArrowIcon, default as LucideBowArrow } from './icons/bow-arrow.js';\nexport { default as Box, default as BoxIcon, default as LucideBox } from './icons/box.js';\nexport { default as Boxes, default as BoxesIcon, default as LucideBoxes } from './icons/boxes.js';\nexport { default as Brackets, default as BracketsIcon, default as LucideBrackets } from './icons/brackets.js';\nexport { default as BrainCircuit, default as BrainCircuitIcon, default as LucideBrainCircuit } from './icons/brain-circuit.js';\nexport { default as BrainCog, default as BrainCogIcon, default as LucideBrainCog } from './icons/brain-cog.js';\nexport { default as Brain, default as BrainIcon, default as LucideBrain } from './icons/brain.js';\nexport { default as BrickWallFire, default as BrickWallFireIcon, default as LucideBrickWallFire } from './icons/brick-wall-fire.js';\nexport { default as BrickWallShield, default as BrickWallShieldIcon, default as LucideBrickWallShield } from './icons/brick-wall-shield.js';\nexport { default as BrickWall, default as BrickWallIcon, default as LucideBrickWall } from './icons/brick-wall.js';\nexport { default as BriefcaseBusiness, default as BriefcaseBusinessIcon, default as LucideBriefcaseBusiness } from './icons/briefcase-business.js';\nexport { default as BriefcaseConveyorBelt, default as BriefcaseConveyorBeltIcon, default as LucideBriefcaseConveyorBelt } from './icons/briefcase-conveyor-belt.js';\nexport { default as BriefcaseMedical, default as BriefcaseMedicalIcon, default as LucideBriefcaseMedical } from './icons/briefcase-medical.js';\nexport { default as BringToFront, default as BringToFrontIcon, default as LucideBringToFront } from './icons/bring-to-front.js';\nexport { default as Briefcase, default as BriefcaseIcon, default as LucideBriefcase } from './icons/briefcase.js';\nexport { default as BrushCleaning, default as BrushCleaningIcon, default as LucideBrushCleaning } from './icons/brush-cleaning.js';\nexport { default as Brush, default as BrushIcon, default as LucideBrush } from './icons/brush.js';\nexport { default as Bubbles, default as BubblesIcon, default as LucideBubbles } from './icons/bubbles.js';\nexport { default as BugOff, default as BugOffIcon, default as LucideBugOff } from './icons/bug-off.js';\nexport { default as Bug, default as BugIcon, default as LucideBug } from './icons/bug.js';\nexport { default as BugPlay, default as BugPlayIcon, default as LucideBugPlay } from './icons/bug-play.js';\nexport { default as Building2, default as Building2Icon, default as LucideBuilding2 } from './icons/building-2.js';\nexport { default as Building, default as BuildingIcon, default as LucideBuilding } from './icons/building.js';\nexport { default as BusFront, default as BusFrontIcon, default as LucideBusFront } from './icons/bus-front.js';\nexport { default as Bus, default as BusIcon, default as LucideBus } from './icons/bus.js';\nexport { default as CableCar, default as CableCarIcon, default as LucideCableCar } from './icons/cable-car.js';\nexport { default as Cable, default as CableIcon, default as LucideCable } from './icons/cable.js';\nexport { default as CakeSlice, default as CakeSliceIcon, default as LucideCakeSlice } from './icons/cake-slice.js';\nexport { default as Cake, default as CakeIcon, default as LucideCake } from './icons/cake.js';\nexport { default as Calculator, default as CalculatorIcon, default as LucideCalculator } from './icons/calculator.js';\nexport { default as Calendar1, default as Calendar1Icon, default as LucideCalendar1 } from './icons/calendar-1.js';\nexport { default as CalendarArrowDown, default as CalendarArrowDownIcon, default as LucideCalendarArrowDown } from './icons/calendar-arrow-down.js';\nexport { default as CalendarArrowUp, default as CalendarArrowUpIcon, default as LucideCalendarArrowUp } from './icons/calendar-arrow-up.js';\nexport { default as CalendarCheck2, default as CalendarCheck2Icon, default as LucideCalendarCheck2 } from './icons/calendar-check-2.js';\nexport { default as CalendarClock, default as CalendarClockIcon, default as LucideCalendarClock } from './icons/calendar-clock.js';\nexport { default as CalendarCheck, default as CalendarCheckIcon, default as LucideCalendarCheck } from './icons/calendar-check.js';\nexport { default as CalendarCog, default as CalendarCogIcon, default as LucideCalendarCog } from './icons/calendar-cog.js';\nexport { default as CalendarDays, default as CalendarDaysIcon, default as LucideCalendarDays } from './icons/calendar-days.js';\nexport { default as CalendarFold, default as CalendarFoldIcon, default as LucideCalendarFold } from './icons/calendar-fold.js';\nexport { default as CalendarHeart, default as CalendarHeartIcon, default as LucideCalendarHeart } from './icons/calendar-heart.js';\nexport { default as CalendarMinus2, default as CalendarMinus2Icon, default as LucideCalendarMinus2 } from './icons/calendar-minus-2.js';\nexport { default as CalendarMinus, default as CalendarMinusIcon, default as LucideCalendarMinus } from './icons/calendar-minus.js';\nexport { default as CalendarOff, default as CalendarOffIcon, default as LucideCalendarOff } from './icons/calendar-off.js';\nexport { default as CalendarPlus2, default as CalendarPlus2Icon, default as LucideCalendarPlus2 } from './icons/calendar-plus-2.js';\nexport { default as CalendarPlus, default as CalendarPlusIcon, default as LucideCalendarPlus } from './icons/calendar-plus.js';\nexport { default as CalendarRange, default as CalendarRangeIcon, default as LucideCalendarRange } from './icons/calendar-range.js';\nexport { default as CalendarSearch, default as CalendarSearchIcon, default as LucideCalendarSearch } from './icons/calendar-search.js';\nexport { default as CalendarSync, default as CalendarSyncIcon, default as LucideCalendarSync } from './icons/calendar-sync.js';\nexport { default as CalendarX2, default as CalendarX2Icon, default as LucideCalendarX2 } from './icons/calendar-x-2.js';\nexport { default as CalendarX, default as CalendarXIcon, default as LucideCalendarX } from './icons/calendar-x.js';\nexport { default as Calendar, default as CalendarIcon, default as LucideCalendar } from './icons/calendar.js';\nexport { default as Calendars, default as CalendarsIcon, default as LucideCalendars } from './icons/calendars.js';\nexport { default as CameraOff, default as CameraOffIcon, default as LucideCameraOff } from './icons/camera-off.js';\nexport { default as Camera, default as CameraIcon, default as LucideCamera } from './icons/camera.js';\nexport { default as CandyCane, default as CandyCaneIcon, default as LucideCandyCane } from './icons/candy-cane.js';\nexport { default as CandyOff, default as CandyOffIcon, default as LucideCandyOff } from './icons/candy-off.js';\nexport { default as Candy, default as CandyIcon, default as LucideCandy } from './icons/candy.js';\nexport { default as CannabisOff, default as CannabisOffIcon, default as LucideCannabisOff } from './icons/cannabis-off.js';\nexport { default as Cannabis, default as CannabisIcon, default as LucideCannabis } from './icons/cannabis.js';\nexport { default as CaptionsOff, default as CaptionsOffIcon, default as LucideCaptionsOff } from './icons/captions-off.js';\nexport { default as CarFront, default as CarFrontIcon, default as LucideCarFront } from './icons/car-front.js';\nexport { default as CarTaxiFront, default as CarTaxiFrontIcon, default as LucideCarTaxiFront } from './icons/car-taxi-front.js';\nexport { default as Car, default as CarIcon, default as LucideCar } from './icons/car.js';\nexport { default as Caravan, default as CaravanIcon, default as LucideCaravan } from './icons/caravan.js';\nexport { default as CardSim, default as CardSimIcon, default as LucideCardSim } from './icons/card-sim.js';\nexport { default as Carrot, default as CarrotIcon, default as LucideCarrot } from './icons/carrot.js';\nexport { default as CaseLower, default as CaseLowerIcon, default as LucideCaseLower } from './icons/case-lower.js';\nexport { default as CaseSensitive, default as CaseSensitiveIcon, default as LucideCaseSensitive } from './icons/case-sensitive.js';\nexport { default as CaseUpper, default as CaseUpperIcon, default as LucideCaseUpper } from './icons/case-upper.js';\nexport { default as CassetteTape, default as CassetteTapeIcon, default as LucideCassetteTape } from './icons/cassette-tape.js';\nexport { default as Cast, default as CastIcon, default as LucideCast } from './icons/cast.js';\nexport { default as Castle, default as CastleIcon, default as LucideCastle } from './icons/castle.js';\nexport { default as Cat, default as CatIcon, default as LucideCat } from './icons/cat.js';\nexport { default as Cctv, default as CctvIcon, default as LucideCctv } from './icons/cctv.js';\nexport { default as ChartBarDecreasing, default as ChartBarDecreasingIcon, default as LucideChartBarDecreasing } from './icons/chart-bar-decreasing.js';\nexport { default as ChartBarIncreasing, default as ChartBarIncreasingIcon, default as LucideChartBarIncreasing } from './icons/chart-bar-increasing.js';\nexport { default as ChartBarStacked, default as ChartBarStackedIcon, default as LucideChartBarStacked } from './icons/chart-bar-stacked.js';\nexport { default as ChartColumnDecreasing, default as ChartColumnDecreasingIcon, default as LucideChartColumnDecreasing } from './icons/chart-column-decreasing.js';\nexport { default as ChartColumnStacked, default as ChartColumnStackedIcon, default as LucideChartColumnStacked } from './icons/chart-column-stacked.js';\nexport { default as ChartGantt, default as ChartGanttIcon, default as LucideChartGantt } from './icons/chart-gantt.js';\nexport { default as ChartNetwork, default as ChartNetworkIcon, default as LucideChartNetwork } from './icons/chart-network.js';\nexport { default as ChartNoAxesColumnDecreasing, default as ChartNoAxesColumnDecreasingIcon, default as LucideChartNoAxesColumnDecreasing } from './icons/chart-no-axes-column-decreasing.js';\nexport { default as ChartNoAxesCombined, default as ChartNoAxesCombinedIcon, default as LucideChartNoAxesCombined } from './icons/chart-no-axes-combined.js';\nexport { default as ChartSpline, default as ChartSplineIcon, default as LucideChartSpline } from './icons/chart-spline.js';\nexport { default as CheckCheck, default as CheckCheckIcon, default as LucideCheckCheck } from './icons/check-check.js';\nexport { default as CheckLine, default as CheckLineIcon, default as LucideCheckLine } from './icons/check-line.js';\nexport { default as Check, default as CheckIcon, default as LucideCheck } from './icons/check.js';\nexport { default as Cherry, default as CherryIcon, default as LucideCherry } from './icons/cherry.js';\nexport { default as ChefHat, default as ChefHatIcon, default as LucideChefHat } from './icons/chef-hat.js';\nexport { default as ChessBishop, default as ChessBishopIcon, default as LucideChessBishop } from './icons/chess-bishop.js';\nexport { default as ChessKing, default as ChessKingIcon, default as LucideChessKing } from './icons/chess-king.js';\nexport { default as ChessPawn, default as ChessPawnIcon, default as LucideChessPawn } from './icons/chess-pawn.js';\nexport { default as ChessKnight, default as ChessKnightIcon, default as LucideChessKnight } from './icons/chess-knight.js';\nexport { default as ChessQueen, default as ChessQueenIcon, default as LucideChessQueen } from './icons/chess-queen.js';\nexport { default as ChessRook, default as ChessRookIcon, default as LucideChessRook } from './icons/chess-rook.js';\nexport { default as ChevronDown, default as ChevronDownIcon, default as LucideChevronDown } from './icons/chevron-down.js';\nexport { default as ChevronFirst, default as ChevronFirstIcon, default as LucideChevronFirst } from './icons/chevron-first.js';\nexport { default as ChevronLast, default as ChevronLastIcon, default as LucideChevronLast } from './icons/chevron-last.js';\nexport { default as ChevronLeft, default as ChevronLeftIcon, default as LucideChevronLeft } from './icons/chevron-left.js';\nexport { default as ChevronRight, default as ChevronRightIcon, default as LucideChevronRight } from './icons/chevron-right.js';\nexport { default as ChevronUp, default as ChevronUpIcon, default as LucideChevronUp } from './icons/chevron-up.js';\nexport { default as ChevronsDown, default as ChevronsDownIcon, default as LucideChevronsDown } from './icons/chevrons-down.js';\nexport { default as ChevronsDownUp, default as ChevronsDownUpIcon, default as LucideChevronsDownUp } from './icons/chevrons-down-up.js';\nexport { default as ChevronsLeftRightEllipsis, default as ChevronsLeftRightEllipsisIcon, default as LucideChevronsLeftRightEllipsis } from './icons/chevrons-left-right-ellipsis.js';\nexport { default as ChevronsLeftRight, default as ChevronsLeftRightIcon, default as LucideChevronsLeftRight } from './icons/chevrons-left-right.js';\nexport { default as ChevronsLeft, default as ChevronsLeftIcon, default as LucideChevronsLeft } from './icons/chevrons-left.js';\nexport { default as ChevronsRightLeft, default as ChevronsRightLeftIcon, default as LucideChevronsRightLeft } from './icons/chevrons-right-left.js';\nexport { default as ChevronsRight, default as ChevronsRightIcon, default as LucideChevronsRight } from './icons/chevrons-right.js';\nexport { default as ChevronsUpDown, default as ChevronsUpDownIcon, default as LucideChevronsUpDown } from './icons/chevrons-up-down.js';\nexport { default as ChevronsUp, default as ChevronsUpIcon, default as LucideChevronsUp } from './icons/chevrons-up.js';\nexport { default as Church, default as ChurchIcon, default as LucideChurch } from './icons/church.js';\nexport { default as CigaretteOff, default as CigaretteOffIcon, default as LucideCigaretteOff } from './icons/cigarette-off.js';\nexport { default as Cigarette, default as CigaretteIcon, default as LucideCigarette } from './icons/cigarette.js';\nexport { default as CircleDashed, default as CircleDashedIcon, default as LucideCircleDashed } from './icons/circle-dashed.js';\nexport { default as CircleDollarSign, default as CircleDollarSignIcon, default as LucideCircleDollarSign } from './icons/circle-dollar-sign.js';\nexport { default as CircleDotDashed, default as CircleDotDashedIcon, default as LucideCircleDotDashed } from './icons/circle-dot-dashed.js';\nexport { default as CircleDot, default as CircleDotIcon, default as LucideCircleDot } from './icons/circle-dot.js';\nexport { default as CircleEllipsis, default as CircleEllipsisIcon, default as LucideCircleEllipsis } from './icons/circle-ellipsis.js';\nexport { default as CircleEqual, default as CircleEqualIcon, default as LucideCircleEqual } from './icons/circle-equal.js';\nexport { default as CircleFadingArrowUp, default as CircleFadingArrowUpIcon, default as LucideCircleFadingArrowUp } from './icons/circle-fading-arrow-up.js';\nexport { default as CircleFadingPlus, default as CircleFadingPlusIcon, default as LucideCircleFadingPlus } from './icons/circle-fading-plus.js';\nexport { default as CircleOff, default as CircleOffIcon, default as LucideCircleOff } from './icons/circle-off.js';\nexport { default as CirclePile, default as CirclePileIcon, default as LucideCirclePile } from './icons/circle-pile.js';\nexport { default as CirclePoundSterling, default as CirclePoundSterlingIcon, default as LucideCirclePoundSterling } from './icons/circle-pound-sterling.js';\nexport { default as CircleSlash, default as CircleSlashIcon, default as LucideCircleSlash } from './icons/circle-slash.js';\nexport { default as CircleStar, default as CircleStarIcon, default as LucideCircleStar } from './icons/circle-star.js';\nexport { default as CircleSmall, default as CircleSmallIcon, default as LucideCircleSmall } from './icons/circle-small.js';\nexport { default as Circle, default as CircleIcon, default as LucideCircle } from './icons/circle.js';\nexport { default as CircuitBoard, default as CircuitBoardIcon, default as LucideCircuitBoard } from './icons/circuit-board.js';\nexport { default as Citrus, default as CitrusIcon, default as LucideCitrus } from './icons/citrus.js';\nexport { default as Clapperboard, default as ClapperboardIcon, default as LucideClapperboard } from './icons/clapperboard.js';\nexport { default as ClipboardClock, default as ClipboardClockIcon, default as LucideClipboardClock } from './icons/clipboard-clock.js';\nexport { default as ClipboardCheck, default as ClipboardCheckIcon, default as LucideClipboardCheck } from './icons/clipboard-check.js';\nexport { default as ClipboardCopy, default as ClipboardCopyIcon, default as LucideClipboardCopy } from './icons/clipboard-copy.js';\nexport { default as ClipboardList, default as ClipboardListIcon, default as LucideClipboardList } from './icons/clipboard-list.js';\nexport { default as ClipboardPaste, default as ClipboardPasteIcon, default as LucideClipboardPaste } from './icons/clipboard-paste.js';\nexport { default as ClipboardMinus, default as ClipboardMinusIcon, default as LucideClipboardMinus } from './icons/clipboard-minus.js';\nexport { default as ClipboardPlus, default as ClipboardPlusIcon, default as LucideClipboardPlus } from './icons/clipboard-plus.js';\nexport { default as ClipboardType, default as ClipboardTypeIcon, default as LucideClipboardType } from './icons/clipboard-type.js';\nexport { default as ClipboardX, default as ClipboardXIcon, default as LucideClipboardX } from './icons/clipboard-x.js';\nexport { default as Clipboard, default as ClipboardIcon, default as LucideClipboard } from './icons/clipboard.js';\nexport { default as Clock1, default as Clock1Icon, default as LucideClock1 } from './icons/clock-1.js';\nexport { default as Clock10, default as Clock10Icon, default as LucideClock10 } from './icons/clock-10.js';\nexport { default as Clock11, default as Clock11Icon, default as LucideClock11 } from './icons/clock-11.js';\nexport { default as Clock12, default as Clock12Icon, default as LucideClock12 } from './icons/clock-12.js';\nexport { default as Clock2, default as Clock2Icon, default as LucideClock2 } from './icons/clock-2.js';\nexport { default as Clock3, default as Clock3Icon, default as LucideClock3 } from './icons/clock-3.js';\nexport { default as Clock4, default as Clock4Icon, default as LucideClock4 } from './icons/clock-4.js';\nexport { default as Clock5, default as Clock5Icon, default as LucideClock5 } from './icons/clock-5.js';\nexport { default as Clock6, default as Clock6Icon, default as LucideClock6 } from './icons/clock-6.js';\nexport { default as Clock7, default as Clock7Icon, default as LucideClock7 } from './icons/clock-7.js';\nexport { default as Clock8, default as Clock8Icon, default as LucideClock8 } from './icons/clock-8.js';\nexport { default as Clock9, default as Clock9Icon, default as LucideClock9 } from './icons/clock-9.js';\nexport { default as ClockAlert, default as ClockAlertIcon, default as LucideClockAlert } from './icons/clock-alert.js';\nexport { default as ClockArrowDown, default as ClockArrowDownIcon, default as LucideClockArrowDown } from './icons/clock-arrow-down.js';\nexport { default as ClockArrowUp, default as ClockArrowUpIcon, default as LucideClockArrowUp } from './icons/clock-arrow-up.js';\nexport { default as ClockFading, default as ClockFadingIcon, default as LucideClockFading } from './icons/clock-fading.js';\nexport { default as ClockCheck, default as ClockCheckIcon, default as LucideClockCheck } from './icons/clock-check.js';\nexport { default as Clock, default as ClockIcon, default as LucideClock } from './icons/clock.js';\nexport { default as ClockPlus, default as ClockPlusIcon, default as LucideClockPlus } from './icons/clock-plus.js';\nexport { default as ClosedCaption, default as ClosedCaptionIcon, default as LucideClosedCaption } from './icons/closed-caption.js';\nexport { default as CloudAlert, default as CloudAlertIcon, default as LucideCloudAlert } from './icons/cloud-alert.js';\nexport { default as CloudBackup, default as CloudBackupIcon, default as LucideCloudBackup } from './icons/cloud-backup.js';\nexport { default as CloudCheck, default as CloudCheckIcon, default as LucideCloudCheck } from './icons/cloud-check.js';\nexport { default as CloudCog, default as CloudCogIcon, default as LucideCloudCog } from './icons/cloud-cog.js';\nexport { default as CloudDrizzle, default as CloudDrizzleIcon, default as LucideCloudDrizzle } from './icons/cloud-drizzle.js';\nexport { default as CloudFog, default as CloudFogIcon, default as LucideCloudFog } from './icons/cloud-fog.js';\nexport { default as CloudHail, default as CloudHailIcon, default as LucideCloudHail } from './icons/cloud-hail.js';\nexport { default as CloudLightning, default as CloudLightningIcon, default as LucideCloudLightning } from './icons/cloud-lightning.js';\nexport { default as CloudMoonRain, default as CloudMoonRainIcon, default as LucideCloudMoonRain } from './icons/cloud-moon-rain.js';\nexport { default as CloudMoon, default as CloudMoonIcon, default as LucideCloudMoon } from './icons/cloud-moon.js';\nexport { default as CloudRainWind, default as CloudRainWindIcon, default as LucideCloudRainWind } from './icons/cloud-rain-wind.js';\nexport { default as CloudRain, default as CloudRainIcon, default as LucideCloudRain } from './icons/cloud-rain.js';\nexport { default as CloudOff, default as CloudOffIcon, default as LucideCloudOff } from './icons/cloud-off.js';\nexport { default as CloudSnow, default as CloudSnowIcon, default as LucideCloudSnow } from './icons/cloud-snow.js';\nexport { default as CloudSunRain, default as CloudSunRainIcon, default as LucideCloudSunRain } from './icons/cloud-sun-rain.js';\nexport { default as CloudSun, default as CloudSunIcon, default as LucideCloudSun } from './icons/cloud-sun.js';\nexport { default as CloudSync, default as CloudSyncIcon, default as LucideCloudSync } from './icons/cloud-sync.js';\nexport { default as Cloud, default as CloudIcon, default as LucideCloud } from './icons/cloud.js';\nexport { default as Cloudy, default as CloudyIcon, default as LucideCloudy } from './icons/cloudy.js';\nexport { default as Clover, default as CloverIcon, default as LucideClover } from './icons/clover.js';\nexport { default as Codepen, default as CodepenIcon, default as LucideCodepen } from './icons/codepen.js';\nexport { default as Club, default as ClubIcon, default as LucideClub } from './icons/club.js';\nexport { default as Code, default as CodeIcon, default as LucideCode } from './icons/code.js';\nexport { default as Codesandbox, default as CodesandboxIcon, default as LucideCodesandbox } from './icons/codesandbox.js';\nexport { default as Coffee, default as CoffeeIcon, default as LucideCoffee } from './icons/coffee.js';\nexport { default as Cog, default as CogIcon, default as LucideCog } from './icons/cog.js';\nexport { default as Coins, default as CoinsIcon, default as LucideCoins } from './icons/coins.js';\nexport { default as Columns4, default as Columns4Icon, default as LucideColumns4 } from './icons/columns-4.js';\nexport { default as Combine, default as CombineIcon, default as LucideCombine } from './icons/combine.js';\nexport { default as Command, default as CommandIcon, default as LucideCommand } from './icons/command.js';\nexport { default as Compass, default as CompassIcon, default as LucideCompass } from './icons/compass.js';\nexport { default as Component, default as ComponentIcon, default as LucideComponent } from './icons/component.js';\nexport { default as Computer, default as ComputerIcon, default as LucideComputer } from './icons/computer.js';\nexport { default as ConciergeBell, default as ConciergeBellIcon, default as LucideConciergeBell } from './icons/concierge-bell.js';\nexport { default as Cone, default as ConeIcon, default as LucideCone } from './icons/cone.js';\nexport { default as Construction, default as ConstructionIcon, default as LucideConstruction } from './icons/construction.js';\nexport { default as Contact, default as ContactIcon, default as LucideContact } from './icons/contact.js';\nexport { default as Container, default as ContainerIcon, default as LucideContainer } from './icons/container.js';\nexport { default as Contrast, default as ContrastIcon, default as LucideContrast } from './icons/contrast.js';\nexport { default as CookingPot, default as CookingPotIcon, default as LucideCookingPot } from './icons/cooking-pot.js';\nexport { default as Cookie, default as CookieIcon, default as LucideCookie } from './icons/cookie.js';\nexport { default as CopyCheck, default as CopyCheckIcon, default as LucideCopyCheck } from './icons/copy-check.js';\nexport { default as CopyMinus, default as CopyMinusIcon, default as LucideCopyMinus } from './icons/copy-minus.js';\nexport { default as CopyPlus, default as CopyPlusIcon, default as LucideCopyPlus } from './icons/copy-plus.js';\nexport { default as CopySlash, default as CopySlashIcon, default as LucideCopySlash } from './icons/copy-slash.js';\nexport { default as CopyX, default as CopyXIcon, default as LucideCopyX } from './icons/copy-x.js';\nexport { default as Copy, default as CopyIcon, default as LucideCopy } from './icons/copy.js';\nexport { default as Copyleft, default as CopyleftIcon, default as LucideCopyleft } from './icons/copyleft.js';\nexport { default as Copyright, default as CopyrightIcon, default as LucideCopyright } from './icons/copyright.js';\nexport { default as CornerDownLeft, default as CornerDownLeftIcon, default as LucideCornerDownLeft } from './icons/corner-down-left.js';\nexport { default as CornerDownRight, default as CornerDownRightIcon, default as LucideCornerDownRight } from './icons/corner-down-right.js';\nexport { default as CornerLeftDown, default as CornerLeftDownIcon, default as LucideCornerLeftDown } from './icons/corner-left-down.js';\nexport { default as CornerLeftUp, default as CornerLeftUpIcon, default as LucideCornerLeftUp } from './icons/corner-left-up.js';\nexport { default as CornerRightDown, default as CornerRightDownIcon, default as LucideCornerRightDown } from './icons/corner-right-down.js';\nexport { default as CornerRightUp, default as CornerRightUpIcon, default as LucideCornerRightUp } from './icons/corner-right-up.js';\nexport { default as CornerUpLeft, default as CornerUpLeftIcon, default as LucideCornerUpLeft } from './icons/corner-up-left.js';\nexport { default as CornerUpRight, default as CornerUpRightIcon, default as LucideCornerUpRight } from './icons/corner-up-right.js';\nexport { default as Cpu, default as CpuIcon, default as LucideCpu } from './icons/cpu.js';\nexport { default as CreativeCommons, default as CreativeCommonsIcon, default as LucideCreativeCommons } from './icons/creative-commons.js';\nexport { default as CreditCard, default as CreditCardIcon, default as LucideCreditCard } from './icons/credit-card.js';\nexport { default as Croissant, default as CroissantIcon, default as LucideCroissant } from './icons/croissant.js';\nexport { default as Cross, default as CrossIcon, default as LucideCross } from './icons/cross.js';\nexport { default as Crosshair, default as CrosshairIcon, default as LucideCrosshair } from './icons/crosshair.js';\nexport { default as Crop, default as CropIcon, default as LucideCrop } from './icons/crop.js';\nexport { default as Crown, default as CrownIcon, default as LucideCrown } from './icons/crown.js';\nexport { default as Cuboid, default as CuboidIcon, default as LucideCuboid } from './icons/cuboid.js';\nexport { default as CupSoda, default as CupSodaIcon, default as LucideCupSoda } from './icons/cup-soda.js';\nexport { default as Cylinder, default as CylinderIcon, default as LucideCylinder } from './icons/cylinder.js';\nexport { default as Currency, default as CurrencyIcon, default as LucideCurrency } from './icons/currency.js';\nexport { default as Dam, default as DamIcon, default as LucideDam } from './icons/dam.js';\nexport { default as DatabaseBackup, default as DatabaseBackupIcon, default as LucideDatabaseBackup } from './icons/database-backup.js';\nexport { default as DatabaseZap, default as DatabaseZapIcon, default as LucideDatabaseZap } from './icons/database-zap.js';\nexport { default as Database, default as DatabaseIcon, default as LucideDatabase } from './icons/database.js';\nexport { default as DecimalsArrowLeft, default as DecimalsArrowLeftIcon, default as LucideDecimalsArrowLeft } from './icons/decimals-arrow-left.js';\nexport { default as DecimalsArrowRight, default as DecimalsArrowRightIcon, default as LucideDecimalsArrowRight } from './icons/decimals-arrow-right.js';\nexport { default as Delete, default as DeleteIcon, default as LucideDelete } from './icons/delete.js';\nexport { default as Dessert, default as DessertIcon, default as LucideDessert } from './icons/dessert.js';\nexport { default as Diameter, default as DiameterIcon, default as LucideDiameter } from './icons/diameter.js';\nexport { default as DiamondMinus, default as DiamondMinusIcon, default as LucideDiamondMinus } from './icons/diamond-minus.js';\nexport { default as DiamondPlus, default as DiamondPlusIcon, default as LucideDiamondPlus } from './icons/diamond-plus.js';\nexport { default as Diamond, default as DiamondIcon, default as LucideDiamond } from './icons/diamond.js';\nexport { default as Dice1, default as Dice1Icon, default as LucideDice1 } from './icons/dice-1.js';\nexport { default as Dice2, default as Dice2Icon, default as LucideDice2 } from './icons/dice-2.js';\nexport { default as Dice3, default as Dice3Icon, default as LucideDice3 } from './icons/dice-3.js';\nexport { default as Dice4, default as Dice4Icon, default as LucideDice4 } from './icons/dice-4.js';\nexport { default as Dice5, default as Dice5Icon, default as LucideDice5 } from './icons/dice-5.js';\nexport { default as Dice6, default as Dice6Icon, default as LucideDice6 } from './icons/dice-6.js';\nexport { default as Dices, default as DicesIcon, default as LucideDices } from './icons/dices.js';\nexport { default as Diff, default as DiffIcon, default as LucideDiff } from './icons/diff.js';\nexport { default as Disc2, default as Disc2Icon, default as LucideDisc2 } from './icons/disc-2.js';\nexport { default as Disc3, default as Disc3Icon, default as LucideDisc3 } from './icons/disc-3.js';\nexport { default as DiscAlbum, default as DiscAlbumIcon, default as LucideDiscAlbum } from './icons/disc-album.js';\nexport { default as Disc, default as DiscIcon, default as LucideDisc } from './icons/disc.js';\nexport { default as Divide, default as DivideIcon, default as LucideDivide } from './icons/divide.js';\nexport { default as DnaOff, default as DnaOffIcon, default as LucideDnaOff } from './icons/dna-off.js';\nexport { default as Dna, default as DnaIcon, default as LucideDna } from './icons/dna.js';\nexport { default as Dock, default as DockIcon, default as LucideDock } from './icons/dock.js';\nexport { default as Dog, default as DogIcon, default as LucideDog } from './icons/dog.js';\nexport { default as DollarSign, default as DollarSignIcon, default as LucideDollarSign } from './icons/dollar-sign.js';\nexport { default as DoorClosedLocked, default as DoorClosedLockedIcon, default as LucideDoorClosedLocked } from './icons/door-closed-locked.js';\nexport { default as Donut, default as DonutIcon, default as LucideDonut } from './icons/donut.js';\nexport { default as DoorClosed, default as DoorClosedIcon, default as LucideDoorClosed } from './icons/door-closed.js';\nexport { default as DoorOpen, default as DoorOpenIcon, default as LucideDoorOpen } from './icons/door-open.js';\nexport { default as Dot, default as DotIcon, default as LucideDot } from './icons/dot.js';\nexport { default as Download, default as DownloadIcon, default as LucideDownload } from './icons/download.js';\nexport { default as DraftingCompass, default as DraftingCompassIcon, default as LucideDraftingCompass } from './icons/drafting-compass.js';\nexport { default as Drama, default as DramaIcon, default as LucideDrama } from './icons/drama.js';\nexport { default as Dribbble, default as DribbbleIcon, default as LucideDribbble } from './icons/dribbble.js';\nexport { default as Drill, default as DrillIcon, default as LucideDrill } from './icons/drill.js';\nexport { default as Drone, default as DroneIcon, default as LucideDrone } from './icons/drone.js';\nexport { default as DropletOff, default as DropletOffIcon, default as LucideDropletOff } from './icons/droplet-off.js';\nexport { default as Droplet, default as DropletIcon, default as LucideDroplet } from './icons/droplet.js';\nexport { default as Droplets, default as DropletsIcon, default as LucideDroplets } from './icons/droplets.js';\nexport { default as Drum, default as DrumIcon, default as LucideDrum } from './icons/drum.js';\nexport { default as Drumstick, default as DrumstickIcon, default as LucideDrumstick } from './icons/drumstick.js';\nexport { default as Dumbbell, default as DumbbellIcon, default as LucideDumbbell } from './icons/dumbbell.js';\nexport { default as EarOff, default as EarOffIcon, default as LucideEarOff } from './icons/ear-off.js';\nexport { default as Ear, default as EarIcon, default as LucideEar } from './icons/ear.js';\nexport { default as EarthLock, default as EarthLockIcon, default as LucideEarthLock } from './icons/earth-lock.js';\nexport { default as Eclipse, default as EclipseIcon, default as LucideEclipse } from './icons/eclipse.js';\nexport { default as EggFried, default as EggFriedIcon, default as LucideEggFried } from './icons/egg-fried.js';\nexport { default as EggOff, default as EggOffIcon, default as LucideEggOff } from './icons/egg-off.js';\nexport { default as Egg, default as EggIcon, default as LucideEgg } from './icons/egg.js';\nexport { default as EqualNot, default as EqualNotIcon, default as LucideEqualNot } from './icons/equal-not.js';\nexport { default as EqualApproximately, default as EqualApproximatelyIcon, default as LucideEqualApproximately } from './icons/equal-approximately.js';\nexport { default as Equal, default as EqualIcon, default as LucideEqual } from './icons/equal.js';\nexport { default as Eraser, default as EraserIcon, default as LucideEraser } from './icons/eraser.js';\nexport { default as Euro, default as EuroIcon, default as LucideEuro } from './icons/euro.js';\nexport { default as EvCharger, default as EvChargerIcon, default as LucideEvCharger } from './icons/ev-charger.js';\nexport { default as EthernetPort, default as EthernetPortIcon, default as LucideEthernetPort } from './icons/ethernet-port.js';\nexport { default as Expand, default as ExpandIcon, default as LucideExpand } from './icons/expand.js';\nexport { default as ExternalLink, default as ExternalLinkIcon, default as LucideExternalLink } from './icons/external-link.js';\nexport { default as EyeClosed, default as EyeClosedIcon, default as LucideEyeClosed } from './icons/eye-closed.js';\nexport { default as Eye, default as EyeIcon, default as LucideEye } from './icons/eye.js';\nexport { default as EyeOff, default as EyeOffIcon, default as LucideEyeOff } from './icons/eye-off.js';\nexport { default as Facebook, default as FacebookIcon, default as LucideFacebook } from './icons/facebook.js';\nexport { default as Factory, default as FactoryIcon, default as LucideFactory } from './icons/factory.js';\nexport { default as Fan, default as FanIcon, default as LucideFan } from './icons/fan.js';\nexport { default as FastForward, default as FastForwardIcon, default as LucideFastForward } from './icons/fast-forward.js';\nexport { default as Feather, default as FeatherIcon, default as LucideFeather } from './icons/feather.js';\nexport { default as Fence, default as FenceIcon, default as LucideFence } from './icons/fence.js';\nexport { default as FerrisWheel, default as FerrisWheelIcon, default as LucideFerrisWheel } from './icons/ferris-wheel.js';\nexport { default as Figma, default as FigmaIcon, default as LucideFigma } from './icons/figma.js';\nexport { default as FileArchive, default as FileArchiveIcon, default as LucideFileArchive } from './icons/file-archive.js';\nexport { default as FileBox, default as FileBoxIcon, default as LucideFileBox } from './icons/file-box.js';\nexport { default as FileCheck, default as FileCheckIcon, default as LucideFileCheck } from './icons/file-check.js';\nexport { default as FileClock, default as FileClockIcon, default as LucideFileClock } from './icons/file-clock.js';\nexport { default as FileCode, default as FileCodeIcon, default as LucideFileCode } from './icons/file-code.js';\nexport { default as FileDiff, default as FileDiffIcon, default as LucideFileDiff } from './icons/file-diff.js';\nexport { default as FileDigit, default as FileDigitIcon, default as LucideFileDigit } from './icons/file-digit.js';\nexport { default as FileDown, default as FileDownIcon, default as LucideFileDown } from './icons/file-down.js';\nexport { default as FileHeart, default as FileHeartIcon, default as LucideFileHeart } from './icons/file-heart.js';\nexport { default as FileImage, default as FileImageIcon, default as LucideFileImage } from './icons/file-image.js';\nexport { default as FileInput, default as FileInputIcon, default as LucideFileInput } from './icons/file-input.js';\nexport { default as FileMinus, default as FileMinusIcon, default as LucideFileMinus } from './icons/file-minus.js';\nexport { default as FileMusic, default as FileMusicIcon, default as LucideFileMusic } from './icons/file-music.js';\nexport { default as FileOutput, default as FileOutputIcon, default as LucideFileOutput } from './icons/file-output.js';\nexport { default as FilePlus, default as FilePlusIcon, default as LucideFilePlus } from './icons/file-plus.js';\nexport { default as FileScan, default as FileScanIcon, default as LucideFileScan } from './icons/file-scan.js';\nexport { default as FileSearch, default as FileSearchIcon, default as LucideFileSearch } from './icons/file-search.js';\nexport { default as FileSliders, default as FileSlidersIcon, default as LucideFileSliders } from './icons/file-sliders.js';\nexport { default as FileSpreadsheet, default as FileSpreadsheetIcon, default as LucideFileSpreadsheet } from './icons/file-spreadsheet.js';\nexport { default as FileStack, default as FileStackIcon, default as LucideFileStack } from './icons/file-stack.js';\nexport { default as FileSymlink, default as FileSymlinkIcon, default as LucideFileSymlink } from './icons/file-symlink.js';\nexport { default as FileTerminal, default as FileTerminalIcon, default as LucideFileTerminal } from './icons/file-terminal.js';\nexport { default as FileText, default as FileTextIcon, default as LucideFileText } from './icons/file-text.js';\nexport { default as FileUp, default as FileUpIcon, default as LucideFileUp } from './icons/file-up.js';\nexport { default as FileType, default as FileTypeIcon, default as LucideFileType } from './icons/file-type.js';\nexport { default as FileUser, default as FileUserIcon, default as LucideFileUser } from './icons/file-user.js';\nexport { default as FileVolume, default as FileVolumeIcon, default as LucideFileVolume } from './icons/file-volume.js';\nexport { default as FileX, default as FileXIcon, default as LucideFileX } from './icons/file-x.js';\nexport { default as File, default as FileIcon, default as LucideFile } from './icons/file.js';\nexport { default as Files, default as FilesIcon, default as LucideFiles } from './icons/files.js';\nexport { default as Film, default as FilmIcon, default as LucideFilm } from './icons/film.js';\nexport { default as FireExtinguisher, default as FireExtinguisherIcon, default as LucideFireExtinguisher } from './icons/fire-extinguisher.js';\nexport { default as FishOff, default as FishOffIcon, default as LucideFishOff } from './icons/fish-off.js';\nexport { default as FishSymbol, default as FishSymbolIcon, default as LucideFishSymbol } from './icons/fish-symbol.js';\nexport { default as Fish, default as FishIcon, default as LucideFish } from './icons/fish.js';\nexport { default as FlagOff, default as FlagOffIcon, default as LucideFlagOff } from './icons/flag-off.js';\nexport { default as FishingHook, default as FishingHookIcon, default as LucideFishingHook } from './icons/fishing-hook.js';\nexport { default as FlagTriangleLeft, default as FlagTriangleLeftIcon, default as LucideFlagTriangleLeft } from './icons/flag-triangle-left.js';\nexport { default as FlagTriangleRight, default as FlagTriangleRightIcon, default as LucideFlagTriangleRight } from './icons/flag-triangle-right.js';\nexport { default as FlameKindling, default as FlameKindlingIcon, default as LucideFlameKindling } from './icons/flame-kindling.js';\nexport { default as Flag, default as FlagIcon, default as LucideFlag } from './icons/flag.js';\nexport { default as Flame, default as FlameIcon, default as LucideFlame } from './icons/flame.js';\nexport { default as FlashlightOff, default as FlashlightOffIcon, default as LucideFlashlightOff } from './icons/flashlight-off.js';\nexport { default as Flashlight, default as FlashlightIcon, default as LucideFlashlight } from './icons/flashlight.js';\nexport { default as FlaskConicalOff, default as FlaskConicalOffIcon, default as LucideFlaskConicalOff } from './icons/flask-conical-off.js';\nexport { default as FlaskRound, default as FlaskRoundIcon, default as LucideFlaskRound } from './icons/flask-round.js';\nexport { default as FlaskConical, default as FlaskConicalIcon, default as LucideFlaskConical } from './icons/flask-conical.js';\nexport { default as FlipHorizontal, default as FlipHorizontalIcon, default as LucideFlipHorizontal } from './icons/flip-horizontal.js';\nexport { default as FlipHorizontal2, default as FlipHorizontal2Icon, default as LucideFlipHorizontal2 } from './icons/flip-horizontal-2.js';\nexport { default as FlipVertical2, default as FlipVertical2Icon, default as LucideFlipVertical2 } from './icons/flip-vertical-2.js';\nexport { default as FlipVertical, default as FlipVerticalIcon, default as LucideFlipVertical } from './icons/flip-vertical.js';\nexport { default as Flower2, default as Flower2Icon, default as LucideFlower2 } from './icons/flower-2.js';\nexport { default as Flower, default as FlowerIcon, default as LucideFlower } from './icons/flower.js';\nexport { default as Focus, default as FocusIcon, default as LucideFocus } from './icons/focus.js';\nexport { default as FoldHorizontal, default as FoldHorizontalIcon, default as LucideFoldHorizontal } from './icons/fold-horizontal.js';\nexport { default as FoldVertical, default as FoldVerticalIcon, default as LucideFoldVertical } from './icons/fold-vertical.js';\nexport { default as FolderArchive, default as FolderArchiveIcon, default as LucideFolderArchive } from './icons/folder-archive.js';\nexport { default as FolderCheck, default as FolderCheckIcon, default as LucideFolderCheck } from './icons/folder-check.js';\nexport { default as FolderClock, default as FolderClockIcon, default as LucideFolderClock } from './icons/folder-clock.js';\nexport { default as FolderClosed, default as FolderClosedIcon, default as LucideFolderClosed } from './icons/folder-closed.js';\nexport { default as FolderCode, default as FolderCodeIcon, default as LucideFolderCode } from './icons/folder-code.js';\nexport { default as FolderDot, default as FolderDotIcon, default as LucideFolderDot } from './icons/folder-dot.js';\nexport { default as FolderDown, default as FolderDownIcon, default as LucideFolderDown } from './icons/folder-down.js';\nexport { default as FolderGit2, default as FolderGit2Icon, default as LucideFolderGit2 } from './icons/folder-git-2.js';\nexport { default as FolderGit, default as FolderGitIcon, default as LucideFolderGit } from './icons/folder-git.js';\nexport { default as FolderHeart, default as FolderHeartIcon, default as LucideFolderHeart } from './icons/folder-heart.js';\nexport { default as FolderInput, default as FolderInputIcon, default as LucideFolderInput } from './icons/folder-input.js';\nexport { default as FolderKanban, default as FolderKanbanIcon, default as LucideFolderKanban } from './icons/folder-kanban.js';\nexport { default as FolderKey, default as FolderKeyIcon, default as LucideFolderKey } from './icons/folder-key.js';\nexport { default as FolderLock, default as FolderLockIcon, default as LucideFolderLock } from './icons/folder-lock.js';\nexport { default as FolderMinus, default as FolderMinusIcon, default as LucideFolderMinus } from './icons/folder-minus.js';\nexport { default as FolderOpenDot, default as FolderOpenDotIcon, default as LucideFolderOpenDot } from './icons/folder-open-dot.js';\nexport { default as FolderOpen, default as FolderOpenIcon, default as LucideFolderOpen } from './icons/folder-open.js';\nexport { default as FolderOutput, default as FolderOutputIcon, default as LucideFolderOutput } from './icons/folder-output.js';\nexport { default as FolderRoot, default as FolderRootIcon, default as LucideFolderRoot } from './icons/folder-root.js';\nexport { default as FolderPlus, default as FolderPlusIcon, default as LucideFolderPlus } from './icons/folder-plus.js';\nexport { default as FolderSearch2, default as FolderSearch2Icon, default as LucideFolderSearch2 } from './icons/folder-search-2.js';\nexport { default as FolderSearch, default as FolderSearchIcon, default as LucideFolderSearch } from './icons/folder-search.js';\nexport { default as FolderSymlink, default as FolderSymlinkIcon, default as LucideFolderSymlink } from './icons/folder-symlink.js';\nexport { default as FolderSync, default as FolderSyncIcon, default as LucideFolderSync } from './icons/folder-sync.js';\nexport { default as FolderTree, default as FolderTreeIcon, default as LucideFolderTree } from './icons/folder-tree.js';\nexport { default as FolderUp, default as FolderUpIcon, default as LucideFolderUp } from './icons/folder-up.js';\nexport { default as FolderX, default as FolderXIcon, default as LucideFolderX } from './icons/folder-x.js';\nexport { default as Folder, default as FolderIcon, default as LucideFolder } from './icons/folder.js';\nexport { default as Folders, default as FoldersIcon, default as LucideFolders } from './icons/folders.js';\nexport { default as Forklift, default as ForkliftIcon, default as LucideForklift } from './icons/forklift.js';\nexport { default as Footprints, default as FootprintsIcon, default as LucideFootprints } from './icons/footprints.js';\nexport { default as Form, default as FormIcon, default as LucideForm } from './icons/form.js';\nexport { default as Forward, default as ForwardIcon, default as LucideForward } from './icons/forward.js';\nexport { default as Frame, default as FrameIcon, default as LucideFrame } from './icons/frame.js';\nexport { default as Framer, default as FramerIcon, default as LucideFramer } from './icons/framer.js';\nexport { default as Frown, default as FrownIcon, default as LucideFrown } from './icons/frown.js';\nexport { default as Fuel, default as FuelIcon, default as LucideFuel } from './icons/fuel.js';\nexport { default as Fullscreen, default as FullscreenIcon, default as LucideFullscreen } from './icons/fullscreen.js';\nexport { default as FunnelPlus, default as FunnelPlusIcon, default as LucideFunnelPlus } from './icons/funnel-plus.js';\nexport { default as GalleryHorizontal, default as GalleryHorizontalIcon, default as LucideGalleryHorizontal } from './icons/gallery-horizontal.js';\nexport { default as GalleryHorizontalEnd, default as GalleryHorizontalEndIcon, default as LucideGalleryHorizontalEnd } from './icons/gallery-horizontal-end.js';\nexport { default as GalleryThumbnails, default as GalleryThumbnailsIcon, default as LucideGalleryThumbnails } from './icons/gallery-thumbnails.js';\nexport { default as GalleryVerticalEnd, default as GalleryVerticalEndIcon, default as LucideGalleryVerticalEnd } from './icons/gallery-vertical-end.js';\nexport { default as GalleryVertical, default as GalleryVerticalIcon, default as LucideGalleryVertical } from './icons/gallery-vertical.js';\nexport { default as Gamepad2, default as Gamepad2Icon, default as LucideGamepad2 } from './icons/gamepad-2.js';\nexport { default as GamepadDirectional, default as GamepadDirectionalIcon, default as LucideGamepadDirectional } from './icons/gamepad-directional.js';\nexport { default as Gauge, default as GaugeIcon, default as LucideGauge } from './icons/gauge.js';\nexport { default as Gamepad, default as GamepadIcon, default as LucideGamepad } from './icons/gamepad.js';\nexport { default as Gavel, default as GavelIcon, default as LucideGavel } from './icons/gavel.js';\nexport { default as Gem, default as GemIcon, default as LucideGem } from './icons/gem.js';\nexport { default as GeorgianLari, default as GeorgianLariIcon, default as LucideGeorgianLari } from './icons/georgian-lari.js';\nexport { default as Gift, default as GiftIcon, default as LucideGift } from './icons/gift.js';\nexport { default as Ghost, default as GhostIcon, default as LucideGhost } from './icons/ghost.js';\nexport { default as GitBranchMinus, default as GitBranchMinusIcon, default as LucideGitBranchMinus } from './icons/git-branch-minus.js';\nexport { default as GitBranchPlus, default as GitBranchPlusIcon, default as LucideGitBranchPlus } from './icons/git-branch-plus.js';\nexport { default as GitBranch, default as GitBranchIcon, default as LucideGitBranch } from './icons/git-branch.js';\nexport { default as GitCommitVertical, default as GitCommitVerticalIcon, default as LucideGitCommitVertical } from './icons/git-commit-vertical.js';\nexport { default as GitCompareArrows, default as GitCompareArrowsIcon, default as LucideGitCompareArrows } from './icons/git-compare-arrows.js';\nexport { default as GitCompare, default as GitCompareIcon, default as LucideGitCompare } from './icons/git-compare.js';\nexport { default as GitFork, default as GitForkIcon, default as LucideGitFork } from './icons/git-fork.js';\nexport { default as GitGraph, default as GitGraphIcon, default as LucideGitGraph } from './icons/git-graph.js';\nexport { default as GitMerge, default as GitMergeIcon, default as LucideGitMerge } from './icons/git-merge.js';\nexport { default as GitPullRequestArrow, default as GitPullRequestArrowIcon, default as LucideGitPullRequestArrow } from './icons/git-pull-request-arrow.js';\nexport { default as GitPullRequestClosed, default as GitPullRequestClosedIcon, default as LucideGitPullRequestClosed } from './icons/git-pull-request-closed.js';\nexport { default as GitPullRequestCreateArrow, default as GitPullRequestCreateArrowIcon, default as LucideGitPullRequestCreateArrow } from './icons/git-pull-request-create-arrow.js';\nexport { default as GitPullRequestCreate, default as GitPullRequestCreateIcon, default as LucideGitPullRequestCreate } from './icons/git-pull-request-create.js';\nexport { default as GitPullRequestDraft, default as GitPullRequestDraftIcon, default as LucideGitPullRequestDraft } from './icons/git-pull-request-draft.js';\nexport { default as GitPullRequest, default as GitPullRequestIcon, default as LucideGitPullRequest } from './icons/git-pull-request.js';\nexport { default as Github, default as GithubIcon, default as LucideGithub } from './icons/github.js';\nexport { default as Gitlab, default as GitlabIcon, default as LucideGitlab } from './icons/gitlab.js';\nexport { default as GlassWater, default as GlassWaterIcon, default as LucideGlassWater } from './icons/glass-water.js';\nexport { default as Glasses, default as GlassesIcon, default as LucideGlasses } from './icons/glasses.js';\nexport { default as GlobeLock, default as GlobeLockIcon, default as LucideGlobeLock } from './icons/globe-lock.js';\nexport { default as GlobeX, default as GlobeXIcon, default as LucideGlobeX } from './icons/globe-x.js';\nexport { default as Globe, default as GlobeIcon, default as LucideGlobe } from './icons/globe.js';\nexport { default as Goal, default as GoalIcon, default as LucideGoal } from './icons/goal.js';\nexport { default as Gpu, default as GpuIcon, default as LucideGpu } from './icons/gpu.js';\nexport { default as GraduationCap, default as GraduationCapIcon, default as LucideGraduationCap } from './icons/graduation-cap.js';\nexport { default as Grape, default as GrapeIcon, default as LucideGrape } from './icons/grape.js';\nexport { default as Grid3x2, default as Grid3x2Icon, default as LucideGrid3x2 } from './icons/grid-3x2.js';\nexport { default as GripHorizontal, default as GripHorizontalIcon, default as LucideGripHorizontal } from './icons/grip-horizontal.js';\nexport { default as GripVertical, default as GripVerticalIcon, default as LucideGripVertical } from './icons/grip-vertical.js';\nexport { default as Grip, default as GripIcon, default as LucideGrip } from './icons/grip.js';\nexport { default as Group, default as GroupIcon, default as LucideGroup } from './icons/group.js';\nexport { default as Guitar, default as GuitarIcon, default as LucideGuitar } from './icons/guitar.js';\nexport { default as Ham, default as HamIcon, default as LucideHam } from './icons/ham.js';\nexport { default as Hamburger, default as HamburgerIcon, default as LucideHamburger } from './icons/hamburger.js';\nexport { default as Hammer, default as HammerIcon, default as LucideHammer } from './icons/hammer.js';\nexport { default as HandCoins, default as HandCoinsIcon, default as LucideHandCoins } from './icons/hand-coins.js';\nexport { default as HandFist, default as HandFistIcon, default as LucideHandFist } from './icons/hand-fist.js';\nexport { default as HandHeart, default as HandHeartIcon, default as LucideHandHeart } from './icons/hand-heart.js';\nexport { default as HandMetal, default as HandMetalIcon, default as LucideHandMetal } from './icons/hand-metal.js';\nexport { default as Hand, default as HandIcon, default as LucideHand } from './icons/hand.js';\nexport { default as HandPlatter, default as HandPlatterIcon, default as LucideHandPlatter } from './icons/hand-platter.js';\nexport { default as Handbag, default as HandbagIcon, default as LucideHandbag } from './icons/handbag.js';\nexport { default as Handshake, default as HandshakeIcon, default as LucideHandshake } from './icons/handshake.js';\nexport { default as HardDriveDownload, default as HardDriveDownloadIcon, default as LucideHardDriveDownload } from './icons/hard-drive-download.js';\nexport { default as HardDriveUpload, default as HardDriveUploadIcon, default as LucideHardDriveUpload } from './icons/hard-drive-upload.js';\nexport { default as HardDrive, default as HardDriveIcon, default as LucideHardDrive } from './icons/hard-drive.js';\nexport { default as HardHat, default as HardHatIcon, default as LucideHardHat } from './icons/hard-hat.js';\nexport { default as Hash, default as HashIcon, default as LucideHash } from './icons/hash.js';\nexport { default as HatGlasses, default as HatGlassesIcon, default as LucideHatGlasses } from './icons/hat-glasses.js';\nexport { default as Haze, default as HazeIcon, default as LucideHaze } from './icons/haze.js';\nexport { default as Hd, default as HdIcon, default as LucideHd } from './icons/hd.js';\nexport { default as HdmiPort, default as HdmiPortIcon, default as LucideHdmiPort } from './icons/hdmi-port.js';\nexport { default as Heading1, default as Heading1Icon, default as LucideHeading1 } from './icons/heading-1.js';\nexport { default as Heading2, default as Heading2Icon, default as LucideHeading2 } from './icons/heading-2.js';\nexport { default as Heading3, default as Heading3Icon, default as LucideHeading3 } from './icons/heading-3.js';\nexport { default as Heading4, default as Heading4Icon, default as LucideHeading4 } from './icons/heading-4.js';\nexport { default as Heading5, default as Heading5Icon, default as LucideHeading5 } from './icons/heading-5.js';\nexport { default as Heading6, default as Heading6Icon, default as LucideHeading6 } from './icons/heading-6.js';\nexport { default as Heading, default as HeadingIcon, default as LucideHeading } from './icons/heading.js';\nexport { default as HeadphoneOff, default as HeadphoneOffIcon, default as LucideHeadphoneOff } from './icons/headphone-off.js';\nexport { default as Headphones, default as HeadphonesIcon, default as LucideHeadphones } from './icons/headphones.js';\nexport { default as Headset, default as HeadsetIcon, default as LucideHeadset } from './icons/headset.js';\nexport { default as HeartCrack, default as HeartCrackIcon, default as LucideHeartCrack } from './icons/heart-crack.js';\nexport { default as HeartHandshake, default as HeartHandshakeIcon, default as LucideHeartHandshake } from './icons/heart-handshake.js';\nexport { default as HeartMinus, default as HeartMinusIcon, default as LucideHeartMinus } from './icons/heart-minus.js';\nexport { default as HeartOff, default as HeartOffIcon, default as LucideHeartOff } from './icons/heart-off.js';\nexport { default as HeartPlus, default as HeartPlusIcon, default as LucideHeartPlus } from './icons/heart-plus.js';\nexport { default as HeartPulse, default as HeartPulseIcon, default as LucideHeartPulse } from './icons/heart-pulse.js';\nexport { default as Heart, default as HeartIcon, default as LucideHeart } from './icons/heart.js';\nexport { default as Heater, default as HeaterIcon, default as LucideHeater } from './icons/heater.js';\nexport { default as Helicopter, default as HelicopterIcon, default as LucideHelicopter } from './icons/helicopter.js';\nexport { default as Hexagon, default as HexagonIcon, default as LucideHexagon } from './icons/hexagon.js';\nexport { default as Highlighter, default as HighlighterIcon, default as LucideHighlighter } from './icons/highlighter.js';\nexport { default as History, default as HistoryIcon, default as LucideHistory } from './icons/history.js';\nexport { default as HopOff, default as HopOffIcon, default as LucideHopOff } from './icons/hop-off.js';\nexport { default as Hop, default as HopIcon, default as LucideHop } from './icons/hop.js';\nexport { default as Hospital, default as HospitalIcon, default as LucideHospital } from './icons/hospital.js';\nexport { default as Hotel, default as HotelIcon, default as LucideHotel } from './icons/hotel.js';\nexport { default as HouseHeart, default as HouseHeartIcon, default as LucideHouseHeart } from './icons/house-heart.js';\nexport { default as Hourglass, default as HourglassIcon, default as LucideHourglass } from './icons/hourglass.js';\nexport { default as HousePlug, default as HousePlugIcon, default as LucideHousePlug } from './icons/house-plug.js';\nexport { default as HousePlus, default as HousePlusIcon, default as LucideHousePlus } from './icons/house-plus.js';\nexport { default as HouseWifi, default as HouseWifiIcon, default as LucideHouseWifi } from './icons/house-wifi.js';\nexport { default as IdCardLanyard, default as IdCardLanyardIcon, default as LucideIdCardLanyard } from './icons/id-card-lanyard.js';\nexport { default as IdCard, default as IdCardIcon, default as LucideIdCard } from './icons/id-card.js';\nexport { default as ImageDown, default as ImageDownIcon, default as LucideImageDown } from './icons/image-down.js';\nexport { default as ImageMinus, default as ImageMinusIcon, default as LucideImageMinus } from './icons/image-minus.js';\nexport { default as ImagePlay, default as ImagePlayIcon, default as LucideImagePlay } from './icons/image-play.js';\nexport { default as ImageOff, default as ImageOffIcon, default as LucideImageOff } from './icons/image-off.js';\nexport { default as ImageUp, default as ImageUpIcon, default as LucideImageUp } from './icons/image-up.js';\nexport { default as ImagePlus, default as ImagePlusIcon, default as LucideImagePlus } from './icons/image-plus.js';\nexport { default as ImageUpscale, default as ImageUpscaleIcon, default as LucideImageUpscale } from './icons/image-upscale.js';\nexport { default as Image, default as ImageIcon, default as LucideImage } from './icons/image.js';\nexport { default as Images, default as ImagesIcon, default as LucideImages } from './icons/images.js';\nexport { default as Import, default as ImportIcon, default as LucideImport } from './icons/import.js';\nexport { default as Inbox, default as InboxIcon, default as LucideInbox } from './icons/inbox.js';\nexport { default as IndianRupee, default as IndianRupeeIcon, default as LucideIndianRupee } from './icons/indian-rupee.js';\nexport { default as Infinity, default as InfinityIcon, default as LucideInfinity } from './icons/infinity.js';\nexport { default as Info, default as InfoIcon, default as LucideInfo } from './icons/info.js';\nexport { default as InspectionPanel, default as InspectionPanelIcon, default as LucideInspectionPanel } from './icons/inspection-panel.js';\nexport { default as Instagram, default as InstagramIcon, default as LucideInstagram } from './icons/instagram.js';\nexport { default as Italic, default as ItalicIcon, default as LucideItalic } from './icons/italic.js';\nexport { default as IterationCcw, default as IterationCcwIcon, default as LucideIterationCcw } from './icons/iteration-ccw.js';\nexport { default as IterationCw, default as IterationCwIcon, default as LucideIterationCw } from './icons/iteration-cw.js';\nexport { default as JapaneseYen, default as JapaneseYenIcon, default as LucideJapaneseYen } from './icons/japanese-yen.js';\nexport { default as Joystick, default as JoystickIcon, default as LucideJoystick } from './icons/joystick.js';\nexport { default as Kanban, default as KanbanIcon, default as LucideKanban } from './icons/kanban.js';\nexport { default as Kayak, default as KayakIcon, default as LucideKayak } from './icons/kayak.js';\nexport { default as KeySquare, default as KeySquareIcon, default as LucideKeySquare } from './icons/key-square.js';\nexport { default as KeyRound, default as KeyRoundIcon, default as LucideKeyRound } from './icons/key-round.js';\nexport { default as Key, default as KeyIcon, default as LucideKey } from './icons/key.js';\nexport { default as KeyboardMusic, default as KeyboardMusicIcon, default as LucideKeyboardMusic } from './icons/keyboard-music.js';\nexport { default as Keyboard, default as KeyboardIcon, default as LucideKeyboard } from './icons/keyboard.js';\nexport { default as KeyboardOff, default as KeyboardOffIcon, default as LucideKeyboardOff } from './icons/keyboard-off.js';\nexport { default as LampCeiling, default as LampCeilingIcon, default as LucideLampCeiling } from './icons/lamp-ceiling.js';\nexport { default as LampDesk, default as LampDeskIcon, default as LucideLampDesk } from './icons/lamp-desk.js';\nexport { default as LampFloor, default as LampFloorIcon, default as LucideLampFloor } from './icons/lamp-floor.js';\nexport { default as LampWallDown, default as LampWallDownIcon, default as LucideLampWallDown } from './icons/lamp-wall-down.js';\nexport { default as LampWallUp, default as LampWallUpIcon, default as LucideLampWallUp } from './icons/lamp-wall-up.js';\nexport { default as LandPlot, default as LandPlotIcon, default as LucideLandPlot } from './icons/land-plot.js';\nexport { default as Lamp, default as LampIcon, default as LucideLamp } from './icons/lamp.js';\nexport { default as Landmark, default as LandmarkIcon, default as LucideLandmark } from './icons/landmark.js';\nexport { default as Languages, default as LanguagesIcon, default as LucideLanguages } from './icons/languages.js';\nexport { default as LaptopMinimalCheck, default as LaptopMinimalCheckIcon, default as LucideLaptopMinimalCheck } from './icons/laptop-minimal-check.js';\nexport { default as Laptop, default as LaptopIcon, default as LucideLaptop } from './icons/laptop.js';\nexport { default as LassoSelect, default as LassoSelectIcon, default as LucideLassoSelect } from './icons/lasso-select.js';\nexport { default as Lasso, default as LassoIcon, default as LucideLasso } from './icons/lasso.js';\nexport { default as Laugh, default as LaughIcon, default as LucideLaugh } from './icons/laugh.js';\nexport { default as Layers2, default as Layers2Icon, default as LucideLayers2 } from './icons/layers-2.js';\nexport { default as LayersPlus, default as LayersPlusIcon, default as LucideLayersPlus } from './icons/layers-plus.js';\nexport { default as LayoutDashboard, default as LayoutDashboardIcon, default as LucideLayoutDashboard } from './icons/layout-dashboard.js';\nexport { default as LayoutGrid, default as LayoutGridIcon, default as LucideLayoutGrid } from './icons/layout-grid.js';\nexport { default as LayoutList, default as LayoutListIcon, default as LucideLayoutList } from './icons/layout-list.js';\nexport { default as LayoutPanelLeft, default as LayoutPanelLeftIcon, default as LucideLayoutPanelLeft } from './icons/layout-panel-left.js';\nexport { default as LayoutPanelTop, default as LayoutPanelTopIcon, default as LucideLayoutPanelTop } from './icons/layout-panel-top.js';\nexport { default as LayoutTemplate, default as LayoutTemplateIcon, default as LucideLayoutTemplate } from './icons/layout-template.js';\nexport { default as Leaf, default as LeafIcon, default as LucideLeaf } from './icons/leaf.js';\nexport { default as LeafyGreen, default as LeafyGreenIcon, default as LucideLeafyGreen } from './icons/leafy-green.js';\nexport { default as Lectern, default as LecternIcon, default as LucideLectern } from './icons/lectern.js';\nexport { default as LibraryBig, default as LibraryBigIcon, default as LucideLibraryBig } from './icons/library-big.js';\nexport { default as Library, default as LibraryIcon, default as LucideLibrary } from './icons/library.js';\nexport { default as LifeBuoy, default as LifeBuoyIcon, default as LucideLifeBuoy } from './icons/life-buoy.js';\nexport { default as Ligature, default as LigatureIcon, default as LucideLigature } from './icons/ligature.js';\nexport { default as LightbulbOff, default as LightbulbOffIcon, default as LucideLightbulbOff } from './icons/lightbulb-off.js';\nexport { default as Lightbulb, default as LightbulbIcon, default as LucideLightbulb } from './icons/lightbulb.js';\nexport { default as LineSquiggle, default as LineSquiggleIcon, default as LucideLineSquiggle } from './icons/line-squiggle.js';\nexport { default as Link2Off, default as Link2OffIcon, default as LucideLink2Off } from './icons/link-2-off.js';\nexport { default as Link2, default as Link2Icon, default as LucideLink2 } from './icons/link-2.js';\nexport { default as Link, default as LinkIcon, default as LucideLink } from './icons/link.js';\nexport { default as Linkedin, default as LinkedinIcon, default as LucideLinkedin } from './icons/linkedin.js';\nexport { default as ListCheck, default as ListCheckIcon, default as LucideListCheck } from './icons/list-check.js';\nexport { default as ListChecks, default as ListChecksIcon, default as LucideListChecks } from './icons/list-checks.js';\nexport { default as ListChevronsDownUp, default as ListChevronsDownUpIcon, default as LucideListChevronsDownUp } from './icons/list-chevrons-down-up.js';\nexport { default as ListChevronsUpDown, default as ListChevronsUpDownIcon, default as LucideListChevronsUpDown } from './icons/list-chevrons-up-down.js';\nexport { default as ListCollapse, default as ListCollapseIcon, default as LucideListCollapse } from './icons/list-collapse.js';\nexport { default as ListEnd, default as ListEndIcon, default as LucideListEnd } from './icons/list-end.js';\nexport { default as ListFilterPlus, default as ListFilterPlusIcon, default as LucideListFilterPlus } from './icons/list-filter-plus.js';\nexport { default as ListFilter, default as ListFilterIcon, default as LucideListFilter } from './icons/list-filter.js';\nexport { default as ListMinus, default as ListMinusIcon, default as LucideListMinus } from './icons/list-minus.js';\nexport { default as ListMusic, default as ListMusicIcon, default as LucideListMusic } from './icons/list-music.js';\nexport { default as ListOrdered, default as ListOrderedIcon, default as LucideListOrdered } from './icons/list-ordered.js';\nexport { default as ListPlus, default as ListPlusIcon, default as LucideListPlus } from './icons/list-plus.js';\nexport { default as ListRestart, default as ListRestartIcon, default as LucideListRestart } from './icons/list-restart.js';\nexport { default as ListStart, default as ListStartIcon, default as LucideListStart } from './icons/list-start.js';\nexport { default as ListTodo, default as ListTodoIcon, default as LucideListTodo } from './icons/list-todo.js';\nexport { default as ListTree, default as ListTreeIcon, default as LucideListTree } from './icons/list-tree.js';\nexport { default as ListVideo, default as ListVideoIcon, default as LucideListVideo } from './icons/list-video.js';\nexport { default as ListX, default as ListXIcon, default as LucideListX } from './icons/list-x.js';\nexport { default as List, default as ListIcon, default as LucideList } from './icons/list.js';\nexport { default as LoaderPinwheel, default as LoaderPinwheelIcon, default as LucideLoaderPinwheel } from './icons/loader-pinwheel.js';\nexport { default as Loader, default as LoaderIcon, default as LucideLoader } from './icons/loader.js';\nexport { default as LocateFixed, default as LocateFixedIcon, default as LucideLocateFixed } from './icons/locate-fixed.js';\nexport { default as LocateOff, default as LocateOffIcon, default as LucideLocateOff } from './icons/locate-off.js';\nexport { default as Locate, default as LocateIcon, default as LucideLocate } from './icons/locate.js';\nexport { default as LockKeyhole, default as LockKeyholeIcon, default as LucideLockKeyhole } from './icons/lock-keyhole.js';\nexport { default as Lock, default as LockIcon, default as LucideLock } from './icons/lock.js';\nexport { default as LogIn, default as LogInIcon, default as LucideLogIn } from './icons/log-in.js';\nexport { default as LogOut, default as LogOutIcon, default as LucideLogOut } from './icons/log-out.js';\nexport { default as Logs, default as LogsIcon, default as LucideLogs } from './icons/logs.js';\nexport { default as LucideLuggage, default as Luggage, default as LuggageIcon } from './icons/luggage.js';\nexport { default as Lollipop, default as LollipopIcon, default as LucideLollipop } from './icons/lollipop.js';\nexport { default as LucideMagnet, default as Magnet, default as MagnetIcon } from './icons/magnet.js';\nexport { default as LucideMailCheck, default as MailCheck, default as MailCheckIcon } from './icons/mail-check.js';\nexport { default as LucideMailMinus, default as MailMinus, default as MailMinusIcon } from './icons/mail-minus.js';\nexport { default as LucideMailOpen, default as MailOpen, default as MailOpenIcon } from './icons/mail-open.js';\nexport { default as LucideMailPlus, default as MailPlus, default as MailPlusIcon } from './icons/mail-plus.js';\nexport { default as LucideMailSearch, default as MailSearch, default as MailSearchIcon } from './icons/mail-search.js';\nexport { default as LucideMailWarning, default as MailWarning, default as MailWarningIcon } from './icons/mail-warning.js';\nexport { default as LucideMailX, default as MailX, default as MailXIcon } from './icons/mail-x.js';\nexport { default as LucideMail, default as Mail, default as MailIcon } from './icons/mail.js';\nexport { default as LucideMailbox, default as Mailbox, default as MailboxIcon } from './icons/mailbox.js';\nexport { default as LucideMapMinus, default as MapMinus, default as MapMinusIcon } from './icons/map-minus.js';\nexport { default as LucideMails, default as Mails, default as MailsIcon } from './icons/mails.js';\nexport { default as LucideMapPinCheckInside, default as MapPinCheckInside, default as MapPinCheckInsideIcon } from './icons/map-pin-check-inside.js';\nexport { default as LucideMapPinCheck, default as MapPinCheck, default as MapPinCheckIcon } from './icons/map-pin-check.js';\nexport { default as LucideMapPinHouse, default as MapPinHouse, default as MapPinHouseIcon } from './icons/map-pin-house.js';\nexport { default as LucideMapPinMinusInside, default as MapPinMinusInside, default as MapPinMinusInsideIcon } from './icons/map-pin-minus-inside.js';\nexport { default as LucideMapPinMinus, default as MapPinMinus, default as MapPinMinusIcon } from './icons/map-pin-minus.js';\nexport { default as LucideMapPinOff, default as MapPinOff, default as MapPinOffIcon } from './icons/map-pin-off.js';\nexport { default as LucideMapPinPlusInside, default as MapPinPlusInside, default as MapPinPlusInsideIcon } from './icons/map-pin-plus-inside.js';\nexport { default as LucideMapPinPlus, default as MapPinPlus, default as MapPinPlusIcon } from './icons/map-pin-plus.js';\nexport { default as LucideMapPinXInside, default as MapPinXInside, default as MapPinXInsideIcon } from './icons/map-pin-x-inside.js';\nexport { default as LucideMapPinX, default as MapPinX, default as MapPinXIcon } from './icons/map-pin-x.js';\nexport { default as LucideMapPin, default as MapPin, default as MapPinIcon } from './icons/map-pin.js';\nexport { default as LucideMapPinned, default as MapPinned, default as MapPinnedIcon } from './icons/map-pinned.js';\nexport { default as LucideMapPlus, default as MapPlus, default as MapPlusIcon } from './icons/map-plus.js';\nexport { default as LucideMap, default as Map, default as MapIcon } from './icons/map.js';\nexport { default as LucideMarsStroke, default as MarsStroke, default as MarsStrokeIcon } from './icons/mars-stroke.js';\nexport { default as LucideMars, default as Mars, default as MarsIcon } from './icons/mars.js';\nexport { default as LucideMartini, default as Martini, default as MartiniIcon } from './icons/martini.js';\nexport { default as LucideMaximize2, default as Maximize2, default as Maximize2Icon } from './icons/maximize-2.js';\nexport { default as LucideMedal, default as Medal, default as MedalIcon } from './icons/medal.js';\nexport { default as LucideMaximize, default as Maximize, default as MaximizeIcon } from './icons/maximize.js';\nexport { default as LucideMegaphoneOff, default as MegaphoneOff, default as MegaphoneOffIcon } from './icons/megaphone-off.js';\nexport { default as LucideMegaphone, default as Megaphone, default as MegaphoneIcon } from './icons/megaphone.js';\nexport { default as LucideMeh, default as Meh, default as MehIcon } from './icons/meh.js';\nexport { default as LucideMemoryStick, default as MemoryStick, default as MemoryStickIcon } from './icons/memory-stick.js';\nexport { default as LucideMenu, default as Menu, default as MenuIcon } from './icons/menu.js';\nexport { default as LucideMerge, default as Merge, default as MergeIcon } from './icons/merge.js';\nexport { default as LucideMessageCircleDashed, default as MessageCircleDashed, default as MessageCircleDashedIcon } from './icons/message-circle-dashed.js';\nexport { default as LucideMessageCircleCode, default as MessageCircleCode, default as MessageCircleCodeIcon } from './icons/message-circle-code.js';\nexport { default as LucideMessageCircleHeart, default as MessageCircleHeart, default as MessageCircleHeartIcon } from './icons/message-circle-heart.js';\nexport { default as LucideMessageCircleMore, default as MessageCircleMore, default as MessageCircleMoreIcon } from './icons/message-circle-more.js';\nexport { default as LucideMessageCircleOff, default as MessageCircleOff, default as MessageCircleOffIcon } from './icons/message-circle-off.js';\nexport { default as LucideMessageCirclePlus, default as MessageCirclePlus, default as MessageCirclePlusIcon } from './icons/message-circle-plus.js';\nexport { default as LucideMessageCircleReply, default as MessageCircleReply, default as MessageCircleReplyIcon } from './icons/message-circle-reply.js';\nexport { default as LucideMessageCircleWarning, default as MessageCircleWarning, default as MessageCircleWarningIcon } from './icons/message-circle-warning.js';\nexport { default as LucideMessageCircleX, default as MessageCircleX, default as MessageCircleXIcon } from './icons/message-circle-x.js';\nexport { default as LucideMessageCircle, default as MessageCircle, default as MessageCircleIcon } from './icons/message-circle.js';\nexport { default as LucideMessageSquareDashed, default as MessageSquareDashed, default as MessageSquareDashedIcon } from './icons/message-square-dashed.js';\nexport { default as LucideMessageSquareCode, default as MessageSquareCode, default as MessageSquareCodeIcon } from './icons/message-square-code.js';\nexport { default as LucideMessageSquareDiff, default as MessageSquareDiff, default as MessageSquareDiffIcon } from './icons/message-square-diff.js';\nexport { default as LucideMessageSquareHeart, default as MessageSquareHeart, default as MessageSquareHeartIcon } from './icons/message-square-heart.js';\nexport { default as LucideMessageSquareDot, default as MessageSquareDot, default as MessageSquareDotIcon } from './icons/message-square-dot.js';\nexport { default as LucideMessageSquareMore, default as MessageSquareMore, default as MessageSquareMoreIcon } from './icons/message-square-more.js';\nexport { default as LucideMessageSquareLock, default as MessageSquareLock, default as MessageSquareLockIcon } from './icons/message-square-lock.js';\nexport { default as LucideMessageSquareOff, default as MessageSquareOff, default as MessageSquareOffIcon } from './icons/message-square-off.js';\nexport { default as LucideMessageSquarePlus, default as MessageSquarePlus, default as MessageSquarePlusIcon } from './icons/message-square-plus.js';\nexport { default as LucideMessageSquareQuote, default as MessageSquareQuote, default as MessageSquareQuoteIcon } from './icons/message-square-quote.js';\nexport { default as LucideMessageSquareReply, default as MessageSquareReply, default as MessageSquareReplyIcon } from './icons/message-square-reply.js';\nexport { default as LucideMessageSquareShare, default as MessageSquareShare, default as MessageSquareShareIcon } from './icons/message-square-share.js';\nexport { default as LucideMessageSquareText, default as MessageSquareText, default as MessageSquareTextIcon } from './icons/message-square-text.js';\nexport { default as LucideMessageSquareX, default as MessageSquareX, default as MessageSquareXIcon } from './icons/message-square-x.js';\nexport { default as LucideMessageSquareWarning, default as MessageSquareWarning, default as MessageSquareWarningIcon } from './icons/message-square-warning.js';\nexport { default as LucideMessageSquare, default as MessageSquare, default as MessageSquareIcon } from './icons/message-square.js';\nexport { default as LucideMessagesSquare, default as MessagesSquare, default as MessagesSquareIcon } from './icons/messages-square.js';\nexport { default as LucideMicOff, default as MicOff, default as MicOffIcon } from './icons/mic-off.js';\nexport { default as LucideMic, default as Mic, default as MicIcon } from './icons/mic.js';\nexport { default as LucideMicrochip, default as Microchip, default as MicrochipIcon } from './icons/microchip.js';\nexport { default as LucideMicroscope, default as Microscope, default as MicroscopeIcon } from './icons/microscope.js';\nexport { default as LucideMicrowave, default as Microwave, default as MicrowaveIcon } from './icons/microwave.js';\nexport { default as LucideMilestone, default as Milestone, default as MilestoneIcon } from './icons/milestone.js';\nexport { default as LucideMilk, default as Milk, default as MilkIcon } from './icons/milk.js';\nexport { default as LucideMilkOff, default as MilkOff, default as MilkOffIcon } from './icons/milk-off.js';\nexport { default as LucideMinimize2, default as Minimize2, default as Minimize2Icon } from './icons/minimize-2.js';\nexport { default as LucideMinimize, default as Minimize, default as MinimizeIcon } from './icons/minimize.js';\nexport { default as LucideMinus, default as Minus, default as MinusIcon } from './icons/minus.js';\nexport { default as LucideMonitorCheck, default as MonitorCheck, default as MonitorCheckIcon } from './icons/monitor-check.js';\nexport { default as LucideMonitorCloud, default as MonitorCloud, default as MonitorCloudIcon } from './icons/monitor-cloud.js';\nexport { default as LucideMonitorCog, default as MonitorCog, default as MonitorCogIcon } from './icons/monitor-cog.js';\nexport { default as LucideMonitorDot, default as MonitorDot, default as MonitorDotIcon } from './icons/monitor-dot.js';\nexport { default as LucideMonitorDown, default as MonitorDown, default as MonitorDownIcon } from './icons/monitor-down.js';\nexport { default as LucideMonitorOff, default as MonitorOff, default as MonitorOffIcon } from './icons/monitor-off.js';\nexport { default as LucideMonitorPause, default as MonitorPause, default as MonitorPauseIcon } from './icons/monitor-pause.js';\nexport { default as LucideMonitorPlay, default as MonitorPlay, default as MonitorPlayIcon } from './icons/monitor-play.js';\nexport { default as LucideMonitorSmartphone, default as MonitorSmartphone, default as MonitorSmartphoneIcon } from './icons/monitor-smartphone.js';\nexport { default as LucideMonitorSpeaker, default as MonitorSpeaker, default as MonitorSpeakerIcon } from './icons/monitor-speaker.js';\nexport { default as LucideMonitorStop, default as MonitorStop, default as MonitorStopIcon } from './icons/monitor-stop.js';\nexport { default as LucideMonitorX, default as MonitorX, default as MonitorXIcon } from './icons/monitor-x.js';\nexport { default as LucideMonitorUp, default as MonitorUp, default as MonitorUpIcon } from './icons/monitor-up.js';\nexport { default as LucideMonitor, default as Monitor, default as MonitorIcon } from './icons/monitor.js';\nexport { default as LucideMoonStar, default as MoonStar, default as MoonStarIcon } from './icons/moon-star.js';\nexport { default as LucideMoon, default as Moon, default as MoonIcon } from './icons/moon.js';\nexport { default as LucideMotorbike, default as Motorbike, default as MotorbikeIcon } from './icons/motorbike.js';\nexport { default as LucideMountainSnow, default as MountainSnow, default as MountainSnowIcon } from './icons/mountain-snow.js';\nexport { default as LucideMountain, default as Mountain, default as MountainIcon } from './icons/mountain.js';\nexport { default as LucideMouseOff, default as MouseOff, default as MouseOffIcon } from './icons/mouse-off.js';\nexport { default as LucideMousePointer2Off, default as MousePointer2Off, default as MousePointer2OffIcon } from './icons/mouse-pointer-2-off.js';\nexport { default as LucideMousePointer2, default as MousePointer2, default as MousePointer2Icon } from './icons/mouse-pointer-2.js';\nexport { default as LucideMousePointerClick, default as MousePointerClick, default as MousePointerClickIcon } from './icons/mouse-pointer-click.js';\nexport { default as LucideMousePointerBan, default as MousePointerBan, default as MousePointerBanIcon } from './icons/mouse-pointer-ban.js';\nexport { default as LucideMousePointer, default as MousePointer, default as MousePointerIcon } from './icons/mouse-pointer.js';\nexport { default as LucideMouse, default as Mouse, default as MouseIcon } from './icons/mouse.js';\nexport { default as LucideMoveDiagonal2, default as MoveDiagonal2, default as MoveDiagonal2Icon } from './icons/move-diagonal-2.js';\nexport { default as LucideMoveDiagonal, default as MoveDiagonal, default as MoveDiagonalIcon } from './icons/move-diagonal.js';\nexport { default as LucideMoveDownLeft, default as MoveDownLeft, default as MoveDownLeftIcon } from './icons/move-down-left.js';\nexport { default as LucideMoveDownRight, default as MoveDownRight, default as MoveDownRightIcon } from './icons/move-down-right.js';\nexport { default as LucideMoveDown, default as MoveDown, default as MoveDownIcon } from './icons/move-down.js';\nexport { default as LucideMoveHorizontal, default as MoveHorizontal, default as MoveHorizontalIcon } from './icons/move-horizontal.js';\nexport { default as LucideMoveLeft, default as MoveLeft, default as MoveLeftIcon } from './icons/move-left.js';\nexport { default as LucideMoveRight, default as MoveRight, default as MoveRightIcon } from './icons/move-right.js';\nexport { default as LucideMoveUpLeft, default as MoveUpLeft, default as MoveUpLeftIcon } from './icons/move-up-left.js';\nexport { default as LucideMoveUpRight, default as MoveUpRight, default as MoveUpRightIcon } from './icons/move-up-right.js';\nexport { default as LucideMoveUp, default as MoveUp, default as MoveUpIcon } from './icons/move-up.js';\nexport { default as LucideMoveVertical, default as MoveVertical, default as MoveVerticalIcon } from './icons/move-vertical.js';\nexport { default as LucideMove, default as Move, default as MoveIcon } from './icons/move.js';\nexport { default as LucideMusic2, default as Music2, default as Music2Icon } from './icons/music-2.js';\nexport { default as LucideMusic3, default as Music3, default as Music3Icon } from './icons/music-3.js';\nexport { default as LucideMusic4, default as Music4, default as Music4Icon } from './icons/music-4.js';\nexport { default as LucideMusic, default as Music, default as MusicIcon } from './icons/music.js';\nexport { default as LucideNavigation2Off, default as Navigation2Off, default as Navigation2OffIcon } from './icons/navigation-2-off.js';\nexport { default as LucideNavigation2, default as Navigation2, default as Navigation2Icon } from './icons/navigation-2.js';\nexport { default as LucideNavigationOff, default as NavigationOff, default as NavigationOffIcon } from './icons/navigation-off.js';\nexport { default as LucideNavigation, default as Navigation, default as NavigationIcon } from './icons/navigation.js';\nexport { default as LucideNetwork, default as Network, default as NetworkIcon } from './icons/network.js';\nexport { default as LucideNewspaper, default as Newspaper, default as NewspaperIcon } from './icons/newspaper.js';\nexport { default as LucideNfc, default as Nfc, default as NfcIcon } from './icons/nfc.js';\nexport { default as LucideNonBinary, default as NonBinary, default as NonBinaryIcon } from './icons/non-binary.js';\nexport { default as LucideNotebookTabs, default as NotebookTabs, default as NotebookTabsIcon } from './icons/notebook-tabs.js';\nexport { default as LucideNotebookPen, default as NotebookPen, default as NotebookPenIcon } from './icons/notebook-pen.js';\nexport { default as LucideNotebookText, default as NotebookText, default as NotebookTextIcon } from './icons/notebook-text.js';\nexport { default as LucideNotebook, default as Notebook, default as NotebookIcon } from './icons/notebook.js';\nexport { default as LucideNotepadText, default as NotepadText, default as NotepadTextIcon } from './icons/notepad-text.js';\nexport { default as LucideNotepadTextDashed, default as NotepadTextDashed, default as NotepadTextDashedIcon } from './icons/notepad-text-dashed.js';\nexport { default as LucideNutOff, default as NutOff, default as NutOffIcon } from './icons/nut-off.js';\nexport { default as LucideNut, default as Nut, default as NutIcon } from './icons/nut.js';\nexport { default as LucideOctagonMinus, default as OctagonMinus, default as OctagonMinusIcon } from './icons/octagon-minus.js';\nexport { default as LucideOctagon, default as Octagon, default as OctagonIcon } from './icons/octagon.js';\nexport { default as LucideOmega, default as Omega, default as OmegaIcon } from './icons/omega.js';\nexport { default as LucideOption, default as Option, default as OptionIcon } from './icons/option.js';\nexport { default as LucideOrbit, default as Orbit, default as OrbitIcon } from './icons/orbit.js';\nexport { default as LucideOrigami, default as Origami, default as OrigamiIcon } from './icons/origami.js';\nexport { default as LucidePackage2, default as Package2, default as Package2Icon } from './icons/package-2.js';\nexport { default as LucidePackageCheck, default as PackageCheck, default as PackageCheckIcon } from './icons/package-check.js';\nexport { default as LucidePackageMinus, default as PackageMinus, default as PackageMinusIcon } from './icons/package-minus.js';\nexport { default as LucidePackageOpen, default as PackageOpen, default as PackageOpenIcon } from './icons/package-open.js';\nexport { default as LucidePackagePlus, default as PackagePlus, default as PackagePlusIcon } from './icons/package-plus.js';\nexport { default as LucidePackageSearch, default as PackageSearch, default as PackageSearchIcon } from './icons/package-search.js';\nexport { default as LucidePackageX, default as PackageX, default as PackageXIcon } from './icons/package-x.js';\nexport { default as LucidePackage, default as Package, default as PackageIcon } from './icons/package.js';\nexport { default as LucidePaintBucket, default as PaintBucket, default as PaintBucketIcon } from './icons/paint-bucket.js';\nexport { default as LucidePaintbrush, default as Paintbrush, default as PaintbrushIcon } from './icons/paintbrush.js';\nexport { default as LucidePaintRoller, default as PaintRoller, default as PaintRollerIcon } from './icons/paint-roller.js';\nexport { default as LucidePalette, default as Palette, default as PaletteIcon } from './icons/palette.js';\nexport { default as LucidePanda, default as Panda, default as PandaIcon } from './icons/panda.js';\nexport { default as LucidePanelBottomOpen, default as PanelBottomOpen, default as PanelBottomOpenIcon } from './icons/panel-bottom-open.js';\nexport { default as LucidePanelBottomClose, default as PanelBottomClose, default as PanelBottomCloseIcon } from './icons/panel-bottom-close.js';\nexport { default as LucidePanelBottom, default as PanelBottom, default as PanelBottomIcon } from './icons/panel-bottom.js';\nexport { default as LucidePanelLeftRightDashed, default as PanelLeftRightDashed, default as PanelLeftRightDashedIcon } from './icons/panel-left-right-dashed.js';\nexport { default as LucidePanelRightClose, default as PanelRightClose, default as PanelRightCloseIcon } from './icons/panel-right-close.js';\nexport { default as LucidePanelRightOpen, default as PanelRightOpen, default as PanelRightOpenIcon } from './icons/panel-right-open.js';\nexport { default as LucidePanelRight, default as PanelRight, default as PanelRightIcon } from './icons/panel-right.js';\nexport { default as LucidePanelTopBottomDashed, default as PanelTopBottomDashed, default as PanelTopBottomDashedIcon } from './icons/panel-top-bottom-dashed.js';\nexport { default as LucidePanelTopClose, default as PanelTopClose, default as PanelTopCloseIcon } from './icons/panel-top-close.js';\nexport { default as LucidePanelTopOpen, default as PanelTopOpen, default as PanelTopOpenIcon } from './icons/panel-top-open.js';\nexport { default as LucidePanelTop, default as PanelTop, default as PanelTopIcon } from './icons/panel-top.js';\nexport { default as LucidePanelsLeftBottom, default as PanelsLeftBottom, default as PanelsLeftBottomIcon } from './icons/panels-left-bottom.js';\nexport { default as LucidePanelsRightBottom, default as PanelsRightBottom, default as PanelsRightBottomIcon } from './icons/panels-right-bottom.js';\nexport { default as LucidePaperclip, default as Paperclip, default as PaperclipIcon } from './icons/paperclip.js';\nexport { default as LucideParentheses, default as Parentheses, default as ParenthesesIcon } from './icons/parentheses.js';\nexport { default as LucideParkingMeter, default as ParkingMeter, default as ParkingMeterIcon } from './icons/parking-meter.js';\nexport { default as LucidePartyPopper, default as PartyPopper, default as PartyPopperIcon } from './icons/party-popper.js';\nexport { default as LucidePause, default as Pause, default as PauseIcon } from './icons/pause.js';\nexport { default as LucidePawPrint, default as PawPrint, default as PawPrintIcon } from './icons/paw-print.js';\nexport { default as LucidePenOff, default as PenOff, default as PenOffIcon } from './icons/pen-off.js';\nexport { default as LucidePcCase, default as PcCase, default as PcCaseIcon } from './icons/pc-case.js';\nexport { default as LucidePenTool, default as PenTool, default as PenToolIcon } from './icons/pen-tool.js';\nexport { default as LucidePencilLine, default as PencilLine, default as PencilLineIcon } from './icons/pencil-line.js';\nexport { default as LucidePencilOff, default as PencilOff, default as PencilOffIcon } from './icons/pencil-off.js';\nexport { default as LucidePencilRuler, default as PencilRuler, default as PencilRulerIcon } from './icons/pencil-ruler.js';\nexport { default as LucidePencil, default as Pencil, default as PencilIcon } from './icons/pencil.js';\nexport { default as LucidePentagon, default as Pentagon, default as PentagonIcon } from './icons/pentagon.js';\nexport { default as LucidePercent, default as Percent, default as PercentIcon } from './icons/percent.js';\nexport { default as LucidePersonStanding, default as PersonStanding, default as PersonStandingIcon } from './icons/person-standing.js';\nexport { default as LucidePhilippinePeso, default as PhilippinePeso, default as PhilippinePesoIcon } from './icons/philippine-peso.js';\nexport { default as LucidePhoneCall, default as PhoneCall, default as PhoneCallIcon } from './icons/phone-call.js';\nexport { default as LucidePhoneForwarded, default as PhoneForwarded, default as PhoneForwardedIcon } from './icons/phone-forwarded.js';\nexport { default as LucidePhoneIncoming, default as PhoneIncoming, default as PhoneIncomingIcon } from './icons/phone-incoming.js';\nexport { default as LucidePhoneMissed, default as PhoneMissed, default as PhoneMissedIcon } from './icons/phone-missed.js';\nexport { default as LucidePhoneOff, default as PhoneOff, default as PhoneOffIcon } from './icons/phone-off.js';\nexport { default as LucidePhoneOutgoing, default as PhoneOutgoing, default as PhoneOutgoingIcon } from './icons/phone-outgoing.js';\nexport { default as LucidePhone, default as Phone, default as PhoneIcon } from './icons/phone.js';\nexport { default as LucidePi, default as Pi, default as PiIcon } from './icons/pi.js';\nexport { default as LucidePiano, default as Piano, default as PianoIcon } from './icons/piano.js';\nexport { default as LucidePickaxe, default as Pickaxe, default as PickaxeIcon } from './icons/pickaxe.js';\nexport { default as LucidePictureInPicture2, default as PictureInPicture2, default as PictureInPicture2Icon } from './icons/picture-in-picture-2.js';\nexport { default as LucidePiggyBank, default as PiggyBank, default as PiggyBankIcon } from './icons/piggy-bank.js';\nexport { default as LucidePictureInPicture, default as PictureInPicture, default as PictureInPictureIcon } from './icons/picture-in-picture.js';\nexport { default as LucidePilcrowLeft, default as PilcrowLeft, default as PilcrowLeftIcon } from './icons/pilcrow-left.js';\nexport { default as LucidePilcrowRight, default as PilcrowRight, default as PilcrowRightIcon } from './icons/pilcrow-right.js';\nexport { default as LucidePilcrow, default as Pilcrow, default as PilcrowIcon } from './icons/pilcrow.js';\nexport { default as LucidePillBottle, default as PillBottle, default as PillBottleIcon } from './icons/pill-bottle.js';\nexport { default as LucidePill, default as Pill, default as PillIcon } from './icons/pill.js';\nexport { default as LucidePinOff, default as PinOff, default as PinOffIcon } from './icons/pin-off.js';\nexport { default as LucidePin, default as Pin, default as PinIcon } from './icons/pin.js';\nexport { default as LucidePipette, default as Pipette, default as PipetteIcon } from './icons/pipette.js';\nexport { default as LucidePizza, default as Pizza, default as PizzaIcon } from './icons/pizza.js';\nexport { default as LucidePlaneTakeoff, default as PlaneTakeoff, default as PlaneTakeoffIcon } from './icons/plane-takeoff.js';\nexport { default as LucidePlaneLanding, default as PlaneLanding, default as PlaneLandingIcon } from './icons/plane-landing.js';\nexport { default as LucidePlane, default as Plane, default as PlaneIcon } from './icons/plane.js';\nexport { default as LucidePlay, default as Play, default as PlayIcon } from './icons/play.js';\nexport { default as LucidePlug2, default as Plug2, default as Plug2Icon } from './icons/plug-2.js';\nexport { default as LucidePlug, default as Plug, default as PlugIcon } from './icons/plug.js';\nexport { default as LucidePlus, default as Plus, default as PlusIcon } from './icons/plus.js';\nexport { default as LucidePocketKnife, default as PocketKnife, default as PocketKnifeIcon } from './icons/pocket-knife.js';\nexport { default as LucidePocket, default as Pocket, default as PocketIcon } from './icons/pocket.js';\nexport { default as LucidePodcast, default as Podcast, default as PodcastIcon } from './icons/podcast.js';\nexport { default as LucidePointerOff, default as PointerOff, default as PointerOffIcon } from './icons/pointer-off.js';\nexport { default as LucidePointer, default as Pointer, default as PointerIcon } from './icons/pointer.js';\nexport { default as LucidePopcorn, default as Popcorn, default as PopcornIcon } from './icons/popcorn.js';\nexport { default as LucidePoundSterling, default as PoundSterling, default as PoundSterlingIcon } from './icons/pound-sterling.js';\nexport { default as LucidePopsicle, default as Popsicle, default as PopsicleIcon } from './icons/popsicle.js';\nexport { default as LucidePowerOff, default as PowerOff, default as PowerOffIcon } from './icons/power-off.js';\nexport { default as LucidePower, default as Power, default as PowerIcon } from './icons/power.js';\nexport { default as LucidePresentation, default as Presentation, default as PresentationIcon } from './icons/presentation.js';\nexport { default as LucidePrinterCheck, default as PrinterCheck, default as PrinterCheckIcon } from './icons/printer-check.js';\nexport { default as LucidePrinter, default as Printer, default as PrinterIcon } from './icons/printer.js';\nexport { default as LucidePrinterX, default as PrinterX, default as PrinterXIcon } from './icons/printer-x.js';\nexport { default as LucideProjector, default as Projector, default as ProjectorIcon } from './icons/projector.js';\nexport { default as LucideProportions, default as Proportions, default as ProportionsIcon } from './icons/proportions.js';\nexport { default as LucidePuzzle, default as Puzzle, default as PuzzleIcon } from './icons/puzzle.js';\nexport { default as LucidePyramid, default as Pyramid, default as PyramidIcon } from './icons/pyramid.js';\nexport { default as LucideQrCode, default as QrCode, default as QrCodeIcon } from './icons/qr-code.js';\nexport { default as LucideQuote, default as Quote, default as QuoteIcon } from './icons/quote.js';\nexport { default as LucideRabbit, default as Rabbit, default as RabbitIcon } from './icons/rabbit.js';\nexport { default as LucideRadar, default as Radar, default as RadarIcon } from './icons/radar.js';\nexport { default as LucideRadical, default as Radical, default as RadicalIcon } from './icons/radical.js';\nexport { default as LucideRadiation, default as Radiation, default as RadiationIcon } from './icons/radiation.js';\nexport { default as LucideRadioReceiver, default as RadioReceiver, default as RadioReceiverIcon } from './icons/radio-receiver.js';\nexport { default as LucideRadioTower, default as RadioTower, default as RadioTowerIcon } from './icons/radio-tower.js';\nexport { default as LucideRadio, default as Radio, default as RadioIcon } from './icons/radio.js';\nexport { default as LucideRadius, default as Radius, default as RadiusIcon } from './icons/radius.js';\nexport { default as LucideRailSymbol, default as RailSymbol, default as RailSymbolIcon } from './icons/rail-symbol.js';\nexport { default as LucideRainbow, default as Rainbow, default as RainbowIcon } from './icons/rainbow.js';\nexport { default as LucideRat, default as Rat, default as RatIcon } from './icons/rat.js';\nexport { default as LucideRatio, default as Ratio, default as RatioIcon } from './icons/ratio.js';\nexport { default as LucideReceiptCent, default as ReceiptCent, default as ReceiptCentIcon } from './icons/receipt-cent.js';\nexport { default as LucideReceiptEuro, default as ReceiptEuro, default as ReceiptEuroIcon } from './icons/receipt-euro.js';\nexport { default as LucideReceiptIndianRupee, default as ReceiptIndianRupee, default as ReceiptIndianRupeeIcon } from './icons/receipt-indian-rupee.js';\nexport { default as LucideReceiptJapaneseYen, default as ReceiptJapaneseYen, default as ReceiptJapaneseYenIcon } from './icons/receipt-japanese-yen.js';\nexport { default as LucideReceiptPoundSterling, default as ReceiptPoundSterling, default as ReceiptPoundSterlingIcon } from './icons/receipt-pound-sterling.js';\nexport { default as LucideReceiptRussianRuble, default as ReceiptRussianRuble, default as ReceiptRussianRubleIcon } from './icons/receipt-russian-ruble.js';\nexport { default as LucideReceiptSwissFranc, default as ReceiptSwissFranc, default as ReceiptSwissFrancIcon } from './icons/receipt-swiss-franc.js';\nexport { default as LucideReceiptText, default as ReceiptText, default as ReceiptTextIcon } from './icons/receipt-text.js';\nexport { default as LucideReceiptTurkishLira, default as ReceiptTurkishLira, default as ReceiptTurkishLiraIcon } from './icons/receipt-turkish-lira.js';\nexport { default as LucideReceipt, default as Receipt, default as ReceiptIcon } from './icons/receipt.js';\nexport { default as LucideRectangleCircle, default as RectangleCircle, default as RectangleCircleIcon } from './icons/rectangle-circle.js';\nexport { default as LucideRectangleGoggles, default as RectangleGoggles, default as RectangleGogglesIcon } from './icons/rectangle-goggles.js';\nexport { default as LucideRectangleHorizontal, default as RectangleHorizontal, default as RectangleHorizontalIcon } from './icons/rectangle-horizontal.js';\nexport { default as LucideRectangleVertical, default as RectangleVertical, default as RectangleVerticalIcon } from './icons/rectangle-vertical.js';\nexport { default as LucideRecycle, default as Recycle, default as RecycleIcon } from './icons/recycle.js';\nexport { default as LucideRedo2, default as Redo2, default as Redo2Icon } from './icons/redo-2.js';\nexport { default as LucideRedoDot, default as RedoDot, default as RedoDotIcon } from './icons/redo-dot.js';\nexport { default as LucideRedo, default as Redo, default as RedoIcon } from './icons/redo.js';\nexport { default as LucideRefreshCcwDot, default as RefreshCcwDot, default as RefreshCcwDotIcon } from './icons/refresh-ccw-dot.js';\nexport { default as LucideRefreshCwOff, default as RefreshCwOff, default as RefreshCwOffIcon } from './icons/refresh-cw-off.js';\nexport { default as LucideRefreshCcw, default as RefreshCcw, default as RefreshCcwIcon } from './icons/refresh-ccw.js';\nexport { default as LucideRefreshCw, default as RefreshCw, default as RefreshCwIcon } from './icons/refresh-cw.js';\nexport { default as LucideRefrigerator, default as Refrigerator, default as RefrigeratorIcon } from './icons/refrigerator.js';\nexport { default as LucideRegex, default as Regex, default as RegexIcon } from './icons/regex.js';\nexport { default as LucideRemoveFormatting, default as RemoveFormatting, default as RemoveFormattingIcon } from './icons/remove-formatting.js';\nexport { default as LucideRepeat1, default as Repeat1, default as Repeat1Icon } from './icons/repeat-1.js';\nexport { default as LucideRepeat2, default as Repeat2, default as Repeat2Icon } from './icons/repeat-2.js';\nexport { default as LucideRepeat, default as Repeat, default as RepeatIcon } from './icons/repeat.js';\nexport { default as LucideReplaceAll, default as ReplaceAll, default as ReplaceAllIcon } from './icons/replace-all.js';\nexport { default as LucideReplace, default as Replace, default as ReplaceIcon } from './icons/replace.js';\nexport { default as LucideReplyAll, default as ReplyAll, default as ReplyAllIcon } from './icons/reply-all.js';\nexport { default as LucideReply, default as Reply, default as ReplyIcon } from './icons/reply.js';\nexport { default as LucideRewind, default as Rewind, default as RewindIcon } from './icons/rewind.js';\nexport { default as LucideRibbon, default as Ribbon, default as RibbonIcon } from './icons/ribbon.js';\nexport { default as LucideRocket, default as Rocket, default as RocketIcon } from './icons/rocket.js';\nexport { default as LucideRockingChair, default as RockingChair, default as RockingChairIcon } from './icons/rocking-chair.js';\nexport { default as LucideRollerCoaster, default as RollerCoaster, default as RollerCoasterIcon } from './icons/roller-coaster.js';\nexport { default as LucideRose, default as Rose, default as RoseIcon } from './icons/rose.js';\nexport { default as LucideRotateCcwKey, default as RotateCcwKey, default as RotateCcwKeyIcon } from './icons/rotate-ccw-key.js';\nexport { default as LucideRotateCcwSquare, default as RotateCcwSquare, default as RotateCcwSquareIcon } from './icons/rotate-ccw-square.js';\nexport { default as LucideRotateCcw, default as RotateCcw, default as RotateCcwIcon } from './icons/rotate-ccw.js';\nexport { default as LucideRotateCwSquare, default as RotateCwSquare, default as RotateCwSquareIcon } from './icons/rotate-cw-square.js';\nexport { default as LucideRotateCw, default as RotateCw, default as RotateCwIcon } from './icons/rotate-cw.js';\nexport { default as LucideRoute, default as Route, default as RouteIcon } from './icons/route.js';\nexport { default as LucideRouteOff, default as RouteOff, default as RouteOffIcon } from './icons/route-off.js';\nexport { default as LucideRouter, default as Router, default as RouterIcon } from './icons/router.js';\nexport { default as LucideRss, default as Rss, default as RssIcon } from './icons/rss.js';\nexport { default as LucideRows4, default as Rows4, default as Rows4Icon } from './icons/rows-4.js';\nexport { default as LucideRulerDimensionLine, default as RulerDimensionLine, default as RulerDimensionLineIcon } from './icons/ruler-dimension-line.js';\nexport { default as LucideRuler, default as Ruler, default as RulerIcon } from './icons/ruler.js';\nexport { default as LucideRussianRuble, default as RussianRuble, default as RussianRubleIcon } from './icons/russian-ruble.js';\nexport { default as LucideSailboat, default as Sailboat, default as SailboatIcon } from './icons/sailboat.js';\nexport { default as LucideSalad, default as Salad, default as SaladIcon } from './icons/salad.js';\nexport { default as LucideSandwich, default as Sandwich, default as SandwichIcon } from './icons/sandwich.js';\nexport { default as LucideSatelliteDish, default as SatelliteDish, default as SatelliteDishIcon } from './icons/satellite-dish.js';\nexport { default as LucideSatellite, default as Satellite, default as SatelliteIcon } from './icons/satellite.js';\nexport { default as LucideSaudiRiyal, default as SaudiRiyal, default as SaudiRiyalIcon } from './icons/saudi-riyal.js';\nexport { default as LucideSaveAll, default as SaveAll, default as SaveAllIcon } from './icons/save-all.js';\nexport { default as LucideSaveOff, default as SaveOff, default as SaveOffIcon } from './icons/save-off.js';\nexport { default as LucideSave, default as Save, default as SaveIcon } from './icons/save.js';\nexport { default as LucideScale, default as Scale, default as ScaleIcon } from './icons/scale.js';\nexport { default as LucideScaling, default as Scaling, default as ScalingIcon } from './icons/scaling.js';\nexport { default as LucideScanBarcode, default as ScanBarcode, default as ScanBarcodeIcon } from './icons/scan-barcode.js';\nexport { default as LucideScanFace, default as ScanFace, default as ScanFaceIcon } from './icons/scan-face.js';\nexport { default as LucideScanEye, default as ScanEye, default as ScanEyeIcon } from './icons/scan-eye.js';\nexport { default as LucideScanHeart, default as ScanHeart, default as ScanHeartIcon } from './icons/scan-heart.js';\nexport { default as LucideScanLine, default as ScanLine, default as ScanLineIcon } from './icons/scan-line.js';\nexport { default as LucideScanSearch, default as ScanSearch, default as ScanSearchIcon } from './icons/scan-search.js';\nexport { default as LucideScanQrCode, default as ScanQrCode, default as ScanQrCodeIcon } from './icons/scan-qr-code.js';\nexport { default as LucideScanText, default as ScanText, default as ScanTextIcon } from './icons/scan-text.js';\nexport { default as LucideScan, default as Scan, default as ScanIcon } from './icons/scan.js';\nexport { default as LucideSchool, default as School, default as SchoolIcon } from './icons/school.js';\nexport { default as LucideScissorsLineDashed, default as ScissorsLineDashed, default as ScissorsLineDashedIcon } from './icons/scissors-line-dashed.js';\nexport { default as LucideScissors, default as Scissors, default as ScissorsIcon } from './icons/scissors.js';\nexport { default as LucideScooter, default as Scooter, default as ScooterIcon } from './icons/scooter.js';\nexport { default as LucideScreenShareOff, default as ScreenShareOff, default as ScreenShareOffIcon } from './icons/screen-share-off.js';\nexport { default as LucideScreenShare, default as ScreenShare, default as ScreenShareIcon } from './icons/screen-share.js';\nexport { default as LucideScrollText, default as ScrollText, default as ScrollTextIcon } from './icons/scroll-text.js';\nexport { default as LucideScroll, default as Scroll, default as ScrollIcon } from './icons/scroll.js';\nexport { default as LucideSearchAlert, default as SearchAlert, default as SearchAlertIcon } from './icons/search-alert.js';\nexport { default as LucideSearchCheck, default as SearchCheck, default as SearchCheckIcon } from './icons/search-check.js';\nexport { default as LucideSearchCode, default as SearchCode, default as SearchCodeIcon } from './icons/search-code.js';\nexport { default as LucideSearchX, default as SearchX, default as SearchXIcon } from './icons/search-x.js';\nexport { default as LucideSearchSlash, default as SearchSlash, default as SearchSlashIcon } from './icons/search-slash.js';\nexport { default as LucideSearch, default as Search, default as SearchIcon } from './icons/search.js';\nexport { default as LucideSection, default as Section, default as SectionIcon } from './icons/section.js';\nexport { default as LucideSend, default as Send, default as SendIcon } from './icons/send.js';\nexport { default as LucideSendToBack, default as SendToBack, default as SendToBackIcon } from './icons/send-to-back.js';\nexport { default as LucideSeparatorHorizontal, default as SeparatorHorizontal, default as SeparatorHorizontalIcon } from './icons/separator-horizontal.js';\nexport { default as LucideSeparatorVertical, default as SeparatorVertical, default as SeparatorVerticalIcon } from './icons/separator-vertical.js';\nexport { default as LucideServerCog, default as ServerCog, default as ServerCogIcon } from './icons/server-cog.js';\nexport { default as LucideServerCrash, default as ServerCrash, default as ServerCrashIcon } from './icons/server-crash.js';\nexport { default as LucideServerOff, default as ServerOff, default as ServerOffIcon } from './icons/server-off.js';\nexport { default as LucideServer, default as Server, default as ServerIcon } from './icons/server.js';\nexport { default as LucideSettings2, default as Settings2, default as Settings2Icon } from './icons/settings-2.js';\nexport { default as LucideSettings, default as Settings, default as SettingsIcon } from './icons/settings.js';\nexport { default as LucideShapes, default as Shapes, default as ShapesIcon } from './icons/shapes.js';\nexport { default as LucideShare2, default as Share2, default as Share2Icon } from './icons/share-2.js';\nexport { default as LucideShare, default as Share, default as ShareIcon } from './icons/share.js';\nexport { default as LucideSheet, default as Sheet, default as SheetIcon } from './icons/sheet.js';\nexport { default as LucideShell, default as Shell, default as ShellIcon } from './icons/shell.js';\nexport { default as LucideShieldAlert, default as ShieldAlert, default as ShieldAlertIcon } from './icons/shield-alert.js';\nexport { default as LucideShieldBan, default as ShieldBan, default as ShieldBanIcon } from './icons/shield-ban.js';\nexport { default as LucideShieldCheck, default as ShieldCheck, default as ShieldCheckIcon } from './icons/shield-check.js';\nexport { default as LucideShieldEllipsis, default as ShieldEllipsis, default as ShieldEllipsisIcon } from './icons/shield-ellipsis.js';\nexport { default as LucideShieldHalf, default as ShieldHalf, default as ShieldHalfIcon } from './icons/shield-half.js';\nexport { default as LucideShieldMinus, default as ShieldMinus, default as ShieldMinusIcon } from './icons/shield-minus.js';\nexport { default as LucideShieldOff, default as ShieldOff, default as ShieldOffIcon } from './icons/shield-off.js';\nexport { default as LucideShieldPlus, default as ShieldPlus, default as ShieldPlusIcon } from './icons/shield-plus.js';\nexport { default as LucideShieldUser, default as ShieldUser, default as ShieldUserIcon } from './icons/shield-user.js';\nexport { default as LucideShield, default as Shield, default as ShieldIcon } from './icons/shield.js';\nexport { default as LucideShipWheel, default as ShipWheel, default as ShipWheelIcon } from './icons/ship-wheel.js';\nexport { default as LucideShip, default as Ship, default as ShipIcon } from './icons/ship.js';\nexport { default as LucideShirt, default as Shirt, default as ShirtIcon } from './icons/shirt.js';\nexport { default as LucideShoppingBag, default as ShoppingBag, default as ShoppingBagIcon } from './icons/shopping-bag.js';\nexport { default as LucideShoppingBasket, default as ShoppingBasket, default as ShoppingBasketIcon } from './icons/shopping-basket.js';\nexport { default as LucideShoppingCart, default as ShoppingCart, default as ShoppingCartIcon } from './icons/shopping-cart.js';\nexport { default as LucideShovel, default as Shovel, default as ShovelIcon } from './icons/shovel.js';\nexport { default as LucideShowerHead, default as ShowerHead, default as ShowerHeadIcon } from './icons/shower-head.js';\nexport { default as LucideShredder, default as Shredder, default as ShredderIcon } from './icons/shredder.js';\nexport { default as LucideShrimp, default as Shrimp, default as ShrimpIcon } from './icons/shrimp.js';\nexport { default as LucideShrink, default as Shrink, default as ShrinkIcon } from './icons/shrink.js';\nexport { default as LucideShrub, default as Shrub, default as ShrubIcon } from './icons/shrub.js';\nexport { default as LucideShuffle, default as Shuffle, default as ShuffleIcon } from './icons/shuffle.js';\nexport { default as LucideSigma, default as Sigma, default as SigmaIcon } from './icons/sigma.js';\nexport { default as LucideSignalHigh, default as SignalHigh, default as SignalHighIcon } from './icons/signal-high.js';\nexport { default as LucideSignalLow, default as SignalLow, default as SignalLowIcon } from './icons/signal-low.js';\nexport { default as LucideSignalMedium, default as SignalMedium, default as SignalMediumIcon } from './icons/signal-medium.js';\nexport { default as LucideSignalZero, default as SignalZero, default as SignalZeroIcon } from './icons/signal-zero.js';\nexport { default as LucideSignal, default as Signal, default as SignalIcon } from './icons/signal.js';\nexport { default as LucideSignature, default as Signature, default as SignatureIcon } from './icons/signature.js';\nexport { default as LucideSignpostBig, default as SignpostBig, default as SignpostBigIcon } from './icons/signpost-big.js';\nexport { default as LucideSignpost, default as Signpost, default as SignpostIcon } from './icons/signpost.js';\nexport { default as LucideSiren, default as Siren, default as SirenIcon } from './icons/siren.js';\nexport { default as LucideSkipBack, default as SkipBack, default as SkipBackIcon } from './icons/skip-back.js';\nexport { default as LucideSkipForward, default as SkipForward, default as SkipForwardIcon } from './icons/skip-forward.js';\nexport { default as LucideSkull, default as Skull, default as SkullIcon } from './icons/skull.js';\nexport { default as LucideSlash, default as Slash, default as SlashIcon } from './icons/slash.js';\nexport { default as LucideSlack, default as Slack, default as SlackIcon } from './icons/slack.js';\nexport { default as LucideSlice, default as Slice, default as SliceIcon } from './icons/slice.js';\nexport { default as LucideSmartphoneCharging, default as SmartphoneCharging, default as SmartphoneChargingIcon } from './icons/smartphone-charging.js';\nexport { default as LucideSlidersHorizontal, default as SlidersHorizontal, default as SlidersHorizontalIcon } from './icons/sliders-horizontal.js';\nexport { default as LucideSmartphoneNfc, default as SmartphoneNfc, default as SmartphoneNfcIcon } from './icons/smartphone-nfc.js';\nexport { default as LucideSmartphone, default as Smartphone, default as SmartphoneIcon } from './icons/smartphone.js';\nexport { default as LucideSmilePlus, default as SmilePlus, default as SmilePlusIcon } from './icons/smile-plus.js';\nexport { default as LucideSmile, default as Smile, default as SmileIcon } from './icons/smile.js';\nexport { default as LucideSnowflake, default as Snowflake, default as SnowflakeIcon } from './icons/snowflake.js';\nexport { default as LucideSoapDispenserDroplet, default as SoapDispenserDroplet, default as SoapDispenserDropletIcon } from './icons/soap-dispenser-droplet.js';\nexport { default as LucideSnail, default as Snail, default as SnailIcon } from './icons/snail.js';\nexport { default as LucideSofa, default as Sofa, default as SofaIcon } from './icons/sofa.js';\nexport { default as LucideSolarPanel, default as SolarPanel, default as SolarPanelIcon } from './icons/solar-panel.js';\nexport { default as LucideSpace, default as Space, default as SpaceIcon } from './icons/space.js';\nexport { default as LucideSoup, default as Soup, default as SoupIcon } from './icons/soup.js';\nexport { default as LucideSpade, default as Spade, default as SpadeIcon } from './icons/spade.js';\nexport { default as LucideSparkle, default as Sparkle, default as SparkleIcon } from './icons/sparkle.js';\nexport { default as LucideSpeaker, default as Speaker, default as SpeakerIcon } from './icons/speaker.js';\nexport { default as LucideSpeech, default as Speech, default as SpeechIcon } from './icons/speech.js';\nexport { default as LucideSpellCheck2, default as SpellCheck2, default as SpellCheck2Icon } from './icons/spell-check-2.js';\nexport { default as LucideSpellCheck, default as SpellCheck, default as SpellCheckIcon } from './icons/spell-check.js';\nexport { default as LucideSplinePointer, default as SplinePointer, default as SplinePointerIcon } from './icons/spline-pointer.js';\nexport { default as LucideSpline, default as Spline, default as SplineIcon } from './icons/spline.js';\nexport { default as LucideSplit, default as Split, default as SplitIcon } from './icons/split.js';\nexport { default as LucideSpool, default as Spool, default as SpoolIcon } from './icons/spool.js';\nexport { default as LucideSpotlight, default as Spotlight, default as SpotlightIcon } from './icons/spotlight.js';\nexport { default as LucideSprayCan, default as SprayCan, default as SprayCanIcon } from './icons/spray-can.js';\nexport { default as LucideSprout, default as Sprout, default as SproutIcon } from './icons/sprout.js';\nexport { default as LucideSquareDashedBottomCode, default as SquareDashedBottomCode, default as SquareDashedBottomCodeIcon } from './icons/square-dashed-bottom-code.js';\nexport { default as LucideSquareDashedBottom, default as SquareDashedBottom, default as SquareDashedBottomIcon } from './icons/square-dashed-bottom.js';\nexport { default as LucideSquareDashedTopSolid, default as SquareDashedTopSolid, default as SquareDashedTopSolidIcon } from './icons/square-dashed-top-solid.js';\nexport { default as LucideSquarePause, default as SquarePause, default as SquarePauseIcon } from './icons/square-pause.js';\nexport { default as LucideSquareRadical, default as SquareRadical, default as SquareRadicalIcon } from './icons/square-radical.js';\nexport { default as LucideSquareRoundCorner, default as SquareRoundCorner, default as SquareRoundCornerIcon } from './icons/square-round-corner.js';\nexport { default as LucideSquareSquare, default as SquareSquare, default as SquareSquareIcon } from './icons/square-square.js';\nexport { default as LucideSquareStack, default as SquareStack, default as SquareStackIcon } from './icons/square-stack.js';\nexport { default as LucideSquareStar, default as SquareStar, default as SquareStarIcon } from './icons/square-star.js';\nexport { default as LucideSquareStop, default as SquareStop, default as SquareStopIcon } from './icons/square-stop.js';\nexport { default as LucideSquare, default as Square, default as SquareIcon } from './icons/square.js';\nexport { default as LucideSquaresExclude, default as SquaresExclude, default as SquaresExcludeIcon } from './icons/squares-exclude.js';\nexport { default as LucideSquaresSubtract, default as SquaresSubtract, default as SquaresSubtractIcon } from './icons/squares-subtract.js';\nexport { default as LucideSquaresIntersect, default as SquaresIntersect, default as SquaresIntersectIcon } from './icons/squares-intersect.js';\nexport { default as LucideSquaresUnite, default as SquaresUnite, default as SquaresUniteIcon } from './icons/squares-unite.js';\nexport { default as LucideSquircleDashed, default as SquircleDashed, default as SquircleDashedIcon } from './icons/squircle-dashed.js';\nexport { default as LucideSquircle, default as Squircle, default as SquircleIcon } from './icons/squircle.js';\nexport { default as LucideSquirrel, default as Squirrel, default as SquirrelIcon } from './icons/squirrel.js';\nexport { default as LucideStamp, default as Stamp, default as StampIcon } from './icons/stamp.js';\nexport { default as LucideStarHalf, default as StarHalf, default as StarHalfIcon } from './icons/star-half.js';\nexport { default as LucideStar, default as Star, default as StarIcon } from './icons/star.js';\nexport { default as LucideStarOff, default as StarOff, default as StarOffIcon } from './icons/star-off.js';\nexport { default as LucideStepBack, default as StepBack, default as StepBackIcon } from './icons/step-back.js';\nexport { default as LucideStepForward, default as StepForward, default as StepForwardIcon } from './icons/step-forward.js';\nexport { default as LucideSticker, default as Sticker, default as StickerIcon } from './icons/sticker.js';\nexport { default as LucideStethoscope, default as Stethoscope, default as StethoscopeIcon } from './icons/stethoscope.js';\nexport { default as LucideStickyNote, default as StickyNote, default as StickyNoteIcon } from './icons/sticky-note.js';\nexport { default as LucideStone, default as Stone, default as StoneIcon } from './icons/stone.js';\nexport { default as LucideStore, default as Store, default as StoreIcon } from './icons/store.js';\nexport { default as LucideStretchHorizontal, default as StretchHorizontal, default as StretchHorizontalIcon } from './icons/stretch-horizontal.js';\nexport { default as LucideStretchVertical, default as StretchVertical, default as StretchVerticalIcon } from './icons/stretch-vertical.js';\nexport { default as LucideStrikethrough, default as Strikethrough, default as StrikethroughIcon } from './icons/strikethrough.js';\nexport { default as LucideSunDim, default as SunDim, default as SunDimIcon } from './icons/sun-dim.js';\nexport { default as LucideSubscript, default as Subscript, default as SubscriptIcon } from './icons/subscript.js';\nexport { default as LucideSunMedium, default as SunMedium, default as SunMediumIcon } from './icons/sun-medium.js';\nexport { default as LucideSunMoon, default as SunMoon, default as SunMoonIcon } from './icons/sun-moon.js';\nexport { default as LucideSunSnow, default as SunSnow, default as SunSnowIcon } from './icons/sun-snow.js';\nexport { default as LucideSun, default as Sun, default as SunIcon } from './icons/sun.js';\nexport { default as LucideSunrise, default as Sunrise, default as SunriseIcon } from './icons/sunrise.js';\nexport { default as LucideSunset, default as Sunset, default as SunsetIcon } from './icons/sunset.js';\nexport { default as LucideSwatchBook, default as SwatchBook, default as SwatchBookIcon } from './icons/swatch-book.js';\nexport { default as LucideSuperscript, default as Superscript, default as SuperscriptIcon } from './icons/superscript.js';\nexport { default as LucideSwissFranc, default as SwissFranc, default as SwissFrancIcon } from './icons/swiss-franc.js';\nexport { default as LucideSword, default as Sword, default as SwordIcon } from './icons/sword.js';\nexport { default as LucideSwitchCamera, default as SwitchCamera, default as SwitchCameraIcon } from './icons/switch-camera.js';\nexport { default as LucideSwords, default as Swords, default as SwordsIcon } from './icons/swords.js';\nexport { default as LucideSyringe, default as Syringe, default as SyringeIcon } from './icons/syringe.js';\nexport { default as LucideTable2, default as Table2, default as Table2Icon } from './icons/table-2.js';\nexport { default as LucideTableCellsMerge, default as TableCellsMerge, default as TableCellsMergeIcon } from './icons/table-cells-merge.js';\nexport { default as LucideTableCellsSplit, default as TableCellsSplit, default as TableCellsSplitIcon } from './icons/table-cells-split.js';\nexport { default as LucideTableColumnsSplit, default as TableColumnsSplit, default as TableColumnsSplitIcon } from './icons/table-columns-split.js';\nexport { default as LucideTableOfContents, default as TableOfContents, default as TableOfContentsIcon } from './icons/table-of-contents.js';\nexport { default as LucideTableProperties, default as TableProperties, default as TablePropertiesIcon } from './icons/table-properties.js';\nexport { default as LucideTableRowsSplit, default as TableRowsSplit, default as TableRowsSplitIcon } from './icons/table-rows-split.js';\nexport { default as LucideTable, default as Table, default as TableIcon } from './icons/table.js';\nexport { default as LucideTabletSmartphone, default as TabletSmartphone, default as TabletSmartphoneIcon } from './icons/tablet-smartphone.js';\nexport { default as LucideTablet, default as Tablet, default as TabletIcon } from './icons/tablet.js';\nexport { default as LucideTablets, default as Tablets, default as TabletsIcon } from './icons/tablets.js';\nexport { default as LucideTag, default as Tag, default as TagIcon } from './icons/tag.js';\nexport { default as LucideTally1, default as Tally1, default as Tally1Icon } from './icons/tally-1.js';\nexport { default as LucideTags, default as Tags, default as TagsIcon } from './icons/tags.js';\nexport { default as LucideTally2, default as Tally2, default as Tally2Icon } from './icons/tally-2.js';\nexport { default as LucideTally3, default as Tally3, default as Tally3Icon } from './icons/tally-3.js';\nexport { default as LucideTally5, default as Tally5, default as Tally5Icon } from './icons/tally-5.js';\nexport { default as LucideTally4, default as Tally4, default as Tally4Icon } from './icons/tally-4.js';\nexport { default as LucideTangent, default as Tangent, default as TangentIcon } from './icons/tangent.js';\nexport { default as LucideTarget, default as Target, default as TargetIcon } from './icons/target.js';\nexport { default as LucideTelescope, default as Telescope, default as TelescopeIcon } from './icons/telescope.js';\nexport { default as LucideTentTree, default as TentTree, default as TentTreeIcon } from './icons/tent-tree.js';\nexport { default as LucideTent, default as Tent, default as TentIcon } from './icons/tent.js';\nexport { default as LucideTerminal, default as Terminal, default as TerminalIcon } from './icons/terminal.js';\nexport { default as LucideTestTube, default as TestTube, default as TestTubeIcon } from './icons/test-tube.js';\nexport { default as LucideTestTubes, default as TestTubes, default as TestTubesIcon } from './icons/test-tubes.js';\nexport { default as LucideTextCursorInput, default as TextCursorInput, default as TextCursorInputIcon } from './icons/text-cursor-input.js';\nexport { default as LucideTextCursor, default as TextCursor, default as TextCursorIcon } from './icons/text-cursor.js';\nexport { default as LucideTextQuote, default as TextQuote, default as TextQuoteIcon } from './icons/text-quote.js';\nexport { default as LucideTextSearch, default as TextSearch, default as TextSearchIcon } from './icons/text-search.js';\nexport { default as LucideTheater, default as Theater, default as TheaterIcon } from './icons/theater.js';\nexport { default as LucideThermometerSnowflake, default as ThermometerSnowflake, default as ThermometerSnowflakeIcon } from './icons/thermometer-snowflake.js';\nexport { default as LucideThermometerSun, default as ThermometerSun, default as ThermometerSunIcon } from './icons/thermometer-sun.js';\nexport { default as LucideThermometer, default as Thermometer, default as ThermometerIcon } from './icons/thermometer.js';\nexport { default as LucideThumbsDown, default as ThumbsDown, default as ThumbsDownIcon } from './icons/thumbs-down.js';\nexport { default as LucideThumbsUp, default as ThumbsUp, default as ThumbsUpIcon } from './icons/thumbs-up.js';\nexport { default as LucideTicketCheck, default as TicketCheck, default as TicketCheckIcon } from './icons/ticket-check.js';\nexport { default as LucideTicketMinus, default as TicketMinus, default as TicketMinusIcon } from './icons/ticket-minus.js';\nexport { default as LucideTicketPercent, default as TicketPercent, default as TicketPercentIcon } from './icons/ticket-percent.js';\nexport { default as LucideTicketPlus, default as TicketPlus, default as TicketPlusIcon } from './icons/ticket-plus.js';\nexport { default as LucideTicketSlash, default as TicketSlash, default as TicketSlashIcon } from './icons/ticket-slash.js';\nexport { default as LucideTicketX, default as TicketX, default as TicketXIcon } from './icons/ticket-x.js';\nexport { default as LucideTicket, default as Ticket, default as TicketIcon } from './icons/ticket.js';\nexport { default as LucideTicketsPlane, default as TicketsPlane, default as TicketsPlaneIcon } from './icons/tickets-plane.js';\nexport { default as LucideTickets, default as Tickets, default as TicketsIcon } from './icons/tickets.js';\nexport { default as LucideTimerReset, default as TimerReset, default as TimerResetIcon } from './icons/timer-reset.js';\nexport { default as LucideTimerOff, default as TimerOff, default as TimerOffIcon } from './icons/timer-off.js';\nexport { default as LucideTimer, default as Timer, default as TimerIcon } from './icons/timer.js';\nexport { default as LucideToggleLeft, default as ToggleLeft, default as ToggleLeftIcon } from './icons/toggle-left.js';\nexport { default as LucideToggleRight, default as ToggleRight, default as ToggleRightIcon } from './icons/toggle-right.js';\nexport { default as LucideToilet, default as Toilet, default as ToiletIcon } from './icons/toilet.js';\nexport { default as LucideToolCase, default as ToolCase, default as ToolCaseIcon } from './icons/tool-case.js';\nexport { default as LucideToolbox, default as Toolbox, default as ToolboxIcon } from './icons/toolbox.js';\nexport { default as LucideTouchpadOff, default as TouchpadOff, default as TouchpadOffIcon } from './icons/touchpad-off.js';\nexport { default as LucideTornado, default as Tornado, default as TornadoIcon } from './icons/tornado.js';\nexport { default as LucideTorus, default as Torus, default as TorusIcon } from './icons/torus.js';\nexport { default as LucideTouchpad, default as Touchpad, default as TouchpadIcon } from './icons/touchpad.js';\nexport { default as LucideTowerControl, default as TowerControl, default as TowerControlIcon } from './icons/tower-control.js';\nexport { default as LucideToyBrick, default as ToyBrick, default as ToyBrickIcon } from './icons/toy-brick.js';\nexport { default as LucideTractor, default as Tractor, default as TractorIcon } from './icons/tractor.js';\nexport { default as LucideTrafficCone, default as TrafficCone, default as TrafficConeIcon } from './icons/traffic-cone.js';\nexport { default as LucideTrainFrontTunnel, default as TrainFrontTunnel, default as TrainFrontTunnelIcon } from './icons/train-front-tunnel.js';\nexport { default as LucideTrainFront, default as TrainFront, default as TrainFrontIcon } from './icons/train-front.js';\nexport { default as LucideTrainTrack, default as TrainTrack, default as TrainTrackIcon } from './icons/train-track.js';\nexport { default as LucideTransgender, default as Transgender, default as TransgenderIcon } from './icons/transgender.js';\nexport { default as LucideTrash2, default as Trash2, default as Trash2Icon } from './icons/trash-2.js';\nexport { default as LucideTrash, default as Trash, default as TrashIcon } from './icons/trash.js';\nexport { default as LucideTreeDeciduous, default as TreeDeciduous, default as TreeDeciduousIcon } from './icons/tree-deciduous.js';\nexport { default as LucideTreePine, default as TreePine, default as TreePineIcon } from './icons/tree-pine.js';\nexport { default as LucideTrees, default as Trees, default as TreesIcon } from './icons/trees.js';\nexport { default as LucideTrello, default as Trello, default as TrelloIcon } from './icons/trello.js';\nexport { default as LucideTrendingDown, default as TrendingDown, default as TrendingDownIcon } from './icons/trending-down.js';\nexport { default as LucideTrendingUpDown, default as TrendingUpDown, default as TrendingUpDownIcon } from './icons/trending-up-down.js';\nexport { default as LucideTrendingUp, default as TrendingUp, default as TrendingUpIcon } from './icons/trending-up.js';\nexport { default as LucideTriangleDashed, default as TriangleDashed, default as TriangleDashedIcon } from './icons/triangle-dashed.js';\nexport { default as LucideTriangleRight, default as TriangleRight, default as TriangleRightIcon } from './icons/triangle-right.js';\nexport { default as LucideTriangle, default as Triangle, default as TriangleIcon } from './icons/triangle.js';\nexport { default as LucideTrophy, default as Trophy, default as TrophyIcon } from './icons/trophy.js';\nexport { default as LucideTruckElectric, default as TruckElectric, default as TruckElectricIcon } from './icons/truck-electric.js';\nexport { default as LucideTruck, default as Truck, default as TruckIcon } from './icons/truck.js';\nexport { default as LucideTurkishLira, default as TurkishLira, default as TurkishLiraIcon } from './icons/turkish-lira.js';\nexport { default as LucideTurntable, default as Turntable, default as TurntableIcon } from './icons/turntable.js';\nexport { default as LucideTurtle, default as Turtle, default as TurtleIcon } from './icons/turtle.js';\nexport { default as LucideTvMinimalPlay, default as TvMinimalPlay, default as TvMinimalPlayIcon } from './icons/tv-minimal-play.js';\nexport { default as LucideTv, default as Tv, default as TvIcon } from './icons/tv.js';\nexport { default as LucideTwitch, default as Twitch, default as TwitchIcon } from './icons/twitch.js';\nexport { default as LucideTwitter, default as Twitter, default as TwitterIcon } from './icons/twitter.js';\nexport { default as LucideTypeOutline, default as TypeOutline, default as TypeOutlineIcon } from './icons/type-outline.js';\nexport { default as LucideType, default as Type, default as TypeIcon } from './icons/type.js';\nexport { default as LucideUmbrellaOff, default as UmbrellaOff, default as UmbrellaOffIcon } from './icons/umbrella-off.js';\nexport { default as LucideUmbrella, default as Umbrella, default as UmbrellaIcon } from './icons/umbrella.js';\nexport { default as LucideUndo2, default as Undo2, default as Undo2Icon } from './icons/undo-2.js';\nexport { default as LucideUnderline, default as Underline, default as UnderlineIcon } from './icons/underline.js';\nexport { default as LucideUndoDot, default as UndoDot, default as UndoDotIcon } from './icons/undo-dot.js';\nexport { default as LucideUndo, default as Undo, default as UndoIcon } from './icons/undo.js';\nexport { default as LucideUnfoldHorizontal, default as UnfoldHorizontal, default as UnfoldHorizontalIcon } from './icons/unfold-horizontal.js';\nexport { default as LucideUnfoldVertical, default as UnfoldVertical, default as UnfoldVerticalIcon } from './icons/unfold-vertical.js';\nexport { default as LucideUnlink2, default as Unlink2, default as Unlink2Icon } from './icons/unlink-2.js';\nexport { default as LucideUnlink, default as Unlink, default as UnlinkIcon } from './icons/unlink.js';\nexport { default as LucideUngroup, default as Ungroup, default as UngroupIcon } from './icons/ungroup.js';\nexport { default as LucideUnplug, default as Unplug, default as UnplugIcon } from './icons/unplug.js';\nexport { default as LucideUpload, default as Upload, default as UploadIcon } from './icons/upload.js';\nexport { default as LucideUsb, default as Usb, default as UsbIcon } from './icons/usb.js';\nexport { default as LucideUserCheck, default as UserCheck, default as UserCheckIcon } from './icons/user-check.js';\nexport { default as LucideUserLock, default as UserLock, default as UserLockIcon } from './icons/user-lock.js';\nexport { default as LucideUserCog, default as UserCog, default as UserCogIcon } from './icons/user-cog.js';\nexport { default as LucideUserMinus, default as UserMinus, default as UserMinusIcon } from './icons/user-minus.js';\nexport { default as LucideUserPen, default as UserPen, default as UserPenIcon } from './icons/user-pen.js';\nexport { default as LucideUserPlus, default as UserPlus, default as UserPlusIcon } from './icons/user-plus.js';\nexport { default as LucideUserRoundPen, default as UserRoundPen, default as UserRoundPenIcon } from './icons/user-round-pen.js';\nexport { default as LucideUserRoundSearch, default as UserRoundSearch, default as UserRoundSearchIcon } from './icons/user-round-search.js';\nexport { default as LucideUserSearch, default as UserSearch, default as UserSearchIcon } from './icons/user-search.js';\nexport { default as LucideUserStar, default as UserStar, default as UserStarIcon } from './icons/user-star.js';\nexport { default as LucideUserX, default as UserX, default as UserXIcon } from './icons/user-x.js';\nexport { default as LucideUser, default as User, default as UserIcon } from './icons/user.js';\nexport { default as LucideUsers, default as Users, default as UsersIcon } from './icons/users.js';\nexport { default as LucideUtilityPole, default as UtilityPole, default as UtilityPoleIcon } from './icons/utility-pole.js';\nexport { default as LucideVan, default as Van, default as VanIcon } from './icons/van.js';\nexport { default as LucideVariable, default as Variable, default as VariableIcon } from './icons/variable.js';\nexport { default as LucideVault, default as Vault, default as VaultIcon } from './icons/vault.js';\nexport { default as LucideVectorSquare, default as VectorSquare, default as VectorSquareIcon } from './icons/vector-square.js';\nexport { default as LucideVegan, default as Vegan, default as VeganIcon } from './icons/vegan.js';\nexport { default as LucideVenusAndMars, default as VenusAndMars, default as VenusAndMarsIcon } from './icons/venus-and-mars.js';\nexport { default as LucideVenetianMask, default as VenetianMask, default as VenetianMaskIcon } from './icons/venetian-mask.js';\nexport { default as LucideVibrateOff, default as VibrateOff, default as VibrateOffIcon } from './icons/vibrate-off.js';\nexport { default as LucideVenus, default as Venus, default as VenusIcon } from './icons/venus.js';\nexport { default as LucideVideoOff, default as VideoOff, default as VideoOffIcon } from './icons/video-off.js';\nexport { default as LucideVibrate, default as Vibrate, default as VibrateIcon } from './icons/vibrate.js';\nexport { default as LucideVideo, default as Video, default as VideoIcon } from './icons/video.js';\nexport { default as LucideVideotape, default as Videotape, default as VideotapeIcon } from './icons/videotape.js';\nexport { default as LucideView, default as View, default as ViewIcon } from './icons/view.js';\nexport { default as LucideVoicemail, default as Voicemail, default as VoicemailIcon } from './icons/voicemail.js';\nexport { default as LucideVolleyball, default as Volleyball, default as VolleyballIcon } from './icons/volleyball.js';\nexport { default as LucideVolume1, default as Volume1, default as Volume1Icon } from './icons/volume-1.js';\nexport { default as LucideVolume2, default as Volume2, default as Volume2Icon } from './icons/volume-2.js';\nexport { default as LucideVolumeOff, default as VolumeOff, default as VolumeOffIcon } from './icons/volume-off.js';\nexport { default as LucideVolumeX, default as VolumeX, default as VolumeXIcon } from './icons/volume-x.js';\nexport { default as LucideVolume, default as Volume, default as VolumeIcon } from './icons/volume.js';\nexport { default as LucideVote, default as Vote, default as VoteIcon } from './icons/vote.js';\nexport { default as LucideWalletCards, default as WalletCards, default as WalletCardsIcon } from './icons/wallet-cards.js';\nexport { default as LucideWallet, default as Wallet, default as WalletIcon } from './icons/wallet.js';\nexport { default as LucideWallpaper, default as Wallpaper, default as WallpaperIcon } from './icons/wallpaper.js';\nexport { default as LucideWand, default as Wand, default as WandIcon } from './icons/wand.js';\nexport { default as LucideWarehouse, default as Warehouse, default as WarehouseIcon } from './icons/warehouse.js';\nexport { default as LucideWashingMachine, default as WashingMachine, default as WashingMachineIcon } from './icons/washing-machine.js';\nexport { default as LucideWatch, default as Watch, default as WatchIcon } from './icons/watch.js';\nexport { default as LucideWavesArrowDown, default as WavesArrowDown, default as WavesArrowDownIcon } from './icons/waves-arrow-down.js';\nexport { default as LucideWavesArrowUp, default as WavesArrowUp, default as WavesArrowUpIcon } from './icons/waves-arrow-up.js';\nexport { default as LucideWavesLadder, default as WavesLadder, default as WavesLadderIcon } from './icons/waves-ladder.js';\nexport { default as LucideWaves, default as Waves, default as WavesIcon } from './icons/waves.js';\nexport { default as LucideWaypoints, default as Waypoints, default as WaypointsIcon } from './icons/waypoints.js';\nexport { default as LucideWebcam, default as Webcam, default as WebcamIcon } from './icons/webcam.js';\nexport { default as LucideWebhookOff, default as WebhookOff, default as WebhookOffIcon } from './icons/webhook-off.js';\nexport { default as LucideWebhook, default as Webhook, default as WebhookIcon } from './icons/webhook.js';\nexport { default as LucideWeightTilde, default as WeightTilde, default as WeightTildeIcon } from './icons/weight-tilde.js';\nexport { default as LucideWeight, default as Weight, default as WeightIcon } from './icons/weight.js';\nexport { default as LucideWheatOff, default as WheatOff, default as WheatOffIcon } from './icons/wheat-off.js';\nexport { default as LucideWholeWord, default as WholeWord, default as WholeWordIcon } from './icons/whole-word.js';\nexport { default as LucideWheat, default as Wheat, default as WheatIcon } from './icons/wheat.js';\nexport { default as LucideWifiCog, default as WifiCog, default as WifiCogIcon } from './icons/wifi-cog.js';\nexport { default as LucideWifiHigh, default as WifiHigh, default as WifiHighIcon } from './icons/wifi-high.js';\nexport { default as LucideWifiLow, default as WifiLow, default as WifiLowIcon } from './icons/wifi-low.js';\nexport { default as LucideWifiPen, default as WifiPen, default as WifiPenIcon } from './icons/wifi-pen.js';\nexport { default as LucideWifiOff, default as WifiOff, default as WifiOffIcon } from './icons/wifi-off.js';\nexport { default as LucideWifiSync, default as WifiSync, default as WifiSyncIcon } from './icons/wifi-sync.js';\nexport { default as LucideWifiZero, default as WifiZero, default as WifiZeroIcon } from './icons/wifi-zero.js';\nexport { default as LucideWifi, default as Wifi, default as WifiIcon } from './icons/wifi.js';\nexport { default as LucideWindArrowDown, default as WindArrowDown, default as WindArrowDownIcon } from './icons/wind-arrow-down.js';\nexport { default as LucideWineOff, default as WineOff, default as WineOffIcon } from './icons/wine-off.js';\nexport { default as LucideWind, default as Wind, default as WindIcon } from './icons/wind.js';\nexport { default as LucideWine, default as Wine, default as WineIcon } from './icons/wine.js';\nexport { default as LucideWorkflow, default as Workflow, default as WorkflowIcon } from './icons/workflow.js';\nexport { default as LucideWorm, default as Worm, default as WormIcon } from './icons/worm.js';\nexport { default as LucideWrench, default as Wrench, default as WrenchIcon } from './icons/wrench.js';\nexport { default as LucideX, default as X, default as XIcon } from './icons/x.js';\nexport { default as LucideYoutube, default as Youtube, default as YoutubeIcon } from './icons/youtube.js';\nexport { default as LucideZapOff, default as ZapOff, default as ZapOffIcon } from './icons/zap-off.js';\nexport { default as LucideZap, default as Zap, default as ZapIcon } from './icons/zap.js';\nexport { default as LucideZoomIn, default as ZoomIn, default as ZoomInIcon } from './icons/zoom-in.js';\nexport { default as LucideZoomOut, default as ZoomOut, default as ZoomOutIcon } from './icons/zoom-out.js';\nexport { default as ArrowDown01, default as ArrowDown01Icon, default as LucideArrowDown01 } from './icons/arrow-down-0-1.js';\nexport { default as ArrowDown10, default as ArrowDown10Icon, default as LucideArrowDown10 } from './icons/arrow-down-1-0.js';\nexport { default as ArrowUp01, default as ArrowUp01Icon, default as LucideArrowUp01 } from './icons/arrow-up-0-1.js';\nexport { default as ArrowUp10, default as ArrowUp10Icon, default as LucideArrowUp10 } from './icons/arrow-up-1-0.js';\nexport { default as createLucideIcon } from './createLucideIcon.js';\nexport { default as Icon } from './Icon.js';\n//# sourceMappingURL=lucide-react.js.map\n","/**\n * Merges classes into a single string\n *\n * @param {array} classes\n * @returns {string} A string of classes\n */\nexport const mergeClasses = <ClassType = string | undefined | null>(...classes: ClassType[]) =>\n classes\n .filter((className, index, array) => {\n return (\n Boolean(className) &&\n (className as string).trim() !== '' &&\n array.indexOf(className) === index\n );\n })\n .join(' ')\n .trim();\n","/**\n * Converts string to kebab case\n *\n * @param {string} string\n * @returns {string} A kebabized string\n */\nexport const toKebabCase = (string: string) =>\n string.replace(/([a-z0-9])([A-Z])/g, '$1-$2').toLowerCase();\n","/**\n * Converts string to camel case\n *\n * @param {string} string\n * @returns {string} A camelized string\n */\nexport const toCamelCase = <T extends string>(string: T) =>\n string.replace(/^([A-Z])|[\\s-_]+(\\w)/g, (match, p1, p2) =>\n p2 ? p2.toUpperCase() : p1.toLowerCase(),\n );\n","import { CamelToPascal } from '../utility-types';\nimport { toCamelCase } from './toCamelCase';\n\n/**\n * Converts string to pascal case\n *\n * @param {string} string\n * @returns {string} A pascalized string\n */\nexport const toPascalCase = <T extends string>(string: T): CamelToPascal<T> => {\n const camelCase = toCamelCase(string);\n\n return (camelCase.charAt(0).toUpperCase() + camelCase.slice(1)) as CamelToPascal<T>;\n};\n","export default {\n xmlns: 'http://www.w3.org/2000/svg',\n width: 24,\n height: 24,\n viewBox: '0 0 24 24',\n fill: 'none',\n stroke: 'currentColor',\n strokeWidth: 2,\n strokeLinecap: 'round',\n strokeLinejoin: 'round',\n};\n","/**\n * Check if a component has an accessibility prop\n *\n * @param {object} props\n * @returns {boolean} Whether the component has an accessibility prop\n */\nexport const hasA11yProp = (props: Record<string, any>) => {\n for (const prop in props) {\n if (prop.startsWith('aria-') || prop === 'role' || prop === 'title') {\n return true;\n }\n }\n\n return false;\n};\n","import { createElement, forwardRef } from 'react';\nimport defaultAttributes from './defaultAttributes';\nimport { IconNode, LucideProps } from './types';\nimport { mergeClasses, hasA11yProp } from '@lucide/shared';\n\ninterface IconComponentProps extends LucideProps {\n iconNode: IconNode;\n}\n\n/**\n * Lucide icon component\n *\n * @component Icon\n * @param {object} props\n * @param {string} props.color - The color of the icon\n * @param {number} props.size - The size of the icon\n * @param {number} props.strokeWidth - The stroke width of the icon\n * @param {boolean} props.absoluteStrokeWidth - Whether to use absolute stroke width\n * @param {string} props.className - The class name of the icon\n * @param {IconNode} props.children - The children of the icon\n * @param {IconNode} props.iconNode - The icon node of the icon\n *\n * @returns {ForwardRefExoticComponent} LucideIcon\n */\nconst Icon = forwardRef<SVGSVGElement, IconComponentProps>(\n (\n {\n color = 'currentColor',\n size = 24,\n strokeWidth = 2,\n absoluteStrokeWidth,\n className = '',\n children,\n iconNode,\n ...rest\n },\n ref,\n ) =>\n createElement(\n 'svg',\n {\n ref,\n ...defaultAttributes,\n width: size,\n height: size,\n stroke: color,\n strokeWidth: absoluteStrokeWidth ? (Number(strokeWidth) * 24) / Number(size) : strokeWidth,\n className: mergeClasses('lucide', className),\n ...(!children && !hasA11yProp(rest) && { 'aria-hidden': 'true' }),\n ...rest,\n },\n [\n ...iconNode.map(([tag, attrs]) => createElement(tag, attrs)),\n ...(Array.isArray(children) ? children : [children]),\n ],\n ),\n);\n\nexport default Icon;\n","import { createElement, forwardRef } from 'react';\nimport { mergeClasses, toKebabCase, toPascalCase } from '@lucide/shared';\nimport { IconNode, LucideProps } from './types';\nimport Icon from './Icon';\n\n/**\n * Create a Lucide icon component\n * @param {string} iconName\n * @param {array} iconNode\n * @returns {ForwardRefExoticComponent} LucideIcon\n */\nconst createLucideIcon = (iconName: string, iconNode: IconNode) => {\n const Component = forwardRef<SVGSVGElement, LucideProps>(({ className, ...props }, ref) =>\n createElement(Icon, {\n ref,\n iconNode,\n className: mergeClasses(\n `lucide-${toKebabCase(toPascalCase(iconName))}`,\n `lucide-${iconName}`,\n className,\n ),\n ...props,\n }),\n );\n\n Component.displayName = toPascalCase(iconName);\n\n return Component;\n};\n\nexport default createLucideIcon;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['path', { d: 'M12 5v14', key: 's699le' }],\n ['path', { d: 'm19 12-7 7-7-7', key: '1idqje' }],\n];\n\n/**\n * @component @name ArrowDown\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMTIgNXYxNCIgLz4KICA8cGF0aCBkPSJtMTkgMTItNyA3LTctNyIgLz4KPC9zdmc+Cg==) - https://lucide.dev/icons/arrow-down\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst ArrowDown = createLucideIcon('arrow-down', __iconNode);\n\nexport default ArrowDown;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['path', { d: 'm5 12 7-7 7 7', key: 'hav0vg' }],\n ['path', { d: 'M12 19V5', key: 'x0mq9r' }],\n];\n\n/**\n * @component @name ArrowUp\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJtNSAxMiA3LTcgNyA3IiAvPgogIDxwYXRoIGQ9Ik0xMiAxOVY1IiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/arrow-up\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst ArrowUp = createLucideIcon('arrow-up', __iconNode);\n\nexport default ArrowUp;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [['path', { d: 'M20 6 9 17l-5-5', key: '1gmf2c' }]];\n\n/**\n * @component @name Check\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMjAgNiA5IDE3bC01LTUiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/check\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Check = createLucideIcon('check', __iconNode);\n\nexport default Check;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [['path', { d: 'm6 9 6 6 6-6', key: 'qrunsl' }]];\n\n/**\n * @component @name ChevronDown\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJtNiA5IDYgNiA2LTYiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/chevron-down\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst ChevronDown = createLucideIcon('chevron-down', __iconNode);\n\nexport default ChevronDown;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [['path', { d: 'm9 18 6-6-6-6', key: 'mthhwq' }]];\n\n/**\n * @component @name ChevronRight\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJtOSAxOCA2LTYtNi02IiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/chevron-right\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst ChevronRight = createLucideIcon('chevron-right', __iconNode);\n\nexport default ChevronRight;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['rect', { width: '8', height: '4', x: '8', y: '2', rx: '1', ry: '1', key: 'tgr4d6' }],\n ['path', { d: 'M8 4H6a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2v-2', key: '4jdomd' }],\n ['path', { d: 'M16 4h2a2 2 0 0 1 2 2v4', key: '3hqy98' }],\n ['path', { d: 'M21 14H11', key: '1bme5i' }],\n ['path', { d: 'm15 10-4 4 4 4', key: '5dvupr' }],\n];\n\n/**\n * @component @name ClipboardCopy\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cmVjdCB3aWR0aD0iOCIgaGVpZ2h0PSI0IiB4PSI4IiB5PSIyIiByeD0iMSIgcnk9IjEiIC8+CiAgPHBhdGggZD0iTTggNEg2YTIgMiAwIDAgMC0yIDJ2MTRhMiAyIDAgMCAwIDIgMmgxMmEyIDIgMCAwIDAgMi0ydi0yIiAvPgogIDxwYXRoIGQ9Ik0xNiA0aDJhMiAyIDAgMCAxIDIgMnY0IiAvPgogIDxwYXRoIGQ9Ik0yMSAxNEgxMSIgLz4KICA8cGF0aCBkPSJtMTUgMTAtNCA0IDQgNCIgLz4KPC9zdmc+Cg==) - https://lucide.dev/icons/clipboard-copy\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst ClipboardCopy = createLucideIcon('clipboard-copy', __iconNode);\n\nexport default ClipboardCopy;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['path', { d: 'M12 6v6l4 2', key: 'mmk7yg' }],\n ['circle', { cx: '12', cy: '12', r: '10', key: '1mglay' }],\n];\n\n/**\n * @component @name Clock\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMTIgNnY2bDQgMiIgLz4KICA8Y2lyY2xlIGN4PSIxMiIgY3k9IjEyIiByPSIxMCIgLz4KPC9zdmc+Cg==) - https://lucide.dev/icons/clock\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Clock = createLucideIcon('clock', __iconNode);\n\nexport default Clock;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n [\n 'path',\n {\n d: 'M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z',\n key: '1oefj6',\n },\n ],\n ['path', { d: 'M14 2v5a1 1 0 0 0 1 1h5', key: 'wfsgrz' }],\n];\n\n/**\n * @component @name File\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNNiAyMmEyIDIgMCAwIDEtMi0yVjRhMiAyIDAgMCAxIDItMmg4YTIuNCAyLjQgMCAwIDEgMS43MDQuNzA2bDMuNTg4IDMuNTg4QTIuNCAyLjQgMCAwIDEgMjAgOHYxMmEyIDIgMCAwIDEtMiAyeiIgLz4KICA8cGF0aCBkPSJNMTQgMnY1YTEgMSAwIDAgMCAxIDFoNSIgLz4KPC9zdmc+Cg==) - https://lucide.dev/icons/file\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst File = createLucideIcon('file', __iconNode);\n\nexport default File;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['circle', { cx: '12', cy: '12', r: '10', key: '1mglay' }],\n ['path', { d: 'M12 2a14.5 14.5 0 0 0 0 20 14.5 14.5 0 0 0 0-20', key: '13o1zl' }],\n ['path', { d: 'M2 12h20', key: '9i4pu4' }],\n];\n\n/**\n * @component @name Globe\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8Y2lyY2xlIGN4PSIxMiIgY3k9IjEyIiByPSIxMCIgLz4KICA8cGF0aCBkPSJNMTIgMmExNC41IDE0LjUgMCAwIDAgMCAyMCAxNC41IDE0LjUgMCAwIDAgMC0yMCIgLz4KICA8cGF0aCBkPSJNMiAxMmgyMCIgLz4KPC9zdmc+Cg==) - https://lucide.dev/icons/globe\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Globe = createLucideIcon('globe', __iconNode);\n\nexport default Globe;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['path', { d: 'M12 2v4', key: '3427ic' }],\n ['path', { d: 'm16.2 7.8 2.9-2.9', key: 'r700ao' }],\n ['path', { d: 'M18 12h4', key: 'wj9ykh' }],\n ['path', { d: 'm16.2 16.2 2.9 2.9', key: '1bxg5t' }],\n ['path', { d: 'M12 18v4', key: 'jadmvz' }],\n ['path', { d: 'm4.9 19.1 2.9-2.9', key: 'bwix9q' }],\n ['path', { d: 'M2 12h4', key: 'j09sii' }],\n ['path', { d: 'm4.9 4.9 2.9 2.9', key: 'giyufr' }],\n];\n\n/**\n * @component @name Loader\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMTIgMnY0IiAvPgogIDxwYXRoIGQ9Im0xNi4yIDcuOCAyLjktMi45IiAvPgogIDxwYXRoIGQ9Ik0xOCAxMmg0IiAvPgogIDxwYXRoIGQ9Im0xNi4yIDE2LjIgMi45IDIuOSIgLz4KICA8cGF0aCBkPSJNMTIgMTh2NCIgLz4KICA8cGF0aCBkPSJtNC45IDE5LjEgMi45LTIuOSIgLz4KICA8cGF0aCBkPSJNMiAxMmg0IiAvPgogIDxwYXRoIGQ9Im00LjkgNC45IDIuOSAyLjkiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/loader\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Loader = createLucideIcon('loader', __iconNode);\n\nexport default Loader;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n [\n 'path',\n {\n d: 'm16 6-8.414 8.586a2 2 0 0 0 2.829 2.829l8.414-8.586a4 4 0 1 0-5.657-5.657l-8.379 8.551a6 6 0 1 0 8.485 8.485l8.379-8.551',\n key: '1miecu',\n },\n ],\n];\n\n/**\n * @component @name Paperclip\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJtMTYgNi04LjQxNCA4LjU4NmEyIDIgMCAwIDAgMi44MjkgMi44MjlsOC40MTQtOC41ODZhNCA0IDAgMSAwLTUuNjU3LTUuNjU3bC04LjM3OSA4LjU1MWE2IDYgMCAxIDAgOC40ODUgOC40ODVsOC4zNzktOC41NTEiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/paperclip\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Paperclip = createLucideIcon('paperclip', __iconNode);\n\nexport default Paperclip;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['rect', { width: '18', height: '18', x: '3', y: '3', rx: '2', key: 'afitv7' }],\n];\n\n/**\n * @component @name Square\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cmVjdCB3aWR0aD0iMTgiIGhlaWdodD0iMTgiIHg9IjMiIHk9IjMiIHJ4PSIyIiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/square\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Square = createLucideIcon('square', __iconNode);\n\nexport default Square;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n [\n 'path',\n {\n d: 'M14.7 6.3a1 1 0 0 0 0 1.4l1.6 1.6a1 1 0 0 0 1.4 0l3.106-3.105c.32-.322.863-.22.983.218a6 6 0 0 1-8.259 7.057l-7.91 7.91a1 1 0 0 1-2.999-3l7.91-7.91a6 6 0 0 1 7.057-8.259c.438.12.54.662.219.984z',\n key: '1ngwbx',\n },\n ],\n];\n\n/**\n * @component @name Wrench\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMTQuNyA2LjNhMSAxIDAgMCAwIDAgMS40bDEuNiAxLjZhMSAxIDAgMCAwIDEuNCAwbDMuMTA2LTMuMTA1Yy4zMi0uMzIyLjg2My0uMjIuOTgzLjIxOGE2IDYgMCAwIDEtOC4yNTkgNy4wNTdsLTcuOTEgNy45MWExIDEgMCAwIDEtMi45OTktM2w3LjkxLTcuOTFhNiA2IDAgMCAxIDcuMDU3LTguMjU5Yy40MzguMTIuNTQuNjYyLjIxOS45ODR6IiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/wrench\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Wrench = createLucideIcon('wrench', __iconNode);\n\nexport default Wrench;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n ['path', { d: 'M18 6 6 18', key: '1bl5f8' }],\n ['path', { d: 'm6 6 12 12', key: 'd8bk6v' }],\n];\n\n/**\n * @component @name X\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMTggNiA2IDE4IiAvPgogIDxwYXRoIGQ9Im02IDYgMTIgMTIiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/x\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst X = createLucideIcon('x', __iconNode);\n\nexport default X;\n","import createLucideIcon from '../createLucideIcon';\nimport { IconNode } from '../types';\n\nexport const __iconNode: IconNode = [\n [\n 'path',\n {\n d: 'M4 14a1 1 0 0 1-.78-1.63l9.9-10.2a.5.5 0 0 1 .86.46l-1.92 6.02A1 1 0 0 0 13 10h7a1 1 0 0 1 .78 1.63l-9.9 10.2a.5.5 0 0 1-.86-.46l1.92-6.02A1 1 0 0 0 11 14z',\n key: '1xq2db',\n },\n ],\n];\n\n/**\n * @component @name Zap\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNNCAxNGExIDEgMCAwIDEtLjc4LTEuNjNsOS45LTEwLjJhLjUuNSAwIDAgMSAuODYuNDZsLTEuOTIgNi4wMkExIDEgMCAwIDAgMTMgMTBoN2ExIDEgMCAwIDEgLjc4IDEuNjNsLTkuOSAxMC4yYS41LjUgMCAwIDEtLjg2LS40NmwxLjkyLTYuMDJBMSAxIDAgMCAwIDExIDE0eiIgLz4KPC9zdmc+Cg==) - https://lucide.dev/icons/zap\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Zap = createLucideIcon('zap', __iconNode);\n\nexport default Zap;\n","/*!---------------------------------------------------------------------------------------------\n * Copyright (c) StackBlitz. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\nimport { useCallback, useMemo, useRef, useState, } from \"react\";\nconst DEFAULT_SPRING_ANIMATION = {\n /**\n * A value from 0 to 1, on how much to damp the animation.\n * 0 means no damping, 1 means full damping.\n *\n * @default 0.7\n */\n damping: 0.7,\n /**\n * The stiffness of how fast/slow the animation gets up to speed.\n *\n * @default 0.05\n */\n stiffness: 0.05,\n /**\n * The inertial mass associated with the animation.\n * Higher numbers make the animation slower.\n *\n * @default 1.25\n */\n mass: 1.25,\n};\nconst STICK_TO_BOTTOM_OFFSET_PX = 70;\nconst SIXTY_FPS_INTERVAL_MS = 1000 / 60;\nconst RETAIN_ANIMATION_DURATION_MS = 350;\nlet mouseDown = false;\nglobalThis.document?.addEventListener(\"mousedown\", () => {\n mouseDown = true;\n});\nglobalThis.document?.addEventListener(\"mouseup\", () => {\n mouseDown = false;\n});\nglobalThis.document?.addEventListener(\"click\", () => {\n mouseDown = false;\n});\nexport const useStickToBottom = (options = {}) => {\n const [escapedFromLock, updateEscapedFromLock] = useState(false);\n const [isAtBottom, updateIsAtBottom] = useState(options.initial !== false);\n const [isNearBottom, setIsNearBottom] = useState(false);\n const optionsRef = useRef(null);\n optionsRef.current = options;\n const isSelecting = useCallback(() => {\n if (!mouseDown) {\n return false;\n }\n const selection = window.getSelection();\n if (!selection || !selection.rangeCount) {\n return false;\n }\n const range = selection.getRangeAt(0);\n return (range.commonAncestorContainer.contains(scrollRef.current) ||\n scrollRef.current?.contains(range.commonAncestorContainer));\n }, []);\n const setIsAtBottom = useCallback((isAtBottom) => {\n state.isAtBottom = isAtBottom;\n updateIsAtBottom(isAtBottom);\n }, []);\n const setEscapedFromLock = useCallback((escapedFromLock) => {\n state.escapedFromLock = escapedFromLock;\n updateEscapedFromLock(escapedFromLock);\n }, []);\n // biome-ignore lint/correctness/useExhaustiveDependencies: not needed\n const state = useMemo(() => {\n let lastCalculation;\n return {\n escapedFromLock,\n isAtBottom,\n resizeDifference: 0,\n accumulated: 0,\n velocity: 0,\n listeners: new Set(),\n get scrollTop() {\n return scrollRef.current?.scrollTop ?? 0;\n },\n set scrollTop(scrollTop) {\n if (scrollRef.current) {\n scrollRef.current.scrollTop = scrollTop;\n state.ignoreScrollToTop = scrollRef.current.scrollTop;\n }\n },\n get targetScrollTop() {\n if (!scrollRef.current || !contentRef.current) {\n return 0;\n }\n return (scrollRef.current.scrollHeight - 1 - scrollRef.current.clientHeight);\n },\n get calculatedTargetScrollTop() {\n if (!scrollRef.current || !contentRef.current) {\n return 0;\n }\n const { targetScrollTop } = this;\n if (!options.targetScrollTop) {\n return targetScrollTop;\n }\n if (lastCalculation?.targetScrollTop === targetScrollTop) {\n return lastCalculation.calculatedScrollTop;\n }\n const calculatedScrollTop = Math.max(Math.min(options.targetScrollTop(targetScrollTop, {\n scrollElement: scrollRef.current,\n contentElement: contentRef.current,\n }), targetScrollTop), 0);\n lastCalculation = { targetScrollTop, calculatedScrollTop };\n requestAnimationFrame(() => {\n lastCalculation = undefined;\n });\n return calculatedScrollTop;\n },\n get scrollDifference() {\n return this.calculatedTargetScrollTop - this.scrollTop;\n },\n get isNearBottom() {\n return this.scrollDifference <= STICK_TO_BOTTOM_OFFSET_PX;\n },\n };\n }, []);\n const scrollToBottom = useCallback((scrollOptions = {}) => {\n if (typeof scrollOptions === \"string\") {\n scrollOptions = { animation: scrollOptions };\n }\n if (!scrollOptions.preserveScrollPosition) {\n setIsAtBottom(true);\n }\n const waitElapsed = Date.now() + (Number(scrollOptions.wait) || 0);\n const behavior = mergeAnimations(optionsRef.current, scrollOptions.animation);\n const { ignoreEscapes = false } = scrollOptions;\n let durationElapsed;\n let startTarget = state.calculatedTargetScrollTop;\n if (scrollOptions.duration instanceof Promise) {\n scrollOptions.duration.finally(() => {\n durationElapsed = Date.now();\n });\n }\n else {\n durationElapsed = waitElapsed + (scrollOptions.duration ?? 0);\n }\n const next = async () => {\n const promise = new Promise(requestAnimationFrame).then(() => {\n if (!state.isAtBottom) {\n state.animation = undefined;\n return false;\n }\n const { scrollTop } = state;\n const tick = performance.now();\n const tickDelta = (tick - (state.lastTick ?? tick)) / SIXTY_FPS_INTERVAL_MS;\n state.animation || (state.animation = { behavior, promise, ignoreEscapes });\n if (state.animation.behavior === behavior) {\n state.lastTick = tick;\n }\n if (isSelecting()) {\n return next();\n }\n if (waitElapsed > Date.now()) {\n return next();\n }\n if (scrollTop < Math.min(startTarget, state.calculatedTargetScrollTop)) {\n if (state.animation?.behavior === behavior) {\n if (behavior === \"instant\") {\n state.scrollTop = state.calculatedTargetScrollTop;\n return next();\n }\n state.velocity =\n (behavior.damping * state.velocity +\n behavior.stiffness * state.scrollDifference) /\n behavior.mass;\n state.accumulated += state.velocity * tickDelta;\n state.scrollTop += state.accumulated;\n if (state.scrollTop !== scrollTop) {\n state.accumulated = 0;\n }\n }\n return next();\n }\n if (durationElapsed > Date.now()) {\n startTarget = state.calculatedTargetScrollTop;\n return next();\n }\n state.animation = undefined;\n /**\n * If we're still below the target, then queue\n * up another scroll to the bottom with the last\n * requested animatino.\n */\n if (state.scrollTop < state.calculatedTargetScrollTop) {\n return scrollToBottom({\n animation: mergeAnimations(optionsRef.current, optionsRef.current.resize),\n ignoreEscapes,\n duration: Math.max(0, durationElapsed - Date.now()) || undefined,\n });\n }\n return state.isAtBottom;\n });\n return promise.then((isAtBottom) => {\n requestAnimationFrame(() => {\n if (!state.animation) {\n state.lastTick = undefined;\n state.velocity = 0;\n }\n });\n return isAtBottom;\n });\n };\n if (scrollOptions.wait !== true) {\n state.animation = undefined;\n }\n if (state.animation?.behavior === behavior) {\n return state.animation.promise;\n }\n return next();\n }, [setIsAtBottom, isSelecting, state]);\n const stopScroll = useCallback(() => {\n setEscapedFromLock(true);\n setIsAtBottom(false);\n }, [setEscapedFromLock, setIsAtBottom]);\n const handleScroll = useCallback(({ target }) => {\n if (target !== scrollRef.current) {\n return;\n }\n const { scrollTop, ignoreScrollToTop } = state;\n let { lastScrollTop = scrollTop } = state;\n state.lastScrollTop = scrollTop;\n state.ignoreScrollToTop = undefined;\n if (ignoreScrollToTop && ignoreScrollToTop > scrollTop) {\n /**\n * When the user scrolls up while the animation plays, the `scrollTop` may\n * not come in separate events; if this happens, to make sure `isScrollingUp`\n * is correct, set the lastScrollTop to the ignored event.\n */\n lastScrollTop = ignoreScrollToTop;\n }\n setIsNearBottom(state.isNearBottom);\n /**\n * Scroll events may come before a ResizeObserver event,\n * so in order to ignore resize events correctly we use a\n * timeout.\n *\n * @see https://github.com/WICG/resize-observer/issues/25#issuecomment-248757228\n */\n setTimeout(() => {\n /**\n * When theres a resize difference ignore the resize event.\n */\n if (state.resizeDifference || scrollTop === ignoreScrollToTop) {\n return;\n }\n if (isSelecting()) {\n setEscapedFromLock(true);\n setIsAtBottom(false);\n return;\n }\n const isScrollingDown = scrollTop > lastScrollTop;\n const isScrollingUp = scrollTop < lastScrollTop;\n if (state.animation?.ignoreEscapes) {\n state.scrollTop = lastScrollTop;\n return;\n }\n if (isScrollingUp) {\n setEscapedFromLock(true);\n setIsAtBottom(false);\n }\n if (isScrollingDown) {\n setEscapedFromLock(false);\n }\n if (!state.escapedFromLock && state.isNearBottom) {\n setIsAtBottom(true);\n }\n }, 1);\n }, [setEscapedFromLock, setIsAtBottom, isSelecting, state]);\n const handleWheel = useCallback(({ target, deltaY }) => {\n let element = target;\n while (![\"scroll\", \"auto\"].includes(getComputedStyle(element).overflow)) {\n if (!element.parentElement) {\n return;\n }\n element = element.parentElement;\n }\n /**\n * The browser may cancel the scrolling from the mouse wheel\n * if we update it from the animation in meantime.\n * To prevent this, always escape when the wheel is scrolled up.\n */\n if (element === scrollRef.current &&\n deltaY < 0 &&\n scrollRef.current.scrollHeight > scrollRef.current.clientHeight &&\n !state.animation?.ignoreEscapes) {\n setEscapedFromLock(true);\n setIsAtBottom(false);\n }\n }, [setEscapedFromLock, setIsAtBottom, state]);\n const scrollRef = useRefCallback((scroll) => {\n scrollRef.current?.removeEventListener(\"scroll\", handleScroll);\n scrollRef.current?.removeEventListener(\"wheel\", handleWheel);\n scroll?.addEventListener(\"scroll\", handleScroll, { passive: true });\n scroll?.addEventListener(\"wheel\", handleWheel, { passive: true });\n }, []);\n const contentRef = useRefCallback((content) => {\n state.resizeObserver?.disconnect();\n if (!content) {\n return;\n }\n let previousHeight;\n state.resizeObserver = new ResizeObserver(([entry]) => {\n const { height } = entry.contentRect;\n const difference = height - (previousHeight ?? height);\n state.resizeDifference = difference;\n /**\n * Sometimes the browser can overscroll past the target,\n * so check for this and adjust appropriately.\n */\n if (state.scrollTop > state.targetScrollTop) {\n state.scrollTop = state.targetScrollTop;\n }\n setIsNearBottom(state.isNearBottom);\n if (difference >= 0) {\n /**\n * If it's a positive resize, scroll to the bottom when\n * we're already at the bottom.\n */\n const animation = mergeAnimations(optionsRef.current, previousHeight\n ? optionsRef.current.resize\n : optionsRef.current.initial);\n scrollToBottom({\n animation,\n wait: true,\n preserveScrollPosition: true,\n duration: animation === \"instant\" ? undefined : RETAIN_ANIMATION_DURATION_MS,\n });\n }\n else {\n /**\n * Else if it's a negative resize, check if we're near the bottom\n * if we are want to un-escape from the lock, because the resize\n * could have caused the container to be at the bottom.\n */\n if (state.isNearBottom) {\n setEscapedFromLock(false);\n setIsAtBottom(true);\n }\n }\n previousHeight = height;\n /**\n * Reset the resize difference after the scroll event\n * has fired. Requires a rAF to wait for the scroll event,\n * and a setTimeout to wait for the other timeout we have in\n * resizeObserver in case the scroll event happens after the\n * resize event.\n */\n requestAnimationFrame(() => {\n setTimeout(() => {\n if (state.resizeDifference === difference) {\n state.resizeDifference = 0;\n }\n }, 1);\n });\n });\n state.resizeObserver?.observe(content);\n }, []);\n return {\n contentRef,\n scrollRef,\n scrollToBottom,\n stopScroll,\n isAtBottom: isAtBottom || isNearBottom,\n isNearBottom,\n escapedFromLock,\n state,\n };\n};\nfunction useRefCallback(callback, deps) {\n // biome-ignore lint/correctness/useExhaustiveDependencies: not needed\n const result = useCallback((ref) => {\n result.current = ref;\n return callback(ref);\n }, deps);\n return result;\n}\nconst animationCache = new Map();\nfunction mergeAnimations(...animations) {\n const result = { ...DEFAULT_SPRING_ANIMATION };\n let instant = false;\n for (const animation of animations) {\n if (animation === \"instant\") {\n instant = true;\n continue;\n }\n if (typeof animation !== \"object\") {\n continue;\n }\n instant = false;\n result.damping = animation.damping ?? result.damping;\n result.stiffness = animation.stiffness ?? result.stiffness;\n result.mass = animation.mass ?? result.mass;\n }\n const key = JSON.stringify(result);\n if (!animationCache.has(key)) {\n animationCache.set(key, Object.freeze(result));\n }\n return instant ? \"instant\" : animationCache.get(key);\n}\n","/*!---------------------------------------------------------------------------------------------\n * Copyright (c) StackBlitz. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\nimport * as React from \"react\";\nimport { createContext, useContext, useEffect, useImperativeHandle, useLayoutEffect, useMemo, useRef, } from \"react\";\nimport { useStickToBottom, } from \"./useStickToBottom.js\";\nconst StickToBottomContext = createContext(null);\nconst useIsomorphicLayoutEffect = typeof window !== \"undefined\" ? useLayoutEffect : useEffect;\nexport function StickToBottom({ instance, children, resize, initial, mass, damping, stiffness, targetScrollTop: currentTargetScrollTop, contextRef, ...props }) {\n const customTargetScrollTop = useRef(null);\n const targetScrollTop = React.useCallback((target, elements) => {\n const get = context?.targetScrollTop ?? currentTargetScrollTop;\n return get?.(target, elements) ?? target;\n }, [currentTargetScrollTop]);\n const defaultInstance = useStickToBottom({\n mass,\n damping,\n stiffness,\n resize,\n initial,\n targetScrollTop,\n });\n const { scrollRef, contentRef, scrollToBottom, stopScroll, isAtBottom, escapedFromLock, state, } = instance ?? defaultInstance;\n const context = useMemo(() => ({\n scrollToBottom,\n stopScroll,\n scrollRef,\n isAtBottom,\n escapedFromLock,\n contentRef,\n state,\n get targetScrollTop() {\n return customTargetScrollTop.current;\n },\n set targetScrollTop(targetScrollTop) {\n customTargetScrollTop.current = targetScrollTop;\n },\n }), [\n scrollToBottom,\n isAtBottom,\n contentRef,\n scrollRef,\n stopScroll,\n escapedFromLock,\n state,\n ]);\n useImperativeHandle(contextRef, () => context, [context]);\n useIsomorphicLayoutEffect(() => {\n if (!scrollRef.current) {\n return;\n }\n if (getComputedStyle(scrollRef.current).overflow === \"visible\") {\n scrollRef.current.style.overflow = \"auto\";\n }\n }, []);\n return (React.createElement(StickToBottomContext.Provider, { value: context },\n React.createElement(\"div\", { ...props }, typeof children === \"function\" ? children(context) : children)));\n}\n(function (StickToBottom) {\n function Content({ children, scrollClassName, ...props }) {\n const context = useStickToBottomContext();\n return (React.createElement(\"div\", { ref: context.scrollRef, style: {\n height: \"100%\",\n width: \"100%\",\n scrollbarGutter: \"stable both-edges\",\n }, className: scrollClassName },\n React.createElement(\"div\", { ...props, ref: context.contentRef }, typeof children === \"function\" ? children(context) : children)));\n }\n StickToBottom.Content = Content;\n})(StickToBottom || (StickToBottom = {}));\n/**\n * Use this hook inside a <StickToBottom> component to gain access to whether the component is at the bottom of the scrollable area.\n */\nexport function useStickToBottomContext() {\n const context = useContext(StickToBottomContext);\n if (!context) {\n throw new Error(\"use-stick-to-bottom component context must be used within a StickToBottom component\");\n }\n return context;\n}\n","import { type ClassValue, clsx } from \"clsx\";\nimport { extendTailwindMerge } from \"tailwind-merge\";\n\nconst twMerge = extendTailwindMerge({ prefix: \"ww\" });\n\nexport function cn(...inputs: ClassValue[]) {\n\treturn twMerge(clsx(inputs));\n}\n","\"use client\";\n\nimport type { ComponentProps } from \"react\";\nimport { cn } from \"../lib/utils\";\n\nexport type ButtonProps = ComponentProps<\"button\"> & {\n\tvariant?: \"default\" | \"outline\" | \"ghost\";\n\tsize?: \"default\" | \"sm\" | \"icon\" | \"icon-sm\";\n};\n\nexport const Button = ({\n\tclassName,\n\tvariant = \"default\",\n\tsize = \"default\",\n\ttype = \"button\",\n\t...props\n}: ButtonProps) => (\n\t<button\n\t\ttype={type}\n\t\tclassName={cn(\n\t\t\t\"ww:inline-flex ww:cursor-pointer ww:items-center ww:justify-center ww:rounded-md ww:font-medium ww:transition-colors ww:disabled:pointer-events-none ww:disabled:opacity-50\",\n\t\t\tvariant === \"default\" &&\n\t\t\t\t\"ww:bg-primary ww:text-primary-foreground ww:hover:bg-primary/90\",\n\t\t\tvariant === \"outline\" &&\n\t\t\t\t\"ww:border ww:border-border ww:bg-background ww:hover:bg-accent ww:hover:text-accent-foreground\",\n\t\t\tvariant === \"ghost\" &&\n\t\t\t\t\"ww:hover:bg-accent ww:hover:text-accent-foreground\",\n\t\t\tsize === \"default\" && \"ww:h-9 ww:px-4 ww:py-2 ww:text-sm\",\n\t\t\tsize === \"sm\" && \"ww:h-8 ww:px-3 ww:text-xs\",\n\t\t\tsize === \"icon\" && \"ww:size-9 ww:!rounded-full\",\n\t\t\tsize === \"icon-sm\" && \"ww:size-7 ww:!rounded-full\",\n\t\t\tclassName,\n\t\t)}\n\t\t{...props}\n\t/>\n);\n","\"use client\";\n\nimport type { ChatStatus, FileUIPart } from \"ai\";\nimport {\n\tArrowUpIcon,\n\tLoaderIcon,\n\tPaperclipIcon,\n\tSquareIcon,\n\tXIcon,\n} from \"lucide-react\";\nimport { nanoid } from \"nanoid\";\nimport type {\n\tChangeEvent,\n\tClipboardEventHandler,\n\tComponentProps,\n\tFormEvent,\n\tFormEventHandler,\n\tHTMLAttributes,\n\tKeyboardEventHandler,\n} from \"react\";\nimport {\n\tcreateContext,\n\tuseCallback,\n\tuseContext,\n\tuseEffect,\n\tuseMemo,\n\tuseRef,\n\tuseState,\n} from \"react\";\nimport { useTranslation } from \"../i18n\";\nimport { cn } from \"../lib/utils\";\nimport { Button } from \"../ui/button\";\n\n// ============================================================================\n// Helpers\n// ============================================================================\n\nconst convertBlobUrlToDataUrl = async (url: string): Promise<string | null> => {\n\ttry {\n\t\tconst response = await fetch(url);\n\t\tconst blob = await response.blob();\n\t\treturn new Promise((resolve) => {\n\t\t\tconst reader = new FileReader();\n\t\t\treader.onloadend = () => resolve(reader.result as string);\n\t\t\treader.onerror = () => resolve(null);\n\t\t\treader.readAsDataURL(blob);\n\t\t});\n\t} catch {\n\t\treturn null;\n\t}\n};\n\n// ============================================================================\n// Attachments Context\n// ============================================================================\n\nexport interface AttachmentsContext {\n\tfiles: (FileUIPart & { id: string })[];\n\tadd: (files: File[] | FileList) => void;\n\tremove: (id: string) => void;\n\tclear: () => void;\n\topenFileDialog: () => void;\n}\n\nconst LocalAttachmentsContext = createContext<AttachmentsContext | null>(null);\n\nexport const usePromptInputAttachments = () => {\n\tconst context = useContext(LocalAttachmentsContext);\n\tif (!context) {\n\t\tthrow new Error(\n\t\t\t\"usePromptInputAttachments must be used within a PromptInput\",\n\t\t);\n\t}\n\treturn context;\n};\n\n// ============================================================================\n// PromptInput Message Type\n// ============================================================================\n\nexport interface PromptInputMessage {\n\ttext: string;\n\tfiles: FileUIPart[];\n}\n\n// ============================================================================\n// PromptInput\n// ============================================================================\n\nexport type PromptInputProps = Omit<\n\tHTMLAttributes<HTMLFormElement>,\n\t\"onSubmit\"\n> & {\n\taccept?: string;\n\tmultiple?: boolean;\n\tglobalDrop?: boolean;\n\tmaxFiles?: number;\n\tmaxFileSize?: number;\n\tonSubmit: (\n\t\tmessage: PromptInputMessage,\n\t\tevent: FormEvent<HTMLFormElement>,\n\t) => void | Promise<void>;\n};\n\nexport const PromptInput = ({\n\tclassName,\n\taccept,\n\tmultiple,\n\tglobalDrop,\n\tmaxFiles,\n\tmaxFileSize,\n\tonSubmit,\n\tchildren,\n\t...props\n}: PromptInputProps) => {\n\tconst { t } = useTranslation();\n\tconst inputRef = useRef<HTMLInputElement | null>(null);\n\tconst formRef = useRef<HTMLFormElement | null>(null);\n\tconst [items, setItems] = useState<(FileUIPart & { id: string })[]>([]);\n\tconst filesRef = useRef(items);\n\n\tuseEffect(() => {\n\t\tfilesRef.current = items;\n\t}, [items]);\n\n\tconst openFileDialog = useCallback(() => {\n\t\tinputRef.current?.click();\n\t}, []);\n\n\tconst add = useCallback(\n\t\t(fileList: File[] | FileList) => {\n\t\t\tconst incoming = [...fileList];\n\t\t\tif (incoming.length === 0) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst withinSize = (f: File) =>\n\t\t\t\tmaxFileSize ? f.size <= maxFileSize : true;\n\t\t\tconst valid = incoming.filter(withinSize);\n\n\t\t\tsetItems((prev) => {\n\t\t\t\tconst capacity =\n\t\t\t\t\ttypeof maxFiles === \"number\"\n\t\t\t\t\t\t? Math.max(0, maxFiles - prev.length)\n\t\t\t\t\t\t: undefined;\n\t\t\t\tconst capped =\n\t\t\t\t\ttypeof capacity === \"number\" ? valid.slice(0, capacity) : valid;\n\t\t\t\treturn [\n\t\t\t\t\t...prev,\n\t\t\t\t\t...capped.map((file) => ({\n\t\t\t\t\t\tfilename: file.name,\n\t\t\t\t\t\tid: nanoid(),\n\t\t\t\t\t\tmediaType: file.type,\n\t\t\t\t\t\ttype: \"file\" as const,\n\t\t\t\t\t\turl: URL.createObjectURL(file),\n\t\t\t\t\t})),\n\t\t\t\t];\n\t\t\t});\n\t\t},\n\t\t[maxFiles, maxFileSize],\n\t);\n\n\tconst remove = useCallback((id: string) => {\n\t\tsetItems((prev) => {\n\t\t\tconst found = prev.find((f) => f.id === id);\n\t\t\tif (found?.url) {\n\t\t\t\tURL.revokeObjectURL(found.url);\n\t\t\t}\n\t\t\treturn prev.filter((f) => f.id !== id);\n\t\t});\n\t}, []);\n\n\tconst clear = useCallback(() => {\n\t\tsetItems((prev) => {\n\t\t\tfor (const f of prev) {\n\t\t\t\tif (f.url) {\n\t\t\t\t\tURL.revokeObjectURL(f.url);\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn [];\n\t\t});\n\t}, []);\n\n\t// Cleanup blob URLs on unmount\n\tuseEffect(\n\t\t() => () => {\n\t\t\tfor (const f of filesRef.current) {\n\t\t\t\tif (f.url) {\n\t\t\t\t\tURL.revokeObjectURL(f.url);\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t[],\n\t);\n\n\tconst handleChange = useCallback(\n\t\t(event: ChangeEvent<HTMLInputElement>) => {\n\t\t\tif (event.currentTarget.files) {\n\t\t\t\tadd(event.currentTarget.files);\n\t\t\t}\n\t\t\tevent.currentTarget.value = \"\";\n\t\t},\n\t\t[add],\n\t);\n\n\t// Global drop support\n\tuseEffect(() => {\n\t\tif (!globalDrop) {\n\t\t\treturn;\n\t\t}\n\t\tconst onDragOver = (e: DragEvent) => {\n\t\t\tif (e.dataTransfer?.types?.includes(\"Files\")) {\n\t\t\t\te.preventDefault();\n\t\t\t}\n\t\t};\n\t\tconst onDrop = (e: DragEvent) => {\n\t\t\tif (e.dataTransfer?.types?.includes(\"Files\")) {\n\t\t\t\te.preventDefault();\n\t\t\t}\n\t\t\tif (e.dataTransfer?.files && e.dataTransfer.files.length > 0) {\n\t\t\t\tadd(e.dataTransfer.files);\n\t\t\t}\n\t\t};\n\t\tdocument.addEventListener(\"dragover\", onDragOver);\n\t\tdocument.addEventListener(\"drop\", onDrop);\n\t\treturn () => {\n\t\t\tdocument.removeEventListener(\"dragover\", onDragOver);\n\t\t\tdocument.removeEventListener(\"drop\", onDrop);\n\t\t};\n\t}, [add, globalDrop]);\n\n\tconst handleSubmit: FormEventHandler<HTMLFormElement> = useCallback(\n\t\tasync (event) => {\n\t\t\tevent.preventDefault();\n\t\t\tconst form = event.currentTarget;\n\t\t\tconst formData = new FormData(form);\n\t\t\tconst text = (formData.get(\"message\") as string) || \"\";\n\n\t\t\tform.reset();\n\n\t\t\tconst convertedFiles: FileUIPart[] = await Promise.all(\n\t\t\t\titems.map(async ({ id: _id, ...item }) => {\n\t\t\t\t\tif (item.url?.startsWith(\"blob:\")) {\n\t\t\t\t\t\tconst dataUrl = await convertBlobUrlToDataUrl(item.url);\n\t\t\t\t\t\treturn { ...item, url: dataUrl ?? item.url };\n\t\t\t\t\t}\n\t\t\t\t\treturn item;\n\t\t\t\t}),\n\t\t\t);\n\n\t\t\ttry {\n\t\t\t\tconst result = onSubmit({ files: convertedFiles, text }, event);\n\t\t\t\tif (result instanceof Promise) {\n\t\t\t\t\tawait result;\n\t\t\t\t}\n\t\t\t\tclear();\n\t\t\t} catch {\n\t\t\t\t// Don't clear on error\n\t\t\t}\n\t\t},\n\t\t[items, onSubmit, clear],\n\t);\n\n\tconst attachmentsCtx = useMemo<AttachmentsContext>(\n\t\t() => ({\n\t\t\tadd,\n\t\t\tclear,\n\t\t\tfiles: items,\n\t\t\topenFileDialog,\n\t\t\tremove,\n\t\t}),\n\t\t[items, add, remove, clear, openFileDialog],\n\t);\n\n\treturn (\n\t\t<LocalAttachmentsContext.Provider value={attachmentsCtx}>\n\t\t\t<input\n\t\t\t\taccept={accept}\n\t\t\t\taria-label={t.promptInput.uploadFiles}\n\t\t\t\tclassName=\"ww:hidden\"\n\t\t\t\tmultiple={multiple}\n\t\t\t\tonChange={handleChange}\n\t\t\t\tref={inputRef}\n\t\t\t\ttitle={t.promptInput.uploadFiles}\n\t\t\t\ttype=\"file\"\n\t\t\t/>\n\t\t\t<form\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"ww:flex ww:w-full ww:flex-col ww:rounded-lg ww:border ww:border-border ww:bg-background\",\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t\tonSubmit={handleSubmit}\n\t\t\t\tref={formRef}\n\t\t\t\t{...props}\n\t\t\t>\n\t\t\t\t{children}\n\t\t\t</form>\n\t\t</LocalAttachmentsContext.Provider>\n\t);\n};\n\n// ============================================================================\n// Layout Components\n// ============================================================================\n\nexport type PromptInputHeaderProps = HTMLAttributes<HTMLDivElement>;\n\nexport const PromptInputHeader = ({\n\tclassName,\n\t...props\n}: PromptInputHeaderProps) => (\n\t<div\n\t\tclassName={cn(\"ww:flex ww:flex-wrap ww:gap-1 ww:px-3 ww:pt-3\", className)}\n\t\t{...props}\n\t/>\n);\n\nexport type PromptInputBodyProps = HTMLAttributes<HTMLDivElement>;\n\nexport const PromptInputBody = ({\n\tclassName,\n\t...props\n}: PromptInputBodyProps) => (\n\t<div className={cn(\"ww:contents\", className)} {...props} />\n);\n\nexport type PromptInputFooterProps = HTMLAttributes<HTMLDivElement>;\n\nexport const PromptInputFooter = ({\n\tclassName,\n\t...props\n}: PromptInputFooterProps) => (\n\t<div\n\t\tclassName={cn(\n\t\t\t\"ww:flex ww:items-center ww:justify-between ww:gap-1 ww:px-3 ww:pb-3\",\n\t\t\tclassName,\n\t\t)}\n\t\t{...props}\n\t/>\n);\n\nexport type PromptInputToolsProps = HTMLAttributes<HTMLDivElement>;\n\nexport const PromptInputTools = ({\n\tclassName,\n\t...props\n}: PromptInputToolsProps) => (\n\t<div\n\t\tclassName={cn(\"ww:flex ww:min-w-0 ww:items-center ww:gap-1\", className)}\n\t\t{...props}\n\t/>\n);\n\n// ============================================================================\n// Textarea\n// ============================================================================\n\nexport type PromptInputTextareaProps = ComponentProps<\"textarea\">;\n\nexport const PromptInputTextarea = ({\n\tonChange,\n\tonKeyDown,\n\tclassName,\n\tplaceholder,\n\t...props\n}: PromptInputTextareaProps) => {\n\tconst { t } = useTranslation();\n\tconst attachments = usePromptInputAttachments();\n\tconst [isComposing, setIsComposing] = useState(false);\n\tconst resolvedPlaceholder = placeholder ?? t.promptInput.placeholder;\n\n\tconst handleKeyDown: KeyboardEventHandler<HTMLTextAreaElement> = useCallback(\n\t\t(e) => {\n\t\t\tonKeyDown?.(e);\n\t\t\tif (e.defaultPrevented) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (e.key === \"Enter\") {\n\t\t\t\tif (isComposing || e.nativeEvent.isComposing) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (e.shiftKey) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\te.preventDefault();\n\n\t\t\t\tconst { form } = e.currentTarget;\n\t\t\t\tconst submitButton = form?.querySelector(\n\t\t\t\t\t'button[type=\"submit\"]',\n\t\t\t\t) as HTMLButtonElement | null;\n\t\t\t\tif (submitButton?.disabled) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tform?.requestSubmit();\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\te.key === \"Backspace\" &&\n\t\t\t\te.currentTarget.value === \"\" &&\n\t\t\t\tattachments.files.length > 0\n\t\t\t) {\n\t\t\t\te.preventDefault();\n\t\t\t\tconst lastAttachment = attachments.files.at(-1);\n\t\t\t\tif (lastAttachment) {\n\t\t\t\t\tattachments.remove(lastAttachment.id);\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t[onKeyDown, isComposing, attachments],\n\t);\n\n\tconst handlePaste: ClipboardEventHandler<HTMLTextAreaElement> = useCallback(\n\t\t(event) => {\n\t\t\tconst items = event.clipboardData?.items;\n\t\t\tif (!items) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst files: File[] = [];\n\t\t\tfor (const item of items) {\n\t\t\t\tif (item.kind === \"file\") {\n\t\t\t\t\tconst file = item.getAsFile();\n\t\t\t\t\tif (file) {\n\t\t\t\t\t\tfiles.push(file);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (files.length > 0) {\n\t\t\t\tevent.preventDefault();\n\t\t\t\tattachments.add(files);\n\t\t\t}\n\t\t},\n\t\t[attachments],\n\t);\n\n\t// `ww:text-base` (16px) on mobile is load-bearing: iOS Safari auto-zooms\n\t// any focused input/textarea under 16px, breaking the chat layout. The\n\t// `ww:sm:text-sm` override restores the smaller text on tablet+ where the\n\t// zoom rule doesn't apply.\n\treturn (\n\t\t<textarea\n\t\t\tclassName={cn(\n\t\t\t\t\"ww:field-sizing-content ww:max-h-48 ww:min-h-0 ww:w-full ww:resize-none ww:border-0 ww:bg-transparent ww:px-3 ww:py-2 ww:text-base ww:sm:text-sm ww:outline-none ww:placeholder:text-muted-foreground\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\tname=\"message\"\n\t\t\tonCompositionEnd={() => setIsComposing(false)}\n\t\t\tonCompositionStart={() => setIsComposing(true)}\n\t\t\tonKeyDown={handleKeyDown}\n\t\t\tonPaste={handlePaste}\n\t\t\tplaceholder={resolvedPlaceholder}\n\t\t\tonChange={onChange}\n\t\t\t{...props}\n\t\t/>\n\t);\n};\n\n// ============================================================================\n// Submit Button\n// ============================================================================\n\nexport type PromptInputSubmitProps = ComponentProps<typeof Button> & {\n\tstatus?: ChatStatus;\n\tonStop?: () => void;\n};\n\nexport const PromptInputSubmit = ({\n\tclassName,\n\tstatus,\n\tonStop,\n\tonClick,\n\tchildren,\n\t...props\n}: PromptInputSubmitProps) => {\n\tconst { t } = useTranslation();\n\tconst isGenerating = status === \"submitted\" || status === \"streaming\";\n\n\tlet Icon = <ArrowUpIcon className=\"ww:size-4\" />;\n\tif (status === \"submitted\") {\n\t\tIcon = <LoaderIcon className=\"ww:size-4 ww:animate-spin\" />;\n\t} else if (status === \"streaming\") {\n\t\tIcon = <SquareIcon className=\"ww:size-4\" />;\n\t}\n\n\tconst handleClick = useCallback(\n\t\t(e: React.MouseEvent<HTMLButtonElement>) => {\n\t\t\tif (isGenerating && onStop) {\n\t\t\t\te.preventDefault();\n\t\t\t\tonStop();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tonClick?.(e);\n\t\t},\n\t\t[isGenerating, onStop, onClick],\n\t);\n\n\treturn (\n\t\t<Button\n\t\t\taria-label={isGenerating ? t.promptInput.stop : t.promptInput.submit}\n\t\t\tclassName={cn(\n\t\t\t\t\"ww:bg-foreground ww:text-background ww:hover:bg-foreground ww:rounded-full\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\tonClick={handleClick}\n\t\t\tsize=\"icon-sm\"\n\t\t\ttype={isGenerating && onStop ? \"button\" : \"submit\"}\n\t\t\tvariant=\"ghost\"\n\t\t\t{...props}\n\t\t>\n\t\t\t{children ?? Icon}\n\t\t</Button>\n\t);\n};\n\n// ============================================================================\n// Attachment Add Button (simple file picker, no Radix dropdown)\n// ============================================================================\n\nexport type PromptInputAddAttachmentsProps = ComponentProps<typeof Button>;\n\nexport const PromptInputAddAttachments = ({\n\tclassName,\n\tchildren,\n\t...props\n}: PromptInputAddAttachmentsProps) => {\n\tconst { t } = useTranslation();\n\tconst attachments = usePromptInputAttachments();\n\tconst hasFiles = attachments.files.length > 0;\n\n\tif (hasFiles) {\n\t\treturn (\n\t\t\t<Button\n\t\t\t\tclassName={cn(\"ww:group ww:relative\", className)}\n\t\t\t\tonClick={() => attachments.clear()}\n\t\t\t\tsize=\"icon-sm\"\n\t\t\t\ttype=\"button\"\n\t\t\t\tvariant=\"ghost\"\n\t\t\t\taria-label={t.promptInput.removeAttachments}\n\t\t\t\t{...props}\n\t\t\t>\n\t\t\t\t<span className=\"ww:flex ww:size-5 ww:items-center ww:justify-center ww:rounded-full ww:bg-primary ww:text-[10px] ww:font-medium ww:text-primary-foreground ww:transition-opacity ww:group-hover:opacity-0\">\n\t\t\t\t\t{attachments.files.length}\n\t\t\t\t</span>\n\t\t\t\t<XIcon className=\"ww:absolute ww:size-4 ww:opacity-0 ww:transition-opacity ww:group-hover:opacity-100\" />\n\t\t\t</Button>\n\t\t);\n\t}\n\n\treturn (\n\t\t<Button\n\t\t\tclassName={cn(className)}\n\t\t\tonClick={() => attachments.openFileDialog()}\n\t\t\tsize=\"icon-sm\"\n\t\t\ttype=\"button\"\n\t\t\tvariant=\"ghost\"\n\t\t\t{...props}\n\t\t>\n\t\t\t{children ?? <PaperclipIcon className=\"ww:size-4\" />}\n\t\t</Button>\n\t);\n};\n","import crypto from 'crypto'\nimport { urlAlphabet } from './url-alphabet/index.js'\nconst POOL_SIZE_MULTIPLIER = 128\nlet pool, poolOffset\nlet fillPool = bytes => {\n if (!pool || pool.length < bytes) {\n pool = Buffer.allocUnsafe(bytes * POOL_SIZE_MULTIPLIER)\n crypto.randomFillSync(pool)\n poolOffset = 0\n } else if (poolOffset + bytes > pool.length) {\n crypto.randomFillSync(pool)\n poolOffset = 0\n }\n poolOffset += bytes\n}\nlet random = bytes => {\n fillPool((bytes |= 0))\n return pool.subarray(poolOffset - bytes, poolOffset)\n}\nlet customRandom = (alphabet, defaultSize, getRandom) => {\n let mask = (2 << (31 - Math.clz32((alphabet.length - 1) | 1))) - 1\n let step = Math.ceil((1.6 * mask * defaultSize) / alphabet.length)\n return (size = defaultSize) => {\n let id = ''\n while (true) {\n let bytes = getRandom(step)\n let i = step\n while (i--) {\n id += alphabet[bytes[i] & mask] || ''\n if (id.length === size) return id\n }\n }\n }\n}\nlet customAlphabet = (alphabet, size = 21) =>\n customRandom(alphabet, size, random)\nlet nanoid = (size = 21) => {\n fillPool((size |= 0))\n let id = ''\n for (let i = poolOffset - size; i < poolOffset; i++) {\n id += urlAlphabet[pool[i] & 63]\n }\n return id\n}\nexport { nanoid, customAlphabet, customRandom, urlAlphabet, random }\n","let urlAlphabet =\n 'useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict'\nexport { urlAlphabet }\n","export { I18nProvider, type MessageOverrides, useTranslation } from \"./context\";\nexport { detectLocale } from \"./detect\";\nexport { formatRelativeTime } from \"./format\";\nexport type { Messages } from \"./locales/en\";\nexport {\n\tDEFAULT_LOCALE,\n\tisSupportedLocale,\n\ttype Locale,\n\tSUPPORTED_LOCALES,\n} from \"./types\";\n","\"use client\";\n\nimport {\n\tcreateContext,\n\ttype ReactNode,\n\tuseContext,\n\tuseEffect,\n\tuseMemo,\n\tuseState,\n} from \"react\";\nimport { detectLocale } from \"./detect\";\nimport { catalogs, type Messages } from \"./locales\";\nimport { en } from \"./locales/en\";\nimport { DEFAULT_LOCALE, type Locale } from \"./types\";\n\ntype DeepPartial<T> = T extends (...args: never[]) => unknown\n\t? T\n\t: T extends object\n\t\t? { [K in keyof T]?: DeepPartial<T[K]> }\n\t\t: T;\n\nexport type MessageOverrides = DeepPartial<Messages>;\n\ninterface I18nContextValue {\n\tlocale: Locale;\n\tt: Messages;\n\t/**\n\t * `true` once the locale has been resolved against the runtime\n\t * (`navigator.language` / `<html lang>`). Always `true` when an\n\t * explicit `locale` was passed to the provider, or on the no-provider\n\t * fallback path. Consumers can mask their UI (opacity 0) while this is\n\t * `false` to avoid showing a flash of the default-locale catalog before\n\t * the post-mount detection effect runs.\n\t */\n\tready: boolean;\n}\n\nconst I18nContext = createContext<I18nContextValue | null>(null);\n\ninterface I18nProviderProps {\n\tchildren: ReactNode;\n\t/**\n\t * Explicit locale. When omitted, the provider detects from\n\t * `<html lang>` / `navigator.language` and falls back to `'en'`.\n\t */\n\tlocale?: string;\n\t/**\n\t * Per-key overrides merged on top of the resolved catalog. Use to\n\t * tweak individual strings without contributing a full locale.\n\t */\n\tmessages?: MessageOverrides;\n}\n\nfunction mergeMessages(base: Messages, overrides?: MessageOverrides): Messages {\n\tif (!overrides) {\n\t\treturn base;\n\t}\n\tconst out: Record<string, unknown> = { ...base };\n\tfor (const sectionKey of Object.keys(base) as (keyof Messages)[]) {\n\t\tconst section = base[sectionKey];\n\t\tconst override = overrides[sectionKey];\n\t\tif (override && typeof section === \"object\") {\n\t\t\tout[sectionKey as string] = { ...section, ...override };\n\t\t}\n\t}\n\treturn out as unknown as Messages;\n}\n\nexport function I18nProvider({\n\tchildren,\n\tlocale,\n\tmessages,\n}: I18nProviderProps) {\n\t// Initial state must be deterministic across server and client to avoid\n\t// hydration mismatches — calling `detectLocale()` (which reads\n\t// `navigator.language`) during the initializer would diverge from the\n\t// server's render. We pick the explicit prop or the default at mount,\n\t// then resolve the real locale in the effect below once the tree has\n\t// hydrated. `ready` lets consumers (ChatEmbed) mask their UI during\n\t// the detection window so users don't see a flash of English chrome\n\t// before the catalog swaps.\n\tconst explicit = Boolean(locale && isLocaleString(locale));\n\tconst initial: Locale = explicit ? (locale as Locale) : DEFAULT_LOCALE;\n\tconst [resolved, setResolved] = useState<Locale>(initial);\n\tconst [ready, setReady] = useState<boolean>(explicit);\n\n\tuseEffect(() => {\n\t\tsetResolved(detectLocale(locale));\n\t\tsetReady(true);\n\t}, [locale]);\n\n\tconst value = useMemo<I18nContextValue>(() => {\n\t\tconst catalog = catalogs[resolved] ?? catalogs[DEFAULT_LOCALE];\n\t\treturn {\n\t\t\tlocale: resolved,\n\t\t\tt: mergeMessages(catalog, messages),\n\t\t\tready,\n\t\t};\n\t}, [resolved, messages, ready]);\n\n\treturn <I18nContext.Provider value={value}>{children}</I18nContext.Provider>;\n}\n\nfunction isLocaleString(value: string): boolean {\n\treturn value === \"en\" || value === \"fr\" || value === \"es\";\n}\n\n/**\n * Access translated messages and the active locale. Falls back to the\n * English catalog when called outside an `I18nProvider` (e.g. legacy\n * `ChatCard` usage, isolated tests). This makes the SDK i18n-aware\n * without forcing every existing consumer to wrap their tree.\n */\nexport function useTranslation(): I18nContextValue {\n\tconst ctx = useContext(I18nContext);\n\tif (ctx) {\n\t\treturn ctx;\n\t}\n\treturn { locale: DEFAULT_LOCALE, t: en, ready: true };\n}\n","import { DEFAULT_LOCALE, isSupportedLocale, type Locale } from \"./types\";\n\n/**\n * Resolve the active locale. Precedence:\n * explicit prop > `navigator.language(s)` > `<html lang>` > `'en'`.\n *\n * Visitor preference wins over the host page's declared language so a\n * Spanish-speaking visitor on an `<html lang=\"en\">` site sees Spanish\n * chrome — matches how chat widgets (Intercom, Drift) behave.\n *\n * Region tags fall back to the language prefix (e.g. `fr-CA` → `fr`,\n * `es-ES` → `es`). SSR-safe: returns the fallback when `navigator` /\n * `document` are absent.\n */\nexport function detectLocale(explicit?: string): Locale {\n\tif (explicit && isSupportedLocale(explicit)) {\n\t\treturn explicit;\n\t}\n\tif (explicit) {\n\t\tconst prefix = explicit.split(\"-\")[0]?.toLowerCase();\n\t\tif (prefix && isSupportedLocale(prefix)) {\n\t\t\treturn prefix;\n\t\t}\n\t}\n\n\tconst candidates: string[] = [];\n\n\tif (typeof navigator !== \"undefined\") {\n\t\tif (navigator.language) {\n\t\t\tcandidates.push(navigator.language);\n\t\t}\n\t\tif (navigator.languages) {\n\t\t\tcandidates.push(...navigator.languages);\n\t\t}\n\t}\n\n\tif (typeof document !== \"undefined\") {\n\t\tconst htmlLang = document.documentElement.getAttribute(\"lang\");\n\t\tif (htmlLang) {\n\t\t\tcandidates.push(htmlLang);\n\t\t}\n\t}\n\n\tfor (const raw of candidates) {\n\t\tconst lowered = raw.toLowerCase();\n\t\tif (isSupportedLocale(lowered)) {\n\t\t\treturn lowered;\n\t\t}\n\t\tconst prefix = lowered.split(\"-\")[0];\n\t\tif (prefix && isSupportedLocale(prefix)) {\n\t\t\treturn prefix;\n\t\t}\n\t}\n\n\treturn DEFAULT_LOCALE;\n}\n","/**\n * Chat widget translation types.\n *\n * The English catalog is the source of truth — its shape is inferred and\n * every other locale must match it exactly (enforced by `ExactShape`).\n * Add a key in `en.ts` and TypeScript will flag the missing key in `fr.ts`\n * / `es.ts`.\n */\n\nexport const SUPPORTED_LOCALES = [\"en\", \"fr\", \"es\"] as const;\nexport type Locale = (typeof SUPPORTED_LOCALES)[number];\n\nexport const DEFAULT_LOCALE: Locale = \"en\";\n\nexport type MessageValue =\n\t| string\n\t| ((...args: never[]) => string)\n\t| { [key: string]: MessageValue };\n\ntype ExactShape<T> = T extends (...args: infer A) => string\n\t? (...args: A) => string\n\t: T extends string\n\t\t? string\n\t\t: T extends Record<string, MessageValue>\n\t\t\t? { [K in keyof T]: ExactShape<T[K]> }\n\t\t\t: MessageValue;\n\nexport type MessagesFor<T extends Record<string, MessageValue>> = ExactShape<T>;\n\nexport function isSupportedLocale(value: string): value is Locale {\n\treturn (SUPPORTED_LOCALES as readonly string[]).includes(value);\n}\n","import type { Locale } from \"../types\";\nimport { en, type Messages } from \"./en\";\nimport { es } from \"./es\";\nimport { fr } from \"./fr\";\n\nexport type { Messages };\n\nexport const catalogs: Record<Locale, Messages> = {\n\ten,\n\tfr,\n\tes,\n};\n","/**\n * English catalog. Source of truth — every other locale must mirror this\n * shape exactly (the `Messages` type is inferred from here).\n */\n\nexport interface Messages {\n\tpromptInput: {\n\t\tplaceholder: string;\n\t\tuploadFiles: string;\n\t\tstop: string;\n\t\tsubmit: string;\n\t\tremoveAttachments: string;\n\t};\n\tworkingIndicator: {\n\t\tdefault: string;\n\t};\n\treasoning: {\n\t\tthinking: string;\n\t\tthoughtBrief: string;\n\t\tthoughtForSeconds: (count: number) => string;\n\t};\n\t/** Chain-of-thought header (no icon): a generic label per state. */\n\tchainOfThought: {\n\t\tworking: string;\n\t\tdone: string;\n\t};\n\ttool: {\n\t\tcopy: string;\n\t\tcopied: string;\n\t\trequest: string;\n\t\tresponse: string;\n\t\terror: string;\n\t};\n\tattachments: {\n\t\tattachmentFallback: string;\n\t\tfileFallback: string;\n\t};\n\tthreadMenu: {\n\t\tnewChat: string;\n\t\tthreadHistory: string;\n\t\tdeleteThread: string;\n\t\tnoPreviousChats: string;\n\t\thiddenThreads: (count: number) => string;\n\t};\n\tchatQueue: {\n\t\tattachmentFallback: string;\n\t\tremoveFromQueue: string;\n\t\tqueued: (count: number) => string;\n\t};\n\tpoweredBy: {\n\t\tlabel: string;\n\t};\n\taiDisclaimer: {\n\t\tdefault: string;\n\t};\n\texportSession: {\n\t\tsaving: string;\n\t\tsaved: string;\n\t\terror: string;\n\t\texport: string;\n\t\ttooltip: string;\n\t};\n\twidgetErrorBoundary: {\n\t\tfailedToLoad: string;\n\t\tretry: string;\n\t};\n\tlauncher: {\n\t\tprompt: string;\n\t\topen: string;\n\t\tclose: string;\n\t\tminimize: string;\n\t};\n}\n\nexport const en: Messages = {\n\tpromptInput: {\n\t\tplaceholder: \"What would you like to know?\",\n\t\tuploadFiles: \"Upload files\",\n\t\tstop: \"Stop\",\n\t\tsubmit: \"Submit\",\n\t\tremoveAttachments: \"Remove all attachments\",\n\t},\n\tworkingIndicator: {\n\t\tdefault: \"On it…\",\n\t},\n\treasoning: {\n\t\tthinking: \"Thinking…\",\n\t\tthoughtBrief: \"Thought for a few seconds\",\n\t\tthoughtForSeconds: (count: number) =>\n\t\t\t`Thought for ${count} second${count === 1 ? \"\" : \"s\"}`,\n\t},\n\tchainOfThought: {\n\t\tworking: \"Working on it…\",\n\t\tdone: \"Thought process\",\n\t},\n\ttool: {\n\t\tcopy: \"Copy\",\n\t\tcopied: \"Copied\",\n\t\trequest: \"Request\",\n\t\tresponse: \"Response\",\n\t\terror: \"Error\",\n\t},\n\tattachments: {\n\t\tattachmentFallback: \"attachment\",\n\t\tfileFallback: \"file\",\n\t},\n\tthreadMenu: {\n\t\tnewChat: \"New chat\",\n\t\tthreadHistory: \"Thread history\",\n\t\tdeleteThread: \"Delete thread\",\n\t\tnoPreviousChats: \"No previous chats yet.\",\n\t\thiddenThreads: (count: number) =>\n\t\t\t`${count} older thread${count === 1 ? \"\" : \"s\"} hidden`,\n\t},\n\tchatQueue: {\n\t\tattachmentFallback: \"(attachment)\",\n\t\tremoveFromQueue: \"Remove from queue\",\n\t\tqueued: (count: number) => `${count} queued`,\n\t},\n\tpoweredBy: {\n\t\tlabel: \"AI agent powered by\",\n\t},\n\taiDisclaimer: {\n\t\tdefault: \"can make mistakes\",\n\t},\n\texportSession: {\n\t\tsaving: \"saving...\",\n\t\tsaved: \"saved\",\n\t\terror: \"error\",\n\t\texport: \"export\",\n\t\ttooltip: \"Save scenario to Waniwani\",\n\t},\n\twidgetErrorBoundary: {\n\t\tfailedToLoad: \"Widget failed to load\",\n\t\tretry: \"Retry\",\n\t},\n\tlauncher: {\n\t\tprompt: \"Ask anything…\",\n\t\topen: \"Open chat\",\n\t\tclose: \"Close chat\",\n\t\tminimize: \"Minimize\",\n\t},\n};\n","import type { Messages } from \"./en\";\n\nexport const es: Messages = {\n\tpromptInput: {\n\t\tplaceholder: \"¿Qué te gustaría saber?\",\n\t\tuploadFiles: \"Subir archivos\",\n\t\tstop: \"Detener\",\n\t\tsubmit: \"Enviar\",\n\t\tremoveAttachments: \"Eliminar todos los archivos adjuntos\",\n\t},\n\tworkingIndicator: {\n\t\tdefault: \"Un momento…\",\n\t},\n\treasoning: {\n\t\tthinking: \"Pensando…\",\n\t\tthoughtBrief: \"Pensado durante unos segundos\",\n\t\tthoughtForSeconds: (count: number) =>\n\t\t\t`Pensado durante ${count} segundo${count === 1 ? \"\" : \"s\"}`,\n\t},\n\tchainOfThought: {\n\t\tworking: \"Estoy en ello…\",\n\t\tdone: \"Razonamiento\",\n\t},\n\ttool: {\n\t\tcopy: \"Copiar\",\n\t\tcopied: \"Copiado\",\n\t\trequest: \"Solicitud\",\n\t\tresponse: \"Respuesta\",\n\t\terror: \"Error\",\n\t},\n\tattachments: {\n\t\tattachmentFallback: \"adjunto\",\n\t\tfileFallback: \"archivo\",\n\t},\n\tthreadMenu: {\n\t\tnewChat: \"Nueva conversación\",\n\t\tthreadHistory: \"Historial\",\n\t\tdeleteThread: \"Eliminar conversación\",\n\t\tnoPreviousChats: \"Aún no hay conversaciones anteriores.\",\n\t\thiddenThreads: (count: number) =>\n\t\t\t`${count} conversación${count === 1 ? \"\" : \"es\"} anterior${count === 1 ? \"\" : \"es\"} oculta${count === 1 ? \"\" : \"s\"}`,\n\t},\n\tchatQueue: {\n\t\tattachmentFallback: \"(adjunto)\",\n\t\tremoveFromQueue: \"Quitar de la cola\",\n\t\tqueued: (count: number) => `${count} en cola`,\n\t},\n\tpoweredBy: {\n\t\tlabel: \"Agente IA con tecnología de\",\n\t},\n\taiDisclaimer: {\n\t\tdefault: \"puede cometer errores\",\n\t},\n\texportSession: {\n\t\tsaving: \"guardando...\",\n\t\tsaved: \"guardado\",\n\t\terror: \"error\",\n\t\texport: \"exportar\",\n\t\ttooltip: \"Guardar escenario en Waniwani\",\n\t},\n\twidgetErrorBoundary: {\n\t\tfailedToLoad: \"No se pudo cargar el widget\",\n\t\tretry: \"Reintentar\",\n\t},\n\tlauncher: {\n\t\tprompt: \"Pregunta lo que quieras…\",\n\t\topen: \"Abrir chat\",\n\t\tclose: \"Cerrar chat\",\n\t\tminimize: \"Minimizar\",\n\t},\n};\n","import type { Messages } from \"./en\";\n\nexport const fr: Messages = {\n\tpromptInput: {\n\t\tplaceholder: \"Que souhaitez-vous savoir ?\",\n\t\tuploadFiles: \"Importer des fichiers\",\n\t\tstop: \"Arrêter\",\n\t\tsubmit: \"Envoyer\",\n\t\tremoveAttachments: \"Supprimer toutes les pièces jointes\",\n\t},\n\tworkingIndicator: {\n\t\tdefault: \"Un instant…\",\n\t},\n\treasoning: {\n\t\tthinking: \"Réflexion…\",\n\t\tthoughtBrief: \"Réflexion pendant quelques secondes\",\n\t\tthoughtForSeconds: (count: number) =>\n\t\t\t`Réflexion pendant ${count} seconde${count === 1 ? \"\" : \"s\"}`,\n\t},\n\tchainOfThought: {\n\t\tworking: \"Je m'en occupe…\",\n\t\tdone: \"Raisonnement\",\n\t},\n\ttool: {\n\t\tcopy: \"Copier\",\n\t\tcopied: \"Copié\",\n\t\trequest: \"Requête\",\n\t\tresponse: \"Réponse\",\n\t\terror: \"Erreur\",\n\t},\n\tattachments: {\n\t\tattachmentFallback: \"pièce jointe\",\n\t\tfileFallback: \"fichier\",\n\t},\n\tthreadMenu: {\n\t\tnewChat: \"Nouvelle conversation\",\n\t\tthreadHistory: \"Historique\",\n\t\tdeleteThread: \"Supprimer la conversation\",\n\t\tnoPreviousChats: \"Aucune conversation précédente.\",\n\t\thiddenThreads: (count: number) =>\n\t\t\t`${count} conversation${count === 1 ? \"\" : \"s\"} plus ancienne${count === 1 ? \"\" : \"s\"} masquée${count === 1 ? \"\" : \"s\"}`,\n\t},\n\tchatQueue: {\n\t\tattachmentFallback: \"(pièce jointe)\",\n\t\tremoveFromQueue: \"Retirer de la file\",\n\t\tqueued: (count: number) => `${count} en attente`,\n\t},\n\tpoweredBy: {\n\t\tlabel: \"Agent IA propulsé par\",\n\t},\n\taiDisclaimer: {\n\t\tdefault: \"peut faire des erreurs\",\n\t},\n\texportSession: {\n\t\tsaving: \"enregistrement...\",\n\t\tsaved: \"enregistré\",\n\t\terror: \"erreur\",\n\t\texport: \"exporter\",\n\t\ttooltip: \"Enregistrer le scénario dans Waniwani\",\n\t},\n\twidgetErrorBoundary: {\n\t\tfailedToLoad: \"Échec du chargement du widget\",\n\t\tretry: \"Réessayer\",\n\t},\n\tlauncher: {\n\t\tprompt: \"Posez votre question…\",\n\t\topen: \"Ouvrir le chat\",\n\t\tclose: \"Fermer le chat\",\n\t\tminimize: \"Réduire\",\n\t},\n};\n","import type { Locale } from \"./types\";\n\n/**\n * Localized \"5 minutes ago\"-style formatter using `Intl.RelativeTimeFormat`.\n * Falls back to compact English (\"5m ago\") on environments without Intl\n * RelativeTimeFormat (very old browsers).\n */\nexport function formatRelativeTime(timestamp: number, locale: Locale): string {\n\tconst diff = Date.now() - timestamp;\n\n\tif (diff < 60_000) {\n\t\ttry {\n\t\t\treturn new Intl.RelativeTimeFormat(locale, {\n\t\t\t\tnumeric: \"auto\",\n\t\t\t\tstyle: \"narrow\",\n\t\t\t}).format(0, \"second\");\n\t\t} catch {\n\t\t\treturn \"just now\";\n\t\t}\n\t}\n\n\tlet value: number;\n\tlet unit: Intl.RelativeTimeFormatUnit;\n\tif (diff < 60 * 60_000) {\n\t\tvalue = -Math.floor(diff / 60_000);\n\t\tunit = \"minute\";\n\t} else if (diff < 24 * 60 * 60_000) {\n\t\tvalue = -Math.floor(diff / (60 * 60_000));\n\t\tunit = \"hour\";\n\t} else {\n\t\tvalue = -Math.floor(diff / (24 * 60 * 60_000));\n\t\tunit = \"day\";\n\t}\n\n\ttry {\n\t\treturn new Intl.RelativeTimeFormat(locale, {\n\t\t\tnumeric: \"auto\",\n\t\t\tstyle: \"short\",\n\t\t}).format(value, unit);\n\t} catch {\n\t\tconst abs = Math.abs(value);\n\t\tconst suffix = unit === \"minute\" ? \"m\" : unit === \"hour\" ? \"h\" : \"d\";\n\t\treturn `${abs}${suffix} ago`;\n\t}\n}\n","\"use client\";\n\nimport { XIcon } from \"lucide-react\";\nimport { memo, useCallback } from \"react\";\nimport {\n\tQueue,\n\tQueueItem,\n\tQueueItemAction,\n\tQueueItemActions,\n\tQueueItemContent,\n\tQueueItemIndicator,\n} from \"../ai-elements/queue\";\nimport type { QueuedMessage } from \"../hooks/use-chat-engine\";\nimport { useTranslation } from \"../i18n\";\nimport { cn } from \"../lib/utils\";\n\ninterface ChatQueueItemProps {\n\tmessage: QueuedMessage;\n\tonRemove: (id: string) => void;\n}\n\nconst ChatQueueItem = memo(({ message, onRemove }: ChatQueueItemProps) => {\n\tconst { t } = useTranslation();\n\tconst handleRemove = useCallback(\n\t\t() => onRemove(message.id),\n\t\t[onRemove, message.id],\n\t);\n\n\treturn (\n\t\t<QueueItem>\n\t\t\t<QueueItemIndicator />\n\t\t\t<QueueItemContent>\n\t\t\t\t{message.text || t.chatQueue.attachmentFallback}\n\t\t\t</QueueItemContent>\n\t\t\t<QueueItemActions>\n\t\t\t\t<QueueItemAction\n\t\t\t\t\taria-label={t.chatQueue.removeFromQueue}\n\t\t\t\t\tonClick={handleRemove}\n\t\t\t\t>\n\t\t\t\t\t<XIcon className=\"ww:size-3\" />\n\t\t\t\t</QueueItemAction>\n\t\t\t</QueueItemActions>\n\t\t</QueueItem>\n\t);\n});\n\nChatQueueItem.displayName = \"ChatQueueItem\";\n\ninterface ChatQueueProps {\n\tqueuedMessages: QueuedMessage[];\n\tonRemove: (id: string) => void;\n\tclassName?: string;\n}\n\nexport function ChatQueue({\n\tqueuedMessages,\n\tonRemove,\n\tclassName,\n}: ChatQueueProps) {\n\tconst { t } = useTranslation();\n\tif (queuedMessages.length === 0) {\n\t\treturn null;\n\t}\n\n\treturn (\n\t\t<Queue className={cn(\"ww:border-t ww:border-border\", className)}>\n\t\t\t<div className=\"ww:text-[11px] ww:font-medium ww:text-muted-foreground ww:px-2\">\n\t\t\t\t{t.chatQueue.queued(queuedMessages.length)}\n\t\t\t</div>\n\t\t\t<ul>\n\t\t\t\t{queuedMessages.map((msg) => (\n\t\t\t\t\t<ChatQueueItem key={msg.id} message={msg} onRemove={onRemove} />\n\t\t\t\t))}\n\t\t\t</ul>\n\t\t</Queue>\n\t);\n}\n","\"use client\";\n\nimport type { ComponentProps } from \"react\";\nimport { cn } from \"../lib/utils\";\nimport { Button } from \"../ui/button\";\n\nexport type QueueProps = ComponentProps<\"div\">;\n\nexport const Queue = ({ className, ...props }: QueueProps) => (\n\t<div\n\t\tclassName={cn(\"ww:flex ww:flex-col ww:gap-1 ww:px-3 ww:py-2\", className)}\n\t\t{...props}\n\t/>\n);\n\nexport type QueueItemProps = ComponentProps<\"li\">;\n\nexport const QueueItem = ({ className, ...props }: QueueItemProps) => (\n\t<li\n\t\tclassName={cn(\n\t\t\t\"ww:group ww:flex ww:items-center ww:gap-2 ww:rounded-md ww:px-2 ww:py-1 ww:text-sm ww:transition-colors ww:hover:bg-muted\",\n\t\t\tclassName,\n\t\t)}\n\t\t{...props}\n\t/>\n);\n\nexport type QueueItemIndicatorProps = ComponentProps<\"span\">;\n\nexport const QueueItemIndicator = ({\n\tclassName,\n\t...props\n}: QueueItemIndicatorProps) => (\n\t<span\n\t\tclassName={cn(\n\t\t\t\"ww:inline-block ww:size-2 ww:shrink-0 ww:rounded-full ww:border ww:border-muted-foreground/50\",\n\t\t\tclassName,\n\t\t)}\n\t\t{...props}\n\t/>\n);\n\nexport type QueueItemContentProps = ComponentProps<\"span\">;\n\nexport const QueueItemContent = ({\n\tclassName,\n\t...props\n}: QueueItemContentProps) => (\n\t<span\n\t\tclassName={cn(\n\t\t\t\"ww:line-clamp-1 ww:grow ww:break-words ww:text-muted-foreground\",\n\t\t\tclassName,\n\t\t)}\n\t\t{...props}\n\t/>\n);\n\nexport type QueueItemActionsProps = ComponentProps<\"div\">;\n\nexport const QueueItemActions = ({\n\tclassName,\n\t...props\n}: QueueItemActionsProps) => (\n\t<div\n\t\tclassName={cn(\n\t\t\t\"ww:flex ww:shrink-0 ww:gap-1 ww:opacity-0 ww:transition-opacity ww:group-hover:opacity-100\",\n\t\t\tclassName,\n\t\t)}\n\t\t{...props}\n\t/>\n);\n\nexport type QueueItemActionProps = Omit<\n\tComponentProps<typeof Button>,\n\t\"variant\" | \"size\"\n>;\n\nexport const QueueItemAction = ({\n\tclassName,\n\t...props\n}: QueueItemActionProps) => (\n\t<Button\n\t\tclassName={cn(\n\t\t\t\"ww:size-auto ww:rounded ww:p-1 ww:text-muted-foreground ww:hover:bg-muted-foreground/10 ww:hover:text-foreground\",\n\t\t\tclassName,\n\t\t)}\n\t\tsize=\"icon\"\n\t\ttype=\"button\"\n\t\tvariant=\"ghost\"\n\t\t{...props}\n\t/>\n);\n","\"use client\";\n\nimport type { UIMessage } from \"@ai-sdk/react\";\nimport { useState } from \"react\";\nimport { useTranslation } from \"../i18n\";\n\ninterface ExportSessionButtonProps {\n\tmessages: UIMessage[];\n\tevalEnabled: boolean;\n\tapi?: string;\n}\n\nexport function ExportSessionButton({\n\tmessages,\n\tevalEnabled,\n\tapi = \"/api/waniwani\",\n}: ExportSessionButtonProps) {\n\tconst { t } = useTranslation();\n\tconst [saving, setSaving] = useState(false);\n\tconst [feedback, setFeedback] = useState<\"saved\" | \"error\" | null>(null);\n\n\tconst handleExport = async () => {\n\t\tconst session = {\n\t\t\tname: `session-${new Date().toISOString().slice(0, 19)}`,\n\t\t\ttype: \"functional\" as const,\n\t\t\tmessages,\n\t\t\tmode: \"manual\" as const,\n\t\t};\n\n\t\tsetSaving(true);\n\t\tsetFeedback(null);\n\n\t\ttry {\n\t\t\tconst res = await fetch(`${api}/scenarios`, {\n\t\t\t\tmethod: \"POST\",\n\t\t\t\theaders: { \"Content-Type\": \"application/json\" },\n\t\t\t\tbody: JSON.stringify(session),\n\t\t\t});\n\t\t\tif (!res.ok) {\n\t\t\t\tthrow new Error(`${res.status}`);\n\t\t\t}\n\t\t\tsetFeedback(\"saved\");\n\t\t} catch {\n\t\t\tsetFeedback(\"error\");\n\t\t} finally {\n\t\t\tsetSaving(false);\n\t\t\tsetTimeout(() => setFeedback(null), 2000);\n\t\t}\n\t};\n\n\tif (!evalEnabled || messages.length === 0) {\n\t\treturn null;\n\t}\n\n\tconst label = saving\n\t\t? t.exportSession.saving\n\t\t: feedback === \"saved\"\n\t\t\t? t.exportSession.saved\n\t\t\t: feedback === \"error\"\n\t\t\t\t? t.exportSession.error\n\t\t\t\t: t.exportSession.export;\n\n\treturn (\n\t\t<button\n\t\t\ttype=\"button\"\n\t\t\tonClick={handleExport}\n\t\t\tdisabled={saving}\n\t\t\ttitle={t.exportSession.tooltip}\n\t\t\tclassName=\"ww:ml-auto ww:text-[10px] ww:font-mono ww:uppercase ww:tracking-wider ww:text-muted-foreground hover:ww:text-foreground ww:cursor-pointer ww:transition-colors ww:disabled:opacity-40\"\n\t\t>\n\t\t\t{label}\n\t\t</button>\n\t);\n}\n","\"use client\";\n\nimport type { ChatStatus, ReasoningUIPart, ToolUIPart, UIMessage } from \"ai\";\nimport {\n\tClockIcon,\n\tGlobeIcon,\n\ttype LucideIcon,\n\tWrenchIcon,\n} from \"lucide-react\";\nimport type { ModelContextUpdate } from \"../../../shared/model-context\";\nimport type { ShowToolCalls, WelcomeConfig } from \"../@types\";\nimport { Attachments } from \"../ai-elements/attachments\";\nimport {\n\tChainOfThought,\n\tChainOfThoughtContent,\n\tChainOfThoughtHeader,\n\tChainOfThoughtReasoning,\n\tChainOfThoughtStep,\n} from \"../ai-elements/chain-of-thought\";\nimport {\n\tMessage,\n\tMessageContent,\n\tMessageResponse,\n} from \"../ai-elements/message\";\nimport {\n\tReasoning,\n\tReasoningContent,\n\tReasoningTrigger,\n} from \"../ai-elements/reasoning\";\nimport {\n\tresolveWidgetAutoHeight,\n\tresolveWidgetResourceUri,\n\tTool,\n\tToolContent,\n\ttype ToolDefinitionsMap,\n\tToolHeader,\n\tToolIndicator,\n\tToolInput,\n\tToolOutput,\n} from \"../ai-elements/tool\";\nimport {\n\thasVisibleParts,\n\tshouldShowWorkingIndicator,\n\tWorkingIndicator,\n} from \"../ai-elements/working-indicator\";\nimport { useTranslation } from \"../i18n\";\nimport { cn } from \"../lib/utils\";\nimport type { McpAppDisplayMode } from \"./mcp-app-frame\";\nimport { McpAppFrame } from \"./mcp-app-frame\";\nimport { WelcomeScreen } from \"./welcome-screen\";\nimport { WidgetErrorBoundary } from \"./widget-error-boundary\";\n\n/** Converts `get_price_estimate` or `compare-prices` → `Get price estimate` / `Compare prices` */\nfunction formatToolName(name: string | undefined): string {\n\tif (!name) {\n\t\treturn \"Tool\";\n\t}\n\n\treturn name.replace(/[-_]/g, \" \").replace(/^\\w/, (c) => c.toUpperCase());\n}\n\n/** Picks a timeline icon for a tool step: a globe for search-like tools, a\n * wrench for everything else. */\nfunction pickStepIcon(name: string | undefined): LucideIcon {\n\treturn name && /search|find|lookup|query|web|browse|google/i.test(name)\n\t\t? GlobeIcon\n\t\t: WrenchIcon;\n}\n\nexport interface FullscreenWidget {\n\ttoolCallId: string;\n\tresourceUri: string;\n\ttoolInput: Record<string, unknown>;\n\ttoolResult: {\n\t\tcontent?: Array<{ type: string; text?: string }>;\n\t\tstructuredContent?: Record<string, unknown>;\n\t\t_meta?: Record<string, unknown>;\n\t};\n\tautoHeight: boolean;\n}\n\ninterface MessageListProps {\n\tmessages: UIMessage[];\n\tstatus: ChatStatus;\n\twelcomeMessage?: string;\n\t/** Rich welcome screen config. Takes precedence over `welcomeMessage`. */\n\twelcome?: WelcomeConfig;\n\t/** Called when a welcome screen suggestion card is clicked. */\n\tonSuggestionSelect?: (suggestion: string) => void;\n\tresourceEndpoint?: string;\n\tchatSessionId?: string;\n\tisDark?: boolean;\n\tonFollowUp?: (message: {\n\t\trole: string;\n\t\tcontent: Array<{ type: string; text?: string }>;\n\t\tmodelContext?: ModelContextUpdate;\n\t}) => void;\n\tonCallTool?: (params: {\n\t\tname: string;\n\t\targuments: Record<string, unknown>;\n\t}) => Promise<{\n\t\tcontent?: Array<{ type: string; text?: string }>;\n\t\tstructuredContent?: Record<string, unknown>;\n\t\t_meta?: Record<string, unknown>;\n\t}>;\n\tonWidgetDisplayModeChange?: (\n\t\tmode: McpAppDisplayMode,\n\t\twidget: FullscreenWidget,\n\t) => void;\n\t/** When set, only the matching widget is shown (fullscreen mode). The iframe stays mounted. */\n\tfullscreenToolCallId?: string | null;\n\t/** When true, show _meta in tool call inputs and outputs. */\n\tdebug?: boolean;\n\t/**\n\t * How tool-call activity renders. With 2+ tool calls they group into one\n\t * collapsible chain of thought (reasoning folds in at the top); a single\n\t * tool renders on its own. `true` (default) makes each step expandable to\n\t * its request/response JSON, `\"titles-only\"` shows step labels only,\n\t * `false` hides the chain and the reasoning trace (the working indicator\n\t * covers the running state instead). MCP App widgets attached to a tool\n\t * call are always rendered regardless of this flag.\n\t */\n\tshowToolCalls?: ShowToolCalls;\n\t/**\n\t * Cached tool catalog keyed by tool name. Drives spec-canonical widget\n\t * resolution: if a tool's definition `_meta` carries a widget resource\n\t * URI, the widget renders regardless of whether the server echoed it\n\t * on the tool call result. Populated by `useChatEngine` from\n\t * `GET /api/waniwani/tools`.\n\t */\n\ttoolDefinitions?: ToolDefinitionsMap;\n\t/** Per-slot class overrides forwarded to Message/MessageContent. */\n\tmessageClassNames?: {\n\t\tmessage?: string;\n\t\tuserBubble?: string;\n\t\tassistantBubble?: string;\n\t};\n}\n\nexport function MessageList({\n\tmessages,\n\tstatus,\n\twelcomeMessage,\n\twelcome,\n\tonSuggestionSelect,\n\tresourceEndpoint,\n\tchatSessionId,\n\tisDark,\n\tonFollowUp,\n\tonCallTool,\n\tonWidgetDisplayModeChange,\n\tfullscreenToolCallId,\n\tdebug,\n\tshowToolCalls = true,\n\ttoolDefinitions,\n\tmessageClassNames,\n}: MessageListProps) {\n\tconst { t } = useTranslation();\n\tconst lastMessage = messages[messages.length - 1];\n\tconst hasMessages = messages.length > 0;\n\n\tconst isFullscreenActive = fullscreenToolCallId != null;\n\tconst showWorking =\n\t\t!isFullscreenActive &&\n\t\tshouldShowWorkingIndicator(messages, status, {\n\t\t\tignoreToolParts: showToolCalls === false,\n\t\t\tignoreReasoningParts: showToolCalls === false,\n\t\t});\n\n\treturn (\n\t\t<>\n\t\t\t{!isFullscreenActive &&\n\t\t\t\t(!hasMessages && welcome ? (\n\t\t\t\t\t<WelcomeScreen {...welcome} onSuggestionSelect={onSuggestionSelect} />\n\t\t\t\t) : (\n\t\t\t\t\twelcomeMessage && (\n\t\t\t\t\t\t<Message from=\"assistant\">\n\t\t\t\t\t\t\t<MessageContent>\n\t\t\t\t\t\t\t\t<MessageResponse>{welcomeMessage}</MessageResponse>\n\t\t\t\t\t\t\t</MessageContent>\n\t\t\t\t\t\t</Message>\n\t\t\t\t\t)\n\t\t\t\t))}\n\t\t\t{messages.map((message) => {\n\t\t\t\tconst textParts = message.parts.filter((p) => p.type === \"text\");\n\t\t\t\tconst reasoningParts = message.parts.filter(\n\t\t\t\t\t(p): p is ReasoningUIPart => p.type === \"reasoning\",\n\t\t\t\t);\n\t\t\t\tconst fileParts = message.parts.filter((p) => p.type === \"file\");\n\t\t\t\tconst toolParts = message.parts.filter(\n\t\t\t\t\t(\n\t\t\t\t\t\tp,\n\t\t\t\t\t): p is typeof p & {\n\t\t\t\t\t\ttoolCallId: string;\n\t\t\t\t\t\ttoolName: string;\n\t\t\t\t\t\tstate: ToolUIPart[\"state\"];\n\t\t\t\t\t\tinput: unknown;\n\t\t\t\t\t\ttitle?: string;\n\t\t\t\t\t} => \"toolCallId\" in p,\n\t\t\t\t);\n\t\t\t\t// Reasoning + tool parts in document order, so a `think → tool →\n\t\t\t\t// think → tool` trace renders chronologically in the chain (not\n\t\t\t\t// all reasoning first, then all tools).\n\t\t\t\tconst activityParts = message.parts.filter(\n\t\t\t\t\t(p): p is ReasoningUIPart | (typeof toolParts)[number] =>\n\t\t\t\t\t\tp.type === \"reasoning\" || \"toolCallId\" in p,\n\t\t\t\t);\n\t\t\t\tconst isLastAssistant =\n\t\t\t\t\tmessage === lastMessage && message.role === \"assistant\";\n\t\t\t\tconst hasTextContent = textParts.length > 0;\n\t\t\t\tconst containsFullscreenTool = isFullscreenActive\n\t\t\t\t\t? toolParts.some((p) => p.toolCallId === fullscreenToolCallId)\n\t\t\t\t\t: false;\n\t\t\t\t// The collapsible chain kicks in once there are 2+ activity items\n\t\t\t\t// (reasoning + tool calls, in any combination): two tools, a\n\t\t\t\t// reasoning step plus a tool, or even two reasoning steps. A single\n\t\t\t\t// activity item (a lone tool, or a single reasoning row) renders on\n\t\t\t\t// its own — a one-item chain would just duplicate it under a header.\n\t\t\t\tconst showChain =\n\t\t\t\t\tshowToolCalls !== false &&\n\t\t\t\t\t!containsFullscreenTool &&\n\t\t\t\t\tactivityParts.length >= 2;\n\n\t\t\t\t// Hide messages that don't contain the fullscreen widget\n\t\t\t\tif (isFullscreenActive && !containsFullscreenTool) {\n\t\t\t\t\treturn <div key={message.id} style={{ display: \"none\" }} />;\n\t\t\t\t}\n\n\t\t\t\t// Skip rendering an empty <Message> wrapper for an assistant\n\t\t\t\t// message that has only invisible parts (e.g. step-start, which\n\t\t\t\t// the AI SDK seeds before the first tool/text/reasoning chunk).\n\t\t\t\t// Otherwise an empty bubble briefly appears on top of the\n\t\t\t\t// WorkingIndicator before the real content lands.\n\t\t\t\tif (message.role === \"assistant\" && !hasVisibleParts(message)) {\n\t\t\t\t\treturn <div key={message.id} style={{ display: \"none\" }} />;\n\t\t\t\t}\n\n\t\t\t\t// With tool calls fully hidden, an assistant message whose only\n\t\t\t\t// visible parts are widget-less tool calls (or reasoning, which\n\t\t\t\t// hidden mode also suppresses) renders nothing — collapse it so\n\t\t\t\t// it doesn't occupy a gap slot in the message column (and so the\n\t\t\t\t// WorkingIndicator stays flush while running).\n\t\t\t\tif (\n\t\t\t\t\tshowToolCalls === false &&\n\t\t\t\t\tmessage.role === \"assistant\" &&\n\t\t\t\t\t!hasTextContent &&\n\t\t\t\t\tfileParts.length === 0 &&\n\t\t\t\t\ttoolParts.every((p) => {\n\t\t\t\t\t\tconst output = \"output\" in p ? p.output : undefined;\n\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\toutput === undefined ||\n\t\t\t\t\t\t\t!resourceEndpoint ||\n\t\t\t\t\t\t\t!resolveWidgetResourceUri(p.toolName, output, toolDefinitions)\n\t\t\t\t\t\t);\n\t\t\t\t\t})\n\t\t\t\t) {\n\t\t\t\t\treturn <div key={message.id} style={{ display: \"none\" }} />;\n\t\t\t\t}\n\n\t\t\t\treturn (\n\t\t\t\t\t<Message\n\t\t\t\t\t\tfrom={message.role}\n\t\t\t\t\t\tkey={message.id}\n\t\t\t\t\t\tclassName={messageClassNames?.message}\n\t\t\t\t\t>\n\t\t\t\t\t\t{/* Reasoning trace. Folded into the chain when one is shown\n\t\t\t\t\t\t (2+ tools); rendered on its own otherwise. Suppressed\n\t\t\t\t\t\t entirely in `hidden` mode (only \"On it…\" shows). */}\n\t\t\t\t\t\t{showToolCalls !== false &&\n\t\t\t\t\t\t\t!containsFullscreenTool &&\n\t\t\t\t\t\t\t!showChain &&\n\t\t\t\t\t\t\treasoningParts.map((part, i) => (\n\t\t\t\t\t\t\t\t<Reasoning\n\t\t\t\t\t\t\t\t\tkey={`reasoning-${message.id}-${i}`}\n\t\t\t\t\t\t\t\t\tisStreaming={part.state === \"streaming\"}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<ReasoningTrigger />\n\t\t\t\t\t\t\t\t\t<ReasoningContent>{part.text}</ReasoningContent>\n\t\t\t\t\t\t\t\t</Reasoning>\n\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t{/* 2+ tool calls → one collapsible chain of thought. The\n\t\t\t\t\t\t reasoning trace folds in at the top, then each tool is a\n\t\t\t\t\t\t timeline step. `full` makes steps expand to their\n\t\t\t\t\t\t request/response JSON; `titles-only` shows label-only steps. */}\n\t\t\t\t\t\t{showChain &&\n\t\t\t\t\t\t\t(() => {\n\t\t\t\t\t\t\t\t// The active step drives the collapsed chain's single-line\n\t\t\t\t\t\t\t\t// ticker: it's the last activity part (the one the model is\n\t\t\t\t\t\t\t\t// on), mapped to a timeline icon + label. Reasoning reads as\n\t\t\t\t\t\t\t\t// \"Thinking…\"; a tool reads as its humanized name.\n\t\t\t\t\t\t\t\tconst last = activityParts[activityParts.length - 1];\n\t\t\t\t\t\t\t\tconst activeStep =\n\t\t\t\t\t\t\t\t\tlast.type === \"reasoning\"\n\t\t\t\t\t\t\t\t\t\t? { icon: ClockIcon, label: t.reasoning.thinking }\n\t\t\t\t\t\t\t\t\t\t: {\n\t\t\t\t\t\t\t\t\t\t\t\ticon: pickStepIcon(last.toolName),\n\t\t\t\t\t\t\t\t\t\t\t\tlabel: last.title ?? formatToolName(last.toolName),\n\t\t\t\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t<ChainOfThought\n\t\t\t\t\t\t\t\t\t\t// Drive the header off the whole turn streaming (stable),\n\t\t\t\t\t\t\t\t\t\t// not per-step running (which blips false between steps and\n\t\t\t\t\t\t\t\t\t\t// makes the label flicker / settle early).\n\t\t\t\t\t\t\t\t\t\tisWorking={\n\t\t\t\t\t\t\t\t\t\t\tisLastAssistant &&\n\t\t\t\t\t\t\t\t\t\t\t(status === \"streaming\" || status === \"submitted\")\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\tactiveStep={activeStep}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t<ChainOfThoughtHeader\n\t\t\t\t\t\t\t\t\t\t\tworkingLabel={t.chainOfThought.working}\n\t\t\t\t\t\t\t\t\t\t\tlabel={t.chainOfThought.done}\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t<ChainOfThoughtContent>\n\t\t\t\t\t\t\t\t\t\t\t{activityParts.map((part, i) => {\n\t\t\t\t\t\t\t\t\t\t\t\tconst isLast = i === activityParts.length - 1;\n\t\t\t\t\t\t\t\t\t\t\t\tif (part.type === \"reasoning\") {\n\t\t\t\t\t\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<ChainOfThoughtReasoning\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tkey={`reasoning-${message.id}-${i}`}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tisStreaming={part.state === \"streaming\"}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tisLast={isLast}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{part.text}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</ChainOfThoughtReasoning>\n\t\t\t\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\tconst title =\n\t\t\t\t\t\t\t\t\t\t\t\t\tpart.title ?? formatToolName(part.toolName);\n\t\t\t\t\t\t\t\t\t\t\t\tconst icon = pickStepIcon(part.toolName);\n\t\t\t\t\t\t\t\t\t\t\t\tif (showToolCalls === \"titles-only\") {\n\t\t\t\t\t\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<ChainOfThoughtStep\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tkey={part.toolCallId}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ticon={icon}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ttitle={title}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tstate={part.state}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tisLast={isLast}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\tconst output =\n\t\t\t\t\t\t\t\t\t\t\t\t\t\"output\" in part ? part.output : undefined;\n\t\t\t\t\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t\t\t\t\t<ChainOfThoughtStep\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tkey={part.toolCallId}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\ticon={icon}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\ttitle={title}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tstate={part.state}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tisLast={isLast}\n\t\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<ToolInput input={part.input} debug={debug} />\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{output !== undefined && (\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<ToolOutput\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\toutput={output}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\terrorText={\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"errorText\" in part\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t? part.errorText\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t: undefined\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tdebug={debug}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t</ChainOfThoughtStep>\n\t\t\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t\t\t\t\t</ChainOfThoughtContent>\n\t\t\t\t\t\t\t\t\t</ChainOfThought>\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t})()}\n\t\t\t\t\t\t{/* Lone tool with no reasoning → render it directly (no chain\n\t\t\t\t\t\t wrapper, which would just duplicate the one step under a\n\t\t\t\t\t\t header). With reasoning present, the chain above handles it. */}\n\t\t\t\t\t\t{showToolCalls !== false &&\n\t\t\t\t\t\t\t!containsFullscreenTool &&\n\t\t\t\t\t\t\t!showChain &&\n\t\t\t\t\t\t\ttoolParts.length === 1 &&\n\t\t\t\t\t\t\t(() => {\n\t\t\t\t\t\t\t\tconst part = toolParts[0];\n\t\t\t\t\t\t\t\tconst title = part.title ?? formatToolName(part.toolName);\n\t\t\t\t\t\t\t\tif (showToolCalls === \"titles-only\") {\n\t\t\t\t\t\t\t\t\treturn <ToolIndicator title={title} state={part.state} />;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tconst output = \"output\" in part ? part.output : undefined;\n\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t<Tool>\n\t\t\t\t\t\t\t\t\t\t<ToolHeader title={title} state={part.state} />\n\t\t\t\t\t\t\t\t\t\t<ToolContent>\n\t\t\t\t\t\t\t\t\t\t\t<ToolInput input={part.input} debug={debug} />\n\t\t\t\t\t\t\t\t\t\t\t{output !== undefined && (\n\t\t\t\t\t\t\t\t\t\t\t\t<ToolOutput\n\t\t\t\t\t\t\t\t\t\t\t\t\toutput={output}\n\t\t\t\t\t\t\t\t\t\t\t\t\terrorText={\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"errorText\" in part ? part.errorText : undefined\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\tdebug={debug}\n\t\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t</ToolContent>\n\t\t\t\t\t\t\t\t\t</Tool>\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t})()}\n\t\t\t\t\t\t{toolParts.map((part) => {\n\t\t\t\t\t\t\tconst output = \"output\" in part ? part.output : undefined;\n\t\t\t\t\t\t\tconst resourceUri = resolveWidgetResourceUri(\n\t\t\t\t\t\t\t\tpart.toolName,\n\t\t\t\t\t\t\t\toutput,\n\t\t\t\t\t\t\t\ttoolDefinitions,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tconst autoHeight = resolveWidgetAutoHeight(\n\t\t\t\t\t\t\t\tpart.toolName,\n\t\t\t\t\t\t\t\toutput,\n\t\t\t\t\t\t\t\ttoolDefinitions,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tconst isFullscreen = part.toolCallId === fullscreenToolCallId;\n\n\t\t\t\t\t\t\t// This map only renders MCP App widgets now (the textual\n\t\t\t\t\t\t\t// tool display moved to the ChainOfThought above). A tool\n\t\t\t\t\t\t\t// call with no widget renders nothing here — returning an\n\t\t\t\t\t\t\t// empty wrapper would still occupy a gap slot in the\n\t\t\t\t\t\t\t// message's flex column.\n\t\t\t\t\t\t\tif (!(resourceUri && resourceEndpoint && output !== undefined)) {\n\t\t\t\t\t\t\t\treturn null;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\tkey={part.toolCallId}\n\t\t\t\t\t\t\t\t\tstyle={\n\t\t\t\t\t\t\t\t\t\tisFullscreen\n\t\t\t\t\t\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\t\t\t\t\t\tposition: \"absolute\" as const,\n\t\t\t\t\t\t\t\t\t\t\t\t\tinset: 0,\n\t\t\t\t\t\t\t\t\t\t\t\t\tzIndex: 10,\n\t\t\t\t\t\t\t\t\t\t\t\t\tdisplay: \"flex\",\n\t\t\t\t\t\t\t\t\t\t\t\t\tflexDirection: \"column\" as const,\n\t\t\t\t\t\t\t\t\t\t\t\t\toverflow: \"hidden\",\n\t\t\t\t\t\t\t\t\t\t\t\t\tbackground: \"var(--ww-color-background)\",\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t: undefined\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{/* Textual tool display now lives in the grouped\n\t\t\t\t\t\t\t\t\t ChainOfThought above; this map only renders the\n\t\t\t\t\t\t\t\t\t MCP App widget (iframe) for tool calls that carry one. */}\n\t\t\t\t\t\t\t\t\t{resourceUri && resourceEndpoint && output !== undefined && (\n\t\t\t\t\t\t\t\t\t\t<WidgetErrorBoundary>\n\t\t\t\t\t\t\t\t\t\t\t<McpAppFrame\n\t\t\t\t\t\t\t\t\t\t\t\tisFullscreen={isFullscreen}\n\t\t\t\t\t\t\t\t\t\t\t\tresourceUri={resourceUri}\n\t\t\t\t\t\t\t\t\t\t\t\ttoolInput={\n\t\t\t\t\t\t\t\t\t\t\t\t\t(part.input as Record<string, unknown>) ?? {}\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\ttoolResult={{\n\t\t\t\t\t\t\t\t\t\t\t\t\tcontent: (output as Record<string, unknown>)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t.content as\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t| Array<{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ttype: string;\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ttext?: string;\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t }>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t| undefined,\n\t\t\t\t\t\t\t\t\t\t\t\t\tstructuredContent: (output as Record<string, unknown>)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t.structuredContent as\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t| Record<string, unknown>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t| undefined,\n\t\t\t\t\t\t\t\t\t\t\t\t\t_meta: (output as Record<string, unknown>)._meta as\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t| Record<string, unknown>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t| undefined,\n\t\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t\t\tresourceEndpoint={resourceEndpoint}\n\t\t\t\t\t\t\t\t\t\t\t\tchatSessionId={chatSessionId}\n\t\t\t\t\t\t\t\t\t\t\t\tisDark={isDark}\n\t\t\t\t\t\t\t\t\t\t\t\tautoHeight={autoHeight}\n\t\t\t\t\t\t\t\t\t\t\t\ttoolDefinitions={toolDefinitions}\n\t\t\t\t\t\t\t\t\t\t\t\tonFollowUp={onFollowUp}\n\t\t\t\t\t\t\t\t\t\t\t\tonCallTool={onCallTool}\n\t\t\t\t\t\t\t\t\t\t\t\tonDisplayModeChange={\n\t\t\t\t\t\t\t\t\t\t\t\t\tonWidgetDisplayModeChange\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t? (mode) =>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tonWidgetDisplayModeChange(mode, {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ttoolCallId: part.toolCallId,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tresourceUri,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ttoolInput:\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t(part.input as Record<string, unknown>) ??\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{},\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ttoolResult: {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tcontent: (output as Record<string, unknown>)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t.content as\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t| Array<{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ttype: string;\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ttext?: string;\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t }>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t| undefined,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tstructuredContent: (\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\toutput as Record<string, unknown>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t).structuredContent as\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t| Record<string, unknown>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t| undefined,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t_meta: (output as Record<string, unknown>)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t._meta as\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t| Record<string, unknown>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t| undefined,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tautoHeight,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t: undefined\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t</WidgetErrorBoundary>\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t})}\n\t\t\t\t\t\t{!containsFullscreenTool && (\n\t\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t\t<MessageContent\n\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\tmessage.role === \"user\"\n\t\t\t\t\t\t\t\t\t\t\t? messageClassNames?.userBubble\n\t\t\t\t\t\t\t\t\t\t\t: messageClassNames?.assistantBubble,\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{fileParts.length > 0 && <Attachments files={fileParts} />}\n\t\t\t\t\t\t\t\t\t{hasTextContent\n\t\t\t\t\t\t\t\t\t\t? textParts.map((part, i) => {\n\t\t\t\t\t\t\t\t\t\t\t\tconst isStreamingPart =\n\t\t\t\t\t\t\t\t\t\t\t\t\tisLastAssistant &&\n\t\t\t\t\t\t\t\t\t\t\t\t\tstatus === \"streaming\" &&\n\t\t\t\t\t\t\t\t\t\t\t\t\ti === textParts.length - 1;\n\t\t\t\t\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t\t\t\t\t<MessageResponse\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tkey={`${message.id}-${i}`}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tisStreaming={isStreamingPart}\n\t\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{part.type === \"text\" ? part.text : \"\"}\n\t\t\t\t\t\t\t\t\t\t\t\t\t</MessageResponse>\n\t\t\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t\t: null}\n\t\t\t\t\t\t\t\t</MessageContent>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</Message>\n\t\t\t\t);\n\t\t\t})}\n\t\t\t{showWorking && <WorkingIndicator />}\n\t\t</>\n\t);\n}\n","\"use client\";\n\nimport type { FileUIPart } from \"ai\";\nimport { FileIcon } from \"lucide-react\";\nimport type { HTMLAttributes } from \"react\";\nimport { useTranslation } from \"../i18n\";\nimport { cn } from \"../lib/utils\";\n\n// ============================================================================\n// Attachments (inline list for chat bubbles)\n// ============================================================================\n\nexport type AttachmentsProps = HTMLAttributes<HTMLDivElement> & {\n\tfiles: FileUIPart[];\n};\n\nexport const Attachments = ({\n\tfiles,\n\tclassName,\n\t...props\n}: AttachmentsProps) => {\n\tif (files.length === 0) {\n\t\treturn null;\n\t}\n\n\treturn (\n\t\t<div\n\t\t\tclassName={cn(\"ww:flex ww:flex-wrap ww:gap-1.5\", className)}\n\t\t\t{...props}\n\t\t>\n\t\t\t{files.map((file, i) => (\n\t\t\t\t<AttachmentItem key={i} file={file} />\n\t\t\t))}\n\t\t</div>\n\t);\n};\n\n// ============================================================================\n// AttachmentItem\n// ============================================================================\n\nfunction AttachmentItem({ file }: { file: FileUIPart }) {\n\tconst { t } = useTranslation();\n\tconst isImage = file.mediaType?.startsWith(\"image/\");\n\n\tif (isImage && file.url) {\n\t\treturn (\n\t\t\t<img\n\t\t\t\tsrc={file.url}\n\t\t\t\talt={file.filename ?? t.attachments.attachmentFallback}\n\t\t\t\tclassName=\"ww:h-16 ww:max-w-32 ww:rounded ww:object-cover\"\n\t\t\t/>\n\t\t);\n\t}\n\n\treturn (\n\t\t<span className=\"ww:inline-flex ww:items-center ww:gap-1.5 ww:rounded ww:bg-background/20 ww:px-2 ww:py-1 ww:text-xs\">\n\t\t\t<FileIcon className=\"ww:size-3 ww:shrink-0\" />\n\t\t\t<span className=\"ww:max-w-24 ww:truncate\">\n\t\t\t\t{file.filename ?? t.attachments.fileFallback}\n\t\t\t</span>\n\t\t</span>\n\t);\n}\n","\"use client\";\n\nimport type { ToolUIPart } from \"ai\";\nimport { ChevronDownIcon, ClockIcon, type LucideIcon } from \"lucide-react\";\nimport type { HTMLAttributes, ReactNode } from \"react\";\nimport {\n\tcreateContext,\n\tuseCallback,\n\tuseContext,\n\tuseEffect,\n\tuseMemo,\n\tuseState,\n} from \"react\";\nimport { cn } from \"../lib/utils\";\nimport { Reasoning, ReasoningContent, ReasoningTrigger } from \"./reasoning\";\nimport { Shimmer } from \"./shimmer\";\n\n// After work ends, hold the last action on the single-line ticker for a beat\n// (shimmer off, label static) before swapping to the settled accordion header,\n// so the transition reads as \"landed\" rather than an abrupt cut.\nconst SETTLE_DELAY = 500;\n\n/** A single live action shown on the collapsed chain's one-line ticker: the\n * step's timeline icon plus a short label (e.g. a wrench + \"Getting a quote\"). */\nexport type ChainStep = {\n\ticon: LucideIcon;\n\tlabel: string;\n};\n\ninterface ChainContextValue {\n\topen: boolean;\n\tsetOpen: (open: boolean) => void;\n\tisWorking: boolean;\n\t/** Latches true once the run is done (after {@link SETTLE_DELAY}). While\n\t * false the header is the live single-line ticker; once true it becomes the\n\t * clickable \"Thought process\" accordion. */\n\tsettled: boolean;\n\t/** The in-flight step — drives the ticker while unsettled. */\n\tactiveStep?: ChainStep;\n}\n\nconst ChainContext = createContext<ChainContextValue | null>(null);\n\nfunction useChain(): ChainContextValue {\n\tconst ctx = useContext(ChainContext);\n\tif (!ctx) {\n\t\tthrow new Error(\n\t\t\t\"ChainOfThought components must be used within <ChainOfThought>\",\n\t\t);\n\t}\n\treturn ctx;\n}\n\nexport type ChainOfThoughtProps = HTMLAttributes<HTMLDivElement> & {\n\t/** True while the turn is still in flight. While true the chain stays\n\t * collapsed and the header is a live single-line ticker of {@link activeStep};\n\t * when it flips false the chain settles into a clickable accordion. */\n\tisWorking?: boolean;\n\t/** The step being executed. While working, the collapsed chain shows this\n\t * as one shimmering line, swapping cleanly as the step changes. Ignored once\n\t * the chain has settled. */\n\tactiveStep?: ChainStep;\n\topen?: boolean;\n\tdefaultOpen?: boolean;\n\tonOpenChange?: (open: boolean) => void;\n};\n\n/**\n * Compound root that groups a run of tool-call steps into a single \"chain of\n * thought\". While working it stays collapsed and the header shows the live\n * action on one line (icon + shimmering label) that transitions as steps\n * advance — the timeline never expands on its own. Once work ends the header\n * settles into a clickable \"Thought process\" accordion the user can open to\n * reveal the full step timeline.\n *\n * ```tsx\n * <ChainOfThought\n * isWorking={anyRunning}\n * activeStep={{ icon: WrenchIcon, label: \"Canopy offer\" }}\n * >\n * <ChainOfThoughtHeader label=\"Thought process\" />\n * <ChainOfThoughtContent>\n * <ChainOfThoughtStep icon={WrenchIcon} title=\"Getting you a quote\" state=\"output-available\" />\n * <ChainOfThoughtStep icon={WrenchIcon} title=\"Canopy offer\" state=\"output-available\" isLast />\n * </ChainOfThoughtContent>\n * </ChainOfThought>\n * ```\n */\nexport function ChainOfThought({\n\tclassName,\n\tisWorking = false,\n\tactiveStep,\n\topen,\n\tdefaultOpen = false,\n\tonOpenChange,\n\tchildren,\n\t...props\n}: ChainOfThoughtProps) {\n\tconst isControlled = open !== undefined;\n\tconst [internalOpen, setInternalOpen] = useState(defaultOpen);\n\tconst isOpen = isControlled ? open : internalOpen;\n\tconst setOpen = useCallback(\n\t\t(next: boolean) => {\n\t\t\tif (!isControlled) {\n\t\t\t\tsetInternalOpen(next);\n\t\t\t}\n\t\t\tonOpenChange?.(next);\n\t\t},\n\t\t[isControlled, onOpenChange],\n\t);\n\n\t// `settled` gates the header between its two modes. It starts true for a\n\t// chain that mounts already done (e.g. a historical message), flips false\n\t// the moment work starts, and latches true again a beat after work ends.\n\tconst [settled, setSettled] = useState(!isWorking);\n\n\tuseEffect(() => {\n\t\tif (isWorking) {\n\t\t\tsetSettled(false);\n\t\t\treturn;\n\t\t}\n\t\tconst timer = setTimeout(() => setSettled(true), SETTLE_DELAY);\n\t\treturn () => clearTimeout(timer);\n\t}, [isWorking]);\n\n\tconst contextValue = useMemo<ChainContextValue>(\n\t\t() => ({ open: isOpen, setOpen, isWorking, settled, activeStep }),\n\t\t[isOpen, setOpen, isWorking, settled, activeStep],\n\t);\n\n\treturn (\n\t\t<ChainContext.Provider value={contextValue}>\n\t\t\t<div\n\t\t\t\tclassName={cn(\"ww:mb-4 ww:flex ww:flex-col ww:gap-2\", className)}\n\t\t\t\tdata-state={isOpen ? \"open\" : \"closed\"}\n\t\t\t\tstyle={{ animation: \"ww-fade-in 0.2s ease-out\" }}\n\t\t\t\t{...props}\n\t\t\t>\n\t\t\t\t{children}\n\t\t\t</div>\n\t\t</ChainContext.Provider>\n\t);\n}\n\nexport type ChainOfThoughtHeaderProps = HTMLAttributes<HTMLButtonElement> & {\n\t/** Generic header label for the settled chain (e.g. \"Thought process\").\n\t * Deliberately not a per-turn summary — just a stable label. */\n\tlabel?: string;\n\t/** Fallback ticker label while working when no {@link ChainStep} is set\n\t * (e.g. \"Working on it…\"). Falls back to `label`. */\n\tworkingLabel?: string;\n};\n\n/**\n * The chain header, which renders in one of two modes:\n *\n * - **Working** (before the chain settles): a single, non-interactive line\n * showing the active step — its icon plus a shimmering label. The label is\n * keyed on its text so each new step animates in, giving a clean transition\n * between tool calls. There is no chevron; the timeline stays collapsed.\n * - **Settled** (once work is done): a clickable \"Thought process\" accordion\n * header with a trailing chevron that toggles the step timeline below.\n */\nexport function ChainOfThoughtHeader({\n\tclassName,\n\tlabel,\n\tworkingLabel,\n\tchildren,\n\t...props\n}: ChainOfThoughtHeaderProps) {\n\tconst { open, setOpen, isWorking, settled, activeStep } = useChain();\n\n\tif (!settled) {\n\t\tconst Icon = activeStep?.icon;\n\t\tconst text = activeStep?.label ?? workingLabel ?? label ?? \"\";\n\t\treturn (\n\t\t\t<div\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"ww:flex ww:min-h-5 ww:w-full ww:items-center ww:gap-1.5 ww:text-sm ww:text-muted-foreground\",\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t>\n\t\t\t\t{/* Keyed on the label so a new action fades/slides in as one unit —\n\t\t\t\t the \"clean transition between tool calls\". While work is live the\n\t\t\t\t label shimmers; during the settle beat it holds static. */}\n\t\t\t\t<span\n\t\t\t\t\tkey={text}\n\t\t\t\t\tclassName=\"ww:flex ww:min-w-0 ww:items-center ww:gap-1.5\"\n\t\t\t\t\tstyle={{ animation: \"ww-fade-in 0.25s ease-out\" }}\n\t\t\t\t>\n\t\t\t\t\t{Icon && (\n\t\t\t\t\t\t<Icon\n\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\"ww:size-4 ww:shrink-0\",\n\t\t\t\t\t\t\t\tisWorking && \"ww:animate-pulse\",\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t/>\n\t\t\t\t\t)}\n\t\t\t\t\t<span className=\"ww:truncate\">\n\t\t\t\t\t\t{isWorking ? <Shimmer duration={2.6}>{text}</Shimmer> : text}\n\t\t\t\t\t</span>\n\t\t\t\t</span>\n\t\t\t</div>\n\t\t);\n\t}\n\n\treturn (\n\t\t<button\n\t\t\ttype=\"button\"\n\t\t\tonClick={() => setOpen(!open)}\n\t\t\taria-expanded={open}\n\t\t\tclassName={cn(\n\t\t\t\t\"ww:flex ww:min-h-5 ww:w-full ww:items-center ww:gap-1.5 ww:text-sm ww:text-muted-foreground ww:transition-colors ww:hover:text-foreground\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\tstyle={{ animation: \"ww-fade-in 0.25s ease-out\" }}\n\t\t\t{...props}\n\t\t>\n\t\t\t<span className=\"ww:truncate\">{children ?? label}</span>\n\t\t\t<ChevronDownIcon\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"ww:size-4 ww:shrink-0 ww:transition-transform ww:duration-200\",\n\t\t\t\t\topen && \"ww:rotate-180\",\n\t\t\t\t)}\n\t\t\t/>\n\t\t</button>\n\t);\n}\n\nexport type ChainOfThoughtContentProps = HTMLAttributes<HTMLDivElement>;\n\n/** Collapsible body holding the steps. Animates open/closed via a grid-row\n * height transition, same as {@link ToolContent} / {@link ReasoningContent}. */\nexport function ChainOfThoughtContent({\n\tclassName,\n\tchildren,\n\t...props\n}: ChainOfThoughtContentProps) {\n\tconst { open } = useChain();\n\treturn (\n\t\t<div\n\t\t\tclassName={cn(\n\t\t\t\t\"ww:grid ww:transition-[grid-template-rows,opacity] ww:duration-200 ww:ease-out\",\n\t\t\t\topen\n\t\t\t\t\t? \"ww:grid-rows-[1fr] ww:opacity-100\"\n\t\t\t\t\t: \"ww:grid-rows-[0fr] ww:opacity-0\",\n\t\t\t)}\n\t\t>\n\t\t\t<div className=\"ww:min-h-0 ww:overflow-hidden\">\n\t\t\t\t<div className={cn(\"ww:flex ww:flex-col\", className)} {...props}>\n\t\t\t\t\t{children}\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t);\n}\n\n/** Shared timeline rail: an icon centered on the first text line, plus a\n * vertical connector down to the next node (omitted on the last). Used by\n * both {@link ChainOfThoughtStep} and {@link ChainOfThoughtReasoning} so all\n * nodes share one continuous line. */\nfunction ChainOfThoughtRail({\n\ticon: Icon,\n\tisLast,\n\trunning,\n\terror,\n}: {\n\ticon: LucideIcon;\n\tisLast?: boolean;\n\trunning?: boolean;\n\terror?: boolean;\n}) {\n\treturn (\n\t\t<div className=\"ww:flex ww:flex-col ww:items-center ww:self-stretch\">\n\t\t\t<span className=\"ww:flex ww:h-5 ww:items-center\">\n\t\t\t\t<Icon\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\"ww:size-4 ww:shrink-0\",\n\t\t\t\t\t\terror\n\t\t\t\t\t\t\t? \"ww:text-destructive\"\n\t\t\t\t\t\t\t: running\n\t\t\t\t\t\t\t\t? \"ww:animate-pulse ww:text-foreground\"\n\t\t\t\t\t\t\t\t: \"ww:text-muted-foreground\",\n\t\t\t\t\t)}\n\t\t\t\t/>\n\t\t\t</span>\n\t\t\t{!isLast && <span className=\"ww:w-px ww:flex-1 ww:bg-border\" />}\n\t\t</div>\n\t);\n}\n\nexport type ChainOfThoughtStepProps = HTMLAttributes<HTMLDivElement> & {\n\t/** Timeline icon for this step — e.g. a wrench for a tool call, a globe\n\t * for a search. Recolors to reflect running/error state. */\n\ticon: LucideIcon;\n\ttitle?: string;\n\tstate: ToolUIPart[\"state\"];\n\t/** When true, omits the connecting line below the icon (the timeline tail). */\n\tisLast?: boolean;\n\t/** Expandable detail (e.g. request/response JSON). When present the step\n\t * row becomes a toggle. Omit for label-only (\"titles-only\") steps. */\n\tchildren?: ReactNode;\n};\n\n/**\n * A single step in the chain, rendered as a timeline node: an icon connected\n * by a vertical line to the next step, plus the step title. While running the\n * icon pulses and the title shimmers. If `children` are provided (full mode),\n * the row toggles a collapsible panel holding the tool request/response.\n */\nexport function ChainOfThoughtStep({\n\tclassName,\n\ticon: Icon,\n\ttitle,\n\tstate,\n\tisLast = false,\n\tchildren,\n\t...props\n}: ChainOfThoughtStepProps) {\n\tconst isRunning = state === \"input-available\" || state === \"input-streaming\";\n\tconst isError = state === \"output-error\";\n\tconst expandable = children != null;\n\tconst [open, setOpen] = useState(false);\n\tconst label = title ?? \"\";\n\n\tconst labelNode = isRunning ? (\n\t\t<Shimmer duration={1.6}>{label}</Shimmer>\n\t) : (\n\t\t<span className=\"ww:truncate\">{label}</span>\n\t);\n\n\treturn (\n\t\t<div className={cn(\"ww:flex ww:gap-2\", className)} {...props}>\n\t\t\t<ChainOfThoughtRail\n\t\t\t\ticon={Icon}\n\t\t\t\tisLast={isLast}\n\t\t\t\trunning={isRunning}\n\t\t\t\terror={isError}\n\t\t\t/>\n\n\t\t\t{/* Step body */}\n\t\t\t<div className={cn(\"ww:min-w-0 ww:flex-1\", !isLast && \"ww:pb-3\")}>\n\t\t\t\t{expandable ? (\n\t\t\t\t\t<button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tonClick={() => setOpen((o) => !o)}\n\t\t\t\t\t\taria-expanded={open}\n\t\t\t\t\t\tclassName=\"ww:flex ww:w-full ww:items-center ww:gap-1.5 ww:text-left ww:text-sm ww:text-muted-foreground ww:transition-colors ww:hover:text-foreground\"\n\t\t\t\t\t>\n\t\t\t\t\t\t{labelNode}\n\t\t\t\t\t\t<ChevronDownIcon\n\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\"ww:size-3.5 ww:shrink-0 ww:transition-transform ww:duration-200\",\n\t\t\t\t\t\t\t\topen && \"ww:rotate-180\",\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</button>\n\t\t\t\t) : (\n\t\t\t\t\t<div className=\"ww:flex ww:items-center ww:text-sm ww:text-muted-foreground\">\n\t\t\t\t\t\t{labelNode}\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\n\t\t\t\t{expandable && (\n\t\t\t\t\t<div\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\"ww:grid ww:transition-[grid-template-rows,opacity] ww:duration-200 ww:ease-out\",\n\t\t\t\t\t\t\topen\n\t\t\t\t\t\t\t\t? \"ww:grid-rows-[1fr] ww:opacity-100\"\n\t\t\t\t\t\t\t\t: \"ww:grid-rows-[0fr] ww:opacity-0\",\n\t\t\t\t\t\t)}\n\t\t\t\t\t>\n\t\t\t\t\t\t<div className=\"ww:min-h-0 ww:overflow-hidden\">\n\t\t\t\t\t\t\t<div className=\"ww:mt-2 ww:space-y-3 ww:rounded-lg ww:border ww:border-border ww:bg-background ww:p-3\">\n\t\t\t\t\t\t\t\t{children}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t</div>\n\t);\n}\n\nexport type ChainOfThoughtReasoningProps = {\n\t/** Whether the reasoning is still streaming (drives shimmer + auto-open). */\n\tisStreaming?: boolean;\n\t/** Omits the connector tail when this is the last node in the chain. */\n\tisLast?: boolean;\n\t/** The reasoning text (markdown). */\n\tchildren: string;\n};\n\n/**\n * Reasoning rendered as a chain step: a clock icon on the shared timeline\n * rail, with the {@link Reasoning} trigger (\"Thought for X seconds\") and its\n * collapsible thinking text as the body. Lets the reasoning trace sit inline\n * among the tool steps in chronological order, on one continuous line.\n */\nexport function ChainOfThoughtReasoning({\n\tisStreaming = false,\n\tisLast = false,\n\tchildren,\n}: ChainOfThoughtReasoningProps) {\n\treturn (\n\t\t<div className=\"ww:flex ww:gap-2\">\n\t\t\t<ChainOfThoughtRail\n\t\t\t\ticon={ClockIcon}\n\t\t\t\tisLast={isLast}\n\t\t\t\trunning={isStreaming}\n\t\t\t/>\n\t\t\t<div className={cn(\"ww:min-w-0 ww:flex-1\", !isLast && \"ww:pb-3\")}>\n\t\t\t\t<Reasoning isStreaming={isStreaming} className=\"ww:mb-0\">\n\t\t\t\t\t<ReasoningTrigger hideIcon />\n\t\t\t\t\t<ReasoningContent>{children}</ReasoningContent>\n\t\t\t\t</Reasoning>\n\t\t\t</div>\n\t\t</div>\n\t);\n}\n","\"use client\";\n\nimport { ClockIcon } from \"lucide-react\";\nimport type { HTMLAttributes, ReactNode } from \"react\";\nimport {\n\tcreateContext,\n\tmemo,\n\tuseCallback,\n\tuseContext,\n\tuseEffect,\n\tuseMemo,\n\tuseRef,\n\tuseState,\n} from \"react\";\nimport { Streamdown } from \"streamdown\";\nimport { useTranslation } from \"../i18n\";\nimport { cn } from \"../lib/utils\";\nimport { Shimmer } from \"./shimmer\";\n\ninterface ReasoningContextValue {\n\tisStreaming: boolean;\n\tisOpen: boolean;\n\tsetIsOpen: (open: boolean) => void;\n\tduration: number | undefined;\n}\n\nconst ReasoningContext = createContext<ReasoningContextValue | null>(null);\n\nfunction useReasoning(): ReasoningContextValue {\n\tconst ctx = useContext(ReasoningContext);\n\tif (!ctx) {\n\t\tthrow new Error(\"Reasoning components must be used within <Reasoning>\");\n\t}\n\treturn ctx;\n}\n\nconst AUTO_CLOSE_DELAY = 1000;\nconst MS_IN_S = 1000;\n\nexport type ReasoningProps = HTMLAttributes<HTMLDivElement> & {\n\tisStreaming?: boolean;\n\topen?: boolean;\n\tdefaultOpen?: boolean;\n\tonOpenChange?: (open: boolean) => void;\n\tduration?: number;\n};\n\n/**\n * Compound root for a model's reasoning trace. Tracks streaming duration,\n * auto-opens during streaming, auto-collapses ~1s after streaming ends.\n *\n * ```tsx\n * <Reasoning isStreaming={part.state === \"streaming\"}>\n * <ReasoningTrigger />\n * <ReasoningContent>{part.text}</ReasoningContent>\n * </Reasoning>\n * ```\n */\nexport const Reasoning = memo(\n\t({\n\t\tclassName,\n\t\tisStreaming = false,\n\t\topen,\n\t\tdefaultOpen,\n\t\tonOpenChange,\n\t\tduration: durationProp,\n\t\tchildren,\n\t\t...props\n\t}: ReasoningProps) => {\n\t\tconst resolvedDefaultOpen = defaultOpen ?? isStreaming;\n\t\tconst isExplicitlyClosed = defaultOpen === false;\n\n\t\tconst isControlled = open !== undefined;\n\t\tconst [internalOpen, setInternalOpen] = useState(resolvedDefaultOpen);\n\t\tconst isOpen = isControlled ? open : internalOpen;\n\t\tconst setIsOpen = useCallback(\n\t\t\t(next: boolean) => {\n\t\t\t\tif (!isControlled) {\n\t\t\t\t\tsetInternalOpen(next);\n\t\t\t\t}\n\t\t\t\tonOpenChange?.(next);\n\t\t\t},\n\t\t\t[isControlled, onOpenChange],\n\t\t);\n\n\t\tconst [internalDuration, setInternalDuration] = useState<\n\t\t\tnumber | undefined\n\t\t>(undefined);\n\t\tconst duration = durationProp ?? internalDuration;\n\n\t\tconst hasEverStreamedRef = useRef(isStreaming);\n\t\tconst [hasAutoClosed, setHasAutoClosed] = useState(false);\n\t\tconst startTimeRef = useRef<number | null>(null);\n\n\t\t// Track streaming start/end → compute duration.\n\t\tuseEffect(() => {\n\t\t\tif (isStreaming) {\n\t\t\t\thasEverStreamedRef.current = true;\n\t\t\t\tif (startTimeRef.current === null) {\n\t\t\t\t\tstartTimeRef.current = Date.now();\n\t\t\t\t}\n\t\t\t} else if (startTimeRef.current !== null) {\n\t\t\t\tsetInternalDuration(\n\t\t\t\t\tMath.ceil((Date.now() - startTimeRef.current) / MS_IN_S),\n\t\t\t\t);\n\t\t\t\tstartTimeRef.current = null;\n\t\t\t}\n\t\t}, [isStreaming]);\n\n\t\t// Auto-open on streaming start.\n\t\tuseEffect(() => {\n\t\t\tif (isStreaming && !isOpen && !isExplicitlyClosed) {\n\t\t\t\tsetIsOpen(true);\n\t\t\t}\n\t\t}, [isStreaming, isOpen, isExplicitlyClosed, setIsOpen]);\n\n\t\t// Auto-close ~1s after streaming ends (once).\n\t\tuseEffect(() => {\n\t\t\tif (\n\t\t\t\thasEverStreamedRef.current &&\n\t\t\t\t!isStreaming &&\n\t\t\t\tisOpen &&\n\t\t\t\t!hasAutoClosed\n\t\t\t) {\n\t\t\t\tconst timer = setTimeout(() => {\n\t\t\t\t\tsetIsOpen(false);\n\t\t\t\t\tsetHasAutoClosed(true);\n\t\t\t\t}, AUTO_CLOSE_DELAY);\n\t\t\t\treturn () => clearTimeout(timer);\n\t\t\t}\n\t\t}, [isStreaming, isOpen, hasAutoClosed, setIsOpen]);\n\n\t\tconst contextValue = useMemo<ReasoningContextValue>(\n\t\t\t() => ({ isStreaming, isOpen, setIsOpen, duration }),\n\t\t\t[isStreaming, isOpen, setIsOpen, duration],\n\t\t);\n\n\t\treturn (\n\t\t\t<ReasoningContext.Provider value={contextValue}>\n\t\t\t\t<div\n\t\t\t\t\tclassName={cn(\"ww:mb-4 ww:flex ww:flex-col ww:gap-2\", className)}\n\t\t\t\t\tdata-state={isOpen ? \"open\" : \"closed\"}\n\t\t\t\t\tstyle={{ animation: \"ww-fade-in 0.2s ease-out\" }}\n\t\t\t\t\t{...props}\n\t\t\t\t>\n\t\t\t\t\t{children}\n\t\t\t\t</div>\n\t\t\t</ReasoningContext.Provider>\n\t\t);\n\t},\n);\nReasoning.displayName = \"Reasoning\";\n\nexport type ReasoningTriggerProps = HTMLAttributes<HTMLButtonElement> & {\n\tgetThinkingMessage?: (isStreaming: boolean, duration?: number) => ReactNode;\n\t/** Omit the leading clock icon — used when an outer timeline rail already\n\t * provides the icon (e.g. inside a chain of thought). */\n\thideIcon?: boolean;\n};\n\nexport const ReasoningTrigger = memo(\n\t({\n\t\tclassName,\n\t\tchildren,\n\t\tgetThinkingMessage,\n\t\thideIcon = false,\n\t\tonClick,\n\t\t...props\n\t}: ReasoningTriggerProps) => {\n\t\tconst { t } = useTranslation();\n\t\tconst { isStreaming, isOpen, duration, setIsOpen } = useReasoning();\n\t\tconst defaultGetThinkingMessage = (\n\t\t\tstreaming: boolean,\n\t\t\tdur?: number,\n\t\t): ReactNode => {\n\t\t\tif (streaming || dur === 0) {\n\t\t\t\treturn <Shimmer duration={1.6}>{t.reasoning.thinking}</Shimmer>;\n\t\t\t}\n\t\t\tif (dur === undefined) {\n\t\t\t\treturn <span>{t.reasoning.thoughtBrief}</span>;\n\t\t\t}\n\t\t\treturn <span>{t.reasoning.thoughtForSeconds(dur)}</span>;\n\t\t};\n\t\tconst resolvedGetThinkingMessage =\n\t\t\tgetThinkingMessage ?? defaultGetThinkingMessage;\n\n\t\treturn (\n\t\t\t<button\n\t\t\t\ttype=\"button\"\n\t\t\t\taria-expanded={isOpen}\n\t\t\t\tonClick={(e) => {\n\t\t\t\t\tsetIsOpen(!isOpen);\n\t\t\t\t\tonClick?.(e);\n\t\t\t\t}}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"ww:flex ww:w-full ww:items-center ww:gap-2 ww:text-sm ww:text-muted-foreground ww:transition-colors ww:hover:text-foreground\",\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t\t{...props}\n\t\t\t>\n\t\t\t\t{children ?? (\n\t\t\t\t\t<>\n\t\t\t\t\t\t{!hideIcon && <ClockIcon className=\"ww:size-4 ww:shrink-0\" />}\n\t\t\t\t\t\t{resolvedGetThinkingMessage(isStreaming, duration)}\n\t\t\t\t\t</>\n\t\t\t\t)}\n\t\t\t</button>\n\t\t);\n\t},\n);\nReasoningTrigger.displayName = \"ReasoningTrigger\";\n\nexport type ReasoningContentProps = HTMLAttributes<HTMLDivElement> & {\n\tchildren: string;\n};\n\nexport const ReasoningContent = memo(\n\t({ className, children, ...props }: ReasoningContentProps) => {\n\t\tconst { isOpen } = useReasoning();\n\t\treturn (\n\t\t\t<div\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"ww:grid ww:transition-[grid-template-rows,opacity] ww:duration-200 ww:ease-out\",\n\t\t\t\t\tisOpen\n\t\t\t\t\t\t? \"ww:grid-rows-[1fr] ww:opacity-100\"\n\t\t\t\t\t\t: \"ww:grid-rows-[0fr] ww:opacity-0\",\n\t\t\t\t)}\n\t\t\t>\n\t\t\t\t<div className=\"ww:min-h-0 ww:overflow-hidden\">\n\t\t\t\t\t<div\n\t\t\t\t\t\tclassName={cn(\"ww:text-sm ww:text-muted-foreground\", className)}\n\t\t\t\t\t\t{...props}\n\t\t\t\t\t>\n\t\t\t\t\t\t<Streamdown>{children}</Streamdown>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t);\n\t},\n);\nReasoningContent.displayName = \"ReasoningContent\";\n","\"use client\";\nexport{i as Block,j as Streamdown,h as StreamdownContext,f as defaultRehypePlugins,g as defaultRemarkPlugins,e as parseMarkdownIntoBlocks}from'./chunk-5FQGJX7Z.js';","\"use client\";\n\nimport type { CSSProperties, ElementType, HTMLAttributes } from \"react\";\nimport { memo } from \"react\";\nimport { cn } from \"../lib/utils\";\n\nexport type ShimmerProps = HTMLAttributes<HTMLElement> & {\n\tas?: ElementType;\n\t/** Animation duration in seconds. Defaults to 2s. */\n\tduration?: number;\n\tchildren: string;\n};\n\n/**\n * Text shimmer effect — a moving highlight sweeps across the muted text\n * to signal an ongoing async action. CSS-only; no motion/framer dependency.\n *\n * Visual: text rendered in `--ww-color-muted-foreground`, with a narrow\n * brighter band (`--ww-color-foreground`) sweeping left→right on loop.\n */\nconst ShimmerComponent = ({\n\tas: Component = \"span\",\n\tclassName,\n\tduration = 2,\n\tstyle,\n\tchildren,\n\t...props\n}: ShimmerProps) => {\n\tconst mergedStyle: CSSProperties = {\n\t\tbackgroundImage:\n\t\t\t\"linear-gradient(90deg, var(--ww-color-muted-foreground) 0%, var(--ww-color-muted-foreground) 40%, var(--ww-color-foreground) 50%, var(--ww-color-muted-foreground) 60%, var(--ww-color-muted-foreground) 100%)\",\n\t\tbackgroundSize: \"250% 100%\",\n\t\tWebkitBackgroundClip: \"text\",\n\t\tbackgroundClip: \"text\",\n\t\tcolor: \"transparent\",\n\t\tanimation: `ww-shimmer ${duration}s linear infinite`,\n\t\t...style,\n\t};\n\n\treturn (\n\t\t<Component\n\t\t\tdata-waniwani-shimmer=\"\"\n\t\t\tclassName={cn(\"ww:inline-block\", className)}\n\t\t\tstyle={mergedStyle}\n\t\t\t{...props}\n\t\t>\n\t\t\t{children}\n\t\t</Component>\n\t);\n};\n\nexport const Shimmer = memo(ShimmerComponent);\nShimmer.displayName = \"Shimmer\";\n","\"use client\";\n\nimport { cjk } from \"@streamdown/cjk\";\nimport { code } from \"@streamdown/code\";\nimport type { UIMessage } from \"ai\";\nimport type { ComponentProps, HTMLAttributes, ReactNode } from \"react\";\nimport { memo } from \"react\";\nimport { Streamdown } from \"streamdown\";\nimport { useSmoothStream } from \"../hooks/use-smooth-stream\";\nimport { cn } from \"../lib/utils\";\n\nexport type MessageProps = HTMLAttributes<HTMLDivElement> & {\n\tfrom: UIMessage[\"role\"];\n\tchildren?: ReactNode;\n};\n\nexport const Message = ({\n\tclassName,\n\tfrom,\n\tchildren,\n\t...props\n}: MessageProps) => (\n\t<div\n\t\tclassName={cn(\n\t\t\t\"ww-message ww:group ww:flex ww:w-full\",\n\t\t\tfrom === \"user\"\n\t\t\t\t? \"ww-message-user is-user ww:ml-auto ww:flex-col ww:items-end ww:[max-width:var(--ww-msg-max-width,80%)]\"\n\t\t\t\t: \"ww-message-assistant is-assistant ww:flex-col\",\n\t\t\tclassName,\n\t\t)}\n\t\t{...props}\n\t>\n\t\t<div className={cn(\"ww:flex ww:min-w-0 ww:flex-col ww:gap-2\", \"ww:w-full\")}>\n\t\t\t{children}\n\t\t</div>\n\t</div>\n);\n\nexport type MessageContentProps = HTMLAttributes<HTMLDivElement>;\n\nexport const MessageContent = ({\n\tchildren,\n\tclassName,\n\t...props\n}: MessageContentProps) => (\n\t<div\n\t\tclassName={cn(\n\t\t\t\"ww-bubble ww:flex ww:w-fit ww:min-w-0 ww:max-w-full ww:flex-col ww:gap-2 ww:overflow-hidden\",\n\t\t\t\"ww:[font-size:var(--ww-font-size,1rem)] ww:[line-height:var(--ww-line-height,1.5)]\",\n\t\t\t\"ww:group-[.is-user]:ml-auto ww:group-[.is-user]:bg-user-bubble ww:group-[.is-user]:[color:var(--ww-color-user-bubble-text)] ww:group-[.is-user]:[border-radius:var(--ww-msg-radius,8px)] ww:group-[.is-user]:[padding:var(--ww-msg-pad-y,12px)_var(--ww-msg-pad-x,16px)]\",\n\t\t\t\"ww:group-[.is-assistant]:text-foreground\",\n\t\t\tclassName,\n\t\t)}\n\t\t{...props}\n\t>\n\t\t{children}\n\t</div>\n);\n\nexport type MessageResponseProps = ComponentProps<typeof Streamdown> & {\n\tisStreaming?: boolean;\n};\n\nconst streamdownPluginsFull = { cjk, code };\nconst streamdownPluginsStreaming = { cjk };\nconst defaultLinkSafety = { enabled: false } as const;\n\nfunction MessageResponseImpl({\n\tclassName,\n\tlinkSafety,\n\tisStreaming,\n\tchildren,\n\t...props\n}: MessageResponseProps) {\n\tconst fullText = typeof children === \"string\" ? children : \"\";\n\tconst smoothed = useSmoothStream(fullText, Boolean(isStreaming));\n\tconst rendered = typeof children === \"string\" ? smoothed : children;\n\n\treturn (\n\t\t<Streamdown\n\t\t\tclassName={cn(\n\t\t\t\t\"ww:size-full ww:[&>*:first-child]:mt-0 ww:[&>*:last-child]:mb-0\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\tlinkSafety={linkSafety ?? defaultLinkSafety}\n\t\t\tplugins={isStreaming ? streamdownPluginsStreaming : streamdownPluginsFull}\n\t\t\t{...props}\n\t\t>\n\t\t\t{rendered}\n\t\t</Streamdown>\n\t);\n}\n\nexport const MessageResponse = memo(\n\tMessageResponseImpl,\n\t(prevProps, nextProps) =>\n\t\tprevProps.children === nextProps.children &&\n\t\tprevProps.isStreaming === nextProps.isStreaming,\n);\n\nMessageResponse.displayName = \"MessageResponse\";\n","import c from'remark-cjk-friendly';import a from'remark-cjk-friendly-gfm-strikethrough';import {visit}from'unist-util-visit';var k=new Set([\"\\u3002\",\"\\uFF0E\",\"\\uFF0C\",\"\\u3001\",\"\\uFF1F\",\"\\uFF01\",\"\\uFF1A\",\"\\uFF1B\",\"\\uFF08\",\"\\uFF09\",\"\\u3010\",\"\\u3011\",\"\\u300C\",\"\\u300D\",\"\\u300E\",\"\\u300F\",\"\\u3008\",\"\\u3009\",\"\\u300A\",\"\\u300B\"]),m=/^(https?:\\/\\/|mailto:|www\\.)/i,f=t=>{if(t.children.length!==1)return false;let r=t.children[0];return r.type===\"text\"&&r.value===t.url},P=t=>{let r=0;for(let e of t){if(k.has(e))return r;r+=e.length;}return null},p=(t,r)=>({...r,url:t,children:[{type:\"text\",value:t}]}),d=t=>({type:\"text\",value:t}),y=()=>t=>{visit(t,\"link\",(r,e,i)=>{if(!i||typeof e!=\"number\"||!f(r)||!m.test(r.url))return;let n=P(r.url);if(n===null||n===0)return;let l=r.url.slice(0,n),u=r.url.slice(n),o=p(l,r),s=d(u);return i.children.splice(e,1,o,s),e+1});};function b(){let t=[c],r=[y,a],e=[...t,...r];return {name:\"cjk\",type:\"cjk\",remarkPluginsBefore:t,remarkPluginsAfter:r,remarkPlugins:e}}var A=b();export{A as cjk,b as createCjkPlugin};","// src/index.ts\nimport { cjkFriendlyExtension } from \"micromark-extension-cjk-friendly\";\nfunction remarkCjkFriendly() {\n const data = this.data();\n const micromarkExtensions = (\n // biome-ignore lint/suspicious/noAssignInExpressions: base plugin (remark-gfm) already does this\n data.micromarkExtensions || (data.micromarkExtensions = [])\n );\n micromarkExtensions.push(cjkFriendlyExtension());\n}\nexport {\n remarkCjkFriendly as default\n};\n","// src/index.ts\nimport { codes as codes2 } from \"micromark-util-symbol\";\n\n// src/ext/attention.ts\nimport { ok as assert } from \"devlop\";\nimport {\n classifyCharacter,\n classifyPrecedingCharacter,\n isCjk,\n isCjkOrIvs,\n isCodeHighSurrogate,\n isCodeLowSurrogate,\n isNonCjkPunctuation,\n isSpaceOrPunctuation,\n isUnicodeWhitespace,\n TwoPreviousCode,\n tryGetGenuineNextCode,\n tryGetGenuinePreviousCode\n} from \"micromark-extension-cjk-friendly-util\";\nimport { push, splice } from \"micromark-util-chunked\";\nimport { resolveAll } from \"micromark-util-resolve-all\";\nimport { codes, types } from \"micromark-util-symbol\";\nvar attention = {\n name: \"attention\",\n resolveAll: resolveAllAttention,\n tokenize: tokenizeAttention\n};\nfunction resolveAllAttention(events, context) {\n let index = -1;\n let open;\n let group;\n let text;\n let openingSequence;\n let closingSequence;\n let use;\n let nextEvents;\n let offset;\n while (++index < events.length) {\n if (events[index][0] === \"enter\" && events[index][1].type === \"attentionSequence\" && events[index][1]._close) {\n open = index;\n while (open--) {\n if (events[open][0] === \"exit\" && events[open][1].type === \"attentionSequence\" && events[open][1]._open && // If the markers are the same:\n context.sliceSerialize(events[open][1]).charCodeAt(0) === context.sliceSerialize(events[index][1]).charCodeAt(0)) {\n if ((events[open][1]._close || events[index][1]._open) && (events[index][1].end.offset - events[index][1].start.offset) % 3 && !((events[open][1].end.offset - events[open][1].start.offset + events[index][1].end.offset - events[index][1].start.offset) % 3)) {\n continue;\n }\n use = events[open][1].end.offset - events[open][1].start.offset > 1 && events[index][1].end.offset - events[index][1].start.offset > 1 ? 2 : 1;\n const start = { ...events[open][1].end };\n const end = { ...events[index][1].start };\n movePoint(start, -use);\n movePoint(end, use);\n openingSequence = {\n type: use > 1 ? types.strongSequence : types.emphasisSequence,\n start,\n end: { ...events[open][1].end }\n };\n closingSequence = {\n type: use > 1 ? types.strongSequence : types.emphasisSequence,\n start: { ...events[index][1].start },\n end\n };\n text = {\n type: use > 1 ? types.strongText : types.emphasisText,\n start: { ...events[open][1].end },\n end: { ...events[index][1].start }\n };\n group = {\n type: use > 1 ? types.strong : types.emphasis,\n start: { ...openingSequence.start },\n end: { ...closingSequence.end }\n };\n events[open][1].end = { ...openingSequence.start };\n events[index][1].start = { ...closingSequence.end };\n nextEvents = [];\n if (events[open][1].end.offset - events[open][1].start.offset) {\n nextEvents = push(nextEvents, [\n [\"enter\", events[open][1], context],\n [\"exit\", events[open][1], context]\n ]);\n }\n nextEvents = push(nextEvents, [\n [\"enter\", group, context],\n [\"enter\", openingSequence, context],\n [\"exit\", openingSequence, context],\n [\"enter\", text, context]\n ]);\n assert(\n context.parser.constructs.insideSpan.null,\n \"expected `insideSpan` to be populated\"\n );\n nextEvents = push(\n nextEvents,\n resolveAll(\n context.parser.constructs.insideSpan.null,\n events.slice(open + 1, index),\n context\n )\n );\n nextEvents = push(nextEvents, [\n [\"exit\", text, context],\n [\"enter\", closingSequence, context],\n [\"exit\", closingSequence, context],\n [\"exit\", group, context]\n ]);\n if (events[index][1].end.offset - events[index][1].start.offset) {\n offset = 2;\n nextEvents = push(nextEvents, [\n [\"enter\", events[index][1], context],\n [\"exit\", events[index][1], context]\n ]);\n } else {\n offset = 0;\n }\n splice(events, open - 1, index - open + 3, nextEvents);\n index = open + nextEvents.length - offset - 2;\n break;\n }\n }\n }\n }\n index = -1;\n while (++index < events.length) {\n if (events[index][1].type === \"attentionSequence\") {\n events[index][1].type = \"data\";\n }\n }\n return events;\n}\nfunction tokenizeAttention(effects, ok) {\n const attentionMarkers = this.parser.constructs.attentionMarkers.null;\n const { now, sliceSerialize, previous: tentativePrevious } = this;\n const previous = isCodeLowSurrogate(tentativePrevious) ? (\n // second (lower) surrogate likely to be preceded by first (higher) surrogate\n tryGetGenuinePreviousCode(tentativePrevious, now(), sliceSerialize)\n ) : tentativePrevious;\n const before = classifyCharacter(previous);\n const twoPrevious = new TwoPreviousCode(previous, now(), sliceSerialize);\n const beforePrimary = classifyPrecedingCharacter(\n before,\n twoPrevious.value.bind(twoPrevious),\n previous\n );\n let marker;\n return start;\n function start(code) {\n assert(\n code === codes.asterisk || code === codes.underscore,\n \"expected asterisk or underscore\"\n );\n marker = code;\n effects.enter(\"attentionSequence\");\n return inside(code);\n }\n function inside(code) {\n if (code === marker) {\n effects.consume(code);\n return inside;\n }\n const token = effects.exit(\"attentionSequence\");\n const next = isCodeHighSurrogate(code) ? tryGetGenuineNextCode(code, now(), sliceSerialize) : code;\n const after = classifyCharacter(next);\n assert(attentionMarkers, \"expected `attentionMarkers` to be populated\");\n const beforeNonCjkPunctuation = isNonCjkPunctuation(beforePrimary);\n const beforeSpaceOrNonCjkPunctuation = beforeNonCjkPunctuation || isUnicodeWhitespace(beforePrimary);\n const afterNonCjkPunctuation = isNonCjkPunctuation(after);\n const afterSpaceOrNonCjkPunctuation = afterNonCjkPunctuation || isUnicodeWhitespace(after);\n const beforeCjkOrIvs = isCjkOrIvs(beforePrimary);\n const open = !afterSpaceOrNonCjkPunctuation || afterNonCjkPunctuation && (beforeSpaceOrNonCjkPunctuation || beforeCjkOrIvs) || attentionMarkers.includes(code);\n const close = !beforeSpaceOrNonCjkPunctuation || beforeNonCjkPunctuation && (afterSpaceOrNonCjkPunctuation || isCjk(after)) || attentionMarkers.includes(previous);\n token._open = Boolean(\n marker === codes.asterisk ? open : open && (isSpaceOrPunctuation(beforePrimary) || !close)\n );\n token._close = Boolean(\n marker === codes.asterisk ? close : close && (isSpaceOrPunctuation(after) || !open)\n );\n return ok(code);\n }\n}\nfunction movePoint(point, offset) {\n point.column += offset;\n point.offset += offset;\n point._bufferIndex += offset;\n}\n\n// src/index.ts\nfunction cjkFriendlyExtension() {\n return {\n text: {\n [codes2.asterisk]: attention,\n [codes2.underscore]: attention\n },\n insideSpan: { null: [attention] }\n };\n}\nexport {\n cjkFriendlyExtension\n};\n","export {codes} from './codes.js'\nexport {constants} from './constants.js'\nexport {types} from './types.js'\nexport {values} from './values.js'\n","/**\n * Character codes.\n *\n * This module is compiled away!\n *\n * micromark works based on character codes.\n * This module contains constants for the ASCII block and the replacement\n * character.\n * A couple of them are handled in a special way, such as the line endings\n * (CR, LF, and CR+LF, commonly known as end-of-line: EOLs), the tab (horizontal\n * tab) and its expansion based on what column it’s at (virtual space),\n * and the end-of-file (eof) character.\n * As values are preprocessed before handling them, the actual characters LF,\n * CR, HT, and NUL (which is present as the replacement character), are\n * guaranteed to not exist.\n *\n * Unicode basic latin block.\n */\nexport const codes = /** @type {const} */ ({\n carriageReturn: -5,\n lineFeed: -4,\n carriageReturnLineFeed: -3,\n horizontalTab: -2,\n virtualSpace: -1,\n eof: null,\n nul: 0,\n soh: 1,\n stx: 2,\n etx: 3,\n eot: 4,\n enq: 5,\n ack: 6,\n bel: 7,\n bs: 8,\n ht: 9, // `\\t`\n lf: 10, // `\\n`\n vt: 11, // `\\v`\n ff: 12, // `\\f`\n cr: 13, // `\\r`\n so: 14,\n si: 15,\n dle: 16,\n dc1: 17,\n dc2: 18,\n dc3: 19,\n dc4: 20,\n nak: 21,\n syn: 22,\n etb: 23,\n can: 24,\n em: 25,\n sub: 26,\n esc: 27,\n fs: 28,\n gs: 29,\n rs: 30,\n us: 31,\n space: 32,\n exclamationMark: 33, // `!`\n quotationMark: 34, // `\"`\n numberSign: 35, // `#`\n dollarSign: 36, // `$`\n percentSign: 37, // `%`\n ampersand: 38, // `&`\n apostrophe: 39, // `'`\n leftParenthesis: 40, // `(`\n rightParenthesis: 41, // `)`\n asterisk: 42, // `*`\n plusSign: 43, // `+`\n comma: 44, // `,`\n dash: 45, // `-`\n dot: 46, // `.`\n slash: 47, // `/`\n digit0: 48, // `0`\n digit1: 49, // `1`\n digit2: 50, // `2`\n digit3: 51, // `3`\n digit4: 52, // `4`\n digit5: 53, // `5`\n digit6: 54, // `6`\n digit7: 55, // `7`\n digit8: 56, // `8`\n digit9: 57, // `9`\n colon: 58, // `:`\n semicolon: 59, // `;`\n lessThan: 60, // `<`\n equalsTo: 61, // `=`\n greaterThan: 62, // `>`\n questionMark: 63, // `?`\n atSign: 64, // `@`\n uppercaseA: 65, // `A`\n uppercaseB: 66, // `B`\n uppercaseC: 67, // `C`\n uppercaseD: 68, // `D`\n uppercaseE: 69, // `E`\n uppercaseF: 70, // `F`\n uppercaseG: 71, // `G`\n uppercaseH: 72, // `H`\n uppercaseI: 73, // `I`\n uppercaseJ: 74, // `J`\n uppercaseK: 75, // `K`\n uppercaseL: 76, // `L`\n uppercaseM: 77, // `M`\n uppercaseN: 78, // `N`\n uppercaseO: 79, // `O`\n uppercaseP: 80, // `P`\n uppercaseQ: 81, // `Q`\n uppercaseR: 82, // `R`\n uppercaseS: 83, // `S`\n uppercaseT: 84, // `T`\n uppercaseU: 85, // `U`\n uppercaseV: 86, // `V`\n uppercaseW: 87, // `W`\n uppercaseX: 88, // `X`\n uppercaseY: 89, // `Y`\n uppercaseZ: 90, // `Z`\n leftSquareBracket: 91, // `[`\n backslash: 92, // `\\`\n rightSquareBracket: 93, // `]`\n caret: 94, // `^`\n underscore: 95, // `_`\n graveAccent: 96, // `` ` ``\n lowercaseA: 97, // `a`\n lowercaseB: 98, // `b`\n lowercaseC: 99, // `c`\n lowercaseD: 100, // `d`\n lowercaseE: 101, // `e`\n lowercaseF: 102, // `f`\n lowercaseG: 103, // `g`\n lowercaseH: 104, // `h`\n lowercaseI: 105, // `i`\n lowercaseJ: 106, // `j`\n lowercaseK: 107, // `k`\n lowercaseL: 108, // `l`\n lowercaseM: 109, // `m`\n lowercaseN: 110, // `n`\n lowercaseO: 111, // `o`\n lowercaseP: 112, // `p`\n lowercaseQ: 113, // `q`\n lowercaseR: 114, // `r`\n lowercaseS: 115, // `s`\n lowercaseT: 116, // `t`\n lowercaseU: 117, // `u`\n lowercaseV: 118, // `v`\n lowercaseW: 119, // `w`\n lowercaseX: 120, // `x`\n lowercaseY: 121, // `y`\n lowercaseZ: 122, // `z`\n leftCurlyBrace: 123, // `{`\n verticalBar: 124, // `|`\n rightCurlyBrace: 125, // `}`\n tilde: 126, // `~`\n del: 127,\n // Unicode Specials block.\n byteOrderMarker: 65_279,\n // Unicode Specials block.\n replacementCharacter: 65_533 // `�`\n})\n","/**\n * This module is compiled away!\n *\n * Parsing markdown comes with a couple of constants, such as minimum or maximum\n * sizes of certain sequences.\n * Additionally, there are a couple symbols used inside micromark.\n * These are all defined here, but compiled away by scripts.\n */\nexport const constants = /** @type {const} */ ({\n attentionSideAfter: 2, // Symbol to mark an attention sequence as after content: `a*`\n attentionSideBefore: 1, // Symbol to mark an attention sequence as before content: `*a`\n atxHeadingOpeningFenceSizeMax: 6, // 6 number signs is fine, 7 isn’t.\n autolinkDomainSizeMax: 63, // 63 characters is fine, 64 is too many.\n autolinkSchemeSizeMax: 32, // 32 characters is fine, 33 is too many.\n cdataOpeningString: 'CDATA[', // And preceded by `<![`.\n characterGroupPunctuation: 2, // Symbol used to indicate a character is punctuation\n characterGroupWhitespace: 1, // Symbol used to indicate a character is whitespace\n characterReferenceDecimalSizeMax: 7, // `&#9999999;`.\n characterReferenceHexadecimalSizeMax: 6, // `&#xff9999;`.\n characterReferenceNamedSizeMax: 31, // `&CounterClockwiseContourIntegral;`.\n codeFencedSequenceSizeMin: 3, // At least 3 ticks or tildes are needed.\n contentTypeContent: 'content',\n contentTypeDocument: 'document',\n contentTypeFlow: 'flow',\n contentTypeString: 'string',\n contentTypeText: 'text',\n hardBreakPrefixSizeMin: 2, // At least 2 trailing spaces are needed.\n htmlBasic: 6, // Symbol for `<div`\n htmlCdata: 5, // Symbol for `<![CDATA[]]>`\n htmlComment: 2, // Symbol for `<!---->`\n htmlComplete: 7, // Symbol for `<x>`\n htmlDeclaration: 4, // Symbol for `<!doctype>`\n htmlInstruction: 3, // Symbol for `<?php?>`\n htmlRawSizeMax: 8, // Length of `textarea`.\n htmlRaw: 1, // Symbol for `<script>`\n linkResourceDestinationBalanceMax: 32, // See: <https://spec.commonmark.org/0.30/#link-destination>, <https://github.com/remarkjs/react-markdown/issues/658#issuecomment-984345577>\n linkReferenceSizeMax: 999, // See: <https://spec.commonmark.org/0.30/#link-label>\n listItemValueSizeMax: 10, // See: <https://spec.commonmark.org/0.30/#ordered-list-marker>\n numericBaseDecimal: 10,\n numericBaseHexadecimal: 0x10,\n tabSize: 4, // Tabs have a hard-coded size of 4, per CommonMark.\n thematicBreakMarkerCountMin: 3, // At least 3 asterisks, dashes, or underscores are needed.\n v8MaxSafeChunkSize: 10_000 // V8 (and potentially others) have problems injecting giant arrays into other arrays, hence we operate in chunks.\n})\n","/**\n * This module is compiled away!\n *\n * Here is the list of all types of tokens exposed by micromark, with a short\n * explanation of what they include and where they are found.\n * In picking names, generally, the rule is to be as explicit as possible\n * instead of reusing names.\n * For example, there is a `definitionDestination` and a `resourceDestination`,\n * instead of one shared name.\n */\n\n// Note: when changing the next record, you must also change `TokenTypeMap`\n// in `micromark-util-types/index.d.ts`.\nexport const types = /** @type {const} */ ({\n // Generic type for data, such as in a title, a destination, etc.\n data: 'data',\n\n // Generic type for syntactic whitespace (tabs, virtual spaces, spaces).\n // Such as, between a fenced code fence and an info string.\n whitespace: 'whitespace',\n\n // Generic type for line endings (line feed, carriage return, carriage return +\n // line feed).\n lineEnding: 'lineEnding',\n\n // A line ending, but ending a blank line.\n lineEndingBlank: 'lineEndingBlank',\n\n // Generic type for whitespace (tabs, virtual spaces, spaces) at the start of a\n // line.\n linePrefix: 'linePrefix',\n\n // Generic type for whitespace (tabs, virtual spaces, spaces) at the end of a\n // line.\n lineSuffix: 'lineSuffix',\n\n // Whole ATX heading:\n //\n // ```markdown\n // #\n // ## Alpha\n // ### Bravo ###\n // ```\n //\n // Includes `atxHeadingSequence`, `whitespace`, `atxHeadingText`.\n atxHeading: 'atxHeading',\n\n // Sequence of number signs in an ATX heading (`###`).\n atxHeadingSequence: 'atxHeadingSequence',\n\n // Content in an ATX heading (`alpha`).\n // Includes text.\n atxHeadingText: 'atxHeadingText',\n\n // Whole autolink (`<https://example.com>` or `<admin@example.com>`)\n // Includes `autolinkMarker` and `autolinkProtocol` or `autolinkEmail`.\n autolink: 'autolink',\n\n // Email autolink w/o markers (`admin@example.com`)\n autolinkEmail: 'autolinkEmail',\n\n // Marker around an `autolinkProtocol` or `autolinkEmail` (`<` or `>`).\n autolinkMarker: 'autolinkMarker',\n\n // Protocol autolink w/o markers (`https://example.com`)\n autolinkProtocol: 'autolinkProtocol',\n\n // A whole character escape (`\\-`).\n // Includes `escapeMarker` and `characterEscapeValue`.\n characterEscape: 'characterEscape',\n\n // The escaped character (`-`).\n characterEscapeValue: 'characterEscapeValue',\n\n // A whole character reference (`&amp;`, `&#8800;`, or `&#x1D306;`).\n // Includes `characterReferenceMarker`, an optional\n // `characterReferenceMarkerNumeric`, in which case an optional\n // `characterReferenceMarkerHexadecimal`, and a `characterReferenceValue`.\n characterReference: 'characterReference',\n\n // The start or end marker (`&` or `;`).\n characterReferenceMarker: 'characterReferenceMarker',\n\n // Mark reference as numeric (`#`).\n characterReferenceMarkerNumeric: 'characterReferenceMarkerNumeric',\n\n // Mark reference as numeric (`x` or `X`).\n characterReferenceMarkerHexadecimal: 'characterReferenceMarkerHexadecimal',\n\n // Value of character reference w/o markers (`amp`, `8800`, or `1D306`).\n characterReferenceValue: 'characterReferenceValue',\n\n // Whole fenced code:\n //\n // ````markdown\n // ```js\n // alert(1)\n // ```\n // ````\n codeFenced: 'codeFenced',\n\n // A fenced code fence, including whitespace, sequence, info, and meta\n // (` ```js `).\n codeFencedFence: 'codeFencedFence',\n\n // Sequence of grave accent or tilde characters (` ``` `) in a fence.\n codeFencedFenceSequence: 'codeFencedFenceSequence',\n\n // Info word (`js`) in a fence.\n // Includes string.\n codeFencedFenceInfo: 'codeFencedFenceInfo',\n\n // Meta words (`highlight=\"1\"`) in a fence.\n // Includes string.\n codeFencedFenceMeta: 'codeFencedFenceMeta',\n\n // A line of code.\n codeFlowValue: 'codeFlowValue',\n\n // Whole indented code:\n //\n // ```markdown\n // alert(1)\n // ```\n //\n // Includes `lineEnding`, `linePrefix`, and `codeFlowValue`.\n codeIndented: 'codeIndented',\n\n // A text code (``` `alpha` ```).\n // Includes `codeTextSequence`, `codeTextData`, `lineEnding`, and can include\n // `codeTextPadding`.\n codeText: 'codeText',\n\n codeTextData: 'codeTextData',\n\n // A space or line ending right after or before a tick.\n codeTextPadding: 'codeTextPadding',\n\n // A text code fence (` `` `).\n codeTextSequence: 'codeTextSequence',\n\n // Whole content:\n //\n // ```markdown\n // [a]: b\n // c\n // =\n // d\n // ```\n //\n // Includes `paragraph` and `definition`.\n content: 'content',\n // Whole definition:\n //\n // ```markdown\n // [micromark]: https://github.com/micromark/micromark\n // ```\n //\n // Includes `definitionLabel`, `definitionMarker`, `whitespace`,\n // `definitionDestination`, and optionally `lineEnding` and `definitionTitle`.\n definition: 'definition',\n\n // Destination of a definition (`https://github.com/micromark/micromark` or\n // `<https://github.com/micromark/micromark>`).\n // Includes `definitionDestinationLiteral` or `definitionDestinationRaw`.\n definitionDestination: 'definitionDestination',\n\n // Enclosed destination of a definition\n // (`<https://github.com/micromark/micromark>`).\n // Includes `definitionDestinationLiteralMarker` and optionally\n // `definitionDestinationString`.\n definitionDestinationLiteral: 'definitionDestinationLiteral',\n\n // Markers of an enclosed definition destination (`<` or `>`).\n definitionDestinationLiteralMarker: 'definitionDestinationLiteralMarker',\n\n // Unenclosed destination of a definition\n // (`https://github.com/micromark/micromark`).\n // Includes `definitionDestinationString`.\n definitionDestinationRaw: 'definitionDestinationRaw',\n\n // Text in an destination (`https://github.com/micromark/micromark`).\n // Includes string.\n definitionDestinationString: 'definitionDestinationString',\n\n // Label of a definition (`[micromark]`).\n // Includes `definitionLabelMarker` and `definitionLabelString`.\n definitionLabel: 'definitionLabel',\n\n // Markers of a definition label (`[` or `]`).\n definitionLabelMarker: 'definitionLabelMarker',\n\n // Value of a definition label (`micromark`).\n // Includes string.\n definitionLabelString: 'definitionLabelString',\n\n // Marker between a label and a destination (`:`).\n definitionMarker: 'definitionMarker',\n\n // Title of a definition (`\"x\"`, `'y'`, or `(z)`).\n // Includes `definitionTitleMarker` and optionally `definitionTitleString`.\n definitionTitle: 'definitionTitle',\n\n // Marker around a title of a definition (`\"`, `'`, `(`, or `)`).\n definitionTitleMarker: 'definitionTitleMarker',\n\n // Data without markers in a title (`z`).\n // Includes string.\n definitionTitleString: 'definitionTitleString',\n\n // Emphasis (`*alpha*`).\n // Includes `emphasisSequence` and `emphasisText`.\n emphasis: 'emphasis',\n\n // Sequence of emphasis markers (`*` or `_`).\n emphasisSequence: 'emphasisSequence',\n\n // Emphasis text (`alpha`).\n // Includes text.\n emphasisText: 'emphasisText',\n\n // The character escape marker (`\\`).\n escapeMarker: 'escapeMarker',\n\n // A hard break created with a backslash (`\\\\n`).\n // Note: does not include the line ending.\n hardBreakEscape: 'hardBreakEscape',\n\n // A hard break created with trailing spaces (` \\n`).\n // Does not include the line ending.\n hardBreakTrailing: 'hardBreakTrailing',\n\n // Flow HTML:\n //\n // ```markdown\n // <div\n // ```\n //\n // Inlcudes `lineEnding`, `htmlFlowData`.\n htmlFlow: 'htmlFlow',\n\n htmlFlowData: 'htmlFlowData',\n\n // HTML in text (the tag in `a <i> b`).\n // Includes `lineEnding`, `htmlTextData`.\n htmlText: 'htmlText',\n\n htmlTextData: 'htmlTextData',\n\n // Whole image (`![alpha](bravo)`, `![alpha][bravo]`, `![alpha][]`, or\n // `![alpha]`).\n // Includes `label` and an optional `resource` or `reference`.\n image: 'image',\n\n // Whole link label (`[*alpha*]`).\n // Includes `labelLink` or `labelImage`, `labelText`, and `labelEnd`.\n label: 'label',\n\n // Text in an label (`*alpha*`).\n // Includes text.\n labelText: 'labelText',\n\n // Start a link label (`[`).\n // Includes a `labelMarker`.\n labelLink: 'labelLink',\n\n // Start an image label (`![`).\n // Includes `labelImageMarker` and `labelMarker`.\n labelImage: 'labelImage',\n\n // Marker of a label (`[` or `]`).\n labelMarker: 'labelMarker',\n\n // Marker to start an image (`!`).\n labelImageMarker: 'labelImageMarker',\n\n // End a label (`]`).\n // Includes `labelMarker`.\n labelEnd: 'labelEnd',\n\n // Whole link (`[alpha](bravo)`, `[alpha][bravo]`, `[alpha][]`, or `[alpha]`).\n // Includes `label` and an optional `resource` or `reference`.\n link: 'link',\n\n // Whole paragraph:\n //\n // ```markdown\n // alpha\n // bravo.\n // ```\n //\n // Includes text.\n paragraph: 'paragraph',\n\n // A reference (`[alpha]` or `[]`).\n // Includes `referenceMarker` and an optional `referenceString`.\n reference: 'reference',\n\n // A reference marker (`[` or `]`).\n referenceMarker: 'referenceMarker',\n\n // Reference text (`alpha`).\n // Includes string.\n referenceString: 'referenceString',\n\n // A resource (`(https://example.com \"alpha\")`).\n // Includes `resourceMarker`, an optional `resourceDestination` with an optional\n // `whitespace` and `resourceTitle`.\n resource: 'resource',\n\n // A resource destination (`https://example.com`).\n // Includes `resourceDestinationLiteral` or `resourceDestinationRaw`.\n resourceDestination: 'resourceDestination',\n\n // A literal resource destination (`<https://example.com>`).\n // Includes `resourceDestinationLiteralMarker` and optionally\n // `resourceDestinationString`.\n resourceDestinationLiteral: 'resourceDestinationLiteral',\n\n // A resource destination marker (`<` or `>`).\n resourceDestinationLiteralMarker: 'resourceDestinationLiteralMarker',\n\n // A raw resource destination (`https://example.com`).\n // Includes `resourceDestinationString`.\n resourceDestinationRaw: 'resourceDestinationRaw',\n\n // Resource destination text (`https://example.com`).\n // Includes string.\n resourceDestinationString: 'resourceDestinationString',\n\n // A resource marker (`(` or `)`).\n resourceMarker: 'resourceMarker',\n\n // A resource title (`\"alpha\"`, `'alpha'`, or `(alpha)`).\n // Includes `resourceTitleMarker` and optionally `resourceTitleString`.\n resourceTitle: 'resourceTitle',\n\n // A resource title marker (`\"`, `'`, `(`, or `)`).\n resourceTitleMarker: 'resourceTitleMarker',\n\n // Resource destination title (`alpha`).\n // Includes string.\n resourceTitleString: 'resourceTitleString',\n\n // Whole setext heading:\n //\n // ```markdown\n // alpha\n // bravo\n // =====\n // ```\n //\n // Includes `setextHeadingText`, `lineEnding`, `linePrefix`, and\n // `setextHeadingLine`.\n setextHeading: 'setextHeading',\n\n // Content in a setext heading (`alpha\\nbravo`).\n // Includes text.\n setextHeadingText: 'setextHeadingText',\n\n // Underline in a setext heading, including whitespace suffix (`==`).\n // Includes `setextHeadingLineSequence`.\n setextHeadingLine: 'setextHeadingLine',\n\n // Sequence of equals or dash characters in underline in a setext heading (`-`).\n setextHeadingLineSequence: 'setextHeadingLineSequence',\n\n // Strong (`**alpha**`).\n // Includes `strongSequence` and `strongText`.\n strong: 'strong',\n\n // Sequence of strong markers (`**` or `__`).\n strongSequence: 'strongSequence',\n\n // Strong text (`alpha`).\n // Includes text.\n strongText: 'strongText',\n\n // Whole thematic break:\n //\n // ```markdown\n // * * *\n // ```\n //\n // Includes `thematicBreakSequence` and `whitespace`.\n thematicBreak: 'thematicBreak',\n\n // A sequence of one or more thematic break markers (`***`).\n thematicBreakSequence: 'thematicBreakSequence',\n\n // Whole block quote:\n //\n // ```markdown\n // > a\n // >\n // > b\n // ```\n //\n // Includes `blockQuotePrefix` and flow.\n blockQuote: 'blockQuote',\n // The `>` or `> ` of a block quote.\n blockQuotePrefix: 'blockQuotePrefix',\n // The `>` of a block quote prefix.\n blockQuoteMarker: 'blockQuoteMarker',\n // The optional ` ` of a block quote prefix.\n blockQuotePrefixWhitespace: 'blockQuotePrefixWhitespace',\n\n // Whole ordered list:\n //\n // ```markdown\n // 1. a\n // b\n // ```\n //\n // Includes `listItemPrefix`, flow, and optionally `listItemIndent` on further\n // lines.\n listOrdered: 'listOrdered',\n\n // Whole unordered list:\n //\n // ```markdown\n // - a\n // b\n // ```\n //\n // Includes `listItemPrefix`, flow, and optionally `listItemIndent` on further\n // lines.\n listUnordered: 'listUnordered',\n\n // The indent of further list item lines.\n listItemIndent: 'listItemIndent',\n\n // A marker, as in, `*`, `+`, `-`, `.`, or `)`.\n listItemMarker: 'listItemMarker',\n\n // The thing that starts a list item, such as `1. `.\n // Includes `listItemValue` if ordered, `listItemMarker`, and\n // `listItemPrefixWhitespace` (unless followed by a line ending).\n listItemPrefix: 'listItemPrefix',\n\n // The whitespace after a marker.\n listItemPrefixWhitespace: 'listItemPrefixWhitespace',\n\n // The numerical value of an ordered item.\n listItemValue: 'listItemValue',\n\n // Internal types used for subtokenizers, compiled away\n chunkDocument: 'chunkDocument',\n chunkContent: 'chunkContent',\n chunkFlow: 'chunkFlow',\n chunkText: 'chunkText',\n chunkString: 'chunkString'\n})\n","var __defProp = Object.defineProperty;\nvar __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;\nvar __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== \"symbol\" ? key + \"\" : key, value);\n\n// src/categoryUtil.ts\nimport { constants as constants2 } from \"micromark-util-symbol\";\n\n// src/classifyCharacter.ts\nimport { markdownLineEndingOrSpace } from \"micromark-util-character\";\nimport { codes, constants } from \"micromark-util-symbol\";\n\n// src/characterWithNonBmp.ts\nimport { eastAsianWidthType } from \"get-east-asian-width\";\nfunction isEmoji(uc) {\n return /^\\p{Emoji_Presentation}/u.test(String.fromCodePoint(uc));\n}\nfunction cjkOrIvs(uc) {\n if (!uc || uc < 4352) {\n return false;\n }\n const eaw = eastAsianWidthType(uc);\n switch (eaw) {\n case \"fullwidth\":\n case \"halfwidth\":\n return true;\n // never be emoji\n case \"wide\":\n return !isEmoji(uc);\n case \"narrow\":\n return false;\n case \"ambiguous\":\n return 917760 <= uc && uc <= 917999 ? null : false;\n case \"neutral\":\n return /^\\p{sc=Hangul}/u.test(String.fromCodePoint(uc));\n }\n}\nfunction isCjkAmbiguousPunctuation(main, vs) {\n if (vs !== 65025 || !main || main < 8216) return false;\n return main === 8216 || main === 8217 || main === 8220 || main === 8221;\n}\nfunction nonEmojiGeneralUseVS(code) {\n return code !== null && code >= 65024 && code <= 65038;\n}\nvar unicodePunctuation = regexCheck(/\\p{P}|\\p{S}/u);\nvar unicodeWhitespace = regexCheck(/\\s/);\nfunction regexCheck(regex) {\n return check;\n function check(code) {\n return code !== null && code > -1 && regex.test(String.fromCodePoint(code));\n }\n}\n\n// src/classifyCharacter.ts\nvar constantsEx;\n((constantsEx2) => {\n constantsEx2.spaceOrPunctuation = 3;\n constantsEx2.cjk = 4096;\n constantsEx2.cjkPunctuation = 4098;\n constantsEx2.ivs = 8192;\n constantsEx2.cjkOrIvs = 12288;\n constantsEx2.nonEmojiGeneralUseVS = 16384;\n constantsEx2.variationSelector = 24576;\n constantsEx2.ivsToCjkRightShift = 1;\n})(constantsEx || (constantsEx = {}));\nfunction classifyCharacter(code) {\n if (code === codes.eof || markdownLineEndingOrSpace(code) || unicodeWhitespace(code)) {\n return constants.characterGroupWhitespace;\n }\n let value = 0;\n if (code >= 4352) {\n if (nonEmojiGeneralUseVS(code)) {\n return constantsEx.nonEmojiGeneralUseVS;\n }\n switch (cjkOrIvs(code)) {\n case null:\n return constantsEx.ivs;\n case true:\n value |= constantsEx.cjk;\n break;\n }\n }\n if (unicodePunctuation(code)) {\n value |= constants.characterGroupPunctuation;\n }\n return value;\n}\nfunction classifyPrecedingCharacter(before, get2Previous, previous) {\n if (!isNonEmojiGeneralUseVS(before)) {\n return before;\n }\n const twoPrevious = get2Previous();\n const twoBefore = classifyCharacter(twoPrevious);\n return !twoPrevious || isUnicodeWhitespace(twoBefore) ? before : isCjkAmbiguousPunctuation(twoPrevious, previous) ? constantsEx.cjkPunctuation : stripIvs(twoBefore);\n}\nfunction stripIvs(twoBefore) {\n return twoBefore & ~constantsEx.ivs;\n}\n\n// src/categoryUtil.ts\nfunction isUnicodeWhitespace(category) {\n return Boolean(category & constants2.characterGroupWhitespace);\n}\nfunction isNonCjkPunctuation(category) {\n return (category & constantsEx.cjkPunctuation) === constants2.characterGroupPunctuation;\n}\nfunction isCjk(category) {\n return Boolean(category & constantsEx.cjk);\n}\nfunction isIvs(category) {\n return category === constantsEx.ivs;\n}\nfunction isCjkOrIvs(category) {\n return Boolean(category & constantsEx.cjkOrIvs);\n}\nfunction isNonEmojiGeneralUseVS(category) {\n return category === constantsEx.nonEmojiGeneralUseVS;\n}\nfunction isSpaceOrPunctuation(category) {\n return Boolean(category & constantsEx.spaceOrPunctuation);\n}\n\n// src/codeUtil.ts\nfunction isCodeHighSurrogate(code) {\n return Boolean(code && code >= 55296 && code <= 56319);\n}\nfunction isCodeLowSurrogate(code) {\n return Boolean(code && code >= 56320 && code <= 57343);\n}\nfunction tryGetGenuinePreviousCode(code, nowPoint, sliceSerialize) {\n if (nowPoint._bufferIndex < 2) {\n return code;\n }\n const previousBuffer = sliceSerialize({\n // take 2 characters (code units)\n start: { ...nowPoint, _bufferIndex: nowPoint._bufferIndex - 2 },\n end: nowPoint\n });\n const previousCandidate = previousBuffer.codePointAt(0);\n return previousCandidate && previousCandidate >= 65536 ? previousCandidate : code;\n}\nfunction tryGetCodeTwoBefore(previousCode, nowPoint, sliceSerialize) {\n const previousWidth = previousCode >= 65536 ? 2 : 1;\n if (nowPoint._bufferIndex < 1 + previousWidth) {\n return null;\n }\n const idealStart = nowPoint._bufferIndex - previousWidth - 2;\n const twoPreviousBuffer = sliceSerialize({\n // take 1--2 character\n start: {\n ...nowPoint,\n _bufferIndex: idealStart >= 0 ? idealStart : 0\n },\n end: {\n ...nowPoint,\n _bufferIndex: nowPoint._bufferIndex - previousWidth\n }\n });\n const twoPreviousLast = twoPreviousBuffer.charCodeAt(\n twoPreviousBuffer.length - 1\n );\n if (Number.isNaN(twoPreviousLast)) {\n return null;\n }\n if (twoPreviousBuffer.length < 2 || twoPreviousLast < 56320 || 57343 < twoPreviousLast) {\n return twoPreviousLast;\n }\n const twoPreviousCandidate = twoPreviousBuffer.codePointAt(0);\n if (twoPreviousCandidate && twoPreviousCandidate >= 65536) {\n return twoPreviousCandidate;\n }\n return twoPreviousLast;\n}\nvar TwoPreviousCode = class {\n /**\n * @see {@link tryGetCodeTwoBefore}\n *\n * @param previousCode a previous code point. Should be greater than 65,535 if it represents a [Supplementary Character](https://www.unicode.org/glossary/#supplementary_character).\n * @param nowPoint `this.now()` (`this` = `TokenizeContext`)\n * @param sliceSerialize `this.sliceSerialize` (`this` = `TokenizeContext`)\n */\n constructor(previousCode, nowPoint, sliceSerialize) {\n this.previousCode = previousCode;\n this.nowPoint = nowPoint;\n this.sliceSerialize = sliceSerialize;\n __publicField(this, \"cachedValue\");\n }\n /**\n * Returns the return value of {@link tryGetCodeTwoBefore}.\n *\n * If the value has not been computed yet, it will be computed and cached.\n *\n * @see {@link tryGetCodeTwoBefore}\n *\n * @returns a value greater than 65,535 if the code point two positions before represents a [Supplementary Character](https://www.unicode.org/glossary/#supplementary_character), a value less than 65,536 for a [BMP Character](https://www.unicode.org/glossary/#bmp_character), or `null` if not found\n */\n value() {\n if (this.cachedValue === void 0) {\n this.cachedValue = tryGetCodeTwoBefore(\n this.previousCode,\n this.nowPoint,\n this.sliceSerialize\n );\n }\n return this.cachedValue;\n }\n};\nfunction tryGetGenuineNextCode(code, nowPoint, sliceSerialize) {\n const nextCandidate = sliceSerialize({\n start: nowPoint,\n end: { ...nowPoint, _bufferIndex: nowPoint._bufferIndex + 2 }\n }).codePointAt(0);\n return nextCandidate && nextCandidate >= 65536 ? nextCandidate : code;\n}\nexport {\n TwoPreviousCode,\n classifyCharacter,\n classifyPrecedingCharacter,\n constantsEx,\n isCjk,\n isCjkOrIvs,\n isCodeHighSurrogate,\n isCodeLowSurrogate,\n isIvs,\n isNonCjkPunctuation,\n isNonEmojiGeneralUseVS,\n isSpaceOrPunctuation,\n isUnicodeWhitespace,\n tryGetCodeTwoBefore,\n tryGetGenuineNextCode,\n tryGetGenuinePreviousCode\n};\n","import {getCategory, isAmbiguous, isFullWidth, isWide} from './lookup.js';\n\nfunction validate(codePoint) {\n\tif (!Number.isSafeInteger(codePoint)) {\n\t\tthrow new TypeError(`Expected a code point, got \\`${typeof codePoint}\\`.`);\n\t}\n}\n\nexport function eastAsianWidthType(codePoint) {\n\tvalidate(codePoint);\n\n\treturn getCategory(codePoint);\n}\n\nexport function eastAsianWidth(codePoint, {ambiguousAsWide = false} = {}) {\n\tvalidate(codePoint);\n\n\tif (\n\t\tisFullWidth(codePoint)\n\t\t|| isWide(codePoint)\n\t\t|| (ambiguousAsWide && isAmbiguous(codePoint))\n\t) {\n\t\treturn 2;\n\t}\n\n\treturn 1;\n}\n\n// Private exports for https://github.com/sindresorhus/is-fullwidth-code-point\nexport {isFullWidth as _isFullWidth, isWide as _isWide} from './lookup.js';\n","// Generated code.\n\nfunction isAmbiguous(x) {\n\treturn x === 0xA1\n\t\t|| x === 0xA4\n\t\t|| x === 0xA7\n\t\t|| x === 0xA8\n\t\t|| x === 0xAA\n\t\t|| x === 0xAD\n\t\t|| x === 0xAE\n\t\t|| x >= 0xB0 && x <= 0xB4\n\t\t|| x >= 0xB6 && x <= 0xBA\n\t\t|| x >= 0xBC && x <= 0xBF\n\t\t|| x === 0xC6\n\t\t|| x === 0xD0\n\t\t|| x === 0xD7\n\t\t|| x === 0xD8\n\t\t|| x >= 0xDE && x <= 0xE1\n\t\t|| x === 0xE6\n\t\t|| x >= 0xE8 && x <= 0xEA\n\t\t|| x === 0xEC\n\t\t|| x === 0xED\n\t\t|| x === 0xF0\n\t\t|| x === 0xF2\n\t\t|| x === 0xF3\n\t\t|| x >= 0xF7 && x <= 0xFA\n\t\t|| x === 0xFC\n\t\t|| x === 0xFE\n\t\t|| x === 0x101\n\t\t|| x === 0x111\n\t\t|| x === 0x113\n\t\t|| x === 0x11B\n\t\t|| x === 0x126\n\t\t|| x === 0x127\n\t\t|| x === 0x12B\n\t\t|| x >= 0x131 && x <= 0x133\n\t\t|| x === 0x138\n\t\t|| x >= 0x13F && x <= 0x142\n\t\t|| x === 0x144\n\t\t|| x >= 0x148 && x <= 0x14B\n\t\t|| x === 0x14D\n\t\t|| x === 0x152\n\t\t|| x === 0x153\n\t\t|| x === 0x166\n\t\t|| x === 0x167\n\t\t|| x === 0x16B\n\t\t|| x === 0x1CE\n\t\t|| x === 0x1D0\n\t\t|| x === 0x1D2\n\t\t|| x === 0x1D4\n\t\t|| x === 0x1D6\n\t\t|| x === 0x1D8\n\t\t|| x === 0x1DA\n\t\t|| x === 0x1DC\n\t\t|| x === 0x251\n\t\t|| x === 0x261\n\t\t|| x === 0x2C4\n\t\t|| x === 0x2C7\n\t\t|| x >= 0x2C9 && x <= 0x2CB\n\t\t|| x === 0x2CD\n\t\t|| x === 0x2D0\n\t\t|| x >= 0x2D8 && x <= 0x2DB\n\t\t|| x === 0x2DD\n\t\t|| x === 0x2DF\n\t\t|| x >= 0x300 && x <= 0x36F\n\t\t|| x >= 0x391 && x <= 0x3A1\n\t\t|| x >= 0x3A3 && x <= 0x3A9\n\t\t|| x >= 0x3B1 && x <= 0x3C1\n\t\t|| x >= 0x3C3 && x <= 0x3C9\n\t\t|| x === 0x401\n\t\t|| x >= 0x410 && x <= 0x44F\n\t\t|| x === 0x451\n\t\t|| x === 0x2010\n\t\t|| x >= 0x2013 && x <= 0x2016\n\t\t|| x === 0x2018\n\t\t|| x === 0x2019\n\t\t|| x === 0x201C\n\t\t|| x === 0x201D\n\t\t|| x >= 0x2020 && x <= 0x2022\n\t\t|| x >= 0x2024 && x <= 0x2027\n\t\t|| x === 0x2030\n\t\t|| x === 0x2032\n\t\t|| x === 0x2033\n\t\t|| x === 0x2035\n\t\t|| x === 0x203B\n\t\t|| x === 0x203E\n\t\t|| x === 0x2074\n\t\t|| x === 0x207F\n\t\t|| x >= 0x2081 && x <= 0x2084\n\t\t|| x === 0x20AC\n\t\t|| x === 0x2103\n\t\t|| x === 0x2105\n\t\t|| x === 0x2109\n\t\t|| x === 0x2113\n\t\t|| x === 0x2116\n\t\t|| x === 0x2121\n\t\t|| x === 0x2122\n\t\t|| x === 0x2126\n\t\t|| x === 0x212B\n\t\t|| x === 0x2153\n\t\t|| x === 0x2154\n\t\t|| x >= 0x215B && x <= 0x215E\n\t\t|| x >= 0x2160 && x <= 0x216B\n\t\t|| x >= 0x2170 && x <= 0x2179\n\t\t|| x === 0x2189\n\t\t|| x >= 0x2190 && x <= 0x2199\n\t\t|| x === 0x21B8\n\t\t|| x === 0x21B9\n\t\t|| x === 0x21D2\n\t\t|| x === 0x21D4\n\t\t|| x === 0x21E7\n\t\t|| x === 0x2200\n\t\t|| x === 0x2202\n\t\t|| x === 0x2203\n\t\t|| x === 0x2207\n\t\t|| x === 0x2208\n\t\t|| x === 0x220B\n\t\t|| x === 0x220F\n\t\t|| x === 0x2211\n\t\t|| x === 0x2215\n\t\t|| x === 0x221A\n\t\t|| x >= 0x221D && x <= 0x2220\n\t\t|| x === 0x2223\n\t\t|| x === 0x2225\n\t\t|| x >= 0x2227 && x <= 0x222C\n\t\t|| x === 0x222E\n\t\t|| x >= 0x2234 && x <= 0x2237\n\t\t|| x === 0x223C\n\t\t|| x === 0x223D\n\t\t|| x === 0x2248\n\t\t|| x === 0x224C\n\t\t|| x === 0x2252\n\t\t|| x === 0x2260\n\t\t|| x === 0x2261\n\t\t|| x >= 0x2264 && x <= 0x2267\n\t\t|| x === 0x226A\n\t\t|| x === 0x226B\n\t\t|| x === 0x226E\n\t\t|| x === 0x226F\n\t\t|| x === 0x2282\n\t\t|| x === 0x2283\n\t\t|| x === 0x2286\n\t\t|| x === 0x2287\n\t\t|| x === 0x2295\n\t\t|| x === 0x2299\n\t\t|| x === 0x22A5\n\t\t|| x === 0x22BF\n\t\t|| x === 0x2312\n\t\t|| x >= 0x2460 && x <= 0x24E9\n\t\t|| x >= 0x24EB && x <= 0x254B\n\t\t|| x >= 0x2550 && x <= 0x2573\n\t\t|| x >= 0x2580 && x <= 0x258F\n\t\t|| x >= 0x2592 && x <= 0x2595\n\t\t|| x === 0x25A0\n\t\t|| x === 0x25A1\n\t\t|| x >= 0x25A3 && x <= 0x25A9\n\t\t|| x === 0x25B2\n\t\t|| x === 0x25B3\n\t\t|| x === 0x25B6\n\t\t|| x === 0x25B7\n\t\t|| x === 0x25BC\n\t\t|| x === 0x25BD\n\t\t|| x === 0x25C0\n\t\t|| x === 0x25C1\n\t\t|| x >= 0x25C6 && x <= 0x25C8\n\t\t|| x === 0x25CB\n\t\t|| x >= 0x25CE && x <= 0x25D1\n\t\t|| x >= 0x25E2 && x <= 0x25E5\n\t\t|| x === 0x25EF\n\t\t|| x === 0x2605\n\t\t|| x === 0x2606\n\t\t|| x === 0x2609\n\t\t|| x === 0x260E\n\t\t|| x === 0x260F\n\t\t|| x === 0x261C\n\t\t|| x === 0x261E\n\t\t|| x === 0x2640\n\t\t|| x === 0x2642\n\t\t|| x === 0x2660\n\t\t|| x === 0x2661\n\t\t|| x >= 0x2663 && x <= 0x2665\n\t\t|| x >= 0x2667 && x <= 0x266A\n\t\t|| x === 0x266C\n\t\t|| x === 0x266D\n\t\t|| x === 0x266F\n\t\t|| x === 0x269E\n\t\t|| x === 0x269F\n\t\t|| x === 0x26BF\n\t\t|| x >= 0x26C6 && x <= 0x26CD\n\t\t|| x >= 0x26CF && x <= 0x26D3\n\t\t|| x >= 0x26D5 && x <= 0x26E1\n\t\t|| x === 0x26E3\n\t\t|| x === 0x26E8\n\t\t|| x === 0x26E9\n\t\t|| x >= 0x26EB && x <= 0x26F1\n\t\t|| x === 0x26F4\n\t\t|| x >= 0x26F6 && x <= 0x26F9\n\t\t|| x === 0x26FB\n\t\t|| x === 0x26FC\n\t\t|| x === 0x26FE\n\t\t|| x === 0x26FF\n\t\t|| x === 0x273D\n\t\t|| x >= 0x2776 && x <= 0x277F\n\t\t|| x >= 0x2B56 && x <= 0x2B59\n\t\t|| x >= 0x3248 && x <= 0x324F\n\t\t|| x >= 0xE000 && x <= 0xF8FF\n\t\t|| x >= 0xFE00 && x <= 0xFE0F\n\t\t|| x === 0xFFFD\n\t\t|| x >= 0x1F100 && x <= 0x1F10A\n\t\t|| x >= 0x1F110 && x <= 0x1F12D\n\t\t|| x >= 0x1F130 && x <= 0x1F169\n\t\t|| x >= 0x1F170 && x <= 0x1F18D\n\t\t|| x === 0x1F18F\n\t\t|| x === 0x1F190\n\t\t|| x >= 0x1F19B && x <= 0x1F1AC\n\t\t|| x >= 0xE0100 && x <= 0xE01EF\n\t\t|| x >= 0xF0000 && x <= 0xFFFFD\n\t\t|| x >= 0x100000 && x <= 0x10FFFD;\n}\n\nfunction isFullWidth(x) {\n\treturn x === 0x3000\n\t\t|| x >= 0xFF01 && x <= 0xFF60\n\t\t|| x >= 0xFFE0 && x <= 0xFFE6;\n}\n\nfunction isWide(x) {\n\treturn x >= 0x1100 && x <= 0x115F\n\t\t|| x === 0x231A\n\t\t|| x === 0x231B\n\t\t|| x === 0x2329\n\t\t|| x === 0x232A\n\t\t|| x >= 0x23E9 && x <= 0x23EC\n\t\t|| x === 0x23F0\n\t\t|| x === 0x23F3\n\t\t|| x === 0x25FD\n\t\t|| x === 0x25FE\n\t\t|| x === 0x2614\n\t\t|| x === 0x2615\n\t\t|| x >= 0x2630 && x <= 0x2637\n\t\t|| x >= 0x2648 && x <= 0x2653\n\t\t|| x === 0x267F\n\t\t|| x >= 0x268A && x <= 0x268F\n\t\t|| x === 0x2693\n\t\t|| x === 0x26A1\n\t\t|| x === 0x26AA\n\t\t|| x === 0x26AB\n\t\t|| x === 0x26BD\n\t\t|| x === 0x26BE\n\t\t|| x === 0x26C4\n\t\t|| x === 0x26C5\n\t\t|| x === 0x26CE\n\t\t|| x === 0x26D4\n\t\t|| x === 0x26EA\n\t\t|| x === 0x26F2\n\t\t|| x === 0x26F3\n\t\t|| x === 0x26F5\n\t\t|| x === 0x26FA\n\t\t|| x === 0x26FD\n\t\t|| x === 0x2705\n\t\t|| x === 0x270A\n\t\t|| x === 0x270B\n\t\t|| x === 0x2728\n\t\t|| x === 0x274C\n\t\t|| x === 0x274E\n\t\t|| x >= 0x2753 && x <= 0x2755\n\t\t|| x === 0x2757\n\t\t|| x >= 0x2795 && x <= 0x2797\n\t\t|| x === 0x27B0\n\t\t|| x === 0x27BF\n\t\t|| x === 0x2B1B\n\t\t|| x === 0x2B1C\n\t\t|| x === 0x2B50\n\t\t|| x === 0x2B55\n\t\t|| x >= 0x2E80 && x <= 0x2E99\n\t\t|| x >= 0x2E9B && x <= 0x2EF3\n\t\t|| x >= 0x2F00 && x <= 0x2FD5\n\t\t|| x >= 0x2FF0 && x <= 0x2FFF\n\t\t|| x >= 0x3001 && x <= 0x303E\n\t\t|| x >= 0x3041 && x <= 0x3096\n\t\t|| x >= 0x3099 && x <= 0x30FF\n\t\t|| x >= 0x3105 && x <= 0x312F\n\t\t|| x >= 0x3131 && x <= 0x318E\n\t\t|| x >= 0x3190 && x <= 0x31E5\n\t\t|| x >= 0x31EF && x <= 0x321E\n\t\t|| x >= 0x3220 && x <= 0x3247\n\t\t|| x >= 0x3250 && x <= 0xA48C\n\t\t|| x >= 0xA490 && x <= 0xA4C6\n\t\t|| x >= 0xA960 && x <= 0xA97C\n\t\t|| x >= 0xAC00 && x <= 0xD7A3\n\t\t|| x >= 0xF900 && x <= 0xFAFF\n\t\t|| x >= 0xFE10 && x <= 0xFE19\n\t\t|| x >= 0xFE30 && x <= 0xFE52\n\t\t|| x >= 0xFE54 && x <= 0xFE66\n\t\t|| x >= 0xFE68 && x <= 0xFE6B\n\t\t|| x >= 0x16FE0 && x <= 0x16FE4\n\t\t|| x >= 0x16FF0 && x <= 0x16FF6\n\t\t|| x >= 0x17000 && x <= 0x18CD5\n\t\t|| x >= 0x18CFF && x <= 0x18D1E\n\t\t|| x >= 0x18D80 && x <= 0x18DF2\n\t\t|| x >= 0x1AFF0 && x <= 0x1AFF3\n\t\t|| x >= 0x1AFF5 && x <= 0x1AFFB\n\t\t|| x === 0x1AFFD\n\t\t|| x === 0x1AFFE\n\t\t|| x >= 0x1B000 && x <= 0x1B122\n\t\t|| x === 0x1B132\n\t\t|| x >= 0x1B150 && x <= 0x1B152\n\t\t|| x === 0x1B155\n\t\t|| x >= 0x1B164 && x <= 0x1B167\n\t\t|| x >= 0x1B170 && x <= 0x1B2FB\n\t\t|| x >= 0x1D300 && x <= 0x1D356\n\t\t|| x >= 0x1D360 && x <= 0x1D376\n\t\t|| x === 0x1F004\n\t\t|| x === 0x1F0CF\n\t\t|| x === 0x1F18E\n\t\t|| x >= 0x1F191 && x <= 0x1F19A\n\t\t|| x >= 0x1F200 && x <= 0x1F202\n\t\t|| x >= 0x1F210 && x <= 0x1F23B\n\t\t|| x >= 0x1F240 && x <= 0x1F248\n\t\t|| x === 0x1F250\n\t\t|| x === 0x1F251\n\t\t|| x >= 0x1F260 && x <= 0x1F265\n\t\t|| x >= 0x1F300 && x <= 0x1F320\n\t\t|| x >= 0x1F32D && x <= 0x1F335\n\t\t|| x >= 0x1F337 && x <= 0x1F37C\n\t\t|| x >= 0x1F37E && x <= 0x1F393\n\t\t|| x >= 0x1F3A0 && x <= 0x1F3CA\n\t\t|| x >= 0x1F3CF && x <= 0x1F3D3\n\t\t|| x >= 0x1F3E0 && x <= 0x1F3F0\n\t\t|| x === 0x1F3F4\n\t\t|| x >= 0x1F3F8 && x <= 0x1F43E\n\t\t|| x === 0x1F440\n\t\t|| x >= 0x1F442 && x <= 0x1F4FC\n\t\t|| x >= 0x1F4FF && x <= 0x1F53D\n\t\t|| x >= 0x1F54B && x <= 0x1F54E\n\t\t|| x >= 0x1F550 && x <= 0x1F567\n\t\t|| x === 0x1F57A\n\t\t|| x === 0x1F595\n\t\t|| x === 0x1F596\n\t\t|| x === 0x1F5A4\n\t\t|| x >= 0x1F5FB && x <= 0x1F64F\n\t\t|| x >= 0x1F680 && x <= 0x1F6C5\n\t\t|| x === 0x1F6CC\n\t\t|| x >= 0x1F6D0 && x <= 0x1F6D2\n\t\t|| x >= 0x1F6D5 && x <= 0x1F6D8\n\t\t|| x >= 0x1F6DC && x <= 0x1F6DF\n\t\t|| x === 0x1F6EB\n\t\t|| x === 0x1F6EC\n\t\t|| x >= 0x1F6F4 && x <= 0x1F6FC\n\t\t|| x >= 0x1F7E0 && x <= 0x1F7EB\n\t\t|| x === 0x1F7F0\n\t\t|| x >= 0x1F90C && x <= 0x1F93A\n\t\t|| x >= 0x1F93C && x <= 0x1F945\n\t\t|| x >= 0x1F947 && x <= 0x1F9FF\n\t\t|| x >= 0x1FA70 && x <= 0x1FA7C\n\t\t|| x >= 0x1FA80 && x <= 0x1FA8A\n\t\t|| x >= 0x1FA8E && x <= 0x1FAC6\n\t\t|| x === 0x1FAC8\n\t\t|| x >= 0x1FACD && x <= 0x1FADC\n\t\t|| x >= 0x1FADF && x <= 0x1FAEA\n\t\t|| x >= 0x1FAEF && x <= 0x1FAF8\n\t\t|| x >= 0x20000 && x <= 0x2FFFD\n\t\t|| x >= 0x30000 && x <= 0x3FFFD;\n}\n\nfunction getCategory(x) {\n\tif (isAmbiguous(x)) return 'ambiguous';\n\n\tif (isFullWidth(x)) return 'fullwidth';\n\n\tif (\n\t\tx === 0x20A9\n\t\t|| x >= 0xFF61 && x <= 0xFFBE\n\t\t|| x >= 0xFFC2 && x <= 0xFFC7\n\t\t|| x >= 0xFFCA && x <= 0xFFCF\n\t\t|| x >= 0xFFD2 && x <= 0xFFD7\n\t\t|| x >= 0xFFDA && x <= 0xFFDC\n\t\t|| x >= 0xFFE8 && x <= 0xFFEE\n\t) {\n\t\treturn 'halfwidth';\n\t}\n\n\tif (\n\t\tx >= 0x20 && x <= 0x7E\n\t\t|| x === 0xA2\n\t\t|| x === 0xA3\n\t\t|| x === 0xA5\n\t\t|| x === 0xA6\n\t\t|| x === 0xAC\n\t\t|| x === 0xAF\n\t\t|| x >= 0x27E6 && x <= 0x27ED\n\t\t|| x === 0x2985\n\t\t|| x === 0x2986\n\t) {\n\t\treturn 'narrow';\n\t}\n\n\tif (isWide(x)) return 'wide';\n\n\treturn 'neutral';\n}\n\nexport {isAmbiguous, isFullWidth, isWide, getCategory};\n","// src/index.ts\nimport {\n gfmStrikethroughCjkFriendly\n} from \"micromark-extension-cjk-friendly-gfm-strikethrough\";\nfunction remarkGfmStrikethroughCjkFriendly(options) {\n const data = this.data();\n const micromarkExtensions = (\n // biome-ignore lint/suspicious/noAssignInExpressions: base plugin (remark-gfm) already does this\n data.micromarkExtensions || (data.micromarkExtensions = [])\n );\n micromarkExtensions.push(gfmStrikethroughCjkFriendly(options));\n}\nexport {\n remarkGfmStrikethroughCjkFriendly as default\n};\n","// src/strikethrough.ts\nimport { ok as assert } from \"devlop\";\nimport {\n classifyCharacter,\n classifyPrecedingCharacter,\n isCjk,\n isCodeHighSurrogate,\n isCodeLowSurrogate,\n isIvs,\n isNonCjkPunctuation,\n isUnicodeWhitespace,\n TwoPreviousCode,\n tryGetGenuineNextCode,\n tryGetGenuinePreviousCode\n} from \"micromark-extension-cjk-friendly-util\";\nimport { splice } from \"micromark-util-chunked\";\nimport { resolveAll } from \"micromark-util-resolve-all\";\nimport { codes, constants, types } from \"micromark-util-symbol\";\nfunction gfmStrikethroughCjkFriendly(options) {\n const options_ = options || {};\n let single = options_.singleTilde;\n const tokenizer = {\n name: \"strikethrough\",\n tokenize: tokenizeStrikethrough,\n resolveAll: resolveAllStrikethrough\n };\n if (single === null || single === void 0) {\n single = true;\n }\n return {\n text: { [codes.tilde]: tokenizer },\n insideSpan: { null: [tokenizer] },\n attentionMarkers: { null: [codes.tilde] }\n };\n function resolveAllStrikethrough(events, context) {\n let index = -1;\n while (++index < events.length) {\n if (events[index][0] === \"enter\" && events[index][1].type === \"strikethroughSequenceTemporary\" && events[index][1]._close) {\n let open = index;\n while (open--) {\n if (events[open][0] === \"exit\" && events[open][1].type === \"strikethroughSequenceTemporary\" && events[open][1]._open && // If the sizes are the same:\n events[index][1].end.offset - events[index][1].start.offset === events[open][1].end.offset - events[open][1].start.offset) {\n events[index][1].type = \"strikethroughSequence\";\n events[open][1].type = \"strikethroughSequence\";\n const strikethrough = {\n type: \"strikethrough\",\n start: Object.assign({}, events[open][1].start),\n end: Object.assign({}, events[index][1].end)\n };\n const text = {\n type: \"strikethroughText\",\n start: Object.assign({}, events[open][1].end),\n end: Object.assign({}, events[index][1].start)\n };\n const nextEvents = [\n [\"enter\", strikethrough, context],\n [\"enter\", events[open][1], context],\n [\"exit\", events[open][1], context],\n [\"enter\", text, context]\n ];\n const insideSpan = context.parser.constructs.insideSpan.null;\n if (insideSpan) {\n splice(\n nextEvents,\n nextEvents.length,\n 0,\n resolveAll(insideSpan, events.slice(open + 1, index), context)\n );\n }\n splice(nextEvents, nextEvents.length, 0, [\n [\"exit\", text, context],\n [\"enter\", events[index][1], context],\n [\"exit\", events[index][1], context],\n [\"exit\", strikethrough, context]\n ]);\n splice(events, open - 1, index - open + 3, nextEvents);\n index = open + nextEvents.length - 2;\n break;\n }\n }\n }\n }\n index = -1;\n while (++index < events.length) {\n if (events[index][1].type === \"strikethroughSequenceTemporary\") {\n events[index][1].type = types.data;\n }\n }\n return events;\n }\n function tokenizeStrikethrough(effects, ok, nok) {\n const { now, sliceSerialize, previous: tentativePrevious } = this;\n const previous = isCodeLowSurrogate(tentativePrevious) ? (\n // second (lower) surrogate likely to be preceded by first (higher) surrogate\n tryGetGenuinePreviousCode(tentativePrevious, now(), sliceSerialize)\n ) : tentativePrevious;\n const before = classifyCharacter(previous);\n const twoPrevious = new TwoPreviousCode(previous, now(), sliceSerialize);\n const beforePrimary = classifyPrecedingCharacter(\n before,\n twoPrevious.value.bind(twoPrevious),\n previous\n );\n const events = this.events;\n let size = 0;\n return start;\n function start(code) {\n assert(code === codes.tilde, \"expected `~`\");\n if (previous === codes.tilde && events[events.length - 1][1].type !== types.characterEscape) {\n return nok(code);\n }\n effects.enter(\"strikethroughSequenceTemporary\");\n return more(code);\n }\n function more(code) {\n const before2 = classifyCharacter(previous);\n if (code === codes.tilde) {\n if (size > 1) return nok(code);\n effects.consume(code);\n size++;\n return more;\n }\n if (size < 2 && !single) return nok(code);\n const token = effects.exit(\"strikethroughSequenceTemporary\");\n const next = isCodeHighSurrogate(code) ? tryGetGenuineNextCode(code, now(), sliceSerialize) : code;\n const after = classifyCharacter(next);\n const beforeNonCjkPunctuation = isNonCjkPunctuation(beforePrimary);\n const beforeSpaceOrNonCjkPunctuation = beforeNonCjkPunctuation || isUnicodeWhitespace(beforePrimary);\n const afterNonCjkPunctuation = isNonCjkPunctuation(after);\n const afterSpaceOrNonCjkPunctuation = afterNonCjkPunctuation || isUnicodeWhitespace(after);\n const beforeCjkOrIvs = isCjk(beforePrimary) || isIvs(before2);\n token._open = !afterSpaceOrNonCjkPunctuation || after === constants.attentionSideAfter && (beforeSpaceOrNonCjkPunctuation || beforeCjkOrIvs);\n token._close = !beforeSpaceOrNonCjkPunctuation || before2 === constants.attentionSideAfter && (afterSpaceOrNonCjkPunctuation || isCjk(after));\n return ok(code);\n }\n }\n}\nexport {\n gfmStrikethroughCjkFriendly\n};\n","import {bundledLanguages,createHighlighter}from'shiki';var p=new Set(Object.keys(bundledLanguages)),a=new Map,h=new Map,l=new Map,H=(e,t)=>`${e}-${t[0]}-${t[1]}`,k=(e,t,n)=>{let g=e.slice(0,100),i=e.length>100?e.slice(-100):\"\";return `${t}:${n[0]}:${n[1]}:${e.length}:${g}:${i}`},b=(e,t)=>{let n=H(e,t);if(a.has(n))return a.get(n);let g=createHighlighter({themes:t,langs:[e]});return a.set(n,g),g};function f(e={}){var n;let t=(n=e.themes)!=null?n:[\"github-light\",\"github-dark\"];return {name:\"shiki\",type:\"code-highlighter\",supportsLanguage(g){return p.has(g)},getSupportedLanguages(){return Array.from(p)},getThemes(){return t},highlight({code:g,language:i,themes:r},d){let s=k(g,i,r);return h.has(s)?h.get(s):(d&&(l.has(s)||l.set(s,new Set),l.get(s).add(d)),b(i,r).then(u=>{let B=u.getLoadedLanguages().includes(i)?i:\"text\",o=u.codeToTokens(g,{lang:B,themes:{light:r[0],dark:r[1]}});h.set(s,o);let c=l.get(s);if(c){for(let L of c)L(o);l.delete(s);}}).catch(u=>{console.error(\"[Streamdown Code] Failed to highlight code:\",u),l.delete(s);}),null)}}}var R=f();export{R as code,f as createCodePlugin};","export { codeToHast, codeToHtml, codeToTokens, codeToTokensBase, codeToTokensWithThemes, createHighlighter, getLastGrammarState, getSingletonHighlighter } from './bundle-full.mjs';\nexport { createJavaScriptRegexEngine, defaultJavaScriptRegexConstructor } from '@shikijs/engine-javascript';\nexport { createOnigurumaEngine, loadWasm } from '@shikijs/engine-oniguruma';\nexport * from '@shikijs/core';\nexport { bundledLanguages, bundledLanguagesAlias, bundledLanguagesBase, bundledLanguagesInfo } from './langs.mjs';\nexport { bundledThemes, bundledThemesInfo } from './themes.mjs';\n","import { createSingletonShorthands, guessEmbeddedLanguages, createBundledHighlighter } from '@shikijs/core';\nexport * from '@shikijs/core';\nimport { bundledLanguages } from './langs.mjs';\nexport { bundledLanguagesAlias, bundledLanguagesBase, bundledLanguagesInfo } from './langs.mjs';\nimport { bundledThemes } from './themes.mjs';\nexport { bundledThemesInfo } from './themes.mjs';\nimport { createOnigurumaEngine } from '@shikijs/engine-oniguruma';\n\nconst createHighlighter = /* @__PURE__ */ createBundledHighlighter({\n langs: bundledLanguages,\n themes: bundledThemes,\n engine: () => createOnigurumaEngine(import('shiki/wasm'))\n});\nconst {\n codeToHtml,\n codeToHast,\n codeToTokens,\n codeToTokensBase,\n codeToTokensWithThemes,\n getSingletonHighlighter,\n getLastGrammarState\n} = /* @__PURE__ */ createSingletonShorthands(\n createHighlighter,\n { guessEmbeddedLanguages }\n);\n\nexport { bundledLanguages, bundledThemes, codeToHast, codeToHtml, codeToTokens, codeToTokensBase, codeToTokensWithThemes, createHighlighter, getLastGrammarState, getSingletonHighlighter };\n","import { ShikiError as ShikiError$1 } from '@shikijs/types';\nexport * from '@shikijs/types';\nimport { FontStyle, INITIAL, EncodedTokenMetadata, Registry as Registry$1, Theme } from '@shikijs/vscode-textmate';\nimport { toHtml } from 'hast-util-to-html';\n\nfunction resolveColorReplacements(theme, options) {\n const replacements = typeof theme === \"string\" ? {} : { ...theme.colorReplacements };\n const themeName = typeof theme === \"string\" ? theme : theme.name;\n for (const [key, value] of Object.entries(options?.colorReplacements || {})) {\n if (typeof value === \"string\")\n replacements[key] = value;\n else if (key === themeName)\n Object.assign(replacements, value);\n }\n return replacements;\n}\nfunction applyColorReplacements(color, replacements) {\n if (!color)\n return color;\n return replacements?.[color?.toLowerCase()] || color;\n}\n\nfunction toArray(x) {\n return Array.isArray(x) ? x : [x];\n}\nasync function normalizeGetter(p) {\n return Promise.resolve(typeof p === \"function\" ? p() : p).then((r) => r.default || r);\n}\nfunction isPlainLang(lang) {\n return !lang || [\"plaintext\", \"txt\", \"text\", \"plain\"].includes(lang);\n}\nfunction isSpecialLang(lang) {\n return lang === \"ansi\" || isPlainLang(lang);\n}\nfunction isNoneTheme(theme) {\n return theme === \"none\";\n}\nfunction isSpecialTheme(theme) {\n return isNoneTheme(theme);\n}\n\nfunction addClassToHast(node, className) {\n if (!className)\n return node;\n node.properties ||= {};\n node.properties.class ||= [];\n if (typeof node.properties.class === \"string\")\n node.properties.class = node.properties.class.split(/\\s+/g);\n if (!Array.isArray(node.properties.class))\n node.properties.class = [];\n const targets = Array.isArray(className) ? className : className.split(/\\s+/g);\n for (const c of targets) {\n if (c && !node.properties.class.includes(c))\n node.properties.class.push(c);\n }\n return node;\n}\n\nfunction splitLines(code, preserveEnding = false) {\n if (code.length === 0) {\n return [[\"\", 0]];\n }\n const parts = code.split(/(\\r?\\n)/g);\n let index = 0;\n const lines = [];\n for (let i = 0; i < parts.length; i += 2) {\n const line = preserveEnding ? parts[i] + (parts[i + 1] || \"\") : parts[i];\n lines.push([line, index]);\n index += parts[i].length;\n index += parts[i + 1]?.length || 0;\n }\n return lines;\n}\nfunction createPositionConverter(code) {\n const lines = splitLines(code, true).map(([line]) => line);\n function indexToPos(index) {\n if (index === code.length) {\n return {\n line: lines.length - 1,\n character: lines[lines.length - 1].length\n };\n }\n let character = index;\n let line = 0;\n for (const lineText of lines) {\n if (character < lineText.length)\n break;\n character -= lineText.length;\n line++;\n }\n return { line, character };\n }\n function posToIndex(line, character) {\n let index = 0;\n for (let i = 0; i < line; i++)\n index += lines[i].length;\n index += character;\n return index;\n }\n return {\n lines,\n indexToPos,\n posToIndex\n };\n}\nfunction guessEmbeddedLanguages(code, _lang, highlighter) {\n const langs = /* @__PURE__ */ new Set();\n for (const match of code.matchAll(/:?lang=[\"']([^\"']+)[\"']/g)) {\n const lang = match[1].toLowerCase().trim();\n if (lang)\n langs.add(lang);\n }\n for (const match of code.matchAll(/(?:```|~~~)([\\w-]+)/g)) {\n const lang = match[1].toLowerCase().trim();\n if (lang)\n langs.add(lang);\n }\n for (const match of code.matchAll(/\\\\begin\\{([\\w-]+)\\}/g)) {\n const lang = match[1].toLowerCase().trim();\n if (lang)\n langs.add(lang);\n }\n for (const match of code.matchAll(/<script\\s+(?:type|lang)=[\"']([^\"']+)[\"']/gi)) {\n const fullType = match[1].toLowerCase().trim();\n const lang = fullType.includes(\"/\") ? fullType.split(\"/\").pop() : fullType;\n if (lang)\n langs.add(lang);\n }\n if (!highlighter)\n return Array.from(langs);\n const bundle = highlighter.getBundledLanguages();\n return Array.from(langs).filter((l) => l && bundle[l]);\n}\n\nconst DEFAULT_COLOR_LIGHT_DARK = \"light-dark()\";\nconst COLOR_KEYS = [\"color\", \"background-color\"];\n\nfunction splitToken(token, offsets) {\n let lastOffset = 0;\n const tokens = [];\n for (const offset of offsets) {\n if (offset > lastOffset) {\n tokens.push({\n ...token,\n content: token.content.slice(lastOffset, offset),\n offset: token.offset + lastOffset\n });\n }\n lastOffset = offset;\n }\n if (lastOffset < token.content.length) {\n tokens.push({\n ...token,\n content: token.content.slice(lastOffset),\n offset: token.offset + lastOffset\n });\n }\n return tokens;\n}\nfunction splitTokens(tokens, breakpoints) {\n const sorted = Array.from(breakpoints instanceof Set ? breakpoints : new Set(breakpoints)).sort((a, b) => a - b);\n if (!sorted.length)\n return tokens;\n return tokens.map((line) => {\n return line.flatMap((token) => {\n const breakpointsInToken = sorted.filter((i) => token.offset < i && i < token.offset + token.content.length).map((i) => i - token.offset).sort((a, b) => a - b);\n if (!breakpointsInToken.length)\n return token;\n return splitToken(token, breakpointsInToken);\n });\n });\n}\nfunction flatTokenVariants(merged, variantsOrder, cssVariablePrefix, defaultColor, colorsRendering = \"css-vars\") {\n const token = {\n content: merged.content,\n explanation: merged.explanation,\n offset: merged.offset\n };\n const styles = variantsOrder.map((t) => getTokenStyleObject(merged.variants[t]));\n const styleKeys = new Set(styles.flatMap((t) => Object.keys(t)));\n const mergedStyles = {};\n const varKey = (idx, key) => {\n const keyName = key === \"color\" ? \"\" : key === \"background-color\" ? \"-bg\" : `-${key}`;\n return cssVariablePrefix + variantsOrder[idx] + (key === \"color\" ? \"\" : keyName);\n };\n styles.forEach((cur, idx) => {\n for (const key of styleKeys) {\n const value = cur[key] || \"inherit\";\n if (idx === 0 && defaultColor && COLOR_KEYS.includes(key)) {\n if (defaultColor === DEFAULT_COLOR_LIGHT_DARK && styles.length > 1) {\n const lightIndex = variantsOrder.findIndex((t) => t === \"light\");\n const darkIndex = variantsOrder.findIndex((t) => t === \"dark\");\n if (lightIndex === -1 || darkIndex === -1)\n throw new ShikiError$1('When using `defaultColor: \"light-dark()\"`, you must provide both `light` and `dark` themes');\n const lightValue = styles[lightIndex][key] || \"inherit\";\n const darkValue = styles[darkIndex][key] || \"inherit\";\n mergedStyles[key] = `light-dark(${lightValue}, ${darkValue})`;\n if (colorsRendering === \"css-vars\")\n mergedStyles[varKey(idx, key)] = value;\n } else {\n mergedStyles[key] = value;\n }\n } else {\n if (colorsRendering === \"css-vars\")\n mergedStyles[varKey(idx, key)] = value;\n }\n }\n });\n token.htmlStyle = mergedStyles;\n return token;\n}\nfunction getTokenStyleObject(token) {\n const styles = {};\n if (token.color)\n styles.color = token.color;\n if (token.bgColor)\n styles[\"background-color\"] = token.bgColor;\n if (token.fontStyle) {\n if (token.fontStyle & FontStyle.Italic)\n styles[\"font-style\"] = \"italic\";\n if (token.fontStyle & FontStyle.Bold)\n styles[\"font-weight\"] = \"bold\";\n const decorations = [];\n if (token.fontStyle & FontStyle.Underline)\n decorations.push(\"underline\");\n if (token.fontStyle & FontStyle.Strikethrough)\n decorations.push(\"line-through\");\n if (decorations.length)\n styles[\"text-decoration\"] = decorations.join(\" \");\n }\n return styles;\n}\nfunction stringifyTokenStyle(token) {\n if (typeof token === \"string\")\n return token;\n return Object.entries(token).map(([key, value]) => `${key}:${value}`).join(\";\");\n}\n\nconst _grammarStateMap = /* @__PURE__ */ new WeakMap();\nfunction setLastGrammarStateToMap(keys, state) {\n _grammarStateMap.set(keys, state);\n}\nfunction getLastGrammarStateFromMap(keys) {\n return _grammarStateMap.get(keys);\n}\nclass GrammarState {\n /**\n * Theme to Stack mapping\n */\n _stacks = {};\n lang;\n get themes() {\n return Object.keys(this._stacks);\n }\n get theme() {\n return this.themes[0];\n }\n get _stack() {\n return this._stacks[this.theme];\n }\n /**\n * Static method to create a initial grammar state.\n */\n static initial(lang, themes) {\n return new GrammarState(\n Object.fromEntries(toArray(themes).map((theme) => [theme, INITIAL])),\n lang\n );\n }\n constructor(...args) {\n if (args.length === 2) {\n const [stacksMap, lang] = args;\n this.lang = lang;\n this._stacks = stacksMap;\n } else {\n const [stack, lang, theme] = args;\n this.lang = lang;\n this._stacks = { [theme]: stack };\n }\n }\n /**\n * Get the internal stack object.\n * @internal\n */\n getInternalStack(theme = this.theme) {\n return this._stacks[theme];\n }\n getScopes(theme = this.theme) {\n return getScopes(this._stacks[theme]);\n }\n toJSON() {\n return {\n lang: this.lang,\n theme: this.theme,\n themes: this.themes,\n scopes: this.getScopes()\n };\n }\n}\nfunction getScopes(stack) {\n const scopes = [];\n const visited = /* @__PURE__ */ new Set();\n function pushScope(stack2) {\n if (visited.has(stack2))\n return;\n visited.add(stack2);\n const name = stack2?.nameScopesList?.scopeName;\n if (name)\n scopes.push(name);\n if (stack2.parent)\n pushScope(stack2.parent);\n }\n pushScope(stack);\n return scopes;\n}\nfunction getGrammarStack(state, theme) {\n if (!(state instanceof GrammarState))\n throw new ShikiError$1(\"Invalid grammar state\");\n return state.getInternalStack(theme);\n}\n\nfunction transformerDecorations() {\n const map = /* @__PURE__ */ new WeakMap();\n function getContext(shiki) {\n if (!map.has(shiki.meta)) {\n let normalizePosition = function(p) {\n if (typeof p === \"number\") {\n if (p < 0 || p > shiki.source.length)\n throw new ShikiError$1(`Invalid decoration offset: ${p}. Code length: ${shiki.source.length}`);\n return {\n ...converter.indexToPos(p),\n offset: p\n };\n } else {\n const line = converter.lines[p.line];\n if (line === void 0)\n throw new ShikiError$1(`Invalid decoration position ${JSON.stringify(p)}. Lines length: ${converter.lines.length}`);\n let character = p.character;\n if (character < 0)\n character = line.length + character;\n if (character < 0 || character > line.length)\n throw new ShikiError$1(`Invalid decoration position ${JSON.stringify(p)}. Line ${p.line} length: ${line.length}`);\n return {\n ...p,\n character,\n offset: converter.posToIndex(p.line, character)\n };\n }\n };\n const converter = createPositionConverter(shiki.source);\n const decorations = (shiki.options.decorations || []).map((d) => ({\n ...d,\n start: normalizePosition(d.start),\n end: normalizePosition(d.end)\n }));\n verifyIntersections(decorations);\n map.set(shiki.meta, {\n decorations,\n converter,\n source: shiki.source\n });\n }\n return map.get(shiki.meta);\n }\n return {\n name: \"shiki:decorations\",\n tokens(tokens) {\n if (!this.options.decorations?.length)\n return;\n const ctx = getContext(this);\n const breakpoints = ctx.decorations.flatMap((d) => [d.start.offset, d.end.offset]);\n const splitted = splitTokens(tokens, breakpoints);\n return splitted;\n },\n code(codeEl) {\n if (!this.options.decorations?.length)\n return;\n const ctx = getContext(this);\n const lines = Array.from(codeEl.children).filter((i) => i.type === \"element\" && i.tagName === \"span\");\n if (lines.length !== ctx.converter.lines.length)\n throw new ShikiError$1(`Number of lines in code element (${lines.length}) does not match the number of lines in the source (${ctx.converter.lines.length}). Failed to apply decorations.`);\n function applyLineSection(line, start, end, decoration) {\n const lineEl = lines[line];\n let text = \"\";\n let startIndex = -1;\n let endIndex = -1;\n if (start === 0)\n startIndex = 0;\n if (end === 0)\n endIndex = 0;\n if (end === Number.POSITIVE_INFINITY)\n endIndex = lineEl.children.length;\n if (startIndex === -1 || endIndex === -1) {\n for (let i = 0; i < lineEl.children.length; i++) {\n text += stringify(lineEl.children[i]);\n if (startIndex === -1 && text.length === start)\n startIndex = i + 1;\n if (endIndex === -1 && text.length === end)\n endIndex = i + 1;\n }\n }\n if (startIndex === -1)\n throw new ShikiError$1(`Failed to find start index for decoration ${JSON.stringify(decoration.start)}`);\n if (endIndex === -1)\n throw new ShikiError$1(`Failed to find end index for decoration ${JSON.stringify(decoration.end)}`);\n const children = lineEl.children.slice(startIndex, endIndex);\n if (!decoration.alwaysWrap && children.length === lineEl.children.length) {\n applyDecoration(lineEl, decoration, \"line\");\n } else if (!decoration.alwaysWrap && children.length === 1 && children[0].type === \"element\") {\n applyDecoration(children[0], decoration, \"token\");\n } else {\n const wrapper = {\n type: \"element\",\n tagName: \"span\",\n properties: {},\n children\n };\n applyDecoration(wrapper, decoration, \"wrapper\");\n lineEl.children.splice(startIndex, children.length, wrapper);\n }\n }\n function applyLine(line, decoration) {\n lines[line] = applyDecoration(lines[line], decoration, \"line\");\n }\n function applyDecoration(el, decoration, type) {\n const properties = decoration.properties || {};\n const transform = decoration.transform || ((i) => i);\n el.tagName = decoration.tagName || \"span\";\n el.properties = {\n ...el.properties,\n ...properties,\n class: el.properties.class\n };\n if (decoration.properties?.class)\n addClassToHast(el, decoration.properties.class);\n el = transform(el, type) || el;\n return el;\n }\n const lineApplies = [];\n const sorted = ctx.decorations.sort((a, b) => b.start.offset - a.start.offset || a.end.offset - b.end.offset);\n for (const decoration of sorted) {\n const { start, end } = decoration;\n if (start.line === end.line) {\n applyLineSection(start.line, start.character, end.character, decoration);\n } else if (start.line < end.line) {\n applyLineSection(start.line, start.character, Number.POSITIVE_INFINITY, decoration);\n for (let i = start.line + 1; i < end.line; i++)\n lineApplies.unshift(() => applyLine(i, decoration));\n applyLineSection(end.line, 0, end.character, decoration);\n }\n }\n lineApplies.forEach((i) => i());\n }\n };\n}\nfunction verifyIntersections(items) {\n for (let i = 0; i < items.length; i++) {\n const foo = items[i];\n if (foo.start.offset > foo.end.offset)\n throw new ShikiError$1(`Invalid decoration range: ${JSON.stringify(foo.start)} - ${JSON.stringify(foo.end)}`);\n for (let j = i + 1; j < items.length; j++) {\n const bar = items[j];\n const isFooHasBarStart = foo.start.offset <= bar.start.offset && bar.start.offset < foo.end.offset;\n const isFooHasBarEnd = foo.start.offset < bar.end.offset && bar.end.offset <= foo.end.offset;\n const isBarHasFooStart = bar.start.offset <= foo.start.offset && foo.start.offset < bar.end.offset;\n const isBarHasFooEnd = bar.start.offset < foo.end.offset && foo.end.offset <= bar.end.offset;\n if (isFooHasBarStart || isFooHasBarEnd || isBarHasFooStart || isBarHasFooEnd) {\n if (isFooHasBarStart && isFooHasBarEnd)\n continue;\n if (isBarHasFooStart && isBarHasFooEnd)\n continue;\n if (isBarHasFooStart && foo.start.offset === foo.end.offset)\n continue;\n if (isFooHasBarEnd && bar.start.offset === bar.end.offset)\n continue;\n throw new ShikiError$1(`Decorations ${JSON.stringify(foo.start)} and ${JSON.stringify(bar.start)} intersect.`);\n }\n }\n }\n}\nfunction stringify(el) {\n if (el.type === \"text\")\n return el.value;\n if (el.type === \"element\")\n return el.children.map(stringify).join(\"\");\n return \"\";\n}\n\nconst builtInTransformers = [\n /* @__PURE__ */ transformerDecorations()\n];\nfunction getTransformers(options) {\n const transformers = sortTransformersByEnforcement(options.transformers || []);\n return [\n ...transformers.pre,\n ...transformers.normal,\n ...transformers.post,\n ...builtInTransformers\n ];\n}\nfunction sortTransformersByEnforcement(transformers) {\n const pre = [];\n const post = [];\n const normal = [];\n for (const transformer of transformers) {\n switch (transformer.enforce) {\n case \"pre\":\n pre.push(transformer);\n break;\n case \"post\":\n post.push(transformer);\n break;\n default:\n normal.push(transformer);\n }\n }\n return { pre, post, normal };\n}\n\n// src/colors.ts\nvar namedColors = [\n \"black\",\n \"red\",\n \"green\",\n \"yellow\",\n \"blue\",\n \"magenta\",\n \"cyan\",\n \"white\",\n \"brightBlack\",\n \"brightRed\",\n \"brightGreen\",\n \"brightYellow\",\n \"brightBlue\",\n \"brightMagenta\",\n \"brightCyan\",\n \"brightWhite\"\n];\n\n// src/decorations.ts\nvar decorations = {\n 1: \"bold\",\n 2: \"dim\",\n 3: \"italic\",\n 4: \"underline\",\n 7: \"reverse\",\n 8: \"hidden\",\n 9: \"strikethrough\"\n};\n\n// src/parser.ts\nfunction findSequence(value, position) {\n const nextEscape = value.indexOf(\"\\x1B\", position);\n if (nextEscape !== -1) {\n if (value[nextEscape + 1] === \"[\") {\n const nextClose = value.indexOf(\"m\", nextEscape);\n if (nextClose !== -1) {\n return {\n sequence: value.substring(nextEscape + 2, nextClose).split(\";\"),\n startPosition: nextEscape,\n position: nextClose + 1\n };\n }\n }\n }\n return {\n position: value.length\n };\n}\nfunction parseColor(sequence) {\n const colorMode = sequence.shift();\n if (colorMode === \"2\") {\n const rgb = sequence.splice(0, 3).map((x) => Number.parseInt(x));\n if (rgb.length !== 3 || rgb.some((x) => Number.isNaN(x)))\n return;\n return {\n type: \"rgb\",\n rgb\n };\n } else if (colorMode === \"5\") {\n const index = sequence.shift();\n if (index) {\n return { type: \"table\", index: Number(index) };\n }\n }\n}\nfunction parseSequence(sequence) {\n const commands = [];\n while (sequence.length > 0) {\n const code = sequence.shift();\n if (!code)\n continue;\n const codeInt = Number.parseInt(code);\n if (Number.isNaN(codeInt))\n continue;\n if (codeInt === 0) {\n commands.push({ type: \"resetAll\" });\n } else if (codeInt <= 9) {\n const decoration = decorations[codeInt];\n if (decoration) {\n commands.push({\n type: \"setDecoration\",\n value: decorations[codeInt]\n });\n }\n } else if (codeInt <= 29) {\n const decoration = decorations[codeInt - 20];\n if (decoration) {\n commands.push({\n type: \"resetDecoration\",\n value: decoration\n });\n if (decoration === \"dim\") {\n commands.push({\n type: \"resetDecoration\",\n value: \"bold\"\n });\n }\n }\n } else if (codeInt <= 37) {\n commands.push({\n type: \"setForegroundColor\",\n value: { type: \"named\", name: namedColors[codeInt - 30] }\n });\n } else if (codeInt === 38) {\n const color = parseColor(sequence);\n if (color) {\n commands.push({\n type: \"setForegroundColor\",\n value: color\n });\n }\n } else if (codeInt === 39) {\n commands.push({\n type: \"resetForegroundColor\"\n });\n } else if (codeInt <= 47) {\n commands.push({\n type: \"setBackgroundColor\",\n value: { type: \"named\", name: namedColors[codeInt - 40] }\n });\n } else if (codeInt === 48) {\n const color = parseColor(sequence);\n if (color) {\n commands.push({\n type: \"setBackgroundColor\",\n value: color\n });\n }\n } else if (codeInt === 49) {\n commands.push({\n type: \"resetBackgroundColor\"\n });\n } else if (codeInt === 53) {\n commands.push({\n type: \"setDecoration\",\n value: \"overline\"\n });\n } else if (codeInt === 55) {\n commands.push({\n type: \"resetDecoration\",\n value: \"overline\"\n });\n } else if (codeInt >= 90 && codeInt <= 97) {\n commands.push({\n type: \"setForegroundColor\",\n value: { type: \"named\", name: namedColors[codeInt - 90 + 8] }\n });\n } else if (codeInt >= 100 && codeInt <= 107) {\n commands.push({\n type: \"setBackgroundColor\",\n value: { type: \"named\", name: namedColors[codeInt - 100 + 8] }\n });\n }\n }\n return commands;\n}\nfunction createAnsiSequenceParser() {\n let foreground = null;\n let background = null;\n let decorations2 = /* @__PURE__ */ new Set();\n return {\n parse(value) {\n const tokens = [];\n let position = 0;\n do {\n const findResult = findSequence(value, position);\n const text = findResult.sequence ? value.substring(position, findResult.startPosition) : value.substring(position);\n if (text.length > 0) {\n tokens.push({\n value: text,\n foreground,\n background,\n decorations: new Set(decorations2)\n });\n }\n if (findResult.sequence) {\n const commands = parseSequence(findResult.sequence);\n for (const styleToken of commands) {\n if (styleToken.type === \"resetAll\") {\n foreground = null;\n background = null;\n decorations2.clear();\n } else if (styleToken.type === \"resetForegroundColor\") {\n foreground = null;\n } else if (styleToken.type === \"resetBackgroundColor\") {\n background = null;\n } else if (styleToken.type === \"resetDecoration\") {\n decorations2.delete(styleToken.value);\n }\n }\n for (const styleToken of commands) {\n if (styleToken.type === \"setForegroundColor\") {\n foreground = styleToken.value;\n } else if (styleToken.type === \"setBackgroundColor\") {\n background = styleToken.value;\n } else if (styleToken.type === \"setDecoration\") {\n decorations2.add(styleToken.value);\n }\n }\n }\n position = findResult.position;\n } while (position < value.length);\n return tokens;\n }\n };\n}\n\n// src/palette.ts\nvar defaultNamedColorsMap = {\n black: \"#000000\",\n red: \"#bb0000\",\n green: \"#00bb00\",\n yellow: \"#bbbb00\",\n blue: \"#0000bb\",\n magenta: \"#ff00ff\",\n cyan: \"#00bbbb\",\n white: \"#eeeeee\",\n brightBlack: \"#555555\",\n brightRed: \"#ff5555\",\n brightGreen: \"#00ff00\",\n brightYellow: \"#ffff55\",\n brightBlue: \"#5555ff\",\n brightMagenta: \"#ff55ff\",\n brightCyan: \"#55ffff\",\n brightWhite: \"#ffffff\"\n};\nfunction createColorPalette(namedColorsMap = defaultNamedColorsMap) {\n function namedColor(name) {\n return namedColorsMap[name];\n }\n function rgbColor(rgb) {\n return `#${rgb.map((x) => Math.max(0, Math.min(x, 255)).toString(16).padStart(2, \"0\")).join(\"\")}`;\n }\n let colorTable;\n function getColorTable() {\n if (colorTable) {\n return colorTable;\n }\n colorTable = [];\n for (let i = 0; i < namedColors.length; i++) {\n colorTable.push(namedColor(namedColors[i]));\n }\n let levels = [0, 95, 135, 175, 215, 255];\n for (let r = 0; r < 6; r++) {\n for (let g = 0; g < 6; g++) {\n for (let b = 0; b < 6; b++) {\n colorTable.push(rgbColor([levels[r], levels[g], levels[b]]));\n }\n }\n }\n let level = 8;\n for (let i = 0; i < 24; i++, level += 10) {\n colorTable.push(rgbColor([level, level, level]));\n }\n return colorTable;\n }\n function tableColor(index) {\n return getColorTable()[index];\n }\n function value(color) {\n switch (color.type) {\n case \"named\":\n return namedColor(color.name);\n case \"rgb\":\n return rgbColor(color.rgb);\n case \"table\":\n return tableColor(color.index);\n }\n }\n return {\n value\n };\n}\n\nconst defaultAnsiColors = {\n black: \"#000000\",\n red: \"#cd3131\",\n green: \"#0DBC79\",\n yellow: \"#E5E510\",\n blue: \"#2472C8\",\n magenta: \"#BC3FBC\",\n cyan: \"#11A8CD\",\n white: \"#E5E5E5\",\n brightBlack: \"#666666\",\n brightRed: \"#F14C4C\",\n brightGreen: \"#23D18B\",\n brightYellow: \"#F5F543\",\n brightBlue: \"#3B8EEA\",\n brightMagenta: \"#D670D6\",\n brightCyan: \"#29B8DB\",\n brightWhite: \"#FFFFFF\"\n};\nfunction tokenizeAnsiWithTheme(theme, fileContents, options) {\n const colorReplacements = resolveColorReplacements(theme, options);\n const lines = splitLines(fileContents);\n const ansiPalette = Object.fromEntries(\n namedColors.map((name) => {\n const key = `terminal.ansi${name[0].toUpperCase()}${name.substring(1)}`;\n const themeColor = theme.colors?.[key];\n return [name, themeColor || defaultAnsiColors[name]];\n })\n );\n const colorPalette = createColorPalette(ansiPalette);\n const parser = createAnsiSequenceParser();\n return lines.map(\n (line) => parser.parse(line[0]).map((token) => {\n let color;\n let bgColor;\n if (token.decorations.has(\"reverse\")) {\n color = token.background ? colorPalette.value(token.background) : theme.bg;\n bgColor = token.foreground ? colorPalette.value(token.foreground) : theme.fg;\n } else {\n color = token.foreground ? colorPalette.value(token.foreground) : theme.fg;\n bgColor = token.background ? colorPalette.value(token.background) : void 0;\n }\n color = applyColorReplacements(color, colorReplacements);\n bgColor = applyColorReplacements(bgColor, colorReplacements);\n if (token.decorations.has(\"dim\"))\n color = dimColor(color);\n let fontStyle = FontStyle.None;\n if (token.decorations.has(\"bold\"))\n fontStyle |= FontStyle.Bold;\n if (token.decorations.has(\"italic\"))\n fontStyle |= FontStyle.Italic;\n if (token.decorations.has(\"underline\"))\n fontStyle |= FontStyle.Underline;\n if (token.decorations.has(\"strikethrough\"))\n fontStyle |= FontStyle.Strikethrough;\n return {\n content: token.value,\n offset: line[1],\n // TODO: more accurate offset? might need to fork ansi-sequence-parser\n color,\n bgColor,\n fontStyle\n };\n })\n );\n}\nfunction dimColor(color) {\n const hexMatch = color.match(/#([0-9a-f]{3,8})/i);\n if (hexMatch) {\n const hex = hexMatch[1];\n if (hex.length === 8) {\n const alpha = Math.round(Number.parseInt(hex.slice(6, 8), 16) / 2).toString(16).padStart(2, \"0\");\n return `#${hex.slice(0, 6)}${alpha}`;\n } else if (hex.length === 6) {\n return `#${hex}80`;\n } else if (hex.length === 4) {\n const r = hex[0];\n const g = hex[1];\n const b = hex[2];\n const a = hex[3];\n const alpha = Math.round(Number.parseInt(`${a}${a}`, 16) / 2).toString(16).padStart(2, \"0\");\n return `#${r}${r}${g}${g}${b}${b}${alpha}`;\n } else if (hex.length === 3) {\n const r = hex[0];\n const g = hex[1];\n const b = hex[2];\n return `#${r}${r}${g}${g}${b}${b}80`;\n }\n }\n const cssVarMatch = color.match(/var\\((--[\\w-]+-ansi-[\\w-]+)\\)/);\n if (cssVarMatch)\n return `var(${cssVarMatch[1]}-dim)`;\n return color;\n}\n\nfunction codeToTokensBase(internal, code, options = {}) {\n const {\n theme: themeName = internal.getLoadedThemes()[0]\n } = options;\n const lang = internal.resolveLangAlias(options.lang || \"text\");\n if (isPlainLang(lang) || isNoneTheme(themeName))\n return splitLines(code).map((line) => [{ content: line[0], offset: line[1] }]);\n const { theme, colorMap } = internal.setTheme(themeName);\n if (lang === \"ansi\")\n return tokenizeAnsiWithTheme(theme, code, options);\n const _grammar = internal.getLanguage(options.lang || \"text\");\n if (options.grammarState) {\n if (options.grammarState.lang !== _grammar.name) {\n throw new ShikiError$1(`Grammar state language \"${options.grammarState.lang}\" does not match highlight language \"${_grammar.name}\"`);\n }\n if (!options.grammarState.themes.includes(theme.name)) {\n throw new ShikiError$1(`Grammar state themes \"${options.grammarState.themes}\" do not contain highlight theme \"${theme.name}\"`);\n }\n }\n return tokenizeWithTheme(code, _grammar, theme, colorMap, options);\n}\nfunction getLastGrammarState(...args) {\n if (args.length === 2) {\n return getLastGrammarStateFromMap(args[1]);\n }\n const [internal, code, options = {}] = args;\n const {\n lang = \"text\",\n theme: themeName = internal.getLoadedThemes()[0]\n } = options;\n if (isPlainLang(lang) || isNoneTheme(themeName))\n throw new ShikiError$1(\"Plain language does not have grammar state\");\n if (lang === \"ansi\")\n throw new ShikiError$1(\"ANSI language does not have grammar state\");\n const { theme, colorMap } = internal.setTheme(themeName);\n const _grammar = internal.getLanguage(lang);\n return new GrammarState(\n _tokenizeWithTheme(code, _grammar, theme, colorMap, options).stateStack,\n _grammar.name,\n theme.name\n );\n}\nfunction tokenizeWithTheme(code, grammar, theme, colorMap, options) {\n const result = _tokenizeWithTheme(code, grammar, theme, colorMap, options);\n const grammarState = new GrammarState(\n result.stateStack,\n grammar.name,\n theme.name\n );\n setLastGrammarStateToMap(result.tokens, grammarState);\n return result.tokens;\n}\nfunction _tokenizeWithTheme(code, grammar, theme, colorMap, options) {\n const colorReplacements = resolveColorReplacements(theme, options);\n const {\n tokenizeMaxLineLength = 0,\n tokenizeTimeLimit = 500\n } = options;\n const lines = splitLines(code);\n let stateStack = options.grammarState ? getGrammarStack(options.grammarState, theme.name) ?? INITIAL : options.grammarContextCode != null ? _tokenizeWithTheme(\n options.grammarContextCode,\n grammar,\n theme,\n colorMap,\n {\n ...options,\n grammarState: void 0,\n grammarContextCode: void 0\n }\n ).stateStack : INITIAL;\n let actual = [];\n const final = [];\n for (let i = 0, len = lines.length; i < len; i++) {\n const [line, lineOffset] = lines[i];\n if (line === \"\") {\n actual = [];\n final.push([]);\n continue;\n }\n if (tokenizeMaxLineLength > 0 && line.length >= tokenizeMaxLineLength) {\n actual = [];\n final.push([{\n content: line,\n offset: lineOffset,\n color: \"\",\n fontStyle: 0\n }]);\n continue;\n }\n let resultWithScopes;\n let tokensWithScopes;\n let tokensWithScopesIndex;\n if (options.includeExplanation) {\n resultWithScopes = grammar.tokenizeLine(line, stateStack, tokenizeTimeLimit);\n tokensWithScopes = resultWithScopes.tokens;\n tokensWithScopesIndex = 0;\n }\n const result = grammar.tokenizeLine2(line, stateStack, tokenizeTimeLimit);\n const tokensLength = result.tokens.length / 2;\n for (let j = 0; j < tokensLength; j++) {\n const startIndex = result.tokens[2 * j];\n const nextStartIndex = j + 1 < tokensLength ? result.tokens[2 * j + 2] : line.length;\n if (startIndex === nextStartIndex)\n continue;\n const metadata = result.tokens[2 * j + 1];\n const color = applyColorReplacements(\n colorMap[EncodedTokenMetadata.getForeground(metadata)],\n colorReplacements\n );\n const fontStyle = EncodedTokenMetadata.getFontStyle(metadata);\n const token = {\n content: line.substring(startIndex, nextStartIndex),\n offset: lineOffset + startIndex,\n color,\n fontStyle\n };\n if (options.includeExplanation) {\n const themeSettingsSelectors = [];\n if (options.includeExplanation !== \"scopeName\") {\n for (const setting of theme.settings) {\n let selectors;\n switch (typeof setting.scope) {\n case \"string\":\n selectors = setting.scope.split(/,/).map((scope) => scope.trim());\n break;\n case \"object\":\n selectors = setting.scope;\n break;\n default:\n continue;\n }\n themeSettingsSelectors.push({\n settings: setting,\n selectors: selectors.map((selector) => selector.split(/ /))\n });\n }\n }\n token.explanation = [];\n let offset = 0;\n while (startIndex + offset < nextStartIndex) {\n const tokenWithScopes = tokensWithScopes[tokensWithScopesIndex];\n const tokenWithScopesText = line.substring(\n tokenWithScopes.startIndex,\n tokenWithScopes.endIndex\n );\n offset += tokenWithScopesText.length;\n token.explanation.push({\n content: tokenWithScopesText,\n scopes: options.includeExplanation === \"scopeName\" ? explainThemeScopesNameOnly(\n tokenWithScopes.scopes\n ) : explainThemeScopesFull(\n themeSettingsSelectors,\n tokenWithScopes.scopes\n )\n });\n tokensWithScopesIndex += 1;\n }\n }\n actual.push(token);\n }\n final.push(actual);\n actual = [];\n stateStack = result.ruleStack;\n }\n return {\n tokens: final,\n stateStack\n };\n}\nfunction explainThemeScopesNameOnly(scopes) {\n return scopes.map((scope) => ({ scopeName: scope }));\n}\nfunction explainThemeScopesFull(themeSelectors, scopes) {\n const result = [];\n for (let i = 0, len = scopes.length; i < len; i++) {\n const scope = scopes[i];\n result[i] = {\n scopeName: scope,\n themeMatches: explainThemeScope(themeSelectors, scope, scopes.slice(0, i))\n };\n }\n return result;\n}\nfunction matchesOne(selector, scope) {\n return selector === scope || scope.substring(0, selector.length) === selector && scope[selector.length] === \".\";\n}\nfunction matches(selectors, scope, parentScopes) {\n if (!matchesOne(selectors[selectors.length - 1], scope))\n return false;\n let selectorParentIndex = selectors.length - 2;\n let parentIndex = parentScopes.length - 1;\n while (selectorParentIndex >= 0 && parentIndex >= 0) {\n if (matchesOne(selectors[selectorParentIndex], parentScopes[parentIndex]))\n selectorParentIndex -= 1;\n parentIndex -= 1;\n }\n if (selectorParentIndex === -1)\n return true;\n return false;\n}\nfunction explainThemeScope(themeSettingsSelectors, scope, parentScopes) {\n const result = [];\n for (const { selectors, settings } of themeSettingsSelectors) {\n for (const selectorPieces of selectors) {\n if (matches(selectorPieces, scope, parentScopes)) {\n result.push(settings);\n break;\n }\n }\n }\n return result;\n}\n\nfunction codeToTokensWithThemes(internal, code, options) {\n const themes = Object.entries(options.themes).filter((i) => i[1]).map((i) => ({ color: i[0], theme: i[1] }));\n const themedTokens = themes.map((t) => {\n const tokens2 = codeToTokensBase(internal, code, {\n ...options,\n theme: t.theme\n });\n const state = getLastGrammarStateFromMap(tokens2);\n const theme = typeof t.theme === \"string\" ? t.theme : t.theme.name;\n return {\n tokens: tokens2,\n state,\n theme\n };\n });\n const tokens = syncThemesTokenization(\n ...themedTokens.map((i) => i.tokens)\n );\n const mergedTokens = tokens[0].map(\n (line, lineIdx) => line.map((_token, tokenIdx) => {\n const mergedToken = {\n content: _token.content,\n variants: {},\n offset: _token.offset\n };\n if (\"includeExplanation\" in options && options.includeExplanation) {\n mergedToken.explanation = _token.explanation;\n }\n tokens.forEach((t, themeIdx) => {\n const {\n content: _,\n explanation: __,\n offset: ___,\n ...styles\n } = t[lineIdx][tokenIdx];\n mergedToken.variants[themes[themeIdx].color] = styles;\n });\n return mergedToken;\n })\n );\n const mergedGrammarState = themedTokens[0].state ? new GrammarState(\n Object.fromEntries(themedTokens.map((s) => [s.theme, s.state?.getInternalStack(s.theme)])),\n themedTokens[0].state.lang\n ) : void 0;\n if (mergedGrammarState)\n setLastGrammarStateToMap(mergedTokens, mergedGrammarState);\n return mergedTokens;\n}\nfunction syncThemesTokenization(...themes) {\n const outThemes = themes.map(() => []);\n const count = themes.length;\n for (let i = 0; i < themes[0].length; i++) {\n const lines = themes.map((t) => t[i]);\n const outLines = outThemes.map(() => []);\n outThemes.forEach((t, i2) => t.push(outLines[i2]));\n const indexes = lines.map(() => 0);\n const current = lines.map((l) => l[0]);\n while (current.every((t) => t)) {\n const minLength = Math.min(...current.map((t) => t.content.length));\n for (let n = 0; n < count; n++) {\n const token = current[n];\n if (token.content.length === minLength) {\n outLines[n].push(token);\n indexes[n] += 1;\n current[n] = lines[n][indexes[n]];\n } else {\n outLines[n].push({\n ...token,\n content: token.content.slice(0, minLength)\n });\n current[n] = {\n ...token,\n content: token.content.slice(minLength),\n offset: token.offset + minLength\n };\n }\n }\n }\n }\n return outThemes;\n}\n\nfunction codeToTokens(internal, code, options) {\n let bg;\n let fg;\n let tokens;\n let themeName;\n let rootStyle;\n let grammarState;\n if (\"themes\" in options) {\n const {\n defaultColor = \"light\",\n cssVariablePrefix = \"--shiki-\",\n colorsRendering = \"css-vars\"\n } = options;\n const themes = Object.entries(options.themes).filter((i) => i[1]).map((i) => ({ color: i[0], theme: i[1] })).sort((a, b) => a.color === defaultColor ? -1 : b.color === defaultColor ? 1 : 0);\n if (themes.length === 0)\n throw new ShikiError$1(\"`themes` option must not be empty\");\n const themeTokens = codeToTokensWithThemes(\n internal,\n code,\n options\n );\n grammarState = getLastGrammarStateFromMap(themeTokens);\n if (defaultColor && DEFAULT_COLOR_LIGHT_DARK !== defaultColor && !themes.find((t) => t.color === defaultColor))\n throw new ShikiError$1(`\\`themes\\` option must contain the defaultColor key \\`${defaultColor}\\``);\n const themeRegs = themes.map((t) => internal.getTheme(t.theme));\n const themesOrder = themes.map((t) => t.color);\n tokens = themeTokens.map((line) => line.map((token) => flatTokenVariants(token, themesOrder, cssVariablePrefix, defaultColor, colorsRendering)));\n if (grammarState)\n setLastGrammarStateToMap(tokens, grammarState);\n const themeColorReplacements = themes.map((t) => resolveColorReplacements(t.theme, options));\n fg = mapThemeColors(themes, themeRegs, themeColorReplacements, cssVariablePrefix, defaultColor, \"fg\", colorsRendering);\n bg = mapThemeColors(themes, themeRegs, themeColorReplacements, cssVariablePrefix, defaultColor, \"bg\", colorsRendering);\n themeName = `shiki-themes ${themeRegs.map((t) => t.name).join(\" \")}`;\n rootStyle = defaultColor ? void 0 : [fg, bg].join(\";\");\n } else if (\"theme\" in options) {\n const colorReplacements = resolveColorReplacements(options.theme, options);\n tokens = codeToTokensBase(\n internal,\n code,\n options\n );\n const _theme = internal.getTheme(options.theme);\n bg = applyColorReplacements(_theme.bg, colorReplacements);\n fg = applyColorReplacements(_theme.fg, colorReplacements);\n themeName = _theme.name;\n grammarState = getLastGrammarStateFromMap(tokens);\n } else {\n throw new ShikiError$1(\"Invalid options, either `theme` or `themes` must be provided\");\n }\n return {\n tokens,\n fg,\n bg,\n themeName,\n rootStyle,\n grammarState\n };\n}\nfunction mapThemeColors(themes, themeRegs, themeColorReplacements, cssVariablePrefix, defaultColor, property, colorsRendering) {\n return themes.map((t, idx) => {\n const value = applyColorReplacements(themeRegs[idx][property], themeColorReplacements[idx]) || \"inherit\";\n const cssVar = `${cssVariablePrefix + t.color}${property === \"bg\" ? \"-bg\" : \"\"}:${value}`;\n if (idx === 0 && defaultColor) {\n if (defaultColor === DEFAULT_COLOR_LIGHT_DARK && themes.length > 1) {\n const lightIndex = themes.findIndex((t2) => t2.color === \"light\");\n const darkIndex = themes.findIndex((t2) => t2.color === \"dark\");\n if (lightIndex === -1 || darkIndex === -1)\n throw new ShikiError$1('When using `defaultColor: \"light-dark()\"`, you must provide both `light` and `dark` themes');\n const lightValue = applyColorReplacements(themeRegs[lightIndex][property], themeColorReplacements[lightIndex]) || \"inherit\";\n const darkValue = applyColorReplacements(themeRegs[darkIndex][property], themeColorReplacements[darkIndex]) || \"inherit\";\n return `light-dark(${lightValue}, ${darkValue});${cssVar}`;\n }\n return value;\n }\n if (colorsRendering === \"css-vars\") {\n return cssVar;\n }\n return null;\n }).filter((i) => !!i).join(\";\");\n}\n\nfunction codeToHast(internal, code, options, transformerContext = {\n meta: {},\n options,\n codeToHast: (_code, _options) => codeToHast(internal, _code, _options),\n codeToTokens: (_code, _options) => codeToTokens(internal, _code, _options)\n}) {\n let input = code;\n for (const transformer of getTransformers(options))\n input = transformer.preprocess?.call(transformerContext, input, options) || input;\n let {\n tokens,\n fg,\n bg,\n themeName,\n rootStyle,\n grammarState\n } = codeToTokens(internal, input, options);\n const {\n mergeWhitespaces = true,\n mergeSameStyleTokens = false\n } = options;\n if (mergeWhitespaces === true)\n tokens = mergeWhitespaceTokens(tokens);\n else if (mergeWhitespaces === \"never\")\n tokens = splitWhitespaceTokens(tokens);\n if (mergeSameStyleTokens) {\n tokens = mergeAdjacentStyledTokens(tokens);\n }\n const contextSource = {\n ...transformerContext,\n get source() {\n return input;\n }\n };\n for (const transformer of getTransformers(options))\n tokens = transformer.tokens?.call(contextSource, tokens) || tokens;\n return tokensToHast(\n tokens,\n {\n ...options,\n fg,\n bg,\n themeName,\n rootStyle: options.rootStyle === false ? false : options.rootStyle ?? rootStyle\n },\n contextSource,\n grammarState\n );\n}\nfunction tokensToHast(tokens, options, transformerContext, grammarState = getLastGrammarStateFromMap(tokens)) {\n const transformers = getTransformers(options);\n const lines = [];\n const root = {\n type: \"root\",\n children: []\n };\n const {\n structure = \"classic\",\n tabindex = \"0\"\n } = options;\n const properties = {\n class: `shiki ${options.themeName || \"\"}`\n };\n if (options.rootStyle !== false) {\n if (options.rootStyle != null)\n properties.style = options.rootStyle;\n else\n properties.style = `background-color:${options.bg};color:${options.fg}`;\n }\n if (tabindex !== false && tabindex != null)\n properties.tabindex = tabindex.toString();\n for (const [key, value] of Object.entries(options.meta || {})) {\n if (!key.startsWith(\"_\"))\n properties[key] = value;\n }\n let preNode = {\n type: \"element\",\n tagName: \"pre\",\n properties,\n children: [],\n data: options.data\n };\n let codeNode = {\n type: \"element\",\n tagName: \"code\",\n properties: {},\n children: lines\n };\n const lineNodes = [];\n const context = {\n ...transformerContext,\n structure,\n addClassToHast,\n get source() {\n return transformerContext.source;\n },\n get tokens() {\n return tokens;\n },\n get options() {\n return options;\n },\n get root() {\n return root;\n },\n get pre() {\n return preNode;\n },\n get code() {\n return codeNode;\n },\n get lines() {\n return lineNodes;\n }\n };\n tokens.forEach((line, idx) => {\n if (idx) {\n if (structure === \"inline\")\n root.children.push({ type: \"element\", tagName: \"br\", properties: {}, children: [] });\n else if (structure === \"classic\")\n lines.push({ type: \"text\", value: \"\\n\" });\n }\n let lineNode = {\n type: \"element\",\n tagName: \"span\",\n properties: { class: \"line\" },\n children: []\n };\n let col = 0;\n for (const token of line) {\n let tokenNode = {\n type: \"element\",\n tagName: \"span\",\n properties: {\n ...token.htmlAttrs\n },\n children: [{ type: \"text\", value: token.content }]\n };\n const style = stringifyTokenStyle(token.htmlStyle || getTokenStyleObject(token));\n if (style)\n tokenNode.properties.style = style;\n for (const transformer of transformers)\n tokenNode = transformer?.span?.call(context, tokenNode, idx + 1, col, lineNode, token) || tokenNode;\n if (structure === \"inline\")\n root.children.push(tokenNode);\n else if (structure === \"classic\")\n lineNode.children.push(tokenNode);\n col += token.content.length;\n }\n if (structure === \"classic\") {\n for (const transformer of transformers)\n lineNode = transformer?.line?.call(context, lineNode, idx + 1) || lineNode;\n lineNodes.push(lineNode);\n lines.push(lineNode);\n } else if (structure === \"inline\") {\n lineNodes.push(lineNode);\n }\n });\n if (structure === \"classic\") {\n for (const transformer of transformers)\n codeNode = transformer?.code?.call(context, codeNode) || codeNode;\n preNode.children.push(codeNode);\n for (const transformer of transformers)\n preNode = transformer?.pre?.call(context, preNode) || preNode;\n root.children.push(preNode);\n } else if (structure === \"inline\") {\n const syntheticLines = [];\n let currentLine = {\n type: \"element\",\n tagName: \"span\",\n properties: { class: \"line\" },\n children: []\n };\n for (const child of root.children) {\n if (child.type === \"element\" && child.tagName === \"br\") {\n syntheticLines.push(currentLine);\n currentLine = {\n type: \"element\",\n tagName: \"span\",\n properties: { class: \"line\" },\n children: []\n };\n } else if (child.type === \"element\" || child.type === \"text\") {\n currentLine.children.push(child);\n }\n }\n syntheticLines.push(currentLine);\n const syntheticCode = {\n type: \"element\",\n tagName: \"code\",\n properties: {},\n children: syntheticLines\n };\n let transformedCode = syntheticCode;\n for (const transformer of transformers)\n transformedCode = transformer?.code?.call(context, transformedCode) || transformedCode;\n root.children = [];\n for (let i = 0; i < transformedCode.children.length; i++) {\n if (i > 0)\n root.children.push({ type: \"element\", tagName: \"br\", properties: {}, children: [] });\n const line = transformedCode.children[i];\n if (line.type === \"element\")\n root.children.push(...line.children);\n }\n }\n let result = root;\n for (const transformer of transformers)\n result = transformer?.root?.call(context, result) || result;\n if (grammarState)\n setLastGrammarStateToMap(result, grammarState);\n return result;\n}\nfunction mergeWhitespaceTokens(tokens) {\n return tokens.map((line) => {\n const newLine = [];\n let carryOnContent = \"\";\n let firstOffset;\n line.forEach((token, idx) => {\n const isDecorated = token.fontStyle && (token.fontStyle & FontStyle.Underline || token.fontStyle & FontStyle.Strikethrough);\n const couldMerge = !isDecorated;\n if (couldMerge && token.content.match(/^\\s+$/) && line[idx + 1]) {\n if (firstOffset === void 0)\n firstOffset = token.offset;\n carryOnContent += token.content;\n } else {\n if (carryOnContent) {\n if (couldMerge) {\n newLine.push({\n ...token,\n offset: firstOffset,\n content: carryOnContent + token.content\n });\n } else {\n newLine.push(\n {\n content: carryOnContent,\n offset: firstOffset\n },\n token\n );\n }\n firstOffset = void 0;\n carryOnContent = \"\";\n } else {\n newLine.push(token);\n }\n }\n });\n return newLine;\n });\n}\nfunction splitWhitespaceTokens(tokens) {\n return tokens.map((line) => {\n return line.flatMap((token) => {\n if (token.content.match(/^\\s+$/))\n return token;\n const match = token.content.match(/^(\\s*)(.*?)(\\s*)$/);\n if (!match)\n return token;\n const [, leading, content, trailing] = match;\n if (!leading && !trailing)\n return token;\n const expanded = [{\n ...token,\n offset: token.offset + leading.length,\n content\n }];\n if (leading) {\n expanded.unshift({\n content: leading,\n offset: token.offset\n });\n }\n if (trailing) {\n expanded.push({\n content: trailing,\n offset: token.offset + leading.length + content.length\n });\n }\n return expanded;\n });\n });\n}\nfunction mergeAdjacentStyledTokens(tokens) {\n return tokens.map((line) => {\n const newLine = [];\n for (const token of line) {\n if (newLine.length === 0) {\n newLine.push({ ...token });\n continue;\n }\n const prevToken = newLine[newLine.length - 1];\n const prevStyle = stringifyTokenStyle(prevToken.htmlStyle || getTokenStyleObject(prevToken));\n const currentStyle = stringifyTokenStyle(token.htmlStyle || getTokenStyleObject(token));\n const isPrevDecorated = prevToken.fontStyle && (prevToken.fontStyle & FontStyle.Underline || prevToken.fontStyle & FontStyle.Strikethrough);\n const isDecorated = token.fontStyle && (token.fontStyle & FontStyle.Underline || token.fontStyle & FontStyle.Strikethrough);\n if (!isPrevDecorated && !isDecorated && prevStyle === currentStyle) {\n prevToken.content += token.content;\n } else {\n newLine.push({ ...token });\n }\n }\n return newLine;\n });\n}\n\nconst hastToHtml = toHtml;\nfunction codeToHtml(internal, code, options) {\n const context = {\n meta: {},\n options,\n codeToHast: (_code, _options) => codeToHast(internal, _code, _options),\n codeToTokens: (_code, _options) => codeToTokens(internal, _code, _options)\n };\n let result = hastToHtml(codeToHast(internal, code, options, context));\n for (const transformer of getTransformers(options))\n result = transformer.postprocess?.call(context, result, options) || result;\n return result;\n}\n\nconst VSCODE_FALLBACK_EDITOR_FG = { light: \"#333333\", dark: \"#bbbbbb\" };\nconst VSCODE_FALLBACK_EDITOR_BG = { light: \"#fffffe\", dark: \"#1e1e1e\" };\nconst RESOLVED_KEY = \"__shiki_resolved\";\nfunction normalizeTheme(rawTheme) {\n if (rawTheme?.[RESOLVED_KEY])\n return rawTheme;\n const theme = {\n ...rawTheme\n };\n if (theme.tokenColors && !theme.settings) {\n theme.settings = theme.tokenColors;\n delete theme.tokenColors;\n }\n theme.type ||= \"dark\";\n theme.colorReplacements = { ...theme.colorReplacements };\n theme.settings ||= [];\n let { bg, fg } = theme;\n if (!bg || !fg) {\n const globalSetting = theme.settings ? theme.settings.find((s) => !s.name && !s.scope) : void 0;\n if (globalSetting?.settings?.foreground)\n fg = globalSetting.settings.foreground;\n if (globalSetting?.settings?.background)\n bg = globalSetting.settings.background;\n if (!fg && theme?.colors?.[\"editor.foreground\"])\n fg = theme.colors[\"editor.foreground\"];\n if (!bg && theme?.colors?.[\"editor.background\"])\n bg = theme.colors[\"editor.background\"];\n if (!fg)\n fg = theme.type === \"light\" ? VSCODE_FALLBACK_EDITOR_FG.light : VSCODE_FALLBACK_EDITOR_FG.dark;\n if (!bg)\n bg = theme.type === \"light\" ? VSCODE_FALLBACK_EDITOR_BG.light : VSCODE_FALLBACK_EDITOR_BG.dark;\n theme.fg = fg;\n theme.bg = bg;\n }\n if (!(theme.settings[0] && theme.settings[0].settings && !theme.settings[0].scope)) {\n theme.settings.unshift({\n settings: {\n foreground: theme.fg,\n background: theme.bg\n }\n });\n }\n let replacementCount = 0;\n const replacementMap = /* @__PURE__ */ new Map();\n function getReplacementColor(value) {\n if (replacementMap.has(value))\n return replacementMap.get(value);\n replacementCount += 1;\n const hex = `#${replacementCount.toString(16).padStart(8, \"0\").toLowerCase()}`;\n if (theme.colorReplacements?.[`#${hex}`])\n return getReplacementColor(value);\n replacementMap.set(value, hex);\n return hex;\n }\n theme.settings = theme.settings.map((setting) => {\n const replaceFg = setting.settings?.foreground && !setting.settings.foreground.startsWith(\"#\");\n const replaceBg = setting.settings?.background && !setting.settings.background.startsWith(\"#\");\n if (!replaceFg && !replaceBg)\n return setting;\n const clone = {\n ...setting,\n settings: {\n ...setting.settings\n }\n };\n if (replaceFg) {\n const replacement = getReplacementColor(setting.settings.foreground);\n theme.colorReplacements[replacement] = setting.settings.foreground;\n clone.settings.foreground = replacement;\n }\n if (replaceBg) {\n const replacement = getReplacementColor(setting.settings.background);\n theme.colorReplacements[replacement] = setting.settings.background;\n clone.settings.background = replacement;\n }\n return clone;\n });\n for (const key of Object.keys(theme.colors || {})) {\n if (key === \"editor.foreground\" || key === \"editor.background\" || key.startsWith(\"terminal.ansi\")) {\n if (!theme.colors[key]?.startsWith(\"#\")) {\n const replacement = getReplacementColor(theme.colors[key]);\n theme.colorReplacements[replacement] = theme.colors[key];\n theme.colors[key] = replacement;\n }\n }\n }\n Object.defineProperty(theme, RESOLVED_KEY, {\n enumerable: false,\n writable: false,\n value: true\n });\n return theme;\n}\n\nasync function resolveLangs(langs) {\n return Array.from(new Set((await Promise.all(\n langs.filter((l) => !isSpecialLang(l)).map(async (lang) => await normalizeGetter(lang).then((r) => Array.isArray(r) ? r : [r]))\n )).flat()));\n}\nasync function resolveThemes(themes) {\n const resolved = await Promise.all(\n themes.map(\n async (theme) => isSpecialTheme(theme) ? null : normalizeTheme(await normalizeGetter(theme))\n )\n );\n return resolved.filter((i) => !!i);\n}\n\nlet _emitDeprecation = 3;\nlet _emitError = false;\nfunction enableDeprecationWarnings(emitDeprecation = true, emitError = false) {\n _emitDeprecation = emitDeprecation;\n _emitError = emitError;\n}\nfunction warnDeprecated(message, version = 3) {\n if (!_emitDeprecation)\n return;\n if (typeof _emitDeprecation === \"number\" && version > _emitDeprecation)\n return;\n if (_emitError) {\n throw new Error(`[SHIKI DEPRECATE]: ${message}`);\n } else {\n console.trace(`[SHIKI DEPRECATE]: ${message}`);\n }\n}\n\nclass ShikiError extends Error {\n constructor(message) {\n super(message);\n this.name = \"ShikiError\";\n }\n}\n\nfunction resolveLangAlias(name, alias) {\n if (!alias)\n return name;\n if (alias[name]) {\n const resolved = /* @__PURE__ */ new Set([name]);\n while (alias[name]) {\n name = alias[name];\n if (resolved.has(name))\n throw new ShikiError(`Circular alias \\`${Array.from(resolved).join(\" -> \")} -> ${name}\\``);\n resolved.add(name);\n }\n }\n return name;\n}\n\nclass Registry extends Registry$1 {\n constructor(_resolver, _themes, _langs, _alias = {}) {\n super(_resolver);\n this._resolver = _resolver;\n this._themes = _themes;\n this._langs = _langs;\n this._alias = _alias;\n this._themes.map((t) => this.loadTheme(t));\n this.loadLanguages(this._langs);\n }\n _resolvedThemes = /* @__PURE__ */ new Map();\n _resolvedGrammars = /* @__PURE__ */ new Map();\n _langMap = /* @__PURE__ */ new Map();\n _langGraph = /* @__PURE__ */ new Map();\n _textmateThemeCache = /* @__PURE__ */ new WeakMap();\n _loadedThemesCache = null;\n _loadedLanguagesCache = null;\n getTheme(theme) {\n if (typeof theme === \"string\")\n return this._resolvedThemes.get(theme);\n else\n return this.loadTheme(theme);\n }\n loadTheme(theme) {\n const _theme = normalizeTheme(theme);\n if (_theme.name) {\n this._resolvedThemes.set(_theme.name, _theme);\n this._loadedThemesCache = null;\n }\n return _theme;\n }\n getLoadedThemes() {\n if (!this._loadedThemesCache)\n this._loadedThemesCache = [...this._resolvedThemes.keys()];\n return this._loadedThemesCache;\n }\n // Override and re-implement this method to cache the textmate themes as `TextMateTheme.createFromRawTheme`\n // is expensive. Themes can switch often especially for dual-theme support.\n //\n // The parent class also accepts `colorMap` as the second parameter, but since we don't use that,\n // we omit here so it's easier to cache the themes.\n setTheme(theme) {\n let textmateTheme = this._textmateThemeCache.get(theme);\n if (!textmateTheme) {\n textmateTheme = Theme.createFromRawTheme(theme);\n this._textmateThemeCache.set(theme, textmateTheme);\n }\n this._syncRegistry.setTheme(textmateTheme);\n }\n getGrammar(name) {\n name = resolveLangAlias(name, this._alias);\n return this._resolvedGrammars.get(name);\n }\n loadLanguage(lang) {\n if (this.getGrammar(lang.name))\n return;\n const embeddedLazilyBy = new Set(\n [...this._langMap.values()].filter((i) => i.embeddedLangsLazy?.includes(lang.name))\n );\n this._resolver.addLanguage(lang);\n const grammarConfig = {\n balancedBracketSelectors: lang.balancedBracketSelectors || [\"*\"],\n unbalancedBracketSelectors: lang.unbalancedBracketSelectors || []\n };\n this._syncRegistry._rawGrammars.set(lang.scopeName, lang);\n const g = this.loadGrammarWithConfiguration(lang.scopeName, 1, grammarConfig);\n g.name = lang.name;\n this._resolvedGrammars.set(lang.name, g);\n if (lang.aliases) {\n lang.aliases.forEach((alias) => {\n this._alias[alias] = lang.name;\n });\n }\n this._loadedLanguagesCache = null;\n if (embeddedLazilyBy.size) {\n for (const e of embeddedLazilyBy) {\n this._resolvedGrammars.delete(e.name);\n this._loadedLanguagesCache = null;\n this._syncRegistry?._injectionGrammars?.delete(e.scopeName);\n this._syncRegistry?._grammars?.delete(e.scopeName);\n this.loadLanguage(this._langMap.get(e.name));\n }\n }\n }\n dispose() {\n super.dispose();\n this._resolvedThemes.clear();\n this._resolvedGrammars.clear();\n this._langMap.clear();\n this._langGraph.clear();\n this._loadedThemesCache = null;\n }\n loadLanguages(langs) {\n for (const lang of langs)\n this.resolveEmbeddedLanguages(lang);\n const langsGraphArray = Array.from(this._langGraph.entries());\n const missingLangs = langsGraphArray.filter(([_, lang]) => !lang);\n if (missingLangs.length) {\n const dependents = langsGraphArray.filter(([_, lang]) => {\n if (!lang)\n return false;\n const embedded = lang.embeddedLanguages || lang.embeddedLangs;\n return embedded?.some((l) => missingLangs.map(([name]) => name).includes(l));\n }).filter((lang) => !missingLangs.includes(lang));\n throw new ShikiError(`Missing languages ${missingLangs.map(([name]) => `\\`${name}\\``).join(\", \")}, required by ${dependents.map(([name]) => `\\`${name}\\``).join(\", \")}`);\n }\n for (const [_, lang] of langsGraphArray)\n this._resolver.addLanguage(lang);\n for (const [_, lang] of langsGraphArray)\n this.loadLanguage(lang);\n }\n getLoadedLanguages() {\n if (!this._loadedLanguagesCache) {\n this._loadedLanguagesCache = [\n .../* @__PURE__ */ new Set([...this._resolvedGrammars.keys(), ...Object.keys(this._alias)])\n ];\n }\n return this._loadedLanguagesCache;\n }\n resolveEmbeddedLanguages(lang) {\n this._langMap.set(lang.name, lang);\n this._langGraph.set(lang.name, lang);\n const embedded = lang.embeddedLanguages ?? lang.embeddedLangs;\n if (embedded) {\n for (const embeddedLang of embedded)\n this._langGraph.set(embeddedLang, this._langMap.get(embeddedLang));\n }\n }\n}\n\nclass Resolver {\n _langs = /* @__PURE__ */ new Map();\n _scopeToLang = /* @__PURE__ */ new Map();\n _injections = /* @__PURE__ */ new Map();\n _onigLib;\n constructor(engine, langs) {\n this._onigLib = {\n createOnigScanner: (patterns) => engine.createScanner(patterns),\n createOnigString: (s) => engine.createString(s)\n };\n langs.forEach((i) => this.addLanguage(i));\n }\n get onigLib() {\n return this._onigLib;\n }\n getLangRegistration(langIdOrAlias) {\n return this._langs.get(langIdOrAlias);\n }\n loadGrammar(scopeName) {\n return this._scopeToLang.get(scopeName);\n }\n addLanguage(l) {\n this._langs.set(l.name, l);\n if (l.aliases) {\n l.aliases.forEach((a) => {\n this._langs.set(a, l);\n });\n }\n this._scopeToLang.set(l.scopeName, l);\n if (l.injectTo) {\n l.injectTo.forEach((i) => {\n if (!this._injections.get(i))\n this._injections.set(i, []);\n this._injections.get(i).push(l.scopeName);\n });\n }\n }\n getInjections(scopeName) {\n const scopeParts = scopeName.split(\".\");\n let injections = [];\n for (let i = 1; i <= scopeParts.length; i++) {\n const subScopeName = scopeParts.slice(0, i).join(\".\");\n injections = [...injections, ...this._injections.get(subScopeName) || []];\n }\n return injections;\n }\n}\n\nlet instancesCount = 0;\nfunction createShikiInternalSync(options) {\n instancesCount += 1;\n if (options.warnings !== false && instancesCount >= 10 && instancesCount % 10 === 0)\n console.warn(`[Shiki] ${instancesCount} instances have been created. Shiki is supposed to be used as a singleton, consider refactoring your code to cache your highlighter instance; Or call \\`highlighter.dispose()\\` to release unused instances.`);\n let isDisposed = false;\n if (!options.engine)\n throw new ShikiError(\"`engine` option is required for synchronous mode\");\n const langs = (options.langs || []).flat(1);\n const themes = (options.themes || []).flat(1).map(normalizeTheme);\n const resolver = new Resolver(options.engine, langs);\n const _registry = new Registry(resolver, themes, langs, options.langAlias);\n let _lastTheme;\n function resolveLangAlias$1(name) {\n return resolveLangAlias(name, options.langAlias);\n }\n function getLanguage(name) {\n ensureNotDisposed();\n const _lang = _registry.getGrammar(typeof name === \"string\" ? name : name.name);\n if (!_lang)\n throw new ShikiError(`Language \\`${name}\\` not found, you may need to load it first`);\n return _lang;\n }\n function getTheme(name) {\n if (name === \"none\")\n return { bg: \"\", fg: \"\", name: \"none\", settings: [], type: \"dark\" };\n ensureNotDisposed();\n const _theme = _registry.getTheme(name);\n if (!_theme)\n throw new ShikiError(`Theme \\`${name}\\` not found, you may need to load it first`);\n return _theme;\n }\n function setTheme(name) {\n ensureNotDisposed();\n const theme = getTheme(name);\n if (_lastTheme !== name) {\n _registry.setTheme(theme);\n _lastTheme = name;\n }\n const colorMap = _registry.getColorMap();\n return {\n theme,\n colorMap\n };\n }\n function getLoadedThemes() {\n ensureNotDisposed();\n return _registry.getLoadedThemes();\n }\n function getLoadedLanguages() {\n ensureNotDisposed();\n return _registry.getLoadedLanguages();\n }\n function loadLanguageSync(...langs2) {\n ensureNotDisposed();\n _registry.loadLanguages(langs2.flat(1));\n }\n async function loadLanguage(...langs2) {\n return loadLanguageSync(await resolveLangs(langs2));\n }\n function loadThemeSync(...themes2) {\n ensureNotDisposed();\n for (const theme of themes2.flat(1)) {\n _registry.loadTheme(theme);\n }\n }\n async function loadTheme(...themes2) {\n ensureNotDisposed();\n return loadThemeSync(await resolveThemes(themes2));\n }\n function ensureNotDisposed() {\n if (isDisposed)\n throw new ShikiError(\"Shiki instance has been disposed\");\n }\n function dispose() {\n if (isDisposed)\n return;\n isDisposed = true;\n _registry.dispose();\n instancesCount -= 1;\n }\n return {\n setTheme,\n getTheme,\n getLanguage,\n getLoadedThemes,\n getLoadedLanguages,\n resolveLangAlias: resolveLangAlias$1,\n loadLanguage,\n loadLanguageSync,\n loadTheme,\n loadThemeSync,\n dispose,\n [Symbol.dispose]: dispose\n };\n}\n\nasync function createShikiInternal(options) {\n if (!options.engine) {\n warnDeprecated(\"`engine` option is required. Use `createOnigurumaEngine` or `createJavaScriptRegexEngine` to create an engine.\");\n }\n const [\n themes,\n langs,\n engine\n ] = await Promise.all([\n resolveThemes(options.themes || []),\n resolveLangs(options.langs || []),\n options.engine\n ]);\n return createShikiInternalSync({\n ...options,\n themes,\n langs,\n engine\n });\n}\n\nasync function createHighlighterCore(options) {\n const internal = await createShikiInternal(options);\n return {\n getLastGrammarState: (...args) => getLastGrammarState(internal, ...args),\n codeToTokensBase: (code, options2) => codeToTokensBase(internal, code, options2),\n codeToTokensWithThemes: (code, options2) => codeToTokensWithThemes(internal, code, options2),\n codeToTokens: (code, options2) => codeToTokens(internal, code, options2),\n codeToHast: (code, options2) => codeToHast(internal, code, options2),\n codeToHtml: (code, options2) => codeToHtml(internal, code, options2),\n getBundledLanguages: () => ({}),\n getBundledThemes: () => ({}),\n ...internal,\n getInternalContext: () => internal\n };\n}\nfunction createHighlighterCoreSync(options) {\n const internal = createShikiInternalSync(options);\n return {\n getLastGrammarState: (...args) => getLastGrammarState(internal, ...args),\n codeToTokensBase: (code, options2) => codeToTokensBase(internal, code, options2),\n codeToTokensWithThemes: (code, options2) => codeToTokensWithThemes(internal, code, options2),\n codeToTokens: (code, options2) => codeToTokens(internal, code, options2),\n codeToHast: (code, options2) => codeToHast(internal, code, options2),\n codeToHtml: (code, options2) => codeToHtml(internal, code, options2),\n getBundledLanguages: () => ({}),\n getBundledThemes: () => ({}),\n ...internal,\n getInternalContext: () => internal\n };\n}\nfunction makeSingletonHighlighterCore(createHighlighter) {\n let _shiki;\n async function getSingletonHighlighterCore2(options) {\n if (!_shiki) {\n _shiki = createHighlighter({\n ...options,\n themes: options.themes || [],\n langs: options.langs || []\n });\n return _shiki;\n } else {\n const s = await _shiki;\n await Promise.all([\n s.loadTheme(...options.themes || []),\n s.loadLanguage(...options.langs || [])\n ]);\n return s;\n }\n }\n return getSingletonHighlighterCore2;\n}\nconst getSingletonHighlighterCore = /* @__PURE__ */ makeSingletonHighlighterCore(createHighlighterCore);\n\nfunction createBundledHighlighter(options) {\n const bundledLanguages = options.langs;\n const bundledThemes = options.themes;\n const engine = options.engine;\n async function createHighlighter(options2) {\n function resolveLang(lang) {\n if (typeof lang === \"string\") {\n lang = options2.langAlias?.[lang] || lang;\n if (isSpecialLang(lang))\n return [];\n const bundle = bundledLanguages[lang];\n if (!bundle)\n throw new ShikiError$1(`Language \\`${lang}\\` is not included in this bundle. You may want to load it from external source.`);\n return bundle;\n }\n return lang;\n }\n function resolveTheme(theme) {\n if (isSpecialTheme(theme))\n return \"none\";\n if (typeof theme === \"string\") {\n const bundle = bundledThemes[theme];\n if (!bundle)\n throw new ShikiError$1(`Theme \\`${theme}\\` is not included in this bundle. You may want to load it from external source.`);\n return bundle;\n }\n return theme;\n }\n const _themes = (options2.themes ?? []).map((i) => resolveTheme(i));\n const langs = (options2.langs ?? []).map((i) => resolveLang(i));\n const core = await createHighlighterCore({\n engine: options2.engine ?? engine(),\n ...options2,\n themes: _themes,\n langs\n });\n return {\n ...core,\n loadLanguage(...langs2) {\n return core.loadLanguage(...langs2.map(resolveLang));\n },\n loadTheme(...themes) {\n return core.loadTheme(...themes.map(resolveTheme));\n },\n getBundledLanguages() {\n return bundledLanguages;\n },\n getBundledThemes() {\n return bundledThemes;\n }\n };\n }\n return createHighlighter;\n}\nfunction makeSingletonHighlighter(createHighlighter) {\n let _shiki;\n async function getSingletonHighlighter(options = {}) {\n if (!_shiki) {\n _shiki = createHighlighter({\n ...options,\n themes: [],\n langs: []\n });\n const s = await _shiki;\n await Promise.all([\n s.loadTheme(...options.themes || []),\n s.loadLanguage(...options.langs || [])\n ]);\n return s;\n } else {\n const s = await _shiki;\n await Promise.all([\n s.loadTheme(...options.themes || []),\n s.loadLanguage(...options.langs || [])\n ]);\n return s;\n }\n }\n return getSingletonHighlighter;\n}\nfunction createSingletonShorthands(createHighlighter, config) {\n const getSingletonHighlighter = makeSingletonHighlighter(createHighlighter);\n async function get(code, options) {\n const shiki = await getSingletonHighlighter({\n langs: [options.lang],\n themes: \"theme\" in options ? [options.theme] : Object.values(options.themes)\n });\n const langs = await config?.guessEmbeddedLanguages?.(code, options.lang, shiki);\n if (langs) {\n await shiki.loadLanguage(...langs);\n }\n return shiki;\n }\n return {\n getSingletonHighlighter(options) {\n return getSingletonHighlighter(options);\n },\n async codeToHtml(code, options) {\n const shiki = await get(code, options);\n return shiki.codeToHtml(code, options);\n },\n async codeToHast(code, options) {\n const shiki = await get(code, options);\n return shiki.codeToHast(code, options);\n },\n async codeToTokens(code, options) {\n const shiki = await get(code, options);\n return shiki.codeToTokens(code, options);\n },\n async codeToTokensBase(code, options) {\n const shiki = await get(code, options);\n return shiki.codeToTokensBase(code, options);\n },\n async codeToTokensWithThemes(code, options) {\n const shiki = await get(code, options);\n return shiki.codeToTokensWithThemes(code, options);\n },\n async getLastGrammarState(code, options) {\n const shiki = await getSingletonHighlighter({\n langs: [options.lang],\n themes: [options.theme]\n });\n return shiki.getLastGrammarState(code, options);\n }\n };\n}\nconst createdBundledHighlighter = createBundledHighlighter;\n\nfunction createCssVariablesTheme(options = {}) {\n const {\n name = \"css-variables\",\n variablePrefix = \"--shiki-\",\n fontStyle = true\n } = options;\n const variable = (name2) => {\n if (options.variableDefaults?.[name2])\n return `var(${variablePrefix}${name2}, ${options.variableDefaults[name2]})`;\n return `var(${variablePrefix}${name2})`;\n };\n const theme = {\n name,\n type: \"dark\",\n colors: {\n \"editor.foreground\": variable(\"foreground\"),\n \"editor.background\": variable(\"background\"),\n \"terminal.ansiBlack\": variable(\"ansi-black\"),\n \"terminal.ansiRed\": variable(\"ansi-red\"),\n \"terminal.ansiGreen\": variable(\"ansi-green\"),\n \"terminal.ansiYellow\": variable(\"ansi-yellow\"),\n \"terminal.ansiBlue\": variable(\"ansi-blue\"),\n \"terminal.ansiMagenta\": variable(\"ansi-magenta\"),\n \"terminal.ansiCyan\": variable(\"ansi-cyan\"),\n \"terminal.ansiWhite\": variable(\"ansi-white\"),\n \"terminal.ansiBrightBlack\": variable(\"ansi-bright-black\"),\n \"terminal.ansiBrightRed\": variable(\"ansi-bright-red\"),\n \"terminal.ansiBrightGreen\": variable(\"ansi-bright-green\"),\n \"terminal.ansiBrightYellow\": variable(\"ansi-bright-yellow\"),\n \"terminal.ansiBrightBlue\": variable(\"ansi-bright-blue\"),\n \"terminal.ansiBrightMagenta\": variable(\"ansi-bright-magenta\"),\n \"terminal.ansiBrightCyan\": variable(\"ansi-bright-cyan\"),\n \"terminal.ansiBrightWhite\": variable(\"ansi-bright-white\")\n },\n tokenColors: [\n {\n scope: [\n \"keyword.operator.accessor\",\n \"meta.group.braces.round.function.arguments\",\n \"meta.template.expression\",\n \"markup.fenced_code meta.embedded.block\"\n ],\n settings: {\n foreground: variable(\"foreground\")\n }\n },\n {\n scope: \"emphasis\",\n settings: {\n fontStyle: \"italic\"\n }\n },\n {\n scope: [\"strong\", \"markup.heading.markdown\", \"markup.bold.markdown\"],\n settings: {\n fontStyle: \"bold\"\n }\n },\n {\n scope: [\"markup.italic.markdown\"],\n settings: {\n fontStyle: \"italic\"\n }\n },\n {\n scope: \"meta.link.inline.markdown\",\n settings: {\n fontStyle: \"underline\",\n foreground: variable(\"token-link\")\n }\n },\n {\n scope: [\"string\", \"markup.fenced_code\", \"markup.inline\"],\n settings: {\n foreground: variable(\"token-string\")\n }\n },\n {\n scope: [\"comment\", \"string.quoted.docstring.multi\"],\n settings: {\n foreground: variable(\"token-comment\")\n }\n },\n {\n scope: [\n \"constant.numeric\",\n \"constant.language\",\n \"constant.other.placeholder\",\n \"constant.character.format.placeholder\",\n \"variable.language.this\",\n \"variable.other.object\",\n \"variable.other.class\",\n \"variable.other.constant\",\n \"meta.property-name\",\n \"meta.property-value\",\n \"support\"\n ],\n settings: {\n foreground: variable(\"token-constant\")\n }\n },\n {\n scope: [\n \"keyword\",\n \"storage.modifier\",\n \"storage.type\",\n \"storage.control.clojure\",\n \"entity.name.function.clojure\",\n \"entity.name.tag.yaml\",\n \"support.function.node\",\n \"support.type.property-name.json\",\n \"punctuation.separator.key-value\",\n \"punctuation.definition.template-expression\"\n ],\n settings: {\n foreground: variable(\"token-keyword\")\n }\n },\n {\n scope: \"variable.parameter.function\",\n settings: {\n foreground: variable(\"token-parameter\")\n }\n },\n {\n scope: [\n \"support.function\",\n \"entity.name.type\",\n \"entity.other.inherited-class\",\n \"meta.function-call\",\n \"meta.instance.constructor\",\n \"entity.other.attribute-name\",\n \"entity.name.function\",\n \"constant.keyword.clojure\"\n ],\n settings: {\n foreground: variable(\"token-function\")\n }\n },\n {\n scope: [\n \"entity.name.tag\",\n \"string.quoted\",\n \"string.regexp\",\n \"string.interpolated\",\n \"string.template\",\n \"string.unquoted.plain.out.yaml\",\n \"keyword.other.template\"\n ],\n settings: {\n foreground: variable(\"token-string-expression\")\n }\n },\n {\n scope: [\n \"punctuation.definition.arguments\",\n \"punctuation.definition.dict\",\n \"punctuation.separator\",\n \"meta.function-call.arguments\"\n ],\n settings: {\n foreground: variable(\"token-punctuation\")\n }\n },\n {\n // [Custom] Markdown links\n scope: [\n \"markup.underline.link\",\n \"punctuation.definition.metadata.markdown\"\n ],\n settings: {\n foreground: variable(\"token-link\")\n }\n },\n {\n // [Custom] Markdown list\n scope: [\"beginning.punctuation.definition.list.markdown\"],\n settings: {\n foreground: variable(\"token-string\")\n }\n },\n {\n // [Custom] Markdown punctuation definition brackets\n scope: [\n \"punctuation.definition.string.begin.markdown\",\n \"punctuation.definition.string.end.markdown\",\n \"string.other.link.title.markdown\",\n \"string.other.link.description.markdown\"\n ],\n settings: {\n foreground: variable(\"token-keyword\")\n }\n },\n {\n // [Custom] Diff\n scope: [\n \"markup.inserted\",\n \"meta.diff.header.to-file\",\n \"punctuation.definition.inserted\"\n ],\n settings: {\n foreground: variable(\"token-inserted\")\n }\n },\n {\n scope: [\n \"markup.deleted\",\n \"meta.diff.header.from-file\",\n \"punctuation.definition.deleted\"\n ],\n settings: {\n foreground: variable(\"token-deleted\")\n }\n },\n {\n scope: [\n \"markup.changed\",\n \"punctuation.definition.changed\"\n ],\n settings: {\n foreground: variable(\"token-changed\")\n }\n }\n ]\n };\n if (!fontStyle) {\n theme.tokenColors = theme.tokenColors?.map((tokenColor) => {\n if (tokenColor.settings?.fontStyle)\n delete tokenColor.settings.fontStyle;\n return tokenColor;\n });\n }\n return theme;\n}\n\nexport { addClassToHast, applyColorReplacements, codeToHast, codeToHtml, codeToTokens, codeToTokensBase, codeToTokensWithThemes, createBundledHighlighter, createCssVariablesTheme, createHighlighterCore, createHighlighterCoreSync, createPositionConverter, createShikiInternal, createShikiInternalSync, createSingletonShorthands, createdBundledHighlighter, enableDeprecationWarnings, flatTokenVariants, getSingletonHighlighterCore, getTokenStyleObject, guessEmbeddedLanguages, hastToHtml, isNoneTheme, isPlainLang, isSpecialLang, isSpecialTheme, makeSingletonHighlighter, makeSingletonHighlighterCore, normalizeGetter, normalizeTheme, resolveColorReplacements, splitLines, splitToken, splitTokens, stringifyTokenStyle, toArray, tokenizeAnsiWithTheme, tokenizeWithTheme, tokensToHast, transformerDecorations, warnDeprecated };\n","class ShikiError extends Error {\n constructor(message) {\n super(message);\n this.name = \"ShikiError\";\n }\n}\n\nexport { ShikiError };\n","// src/utils.ts\nfunction clone(something) {\n return doClone(something);\n}\nfunction doClone(something) {\n if (Array.isArray(something)) {\n return cloneArray(something);\n }\n if (something instanceof RegExp) {\n return something;\n }\n if (typeof something === \"object\") {\n return cloneObj(something);\n }\n return something;\n}\nfunction cloneArray(arr) {\n let r = [];\n for (let i = 0, len = arr.length; i < len; i++) {\n r[i] = doClone(arr[i]);\n }\n return r;\n}\nfunction cloneObj(obj) {\n let r = {};\n for (let key in obj) {\n r[key] = doClone(obj[key]);\n }\n return r;\n}\nfunction mergeObjects(target, ...sources) {\n sources.forEach((source) => {\n for (let key in source) {\n target[key] = source[key];\n }\n });\n return target;\n}\nfunction basename(path) {\n const idx = ~path.lastIndexOf(\"/\") || ~path.lastIndexOf(\"\\\\\");\n if (idx === 0) {\n return path;\n } else if (~idx === path.length - 1) {\n return basename(path.substring(0, path.length - 1));\n } else {\n return path.substr(~idx + 1);\n }\n}\nvar CAPTURING_REGEX_SOURCE = /\\$(\\d+)|\\${(\\d+):\\/(downcase|upcase)}/g;\nvar RegexSource = class {\n static hasCaptures(regexSource) {\n if (regexSource === null) {\n return false;\n }\n CAPTURING_REGEX_SOURCE.lastIndex = 0;\n return CAPTURING_REGEX_SOURCE.test(regexSource);\n }\n static replaceCaptures(regexSource, captureSource, captureIndices) {\n return regexSource.replace(CAPTURING_REGEX_SOURCE, (match, index, commandIndex, command) => {\n let capture = captureIndices[parseInt(index || commandIndex, 10)];\n if (capture) {\n let result = captureSource.substring(capture.start, capture.end);\n while (result[0] === \".\") {\n result = result.substring(1);\n }\n switch (command) {\n case \"downcase\":\n return result.toLowerCase();\n case \"upcase\":\n return result.toUpperCase();\n default:\n return result;\n }\n } else {\n return match;\n }\n });\n }\n};\nfunction strcmp(a, b) {\n if (a < b) {\n return -1;\n }\n if (a > b) {\n return 1;\n }\n return 0;\n}\nfunction strArrCmp(a, b) {\n if (a === null && b === null) {\n return 0;\n }\n if (!a) {\n return -1;\n }\n if (!b) {\n return 1;\n }\n let len1 = a.length;\n let len2 = b.length;\n if (len1 === len2) {\n for (let i = 0; i < len1; i++) {\n let res = strcmp(a[i], b[i]);\n if (res !== 0) {\n return res;\n }\n }\n return 0;\n }\n return len1 - len2;\n}\nfunction isValidHexColor(hex) {\n if (/^#[0-9a-f]{6}$/i.test(hex)) {\n return true;\n }\n if (/^#[0-9a-f]{8}$/i.test(hex)) {\n return true;\n }\n if (/^#[0-9a-f]{3}$/i.test(hex)) {\n return true;\n }\n if (/^#[0-9a-f]{4}$/i.test(hex)) {\n return true;\n }\n return false;\n}\nfunction escapeRegExpCharacters(value) {\n return value.replace(/[\\-\\\\\\{\\}\\*\\+\\?\\|\\^\\$\\.\\,\\[\\]\\(\\)\\#\\s]/g, \"\\\\$&\");\n}\nvar CachedFn = class {\n constructor(fn) {\n this.fn = fn;\n }\n cache = /* @__PURE__ */ new Map();\n get(key) {\n if (this.cache.has(key)) {\n return this.cache.get(key);\n }\n const value = this.fn(key);\n this.cache.set(key, value);\n return value;\n }\n};\n\n// src/theme.ts\nvar Theme = class {\n constructor(_colorMap, _defaults, _root) {\n this._colorMap = _colorMap;\n this._defaults = _defaults;\n this._root = _root;\n }\n static createFromRawTheme(source, colorMap) {\n return this.createFromParsedTheme(parseTheme(source), colorMap);\n }\n static createFromParsedTheme(source, colorMap) {\n return resolveParsedThemeRules(source, colorMap);\n }\n _cachedMatchRoot = new CachedFn(\n (scopeName) => this._root.match(scopeName)\n );\n getColorMap() {\n return this._colorMap.getColorMap();\n }\n getDefaults() {\n return this._defaults;\n }\n match(scopePath) {\n if (scopePath === null) {\n return this._defaults;\n }\n const scopeName = scopePath.scopeName;\n const matchingTrieElements = this._cachedMatchRoot.get(scopeName);\n const effectiveRule = matchingTrieElements.find(\n (v) => _scopePathMatchesParentScopes(scopePath.parent, v.parentScopes)\n );\n if (!effectiveRule) {\n return null;\n }\n return new StyleAttributes(\n effectiveRule.fontStyle,\n effectiveRule.foreground,\n effectiveRule.background\n );\n }\n};\nvar ScopeStack = class _ScopeStack {\n constructor(parent, scopeName) {\n this.parent = parent;\n this.scopeName = scopeName;\n }\n static push(path, scopeNames) {\n for (const name of scopeNames) {\n path = new _ScopeStack(path, name);\n }\n return path;\n }\n static from(...segments) {\n let result = null;\n for (let i = 0; i < segments.length; i++) {\n result = new _ScopeStack(result, segments[i]);\n }\n return result;\n }\n push(scopeName) {\n return new _ScopeStack(this, scopeName);\n }\n getSegments() {\n let item = this;\n const result = [];\n while (item) {\n result.push(item.scopeName);\n item = item.parent;\n }\n result.reverse();\n return result;\n }\n toString() {\n return this.getSegments().join(\" \");\n }\n extends(other) {\n if (this === other) {\n return true;\n }\n if (this.parent === null) {\n return false;\n }\n return this.parent.extends(other);\n }\n getExtensionIfDefined(base) {\n const result = [];\n let item = this;\n while (item && item !== base) {\n result.push(item.scopeName);\n item = item.parent;\n }\n return item === base ? result.reverse() : void 0;\n }\n};\nfunction _scopePathMatchesParentScopes(scopePath, parentScopes) {\n if (parentScopes.length === 0) {\n return true;\n }\n for (let index = 0; index < parentScopes.length; index++) {\n let scopePattern = parentScopes[index];\n let scopeMustMatch = false;\n if (scopePattern === \">\") {\n if (index === parentScopes.length - 1) {\n return false;\n }\n scopePattern = parentScopes[++index];\n scopeMustMatch = true;\n }\n while (scopePath) {\n if (_matchesScope(scopePath.scopeName, scopePattern)) {\n break;\n }\n if (scopeMustMatch) {\n return false;\n }\n scopePath = scopePath.parent;\n }\n if (!scopePath) {\n return false;\n }\n scopePath = scopePath.parent;\n }\n return true;\n}\nfunction _matchesScope(scopeName, scopePattern) {\n return scopePattern === scopeName || scopeName.startsWith(scopePattern) && scopeName[scopePattern.length] === \".\";\n}\nvar StyleAttributes = class {\n constructor(fontStyle, foregroundId, backgroundId) {\n this.fontStyle = fontStyle;\n this.foregroundId = foregroundId;\n this.backgroundId = backgroundId;\n }\n};\nfunction parseTheme(source) {\n if (!source) {\n return [];\n }\n if (!source.settings || !Array.isArray(source.settings)) {\n return [];\n }\n let settings = source.settings;\n let result = [], resultLen = 0;\n for (let i = 0, len = settings.length; i < len; i++) {\n let entry = settings[i];\n if (!entry.settings) {\n continue;\n }\n let scopes;\n if (typeof entry.scope === \"string\") {\n let _scope = entry.scope;\n _scope = _scope.replace(/^[,]+/, \"\");\n _scope = _scope.replace(/[,]+$/, \"\");\n scopes = _scope.split(\",\");\n } else if (Array.isArray(entry.scope)) {\n scopes = entry.scope;\n } else {\n scopes = [\"\"];\n }\n let fontStyle = -1 /* NotSet */;\n if (typeof entry.settings.fontStyle === \"string\") {\n fontStyle = 0 /* None */;\n let segments = entry.settings.fontStyle.split(\" \");\n for (let j = 0, lenJ = segments.length; j < lenJ; j++) {\n let segment = segments[j];\n switch (segment) {\n case \"italic\":\n fontStyle = fontStyle | 1 /* Italic */;\n break;\n case \"bold\":\n fontStyle = fontStyle | 2 /* Bold */;\n break;\n case \"underline\":\n fontStyle = fontStyle | 4 /* Underline */;\n break;\n case \"strikethrough\":\n fontStyle = fontStyle | 8 /* Strikethrough */;\n break;\n }\n }\n }\n let foreground = null;\n if (typeof entry.settings.foreground === \"string\" && isValidHexColor(entry.settings.foreground)) {\n foreground = entry.settings.foreground;\n }\n let background = null;\n if (typeof entry.settings.background === \"string\" && isValidHexColor(entry.settings.background)) {\n background = entry.settings.background;\n }\n for (let j = 0, lenJ = scopes.length; j < lenJ; j++) {\n let _scope = scopes[j].trim();\n let segments = _scope.split(\" \");\n let scope = segments[segments.length - 1];\n let parentScopes = null;\n if (segments.length > 1) {\n parentScopes = segments.slice(0, segments.length - 1);\n parentScopes.reverse();\n }\n result[resultLen++] = new ParsedThemeRule(\n scope,\n parentScopes,\n i,\n fontStyle,\n foreground,\n background\n );\n }\n }\n return result;\n}\nvar ParsedThemeRule = class {\n constructor(scope, parentScopes, index, fontStyle, foreground, background) {\n this.scope = scope;\n this.parentScopes = parentScopes;\n this.index = index;\n this.fontStyle = fontStyle;\n this.foreground = foreground;\n this.background = background;\n }\n};\nvar FontStyle = /* @__PURE__ */ ((FontStyle2) => {\n FontStyle2[FontStyle2[\"NotSet\"] = -1] = \"NotSet\";\n FontStyle2[FontStyle2[\"None\"] = 0] = \"None\";\n FontStyle2[FontStyle2[\"Italic\"] = 1] = \"Italic\";\n FontStyle2[FontStyle2[\"Bold\"] = 2] = \"Bold\";\n FontStyle2[FontStyle2[\"Underline\"] = 4] = \"Underline\";\n FontStyle2[FontStyle2[\"Strikethrough\"] = 8] = \"Strikethrough\";\n return FontStyle2;\n})(FontStyle || {});\nfunction resolveParsedThemeRules(parsedThemeRules, _colorMap) {\n parsedThemeRules.sort((a, b) => {\n let r = strcmp(a.scope, b.scope);\n if (r !== 0) {\n return r;\n }\n r = strArrCmp(a.parentScopes, b.parentScopes);\n if (r !== 0) {\n return r;\n }\n return a.index - b.index;\n });\n let defaultFontStyle = 0 /* None */;\n let defaultForeground = \"#000000\";\n let defaultBackground = \"#ffffff\";\n while (parsedThemeRules.length >= 1 && parsedThemeRules[0].scope === \"\") {\n let incomingDefaults = parsedThemeRules.shift();\n if (incomingDefaults.fontStyle !== -1 /* NotSet */) {\n defaultFontStyle = incomingDefaults.fontStyle;\n }\n if (incomingDefaults.foreground !== null) {\n defaultForeground = incomingDefaults.foreground;\n }\n if (incomingDefaults.background !== null) {\n defaultBackground = incomingDefaults.background;\n }\n }\n let colorMap = new ColorMap(_colorMap);\n let defaults = new StyleAttributes(defaultFontStyle, colorMap.getId(defaultForeground), colorMap.getId(defaultBackground));\n let root = new ThemeTrieElement(new ThemeTrieElementRule(0, null, -1 /* NotSet */, 0, 0), []);\n for (let i = 0, len = parsedThemeRules.length; i < len; i++) {\n let rule = parsedThemeRules[i];\n root.insert(0, rule.scope, rule.parentScopes, rule.fontStyle, colorMap.getId(rule.foreground), colorMap.getId(rule.background));\n }\n return new Theme(colorMap, defaults, root);\n}\nvar ColorMap = class {\n _isFrozen;\n _lastColorId;\n _id2color;\n _color2id;\n constructor(_colorMap) {\n this._lastColorId = 0;\n this._id2color = [];\n this._color2id = /* @__PURE__ */ Object.create(null);\n if (Array.isArray(_colorMap)) {\n this._isFrozen = true;\n for (let i = 0, len = _colorMap.length; i < len; i++) {\n this._color2id[_colorMap[i]] = i;\n this._id2color[i] = _colorMap[i];\n }\n } else {\n this._isFrozen = false;\n }\n }\n getId(color) {\n if (color === null) {\n return 0;\n }\n color = color.toUpperCase();\n let value = this._color2id[color];\n if (value) {\n return value;\n }\n if (this._isFrozen) {\n throw new Error(`Missing color in color map - ${color}`);\n }\n value = ++this._lastColorId;\n this._color2id[color] = value;\n this._id2color[value] = color;\n return value;\n }\n getColorMap() {\n return this._id2color.slice(0);\n }\n};\nvar emptyParentScopes = Object.freeze([]);\nvar ThemeTrieElementRule = class _ThemeTrieElementRule {\n scopeDepth;\n parentScopes;\n fontStyle;\n foreground;\n background;\n constructor(scopeDepth, parentScopes, fontStyle, foreground, background) {\n this.scopeDepth = scopeDepth;\n this.parentScopes = parentScopes || emptyParentScopes;\n this.fontStyle = fontStyle;\n this.foreground = foreground;\n this.background = background;\n }\n clone() {\n return new _ThemeTrieElementRule(this.scopeDepth, this.parentScopes, this.fontStyle, this.foreground, this.background);\n }\n static cloneArr(arr) {\n let r = [];\n for (let i = 0, len = arr.length; i < len; i++) {\n r[i] = arr[i].clone();\n }\n return r;\n }\n acceptOverwrite(scopeDepth, fontStyle, foreground, background) {\n if (this.scopeDepth > scopeDepth) {\n console.log(\"how did this happen?\");\n } else {\n this.scopeDepth = scopeDepth;\n }\n if (fontStyle !== -1 /* NotSet */) {\n this.fontStyle = fontStyle;\n }\n if (foreground !== 0) {\n this.foreground = foreground;\n }\n if (background !== 0) {\n this.background = background;\n }\n }\n};\nvar ThemeTrieElement = class _ThemeTrieElement {\n constructor(_mainRule, rulesWithParentScopes = [], _children = {}) {\n this._mainRule = _mainRule;\n this._children = _children;\n this._rulesWithParentScopes = rulesWithParentScopes;\n }\n _rulesWithParentScopes;\n static _cmpBySpecificity(a, b) {\n if (a.scopeDepth !== b.scopeDepth) {\n return b.scopeDepth - a.scopeDepth;\n }\n let aParentIndex = 0;\n let bParentIndex = 0;\n while (true) {\n if (a.parentScopes[aParentIndex] === \">\") {\n aParentIndex++;\n }\n if (b.parentScopes[bParentIndex] === \">\") {\n bParentIndex++;\n }\n if (aParentIndex >= a.parentScopes.length || bParentIndex >= b.parentScopes.length) {\n break;\n }\n const parentScopeLengthDiff = b.parentScopes[bParentIndex].length - a.parentScopes[aParentIndex].length;\n if (parentScopeLengthDiff !== 0) {\n return parentScopeLengthDiff;\n }\n aParentIndex++;\n bParentIndex++;\n }\n return b.parentScopes.length - a.parentScopes.length;\n }\n match(scope) {\n if (scope !== \"\") {\n let dotIndex = scope.indexOf(\".\");\n let head;\n let tail;\n if (dotIndex === -1) {\n head = scope;\n tail = \"\";\n } else {\n head = scope.substring(0, dotIndex);\n tail = scope.substring(dotIndex + 1);\n }\n if (this._children.hasOwnProperty(head)) {\n return this._children[head].match(tail);\n }\n }\n const rules = this._rulesWithParentScopes.concat(this._mainRule);\n rules.sort(_ThemeTrieElement._cmpBySpecificity);\n return rules;\n }\n insert(scopeDepth, scope, parentScopes, fontStyle, foreground, background) {\n if (scope === \"\") {\n this._doInsertHere(scopeDepth, parentScopes, fontStyle, foreground, background);\n return;\n }\n let dotIndex = scope.indexOf(\".\");\n let head;\n let tail;\n if (dotIndex === -1) {\n head = scope;\n tail = \"\";\n } else {\n head = scope.substring(0, dotIndex);\n tail = scope.substring(dotIndex + 1);\n }\n let child;\n if (this._children.hasOwnProperty(head)) {\n child = this._children[head];\n } else {\n child = new _ThemeTrieElement(this._mainRule.clone(), ThemeTrieElementRule.cloneArr(this._rulesWithParentScopes));\n this._children[head] = child;\n }\n child.insert(scopeDepth + 1, tail, parentScopes, fontStyle, foreground, background);\n }\n _doInsertHere(scopeDepth, parentScopes, fontStyle, foreground, background) {\n if (parentScopes === null) {\n this._mainRule.acceptOverwrite(scopeDepth, fontStyle, foreground, background);\n return;\n }\n for (let i = 0, len = this._rulesWithParentScopes.length; i < len; i++) {\n let rule = this._rulesWithParentScopes[i];\n if (strArrCmp(rule.parentScopes, parentScopes) === 0) {\n rule.acceptOverwrite(scopeDepth, fontStyle, foreground, background);\n return;\n }\n }\n if (fontStyle === -1 /* NotSet */) {\n fontStyle = this._mainRule.fontStyle;\n }\n if (foreground === 0) {\n foreground = this._mainRule.foreground;\n }\n if (background === 0) {\n background = this._mainRule.background;\n }\n this._rulesWithParentScopes.push(new ThemeTrieElementRule(scopeDepth, parentScopes, fontStyle, foreground, background));\n }\n};\n\n// src/encodedTokenAttributes.ts\nvar EncodedTokenMetadata = class _EncodedTokenMetadata {\n static toBinaryStr(encodedTokenAttributes) {\n return encodedTokenAttributes.toString(2).padStart(32, \"0\");\n }\n static print(encodedTokenAttributes) {\n const languageId = _EncodedTokenMetadata.getLanguageId(encodedTokenAttributes);\n const tokenType = _EncodedTokenMetadata.getTokenType(encodedTokenAttributes);\n const fontStyle = _EncodedTokenMetadata.getFontStyle(encodedTokenAttributes);\n const foreground = _EncodedTokenMetadata.getForeground(encodedTokenAttributes);\n const background = _EncodedTokenMetadata.getBackground(encodedTokenAttributes);\n console.log({\n languageId,\n tokenType,\n fontStyle,\n foreground,\n background\n });\n }\n static getLanguageId(encodedTokenAttributes) {\n return (encodedTokenAttributes & 255 /* LANGUAGEID_MASK */) >>> 0 /* LANGUAGEID_OFFSET */;\n }\n static getTokenType(encodedTokenAttributes) {\n return (encodedTokenAttributes & 768 /* TOKEN_TYPE_MASK */) >>> 8 /* TOKEN_TYPE_OFFSET */;\n }\n static containsBalancedBrackets(encodedTokenAttributes) {\n return (encodedTokenAttributes & 1024 /* BALANCED_BRACKETS_MASK */) !== 0;\n }\n static getFontStyle(encodedTokenAttributes) {\n return (encodedTokenAttributes & 30720 /* FONT_STYLE_MASK */) >>> 11 /* FONT_STYLE_OFFSET */;\n }\n static getForeground(encodedTokenAttributes) {\n return (encodedTokenAttributes & 16744448 /* FOREGROUND_MASK */) >>> 15 /* FOREGROUND_OFFSET */;\n }\n static getBackground(encodedTokenAttributes) {\n return (encodedTokenAttributes & 4278190080 /* BACKGROUND_MASK */) >>> 24 /* BACKGROUND_OFFSET */;\n }\n /**\n * Updates the fields in `metadata`.\n * A value of `0`, `NotSet` or `null` indicates that the corresponding field should be left as is.\n */\n static set(encodedTokenAttributes, languageId, tokenType, containsBalancedBrackets, fontStyle, foreground, background) {\n let _languageId = _EncodedTokenMetadata.getLanguageId(encodedTokenAttributes);\n let _tokenType = _EncodedTokenMetadata.getTokenType(encodedTokenAttributes);\n let _containsBalancedBracketsBit = _EncodedTokenMetadata.containsBalancedBrackets(encodedTokenAttributes) ? 1 : 0;\n let _fontStyle = _EncodedTokenMetadata.getFontStyle(encodedTokenAttributes);\n let _foreground = _EncodedTokenMetadata.getForeground(encodedTokenAttributes);\n let _background = _EncodedTokenMetadata.getBackground(encodedTokenAttributes);\n if (languageId !== 0) {\n _languageId = languageId;\n }\n if (tokenType !== 8 /* NotSet */) {\n _tokenType = fromOptionalTokenType(tokenType);\n }\n if (containsBalancedBrackets !== null) {\n _containsBalancedBracketsBit = containsBalancedBrackets ? 1 : 0;\n }\n if (fontStyle !== -1 /* NotSet */) {\n _fontStyle = fontStyle;\n }\n if (foreground !== 0) {\n _foreground = foreground;\n }\n if (background !== 0) {\n _background = background;\n }\n return (_languageId << 0 /* LANGUAGEID_OFFSET */ | _tokenType << 8 /* TOKEN_TYPE_OFFSET */ | _containsBalancedBracketsBit << 10 /* BALANCED_BRACKETS_OFFSET */ | _fontStyle << 11 /* FONT_STYLE_OFFSET */ | _foreground << 15 /* FOREGROUND_OFFSET */ | _background << 24 /* BACKGROUND_OFFSET */) >>> 0;\n }\n};\nfunction toOptionalTokenType(standardType) {\n return standardType;\n}\nfunction fromOptionalTokenType(standardType) {\n return standardType;\n}\n\n// src/matcher.ts\nfunction createMatchers(selector, matchesName) {\n const results = [];\n const tokenizer = newTokenizer(selector);\n let token = tokenizer.next();\n while (token !== null) {\n let priority = 0;\n if (token.length === 2 && token.charAt(1) === \":\") {\n switch (token.charAt(0)) {\n case \"R\":\n priority = 1;\n break;\n case \"L\":\n priority = -1;\n break;\n default:\n console.log(`Unknown priority ${token} in scope selector`);\n }\n token = tokenizer.next();\n }\n let matcher = parseConjunction();\n results.push({ matcher, priority });\n if (token !== \",\") {\n break;\n }\n token = tokenizer.next();\n }\n return results;\n function parseOperand() {\n if (token === \"-\") {\n token = tokenizer.next();\n const expressionToNegate = parseOperand();\n return (matcherInput) => !!expressionToNegate && !expressionToNegate(matcherInput);\n }\n if (token === \"(\") {\n token = tokenizer.next();\n const expressionInParents = parseInnerExpression();\n if (token === \")\") {\n token = tokenizer.next();\n }\n return expressionInParents;\n }\n if (isIdentifier(token)) {\n const identifiers = [];\n do {\n identifiers.push(token);\n token = tokenizer.next();\n } while (isIdentifier(token));\n return (matcherInput) => matchesName(identifiers, matcherInput);\n }\n return null;\n }\n function parseConjunction() {\n const matchers = [];\n let matcher = parseOperand();\n while (matcher) {\n matchers.push(matcher);\n matcher = parseOperand();\n }\n return (matcherInput) => matchers.every((matcher2) => matcher2(matcherInput));\n }\n function parseInnerExpression() {\n const matchers = [];\n let matcher = parseConjunction();\n while (matcher) {\n matchers.push(matcher);\n if (token === \"|\" || token === \",\") {\n do {\n token = tokenizer.next();\n } while (token === \"|\" || token === \",\");\n } else {\n break;\n }\n matcher = parseConjunction();\n }\n return (matcherInput) => matchers.some((matcher2) => matcher2(matcherInput));\n }\n}\nfunction isIdentifier(token) {\n return !!token && !!token.match(/[\\w\\.:]+/);\n}\nfunction newTokenizer(input) {\n let regex = /([LR]:|[\\w\\.:][\\w\\.:\\-]*|[\\,\\|\\-\\(\\)])/g;\n let match = regex.exec(input);\n return {\n next: () => {\n if (!match) {\n return null;\n }\n const res = match[0];\n match = regex.exec(input);\n return res;\n }\n };\n}\n\n// src/onigLib.ts\nvar FindOption = /* @__PURE__ */ ((FindOption2) => {\n FindOption2[FindOption2[\"None\"] = 0] = \"None\";\n FindOption2[FindOption2[\"NotBeginString\"] = 1] = \"NotBeginString\";\n FindOption2[FindOption2[\"NotEndString\"] = 2] = \"NotEndString\";\n FindOption2[FindOption2[\"NotBeginPosition\"] = 4] = \"NotBeginPosition\";\n FindOption2[FindOption2[\"DebugCall\"] = 8] = \"DebugCall\";\n return FindOption2;\n})(FindOption || {});\nfunction disposeOnigString(str) {\n if (typeof str.dispose === \"function\") {\n str.dispose();\n }\n}\n\n// src/grammar/grammarDependencies.ts\nvar TopLevelRuleReference = class {\n constructor(scopeName) {\n this.scopeName = scopeName;\n }\n toKey() {\n return this.scopeName;\n }\n};\nvar TopLevelRepositoryRuleReference = class {\n constructor(scopeName, ruleName) {\n this.scopeName = scopeName;\n this.ruleName = ruleName;\n }\n toKey() {\n return `${this.scopeName}#${this.ruleName}`;\n }\n};\nvar ExternalReferenceCollector = class {\n _references = [];\n _seenReferenceKeys = /* @__PURE__ */ new Set();\n get references() {\n return this._references;\n }\n visitedRule = /* @__PURE__ */ new Set();\n add(reference) {\n const key = reference.toKey();\n if (this._seenReferenceKeys.has(key)) {\n return;\n }\n this._seenReferenceKeys.add(key);\n this._references.push(reference);\n }\n};\nvar ScopeDependencyProcessor = class {\n constructor(repo, initialScopeName) {\n this.repo = repo;\n this.initialScopeName = initialScopeName;\n this.seenFullScopeRequests.add(this.initialScopeName);\n this.Q = [new TopLevelRuleReference(this.initialScopeName)];\n }\n seenFullScopeRequests = /* @__PURE__ */ new Set();\n seenPartialScopeRequests = /* @__PURE__ */ new Set();\n Q;\n processQueue() {\n const q = this.Q;\n this.Q = [];\n const deps = new ExternalReferenceCollector();\n for (const dep of q) {\n collectReferencesOfReference(dep, this.initialScopeName, this.repo, deps);\n }\n for (const dep of deps.references) {\n if (dep instanceof TopLevelRuleReference) {\n if (this.seenFullScopeRequests.has(dep.scopeName)) {\n continue;\n }\n this.seenFullScopeRequests.add(dep.scopeName);\n this.Q.push(dep);\n } else {\n if (this.seenFullScopeRequests.has(dep.scopeName)) {\n continue;\n }\n if (this.seenPartialScopeRequests.has(dep.toKey())) {\n continue;\n }\n this.seenPartialScopeRequests.add(dep.toKey());\n this.Q.push(dep);\n }\n }\n }\n};\nfunction collectReferencesOfReference(reference, baseGrammarScopeName, repo, result) {\n const selfGrammar = repo.lookup(reference.scopeName);\n if (!selfGrammar) {\n if (reference.scopeName === baseGrammarScopeName) {\n throw new Error(`No grammar provided for <${baseGrammarScopeName}>`);\n }\n return;\n }\n const baseGrammar = repo.lookup(baseGrammarScopeName);\n if (reference instanceof TopLevelRuleReference) {\n collectExternalReferencesInTopLevelRule({ baseGrammar, selfGrammar }, result);\n } else {\n collectExternalReferencesInTopLevelRepositoryRule(\n reference.ruleName,\n { baseGrammar, selfGrammar, repository: selfGrammar.repository },\n result\n );\n }\n const injections = repo.injections(reference.scopeName);\n if (injections) {\n for (const injection of injections) {\n result.add(new TopLevelRuleReference(injection));\n }\n }\n}\nfunction collectExternalReferencesInTopLevelRepositoryRule(ruleName, context, result) {\n if (context.repository && context.repository[ruleName]) {\n const rule = context.repository[ruleName];\n collectExternalReferencesInRules([rule], context, result);\n }\n}\nfunction collectExternalReferencesInTopLevelRule(context, result) {\n if (context.selfGrammar.patterns && Array.isArray(context.selfGrammar.patterns)) {\n collectExternalReferencesInRules(\n context.selfGrammar.patterns,\n { ...context, repository: context.selfGrammar.repository },\n result\n );\n }\n if (context.selfGrammar.injections) {\n collectExternalReferencesInRules(\n Object.values(context.selfGrammar.injections),\n { ...context, repository: context.selfGrammar.repository },\n result\n );\n }\n}\nfunction collectExternalReferencesInRules(rules, context, result) {\n for (const rule of rules) {\n if (result.visitedRule.has(rule)) {\n continue;\n }\n result.visitedRule.add(rule);\n const patternRepository = rule.repository ? mergeObjects({}, context.repository, rule.repository) : context.repository;\n if (Array.isArray(rule.patterns)) {\n collectExternalReferencesInRules(rule.patterns, { ...context, repository: patternRepository }, result);\n }\n const include = rule.include;\n if (!include) {\n continue;\n }\n const reference = parseInclude(include);\n switch (reference.kind) {\n case 0 /* Base */:\n collectExternalReferencesInTopLevelRule({ ...context, selfGrammar: context.baseGrammar }, result);\n break;\n case 1 /* Self */:\n collectExternalReferencesInTopLevelRule(context, result);\n break;\n case 2 /* RelativeReference */:\n collectExternalReferencesInTopLevelRepositoryRule(reference.ruleName, { ...context, repository: patternRepository }, result);\n break;\n case 3 /* TopLevelReference */:\n case 4 /* TopLevelRepositoryReference */:\n const selfGrammar = reference.scopeName === context.selfGrammar.scopeName ? context.selfGrammar : reference.scopeName === context.baseGrammar.scopeName ? context.baseGrammar : void 0;\n if (selfGrammar) {\n const newContext = { baseGrammar: context.baseGrammar, selfGrammar, repository: patternRepository };\n if (reference.kind === 4 /* TopLevelRepositoryReference */) {\n collectExternalReferencesInTopLevelRepositoryRule(reference.ruleName, newContext, result);\n } else {\n collectExternalReferencesInTopLevelRule(newContext, result);\n }\n } else {\n if (reference.kind === 4 /* TopLevelRepositoryReference */) {\n result.add(new TopLevelRepositoryRuleReference(reference.scopeName, reference.ruleName));\n } else {\n result.add(new TopLevelRuleReference(reference.scopeName));\n }\n }\n break;\n }\n }\n}\nvar BaseReference = class {\n kind = 0 /* Base */;\n};\nvar SelfReference = class {\n kind = 1 /* Self */;\n};\nvar RelativeReference = class {\n constructor(ruleName) {\n this.ruleName = ruleName;\n }\n kind = 2 /* RelativeReference */;\n};\nvar TopLevelReference = class {\n constructor(scopeName) {\n this.scopeName = scopeName;\n }\n kind = 3 /* TopLevelReference */;\n};\nvar TopLevelRepositoryReference = class {\n constructor(scopeName, ruleName) {\n this.scopeName = scopeName;\n this.ruleName = ruleName;\n }\n kind = 4 /* TopLevelRepositoryReference */;\n};\nfunction parseInclude(include) {\n if (include === \"$base\") {\n return new BaseReference();\n } else if (include === \"$self\") {\n return new SelfReference();\n }\n const indexOfSharp = include.indexOf(\"#\");\n if (indexOfSharp === -1) {\n return new TopLevelReference(include);\n } else if (indexOfSharp === 0) {\n return new RelativeReference(include.substring(1));\n } else {\n const scopeName = include.substring(0, indexOfSharp);\n const ruleName = include.substring(indexOfSharp + 1);\n return new TopLevelRepositoryReference(scopeName, ruleName);\n }\n}\n\n// src/rule.ts\nvar HAS_BACK_REFERENCES = /\\\\(\\d+)/;\nvar BACK_REFERENCING_END = /\\\\(\\d+)/g;\nvar ruleIdSymbol = Symbol(\"RuleId\");\nvar endRuleId = -1;\nvar whileRuleId = -2;\nfunction ruleIdFromNumber(id) {\n return id;\n}\nfunction ruleIdToNumber(id) {\n return id;\n}\nvar Rule = class {\n $location;\n id;\n _nameIsCapturing;\n _name;\n _contentNameIsCapturing;\n _contentName;\n constructor($location, id, name, contentName) {\n this.$location = $location;\n this.id = id;\n this._name = name || null;\n this._nameIsCapturing = RegexSource.hasCaptures(this._name);\n this._contentName = contentName || null;\n this._contentNameIsCapturing = RegexSource.hasCaptures(this._contentName);\n }\n get debugName() {\n const location = this.$location ? `${basename(this.$location.filename)}:${this.$location.line}` : \"unknown\";\n return `${this.constructor.name}#${this.id} @ ${location}`;\n }\n getName(lineText, captureIndices) {\n if (!this._nameIsCapturing || this._name === null || lineText === null || captureIndices === null) {\n return this._name;\n }\n return RegexSource.replaceCaptures(this._name, lineText, captureIndices);\n }\n getContentName(lineText, captureIndices) {\n if (!this._contentNameIsCapturing || this._contentName === null) {\n return this._contentName;\n }\n return RegexSource.replaceCaptures(this._contentName, lineText, captureIndices);\n }\n};\nvar CaptureRule = class extends Rule {\n retokenizeCapturedWithRuleId;\n constructor($location, id, name, contentName, retokenizeCapturedWithRuleId) {\n super($location, id, name, contentName);\n this.retokenizeCapturedWithRuleId = retokenizeCapturedWithRuleId;\n }\n dispose() {\n }\n collectPatterns(grammar, out) {\n throw new Error(\"Not supported!\");\n }\n compile(grammar, endRegexSource) {\n throw new Error(\"Not supported!\");\n }\n compileAG(grammar, endRegexSource, allowA, allowG) {\n throw new Error(\"Not supported!\");\n }\n};\nvar MatchRule = class extends Rule {\n _match;\n captures;\n _cachedCompiledPatterns;\n constructor($location, id, name, match, captures) {\n super($location, id, name, null);\n this._match = new RegExpSource(match, this.id);\n this.captures = captures;\n this._cachedCompiledPatterns = null;\n }\n dispose() {\n if (this._cachedCompiledPatterns) {\n this._cachedCompiledPatterns.dispose();\n this._cachedCompiledPatterns = null;\n }\n }\n get debugMatchRegExp() {\n return `${this._match.source}`;\n }\n collectPatterns(grammar, out) {\n out.push(this._match);\n }\n compile(grammar, endRegexSource) {\n return this._getCachedCompiledPatterns(grammar).compile(grammar);\n }\n compileAG(grammar, endRegexSource, allowA, allowG) {\n return this._getCachedCompiledPatterns(grammar).compileAG(grammar, allowA, allowG);\n }\n _getCachedCompiledPatterns(grammar) {\n if (!this._cachedCompiledPatterns) {\n this._cachedCompiledPatterns = new RegExpSourceList();\n this.collectPatterns(grammar, this._cachedCompiledPatterns);\n }\n return this._cachedCompiledPatterns;\n }\n};\nvar IncludeOnlyRule = class extends Rule {\n hasMissingPatterns;\n patterns;\n _cachedCompiledPatterns;\n constructor($location, id, name, contentName, patterns) {\n super($location, id, name, contentName);\n this.patterns = patterns.patterns;\n this.hasMissingPatterns = patterns.hasMissingPatterns;\n this._cachedCompiledPatterns = null;\n }\n dispose() {\n if (this._cachedCompiledPatterns) {\n this._cachedCompiledPatterns.dispose();\n this._cachedCompiledPatterns = null;\n }\n }\n collectPatterns(grammar, out) {\n for (const pattern of this.patterns) {\n const rule = grammar.getRule(pattern);\n rule.collectPatterns(grammar, out);\n }\n }\n compile(grammar, endRegexSource) {\n return this._getCachedCompiledPatterns(grammar).compile(grammar);\n }\n compileAG(grammar, endRegexSource, allowA, allowG) {\n return this._getCachedCompiledPatterns(grammar).compileAG(grammar, allowA, allowG);\n }\n _getCachedCompiledPatterns(grammar) {\n if (!this._cachedCompiledPatterns) {\n this._cachedCompiledPatterns = new RegExpSourceList();\n this.collectPatterns(grammar, this._cachedCompiledPatterns);\n }\n return this._cachedCompiledPatterns;\n }\n};\nvar BeginEndRule = class extends Rule {\n _begin;\n beginCaptures;\n _end;\n endHasBackReferences;\n endCaptures;\n applyEndPatternLast;\n hasMissingPatterns;\n patterns;\n _cachedCompiledPatterns;\n constructor($location, id, name, contentName, begin, beginCaptures, end, endCaptures, applyEndPatternLast, patterns) {\n super($location, id, name, contentName);\n this._begin = new RegExpSource(begin, this.id);\n this.beginCaptures = beginCaptures;\n this._end = new RegExpSource(end ? end : \"\\uFFFF\", -1);\n this.endHasBackReferences = this._end.hasBackReferences;\n this.endCaptures = endCaptures;\n this.applyEndPatternLast = applyEndPatternLast || false;\n this.patterns = patterns.patterns;\n this.hasMissingPatterns = patterns.hasMissingPatterns;\n this._cachedCompiledPatterns = null;\n }\n dispose() {\n if (this._cachedCompiledPatterns) {\n this._cachedCompiledPatterns.dispose();\n this._cachedCompiledPatterns = null;\n }\n }\n get debugBeginRegExp() {\n return `${this._begin.source}`;\n }\n get debugEndRegExp() {\n return `${this._end.source}`;\n }\n getEndWithResolvedBackReferences(lineText, captureIndices) {\n return this._end.resolveBackReferences(lineText, captureIndices);\n }\n collectPatterns(grammar, out) {\n out.push(this._begin);\n }\n compile(grammar, endRegexSource) {\n return this._getCachedCompiledPatterns(grammar, endRegexSource).compile(grammar);\n }\n compileAG(grammar, endRegexSource, allowA, allowG) {\n return this._getCachedCompiledPatterns(grammar, endRegexSource).compileAG(grammar, allowA, allowG);\n }\n _getCachedCompiledPatterns(grammar, endRegexSource) {\n if (!this._cachedCompiledPatterns) {\n this._cachedCompiledPatterns = new RegExpSourceList();\n for (const pattern of this.patterns) {\n const rule = grammar.getRule(pattern);\n rule.collectPatterns(grammar, this._cachedCompiledPatterns);\n }\n if (this.applyEndPatternLast) {\n this._cachedCompiledPatterns.push(this._end.hasBackReferences ? this._end.clone() : this._end);\n } else {\n this._cachedCompiledPatterns.unshift(this._end.hasBackReferences ? this._end.clone() : this._end);\n }\n }\n if (this._end.hasBackReferences) {\n if (this.applyEndPatternLast) {\n this._cachedCompiledPatterns.setSource(this._cachedCompiledPatterns.length() - 1, endRegexSource);\n } else {\n this._cachedCompiledPatterns.setSource(0, endRegexSource);\n }\n }\n return this._cachedCompiledPatterns;\n }\n};\nvar BeginWhileRule = class extends Rule {\n _begin;\n beginCaptures;\n whileCaptures;\n _while;\n whileHasBackReferences;\n hasMissingPatterns;\n patterns;\n _cachedCompiledPatterns;\n _cachedCompiledWhilePatterns;\n constructor($location, id, name, contentName, begin, beginCaptures, _while, whileCaptures, patterns) {\n super($location, id, name, contentName);\n this._begin = new RegExpSource(begin, this.id);\n this.beginCaptures = beginCaptures;\n this.whileCaptures = whileCaptures;\n this._while = new RegExpSource(_while, whileRuleId);\n this.whileHasBackReferences = this._while.hasBackReferences;\n this.patterns = patterns.patterns;\n this.hasMissingPatterns = patterns.hasMissingPatterns;\n this._cachedCompiledPatterns = null;\n this._cachedCompiledWhilePatterns = null;\n }\n dispose() {\n if (this._cachedCompiledPatterns) {\n this._cachedCompiledPatterns.dispose();\n this._cachedCompiledPatterns = null;\n }\n if (this._cachedCompiledWhilePatterns) {\n this._cachedCompiledWhilePatterns.dispose();\n this._cachedCompiledWhilePatterns = null;\n }\n }\n get debugBeginRegExp() {\n return `${this._begin.source}`;\n }\n get debugWhileRegExp() {\n return `${this._while.source}`;\n }\n getWhileWithResolvedBackReferences(lineText, captureIndices) {\n return this._while.resolveBackReferences(lineText, captureIndices);\n }\n collectPatterns(grammar, out) {\n out.push(this._begin);\n }\n compile(grammar, endRegexSource) {\n return this._getCachedCompiledPatterns(grammar).compile(grammar);\n }\n compileAG(grammar, endRegexSource, allowA, allowG) {\n return this._getCachedCompiledPatterns(grammar).compileAG(grammar, allowA, allowG);\n }\n _getCachedCompiledPatterns(grammar) {\n if (!this._cachedCompiledPatterns) {\n this._cachedCompiledPatterns = new RegExpSourceList();\n for (const pattern of this.patterns) {\n const rule = grammar.getRule(pattern);\n rule.collectPatterns(grammar, this._cachedCompiledPatterns);\n }\n }\n return this._cachedCompiledPatterns;\n }\n compileWhile(grammar, endRegexSource) {\n return this._getCachedCompiledWhilePatterns(grammar, endRegexSource).compile(grammar);\n }\n compileWhileAG(grammar, endRegexSource, allowA, allowG) {\n return this._getCachedCompiledWhilePatterns(grammar, endRegexSource).compileAG(grammar, allowA, allowG);\n }\n _getCachedCompiledWhilePatterns(grammar, endRegexSource) {\n if (!this._cachedCompiledWhilePatterns) {\n this._cachedCompiledWhilePatterns = new RegExpSourceList();\n this._cachedCompiledWhilePatterns.push(this._while.hasBackReferences ? this._while.clone() : this._while);\n }\n if (this._while.hasBackReferences) {\n this._cachedCompiledWhilePatterns.setSource(0, endRegexSource ? endRegexSource : \"\\uFFFF\");\n }\n return this._cachedCompiledWhilePatterns;\n }\n};\nvar RuleFactory = class _RuleFactory {\n static createCaptureRule(helper, $location, name, contentName, retokenizeCapturedWithRuleId) {\n return helper.registerRule((id) => {\n return new CaptureRule($location, id, name, contentName, retokenizeCapturedWithRuleId);\n });\n }\n static getCompiledRuleId(desc, helper, repository) {\n if (!desc.id) {\n helper.registerRule((id) => {\n desc.id = id;\n if (desc.match) {\n return new MatchRule(\n desc.$vscodeTextmateLocation,\n desc.id,\n desc.name,\n desc.match,\n _RuleFactory._compileCaptures(desc.captures, helper, repository)\n );\n }\n if (typeof desc.begin === \"undefined\") {\n if (desc.repository) {\n repository = mergeObjects({}, repository, desc.repository);\n }\n let patterns = desc.patterns;\n if (typeof patterns === \"undefined\" && desc.include) {\n patterns = [{ include: desc.include }];\n }\n return new IncludeOnlyRule(\n desc.$vscodeTextmateLocation,\n desc.id,\n desc.name,\n desc.contentName,\n _RuleFactory._compilePatterns(patterns, helper, repository)\n );\n }\n if (desc.while) {\n return new BeginWhileRule(\n desc.$vscodeTextmateLocation,\n desc.id,\n desc.name,\n desc.contentName,\n desc.begin,\n _RuleFactory._compileCaptures(desc.beginCaptures || desc.captures, helper, repository),\n desc.while,\n _RuleFactory._compileCaptures(desc.whileCaptures || desc.captures, helper, repository),\n _RuleFactory._compilePatterns(desc.patterns, helper, repository)\n );\n }\n return new BeginEndRule(\n desc.$vscodeTextmateLocation,\n desc.id,\n desc.name,\n desc.contentName,\n desc.begin,\n _RuleFactory._compileCaptures(desc.beginCaptures || desc.captures, helper, repository),\n desc.end,\n _RuleFactory._compileCaptures(desc.endCaptures || desc.captures, helper, repository),\n desc.applyEndPatternLast,\n _RuleFactory._compilePatterns(desc.patterns, helper, repository)\n );\n });\n }\n return desc.id;\n }\n static _compileCaptures(captures, helper, repository) {\n let r = [];\n if (captures) {\n let maximumCaptureId = 0;\n for (const captureId in captures) {\n if (captureId === \"$vscodeTextmateLocation\") {\n continue;\n }\n const numericCaptureId = parseInt(captureId, 10);\n if (numericCaptureId > maximumCaptureId) {\n maximumCaptureId = numericCaptureId;\n }\n }\n for (let i = 0; i <= maximumCaptureId; i++) {\n r[i] = null;\n }\n for (const captureId in captures) {\n if (captureId === \"$vscodeTextmateLocation\") {\n continue;\n }\n const numericCaptureId = parseInt(captureId, 10);\n let retokenizeCapturedWithRuleId = 0;\n if (captures[captureId].patterns) {\n retokenizeCapturedWithRuleId = _RuleFactory.getCompiledRuleId(captures[captureId], helper, repository);\n }\n r[numericCaptureId] = _RuleFactory.createCaptureRule(helper, captures[captureId].$vscodeTextmateLocation, captures[captureId].name, captures[captureId].contentName, retokenizeCapturedWithRuleId);\n }\n }\n return r;\n }\n static _compilePatterns(patterns, helper, repository) {\n let r = [];\n if (patterns) {\n for (let i = 0, len = patterns.length; i < len; i++) {\n const pattern = patterns[i];\n let ruleId = -1;\n if (pattern.include) {\n const reference = parseInclude(pattern.include);\n switch (reference.kind) {\n case 0 /* Base */:\n case 1 /* Self */:\n ruleId = _RuleFactory.getCompiledRuleId(repository[pattern.include], helper, repository);\n break;\n case 2 /* RelativeReference */:\n let localIncludedRule = repository[reference.ruleName];\n if (localIncludedRule) {\n ruleId = _RuleFactory.getCompiledRuleId(localIncludedRule, helper, repository);\n } else {\n }\n break;\n case 3 /* TopLevelReference */:\n case 4 /* TopLevelRepositoryReference */:\n const externalGrammarName = reference.scopeName;\n const externalGrammarInclude = reference.kind === 4 /* TopLevelRepositoryReference */ ? reference.ruleName : null;\n const externalGrammar = helper.getExternalGrammar(externalGrammarName, repository);\n if (externalGrammar) {\n if (externalGrammarInclude) {\n let externalIncludedRule = externalGrammar.repository[externalGrammarInclude];\n if (externalIncludedRule) {\n ruleId = _RuleFactory.getCompiledRuleId(externalIncludedRule, helper, externalGrammar.repository);\n } else {\n }\n } else {\n ruleId = _RuleFactory.getCompiledRuleId(externalGrammar.repository.$self, helper, externalGrammar.repository);\n }\n } else {\n }\n break;\n }\n } else {\n ruleId = _RuleFactory.getCompiledRuleId(pattern, helper, repository);\n }\n if (ruleId !== -1) {\n const rule = helper.getRule(ruleId);\n let skipRule = false;\n if (rule instanceof IncludeOnlyRule || rule instanceof BeginEndRule || rule instanceof BeginWhileRule) {\n if (rule.hasMissingPatterns && rule.patterns.length === 0) {\n skipRule = true;\n }\n }\n if (skipRule) {\n continue;\n }\n r.push(ruleId);\n }\n }\n }\n return {\n patterns: r,\n hasMissingPatterns: (patterns ? patterns.length : 0) !== r.length\n };\n }\n};\nvar RegExpSource = class _RegExpSource {\n source;\n ruleId;\n hasAnchor;\n hasBackReferences;\n _anchorCache;\n constructor(regExpSource, ruleId) {\n if (regExpSource && typeof regExpSource === \"string\") {\n const len = regExpSource.length;\n let lastPushedPos = 0;\n let output = [];\n let hasAnchor = false;\n for (let pos = 0; pos < len; pos++) {\n const ch = regExpSource.charAt(pos);\n if (ch === \"\\\\\") {\n if (pos + 1 < len) {\n const nextCh = regExpSource.charAt(pos + 1);\n if (nextCh === \"z\") {\n output.push(regExpSource.substring(lastPushedPos, pos));\n output.push(\"$(?!\\\\n)(?<!\\\\n)\");\n lastPushedPos = pos + 2;\n } else if (nextCh === \"A\" || nextCh === \"G\") {\n hasAnchor = true;\n }\n pos++;\n }\n }\n }\n this.hasAnchor = hasAnchor;\n if (lastPushedPos === 0) {\n this.source = regExpSource;\n } else {\n output.push(regExpSource.substring(lastPushedPos, len));\n this.source = output.join(\"\");\n }\n } else {\n this.hasAnchor = false;\n this.source = regExpSource;\n }\n if (this.hasAnchor) {\n this._anchorCache = this._buildAnchorCache();\n } else {\n this._anchorCache = null;\n }\n this.ruleId = ruleId;\n if (typeof this.source === \"string\") {\n this.hasBackReferences = HAS_BACK_REFERENCES.test(this.source);\n } else {\n this.hasBackReferences = false;\n }\n }\n clone() {\n return new _RegExpSource(this.source, this.ruleId);\n }\n setSource(newSource) {\n if (this.source === newSource) {\n return;\n }\n this.source = newSource;\n if (this.hasAnchor) {\n this._anchorCache = this._buildAnchorCache();\n }\n }\n resolveBackReferences(lineText, captureIndices) {\n if (typeof this.source !== \"string\") {\n throw new Error(\"This method should only be called if the source is a string\");\n }\n let capturedValues = captureIndices.map((capture) => {\n return lineText.substring(capture.start, capture.end);\n });\n BACK_REFERENCING_END.lastIndex = 0;\n return this.source.replace(BACK_REFERENCING_END, (match, g1) => {\n return escapeRegExpCharacters(capturedValues[parseInt(g1, 10)] || \"\");\n });\n }\n _buildAnchorCache() {\n if (typeof this.source !== \"string\") {\n throw new Error(\"This method should only be called if the source is a string\");\n }\n let A0_G0_result = [];\n let A0_G1_result = [];\n let A1_G0_result = [];\n let A1_G1_result = [];\n let pos, len, ch, nextCh;\n for (pos = 0, len = this.source.length; pos < len; pos++) {\n ch = this.source.charAt(pos);\n A0_G0_result[pos] = ch;\n A0_G1_result[pos] = ch;\n A1_G0_result[pos] = ch;\n A1_G1_result[pos] = ch;\n if (ch === \"\\\\\") {\n if (pos + 1 < len) {\n nextCh = this.source.charAt(pos + 1);\n if (nextCh === \"A\") {\n A0_G0_result[pos + 1] = \"\\uFFFF\";\n A0_G1_result[pos + 1] = \"\\uFFFF\";\n A1_G0_result[pos + 1] = \"A\";\n A1_G1_result[pos + 1] = \"A\";\n } else if (nextCh === \"G\") {\n A0_G0_result[pos + 1] = \"\\uFFFF\";\n A0_G1_result[pos + 1] = \"G\";\n A1_G0_result[pos + 1] = \"\\uFFFF\";\n A1_G1_result[pos + 1] = \"G\";\n } else {\n A0_G0_result[pos + 1] = nextCh;\n A0_G1_result[pos + 1] = nextCh;\n A1_G0_result[pos + 1] = nextCh;\n A1_G1_result[pos + 1] = nextCh;\n }\n pos++;\n }\n }\n }\n return {\n A0_G0: A0_G0_result.join(\"\"),\n A0_G1: A0_G1_result.join(\"\"),\n A1_G0: A1_G0_result.join(\"\"),\n A1_G1: A1_G1_result.join(\"\")\n };\n }\n resolveAnchors(allowA, allowG) {\n if (!this.hasAnchor || !this._anchorCache || typeof this.source !== \"string\") {\n return this.source;\n }\n if (allowA) {\n if (allowG) {\n return this._anchorCache.A1_G1;\n } else {\n return this._anchorCache.A1_G0;\n }\n } else {\n if (allowG) {\n return this._anchorCache.A0_G1;\n } else {\n return this._anchorCache.A0_G0;\n }\n }\n }\n};\nvar RegExpSourceList = class {\n _items;\n _hasAnchors;\n _cached;\n _anchorCache;\n constructor() {\n this._items = [];\n this._hasAnchors = false;\n this._cached = null;\n this._anchorCache = {\n A0_G0: null,\n A0_G1: null,\n A1_G0: null,\n A1_G1: null\n };\n }\n dispose() {\n this._disposeCaches();\n }\n _disposeCaches() {\n if (this._cached) {\n this._cached.dispose();\n this._cached = null;\n }\n if (this._anchorCache.A0_G0) {\n this._anchorCache.A0_G0.dispose();\n this._anchorCache.A0_G0 = null;\n }\n if (this._anchorCache.A0_G1) {\n this._anchorCache.A0_G1.dispose();\n this._anchorCache.A0_G1 = null;\n }\n if (this._anchorCache.A1_G0) {\n this._anchorCache.A1_G0.dispose();\n this._anchorCache.A1_G0 = null;\n }\n if (this._anchorCache.A1_G1) {\n this._anchorCache.A1_G1.dispose();\n this._anchorCache.A1_G1 = null;\n }\n }\n push(item) {\n this._items.push(item);\n this._hasAnchors = this._hasAnchors || item.hasAnchor;\n }\n unshift(item) {\n this._items.unshift(item);\n this._hasAnchors = this._hasAnchors || item.hasAnchor;\n }\n length() {\n return this._items.length;\n }\n setSource(index, newSource) {\n if (this._items[index].source !== newSource) {\n this._disposeCaches();\n this._items[index].setSource(newSource);\n }\n }\n compile(onigLib) {\n if (!this._cached) {\n let regExps = this._items.map((e) => e.source);\n this._cached = new CompiledRule(onigLib, regExps, this._items.map((e) => e.ruleId));\n }\n return this._cached;\n }\n compileAG(onigLib, allowA, allowG) {\n if (!this._hasAnchors) {\n return this.compile(onigLib);\n } else {\n if (allowA) {\n if (allowG) {\n if (!this._anchorCache.A1_G1) {\n this._anchorCache.A1_G1 = this._resolveAnchors(onigLib, allowA, allowG);\n }\n return this._anchorCache.A1_G1;\n } else {\n if (!this._anchorCache.A1_G0) {\n this._anchorCache.A1_G0 = this._resolveAnchors(onigLib, allowA, allowG);\n }\n return this._anchorCache.A1_G0;\n }\n } else {\n if (allowG) {\n if (!this._anchorCache.A0_G1) {\n this._anchorCache.A0_G1 = this._resolveAnchors(onigLib, allowA, allowG);\n }\n return this._anchorCache.A0_G1;\n } else {\n if (!this._anchorCache.A0_G0) {\n this._anchorCache.A0_G0 = this._resolveAnchors(onigLib, allowA, allowG);\n }\n return this._anchorCache.A0_G0;\n }\n }\n }\n }\n _resolveAnchors(onigLib, allowA, allowG) {\n let regExps = this._items.map((e) => e.resolveAnchors(allowA, allowG));\n return new CompiledRule(onigLib, regExps, this._items.map((e) => e.ruleId));\n }\n};\nvar CompiledRule = class {\n constructor(onigLib, regExps, rules) {\n this.regExps = regExps;\n this.rules = rules;\n this.scanner = onigLib.createOnigScanner(regExps);\n }\n scanner;\n dispose() {\n if (typeof this.scanner.dispose === \"function\") {\n this.scanner.dispose();\n }\n }\n toString() {\n const r = [];\n for (let i = 0, len = this.rules.length; i < len; i++) {\n r.push(\" - \" + this.rules[i] + \": \" + this.regExps[i]);\n }\n return r.join(\"\\n\");\n }\n findNextMatchSync(string, startPosition, options) {\n const result = this.scanner.findNextMatchSync(string, startPosition, options);\n if (!result) {\n return null;\n }\n return {\n ruleId: this.rules[result.index],\n captureIndices: result.captureIndices\n };\n }\n};\n\n// src/grammar/basicScopesAttributeProvider.ts\nvar BasicScopeAttributes = class {\n constructor(languageId, tokenType) {\n this.languageId = languageId;\n this.tokenType = tokenType;\n }\n};\nvar BasicScopeAttributesProvider = class _BasicScopeAttributesProvider {\n _defaultAttributes;\n _embeddedLanguagesMatcher;\n constructor(initialLanguageId, embeddedLanguages) {\n this._defaultAttributes = new BasicScopeAttributes(initialLanguageId, 8 /* NotSet */);\n this._embeddedLanguagesMatcher = new ScopeMatcher(Object.entries(embeddedLanguages || {}));\n }\n getDefaultAttributes() {\n return this._defaultAttributes;\n }\n getBasicScopeAttributes(scopeName) {\n if (scopeName === null) {\n return _BasicScopeAttributesProvider._NULL_SCOPE_METADATA;\n }\n return this._getBasicScopeAttributes.get(scopeName);\n }\n static _NULL_SCOPE_METADATA = new BasicScopeAttributes(0, 0);\n _getBasicScopeAttributes = new CachedFn((scopeName) => {\n const languageId = this._scopeToLanguage(scopeName);\n const standardTokenType = this._toStandardTokenType(scopeName);\n return new BasicScopeAttributes(languageId, standardTokenType);\n });\n /**\n * Given a produced TM scope, return the language that token describes or null if unknown.\n * e.g. source.html => html, source.css.embedded.html => css, punctuation.definition.tag.html => null\n */\n _scopeToLanguage(scope) {\n return this._embeddedLanguagesMatcher.match(scope) || 0;\n }\n _toStandardTokenType(scopeName) {\n const m = scopeName.match(_BasicScopeAttributesProvider.STANDARD_TOKEN_TYPE_REGEXP);\n if (!m) {\n return 8 /* NotSet */;\n }\n switch (m[1]) {\n case \"comment\":\n return 1 /* Comment */;\n case \"string\":\n return 2 /* String */;\n case \"regex\":\n return 3 /* RegEx */;\n case \"meta.embedded\":\n return 0 /* Other */;\n }\n throw new Error(\"Unexpected match for standard token type!\");\n }\n static STANDARD_TOKEN_TYPE_REGEXP = /\\b(comment|string|regex|meta\\.embedded)\\b/;\n};\nvar ScopeMatcher = class {\n values;\n scopesRegExp;\n constructor(values) {\n if (values.length === 0) {\n this.values = null;\n this.scopesRegExp = null;\n } else {\n this.values = new Map(values);\n const escapedScopes = values.map(\n ([scopeName, value]) => escapeRegExpCharacters(scopeName)\n );\n escapedScopes.sort();\n escapedScopes.reverse();\n this.scopesRegExp = new RegExp(\n `^((${escapedScopes.join(\")|(\")}))($|\\\\.)`,\n \"\"\n );\n }\n }\n match(scope) {\n if (!this.scopesRegExp) {\n return void 0;\n }\n const m = scope.match(this.scopesRegExp);\n if (!m) {\n return void 0;\n }\n return this.values.get(m[1]);\n }\n};\n\n// src/debug.ts\nvar DebugFlags = {\n InDebugMode: typeof process !== \"undefined\" && !!process.env[\"VSCODE_TEXTMATE_DEBUG\"]\n};\nvar UseOnigurumaFindOptions = false;\n\n// src/grammar/tokenizeString.ts\nvar TokenizeStringResult = class {\n constructor(stack, stoppedEarly) {\n this.stack = stack;\n this.stoppedEarly = stoppedEarly;\n }\n};\nfunction _tokenizeString(grammar, lineText, isFirstLine, linePos, stack, lineTokens, checkWhileConditions, timeLimit) {\n const lineLength = lineText.content.length;\n let STOP = false;\n let anchorPosition = -1;\n if (checkWhileConditions) {\n const whileCheckResult = _checkWhileConditions(\n grammar,\n lineText,\n isFirstLine,\n linePos,\n stack,\n lineTokens\n );\n stack = whileCheckResult.stack;\n linePos = whileCheckResult.linePos;\n isFirstLine = whileCheckResult.isFirstLine;\n anchorPosition = whileCheckResult.anchorPosition;\n }\n const startTime = Date.now();\n while (!STOP) {\n if (timeLimit !== 0) {\n const elapsedTime = Date.now() - startTime;\n if (elapsedTime > timeLimit) {\n return new TokenizeStringResult(stack, true);\n }\n }\n scanNext();\n }\n return new TokenizeStringResult(stack, false);\n function scanNext() {\n if (false) {\n console.log(\"\");\n console.log(\n `@@scanNext ${linePos}: |${lineText.content.substr(linePos).replace(/\\n$/, \"\\\\n\")}|`\n );\n }\n const r = matchRuleOrInjections(\n grammar,\n lineText,\n isFirstLine,\n linePos,\n stack,\n anchorPosition\n );\n if (!r) {\n lineTokens.produce(stack, lineLength);\n STOP = true;\n return;\n }\n const captureIndices = r.captureIndices;\n const matchedRuleId = r.matchedRuleId;\n const hasAdvanced = captureIndices && captureIndices.length > 0 ? captureIndices[0].end > linePos : false;\n if (matchedRuleId === endRuleId) {\n const poppedRule = stack.getRule(grammar);\n if (false) {\n console.log(\n \" popping \" + poppedRule.debugName + \" - \" + poppedRule.debugEndRegExp\n );\n }\n lineTokens.produce(stack, captureIndices[0].start);\n stack = stack.withContentNameScopesList(stack.nameScopesList);\n handleCaptures(\n grammar,\n lineText,\n isFirstLine,\n stack,\n lineTokens,\n poppedRule.endCaptures,\n captureIndices\n );\n lineTokens.produce(stack, captureIndices[0].end);\n const popped = stack;\n stack = stack.parent;\n anchorPosition = popped.getAnchorPos();\n if (!hasAdvanced && popped.getEnterPos() === linePos) {\n if (false) {\n console.error(\n \"[1] - Grammar is in an endless loop - Grammar pushed & popped a rule without advancing\"\n );\n }\n stack = popped;\n lineTokens.produce(stack, lineLength);\n STOP = true;\n return;\n }\n } else {\n const _rule = grammar.getRule(matchedRuleId);\n lineTokens.produce(stack, captureIndices[0].start);\n const beforePush = stack;\n const scopeName = _rule.getName(lineText.content, captureIndices);\n const nameScopesList = stack.contentNameScopesList.pushAttributed(\n scopeName,\n grammar\n );\n stack = stack.push(\n matchedRuleId,\n linePos,\n anchorPosition,\n captureIndices[0].end === lineLength,\n null,\n nameScopesList,\n nameScopesList\n );\n if (_rule instanceof BeginEndRule) {\n const pushedRule = _rule;\n if (false) {\n console.log(\n \" pushing \" + pushedRule.debugName + \" - \" + pushedRule.debugBeginRegExp\n );\n }\n handleCaptures(\n grammar,\n lineText,\n isFirstLine,\n stack,\n lineTokens,\n pushedRule.beginCaptures,\n captureIndices\n );\n lineTokens.produce(stack, captureIndices[0].end);\n anchorPosition = captureIndices[0].end;\n const contentName = pushedRule.getContentName(\n lineText.content,\n captureIndices\n );\n const contentNameScopesList = nameScopesList.pushAttributed(\n contentName,\n grammar\n );\n stack = stack.withContentNameScopesList(contentNameScopesList);\n if (pushedRule.endHasBackReferences) {\n stack = stack.withEndRule(\n pushedRule.getEndWithResolvedBackReferences(\n lineText.content,\n captureIndices\n )\n );\n }\n if (!hasAdvanced && beforePush.hasSameRuleAs(stack)) {\n if (false) {\n console.error(\n \"[2] - Grammar is in an endless loop - Grammar pushed the same rule without advancing\"\n );\n }\n stack = stack.pop();\n lineTokens.produce(stack, lineLength);\n STOP = true;\n return;\n }\n } else if (_rule instanceof BeginWhileRule) {\n const pushedRule = _rule;\n if (false) {\n console.log(\" pushing \" + pushedRule.debugName);\n }\n handleCaptures(\n grammar,\n lineText,\n isFirstLine,\n stack,\n lineTokens,\n pushedRule.beginCaptures,\n captureIndices\n );\n lineTokens.produce(stack, captureIndices[0].end);\n anchorPosition = captureIndices[0].end;\n const contentName = pushedRule.getContentName(\n lineText.content,\n captureIndices\n );\n const contentNameScopesList = nameScopesList.pushAttributed(\n contentName,\n grammar\n );\n stack = stack.withContentNameScopesList(contentNameScopesList);\n if (pushedRule.whileHasBackReferences) {\n stack = stack.withEndRule(\n pushedRule.getWhileWithResolvedBackReferences(\n lineText.content,\n captureIndices\n )\n );\n }\n if (!hasAdvanced && beforePush.hasSameRuleAs(stack)) {\n if (false) {\n console.error(\n \"[3] - Grammar is in an endless loop - Grammar pushed the same rule without advancing\"\n );\n }\n stack = stack.pop();\n lineTokens.produce(stack, lineLength);\n STOP = true;\n return;\n }\n } else {\n const matchingRule = _rule;\n if (false) {\n console.log(\n \" matched \" + matchingRule.debugName + \" - \" + matchingRule.debugMatchRegExp\n );\n }\n handleCaptures(\n grammar,\n lineText,\n isFirstLine,\n stack,\n lineTokens,\n matchingRule.captures,\n captureIndices\n );\n lineTokens.produce(stack, captureIndices[0].end);\n stack = stack.pop();\n if (!hasAdvanced) {\n if (false) {\n console.error(\n \"[4] - Grammar is in an endless loop - Grammar is not advancing, nor is it pushing/popping\"\n );\n }\n stack = stack.safePop();\n lineTokens.produce(stack, lineLength);\n STOP = true;\n return;\n }\n }\n }\n if (captureIndices[0].end > linePos) {\n linePos = captureIndices[0].end;\n isFirstLine = false;\n }\n }\n}\nfunction _checkWhileConditions(grammar, lineText, isFirstLine, linePos, stack, lineTokens) {\n let anchorPosition = stack.beginRuleCapturedEOL ? 0 : -1;\n const whileRules = [];\n for (let node = stack; node; node = node.pop()) {\n const nodeRule = node.getRule(grammar);\n if (nodeRule instanceof BeginWhileRule) {\n whileRules.push({\n rule: nodeRule,\n stack: node\n });\n }\n }\n for (let whileRule = whileRules.pop(); whileRule; whileRule = whileRules.pop()) {\n const { ruleScanner, findOptions } = prepareRuleWhileSearch(whileRule.rule, grammar, whileRule.stack.endRule, isFirstLine, linePos === anchorPosition);\n const r = ruleScanner.findNextMatchSync(lineText, linePos, findOptions);\n if (false) {\n console.log(\" scanning for while rule\");\n console.log(ruleScanner.toString());\n }\n if (r) {\n const matchedRuleId = r.ruleId;\n if (matchedRuleId !== whileRuleId) {\n stack = whileRule.stack.pop();\n break;\n }\n if (r.captureIndices && r.captureIndices.length) {\n lineTokens.produce(whileRule.stack, r.captureIndices[0].start);\n handleCaptures(grammar, lineText, isFirstLine, whileRule.stack, lineTokens, whileRule.rule.whileCaptures, r.captureIndices);\n lineTokens.produce(whileRule.stack, r.captureIndices[0].end);\n anchorPosition = r.captureIndices[0].end;\n if (r.captureIndices[0].end > linePos) {\n linePos = r.captureIndices[0].end;\n isFirstLine = false;\n }\n }\n } else {\n if (false) {\n console.log(\" popping \" + whileRule.rule.debugName + \" - \" + whileRule.rule.debugWhileRegExp);\n }\n stack = whileRule.stack.pop();\n break;\n }\n }\n return { stack, linePos, anchorPosition, isFirstLine };\n}\nfunction matchRuleOrInjections(grammar, lineText, isFirstLine, linePos, stack, anchorPosition) {\n const matchResult = matchRule(grammar, lineText, isFirstLine, linePos, stack, anchorPosition);\n const injections = grammar.getInjections();\n if (injections.length === 0) {\n return matchResult;\n }\n const injectionResult = matchInjections(injections, grammar, lineText, isFirstLine, linePos, stack, anchorPosition);\n if (!injectionResult) {\n return matchResult;\n }\n if (!matchResult) {\n return injectionResult;\n }\n const matchResultScore = matchResult.captureIndices[0].start;\n const injectionResultScore = injectionResult.captureIndices[0].start;\n if (injectionResultScore < matchResultScore || injectionResult.priorityMatch && injectionResultScore === matchResultScore) {\n return injectionResult;\n }\n return matchResult;\n}\nfunction matchRule(grammar, lineText, isFirstLine, linePos, stack, anchorPosition) {\n const rule = stack.getRule(grammar);\n const { ruleScanner, findOptions } = prepareRuleSearch(rule, grammar, stack.endRule, isFirstLine, linePos === anchorPosition);\n const r = ruleScanner.findNextMatchSync(lineText, linePos, findOptions);\n if (r) {\n return {\n captureIndices: r.captureIndices,\n matchedRuleId: r.ruleId\n };\n }\n return null;\n}\nfunction matchInjections(injections, grammar, lineText, isFirstLine, linePos, stack, anchorPosition) {\n let bestMatchRating = Number.MAX_VALUE;\n let bestMatchCaptureIndices = null;\n let bestMatchRuleId;\n let bestMatchResultPriority = 0;\n const scopes = stack.contentNameScopesList.getScopeNames();\n for (let i = 0, len = injections.length; i < len; i++) {\n const injection = injections[i];\n if (!injection.matcher(scopes)) {\n continue;\n }\n const rule = grammar.getRule(injection.ruleId);\n const { ruleScanner, findOptions } = prepareRuleSearch(rule, grammar, null, isFirstLine, linePos === anchorPosition);\n const matchResult = ruleScanner.findNextMatchSync(lineText, linePos, findOptions);\n if (!matchResult) {\n continue;\n }\n if (false) {\n console.log(` matched injection: ${injection.debugSelector}`);\n console.log(ruleScanner.toString());\n }\n const matchRating = matchResult.captureIndices[0].start;\n if (matchRating >= bestMatchRating) {\n continue;\n }\n bestMatchRating = matchRating;\n bestMatchCaptureIndices = matchResult.captureIndices;\n bestMatchRuleId = matchResult.ruleId;\n bestMatchResultPriority = injection.priority;\n if (bestMatchRating === linePos) {\n break;\n }\n }\n if (bestMatchCaptureIndices) {\n return {\n priorityMatch: bestMatchResultPriority === -1,\n captureIndices: bestMatchCaptureIndices,\n matchedRuleId: bestMatchRuleId\n };\n }\n return null;\n}\nfunction prepareRuleSearch(rule, grammar, endRegexSource, allowA, allowG) {\n if (UseOnigurumaFindOptions) {\n const ruleScanner2 = rule.compile(grammar, endRegexSource);\n const findOptions = getFindOptions(allowA, allowG);\n return { ruleScanner: ruleScanner2, findOptions };\n }\n const ruleScanner = rule.compileAG(grammar, endRegexSource, allowA, allowG);\n return { ruleScanner, findOptions: 0 /* None */ };\n}\nfunction prepareRuleWhileSearch(rule, grammar, endRegexSource, allowA, allowG) {\n if (UseOnigurumaFindOptions) {\n const ruleScanner2 = rule.compileWhile(grammar, endRegexSource);\n const findOptions = getFindOptions(allowA, allowG);\n return { ruleScanner: ruleScanner2, findOptions };\n }\n const ruleScanner = rule.compileWhileAG(grammar, endRegexSource, allowA, allowG);\n return { ruleScanner, findOptions: 0 /* None */ };\n}\nfunction getFindOptions(allowA, allowG) {\n let options = 0 /* None */;\n if (!allowA) {\n options |= 1 /* NotBeginString */;\n }\n if (!allowG) {\n options |= 4 /* NotBeginPosition */;\n }\n return options;\n}\nfunction handleCaptures(grammar, lineText, isFirstLine, stack, lineTokens, captures, captureIndices) {\n if (captures.length === 0) {\n return;\n }\n const lineTextContent = lineText.content;\n const len = Math.min(captures.length, captureIndices.length);\n const localStack = [];\n const maxEnd = captureIndices[0].end;\n for (let i = 0; i < len; i++) {\n const captureRule = captures[i];\n if (captureRule === null) {\n continue;\n }\n const captureIndex = captureIndices[i];\n if (captureIndex.length === 0) {\n continue;\n }\n if (captureIndex.start > maxEnd) {\n break;\n }\n while (localStack.length > 0 && localStack[localStack.length - 1].endPos <= captureIndex.start) {\n lineTokens.produceFromScopes(localStack[localStack.length - 1].scopes, localStack[localStack.length - 1].endPos);\n localStack.pop();\n }\n if (localStack.length > 0) {\n lineTokens.produceFromScopes(localStack[localStack.length - 1].scopes, captureIndex.start);\n } else {\n lineTokens.produce(stack, captureIndex.start);\n }\n if (captureRule.retokenizeCapturedWithRuleId) {\n const scopeName = captureRule.getName(lineTextContent, captureIndices);\n const nameScopesList = stack.contentNameScopesList.pushAttributed(scopeName, grammar);\n const contentName = captureRule.getContentName(lineTextContent, captureIndices);\n const contentNameScopesList = nameScopesList.pushAttributed(contentName, grammar);\n const stackClone = stack.push(captureRule.retokenizeCapturedWithRuleId, captureIndex.start, -1, false, null, nameScopesList, contentNameScopesList);\n const onigSubStr = grammar.createOnigString(lineTextContent.substring(0, captureIndex.end));\n _tokenizeString(\n grammar,\n onigSubStr,\n isFirstLine && captureIndex.start === 0,\n captureIndex.start,\n stackClone,\n lineTokens,\n false,\n /* no time limit */\n 0\n );\n disposeOnigString(onigSubStr);\n continue;\n }\n const captureRuleScopeName = captureRule.getName(lineTextContent, captureIndices);\n if (captureRuleScopeName !== null) {\n const base = localStack.length > 0 ? localStack[localStack.length - 1].scopes : stack.contentNameScopesList;\n const captureRuleScopesList = base.pushAttributed(captureRuleScopeName, grammar);\n localStack.push(new LocalStackElement(captureRuleScopesList, captureIndex.end));\n }\n }\n while (localStack.length > 0) {\n lineTokens.produceFromScopes(localStack[localStack.length - 1].scopes, localStack[localStack.length - 1].endPos);\n localStack.pop();\n }\n}\nvar LocalStackElement = class {\n scopes;\n endPos;\n constructor(scopes, endPos) {\n this.scopes = scopes;\n this.endPos = endPos;\n }\n};\n\n// src/grammar/grammar.ts\nfunction createGrammar(scopeName, grammar, initialLanguage, embeddedLanguages, tokenTypes, balancedBracketSelectors, grammarRepository, onigLib) {\n return new Grammar(\n scopeName,\n grammar,\n initialLanguage,\n embeddedLanguages,\n tokenTypes,\n balancedBracketSelectors,\n grammarRepository,\n onigLib\n );\n}\nfunction collectInjections(result, selector, rule, ruleFactoryHelper, grammar) {\n const matchers = createMatchers(selector, nameMatcher);\n const ruleId = RuleFactory.getCompiledRuleId(rule, ruleFactoryHelper, grammar.repository);\n for (const matcher of matchers) {\n result.push({\n debugSelector: selector,\n matcher: matcher.matcher,\n ruleId,\n grammar,\n priority: matcher.priority\n });\n }\n}\nfunction nameMatcher(identifers, scopes) {\n if (scopes.length < identifers.length) {\n return false;\n }\n let lastIndex = 0;\n return identifers.every((identifier) => {\n for (let i = lastIndex; i < scopes.length; i++) {\n if (scopesAreMatching(scopes[i], identifier)) {\n lastIndex = i + 1;\n return true;\n }\n }\n return false;\n });\n}\nfunction scopesAreMatching(thisScopeName, scopeName) {\n if (!thisScopeName) {\n return false;\n }\n if (thisScopeName === scopeName) {\n return true;\n }\n const len = scopeName.length;\n return thisScopeName.length > len && thisScopeName.substr(0, len) === scopeName && thisScopeName[len] === \".\";\n}\nvar Grammar = class {\n constructor(_rootScopeName, grammar, initialLanguage, embeddedLanguages, tokenTypes, balancedBracketSelectors, grammarRepository, _onigLib) {\n this._rootScopeName = _rootScopeName;\n this.balancedBracketSelectors = balancedBracketSelectors;\n this._onigLib = _onigLib;\n this._basicScopeAttributesProvider = new BasicScopeAttributesProvider(\n initialLanguage,\n embeddedLanguages\n );\n this._rootId = -1;\n this._lastRuleId = 0;\n this._ruleId2desc = [null];\n this._includedGrammars = {};\n this._grammarRepository = grammarRepository;\n this._grammar = initGrammar(grammar, null);\n this._injections = null;\n this._tokenTypeMatchers = [];\n if (tokenTypes) {\n for (const selector of Object.keys(tokenTypes)) {\n const matchers = createMatchers(selector, nameMatcher);\n for (const matcher of matchers) {\n this._tokenTypeMatchers.push({\n matcher: matcher.matcher,\n type: tokenTypes[selector]\n });\n }\n }\n }\n }\n _rootId;\n _lastRuleId;\n _ruleId2desc;\n _includedGrammars;\n _grammarRepository;\n _grammar;\n _injections;\n _basicScopeAttributesProvider;\n _tokenTypeMatchers;\n get themeProvider() {\n return this._grammarRepository;\n }\n dispose() {\n for (const rule of this._ruleId2desc) {\n if (rule) {\n rule.dispose();\n }\n }\n }\n createOnigScanner(sources) {\n return this._onigLib.createOnigScanner(sources);\n }\n createOnigString(sources) {\n return this._onigLib.createOnigString(sources);\n }\n getMetadataForScope(scope) {\n return this._basicScopeAttributesProvider.getBasicScopeAttributes(scope);\n }\n _collectInjections() {\n const grammarRepository = {\n lookup: (scopeName2) => {\n if (scopeName2 === this._rootScopeName) {\n return this._grammar;\n }\n return this.getExternalGrammar(scopeName2);\n },\n injections: (scopeName2) => {\n return this._grammarRepository.injections(scopeName2);\n }\n };\n const result = [];\n const scopeName = this._rootScopeName;\n const grammar = grammarRepository.lookup(scopeName);\n if (grammar) {\n const rawInjections = grammar.injections;\n if (rawInjections) {\n for (let expression in rawInjections) {\n collectInjections(\n result,\n expression,\n rawInjections[expression],\n this,\n grammar\n );\n }\n }\n const injectionScopeNames = this._grammarRepository.injections(scopeName);\n if (injectionScopeNames) {\n injectionScopeNames.forEach((injectionScopeName) => {\n const injectionGrammar = this.getExternalGrammar(injectionScopeName);\n if (injectionGrammar) {\n const selector = injectionGrammar.injectionSelector;\n if (selector) {\n collectInjections(\n result,\n selector,\n injectionGrammar,\n this,\n injectionGrammar\n );\n }\n }\n });\n }\n }\n result.sort((i1, i2) => i1.priority - i2.priority);\n return result;\n }\n getInjections() {\n if (this._injections === null) {\n this._injections = this._collectInjections();\n }\n return this._injections;\n }\n registerRule(factory) {\n const id = ++this._lastRuleId;\n const result = factory(ruleIdFromNumber(id));\n this._ruleId2desc[id] = result;\n return result;\n }\n getRule(ruleId) {\n return this._ruleId2desc[ruleIdToNumber(ruleId)];\n }\n getExternalGrammar(scopeName, repository) {\n if (this._includedGrammars[scopeName]) {\n return this._includedGrammars[scopeName];\n } else if (this._grammarRepository) {\n const rawIncludedGrammar = this._grammarRepository.lookup(scopeName);\n if (rawIncludedGrammar) {\n this._includedGrammars[scopeName] = initGrammar(\n rawIncludedGrammar,\n repository && repository.$base\n );\n return this._includedGrammars[scopeName];\n }\n }\n return void 0;\n }\n tokenizeLine(lineText, prevState, timeLimit = 0) {\n const r = this._tokenize(lineText, prevState, false, timeLimit);\n return {\n tokens: r.lineTokens.getResult(r.ruleStack, r.lineLength),\n ruleStack: r.ruleStack,\n stoppedEarly: r.stoppedEarly\n };\n }\n tokenizeLine2(lineText, prevState, timeLimit = 0) {\n const r = this._tokenize(lineText, prevState, true, timeLimit);\n return {\n tokens: r.lineTokens.getBinaryResult(r.ruleStack, r.lineLength),\n ruleStack: r.ruleStack,\n stoppedEarly: r.stoppedEarly\n };\n }\n _tokenize(lineText, prevState, emitBinaryTokens, timeLimit) {\n if (this._rootId === -1) {\n this._rootId = RuleFactory.getCompiledRuleId(\n this._grammar.repository.$self,\n this,\n this._grammar.repository\n );\n this.getInjections();\n }\n let isFirstLine;\n if (!prevState || prevState === StateStackImpl.NULL) {\n isFirstLine = true;\n const rawDefaultMetadata = this._basicScopeAttributesProvider.getDefaultAttributes();\n const defaultStyle = this.themeProvider.getDefaults();\n const defaultMetadata = EncodedTokenMetadata.set(\n 0,\n rawDefaultMetadata.languageId,\n rawDefaultMetadata.tokenType,\n null,\n defaultStyle.fontStyle,\n defaultStyle.foregroundId,\n defaultStyle.backgroundId\n );\n const rootScopeName = this.getRule(this._rootId).getName(\n null,\n null\n );\n let scopeList;\n if (rootScopeName) {\n scopeList = AttributedScopeStack.createRootAndLookUpScopeName(\n rootScopeName,\n defaultMetadata,\n this\n );\n } else {\n scopeList = AttributedScopeStack.createRoot(\n \"unknown\",\n defaultMetadata\n );\n }\n prevState = new StateStackImpl(\n null,\n this._rootId,\n -1,\n -1,\n false,\n null,\n scopeList,\n scopeList\n );\n } else {\n isFirstLine = false;\n prevState.reset();\n }\n lineText = lineText + \"\\n\";\n const onigLineText = this.createOnigString(lineText);\n const lineLength = onigLineText.content.length;\n const lineTokens = new LineTokens(\n emitBinaryTokens,\n lineText,\n this._tokenTypeMatchers,\n this.balancedBracketSelectors\n );\n const r = _tokenizeString(\n this,\n onigLineText,\n isFirstLine,\n 0,\n prevState,\n lineTokens,\n true,\n timeLimit\n );\n disposeOnigString(onigLineText);\n return {\n lineLength,\n lineTokens,\n ruleStack: r.stack,\n stoppedEarly: r.stoppedEarly\n };\n }\n};\nfunction initGrammar(grammar, base) {\n grammar = clone(grammar);\n grammar.repository = grammar.repository || {};\n grammar.repository.$self = {\n $vscodeTextmateLocation: grammar.$vscodeTextmateLocation,\n patterns: grammar.patterns,\n name: grammar.scopeName\n };\n grammar.repository.$base = base || grammar.repository.$self;\n return grammar;\n}\nvar AttributedScopeStack = class _AttributedScopeStack {\n /**\n * Invariant:\n * ```\n * if (parent && !scopePath.extends(parent.scopePath)) {\n * \tthrow new Error();\n * }\n * ```\n */\n constructor(parent, scopePath, tokenAttributes) {\n this.parent = parent;\n this.scopePath = scopePath;\n this.tokenAttributes = tokenAttributes;\n }\n static fromExtension(namesScopeList, contentNameScopesList) {\n let current = namesScopeList;\n let scopeNames = namesScopeList?.scopePath ?? null;\n for (const frame of contentNameScopesList) {\n scopeNames = ScopeStack.push(scopeNames, frame.scopeNames);\n current = new _AttributedScopeStack(current, scopeNames, frame.encodedTokenAttributes);\n }\n return current;\n }\n static createRoot(scopeName, tokenAttributes) {\n return new _AttributedScopeStack(null, new ScopeStack(null, scopeName), tokenAttributes);\n }\n static createRootAndLookUpScopeName(scopeName, tokenAttributes, grammar) {\n const rawRootMetadata = grammar.getMetadataForScope(scopeName);\n const scopePath = new ScopeStack(null, scopeName);\n const rootStyle = grammar.themeProvider.themeMatch(scopePath);\n const resolvedTokenAttributes = _AttributedScopeStack.mergeAttributes(\n tokenAttributes,\n rawRootMetadata,\n rootStyle\n );\n return new _AttributedScopeStack(null, scopePath, resolvedTokenAttributes);\n }\n get scopeName() {\n return this.scopePath.scopeName;\n }\n toString() {\n return this.getScopeNames().join(\" \");\n }\n equals(other) {\n return _AttributedScopeStack.equals(this, other);\n }\n static equals(a, b) {\n do {\n if (a === b) {\n return true;\n }\n if (!a && !b) {\n return true;\n }\n if (!a || !b) {\n return false;\n }\n if (a.scopeName !== b.scopeName || a.tokenAttributes !== b.tokenAttributes) {\n return false;\n }\n a = a.parent;\n b = b.parent;\n } while (true);\n }\n static mergeAttributes(existingTokenAttributes, basicScopeAttributes, styleAttributes) {\n let fontStyle = -1 /* NotSet */;\n let foreground = 0;\n let background = 0;\n if (styleAttributes !== null) {\n fontStyle = styleAttributes.fontStyle;\n foreground = styleAttributes.foregroundId;\n background = styleAttributes.backgroundId;\n }\n return EncodedTokenMetadata.set(\n existingTokenAttributes,\n basicScopeAttributes.languageId,\n basicScopeAttributes.tokenType,\n null,\n fontStyle,\n foreground,\n background\n );\n }\n pushAttributed(scopePath, grammar) {\n if (scopePath === null) {\n return this;\n }\n if (scopePath.indexOf(\" \") === -1) {\n return _AttributedScopeStack._pushAttributed(this, scopePath, grammar);\n }\n const scopes = scopePath.split(/ /g);\n let result = this;\n for (const scope of scopes) {\n result = _AttributedScopeStack._pushAttributed(result, scope, grammar);\n }\n return result;\n }\n static _pushAttributed(target, scopeName, grammar) {\n const rawMetadata = grammar.getMetadataForScope(scopeName);\n const newPath = target.scopePath.push(scopeName);\n const scopeThemeMatchResult = grammar.themeProvider.themeMatch(newPath);\n const metadata = _AttributedScopeStack.mergeAttributes(\n target.tokenAttributes,\n rawMetadata,\n scopeThemeMatchResult\n );\n return new _AttributedScopeStack(target, newPath, metadata);\n }\n getScopeNames() {\n return this.scopePath.getSegments();\n }\n getExtensionIfDefined(base) {\n const result = [];\n let self = this;\n while (self && self !== base) {\n result.push({\n encodedTokenAttributes: self.tokenAttributes,\n scopeNames: self.scopePath.getExtensionIfDefined(self.parent?.scopePath ?? null)\n });\n self = self.parent;\n }\n return self === base ? result.reverse() : void 0;\n }\n};\nvar StateStackImpl = class _StateStackImpl {\n /**\n * Invariant:\n * ```\n * if (contentNameScopesList !== nameScopesList && contentNameScopesList?.parent !== nameScopesList) {\n * \tthrow new Error();\n * }\n * if (this.parent && !nameScopesList.extends(this.parent.contentNameScopesList)) {\n * \tthrow new Error();\n * }\n * ```\n */\n constructor(parent, ruleId, enterPos, anchorPos, beginRuleCapturedEOL, endRule, nameScopesList, contentNameScopesList) {\n this.parent = parent;\n this.ruleId = ruleId;\n this.beginRuleCapturedEOL = beginRuleCapturedEOL;\n this.endRule = endRule;\n this.nameScopesList = nameScopesList;\n this.contentNameScopesList = contentNameScopesList;\n this.depth = this.parent ? this.parent.depth + 1 : 1;\n this._enterPos = enterPos;\n this._anchorPos = anchorPos;\n }\n _stackElementBrand = void 0;\n // TODO remove me\n static NULL = new _StateStackImpl(\n null,\n 0,\n 0,\n 0,\n false,\n null,\n null,\n null\n );\n /**\n * The position on the current line where this state was pushed.\n * This is relevant only while tokenizing a line, to detect endless loops.\n * Its value is meaningless across lines.\n */\n _enterPos;\n /**\n * The captured anchor position when this stack element was pushed.\n * This is relevant only while tokenizing a line, to restore the anchor position when popping.\n * Its value is meaningless across lines.\n */\n _anchorPos;\n /**\n * The depth of the stack.\n */\n depth;\n equals(other) {\n if (other === null) {\n return false;\n }\n return _StateStackImpl._equals(this, other);\n }\n static _equals(a, b) {\n if (a === b) {\n return true;\n }\n if (!this._structuralEquals(a, b)) {\n return false;\n }\n return AttributedScopeStack.equals(a.contentNameScopesList, b.contentNameScopesList);\n }\n /**\n * A structural equals check. Does not take into account `scopes`.\n */\n static _structuralEquals(a, b) {\n do {\n if (a === b) {\n return true;\n }\n if (!a && !b) {\n return true;\n }\n if (!a || !b) {\n return false;\n }\n if (a.depth !== b.depth || a.ruleId !== b.ruleId || a.endRule !== b.endRule) {\n return false;\n }\n a = a.parent;\n b = b.parent;\n } while (true);\n }\n clone() {\n return this;\n }\n static _reset(el) {\n while (el) {\n el._enterPos = -1;\n el._anchorPos = -1;\n el = el.parent;\n }\n }\n reset() {\n _StateStackImpl._reset(this);\n }\n pop() {\n return this.parent;\n }\n safePop() {\n if (this.parent) {\n return this.parent;\n }\n return this;\n }\n push(ruleId, enterPos, anchorPos, beginRuleCapturedEOL, endRule, nameScopesList, contentNameScopesList) {\n return new _StateStackImpl(\n this,\n ruleId,\n enterPos,\n anchorPos,\n beginRuleCapturedEOL,\n endRule,\n nameScopesList,\n contentNameScopesList\n );\n }\n getEnterPos() {\n return this._enterPos;\n }\n getAnchorPos() {\n return this._anchorPos;\n }\n getRule(grammar) {\n return grammar.getRule(this.ruleId);\n }\n toString() {\n const r = [];\n this._writeString(r, 0);\n return \"[\" + r.join(\",\") + \"]\";\n }\n _writeString(res, outIndex) {\n if (this.parent) {\n outIndex = this.parent._writeString(res, outIndex);\n }\n res[outIndex++] = `(${this.ruleId}, ${this.nameScopesList?.toString()}, ${this.contentNameScopesList?.toString()})`;\n return outIndex;\n }\n withContentNameScopesList(contentNameScopeStack) {\n if (this.contentNameScopesList === contentNameScopeStack) {\n return this;\n }\n return this.parent.push(\n this.ruleId,\n this._enterPos,\n this._anchorPos,\n this.beginRuleCapturedEOL,\n this.endRule,\n this.nameScopesList,\n contentNameScopeStack\n );\n }\n withEndRule(endRule) {\n if (this.endRule === endRule) {\n return this;\n }\n return new _StateStackImpl(\n this.parent,\n this.ruleId,\n this._enterPos,\n this._anchorPos,\n this.beginRuleCapturedEOL,\n endRule,\n this.nameScopesList,\n this.contentNameScopesList\n );\n }\n // Used to warn of endless loops\n hasSameRuleAs(other) {\n let el = this;\n while (el && el._enterPos === other._enterPos) {\n if (el.ruleId === other.ruleId) {\n return true;\n }\n el = el.parent;\n }\n return false;\n }\n toStateStackFrame() {\n return {\n ruleId: ruleIdToNumber(this.ruleId),\n beginRuleCapturedEOL: this.beginRuleCapturedEOL,\n endRule: this.endRule,\n nameScopesList: this.nameScopesList?.getExtensionIfDefined(this.parent?.nameScopesList ?? null) ?? [],\n contentNameScopesList: this.contentNameScopesList?.getExtensionIfDefined(this.nameScopesList) ?? []\n };\n }\n static pushFrame(self, frame) {\n const namesScopeList = AttributedScopeStack.fromExtension(self?.nameScopesList ?? null, frame.nameScopesList);\n return new _StateStackImpl(\n self,\n ruleIdFromNumber(frame.ruleId),\n frame.enterPos ?? -1,\n frame.anchorPos ?? -1,\n frame.beginRuleCapturedEOL,\n frame.endRule,\n namesScopeList,\n AttributedScopeStack.fromExtension(namesScopeList, frame.contentNameScopesList)\n );\n }\n};\nvar BalancedBracketSelectors = class {\n balancedBracketScopes;\n unbalancedBracketScopes;\n allowAny = false;\n constructor(balancedBracketScopes, unbalancedBracketScopes) {\n this.balancedBracketScopes = balancedBracketScopes.flatMap(\n (selector) => {\n if (selector === \"*\") {\n this.allowAny = true;\n return [];\n }\n return createMatchers(selector, nameMatcher).map((m) => m.matcher);\n }\n );\n this.unbalancedBracketScopes = unbalancedBracketScopes.flatMap(\n (selector) => createMatchers(selector, nameMatcher).map((m) => m.matcher)\n );\n }\n get matchesAlways() {\n return this.allowAny && this.unbalancedBracketScopes.length === 0;\n }\n get matchesNever() {\n return this.balancedBracketScopes.length === 0 && !this.allowAny;\n }\n match(scopes) {\n for (const excluder of this.unbalancedBracketScopes) {\n if (excluder(scopes)) {\n return false;\n }\n }\n for (const includer of this.balancedBracketScopes) {\n if (includer(scopes)) {\n return true;\n }\n }\n return this.allowAny;\n }\n};\nvar LineTokens = class {\n constructor(emitBinaryTokens, lineText, tokenTypeOverrides, balancedBracketSelectors) {\n this.balancedBracketSelectors = balancedBracketSelectors;\n this._emitBinaryTokens = emitBinaryTokens;\n this._tokenTypeOverrides = tokenTypeOverrides;\n if (false) {\n this._lineText = lineText;\n } else {\n this._lineText = null;\n }\n this._tokens = [];\n this._binaryTokens = [];\n this._lastTokenEndIndex = 0;\n }\n _emitBinaryTokens;\n /**\n * defined only if `false`.\n */\n _lineText;\n /**\n * used only if `_emitBinaryTokens` is false.\n */\n _tokens;\n /**\n * used only if `_emitBinaryTokens` is true.\n */\n _binaryTokens;\n _lastTokenEndIndex;\n _tokenTypeOverrides;\n produce(stack, endIndex) {\n this.produceFromScopes(stack.contentNameScopesList, endIndex);\n }\n produceFromScopes(scopesList, endIndex) {\n if (this._lastTokenEndIndex >= endIndex) {\n return;\n }\n if (this._emitBinaryTokens) {\n let metadata = scopesList?.tokenAttributes ?? 0;\n let containsBalancedBrackets = false;\n if (this.balancedBracketSelectors?.matchesAlways) {\n containsBalancedBrackets = true;\n }\n if (this._tokenTypeOverrides.length > 0 || this.balancedBracketSelectors && !this.balancedBracketSelectors.matchesAlways && !this.balancedBracketSelectors.matchesNever) {\n const scopes2 = scopesList?.getScopeNames() ?? [];\n for (const tokenType of this._tokenTypeOverrides) {\n if (tokenType.matcher(scopes2)) {\n metadata = EncodedTokenMetadata.set(\n metadata,\n 0,\n toOptionalTokenType(tokenType.type),\n null,\n -1 /* NotSet */,\n 0,\n 0\n );\n }\n }\n if (this.balancedBracketSelectors) {\n containsBalancedBrackets = this.balancedBracketSelectors.match(scopes2);\n }\n }\n if (containsBalancedBrackets) {\n metadata = EncodedTokenMetadata.set(\n metadata,\n 0,\n 8 /* NotSet */,\n containsBalancedBrackets,\n -1 /* NotSet */,\n 0,\n 0\n );\n }\n if (this._binaryTokens.length > 0 && this._binaryTokens[this._binaryTokens.length - 1] === metadata) {\n this._lastTokenEndIndex = endIndex;\n return;\n }\n this._binaryTokens.push(this._lastTokenEndIndex);\n this._binaryTokens.push(metadata);\n this._lastTokenEndIndex = endIndex;\n return;\n }\n const scopes = scopesList?.getScopeNames() ?? [];\n this._tokens.push({\n startIndex: this._lastTokenEndIndex,\n endIndex,\n // value: lineText.substring(lastTokenEndIndex, endIndex),\n scopes\n });\n this._lastTokenEndIndex = endIndex;\n }\n getResult(stack, lineLength) {\n if (this._tokens.length > 0 && this._tokens[this._tokens.length - 1].startIndex === lineLength - 1) {\n this._tokens.pop();\n }\n if (this._tokens.length === 0) {\n this._lastTokenEndIndex = -1;\n this.produce(stack, lineLength);\n this._tokens[this._tokens.length - 1].startIndex = 0;\n }\n return this._tokens;\n }\n getBinaryResult(stack, lineLength) {\n if (this._binaryTokens.length > 0 && this._binaryTokens[this._binaryTokens.length - 2] === lineLength - 1) {\n this._binaryTokens.pop();\n this._binaryTokens.pop();\n }\n if (this._binaryTokens.length === 0) {\n this._lastTokenEndIndex = -1;\n this.produce(stack, lineLength);\n this._binaryTokens[this._binaryTokens.length - 2] = 0;\n }\n const result = new Uint32Array(this._binaryTokens.length);\n for (let i = 0, len = this._binaryTokens.length; i < len; i++) {\n result[i] = this._binaryTokens[i];\n }\n return result;\n }\n};\n\n// src/registry.ts\nvar SyncRegistry = class {\n constructor(theme, _onigLib) {\n this._onigLib = _onigLib;\n this._theme = theme;\n }\n _grammars = /* @__PURE__ */ new Map();\n _rawGrammars = /* @__PURE__ */ new Map();\n _injectionGrammars = /* @__PURE__ */ new Map();\n _theme;\n dispose() {\n for (const grammar of this._grammars.values()) {\n grammar.dispose();\n }\n }\n setTheme(theme) {\n this._theme = theme;\n }\n getColorMap() {\n return this._theme.getColorMap();\n }\n /**\n * Add `grammar` to registry and return a list of referenced scope names\n */\n addGrammar(grammar, injectionScopeNames) {\n this._rawGrammars.set(grammar.scopeName, grammar);\n if (injectionScopeNames) {\n this._injectionGrammars.set(grammar.scopeName, injectionScopeNames);\n }\n }\n /**\n * Lookup a raw grammar.\n */\n lookup(scopeName) {\n return this._rawGrammars.get(scopeName);\n }\n /**\n * Returns the injections for the given grammar\n */\n injections(targetScope) {\n return this._injectionGrammars.get(targetScope);\n }\n /**\n * Get the default theme settings\n */\n getDefaults() {\n return this._theme.getDefaults();\n }\n /**\n * Match a scope in the theme.\n */\n themeMatch(scopePath) {\n return this._theme.match(scopePath);\n }\n /**\n * Lookup a grammar.\n */\n grammarForScopeName(scopeName, initialLanguage, embeddedLanguages, tokenTypes, balancedBracketSelectors) {\n if (!this._grammars.has(scopeName)) {\n let rawGrammar = this._rawGrammars.get(scopeName);\n if (!rawGrammar) {\n return null;\n }\n this._grammars.set(scopeName, createGrammar(\n scopeName,\n rawGrammar,\n initialLanguage,\n embeddedLanguages,\n tokenTypes,\n balancedBracketSelectors,\n this,\n this._onigLib\n ));\n }\n return this._grammars.get(scopeName);\n }\n};\n\n// src/index.ts\nvar Registry = class {\n _options;\n _syncRegistry;\n _ensureGrammarCache;\n constructor(options) {\n this._options = options;\n this._syncRegistry = new SyncRegistry(\n Theme.createFromRawTheme(options.theme, options.colorMap),\n options.onigLib\n );\n this._ensureGrammarCache = /* @__PURE__ */ new Map();\n }\n dispose() {\n this._syncRegistry.dispose();\n }\n /**\n * Change the theme. Once called, no previous `ruleStack` should be used anymore.\n */\n setTheme(theme, colorMap) {\n this._syncRegistry.setTheme(Theme.createFromRawTheme(theme, colorMap));\n }\n /**\n * Returns a lookup array for color ids.\n */\n getColorMap() {\n return this._syncRegistry.getColorMap();\n }\n /**\n * Load the grammar for `scopeName` and all referenced included grammars asynchronously.\n * Please do not use language id 0.\n */\n loadGrammarWithEmbeddedLanguages(initialScopeName, initialLanguage, embeddedLanguages) {\n return this.loadGrammarWithConfiguration(initialScopeName, initialLanguage, { embeddedLanguages });\n }\n /**\n * Load the grammar for `scopeName` and all referenced included grammars asynchronously.\n * Please do not use language id 0.\n */\n loadGrammarWithConfiguration(initialScopeName, initialLanguage, configuration) {\n return this._loadGrammar(\n initialScopeName,\n initialLanguage,\n configuration.embeddedLanguages,\n configuration.tokenTypes,\n new BalancedBracketSelectors(\n configuration.balancedBracketSelectors || [],\n configuration.unbalancedBracketSelectors || []\n )\n );\n }\n /**\n * Load the grammar for `scopeName` and all referenced included grammars asynchronously.\n */\n loadGrammar(initialScopeName) {\n return this._loadGrammar(initialScopeName, 0, null, null, null);\n }\n _loadGrammar(initialScopeName, initialLanguage, embeddedLanguages, tokenTypes, balancedBracketSelectors) {\n const dependencyProcessor = new ScopeDependencyProcessor(this._syncRegistry, initialScopeName);\n while (dependencyProcessor.Q.length > 0) {\n dependencyProcessor.Q.map((request) => this._loadSingleGrammar(request.scopeName));\n dependencyProcessor.processQueue();\n }\n return this._grammarForScopeName(\n initialScopeName,\n initialLanguage,\n embeddedLanguages,\n tokenTypes,\n balancedBracketSelectors\n );\n }\n _loadSingleGrammar(scopeName) {\n if (!this._ensureGrammarCache.has(scopeName)) {\n this._doLoadSingleGrammar(scopeName);\n this._ensureGrammarCache.set(scopeName, true);\n }\n }\n _doLoadSingleGrammar(scopeName) {\n const grammar = this._options.loadGrammar(scopeName);\n if (grammar) {\n const injections = typeof this._options.getInjections === \"function\" ? this._options.getInjections(scopeName) : void 0;\n this._syncRegistry.addGrammar(grammar, injections);\n }\n }\n /**\n * Adds a rawGrammar.\n */\n addGrammar(rawGrammar, injections = [], initialLanguage = 0, embeddedLanguages = null) {\n this._syncRegistry.addGrammar(rawGrammar, injections);\n return this._grammarForScopeName(rawGrammar.scopeName, initialLanguage, embeddedLanguages);\n }\n /**\n * Get the grammar for `scopeName`. The grammar must first be created via `loadGrammar` or `addGrammar`.\n */\n _grammarForScopeName(scopeName, initialLanguage = 0, embeddedLanguages = null, tokenTypes = null, balancedBracketSelectors = null) {\n return this._syncRegistry.grammarForScopeName(\n scopeName,\n initialLanguage,\n embeddedLanguages,\n tokenTypes,\n balancedBracketSelectors\n );\n }\n};\nvar INITIAL = StateStackImpl.NULL;\nexport {\n EncodedTokenMetadata,\n FindOption,\n FontStyle,\n INITIAL,\n Registry,\n Theme,\n disposeOnigString\n};\n","/**\n * @typedef {import('./lib/index.js').CharacterReferences} CharacterReferences\n * @typedef {import('./lib/index.js').Options} Options\n * @typedef {import('./lib/index.js').Quote} Quote\n * @typedef {import('./lib/index.js').Space} Space\n */\n\nexport {toHtml} from './lib/index.js'\n","/**\n * @import {Nodes, Parents, RootContent} from 'hast'\n * @import {Schema} from 'property-information'\n * @import {Options as StringifyEntitiesOptions} from 'stringify-entities'\n */\n\n/**\n * @typedef {Omit<StringifyEntitiesOptions, 'attribute' | 'escapeOnly' | 'subset'>} CharacterReferences\n *\n * @typedef Options\n * Configuration.\n * @property {boolean | null | undefined} [allowDangerousCharacters=false]\n * Do not encode some characters which cause XSS vulnerabilities in older\n * browsers (default: `false`).\n *\n * > ⚠️ **Danger**: only set this if you completely trust the content.\n * @property {boolean | null | undefined} [allowDangerousHtml=false]\n * Allow `raw` nodes and insert them as raw HTML (default: `false`).\n *\n * When `false`, `Raw` nodes are encoded.\n *\n * > ⚠️ **Danger**: only set this if you completely trust the content.\n * @property {boolean | null | undefined} [allowParseErrors=false]\n * Do not encode characters which cause parse errors (even though they work),\n * to save bytes (default: `false`).\n *\n * Not used in the SVG space.\n *\n * > 👉 **Note**: intentionally creates parse errors in markup (how parse\n * > errors are handled is well defined, so this works but isn’t pretty).\n * @property {boolean | null | undefined} [bogusComments=false]\n * Use “bogus comments” instead of comments to save byes: `<?charlie>`\n * instead of `<!--charlie-->` (default: `false`).\n *\n * > 👉 **Note**: intentionally creates parse errors in markup (how parse\n * > errors are handled is well defined, so this works but isn’t pretty).\n * @property {CharacterReferences | null | undefined} [characterReferences]\n * Configure how to serialize character references (optional).\n * @property {boolean | null | undefined} [closeEmptyElements=false]\n * Close SVG elements without any content with slash (`/`) on the opening tag\n * instead of an end tag: `<circle />` instead of `<circle></circle>`\n * (default: `false`).\n *\n * See `tightSelfClosing` to control whether a space is used before the\n * slash.\n *\n * Not used in the HTML space.\n * @property {boolean | null | undefined} [closeSelfClosing=false]\n * Close self-closing nodes with an extra slash (`/`): `<img />` instead of\n * `<img>` (default: `false`).\n *\n * See `tightSelfClosing` to control whether a space is used before the\n * slash.\n *\n * Not used in the SVG space.\n * @property {boolean | null | undefined} [collapseEmptyAttributes=false]\n * Collapse empty attributes: get `class` instead of `class=\"\"` (default:\n * `false`).\n *\n * Not used in the SVG space.\n *\n * > 👉 **Note**: boolean attributes (such as `hidden`) are always collapsed.\n * @property {boolean | null | undefined} [omitOptionalTags=false]\n * Omit optional opening and closing tags (default: `false`).\n *\n * For example, in `<ol><li>one</li><li>two</li></ol>`, both `</li>` closing\n * tags can be omitted.\n * The first because it’s followed by another `li`, the last because it’s\n * followed by nothing.\n *\n * Not used in the SVG space.\n * @property {boolean | null | undefined} [preferUnquoted=false]\n * Leave attributes unquoted if that results in less bytes (default: `false`).\n *\n * Not used in the SVG space.\n * @property {boolean | null | undefined} [quoteSmart=false]\n * Use the other quote if that results in less bytes (default: `false`).\n * @property {Quote | null | undefined} [quote='\"']\n * Preferred quote to use (default: `'\"'`).\n * @property {Space | null | undefined} [space='html']\n * When an `<svg>` element is found in the HTML space, this package already\n * automatically switches to and from the SVG space when entering and exiting\n * it (default: `'html'`).\n *\n * > 👉 **Note**: hast is not XML.\n * > It supports SVG as embedded in HTML.\n * > It does not support the features available in XML.\n * > Passing SVG might break but fragments of modern SVG should be fine.\n * > Use [`xast`][xast] if you need to support SVG as XML.\n * @property {boolean | null | undefined} [tightAttributes=false]\n * Join attributes together, without whitespace, if possible: get\n * `class=\"a b\"title=\"c d\"` instead of `class=\"a b\" title=\"c d\"` to save\n * bytes (default: `false`).\n *\n * Not used in the SVG space.\n *\n * > 👉 **Note**: intentionally creates parse errors in markup (how parse\n * > errors are handled is well defined, so this works but isn’t pretty).\n * @property {boolean | null | undefined} [tightCommaSeparatedLists=false]\n * Join known comma-separated attribute values with just a comma (`,`),\n * instead of padding them on the right as well (`,␠`, where `␠` represents a\n * space) (default: `false`).\n * @property {boolean | null | undefined} [tightDoctype=false]\n * Drop unneeded spaces in doctypes: `<!doctypehtml>` instead of\n * `<!doctype html>` to save bytes (default: `false`).\n *\n * > 👉 **Note**: intentionally creates parse errors in markup (how parse\n * > errors are handled is well defined, so this works but isn’t pretty).\n * @property {boolean | null | undefined} [tightSelfClosing=false]\n * Do not use an extra space when closing self-closing elements: `<img/>`\n * instead of `<img />` (default: `false`).\n *\n * > 👉 **Note**: only used if `closeSelfClosing: true` or\n * > `closeEmptyElements: true`.\n * @property {boolean | null | undefined} [upperDoctype=false]\n * Use a `<!DOCTYPE…` instead of `<!doctype…` (default: `false`).\n *\n * Useless except for XHTML.\n * @property {ReadonlyArray<string> | null | undefined} [voids]\n * Tag names of elements to serialize without closing tag (default: `html-void-elements`).\n *\n * Not used in the SVG space.\n *\n * > 👉 **Note**: It’s highly unlikely that you want to pass this, because\n * > hast is not for XML, and HTML will not add more void elements.\n *\n * @typedef {'\"' | \"'\"} Quote\n * HTML quotes for attribute values.\n *\n * @typedef {Omit<Required<{[key in keyof Options]: Exclude<Options[key], null | undefined>}>, 'space' | 'quote'>} Settings\n *\n * @typedef {'html' | 'svg'} Space\n * Namespace.\n *\n * @typedef State\n * Info passed around about the current state.\n * @property {(node: Parents | undefined) => string} all\n * Serialize the children of a parent node.\n * @property {Quote} alternative\n * Alternative quote.\n * @property {(node: Nodes, index: number | undefined, parent: Parents | undefined) => string} one\n * Serialize one node.\n * @property {Quote} quote\n * Preferred quote.\n * @property {Schema} schema\n * Current schema.\n * @property {Settings} settings\n * User configuration.\n */\n\nimport {htmlVoidElements} from 'html-void-elements'\nimport {html, svg} from 'property-information'\nimport {handle} from './handle/index.js'\n\n/** @type {Options} */\nconst emptyOptions = {}\n\n/** @type {CharacterReferences} */\nconst emptyCharacterReferences = {}\n\n/** @type {Array<never>} */\nconst emptyChildren = []\n\n/**\n * Serialize hast as HTML.\n *\n * @param {Array<RootContent> | Nodes} tree\n * Tree to serialize.\n * @param {Options | null | undefined} [options]\n * Configuration (optional).\n * @returns {string}\n * Serialized HTML.\n */\nexport function toHtml(tree, options) {\n const options_ = options || emptyOptions\n const quote = options_.quote || '\"'\n const alternative = quote === '\"' ? \"'\" : '\"'\n\n if (quote !== '\"' && quote !== \"'\") {\n throw new Error('Invalid quote `' + quote + '`, expected `\\'` or `\"`')\n }\n\n /** @type {State} */\n const state = {\n one,\n all,\n settings: {\n omitOptionalTags: options_.omitOptionalTags || false,\n allowParseErrors: options_.allowParseErrors || false,\n allowDangerousCharacters: options_.allowDangerousCharacters || false,\n quoteSmart: options_.quoteSmart || false,\n preferUnquoted: options_.preferUnquoted || false,\n tightAttributes: options_.tightAttributes || false,\n upperDoctype: options_.upperDoctype || false,\n tightDoctype: options_.tightDoctype || false,\n bogusComments: options_.bogusComments || false,\n tightCommaSeparatedLists: options_.tightCommaSeparatedLists || false,\n tightSelfClosing: options_.tightSelfClosing || false,\n collapseEmptyAttributes: options_.collapseEmptyAttributes || false,\n allowDangerousHtml: options_.allowDangerousHtml || false,\n voids: options_.voids || htmlVoidElements,\n characterReferences:\n options_.characterReferences || emptyCharacterReferences,\n closeSelfClosing: options_.closeSelfClosing || false,\n closeEmptyElements: options_.closeEmptyElements || false\n },\n schema: options_.space === 'svg' ? svg : html,\n quote,\n alternative\n }\n\n return state.one(\n Array.isArray(tree) ? {type: 'root', children: tree} : tree,\n undefined,\n undefined\n )\n}\n\n/**\n * Serialize a node.\n *\n * @this {State}\n * Info passed around about the current state.\n * @param {Nodes} node\n * Node to handle.\n * @param {number | undefined} index\n * Index of `node` in `parent.\n * @param {Parents | undefined} parent\n * Parent of `node`.\n * @returns {string}\n * Serialized node.\n */\nfunction one(node, index, parent) {\n return handle(node, index, parent, this)\n}\n\n/**\n * Serialize all children of `parent`.\n *\n * @this {State}\n * Info passed around about the current state.\n * @param {Parents | undefined} parent\n * Parent whose children to serialize.\n * @returns {string}\n */\nexport function all(parent) {\n /** @type {Array<string>} */\n const results = []\n const children = (parent && parent.children) || emptyChildren\n let index = -1\n\n while (++index < children.length) {\n results[index] = this.one(children[index], index, parent)\n }\n\n return results.join('')\n}\n","/**\n * @import {Nodes, Parents} from 'hast'\n * @import {State} from '../index.js'\n */\n\nimport {zwitch} from 'zwitch'\nimport {comment} from './comment.js'\nimport {doctype} from './doctype.js'\nimport {element} from './element.js'\nimport {raw} from './raw.js'\nimport {root} from './root.js'\nimport {text} from './text.js'\n\n/**\n * @type {(node: Nodes, index: number | undefined, parent: Parents | undefined, state: State) => string}\n */\nexport const handle = zwitch('type', {\n invalid,\n unknown,\n handlers: {comment, doctype, element, raw, root, text}\n})\n\n/**\n * Fail when a non-node is found in the tree.\n *\n * @param {unknown} node\n * Unknown value.\n * @returns {never}\n * Never.\n */\nfunction invalid(node) {\n throw new Error('Expected node, not `' + node + '`')\n}\n\n/**\n * Fail when a node with an unknown type is found in the tree.\n *\n * @param {unknown} node_\n * Unknown node.\n * @returns {never}\n * Never.\n */\nfunction unknown(node_) {\n // `type` is guaranteed by runtime JS.\n const node = /** @type {Nodes} */ (node_)\n throw new Error('Cannot compile unknown node `' + node.type + '`')\n}\n","/**\n * @import {Comment, Parents} from 'hast'\n * @import {State} from '../index.js'\n */\n\nimport {stringifyEntities} from 'stringify-entities'\n\nconst htmlCommentRegex = /^>|^->|<!--|-->|--!>|<!-$/g\n\n// Declare arrays as variables so it can be cached by `stringifyEntities`\nconst bogusCommentEntitySubset = ['>']\nconst commentEntitySubset = ['<', '>']\n\n/**\n * Serialize a comment.\n *\n * @param {Comment} node\n * Node to handle.\n * @param {number | undefined} _1\n * Index of `node` in `parent.\n * @param {Parents | undefined} _2\n * Parent of `node`.\n * @param {State} state\n * Info passed around about the current state.\n * @returns {string}\n * Serialized node.\n */\nexport function comment(node, _1, _2, state) {\n // See: <https://html.spec.whatwg.org/multipage/syntax.html#comments>\n return state.settings.bogusComments\n ? '<?' +\n stringifyEntities(\n node.value,\n Object.assign({}, state.settings.characterReferences, {\n subset: bogusCommentEntitySubset\n })\n ) +\n '>'\n : '<!--' + node.value.replace(htmlCommentRegex, encode) + '-->'\n\n /**\n * @param {string} $0\n */\n function encode($0) {\n return stringifyEntities(\n $0,\n Object.assign({}, state.settings.characterReferences, {\n subset: commentEntitySubset\n })\n )\n }\n}\n","/**\n * @typedef {import('./core.js').CoreOptions & import('./util/format-smart.js').FormatSmartOptions} Options\n * @typedef {import('./core.js').CoreOptions} LightOptions\n */\n\nimport {core} from './core.js'\nimport {formatSmart} from './util/format-smart.js'\nimport {formatBasic} from './util/format-basic.js'\n\n/**\n * Encode special characters in `value`.\n *\n * @param {string} value\n * Value to encode.\n * @param {Options} [options]\n * Configuration.\n * @returns {string}\n * Encoded value.\n */\nexport function stringifyEntities(value, options) {\n return core(value, Object.assign({format: formatSmart}, options))\n}\n\n/**\n * Encode special characters in `value` as hexadecimals.\n *\n * @param {string} value\n * Value to encode.\n * @param {LightOptions} [options]\n * Configuration.\n * @returns {string}\n * Encoded value.\n */\nexport function stringifyEntitiesLight(value, options) {\n return core(value, Object.assign({format: formatBasic}, options))\n}\n","/**\n * @typedef CoreOptions\n * @property {ReadonlyArray<string>} [subset=[]]\n * Whether to only escape the given subset of characters.\n * @property {boolean} [escapeOnly=false]\n * Whether to only escape possibly dangerous characters.\n * Those characters are `\"`, `&`, `'`, `<`, `>`, and `` ` ``.\n *\n * @typedef FormatOptions\n * @property {(code: number, next: number, options: CoreWithFormatOptions) => string} format\n * Format strategy.\n *\n * @typedef {CoreOptions & FormatOptions & import('./util/format-smart.js').FormatSmartOptions} CoreWithFormatOptions\n */\n\nconst defaultSubsetRegex = /[\"&'<>`]/g\nconst surrogatePairsRegex = /[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]/g\nconst controlCharactersRegex =\n // eslint-disable-next-line no-control-regex, unicorn/no-hex-escape\n /[\\x01-\\t\\v\\f\\x0E-\\x1F\\x7F\\x81\\x8D\\x8F\\x90\\x9D\\xA0-\\uFFFF]/g\nconst regexEscapeRegex = /[|\\\\{}()[\\]^$+*?.]/g\n\n/** @type {WeakMap<ReadonlyArray<string>, RegExp>} */\nconst subsetToRegexCache = new WeakMap()\n\n/**\n * Encode certain characters in `value`.\n *\n * @param {string} value\n * @param {CoreWithFormatOptions} options\n * @returns {string}\n */\nexport function core(value, options) {\n value = value.replace(\n options.subset\n ? charactersToExpressionCached(options.subset)\n : defaultSubsetRegex,\n basic\n )\n\n if (options.subset || options.escapeOnly) {\n return value\n }\n\n return (\n value\n // Surrogate pairs.\n .replace(surrogatePairsRegex, surrogate)\n // BMP control characters (C0 except for LF, CR, SP; DEL; and some more\n // non-ASCII ones).\n .replace(controlCharactersRegex, basic)\n )\n\n /**\n * @param {string} pair\n * @param {number} index\n * @param {string} all\n */\n function surrogate(pair, index, all) {\n return options.format(\n (pair.charCodeAt(0) - 0xd800) * 0x400 +\n pair.charCodeAt(1) -\n 0xdc00 +\n 0x10000,\n all.charCodeAt(index + 2),\n options\n )\n }\n\n /**\n * @param {string} character\n * @param {number} index\n * @param {string} all\n */\n function basic(character, index, all) {\n return options.format(\n character.charCodeAt(0),\n all.charCodeAt(index + 1),\n options\n )\n }\n}\n\n/**\n * A wrapper function that caches the result of `charactersToExpression` with a WeakMap.\n * This can improve performance when tooling calls `charactersToExpression` repeatedly\n * with the same subset.\n *\n * @param {ReadonlyArray<string>} subset\n * @returns {RegExp}\n */\nfunction charactersToExpressionCached(subset) {\n let cached = subsetToRegexCache.get(subset)\n\n if (!cached) {\n cached = charactersToExpression(subset)\n subsetToRegexCache.set(subset, cached)\n }\n\n return cached\n}\n\n/**\n * @param {ReadonlyArray<string>} subset\n * @returns {RegExp}\n */\nfunction charactersToExpression(subset) {\n /** @type {Array<string>} */\n const groups = []\n let index = -1\n\n while (++index < subset.length) {\n groups.push(subset[index].replace(regexEscapeRegex, '\\\\$&'))\n }\n\n return new RegExp('(?:' + groups.join('|') + ')', 'g')\n}\n","/**\n * @typedef FormatSmartOptions\n * @property {boolean} [useNamedReferences=false]\n * Prefer named character references (`&amp;`) where possible.\n * @property {boolean} [useShortestReferences=false]\n * Prefer the shortest possible reference, if that results in less bytes.\n * **Note**: `useNamedReferences` can be omitted when using `useShortestReferences`.\n * @property {boolean} [omitOptionalSemicolons=false]\n * Whether to omit semicolons when possible.\n * **Note**: This creates what HTML calls “parse errors” but is otherwise still valid HTML — don’t use this except when building a minifier.\n * Omitting semicolons is possible for certain named and numeric references in some cases.\n * @property {boolean} [attribute=false]\n * Create character references which don’t fail in attributes.\n * **Note**: `attribute` only applies when operating dangerously with\n * `omitOptionalSemicolons: true`.\n */\n\nimport {toHexadecimal} from './to-hexadecimal.js'\nimport {toDecimal} from './to-decimal.js'\nimport {toNamed} from './to-named.js'\n\n/**\n * Configurable ways to encode a character yielding pretty or small results.\n *\n * @param {number} code\n * @param {number} next\n * @param {FormatSmartOptions} options\n * @returns {string}\n */\nexport function formatSmart(code, next, options) {\n let numeric = toHexadecimal(code, next, options.omitOptionalSemicolons)\n /** @type {string|undefined} */\n let named\n\n if (options.useNamedReferences || options.useShortestReferences) {\n named = toNamed(\n code,\n next,\n options.omitOptionalSemicolons,\n options.attribute\n )\n }\n\n // Use the shortest numeric reference when requested.\n // A simple algorithm would use decimal for all code points under 100, as\n // those are shorter than hexadecimal:\n //\n // * `&#99;` vs `&#x63;` (decimal shorter)\n // * `&#100;` vs `&#x64;` (equal)\n //\n // However, because we take `next` into consideration when `omit` is used,\n // And it would be possible that decimals are shorter on bigger values as\n // well if `next` is hexadecimal but not decimal, we instead compare both.\n if (\n (options.useShortestReferences || !named) &&\n options.useShortestReferences\n ) {\n const decimal = toDecimal(code, next, options.omitOptionalSemicolons)\n\n if (decimal.length < numeric.length) {\n numeric = decimal\n }\n }\n\n return named &&\n (!options.useShortestReferences || named.length < numeric.length)\n ? named\n : numeric\n}\n","const hexadecimalRegex = /[\\dA-Fa-f]/\n\n/**\n * Configurable ways to encode characters as hexadecimal references.\n *\n * @param {number} code\n * @param {number} next\n * @param {boolean|undefined} omit\n * @returns {string}\n */\nexport function toHexadecimal(code, next, omit) {\n const value = '&#x' + code.toString(16).toUpperCase()\n return omit && next && !hexadecimalRegex.test(String.fromCharCode(next))\n ? value\n : value + ';'\n}\n","const decimalRegex = /\\d/\n\n/**\n * Configurable ways to encode characters as decimal references.\n *\n * @param {number} code\n * @param {number} next\n * @param {boolean|undefined} omit\n * @returns {string}\n */\nexport function toDecimal(code, next, omit) {\n const value = '&#' + String(code)\n return omit && next && !decimalRegex.test(String.fromCharCode(next))\n ? value\n : value + ';'\n}\n","import {characterEntitiesLegacy} from 'character-entities-legacy'\nimport {characterEntitiesHtml4} from 'character-entities-html4'\nimport {dangerous} from '../constant/dangerous.js'\n\nconst own = {}.hasOwnProperty\n\n/**\n * `characterEntitiesHtml4` but inverted.\n *\n * @type {Record<string, string>}\n */\nconst characters = {}\n\n/** @type {string} */\nlet key\n\nfor (key in characterEntitiesHtml4) {\n if (own.call(characterEntitiesHtml4, key)) {\n characters[characterEntitiesHtml4[key]] = key\n }\n}\n\nconst notAlphanumericRegex = /[^\\dA-Za-z]/\n\n/**\n * Configurable ways to encode characters as named references.\n *\n * @param {number} code\n * @param {number} next\n * @param {boolean|undefined} omit\n * @param {boolean|undefined} attribute\n * @returns {string}\n */\nexport function toNamed(code, next, omit, attribute) {\n const character = String.fromCharCode(code)\n\n if (own.call(characters, character)) {\n const name = characters[character]\n const value = '&' + name\n\n if (\n omit &&\n characterEntitiesLegacy.includes(name) &&\n !dangerous.includes(name) &&\n (!attribute ||\n (next &&\n next !== 61 /* `=` */ &&\n notAlphanumericRegex.test(String.fromCharCode(next))))\n ) {\n return value\n }\n\n return value + ';'\n }\n\n return ''\n}\n","/**\n * List of legacy HTML named character references that don’t need a trailing semicolon.\n *\n * @type {Array<string>}\n */\nexport const characterEntitiesLegacy = [\n 'AElig',\n 'AMP',\n 'Aacute',\n 'Acirc',\n 'Agrave',\n 'Aring',\n 'Atilde',\n 'Auml',\n 'COPY',\n 'Ccedil',\n 'ETH',\n 'Eacute',\n 'Ecirc',\n 'Egrave',\n 'Euml',\n 'GT',\n 'Iacute',\n 'Icirc',\n 'Igrave',\n 'Iuml',\n 'LT',\n 'Ntilde',\n 'Oacute',\n 'Ocirc',\n 'Ograve',\n 'Oslash',\n 'Otilde',\n 'Ouml',\n 'QUOT',\n 'REG',\n 'THORN',\n 'Uacute',\n 'Ucirc',\n 'Ugrave',\n 'Uuml',\n 'Yacute',\n 'aacute',\n 'acirc',\n 'acute',\n 'aelig',\n 'agrave',\n 'amp',\n 'aring',\n 'atilde',\n 'auml',\n 'brvbar',\n 'ccedil',\n 'cedil',\n 'cent',\n 'copy',\n 'curren',\n 'deg',\n 'divide',\n 'eacute',\n 'ecirc',\n 'egrave',\n 'eth',\n 'euml',\n 'frac12',\n 'frac14',\n 'frac34',\n 'gt',\n 'iacute',\n 'icirc',\n 'iexcl',\n 'igrave',\n 'iquest',\n 'iuml',\n 'laquo',\n 'lt',\n 'macr',\n 'micro',\n 'middot',\n 'nbsp',\n 'not',\n 'ntilde',\n 'oacute',\n 'ocirc',\n 'ograve',\n 'ordf',\n 'ordm',\n 'oslash',\n 'otilde',\n 'ouml',\n 'para',\n 'plusmn',\n 'pound',\n 'quot',\n 'raquo',\n 'reg',\n 'sect',\n 'shy',\n 'sup1',\n 'sup2',\n 'sup3',\n 'szlig',\n 'thorn',\n 'times',\n 'uacute',\n 'ucirc',\n 'ugrave',\n 'uml',\n 'uuml',\n 'yacute',\n 'yen',\n 'yuml'\n]\n","/**\n * Map of named character references from HTML 4.\n *\n * @type {Record<string, string>}\n */\nexport const characterEntitiesHtml4 = {\n nbsp: ' ',\n iexcl: '¡',\n cent: '¢',\n pound: '£',\n curren: '¤',\n yen: '¥',\n brvbar: '¦',\n sect: '§',\n uml: '¨',\n copy: '©',\n ordf: 'ª',\n laquo: '«',\n not: '¬',\n shy: '­',\n reg: '®',\n macr: '¯',\n deg: '°',\n plusmn: '±',\n sup2: '²',\n sup3: '³',\n acute: '´',\n micro: 'µ',\n para: '¶',\n middot: '·',\n cedil: '¸',\n sup1: '¹',\n ordm: 'º',\n raquo: '»',\n frac14: '¼',\n frac12: '½',\n frac34: '¾',\n iquest: '¿',\n Agrave: 'À',\n Aacute: 'Á',\n Acirc: 'Â',\n Atilde: 'Ã',\n Auml: 'Ä',\n Aring: 'Å',\n AElig: 'Æ',\n Ccedil: 'Ç',\n Egrave: 'È',\n Eacute: 'É',\n Ecirc: 'Ê',\n Euml: 'Ë',\n Igrave: 'Ì',\n Iacute: 'Í',\n Icirc: 'Î',\n Iuml: 'Ï',\n ETH: 'Ð',\n Ntilde: 'Ñ',\n Ograve: 'Ò',\n Oacute: 'Ó',\n Ocirc: 'Ô',\n Otilde: 'Õ',\n Ouml: 'Ö',\n times: '×',\n Oslash: 'Ø',\n Ugrave: 'Ù',\n Uacute: 'Ú',\n Ucirc: 'Û',\n Uuml: 'Ü',\n Yacute: 'Ý',\n THORN: 'Þ',\n szlig: 'ß',\n agrave: 'à',\n aacute: 'á',\n acirc: 'â',\n atilde: 'ã',\n auml: 'ä',\n aring: 'å',\n aelig: 'æ',\n ccedil: 'ç',\n egrave: 'è',\n eacute: 'é',\n ecirc: 'ê',\n euml: 'ë',\n igrave: 'ì',\n iacute: 'í',\n icirc: 'î',\n iuml: 'ï',\n eth: 'ð',\n ntilde: 'ñ',\n ograve: 'ò',\n oacute: 'ó',\n ocirc: 'ô',\n otilde: 'õ',\n ouml: 'ö',\n divide: '÷',\n oslash: 'ø',\n ugrave: 'ù',\n uacute: 'ú',\n ucirc: 'û',\n uuml: 'ü',\n yacute: 'ý',\n thorn: 'þ',\n yuml: 'ÿ',\n fnof: 'ƒ',\n Alpha: 'Α',\n Beta: 'Β',\n Gamma: 'Γ',\n Delta: 'Δ',\n Epsilon: 'Ε',\n Zeta: 'Ζ',\n Eta: 'Η',\n Theta: 'Θ',\n Iota: 'Ι',\n Kappa: 'Κ',\n Lambda: 'Λ',\n Mu: 'Μ',\n Nu: 'Ν',\n Xi: 'Ξ',\n Omicron: 'Ο',\n Pi: 'Π',\n Rho: 'Ρ',\n Sigma: 'Σ',\n Tau: 'Τ',\n Upsilon: 'Υ',\n Phi: 'Φ',\n Chi: 'Χ',\n Psi: 'Ψ',\n Omega: 'Ω',\n alpha: 'α',\n beta: 'β',\n gamma: 'γ',\n delta: 'δ',\n epsilon: 'ε',\n zeta: 'ζ',\n eta: 'η',\n theta: 'θ',\n iota: 'ι',\n kappa: 'κ',\n lambda: 'λ',\n mu: 'μ',\n nu: 'ν',\n xi: 'ξ',\n omicron: 'ο',\n pi: 'π',\n rho: 'ρ',\n sigmaf: 'ς',\n sigma: 'σ',\n tau: 'τ',\n upsilon: 'υ',\n phi: 'φ',\n chi: 'χ',\n psi: 'ψ',\n omega: 'ω',\n thetasym: 'ϑ',\n upsih: 'ϒ',\n piv: 'ϖ',\n bull: '•',\n hellip: '…',\n prime: '′',\n Prime: '″',\n oline: '‾',\n frasl: '⁄',\n weierp: '℘',\n image: 'ℑ',\n real: 'ℜ',\n trade: '™',\n alefsym: 'ℵ',\n larr: '←',\n uarr: '↑',\n rarr: '→',\n darr: '↓',\n harr: '↔',\n crarr: '↵',\n lArr: '⇐',\n uArr: '⇑',\n rArr: '⇒',\n dArr: '⇓',\n hArr: '⇔',\n forall: '∀',\n part: '∂',\n exist: '∃',\n empty: '∅',\n nabla: '∇',\n isin: '∈',\n notin: '∉',\n ni: '∋',\n prod: '∏',\n sum: '∑',\n minus: '−',\n lowast: '∗',\n radic: '√',\n prop: '∝',\n infin: '∞',\n ang: '∠',\n and: '∧',\n or: '∨',\n cap: '∩',\n cup: '∪',\n int: '∫',\n there4: '∴',\n sim: '∼',\n cong: '≅',\n asymp: '≈',\n ne: '≠',\n equiv: '≡',\n le: '≤',\n ge: '≥',\n sub: '⊂',\n sup: '⊃',\n nsub: '⊄',\n sube: '⊆',\n supe: '⊇',\n oplus: '⊕',\n otimes: '⊗',\n perp: '⊥',\n sdot: '⋅',\n lceil: '⌈',\n rceil: '⌉',\n lfloor: '⌊',\n rfloor: '⌋',\n lang: '〈',\n rang: '〉',\n loz: '◊',\n spades: '♠',\n clubs: '♣',\n hearts: '♥',\n diams: '♦',\n quot: '\"',\n amp: '&',\n lt: '<',\n gt: '>',\n OElig: 'Œ',\n oelig: 'œ',\n Scaron: 'Š',\n scaron: 'š',\n Yuml: 'Ÿ',\n circ: 'ˆ',\n tilde: '˜',\n ensp: ' ',\n emsp: ' ',\n thinsp: ' ',\n zwnj: '‌',\n zwj: '‍',\n lrm: '‎',\n rlm: '‏',\n ndash: '–',\n mdash: '—',\n lsquo: '‘',\n rsquo: '’',\n sbquo: '‚',\n ldquo: '“',\n rdquo: '”',\n bdquo: '„',\n dagger: '†',\n Dagger: '‡',\n permil: '‰',\n lsaquo: '‹',\n rsaquo: '›',\n euro: '€'\n}\n","/**\n * List of legacy (that don’t need a trailing `;`) named references which could,\n * depending on what follows them, turn into a different meaning\n *\n * @type {Array<string>}\n */\nexport const dangerous = [\n 'cent',\n 'copy',\n 'divide',\n 'gt',\n 'lt',\n 'not',\n 'para',\n 'times'\n]\n","/**\n * @import {Doctype, Parents} from 'hast'\n * @import {State} from '../index.js'\n */\n\n/**\n * Serialize a doctype.\n *\n * @param {Doctype} _1\n * Node to handle.\n * @param {number | undefined} _2\n * Index of `node` in `parent.\n * @param {Parents | undefined} _3\n * Parent of `node`.\n * @param {State} state\n * Info passed around about the current state.\n * @returns {string}\n * Serialized node.\n */\nexport function doctype(_1, _2, _3, state) {\n return (\n '<!' +\n (state.settings.upperDoctype ? 'DOCTYPE' : 'doctype') +\n (state.settings.tightDoctype ? '' : ' ') +\n 'html>'\n )\n}\n","/**\n * @import {Element, Parents, Properties} from 'hast'\n * @import {State} from '../index.js'\n */\n\nimport {ccount} from 'ccount'\nimport {stringify as commas} from 'comma-separated-tokens'\nimport {find, svg} from 'property-information'\nimport {stringify as spaces} from 'space-separated-tokens'\nimport {stringifyEntities} from 'stringify-entities'\nimport {closing} from '../omission/closing.js'\nimport {opening} from '../omission/opening.js'\n\n/**\n * Maps of subsets.\n *\n * Each value is a matrix of tuples.\n * The value at `0` causes parse errors, the value at `1` is valid.\n * Of both, the value at `0` is unsafe, and the value at `1` is safe.\n *\n * @type {Record<'double' | 'name' | 'single' | 'unquoted', Array<[Array<string>, Array<string>]>>}\n */\nconst constants = {\n // See: <https://html.spec.whatwg.org/#attribute-name-state>.\n name: [\n ['\\t\\n\\f\\r &/=>'.split(''), '\\t\\n\\f\\r \"&\\'/=>`'.split('')],\n ['\\0\\t\\n\\f\\r \"&\\'/<=>'.split(''), '\\0\\t\\n\\f\\r \"&\\'/<=>`'.split('')]\n ],\n // See: <https://html.spec.whatwg.org/#attribute-value-(unquoted)-state>.\n unquoted: [\n ['\\t\\n\\f\\r &>'.split(''), '\\0\\t\\n\\f\\r \"&\\'<=>`'.split('')],\n ['\\0\\t\\n\\f\\r \"&\\'<=>`'.split(''), '\\0\\t\\n\\f\\r \"&\\'<=>`'.split('')]\n ],\n // See: <https://html.spec.whatwg.org/#attribute-value-(single-quoted)-state>.\n single: [\n [\"&'\".split(''), '\"&\\'`'.split('')],\n [\"\\0&'\".split(''), '\\0\"&\\'`'.split('')]\n ],\n // See: <https://html.spec.whatwg.org/#attribute-value-(double-quoted)-state>.\n double: [\n ['\"&'.split(''), '\"&\\'`'.split('')],\n ['\\0\"&'.split(''), '\\0\"&\\'`'.split('')]\n ]\n}\n\n/**\n * Serialize an element node.\n *\n * @param {Element} node\n * Node to handle.\n * @param {number | undefined} index\n * Index of `node` in `parent.\n * @param {Parents | undefined} parent\n * Parent of `node`.\n * @param {State} state\n * Info passed around about the current state.\n * @returns {string}\n * Serialized node.\n */\nexport function element(node, index, parent, state) {\n const schema = state.schema\n const omit = schema.space === 'svg' ? false : state.settings.omitOptionalTags\n let selfClosing =\n schema.space === 'svg'\n ? state.settings.closeEmptyElements\n : state.settings.voids.includes(node.tagName.toLowerCase())\n /** @type {Array<string>} */\n const parts = []\n /** @type {string} */\n let last\n\n if (schema.space === 'html' && node.tagName === 'svg') {\n state.schema = svg\n }\n\n const attributes = serializeAttributes(state, node.properties)\n\n const content = state.all(\n schema.space === 'html' && node.tagName === 'template' ? node.content : node\n )\n\n state.schema = schema\n\n // If the node is categorised as void, but it has children, remove the\n // categorisation.\n // This enables for example `menuitem`s, which are void in W3C HTML but not\n // void in WHATWG HTML, to be stringified properly.\n // Note: `menuitem` has since been removed from the HTML spec, and so is no\n // longer void.\n if (content) selfClosing = false\n\n if (attributes || !omit || !opening(node, index, parent)) {\n parts.push('<', node.tagName, attributes ? ' ' + attributes : '')\n\n if (\n selfClosing &&\n (schema.space === 'svg' || state.settings.closeSelfClosing)\n ) {\n last = attributes.charAt(attributes.length - 1)\n if (\n !state.settings.tightSelfClosing ||\n last === '/' ||\n (last && last !== '\"' && last !== \"'\")\n ) {\n parts.push(' ')\n }\n\n parts.push('/')\n }\n\n parts.push('>')\n }\n\n parts.push(content)\n\n if (!selfClosing && (!omit || !closing(node, index, parent))) {\n parts.push('</' + node.tagName + '>')\n }\n\n return parts.join('')\n}\n\n/**\n * @param {State} state\n * @param {Properties | null | undefined} properties\n * @returns {string}\n */\nfunction serializeAttributes(state, properties) {\n /** @type {Array<string>} */\n const values = []\n let index = -1\n /** @type {string} */\n let key\n\n if (properties) {\n for (key in properties) {\n if (properties[key] !== null && properties[key] !== undefined) {\n const value = serializeAttribute(state, key, properties[key])\n if (value) values.push(value)\n }\n }\n }\n\n while (++index < values.length) {\n const last = state.settings.tightAttributes\n ? values[index].charAt(values[index].length - 1)\n : undefined\n\n // In tight mode, don’t add a space after quoted attributes.\n if (index !== values.length - 1 && last !== '\"' && last !== \"'\") {\n values[index] += ' '\n }\n }\n\n return values.join('')\n}\n\n/**\n * @param {State} state\n * @param {string} key\n * @param {Properties[keyof Properties]} value\n * @returns {string}\n */\nfunction serializeAttribute(state, key, value) {\n const info = find(state.schema, key)\n const x =\n state.settings.allowParseErrors && state.schema.space === 'html' ? 0 : 1\n const y = state.settings.allowDangerousCharacters ? 0 : 1\n let quote = state.quote\n /** @type {string | undefined} */\n let result\n\n if (info.overloadedBoolean && (value === info.attribute || value === '')) {\n value = true\n } else if (\n (info.boolean || info.overloadedBoolean) &&\n (typeof value !== 'string' || value === info.attribute || value === '')\n ) {\n value = Boolean(value)\n }\n\n if (\n value === null ||\n value === undefined ||\n value === false ||\n (typeof value === 'number' && Number.isNaN(value))\n ) {\n return ''\n }\n\n const name = stringifyEntities(\n info.attribute,\n Object.assign({}, state.settings.characterReferences, {\n // Always encode without parse errors in non-HTML.\n subset: constants.name[x][y]\n })\n )\n\n // No value.\n // There is currently only one boolean property in SVG: `[download]` on\n // `<a>`.\n // This property does not seem to work in browsers (Firefox, Safari, Chrome),\n // so I can’t test if dropping the value works.\n // But I assume that it should:\n //\n // ```html\n // <!doctype html>\n // <svg viewBox=\"0 0 100 100\">\n // <a href=https://example.com download>\n // <circle cx=50 cy=40 r=35 />\n // </a>\n // </svg>\n // ```\n //\n // See: <https://github.com/wooorm/property-information/blob/main/lib/svg.js>\n if (value === true) return name\n\n // `spaces` doesn’t accept a second argument, but it’s given here just to\n // keep the code cleaner.\n value = Array.isArray(value)\n ? (info.commaSeparated ? commas : spaces)(value, {\n padLeft: !state.settings.tightCommaSeparatedLists\n })\n : String(value)\n\n if (state.settings.collapseEmptyAttributes && !value) return name\n\n // Check unquoted value.\n if (state.settings.preferUnquoted) {\n result = stringifyEntities(\n value,\n Object.assign({}, state.settings.characterReferences, {\n attribute: true,\n subset: constants.unquoted[x][y]\n })\n )\n }\n\n // If we don’t want unquoted, or if `value` contains character references when\n // unquoted…\n if (result !== value) {\n // If the alternative is less common than `quote`, switch.\n if (\n state.settings.quoteSmart &&\n ccount(value, quote) > ccount(value, state.alternative)\n ) {\n quote = state.alternative\n }\n\n result =\n quote +\n stringifyEntities(\n value,\n Object.assign({}, state.settings.characterReferences, {\n // Always encode without parse errors in non-HTML.\n subset: (quote === \"'\" ? constants.single : constants.double)[x][y],\n attribute: true\n })\n ) +\n quote\n }\n\n // Don’t add a `=` for unquoted empties.\n return name + (result ? '=' + result : result)\n}\n","/**\n * @import {Element, Parents} from 'hast'\n */\n\nimport {whitespace} from 'hast-util-whitespace'\nimport {siblingAfter} from './util/siblings.js'\nimport {omission} from './omission.js'\n\nexport const closing = omission({\n body,\n caption: headOrColgroupOrCaption,\n colgroup: headOrColgroupOrCaption,\n dd,\n dt,\n head: headOrColgroupOrCaption,\n html,\n li,\n optgroup,\n option,\n p,\n rp: rubyElement,\n rt: rubyElement,\n tbody,\n td: cells,\n tfoot,\n th: cells,\n thead,\n tr\n})\n\n/**\n * Macro for `</head>`, `</colgroup>`, and `</caption>`.\n *\n * @param {Element} _\n * Element.\n * @param {number | undefined} index\n * Index of element in parent.\n * @param {Parents | undefined} parent\n * Parent of element.\n * @returns {boolean}\n * Whether the closing tag can be omitted.\n */\nfunction headOrColgroupOrCaption(_, index, parent) {\n const next = siblingAfter(parent, index, true)\n return (\n !next ||\n (next.type !== 'comment' &&\n !(next.type === 'text' && whitespace(next.value.charAt(0))))\n )\n}\n\n/**\n * Whether to omit `</html>`.\n *\n * @param {Element} _\n * Element.\n * @param {number | undefined} index\n * Index of element in parent.\n * @param {Parents | undefined} parent\n * Parent of element.\n * @returns {boolean}\n * Whether the closing tag can be omitted.\n */\nfunction html(_, index, parent) {\n const next = siblingAfter(parent, index)\n return !next || next.type !== 'comment'\n}\n\n/**\n * Whether to omit `</body>`.\n *\n * @param {Element} _\n * Element.\n * @param {number | undefined} index\n * Index of element in parent.\n * @param {Parents | undefined} parent\n * Parent of element.\n * @returns {boolean}\n * Whether the closing tag can be omitted.\n */\nfunction body(_, index, parent) {\n const next = siblingAfter(parent, index)\n return !next || next.type !== 'comment'\n}\n\n/**\n * Whether to omit `</p>`.\n *\n * @param {Element} _\n * Element.\n * @param {number | undefined} index\n * Index of element in parent.\n * @param {Parents | undefined} parent\n * Parent of element.\n * @returns {boolean}\n * Whether the closing tag can be omitted.\n */\nfunction p(_, index, parent) {\n const next = siblingAfter(parent, index)\n return next\n ? next.type === 'element' &&\n (next.tagName === 'address' ||\n next.tagName === 'article' ||\n next.tagName === 'aside' ||\n next.tagName === 'blockquote' ||\n next.tagName === 'details' ||\n next.tagName === 'div' ||\n next.tagName === 'dl' ||\n next.tagName === 'fieldset' ||\n next.tagName === 'figcaption' ||\n next.tagName === 'figure' ||\n next.tagName === 'footer' ||\n next.tagName === 'form' ||\n next.tagName === 'h1' ||\n next.tagName === 'h2' ||\n next.tagName === 'h3' ||\n next.tagName === 'h4' ||\n next.tagName === 'h5' ||\n next.tagName === 'h6' ||\n next.tagName === 'header' ||\n next.tagName === 'hgroup' ||\n next.tagName === 'hr' ||\n next.tagName === 'main' ||\n next.tagName === 'menu' ||\n next.tagName === 'nav' ||\n next.tagName === 'ol' ||\n next.tagName === 'p' ||\n next.tagName === 'pre' ||\n next.tagName === 'section' ||\n next.tagName === 'table' ||\n next.tagName === 'ul')\n : !parent ||\n // Confusing parent.\n !(\n parent.type === 'element' &&\n (parent.tagName === 'a' ||\n parent.tagName === 'audio' ||\n parent.tagName === 'del' ||\n parent.tagName === 'ins' ||\n parent.tagName === 'map' ||\n parent.tagName === 'noscript' ||\n parent.tagName === 'video')\n )\n}\n\n/**\n * Whether to omit `</li>`.\n *\n * @param {Element} _\n * Element.\n * @param {number | undefined} index\n * Index of element in parent.\n * @param {Parents | undefined} parent\n * Parent of element.\n * @returns {boolean}\n * Whether the closing tag can be omitted.\n */\nfunction li(_, index, parent) {\n const next = siblingAfter(parent, index)\n return !next || (next.type === 'element' && next.tagName === 'li')\n}\n\n/**\n * Whether to omit `</dt>`.\n *\n * @param {Element} _\n * Element.\n * @param {number | undefined} index\n * Index of element in parent.\n * @param {Parents | undefined} parent\n * Parent of element.\n * @returns {boolean}\n * Whether the closing tag can be omitted.\n */\nfunction dt(_, index, parent) {\n const next = siblingAfter(parent, index)\n return Boolean(\n next &&\n next.type === 'element' &&\n (next.tagName === 'dt' || next.tagName === 'dd')\n )\n}\n\n/**\n * Whether to omit `</dd>`.\n *\n * @param {Element} _\n * Element.\n * @param {number | undefined} index\n * Index of element in parent.\n * @param {Parents | undefined} parent\n * Parent of element.\n * @returns {boolean}\n * Whether the closing tag can be omitted.\n */\nfunction dd(_, index, parent) {\n const next = siblingAfter(parent, index)\n return (\n !next ||\n (next.type === 'element' &&\n (next.tagName === 'dt' || next.tagName === 'dd'))\n )\n}\n\n/**\n * Whether to omit `</rt>` or `</rp>`.\n *\n * @param {Element} _\n * Element.\n * @param {number | undefined} index\n * Index of element in parent.\n * @param {Parents | undefined} parent\n * Parent of element.\n * @returns {boolean}\n * Whether the closing tag can be omitted.\n */\nfunction rubyElement(_, index, parent) {\n const next = siblingAfter(parent, index)\n return (\n !next ||\n (next.type === 'element' &&\n (next.tagName === 'rp' || next.tagName === 'rt'))\n )\n}\n\n/**\n * Whether to omit `</optgroup>`.\n *\n * @param {Element} _\n * Element.\n * @param {number | undefined} index\n * Index of element in parent.\n * @param {Parents | undefined} parent\n * Parent of element.\n * @returns {boolean}\n * Whether the closing tag can be omitted.\n */\nfunction optgroup(_, index, parent) {\n const next = siblingAfter(parent, index)\n return !next || (next.type === 'element' && next.tagName === 'optgroup')\n}\n\n/**\n * Whether to omit `</option>`.\n *\n * @param {Element} _\n * Element.\n * @param {number | undefined} index\n * Index of element in parent.\n * @param {Parents | undefined} parent\n * Parent of element.\n * @returns {boolean}\n * Whether the closing tag can be omitted.\n */\nfunction option(_, index, parent) {\n const next = siblingAfter(parent, index)\n return (\n !next ||\n (next.type === 'element' &&\n (next.tagName === 'option' || next.tagName === 'optgroup'))\n )\n}\n\n/**\n * Whether to omit `</thead>`.\n *\n * @param {Element} _\n * Element.\n * @param {number | undefined} index\n * Index of element in parent.\n * @param {Parents | undefined} parent\n * Parent of element.\n * @returns {boolean}\n * Whether the closing tag can be omitted.\n */\nfunction thead(_, index, parent) {\n const next = siblingAfter(parent, index)\n return Boolean(\n next &&\n next.type === 'element' &&\n (next.tagName === 'tbody' || next.tagName === 'tfoot')\n )\n}\n\n/**\n * Whether to omit `</tbody>`.\n *\n * @param {Element} _\n * Element.\n * @param {number | undefined} index\n * Index of element in parent.\n * @param {Parents | undefined} parent\n * Parent of element.\n * @returns {boolean}\n * Whether the closing tag can be omitted.\n */\nfunction tbody(_, index, parent) {\n const next = siblingAfter(parent, index)\n return (\n !next ||\n (next.type === 'element' &&\n (next.tagName === 'tbody' || next.tagName === 'tfoot'))\n )\n}\n\n/**\n * Whether to omit `</tfoot>`.\n *\n * @param {Element} _\n * Element.\n * @param {number | undefined} index\n * Index of element in parent.\n * @param {Parents | undefined} parent\n * Parent of element.\n * @returns {boolean}\n * Whether the closing tag can be omitted.\n */\nfunction tfoot(_, index, parent) {\n return !siblingAfter(parent, index)\n}\n\n/**\n * Whether to omit `</tr>`.\n *\n * @param {Element} _\n * Element.\n * @param {number | undefined} index\n * Index of element in parent.\n * @param {Parents | undefined} parent\n * Parent of element.\n * @returns {boolean}\n * Whether the closing tag can be omitted.\n */\nfunction tr(_, index, parent) {\n const next = siblingAfter(parent, index)\n return !next || (next.type === 'element' && next.tagName === 'tr')\n}\n\n/**\n * Whether to omit `</td>` or `</th>`.\n *\n * @param {Element} _\n * Element.\n * @param {number | undefined} index\n * Index of element in parent.\n * @param {Parents | undefined} parent\n * Parent of element.\n * @returns {boolean}\n * Whether the closing tag can be omitted.\n */\nfunction cells(_, index, parent) {\n const next = siblingAfter(parent, index)\n return (\n !next ||\n (next.type === 'element' &&\n (next.tagName === 'td' || next.tagName === 'th'))\n )\n}\n","/**\n * @import {Parents, RootContent} from 'hast'\n */\n\nimport {whitespace} from 'hast-util-whitespace'\n\nexport const siblingAfter = siblings(1)\nexport const siblingBefore = siblings(-1)\n\n/** @type {Array<RootContent>} */\nconst emptyChildren = []\n\n/**\n * Factory to check siblings in a direction.\n *\n * @param {number} increment\n */\nfunction siblings(increment) {\n return sibling\n\n /**\n * Find applicable siblings in a direction.\n *\n * @template {Parents} Parent\n * Parent type.\n * @param {Parent | undefined} parent\n * Parent.\n * @param {number | undefined} index\n * Index of child in `parent`.\n * @param {boolean | undefined} [includeWhitespace=false]\n * Whether to include whitespace (default: `false`).\n * @returns {Parent extends {children: Array<infer Child>} ? Child | undefined : never}\n * Child of parent.\n */\n function sibling(parent, index, includeWhitespace) {\n const siblings = parent ? parent.children : emptyChildren\n let offset = (index || 0) + increment\n let next = siblings[offset]\n\n if (!includeWhitespace) {\n while (next && whitespace(next)) {\n offset += increment\n next = siblings[offset]\n }\n }\n\n // @ts-expect-error: it’s a correct child.\n return next\n }\n}\n","/**\n * @import {Element, Parents} from 'hast'\n */\n\n/**\n * @callback OmitHandle\n * Check if a tag can be omitted.\n * @param {Element} element\n * Element to check.\n * @param {number | undefined} index\n * Index of element in parent.\n * @param {Parents | undefined} parent\n * Parent of element.\n * @returns {boolean}\n * Whether to omit a tag.\n *\n */\n\nconst own = {}.hasOwnProperty\n\n/**\n * Factory to check if a given node can have a tag omitted.\n *\n * @param {Record<string, OmitHandle>} handlers\n * Omission handlers, where each key is a tag name, and each value is the\n * corresponding handler.\n * @returns {OmitHandle}\n * Whether to omit a tag of an element.\n */\nexport function omission(handlers) {\n return omit\n\n /**\n * Check if a given node can have a tag omitted.\n *\n * @type {OmitHandle}\n */\n function omit(node, index, parent) {\n return (\n own.call(handlers, node.tagName) &&\n handlers[node.tagName](node, index, parent)\n )\n }\n}\n","/**\n * @import {Element, Parents} from 'hast'\n */\n\nimport {whitespace} from 'hast-util-whitespace'\nimport {siblingAfter, siblingBefore} from './util/siblings.js'\nimport {closing} from './closing.js'\nimport {omission} from './omission.js'\n\nexport const opening = omission({\n body,\n colgroup,\n head,\n html,\n tbody\n})\n\n/**\n * Whether to omit `<html>`.\n *\n * @param {Element} node\n * Element.\n * @returns {boolean}\n * Whether the opening tag can be omitted.\n */\nfunction html(node) {\n const head = siblingAfter(node, -1)\n return !head || head.type !== 'comment'\n}\n\n/**\n * Whether to omit `<head>`.\n *\n * @param {Element} node\n * Element.\n * @returns {boolean}\n * Whether the opening tag can be omitted.\n */\nfunction head(node) {\n /** @type {Set<string>} */\n const seen = new Set()\n\n // Whether `srcdoc` or not,\n // make sure the content model at least doesn’t have too many `base`s/`title`s.\n for (const child of node.children) {\n if (\n child.type === 'element' &&\n (child.tagName === 'base' || child.tagName === 'title')\n ) {\n if (seen.has(child.tagName)) return false\n seen.add(child.tagName)\n }\n }\n\n // “May be omitted if the element is empty,\n // or if the first thing inside the head element is an element.”\n const child = node.children[0]\n return !child || child.type === 'element'\n}\n\n/**\n * Whether to omit `<body>`.\n *\n * @param {Element} node\n * Element.\n * @returns {boolean}\n * Whether the opening tag can be omitted.\n */\nfunction body(node) {\n const head = siblingAfter(node, -1, true)\n\n return (\n !head ||\n (head.type !== 'comment' &&\n !(head.type === 'text' && whitespace(head.value.charAt(0))) &&\n !(\n head.type === 'element' &&\n (head.tagName === 'meta' ||\n head.tagName === 'link' ||\n head.tagName === 'script' ||\n head.tagName === 'style' ||\n head.tagName === 'template')\n ))\n )\n}\n\n/**\n * Whether to omit `<colgroup>`.\n * The spec describes some logic for the opening tag, but it’s easier to\n * implement in the closing tag, to the same effect, so we handle it there\n * instead.\n *\n * @param {Element} node\n * Element.\n * @param {number | undefined} index\n * Index of element in parent.\n * @param {Parents | undefined} parent\n * Parent of element.\n * @returns {boolean}\n * Whether the opening tag can be omitted.\n */\nfunction colgroup(node, index, parent) {\n const previous = siblingBefore(parent, index)\n const head = siblingAfter(node, -1, true)\n\n // Previous colgroup was already omitted.\n if (\n parent &&\n previous &&\n previous.type === 'element' &&\n previous.tagName === 'colgroup' &&\n closing(previous, parent.children.indexOf(previous), parent)\n ) {\n return false\n }\n\n return Boolean(head && head.type === 'element' && head.tagName === 'col')\n}\n\n/**\n * Whether to omit `<tbody>`.\n *\n * @param {Element} node\n * Element.\n * @param {number | undefined} index\n * Index of element in parent.\n * @param {Parents | undefined} parent\n * Parent of element.\n * @returns {boolean}\n * Whether the opening tag can be omitted.\n */\nfunction tbody(node, index, parent) {\n const previous = siblingBefore(parent, index)\n const head = siblingAfter(node, -1)\n\n // Previous table section was already omitted.\n if (\n parent &&\n previous &&\n previous.type === 'element' &&\n (previous.tagName === 'thead' || previous.tagName === 'tbody') &&\n closing(previous, parent.children.indexOf(previous), parent)\n ) {\n return false\n }\n\n return Boolean(head && head.type === 'element' && head.tagName === 'tr')\n}\n","/**\n * @import {Parents} from 'hast'\n * @import {Raw} from 'mdast-util-to-hast'\n * @import {State} from '../index.js'\n */\n\nimport {text} from './text.js'\n\n/**\n * Serialize a raw node.\n *\n * @param {Raw} node\n * Node to handle.\n * @param {number | undefined} index\n * Index of `node` in `parent.\n * @param {Parents | undefined} parent\n * Parent of `node`.\n * @param {State} state\n * Info passed around about the current state.\n * @returns {string}\n * Serialized node.\n */\nexport function raw(node, index, parent, state) {\n return state.settings.allowDangerousHtml\n ? node.value\n : text(node, index, parent, state)\n}\n","/**\n * @import {Parents, Text} from 'hast'\n * @import {Raw} from 'mdast-util-to-hast'\n * @import {State} from '../index.js'\n */\n\nimport {stringifyEntities} from 'stringify-entities'\n\n// Declare array as variable so it can be cached by `stringifyEntities`\nconst textEntitySubset = ['<', '&']\n\n/**\n * Serialize a text node.\n *\n * @param {Raw | Text} node\n * Node to handle.\n * @param {number | undefined} _\n * Index of `node` in `parent.\n * @param {Parents | undefined} parent\n * Parent of `node`.\n * @param {State} state\n * Info passed around about the current state.\n * @returns {string}\n * Serialized node.\n */\nexport function text(node, _, parent, state) {\n // Check if content of `node` should be escaped.\n return parent &&\n parent.type === 'element' &&\n (parent.tagName === 'script' || parent.tagName === 'style')\n ? node.value\n : stringifyEntities(\n node.value,\n Object.assign({}, state.settings.characterReferences, {\n subset: textEntitySubset\n })\n )\n}\n","/**\n * @import {Parents, Root} from 'hast'\n * @import {State} from '../index.js'\n */\n\n/**\n * Serialize a root.\n *\n * @param {Root} node\n * Node to handle.\n * @param {number | undefined} _1\n * Index of `node` in `parent.\n * @param {Parents | undefined} _2\n * Parent of `node`.\n * @param {State} state\n * Info passed around about the current state.\n * @returns {string}\n * Serialized node.\n */\nexport function root(node, _1, _2, state) {\n return state.all(node)\n}\n","const bundledLanguagesInfo = [\n {\n \"id\": \"abap\",\n \"name\": \"ABAP\",\n \"import\": (() => import('@shikijs/langs/abap'))\n },\n {\n \"id\": \"actionscript-3\",\n \"name\": \"ActionScript\",\n \"import\": (() => import('@shikijs/langs/actionscript-3'))\n },\n {\n \"id\": \"ada\",\n \"name\": \"Ada\",\n \"import\": (() => import('@shikijs/langs/ada'))\n },\n {\n \"id\": \"angular-html\",\n \"name\": \"Angular HTML\",\n \"import\": (() => import('@shikijs/langs/angular-html'))\n },\n {\n \"id\": \"angular-ts\",\n \"name\": \"Angular TypeScript\",\n \"import\": (() => import('@shikijs/langs/angular-ts'))\n },\n {\n \"id\": \"apache\",\n \"name\": \"Apache Conf\",\n \"import\": (() => import('@shikijs/langs/apache'))\n },\n {\n \"id\": \"apex\",\n \"name\": \"Apex\",\n \"import\": (() => import('@shikijs/langs/apex'))\n },\n {\n \"id\": \"apl\",\n \"name\": \"APL\",\n \"import\": (() => import('@shikijs/langs/apl'))\n },\n {\n \"id\": \"applescript\",\n \"name\": \"AppleScript\",\n \"import\": (() => import('@shikijs/langs/applescript'))\n },\n {\n \"id\": \"ara\",\n \"name\": \"Ara\",\n \"import\": (() => import('@shikijs/langs/ara'))\n },\n {\n \"id\": \"asciidoc\",\n \"name\": \"AsciiDoc\",\n \"aliases\": [\n \"adoc\"\n ],\n \"import\": (() => import('@shikijs/langs/asciidoc'))\n },\n {\n \"id\": \"asm\",\n \"name\": \"Assembly\",\n \"import\": (() => import('@shikijs/langs/asm'))\n },\n {\n \"id\": \"astro\",\n \"name\": \"Astro\",\n \"import\": (() => import('@shikijs/langs/astro'))\n },\n {\n \"id\": \"awk\",\n \"name\": \"AWK\",\n \"import\": (() => import('@shikijs/langs/awk'))\n },\n {\n \"id\": \"ballerina\",\n \"name\": \"Ballerina\",\n \"import\": (() => import('@shikijs/langs/ballerina'))\n },\n {\n \"id\": \"bat\",\n \"name\": \"Batch File\",\n \"aliases\": [\n \"batch\"\n ],\n \"import\": (() => import('@shikijs/langs/bat'))\n },\n {\n \"id\": \"beancount\",\n \"name\": \"Beancount\",\n \"import\": (() => import('@shikijs/langs/beancount'))\n },\n {\n \"id\": \"berry\",\n \"name\": \"Berry\",\n \"aliases\": [\n \"be\"\n ],\n \"import\": (() => import('@shikijs/langs/berry'))\n },\n {\n \"id\": \"bibtex\",\n \"name\": \"BibTeX\",\n \"import\": (() => import('@shikijs/langs/bibtex'))\n },\n {\n \"id\": \"bicep\",\n \"name\": \"Bicep\",\n \"import\": (() => import('@shikijs/langs/bicep'))\n },\n {\n \"id\": \"blade\",\n \"name\": \"Blade\",\n \"import\": (() => import('@shikijs/langs/blade'))\n },\n {\n \"id\": \"bsl\",\n \"name\": \"1C (Enterprise)\",\n \"aliases\": [\n \"1c\"\n ],\n \"import\": (() => import('@shikijs/langs/bsl'))\n },\n {\n \"id\": \"c\",\n \"name\": \"C\",\n \"import\": (() => import('@shikijs/langs/c'))\n },\n {\n \"id\": \"c3\",\n \"name\": \"C3\",\n \"import\": (() => import('@shikijs/langs/c3'))\n },\n {\n \"id\": \"cadence\",\n \"name\": \"Cadence\",\n \"aliases\": [\n \"cdc\"\n ],\n \"import\": (() => import('@shikijs/langs/cadence'))\n },\n {\n \"id\": \"cairo\",\n \"name\": \"Cairo\",\n \"import\": (() => import('@shikijs/langs/cairo'))\n },\n {\n \"id\": \"clarity\",\n \"name\": \"Clarity\",\n \"import\": (() => import('@shikijs/langs/clarity'))\n },\n {\n \"id\": \"clojure\",\n \"name\": \"Clojure\",\n \"aliases\": [\n \"clj\"\n ],\n \"import\": (() => import('@shikijs/langs/clojure'))\n },\n {\n \"id\": \"cmake\",\n \"name\": \"CMake\",\n \"import\": (() => import('@shikijs/langs/cmake'))\n },\n {\n \"id\": \"cobol\",\n \"name\": \"COBOL\",\n \"import\": (() => import('@shikijs/langs/cobol'))\n },\n {\n \"id\": \"codeowners\",\n \"name\": \"CODEOWNERS\",\n \"import\": (() => import('@shikijs/langs/codeowners'))\n },\n {\n \"id\": \"codeql\",\n \"name\": \"CodeQL\",\n \"aliases\": [\n \"ql\"\n ],\n \"import\": (() => import('@shikijs/langs/codeql'))\n },\n {\n \"id\": \"coffee\",\n \"name\": \"CoffeeScript\",\n \"aliases\": [\n \"coffeescript\"\n ],\n \"import\": (() => import('@shikijs/langs/coffee'))\n },\n {\n \"id\": \"common-lisp\",\n \"name\": \"Common Lisp\",\n \"aliases\": [\n \"lisp\"\n ],\n \"import\": (() => import('@shikijs/langs/common-lisp'))\n },\n {\n \"id\": \"coq\",\n \"name\": \"Coq\",\n \"import\": (() => import('@shikijs/langs/coq'))\n },\n {\n \"id\": \"cpp\",\n \"name\": \"C++\",\n \"aliases\": [\n \"c++\"\n ],\n \"import\": (() => import('@shikijs/langs/cpp'))\n },\n {\n \"id\": \"crystal\",\n \"name\": \"Crystal\",\n \"import\": (() => import('@shikijs/langs/crystal'))\n },\n {\n \"id\": \"csharp\",\n \"name\": \"C#\",\n \"aliases\": [\n \"c#\",\n \"cs\"\n ],\n \"import\": (() => import('@shikijs/langs/csharp'))\n },\n {\n \"id\": \"css\",\n \"name\": \"CSS\",\n \"import\": (() => import('@shikijs/langs/css'))\n },\n {\n \"id\": \"csv\",\n \"name\": \"CSV\",\n \"import\": (() => import('@shikijs/langs/csv'))\n },\n {\n \"id\": \"cue\",\n \"name\": \"CUE\",\n \"import\": (() => import('@shikijs/langs/cue'))\n },\n {\n \"id\": \"cypher\",\n \"name\": \"Cypher\",\n \"aliases\": [\n \"cql\"\n ],\n \"import\": (() => import('@shikijs/langs/cypher'))\n },\n {\n \"id\": \"d\",\n \"name\": \"D\",\n \"import\": (() => import('@shikijs/langs/d'))\n },\n {\n \"id\": \"dart\",\n \"name\": \"Dart\",\n \"import\": (() => import('@shikijs/langs/dart'))\n },\n {\n \"id\": \"dax\",\n \"name\": \"DAX\",\n \"import\": (() => import('@shikijs/langs/dax'))\n },\n {\n \"id\": \"desktop\",\n \"name\": \"Desktop\",\n \"import\": (() => import('@shikijs/langs/desktop'))\n },\n {\n \"id\": \"diff\",\n \"name\": \"Diff\",\n \"import\": (() => import('@shikijs/langs/diff'))\n },\n {\n \"id\": \"docker\",\n \"name\": \"Dockerfile\",\n \"aliases\": [\n \"dockerfile\"\n ],\n \"import\": (() => import('@shikijs/langs/docker'))\n },\n {\n \"id\": \"dotenv\",\n \"name\": \"dotEnv\",\n \"import\": (() => import('@shikijs/langs/dotenv'))\n },\n {\n \"id\": \"dream-maker\",\n \"name\": \"Dream Maker\",\n \"import\": (() => import('@shikijs/langs/dream-maker'))\n },\n {\n \"id\": \"edge\",\n \"name\": \"Edge\",\n \"import\": (() => import('@shikijs/langs/edge'))\n },\n {\n \"id\": \"elixir\",\n \"name\": \"Elixir\",\n \"import\": (() => import('@shikijs/langs/elixir'))\n },\n {\n \"id\": \"elm\",\n \"name\": \"Elm\",\n \"import\": (() => import('@shikijs/langs/elm'))\n },\n {\n \"id\": \"emacs-lisp\",\n \"name\": \"Emacs Lisp\",\n \"aliases\": [\n \"elisp\"\n ],\n \"import\": (() => import('@shikijs/langs/emacs-lisp'))\n },\n {\n \"id\": \"erb\",\n \"name\": \"ERB\",\n \"import\": (() => import('@shikijs/langs/erb'))\n },\n {\n \"id\": \"erlang\",\n \"name\": \"Erlang\",\n \"aliases\": [\n \"erl\"\n ],\n \"import\": (() => import('@shikijs/langs/erlang'))\n },\n {\n \"id\": \"fennel\",\n \"name\": \"Fennel\",\n \"import\": (() => import('@shikijs/langs/fennel'))\n },\n {\n \"id\": \"fish\",\n \"name\": \"Fish\",\n \"import\": (() => import('@shikijs/langs/fish'))\n },\n {\n \"id\": \"fluent\",\n \"name\": \"Fluent\",\n \"aliases\": [\n \"ftl\"\n ],\n \"import\": (() => import('@shikijs/langs/fluent'))\n },\n {\n \"id\": \"fortran-fixed-form\",\n \"name\": \"Fortran (Fixed Form)\",\n \"aliases\": [\n \"f\",\n \"for\",\n \"f77\"\n ],\n \"import\": (() => import('@shikijs/langs/fortran-fixed-form'))\n },\n {\n \"id\": \"fortran-free-form\",\n \"name\": \"Fortran (Free Form)\",\n \"aliases\": [\n \"f90\",\n \"f95\",\n \"f03\",\n \"f08\",\n \"f18\"\n ],\n \"import\": (() => import('@shikijs/langs/fortran-free-form'))\n },\n {\n \"id\": \"fsharp\",\n \"name\": \"F#\",\n \"aliases\": [\n \"f#\",\n \"fs\"\n ],\n \"import\": (() => import('@shikijs/langs/fsharp'))\n },\n {\n \"id\": \"gdresource\",\n \"name\": \"GDResource\",\n \"aliases\": [\n \"tscn\",\n \"tres\"\n ],\n \"import\": (() => import('@shikijs/langs/gdresource'))\n },\n {\n \"id\": \"gdscript\",\n \"name\": \"GDScript\",\n \"aliases\": [\n \"gd\"\n ],\n \"import\": (() => import('@shikijs/langs/gdscript'))\n },\n {\n \"id\": \"gdshader\",\n \"name\": \"GDShader\",\n \"import\": (() => import('@shikijs/langs/gdshader'))\n },\n {\n \"id\": \"genie\",\n \"name\": \"Genie\",\n \"import\": (() => import('@shikijs/langs/genie'))\n },\n {\n \"id\": \"gherkin\",\n \"name\": \"Gherkin\",\n \"import\": (() => import('@shikijs/langs/gherkin'))\n },\n {\n \"id\": \"git-commit\",\n \"name\": \"Git Commit Message\",\n \"import\": (() => import('@shikijs/langs/git-commit'))\n },\n {\n \"id\": \"git-rebase\",\n \"name\": \"Git Rebase Message\",\n \"import\": (() => import('@shikijs/langs/git-rebase'))\n },\n {\n \"id\": \"gleam\",\n \"name\": \"Gleam\",\n \"import\": (() => import('@shikijs/langs/gleam'))\n },\n {\n \"id\": \"glimmer-js\",\n \"name\": \"Glimmer JS\",\n \"aliases\": [\n \"gjs\"\n ],\n \"import\": (() => import('@shikijs/langs/glimmer-js'))\n },\n {\n \"id\": \"glimmer-ts\",\n \"name\": \"Glimmer TS\",\n \"aliases\": [\n \"gts\"\n ],\n \"import\": (() => import('@shikijs/langs/glimmer-ts'))\n },\n {\n \"id\": \"glsl\",\n \"name\": \"GLSL\",\n \"import\": (() => import('@shikijs/langs/glsl'))\n },\n {\n \"id\": \"gn\",\n \"name\": \"GN\",\n \"import\": (() => import('@shikijs/langs/gn'))\n },\n {\n \"id\": \"gnuplot\",\n \"name\": \"Gnuplot\",\n \"import\": (() => import('@shikijs/langs/gnuplot'))\n },\n {\n \"id\": \"go\",\n \"name\": \"Go\",\n \"import\": (() => import('@shikijs/langs/go'))\n },\n {\n \"id\": \"graphql\",\n \"name\": \"GraphQL\",\n \"aliases\": [\n \"gql\"\n ],\n \"import\": (() => import('@shikijs/langs/graphql'))\n },\n {\n \"id\": \"groovy\",\n \"name\": \"Groovy\",\n \"import\": (() => import('@shikijs/langs/groovy'))\n },\n {\n \"id\": \"hack\",\n \"name\": \"Hack\",\n \"import\": (() => import('@shikijs/langs/hack'))\n },\n {\n \"id\": \"haml\",\n \"name\": \"Ruby Haml\",\n \"import\": (() => import('@shikijs/langs/haml'))\n },\n {\n \"id\": \"handlebars\",\n \"name\": \"Handlebars\",\n \"aliases\": [\n \"hbs\"\n ],\n \"import\": (() => import('@shikijs/langs/handlebars'))\n },\n {\n \"id\": \"haskell\",\n \"name\": \"Haskell\",\n \"aliases\": [\n \"hs\"\n ],\n \"import\": (() => import('@shikijs/langs/haskell'))\n },\n {\n \"id\": \"haxe\",\n \"name\": \"Haxe\",\n \"import\": (() => import('@shikijs/langs/haxe'))\n },\n {\n \"id\": \"hcl\",\n \"name\": \"HashiCorp HCL\",\n \"import\": (() => import('@shikijs/langs/hcl'))\n },\n {\n \"id\": \"hjson\",\n \"name\": \"Hjson\",\n \"import\": (() => import('@shikijs/langs/hjson'))\n },\n {\n \"id\": \"hlsl\",\n \"name\": \"HLSL\",\n \"import\": (() => import('@shikijs/langs/hlsl'))\n },\n {\n \"id\": \"html\",\n \"name\": \"HTML\",\n \"import\": (() => import('@shikijs/langs/html'))\n },\n {\n \"id\": \"html-derivative\",\n \"name\": \"HTML (Derivative)\",\n \"import\": (() => import('@shikijs/langs/html-derivative'))\n },\n {\n \"id\": \"http\",\n \"name\": \"HTTP\",\n \"import\": (() => import('@shikijs/langs/http'))\n },\n {\n \"id\": \"hurl\",\n \"name\": \"Hurl\",\n \"import\": (() => import('@shikijs/langs/hurl'))\n },\n {\n \"id\": \"hxml\",\n \"name\": \"HXML\",\n \"import\": (() => import('@shikijs/langs/hxml'))\n },\n {\n \"id\": \"hy\",\n \"name\": \"Hy\",\n \"import\": (() => import('@shikijs/langs/hy'))\n },\n {\n \"id\": \"imba\",\n \"name\": \"Imba\",\n \"import\": (() => import('@shikijs/langs/imba'))\n },\n {\n \"id\": \"ini\",\n \"name\": \"INI\",\n \"aliases\": [\n \"properties\"\n ],\n \"import\": (() => import('@shikijs/langs/ini'))\n },\n {\n \"id\": \"java\",\n \"name\": \"Java\",\n \"import\": (() => import('@shikijs/langs/java'))\n },\n {\n \"id\": \"javascript\",\n \"name\": \"JavaScript\",\n \"aliases\": [\n \"js\",\n \"cjs\",\n \"mjs\"\n ],\n \"import\": (() => import('@shikijs/langs/javascript'))\n },\n {\n \"id\": \"jinja\",\n \"name\": \"Jinja\",\n \"import\": (() => import('@shikijs/langs/jinja'))\n },\n {\n \"id\": \"jison\",\n \"name\": \"Jison\",\n \"import\": (() => import('@shikijs/langs/jison'))\n },\n {\n \"id\": \"json\",\n \"name\": \"JSON\",\n \"import\": (() => import('@shikijs/langs/json'))\n },\n {\n \"id\": \"json5\",\n \"name\": \"JSON5\",\n \"import\": (() => import('@shikijs/langs/json5'))\n },\n {\n \"id\": \"jsonc\",\n \"name\": \"JSON with Comments\",\n \"import\": (() => import('@shikijs/langs/jsonc'))\n },\n {\n \"id\": \"jsonl\",\n \"name\": \"JSON Lines\",\n \"import\": (() => import('@shikijs/langs/jsonl'))\n },\n {\n \"id\": \"jsonnet\",\n \"name\": \"Jsonnet\",\n \"import\": (() => import('@shikijs/langs/jsonnet'))\n },\n {\n \"id\": \"jssm\",\n \"name\": \"JSSM\",\n \"aliases\": [\n \"fsl\"\n ],\n \"import\": (() => import('@shikijs/langs/jssm'))\n },\n {\n \"id\": \"jsx\",\n \"name\": \"JSX\",\n \"import\": (() => import('@shikijs/langs/jsx'))\n },\n {\n \"id\": \"julia\",\n \"name\": \"Julia\",\n \"aliases\": [\n \"jl\"\n ],\n \"import\": (() => import('@shikijs/langs/julia'))\n },\n {\n \"id\": \"kdl\",\n \"name\": \"KDL\",\n \"import\": (() => import('@shikijs/langs/kdl'))\n },\n {\n \"id\": \"kotlin\",\n \"name\": \"Kotlin\",\n \"aliases\": [\n \"kt\",\n \"kts\"\n ],\n \"import\": (() => import('@shikijs/langs/kotlin'))\n },\n {\n \"id\": \"kusto\",\n \"name\": \"Kusto\",\n \"aliases\": [\n \"kql\"\n ],\n \"import\": (() => import('@shikijs/langs/kusto'))\n },\n {\n \"id\": \"latex\",\n \"name\": \"LaTeX\",\n \"import\": (() => import('@shikijs/langs/latex'))\n },\n {\n \"id\": \"lean\",\n \"name\": \"Lean 4\",\n \"aliases\": [\n \"lean4\"\n ],\n \"import\": (() => import('@shikijs/langs/lean'))\n },\n {\n \"id\": \"less\",\n \"name\": \"Less\",\n \"import\": (() => import('@shikijs/langs/less'))\n },\n {\n \"id\": \"liquid\",\n \"name\": \"Liquid\",\n \"import\": (() => import('@shikijs/langs/liquid'))\n },\n {\n \"id\": \"llvm\",\n \"name\": \"LLVM IR\",\n \"import\": (() => import('@shikijs/langs/llvm'))\n },\n {\n \"id\": \"log\",\n \"name\": \"Log file\",\n \"import\": (() => import('@shikijs/langs/log'))\n },\n {\n \"id\": \"logo\",\n \"name\": \"Logo\",\n \"import\": (() => import('@shikijs/langs/logo'))\n },\n {\n \"id\": \"lua\",\n \"name\": \"Lua\",\n \"import\": (() => import('@shikijs/langs/lua'))\n },\n {\n \"id\": \"luau\",\n \"name\": \"Luau\",\n \"import\": (() => import('@shikijs/langs/luau'))\n },\n {\n \"id\": \"make\",\n \"name\": \"Makefile\",\n \"aliases\": [\n \"makefile\"\n ],\n \"import\": (() => import('@shikijs/langs/make'))\n },\n {\n \"id\": \"markdown\",\n \"name\": \"Markdown\",\n \"aliases\": [\n \"md\"\n ],\n \"import\": (() => import('@shikijs/langs/markdown'))\n },\n {\n \"id\": \"marko\",\n \"name\": \"Marko\",\n \"import\": (() => import('@shikijs/langs/marko'))\n },\n {\n \"id\": \"matlab\",\n \"name\": \"MATLAB\",\n \"import\": (() => import('@shikijs/langs/matlab'))\n },\n {\n \"id\": \"mdc\",\n \"name\": \"MDC\",\n \"import\": (() => import('@shikijs/langs/mdc'))\n },\n {\n \"id\": \"mdx\",\n \"name\": \"MDX\",\n \"import\": (() => import('@shikijs/langs/mdx'))\n },\n {\n \"id\": \"mermaid\",\n \"name\": \"Mermaid\",\n \"aliases\": [\n \"mmd\"\n ],\n \"import\": (() => import('@shikijs/langs/mermaid'))\n },\n {\n \"id\": \"mipsasm\",\n \"name\": \"MIPS Assembly\",\n \"aliases\": [\n \"mips\"\n ],\n \"import\": (() => import('@shikijs/langs/mipsasm'))\n },\n {\n \"id\": \"mojo\",\n \"name\": \"Mojo\",\n \"import\": (() => import('@shikijs/langs/mojo'))\n },\n {\n \"id\": \"moonbit\",\n \"name\": \"MoonBit\",\n \"aliases\": [\n \"mbt\",\n \"mbti\"\n ],\n \"import\": (() => import('@shikijs/langs/moonbit'))\n },\n {\n \"id\": \"move\",\n \"name\": \"Move\",\n \"import\": (() => import('@shikijs/langs/move'))\n },\n {\n \"id\": \"narrat\",\n \"name\": \"Narrat Language\",\n \"aliases\": [\n \"nar\"\n ],\n \"import\": (() => import('@shikijs/langs/narrat'))\n },\n {\n \"id\": \"nextflow\",\n \"name\": \"Nextflow\",\n \"aliases\": [\n \"nf\"\n ],\n \"import\": (() => import('@shikijs/langs/nextflow'))\n },\n {\n \"id\": \"nginx\",\n \"name\": \"Nginx\",\n \"import\": (() => import('@shikijs/langs/nginx'))\n },\n {\n \"id\": \"nim\",\n \"name\": \"Nim\",\n \"import\": (() => import('@shikijs/langs/nim'))\n },\n {\n \"id\": \"nix\",\n \"name\": \"Nix\",\n \"import\": (() => import('@shikijs/langs/nix'))\n },\n {\n \"id\": \"nushell\",\n \"name\": \"nushell\",\n \"aliases\": [\n \"nu\"\n ],\n \"import\": (() => import('@shikijs/langs/nushell'))\n },\n {\n \"id\": \"objective-c\",\n \"name\": \"Objective-C\",\n \"aliases\": [\n \"objc\"\n ],\n \"import\": (() => import('@shikijs/langs/objective-c'))\n },\n {\n \"id\": \"objective-cpp\",\n \"name\": \"Objective-C++\",\n \"import\": (() => import('@shikijs/langs/objective-cpp'))\n },\n {\n \"id\": \"ocaml\",\n \"name\": \"OCaml\",\n \"import\": (() => import('@shikijs/langs/ocaml'))\n },\n {\n \"id\": \"odin\",\n \"name\": \"Odin\",\n \"import\": (() => import('@shikijs/langs/odin'))\n },\n {\n \"id\": \"openscad\",\n \"name\": \"OpenSCAD\",\n \"aliases\": [\n \"scad\"\n ],\n \"import\": (() => import('@shikijs/langs/openscad'))\n },\n {\n \"id\": \"pascal\",\n \"name\": \"Pascal\",\n \"import\": (() => import('@shikijs/langs/pascal'))\n },\n {\n \"id\": \"perl\",\n \"name\": \"Perl\",\n \"import\": (() => import('@shikijs/langs/perl'))\n },\n {\n \"id\": \"php\",\n \"name\": \"PHP\",\n \"import\": (() => import('@shikijs/langs/php'))\n },\n {\n \"id\": \"pkl\",\n \"name\": \"Pkl\",\n \"import\": (() => import('@shikijs/langs/pkl'))\n },\n {\n \"id\": \"plsql\",\n \"name\": \"PL/SQL\",\n \"import\": (() => import('@shikijs/langs/plsql'))\n },\n {\n \"id\": \"po\",\n \"name\": \"Gettext PO\",\n \"aliases\": [\n \"pot\",\n \"potx\"\n ],\n \"import\": (() => import('@shikijs/langs/po'))\n },\n {\n \"id\": \"polar\",\n \"name\": \"Polar\",\n \"import\": (() => import('@shikijs/langs/polar'))\n },\n {\n \"id\": \"postcss\",\n \"name\": \"PostCSS\",\n \"import\": (() => import('@shikijs/langs/postcss'))\n },\n {\n \"id\": \"powerquery\",\n \"name\": \"PowerQuery\",\n \"import\": (() => import('@shikijs/langs/powerquery'))\n },\n {\n \"id\": \"powershell\",\n \"name\": \"PowerShell\",\n \"aliases\": [\n \"ps\",\n \"ps1\"\n ],\n \"import\": (() => import('@shikijs/langs/powershell'))\n },\n {\n \"id\": \"prisma\",\n \"name\": \"Prisma\",\n \"import\": (() => import('@shikijs/langs/prisma'))\n },\n {\n \"id\": \"prolog\",\n \"name\": \"Prolog\",\n \"import\": (() => import('@shikijs/langs/prolog'))\n },\n {\n \"id\": \"proto\",\n \"name\": \"Protocol Buffer 3\",\n \"aliases\": [\n \"protobuf\"\n ],\n \"import\": (() => import('@shikijs/langs/proto'))\n },\n {\n \"id\": \"pug\",\n \"name\": \"Pug\",\n \"aliases\": [\n \"jade\"\n ],\n \"import\": (() => import('@shikijs/langs/pug'))\n },\n {\n \"id\": \"puppet\",\n \"name\": \"Puppet\",\n \"import\": (() => import('@shikijs/langs/puppet'))\n },\n {\n \"id\": \"purescript\",\n \"name\": \"PureScript\",\n \"import\": (() => import('@shikijs/langs/purescript'))\n },\n {\n \"id\": \"python\",\n \"name\": \"Python\",\n \"aliases\": [\n \"py\"\n ],\n \"import\": (() => import('@shikijs/langs/python'))\n },\n {\n \"id\": \"qml\",\n \"name\": \"QML\",\n \"import\": (() => import('@shikijs/langs/qml'))\n },\n {\n \"id\": \"qmldir\",\n \"name\": \"QML Directory\",\n \"import\": (() => import('@shikijs/langs/qmldir'))\n },\n {\n \"id\": \"qss\",\n \"name\": \"Qt Style Sheets\",\n \"import\": (() => import('@shikijs/langs/qss'))\n },\n {\n \"id\": \"r\",\n \"name\": \"R\",\n \"import\": (() => import('@shikijs/langs/r'))\n },\n {\n \"id\": \"racket\",\n \"name\": \"Racket\",\n \"import\": (() => import('@shikijs/langs/racket'))\n },\n {\n \"id\": \"raku\",\n \"name\": \"Raku\",\n \"aliases\": [\n \"perl6\"\n ],\n \"import\": (() => import('@shikijs/langs/raku'))\n },\n {\n \"id\": \"razor\",\n \"name\": \"ASP.NET Razor\",\n \"import\": (() => import('@shikijs/langs/razor'))\n },\n {\n \"id\": \"reg\",\n \"name\": \"Windows Registry Script\",\n \"import\": (() => import('@shikijs/langs/reg'))\n },\n {\n \"id\": \"regexp\",\n \"name\": \"RegExp\",\n \"aliases\": [\n \"regex\"\n ],\n \"import\": (() => import('@shikijs/langs/regexp'))\n },\n {\n \"id\": \"rel\",\n \"name\": \"Rel\",\n \"import\": (() => import('@shikijs/langs/rel'))\n },\n {\n \"id\": \"riscv\",\n \"name\": \"RISC-V\",\n \"import\": (() => import('@shikijs/langs/riscv'))\n },\n {\n \"id\": \"ron\",\n \"name\": \"RON\",\n \"import\": (() => import('@shikijs/langs/ron'))\n },\n {\n \"id\": \"rosmsg\",\n \"name\": \"ROS Interface\",\n \"import\": (() => import('@shikijs/langs/rosmsg'))\n },\n {\n \"id\": \"rst\",\n \"name\": \"reStructuredText\",\n \"import\": (() => import('@shikijs/langs/rst'))\n },\n {\n \"id\": \"ruby\",\n \"name\": \"Ruby\",\n \"aliases\": [\n \"rb\"\n ],\n \"import\": (() => import('@shikijs/langs/ruby'))\n },\n {\n \"id\": \"rust\",\n \"name\": \"Rust\",\n \"aliases\": [\n \"rs\"\n ],\n \"import\": (() => import('@shikijs/langs/rust'))\n },\n {\n \"id\": \"sas\",\n \"name\": \"SAS\",\n \"import\": (() => import('@shikijs/langs/sas'))\n },\n {\n \"id\": \"sass\",\n \"name\": \"Sass\",\n \"import\": (() => import('@shikijs/langs/sass'))\n },\n {\n \"id\": \"scala\",\n \"name\": \"Scala\",\n \"import\": (() => import('@shikijs/langs/scala'))\n },\n {\n \"id\": \"scheme\",\n \"name\": \"Scheme\",\n \"import\": (() => import('@shikijs/langs/scheme'))\n },\n {\n \"id\": \"scss\",\n \"name\": \"SCSS\",\n \"import\": (() => import('@shikijs/langs/scss'))\n },\n {\n \"id\": \"sdbl\",\n \"name\": \"1C (Query)\",\n \"aliases\": [\n \"1c-query\"\n ],\n \"import\": (() => import('@shikijs/langs/sdbl'))\n },\n {\n \"id\": \"shaderlab\",\n \"name\": \"ShaderLab\",\n \"aliases\": [\n \"shader\"\n ],\n \"import\": (() => import('@shikijs/langs/shaderlab'))\n },\n {\n \"id\": \"shellscript\",\n \"name\": \"Shell\",\n \"aliases\": [\n \"bash\",\n \"sh\",\n \"shell\",\n \"zsh\"\n ],\n \"import\": (() => import('@shikijs/langs/shellscript'))\n },\n {\n \"id\": \"shellsession\",\n \"name\": \"Shell Session\",\n \"aliases\": [\n \"console\"\n ],\n \"import\": (() => import('@shikijs/langs/shellsession'))\n },\n {\n \"id\": \"smalltalk\",\n \"name\": \"Smalltalk\",\n \"import\": (() => import('@shikijs/langs/smalltalk'))\n },\n {\n \"id\": \"solidity\",\n \"name\": \"Solidity\",\n \"import\": (() => import('@shikijs/langs/solidity'))\n },\n {\n \"id\": \"soy\",\n \"name\": \"Closure Templates\",\n \"aliases\": [\n \"closure-templates\"\n ],\n \"import\": (() => import('@shikijs/langs/soy'))\n },\n {\n \"id\": \"sparql\",\n \"name\": \"SPARQL\",\n \"import\": (() => import('@shikijs/langs/sparql'))\n },\n {\n \"id\": \"splunk\",\n \"name\": \"Splunk Query Language\",\n \"aliases\": [\n \"spl\"\n ],\n \"import\": (() => import('@shikijs/langs/splunk'))\n },\n {\n \"id\": \"sql\",\n \"name\": \"SQL\",\n \"import\": (() => import('@shikijs/langs/sql'))\n },\n {\n \"id\": \"ssh-config\",\n \"name\": \"SSH Config\",\n \"import\": (() => import('@shikijs/langs/ssh-config'))\n },\n {\n \"id\": \"stata\",\n \"name\": \"Stata\",\n \"import\": (() => import('@shikijs/langs/stata'))\n },\n {\n \"id\": \"stylus\",\n \"name\": \"Stylus\",\n \"aliases\": [\n \"styl\"\n ],\n \"import\": (() => import('@shikijs/langs/stylus'))\n },\n {\n \"id\": \"surrealql\",\n \"name\": \"SurrealQL\",\n \"aliases\": [\n \"surql\"\n ],\n \"import\": (() => import('@shikijs/langs/surrealql'))\n },\n {\n \"id\": \"svelte\",\n \"name\": \"Svelte\",\n \"import\": (() => import('@shikijs/langs/svelte'))\n },\n {\n \"id\": \"swift\",\n \"name\": \"Swift\",\n \"import\": (() => import('@shikijs/langs/swift'))\n },\n {\n \"id\": \"system-verilog\",\n \"name\": \"SystemVerilog\",\n \"import\": (() => import('@shikijs/langs/system-verilog'))\n },\n {\n \"id\": \"systemd\",\n \"name\": \"Systemd Units\",\n \"import\": (() => import('@shikijs/langs/systemd'))\n },\n {\n \"id\": \"talonscript\",\n \"name\": \"TalonScript\",\n \"aliases\": [\n \"talon\"\n ],\n \"import\": (() => import('@shikijs/langs/talonscript'))\n },\n {\n \"id\": \"tasl\",\n \"name\": \"Tasl\",\n \"import\": (() => import('@shikijs/langs/tasl'))\n },\n {\n \"id\": \"tcl\",\n \"name\": \"Tcl\",\n \"import\": (() => import('@shikijs/langs/tcl'))\n },\n {\n \"id\": \"templ\",\n \"name\": \"Templ\",\n \"import\": (() => import('@shikijs/langs/templ'))\n },\n {\n \"id\": \"terraform\",\n \"name\": \"Terraform\",\n \"aliases\": [\n \"tf\",\n \"tfvars\"\n ],\n \"import\": (() => import('@shikijs/langs/terraform'))\n },\n {\n \"id\": \"tex\",\n \"name\": \"TeX\",\n \"import\": (() => import('@shikijs/langs/tex'))\n },\n {\n \"id\": \"toml\",\n \"name\": \"TOML\",\n \"import\": (() => import('@shikijs/langs/toml'))\n },\n {\n \"id\": \"ts-tags\",\n \"name\": \"TypeScript with Tags\",\n \"aliases\": [\n \"lit\"\n ],\n \"import\": (() => import('@shikijs/langs/ts-tags'))\n },\n {\n \"id\": \"tsv\",\n \"name\": \"TSV\",\n \"import\": (() => import('@shikijs/langs/tsv'))\n },\n {\n \"id\": \"tsx\",\n \"name\": \"TSX\",\n \"import\": (() => import('@shikijs/langs/tsx'))\n },\n {\n \"id\": \"turtle\",\n \"name\": \"Turtle\",\n \"import\": (() => import('@shikijs/langs/turtle'))\n },\n {\n \"id\": \"twig\",\n \"name\": \"Twig\",\n \"import\": (() => import('@shikijs/langs/twig'))\n },\n {\n \"id\": \"typescript\",\n \"name\": \"TypeScript\",\n \"aliases\": [\n \"ts\",\n \"cts\",\n \"mts\"\n ],\n \"import\": (() => import('@shikijs/langs/typescript'))\n },\n {\n \"id\": \"typespec\",\n \"name\": \"TypeSpec\",\n \"aliases\": [\n \"tsp\"\n ],\n \"import\": (() => import('@shikijs/langs/typespec'))\n },\n {\n \"id\": \"typst\",\n \"name\": \"Typst\",\n \"aliases\": [\n \"typ\"\n ],\n \"import\": (() => import('@shikijs/langs/typst'))\n },\n {\n \"id\": \"v\",\n \"name\": \"V\",\n \"import\": (() => import('@shikijs/langs/v'))\n },\n {\n \"id\": \"vala\",\n \"name\": \"Vala\",\n \"import\": (() => import('@shikijs/langs/vala'))\n },\n {\n \"id\": \"vb\",\n \"name\": \"Visual Basic\",\n \"aliases\": [\n \"cmd\"\n ],\n \"import\": (() => import('@shikijs/langs/vb'))\n },\n {\n \"id\": \"verilog\",\n \"name\": \"Verilog\",\n \"import\": (() => import('@shikijs/langs/verilog'))\n },\n {\n \"id\": \"vhdl\",\n \"name\": \"VHDL\",\n \"import\": (() => import('@shikijs/langs/vhdl'))\n },\n {\n \"id\": \"viml\",\n \"name\": \"Vim Script\",\n \"aliases\": [\n \"vim\",\n \"vimscript\"\n ],\n \"import\": (() => import('@shikijs/langs/viml'))\n },\n {\n \"id\": \"vue\",\n \"name\": \"Vue\",\n \"import\": (() => import('@shikijs/langs/vue'))\n },\n {\n \"id\": \"vue-html\",\n \"name\": \"Vue HTML\",\n \"import\": (() => import('@shikijs/langs/vue-html'))\n },\n {\n \"id\": \"vue-vine\",\n \"name\": \"Vue Vine\",\n \"import\": (() => import('@shikijs/langs/vue-vine'))\n },\n {\n \"id\": \"vyper\",\n \"name\": \"Vyper\",\n \"aliases\": [\n \"vy\"\n ],\n \"import\": (() => import('@shikijs/langs/vyper'))\n },\n {\n \"id\": \"wasm\",\n \"name\": \"WebAssembly\",\n \"import\": (() => import('@shikijs/langs/wasm'))\n },\n {\n \"id\": \"wenyan\",\n \"name\": \"Wenyan\",\n \"aliases\": [\n \"\\u6587\\u8A00\"\n ],\n \"import\": (() => import('@shikijs/langs/wenyan'))\n },\n {\n \"id\": \"wgsl\",\n \"name\": \"WGSL\",\n \"import\": (() => import('@shikijs/langs/wgsl'))\n },\n {\n \"id\": \"wikitext\",\n \"name\": \"Wikitext\",\n \"aliases\": [\n \"mediawiki\",\n \"wiki\"\n ],\n \"import\": (() => import('@shikijs/langs/wikitext'))\n },\n {\n \"id\": \"wit\",\n \"name\": \"WebAssembly Interface Types\",\n \"import\": (() => import('@shikijs/langs/wit'))\n },\n {\n \"id\": \"wolfram\",\n \"name\": \"Wolfram\",\n \"aliases\": [\n \"wl\"\n ],\n \"import\": (() => import('@shikijs/langs/wolfram'))\n },\n {\n \"id\": \"xml\",\n \"name\": \"XML\",\n \"import\": (() => import('@shikijs/langs/xml'))\n },\n {\n \"id\": \"xsl\",\n \"name\": \"XSL\",\n \"import\": (() => import('@shikijs/langs/xsl'))\n },\n {\n \"id\": \"yaml\",\n \"name\": \"YAML\",\n \"aliases\": [\n \"yml\"\n ],\n \"import\": (() => import('@shikijs/langs/yaml'))\n },\n {\n \"id\": \"zenscript\",\n \"name\": \"ZenScript\",\n \"import\": (() => import('@shikijs/langs/zenscript'))\n },\n {\n \"id\": \"zig\",\n \"name\": \"Zig\",\n \"import\": (() => import('@shikijs/langs/zig'))\n }\n];\nconst bundledLanguagesBase = Object.fromEntries(bundledLanguagesInfo.map((i) => [i.id, i.import]));\nconst bundledLanguagesAlias = Object.fromEntries(bundledLanguagesInfo.flatMap((i) => i.aliases?.map((a) => [a, i.import]) || []));\nconst bundledLanguages = {\n ...bundledLanguagesBase,\n ...bundledLanguagesAlias\n};\n\nexport { bundledLanguages, bundledLanguagesAlias, bundledLanguagesBase, bundledLanguagesInfo };\n","const bundledThemesInfo = [\n {\n \"id\": \"andromeeda\",\n \"displayName\": \"Andromeeda\",\n \"type\": \"dark\",\n \"import\": (() => import('@shikijs/themes/andromeeda'))\n },\n {\n \"id\": \"aurora-x\",\n \"displayName\": \"Aurora X\",\n \"type\": \"dark\",\n \"import\": (() => import('@shikijs/themes/aurora-x'))\n },\n {\n \"id\": \"ayu-dark\",\n \"displayName\": \"Ayu Dark\",\n \"type\": \"dark\",\n \"import\": (() => import('@shikijs/themes/ayu-dark'))\n },\n {\n \"id\": \"ayu-light\",\n \"displayName\": \"Ayu Light\",\n \"type\": \"light\",\n \"import\": (() => import('@shikijs/themes/ayu-light'))\n },\n {\n \"id\": \"ayu-mirage\",\n \"displayName\": \"Ayu Mirage\",\n \"type\": \"dark\",\n \"import\": (() => import('@shikijs/themes/ayu-mirage'))\n },\n {\n \"id\": \"catppuccin-frappe\",\n \"displayName\": \"Catppuccin Frapp\\xE9\",\n \"type\": \"dark\",\n \"import\": (() => import('@shikijs/themes/catppuccin-frappe'))\n },\n {\n \"id\": \"catppuccin-latte\",\n \"displayName\": \"Catppuccin Latte\",\n \"type\": \"light\",\n \"import\": (() => import('@shikijs/themes/catppuccin-latte'))\n },\n {\n \"id\": \"catppuccin-macchiato\",\n \"displayName\": \"Catppuccin Macchiato\",\n \"type\": \"dark\",\n \"import\": (() => import('@shikijs/themes/catppuccin-macchiato'))\n },\n {\n \"id\": \"catppuccin-mocha\",\n \"displayName\": \"Catppuccin Mocha\",\n \"type\": \"dark\",\n \"import\": (() => import('@shikijs/themes/catppuccin-mocha'))\n },\n {\n \"id\": \"dark-plus\",\n \"displayName\": \"Dark Plus\",\n \"type\": \"dark\",\n \"import\": (() => import('@shikijs/themes/dark-plus'))\n },\n {\n \"id\": \"dracula\",\n \"displayName\": \"Dracula Theme\",\n \"type\": \"dark\",\n \"import\": (() => import('@shikijs/themes/dracula'))\n },\n {\n \"id\": \"dracula-soft\",\n \"displayName\": \"Dracula Theme Soft\",\n \"type\": \"dark\",\n \"import\": (() => import('@shikijs/themes/dracula-soft'))\n },\n {\n \"id\": \"everforest-dark\",\n \"displayName\": \"Everforest Dark\",\n \"type\": \"dark\",\n \"import\": (() => import('@shikijs/themes/everforest-dark'))\n },\n {\n \"id\": \"everforest-light\",\n \"displayName\": \"Everforest Light\",\n \"type\": \"light\",\n \"import\": (() => import('@shikijs/themes/everforest-light'))\n },\n {\n \"id\": \"github-dark\",\n \"displayName\": \"GitHub Dark\",\n \"type\": \"dark\",\n \"import\": (() => import('@shikijs/themes/github-dark'))\n },\n {\n \"id\": \"github-dark-default\",\n \"displayName\": \"GitHub Dark Default\",\n \"type\": \"dark\",\n \"import\": (() => import('@shikijs/themes/github-dark-default'))\n },\n {\n \"id\": \"github-dark-dimmed\",\n \"displayName\": \"GitHub Dark Dimmed\",\n \"type\": \"dark\",\n \"import\": (() => import('@shikijs/themes/github-dark-dimmed'))\n },\n {\n \"id\": \"github-dark-high-contrast\",\n \"displayName\": \"GitHub Dark High Contrast\",\n \"type\": \"dark\",\n \"import\": (() => import('@shikijs/themes/github-dark-high-contrast'))\n },\n {\n \"id\": \"github-light\",\n \"displayName\": \"GitHub Light\",\n \"type\": \"light\",\n \"import\": (() => import('@shikijs/themes/github-light'))\n },\n {\n \"id\": \"github-light-default\",\n \"displayName\": \"GitHub Light Default\",\n \"type\": \"light\",\n \"import\": (() => import('@shikijs/themes/github-light-default'))\n },\n {\n \"id\": \"github-light-high-contrast\",\n \"displayName\": \"GitHub Light High Contrast\",\n \"type\": \"light\",\n \"import\": (() => import('@shikijs/themes/github-light-high-contrast'))\n },\n {\n \"id\": \"gruvbox-dark-hard\",\n \"displayName\": \"Gruvbox Dark Hard\",\n \"type\": \"dark\",\n \"import\": (() => import('@shikijs/themes/gruvbox-dark-hard'))\n },\n {\n \"id\": \"gruvbox-dark-medium\",\n \"displayName\": \"Gruvbox Dark Medium\",\n \"type\": \"dark\",\n \"import\": (() => import('@shikijs/themes/gruvbox-dark-medium'))\n },\n {\n \"id\": \"gruvbox-dark-soft\",\n \"displayName\": \"Gruvbox Dark Soft\",\n \"type\": \"dark\",\n \"import\": (() => import('@shikijs/themes/gruvbox-dark-soft'))\n },\n {\n \"id\": \"gruvbox-light-hard\",\n \"displayName\": \"Gruvbox Light Hard\",\n \"type\": \"light\",\n \"import\": (() => import('@shikijs/themes/gruvbox-light-hard'))\n },\n {\n \"id\": \"gruvbox-light-medium\",\n \"displayName\": \"Gruvbox Light Medium\",\n \"type\": \"light\",\n \"import\": (() => import('@shikijs/themes/gruvbox-light-medium'))\n },\n {\n \"id\": \"gruvbox-light-soft\",\n \"displayName\": \"Gruvbox Light Soft\",\n \"type\": \"light\",\n \"import\": (() => import('@shikijs/themes/gruvbox-light-soft'))\n },\n {\n \"id\": \"horizon\",\n \"displayName\": \"Horizon\",\n \"type\": \"dark\",\n \"import\": (() => import('@shikijs/themes/horizon'))\n },\n {\n \"id\": \"houston\",\n \"displayName\": \"Houston\",\n \"type\": \"dark\",\n \"import\": (() => import('@shikijs/themes/houston'))\n },\n {\n \"id\": \"kanagawa-dragon\",\n \"displayName\": \"Kanagawa Dragon\",\n \"type\": \"dark\",\n \"import\": (() => import('@shikijs/themes/kanagawa-dragon'))\n },\n {\n \"id\": \"kanagawa-lotus\",\n \"displayName\": \"Kanagawa Lotus\",\n \"type\": \"light\",\n \"import\": (() => import('@shikijs/themes/kanagawa-lotus'))\n },\n {\n \"id\": \"kanagawa-wave\",\n \"displayName\": \"Kanagawa Wave\",\n \"type\": \"dark\",\n \"import\": (() => import('@shikijs/themes/kanagawa-wave'))\n },\n {\n \"id\": \"laserwave\",\n \"displayName\": \"LaserWave\",\n \"type\": \"dark\",\n \"import\": (() => import('@shikijs/themes/laserwave'))\n },\n {\n \"id\": \"light-plus\",\n \"displayName\": \"Light Plus\",\n \"type\": \"light\",\n \"import\": (() => import('@shikijs/themes/light-plus'))\n },\n {\n \"id\": \"material-theme\",\n \"displayName\": \"Material Theme\",\n \"type\": \"dark\",\n \"import\": (() => import('@shikijs/themes/material-theme'))\n },\n {\n \"id\": \"material-theme-darker\",\n \"displayName\": \"Material Theme Darker\",\n \"type\": \"dark\",\n \"import\": (() => import('@shikijs/themes/material-theme-darker'))\n },\n {\n \"id\": \"material-theme-lighter\",\n \"displayName\": \"Material Theme Lighter\",\n \"type\": \"light\",\n \"import\": (() => import('@shikijs/themes/material-theme-lighter'))\n },\n {\n \"id\": \"material-theme-ocean\",\n \"displayName\": \"Material Theme Ocean\",\n \"type\": \"dark\",\n \"import\": (() => import('@shikijs/themes/material-theme-ocean'))\n },\n {\n \"id\": \"material-theme-palenight\",\n \"displayName\": \"Material Theme Palenight\",\n \"type\": \"dark\",\n \"import\": (() => import('@shikijs/themes/material-theme-palenight'))\n },\n {\n \"id\": \"min-dark\",\n \"displayName\": \"Min Dark\",\n \"type\": \"dark\",\n \"import\": (() => import('@shikijs/themes/min-dark'))\n },\n {\n \"id\": \"min-light\",\n \"displayName\": \"Min Light\",\n \"type\": \"light\",\n \"import\": (() => import('@shikijs/themes/min-light'))\n },\n {\n \"id\": \"monokai\",\n \"displayName\": \"Monokai\",\n \"type\": \"dark\",\n \"import\": (() => import('@shikijs/themes/monokai'))\n },\n {\n \"id\": \"night-owl\",\n \"displayName\": \"Night Owl\",\n \"type\": \"dark\",\n \"import\": (() => import('@shikijs/themes/night-owl'))\n },\n {\n \"id\": \"night-owl-light\",\n \"displayName\": \"Night Owl Light\",\n \"type\": \"light\",\n \"import\": (() => import('@shikijs/themes/night-owl-light'))\n },\n {\n \"id\": \"nord\",\n \"displayName\": \"Nord\",\n \"type\": \"dark\",\n \"import\": (() => import('@shikijs/themes/nord'))\n },\n {\n \"id\": \"one-dark-pro\",\n \"displayName\": \"One Dark Pro\",\n \"type\": \"dark\",\n \"import\": (() => import('@shikijs/themes/one-dark-pro'))\n },\n {\n \"id\": \"one-light\",\n \"displayName\": \"One Light\",\n \"type\": \"light\",\n \"import\": (() => import('@shikijs/themes/one-light'))\n },\n {\n \"id\": \"plastic\",\n \"displayName\": \"Plastic\",\n \"type\": \"dark\",\n \"import\": (() => import('@shikijs/themes/plastic'))\n },\n {\n \"id\": \"poimandres\",\n \"displayName\": \"Poimandres\",\n \"type\": \"dark\",\n \"import\": (() => import('@shikijs/themes/poimandres'))\n },\n {\n \"id\": \"red\",\n \"displayName\": \"Red\",\n \"type\": \"dark\",\n \"import\": (() => import('@shikijs/themes/red'))\n },\n {\n \"id\": \"rose-pine\",\n \"displayName\": \"Ros\\xE9 Pine\",\n \"type\": \"dark\",\n \"import\": (() => import('@shikijs/themes/rose-pine'))\n },\n {\n \"id\": \"rose-pine-dawn\",\n \"displayName\": \"Ros\\xE9 Pine Dawn\",\n \"type\": \"light\",\n \"import\": (() => import('@shikijs/themes/rose-pine-dawn'))\n },\n {\n \"id\": \"rose-pine-moon\",\n \"displayName\": \"Ros\\xE9 Pine Moon\",\n \"type\": \"dark\",\n \"import\": (() => import('@shikijs/themes/rose-pine-moon'))\n },\n {\n \"id\": \"slack-dark\",\n \"displayName\": \"Slack Dark\",\n \"type\": \"dark\",\n \"import\": (() => import('@shikijs/themes/slack-dark'))\n },\n {\n \"id\": \"slack-ochin\",\n \"displayName\": \"Slack Ochin\",\n \"type\": \"light\",\n \"import\": (() => import('@shikijs/themes/slack-ochin'))\n },\n {\n \"id\": \"snazzy-light\",\n \"displayName\": \"Snazzy Light\",\n \"type\": \"light\",\n \"import\": (() => import('@shikijs/themes/snazzy-light'))\n },\n {\n \"id\": \"solarized-dark\",\n \"displayName\": \"Solarized Dark\",\n \"type\": \"dark\",\n \"import\": (() => import('@shikijs/themes/solarized-dark'))\n },\n {\n \"id\": \"solarized-light\",\n \"displayName\": \"Solarized Light\",\n \"type\": \"light\",\n \"import\": (() => import('@shikijs/themes/solarized-light'))\n },\n {\n \"id\": \"synthwave-84\",\n \"displayName\": \"Synthwave '84\",\n \"type\": \"dark\",\n \"import\": (() => import('@shikijs/themes/synthwave-84'))\n },\n {\n \"id\": \"tokyo-night\",\n \"displayName\": \"Tokyo Night\",\n \"type\": \"dark\",\n \"import\": (() => import('@shikijs/themes/tokyo-night'))\n },\n {\n \"id\": \"vesper\",\n \"displayName\": \"Vesper\",\n \"type\": \"dark\",\n \"import\": (() => import('@shikijs/themes/vesper'))\n },\n {\n \"id\": \"vitesse-black\",\n \"displayName\": \"Vitesse Black\",\n \"type\": \"dark\",\n \"import\": (() => import('@shikijs/themes/vitesse-black'))\n },\n {\n \"id\": \"vitesse-dark\",\n \"displayName\": \"Vitesse Dark\",\n \"type\": \"dark\",\n \"import\": (() => import('@shikijs/themes/vitesse-dark'))\n },\n {\n \"id\": \"vitesse-light\",\n \"displayName\": \"Vitesse Light\",\n \"type\": \"light\",\n \"import\": (() => import('@shikijs/themes/vitesse-light'))\n }\n];\nconst bundledThemes = Object.fromEntries(bundledThemesInfo.map((i) => [i.id, i.import]));\n\nexport { bundledThemes, bundledThemesInfo };\n","class ShikiError extends Error {\n constructor(message) {\n super(message);\n this.name = \"ShikiError\";\n }\n}\n\nfunction getHeapMax() {\n return 2147483648;\n}\nfunction _emscripten_get_now() {\n return typeof performance !== \"undefined\" ? performance.now() : Date.now();\n}\nconst alignUp = (x, multiple) => x + (multiple - x % multiple) % multiple;\nasync function main(init) {\n let wasmMemory;\n let buffer;\n const binding = {};\n function updateGlobalBufferAndViews(buf) {\n buffer = buf;\n binding.HEAPU8 = new Uint8Array(buf);\n binding.HEAPU32 = new Uint32Array(buf);\n }\n function _emscripten_memcpy_big(dest, src, num) {\n binding.HEAPU8.copyWithin(dest, src, src + num);\n }\n function emscripten_realloc_buffer(size) {\n try {\n wasmMemory.grow(size - buffer.byteLength + 65535 >>> 16);\n updateGlobalBufferAndViews(wasmMemory.buffer);\n return 1;\n } catch {\n }\n }\n function _emscripten_resize_heap(requestedSize) {\n const oldSize = binding.HEAPU8.length;\n requestedSize = requestedSize >>> 0;\n const maxHeapSize = getHeapMax();\n if (requestedSize > maxHeapSize)\n return false;\n for (let cutDown = 1; cutDown <= 4; cutDown *= 2) {\n let overGrownHeapSize = oldSize * (1 + 0.2 / cutDown);\n overGrownHeapSize = Math.min(overGrownHeapSize, requestedSize + 100663296);\n const newSize = Math.min(maxHeapSize, alignUp(Math.max(requestedSize, overGrownHeapSize), 65536));\n const replacement = emscripten_realloc_buffer(newSize);\n if (replacement)\n return true;\n }\n return false;\n }\n const UTF8Decoder = typeof TextDecoder != \"undefined\" ? new TextDecoder(\"utf8\") : void 0;\n function UTF8ArrayToString(heapOrArray, idx, maxBytesToRead = 1024) {\n const endIdx = idx + maxBytesToRead;\n let endPtr = idx;\n while (heapOrArray[endPtr] && !(endPtr >= endIdx)) ++endPtr;\n if (endPtr - idx > 16 && heapOrArray.buffer && UTF8Decoder) {\n return UTF8Decoder.decode(heapOrArray.subarray(idx, endPtr));\n }\n let str = \"\";\n while (idx < endPtr) {\n let u0 = heapOrArray[idx++];\n if (!(u0 & 128)) {\n str += String.fromCharCode(u0);\n continue;\n }\n const u1 = heapOrArray[idx++] & 63;\n if ((u0 & 224) === 192) {\n str += String.fromCharCode((u0 & 31) << 6 | u1);\n continue;\n }\n const u2 = heapOrArray[idx++] & 63;\n if ((u0 & 240) === 224) {\n u0 = (u0 & 15) << 12 | u1 << 6 | u2;\n } else {\n u0 = (u0 & 7) << 18 | u1 << 12 | u2 << 6 | heapOrArray[idx++] & 63;\n }\n if (u0 < 65536) {\n str += String.fromCharCode(u0);\n } else {\n const ch = u0 - 65536;\n str += String.fromCharCode(55296 | ch >> 10, 56320 | ch & 1023);\n }\n }\n return str;\n }\n function UTF8ToString(ptr, maxBytesToRead) {\n return ptr ? UTF8ArrayToString(binding.HEAPU8, ptr, maxBytesToRead) : \"\";\n }\n const asmLibraryArg = {\n emscripten_get_now: _emscripten_get_now,\n emscripten_memcpy_big: _emscripten_memcpy_big,\n emscripten_resize_heap: _emscripten_resize_heap,\n fd_write: () => 0\n };\n async function createWasm() {\n const info = {\n env: asmLibraryArg,\n wasi_snapshot_preview1: asmLibraryArg\n };\n const exports$1 = await init(info);\n wasmMemory = exports$1.memory;\n updateGlobalBufferAndViews(wasmMemory.buffer);\n Object.assign(binding, exports$1);\n binding.UTF8ToString = UTF8ToString;\n }\n await createWasm();\n return binding;\n}\n\nvar __defProp = Object.defineProperty;\nvar __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;\nvar __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== \"symbol\" ? key + \"\" : key, value);\nlet onigBinding = null;\nfunction throwLastOnigError(onigBinding2) {\n throw new ShikiError(onigBinding2.UTF8ToString(onigBinding2.getLastOnigError()));\n}\nclass UtfString {\n constructor(str) {\n __publicField(this, \"utf16Length\");\n __publicField(this, \"utf8Length\");\n __publicField(this, \"utf16Value\");\n __publicField(this, \"utf8Value\");\n __publicField(this, \"utf16OffsetToUtf8\");\n __publicField(this, \"utf8OffsetToUtf16\");\n const utf16Length = str.length;\n const utf8Length = UtfString._utf8ByteLength(str);\n const computeIndicesMapping = utf8Length !== utf16Length;\n const utf16OffsetToUtf8 = computeIndicesMapping ? new Uint32Array(utf16Length + 1) : null;\n if (computeIndicesMapping)\n utf16OffsetToUtf8[utf16Length] = utf8Length;\n const utf8OffsetToUtf16 = computeIndicesMapping ? new Uint32Array(utf8Length + 1) : null;\n if (computeIndicesMapping)\n utf8OffsetToUtf16[utf8Length] = utf16Length;\n const utf8Value = new Uint8Array(utf8Length);\n let i8 = 0;\n for (let i16 = 0; i16 < utf16Length; i16++) {\n const charCode = str.charCodeAt(i16);\n let codePoint = charCode;\n let wasSurrogatePair = false;\n if (charCode >= 55296 && charCode <= 56319) {\n if (i16 + 1 < utf16Length) {\n const nextCharCode = str.charCodeAt(i16 + 1);\n if (nextCharCode >= 56320 && nextCharCode <= 57343) {\n codePoint = (charCode - 55296 << 10) + 65536 | nextCharCode - 56320;\n wasSurrogatePair = true;\n }\n }\n }\n if (computeIndicesMapping) {\n utf16OffsetToUtf8[i16] = i8;\n if (wasSurrogatePair)\n utf16OffsetToUtf8[i16 + 1] = i8;\n if (codePoint <= 127) {\n utf8OffsetToUtf16[i8 + 0] = i16;\n } else if (codePoint <= 2047) {\n utf8OffsetToUtf16[i8 + 0] = i16;\n utf8OffsetToUtf16[i8 + 1] = i16;\n } else if (codePoint <= 65535) {\n utf8OffsetToUtf16[i8 + 0] = i16;\n utf8OffsetToUtf16[i8 + 1] = i16;\n utf8OffsetToUtf16[i8 + 2] = i16;\n } else {\n utf8OffsetToUtf16[i8 + 0] = i16;\n utf8OffsetToUtf16[i8 + 1] = i16;\n utf8OffsetToUtf16[i8 + 2] = i16;\n utf8OffsetToUtf16[i8 + 3] = i16;\n }\n }\n if (codePoint <= 127) {\n utf8Value[i8++] = codePoint;\n } else if (codePoint <= 2047) {\n utf8Value[i8++] = 192 | (codePoint & 1984) >>> 6;\n utf8Value[i8++] = 128 | (codePoint & 63) >>> 0;\n } else if (codePoint <= 65535) {\n utf8Value[i8++] = 224 | (codePoint & 61440) >>> 12;\n utf8Value[i8++] = 128 | (codePoint & 4032) >>> 6;\n utf8Value[i8++] = 128 | (codePoint & 63) >>> 0;\n } else {\n utf8Value[i8++] = 240 | (codePoint & 1835008) >>> 18;\n utf8Value[i8++] = 128 | (codePoint & 258048) >>> 12;\n utf8Value[i8++] = 128 | (codePoint & 4032) >>> 6;\n utf8Value[i8++] = 128 | (codePoint & 63) >>> 0;\n }\n if (wasSurrogatePair)\n i16++;\n }\n this.utf16Length = utf16Length;\n this.utf8Length = utf8Length;\n this.utf16Value = str;\n this.utf8Value = utf8Value;\n this.utf16OffsetToUtf8 = utf16OffsetToUtf8;\n this.utf8OffsetToUtf16 = utf8OffsetToUtf16;\n }\n static _utf8ByteLength(str) {\n let result = 0;\n for (let i = 0, len = str.length; i < len; i++) {\n const charCode = str.charCodeAt(i);\n let codepoint = charCode;\n let wasSurrogatePair = false;\n if (charCode >= 55296 && charCode <= 56319) {\n if (i + 1 < len) {\n const nextCharCode = str.charCodeAt(i + 1);\n if (nextCharCode >= 56320 && nextCharCode <= 57343) {\n codepoint = (charCode - 55296 << 10) + 65536 | nextCharCode - 56320;\n wasSurrogatePair = true;\n }\n }\n }\n if (codepoint <= 127)\n result += 1;\n else if (codepoint <= 2047)\n result += 2;\n else if (codepoint <= 65535)\n result += 3;\n else\n result += 4;\n if (wasSurrogatePair)\n i++;\n }\n return result;\n }\n createString(onigBinding2) {\n const result = onigBinding2.omalloc(this.utf8Length);\n onigBinding2.HEAPU8.set(this.utf8Value, result);\n return result;\n }\n}\nconst _OnigString = class _OnigString {\n constructor(str) {\n __publicField(this, \"id\", ++_OnigString.LAST_ID);\n __publicField(this, \"_onigBinding\");\n __publicField(this, \"content\");\n __publicField(this, \"utf16Length\");\n __publicField(this, \"utf8Length\");\n __publicField(this, \"utf16OffsetToUtf8\");\n __publicField(this, \"utf8OffsetToUtf16\");\n __publicField(this, \"ptr\");\n if (!onigBinding)\n throw new ShikiError(\"Must invoke loadWasm first.\");\n this._onigBinding = onigBinding;\n this.content = str;\n const utfString = new UtfString(str);\n this.utf16Length = utfString.utf16Length;\n this.utf8Length = utfString.utf8Length;\n this.utf16OffsetToUtf8 = utfString.utf16OffsetToUtf8;\n this.utf8OffsetToUtf16 = utfString.utf8OffsetToUtf16;\n if (this.utf8Length < 1e4 && !_OnigString._sharedPtrInUse) {\n if (!_OnigString._sharedPtr)\n _OnigString._sharedPtr = onigBinding.omalloc(1e4);\n _OnigString._sharedPtrInUse = true;\n onigBinding.HEAPU8.set(utfString.utf8Value, _OnigString._sharedPtr);\n this.ptr = _OnigString._sharedPtr;\n } else {\n this.ptr = utfString.createString(onigBinding);\n }\n }\n convertUtf8OffsetToUtf16(utf8Offset) {\n if (this.utf8OffsetToUtf16) {\n if (utf8Offset < 0)\n return 0;\n if (utf8Offset > this.utf8Length)\n return this.utf16Length;\n return this.utf8OffsetToUtf16[utf8Offset];\n }\n return utf8Offset;\n }\n convertUtf16OffsetToUtf8(utf16Offset) {\n if (this.utf16OffsetToUtf8) {\n if (utf16Offset < 0)\n return 0;\n if (utf16Offset > this.utf16Length)\n return this.utf8Length;\n return this.utf16OffsetToUtf8[utf16Offset];\n }\n return utf16Offset;\n }\n dispose() {\n if (this.ptr === _OnigString._sharedPtr)\n _OnigString._sharedPtrInUse = false;\n else\n this._onigBinding.ofree(this.ptr);\n }\n};\n__publicField(_OnigString, \"LAST_ID\", 0);\n__publicField(_OnigString, \"_sharedPtr\", 0);\n// a pointer to a string of 10000 bytes\n__publicField(_OnigString, \"_sharedPtrInUse\", false);\nlet OnigString = _OnigString;\nclass OnigScanner {\n constructor(patterns) {\n __publicField(this, \"_onigBinding\");\n __publicField(this, \"_ptr\");\n if (!onigBinding)\n throw new ShikiError(\"Must invoke loadWasm first.\");\n const strPtrsArr = [];\n const strLenArr = [];\n for (let i = 0, len = patterns.length; i < len; i++) {\n const utfString = new UtfString(patterns[i]);\n strPtrsArr[i] = utfString.createString(onigBinding);\n strLenArr[i] = utfString.utf8Length;\n }\n const strPtrsPtr = onigBinding.omalloc(4 * patterns.length);\n onigBinding.HEAPU32.set(strPtrsArr, strPtrsPtr / 4);\n const strLenPtr = onigBinding.omalloc(4 * patterns.length);\n onigBinding.HEAPU32.set(strLenArr, strLenPtr / 4);\n const scannerPtr = onigBinding.createOnigScanner(strPtrsPtr, strLenPtr, patterns.length);\n for (let i = 0, len = patterns.length; i < len; i++)\n onigBinding.ofree(strPtrsArr[i]);\n onigBinding.ofree(strLenPtr);\n onigBinding.ofree(strPtrsPtr);\n if (scannerPtr === 0)\n throwLastOnigError(onigBinding);\n this._onigBinding = onigBinding;\n this._ptr = scannerPtr;\n }\n dispose() {\n this._onigBinding.freeOnigScanner(this._ptr);\n }\n findNextMatchSync(string, startPosition, arg) {\n let options = 0 /* None */;\n if (typeof arg === \"number\") {\n options = arg;\n }\n if (typeof string === \"string\") {\n string = new OnigString(string);\n const result = this._findNextMatchSync(string, startPosition, false, options);\n string.dispose();\n return result;\n }\n return this._findNextMatchSync(string, startPosition, false, options);\n }\n _findNextMatchSync(string, startPosition, debugCall, options) {\n const onigBinding2 = this._onigBinding;\n const resultPtr = onigBinding2.findNextOnigScannerMatch(this._ptr, string.id, string.ptr, string.utf8Length, string.convertUtf16OffsetToUtf8(startPosition), options);\n if (resultPtr === 0) {\n return null;\n }\n const HEAPU32 = onigBinding2.HEAPU32;\n let offset = resultPtr / 4;\n const index = HEAPU32[offset++];\n const count = HEAPU32[offset++];\n const captureIndices = [];\n for (let i = 0; i < count; i++) {\n const beg = string.convertUtf8OffsetToUtf16(HEAPU32[offset++]);\n const end = string.convertUtf8OffsetToUtf16(HEAPU32[offset++]);\n captureIndices[i] = {\n start: beg,\n end,\n length: end - beg\n };\n }\n return {\n index,\n captureIndices\n };\n }\n}\nfunction isInstantiatorOptionsObject(dataOrOptions) {\n return typeof dataOrOptions.instantiator === \"function\";\n}\nfunction isInstantiatorModule(dataOrOptions) {\n return typeof dataOrOptions.default === \"function\";\n}\nfunction isDataOptionsObject(dataOrOptions) {\n return typeof dataOrOptions.data !== \"undefined\";\n}\nfunction isResponse(dataOrOptions) {\n return typeof Response !== \"undefined\" && dataOrOptions instanceof Response;\n}\nfunction isArrayBuffer(data) {\n return typeof ArrayBuffer !== \"undefined\" && (data instanceof ArrayBuffer || ArrayBuffer.isView(data)) || typeof Buffer !== \"undefined\" && Buffer.isBuffer?.(data) || typeof SharedArrayBuffer !== \"undefined\" && data instanceof SharedArrayBuffer || typeof Uint32Array !== \"undefined\" && data instanceof Uint32Array;\n}\nlet initPromise;\nfunction loadWasm(options) {\n if (initPromise)\n return initPromise;\n async function _load() {\n onigBinding = await main(async (info) => {\n let instance = options;\n instance = await instance;\n if (typeof instance === \"function\")\n instance = await instance(info);\n if (typeof instance === \"function\")\n instance = await instance(info);\n if (isInstantiatorOptionsObject(instance)) {\n instance = await instance.instantiator(info);\n } else if (isInstantiatorModule(instance)) {\n instance = await instance.default(info);\n } else {\n if (isDataOptionsObject(instance))\n instance = instance.data;\n if (isResponse(instance)) {\n if (typeof WebAssembly.instantiateStreaming === \"function\")\n instance = await _makeResponseStreamingLoader(instance)(info);\n else\n instance = await _makeResponseNonStreamingLoader(instance)(info);\n } else if (isArrayBuffer(instance)) {\n instance = await _makeArrayBufferLoader(instance)(info);\n } else if (instance instanceof WebAssembly.Module) {\n instance = await _makeArrayBufferLoader(instance)(info);\n } else if (\"default\" in instance && instance.default instanceof WebAssembly.Module) {\n instance = await _makeArrayBufferLoader(instance.default)(info);\n }\n }\n if (\"instance\" in instance)\n instance = instance.instance;\n if (\"exports\" in instance)\n instance = instance.exports;\n return instance;\n });\n }\n initPromise = _load();\n return initPromise;\n}\nfunction _makeArrayBufferLoader(data) {\n return (importObject) => WebAssembly.instantiate(data, importObject);\n}\nfunction _makeResponseStreamingLoader(data) {\n return (importObject) => WebAssembly.instantiateStreaming(data, importObject);\n}\nfunction _makeResponseNonStreamingLoader(data) {\n return async (importObject) => {\n const arrayBuffer = await data.arrayBuffer();\n return WebAssembly.instantiate(arrayBuffer, importObject);\n };\n}\n\nlet _defaultWasmLoader;\nfunction setDefaultWasmLoader(_loader) {\n _defaultWasmLoader = _loader;\n}\nfunction getDefaultWasmLoader() {\n return _defaultWasmLoader;\n}\nasync function createOnigurumaEngine(options) {\n if (options)\n await loadWasm(options);\n return {\n createScanner(patterns) {\n return new OnigScanner(patterns.map((p) => typeof p === \"string\" ? p : p.source));\n },\n createString(s) {\n return new OnigString(s);\n }\n };\n}\n\nexport { createOnigurumaEngine, getDefaultWasmLoader, loadWasm, setDefaultWasmLoader };\n","\"use client\";\n\nimport { useEffect, useRef, useState } from \"react\";\n\nconst DEFAULT_TYPEWRITER_MS_PER_CHAR = 5;\n/**\n * If the network buffer pulls ahead of the typewriter cursor by more than\n * this many characters, jump forward to catch up. Keeps long messages from\n * lagging seconds behind once the network completes.\n */\nconst MAX_BUFFER_LAG_CHARS = 400;\n\nexport interface UseSmoothStreamOptions {\n\t/** Milliseconds per character. Lower = faster typing. Default 5ms (~200 cps). */\n\tmsPerChar?: number;\n}\n\n/**\n * Smooth-streaming buffer for text. Pass the latest server-side text on\n * every render; the hook diff-applies new characters to an internal buffer\n * and reveals them character-by-character on a requestAnimationFrame loop.\n *\n * Decouples *network* arrival (bursty, chunk-shaped) from *visual* arrival\n * (steady, character-by-character) so the user sees a typewriter effect\n * regardless of how the model bursts tokens.\n *\n * Adapted from https://upstash.com/blog/smooth-streaming.\n *\n * @param fullText - The complete text known so far (cumulative).\n * @param isStreaming - When false, flush remaining buffer immediately.\n */\nexport function useSmoothStream(\n\tfullText: string,\n\tisStreaming: boolean,\n\toptions: UseSmoothStreamOptions = {},\n): string {\n\tconst { msPerChar = DEFAULT_TYPEWRITER_MS_PER_CHAR } = options;\n\n\tconst [visible, setVisible] = useState(isStreaming ? \"\" : fullText);\n\tconst targetRef = useRef(fullText);\n\tconst cursorRef = useRef(isStreaming ? 0 : fullText.length);\n\tconst lastTimeRef = useRef(0);\n\tconst frameRef = useRef<number | null>(null);\n\n\t// Capture target shrink (new conversation, reset) — if `fullText` no\n\t// longer starts with what we've already revealed, snap to it.\n\tif (\n\t\tfullText.length < cursorRef.current ||\n\t\t!fullText.startsWith(visible.slice(0, cursorRef.current))\n\t) {\n\t\tcursorRef.current = isStreaming ? 0 : fullText.length;\n\t\t// Schedule state update via the effect to avoid setState-in-render.\n\t}\n\n\ttargetRef.current = fullText;\n\n\tuseEffect(() => {\n\t\t// Not streaming → render the full text immediately.\n\t\tif (!isStreaming) {\n\t\t\tif (frameRef.current !== null) {\n\t\t\t\tcancelAnimationFrame(frameRef.current);\n\t\t\t\tframeRef.current = null;\n\t\t\t}\n\t\t\tcursorRef.current = fullText.length;\n\t\t\tsetVisible(fullText);\n\t\t\treturn;\n\t\t}\n\n\t\t// Skip ahead if we're too far behind.\n\t\tconst ahead = targetRef.current.length - cursorRef.current;\n\t\tif (ahead > MAX_BUFFER_LAG_CHARS) {\n\t\t\tcursorRef.current = targetRef.current.length - MAX_BUFFER_LAG_CHARS;\n\t\t}\n\n\t\tif (frameRef.current !== null) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst tick = (time: number) => {\n\t\t\tconst target = targetRef.current;\n\t\t\tif (cursorRef.current >= target.length) {\n\t\t\t\tframeRef.current = null;\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (lastTimeRef.current === 0) {\n\t\t\t\tlastTimeRef.current = time;\n\t\t\t}\n\t\t\tconst elapsed = time - lastTimeRef.current;\n\t\t\tif (elapsed >= msPerChar) {\n\t\t\t\t// Reveal as many chars as the elapsed budget allows. Catches up\n\t\t\t\t// after long frames (tab backgrounded, jank).\n\t\t\t\tconst charsToAdvance = Math.min(\n\t\t\t\t\tMath.floor(elapsed / msPerChar),\n\t\t\t\t\ttarget.length - cursorRef.current,\n\t\t\t\t);\n\t\t\t\tcursorRef.current += charsToAdvance;\n\t\t\t\tsetVisible(target.slice(0, cursorRef.current));\n\t\t\t\tlastTimeRef.current = time;\n\t\t\t}\n\t\t\tframeRef.current = requestAnimationFrame(tick);\n\t\t};\n\n\t\tframeRef.current = requestAnimationFrame(tick);\n\n\t\treturn () => {\n\t\t\tif (frameRef.current !== null) {\n\t\t\t\tcancelAnimationFrame(frameRef.current);\n\t\t\t\tframeRef.current = null;\n\t\t\t}\n\t\t};\n\t}, [fullText, isStreaming, msPerChar]);\n\n\treturn visible;\n}\n","\"use client\";\n\nimport type { ToolUIPart } from \"ai\";\nimport {\n\tCheckIcon,\n\tChevronDownIcon,\n\tChevronRightIcon,\n\tClipboardCopyIcon,\n\tServerIcon,\n\tWrenchIcon,\n} from \"lucide-react\";\nimport type { HTMLAttributes } from \"react\";\nimport {\n\tcreateContext,\n\tuseCallback,\n\tuseContext,\n\tuseEffect,\n\tuseMemo,\n\tuseRef,\n\tuseState,\n} from \"react\";\nimport { useTranslation } from \"../i18n\";\nimport { cn } from \"../lib/utils\";\nimport { Button } from \"../ui/button\";\nimport { Shimmer } from \"./shimmer\";\n\n/**\n * Produces an abbreviated single-line JSON preview for collapsed display.\n * Objects show truncated keys/values: `{ci… 'M…, pos… '2…, squa… 80}`\n * Arrays show their length: `Array(13)`\n */\nfunction truncateJSON(data: unknown, maxLength = 80): string {\n\tif (data === null || data === undefined) {\n\t\treturn String(data);\n\t}\n\tif (typeof data !== \"object\") {\n\t\treturn String(data).slice(0, maxLength);\n\t}\n\n\tif (Array.isArray(data)) {\n\t\treturn `Array(${data.length})`;\n\t}\n\n\tconst stringified = JSON.stringify(data);\n\tif (stringified.length <= maxLength) {\n\t\treturn stringified;\n\t}\n\n\tconst entries = Object.entries(data as Record<string, unknown>);\n\tconst parts: string[] = [];\n\tlet remaining = maxLength - 2;\n\n\tfor (const [key, value] of entries) {\n\t\tif (remaining <= 8) {\n\t\t\tbreak;\n\t\t}\n\t\tconst keyAbbrev = key.length > 4 ? `${key.slice(0, 4)}\\u2026` : key;\n\t\tlet valStr: string;\n\t\tif (typeof value === \"string\") {\n\t\t\tvalStr = value.length > 2 ? `'${value.slice(0, 1)}\\u2026` : `'${value}'`;\n\t\t} else if (Array.isArray(value)) {\n\t\t\tvalStr = `Array(${value.length})`;\n\t\t} else if (typeof value === \"object\" && value !== null) {\n\t\t\tvalStr = `{\\u2026}`;\n\t\t} else {\n\t\t\tvalStr = String(value);\n\t\t}\n\t\tconst part = `${keyAbbrev}\\u2009${valStr}`;\n\t\tparts.push(part);\n\t\tremaining -= part.length + 3;\n\t}\n\n\treturn `{${parts.join(\", \")}}`;\n}\n\ninterface CopyButtonProps {\n\ttext: string;\n\tclassName?: string;\n}\n\n/** Ghost button that copies `text` to clipboard, showing \"Copied\" for 2s. */\nfunction CopyButton({ text, className }: CopyButtonProps) {\n\tconst { t } = useTranslation();\n\tconst [copied, setCopied] = useState(false);\n\tconst timeoutRef = useRef<ReturnType<typeof setTimeout>>(null);\n\n\tuseEffect(() => {\n\t\treturn () => {\n\t\t\tif (timeoutRef.current) {\n\t\t\t\tclearTimeout(timeoutRef.current);\n\t\t\t}\n\t\t};\n\t}, []);\n\n\tconst handleCopy = useCallback(\n\t\tasync (e: React.MouseEvent) => {\n\t\t\te.stopPropagation();\n\t\t\ttry {\n\t\t\t\tawait navigator.clipboard.writeText(text);\n\t\t\t\tsetCopied(true);\n\t\t\t\tif (timeoutRef.current) {\n\t\t\t\t\tclearTimeout(timeoutRef.current);\n\t\t\t\t}\n\t\t\t\ttimeoutRef.current = setTimeout(() => setCopied(false), 2000);\n\t\t\t} catch {\n\t\t\t\t// Clipboard API not available\n\t\t\t}\n\t\t},\n\t\t[text],\n\t);\n\n\treturn (\n\t\t<Button\n\t\t\tvariant=\"ghost\"\n\t\t\tsize=\"sm\"\n\t\t\tonClick={handleCopy}\n\t\t\tclassName={cn(\n\t\t\t\t\"ww:h-auto ww:gap-1 ww:px-1.5 ww:py-0.5 ww:text-xs ww:text-muted-foreground ww:hover:text-foreground\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t>\n\t\t\t{copied ? (\n\t\t\t\t<>\n\t\t\t\t\t<CheckIcon className=\"ww:size-3.5\" />\n\t\t\t\t\t<span>{t.tool.copied}</span>\n\t\t\t\t</>\n\t\t\t) : (\n\t\t\t\t<>\n\t\t\t\t\t<ClipboardCopyIcon className=\"ww:size-3.5\" />\n\t\t\t\t\t<span>{t.tool.copy}</span>\n\t\t\t\t</>\n\t\t\t)}\n\t\t</Button>\n\t);\n}\n\ninterface CollapsibleJSONProps extends HTMLAttributes<HTMLDivElement> {\n\tdata: unknown;\n\tlabel: string;\n}\n\n/**\n * Labeled JSON section with a Copy button and a collapsible preview.\n * Collapsed: shows a truncated single-line abbreviation with a `>` chevron.\n * Expanded: rotates the chevron and shows full pretty-printed JSON.\n */\nfunction CollapsibleJSON({\n\tdata,\n\tlabel,\n\tclassName,\n\t...props\n}: CollapsibleJSONProps) {\n\tconst [expanded, setExpanded] = useState(false);\n\tconst fullJSON = useMemo(() => JSON.stringify(data, null, 2), [data]);\n\tconst preview = truncateJSON(data);\n\n\treturn (\n\t\t<div className={cn(\"ww:rounded-lg ww:bg-tool-card\", className)} {...props}>\n\t\t\t<div className=\"ww:flex ww:items-center ww:justify-between ww:px-3 ww:pt-2.5 ww:pb-1.5\">\n\t\t\t\t<span className=\"ww:text-xs ww:font-medium ww:text-muted-foreground\">\n\t\t\t\t\t{label}\n\t\t\t\t</span>\n\t\t\t\t<CopyButton text={fullJSON} />\n\t\t\t</div>\n\t\t\t<button\n\t\t\t\ttype=\"button\"\n\t\t\t\tonClick={() => setExpanded((v) => !v)}\n\t\t\t\tclassName=\"ww:flex ww:w-full ww:items-start ww:gap-2 ww:px-3 ww:pb-3 ww:text-left\"\n\t\t\t>\n\t\t\t\t<ChevronRightIcon\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\"ww:mt-0.5 ww:size-3.5 ww:shrink-0 ww:text-muted-foreground ww:transition-transform ww:duration-150\",\n\t\t\t\t\t\texpanded && \"ww:rotate-90\",\n\t\t\t\t\t)}\n\t\t\t\t/>\n\t\t\t\t{expanded ? (\n\t\t\t\t\t<pre className=\"ww:overflow-x-auto ww:text-xs ww:font-mono ww:text-foreground ww:whitespace-pre-wrap ww:break-all\">\n\t\t\t\t\t\t<code>{fullJSON}</code>\n\t\t\t\t\t</pre>\n\t\t\t\t) : (\n\t\t\t\t\t<span className=\"ww:truncate ww:text-xs ww:font-mono ww:text-foreground/80\">\n\t\t\t\t\t\t{preview}\n\t\t\t\t\t</span>\n\t\t\t\t)}\n\t\t\t</button>\n\t\t</div>\n\t);\n}\n\nconst ToolOpenContext = createContext<{\n\topen: boolean;\n\ttoggle: () => void;\n}>({ open: false, toggle: () => {} });\n\nexport type ToolProps = HTMLAttributes<HTMLDivElement> & {\n\tdefaultOpen?: boolean;\n};\n\n/**\n * Compound component root for a tool call display.\n * Provides open/closed state via context to ToolHeader and ToolContent.\n *\n * ```tsx\n * <Tool defaultOpen>\n * <ToolHeader title=\"Price estimate ready\" state=\"output-available\" />\n * <ToolContent>\n * <ToolServerInfo toolName=\"get_price_estimate\" serverName=\"Tuio v2\" />\n * <ToolInput input={args} />\n * <ToolOutput output={result} errorText={undefined} />\n * </ToolContent>\n * </Tool>\n * ```\n */\nexport function Tool({\n\tclassName,\n\tdefaultOpen = false,\n\tchildren,\n\t...props\n}: ToolProps) {\n\tconst [open, setOpen] = useState(defaultOpen);\n\treturn (\n\t\t<ToolOpenContext.Provider\n\t\t\tvalue={{ open, toggle: () => setOpen((o) => !o) }}\n\t\t>\n\t\t\t<div\n\t\t\t\tclassName={cn(\"ww:mb-4 ww:w-full\", className)}\n\t\t\t\tdata-state={open ? \"open\" : \"closed\"}\n\t\t\t\tstyle={{ animation: \"ww-fade-in 0.2s ease-out\" }}\n\t\t\t\t{...props}\n\t\t\t>\n\t\t\t\t{children}\n\t\t\t</div>\n\t\t</ToolOpenContext.Provider>\n\t);\n}\n\nexport type ToolHeaderProps = HTMLAttributes<HTMLButtonElement> & {\n\ttitle?: string;\n\tstate: ToolUIPart[\"state\"];\n};\n\n/** Clickable header that toggles the tool accordion. Matches the Reasoning trigger style: muted text with a shimmering label while the tool is running. */\nexport function ToolHeader({\n\tclassName,\n\ttitle,\n\tstate,\n\t...props\n}: ToolHeaderProps) {\n\tconst { open, toggle } = useContext(ToolOpenContext);\n\tconst isRunning = state === \"input-available\" || state === \"input-streaming\";\n\tconst label = title ?? \"\";\n\n\treturn (\n\t\t<button\n\t\t\ttype=\"button\"\n\t\t\tonClick={toggle}\n\t\t\tclassName={cn(\n\t\t\t\t\"ww:flex ww:w-full ww:items-center ww:gap-2 ww:text-sm ww:text-muted-foreground ww:transition-colors ww:hover:text-foreground\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\taria-expanded={open}\n\t\t\t{...props}\n\t\t>\n\t\t\t<WrenchIcon className=\"ww:size-4 ww:shrink-0\" />\n\t\t\t<span className=\"ww:truncate\">\n\t\t\t\t{isRunning ? <Shimmer duration={1.6}>{label}</Shimmer> : label}\n\t\t\t</span>\n\t\t\t<ChevronDownIcon\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"ww:size-4 ww:shrink-0 ww:transition-transform ww:duration-200\",\n\t\t\t\t\topen && \"ww:rotate-180\",\n\t\t\t\t)}\n\t\t\t/>\n\t\t</button>\n\t);\n}\n\nexport type ToolIndicatorProps = HTMLAttributes<HTMLDivElement> & {\n\ttitle?: string;\n\tstate: ToolUIPart[\"state\"];\n};\n\n/**\n * Compact, non-interactive replacement for {@link ToolHeader} +\n * {@link ToolContent}: just the tool title, no icon and no JSON panels\n * (the `showToolCalls: \"titles-only\"` mode). Matches the Reasoning trigger\n * style: muted text with a shimmering label while the tool is running.\n */\nexport function ToolIndicator({\n\tclassName,\n\ttitle,\n\tstate,\n\t...props\n}: ToolIndicatorProps) {\n\tconst isRunning = state === \"input-available\" || state === \"input-streaming\";\n\tconst label = title ?? \"\";\n\treturn (\n\t\t<div\n\t\t\tclassName={cn(\n\t\t\t\t\"ww:mb-4 ww:flex ww:items-center ww:gap-2 ww:text-sm ww:text-muted-foreground\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\tstyle={{ animation: \"ww-fade-in 0.2s ease-out\" }}\n\t\t\t{...props}\n\t\t>\n\t\t\t<span className=\"ww:truncate\">\n\t\t\t\t{isRunning ? <Shimmer duration={1.6}>{label}</Shimmer> : label}\n\t\t\t</span>\n\t\t</div>\n\t);\n}\n\nexport type ToolServerInfoProps = HTMLAttributes<HTMLDivElement> & {\n\tserverName?: string;\n\tserverIcon?: string;\n\ttoolName: string;\n};\n\n/** Optional MCP server identity card. Shows server icon + name and the tool function name. Renders nothing if no props need display. */\nexport function ToolServerInfo({\n\tclassName,\n\tserverName,\n\tserverIcon,\n\ttoolName,\n\t...props\n}: ToolServerInfoProps) {\n\treturn (\n\t\t<div\n\t\t\tclassName={cn(\n\t\t\t\t\"ww:flex ww:items-center ww:gap-3 ww:rounded-lg ww:border ww:border-border ww:px-3 ww:py-2.5\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t>\n\t\t\t{serverIcon ? (\n\t\t\t\t<img\n\t\t\t\t\tsrc={serverIcon}\n\t\t\t\t\talt={serverName ?? \"\"}\n\t\t\t\t\tclassName=\"ww:size-8 ww:shrink-0 ww:rounded-full ww:object-cover\"\n\t\t\t\t/>\n\t\t\t) : (\n\t\t\t\t<div className=\"ww:flex ww:size-8 ww:shrink-0 ww:items-center ww:justify-center ww:rounded-full ww:border ww:border-border ww:bg-muted\">\n\t\t\t\t\t<ServerIcon className=\"ww:size-4 ww:text-muted-foreground\" />\n\t\t\t\t</div>\n\t\t\t)}\n\t\t\t<div className=\"ww:flex ww:min-w-0 ww:flex-col\">\n\t\t\t\t{serverName && (\n\t\t\t\t\t<span className=\"ww:text-xs ww:text-muted-foreground\">\n\t\t\t\t\t\t{serverName}\n\t\t\t\t\t</span>\n\t\t\t\t)}\n\t\t\t\t<span className=\"ww:truncate ww:text-sm ww:font-semibold\">\n\t\t\t\t\t{toolName}\n\t\t\t\t</span>\n\t\t\t</div>\n\t\t</div>\n\t);\n}\n\nexport type ToolContentProps = HTMLAttributes<HTMLDivElement>;\n\n/** Collapsible body that animates open/closed. Content below smoothly pushes up/down via a grid-row height transition. */\nexport function ToolContent({\n\tclassName,\n\tchildren,\n\t...props\n}: ToolContentProps) {\n\tconst { open } = useContext(ToolOpenContext);\n\n\treturn (\n\t\t<div\n\t\t\tclassName={cn(\n\t\t\t\t\"ww:grid ww:transition-[grid-template-rows,opacity] ww:duration-200 ww:ease-out\",\n\t\t\t\topen\n\t\t\t\t\t? \"ww:grid-rows-[1fr] ww:opacity-100\"\n\t\t\t\t\t: \"ww:grid-rows-[0fr] ww:opacity-0\",\n\t\t\t)}\n\t\t>\n\t\t\t<div className=\"ww:min-h-0 ww:overflow-hidden\">\n\t\t\t\t<div\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\"ww:mt-2 ww:space-y-3 ww:rounded-lg ww:border ww:border-border ww:bg-background ww:p-3\",\n\t\t\t\t\t\tclassName,\n\t\t\t\t\t)}\n\t\t\t\t\t{...props}\n\t\t\t\t>\n\t\t\t\t\t{children}\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t);\n}\n\nexport type ToolInputProps = HTMLAttributes<HTMLDivElement> & {\n\tinput: ToolUIPart[\"input\"];\n\tdebug?: boolean;\n};\n\n/** Displays the tool call request parameters as a collapsible JSON section labeled \"Request\". */\nexport function ToolInput({\n\tclassName,\n\tinput,\n\tdebug,\n\t...props\n}: ToolInputProps) {\n\tconst { t } = useTranslation();\n\tconst filtered = useMemo(() => {\n\t\tif (\n\t\t\t!debug &&\n\t\t\ttypeof input === \"object\" &&\n\t\t\tinput !== null &&\n\t\t\t!Array.isArray(input)\n\t\t) {\n\t\t\tconst { _meta, ...rest } = input as Record<string, unknown>;\n\t\t\treturn rest;\n\t\t}\n\t\treturn input;\n\t}, [input, debug]);\n\n\treturn (\n\t\t<CollapsibleJSON\n\t\t\tdata={filtered}\n\t\t\tlabel={t.tool.request}\n\t\t\tclassName={className}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nexport type ToolOutputProps = HTMLAttributes<HTMLDivElement> & {\n\toutput: ToolUIPart[\"output\"];\n\terrorText: ToolUIPart[\"errorText\"];\n\tdebug?: boolean;\n};\n\n/**\n * Per-tool definition metadata, keyed by tool name. The chat UI caches the\n * MCP `tools/list` response here so widget resolution can happen by tool\n * name (spec-canonical) rather than by inspecting every tool call result.\n */\nexport type ToolDefinitionsMap = Record<\n\tstring,\n\t{ _meta?: Record<string, unknown> }\n>;\n\nfunction asRecord(value: unknown): Record<string, unknown> | undefined {\n\tif (typeof value !== \"object\" || value === null) {\n\t\treturn undefined;\n\t}\n\treturn value as Record<string, unknown>;\n}\n\nfunction getUiObject(\n\tmeta: Record<string, unknown> | undefined,\n): Record<string, unknown> | undefined {\n\treturn asRecord(meta?.ui);\n}\n\nfunction extractOutputMeta(\n\toutput: unknown,\n): Record<string, unknown> | undefined {\n\treturn asRecord(asRecord(output)?._meta);\n}\n\n/**\n * Extract a widget resource URI from a `_meta` object, checking all three\n * shapes the spec and in-the-wild servers use, in priority order:\n *\n * 1. `_meta.ui.resourceUri` — MCP Apps preferred (nested)\n * 2. `_meta[\"ui/resourceUri\"]` — MCP Apps legacy/compat (flat)\n * 3. `_meta[\"openai/outputTemplate\"]` — OpenAI Apps SDK\n */\nfunction extractResourceUriFromMeta(\n\tmeta: Record<string, unknown> | undefined,\n): string | undefined {\n\tif (!meta) {\n\t\treturn undefined;\n\t}\n\tconst nested = getUiObject(meta)?.resourceUri;\n\tif (typeof nested === \"string\" && nested.length > 0) {\n\t\treturn nested;\n\t}\n\tconst flat = meta[\"ui/resourceUri\"];\n\tif (typeof flat === \"string\" && flat.length > 0) {\n\t\treturn flat;\n\t}\n\tconst openai = meta[\"openai/outputTemplate\"];\n\tif (typeof openai === \"string\" && openai.length > 0) {\n\t\treturn openai;\n\t}\n\treturn undefined;\n}\n\nfunction extractAutoHeightFromMeta(\n\tmeta: Record<string, unknown> | undefined,\n): boolean {\n\treturn getUiObject(meta)?.autoHeight === true;\n}\n\n/**\n * Resolve the widget resource URI for a tool part.\n *\n * Prefers the tool **definition**'s `_meta` (spec-canonical, matches how\n * stateful MCP hosts like Claude and MCP Jam work) and falls back to the\n * tool **result**'s `_meta` (legacy path for servers that echo widget\n * metadata into the result, e.g. Waniwani's own `createTool` or the\n * `withWaniwani` compat shim).\n *\n * @param toolName - The tool name, used to look up definition metadata in\n * the cached catalog.\n * @param output - The tool call result (result-side fallback).\n * @param toolDefinitions - Map of tool name → definition `_meta`, loaded\n * once per ChatCard mount from `GET /api/waniwani/tools`.\n */\nexport function resolveWidgetResourceUri(\n\ttoolName: string | undefined,\n\toutput: unknown,\n\ttoolDefinitions?: ToolDefinitionsMap,\n): string | undefined {\n\tif (toolName) {\n\t\tconst fromDef = extractResourceUriFromMeta(\n\t\t\ttoolDefinitions?.[toolName]?._meta,\n\t\t);\n\t\tif (fromDef) {\n\t\t\treturn fromDef;\n\t\t}\n\t}\n\treturn extractResourceUriFromMeta(extractOutputMeta(output));\n}\n\n/**\n * Resolve the `autoHeight` flag for a tool part. Follows the same\n * definition-first / result-fallback precedence as\n * {@link resolveWidgetResourceUri}.\n */\nexport function resolveWidgetAutoHeight(\n\ttoolName: string | undefined,\n\toutput: unknown,\n\ttoolDefinitions?: ToolDefinitionsMap,\n): boolean {\n\tif (toolName) {\n\t\tif (extractAutoHeightFromMeta(toolDefinitions?.[toolName]?._meta)) {\n\t\t\treturn true;\n\t\t}\n\t}\n\treturn extractAutoHeightFromMeta(extractOutputMeta(output));\n}\n\n/**\n * @deprecated Prefer {@link resolveWidgetResourceUri} which also looks at\n * the cached tool definition metadata. This legacy helper only inspects\n * the tool result and misses spec-compliant widget servers that put\n * widget metadata on the tool definition only (skybridge,\n * `@modelcontextprotocol/ext-apps`, raw MCP with `_meta`, OpenAI Apps SDK).\n */\nexport function getResourceUri(output: unknown): string | undefined {\n\treturn resolveWidgetResourceUri(undefined, output);\n}\n\n/**\n * @deprecated Prefer {@link resolveWidgetAutoHeight}. See\n * {@link getResourceUri} for the rationale.\n */\nexport function getAutoHeight(output: unknown): boolean {\n\treturn resolveWidgetAutoHeight(undefined, output);\n}\n\n/** Displays the tool call result as a collapsible JSON section labeled \"Response\", or an error block if `errorText` is set. */\nexport function ToolOutput({\n\tclassName,\n\toutput,\n\terrorText,\n\tdebug,\n\t...props\n}: ToolOutputProps) {\n\tconst { t } = useTranslation();\n\tconst filtered = useMemo(() => {\n\t\tif (\n\t\t\t!debug &&\n\t\t\ttypeof output === \"object\" &&\n\t\t\toutput !== null &&\n\t\t\t!Array.isArray(output)\n\t\t) {\n\t\t\tconst { _meta, ...rest } = output as Record<string, unknown>;\n\t\t\treturn rest;\n\t\t}\n\t\treturn output;\n\t}, [output, debug]);\n\n\tif (!(output || errorText)) {\n\t\treturn null;\n\t}\n\n\tif (errorText) {\n\t\treturn (\n\t\t\t<div className={cn(\"ww:space-y-2\", className)} {...props}>\n\t\t\t\t<h4 className=\"ww:text-xs ww:font-medium ww:uppercase ww:tracking-wide ww:text-muted-foreground\">\n\t\t\t\t\t{t.tool.error}\n\t\t\t\t</h4>\n\t\t\t\t<div className=\"ww:rounded-lg ww:bg-destructive/10 ww:p-3 ww:text-xs ww:text-destructive\">\n\t\t\t\t\t{errorText}\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t);\n\t}\n\n\treturn (\n\t\t<CollapsibleJSON\n\t\t\tdata={filtered}\n\t\t\tlabel={t.tool.response}\n\t\t\tclassName={className}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n","\"use client\";\n\nimport type { ChatStatus, UIMessage } from \"ai\";\nimport { ZapIcon } from \"lucide-react\";\nimport type { HTMLAttributes } from \"react\";\nimport { useTranslation } from \"../i18n\";\nimport { cn } from \"../lib/utils\";\nimport { Shimmer } from \"./shimmer\";\n\n/**\n * True when a UIMessage part renders something visible to the user (text,\n * reasoning, file, or tool). The AI SDK seeds assistant messages with a\n * non-visual `step-start` part before the first real chunk, so naive\n * \"has any part\" checks would treat that as content.\n */\nexport function isVisiblePart(part: UIMessage[\"parts\"][number]): boolean {\n\treturn (\n\t\tpart.type === \"text\" ||\n\t\tpart.type === \"reasoning\" ||\n\t\tpart.type === \"file\" ||\n\t\t\"toolCallId\" in part\n\t);\n}\n\n/** True when a message has at least one {@link isVisiblePart}. */\nexport function hasVisibleParts(message: UIMessage): boolean {\n\treturn message.parts.some(isVisiblePart);\n}\n\n/**\n * Returns true when the chat is loading but the assistant has not yet\n * produced any visible content.\n *\n * Pass `ignoreToolParts` when tool calls render nothing (`showToolCalls:\n * false`) — tool parts then don't count as visible content, so the\n * indicator keeps showing while tools run instead of leaving a blank chat.\n * Pass `ignoreReasoningParts` in that same hidden mode so a reasoning-only\n * \"thinking\" phase (which is also suppressed) doesn't leave a blank chat.\n */\nexport function shouldShowWorkingIndicator(\n\tmessages: UIMessage[],\n\tstatus: ChatStatus,\n\toptions?: { ignoreToolParts?: boolean; ignoreReasoningParts?: boolean },\n): boolean {\n\tif (status !== \"submitted\" && status !== \"streaming\") {\n\t\treturn false;\n\t}\n\tconst last = messages[messages.length - 1];\n\tif (!last || last.role !== \"assistant\") {\n\t\treturn true;\n\t}\n\tconst visible = last.parts.some((p) => {\n\t\tif (!isVisiblePart(p)) {\n\t\t\treturn false;\n\t\t}\n\t\tif (options?.ignoreToolParts && \"toolCallId\" in p) {\n\t\t\treturn false;\n\t\t}\n\t\tif (options?.ignoreReasoningParts && p.type === \"reasoning\") {\n\t\t\treturn false;\n\t\t}\n\t\treturn true;\n\t});\n\treturn !visible;\n}\n\nexport type WorkingIndicatorProps = HTMLAttributes<HTMLDivElement>;\n\n/**\n * Pre-stream activity indicator. Mirrors the Reasoning / Tool trigger\n * layout (size-4 icon + Shimmer label, muted-foreground, gap-2) so the\n * three \"agent is doing something\" states share one visual language.\n */\nexport function WorkingIndicator({\n\tclassName,\n\t...props\n}: WorkingIndicatorProps) {\n\tconst { t } = useTranslation();\n\treturn (\n\t\t<div\n\t\t\taria-live=\"polite\"\n\t\t\tclassName={cn(\n\t\t\t\t\"ww:mb-4 ww:flex ww:w-full ww:items-center ww:gap-2 ww:text-sm ww:text-muted-foreground\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\tstyle={{ animation: \"ww-fade-in 0.2s ease-out\" }}\n\t\t\t{...props}\n\t\t>\n\t\t\t<ZapIcon className=\"ww:size-4 ww:shrink-0\" />\n\t\t\t<Shimmer duration={1.6}>{t.workingIndicator.default}</Shimmer>\n\t\t</div>\n\t);\n}\n","\"use client\";\n\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport {\n\ttype ModelContextUpdate,\n\tmergeModelContext,\n} from \"../../../shared/model-context\";\nimport {\n\tresolveWidgetResourceUri,\n\ttype ToolDefinitionsMap,\n} from \"../ai-elements/tool\";\nimport { cn } from \"../lib/utils\";\n\nconst DEFAULT_RESOURCE_ENDPOINT = \"/api/mcp/resource\";\nconst MAX_HEIGHT = 500;\nconst DEFAULT_HEIGHT = 0;\nconst AUTOHEIGHT_PADDING = 16;\nconst PROTOCOL_VERSION = \"2026-01-26\";\nconst RESIZE_ANIMATION_MS = 300;\nconst HANDSHAKE_TIMEOUT_MS = 3000;\nconst MAX_RETRIES = 3;\n\nfunction normalizeString(value: unknown): string | undefined {\n\tif (typeof value !== \"string\") {\n\t\treturn undefined;\n\t}\n\tconst trimmed = value.trim();\n\treturn trimmed.length > 0 ? trimmed : undefined;\n}\n\nexport function resultProducesWidget(result: {\n\t_meta?: Record<string, unknown>;\n}): boolean {\n\tconst meta = result._meta;\n\tif (!meta || typeof meta !== \"object\") {\n\t\treturn false;\n\t}\n\n\tconst openaiTemplate = normalizeString(meta[\"openai/outputTemplate\"]);\n\tif (openaiTemplate) {\n\t\treturn true;\n\t}\n\n\tconst uiMeta = meta.ui;\n\tif (!uiMeta || typeof uiMeta !== \"object\") {\n\t\treturn false;\n\t}\n\n\tconst resourceUri = normalizeString(\n\t\t(uiMeta as Record<string, unknown>).resourceUri,\n\t);\n\treturn Boolean(resourceUri);\n}\n\n/**\n * Decide whether the text of a tool call result should be auto-injected as\n * a follow-up user message. We skip auto-injection when the tool produces\n * a widget — in that case the widget will render instead of a text bubble.\n *\n * Checks widget binding the spec-canonical way: look up the tool by name\n * in the cached definition catalog first, then fall back to the result's\n * own `_meta` (legacy path).\n */\nfunction shouldAutoInjectToolResultText(\n\ttoolName: string | undefined,\n\tresult: {\n\t\t_meta?: Record<string, unknown>;\n\t},\n\ttoolDefinitions: ToolDefinitionsMap | undefined,\n): boolean {\n\tif (resolveWidgetResourceUri(toolName, result, toolDefinitions)) {\n\t\treturn false;\n\t}\n\treturn result._meta?.[\"waniwani/autoInjectResultText\"] !== false;\n}\n\nexport type McpAppDisplayMode = \"inline\" | \"pip\" | \"fullscreen\";\n\nexport interface McpAppFrameProps {\n\tresourceUri: string;\n\ttoolInput: Record<string, unknown>;\n\ttoolResult: {\n\t\tcontent?: Array<{ type: string; text?: string }>;\n\t\tstructuredContent?: Record<string, unknown>;\n\t\t_meta?: Record<string, unknown>;\n\t};\n\tresourceEndpoint?: string;\n\tchatSessionId?: string;\n\tisDark?: boolean;\n\tclassName?: string;\n\t/** When true, the iframe height auto-adapts to its content. Set via `_meta.ui.autoHeight` in the tool result. */\n\tautoHeight?: boolean;\n\t/** Called when the view requests to open a URL */\n\tonOpenLink?: (url: string) => void;\n\t/** Called when a widget sends a follow-up message via `ui/message` */\n\tonFollowUp?: (message: {\n\t\trole: string;\n\t\tcontent: Array<{ type: string; text?: string }>;\n\t\tmodelContext?: ModelContextUpdate;\n\t}) => void;\n\t/** Called when a widget calls a tool via `tools/call` (MCP Apps standard). */\n\tonCallTool?: (params: {\n\t\tname: string;\n\t\targuments: Record<string, unknown>;\n\t}) => Promise<{\n\t\tcontent?: Array<{ type: string; text?: string }>;\n\t\tstructuredContent?: Record<string, unknown>;\n\t\t_meta?: Record<string, unknown>;\n\t}>;\n\t/** Called when the widget requests a display mode change (e.g. \"fullscreen\" for expand) */\n\tonDisplayModeChange?: (mode: McpAppDisplayMode) => void;\n\t/** When true, the iframe fills its container (fullscreen mode). */\n\tisFullscreen?: boolean;\n\t/**\n\t * Cached tool catalog keyed by tool name. Passed through so that\n\t * follow-up `tools/call` requests from the widget iframe can be\n\t * correctly classified as widget-producing (spec-canonical definition\n\t * lookup) vs. plain (result text auto-injected).\n\t */\n\ttoolDefinitions?: ToolDefinitionsMap;\n}\n\nexport function McpAppFrame({\n\tresourceUri,\n\ttoolInput,\n\ttoolResult,\n\tresourceEndpoint = DEFAULT_RESOURCE_ENDPOINT,\n\tchatSessionId,\n\tisDark = false,\n\tclassName,\n\tautoHeight = false,\n\tonOpenLink,\n\tonFollowUp,\n\tonCallTool,\n\tonDisplayModeChange,\n\tisFullscreen = false,\n\ttoolDefinitions,\n}: McpAppFrameProps) {\n\tconst iframeRef = useRef<HTMLIFrameElement>(null);\n\tconst toolInputRef = useRef(toolInput);\n\tconst toolResultRef = useRef(toolResult);\n\tconst lastSizeRef = useRef({ width: 0, height: 0 });\n\tconst animationRef = useRef<Animation | null>(null);\n\tconst initializedRef = useRef(false);\n\tconst retryCountRef = useRef(0);\n\tconst displayModeRef = useRef<McpAppDisplayMode>(\"inline\");\n\tconst [height, setHeight] = useState(DEFAULT_HEIGHT);\n\tconst [width, setWidth] = useState<number | undefined>(undefined);\n\tconst onOpenLinkRef = useRef(onOpenLink);\n\tconst onFollowUpRef = useRef(onFollowUp);\n\tconst onCallToolRef = useRef(onCallTool);\n\tconst onDisplayModeChangeRef = useRef(onDisplayModeChange);\n\tconst chatSessionIdRef = useRef(chatSessionId);\n\tconst toolDefinitionsRef = useRef(toolDefinitions);\n\n\ttoolInputRef.current = toolInput;\n\ttoolResultRef.current = toolResult;\n\tonOpenLinkRef.current = onOpenLink;\n\tonFollowUpRef.current = onFollowUp;\n\tonCallToolRef.current = onCallTool;\n\tonDisplayModeChangeRef.current = onDisplayModeChange;\n\tchatSessionIdRef.current = chatSessionId;\n\ttoolDefinitionsRef.current = toolDefinitions;\n\n\tconst clampHeight = useCallback(\n\t\t(h: number) => {\n\t\t\tif (autoHeight) {\n\t\t\t\treturn Math.max(h + AUTOHEIGHT_PADDING, 0);\n\t\t\t}\n\t\t\treturn Math.min(Math.max(h, 50), MAX_HEIGHT);\n\t\t},\n\t\t[autoHeight],\n\t);\n\n\t// Build the iframe src URL via string concatenation so the value is\n\t// stable across SSR and CSR — `new URL(..., window.location.href)`\n\t// would produce an absolute URL that differs between server (falling\n\t// back to a stub origin) and client, causing a hydration mismatch\n\t// and a wasted iframe load against the stub origin before hydration\n\t// corrects it. The browser resolves relative URLs against the\n\t// document itself, so this works for both absolute and relative\n\t// `resourceEndpoint` values. Callers may pre-populate query params on\n\t// `resourceEndpoint` (e.g. the embed appends a `token` so the\n\t// cross-origin GET carries auth) — the separator check handles that.\n\tconst iframeSrc = useMemo(() => {\n\t\tconst separator = resourceEndpoint.includes(\"?\") ? \"&\" : \"?\";\n\t\treturn `${resourceEndpoint}${separator}uri=${encodeURIComponent(resourceUri)}`;\n\t}, [resourceEndpoint, resourceUri]);\n\n\tconst isDarkRef = useRef(isDark);\n\tisDarkRef.current = isDark;\n\n\t// Mirror `isFullscreen` into a ref so the long-lived postMessage handler\n\t// reads the current value (it isn't in that effect's dep list). The size\n\t// handler only runs on async postMessages, always after this effect has\n\t// committed, so syncing the ref here is timely.\n\t//\n\t// In fullscreen the iframe fills its container (`height: 100%`). A widget\n\t// still emits `size-changed` for its content, and applying that (via the\n\t// `fill: \"forwards\"` height animation, which overrides the inline `100%`)\n\t// would shrink the frame to the reported/clamped height; the widget then\n\t// re-measures the smaller frame and reports again — an endless resize loop.\n\t// So height reports are ignored while fullscreen (see the size-changed\n\t// handler). On toggle, cancel any in-flight animation and invalidate the\n\t// dedup cache so the first report in the new mode is always applied.\n\tconst isFullscreenRef = useRef(isFullscreen);\n\tuseEffect(() => {\n\t\tisFullscreenRef.current = isFullscreen;\n\t\tlastSizeRef.current.height = -1;\n\t\tif (animationRef.current) {\n\t\t\tanimationRef.current.cancel();\n\t\t\tanimationRef.current = null;\n\t\t}\n\t}, [isFullscreen]);\n\n\t// Send theme changes to the iframe (only after handshake is complete)\n\tuseEffect(() => {\n\t\tif (!initializedRef.current) {\n\t\t\treturn;\n\t\t}\n\t\tconst iframe = iframeRef.current;\n\t\tif (!iframe?.contentWindow) {\n\t\t\treturn;\n\t\t}\n\n\t\tiframe.contentWindow.postMessage(\n\t\t\t{\n\t\t\t\tjsonrpc: \"2.0\",\n\t\t\t\tmethod: \"ui/notifications/host-context-changed\",\n\t\t\t\tparams: {\n\t\t\t\t\ttheme: isDark ? \"dark\" : \"light\",\n\t\t\t\t},\n\t\t\t},\n\t\t\t\"*\",\n\t\t);\n\t}, [isDark]);\n\n\t// Synchronous postMessage protocol handler — no async imports, no timing issues.\n\t// Handles the MCP UI protocol (ui/initialize, notifications, etc.) directly.\n\tuseEffect(() => {\n\t\tconst iframe = iframeRef.current;\n\t\tif (!iframe) {\n\t\t\treturn;\n\t\t}\n\n\t\tlet disposed = false;\n\t\tlet handshakeReceived = false;\n\t\tlet pendingModelContext: ModelContextUpdate | null = null;\n\t\tlet pendingToolResult: {\n\t\t\ttext: string;\n\t\t\ttimer: ReturnType<typeof setTimeout>;\n\t\t} | null = null;\n\n\t\t// Retry: reload iframe if handshake doesn't arrive in time\n\t\tconst handshakeTimer = setTimeout(() => {\n\t\t\tif (disposed || handshakeReceived) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (retryCountRef.current >= MAX_RETRIES) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tretryCountRef.current += 1;\n\t\t\t// Force reload with a cache-busting param\n\t\t\tconst url = new URL(iframe.src);\n\t\t\turl.searchParams.set(\"_retry\", String(retryCountRef.current));\n\t\t\tiframe.src = url.toString();\n\t\t}, HANDSHAKE_TIMEOUT_MS);\n\n\t\tconst postToIframe = (msg: Record<string, unknown>) => {\n\t\t\tiframe.contentWindow?.postMessage(msg, \"*\");\n\t\t};\n\n\t\tconst handleMessage = (event: MessageEvent) => {\n\t\t\tif (disposed) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (event.source !== iframe.contentWindow) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst data = event.data;\n\n\t\t\tif (!data || typeof data !== \"object\" || data.jsonrpc !== \"2.0\") {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst method: string | undefined = data.method;\n\t\t\tconst id: number | string | undefined = data.id;\n\n\t\t\t// ui/initialize — widget requests handshake\n\t\t\tif (method === \"ui/initialize\" && id != null) {\n\t\t\t\thandshakeReceived = true;\n\t\t\t\tclearTimeout(handshakeTimer);\n\t\t\t\tpostToIframe({\n\t\t\t\t\tjsonrpc: \"2.0\",\n\t\t\t\t\tid,\n\t\t\t\t\tresult: {\n\t\t\t\t\t\tprotocolVersion: data.params?.protocolVersion ?? PROTOCOL_VERSION,\n\t\t\t\t\t\thostInfo: { name: \"Waniwani Chat\", version: \"1.0.0\" },\n\t\t\t\t\t\thostCapabilities: {\n\t\t\t\t\t\t\topenLinks: {},\n\t\t\t\t\t\t\tmessage: {\n\t\t\t\t\t\t\t\ttext: {},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\ttools: {},\n\t\t\t\t\t\t\tupdateModelContext: {\n\t\t\t\t\t\t\t\ttext: {},\n\t\t\t\t\t\t\t\tstructuredContent: {},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\thostContext: {\n\t\t\t\t\t\t\ttheme: isDarkRef.current ? \"dark\" : \"light\",\n\t\t\t\t\t\t\tdisplayMode: displayModeRef.current,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// ui/notifications/initialized — widget confirms init, we send tool data\n\t\t\tif (method === \"ui/notifications/initialized\") {\n\t\t\t\tinitializedRef.current = true;\n\t\t\t\tconst input = toolInputRef.current;\n\t\t\t\tconst result = toolResultRef.current;\n\t\t\t\tconst resultMeta =\n\t\t\t\t\tresult._meta && typeof result._meta === \"object\"\n\t\t\t\t\t\t? result._meta\n\t\t\t\t\t\t: null;\n\t\t\t\tconst normalizedChatSessionId = normalizeString(\n\t\t\t\t\tchatSessionIdRef.current,\n\t\t\t\t);\n\t\t\t\tconst waniwaniMeta =\n\t\t\t\t\tresultMeta &&\n\t\t\t\t\ttypeof resultMeta.waniwani === \"object\" &&\n\t\t\t\t\tresultMeta.waniwani !== null\n\t\t\t\t\t\t? (resultMeta.waniwani as Record<string, unknown>)\n\t\t\t\t\t\t: null;\n\t\t\t\tconst forwardedWaniwaniMeta =\n\t\t\t\t\twaniwaniMeta || normalizedChatSessionId\n\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\t...(waniwaniMeta ?? {}),\n\t\t\t\t\t\t\t\t...(normalizedChatSessionId\n\t\t\t\t\t\t\t\t\t? { sessionId: normalizedChatSessionId }\n\t\t\t\t\t\t\t\t\t: {}),\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t: undefined;\n\t\t\t\tconst forwardedMeta =\n\t\t\t\t\tresultMeta || forwardedWaniwaniMeta\n\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\t...(resultMeta ?? {}),\n\t\t\t\t\t\t\t\t...(forwardedWaniwaniMeta\n\t\t\t\t\t\t\t\t\t? { waniwani: forwardedWaniwaniMeta }\n\t\t\t\t\t\t\t\t\t: {}),\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t: undefined;\n\n\t\t\t\tpostToIframe({\n\t\t\t\t\tjsonrpc: \"2.0\",\n\t\t\t\t\tmethod: \"ui/notifications/tool-input\",\n\t\t\t\t\tparams: { arguments: input },\n\t\t\t\t});\n\n\t\t\t\tconst content = result.content ?? [\n\t\t\t\t\t{ type: \"text\", text: JSON.stringify(result) },\n\t\t\t\t];\n\t\t\t\tpostToIframe({\n\t\t\t\t\tjsonrpc: \"2.0\",\n\t\t\t\t\tmethod: \"ui/notifications/tool-result\",\n\t\t\t\t\tparams: {\n\t\t\t\t\t\tcontent,\n\t\t\t\t\t\tstructuredContent: result.structuredContent,\n\t\t\t\t\t\t_meta: forwardedMeta,\n\t\t\t\t\t\t// Compatibility: some clients inspect `meta` instead of `_meta`.\n\t\t\t\t\t\tmeta: forwardedMeta,\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// ui/notifications/size-changed — widget reports content size\n\t\t\tif (method === \"ui/notifications/size-changed\") {\n\t\t\t\tconst params = data.params;\n\t\t\t\tconst newHeight =\n\t\t\t\t\ttypeof params?.height === \"number\" ? params.height : undefined;\n\t\t\t\tconst newWidth =\n\t\t\t\t\ttypeof params?.width === \"number\" ? params.width : undefined;\n\n\t\t\t\t// Deduplicate — only update if values actually changed (prevents feedback loops)\n\t\t\t\tconst last = lastSizeRef.current;\n\t\t\t\tconst heightChanged =\n\t\t\t\t\tnewHeight !== undefined && newHeight !== last.height;\n\t\t\t\tconst widthChanged = newWidth !== undefined && newWidth !== last.width;\n\n\t\t\t\tif (!heightChanged && !widthChanged) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (heightChanged && newHeight !== undefined) {\n\t\t\t\t\tlast.height = newHeight;\n\t\t\t\t\t// While fullscreen, the iframe must stay at `height: 100%`; applying\n\t\t\t\t\t// the reported content height here would override that and trigger a\n\t\t\t\t\t// resize feedback loop with the widget (see the toggle effect above).\n\t\t\t\t\tif (isFullscreenRef.current) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tconst clamped = clampHeight(newHeight);\n\n\t\t\t\t\t// Get current visual height before canceling the old animation\n\t\t\t\t\tconst from = iframe.getBoundingClientRect().height;\n\n\t\t\t\t\t// Cancel previous animation so its fill: \"forwards\" stops overriding inline style\n\t\t\t\t\tif (animationRef.current) {\n\t\t\t\t\t\tanimationRef.current.cancel();\n\t\t\t\t\t\tanimationRef.current = null;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Set the target height in React state (takes effect once no animation overrides it)\n\t\t\t\t\tsetHeight(clamped);\n\n\t\t\t\t\t// Animate the height transition\n\t\t\t\t\tif (iframe.animate && Math.abs(from - clamped) > 2) {\n\t\t\t\t\t\tconst anim = iframe.animate(\n\t\t\t\t\t\t\t[{ height: `${from}px` }, { height: `${clamped}px` }],\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tduration: RESIZE_ANIMATION_MS,\n\t\t\t\t\t\t\t\teasing: \"ease-out\",\n\t\t\t\t\t\t\t\tfill: \"forwards\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t);\n\t\t\t\t\t\tanimationRef.current = anim;\n\t\t\t\t\t\t// Once done, remove the animation so the inline style is the source of truth\n\t\t\t\t\t\tanim.onfinish = () => {\n\t\t\t\t\t\t\tif (animationRef.current === anim) {\n\t\t\t\t\t\t\t\tanim.cancel();\n\t\t\t\t\t\t\t\tanimationRef.current = null;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (widthChanged && autoHeight && newWidth !== undefined) {\n\t\t\t\t\tlast.width = newWidth;\n\t\t\t\t\tsetWidth(newWidth);\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// ui/open-link — widget requests to open a URL\n\t\t\tif (method === \"ui/open-link\" && id != null) {\n\t\t\t\tconst url = data.params?.url;\n\t\t\t\tif (typeof url === \"string\") {\n\t\t\t\t\tif (onOpenLinkRef.current) {\n\t\t\t\t\t\tonOpenLinkRef.current(url);\n\t\t\t\t\t} else {\n\t\t\t\t\t\twindow.open(url, \"_blank\", \"noopener,noreferrer\");\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tpostToIframe({ jsonrpc: \"2.0\", id, result: {} });\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// ui/message — widget sends a chat message\n\t\t\tif (method === \"ui/message\" && id != null) {\n\t\t\t\tif (onFollowUpRef.current && data.params) {\n\t\t\t\t\tlet params = data.params;\n\t\t\t\t\tconst modelContext = pendingModelContext;\n\t\t\t\t\tpendingModelContext = null;\n\t\t\t\t\t// Merge pending tool result into the follow-up message\n\t\t\t\t\tif (pendingToolResult) {\n\t\t\t\t\t\tclearTimeout(pendingToolResult.timer);\n\t\t\t\t\t\tconst toolText = pendingToolResult.text;\n\t\t\t\t\t\tpendingToolResult = null;\n\t\t\t\t\t\tconst existingText = (params.content ?? [])\n\t\t\t\t\t\t\t.map((c: { text?: string }) => c.text ?? \"\")\n\t\t\t\t\t\t\t.join(\"\")\n\t\t\t\t\t\t\t.trim();\n\t\t\t\t\t\tparams = {\n\t\t\t\t\t\t\t...params,\n\t\t\t\t\t\t\tcontent: [\n\t\t\t\t\t\t\t\t{ type: \"text\", text: `${existingText}\\n\\n${toolText}` },\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t\tonFollowUpRef.current({\n\t\t\t\t\t\t...params,\n\t\t\t\t\t\t...(modelContext ? { modelContext } : {}),\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tpostToIframe({ jsonrpc: \"2.0\", id, result: {} });\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// ui/update-model-context — widget updates hidden model context\n\t\t\tif (method === \"ui/update-model-context\" && id != null) {\n\t\t\t\tpendingModelContext = mergeModelContext(\n\t\t\t\t\tpendingModelContext,\n\t\t\t\t\tdata.params as ModelContextUpdate,\n\t\t\t\t);\n\t\t\t\tpostToIframe({ jsonrpc: \"2.0\", id, result: {} });\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// tools/call — widget calls a server tool (MCP Apps standard)\n\t\t\tif (method === \"tools/call\" && id != null) {\n\t\t\t\tconst handler = onCallToolRef.current;\n\t\t\t\tif (!handler) {\n\t\t\t\t\tpostToIframe({\n\t\t\t\t\t\tjsonrpc: \"2.0\",\n\t\t\t\t\t\tid,\n\t\t\t\t\t\terror: { code: -32601, message: \"tools/call not supported\" },\n\t\t\t\t\t});\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tconst calledToolName = data.params?.name;\n\t\t\t\thandler({\n\t\t\t\t\tname: calledToolName,\n\t\t\t\t\targuments: data.params?.arguments ?? {},\n\t\t\t\t})\n\t\t\t\t\t.then((result) => {\n\t\t\t\t\t\tpostToIframe({ jsonrpc: \"2.0\", id, result });\n\n\t\t\t\t\t\t// Schedule auto-injection for non-widget tool results. Plain\n\t\t\t\t\t\t// tools may still return structuredContent, so the presence of\n\t\t\t\t\t\t// structuredContent alone is not enough to decide this.\n\t\t\t\t\t\tconst text = result.content\n\t\t\t\t\t\t\t?.map((c) => c.text ?? \"\")\n\t\t\t\t\t\t\t.join(\"\")\n\t\t\t\t\t\t\t.trim();\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\ttext &&\n\t\t\t\t\t\t\tshouldAutoInjectToolResultText(\n\t\t\t\t\t\t\t\tcalledToolName,\n\t\t\t\t\t\t\t\tresult,\n\t\t\t\t\t\t\t\ttoolDefinitionsRef.current,\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tif (pendingToolResult) {\n\t\t\t\t\t\t\t\tclearTimeout(pendingToolResult.timer);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tpendingToolResult = {\n\t\t\t\t\t\t\t\ttext,\n\t\t\t\t\t\t\t\ttimer: setTimeout(() => {\n\t\t\t\t\t\t\t\t\tif (disposed) {\n\t\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tconst modelContext = pendingModelContext;\n\t\t\t\t\t\t\t\t\tpendingModelContext = null;\n\t\t\t\t\t\t\t\t\tpendingToolResult = null;\n\t\t\t\t\t\t\t\t\tonFollowUpRef.current?.({\n\t\t\t\t\t\t\t\t\t\trole: \"user\",\n\t\t\t\t\t\t\t\t\t\tcontent: [{ type: \"text\", text }],\n\t\t\t\t\t\t\t\t\t\t...(modelContext ? { modelContext } : {}),\n\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t}, 500),\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\t\t\t\t\t})\n\t\t\t\t\t.catch((err: unknown) => {\n\t\t\t\t\t\tconst message =\n\t\t\t\t\t\t\terr instanceof Error ? err.message : \"Tool call failed\";\n\t\t\t\t\t\tpostToIframe({\n\t\t\t\t\t\t\tjsonrpc: \"2.0\",\n\t\t\t\t\t\t\tid,\n\t\t\t\t\t\t\terror: { code: -32000, message },\n\t\t\t\t\t\t});\n\t\t\t\t\t});\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// ui/request-display-mode — widget requests fullscreen/inline/pip\n\t\t\tif (method === \"ui/request-display-mode\" && id != null) {\n\t\t\t\tconst requested = data.params?.mode;\n\t\t\t\tconst granted =\n\t\t\t\t\trequested === \"fullscreen\" ||\n\t\t\t\t\trequested === \"inline\" ||\n\t\t\t\t\trequested === \"pip\"\n\t\t\t\t\t\t? requested\n\t\t\t\t\t\t: \"inline\";\n\t\t\t\tdisplayModeRef.current = granted;\n\t\t\t\t// Reply with the granted mode\n\t\t\t\tpostToIframe({\n\t\t\t\t\tjsonrpc: \"2.0\",\n\t\t\t\t\tid,\n\t\t\t\t\tresult: { mode: granted },\n\t\t\t\t});\n\t\t\t\t// Notify the widget of the context change\n\t\t\t\tpostToIframe({\n\t\t\t\t\tjsonrpc: \"2.0\",\n\t\t\t\t\tmethod: \"ui/notifications/host-context-changed\",\n\t\t\t\t\tparams: { displayMode: granted },\n\t\t\t\t});\n\t\t\t\tonDisplayModeChangeRef.current?.(granted);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// ui/resource-teardown — graceful shutdown\n\t\t\tif (method === \"ui/resource-teardown\" && id != null) {\n\t\t\t\tpostToIframe({ jsonrpc: \"2.0\", id, result: {} });\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// ping — keep-alive\n\t\t\tif (method === \"ping\" && id != null) {\n\t\t\t\tpostToIframe({ jsonrpc: \"2.0\", id, result: {} });\n\t\t\t}\n\t\t};\n\n\t\twindow.addEventListener(\"message\", handleMessage);\n\n\t\treturn () => {\n\t\t\tdisposed = true;\n\t\t\tclearTimeout(handshakeTimer);\n\t\t\tif (pendingToolResult) {\n\t\t\t\tclearTimeout(pendingToolResult.timer);\n\t\t\t}\n\t\t\twindow.removeEventListener(\"message\", handleMessage);\n\t\t};\n\t}, [autoHeight, clampHeight]);\n\n\treturn (\n\t\t<iframe\n\t\t\tref={iframeRef}\n\t\t\tsrc={iframeSrc}\n\t\t\tsandbox=\"allow-scripts allow-forms allow-same-origin allow-popups allow-popups-to-escape-sandbox\"\n\t\t\tclassName={cn(\n\t\t\t\t!isFullscreen && \"ww:rounded-md ww:border ww:border-border\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\tstyle={{\n\t\t\t\theight: isFullscreen ? \"100%\" : height,\n\t\t\t\tminWidth: isFullscreen || !width ? undefined : `min(${width}px, 100%)`,\n\t\t\t\twidth: \"100%\",\n\t\t\t\tborder: \"none\",\n\t\t\t\tcolorScheme: isDark ? \"dark\" : \"auto\",\n\t\t\t}}\n\t\t\ttitle=\"MCP App\"\n\t\t/>\n\t);\n}\n","\"use client\";\n\nimport type { WelcomeConfig } from \"../@types\";\nimport { cn } from \"../lib/utils\";\n\ninterface WelcomeScreenProps extends WelcomeConfig {\n\tonSuggestionSelect?: (suggestion: string) => void;\n}\n\nexport function WelcomeScreen({\n\ticon,\n\ttitle,\n\tdescription,\n\tsuggestions,\n\tonSuggestionSelect,\n}: WelcomeScreenProps) {\n\treturn (\n\t\t<div className=\"ww:flex ww:flex-col ww:items-center ww:justify-center ww:py-12 ww:px-6 ww:text-center ww:min-h-full\">\n\t\t\t{icon && (\n\t\t\t\t<div className=\"ww:mb-4 ww:flex ww:items-center ww:justify-center ww:size-12 ww:rounded-xl ww:bg-foreground ww:text-background\">\n\t\t\t\t\t{icon}\n\t\t\t\t</div>\n\t\t\t)}\n\t\t\t<h2 className=\"ww:text-lg ww:font-semibold ww:text-foreground\">\n\t\t\t\t{title}\n\t\t\t</h2>\n\t\t\t{description && (\n\t\t\t\t<p className=\"ww:mt-1 ww:text-sm ww:text-muted-foreground ww:max-w-sm\">\n\t\t\t\t\t{description}\n\t\t\t\t</p>\n\t\t\t)}\n\t\t\t{suggestions && suggestions.length > 0 && (\n\t\t\t\t<div className=\"ww:mt-6 ww:w-full ww:max-w-md ww:flex ww:flex-col ww:gap-2\">\n\t\t\t\t\t{suggestions.map((suggestion, index) => (\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\tkey={suggestion}\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\tonClick={() => onSuggestionSelect?.(suggestion)}\n\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\"ww:w-full ww:text-left ww:rounded-xl ww:border ww:border-border ww:bg-background ww:px-4 ww:py-3 ww:text-sm\",\n\t\t\t\t\t\t\t\t\"ww:text-foreground ww:hover:bg-accent ww:hover:border-primary/30\",\n\t\t\t\t\t\t\t\t\"ww:transition-all ww:duration-200 ww:ease-out ww:cursor-pointer\",\n\t\t\t\t\t\t\t\t\"ww:animate-[ww-fade-in_0.2s_ease-out_both]\",\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\tstyle={{ animationDelay: `${index * 50}ms` }}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{suggestion}\n\t\t\t\t\t\t</button>\n\t\t\t\t\t))}\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n","\"use client\";\n\nimport { Component, type ReactNode } from \"react\";\nimport { useTranslation } from \"../i18n\";\n\ninterface Props {\n\tchildren: ReactNode;\n}\n\ninterface State {\n\thasError: boolean;\n}\n\nfunction ErrorFallback({ onRetry }: { onRetry: () => void }) {\n\tconst { t } = useTranslation();\n\treturn (\n\t\t<div className=\"ww:flex ww:items-center ww:justify-between ww:rounded-md ww:border ww:border-border ww:bg-muted/50 ww:px-4 ww:py-3 ww:text-sm ww:text-muted-foreground\">\n\t\t\t<span>{t.widgetErrorBoundary.failedToLoad}</span>\n\t\t\t<button\n\t\t\t\ttype=\"button\"\n\t\t\t\tonClick={onRetry}\n\t\t\t\tclassName=\"ww:text-xs ww:font-medium ww:text-primary ww:hover:underline\"\n\t\t\t>\n\t\t\t\t{t.widgetErrorBoundary.retry}\n\t\t\t</button>\n\t\t</div>\n\t);\n}\n\nexport class WidgetErrorBoundary extends Component<Props, State> {\n\tstate: State = { hasError: false };\n\n\tstatic getDerivedStateFromError(): State {\n\t\treturn { hasError: true };\n\t}\n\n\tcomponentDidCatch(error: Error) {\n\t\tconsole.warn(\"[Waniwani] Widget failed to render:\", error.message);\n\t}\n\n\trender() {\n\t\tif (this.state.hasError) {\n\t\t\treturn (\n\t\t\t\t<ErrorFallback onRetry={() => this.setState({ hasError: false })} />\n\t\t\t);\n\t\t}\n\n\t\treturn this.props.children;\n\t}\n}\n","\"use client\";\n\nimport { useTranslation } from \"../i18n\";\n\nconst LOGO_URL = \"https://app.waniwani.ai/assets/waniwani-logo.svg\";\nconst HREF = \"https://waniwani.ai\";\n\n/**\n * Small \"powered by Waniwani\" link rendered under the chat input. Mirrors\n * the attribution pattern of other embedded chat widgets and links back to\n * the Waniwani site.\n */\nexport function PoweredBy() {\n\tconst { t } = useTranslation();\n\treturn (\n\t\t<a\n\t\t\thref={HREF}\n\t\t\ttarget=\"_blank\"\n\t\t\trel=\"noopener noreferrer\"\n\t\t\tclassName=\"ww:flex ww:items-center ww:gap-1.5 ww:whitespace-nowrap ww:text-[10px] ww:sm:text-[11px] ww:text-muted-foreground ww:opacity-70 hover:ww:opacity-100 ww:transition-opacity\"\n\t\t>\n\t\t\t<span>{t.poweredBy.label}</span>\n\t\t\t<img\n\t\t\t\tsrc={LOGO_URL}\n\t\t\t\talt=\"Waniwani\"\n\t\t\t\twidth={72}\n\t\t\t\theight={10}\n\t\t\t\tdata-waniwani-logo=\"\"\n\t\t\t\tclassName=\"ww:h-2.5 ww:w-auto\"\n\t\t\t/>\n\t\t</a>\n\t);\n}\n","\"use client\";\n\nimport type { HTMLAttributes } from \"react\";\nimport { cn } from \"../lib/utils\";\n\nexport interface SuggestionsProps\n\textends Omit<HTMLAttributes<HTMLDivElement>, \"onSelect\"> {\n\tsuggestions: string[];\n\tisLoading?: boolean;\n\tonSelect: (suggestion: string) => void;\n}\n\nexport function Suggestions({\n\tsuggestions,\n\tisLoading,\n\tonSelect,\n\tclassName,\n\t...props\n}: SuggestionsProps) {\n\tif (suggestions.length === 0 && !isLoading) {\n\t\treturn null;\n\t}\n\n\treturn (\n\t\t<div className={cn(\"ww:px-4 ww:py-2\", className)} {...props}>\n\t\t\t<div className=\"ww:mx-auto ww:w-full ww:max-w-3xl ww:flex ww:flex-wrap ww:gap-2\">\n\t\t\t\t{isLoading\n\t\t\t\t\t? [0, 1, 2].map((i) => (\n\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\tkey={i}\n\t\t\t\t\t\t\t\tclassName=\"ww:h-8 ww:rounded-full ww:bg-accent ww:animate-pulse\"\n\t\t\t\t\t\t\t\tstyle={{ width: `${60 + i * 20}px` }}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t))\n\t\t\t\t\t: suggestions.map((suggestion, index) => (\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\tkey={suggestion}\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\tonClick={() => onSelect(suggestion)}\n\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t// `bg-accent`, not `bg-background`: inside the open panel the\n\t\t\t\t\t\t\t\t\t// pills sit on the background color itself, where a\n\t\t\t\t\t\t\t\t\t// background-filled pill with a hairline border is\n\t\t\t\t\t\t\t\t\t// indistinguishable from plain text.\n\t\t\t\t\t\t\t\t\t\"ww:rounded-full ww:border ww:border-border ww:bg-accent ww:px-3.5 ww:py-1.5 ww:text-sm\",\n\t\t\t\t\t\t\t\t\t\"ww:text-foreground ww:hover:bg-border ww:hover:border-primary/30\",\n\t\t\t\t\t\t\t\t\t\"ww:transition-all ww:duration-200 ww:ease-out ww:cursor-pointer\",\n\t\t\t\t\t\t\t\t\t\"ww:animate-[ww-fade-in_0.2s_ease-out_both]\",\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\tstyle={{ animationDelay: `${index * 50}ms` }}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{suggestion}\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t))}\n\t\t\t</div>\n\t\t</div>\n\t);\n}\n","\"use client\";\n\nimport { useEffect, useRef, useState } from \"react\";\nimport { formatRelativeTime, useTranslation } from \"../i18n\";\nimport type { StoredThread } from \"../lib/thread-store\";\n\ninterface ThreadMenuProps {\n\tthreads: StoredThread[];\n\tactiveThreadId?: string;\n\tonNewThread: () => void;\n\tonSelectThread: (threadId: string) => void;\n\tonDeleteThread: (threadId: string) => void;\n}\n\nconst VISIBLE_THREAD_LIMIT = 20;\n\nfunction PlusIcon({ label }: { label: string }) {\n\treturn (\n\t\t<svg\n\t\t\txmlns=\"http://www.w3.org/2000/svg\"\n\t\t\twidth=\"16\"\n\t\t\theight=\"16\"\n\t\t\tviewBox=\"0 0 24 24\"\n\t\t\tfill=\"none\"\n\t\t\tstroke=\"currentColor\"\n\t\t\tstrokeWidth=\"2\"\n\t\t\tstrokeLinecap=\"round\"\n\t\t\tstrokeLinejoin=\"round\"\n\t\t\trole=\"img\"\n\t\t\taria-label={label}\n\t\t>\n\t\t\t<title>{label}</title>\n\t\t\t<line x1=\"12\" y1=\"5\" x2=\"12\" y2=\"19\" />\n\t\t\t<line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\" />\n\t\t</svg>\n\t);\n}\n\nfunction HistoryIcon({ label }: { label: string }) {\n\treturn (\n\t\t<svg\n\t\t\txmlns=\"http://www.w3.org/2000/svg\"\n\t\t\twidth=\"16\"\n\t\t\theight=\"16\"\n\t\t\tviewBox=\"0 0 24 24\"\n\t\t\tfill=\"none\"\n\t\t\tstroke=\"currentColor\"\n\t\t\tstrokeWidth=\"2\"\n\t\t\tstrokeLinecap=\"round\"\n\t\t\tstrokeLinejoin=\"round\"\n\t\t\trole=\"img\"\n\t\t\taria-label={label}\n\t\t>\n\t\t\t<title>{label}</title>\n\t\t\t<path d=\"M3 12a9 9 0 1 0 3-6.7\" />\n\t\t\t<polyline points=\"3 4 3 9 8 9\" />\n\t\t\t<line x1=\"12\" y1=\"7\" x2=\"12\" y2=\"12\" />\n\t\t\t<line x1=\"12\" y1=\"12\" x2=\"15\" y2=\"14\" />\n\t\t</svg>\n\t);\n}\n\nfunction TrashIcon({ label }: { label: string }) {\n\treturn (\n\t\t<svg\n\t\t\txmlns=\"http://www.w3.org/2000/svg\"\n\t\t\twidth=\"14\"\n\t\t\theight=\"14\"\n\t\t\tviewBox=\"0 0 24 24\"\n\t\t\tfill=\"none\"\n\t\t\tstroke=\"currentColor\"\n\t\t\tstrokeWidth=\"2\"\n\t\t\tstrokeLinecap=\"round\"\n\t\t\tstrokeLinejoin=\"round\"\n\t\t\trole=\"img\"\n\t\t\taria-label={label}\n\t\t>\n\t\t\t<title>{label}</title>\n\t\t\t<polyline points=\"3 6 5 6 21 6\" />\n\t\t\t<path d=\"M19 6l-2 14a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2L5 6\" />\n\t\t\t<path d=\"M10 11v6\" />\n\t\t\t<path d=\"M14 11v6\" />\n\t\t</svg>\n\t);\n}\n\nexport function ThreadMenu({\n\tthreads,\n\tactiveThreadId,\n\tonNewThread,\n\tonSelectThread,\n\tonDeleteThread,\n}: ThreadMenuProps) {\n\tconst { locale, t } = useTranslation();\n\tconst [open, setOpen] = useState(false);\n\tconst containerRef = useRef<HTMLDivElement>(null);\n\n\tuseEffect(() => {\n\t\tif (!open) {\n\t\t\treturn;\n\t\t}\n\t\tconst handler = (event: MouseEvent) => {\n\t\t\tconst container = containerRef.current;\n\t\t\tif (!container) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t// In the embed we render inside a shadow root, so events that\n\t\t\t// bubble to `document` are retargeted to the shadow host and\n\t\t\t// `event.target` no longer points at the actual click target.\n\t\t\t// `composedPath()` reports the true path through the shadow\n\t\t\t// tree, which is what we need to distinguish clicks inside\n\t\t\t// the menu from genuine outside-clicks.\n\t\t\tif (event.composedPath().includes(container)) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tsetOpen(false);\n\t\t};\n\t\tdocument.addEventListener(\"mousedown\", handler);\n\t\treturn () => document.removeEventListener(\"mousedown\", handler);\n\t}, [open]);\n\n\tconst visible = threads.slice(0, VISIBLE_THREAD_LIMIT);\n\tconst hidden = Math.max(0, threads.length - VISIBLE_THREAD_LIMIT);\n\n\treturn (\n\t\t<div\n\t\t\tref={containerRef}\n\t\t\tclassName=\"ww:relative ww:flex ww:items-center ww:gap-1\"\n\t\t>\n\t\t\t<button\n\t\t\t\ttype=\"button\"\n\t\t\t\tonClick={onNewThread}\n\t\t\t\ttitle={t.threadMenu.newChat}\n\t\t\t\taria-label={t.threadMenu.newChat}\n\t\t\t\tclassName=\"ww:p-1.5 ww:rounded-md ww:text-muted-foreground hover:ww:text-foreground hover:ww:bg-foreground/5 ww:transition-colors ww:cursor-pointer\"\n\t\t\t>\n\t\t\t\t<PlusIcon label={t.threadMenu.newChat} />\n\t\t\t</button>\n\t\t\t<button\n\t\t\t\ttype=\"button\"\n\t\t\t\tonClick={() => setOpen((v) => !v)}\n\t\t\t\ttitle={t.threadMenu.threadHistory}\n\t\t\t\taria-label={t.threadMenu.threadHistory}\n\t\t\t\taria-expanded={open}\n\t\t\t\tclassName=\"ww:p-1.5 ww:rounded-md ww:text-muted-foreground hover:ww:text-foreground hover:ww:bg-foreground/5 ww:transition-colors ww:cursor-pointer\"\n\t\t\t>\n\t\t\t\t<HistoryIcon label={t.threadMenu.threadHistory} />\n\t\t\t</button>\n\t\t\t{open && (\n\t\t\t\t<div\n\t\t\t\t\trole=\"menu\"\n\t\t\t\t\tclassName=\"ww:absolute ww:right-0 ww:top-full ww:mt-1 ww:w-72 ww:max-h-80 ww:overflow-y-auto ww:rounded-lg ww:border ww:border-border ww:bg-background ww:shadow-lg ww:z-50\"\n\t\t\t\t>\n\t\t\t\t\t{visible.length === 0 && (\n\t\t\t\t\t\t<div className=\"ww:px-3 ww:py-3 ww:text-xs ww:text-muted-foreground\">\n\t\t\t\t\t\t\t{t.threadMenu.noPreviousChats}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\t\t\t\t\t{visible.map((thread) => {\n\t\t\t\t\t\tconst isActive = thread.threadId === activeThreadId;\n\t\t\t\t\t\tconst updatedAtMs = Date.parse(thread.updatedAt);\n\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\tkey={thread.threadId}\n\t\t\t\t\t\t\t\tclassName={`ww:flex ww:items-center ww:gap-2 ww:px-3 ww:py-2 ww:text-xs hover:ww:bg-foreground/5 ${\n\t\t\t\t\t\t\t\t\tisActive ? \"ww:bg-foreground/5\" : \"\"\n\t\t\t\t\t\t\t\t}`}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\t\t\t\tonSelectThread(thread.threadId);\n\t\t\t\t\t\t\t\t\t\tsetOpen(false);\n\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\tclassName=\"ww:flex-1 ww:min-w-0 ww:text-left ww:cursor-pointer\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<div className=\"ww:truncate ww:text-foreground ww:font-medium\">\n\t\t\t\t\t\t\t\t\t\t{thread.title}\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t<div className=\"ww:text-[10px] ww:text-muted-foreground\">\n\t\t\t\t\t\t\t\t\t\t{Number.isNaN(updatedAtMs)\n\t\t\t\t\t\t\t\t\t\t\t? \"\"\n\t\t\t\t\t\t\t\t\t\t\t: formatRelativeTime(updatedAtMs, locale)}\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\tonClick={(e) => {\n\t\t\t\t\t\t\t\t\t\te.stopPropagation();\n\t\t\t\t\t\t\t\t\t\tonDeleteThread(thread.threadId);\n\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\ttitle={t.threadMenu.deleteThread}\n\t\t\t\t\t\t\t\t\taria-label={t.threadMenu.deleteThread}\n\t\t\t\t\t\t\t\t\tclassName=\"ww:p-1 ww:rounded ww:text-muted-foreground hover:ww:text-foreground hover:ww:bg-foreground/10 ww:transition-colors ww:cursor-pointer\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<TrashIcon label={t.threadMenu.deleteThread} />\n\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t);\n\t\t\t\t\t})}\n\t\t\t\t\t{hidden > 0 && (\n\t\t\t\t\t\t<div className=\"ww:px-3 ww:py-2 ww:text-[10px] ww:text-muted-foreground ww:border-t ww:border-border\">\n\t\t\t\t\t\t\t{t.threadMenu.hiddenThreads(hidden)}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n","\"use client\";\n\nimport { useCallback, useRef } from \"react\";\nimport type { CallToolHandler } from \"../@types\";\n\ntype CallToolParams = Parameters<CallToolHandler>[0];\ntype CallToolResult = Awaited<ReturnType<CallToolHandler>>;\n\n/**\n * Returns a stable `onCallTool` callback.\n * Uses the user-provided handler if available, otherwise POSTs to `${api}/tool`.\n */\nexport function useCallTool(props: {\n\tapi?: string;\n\theaders?: Record<string, string>;\n\tonCallTool?: CallToolHandler;\n\tsessionId?: string;\n}): CallToolHandler {\n\tconst propsRef = useRef(props);\n\tpropsRef.current = props;\n\n\treturn useCallback(\n\t\tasync (params: CallToolParams): Promise<CallToolResult> => {\n\t\t\tconst { api, headers, onCallTool, sessionId } = propsRef.current;\n\n\t\t\tif (onCallTool) {\n\t\t\t\treturn onCallTool(params);\n\t\t\t}\n\n\t\t\tconst endpoint = `${api ?? \"/api/waniwani\"}/tool`;\n\t\t\tconst normalizedSessionId =\n\t\t\t\ttypeof sessionId === \"string\" && sessionId.trim().length > 0\n\t\t\t\t\t? sessionId.trim()\n\t\t\t\t\t: undefined;\n\t\t\tconst res = await fetch(endpoint, {\n\t\t\t\tmethod: \"POST\",\n\t\t\t\theaders: {\n\t\t\t\t\t\"Content-Type\": \"application/json\",\n\t\t\t\t\t...(normalizedSessionId\n\t\t\t\t\t\t? { \"X-Session-Id\": normalizedSessionId }\n\t\t\t\t\t\t: {}),\n\t\t\t\t\t...headers,\n\t\t\t\t},\n\t\t\t\tbody: JSON.stringify(params),\n\t\t\t});\n\n\t\t\tif (!res.ok) {\n\t\t\t\tthrow new Error(`Tool call failed: ${res.status} ${res.statusText}`);\n\t\t\t}\n\n\t\t\treturn res.json();\n\t\t},\n\t\t[],\n\t);\n}\n","\"use client\";\n\nimport { useChat } from \"@ai-sdk/react\";\nimport type { FileUIPart, UIMessage } from \"ai\";\nimport { nanoid } from \"nanoid\";\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport type { ModelContextUpdate } from \"../../../shared/model-context\";\nimport { hasModelContext } from \"../../../shared/model-context\";\nimport type { ChatBaseProps } from \"../@types\";\nimport type { PromptInputMessage } from \"../ai-elements/prompt-input\";\nimport { useWidgetEvents } from \"../embed/widget-events-context\";\nimport { buildApiUrl } from \"../lib/api-url\";\nimport { LenientChatTransport } from \"../lib/lenient-chat-transport\";\nimport {\n\tdeleteThread as deleteThreadFromStore,\n\tderiveThreadTitle,\n\tgetActiveThreadId,\n\tlistThreads,\n\tloadThread,\n\ttype StoredThread,\n\tupsertThread,\n} from \"../lib/thread-store\";\nimport type { VisitorContext } from \"../lib/visitor-context\";\nimport {\n\tapplyVisitorId,\n\tcollectVisitorContext,\n\tgetOrCreateVisitorId,\n} from \"../lib/visitor-context\";\n\nconst SESSION_HEADER_NAME = \"x-session-id\";\nconst THREAD_PERSIST_DEBOUNCE_MS = 250;\nconst ERROR_MESSAGE_MAX_LENGTH = 200;\n\nfunction generateThreadId(): string {\n\tif (\n\t\ttypeof crypto !== \"undefined\" &&\n\t\ttypeof crypto.randomUUID === \"function\"\n\t) {\n\t\treturn crypto.randomUUID();\n\t}\n\treturn nanoid();\n}\n\nfunction nowIso(): string {\n\treturn new Date().toISOString();\n}\n\nfunction normalizeSessionId(value: unknown): string | undefined {\n\tif (typeof value !== \"string\") {\n\t\treturn undefined;\n\t}\n\tconst trimmed = value.trim();\n\treturn trimmed.length > 0 ? trimmed : undefined;\n}\n\nexport interface QueuedMessage {\n\tid: string;\n\ttext: string;\n\tfiles: FileUIPart[];\n\tmodelContext?: ModelContextUpdate;\n}\n\n/**\n * Per-tool definition metadata, keyed by tool name. The chat UI caches the\n * MCP `tools/list` response here so widget resolution\n * (`_meta.ui.resourceUri`, `_meta[\"openai/outputTemplate\"]`, etc.) can\n * happen by tool name, per MCP Apps spec. This is the browser-side\n * equivalent of what a stateful MCP host (e.g. Claude Desktop, MCP Jam)\n * caches for the lifetime of its MCP session.\n */\nexport type ToolDefinitionsMap = Record<\n\tstring,\n\t{\n\t\tname: string;\n\t\ttitle?: string;\n\t\tdescription?: string;\n\t\t_meta?: Record<string, unknown>;\n\t}\n>;\n\ninterface ToolsListResponse {\n\ttools: Array<{\n\t\tname: string;\n\t\ttitle?: string;\n\t\tdescription?: string;\n\t\t_meta?: Record<string, unknown>;\n\t}>;\n}\n\nasync function fetchToolDefinitions(\n\tapi: string,\n\theaders?: Record<string, string>,\n): Promise<ToolDefinitionsMap> {\n\tconst url = buildApiUrl(api, \"/tools\");\n\tconst response = await fetch(url, {\n\t\tmethod: \"GET\",\n\t\theaders: headers ? { ...headers } : undefined,\n\t});\n\tif (!response.ok) {\n\t\tthrow new Error(\n\t\t\t`[Waniwani] Failed to fetch /tools: ${response.status} ${response.statusText}`,\n\t\t);\n\t}\n\tconst data = (await response.json()) as ToolsListResponse;\n\tif (!data || !Array.isArray(data.tools)) {\n\t\treturn {};\n\t}\n\tconst map: ToolDefinitionsMap = {};\n\tfor (const tool of data.tools) {\n\t\tif (tool && typeof tool.name === \"string\") {\n\t\t\tmap[tool.name] = tool;\n\t\t}\n\t}\n\treturn map;\n}\n\ntype ChatEngineMessage = PromptInputMessage & {\n\tmodelContext?: ModelContextUpdate;\n};\n\nexport function useChatEngine(props: ChatBaseProps) {\n\tconst {\n\t\tapi = \"/api/waniwani\",\n\t\theaders: userHeaders,\n\t\tbody,\n\t\tonMessageSent,\n\t\tonResponseReceived,\n\t\tenableThreadHistory = false,\n\t\tactiveThreadId: controlledThreadId,\n\t\tonThreadChange,\n\t} = props;\n\n\t// Seed a host-supplied visitor id (e.g. the PostHog / Amplitude distinct id)\n\t// so every request correlates to the id the host site already tracks. Read\n\t// live per request downstream, so a changed value takes effect on the next\n\t// send. Accepts a literal or a sync/async resolver; a blank/failed result is\n\t// ignored, keeping the auto id. The returned cancel drops a late async result\n\t// after unmount or a value change. Pass a stable reference (e.g. `useCallback`)\n\t// for an expensive async resolver so it isn't re-invoked on every render.\n\tconst propVisitorId = props.visitorId;\n\tuseEffect(() => applyVisitorId(propVisitorId), [propVisitorId]);\n\n\t// The transport is constructed once at first render and captures that\n\t// render's callbacks, so the provider must supply a per-mount-stable emitter.\n\tconst widgetEvents = useWidgetEvents();\n\n\tconst headersRef = useRef(userHeaders);\n\tconst bodyRef = useRef(body);\n\tconst enableThreadHistoryRef = useRef(enableThreadHistory);\n\tuseEffect(() => {\n\t\tenableThreadHistoryRef.current = enableThreadHistory;\n\t}, [enableThreadHistory]);\n\tconst pendingModelContextRef = useRef<ModelContextUpdate | undefined>(\n\t\tundefined,\n\t);\n\tconst visitorContextRef = useRef<VisitorContext | null>(null);\n\tconst [sessionId, setSessionIdState] = useState<string | undefined>(\n\t\tundefined,\n\t);\n\tconst sessionIdRef = useRef<string | undefined>(sessionId);\n\n\tconst [activeThreadId, setActiveThreadIdState] = useState<string | undefined>(\n\t\tcontrolledThreadId,\n\t);\n\tconst activeThreadIdRef = useRef<string | undefined>(activeThreadId);\n\tconst [threads, setThreads] = useState<StoredThread[]>([]);\n\tconst [isThreadHistoryReady, setIsThreadHistoryReady] = useState(\n\t\t!enableThreadHistory,\n\t);\n\tconst threadCreatedAtRef = useRef<string | undefined>(undefined);\n\tconst threadTitleRef = useRef<string | undefined>(undefined);\n\tconst persistTimerRef = useRef<ReturnType<typeof setTimeout> | undefined>(\n\t\tundefined,\n\t);\n\t// In-flight `upsertThread` promise. Tracked so callers (delete, flush)\n\t// can await an already-fired persist and avoid resurrect-after-delete\n\t// races, which `clearTimeout` alone cannot.\n\tconst persistInflightRef = useRef<Promise<void> | undefined>(undefined);\n\t// Monotonic epoch invalidator for `switchThread`. Any concurrent\n\t// `startNewThread` / `switchThread` / `deleteThread` (on the active\n\t// thread) bumps this so a slower in-flight `loadThread` can't clobber\n\t// a newer thread's state when it eventually resolves.\n\tconst switchEpochRef = useRef(0);\n\tconst onThreadChangeRef = useRef(onThreadChange);\n\tuseEffect(() => {\n\t\tonThreadChangeRef.current = onThreadChange;\n\t}, [onThreadChange]);\n\n\tconst setActiveThreadId = useCallback(\n\t\t(next: string | undefined) => {\n\t\t\tactiveThreadIdRef.current = next;\n\t\t\tsetActiveThreadIdState(next);\n\t\t\tif (next) {\n\t\t\t\tonThreadChangeRef.current?.(next);\n\t\t\t\twidgetEvents.emit({\n\t\t\t\t\tname: \"thread.changed\",\n\t\t\t\t\t// Explicit: the ref is mutated synchronously, while the live\n\t\t\t\t\t// getter reads React state and would report the outgoing\n\t\t\t\t\t// session after a same-tick restore (switchThread) or clear\n\t\t\t\t\t// (startNewThread).\n\t\t\t\t\tsessionId: sessionIdRef.current,\n\t\t\t\t\tproperties: { threadId: next },\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\t\t[widgetEvents],\n\t);\n\n\tconst refreshThreads = useCallback(async () => {\n\t\tif (!enableThreadHistory) {\n\t\t\treturn;\n\t\t}\n\t\tconst memoryUserId = visitorContextRef.current?.memoryUserId;\n\t\tif (!memoryUserId) {\n\t\t\treturn;\n\t\t}\n\t\tconst list = await listThreads(memoryUserId);\n\t\tsetThreads(list);\n\t}, [enableThreadHistory]);\n\n\tconst getSessionId = useCallback((): string | undefined => {\n\t\treturn sessionIdRef.current;\n\t}, []);\n\n\tconst setSessionId = useCallback(\n\t\t(value: unknown) => {\n\t\t\tconst sessionId = normalizeSessionId(value);\n\t\t\tif (!sessionId) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (sessionIdRef.current === sessionId) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst isFirstAssignment = sessionIdRef.current === undefined;\n\t\t\tsessionIdRef.current = sessionId;\n\t\t\tsetSessionIdState(sessionId);\n\t\t\tif (isFirstAssignment) {\n\t\t\t\twidgetEvents.emit({\n\t\t\t\t\tname: \"session.started\",\n\t\t\t\t\tproperties: { sessionId },\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\t\t[widgetEvents],\n\t);\n\n\tconst clearSessionId = useCallback(() => {\n\t\tsessionIdRef.current = undefined;\n\t\tsetSessionIdState(undefined);\n\t}, []);\n\n\tuseEffect(() => {\n\t\theadersRef.current = userHeaders;\n\t}, [userHeaders]);\n\n\tuseEffect(() => {\n\t\tbodyRef.current = body;\n\t}, [body]);\n\n\t// biome-ignore lint/correctness/useExhaustiveDependencies: load once on mount\n\tuseEffect(() => {\n\t\tlet cancelled = false;\n\t\t// Snapshot epoch at mount. Any user action (startNewThread,\n\t\t// switchThread, deleteThread on active) bumps it; we then skip\n\t\t// applying the stale mount-load result.\n\t\tconst mountEpoch = switchEpochRef.current;\n\t\t(async () => {\n\t\t\ttry {\n\t\t\t\tconst ctx = await collectVisitorContext();\n\t\t\t\tif (cancelled) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tvisitorContextRef.current = ctx;\n\t\t\t} catch {\n\t\t\t\t// Best-effort — silently ignore failures\n\t\t\t}\n\n\t\t\tif (!enableThreadHistory) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst memoryUserId = visitorContextRef.current?.memoryUserId;\n\t\t\tif (!memoryUserId) {\n\t\t\t\tsetIsThreadHistoryReady(true);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tconst targetId =\n\t\t\t\t\tcontrolledThreadId ?? (await getActiveThreadId(memoryUserId));\n\t\t\t\tif (cancelled || mountEpoch !== switchEpochRef.current) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (targetId) {\n\t\t\t\t\tconst stored = await loadThread(targetId);\n\t\t\t\t\tif (cancelled || mountEpoch !== switchEpochRef.current) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tif (stored && stored.memoryUserId === memoryUserId) {\n\t\t\t\t\t\tactiveThreadIdRef.current = stored.threadId;\n\t\t\t\t\t\tsetActiveThreadIdState(stored.threadId);\n\t\t\t\t\t\tthreadCreatedAtRef.current = stored.createdAt;\n\t\t\t\t\t\tthreadTitleRef.current = stored.title;\n\t\t\t\t\t\tif (stored.sessionId) {\n\t\t\t\t\t\t\tsessionIdRef.current = stored.sessionId;\n\t\t\t\t\t\t\tsetSessionIdState(stored.sessionId);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tsetMessages(stored.messages);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tawait refreshThreads();\n\t\t\t} finally {\n\t\t\t\tif (!cancelled) {\n\t\t\t\t\tsetIsThreadHistoryReady(true);\n\t\t\t\t}\n\t\t\t}\n\t\t})();\n\t\treturn () => {\n\t\t\tcancelled = true;\n\t\t};\n\t}, []);\n\n\tconst transportRef = useRef(\n\t\tnew LenientChatTransport({\n\t\t\tapi,\n\t\t\theaders: () => ({\n\t\t\t\t...headersRef.current,\n\t\t\t}),\n\t\t\tbody: () => {\n\t\t\t\tconst resolvedBody = {\n\t\t\t\t\t...(bodyRef.current ?? {}),\n\t\t\t\t};\n\n\t\t\t\tconst hasExplicitSessionId = Object.hasOwn(resolvedBody, \"sessionId\");\n\t\t\t\tconst bodySessionId = normalizeSessionId(resolvedBody.sessionId);\n\t\t\t\tif (bodySessionId) {\n\t\t\t\t\tsetSessionId(bodySessionId);\n\t\t\t\t\tresolvedBody.sessionId = bodySessionId;\n\t\t\t\t} else if (hasExplicitSessionId) {\n\t\t\t\t\tclearSessionId();\n\t\t\t\t\tdelete resolvedBody.sessionId;\n\t\t\t\t} else {\n\t\t\t\t\tconst storedSessionId = getSessionId();\n\t\t\t\t\tif (storedSessionId) {\n\t\t\t\t\t\tresolvedBody.sessionId = storedSessionId;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (hasModelContext(pendingModelContextRef.current)) {\n\t\t\t\t\tresolvedBody.modelContext = pendingModelContextRef.current;\n\t\t\t\t}\n\n\t\t\t\t// Resolve the visitor id synchronously so it is present on the very\n\t\t\t\t// first request, before the async `collectVisitorContext()` in the\n\t\t\t\t// mount effect has resolved. The full context (device/client fields)\n\t\t\t\t// enriches the body once available, but never gates the id. Read it\n\t\t\t\t// live (not the cached `vc.visitorId`) so a host-supplied override\n\t\t\t\t// via `setVisitorId()` takes effect on the next request.\n\t\t\t\tconst vc = visitorContextRef.current;\n\t\t\t\tconst visitorId = getOrCreateVisitorId();\n\t\t\t\tif (vc) {\n\t\t\t\t\tresolvedBody.visitorContext = {\n\t\t\t\t\t\ttimezone: vc.timezone,\n\t\t\t\t\t\tlanguage: vc.language,\n\t\t\t\t\t\tlanguages: vc.languages,\n\t\t\t\t\t\tdeviceType: vc.deviceType,\n\t\t\t\t\t\treferrer: vc.referrer,\n\t\t\t\t\t\tvisitorId,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\tconst existingVisitor =\n\t\t\t\t\ttypeof resolvedBody.visitor === \"object\" &&\n\t\t\t\t\tresolvedBody.visitor !== null\n\t\t\t\t\t\t? (resolvedBody.visitor as Record<string, unknown>)\n\t\t\t\t\t\t: {};\n\t\t\t\tconst existingClient =\n\t\t\t\t\ttypeof existingVisitor.client === \"object\" &&\n\t\t\t\t\texistingVisitor.client !== null\n\t\t\t\t\t\t? (existingVisitor.client as Record<string, unknown>)\n\t\t\t\t\t\t: {};\n\t\t\t\tresolvedBody.visitor = {\n\t\t\t\t\t...existingVisitor,\n\t\t\t\t\t// Anonymous visitor id — the server stamps it onto chat events'\n\t\t\t\t\t// `visitor_id` so visits link a `page.viewed` to its conversation.\n\t\t\t\t\tid: visitorId,\n\t\t\t\t\tclient: {\n\t\t\t\t\t\t...existingClient,\n\t\t\t\t\t\t...(vc && { memoryUserId: vc.memoryUserId }),\n\t\t\t\t\t},\n\t\t\t\t};\n\n\t\t\t\t// Auto-inject SDK-managed identifiers into `extra` so the upstream\n\t\t\t\t// API forwards them to MCP `_meta[\"waniwani/extra\"]`.\n\t\t\t\t// Caller-supplied `body.extra` keys win on collision.\n\t\t\t\tconst callerExtra =\n\t\t\t\t\ttypeof resolvedBody.extra === \"object\" &&\n\t\t\t\t\tresolvedBody.extra !== null &&\n\t\t\t\t\t!Array.isArray(resolvedBody.extra)\n\t\t\t\t\t\t? (resolvedBody.extra as Record<string, unknown>)\n\t\t\t\t\t\t: undefined;\n\t\t\t\tconst memoryUserId = visitorContextRef.current?.memoryUserId;\n\t\t\t\tconst locale = visitorContextRef.current?.language;\n\t\t\t\tconst autoExtra: Record<string, unknown> = {};\n\t\t\t\tif (memoryUserId) {\n\t\t\t\t\tautoExtra.memoryUserId = memoryUserId;\n\t\t\t\t}\n\t\t\t\tif (locale) {\n\t\t\t\t\tautoExtra.locale = locale;\n\t\t\t\t}\n\t\t\t\tif (Object.keys(autoExtra).length > 0 || callerExtra) {\n\t\t\t\t\tresolvedBody.extra = {\n\t\t\t\t\t\t...autoExtra,\n\t\t\t\t\t\t...(callerExtra ?? {}),\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\tif (enableThreadHistoryRef.current) {\n\t\t\t\t\tconst hasExplicitThreadId = Object.hasOwn(resolvedBody, \"threadId\");\n\t\t\t\t\tif (!hasExplicitThreadId) {\n\t\t\t\t\t\tlet tid = activeThreadIdRef.current;\n\t\t\t\t\t\tif (!tid) {\n\t\t\t\t\t\t\ttid = generateThreadId();\n\t\t\t\t\t\t\tthreadCreatedAtRef.current = nowIso();\n\t\t\t\t\t\t\tthreadTitleRef.current = undefined;\n\t\t\t\t\t\t\tsetActiveThreadId(tid);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tresolvedBody.threadId = tid;\n\t\t\t\t\t} else if (typeof resolvedBody.threadId === \"string\") {\n\t\t\t\t\t\tactiveThreadIdRef.current = resolvedBody.threadId;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn resolvedBody;\n\t\t\t},\n\t\t\tfetch: (async (input, init) => {\n\t\t\t\tconst response = await fetch(input, init);\n\t\t\t\tpendingModelContextRef.current = undefined;\n\t\t\t\tsetSessionId(response.headers.get(SESSION_HEADER_NAME));\n\t\t\t\treturn response;\n\t\t\t}) as typeof fetch,\n\t\t}),\n\t);\n\n\tconst pendingWaitRef = useRef<{\n\t\tresolve: (msg: unknown) => void;\n\t\treject: (err: Error) => void;\n\t} | null>(null);\n\tconst finishedMessageRef = useRef<unknown>(null);\n\n\t// Tool catalog cached for the lifetime of this ChatCard mount. Fetched\n\t// once on mount via GET /api/waniwani/tools (spec: the host calls\n\t// tools/list once per session and caches the result). A mutation counter\n\t// drives re-renders when the catalog refreshes without making the whole\n\t// ref reactive.\n\tconst toolDefinitionsRef = useRef<ToolDefinitionsMap>({});\n\tconst [toolDefinitionsRevision, setToolDefinitionsRevision] = useState(0);\n\n\tconst skipRemoteConfig = props.skipRemoteConfig === true;\n\n\tconst refreshToolDefinitions = useCallback(async () => {\n\t\tif (skipRemoteConfig) {\n\t\t\treturn;\n\t\t}\n\t\ttry {\n\t\t\tconst map = await fetchToolDefinitions(api, headersRef.current);\n\t\t\ttoolDefinitionsRef.current = map;\n\t\t\tsetToolDefinitionsRevision((r) => r + 1);\n\t\t} catch (error) {\n\t\t\tconsole.warn(\n\t\t\t\t\"[Waniwani] Failed to fetch tool definitions:\",\n\t\t\t\terror instanceof Error ? error.message : error,\n\t\t\t);\n\t\t}\n\t}, [api, skipRemoteConfig]);\n\n\tuseEffect(() => {\n\t\tvoid refreshToolDefinitions();\n\t}, [refreshToolDefinitions]);\n\n\tconst { messages, sendMessage, setMessages, status } = useChat({\n\t\tmessages: props.initialMessages,\n\t\ttransport: transportRef.current,\n\t\tonFinish({ message, isAbort, isDisconnect, isError }) {\n\t\t\t// `onFinish` also runs for aborted/disconnected/errored requests.\n\t\t\t// `onResponseReceived` fires for all of them; the widget event is\n\t\t\t// emitted only for a successful assistant reply.\n\t\t\tonResponseReceived?.();\n\t\t\tif (!isAbort && !isDisconnect && !isError) {\n\t\t\t\twidgetEvents.emit({ name: \"message.received\" });\n\t\t\t}\n\t\t\tif (pendingWaitRef.current) {\n\t\t\t\t// Stash the message — resolve only after React commits the\n\t\t\t\t// messages state update (see useEffect on `status` below).\n\t\t\t\tfinishedMessageRef.current = message;\n\t\t\t}\n\t\t},\n\t\tonError(error) {\n\t\t\tconsole.warn(\"[Waniwani] Chat error:\", error.message);\n\t\t\twidgetEvents.emit({\n\t\t\t\tname: \"chat.error\",\n\t\t\t\tproperties: {\n\t\t\t\t\tmessage: error.message.slice(0, ERROR_MESSAGE_MAX_LENGTH),\n\t\t\t\t},\n\t\t\t});\n\t\t\tif (pendingWaitRef.current) {\n\t\t\t\tpendingWaitRef.current.reject(error);\n\t\t\t\tpendingWaitRef.current = null;\n\t\t\t}\n\t\t},\n\t});\n\n\tconst messagesRef = useRef<UIMessage[]>(messages);\n\tuseEffect(() => {\n\t\tmessagesRef.current = messages;\n\t}, [messages]);\n\n\t// Hydrate persisted history when it's enabled *after* mount — commonly via\n\t// the remote embed config (the dashboard toggle, not a data-attr/prop). The\n\t// mount effect above ran while history was off and skipped loading, and\n\t// never re-runs, so a returning visitor's thread would otherwise never\n\t// appear. Handle the off→on transition here.\n\t//\n\t// Only hydrate into an empty chat: never clobber a conversation the visitor\n\t// started while history was off (those messages live in this same engine).\n\t// Mirrors the mount effect's load (epoch- and cancel-guarded). Runs once —\n\t// the ref starts `true` when history was already on at mount (handled there).\n\tconst lateHydratedHistoryRef = useRef(enableThreadHistory);\n\t// biome-ignore lint/correctness/useExhaustiveDependencies: react to the enableThreadHistory transition only\n\tuseEffect(() => {\n\t\tif (!enableThreadHistory || lateHydratedHistoryRef.current) {\n\t\t\treturn;\n\t\t}\n\t\tlateHydratedHistoryRef.current = true;\n\t\tif (messagesRef.current.length > 0) {\n\t\t\treturn;\n\t\t}\n\t\tlet cancelled = false;\n\t\tconst epoch = switchEpochRef.current;\n\t\tsetIsThreadHistoryReady(false);\n\t\t(async () => {\n\t\t\ttry {\n\t\t\t\tlet ctx = visitorContextRef.current;\n\t\t\t\tif (!ctx) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tctx = await collectVisitorContext();\n\t\t\t\t\t\tvisitorContextRef.current = ctx;\n\t\t\t\t\t} catch {\n\t\t\t\t\t\t// Best-effort — silently ignore failures\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tconst memoryUserId = ctx?.memoryUserId;\n\t\t\t\tif (!memoryUserId || cancelled || epoch !== switchEpochRef.current) {\n\t\t\t\t\tif (!cancelled) {\n\t\t\t\t\t\tsetIsThreadHistoryReady(true);\n\t\t\t\t\t}\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tconst targetId =\n\t\t\t\t\tcontrolledThreadId ?? (await getActiveThreadId(memoryUserId));\n\t\t\t\tif (cancelled || epoch !== switchEpochRef.current) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (targetId) {\n\t\t\t\t\tconst stored = await loadThread(targetId);\n\t\t\t\t\tif (cancelled || epoch !== switchEpochRef.current) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tif (stored && stored.memoryUserId === memoryUserId) {\n\t\t\t\t\t\tactiveThreadIdRef.current = stored.threadId;\n\t\t\t\t\t\tsetActiveThreadIdState(stored.threadId);\n\t\t\t\t\t\tthreadCreatedAtRef.current = stored.createdAt;\n\t\t\t\t\t\tthreadTitleRef.current = stored.title;\n\t\t\t\t\t\tif (stored.sessionId) {\n\t\t\t\t\t\t\tsessionIdRef.current = stored.sessionId;\n\t\t\t\t\t\t\tsetSessionIdState(stored.sessionId);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tsetMessages(stored.messages);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tawait refreshThreads();\n\t\t\t} finally {\n\t\t\t\tif (!cancelled) {\n\t\t\t\t\tsetIsThreadHistoryReady(true);\n\t\t\t\t}\n\t\t\t}\n\t\t})();\n\t\treturn () => {\n\t\t\tcancelled = true;\n\t\t};\n\t}, [enableThreadHistory]);\n\n\t// Resolve sendMessageAndWait only after React has committed the messages\n\t// state update. `onFinish` fires before the re-render, so resolving there\n\t// would expose stale `messages` to the caller.\n\tuseEffect(() => {\n\t\tif (\n\t\t\tstatus === \"ready\" &&\n\t\t\tpendingWaitRef.current &&\n\t\t\tfinishedMessageRef.current\n\t\t) {\n\t\t\tconst pending = pendingWaitRef.current;\n\t\t\tconst message = finishedMessageRef.current;\n\t\t\tpendingWaitRef.current = null;\n\t\t\tfinishedMessageRef.current = null;\n\t\t\tpending.resolve(message);\n\t\t}\n\t}, [status]);\n\n\tconst [text, setText] = useState(\"\");\n\tconst [queuedMessages, setQueuedMessages] = useState<QueuedMessage[]>([]);\n\n\tconst isLoading = status === \"submitted\" || status === \"streaming\";\n\n\tconst removeQueuedMessage = useCallback((id: string) => {\n\t\tsetQueuedMessages((prev) => prev.filter((m) => m.id !== id));\n\t}, []);\n\n\tconst queueFull = isLoading && queuedMessages.length > 0;\n\n\tconst handleSubmit = useCallback(\n\t\t(message: ChatEngineMessage) => {\n\t\t\tconst hasText = Boolean(message.text?.trim());\n\t\t\tconst hasFiles = Boolean(message.files?.length);\n\t\t\tif (!(hasText || hasFiles)) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (isLoading) {\n\t\t\t\t// Only allow one queued message at a time\n\t\t\t\tif (queuedMessages.length > 0) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tsetQueuedMessages((prev) => [\n\t\t\t\t\t...prev,\n\t\t\t\t\t{\n\t\t\t\t\t\tid: nanoid(),\n\t\t\t\t\t\ttext: message.text || \"\",\n\t\t\t\t\t\tfiles: message.files ?? [],\n\t\t\t\t\t\tmodelContext: message.modelContext,\n\t\t\t\t\t},\n\t\t\t\t]);\n\t\t\t\tsetText(\"\");\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tpendingModelContextRef.current = message.modelContext;\n\t\t\tsendMessage({\n\t\t\t\ttext: message.text || \"\",\n\t\t\t\tfiles: message.files,\n\t\t\t});\n\n\t\t\tonMessageSent?.(message.text || \"\");\n\t\t\twidgetEvents.emit({ name: \"message.sent\" });\n\t\t\tsetText(\"\");\n\t\t},\n\t\t[\n\t\t\tsendMessage,\n\t\t\tonMessageSent,\n\t\t\tisLoading,\n\t\t\tqueuedMessages.length,\n\t\t\twidgetEvents,\n\t\t],\n\t);\n\n\tconst sendMessageAndWait = useCallback(\n\t\t(text: string): Promise<unknown> => {\n\t\t\treturn new Promise((resolve, reject) => {\n\t\t\t\tpendingWaitRef.current = { resolve, reject };\n\t\t\t\tsendMessage({ text });\n\t\t\t\tonMessageSent?.(text);\n\t\t\t\twidgetEvents.emit({ name: \"message.sent\" });\n\t\t\t});\n\t\t},\n\t\t[sendMessage, onMessageSent, widgetEvents],\n\t);\n\n\t// Flush first queued message once the current response finishes\n\tuseEffect(() => {\n\t\tif (status !== \"ready\") {\n\t\t\treturn;\n\t\t}\n\t\tif (queuedMessages.length === 0) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst [first, ...rest] = queuedMessages;\n\t\tsetQueuedMessages(rest);\n\n\t\tpendingModelContextRef.current = first.modelContext;\n\t\tsendMessage({\n\t\t\ttext: first.text,\n\t\t\tfiles: first.files.length > 0 ? first.files : undefined,\n\t\t});\n\t\tonMessageSent?.(first.text);\n\t\twidgetEvents.emit({ name: \"message.sent\" });\n\t}, [status, sendMessage, onMessageSent, queuedMessages, widgetEvents]);\n\n\tconst reset = useCallback(() => {\n\t\tsetMessages([]);\n\t\tsetQueuedMessages([]);\n\t\tclearSessionId();\n\t\tsetText(\"\");\n\t\ttoolDefinitionsRef.current = {};\n\t\tsetToolDefinitionsRevision((r) => r + 1);\n\t\tvoid refreshToolDefinitions();\n\t}, [setMessages, clearSessionId, refreshToolDefinitions]);\n\n\t// Build a `StoredThread` from current refs synchronously. Callers that\n\t// need to flush before mutating thread state (startNewThread,\n\t// switchThread, deleteThread) must snapshot here *before* any `await`\n\t// or ref mutation, so the write describes the outgoing thread, not a\n\t// half-mutated mix of old + new.\n\tconst buildPersistSnapshot = useCallback((): StoredThread | undefined => {\n\t\tif (!enableThreadHistoryRef.current) {\n\t\t\treturn undefined;\n\t\t}\n\t\tconst memoryUserId = visitorContextRef.current?.memoryUserId;\n\t\tconst threadId = activeThreadIdRef.current;\n\t\tconst msgs = messagesRef.current;\n\t\tif (!memoryUserId || !threadId || msgs.length === 0) {\n\t\t\treturn undefined;\n\t\t}\n\t\tif (!threadCreatedAtRef.current) {\n\t\t\tthreadCreatedAtRef.current = nowIso();\n\t\t}\n\t\tif (!threadTitleRef.current) {\n\t\t\tconst firstUser = msgs.find((m) => m.role === \"user\");\n\t\t\tconst firstUserText = firstUser\n\t\t\t\t? firstUser.parts\n\t\t\t\t\t\t.map((p) =>\n\t\t\t\t\t\t\t\"text\" in p && typeof p.text === \"string\" ? p.text : \"\",\n\t\t\t\t\t\t)\n\t\t\t\t\t\t.join(\" \")\n\t\t\t\t: \"\";\n\t\t\tthreadTitleRef.current = deriveThreadTitle(firstUserText);\n\t\t}\n\t\treturn {\n\t\t\tthreadId,\n\t\t\tmemoryUserId,\n\t\t\ttitle: threadTitleRef.current,\n\t\t\tmessages: msgs,\n\t\t\tsessionId: sessionIdRef.current,\n\t\t\tcreatedAt: threadCreatedAtRef.current,\n\t\t\tupdatedAt: nowIso(),\n\t\t};\n\t}, []);\n\n\tconst persistActiveThread = useCallback(async () => {\n\t\tconst snap = buildPersistSnapshot();\n\t\tif (!snap) {\n\t\t\treturn;\n\t\t}\n\t\tawait upsertThread(snap);\n\t\tawait refreshThreads();\n\t}, [buildPersistSnapshot, refreshThreads]);\n\n\tuseEffect(() => {\n\t\tif (!enableThreadHistory) {\n\t\t\treturn;\n\t\t}\n\t\tif (!isThreadHistoryReady) {\n\t\t\treturn;\n\t\t}\n\t\tif (status === \"submitted\" || status === \"streaming\") {\n\t\t\treturn;\n\t\t}\n\t\tif (messages.length === 0) {\n\t\t\treturn;\n\t\t}\n\t\tif (persistTimerRef.current) {\n\t\t\tclearTimeout(persistTimerRef.current);\n\t\t}\n\t\tpersistTimerRef.current = setTimeout(() => {\n\t\t\tpersistTimerRef.current = undefined;\n\t\t\tconst p = persistActiveThread().finally(() => {\n\t\t\t\tif (persistInflightRef.current === p) {\n\t\t\t\t\tpersistInflightRef.current = undefined;\n\t\t\t\t}\n\t\t\t});\n\t\t\tpersistInflightRef.current = p;\n\t\t}, THREAD_PERSIST_DEBOUNCE_MS);\n\t\treturn () => {\n\t\t\tif (persistTimerRef.current) {\n\t\t\t\tclearTimeout(persistTimerRef.current);\n\t\t\t}\n\t\t};\n\t}, [\n\t\tenableThreadHistory,\n\t\tisThreadHistoryReady,\n\t\tmessages,\n\t\tstatus,\n\t\tpersistActiveThread,\n\t]);\n\n\t// Flush in-flight + pending persist. The snapshot is captured *now*\n\t// (synchronously) so callers can mutate thread refs immediately after\n\t// invoking this without tainting the outgoing write — even when an\n\t// in-flight persist forces the async tail to yield first.\n\tconst flushPendingPersist = useCallback((): Promise<void> => {\n\t\tconst inflight = persistInflightRef.current;\n\t\tconst timer = persistTimerRef.current;\n\t\tconst snap = timer ? buildPersistSnapshot() : undefined;\n\t\tif (timer) {\n\t\t\tclearTimeout(timer);\n\t\t\tpersistTimerRef.current = undefined;\n\t\t}\n\t\treturn (async () => {\n\t\t\tif (inflight) {\n\t\t\t\tawait inflight;\n\t\t\t}\n\t\t\tif (snap) {\n\t\t\t\tawait upsertThread(snap);\n\t\t\t\tawait refreshThreads();\n\t\t\t}\n\t\t})();\n\t}, [buildPersistSnapshot, refreshThreads]);\n\n\tconst startNewThread = useCallback(() => {\n\t\t// Bump epoch first so any in-flight `switchThread` load knows it's\n\t\t// been invalidated and skips its setters when it eventually resolves.\n\t\tswitchEpochRef.current += 1;\n\t\t// Fire-and-forget: `flushPendingPersist` snapshots synchronously\n\t\t// before any await, so subsequent ref mutations below don't taint\n\t\t// the outgoing write.\n\t\tvoid flushPendingPersist();\n\t\tsetMessages([]);\n\t\tsetQueuedMessages([]);\n\t\tclearSessionId();\n\t\tsetText(\"\");\n\t\tconst nextId = generateThreadId();\n\t\tthreadCreatedAtRef.current = nowIso();\n\t\tthreadTitleRef.current = undefined;\n\t\tsetActiveThreadId(nextId);\n\t\tvoid refreshThreads();\n\t\treturn nextId;\n\t}, [\n\t\tsetMessages,\n\t\tclearSessionId,\n\t\tsetActiveThreadId,\n\t\trefreshThreads,\n\t\tflushPendingPersist,\n\t]);\n\n\tconst switchThread = useCallback(\n\t\tasync (threadId: string) => {\n\t\t\tswitchEpochRef.current += 1;\n\t\t\tconst epoch = switchEpochRef.current;\n\t\t\tawait flushPendingPersist();\n\t\t\tif (epoch !== switchEpochRef.current) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst stored = await loadThread(threadId);\n\t\t\tif (epoch !== switchEpochRef.current) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (!stored) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t// Restore the session before announcing the switch, so the\n\t\t\t// `thread.changed` event carries the target thread's session id.\n\t\t\tif (stored.sessionId) {\n\t\t\t\tsessionIdRef.current = stored.sessionId;\n\t\t\t\tsetSessionIdState(stored.sessionId);\n\t\t\t} else {\n\t\t\t\tclearSessionId();\n\t\t\t}\n\t\t\tsetActiveThreadId(stored.threadId);\n\t\t\tthreadCreatedAtRef.current = stored.createdAt;\n\t\t\tthreadTitleRef.current = stored.title;\n\t\t\tsetMessages(stored.messages);\n\t\t\tsetQueuedMessages([]);\n\t\t\tsetText(\"\");\n\t\t},\n\t\t[setMessages, clearSessionId, setActiveThreadId, flushPendingPersist],\n\t);\n\n\tconst deleteThread = useCallback(\n\t\tasync (threadId: string) => {\n\t\t\t// Drop pending + await in-flight persist for the thread we're\n\t\t\t// deleting — otherwise an already-fired `upsertThread` can settle\n\t\t\t// after `deleteThreadFromStore` and resurrect the row.\n\t\t\tif (activeThreadIdRef.current === threadId) {\n\t\t\t\t// Invalidate any in-flight `switchThread` targeting this thread.\n\t\t\t\tswitchEpochRef.current += 1;\n\t\t\t\tif (persistTimerRef.current) {\n\t\t\t\t\tclearTimeout(persistTimerRef.current);\n\t\t\t\t\tpersistTimerRef.current = undefined;\n\t\t\t\t}\n\t\t\t\tconst inflight = persistInflightRef.current;\n\t\t\t\tif (inflight) {\n\t\t\t\t\tawait inflight;\n\t\t\t\t}\n\t\t\t}\n\t\t\tawait deleteThreadFromStore(threadId);\n\t\t\tawait refreshThreads();\n\t\t\tif (activeThreadIdRef.current === threadId) {\n\t\t\t\tsetMessages([]);\n\t\t\t\tsetQueuedMessages([]);\n\t\t\t\tclearSessionId();\n\t\t\t\tsetText(\"\");\n\t\t\t\tactiveThreadIdRef.current = undefined;\n\t\t\t\tsetActiveThreadIdState(undefined);\n\t\t\t\tthreadCreatedAtRef.current = undefined;\n\t\t\t\tthreadTitleRef.current = undefined;\n\t\t\t}\n\t\t},\n\t\t[setMessages, clearSessionId, refreshThreads],\n\t);\n\n\t// Sync controlled `activeThreadId` after mount. The mount effect seeds\n\t// the initial value; this effect handles parent-driven changes\n\t// afterwards by switching threads. Gated on `isThreadHistoryReady` so it\n\t// runs only once the mount load has settled.\n\tuseEffect(() => {\n\t\tif (!enableThreadHistory) {\n\t\t\treturn;\n\t\t}\n\t\tif (!isThreadHistoryReady) {\n\t\t\treturn;\n\t\t}\n\t\tif (controlledThreadId === undefined) {\n\t\t\treturn;\n\t\t}\n\t\tif (controlledThreadId === activeThreadIdRef.current) {\n\t\t\treturn;\n\t\t}\n\t\tvoid switchThread(controlledThreadId);\n\t}, [\n\t\tcontrolledThreadId,\n\t\tenableThreadHistory,\n\t\tisThreadHistoryReady,\n\t\tswitchThread,\n\t]);\n\n\tconst handleTextChange = useCallback(\n\t\t(e: React.ChangeEvent<HTMLTextAreaElement>) => {\n\t\t\tsetText(e.target.value);\n\t\t},\n\t\t[],\n\t);\n\n\tconst lastMessage = messages[messages.length - 1];\n\tconst hasMessages = messages.length > 0;\n\tconst showLoaderBubble =\n\t\tisLoading && (!hasMessages || lastMessage.role === \"user\");\n\n\t// Read through the revision counter so consumers (MessageList) re-render\n\t// when the catalog refreshes. Taking a snapshot here keeps the returned\n\t// object referentially stable between revisions.\n\tvoid toolDefinitionsRevision;\n\tconst toolDefinitions = toolDefinitionsRef.current;\n\n\treturn {\n\t\tmessages,\n\t\tstatus,\n\t\ttext,\n\t\tsetText,\n\t\thandleSubmit,\n\t\thandleTextChange,\n\t\tisLoading,\n\t\tshowLoaderBubble,\n\t\tlastMessage,\n\t\thasMessages,\n\t\tsendMessage,\n\t\tsendMessageAndWait,\n\t\treset,\n\t\tqueuedMessages,\n\t\tqueueFull,\n\t\tremoveQueuedMessage,\n\t\tsessionId,\n\t\ttoolDefinitions,\n\t\trefreshToolDefinitions,\n\t\tthreads,\n\t\tactiveThreadId,\n\t\tisThreadHistoryReady,\n\t\tstartNewThread,\n\t\tswitchThread,\n\t\tdeleteThread,\n\t};\n}\n","\"use client\";\n\nimport { createContext, useContext } from \"react\";\nimport type { WidgetEventEmitter } from \"./widget-events\";\nimport { createNoopWidgetEventEmitter } from \"./widget-events\";\n\n// Default is an inert emitter, so components emit unconditionally and a bare\n// `ChatEmbed` mounted without a provider (the BYO-backend path) stays silent.\nconst WidgetEventsContext = createContext<WidgetEventEmitter>(\n\tcreateNoopWidgetEventEmitter(),\n);\n\n/** Event emitter for the enclosing widget mount; inert without a provider. */\nexport function useWidgetEvents(): WidgetEventEmitter {\n\treturn useContext(WidgetEventsContext);\n}\n\nexport const WidgetEventsProvider = WidgetEventsContext.Provider;\n","// ============================================================================\n// Widget events: host-page subscription channel for chat lifecycle events.\n//\n// The embed mounts in the host page's DOM (the shadow root isolates styles\n// only), so subscribers run in the page's own JS context. The host forwards\n// events straight into its analytics (window.amplitude, window.analytics,\n// gtag, ...) and the page's own identity is attached automatically, with no\n// server-side identity plumbing. Event names are fixed and neutral; hosts\n// map them to their own schema inside the callback.\n//\n// Message events deliberately carry no message content: the host learns THAT\n// a message was exchanged, never what was said.\n// ============================================================================\n\nimport type { SuggestionOrigin } from \"../lib/resolve-suggestions\";\n\n/** Surface the widget is mounted on. */\nexport type WidgetMode = \"inline\" | \"floating\";\n\ninterface WidgetEventBase {\n\t/** Surface the widget is mounted on. */\n\tmode: WidgetMode;\n\t/**\n\t * Conversation session id, when one exists. Assigned on the first\n\t * exchange, so it is `undefined` for events that precede it.\n\t */\n\tsessionId?: string;\n\t/** Epoch milliseconds at emit time. */\n\ttimestamp: number;\n}\n\n/**\n * Per-event discriminant and extra properties. Events in the first branch\n * carry no `properties` object.\n */\nexport type WidgetEventDetail =\n\t| {\n\t\t\tname:\n\t\t\t\t| \"chat.ready\"\n\t\t\t\t| \"chat.opened\"\n\t\t\t\t| \"chat.closed\"\n\t\t\t\t| \"message.sent\"\n\t\t\t\t| \"message.received\";\n\t }\n\t| { name: \"session.started\"; properties: { sessionId: string } }\n\t| { name: \"thread.changed\"; properties: { threadId: string } }\n\t| { name: \"chat.error\"; properties: { message: string } }\n\t| {\n\t\t\tname: \"suggestion.clicked\";\n\t\t\tproperties: {\n\t\t\t\ttext: string;\n\t\t\t\tindex: number;\n\t\t\t\t/** Which provider supplied the clicked pill: `\"channel\"` (starter prompts), `\"page\"` (per-URL starter prompts), `\"flow\"` (an MCP flow's `interrupt({ suggestions })`), or `\"followup\"` (generated from the conversation). */\n\t\t\t\torigin: SuggestionOrigin;\n\t\t\t};\n\t }\n\t| {\n\t\t\tname: \"suggestions.shown\";\n\t\t\tproperties: {\n\t\t\t\ttexts: string[];\n\t\t\t\t/** Origin of the rendered set, same taxonomy as `suggestion.clicked`. */\n\t\t\t\torigin: SuggestionOrigin;\n\t\t\t};\n\t }\n\t| { name: \"link.clicked\"; properties: { url: string } };\n\n/** Payload handed to `onEvent` subscribers. Discriminated on `name`. */\nexport type WidgetEvent = WidgetEventBase & WidgetEventDetail;\n\nexport type WidgetEventName = WidgetEventDetail[\"name\"];\n\n/**\n * `emit()` input: the event detail, plus an optional explicit session id for\n * call sites that hold a fresher value than the live getter (e.g. the engine\n * emitting in the same tick a session id is assigned, restored, or cleared).\n * A present `sessionId` key is authoritative even when its value is\n * `undefined` — the live getter reads React state and lags same-tick\n * mutations. `session.started` derives its top-level `sessionId` from\n * `properties.sessionId` when no explicit override is given.\n */\nexport type WidgetEventInput = WidgetEventDetail & { sessionId?: string };\n\nexport interface WidgetEventEmitter {\n\t/** Register a listener. Returns its unsubscribe function. */\n\tsubscribe: (listener: (event: WidgetEvent) => void) => () => void;\n\t/** Build the full event (mode, timestamp, session id) and fan it out. */\n\temit: (input: WidgetEventInput) => void;\n}\n\nexport interface CreateWidgetEventEmitterOptions {\n\tmode: WidgetMode;\n\t/** Live session id, read at emit time. */\n\tgetSessionId?: () => string | undefined;\n}\n\n/**\n * Per-mount emitter. Every listener is isolated: an exception in one\n * subscriber is swallowed with a console warning and never breaks the widget\n * nor the other subscribers.\n */\nexport function createWidgetEventEmitter(\n\toptions: CreateWidgetEventEmitterOptions,\n): WidgetEventEmitter {\n\tconst listeners = new Set<(event: WidgetEvent) => void>();\n\treturn {\n\t\tsubscribe(listener) {\n\t\t\tlisteners.add(listener);\n\t\t\treturn () => {\n\t\t\t\tlisteners.delete(listener);\n\t\t\t};\n\t\t},\n\t\temit(input) {\n\t\t\tconst { sessionId: explicitSessionId, ...detail } = input;\n\t\t\tconst derivedSessionId =\n\t\t\t\tinput.name === \"session.started\"\n\t\t\t\t\t? input.properties.sessionId\n\t\t\t\t\t: undefined;\n\t\t\tconst event: WidgetEvent = {\n\t\t\t\t...detail,\n\t\t\t\tmode: options.mode,\n\t\t\t\tsessionId: Object.hasOwn(input, \"sessionId\")\n\t\t\t\t\t? explicitSessionId\n\t\t\t\t\t: (derivedSessionId ?? options.getSessionId?.()),\n\t\t\t\ttimestamp: Date.now(),\n\t\t\t};\n\t\t\t// Snapshot so listener-triggered subscribe/unsubscribe during emit\n\t\t\t// cannot skip peers or receive the in-flight event; mutations apply\n\t\t\t// from the next emit.\n\t\t\tfor (const listener of [...listeners]) {\n\t\t\t\ttry {\n\t\t\t\t\tlistener(event);\n\t\t\t\t} catch (err) {\n\t\t\t\t\tconsole.warn(\"[Waniwani] onEvent subscriber threw:\", err);\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t};\n}\n\n/** Inert emitter — the context default when no provider is mounted. */\nexport function createNoopWidgetEventEmitter(): WidgetEventEmitter {\n\treturn {\n\t\tsubscribe() {\n\t\t\treturn () => {};\n\t\t},\n\t\temit() {},\n\t};\n}\n","/**\n * Build a sibling endpoint URL from the chat `api` base.\n *\n * The `api` base is a full path to the chat endpoint (e.g.\n * `https://app.waniwani.ai/api/mcp/chat`) and every sibling endpoint\n * (`/config`, `/tools`, `/resource`) lives one segment deeper. Callers used to\n * build these by string concatenation (`` `${api}/config` ``), which breaks\n * when `api` carries a query string: internal surfaces append markers like\n * `?test=1` to the base, and naive concatenation produces\n * `.../chat?test=1/config` — the browser then reads `test=1/config` as the\n * query and hits the wrong route (a GET to the chat endpoint → 405).\n *\n * This inserts `path` before any existing query string, preserves the base's\n * own query params (so a marker like `test=1` propagates to siblings), and\n * merges in `params`. `api` may be absolute or root-relative (the default\n * `/api/waniwani`); the base and query are split textually so both forms work\n * without a document origin.\n */\nexport function buildApiUrl(\n\tapi: string,\n\tpath: string,\n\tparams?: Record<string, string>,\n): string {\n\tconst [rawBase, rawQuery = \"\"] = api.split(\"?\");\n\tconst base = rawBase.replace(/\\/$/, \"\");\n\tconst search = new URLSearchParams(rawQuery);\n\tif (params) {\n\t\tfor (const [key, value] of Object.entries(params)) {\n\t\t\tsearch.set(key, value);\n\t\t}\n\t}\n\tconst query = search.toString();\n\treturn `${base}${path}${query ? `?${query}` : \"\"}`;\n}\n","/**\n * A forward-compatible chat transport that handles version mismatches between\n * the server's `ai` package and the client's `ai` package.\n *\n * Two layers of protection:\n * 1. When a chunk fails validation due to unrecognized fields (from a newer\n * `ai` version using `strictObject`), extracts exactly which fields are\n * rejected, strips only those, and retries. This preserves events like\n * tool outputs so widgets keep rendering.\n * 2. If the chunk is a completely unknown event type, silently skips it.\n * The chat keeps working; only the unrecognised visual is missing.\n */\n\nimport type { UIMessage, UIMessageChunk } from \"ai\";\nimport { DefaultChatTransport, uiMessageChunkSchema } from \"ai\";\n\n/**\n * Extracts unrecognized field names from a validation error.\n *\n * Ideally we'd use Zod's `.strip()` to silently drop unknown keys, but\n * `uiMessageChunkSchema()` wraps the Zod union in a `zodSchema()` closure\n * that only exposes a `.validate` method — the raw Zod schema is unreachable,\n * so we can't call `.strip()` on each union branch. Duplicating the schema\n * here would be fragile and defeat the forward-compatibility goal.\n *\n * Instead we parse the Zod error: when a `strictObject` union branch matches\n * on `type` but rejects unknown fields, the error contains `invalid_union`\n * with per-branch errors. We find the branch that matched on `type` (no\n * `invalid_value` on the `type` path) and return its `unrecognized_keys`.\n */\nfunction extractKeysToStrip(error: unknown): string[] | null {\n\tconst cause = (error as { cause?: unknown })?.cause;\n\t// biome-ignore lint/suspicious/noExplicitAny: Zod error internals vary across versions\n\tconst issues: any[] | undefined =\n\t\t(cause as { issues?: unknown[] })?.issues ??\n\t\t(cause as { errors?: unknown[] })?.errors;\n\tif (!Array.isArray(issues)) {\n\t\treturn null;\n\t}\n\n\t// biome-ignore lint/suspicious/noExplicitAny: navigating untyped Zod error tree\n\tconst unionIssue = issues.find((i: any) => i.code === \"invalid_union\");\n\tif (!unionIssue?.errors) {\n\t\treturn null;\n\t}\n\n\tfor (const branchErrors of unionIssue.errors) {\n\t\tif (!Array.isArray(branchErrors)) {\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Skip branches where `type` didn't match — they have invalid_value on path [\"type\"]\n\t\tconst hasTypeMismatch = branchErrors.some(\n\t\t\t// biome-ignore lint/suspicious/noExplicitAny: untyped error\n\t\t\t(e: any) =>\n\t\t\t\t(e.code === \"invalid_value\" || e.code === \"invalid_literal\") &&\n\t\t\t\te.path?.[0] === \"type\",\n\t\t);\n\t\tif (hasTypeMismatch) {\n\t\t\tcontinue;\n\t\t}\n\n\t\t// This branch matched on type — extract its unrecognized keys\n\t\tconst unrecognized = branchErrors\n\t\t\t// biome-ignore lint/suspicious/noExplicitAny: untyped error\n\t\t\t.filter((e: any) => e.code === \"unrecognized_keys\")\n\t\t\t// biome-ignore lint/suspicious/noExplicitAny: untyped error\n\t\t\t.flatMap((e: any) => e.keys ?? []);\n\n\t\tif (unrecognized.length > 0) {\n\t\t\treturn unrecognized;\n\t\t}\n\t}\n\n\treturn null;\n}\n\nexport class LenientChatTransport<\n\tUI_MESSAGE extends UIMessage = UIMessage,\n> extends DefaultChatTransport<UI_MESSAGE> {\n\tprotected override processResponseStream(\n\t\tstream: ReadableStream<Uint8Array>,\n\t): ReadableStream<UIMessageChunk> {\n\t\tlet buffer = \"\";\n\n\t\tconst schema = uiMessageChunkSchema();\n\t\tconst validate = schema.validate?.bind(schema);\n\n\t\treturn stream\n\t\t\t.pipeThrough(\n\t\t\t\tnew TextDecoderStream() as TransformStream<Uint8Array, string>,\n\t\t\t)\n\t\t\t.pipeThrough(\n\t\t\t\tnew TransformStream<string, UIMessageChunk>({\n\t\t\t\t\tasync transform(text, controller) {\n\t\t\t\t\t\tbuffer += text;\n\t\t\t\t\t\tconst parts = buffer.split(\"\\n\");\n\t\t\t\t\t\tbuffer = parts.pop() ?? \"\";\n\n\t\t\t\t\t\tfor (const line of parts) {\n\t\t\t\t\t\t\tconst trimmed = line.trim();\n\t\t\t\t\t\t\tif (!trimmed.startsWith(\"data:\")) {\n\t\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tconst data = trimmed.slice(5).trim();\n\t\t\t\t\t\t\tif (data === \"[DONE]\") {\n\t\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\tconst parsed = JSON.parse(data);\n\n\t\t\t\t\t\t\t\tif (!validate) {\n\t\t\t\t\t\t\t\t\tcontroller.enqueue(parsed as UIMessageChunk);\n\t\t\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tconst result = await validate(parsed);\n\t\t\t\t\t\t\t\tif (result.success) {\n\t\t\t\t\t\t\t\t\tcontroller.enqueue(result.value);\n\t\t\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t// Validation failed — try stripping only the unrecognized keys\n\t\t\t\t\t\t\t\tconst keysToStrip = extractKeysToStrip(result.error);\n\t\t\t\t\t\t\t\tif (keysToStrip?.length) {\n\t\t\t\t\t\t\t\t\tconst stripped = { ...parsed };\n\t\t\t\t\t\t\t\t\tfor (const key of keysToStrip) {\n\t\t\t\t\t\t\t\t\t\tdelete stripped[key];\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tconst retry = await validate(stripped);\n\t\t\t\t\t\t\t\t\tif (retry.success) {\n\t\t\t\t\t\t\t\t\t\tcontroller.enqueue(retry.value);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t// Truly unknown event type — skip silently\n\t\t\t\t\t\t\t} catch {\n\t\t\t\t\t\t\t\t// Malformed JSON — skip\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t}),\n\t\t\t);\n\t}\n}\n","import type { UIMessage } from \"ai\";\nimport {\n\topenMemoryDb,\n\tTHREADS_BY_USER_INDEX,\n\tTHREADS_STORE,\n} from \"./memory-user-id\";\n\nexport interface StoredThread {\n\tthreadId: string;\n\tmemoryUserId: string;\n\ttitle: string;\n\tmessages: UIMessage[];\n\tsessionId?: string;\n\tcreatedAt: string;\n\tupdatedAt: string;\n}\n\nexport const MAX_THREADS_PER_USER = 50;\nexport const MAX_MESSAGES_PER_THREAD = 1000;\n\nfunction isStoredThread(value: unknown): value is StoredThread {\n\tif (!value || typeof value !== \"object\") {\n\t\treturn false;\n\t}\n\tconst v = value as Record<string, unknown>;\n\treturn (\n\t\ttypeof v.threadId === \"string\" &&\n\t\ttypeof v.memoryUserId === \"string\" &&\n\t\ttypeof v.title === \"string\" &&\n\t\tArray.isArray(v.messages) &&\n\t\ttypeof v.createdAt === \"string\" &&\n\t\ttypeof v.updatedAt === \"string\"\n\t);\n}\n\nasync function withDb<T>(\n\tfn: (db: IDBDatabase) => Promise<T>,\n): Promise<T | null> {\n\tif (typeof indexedDB === \"undefined\") {\n\t\treturn null;\n\t}\n\tlet db: IDBDatabase | null = null;\n\ttry {\n\t\tdb = await openMemoryDb();\n\t\treturn await fn(db);\n\t} catch {\n\t\treturn null;\n\t} finally {\n\t\ttry {\n\t\t\tdb?.close();\n\t\t} catch {\n\t\t\t// ignore\n\t\t}\n\t}\n}\n\nfunction promisifyRequest<T>(req: IDBRequest<T>): Promise<T> {\n\treturn new Promise((resolve, reject) => {\n\t\treq.onsuccess = () => resolve(req.result);\n\t\treq.onerror = () => reject(req.error);\n\t});\n}\n\nexport async function listThreads(\n\tmemoryUserId: string,\n): Promise<StoredThread[]> {\n\tconst result = await withDb(async (db) => {\n\t\tconst tx = db.transaction(THREADS_STORE, \"readonly\");\n\t\tconst store = tx.objectStore(THREADS_STORE);\n\t\tconst index = store.index(THREADS_BY_USER_INDEX);\n\t\tconst all = await promisifyRequest(index.getAll(memoryUserId));\n\t\tconst threads = (all ?? []).filter(isStoredThread);\n\t\tthreads.sort((a, b) => (a.updatedAt < b.updatedAt ? 1 : -1));\n\t\treturn threads;\n\t});\n\treturn result ?? [];\n}\n\nexport async function loadThread(\n\tthreadId: string,\n): Promise<StoredThread | null> {\n\tconst result = await withDb(async (db) => {\n\t\tconst tx = db.transaction(THREADS_STORE, \"readonly\");\n\t\tconst store = tx.objectStore(THREADS_STORE);\n\t\tconst value = await promisifyRequest(store.get(threadId));\n\t\treturn isStoredThread(value) ? value : null;\n\t});\n\treturn result ?? null;\n}\n\nexport async function upsertThread(thread: StoredThread): Promise<void> {\n\tif (!isStoredThread(thread)) {\n\t\treturn;\n\t}\n\tconst trimmed: StoredThread =\n\t\tthread.messages.length > MAX_MESSAGES_PER_THREAD\n\t\t\t? {\n\t\t\t\t\t...thread,\n\t\t\t\t\tmessages: thread.messages.slice(\n\t\t\t\t\t\tthread.messages.length - MAX_MESSAGES_PER_THREAD,\n\t\t\t\t\t),\n\t\t\t\t}\n\t\t\t: thread;\n\n\tawait withDb(async (db) => {\n\t\tawait new Promise<void>((resolve, reject) => {\n\t\t\tconst tx = db.transaction(THREADS_STORE, \"readwrite\");\n\t\t\ttx.oncomplete = () => resolve();\n\t\t\ttx.onerror = () => reject(tx.error);\n\t\t\ttx.onabort = () => reject(tx.error);\n\t\t\tconst store = tx.objectStore(THREADS_STORE);\n\t\t\tstore.put(trimmed);\n\t\t});\n\n\t\t// Evict oldest threads beyond the per-user cap.\n\t\tconst tx2 = db.transaction(THREADS_STORE, \"readwrite\");\n\t\tconst store2 = tx2.objectStore(THREADS_STORE);\n\t\tconst index = store2.index(THREADS_BY_USER_INDEX);\n\t\tconst all = await promisifyRequest(index.getAll(trimmed.memoryUserId));\n\t\tconst userThreads = (all ?? []).filter(isStoredThread);\n\t\tif (userThreads.length > MAX_THREADS_PER_USER) {\n\t\t\tuserThreads.sort((a, b) => (a.updatedAt < b.updatedAt ? -1 : 1));\n\t\t\tconst toEvict = userThreads.slice(\n\t\t\t\t0,\n\t\t\t\tuserThreads.length - MAX_THREADS_PER_USER,\n\t\t\t);\n\t\t\tfor (const t of toEvict) {\n\t\t\t\tstore2.delete(t.threadId);\n\t\t\t}\n\t\t}\n\t\tawait new Promise<void>((resolve, reject) => {\n\t\t\ttx2.oncomplete = () => resolve();\n\t\t\ttx2.onerror = () => reject(tx2.error);\n\t\t\ttx2.onabort = () => reject(tx2.error);\n\t\t});\n\t\treturn null;\n\t});\n}\n\nexport async function deleteThread(threadId: string): Promise<void> {\n\tawait withDb(async (db) => {\n\t\tawait new Promise<void>((resolve, reject) => {\n\t\t\tconst tx = db.transaction(THREADS_STORE, \"readwrite\");\n\t\t\ttx.oncomplete = () => resolve();\n\t\t\ttx.onerror = () => reject(tx.error);\n\t\t\ttx.onabort = () => reject(tx.error);\n\t\t\ttx.objectStore(THREADS_STORE).delete(threadId);\n\t\t});\n\t\treturn null;\n\t});\n}\n\nexport async function getActiveThreadId(\n\tmemoryUserId: string,\n): Promise<string | null> {\n\tconst threads = await listThreads(memoryUserId);\n\treturn threads[0]?.threadId ?? null;\n}\n\nexport function deriveThreadTitle(text: string): string {\n\tconst trimmed = text.trim();\n\tif (!trimmed) {\n\t\treturn `Conversation on ${new Date().toISOString().slice(0, 10)}`;\n\t}\n\tconst firstLine = trimmed.split(/\\r?\\n/, 1)[0] ?? trimmed;\n\tif (firstLine.length <= 60) {\n\t\treturn firstLine;\n\t}\n\treturn `${firstLine.slice(0, 60).trimEnd()}…`;\n}\n","export const DB_NAME = \"waniwani-memory\";\nexport const DB_VERSION = 2;\nexport const IDS_STORE = \"ids\";\nexport const THREADS_STORE = \"threads\";\nexport const THREADS_BY_USER_INDEX = \"by_memoryUserId\";\nexport const THREADS_BY_UPDATED_INDEX = \"by_updatedAt\";\n\nconst STORE_NAME = IDS_STORE;\nconst KEY = \"memoryUserId\";\nconst LOCAL_STORAGE_KEY = \"waniwani-memory-user-id\";\n\nlet inMemoryFallbackId: string | null = null;\n\nfunction generateUuid(): string {\n\tif (\n\t\ttypeof crypto !== \"undefined\" &&\n\t\ttypeof crypto.randomUUID === \"function\"\n\t) {\n\t\treturn crypto.randomUUID();\n\t}\n\t// Fallback for environments without crypto.randomUUID\n\treturn \"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx\".replace(/[xy]/g, (c) => {\n\t\tconst r = (Math.random() * 16) | 0;\n\t\tconst v = c === \"x\" ? r : (r & 0x3) | 0x8;\n\t\treturn v.toString(16);\n\t});\n}\n\nexport function applyMemoryDbUpgrade(\n\tdb: IDBDatabase,\n\toldVersion: number,\n): void {\n\tif (oldVersion < 1) {\n\t\tif (!db.objectStoreNames.contains(IDS_STORE)) {\n\t\t\tdb.createObjectStore(IDS_STORE);\n\t\t}\n\t}\n\tif (oldVersion < 2) {\n\t\tif (!db.objectStoreNames.contains(THREADS_STORE)) {\n\t\t\tconst threads = db.createObjectStore(THREADS_STORE, {\n\t\t\t\tkeyPath: \"threadId\",\n\t\t\t});\n\t\t\tthreads.createIndex(THREADS_BY_USER_INDEX, \"memoryUserId\", {\n\t\t\t\tunique: false,\n\t\t\t});\n\t\t\tthreads.createIndex(THREADS_BY_UPDATED_INDEX, \"updatedAt\", {\n\t\t\t\tunique: false,\n\t\t\t});\n\t\t}\n\t}\n}\n\nexport async function openMemoryDb(): Promise<IDBDatabase> {\n\treturn new Promise((resolve, reject) => {\n\t\tconst req = indexedDB.open(DB_NAME, DB_VERSION);\n\t\treq.onupgradeneeded = (event) => {\n\t\t\tapplyMemoryDbUpgrade(req.result, event.oldVersion);\n\t\t};\n\t\treq.onsuccess = () => resolve(req.result);\n\t\treq.onerror = () => reject(req.error);\n\t});\n}\n\nasync function openDb(): Promise<IDBDatabase> {\n\treturn openMemoryDb();\n}\n\nasync function idbGet(db: IDBDatabase): Promise<string | null> {\n\treturn new Promise((resolve, reject) => {\n\t\tconst tx = db.transaction(STORE_NAME, \"readonly\");\n\t\tconst store = tx.objectStore(STORE_NAME);\n\t\tconst req = store.get(KEY);\n\t\treq.onsuccess = () =>\n\t\t\tresolve(typeof req.result === \"string\" ? req.result : null);\n\t\treq.onerror = () => reject(req.error);\n\t});\n}\n\nasync function idbPut(db: IDBDatabase, value: string): Promise<void> {\n\treturn new Promise((resolve, reject) => {\n\t\tconst tx = db.transaction(STORE_NAME, \"readwrite\");\n\t\tconst store = tx.objectStore(STORE_NAME);\n\t\tconst req = store.put(value, KEY);\n\t\treq.onsuccess = () => resolve();\n\t\treq.onerror = () => reject(req.error);\n\t});\n}\n\nasync function tryIndexedDb(): Promise<string | null> {\n\tif (typeof indexedDB === \"undefined\") {\n\t\treturn null;\n\t}\n\ttry {\n\t\tconst db = await openDb();\n\t\ttry {\n\t\t\tconst existing = await idbGet(db);\n\t\t\tif (existing) {\n\t\t\t\treturn existing;\n\t\t\t}\n\t\t\tconst next = generateUuid();\n\t\t\tawait idbPut(db, next);\n\t\t\treturn next;\n\t\t} finally {\n\t\t\tdb.close();\n\t\t}\n\t} catch {\n\t\treturn null;\n\t}\n}\n\nfunction tryLocalStorage(): string | null {\n\ttry {\n\t\tconst existing = localStorage.getItem(LOCAL_STORAGE_KEY);\n\t\tif (existing) {\n\t\t\treturn existing;\n\t\t}\n\t\tconst next = generateUuid();\n\t\tlocalStorage.setItem(LOCAL_STORAGE_KEY, next);\n\t\treturn next;\n\t} catch {\n\t\treturn null;\n\t}\n}\n\nexport async function getOrCreateMemoryUserId(): Promise<string> {\n\tconst fromIdb = await tryIndexedDb();\n\tif (fromIdb) {\n\t\treturn fromIdb;\n\t}\n\n\tconst fromLs = tryLocalStorage();\n\tif (fromLs) {\n\t\treturn fromLs;\n\t}\n\n\tif (!inMemoryFallbackId) {\n\t\tinMemoryFallbackId = generateUuid();\n\t}\n\treturn inMemoryFallbackId;\n}\n","import { getOrCreateMemoryUserId } from \"./memory-user-id\";\n\nconst VISITOR_ID_KEY = \"waniwani-visitor-id\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface VisitorContext {\n\tuserAgent: string;\n\tbrowser: { name: string; version: string } | null;\n\tos: { name: string; version: string } | null;\n\tdeviceType: \"mobile\" | \"tablet\" | \"desktop\";\n\tlanguage: string;\n\tlanguages: string[];\n\ttimezone: string;\n\tscreenWidth: number;\n\tscreenHeight: number;\n\tviewportWidth: number;\n\tviewportHeight: number;\n\tcolorDepth: number;\n\tdevicePixelRatio: number;\n\ttouchSupport: boolean;\n\tconnectionType: string;\n\treferrer: string;\n\tvisitorId: string;\n\tmemoryUserId: string;\n}\n\n// ============================================================================\n// UA Parsing\n// ============================================================================\n\nfunction match(ua: string, pattern: RegExp): string | null {\n\tconst m = ua.match(pattern);\n\treturn m?.[1] ?? null;\n}\n\nexport function parseBrowser(\n\tua: string,\n): { name: string; version: string } | null {\n\t// Order matters — Edge/Opera contain \"Chrome\", so check them first\n\tconst browsers: [string, RegExp][] = [\n\t\t[\"Edge\", /Edg(?:e|A|iOS)?\\/(\\S+)/],\n\t\t[\"Opera\", /(?:OPR|Opera)\\/(\\S+)/],\n\t\t[\"Samsung Internet\", /SamsungBrowser\\/(\\S+)/],\n\t\t[\"Firefox\", /Firefox\\/(\\S+)/],\n\t\t[\"Chrome\", /Chrome\\/(\\S+)/],\n\t\t[\"Safari\", /Version\\/(\\S+).*Safari/],\n\t];\n\n\tfor (const [name, pattern] of browsers) {\n\t\tconst version = match(ua, pattern);\n\t\tif (version) {\n\t\t\treturn { name, version };\n\t\t}\n\t}\n\treturn null;\n}\n\nexport function parseOS(ua: string): { name: string; version: string } | null {\n\tconst systems: [string, RegExp][] = [\n\t\t[\"iOS\", /(?:iPhone|iPad|iPod).+?OS (\\d+[_.\\d]*)/],\n\t\t[\"Android\", /Android (\\d+[.\\d]*)/],\n\t\t[\"macOS\", /Mac OS X (\\d+[_.\\d]*)/],\n\t\t[\"Windows\", /Windows NT (\\d+[.\\d]*)/],\n\t\t[\"ChromeOS\", /CrOS \\S+ (\\d+[.\\d]*)/],\n\t\t[\"Linux\", /Linux/],\n\t];\n\n\tfor (const [name, pattern] of systems) {\n\t\tconst version = match(ua, pattern);\n\t\tif (version) {\n\t\t\treturn { name, version: version.replace(/_/g, \".\") };\n\t\t}\n\t\tif (name === \"Linux\" && pattern.test(ua)) {\n\t\t\treturn { name, version: \"\" };\n\t\t}\n\t}\n\treturn null;\n}\n\nexport function detectDeviceType(ua: string): \"mobile\" | \"tablet\" | \"desktop\" {\n\t// Use UA-CH if available\n\tif (\n\t\ttypeof navigator !== \"undefined\" &&\n\t\t\"userAgentData\" in navigator &&\n\t\t// biome-ignore lint/suspicious/noExplicitAny: userAgentData is not typed\n\t\t(navigator as any).userAgentData?.mobile\n\t) {\n\t\treturn \"mobile\";\n\t}\n\n\tif (/iPad|tablet|PlayBook/i.test(ua)) {\n\t\treturn \"tablet\";\n\t}\n\tif (/Mobi|Android.*Mobile|iPhone|iPod/i.test(ua)) {\n\t\treturn \"mobile\";\n\t}\n\treturn \"desktop\";\n}\n\n// ============================================================================\n// Visitor ID (opaque id, persisted in localStorage)\n// ============================================================================\n\n/**\n * A random opaque id, generated synchronously. Prefers `crypto.randomUUID`\n * and falls back to a `crypto.getRandomValues` UUIDv4 when it is missing\n * (older browsers), and finally to a non-crypto random string when the Web\n * Crypto API is entirely unavailable (e.g. a non-secure context). The value\n * is opaque, so any of these is a valid visitor id.\n */\nfunction randomId(): string {\n\ttry {\n\t\tif (typeof crypto !== \"undefined\") {\n\t\t\tif (typeof crypto.randomUUID === \"function\") {\n\t\t\t\treturn crypto.randomUUID();\n\t\t\t}\n\t\t\tif (typeof crypto.getRandomValues === \"function\") {\n\t\t\t\tconst bytes = crypto.getRandomValues(new Uint8Array(16));\n\t\t\t\t// RFC 4122 v4 layout\n\t\t\t\tbytes[6] = (bytes[6] & 0x0f) | 0x40;\n\t\t\t\tbytes[8] = (bytes[8] & 0x3f) | 0x80;\n\t\t\t\tconst hex = Array.from(bytes, (b) =>\n\t\t\t\t\tb.toString(16).padStart(2, \"0\"),\n\t\t\t\t).join(\"\");\n\t\t\t\treturn `${hex.slice(0, 8)}-${hex.slice(8, 12)}-${hex.slice(12, 16)}-${hex.slice(16, 20)}-${hex.slice(20)}`;\n\t\t\t}\n\t\t}\n\t} catch {\n\t\t// Fall through to the non-crypto path below.\n\t}\n\treturn `v-${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 10)}`;\n}\n\n/**\n * Synchronously return a stable, persisted visitor id, creating one on first\n * call. Runs with no async work and no `crypto.subtle` dependency, so it never\n * races an in-flight promise and never fails on a non-secure context — callers\n * can rely on a visitor id being present on the very first event or request.\n */\nexport function getOrCreateVisitorId(): string {\n\ttry {\n\t\tconst stored = localStorage.getItem(VISITOR_ID_KEY);\n\t\tif (stored) {\n\t\t\treturn stored;\n\t\t}\n\t} catch {\n\t\t// localStorage unavailable (private browsing, security policy) — fall\n\t\t// through and mint a fresh id. It won't persist, but the request/event\n\t\t// still carries a visitor id for this page load.\n\t}\n\n\tconst id = randomId();\n\n\ttry {\n\t\tlocalStorage.setItem(VISITOR_ID_KEY, id);\n\t} catch {\n\t\t// Ignore storage failures.\n\t}\n\n\treturn id;\n}\n\n/**\n * Override the persisted visitor id with a caller-supplied one — typically the\n * distinct id the host site already tracks in PostHog, Amplitude, Segment, etc.\n * The value is stored under the same key as the auto-generated id, so it\n * becomes the single source of truth every later read\n * (`getOrCreateVisitorId`, `collectVisitorContext`) returns, and it is what the\n * chat sends to the server on every request. That threads it through to MCP\n * tools/flows as `context.waniwani.visitorId`, so server code can forward the\n * same id back to the analytics tool it came from.\n *\n * A blank / whitespace-only id is ignored: it returns the current id unchanged\n * so a not-yet-ready analytics id (e.g. before PostHog has bootstrapped) can\n * never wipe a good one. Returns the effective id.\n */\nexport function setVisitorId(id: string): string {\n\tconst trimmed = typeof id === \"string\" ? id.trim() : \"\";\n\tif (!trimmed) {\n\t\treturn getOrCreateVisitorId();\n\t}\n\n\ttry {\n\t\tlocalStorage.setItem(VISITOR_ID_KEY, trimmed);\n\t} catch {\n\t\t// Storage unavailable (private mode / non-secure context). The value\n\t\t// can't persist here — consistent with getOrCreateVisitorId, which also\n\t\t// re-mints each call in this mode. Pass the id via config in that case.\n\t}\n\n\treturn trimmed;\n}\n\n/**\n * A visitor id to apply, or a resolver that produces one. The resolver may be\n * sync (`() => posthog.get_distinct_id()`) or async\n * (`async () => (await sdk.ready()).id`), for analytics SDKs whose id is only\n * available after they bootstrap.\n */\nexport type VisitorIdInput =\n\t| string\n\t| (() => string | undefined | null | Promise<string | undefined | null>);\n\nfunction isThenable(value: unknown): value is Promise<unknown> {\n\treturn (\n\t\tvalue != null && typeof (value as { then?: unknown }).then === \"function\"\n\t);\n}\n\n/**\n * Resolve a {@link VisitorIdInput} and persist the result via\n * {@link setVisitorId}. A literal or sync resolver applies immediately; an\n * async resolver applies once it settles. A blank / null result, a throwing\n * resolver, and a rejected promise are all ignored so the current id is never\n * wiped. Returns a cancel function: call it (e.g. from a React effect cleanup)\n * to drop a late async result after unmount or a prop change.\n */\nexport function applyVisitorId(input: VisitorIdInput | undefined): () => void {\n\tlet cancelled = false;\n\tconst cancel = () => {\n\t\tcancelled = true;\n\t};\n\tif (input == null) {\n\t\treturn cancel;\n\t}\n\n\tlet value: string | undefined | null | Promise<string | undefined | null>;\n\ttry {\n\t\tvalue = typeof input === \"function\" ? input() : input;\n\t} catch {\n\t\t// A throwing resolver must never break the chat — keep the current id.\n\t\treturn cancel;\n\t}\n\n\tif (isThenable(value)) {\n\t\tvalue.then(\n\t\t\t(resolved) => {\n\t\t\t\tif (!cancelled) {\n\t\t\t\t\tsetVisitorId((resolved as string | undefined | null) ?? \"\");\n\t\t\t\t}\n\t\t\t},\n\t\t\t() => {\n\t\t\t\t// Rejected resolver — keep the current id.\n\t\t\t},\n\t\t);\n\t} else {\n\t\tsetVisitorId(value ?? \"\");\n\t}\n\n\treturn cancel;\n}\n\n// ============================================================================\n// Main export\n// ============================================================================\n\nexport async function collectVisitorContext(): Promise<VisitorContext> {\n\tconst ua = navigator.userAgent;\n\tconst visitorId = getOrCreateVisitorId();\n\tconst memoryUserId = await getOrCreateMemoryUserId();\n\n\treturn {\n\t\tuserAgent: ua,\n\t\tbrowser: parseBrowser(ua),\n\t\tos: parseOS(ua),\n\t\tdeviceType: detectDeviceType(ua),\n\t\tlanguage: navigator.language,\n\t\tlanguages: [...navigator.languages],\n\t\ttimezone: Intl.DateTimeFormat().resolvedOptions().timeZone,\n\t\tscreenWidth: screen.width,\n\t\tscreenHeight: screen.height,\n\t\tviewportWidth: window.innerWidth,\n\t\tviewportHeight: window.innerHeight,\n\t\tcolorDepth: screen.colorDepth,\n\t\tdevicePixelRatio: window.devicePixelRatio ?? 1,\n\t\ttouchSupport: \"ontouchstart\" in window || navigator.maxTouchPoints > 0,\n\t\t// biome-ignore lint/suspicious/noExplicitAny: navigator.connection is not typed\n\t\tconnectionType: (navigator as any).connection?.effectiveType ?? \"unknown\",\n\t\treferrer: document.referrer,\n\t\tvisitorId,\n\t\tmemoryUserId,\n\t};\n}\n","\"use client\";\n\nimport { useEffect, useRef, useState } from \"react\";\nimport { buildApiUrl } from \"../lib/api-url\";\n\nexport interface WaniWaniConfig {\n\tdebug: boolean;\n\teval: boolean;\n}\n\nconst defaultConfig: WaniWaniConfig = { debug: false, eval: false };\n\nexport function useConfig(\n\tapi = \"/api/waniwani\",\n\theaders?: Record<string, string>,\n\tskip = false,\n): WaniWaniConfig {\n\tconst [config, setConfig] = useState<WaniWaniConfig>(defaultConfig);\n\n\t// Keep headers in a ref so identity changes don't re-trigger the fetch.\n\t// Callers commonly pass a fresh object literal each render.\n\tconst headersRef = useRef(headers);\n\tuseEffect(() => {\n\t\theadersRef.current = headers;\n\t}, [headers]);\n\n\tuseEffect(() => {\n\t\tif (skip) {\n\t\t\treturn;\n\t\t}\n\t\t(async () => {\n\t\t\ttry {\n\t\t\t\tconst current = headersRef.current;\n\t\t\t\tconst r = await fetch(buildApiUrl(api, \"/config\"), {\n\t\t\t\t\theaders: current ? { ...current } : undefined,\n\t\t\t\t});\n\t\t\t\tconst data = await r.json();\n\t\t\t\tsetConfig({\n\t\t\t\t\tdebug: data.debug === true,\n\t\t\t\t\teval: data.eval === true,\n\t\t\t\t});\n\t\t\t} catch {}\n\t\t})();\n\t}, [api, skip]);\n\n\treturn config;\n}\n","\"use client\";\n\nimport type { ChatStatus, UIMessage } from \"ai\";\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport type { SuggestionsConfig } from \"../@types\";\nimport type {\n\tPreChatSuggestions,\n\tSuggestionOrigin,\n} from \"../lib/resolve-suggestions\";\nimport { resolveSuggestions, toSuggestions } from \"../lib/resolve-suggestions\";\nimport {\n\textractFlowSuggestions,\n\textractFollowupSuggestions,\n} from \"./turn-suggestions\";\n\nexport interface UseSuggestionRowOptions {\n\tmessages: UIMessage[];\n\tstatus: ChatStatus;\n\t/**\n\t * The host's `suggestions` prop. `false` renders no row; `{ initial }` seeds\n\t * the channel rung; already-resolved {@link PreChatSuggestions} from an\n\t * embed host pass through with their prompt ids. A resolved value must be\n\t * referentially stable — an effect keys on it.\n\t */\n\tsuggestions?: boolean | SuggestionsConfig | PreChatSuggestions;\n}\n\n/** An embed host's resolved rungs carry `page`/`channel`; a config carries `initial`. */\nfunction isResolved(\n\tvalue: SuggestionsConfig | PreChatSuggestions,\n): value is PreChatSuggestions {\n\treturn \"page\" in value || \"channel\" in value;\n}\n\nfunction readProp(suggestions: UseSuggestionRowOptions[\"suggestions\"]): {\n\trungs?: PreChatSuggestions;\n\tinitial?: string[];\n} {\n\tif (typeof suggestions !== \"object\" || suggestions === null) {\n\t\treturn {};\n\t}\n\treturn isResolved(suggestions)\n\t\t? { rungs: suggestions }\n\t\t: { initial: suggestions.initial };\n}\n\n/** Pill row state, driven entirely by `resolveSuggestions`. */\nexport function useSuggestionRow(options: UseSuggestionRowOptions) {\n\tconst { messages, status, suggestions } = options;\n\tconst enabled = suggestions !== false;\n\n\tconst { rungs, initial } = readProp(suggestions);\n\tconst fromInitial = useMemo<PreChatSuggestions>(\n\t\t() => ({ page: null, channel: toSuggestions(initial ?? []) }),\n\t\t[initial],\n\t);\n\tconst preChat = rungs ?? fromInitial;\n\n\t// Memoized so the `useState` initializer and the effect below share one array\n\t// reference. Two content-equal arrays would defeat `setPills`' bail-out and\n\t// double-count the `suggestions.shown` impression in `chat-embed.tsx`.\n\tconst preChatRow = useMemo(\n\t\t() =>\n\t\t\tenabled\n\t\t\t\t? resolveSuggestions({ flow: null, followup: null, ...preChat })\n\t\t\t\t: null,\n\t\t[enabled, preChat],\n\t);\n\tconst preChatTexts = useMemo(\n\t\t() => preChatRow?.suggestions.map((s) => s.text) ?? [],\n\t\t[preChatRow],\n\t);\n\tconst [pills, setPills] = useState<string[]>(preChatTexts);\n\tconst [source, setSource] = useState<SuggestionOrigin>(\n\t\tpreChatRow?.origin ?? \"channel\",\n\t);\n\tconst prevStatusRef = useRef<ChatStatus>(status);\n\n\tconst clear = useCallback(() => {\n\t\tsetPills([]);\n\t}, []);\n\n\t// Also covers `reset()` / `startNewThread()`, which empty `messages` without\n\t// unmounting: a previous conversation's flow pills would otherwise stay\n\t// clickable and misattribute the click to a flow never invoked here.\n\tconst hasMessages = messages.length > 0;\n\tuseEffect(() => {\n\t\tif (hasMessages) {\n\t\t\treturn;\n\t\t}\n\t\tsetPills(preChatTexts);\n\t\tsetSource(preChatRow?.origin ?? \"channel\");\n\t}, [preChatTexts, preChatRow, hasMessages]);\n\n\t// Clear when a new user message arrives\n\tconst lastMessage = messages[messages.length - 1];\n\tuseEffect(() => {\n\t\tif (lastMessage?.role === \"user\") {\n\t\t\tclear();\n\t\t}\n\t}, [lastMessage, clear]);\n\n\t// Recompute on every streaming -> ready transition: the pills describe the\n\t// reply just received, so a turn carrying none clears the row.\n\tuseEffect(() => {\n\t\tconst prevStatus = prevStatusRef.current;\n\t\tprevStatusRef.current = status;\n\n\t\tif (prevStatus !== \"streaming\" || status !== \"ready\" || !enabled) {\n\t\t\treturn;\n\t\t}\n\t\tconst lastAssistant = [...messages]\n\t\t\t.reverse()\n\t\t\t.find((m) => m.role === \"assistant\");\n\t\tif (!lastAssistant) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst flow = extractFlowSuggestions(lastAssistant);\n\t\tconst followup = extractFollowupSuggestions(lastAssistant);\n\t\tconst turnRow = resolveSuggestions({\n\t\t\tflow: flow === null ? null : toSuggestions(flow),\n\t\t\tfollowup: followup === null ? null : toSuggestions(followup),\n\t\t\tpage: null,\n\t\t\tchannel: null,\n\t\t});\n\t\tsetPills(turnRow ? turnRow.suggestions.map((s) => s.text) : []);\n\t\tsetSource(turnRow?.origin ?? \"channel\");\n\t}, [status, enabled, messages]);\n\n\treturn { suggestions: pills, source, isLoading: false, clear };\n}\n","// ============================================================================\n// Which pills render. One fixed, non-configurable hierarchy:\n// flow > followup > page > channel\n//\n// The shipped wire formats keep their older wording on purpose: the event\n// payloads say `promptId` / `prompts`, the `/config` payload says\n// `pageSuggestions[].prompts`. Both are contracts, not naming.\n// ============================================================================\n\n/** Source of truth; {@link SuggestionOrigin} derives from it. */\nexport const SUGGESTION_ORIGINS = [\n\t\"channel\",\n\t\"page\",\n\t\"flow\",\n\t\"followup\",\n] as const;\n\nexport type SuggestionOrigin = (typeof SUGGESTION_ORIGINS)[number];\n\n/** One pill. `id` is null unless it came from an authored per-page prompt. */\nexport interface Suggestion {\n\tid: string | null;\n\ttext: string;\n}\n\n/**\n * One field per origin. `null` means the origin has nothing to say — no entry\n * on this turn, or the rung no longer applies.\n *\n * `flow` alone treats `[]` as authoritative: it clears the row and suppresses\n * every weaker rung. Elsewhere `[]` and `null` are the same.\n */\nexport interface SuggestionCandidates {\n\tflow: Suggestion[] | null;\n\tfollowup: Suggestion[] | null;\n\tpage: Suggestion[] | null;\n\tchannel: Suggestion[] | null;\n}\n\n/**\n * The rungs an embed host reads from `/config`. Grouped because they share a\n * source and a lifetime: both stop applying at the visitor's first message.\n */\nexport type PreChatSuggestions = Pick<SuggestionCandidates, \"page\" | \"channel\">;\n\nexport interface ResolvedSuggestions {\n\torigin: SuggestionOrigin;\n\tsuggestions: Suggestion[];\n}\n\n/** Wrap raw texts, which carry no stored identity. */\nexport function toSuggestions(texts: string[]): Suggestion[] {\n\treturn texts.map((text) => ({ id: null, text }));\n}\n\n/** Walk the hierarchy. See {@link SuggestionCandidates} for the `[]` rules. */\nexport function resolveSuggestions(\n\tcandidates: SuggestionCandidates,\n): ResolvedSuggestions | null {\n\tconst { flow, followup, page, channel } = candidates;\n\tif (flow !== null) {\n\t\treturn { origin: \"flow\", suggestions: flow };\n\t}\n\tif (followup?.length) {\n\t\treturn { origin: \"followup\", suggestions: followup };\n\t}\n\tif (page?.length) {\n\t\treturn { origin: \"page\", suggestions: page };\n\t}\n\tif (channel?.length) {\n\t\treturn { origin: \"channel\", suggestions: channel };\n\t}\n\treturn null;\n}\n","import type { UIMessage } from \"ai\";\nimport { SUGGESTIONS_META_KEY } from \"../../../shared/meta-keys\";\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null;\n}\n\nfunction isStringArray(value: unknown): value is string[] {\n\treturn (\n\t\tArray.isArray(value) && value.every((item) => typeof item === \"string\")\n\t);\n}\n\n/**\n * A well-formed `waniwani/suggestions` entry off a tool part's `_meta`, else\n * `null`. Malformed entries are garbage, not an authoritative clear.\n */\nfunction readSuggestionsEntry(part: unknown): string[] | null {\n\tif (!isRecord(part) || !(\"toolCallId\" in part) || !(\"output\" in part)) {\n\t\treturn null;\n\t}\n\tconst output = part.output;\n\tif (!isRecord(output) || !isRecord(output._meta)) {\n\t\treturn null;\n\t}\n\tconst entry = output._meta[SUGGESTIONS_META_KEY];\n\tif (!isRecord(entry) || !isStringArray(entry.suggestions)) {\n\t\treturn null;\n\t}\n\treturn entry.suggestions;\n}\n\n/**\n * The pills the flow engine attached to a tool result. Parts are matched on\n * `toolCallId` + `output` like the renderer does, not on a `tool-*` type\n * string, so AI SDK part renames don't break this.\n *\n * One turn can hit the flow twice (a `continue` through an action node), so the\n * last well-formed entry wins.\n *\n * @returns `[]` for an authoritative clear, `null` when no part carried the key.\n */\nexport function extractFlowSuggestions(message: UIMessage): string[] | null {\n\tlet found: string[] | null = null;\n\n\tfor (const part of message.parts) {\n\t\tconst suggestions = readSuggestionsEntry(part);\n\t\tif (suggestions === null) {\n\t\t\tcontinue;\n\t\t}\n\t\tfound = suggestions;\n\t}\n\n\treturn found;\n}\n\n/**\n * Read suggestions from a streamed data part:\n * `{ type: \"data-suggestions\", data: { suggestions: string[] } }`.\n * Only a bring-your-own-backend host emits this; the Waniwani chat API does not.\n */\nexport function extractFollowupSuggestions(\n\tmessage: UIMessage,\n): string[] | null {\n\tfor (const part of message.parts) {\n\t\tif (!isRecord(part)) {\n\t\t\tcontinue;\n\t\t}\n\t\tif (part.type !== \"data-suggestions\") {\n\t\t\tcontinue;\n\t\t}\n\t\tconst data = part.data;\n\t\tif (\n\t\t\tisRecord(data) &&\n\t\t\tisStringArray(data.suggestions) &&\n\t\t\tdata.suggestions.length > 0\n\t\t) {\n\t\t\treturn data.suggestions;\n\t\t}\n\t}\n\treturn null;\n}\n","import { useEffect, useRef, useState } from \"react\";\n\nconst TYPE_SPEED_MS = 80;\nconst DELETE_SPEED_MS = 50;\nconst PAUSE_AFTER_TYPE_MS = 15000;\nconst PAUSE_AFTER_DELETE_MS = 500;\n\n/**\n * Returns a string that animates like someone typing and deleting the placeholder text.\n * Only animates when `active` is true (i.e. the input is empty).\n */\nexport function useTypingPlaceholder(text: string, active = true): string {\n\tconst [displayed, setDisplayed] = useState(\"\");\n\tconst timerRef = useRef<ReturnType<typeof setTimeout>>(undefined);\n\n\tuseEffect(() => {\n\t\tif (!active) {\n\t\t\t// Reset so the animation restarts fresh when re-activated\n\t\t\tsetDisplayed(\"\");\n\t\t\treturn;\n\t\t}\n\n\t\tlet i = 0;\n\t\tlet deleting = false;\n\t\tlet disposed = false;\n\n\t\tconst tick = () => {\n\t\t\tif (disposed) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (!deleting) {\n\t\t\t\t// Typing forward\n\t\t\t\ti++;\n\t\t\t\tsetDisplayed(text.slice(0, i));\n\n\t\t\t\tif (i >= text.length) {\n\t\t\t\t\t// Finished typing — pause then start deleting\n\t\t\t\t\tdeleting = true;\n\t\t\t\t\ttimerRef.current = setTimeout(tick, PAUSE_AFTER_TYPE_MS);\n\t\t\t\t} else {\n\t\t\t\t\ttimerRef.current = setTimeout(tick, TYPE_SPEED_MS);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// Deleting\n\t\t\t\ti--;\n\t\t\t\tsetDisplayed(text.slice(0, i));\n\n\t\t\t\tif (i <= 0) {\n\t\t\t\t\t// Finished deleting — pause then start typing again\n\t\t\t\t\tdeleting = false;\n\t\t\t\t\ttimerRef.current = setTimeout(tick, PAUSE_AFTER_DELETE_MS);\n\t\t\t\t} else {\n\t\t\t\t\ttimerRef.current = setTimeout(tick, DELETE_SPEED_MS);\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\t// Start after a small delay\n\t\ttimerRef.current = setTimeout(tick, PAUSE_AFTER_DELETE_MS);\n\n\t\treturn () => {\n\t\t\tdisposed = true;\n\t\t\tclearTimeout(timerRef.current);\n\t\t};\n\t}, [text, active]);\n\n\treturn displayed;\n}\n","import { buildApiUrl } from \"./api-url\";\n\n/**\n * Build the resource-endpoint URL used by widget iframes to fetch their\n * HTML via GET.\n *\n * Iframe navigations can't set custom headers, so when the chat caller\n * passed an `Authorization: Bearer …` header (the embed path), we\n * propagate the token in the URL. Same-origin proxy setups (customer\n * next-js adapter) don't need this and get a plain endpoint back.\n *\n * Parameter is deliberately narrowed to `Record<string, string>` to match\n * `ChatBaseProps.headers`. Widening it to `HeadersInit` would silently\n * drop the token for `Headers`/tuple-array shapes (they need `.get()` /\n * iteration) and leave the iframe returning 401 with no clear signal.\n */\nexport function buildResourceEndpoint(\n\tapi: string,\n\theaders: Record<string, string> | undefined,\n): string {\n\tconst authHeaderValue = headers?.Authorization;\n\tconst resourceToken =\n\t\ttypeof authHeaderValue === \"string\" && authHeaderValue.startsWith(\"Bearer \")\n\t\t\t? authHeaderValue.slice(7)\n\t\t\t: null;\n\treturn buildApiUrl(\n\t\tapi,\n\t\t\"/resource\",\n\t\tresourceToken ? { token: resourceToken } : undefined,\n\t);\n}\n","import type { ChatTheme } from \"./@types\";\n\nexport const DEFAULT_THEME: Required<ChatTheme> = {\n\tprimaryColor: \"#6366f1\",\n\tprimaryForeground: \"#1f2937\",\n\tbackgroundColor: \"#ffffff\",\n\ttextColor: \"#1f2937\",\n\tmutedColor: \"#6b7280\",\n\tborderColor: \"#e5e7eb\",\n\tborderWidth: 0,\n\tboxShadow: \"none\",\n\tassistantBubbleColor: \"#f3f4f6\",\n\tuserBubbleColor: \"#f4f4f4\",\n\tinputBackgroundColor: \"#f9fafb\",\n\tborderRadius: 16,\n\tmessageBorderRadius: 8,\n\tfontFamily: \"system-ui, -apple-system, 'Segoe UI', sans-serif\",\n\theaderBackgroundColor: \"#ffffff\",\n\theaderTextColor: \"#1f2937\",\n\tstatusColor: \"#22c55e\",\n\ttoolCardColor: \"#f4f4f5\",\n\tuserBubbleTextColor: \"#1f2937\",\n\tassistantBubbleTextColor: \"#1f2937\",\n\tmessagePaddingX: 16,\n\tmessagePaddingY: 12,\n\tmessageMaxWidth: \"80%\",\n\tfontSize: 16,\n\tlineHeight: \"1.5\",\n\tglassTint: \"transparent\",\n\tglassTintStrength: \"0\",\n};\n\nexport const DARK_THEME: ChatTheme = {\n\tbackgroundColor: \"#212121\",\n\theaderBackgroundColor: \"#1e1e1e\",\n\theaderTextColor: \"#ececec\",\n\ttextColor: \"#ececec\",\n\tprimaryForeground: \"#ffffff\",\n\tmutedColor: \"#8e8ea0\",\n\tborderColor: \"#444444\",\n\tassistantBubbleColor: \"#2f2f2f\",\n\tuserBubbleColor: \"#303030\",\n\tinputBackgroundColor: \"#2f2f2f\",\n\tprimaryColor: \"#6366f1\",\n\tstatusColor: \"#22c55e\",\n\ttoolCardColor: \"#262626\",\n\tuserBubbleTextColor: \"#ffffff\",\n\tassistantBubbleTextColor: \"#ececec\",\n};\n\nconst CSS_VAR_MAP: Record<keyof ChatTheme, string[]> = {\n\tprimaryColor: [\"--ww-primary\", \"--ww-color-primary\"],\n\tprimaryForeground: [\"--ww-primary-fg\", \"--ww-color-primary-foreground\"],\n\tbackgroundColor: [\"--ww-bg\", \"--ww-color-background\"],\n\ttextColor: [\n\t\t\"--ww-text\",\n\t\t\"--ww-color-foreground\",\n\t\t\"--ww-color-accent-foreground\",\n\t],\n\tmutedColor: [\"--ww-muted\", \"--ww-color-muted-foreground\"],\n\tborderColor: [\"--ww-border\", \"--ww-color-border\"],\n\tborderWidth: [\"--ww-border-width\"],\n\tboxShadow: [\"--ww-shadow\"],\n\tassistantBubbleColor: [\"--ww-assistant-bubble\", \"--ww-color-accent\"],\n\tuserBubbleColor: [\"--ww-user-bubble\"],\n\tinputBackgroundColor: [\"--ww-input-bg\", \"--ww-color-input\"],\n\tborderRadius: [\"--ww-radius\"],\n\tmessageBorderRadius: [\"--ww-msg-radius\"],\n\tfontFamily: [\"--ww-font\"],\n\theaderBackgroundColor: [\"--ww-header-bg\"],\n\theaderTextColor: [\"--ww-header-text\"],\n\tstatusColor: [\"--ww-status\"],\n\ttoolCardColor: [\"--ww-tool-card\", \"--ww-color-tool-card\"],\n\tuserBubbleTextColor: [\"--ww-user-bubble-text\"],\n\tassistantBubbleTextColor: [\"--ww-assistant-bubble-text\"],\n\tmessagePaddingX: [\"--ww-msg-pad-x\"],\n\tmessagePaddingY: [\"--ww-msg-pad-y\"],\n\tmessageMaxWidth: [\"--ww-msg-max-width\"],\n\tfontSize: [\"--ww-font-size\"],\n\tlineHeight: [\"--ww-line-height\"],\n\tglassTint: [\"--ww-glass-tint\"],\n\tglassTintStrength: [\"--ww-glass-tint-opacity\"],\n};\n\nexport function mergeTheme(userTheme?: ChatTheme): Required<ChatTheme> {\n\treturn { ...DEFAULT_THEME, ...userTheme };\n}\n\n/**\n * Serialise a (partial) `ChatTheme` to inline CSS custom properties. Only\n * keys present on the input are emitted — unspecified properties fall back\n * to the cascade in `tailwind.css` (`var(--ww-primary, #6366f1)` chain).\n * This lets a customer's `[data-waniwani-embed] { --ww-primary: ... }` win\n * over the chat root's defaults when only a few keys are customised.\n */\nexport function themeToCSSProperties(theme: ChatTheme): Record<string, string> {\n\tconst vars: Record<string, string> = {};\n\tfor (const [key, cssVars] of Object.entries(CSS_VAR_MAP)) {\n\t\tconst value = theme[key as keyof ChatTheme];\n\t\tif (value === undefined) {\n\t\t\tcontinue;\n\t\t}\n\t\tconst resolved = typeof value === \"number\" ? `${value}px` : String(value);\n\t\tfor (const cssVar of cssVars) {\n\t\t\tvars[cssVar] = resolved;\n\t\t}\n\t}\n\treturn vars;\n}\n"],"mappings":"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pBA,IAAM,MACNA,IAAM,MACNA,IAAM,MACNA,IAAM,MACNA,IAAM,MACNA,IAAM,MACNA,IAAM,MACNA,IAAM,MACNA,IAAM,MACNA,IAAM,MACNA,IAAM,MACNA,IAAM,MACNA,IAAM,MACNA,IAAM,MACNA,IAAM,MACNA,GAAK,MAAUA,GAAK,MACpBA,IAAM,MACNA,IAAM,MACNA,GAAK,MAAUA,GAAK,MACpBA,IAAM,MACNA,GAAK,MAAUA,GAAK,MACpBA,IAAM,MACNA,IAAM,MACNA,IAAM,MACNA,IAAM,MACNA,IAAM,MACNA,IAAM,MACNA,IAAM,MACNA,GAAK,MAAUA,GAAK,MACpBA,IAAM,MACNA,IAAM,MACNA,IAAM,MACNA,IAAM,MACNA,IAAM,MACNA,IAAM,MACNA,IAAM,MACNA,IAAM,MACNA,IAAM,MACNA,IAAM,MACNA,IAAM,MACNA,IAAM,MACNA,IAAM,MACNA,GAAK,MAAUA,GAAK,MACpBA,GAAK,MAAUA,GAAK,MACpBA,GAAK,MAAUA,GAAK,MACpBA,GAAK,MAAUA,GAAK,MACpBA,GAAK,MAAUA,GAAK,MACpBA,IAAM,MACNA,IAAM,MACNA,GAAK,MAAUA,GAAK,MACpBA,IAAM,MACNA,IAAM,MACNA,IAAM,MACNA,IAAM,MACNA,IAAM,MACNA,IAAM,MACNA,IAAM,MACNA,IAAM,MACNA,GAAK,MAAUA,GAAK,MACpBA,IAAM,MACNA,GAAK,MAAUA,GAAK,MACpBA,GAAK,MAAUA,GAAK,MACpBA,IAAM,MACNA,IAAM,MACNA,IAAM,MACNA,IAAM,MACNA,IAAM,MACNA,IAAM,MACNA,IAAM,MACNA,IAAM,MACNA,IAAM,MACNA,IAAM,MACNA,IAAM,MACNA,IAAM,MACNA,GAAK,MAAUA,GAAK,MACpBA,GAAK,MAAUA,GAAK,MACpBA,IAAM,MACNA,IAAM,MACNA,IAAM,MACNA,IAAM,MACNA,IAAM,MACNA,IAAM,MACNA,GAAK,MAAUA,GAAK,MACpBA,GAAK,MAAUA,GAAK,MACpBA,GAAK,MAAUA,GAAK,MACpBA,IAAM,MACNA,IAAM,MACNA,IAAM,MACNA,GAAK,MAAUA,GAAK,MACpBA,IAAM,MACNA,GAAK,MAAUA,GAAK,MACpBA,IAAM,MACNA,IAAM,MACNA,IAAM,MACNA,IAAM,MACNA,IAAM,OACNA,GAAK,OAAUA,GAAK,OACpBA,GAAK,OAAUA,GAAK,OACpBA,GAAK,OAAUA,GAAK,OACpBA,GAAK,OAAUA,GAAK,OACpBA,GAAK,OAAUA,GAAK,OACpBA,IAAM,OACNA,GAAK,QAAWA,GAAK,QACrBA,GAAK,QAAWA,GAAK,QACrBA,GAAK,QAAWA,GAAK,QACrBA,GAAK,QAAWA,GAAK,QACrBA,IAAM,QACNA,IAAM,QACNA,GAAK,QAAWA,GAAK,QACrBA,GAAK,QAAWA,GAAK,QACrBA,GAAK,QAAWA,GAAK,SACrBA,GAAK,SAAYA,GAAK,OAC3B,CAEA,SAASC,GAAYD,EAAG,CACvB,OAAOA,IAAM,OACTA,GAAK,OAAUA,GAAK,OACpBA,GAAK,OAAUA,GAAK,KACzB,CAEA,SAASE,GAAOF,EAAG,CAClB,OAAOA,GAAK,MAAUA,GAAK,MACvBA,IAAM,MACNA,IAAM,MACNA,IAAM,MACNA,IAAM,MACNA,GAAK,MAAUA,GAAK,MACpBA,IAAM,MACNA,IAAM,MACNA,IAAM,MACNA,IAAM,MACNA,IAAM,MACNA,IAAM,MACNA,GAAK,MAAUA,GAAK,MACpBA,GAAK,MAAUA,GAAK,MACpBA,IAAM,MACNA,GAAK,MAAUA,GAAK,MACpBA,IAAM,MACNA,IAAM,MACNA,IAAM,MACNA,IAAM,MACNA,IAAM,MACNA,IAAM,MACNA,IAAM,MACNA,IAAM,MACNA,IAAM,MACNA,IAAM,MACNA,IAAM,MACNA,IAAM,MACNA,IAAM,MACNA,IAAM,MACNA,IAAM,MACNA,IAAM,MACNA,IAAM,MACNA,IAAM,MACNA,IAAM,MACNA,IAAM,OACNA,IAAM,OACNA,IAAM,OACNA,GAAK,OAAUA,GAAK,OACpBA,IAAM,OACNA,GAAK,OAAUA,GAAK,OACpBA,IAAM,OACNA,IAAM,OACNA,IAAM,OACNA,IAAM,OACNA,IAAM,OACNA,IAAM,OACNA,GAAK,OAAUA,GAAK,OACpBA,GAAK,OAAUA,GAAK,OACpBA,GAAK,OAAUA,GAAK,OACpBA,GAAK,OAAUA,GAAK,OACpBA,GAAK,OAAUA,GAAK,OACpBA,GAAK,OAAUA,GAAK,OACpBA,GAAK,OAAUA,GAAK,OACpBA,GAAK,OAAUA,GAAK,OACpBA,GAAK,OAAUA,GAAK,OACpBA,GAAK,OAAUA,GAAK,OACpBA,GAAK,OAAUA,GAAK,OACpBA,GAAK,OAAUA,GAAK,OACpBA,GAAK,OAAUA,GAAK,OACpBA,GAAK,OAAUA,GAAK,OACpBA,GAAK,OAAUA,GAAK,OACpBA,GAAK,OAAUA,GAAK,OACpBA,GAAK,OAAUA,GAAK,OACpBA,GAAK,OAAUA,GAAK,OACpBA,GAAK,OAAUA,GAAK,OACpBA,GAAK,OAAUA,GAAK,OACpBA,GAAK,OAAUA,GAAK,OACpBA,GAAK,OAAWA,GAAK,OACrBA,GAAK,OAAWA,GAAK,OACrBA,GAAK,OAAWA,GAAK,QACrBA,GAAK,QAAWA,GAAK,QACrBA,GAAK,QAAWA,GAAK,QACrBA,GAAK,QAAWA,GAAK,QACrBA,GAAK,QAAWA,GAAK,QACrBA,IAAM,QACNA,IAAM,QACNA,GAAK,QAAWA,GAAK,QACrBA,IAAM,QACNA,GAAK,QAAWA,GAAK,QACrBA,IAAM,QACNA,GAAK,QAAWA,GAAK,QACrBA,GAAK,QAAWA,GAAK,QACrBA,GAAK,QAAWA,GAAK,QACrBA,GAAK,QAAWA,GAAK,QACrBA,IAAM,QACNA,IAAM,QACNA,IAAM,QACNA,GAAK,QAAWA,GAAK,QACrBA,GAAK,QAAWA,GAAK,QACrBA,GAAK,QAAWA,GAAK,QACrBA,GAAK,QAAWA,GAAK,QACrBA,IAAM,QACNA,IAAM,QACNA,GAAK,QAAWA,GAAK,QACrBA,GAAK,QAAWA,GAAK,QACrBA,GAAK,QAAWA,GAAK,QACrBA,GAAK,QAAWA,GAAK,QACrBA,GAAK,QAAWA,GAAK,QACrBA,GAAK,QAAWA,GAAK,QACrBA,GAAK,QAAWA,GAAK,QACrBA,GAAK,QAAWA,GAAK,QACrBA,IAAM,QACNA,GAAK,QAAWA,GAAK,QACrBA,IAAM,QACNA,GAAK,QAAWA,GAAK,QACrBA,GAAK,QAAWA,GAAK,QACrBA,GAAK,QAAWA,GAAK,QACrBA,GAAK,QAAWA,GAAK,QACrBA,IAAM,QACNA,IAAM,QACNA,IAAM,QACNA,IAAM,QACNA,GAAK,QAAWA,GAAK,QACrBA,GAAK,QAAWA,GAAK,QACrBA,IAAM,QACNA,GAAK,QAAWA,GAAK,QACrBA,GAAK,QAAWA,GAAK,QACrBA,GAAK,QAAWA,GAAK,QACrBA,IAAM,QACNA,IAAM,QACNA,GAAK,QAAWA,GAAK,QACrBA,GAAK,QAAWA,GAAK,QACrBA,IAAM,QACNA,GAAK,QAAWA,GAAK,QACrBA,GAAK,QAAWA,GAAK,QACrBA,GAAK,QAAWA,GAAK,QACrBA,GAAK,QAAWA,GAAK,QACrBA,GAAK,QAAWA,GAAK,QACrBA,GAAK,QAAWA,GAAK,QACrBA,IAAM,QACNA,GAAK,QAAWA,GAAK,QACrBA,GAAK,QAAWA,GAAK,QACrBA,GAAK,QAAWA,GAAK,QACrBA,GAAK,QAAWA,GAAK,QACrBA,GAAK,QAAWA,GAAK,MAC1B,CAEA,SAASG,GAAYH,EAAG,CACvB,OAAID,GAAYC,CAAC,EAAU,YAEvBC,GAAYD,CAAC,EAAU,YAG1BA,IAAM,MACHA,GAAK,OAAUA,GAAK,OACpBA,GAAK,OAAUA,GAAK,OACpBA,GAAK,OAAUA,GAAK,OACpBA,GAAK,OAAUA,GAAK,OACpBA,GAAK,OAAUA,GAAK,OACpBA,GAAK,OAAUA,GAAK,MAEhB,YAIPA,GAAK,IAAQA,GAAK,KACfA,IAAM,KACNA,IAAM,KACNA,IAAM,KACNA,IAAM,KACNA,IAAM,KACNA,IAAM,KACNA,GAAK,OAAUA,GAAK,OACpBA,IAAM,OACNA,IAAM,MAEF,SAGJE,GAAOF,CAAC,EAAU,OAEf,SACR,CD9YA,SAASI,GAASC,EAAW,CAC5B,GAAI,CAAC,OAAO,cAAcA,CAAS,EAClC,MAAM,IAAI,UAAU,gCAAgC,OAAOA,CAAS,KAAK,CAE3E,CAEO,SAASC,GAAmBD,EAAW,CAC7C,OAAAD,GAASC,CAAS,EAEXE,GAAYF,CAAS,CAC7B,CDZA,IAAIG,GAAY,OAAO,eACnBC,GAAkB,CAACC,EAAKC,EAAKC,IAAUD,KAAOD,EAAMF,GAAUE,EAAKC,EAAK,CAAE,WAAY,GAAM,aAAc,GAAM,SAAU,GAAM,MAAAC,CAAM,CAAC,EAAIF,EAAIC,CAAG,EAAIC,EACtJC,GAAgB,CAACH,EAAKC,EAAKC,IAAUH,GAAgBC,EAAK,OAAOC,GAAQ,SAAWA,EAAM,GAAKA,EAAKC,CAAK,EAW7G,SAASE,GAAQC,EAAI,CACnB,OAAO,WAAC,2BAAwB,GAAC,EAAC,KAAK,OAAO,cAAcA,CAAE,CAAC,CACjE,CACA,SAASC,GAASD,EAAI,CACpB,GAAI,CAACA,GAAMA,EAAK,KACd,MAAO,GAGT,OADYE,GAAmBF,CAAE,EACpB,CACX,IAAK,YACL,IAAK,YACH,MAAO,GAET,IAAK,OACH,MAAO,CAACD,GAAQC,CAAE,EACpB,IAAK,SACH,MAAO,GACT,IAAK,YACH,MAAO,SAAUA,GAAMA,GAAM,OAAS,KAAO,GAC/C,IAAK,UACH,OAAO,WAAC,kBAAe,GAAC,EAAC,KAAK,OAAO,cAAcA,CAAE,CAAC,CAC1D,CACF,CACA,SAASG,GAA0BC,EAAMC,EAAI,CAC3C,OAAIA,IAAO,OAAS,CAACD,GAAQA,EAAO,KAAa,GAC1CA,IAAS,MAAQA,IAAS,MAAQA,IAAS,MAAQA,IAAS,IACrE,CACA,SAASE,GAAqBC,EAAM,CAClC,OAAOA,IAAS,MAAQA,GAAQ,OAASA,GAAQ,KACnD,CACA,IAAIC,GAAqBC,GAAW,WAAC,gBAAY,GAAC,GAC9CC,GAAoBD,GAAW,IAAI,EACvC,SAASA,GAAWE,EAAO,CACzB,OAAOC,EACP,SAASA,EAAML,EAAM,CACnB,OAAOA,IAAS,MAAQA,EAAO,IAAMI,EAAM,KAAK,OAAO,cAAcJ,CAAI,CAAC,CAC5E,CACF,CAGA,IAAIM,IACFC,GAAiB,CACjBA,EAAa,mBAAqB,EAClCA,EAAa,IAAM,KACnBA,EAAa,eAAiB,KAC9BA,EAAa,IAAM,KACnBA,EAAa,SAAW,MACxBA,EAAa,qBAAuB,MACpCA,EAAa,kBAAoB,MACjCA,EAAa,mBAAqB,CACpC,GAAGD,KAAgBA,GAAc,CAAC,EAAE,EACpC,SAASE,GAAkBR,EAAM,CAC/B,GAAIA,IAASS,GAAM,KAAOC,GAA0BV,CAAI,GAAKG,GAAkBH,CAAI,EACjF,OAAOW,GAAU,yBAEnB,IAAIrB,EAAQ,EACZ,GAAIU,GAAQ,KAAM,CAChB,GAAID,GAAqBC,CAAI,EAC3B,OAAOM,GAAY,qBAErB,OAAQZ,GAASM,CAAI,EAAG,CACtB,KAAK,KACH,OAAOM,GAAY,IACrB,IAAK,GACHhB,GAASgB,GAAY,IACrB,KACJ,CACF,CACA,OAAIL,GAAmBD,CAAI,IACzBV,GAASqB,GAAU,2BAEdrB,CACT,CACA,SAASsB,GAA2BC,EAAQC,EAAcC,EAAU,CAClE,GAAI,CAACC,GAAuBH,CAAM,EAChC,OAAOA,EAET,IAAMI,EAAcH,EAAa,EAC3BI,EAAYV,GAAkBS,CAAW,EAC/C,MAAO,CAACA,GAAeE,GAAoBD,CAAS,EAAIL,EAASjB,GAA0BqB,EAAaF,CAAQ,EAAIT,GAAY,eAAiBc,GAASF,CAAS,CACrK,CACA,SAASE,GAASF,EAAW,CAC3B,OAAOA,EAAY,CAACZ,GAAY,GAClC,CAGA,SAASa,GAAoBE,EAAU,CACrC,MAAO,GAAQA,EAAWV,GAAW,yBACvC,CACA,SAASW,GAAoBD,EAAU,CACrC,OAAQA,EAAWf,GAAY,kBAAoBK,GAAW,yBAChE,CACA,SAASY,GAAMF,EAAU,CACvB,MAAO,GAAQA,EAAWf,GAAY,IACxC,CACA,SAASkB,GAAMH,EAAU,CACvB,OAAOA,IAAaf,GAAY,GAClC,CACA,SAASmB,GAAWJ,EAAU,CAC5B,MAAO,GAAQA,EAAWf,GAAY,SACxC,CACA,SAASU,GAAuBK,EAAU,CACxC,OAAOA,IAAaf,GAAY,oBAClC,CACA,SAASoB,GAAqBL,EAAU,CACtC,MAAO,GAAQA,EAAWf,GAAY,mBACxC,CAGA,SAASqB,GAAoB3B,EAAM,CACjC,MAAO,GAAQA,GAAQA,GAAQ,OAASA,GAAQ,MAClD,CACA,SAAS4B,GAAmB5B,EAAM,CAChC,MAAO,GAAQA,GAAQA,GAAQ,OAASA,GAAQ,MAClD,CACA,SAAS6B,GAA0B7B,EAAM8B,EAAUC,EAAgB,CACjE,GAAID,EAAS,aAAe,EAC1B,OAAO9B,EAOT,IAAMgC,EALiBD,EAAe,CAEpC,MAAO,CAAE,GAAGD,EAAU,aAAcA,EAAS,aAAe,CAAE,EAC9D,IAAKA,CACP,CAAC,EACwC,YAAY,CAAC,EACtD,OAAOE,GAAqBA,GAAqB,MAAQA,EAAoBhC,CAC/E,CACA,SAASiC,GAAoBC,EAAcJ,EAAUC,EAAgB,CACnE,IAAMI,EAAgBD,GAAgB,MAAQ,EAAI,EAClD,GAAIJ,EAAS,aAAe,EAAIK,EAC9B,OAAO,KAET,IAAMC,EAAaN,EAAS,aAAeK,EAAgB,EACrDE,EAAoBN,EAAe,CAEvC,MAAO,CACL,GAAGD,EACH,aAAcM,GAAc,EAAIA,EAAa,CAC/C,EACA,IAAK,CACH,GAAGN,EACH,aAAcA,EAAS,aAAeK,CACxC,CACF,CAAC,EACKG,EAAkBD,EAAkB,WACxCA,EAAkB,OAAS,CAC7B,EACA,GAAI,OAAO,MAAMC,CAAe,EAC9B,OAAO,KAET,GAAID,EAAkB,OAAS,GAAKC,EAAkB,OAAS,MAAQA,EACrE,OAAOA,EAET,IAAMC,EAAuBF,EAAkB,YAAY,CAAC,EAC5D,OAAIE,GAAwBA,GAAwB,MAC3CA,EAEFD,CACT,CACA,IAAIE,GAAkB,KAAM,CAQ1B,YAAYN,EAAcJ,EAAUC,EAAgB,CAClD,KAAK,aAAeG,EACpB,KAAK,SAAWJ,EAChB,KAAK,eAAiBC,EACtBxC,GAAc,KAAM,aAAa,CACnC,CAUA,OAAQ,CACN,OAAI,KAAK,cAAgB,SACvB,KAAK,YAAc0C,GACjB,KAAK,aACL,KAAK,SACL,KAAK,cACP,GAEK,KAAK,WACd,CACF,EACA,SAASQ,GAAsBzC,EAAM8B,EAAUC,EAAgB,CAC7D,IAAMW,EAAgBX,EAAe,CACnC,MAAOD,EACP,IAAK,CAAE,GAAGA,EAAU,aAAcA,EAAS,aAAe,CAAE,CAC9D,CAAC,EAAE,YAAY,CAAC,EAChB,OAAOY,GAAiBA,GAAiB,MAAQA,EAAgB1C,CACnE,CL9LA,IAAI2C,GAAY,CACd,KAAM,YACN,WAAYC,GACZ,SAAUC,EACZ,EACA,SAASD,GAAoBE,EAAQC,EAAS,CAC5C,IAAIC,EAAQ,GACRC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACJ,KAAO,EAAER,EAAQF,EAAO,QACtB,GAAIA,EAAOE,CAAK,EAAE,CAAC,IAAM,SAAWF,EAAOE,CAAK,EAAE,CAAC,EAAE,OAAS,qBAAuBF,EAAOE,CAAK,EAAE,CAAC,EAAE,QAEpG,IADAC,EAAOD,EACAC,KACL,GAAIH,EAAOG,CAAI,EAAE,CAAC,IAAM,QAAUH,EAAOG,CAAI,EAAE,CAAC,EAAE,OAAS,qBAAuBH,EAAOG,CAAI,EAAE,CAAC,EAAE,OAClGF,EAAQ,eAAeD,EAAOG,CAAI,EAAE,CAAC,CAAC,EAAE,WAAW,CAAC,IAAMF,EAAQ,eAAeD,EAAOE,CAAK,EAAE,CAAC,CAAC,EAAE,WAAW,CAAC,EAAG,CAChH,IAAKF,EAAOG,CAAI,EAAE,CAAC,EAAE,QAAUH,EAAOE,CAAK,EAAE,CAAC,EAAE,SAAWF,EAAOE,CAAK,EAAE,CAAC,EAAE,IAAI,OAASF,EAAOE,CAAK,EAAE,CAAC,EAAE,MAAM,QAAU,GAAK,GAAGF,EAAOG,CAAI,EAAE,CAAC,EAAE,IAAI,OAASH,EAAOG,CAAI,EAAE,CAAC,EAAE,MAAM,OAASH,EAAOE,CAAK,EAAE,CAAC,EAAE,IAAI,OAASF,EAAOE,CAAK,EAAE,CAAC,EAAE,MAAM,QAAU,GAC3P,SAEFM,EAAMR,EAAOG,CAAI,EAAE,CAAC,EAAE,IAAI,OAASH,EAAOG,CAAI,EAAE,CAAC,EAAE,MAAM,OAAS,GAAKH,EAAOE,CAAK,EAAE,CAAC,EAAE,IAAI,OAASF,EAAOE,CAAK,EAAE,CAAC,EAAE,MAAM,OAAS,EAAI,EAAI,EAC7I,IAAMS,EAAQ,CAAE,GAAGX,EAAOG,CAAI,EAAE,CAAC,EAAE,GAAI,EACjCS,EAAM,CAAE,GAAGZ,EAAOE,CAAK,EAAE,CAAC,EAAE,KAAM,EACxCW,GAAUF,EAAO,CAACH,CAAG,EACrBK,GAAUD,EAAKJ,CAAG,EAClBF,EAAkB,CAChB,KAAME,EAAM,EAAIM,GAAM,eAAiBA,GAAM,iBAC7C,MAAAH,EACA,IAAK,CAAE,GAAGX,EAAOG,CAAI,EAAE,CAAC,EAAE,GAAI,CAChC,EACAI,EAAkB,CAChB,KAAMC,EAAM,EAAIM,GAAM,eAAiBA,GAAM,iBAC7C,MAAO,CAAE,GAAGd,EAAOE,CAAK,EAAE,CAAC,EAAE,KAAM,EACnC,IAAAU,CACF,EACAP,EAAO,CACL,KAAMG,EAAM,EAAIM,GAAM,WAAaA,GAAM,aACzC,MAAO,CAAE,GAAGd,EAAOG,CAAI,EAAE,CAAC,EAAE,GAAI,EAChC,IAAK,CAAE,GAAGH,EAAOE,CAAK,EAAE,CAAC,EAAE,KAAM,CACnC,EACAE,EAAQ,CACN,KAAMI,EAAM,EAAIM,GAAM,OAASA,GAAM,SACrC,MAAO,CAAE,GAAGR,EAAgB,KAAM,EAClC,IAAK,CAAE,GAAGC,EAAgB,GAAI,CAChC,EACAP,EAAOG,CAAI,EAAE,CAAC,EAAE,IAAM,CAAE,GAAGG,EAAgB,KAAM,EACjDN,EAAOE,CAAK,EAAE,CAAC,EAAE,MAAQ,CAAE,GAAGK,EAAgB,GAAI,EAClDE,EAAa,CAAC,EACVT,EAAOG,CAAI,EAAE,CAAC,EAAE,IAAI,OAASH,EAAOG,CAAI,EAAE,CAAC,EAAE,MAAM,SACrDM,EAAaM,GAAKN,EAAY,CAC5B,CAAC,QAAST,EAAOG,CAAI,EAAE,CAAC,EAAGF,CAAO,EAClC,CAAC,OAAQD,EAAOG,CAAI,EAAE,CAAC,EAAGF,CAAO,CACnC,CAAC,GAEHQ,EAAaM,GAAKN,EAAY,CAC5B,CAAC,QAASL,EAAOH,CAAO,EACxB,CAAC,QAASK,EAAiBL,CAAO,EAClC,CAAC,OAAQK,EAAiBL,CAAO,EACjC,CAAC,QAASI,EAAMJ,CAAO,CACzB,CAAC,EAECA,EAAQ,OAAO,WAAW,WAAW,KAGvCQ,EAAaM,GACXN,EACAO,GACEf,EAAQ,OAAO,WAAW,WAAW,KACrCD,EAAO,MAAMG,EAAO,EAAGD,CAAK,EAC5BD,CACF,CACF,EACAQ,EAAaM,GAAKN,EAAY,CAC5B,CAAC,OAAQJ,EAAMJ,CAAO,EACtB,CAAC,QAASM,EAAiBN,CAAO,EAClC,CAAC,OAAQM,EAAiBN,CAAO,EACjC,CAAC,OAAQG,EAAOH,CAAO,CACzB,CAAC,EACGD,EAAOE,CAAK,EAAE,CAAC,EAAE,IAAI,OAASF,EAAOE,CAAK,EAAE,CAAC,EAAE,MAAM,QACvDQ,EAAS,EACTD,EAAaM,GAAKN,EAAY,CAC5B,CAAC,QAAST,EAAOE,CAAK,EAAE,CAAC,EAAGD,CAAO,EACnC,CAAC,OAAQD,EAAOE,CAAK,EAAE,CAAC,EAAGD,CAAO,CACpC,CAAC,GAEDS,EAAS,EAEXO,GAAOjB,EAAQG,EAAO,EAAGD,EAAQC,EAAO,EAAGM,CAAU,EACrDP,EAAQC,EAAOM,EAAW,OAASC,EAAS,EAC5C,KACF,EAKN,IADAR,EAAQ,GACD,EAAEA,EAAQF,EAAO,QAClBA,EAAOE,CAAK,EAAE,CAAC,EAAE,OAAS,sBAC5BF,EAAOE,CAAK,EAAE,CAAC,EAAE,KAAO,QAG5B,OAAOF,CACT,CACA,SAASD,GAAkBmB,EAASC,EAAI,CACtC,IAAMC,EAAmB,KAAK,OAAO,WAAW,iBAAiB,KAC3D,CAAE,IAAAC,EAAK,eAAAC,EAAgB,SAAUC,CAAkB,EAAI,KACvDC,EAAWC,GAAmBF,CAAiB,EAEnDG,GAA0BH,EAAmBF,EAAI,EAAGC,CAAc,EAChEC,EACEI,EAASC,GAAkBJ,CAAQ,EACnCK,EAAc,IAAIC,GAAgBN,EAAUH,EAAI,EAAGC,CAAc,EACjES,EAAgBC,GACpBL,EACAE,EAAY,MAAM,KAAKA,CAAW,EAClCL,CACF,EACIS,EACJ,OAAOtB,EACP,SAASA,EAAMuB,EAAM,CACnB,OACEA,IAASC,GAAM,UAAqBA,GAAM,WAG5CF,EAASC,EACThB,EAAQ,MAAM,mBAAmB,EAC1BkB,EAAOF,CAAI,CACpB,CACA,SAASE,EAAOF,EAAM,CACpB,GAAIA,IAASD,EACX,OAAAf,EAAQ,QAAQgB,CAAI,EACbE,EAET,IAAMC,EAAQnB,EAAQ,KAAK,mBAAmB,EACxCoB,EAAOC,GAAoBL,CAAI,EAAIM,GAAsBN,EAAMb,EAAI,EAAGC,CAAc,EAAIY,EACxFO,EAAQb,GAAkBU,CAAI,EAEpC,IAAMI,EAA0BC,GAAoBZ,CAAa,EAC3Da,EAAiCF,GAA2BG,GAAoBd,CAAa,EAC7Fe,EAAyBH,GAAoBF,CAAK,EAClDM,EAAgCD,GAA0BD,GAAoBJ,CAAK,EACnFO,EAAiBC,GAAWlB,CAAa,EACzC5B,EAAO,CAAC4C,GAAiCD,IAA2BF,GAAkCI,IAAmB5B,EAAiB,SAASc,CAAI,EACvJgB,EAAQ,CAACN,GAAkCF,IAA4BK,GAAiCI,GAAMV,CAAK,IAAMrB,EAAiB,SAASI,CAAQ,EACjK,OAAAa,EAAM,MAAQ,GACZJ,IAAWE,GAAM,SAAWhC,EAAOA,IAASiD,GAAqBrB,CAAa,GAAK,CAACmB,IAEtFb,EAAM,OAAS,GACbJ,IAAWE,GAAM,SAAWe,EAAQA,IAAUE,GAAqBX,CAAK,GAAK,CAACtC,IAEzEgB,EAAGe,CAAI,CAChB,CACF,CACA,SAASrB,GAAUwC,EAAO3C,EAAQ,CAChC2C,EAAM,QAAU3C,EAChB2C,EAAM,QAAU3C,EAChB2C,EAAM,cAAgB3C,CACxB,CAGA,SAAS4C,IAAuB,CAC9B,MAAO,CACL,KAAM,CACJ,CAACnB,GAAO,QAAQ,EAAGtC,GACnB,CAACsC,GAAO,UAAU,EAAGtC,EACvB,EACA,WAAY,CAAE,KAAM,CAACA,EAAS,CAAE,CAClC,CACF,CD/LA,SAAS0D,IAAoB,CAC3B,IAAMC,EAAO,KAAK,KAAK,GAGrBA,EAAK,sBAAwBA,EAAK,oBAAsB,CAAC,IAEvC,KAAKC,GAAqB,CAAC,CACjD,CSTAC,ICAAC,IAkBA,SAASC,GAA4BC,EAAS,CAE5C,IAAIC,GADaD,GAAW,CAAC,GACP,YAChBE,EAAY,CAChB,KAAM,gBACN,SAAUC,EACV,WAAYC,CACd,EACA,OAAIH,GAAW,OACbA,EAAS,IAEJ,CACL,KAAM,CAAE,CAACI,GAAM,KAAK,EAAGH,CAAU,EACjC,WAAY,CAAE,KAAM,CAACA,CAAS,CAAE,EAChC,iBAAkB,CAAE,KAAM,CAACG,GAAM,KAAK,CAAE,CAC1C,EACA,SAASD,EAAwBE,EAAQC,EAAS,CAChD,IAAIC,EAAQ,GACZ,KAAO,EAAEA,EAAQF,EAAO,QACtB,GAAIA,EAAOE,CAAK,EAAE,CAAC,IAAM,SAAWF,EAAOE,CAAK,EAAE,CAAC,EAAE,OAAS,kCAAoCF,EAAOE,CAAK,EAAE,CAAC,EAAE,OAAQ,CACzH,IAAIC,EAAOD,EACX,KAAOC,KACL,GAAIH,EAAOG,CAAI,EAAE,CAAC,IAAM,QAAUH,EAAOG,CAAI,EAAE,CAAC,EAAE,OAAS,kCAAoCH,EAAOG,CAAI,EAAE,CAAC,EAAE,OAC/GH,EAAOE,CAAK,EAAE,CAAC,EAAE,IAAI,OAASF,EAAOE,CAAK,EAAE,CAAC,EAAE,MAAM,SAAWF,EAAOG,CAAI,EAAE,CAAC,EAAE,IAAI,OAASH,EAAOG,CAAI,EAAE,CAAC,EAAE,MAAM,OAAQ,CACzHH,EAAOE,CAAK,EAAE,CAAC,EAAE,KAAO,wBACxBF,EAAOG,CAAI,EAAE,CAAC,EAAE,KAAO,wBACvB,IAAMC,EAAgB,CACpB,KAAM,gBACN,MAAO,OAAO,OAAO,CAAC,EAAGJ,EAAOG,CAAI,EAAE,CAAC,EAAE,KAAK,EAC9C,IAAK,OAAO,OAAO,CAAC,EAAGH,EAAOE,CAAK,EAAE,CAAC,EAAE,GAAG,CAC7C,EACMG,EAAO,CACX,KAAM,oBACN,MAAO,OAAO,OAAO,CAAC,EAAGL,EAAOG,CAAI,EAAE,CAAC,EAAE,GAAG,EAC5C,IAAK,OAAO,OAAO,CAAC,EAAGH,EAAOE,CAAK,EAAE,CAAC,EAAE,KAAK,CAC/C,EACMI,EAAa,CACjB,CAAC,QAASF,EAAeH,CAAO,EAChC,CAAC,QAASD,EAAOG,CAAI,EAAE,CAAC,EAAGF,CAAO,EAClC,CAAC,OAAQD,EAAOG,CAAI,EAAE,CAAC,EAAGF,CAAO,EACjC,CAAC,QAASI,EAAMJ,CAAO,CACzB,EACMM,EAAaN,EAAQ,OAAO,WAAW,WAAW,KACpDM,GACFC,GACEF,EACAA,EAAW,OACX,EACAG,GAAWF,EAAYP,EAAO,MAAMG,EAAO,EAAGD,CAAK,EAAGD,CAAO,CAC/D,EAEFO,GAAOF,EAAYA,EAAW,OAAQ,EAAG,CACvC,CAAC,OAAQD,EAAMJ,CAAO,EACtB,CAAC,QAASD,EAAOE,CAAK,EAAE,CAAC,EAAGD,CAAO,EACnC,CAAC,OAAQD,EAAOE,CAAK,EAAE,CAAC,EAAGD,CAAO,EAClC,CAAC,OAAQG,EAAeH,CAAO,CACjC,CAAC,EACDO,GAAOR,EAAQG,EAAO,EAAGD,EAAQC,EAAO,EAAGG,CAAU,EACrDJ,EAAQC,EAAOG,EAAW,OAAS,EACnC,KACF,CAEJ,CAGF,IADAJ,EAAQ,GACD,EAAEA,EAAQF,EAAO,QAClBA,EAAOE,CAAK,EAAE,CAAC,EAAE,OAAS,mCAC5BF,EAAOE,CAAK,EAAE,CAAC,EAAE,KAAOQ,GAAM,MAGlC,OAAOV,CACT,CACA,SAASH,EAAsBc,EAASC,EAAIC,EAAK,CAC/C,GAAM,CAAE,IAAAC,EAAK,eAAAC,EAAgB,SAAUC,CAAkB,EAAI,KACvDC,EAAWC,GAAmBF,CAAiB,EAEnDG,GAA0BH,EAAmBF,EAAI,EAAGC,CAAc,EAChEC,EACEI,EAASC,GAAkBJ,CAAQ,EACnCK,EAAc,IAAIC,GAAgBN,EAAUH,EAAI,EAAGC,CAAc,EACjES,EAAgBC,GACpBL,EACAE,EAAY,MAAM,KAAKA,CAAW,EAClCL,CACF,EACMjB,EAAS,KAAK,OAChB0B,EAAO,EACX,OAAOC,EACP,SAASA,EAAMC,EAAM,CAEnB,OADgB7B,GAAM,MAClBkB,IAAalB,GAAM,OAASC,EAAOA,EAAO,OAAS,CAAC,EAAE,CAAC,EAAE,OAASU,GAAM,gBACnEG,EAAIe,CAAI,GAEjBjB,EAAQ,MAAM,gCAAgC,EACvCkB,EAAKD,CAAI,EAClB,CACA,SAASC,EAAKD,EAAM,CAClB,IAAME,EAAUT,GAAkBJ,CAAQ,EAC1C,GAAIW,IAAS7B,GAAM,MACjB,OAAI2B,EAAO,EAAUb,EAAIe,CAAI,GAC7BjB,EAAQ,QAAQiB,CAAI,EACpBF,IACOG,GAET,GAAIH,EAAO,GAAK,CAAC/B,EAAQ,OAAOkB,EAAIe,CAAI,EACxC,IAAMG,EAAQpB,EAAQ,KAAK,gCAAgC,EACrDqB,EAAOC,GAAoBL,CAAI,EAAIM,GAAsBN,EAAMd,EAAI,EAAGC,CAAc,EAAIa,EACxFO,EAAQd,GAAkBW,CAAI,EAE9BI,EAD0BC,GAAoBb,CAAa,GACCc,GAAoBd,CAAa,EAE7Fe,EADyBF,GAAoBF,CAAK,GACQG,GAAoBH,CAAK,EACnFK,EAAiBC,GAAMjB,CAAa,GAAKkB,GAAMZ,CAAO,EAC5D,OAAAC,EAAM,MAAQ,CAACQ,GAAiCJ,IAAUQ,GAAU,qBAAuBP,GAAkCI,GAC7HT,EAAM,OAAS,CAACK,GAAkCN,IAAYa,GAAU,qBAAuBJ,GAAiCE,GAAMN,CAAK,GACpIvB,EAAGgB,CAAI,CAChB,CACF,CACF,CDpIA,SAASgB,GAAkCC,EAAS,CAClD,IAAMC,EAAO,KAAK,KAAK,GAGrBA,EAAK,sBAAwBA,EAAK,oBAAsB,CAAC,IAEvC,KAAKC,GAA4BF,CAAO,CAAC,CAC/D,CVX6H,IAAIG,GAAE,IAAI,IAAI,CAAC,SAAS,SAAS,SAAS,SAAS,SAAS,SAAS,SAAS,SAAS,SAAS,SAAS,SAAS,SAAS,SAAS,SAAS,SAAS,SAAS,SAAS,SAAS,SAAS,QAAQ,CAAC,EAAEC,GAAE,gCAAgCC,GAAEC,GAAG,CAAC,GAAGA,EAAE,SAAS,SAAS,EAAE,MAAQ,GAAM,IAAIC,EAAED,EAAE,SAAS,CAAC,EAAE,OAAOC,EAAE,OAAO,QAAQA,EAAE,QAAQD,EAAE,GAAG,EAAEE,GAAEF,GAAG,CAAC,IAAIC,EAAE,EAAE,QAAQE,KAAKH,EAAE,CAAC,GAAGH,GAAE,IAAIM,CAAC,EAAE,OAAOF,EAAEA,GAAGE,EAAE,MAAO,CAAC,OAAO,IAAI,EAAEC,GAAE,CAACJ,EAAEC,KAAK,CAAC,GAAGA,EAAE,IAAID,EAAE,SAAS,CAAC,CAAC,KAAK,OAAO,MAAMA,CAAC,CAAC,CAAC,GAAGK,GAAEL,IAAI,CAAC,KAAK,OAAO,MAAMA,CAAC,GAAGM,GAAE,IAAIN,GAAG,CAACO,GAAMP,EAAE,OAAO,CAACC,EAAEE,EAAEK,IAAI,CAAC,GAAG,CAACA,GAAG,OAAOL,GAAG,UAAU,CAACJ,GAAEE,CAAC,GAAG,CAACH,GAAE,KAAKG,EAAE,GAAG,EAAE,OAAO,IAAIQ,EAAEP,GAAED,EAAE,GAAG,EAAE,GAAGQ,IAAI,MAAMA,IAAI,EAAE,OAAO,IAAIC,EAAET,EAAE,IAAI,MAAM,EAAEQ,CAAC,EAAEE,EAAEV,EAAE,IAAI,MAAMQ,CAAC,EAAEG,EAAER,GAAEM,EAAET,CAAC,EAAEY,EAAER,GAAEM,CAAC,EAAE,OAAOH,EAAE,SAAS,OAAOL,EAAE,EAAES,EAAEC,CAAC,EAAEV,EAAE,CAAC,CAAC,CAAE,EAAE,SAASW,IAAG,CAAC,IAAId,EAAE,CAACe,EAAC,EAAEd,EAAE,CAACK,GAAEU,EAAC,EAAEb,EAAE,CAAC,GAAGH,EAAE,GAAGC,CAAC,EAAE,MAAO,CAAC,KAAK,MAAM,KAAK,MAAM,oBAAoBD,EAAE,mBAAmBC,EAAE,cAAcE,CAAC,CAAC,CAAC,IAAIc,GAAEH,GAAE,EYAt+BI,ICAAC,ICAAC,ICAAC,ICAAC,IAAA,IAAMC,GAAN,cAAyB,KAAM,CAC7B,YAAYC,EAAS,CACnB,MAAMA,CAAO,EACb,KAAK,KAAO,YACd,CACF,ECLAC,IACA,SAASC,GAAMC,EAAW,CACxB,OAAOC,GAAQD,CAAS,CAC1B,CACA,SAASC,GAAQD,EAAW,CAC1B,OAAI,MAAM,QAAQA,CAAS,EAClBE,GAAWF,CAAS,EAEzBA,aAAqB,OAChBA,EAEL,OAAOA,GAAc,SAChBG,GAASH,CAAS,EAEpBA,CACT,CACA,SAASE,GAAWE,EAAK,CACvB,IAAIC,EAAI,CAAC,EACT,QAASC,EAAI,EAAGC,EAAMH,EAAI,OAAQE,EAAIC,EAAKD,IACzCD,EAAEC,CAAC,EAAIL,GAAQG,EAAIE,CAAC,CAAC,EAEvB,OAAOD,CACT,CACA,SAASF,GAASK,EAAK,CACrB,IAAIH,EAAI,CAAC,EACT,QAASI,KAAOD,EACdH,EAAEI,CAAG,EAAIR,GAAQO,EAAIC,CAAG,CAAC,EAE3B,OAAOJ,CACT,CACA,SAASK,GAAaC,KAAWC,EAAS,CACxC,OAAAA,EAAQ,QAASC,GAAW,CAC1B,QAASJ,KAAOI,EACdF,EAAOF,CAAG,EAAII,EAAOJ,CAAG,CAE5B,CAAC,EACME,CACT,CACA,SAASG,GAASC,EAAM,CACtB,IAAMC,EAAM,CAACD,EAAK,YAAY,GAAG,GAAK,CAACA,EAAK,YAAY,IAAI,EAC5D,OAAIC,IAAQ,EACHD,EACE,CAACC,IAAQD,EAAK,OAAS,EACzBD,GAASC,EAAK,UAAU,EAAGA,EAAK,OAAS,CAAC,CAAC,EAE3CA,EAAK,OAAO,CAACC,EAAM,CAAC,CAE/B,CACA,IAAIC,GAAyB,yCACzBC,GAAc,KAAM,CACtB,OAAO,YAAYC,EAAa,CAC9B,OAAIA,IAAgB,KACX,IAETF,GAAuB,UAAY,EAC5BA,GAAuB,KAAKE,CAAW,EAChD,CACA,OAAO,gBAAgBA,EAAaC,EAAeC,EAAgB,CACjE,OAAOF,EAAY,QAAQF,GAAwB,CAACK,EAAOC,EAAOC,EAAcC,IAAY,CAC1F,IAAIC,EAAUL,EAAe,SAASE,GAASC,EAAc,EAAE,CAAC,EAChE,GAAIE,EAAS,CACX,IAAIC,EAASP,EAAc,UAAUM,EAAQ,MAAOA,EAAQ,GAAG,EAC/D,KAAOC,EAAO,CAAC,IAAM,KACnBA,EAASA,EAAO,UAAU,CAAC,EAE7B,OAAQF,EAAS,CACf,IAAK,WACH,OAAOE,EAAO,YAAY,EAC5B,IAAK,SACH,OAAOA,EAAO,YAAY,EAC5B,QACE,OAAOA,CACX,CACF,KACE,QAAOL,CAEX,CAAC,CACH,CACF,EACA,SAASM,GAAOC,EAAGC,EAAG,CACpB,OAAID,EAAIC,EACC,GAELD,EAAIC,EACC,EAEF,CACT,CACA,SAASC,GAAUF,EAAGC,EAAG,CACvB,GAAID,IAAM,MAAQC,IAAM,KACtB,MAAO,GAET,GAAI,CAACD,EACH,MAAO,GAET,GAAI,CAACC,EACH,MAAO,GAET,IAAIE,EAAOH,EAAE,OACTI,EAAOH,EAAE,OACb,GAAIE,IAASC,EAAM,CACjB,QAAS3B,EAAI,EAAGA,EAAI0B,EAAM1B,IAAK,CAC7B,IAAI4B,EAAMN,GAAOC,EAAEvB,CAAC,EAAGwB,EAAExB,CAAC,CAAC,EAC3B,GAAI4B,IAAQ,EACV,OAAOA,CAEX,CACA,MAAO,EACT,CACA,OAAOF,EAAOC,CAChB,CACA,SAASE,GAAgBC,EAAK,CAU5B,MATI,qBAAkB,KAAKA,CAAG,GAG1B,kBAAkB,KAAKA,CAAG,GAG1B,kBAAkB,KAAKA,CAAG,GAG1B,kBAAkB,KAAKA,CAAG,EAIhC,CACA,SAASC,GAAuBC,EAAO,CACrC,OAAOA,EAAM,QAAQ,0CAA2C,MAAM,CACxE,CACA,IAAIC,GAAW,KAAM,CACnB,YAAYC,EAAI,CACd,KAAK,GAAKA,CACZ,CACA,MAAwB,IAAI,IAC5B,IAAI/B,EAAK,CACP,GAAI,KAAK,MAAM,IAAIA,CAAG,EACpB,OAAO,KAAK,MAAM,IAAIA,CAAG,EAE3B,IAAM6B,EAAQ,KAAK,GAAG7B,CAAG,EACzB,YAAK,MAAM,IAAIA,EAAK6B,CAAK,EAClBA,CACT,CACF,EAGIG,GAAQ,KAAM,CAChB,YAAYC,EAAWC,EAAWC,EAAO,CACvC,KAAK,UAAYF,EACjB,KAAK,UAAYC,EACjB,KAAK,MAAQC,CACf,CACA,OAAO,mBAAmB/B,EAAQgC,EAAU,CAC1C,OAAO,KAAK,sBAAsBC,GAAWjC,CAAM,EAAGgC,CAAQ,CAChE,CACA,OAAO,sBAAsBhC,EAAQgC,EAAU,CAC7C,OAAOE,GAAwBlC,EAAQgC,CAAQ,CACjD,CACA,iBAAmB,IAAIN,GACpBS,GAAc,KAAK,MAAM,MAAMA,CAAS,CAC3C,EACA,aAAc,CACZ,OAAO,KAAK,UAAU,YAAY,CACpC,CACA,aAAc,CACZ,OAAO,KAAK,SACd,CACA,MAAMC,EAAW,CACf,GAAIA,IAAc,KAChB,OAAO,KAAK,UAEd,IAAMD,EAAYC,EAAU,UAEtBC,EADuB,KAAK,iBAAiB,IAAIF,CAAS,EACrB,KACxCG,GAAMC,GAA8BH,EAAU,OAAQE,EAAE,YAAY,CACvE,EACA,OAAKD,EAGE,IAAIG,GACTH,EAAc,UACdA,EAAc,WACdA,EAAc,UAChB,EANS,IAOX,CACF,EACII,GAAa,MAAMC,EAAY,CACjC,YAAYC,EAAQR,EAAW,CAC7B,KAAK,OAASQ,EACd,KAAK,UAAYR,CACnB,CACA,OAAO,KAAKjC,EAAM0C,EAAY,CAC5B,QAAWC,KAAQD,EACjB1C,EAAO,IAAIwC,GAAYxC,EAAM2C,CAAI,EAEnC,OAAO3C,CACT,CACA,OAAO,QAAQ4C,EAAU,CACvB,IAAIhC,EAAS,KACb,QAASrB,EAAI,EAAGA,EAAIqD,EAAS,OAAQrD,IACnCqB,EAAS,IAAI4B,GAAY5B,EAAQgC,EAASrD,CAAC,CAAC,EAE9C,OAAOqB,CACT,CACA,KAAKqB,EAAW,CACd,OAAO,IAAIO,GAAY,KAAMP,CAAS,CACxC,CACA,aAAc,CACZ,IAAIY,EAAO,KACLjC,EAAS,CAAC,EAChB,KAAOiC,GACLjC,EAAO,KAAKiC,EAAK,SAAS,EAC1BA,EAAOA,EAAK,OAEd,OAAAjC,EAAO,QAAQ,EACRA,CACT,CACA,UAAW,CACT,OAAO,KAAK,YAAY,EAAE,KAAK,GAAG,CACpC,CACA,QAAQkC,EAAO,CACb,OAAI,OAASA,EACJ,GAEL,KAAK,SAAW,KACX,GAEF,KAAK,OAAO,QAAQA,CAAK,CAClC,CACA,sBAAsBC,EAAM,CAC1B,IAAMnC,EAAS,CAAC,EACZiC,EAAO,KACX,KAAOA,GAAQA,IAASE,GACtBnC,EAAO,KAAKiC,EAAK,SAAS,EAC1BA,EAAOA,EAAK,OAEd,OAAOA,IAASE,EAAOnC,EAAO,QAAQ,EAAI,MAC5C,CACF,EACA,SAASyB,GAA8BH,EAAWc,EAAc,CAC9D,GAAIA,EAAa,SAAW,EAC1B,MAAO,GAET,QAASxC,EAAQ,EAAGA,EAAQwC,EAAa,OAAQxC,IAAS,CACxD,IAAIyC,EAAeD,EAAaxC,CAAK,EACjC0C,EAAiB,GACrB,GAAID,IAAiB,IAAK,CACxB,GAAIzC,IAAUwC,EAAa,OAAS,EAClC,MAAO,GAETC,EAAeD,EAAa,EAAExC,CAAK,EACnC0C,EAAiB,EACnB,CACA,KAAOhB,GACD,CAAAiB,GAAcjB,EAAU,UAAWe,CAAY,GADnC,CAIhB,GAAIC,EACF,MAAO,GAEThB,EAAYA,EAAU,MACxB,CACA,GAAI,CAACA,EACH,MAAO,GAETA,EAAYA,EAAU,MACxB,CACA,MAAO,EACT,CACA,SAASiB,GAAclB,EAAWgB,EAAc,CAC9C,OAAOA,IAAiBhB,GAAaA,EAAU,WAAWgB,CAAY,GAAKhB,EAAUgB,EAAa,MAAM,IAAM,GAChH,CACA,IAAIX,GAAkB,KAAM,CAC1B,YAAYc,EAAWC,EAAcC,EAAc,CACjD,KAAK,UAAYF,EACjB,KAAK,aAAeC,EACpB,KAAK,aAAeC,CACtB,CACF,EACA,SAASvB,GAAWjC,EAAQ,CAC1B,GAAI,CAACA,EACH,MAAO,CAAC,EAEV,GAAI,CAACA,EAAO,UAAY,CAAC,MAAM,QAAQA,EAAO,QAAQ,EACpD,MAAO,CAAC,EAEV,IAAIyD,EAAWzD,EAAO,SAClBc,EAAS,CAAC,EAAG4C,EAAY,EAC7B,QAASjE,EAAI,EAAGC,EAAM+D,EAAS,OAAQhE,EAAIC,EAAKD,IAAK,CACnD,IAAIkE,EAAQF,EAAShE,CAAC,EACtB,GAAI,CAACkE,EAAM,SACT,SAEF,IAAIC,EACJ,GAAI,OAAOD,EAAM,OAAU,SAAU,CACnC,IAAIE,EAASF,EAAM,MACnBE,EAASA,EAAO,QAAQ,QAAS,EAAE,EACnCA,EAASA,EAAO,QAAQ,QAAS,EAAE,EACnCD,EAASC,EAAO,MAAM,GAAG,CAC3B,MAAW,MAAM,QAAQF,EAAM,KAAK,EAClCC,EAASD,EAAM,MAEfC,EAAS,CAAC,EAAE,EAEd,IAAIN,EAAY,GAChB,GAAI,OAAOK,EAAM,SAAS,WAAc,SAAU,CAChDL,EAAY,EACZ,IAAIR,EAAWa,EAAM,SAAS,UAAU,MAAM,GAAG,EACjD,QAASG,EAAI,EAAGC,EAAOjB,EAAS,OAAQgB,EAAIC,EAAMD,IAEhD,OADchB,EAASgB,CAAC,EACP,CACf,IAAK,SACHR,EAAYA,EAAY,EACxB,MACF,IAAK,OACHA,EAAYA,EAAY,EACxB,MACF,IAAK,YACHA,EAAYA,EAAY,EACxB,MACF,IAAK,gBACHA,EAAYA,EAAY,EACxB,KACJ,CAEJ,CACA,IAAIU,EAAa,KACb,OAAOL,EAAM,SAAS,YAAe,UAAYrC,GAAgBqC,EAAM,SAAS,UAAU,IAC5FK,EAAaL,EAAM,SAAS,YAE9B,IAAIM,EAAa,KACb,OAAON,EAAM,SAAS,YAAe,UAAYrC,GAAgBqC,EAAM,SAAS,UAAU,IAC5FM,EAAaN,EAAM,SAAS,YAE9B,QAASG,EAAI,EAAGC,EAAOH,EAAO,OAAQE,EAAIC,EAAMD,IAAK,CAEnD,IAAIhB,EADSc,EAAOE,CAAC,EAAE,KAAK,EACN,MAAM,GAAG,EAC3BI,EAAQpB,EAASA,EAAS,OAAS,CAAC,EACpCI,EAAe,KACfJ,EAAS,OAAS,IACpBI,EAAeJ,EAAS,MAAM,EAAGA,EAAS,OAAS,CAAC,EACpDI,EAAa,QAAQ,GAEvBpC,EAAO4C,GAAW,EAAI,IAAIS,GACxBD,EACAhB,EACAzD,EACA6D,EACAU,EACAC,CACF,CACF,CACF,CACA,OAAOnD,CACT,CACA,IAAIqD,GAAkB,KAAM,CAC1B,YAAYD,EAAOhB,EAAcxC,EAAO4C,EAAWU,EAAYC,EAAY,CACzE,KAAK,MAAQC,EACb,KAAK,aAAehB,EACpB,KAAK,MAAQxC,EACb,KAAK,UAAY4C,EACjB,KAAK,WAAaU,EAClB,KAAK,WAAaC,CACpB,CACF,EACIG,IAA8BC,IAChCA,EAAWA,EAAW,OAAY,EAAE,EAAI,SACxCA,EAAWA,EAAW,KAAU,CAAC,EAAI,OACrCA,EAAWA,EAAW,OAAY,CAAC,EAAI,SACvCA,EAAWA,EAAW,KAAU,CAAC,EAAI,OACrCA,EAAWA,EAAW,UAAe,CAAC,EAAI,YAC1CA,EAAWA,EAAW,cAAmB,CAAC,EAAI,gBACvCA,IACND,IAAa,CAAC,CAAC,EAClB,SAASlC,GAAwBoC,EAAkBzC,EAAW,CAC5DyC,EAAiB,KAAK,CAACtD,EAAGC,IAAM,CAC9B,IAAIzB,EAAIuB,GAAOC,EAAE,MAAOC,EAAE,KAAK,EAK/B,OAJIzB,IAAM,IAGVA,EAAI0B,GAAUF,EAAE,aAAcC,EAAE,YAAY,EACxCzB,IAAM,GACDA,EAEFwB,EAAE,MAAQC,EAAE,KACrB,CAAC,EACD,IAAIsD,EAAmB,EACnBC,EAAoB,UACpBC,EAAoB,UACxB,KAAOH,EAAiB,QAAU,GAAKA,EAAiB,CAAC,EAAE,QAAU,IAAI,CACvE,IAAII,EAAmBJ,EAAiB,MAAM,EAC1CI,EAAiB,YAAc,KACjCH,EAAmBG,EAAiB,WAElCA,EAAiB,aAAe,OAClCF,EAAoBE,EAAiB,YAEnCA,EAAiB,aAAe,OAClCD,EAAoBC,EAAiB,WAEzC,CACA,IAAI1C,EAAW,IAAI2C,GAAS9C,CAAS,EACjC+C,EAAW,IAAIpC,GAAgB+B,EAAkBvC,EAAS,MAAMwC,CAAiB,EAAGxC,EAAS,MAAMyC,CAAiB,CAAC,EACrHI,EAAO,IAAIC,GAAiB,IAAIC,GAAqB,EAAG,KAAM,GAAiB,EAAG,CAAC,EAAG,CAAC,CAAC,EAC5F,QAAStF,EAAI,EAAGC,EAAM4E,EAAiB,OAAQ7E,EAAIC,EAAKD,IAAK,CAC3D,IAAIuF,EAAOV,EAAiB7E,CAAC,EAC7BoF,EAAK,OAAO,EAAGG,EAAK,MAAOA,EAAK,aAAcA,EAAK,UAAWhD,EAAS,MAAMgD,EAAK,UAAU,EAAGhD,EAAS,MAAMgD,EAAK,UAAU,CAAC,CAChI,CACA,OAAO,IAAIpD,GAAMI,EAAU4C,EAAUC,CAAI,CAC3C,CACA,IAAIF,GAAW,KAAM,CACnB,UACA,aACA,UACA,UACA,YAAY9C,EAAW,CAIrB,GAHA,KAAK,aAAe,EACpB,KAAK,UAAY,CAAC,EAClB,KAAK,UAA4B,OAAO,OAAO,IAAI,EAC/C,MAAM,QAAQA,CAAS,EAAG,CAC5B,KAAK,UAAY,GACjB,QAASpC,EAAI,EAAGC,EAAMmC,EAAU,OAAQpC,EAAIC,EAAKD,IAC/C,KAAK,UAAUoC,EAAUpC,CAAC,CAAC,EAAIA,EAC/B,KAAK,UAAUA,CAAC,EAAIoC,EAAUpC,CAAC,CAEnC,MACE,KAAK,UAAY,EAErB,CACA,MAAMwF,EAAO,CACX,GAAIA,IAAU,KACZ,MAAO,GAETA,EAAQA,EAAM,YAAY,EAC1B,IAAIxD,EAAQ,KAAK,UAAUwD,CAAK,EAChC,GAAIxD,EACF,OAAOA,EAET,GAAI,KAAK,UACP,MAAM,IAAI,MAAM,gCAAgCwD,CAAK,EAAE,EAEzD,OAAAxD,EAAQ,EAAE,KAAK,aACf,KAAK,UAAUwD,CAAK,EAAIxD,EACxB,KAAK,UAAUA,CAAK,EAAIwD,EACjBxD,CACT,CACA,aAAc,CACZ,OAAO,KAAK,UAAU,MAAM,CAAC,CAC/B,CACF,EACIyD,GAAoB,OAAO,OAAO,CAAC,CAAC,EACpCH,GAAuB,MAAMI,EAAsB,CACrD,WACA,aACA,UACA,WACA,WACA,YAAYC,EAAYlC,EAAcI,EAAWU,EAAYC,EAAY,CACvE,KAAK,WAAamB,EAClB,KAAK,aAAelC,GAAgBgC,GACpC,KAAK,UAAY5B,EACjB,KAAK,WAAaU,EAClB,KAAK,WAAaC,CACpB,CACA,OAAQ,CACN,OAAO,IAAIkB,GAAsB,KAAK,WAAY,KAAK,aAAc,KAAK,UAAW,KAAK,WAAY,KAAK,UAAU,CACvH,CACA,OAAO,SAAS5F,EAAK,CACnB,IAAIC,EAAI,CAAC,EACT,QAASC,EAAI,EAAGC,EAAMH,EAAI,OAAQE,EAAIC,EAAKD,IACzCD,EAAEC,CAAC,EAAIF,EAAIE,CAAC,EAAE,MAAM,EAEtB,OAAOD,CACT,CACA,gBAAgB4F,EAAY9B,EAAWU,EAAYC,EAAY,CACzD,KAAK,WAAamB,EACpB,QAAQ,IAAI,sBAAsB,EAElC,KAAK,WAAaA,EAEhB9B,IAAc,KAChB,KAAK,UAAYA,GAEfU,IAAe,IACjB,KAAK,WAAaA,GAEhBC,IAAe,IACjB,KAAK,WAAaA,EAEtB,CACF,EACIa,GAAmB,MAAMO,EAAkB,CAC7C,YAAYC,EAAWC,EAAwB,CAAC,EAAGC,EAAY,CAAC,EAAG,CACjE,KAAK,UAAYF,EACjB,KAAK,UAAYE,EACjB,KAAK,uBAAyBD,CAChC,CACA,uBACA,OAAO,kBAAkBvE,EAAGC,EAAG,CAC7B,GAAID,EAAE,aAAeC,EAAE,WACrB,OAAOA,EAAE,WAAaD,EAAE,WAE1B,IAAIyE,EAAe,EACfC,EAAe,EACnB,KACM1E,EAAE,aAAayE,CAAY,IAAM,KACnCA,IAEExE,EAAE,aAAayE,CAAY,IAAM,KACnCA,IAEE,EAAAD,GAAgBzE,EAAE,aAAa,QAAU0E,GAAgBzE,EAAE,aAAa,SAPjE,CAUX,IAAM0E,EAAwB1E,EAAE,aAAayE,CAAY,EAAE,OAAS1E,EAAE,aAAayE,CAAY,EAAE,OACjG,GAAIE,IAA0B,EAC5B,OAAOA,EAETF,IACAC,GACF,CACA,OAAOzE,EAAE,aAAa,OAASD,EAAE,aAAa,MAChD,CACA,MAAMkD,EAAO,CACX,GAAIA,IAAU,GAAI,CAChB,IAAI0B,EAAW1B,EAAM,QAAQ,GAAG,EAC5B2B,EACAC,EAQJ,GAPIF,IAAa,IACfC,EAAO3B,EACP4B,EAAO,KAEPD,EAAO3B,EAAM,UAAU,EAAG0B,CAAQ,EAClCE,EAAO5B,EAAM,UAAU0B,EAAW,CAAC,GAEjC,KAAK,UAAU,eAAeC,CAAI,EACpC,OAAO,KAAK,UAAUA,CAAI,EAAE,MAAMC,CAAI,CAE1C,CACA,IAAMC,EAAQ,KAAK,uBAAuB,OAAO,KAAK,SAAS,EAC/D,OAAAA,EAAM,KAAKV,GAAkB,iBAAiB,EACvCU,CACT,CACA,OAAOX,EAAYlB,EAAOhB,EAAcI,EAAWU,EAAYC,EAAY,CACzE,GAAIC,IAAU,GAAI,CAChB,KAAK,cAAckB,EAAYlC,EAAcI,EAAWU,EAAYC,CAAU,EAC9E,MACF,CACA,IAAI2B,EAAW1B,EAAM,QAAQ,GAAG,EAC5B2B,EACAC,EACAF,IAAa,IACfC,EAAO3B,EACP4B,EAAO,KAEPD,EAAO3B,EAAM,UAAU,EAAG0B,CAAQ,EAClCE,EAAO5B,EAAM,UAAU0B,EAAW,CAAC,GAErC,IAAII,EACA,KAAK,UAAU,eAAeH,CAAI,EACpCG,EAAQ,KAAK,UAAUH,CAAI,GAE3BG,EAAQ,IAAIX,GAAkB,KAAK,UAAU,MAAM,EAAGN,GAAqB,SAAS,KAAK,sBAAsB,CAAC,EAChH,KAAK,UAAUc,CAAI,EAAIG,GAEzBA,EAAM,OAAOZ,EAAa,EAAGU,EAAM5C,EAAcI,EAAWU,EAAYC,CAAU,CACpF,CACA,cAAcmB,EAAYlC,EAAcI,EAAWU,EAAYC,EAAY,CACzE,GAAIf,IAAiB,KAAM,CACzB,KAAK,UAAU,gBAAgBkC,EAAY9B,EAAWU,EAAYC,CAAU,EAC5E,MACF,CACA,QAASxE,EAAI,EAAGC,EAAM,KAAK,uBAAuB,OAAQD,EAAIC,EAAKD,IAAK,CACtE,IAAIuF,EAAO,KAAK,uBAAuBvF,CAAC,EACxC,GAAIyB,GAAU8D,EAAK,aAAc9B,CAAY,IAAM,EAAG,CACpD8B,EAAK,gBAAgBI,EAAY9B,EAAWU,EAAYC,CAAU,EAClE,MACF,CACF,CACIX,IAAc,KAChBA,EAAY,KAAK,UAAU,WAEzBU,IAAe,IACjBA,EAAa,KAAK,UAAU,YAE1BC,IAAe,IACjBA,EAAa,KAAK,UAAU,YAE9B,KAAK,uBAAuB,KAAK,IAAIc,GAAqBK,EAAYlC,EAAcI,EAAWU,EAAYC,CAAU,CAAC,CACxH,CACF,EAGIgC,GAAuB,MAAMC,EAAsB,CACrD,OAAO,YAAYC,EAAwB,CACzC,OAAOA,EAAuB,SAAS,CAAC,EAAE,SAAS,GAAI,GAAG,CAC5D,CACA,OAAO,MAAMA,EAAwB,CACnC,IAAMC,EAAaF,GAAsB,cAAcC,CAAsB,EACvEE,EAAYH,GAAsB,aAAaC,CAAsB,EACrE7C,EAAY4C,GAAsB,aAAaC,CAAsB,EACrEnC,EAAakC,GAAsB,cAAcC,CAAsB,EACvElC,EAAaiC,GAAsB,cAAcC,CAAsB,EAC7E,QAAQ,IAAI,CACV,WAAAC,EACA,UAAAC,EACA,UAAA/C,EACA,WAAAU,EACA,WAAAC,CACF,CAAC,CACH,CACA,OAAO,cAAckC,EAAwB,CAC3C,OAAQA,EAAyB,OAA+B,CAClE,CACA,OAAO,aAAaA,EAAwB,CAC1C,OAAQA,EAAyB,OAA+B,CAClE,CACA,OAAO,yBAAyBA,EAAwB,CACtD,OAAQA,EAAyB,QAAuC,CAC1E,CACA,OAAO,aAAaA,EAAwB,CAC1C,OAAQA,EAAyB,SAAiC,EACpE,CACA,OAAO,cAAcA,EAAwB,CAC3C,OAAQA,EAAyB,YAAoC,EACvE,CACA,OAAO,cAAcA,EAAwB,CAC3C,OAAQA,EAAyB,cAAsC,EACzE,CAKA,OAAO,IAAIA,EAAwBC,EAAYC,EAAWC,EAA0BhD,EAAWU,EAAYC,EAAY,CACrH,IAAIsC,EAAcL,GAAsB,cAAcC,CAAsB,EACxEK,EAAaN,GAAsB,aAAaC,CAAsB,EACtEM,EAA+BP,GAAsB,yBAAyBC,CAAsB,EAAI,EAAI,EAC5GO,EAAaR,GAAsB,aAAaC,CAAsB,EACtEQ,EAAcT,GAAsB,cAAcC,CAAsB,EACxES,EAAcV,GAAsB,cAAcC,CAAsB,EAC5E,OAAIC,IAAe,IACjBG,EAAcH,GAEZC,IAAc,IAChBG,EAAmCH,GAEjCC,IAA6B,OAC/BG,EAA+BH,EAA2B,EAAI,GAE5DhD,IAAc,KAChBoD,EAAapD,GAEXU,IAAe,IACjB2C,EAAc3C,GAEZC,IAAe,IACjB2C,EAAc3C,IAERsC,GAAe,EAA4BC,GAAc,EAA4BC,GAAgC,GAAoCC,GAAc,GAA6BC,GAAe,GAA6BC,GAAe,MAAgC,CACzS,CACF,EASA,SAASC,GAAeC,EAAUC,EAAa,CAC7C,IAAMC,EAAU,CAAC,EACXC,EAAYC,GAAaJ,CAAQ,EACnCK,EAAQF,EAAU,KAAK,EAC3B,KAAOE,IAAU,MAAM,CACrB,IAAIC,EAAW,EACf,GAAID,EAAM,SAAW,GAAKA,EAAM,OAAO,CAAC,IAAM,IAAK,CACjD,OAAQA,EAAM,OAAO,CAAC,EAAG,CACvB,IAAK,IACHC,EAAW,EACX,MACF,IAAK,IACHA,EAAW,GACX,MACF,QACE,QAAQ,IAAI,oBAAoBD,CAAK,oBAAoB,CAC7D,CACAA,EAAQF,EAAU,KAAK,CACzB,CACA,IAAII,EAAUC,EAAiB,EAE/B,GADAN,EAAQ,KAAK,CAAE,QAAAK,EAAS,SAAAD,CAAS,CAAC,EAC9BD,IAAU,IACZ,MAEFA,EAAQF,EAAU,KAAK,CACzB,CACA,OAAOD,EACP,SAASO,GAAe,CACtB,GAAIJ,IAAU,IAAK,CACjBA,EAAQF,EAAU,KAAK,EACvB,IAAMO,EAAqBD,EAAa,EACxC,OAAQE,GAAiB,CAAC,CAACD,GAAsB,CAACA,EAAmBC,CAAY,CACnF,CACA,GAAIN,IAAU,IAAK,CACjBA,EAAQF,EAAU,KAAK,EACvB,IAAMS,EAAsBC,EAAqB,EACjD,OAAIR,IAAU,MACZA,EAAQF,EAAU,KAAK,GAElBS,CACT,CACA,GAAIE,GAAaT,CAAK,EAAG,CACvB,IAAMU,EAAc,CAAC,EACrB,GACEA,EAAY,KAAKV,CAAK,EACtBA,EAAQF,EAAU,KAAK,QAChBW,GAAaT,CAAK,GAC3B,OAAQM,GAAiBV,EAAYc,EAAaJ,CAAY,CAChE,CACA,OAAO,IACT,CACA,SAASH,GAAmB,CAC1B,IAAMQ,EAAW,CAAC,EACdT,EAAUE,EAAa,EAC3B,KAAOF,GACLS,EAAS,KAAKT,CAAO,EACrBA,EAAUE,EAAa,EAEzB,OAAQE,GAAiBK,EAAS,MAAOC,GAAaA,EAASN,CAAY,CAAC,CAC9E,CACA,SAASE,GAAuB,CAC9B,IAAMG,EAAW,CAAC,EACdT,EAAUC,EAAiB,EAC/B,KAAOD,IACLS,EAAS,KAAKT,CAAO,EACjBF,IAAU,KAAOA,IAAU,MAFjB,CAGZ,GACEA,EAAQF,EAAU,KAAK,QAChBE,IAAU,KAAOA,IAAU,KAItCE,EAAUC,EAAiB,CAC7B,CACA,OAAQG,GAAiBK,EAAS,KAAMC,GAAaA,EAASN,CAAY,CAAC,CAC7E,CACF,CACA,SAASG,GAAaT,EAAO,CAC3B,MAAO,CAAC,CAACA,GAAS,CAAC,CAACA,EAAM,MAAM,UAAU,CAC5C,CACA,SAASD,GAAac,EAAO,CAC3B,IAAIC,EAAQ,0CACRC,EAAQD,EAAM,KAAKD,CAAK,EAC5B,MAAO,CACL,KAAM,IAAM,CACV,GAAI,CAACE,EACH,OAAO,KAET,IAAMC,EAAMD,EAAM,CAAC,EACnB,OAAAA,EAAQD,EAAM,KAAKD,CAAK,EACjBG,CACT,CACF,CACF,CAWA,SAASC,GAAkBC,EAAK,CAC1B,OAAOA,EAAI,SAAY,YACzBA,EAAI,QAAQ,CAEhB,CAGA,IAAIC,GAAwB,KAAM,CAChC,YAAYC,EAAW,CACrB,KAAK,UAAYA,CACnB,CACA,OAAQ,CACN,OAAO,KAAK,SACd,CACF,EACIC,GAAkC,KAAM,CAC1C,YAAYD,EAAWE,EAAU,CAC/B,KAAK,UAAYF,EACjB,KAAK,SAAWE,CAClB,CACA,OAAQ,CACN,MAAO,GAAG,KAAK,SAAS,IAAI,KAAK,QAAQ,EAC3C,CACF,EACIC,GAA6B,KAAM,CACrC,YAAc,CAAC,EACf,mBAAqC,IAAI,IACzC,IAAI,YAAa,CACf,OAAO,KAAK,WACd,CACA,YAA8B,IAAI,IAClC,IAAIC,EAAW,CACb,IAAMC,EAAMD,EAAU,MAAM,EACxB,KAAK,mBAAmB,IAAIC,CAAG,IAGnC,KAAK,mBAAmB,IAAIA,CAAG,EAC/B,KAAK,YAAY,KAAKD,CAAS,EACjC,CACF,EACIE,GAA2B,KAAM,CACnC,YAAYC,EAAMC,EAAkB,CAClC,KAAK,KAAOD,EACZ,KAAK,iBAAmBC,EACxB,KAAK,sBAAsB,IAAI,KAAK,gBAAgB,EACpD,KAAK,EAAI,CAAC,IAAIT,GAAsB,KAAK,gBAAgB,CAAC,CAC5D,CACA,sBAAwC,IAAI,IAC5C,yBAA2C,IAAI,IAC/C,EACA,cAAe,CACb,IAAMU,EAAI,KAAK,EACf,KAAK,EAAI,CAAC,EACV,IAAMC,EAAO,IAAIP,GACjB,QAAWQ,KAAOF,EAChBG,GAA6BD,EAAK,KAAK,iBAAkB,KAAK,KAAMD,CAAI,EAE1E,QAAWC,KAAOD,EAAK,WACrB,GAAIC,aAAeZ,GAAuB,CACxC,GAAI,KAAK,sBAAsB,IAAIY,EAAI,SAAS,EAC9C,SAEF,KAAK,sBAAsB,IAAIA,EAAI,SAAS,EAC5C,KAAK,EAAE,KAAKA,CAAG,CACjB,KAAO,CAIL,GAHI,KAAK,sBAAsB,IAAIA,EAAI,SAAS,GAG5C,KAAK,yBAAyB,IAAIA,EAAI,MAAM,CAAC,EAC/C,SAEF,KAAK,yBAAyB,IAAIA,EAAI,MAAM,CAAC,EAC7C,KAAK,EAAE,KAAKA,CAAG,CACjB,CAEJ,CACF,EACA,SAASC,GAA6BR,EAAWS,EAAsBN,EAAMO,EAAQ,CACnF,IAAMC,EAAcR,EAAK,OAAOH,EAAU,SAAS,EACnD,GAAI,CAACW,EAAa,CAChB,GAAIX,EAAU,YAAcS,EAC1B,MAAM,IAAI,MAAM,4BAA4BA,CAAoB,GAAG,EAErE,MACF,CACA,IAAMG,EAAcT,EAAK,OAAOM,CAAoB,EAChDT,aAAqBL,GACvBkB,GAAwC,CAAE,YAAAD,EAAa,YAAAD,CAAY,EAAGD,CAAM,EAE5EI,GACEd,EAAU,SACV,CAAE,YAAAY,EAAa,YAAAD,EAAa,WAAYA,EAAY,UAAW,EAC/DD,CACF,EAEF,IAAMK,EAAaZ,EAAK,WAAWH,EAAU,SAAS,EACtD,GAAIe,EACF,QAAWC,KAAaD,EACtBL,EAAO,IAAI,IAAIf,GAAsBqB,CAAS,CAAC,CAGrD,CACA,SAASF,GAAkDhB,EAAUmB,EAASP,EAAQ,CACpF,GAAIO,EAAQ,YAAcA,EAAQ,WAAWnB,CAAQ,EAAG,CACtD,IAAMoB,EAAOD,EAAQ,WAAWnB,CAAQ,EACxCqB,GAAiC,CAACD,CAAI,EAAGD,EAASP,CAAM,CAC1D,CACF,CACA,SAASG,GAAwCI,EAASP,EAAQ,CAC5DO,EAAQ,YAAY,UAAY,MAAM,QAAQA,EAAQ,YAAY,QAAQ,GAC5EE,GACEF,EAAQ,YAAY,SACpB,CAAE,GAAGA,EAAS,WAAYA,EAAQ,YAAY,UAAW,EACzDP,CACF,EAEEO,EAAQ,YAAY,YACtBE,GACE,OAAO,OAAOF,EAAQ,YAAY,UAAU,EAC5C,CAAE,GAAGA,EAAS,WAAYA,EAAQ,YAAY,UAAW,EACzDP,CACF,CAEJ,CACA,SAASS,GAAiCC,EAAOH,EAASP,EAAQ,CAChE,QAAWQ,KAAQE,EAAO,CACxB,GAAIV,EAAO,YAAY,IAAIQ,CAAI,EAC7B,SAEFR,EAAO,YAAY,IAAIQ,CAAI,EAC3B,IAAMG,EAAoBH,EAAK,WAAaI,GAAa,CAAC,EAAGL,EAAQ,WAAYC,EAAK,UAAU,EAAID,EAAQ,WACxG,MAAM,QAAQC,EAAK,QAAQ,GAC7BC,GAAiCD,EAAK,SAAU,CAAE,GAAGD,EAAS,WAAYI,CAAkB,EAAGX,CAAM,EAEvG,IAAMa,EAAUL,EAAK,QACrB,GAAI,CAACK,EACH,SAEF,IAAMvB,EAAYwB,GAAaD,CAAO,EACtC,OAAQvB,EAAU,KAAM,CACtB,IAAK,GACHa,GAAwC,CAAE,GAAGI,EAAS,YAAaA,EAAQ,WAAY,EAAGP,CAAM,EAChG,MACF,IAAK,GACHG,GAAwCI,EAASP,CAAM,EACvD,MACF,IAAK,GACHI,GAAkDd,EAAU,SAAU,CAAE,GAAGiB,EAAS,WAAYI,CAAkB,EAAGX,CAAM,EAC3H,MACF,IAAK,GACL,IAAK,GACH,IAAMC,EAAcX,EAAU,YAAciB,EAAQ,YAAY,UAAYA,EAAQ,YAAcjB,EAAU,YAAciB,EAAQ,YAAY,UAAYA,EAAQ,YAAc,OAChL,GAAIN,EAAa,CACf,IAAMc,EAAa,CAAE,YAAaR,EAAQ,YAAa,YAAAN,EAAa,WAAYU,CAAkB,EAC9FrB,EAAU,OAAS,EACrBc,GAAkDd,EAAU,SAAUyB,EAAYf,CAAM,EAExFG,GAAwCY,EAAYf,CAAM,CAE9D,MACMV,EAAU,OAAS,EACrBU,EAAO,IAAI,IAAIb,GAAgCG,EAAU,UAAWA,EAAU,QAAQ,CAAC,EAEvFU,EAAO,IAAI,IAAIf,GAAsBK,EAAU,SAAS,CAAC,EAG7D,KACJ,CACF,CACF,CACA,IAAI0B,GAAgB,KAAM,CACxB,KAAO,CACT,EACIC,GAAgB,KAAM,CACxB,KAAO,CACT,EACIC,GAAoB,KAAM,CAC5B,YAAY9B,EAAU,CACpB,KAAK,SAAWA,CAClB,CACA,KAAO,CACT,EACI+B,GAAoB,KAAM,CAC5B,YAAYjC,EAAW,CACrB,KAAK,UAAYA,CACnB,CACA,KAAO,CACT,EACIkC,GAA8B,KAAM,CACtC,YAAYlC,EAAWE,EAAU,CAC/B,KAAK,UAAYF,EACjB,KAAK,SAAWE,CAClB,CACA,KAAO,CACT,EACA,SAAS0B,GAAaD,EAAS,CAC7B,GAAIA,IAAY,QACd,OAAO,IAAIG,GACN,GAAIH,IAAY,QACrB,OAAO,IAAII,GAEb,IAAMI,EAAeR,EAAQ,QAAQ,GAAG,EACxC,GAAIQ,IAAiB,GACnB,OAAO,IAAIF,GAAkBN,CAAO,EAC/B,GAAIQ,IAAiB,EAC1B,OAAO,IAAIH,GAAkBL,EAAQ,UAAU,CAAC,CAAC,EAC5C,CACL,IAAM3B,EAAY2B,EAAQ,UAAU,EAAGQ,CAAY,EAC7CjC,EAAWyB,EAAQ,UAAUQ,EAAe,CAAC,EACnD,OAAO,IAAID,GAA4BlC,EAAWE,CAAQ,CAC5D,CACF,CAGA,IAAIkC,GAAsB,UACtBC,GAAuB,WAE3B,IAAIC,GAAY,GACZC,GAAc,GAOlB,IAAIC,GAAO,KAAM,CACf,UACA,GACA,iBACA,MACA,wBACA,aACA,YAAYC,EAAWC,EAAIC,EAAMC,EAAa,CAC5C,KAAK,UAAYH,EACjB,KAAK,GAAKC,EACV,KAAK,MAAQC,GAAQ,KACrB,KAAK,iBAAmBE,GAAY,YAAY,KAAK,KAAK,EAC1D,KAAK,aAAeD,GAAe,KACnC,KAAK,wBAA0BC,GAAY,YAAY,KAAK,YAAY,CAC1E,CACA,IAAI,WAAY,CACd,IAAMC,EAAW,KAAK,UAAY,GAAGC,GAAS,KAAK,UAAU,QAAQ,CAAC,IAAI,KAAK,UAAU,IAAI,GAAK,UAClG,MAAO,GAAG,KAAK,YAAY,IAAI,IAAI,KAAK,EAAE,MAAMD,CAAQ,EAC1D,CACA,QAAQE,EAAUC,EAAgB,CAChC,MAAI,CAAC,KAAK,kBAAoB,KAAK,QAAU,MAAQD,IAAa,MAAQC,IAAmB,KACpF,KAAK,MAEPJ,GAAY,gBAAgB,KAAK,MAAOG,EAAUC,CAAc,CACzE,CACA,eAAeD,EAAUC,EAAgB,CACvC,MAAI,CAAC,KAAK,yBAA2B,KAAK,eAAiB,KAClD,KAAK,aAEPJ,GAAY,gBAAgB,KAAK,aAAcG,EAAUC,CAAc,CAChF,CACF,EACIC,GAAc,cAAcV,EAAK,CACnC,6BACA,YAAYC,EAAWC,EAAIC,EAAMC,EAAaO,EAA8B,CAC1E,MAAMV,EAAWC,EAAIC,EAAMC,CAAW,EACtC,KAAK,6BAA+BO,CACtC,CACA,SAAU,CACV,CACA,gBAAgBC,EAASC,EAAK,CAC5B,MAAM,IAAI,MAAM,gBAAgB,CAClC,CACA,QAAQD,EAASE,EAAgB,CAC/B,MAAM,IAAI,MAAM,gBAAgB,CAClC,CACA,UAAUF,EAASE,EAAgBC,EAAQC,EAAQ,CACjD,MAAM,IAAI,MAAM,gBAAgB,CAClC,CACF,EACIC,GAAY,cAAcjB,EAAK,CACjC,OACA,SACA,wBACA,YAAYC,EAAWC,EAAIC,EAAMe,EAAOC,EAAU,CAChD,MAAMlB,EAAWC,EAAIC,EAAM,IAAI,EAC/B,KAAK,OAAS,IAAIiB,GAAaF,EAAO,KAAK,EAAE,EAC7C,KAAK,SAAWC,EAChB,KAAK,wBAA0B,IACjC,CACA,SAAU,CACJ,KAAK,0BACP,KAAK,wBAAwB,QAAQ,EACrC,KAAK,wBAA0B,KAEnC,CACA,IAAI,kBAAmB,CACrB,MAAO,GAAG,KAAK,OAAO,MAAM,EAC9B,CACA,gBAAgBP,EAASC,EAAK,CAC5BA,EAAI,KAAK,KAAK,MAAM,CACtB,CACA,QAAQD,EAASE,EAAgB,CAC/B,OAAO,KAAK,2BAA2BF,CAAO,EAAE,QAAQA,CAAO,CACjE,CACA,UAAUA,EAASE,EAAgBC,EAAQC,EAAQ,CACjD,OAAO,KAAK,2BAA2BJ,CAAO,EAAE,UAAUA,EAASG,EAAQC,CAAM,CACnF,CACA,2BAA2BJ,EAAS,CAClC,OAAK,KAAK,0BACR,KAAK,wBAA0B,IAAIS,GACnC,KAAK,gBAAgBT,EAAS,KAAK,uBAAuB,GAErD,KAAK,uBACd,CACF,EACIU,GAAkB,cAActB,EAAK,CACvC,mBACA,SACA,wBACA,YAAYC,EAAWC,EAAIC,EAAMC,EAAamB,EAAU,CACtD,MAAMtB,EAAWC,EAAIC,EAAMC,CAAW,EACtC,KAAK,SAAWmB,EAAS,SACzB,KAAK,mBAAqBA,EAAS,mBACnC,KAAK,wBAA0B,IACjC,CACA,SAAU,CACJ,KAAK,0BACP,KAAK,wBAAwB,QAAQ,EACrC,KAAK,wBAA0B,KAEnC,CACA,gBAAgBX,EAASC,EAAK,CAC5B,QAAWW,KAAW,KAAK,SACZZ,EAAQ,QAAQY,CAAO,EAC/B,gBAAgBZ,EAASC,CAAG,CAErC,CACA,QAAQD,EAASE,EAAgB,CAC/B,OAAO,KAAK,2BAA2BF,CAAO,EAAE,QAAQA,CAAO,CACjE,CACA,UAAUA,EAASE,EAAgBC,EAAQC,EAAQ,CACjD,OAAO,KAAK,2BAA2BJ,CAAO,EAAE,UAAUA,EAASG,EAAQC,CAAM,CACnF,CACA,2BAA2BJ,EAAS,CAClC,OAAK,KAAK,0BACR,KAAK,wBAA0B,IAAIS,GACnC,KAAK,gBAAgBT,EAAS,KAAK,uBAAuB,GAErD,KAAK,uBACd,CACF,EACIa,GAAe,cAAczB,EAAK,CACpC,OACA,cACA,KACA,qBACA,YACA,oBACA,mBACA,SACA,wBACA,YAAYC,EAAWC,EAAIC,EAAMC,EAAasB,EAAOC,EAAeC,EAAKC,EAAaC,EAAqBP,EAAU,CACnH,MAAMtB,EAAWC,EAAIC,EAAMC,CAAW,EACtC,KAAK,OAAS,IAAIgB,GAAaM,EAAO,KAAK,EAAE,EAC7C,KAAK,cAAgBC,EACrB,KAAK,KAAO,IAAIP,GAAaQ,GAAY,SAAU,EAAE,EACrD,KAAK,qBAAuB,KAAK,KAAK,kBACtC,KAAK,YAAcC,EACnB,KAAK,oBAAsBC,GAAuB,GAClD,KAAK,SAAWP,EAAS,SACzB,KAAK,mBAAqBA,EAAS,mBACnC,KAAK,wBAA0B,IACjC,CACA,SAAU,CACJ,KAAK,0BACP,KAAK,wBAAwB,QAAQ,EACrC,KAAK,wBAA0B,KAEnC,CACA,IAAI,kBAAmB,CACrB,MAAO,GAAG,KAAK,OAAO,MAAM,EAC9B,CACA,IAAI,gBAAiB,CACnB,MAAO,GAAG,KAAK,KAAK,MAAM,EAC5B,CACA,iCAAiCf,EAAUC,EAAgB,CACzD,OAAO,KAAK,KAAK,sBAAsBD,EAAUC,CAAc,CACjE,CACA,gBAAgBG,EAASC,EAAK,CAC5BA,EAAI,KAAK,KAAK,MAAM,CACtB,CACA,QAAQD,EAASE,EAAgB,CAC/B,OAAO,KAAK,2BAA2BF,EAASE,CAAc,EAAE,QAAQF,CAAO,CACjF,CACA,UAAUA,EAASE,EAAgBC,EAAQC,EAAQ,CACjD,OAAO,KAAK,2BAA2BJ,EAASE,CAAc,EAAE,UAAUF,EAASG,EAAQC,CAAM,CACnG,CACA,2BAA2BJ,EAASE,EAAgB,CAClD,GAAI,CAAC,KAAK,wBAAyB,CACjC,KAAK,wBAA0B,IAAIO,GACnC,QAAWG,KAAW,KAAK,SACZZ,EAAQ,QAAQY,CAAO,EAC/B,gBAAgBZ,EAAS,KAAK,uBAAuB,EAExD,KAAK,oBACP,KAAK,wBAAwB,KAAK,KAAK,KAAK,kBAAoB,KAAK,KAAK,MAAM,EAAI,KAAK,IAAI,EAE7F,KAAK,wBAAwB,QAAQ,KAAK,KAAK,kBAAoB,KAAK,KAAK,MAAM,EAAI,KAAK,IAAI,CAEpG,CACA,OAAI,KAAK,KAAK,oBACR,KAAK,oBACP,KAAK,wBAAwB,UAAU,KAAK,wBAAwB,OAAO,EAAI,EAAGE,CAAc,EAEhG,KAAK,wBAAwB,UAAU,EAAGA,CAAc,GAGrD,KAAK,uBACd,CACF,EACIiB,GAAiB,cAAc/B,EAAK,CACtC,OACA,cACA,cACA,OACA,uBACA,mBACA,SACA,wBACA,6BACA,YAAYC,EAAWC,EAAIC,EAAMC,EAAasB,EAAOC,EAAeK,EAAQC,EAAeV,EAAU,CACnG,MAAMtB,EAAWC,EAAIC,EAAMC,CAAW,EACtC,KAAK,OAAS,IAAIgB,GAAaM,EAAO,KAAK,EAAE,EAC7C,KAAK,cAAgBC,EACrB,KAAK,cAAgBM,EACrB,KAAK,OAAS,IAAIb,GAAaY,EAAQE,EAAW,EAClD,KAAK,uBAAyB,KAAK,OAAO,kBAC1C,KAAK,SAAWX,EAAS,SACzB,KAAK,mBAAqBA,EAAS,mBACnC,KAAK,wBAA0B,KAC/B,KAAK,6BAA+B,IACtC,CACA,SAAU,CACJ,KAAK,0BACP,KAAK,wBAAwB,QAAQ,EACrC,KAAK,wBAA0B,MAE7B,KAAK,+BACP,KAAK,6BAA6B,QAAQ,EAC1C,KAAK,6BAA+B,KAExC,CACA,IAAI,kBAAmB,CACrB,MAAO,GAAG,KAAK,OAAO,MAAM,EAC9B,CACA,IAAI,kBAAmB,CACrB,MAAO,GAAG,KAAK,OAAO,MAAM,EAC9B,CACA,mCAAmCf,EAAUC,EAAgB,CAC3D,OAAO,KAAK,OAAO,sBAAsBD,EAAUC,CAAc,CACnE,CACA,gBAAgBG,EAASC,EAAK,CAC5BA,EAAI,KAAK,KAAK,MAAM,CACtB,CACA,QAAQD,EAASE,EAAgB,CAC/B,OAAO,KAAK,2BAA2BF,CAAO,EAAE,QAAQA,CAAO,CACjE,CACA,UAAUA,EAASE,EAAgBC,EAAQC,EAAQ,CACjD,OAAO,KAAK,2BAA2BJ,CAAO,EAAE,UAAUA,EAASG,EAAQC,CAAM,CACnF,CACA,2BAA2BJ,EAAS,CAClC,GAAI,CAAC,KAAK,wBAAyB,CACjC,KAAK,wBAA0B,IAAIS,GACnC,QAAWG,KAAW,KAAK,SACZZ,EAAQ,QAAQY,CAAO,EAC/B,gBAAgBZ,EAAS,KAAK,uBAAuB,CAE9D,CACA,OAAO,KAAK,uBACd,CACA,aAAaA,EAASE,EAAgB,CACpC,OAAO,KAAK,gCAAgCF,EAASE,CAAc,EAAE,QAAQF,CAAO,CACtF,CACA,eAAeA,EAASE,EAAgBC,EAAQC,EAAQ,CACtD,OAAO,KAAK,gCAAgCJ,EAASE,CAAc,EAAE,UAAUF,EAASG,EAAQC,CAAM,CACxG,CACA,gCAAgCJ,EAASE,EAAgB,CACvD,OAAK,KAAK,+BACR,KAAK,6BAA+B,IAAIO,GACxC,KAAK,6BAA6B,KAAK,KAAK,OAAO,kBAAoB,KAAK,OAAO,MAAM,EAAI,KAAK,MAAM,GAEtG,KAAK,OAAO,mBACd,KAAK,6BAA6B,UAAU,EAAGP,GAAkC,QAAQ,EAEpF,KAAK,4BACd,CACF,EACIqB,GAAc,MAAMC,EAAa,CACnC,OAAO,kBAAkBC,EAAQpC,EAAWE,EAAMC,EAAaO,EAA8B,CAC3F,OAAO0B,EAAO,aAAcnC,GACnB,IAAIQ,GAAYT,EAAWC,EAAIC,EAAMC,EAAaO,CAA4B,CACtF,CACH,CACA,OAAO,kBAAkB2B,EAAMD,EAAQE,EAAY,CACjD,OAAKD,EAAK,IACRD,EAAO,aAAcnC,GAAO,CAE1B,GADAoC,EAAK,GAAKpC,EACNoC,EAAK,MACP,OAAO,IAAIrB,GACTqB,EAAK,wBACLA,EAAK,GACLA,EAAK,KACLA,EAAK,MACLF,GAAa,iBAAiBE,EAAK,SAAUD,EAAQE,CAAU,CACjE,EAEF,GAAI,OAAOD,EAAK,MAAU,IAAa,CACjCA,EAAK,aACPC,EAAaC,GAAa,CAAC,EAAGD,EAAYD,EAAK,UAAU,GAE3D,IAAIf,EAAWe,EAAK,SACpB,OAAI,OAAOf,EAAa,KAAee,EAAK,UAC1Cf,EAAW,CAAC,CAAE,QAASe,EAAK,OAAQ,CAAC,GAEhC,IAAIhB,GACTgB,EAAK,wBACLA,EAAK,GACLA,EAAK,KACLA,EAAK,YACLF,GAAa,iBAAiBb,EAAUc,EAAQE,CAAU,CAC5D,CACF,CACA,OAAID,EAAK,MACA,IAAIP,GACTO,EAAK,wBACLA,EAAK,GACLA,EAAK,KACLA,EAAK,YACLA,EAAK,MACLF,GAAa,iBAAiBE,EAAK,eAAiBA,EAAK,SAAUD,EAAQE,CAAU,EACrFD,EAAK,MACLF,GAAa,iBAAiBE,EAAK,eAAiBA,EAAK,SAAUD,EAAQE,CAAU,EACrFH,GAAa,iBAAiBE,EAAK,SAAUD,EAAQE,CAAU,CACjE,EAEK,IAAId,GACTa,EAAK,wBACLA,EAAK,GACLA,EAAK,KACLA,EAAK,YACLA,EAAK,MACLF,GAAa,iBAAiBE,EAAK,eAAiBA,EAAK,SAAUD,EAAQE,CAAU,EACrFD,EAAK,IACLF,GAAa,iBAAiBE,EAAK,aAAeA,EAAK,SAAUD,EAAQE,CAAU,EACnFD,EAAK,oBACLF,GAAa,iBAAiBE,EAAK,SAAUD,EAAQE,CAAU,CACjE,CACF,CAAC,EAEID,EAAK,EACd,CACA,OAAO,iBAAiBnB,EAAUkB,EAAQE,EAAY,CACpD,IAAI,EAAI,CAAC,EACT,GAAIpB,EAAU,CACZ,IAAIsB,EAAmB,EACvB,QAAWC,KAAavB,EAAU,CAChC,GAAIuB,IAAc,0BAChB,SAEF,IAAMC,EAAmB,SAASD,EAAW,EAAE,EAC3CC,EAAmBF,IACrBA,EAAmBE,EAEvB,CACA,QAASC,EAAI,EAAGA,GAAKH,EAAkBG,IACrC,EAAEA,CAAC,EAAI,KAET,QAAWF,KAAavB,EAAU,CAChC,GAAIuB,IAAc,0BAChB,SAEF,IAAMC,EAAmB,SAASD,EAAW,EAAE,EAC3C/B,EAA+B,EAC/BQ,EAASuB,CAAS,EAAE,WACtB/B,EAA+ByB,GAAa,kBAAkBjB,EAASuB,CAAS,EAAGL,EAAQE,CAAU,GAEvG,EAAEI,CAAgB,EAAIP,GAAa,kBAAkBC,EAAQlB,EAASuB,CAAS,EAAE,wBAAyBvB,EAASuB,CAAS,EAAE,KAAMvB,EAASuB,CAAS,EAAE,YAAa/B,CAA4B,CACnM,CACF,CACA,OAAO,CACT,CACA,OAAO,iBAAiBY,EAAUc,EAAQE,EAAY,CACpD,IAAI,EAAI,CAAC,EACT,GAAIhB,EACF,QAASqB,EAAI,EAAGC,EAAMtB,EAAS,OAAQqB,EAAIC,EAAKD,IAAK,CACnD,IAAMpB,EAAUD,EAASqB,CAAC,EACtBE,EAAS,GACb,GAAItB,EAAQ,QAAS,CACnB,IAAMuB,EAAYC,GAAaxB,EAAQ,OAAO,EAC9C,OAAQuB,EAAU,KAAM,CACtB,IAAK,GACL,IAAK,GACHD,EAASV,GAAa,kBAAkBG,EAAWf,EAAQ,OAAO,EAAGa,EAAQE,CAAU,EACvF,MACF,IAAK,GACH,IAAIU,EAAoBV,EAAWQ,EAAU,QAAQ,EACjDE,IACFH,EAASV,GAAa,kBAAkBa,EAAmBZ,EAAQE,CAAU,GAG/E,MACF,IAAK,GACL,IAAK,GACH,IAAMW,EAAsBH,EAAU,UAChCI,EAAyBJ,EAAU,OAAS,EAAsCA,EAAU,SAAW,KACvGK,EAAkBf,EAAO,mBAAmBa,EAAqBX,CAAU,EACjF,GAAIa,EACF,GAAID,EAAwB,CAC1B,IAAIE,EAAuBD,EAAgB,WAAWD,CAAsB,EACxEE,IACFP,EAASV,GAAa,kBAAkBiB,EAAsBhB,EAAQe,EAAgB,UAAU,EAGpG,MACEN,EAASV,GAAa,kBAAkBgB,EAAgB,WAAW,MAAOf,EAAQe,EAAgB,UAAU,EAIhH,KACJ,CACF,MACEN,EAASV,GAAa,kBAAkBZ,EAASa,EAAQE,CAAU,EAErE,GAAIO,IAAW,GAAI,CACjB,IAAMQ,EAAOjB,EAAO,QAAQS,CAAM,EAC9BS,EAAW,GAMf,IALID,aAAgBhC,IAAmBgC,aAAgB7B,IAAgB6B,aAAgBvB,KACjFuB,EAAK,oBAAsBA,EAAK,SAAS,SAAW,IACtDC,EAAW,IAGXA,EACF,SAEF,EAAE,KAAKT,CAAM,CACf,CACF,CAEF,MAAO,CACL,SAAU,EACV,oBAAqBvB,EAAWA,EAAS,OAAS,KAAO,EAAE,MAC7D,CACF,CACF,EACIH,GAAe,MAAMoC,EAAc,CACrC,OACA,OACA,UACA,kBACA,aACA,YAAYC,EAAcX,EAAQ,CAChC,GAAIW,GAAgB,OAAOA,GAAiB,SAAU,CACpD,IAAMZ,EAAMY,EAAa,OACrBC,EAAgB,EAChBC,EAAS,CAAC,EACVC,EAAY,GAChB,QAASC,EAAM,EAAGA,EAAMhB,EAAKgB,IAE3B,GADWJ,EAAa,OAAOI,CAAG,IACvB,MACLA,EAAM,EAAIhB,EAAK,CACjB,IAAMiB,EAASL,EAAa,OAAOI,EAAM,CAAC,EACtCC,IAAW,KACbH,EAAO,KAAKF,EAAa,UAAUC,EAAeG,CAAG,CAAC,EACtDF,EAAO,KAAK,kBAAkB,EAC9BD,EAAgBG,EAAM,IACbC,IAAW,KAAOA,IAAW,OACtCF,EAAY,IAEdC,GACF,CAGJ,KAAK,UAAYD,EACbF,IAAkB,EACpB,KAAK,OAASD,GAEdE,EAAO,KAAKF,EAAa,UAAUC,EAAeb,CAAG,CAAC,EACtD,KAAK,OAASc,EAAO,KAAK,EAAE,EAEhC,MACE,KAAK,UAAY,GACjB,KAAK,OAASF,EAEZ,KAAK,UACP,KAAK,aAAe,KAAK,kBAAkB,EAE3C,KAAK,aAAe,KAEtB,KAAK,OAASX,EACV,OAAO,KAAK,QAAW,SACzB,KAAK,kBAAoBiB,GAAoB,KAAK,KAAK,MAAM,EAE7D,KAAK,kBAAoB,EAE7B,CACA,OAAQ,CACN,OAAO,IAAIP,GAAc,KAAK,OAAQ,KAAK,MAAM,CACnD,CACA,UAAUQ,EAAW,CACf,KAAK,SAAWA,IAGpB,KAAK,OAASA,EACV,KAAK,YACP,KAAK,aAAe,KAAK,kBAAkB,GAE/C,CACA,sBAAsBxD,EAAUC,EAAgB,CAC9C,GAAI,OAAO,KAAK,QAAW,SACzB,MAAM,IAAI,MAAM,6DAA6D,EAE/E,IAAIwD,EAAiBxD,EAAe,IAAKyD,GAChC1D,EAAS,UAAU0D,EAAQ,MAAOA,EAAQ,GAAG,CACrD,EACD,OAAAC,GAAqB,UAAY,EAC1B,KAAK,OAAO,QAAQA,GAAsB,CAACjD,EAAOkD,IAChDC,GAAuBJ,EAAe,SAASG,EAAI,EAAE,CAAC,GAAK,EAAE,CACrE,CACH,CACA,mBAAoB,CAClB,GAAI,OAAO,KAAK,QAAW,SACzB,MAAM,IAAI,MAAM,6DAA6D,EAE/E,IAAIE,EAAe,CAAC,EAChBC,EAAe,CAAC,EAChBC,EAAe,CAAC,EAChBC,EAAe,CAAC,EAChBZ,EAAKhB,EAAK6B,EAAIZ,EAClB,IAAKD,EAAM,EAAGhB,EAAM,KAAK,OAAO,OAAQgB,EAAMhB,EAAKgB,IACjDa,EAAK,KAAK,OAAO,OAAOb,CAAG,EAC3BS,EAAaT,CAAG,EAAIa,EACpBH,EAAaV,CAAG,EAAIa,EACpBF,EAAaX,CAAG,EAAIa,EACpBD,EAAaZ,CAAG,EAAIa,EAChBA,IAAO,MACLb,EAAM,EAAIhB,IACZiB,EAAS,KAAK,OAAO,OAAOD,EAAM,CAAC,EAC/BC,IAAW,KACbQ,EAAaT,EAAM,CAAC,EAAI,SACxBU,EAAaV,EAAM,CAAC,EAAI,SACxBW,EAAaX,EAAM,CAAC,EAAI,IACxBY,EAAaZ,EAAM,CAAC,EAAI,KACfC,IAAW,KACpBQ,EAAaT,EAAM,CAAC,EAAI,SACxBU,EAAaV,EAAM,CAAC,EAAI,IACxBW,EAAaX,EAAM,CAAC,EAAI,SACxBY,EAAaZ,EAAM,CAAC,EAAI,MAExBS,EAAaT,EAAM,CAAC,EAAIC,EACxBS,EAAaV,EAAM,CAAC,EAAIC,EACxBU,EAAaX,EAAM,CAAC,EAAIC,EACxBW,EAAaZ,EAAM,CAAC,EAAIC,GAE1BD,KAIN,MAAO,CACL,MAAOS,EAAa,KAAK,EAAE,EAC3B,MAAOC,EAAa,KAAK,EAAE,EAC3B,MAAOC,EAAa,KAAK,EAAE,EAC3B,MAAOC,EAAa,KAAK,EAAE,CAC7B,CACF,CACA,eAAe1D,EAAQC,EAAQ,CAC7B,MAAI,CAAC,KAAK,WAAa,CAAC,KAAK,cAAgB,OAAO,KAAK,QAAW,SAC3D,KAAK,OAEVD,EACEC,EACK,KAAK,aAAa,MAElB,KAAK,aAAa,MAGvBA,EACK,KAAK,aAAa,MAElB,KAAK,aAAa,KAG/B,CACF,EACIK,GAAmB,KAAM,CAC3B,OACA,YACA,QACA,aACA,aAAc,CACZ,KAAK,OAAS,CAAC,EACf,KAAK,YAAc,GACnB,KAAK,QAAU,KACf,KAAK,aAAe,CAClB,MAAO,KACP,MAAO,KACP,MAAO,KACP,MAAO,IACT,CACF,CACA,SAAU,CACR,KAAK,eAAe,CACtB,CACA,gBAAiB,CACX,KAAK,UACP,KAAK,QAAQ,QAAQ,EACrB,KAAK,QAAU,MAEb,KAAK,aAAa,QACpB,KAAK,aAAa,MAAM,QAAQ,EAChC,KAAK,aAAa,MAAQ,MAExB,KAAK,aAAa,QACpB,KAAK,aAAa,MAAM,QAAQ,EAChC,KAAK,aAAa,MAAQ,MAExB,KAAK,aAAa,QACpB,KAAK,aAAa,MAAM,QAAQ,EAChC,KAAK,aAAa,MAAQ,MAExB,KAAK,aAAa,QACpB,KAAK,aAAa,MAAM,QAAQ,EAChC,KAAK,aAAa,MAAQ,KAE9B,CACA,KAAKsD,EAAM,CACT,KAAK,OAAO,KAAKA,CAAI,EACrB,KAAK,YAAc,KAAK,aAAeA,EAAK,SAC9C,CACA,QAAQA,EAAM,CACZ,KAAK,OAAO,QAAQA,CAAI,EACxB,KAAK,YAAc,KAAK,aAAeA,EAAK,SAC9C,CACA,QAAS,CACP,OAAO,KAAK,OAAO,MACrB,CACA,UAAUC,EAAOZ,EAAW,CACtB,KAAK,OAAOY,CAAK,EAAE,SAAWZ,IAChC,KAAK,eAAe,EACpB,KAAK,OAAOY,CAAK,EAAE,UAAUZ,CAAS,EAE1C,CACA,QAAQa,EAAS,CACf,GAAI,CAAC,KAAK,QAAS,CACjB,IAAIC,EAAU,KAAK,OAAO,IAAKC,GAAMA,EAAE,MAAM,EAC7C,KAAK,QAAU,IAAIC,GAAaH,EAASC,EAAS,KAAK,OAAO,IAAKC,GAAMA,EAAE,MAAM,CAAC,CACpF,CACA,OAAO,KAAK,OACd,CACA,UAAUF,EAAS9D,EAAQC,EAAQ,CACjC,OAAK,KAAK,YAGJD,EACEC,GACG,KAAK,aAAa,QACrB,KAAK,aAAa,MAAQ,KAAK,gBAAgB6D,EAAS9D,EAAQC,CAAM,GAEjE,KAAK,aAAa,QAEpB,KAAK,aAAa,QACrB,KAAK,aAAa,MAAQ,KAAK,gBAAgB6D,EAAS9D,EAAQC,CAAM,GAEjE,KAAK,aAAa,OAGvBA,GACG,KAAK,aAAa,QACrB,KAAK,aAAa,MAAQ,KAAK,gBAAgB6D,EAAS9D,EAAQC,CAAM,GAEjE,KAAK,aAAa,QAEpB,KAAK,aAAa,QACrB,KAAK,aAAa,MAAQ,KAAK,gBAAgB6D,EAAS9D,EAAQC,CAAM,GAEjE,KAAK,aAAa,OAxBtB,KAAK,QAAQ6D,CAAO,CA4B/B,CACA,gBAAgBA,EAAS9D,EAAQC,EAAQ,CACvC,IAAI8D,EAAU,KAAK,OAAO,IAAKC,GAAMA,EAAE,eAAehE,EAAQC,CAAM,CAAC,EACrE,OAAO,IAAIgE,GAAaH,EAASC,EAAS,KAAK,OAAO,IAAKC,GAAMA,EAAE,MAAM,CAAC,CAC5E,CACF,EACIC,GAAe,KAAM,CACvB,YAAYH,EAASC,EAASG,EAAO,CACnC,KAAK,QAAUH,EACf,KAAK,MAAQG,EACb,KAAK,QAAUJ,EAAQ,kBAAkBC,CAAO,CAClD,CACA,QACA,SAAU,CACJ,OAAO,KAAK,QAAQ,SAAY,YAClC,KAAK,QAAQ,QAAQ,CAEzB,CACA,UAAW,CACT,IAAMI,EAAI,CAAC,EACX,QAAStC,EAAI,EAAGC,EAAM,KAAK,MAAM,OAAQD,EAAIC,EAAKD,IAChDsC,EAAE,KAAK,QAAU,KAAK,MAAMtC,CAAC,EAAI,KAAO,KAAK,QAAQA,CAAC,CAAC,EAEzD,OAAOsC,EAAE,KAAK;AAAA,CAAI,CACpB,CACA,kBAAkBC,EAAQC,EAAeC,EAAS,CAChD,IAAMC,EAAS,KAAK,QAAQ,kBAAkBH,EAAQC,EAAeC,CAAO,EAC5E,OAAKC,EAGE,CACL,OAAQ,KAAK,MAAMA,EAAO,KAAK,EAC/B,eAAgBA,EAAO,cACzB,EALS,IAMX,CACF,EAGIC,GAAuB,KAAM,CAC/B,YAAYC,EAAYC,EAAW,CACjC,KAAK,WAAaD,EAClB,KAAK,UAAYC,CACnB,CACF,EACIC,GAA+B,MAAMC,EAA8B,CACrE,mBACA,0BACA,YAAYC,EAAmBC,EAAmB,CAChD,KAAK,mBAAqB,IAAIN,GAAqBK,EAAmB,CAAc,EACpF,KAAK,0BAA4B,IAAIE,GAAa,OAAO,QAAQD,GAAqB,CAAC,CAAC,CAAC,CAC3F,CACA,sBAAuB,CACrB,OAAO,KAAK,kBACd,CACA,wBAAwBE,EAAW,CACjC,OAAIA,IAAc,KACTJ,GAA8B,qBAEhC,KAAK,yBAAyB,IAAII,CAAS,CACpD,CACA,OAAO,qBAAuB,IAAIR,GAAqB,EAAG,CAAC,EAC3D,yBAA2B,IAAIS,GAAUD,GAAc,CACrD,IAAMP,EAAa,KAAK,iBAAiBO,CAAS,EAC5CE,EAAoB,KAAK,qBAAqBF,CAAS,EAC7D,OAAO,IAAIR,GAAqBC,EAAYS,CAAiB,CAC/D,CAAC,EAKD,iBAAiBC,EAAO,CACtB,OAAO,KAAK,0BAA0B,MAAMA,CAAK,GAAK,CACxD,CACA,qBAAqBH,EAAW,CAC9B,IAAMI,EAAIJ,EAAU,MAAMJ,GAA8B,0BAA0B,EAClF,GAAI,CAACQ,EACH,MAAO,GAET,OAAQA,EAAE,CAAC,EAAG,CACZ,IAAK,UACH,MAAO,GACT,IAAK,SACH,MAAO,GACT,IAAK,QACH,MAAO,GACT,IAAK,gBACH,MAAO,EACX,CACA,MAAM,IAAI,MAAM,2CAA2C,CAC7D,CACA,OAAO,2BAA6B,2CACtC,EACIL,GAAe,KAAM,CACvB,OACA,aACA,YAAYM,EAAQ,CAClB,GAAIA,EAAO,SAAW,EACpB,KAAK,OAAS,KACd,KAAK,aAAe,SACf,CACL,KAAK,OAAS,IAAI,IAAIA,CAAM,EAC5B,IAAMC,EAAgBD,EAAO,IAC3B,CAAC,CAACL,EAAWO,CAAK,IAAMjC,GAAuB0B,CAAS,CAC1D,EACAM,EAAc,KAAK,EACnBA,EAAc,QAAQ,EACtB,KAAK,aAAe,IAAI,OACtB,MAAMA,EAAc,KAAK,KAAK,CAAC,YAC/B,EACF,CACF,CACF,CACA,MAAMH,EAAO,CACX,GAAI,CAAC,KAAK,aACR,OAEF,IAAMC,EAAID,EAAM,MAAM,KAAK,YAAY,EACvC,GAAKC,EAGL,OAAO,KAAK,OAAO,IAAIA,EAAE,CAAC,CAAC,CAC7B,CACF,EAGII,GAAa,CACf,YAAa,OAAO,QAAY,KAAe,CAAC,CAAC,QAAQ,IAAI,qBAC/D,EACIC,GAA0B,GAG1BC,GAAuB,KAAM,CAC/B,YAAYC,EAAOC,EAAc,CAC/B,KAAK,MAAQD,EACb,KAAK,aAAeC,CACtB,CACF,EACA,SAASC,GAAgBhG,EAASJ,EAAUqG,EAAaC,EAASJ,EAAOK,EAAYC,EAAsBC,EAAW,CACpH,IAAMC,EAAa1G,EAAS,QAAQ,OAChC2G,EAAO,GACPC,EAAiB,GACrB,GAAIJ,EAAsB,CACxB,IAAMK,EAAmBC,GACvB1G,EACAJ,EACAqG,EACAC,EACAJ,EACAK,CACF,EACAL,EAAQW,EAAiB,MACzBP,EAAUO,EAAiB,QAC3BR,EAAcQ,EAAiB,YAC/BD,EAAiBC,EAAiB,cACpC,CACA,IAAME,EAAY,KAAK,IAAI,EAC3B,KAAO,CAACJ,GAAM,CACZ,GAAIF,IAAc,GACI,KAAK,IAAI,EAAIM,EACfN,EAChB,OAAO,IAAIR,GAAqBC,EAAO,EAAI,EAG/Cc,EAAS,CACX,CACA,OAAO,IAAIf,GAAqBC,EAAO,EAAK,EAC5C,SAASc,GAAW,CAOlB,IAAMtC,EAAIuC,GACR7G,EACAJ,EACAqG,EACAC,EACAJ,EACAU,CACF,EACA,GAAI,CAAClC,EAAG,CACN6B,EAAW,QAAQL,EAAOQ,CAAU,EACpCC,EAAO,GACP,MACF,CACA,IAAM1G,EAAiByE,EAAE,eACnBwC,EAAgBxC,EAAE,cAClByC,EAAclH,GAAkBA,EAAe,OAAS,EAAIA,EAAe,CAAC,EAAE,IAAMqG,EAAU,GACpG,GAAIY,IAAkBE,GAAW,CAC/B,IAAMC,EAAanB,EAAM,QAAQ9F,CAAO,EAMxCmG,EAAW,QAAQL,EAAOjG,EAAe,CAAC,EAAE,KAAK,EACjDiG,EAAQA,EAAM,0BAA0BA,EAAM,cAAc,EAC5DoB,GACElH,EACAJ,EACAqG,EACAH,EACAK,EACAc,EAAW,YACXpH,CACF,EACAsG,EAAW,QAAQL,EAAOjG,EAAe,CAAC,EAAE,GAAG,EAC/C,IAAMsH,EAASrB,EAGf,GAFAA,EAAQA,EAAM,OACdU,EAAiBW,EAAO,aAAa,EACjC,CAACJ,GAAeI,EAAO,YAAY,IAAMjB,EAAS,CAMpDJ,EAAQqB,EACRhB,EAAW,QAAQL,EAAOQ,CAAU,EACpCC,EAAO,GACP,MACF,CACF,KAAO,CACL,IAAMa,EAAQpH,EAAQ,QAAQ8G,CAAa,EAC3CX,EAAW,QAAQL,EAAOjG,EAAe,CAAC,EAAE,KAAK,EACjD,IAAMwH,EAAavB,EACbX,EAAYiC,EAAM,QAAQxH,EAAS,QAASC,CAAc,EAC1DyH,EAAiBxB,EAAM,sBAAsB,eACjDX,EACAnF,CACF,EAUA,GATA8F,EAAQA,EAAM,KACZgB,EACAZ,EACAM,EACA3G,EAAe,CAAC,EAAE,MAAQyG,EAC1B,KACAgB,EACAA,CACF,EACIF,aAAiBvG,GAAc,CACjC,IAAM0G,EAAaH,EAMnBF,GACElH,EACAJ,EACAqG,EACAH,EACAK,EACAoB,EAAW,cACX1H,CACF,EACAsG,EAAW,QAAQL,EAAOjG,EAAe,CAAC,EAAE,GAAG,EAC/C2G,EAAiB3G,EAAe,CAAC,EAAE,IACnC,IAAML,EAAc+H,EAAW,eAC7B3H,EAAS,QACTC,CACF,EACM2H,EAAwBF,EAAe,eAC3C9H,EACAQ,CACF,EAUA,GATA8F,EAAQA,EAAM,0BAA0B0B,CAAqB,EACzDD,EAAW,uBACbzB,EAAQA,EAAM,YACZyB,EAAW,iCACT3H,EAAS,QACTC,CACF,CACF,GAEE,CAACkH,GAAeM,EAAW,cAAcvB,CAAK,EAAG,CAMnDA,EAAQA,EAAM,IAAI,EAClBK,EAAW,QAAQL,EAAOQ,CAAU,EACpCC,EAAO,GACP,MACF,CACF,SAAWa,aAAiBjG,GAAgB,CAC1C,IAAMoG,EAAaH,EAInBF,GACElH,EACAJ,EACAqG,EACAH,EACAK,EACAoB,EAAW,cACX1H,CACF,EACAsG,EAAW,QAAQL,EAAOjG,EAAe,CAAC,EAAE,GAAG,EAC/C2G,EAAiB3G,EAAe,CAAC,EAAE,IACnC,IAAML,EAAc+H,EAAW,eAC7B3H,EAAS,QACTC,CACF,EACM2H,EAAwBF,EAAe,eAC3C9H,EACAQ,CACF,EAUA,GATA8F,EAAQA,EAAM,0BAA0B0B,CAAqB,EACzDD,EAAW,yBACbzB,EAAQA,EAAM,YACZyB,EAAW,mCACT3H,EAAS,QACTC,CACF,CACF,GAEE,CAACkH,GAAeM,EAAW,cAAcvB,CAAK,EAAG,CAMnDA,EAAQA,EAAM,IAAI,EAClBK,EAAW,QAAQL,EAAOQ,CAAU,EACpCC,EAAO,GACP,MACF,CACF,SAOEW,GACElH,EACAJ,EACAqG,EACAH,EACAK,EAXmBiB,EAYN,SACbvH,CACF,EACAsG,EAAW,QAAQL,EAAOjG,EAAe,CAAC,EAAE,GAAG,EAC/CiG,EAAQA,EAAM,IAAI,EACd,CAACiB,EAAa,CAMhBjB,EAAQA,EAAM,QAAQ,EACtBK,EAAW,QAAQL,EAAOQ,CAAU,EACpCC,EAAO,GACP,MACF,CAEJ,CACI1G,EAAe,CAAC,EAAE,IAAMqG,IAC1BA,EAAUrG,EAAe,CAAC,EAAE,IAC5BoG,EAAc,GAElB,CACF,CACA,SAASS,GAAsB1G,EAASJ,EAAUqG,EAAaC,EAASJ,EAAOK,EAAY,CACzF,IAAIK,EAAiBV,EAAM,qBAAuB,EAAI,GAChD2B,EAAa,CAAC,EACpB,QAASC,EAAO5B,EAAO4B,EAAMA,EAAOA,EAAK,IAAI,EAAG,CAC9C,IAAMC,EAAWD,EAAK,QAAQ1H,CAAO,EACjC2H,aAAoBxG,IACtBsG,EAAW,KAAK,CACd,KAAME,EACN,MAAOD,CACT,CAAC,CAEL,CACA,QAASE,EAAYH,EAAW,IAAI,EAAGG,EAAWA,EAAYH,EAAW,IAAI,EAAG,CAC9E,GAAM,CAAE,YAAAI,EAAa,YAAAC,CAAY,EAAIC,GAAuBH,EAAU,KAAM5H,EAAS4H,EAAU,MAAM,QAAS3B,EAAaC,IAAYM,CAAc,EAC/IlC,EAAIuD,EAAY,kBAAkBjI,EAAUsG,EAAS4B,CAAW,EAKtE,GAAIxD,EAAG,CAEL,GADsBA,EAAE,SACFhD,GAAa,CACjCwE,EAAQ8B,EAAU,MAAM,IAAI,EAC5B,KACF,CACItD,EAAE,gBAAkBA,EAAE,eAAe,SACvC6B,EAAW,QAAQyB,EAAU,MAAOtD,EAAE,eAAe,CAAC,EAAE,KAAK,EAC7D4C,GAAelH,EAASJ,EAAUqG,EAAa2B,EAAU,MAAOzB,EAAYyB,EAAU,KAAK,cAAetD,EAAE,cAAc,EAC1H6B,EAAW,QAAQyB,EAAU,MAAOtD,EAAE,eAAe,CAAC,EAAE,GAAG,EAC3DkC,EAAiBlC,EAAE,eAAe,CAAC,EAAE,IACjCA,EAAE,eAAe,CAAC,EAAE,IAAM4B,IAC5BA,EAAU5B,EAAE,eAAe,CAAC,EAAE,IAC9B2B,EAAc,IAGpB,KAAO,CAILH,EAAQ8B,EAAU,MAAM,IAAI,EAC5B,KACF,CACF,CACA,MAAO,CAAE,MAAA9B,EAAO,QAAAI,EAAS,eAAAM,EAAgB,YAAAP,CAAY,CACvD,CACA,SAASY,GAAsB7G,EAASJ,EAAUqG,EAAaC,EAASJ,EAAOU,EAAgB,CAC7F,IAAMwB,EAAcC,GAAUjI,EAASJ,EAAUqG,EAAaC,EAASJ,EAAOU,CAAc,EACtF0B,EAAalI,EAAQ,cAAc,EACzC,GAAIkI,EAAW,SAAW,EACxB,OAAOF,EAET,IAAMG,EAAkBC,GAAgBF,EAAYlI,EAASJ,EAAUqG,EAAaC,EAASJ,EAAOU,CAAc,EAClH,GAAI,CAAC2B,EACH,OAAOH,EAET,GAAI,CAACA,EACH,OAAOG,EAET,IAAME,EAAmBL,EAAY,eAAe,CAAC,EAAE,MACjDM,EAAuBH,EAAgB,eAAe,CAAC,EAAE,MAC/D,OAAIG,EAAuBD,GAAoBF,EAAgB,eAAiBG,IAAyBD,EAChGF,EAEFH,CACT,CACA,SAASC,GAAUjI,EAASJ,EAAUqG,EAAaC,EAASJ,EAAOU,EAAgB,CACjF,IAAM9D,EAAOoD,EAAM,QAAQ9F,CAAO,EAC5B,CAAE,YAAA6H,EAAa,YAAAC,CAAY,EAAIS,GAAkB7F,EAAM1C,EAAS8F,EAAM,QAASG,EAAaC,IAAYM,CAAc,EACtHlC,EAAIuD,EAAY,kBAAkBjI,EAAUsG,EAAS4B,CAAW,EACtE,OAAIxD,EACK,CACL,eAAgBA,EAAE,eAClB,cAAeA,EAAE,MACnB,EAEK,IACT,CACA,SAAS8D,GAAgBF,EAAYlI,EAASJ,EAAUqG,EAAaC,EAASJ,EAAOU,EAAgB,CACnG,IAAIgC,EAAkB,OAAO,UACzBC,EAA0B,KAC1BC,EACAC,EAA0B,EACxBC,EAAS9C,EAAM,sBAAsB,cAAc,EACzD,QAAS9D,EAAI,EAAGC,EAAMiG,EAAW,OAAQlG,EAAIC,EAAKD,IAAK,CACrD,IAAM6G,EAAYX,EAAWlG,CAAC,EAC9B,GAAI,CAAC6G,EAAU,QAAQD,CAAM,EAC3B,SAEF,IAAMlG,EAAO1C,EAAQ,QAAQ6I,EAAU,MAAM,EACvC,CAAE,YAAAhB,EAAa,YAAAC,CAAY,EAAIS,GAAkB7F,EAAM1C,EAAS,KAAMiG,EAAaC,IAAYM,CAAc,EAC7GwB,EAAcH,EAAY,kBAAkBjI,EAAUsG,EAAS4B,CAAW,EAChF,GAAI,CAACE,EACH,SAMF,IAAMc,EAAcd,EAAY,eAAe,CAAC,EAAE,MAClD,GAAI,EAAAc,GAAeN,KAGnBA,EAAkBM,EAClBL,EAA0BT,EAAY,eACtCU,EAAkBV,EAAY,OAC9BW,EAA0BE,EAAU,SAChCL,IAAoBtC,GACtB,KAEJ,CACA,OAAIuC,EACK,CACL,cAAeE,IAA4B,GAC3C,eAAgBF,EAChB,cAAeC,CACjB,EAEK,IACT,CACA,SAASH,GAAkB7F,EAAM1C,EAASE,EAAgBC,EAAQC,EAAQ,CACxE,GAAIwF,GAAyB,CAC3B,IAAMmD,EAAerG,EAAK,QAAQ1C,EAASE,CAAc,EACnD4H,EAAckB,GAAe7I,EAAQC,CAAM,EACjD,MAAO,CAAE,YAAa2I,EAAc,YAAAjB,CAAY,CAClD,CAEA,MAAO,CAAE,YADWpF,EAAK,UAAU1C,EAASE,EAAgBC,EAAQC,CAAM,EACpD,YAAa,CAAa,CAClD,CACA,SAAS2H,GAAuBrF,EAAM1C,EAASE,EAAgBC,EAAQC,EAAQ,CAC7E,GAAIwF,GAAyB,CAC3B,IAAMmD,EAAerG,EAAK,aAAa1C,EAASE,CAAc,EACxD4H,EAAckB,GAAe7I,EAAQC,CAAM,EACjD,MAAO,CAAE,YAAa2I,EAAc,YAAAjB,CAAY,CAClD,CAEA,MAAO,CAAE,YADWpF,EAAK,eAAe1C,EAASE,EAAgBC,EAAQC,CAAM,EACzD,YAAa,CAAa,CAClD,CACA,SAAS4I,GAAe7I,EAAQC,EAAQ,CACtC,IAAIqE,EAAU,EACd,OAAKtE,IACHsE,GAAW,GAERrE,IACHqE,GAAW,GAENA,CACT,CACA,SAASyC,GAAelH,EAASJ,EAAUqG,EAAaH,EAAOK,EAAY5F,EAAUV,EAAgB,CACnG,GAAIU,EAAS,SAAW,EACtB,OAEF,IAAM0I,EAAkBrJ,EAAS,QAC3BqC,EAAM,KAAK,IAAI1B,EAAS,OAAQV,EAAe,MAAM,EACrDqJ,EAAa,CAAC,EACdC,EAAStJ,EAAe,CAAC,EAAE,IACjC,QAASmC,EAAI,EAAGA,EAAIC,EAAKD,IAAK,CAC5B,IAAMoH,EAAc7I,EAASyB,CAAC,EAC9B,GAAIoH,IAAgB,KAClB,SAEF,IAAMC,EAAexJ,EAAemC,CAAC,EACrC,GAAIqH,EAAa,SAAW,EAC1B,SAEF,GAAIA,EAAa,MAAQF,EACvB,MAEF,KAAOD,EAAW,OAAS,GAAKA,EAAWA,EAAW,OAAS,CAAC,EAAE,QAAUG,EAAa,OACvFlD,EAAW,kBAAkB+C,EAAWA,EAAW,OAAS,CAAC,EAAE,OAAQA,EAAWA,EAAW,OAAS,CAAC,EAAE,MAAM,EAC/GA,EAAW,IAAI,EAOjB,GALIA,EAAW,OAAS,EACtB/C,EAAW,kBAAkB+C,EAAWA,EAAW,OAAS,CAAC,EAAE,OAAQG,EAAa,KAAK,EAEzFlD,EAAW,QAAQL,EAAOuD,EAAa,KAAK,EAE1CD,EAAY,6BAA8B,CAC5C,IAAMjE,EAAYiE,EAAY,QAAQH,EAAiBpJ,CAAc,EAC/DyH,EAAiBxB,EAAM,sBAAsB,eAAeX,EAAWnF,CAAO,EAC9ER,EAAc4J,EAAY,eAAeH,EAAiBpJ,CAAc,EACxE2H,EAAwBF,EAAe,eAAe9H,EAAaQ,CAAO,EAC1EsJ,EAAaxD,EAAM,KAAKsD,EAAY,6BAA8BC,EAAa,MAAO,GAAI,GAAO,KAAM/B,EAAgBE,CAAqB,EAC5I+B,EAAavJ,EAAQ,iBAAiBiJ,EAAgB,UAAU,EAAGI,EAAa,GAAG,CAAC,EAC1FrD,GACEhG,EACAuJ,EACAtD,GAAeoD,EAAa,QAAU,EACtCA,EAAa,MACbC,EACAnD,EACA,GAEA,CACF,EACAqD,GAAkBD,CAAU,EAC5B,QACF,CACA,IAAME,EAAuBL,EAAY,QAAQH,EAAiBpJ,CAAc,EAChF,GAAI4J,IAAyB,KAAM,CAEjC,IAAMC,GADOR,EAAW,OAAS,EAAIA,EAAWA,EAAW,OAAS,CAAC,EAAE,OAASpD,EAAM,uBACnD,eAAe2D,EAAsBzJ,CAAO,EAC/EkJ,EAAW,KAAK,IAAIS,GAAkBD,EAAuBL,EAAa,GAAG,CAAC,CAChF,CACF,CACA,KAAOH,EAAW,OAAS,GACzB/C,EAAW,kBAAkB+C,EAAWA,EAAW,OAAS,CAAC,EAAE,OAAQA,EAAWA,EAAW,OAAS,CAAC,EAAE,MAAM,EAC/GA,EAAW,IAAI,CAEnB,CACA,IAAIS,GAAoB,KAAM,CAC5B,OACA,OACA,YAAYf,EAAQgB,EAAQ,CAC1B,KAAK,OAAShB,EACd,KAAK,OAASgB,CAChB,CACF,EAGA,SAASC,GAAc1E,EAAWnF,EAAS8J,EAAiB7E,EAAmB8E,EAAYC,EAA0BC,EAAmBhG,EAAS,CAC/I,OAAO,IAAIiG,GACT/E,EACAnF,EACA8J,EACA7E,EACA8E,EACAC,EACAC,EACAhG,CACF,CACF,CACA,SAASkG,GAAkBzF,EAAQ0F,EAAU1H,EAAM2H,EAAmBrK,EAAS,CAC7E,IAAMsK,EAAWC,GAAeH,EAAUI,EAAW,EAC/CtI,EAASX,GAAY,kBAAkBmB,EAAM2H,EAAmBrK,EAAQ,UAAU,EACxF,QAAWyK,KAAWH,EACpB5F,EAAO,KAAK,CACV,cAAe0F,EACf,QAASK,EAAQ,QACjB,OAAAvI,EACA,QAAAlC,EACA,SAAUyK,EAAQ,QACpB,CAAC,CAEL,CACA,SAASD,GAAYE,EAAY9B,EAAQ,CACvC,GAAIA,EAAO,OAAS8B,EAAW,OAC7B,MAAO,GAET,IAAIC,EAAY,EAChB,OAAOD,EAAW,MAAOE,GAAe,CACtC,QAAS5I,EAAI2I,EAAW3I,EAAI4G,EAAO,OAAQ5G,IACzC,GAAI6I,GAAkBjC,EAAO5G,CAAC,EAAG4I,CAAU,EACzC,OAAAD,EAAY3I,EAAI,EACT,GAGX,MAAO,EACT,CAAC,CACH,CACA,SAAS6I,GAAkBC,EAAe3F,EAAW,CACnD,GAAI,CAAC2F,EACH,MAAO,GAET,GAAIA,IAAkB3F,EACpB,MAAO,GAET,IAAMlD,EAAMkD,EAAU,OACtB,OAAO2F,EAAc,OAAS7I,GAAO6I,EAAc,OAAO,EAAG7I,CAAG,IAAMkD,GAAa2F,EAAc7I,CAAG,IAAM,GAC5G,CACA,IAAIiI,GAAU,KAAM,CAClB,YAAYa,EAAgB/K,EAAS8J,EAAiB7E,EAAmB8E,EAAYC,EAA0BC,EAAmBe,EAAU,CAgB1I,GAfA,KAAK,eAAiBD,EACtB,KAAK,yBAA2Bf,EAChC,KAAK,SAAWgB,EAChB,KAAK,8BAAgC,IAAIlG,GACvCgF,EACA7E,CACF,EACA,KAAK,QAAU,GACf,KAAK,YAAc,EACnB,KAAK,aAAe,CAAC,IAAI,EACzB,KAAK,kBAAoB,CAAC,EAC1B,KAAK,mBAAqBgF,EAC1B,KAAK,SAAWgB,GAAYjL,EAAS,IAAI,EACzC,KAAK,YAAc,KACnB,KAAK,mBAAqB,CAAC,EACvB+J,EACF,QAAWK,KAAY,OAAO,KAAKL,CAAU,EAAG,CAC9C,IAAMO,EAAWC,GAAeH,EAAUI,EAAW,EACrD,QAAWC,KAAWH,EACpB,KAAK,mBAAmB,KAAK,CAC3B,QAASG,EAAQ,QACjB,KAAMV,EAAWK,CAAQ,CAC3B,CAAC,CAEL,CAEJ,CACA,QACA,YACA,aACA,kBACA,mBACA,SACA,YACA,8BACA,mBACA,IAAI,eAAgB,CAClB,OAAO,KAAK,kBACd,CACA,SAAU,CACR,QAAW1H,KAAQ,KAAK,aAClBA,GACFA,EAAK,QAAQ,CAGnB,CACA,kBAAkBwI,EAAS,CACzB,OAAO,KAAK,SAAS,kBAAkBA,CAAO,CAChD,CACA,iBAAiBA,EAAS,CACxB,OAAO,KAAK,SAAS,iBAAiBA,CAAO,CAC/C,CACA,oBAAoB5F,EAAO,CACzB,OAAO,KAAK,8BAA8B,wBAAwBA,CAAK,CACzE,CACA,oBAAqB,CACnB,IAAM2E,EAAoB,CACxB,OAASkB,GACHA,IAAe,KAAK,eACf,KAAK,SAEP,KAAK,mBAAmBA,CAAU,EAE3C,WAAaA,GACJ,KAAK,mBAAmB,WAAWA,CAAU,CAExD,EACMzG,EAAS,CAAC,EACVS,EAAY,KAAK,eACjBnF,EAAUiK,EAAkB,OAAO9E,CAAS,EAClD,GAAInF,EAAS,CACX,IAAMoL,EAAgBpL,EAAQ,WAC9B,GAAIoL,EACF,QAASC,KAAcD,EACrBjB,GACEzF,EACA2G,EACAD,EAAcC,CAAU,EACxB,KACArL,CACF,EAGJ,IAAMsL,EAAsB,KAAK,mBAAmB,WAAWnG,CAAS,EACpEmG,GACFA,EAAoB,QAASC,GAAuB,CAClD,IAAMC,EAAmB,KAAK,mBAAmBD,CAAkB,EACnE,GAAIC,EAAkB,CACpB,IAAMpB,EAAWoB,EAAiB,kBAC9BpB,GACFD,GACEzF,EACA0F,EACAoB,EACA,KACAA,CACF,CAEJ,CACF,CAAC,CAEL,CACA,OAAA9G,EAAO,KAAK,CAAC+G,EAAIC,IAAOD,EAAG,SAAWC,EAAG,QAAQ,EAC1ChH,CACT,CACA,eAAgB,CACd,OAAI,KAAK,cAAgB,OACvB,KAAK,YAAc,KAAK,mBAAmB,GAEtC,KAAK,WACd,CACA,aAAaiH,EAAS,CACpB,IAAMrM,EAAK,EAAE,KAAK,YACZoF,EAASiH,EAAyBrM,CAAG,EAC3C,YAAK,aAAaA,CAAE,EAAIoF,EACjBA,CACT,CACA,QAAQxC,EAAQ,CACd,OAAO,KAAK,aAA4BA,CAAO,CACjD,CACA,mBAAmBiD,EAAWxD,EAAY,CACxC,GAAI,KAAK,kBAAkBwD,CAAS,EAClC,OAAO,KAAK,kBAAkBA,CAAS,EAClC,GAAI,KAAK,mBAAoB,CAClC,IAAMyG,EAAqB,KAAK,mBAAmB,OAAOzG,CAAS,EACnE,GAAIyG,EACF,YAAK,kBAAkBzG,CAAS,EAAI8F,GAClCW,EACAjK,GAAcA,EAAW,KAC3B,EACO,KAAK,kBAAkBwD,CAAS,CAE3C,CAEF,CACA,aAAavF,EAAUiM,EAAWxF,EAAY,EAAG,CAC/C,IAAM/B,EAAI,KAAK,UAAU1E,EAAUiM,EAAW,GAAOxF,CAAS,EAC9D,MAAO,CACL,OAAQ/B,EAAE,WAAW,UAAUA,EAAE,UAAWA,EAAE,UAAU,EACxD,UAAWA,EAAE,UACb,aAAcA,EAAE,YAClB,CACF,CACA,cAAc1E,EAAUiM,EAAWxF,EAAY,EAAG,CAChD,IAAM/B,EAAI,KAAK,UAAU1E,EAAUiM,EAAW,GAAMxF,CAAS,EAC7D,MAAO,CACL,OAAQ/B,EAAE,WAAW,gBAAgBA,EAAE,UAAWA,EAAE,UAAU,EAC9D,UAAWA,EAAE,UACb,aAAcA,EAAE,YAClB,CACF,CACA,UAAU1E,EAAUiM,EAAWC,EAAkBzF,EAAW,CACtD,KAAK,UAAY,KACnB,KAAK,QAAU9E,GAAY,kBACzB,KAAK,SAAS,WAAW,MACzB,KACA,KAAK,SAAS,UAChB,EACA,KAAK,cAAc,GAErB,IAAI0E,EACJ,GAAI,CAAC4F,GAAaA,IAAcE,GAAe,KAAM,CACnD9F,EAAc,GACd,IAAM+F,EAAqB,KAAK,8BAA8B,qBAAqB,EAC7EC,EAAe,KAAK,cAAc,YAAY,EAC9CC,EAAkBC,GAAqB,IAC3C,EACAH,EAAmB,WACnBA,EAAmB,UACnB,KACAC,EAAa,UACbA,EAAa,aACbA,EAAa,YACf,EACMG,EAAgB,KAAK,QAAQ,KAAK,OAAO,EAAE,QAC/C,KACA,IACF,EACIC,EACAD,EACFC,EAAYC,GAAqB,6BAC/BF,EACAF,EACA,IACF,EAEAG,EAAYC,GAAqB,WAC/B,UACAJ,CACF,EAEFL,EAAY,IAAIE,GACd,KACA,KAAK,QACL,GACA,GACA,GACA,KACAM,EACAA,CACF,CACF,MACEpG,EAAc,GACd4F,EAAU,MAAM,EAElBjM,EAAWA,EAAW;AAAA,EACtB,IAAM2M,EAAe,KAAK,iBAAiB3M,CAAQ,EAC7C0G,EAAaiG,EAAa,QAAQ,OAClCpG,EAAa,IAAIqG,GACrBV,EACAlM,EACA,KAAK,mBACL,KAAK,wBACP,EACM0E,EAAI0B,GACR,KACAuG,EACAtG,EACA,EACA4F,EACA1F,EACA,GACAE,CACF,EACA,OAAAmD,GAAkB+C,CAAY,EACvB,CACL,WAAAjG,EACA,WAAAH,EACA,UAAW7B,EAAE,MACb,aAAcA,EAAE,YAClB,CACF,CACF,EACA,SAAS2G,GAAYjL,EAASyM,EAAM,CAClC,OAAAzM,EAAU0M,GAAM1M,CAAO,EACvBA,EAAQ,WAAaA,EAAQ,YAAc,CAAC,EAC5CA,EAAQ,WAAW,MAAQ,CACzB,wBAAyBA,EAAQ,wBACjC,SAAUA,EAAQ,SAClB,KAAMA,EAAQ,SAChB,EACAA,EAAQ,WAAW,MAAQyM,GAAQzM,EAAQ,WAAW,MAC/CA,CACT,CACA,IAAIsM,GAAuB,MAAMK,EAAsB,CASrD,YAAYC,EAAQC,EAAWC,EAAiB,CAC9C,KAAK,OAASF,EACd,KAAK,UAAYC,EACjB,KAAK,gBAAkBC,CACzB,CACA,OAAO,cAAcC,EAAgBvF,EAAuB,CAC1D,IAAIwF,EAAUD,EACVE,EAAaF,GAAgB,WAAa,KAC9C,QAAWG,KAAS1F,EAClByF,EAAaE,GAAW,KAAKF,EAAYC,EAAM,UAAU,EACzDF,EAAU,IAAIL,GAAsBK,EAASC,EAAYC,EAAM,sBAAsB,EAEvF,OAAOF,CACT,CACA,OAAO,WAAW7H,EAAW2H,EAAiB,CAC5C,OAAO,IAAIH,GAAsB,KAAM,IAAIQ,GAAW,KAAMhI,CAAS,EAAG2H,CAAe,CACzF,CACA,OAAO,6BAA6B3H,EAAW2H,EAAiB9M,EAAS,CACvE,IAAMoN,EAAkBpN,EAAQ,oBAAoBmF,CAAS,EACvD0H,EAAY,IAAIM,GAAW,KAAMhI,CAAS,EAC1CkI,EAAYrN,EAAQ,cAAc,WAAW6M,CAAS,EACtDS,EAA0BX,GAAsB,gBACpDG,EACAM,EACAC,CACF,EACA,OAAO,IAAIV,GAAsB,KAAME,EAAWS,CAAuB,CAC3E,CACA,IAAI,WAAY,CACd,OAAO,KAAK,UAAU,SACxB,CACA,UAAW,CACT,OAAO,KAAK,cAAc,EAAE,KAAK,GAAG,CACtC,CACA,OAAOC,EAAO,CACZ,OAAOZ,GAAsB,OAAO,KAAMY,CAAK,CACjD,CACA,OAAO,OAAOC,EAAGC,EAAG,CAClB,EAAG,CAID,GAHID,IAAMC,GAGN,CAACD,GAAK,CAACC,EACT,MAAO,GAKT,GAHI,CAACD,GAAK,CAACC,GAGPD,EAAE,YAAcC,EAAE,WAAaD,EAAE,kBAAoBC,EAAE,gBACzD,MAAO,GAETD,EAAIA,EAAE,OACNC,EAAIA,EAAE,MACR,OAAS,GACX,CACA,OAAO,gBAAgBC,EAAyBC,EAAsBC,EAAiB,CACrF,IAAIC,EAAY,GACZC,EAAa,EACbC,EAAa,EACjB,OAAIH,IAAoB,OACtBC,EAAYD,EAAgB,UAC5BE,EAAaF,EAAgB,aAC7BG,EAAaH,EAAgB,cAExBzB,GAAqB,IAC1BuB,EACAC,EAAqB,WACrBA,EAAqB,UACrB,KACAE,EACAC,EACAC,CACF,CACF,CACA,eAAelB,EAAW7M,EAAS,CACjC,GAAI6M,IAAc,KAChB,OAAO,KAET,GAAIA,EAAU,QAAQ,GAAG,IAAM,GAC7B,OAAOF,GAAsB,gBAAgB,KAAME,EAAW7M,CAAO,EAEvE,IAAM4I,EAASiE,EAAU,MAAM,IAAI,EAC/BnI,EAAS,KACb,QAAWY,KAASsD,EAClBlE,EAASiI,GAAsB,gBAAgBjI,EAAQY,EAAOtF,CAAO,EAEvE,OAAO0E,CACT,CACA,OAAO,gBAAgBsJ,EAAQ7I,EAAWnF,EAAS,CACjD,IAAMiO,EAAcjO,EAAQ,oBAAoBmF,CAAS,EACnD+I,EAAUF,EAAO,UAAU,KAAK7I,CAAS,EACzCgJ,EAAwBnO,EAAQ,cAAc,WAAWkO,CAAO,EAChEE,EAAWzB,GAAsB,gBACrCqB,EAAO,gBACPC,EACAE,CACF,EACA,OAAO,IAAIxB,GAAsBqB,EAAQE,EAASE,CAAQ,CAC5D,CACA,eAAgB,CACd,OAAO,KAAK,UAAU,YAAY,CACpC,CACA,sBAAsB3B,EAAM,CAC1B,IAAM/H,EAAS,CAAC,EACZ2J,EAAO,KACX,KAAOA,GAAQA,IAAS5B,GACtB/H,EAAO,KAAK,CACV,uBAAwB2J,EAAK,gBAC7B,WAAYA,EAAK,UAAU,sBAAsBA,EAAK,QAAQ,WAAa,IAAI,CACjF,CAAC,EACDA,EAAOA,EAAK,OAEd,OAAOA,IAAS5B,EAAO/H,EAAO,QAAQ,EAAI,MAC5C,CACF,EACIqH,GAAiB,MAAMuC,EAAgB,CAYzC,YAAY1B,EAAQ1K,EAAQqM,EAAUC,EAAWC,EAAsBC,EAASpH,EAAgBE,EAAuB,CACrH,KAAK,OAASoF,EACd,KAAK,OAAS1K,EACd,KAAK,qBAAuBuM,EAC5B,KAAK,QAAUC,EACf,KAAK,eAAiBpH,EACtB,KAAK,sBAAwBE,EAC7B,KAAK,MAAQ,KAAK,OAAS,KAAK,OAAO,MAAQ,EAAI,EACnD,KAAK,UAAY+G,EACjB,KAAK,WAAaC,CACpB,CACA,mBAAqB,OAErB,OAAO,KAAO,IAAIF,GAChB,KACA,EACA,EACA,EACA,GACA,KACA,KACA,IACF,EAMA,UAMA,WAIA,MACA,OAAOf,EAAO,CACZ,OAAIA,IAAU,KACL,GAEFe,GAAgB,QAAQ,KAAMf,CAAK,CAC5C,CACA,OAAO,QAAQC,EAAGC,EAAG,CACnB,OAAID,IAAMC,EACD,GAEJ,KAAK,kBAAkBD,EAAGC,CAAC,EAGzBnB,GAAqB,OAAOkB,EAAE,sBAAuBC,EAAE,qBAAqB,EAF1E,EAGX,CAIA,OAAO,kBAAkBD,EAAGC,EAAG,CAC7B,EAAG,CAID,GAHID,IAAMC,GAGN,CAACD,GAAK,CAACC,EACT,MAAO,GAKT,GAHI,CAACD,GAAK,CAACC,GAGPD,EAAE,QAAUC,EAAE,OAASD,EAAE,SAAWC,EAAE,QAAUD,EAAE,UAAYC,EAAE,QAClE,MAAO,GAETD,EAAIA,EAAE,OACNC,EAAIA,EAAE,MACR,OAAS,GACX,CACA,OAAQ,CACN,OAAO,IACT,CACA,OAAO,OAAOkB,EAAI,CAChB,KAAOA,GACLA,EAAG,UAAY,GACfA,EAAG,WAAa,GAChBA,EAAKA,EAAG,MAEZ,CACA,OAAQ,CACNL,GAAgB,OAAO,IAAI,CAC7B,CACA,KAAM,CACJ,OAAO,KAAK,MACd,CACA,SAAU,CACR,OAAI,KAAK,OACA,KAAK,OAEP,IACT,CACA,KAAKpM,EAAQqM,EAAUC,EAAWC,EAAsBC,EAASpH,EAAgBE,EAAuB,CACtG,OAAO,IAAI8G,GACT,KACApM,EACAqM,EACAC,EACAC,EACAC,EACApH,EACAE,CACF,CACF,CACA,aAAc,CACZ,OAAO,KAAK,SACd,CACA,cAAe,CACb,OAAO,KAAK,UACd,CACA,QAAQxH,EAAS,CACf,OAAOA,EAAQ,QAAQ,KAAK,MAAM,CACpC,CACA,UAAW,CACT,IAAMsE,EAAI,CAAC,EACX,YAAK,aAAaA,EAAG,CAAC,EACf,IAAMA,EAAE,KAAK,GAAG,EAAI,GAC7B,CACA,aAAasK,EAAKC,EAAU,CAC1B,OAAI,KAAK,SACPA,EAAW,KAAK,OAAO,aAAaD,EAAKC,CAAQ,GAEnDD,EAAIC,GAAU,EAAI,IAAI,KAAK,MAAM,KAAK,KAAK,gBAAgB,SAAS,CAAC,KAAK,KAAK,uBAAuB,SAAS,CAAC,IACzGA,CACT,CACA,0BAA0BC,EAAuB,CAC/C,OAAI,KAAK,wBAA0BA,EAC1B,KAEF,KAAK,OAAO,KACjB,KAAK,OACL,KAAK,UACL,KAAK,WACL,KAAK,qBACL,KAAK,QACL,KAAK,eACLA,CACF,CACF,CACA,YAAYJ,EAAS,CACnB,OAAI,KAAK,UAAYA,EACZ,KAEF,IAAIJ,GACT,KAAK,OACL,KAAK,OACL,KAAK,UACL,KAAK,WACL,KAAK,qBACLI,EACA,KAAK,eACL,KAAK,qBACP,CACF,CAEA,cAAcnB,EAAO,CACnB,IAAIoB,EAAK,KACT,KAAOA,GAAMA,EAAG,YAAcpB,EAAM,WAAW,CAC7C,GAAIoB,EAAG,SAAWpB,EAAM,OACtB,MAAO,GAEToB,EAAKA,EAAG,MACV,CACA,MAAO,EACT,CACA,mBAAoB,CAClB,MAAO,CACL,OAAuB,KAAK,OAC5B,qBAAsB,KAAK,qBAC3B,QAAS,KAAK,QACd,eAAgB,KAAK,gBAAgB,sBAAsB,KAAK,QAAQ,gBAAkB,IAAI,GAAK,CAAC,EACpG,sBAAuB,KAAK,uBAAuB,sBAAsB,KAAK,cAAc,GAAK,CAAC,CACpG,CACF,CACA,OAAO,UAAUN,EAAMnB,EAAO,CAC5B,IAAMH,EAAiBT,GAAqB,cAAc+B,GAAM,gBAAkB,KAAMnB,EAAM,cAAc,EAC5G,OAAO,IAAIoB,GACTD,EACiBnB,EAAM,OACvBA,EAAM,UAAY,GAClBA,EAAM,WAAa,GACnBA,EAAM,qBACNA,EAAM,QACNH,EACAT,GAAqB,cAAcS,EAAgBG,EAAM,qBAAqB,CAChF,CACF,CACF,EACI6B,GAA2B,KAAM,CACnC,sBACA,wBACA,SAAW,GACX,YAAYC,EAAuBC,EAAyB,CAC1D,KAAK,sBAAwBD,EAAsB,QAChD5E,GACKA,IAAa,KACf,KAAK,SAAW,GACT,CAAC,GAEHG,GAAeH,EAAUI,EAAW,EAAE,IAAKjF,GAAMA,EAAE,OAAO,CAErE,EACA,KAAK,wBAA0B0J,EAAwB,QACpD7E,GAAaG,GAAeH,EAAUI,EAAW,EAAE,IAAKjF,GAAMA,EAAE,OAAO,CAC1E,CACF,CACA,IAAI,eAAgB,CAClB,OAAO,KAAK,UAAY,KAAK,wBAAwB,SAAW,CAClE,CACA,IAAI,cAAe,CACjB,OAAO,KAAK,sBAAsB,SAAW,GAAK,CAAC,KAAK,QAC1D,CACA,MAAMqD,EAAQ,CACZ,QAAWsG,KAAY,KAAK,wBAC1B,GAAIA,EAAStG,CAAM,EACjB,MAAO,GAGX,QAAWuG,KAAY,KAAK,sBAC1B,GAAIA,EAASvG,CAAM,EACjB,MAAO,GAGX,OAAO,KAAK,QACd,CACF,EACI4D,GAAa,KAAM,CACrB,YAAYV,EAAkBlM,EAAUwP,EAAoBpF,EAA0B,CACpF,KAAK,yBAA2BA,EAChC,KAAK,kBAAoB8B,EACzB,KAAK,oBAAsBsD,EAIzB,KAAK,UAAY,KAEnB,KAAK,QAAU,CAAC,EAChB,KAAK,cAAgB,CAAC,EACtB,KAAK,mBAAqB,CAC5B,CACA,kBAIA,UAIA,QAIA,cACA,mBACA,oBACA,QAAQtJ,EAAOuJ,EAAU,CACvB,KAAK,kBAAkBvJ,EAAM,sBAAuBuJ,CAAQ,CAC9D,CACA,kBAAkBC,EAAYD,EAAU,CACtC,GAAI,KAAK,oBAAsBA,EAC7B,OAEF,GAAI,KAAK,kBAAmB,CAC1B,IAAIjB,EAAWkB,GAAY,iBAAmB,EAC1CC,EAA2B,GAI/B,GAHI,KAAK,0BAA0B,gBACjCA,EAA2B,IAEzB,KAAK,oBAAoB,OAAS,GAAK,KAAK,0BAA4B,CAAC,KAAK,yBAAyB,eAAiB,CAAC,KAAK,yBAAyB,aAAc,CACvK,IAAMC,EAAUF,GAAY,cAAc,GAAK,CAAC,EAChD,QAAWzK,KAAa,KAAK,oBACvBA,EAAU,QAAQ2K,CAAO,IAC3BpB,EAAWjC,GAAqB,IAC9BiC,EACA,EACoBvJ,EAAU,KAC9B,KACA,GACA,EACA,CACF,GAGA,KAAK,2BACP0K,EAA2B,KAAK,yBAAyB,MAAMC,CAAO,EAE1E,CAYA,GAXID,IACFnB,EAAWjC,GAAqB,IAC9BiC,EACA,EACA,EACAmB,EACA,GACA,EACA,CACF,GAEE,KAAK,cAAc,OAAS,GAAK,KAAK,cAAc,KAAK,cAAc,OAAS,CAAC,IAAMnB,EAAU,CACnG,KAAK,mBAAqBiB,EAC1B,MACF,CACA,KAAK,cAAc,KAAK,KAAK,kBAAkB,EAC/C,KAAK,cAAc,KAAKjB,CAAQ,EAChC,KAAK,mBAAqBiB,EAC1B,MACF,CACA,IAAMzG,EAAS0G,GAAY,cAAc,GAAK,CAAC,EAC/C,KAAK,QAAQ,KAAK,CAChB,WAAY,KAAK,mBACjB,SAAAD,EAEA,OAAAzG,CACF,CAAC,EACD,KAAK,mBAAqByG,CAC5B,CACA,UAAUvJ,EAAOQ,EAAY,CAC3B,OAAI,KAAK,QAAQ,OAAS,GAAK,KAAK,QAAQ,KAAK,QAAQ,OAAS,CAAC,EAAE,aAAeA,EAAa,GAC/F,KAAK,QAAQ,IAAI,EAEf,KAAK,QAAQ,SAAW,IAC1B,KAAK,mBAAqB,GAC1B,KAAK,QAAQR,EAAOQ,CAAU,EAC9B,KAAK,QAAQ,KAAK,QAAQ,OAAS,CAAC,EAAE,WAAa,GAE9C,KAAK,OACd,CACA,gBAAgBR,EAAOQ,EAAY,CAC7B,KAAK,cAAc,OAAS,GAAK,KAAK,cAAc,KAAK,cAAc,OAAS,CAAC,IAAMA,EAAa,IACtG,KAAK,cAAc,IAAI,EACvB,KAAK,cAAc,IAAI,GAErB,KAAK,cAAc,SAAW,IAChC,KAAK,mBAAqB,GAC1B,KAAK,QAAQR,EAAOQ,CAAU,EAC9B,KAAK,cAAc,KAAK,cAAc,OAAS,CAAC,EAAI,GAEtD,IAAM5B,EAAS,IAAI,YAAY,KAAK,cAAc,MAAM,EACxD,QAAS1C,EAAI,EAAGC,EAAM,KAAK,cAAc,OAAQD,EAAIC,EAAKD,IACxD0C,EAAO1C,CAAC,EAAI,KAAK,cAAcA,CAAC,EAElC,OAAO0C,CACT,CACF,EAGI+K,GAAe,KAAM,CACvB,YAAYC,EAAO1E,EAAU,CAC3B,KAAK,SAAWA,EAChB,KAAK,OAAS0E,CAChB,CACA,UAA4B,IAAI,IAChC,aAA+B,IAAI,IACnC,mBAAqC,IAAI,IACzC,OACA,SAAU,CACR,QAAW1P,KAAW,KAAK,UAAU,OAAO,EAC1CA,EAAQ,QAAQ,CAEpB,CACA,SAAS0P,EAAO,CACd,KAAK,OAASA,CAChB,CACA,aAAc,CACZ,OAAO,KAAK,OAAO,YAAY,CACjC,CAIA,WAAW1P,EAASsL,EAAqB,CACvC,KAAK,aAAa,IAAItL,EAAQ,UAAWA,CAAO,EAC5CsL,GACF,KAAK,mBAAmB,IAAItL,EAAQ,UAAWsL,CAAmB,CAEtE,CAIA,OAAOnG,EAAW,CAChB,OAAO,KAAK,aAAa,IAAIA,CAAS,CACxC,CAIA,WAAWwK,EAAa,CACtB,OAAO,KAAK,mBAAmB,IAAIA,CAAW,CAChD,CAIA,aAAc,CACZ,OAAO,KAAK,OAAO,YAAY,CACjC,CAIA,WAAW9C,EAAW,CACpB,OAAO,KAAK,OAAO,MAAMA,CAAS,CACpC,CAIA,oBAAoB1H,EAAW2E,EAAiB7E,EAAmB8E,EAAYC,EAA0B,CACvG,GAAI,CAAC,KAAK,UAAU,IAAI7E,CAAS,EAAG,CAClC,IAAIyK,EAAa,KAAK,aAAa,IAAIzK,CAAS,EAChD,GAAI,CAACyK,EACH,OAAO,KAET,KAAK,UAAU,IAAIzK,EAAW0E,GAC5B1E,EACAyK,EACA9F,EACA7E,EACA8E,EACAC,EACA,KACA,KAAK,QACP,CAAC,CACH,CACA,OAAO,KAAK,UAAU,IAAI7E,CAAS,CACrC,CACF,EAGI0K,GAAW,KAAM,CACnB,SACA,cACA,oBACA,YAAYpL,EAAS,CACnB,KAAK,SAAWA,EAChB,KAAK,cAAgB,IAAIgL,GACvBK,GAAM,mBAAmBrL,EAAQ,MAAOA,EAAQ,QAAQ,EACxDA,EAAQ,OACV,EACA,KAAK,oBAAsC,IAAI,GACjD,CACA,SAAU,CACR,KAAK,cAAc,QAAQ,CAC7B,CAIA,SAASiL,EAAOK,EAAU,CACxB,KAAK,cAAc,SAASD,GAAM,mBAAmBJ,EAAOK,CAAQ,CAAC,CACvE,CAIA,aAAc,CACZ,OAAO,KAAK,cAAc,YAAY,CACxC,CAKA,iCAAiCC,EAAkBlG,EAAiB7E,EAAmB,CACrF,OAAO,KAAK,6BAA6B+K,EAAkBlG,EAAiB,CAAE,kBAAA7E,CAAkB,CAAC,CACnG,CAKA,6BAA6B+K,EAAkBlG,EAAiBmG,EAAe,CAC7E,OAAO,KAAK,aACVD,EACAlG,EACAmG,EAAc,kBACdA,EAAc,WACd,IAAIlB,GACFkB,EAAc,0BAA4B,CAAC,EAC3CA,EAAc,4BAA8B,CAAC,CAC/C,CACF,CACF,CAIA,YAAYD,EAAkB,CAC5B,OAAO,KAAK,aAAaA,EAAkB,EAAG,KAAM,KAAM,IAAI,CAChE,CACA,aAAaA,EAAkBlG,EAAiB7E,EAAmB8E,EAAYC,EAA0B,CACvG,IAAMkG,EAAsB,IAAIC,GAAyB,KAAK,cAAeH,CAAgB,EAC7F,KAAOE,EAAoB,EAAE,OAAS,GACpCA,EAAoB,EAAE,IAAKE,GAAY,KAAK,mBAAmBA,EAAQ,SAAS,CAAC,EACjFF,EAAoB,aAAa,EAEnC,OAAO,KAAK,qBACVF,EACAlG,EACA7E,EACA8E,EACAC,CACF,CACF,CACA,mBAAmB7E,EAAW,CACvB,KAAK,oBAAoB,IAAIA,CAAS,IACzC,KAAK,qBAAqBA,CAAS,EACnC,KAAK,oBAAoB,IAAIA,EAAW,EAAI,EAEhD,CACA,qBAAqBA,EAAW,CAC9B,IAAMnF,EAAU,KAAK,SAAS,YAAYmF,CAAS,EACnD,GAAInF,EAAS,CACX,IAAMkI,EAAa,OAAO,KAAK,SAAS,eAAkB,WAAa,KAAK,SAAS,cAAc/C,CAAS,EAAI,OAChH,KAAK,cAAc,WAAWnF,EAASkI,CAAU,CACnD,CACF,CAIA,WAAW0H,EAAY1H,EAAa,CAAC,EAAG4B,EAAkB,EAAG7E,EAAoB,KAAM,CACrF,YAAK,cAAc,WAAW2K,EAAY1H,CAAU,EAC7C,KAAK,qBAAqB0H,EAAW,UAAW9F,EAAiB7E,CAAiB,CAC3F,CAIA,qBAAqBE,EAAW2E,EAAkB,EAAG7E,EAAoB,KAAM8E,EAAa,KAAMC,EAA2B,KAAM,CACjI,OAAO,KAAK,cAAc,oBACxB7E,EACA2E,EACA7E,EACA8E,EACAC,CACF,CACF,CACF,EACIqG,GAAUtE,GAAe,KCtoG7BuE,ICAAC,ICAAC,ICAAC,ICAAC,ICAAC,IAeA,IAAMC,GAAqB,YACrBC,GAAsB,kCACtBC,GAEJ,6DACIC,GAAmB,sBAGnBC,GAAqB,IAAI,QASxB,SAASC,GAAKC,EAAOC,EAAS,CAQnC,GAPAD,EAAQA,EAAM,QACZC,EAAQ,OACJC,GAA6BD,EAAQ,MAAM,EAC3CP,GACJS,CACF,EAEIF,EAAQ,QAAUA,EAAQ,WAC5B,OAAOD,EAGT,OACEA,EAEG,QAAQL,GAAqBS,CAAS,EAGtC,QAAQR,GAAwBO,CAAK,EAQ1C,SAASC,EAAUC,EAAMC,EAAOC,EAAK,CACnC,OAAON,EAAQ,QACZI,EAAK,WAAW,CAAC,EAAI,OAAU,KAC9BA,EAAK,WAAW,CAAC,EACjB,MACA,MACFE,EAAI,WAAWD,EAAQ,CAAC,EACxBL,CACF,CACF,CAOA,SAASE,EAAMK,EAAWF,EAAOC,EAAK,CACpC,OAAON,EAAQ,OACbO,EAAU,WAAW,CAAC,EACtBD,EAAI,WAAWD,EAAQ,CAAC,EACxBL,CACF,CACF,CACF,CAUA,SAASC,GAA6BO,EAAQ,CAC5C,IAAIC,EAASZ,GAAmB,IAAIW,CAAM,EAE1C,OAAKC,IACHA,EAASC,GAAuBF,CAAM,EACtCX,GAAmB,IAAIW,EAAQC,CAAM,GAGhCA,CACT,CAMA,SAASC,GAAuBF,EAAQ,CAEtC,IAAMG,EAAS,CAAC,EACZN,EAAQ,GAEZ,KAAO,EAAEA,EAAQG,EAAO,QACtBG,EAAO,KAAKH,EAAOH,CAAK,EAAE,QAAQT,GAAkB,MAAM,CAAC,EAG7D,OAAO,IAAI,OAAO,MAAQe,EAAO,KAAK,GAAG,EAAI,IAAK,GAAG,CACvD,CCpHAC,ICAAC,IAAA,IAAMC,GAAmB,aAUlB,SAASC,GAAcC,EAAMC,EAAMC,EAAM,CAC9C,IAAMC,EAAQ,MAAQH,EAAK,SAAS,EAAE,EAAE,YAAY,EACpD,OAAOE,GAAQD,GAAQ,CAACH,GAAiB,KAAK,OAAO,aAAaG,CAAI,CAAC,EACnEE,EACAA,EAAQ,GACd,CCfAC,IAAA,IAAMC,GAAe,KAUd,SAASC,GAAUC,EAAMC,EAAMC,EAAM,CAC1C,IAAMC,EAAQ,KAAO,OAAOH,CAAI,EAChC,OAAOE,GAAQD,GAAQ,CAACH,GAAa,KAAK,OAAO,aAAaG,CAAI,CAAC,EAC/DE,EACAA,EAAQ,GACd,CCfAC,ICAAC,IAKO,IAAMC,GAA0B,CACrC,QACA,MACA,SACA,QACA,SACA,QACA,SACA,OACA,OACA,SACA,MACA,SACA,QACA,SACA,OACA,KACA,SACA,QACA,SACA,OACA,KACA,SACA,SACA,QACA,SACA,SACA,SACA,OACA,OACA,MACA,QACA,SACA,QACA,SACA,OACA,SACA,SACA,QACA,QACA,QACA,SACA,MACA,QACA,SACA,OACA,SACA,SACA,QACA,OACA,OACA,SACA,MACA,SACA,SACA,QACA,SACA,MACA,OACA,SACA,SACA,SACA,KACA,SACA,QACA,QACA,SACA,SACA,OACA,QACA,KACA,OACA,QACA,SACA,OACA,MACA,SACA,SACA,QACA,SACA,OACA,OACA,SACA,SACA,OACA,OACA,SACA,QACA,OACA,QACA,MACA,OACA,MACA,OACA,OACA,OACA,QACA,QACA,QACA,SACA,QACA,SACA,MACA,OACA,SACA,MACA,MACF,EChHAC,IAKO,IAAMC,GAAyB,CACpC,KAAM,OACN,MAAO,OACP,KAAM,OACN,MAAO,OACP,OAAQ,OACR,IAAK,OACL,OAAQ,OACR,KAAM,OACN,IAAK,OACL,KAAM,OACN,KAAM,OACN,MAAO,OACP,IAAK,OACL,IAAK,OACL,IAAK,OACL,KAAM,OACN,IAAK,OACL,OAAQ,OACR,KAAM,OACN,KAAM,OACN,MAAO,OACP,MAAO,OACP,KAAM,OACN,OAAQ,OACR,MAAO,OACP,KAAM,OACN,KAAM,OACN,MAAO,OACP,OAAQ,OACR,OAAQ,OACR,OAAQ,OACR,OAAQ,OACR,OAAQ,OACR,OAAQ,OACR,MAAO,OACP,OAAQ,OACR,KAAM,OACN,MAAO,OACP,MAAO,OACP,OAAQ,OACR,OAAQ,OACR,OAAQ,OACR,MAAO,OACP,KAAM,OACN,OAAQ,OACR,OAAQ,OACR,MAAO,OACP,KAAM,OACN,IAAK,OACL,OAAQ,OACR,OAAQ,OACR,OAAQ,OACR,MAAO,OACP,OAAQ,OACR,KAAM,OACN,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","names":["init_esm_shims","init_esm_shims","init_esm_shims","init_esm_shims","MIME_TYPE_OPENAI","MIME_TYPE_MCP","fetchHtml","baseUrl","path","normalizedBase","buildOpenAIResourceMeta","config","buildMcpAppsResourceMeta","csp","buildToolMeta","createResource","config","id","title","description","baseUrl","htmlPath","widgetDomain","prefersBorder","autoHeight","widgetCSP","hostname","openaiUri","mcpUri","htmlPromise","getHtml","fetchHtml","uiDescription","register","server","html","MIME_TYPE_OPENAI","uri","buildOpenAIResourceMeta","MIME_TYPE_MCP","buildMcpAppsResourceMeta","init_esm_shims","init_esm_shims","init_esm_shims","init_esm_shims","init_esm_shims","SUGGESTIONS_META_KEY","SCOPED_CLIENT_KEY","extractScopedClient","extra","createTool","config","handler","resource","description","inputSchema","annotations","autoInjectResultText","id","title","toolMeta","buildToolMeta","server","args","extra","requestExtra","_meta","waniwani","extractScopedClient","result","registerTools","tools","t","init_esm_shims","init_esm_shims","Fragment","jsx","jsxs","applyIframePatches","baseUrl","passthroughOrigins","htmlElement","mutations","mutation","attrName","originalReplaceState","_s","unused","url","u","originalPushState","appOrigin","isInIframe","e","a","originalFetch","input","init","isRelativeString","newUrl","wsAppOrigin","OriginalWebSocket","PatchedWebSocket","protocols","parsed","rewritten","PATCH_SCRIPT","InitializeNextJsInIframe","init_esm_shims","init_esm_shims","useCallback","useEffect","useRef","useState","init_esm_shims","DEFAULT_MOCK_CONFIG","mockState","initializeMockOpenAI","initialToolOutput","mode","updateMockGlobal","name","args","prompt","href","state","SetGlobalsEvent","key","value","getMockState","updateMockToolOutput","props","updateMockDisplayMode","updateMockTheme","theme","Fragment","jsx","jsxs","MOCK_SAFE_AREA_HEIGHT","DevIcon","className","CloseIcon","InlineIcon","PipIcon","FullscreenIcon","SunIcon","MoonIcon","ResetIcon","panelAnimationStyles","DevModeProvider","defaultProps","widgetPaths","children","isInitialized","setIsInitialized","useState","isWidgetPage","setIsWidgetPage","useEffect","currentPath","isWidget","path","initializeMockOpenAI","WidgetPreviewFrame","DevControls","SegmentedControl","options","value","onChange","activeIndex","opt","option","isOpen","setIsOpen","isAnimating","setIsAnimating","shouldRender","setShouldRender","displayMode","setDisplayMode","theme","setTheme","showSafeArea","setShowSafeArea","propsJson","setPropsJson","jsonError","setJsonError","debounceRef","useRef","panelRef","containerRef","state","getMockState","SetGlobalsEvent","openPanel","useCallback","closePanel","togglePanel","handleKeyDown","e","handleClickOutside","handleDisplayModeChange","mode","updateMockDisplayMode","handleThemeChange","newTheme","updateMockTheme","applyProps","json","parsed","updateMockToolOutput","handlePropsChange","handlePropsBlur","handleReset","defaultJson","displayModeOptions","themeOptions","init_esm_shims","init_esm_shims","useCallback","useContext","useLayoutEffect","useMemo","useRef","init_esm_shims","createContext","WidgetClientContext","Fragment","jsx","ADVANCED_KEY_PREFIX","ADVANCED_WINDOW_MS","advancedKeyFor","viewUUID","readAdvanced","raw","parsed","markAdvanced","byMountId","isChatGptHost","getChatGptHostBridge","GhostSuppressor","useLayoutEffect","html","body","prevHtmlStyle","prevBodyStyle","zero","unstable_useSendFollowUpWithGhostGuard","sendFollowUp","client","useContext","WidgetClientContext","innerRef","useRef","clientMetadata","hostMetadata","metadata","mountIdRef","wrappedSendFollowUp","useCallback","prompt","_options","err","Guard","useMemo","mountId","children","advanced","init_esm_shims","useCallback","init_esm_shims","React","useCallback","useContext","useEffect","useState","useSyncExternalStore","init_esm_shims","createWidgetClient","detectPlatform","OpenAIWidgetClient","MCPAppsWidgetClient","WidgetProvider","children","loading","onError","client","setClient","useState","error","setError","isConnecting","setIsConnecting","useEffect","mounted","activeClient","initClient","widgetClient","createWidgetClient","err","syncTheme","theme","React","WidgetClientContext","useWidgetClient","key","useContext","subscribe","useCallback","onChange","getSnapshot","store","useSyncExternalStore","useCallTool","client","useWidgetClient","useCallback","name","args","init_esm_shims","useDisplayMode","useWidgetClient","init_esm_shims","init_esm_shims","useToolOutput","useWidgetClient","useFlowAction","useToolOutput","init_esm_shims","useSyncExternalStore","useIsChatGptApp","init_esm_shims","useLocale","useWidgetClient","init_esm_shims","useMaxHeight","useWidgetClient","init_esm_shims","useCallback","useOpenExternal","client","useWidgetClient","useCallback","url","init_esm_shims","useCallback","useRequestDisplayMode","client","useWidgetClient","useCallback","mode","init_esm_shims","useSafeArea","useWidgetClient","init_esm_shims","useCallback","useSendFollowUp","client","useWidgetClient","useCallback","prompt","options","hasModelContext","error","init_esm_shims","useTheme","useWidgetClient","init_esm_shims","useToolResponseMetadata","useWidgetClient","init_esm_shims","useCallback","useUpdateModelContext","client","useWidgetClient","useCallback","context","init_esm_shims","useCallback","useEffect","useState","useWidgetState","defaultState","widgetStateFromWindow","useWidgetClient","widgetState","_setWidgetState","useState","useEffect","setWidgetState","useCallback","state","prevState","newState","detectPlatform","init_esm_shims","jsx","jsxs","LoadingWidget","init_esm_shims","init_esm_shims","init_esm_shims","LEVELS","getGlobalLevel","explicit","createLogger","namespace","enabled","args","init_esm_shims","resolveWebSearchConfig","value","init_esm_shims","createCors","response","createJsonResponse","cors","data","status","init_esm_shims","init_esm_shims","WaniWaniError","message","status","init_esm_shims","extractGeoFromHeaders","request","h","rawCity","city","safeDecodeURI","country","countryRegion","latitude","longitude","timezone","ip","value","init_esm_shims","applyModelContextToSystemPrompt","systemPrompt","modelContext","hasModelContext","widgetContext","formatModelContextForPrompt","createChatRequestHandler","deps","apiKey","apiUrl","source","systemPrompt","maxSteps","beforeRequest","mcpServerUrlOverride","resolveConfig","debug","webSearch","log","createLogger","request","body","messages","sessionId","modelContext","effectiveSystemPrompt","extra","clientVisitorContext","geo","extractGeoFromHeaders","visitor","result","hookError","status","WaniWaniError","message","mcpServerUrl","applyModelContextToSystemPrompt","upstreamUrl","clientUserAgent","response","errorBody","headers","upstreamSessionId","error","init_esm_shims","createResourceHandler","deps","mcpServerUrlOverride","resolveConfig","debug","log","createLogger","url","uri","mcpServerUrl","createMCPClient","StreamableHTTPClientTransport","importError","mcp","result","content","html","error","message","status","WaniWaniError","init_esm_shims","createToolHandler","deps","mcpServerUrlOverride","resolveConfig","debug","source","log","createLogger","request","body","name","args","requestSessionId","mcpServerUrl","Client","StreamableHTTPClientTransport","importError","transport","client","_meta","result","error","message","status","WaniWaniError","init_esm_shims","createToolsListHandler","deps","mcpServerUrlOverride","resolveConfig","debug","log","createLogger","mcpServerUrl","createMCPClient","StreamableHTTPClientTransport","importError","mcp","result","response","tool","error","message","status","WaniWaniError","init_esm_shims","TTL_MS","createMcpConfigResolver","apiUrl","apiKey","cached","inflight","WaniWaniError","response","body","data","DEFAULT_API_URL","createApiHandler","options","apiKey","apiUrl","source","systemPrompt","maxSteps","beforeRequest","mcpServerUrl","debug","webSearch","log","createLogger","cors","createCors","json","createJsonResponse","resolveConfig","createMcpConfigResolver","handleChat","createChatRequestHandler","resolveWebSearchConfig","handleResource","createResourceHandler","handleToolsList","createToolsListHandler","handleTool","createToolHandler","evalEnabled","routeGet","request","url","subRoute","data","response","error","message","routePost","body","res","e","msg","chatResponse","routePatch","segments","scenarioId","handleOptions","deprecationWarned","toNextJsHandler","client","options","apiKey","apiUrl","debugEnabled","handler","createApiHandler","init_esm_shims","forwardRef","useCallback","useEffect","useImperativeHandle","useRef","useState","init_esm_shims","init_esm_shims","mergeClasses","classes","className","index","array","toKebabCase","string","toCamelCase","string","match","p1","p2","toPascalCase","string","camelCase","toCamelCase","defaultAttributes","hasA11yProp","props","prop","Icon","forwardRef","color","size","strokeWidth","absoluteStrokeWidth","className","children","iconNode","rest","ref","createElement","defaultAttributes","mergeClasses","hasA11yProp","tag","attrs","createLucideIcon","iconName","iconNode","Component","forwardRef","className","props","ref","createElement","Icon","mergeClasses","toKebabCase","toPascalCase","__iconNode","ArrowDown","createLucideIcon","__iconNode","ArrowUp","createLucideIcon","__iconNode","Check","createLucideIcon","__iconNode","ChevronDown","createLucideIcon","__iconNode","ChevronRight","createLucideIcon","__iconNode","ClipboardCopy","createLucideIcon","__iconNode","Clock","createLucideIcon","__iconNode","File","createLucideIcon","__iconNode","Globe","createLucideIcon","__iconNode","Loader","createLucideIcon","__iconNode","Paperclip","createLucideIcon","__iconNode","Square","createLucideIcon","__iconNode","Wrench","createLucideIcon","__iconNode","X","createLucideIcon","__iconNode","Zap","createLucideIcon","useCallback","init_esm_shims","useCallback","useMemo","useRef","useState","DEFAULT_SPRING_ANIMATION","STICK_TO_BOTTOM_OFFSET_PX","SIXTY_FPS_INTERVAL_MS","RETAIN_ANIMATION_DURATION_MS","mouseDown","useStickToBottom","options","escapedFromLock","updateEscapedFromLock","isAtBottom","updateIsAtBottom","isNearBottom","setIsNearBottom","optionsRef","isSelecting","selection","range","scrollRef","setIsAtBottom","state","setEscapedFromLock","lastCalculation","scrollTop","contentRef","targetScrollTop","calculatedScrollTop","scrollToBottom","scrollOptions","waitElapsed","behavior","mergeAnimations","ignoreEscapes","durationElapsed","startTarget","next","promise","tick","tickDelta","stopScroll","handleScroll","target","ignoreScrollToTop","lastScrollTop","isScrollingDown","isScrollingUp","handleWheel","deltaY","element","useRefCallback","scroll","content","previousHeight","entry","height","difference","animation","callback","deps","result","ref","animationCache","animations","instant","key","init_esm_shims","React","createContext","useContext","useEffect","useImperativeHandle","useLayoutEffect","useMemo","useRef","StickToBottomContext","createContext","useIsomorphicLayoutEffect","useLayoutEffect","useEffect","StickToBottom","instance","children","resize","initial","mass","damping","stiffness","currentTargetScrollTop","contextRef","props","customTargetScrollTop","useRef","targetScrollTop","target","elements","context","defaultInstance","useStickToBottom","scrollRef","contentRef","scrollToBottom","stopScroll","isAtBottom","escapedFromLock","state","useMemo","useImperativeHandle","Content","scrollClassName","useStickToBottomContext","useContext","init_esm_shims","twMerge","extendTailwindMerge","cn","inputs","clsx","init_esm_shims","jsx","Button","className","variant","size","type","props","cn","jsx","Conversation","className","props","StickToBottom","cn","ConversationContent","ConversationScrollButton","isAtBottom","scrollToBottom","useStickToBottomContext","handleScrollToBottom","useCallback","Button","ArrowDown","init_esm_shims","init_esm_shims","crypto","init_esm_shims","urlAlphabet","POOL_SIZE_MULTIPLIER","pool","poolOffset","fillPool","bytes","crypto","nanoid","size","fillPool","id","i","poolOffset","urlAlphabet","pool","createContext","useCallback","useContext","useEffect","useMemo","useRef","useState","init_esm_shims","init_esm_shims","createContext","useContext","useEffect","useMemo","useState","init_esm_shims","init_esm_shims","init_esm_shims","init_esm_shims","en","count","init_esm_shims","init_esm_shims","jsx","I18nContext","createContext","useTranslation","ctx","useContext","I18nContext","en","init_esm_shims","formatRelativeTime","timestamp","locale","diff","value","unit","jsx","jsxs","convertBlobUrlToDataUrl","url","blob","resolve","reader","LocalAttachmentsContext","createContext","usePromptInputAttachments","context","useContext","PromptInput","className","accept","multiple","globalDrop","maxFiles","maxFileSize","onSubmit","children","props","t","useTranslation","inputRef","useRef","formRef","items","setItems","useState","filesRef","useEffect","openFileDialog","useCallback","add","fileList","incoming","withinSize","f","valid","prev","capacity","capped","file","nanoid","remove","id","found","clear","handleChange","event","onDragOver","e","onDrop","handleSubmit","form","text","convertedFiles","_id","item","dataUrl","result","attachmentsCtx","useMemo","cn","PromptInputTextarea","onChange","onKeyDown","className","placeholder","props","t","useTranslation","attachments","usePromptInputAttachments","isComposing","setIsComposing","useState","resolvedPlaceholder","handleKeyDown","useCallback","e","form","lastAttachment","handlePaste","event","items","files","item","file","jsx","cn","PromptInputSubmit","status","onStop","onClick","children","isGenerating","Icon","ArrowUp","Loader","Square","handleClick","Button","PromptInputAddAttachments","jsxs","X","Paperclip","init_esm_shims","memo","useCallback","init_esm_shims","jsx","Queue","className","props","cn","QueueItem","QueueItemIndicator","QueueItemContent","QueueItemActions","QueueItemAction","Button","jsx","jsxs","ChatQueueItem","memo","message","onRemove","t","useTranslation","handleRemove","useCallback","QueueItem","QueueItemIndicator","QueueItemContent","QueueItemActions","QueueItemAction","X","ChatQueue","queuedMessages","className","Queue","cn","msg","init_esm_shims","useState","jsx","ExportSessionButton","messages","evalEnabled","api","t","useTranslation","saving","setSaving","useState","feedback","setFeedback","handleExport","session","res","label","init_esm_shims","init_esm_shims","jsx","jsxs","Attachments","files","className","props","cn","file","i","AttachmentItem","useTranslation","File","init_esm_shims","createContext","useCallback","useContext","useEffect","useMemo","useState","init_esm_shims","createContext","memo","useCallback","useContext","useEffect","useMemo","useRef","useState","init_esm_shims","init_esm_shims","memo","jsx","ShimmerComponent","Component","className","duration","style","children","props","mergedStyle","cn","Shimmer","memo","Fragment","jsx","jsxs","ReasoningContext","createContext","useReasoning","ctx","useContext","AUTO_CLOSE_DELAY","MS_IN_S","Reasoning","memo","className","isStreaming","open","defaultOpen","onOpenChange","durationProp","children","props","resolvedDefaultOpen","isExplicitlyClosed","isControlled","internalOpen","setInternalOpen","useState","isOpen","setIsOpen","useCallback","next","internalDuration","setInternalDuration","duration","hasEverStreamedRef","useRef","hasAutoClosed","setHasAutoClosed","startTimeRef","useEffect","timer","contextValue","useMemo","cn","ReasoningTrigger","getThinkingMessage","hideIcon","onClick","t","useTranslation","resolvedGetThinkingMessage","streaming","dur","Shimmer","e","Clock","ReasoningContent","xn","jsx","jsxs","SETTLE_DELAY","ChainContext","createContext","useChain","ctx","useContext","ChainOfThought","className","isWorking","activeStep","open","defaultOpen","onOpenChange","children","props","isControlled","internalOpen","setInternalOpen","useState","isOpen","setOpen","useCallback","next","settled","setSettled","useEffect","timer","contextValue","useMemo","cn","ChainOfThoughtHeader","label","workingLabel","Icon","text","Shimmer","ChevronDown","ChainOfThoughtContent","ChainOfThoughtRail","isLast","running","error","ChainOfThoughtStep","title","state","isRunning","isError","expandable","labelNode","o","ChainOfThoughtReasoning","isStreaming","Clock","Reasoning","ReasoningTrigger","ReasoningContent","init_esm_shims","init_esm_shims","init_esm_shims","init_esm_shims","init_esm_shims","init_esm_shims","codes","init_esm_shims","constants","init_esm_shims","types","init_esm_shims","init_esm_shims","init_esm_shims","isAmbiguous","x","isFullWidth","isWide","getCategory","validate","codePoint","eastAsianWidthType","getCategory","__defProp","__defNormalProp","obj","key","value","__publicField","isEmoji","uc","cjkOrIvs","eastAsianWidthType","isCjkAmbiguousPunctuation","main","vs","nonEmojiGeneralUseVS","code","unicodePunctuation","regexCheck","unicodeWhitespace","regex","check","constantsEx","constantsEx2","classifyCharacter","codes","markdownLineEndingOrSpace","constants","classifyPrecedingCharacter","before","get2Previous","previous","isNonEmojiGeneralUseVS","twoPrevious","twoBefore","isUnicodeWhitespace","stripIvs","category","isNonCjkPunctuation","isCjk","isIvs","isCjkOrIvs","isSpaceOrPunctuation","isCodeHighSurrogate","isCodeLowSurrogate","tryGetGenuinePreviousCode","nowPoint","sliceSerialize","previousCandidate","tryGetCodeTwoBefore","previousCode","previousWidth","idealStart","twoPreviousBuffer","twoPreviousLast","twoPreviousCandidate","TwoPreviousCode","tryGetGenuineNextCode","nextCandidate","attention","resolveAllAttention","tokenizeAttention","events","context","index","open","group","text","openingSequence","closingSequence","use","nextEvents","offset","start","end","movePoint","types","push","resolveAll","splice","effects","ok","attentionMarkers","now","sliceSerialize","tentativePrevious","previous","isCodeLowSurrogate","tryGetGenuinePreviousCode","before","classifyCharacter","twoPrevious","TwoPreviousCode","beforePrimary","classifyPrecedingCharacter","marker","code","codes","inside","token","next","isCodeHighSurrogate","tryGetGenuineNextCode","after","beforeNonCjkPunctuation","isNonCjkPunctuation","beforeSpaceOrNonCjkPunctuation","isUnicodeWhitespace","afterNonCjkPunctuation","afterSpaceOrNonCjkPunctuation","beforeCjkOrIvs","isCjkOrIvs","close","isCjk","isSpaceOrPunctuation","point","cjkFriendlyExtension","remarkCjkFriendly","data","cjkFriendlyExtension","init_esm_shims","init_esm_shims","gfmStrikethroughCjkFriendly","options","single","tokenizer","tokenizeStrikethrough","resolveAllStrikethrough","codes","events","context","index","open","strikethrough","text","nextEvents","insideSpan","splice","resolveAll","types","effects","ok","nok","now","sliceSerialize","tentativePrevious","previous","isCodeLowSurrogate","tryGetGenuinePreviousCode","before","classifyCharacter","twoPrevious","TwoPreviousCode","beforePrimary","classifyPrecedingCharacter","size","start","code","more","before2","token","next","isCodeHighSurrogate","tryGetGenuineNextCode","after","beforeSpaceOrNonCjkPunctuation","isNonCjkPunctuation","isUnicodeWhitespace","afterSpaceOrNonCjkPunctuation","beforeCjkOrIvs","isCjk","isIvs","constants","remarkGfmStrikethroughCjkFriendly","options","data","gfmStrikethroughCjkFriendly","k","m","f","t","r","P","e","p","d","y","visit","i","n","l","u","o","s","b","remarkCjkFriendly","remarkGfmStrikethroughCjkFriendly","A","init_esm_shims","init_esm_shims","init_esm_shims","init_esm_shims","init_esm_shims","ShikiError","message","init_esm_shims","clone","something","doClone","cloneArray","cloneObj","arr","r","i","len","obj","key","mergeObjects","target","sources","source","basename","path","idx","CAPTURING_REGEX_SOURCE","RegexSource","regexSource","captureSource","captureIndices","match","index","commandIndex","command","capture","result","strcmp","a","b","strArrCmp","len1","len2","res","isValidHexColor","hex","escapeRegExpCharacters","value","CachedFn","fn","Theme","_colorMap","_defaults","_root","colorMap","parseTheme","resolveParsedThemeRules","scopeName","scopePath","effectiveRule","v","_scopePathMatchesParentScopes","StyleAttributes","ScopeStack","_ScopeStack","parent","scopeNames","name","segments","item","other","base","parentScopes","scopePattern","scopeMustMatch","_matchesScope","fontStyle","foregroundId","backgroundId","settings","resultLen","entry","scopes","_scope","j","lenJ","foreground","background","scope","ParsedThemeRule","FontStyle","FontStyle2","parsedThemeRules","defaultFontStyle","defaultForeground","defaultBackground","incomingDefaults","ColorMap","defaults","root","ThemeTrieElement","ThemeTrieElementRule","rule","color","emptyParentScopes","_ThemeTrieElementRule","scopeDepth","_ThemeTrieElement","_mainRule","rulesWithParentScopes","_children","aParentIndex","bParentIndex","parentScopeLengthDiff","dotIndex","head","tail","rules","child","EncodedTokenMetadata","_EncodedTokenMetadata","encodedTokenAttributes","languageId","tokenType","containsBalancedBrackets","_languageId","_tokenType","_containsBalancedBracketsBit","_fontStyle","_foreground","_background","createMatchers","selector","matchesName","results","tokenizer","newTokenizer","token","priority","matcher","parseConjunction","parseOperand","expressionToNegate","matcherInput","expressionInParents","parseInnerExpression","isIdentifier","identifiers","matchers","matcher2","input","regex","match","res","disposeOnigString","str","TopLevelRuleReference","scopeName","TopLevelRepositoryRuleReference","ruleName","ExternalReferenceCollector","reference","key","ScopeDependencyProcessor","repo","initialScopeName","q","deps","dep","collectReferencesOfReference","baseGrammarScopeName","result","selfGrammar","baseGrammar","collectExternalReferencesInTopLevelRule","collectExternalReferencesInTopLevelRepositoryRule","injections","injection","context","rule","collectExternalReferencesInRules","rules","patternRepository","mergeObjects","include","parseInclude","newContext","BaseReference","SelfReference","RelativeReference","TopLevelReference","TopLevelRepositoryReference","indexOfSharp","HAS_BACK_REFERENCES","BACK_REFERENCING_END","endRuleId","whileRuleId","Rule","$location","id","name","contentName","RegexSource","location","basename","lineText","captureIndices","CaptureRule","retokenizeCapturedWithRuleId","grammar","out","endRegexSource","allowA","allowG","MatchRule","match","captures","RegExpSource","RegExpSourceList","IncludeOnlyRule","patterns","pattern","BeginEndRule","begin","beginCaptures","end","endCaptures","applyEndPatternLast","BeginWhileRule","_while","whileCaptures","whileRuleId","RuleFactory","_RuleFactory","helper","desc","repository","mergeObjects","maximumCaptureId","captureId","numericCaptureId","i","len","ruleId","reference","parseInclude","localIncludedRule","externalGrammarName","externalGrammarInclude","externalGrammar","externalIncludedRule","rule","skipRule","_RegExpSource","regExpSource","lastPushedPos","output","hasAnchor","pos","nextCh","HAS_BACK_REFERENCES","newSource","capturedValues","capture","BACK_REFERENCING_END","g1","escapeRegExpCharacters","A0_G0_result","A0_G1_result","A1_G0_result","A1_G1_result","ch","item","index","onigLib","regExps","e","CompiledRule","rules","r","string","startPosition","options","result","BasicScopeAttributes","languageId","tokenType","BasicScopeAttributesProvider","_BasicScopeAttributesProvider","initialLanguageId","embeddedLanguages","ScopeMatcher","scopeName","CachedFn","standardTokenType","scope","m","values","escapedScopes","value","DebugFlags","UseOnigurumaFindOptions","TokenizeStringResult","stack","stoppedEarly","_tokenizeString","isFirstLine","linePos","lineTokens","checkWhileConditions","timeLimit","lineLength","STOP","anchorPosition","whileCheckResult","_checkWhileConditions","startTime","scanNext","matchRuleOrInjections","matchedRuleId","hasAdvanced","endRuleId","poppedRule","handleCaptures","popped","_rule","beforePush","nameScopesList","pushedRule","contentNameScopesList","whileRules","node","nodeRule","whileRule","ruleScanner","findOptions","prepareRuleWhileSearch","matchResult","matchRule","injections","injectionResult","matchInjections","matchResultScore","injectionResultScore","prepareRuleSearch","bestMatchRating","bestMatchCaptureIndices","bestMatchRuleId","bestMatchResultPriority","scopes","injection","matchRating","ruleScanner2","getFindOptions","lineTextContent","localStack","maxEnd","captureRule","captureIndex","stackClone","onigSubStr","disposeOnigString","captureRuleScopeName","captureRuleScopesList","LocalStackElement","endPos","createGrammar","initialLanguage","tokenTypes","balancedBracketSelectors","grammarRepository","Grammar","collectInjections","selector","ruleFactoryHelper","matchers","createMatchers","nameMatcher","matcher","identifers","lastIndex","identifier","scopesAreMatching","thisScopeName","_rootScopeName","_onigLib","initGrammar","sources","scopeName2","rawInjections","expression","injectionScopeNames","injectionScopeName","injectionGrammar","i1","i2","factory","rawIncludedGrammar","prevState","emitBinaryTokens","StateStackImpl","rawDefaultMetadata","defaultStyle","defaultMetadata","EncodedTokenMetadata","rootScopeName","scopeList","AttributedScopeStack","onigLineText","LineTokens","base","clone","_AttributedScopeStack","parent","scopePath","tokenAttributes","namesScopeList","current","scopeNames","frame","ScopeStack","rawRootMetadata","rootStyle","resolvedTokenAttributes","other","a","b","existingTokenAttributes","basicScopeAttributes","styleAttributes","fontStyle","foreground","background","target","rawMetadata","newPath","scopeThemeMatchResult","metadata","self","_StateStackImpl","enterPos","anchorPos","beginRuleCapturedEOL","endRule","el","res","outIndex","contentNameScopeStack","BalancedBracketSelectors","balancedBracketScopes","unbalancedBracketScopes","excluder","includer","tokenTypeOverrides","endIndex","scopesList","containsBalancedBrackets","scopes2","SyncRegistry","theme","targetScope","rawGrammar","Registry","Theme","colorMap","initialScopeName","configuration","dependencyProcessor","ScopeDependencyProcessor","request","INITIAL","init_esm_shims","init_esm_shims","init_esm_shims","init_esm_shims","init_esm_shims","init_esm_shims","defaultSubsetRegex","surrogatePairsRegex","controlCharactersRegex","regexEscapeRegex","subsetToRegexCache","core","value","options","charactersToExpressionCached","basic","surrogate","pair","index","all","character","subset","cached","charactersToExpression","groups","init_esm_shims","init_esm_shims","hexadecimalRegex","toHexadecimal","code","next","omit","value","init_esm_shims","decimalRegex","toDecimal","code","next","omit","value","init_esm_shims","init_esm_shims","characterEntitiesLegacy","init_esm_shims","characterEntitiesHtml4","init_esm_shims","dangerous","own","characters","key","characterEntitiesHtml4","notAlphanumericRegex","toNamed","code","next","omit","attribute","character","name","value","characterEntitiesLegacy","dangerous","formatSmart","code","next","options","numeric","toHexadecimal","named","toNamed","decimal","toDecimal","stringifyEntities","value","options","core","formatSmart","htmlCommentRegex","bogusCommentEntitySubset","commentEntitySubset","comment","node","_1","_2","state","stringifyEntities","encode","$0","init_esm_shims","doctype","_1","_2","_3","state","init_esm_shims","init_esm_shims","init_esm_shims","siblingAfter","siblings","siblingBefore","emptyChildren","increment","sibling","parent","index","includeWhitespace","offset","next","whitespace","init_esm_shims","own","omission","handlers","omit","node","index","parent","closing","omission","body","headOrColgroupOrCaption","dd","dt","html","li","optgroup","option","p","rubyElement","tbody","cells","tfoot","thead","tr","_","index","parent","next","siblingAfter","whitespace","init_esm_shims","opening","omission","body","colgroup","head","html","tbody","node","siblingAfter","seen","child","whitespace","index","parent","previous","siblingBefore","closing","constants","element","node","index","parent","state","schema","omit","selfClosing","parts","last","svg","attributes","serializeAttributes","content","opening","closing","properties","values","key","value","serializeAttribute","info","find","x","y","quote","result","name","stringifyEntities","stringify","ccount","init_esm_shims","init_esm_shims","textEntitySubset","text","node","_","parent","state","stringifyEntities","raw","node","index","parent","state","text","init_esm_shims","root","node","_1","_2","state","handle","zwitch","invalid","unknown","comment","doctype","element","raw","root","text","node","node_","emptyOptions","emptyCharacterReferences","emptyChildren","toHtml","tree","options","options_","quote","alternative","one","all","htmlVoidElements","svg","html","node","index","parent","handle","results","children","resolveColorReplacements","theme","options","replacements","themeName","key","value","applyColorReplacements","color","toArray","x","normalizeGetter","p","r","isPlainLang","lang","isSpecialLang","isNoneTheme","isSpecialTheme","addClassToHast","node","className","targets","c","splitLines","code","preserveEnding","parts","index","lines","i","line","createPositionConverter","indexToPos","character","lineText","posToIndex","guessEmbeddedLanguages","_lang","highlighter","langs","match","fullType","bundle","l","DEFAULT_COLOR_LIGHT_DARK","COLOR_KEYS","splitToken","token","offsets","lastOffset","tokens","offset","splitTokens","breakpoints","sorted","a","b","breakpointsInToken","flatTokenVariants","merged","variantsOrder","cssVariablePrefix","defaultColor","colorsRendering","styles","t","getTokenStyleObject","styleKeys","mergedStyles","varKey","idx","keyName","cur","lightIndex","darkIndex","ShikiError","lightValue","darkValue","FontStyle","decorations","stringifyTokenStyle","_grammarStateMap","setLastGrammarStateToMap","keys","state","getLastGrammarStateFromMap","GrammarState","_GrammarState","themes","INITIAL","args","stacksMap","stack","getScopes","scopes","visited","pushScope","stack2","name","getGrammarStack","transformerDecorations","map","getContext","shiki","normalizePosition","converter","d","verifyIntersections","codeEl","ctx","applyLineSection","start","end","decoration","lineEl","text","startIndex","endIndex","stringify","children","applyDecoration","wrapper","applyLine","el","type","properties","transform","lineApplies","items","foo","j","bar","isFooHasBarStart","isFooHasBarEnd","isBarHasFooStart","isBarHasFooEnd","builtInTransformers","getTransformers","transformers","sortTransformersByEnforcement","pre","post","normal","transformer","namedColors","findSequence","position","nextEscape","nextClose","parseColor","sequence","colorMode","rgb","parseSequence","commands","codeInt","createAnsiSequenceParser","foreground","background","decorations2","findResult","styleToken","defaultNamedColorsMap","createColorPalette","namedColorsMap","namedColor","rgbColor","colorTable","getColorTable","levels","g","level","tableColor","defaultAnsiColors","tokenizeAnsiWithTheme","fileContents","colorReplacements","ansiPalette","themeColor","colorPalette","parser","bgColor","dimColor","fontStyle","hexMatch","hex","alpha","cssVarMatch","codeToTokensBase","internal","colorMap","_grammar","tokenizeWithTheme","getLastGrammarState","_tokenizeWithTheme","grammar","result","grammarState","tokenizeMaxLineLength","tokenizeTimeLimit","stateStack","actual","final","len","lineOffset","resultWithScopes","tokensWithScopes","tokensWithScopesIndex","tokensLength","nextStartIndex","metadata","EncodedTokenMetadata","themeSettingsSelectors","setting","selectors","scope","selector","tokenWithScopes","tokenWithScopesText","explainThemeScopesNameOnly","explainThemeScopesFull","themeSelectors","explainThemeScope","matchesOne","matches","parentScopes","selectorParentIndex","parentIndex","settings","selectorPieces","codeToTokensWithThemes","themedTokens","tokens2","syncThemesTokenization","mergedTokens","lineIdx","_token","tokenIdx","mergedToken","themeIdx","_","__","___","mergedGrammarState","s","outThemes","count","outLines","i2","indexes","current","minLength","n","codeToTokens","bg","fg","rootStyle","themeTokens","themeRegs","themesOrder","themeColorReplacements","mapThemeColors","_theme","property","cssVar","t2","codeToHast","transformerContext","_code","_options","input","mergeWhitespaces","mergeSameStyleTokens","mergeWhitespaceTokens","splitWhitespaceTokens","mergeAdjacentStyledTokens","contextSource","tokensToHast","root","structure","tabindex","preNode","codeNode","lineNodes","context","lineNode","col","tokenNode","style","syntheticLines","currentLine","child","transformedCode","newLine","carryOnContent","firstOffset","couldMerge","leading","content","trailing","expanded","prevToken","prevStyle","currentStyle","isPrevDecorated","isDecorated","hastToHtml","toHtml","codeToHtml","VSCODE_FALLBACK_EDITOR_FG","VSCODE_FALLBACK_EDITOR_BG","RESOLVED_KEY","normalizeTheme","rawTheme","globalSetting","replacementCount","replacementMap","getReplacementColor","replaceFg","replaceBg","clone","replacement","resolveLangs","resolveThemes","_emitDeprecation","_emitError","warnDeprecated","message","version","_emitDeprecation","_emitError","ShikiError","resolveLangAlias","name","alias","resolved","Registry","_resolver","_themes","_langs","_alias","t","theme","_theme","normalizeTheme","textmateTheme","Theme","lang","embeddedLazilyBy","i","grammarConfig","g","e","langs","langsGraphArray","missingLangs","_","dependents","embedded","embeddedLang","Resolver","engine","patterns","s","langIdOrAlias","scopeName","l","scopeParts","injections","subScopeName","instancesCount","createShikiInternalSync","options","isDisposed","themes","resolver","_registry","_lastTheme","resolveLangAlias$1","getLanguage","ensureNotDisposed","_lang","getTheme","setTheme","colorMap","getLoadedThemes","getLoadedLanguages","loadLanguageSync","langs2","loadLanguage","resolveLangs","loadThemeSync","themes2","loadTheme","resolveThemes","dispose","createShikiInternal","createHighlighterCore","internal","args","getLastGrammarState","code","options2","codeToTokensBase","codeToTokensWithThemes","codeToTokens","codeToHast","codeToHtml","createBundledHighlighter","options","bundledLanguages","bundledThemes","engine","createHighlighter","options2","resolveLang","lang","isSpecialLang","bundle","ShikiError","resolveTheme","theme","isSpecialTheme","_themes","i","langs","core","createHighlighterCore","langs2","themes","makeSingletonHighlighter","_shiki","getSingletonHighlighter","s","createSingletonShorthands","config","get","code","shiki","init_esm_shims","bundledLanguagesInfo","bundledLanguagesBase","i","bundledLanguagesAlias","a","bundledLanguages","init_esm_shims","bundledThemesInfo","bundledThemes","i","init_esm_shims","ShikiError","message","getHeapMax","_emscripten_get_now","alignUp","x","multiple","main","init","wasmMemory","buffer","binding","updateGlobalBufferAndViews","buf","_emscripten_memcpy_big","dest","src","num","emscripten_realloc_buffer","size","_emscripten_resize_heap","requestedSize","oldSize","maxHeapSize","cutDown","overGrownHeapSize","newSize","UTF8Decoder","UTF8ArrayToString","heapOrArray","idx","maxBytesToRead","endIdx","endPtr","str","u0","u1","u2","ch","UTF8ToString","ptr","asmLibraryArg","createWasm","exports$1","__defProp","__defNormalProp","obj","key","value","__publicField","onigBinding","throwLastOnigError","onigBinding2","UtfString","_UtfString","utf16Length","utf8Length","computeIndicesMapping","utf16OffsetToUtf8","utf8OffsetToUtf16","utf8Value","i8","i16","charCode","codePoint","wasSurrogatePair","nextCharCode","result","i","len","codepoint","_OnigString","utfString","utf8Offset","utf16Offset","OnigString","OnigScanner","patterns","strPtrsArr","strLenArr","strPtrsPtr","strLenPtr","scannerPtr","string","startPosition","arg","options","debugCall","resultPtr","HEAPU32","offset","index","count","captureIndices","beg","end","isInstantiatorOptionsObject","dataOrOptions","isInstantiatorModule","isDataOptionsObject","isResponse","isArrayBuffer","data","initPromise","loadWasm","_load","info","instance","_makeResponseStreamingLoader","_makeResponseNonStreamingLoader","_makeArrayBufferLoader","importObject","arrayBuffer","createOnigurumaEngine","options","loadWasm","patterns","OnigScanner","p","s","OnigString","createHighlighter","createBundledHighlighter","bundledLanguages","bundledThemes","createOnigurumaEngine","codeToHtml","codeToHast","codeToTokens","codeToTokensBase","codeToTokensWithThemes","getSingletonHighlighter","getLastGrammarState","createSingletonShorthands","guessEmbeddedLanguages","p","bundledLanguages","a","h","l","H","k","n","g","i","b","createHighlighter","f","t","r","d","s","u","B","o","L","R","memo","init_esm_shims","useEffect","useRef","useState","DEFAULT_TYPEWRITER_MS_PER_CHAR","MAX_BUFFER_LAG_CHARS","useSmoothStream","fullText","isStreaming","options","msPerChar","visible","setVisible","targetRef","cursorRef","lastTimeRef","frameRef","tick","time","target","elapsed","charsToAdvance","jsx","Message","className","from","children","props","cn","MessageContent","streamdownPluginsFull","A","R","streamdownPluginsStreaming","defaultLinkSafety","MessageResponseImpl","linkSafety","isStreaming","smoothed","useSmoothStream","rendered","xn","MessageResponse","memo","prevProps","nextProps","init_esm_shims","createContext","useCallback","useContext","useEffect","useMemo","useRef","useState","Fragment","jsx","jsxs","truncateJSON","data","maxLength","stringified","entries","parts","remaining","key","value","keyAbbrev","valStr","part","CopyButton","text","className","t","useTranslation","copied","setCopied","useState","timeoutRef","useRef","useEffect","handleCopy","useCallback","e","Button","cn","Check","ClipboardCopy","CollapsibleJSON","label","props","expanded","setExpanded","fullJSON","useMemo","preview","v","ChevronRight","ToolOpenContext","createContext","Tool","defaultOpen","children","open","setOpen","o","ToolHeader","title","state","toggle","useContext","isRunning","Wrench","Shimmer","ChevronDown","ToolIndicator","ToolContent","className","children","props","open","useContext","ToolOpenContext","jsx","cn","ToolInput","input","debug","t","useTranslation","filtered","useMemo","_meta","rest","CollapsibleJSON","asRecord","value","getUiObject","meta","extractOutputMeta","output","extractResourceUriFromMeta","nested","flat","openai","extractAutoHeightFromMeta","resolveWidgetResourceUri","toolName","toolDefinitions","fromDef","resolveWidgetAutoHeight","ToolOutput","className","output","errorText","debug","props","t","useTranslation","filtered","useMemo","_meta","rest","jsxs","cn","jsx","CollapsibleJSON","init_esm_shims","jsx","jsxs","isVisiblePart","part","hasVisibleParts","message","shouldShowWorkingIndicator","messages","status","options","last","p","WorkingIndicator","className","props","t","useTranslation","cn","Zap","Shimmer","init_esm_shims","useCallback","useEffect","useMemo","useRef","useState","jsx","DEFAULT_RESOURCE_ENDPOINT","MAX_HEIGHT","DEFAULT_HEIGHT","AUTOHEIGHT_PADDING","PROTOCOL_VERSION","RESIZE_ANIMATION_MS","HANDSHAKE_TIMEOUT_MS","MAX_RETRIES","normalizeString","value","trimmed","shouldAutoInjectToolResultText","toolName","result","toolDefinitions","resolveWidgetResourceUri","McpAppFrame","resourceUri","toolInput","toolResult","resourceEndpoint","DEFAULT_RESOURCE_ENDPOINT","chatSessionId","isDark","className","autoHeight","onOpenLink","onFollowUp","onCallTool","onDisplayModeChange","isFullscreen","iframeRef","useRef","toolInputRef","toolResultRef","lastSizeRef","animationRef","initializedRef","retryCountRef","displayModeRef","height","setHeight","useState","DEFAULT_HEIGHT","width","setWidth","onOpenLinkRef","onFollowUpRef","onCallToolRef","onDisplayModeChangeRef","chatSessionIdRef","toolDefinitionsRef","clampHeight","useCallback","h","AUTOHEIGHT_PADDING","MAX_HEIGHT","iframeSrc","useMemo","separator","isDarkRef","isFullscreenRef","useEffect","iframe","disposed","handshakeReceived","pendingModelContext","pendingToolResult","handshakeTimer","MAX_RETRIES","url","HANDSHAKE_TIMEOUT_MS","postToIframe","msg","handleMessage","event","data","method","id","PROTOCOL_VERSION","input","resultMeta","normalizedChatSessionId","normalizeString","waniwaniMeta","forwardedWaniwaniMeta","forwardedMeta","content","params","newHeight","newWidth","last","heightChanged","widthChanged","clamped","from","anim","RESIZE_ANIMATION_MS","modelContext","toolText","existingText","c","mergeModelContext","handler","calledToolName","text","err","message","requested","granted","jsx","cn","init_esm_shims","jsx","jsxs","WelcomeScreen","icon","title","description","suggestions","onSuggestionSelect","suggestion","index","cn","init_esm_shims","Component","jsx","jsxs","ErrorFallback","onRetry","useTranslation","WidgetErrorBoundary","Component","error","Fragment","jsx","jsxs","formatToolName","name","c","pickStepIcon","Globe","Wrench","MessageList","messages","status","welcomeMessage","welcome","onSuggestionSelect","resourceEndpoint","chatSessionId","isDark","onFollowUp","onCallTool","onWidgetDisplayModeChange","fullscreenToolCallId","debug","showToolCalls","toolDefinitions","messageClassNames","t","useTranslation","lastMessage","hasMessages","isFullscreenActive","showWorking","shouldShowWorkingIndicator","WelcomeScreen","Message","MessageContent","MessageResponse","message","textParts","p","reasoningParts","fileParts","toolParts","activityParts","isLastAssistant","hasTextContent","containsFullscreenTool","showChain","hasVisibleParts","output","resolveWidgetResourceUri","part","i","Reasoning","ReasoningTrigger","ReasoningContent","last","activeStep","Clock","ChainOfThought","ChainOfThoughtHeader","ChainOfThoughtContent","isLast","ChainOfThoughtReasoning","title","icon","ChainOfThoughtStep","ToolInput","ToolOutput","ToolIndicator","Tool","ToolHeader","ToolContent","resourceUri","autoHeight","resolveWidgetAutoHeight","isFullscreen","WidgetErrorBoundary","McpAppFrame","mode","cn","Attachments","isStreamingPart","WorkingIndicator","init_esm_shims","jsx","jsxs","LOGO_URL","HREF","PoweredBy","t","useTranslation","init_esm_shims","jsx","Suggestions","suggestions","isLoading","onSelect","className","props","cn","i","suggestion","index","init_esm_shims","useEffect","useRef","useState","jsx","jsxs","VISIBLE_THREAD_LIMIT","PlusIcon","label","HistoryIcon","TrashIcon","ThreadMenu","threads","activeThreadId","onNewThread","onSelectThread","onDeleteThread","locale","t","useTranslation","open","setOpen","useState","containerRef","useRef","useEffect","handler","event","container","visible","hidden","v","thread","isActive","updatedAtMs","formatRelativeTime","e","init_esm_shims","useCallback","useRef","useCallTool","props","propsRef","params","api","headers","onCallTool","sessionId","endpoint","normalizedSessionId","res","init_esm_shims","useChat","useCallback","useEffect","useRef","useState","init_esm_shims","createContext","useContext","init_esm_shims","createNoopWidgetEventEmitter","WidgetEventsContext","createContext","createNoopWidgetEventEmitter","useWidgetEvents","useContext","WidgetEventsProvider","init_esm_shims","buildApiUrl","api","path","params","rawBase","rawQuery","base","search","key","value","query","init_esm_shims","DefaultChatTransport","uiMessageChunkSchema","extractKeysToStrip","error","cause","issues","unionIssue","i","branchErrors","e","unrecognized","LenientChatTransport","stream","buffer","schema","validate","text","controller","parts","line","trimmed","data","parsed","result","keysToStrip","stripped","key","retry","init_esm_shims","init_esm_shims","DB_NAME","THREADS_STORE","THREADS_BY_USER_INDEX","THREADS_BY_UPDATED_INDEX","KEY","LOCAL_STORAGE_KEY","inMemoryFallbackId","generateUuid","c","r","applyMemoryDbUpgrade","db","oldVersion","THREADS_STORE","threads","THREADS_BY_USER_INDEX","THREADS_BY_UPDATED_INDEX","openMemoryDb","resolve","reject","req","DB_NAME","event","openDb","idbGet","idbPut","value","tryIndexedDb","existing","next","tryLocalStorage","getOrCreateMemoryUserId","fromIdb","fromLs","MAX_THREADS_PER_USER","MAX_MESSAGES_PER_THREAD","isStoredThread","value","v","withDb","fn","db","openMemoryDb","promisifyRequest","req","resolve","reject","listThreads","memoryUserId","index","THREADS_STORE","THREADS_BY_USER_INDEX","threads","a","b","loadThread","threadId","store","upsertThread","thread","trimmed","tx","tx2","store2","userThreads","toEvict","t","deleteThread","getActiveThreadId","deriveThreadTitle","text","firstLine","init_esm_shims","VISITOR_ID_KEY","match","ua","pattern","parseBrowser","browsers","name","version","parseOS","systems","detectDeviceType","randomId","bytes","hex","b","getOrCreateVisitorId","stored","id","setVisitorId","trimmed","isThenable","value","applyVisitorId","input","cancelled","cancel","resolved","collectVisitorContext","visitorId","memoryUserId","getOrCreateMemoryUserId","SESSION_HEADER_NAME","THREAD_PERSIST_DEBOUNCE_MS","ERROR_MESSAGE_MAX_LENGTH","generateThreadId","nanoid","nowIso","normalizeSessionId","value","trimmed","fetchToolDefinitions","api","headers","url","buildApiUrl","response","data","map","tool","useChatEngine","props","userHeaders","body","onMessageSent","onResponseReceived","enableThreadHistory","controlledThreadId","onThreadChange","propVisitorId","useEffect","applyVisitorId","widgetEvents","useWidgetEvents","headersRef","useRef","bodyRef","enableThreadHistoryRef","pendingModelContextRef","visitorContextRef","sessionId","setSessionIdState","useState","sessionIdRef","activeThreadId","setActiveThreadIdState","activeThreadIdRef","threads","setThreads","isThreadHistoryReady","setIsThreadHistoryReady","threadCreatedAtRef","threadTitleRef","persistTimerRef","persistInflightRef","switchEpochRef","onThreadChangeRef","setActiveThreadId","useCallback","next","refreshThreads","memoryUserId","list","listThreads","getSessionId","setSessionId","isFirstAssignment","clearSessionId","cancelled","mountEpoch","ctx","collectVisitorContext","targetId","getActiveThreadId","stored","loadThread","setMessages","transportRef","LenientChatTransport","resolvedBody","hasExplicitSessionId","bodySessionId","storedSessionId","hasModelContext","vc","visitorId","getOrCreateVisitorId","existingVisitor","existingClient","callerExtra","locale","autoExtra","tid","input","init","pendingWaitRef","finishedMessageRef","toolDefinitionsRef","toolDefinitionsRevision","setToolDefinitionsRevision","skipRemoteConfig","refreshToolDefinitions","r","error","messages","sendMessage","status","useChat","message","isAbort","isDisconnect","isError","messagesRef","lateHydratedHistoryRef","epoch","pending","text","setText","queuedMessages","setQueuedMessages","isLoading","removeQueuedMessage","id","prev","m","queueFull","handleSubmit","hasText","hasFiles","sendMessageAndWait","resolve","reject","first","rest","reset","buildPersistSnapshot","threadId","msgs","firstUser","firstUserText","p","deriveThreadTitle","persistActiveThread","snap","upsertThread","flushPendingPersist","inflight","timer","startNewThread","nextId","switchThread","deleteThread","handleTextChange","e","lastMessage","hasMessages","showLoaderBubble","toolDefinitions","init_esm_shims","useEffect","useRef","useState","defaultConfig","useConfig","api","headers","skip","config","setConfig","useState","headersRef","useRef","useEffect","current","data","buildApiUrl","init_esm_shims","useCallback","useEffect","useMemo","useRef","useState","init_esm_shims","toSuggestions","texts","text","resolveSuggestions","candidates","flow","followup","page","channel","init_esm_shims","isRecord","value","isStringArray","item","readSuggestionsEntry","part","output","entry","SUGGESTIONS_META_KEY","extractFlowSuggestions","message","found","suggestions","extractFollowupSuggestions","data","isResolved","value","readProp","suggestions","useSuggestionRow","options","messages","status","enabled","rungs","initial","fromInitial","useMemo","toSuggestions","preChat","preChatRow","resolveSuggestions","preChatTexts","s","pills","setPills","useState","source","setSource","prevStatusRef","useRef","clear","useCallback","hasMessages","useEffect","lastMessage","prevStatus","lastAssistant","m","flow","extractFlowSuggestions","followup","extractFollowupSuggestions","turnRow","init_esm_shims","useEffect","useRef","useState","TYPE_SPEED_MS","DELETE_SPEED_MS","PAUSE_AFTER_TYPE_MS","PAUSE_AFTER_DELETE_MS","useTypingPlaceholder","text","active","displayed","setDisplayed","timerRef","i","deleting","disposed","tick","init_esm_shims","buildResourceEndpoint","api","headers","authHeaderValue","resourceToken","buildApiUrl","init_esm_shims","DEFAULT_THEME","CSS_VAR_MAP","mergeTheme","userTheme","DEFAULT_THEME","themeToCSSProperties","theme","vars","key","cssVars","value","resolved","cssVar","jsx","jsxs","ChatCard","forwardRef","props","ref","userTheme","title","width","height","className","allowAttachments","welcomeMessage","welcome","placeholder","triggerEvent","api","debug","enableThreadHistory","showToolCalls","effectiveApi","effectiveResourceEndpoint","buildResourceEndpoint","resolvedTheme","mergeTheme","cssVars","themeToCSSProperties","hex","r","g","b","isDark","config","useConfig","effectiveDebug","engine","useChatEngine","handleCallTool","useCallTool","animatedPlaceholder","useTypingPlaceholder","isHighlighted","setIsHighlighted","useState","fullscreenToolCallId","setFullscreenToolCallId","cardRef","useRef","highlightTimerRef","focusInput","useCallback","container","textarea","suggestionsState","useSuggestionRow","handleWidgetMessage","message","text","c","handleSuggestionSelect","suggestion","useImperativeHandle","useEffect","handler","e","detail","cn","ExportSessionButton","ThreadMenu","id","Conversation","ConversationContent","MessageList","mode","widget","ConversationScrollButton","Suggestions","ChatQueue","PromptInput","PromptInputAddAttachments","PromptInputTextarea","PromptInputSubmit","PoweredBy"]}