@mieweb/ui 0.7.1 → 0.7.2

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 (462) hide show
  1. package/dist/CsvBlock-LVJARITD.cjs +15 -0
  2. package/dist/{CsvBlock-2A5VEDD3.cjs.map → CsvBlock-LVJARITD.cjs.map} +1 -1
  3. package/dist/CsvBlock-VTYNQ75L.js +6 -0
  4. package/dist/{CsvBlock-D6PWAJ5X.js.map → CsvBlock-VTYNQ75L.js.map} +1 -1
  5. package/dist/HtmlPreviewBlock-F33P37UD.cjs +15 -0
  6. package/dist/{HtmlPreviewBlock-SYXCV5RH.cjs.map → HtmlPreviewBlock-F33P37UD.cjs.map} +1 -1
  7. package/dist/HtmlPreviewBlock-N4PPVJLJ.js +6 -0
  8. package/dist/{HtmlPreviewBlock-PEHTJ6C3.js.map → HtmlPreviewBlock-N4PPVJLJ.js.map} +1 -1
  9. package/dist/MermaidBlock-G5X4FPUN.cjs +15 -0
  10. package/dist/{MermaidBlock-AFXNP5NK.cjs.map → MermaidBlock-G5X4FPUN.cjs.map} +1 -1
  11. package/dist/MermaidBlock-HUT53CRG.js +6 -0
  12. package/dist/{MermaidBlock-7NK3AVK2.js.map → MermaidBlock-HUT53CRG.js.map} +1 -1
  13. package/dist/SurveyBlock-ORTPGA5T.cjs +15 -0
  14. package/dist/{SurveyBlock-6KRNKFH5.cjs.map → SurveyBlock-ORTPGA5T.cjs.map} +1 -1
  15. package/dist/SurveyBlock-PM3ZMWWR.js +6 -0
  16. package/dist/{SurveyBlock-NNDGXGG4.js.map → SurveyBlock-PM3ZMWWR.js.map} +1 -1
  17. package/dist/ag-grid.cjs +13 -13
  18. package/dist/ag-grid.js +2 -2
  19. package/dist/brands/index.cjs +7 -7
  20. package/dist/brands/index.js +2 -2
  21. package/dist/{chunk-4DMZAVB2.js → chunk-23AYDOCH.js} +3 -3
  22. package/dist/{chunk-4DMZAVB2.js.map → chunk-23AYDOCH.js.map} +1 -1
  23. package/dist/{chunk-MAMY5HTT.cjs → chunk-26DPQUSB.cjs} +22 -22
  24. package/dist/{chunk-MAMY5HTT.cjs.map → chunk-26DPQUSB.cjs.map} +1 -1
  25. package/dist/{chunk-TRZXK57D.js → chunk-2DW4PUJD.js} +3 -3
  26. package/dist/{chunk-TRZXK57D.js.map → chunk-2DW4PUJD.js.map} +1 -1
  27. package/dist/{chunk-OX2RIVN7.js → chunk-3D4ITDLO.js} +4 -4
  28. package/dist/{chunk-OX2RIVN7.js.map → chunk-3D4ITDLO.js.map} +1 -1
  29. package/dist/{chunk-PJAQDAMZ.cjs → chunk-3IAA3KCE.cjs} +15 -6
  30. package/dist/chunk-3IAA3KCE.cjs.map +1 -0
  31. package/dist/chunk-3PXOIAF6.js +3 -0
  32. package/dist/{chunk-DHKYGVP7.js.map → chunk-3PXOIAF6.js.map} +1 -1
  33. package/dist/{chunk-6D5F7EDM.js → chunk-3SRBIXQX.js} +18 -17
  34. package/dist/chunk-3SRBIXQX.js.map +1 -0
  35. package/dist/{chunk-Q2EWNXIB.cjs → chunk-3SZQRMHM.cjs} +9 -9
  36. package/dist/{chunk-Q2EWNXIB.cjs.map → chunk-3SZQRMHM.cjs.map} +1 -1
  37. package/dist/{chunk-JLBT76WH.js → chunk-3YSIZ2CK.js} +14 -5
  38. package/dist/chunk-3YSIZ2CK.js.map +1 -0
  39. package/dist/{chunk-NIEIRA5A.cjs → chunk-4AE2L6AO.cjs} +13 -13
  40. package/dist/{chunk-NIEIRA5A.cjs.map → chunk-4AE2L6AO.cjs.map} +1 -1
  41. package/dist/{chunk-PFWHWIXS.cjs → chunk-54OW6ZPL.cjs} +124 -3
  42. package/dist/chunk-54OW6ZPL.cjs.map +1 -0
  43. package/dist/{chunk-FJH7P5WG.js → chunk-5BDCQBYW.js} +6 -6
  44. package/dist/{chunk-FJH7P5WG.js.map → chunk-5BDCQBYW.js.map} +1 -1
  45. package/dist/{chunk-XP6HELVG.cjs → chunk-5IDYOJHO.cjs} +13 -13
  46. package/dist/{chunk-XP6HELVG.cjs.map → chunk-5IDYOJHO.cjs.map} +1 -1
  47. package/dist/{chunk-3CJBUAJ4.js → chunk-5U6GETAW.js} +3 -3
  48. package/dist/{chunk-3CJBUAJ4.js.map → chunk-5U6GETAW.js.map} +1 -1
  49. package/dist/{chunk-HEH3QXOQ.js → chunk-5Y5FSR4N.js} +3 -3
  50. package/dist/{chunk-HEH3QXOQ.js.map → chunk-5Y5FSR4N.js.map} +1 -1
  51. package/dist/{chunk-MSRU3XBH.cjs → chunk-6ECKH4DJ.cjs} +7 -7
  52. package/dist/{chunk-MSRU3XBH.cjs.map → chunk-6ECKH4DJ.cjs.map} +1 -1
  53. package/dist/{chunk-MV3MTHWQ.js → chunk-6EWJGRC3.js} +3 -3
  54. package/dist/{chunk-MV3MTHWQ.js.map → chunk-6EWJGRC3.js.map} +1 -1
  55. package/dist/{chunk-AES2BKEW.cjs → chunk-6J7UGYT5.cjs} +10 -10
  56. package/dist/{chunk-AES2BKEW.cjs.map → chunk-6J7UGYT5.cjs.map} +1 -1
  57. package/dist/{chunk-7WMSUXOQ.js → chunk-6OCYG6J2.js} +4 -4
  58. package/dist/{chunk-7WMSUXOQ.js.map → chunk-6OCYG6J2.js.map} +1 -1
  59. package/dist/{chunk-JCNPVK74.cjs → chunk-6OQE4ZMG.cjs} +8 -8
  60. package/dist/{chunk-JCNPVK74.cjs.map → chunk-6OQE4ZMG.cjs.map} +1 -1
  61. package/dist/{chunk-KBEKQMVY.cjs → chunk-6QVI6DAO.cjs} +5 -5
  62. package/dist/{chunk-KBEKQMVY.cjs.map → chunk-6QVI6DAO.cjs.map} +1 -1
  63. package/dist/{chunk-CVC4NWFA.cjs → chunk-7AMOKHTW.cjs} +4 -4
  64. package/dist/{chunk-CVC4NWFA.cjs.map → chunk-7AMOKHTW.cjs.map} +1 -1
  65. package/dist/{chunk-44CK4CT2.cjs → chunk-7EB7665B.cjs} +13 -13
  66. package/dist/{chunk-44CK4CT2.cjs.map → chunk-7EB7665B.cjs.map} +1 -1
  67. package/dist/{chunk-BB4WQ4LV.cjs → chunk-ABAOZASX.cjs} +8 -8
  68. package/dist/{chunk-BB4WQ4LV.cjs.map → chunk-ABAOZASX.cjs.map} +1 -1
  69. package/dist/{chunk-6LFG4JFF.js → chunk-AFGADE3B.js} +3 -3
  70. package/dist/{chunk-6LFG4JFF.js.map → chunk-AFGADE3B.js.map} +1 -1
  71. package/dist/{chunk-UOOH356R.cjs → chunk-AIJAFPGJ.cjs} +5 -5
  72. package/dist/{chunk-UOOH356R.cjs.map → chunk-AIJAFPGJ.cjs.map} +1 -1
  73. package/dist/{chunk-43GBCUSQ.js → chunk-AQ564XO7.js} +6 -6
  74. package/dist/chunk-AQ564XO7.js.map +1 -0
  75. package/dist/{chunk-CYMZ2QS5.js → chunk-BCJFOSZX.js} +2 -2
  76. package/dist/{chunk-CYMZ2QS5.js.map → chunk-BCJFOSZX.js.map} +1 -1
  77. package/dist/{chunk-T3C4RNJ4.js → chunk-BJKAVWED.js} +3 -3
  78. package/dist/{chunk-T3C4RNJ4.js.map → chunk-BJKAVWED.js.map} +1 -1
  79. package/dist/{chunk-MKWGKASO.js → chunk-BMRQ4VME.js} +4 -4
  80. package/dist/{chunk-MKWGKASO.js.map → chunk-BMRQ4VME.js.map} +1 -1
  81. package/dist/{chunk-T42BCIUA.js → chunk-BMSG4NBH.js} +4 -4
  82. package/dist/{chunk-T42BCIUA.js.map → chunk-BMSG4NBH.js.map} +1 -1
  83. package/dist/{chunk-QA6ZDHFP.js → chunk-BOOJDRJO.js} +35 -11
  84. package/dist/chunk-BOOJDRJO.js.map +1 -0
  85. package/dist/{chunk-C2544GKZ.js → chunk-BX5ZODPF.js} +4 -4
  86. package/dist/{chunk-C2544GKZ.js.map → chunk-BX5ZODPF.js.map} +1 -1
  87. package/dist/{chunk-IYIYL2SQ.js → chunk-CEQJGUAS.js} +3 -3
  88. package/dist/{chunk-IYIYL2SQ.js.map → chunk-CEQJGUAS.js.map} +1 -1
  89. package/dist/{chunk-6ZYE6JUK.cjs → chunk-CKRRJO7T.cjs} +11 -11
  90. package/dist/{chunk-6ZYE6JUK.cjs.map → chunk-CKRRJO7T.cjs.map} +1 -1
  91. package/dist/{chunk-WO5CAOAN.js → chunk-DCBMTFLE.js} +3 -3
  92. package/dist/{chunk-WO5CAOAN.js.map → chunk-DCBMTFLE.js.map} +1 -1
  93. package/dist/{chunk-J7Z7467B.js → chunk-DLBV42JD.js} +4 -4
  94. package/dist/{chunk-J7Z7467B.js.map → chunk-DLBV42JD.js.map} +1 -1
  95. package/dist/{chunk-MUYTGWGE.js → chunk-DVOQ3JNO.js} +3 -3
  96. package/dist/{chunk-MUYTGWGE.js.map → chunk-DVOQ3JNO.js.map} +1 -1
  97. package/dist/{chunk-LJ2ZWIX6.js → chunk-DWIF6VXZ.js} +124 -3
  98. package/dist/chunk-DWIF6VXZ.js.map +1 -0
  99. package/dist/{chunk-IHTRKWBG.js → chunk-EGWWTIWS.js} +119 -75
  100. package/dist/chunk-EGWWTIWS.js.map +1 -0
  101. package/dist/{chunk-UM6NA7HL.js → chunk-EKRT7K2K.js} +4 -4
  102. package/dist/{chunk-UM6NA7HL.js.map → chunk-EKRT7K2K.js.map} +1 -1
  103. package/dist/{chunk-WGPMTW36.cjs → chunk-EPQPUFS6.cjs} +7 -7
  104. package/dist/{chunk-WGPMTW36.cjs.map → chunk-EPQPUFS6.cjs.map} +1 -1
  105. package/dist/{chunk-J3BU3JBX.js → chunk-FDUA6OGN.js} +3 -3
  106. package/dist/{chunk-J3BU3JBX.js.map → chunk-FDUA6OGN.js.map} +1 -1
  107. package/dist/{chunk-JHYFHEHS.js → chunk-FDV7EQWH.js} +4 -4
  108. package/dist/{chunk-JHYFHEHS.js.map → chunk-FDV7EQWH.js.map} +1 -1
  109. package/dist/{chunk-KQAXXJ4G.cjs → chunk-FF235PKY.cjs} +7 -7
  110. package/dist/{chunk-KQAXXJ4G.cjs.map → chunk-FF235PKY.cjs.map} +1 -1
  111. package/dist/{chunk-FZJBFJJR.js → chunk-FJ7YPVKV.js} +3 -3
  112. package/dist/{chunk-FZJBFJJR.js.map → chunk-FJ7YPVKV.js.map} +1 -1
  113. package/dist/{chunk-5MAGWW5X.cjs → chunk-FKLUSYFP.cjs} +11 -11
  114. package/dist/{chunk-5MAGWW5X.cjs.map → chunk-FKLUSYFP.cjs.map} +1 -1
  115. package/dist/{chunk-ZGSC2CB2.js → chunk-GTHNWP4P.js} +36 -5
  116. package/dist/chunk-GTHNWP4P.js.map +1 -0
  117. package/dist/{chunk-6AHYYWVB.js → chunk-H3HF36ZL.js} +5 -5
  118. package/dist/{chunk-6AHYYWVB.js.map → chunk-H3HF36ZL.js.map} +1 -1
  119. package/dist/{chunk-YZT62IMX.js → chunk-HIDV32ZX.js} +5 -5
  120. package/dist/{chunk-YZT62IMX.js.map → chunk-HIDV32ZX.js.map} +1 -1
  121. package/dist/{chunk-BIT27PPD.js → chunk-HS25RPDW.js} +3 -3
  122. package/dist/{chunk-BIT27PPD.js.map → chunk-HS25RPDW.js.map} +1 -1
  123. package/dist/{chunk-BWYYA3LQ.cjs → chunk-I2ECTLON.cjs} +5 -5
  124. package/dist/{chunk-BWYYA3LQ.cjs.map → chunk-I2ECTLON.cjs.map} +1 -1
  125. package/dist/{chunk-DUPR6FEL.js → chunk-I3WGZPI6.js} +4 -4
  126. package/dist/{chunk-DUPR6FEL.js.map → chunk-I3WGZPI6.js.map} +1 -1
  127. package/dist/{chunk-TN33E2VN.cjs → chunk-IJYTASQQ.cjs} +15 -15
  128. package/dist/{chunk-TN33E2VN.cjs.map → chunk-IJYTASQQ.cjs.map} +1 -1
  129. package/dist/{chunk-BT3ZQJGT.cjs → chunk-IUDY6S7I.cjs} +6 -6
  130. package/dist/{chunk-BT3ZQJGT.cjs.map → chunk-IUDY6S7I.cjs.map} +1 -1
  131. package/dist/{chunk-TR2OJKQ4.cjs → chunk-JTSKPDPH.cjs} +8 -8
  132. package/dist/{chunk-TR2OJKQ4.cjs.map → chunk-JTSKPDPH.cjs.map} +1 -1
  133. package/dist/{chunk-XCLQZ4FV.js → chunk-KFLDXJEE.js} +3 -3
  134. package/dist/{chunk-XCLQZ4FV.js.map → chunk-KFLDXJEE.js.map} +1 -1
  135. package/dist/{chunk-4LVPQ44A.js → chunk-LMBXJZLG.js} +9 -5
  136. package/dist/chunk-LMBXJZLG.js.map +1 -0
  137. package/dist/{chunk-A2QVQF54.cjs → chunk-M26KJKZG.cjs} +4 -4
  138. package/dist/{chunk-A2QVQF54.cjs.map → chunk-M26KJKZG.cjs.map} +1 -1
  139. package/dist/{chunk-ZHBANUBI.cjs → chunk-MJWFNV3L.cjs} +31 -27
  140. package/dist/chunk-MJWFNV3L.cjs.map +1 -0
  141. package/dist/{chunk-UFYXU7KV.js → chunk-MWPPOX6F.js} +4 -4
  142. package/dist/{chunk-UFYXU7KV.js.map → chunk-MWPPOX6F.js.map} +1 -1
  143. package/dist/{chunk-ZDEYV373.cjs → chunk-MYFZYUPR.cjs} +35 -11
  144. package/dist/chunk-MYFZYUPR.cjs.map +1 -0
  145. package/dist/{chunk-MCCO4A23.js → chunk-NGLI2MSM.js} +256 -45
  146. package/dist/chunk-NGLI2MSM.js.map +1 -0
  147. package/dist/{chunk-FCBQP2U4.cjs → chunk-NPKPCYAT.cjs} +142 -16
  148. package/dist/chunk-NPKPCYAT.cjs.map +1 -0
  149. package/dist/{chunk-T3RWXOCM.js → chunk-NU6QKULE.js} +3 -3
  150. package/dist/{chunk-T3RWXOCM.js.map → chunk-NU6QKULE.js.map} +1 -1
  151. package/dist/{chunk-QUUFKGDF.cjs → chunk-OAHORW4N.cjs} +130 -86
  152. package/dist/chunk-OAHORW4N.cjs.map +1 -0
  153. package/dist/{chunk-BYUV3IZV.cjs → chunk-OGPJ3LRF.cjs} +4 -4
  154. package/dist/{chunk-BYUV3IZV.cjs.map → chunk-OGPJ3LRF.cjs.map} +1 -1
  155. package/dist/{chunk-XL7TTKHP.js → chunk-OLFTGCGD.js} +7 -7
  156. package/dist/{chunk-XL7TTKHP.js.map → chunk-OLFTGCGD.js.map} +1 -1
  157. package/dist/{chunk-BX6BTDTR.js → chunk-OQWZYKJM.js} +3 -3
  158. package/dist/{chunk-BX6BTDTR.js.map → chunk-OQWZYKJM.js.map} +1 -1
  159. package/dist/{chunk-JBB25LFB.js → chunk-OTQ72WX3.js} +3 -3
  160. package/dist/{chunk-JBB25LFB.js.map → chunk-OTQ72WX3.js.map} +1 -1
  161. package/dist/{chunk-AFKKJEV5.cjs → chunk-OZOSWBSI.cjs} +4 -4
  162. package/dist/{chunk-AFKKJEV5.cjs.map → chunk-OZOSWBSI.cjs.map} +1 -1
  163. package/dist/{chunk-KJPOFUF5.cjs → chunk-P2VTQ5AR.cjs} +10 -10
  164. package/dist/{chunk-KJPOFUF5.cjs.map → chunk-P2VTQ5AR.cjs.map} +1 -1
  165. package/dist/{chunk-ZAIEQWRA.js → chunk-P6L74SKG.js} +5 -5
  166. package/dist/{chunk-ZAIEQWRA.js.map → chunk-P6L74SKG.js.map} +1 -1
  167. package/dist/{chunk-QASIWBXU.cjs → chunk-P7UMS4E6.cjs} +7 -7
  168. package/dist/{chunk-QASIWBXU.cjs.map → chunk-P7UMS4E6.cjs.map} +1 -1
  169. package/dist/chunk-PAM5UUBL.cjs +740 -0
  170. package/dist/{chunk-UTYUT5YY.cjs.map → chunk-PAM5UUBL.cjs.map} +1 -1
  171. package/dist/{chunk-NVHAQOHH.cjs → chunk-PLMXN23Q.cjs} +10 -10
  172. package/dist/chunk-PLMXN23Q.cjs.map +1 -0
  173. package/dist/{chunk-KOCTIB6U.js → chunk-PS5INHGC.js} +3 -3
  174. package/dist/{chunk-KOCTIB6U.js.map → chunk-PS5INHGC.js.map} +1 -1
  175. package/dist/{chunk-Y2S6QMKU.js → chunk-PTZB2GKL.js} +3 -3
  176. package/dist/{chunk-Y2S6QMKU.js.map → chunk-PTZB2GKL.js.map} +1 -1
  177. package/dist/{chunk-7VF6WO7H.cjs → chunk-Q5VBO3I5.cjs} +310 -99
  178. package/dist/chunk-Q5VBO3I5.cjs.map +1 -0
  179. package/dist/{chunk-BLPCYP4D.cjs → chunk-QI2SB6U3.cjs} +29 -29
  180. package/dist/{chunk-BLPCYP4D.cjs.map → chunk-QI2SB6U3.cjs.map} +1 -1
  181. package/dist/{chunk-EZKRAW2X.js → chunk-QUUBTNMH.js} +3 -3
  182. package/dist/{chunk-EZKRAW2X.js.map → chunk-QUUBTNMH.js.map} +1 -1
  183. package/dist/{chunk-5BQE6BEL.js → chunk-QYSUYB3S.js} +13 -9
  184. package/dist/chunk-QYSUYB3S.js.map +1 -0
  185. package/dist/{chunk-MZPF2QGM.cjs → chunk-RBS3GHDZ.cjs} +15 -15
  186. package/dist/{chunk-MZPF2QGM.cjs.map → chunk-RBS3GHDZ.cjs.map} +1 -1
  187. package/dist/{chunk-KJ5BSGEO.cjs → chunk-RS5VA6QU.cjs} +17 -13
  188. package/dist/chunk-RS5VA6QU.cjs.map +1 -0
  189. package/dist/{chunk-CKD554XR.cjs → chunk-RUEEDOE3.cjs} +5 -5
  190. package/dist/{chunk-CKD554XR.cjs.map → chunk-RUEEDOE3.cjs.map} +1 -1
  191. package/dist/{chunk-372IIHUA.cjs → chunk-RYQ3S3KO.cjs} +53 -53
  192. package/dist/{chunk-372IIHUA.cjs.map → chunk-RYQ3S3KO.cjs.map} +1 -1
  193. package/dist/{chunk-RHYIFIT5.js → chunk-RZFSJD67.js} +3 -3
  194. package/dist/{chunk-RHYIFIT5.js.map → chunk-RZFSJD67.js.map} +1 -1
  195. package/dist/{chunk-NQME7MCK.js → chunk-RZJXCI53.js} +191 -204
  196. package/dist/chunk-RZJXCI53.js.map +1 -0
  197. package/dist/{chunk-DFCZPVG4.cjs → chunk-S3MKIDYG.cjs} +8 -8
  198. package/dist/{chunk-DFCZPVG4.cjs.map → chunk-S3MKIDYG.cjs.map} +1 -1
  199. package/dist/chunk-S5RVSXDV.cjs +45 -0
  200. package/dist/chunk-S5RVSXDV.cjs.map +1 -0
  201. package/dist/{chunk-XDFDVF2O.js → chunk-SH6B4MG5.js} +4 -4
  202. package/dist/{chunk-XDFDVF2O.js.map → chunk-SH6B4MG5.js.map} +1 -1
  203. package/dist/chunk-SVSHA7XV.js +487 -0
  204. package/dist/chunk-SVSHA7XV.js.map +1 -0
  205. package/dist/{chunk-KL2S36FM.js → chunk-TNUL4LGG.js} +6 -6
  206. package/dist/{chunk-KL2S36FM.js.map → chunk-TNUL4LGG.js.map} +1 -1
  207. package/dist/chunk-TQONQSJO.js +42 -0
  208. package/dist/chunk-TQONQSJO.js.map +1 -0
  209. package/dist/{chunk-V25Z5GR6.cjs → chunk-TU36DBH2.cjs} +9 -9
  210. package/dist/{chunk-V25Z5GR6.cjs.map → chunk-TU36DBH2.cjs.map} +1 -1
  211. package/dist/{chunk-FQ3UCZUX.cjs → chunk-U3JU6BI5.cjs} +7 -7
  212. package/dist/{chunk-FQ3UCZUX.cjs.map → chunk-U3JU6BI5.cjs.map} +1 -1
  213. package/dist/{chunk-VCO2IZOG.js → chunk-UA7E7PDS.js} +3 -3
  214. package/dist/{chunk-VCO2IZOG.js.map → chunk-UA7E7PDS.js.map} +1 -1
  215. package/dist/{chunk-OOYEHBYJ.js → chunk-UUI7WXI5.js} +142 -16
  216. package/dist/chunk-UUI7WXI5.js.map +1 -0
  217. package/dist/{chunk-SNEQXSC5.cjs → chunk-VA7QN4DX.cjs} +2 -2
  218. package/dist/{chunk-SNEQXSC5.cjs.map → chunk-VA7QN4DX.cjs.map} +1 -1
  219. package/dist/{chunk-I2W24RHW.js → chunk-VE6OUO7X.js} +3 -3
  220. package/dist/{chunk-I2W24RHW.js.map → chunk-VE6OUO7X.js.map} +1 -1
  221. package/dist/{chunk-STPK44AU.js → chunk-VNWJTCBQ.js} +3 -3
  222. package/dist/{chunk-STPK44AU.js.map → chunk-VNWJTCBQ.js.map} +1 -1
  223. package/dist/{chunk-ZNZZCB2M.cjs → chunk-VPIYTQCV.cjs} +9 -9
  224. package/dist/{chunk-ZNZZCB2M.cjs.map → chunk-VPIYTQCV.cjs.map} +1 -1
  225. package/dist/{chunk-DLNJLCNO.cjs → chunk-VTKXM7IE.cjs} +4 -4
  226. package/dist/{chunk-DLNJLCNO.cjs.map → chunk-VTKXM7IE.cjs.map} +1 -1
  227. package/dist/{chunk-VPNURIAY.cjs → chunk-VVI32P7L.cjs} +10 -10
  228. package/dist/{chunk-VPNURIAY.cjs.map → chunk-VVI32P7L.cjs.map} +1 -1
  229. package/dist/{chunk-PWHK7SWN.cjs → chunk-VWCMOWGH.cjs} +150 -149
  230. package/dist/chunk-VWCMOWGH.cjs.map +1 -0
  231. package/dist/{chunk-EUUQVDXX.cjs → chunk-W4Q4UEXA.cjs} +14 -14
  232. package/dist/{chunk-EUUQVDXX.cjs.map → chunk-W4Q4UEXA.cjs.map} +1 -1
  233. package/dist/{chunk-ZVSW2KS6.js → chunk-WRYZ2752.js} +3 -3
  234. package/dist/{chunk-ZVSW2KS6.js.map → chunk-WRYZ2752.js.map} +1 -1
  235. package/dist/{chunk-U3ABLVYH.cjs → chunk-WUNWHOLA.cjs} +6 -6
  236. package/dist/{chunk-U3ABLVYH.cjs.map → chunk-WUNWHOLA.cjs.map} +1 -1
  237. package/dist/{chunk-RH43XBNV.cjs → chunk-WWJIW2IH.cjs} +4 -4
  238. package/dist/{chunk-RH43XBNV.cjs.map → chunk-WWJIW2IH.cjs.map} +1 -1
  239. package/dist/chunk-X4LBUPJO.cjs +511 -0
  240. package/dist/chunk-X4LBUPJO.cjs.map +1 -0
  241. package/dist/{chunk-4GXECTPS.cjs → chunk-XB54G7WS.cjs} +37 -3
  242. package/dist/chunk-XB54G7WS.cjs.map +1 -0
  243. package/dist/{chunk-IUFDGB5O.js → chunk-XMCIXHGH.js} +3 -3
  244. package/dist/{chunk-IUFDGB5O.js.map → chunk-XMCIXHGH.js.map} +1 -1
  245. package/dist/{chunk-KAKH2UZA.js → chunk-XO3WLK65.js} +3 -3
  246. package/dist/{chunk-KAKH2UZA.js.map → chunk-XO3WLK65.js.map} +1 -1
  247. package/dist/{chunk-IWDQPSJN.cjs → chunk-XS35KPBZ.cjs} +211 -223
  248. package/dist/chunk-XS35KPBZ.cjs.map +1 -0
  249. package/dist/{chunk-DEZ7XSTG.cjs → chunk-XXVUHLQN.cjs} +7 -7
  250. package/dist/{chunk-DEZ7XSTG.cjs.map → chunk-XXVUHLQN.cjs.map} +1 -1
  251. package/dist/{chunk-3GGET5LK.cjs → chunk-YGA35Z2P.cjs} +7 -7
  252. package/dist/{chunk-3GGET5LK.cjs.map → chunk-YGA35Z2P.cjs.map} +1 -1
  253. package/dist/{chunk-GOKC4CCZ.cjs → chunk-YMHOF6WA.cjs} +8 -8
  254. package/dist/{chunk-GOKC4CCZ.cjs.map → chunk-YMHOF6WA.cjs.map} +1 -1
  255. package/dist/{chunk-OXYFTCRW.cjs → chunk-YP5T6NZD.cjs} +4 -4
  256. package/dist/{chunk-OXYFTCRW.cjs.map → chunk-YP5T6NZD.cjs.map} +1 -1
  257. package/dist/{chunk-EL2RSQTJ.cjs → chunk-YVL3XATO.cjs} +5 -5
  258. package/dist/{chunk-EL2RSQTJ.cjs.map → chunk-YVL3XATO.cjs.map} +1 -1
  259. package/dist/{chunk-PVUDXJAI.js → chunk-YXCE2HSK.js} +4 -4
  260. package/dist/{chunk-PVUDXJAI.js.map → chunk-YXCE2HSK.js.map} +1 -1
  261. package/dist/{chunk-ST2RE5UB.cjs → chunk-Z5KFXHDP.cjs} +6 -6
  262. package/dist/{chunk-ST2RE5UB.cjs.map → chunk-Z5KFXHDP.cjs.map} +1 -1
  263. package/dist/{chunk-DAPZPT5N.cjs → chunk-ZBI52NP2.cjs} +13 -13
  264. package/dist/{chunk-DAPZPT5N.cjs.map → chunk-ZBI52NP2.cjs.map} +1 -1
  265. package/dist/{chunk-4Z6ZZKIY.js → chunk-ZIUADGAR.js} +3 -3
  266. package/dist/{chunk-4Z6ZZKIY.js.map → chunk-ZIUADGAR.js.map} +1 -1
  267. package/dist/{chunk-LOTMAKUG.cjs → chunk-ZZJ4ZVYR.cjs} +11 -11
  268. package/dist/{chunk-LOTMAKUG.cjs.map → chunk-ZZJ4ZVYR.cjs.map} +1 -1
  269. package/dist/collabKit-QZL4P5T5.js +48 -0
  270. package/dist/collabKit-QZL4P5T5.js.map +1 -0
  271. package/dist/collabKit-UF7E6V3N.cjs +72 -0
  272. package/dist/collabKit-UF7E6V3N.cjs.map +1 -0
  273. package/dist/components/Alert/index.cjs +6 -6
  274. package/dist/components/Alert/index.js +2 -2
  275. package/dist/components/AlertDialog/index.cjs +5 -5
  276. package/dist/components/AlertDialog/index.js +4 -4
  277. package/dist/components/AudioPlayer/index.cjs +7 -7
  278. package/dist/components/AudioPlayer/index.js +2 -2
  279. package/dist/components/AudioRecorder/index.cjs +7 -7
  280. package/dist/components/AudioRecorder/index.js +2 -2
  281. package/dist/components/Autocomplete/index.cjs +5 -5
  282. package/dist/components/Autocomplete/index.js +4 -4
  283. package/dist/components/Avatar/index.cjs +6 -6
  284. package/dist/components/Avatar/index.js +2 -2
  285. package/dist/components/Badge/index.cjs +4 -4
  286. package/dist/components/Badge/index.js +2 -2
  287. package/dist/components/Breadcrumb/index.cjs +4 -4
  288. package/dist/components/Breadcrumb/index.js +2 -2
  289. package/dist/components/Button/index.cjs +4 -4
  290. package/dist/components/Button/index.js +2 -2
  291. package/dist/components/Card/index.cjs +16 -16
  292. package/dist/components/Card/index.d.cts +8 -3
  293. package/dist/components/Card/index.d.ts +8 -3
  294. package/dist/components/Card/index.js +2 -2
  295. package/dist/components/Checkbox/index.cjs +5 -5
  296. package/dist/components/Checkbox/index.js +2 -2
  297. package/dist/components/CollabStatus/index.cjs +21 -0
  298. package/dist/components/CollabStatus/index.cjs.map +1 -0
  299. package/dist/components/CollabStatus/index.d.cts +222 -0
  300. package/dist/components/CollabStatus/index.d.ts +222 -0
  301. package/dist/components/CollabStatus/index.js +4 -0
  302. package/dist/components/CollabStatus/index.js.map +1 -0
  303. package/dist/components/Collapsible/index.cjs +5 -5
  304. package/dist/components/Collapsible/index.js +2 -2
  305. package/dist/components/CountryCodeDropdown/index.cjs +6 -6
  306. package/dist/components/CountryCodeDropdown/index.js +3 -3
  307. package/dist/components/DateInput/index.cjs +5 -5
  308. package/dist/components/DateInput/index.d.cts +3 -1
  309. package/dist/components/DateInput/index.d.ts +3 -1
  310. package/dist/components/DateInput/index.js +4 -4
  311. package/dist/components/Dropdown/index.cjs +10 -10
  312. package/dist/components/Dropdown/index.d.cts +1 -1
  313. package/dist/components/Dropdown/index.d.ts +1 -1
  314. package/dist/components/Dropdown/index.js +4 -4
  315. package/dist/components/FloatingWindow/index.cjs +5 -5
  316. package/dist/components/FloatingWindow/index.js +3 -3
  317. package/dist/components/Input/index.cjs +4 -4
  318. package/dist/components/Input/index.js +2 -2
  319. package/dist/components/Label/index.cjs +4 -4
  320. package/dist/components/Label/index.js +2 -2
  321. package/dist/components/Markdown/index.cjs +17 -17
  322. package/dist/components/Markdown/index.js +8 -8
  323. package/dist/components/MediaEditor/index.cjs +16 -16
  324. package/dist/components/MediaEditor/index.d.cts +34 -1
  325. package/dist/components/MediaEditor/index.d.ts +34 -1
  326. package/dist/components/MediaEditor/index.js +11 -11
  327. package/dist/components/MediaPlayer/index.cjs +6 -6
  328. package/dist/components/MediaPlayer/index.js +3 -3
  329. package/dist/components/Modal/index.cjs +10 -10
  330. package/dist/components/Modal/index.js +2 -2
  331. package/dist/components/Pagination/index.cjs +5 -5
  332. package/dist/components/Pagination/index.js +2 -2
  333. package/dist/components/PhoneInput/index.cjs +5 -5
  334. package/dist/components/PhoneInput/index.js +3 -3
  335. package/dist/components/Progress/index.cjs +7 -7
  336. package/dist/components/Progress/index.js +2 -2
  337. package/dist/components/QuickAction/index.cjs +7 -7
  338. package/dist/components/QuickAction/index.js +2 -2
  339. package/dist/components/Radio/index.cjs +5 -5
  340. package/dist/components/Radio/index.js +2 -2
  341. package/dist/components/RecordButton/index.cjs +5 -5
  342. package/dist/components/RecordButton/index.js +2 -2
  343. package/dist/components/RichTextEditor/index.cjs +10 -10
  344. package/dist/components/RichTextEditor/index.js +7 -7
  345. package/dist/components/SchedulePicker/index.cjs +11 -11
  346. package/dist/components/SchedulePicker/index.js +2 -2
  347. package/dist/components/ScrollArea/index.cjs +4 -4
  348. package/dist/components/ScrollArea/index.js +2 -2
  349. package/dist/components/Select/index.cjs +5 -5
  350. package/dist/components/Select/index.js +3 -3
  351. package/dist/components/Separator/index.cjs +4 -4
  352. package/dist/components/Separator/index.js +2 -2
  353. package/dist/components/Sheet/index.cjs +11 -11
  354. package/dist/components/Sheet/index.d.cts +1 -1
  355. package/dist/components/Sheet/index.d.ts +1 -1
  356. package/dist/components/Sheet/index.js +2 -2
  357. package/dist/components/Skeleton/index.cjs +7 -7
  358. package/dist/components/Skeleton/index.js +2 -2
  359. package/dist/components/Slider/index.cjs +6 -6
  360. package/dist/components/Slider/index.js +2 -2
  361. package/dist/components/Spinner/index.cjs +6 -6
  362. package/dist/components/Spinner/index.js +2 -2
  363. package/dist/components/SuperChat/index.cjs +46 -46
  364. package/dist/components/SuperChat/index.d.cts +4 -4
  365. package/dist/components/SuperChat/index.d.ts +4 -4
  366. package/dist/components/SuperChat/index.js +9 -9
  367. package/dist/components/SuperChat/plugins/index.cjs +10 -10
  368. package/dist/components/SuperChat/plugins/index.d.cts +3 -3
  369. package/dist/components/SuperChat/plugins/index.d.ts +3 -3
  370. package/dist/components/SuperChat/plugins/index.js +4 -4
  371. package/dist/components/Switch/index.cjs +5 -5
  372. package/dist/components/Switch/index.js +2 -2
  373. package/dist/components/Table/index.cjs +10 -10
  374. package/dist/components/Table/index.js +2 -2
  375. package/dist/components/Tabs/index.cjs +8 -8
  376. package/dist/components/Tabs/index.js +2 -2
  377. package/dist/components/Text/index.cjs +5 -5
  378. package/dist/components/Text/index.d.cts +1 -1
  379. package/dist/components/Text/index.d.ts +1 -1
  380. package/dist/components/Text/index.js +2 -2
  381. package/dist/components/Textarea/index.cjs +4 -4
  382. package/dist/components/Textarea/index.js +2 -2
  383. package/dist/components/ThemeProvider/index.cjs +9 -9
  384. package/dist/components/ThemeProvider/index.js +3 -3
  385. package/dist/components/Toggle/index.cjs +4 -4
  386. package/dist/components/Toggle/index.js +2 -2
  387. package/dist/components/Tooltip/index.cjs +3 -3
  388. package/dist/components/Tooltip/index.js +2 -2
  389. package/dist/datavis.cjs +7 -7
  390. package/dist/datavis.js +3 -3
  391. package/dist/esheet.cjs +18 -18
  392. package/dist/esheet.js +15 -15
  393. package/dist/hooks/index.cjs +34 -22
  394. package/dist/hooks/index.d.cts +31 -3
  395. package/dist/hooks/index.d.ts +31 -3
  396. package/dist/hooks/index.js +3 -3
  397. package/dist/index.cjs +3422 -1875
  398. package/dist/index.cjs.map +1 -1
  399. package/dist/index.d.cts +212 -22
  400. package/dist/index.d.ts +212 -22
  401. package/dist/index.js +918 -124
  402. package/dist/index.js.map +1 -1
  403. package/dist/kerebron.cjs +60 -17
  404. package/dist/kerebron.cjs.map +1 -1
  405. package/dist/kerebron.d.cts +39 -1
  406. package/dist/kerebron.d.ts +39 -1
  407. package/dist/kerebron.js +60 -17
  408. package/dist/kerebron.js.map +1 -1
  409. package/dist/styles.css +1 -1
  410. package/dist/tailwind-preset.cjs +4 -4
  411. package/dist/tailwind-preset.js +1 -1
  412. package/dist/{types-BYnLjEFg.d.ts → types-B2RLmdVd.d.cts} +3 -1
  413. package/dist/{types-BYnLjEFg.d.cts → types-B2RLmdVd.d.ts} +3 -1
  414. package/dist/{types-CyCwYBlr.d.ts → types-BoTeTPdH.d.ts} +1 -1
  415. package/dist/{types-CBh8Zlje.d.cts → types-DyIB9HYT.d.cts} +1 -1
  416. package/dist/{useAnchoredPosition-nXdSFKHf.d.cts → useAnchoredPosition-C7PNglzD.d.cts} +6 -2
  417. package/dist/{useAnchoredPosition-nXdSFKHf.d.ts → useAnchoredPosition-C7PNglzD.d.ts} +6 -2
  418. package/dist/{useTranscriptEdits-Hy0Vm-H8.d.cts → useTranscriptEdits-CGzlemHT.d.cts} +16 -3
  419. package/dist/{useTranscriptEdits-C2BbMU37.d.ts → useTranscriptEdits-D32bLs0l.d.ts} +16 -3
  420. package/dist/utils/index.cjs +15 -11
  421. package/dist/utils/index.d.cts +6 -1
  422. package/dist/utils/index.d.ts +6 -1
  423. package/dist/utils/index.js +2 -2
  424. package/package.json +30 -12
  425. package/dist/CsvBlock-2A5VEDD3.cjs +0 -15
  426. package/dist/CsvBlock-D6PWAJ5X.js +0 -6
  427. package/dist/HtmlPreviewBlock-PEHTJ6C3.js +0 -6
  428. package/dist/HtmlPreviewBlock-SYXCV5RH.cjs +0 -15
  429. package/dist/MermaidBlock-7NK3AVK2.js +0 -6
  430. package/dist/MermaidBlock-AFXNP5NK.cjs +0 -15
  431. package/dist/SurveyBlock-6KRNKFH5.cjs +0 -15
  432. package/dist/SurveyBlock-NNDGXGG4.js +0 -6
  433. package/dist/chunk-43GBCUSQ.js.map +0 -1
  434. package/dist/chunk-4GXECTPS.cjs.map +0 -1
  435. package/dist/chunk-4LVPQ44A.js.map +0 -1
  436. package/dist/chunk-5BQE6BEL.js.map +0 -1
  437. package/dist/chunk-6D5F7EDM.js.map +0 -1
  438. package/dist/chunk-7VF6WO7H.cjs.map +0 -1
  439. package/dist/chunk-DHKYGVP7.js +0 -3
  440. package/dist/chunk-F3SOEIN2.js +0 -11
  441. package/dist/chunk-F3SOEIN2.js.map +0 -1
  442. package/dist/chunk-FCBQP2U4.cjs.map +0 -1
  443. package/dist/chunk-IHTRKWBG.js.map +0 -1
  444. package/dist/chunk-IWDQPSJN.cjs.map +0 -1
  445. package/dist/chunk-JLBT76WH.js.map +0 -1
  446. package/dist/chunk-KJ5BSGEO.cjs.map +0 -1
  447. package/dist/chunk-LJ2ZWIX6.js.map +0 -1
  448. package/dist/chunk-MCCO4A23.js.map +0 -1
  449. package/dist/chunk-NQME7MCK.js.map +0 -1
  450. package/dist/chunk-NVHAQOHH.cjs.map +0 -1
  451. package/dist/chunk-OOYEHBYJ.js.map +0 -1
  452. package/dist/chunk-OR5DRJCW.cjs +0 -13
  453. package/dist/chunk-OR5DRJCW.cjs.map +0 -1
  454. package/dist/chunk-PFWHWIXS.cjs.map +0 -1
  455. package/dist/chunk-PJAQDAMZ.cjs.map +0 -1
  456. package/dist/chunk-PWHK7SWN.cjs.map +0 -1
  457. package/dist/chunk-QA6ZDHFP.js.map +0 -1
  458. package/dist/chunk-QUUFKGDF.cjs.map +0 -1
  459. package/dist/chunk-UTYUT5YY.cjs +0 -240
  460. package/dist/chunk-ZDEYV373.cjs.map +0 -1
  461. package/dist/chunk-ZGSC2CB2.js.map +0 -1
  462. package/dist/chunk-ZHBANUBI.cjs.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/components/MediaEditor/FillerWordsModal.tsx","../src/components/MediaEditor/WordEditorModal.tsx","../src/components/MediaEditor/SilenceSettingsModal.tsx","../src/components/MediaEditor/SpeedMarkerMenu.tsx","../src/components/MediaEditor/ScriptPanel.tsx","../src/components/MediaEditor/MediaEditor.tsx"],"names":["React","React2","jsxs","jsx","React3","React4","React5","formatDuration"],"mappings":";;;;;;;;;;;;;AA0CA,IAAM,yBAAA,GAA4B,CAAC,GAAA,EAAK,GAAA,EAAK,KAAK,IAAA,EAAM,CAAA,EAAK,KAAK,CAAG,CAAA;AAGrE,SAAS,eAAe,EAAA,EAAoB;AAC1C,EAAA,MAAM,YAAA,GAAe,IAAA,CAAK,KAAA,CAAM,EAAA,GAAK,GAAI,CAAA;AACzC,EAAA,IAAI,eAAe,EAAA,EAAI;AACrB,IAAA,OAAO,GAAG,YAAY,CAAA,CAAA,CAAA;AAAA,EACxB;AACA,EAAA,MAAM,OAAA,GAAU,IAAA,CAAK,KAAA,CAAM,YAAA,GAAe,EAAE,CAAA;AAC5C,EAAA,MAAM,UAAU,YAAA,GAAe,EAAA;AAC/B,EAAA,OAAO,CAAA,EAAG,OAAO,CAAA,CAAA,EAAI,MAAA,CAAO,OAAO,CAAA,CAAE,QAAA,CAAS,CAAA,EAAG,GAAG,CAAC,CAAA,CAAA;AACvD;AAGO,IAAM,mBAAoD,CAAC;AAAA,EAChE,MAAA;AAAA,EACA,OAAA;AAAA,EACA,OAAA;AAAA,EACA,cAAA;AAAA,EACA,eAAA;AAAA,EACA,aAAA;AAAA,EACA;AACF,CAAA,KAAM;AACJ,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAUA,gBAAS,EAAE,CAAA;AACrD,EAAA,MAAM,CAAC,eAAA,EAAiB,kBAAkB,CAAA,GAAUA,MAAA,CAAA,QAAA;AAAA,IAClD,IAAI,IAAI,oBAAoB;AAAA,GAC9B;AACA,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAUA,gBAAS,EAAE,CAAA;AACrD,EAAA,MAAM,CAAC,aAAA,EAAe,gBAAgB,CAAA,GAAUA,gBAAS,KAAK,CAAA;AAC9D,EAAA,MAAM,CAAC,gBAAA,EAAkB,mBAAmB,CAAA,GAAUA,gBAAS,GAAG,CAAA;AAGlE,EAAA,MAAM,kBAAkB,oBAAA,CAAqB,MAAA;AAAA,IAAO,CAAC,SACnD,IAAA,CAAK,WAAA,GAAc,QAAA,CAAS,UAAA,CAAW,aAAa;AAAA,GACtD,CAAE,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM;AACf,IAAA,MAAM,MAAA,GAAS,cAAA,CAAe,GAAA,CAAI,CAAC,CAAA,IAAK,CAAA;AACxC,IAAA,MAAM,MAAA,GAAS,cAAA,CAAe,GAAA,CAAI,CAAC,CAAA,IAAK,CAAA;AACxC,IAAA,IAAI,MAAA,KAAW,MAAA,EAAQ,OAAO,MAAA,GAAS,MAAA;AACvC,IAAA,OAAO,CAAA,CAAE,cAAc,CAAC,CAAA;AAAA,EAC1B,CAAC,CAAA;AAGD,EAAA,MAAM,aAAA,GAAgB,KAAA,CAAM,IAAA,CAAK,eAAe,CAAA,CAC7C,MAAA,CAAO,CAAC,IAAA,KAAS,CAAC,oBAAA,CAAqB,QAAA,CAAS,IAAI,CAAC,CAAA,CACrD,MAAA,CAAO,CAAC,IAAA,KAAS,IAAA,CAAK,WAAA,EAAY,CAAE,QAAA,CAAS,UAAA,CAAW,WAAA,EAAa,CAAC,CAAA,CACtE,IAAA,CAAK,CAAC,GAAG,CAAA,KAAM;AACd,IAAA,MAAM,MAAA,GAAS,cAAA,CAAe,GAAA,CAAI,CAAC,CAAA,IAAK,CAAA;AACxC,IAAA,MAAM,MAAA,GAAS,cAAA,CAAe,GAAA,CAAI,CAAC,CAAA,IAAK,CAAA;AACxC,IAAA,IAAI,MAAA,KAAW,MAAA,EAAQ,OAAO,MAAA,GAAS,MAAA;AACvC,IAAA,OAAO,CAAA,CAAE,cAAc,CAAC,CAAA;AAAA,EAC1B,CAAC,CAAA;AAEH,EAAA,MAAM,YAAA,GAAe,CAAC,IAAA,KAAiB;AACrC,IAAA,kBAAA,CAAmB,CAAC,IAAA,KAAS;AAC3B,MAAA,MAAM,IAAA,GAAO,IAAI,GAAA,CAAI,IAAI,CAAA;AACzB,MAAA,IAAI,IAAA,CAAK,GAAA,CAAI,IAAI,CAAA,EAAG;AAClB,QAAA,IAAA,CAAK,OAAO,IAAI,CAAA;AAAA,MAClB,CAAA,MAAO;AACL,QAAA,IAAA,CAAK,IAAI,IAAI,CAAA;AAAA,MACf;AACA,MAAA,OAAO,IAAA;AAAA,IACT,CAAC,CAAA;AAAA,EACH,CAAA;AAEA,EAAA,MAAM,kBAAkB,MAAM;AAC5B,IAAA,MAAM,OAAA,GAAU,UAAA,CAAW,IAAA,EAAK,CAAE,WAAA,EAAY;AAC9C,IAAA,IAAI,OAAA,IAAW,CAAC,eAAA,CAAgB,GAAA,CAAI,OAAO,CAAA,EAAG;AAC5C,MAAA,kBAAA,CAAmB,CAAC,yBAAS,IAAI,GAAA,CAAI,CAAC,GAAG,IAAA,EAAM,OAAO,CAAC,CAAC,CAAA;AACxD,MAAA,aAAA,CAAc,EAAE,CAAA;AAAA,IAClB;AAAA,EACF,CAAA;AAGA,EAAA,MAAM,WAAA,GAAc,gBAChB,aAAA,CAAc,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,SAAA,KAAc,gBAAgB,CAAA,IAAK;AAAA,IAC7D,KAAA,EAAO,CAAA;AAAA,IACP,UAAA,EAAY;AAAA,GACd,GACA,EAAE,KAAA,EAAO,CAAA,EAAG,YAAY,CAAA,EAAE;AAC9B,EAAA,MAAM,sBAAsB,WAAA,CAAY,KAAA;AACxC,EAAA,MAAM,oBAAoB,WAAA,CAAY,UAAA;AAEtC,EAAA,MAAM,cAAc,MAAM;AACxB,IAAA,OAAA;AAAA,MACE,KAAA,CAAM,KAAK,eAAe,CAAA;AAAA,MAC1B,gBAAgB,gBAAA,GAAmB;AAAA,KACrC;AACA,IAAA,OAAA,EAAQ;AAAA,EACV,CAAA;AAEA,EAAA,MAAM,YAAY,MAAM;AACtB,IAAA,kBAAA,iBAAmB,IAAI,IAAI,CAAC,GAAG,sBAAsB,GAAG,aAAa,CAAC,CAAC,CAAA;AAAA,EACzE,CAAA;AAEA,EAAA,MAAM,aAAa,MAAM;AACvB,IAAA,kBAAA,iBAAmB,IAAI,KAAK,CAAA;AAAA,EAC9B,CAAA;AAGA,EAAA,MAAM,aAAA,GAAgB,KAAA,CAAM,IAAA,CAAK,eAAe,CAAA,CAAE,MAAA;AAAA,IAChD,CAAC,GAAA,EAAK,IAAA,KAAS,OAAO,cAAA,CAAe,GAAA,CAAI,IAAI,CAAA,IAAK,CAAA,CAAA;AAAA,IAClD;AAAA,GACF;AACA,EAAA,MAAM,eAAe,aAAA,GAAgB,mBAAA;AAGrC,EAAA,MAAM,iBAAA,GAAoB,KAAA,CAAM,IAAA,CAAK,eAAe,CAAA,CAAE,MAAA;AAAA,IACpD,CAAC,GAAA,EAAK,IAAA,KAAS,OAAO,eAAA,CAAgB,GAAA,CAAI,IAAI,CAAA,IAAK,CAAA,CAAA;AAAA,IACnD;AAAA,GACF;AACA,EAAA,MAAM,mBAAmB,iBAAA,GAAoB,iBAAA;AAC7C,EAAA,MAAM,gBAAgB,iBAAA,GAAoB,gBAAA;AAE1C,EAAA,MAAM,gBAAA,GAAmB,CAAC,IAAA,EAAc,QAAA,KAAsB;AAC5D,IAAA,MAAM,KAAA,GAAQ,cAAA,CAAe,GAAA,CAAI,IAAI,CAAA,IAAK,CAAA;AAC1C,IAAA,uBACE,IAAA;AAAA,MAAC,OAAA;AAAA,MAAA;AAAA,QAEC,SAAA,EAAU,wGAAA;AAAA,QAEV,QAAA,EAAA;AAAA,0BAAA,GAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACC,IAAA,EAAK,IAAA;AAAA,cACL,OAAA,EAAS,eAAA,CAAgB,GAAA,CAAI,IAAI,CAAA;AAAA,cACjC,QAAA,EAAU,MAAM,YAAA,CAAa,IAAI,CAAA;AAAA,cACjC,YAAA,EAAY,WAAW,IAAI,CAAA,CAAA;AAAA;AAAA,WAC7B;AAAA,0BACA,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,yCAAA,EAA2C,QAAA,EAAA,IAAA,EAAK,CAAA;AAAA,UAC/D,KAAA,GAAQ,CAAA,oBACP,IAAA,CAAC,MAAA,EAAA,EAAK,WAAU,+BAAA,EAAgC,QAAA,EAAA;AAAA,YAAA,GAAA;AAAA,YAAE,KAAA;AAAA,YAAM;AAAA,WAAA,EAAC,CAAA;AAAA,UAE1D,QAAA,oBACC,GAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACC,IAAA,EAAK,QAAA;AAAA,cACL,SAAA,EAAU,6KAAA;AAAA,cACV,OAAA,EAAS,CAAC,CAAA,KAAM;AACd,gBAAA,CAAA,CAAE,cAAA,EAAe;AACjB,gBAAA,kBAAA,CAAmB,CAAC,IAAA,KAAS;AAC3B,kBAAA,MAAM,IAAA,GAAO,IAAI,GAAA,CAAI,IAAI,CAAA;AACzB,kBAAA,IAAA,CAAK,OAAO,IAAI,CAAA;AAChB,kBAAA,OAAO,IAAA;AAAA,gBACT,CAAC,CAAA;AAAA,cACH,CAAA;AAAA,cACA,YAAA,EAAY,UAAU,IAAI,CAAA,CAAA;AAAA,cAC3B,QAAA,EAAA;AAAA;AAAA;AAED;AAAA,OAAA;AAAA,MA5BG;AAAA,KA8BP;AAAA,EAEJ,CAAA;AAEA,EAAA,uBACE,IAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAM,MAAA;AAAA,MACN,YAAA,EAAc,CAAC,IAAA,KAAS;AACtB,QAAA,IAAI,CAAC,MAAM,OAAA,EAAQ;AAAA,MACrB,CAAA;AAAA,MACA,IAAA,EAAK,IAAA;AAAA,MAEL,QAAA,EAAA;AAAA,wBAAA,IAAA,CAAC,WAAA,EAAA,EACC,QAAA,EAAA;AAAA,0BAAA,GAAA,CAAC,cAAW,QAAA,EAAA,qBAAA,EAAmB,CAAA;AAAA,0BAC/B,GAAA,CAAC,UAAA,EAAA,EAAW,YAAA,EAAW,aAAA,EAAc;AAAA,SAAA,EACvC,CAAA;AAAA,wBAEA,IAAA,CAAC,SAAA,EAAA,EAAU,SAAA,EAAU,qBAAA,EACnB,QAAA,EAAA;AAAA,0BAAA,GAAA;AAAA,YAAC,KAAA;AAAA,YAAA;AAAA,cACC,IAAA,EAAK,IAAA;AAAA,cACL,IAAA,EAAK,MAAA;AAAA,cACL,WAAA,EAAY,wBAAA;AAAA,cACZ,KAAA,EAAO,UAAA;AAAA,cACP,UAAU,CAAC,CAAA,KAAM,aAAA,CAAc,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,cAC7C,YAAA,EAAW;AAAA;AAAA,WACb;AAAA,0BAEA,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yBAAA,EACb,QAAA,EAAA;AAAA,4BAAA,GAAA,CAAC,UAAO,OAAA,EAAQ,OAAA,EAAQ,MAAK,IAAA,EAAK,OAAA,EAAS,WAAW,QAAA,EAAA,YAAA,EAEtD,CAAA;AAAA,4BACA,GAAA,CAAC,UAAO,OAAA,EAAQ,OAAA,EAAQ,MAAK,IAAA,EAAK,OAAA,EAAS,YAAY,QAAA,EAAA,aAAA,EAEvD;AAAA,WAAA,EACF,CAAA;AAAA,0BAEA,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yFAAA,EACb,QAAA,EAAA;AAAA,4BAAA,GAAA;AAAA,cAAC,QAAA;AAAA,cAAA;AAAA,gBACC,IAAA,EAAK,IAAA;AAAA,gBACL,KAAA,EAAM,8BAAA;AAAA,gBACN,OAAA,EAAS,aAAA;AAAA,gBACT,UAAU,CAAC,CAAA,KAAM,gBAAA,CAAiB,CAAA,CAAE,OAAO,OAAO;AAAA;AAAA,aACpD;AAAA,4BACA,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,MAAA,EACb,QAAA,kBAAA,GAAA;AAAA,cAAC,MAAA;AAAA,cAAA;AAAA,gBACC,IAAA,EAAK,IAAA;AAAA,gBACL,OAAA,EAAS,yBAAA,CAA0B,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,kBAC7C,KAAA,EAAO,OAAO,CAAC,CAAA;AAAA,kBACf,KAAA,EAAO,GAAG,CAAC,CAAA,CAAA;AAAA,iBACb,CAAE,CAAA;AAAA,gBACF,KAAA,EAAO,OAAO,gBAAgB,CAAA;AAAA,gBAC9B,eAAe,CAAC,KAAA,KAAU,mBAAA,CAAoB,UAAA,CAAW,KAAK,CAAC,CAAA;AAAA,gBAC/D,UAAU,CAAC,aAAA;AAAA,gBACX,YAAA,EAAW;AAAA;AAAA,aACb,EACF,CAAA;AAAA,YACC,iBAAiB,mBAAA,GAAsB,CAAA,oBACtC,IAAA,CAAC,MAAA,EAAA,EAAK,WAAU,+BAAA,EAAgC,QAAA,EAAA;AAAA,cAAA,GAAA;AAAA,cAC5C,mBAAA;AAAA,cAAoB;AAAA,aAAA,EACxB;AAAA,WAAA,EAEJ,CAAA;AAAA,0BAEA,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gHAAA,EACZ,QAAA,EAAA;AAAA,YAAA,eAAA,CAAgB,IAAI,CAAC,IAAA,KAAS,gBAAA,CAAiB,IAAA,EAAM,KAAK,CAAC,CAAA;AAAA,YAC3D,cAAc,GAAA,CAAI,CAAC,SAAS,gBAAA,CAAiB,IAAA,EAAM,IAAI,CAAC;AAAA,WAAA,EAC3D,CAAA;AAAA,0BAEA,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yBAAA,EACb,QAAA,EAAA;AAAA,4BAAA,GAAA;AAAA,cAAC,KAAA;AAAA,cAAA;AAAA,gBACC,IAAA,EAAK,IAAA;AAAA,gBACL,IAAA,EAAK,MAAA;AAAA,gBACL,WAAA,EAAY,2BAAA;AAAA,gBACZ,KAAA,EAAO,UAAA;AAAA,gBACP,UAAU,CAAC,CAAA,KAAM,aAAA,CAAc,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,gBAC7C,SAAA,EAAW,CAAC,CAAA,KAAM;AAChB,kBAAA,IAAI,CAAA,CAAE,QAAQ,OAAA,EAAS;AACrB,oBAAA,CAAA,CAAE,cAAA,EAAe;AACjB,oBAAA,eAAA,EAAgB;AAAA,kBAClB;AAAA,gBACF,CAAA;AAAA,gBACA,YAAA,EAAW;AAAA;AAAA,aACb;AAAA,4BACA,GAAA;AAAA,cAAC,MAAA;AAAA,cAAA;AAAA,gBACC,OAAA,EAAQ,WAAA;AAAA,gBACR,IAAA,EAAK,IAAA;AAAA,gBACL,OAAA,EAAS,eAAA;AAAA,gBACT,QAAA,EAAU,CAAC,UAAA,CAAW,IAAA,EAAK;AAAA,gBAC5B,QAAA,EAAA;AAAA;AAAA;AAED,WAAA,EACF;AAAA,SAAA,EACF,CAAA;AAAA,wBAEA,IAAA,CAAC,WAAA,EAAA,EAAY,SAAA,EAAU,iBAAA,EACrB,QAAA,EAAA;AAAA,0BAAA,IAAA,CAAC,MAAA,EAAA,EAAK,WAAU,+BAAA,EACb,QAAA,EAAA;AAAA,YAAA,YAAA;AAAA,YAAa,sBAAA;AAAA,YAAgB,eAAe,gBAAgB,CAAA;AAAA,YAAE,SAAA;AAAA,YAAG,GAAA;AAAA,YACjE,eAAe,aAAa;AAAA,WAAA,EAC/B,CAAA;AAAA,0BACA,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yBAAA,EACb,QAAA,EAAA;AAAA,4BAAA,GAAA,CAAC,UAAO,OAAA,EAAQ,WAAA,EAAY,MAAK,IAAA,EAAK,OAAA,EAAS,SAAS,QAAA,EAAA,QAAA,EAExD,CAAA;AAAA,4BACA,IAAA;AAAA,cAAC,MAAA;AAAA,cAAA;AAAA,gBACC,OAAA,EAAQ,SAAA;AAAA,gBACR,IAAA,EAAK,IAAA;AAAA,gBACL,OAAA,EAAS,WAAA;AAAA,gBACT,UAAU,YAAA,KAAiB,CAAA;AAAA,gBAC5B,QAAA,EAAA;AAAA,kBAAA,mBAAA;AAAA,kBACmB,YAAA;AAAA,kBAAa;AAAA;AAAA;AAAA;AACjC,WAAA,EACF;AAAA,SAAA,EACF;AAAA;AAAA;AAAA,GACF;AAEJ;AAEA,gBAAA,CAAiB,WAAA,GAAc,kBAAA;ACtQxB,IAAM,kBAAkD,CAAC;AAAA,EAC9D,MAAA;AAAA,EACA,YAAA;AAAA,EACA,OAAA;AAAA,EACA,MAAA;AAAA,EACA,cAAA;AAAA,EACA;AACF,CAAA,KAAM;AACJ,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAUC,gBAAS,EAAE,CAAA;AACrD,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAUA,gBAAwB,IAAI,CAAA;AAC5D,EAAA,MAAM,QAAA,GAAiBA,cAAyB,IAAI,CAAA;AAEpD,EAAA,MAAM,SAAA,GAAY,aAAA,CAAc,YAAA,EAAc,IAAA,CAAK,QAAQ,CAAA;AAC3D,EAAA,MAAM,aAAa,YAAA,GACf,YAAA,CAAa,KAAK,KAAA,GAAQ,YAAA,CAAa,KAAK,OAAA,GAC5C,CAAA;AACJ,EAAA,MAAM,cAAc,UAAA,GAAa,GAAA;AAGjC,EAAMA,iBAAU,MAAM;AACpB,IAAA,IAAI,UAAU,YAAA,EAAc;AAC1B,MAAA,IAAI,SAAA,EAAW;AACb,QAAA,aAAA,CAAc,EAAE,CAAA;AAAA,MAClB,CAAA,MAAO;AACL,QAAA,aAAA,CAAc,YAAA,CAAa,KAAK,IAAI,CAAA;AAAA,MACtC;AACA,MAAA,QAAA,CAAS,IAAI,CAAA;AAEb,MAAA,UAAA,CAAW,MAAM,QAAA,CAAS,OAAA,EAAS,KAAA,IAAS,EAAE,CAAA;AAAA,IAChD;AAAA,EACF,CAAA,EAAG,CAAC,MAAA,EAAQ,YAAA,EAAc,SAAS,CAAC,CAAA;AAGpC,EAAA,MAAM,iBAAA,GAAoB,CAAC,KAAA,KAA6C;AACtE,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,EAAK;AAC3B,IAAA,IAAI,CAAC,SAAS,OAAO,IAAA;AAErB,IAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,KAAA,CAAM,KAAK,CAAA;AACjC,IAAA,MAAM,YAAsB,EAAC;AAC7B,IAAA,IAAI,KAAA,GAAQ,CAAA;AAEZ,IAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,MAAA,MAAM,GAAA,GAAM,WAAW,IAAI,CAAA;AAC3B,MAAA,IAAI,KAAA,CAAM,GAAG,CAAA,IAAK,GAAA,IAAO,CAAA,EAAG;AAC1B,QAAA,OAAO;AAAA,UACL,WAAW,EAAC;AAAA,UACZ,SAAA,EAAW,CAAA;AAAA,UACX,KAAA,EAAO,oBAAoB,IAAI,CAAA,CAAA;AAAA,SACjC;AAAA,MACF;AACA,MAAA,SAAA,CAAU,KAAK,GAAG,CAAA;AAClB,MAAA,KAAA,IAAS,GAAA;AAAA,IACX;AAEA,IAAA,IAAI,SAAS,WAAA,EAAa;AACxB,MAAA,OAAO;AAAA,QACL,WAAW,EAAC;AAAA,QACZ,SAAA,EAAW,CAAA;AAAA,QACX,KAAA,EAAO,CAAA,OAAA,EAAU,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAC,CAAA,6BAAA,EAAgC,WAAA,CAAY,OAAA,CAAQ,CAAC,CAAC,CAAA,EAAA;AAAA,OACzF;AAAA,IACF;AAEA,IAAA,MAAM,YAAY,WAAA,GAAc,KAAA;AAChC,IAAA,OAAO,EAAE,WAAW,SAAA,EAAU;AAAA,EAChC,CAAA;AAEA,EAAA,MAAM,cAAc,MAAM;AACxB,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,MAAM,MAAA,GAAS,kBAAkB,UAAU,CAAA;AAC3C,MAAA,IAAI,QAAQ,KAAA,EAAO;AACjB,QAAA,QAAA,CAAS,OAAO,KAAK,CAAA;AACrB,QAAA;AAAA,MACF;AACA,MAAA,IAAI,MAAA,IAAU,MAAA,CAAO,SAAA,CAAU,MAAA,GAAS,CAAA,EAAG;AAEzC,QAAA,MAAM,eAAe,CAAC,GAAG,MAAA,CAAO,SAAA,EAAW,OAAO,SAAS,CAAA;AAC3D,QAAA,cAAA,CAAe,YAAY,CAAA;AAC3B,QAAA,OAAA,EAAQ;AAAA,MACV;AAAA,IACF,CAAA,MAAO;AACL,MAAA,MAAM,OAAA,GAAU,WAAW,IAAA,EAAK;AAChC,MAAA,IAAI,OAAA,IAAW,OAAA,KAAY,YAAA,EAAc,IAAA,CAAK,IAAA,EAAM;AAClD,QAAA,MAAA,CAAO,OAAO,CAAA;AAAA,MAChB;AACA,MAAA,OAAA,EAAQ;AAAA,IACV;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,aAAA,GAAgB,CAAC,CAAA,KAA2B;AAChD,IAAA,IAAI,CAAA,CAAE,QAAQ,OAAA,EAAS;AACrB,MAAA,CAAA,CAAE,cAAA,EAAe;AACjB,MAAA,WAAA,EAAY;AAAA,IACd;AAAA,EACF,CAAA;AAGA,EAAA,MAAM,OAAA,GAAU,SAAA,GAAY,iBAAA,CAAkB,UAAU,CAAA,GAAI,IAAA;AAE5D,EAAA,MAAM,gBAAgB,SAAA,GAClB,CAAC,WAAW,IAAA,EAAK,IACjB,CAAC,CAAC,OAAA,EAAS,KAAA,IACX,CAAC,WACD,OAAA,CAAQ,SAAA,CAAU,WAAW,CAAA,GAC7B,CAAC,WAAW,IAAA,EAAK;AAErB,EAAA,uBACEC,IAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAM,UAAU,YAAA,KAAiB,IAAA;AAAA,MACjC,YAAA,EAAc,CAAC,IAAA,KAAS;AACtB,QAAA,IAAI,CAAC,MAAM,OAAA,EAAQ;AAAA,MACrB,CAAA;AAAA,MACA,IAAA,EAAK,IAAA;AAAA,MAEL,QAAA,EAAA;AAAA,wBAAAA,KAAC,WAAA,EAAA,EACC,QAAA,EAAA;AAAA,0BAAAC,GAAAA,CAAC,UAAA,EAAA,EAAY,QAAA,EAAA,SAAA,GAAY,eAAA,GAAkB,WAAA,EAAY,CAAA;AAAA,0BACvDA,GAAAA,CAAC,UAAA,EAAA,EAAW,YAAA,EAAW,cAAA,EAAe;AAAA,SAAA,EACxC,CAAA;AAAA,wBAEAA,IAAC,SAAA,EAAA,EAAU,SAAA,EAAU,uBAClB,QAAA,EAAA,SAAA,mBACCD,KAAA,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,0BAAAA,IAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,6BAAA,EAA8B,QAAA,EAAA;AAAA,YAAA,mBAAA;AAAA,YACvB,GAAA;AAAA,4BAClBA,IAAAA,CAAC,QAAA,EAAA,EAAO,SAAA,EAAU,eAAA,EACf,QAAA,EAAA;AAAA,cAAA,WAAA,CAAY,QAAQ,CAAC,CAAA;AAAA,cAAE;AAAA,aAAA,EAC1B;AAAA,WAAA,EACF,CAAA;AAAA,0BACAC,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,qCAAoC,QAAA,EAAA,4DAAA,EAGjD,CAAA;AAAA,0BACAA,GAAAA;AAAA,YAAC,KAAA;AAAA,YAAA;AAAA,cACC,GAAA,EAAK,QAAA;AAAA,cACL,IAAA,EAAK,MAAA;AAAA,cACL,KAAA,EAAO,UAAA;AAAA,cACP,QAAA,EAAU,CAAC,CAAA,KAAM;AACf,gBAAA,aAAA,CAAc,CAAA,CAAE,OAAO,KAAK,CAAA;AAC5B,gBAAA,QAAA,CAAS,IAAI,CAAA;AAAA,cACf,CAAA;AAAA,cACA,SAAA,EAAW,aAAA;AAAA,cACX,WAAA,EAAY,UAAA;AAAA,cACZ,YAAA,EAAW;AAAA;AAAA,WACb;AAAA,UACC,KAAA,oBACCA,GAAAA,CAAC,GAAA,EAAA,EAAE,WAAU,8BAAA,EAA+B,IAAA,EAAK,SAC9C,QAAA,EAAA,KAAA,EACH,CAAA;AAAA,UAED,OAAA,IACC,CAAC,OAAA,CAAQ,KAAA,IACT,QAAQ,SAAA,CAAU,MAAA,GAAS,CAAA,IAC3B,CAAC,KAAA,oBACCD,IAAAA,CAAC,GAAA,EAAA,EAAE,WAAU,mCAAA,EAAoC,QAAA,EAAA;AAAA,YAAA,UAAA;AAAA,YACtC,GAAA;AAAA,YACR,CAAC,GAAG,OAAA,CAAQ,WAAW,OAAA,CAAQ,SAAS,EACtC,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAA,EAAI,EAAE,OAAA,CAAQ,CAAC,CAAC,CAAA,EAAA,CAAI,CAAA,CAC/B,KAAK,GAAG;AAAA,WAAA,EACb,CAAA;AAAA,UAEH,OAAA,EAAS,KAAA,IAAS,CAAC,KAAA,oBAClBC,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,8BAAA,EAA+B,IAAA,EAAK,OAAA,EAC9C,QAAA,EAAA,OAAA,CAAQ,KAAA,EACX;AAAA,SAAA,EAEJ,CAAA,mBAEAD,IAAAA,CAAA,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,0BAAAC,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,6BAAA,EAA8B,QAAA,EAAA,qBAAA,EAAmB,CAAA;AAAA,0BAC9DA,GAAAA;AAAA,YAAC,KAAA;AAAA,YAAA;AAAA,cACC,GAAA,EAAK,QAAA;AAAA,cACL,IAAA,EAAK,MAAA;AAAA,cACL,KAAA,EAAO,UAAA;AAAA,cACP,UAAU,CAAC,CAAA,KAAM,aAAA,CAAc,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,cAC7C,SAAA,EAAW,aAAA;AAAA,cACX,YAAA,EAAW;AAAA;AAAA;AACb,SAAA,EACF,CAAA,EAEJ,CAAA;AAAA,wBAEAD,IAAAA,CAAC,WAAA,EAAA,EAAY,SAAA,EAAU,iBAAA,EACrB,QAAA,EAAA;AAAA,0BAAAC,GAAAA;AAAA,YAAC,MAAA;AAAA,YAAA;AAAA,cACC,OAAA,EAAS,YAAA,EAAc,OAAA,GAAU,WAAA,GAAc,QAAA;AAAA,cAC/C,IAAA,EAAK,IAAA;AAAA,cACL,OAAA,EAAS,QAAA;AAAA,cAER,QAAA,EAAA,YAAA,EAAc,UAAU,SAAA,GAAY;AAAA;AAAA,WACvC;AAAA,0BACAD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yBAAA,EACb,QAAA,EAAA;AAAA,4BAAAC,GAAAA,CAAC,UAAO,OAAA,EAAQ,WAAA,EAAY,MAAK,IAAA,EAAK,OAAA,EAAS,SAAS,QAAA,EAAA,QAAA,EAExD,CAAA;AAAA,4BACAA,GAAAA;AAAA,cAAC,MAAA;AAAA,cAAA;AAAA,gBACC,OAAA,EAAQ,SAAA;AAAA,gBACR,IAAA,EAAK,IAAA;AAAA,gBACL,OAAA,EAAS,WAAA;AAAA,gBACT,QAAA,EAAU,aAAA;AAAA,gBAET,sBAAY,OAAA,GAAU;AAAA;AAAA;AACzB,WAAA,EACF;AAAA,SAAA,EACF;AAAA;AAAA;AAAA,GACF;AAEJ;AAEA,eAAA,CAAgB,WAAA,GAAc,iBAAA;AC3NvB,IAAM,uBAA4D,CAAC;AAAA,EACxE,MAAA;AAAA,EACA,OAAA;AAAA,EACA,YAAA;AAAA,EACA,WAAA;AAAA,EACA;AACF,CAAA,KAAM;AACJ,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAUC,MAAA,CAAA,QAAA,CAAS,eAAe,GAAI,CAAA;AACpE,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAUA,MAAA,CAAA,QAAA,CAAS,cAAc,GAAI,CAAA;AAGvE,EAAMA,iBAAU,MAAM;AACpB,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,YAAA,CAAa,eAAe,GAAI,CAAA;AAChC,MAAA,cAAA,CAAe,cAAc,GAAI,CAAA;AAAA,IACnC;AAAA,EACF,CAAA,EAAG,CAAC,MAAA,EAAQ,YAAA,EAAc,WAAW,CAAC,CAAA;AAEtC,EAAA,MAAM,cAAc,MAAM;AAExB,IAAA,MAAM,gBAAA,GAAmB,IAAA,CAAK,GAAA,CAAI,WAAA,EAAa,SAAS,CAAA;AACxD,IAAA,OAAA,CAAQ,IAAA,CAAK,MAAM,SAAA,GAAY,GAAI,GAAG,IAAA,CAAK,KAAA,CAAM,gBAAA,GAAmB,GAAI,CAAC,CAAA;AACzE,IAAA,OAAA,EAAQ;AAAA,EACV,CAAA;AAGA,EAAA,MAAM,qBAAA,GAAwB,CAAC,KAAA,KAAkB;AAC/C,IAAA,YAAA,CAAa,KAAK,CAAA;AAClB,IAAA,IAAI,cAAc,KAAA,EAAO;AACvB,MAAA,cAAA,CAAe,KAAK,CAAA;AAAA,IACtB;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,gBAAgB,CAAC,CAAA,KAAc,GAAG,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,CAAA;AAEpD,EAAA,uBACEF,IAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAM,MAAA;AAAA,MACN,YAAA,EAAc,CAAC,IAAA,KAAS;AACtB,QAAA,IAAI,CAAC,MAAM,OAAA,EAAQ;AAAA,MACrB,CAAA;AAAA,MACA,IAAA,EAAK,IAAA;AAAA,MAEL,QAAA,EAAA;AAAA,wBAAAA,KAAC,WAAA,EAAA,EACC,QAAA,EAAA;AAAA,0BAAAC,GAAAA,CAAC,cAAW,QAAA,EAAA,kBAAA,EAAgB,CAAA;AAAA,0BAC5BA,GAAAA,CAAC,UAAA,EAAA,EAAW,YAAA,EAAW,aAAA,EAAc;AAAA,SAAA,EACvC,CAAA;AAAA,wBAEAD,IAAAA,CAAC,SAAA,EAAA,EAAU,SAAA,EAAU,qBAAA,EACnB,QAAA,EAAA;AAAA,0BAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qBAAA,EACb,QAAA,EAAA;AAAA,4BAAAC,GAAAA;AAAA,cAAC,MAAA;AAAA,cAAA;AAAA,gBACC,KAAA,EAAM,0BAAA;AAAA,gBACN,GAAA,EAAK,GAAA;AAAA,gBACL,GAAA,EAAK,CAAA;AAAA,gBACL,IAAA,EAAM,GAAA;AAAA,gBACN,KAAA,EAAO,SAAA;AAAA,gBACP,aAAA,EAAe,qBAAA;AAAA,gBACf,SAAA,EAAS,IAAA;AAAA,gBACT,WAAA,EAAa,aAAA;AAAA,gBACb,YAAA,EAAW;AAAA;AAAA,aACb;AAAA,4BACAA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,qCAAoC,QAAA,EAAA,uDAAA,EAEjD;AAAA,WAAA,EACF,CAAA;AAAA,0BAEAD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qBAAA,EACb,QAAA,EAAA;AAAA,4BAAAC,GAAAA;AAAA,cAAC,MAAA;AAAA,cAAA;AAAA,gBACC,KAAA,EAAM,2BAAA;AAAA,gBACN,GAAA,EAAK,SAAA;AAAA,gBACL,GAAA,EAAK,CAAA;AAAA,gBACL,IAAA,EAAM,GAAA;AAAA,gBACN,KAAA,EAAO,WAAA;AAAA,gBACP,aAAA,EAAe,cAAA;AAAA,gBACf,SAAA,EAAS,IAAA;AAAA,gBACT,WAAA,EAAa,aAAA;AAAA,gBACb,YAAA,EAAW;AAAA;AAAA,aACb;AAAA,4BACAA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,qCAAoC,QAAA,EAAA,yDAAA,EAEjD;AAAA,WAAA,EACF;AAAA,SAAA,EACF,CAAA;AAAA,wBAEAD,KAAC,WAAA,EAAA,EACC,QAAA,EAAA;AAAA,0BAAAC,GAAAA,CAAC,UAAO,OAAA,EAAQ,WAAA,EAAY,MAAK,IAAA,EAAK,OAAA,EAAS,SAAS,QAAA,EAAA,QAAA,EAExD,CAAA;AAAA,0BACAA,IAAC,MAAA,EAAA,EAAO,OAAA,EAAQ,WAAU,IAAA,EAAK,IAAA,EAAK,OAAA,EAAS,WAAA,EAAa,QAAA,EAAA,OAAA,EAE1D;AAAA,SAAA,EACF;AAAA;AAAA;AAAA,GACF;AAEJ;AAEA,oBAAA,CAAqB,WAAA,GAAc,sBAAA;ACrG5B,IAAM,kBAAkD,CAAC;AAAA,EAC9D,MAAA;AAAA,EACA,QAAA;AAAA,EACA,aAAA;AAAA,EACA,YAAA;AAAA,EACA,UAAA;AAAA,EACA,cAAA;AAAA,EACA;AACF,CAAA,KAAM;AACJ,EAAA,MAAM,OAAA,GAAgBE,cAAuB,IAAI,CAAA;AAGjD,EAAMA,iBAAU,MAAM;AACpB,IAAA,MAAM,aAAA,GAAgB,CAAC,CAAA,KAAqB;AAC1C,MAAA,IAAI,CAAA,CAAE,GAAA,KAAQ,QAAA,EAAU,OAAA,EAAQ;AAAA,IAClC,CAAA;AACA,IAAA,MAAM,kBAAA,GAAqB,CAAC,CAAA,KAAkB;AAC5C,MAAA,IAAI,OAAA,CAAQ,WAAW,CAAC,OAAA,CAAQ,QAAQ,QAAA,CAAS,CAAA,CAAE,MAAc,CAAA,EAAG;AAClE,QAAA,OAAA,EAAQ;AAAA,MACV;AAAA,IACF,CAAA;AACA,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,QAAA,CAAS,gBAAA,CAAiB,WAAW,aAAa,CAAA;AAClD,MAAA,QAAA,CAAS,gBAAA,CAAiB,aAAa,kBAAkB,CAAA;AACzD,MAAA,OAAO,MAAM;AACX,QAAA,QAAA,CAAS,mBAAA,CAAoB,WAAW,aAAa,CAAA;AACrD,QAAA,QAAA,CAAS,mBAAA,CAAoB,aAAa,kBAAkB,CAAA;AAAA,MAC9D,CAAA;AAAA,IACF;AAAA,EACF,CAAA,EAAG,CAAC,MAAA,EAAQ,OAAO,CAAC,CAAA;AAEpB,EAAA,IAAI,CAAC,MAAA,IAAU,CAAC,QAAA,EAAU,OAAO,IAAA;AAEjC,EAAA,uBACEH,IAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,GAAA,EAAK,OAAA;AAAA,MACL,SAAA,EAAU,4GAAA;AAAA,MACV,OAAO,EAAE,IAAA,EAAM,SAAS,CAAA,EAAG,GAAA,EAAK,SAAS,CAAA,EAAE;AAAA,MAC3C,IAAA,EAAK,MAAA;AAAA,MACL,YAAA,EAAW,kBAAA;AAAA,MAEX,QAAA,EAAA;AAAA,wBAAAC,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gFAAA,EAAiF,QAAA,EAAA,kBAAA,EAEhG,CAAA;AAAA,wBACAA,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qBACZ,QAAA,EAAA,eAAA,CAAgB,GAAA,CAAI,CAAC,KAAA,KAAU;AAC9B,UAAA,MAAM,QAAA,GAAW,eAAe,KAAA,KAAU,KAAA;AAC1C,UAAA,MAAM,SAAA,GAAY,KAAA,KAAU,YAAA,IAAgB,CAAC,aAAA;AAC7C,UAAA,uBACED,IAAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cAEC,IAAA,EAAK,QAAA;AAAA,cACL,SAAA,EAAW,CAAA,2KAAA,EACT,QAAA,GACI,uCAAA,GACA,gCACN,CAAA,CAAA;AAAA,cACA,SAAS,MAAM;AACb,gBAAA,UAAA,CAAW,KAAK,CAAA;AAChB,gBAAA,OAAA,EAAQ;AAAA,cACV,CAAA;AAAA,cACA,IAAA,EAAK,UAAA;AAAA,cAEJ,QAAA,EAAA;AAAA,gBAAA,KAAA;AAAA,gBAAM,GAAA;AAAA,gBACN,6BACCC,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,iCAAgC,QAAA,EAAA,SAAA,EAAO;AAAA;AAAA,aAAA;AAAA,YAfpD;AAAA,WAiBP;AAAA,QAEJ,CAAC,CAAA,EACH,CAAA;AAAA,QACC,iCACCA,GAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,QAAA;AAAA,YACL,SAAA,EAAU,kMAAA;AAAA,YACV,SAAS,MAAM;AACb,cAAA,cAAA,EAAe;AACf,cAAA,OAAA,EAAQ;AAAA,YACV,CAAA;AAAA,YACA,IAAA,EAAK,UAAA;AAAA,YACN,QAAA,EAAA;AAAA;AAAA;AAED;AAAA;AAAA,GAEJ;AAEJ;AAEA,eAAA,CAAgB,WAAA,GAAc,iBAAA;AC5F9B,IAAI,WAAA,GAAwD,IAAA;AAC5D,SAAS,QAAA,GAAW;AAClB,EAAA,WAAA,KAAgB;AAAA;AAAA,IAA0B;AAAA,GAAS;AACnD,EAAA,OAAO,WAAA;AACT;AAkBA,eAAe,WAAA,CACb,MACA,MAAA,EACyB;AACzB,EAAA,IAAI,IAAA;AACJ,EAAA,IAAI,WAAW,MAAA,EAAQ;AACrB,IAAA,IAAA,GAAO,IAAA,CAAK,MAAM,IAAI,CAAA;AAAA,EACxB,CAAA,MAAO;AACL,IAAA,MAAM,IAAA,GAAO,MAAM,QAAA,EAAS;AAC5B,IAAA,IAAA,GAAO,IAAA,CAAK,KAAK,IAAI,CAAA;AAAA,EACvB;AACA,EAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,EAAG;AACxB,IAAA,MAAM,IAAI,MAAM,wCAAwC,CAAA;AAAA,EAC1D;AACA,EAAA,OAAO,IAAA,CAAK,GAAA,CAAI,CAAC,GAAA,EAAK,CAAA,KAAM;AAC1B,IAAA,MAAM,EAAA,GAAK,GAAA;AAMX,IAAA,MAAM,IAAI,EAAA,CAAG,IAAA;AACb,IAAA,IACE,CAAC,CAAA,IACD,OAAO,CAAA,CAAE,IAAA,KAAS,QAAA,IAClB,OAAO,CAAA,CAAE,OAAA,KAAY,QAAA,IACrB,OAAO,CAAA,CAAE,UAAU,QAAA,EACnB;AACA,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,CAAA,MAAA,EAAS,IAAI,CAAC,CAAA,0DAAA;AAAA,OAChB;AAAA,IACF;AACA,IAAA,IACE,CAAA,CAAE,QAAA,KAAa,MAAA,IACf,CAAA,CAAE,QAAA,KAAa,MAAA,IACf,CAAA,CAAE,QAAA,KAAa,SAAA,IACf,CAAA,CAAE,QAAA,KAAa,iBAAA,EACf;AACA,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,CAAA,MAAA,EAAS,IAAI,CAAC,CAAA,0DAAA;AAAA,OAChB;AAAA,IACF;AACA,IAAA,MAAM,IAAA,GAAuB;AAAA,MAC3B,MAAM,CAAA,CAAE,IAAA;AAAA,MACR,SAAS,CAAA,CAAE,OAAA;AAAA,MACX,OAAO,CAAA,CAAE,KAAA;AAAA,MACT,GAAI,OAAO,CAAA,CAAE,QAAA,KAAa,QAAA,GACtB,EAAE,QAAA,EAAU,CAAA,CAAE,QAAA,EAAuC,GACrD,EAAC;AAAA,MACL,GAAI,OAAO,CAAA,CAAE,SAAA,KAAc,QAAA,GAAW,EAAE,SAAA,EAAW,CAAA,CAAE,SAAA,EAAU,GAAI;AAAC,KACtE;AACA,IAAA,OAAO;AAAA,MACL,eACE,OAAO,EAAA,CAAG,aAAA,KAAkB,QAAA,GAAW,GAAG,aAAA,GAAgB,EAAA;AAAA,MAC5D,OAAA,EAAS,OAAA,CAAQ,EAAA,CAAG,OAAO,CAAA;AAAA,MAC3B,GAAI,EAAA,CAAG,QAAA,KAAa,MAAA,GAAY,EAAE,QAAA,EAAU,OAAA,CAAQ,EAAA,CAAG,QAAQ,CAAA,EAAE,GAAI,EAAC;AAAA,MACtE;AAAA,KACF;AAAA,EACF,CAAC,CAAA;AACH;AAEO,IAAM,cAA0C,CAAC;AAAA,EACtD,UAAA;AAAA,EACA,WAAA;AAAA,EACA,OAAA;AAAA,EACA,OAAA;AAAA,EACA;AACF,CAAA,KAAM;AACJ,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAUG,gBAAuB,QAAQ,CAAA;AACjE,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAUA,gBAAuB,MAAM,CAAA;AAC/D,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAUA,gBAAS,EAAE,CAAA;AACzC,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAUA,gBAAS,KAAK,CAAA;AAC9C,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAUA,gBAAwB,IAAI,CAAA;AAE5D,EAAA,MAAM,WAAW,MAAA,KAAW,UAAA;AAG5B,EAAMA,iBAAU,MAAM;AACpB,IAAA,IAAI,KAAA,EAAO;AACX,IAAA,IAAI,SAAA,GAAY,KAAA;AAChB,IAAA,MAAM,IAAA,GAAO,MAAA,KAAW,UAAA,GAAa,UAAA,GAAa,WAAA;AAClD,IAAA,CAAC,YAAY;AACX,MAAA,MAAM,aACJ,MAAA,KAAW,MAAA,GACP,IAAA,CAAK,SAAA,CAAU,MAAM,IAAA,EAAM,CAAC,CAAA,GAAA,CAC3B,MAAM,UAAS,EAAG,IAAA,CAAK,MAAM,EAAE,SAAA,EAAW,KAAK,CAAA;AACtD,MAAA,IAAI,CAAC,SAAA,EAAW;AACd,QAAA,OAAA,CAAQ,UAAU,CAAA;AAClB,QAAA,QAAA,CAAS,IAAI,CAAA;AAAA,MACf;AAAA,IACF,CAAA,GAAG;AACH,IAAA,OAAO,MAAM;AACX,MAAA,SAAA,GAAY,IAAA;AAAA,IACd,CAAA;AAAA,EACF,GAAG,CAAC,MAAA,EAAQ,QAAQ,UAAA,EAAY,WAAA,EAAa,KAAK,CAAC,CAAA;AAEnD,EAAA,MAAM,cAAc,YAAY;AAC9B,IAAA,IAAI;AACF,MAAA,MAAM,KAAA,GAAQ,MAAM,WAAA,CAAY,IAAA,EAAM,MAAM,CAAA;AAC5C,MAAA,OAAA,CAAQ,KAAK,CAAA;AACb,MAAA,QAAA,CAAS,KAAK,CAAA;AACd,MAAA,QAAA,CAAS,IAAI,CAAA;AAAA,IACf,SAAS,GAAA,EAAK;AACZ,MAAA,QAAA;AAAA,QACE,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU;AAAA,OACvC;AAAA,IACF;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,cAAc,MAAM;AACxB,IAAA,QAAA,CAAS,KAAK,CAAA;AACd,IAAA,QAAA,CAAS,IAAI,CAAA;AAAA,EACf,CAAA;AAEA,EAAA,MAAM,YAAA,GAAe,CAAC,KAAA,EAAqB,KAAA,qBACzCH,GAAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAK,QAAA;AAAA,MACL,SAAS,MAAM;AACb,QAAA,SAAA,CAAU,KAAK,CAAA;AACf,QAAA,QAAA,CAAS,KAAK,CAAA;AACd,QAAA,QAAA,CAAS,IAAI,CAAA;AAAA,MACf,CAAA;AAAA,MACA,gBAAc,MAAA,KAAW,KAAA;AAAA,MACzB,SAAA,EAAW,CAAA,wHAAA,EACT,MAAA,KAAW,KAAA,GACP,0CACA,4DACN,CAAA,CAAA;AAAA,MAEC,QAAA,EAAA;AAAA;AAAA,GACH;AAGF,EAAA,uBACED,IAAAA;AAAA,IAAC,OAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,CAAA,mEAAA,EAAsE,SAAA,IAAa,EAAE,CAAA,CAAA;AAAA,MAChG,YAAA,EAAW,mBAAA;AAAA,MAEX,QAAA,EAAA;AAAA,wBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,+EAAA,EACb,QAAA,EAAA;AAAA,0BAAAC,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,uCAAA,EAAwC,QAAA,EAAA,QAAA,EAAM,CAAA;AAAA,0BAC9DA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,yBAAA,EAA0B,eAAY,MAAA,EAAO,CAAA;AAAA,UAC5D,YAAA,CAAa,UAAU,QAAQ,CAAA;AAAA,UAC/B,YAAA,CAAa,YAAY,UAAU,CAAA;AAAA,0BACpCA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,yBAAA,EAA0B,eAAY,MAAA,EAAO,CAAA;AAAA,0BAC7DA,GAAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACC,IAAA,EAAK,QAAA;AAAA,cACL,SAAS,MAAM;AACb,gBAAA,SAAA,CAAU,MAAA,KAAW,MAAA,GAAS,MAAA,GAAS,MAAM,CAAA;AAC7C,gBAAA,QAAA,CAAS,KAAK,CAAA;AACd,gBAAA,QAAA,CAAS,IAAI,CAAA;AAAA,cACf,CAAA;AAAA,cACA,SAAA,EAAU,oLAAA;AAAA,cACV,KAAA,EAAM,oBAAA;AAAA,cAEL,iBAAO,WAAA;AAAY;AAAA,WACtB;AAAA,0BACAA,IAAC,MAAA,EAAA,EAAK,SAAA,EAAU,6CACb,QAAA,EAAA,QAAA,GAAW,WAAA,GAAc,KAAA,GAAQ,QAAA,GAAW,MAAA,EAC/C,CAAA;AAAA,0BACAA,GAAAA;AAAA,YAAC,MAAA;AAAA,YAAA;AAAA,cACC,OAAA,EAAQ,OAAA;AAAA,cACR,IAAA,EAAK,IAAA;AAAA,cACL,OAAA,EAAS,OAAA;AAAA,cACT,YAAA,EAAW,oBAAA;AAAA,cACZ,QAAA,EAAA;AAAA;AAAA;AAED,SAAA,EACF,CAAA;AAAA,wBAEAA,GAAAA;AAAA,UAAC,UAAA;AAAA,UAAA;AAAA,YACC,KAAA,EAAO,IAAA;AAAA,YACP,QAAA;AAAA,YACA,UAAA,EAAY,KAAA;AAAA,YACZ,QAAA,EAAU,CAAC,CAAA,KAAM;AACf,cAAA,OAAA,CAAQ,CAAA,CAAE,OAAO,KAAK,CAAA;AACtB,cAAA,QAAA,CAAS,IAAI,CAAA;AAAA,YACf,CAAA;AAAA,YACA,SAAA,EAAU,oHAAA;AAAA,YACV,cAAY,CAAA,eAAA,EAAkB,MAAM,CAAA,EAAA,EAAK,MAAA,CAAO,aAAa,CAAA,CAAA;AAAA;AAAA,SAC/D;AAAA,QAEC,yBACCA,GAAAA;AAAA,UAAC,GAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAU,wEAAA;AAAA,YACV,IAAA,EAAK,OAAA;AAAA,YAEJ,QAAA,EAAA;AAAA;AAAA,SACH;AAAA,QAGD,CAAC,QAAA,oBACAD,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,mEAAA,EACb,QAAA,EAAA;AAAA,0BAAAC,GAAAA,CAAC,UAAO,IAAA,EAAK,IAAA,EAAK,SAAS,WAAA,EAAa,QAAA,EAAU,CAAC,KAAA,EAAO,QAAA,EAAA,OAAA,EAE1D,CAAA;AAAA,0BACAA,GAAAA;AAAA,YAAC,MAAA;AAAA,YAAA;AAAA,cACC,OAAA,EAAQ,OAAA;AAAA,cACR,IAAA,EAAK,IAAA;AAAA,cACL,OAAA,EAAS,WAAA;AAAA,cACT,UAAU,CAAC,KAAA;AAAA,cACX,KAAA,EAAM,yDAAA;AAAA,cACP,QAAA,EAAA;AAAA;AAAA,WAED;AAAA,0BACAA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,qCAAoC,QAAA,EAAA,wEAAA,EAGpD;AAAA,SAAA,EACF;AAAA;AAAA;AAAA,GAEJ;AAEJ,CAAA;AC3KA,IAAM,mBAAA,GAAsB,GAAA;AAAA;AAAA;AAAA,EAG1B,yGAAA;AAAA,EACA;AAAA,IACE,QAAA,EAAU;AAAA,MACR,WAAA,EAAa;AAAA,QACX,UAAA,EAAY,EAAA;AAAA,QACZ,QAAA,EAAU;AAAA;AACZ,KACF;AAAA,IACA,eAAA,EAAiB;AAAA,MACf,WAAA,EAAa;AAAA;AACf;AAEJ,CAAA;AAOA,SAASI,gBAAe,EAAA,EAAoB;AAC1C,EAAA,MAAM,YAAA,GAAe,IAAA,CAAK,KAAA,CAAM,EAAA,GAAK,GAAI,CAAA;AACzC,EAAA,IAAI,eAAe,EAAA,EAAI;AACrB,IAAA,OAAO,GAAG,YAAY,CAAA,CAAA,CAAA;AAAA,EACxB;AACA,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,YAAA,GAAe,IAAI,CAAA;AAC5C,EAAA,MAAM,OAAA,GAAU,IAAA,CAAK,KAAA,CAAO,YAAA,GAAe,OAAQ,EAAE,CAAA;AACrD,EAAA,MAAM,UAAU,YAAA,GAAe,EAAA;AAC/B,EAAA,IAAI,QAAQ,CAAA,EAAG;AACb,IAAA,OAAO,GAAG,KAAK,CAAA,CAAA,EAAI,MAAA,CAAO,OAAO,EAAE,QAAA,CAAS,CAAA,EAAG,GAAG,CAAC,IAAI,MAAA,CAAO,OAAO,EAAE,QAAA,CAAS,CAAA,EAAG,GAAG,CAAC,CAAA,CAAA;AAAA,EACzF;AACA,EAAA,OAAO,CAAA,EAAG,OAAO,CAAA,CAAA,EAAI,MAAA,CAAO,OAAO,CAAA,CAAE,QAAA,CAAS,CAAA,EAAG,GAAG,CAAC,CAAA,CAAA;AACvD;AAoBA,SAAS,cAAc,CAAA,EAA4B;AACjD,EAAA,MAAM,KAAA,GAAQ;AAAA,IACZ;AAAA,GACF;AAEA,EAAA,IAAI,EAAE,SAAA,EAAW;AACf,IAAA,KAAA,CAAM,KAAK,0CAA0C,CAAA;AAAA,EACvD;AACA,EAAA,IAAI,EAAE,gBAAA,EAAkB;AACtB,IAAA,KAAA,CAAM,KAAK,oBAAoB,CAAA;AAAA,EACjC;AAEA,EAAA,IAAI,EAAE,QAAA,EAAU;AACd,IAAA,KAAA,CAAM,KAAK,iDAAiD,CAAA;AAAA,EAC9D,CAAA,MAAA,IAAW,EAAE,QAAA,EAAU;AACrB,IAAA,KAAA,CAAM,KAAK,uCAAuC,CAAA;AAAA,EACpD,CAAA,MAAA,IAAW,CAAA,CAAE,UAAA,IAAc,CAAA,CAAE,SAAA,EAAW;AACtC,IAAA,KAAA,CAAM,KAAK,mBAAmB,CAAA;AAAA,EAChC,CAAA,MAAA,IAAW,EAAE,SAAA,EAAW;AACtB,IAAA,KAAA,CAAM,IAAA;AAAA,MACJ;AAAA,KACF;AAAA,EACF,CAAA,MAAA,IAAW,EAAE,UAAA,EAAY;AACvB,IAAA,KAAA,CAAM,KAAK,gDAAgD,CAAA;AAAA,EAC7D,CAAA,MAAA,IAAW,EAAE,gBAAA,EAAkB;AAC7B,IAAA,KAAA,CAAM,KAAK,0CAA0C,CAAA;AAAA,EACvD,CAAA,MAAA,IAAW,EAAE,SAAA,EAAW;AACtB,IAAA,KAAA,CAAM,IAAA;AAAA,MACJ;AAAA,KACF;AAAA,EACF,CAAA,MAAO;AACL,IAAA,KAAA,CAAM,KAAK,yBAAyB,CAAA;AAAA,EACtC;AAGA,EAAA,IACE,CAAA,CAAE,cACD,CAAA,CAAE,QAAA,IAAa,EAAE,UAAA,IAAc,CAAA,CAAE,SAAA,IAAc,CAAA,CAAE,QAAA,CAAA,EAClD;AACA,IAAA,KAAA,CAAM,KAAK,yBAAyB,CAAA;AAAA,EACtC;AAGA,EAAA,IAAI,EAAE,QAAA,IAAY,CAAA,CAAE,SAAA,IAAa,CAAC,EAAE,QAAA,EAAU;AAC5C,IAAA,IAAI,EAAE,SAAA,EAAW;AACf,MAAA,KAAA,CAAM,KAAK,wDAAwD,CAAA;AAAA,IACrE,CAAA,MAAA,IAAW,EAAE,QAAA,EAAU;AACrB,MAAA,KAAA,CAAM,KAAK,uDAAuD,CAAA;AAAA,IACpE,CAAA,MAAO;AACL,MAAA,KAAA,CAAM,KAAK,wDAAwD,CAAA;AAAA,IACrE;AAAA,EACF;AAEA,EAAA,IAAI,EAAE,cAAA,EAAgB;AACpB,IAAA,KAAA,CAAM,KAAK,+CAA+C,CAAA;AAAA,EAC5D;AAEA,EAAA,OAAO,KAAA,CAAM,KAAK,GAAG,CAAA;AACvB;AAGA,IAAM,KAAA,GAAgD,CAAC,EAAE,IAAA,uBACvDJ,GAAAA;AAAA,EAAC,MAAA;AAAA,EAAA;AAAA,IACC,aAAA,EAAY,MAAA;AAAA,IACZ,SAAA,EAAW,CAAA,2EAAA,EACT,IAAA,KAAS,QAAA,GAAW,aAAa,WACnC,CAAA;AAAA;AACF,CAAA;AAoBK,IAAM,WAAA,GAAoB,MAAA,CAAA,UAAA;AAAA,EAC/B,CACE;AAAA,IACE,GAAA;AAAA,IACA,IAAA;AAAA,IACA,UAAA;AAAA,IACA,kBAAA;AAAA,IACA,gBAAA;AAAA,IACA,mBAAA;AAAA,IACA,gBAAA;AAAA,IACA,uBAAA;AAAA,IACA,mBAAA;AAAA,IACA,SAAA,EAAW,iBAAA;AAAA,IACX,SAAA;AAAA,IACA;AAAA,KAEF,GAAA,KACG;AAEH,IAAA,MAAM,QAAQ,kBAAA,CAAmB;AAAA,MAC/B,UAAA;AAAA,MACA,kBAAA;AAAA,MACA,gBAAA;AAAA,MACA,QAAA,EAAU;AAAA,KACX,CAAA;AACD,IAAA,MAAM;AAAA,MACJ,WAAA;AAAA,MACA,SAAA;AAAA,MACA,SAAA;AAAA,MACA,QAAA;AAAA,MACA,IAAA;AAAA,MACA,iBAAA;AAAA,MACA,WAAA;AAAA,MACA,GAAA;AAAA,MACA,IAAA;AAAA,MACA,KAAA;AAAA,MACA,WAAA;AAAA,MACA,YAAA;AAAA,MACA,UAAA;AAAA,MACA,kBAAA;AAAA,MACA,aAAA;AAAA,MACA,oBAAA;AAAA,MACA,iBAAA;AAAA,MACA,YAAA;AAAA,MACA,YAAA;AAAA,MACA,eAAA;AAAA,MACA,iBAAA;AAAA,MACA,iBAAA;AAAA,MACA,eAAA;AAAA,MACA,qBAAA;AAAA,MACA,gBAAA;AAAA,MACA,KAAA;AAAA,MACA;AAAA,KACF,GAAI,KAAA;AAGJ,IAAA,MAAM,CAAC,eAAA,EAAiB,kBAAkB,CAAA,GAAU,MAAA,CAAA,QAAA;AAAA,MAClD;AAAA,KACF;AACA,IAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAU,gBAAiB,CAAC,CAAA;AAE9D,IAAA,MAAM,CAAC,cAAA,EAAgB,iBAAiB,CAAA,GAAU,gBAEhD,QAAQ,CAAA;AACV,IAAA,MAAM,CAAC,eAAA,EAAiB,kBAAkB,CAAA,GAAU,MAAA,CAAA,QAAA;AAAA,MAClD;AAAA,KACF;AACA,IAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAU,MAAA,CAAA,QAAA;AAAA,MACtC;AAAA,KACF;AACA,IAAA,MAAM,CAAC,iBAAA,EAAmB,oBAAoB,CAAA,GAAU,gBAEtD,IAAI,CAAA;AACN,IAAA,MAAM,CAAC,iBAAA,EAAmB,oBAAoB,CAAA,GAAU,gBAAS,KAAK,CAAA;AACtE,IAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAU,gBAAS,KAAK,CAAA;AACtD,IAAA,MAAM,CAAC,eAAA,EAAiB,kBAAkB,CAAA,GAAU,gBAAS,KAAK,CAAA;AAClE,IAAA,MAAM,CAAC,gBAAA,EAAkB,mBAAmB,CAAA,GAAU,gBAAS,KAAK,CAAA;AACpE,IAAA,MAAM,CAAC,eAAA,EAAiB,kBAAkB,CAAA,GAAU,gBAAS,KAAK,CAAA;AAClE,IAAA,MAAM,CAAC,eAAA,EAAiB,kBAAkB,CAAA,GAAU,MAAA,CAAA,QAAA;AAAA,MAClD;AAAA,KACF;AACA,IAAA,MAAM,CAAC,kBAAA,EAAoB,qBAAqB,CAAA,GAAU,gBAExD,IAAI,CAAA;AACN,IAAA,MAAM,CAAC,iBAAA,EAAmB,oBAAoB,CAAA,GAAU,gBAG9C,IAAI,CAAA;AAGd,IAAA,MAAM,SAAA,GAAkB,cAAuB,IAAI,CAAA;AAMnD,IAAM,MAAA,CAAA,mBAAA;AAAA,MACJ,iBAAA;AAAA,MACA,OAAuB;AAAA,QACrB,UAAU,CAAC,MAAA,KAAW,SAAA,CAAU,OAAA,EAAS,SAAS,MAAM,CAAA;AAAA,QACxD,IAAA,EAAM,MAAM,SAAA,CAAU,OAAA,EAAS,IAAA,EAAK;AAAA,QACpC,KAAA,EAAO,MAAM,SAAA,CAAU,OAAA,EAAS,KAAA,EAAM;AAAA,QACtC,gBAAA,EAAkB,MAAM,SAAA,CAAU,OAAA,EAAS,kBAAiB,IAAK,CAAA;AAAA,QACjE,aAAA,EAAe,MAAM,SAAA,CAAU,OAAA,EAAS,eAAc,IAAK,CAAA;AAAA,QAC3D,QAAA,EAAU,MAAM,SAAA,CAAU,OAAA,EAAS,UAAS,IAAK,IAAA;AAAA,QACjD,iBAAiB,CAAC,IAAA,KAAS,SAAA,CAAU,OAAA,EAAS,gBAAgB,IAAI,CAAA;AAAA,QAClE,IAAI,YAAA,GAAe;AACjB,UAAA,OAAO,SAAA,CAAU,SAAS,YAAA,IAAgB,IAAA;AAAA,QAC5C;AAAA,OACF,CAAA;AAAA,MACA;AAAC,KACH;AACA,IAAA,MAAM,UAAA,GAAmB,cAAuB,IAAI,CAAA;AACpD,IAAA,MAAM,aAAA,GAAsB,cAAsB,IAAI,CAAA;AACtD,IAAA,MAAM,UAAA,GAAmB,cAAgB,KAAK,CAAA;AAC9C,IAAA,MAAM,cAAA,GAAuB,MAAA,CAAA,MAAA;AAAA,MAC3B;AAAA,KACF;AACA,IAAA,MAAM,kBAAA,GAA2B,cAAgB,KAAK,CAAA;AACtD,IAAA,MAAM,mBAAA,GAA4B,cAAsB,IAAI,CAAA;AAC5D,IAAA,MAAM,iBAAA,GAA0B,cAAsB,IAAI,CAAA;AAE1D,IAAA,MAAM,gBAAA,GAAyB,MAAA,CAAA,MAAA,CAA0B,EAAE,CAAA;AAC3D,IAAA,MAAM,mBAAA,GAA4B,cAAe,CAAC,CAAA;AAMlD,IAAM,iBAAU,MAAM;AACpB,MAAA,gBAAA,GAAmB,QAAQ,CAAA;AAAA,IAC7B,CAAA,EAAG,CAAC,QAAA,EAAU,gBAAgB,CAAC,CAAA;AAE/B,IAAM,iBAAU,MAAM;AACpB,MAAA,mBAAA,GAAsB,WAAW,CAAA;AAAA,IACnC,CAAA,EAAG,CAAC,WAAA,EAAa,mBAAmB,CAAC,CAAA;AAGrC,IAAM,iBAAU,MAAM;AACpB,MAAA,IAAI,uBAAA,EAAyB;AAC3B,QAAA,MAAM,IAAA,GAAO,YAAY,WAAW,CAAA;AACpC,QAAA,IAAI,IAAA,IAAQ,CAAC,IAAA,CAAK,OAAA,EAAS;AACzB,UAAA,uBAAA,CAAwB,IAAA,CAAK,KAAK,OAAO,CAAA;AAAA,QAC3C,CAAA,MAAO;AACL,UAAA,uBAAA,CAAwB,IAAI,CAAA;AAAA,QAC9B;AAAA,MACF;AAAA,IACF,CAAA,EAAG,CAAC,WAAA,EAAa,WAAA,EAAa,uBAAuB,CAAC,CAAA;AAOtD,IAAA,MAAM,iBAAA,GAA0B,cAAO,UAAU,CAAA;AACjD,IAAM,iBAAU,MAAM;AACpB,MAAA,IAAI,iBAAA,CAAkB,YAAY,UAAA,EAAY;AAC9C,MAAA,iBAAA,CAAkB,OAAA,GAAU,UAAA;AAC5B,MAAA,cAAA,CAAe,CAAC,CAAA;AAChB,MAAA,iBAAA,CAAkB,QAAQ,CAAA;AAC1B,MAAA,YAAA,CAAa,IAAI,CAAA;AACjB,MAAA,kBAAA,CAAmB,IAAI,CAAA;AACvB,MAAA,oBAAA,CAAqB,IAAI,CAAA;AACzB,MAAA,kBAAA,CAAmB,IAAI,CAAA;AACvB,MAAA,oBAAA,CAAqB,KAAK,CAAA;AAC1B,MAAA,gBAAA,CAAiB,UAAU,EAAC;AAC5B,MAAA,mBAAA,CAAoB,OAAA,GAAU,CAAA;AAAA,IAChC,CAAA,EAAG,CAAC,UAAU,CAAC,CAAA;AAGf,IAAM,iBAAU,MAAM;AACpB,MAAA,IAAI,aAAA,CAAc,YAAY,IAAA,EAAM;AAClC,QAAA;AAAA,MACF;AACA,MAAA,IAAI,eAAA,KAAoB,IAAA,IAAQ,eAAA,IAAmB,CAAA,EAAG;AACpD,QAAA,cAAA,CAAe,eAAe,CAAA;AAC9B,QAAA,iBAAA,CAAkB,QAAQ,CAAA;AAC1B,QAAA,YAAA,CAAa,IAAI,CAAA;AACjB,QAAA,kBAAA,CAAmB,IAAI,CAAA;AAAA,MACzB;AAAA,IACF,CAAA,EAAG,CAAC,eAAe,CAAC,CAAA;AAGpB,IAAM,iBAAU,MAAM;AACpB,MAAA,IAAI,oBAAoB,IAAA,EAAM;AAC9B,MAAA,MAAM,EAAA,GAAK,WAAW,OAAA,EAAS,aAAA;AAAA,QAC7B,qBAAqB,eAAe,CAAA,EAAA;AAAA,OACtC;AACA,MAAA,EAAA,EAAI,eAAe,EAAE,KAAA,EAAO,SAAA,EAAW,QAAA,EAAU,UAAU,CAAA;AAAA,IAC7D,CAAA,EAAG,CAAC,eAAe,CAAC,CAAA;AAGpB,IAAM,iBAAU,MAAM;AACpB,MAAA,UAAA,CAAW,SAAS,KAAA,EAAM;AAAA,IAC5B,CAAA,EAAG,CAAC,UAAU,CAAC,CAAA;AAGf,IAAM,iBAAU,MAAM;AACpB,MAAA,MAAM,SAAS,SAAA,CAAU,OAAA;AACzB,MAAA,IAAI,CAAC,MAAA,EAAQ;AACb,MAAA,MAAM,MAAA,GAAS,OAAO,gBAAA,EAAiB;AACvC,MAAA,MAAM,mBAAmB,WAAA,CAAY,SAAA;AAAA,QACnC,CAAC,EAAA,KACC,CAAC,EAAA,CAAG,OAAA,IAAW,MAAA,IAAU,EAAA,CAAG,IAAA,CAAK,OAAA,IAAW,MAAA,GAAS,EAAA,CAAG,IAAA,CAAK;AAAA,OACjE;AACA,MAAA,MAAM,WAAA,GACJ,gBAAA,IAAoB,CAAA,GAChB,eAAA,CAAgB,gBAAgB,CAAA,GAChC,YAAA;AACN,MAAA,MAAA,CAAO,gBAAgB,WAAW,CAAA;AAAA,IACpC,GAAG,CAAC,YAAA,EAAc,YAAA,EAAc,WAAA,EAAa,eAAe,CAAC,CAAA;AAM7D,IAAA,MAAM,gBAAA,GAAmB,CAAC,MAAA,KAAmB;AAC3C,MAAA,MAAM,SAAS,SAAA,CAAU,OAAA;AACzB,MAAA,IAAI,CAAC,MAAA,EAAQ;AAIb,MAAA,IAAI,iBAAA,IAAqB,gBAAA,CAAiB,OAAA,CAAQ,MAAA,GAAS,CAAA,EAAG;AAC5D,QAAA,MAAM,UAAA,GACJ,gBAAA,CAAiB,OAAA,CAAQ,mBAAA,CAAoB,OAAO,CAAA;AACtD,QAAA,IAAI,UAAA,IAAc,MAAA,IAAU,UAAA,CAAW,KAAA,EAAO;AAC5C,UAAA,MAAM,SAAA,GAAY,oBAAoB,OAAA,GAAU,CAAA;AAChD,UAAA,IAAI,SAAA,GAAY,gBAAA,CAAiB,OAAA,CAAQ,MAAA,EAAQ;AAC/C,YAAA,mBAAA,CAAoB,OAAA,GAAU,SAAA;AAC9B,YAAA,MAAA,CAAO,QAAA,CAAS,gBAAA,CAAiB,OAAA,CAAQ,SAAS,EAAE,OAAO,CAAA;AAAA,UAC7D,CAAA,MAAO;AAEL,YAAA,MAAA,CAAO,KAAA,EAAM;AACb,YAAA,oBAAA,CAAqB,KAAK,CAAA;AAC1B,YAAA,gBAAA,CAAiB,UAAU,EAAC;AAC5B,YAAA,mBAAA,CAAoB,OAAA,GAAU,CAAA;AAAA,UAChC;AAAA,QACF;AAAA,MACF,CAAA,MAAA,IAAW,QAAA,IAAY,CAAC,MAAA,CAAO,UAAS,EAAG;AAEzC,QAAA,MAAM,gBAAgB,WAAA,CAAY,IAAA;AAAA,UAChC,CAAC,EAAA,KACC,EAAA,CAAG,OAAA,IAAW,MAAA,IAAU,GAAG,IAAA,CAAK,OAAA,IAAW,MAAA,GAAS,EAAA,CAAG,IAAA,CAAK;AAAA,SAChE;AACA,QAAA,IAAI,aAAA,EAAe;AACjB,UAAA,MAAM,iBAAiB,WAAA,CAAY,IAAA;AAAA,YACjC,CAAC,EAAA,KAAO,CAAC,GAAG,OAAA,IAAW,EAAA,CAAG,KAAK,OAAA,IAAW;AAAA,WAC5C;AACA,UAAA,IAAI,cAAA,EAAgB;AAClB,YAAA,MAAA,CAAO,QAAA,CAAS,cAAA,CAAe,IAAA,CAAK,OAAO,CAAA;AAAA,UAC7C;AAAA,QACF;AAAA,MACF;AAGA,MAAA,IACE,iBAAA,CAAkB,OAAA,KAAY,IAAA,IAC9B,MAAA,IAAU,kBAAkB,OAAA,EAC5B;AACA,QAAA,MAAA,CAAO,KAAA,EAAM;AACb,QAAA,IAAI,mBAAA,CAAoB,YAAY,IAAA,EAAM;AACxC,UAAA,MAAA,CAAO,QAAA,CAAS,oBAAoB,OAAO,CAAA;AAC3C,UAAA,mBAAA,CAAoB,OAAA,GAAU,IAAA;AAAA,QAChC;AACA,QAAA,iBAAA,CAAkB,OAAA,GAAU,IAAA;AAAA,MAC9B;AAKA,MAAA,IAAI,WAAA,GAAc,EAAA;AAClB,MAAA,IAAI,iBAAA,IAAqB,gBAAA,CAAiB,OAAA,CAAQ,MAAA,GAAS,CAAA,EAAG;AAC5D,QAAA,MAAM,UAAA,GACJ,gBAAA,CAAiB,OAAA,CAAQ,mBAAA,CAAoB,OAAO,CAAA;AACtD,QAAA,IAAI,UAAA,EAAY;AACd,UAAA,KAAA,MAAW,GAAA,IAAO,WAAW,aAAA,EAAe;AAC1C,YAAA,MAAM,EAAA,GAAK,YAAY,GAAG,CAAA;AAC1B,YAAA,IACE,EAAA,IACA,CAAC,EAAA,CAAG,OAAA,IACJ,MAAA,IAAU,EAAA,CAAG,IAAA,CAAK,OAAA,IAClB,MAAA,GAAS,EAAA,CAAG,IAAA,CAAK,KAAA,EACjB;AACA,cAAA,WAAA,GAAc,GAAA;AACd,cAAA;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,MACF;AACA,MAAA,IAAI,gBAAgB,EAAA,EAAI;AACtB,QAAA,WAAA,GAAc,WAAA,CAAY,SAAA;AAAA,UACxB,CAAC,EAAA,KACC,CAAC,EAAA,CAAG,OAAA,IAAW,MAAA,IAAU,EAAA,CAAG,IAAA,CAAK,OAAA,IAAW,MAAA,GAAS,EAAA,CAAG,IAAA,CAAK;AAAA,SACjE;AAAA,MACF;AAGA,MAAA,IAAI,WAAA,KAAgB,eAAA,IAAmB,WAAA,IAAe,CAAA,EAAG;AACvD,QAAA,MAAA,CAAO,eAAA,CAAgB,eAAA,CAAgB,WAAW,CAAC,CAAA;AAAA,MACrD;AACA,MAAA,kBAAA,CAAmB,WAAA,IAAe,CAAA,GAAI,WAAA,GAAc,IAAI,CAAA;AAGxD,MAAA,aAAA,CAAc,OAAA,GAAU,IAAA;AAAA,IAC1B,CAAA;AAEA,IAAA,MAAM,uBAAuB,MAAM;AACjC,MAAA,oBAAA,CAAqB,KAAK,CAAA;AAC1B,MAAA,gBAAA,CAAiB,UAAU,EAAC;AAC5B,MAAA,mBAAA,CAAoB,OAAA,GAAU,CAAA;AAAA,IAChC,CAAA;AAOA,IAAA,MAAM,gBAAA,GAAyB,mBAAY,MAAgB;AACzD,MAAA,IAAI,SAAA,EAAW;AACb,QAAA,MAAM,UAAoB,EAAC;AAC3B,QAAA,KAAA,IAAS,CAAA,GAAI,UAAU,KAAA,EAAO,CAAA,IAAK,UAAU,GAAA,EAAK,CAAA,EAAA,EAAK,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAA;AACrE,QAAA,OAAO,OAAA;AAAA,MACT;AACA,MAAA,OAAO,CAAC,WAAW,CAAA;AAAA,IACrB,CAAA,EAAG,CAAC,SAAA,EAAW,WAAW,CAAC,CAAA;AAE3B,IAAA,MAAM,SAAA,GAAkB,mBAAY,MAAM;AACxC,MAAA,GAAA,CAAI,kBAAkB,CAAA;AAAA,IACxB,CAAA,EAAG,CAAC,GAAA,EAAK,gBAAgB,CAAC,CAAA;AAE1B,IAAA,MAAM,WAAA,GAAoB,mBAAY,MAAM;AAC1C,MAAA,IAAI,CAAC,SAAA,EAAW;AAChB,MAAA,MAAM,WAAA,GAAc,UAAU,KAAA,CAAM,MAAA;AACpC,MAAA,MAAM,WAAA,GAAc,KAAA,CAAM,WAAA,EAAa,cAAA,KAAmB,OAAO,CAAA;AACjE,MAAA,IAAI,gBAAgB,IAAA,EAAM;AACxB,QAAA,cAAA,CAAe,WAAA,GAAc,cAAc,CAAC,CAAA;AAC5C,QAAA,iBAAA,CAAkB,OAAO,CAAA;AACzB,QAAA,YAAA,CAAa,IAAI,CAAA;AACjB,QAAA,kBAAA,CAAmB,IAAI,CAAA;AAAA,MACzB;AAAA,IACF,GAAG,CAAC,SAAA,EAAW,KAAA,EAAO,WAAA,EAAa,cAAc,CAAC,CAAA;AAGlD,IAAA,MAAM,kBAAA,GAA2B,mBAAY,MAAM;AACjD,MAAA,IAAI,SAAA,EAAW;AACb,QAAA,MAAM,WAAA,GAAc,mBAAmB,SAAA,CAAU,KAAA;AACjD,QAAA,MAAM,OAAA,GAAoB,CAAC,WAAW,CAAA;AACtC,QAAA,KAAA,IAAS,IAAI,SAAA,CAAU,KAAA,EAAO,CAAA,IAAK,SAAA,CAAU,KAAK,CAAA,EAAA,EAAK;AACrD,UAAA,IAAI,CAAA,KAAM,WAAA,EAAa,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAA;AAAA,QACvC;AACA,QAAA,WAAA,CAAY,OAAO,CAAA;AAAA,MACrB,CAAA,MAAO;AACL,QAAA,iBAAA,CAAkB,WAAW,CAAA;AAAA,MAC/B;AAAA,IACF,CAAA,EAAG;AAAA,MACD,SAAA;AAAA,MACA,eAAA;AAAA,MACA,WAAA;AAAA,MACA,WAAA;AAAA,MACA;AAAA,KACD,CAAA;AAGD,IAAA,MAAM,UAAA,GAAmB,MAAA,CAAA,WAAA;AAAA,MACvB,CAAC,CAAA,KAA4B;AAC3B,QAAA,MAAM,UAAU,gBAAA,EAAiB;AACjC,QAAA,MAAM,gBAAgB,OAAA,CACnB,GAAA,CAAI,CAAC,CAAA,KAAM,YAAY,CAAC,CAAC,CAAA,CACzB,MAAA,CAAO,CAAC,EAAA,KAA2B,EAAA,KAAO,MAAA,IAAa,CAAC,GAAG,OAAO,CAAA;AACrE,QAAA,IAAI,aAAA,CAAc,WAAW,CAAA,EAAG;AAChC,QAAA,MAAM,YAAA,GAAe,cAClB,MAAA,CAAO,CAAC,OAAO,CAAC,aAAA,CAAc,GAAG,IAAA,CAAK,QAAQ,CAAC,CAAA,CAC/C,GAAA,CAAI,CAAC,EAAA,KAAO,EAAA,CAAG,KAAK,IAAI,CAAA,CACxB,KAAK,GAAG,CAAA;AACX,QAAA,CAAA,CAAE,cAAA,EAAe;AACjB,QAAA,CAAA,CAAE,aAAA,CAAc,OAAA,CAAQ,YAAA,EAAc,YAAY,CAAA;AAClD,QAAA,IAAA,CAAK,OAAO,CAAA;AAAA,MACd,CAAA;AAAA,MACA,CAAC,gBAAA,EAAkB,WAAA,EAAa,IAAI;AAAA,KACtC;AAMA,IAAA,MAAM,cAAA,GAAuB,MAAA,CAAA,WAAA,CAAY,CAAC,KAAA,KAAkB;AAC1D,MAAA,kBAAA,CAAmB,KAAK,CAAA;AAAA,IAC1B,CAAA,EAAG,EAAE,CAAA;AAEL,IAAA,MAAM,eAAA,GAAwB,mBAAY,MAAM;AAC9C,MAAA,kBAAA,CAAmB,IAAI,CAAA;AAEvB,MAAA,UAAA,CAAW,MAAM,UAAA,CAAW,OAAA,EAAS,KAAA,IAAS,CAAC,CAAA;AAAA,IACjD,CAAA,EAAG,EAAE,CAAA;AAEL,IAAA,MAAM,gBAAA,GAAyB,MAAA,CAAA,WAAA;AAAA,MAC7B,CAAC,OAAA,KAAoB;AACnB,QAAA,IAAI,oBAAoB,IAAA,EAAM;AAC9B,QAAA,WAAA,CAAY,iBAAiB,OAAO,CAAA;AAAA,MACtC,CAAA;AAAA,MACA,CAAC,iBAAiB,WAAW;AAAA,KAC/B;AAEA,IAAA,MAAM,wBAAA,GAAiC,MAAA,CAAA,WAAA;AAAA,MACrC,CAAC,SAAA,KAAwB;AACvB,QAAA,IAAI,oBAAoB,IAAA,EAAM;AAC9B,QAAA,YAAA,CAAa,iBAAiB,SAAS,CAAA;AAAA,MACzC,CAAA;AAAA,MACA,CAAC,iBAAiB,YAAY;AAAA,KAChC;AAEA,IAAA,MAAM,kBAAA,GAA2B,mBAAY,MAAM;AACjD,MAAA,IAAI,oBAAoB,IAAA,EAAM;AAC5B,QAAA,UAAA,CAAW,eAAe,CAAA;AAC1B,QAAA,eAAA,EAAgB;AAAA,MAClB;AAAA,IACF,CAAA,EAAG,CAAC,eAAA,EAAiB,UAAA,EAAY,eAAe,CAAC,CAAA;AAMjD,IAAA,MAAM,eAAA,GAAkB,CACtB,IAAA,EACA,KAAA,EACA,CAAA,KACG;AACH,MAAA,cAAA,CAAe,KAAK,CAAA;AACpB,MAAA,iBAAA,CAAkB,QAAQ,CAAA;AAC1B,MAAA,aAAA,CAAc,OAAA,GAAU,KAAA;AAExB,MAAA,IAAI,CAAA,CAAE,QAAA,IAAY,eAAA,KAAoB,IAAA,EAAM;AAE1C,QAAA,YAAA,CAAa;AAAA,UACX,KAAA,EAAO,IAAA,CAAK,GAAA,CAAI,eAAA,EAAiB,KAAK,CAAA;AAAA,UACtC,GAAA,EAAK,IAAA,CAAK,GAAA,CAAI,eAAA,EAAiB,KAAK;AAAA,SACrC,CAAA;AAAA,MACH,WACE,iBAAA,KAAsB,IAAA,IACtB,sBAAsB,KAAA,IACtB,CAAC,WAAW,OAAA,EACZ;AAEA,QAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,iBAAA,EAAmB,KAAK,CAAA;AAC/C,QAAA,MAAM,GAAA,GAAM,IAAA,CAAK,GAAA,CAAI,iBAAA,EAAmB,KAAK,CAAA;AAC7C,QAAA,YAAA,CAAa,EAAE,KAAA,EAAO,GAAA,EAAK,CAAA;AAC3B,QAAA,kBAAA,CAAmB,iBAAiB,CAAA;AACpC,QAAA,oBAAA,CAAqB,IAAI,CAAA;AAAA,MAC3B,CAAA,MAAA,IAAW,sBAAsB,KAAA,EAAO,CAExC,MAAA,IAAW,CAAC,UAAA,CAAW,OAAA,EAAS;AAE9B,QAAA,kBAAA,CAAmB,KAAK,CAAA;AACxB,QAAA,YAAA,CAAa,IAAI,CAAA;AAEjB,QAAA,MAAM,SAAS,SAAA,CAAU,OAAA;AACzB,QAAA,IAAI,MAAA,EAAQ;AACV,UAAA,MAAA,CAAO,KAAA,EAAM;AACb,UAAA,MAAA,CAAO,QAAA,CAAS,KAAK,OAAO,CAAA;AAC5B,UAAA,mBAAA,CAAoB,UAAU,IAAA,CAAK,OAAA;AACnC,UAAA,iBAAA,CAAkB,UAAU,IAAA,CAAK,KAAA;AACjC,UAAA,MAAA,CAAO,IAAA,EAAK;AAAA,QACd;AAAA,MACF;AAAA,IACF,CAAA;AAEA,IAAA,MAAM,qBAAA,GAAwB,CAAC,KAAA,EAAe,CAAA,KAAwB;AACpE,MAAA,CAAA,CAAE,cAAA,EAAe;AAEjB,MAAA,IAAI,mBAAmB,OAAA,EAAS;AAEhC,MAAA,IAAI,sBAAsB,KAAA,EAAO;AAC/B,QAAA,oBAAA,CAAqB,IAAI,CAAA;AAAA,MAC3B,CAAA,MAAO;AACL,QAAA,oBAAA,CAAqB,KAAK,CAAA;AAC1B,QAAA,YAAA,CAAa,IAAI,CAAA;AAAA,MACnB;AAAA,IACF,CAAA;AAEA,IAAA,MAAM,mBAAA,GAAsB,CAAC,KAAA,EAAe,CAAA,KAAwB;AAClE,MAAA,IAAI,CAAA,CAAE,WAAW,CAAA,EAAG;AAGpB,MAAA,kBAAA,CAAmB,OAAA,GAAU,KAAA;AAC7B,MAAA,cAAA,CAAe,OAAA,GAAU,WAAW,MAAM;AACxC,QAAA,kBAAA,CAAmB,OAAA,GAAU,IAAA;AAC7B,QAAA,cAAA,CAAe,KAAK,CAAA;AAAA,MACtB,GAAG,GAAG,CAAA;AAEN,MAAA,UAAA,CAAW,OAAA,GAAU,IAAA;AACrB,MAAA,kBAAA,CAAmB,KAAK,CAAA;AACxB,MAAA,cAAA,CAAe,KAAK,CAAA;AACpB,MAAA,iBAAA,CAAkB,QAAQ,CAAA;AAC1B,MAAA,YAAA,CAAa,IAAI,CAAA;AAAA,IACnB,CAAA;AAEA,IAAA,MAAM,oBAAA,GAAuB,CAAC,KAAA,KAAkB;AAE9C,MAAA,IAAI,eAAe,OAAA,EAAS;AAC1B,QAAA,YAAA,CAAa,eAAe,OAAO,CAAA;AACnC,QAAA,cAAA,CAAe,OAAA,GAAU,IAAA;AAAA,MAC3B;AAEA,MAAA,IAAI,CAAC,UAAA,CAAW,OAAA,IAAW,eAAA,KAAoB,IAAA,EAAM;AAErD,MAAA,YAAA,CAAa;AAAA,QACX,KAAA,EAAO,IAAA,CAAK,GAAA,CAAI,eAAA,EAAiB,KAAK,CAAA;AAAA,QACtC,GAAA,EAAK,IAAA,CAAK,GAAA,CAAI,eAAA,EAAiB,KAAK;AAAA,OACrC,CAAA;AACD,MAAA,cAAA,CAAe,KAAK,CAAA;AAAA,IACtB,CAAA;AAEA,IAAA,MAAM,gBAAgB,MAAM;AAC1B,MAAA,IAAI,eAAe,OAAA,EAAS;AAC1B,QAAA,YAAA,CAAa,eAAe,OAAO,CAAA;AACnC,QAAA,cAAA,CAAe,OAAA,GAAU,IAAA;AAAA,MAC3B;AACA,MAAA,IAAI,WAAW,OAAA,EAAS;AACtB,QAAA,UAAA,CAAW,OAAA,GAAU,KAAA;AAAA,MACvB;AAAA,IACF,CAAA;AAEA,IAAA,MAAM,qBAAA,GAAwB,CAAC,KAAA,EAAe,CAAA,KAAwB;AACpE,MAAA,CAAA,CAAE,cAAA,EAAe;AAEjB,MAAA,MAAM,IAAA,GAAO,CAAA,CAAE,aAAA,CAAc,qBAAA,EAAsB;AACnD,MAAA,MAAM,UAAA,GAAa,GAAA;AACnB,MAAA,MAAM,SAAA,GAAY,GAAA;AAElB,MAAA,IAAI,IAAI,IAAA,CAAK,IAAA;AACb,MAAA,IAAI,CAAA,GAAI,KAAK,MAAA,GAAS,CAAA;AAEtB,MAAA,IAAI,CAAA,GAAI,SAAA,GAAY,MAAA,CAAO,UAAA,EAAY;AACrC,QAAA,CAAA,GAAI,MAAA,CAAO,aAAa,SAAA,GAAY,CAAA;AAAA,MACtC;AACA,MAAA,IAAI,CAAA,GAAI,UAAA,GAAa,MAAA,CAAO,WAAA,EAAa;AACvC,QAAA,CAAA,GAAI,IAAA,CAAK,MAAM,UAAA,GAAa,CAAA;AAC5B,QAAA,IAAI,IAAI,CAAA,EAAG;AACT,UAAA,CAAA,GAAI,CAAA;AAAA,QACN;AAAA,MACF;AAEA,MAAA,oBAAA,CAAqB,EAAE,CAAA,EAAG,CAAA,EAAG,CAAA;AAC7B,MAAA,qBAAA,CAAsB,KAAK,CAAA;AAAA,IAC7B,CAAA;AAMA,IAAA,MAAM,aAAA,GAAsB,MAAA,CAAA,WAAA;AAAA,MAC1B,CAAC,CAAA,KAA2B;AAC1B,QAAA,MAAM,YAAY,WAAA,CAAY,MAAA;AAC9B,QAAA,IAAI,cAAc,CAAA,EAAG;AAErB,QAAA,IAAI,QAAA,GAAW,WAAA;AACf,QAAA,IAAI,OAAA,GAAU,KAAA;AAEd,QAAA,IAAI,CAAA,CAAE,GAAA,KAAQ,QAAA,IAAY,CAAA,CAAE,QAAQ,WAAA,EAAa;AAC/C,UAAA,kBAAA,EAAmB;AACnB,UAAA,OAAA,GAAU,IAAA;AAAA,QACZ,YAAY,CAAA,CAAE,OAAA,IAAW,EAAE,OAAA,KAAY,CAAA,CAAE,QAAQ,GAAA,EAAK;AACpD,UAAA,SAAA,EAAU;AACV,UAAA,OAAA,GAAU,IAAA;AAAA,QACZ,CAAA,MAAA,IAAA,CAAY,EAAE,OAAA,IAAW,CAAA,CAAE,YAAY,CAAA,CAAE,GAAA,KAAQ,OAAO,SAAA,EAAW;AACjE,UAAA,WAAA,EAAY;AACZ,UAAA,OAAA,GAAU,IAAA;AAAA,QACZ,CAAA,MAAA,IAAA,CAAY,CAAA,CAAE,OAAA,IAAW,CAAA,CAAE,OAAA,KAAY,EAAE,GAAA,KAAQ,GAAA,IAAO,CAAC,CAAA,CAAE,QAAA,EAAU;AACnE,UAAA,IAAA,EAAK;AACL,UAAA,OAAA,GAAU,IAAA;AAAA,QACZ,CAAA,MAAA,IAAW,CAAA,CAAE,GAAA,KAAQ,WAAA,EAAa;AAChC,UAAA,IAAI,mBAAmB,OAAA,EAAS;AAE9B,YAAA,iBAAA,CAAkB,QAAQ,CAAA;AAAA,UAC5B,CAAA,MAAO;AACL,YAAA,QAAA,GAAW,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,WAAA,GAAc,CAAC,CAAA;AAAA,UACxC;AACA,UAAA,OAAA,GAAU,IAAA;AAAA,QACZ,CAAA,MAAA,IAAW,CAAA,CAAE,GAAA,KAAQ,YAAA,EAAc;AACjC,UAAA,IAAI,WAAA,KAAgB,SAAA,GAAY,CAAA,IAAK,cAAA,KAAmB,QAAA,EAAU;AAEhE,YAAA,iBAAA,CAAkB,OAAO,CAAA;AAAA,UAC3B,CAAA,MAAA,IAAW,mBAAmB,OAAA,EAAS;AACrC,YAAA,QAAA,GAAW,IAAA,CAAK,GAAA,CAAI,SAAA,GAAY,CAAA,EAAG,cAAc,CAAC,CAAA;AAAA,UACpD;AACA,UAAA,OAAA,GAAU,IAAA;AAAA,QACZ,WAAW,CAAA,CAAE,GAAA,KAAQ,SAAA,IAAa,CAAA,CAAE,QAAQ,WAAA,EAAa;AAEvD,UAAA,MAAM,cAAA,GAAiB,WAAW,OAAA,EAAS,aAAA;AAAA,YACzC,qBAAqB,WAAW,CAAA,EAAA;AAAA,WAClC;AACA,UAAA,IAAI,cAAA,EAAgB;AAClB,YAAA,MAAM,WAAA,GAAc,eAAe,qBAAA,EAAsB;AACzD,YAAA,MAAM,cAAA,GAAiB,WAAA,CAAY,IAAA,GAAO,WAAA,CAAY,KAAA,GAAQ,CAAA;AAE9D,YAAA,MAAM,SAAA,GAAY,CAAA,CAAE,GAAA,KAAQ,SAAA,GAAY,EAAA,GAAK,CAAA;AAC7C,YAAA,IAAI,SAAA,GAAY,WAAA;AAChB,YAAA,IAAI,YAAA,GAAe,QAAA;AACnB,YAAA,IAAI,YAAA,GAA8B,IAAA;AAElC,YAAA,KAAA,IACM,CAAA,GAAI,cAAc,SAAA,EACtB,CAAA,IAAK,KAAK,CAAA,GAAI,SAAA,EACd,KAAK,SAAA,EACL;AACA,cAAA,MAAM,EAAA,GAAK,WAAW,OAAA,EAAS,aAAA;AAAA,gBAC7B,qBAAqB,CAAC,CAAA,EAAA;AAAA,eACxB;AACA,cAAA,IAAI,CAAC,EAAA,EAAI;AAET,cAAA,MAAM,IAAA,GAAO,GAAG,qBAAA,EAAsB;AACtC,cAAA,MAAM,gBAAA,GACJ,cAAc,EAAA,GACV,IAAA,CAAK,UAAU,WAAA,CAAY,GAAA,GAC3B,IAAA,CAAK,GAAA,IAAO,WAAA,CAAY,MAAA;AAE9B,cAAA,IAAI,gBAAA,EAAkB;AAEpB,gBAAA,IAAI,iBAAiB,IAAA,EAAM;AACzB,kBAAA,YAAA,GAAe,IAAA,CAAK,GAAA;AAAA,gBACtB;AACA,gBAAA,MAAM,kBAAkB,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,GAAA,GAAM,YAAY,CAAA,GAAI,CAAA;AAC5D,gBAAA,IAAI,eAAA,EAAiB;AACnB,kBAAA,MAAM,OAAA,GAAU,IAAA,CAAK,IAAA,GAAO,IAAA,CAAK,KAAA,GAAQ,CAAA;AACzC,kBAAA,MAAM,QAAA,GAAW,IAAA,CAAK,GAAA,CAAI,OAAA,GAAU,cAAc,CAAA;AAClD,kBAAA,IAAI,WAAW,YAAA,EAAc;AAC3B,oBAAA,YAAA,GAAe,QAAA;AACf,oBAAA,SAAA,GAAY,CAAA;AAAA,kBACd;AAAA,gBACF,CAAA,MAAO;AAEL,kBAAA;AAAA,gBACF;AAAA,cACF;AAAA,YACF;AACA,YAAA,QAAA,GAAW,SAAA;AAAA,UACb;AACA,UAAA,OAAA,GAAU,IAAA;AAAA,QACZ,CAAA,MAAA,IAAW,CAAA,CAAE,GAAA,KAAQ,MAAA,EAAQ;AAC3B,UAAA,QAAA,GAAW,CAAA;AACX,UAAA,OAAA,GAAU,IAAA;AAAA,QACZ,CAAA,MAAA,IAAW,CAAA,CAAE,GAAA,KAAQ,KAAA,EAAO;AAC1B,UAAA,QAAA,GAAW,SAAA,GAAY,CAAA;AACvB,UAAA,OAAA,GAAU,IAAA;AAAA,QACZ,CAAA,MAAA,IAAW,CAAA,CAAE,GAAA,KAAQ,OAAA,EAAS;AAC5B,UAAA,cAAA,CAAe,WAAW,CAAA;AAC1B,UAAA,OAAA,GAAU,IAAA;AAAA,QACZ,CAAA,MAAA,IAAW,CAAA,CAAE,GAAA,KAAQ,GAAA,EAAK;AAExB,UAAA,MAAM,EAAA,GAAK,YAAY,WAAW,CAAA;AAClC,UAAA,MAAM,SAAS,SAAA,CAAU,OAAA;AACzB,UAAA,IAAI,MAAA,IAAU,EAAA,IAAM,CAAC,EAAA,CAAG,OAAA,EAAS;AAC/B,YAAA,IAAI,MAAA,CAAO,UAAS,EAAG;AACrB,cAAA,IAAI,QAAA,EAAU;AAEZ,gBAAA,MAAM,QAAA,GAAW,gBAAA;AACjB,gBAAA,IAAI,QAAA,CAAS,SAAS,CAAA,EAAG;AACvB,kBAAA,IAAI,eAAA,GAAkB,CAAA;AACtB,kBAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,QAAA,CAAS,QAAQ,CAAA,EAAA,EAAK;AACxC,oBAAA,IAAI,SAAS,CAAC,CAAA,CAAE,aAAA,CAAc,QAAA,CAAS,WAAW,CAAA,EAAG;AACnD,sBAAA,eAAA,GAAkB,CAAA;AAClB,sBAAA;AAAA,oBACF;AAAA,kBACF;AACA,kBAAA,gBAAA,CAAiB,OAAA,GAAU,QAAA;AAC3B,kBAAA,mBAAA,CAAoB,OAAA,GAAU,eAAA;AAC9B,kBAAA,oBAAA,CAAqB,IAAI,CAAA;AAEzB,kBAAA,MAAA,CAAO,QAAA,CAAS,EAAA,CAAG,IAAA,CAAK,OAAO,CAAA;AAC/B,kBAAA,MAAA,CAAO,IAAA,EAAK;AAAA,gBACd;AAAA,cACF,CAAA,MAAO;AAEL,gBAAA,MAAA,CAAO,QAAA,CAAS,EAAA,CAAG,IAAA,CAAK,OAAO,CAAA;AAC/B,gBAAA,MAAA,CAAO,IAAA,EAAK;AAAA,cACd;AAAA,YACF,CAAA,MAAO;AACL,cAAA,MAAA,CAAO,KAAA,EAAM;AACb,cAAA,oBAAA,CAAqB,KAAK,CAAA;AAAA,YAC5B;AAAA,UACF;AACA,UAAA,OAAA,GAAU,IAAA;AAAA,QACZ;AAEA,QAAA,IAAI,OAAA,EAAS;AACX,UAAA,CAAA,CAAE,cAAA,EAAe;AACjB,UAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,UAAA,IAAI,aAAa,WAAA,EAAa;AAC5B,YAAA,cAAA,CAAe,QAAQ,CAAA;AACvB,YAAA,iBAAA,CAAkB,QAAQ,CAAA;AAAA,UAC5B;AAEA,UAAA,IAAI,EAAE,QAAA,IAAY,CAAA,CAAE,QAAQ,QAAA,IAAY,CAAA,CAAE,QAAQ,WAAA,EAAa;AAE7D,YAAA,MAAM,SAAS,eAAA,IAAmB,WAAA;AAClC,YAAA,IAAI,oBAAoB,IAAA,EAAM;AAC5B,cAAA,kBAAA,CAAmB,WAAW,CAAA;AAAA,YAChC;AACA,YAAA,YAAA,CAAa;AAAA,cACX,KAAA,EAAO,IAAA,CAAK,GAAA,CAAI,MAAA,EAAQ,QAAQ,CAAA;AAAA,cAChC,GAAA,EAAK,IAAA,CAAK,GAAA,CAAI,MAAA,EAAQ,QAAQ;AAAA,aAC/B,CAAA;AAAA,UACH,WAAW,CAAC,CAAA,CAAE,OAAA,IAAW,CAAC,EAAE,OAAA,EAAS;AAEnC,YAAA,YAAA,CAAa,IAAI,CAAA;AACjB,YAAA,kBAAA,CAAmB,IAAI,CAAA;AAAA,UACzB;AAGA,UAAA,MAAM,WAAA,GAAc,WAAW,OAAA,EAAS,aAAA;AAAA,YACtC,qBAAqB,QAAQ,CAAA,EAAA;AAAA,WAC/B;AACA,UAAA,WAAA,EAAa,eAAe,EAAE,KAAA,EAAO,SAAA,EAAW,QAAA,EAAU,UAAU,CAAA;AAAA,QACtE;AAAA,MACF,CAAA;AAAA,MACA;AAAA,QACE,WAAA;AAAA,QACA,WAAA;AAAA,QACA,cAAA;AAAA,QACA,eAAA;AAAA,QACA,SAAA;AAAA,QACA,QAAA;AAAA,QACA,gBAAA;AAAA,QACA,kBAAA;AAAA,QACA,SAAA;AAAA,QACA,WAAA;AAAA,QACA,IAAA;AAAA,QACA;AAAA;AACF,KACF;AAMA,IAAA,MAAM,cAAA,GAAiB,CAAC,KAAA,KAA2B;AACjD,MAAA,IAAI,CAAC,WAAW,OAAO,KAAA;AACvB,MAAA,OAAO,KAAA,IAAS,SAAA,CAAU,KAAA,IAAS,KAAA,IAAS,SAAA,CAAU,GAAA;AAAA,IACxD,CAAA;AAEA,IAAA,MAAM,UAAA,GAAa,CAAC,EAAA,EAAkB,KAAA,KAAkB;AACtD,MAAA,MAAM,WAAW,KAAA,KAAU,eAAA;AAC3B,MAAA,MAAM,WAAW,KAAA,KAAU,WAAA;AAC3B,MAAA,MAAM,UAAA,GAAa,eAAe,KAAK,CAAA;AACvC,MAAA,MAAM,YAAY,EAAA,CAAG,OAAA;AACrB,MAAA,MAAM,UAAA,GAAa,GAAG,QAAA,IAAY,KAAA;AAClC,MAAA,MAAM,YACJ,EAAA,CAAG,IAAA,CAAK,aAAa,SAAA,IACrB,EAAA,CAAG,KAAK,QAAA,KAAa,iBAAA;AACvB,MAAA,MAAM,gBAAA,GAAmB,EAAA,CAAG,IAAA,CAAK,QAAA,KAAa,iBAAA;AAC9C,MAAA,MAAM,WAAW,KAAA,KAAU,iBAAA;AAC3B,MAAA,MAAM,gBAAA,GAAmB,YAAY,cAAA,KAAmB,QAAA;AACxD,MAAA,MAAM,kBACJ,QAAA,IACA,cAAA,KAAmB,OAAA,IACnB,KAAA,KAAU,YAAY,MAAA,GAAS,CAAA;AACjC,MAAA,MAAM,WAAA,GAAc,sBAAsB,KAAK,CAAA;AAC/C,MAAA,MAAM,cAAA,GAAiB,CAAC,CAAC,WAAA;AAGzB,MAAA,MAAM,cAAA,GAAiB,gBAAgB,KAAK,CAAA;AAC5C,MAAA,IAAI,WAAA,GAAc,GAAG,IAAA,CAAK,IAAA;AAC1B,MAAA,IAAI,SAAA,IAAa,mBAAmB,CAAA,EAAG;AACrC,QAAA,MAAM,kBAAA,GAAqB,EAAA,CAAG,IAAA,CAAK,KAAA,GAAQ,GAAG,IAAA,CAAK,OAAA;AACnD,QAAA,MAAM,mBAAA,GAAsB,qBAAqB,cAAA,GAAiB,GAAA;AAClE,QAAA,WAAA,GAAc,CAAA,CAAA,EAAI,mBAAA,CAAoB,OAAA,CAAQ,CAAC,CAAC,CAAA,EAAA,CAAA;AAAA,MAClD;AAEA,MAAA,MAAM,QAAQ,CAAA,EAAG,EAAA,CAAG,IAAA,CAAK,OAAO,QAAQ,EAAA,CAAG,IAAA,CAAK,KAAK,CAAA,EAAA,EACnD,GAAG,IAAA,CAAK,UAAA,GAAa,KAAK,IAAA,CAAK,KAAA,CAAM,GAAG,IAAA,CAAK,UAAA,GAAa,GAAG,CAAC,OAAO,EACvE,CAAA,EACE,YACI,CAAA,WAAA,EAAA,CAAA,CAAgB,EAAA,CAAG,KAAK,KAAA,GAAQ,EAAA,CAAG,IAAA,CAAK,OAAA,IAAW,KAAM,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,EACjE,cAAA,KAAmB,IACf,CAAA,QAAA,EAAA,CAAA,CAAQ,EAAA,CAAG,IAAA,CAAK,KAAA,GAAQ,GAAG,IAAA,CAAK,OAAA,IAAW,cAAA,GAAiB,GAAA,EAAM,QAAQ,CAAC,CAAC,CAAA,IAAA,EAAO,cAAc,MACjG,EACN,CAAA,CAAA,CAAA,GACA,EACN,CAAA,EAAG,SAAA,GAAY,eAAe,EAAE,CAAA,EAAG,UAAA,GAAa,aAAA,GAAgB,EAAE,CAAA,EAChE,cAAA,GAAiB,YAAY,WAAA,CAAY,KAAK,OAAO,EACvD,CAAA,EACE,QAAA,GACI,uEAAA,GACA,EACN,CAAA,EAAG,CAAC,YAAY,CAAC,SAAA,GAAY,uCAAuC,EAAE,CAAA,CAAA;AAEtE,MAAA;AAAA;AAAA;AAAA;AAAA,wBAIED,IAAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YAEC,EAAA,EAAI,QAAQ,KAAK,CAAA,CAAA;AAAA,YACjB,iBAAA,EAAiB,KAAA;AAAA,YACjB,WAAW,aAAA,CAAc;AAAA,cACvB,QAAA;AAAA,cACA,QAAA;AAAA,cACA,UAAA;AAAA,cACA,SAAA;AAAA,cACA,UAAA;AAAA,cACA,SAAA;AAAA,cACA,gBAAA;AAAA,cACA,QAAA;AAAA,cACA,SAAA;AAAA,cACA;AAAA,aACD,CAAA;AAAA,YACD,SAAS,CAAC,CAAA,KAAM,gBAAgB,EAAA,CAAG,IAAA,EAAM,OAAO,CAAC,CAAA;AAAA,YACjD,aAAA,EAAe,CAAC,CAAA,KAAM,qBAAA,CAAsB,OAAO,CAAC,CAAA;AAAA,YACpD,WAAA,EAAa,CAAC,CAAA,KAAM,mBAAA,CAAoB,OAAO,CAAC,CAAA;AAAA,YAChD,YAAA,EAAc,MAAM,oBAAA,CAAqB,KAAK,CAAA;AAAA,YAC9C,aAAA,EAAe,CAAC,CAAA,KAAM,qBAAA,CAAsB,OAAO,CAAC,CAAA;AAAA,YACpD,IAAA,EAAK,QAAA;AAAA,YACL,iBAAe,UAAA,IAAc,QAAA;AAAA,YAC7B,KAAA;AAAA,YAEC,QAAA,EAAA;AAAA,cAAA,gBAAA,IAAoB,SAAA,oBAAaC,GAAAA,CAAC,KAAA,EAAA,EAAM,MAAK,QAAA,EAAS,CAAA;AAAA,cACtD,kCACCD,IAAAA;AAAA,gBAAC,MAAA;AAAA,gBAAA;AAAA,kBACC,SAAA,EAAU,uJAAA;AAAA,kBACV,KAAA,EAAO,CAAA,OAAA,EAAU,WAAA,CAAY,KAAK,CAAA,WAAA,CAAA;AAAA,kBAEjC,QAAA,EAAA;AAAA,oBAAA,WAAA,CAAY,KAAA;AAAA,oBAAM;AAAA;AAAA;AAAA,eACrB;AAAA,cAED,WAAA;AAAA,cAAY,GAAA;AAAA,cAAE,mBAAmB,SAAA,oBAAaC,GAAAA,CAAC,KAAA,EAAA,EAAM,MAAK,OAAA,EAAQ;AAAA;AAAA,WAAA;AAAA,UAjC9D,CAAA,EAAG,EAAA,CAAG,aAAa,CAAA,CAAA,EAAI,KAAK,CAAA;AAAA;AAkCnC;AAAA,IAEJ,CAAA;AAEA,IAAA,MAAM,WAAA,GACJ,QAAA,IAAY,iBAAA,KAAsB,IAAA,IAAQ,SAAA,KAAc,IAAA;AAE1D,IAAA,uBACED,IAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,GAAA;AAAA,QACA,SAAA,EAAW,mBAAA,CAAoB,EAAE,WAAA,EAAa,WAAW,CAAA;AAAA,QAEzD,QAAA,EAAA;AAAA,0BAAAA,IAAAA;AAAA,YAAC,KAAA;AAAA,YAAA;AAAA,cACC,SAAA,EAAW,CAAA,4BAAA,EACT,WAAA,KAAgB,UAAA,GAAa,yBAAyB,UACxD,CAAA,CAAA;AAAA,cAGA,QAAA,EAAA;AAAA,gCAAAC,GAAAA;AAAA,kBAAC,KAAA;AAAA,kBAAA;AAAA,oBACC,SAAA,EAAW,CAAA,6CAAA,EACT,WAAA,KAAgB,UAAA,GACZ,yBACA,sBACN,CAAA,CAAA;AAAA,oBAEA,QAAA,kBAAAA,GAAAA;AAAA,sBAAC,WAAA;AAAA,sBAAA;AAAA,wBACC,GAAA,EAAK,SAAA;AAAA,wBACL,GAAA;AAAA,wBACA,IAAA;AAAA,wBACA,YAAA,EAAW,cAAA;AAAA,wBACX,YAAA,EAAc,gBAAA;AAAA,wBACd,OAAA,EAAS;AAAA;AAAA;AACX;AAAA,iBACF;AAAA,gCAGAD,IAAAA;AAAA,kBAAC,KAAA;AAAA,kBAAA;AAAA,oBACC,SAAA,EAAW,CAAA,6BAAA,EAAgC,WAAA,KAAgB,UAAA,GAAa,aAAa,EAAE,CAAA,CAAA;AAAA,oBAGvF,QAAA,EAAA;AAAA,sCAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,6FAAA,EACb,QAAA,EAAA;AAAA,wCAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yBAAA,EACZ,QAAA,EAAA;AAAA,0BAAA,QAAA,oBACCC,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,qFAAoF,QAAA,EAAA,QAAA,EAEpG,CAAA;AAAA,0CAEFA,GAAAA;AAAA,4BAAC,OAAA;AAAA,4BAAA;AAAA,8BACC,SAAA,EAAU,+BAAA;AAAA,8BACV,OAAA,EAAQ,4BAAA;AAAA,8BACT,QAAA,EAAA;AAAA;AAAA,2BAED;AAAA,0CACAA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,QACb,QAAA,kBAAAA,GAAAA;AAAA,4BAAC,MAAA;AAAA,4BAAA;AAAA,8BACC,EAAA,EAAG,4BAAA;AAAA,8BACH,IAAA,EAAK,IAAA;AAAA,8BACL,OAAA,EAAS,eAAA,CAAgB,GAAA,CAAI,CAAC,KAAA,MAAW;AAAA,gCACvC,KAAA,EAAO,OAAO,KAAK,CAAA;AAAA,gCACnB,KAAA,EAAO,GAAG,KAAK,CAAA,CAAA;AAAA,+BACjB,CAAE,CAAA;AAAA,8BACF,KAAA,EAAO,OAAO,YAAY,CAAA;AAAA,8BAC1B,eAAe,CAAC,KAAA,KACd,eAAA,CAAgB,UAAA,CAAW,KAAK,CAAkB,CAAA;AAAA,8BAEpD,YAAA,EAAW;AAAA;AAAA,2BACb,EACF,CAAA;AAAA,0BACC,YAAA,CAAa,MAAA,GAAS,CAAA,oBACrBD,IAAAA;AAAA,4BAAC,MAAA;AAAA,4BAAA;AAAA,8BACC,SAAA,EAAU,+BAAA;AAAA,8BACV,KAAA,EAAO,CAAA,EAAG,YAAA,CAAa,MAAM,CAAA,wEAAA,CAAA;AAAA,8BAE5B,QAAA,EAAA;AAAA,gCAAA,YAAA,CAAa,MAAA;AAAA,gCAAO,SAAA;AAAA,gCACpB,YAAA,CAAa,MAAA,KAAW,CAAA,GAAI,GAAA,GAAM;AAAA;AAAA;AAAA,2BACrC;AAAA,0CAEFC,GAAAA;AAAA,4BAAC,MAAA;AAAA,4BAAA;AAAA,8BACC,OAAA,EAAQ,OAAA;AAAA,8BACR,IAAA,EAAK,IAAA;AAAA,8BACL,OAAA,EAAS,MAAM,kBAAA,CAAmB,IAAI,CAAA;AAAA,8BACtC,YAAA,EAAW,qBAAA;AAAA,8BACX,KAAA,EAAM,qBAAA;AAAA,8BACP,QAAA,EAAA;AAAA;AAAA,2BAED;AAAA,0BACC,SAAA,CAAU,MAAA,GAAS,CAAA,oBAClBD,IAAAA;AAAA,4BAAC,MAAA;AAAA,4BAAA;AAAA,8BACC,OAAA,EAAQ,OAAA;AAAA,8BACR,IAAA,EAAK,IAAA;AAAA,8BACL,OAAA,EAAS,IAAA;AAAA,8BACT,YAAA,EAAY,CAAA,MAAA,EAAS,SAAA,CAAU,MAAM,CAAA,WAAA,CAAA;AAAA,8BACrC,KAAA,EAAM,gBAAA;AAAA,8BACP,QAAA,EAAA;AAAA,gCAAA,QAAA;AAAA,gCACQ,SAAA,CAAU,MAAA;AAAA,gCAAO;AAAA;AAAA;AAAA;AAC1B,yBAAA,EAEJ,CAAA;AAAA,wCAEAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uDAAA,EACb,QAAA,EAAA;AAAA,0CAAAC,GAAAA;AAAA,4BAAC,MAAA;AAAA,4BAAA;AAAA,8BACC,OAAA,EAAQ,OAAA;AAAA,8BACR,IAAA,EAAK,IAAA;AAAA,8BACL,SAAS,MAAM,kBAAA,CAAmB,CAAC,CAAA,KAAM,CAAC,CAAC,CAAA;AAAA,8BAC3C,cAAA,EAAc,eAAA;AAAA,8BACd,YAAA,EAAW,aAAA;AAAA,8BACX,KAAA,EAAM,iDAAA;AAAA,8BACP,QAAA,EAAA;AAAA;AAAA,2BAED;AAAA,0CACAD,KAAC,MAAA,EAAA,EAAM,QAAA,EAAA;AAAA,4BAAA,KAAA,CAAM,eAAA;AAAA,4BAAgB;AAAA,2BAAA,EAAM,CAAA;AAAA,0CACnCA,IAAAA;AAAA,4BAAC,QAAA;AAAA,4BAAA;AAAA,8BACC,IAAA,EAAK,QAAA;AAAA,8BACL,SAAA,EAAU,yKAAA;AAAA,8BACV,OAAA,EAAS,MAAM,mBAAA,CAAoB,IAAI,CAAA;AAAA,8BACvC,OACE,KAAA,CAAM,kBAAA,GAAqB,IACvB,CAAA,sDAAA,EAAA,CAAqD,iBAAA,CAAkB,eAAe,GAAA,EAAM,OAAA,CAAQ,CAAC,CAAC,OACtG,CAAA,iCAAA,EAAA,CAAqC,iBAAA,CAAkB,eAAe,GAAA,EAAM,OAAA,CAAQ,CAAC,CAAC,CAAA,uBAAA,CAAA;AAAA,8BAE5F,YAAA,EAAW,6BAAA;AAAA,8BAEV,QAAA,EAAA;AAAA,gCAAA,KAAA,CAAM,kBAAA;AAAA,gCAAmB;AAAA;AAAA;AAAA,2BAC5B;AAAA,0BAAA,CACE,KAAA,CAAM,gBAAA,GAAmB,CAAA,IACzB,KAAA,CAAM,mBAAA,GAAsB,sBAC5BA,IAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,kBAAA,EACb,QAAA,EAAA;AAAA,4BAAA,KAAA,CAAM,mBAAmB,KAAA,CAAM,mBAAA;AAAA,4BAAoB;AAAA,2BAAA,EACtD,CAAA;AAAA,0BAED,UAAA,CAAW,QAAA,oBACVA,IAAAA,CAAC,MAAA,EAAA,EAAM,QAAA,EAAA;AAAA,4BAAA,UAAA,CAAW,QAAA,CAAS,MAAA;AAAA,4BAAO;AAAA,2BAAA,EAAS,CAAA;AAAA,0CAE7CC,GAAAA,CAAC,MAAA,EAAA,EAAM,UAAAI,eAAAA,CAAe,KAAA,CAAM,gBAAgB,CAAA,EAAE;AAAA,yBAAA,EAChD;AAAA,uBAAA,EACF,CAAA;AAAA,sBAGC,WAAA,oBACCL,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,+EAAA,EACb,QAAA,EAAA;AAAA,wCAAAA,IAAAA;AAAA,0BAAC,MAAA;AAAA,0BAAA;AAAA,4BACC,OAAA,EAAQ,OAAA;AAAA,4BACR,IAAA,EAAK,IAAA;AAAA,4BACL,OAAA,EAAS,MAAM,cAAA,CAAe,WAAW,CAAA;AAAA,4BACzC,KAAA,EAAM,4BAAA;AAAA,4BACP,QAAA,EAAA;AAAA,8BAAA,OAAA;AAAA,8CACMC,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,0BAAyB,QAAA,EAAA,QAAA,EAAC;AAAA;AAAA;AAAA,yBAChD;AAAA,wCACAD,IAAAA;AAAA,0BAAC,MAAA;AAAA,0BAAA;AAAA,4BACC,OAAA,EAAQ,OAAA;AAAA,4BACR,IAAA,EAAK,IAAA;AAAA,4BACL,OAAA,EAAS,kBAAA;AAAA,4BACT,KAAA,EAAM,4BAAA;AAAA,4BACP,QAAA,EAAA;AAAA,8BAAA,MAAA;AAAA,8CACKC,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,0BAAyB,QAAA,EAAA,QAAA,EAAC;AAAA;AAAA;AAAA,yBAC/C;AAAA,wCACAD,IAAAA;AAAA,0BAAC,MAAA;AAAA,0BAAA;AAAA,4BACC,OAAA,EAAQ,OAAA;AAAA,4BACR,IAAA,EAAK,IAAA;AAAA,4BACL,OAAA,EAAS,SAAA;AAAA,4BACT,KAAA,EAAM,yBAAA;AAAA,4BACP,QAAA,EAAA;AAAA,8BAAA,MAAA;AAAA,8CACKC,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,0BAAyB,QAAA,EAAA,SAAA,EAAE;AAAA;AAAA;AAAA,yBAChD;AAAA,wCACAD,IAAAA;AAAA,0BAAC,MAAA;AAAA,0BAAA;AAAA,4BACC,OAAA,EAAQ,OAAA;AAAA,4BACR,IAAA,EAAK,IAAA;AAAA,4BACL,OAAA,EAAS,WAAA;AAAA,4BACT,UAAU,CAAC,SAAA;AAAA,4BACX,KAAA,EAAM,iBAAA;AAAA,4BACP,QAAA,EAAA;AAAA,8BAAA,QAAA;AAAA,8CACOC,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,0BAAyB,QAAA,EAAA,SAAA,EAAE;AAAA;AAAA;AAAA;AAClD,uBAAA,EACF,CAAA;AAAA,sCAIFA,GAAAA;AAAA,wBAAC,KAAA;AAAA,wBAAA;AAAA,0BACC,GAAA,EAAK,UAAA;AAAA,0BACL,SAAA,EAAW,CAAA,gKAAA,EACT,SAAA,GAAY,aAAA,GAAgB,EAC9B,CAAA,CAAA;AAAA,0BACA,QAAA,EAAU,CAAA;AAAA,0BACV,SAAA,EAAW,aAAA;AAAA,0BACX,MAAA,EAAQ,UAAA;AAAA,0BACR,OAAA,EAAS,MAAM,YAAA,CAAa,IAAI,CAAA;AAAA,0BAChC,MAAA,EAAQ,MAAM,YAAA,CAAa,KAAK,CAAA;AAAA,0BAChC,SAAA,EAAW,aAAA;AAAA,0BACX,YAAA,EAAc,aAAA;AAAA,0BACd,IAAA,EAAK,SAAA;AAAA,0BACL,YAAA,EAAW,kBAAA;AAAA,0BACX,uBAAA,EAAuB,QAAQ,WAAW,CAAA,CAAA;AAAA,0BAEzC,QAAA,EAAA,WAAA,CAAY,IAAI,UAAU;AAAA;AAAA;AAC7B;AAAA;AAAA;AACF;AAAA;AAAA,WACF;AAAA,UAEC,mCACCA,GAAAA;AAAA,YAAC,WAAA;AAAA,YAAA;AAAA,cACC,UAAA;AAAA,cACA,WAAA;AAAA,cACA,OAAA,EAAS,kBAAA;AAAA,cACT,OAAA,EAAS,MAAM,kBAAA,CAAmB,KAAK;AAAA;AAAA,WACzC;AAAA,0BAIFA,GAAAA;AAAA,YAAC,gBAAA;AAAA,YAAA;AAAA,cACC,MAAA,EAAQ,eAAA;AAAA,cACR,OAAA,EAAS,MAAM,kBAAA,CAAmB,KAAK,CAAA;AAAA,cACvC,OAAA,EAAS,aAAA;AAAA,cACT,gBAAgB,cAAA,CAAe,WAAA;AAAA,cAC/B,iBAAiB,cAAA,CAAe,SAAA;AAAA,cAChC,eAAe,cAAA,CAAe,aAAA;AAAA,cAC9B,mBAAmB,KAAA,CAAM;AAAA;AAAA,WAC3B;AAAA,0BAEAA,GAAAA;AAAA,YAAC,oBAAA;AAAA,YAAA;AAAA,cACC,MAAA,EAAQ,gBAAA;AAAA,cACR,OAAA,EAAS,MAAM,mBAAA,CAAoB,KAAK,CAAA;AAAA,cACxC,cAAc,iBAAA,CAAkB,YAAA;AAAA,cAChC,aAAa,iBAAA,CAAkB,WAAA;AAAA,cAC/B,OAAA,EAAS;AAAA;AAAA,WACX;AAAA,0BAEAA,GAAAA;AAAA,YAAC,eAAA;AAAA,YAAA;AAAA,cACC,QAAQ,eAAA,KAAoB,IAAA;AAAA,cAC5B,cACE,eAAA,KAAoB,IAAA,GACf,WAAA,CAAY,eAAe,KAAK,IAAA,GACjC,IAAA;AAAA,cAEN,OAAA,EAAS,eAAA;AAAA,cACT,MAAA,EAAQ,gBAAA;AAAA,cACR,cAAA,EAAgB,wBAAA;AAAA,cAChB,QAAA,EAAU;AAAA;AAAA,WACZ;AAAA,0BAEAA,GAAAA;AAAA,YAAC,eAAA;AAAA,YAAA;AAAA,cACC,QAAQ,kBAAA,KAAuB,IAAA;AAAA,cAC/B,QAAA,EAAU,iBAAA;AAAA,cACV,SAAA,EAAW,kBAAA;AAAA,cACX,aAAA,EACE,kBAAA,KAAuB,IAAA,GACnB,qBAAA,CAAsB,kBAAkB,CAAA,GACxC,MAAA;AAAA,cAEN,YAAA;AAAA,cACA,UAAA,EAAY,CAAC,KAAA,KAAU;AACrB,gBAAA,IAAI,uBAAuB,IAAA,EAAM;AAC/B,kBAAA,iBAAA,CAAkB,oBAAoB,KAAK,CAAA;AAAA,gBAC7C;AAAA,cACF,CAAA;AAAA,cACA,gBAAgB,MAAM;AACpB,gBAAA,IAAI,uBAAuB,IAAA,EAAM;AAC/B,kBAAA,iBAAA,CAAkB,kBAAkB,CAAA;AAAA,gBACtC;AAAA,cACF,CAAA;AAAA,cACA,SAAS,MAAM;AACb,gBAAA,qBAAA,CAAsB,IAAI,CAAA;AAC1B,gBAAA,oBAAA,CAAqB,IAAI,CAAA;AAAA,cAC3B;AAAA;AAAA;AACF;AAAA;AAAA,KACF;AAAA,EAEJ;AACF;AAEA,WAAA,CAAY,WAAA,GAAc,aAAA","file":"chunk-MCCO4A23.js","sourcesContent":["/**\n * FillerWordsModal — select filler words (and long silences) to mark deleted.\n *\n * Ported from pulseclip's TranscriptViewer for @mieweb/ui. Pure UI: match\n * counts/durations come in via props (see useTranscriptEdits.fillerAnalysis);\n * the selection is reported through onApply.\n */\n\nimport * as React from 'react';\nimport {\n Modal,\n ModalHeader,\n ModalTitle,\n ModalClose,\n ModalBody,\n ModalFooter,\n} from '../Modal';\nimport { Button } from '../Button';\nimport { Input } from '../Input';\nimport { Checkbox } from '../Checkbox';\nimport { Select } from '../Select';\nimport { DEFAULT_FILLER_WORDS } from '../../hooks/useTranscriptEdits';\nimport type { SilenceThresholdCount } from '../../hooks/useTranscriptEdits';\n\nexport interface FillerWordsModalProps {\n isOpen: boolean;\n onClose: () => void;\n /** Apply removal: selected filler words + optional silence threshold (seconds) */\n onApply: (\n fillerWords: string[],\n removeSilenceAboveSec: number | null\n ) => void;\n /** Occurrence count per normalized word */\n matchingCounts: Map<string, number>;\n /** Total duration (ms) per filler word */\n fillerDurations: Map<string, number>;\n /** Count and total duration of silences at each threshold */\n silenceCounts: SilenceThresholdCount[];\n /** Current total edited duration in ms */\n currentDurationMs: number;\n}\n\nconst SILENCE_THRESHOLD_OPTIONS = [0.3, 0.4, 0.5, 0.75, 1.0, 1.5, 2.0];\n\n/** Format duration in seconds or m:ss */\nfunction formatDuration(ms: number): string {\n const totalSeconds = Math.round(ms / 1000);\n if (totalSeconds < 90) {\n return `${totalSeconds}s`;\n }\n const minutes = Math.floor(totalSeconds / 60);\n const seconds = totalSeconds % 60;\n return `${minutes}:${String(seconds).padStart(2, '0')}`;\n}\n\n/** Modal for selecting filler words to remove from the edited transcript */\nexport const FillerWordsModal: React.FC<FillerWordsModalProps> = ({\n isOpen,\n onClose,\n onApply,\n matchingCounts,\n fillerDurations,\n silenceCounts,\n currentDurationMs,\n}) => {\n const [searchTerm, setSearchTerm] = React.useState('');\n const [selectedFillers, setSelectedFillers] = React.useState<Set<string>>(\n new Set(DEFAULT_FILLER_WORDS)\n );\n const [customWord, setCustomWord] = React.useState('');\n const [removeSilence, setRemoveSilence] = React.useState(false);\n const [silenceThreshold, setSilenceThreshold] = React.useState(0.4);\n\n // Filter filler words based on search, then sort by count (matches first)\n const filteredFillers = DEFAULT_FILLER_WORDS.filter((word) =>\n word.toLowerCase().includes(searchTerm.toLowerCase())\n ).sort((a, b) => {\n const countA = matchingCounts.get(a) || 0;\n const countB = matchingCounts.get(b) || 0;\n if (countB !== countA) return countB - countA;\n return a.localeCompare(b);\n });\n\n // Custom words that have been added, sorted by count\n const customFillers = Array.from(selectedFillers)\n .filter((word) => !DEFAULT_FILLER_WORDS.includes(word))\n .filter((word) => word.toLowerCase().includes(searchTerm.toLowerCase()))\n .sort((a, b) => {\n const countA = matchingCounts.get(a) || 0;\n const countB = matchingCounts.get(b) || 0;\n if (countB !== countA) return countB - countA;\n return a.localeCompare(b);\n });\n\n const toggleFiller = (word: string) => {\n setSelectedFillers((prev) => {\n const next = new Set(prev);\n if (next.has(word)) {\n next.delete(word);\n } else {\n next.add(word);\n }\n return next;\n });\n };\n\n const handleAddCustom = () => {\n const trimmed = customWord.trim().toLowerCase();\n if (trimmed && !selectedFillers.has(trimmed)) {\n setSelectedFillers((prev) => new Set([...prev, trimmed]));\n setCustomWord('');\n }\n };\n\n // Count and duration of silences that would be removed at the current threshold\n const silenceData = removeSilence\n ? silenceCounts.find((s) => s.threshold === silenceThreshold) || {\n count: 0,\n durationMs: 0,\n }\n : { count: 0, durationMs: 0 };\n const silenceRemovalCount = silenceData.count;\n const silenceDurationMs = silenceData.durationMs;\n\n const handleApply = () => {\n onApply(\n Array.from(selectedFillers),\n removeSilence ? silenceThreshold : null\n );\n onClose();\n };\n\n const selectAll = () => {\n setSelectedFillers(new Set([...DEFAULT_FILLER_WORDS, ...customFillers]));\n };\n\n const selectNone = () => {\n setSelectedFillers(new Set());\n };\n\n // Total matches (filler words + silences)\n const fillerMatches = Array.from(selectedFillers).reduce(\n (sum, word) => sum + (matchingCounts.get(word) || 0),\n 0\n );\n const totalMatches = fillerMatches + silenceRemovalCount;\n\n // Time saved from filler words + silences\n const fillerTimeSavedMs = Array.from(selectedFillers).reduce(\n (sum, word) => sum + (fillerDurations.get(word) || 0),\n 0\n );\n const totalTimeSavedMs = fillerTimeSavedMs + silenceDurationMs;\n const newDurationMs = currentDurationMs - totalTimeSavedMs;\n\n const renderFillerItem = (word: string, isCustom: boolean) => {\n const count = matchingCounts.get(word) || 0;\n return (\n <label\n key={word}\n className=\"hover:bg-muted flex cursor-pointer items-center gap-2 rounded-md px-1.5 py-1 text-sm transition-colors\"\n >\n <Checkbox\n size=\"sm\"\n checked={selectedFillers.has(word)}\n onChange={() => toggleFiller(word)}\n aria-label={`Remove \"${word}\"`}\n />\n <span className=\"text-foreground min-w-0 flex-1 truncate\">{word}</span>\n {count > 0 && (\n <span className=\"text-muted-foreground text-xs\">({count})</span>\n )}\n {isCustom && (\n <button\n type=\"button\"\n className=\"text-muted-foreground hover:bg-destructive/10 hover:text-destructive focus-visible:ring-ring rounded px-1 transition-colors focus-visible:ring-2 focus-visible:outline-none\"\n onClick={(e) => {\n e.preventDefault();\n setSelectedFillers((prev) => {\n const next = new Set(prev);\n next.delete(word);\n return next;\n });\n }}\n aria-label={`Remove ${word}`}\n >\n ×\n </button>\n )}\n </label>\n );\n };\n\n return (\n <Modal\n open={isOpen}\n onOpenChange={(open) => {\n if (!open) onClose();\n }}\n size=\"lg\"\n >\n <ModalHeader>\n <ModalTitle>Remove Filler Words</ModalTitle>\n <ModalClose aria-label=\"Close modal\" />\n </ModalHeader>\n\n <ModalBody className=\"flex flex-col gap-3\">\n <Input\n size=\"sm\"\n type=\"text\"\n placeholder=\"Search filler words...\"\n value={searchTerm}\n onChange={(e) => setSearchTerm(e.target.value)}\n aria-label=\"Search filler words\"\n />\n\n <div className=\"flex items-center gap-2\">\n <Button variant=\"ghost\" size=\"sm\" onClick={selectAll}>\n Select All\n </Button>\n <Button variant=\"ghost\" size=\"sm\" onClick={selectNone}>\n Select None\n </Button>\n </div>\n\n <div className=\"border-border bg-muted/40 flex flex-wrap items-center gap-2 rounded-lg border px-3 py-2\">\n <Checkbox\n size=\"sm\"\n label=\"Remove silences greater than\"\n checked={removeSilence}\n onChange={(e) => setRemoveSilence(e.target.checked)}\n />\n <div className=\"w-24\">\n <Select\n size=\"sm\"\n options={SILENCE_THRESHOLD_OPTIONS.map((t) => ({\n value: String(t),\n label: `${t}s`,\n }))}\n value={String(silenceThreshold)}\n onValueChange={(value) => setSilenceThreshold(parseFloat(value))}\n disabled={!removeSilence}\n aria-label=\"Silence threshold in seconds\"\n />\n </div>\n {removeSilence && silenceRemovalCount > 0 && (\n <span className=\"text-muted-foreground text-xs\">\n ({silenceRemovalCount} silences)\n </span>\n )}\n </div>\n\n <div className=\"border-border grid max-h-56 grid-cols-2 gap-x-3 gap-y-0.5 overflow-y-auto rounded-lg border p-2 sm:grid-cols-3\">\n {filteredFillers.map((word) => renderFillerItem(word, false))}\n {customFillers.map((word) => renderFillerItem(word, true))}\n </div>\n\n <div className=\"flex items-center gap-2\">\n <Input\n size=\"sm\"\n type=\"text\"\n placeholder=\"Add custom filler word...\"\n value={customWord}\n onChange={(e) => setCustomWord(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === 'Enter') {\n e.preventDefault();\n handleAddCustom();\n }\n }}\n aria-label=\"Add custom filler word\"\n />\n <Button\n variant=\"secondary\"\n size=\"sm\"\n onClick={handleAddCustom}\n disabled={!customWord.trim()}\n >\n Add\n </Button>\n </div>\n </ModalBody>\n\n <ModalFooter className=\"justify-between\">\n <span className=\"text-muted-foreground text-sm\">\n {totalMatches} items • saves {formatDuration(totalTimeSavedMs)} →{' '}\n {formatDuration(newDurationMs)}\n </span>\n <div className=\"flex items-center gap-2\">\n <Button variant=\"secondary\" size=\"sm\" onClick={onClose}>\n Cancel\n </Button>\n <Button\n variant=\"primary\"\n size=\"sm\"\n onClick={handleApply}\n disabled={totalMatches === 0}\n >\n Mark as Deleted ({totalMatches})\n </Button>\n </div>\n </ModalFooter>\n </Modal>\n );\n};\n\nFillerWordsModal.displayName = 'FillerWordsModal';\n","/**\n * WordEditorModal — edit a word's text or split a silence into segments.\n *\n * Ported from pulseclip's TranscriptViewer for @mieweb/ui. For silences,\n * space-separated durations (e.g. \"1 1 4 1\") split the silence; the\n * remainder becomes the final segment.\n */\n\nimport * as React from 'react';\nimport {\n Modal,\n ModalHeader,\n ModalTitle,\n ModalClose,\n ModalBody,\n ModalFooter,\n} from '../Modal';\nimport { Button } from '../Button';\nimport { Input } from '../Input';\nimport { isSilenceType } from '../TranscriptView/transcript';\nimport type { EditableWord } from '../TranscriptView/transcript';\n\nexport interface WordEditorModalProps {\n isOpen: boolean;\n editableWord: EditableWord | null;\n onClose: () => void;\n /** Save a new text for the word */\n onSave: (newText: string) => void;\n /** Split a silence into segments with the given durations (seconds) */\n onSplitSilence: (durations: number[]) => void;\n /** Toggle the word's deleted state */\n onDelete: () => void;\n}\n\ninterface SilenceSplitResult {\n durations: number[];\n remainder: number;\n error?: string;\n}\n\n/**\n * Modal for editing a word or splitting a silence.\n * For silences, enter space-separated durations (e.g., \"1 1 4 1\") to split.\n */\nexport const WordEditorModal: React.FC<WordEditorModalProps> = ({\n isOpen,\n editableWord,\n onClose,\n onSave,\n onSplitSilence,\n onDelete,\n}) => {\n const [inputValue, setInputValue] = React.useState('');\n const [error, setError] = React.useState<string | null>(null);\n const inputRef = React.useRef<HTMLInputElement>(null);\n\n const isSilence = isSilenceType(editableWord?.word.wordType);\n const durationMs = editableWord\n ? editableWord.word.endMs - editableWord.word.startMs\n : 0;\n const durationSec = durationMs / 1000;\n\n // Reset input when the modal opens\n React.useEffect(() => {\n if (isOpen && editableWord) {\n if (isSilence) {\n setInputValue('');\n } else {\n setInputValue(editableWord.word.text);\n }\n setError(null);\n // Focus input after a short delay so it wins over the modal's focus trap\n setTimeout(() => inputRef.current?.focus(), 50);\n }\n }, [isOpen, editableWord, isSilence]);\n\n // Parse silence split input (pure function, no side effects)\n const parseSilenceSplit = (input: string): SilenceSplitResult | null => {\n const trimmed = input.trim();\n if (!trimmed) return null;\n\n const parts = trimmed.split(/\\s+/);\n const durations: number[] = [];\n let total = 0;\n\n for (const part of parts) {\n const num = parseFloat(part);\n if (isNaN(num) || num <= 0) {\n return {\n durations: [],\n remainder: 0,\n error: `Invalid number: \"${part}\"`,\n };\n }\n durations.push(num);\n total += num;\n }\n\n if (total >= durationSec) {\n return {\n durations: [],\n remainder: 0,\n error: `Total (${total.toFixed(1)}s) exceeds silence duration (${durationSec.toFixed(1)}s)`,\n };\n }\n\n const remainder = durationSec - total;\n return { durations, remainder };\n };\n\n const handleApply = () => {\n if (isSilence) {\n const parsed = parseSilenceSplit(inputValue);\n if (parsed?.error) {\n setError(parsed.error);\n return;\n }\n if (parsed && parsed.durations.length > 0) {\n // Add the remainder as the final segment\n const allDurations = [...parsed.durations, parsed.remainder];\n onSplitSilence(allDurations);\n onClose();\n }\n } else {\n const trimmed = inputValue.trim();\n if (trimmed && trimmed !== editableWord?.word.text) {\n onSave(trimmed);\n }\n onClose();\n }\n };\n\n const handleKeyDown = (e: React.KeyboardEvent) => {\n if (e.key === 'Enter') {\n e.preventDefault();\n handleApply();\n }\n };\n\n // Preview for silence splitting\n const preview = isSilence ? parseSilenceSplit(inputValue) : null;\n\n const applyDisabled = isSilence\n ? !inputValue.trim() ||\n !!preview?.error ||\n !preview ||\n preview.durations.length === 0\n : !inputValue.trim();\n\n return (\n <Modal\n open={isOpen && editableWord !== null}\n onOpenChange={(open) => {\n if (!open) onClose();\n }}\n size=\"md\"\n >\n <ModalHeader>\n <ModalTitle>{isSilence ? 'Split Silence' : 'Edit Word'}</ModalTitle>\n <ModalClose aria-label=\"Close editor\" />\n </ModalHeader>\n\n <ModalBody className=\"flex flex-col gap-2\">\n {isSilence ? (\n <>\n <p className=\"text-foreground m-0 text-sm\">\n Silence duration:{' '}\n <strong className=\"font-semibold\">\n {durationSec.toFixed(1)}s\n </strong>\n </p>\n <p className=\"text-muted-foreground m-0 text-xs\">\n Enter space-separated durations to split (e.g., &quot;1 1 4\n 1&quot;)\n </p>\n <Input\n ref={inputRef}\n type=\"text\"\n value={inputValue}\n onChange={(e) => {\n setInputValue(e.target.value);\n setError(null);\n }}\n onKeyDown={handleKeyDown}\n placeholder=\"1 2 3...\"\n aria-label=\"Split durations\"\n />\n {error && (\n <p className=\"text-destructive m-0 text-sm\" role=\"alert\">\n {error}\n </p>\n )}\n {preview &&\n !preview.error &&\n preview.durations.length > 0 &&\n !error && (\n <p className=\"text-muted-foreground m-0 text-sm\">\n Preview:{' '}\n {[...preview.durations, preview.remainder]\n .map((d) => `[${d.toFixed(1)}s]`)\n .join(' ')}\n </p>\n )}\n {preview?.error && !error && (\n <p className=\"text-destructive m-0 text-sm\" role=\"alert\">\n {preview.error}\n </p>\n )}\n </>\n ) : (\n <>\n <p className=\"text-foreground m-0 text-sm\">Edit the word text:</p>\n <Input\n ref={inputRef}\n type=\"text\"\n value={inputValue}\n onChange={(e) => setInputValue(e.target.value)}\n onKeyDown={handleKeyDown}\n aria-label=\"Word text\"\n />\n </>\n )}\n </ModalBody>\n\n <ModalFooter className=\"justify-between\">\n <Button\n variant={editableWord?.deleted ? 'secondary' : 'danger'}\n size=\"sm\"\n onClick={onDelete}\n >\n {editableWord?.deleted ? 'Restore' : 'Delete'}\n </Button>\n <div className=\"flex items-center gap-2\">\n <Button variant=\"secondary\" size=\"sm\" onClick={onClose}>\n Cancel\n </Button>\n <Button\n variant=\"primary\"\n size=\"sm\"\n onClick={handleApply}\n disabled={applyDisabled}\n >\n {isSilence ? 'Split' : 'Save'}\n </Button>\n </div>\n </ModalFooter>\n </Modal>\n );\n};\n\nWordEditorModal.displayName = 'WordEditorModal';\n","/**\n * SilenceSettingsModal — configure silence detection thresholds.\n *\n * Ported from pulseclip's TranscriptViewer for @mieweb/ui. The paragraph\n * break threshold is clamped to be >= the minimum silence duration.\n */\n\nimport * as React from 'react';\nimport {\n Modal,\n ModalHeader,\n ModalTitle,\n ModalClose,\n ModalBody,\n ModalFooter,\n} from '../Modal';\nimport { Button } from '../Button';\nimport { Slider } from '../Slider';\n\nexport interface SilenceSettingsModalProps {\n isOpen: boolean;\n onClose: () => void;\n /** Current minimum silence duration (ms) */\n minSilenceMs: number;\n /** Current paragraph break threshold (ms) */\n nlSilenceMs: number;\n /** Apply new thresholds (both in ms) */\n onApply: (minSilenceMs: number, nlSilenceMs: number) => void;\n}\n\n/** Modal for configuring silence detection settings */\nexport const SilenceSettingsModal: React.FC<SilenceSettingsModalProps> = ({\n isOpen,\n onClose,\n minSilenceMs,\n nlSilenceMs,\n onApply,\n}) => {\n const [threshold, setThreshold] = React.useState(minSilenceMs / 1000);\n const [nlThreshold, setNlThreshold] = React.useState(nlSilenceMs / 1000);\n\n // Reset when the modal opens\n React.useEffect(() => {\n if (isOpen) {\n setThreshold(minSilenceMs / 1000);\n setNlThreshold(nlSilenceMs / 1000);\n }\n }, [isOpen, minSilenceMs, nlSilenceMs]);\n\n const handleApply = () => {\n // Ensure nlThreshold is always >= threshold\n const finalNlThreshold = Math.max(nlThreshold, threshold);\n onApply(Math.round(threshold * 1000), Math.round(finalNlThreshold * 1000));\n onClose();\n };\n\n // Auto-adjust newline threshold if it would be less than the min threshold\n const handleThresholdChange = (value: number) => {\n setThreshold(value);\n if (nlThreshold < value) {\n setNlThreshold(value);\n }\n };\n\n const formatSeconds = (v: number) => `${v.toFixed(1)}s`;\n\n return (\n <Modal\n open={isOpen}\n onOpenChange={(open) => {\n if (!open) onClose();\n }}\n size=\"md\"\n >\n <ModalHeader>\n <ModalTitle>Silence Settings</ModalTitle>\n <ModalClose aria-label=\"Close modal\" />\n </ModalHeader>\n\n <ModalBody className=\"flex flex-col gap-6\">\n <div className=\"flex flex-col gap-1\">\n <Slider\n label=\"Minimum silence duration\"\n min={0.1}\n max={2}\n step={0.1}\n value={threshold}\n onValueChange={handleThresholdChange}\n showValue\n formatValue={formatSeconds}\n aria-label=\"Minimum silence duration\"\n />\n <p className=\"text-muted-foreground m-0 text-xs\">\n Gaps shorter than this will not be shown as silences.\n </p>\n </div>\n\n <div className=\"flex flex-col gap-1\">\n <Slider\n label=\"Paragraph break threshold\"\n min={threshold}\n max={5}\n step={0.1}\n value={nlThreshold}\n onValueChange={setNlThreshold}\n showValue\n formatValue={formatSeconds}\n aria-label=\"Paragraph break threshold\"\n />\n <p className=\"text-muted-foreground m-0 text-xs\">\n Silences longer than this will create paragraph breaks.\n </p>\n </div>\n </ModalBody>\n\n <ModalFooter>\n <Button variant=\"secondary\" size=\"sm\" onClick={onClose}>\n Cancel\n </Button>\n <Button variant=\"primary\" size=\"sm\" onClick={handleApply}>\n Apply\n </Button>\n </ModalFooter>\n </Modal>\n );\n};\n\nSilenceSettingsModal.displayName = 'SilenceSettingsModal';\n","/**\n * SpeedMarkerMenu — context-menu popup for setting per-word speed markers.\n *\n * Ported from pulseclip's TranscriptViewer for @mieweb/ui. Hand-built (plain\n * elements + tokens): a positioned context menu has no @mieweb/ui primitive.\n */\n\nimport * as React from 'react';\nimport type { PlaybackSpeed, SpeedMarker } from '../TranscriptView/transcript';\nimport { PLAYBACK_SPEEDS } from '../TranscriptView/transcript';\n\nexport interface SpeedMarkerMenuProps {\n isOpen: boolean;\n /** Viewport coordinates for the menu (already clamped by the caller) */\n position: { x: number; y: number } | null;\n /** The edited-word index the menu applies to */\n wordIndex: number | null;\n /** Existing marker at that word, if any */\n currentMarker: SpeedMarker | undefined;\n defaultSpeed: PlaybackSpeed;\n onSetSpeed: (speed: PlaybackSpeed) => void;\n onRemoveMarker: () => void;\n onClose: () => void;\n}\n\n/** Popup menu for setting speed markers on a word */\nexport const SpeedMarkerMenu: React.FC<SpeedMarkerMenuProps> = ({\n isOpen,\n position,\n currentMarker,\n defaultSpeed,\n onSetSpeed,\n onRemoveMarker,\n onClose,\n}) => {\n const menuRef = React.useRef<HTMLDivElement>(null);\n\n // Close on escape or click outside\n React.useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'Escape') onClose();\n };\n const handleClickOutside = (e: MouseEvent) => {\n if (menuRef.current && !menuRef.current.contains(e.target as Node)) {\n onClose();\n }\n };\n if (isOpen) {\n document.addEventListener('keydown', handleKeyDown);\n document.addEventListener('mousedown', handleClickOutside);\n return () => {\n document.removeEventListener('keydown', handleKeyDown);\n document.removeEventListener('mousedown', handleClickOutside);\n };\n }\n }, [isOpen, onClose]);\n\n if (!isOpen || !position) return null;\n\n return (\n <div\n ref={menuRef}\n className=\"border-border bg-card text-card-foreground fixed z-50 min-w-36 overflow-hidden rounded-lg border shadow-lg\"\n style={{ left: position.x, top: position.y }}\n role=\"menu\"\n aria-label=\"Set speed marker\"\n >\n <div className=\"border-border text-muted-foreground border-b px-3 py-1.5 text-xs font-semibold\">\n Set Speed Marker\n </div>\n <div className=\"flex flex-col p-1\">\n {PLAYBACK_SPEEDS.map((speed) => {\n const isActive = currentMarker?.speed === speed;\n const isDefault = speed === defaultSpeed && !currentMarker;\n return (\n <button\n key={speed}\n type=\"button\"\n className={`focus-visible:ring-ring flex items-center justify-between gap-2 rounded-md px-2.5 py-1 text-left text-sm transition-colors focus-visible:ring-2 focus-visible:outline-none ${\n isActive\n ? 'bg-primary-600 font-medium text-white'\n : 'text-foreground hover:bg-muted'\n }`}\n onClick={() => {\n onSetSpeed(speed);\n onClose();\n }}\n role=\"menuitem\"\n >\n {speed}x\n {isDefault && (\n <span className=\"text-muted-foreground text-xs\">default</span>\n )}\n </button>\n );\n })}\n </div>\n {currentMarker && (\n <button\n type=\"button\"\n className=\"border-border text-destructive hover:bg-destructive/10 focus-visible:ring-ring w-full border-t px-2.5 py-1.5 text-left text-sm transition-colors focus-visible:ring-2 focus-visible:outline-none\"\n onClick={() => {\n onRemoveMarker();\n onClose();\n }}\n role=\"menuitem\"\n >\n Remove Marker\n </button>\n )}\n </div>\n );\n};\n\nSpeedMarkerMenu.displayName = 'SpeedMarkerMenu';\n","/**\n * ScriptPanel — the transcript \"script\" as editable YAML/JSON, side by side\n * with the editor.\n *\n * Two sources: \"Editor\" is the live edit state (EditableWord[], remapped as\n * you edit) and can be edited as text and applied back; \"Original\" is the\n * canonical transcript (immutable, read-only). The panel live-follows the\n * editor until you start typing; Apply parses + validates and replaces the\n * edit state (undo-safe via useTranscriptEdits.replaceEditedWords).\n *\n * js-yaml is loaded lazily on first use (same pattern as Markdown's\n * SurveyBlock) so it stays out of the MediaEditor bundle.\n */\n\nimport * as React from 'react';\nimport { Button } from '../Button';\nimport type {\n Transcript,\n EditableWord,\n TranscriptWord,\n} from '../TranscriptView/transcript';\n\nlet yamlPromise: Promise<typeof import('js-yaml')> | null = null;\nfunction loadYaml() {\n yamlPromise ??= import(/* @vite-ignore */ 'js-yaml');\n return yamlPromise;\n}\n\nexport interface ScriptPanelProps {\n /** The canonical transcript (read-only source) */\n transcript: Transcript;\n /** The live edit state (editable source) */\n editedWords: EditableWord[];\n /** Apply parsed script back into the editor */\n onApply: (words: EditableWord[]) => void;\n /** Close the panel */\n onClose: () => void;\n className?: string;\n}\n\ntype ScriptSource = 'editor' | 'original';\ntype ScriptFormat = 'yaml' | 'json';\n\n/** Parse + validate script text into EditableWord[]; throws with a readable message. */\nasync function parseScript(\n text: string,\n format: ScriptFormat\n): Promise<EditableWord[]> {\n let data: unknown;\n if (format === 'json') {\n data = JSON.parse(text);\n } else {\n const yaml = await loadYaml();\n data = yaml.load(text);\n }\n if (!Array.isArray(data)) {\n throw new Error('Script must be a list of word entries.');\n }\n return data.map((raw, i) => {\n const ew = raw as {\n originalIndex?: unknown;\n deleted?: unknown;\n inserted?: unknown;\n word?: Record<string, unknown>;\n };\n const w = ew.word;\n if (\n !w ||\n typeof w.text !== 'string' ||\n typeof w.startMs !== 'number' ||\n typeof w.endMs !== 'number'\n ) {\n throw new Error(\n `Entry ${i + 1}: each entry needs word.text, word.startMs and word.endMs.`\n );\n }\n if (\n w.wordType !== undefined &&\n w.wordType !== 'word' &&\n w.wordType !== 'silence' &&\n w.wordType !== 'silence-newline'\n ) {\n throw new Error(\n `Entry ${i + 1}: wordType must be 'word', 'silence' or 'silence-newline'.`\n );\n }\n const word: TranscriptWord = {\n text: w.text,\n startMs: w.startMs,\n endMs: w.endMs,\n ...(typeof w.wordType === 'string'\n ? { wordType: w.wordType as TranscriptWord['wordType'] }\n : {}),\n ...(typeof w.speakerId === 'string' ? { speakerId: w.speakerId } : {}),\n };\n return {\n originalIndex:\n typeof ew.originalIndex === 'number' ? ew.originalIndex : -1,\n deleted: Boolean(ew.deleted),\n ...(ew.inserted !== undefined ? { inserted: Boolean(ew.inserted) } : {}),\n word,\n } as EditableWord;\n });\n}\n\nexport const ScriptPanel: React.FC<ScriptPanelProps> = ({\n transcript,\n editedWords,\n onApply,\n onClose,\n className,\n}) => {\n const [source, setSource] = React.useState<ScriptSource>('editor');\n const [format, setFormat] = React.useState<ScriptFormat>('yaml');\n const [text, setText] = React.useState('');\n const [dirty, setDirty] = React.useState(false);\n const [error, setError] = React.useState<string | null>(null);\n\n const readOnly = source === 'original';\n\n // Live-follow the selected source until the user starts editing.\n React.useEffect(() => {\n if (dirty) return;\n let cancelled = false;\n const data = source === 'original' ? transcript : editedWords;\n (async () => {\n const serialized =\n format === 'json'\n ? JSON.stringify(data, null, 2)\n : (await loadYaml()).dump(data, { lineWidth: 120 });\n if (!cancelled) {\n setText(serialized);\n setError(null);\n }\n })();\n return () => {\n cancelled = true;\n };\n }, [source, format, transcript, editedWords, dirty]);\n\n const handleApply = async () => {\n try {\n const words = await parseScript(text, format);\n onApply(words);\n setDirty(false);\n setError(null);\n } catch (err) {\n setError(\n err instanceof Error ? err.message : 'Could not parse the script.'\n );\n }\n };\n\n const handleReset = () => {\n setDirty(false);\n setError(null);\n };\n\n const sourceButton = (value: ScriptSource, label: string) => (\n <button\n type=\"button\"\n onClick={() => {\n setSource(value);\n setDirty(false);\n setError(null);\n }}\n aria-pressed={source === value}\n className={`focus-visible:ring-ring rounded px-1.5 py-0.5 text-xs transition-colors focus-visible:ring-2 focus-visible:outline-none ${\n source === value\n ? 'bg-primary-800 font-medium text-white'\n : 'text-muted-foreground hover:bg-muted hover:text-foreground'\n }`}\n >\n {label}\n </button>\n );\n\n return (\n <aside\n className={`border-border bg-card flex w-80 shrink-0 flex-col border-l lg:w-96 ${className ?? ''}`}\n aria-label=\"Transcript script\"\n >\n <div className=\"border-border flex shrink-0 flex-wrap items-center gap-1.5 border-b px-3 py-2\">\n <span className=\"text-foreground text-xs font-semibold\">Script</span>\n <span className=\"bg-border mx-1 h-4 w-px\" aria-hidden=\"true\" />\n {sourceButton('editor', 'Editor')}\n {sourceButton('original', 'Original')}\n <span className=\"bg-border mx-1 h-4 w-px\" aria-hidden=\"true\" />\n <button\n type=\"button\"\n onClick={() => {\n setFormat(format === 'yaml' ? 'json' : 'yaml');\n setDirty(false);\n setError(null);\n }}\n className=\"text-muted-foreground hover:bg-muted hover:text-foreground focus-visible:ring-ring rounded px-1.5 py-0.5 text-xs transition-colors focus-visible:ring-2 focus-visible:outline-none\"\n title=\"Toggle YAML / JSON\"\n >\n {format.toUpperCase()}\n </button>\n <span className=\"text-muted-foreground ml-auto text-[10px]\">\n {readOnly ? 'read-only' : dirty ? 'edited' : 'live'}\n </span>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={onClose}\n aria-label=\"Close script panel\"\n >\n ✕\n </Button>\n </div>\n\n <textarea\n value={text}\n readOnly={readOnly}\n spellCheck={false}\n onChange={(e) => {\n setText(e.target.value);\n setDirty(true);\n }}\n className=\"text-foreground min-h-0 flex-1 resize-none bg-transparent p-3 font-mono text-xs leading-relaxed focus:outline-none\"\n aria-label={`Script source (${source}, ${format.toUpperCase()})`}\n />\n\n {error && (\n <p\n className=\"border-border text-destructive m-0 shrink-0 border-t px-3 py-2 text-xs\"\n role=\"alert\"\n >\n {error}\n </p>\n )}\n\n {!readOnly && (\n <div className=\"border-border flex shrink-0 items-center gap-2 border-t px-3 py-2\">\n <Button size=\"sm\" onClick={handleApply} disabled={!dirty}>\n Apply\n </Button>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={handleReset}\n disabled={!dirty}\n title=\"Throw away unapplied typing and re-sync from the editor\"\n >\n Discard\n </Button>\n <span className=\"text-muted-foreground text-[10px]\">\n Apply pushes into the editor &mdash; revert an applied change with\n Undo\n </span>\n </div>\n )}\n </aside>\n );\n};\n","/**\n * MediaEditor — media playback + editable word-level transcript.\n *\n * Composition of MediaPlayer (imperative MediaPlayerRef) and an editable\n * word-mode transcript, with all edit state held by useTranscriptEdits.\n * Ported from pulseclip's TranscriptViewer; UI-only state (cursor,\n * selection, modals, sequence-playback bookkeeping) lives here.\n *\n * Controlled + persistence-agnostic: edits flow out via\n * onEditorStateChange / onEditedWordsRender and back in via\n * initialEditedWords / initialUndoStack. Timestamps in ms.\n */\n\nimport * as React from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { Button } from '../Button';\nimport { Select } from '../Select';\nimport type {\n Transcript,\n TranscriptWord,\n EditableWord,\n PlaybackSegment,\n PlaybackSpeed,\n} from '../TranscriptView/transcript';\nimport { PLAYBACK_SPEEDS, isSilenceType } from '../TranscriptView/transcript';\nimport { useTranscriptEdits } from '../../hooks/useTranscriptEdits';\nimport {\n MediaPlayer,\n type MediaPlayerRef,\n type MediaKind,\n} from '../MediaPlayer/MediaPlayer';\nimport { FillerWordsModal } from './FillerWordsModal';\nimport { WordEditorModal } from './WordEditorModal';\nimport { SilenceSettingsModal } from './SilenceSettingsModal';\nimport { SpeedMarkerMenu } from './SpeedMarkerMenu';\nimport { ScriptPanel } from './ScriptPanel';\n\n// ============================================================================\n// Types & Interfaces\n// ============================================================================\n\nexport interface MediaEditorProps extends VariantProps<\n typeof mediaEditorVariants\n> {\n /** Media URL */\n src: string;\n /** Force the media kind; inferred from the src extension when omitted */\n kind?: MediaKind;\n /** The source transcript (canonical, immutable) */\n transcript: Transcript;\n /** Initial edited words (from saved edits) */\n initialEditedWords?: EditableWord[];\n /** Initial undo stack (from saved edits) */\n initialUndoStack?: EditableWord[][];\n /** Fired after every edit mutation (for persistence) */\n onEditorStateChange?: (\n editedWords: EditableWord[],\n undoStack: EditableWord[][]\n ) => void;\n /** Fired when the hasEdits flag changes */\n onHasEditsChange?: (hasEdits: boolean) => void;\n /** Fired when the cursor moves (start time of the cursor word in ms, or null) */\n onCursorTimestampChange?: (timestampMs: number | null) => void;\n /** Fired whenever the edited words change — lets the host build raw-data views */\n onEditedWordsRender?: (editedWords: EditableWord[]) => void;\n /** Optional ref to the internal MediaPlayer (host escape hatch, e.g. thumbnail capture) */\n playerRef?: React.Ref<MediaPlayerRef>;\n /** Additional class name */\n className?: string;\n /**\n * 'horizontal' (default): media stacked above the transcript.\n * 'vertical': media and transcript side by side.\n */\n splitLayout?: 'horizontal' | 'vertical';\n}\n\ninterface SelectionRange {\n start: number;\n end: number;\n}\n\n// ============================================================================\n// Variants\n// ============================================================================\n\nconst mediaEditorVariants = cva(\n // Root is always a row so the ScriptPanel can dock on the right; the\n // media/transcript split direction lives on the inner wrapper below.\n 'flex h-full min-h-0 w-full overflow-hidden rounded-xl border border-border bg-card text-card-foreground',\n {\n variants: {\n splitLayout: {\n horizontal: '',\n vertical: '',\n },\n },\n defaultVariants: {\n splitLayout: 'horizontal',\n },\n }\n);\n\n// ============================================================================\n// Helpers\n// ============================================================================\n\n/** Format duration: seconds only if <90s, min:sec if <60min, h:mm:ss otherwise */\nfunction formatDuration(ms: number): string {\n const totalSeconds = Math.round(ms / 1000);\n if (totalSeconds < 90) {\n return `${totalSeconds}s`;\n }\n const hours = Math.floor(totalSeconds / 3600);\n const minutes = Math.floor((totalSeconds % 3600) / 60);\n const seconds = totalSeconds % 60;\n if (hours > 0) {\n return `${hours}:${String(minutes).padStart(2, '0')}:${String(seconds).padStart(2, '0')}`;\n }\n return `${minutes}:${String(seconds).padStart(2, '0')}`;\n}\n\ninterface WordVisualState {\n isActive: boolean;\n isCursor: boolean;\n isSelected: boolean;\n isDeleted: boolean;\n isInserted: boolean;\n isSilence: boolean;\n isSilenceNewline: boolean;\n isAnchor: boolean;\n isFocused: boolean;\n hasSpeedMarker: boolean;\n}\n\n/**\n * Tailwind classes for one transcript word. Background/color states are\n * mutually exclusive (precedence: anchor > active > selected > deleted >\n * inserted > silence) so token utilities never conflict.\n */\nfunction wordClassName(s: WordVisualState): string {\n const parts = [\n 'relative cursor-pointer rounded-sm px-1 py-0.5 transition-colors duration-150',\n ];\n\n if (s.isSilence) {\n parts.push('text-xs font-medium italic tracking-wide');\n }\n if (s.isSilenceNewline) {\n parts.push('mt-1.5 block w-fit');\n }\n\n if (s.isAnchor) {\n parts.push('bg-warning/40 outline outline-2 outline-warning');\n } else if (s.isActive) {\n parts.push('bg-primary-800 font-medium text-white');\n } else if (s.isSelected && s.isFocused) {\n parts.push('bg-primary-500/40');\n } else if (s.isDeleted) {\n parts.push(\n 'bg-destructive/10 text-destructive line-through opacity-40 hover:bg-destructive/20 hover:opacity-70'\n );\n } else if (s.isInserted) {\n parts.push('bg-success/15 text-success hover:bg-success/25');\n } else if (s.isSilenceNewline) {\n parts.push('text-primary-500 hover:bg-primary-500/15');\n } else if (s.isSilence) {\n parts.push(\n 'border border-dashed border-border bg-muted text-muted-foreground hover:bg-muted/70'\n );\n } else {\n parts.push('hover:bg-primary-500/30');\n }\n\n // Keep the strikethrough visible when a deleted word is also active/selected/anchored\n if (\n s.isDeleted &&\n (s.isActive || (s.isSelected && s.isFocused) || s.isAnchor)\n ) {\n parts.push('line-through opacity-60');\n }\n\n // Cursor outline only when the transcript has focus (source behavior)\n if (s.isCursor && s.isFocused && !s.isAnchor) {\n if (s.isDeleted) {\n parts.push('outline outline-2 outline-offset-1 outline-destructive');\n } else if (s.isActive) {\n parts.push('outline outline-2 outline-offset-1 outline-background');\n } else {\n parts.push('outline outline-2 outline-offset-1 outline-primary-500');\n }\n }\n\n if (s.hasSpeedMarker) {\n parts.push('ml-0.5 border-l-[3px] border-l-warning pl-1.5');\n }\n\n return parts.join(' ');\n}\n\n/** Blinking caret rendered inside the cursor word */\nconst Caret: React.FC<{ side: 'before' | 'after' }> = ({ side }) => (\n <span\n aria-hidden=\"true\"\n className={`bg-primary-500 absolute top-0.5 bottom-0.5 w-0.5 motion-safe:animate-pulse ${\n side === 'before' ? '-left-px' : 'right-0.5'\n }`}\n />\n);\n\n// ============================================================================\n// Component\n// ============================================================================\n\n/**\n * Media editor: MediaPlayer on top, an editable word-mode transcript below,\n * and a toolbar with speed control, filler removal, and edit statistics.\n *\n * Interactions (ported from pulseclip's TranscriptViewer):\n * - Click a word: seek and play just that word\n * - Double-click: set a range anchor; click another word to select the range\n * - Mouse-down + drag: select a range; long-press (500ms) opens the editor\n * - Right-click: speed marker menu\n * - Keyboard: arrows (+Shift to select), Home/End, Backspace/Delete toggle\n * delete, Cmd/Ctrl+X/C/V cut/copy/paste, Cmd/Ctrl+Z undo, Space plays the\n * edited timeline from the cursor, Enter opens the word editor\n */\nexport const MediaEditor = React.forwardRef<HTMLDivElement, MediaEditorProps>(\n (\n {\n src,\n kind,\n transcript,\n initialEditedWords,\n initialUndoStack,\n onEditorStateChange,\n onHasEditsChange,\n onCursorTimestampChange,\n onEditedWordsRender,\n playerRef: externalPlayerRef,\n className,\n splitLayout,\n },\n ref\n ) => {\n // -- Edit state (headless hook) --\n const edits = useTranscriptEdits({\n transcript,\n initialEditedWords,\n initialUndoStack,\n onChange: onEditorStateChange,\n });\n const {\n editedWords,\n undoStack,\n clipboard,\n hasEdits,\n undo,\n toggleWordDeleted,\n deleteRange,\n cut,\n copy,\n paste,\n setWordText,\n splitSilence,\n deleteWord,\n replaceEditedWords,\n removeFillers,\n setSilenceThresholds,\n silenceThresholds,\n speedMarkers,\n defaultSpeed,\n setDefaultSpeed,\n toggleSpeedMarker,\n removeSpeedMarker,\n getSpeedAtIndex,\n getSpeedMarkerAtIndex,\n playbackSegments,\n stats,\n fillerAnalysis,\n } = edits;\n\n // -- UI state --\n const [activeWordIndex, setActiveWordIndex] = React.useState<number | null>(\n null\n );\n const [cursorIndex, setCursorIndex] = React.useState<number>(0);\n // 'before' = caret before the cursor word; 'after' = after the last word\n const [cursorPosition, setCursorPosition] = React.useState<\n 'before' | 'after'\n >('before');\n const [selectionAnchor, setSelectionAnchor] = React.useState<number | null>(\n null\n );\n const [selection, setSelection] = React.useState<SelectionRange | null>(\n null\n );\n const [doubleClickAnchor, setDoubleClickAnchor] = React.useState<\n number | null\n >(null);\n const [isPlayingSequence, setIsPlayingSequence] = React.useState(false);\n const [isFocused, setIsFocused] = React.useState(false);\n const [showFillerModal, setShowFillerModal] = React.useState(false);\n const [showSilenceModal, setShowSilenceModal] = React.useState(false);\n const [showScriptPanel, setShowScriptPanel] = React.useState(false);\n const [editorWordIndex, setEditorWordIndex] = React.useState<number | null>(\n null\n );\n const [speedMenuWordIndex, setSpeedMenuWordIndex] = React.useState<\n number | null\n >(null);\n const [speedMenuPosition, setSpeedMenuPosition] = React.useState<{\n x: number;\n y: number;\n } | null>(null);\n\n // -- Refs --\n const playerRef = React.useRef<MediaPlayerRef>(null);\n // Mirror the internal player handle to the host-provided ref via a STABLE\n // delegating proxy: every call forwards to playerRef.current at call time.\n // (Snapshotting playerRef.current with [] deps captured the first-commit\n // handle — ref assignment doesn't re-render, so hosts could hold a stale\n // handle whose mediaElement stayed null forever.)\n React.useImperativeHandle(\n externalPlayerRef,\n (): MediaPlayerRef => ({\n seekToMs: (timeMs) => playerRef.current?.seekToMs(timeMs),\n play: () => playerRef.current?.play(),\n pause: () => playerRef.current?.pause(),\n getCurrentTimeMs: () => playerRef.current?.getCurrentTimeMs() ?? 0,\n getDurationMs: () => playerRef.current?.getDurationMs() ?? 0,\n isPaused: () => playerRef.current?.isPaused() ?? true,\n setPlaybackRate: (rate) => playerRef.current?.setPlaybackRate(rate),\n get mediaElement() {\n return playerRef.current?.mediaElement ?? null;\n },\n }),\n []\n );\n const contentRef = React.useRef<HTMLDivElement>(null);\n const userSetCursor = React.useRef<number | null>(null);\n const isDragging = React.useRef<boolean>(false);\n const longPressTimer = React.useRef<ReturnType<typeof setTimeout> | null>(\n null\n );\n const longPressTriggered = React.useRef<boolean>(false);\n const wordPlaybackStartMs = React.useRef<number | null>(null);\n const wordPlaybackEndMs = React.useRef<number | null>(null);\n // Edited-timeline sequence playback\n const sequenceSegments = React.useRef<PlaybackSegment[]>([]);\n const currentSegmentIndex = React.useRef<number>(0);\n\n // ------------------------------------------------------------------\n // Parent notifications\n // ------------------------------------------------------------------\n\n React.useEffect(() => {\n onHasEditsChange?.(hasEdits);\n }, [hasEdits, onHasEditsChange]);\n\n React.useEffect(() => {\n onEditedWordsRender?.(editedWords);\n }, [editedWords, onEditedWordsRender]);\n\n // Report cursor timestamp changes to the parent\n React.useEffect(() => {\n if (onCursorTimestampChange) {\n const word = editedWords[cursorIndex];\n if (word && !word.deleted) {\n onCursorTimestampChange(word.word.startMs);\n } else {\n onCursorTimestampChange(null);\n }\n }\n }, [cursorIndex, editedWords, onCursorTimestampChange]);\n\n // ------------------------------------------------------------------\n // Transcript change / cursor sync / focus\n // ------------------------------------------------------------------\n\n // Reset UI state when the transcript changes (edit state resets in the hook)\n const prevTranscriptRef = React.useRef(transcript);\n React.useEffect(() => {\n if (prevTranscriptRef.current === transcript) return;\n prevTranscriptRef.current = transcript;\n setCursorIndex(0);\n setCursorPosition('before');\n setSelection(null);\n setSelectionAnchor(null);\n setDoubleClickAnchor(null);\n setActiveWordIndex(null);\n setIsPlayingSequence(false);\n sequenceSegments.current = [];\n currentSegmentIndex.current = 0;\n }, [transcript]);\n\n // Sync cursor with the active word while playing (unless a click-seek is pending)\n React.useEffect(() => {\n if (userSetCursor.current !== null) {\n return;\n }\n if (activeWordIndex !== null && activeWordIndex >= 0) {\n setCursorIndex(activeWordIndex);\n setCursorPosition('before');\n setSelection(null);\n setSelectionAnchor(null);\n }\n }, [activeWordIndex]);\n\n // Auto-scroll the active word into view during playback\n React.useEffect(() => {\n if (activeWordIndex === null) return;\n const el = contentRef.current?.querySelector(\n `[data-word-index=\"${activeWordIndex}\"]`\n );\n el?.scrollIntoView({ block: 'nearest', behavior: 'smooth' });\n }, [activeWordIndex]);\n\n // Auto-focus the transcript for keyboard navigation\n React.useEffect(() => {\n contentRef.current?.focus();\n }, [transcript]);\n\n // Apply the default speed when it changes (and no marker overrides it)\n React.useEffect(() => {\n const player = playerRef.current;\n if (!player) return;\n const timeMs = player.getCurrentTimeMs();\n const currentWordIndex = editedWords.findIndex(\n (ew) =>\n !ew.deleted && timeMs >= ew.word.startMs && timeMs < ew.word.endMs\n );\n const targetSpeed =\n currentWordIndex >= 0\n ? getSpeedAtIndex(currentWordIndex)\n : defaultSpeed;\n player.setPlaybackRate(targetSpeed);\n }, [defaultSpeed, speedMarkers, editedWords, getSpeedAtIndex]);\n\n // ------------------------------------------------------------------\n // Playback engine (timeupdate-driven)\n // ------------------------------------------------------------------\n\n const handleTimeUpdate = (timeMs: number) => {\n const player = playerRef.current;\n if (!player) return;\n\n // Segment-based playback of the edited timeline (jumps over deletions\n // and honors reordered/pasted words)\n if (isPlayingSequence && sequenceSegments.current.length > 0) {\n const currentSeg =\n sequenceSegments.current[currentSegmentIndex.current];\n if (currentSeg && timeMs >= currentSeg.endMs) {\n const nextIndex = currentSegmentIndex.current + 1;\n if (nextIndex < sequenceSegments.current.length) {\n currentSegmentIndex.current = nextIndex;\n player.seekToMs(sequenceSegments.current[nextIndex].startMs);\n } else {\n // End of all segments\n player.pause();\n setIsPlayingSequence(false);\n sequenceSegments.current = [];\n currentSegmentIndex.current = 0;\n }\n }\n } else if (hasEdits && !player.isPaused()) {\n // During normal playback with edits, skip over deleted words\n const inDeletedWord = editedWords.some(\n (ew) =>\n ew.deleted && timeMs >= ew.word.startMs && timeMs < ew.word.endMs\n );\n if (inDeletedWord) {\n const nextNonDeleted = editedWords.find(\n (ew) => !ew.deleted && ew.word.startMs >= timeMs\n );\n if (nextNonDeleted) {\n player.seekToMs(nextNonDeleted.word.startMs);\n }\n }\n }\n\n // Stop playback at the end of single-word playback, reseek to its start\n if (\n wordPlaybackEndMs.current !== null &&\n timeMs >= wordPlaybackEndMs.current\n ) {\n player.pause();\n if (wordPlaybackStartMs.current !== null) {\n player.seekToMs(wordPlaybackStartMs.current);\n wordPlaybackStartMs.current = null;\n }\n wordPlaybackEndMs.current = null;\n }\n\n // Find the active word. During segment playback use the current\n // segment's indices (disambiguates duplicate/pasted words that share\n // timing); otherwise fall back to a time-based lookup.\n let editedIndex = -1;\n if (isPlayingSequence && sequenceSegments.current.length > 0) {\n const currentSeg =\n sequenceSegments.current[currentSegmentIndex.current];\n if (currentSeg) {\n for (const idx of currentSeg.editedIndices) {\n const ew = editedWords[idx];\n if (\n ew &&\n !ew.deleted &&\n timeMs >= ew.word.startMs &&\n timeMs < ew.word.endMs\n ) {\n editedIndex = idx;\n break;\n }\n }\n }\n }\n if (editedIndex === -1) {\n editedIndex = editedWords.findIndex(\n (ew) =>\n !ew.deleted && timeMs >= ew.word.startMs && timeMs < ew.word.endMs\n );\n }\n\n // Update playback rate from speed markers when the word changes\n if (editedIndex !== activeWordIndex && editedIndex >= 0) {\n player.setPlaybackRate(getSpeedAtIndex(editedIndex));\n }\n setActiveWordIndex(editedIndex >= 0 ? editedIndex : null);\n\n // Playback has resumed reporting time: release the click-seek cursor lock\n userSetCursor.current = null;\n };\n\n const stopSequencePlayback = () => {\n setIsPlayingSequence(false);\n sequenceSegments.current = [];\n currentSegmentIndex.current = 0;\n };\n\n // ------------------------------------------------------------------\n // Selection / clipboard helpers\n // ------------------------------------------------------------------\n\n /** Indices covered by the selection, or the cursor word */\n const selectionIndices = React.useCallback((): number[] => {\n if (selection) {\n const indices: number[] = [];\n for (let i = selection.start; i <= selection.end; i++) indices.push(i);\n return indices;\n }\n return [cursorIndex];\n }, [selection, cursorIndex]);\n\n const handleCut = React.useCallback(() => {\n cut(selectionIndices());\n }, [cut, selectionIndices]);\n\n const handlePaste = React.useCallback(() => {\n if (!clipboard) return;\n const pastedCount = clipboard.words.length;\n const insertIndex = paste(cursorIndex, cursorPosition !== 'after');\n if (insertIndex !== null) {\n setCursorIndex(insertIndex + pastedCount - 1);\n setCursorPosition('after');\n setSelection(null);\n setSelectionAnchor(null);\n }\n }, [clipboard, paste, cursorIndex, cursorPosition]);\n\n // Toggle deleted state for the selection (anchor decides) or cursor word\n const handleDeleteToggle = React.useCallback(() => {\n if (selection) {\n const anchorIndex = selectionAnchor ?? selection.start;\n const indices: number[] = [anchorIndex];\n for (let i = selection.start; i <= selection.end; i++) {\n if (i !== anchorIndex) indices.push(i);\n }\n deleteRange(indices);\n } else {\n toggleWordDeleted(cursorIndex);\n }\n }, [\n selection,\n selectionAnchor,\n cursorIndex,\n deleteRange,\n toggleWordDeleted,\n ]);\n\n // Copy: put plain text on the system clipboard + fill the internal clipboard\n const handleCopy = React.useCallback(\n (e: React.ClipboardEvent) => {\n const indices = selectionIndices();\n const selectedWords = indices\n .map((i) => editedWords[i])\n .filter((ew): ew is EditableWord => ew !== undefined && !ew.deleted);\n if (selectedWords.length === 0) return;\n const selectedText = selectedWords\n .filter((ew) => !isSilenceType(ew.word.wordType))\n .map((ew) => ew.word.text)\n .join(' ');\n e.preventDefault();\n e.clipboardData.setData('text/plain', selectedText);\n copy(indices);\n },\n [selectionIndices, editedWords, copy]\n );\n\n // ------------------------------------------------------------------\n // Word editor modal\n // ------------------------------------------------------------------\n\n const openWordEditor = React.useCallback((index: number) => {\n setEditorWordIndex(index);\n }, []);\n\n const closeWordEditor = React.useCallback(() => {\n setEditorWordIndex(null);\n // Restore focus to the transcript after the modal closes\n setTimeout(() => contentRef.current?.focus(), 0);\n }, []);\n\n const handleEditorSave = React.useCallback(\n (newText: string) => {\n if (editorWordIndex === null) return;\n setWordText(editorWordIndex, newText);\n },\n [editorWordIndex, setWordText]\n );\n\n const handleEditorSplitSilence = React.useCallback(\n (durations: number[]) => {\n if (editorWordIndex === null) return;\n splitSilence(editorWordIndex, durations);\n },\n [editorWordIndex, splitSilence]\n );\n\n const handleEditorDelete = React.useCallback(() => {\n if (editorWordIndex !== null) {\n deleteWord(editorWordIndex);\n closeWordEditor();\n }\n }, [editorWordIndex, deleteWord, closeWordEditor]);\n\n // ------------------------------------------------------------------\n // Mouse interactions\n // ------------------------------------------------------------------\n\n const handleWordClick = (\n word: TranscriptWord,\n index: number,\n e: React.MouseEvent\n ) => {\n setCursorIndex(index);\n setCursorPosition('before');\n userSetCursor.current = index;\n\n if (e.shiftKey && selectionAnchor !== null) {\n // Extend selection with shift+click\n setSelection({\n start: Math.min(selectionAnchor, index),\n end: Math.max(selectionAnchor, index),\n });\n } else if (\n doubleClickAnchor !== null &&\n doubleClickAnchor !== index &&\n !isDragging.current\n ) {\n // A double-click anchor exists and a different word was clicked: select the range\n const start = Math.min(doubleClickAnchor, index);\n const end = Math.max(doubleClickAnchor, index);\n setSelection({ start, end });\n setSelectionAnchor(doubleClickAnchor);\n setDoubleClickAnchor(null);\n } else if (doubleClickAnchor === index) {\n // Clicking the anchor itself — wait for a potential double-click\n } else if (!isDragging.current) {\n // Clear selection, set a new anchor, and play just this word\n setSelectionAnchor(index);\n setSelection(null);\n\n const player = playerRef.current;\n if (player) {\n player.pause();\n player.seekToMs(word.startMs);\n wordPlaybackStartMs.current = word.startMs;\n wordPlaybackEndMs.current = word.endMs;\n player.play();\n }\n }\n };\n\n const handleWordDoubleClick = (index: number, e: React.MouseEvent) => {\n e.preventDefault();\n // Don't trigger if a long press already fired\n if (longPressTriggered.current) return;\n\n if (doubleClickAnchor === index) {\n setDoubleClickAnchor(null);\n } else {\n setDoubleClickAnchor(index);\n setSelection(null);\n }\n };\n\n const handleWordMouseDown = (index: number, e: React.MouseEvent) => {\n if (e.button !== 0) return;\n\n // Long press (500ms) opens the word editor\n longPressTriggered.current = false;\n longPressTimer.current = setTimeout(() => {\n longPressTriggered.current = true;\n openWordEditor(index);\n }, 500);\n\n isDragging.current = true;\n setSelectionAnchor(index);\n setCursorIndex(index);\n setCursorPosition('before');\n setSelection(null);\n };\n\n const handleWordMouseEnter = (index: number) => {\n // Cancel the long press when dragging to another word\n if (longPressTimer.current) {\n clearTimeout(longPressTimer.current);\n longPressTimer.current = null;\n }\n\n if (!isDragging.current || selectionAnchor === null) return;\n\n setSelection({\n start: Math.min(selectionAnchor, index),\n end: Math.max(selectionAnchor, index),\n });\n setCursorIndex(index);\n };\n\n const handleMouseUp = () => {\n if (longPressTimer.current) {\n clearTimeout(longPressTimer.current);\n longPressTimer.current = null;\n }\n if (isDragging.current) {\n isDragging.current = false;\n }\n };\n\n const handleWordContextMenu = (index: number, e: React.MouseEvent) => {\n e.preventDefault();\n // Position the speed menu near the word, clamped to the viewport\n const rect = e.currentTarget.getBoundingClientRect();\n const menuHeight = 280;\n const menuWidth = 150;\n\n let x = rect.left;\n let y = rect.bottom + 4;\n\n if (x + menuWidth > window.innerWidth) {\n x = window.innerWidth - menuWidth - 8;\n }\n if (y + menuHeight > window.innerHeight) {\n y = rect.top - menuHeight - 4;\n if (y < 0) {\n y = 8;\n }\n }\n\n setSpeedMenuPosition({ x, y });\n setSpeedMenuWordIndex(index);\n };\n\n // ------------------------------------------------------------------\n // Keyboard\n // ------------------------------------------------------------------\n\n const handleKeyDown = React.useCallback(\n (e: React.KeyboardEvent) => {\n const wordCount = editedWords.length;\n if (wordCount === 0) return;\n\n let newIndex = cursorIndex;\n let handled = false;\n\n if (e.key === 'Delete' || e.key === 'Backspace') {\n handleDeleteToggle();\n handled = true;\n } else if ((e.metaKey || e.ctrlKey) && e.key === 'x') {\n handleCut();\n handled = true;\n } else if ((e.metaKey || e.ctrlKey) && e.key === 'v' && clipboard) {\n handlePaste();\n handled = true;\n } else if ((e.metaKey || e.ctrlKey) && e.key === 'z' && !e.shiftKey) {\n undo();\n handled = true;\n } else if (e.key === 'ArrowLeft') {\n if (cursorPosition === 'after') {\n // Move from 'after' the last word back to 'before' it\n setCursorPosition('before');\n } else {\n newIndex = Math.max(0, cursorIndex - 1);\n }\n handled = true;\n } else if (e.key === 'ArrowRight') {\n if (cursorIndex === wordCount - 1 && cursorPosition === 'before') {\n // At the last word: move the caret after it\n setCursorPosition('after');\n } else if (cursorPosition !== 'after') {\n newIndex = Math.min(wordCount - 1, cursorIndex + 1);\n }\n handled = true;\n } else if (e.key === 'ArrowUp' || e.key === 'ArrowDown') {\n // Find the visually nearest word on the previous/next row\n const currentElement = contentRef.current?.querySelector(\n `[data-word-index=\"${cursorIndex}\"]`\n ) as HTMLElement | null;\n if (currentElement) {\n const currentRect = currentElement.getBoundingClientRect();\n const currentCenterX = currentRect.left + currentRect.width / 2;\n\n const direction = e.key === 'ArrowUp' ? -1 : 1;\n let bestMatch = cursorIndex;\n let bestDistance = Infinity;\n let targetRowTop: number | null = null;\n\n for (\n let i = cursorIndex + direction;\n i >= 0 && i < wordCount;\n i += direction\n ) {\n const el = contentRef.current?.querySelector(\n `[data-word-index=\"${i}\"]`\n ) as HTMLElement | null;\n if (!el) continue;\n\n const rect = el.getBoundingClientRect();\n const isOnDifferentRow =\n direction === -1\n ? rect.bottom <= currentRect.top\n : rect.top >= currentRect.bottom;\n\n if (isOnDifferentRow) {\n // The first word on a different row establishes the target row\n if (targetRowTop === null) {\n targetRowTop = rect.top;\n }\n const isSameTargetRow = Math.abs(rect.top - targetRowTop) < 5;\n if (isSameTargetRow) {\n const centerX = rect.left + rect.width / 2;\n const distance = Math.abs(centerX - currentCenterX);\n if (distance < bestDistance) {\n bestDistance = distance;\n bestMatch = i;\n }\n } else {\n // Moved past the target row; stop searching\n break;\n }\n }\n }\n newIndex = bestMatch;\n }\n handled = true;\n } else if (e.key === 'Home') {\n newIndex = 0;\n handled = true;\n } else if (e.key === 'End') {\n newIndex = wordCount - 1;\n handled = true;\n } else if (e.key === 'Enter') {\n openWordEditor(cursorIndex);\n handled = true;\n } else if (e.key === ' ') {\n // Toggle play/pause from the cursor position\n const ew = editedWords[cursorIndex];\n const player = playerRef.current;\n if (player && ew && !ew.deleted) {\n if (player.isPaused()) {\n if (hasEdits) {\n // Play the edited timeline as a segment sequence\n const segments = playbackSegments;\n if (segments.length > 0) {\n let startSegmentIdx = 0;\n for (let i = 0; i < segments.length; i++) {\n if (segments[i].editedIndices.includes(cursorIndex)) {\n startSegmentIdx = i;\n break;\n }\n }\n sequenceSegments.current = segments;\n currentSegmentIndex.current = startSegmentIdx;\n setIsPlayingSequence(true);\n // Start from the cursor word's time, not the segment's start\n player.seekToMs(ew.word.startMs);\n player.play();\n }\n } else {\n // Normal playback from the cursor\n player.seekToMs(ew.word.startMs);\n player.play();\n }\n } else {\n player.pause();\n setIsPlayingSequence(false);\n }\n }\n handled = true;\n }\n\n if (handled) {\n e.preventDefault();\n e.stopPropagation();\n if (newIndex !== cursorIndex) {\n setCursorIndex(newIndex);\n setCursorPosition('before');\n }\n\n if (e.shiftKey && e.key !== 'Delete' && e.key !== 'Backspace') {\n // Extend the selection (not for delete operations)\n const anchor = selectionAnchor ?? cursorIndex;\n if (selectionAnchor === null) {\n setSelectionAnchor(cursorIndex);\n }\n setSelection({\n start: Math.min(anchor, newIndex),\n end: Math.max(anchor, newIndex),\n });\n } else if (!e.metaKey && !e.ctrlKey) {\n // Clear the selection when moving without shift (not for cut/paste)\n setSelection(null);\n setSelectionAnchor(null);\n }\n\n // Scroll the cursor into view\n const wordElement = contentRef.current?.querySelector(\n `[data-word-index=\"${newIndex}\"]`\n );\n wordElement?.scrollIntoView({ block: 'nearest', behavior: 'smooth' });\n }\n },\n [\n editedWords,\n cursorIndex,\n cursorPosition,\n selectionAnchor,\n clipboard,\n hasEdits,\n playbackSegments,\n handleDeleteToggle,\n handleCut,\n handlePaste,\n undo,\n openWordEditor,\n ]\n );\n\n // ------------------------------------------------------------------\n // Rendering\n // ------------------------------------------------------------------\n\n const isWordSelected = (index: number): boolean => {\n if (!selection) return false;\n return index >= selection.start && index <= selection.end;\n };\n\n const renderWord = (ew: EditableWord, index: number) => {\n const isActive = index === activeWordIndex;\n const isCursor = index === cursorIndex;\n const isSelected = isWordSelected(index);\n const isDeleted = ew.deleted;\n const isInserted = ew.inserted ?? false;\n const isSilence =\n ew.word.wordType === 'silence' ||\n ew.word.wordType === 'silence-newline';\n const isSilenceNewline = ew.word.wordType === 'silence-newline';\n const isAnchor = index === doubleClickAnchor;\n const showCursorBefore = isCursor && cursorPosition === 'before';\n const showCursorAfter =\n isCursor &&\n cursorPosition === 'after' &&\n index === editedWords.length - 1;\n const speedMarker = getSpeedMarkerAtIndex(index);\n const hasSpeedMarker = !!speedMarker;\n\n // For silences, show the duration adjusted for the effective speed\n const effectiveSpeed = getSpeedAtIndex(index);\n let displayText = ew.word.text;\n if (isSilence && effectiveSpeed !== 1) {\n const originalDurationMs = ew.word.endMs - ew.word.startMs;\n const adjustedDurationSec = originalDurationMs / effectiveSpeed / 1000;\n displayText = `[${adjustedDurationSec.toFixed(1)}s]`;\n }\n\n const title = `${ew.word.startMs}ms - ${ew.word.endMs}ms${\n ew.word.confidence ? ` (${Math.round(ew.word.confidence * 100)}%)` : ''\n }${\n isSilence\n ? ` [SILENCE: ${((ew.word.endMs - ew.word.startMs) / 1000).toFixed(1)}s${\n effectiveSpeed !== 1\n ? ` → ${((ew.word.endMs - ew.word.startMs) / effectiveSpeed / 1000).toFixed(1)}s @ ${effectiveSpeed}x`\n : ''\n }]`\n : ''\n }${isDeleted ? ' [DELETED]' : ''}${isInserted ? ' [INSERTED]' : ''}${\n hasSpeedMarker ? ` [SPEED: ${speedMarker.speed}x]` : ''\n }${\n isAnchor\n ? ' [ANCHOR - click another word to select range, double-click to clear]'\n : ''\n }${!isAnchor && !isDeleted ? ' (right-click to set speed marker)' : ''}`;\n\n return (\n // Keyboard interaction is owned by the parent listbox via roving focus\n // (aria-activedescendant); options are pointer affordances only.\n // eslint-disable-next-line jsx-a11y/click-events-have-key-events, jsx-a11y/interactive-supports-focus\n <span\n key={`${ew.originalIndex}-${index}`}\n id={`word-${index}`}\n data-word-index={index}\n className={wordClassName({\n isActive,\n isCursor,\n isSelected,\n isDeleted,\n isInserted,\n isSilence,\n isSilenceNewline,\n isAnchor,\n isFocused,\n hasSpeedMarker,\n })}\n onClick={(e) => handleWordClick(ew.word, index, e)}\n onDoubleClick={(e) => handleWordDoubleClick(index, e)}\n onMouseDown={(e) => handleWordMouseDown(index, e)}\n onMouseEnter={() => handleWordMouseEnter(index)}\n onContextMenu={(e) => handleWordContextMenu(index, e)}\n role=\"option\"\n aria-selected={isSelected || isCursor}\n title={title}\n >\n {showCursorBefore && isFocused && <Caret side=\"before\" />}\n {hasSpeedMarker && (\n <span\n className=\"border-warning/50 bg-warning/20 text-warning-foreground mr-1 inline-block rounded-sm border px-0.5 align-middle text-[9px] leading-snug font-semibold\"\n title={`Speed: ${speedMarker.speed}x from here`}\n >\n {speedMarker.speed}x\n </span>\n )}\n {displayText} {showCursorAfter && isFocused && <Caret side=\"after\" />}\n </span>\n );\n };\n\n const showEditBar =\n hasEdits || doubleClickAnchor !== null || selection !== null;\n\n return (\n <div\n ref={ref}\n className={mediaEditorVariants({ splitLayout, className })}\n >\n <div\n className={`flex min-h-0 min-w-0 flex-1 ${\n splitLayout === 'vertical' ? 'flex-col md:flex-row' : 'flex-col'\n }`}\n >\n {/* Media surface */}\n <div\n className={`border-border bg-background min-h-0 shrink-0 ${\n splitLayout === 'vertical'\n ? 'md:w-1/2 md:border-r'\n : 'max-h-[50%] border-b'\n }`}\n >\n <MediaPlayer\n ref={playerRef}\n src={src}\n kind={kind}\n aria-label=\"Media player\"\n onTimeUpdate={handleTimeUpdate}\n onEnded={stopSequencePlayback}\n />\n </div>\n\n {/* Transcript editor */}\n <div\n className={`flex min-h-0 flex-1 flex-col ${splitLayout === 'vertical' ? 'md:w-1/2' : ''}`}\n >\n {/* Toolbar */}\n <div className=\"border-border flex shrink-0 flex-wrap items-center justify-between gap-2 border-b px-3 py-2\">\n <div className=\"flex items-center gap-2\">\n {hasEdits && (\n <span className=\"bg-warning/20 text-warning-foreground rounded px-1.5 py-0.5 text-xs font-semibold\">\n Edited\n </span>\n )}\n <label\n className=\"text-muted-foreground text-xs\"\n htmlFor=\"media-editor-default-speed\"\n >\n Speed:\n </label>\n <div className=\"w-20\">\n <Select\n id=\"media-editor-default-speed\"\n size=\"sm\"\n options={PLAYBACK_SPEEDS.map((speed) => ({\n value: String(speed),\n label: `${speed}x`,\n }))}\n value={String(defaultSpeed)}\n onValueChange={(value) =>\n setDefaultSpeed(parseFloat(value) as PlaybackSpeed)\n }\n aria-label=\"Default playback speed\"\n />\n </div>\n {speedMarkers.length > 0 && (\n <span\n className=\"text-muted-foreground text-xs\"\n title={`${speedMarkers.length} speed marker(s) set. Right-click on a word to add/remove speed markers.`}\n >\n {speedMarkers.length} marker\n {speedMarkers.length !== 1 ? 's' : ''}\n </span>\n )}\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => setShowFillerModal(true)}\n aria-label=\"Remove filler words\"\n title=\"Remove filler words\"\n >\n ✂️\n </Button>\n {undoStack.length > 0 && (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={undo}\n aria-label={`Undo (${undoStack.length} available)`}\n title=\"Undo (⌘Z)\"\n >\n Undo ({undoStack.length})\n </Button>\n )}\n </div>\n\n <div className=\"text-muted-foreground flex items-center gap-2 text-xs\">\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => setShowScriptPanel((v) => !v)}\n aria-pressed={showScriptPanel}\n aria-label=\"Show script\"\n title=\"Show the transcript script (editable YAML/JSON)\"\n >\n Script\n </Button>\n <span>{stats.activeWordCount} words</span>\n <button\n type=\"button\"\n className=\"hover:bg-muted hover:text-foreground focus-visible:ring-ring rounded px-1 underline decoration-dotted transition-colors focus-visible:ring-2 focus-visible:outline-none\"\n onClick={() => setShowSilenceModal(true)}\n title={\n stats.activeSilenceCount > 0\n ? `Click to configure silence detection (currently ≥${(silenceThresholds.minSilenceMs / 1000).toFixed(1)}s)`\n : `No silences detected (threshold: ${(silenceThresholds.minSilenceMs / 1000).toFixed(1)}s). Click to configure.`\n }\n aria-label=\"Configure silence detection\"\n >\n {stats.activeSilenceCount} silences\n </button>\n {(stats.deletedWordCount > 0 ||\n stats.deletedSilenceCount > 0) && (\n <span className=\"text-destructive\">\n {stats.deletedWordCount + stats.deletedSilenceCount} deleted\n </span>\n )}\n {transcript.speakers && (\n <span>{transcript.speakers.length} speakers</span>\n )}\n <span>{formatDuration(stats.editedDurationMs)}</span>\n </div>\n </div>\n\n {/* Contextual edit actions */}\n {showEditBar && (\n <div className=\"border-border bg-muted/40 flex shrink-0 items-center gap-1 border-b px-3 py-1\">\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => openWordEditor(cursorIndex)}\n title=\"Edit selected word (Enter)\"\n >\n Edit <kbd className=\"text-[10px] opacity-60\">↵</kbd>\n </Button>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={handleDeleteToggle}\n title=\"Delete selected word (Del)\"\n >\n Del <kbd className=\"text-[10px] opacity-60\">⌫</kbd>\n </Button>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={handleCut}\n title=\"Cut selection (⌘X)\"\n >\n Cut <kbd className=\"text-[10px] opacity-60\">⌘X</kbd>\n </Button>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={handlePaste}\n disabled={!clipboard}\n title=\"Paste (⌘V)\"\n >\n Paste <kbd className=\"text-[10px] opacity-60\">⌘V</kbd>\n </Button>\n </div>\n )}\n\n {/* Editable transcript */}\n <div\n ref={contentRef}\n className={`focus-visible:ring-ring min-h-0 flex-1 overflow-y-auto p-3 text-sm leading-relaxed select-none focus:outline-none focus-visible:ring-2 focus-visible:ring-inset ${\n isFocused ? 'bg-muted/20' : ''\n }`}\n tabIndex={0}\n onKeyDown={handleKeyDown}\n onCopy={handleCopy}\n onFocus={() => setIsFocused(true)}\n onBlur={() => setIsFocused(false)}\n onMouseUp={handleMouseUp}\n onMouseLeave={handleMouseUp}\n role=\"listbox\"\n aria-label=\"Transcript words\"\n aria-activedescendant={`word-${cursorIndex}`}\n >\n {editedWords.map(renderWord)}\n </div>\n </div>\n </div>\n\n {showScriptPanel && (\n <ScriptPanel\n transcript={transcript}\n editedWords={editedWords}\n onApply={replaceEditedWords}\n onClose={() => setShowScriptPanel(false)}\n />\n )}\n\n {/* Modals & menus */}\n <FillerWordsModal\n isOpen={showFillerModal}\n onClose={() => setShowFillerModal(false)}\n onApply={removeFillers}\n matchingCounts={fillerAnalysis.matchCounts}\n fillerDurations={fillerAnalysis.durations}\n silenceCounts={fillerAnalysis.silenceCounts}\n currentDurationMs={stats.editedDurationMs}\n />\n\n <SilenceSettingsModal\n isOpen={showSilenceModal}\n onClose={() => setShowSilenceModal(false)}\n minSilenceMs={silenceThresholds.minSilenceMs}\n nlSilenceMs={silenceThresholds.nlSilenceMs}\n onApply={setSilenceThresholds}\n />\n\n <WordEditorModal\n isOpen={editorWordIndex !== null}\n editableWord={\n editorWordIndex !== null\n ? (editedWords[editorWordIndex] ?? null)\n : null\n }\n onClose={closeWordEditor}\n onSave={handleEditorSave}\n onSplitSilence={handleEditorSplitSilence}\n onDelete={handleEditorDelete}\n />\n\n <SpeedMarkerMenu\n isOpen={speedMenuWordIndex !== null}\n position={speedMenuPosition}\n wordIndex={speedMenuWordIndex}\n currentMarker={\n speedMenuWordIndex !== null\n ? getSpeedMarkerAtIndex(speedMenuWordIndex)\n : undefined\n }\n defaultSpeed={defaultSpeed}\n onSetSpeed={(speed) => {\n if (speedMenuWordIndex !== null) {\n toggleSpeedMarker(speedMenuWordIndex, speed);\n }\n }}\n onRemoveMarker={() => {\n if (speedMenuWordIndex !== null) {\n removeSpeedMarker(speedMenuWordIndex);\n }\n }}\n onClose={() => {\n setSpeedMenuWordIndex(null);\n setSpeedMenuPosition(null);\n }}\n />\n </div>\n );\n }\n);\n\nMediaEditor.displayName = 'MediaEditor';\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/components/AI/icons.tsx","../src/components/AI/MCPToolCall.tsx","../src/components/AI/AIMessage.tsx"],"names":["jsxs","jsx","cva","React2"],"mappings":"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","file":"chunk-NQME7MCK.js","sourcesContent":["/**\n * AI Component Icons\n *\n * Shared icon components for AI features to follow DRY principles.\n */\n\nimport * as React from 'react';\nimport { cn } from '../../utils/cn';\n\n// ============================================================================\n// Sparkles Icon (Modern AI Symbol)\n// ============================================================================\n\nexport interface SparklesIconProps {\n className?: string;\n /** Size variant */\n size?: 'sm' | 'md' | 'lg';\n}\n\nconst sizeClasses = {\n sm: 'h-4 w-4',\n md: 'h-5 w-5',\n lg: 'h-7 w-7',\n};\n\n/**\n * Sparkles icon - the modern symbol for AI features\n * Used by ChatGPT, GitHub Copilot, Google Gemini, etc.\n */\nexport function SparklesIcon({ className, size = 'md' }: SparklesIconProps) {\n return (\n <svg\n aria-hidden=\"true\"\n className={cn(sizeClasses[size], className)}\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n >\n {/* Large sparkle */}\n <path d=\"M9.937 15.5A2 2 0 0 0 8.5 14.063l-6.135-1.582a.5.5 0 0 1 0-.962L8.5 9.936A2 2 0 0 0 9.937 8.5l1.582-6.135a.5.5 0 0 1 .963 0L14.063 8.5A2 2 0 0 0 15.5 9.937l6.135 1.581a.5.5 0 0 1 0 .964L15.5 14.063a2 2 0 0 0-1.437 1.437l-1.582 6.135a.5.5 0 0 1-.963 0z\" />\n {/* Small sparkle */}\n <path\n d=\"M20 3v4\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n />\n <path\n d=\"M22 5h-4\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n />\n </svg>\n );\n}\n\n// ============================================================================\n// AI Logo Icon (Stack/Layers) - Legacy\n// ============================================================================\n\nexport interface AILogoIconProps {\n className?: string;\n /** Size variant */\n size?: 'sm' | 'md' | 'lg';\n}\n\n/**\n * The AI assistant logo - a stacked layers/prism icon\n * @deprecated Use SparklesIcon for a more recognizable AI symbol\n */\nexport function AILogoIcon({ className, size = 'md' }: AILogoIconProps) {\n return (\n <svg\n aria-hidden=\"true\"\n className={cn(sizeClasses[size], className)}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n >\n <path\n d=\"M12 2L2 7L12 12L22 7L12 2Z\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n fill=\"currentColor\"\n fillOpacity=\"0.2\"\n />\n <path\n d=\"M2 17L12 22L22 17\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M2 12L12 17L22 12\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n\n// ============================================================================\n// Close Icon\n// ============================================================================\n\nexport interface CloseIconProps {\n className?: string;\n}\n\nexport function CloseIcon({ className }: CloseIconProps) {\n return (\n <svg\n aria-hidden=\"true\"\n className={cn('h-5 w-5', className)}\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M6 18L18 6M6 6l12 12\"\n />\n </svg>\n );\n}\n\n// ============================================================================\n// Refresh/Clear Icon\n// ============================================================================\n\nexport interface RefreshIconProps {\n className?: string;\n}\n\nexport function RefreshIcon({ className }: RefreshIconProps) {\n return (\n <svg\n aria-hidden=\"true\"\n className={cn('h-5 w-5', className)}\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M16.023 9.348h4.992v-.001M2.985 19.644v-4.992m0 0h4.992m-4.993 0l3.181 3.183a8.25 8.25 0 0013.803-3.7M4.031 9.865a8.25 8.25 0 0113.803-3.7l3.181 3.182m0-4.991v4.99\"\n />\n </svg>\n );\n}\n\n// ============================================================================\n// Chevron Icon\n// ============================================================================\n\nexport interface ChevronIconProps {\n className?: string;\n direction?: 'up' | 'down' | 'left' | 'right';\n}\n\nconst chevronRotation = {\n up: '-rotate-180',\n down: '',\n left: 'rotate-90',\n right: '-rotate-90',\n};\n\nexport function ChevronIcon({\n className,\n direction = 'down',\n}: ChevronIconProps) {\n return (\n <svg\n aria-hidden=\"true\"\n className={cn('h-4 w-4', chevronRotation[direction], className)}\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n >\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M19 9l-7 7-7-7\" />\n </svg>\n );\n}\n\n// ============================================================================\n// Send Icon\n// ============================================================================\n\nexport interface SendIconProps {\n className?: string;\n}\n\nexport function SendIcon({ className }: SendIconProps) {\n return (\n <svg\n aria-hidden=\"true\"\n className={cn('h-5 w-5', className)}\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M12 19l9 2-9-18-9 18 9-2zm0 0v-8\"\n />\n </svg>\n );\n}\n\n// ============================================================================\n// Spinner Icon\n// ============================================================================\n\nexport interface SpinnerIconProps {\n className?: string;\n}\n\nexport function SpinnerIcon({ className }: SpinnerIconProps) {\n return (\n <svg\n aria-hidden=\"true\"\n className={cn('h-5 w-5 animate-spin', className)}\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n >\n <circle\n className=\"opacity-25\"\n cx=\"12\"\n cy=\"12\"\n r=\"10\"\n stroke=\"currentColor\"\n strokeWidth=\"4\"\n />\n <path\n className=\"opacity-75\"\n fill=\"currentColor\"\n d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4z\"\n />\n </svg>\n );\n}\n","/**\n * MCP Tool Call Display Component\n *\n * Renders an MCP tool invocation with status, parameters, and results.\n */\n\nimport * as React from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { cn } from '../../utils/cn';\nimport type {\n MCPToolCall,\n MCPToolStatus,\n MCPToolResult,\n MCPResourceLink,\n MCPToolParameter,\n} from './types';\n\n// ============================================================================\n// Status Icon Component\n// ============================================================================\n\nconst statusIconVariants = cva(\n 'flex h-5 w-5 items-center justify-center rounded-full',\n {\n variants: {\n status: {\n pending: 'bg-neutral-200 dark:bg-neutral-700',\n running: 'bg-primary-100 dark:bg-primary-900/50',\n success: 'bg-green-100 dark:bg-green-900/50',\n error: 'bg-red-100 dark:bg-red-900/50',\n cancelled: 'bg-neutral-200 dark:bg-neutral-700',\n },\n },\n defaultVariants: {\n status: 'pending',\n },\n }\n);\n\ninterface ToolStatusIconProps {\n status: MCPToolStatus;\n className?: string;\n}\n\nfunction ToolStatusIcon({ status, className }: ToolStatusIconProps) {\n return (\n <span\n data-slot=\"ai-tool-status-icon\"\n className={cn(statusIconVariants({ status }), className)}\n >\n {status === 'pending' && (\n <svg\n aria-hidden=\"true\"\n className=\"h-3 w-3 text-neutral-500\"\n fill=\"currentColor\"\n viewBox=\"0 0 20 20\"\n >\n <circle cx=\"10\" cy=\"10\" r=\"3\" />\n </svg>\n )}\n {status === 'running' && (\n <svg\n aria-hidden=\"true\"\n className=\"text-primary-800 dark:text-primary-400 h-3 w-3 animate-spin\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n >\n <circle\n className=\"opacity-25\"\n cx=\"12\"\n cy=\"12\"\n r=\"10\"\n stroke=\"currentColor\"\n strokeWidth=\"4\"\n />\n <path\n className=\"opacity-75\"\n fill=\"currentColor\"\n d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4z\"\n />\n </svg>\n )}\n {status === 'success' && (\n <svg\n aria-hidden=\"true\"\n className=\"h-3 w-3 text-green-600 dark:text-green-400\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth=\"3\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M5 13l4 4L19 7\"\n />\n </svg>\n )}\n {status === 'error' && (\n <svg\n aria-hidden=\"true\"\n className=\"h-3 w-3 text-red-600 dark:text-red-400\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth=\"3\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M6 18L18 6M6 6l12 12\"\n />\n </svg>\n )}\n {status === 'cancelled' && (\n <svg\n aria-hidden=\"true\"\n className=\"h-3 w-3 text-neutral-500\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth=\"3\"\n >\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M18 12H6\" />\n </svg>\n )}\n </span>\n );\n}\n\n// ============================================================================\n// Tool Icon Component\n// ============================================================================\n\nconst TOOL_ICONS: Record<string, React.ReactNode> = {\n // Patient tools\n create_patient: (\n <svg\n aria-hidden=\"true\"\n className=\"h-4 w-4\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M18 7.5v3m0 0v3m0-3h3m-3 0h-3m-2.25-4.125a3.375 3.375 0 11-6.75 0 3.375 3.375 0 016.75 0zM3 19.235v-.11a6.375 6.375 0 0112.75 0v.109A12.318 12.318 0 019.374 21c-2.331 0-4.512-.645-6.374-1.766z\"\n />\n </svg>\n ),\n get_patient: (\n <svg\n aria-hidden=\"true\"\n className=\"h-4 w-4\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M15.75 6a3.75 3.75 0 11-7.5 0 3.75 3.75 0 017.5 0zM4.501 20.118a7.5 7.5 0 0114.998 0A17.933 17.933 0 0112 21.75c-2.676 0-5.216-.584-7.499-1.632z\"\n />\n </svg>\n ),\n search_patients: (\n <svg\n aria-hidden=\"true\"\n className=\"h-4 w-4\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M21 21l-5.197-5.197m0 0A7.5 7.5 0 105.196 5.196a7.5 7.5 0 0010.607 10.607z\"\n />\n </svg>\n ),\n // Appointment tools\n schedule_appointment: (\n <svg\n aria-hidden=\"true\"\n className=\"h-4 w-4\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M6.75 3v2.25M17.25 3v2.25M3 18.75V7.5a2.25 2.25 0 012.25-2.25h13.5A2.25 2.25 0 0121 7.5v11.25m-18 0A2.25 2.25 0 005.25 21h13.5A2.25 2.25 0 0021 18.75m-18 0v-7.5A2.25 2.25 0 015.25 9h13.5A2.25 2.25 0 0121 11.25v7.5m-9-6h.008v.008H12v-.008zM12 15h.008v.008H12V15zm0 2.25h.008v.008H12v-.008zM9.75 15h.008v.008H9.75V15zm0 2.25h.008v.008H9.75v-.008zM7.5 15h.008v.008H7.5V15zm0 2.25h.008v.008H7.5v-.008zm6.75-4.5h.008v.008h-.008v-.008zm0 2.25h.008v.008h-.008V15zm0 2.25h.008v.008h-.008v-.008zm2.25-4.5h.008v.008H16.5v-.008zm0 2.25h.008v.008H16.5V15z\"\n />\n </svg>\n ),\n // Document tools\n create_document: (\n <svg\n aria-hidden=\"true\"\n className=\"h-4 w-4\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M19.5 14.25v-2.625a3.375 3.375 0 00-3.375-3.375h-1.5A1.125 1.125 0 0113.5 7.125v-1.5a3.375 3.375 0 00-3.375-3.375H8.25m3.75 9v6m3-3H9m1.5-12H5.625c-.621 0-1.125.504-1.125 1.125v17.25c0 .621.504 1.125 1.125 1.125h12.75c.621 0 1.125-.504 1.125-1.125V11.25a9 9 0 00-9-9z\"\n />\n </svg>\n ),\n // Provider tools\n search_providers: (\n <svg\n aria-hidden=\"true\"\n className=\"h-4 w-4\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M15 10.5a3 3 0 11-6 0 3 3 0 016 0z\"\n />\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M19.5 10.5c0 7.142-7.5 11.25-7.5 11.25S4.5 17.642 4.5 10.5a7.5 7.5 0 1115 0z\"\n />\n </svg>\n ),\n // Default tool icon\n default: (\n <svg\n aria-hidden=\"true\"\n className=\"h-4 w-4\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M11.42 15.17L17.25 21A2.652 2.652 0 0021 17.25l-5.877-5.877M11.42 15.17l2.496-3.03c.317-.384.74-.626 1.208-.766M11.42 15.17l-4.655 5.653a2.548 2.548 0 11-3.586-3.586l6.837-5.63m5.108-.233c.55-.164 1.163-.188 1.743-.14a4.5 4.5 0 004.486-6.336l-3.276 3.277a3.004 3.004 0 01-2.25-2.25l3.276-3.276a4.5 4.5 0 00-6.336 4.486c.091 1.076-.071 2.264-.904 2.95l-.102.085m-1.745 1.437L5.909 7.5H4.5L2.25 3.75l1.5-1.5L7.5 4.5v1.409l4.26 4.26m-1.745 1.437l1.745-1.437m6.615 8.206L15.75 15.75M4.867 19.125h.008v.008h-.008v-.008z\"\n />\n </svg>\n ),\n};\n\nfunction getToolIcon(toolName: string): React.ReactNode {\n return TOOL_ICONS[toolName] || TOOL_ICONS.default;\n}\n\n// ============================================================================\n// Resource Link Component\n// ============================================================================\n\nexport interface ResourceLinkProps {\n link: MCPResourceLink;\n onClick?: (link: MCPResourceLink) => void;\n className?: string;\n}\n\nexport function ResourceLink({ link, onClick, className }: ResourceLinkProps) {\n const handleClick = (e: React.MouseEvent) => {\n if (onClick) {\n e.preventDefault();\n onClick(link);\n }\n };\n\n const linkTypeIcons: Record<string, React.ReactNode> = {\n patient: (\n <svg\n aria-hidden=\"true\"\n className=\"h-4 w-4\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M15.75 6a3.75 3.75 0 11-7.5 0 3.75 3.75 0 017.5 0zM4.501 20.118a7.5 7.5 0 0114.998 0A17.933 17.933 0 0112 21.75c-2.676 0-5.216-.584-7.499-1.632z\"\n />\n </svg>\n ),\n document: (\n <svg\n aria-hidden=\"true\"\n className=\"h-4 w-4\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M19.5 14.25v-2.625a3.375 3.375 0 00-3.375-3.375h-1.5A1.125 1.125 0 0113.5 7.125v-1.5a3.375 3.375 0 00-3.375-3.375H8.25m2.25 0H5.625c-.621 0-1.125.504-1.125 1.125v17.25c0 .621.504 1.125 1.125 1.125h12.75c.621 0 1.125-.504 1.125-1.125V11.25a9 9 0 00-9-9z\"\n />\n </svg>\n ),\n appointment: (\n <svg\n aria-hidden=\"true\"\n className=\"h-4 w-4\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M6.75 3v2.25M17.25 3v2.25M3 18.75V7.5a2.25 2.25 0 012.25-2.25h13.5A2.25 2.25 0 0121 7.5v11.25m-18 0A2.25 2.25 0 005.25 21h13.5A2.25 2.25 0 0021 18.75m-18 0v-7.5A2.25 2.25 0 015.25 9h13.5A2.25 2.25 0 0121 11.25v7.5\"\n />\n </svg>\n ),\n order: (\n <svg\n aria-hidden=\"true\"\n className=\"h-4 w-4\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M9 12h3.75M9 15h3.75M9 18h3.75m3 .75H18a2.25 2.25 0 002.25-2.25V6.108c0-1.135-.845-2.098-1.976-2.192a48.424 48.424 0 00-1.123-.08m-5.801 0c-.065.21-.1.433-.1.664 0 .414.336.75.75.75h4.5a.75.75 0 00.75-.75 2.25 2.25 0 00-.1-.664m-5.8 0A2.251 2.251 0 0113.5 2.25H15c1.012 0 1.867.668 2.15 1.586m-5.8 0c-.376.023-.75.05-1.124.08C9.095 4.01 8.25 4.973 8.25 6.108V8.25m0 0H4.875c-.621 0-1.125.504-1.125 1.125v11.25c0 .621.504 1.125 1.125 1.125h9.75c.621 0 1.125-.504 1.125-1.125V9.375c0-.621-.504-1.125-1.125-1.125H8.25z\"\n />\n </svg>\n ),\n provider: (\n <svg\n aria-hidden=\"true\"\n className=\"h-4 w-4\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M15 10.5a3 3 0 11-6 0 3 3 0 016 0z\"\n />\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M19.5 10.5c0 7.142-7.5 11.25-7.5 11.25S4.5 17.642 4.5 10.5a7.5 7.5 0 1115 0z\"\n />\n </svg>\n ),\n external: (\n <svg\n aria-hidden=\"true\"\n className=\"h-4 w-4\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M13.5 6H5.25A2.25 2.25 0 003 8.25v10.5A2.25 2.25 0 005.25 21h10.5A2.25 2.25 0 0018 18.75V10.5m-10.5 6L21 3m0 0h-5.25M21 3v5.25\"\n />\n </svg>\n ),\n internal: (\n <svg\n aria-hidden=\"true\"\n className=\"h-4 w-4\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M13.19 8.688a4.5 4.5 0 011.242 7.244l-4.5 4.5a4.5 4.5 0 01-6.364-6.364l1.757-1.757m13.35-.622l1.757-1.757a4.5 4.5 0 00-6.364-6.364l-4.5 4.5a4.5 4.5 0 001.242 7.244\"\n />\n </svg>\n ),\n };\n\n const icon = link.type ? linkTypeIcons[link.type] : linkTypeIcons.internal;\n\n return (\n <a\n href={link.href}\n onClick={handleClick}\n className={cn(\n 'inline-flex items-center gap-1.5 rounded-md px-2.5 py-1.5',\n 'bg-primary-50 text-primary-900 hover:bg-primary-100',\n 'dark:bg-primary-900/30 dark:text-primary-300 dark:hover:bg-primary-900/50',\n 'text-sm font-medium transition-colors',\n 'focus:ring-primary-500 focus:ring-2 focus:ring-offset-2 focus:outline-none',\n 'dark:focus:ring-offset-neutral-900',\n className\n )}\n >\n {icon}\n <span>{link.label}</span>\n {link.type === 'external' && (\n <svg\n aria-hidden=\"true\"\n className=\"h-3 w-3 opacity-60\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M4.5 19.5l15-15m0 0H8.25m11.25 0v11.25\"\n />\n </svg>\n )}\n </a>\n );\n}\n\n// ============================================================================\n// Tool Result Component\n// ============================================================================\n\ninterface ToolResultDisplayProps {\n result: MCPToolResult;\n onLinkClick?: (link: MCPResourceLink) => void;\n showRawData?: boolean;\n className?: string;\n}\n\nfunction ToolResultDisplay({\n result,\n onLinkClick,\n showRawData = false,\n className,\n}: ToolResultDisplayProps) {\n const [showJson, setShowJson] = React.useState(false);\n\n if (result.type === 'error') {\n return (\n <div\n className={cn(\n 'mt-2 rounded-md bg-red-50 p-3 dark:bg-red-900/20',\n className\n )}\n >\n <p className=\"text-sm text-red-700 dark:text-red-300\">\n {typeof result.data === 'string'\n ? String(result.data)\n : 'An error occurred'}\n </p>\n </div>\n );\n }\n\n const hasRawData =\n result.type === 'json' && result.data !== undefined && result.data !== null;\n\n return (\n <div className={cn('space-y-2', className)}>\n {result.summary && (\n <p className=\"text-sm text-neutral-700 dark:text-neutral-300\">\n {result.summary}\n </p>\n )}\n\n {result.link && <ResourceLink link={result.link} onClick={onLinkClick} />}\n\n {result.resources && result.resources.length > 0 && (\n <div className=\"flex flex-wrap gap-2\">\n {result.resources.map((resource) => (\n <ResourceLink\n key={resource.id}\n link={{\n href: resource.uri || '#',\n label: resource.name,\n type: resource.type as MCPResourceLink['type'],\n }}\n onClick={onLinkClick}\n />\n ))}\n </div>\n )}\n\n {/* Raw JSON data - hidden by default */}\n {hasRawData && showRawData && (\n <div className=\"mt-2\">\n <button\n onClick={() => setShowJson(!showJson)}\n className=\"flex items-center gap-1 text-xs text-neutral-600 hover:text-neutral-700 dark:text-neutral-400 dark:hover:text-neutral-300\"\n >\n <svg\n aria-hidden=\"true\"\n className={cn(\n 'h-3 w-3 transition-transform',\n showJson && 'rotate-90'\n )}\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M9 5l7 7-7 7\"\n />\n </svg>\n {showJson ? 'Hide' : 'Show'} raw data\n </button>\n {showJson && (\n <pre className=\"mt-2 max-h-40 overflow-auto rounded-md bg-neutral-100 p-2 text-xs dark:bg-neutral-800\">\n {JSON.stringify(result.data, null, 2)}\n </pre>\n )}\n </div>\n )}\n </div>\n );\n}\n\n// ============================================================================\n// MCP Tool Call Component\n// ============================================================================\n\nconst toolCallVariants = cva(\n ['rounded-lg border', 'overflow-hidden', 'transition-all duration-200'],\n {\n variants: {\n status: {\n pending:\n 'border-neutral-200 bg-neutral-50 dark:border-neutral-700 dark:bg-neutral-800/50',\n running:\n 'border-primary-200 bg-primary-50/50 dark:border-primary-800 dark:bg-primary-900/20',\n success:\n 'border-green-200 bg-green-50/50 dark:border-green-800 dark:bg-green-900/20',\n error:\n 'border-red-200 bg-red-50/50 dark:border-red-800 dark:bg-red-900/20',\n cancelled:\n 'border-neutral-200 bg-neutral-50 dark:border-neutral-700 dark:bg-neutral-800/50 opacity-60',\n },\n compact: {\n true: 'p-2',\n false: 'p-3',\n },\n },\n defaultVariants: {\n status: 'pending',\n compact: false,\n },\n }\n);\n\n// Human-readable tool names\nconst TOOL_FRIENDLY_NAMES: Record<string, string> = {\n create_patient: 'Creating patient',\n get_patient: 'Looking up patient',\n search_patients: 'Searching patients',\n update_patient: 'Updating patient',\n delete_patient: 'Removing patient',\n schedule_appointment: 'Scheduling appointment',\n cancel_appointment: 'Canceling appointment',\n update_appointment: 'Updating appointment',\n create_document: 'Creating document',\n upload_document: 'Uploading document',\n get_document: 'Retrieving document',\n search_documents: 'Searching documents',\n create_order: 'Creating order',\n send_message: 'Sending message',\n search: 'Searching',\n search_providers: 'Searching for providers',\n};\n\nfunction getToolFriendlyName(toolName: string, status: MCPToolStatus): string {\n const baseName = TOOL_FRIENDLY_NAMES[toolName] || toolName.replace(/_/g, ' ');\n\n // Adjust tense based on status\n if (status === 'success') {\n // Past tense approximation — check longer prefixes first to avoid\n // partial matches (e.g. \"Searching for\" before \"Searching\")\n if (baseName.startsWith('Creating'))\n return baseName.replace('Creating', 'Created');\n if (baseName.startsWith('Scheduling'))\n return baseName.replace('Scheduling', 'Scheduled');\n if (baseName.startsWith('Searching for'))\n return baseName.replace('Searching for', 'Found');\n if (baseName.startsWith('Searching'))\n return baseName.replace('Searching', 'Found');\n if (baseName.startsWith('Looking'))\n return baseName.replace('Looking', 'Found');\n if (baseName.startsWith('Updating'))\n return baseName.replace('Updating', 'Updated');\n if (baseName.startsWith('Removing'))\n return baseName.replace('Removing', 'Removed');\n if (baseName.startsWith('Canceling'))\n return baseName.replace('Canceling', 'Canceled');\n if (baseName.startsWith('Retrieving'))\n return baseName.replace('Retrieving', 'Retrieved');\n if (baseName.startsWith('Uploading'))\n return baseName.replace('Uploading', 'Uploaded');\n if (baseName.startsWith('Sending'))\n return baseName.replace('Sending', 'Sent');\n }\n return baseName;\n}\n\n// Generate a user-friendly summary from parameters\nfunction getParameterSummary(\n toolName: string,\n params: MCPToolParameter[]\n): string | null {\n const paramMap = Object.fromEntries(params.map((p) => [p.name, p.value]));\n\n // Patient creation\n if (\n toolName === 'create_patient' &&\n paramMap.firstName &&\n paramMap.lastName\n ) {\n return `${paramMap.firstName} ${paramMap.lastName}`;\n }\n\n // Search\n if (toolName.includes('search') && paramMap.query) {\n return `\"${paramMap.query}\"`;\n }\n\n // Appointment\n if (toolName.includes('appointment') && paramMap.patientName) {\n const date = paramMap.preferredDate || paramMap.date;\n return date\n ? `${paramMap.patientName} on ${date}`\n : String(paramMap.patientName);\n }\n\n // Provider search\n if (toolName === 'search_providers' && paramMap.zipcode) {\n const service = paramMap.service;\n return service\n ? `${service} near ${paramMap.zipcode}`\n : `near ${paramMap.zipcode}`;\n }\n\n return null;\n}\n\nexport interface MCPToolCallDisplayProps extends VariantProps<\n typeof toolCallVariants\n> {\n /** The tool call to display */\n toolCall: MCPToolCall;\n /** Whether to show parameters (in detailed view) */\n showParameters?: boolean;\n /** Whether the component is collapsible to show details */\n collapsible?: boolean;\n /** Default collapsed state (true = hide details) */\n defaultCollapsed?: boolean;\n /** Callback when a resource link is clicked */\n onLinkClick?: (link: MCPResourceLink) => void;\n /** Additional class name */\n className?: string;\n}\n\n/**\n * Displays an MCP tool call with its status, parameters, and results.\n * Shows a user-friendly summary by default, with technical details available on expand.\n */\nexport function MCPToolCallDisplay({\n toolCall,\n showParameters = true,\n collapsible = true,\n defaultCollapsed = true,\n compact,\n onLinkClick,\n className,\n}: MCPToolCallDisplayProps) {\n const [showDetails, setShowDetails] = React.useState(!defaultCollapsed);\n\n const formatDuration = (ms?: number) => {\n if (!ms) return null;\n if (ms < 1000) return `${ms}ms`;\n return `${(ms / 1000).toFixed(1)}s`;\n };\n\n const friendlyName = getToolFriendlyName(toolCall.toolName, toolCall.status);\n const paramSummary = getParameterSummary(\n toolCall.toolName,\n toolCall.parameters\n );\n\n return (\n <div\n data-slot=\"ai-tool-call\"\n className={cn(\n toolCallVariants({ status: toolCall.status, compact }),\n className\n )}\n >\n {/* Main Content - Always Visible */}\n <div className=\"flex items-start gap-3\">\n {/* Tool Icon */}\n <div\n data-slot=\"ai-tool-icon\"\n className=\"flex h-8 w-8 shrink-0 items-center justify-center rounded-md bg-white/50 text-neutral-600 dark:bg-neutral-700/50 dark:text-neutral-400\"\n >\n {getToolIcon(toolCall.toolName)}\n </div>\n\n {/* Content */}\n <div data-slot=\"ai-tool-content\" className=\"min-w-0 flex-1\">\n {/* Friendly Status Line */}\n <div className=\"flex items-center gap-2\">\n <span className=\"text-sm font-medium text-neutral-900 dark:text-white\">\n {friendlyName}\n </span>\n <ToolStatusIcon status={toolCall.status} />\n {toolCall.duration && (\n <span className=\"text-xs text-neutral-600 dark:text-neutral-400\">\n {formatDuration(toolCall.duration)}\n </span>\n )}\n </div>\n\n {/* Parameter Summary (user-friendly) */}\n {paramSummary && toolCall.status !== 'success' && (\n <p className=\"text-muted-foreground mt-0.5 text-sm\">\n {paramSummary}\n </p>\n )}\n\n {/* Result Summary & Links */}\n {toolCall.result && (\n <div data-slot=\"ai-tool-result\" className=\"mt-2\">\n <ToolResultDisplay\n result={toolCall.result}\n onLinkClick={onLinkClick}\n showRawData={showDetails}\n />\n </div>\n )}\n\n {/* Error */}\n {toolCall.error && (\n <div className=\"mt-2 rounded-md bg-red-100 p-2 dark:bg-red-900/30\">\n <p className=\"text-sm text-red-700 dark:text-red-300\">\n {toolCall.error}\n </p>\n </div>\n )}\n\n {/* Show Details Toggle */}\n {collapsible && showParameters && toolCall.parameters.length > 0 && (\n <button\n onClick={() => setShowDetails(!showDetails)}\n className=\"mt-2 flex items-center gap-1 text-xs text-neutral-600 hover:text-neutral-700 dark:text-neutral-400 dark:hover:text-neutral-300\"\n >\n <svg\n aria-hidden=\"true\"\n className={cn(\n 'h-3 w-3 transition-transform',\n showDetails && 'rotate-90'\n )}\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M9 5l7 7-7 7\"\n />\n </svg>\n {showDetails ? 'Hide' : 'Show'} details\n </button>\n )}\n\n {/* Technical Details (collapsed by default) */}\n {showDetails && showParameters && toolCall.parameters.length > 0 && (\n <div\n data-slot=\"ai-tool-parameters\"\n className=\"mt-3 rounded-md bg-neutral-100 p-2 dark:bg-neutral-800\"\n >\n <h4 className=\"mb-1.5 text-xs font-medium tracking-wide text-neutral-600 uppercase dark:text-neutral-400\">\n Parameters\n </h4>\n <div className=\"space-y-0.5\">\n {toolCall.parameters.map((param) => (\n <div\n key={param.name}\n className=\"flex items-start gap-2 text-xs\"\n >\n <span className=\"font-mono text-neutral-600 dark:text-neutral-400\">\n {param.name}:\n </span>\n <span className=\"font-mono text-neutral-700 dark:text-neutral-300\">\n {typeof param.value === 'string'\n ? param.value\n : JSON.stringify(param.value)}\n </span>\n </div>\n ))}\n </div>\n </div>\n )}\n </div>\n </div>\n </div>\n );\n}\n\nexport { ToolStatusIcon, getToolIcon };\n","/**\n * AI Message Component\n *\n * Renders AI chat messages with support for text, tool calls, and streaming.\n */\n\nimport * as React from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { cn } from '../../utils/cn';\nimport type {\n AIMessage,\n AIMessageContent,\n AIRenderTextContent,\n MCPResourceLink,\n} from './types';\nimport { MCPToolCallDisplay } from './MCPToolCall';\nimport { SparklesIcon, ChevronIcon } from './icons';\nimport { AudioPlayer } from '../AudioPlayer';\n\n// ============================================================================\n// Avatar Component\n// ============================================================================\n\nconst avatarVariants = cva(\n 'flex shrink-0 items-center justify-center rounded-full',\n {\n variants: {\n role: {\n user: 'bg-primary-100 text-primary-900 dark:bg-primary-900/50 dark:text-primary-300',\n assistant: 'bg-primary-800 text-white dark:bg-primary-800',\n system:\n 'bg-neutral-200 text-neutral-600 dark:bg-neutral-700 dark:text-neutral-400',\n tool: 'bg-amber-100 text-amber-700 dark:bg-amber-900/50 dark:text-amber-300',\n },\n size: {\n sm: 'h-6 w-6 text-xs',\n md: 'h-8 w-8 text-sm',\n lg: 'h-10 w-10 text-base',\n },\n },\n defaultVariants: {\n role: 'user',\n size: 'md',\n },\n }\n);\n\ninterface MessageAvatarProps extends VariantProps<typeof avatarVariants> {\n userName?: string;\n className?: string;\n}\n\nfunction MessageAvatar({\n role,\n size,\n userName,\n className,\n}: MessageAvatarProps) {\n const getInitials = (name?: string) => {\n if (!name) return '?';\n return name\n .split(' ')\n .map((n) => n[0])\n .join('')\n .substring(0, 2)\n .toUpperCase();\n };\n\n return (\n <div\n data-slot=\"ai-message-avatar\"\n className={cn(avatarVariants({ role, size }), className)}\n >\n {role === 'assistant' ? (\n <SparklesIcon size=\"md\" />\n ) : role === 'user' ? (\n <span className=\"font-medium\">{getInitials(userName)}</span>\n ) : role === 'system' ? (\n <svg\n aria-hidden=\"true\"\n className=\"h-4 w-4\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M11.25 11.25l.041-.02a.75.75 0 011.063.852l-.708 2.836a.75.75 0 001.063.853l.041-.021M21 12a9 9 0 11-18 0 9 9 0 0118 0zm-9-3.75h.008v.008H12V8.25z\"\n />\n </svg>\n ) : (\n <svg\n aria-hidden=\"true\"\n className=\"h-4 w-4\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M11.42 15.17L17.25 21A2.652 2.652 0 0021 17.25l-5.877-5.877M11.42 15.17l2.496-3.03c.317-.384.74-.626 1.208-.766M11.42 15.17l-4.655 5.653a2.548 2.548 0 11-3.586-3.586l6.837-5.63m5.108-.233c.55-.164 1.163-.188 1.743-.14a4.5 4.5 0 004.486-6.336l-3.276 3.277a3.004 3.004 0 01-2.25-2.25l3.276-3.276a4.5 4.5 0 00-6.336 4.486c.091 1.076-.071 2.264-.904 2.95l-.102.085m-1.745 1.437L5.909 7.5H4.5L2.25 3.75l1.5-1.5L7.5 4.5v1.409l4.26 4.26m-1.745 1.437l1.745-1.437m6.615 8.206L15.75 15.75M4.867 19.125h.008v.008h-.008v-.008z\"\n />\n </svg>\n )}\n </div>\n );\n}\n\n// ============================================================================\n// Typing Indicator\n// ============================================================================\n\nfunction AITypingIndicator({ className }: { className?: string }) {\n const dotStyle = {\n width: '6px',\n height: '6px',\n minWidth: '6px',\n minHeight: '6px',\n flexShrink: 0,\n };\n\n return (\n <div\n data-slot=\"ai-typing-indicator\"\n className={cn('inline-flex items-center justify-center gap-2', className)}\n >\n <span\n className=\"rounded-full bg-neutral-500 dark:bg-neutral-400\"\n style={{\n ...dotStyle,\n animation: 'typing-dot 1.4s infinite ease-in-out both',\n animationDelay: '-0.32s',\n }}\n />\n <span\n className=\"rounded-full bg-neutral-500 dark:bg-neutral-400\"\n style={{\n ...dotStyle,\n animation: 'typing-dot 1.4s infinite ease-in-out both',\n animationDelay: '-0.16s',\n }}\n />\n <span\n className=\"rounded-full bg-neutral-500 dark:bg-neutral-400\"\n style={{\n ...dotStyle,\n animation: 'typing-dot 1.4s infinite ease-in-out both',\n }}\n />\n <style>{`\n @keyframes typing-dot {\n 0%, 80%, 100% { opacity: 0.4; }\n 40% { opacity: 1; }\n }\n `}</style>\n </div>\n );\n}\n\n// ============================================================================\n// Content Block Renderer\n// ============================================================================\n\ninterface ContentBlockProps {\n content: AIMessageContent;\n onLinkClick?: (link: MCPResourceLink) => void;\n messageId: string;\n streaming: boolean;\n role: AIMessage['role'];\n renderTextContent?: AIRenderTextContent;\n}\n\nfunction ContentBlock({\n content,\n onLinkClick,\n messageId,\n streaming,\n role,\n renderTextContent,\n}: ContentBlockProps) {\n const [isCollapsed, setIsCollapsed] = React.useState(\n content.collapsed ?? false\n );\n\n if (content.type === 'text' && content.text) {\n if (renderTextContent) {\n return (\n <div className=\"prose prose-sm dark:prose-invert max-w-none\">\n {renderTextContent(content.text, { messageId, streaming, role })}\n </div>\n );\n }\n return (\n <div className=\"prose prose-sm dark:prose-invert max-w-none\">\n <p className=\"whitespace-pre-wrap\">{content.text}</p>\n </div>\n );\n }\n\n if (content.type === 'tool_use' && content.toolCall) {\n return (\n <MCPToolCallDisplay\n toolCall={content.toolCall}\n onLinkClick={onLinkClick}\n defaultCollapsed={content.collapsed}\n />\n );\n }\n\n if (content.type === 'thinking' && content.text) {\n return (\n <div\n data-slot=\"ai-message-thinking\"\n className=\"rounded-lg border border-neutral-200 bg-neutral-50 dark:border-neutral-700 dark:bg-neutral-800/50\"\n >\n <button\n onClick={() => setIsCollapsed(!isCollapsed)}\n className=\"flex w-full items-center justify-between px-3 py-2 text-left\"\n >\n <span className=\"text-muted-foreground flex items-center gap-2 text-sm\">\n <svg\n aria-hidden=\"true\"\n className=\"h-4 w-4\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M9.813 15.904L9 18.75l-.813-2.846a4.5 4.5 0 00-3.09-3.09L2.25 12l2.846-.813a4.5 4.5 0 003.09-3.09L9 5.25l.813 2.846a4.5 4.5 0 003.09 3.09L15.75 12l-2.846.813a4.5 4.5 0 00-3.09 3.09zM18.259 8.715L18 9.75l-.259-1.035a3.375 3.375 0 00-2.455-2.456L14.25 6l1.036-.259a3.375 3.375 0 002.455-2.456L18 2.25l.259 1.035a3.375 3.375 0 002.456 2.456L21.75 6l-1.035.259a3.375 3.375 0 00-2.456 2.456zM16.894 20.567L16.5 21.75l-.394-1.183a2.25 2.25 0 00-1.423-1.423L13.5 18.75l1.183-.394a2.25 2.25 0 001.423-1.423l.394-1.183.394 1.183a2.25 2.25 0 001.423 1.423l1.183.394-1.183.394a2.25 2.25 0 00-1.423 1.423z\"\n />\n </svg>\n Thinking...\n </span>\n <ChevronIcon\n direction={isCollapsed ? 'right' : 'down'}\n className=\"text-neutral-400\"\n />\n </button>\n {!isCollapsed && (\n <div className=\"border-t border-neutral-200 px-3 py-2 dark:border-neutral-700\">\n <p className=\"text-sm text-neutral-600 italic dark:text-neutral-400\">\n {content.text}\n </p>\n </div>\n )}\n </div>\n );\n }\n\n if (content.type === 'code' && content.text) {\n return (\n <pre\n data-slot=\"ai-message-code\"\n className=\"rounded-lg bg-neutral-900 p-3 text-sm dark:bg-neutral-950\"\n >\n <code\n className={content.language ? `language-${content.language}` : ''}\n >\n {content.text}\n </code>\n </pre>\n );\n }\n\n if (content.type === 'audio' && content.audioUrl) {\n // Guard against `javascript:` URLs, mirroring the image/file blocks.\n if (/^\\s*javascript:/i.test(content.audioUrl)) {\n return null;\n }\n return (\n <AudioPlayer\n src={content.audioUrl}\n title={content.text || 'Audio recording'}\n variant=\"waveform\"\n showTime\n showPlaybackRate\n fallbackDuration={content.duration}\n />\n );\n }\n\n if (content.type === 'video' && content.videoUrl) {\n // Guard against `javascript:` URLs, mirroring the audio/image/file blocks.\n if (/^\\s*javascript:/i.test(content.videoUrl)) {\n return null;\n }\n return (\n <video\n src={content.videoUrl}\n controls\n preload=\"metadata\"\n aria-label={content.text || 'Video recording'}\n className=\"my-1 max-h-80 w-full rounded-lg bg-black\"\n >\n {/* Recorded clips carry no caption track; present for a11y compliance. */}\n <track kind=\"captions\" />\n </video>\n );\n }\n\n if (content.type === 'image' && content.imageUrl) {\n const safeHref = /^\\s*javascript:/i.test(content.imageUrl)\n ? undefined\n : content.imageUrl;\n return (\n <a\n href={safeHref}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"block w-fit transition-transform hover:scale-[1.02]\"\n aria-label={`View ${content.name || 'Uploaded image'}`}\n >\n <img\n src={content.imageUrl}\n alt={content.name || 'Uploaded image'}\n loading=\"lazy\"\n className=\"my-1 max-h-64 w-auto rounded-lg object-cover\"\n />\n </a>\n );\n }\n\n if (content.type === 'file') {\n const sizeLabel =\n typeof content.fileSize === 'number'\n ? formatFileSize(content.fileSize)\n : undefined;\n const card = (\n <div className=\"my-1 flex items-center gap-3 rounded-lg bg-neutral-100 p-3 transition-colors dark:bg-neutral-800\">\n <div className=\"rounded-lg bg-neutral-200 p-2 dark:bg-neutral-700\">\n <svg\n aria-hidden=\"true\"\n className=\"h-6 w-6\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth={2}\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z\"\n />\n </svg>\n </div>\n <div className=\"min-w-0 flex-1\">\n <p className=\"truncate text-sm font-medium\">\n {content.name || 'Document'}\n </p>\n {sizeLabel && <p className=\"text-xs opacity-70\">{sizeLabel}</p>}\n </div>\n </div>\n );\n\n if (content.fileUrl) {\n const safeFileHref = /^\\s*javascript:/i.test(content.fileUrl)\n ? undefined\n : content.fileUrl;\n return (\n <a\n href={safeFileHref}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"block w-fit no-underline\"\n >\n {card}\n </a>\n );\n }\n return card;\n }\n\n return null;\n}\n\n/** Human-readable file size (e.g. \"1.2 MB\"). */\nfunction formatFileSize(bytes: number): string {\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n}\n\n// ============================================================================\n// AI Message Component\n// ============================================================================\n\nconst messageVariants = cva('flex gap-3', {\n variants: {\n role: {\n user: 'flex-row-reverse',\n assistant: 'flex-row',\n system: 'flex-row justify-center',\n tool: 'flex-row',\n },\n },\n defaultVariants: {\n role: 'assistant',\n },\n});\n\nconst bubbleVariants = cva('rounded-2xl px-4 py-2.5 w-fit max-w-[85%]', {\n variants: {\n variant: {\n user: 'bg-primary-800 text-white dark:bg-primary-800',\n assistant:\n 'bg-neutral-100 text-neutral-900 dark:bg-neutral-800 dark:text-white',\n system:\n 'bg-neutral-100 text-neutral-600 dark:bg-neutral-800 dark:text-neutral-400 text-center text-sm max-w-[95%]',\n tool: 'bg-transparent p-0 max-w-full w-full',\n },\n },\n defaultVariants: {\n variant: 'assistant',\n },\n});\n\nexport interface ChatBubbleProps\n extends\n React.HTMLAttributes<HTMLDivElement>,\n VariantProps<typeof bubbleVariants> {\n /** Show error styling (red border). */\n hasError?: boolean;\n /**\n * Optional left-border accent color. Used by multi-participant surfaces\n * (e.g. SuperChat) to tint a speaker's bubble; AI chat leaves it unset.\n */\n accent?: string;\n}\n\n/**\n * The shared chat bubble shell. This is the single source of truth for how a\n * chat message bubble looks across the library (AI chat, SuperChat, etc.).\n * Presentational only — callers render their own content inside.\n */\nconst ChatBubble = React.forwardRef<HTMLDivElement, ChatBubbleProps>(\n (\n { className, variant, hasError, accent, style, children, ...props },\n ref\n ) => {\n return (\n <div\n ref={ref}\n data-slot=\"chat-bubble\"\n className={cn(\n bubbleVariants({ variant }),\n hasError && 'border border-red-300 dark:border-red-700',\n className\n )}\n style={accent ? { borderLeft: `3px solid ${accent}`, ...style } : style}\n {...props}\n >\n {children}\n </div>\n );\n }\n);\n\nChatBubble.displayName = 'ChatBubble';\n\nexport interface AIMessageDisplayProps {\n /** The message to display */\n message: AIMessage;\n /** User name for user messages */\n userName?: string;\n /** Whether to show the avatar */\n showAvatar?: boolean;\n /** Whether to show timestamp */\n showTimestamp?: boolean;\n /** Callback when a resource link is clicked */\n onLinkClick?: (link: MCPResourceLink) => void;\n /**\n * Optional renderer for `text` content blocks (e.g. Markdown). Called per\n * text block with `{ messageId, streaming, role }`. Host must sanitize.\n */\n renderTextContent?: AIRenderTextContent;\n /** Additional class name */\n className?: string;\n}\n\n/**\n * Displays an AI chat message with support for text, tool calls, and streaming.\n */\nexport function AIMessageDisplay({\n message,\n userName,\n showAvatar = true,\n showTimestamp = false,\n onLinkClick,\n renderTextContent,\n className,\n}: AIMessageDisplayProps) {\n const isStreaming = message.status === 'streaming';\n const hasContent = message.content.length > 0;\n\n const formatTime = (timestamp: Date | string) => {\n const date = new Date(timestamp);\n return date.toLocaleTimeString(undefined, {\n hour: 'numeric',\n minute: '2-digit',\n });\n };\n\n // For tool messages, render just the tool call without bubble\n if (message.role === 'tool') {\n return (\n <div\n data-slot=\"ai-message\"\n className={cn(messageVariants({ role: message.role }), className)}\n >\n {showAvatar && <MessageAvatar role={message.role} />}\n <div className=\"flex-1 space-y-2\">\n {message.content.map((content, index) => (\n <ContentBlock\n key={index}\n content={content}\n onLinkClick={onLinkClick}\n messageId={message.id}\n streaming={isStreaming}\n role={message.role}\n renderTextContent={renderTextContent}\n />\n ))}\n </div>\n </div>\n );\n }\n\n return (\n <div\n data-slot=\"ai-message\"\n className={cn(messageVariants({ role: message.role }), className)}\n >\n {showAvatar && message.role !== 'system' && (\n <MessageAvatar role={message.role} userName={userName} />\n )}\n\n <div\n className={cn(\n 'flex min-w-0 flex-1 flex-col gap-1',\n message.role === 'user' && 'items-end'\n )}\n >\n <ChatBubble\n data-slot=\"ai-message-bubble\"\n variant={message.role}\n hasError={message.status === 'error'}\n >\n {hasContent ? (\n <div className=\"space-y-3\">\n {message.content.map((content, index) => (\n <ContentBlock\n key={index}\n content={content}\n onLinkClick={onLinkClick}\n messageId={message.id}\n streaming={isStreaming}\n role={message.role}\n renderTextContent={renderTextContent}\n />\n ))}\n </div>\n ) : isStreaming ? (\n <div className=\"flex items-center justify-center\">\n <AITypingIndicator />\n </div>\n ) : null}\n </ChatBubble>\n\n {showTimestamp && (\n <span\n data-slot=\"ai-message-timestamp\"\n className=\"px-2 text-xs text-neutral-500\"\n >\n {formatTime(message.timestamp)}\n </span>\n )}\n\n {message.status === 'error' && (\n <span className=\"px-2 text-xs text-red-500\">\n {message.role === 'user' ? 'Failed to send' : 'An error occurred'}\n </span>\n )}\n </div>\n </div>\n );\n}\n\nexport { MessageAvatar, AITypingIndicator, ChatBubble, bubbleVariants };\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/components/Switch/Switch.tsx"],"names":["cva","React","jsx","cn","jsxs"],"mappings":"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","file":"chunk-NVHAQOHH.cjs","sourcesContent":["import * as React from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { cn } from '../../utils/cn';\n\nconst switchTrackVariants = cva(\n [\n 'relative inline-flex shrink-0',\n 'cursor-pointer rounded-full',\n 'transition-colors duration-200 ease-in-out',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2',\n 'disabled:cursor-not-allowed disabled:opacity-50',\n 'bg-neutral-200 dark:bg-neutral-700',\n 'data-[state=checked]:bg-primary-800',\n ],\n {\n variants: {\n size: {\n sm: 'h-5 w-9',\n md: 'h-6 w-11',\n lg: 'h-7 w-14',\n },\n },\n defaultVariants: {\n size: 'md',\n },\n }\n);\n\nconst switchThumbVariants = cva(\n [\n 'pointer-events-none inline-block rounded-full',\n 'bg-white shadow-lg',\n 'ring-0 transition-transform duration-200 ease-in-out',\n ],\n {\n variants: {\n size: {\n sm: 'h-4 w-4 data-[state=checked]:translate-x-4 translate-x-0.5',\n md: 'h-5 w-5 data-[state=checked]:translate-x-5 translate-x-0.5',\n lg: 'h-6 w-6 data-[state=checked]:translate-x-7 translate-x-0.5',\n },\n },\n defaultVariants: {\n size: 'md',\n },\n }\n);\n\nexport interface SwitchProps\n extends\n Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, 'onChange'>,\n VariantProps<typeof switchTrackVariants> {\n /** Controlled checked state */\n checked?: boolean;\n /** Default checked state (uncontrolled) */\n defaultChecked?: boolean;\n /** Callback when checked state changes */\n onCheckedChange?: (checked: boolean) => void;\n /** Label for the switch */\n label?: string;\n /** Description text */\n description?: string;\n /** Position of the label */\n labelPosition?: 'left' | 'right';\n /** ID for the switch */\n id?: string;\n}\n\n/**\n * An accessible toggle switch component.\n *\n * @example\n * ```tsx\n * <Switch label=\"Enable notifications\" />\n * <Switch\n * label=\"Dark mode\"\n * description=\"Toggle between light and dark theme\"\n * />\n * ```\n */\nconst Switch = React.forwardRef<HTMLButtonElement, SwitchProps>(\n (\n {\n className,\n size,\n checked: controlledChecked,\n defaultChecked = false,\n onCheckedChange,\n label,\n description,\n labelPosition = 'right',\n disabled,\n id,\n ...props\n },\n ref\n ) => {\n const [uncontrolledChecked, setUncontrolledChecked] =\n React.useState(defaultChecked);\n\n const generatedId = React.useId();\n const switchId = id || generatedId;\n const descriptionId = `${switchId}-description`;\n\n const isControlled = controlledChecked !== undefined;\n const isChecked = isControlled ? controlledChecked : uncontrolledChecked;\n\n const handleToggle = React.useCallback(() => {\n if (disabled) return;\n\n const newValue = !isChecked;\n if (!isControlled) {\n setUncontrolledChecked(newValue);\n }\n onCheckedChange?.(newValue);\n }, [disabled, isChecked, isControlled, onCheckedChange]);\n\n const handleKeyDown = React.useCallback(\n (e: React.KeyboardEvent<HTMLButtonElement>) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n handleToggle();\n }\n },\n [handleToggle]\n );\n\n const switchElement = (\n <button\n ref={ref}\n data-slot=\"switch\"\n id={switchId}\n type=\"button\"\n role=\"switch\"\n aria-checked={isChecked}\n aria-describedby={description ? descriptionId : undefined}\n data-state={isChecked ? 'checked' : 'unchecked'}\n disabled={disabled}\n onClick={handleToggle}\n onKeyDown={handleKeyDown}\n className={cn(switchTrackVariants({ size }), 'items-center', className)}\n {...props}\n >\n <span\n data-slot=\"switch-thumb\"\n data-state={isChecked ? 'checked' : 'unchecked'}\n className={switchThumbVariants({ size })}\n />\n </button>\n );\n\n const labelSizeClasses = {\n sm: 'text-xs',\n md: 'text-sm',\n lg: 'text-base',\n };\n\n const descriptionSizeClasses = {\n sm: 'text-[10px]',\n md: 'text-xs',\n lg: 'text-sm',\n };\n\n const labelElement = label && (\n <div className=\"flex flex-col gap-0.5\">\n <label\n htmlFor={switchId}\n data-slot=\"switch-label\"\n className={cn(\n 'text-foreground cursor-pointer font-medium select-none',\n labelSizeClasses[size || 'md'],\n disabled && 'cursor-not-allowed opacity-50'\n )}\n >\n {label}\n </label>\n {description && (\n <p\n id={descriptionId}\n data-slot=\"switch-description\"\n className={cn(\n 'text-muted-foreground',\n descriptionSizeClasses[size || 'md']\n )}\n >\n {description}\n </p>\n )}\n </div>\n );\n\n return (\n <div\n data-slot=\"switch-wrapper\"\n className={cn(\n 'flex items-center gap-3',\n labelPosition === 'left' && 'flex-row-reverse'\n )}\n >\n {switchElement}\n {labelElement}\n </div>\n );\n }\n);\n\nSwitch.displayName = 'Switch';\n\nexport { Switch, switchTrackVariants, switchThumbVariants };\n"]}