framefields 2.0.11 → 2.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (564) hide show
  1. package/README.md +22 -5
  2. package/dist/audio/index.d.mts +4 -4
  3. package/dist/audio/index.mjs +13 -12
  4. package/dist/{audio-BHanw8Jb.d.mts → audio-CfBpzxn9.d.mts} +3 -3
  5. package/dist/{audio-BHanw8Jb.d.mts.map → audio-CfBpzxn9.d.mts.map} +1 -1
  6. package/dist/{audio-TAvPwzLR.mjs → audio-DJeVoE8b.mjs} +1 -1
  7. package/dist/{audio-TAvPwzLR.mjs.map → audio-DJeVoE8b.mjs.map} +1 -1
  8. package/dist/{audio-COOMNwL5.mjs → audio-GGuQ_JI0.mjs} +4 -4
  9. package/dist/{audio-COOMNwL5.mjs.map → audio-GGuQ_JI0.mjs.map} +1 -1
  10. package/dist/{chunk-GMkBE123.mjs → chunk-GBe2k3y8.mjs} +1 -4
  11. package/dist/{dist-C_hjvkdN.mjs → dist-0QGroRYZ.mjs} +1 -1
  12. package/dist/{dist-C_hjvkdN.mjs.map → dist-0QGroRYZ.mjs.map} +1 -1
  13. package/dist/{dist-BYqNNwsl.mjs → dist-BY0bIWgr.mjs} +10 -2
  14. package/dist/dist-BY0bIWgr.mjs.map +1 -0
  15. package/dist/{dist-BAVZdFEJ.mjs → dist-Bb8BoMiw.mjs} +76 -626
  16. package/dist/dist-Bb8BoMiw.mjs.map +1 -0
  17. package/dist/{dist-Cxi68OuY.mjs → dist-DkuDAIrG.mjs} +26862 -25638
  18. package/dist/dist-DkuDAIrG.mjs.map +1 -0
  19. package/dist/{dist-CbG3QxDw.mjs → dist-fjKpBYkc.mjs} +12 -27
  20. package/dist/dist-fjKpBYkc.mjs.map +1 -0
  21. package/dist/effects/index.d.mts +4 -4
  22. package/dist/effects/index.mjs +36 -34
  23. package/dist/{effects-DzbjFhyA.mjs → effects-D6wFg2FR.mjs} +3 -3
  24. package/dist/{effects-DzbjFhyA.mjs.map → effects-D6wFg2FR.mjs.map} +1 -1
  25. package/dist/fonts/index.d.mts +1 -1
  26. package/dist/fonts/index.mjs +3 -1
  27. package/dist/{fonts-C0W6TgJk.mjs → fonts-CZMYtbP7.mjs} +24 -11
  28. package/dist/fonts-CZMYtbP7.mjs.map +1 -0
  29. package/dist/gpu-DG3gI88-.mjs +215 -0
  30. package/dist/gpu-DG3gI88-.mjs.map +1 -0
  31. package/dist/{index-DRZu3ezy.d.mts → index--0vVZDPM.d.mts} +3 -3
  32. package/dist/{index-DRZu3ezy.d.mts.map → index--0vVZDPM.d.mts.map} +1 -1
  33. package/dist/{index-DnWsbbuZ.d.mts → index-BcA8rep0.d.mts} +7 -2
  34. package/dist/index-BcA8rep0.d.mts.map +1 -0
  35. package/dist/{index-DGJp1d30.d.mts → index-BzQc812z.d.mts} +3 -3
  36. package/dist/{index-DGJp1d30.d.mts.map → index-BzQc812z.d.mts.map} +1 -1
  37. package/dist/{index-DDEPvMww.d.mts → index-Cpkzy5XR.d.mts} +3452 -1675
  38. package/dist/index-Cpkzy5XR.d.mts.map +1 -0
  39. package/dist/{index-CDoTrMs1.d.mts → index-D__HdInU.d.mts} +8 -8
  40. package/dist/{index-CDoTrMs1.d.mts.map → index-D__HdInU.d.mts.map} +1 -1
  41. package/dist/{index-CYGpSVsf.d.mts → index-DpWia6iH.d.mts} +4 -11
  42. package/dist/index-DpWia6iH.d.mts.map +1 -0
  43. package/dist/{index-9B8CJowc.d.mts → index-Fciq8bcC.d.mts} +10 -2
  44. package/dist/index-Fciq8bcC.d.mts.map +1 -0
  45. package/dist/index.d.mts +29 -1842
  46. package/dist/index.d.mts.map +1 -1
  47. package/dist/index.mjs +79 -66
  48. package/dist/index.mjs.map +1 -1
  49. package/dist/preview/index.d.mts +2 -2
  50. package/dist/preview/index.mjs +12 -13
  51. package/dist/{preview-BV2C4Fk6.mjs → preview--rOXbBxl.mjs} +3 -4
  52. package/dist/preview--rOXbBxl.mjs.map +1 -0
  53. package/dist/preview-engine/audio.mjs +1 -1
  54. package/dist/preview-engine/chunk-2MZXSWVT.mjs +118 -0
  55. package/dist/preview-engine/{chunk-Y6HWYPKX.mjs → chunk-3GNP7TJH.mjs} +3 -3
  56. package/dist/preview-engine/chunk-3UPI4EPV.mjs +69 -0
  57. package/dist/preview-engine/{chunk-6JW37VJA.mjs → chunk-5AUB4Y3L.mjs} +3 -23
  58. package/dist/preview-engine/chunk-5DOD2NVY.mjs +26 -0
  59. package/dist/preview-engine/chunk-5FC7GOWW.mjs +474 -0
  60. package/dist/preview-engine/chunk-5W4AFQP7.mjs +97 -0
  61. package/dist/preview-engine/chunk-63SFBHEH.mjs +1 -0
  62. package/dist/preview-engine/{chunk-25IW7NYO.mjs → chunk-7EPDVSCL.mjs} +1 -1
  63. package/dist/preview-engine/chunk-7EPIRODI.mjs +91 -0
  64. package/dist/preview-engine/chunk-7J2FWGVD.mjs +1 -0
  65. package/dist/preview-engine/chunk-AXHB4J37.mjs +147 -0
  66. package/dist/preview-engine/chunk-AXQZX3TC.mjs +450 -0
  67. package/dist/preview-engine/chunk-B43Z3J7J.mjs +5 -0
  68. package/dist/preview-engine/chunk-BWJS6G7R.mjs +314 -0
  69. package/dist/preview-engine/{chunk-ECPP3UG6.mjs → chunk-E3HC4GRQ.mjs} +3 -23
  70. package/dist/preview-engine/{chunk-AEK5BO3J.mjs → chunk-E4RAFHZM.mjs} +1 -1
  71. package/dist/preview-engine/chunk-ENKKLU7B.mjs +22 -0
  72. package/dist/preview-engine/{chunk-IYVN2QEL.mjs → chunk-FLPSWDX4.mjs} +1 -1
  73. package/dist/preview-engine/{chunk-24DXIKXL.mjs → chunk-FPRXK2WD.mjs} +2 -2
  74. package/dist/preview-engine/chunk-FU7AIAMM.mjs +88 -0
  75. package/dist/preview-engine/{chunk-CBM7B7EW.mjs → chunk-GMGGDADT.mjs} +1 -1
  76. package/dist/preview-engine/chunk-GSFN4WCH.mjs +62 -0
  77. package/dist/preview-engine/chunk-IQC2I5A5.mjs +1 -0
  78. package/dist/preview-engine/chunk-IUPDOATX.mjs +114 -0
  79. package/dist/preview-engine/{chunk-GHMCGTJ2.mjs → chunk-J2R5R7YY.mjs} +3 -23
  80. package/dist/preview-engine/chunk-JAJOZG5P.mjs +1 -0
  81. package/dist/preview-engine/{chunk-XLFYM7KH.mjs → chunk-K773AOF3.mjs} +2 -2
  82. package/dist/preview-engine/{chunk-RJUAM52F.mjs → chunk-L3CHEZMZ.mjs} +3 -23
  83. package/dist/preview-engine/chunk-LBRVQ4GE.mjs +84 -0
  84. package/dist/preview-engine/chunk-LGVEFPOG.mjs +3 -0
  85. package/dist/preview-engine/{chunk-AMBSW6OA.mjs → chunk-NEE3KQTX.mjs} +2 -2
  86. package/dist/preview-engine/chunk-NPD6W3RP.mjs +1 -0
  87. package/dist/preview-engine/{chunk-V6VU46ZG.mjs → chunk-O2RNIQXT.mjs} +1 -1
  88. package/dist/preview-engine/{server-utils-2FAIV45N.mjs → chunk-OCX5AD23.mjs} +1 -1
  89. package/dist/preview-engine/chunk-OJ2PKBXE.mjs +40 -0
  90. package/dist/preview-engine/chunk-OKH2VU2U.mjs +97 -0
  91. package/dist/preview-engine/chunk-PAQNDZQB.mjs +83 -0
  92. package/dist/preview-engine/chunk-PEWYB6WP.mjs +43 -0
  93. package/dist/preview-engine/{chunk-MDDF2GCF.mjs → chunk-PFA427ZC.mjs} +3 -23
  94. package/dist/preview-engine/chunk-PL4IH5V4.mjs +89 -0
  95. package/dist/preview-engine/chunk-PNB3ERR3.mjs +1 -0
  96. package/dist/preview-engine/{chunk-PQD5UPHG.mjs → chunk-PR2BUYCL.mjs} +1 -1
  97. package/dist/preview-engine/{chunk-QYRDQMNB.mjs → chunk-PXT52LEH.mjs} +3 -23
  98. package/dist/preview-engine/{chunk-ZSIJB76A.mjs → chunk-Q2DPNVIA.mjs} +2 -2
  99. package/dist/preview-engine/chunk-Q4Z54DQ7.mjs +1 -0
  100. package/dist/preview-engine/{chunk-6256GQFP.mjs → chunk-QY7MHWZW.mjs} +1 -1
  101. package/dist/preview-engine/chunk-RQLMW6MA.mjs +4 -0
  102. package/dist/preview-engine/chunk-RSMO7NPN.mjs +1 -0
  103. package/dist/preview-engine/chunk-RW2F3XLQ.mjs +90 -0
  104. package/dist/preview-engine/chunk-SGPRLTNF.mjs +52 -0
  105. package/dist/preview-engine/{chunk-Y6FEU4TV.mjs → chunk-SZW5J72T.mjs} +3 -23
  106. package/dist/preview-engine/{chunk-LIHUEYI5.mjs → chunk-VO2R3DWV.mjs} +2 -2
  107. package/dist/preview-engine/{chunk-BJKH76OM.mjs → chunk-VXS5SIEC.mjs} +3 -23
  108. package/dist/preview-engine/chunk-WFGJXCZT.mjs +53 -0
  109. package/dist/preview-engine/chunk-WH5Q2NFN.mjs +32 -0
  110. package/dist/preview-engine/chunk-WSIURGP2.mjs +121 -0
  111. package/dist/preview-engine/{chunk-AWTH2WZO.mjs → chunk-WUKH7BD7.mjs} +1 -1
  112. package/dist/preview-engine/chunk-XC5WZNOY.mjs +1448 -0
  113. package/dist/preview-engine/chunk-YQZOGEPZ.mjs +186 -0
  114. package/dist/preview-engine/{chunk-D3TETPLI.mjs → chunk-ZH5MZQTZ.mjs} +1 -1
  115. package/dist/preview-engine/chunk-ZIIFTWDH.mjs +58 -0
  116. package/dist/preview-engine/{chunk-EQ4QZRXB.mjs → chunk-ZNL4W4DK.mjs} +2 -2
  117. package/dist/preview-engine/effects.mjs +1 -1
  118. package/dist/preview-engine/fonts.mjs +1 -1
  119. package/dist/preview-engine/framefields.mjs +127 -130
  120. package/dist/preview-engine/player.mjs +6 -6
  121. package/dist/preview-engine/renderers-2H7YEUTD.mjs +1 -0
  122. package/dist/preview-engine/renderers-2P6KXWEZ.mjs +1 -0
  123. package/dist/preview-engine/renderers-2SVWAB42.mjs +1 -0
  124. package/dist/preview-engine/renderers-3RC5FDWX.mjs +1 -0
  125. package/dist/preview-engine/renderers-3T7Q4SPP.mjs +1 -0
  126. package/dist/preview-engine/renderers-4DV4REGM.mjs +1 -0
  127. package/dist/preview-engine/renderers-57WDL6XN.mjs +1 -0
  128. package/dist/preview-engine/renderers-6WH7NZCC.mjs +1 -0
  129. package/dist/preview-engine/renderers-7JTNJE7M.mjs +1 -0
  130. package/dist/preview-engine/renderers-7VJN5L3Z.mjs +1 -0
  131. package/dist/preview-engine/{renderers-WLH4HRUE.mjs → renderers-A7VH3ON5.mjs} +1 -1
  132. package/dist/preview-engine/renderers-CQXQHOW2.mjs +1 -0
  133. package/dist/preview-engine/{renderers-2US2NIUG.mjs → renderers-D2EJULOJ.mjs} +3 -23
  134. package/dist/preview-engine/renderers-DXHJAMZR.mjs +1 -0
  135. package/dist/preview-engine/{renderers-W5CVDJVH.mjs → renderers-F55XFVMP.mjs} +1 -1
  136. package/dist/preview-engine/renderers-FWGMNPYB.mjs +1 -0
  137. package/dist/preview-engine/renderers-HXFRTIJD.mjs +1 -0
  138. package/dist/preview-engine/renderers-IWQ3V6AJ.mjs +1 -0
  139. package/dist/preview-engine/renderers-IXGM55XK.mjs +1 -0
  140. package/dist/preview-engine/renderers-KVHUVWSN.mjs +1 -0
  141. package/dist/preview-engine/renderers-KZWGSKRF.mjs +1 -0
  142. package/dist/preview-engine/renderers-LVDUZZ75.mjs +1 -0
  143. package/dist/preview-engine/renderers-M7R2ZJUP.mjs +1 -0
  144. package/dist/preview-engine/renderers-NWHS7N2L.mjs +1 -0
  145. package/dist/preview-engine/{renderers-CAUWP4XH.mjs → renderers-O2DZPBOJ.mjs} +3 -23
  146. package/dist/preview-engine/renderers-OT7D3BUA.mjs +1 -0
  147. package/dist/preview-engine/renderers-P4S7GL64.mjs +104 -0
  148. package/dist/preview-engine/renderers-PMOO7DLX.mjs +1 -0
  149. package/dist/preview-engine/renderers-Q4OFCMXI.mjs +1 -0
  150. package/dist/preview-engine/renderers-QCCPCH73.mjs +1 -0
  151. package/dist/preview-engine/renderers-RJO6H4FC.mjs +1 -0
  152. package/dist/preview-engine/renderers-RRXFJRGI.mjs +1 -0
  153. package/dist/preview-engine/renderers-SCJ6OKTB.mjs +1 -0
  154. package/dist/preview-engine/renderers-T4JMJXWL.mjs +1 -0
  155. package/dist/preview-engine/renderers-TAWT3ZSS.mjs +1 -0
  156. package/dist/preview-engine/{renderers-JQHUBWLL.mjs → renderers-TFZST6WW.mjs} +3 -23
  157. package/dist/preview-engine/renderers-UHTO6BQA.mjs +1 -0
  158. package/dist/preview-engine/renderers-UPKB5OLS.mjs +100 -0
  159. package/dist/preview-engine/renderers-UPTJJE5F.mjs +1 -0
  160. package/dist/preview-engine/renderers-VLMQR3DW.mjs +1 -0
  161. package/dist/preview-engine/renderers-WVTTRCVI.mjs +1 -0
  162. package/dist/preview-engine/renderers-X5PUIPU5.mjs +1 -0
  163. package/dist/preview-engine/renderers-XCMVZ2XG.mjs +35 -0
  164. package/dist/preview-engine/renderers-XHTMRXC5.mjs +1 -0
  165. package/dist/preview-engine/renderers-YDCDY3BR.mjs +1 -0
  166. package/dist/preview-engine/renderers-YECY2YFT.mjs +1 -0
  167. package/dist/preview-engine/renderers-YJNQ4B7B.mjs +1 -0
  168. package/dist/preview-engine/renderers-YMN6QXK7.mjs +1 -0
  169. package/dist/preview-engine/renderers-YZEVPHPQ.mjs +228 -0
  170. package/dist/preview-engine/renderers-Z7YQUFAY.mjs +1 -0
  171. package/dist/preview-engine/renderers-ZANPE3OK.mjs +1 -0
  172. package/dist/preview-engine/renderers-ZJTRANIX.mjs +1 -0
  173. package/dist/preview-engine/signals.mjs +1 -1
  174. package/dist/preview-engine/skia-canvas-QBXAOGPB.mjs +1 -0
  175. package/dist/{program-BmNKgzja.mjs → program-Cc5AsBHz.mjs} +93 -2335
  176. package/dist/program-Cc5AsBHz.mjs.map +1 -0
  177. package/dist/renderer/index.d.mts +2 -2
  178. package/dist/renderer/index.mjs +3 -4
  179. package/dist/renderer-1VSi7Vum.mjs +5 -0
  180. package/dist/renderer-4BlpUHQT.mjs +5 -0
  181. package/dist/{renderer-Bv21DbWy.mjs → renderer-9L0p8IT3.mjs} +3 -1
  182. package/dist/renderer-AzSX2-mZ.mjs +5 -0
  183. package/dist/renderer-B-cxK24t.mjs +5 -0
  184. package/dist/{renderer-DxTs4Iyi.mjs → renderer-B1Zn91xt.mjs} +40 -142
  185. package/dist/renderer-B1Zn91xt.mjs.map +1 -0
  186. package/dist/renderer-B5d5oM_D.mjs +5 -0
  187. package/dist/renderer-B8BdNjaN.mjs +5 -0
  188. package/dist/{renderer-Bhdf90Zq.mjs → renderer-BI5rvAyo.mjs} +51 -163
  189. package/dist/renderer-BI5rvAyo.mjs.map +1 -0
  190. package/dist/renderer-BKEfeg-4.mjs +5 -0
  191. package/dist/{renderer-CI7sG_cv.mjs → renderer-BKf1qDwL.mjs} +83 -266
  192. package/dist/renderer-BKf1qDwL.mjs.map +1 -0
  193. package/dist/renderer-BLLOkeFB.mjs +5 -0
  194. package/dist/renderer-BSitV56h.mjs +268 -0
  195. package/dist/renderer-BSitV56h.mjs.map +1 -0
  196. package/dist/renderer-BTvov1NH.mjs +5 -0
  197. package/dist/renderer-BVun05IK.mjs +5 -0
  198. package/dist/{renderer-B2ieylQ3.mjs → renderer-BWVsBB3t.mjs} +56 -167
  199. package/dist/renderer-BWVsBB3t.mjs.map +1 -0
  200. package/dist/{renderer-ChdLYS-G.mjs → renderer-BXQQxeNC.mjs} +20 -87
  201. package/dist/renderer-BXQQxeNC.mjs.map +1 -0
  202. package/dist/renderer-B_3h5nhy.mjs +5 -0
  203. package/dist/renderer-BaZjoFYK.mjs +5 -0
  204. package/dist/{renderer-CfC_aiew.mjs → renderer-BaaOR3Ao.mjs} +57 -192
  205. package/dist/renderer-BaaOR3Ao.mjs.map +1 -0
  206. package/dist/{renderer-bZU_ndxf.mjs → renderer-BajIOuZH.mjs} +2 -2
  207. package/dist/{renderer-bZU_ndxf.mjs.map → renderer-BajIOuZH.mjs.map} +1 -1
  208. package/dist/{renderer-CWTpc4ff.mjs → renderer-Bb8T5eRX.mjs} +76 -210
  209. package/dist/renderer-Bb8T5eRX.mjs.map +1 -0
  210. package/dist/{renderer-D2nCGcjv.mjs → renderer-Bc6J0iVG.mjs} +3 -3
  211. package/dist/{renderer-D2nCGcjv.mjs.map → renderer-Bc6J0iVG.mjs.map} +1 -1
  212. package/dist/renderer-BcApaCVe.mjs +5 -0
  213. package/dist/{renderer-D_1oDOCP.mjs → renderer-Bg7647VN.mjs} +14 -69
  214. package/dist/renderer-Bg7647VN.mjs.map +1 -0
  215. package/dist/{renderer-ho_jXJ0H.mjs → renderer-BhKIZDsm.mjs} +23 -117
  216. package/dist/renderer-BhKIZDsm.mjs.map +1 -0
  217. package/dist/{renderer-dncoIVdd.mjs → renderer-BhhSyHKF.mjs} +3 -1
  218. package/dist/{renderer-CXn5HAnK.mjs → renderer-Br9BOkQs.mjs} +10 -16
  219. package/dist/renderer-Br9BOkQs.mjs.map +1 -0
  220. package/dist/{renderer-BTdOMMEx.d.mts → renderer-Bs_f_App.d.mts} +2 -2
  221. package/dist/{renderer-BTdOMMEx.d.mts.map → renderer-Bs_f_App.d.mts.map} +1 -1
  222. package/dist/{renderer-DZGtBUCx.mjs → renderer-BygIYH8s.mjs} +35 -185
  223. package/dist/renderer-BygIYH8s.mjs.map +1 -0
  224. package/dist/{renderer-Bv6q84TU.mjs → renderer-C--Dqe-3.mjs} +61 -208
  225. package/dist/renderer-C--Dqe-3.mjs.map +1 -0
  226. package/dist/renderer-C14mKYCw.mjs +5 -0
  227. package/dist/{renderer-CnXW28b9.mjs → renderer-C27RfwXN.mjs} +85 -279
  228. package/dist/renderer-C27RfwXN.mjs.map +1 -0
  229. package/dist/{renderer-Dy0utCl7.mjs → renderer-C5caYAA3.mjs} +10 -17
  230. package/dist/renderer-C5caYAA3.mjs.map +1 -0
  231. package/dist/{renderer-Bfgd4N0O.mjs → renderer-C5zpaQed.mjs} +9 -16
  232. package/dist/renderer-C5zpaQed.mjs.map +1 -0
  233. package/dist/{renderer-cgxO2xN6.mjs → renderer-C7UZLOYk.mjs} +10 -17
  234. package/dist/renderer-C7UZLOYk.mjs.map +1 -0
  235. package/dist/{renderer-BJ1aTkZf.mjs → renderer-C92mwhZz.mjs} +99 -282
  236. package/dist/renderer-C92mwhZz.mjs.map +1 -0
  237. package/dist/{renderer-CepMDQ06.mjs → renderer-CAJe9eLS.mjs} +19 -106
  238. package/dist/renderer-CAJe9eLS.mjs.map +1 -0
  239. package/dist/renderer-CFqhAXkH.mjs +5 -0
  240. package/dist/renderer-CK-spD4j.mjs +5 -0
  241. package/dist/renderer-CLLzQTIk.mjs +5 -0
  242. package/dist/{renderer-CtyD_Xju.mjs → renderer-CMsjnZ0G.mjs} +59 -194
  243. package/dist/renderer-CMsjnZ0G.mjs.map +1 -0
  244. package/dist/renderer-COwa6xlF.mjs +5 -0
  245. package/dist/renderer-CQPuuoVf.mjs +6 -0
  246. package/dist/renderer-CRd-cDqZ.mjs +5 -0
  247. package/dist/renderer-CTVnQAUm.mjs +5 -0
  248. package/dist/renderer-CbiEBSGx.mjs +5 -0
  249. package/dist/renderer-Cl7PruQ1.mjs +5 -0
  250. package/dist/renderer-CmuGGUDR.mjs +5 -0
  251. package/dist/renderer-CoGP4Mvf.mjs +148 -0
  252. package/dist/renderer-CoGP4Mvf.mjs.map +1 -0
  253. package/dist/renderer-CoNRrfqx.mjs +5 -0
  254. package/dist/{renderer-BREIjsUU.mjs → renderer-CrAqu3Rg.mjs} +14 -40
  255. package/dist/renderer-CrAqu3Rg.mjs.map +1 -0
  256. package/dist/renderer-CvIGa0mE.mjs +5 -0
  257. package/dist/renderer-CwMDPv0p.mjs +5 -0
  258. package/dist/{renderer-BIIWCg_J.mjs → renderer-CydWqyf0.mjs} +11 -18
  259. package/dist/renderer-CydWqyf0.mjs.map +1 -0
  260. package/dist/{renderer-bsWnRNpJ.mjs → renderer-CzBQgGD2.mjs} +29 -98
  261. package/dist/renderer-CzBQgGD2.mjs.map +1 -0
  262. package/dist/{renderer-CdciwwMI.mjs → renderer-D0aZNkQE.mjs} +161 -457
  263. package/dist/renderer-D0aZNkQE.mjs.map +1 -0
  264. package/dist/{renderer-B8UaFNqb.mjs → renderer-D2BRlqof.mjs} +62 -209
  265. package/dist/renderer-D2BRlqof.mjs.map +1 -0
  266. package/dist/{renderer-B8-kzZdP.mjs → renderer-D2FFvxsq.mjs} +41 -140
  267. package/dist/renderer-D2FFvxsq.mjs.map +1 -0
  268. package/dist/{renderer-Ctk2zzfy.mjs → renderer-D8-zNjyz.mjs} +57 -197
  269. package/dist/renderer-D8-zNjyz.mjs.map +1 -0
  270. package/dist/{renderer-DML9qpmS.mjs → renderer-DDqwds9R.mjs} +52 -202
  271. package/dist/renderer-DDqwds9R.mjs.map +1 -0
  272. package/dist/{renderer-BSaYG8aw.mjs → renderer-DGtBOdst.mjs} +3 -1
  273. package/dist/{renderer-CzPWB0Ss.mjs → renderer-DKqG9Lek.mjs} +13 -45
  274. package/dist/renderer-DKqG9Lek.mjs.map +1 -0
  275. package/dist/renderer-DOHbhGPu.mjs +5 -0
  276. package/dist/renderer-DOmA6IKc.mjs +5 -0
  277. package/dist/{renderer-DirxsOjq.mjs → renderer-DUhXH5Tz.mjs} +80 -258
  278. package/dist/renderer-DUhXH5Tz.mjs.map +1 -0
  279. package/dist/{renderer-kwmlLQOO.mjs → renderer-DVnVnS3c.mjs} +4 -4
  280. package/dist/{renderer-kwmlLQOO.mjs.map → renderer-DVnVnS3c.mjs.map} +1 -1
  281. package/dist/{renderer-CaaOKMSd.mjs → renderer-DWEvQ-hQ.mjs} +63 -190
  282. package/dist/renderer-DWEvQ-hQ.mjs.map +1 -0
  283. package/dist/renderer-DX2qEJTL.mjs +2173 -0
  284. package/dist/renderer-DX2qEJTL.mjs.map +1 -0
  285. package/dist/{renderer-1VuQTY1Z.mjs → renderer-DX8aBDqR.mjs} +236 -96
  286. package/dist/renderer-DX8aBDqR.mjs.map +1 -0
  287. package/dist/{renderer-DEJwPRkR.mjs → renderer-DYIPWN_B.mjs} +15 -51
  288. package/dist/renderer-DYIPWN_B.mjs.map +1 -0
  289. package/dist/{renderer-Djlb4TLO.mjs → renderer-DZD2G76E.mjs} +8 -15
  290. package/dist/renderer-DZD2G76E.mjs.map +1 -0
  291. package/dist/{renderer-WSGuj_V6.mjs → renderer-Da06_9FZ.mjs} +4 -3
  292. package/dist/{renderer-WSGuj_V6.mjs.map → renderer-Da06_9FZ.mjs.map} +1 -1
  293. package/dist/{renderer-BM05sB8m.mjs → renderer-DkyXqrQ6.mjs} +11 -74
  294. package/dist/renderer-DkyXqrQ6.mjs.map +1 -0
  295. package/dist/renderer-DmCWc4JL.mjs +5 -0
  296. package/dist/{renderer-BDbTWSpP.mjs → renderer-Dno-fujw.mjs} +58 -234
  297. package/dist/renderer-Dno-fujw.mjs.map +1 -0
  298. package/dist/{renderer-D2XD4QYk.mjs → renderer-DoYdfDEA.mjs} +34 -147
  299. package/dist/renderer-DoYdfDEA.mjs.map +1 -0
  300. package/dist/{renderer-_uvdg48N.mjs → renderer-DqjITuT-.mjs} +24 -93
  301. package/dist/renderer-DqjITuT-.mjs.map +1 -0
  302. package/dist/renderer-DuuOlYIG.mjs +3 -0
  303. package/dist/{renderer-DIgsilTw.mjs → renderer-Dy-DBU0X.mjs} +5 -4
  304. package/dist/{renderer-DIgsilTw.mjs.map → renderer-Dy-DBU0X.mjs.map} +1 -1
  305. package/dist/{renderer-CpkiHRhh.mjs → renderer-DyzNM721.mjs} +17 -99
  306. package/dist/renderer-DyzNM721.mjs.map +1 -0
  307. package/dist/{renderer-C_TPMHiH.mjs → renderer-DzrM1KMN.mjs} +81 -221
  308. package/dist/renderer-DzrM1KMN.mjs.map +1 -0
  309. package/dist/{renderer-Bc04fivZ.mjs → renderer-FHyZn0em.mjs} +99 -287
  310. package/dist/renderer-FHyZn0em.mjs.map +1 -0
  311. package/dist/renderer-GSFP7v2z.mjs +3 -0
  312. package/dist/{renderer-DpGc-N3G.mjs → renderer-NXdm6HLb.mjs} +24 -104
  313. package/dist/renderer-NXdm6HLb.mjs.map +1 -0
  314. package/dist/renderer-OLaYikwi.mjs +5 -0
  315. package/dist/renderer-Q75RC5Uz.mjs +5 -0
  316. package/dist/renderer-T0LJ4Po3.mjs +5 -0
  317. package/dist/renderer-VuXt1hfq.mjs +5 -0
  318. package/dist/{renderer-BfAWZziM.mjs → renderer-_1xGBbxn.mjs} +58 -225
  319. package/dist/renderer-_1xGBbxn.mjs.map +1 -0
  320. package/dist/{renderer-B1YMwl2B.mjs → renderer-c4AorKyw.mjs} +3 -1
  321. package/dist/renderer-hY_2WLt3.mjs +5 -0
  322. package/dist/{renderer-BhZZEyFX.mjs → renderer-mp1NN5zk.mjs} +4 -4
  323. package/dist/{renderer-BhZZEyFX.mjs.map → renderer-mp1NN5zk.mjs.map} +1 -1
  324. package/dist/{renderer-D7zvPHKn.mjs → renderer-qsg-JMuN.mjs} +18 -28
  325. package/dist/renderer-qsg-JMuN.mjs.map +1 -0
  326. package/dist/{renderer-vqkKWqa5.mjs → renderer-timEC0Gl.mjs} +23 -107
  327. package/dist/renderer-timEC0Gl.mjs.map +1 -0
  328. package/dist/renderer-y4EqE06a.mjs +5 -0
  329. package/dist/{renderers-CP8CFWDs-DwQTx8S7.mjs → renderers-CP8CFWDs-CMYe4kvZ.mjs} +4 -4
  330. package/dist/{renderers-CP8CFWDs-DwQTx8S7.mjs.map → renderers-CP8CFWDs-CMYe4kvZ.mjs.map} +1 -1
  331. package/dist/signals/index.d.mts +6 -6
  332. package/dist/signals/index.mjs +8 -8
  333. package/dist/{signals-Bv1OweKd.mjs → signals-DGRs6ddH.mjs} +4 -4
  334. package/dist/{signals-Bv1OweKd.mjs.map → signals-DGRs6ddH.mjs.map} +1 -1
  335. package/package.json +55 -55
  336. package/dist/client-CwRhflHE.mjs +0 -66
  337. package/dist/client-CwRhflHE.mjs.map +0 -1
  338. package/dist/dist-BAVZdFEJ.mjs.map +0 -1
  339. package/dist/dist-BYqNNwsl.mjs.map +0 -1
  340. package/dist/dist-CbG3QxDw.mjs.map +0 -1
  341. package/dist/dist-Cxi68OuY.mjs.map +0 -1
  342. package/dist/dist-cjs--lfMLs3U.mjs +0 -66
  343. package/dist/dist-cjs--lfMLs3U.mjs.map +0 -1
  344. package/dist/dist-cjs--pxyGFw2.mjs +0 -43
  345. package/dist/dist-cjs--pxyGFw2.mjs.map +0 -1
  346. package/dist/dist-cjs-3pon9kTt.mjs +0 -6
  347. package/dist/dist-cjs-BDpO-TH_.mjs +0 -51
  348. package/dist/dist-cjs-BDpO-TH_.mjs.map +0 -1
  349. package/dist/dist-cjs-BiKQozdJ.mjs +0 -64
  350. package/dist/dist-cjs-BiKQozdJ.mjs.map +0 -1
  351. package/dist/dist-cjs-BmyyWYWv.mjs +0 -153
  352. package/dist/dist-cjs-BmyyWYWv.mjs.map +0 -1
  353. package/dist/dist-cjs-CND_ghfH.mjs +0 -98
  354. package/dist/dist-cjs-CND_ghfH.mjs.map +0 -1
  355. package/dist/dist-cjs-CQwmMllY.mjs +0 -137
  356. package/dist/dist-cjs-CQwmMllY.mjs.map +0 -1
  357. package/dist/dist-cjs-CgFzrgj8.mjs +0 -85
  358. package/dist/dist-cjs-CgFzrgj8.mjs.map +0 -1
  359. package/dist/dist-cjs-CsU2sZoX.mjs +0 -323
  360. package/dist/dist-cjs-CsU2sZoX.mjs.map +0 -1
  361. package/dist/dist-cjs-DJ8fcQEe.mjs +0 -9069
  362. package/dist/dist-cjs-DJ8fcQEe.mjs.map +0 -1
  363. package/dist/dist-cjs-DT2jJlcK.mjs +0 -181
  364. package/dist/dist-cjs-DT2jJlcK.mjs.map +0 -1
  365. package/dist/dist-cjs-DjzmP0-x.mjs +0 -1091
  366. package/dist/dist-cjs-DjzmP0-x.mjs.map +0 -1
  367. package/dist/dist-cjs-DzjrlfbE.mjs +0 -437
  368. package/dist/dist-cjs-DzjrlfbE.mjs.map +0 -1
  369. package/dist/dist-cjs-M-8QOgS_.mjs +0 -209
  370. package/dist/dist-cjs-M-8QOgS_.mjs.map +0 -1
  371. package/dist/dist-cjs-TsA8LFXC.mjs +0 -48
  372. package/dist/dist-cjs-TsA8LFXC.mjs.map +0 -1
  373. package/dist/dist-cjs-agQl9T8M.mjs +0 -5015
  374. package/dist/dist-cjs-agQl9T8M.mjs.map +0 -1
  375. package/dist/event-streams-BaNGaLxh.mjs +0 -204
  376. package/dist/event-streams-BaNGaLxh.mjs.map +0 -1
  377. package/dist/fonts-C0W6TgJk.mjs.map +0 -1
  378. package/dist/index-9B8CJowc.d.mts.map +0 -1
  379. package/dist/index-CYGpSVsf.d.mts.map +0 -1
  380. package/dist/index-DDEPvMww.d.mts.map +0 -1
  381. package/dist/index-DnWsbbuZ.d.mts.map +0 -1
  382. package/dist/package-XpCRbTOA.mjs +0 -6
  383. package/dist/package-XpCRbTOA.mjs.map +0 -1
  384. package/dist/preview-BV2C4Fk6.mjs.map +0 -1
  385. package/dist/preview-engine/chunk-36YGYLKD.mjs +0 -58
  386. package/dist/preview-engine/chunk-7O24H4YT.mjs +0 -117
  387. package/dist/preview-engine/chunk-AUFSM5KI.mjs +0 -141
  388. package/dist/preview-engine/chunk-BHFI3Y4T.mjs +0 -1
  389. package/dist/preview-engine/chunk-BQ65MU6H.mjs +0 -138
  390. package/dist/preview-engine/chunk-BWDARDO6.mjs +0 -117
  391. package/dist/preview-engine/chunk-DLXQDDIN.mjs +0 -46
  392. package/dist/preview-engine/chunk-EJGLUZMW.mjs +0 -1
  393. package/dist/preview-engine/chunk-FE6RSVKZ.mjs +0 -73
  394. package/dist/preview-engine/chunk-FGHOHCFG.mjs +0 -110
  395. package/dist/preview-engine/chunk-HPIULG7P.mjs +0 -111
  396. package/dist/preview-engine/chunk-HRIKNYPF.mjs +0 -60
  397. package/dist/preview-engine/chunk-IMV5SBQV.mjs +0 -1
  398. package/dist/preview-engine/chunk-JPXQPP6J.mjs +0 -1
  399. package/dist/preview-engine/chunk-K52S5DJX.mjs +0 -109
  400. package/dist/preview-engine/chunk-L3IEJZ5S.mjs +0 -474
  401. package/dist/preview-engine/chunk-M7NMFDJ3.mjs +0 -3
  402. package/dist/preview-engine/chunk-MJM3NFEC.mjs +0 -315
  403. package/dist/preview-engine/chunk-NFAGEP43.mjs +0 -1448
  404. package/dist/preview-engine/chunk-NRHSNPZV.mjs +0 -182
  405. package/dist/preview-engine/chunk-OWOSYNMF.mjs +0 -104
  406. package/dist/preview-engine/chunk-Q66QQI6N.mjs +0 -8
  407. package/dist/preview-engine/chunk-QGBSLNFI.mjs +0 -52
  408. package/dist/preview-engine/chunk-QM3XFEJN.mjs +0 -63
  409. package/dist/preview-engine/chunk-R3ZH7YF3.mjs +0 -89
  410. package/dist/preview-engine/chunk-R6YNSBKL.mjs +0 -108
  411. package/dist/preview-engine/chunk-S4CSX6K5.mjs +0 -610
  412. package/dist/preview-engine/chunk-SNYAHQ25.mjs +0 -186
  413. package/dist/preview-engine/chunk-SRT2OCQW.mjs +0 -1
  414. package/dist/preview-engine/chunk-SUUUYXXT.mjs +0 -1
  415. package/dist/preview-engine/chunk-T6COGNOW.mjs +0 -134
  416. package/dist/preview-engine/chunk-XFYXT76H.mjs +0 -52
  417. package/dist/preview-engine/chunk-XUM42I4R.mjs +0 -1
  418. package/dist/preview-engine/chunk-YITWSOG4.mjs +0 -103
  419. package/dist/preview-engine/chunk-ZDCA6NVT.mjs +0 -82
  420. package/dist/preview-engine/chunk-ZNGOAGAI.mjs +0 -1
  421. package/dist/preview-engine/renderers-27Q5X3U6.mjs +0 -1
  422. package/dist/preview-engine/renderers-4AHH6BHF.mjs +0 -1
  423. package/dist/preview-engine/renderers-5BV6JGTU.mjs +0 -248
  424. package/dist/preview-engine/renderers-6PRVCTYV.mjs +0 -1
  425. package/dist/preview-engine/renderers-76PQY2SO.mjs +0 -1
  426. package/dist/preview-engine/renderers-7X2W6QWX.mjs +0 -1
  427. package/dist/preview-engine/renderers-B52QT6MT.mjs +0 -55
  428. package/dist/preview-engine/renderers-BE6RVJSE.mjs +0 -1
  429. package/dist/preview-engine/renderers-BMM2BH56.mjs +0 -1
  430. package/dist/preview-engine/renderers-CHOGQHVQ.mjs +0 -1
  431. package/dist/preview-engine/renderers-CRKRWR2Y.mjs +0 -1
  432. package/dist/preview-engine/renderers-DEYDSGJX.mjs +0 -1
  433. package/dist/preview-engine/renderers-DZTNRCR7.mjs +0 -1
  434. package/dist/preview-engine/renderers-ELO3KWTK.mjs +0 -1
  435. package/dist/preview-engine/renderers-EOJMPPAQ.mjs +0 -1
  436. package/dist/preview-engine/renderers-F2KJNDWA.mjs +0 -124
  437. package/dist/preview-engine/renderers-FCV4COVB.mjs +0 -1
  438. package/dist/preview-engine/renderers-G5KQISVL.mjs +0 -1
  439. package/dist/preview-engine/renderers-GJSUN5HU.mjs +0 -1
  440. package/dist/preview-engine/renderers-GMX2ZQDG.mjs +0 -1
  441. package/dist/preview-engine/renderers-GXCRINGC.mjs +0 -1
  442. package/dist/preview-engine/renderers-IHKORHMT.mjs +0 -1
  443. package/dist/preview-engine/renderers-JA4SLMG3.mjs +0 -1
  444. package/dist/preview-engine/renderers-JLN77CFZ.mjs +0 -1
  445. package/dist/preview-engine/renderers-KBFW7B5F.mjs +0 -1
  446. package/dist/preview-engine/renderers-LJRJMFCR.mjs +0 -1
  447. package/dist/preview-engine/renderers-LPAPZ5QS.mjs +0 -1
  448. package/dist/preview-engine/renderers-NQUDQEHY.mjs +0 -1
  449. package/dist/preview-engine/renderers-NS3AIJVG.mjs +0 -1
  450. package/dist/preview-engine/renderers-NSY2SDIE.mjs +0 -1
  451. package/dist/preview-engine/renderers-PW4OJWHF.mjs +0 -120
  452. package/dist/preview-engine/renderers-PWLWOZY4.mjs +0 -1
  453. package/dist/preview-engine/renderers-Q3MD34JN.mjs +0 -1
  454. package/dist/preview-engine/renderers-RXGNA2Q7.mjs +0 -1
  455. package/dist/preview-engine/renderers-TVTQ2R74.mjs +0 -1
  456. package/dist/preview-engine/renderers-VTTGFO55.mjs +0 -1
  457. package/dist/preview-engine/renderers-W3VVM5HB.mjs +0 -1
  458. package/dist/preview-engine/renderers-WG7QBD4D.mjs +0 -1
  459. package/dist/preview-engine/renderers-WLLJFZTF.mjs +0 -1
  460. package/dist/preview-engine/renderers-WN4SYFCU.mjs +0 -1
  461. package/dist/preview-engine/renderers-WSMLLSWX.mjs +0 -1
  462. package/dist/preview-engine/renderers-XFBSGTHU.mjs +0 -1
  463. package/dist/preview-engine/renderers-XFC6ZPO5.mjs +0 -1
  464. package/dist/preview-engine/renderers-XUHRY3XH.mjs +0 -1
  465. package/dist/preview-engine/renderers-YAOB5XU6.mjs +0 -1
  466. package/dist/preview-engine/renderers-YTB4FOHT.mjs +0 -1
  467. package/dist/preview-engine/renderers-ZIMBODX6.mjs +0 -1
  468. package/dist/program-BmNKgzja.mjs.map +0 -1
  469. package/dist/renderer-1VuQTY1Z.mjs.map +0 -1
  470. package/dist/renderer-6oMSare3.mjs +0 -3
  471. package/dist/renderer-B1ComPb2.mjs +0 -3
  472. package/dist/renderer-B2XzjK0z.mjs +0 -3
  473. package/dist/renderer-B2ieylQ3.mjs.map +0 -1
  474. package/dist/renderer-B8-kzZdP.mjs.map +0 -1
  475. package/dist/renderer-B8UaFNqb.mjs.map +0 -1
  476. package/dist/renderer-BDbTWSpP.mjs.map +0 -1
  477. package/dist/renderer-BIIWCg_J.mjs.map +0 -1
  478. package/dist/renderer-BJ1aTkZf.mjs.map +0 -1
  479. package/dist/renderer-BM05sB8m.mjs.map +0 -1
  480. package/dist/renderer-BQ5Bz5D0.mjs +0 -3
  481. package/dist/renderer-BREIjsUU.mjs.map +0 -1
  482. package/dist/renderer-BTu2EVhF.mjs +0 -3
  483. package/dist/renderer-BZcn_iBl.mjs +0 -3
  484. package/dist/renderer-Bc04fivZ.mjs.map +0 -1
  485. package/dist/renderer-BfAWZziM.mjs.map +0 -1
  486. package/dist/renderer-BfJSUjPN.mjs +0 -3
  487. package/dist/renderer-Bfgd4N0O.mjs.map +0 -1
  488. package/dist/renderer-Bhdf90Zq.mjs.map +0 -1
  489. package/dist/renderer-Bp6sDMa6.mjs +0 -3
  490. package/dist/renderer-Bt7_sb_Y.mjs +0 -3
  491. package/dist/renderer-Bv6q84TU.mjs.map +0 -1
  492. package/dist/renderer-C-H680_l.mjs +0 -3
  493. package/dist/renderer-C606ZPUn.mjs +0 -3
  494. package/dist/renderer-C9jyKn1i.mjs +0 -3
  495. package/dist/renderer-CDLrNgfo.mjs +0 -3
  496. package/dist/renderer-CERfcxgv.mjs +0 -3
  497. package/dist/renderer-CG5PzNkv.mjs +0 -3
  498. package/dist/renderer-CI7sG_cv.mjs.map +0 -1
  499. package/dist/renderer-CPoIMVdk.mjs +0 -3
  500. package/dist/renderer-CQdVj2JS.mjs +0 -3
  501. package/dist/renderer-CQiTodg9.mjs +0 -337
  502. package/dist/renderer-CQiTodg9.mjs.map +0 -1
  503. package/dist/renderer-CWTpc4ff.mjs.map +0 -1
  504. package/dist/renderer-CXn5HAnK.mjs.map +0 -1
  505. package/dist/renderer-CZgB5st8.mjs +0 -3
  506. package/dist/renderer-C_TPMHiH.mjs.map +0 -1
  507. package/dist/renderer-Ca7L1EOp.mjs +0 -3
  508. package/dist/renderer-CaaOKMSd.mjs.map +0 -1
  509. package/dist/renderer-CdciwwMI.mjs.map +0 -1
  510. package/dist/renderer-CepMDQ06.mjs.map +0 -1
  511. package/dist/renderer-CfC_aiew.mjs.map +0 -1
  512. package/dist/renderer-ChdLYS-G.mjs.map +0 -1
  513. package/dist/renderer-CkykdR_D.mjs +0 -3
  514. package/dist/renderer-Cl6GkeHx.mjs +0 -3
  515. package/dist/renderer-ClcjrFyo.mjs +0 -3
  516. package/dist/renderer-CnXW28b9.mjs.map +0 -1
  517. package/dist/renderer-CpkiHRhh.mjs.map +0 -1
  518. package/dist/renderer-CtVkU_GA.mjs +0 -44
  519. package/dist/renderer-CtVkU_GA.mjs.map +0 -1
  520. package/dist/renderer-Ctk2zzfy.mjs.map +0 -1
  521. package/dist/renderer-CtyD_Xju.mjs.map +0 -1
  522. package/dist/renderer-CySUP_wk.mjs +0 -3
  523. package/dist/renderer-CzPWB0Ss.mjs.map +0 -1
  524. package/dist/renderer-D2XD4QYk.mjs.map +0 -1
  525. package/dist/renderer-D2l_Odyg.mjs +0 -3
  526. package/dist/renderer-D7zvPHKn.mjs.map +0 -1
  527. package/dist/renderer-D9NnIx7o.mjs +0 -3
  528. package/dist/renderer-DCPCYySt.mjs +0 -3
  529. package/dist/renderer-DEJwPRkR.mjs.map +0 -1
  530. package/dist/renderer-DIkpJEOZ.mjs +0 -3
  531. package/dist/renderer-DML9qpmS.mjs.map +0 -1
  532. package/dist/renderer-DNSXPkf_.mjs +0 -3
  533. package/dist/renderer-DP-CvZ_Z.mjs +0 -3
  534. package/dist/renderer-DZGtBUCx.mjs.map +0 -1
  535. package/dist/renderer-D_1oDOCP.mjs.map +0 -1
  536. package/dist/renderer-DeXb8R6h.mjs +0 -3
  537. package/dist/renderer-DezO-ZaP.mjs +0 -4
  538. package/dist/renderer-DhXe04fC.mjs +0 -3
  539. package/dist/renderer-DirxsOjq.mjs.map +0 -1
  540. package/dist/renderer-Djlb4TLO.mjs.map +0 -1
  541. package/dist/renderer-DnH3SI7w.mjs +0 -3
  542. package/dist/renderer-DpGc-N3G.mjs.map +0 -1
  543. package/dist/renderer-Dpw4oi33.mjs +0 -3
  544. package/dist/renderer-DxTs4Iyi.mjs.map +0 -1
  545. package/dist/renderer-Dy0utCl7.mjs.map +0 -1
  546. package/dist/renderer-Md-ytU0v.mjs +0 -3
  547. package/dist/renderer-RKsXlF_0.mjs +0 -23900
  548. package/dist/renderer-RKsXlF_0.mjs.map +0 -1
  549. package/dist/renderer-U-bhWO9Q.mjs +0 -3
  550. package/dist/renderer-_uvdg48N.mjs.map +0 -1
  551. package/dist/renderer-bsWnRNpJ.mjs.map +0 -1
  552. package/dist/renderer-cgxO2xN6.mjs.map +0 -1
  553. package/dist/renderer-d5-F_48R.mjs +0 -3
  554. package/dist/renderer-ho_jXJ0H.mjs.map +0 -1
  555. package/dist/renderer-vqkKWqa5.mjs.map +0 -1
  556. package/dist/renderer-zA5okHds.mjs +0 -3
  557. package/dist/signin-Db08vl-g.mjs +0 -865
  558. package/dist/signin-Db08vl-g.mjs.map +0 -1
  559. package/dist/sso-oidc-CpLz_lIu.mjs +0 -1051
  560. package/dist/sso-oidc-CpLz_lIu.mjs.map +0 -1
  561. package/dist/sts-BQefGuml.mjs +0 -6
  562. package/dist/sts-Dgl0kH-t.mjs +0 -1395
  563. package/dist/sts-Dgl0kH-t.mjs.map +0 -1
  564. /package/dist/{renderer-C2n-EHxg.mjs → renderer-B-BcgA6d.mjs} +0 -0
@@ -0,0 +1,1448 @@
1
+ import{a as mi}from"./chunk-OCX5AD23.mjs";import{o as tt,r as Zn}from"./chunk-RQLMW6MA.mjs";import{h as Tn,l as Jn}from"./chunk-24P6DAB3.mjs";import{d as Yn}from"./chunk-6YJP57MZ.mjs";import{e as te,q as Vn,r as Wn,s as GA,t as zn,u as Xn}from"./chunk-BWJS6G7R.mjs";import{r as CA}from"./chunk-MTJHQATU.mjs";import{a as et}from"./chunk-IQC2I5A5.mjs";import{c as On,e as Kn}from"./chunk-IQKIHFNZ.mjs";import{d as Jt}from"./chunk-HYBAPT6I.mjs";import{o as TA}from"./chunk-YAQFFQPG.mjs";import{a as di,c as Hn,e as v}from"./chunk-BVF64D6H.mjs";var nr=di((Oa,tr)=>{v();var ot=()=>new Proxy(function(){},{get:(A,e)=>e==="__esModule"?!0:e===Symbol.toPrimitive?()=>"":ot(),apply:()=>ot(),construct:()=>ot()});tr.exports=ot()});v();var _n=new Float32Array(2048);for(let A=0;A<2048;A++)_n[A]=.5*(1-Math.cos(2*Math.PI*A/2047));var jn=new Uint16Array(2048);for(let A=0;A<2048;A++){let e=0,t=A;for(let n=0;n<11;n++)e=e<<1|t&1,t>>=1;jn[A]=e}var $n=new Float32Array(2048/2),Ar=new Float32Array(2048/2);for(let A=0;A<2048/2;A++){let e=-2*Math.PI*A/2048;$n[A]=Math.cos(e),Ar[A]=Math.sin(e)}function hi(A,e){for(let t=0;t<2048;t++){let n=jn[t]??0;if(n>t){let r=A[t]??0;A[t]=A[n]??0,A[n]=r;let i=e[t]??0;e[t]=e[n]??0,e[n]=i}}for(let t=2;t<=2048;t<<=1){let n=t>>1,r=2048/t;for(let i=0;i<2048;i+=t)for(let o=0;o<n;o++){let a=o*r,s=$n[a]??1,g=Ar[a]??0,l=A[i+o]??0,I=e[i+o]??0,B=A[i+o+n]??0,E=e[i+o+n]??0,Q=B*s-E*g,C=B*g+E*s;A[i+o]=l+Q,e[i+o]=I+C,A[i+o+n]=l-Q,e[i+o+n]=I-C}}}var nt=class A{tempReal=new Float32Array(2048);tempImag=new Float32Array(2048);previousBins=new Float32Array(1024);extractAtTime(e,t,n){let r=e.length,i=r>0?e[0]?.length??0:0,a=Math.round(n*t)-1024;for(let G=0;G<2048;G++){let M=a+G,w=0;M>=0&&M<i&&(r===1?w=e[0]?.[M]??0:r>=2&&(w=((e[0]?.[M]??0)+(e[1]?.[M]??0))*.5)),this.tempReal[G]=w*(_n[G]??1),this.tempImag[G]=0}hi(this.tempReal,this.tempImag);let s=new Float32Array(1024),g=2/2048;for(let G=0;G<1024;G++){let M=this.tempReal[G]??0,w=this.tempImag[G]??0;s[G]=Math.sqrt(M*M+w*w)*g*2}let l=t/2048,I=Math.max(1,Math.round(20/l)),B=Math.max(I+1,Math.round(150/l)),E=0;for(let G=I;G<=B&&G<1024;G++)E+=(s[G]??0)*(s[G]??0);let Q=Math.min(1,Math.sqrt(E/(B-I+1))*4),C=0;for(let G=0;G<1024;G++){let M=(s[G]??0)-(this.previousBins[G]??0);M>0&&(C+=M),this.previousBins[G]=s[G]??0}let p=Math.min(1,C*.15),h=Math.round(300/l),d=Math.min(1023,Math.round(3400/l)),D=0;for(let G=h;G<=d;G++)D+=(s[G]??0)*(s[G]??0);let x=Math.min(1,Math.sqrt(D/(d-h+1))*3.5);return{fftBins:s,bassEnergy:Q,drumTransient:p,vocalEnergy:x,timeMs:n*1e3}}static packBufferData(e){let t=new Float32Array(1028);return t.set(e.fftBins,0),t[1024]=e.bassEnergy,t[1025]=e.drumTransient,t[1026]=e.vocalEnergy,t[1027]=e.timeMs,t}static createGpuBuffer(e,t){let n=t?A.packBufferData(t):new Float32Array(1028),r=e.createBuffer({label:"AudioLatentBuffer",size:4112,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_DST,mappedAtCreation:!0});return new Float32Array(r.getMappedRange()).set(n),r.unmap(),r}static updateGpuBuffer(e,t,n){let r=A.packBufferData(n);e.queue.writeBuffer(t,0,r)}},qn=class{constructor(e,t,n,r){this.channels=e;this.sampleRate=t;this.fps=n;this.totalFrames=r;let i=new nt,o=t||48e3,a=n||30,s=e[0]?.length??0,g=Math.max(10,Math.ceil(s/o*a)+10),l=typeof r=="number"&&Number.isFinite(r)&&r>0?Math.round(r):g;this.frames=new Array(l);for(let I=0;I<l;I++){let B=I/a;this.frames[I]=i.extractAtTime(e,o,B)}}channels;sampleRate;fps;totalFrames;frames=[];gpuBuffers=new WeakMap;getFrameData(e){let t=Math.max(0,Math.min(this.totalFrames-1,Math.round(e)));return this.frames[t]??{fftBins:new Float32Array(1024),bassEnergy:0,drumTransient:0,vocalEnergy:0,timeMs:t/this.fps*1e3}}getGpuBuffer(e,t){let n=this.gpuBuffers.get(e);n||(n=new Map,this.gpuBuffers.set(e,n));let r=Math.max(0,Math.min(this.totalFrames-1,Math.round(t))),i=n.get(r);if(!i){let o=this.getFrameData(r);i=nt.createGpuBuffer(e,o),n.set(r,i)}return i}};v();var R={create(A=0,e=0,t=0){return[A,e,t]},copy(A){return[A[0],A[1],A[2]]},set(A,e,t,n){return A[0]=e,A[1]=t,A[2]=n,A},add(A,e){return[A[0]+e[0],A[1]+e[1],A[2]+e[2]]},subtract(A,e){return[A[0]-e[0],A[1]-e[1],A[2]-e[2]]},multiplyScalar(A,e){return[A[0]*e,A[1]*e,A[2]*e]},dot(A,e){return A[0]*e[0]+A[1]*e[1]+A[2]*e[2]},cross(A,e){return[A[1]*e[2]-A[2]*e[1],A[2]*e[0]-A[0]*e[2],A[0]*e[1]-A[1]*e[0]]},lengthSq(A){return A[0]*A[0]+A[1]*A[1]+A[2]*A[2]},length(A){return Math.hypot(A[0],A[1],A[2])},distance(A,e){return Math.hypot(A[0]-e[0],A[1]-e[1],A[2]-e[2])},normalize(A){let e=Math.hypot(A[0],A[1],A[2]);if(e===0)return[0,0,0];let t=1/e;return[A[0]*t,A[1]*t,A[2]*t]},lerp(A,e,t){return[A[0]+(e[0]-A[0])*t,A[1]+(e[1]-A[1])*t,A[2]+(e[2]-A[2])*t]},equals(A,e,t=1e-6){return Math.abs(A[0]-e[0])<=t&&Math.abs(A[1]-e[1])<=t&&Math.abs(A[2]-e[2])<=t}};v();var _={identity(){return[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1]},copy(A){return[...A]},multiply(A,e){let t=new Array(16);for(let n=0;n<4;n++)for(let r=0;r<4;r++)t[r*4+n]=A[0+n]*e[r*4+0]+A[4+n]*e[r*4+1]+A[8+n]*e[r*4+2]+A[12+n]*e[r*4+3];return t},translate(A,e,t=0){return[1,0,0,0,0,1,0,0,0,0,1,0,A,e,t,1]},scale(A,e,t=1){return[A,0,0,0,0,e,0,0,0,0,t,0,0,0,0,1]},rotateX(A){let e=Math.cos(A),t=Math.sin(A);return[1,0,0,0,0,e,t,0,0,-t,e,0,0,0,0,1]},rotateY(A){let e=Math.cos(A),t=Math.sin(A);return[e,0,-t,0,0,1,0,0,t,0,e,0,0,0,0,1]},rotateZ(A){let e=Math.cos(A),t=Math.sin(A);return[e,t,0,0,-t,e,0,0,0,0,1,0,0,0,0,1]},rotateAxis(A,e){let t=R.normalize(A),n=t[0],r=t[1],i=t[2],o=Math.cos(e),a=Math.sin(e),s=1-o;return[s*n*n+o,s*n*r+a*i,s*n*i-a*r,0,s*n*r-a*i,s*r*r+o,s*r*i+a*n,0,s*n*i+a*r,s*r*i-a*n,s*i*i+o,0,0,0,0,1]},lookAt(A,e,t=[0,-1,0]){let n=R.subtract(e,A);R.lengthSq(n)===0?n=[0,0,1]:n=R.normalize(n);let r=R.cross(n,t);R.lengthSq(r)===0?r=[1,0,0]:r=R.normalize(r);let i=R.cross(r,n);return[r[0],i[0],n[0],0,r[1],i[1],n[1],0,r[2],i[2],n[2],0,-R.dot(r,A),-R.dot(i,A),-R.dot(n,A),1]},perspective(A,e,t,n){let r=1/Math.tan(A/2),i=1/(n-t);return[r/e,0,0,0,0,r,0,0,0,0,n*i,1,0,0,-t*n*i,0]},orthographic(A,e,t,n,r,i){let o=1/(e-A),a=1/(n-t),s=1/(i-r);return[2*o,0,0,0,0,2*a,0,0,0,0,s,0,-(e+A)*o,-(n+t)*a,-r*s,1]},invert(A){let e=new Array(16);e[0]=A[5]*A[10]*A[15]-A[5]*A[11]*A[14]-A[9]*A[6]*A[15]+A[9]*A[7]*A[14]+A[13]*A[6]*A[11]-A[13]*A[7]*A[10],e[4]=-A[4]*A[10]*A[15]+A[4]*A[11]*A[14]+A[8]*A[6]*A[15]-A[8]*A[7]*A[14]-A[12]*A[6]*A[11]+A[12]*A[7]*A[10],e[8]=A[4]*A[9]*A[15]-A[4]*A[11]*A[13]-A[8]*A[5]*A[15]+A[8]*A[7]*A[13]+A[12]*A[5]*A[11]-A[12]*A[7]*A[9],e[12]=-A[4]*A[9]*A[14]+A[4]*A[10]*A[13]+A[8]*A[5]*A[14]-A[8]*A[6]*A[13]-A[12]*A[5]*A[10]+A[12]*A[6]*A[9],e[1]=-A[1]*A[10]*A[15]+A[1]*A[11]*A[14]+A[9]*A[2]*A[15]-A[9]*A[3]*A[14]-A[13]*A[2]*A[11]+A[13]*A[3]*A[10],e[5]=A[0]*A[10]*A[15]-A[0]*A[11]*A[14]-A[8]*A[2]*A[15]+A[8]*A[3]*A[14]+A[12]*A[2]*A[11]-A[12]*A[3]*A[10],e[9]=-A[0]*A[9]*A[15]+A[0]*A[11]*A[13]+A[8]*A[1]*A[15]-A[8]*A[3]*A[13]-A[12]*A[1]*A[11]+A[12]*A[3]*A[9],e[13]=A[0]*A[9]*A[14]-A[0]*A[10]*A[13]-A[8]*A[1]*A[14]+A[8]*A[2]*A[13]+A[12]*A[1]*A[10]-A[12]*A[2]*A[9],e[2]=A[1]*A[6]*A[15]-A[1]*A[7]*A[14]-A[5]*A[2]*A[15]+A[5]*A[3]*A[14]+A[13]*A[2]*A[7]-A[13]*A[3]*A[6],e[6]=-A[0]*A[6]*A[15]+A[0]*A[7]*A[14]+A[4]*A[2]*A[15]-A[4]*A[3]*A[14]-A[12]*A[2]*A[7]+A[12]*A[3]*A[6],e[10]=A[0]*A[5]*A[15]-A[0]*A[7]*A[13]-A[4]*A[1]*A[15]+A[4]*A[3]*A[13]+A[12]*A[1]*A[7]-A[12]*A[3]*A[5],e[14]=-A[0]*A[5]*A[14]+A[0]*A[6]*A[13]+A[4]*A[1]*A[14]-A[4]*A[2]*A[13]-A[12]*A[1]*A[6]+A[12]*A[2]*A[5],e[3]=-A[1]*A[6]*A[11]+A[1]*A[7]*A[10]+A[5]*A[2]*A[11]-A[5]*A[3]*A[10]-A[9]*A[2]*A[7]+A[9]*A[3]*A[6],e[7]=A[0]*A[6]*A[11]-A[0]*A[7]*A[10]-A[4]*A[2]*A[11]+A[4]*A[3]*A[10]+A[8]*A[2]*A[7]-A[8]*A[3]*A[6],e[11]=-A[0]*A[5]*A[11]+A[0]*A[7]*A[9]+A[4]*A[1]*A[11]-A[4]*A[3]*A[9]-A[8]*A[1]*A[7]+A[8]*A[3]*A[5],e[15]=A[0]*A[5]*A[10]-A[0]*A[6]*A[9]-A[4]*A[1]*A[10]+A[4]*A[2]*A[9]+A[8]*A[1]*A[6]-A[8]*A[2]*A[5];let t=A[0]*e[0]+A[1]*e[4]+A[2]*e[8]+A[3]*e[12];if(Math.abs(t)<1e-12)return null;t=1/t;for(let n=0;n<16;n++)e[n]*=t;return e},transpose(A){return[A[0],A[4],A[8],A[12],A[1],A[5],A[9],A[13],A[2],A[6],A[10],A[14],A[3],A[7],A[11],A[15]]},projectPoint(A,e){let t=e[0],n=e[1],r=e[2],i=A[0]*t+A[4]*n+A[8]*r+A[12],o=A[1]*t+A[5]*n+A[9]*r+A[13],a=A[2]*t+A[6]*n+A[10]*r+A[14],s=A[3]*t+A[7]*n+A[11]*r+A[15],g=Math.abs(s)>1e-6?1/s:1;return[i*g,o*g,a*g]},projectRectangle(A,e,t){return[_.projectPoint(A,[0,0,0]),_.projectPoint(A,[e,0,0]),_.projectPoint(A,[e,t,0]),_.projectPoint(A,[0,t,0])]},toFloat32Array(A){return new Float32Array(A)}};v();function Me(A,e,t=3){let n=0,r=1,i=1,o=0;for(let a=0;a<t;a++){let s=Math.sin(A*r*2*Math.PI+e+a*1.7),g=Math.cos(A*r*1.414*Math.PI+e*2.1+a*.9);n+=(s*.6+g*.4)*i,o+=i,r*=2,i*=.5}return o>0?n/o:0}var Ie={createDefaultCamera(A,e,t=50){let n=t*Math.PI/180,r=e/2/Math.tan(n/2);return{eye:[A/2,e/2,-r],target:[A/2,e/2,0],up:[0,-1,0],fov:t,aspect:Math.max(1e-4,A/e),near:1,far:5e4,zoom:1,focusDistance:r,fStop:2.8,maxBlurRadius:32}},computeViewMatrix(A){return _.lookAt(A.eye,A.target,A.up)},computeProjectionMatrix(A){let e=A.fov*Math.PI/180,t=_.perspective(e,A.aspect,A.near,A.far);return A.zoom!==1&&A.zoom>0&&(t[0]*=A.zoom,t[5]*=A.zoom),t},computeViewProjectionMatrix(A){let e=Ie.computeViewMatrix(A),t=Ie.computeProjectionMatrix(A);return _.multiply(t,e)},dolly(A,e,t){let n=R.normalize(R.subtract(e,A)),r=R.multiplyScalar(n,t);return{eye:R.add(A,r),target:e}},truckPedestal(A,e,t,n,r){let i=R.normalize(R.subtract(e,A)),o=R.normalize(R.cross(i,t)),a=R.cross(o,i),s=R.multiplyScalar(o,n),g=R.multiplyScalar(a,r),l=R.add(s,g);return{eye:R.add(A,l),target:R.add(e,l)}},orbit(A,e,t,n){let r=t*Math.PI/180,i=n*Math.PI/180,o=Math.cos(i),a=Math.sin(i),s=Math.cos(r),g=Math.sin(r),l=A[0]+e*o*g,I=A[1]-e*a,B=A[2]-e*o*s;return[l,I,B]},applyOrientation(A,e,t,n){if(e===0&&t===0&&n===0)return A;let r=R.normalize(R.subtract(A.target,A.eye)),i=R.normalize(R.cross(r,A.up)),o=R.cross(i,r),a=R.distance(A.eye,A.target),s=r,g=o;if(t!==0){let B=t*Math.PI/180,E=Math.cos(B),Q=Math.sin(B);s=R.normalize(R.subtract(R.multiplyScalar(s,E),R.multiplyScalar(i,Q)))}let l=R.normalize(R.cross(s,g));if(e!==0){let B=e*Math.PI/180,E=Math.cos(B),Q=Math.sin(B);s=R.normalize(R.add(R.multiplyScalar(s,E),R.multiplyScalar(g,Q))),g=R.normalize(R.cross(l,s))}if(n!==0){let B=n*Math.PI/180,E=Math.cos(B),Q=Math.sin(B);g=R.normalize(R.add(R.multiplyScalar(g,E),R.multiplyScalar(l,Q)))}let I=R.add(A.eye,R.multiplyScalar(s,a));return{...A,target:I,up:g}},applyCameraShake(A,e,t){let{translationAmplitude:n,rotationAmplitude:r,frequency:i=2.5,octaves:o=3,seed:a=42}=t;if(n<=0&&r<=0)return A;let s=e*i,g=Me(s,a,o)*n,l=Me(s,a+101.5,o)*n,I=Me(s,a+203.7,o)*(n*.5),B=Me(s,a+307.1,o)*r,E=Me(s,a+409.3,o)*r,Q=R.normalize(R.subtract(A.target,A.eye)),C=R.normalize(R.cross(Q,A.up)),p=R.cross(C,Q),h=R.add(R.multiplyScalar(C,g),R.add(R.multiplyScalar(p,l),R.multiplyScalar(Q,I))),d=R.add(A.eye,h),D=R.add(A.target,R.add(R.multiplyScalar(C,E*10),R.multiplyScalar(p,B*10)));return{...A,eye:d,target:D}},computeCircleOfConfusion(A,e,t,n,r=32){if(e<=0||n<=0||A<=0)return 0;let i=Math.abs(A-e),o=t/n,a=i/A*o*.5;return Math.min(r,Math.max(0,a))},computeCameraFrustumPlanes(A){let e=t=>{let n=Math.hypot(t[0],t[1],t[2]);return n===0?t:[t[0]/n,t[1]/n,t[2]/n,t[3]/n]};return{left:e([A[3]+A[0],A[7]+A[4],A[11]+A[8],A[15]+A[12]]),right:e([A[3]-A[0],A[7]-A[4],A[11]-A[8],A[15]-A[12]]),bottom:e([A[3]+A[1],A[7]+A[5],A[11]+A[9],A[15]+A[13]]),top:e([A[3]-A[1],A[7]-A[5],A[11]-A[9],A[15]-A[13]]),near:e([A[2],A[6],A[10],A[14]]),far:e([A[3]-A[2],A[7]-A[6],A[11]-A[10],A[15]-A[14]])}},isBoxInFrustum(A,e,t){let n=[t.left,t.right,t.bottom,t.top,t.near,t.far];for(let r of n){let i=r[0]>0?e[0]:A[0],o=r[1]>0?e[1]:A[1],a=r[2]>0?e[2]:A[2];if(r[0]*i+r[1]*o+r[2]*a+r[3]<0)return!1}return!0}};v();var pi={studio:{top:"#9da3ad",horizon:"#5d626b",bottom:"#202226",softboxes:3.5},soft:{top:"#f1efea",horizon:"#cfcac1",bottom:"#77726a",softboxes:1.2},sunset:{top:"#4d63a3",horizon:"#ff9a5c",bottom:"#3b2a28",softboxes:1},night:{top:"#121a3a",horizon:"#1f2950",bottom:"#05060b",softboxes:.5},neutral:{top:"#9a9a9a",horizon:"#808080",bottom:"#5c5c5c",softboxes:0}},yi={none:0,aces:1,agx:2,neutral:3};function rt(A){let e=On(A)??[0,0,0,1],t=n=>n<=.04045?n/12.92:((n+.055)/1.055)**2.4;return[t(e[0]),t(e[1]),t(e[2])]}function er(A){let e=pi[A.preset??"studio"],t=A.intensity??1,n=r=>[r[0]*t,r[1]*t,r[2]*t];return{top:n(rt(A.top??e.top)),horizon:n(rt(A.horizon??e.horizon)),bottom:n(rt(A.bottom??e.bottom)),softboxes:(A.softboxes??e.softboxes)*t,rotationRad:(A.rotation??0)*Math.PI/180,exposureMultiplier:2**(A.exposure??0),toneMapping:yi[A.toneMapping??"neutral"],fog:A.fog?{color:rt(A.fog.color),start:A.fog.start,end:A.fog.end,opacity:Math.max(0,Math.min(1,A.fog.opacity??1))}:void 0}}v();var it=8,Kt=736;function Ot(A){if(!A)return[1,1,1];if(Array.isArray(A)){let r=A[0]??1,i=A[1]??1,o=A[2]??1;return[r>1?r/255:r,i>1?i/255:i,o>1?o/255:o]}if(typeof A=="object"&&A!==null){let r=A.r??1,i=A.g??1,o=A.b??1;return[r>1?r/255:r,i>1?i/255:i,o>1?o/255:o]}if(typeof A!="string")return[1,1,1];let e=A.trim().toLowerCase();if(e.startsWith("#")){let r=e.slice(1);if(r.length===3){let i=Number.parseInt(r[0]+r[0],16)/255,o=Number.parseInt(r[1]+r[1],16)/255,a=Number.parseInt(r[2]+r[2],16)/255;return[i,o,a]}if(r.length>=6){let i=Number.parseInt(r.slice(0,2),16)/255,o=Number.parseInt(r.slice(2,4),16)/255,a=Number.parseInt(r.slice(4,6),16)/255;return[i,o,a]}}let t=e.match(/rgba?\s*\(\s*([\d.]+)\s*,\s*([\d.]+)\s*,\s*([\d.]+)/);if(t){let r=Number.parseFloat(t[1])/255,i=Number.parseFloat(t[2])/255,o=Number.parseFloat(t[3])/255;return[Math.max(0,Math.min(1,r)),Math.max(0,Math.min(1,i)),Math.max(0,Math.min(1,o))]}let n=e.match(/hsla?\s*\(\s*([\d.]+)\s*,\s*([\d.]+)%?\s*,\s*([\d.]+)%?/);if(n){let r=Number.parseFloat(n[1])/360,i=Number.parseFloat(n[2])/100,o=Number.parseFloat(n[3])/100;return Di(r,i,o)}return[1,1,1]}function Di(A,e,t){if(e===0)return[t,t,t];let n=(o,a,s)=>{let g=s;return g<0&&(g+=1),g>1&&(g-=1),g<1/6?o+(a-o)*6*g:g<1/2?a:g<2/3?o+(a-o)*(2/3-g)*6:o},r=t<.5?t*(1+e):t+e-t*e,i=2*t-r;return[n(i,r,A+1/3),n(i,r,A),n(i,r,A-1/3)]}var qA={computeNormalMatrix(A){let e=_.invert(A);return e?[e[0],e[4],e[8],0,e[1],e[5],e[9],0,e[2],e[6],e[10],0,0,0,0,1]:_.identity()},processLight(A){let e=Ot(A.color),t=A.intensity??1,n=A.position?A.position[0]:A.x??0,r=A.position?A.position[1]:A.y??0,i=A.position?A.position[2]:A.z??0,o=A.lightType??A.type??"directional",a=1;o==="ambient"?a=0:o==="directional"?a=1:o==="point"?a=2:o==="spot"&&(a=3);let s=[0,0,-1];if(A.direction)s=R.normalize(A.direction);else if(A.target||A.targetX!==void 0||A.targetY!==void 0||A.targetZ!==void 0){let h=A.target?A.target[0]:A.targetX??n,d=A.target?A.target[1]:A.targetY??r,D=A.target?A.target[2]:A.targetZ??i,x=[h,d,D],G=R.subtract(x,[n,r,i]);R.length(G)>1e-4&&(s=R.normalize(G))}let g=Math.max(1,A.radius??1e3),l=A.decay??2,I=Math.max(.1,Math.min(180,A.angle??45)),B=Math.max(0,Math.min(1,A.penumbra??.2)),E=I*Math.PI/180,Q=E*(1-B),C=Math.cos(E),p=Math.cos(Q);return{posType:[n,r,i,a],dirRadius:[s[0],s[1],s[2],g],colorIntensity:[e[0],e[1],e[2],t],spotParams:[C,p,l,0]}},packLightsUniforms(A,e,t){let n=new Float32Array(Kt/4);if(qA.packPhysicalBlock(n,A??[],e,t),(!A||A.length===0)&&!e)return n[4]=0,n[5]=0,n;let r=0,i=0,o=0,a=[];for(let g of A)if((g.lightType??g.type)==="ambient"){let I=Ot(g.color),B=g.intensity??1;r+=I[0]*B,i+=I[1]*B,o+=I[2]*B}else a.length<it&&a.push(qA.processLight(g));n[0]=r,n[1]=i,n[2]=o,n[3]=1,n[4]=a.length,n[5]=1;let s=8;for(let g=0;g<it;g++){if(g<a.length){let l=a[g];n[s+0]=l.posType[0],n[s+1]=l.posType[1],n[s+2]=l.posType[2],n[s+3]=l.posType[3],n[s+4]=l.dirRadius[0],n[s+5]=l.dirRadius[1],n[s+6]=l.dirRadius[2],n[s+7]=l.dirRadius[3],n[s+8]=l.colorIntensity[0],n[s+9]=l.colorIntensity[1],n[s+10]=l.colorIntensity[2],n[s+11]=l.colorIntensity[3],n[s+12]=l.spotParams[0],n[s+13]=l.spotParams[1],n[s+14]=l.spotParams[2],n[s+15]=l.spotParams[3]}else for(let l=0;l<16;l++)n[s+l]=0;s+=16}return n},shadowCasterIndex(A){let e=0;for(let t of A){let n=t.lightType??t.type;if(n!=="ambient"){if(e>=it)break;if(t.castShadow&&(n==="directional"||n==="spot"))return e;e++}}return-1},packPhysicalBlock(A,e,t,n){let r=8+it*16,i=0,o=0,a=0;for(let s of e){if((s.lightType??s.type)!=="ambient")continue;let[g,l,I]=Ot(s.color),B=s.intensity??1,E=Q=>Q<=.04045?Q/12.92:((Q+.055)/1.055)**2.4;i+=E(g)*B,o+=E(l)*B,a+=E(I)*B}if(A[r+0]=i,A[r+1]=o,A[r+2]=a,A[r+3]=1,t){let s=er(t);A[6]=1,A[7]=s.toneMapping,A[r+3]=s.exposureMultiplier,A.set([...s.top,s.rotationRad],r+4),A.set([...s.horizon,s.softboxes],r+8),A.set([...s.bottom,1],r+12),s.fog&&(A.set([...s.fog.color,1],r+16),A.set([s.fog.start,s.fog.end,s.fog.opacity,0],r+20))}if(n&&n.lightIndex>=0){A.set([1,n.lightIndex,n.softness,n.mapSize],r+24),A.set([n.bias,n.normalOffset,n.darkness,0],r+28);for(let s=0;s<16;s++)A[r+32+s]=n.matrix[s]??0}}};v();var Ge=class A{static parse(e,t,n){let r=typeof t=="object"&&t!==null?t:n??{},i=typeof t=="string"?t:r.mtlText,o=[],a=[],s=[],g=[],l={materialName:"default",faces:[]};g.push(l);let I={};i&&Object.assign(I,A.parseMtl(i));let B=e.split(/\r?\n/);for(let k=0;k<B.length;k++){let eA=B[k]?.trim();if(!eA||eA.startsWith("#"))continue;let q=eA.split(/\s+/),sA=q[0]?.toLowerCase();if(sA==="mtllib"){let BA=q.slice(1).join(" ").trim();if(r.basePath&&typeof CA<"u"&&CA.existsSync)try{let T=TA.resolve(r.basePath,BA);if(CA.existsSync(T)){let iA=CA.readFileSync(T,"utf-8");Object.assign(I,A.parseMtl(iA))}}catch{}}else if(sA==="v"){let BA=Number.parseFloat(q[1]??"0"),T=Number.parseFloat(q[2]??"0"),iA=Number.parseFloat(q[3]??"0");o.push([BA,T,iA])}else if(sA==="vn"){let BA=Number.parseFloat(q[1]??"0"),T=Number.parseFloat(q[2]??"0"),iA=Number.parseFloat(q[3]??"0");a.push([BA,T,iA])}else if(sA==="vt"){let BA=Number.parseFloat(q[1]??"0"),T=q[2]!==void 0?Number.parseFloat(q[2]):0;s.push([BA,T])}else if(sA==="usemtl"){let BA=q[1]??"default";l.faces.length>0?(l={materialName:BA,faces:[]},g.push(l)):l.materialName=BA}else if(sA==="f"){let BA=[];for(let T=1;T<q.length;T++){let iA=q[T];if(!iA)continue;let oA=iA.split("/"),uA=Number.parseInt(oA[0]??"0",10),QA=oA[1]&&oA[1].length>0?Number.parseInt(oA[1],10):0,cA=oA[2]&&oA[2].length>0?Number.parseInt(oA[2],10):0;uA<0&&(uA=o.length+uA+1),QA<0&&(QA=s.length+QA+1),cA<0&&(cA=a.length+cA+1),BA.push({v:uA-1,vt:QA-1,vn:cA-1})}if(BA.length>=3)for(let T=1;T<BA.length-1;T++){let iA=BA[0],oA=BA[T],uA=BA[T+1];iA&&oA&&uA&&l.faces.push([iA,oA,uA])}}}let E=1/0,Q=1/0,C=1/0,p=-1/0,h=-1/0,d=-1/0;for(let k of o){let[eA,q,sA]=k;eA===void 0||q===void 0||sA===void 0||(eA<E&&(E=eA),q<Q&&(Q=q),sA<C&&(C=sA),eA>p&&(p=eA),q>h&&(h=q),sA>d&&(d=sA))}Number.isFinite(E)||(E=-1,Q=-1,C=-1,p=1,h=1,d=1);let D=(E+p)*.5,x=(Q+h)*.5,G=(C+d)*.5,M=Math.max(1e-4,p-E),w=Math.max(1e-4,h-Q),b=Math.max(1e-4,d-C),N=Math.max(M,w,b),U=1;r.normalizeSize&&r.normalizeSize>0&&(U=r.normalizeSize/N),typeof r.scale=="number"&&(U*=r.scale);let L=r.center??!1,F=L?D:0,J=L?x:0,W=L?G:0,K=[];for(let k=0;k<g.length;k++){let eA=g[k];if(!eA||eA.faces.length===0)continue;let q=new Map,sA=[],BA=[],T=[],iA=[],oA=!1;for(let cA of eA.faces)for(let gA of cA){let bA=`${gA.v}_${gA.vt}_${gA.vn}`,DA=q.get(bA);if(DA===void 0){DA=sA.length/3,q.set(bA,DA);let hA=o[gA.v]??[0,0,0],pA=((hA[0]??0)-F)*U,UA=((hA[1]??0)-J)*U,SA=((hA[2]??0)-W)*U;if(sA.push(pA,UA,SA),gA.vt>=0&&s[gA.vt]){let LA=s[gA.vt];T.push(LA[0]??0,1-(LA[1]??0))}else T.push(0,0);if(gA.vn>=0&&a[gA.vn]){oA=!0;let LA=a[gA.vn];BA.push(LA[0]??0,LA[1]??0,LA[2]??0)}else BA.push(0,0,0)}iA.push(DA)}if(!oA||r.smoothNormals){let cA=new Float32Array(sA.length);for(let gA=0;gA<iA.length;gA+=3){let bA=iA[gA],DA=iA[gA+1],hA=iA[gA+2],pA=[sA[bA*3],sA[bA*3+1],sA[bA*3+2]],UA=[sA[DA*3],sA[DA*3+1],sA[DA*3+2]],SA=[sA[hA*3],sA[hA*3+1],sA[hA*3+2]],LA=R.subtract(UA,pA),Nt=R.subtract(SA,pA),vA=R.cross(LA,Nt);cA[bA*3]+=vA[0],cA[bA*3+1]+=vA[1],cA[bA*3+2]+=vA[2],cA[DA*3]+=vA[0],cA[DA*3+1]+=vA[1],cA[DA*3+2]+=vA[2],cA[hA*3]+=vA[0],cA[hA*3+1]+=vA[1],cA[hA*3+2]+=vA[2]}for(let gA=0;gA<sA.length/3;gA++){let bA=cA[gA*3],DA=cA[gA*3+1],hA=cA[gA*3+2],pA=Math.hypot(bA,DA,hA)||1;BA[gA*3]=bA/pA,BA[gA*3+1]=DA/pA,BA[gA*3+2]=hA/pA}}let QA=sA.length/3>65535?new Uint32Array(iA):new Uint16Array(iA);K.push({id:`mesh_${k}`,name:eA.materialName,positions:new Float32Array(sA),normals:new Float32Array(BA),uvs:new Float32Array(T),indices:QA,materialName:eA.materialName})}let aA=(E-F)*U,j=(Q-J)*U,rA=(C-W)*U,fA=(p-F)*U,X=(h-J)*U,V=(d-W)*U,Z=fA-aA,mA=X-j,$=V-rA,lA=(aA+fA)*.5,IA=(j+X)*.5,yA=(rA+V)*.5,AA=Math.hypot(Z,mA,$)*.5;return{meshes:K,materials:I,animations:[],bounds:{min:[aA,j,rA],max:[fA,X,V],center:[lA,IA,yA],size:[Z,mA,$],boundingSphereRadius:AA}}}static parseMtl(e){let t={},n=null,r=e.split(/\r?\n/);for(let i of r){let o=i.trim();if(!o||o.startsWith("#"))continue;let a=o.split(/\s+/),s=a[0]?.toLowerCase();if(s==="newmtl"){let g=a[1]??"default";n={name:g,diffuseColor:[1,1,1,1],specularColor:[1,1,1],ambientColor:[.2,.2,.2],shininess:32,opacity:1},t[g]=n}else if(n)if(s==="kd"){let g=Number.parseFloat(a[1]??"1"),l=Number.parseFloat(a[2]??"1"),I=Number.parseFloat(a[3]??"1");n.diffuseColor=[g,l,I,n.diffuseColor?.[3]??1]}else if(s==="ks"){let g=Number.parseFloat(a[1]??"1"),l=Number.parseFloat(a[2]??"1"),I=Number.parseFloat(a[3]??"1");n.specularColor=[g,l,I],n.specularIntensity=(g+l+I)/3}else if(s==="ka"){let g=Number.parseFloat(a[1]??"0.2"),l=Number.parseFloat(a[2]??"0.2"),I=Number.parseFloat(a[3]??"0.2");n.ambientColor=[g,l,I]}else if(s==="ns")n.shininess=Number.parseFloat(a[1]??"32");else if(s==="d"||s==="tr"){let g=Number.parseFloat(a[1]??"1");n.opacity=s==="d"?g:1-g,n.diffuseColor&&(n.diffuseColor[3]=n.opacity)}else s==="map_kd"?n.diffuseTexture=a.slice(1).join(" "):(s==="map_bump"||s==="bump")&&(n.normalTexture=a.slice(1).join(" "))}return t}};function Pa(A,e,t={}){return Ge.parse(A,e,t)}function Ha(A){return Ge.parseMtl(A)}function Ne(A,e,t={}){let n;if(typeof A!="string")n=new TextDecoder().decode(A);else{let r=A.trim();if(!(r.startsWith("v ")||r.startsWith("#")||r.includes(`
2
+ v `)||r.includes("\rv "))&&typeof CA<"u"&&CA.existsSync)try{let o=A.startsWith("file://")?A.slice(7):A;try{o=decodeURIComponent(o)}catch{}CA.existsSync(o)?(n=CA.readFileSync(o,"utf-8"),t={basePath:t.basePath??TA.dirname(o),...t}):n=A}catch{n=A}else n=A}return Ge.parse(n,e,t)}v();var ir=Hn(nr(),1);var re=class A{static FBX_KTIME=46186158e3;static parse(e,t={}){let n=typeof e=="string"?A.parseAscii(e):A.isBinary(e)?A.parseBinary(e):A.parseAscii(new TextDecoder().decode(e));return A.buildModelFromTree(n,t)}static isBinary(e){let t=e instanceof Uint8Array?e:new Uint8Array(e);if(t.length<27)return!1;let n="Kaydara FBX Binary \0\0";for(let r=0;r<n.length;r++)if(t[r]!==n.charCodeAt(r))return!1;return!0}static parseBinary(e){let t=e instanceof Uint8Array?e:new Uint8Array(e),n=new DataView(t.buffer,t.byteOffset,t.byteLength),i=n.getUint32(23,!0)>=7500,o=27,a={name:"Root",props:[],children:[]},s=()=>{if(o>=t.byteLength)return null;let g,l,I;if(i){if(o+25>t.byteLength)return null;g=Number(n.getBigUint64(o,!0)),l=Number(n.getBigUint64(o+8,!0)),I=n.getUint8(o+24),o+=25}else{if(o+13>t.byteLength)return null;g=n.getUint32(o,!0),l=n.getUint32(o+4,!0),I=n.getUint8(o+12),o+=13}if(g===0)return null;let B=new TextDecoder().decode(t.subarray(o,o+I));o+=I;let E=[];for(let C=0;C<l;C++){let p=String.fromCharCode(t[o]);switch(o+=1,p){case"Y":{E.push(n.getInt16(o,!0)),o+=2;break}case"C":case"B":{E.push(n.getUint8(o)!==0),o+=1;break}case"I":{E.push(n.getInt32(o,!0)),o+=4;break}case"F":{E.push(n.getFloat32(o,!0)),o+=4;break}case"D":{E.push(n.getFloat64(o,!0)),o+=8;break}case"L":{E.push(Number(n.getBigInt64(o,!0))),o+=8;break}case"S":{let h=n.getUint32(o,!0);o+=4;let d=new TextDecoder().decode(t.subarray(o,o+h));E.push(d),o+=h;break}case"R":{let h=n.getUint32(o,!0);o+=4;let d=t.subarray(o,o+h);E.push(d),o+=h;break}case"f":case"d":case"i":case"l":case"b":case"c":{let h=n.getUint32(o,!0),d=n.getUint32(o+4,!0),D=n.getUint32(o+8,!0);o+=12;let x;if(d===1){let M=t.subarray(o,o+D);x=(0,ir.inflateSync)(M),o+=D}else{let w=h*(p==="d"||p==="l"?8:p==="f"||p==="i"?4:1);x=t.subarray(o,o+w),o+=w}let G=new DataView(x.buffer,x.byteOffset,x.byteLength);if(p==="f"){let M=new Float32Array(h);for(let w=0;w<h;w++)M[w]=G.getFloat32(w*4,!0);E.push(M)}else if(p==="d"){let M=new Float64Array(h);for(let w=0;w<h;w++)M[w]=G.getFloat64(w*8,!0);E.push(M)}else if(p==="i"){let M=new Int32Array(h);for(let w=0;w<h;w++)M[w]=G.getInt32(w*4,!0);E.push(M)}else if(p==="l"){let M=new Float64Array(h);for(let w=0;w<h;w++)M[w]=Number(G.getBigInt64(w*8,!0));E.push(M)}else if(p==="b"){let M=new Uint8Array(h);for(let w=0;w<h;w++)M[w]=G.getUint8(w);E.push(M)}else E.push(x);break}default:break}}let Q=[];for(;o<g;){let C=s();if(C)Q.push(C);else break}return o=g,{name:B,props:E,children:Q}};for(;o<t.byteLength-(i?25:13);){let g=s();if(g)a.children.push(g);else break}return a}static parseAscii(e){let t={name:"Root",props:[],children:[]},n=[t],r=e.split(/\r?\n/);for(let i=0;i<r.length;i++){let o=r[i]?.trim();if(!o||o.startsWith(";"))continue;if(o==="}"){n.length>1&&n.pop();continue}let a=o.indexOf(":");if(a===-1)continue;let s=o.substring(0,a).trim(),g=o.substring(a+1).trim(),l=g.endsWith("{"),I=l?g.slice(0,-1).trim():g,B=[];if(I){let C=I.split(",").map(p=>p.trim());for(let p of C)p.startsWith('"')&&p.endsWith('"')?B.push(p.slice(1,-1)):Number.isNaN(Number(p))?B.push(p):B.push(Number(p))}let E={name:s,props:B,children:[]},Q=n[n.length-1];Q&&Q.children.push(E),l&&n.push(E)}return t}static buildModelFromTree(e,t={}){let n=e.children.find(b=>b.name==="Objects"),r=e.children.find(b=>b.name==="Connections"),i=new Map;if(n)for(let b of n.children){let N=b.props[0]??0,L=String(b.props[1]??"").split("::"),F=L.length>1?L[1]:L[0],J=String(b.props[2]??b.name);i.set(N,{id:N,name:F,type:J,node:b})}let o=[];if(r){for(let b of r.children)if(b.name==="C"||b.name==="Connect"){let N=String(b.props[0]),U=b.props[1]??0,L=b.props[2]??0,F=N==="OP"?String(b.props[3]):void 0;o.push({childId:U,parentId:L,propName:F})}}let a=[],s={};function g(b){if(!b)return[];if(b.props[0]instanceof Float32Array||b.props[0]instanceof Float64Array||b.props[0]instanceof Int32Array||Array.isArray(b.props[0]))return b.props[0];let N=b.children.find(U=>U.name==="a");return N&&N.props.length>0?N.props:Array.isArray(b.props)&&b.props.length>0&&typeof b.props[0]=="number"?b.props:[]}for(let[b,N]of i)if(N.node.name==="Geometry"&&(N.type==="Mesh"||N.node.props[2]==="Mesh"||N.type==="")){let U=N.node,L=U.children.find(T=>T.name==="Vertices"),F=U.children.find(T=>T.name==="PolygonVertexIndex"),J=U.children.find(T=>T.name==="LayerElementNormal"),W=U.children.find(T=>T.name==="LayerElementUV");if(!L||!F)continue;let K=g(L),aA=g(F),j=J?.children.find(T=>T.name==="Normals"),rA=g(j),fA=W?.children.find(T=>T.name==="UV"),X=W?.children.find(T=>T.name==="UVIndex"),V=g(fA),Z=g(X),mA=[],$=[],lA=[];for(let T=0;T<aA.length;T++){let iA=aA[T];if(iA<0){if(lA.push(-(iA+1)),$.push(T),lA.length>=3)for(let oA=1;oA<lA.length-1;oA++)mA.push([lA[0],lA[oA],lA[oA+1]]);lA=[]}else lA.push(iA),$.push(T)}let IA=[],yA=[],AA=[],k=[];for(let T=0;T<mA.length;T++){let iA=mA[T];for(let oA=0;oA<3;oA++){let uA=iA[oA],QA=IA.length/3,cA=K[uA*3]??0,gA=K[uA*3+1]??0,bA=K[uA*3+2]??0;if(IA.push(cA,gA,bA),rA.length>0){let DA=rA[uA*3]??0,hA=rA[uA*3+1]??0,pA=rA[uA*3+2]??0;yA.push(DA,hA,pA)}else yA.push(0,0,1);if(V.length>0){let DA=uA;Z.length>0&&(DA=Z[uA]??uA);let hA=V[DA*2]??0,pA=V[DA*2+1]??0;AA.push(hA,1-pA)}else AA.push(0,0);k.push(QA)}}if(rA.length===0||t.smoothNormals){let T=new Float32Array(IA.length);for(let iA=0;iA<k.length;iA+=3){let oA=k[iA],uA=k[iA+1],QA=k[iA+2],cA=[IA[oA*3],IA[oA*3+1],IA[oA*3+2]],gA=[IA[uA*3],IA[uA*3+1],IA[uA*3+2]],bA=[IA[QA*3],IA[QA*3+1],IA[QA*3+2]],DA=R.subtract(gA,cA),hA=R.subtract(bA,cA),pA=R.cross(DA,hA);T[oA*3]+=pA[0],T[oA*3+1]+=pA[1],T[oA*3+2]+=pA[2],T[uA*3]+=pA[0],T[uA*3+1]+=pA[1],T[uA*3+2]+=pA[2],T[QA*3]+=pA[0],T[QA*3+1]+=pA[1],T[QA*3+2]+=pA[2]}for(let iA=0;iA<IA.length/3;iA++){let oA=T[iA*3],uA=T[iA*3+1],QA=T[iA*3+2],cA=Math.hypot(oA,uA,QA)||1;yA[iA*3]=oA/cA,yA[iA*3+1]=uA/cA,yA[iA*3+2]=QA/cA}}let eA=o.find(T=>T.parentId===b&&i.get(T.childId)?.type==="Deformer"&&i.get(T.childId)?.node.props[2]==="Skin"),q,sA;if(eA){let T=IA.length/3;q=new Float32Array(T*4),sA=new Float32Array(T*4),o.filter(oA=>oA.parentId===eA.childId&&i.get(oA.childId)?.type==="Deformer"&&i.get(oA.childId)?.node.props[2]==="Cluster").forEach((oA,uA)=>{let QA=i.get(oA.childId)?.node,cA=QA?.children.find(bA=>bA.name==="Indexes"),gA=QA?.children.find(bA=>bA.name==="Weights");if(cA&&gA){let bA=g(cA),DA=g(gA);for(let hA=0;hA<bA.length;hA++){let pA=DA[hA]??0;for(let UA=0;UA<T;UA++)for(let SA=0;SA<4;SA++)if(sA[UA*4+SA]===0){q[UA*4+SA]=uA,sA[UA*4+SA]=pA;break}}}})}let BA=IA.length/3>65535;a.push({id:`fbx_mesh_${b}`,name:N.name,positions:new Float32Array(IA),normals:new Float32Array(yA),uvs:new Float32Array(AA),indices:BA?new Uint32Array(k):new Uint16Array(k),jointIndices:q,jointWeights:sA,materialName:N.name})}for(let[,b]of i)if(b.node.name==="Material"){let U=b.node.children.find(W=>W.name==="Properties70"),L=[1,1,1,1],F=32,J=1;if(U){for(let W of U.children)if(W.name==="P"){let K=String(W.props[0]);if(K==="DiffuseColor"||K==="Color"){let aA=Number(W.props[4]??1),j=Number(W.props[5]??1),rA=Number(W.props[6]??1);L=[aA,j,rA,1]}else K==="Shininess"||K==="ShininessExponent"?F=Number(W.props[4]??32):K==="Opacity"&&(J=Number(W.props[4]??1),L[3]=J)}}s[b.name]={name:b.name,diffuseColor:L,shininess:F,opacity:J}}let l=[];for(let[b,N]of i)if(N.node.name==="AnimationStack"){let U=N.name||"Take 001",L=[],F=o.find(W=>W.parentId===b&&i.get(W.childId)?.node.name==="AnimationLayer");if(F){let W=o.filter(aA=>aA.parentId===F.childId&&i.get(aA.childId)?.node.name==="AnimationCurveNode"),K=new Map;for(let aA of W){let j=i.get(aA.childId);if(!j)continue;let rA=o.find($=>$.childId===j.id&&i.get($.parentId)?.node.name==="Model"),fA=rA?i.get(rA.parentId):void 0,X=rr(rA?.propName)??rr(j.name);if(!X)continue;let V=`${fA?.id??j.id}|${X}`,Z=K.get(V);if(!Z){let $=fA?.node;Z={nodeName:fA?.name??j.name,model:$,kind:X,defaults:wi($,j.node,X),channels:[void 0,void 0,void 0]},K.set(V,Z)}o.filter($=>$.parentId===j.id&&i.get($.childId)?.node.name==="AnimationCurve").forEach(($,lA)=>{let IA=bi($.propName)??lA;if(IA>2)return;let yA=i.get($.childId)?.node,AA=g(yA?.children.find(q=>q.name==="KeyTime")),k=g(yA?.children.find(q=>q.name==="KeyValueFloat")),eA=Math.min(AA.length,k.length);eA!==0&&(Z.channels[IA]={times:Array.from(AA.slice(0,eA),q=>Number(q)),values:Array.from(k.slice(0,eA),q=>Number(q))})})}for(let aA of K.values()){let j=Fi(aA);j&&L.push(j)}}let J=1;for(let W of L)if(W.times.length>0){let K=W.times[W.times.length-1]??0;K>J&&(J=K)}l.push({name:U,duration:J,fps:30,tracks:L})}let I=1/0,B=1/0,E=1/0,Q=-1/0,C=-1/0,p=-1/0;for(let b of a)for(let N=0;N<b.positions.length;N+=3){let U=b.positions[N],L=b.positions[N+1],F=b.positions[N+2];U<I&&(I=U),L<B&&(B=L),F<E&&(E=F),U>Q&&(Q=U),L>C&&(C=L),F>p&&(p=F)}Number.isFinite(I)||(I=-1,B=-1,E=-1,Q=1,C=1,p=1);let h=Q-I,d=C-B,D=p-E,x=(I+Q)*.5,G=(B+C)*.5,M=(E+p)*.5,w=Math.hypot(h,d,D)*.5;return{meshes:a,materials:s,animations:l,bounds:{min:[I,B,E],max:[Q,C,p],center:[x,G,M],size:[h,d,D],boundingSphereRadius:w}}}};function rr(A){switch(A){case"Lcl Translation":case"T":return"T";case"Lcl Rotation":case"R":return"R";case"Lcl Scaling":case"S":return"S";default:return}}function bi(A){switch(A){case"d|X":return 0;case"d|Y":return 1;case"d|Z":return 2;default:return}}function Yt(A,e){let n=A?.children.find(r=>r.name==="Properties70")?.children.find(r=>r.name==="P"&&r.props[0]===e);if(n)return n.props.slice(4).map(r=>Number(r))}function wi(A,e,t){let n=t==="S"?1:0,r=Yt(A,t==="T"?"Lcl Translation":t==="R"?"Lcl Rotation":"Lcl Scaling"),i=[n,n,n];for(let o=0;o<3;o++){let a=r?.[o],s=Yt(e,`d|${"XYZ"[o]}`)?.[0],g=a??s;g!==void 0&&Number.isFinite(g)&&(i[o]=g)}return i}var xi=["XYZ","XZY","YZX","YXZ","ZXY","ZYX"];function Mi(A){let e=Yt(A,"RotationOrder")?.[0]??0;return xi[e]??"XYZ"}function Gi(A,e="XYZ"){let t=[0,0,0,1];for(let n of e){let r="XYZ".indexOf(n),i=(A[r]??0)*Math.PI/360,o=Math.sin(i),a=[0,0,0,Math.cos(i)];a[r]=o,t=[a[3]*t[0]+a[0]*t[3]+a[1]*t[2]-a[2]*t[1],a[3]*t[1]-a[0]*t[2]+a[1]*t[3]+a[2]*t[0],a[3]*t[2]+a[0]*t[1]-a[1]*t[0]+a[2]*t[3],a[3]*t[3]-a[0]*t[0]-a[1]*t[1]-a[2]*t[2]]}return t}function Ni(A,e){let{times:t,values:n}=A,r=t.length-1;if(e<=t[0])return n[0];if(e>=t[r])return n[r];let i=0;for(;i<r-1&&t[i+1]<=e;)i++;let o=t[i],a=t[i+1],s=a>o?(e-o)/(a-o):0;return n[i]+(n[i+1]-n[i])*s}function Fi(A){let e=new Set;for(let s of A.channels)for(let g of s?.times??[])e.add(g);if(e.size===0)return;let t=[...e].sort((s,g)=>s-g),n=new Float32Array(t.length),r=A.kind==="R",i=new Float32Array(t.length*(r?4:3)),o=r?Mi(A.model):"XYZ",a;return t.forEach((s,g)=>{n[g]=s/re.FBX_KTIME;let l=[0,1,2].map(B=>{let E=A.channels[B];return E?Ni(E,s):A.defaults[B]});if(!r){i.set(l,g*3);return}let I=Gi(l,o);if(a&&a[0]*I[0]+a[1]*I[1]+a[2]*I[2]+a[3]*I[3]<0)for(let B=0;B<4;B++)I[B]=-I[B];a=I,i.set(I,g*4)}),{nodeName:A.nodeName,times:n,translations:A.kind==="T"?i:void 0,rotations:r?i:void 0,scales:A.kind==="S"?i:void 0}}function Wa(A,e={}){return re.parse(A,e)}function Fe(A,e={}){let t=A;if(typeof A=="string"){let n=A.trim();if(!(n.includes("FBXHeaderExtension")||n.includes("Kaydara FBX"))&&typeof CA<"u"&&CA.existsSync)try{let i=A.startsWith("file://")?A.slice(7):A;try{i=decodeURIComponent(i)}catch{}if(CA.existsSync(i)){let o=CA.readFileSync(i);t=new Uint8Array(o.buffer,o.byteOffset,o.byteLength)}}catch{}}return re.parse(t,e)}v();v();var or=`
3
+ struct AudioLatentBuffer {
4
+ fftBins : array<f32, 1024>,
5
+ bassEnergy : f32,
6
+ drumTransient : f32,
7
+ vocalEnergy : f32,
8
+ timeMs : f32,
9
+ };
10
+
11
+ struct DeformParams {
12
+ mode : u32, // 0 = normal_extrusion, 1 = radial_pulse, 2 = harmonic_wave, 3 = twist, 4 = ripple
13
+ freqMinBin : u32,
14
+ freqMaxBin : u32,
15
+ vertexCount : u32,
16
+ amplitudeMultiplier : f32,
17
+ damping : f32,
18
+ timeMs : f32,
19
+ pad : f32,
20
+ };
21
+
22
+ struct VertexData {
23
+ // 16 floats = 64 bytes per vertex
24
+ f : array<f32, 16>,
25
+ };
26
+
27
+ @group(0) @binding(0) var<storage, read> audio : AudioLatentBuffer;
28
+ @group(0) @binding(1) var<uniform> params : DeformParams;
29
+ @group(0) @binding(2) var<storage, read> srcVertices : array<VertexData>;
30
+ @group(0) @binding(3) var<storage, read_write> dstVertices : array<VertexData>;
31
+
32
+ @compute @workgroup_size(256)
33
+ fn cs_displace(@builtin(global_invocation_id) gid : vec3<u32>) {
34
+ let idx = gid.x;
35
+ if (idx >= params.vertexCount) {
36
+ return;
37
+ }
38
+
39
+ let src = srcVertices[idx];
40
+ var outV = src;
41
+
42
+ // Extract attributes
43
+ let pos = vec3<f32>(src.f[0], src.f[1], src.f[2]);
44
+ let uv = vec2<f32>(src.f[3], src.f[4]);
45
+ var norm = vec3<f32>(src.f[5], src.f[6], src.f[7]);
46
+
47
+ let normLen = length(norm);
48
+ if (normLen > 0.0001) {
49
+ norm = norm / normLen;
50
+ } else {
51
+ norm = vec3<f32>(0.0, 1.0, 0.0);
52
+ }
53
+
54
+ // Determine frequency bin
55
+ let minBin = max(0u, params.freqMinBin);
56
+ let maxBin = min(1023u, max(minBin, params.freqMaxBin));
57
+ let freqNorm = clamp(uv.x, 0.0, 1.0);
58
+ let binIdx = u32(clamp(f32(minBin) + freqNorm * f32(maxBin - minBin), 0.0, 1023.0));
59
+ let freqAmplitude = audio.fftBins[binIdx];
60
+
61
+ var displacedPos = pos;
62
+ var displacedNorm = norm;
63
+
64
+ if (params.mode == 0u) {
65
+ // Mode 0: normal_extrusion
66
+ let bassOsc = sin(params.timeMs * 0.01 + pos.y * 0.5);
67
+ let displacementMag = (freqAmplitude * 45.0 + audio.bassEnergy * 20.0 * bassOsc) * params.amplitudeMultiplier;
68
+ displacedPos = pos + norm * displacementMag;
69
+
70
+ // Dynamic normal perturbation based on spatial gradient
71
+ let tangentDelta = cos(params.timeMs * 0.01 + pos.y * 0.5) * 0.5 * audio.bassEnergy * params.amplitudeMultiplier;
72
+ var perturbed = norm + vec3<f32>(0.0, -tangentDelta * 0.05, 0.0);
73
+ let pLen = length(perturbed);
74
+ if (pLen > 0.0001) {
75
+ displacedNorm = perturbed / pLen;
76
+ }
77
+ } else if (params.mode == 1u) {
78
+ // Mode 1: radial_pulse
79
+ let rLen = length(pos);
80
+ var dir = norm;
81
+ if (rLen > 0.0001) {
82
+ dir = pos / rLen;
83
+ }
84
+ let pulse = (audio.bassEnergy * 35.0 + audio.drumTransient * 45.0) * params.amplitudeMultiplier;
85
+ let dampingFactor = exp(-max(0.0, params.damping) * rLen * 0.01);
86
+ displacedPos = pos + dir * (pulse * dampingFactor);
87
+ displacedNorm = norm;
88
+ } else if (params.mode == 3u) {
89
+ // Mode 3: twist. Each slice turns about Y by its height times the
90
+ // twist rate; a resting twist plus the bass, so it winds on the drop.
91
+ let rate = (0.35 + audio.bassEnergy) * 0.004 * params.amplitudeMultiplier;
92
+ let a = pos.y * rate;
93
+ let c = cos(a);
94
+ let s = sin(a);
95
+ displacedPos = vec3<f32>(c * pos.x - s * pos.z, pos.y, s * pos.x + c * pos.z);
96
+ displacedNorm = vec3<f32>(c * norm.x - s * norm.z, norm.y, s * norm.x + c * norm.z);
97
+ } else if (params.mode == 4u) {
98
+ // Mode 4: ripple. Concentric waves travel out across XY from the
99
+ // origin, struck harder by the drums and fading with distance.
100
+ let r = length(pos.xy);
101
+ let phase = r * 0.05 - params.timeMs * 0.015;
102
+ let height = (6.0 + audio.drumTransient * 28.0 + audio.bassEnergy * 10.0) * params.amplitudeMultiplier;
103
+ let fade = exp(-max(0.0, params.damping) * r * 0.002);
104
+ displacedPos = pos + norm * (sin(phase) * height * fade);
105
+ // The wave's slope tilts the normal toward the travel direction.
106
+ var radial = vec3<f32>(0.0, 0.0, 0.0);
107
+ if (r > 0.0001) {
108
+ radial = vec3<f32>(pos.x / r, pos.y / r, 0.0);
109
+ }
110
+ let slope = cos(phase) * 0.05 * height * fade;
111
+ var perturbed = norm - radial * slope;
112
+ let pLen = length(perturbed);
113
+ if (pLen > 0.0001) {
114
+ displacedNorm = perturbed / pLen;
115
+ }
116
+ } else {
117
+ // Mode 2: harmonic_wave
118
+ let wavePhase = params.timeMs * 0.005 + pos.y * 0.2;
119
+ let wave = (sin(wavePhase) * audio.bassEnergy * 25.0 + cos(wavePhase * 2.0 + pos.x * 0.1) * freqAmplitude * 20.0) * params.amplitudeMultiplier;
120
+ displacedPos = pos + norm * wave;
121
+
122
+ let dWaveDy = cos(wavePhase) * 0.2 * audio.bassEnergy * 25.0 * params.amplitudeMultiplier;
123
+ var perturbed = norm - vec3<f32>(0.0, dWaveDy * 0.03, 0.0);
124
+ let pLen = length(perturbed);
125
+ if (pLen > 0.0001) {
126
+ displacedNorm = perturbed / pLen;
127
+ }
128
+ }
129
+
130
+ // Write deformed position and normal
131
+ outV.f[0] = displacedPos.x;
132
+ outV.f[1] = displacedPos.y;
133
+ outV.f[2] = displacedPos.z;
134
+
135
+ outV.f[5] = displacedNorm.x;
136
+ outV.f[6] = displacedNorm.y;
137
+ outV.f[7] = displacedNorm.z;
138
+
139
+ dstVertices[idx] = outV;
140
+ }
141
+ `;var Ui={normal_extrusion:0,radial_pulse:1,harmonic_wave:2,twist:3,ripple:4},at=class{device;pipeline;bindGroupLayout;uniformPool;deformedBuffers=new WeakMap;uniformData=new ArrayBuffer(32);uniformUint32=new Uint32Array(this.uniformData);uniformFloat32=new Float32Array(this.uniformData);constructor(e){this.device=e,this.uniformPool=new GA(32,GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST),this.bindGroupLayout=e.createBindGroupLayout({label:"AudioMeshDeformBindGroupLayout",entries:[{binding:0,visibility:GPUShaderStage.COMPUTE,buffer:{type:"read-only-storage"}},{binding:1,visibility:GPUShaderStage.COMPUTE,buffer:{type:"uniform"}},{binding:2,visibility:GPUShaderStage.COMPUTE,buffer:{type:"read-only-storage"}},{binding:3,visibility:GPUShaderStage.COMPUTE,buffer:{type:"storage"}}]});let t=e.createShaderModule({label:"audioMeshDisplace.wgsl",code:or}),n=e.createPipelineLayout({label:"AudioMeshDeformPipelineLayout",bindGroupLayouts:[this.bindGroupLayout]});this.pipeline=e.createComputePipeline({label:"AudioMeshDeformComputePipeline",layout:n,compute:{module:t,entryPoint:"cs_displace"}})}getOrCreateDeformedBuffer(e,t){let n=this.deformedBuffers.get(e);return(!n||n.size<t)&&(n?.destroy(),n=this.device.createBuffer({label:"DeformedMeshVertexBuffer",size:Math.max(64,Math.ceil(t/4)*4),usage:GPUBufferUsage.VERTEX|GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_DST|GPUBufferUsage.COPY_SRC}),this.deformedBuffers.set(e,n)),n}execute(e,t,n){let{config:r,audioLatentBuffer:i,vertexCount:o,timeMs:a=0,sampleRate:s=48e3}=n,g=o*64,l=this.getOrCreateDeformedBuffer(t,g),I=Ui[r.mode]??0,B=s/2048,E=r.frequencyRange?r.frequencyRange[0]:20,Q=r.frequencyRange?r.frequencyRange[1]:120,C=Math.max(0,Math.min(1023,Math.round(E/B))),p=Math.max(C,Math.min(1023,Math.round(Q/B))),h=typeof r.amplitudeMultiplier=="number"?r.amplitudeMultiplier:typeof r.amplitudeMultiplier?.value=="number"?r.amplitudeMultiplier.value:1,d=r.damping??0;this.uniformUint32[0]=I,this.uniformUint32[1]=C,this.uniformUint32[2]=p,this.uniformUint32[3]=o,this.uniformFloat32[4]=h,this.uniformFloat32[5]=d,this.uniformFloat32[6]=a,this.uniformFloat32[7]=0;let D=this.uniformPool.getBuffer(this.device,new Uint8Array(this.uniformData)),x=this.device.createBindGroup({layout:this.bindGroupLayout,entries:[{binding:0,resource:{buffer:i}},{binding:1,resource:{buffer:D}},{binding:2,resource:{buffer:t}},{binding:3,resource:{buffer:l}}]}),G=e.beginComputePass({label:"AudioMeshDeformComputePass"});G.setPipeline(this.pipeline),G.setBindGroup(0,x);let M=Math.ceil(o/256);return G.dispatchWorkgroups(M),G.end(),l}resetPools(){this.uniformPool.reset()}destroy(){this.uniformPool.destroy()}};v();v();v();function ue(A,e,t){let n=r=>[A[r*3],A[r*3+1],A[r*3+2]];for(let r=0;r<e.length;r+=3){let i=e[r],o=e[r+1],a=e[r+2],s=n(i),g=R.cross(R.subtract(n(o),s),R.subtract(n(a),s));for(let l of[i,o,a])t[l*3]+=g[0],t[l*3+1]+=g[1],t[l*3+2]+=g[2]}for(let r=0;r<t.length;r+=3){let i=t[r],o=t[r+1],a=t[r+2],s=Math.hypot(i,o,a)||1;t[r]=i/s,t[r+1]=o/s,t[r+2]=a/s}}function JA(...A){let e=1/0,t=1/0,n=1/0,r=-1/0,i=-1/0,o=-1/0;for(let a of A)for(let s=0;s<a.length;s+=3){let g=a[s],l=a[s+1],I=a[s+2];g<e&&(e=g),g>r&&(r=g),l<t&&(t=l),l>i&&(i=l),I<n&&(n=I),I>o&&(o=I)}return Number.isFinite(e)||(e=t=n=0,r=i=o=0),{min:[e,t,n],max:[r,i,o],center:[(e+r)*.5,(t+i)*.5,(n+o)*.5],size:[r-e,i-t,o-n]}}function OA(A,e){let t=Math.max(...A.size,1e-4),n=1;e.normalizeSize&&e.normalizeSize>0&&(n=e.normalizeSize/t);let r=[n,n,n];return typeof e.scale=="number"?(r[0]*=e.scale,r[1]*=e.scale,r[2]*=e.scale):Array.isArray(e.scale)&&(r[0]*=e.scale[0],r[1]*=e.scale[1],r[2]*=e.scale[2]),{offset:e.center?A.center:[0,0,0],scale:r}}function KA(A,{offset:e,scale:t}){let n=new Float32Array(A.length);for(let r=0;r<A.length;r+=3)n[r]=(A[r]-e[0])*t[0],n[r+1]=(A[r+1]-e[1])*t[1],n[r+2]=(A[r+2]-e[2])*t[2];return n}function YA(A,e){return e>65535?new Uint32Array(A):new Uint16Array(A)}function VA(A,{offset:e,scale:t}){let n=[(A.min[0]-e[0])*t[0],(A.min[1]-e[1])*t[1],(A.min[2]-e[2])*t[2]],r=[(A.max[0]-e[0])*t[0],(A.max[1]-e[1])*t[1],(A.max[2]-e[2])*t[2]];return{min:n,max:r,center:[(n[0]+r[0])*.5,(n[1]+r[1])*.5,(n[2]+r[2])*.5],size:[r[0]-n[0],r[1]-n[1],r[2]-n[2]],boundingSphereRadius:Math.hypot(r[0]-n[0],r[1]-n[1],r[2]-n[2])*.5}}var Ue=class A{static isBinary(e){let t=e instanceof Uint8Array?e:new Uint8Array(e);if(t.length<84)return!1;let r=new DataView(t.buffer,t.byteOffset,t.byteLength).getUint32(80,!0),i=84+r*50;if(t.length===i)return!0;let o=Math.min(t.length,512);for(let s=0;s<o;s++){let g=t[s];if(g>127||g<32&&g!==9&&g!==10&&g!==13)return!0}let a=new TextDecoder("utf-8").decode(t.subarray(0,80)).trim();return a.startsWith("solid")&&!a.includes(`
142
+ `)?t.length>=84+r*50:!a.startsWith("solid")}static parse(e,t={}){if(typeof e=="string")return A.parseAscii(e,t);let n=e instanceof Uint8Array?e:new Uint8Array(e);if(A.isBinary(n))return A.parseBinary(n,t);let r=new TextDecoder("utf-8").decode(n);return A.parseAscii(r,t)}static parseBinary(e,t={}){let n=new DataView(e.buffer,e.byteOffset,e.byteLength),r=n.getUint32(80,!0),i=[],o=[],a=[],s=84;for(let g=0;g<r&&!(s+50>e.byteLength);g++){let l=n.getFloat32(s,!0),I=n.getFloat32(s+4,!0),B=n.getFloat32(s+8,!0);s+=12;let E=n.getFloat32(s,!0),Q=n.getFloat32(s+4,!0),C=n.getFloat32(s+8,!0);s+=12;let p=n.getFloat32(s,!0),h=n.getFloat32(s+4,!0),d=n.getFloat32(s+8,!0);s+=12;let D=n.getFloat32(s,!0),x=n.getFloat32(s+4,!0),G=n.getFloat32(s+8,!0);s+=12,s+=2;let M=l,w=I,b=B;if(M===0&&w===0&&b===0){let U=R.subtract([p,h,d],[E,Q,C]),L=R.subtract([D,x,G],[E,Q,C]),F=R.normalize(R.cross(U,L));M=F[0],w=F[1],b=F[2]}let N=i.length/3;i.push(E,Q,C,p,h,d,D,x,G),o.push(M,w,b,M,w,b,M,w,b),a.push(N,N+1,N+2)}return A.finalizeModel(i,o,a,t)}static parseAscii(e,t={}){let n=[],r=[],i=[],o=e.split(/\r?\n/),a=[0,0,1],s=[];for(let g of o){let l=g.trim();if(l){if(l.startsWith("facet normal")){let I=l.split(/\s+/),B=Number.parseFloat(I[2]??"0")||0,E=Number.parseFloat(I[3]??"0")||0,Q=Number.parseFloat(I[4]??"0")||0;a=[B,E,Q],s=[]}else if(l.startsWith("vertex")){let I=l.split(/\s+/),B=Number.parseFloat(I[1]??"0")||0,E=Number.parseFloat(I[2]??"0")||0,Q=Number.parseFloat(I[3]??"0")||0;s.push([B,E,Q])}else if(l.startsWith("endfacet")){if(s.length>=3){let I=s[0],B=s[1],E=s[2],Q=a;if(Q[0]===0&&Q[1]===0&&Q[2]===0){let C=R.subtract(B,I),p=R.subtract(E,I);Q=R.normalize(R.cross(C,p))}for(let C=1;C<s.length-1;C++){let p=s[C],h=s[C+1],d=n.length/3;n.push(I[0],I[1],I[2],p[0],p[1],p[2],h[0],h[1],h[2]),r.push(Q[0],Q[1],Q[2],Q[0],Q[1],Q[2],Q[0],Q[1],Q[2]),i.push(d,d+1,d+2)}}s=[]}}}return A.finalizeModel(n,r,i,t)}static finalizeModel(e,t,n,r={}){let i=JA(e),o=OA(i,r),a=KA(e,o),[s,g]=i.min,[l,I]=i.size,B=new Float32Array(e.length/3*2);for(let p=0;p<e.length;p+=3){let h=p/3*2;B[h]=l>0?(e[p]-s)/l:0,B[h+1]=I>0?(e[p+1]-g)/I:0}let E=YA(n,a.length/3),Q={name:"stl_default",diffuseColor:[.8,.8,.85,1],shininess:32,specularIntensity:.5,...r.defaultMaterial};return{name:"STL_Model",meshes:[{id:"stl_mesh_0",name:"stl_geometry",positions:a,normals:new Float32Array(t),uvs:B,indices:E,materialName:"stl_default"}],materials:{stl_default:Q},animations:[],bounds:VA(i,o)}}static load(e,t={}){if(typeof e!="string")return A.parse(e,t);if(e.startsWith("/")||e.startsWith("./")||e.startsWith("../")||e.startsWith("file://")){let n=e.startsWith("file://")?e.replace("file://",""):e,r=CA.readFileSync(n);return A.parse(r,t)}return A.parse(e,t)}};function Se(A,e={}){return Ue.load(A,e)}v();var Vt=class A{static parse(e,t={}){let n=typeof e=="string"?new TextEncoder().encode(e):e instanceof Uint8Array?e:new Uint8Array(e),r=A.extractHeader(n),i=A.parseHeader(r.text);if(i.format==="ascii"){let a=new TextDecoder("utf-8").decode(n.subarray(r.endOffset));return A.parseAsciiBody(i,a,t)}let o=i.format==="binary_little_endian";return A.parseBinaryBody(i,n.subarray(r.endOffset),o,t)}static extractHeader(e){let t=Math.min(e.length,1e4),n=e.subarray(0,t),r=new TextDecoder("utf-8").decode(n),i=r.indexOf("end_header");if(i===-1)throw new Error("Invalid PLY file: 'end_header' marker not found");let o=r.indexOf(`
143
+ `,i);return o===-1?o=i+10:o+=1,{text:r.substring(0,o),endOffset:o}}static parseHeader(e){let t=e.split(/\r?\n/),n="ascii",r="1.0",i=[],o=null;for(let a of t){let s=a.trim();if(!s||s.startsWith("comment"))continue;let g=s.split(/\s+/),l=g[0]?.toLowerCase();if(l!=="ply"){if(l==="format"){let I=g[1]?.toLowerCase();I==="binary_little_endian"?n="binary_little_endian":I==="binary_big_endian"?n="binary_big_endian":n="ascii",r=g[2]??"1.0"}else if(l==="element"){let I=g[1]??"",B=Number.parseInt(g[2]??"0",10);o={name:I,count:B,properties:[]},i.push(o)}else if(l==="property"&&o)g[1]?.toLowerCase()==="list"?o.properties.push({name:g[4]??"",type:"list",isList:!0,countType:g[2]??"uchar",itemType:g[3]??"int"}):o.properties.push({name:g[2]??"",type:g[1]?.toLowerCase()??"float"});else if(l==="end_header")break}}return{format:n,version:r,elements:i}}static parseAsciiBody(e,t,n){let r=e.elements.find(K=>K.name==="vertex"),i=e.elements.find(K=>K.name==="face"),o=r?.count??0,a=i?.count??0,s=[],g=[],l=[],I=[],B=[],E=r?.properties??[],Q=E.findIndex(K=>K.name==="x"),C=E.findIndex(K=>K.name==="y"),p=E.findIndex(K=>K.name==="z"),h=E.findIndex(K=>K.name==="nx"),d=E.findIndex(K=>K.name==="ny"),D=E.findIndex(K=>K.name==="nz"),x=E.findIndex(K=>K.name==="u"||K.name==="s"||K.name==="texture_u"),G=E.findIndex(K=>K.name==="v"||K.name==="t"||K.name==="texture_v"),M=E.findIndex(K=>K.name==="red"||K.name==="r"),w=E.findIndex(K=>K.name==="green"||K.name==="g"),b=E.findIndex(K=>K.name==="blue"||K.name==="b"),N=E.findIndex(K=>K.name==="alpha"||K.name==="a"),U=h!==-1&&d!==-1&&D!==-1,L=M!==-1&&w!==-1&&b!==-1,F=x!==-1&&G!==-1,J=t.trim().split(/\r?\n/),W=0;for(let K=0;K<o&&!(W>=J.length);K++){let aA=J[W++]?.trim();if(!aA)continue;let j=aA.split(/\s+/),rA=Number.parseFloat(j[Q]??"0")||0,fA=Number.parseFloat(j[C]??"0")||0,X=Number.parseFloat(j[p]??"0")||0;if(s.push(rA,fA,X),U){let V=Number.parseFloat(j[h]??"0")||0,Z=Number.parseFloat(j[d]??"0")||0,mA=Number.parseFloat(j[D]??"0")||0;g.push(V,Z,mA)}else g.push(0,0,0);if(F){let V=Number.parseFloat(j[x]??"0")||0,Z=Number.parseFloat(j[G]??"0")||0;l.push(V,1-Z)}else l.push(0,0);if(L){let V=(Number.parseFloat(j[M]??"255")||0)/255,Z=(Number.parseFloat(j[w]??"255")||0)/255,mA=(Number.parseFloat(j[b]??"255")||0)/255,$=N!==-1?(Number.parseFloat(j[N]??"255")||0)/255:1;I.push(V,Z,mA,$)}}for(let K=0;K<a&&!(W>=J.length);K++){let aA=J[W++]?.trim();if(!aA)continue;let j=aA.split(/\s+/),rA=Number.parseInt(j[0]??"0",10);if(rA>=3){let fA=Number.parseInt(j[1]??"0",10);for(let X=1;X<rA-1;X++){let V=Number.parseInt(j[X+1]??"0",10),Z=Number.parseInt(j[X+2]??"0",10);B.push(fA,V,Z)}}}return A.finalizeModel(s,g,l,L?I:void 0,B,U,n)}static parseBinaryBody(e,t,n,r){let i=new DataView(t.buffer,t.byteOffset,t.byteLength),o=0,a=e.elements.find(M=>M.name==="vertex"),s=e.elements.find(M=>M.name==="face"),g=a?.count??0,l=s?.count??0,I=[],B=[],E=[],Q=[],C=[],p=a?.properties??[],h=p.some(M=>M.name==="nx"),d=p.some(M=>M.name==="red"||M.name==="r"),D=M=>{let w=0;switch(M.toLowerCase()){case"char":case"int8":w=i.getInt8(o),o+=1;break;case"uchar":case"uint8":w=i.getUint8(o),o+=1;break;case"short":case"int16":w=i.getInt16(o,n),o+=2;break;case"ushort":case"uint16":w=i.getUint16(o,n),o+=2;break;case"int":case"int32":w=i.getInt32(o,n),o+=4;break;case"uint":case"uint32":w=i.getUint32(o,n),o+=4;break;case"float":case"float32":w=i.getFloat32(o,n),o+=4;break;case"double":case"float64":w=i.getFloat64(o,n),o+=8;break;default:w=i.getFloat32(o,n),o+=4;break}return w};for(let M=0;M<g;M++){let w=0,b=0,N=0,U=0,L=0,F=0,J=0,W=0,K=1,aA=1,j=1,rA=1;for(let fA of p){let X=D(fA.type),V=fA.name.toLowerCase();V==="x"?w=X:V==="y"?b=X:V==="z"?N=X:V==="nx"?U=X:V==="ny"?L=X:V==="nz"?F=X:V==="u"||V==="s"?J=X:V==="v"||V==="t"?W=X:V==="red"||V==="r"?K=fA.type.includes("int")?X/255:X:V==="green"||V==="g"?aA=fA.type.includes("int")?X/255:X:V==="blue"||V==="b"?j=fA.type.includes("int")?X/255:X:(V==="alpha"||V==="a")&&(rA=fA.type.includes("int")?X/255:X)}I.push(w,b,N),B.push(U,L,F),E.push(J,1-W),d&&Q.push(K,aA,j,rA)}let G=(s?.properties??[]).find(M=>M.isList);for(let M=0;M<l&&!(o>=t.byteLength);M++)if(G){let w=D(G.countType??"uchar"),b=[];for(let N=0;N<w;N++)b.push(D(G.itemType??"int"));if(b.length>=3){let N=b[0];for(let U=1;U<b.length-1;U++)C.push(N,b[U],b[U+1])}}return A.finalizeModel(I,B,E,d?Q:void 0,C,h,r)}static finalizeModel(e,t,n,r,i,o,a){(!o||a.smoothNormals)&&ue(e,i,t);let s=JA(e),g=OA(s,a),l=KA(e,g),I=YA(i,l.length/3),B={name:"ply_default",diffuseColor:[.8,.8,.85,1],shininess:32,specularIntensity:.5,...a.defaultMaterial};return{name:"PLY_Model",meshes:[{id:"ply_mesh_0",name:"ply_geometry",positions:l,normals:new Float32Array(t),uvs:new Float32Array(n),colors:r?new Float32Array(r):void 0,indices:I,materialName:"ply_default"}],materials:{ply_default:B},animations:[],bounds:VA(s,g)}}static load(e,t={}){if(typeof e!="string")return A.parse(e,t);if(e.startsWith("/")||e.startsWith("./")||e.startsWith("../")||e.startsWith("file://")){let n=e.startsWith("file://")?e.replace("file://",""):e,r=CA.readFileSync(n);return A.parse(r,t)}return A.parse(e,t)}};function ve(A,e={}){return Vt.load(A,e)}v();v();var Re=128;function Si(A,e,t){let[n,r,i,o]=e,a=n*n,s=r*r,g=i*i,l=n*r,I=n*i,B=r*i,E=o*n,Q=o*r,C=o*i;return[(1-2*(s+g))*t[0],2*(l+C)*t[0],2*(I-Q)*t[0],0,2*(l-C)*t[1],(1-2*(a+g))*t[1],2*(B+E)*t[1],0,2*(I+Q)*t[2],2*(B-E)*t[2],(1-2*(a+s))*t[2],0,A[0],A[1],A[2],1]}function ar(A){let e=Math.hypot(A[0],A[1],A[2],A[3])||1;return[A[0]/e,A[1]/e,A[2]/e,A[3]/e]}function vi(A,e,t){let n=A[0]*e[0]+A[1]*e[1]+A[2]*e[2]+A[3]*e[3],r=n<0?-1:1;if(n*=r,n>.9995)return ar([A[0]+(r*e[0]-A[0])*t,A[1]+(r*e[1]-A[1])*t,A[2]+(r*e[2]-A[2])*t,A[3]+(r*e[3]-A[3])*t]);let i=Math.acos(n),o=Math.sin(i),a=Math.sin((1-t)*i)/o,s=r*Math.sin(t*i)/o;return[A[0]*a+e[0]*s,A[1]*a+e[1]*s,A[2]*a+e[2]*s,A[3]*a+e[3]*s]}function Ri(A,e){let t=0,n=A.length-1;for(;t<n;){let r=t+n+1>>1;(A[r]??0)<=e?t=r:n=r-1}return t}function ie(A,e,t,n,r=1){let i=n?(e*3+r)*t:e*t;return Array.from(A.subarray(i,i+t))}function Wt(A,e,t,n){let{times:r}=A,i=A.interpolation==="cubic",o=r.length-1;if(n<=(r[0]??0))return ie(e,0,t,i);if(n>=(r[o]??0))return ie(e,o,t,i);let a=Ri(r,n);if(A.interpolation==="step")return ie(e,a,t,i);let s=r[a]??0,g=(r[a+1]??s)-s,l=g>0?(n-s)/g:0,I=ie(e,a,t,i),B=ie(e,a+1,t,i);if(i){let E=ie(e,a,t,!0,2),Q=ie(e,a+1,t,!0,0),C=l*l,p=C*l,h=I.map((d,D)=>(2*p-3*C+1)*d+(p-2*C+l)*g*(E[D]??0)+(-2*p+3*C)*(B[D]??0)+(p-C)*g*(Q[D]??0));return t===4?ar(h):h}return t===4?vi(I,B,l):I.map((E,Q)=>E+((B[Q]??E)-E)*l)}function Li(A,e,t){let n=A.map(a=>[...a.translation]),r=A.map(a=>[...a.rotation]),i=A.map(a=>[...a.scale]),o=new Map(A.map((a,s)=>[a.name,s]));for(let a of e?.tracks??[]){let s=a.node??o.get(a.nodeName);s===void 0||!a.times.length||(a.translations&&(n[s]=Wt(a,a.translations,3,t)),a.rotations&&(r[s]=Wt(a,a.rotations,4,t)),a.scales&&(i[s]=Wt(a,a.scales,3,t)))}return A.map((a,s)=>a.matrix??Si(n[s],r[s],i[s]))}function sr(A,e,t){let n=A.nodes??[],r=Li(n,e,t),i=new Array(n.length),o=a=>{let s=i[a];if(s)return s;let g=n[a].parent,l=g<0?r[a]:_.multiply(o(g),r[a]);return i[a]=l,l};return n.map((a,s)=>o(s))}function Bs(A,e,t){let n=A.skins?.[e];if(!n)throw new Error(`model has no skin ${e}`);let r=new Float32Array(Re*16);for(let i=0;i<Re;i++){let o=n.joints[i];if(o===void 0){r.set(_.identity(),i*16);continue}let a=Array.from(n.inverseBindMatrices.subarray(i*16,i*16+16));r.set(_.multiply(t[o],a),i*16)}return r}var ki={SCALAR:1,VEC2:2,VEC3:3,VEC4:4,MAT2:4,MAT3:9,MAT4:16},Pi={5120:1,5121:1,5122:2,5123:2,5125:4,5126:4};function Hi(A,e=!1){switch(A){case 5120:return e?(t,n)=>Math.max(t.getInt8(n)/127,-1):(t,n)=>t.getInt8(n);case 5121:return e?(t,n)=>t.getUint8(n)/255:(t,n)=>t.getUint8(n);case 5122:return e?(t,n)=>Math.max(t.getInt16(n,!0)/32767,-1):(t,n)=>t.getInt16(n,!0);case 5123:return e?(t,n)=>t.getUint16(n,!0)/65535:(t,n)=>t.getUint16(n,!0);case 5125:return(t,n)=>t.getUint32(n,!0);default:return(t,n)=>t.getFloat32(n,!0)}}var gr=1179937895,Ti=1313821514,Ji=5130562,ce=class A{static isGlb(e){let t=e instanceof Uint8Array?e:new Uint8Array(e);return t.length<12?!1:new DataView(t.buffer,t.byteOffset,t.byteLength).getUint32(0,!0)===gr}static parse(e,t={},n){let r,i=[];if(typeof e=="string")try{r=JSON.parse(e)}catch(o){throw new Error(`Failed to parse glTF JSON: ${String(o)}`)}else{let o=e instanceof Uint8Array?e:new Uint8Array(e);if(A.isGlb(o)){let a=A.unpackGlb(o);r=a.doc,a.binBuffer&&i.push(a.binBuffer)}else{let a=new TextDecoder("utf-8").decode(o);r=JSON.parse(a)}}if(r.buffers)for(let o=0;o<r.buffers.length;o++){if(o===0&&i.length>0)continue;let a=r.buffers[o];if(a.uri){if(a.uri.startsWith("data:")){let s=a.uri.indexOf("base64,");if(s!==-1){let g=a.uri.substring(s+7),l=Buffer.from(g,"base64");i[o]=new Uint8Array(l.buffer,l.byteOffset,l.byteLength)}}else if(n){let s=TA.isAbsolute(a.uri)?a.uri:TA.join(n,a.uri);if(CA.existsSync(s)){let g=CA.readFileSync(s);i[o]=new Uint8Array(g.buffer,g.byteOffset,g.byteLength)}}}}return A.buildModel(r,i,t,n)}static unpackGlb(e){let t=new DataView(e.buffer,e.byteOffset,e.byteLength),n=t.getUint32(0,!0),r=t.getUint32(8,!0);if(n!==gr)throw new Error("Invalid GLB header: magic mismatch");let i=12,o=null,a;for(;i<r&&i<e.byteLength;){let s=t.getUint32(i,!0),g=t.getUint32(i+4,!0);i+=8;let l=e.subarray(i,i+s);if(i+=s,g===Ti){let I=new TextDecoder("utf-8").decode(l);o=JSON.parse(I)}else g===Ji&&(a=l)}if(!o)throw new Error("Invalid GLB: JSON chunk not found");return{doc:o,binBuffer:a}}static readFloats(e,t,n){let r=e.accessors?.[n];if(!r)throw new Error(`Accessor ${n} not found`);let i=ki[r.type]??1,o=new Float32Array(r.count*i);if(r.bufferView===void 0)return{data:o,itemSize:i,count:r.count};let a=e.bufferViews?.[r.bufferView];if(!a)throw new Error(`BufferView ${r.bufferView} not found`);let s=t[a.buffer];if(!s)throw new Error(`Binary buffer ${a.buffer} not loaded`);let g=Pi[r.componentType]??4,l=a.byteStride??g*i,I=new DataView(s.buffer,s.byteOffset,s.byteLength),B=(a.byteOffset??0)+(r.byteOffset??0),E=Hi(r.componentType,r.normalized);for(let Q=0;Q<r.count;Q++)for(let C=0;C<i;C++)o[Q*i+C]=E(I,B+Q*l+C*g);return{data:o,itemSize:i,count:r.count}}static readIndices(e,t,n){let{data:r}=A.readFloats(e,t,n);return r.reduce((o,a)=>a>o?a:o,0)>65535?Uint32Array.from(r):Uint16Array.from(r)}static imageBytes(e,t,n,r){let i=e.images?.[n];if(!i)return;if(i.bufferView!==void 0){let s=e.bufferViews?.[i.bufferView],g=s?t[s.buffer]:void 0;if(!s||!g)return;let l=s.byteOffset??0;return{bytes:g.subarray(l,l+s.byteLength),mime:i.mimeType??"image/png"}}if(!i.uri)return;if(i.uri.startsWith("data:")){let s=i.uri.indexOf(","),g=i.uri.slice(5,i.uri.indexOf(";"));return{bytes:new Uint8Array(Buffer.from(i.uri.slice(s+1),"base64")),mime:g}}if(!r)return;let o=TA.isAbsolute(i.uri)?i.uri:TA.join(r,decodeURIComponent(i.uri));if(!CA.existsSync(o))return;let a=TA.extname(o).toLowerCase();return{bytes:new Uint8Array(CA.readFileSync(o)),mime:i.mimeType??(a===".png"?"image/png":"image/jpeg")}}static buildMaterial(e,t,n,r,i){let o=n.pbrMetallicRoughness,a=o?.baseColorFactor??[1,1,1,1],s={name:r,diffuseColor:a,roughness:o?.roughnessFactor??.5,metallic:o?.metallicFactor??0,shininess:32*(1-(o?.roughnessFactor??.5)),opacity:a[3]??1,twoSided:n.doubleSided??!0,alphaMode:n.alphaMode==="MASK"?"mask":n.alphaMode==="BLEND"?"blend":"opaque",alphaCutoff:n.alphaMode==="MASK"?n.alphaCutoff??.5:0},g=n.emissiveFactor;g&&(g[0]>0||g[1]>0||g[2]>0)&&(s.emissive=[g[0],g[1],g[2]],s.emissiveStrength=n.extensions?.KHR_materials_emissive_strength?.emissiveStrength??1);let l=n.extensions?.VRMC_materials_mtoon;l?(s.shading="toon",s.shadeColor=l.shadeColorFactor??[1,1,1]):n.extensions?.KHR_materials_unlit&&(s.shading="unlit");let I=o?.baseColorTexture,B=I?e.textures?.[I.index]:void 0;if(B?.source!==void 0){let d=A.imageBytes(e,t,B.source,i);if(d){s.diffuseTextureBuffer=d.bytes,s.diffuseTextureMime=d.mime;let D=B.sampler!==void 0?e.samplers?.[B.sampler]?.wrapS:void 0;s.textureWrap=D===33071?"clamp":D===33648?"mirror":"repeat"}}let E=d=>{let D=d?e.textures?.[d.index]:void 0;return D?.source!==void 0?A.imageBytes(e,t,D.source,i)?.bytes:void 0},Q=E(n.normalTexture);Q&&(s.normalTextureBuffer=Q,s.normalScale=n.normalTexture?.scale??1);let C=E(o?.metallicRoughnessTexture);C&&(s.metallicRoughnessTextureBuffer=C,s.roughness=o?.roughnessFactor??1,s.metallic=o?.metallicFactor??1);let p=E(n.occlusionTexture);p&&(s.occlusionTextureBuffer=p,s.occlusionStrength=n.occlusionTexture?.strength??1);let h=s.emissive&&E(n.emissiveTexture);return h&&(s.emissiveTextureBuffer=h),s}static buildNodes(e){let t=(e.nodes??[]).map((n,r)=>({name:n.name??`node_${r}`,parent:-1,translation:n.translation??[0,0,0],rotation:n.rotation??[0,0,0,1],scale:n.scale??[1,1,1],matrix:n.matrix?n.matrix:void 0}));return(e.nodes??[]).forEach((n,r)=>{for(let i of n.children??[]){let o=t[i];o&&(o.parent=r)}}),t}static buildAnimations(e,t,n){return(e.animations??[]).map((r,i)=>{let o=[],a=0;for(let s of r.channels){let g=r.samplers[s.sampler],l=s.target.node;if(!g||l===void 0||s.target.path==="weights")continue;let I=A.readFloats(e,t,g.input).data,B=A.readFloats(e,t,g.output).data;a=Math.max(a,I[I.length-1]??0);let E={nodeName:n[l]?.name??`node_${l}`,node:l,times:I,interpolation:g.interpolation==="STEP"?"step":g.interpolation==="CUBICSPLINE"?"cubic":"linear"};s.target.path==="translation"?E.translations=B:s.target.path==="rotation"?E.rotations=B:E.scales=B,o.push(E)}return{name:r.name??`Animation_${i}`,duration:a>0?a:1,fps:30,tracks:o}})}static buildModel(e,t,n,r){let i=(e.materials??[]).map((F,J,W)=>{let K=F.name??`material_${J}`;return W.findIndex((aA,j)=>(aA.name??`material_${j}`)===K)===J?K:`${K}#${J}`}),o={};(e.materials??[]).forEach((F,J)=>{let W=i[J];o[W]=A.buildMaterial(e,t,F,W,r)});let a=A.buildNodes(e),s=(e.skins??[]).map(F=>({joints:F.joints,inverseBindMatrices:F.inverseBindMatrices!==void 0?A.readFloats(e,t,F.inverseBindMatrices).data:Float32Array.from(F.joints.flatMap(()=>_.identity()))})),g=A.buildAnimations(e,t,a),l=(e.nodes??[]).flatMap((F,J)=>F.mesh!==void 0?[{mesh:F.mesh,node:J,skin:F.skin}]:[]),I=l.length>0?l:(e.meshes??[]).map((F,J)=>({mesh:J})),B={name:"glTF_Model",meshes:[],materials:o,nodes:a,skins:s,animations:g,bounds:{min:[0,0,0],max:[0,0,0],center:[0,0,0],size:[0,0,0],boundingSphereRadius:0}},E=sr(B,void 0,0),Q=1/0,C=1/0,p=1/0,h=-1/0,d=-1/0,D=-1/0,x=(F,J,W)=>{F<Q&&(Q=F),F>h&&(h=F),J<C&&(C=J),J>d&&(d=J),W<p&&(p=W),W>D&&(D=W)};for(let F of I){let J=e.meshes?.[F.mesh];J&&J.primitives.forEach((W,K)=>{if(W.attributes.POSITION===void 0||W.mode!==void 0&&W.mode!==4)return;let aA=$=>$===void 0?void 0:A.readFloats(e,t,$),j=aA(W.attributes.POSITION),rA=j.count,fA=aA(W.attributes.COLOR_0),X;if(fA){X=new Float32Array(rA*4).fill(1);for(let $=0;$<rA;$++)for(let lA=0;lA<fA.itemSize;lA++)X[$*4+lA]=fA.data[$*fA.itemSize+lA]??1}let V;if(W.indices!==void 0)V=A.readIndices(e,t,W.indices);else{V=rA>65535?new Uint32Array(rA):new Uint16Array(rA);for(let $=0;$<rA;$++)V[$]=$}let Z=F.skin!==void 0&&W.attributes.JOINTS_0!==void 0,mA=!Z&&F.node!==void 0?E[F.node]:void 0;for(let $=0;$<rA;$++){let lA=j.data[$*3],IA=j.data[$*3+1],yA=j.data[$*3+2];if(mA){let AA=_.projectPoint(mA,[lA,IA,yA]);x(AA[0],AA[1],AA[2])}else x(lA,IA,yA)}B.meshes.push({id:`gltf_mesh_${F.mesh}_${K}${F.node!==void 0?`_n${F.node}`:""}`,name:J.name??`Mesh_${F.mesh}`,positions:j.data,normals:aA(W.attributes.NORMAL)?.data??new Float32Array(rA*3),uvs:aA(W.attributes.TEXCOORD_0)?.data??new Float32Array(rA*2),colors:X,jointIndices:Z?aA(W.attributes.JOINTS_0)?.data:void 0,jointWeights:Z?aA(W.attributes.WEIGHTS_0)?.data:void 0,indices:V,materialName:W.material!==void 0?i[W.material]:void 0,node:F.node,skin:Z?F.skin:void 0})})}for(let F of s)if(F.joints.length>Re)throw new Error(`glTF skin has ${F.joints.length} joints; the mesh shader holds ${Re}`);Number.isFinite(Q)||(Q=C=p=0,h=d=D=0);let G=Math.max(h-Q,d-C,D-p,1e-4),M=n.normalizeSize&&n.normalizeSize>0?n.normalizeSize/G:1,w=typeof n.scale=="number"?[n.scale,n.scale,n.scale]:n.scale??[1,1,1],b=[M*w[0],M*w[1],M*w[2]],N=n.center?[(Q+h)*.5,(C+d)*.5,(p+D)*.5]:[0,0,0];B.rootTransform=_.multiply(_.scale(b[0],b[1],b[2]),_.translate(-N[0],-N[1],-N[2]));let U=[(Q-N[0])*b[0],(C-N[1])*b[1],(p-N[2])*b[2]],L=[(h-N[0])*b[0],(d-N[1])*b[1],(D-N[2])*b[2]];return B.bounds={min:U,max:L,center:[(U[0]+L[0])*.5,(U[1]+L[1])*.5,(U[2]+L[2])*.5],size:[L[0]-U[0],L[1]-U[1],L[2]-U[2]],boundingSphereRadius:Math.hypot(L[0]-U[0],L[1]-U[1],L[2]-U[2])*.5},B}static load(e,t={}){if(typeof e!="string")return A.parse(e,t);if(e.startsWith("/")||e.startsWith("./")||e.startsWith("../")||e.startsWith("file://")){let n=e.startsWith("file://")?e.replace("file://",""):e,r=CA.readFileSync(n),i=TA.dirname(n);return A.parse(r,t,i)}return A.parse(e,t)}};function st(A,e={}){return ce.load(A,e)}function lr(A,e={}){return ce.load(A,e)}v();var Oi=[[0,0,0,0],...Array.from({length:255},(A,e)=>{let t=(e+1)/256;return[t,t,t,1]})],Le=class A{static isVox(e){let t=e instanceof Uint8Array?e:new Uint8Array(e);return t.length<8?!1:new TextDecoder("ascii").decode(t.subarray(0,4))==="VOX "}static parse(e,t={}){let n=e instanceof Uint8Array?e:new Uint8Array(e),r=new DataView(n.buffer,n.byteOffset,n.byteLength);if(new TextDecoder("ascii").decode(n.subarray(0,4))!=="VOX ")throw new Error("Invalid VOX file: magic mismatch");let o=8,a=16,s=16,g=16,l=[],I=[...Oi];for(;o+12<=n.byteLength;){let B=new TextDecoder("ascii").decode(n.subarray(o,o+4)),E=r.getUint32(o+4,!0);o+=12;let Q=o;if(B==="SIZE")a=r.getUint32(Q,!0),s=r.getUint32(Q+4,!0),g=r.getUint32(Q+8,!0);else if(B==="XYZI"){let C=r.getUint32(Q,!0),p=Q+4;for(let h=0;h<C&&!(p+4>n.byteLength);h++){let d=r.getUint8(p),D=r.getUint8(p+1),x=r.getUint8(p+2),G=r.getUint8(p+3);p+=4,l.push({x:d,y:D,z:x,colorIndex:G})}}else if(B==="RGBA")for(let C=0;C<256;C++){let p=Q+C*4;if(p+4>n.byteLength)break;let h=r.getUint8(p)/255,d=r.getUint8(p+1)/255,D=r.getUint8(p+2)/255,x=r.getUint8(p+3)/255,G=C===255?0:C+1;I[G]=[h,d,D,x]}o+=E}return A.buildModel(l,I,a,s,g,t)}static buildModel(e,t,n,r,i,o){let a=new Set;e.forEach(x=>a.add(`${x.x},${x.y},${x.z}`));let s=[],g=[],l=[],I=[],B=[],E=(x,G,M,w,b,N)=>{let U=s.length/3;s.push(...x,...G,...M,...w),g.push(...b,...b,...b,...b),l.push(...N,...N,...N,...N),I.push(0,0,1,0,1,1,0,1),B.push(U,U+1,U+2,U,U+2,U+3)};for(let x of e){let{x:G,y:M,z:w,colorIndex:b}=x,N=t[b]??[.8,.8,.8,1],U=G,L=-w,F=M;a.has(`${G+1},${M},${w}`)||E([U+1,L,F],[U+1,L-1,F],[U+1,L-1,F+1],[U+1,L,F+1],[1,0,0],N),a.has(`${G-1},${M},${w}`)||E([U,L,F+1],[U,L-1,F+1],[U,L-1,F],[U,L,F],[-1,0,0],N),a.has(`${G},${M},${w+1}`)||E([U,L-1,F],[U+1,L-1,F],[U+1,L-1,F+1],[U,L-1,F+1],[0,-1,0],N),a.has(`${G},${M},${w-1}`)||E([U,L,F+1],[U+1,L,F+1],[U+1,L,F],[U,L,F],[0,1,0],N),a.has(`${G},${M+1},${w}`)||E([U+1,L,F+1],[U+1,L-1,F+1],[U,L-1,F+1],[U,L,F+1],[0,0,1],N),a.has(`${G},${M-1},${w}`)||E([U,L,F],[U,L-1,F],[U+1,L-1,F],[U+1,L,F],[0,0,-1],N)}let Q=JA(s),C=OA(Q,o),p=KA(s,C),h=YA(B,p.length/3),d={name:"vox_default",diffuseColor:[1,1,1,1],shininess:32,specularIntensity:.4,...o.defaultMaterial};return{name:"VOX_Model",meshes:[{id:"vox_mesh_0",name:"vox_geometry",positions:p,normals:new Float32Array(g),uvs:new Float32Array(I),colors:new Float32Array(l),indices:h,materialName:"vox_default"}],materials:{vox_default:d},animations:[],bounds:VA(Q,C)}}static load(e,t={}){if(typeof e!="string")return A.parse(e,t);if(e.startsWith("/")||e.startsWith("./")||e.startsWith("../")||e.startsWith("file://")){let n=e.startsWith("file://")?e.replace("file://",""):e,r=CA.readFileSync(n);return A.parse(r,t)}throw new Error("VOX files must be binary buffers or local file paths")}};function gt(A,e={}){return Le.load(A,e)}v();var zt=19789,Ki=15677,Yi=16384,Vi=16640,Wi=16656,zi=16672,Xi=16704,Zi=45055,qi=40960,_i=40992,ji=16,$i=17,ke=class A{static is3DS(e){let t=e instanceof Uint8Array?e:new Uint8Array(e);return t.length<6?!1:new DataView(t.buffer,t.byteOffset,t.byteLength).getUint16(0,!0)===zt}static parse(e,t={}){let n=e instanceof Uint8Array?e:new Uint8Array(e),r=new DataView(n.buffer,n.byteOffset,n.byteLength);if(r.getUint16(0,!0)!==zt)throw new Error("Invalid 3DS file: 0x4D4D magic mismatch");let o=[],a={};return A.readChunk(r,0,n.byteLength,o,a),A.buildModel(o,a,t)}static readChunk(e,t,n,r,i,o="Object"){let a=t;for(;a+6<=n&&a+6<=e.byteLength;){let s=e.getUint16(a,!0),g=e.getUint32(a+2,!0);if(g<6)break;let l=a+g,I=a+6,B=Math.min(l,n,e.byteLength);switch(s){case zt:case Ki:A.readChunk(e,I,B,r,i,o);break;case Yi:{let E=I;for(;E<B&&e.getUint8(E)!==0;)E++;let Q=new Uint8Array(e.buffer,e.byteOffset+I,E-I),C=new TextDecoder("ascii").decode(Q)||"Object";A.readChunk(e,E+1,B,r,i,C);break}case Vi:{let E={name:o,positions:[],indices:[],uvs:[]};A.readTriMesh(e,I,B,E,i),E.positions.length>0&&E.indices.length>0&&r.push(E);break}case Zi:A.readMaterial(e,I,B,i);break;default:break}a=l}}static readTriMesh(e,t,n,r,i){let o=t;for(;o+6<=n;){let a=e.getUint16(o,!0),s=e.getUint32(o+2,!0);if(s<6)break;let g=o+s,l=o+6;if(a===Wi){let I=e.getUint16(l,!0),B=l+2;for(let E=0;E<I&&!(B+12>n);E++){let Q=e.getFloat32(B,!0),C=e.getFloat32(B+4,!0),p=e.getFloat32(B+8,!0);r.positions.push(Q,C,p),B+=12}}else if(a===zi){let I=e.getUint16(l,!0),B=l+2;for(let E=0;E<I&&!(B+8>n);E++){let Q=e.getUint16(B,!0),C=e.getUint16(B+2,!0),p=e.getUint16(B+4,!0);r.indices.push(Q,C,p),B+=8}}else if(a===Xi){let I=e.getUint16(l,!0),B=l+2;for(let E=0;E<I&&!(B+8>n);E++){let Q=e.getFloat32(B,!0),C=e.getFloat32(B+4,!0);r.uvs.push(Q,1-C),B+=8}}o=g}}static readMaterial(e,t,n,r){let i=t,o="Material",a=[.8,.8,.8,1];for(;i+6<=n;){let s=e.getUint16(i,!0),g=e.getUint32(i+2,!0);if(g<6)break;let l=i+g,I=i+6;if(s===qi){let B=I;for(;B<l&&e.getUint8(B)!==0;)B++;let E=new Uint8Array(e.buffer,e.byteOffset+I,B-I);o=new TextDecoder("ascii").decode(E)||o}else if(s===_i&&I+6<=l){let B=e.getUint16(I,!0);if(B===ji&&I+18<=l){let E=e.getFloat32(I+6,!0),Q=e.getFloat32(I+10,!0),C=e.getFloat32(I+14,!0);a=[E,Q,C,1]}else if(B===$i&&I+9<=l){let E=e.getUint8(I+6)/255,Q=e.getUint8(I+7)/255,C=e.getUint8(I+8)/255;a=[E,Q,C,1]}}i=l}r[o]={name:o,diffuseColor:a,shininess:32,specularIntensity:.5}}static buildModel(e,t,n){let r=JA(...e.map(a=>a.positions)),i=OA(r,n);return{name:"3DS_Model",meshes:e.map((a,s)=>{let g=KA(a.positions,i),l=new Float32Array(a.positions.length);ue(g,a.indices,l);let I=a.uvs.length===a.positions.length/3*2?new Float32Array(a.uvs):new Float32Array(a.positions.length/3*2),B=YA(a.indices,g.length/3);return{id:`3ds_mesh_${s}`,name:a.name,positions:g,normals:l,uvs:I,indices:B,materialName:a.materialName}}),materials:t,animations:[],bounds:VA(r,i)}}static load(e,t={}){if(typeof e!="string")return A.parse(e,t);if(e.startsWith("/")||e.startsWith("./")||e.startsWith("../")||e.startsWith("file://")){let n=e.startsWith("file://")?e.replace("file://",""):e,r=CA.readFileSync(n);return A.parse(r,t)}throw new Error("3DS files must be binary buffers or local file paths")}};function lt(A,e={}){return ke.load(A,e)}v();var Xt=class A{static parse(e,t={}){let r=(typeof e=="string"?e:new TextDecoder("utf-8").decode(e instanceof Uint8Array?e:new Uint8Array(e))).split(/\r?\n/),i=0;for(;i<r.length&&(!r[i].trim()||r[i].trim().startsWith("#"));)i++;if(i>=r.length)throw new Error("Empty OFF file");let o=r[i++].trim(),a=!1,s=!1;if(o.startsWith("NOFF")||o.startsWith("STOFF"))a=!0;else if(o.startsWith("COFF"))s=!0;else if(!o.startsWith("OFF"))throw new Error("Invalid OFF header: missing 'OFF'");o=o.replace(/^(?:ST|CO|NO|C|N)?OFF\s*/i,"").trim();let g=0,l=0;if(o.length>0){let b=o.split(/\s+/);g=Number.parseInt(b[0]??"0",10),l=Number.parseInt(b[1]??"0",10)}else for(;i<r.length;){let b=r[i++].trim();if(!b||b.startsWith("#"))continue;let N=b.split(/\s+/);g=Number.parseInt(N[0]??"0",10),l=Number.parseInt(N[1]??"0",10);break}let I=[],B=[],E=[],Q=[],C=[],p=0;for(;i<r.length&&p<g;){let b=r[i++].trim();if(!b||b.startsWith("#"))continue;let N=b.split(/\s+/),U=Number.parseFloat(N[0]??"0")||0,L=Number.parseFloat(N[1]??"0")||0,F=Number.parseFloat(N[2]??"0")||0;I.push(U,L,F);let J=3;if(a){let W=Number.parseFloat(N[J]??"0")||0,K=Number.parseFloat(N[J+1]??"0")||0,aA=Number.parseFloat(N[J+2]??"0")||0;B.push(W,K,aA),J+=3}else B.push(0,0,0);if(s&&N.length>J){let W=(Number.parseFloat(N[J]??"255")||0)/(Number.parseFloat(N[J]??"255")>1?255:1),K=(Number.parseFloat(N[J+1]??"255")||0)/(Number.parseFloat(N[J+1]??"255")>1?255:1),aA=(Number.parseFloat(N[J+2]??"255")||0)/(Number.parseFloat(N[J+2]??"255")>1?255:1),j=N.length>J+3&&Number.parseFloat(N[J+3]??"1")||1;E.push(W,K,aA,j)}Q.push(0,0),p++}let h=0;for(;i<r.length&&h<l;){let b=r[i++].trim();if(!b||b.startsWith("#"))continue;let N=b.split(/\s+/),U=Number.parseInt(N[0]??"0",10);if(U>=3){let L=Number.parseInt(N[1]??"0",10);for(let F=1;F<U-1;F++){let J=Number.parseInt(N[F+1]??"0",10),W=Number.parseInt(N[F+2]??"0",10);C.push(L,J,W)}}h++}(!a||t.smoothNormals)&&ue(I,C,B);let d=JA(I),D=OA(d,t),x=KA(I,D),G=YA(C,x.length/3),M={name:"off_default",diffuseColor:[.8,.8,.85,1],shininess:32,specularIntensity:.5,...t.defaultMaterial};return{name:"OFF_Model",meshes:[{id:"off_mesh_0",name:"off_geometry",positions:x,normals:new Float32Array(B),uvs:new Float32Array(Q),colors:s?new Float32Array(E):void 0,indices:G,materialName:"off_default"}],materials:{off_default:M},animations:[],bounds:VA(d,D)}}static load(e,t={}){if(typeof e!="string")return A.parse(e,t);if(e.startsWith("/")||e.startsWith("./")||e.startsWith("../")||e.startsWith("file://")){let n=e.startsWith("file://")?e.replace("file://",""):e,r=CA.readFileSync(n,"utf-8");return A.parse(r,t)}return A.parse(e,t)}};function It(A,e={}){return Xt.load(A,e)}v();var Ir=`
144
+ struct CameraUniforms {
145
+ viewMatrix : mat4x4<f32>,
146
+ projMatrix : mat4x4<f32>,
147
+ viewProjMatrix : mat4x4<f32>,
148
+ invViewProjMatrix : mat4x4<f32>,
149
+ cameraPos : vec4<f32>, // xyz = eye, w = near
150
+ cameraDir : vec4<f32>, // xyz = forward, w = far
151
+ dofParams : vec4<f32>, // x = focusDistance, y = fStop, z = maxBlurRadius, w = dofEnabled
152
+ screenParams : vec4<f32>, // x = surfaceWidth, y = surfaceHeight, z = time, w = unused
153
+ };
154
+
155
+ @group(0) @binding(0) var<uniform> cam : CameraUniforms;
156
+ @group(0) @binding(1) var samp : sampler;
157
+ @group(0) @binding(2) var colorTex : texture_2d<f32>;
158
+ @group(0) @binding(3) var depthTex : texture_2d<f32>;
159
+
160
+ struct VSOut {
161
+ @builtin(position) pos : vec4<f32>,
162
+ @location(0) uv : vec2<f32>,
163
+ };
164
+
165
+ @vertex
166
+ fn vs_fullscreen(@builtin(vertex_index) vid : u32) -> VSOut {
167
+ var out: VSOut;
168
+ // Fullscreen triangle covering [-1, 1] NDC
169
+ var coord = vec2<f32>(-1.0, -1.0);
170
+ if (vid == 1u) {
171
+ coord = vec2<f32>(3.0, -1.0);
172
+ } else if (vid == 2u) {
173
+ coord = vec2<f32>(-1.0, 3.0);
174
+ }
175
+ out.pos = vec4<f32>(coord, 0.0, 1.0);
176
+ out.uv = coord * 0.5 + 0.5;
177
+ out.uv.y = 1.0 - out.uv.y; // Flip Y for texture coordinates
178
+ return out;
179
+ }
180
+
181
+ fn computeCoC(depth: f32) -> f32 {
182
+ let focusDist = cam.dofParams.x;
183
+ let maxBlur = cam.dofParams.z;
184
+ if (focusDist <= 0.0 || maxBlur <= 0.0) {
185
+ return 0.0;
186
+ }
187
+ let delta = abs(depth - focusDist);
188
+ // Smooth non-linear ramp around focus plane
189
+ return clamp((delta / (focusDist * 0.5 + 1.0)) * maxBlur, 0.0, maxBlur);
190
+ }
191
+
192
+ @fragment
193
+ fn fs_dof(in: VSOut) -> @location(0) vec4<f32> {
194
+ let centerColor = textureSampleLevel(colorTex, samp, in.uv, 0.0);
195
+ let centerDepth = textureSampleLevel(depthTex, samp, in.uv, 0.0).r;
196
+ let coc = computeCoC(centerDepth);
197
+
198
+ // Skip if DoF is disabled or blur is negligible
199
+ if (cam.dofParams.w < 0.5 || coc < 0.5) {
200
+ return centerColor;
201
+ }
202
+
203
+ var accumColor = centerColor;
204
+ var totalWeight = 1.0;
205
+
206
+ let NUM_SAMPLES = 24;
207
+ let GOLDEN_ANGLE = 2.39996323;
208
+ let texelSize = 1.0 / cam.screenParams.xy;
209
+
210
+ for (var i = 1; i <= NUM_SAMPLES; i = i + 1) {
211
+ let theta = f32(i) * GOLDEN_ANGLE;
212
+ let r = sqrt(f32(i) / f32(NUM_SAMPLES)) * coc;
213
+ let offset = vec2<f32>(cos(theta), sin(theta)) * r * texelSize;
214
+
215
+ let sampleUV = in.uv + offset;
216
+ let sampleColor = textureSampleLevel(colorTex, samp, sampleUV, 0.0);
217
+ let sampleDepth = textureSampleLevel(depthTex, samp, sampleUV, 0.0).r;
218
+ let sampleCoC = computeCoC(sampleDepth);
219
+
220
+ // Depth-aware bilateral rejection: prevent background bleed onto sharp foreground
221
+ let depthDiff = sampleDepth - centerDepth;
222
+ let weight = select(
223
+ smoothstep(-10.0, 0.0, depthDiff) * clamp(sampleCoC / coc, 0.2, 1.0),
224
+ 1.0,
225
+ depthDiff >= 0.0
226
+ );
227
+
228
+ accumColor = accumColor + sampleColor * weight;
229
+ totalWeight = totalWeight + weight;
230
+ }
231
+
232
+ return accumColor / totalWeight;
233
+ }
234
+ `;v();var Ao=`
235
+ struct BloomUniforms {
236
+ texel : vec2<f32>, // 1 / source size
237
+ threshold : f32,
238
+ knee : f32,
239
+ intensity : f32,
240
+ mode : f32,
241
+ _pad : vec2<f32>,
242
+ tint : vec4<f32>,
243
+ };
244
+
245
+ @group(0) @binding(0) var<uniform> u : BloomUniforms;
246
+ @group(0) @binding(1) var samp : sampler;
247
+ @group(0) @binding(2) var src : texture_2d<f32>;
248
+ @group(0) @binding(3) var base : texture_2d<f32>;
249
+
250
+ struct VsOut {
251
+ @builtin(position) pos : vec4<f32>,
252
+ @location(0) uv : vec2<f32>,
253
+ };
254
+
255
+ @vertex
256
+ fn vs(@builtin(vertex_index) i : u32) -> VsOut {
257
+ let p = vec2<f32>(f32((i << 1u) & 2u), f32(i & 2u));
258
+ var o : VsOut;
259
+ o.pos = vec4<f32>(p * 2.0 - 1.0, 0.0, 1.0);
260
+ o.uv = vec2<f32>(p.x, 1.0 - p.y);
261
+ return o;
262
+ }
263
+
264
+ fn s(uv : vec2<f32>) -> vec3<f32> {
265
+ return textureSampleLevel(src, samp, uv, 0.0).rgb;
266
+ }
267
+
268
+ // Jimenez's 13-tap downsample (Call of Duty: AW): stable, no fireflies.
269
+ fn down13(uv : vec2<f32>) -> vec3<f32> {
270
+ let t = u.texel;
271
+ let a = s(uv + t * vec2<f32>(-2.0, -2.0));
272
+ let b = s(uv + t * vec2<f32>(0.0, -2.0));
273
+ let c = s(uv + t * vec2<f32>(2.0, -2.0));
274
+ let d = s(uv + t * vec2<f32>(-2.0, 0.0));
275
+ let e = s(uv);
276
+ let f = s(uv + t * vec2<f32>(2.0, 0.0));
277
+ let g = s(uv + t * vec2<f32>(-2.0, 2.0));
278
+ let h = s(uv + t * vec2<f32>(0.0, 2.0));
279
+ let i = s(uv + t * vec2<f32>(2.0, 2.0));
280
+ let j = s(uv + t * vec2<f32>(-1.0, -1.0));
281
+ let k = s(uv + t * vec2<f32>(1.0, -1.0));
282
+ let l = s(uv + t * vec2<f32>(-1.0, 1.0));
283
+ let m = s(uv + t * vec2<f32>(1.0, 1.0));
284
+ return e * 0.125 + (a + c + g + i) * 0.03125 + (b + d + f + h) * 0.0625 + (j + k + l + m) * 0.125;
285
+ }
286
+
287
+ // Soft-knee threshold (keeps hue, fades in below the threshold).
288
+ fn prefilter(c : vec3<f32>) -> vec3<f32> {
289
+ let br = max(c.r, max(c.g, c.b));
290
+ let kneeW = u.threshold * u.knee + 1e-4;
291
+ var soft = clamp(br - u.threshold + kneeW, 0.0, 2.0 * kneeW);
292
+ soft = soft * soft / (4.0 * kneeW);
293
+ let w = max(soft, br - u.threshold) / max(br, 1e-4);
294
+ return c * max(w, 0.0);
295
+ }
296
+
297
+ fn srgbToLinear(c : vec3<f32>) -> vec3<f32> {
298
+ let lo = c / 12.92;
299
+ let hi = pow((max(c, vec3<f32>(0.0)) + 0.055) / 1.055, vec3<f32>(2.4));
300
+ return select(hi, lo, c <= vec3<f32>(0.04045));
301
+ }
302
+
303
+ fn linearToSrgb(c : vec3<f32>) -> vec3<f32> {
304
+ let x = clamp(c, vec3<f32>(0.0), vec3<f32>(1.0));
305
+ let lo = x * 12.92;
306
+ let hi = 1.055 * pow(x, vec3<f32>(1.0 / 2.4)) - 0.055;
307
+ return select(hi, lo, x <= vec3<f32>(0.0031308));
308
+ }
309
+
310
+ // mode 0: the source is linear scene radiance; mode 1: display-encoded color.
311
+ @fragment
312
+ fn fs_prefilter(in : VsOut) -> @location(0) vec4<f32> {
313
+ var c = down13(in.uv);
314
+ if (u.mode > 0.5) {
315
+ c = srgbToLinear(c);
316
+ }
317
+ return vec4<f32>(prefilter(c), 1.0);
318
+ }
319
+
320
+ @fragment
321
+ fn fs_down(in : VsOut) -> @location(0) vec4<f32> {
322
+ return vec4<f32>(down13(in.uv), 1.0);
323
+ }
324
+
325
+ // 3x3 tent upsample; added onto the next-larger level by the blend state.
326
+ @fragment
327
+ fn fs_up(in : VsOut) -> @location(0) vec4<f32> {
328
+ let t = u.texel;
329
+ var c = s(in.uv) * 4.0;
330
+ c += (s(in.uv + vec2<f32>(-t.x, 0.0)) + s(in.uv + vec2<f32>(t.x, 0.0)) + s(in.uv + vec2<f32>(0.0, -t.y)) + s(in.uv + vec2<f32>(0.0, t.y))) * 2.0;
331
+ c += s(in.uv + vec2<f32>(-t.x, -t.y)) + s(in.uv + vec2<f32>(t.x, -t.y)) + s(in.uv + vec2<f32>(-t.x, t.y)) + s(in.uv + vec2<f32>(t.x, t.y));
332
+ return vec4<f32>(c / 16.0, 1.0);
333
+ }
334
+
335
+ // Adds the glow in linear light over the premultiplied display image.
336
+ @fragment
337
+ fn fs_composite(in : VsOut) -> @location(0) vec4<f32> {
338
+ let orig = textureSampleLevel(base, samp, in.uv, 0.0);
339
+ let glow = max(textureSampleLevel(src, samp, in.uv, 0.0).rgb * u.intensity * u.tint.rgb, vec3<f32>(0.0));
340
+ var lin = vec3<f32>(0.0);
341
+ if (orig.a > 0.0001) {
342
+ lin = srgbToLinear(orig.rgb / orig.a) * orig.a;
343
+ }
344
+ let sum = lin + glow;
345
+ let a = clamp(max(orig.a, max(glow.r, max(glow.g, glow.b))), 0.0, 1.0);
346
+ if (a <= 0.0001) {
347
+ return vec4<f32>(0.0);
348
+ }
349
+ return vec4<f32>(linearToSrgb(sum / a) * a, a);
350
+ }
351
+ `,Zt="rgba16float",ut=class{device;layout;prefilterPipe;downPipe;upPipe;compositePipes=new Map;module;pipelineLayout;sampler;mips=[];mipKey="";placeholder;uniformPool=new GA(48,GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST);constructor(e){this.device=e,this.module=e.createShaderModule({label:"bloom.wgsl",code:Ao}),this.layout=e.createBindGroupLayout({label:"BloomLayout",entries:[{binding:0,visibility:GPUShaderStage.FRAGMENT,buffer:{type:"uniform"}},{binding:1,visibility:GPUShaderStage.FRAGMENT,sampler:{type:"filtering"}},{binding:2,visibility:GPUShaderStage.FRAGMENT,texture:{sampleType:"float"}},{binding:3,visibility:GPUShaderStage.FRAGMENT,texture:{sampleType:"float"}}]}),this.pipelineLayout=e.createPipelineLayout({bindGroupLayouts:[this.layout]});let t=(n,r)=>e.createRenderPipeline({label:`Bloom:${n}`,layout:this.pipelineLayout,vertex:{module:this.module,entryPoint:"vs"},fragment:{module:this.module,entryPoint:n,targets:[{format:Zt,...r&&{blend:{color:{srcFactor:"one",dstFactor:"one",operation:"add"},alpha:{srcFactor:"one",dstFactor:"one",operation:"add"}}}}]},primitive:{topology:"triangle-list"}});this.prefilterPipe=t("fs_prefilter",!1),this.downPipe=t("fs_down",!1),this.upPipe=t("fs_up",!0),this.sampler=e.createSampler({label:"BloomSampler",magFilter:"linear",minFilter:"linear",addressModeU:"clamp-to-edge",addressModeV:"clamp-to-edge"}),this.placeholder=e.createTexture({size:{width:1,height:1},format:Zt,usage:GPUTextureUsage.TEXTURE_BINDING})}compositePipe(e){let t=this.compositePipes.get(e);return t||(t=this.device.createRenderPipeline({label:"Bloom:composite",layout:this.pipelineLayout,vertex:{module:this.module,entryPoint:"vs"},fragment:{module:this.module,entryPoint:"fs_composite",targets:[{format:e}]},primitive:{topology:"triangle-list"}}),this.compositePipes.set(e,t)),t}ensureMips(e,t,n){let r=`${e}x${t}x${n}`;if(r===this.mipKey)return;for(let a of this.mips)a.destroy();this.mips=[];let i=e,o=t;for(let a=0;a<n&&(i=Math.max(1,Math.floor(i/2)),o=Math.max(1,Math.floor(o/2)),this.mips.push(this.device.createTexture({label:`BloomMip${a}`,size:{width:i,height:o},format:Zt,usage:GPUTextureUsage.RENDER_ATTACHMENT|GPUTextureUsage.TEXTURE_BINDING})),!(i===1&&o===1));a++);this.mipKey=r}uniforms(e,t,n){let r=new Float32Array([e,t,n.threshold,n.knee,n.intensity,n.mode,0,0,n.tint[0],n.tint[1],n.tint[2],1]);return this.uniformPool.getBuffer(this.device,r)}pass(e,t,n,r,i,o,a){let s=this.device.createBindGroup({layout:this.layout,entries:[{binding:0,resource:{buffer:o}},{binding:1,resource:this.sampler},{binding:2,resource:r.createView()},{binding:3,resource:i.createView()}]}),g=e.beginRenderPass({colorAttachments:[{view:n,loadOp:a,storeOp:"store",clearValue:{r:0,g:0,b:0,a:0}}]});g.setPipeline(t),g.setBindGroup(0,s),g.draw(3),g.end()}apply(e,t,n,r={},i){let o=!i,a=Q=>Q<=.04045?Q/12.92:((Q+.055)/1.055)**2.4,s=r.threshold??(o?.85:2.5),g={intensity:r.intensity??.2,threshold:o?a(s):s,knee:r.knee??.4,tint:r.tint??[1,1,1],mode:o?1:0},l=Math.max(1,Math.min(8,Math.round(r.radius??6)));this.ensureMips(t.width,t.height,l);let I=this.mips,B=(Q,C)=>this.uniforms(1/Q,1/C,g),E=i??t;this.pass(e,this.prefilterPipe,I[0].createView(),E,this.placeholder,B(E.width,E.height),"clear");for(let Q=1;Q<I.length;Q++){let C=I[Q-1];this.pass(e,this.downPipe,I[Q].createView(),C,this.placeholder,B(C.width,C.height),"clear")}for(let Q=I.length-1;Q>0;Q--){let C=I[Q];this.pass(e,this.upPipe,I[Q-1].createView(),C,this.placeholder,B(C.width,C.height),"load")}this.pass(e,this.compositePipe(n.format),n.createView(),I[0],t,B(I[0].width,I[0].height),"clear")}resetPools(){this.uniformPool.reset()}destroy(){for(let e of this.mips)e.destroy();this.placeholder.destroy(),this.uniformPool.destroy()}};v();v();v();var Be=`
352
+ struct CameraUniforms {
353
+ viewMatrix : mat4x4<f32>,
354
+ projMatrix : mat4x4<f32>,
355
+ viewProjMatrix : mat4x4<f32>,
356
+ invViewProjMatrix : mat4x4<f32>,
357
+ cameraPos : vec4<f32>, // xyz = eye, w = near
358
+ cameraDir : vec4<f32>, // xyz = forward, w = far
359
+ dofParams : vec4<f32>, // x = focusDistance, y = fStop, z = maxBlurRadius, w = dofEnabled
360
+ screenParams : vec4<f32>, // x = surfaceWidth, y = surfaceHeight, z = time, w = unused
361
+ };
362
+
363
+ struct GPULight {
364
+ posType : vec4<f32>, // xyz = position, w = type (0=ambient, 1=directional, 2=point, 3=spot)
365
+ dirRadius : vec4<f32>, // xyz = normalized direction, w = radius / range
366
+ colorIntensity : vec4<f32>, // rgb = sRGB color, w = intensity
367
+ spotParams : vec4<f32>, // x = cos(outer), y = cos(inner), z = decay, w = unused
368
+ };
369
+
370
+ struct LightsUniforms {
371
+ ambientColor : vec4<f32>, // rgb = ambient color * intensity (sRGB), w = unused
372
+ params : vec4<f32>, // x = numLights, y = hasLights, z = physical (1), w = tone mapping (0 none, 1 ACES, 2 AgX, 3 PBR Neutral)
373
+ lights : array<GPULight, 8>,
374
+ // Appended after the original layout so older readers of the prefix still line up.
375
+ ambientLinear : vec4<f32>, // rgb = ambient irradiance (linear), w = exposure multiplier
376
+ envTop : vec4<f32>, // rgb = sky radiance (linear), w = environment rotation (rad)
377
+ envHorizon : vec4<f32>, // rgb = horizon radiance, w = softbox strength
378
+ envBottom : vec4<f32>, // rgb = ground radiance, w = environment enabled
379
+ fog : vec4<f32>, // rgb = fog color (display linear), w = enabled
380
+ fogRange : vec4<f32>, // x = start distance, y = full distance, z = max opacity, w = unused
381
+ shadowParams : vec4<f32>, // x = enabled, y = shadowed light index, z = softness (texels), w = map size
382
+ shadowBias : vec4<f32>, // x = depth bias, y = normal offset (world px), z = darkness 0..1, w = unused
383
+ shadowMatrix : mat4x4<f32>,
384
+ };
385
+
386
+ const PI = 3.14159265359;
387
+
388
+ fn srgbToLinear(c: vec3<f32>) -> vec3<f32> {
389
+ let lo = c / 12.92;
390
+ let hi = pow((max(c, vec3<f32>(0.0)) + 0.055) / 1.055, vec3<f32>(2.4));
391
+ return select(hi, lo, c <= vec3<f32>(0.04045));
392
+ }
393
+
394
+ fn linearToSrgb(c: vec3<f32>) -> vec3<f32> {
395
+ let x = clamp(c, vec3<f32>(0.0), vec3<f32>(1.0));
396
+ let lo = x * 12.92;
397
+ let hi = 1.055 * pow(x, vec3<f32>(1.0 / 2.4)) - 0.055;
398
+ return select(hi, lo, x <= vec3<f32>(0.0031308));
399
+ }
400
+
401
+ // \u2500\u2500 Tone mapping (linear scene \u2192 linear display, 0..1) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500
402
+
403
+ fn rrtAndOdtFit(v: vec3<f32>) -> vec3<f32> {
404
+ let a = v * (v + 0.0245786) - 0.000090537;
405
+ let b = v * (0.983729 * v + 0.4329510) + 0.238081;
406
+ return a / b;
407
+ }
408
+
409
+ // Stephen Hill's fitted ACES (RRT + sRGB ODT).
410
+ fn toneMapAces(c: vec3<f32>) -> vec3<f32> {
411
+ let x = c / 0.6;
412
+ var v = vec3<f32>(
413
+ dot(vec3<f32>(0.59719, 0.35458, 0.04823), x),
414
+ dot(vec3<f32>(0.07600, 0.90834, 0.01566), x),
415
+ dot(vec3<f32>(0.02840, 0.13383, 0.83777), x),
416
+ );
417
+ v = rrtAndOdtFit(v);
418
+ v = vec3<f32>(
419
+ dot(vec3<f32>(1.60475, -0.53108, -0.07367), v),
420
+ dot(vec3<f32>(-0.10208, 1.10813, -0.00605), v),
421
+ dot(vec3<f32>(-0.00327, -0.07276, 1.07602), v),
422
+ );
423
+ return clamp(v, vec3<f32>(0.0), vec3<f32>(1.0));
424
+ }
425
+
426
+ fn agxContrast(x: vec3<f32>) -> vec3<f32> {
427
+ let x2 = x * x;
428
+ let x4 = x2 * x2;
429
+ return 15.5 * x4 * x2 - 40.14 * x4 * x + 31.96 * x4 - 6.868 * x2 * x
430
+ + 0.4298 * x2 + 0.1191 * x - 0.00232;
431
+ }
432
+
433
+ // AgX (Troy Sobotka), base look: graceful highlight roll-off that keeps
434
+ // saturated emissives from clipping to flat primaries.
435
+ fn toneMapAgx(c: vec3<f32>) -> vec3<f32> {
436
+ let inset = mat3x3<f32>(
437
+ 0.842479062253094, 0.0423282422610123, 0.0423756549057051,
438
+ 0.0784335999999992, 0.878468636469772, 0.0784336,
439
+ 0.0792237451477643, 0.0791661274605434, 0.879142973793104,
440
+ );
441
+ let outset = mat3x3<f32>(
442
+ 1.19687900512017, -0.0528968517574562, -0.0529716355144438,
443
+ -0.0980208811401368, 1.15190312990417, -0.0980434501171241,
444
+ -0.0990297440797205, -0.0989611768448433, 1.15107367264116,
445
+ );
446
+ let minEv = -12.47393;
447
+ let maxEv = 4.026069;
448
+ var v = inset * max(c, vec3<f32>(0.0));
449
+ v = clamp(log2(max(v, vec3<f32>(1e-10))), vec3<f32>(minEv), vec3<f32>(maxEv));
450
+ v = (v - minEv) / (maxEv - minEv);
451
+ v = agxContrast(v);
452
+ v = outset * v;
453
+ return clamp(pow(max(v, vec3<f32>(0.0)), vec3<f32>(2.2)), vec3<f32>(0.0), vec3<f32>(1.0));
454
+ }
455
+
456
+ // Khronos PBR Neutral: base colors come out as authored (hue and
457
+ // saturation kept) up to near-white; only highlights are compressed.
458
+ fn toneMapNeutral(cIn: vec3<f32>) -> vec3<f32> {
459
+ let startCompression = 0.8 - 0.04;
460
+ let desaturation = 0.15;
461
+ var c = max(cIn, vec3<f32>(0.0));
462
+ let x = min(c.r, min(c.g, c.b));
463
+ let offset = select(0.04, x - 6.25 * x * x, x < 0.08);
464
+ c = c - offset;
465
+ let peak = max(c.r, max(c.g, c.b));
466
+ if (peak < startCompression) {
467
+ return c;
468
+ }
469
+ let d = 1.0 - startCompression;
470
+ let newPeak = 1.0 - d * d / (peak + d - startCompression);
471
+ c = c * (newPeak / peak);
472
+ let g = 1.0 - 1.0 / (desaturation * (peak - newPeak) + 1.0);
473
+ return mix(c, vec3<f32>(newPeak), g);
474
+ }
475
+
476
+ fn toneMap(c: vec3<f32>) -> vec3<f32> {
477
+ let exposed = c * lights.ambientLinear.w;
478
+ let mode = lights.params.w;
479
+ if (mode > 2.5) {
480
+ return toneMapNeutral(exposed);
481
+ }
482
+ if (mode > 1.5) {
483
+ return toneMapAgx(exposed);
484
+ }
485
+ if (mode > 0.5) {
486
+ return toneMapAces(exposed);
487
+ }
488
+ return clamp(exposed, vec3<f32>(0.0), vec3<f32>(1.0));
489
+ }
490
+
491
+ // \u2500\u2500 Procedural studio environment (image-based light) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500
492
+
493
+ // A rectangular-ish softbox seen from the scene: bright inside its angular
494
+ // radius, blurring out with roughness while keeping roughly the same energy.
495
+ fn softbox(d: vec3<f32>, axis: vec3<f32>, radius: f32, rough: f32) -> f32 {
496
+ let cosA = dot(d, axis);
497
+ let edge = cos(radius + rough * 0.9);
498
+ let width = 0.004 + rough * rough * 0.5;
499
+ let lobe = smoothstep(edge - width, edge + width * 0.25, cosA);
500
+ return lobe / (1.0 + rough * rough * 6.0);
501
+ }
502
+
503
+ /// Radiance arriving from direction d (world space; y points down), as a
504
+ /// surface of the given roughness sees it.
505
+ fn envRadiance(dirIn: vec3<f32>, rough: f32) -> vec3<f32> {
506
+ if (lights.envBottom.w < 0.5) {
507
+ return vec3<f32>(0.0);
508
+ }
509
+ let rot = lights.envTop.w;
510
+ let c = cos(rot);
511
+ let s = sin(rot);
512
+ let d = normalize(vec3<f32>(c * dirIn.x + s * dirIn.z, dirIn.y, -s * dirIn.x + c * dirIn.z));
513
+ let up = -d.y;
514
+ let spread = 0.35 + rough * 0.9;
515
+ let tUp = smoothstep(-0.05, spread, up);
516
+ let tDown = smoothstep(-0.05, spread, -up);
517
+ var col = mix(lights.envHorizon.rgb, lights.envTop.rgb, tUp);
518
+ col = mix(col, lights.envBottom.rgb, tDown);
519
+ let k = lights.envHorizon.w;
520
+ if (k > 0.0) {
521
+ // Key softbox overhead-front-left, a rim strip behind-right, a fill strip left.
522
+ let key = softbox(d, normalize(vec3<f32>(-0.35, -0.85, -0.4)), 0.32, rough);
523
+ let rim = softbox(d, normalize(vec3<f32>(0.75, -0.35, 0.55)), 0.2, rough);
524
+ let fill = softbox(d, normalize(vec3<f32>(-0.92, -0.15, -0.2)), 0.16, rough);
525
+ col += vec3<f32>(k * (key * 1.0 + rim * 0.7 + fill * 0.35));
526
+ }
527
+ return col;
528
+ }
529
+
530
+ // Karis' analytic approximation of the split-sum environment BRDF.
531
+ fn envBrdfApprox(f0: vec3<f32>, rough: f32, nDotV: f32) -> vec3<f32> {
532
+ let c0 = vec4<f32>(-1.0, -0.0275, -0.572, 0.022);
533
+ let c1 = vec4<f32>(1.0, 0.0425, 1.04, -0.04);
534
+ let r = rough * c0 + c1;
535
+ let a004 = min(r.x * r.x, exp2(-9.28 * nDotV)) * r.x + r.y;
536
+ let ab = vec2<f32>(-1.04, 1.04) * a004 + r.zw;
537
+ return f0 * ab.x + ab.y;
538
+ }
539
+
540
+ // \u2500\u2500 Shadows \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500
541
+
542
+ var<private> POISSON : array<vec2<f32>, 12> = array<vec2<f32>, 12>(
543
+ vec2<f32>(-0.326, -0.406), vec2<f32>(-0.840, -0.074), vec2<f32>(-0.696, 0.457),
544
+ vec2<f32>(-0.203, 0.621), vec2<f32>(0.962, -0.195), vec2<f32>(0.473, -0.480),
545
+ vec2<f32>(0.519, 0.767), vec2<f32>(0.185, -0.893), vec2<f32>(0.507, 0.064),
546
+ vec2<f32>(0.896, 0.412), vec2<f32>(-0.322, -0.933), vec2<f32>(-0.792, -0.598),
547
+ );
548
+
549
+ /// 1 = fully lit, 0 = fully shadowed, for light index i.
550
+ fn shadowFactor(worldPos: vec3<f32>, N: vec3<f32>, i: i32) -> f32 {
551
+ if (lights.shadowParams.x < 0.5 || i32(lights.shadowParams.y) != i) {
552
+ return 1.0;
553
+ }
554
+ let p = worldPos + N * lights.shadowBias.y;
555
+ let lp = lights.shadowMatrix * vec4<f32>(p, 1.0);
556
+ let ndc = lp.xyz / lp.w;
557
+ let uv = vec2<f32>(ndc.x * 0.5 + 0.5, 0.5 - ndc.y * 0.5);
558
+ if (lp.w <= 0.0 || uv.x < 0.0 || uv.x > 1.0 || uv.y < 0.0 || uv.y > 1.0 || ndc.z > 1.0) {
559
+ return 1.0;
560
+ }
561
+ let texel = 1.0 / max(lights.shadowParams.w, 1.0);
562
+ let radius = lights.shadowParams.z * texel;
563
+ let depthRef = ndc.z - lights.shadowBias.x;
564
+ var lit = 0.0;
565
+ for (var k = 0; k < 12; k++) {
566
+ lit += textureSampleCompareLevel(shadowMap, shadowSampler, uv + POISSON[k] * radius, depthRef);
567
+ }
568
+ lit = lit / 12.0;
569
+ return mix(1.0, lit, lights.shadowBias.z);
570
+ }
571
+
572
+ // \u2500\u2500 Lights \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500
573
+
574
+ struct LightSample {
575
+ L : vec3<f32>,
576
+ attenuation : f32,
577
+ valid : bool,
578
+ };
579
+
580
+ fn sampleLight(i: i32, worldPos: vec3<f32>) -> LightSample {
581
+ var out = LightSample(vec3<f32>(0.0, 0.0, 1.0), 1.0, false);
582
+ let light = lights.lights[i];
583
+ let lightType = light.posType.w;
584
+ if (lightType > 0.5 && lightType < 1.5) {
585
+ out.L = normalize(-light.dirRadius.xyz);
586
+ out.valid = true;
587
+ return out;
588
+ }
589
+ if (lightType < 1.5) {
590
+ return out;
591
+ }
592
+ let toLight = light.posType.xyz - worldPos;
593
+ let dist = length(toLight);
594
+ let radius = max(1.0, light.dirRadius.w);
595
+ if (dist > radius) {
596
+ return out;
597
+ }
598
+ out.L = normalize(toLight);
599
+ let dNorm = clamp(dist / radius, 0.0, 1.0);
600
+ let decay = max(0.5, light.spotParams.z);
601
+ out.attenuation = pow(clamp(1.0 - dNorm, 0.0, 1.0), decay);
602
+ if (lightType > 2.5) {
603
+ let spotDir = normalize(light.dirRadius.xyz);
604
+ let cosAngle = dot(-out.L, spotDir);
605
+ if (cosAngle < light.spotParams.x) {
606
+ return out;
607
+ }
608
+ out.attenuation *= smoothstep(light.spotParams.x, light.spotParams.y, cosAngle);
609
+ }
610
+ out.valid = true;
611
+ return out;
612
+ }
613
+
614
+ // Blinn-Phong in display space: the original look, plus shadows when a
615
+ // light casts them.
616
+ fn applyLighting3D(worldPos: vec3<f32>, worldNormal: vec3<f32>, baseColor: vec3<f32>, material: vec4<f32>) -> vec3<f32> {
617
+ if (lights.params.y < 0.5 || material.w < 0.5) {
618
+ return baseColor;
619
+ }
620
+ var N = normalize(worldNormal);
621
+ let V = normalize(cam.cameraPos.xyz - worldPos);
622
+ if (dot(N, V) < 0.0) {
623
+ N = -N;
624
+ }
625
+ let shininess = max(1.0, material.x);
626
+ let specularInt = material.y;
627
+ let ambientInt = material.z;
628
+
629
+ var totalIllumination = baseColor * (lights.ambientColor.rgb * ambientInt);
630
+ let numLights = i32(lights.params.x);
631
+ for (var i = 0; i < 8; i++) {
632
+ if (i >= numLights) {
633
+ break;
634
+ }
635
+ let ls = sampleLight(i, worldPos);
636
+ if (!ls.valid) {
637
+ continue;
638
+ }
639
+ let light = lights.lights[i];
640
+ let lightColor = light.colorIntensity.rgb;
641
+ let intensity = light.colorIntensity.w;
642
+ let NdotL = max(dot(N, ls.L), 0.0);
643
+ let diffuse = baseColor * lightColor * (NdotL * intensity * ls.attenuation);
644
+ var specular = vec3<f32>(0.0);
645
+ if (NdotL > 0.0 && specularInt > 0.001) {
646
+ let H = normalize(ls.L + V);
647
+ let NdotH = max(dot(N, H), 0.0);
648
+ specular = lightColor * (pow(NdotH, shininess) * specularInt * intensity * ls.attenuation);
649
+ }
650
+ totalIllumination += (diffuse + specular) * shadowFactor(worldPos, N, i);
651
+ }
652
+ return totalIllumination;
653
+ }
654
+
655
+ // GGX / Smith-correlated / Schlick, image-based light from envRadiance.
656
+ // Returns linear scene radiance (unbounded).
657
+ fn shadePhysical(worldPos: vec3<f32>, worldNormal: vec3<f32>, albedo: vec3<f32>, rough: f32, metal: f32, ambientInt: f32) -> vec3<f32> {
658
+ var N = normalize(worldNormal);
659
+ let V = normalize(cam.cameraPos.xyz - worldPos);
660
+ if (dot(N, V) < 0.0) {
661
+ N = -N;
662
+ }
663
+ let nDotV = max(dot(N, V), 1e-4);
664
+ let r = clamp(rough, 0.03, 1.0);
665
+ let a = r * r;
666
+ let a2 = a * a;
667
+ let f0 = mix(vec3<f32>(0.04), albedo, metal);
668
+ let diffuseColor = albedo * (1.0 - metal);
669
+
670
+ var lo = vec3<f32>(0.0);
671
+ let numLights = i32(lights.params.x);
672
+ for (var i = 0; i < 8; i++) {
673
+ if (i >= numLights) {
674
+ break;
675
+ }
676
+ let ls = sampleLight(i, worldPos);
677
+ if (!ls.valid) {
678
+ continue;
679
+ }
680
+ let light = lights.lights[i];
681
+ let nDotL = max(dot(N, ls.L), 0.0);
682
+ if (nDotL <= 0.0) {
683
+ continue;
684
+ }
685
+ let H = normalize(ls.L + V);
686
+ let nDotH = max(dot(N, H), 0.0);
687
+ let vDotH = max(dot(V, H), 0.0);
688
+ let dDen = nDotH * nDotH * (a2 - 1.0) + 1.0;
689
+ let D = a2 / (PI * dDen * dDen);
690
+ let gv = nDotL * sqrt(nDotV * nDotV * (1.0 - a2) + a2);
691
+ let gl = nDotV * sqrt(nDotL * nDotL * (1.0 - a2) + a2);
692
+ let Vis = 0.5 / max(gv + gl, 1e-5);
693
+ let F = f0 + (vec3<f32>(1.0) - f0) * pow(1.0 - vDotH, 5.0);
694
+ let spec = D * Vis * F;
695
+ let diff = (vec3<f32>(1.0) - F) * diffuseColor / PI;
696
+ // x PI so a white light of intensity 1 lights a white wall about as
697
+ // brightly as the legacy shading does.
698
+ let radiance = srgbToLinear(light.colorIntensity.rgb) * light.colorIntensity.w * ls.attenuation * PI;
699
+ lo += (diff + spec) * radiance * nDotL * shadowFactor(worldPos, N, i);
700
+ }
701
+
702
+ let R = reflect(-V, N);
703
+ let irradiance = envRadiance(N, 1.0) + lights.ambientLinear.rgb;
704
+ let specEnv = envRadiance(R, r) * envBrdfApprox(f0, r, nDotV);
705
+ lo += (diffuseColor * irradiance + specEnv) * ambientInt;
706
+ return lo;
707
+ }
708
+
709
+ struct Shaded {
710
+ /** Display-encoded (sRGB) color for the color target. */
711
+ display : vec3<f32>,
712
+ /** Unclamped scene-referred linear radiance, for the bloom target. */
713
+ hdr : vec3<f32>,
714
+ };
715
+
716
+ /// Shades a surface for the scene's mode.
717
+ /// material: x shininess, y specularIntensity, z ambientIntensity, w mode (0 unlit).
718
+ /// pbr: x roughness (<0 = default), y metallic, z/w unused.
719
+ /// emissive: rgb sRGB color, w strength.
720
+ fn shadeSurfaceFull(worldPos: vec3<f32>, worldNormal: vec3<f32>, baseColor: vec3<f32>, material: vec4<f32>, pbr: vec4<f32>, emissive: vec4<f32>) -> Shaded {
721
+ var out: Shaded;
722
+ if (lights.params.z < 0.5) {
723
+ var c = baseColor;
724
+ if (material.w >= 0.5) {
725
+ c = applyLighting3D(worldPos, worldNormal, baseColor, material);
726
+ }
727
+ c += emissive.rgb * emissive.w;
728
+ out.display = c;
729
+ out.hdr = srgbToLinear(clamp(c, vec3<f32>(0.0), vec3<f32>(1.0))) * max(max(c.r, max(c.g, c.b)), 1.0);
730
+ return out;
731
+ }
732
+ var radiance: vec3<f32>;
733
+ if (material.w < 0.5) {
734
+ radiance = srgbToLinear(baseColor);
735
+ } else {
736
+ let rough = select(pbr.x, 0.5, pbr.x < 0.0);
737
+ radiance = shadePhysical(worldPos, worldNormal, srgbToLinear(baseColor), rough, clamp(pbr.y, 0.0, 1.0), material.z);
738
+ }
739
+ radiance += srgbToLinear(emissive.rgb) * emissive.w;
740
+ var display: vec3<f32>;
741
+ if (material.w < 0.5) {
742
+ // Unlit layers keep their exact authored colors.
743
+ display = clamp(radiance, vec3<f32>(0.0), vec3<f32>(1.0));
744
+ } else {
745
+ display = toneMap(radiance);
746
+ }
747
+ var hdr = radiance * lights.ambientLinear.w;
748
+ if (lights.fog.w > 0.5) {
749
+ let dist = distance(worldPos, cam.cameraPos.xyz);
750
+ let f = smoothstep(lights.fogRange.x, max(lights.fogRange.y, lights.fogRange.x + 1.0), dist) * lights.fogRange.z;
751
+ display = mix(display, lights.fog.rgb, f);
752
+ hdr = hdr * (1.0 - f);
753
+ }
754
+ out.display = linearToSrgb(display);
755
+ out.hdr = hdr;
756
+ return out;
757
+ }
758
+
759
+ fn shadeSurface(worldPos: vec3<f32>, worldNormal: vec3<f32>, baseColor: vec3<f32>, material: vec4<f32>, pbr: vec4<f32>, emissive: vec4<f32>) -> vec3<f32> {
760
+ return shadeSurfaceFull(worldPos, worldNormal, baseColor, material, pbr, emissive).display;
761
+ }
762
+ `,Ee=`
763
+ @group(3) @binding(0) var<uniform> lights : LightsUniforms;
764
+ @group(3) @binding(1) var shadowMap : texture_depth_2d;
765
+ @group(3) @binding(2) var shadowSampler : sampler_comparison;
766
+ `;v();function Qe(A,e){return`
767
+ @group(${A}) @binding(${e}) var matteTex : texture_2d<f32>;
768
+
769
+ fn matteCoverage(fragPos : vec2<f32>) -> f32 {
770
+ let dims = vec2<f32>(textureDimensions(matteTex));
771
+ let p = floor(fragPos * dims / max(cam.screenParams.xy, vec2<f32>(1.0)));
772
+ return textureLoad(matteTex, vec2<i32>(clamp(p, vec2<f32>(0.0), dims - 1.0)), 0).a;
773
+ }
774
+ `}var ur=`
775
+ ${Be}
776
+
777
+ struct ModelUniforms {
778
+ modelMatrix : mat4x4<f32>,
779
+ normalMatrix : mat4x4<f32>,
780
+ colorTint : vec4<f32>,
781
+ params : vec4<f32>, // x = opacity, y = twoSided (1.0 = yes), z = isSkinned (1.0 = yes), w = wireframe
782
+ materialParams : vec4<f32>, // x = shininess, y = specularIntensity, z = ambientIntensity, w = materialMode (0=unlit, 1=lit, 2=toon)
783
+ shade : vec4<f32>, // rgb = toon shadow-side color multiplier, a = alpha cutoff (0 = none)
784
+ pbr : vec4<f32>, // x = roughness (<0 = default), y = metallic
785
+ emissive : vec4<f32>, // rgb = sRGB emissive color, w = strength
786
+ maps : vec4<f32>, // x = normal scale (0 = no map), y = occlusion strength, z = has metallic-roughness map, w = has emissive map
787
+ };
788
+
789
+ struct SkinningUniforms {
790
+ jointMatrices : array<mat4x4<f32>, 128>,
791
+ };
792
+
793
+ @group(0) @binding(0) var<uniform> cam : CameraUniforms;
794
+ @group(1) @binding(0) var<uniform> model : ModelUniforms;
795
+ @group(1) @binding(1) var<uniform> skinning : SkinningUniforms;
796
+ ${Qe(1,2)}@group(2) @binding(0) var texSampler : sampler;
797
+ @group(2) @binding(1) var mainTex : texture_2d<f32>;
798
+ @group(2) @binding(2) var normalTex : texture_2d<f32>;
799
+ @group(2) @binding(3) var metalRoughTex : texture_2d<f32>;
800
+ @group(2) @binding(4) var occlusionTex : texture_2d<f32>;
801
+ @group(2) @binding(5) var emissiveTex : texture_2d<f32>;
802
+ ${Ee}
803
+
804
+ struct VertexInput {
805
+ @location(0) position : vec3<f32>,
806
+ @location(1) uv : vec2<f32>,
807
+ @location(2) normal : vec3<f32>,
808
+ @location(3) joints : vec4<f32>,
809
+ @location(4) weights : vec4<f32>,
810
+ };
811
+
812
+ struct VertexOutput {
813
+ @builtin(position) clipPos : vec4<f32>,
814
+ @location(0) uv : vec2<f32>,
815
+ @location(1) worldPos : vec3<f32>,
816
+ @location(2) worldNormal : vec3<f32>,
817
+ @location(3) linearDepth : f32,
818
+ };
819
+
820
+ @vertex
821
+ fn vs_main(in: VertexInput) -> VertexOutput {
822
+ var out: VertexOutput;
823
+
824
+ var localPos = in.position;
825
+ var localNorm = in.normal;
826
+
827
+ // Linear Blend Skinning (LBS) on GPU
828
+ if (model.params.z > 0.5) {
829
+ let j0 = i32(in.joints.x);
830
+ let j1 = i32(in.joints.y);
831
+ let j2 = i32(in.joints.z);
832
+ let j3 = i32(in.joints.w);
833
+
834
+ let w0 = in.weights.x;
835
+ let w1 = in.weights.y;
836
+ let w2 = in.weights.z;
837
+ let w3 = in.weights.w;
838
+
839
+ let totalWeight = w0 + w1 + w2 + w3;
840
+ if (totalWeight > 0.001) {
841
+ let skinMat = skinning.jointMatrices[j0] * w0 +
842
+ skinning.jointMatrices[j1] * w1 +
843
+ skinning.jointMatrices[j2] * w2 +
844
+ skinning.jointMatrices[j3] * w3;
845
+
846
+ let pos4 = skinMat * vec4<f32>(in.position, 1.0);
847
+ localPos = pos4.xyz;
848
+
849
+ let norm4 = skinMat * vec4<f32>(in.normal, 0.0);
850
+ localNorm = normalize(norm4.xyz);
851
+ }
852
+ }
853
+
854
+ let worldPos4 = model.modelMatrix * vec4<f32>(localPos, 1.0);
855
+ out.worldPos = worldPos4.xyz;
856
+
857
+ let norm4 = model.normalMatrix * vec4<f32>(localNorm, 0.0);
858
+ out.worldNormal = normalize(norm4.xyz);
859
+
860
+ out.clipPos = cam.viewProjMatrix * worldPos4;
861
+ out.uv = in.uv;
862
+
863
+ out.linearDepth = dot(worldPos4.xyz - cam.cameraPos.xyz, cam.cameraDir.xyz);
864
+ return out;
865
+ }
866
+
867
+ // Toon (MToon-style): the base color as authored where the light reaches,
868
+ // the shade color past a soft terminator. Highlights stay out: the texture
869
+ // already paints them.
870
+ fn toonLighting(in: VertexOutput, baseColor: vec3<f32>) -> vec3<f32> {
871
+ var N = normalize(in.worldNormal);
872
+ let V = normalize(cam.cameraPos.xyz - in.worldPos);
873
+ if (dot(N, V) < 0.0) {
874
+ N = -N;
875
+ }
876
+ var lit = 0.0;
877
+ let numLights = i32(lights.params.x);
878
+ for (var i = 0; i < 8; i++) {
879
+ if (i >= numLights) {
880
+ break;
881
+ }
882
+ let light = lights.lights[i];
883
+ let lightType = light.posType.w;
884
+ var L = vec3<f32>(0.0, 0.0, 1.0);
885
+ if (lightType > 0.5 && lightType < 1.5) {
886
+ L = normalize(-light.dirRadius.xyz);
887
+ } else if (lightType >= 1.5) {
888
+ L = normalize(light.posType.xyz - in.worldPos);
889
+ } else {
890
+ continue;
891
+ }
892
+ let terminator = smoothstep(-0.05, 0.2, dot(N, L));
893
+ lit = max(lit, terminator * min(light.colorIntensity.w, 1.0));
894
+ }
895
+ return baseColor * mix(model.shade.rgb, vec3<f32>(1.0), lit);
896
+ }
897
+
898
+ struct MeshFragment {
899
+ color : vec4<f32>, // premultiplied display color
900
+ hdr : vec4<f32>, // premultiplied scene radiance (bloom source)
901
+ };
902
+
903
+ // Normal mapping without tangents: a cotangent frame from screen-space
904
+ // derivatives (Sch\xFCler, "Followup: Normal Mapping Without Precomputed Tangents").
905
+ fn perturbNormal(N: vec3<f32>, p: vec3<f32>, uv: vec2<f32>, tn: vec3<f32>, dp1: vec3<f32>, dp2: vec3<f32>, duv1: vec2<f32>, duv2: vec2<f32>) -> vec3<f32> {
906
+ let dp2perp = cross(dp2, N);
907
+ let dp1perp = cross(N, dp1);
908
+ // The derivation assumes cross(dp1, dp2) points along N; with this
909
+ // engine's y-down view basis it can point away, mirroring the frame.
910
+ let handed = select(1.0, -1.0, dot(cross(dp1, dp2), N) < 0.0);
911
+ let T = (dp2perp * duv1.x + dp1perp * duv2.x) * handed;
912
+ let B = (dp2perp * duv1.y + dp1perp * duv2.y) * handed;
913
+ let invmax = inverseSqrt(max(max(dot(T, T), dot(B, B)), 1e-20));
914
+ // glTF maps are +Y up while v grows down the image: green points along -B.
915
+ return normalize(T * (tn.x * invmax) - B * (tn.y * invmax) + N * tn.z);
916
+ }
917
+
918
+ fn shadeMesh(in: VertexOutput, isFront: bool) -> MeshFragment {
919
+ // Every sample and derivative up front, in uniform control flow.
920
+ var texColor = textureSample(mainTex, texSampler, in.uv);
921
+ let normalSample = textureSample(normalTex, texSampler, in.uv).xyz;
922
+ let mrSample = textureSample(metalRoughTex, texSampler, in.uv);
923
+ let aoSample = textureSample(occlusionTex, texSampler, in.uv).r;
924
+ let emissiveSample = textureSample(emissiveTex, texSampler, in.uv).rgb;
925
+ let dp1 = dpdx(in.worldPos);
926
+ let dp2 = dpdy(in.worldPos);
927
+ let duv1 = dpdx(in.uv);
928
+ let duv2 = dpdy(in.uv);
929
+
930
+ if (!isFront && model.params.y < 0.5) {
931
+ discard;
932
+ }
933
+ if (texColor.a < model.shade.a) {
934
+ discard;
935
+ }
936
+ let alpha = texColor.a * model.params.x * model.colorTint.a * matteCoverage(in.clipPos.xy);
937
+ if (alpha <= 0.001) {
938
+ discard;
939
+ }
940
+
941
+ let baseRgb = texColor.rgb * model.colorTint.rgb;
942
+ var out: MeshFragment;
943
+ if (model.materialParams.w > 1.5) {
944
+ var toon = baseRgb;
945
+ if (lights.params.y >= 0.5) {
946
+ toon = toonLighting(in, baseRgb);
947
+ }
948
+ out.color = vec4<f32>(toon * alpha, alpha);
949
+ out.hdr = vec4<f32>(srgbToLinear(toon) * alpha, alpha);
950
+ return out;
951
+ }
952
+
953
+ var N = normalize(in.worldNormal);
954
+ if (model.maps.x > 0.0) {
955
+ var tn = normalSample * 2.0 - 1.0;
956
+ tn = vec3<f32>(tn.xy * model.maps.x, tn.z);
957
+ // The frame follows the surface side the camera sees.
958
+ var Nf = N;
959
+ if (dot(Nf, cam.cameraPos.xyz - in.worldPos) < 0.0) {
960
+ Nf = -Nf;
961
+ }
962
+ N = perturbNormal(Nf, in.worldPos, in.uv, tn, dp1, dp2, duv1, duv2);
963
+ }
964
+ var pbr = model.pbr;
965
+ if (model.maps.z > 0.5) {
966
+ pbr.x = select(pbr.x, 1.0, pbr.x < 0.0) * mrSample.g;
967
+ pbr.y = pbr.y * mrSample.b;
968
+ }
969
+ var material = model.materialParams;
970
+ material.z = material.z * mix(1.0, aoSample, clamp(model.maps.y, 0.0, 1.0));
971
+ var emissive = model.emissive;
972
+ if (model.maps.w > 0.5) {
973
+ // Linear multiply in display space is close enough for an 8-bit map.
974
+ emissive = vec4<f32>(emissive.rgb * emissiveSample, emissive.w);
975
+ }
976
+ let shaded = shadeSurfaceFull(in.worldPos, N, baseRgb, material, pbr, emissive);
977
+ out.color = vec4<f32>(shaded.display * alpha, alpha);
978
+ out.hdr = vec4<f32>(shaded.hdr * alpha, alpha);
979
+ return out;
980
+ }
981
+
982
+ struct MrtOutput {
983
+ @location(0) color : vec4<f32>,
984
+ @location(1) depth : vec4<f32>,
985
+ };
986
+
987
+ struct BloomOutput {
988
+ @location(0) color : vec4<f32>,
989
+ @location(1) hdr : vec4<f32>,
990
+ };
991
+
992
+ struct MrtBloomOutput {
993
+ @location(0) color : vec4<f32>,
994
+ @location(1) depth : vec4<f32>,
995
+ @location(2) hdr : vec4<f32>,
996
+ };
997
+
998
+ @fragment
999
+ fn fs_single(in: VertexOutput, @builtin(front_facing) isFront: bool) -> @location(0) vec4<f32> {
1000
+ return shadeMesh(in, isFront).color;
1001
+ }
1002
+
1003
+ @fragment
1004
+ fn fs_mrt(in: VertexOutput, @builtin(front_facing) isFront: bool) -> MrtOutput {
1005
+ var out: MrtOutput;
1006
+ out.color = shadeMesh(in, isFront).color;
1007
+ out.depth = vec4<f32>(in.linearDepth, 0.0, 0.0, 1.0);
1008
+ return out;
1009
+ }
1010
+
1011
+ @fragment
1012
+ fn fs_single_bloom(in: VertexOutput, @builtin(front_facing) isFront: bool) -> BloomOutput {
1013
+ let f = shadeMesh(in, isFront);
1014
+ var out: BloomOutput;
1015
+ out.color = f.color;
1016
+ out.hdr = f.hdr;
1017
+ return out;
1018
+ }
1019
+
1020
+ @fragment
1021
+ fn fs_mrt_bloom(in: VertexOutput, @builtin(front_facing) isFront: bool) -> MrtBloomOutput {
1022
+ let f = shadeMesh(in, isFront);
1023
+ var out: MrtBloomOutput;
1024
+ out.color = f.color;
1025
+ out.depth = vec4<f32>(in.linearDepth, 0.0, 0.0, 1.0);
1026
+ out.hdr = f.hdr;
1027
+ return out;
1028
+ }
1029
+ `;v();function Ce(A){return{binding:A,visibility:GPUShaderStage.FRAGMENT,texture:{sampleType:"float"}}}var cr=new WeakMap;function fe(A){let e=cr.get(A);if(!e){let t=A.createTexture({label:"Matte3DFullCoverage",size:[1,1],format:"rgba8unorm",usage:GPUTextureUsage.TEXTURE_BINDING|GPUTextureUsage.COPY_DST});A.queue.writeTexture({texture:t},new Uint8Array([255,255,255,255]),{bytesPerRow:4},[1,1]),e=t.createView(),cr.set(A,e)}return e}v();var Br="rgba16float",eo="rgba16float";function de(A,e){let t=n=>A.createRenderPipeline({label:`${e.label}${n?"Mrt":"Single"}`,layout:e.layout,vertex:e.vertex,fragment:{module:e.module,entryPoint:n?"fs_mrt":"fs_single",targets:[{format:e.format,blend:tt},...n?[{format:Br}]:[]]},depthStencil:e.depthStencil,primitive:e.primitive,multisample:e.multisample});return{single:t(!1),mrt:t(!0)}}var ne=class{constructor(e,t){this.device=e;this.base=t}device;base;cache=new Map;get(e){let t=this.cache.get(e);if(!t){let n=this.base;t=this.device.createRenderPipeline({label:`${n.label}${e?"MrtBloom":"Bloom"}`,layout:n.layout,vertex:n.vertex,fragment:{module:n.module,entryPoint:e?"fs_mrt_bloom":"fs_single_bloom",targets:[{format:n.format,blend:tt},...e?[{format:Br}]:[],{format:eo,blend:tt}]},depthStencil:n.depthStencil,primitive:n.primitive,multisample:n.multisample}),this.cache.set(e,t)}return t}};function ct(A,e,t,n){let r=t??e,i=n??[1,1,1,1];for(let o=0;o<16;o++)A[o]=e[o]??0,A[16+o]=r[o]??0;A[32]=i[0],A[33]=i[1],A[34]=i[2],A[35]=i[3]}v();v();var Er=`
1030
+ ${Be}
1031
+ struct ModelUniforms {
1032
+ modelMatrix : mat4x4<f32>,
1033
+ normalMatrix : mat4x4<f32>,
1034
+ colorTint : vec4<f32>,
1035
+ borderColor : vec4<f32>,
1036
+ params : vec4<f32>, // x = opacity, y = borderRadius, z = twoSided (1.0 = yes), w = borderWidth
1037
+ dimensions : vec4<f32>, // x = width, y = height, zw = texture extent the layer covers (0 = whole texture)
1038
+ materialParams : vec4<f32>, // x = shininess, y = specularIntensity, z = ambientIntensity, w = materialMode (0=unlit, 1=lit)
1039
+ pbr : vec4<f32>, // x = roughness (<0 = default), y = metallic
1040
+ emissive : vec4<f32>, // rgb = sRGB emissive color, w = strength
1041
+ };
1042
+
1043
+ @group(0) @binding(0) var<uniform> cam : CameraUniforms;
1044
+ @group(1) @binding(0) var<uniform> model : ModelUniforms;
1045
+ ${Qe(1,1)}@group(2) @binding(0) var texSampler : sampler;
1046
+ @group(2) @binding(1) var mainTex : texture_2d<f32>;
1047
+ ${Ee}
1048
+
1049
+ struct VertexInput {
1050
+ @location(0) position : vec3<f32>,
1051
+ @location(1) uv : vec2<f32>,
1052
+ @location(2) normal : vec3<f32>,
1053
+ };
1054
+
1055
+ struct VertexOutput {
1056
+ @builtin(position) clipPos : vec4<f32>,
1057
+ @location(0) uv : vec2<f32>,
1058
+ @location(1) worldPos : vec3<f32>,
1059
+ @location(2) worldNormal : vec3<f32>,
1060
+ @location(3) linearDepth : f32,
1061
+ @location(4) localPos : vec2<f32>,
1062
+ };
1063
+
1064
+ @vertex
1065
+ fn vs_main(in: VertexInput) -> VertexOutput {
1066
+ var out: VertexOutput;
1067
+
1068
+ let hasDimensions = model.dimensions.x > 0.0 && model.dimensions.y > 0.0;
1069
+ var pad = 0.0;
1070
+ if (hasDimensions) {
1071
+ let viewPos = cam.viewMatrix * model.modelMatrix * vec4<f32>(0.0, 0.0, 0.0, 1.0);
1072
+ let viewDepth = max(abs(viewPos.z), 0.1);
1073
+ let projScale = max(cam.projMatrix[1][1], 0.001);
1074
+ let worldPx = (2.0 * viewDepth) / max(cam.screenParams.y * projScale, 0.001);
1075
+ pad = max(4.0 * worldPx, 4.0);
1076
+ }
1077
+ let scalePad = select(vec2<f32>(1.0), 1.0 + vec2<f32>(2.0 * pad) / model.dimensions.xy, hasDimensions);
1078
+
1079
+ let paddedPos = vec3<f32>(in.position.xy * scalePad, in.position.z);
1080
+ let worldPos4 = model.modelMatrix * vec4<f32>(paddedPos, 1.0);
1081
+ out.worldPos = worldPos4.xyz;
1082
+
1083
+ // Normal transformed by 3x3 normal matrix
1084
+ let norm4 = model.normalMatrix * vec4<f32>(in.normal, 0.0);
1085
+ out.worldNormal = normalize(norm4.xyz);
1086
+
1087
+ out.clipPos = cam.viewProjMatrix * worldPos4;
1088
+
1089
+ out.localPos = in.position.xy * (model.dimensions.xy + vec2<f32>(2.0 * pad));
1090
+ // A layer of fractional size renders into a texture rounded up to whole
1091
+ // pixels: map the quad onto the part it covers, not the whole texture,
1092
+ // or the content is stretched by up to a pixel and resampled off-grid.
1093
+ let uvExtent = select(model.dimensions.zw, vec2<f32>(1.0), model.dimensions.zw <= vec2<f32>(0.0));
1094
+ out.uv = select(in.uv, (out.localPos / model.dimensions.xy + vec2<f32>(0.5)) * uvExtent, hasDimensions);
1095
+
1096
+ // Linear camera depth along optical viewing axis
1097
+ out.linearDepth = dot(worldPos4.xyz - cam.cameraPos.xyz, cam.cameraDir.xyz);
1098
+ return out;
1099
+ }
1100
+
1101
+ fn sdRoundedRectWithNormal(p: vec2<f32>, b: vec2<f32>, r: f32) -> vec3<f32> {
1102
+ let q = abs(p) - b + vec2<f32>(r);
1103
+ let sx = select(1.0, -1.0, p.x < 0.0);
1104
+ let sy = select(1.0, -1.0, p.y < 0.0);
1105
+ let s = vec2<f32>(sx, sy);
1106
+
1107
+ // Outside corner arc region
1108
+ if (q.x > 0.0 && q.y > 0.0) {
1109
+ let l = length(q);
1110
+ let n = select(vec2<f32>(0.0, 1.0), q / l, l > 0.0001);
1111
+ return vec3<f32>(l - r, s * n);
1112
+ }
1113
+
1114
+ // Straight edges or interior
1115
+ if (q.x > q.y) {
1116
+ let dist = q.x - r;
1117
+ return vec3<f32>(dist, s.x, 0.0);
1118
+ } else {
1119
+ let dist = q.y - r;
1120
+ return vec3<f32>(dist, 0.0, s.y);
1121
+ }
1122
+ }
1123
+
1124
+ struct QuadFragment {
1125
+ color : vec4<f32>, // premultiplied display color
1126
+ hdr : vec4<f32>, // premultiplied scene radiance (bloom source)
1127
+ };
1128
+
1129
+ fn shadeQuad(in: VertexOutput, isFront: bool) -> QuadFragment {
1130
+ // One-sided quads cull against their declared normal, not the hardware
1131
+ // winding: the Y-down view basis mirrors winding, so front_facing reads
1132
+ // camera-facing quads as back faces.
1133
+ if (model.params.z < 0.5 && dot(in.worldNormal, cam.cameraPos.xyz - in.worldPos) < 0.0) {
1134
+ discard;
1135
+ }
1136
+
1137
+ var outerAlpha = 1.0;
1138
+ var borderFactor = 0.0;
1139
+ let br = model.params.y;
1140
+ let borderWidth = model.params.w;
1141
+ let hasDimensions = model.dimensions.x > 0.0 && model.dimensions.y > 0.0;
1142
+
1143
+ if (hasDimensions) {
1144
+ let halfSize = model.dimensions.xy * 0.5;
1145
+ let normData = sdRoundedRectWithNormal(in.localPos, halfSize, br);
1146
+
1147
+ let uvDx = dpdx(in.localPos);
1148
+ let uvDy = dpdy(in.localPos);
1149
+
1150
+ let dPdx = normData.y * uvDx.x + normData.z * uvDx.y;
1151
+ let dPdy = normData.y * uvDy.x + normData.z * uvDy.y;
1152
+ let gradLen = max(sqrt(dPdx * dPdx + dPdy * dPdy), 0.001);
1153
+
1154
+ let distPixel = normData.x / gradLen;
1155
+ outerAlpha = clamp(0.5 - distPixel, 0.0, 1.0);
1156
+ if (outerAlpha <= 0.001) {
1157
+ discard;
1158
+ }
1159
+
1160
+ if (borderWidth > 0.0 && model.borderColor.a > 0.0) {
1161
+ let borderWidthPixel = max(borderWidth / gradLen, 0.0);
1162
+ let innerAlpha = clamp(0.5 - (distPixel + borderWidthPixel), 0.0, 1.0);
1163
+ borderFactor = clamp(outerAlpha - innerAlpha, 0.0, 1.0) * model.borderColor.a;
1164
+ }
1165
+ }
1166
+
1167
+ let clampedUv = clamp(in.uv, vec2<f32>(0.0), vec2<f32>(1.0));
1168
+ let dxUV = dpdx(in.uv);
1169
+ let dyUV = dpdy(in.uv);
1170
+ var texColor = textureSampleGrad(mainTex, texSampler, clampedUv, dxUV, dyUV);
1171
+ let texAlpha = texColor.a;
1172
+
1173
+ let unmultipliedRgb = select(texColor.rgb / texAlpha, texColor.rgb, texAlpha < 0.001);
1174
+ let baseRgb = mix(unmultipliedRgb * model.colorTint.rgb, model.borderColor.rgb, borderFactor);
1175
+ let alpha = mix(texAlpha, 1.0, borderFactor) * model.params.x * model.colorTint.a * outerAlpha * matteCoverage(in.clipPos.xy);
1176
+ if (alpha <= 0.001) {
1177
+ discard;
1178
+ }
1179
+
1180
+ let shaded = shadeSurfaceFull(in.worldPos, in.worldNormal, baseRgb, model.materialParams, model.pbr, model.emissive);
1181
+ var out: QuadFragment;
1182
+ out.color = vec4<f32>(shaded.display * alpha, alpha);
1183
+ out.hdr = vec4<f32>(shaded.hdr * alpha, alpha);
1184
+ return out;
1185
+ }
1186
+
1187
+ struct MrtOutput {
1188
+ @location(0) color : vec4<f32>,
1189
+ @location(1) depth : vec4<f32>,
1190
+ };
1191
+
1192
+ struct BloomOutput {
1193
+ @location(0) color : vec4<f32>,
1194
+ @location(1) hdr : vec4<f32>,
1195
+ };
1196
+
1197
+ struct MrtBloomOutput {
1198
+ @location(0) color : vec4<f32>,
1199
+ @location(1) depth : vec4<f32>,
1200
+ @location(2) hdr : vec4<f32>,
1201
+ };
1202
+
1203
+ @fragment
1204
+ fn fs_single(in: VertexOutput, @builtin(front_facing) isFront: bool) -> @location(0) vec4<f32> {
1205
+ return shadeQuad(in, isFront).color;
1206
+ }
1207
+
1208
+ @fragment
1209
+ fn fs_mrt(in: VertexOutput, @builtin(front_facing) isFront: bool) -> MrtOutput {
1210
+ var out: MrtOutput;
1211
+ out.color = shadeQuad(in, isFront).color;
1212
+ out.depth = vec4<f32>(in.linearDepth, 0.0, 0.0, 1.0);
1213
+ return out;
1214
+ }
1215
+
1216
+ @fragment
1217
+ fn fs_single_bloom(in: VertexOutput, @builtin(front_facing) isFront: bool) -> BloomOutput {
1218
+ let f = shadeQuad(in, isFront);
1219
+ var out: BloomOutput;
1220
+ out.color = f.color;
1221
+ out.hdr = f.hdr;
1222
+ return out;
1223
+ }
1224
+
1225
+ @fragment
1226
+ fn fs_mrt_bloom(in: VertexOutput, @builtin(front_facing) isFront: bool) -> MrtBloomOutput {
1227
+ let f = shadeQuad(in, isFront);
1228
+ var out: MrtBloomOutput;
1229
+ out.color = f.color;
1230
+ out.depth = vec4<f32>(in.linearDepth, 0.0, 0.0, 1.0);
1231
+ out.hdr = f.hdr;
1232
+ return out;
1233
+ }
1234
+
1235
+ // Shadow-map pass: depth only, alpha-tested so a cut-out casts its shape.
1236
+ @fragment
1237
+ fn fs_shadow(in: VertexOutput) {
1238
+ let clampedUv = clamp(in.uv, vec2<f32>(0.0), vec2<f32>(1.0));
1239
+ let a = textureSampleLevel(mainTex, texSampler, clampedUv, 0.0).a * model.params.x * model.colorTint.a;
1240
+ if (a < 0.5) {
1241
+ discard;
1242
+ }
1243
+ }
1244
+ `;v();var Bt="depth32float",Et={format:Bt,depthWriteEnabled:!0,depthCompare:"less-equal",depthBias:2,depthBiasSlopeScale:2.5,depthBiasClamp:.01};v();var _A=8;function me(A,e,t){e[t]=A.roughness??-1,e[t+1]=A.metallic??0,e[t+2]=0,e[t+3]=0;let n=A.emissive;if(n==null){e.fill(0,t+4,t+8);return}let r;if(Array.isArray(n))r=[n[0],n[1],n[2]];else{let i=et(n);r=[i.r*i.a,i.g*i.a,i.b*i.a]}e[t+4]=r[0],e[t+5]=r[1],e[t+6]=r[2],e[t+7]=A.emissiveIntensity??1}function qt(A,e="Lights3DLayout"){return A.createBindGroupLayout({label:e,entries:[{binding:0,visibility:GPUShaderStage.FRAGMENT,buffer:{type:"uniform"}},{binding:1,visibility:GPUShaderStage.FRAGMENT,texture:{sampleType:"depth"}},{binding:2,visibility:GPUShaderStage.FRAGMENT,sampler:{type:"comparison"}}]})}function _t(A){let e=A.roughness!==void 0?Math.max(1,(1-A.roughness)*128):A.shininess??32,t=A.metallic!==void 0?A.metallic:A.specularIntensity??.5,n=A.ambientIntensity??1,r=A.material==="unlit"?0:1;return[e,t,n,r]}var Qt=class{device;pipelineSingle;pipelineMrt;bloomVariants;pipelineShadow;cameraLayout;modelLayout;textureLayout;lightsLayout;modelPool;vertexBuffer;indexBuffer;modelData=new Float32Array(52+_A);constructor(e,t,n="depth24plus",r=1){this.device=e,this.modelPool=new GA((52+_A)*4,GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST);let i=e.createShaderModule({label:"quad3d.wgsl",code:Er});this.cameraLayout=e.createBindGroupLayout({label:"Quad3DCameraLayout",entries:[{binding:0,visibility:GPUShaderStage.VERTEX|GPUShaderStage.FRAGMENT,buffer:{type:"uniform"}}]}),this.modelLayout=e.createBindGroupLayout({label:"Quad3DModelLayout",entries:[{binding:0,visibility:GPUShaderStage.VERTEX|GPUShaderStage.FRAGMENT,buffer:{type:"uniform"}},Ce(1)]}),this.textureLayout=e.createBindGroupLayout({label:"Quad3DTextureLayout",entries:[{binding:0,visibility:GPUShaderStage.FRAGMENT,sampler:{type:"filtering"}},{binding:1,visibility:GPUShaderStage.FRAGMENT,texture:{sampleType:"float"}}]}),this.lightsLayout=qt(e,"Quad3DLightsLayout");let o=e.createPipelineLayout({bindGroupLayouts:[this.cameraLayout,this.modelLayout,this.textureLayout,this.lightsLayout]}),a={module:i,entryPoint:"vs_main",buffers:[{arrayStride:32,attributes:[{shaderLocation:0,offset:0,format:"float32x3"},{shaderLocation:1,offset:12,format:"float32x2"},{shaderLocation:2,offset:20,format:"float32x3"}]}]},s={label:"Quad3DPipeline",layout:o,vertex:a,module:i,format:t,depthStencil:{format:n,depthWriteEnabled:!0,depthCompare:"less-equal"},primitive:{topology:"triangle-list",cullMode:"none"},multisample:{count:r}},{single:g,mrt:l}=de(e,s);this.pipelineSingle=g,this.pipelineMrt=l,this.bloomVariants=new ne(e,s),this.pipelineShadow=e.createRenderPipeline({label:"Quad3DPipelineShadow",layout:e.createPipelineLayout({bindGroupLayouts:[this.cameraLayout,this.modelLayout,this.textureLayout]}),vertex:a,fragment:{module:i,entryPoint:"fs_shadow",targets:[]},depthStencil:Et,primitive:{topology:"triangle-list",cullMode:"none"}});let I=new Float32Array([-.5,-.5,0,0,0,0,0,-1,.5,-.5,0,1,0,0,0,-1,.5,.5,0,1,1,0,0,-1,-.5,.5,0,0,1,0,0,-1]),B=new Uint16Array([0,1,2,0,2,3]);this.vertexBuffer=e.createBuffer({size:I.byteLength,usage:GPUBufferUsage.VERTEX|GPUBufferUsage.COPY_DST,mappedAtCreation:!0}),new Float32Array(this.vertexBuffer.getMappedRange()).set(I),this.vertexBuffer.unmap(),this.indexBuffer=e.createBuffer({size:B.byteLength,usage:GPUBufferUsage.INDEX|GPUBufferUsage.COPY_DST,mappedAtCreation:!0}),new Uint16Array(this.indexBuffer.getMappedRange()).set(B),this.indexBuffer.unmap()}resetPools(){this.modelPool.reset()}packModel(e){ct(this.modelData,e.modelMatrix,e.normalMatrix,e.colorTint);let t=e.borderColor??[0,0,0,0];this.modelData[36]=t[0],this.modelData[37]=t[1],this.modelData[38]=t[2],this.modelData[39]=t[3],this.modelData[40]=e.opacity??1,this.modelData[41]=e.borderRadius??0,this.modelData[42]=e.twoSided?1:0,this.modelData[43]=e.borderWidth??0,this.modelData[44]=e.width??0,this.modelData[45]=e.height??0,this.modelData[46]=e.textureExtent?.[0]??0,this.modelData[47]=e.textureExtent?.[1]??0,this.modelData.set(_t(e),48),me(e,this.modelData,52);let n=this.modelPool.getBuffer(this.device,this.modelData);return this.device.createBindGroup({layout:this.modelLayout,entries:[{binding:0,resource:{buffer:n}},{binding:1,resource:e.matte?.createView()??fe(this.device)}]})}textureBindGroup(e,t){return this.device.createBindGroup({layout:this.textureLayout,entries:[{binding:0,resource:t},{binding:1,resource:e.createView()}]})}draw(e,t,n,r,i,o,a=!1,s=!1){let g=this.packModel(o),l=this.textureBindGroup(r,i);e.setPipeline(s?this.bloomVariants.get(a):a?this.pipelineMrt:this.pipelineSingle),e.setBindGroup(0,t),e.setBindGroup(1,g),e.setBindGroup(2,l),e.setBindGroup(3,n),e.setVertexBuffer(0,this.vertexBuffer),e.setIndexBuffer(this.indexBuffer,"uint16"),e.drawIndexed(6)}drawShadow(e,t,n,r,i){e.setPipeline(this.pipelineShadow),e.setBindGroup(0,t),e.setBindGroup(1,this.packModel(i)),e.setBindGroup(2,this.textureBindGroup(n,r)),e.setVertexBuffer(0,this.vertexBuffer),e.setIndexBuffer(this.indexBuffer,"uint16"),e.drawIndexed(6)}destroy(){this.modelPool.destroy(),this.vertexBuffer.destroy(),this.indexBuffer.destroy()}};var Ct=class{device;pipelineSingle;pipelineMrt;bloomVariants;pipelineShadow;cameraLayout;modelLayout;textureLayout;lightsLayout;modelPool;skinningPool;defaultWhiteTexture;flatNormalTexture;defaultSkinningBuffer;modelData=new Float32Array(52+_A);constructor(e,t,n="depth24plus",r,i,o=1){this.device=e,this.modelPool=new GA((52+_A)*4,GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST),this.skinningPool=new GA(8192,GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST);let a=e.createShaderModule({label:"mesh3d.wgsl",code:ur});this.cameraLayout=r??e.createBindGroupLayout({label:"Mesh3DCameraLayout",entries:[{binding:0,visibility:GPUShaderStage.VERTEX|GPUShaderStage.FRAGMENT,buffer:{type:"uniform"}}]}),this.modelLayout=e.createBindGroupLayout({label:"Mesh3DModelLayout",entries:[{binding:0,visibility:GPUShaderStage.VERTEX|GPUShaderStage.FRAGMENT,buffer:{type:"uniform"}},{binding:1,visibility:GPUShaderStage.VERTEX,buffer:{type:"uniform"}},Ce(2)]}),this.textureLayout=e.createBindGroupLayout({label:"Mesh3DTextureLayout",entries:[{binding:0,visibility:GPUShaderStage.FRAGMENT,sampler:{type:"filtering"}},...[1,2,3,4,5].map(Q=>({binding:Q,visibility:GPUShaderStage.FRAGMENT,texture:{sampleType:"float"}}))]}),this.lightsLayout=i??qt(e,"Mesh3DLightsLayout");let s=e.createPipelineLayout({bindGroupLayouts:[this.cameraLayout,this.modelLayout,this.textureLayout,this.lightsLayout]}),g={module:a,entryPoint:"vs_main",buffers:[{arrayStride:64,attributes:[{shaderLocation:0,offset:0,format:"float32x3"},{shaderLocation:1,offset:12,format:"float32x2"},{shaderLocation:2,offset:20,format:"float32x3"},{shaderLocation:3,offset:32,format:"float32x4"},{shaderLocation:4,offset:48,format:"float32x4"}]}]},l={label:"Mesh3DPipeline",layout:s,vertex:g,module:a,format:t,depthStencil:{format:n,depthWriteEnabled:!0,depthCompare:"less-equal"},primitive:{topology:"triangle-list",cullMode:"none"},multisample:{count:o}},{single:I,mrt:B}=de(e,l);this.pipelineSingle=I,this.pipelineMrt=B,this.bloomVariants=new ne(e,l),this.pipelineShadow=e.createRenderPipeline({label:"Mesh3DPipelineShadow",layout:e.createPipelineLayout({bindGroupLayouts:[this.cameraLayout,this.modelLayout]}),vertex:g,depthStencil:Et,primitive:{topology:"triangle-list",cullMode:"none"}}),this.defaultWhiteTexture=e.createTexture({label:"Mesh3DDefaultWhiteTexture",size:{width:1,height:1},format:"rgba8unorm",usage:GPUTextureUsage.TEXTURE_BINDING|GPUTextureUsage.COPY_DST}),e.queue.writeTexture({texture:this.defaultWhiteTexture},new Uint8Array([255,255,255,255]),{bytesPerRow:4,rowsPerImage:1},{width:1,height:1}),this.flatNormalTexture=e.createTexture({label:"Mesh3DFlatNormalTexture",size:{width:1,height:1},format:"rgba8unorm",usage:GPUTextureUsage.TEXTURE_BINDING|GPUTextureUsage.COPY_DST}),e.queue.writeTexture({texture:this.flatNormalTexture},new Uint8Array([128,128,255,255]),{bytesPerRow:4,rowsPerImage:1},{width:1,height:1});let E=new Float32Array(2048);for(let Q=0;Q<128;Q++)E[Q*16]=1,E[Q*16+5]=1,E[Q*16+10]=1,E[Q*16+15]=1;this.defaultSkinningBuffer=e.createBuffer({size:8192,usage:GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST,mappedAtCreation:!0}),new Float32Array(this.defaultSkinningBuffer.getMappedRange()).set(E),this.defaultSkinningBuffer.unmap()}resetPools(){this.modelPool.reset(),this.skinningPool.reset()}packModel(e){ct(this.modelData,e.modelMatrix,e.normalMatrix,e.colorTint),this.modelData[36]=e.opacity??1,this.modelData[37]=e.twoSided?1:0,this.modelData[38]=e.isSkinned?1:0,this.modelData[39]=e.wireframe?1:0;let t=e.roughness!==void 0?Math.max(1,(1-e.roughness)*128):e.shininess??32,n=e.metallic!==void 0?e.metallic:e.specularIntensity??.5,r=e.ambientIntensity??1,i=e.material==="unlit"?0:e.material==="toon"?2:1;this.modelData[40]=t,this.modelData[41]=n,this.modelData[42]=r,this.modelData[43]=i;let o=e.shadeColor??[1,1,1];this.modelData[44]=o[0],this.modelData[45]=o[1],this.modelData[46]=o[2],this.modelData[47]=e.alphaCutoff??0,me(e,this.modelData,48);let a=e.maps;this.modelData[56]=a?.normal?a.normalScale??1:0,this.modelData[57]=a?.occlusion?a.occlusionStrength??1:0,this.modelData[58]=a?.metallicRoughness?1:0,this.modelData[59]=a?.emissive?1:0;let s=this.modelPool.getBuffer(this.device,this.modelData),g=e.isSkinned&&e.skinningMatrices?this.skinningPool.getBuffer(this.device,e.skinningMatrices):this.defaultSkinningBuffer;return this.device.createBindGroup({layout:this.modelLayout,entries:[{binding:0,resource:{buffer:s}},{binding:1,resource:{buffer:g}},{binding:2,resource:e.matte?.createView()??fe(this.device)}]})}draw(e,t,n,r,i,o,a,s=!1,g=!1){let l=this.packModel(a),I=this.defaultWhiteTexture,B=a.maps,E=this.device.createBindGroup({layout:this.textureLayout,entries:[{binding:0,resource:o},{binding:1,resource:(i??I).createView()},{binding:2,resource:(B?.normal??this.flatNormalTexture).createView()},{binding:3,resource:(B?.metallicRoughness??I).createView()},{binding:4,resource:(B?.occlusion??I).createView()},{binding:5,resource:(B?.emissive??I).createView()}]});e.setPipeline(g?this.bloomVariants.get(s):s?this.pipelineMrt:this.pipelineSingle),e.setBindGroup(0,t),e.setBindGroup(1,l),e.setBindGroup(2,E),e.setBindGroup(3,n),e.setVertexBuffer(0,r.vertexBuffer),e.setIndexBuffer(r.indexBuffer,r.indexFormat),e.drawIndexed(r.indexCount)}drawShadow(e,t,n,r){e.setPipeline(this.pipelineShadow),e.setBindGroup(0,t),e.setBindGroup(1,this.packModel(r)),e.setVertexBuffer(0,n.vertexBuffer),e.setIndexBuffer(n.indexBuffer,n.indexFormat),e.drawIndexed(n.indexCount)}destroy(){this.modelPool.destroy(),this.skinningPool.destroy(),this.defaultWhiteTexture.destroy(),this.flatNormalTexture.destroy(),this.defaultSkinningBuffer.destroy()}};v();function jt(A){let{min:e,max:t}=A;return[[e[0],e[1],e[2]],[t[0],e[1],e[2]],[e[0],t[1],e[2]],[t[0],t[1],e[2]],[e[0],e[1],t[2]],[t[0],e[1],t[2]],[e[0],t[1],t[2]],[t[0],t[1],t[2]]]}function $t(A,e){let t=[1/0,1/0,1/0],n=[-1/0,-1/0,-1/0];for(let[r,i,o]of jt(A)){let a=[e[0]*r+e[4]*i+e[8]*o+e[12],e[1]*r+e[5]*i+e[9]*o+e[13],e[2]*r+e[6]*i+e[10]*o+e[14]];for(let s=0;s<3;s++)a[s]<t[s]&&(t[s]=a[s]),a[s]>n[s]&&(n[s]=a[s])}return{min:t,max:n}}function ft(A,e){return[A[0]*e[0]+A[4]*e[1]+A[8]*e[2]+A[12],A[1]*e[0]+A[5]*e[1]+A[9]*e[2]+A[13],A[2]*e[0]+A[6]*e[1]+A[10]*e[2]+A[14]]}function Qr(A){return Math.abs(A[1])>.98?[0,0,1]:[0,-1,0]}function Cr(A,e,t,n){if(e.length===0)return null;let r=R.normalize(A.direction),i=e.flatMap(jt),o=[...i,...t.flatMap(jt)];if(A.type==="directional"){let Q=[0,0,0];for(let F of i)Q[0]+=F[0]/i.length,Q[1]+=F[1]/i.length,Q[2]+=F[2]/i.length;let C=R.subtract(Q,R.multiplyScalar(r,1)),p=_.lookAt(C,Q,Qr(r)),h=1/0,d=-1/0,D=1/0,x=-1/0;for(let F of i){let J=ft(p,F);h=Math.min(h,J[0]),d=Math.max(d,J[0]),D=Math.min(D,J[1]),x=Math.max(x,J[1])}let G=1/0,M=-1/0;for(let F of o){let J=ft(p,F)[2];G=Math.min(G,J),M=Math.max(M,J)}let w=Math.max(d-h,x-D)*.5*1.08+4,b=(h+d)/2,N=(D+x)/2,U=Math.max(10,(M-G)*.02),L=_.orthographic(b-w,b+w,N-w,N+w,G-U,M+U);return{viewProj:_.multiply(L,p),texelWorldSize:2*w/n}}let a=A.position,s=_.lookAt(a,R.add(a,r),Qr(r)),g=1/0,l=0,I=0;for(let Q of o){let C=ft(s,Q)[2];C>0&&(g=Math.min(g,C),l=Math.max(l,C))}for(let Q of i)I=Math.max(I,ft(s,Q)[2]);if(!Number.isFinite(g)||l<=0)return null;g=Math.max(1,g*.9),l=l*1.05+1;let B=Math.min(170,2*(A.angle??45)+4)*Math.PI/180,E=_.perspective(B,1,g,l);return{viewProj:_.multiply(E,s),texelWorldSize:2*Math.tan(B/2)*Math.max(I,g)/n}}v();v();var fr=`
1245
+ ${Be}
1246
+
1247
+ struct TextModelUniforms {
1248
+ modelMatrix : mat4x4<f32>, // paragraph px -> world
1249
+ normalMatrix : mat4x4<f32>,
1250
+ params : vec4<f32>, // x = opacity, y = slant, z = twoSided (1.0 = yes), w = pull toward the eye
1251
+ materialParams : vec4<f32>, // x = shininess, y = specularIntensity, z = ambientIntensity, w = materialMode (0=unlit, 1=lit)
1252
+ pbr : vec4<f32>, // x = roughness (<0 = default), y = metallic
1253
+ emissive : vec4<f32>, // rgb = sRGB emissive color, w = strength
1254
+ };
1255
+
1256
+ @group(0) @binding(0) var<uniform> cam : CameraUniforms;
1257
+ @group(1) @binding(0) var<uniform> model : TextModelUniforms;
1258
+ ${Qe(1,1)}@group(2) @binding(0) var curvesTex : texture_2d<f32>;
1259
+ @group(2) @binding(1) var bandsTex : texture_2d<u32>;
1260
+ ${Ee}
1261
+
1262
+ ${Xn}
1263
+
1264
+ struct VSOut {
1265
+ @builtin(position) pos : vec4<f32>,
1266
+ @location(0) uv : vec2<f32>,
1267
+ @location(1) @interpolate(flat) glyphScale : vec2<f32>,
1268
+ @location(2) @interpolate(flat) bandScale : vec2<f32>,
1269
+ @location(3) @interpolate(flat) bandMax : vec2<u32>,
1270
+ @location(4) @interpolate(flat) bandsTexCoords : vec2<u32>,
1271
+ @location(5) color : vec4<f32>,
1272
+ @location(6) @interpolate(flat) fx : vec4<f32>, // x = blur, y = chromatic shift, z = dissolve, w = vfx
1273
+ @location(7) worldPos : vec3<f32>,
1274
+ @location(8) @interpolate(flat) worldNormal : vec3<f32>,
1275
+ @location(9) linearDepth : f32,
1276
+ };
1277
+
1278
+ var<private> pos : array<vec2<f32>, 6> = array<vec2<f32>, 6>(
1279
+ vec2<f32>(-1.0, -1.0),
1280
+ vec2<f32>(1.0, 1.0),
1281
+ vec2<f32>(-1.0, 1.0),
1282
+ vec2<f32>(-1.0, -1.0),
1283
+ vec2<f32>(1.0, -1.0),
1284
+ vec2<f32>(1.0, 1.0)
1285
+ );
1286
+
1287
+ // Screen pixels moved per paragraph unit along the axis whose clip-space step
1288
+ // is dc, at clip position c: the derivative of the perspective divide.
1289
+ fn pixelsPerUnitAlong(c: vec4<f32>, dc: vec4<f32>) -> vec2<f32> {
1290
+ let w = max(c.w, 1e-4);
1291
+ return (dc.xy * w - c.xy * dc.w) / (w * w) * 0.5 * cam.screenParams.xy;
1292
+ }
1293
+
1294
+ @vertex fn vs(
1295
+ @builtin(vertex_index) vertex_index : u32,
1296
+ @location(0) aScaleBias : vec4<f32>,
1297
+ @location(1) aGlyphBandScale : vec4<f32>,
1298
+ @location(2) aBandMaxTexCoords : vec4<f32>,
1299
+ @location(3) aAnim : vec4<f32>, // x = rotation, y = scale_mult, zw = translation
1300
+ @location(4) aColor : vec4<f32>,
1301
+ @location(5) aExtraParams : vec4<f32>,
1302
+ ) -> VSOut {
1303
+ let quad_pos = pos[vertex_index];
1304
+ let angle = aAnim.x;
1305
+ let scale_mult = aAnim.y;
1306
+ let origin = aScaleBias.zw + aAnim.zw;
1307
+ let slant = model.params.y;
1308
+ let rot = mat2x2<f32>(cos(angle), sin(angle), -sin(angle), cos(angle));
1309
+ let shear = mat2x2<f32>(1.0, 0.0, -slant, 1.0);
1310
+ let glyphToParagraph = rot * shear;
1311
+
1312
+ let clipFromParagraph = cam.viewProjMatrix * model.modelMatrix;
1313
+
1314
+ // Slug's dynamic dilation, under perspective: grow the quad by one screen
1315
+ // pixel so edge pixels whose centres fall just outside the outline's box
1316
+ // are still shaded. The pixel is measured at this corner through the
1317
+ // projection's Jacobian, along the paragraph direction that gets the fewest
1318
+ // pixels (its smallest singular value), so foreshortened sides are covered.
1319
+ let corner = origin + glyphToParagraph * (quad_pos * aScaleBias.xy * scale_mult);
1320
+ let cornerClip = clipFromParagraph * vec4<f32>(corner, 0.0, 1.0);
1321
+ let jx = pixelsPerUnitAlong(cornerClip, clipFromParagraph[0]);
1322
+ let jy = pixelsPerUnitAlong(cornerClip, clipFromParagraph[1]);
1323
+ let e = dot(jx, jx) + dot(jy, jy);
1324
+ let det = jx.x * jy.y - jx.y * jy.x;
1325
+ let minPixelsPerUnit = sqrt(max(0.5 * (e - sqrt(max(e * e - 4.0 * det * det, 0.0))), 0.0));
1326
+ let halfSize = max(abs(aScaleBias.xy * scale_mult), vec2<f32>(1e-4));
1327
+ // Bounded at three times the glyph: seen nearly edge-on a pixel spans
1328
+ // most of the paragraph, and the glyph is a sliver either way.
1329
+ let dilation = min(vec2<f32>(1.0 / max(minPixelsPerUnit, 1e-6)), halfSize * 2.0);
1330
+ let grow = vec2<f32>(1.0) + dilation / halfSize;
1331
+
1332
+ let paragraphPos = origin + glyphToParagraph * (quad_pos * aScaleBias.xy * scale_mult * grow);
1333
+ let world4 = model.modelMatrix * vec4<f32>(paragraphPos, 0.0, 1.0);
1334
+ // Slide toward the eye along the view ray: the same pixel, a nearer depth.
1335
+ // Passes stacked on one plane (shadow, stroke, fill, a backdrop) resolve
1336
+ // by draw order instead of z-fighting.
1337
+ let world = world4.xyz + (cam.cameraPos.xyz - world4.xyz) * model.params.w;
1338
+
1339
+ var out : VSOut;
1340
+ out.pos = cam.viewProjMatrix * vec4<f32>(world, 1.0);
1341
+ out.uv = vec2<f32>(
1342
+ quad_pos.x * grow.x * 0.5 + 0.5,
1343
+ 1.0 - (quad_pos.y * grow.y * 0.5 + 0.5),
1344
+ );
1345
+ out.glyphScale = aGlyphBandScale.xy;
1346
+ out.bandScale = aGlyphBandScale.zw;
1347
+ out.bandMax = vec2<u32>(aBandMaxTexCoords.xy);
1348
+ out.bandsTexCoords = vec2<u32>(aBandMaxTexCoords.zw);
1349
+ out.color = aColor;
1350
+ out.fx = aExtraParams;
1351
+ out.worldPos = world4.xyz;
1352
+ out.worldNormal = normalize((model.normalMatrix * vec4<f32>(0.0, 0.0, -1.0, 0.0)).xyz);
1353
+ out.linearDepth = dot(world4.xyz - cam.cameraPos.xyz, cam.cameraDir.xyz);
1354
+ return out;
1355
+ }
1356
+
1357
+ struct TextFragment {
1358
+ color : vec4<f32>, // premultiplied display color; alpha 0 = discard
1359
+ hdr : vec4<f32>, // premultiplied scene radiance (bloom source)
1360
+ };
1361
+
1362
+ fn shadeText(in : VSOut, fw : vec2<f32>) -> TextFragment {
1363
+ var out : TextFragment;
1364
+ out.color = vec4<f32>(0.0);
1365
+ out.hdr = vec4<f32>(0.0);
1366
+ // One-sided text culls against its plane's normal, as one-sided quads do.
1367
+ if (model.params.z < 0.5 && dot(in.worldNormal, cam.cameraPos.xyz - in.worldPos) < 0.0) {
1368
+ return out;
1369
+ }
1370
+ let glyph = SlugGlyph(in.glyphScale, in.bandScale, in.bandMax, in.bandsTexCoords);
1371
+ let shaded = shadeSlugGlyph(
1372
+ in.uv,
1373
+ fw,
1374
+ in.pos.xy,
1375
+ glyph,
1376
+ in.color,
1377
+ model.params.x,
1378
+ in.fx.x,
1379
+ in.fx.y,
1380
+ in.fx.z,
1381
+ );
1382
+ if (shaded.a < 0.0001) {
1383
+ return out;
1384
+ }
1385
+ let lit = shadeSurfaceFull(in.worldPos, in.worldNormal, shaded.rgb / shaded.a, model.materialParams, model.pbr, model.emissive);
1386
+ out.color = vec4<f32>(lit.display * shaded.a, shaded.a);
1387
+ out.hdr = vec4<f32>(lit.hdr * shaded.a, shaded.a);
1388
+ return out;
1389
+ }
1390
+
1391
+ fn textFragment(in : VSOut) -> TextFragment {
1392
+ let fw = max(abs(dpdx(in.uv)) + abs(dpdy(in.uv)), vec2<f32>(0.000001));
1393
+ let m = matteCoverage(in.pos.xy);
1394
+ var f = shadeText(in, fw);
1395
+ f.color *= m;
1396
+ f.hdr *= m;
1397
+ if (f.color.a < 0.0001) {
1398
+ discard;
1399
+ }
1400
+ return f;
1401
+ }
1402
+
1403
+ @fragment fn fs_single(in : VSOut) -> @location(0) vec4<f32> {
1404
+ return textFragment(in).color;
1405
+ }
1406
+
1407
+ struct MrtOutput {
1408
+ @location(0) color : vec4<f32>,
1409
+ @location(1) depth : vec4<f32>,
1410
+ };
1411
+
1412
+ struct BloomOutput {
1413
+ @location(0) color : vec4<f32>,
1414
+ @location(1) hdr : vec4<f32>,
1415
+ };
1416
+
1417
+ struct MrtBloomOutput {
1418
+ @location(0) color : vec4<f32>,
1419
+ @location(1) depth : vec4<f32>,
1420
+ @location(2) hdr : vec4<f32>,
1421
+ };
1422
+
1423
+ @fragment fn fs_mrt(in : VSOut) -> MrtOutput {
1424
+ var out : MrtOutput;
1425
+ out.color = textFragment(in).color;
1426
+ out.depth = vec4<f32>(in.linearDepth, 0.0, 0.0, 1.0);
1427
+ return out;
1428
+ }
1429
+
1430
+ @fragment fn fs_single_bloom(in : VSOut) -> BloomOutput {
1431
+ let f = textFragment(in);
1432
+ var out : BloomOutput;
1433
+ out.color = f.color;
1434
+ out.hdr = f.hdr;
1435
+ return out;
1436
+ }
1437
+
1438
+ @fragment fn fs_mrt_bloom(in : VSOut) -> MrtBloomOutput {
1439
+ let f = textFragment(in);
1440
+ var out : MrtBloomOutput;
1441
+ out.color = f.color;
1442
+ out.depth = vec4<f32>(in.linearDepth, 0.0, 0.0, 1.0);
1443
+ out.hdr = f.hdr;
1444
+ return out;
1445
+ }
1446
+ `;var dr=24,dt=class{device;pipelineSingle;pipelineMrt;bloomVariants;modelLayout;fontLayout;modelPool;instancePool;fontBindGroups=new WeakMap;modelData=new Float32Array(40+_A);constructor(e,t,n,r,i,o=1){this.device=e,this.modelPool=new GA((40+_A)*4,GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST),this.instancePool=new GA(65536,GPUBufferUsage.VERTEX|GPUBufferUsage.COPY_DST);let a=e.createShaderModule({label:"slug3d.wgsl",code:fr});this.modelLayout=e.createBindGroupLayout({label:"Slug3DModelLayout",entries:[{binding:0,visibility:GPUShaderStage.VERTEX|GPUShaderStage.FRAGMENT,buffer:{type:"uniform"}},Ce(1)]}),this.fontLayout=e.createBindGroupLayout({label:"Slug3DFontLayout",entries:[{binding:0,visibility:GPUShaderStage.FRAGMENT,texture:{sampleType:"unfilterable-float"}},{binding:1,visibility:GPUShaderStage.FRAGMENT,texture:{sampleType:"uint"}}]});let s=e.createPipelineLayout({bindGroupLayouts:[r,this.modelLayout,this.fontLayout,i]}),g={module:a,entryPoint:"vs",buffers:[{arrayStride:dr*4,stepMode:"instance",attributes:[{shaderLocation:0,offset:0,format:"float32x4"},{shaderLocation:1,offset:16,format:"float32x4"},{shaderLocation:2,offset:32,format:"float32x4"},{shaderLocation:3,offset:48,format:"float32x4"},{shaderLocation:4,offset:64,format:"float32x4"},{shaderLocation:5,offset:80,format:"float32x4"}]}]},E={label:"Slug3DPipeline",layout:s,vertex:g,module:a,format:t,depthStencil:{format:n,depthWriteEnabled:!0,depthCompare:"less-equal"},primitive:{topology:"triangle-list",cullMode:"none"},multisample:{count:o}},{single:Q,mrt:C}=de(e,E);this.pipelineSingle=Q,this.pipelineMrt=C,this.bloomVariants=new ne(e,E)}resetPools(){this.modelPool.reset(),this.instancePool.reset()}draw(e,t,n,r,i,o,a,s=!1,g=!1){if(o===0||!r.curvesTex||!r.bandsTex)return;this.modelData.set(a.modelMatrix,0),this.modelData.set(a.normalMatrix,16),this.modelData[32]=a.opacity,this.modelData[33]=a.slant,this.modelData[34]=a.twoSided?1:0,this.modelData[35]=a.depthPull,this.modelData.set(_t(a),36),me(a,this.modelData,40);let l=this.modelPool.getBuffer(this.device,this.modelData),I=this.device.createBindGroup({layout:this.modelLayout,entries:[{binding:0,resource:{buffer:l}},{binding:1,resource:a.matte?.createView()??fe(this.device)}]}),B=this.instancePool.getBuffer(this.device,i.subarray(0,o*dr));e.setPipeline(g?this.bloomVariants.get(s):s?this.pipelineMrt:this.pipelineSingle),e.setBindGroup(0,t),e.setBindGroup(1,I),e.setBindGroup(2,this.fontBindGroup(r.curvesTex,r.bandsTex)),e.setBindGroup(3,n),e.setVertexBuffer(0,B),e.draw(6,o)}fontBindGroup(e,t){let n=this.fontBindGroups.get(e);return n||(n=this.device.createBindGroup({layout:this.fontLayout,entries:[{binding:0,resource:e.createView()},{binding:1,resource:t.createView()}]}),this.fontBindGroups.set(e,n)),n}destroy(){this.modelPool.destroy(),this.instancePool.destroy()}};var to={repeat:"repeat",clamp:"clamp-to-edge",mirror:"mirror-repeat"},no=5e-4,mr=class{device;format;quad3dPipeline;slug3dPipeline;mesh3dPipeline;audioMeshDeformPipeline;dofPipeline;dofBindGroupLayout;cameraPool;lightsPool;cameraUniformBindGroupCache=new zn;samplerCache=new Zn;depthTexture=null;linearDepthTexture=null;msaaColorTexture=null;msaaLinearDepthTexture=null;msaaHdrTexture=null;hdrTexture=null;passWritesHdr=!1;cameraUniformData=new Float32Array(80);meshBuffersCache=new WeakMap;materialTextures=new WeakMap;materialMapCache=new WeakMap;modelCache=new Map;lastCameraPose=null;shadowTexture=null;placeholderShadowTexture=null;shadowSampler=null;meshBounds=new WeakMap;bloomPipeline=null;lastCameraBuffer=null;sampleCount;constructor(e,t,n=4){this.device=e,this.format=t,this.sampleCount=n,this.quad3dPipeline=new Qt(e,t,"depth24plus",n),this.slug3dPipeline=new dt(e,t,"depth24plus",this.quad3dPipeline.cameraLayout,this.quad3dPipeline.lightsLayout,n),this.mesh3dPipeline=new Ct(e,t,"depth24plus",this.quad3dPipeline.cameraLayout,this.quad3dPipeline.lightsLayout,n),this.audioMeshDeformPipeline=new at(e),this.cameraPool=new GA(320,GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST),this.lightsPool=new GA(Kt,GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST);let r=e.createShaderModule({label:"dof-bokeh.wgsl",code:Ir});this.dofBindGroupLayout=e.createBindGroupLayout({label:"DoFBindGroupLayout",entries:[{binding:0,visibility:GPUShaderStage.VERTEX|GPUShaderStage.FRAGMENT,buffer:{type:"uniform"}},{binding:1,visibility:GPUShaderStage.FRAGMENT,sampler:{type:"filtering"}},{binding:2,visibility:GPUShaderStage.FRAGMENT,texture:{sampleType:"float"}},{binding:3,visibility:GPUShaderStage.FRAGMENT,texture:{sampleType:"float"}}]}),this.dofPipeline=e.createRenderPipeline({label:"DoFBokehPipeline",layout:e.createPipelineLayout({bindGroupLayouts:[this.dofBindGroupLayout]}),vertex:{module:r,entryPoint:"vs_fullscreen"},fragment:{module:r,entryPoint:"fs_dof",targets:[{format:t}]},primitive:{topology:"triangle-list"}})}resetPools(){this.bloomPipeline?.resetPools(),this.cameraPool.reset(),this.lastCameraPose=null,this.lastCameraBuffer=null,this.lightsPool.reset(),this.quad3dPipeline.resetPools(),this.slug3dPipeline.resetPools(),this.mesh3dPipeline.resetPools(),this.audioMeshDeformPipeline.resetPools()}getOrCreateDepthTexture(e,t){return(!this.depthTexture||this.depthTexture.width!==e||this.depthTexture.height!==t)&&(this.depthTexture?.destroy(),this.depthTexture=this.device.createTexture({label:"Renderer3DDepthTexture",size:{width:e,height:t},format:"depth24plus",sampleCount:this.sampleCount,usage:GPUTextureUsage.RENDER_ATTACHMENT})),this.depthTexture}getOrCreateMsaaTexture(e,t,n,r,i){return e&&e.width===r&&e.height===i?e:(e?.destroy(),this.device.createTexture({label:t,size:{width:r,height:i},format:n,sampleCount:this.sampleCount,usage:GPUTextureUsage.RENDER_ATTACHMENT}))}hdrSource(){return this.hdrTexture}getOrCreateHdrTexture(e,t){return(!this.hdrTexture||this.hdrTexture.width!==e||this.hdrTexture.height!==t)&&(this.hdrTexture?.destroy(),this.hdrTexture=this.device.createTexture({label:"Renderer3DHdrRadiance",size:{width:e,height:t},format:"rgba16float",usage:GPUTextureUsage.RENDER_ATTACHMENT|GPUTextureUsage.TEXTURE_BINDING})),this.hdrTexture}getOrCreateLinearDepthTexture(e,t){return(!this.linearDepthTexture||this.linearDepthTexture.width!==e||this.linearDepthTexture.height!==t)&&(this.linearDepthTexture?.destroy(),this.linearDepthTexture=this.device.createTexture({label:"Renderer3DLinearDepthTexture",size:{width:e,height:t},format:"rgba16float",usage:GPUTextureUsage.RENDER_ATTACHMENT|GPUTextureUsage.TEXTURE_BINDING})),this.linearDepthTexture}packCameraUniforms(e,t,n,r=0){if(this.lastCameraPose&&this.lastCameraBuffer&&this.lastCameraPose.eye[0]===e.eye[0]&&this.lastCameraPose.eye[1]===e.eye[1]&&this.lastCameraPose.eye[2]===e.eye[2]&&this.lastCameraPose.target[0]===e.target[0]&&this.lastCameraPose.target[1]===e.target[1]&&this.lastCameraPose.target[2]===e.target[2]&&this.lastCameraPose.up[0]===e.up[0]&&this.lastCameraPose.up[1]===e.up[1]&&this.lastCameraPose.up[2]===e.up[2]&&this.lastCameraPose.fov===e.fov&&this.lastCameraPose.near===e.near&&this.lastCameraPose.far===e.far)return this.lastCameraBuffer;let i=Ie.computeViewMatrix(e),o=Ie.computeProjectionMatrix(e),a=Ie.computeViewProjectionMatrix(e),s=_.invert(a)??_.identity();this.cameraUniformData.set(i,0),this.cameraUniformData.set(o,16),this.cameraUniformData.set(a,32),this.cameraUniformData.set(s,48),this.cameraUniformData[64]=e.eye[0],this.cameraUniformData[65]=e.eye[1],this.cameraUniformData[66]=e.eye[2],this.cameraUniformData[67]=e.near;let g=R.normalize(R.subtract(e.target,e.eye));this.cameraUniformData[68]=g[0],this.cameraUniformData[69]=g[1],this.cameraUniformData[70]=g[2],this.cameraUniformData[71]=e.far,this.cameraUniformData[72]=e.focusDistance??1e3,this.cameraUniformData[73]=e.fStop??2.8,this.cameraUniformData[74]=e.maxBlurRadius??32,this.cameraUniformData[75]=e.focusDistance!==void 0?1:0,this.cameraUniformData[76]=t,this.cameraUniformData[77]=n,this.cameraUniformData[78]=r,this.cameraUniformData[79]=0;let l=this.cameraPool.getBuffer(this.device,this.cameraUniformData);return this.lastCameraPose=e,this.lastCameraBuffer=l,l}createCameraBindGroup(e){return this.cameraUniformBindGroupCache.getBindGroup(this.device,this.quad3dPipeline.cameraLayout,e)}getOrCreateLightsBuffer(e,t){let n=qA.packLightsUniforms(e??[],t?.environment,t?.shadow);return this.lightsPool.getBuffer(this.device,n)}createLightsBindGroup(e,t){this.shadowSampler??=this.device.createSampler({label:"ShadowComparisonSampler",compare:"less-equal",magFilter:"linear",minFilter:"linear",addressModeU:"clamp-to-edge",addressModeV:"clamp-to-edge"}),this.placeholderShadowTexture??=this.device.createTexture({label:"ShadowMapPlaceholder",size:{width:1,height:1},format:Bt,usage:GPUTextureUsage.TEXTURE_BINDING|GPUTextureUsage.RENDER_ATTACHMENT});let n=t&&this.shadowTexture?this.shadowTexture:this.placeholderShadowTexture;return this.device.createBindGroup({label:"Lights3DBindGroup",layout:this.quad3dPipeline.lightsLayout,entries:[{binding:0,resource:{buffer:e}},{binding:1,resource:n.createView()},{binding:2,resource:this.shadowSampler}]})}meshAabb(e){let t=this.meshBounds.get(e);if(!t){let n=[1/0,1/0,1/0],r=[-1/0,-1/0,-1/0],i=e.positions;for(let o=0;o+2<i.length;o+=3)for(let a=0;a<3;a++){let s=i[o+a];s<n[a]&&(n[a]=s),s>r[a]&&(r[a]=s)}t=Number.isFinite(n[0])?{min:n,max:r}:{min:[0,0,0],max:[0,0,0]},this.meshBounds.set(e,t)}return t}worldBounds(e){return e.kind==="mesh"?$t(this.meshAabb(e.mesh),this.meshModelMatrix(e.opts)):$t({min:[-.5,-.5,0],max:[.5,.5,0]},this.quadModelMatrix(e.opts))}renderShadowMap(e,t,n,r,i,o={}){let a=t.lightType??t.type;if(a!=="directional"&&a!=="spot")return null;let s=qA.processLight(t),g=[s.posType[0],s.posType[1],s.posType[2]],l=[s.dirRadius[0],s.dirRadius[1],s.dirRadius[2]],I=o.mapSize??2048,B=r.map(d=>this.worldBounds(d)),E=Cr({type:a,position:g,direction:l,angle:t.angle},B,i,I);if(!E)return null;(!this.shadowTexture||this.shadowTexture.width!==I)&&(this.shadowTexture?.destroy(),this.shadowTexture=this.device.createTexture({label:"ShadowMap",size:{width:I,height:I},format:Bt,usage:GPUTextureUsage.RENDER_ATTACHMENT|GPUTextureUsage.TEXTURE_BINDING}));let Q=new Float32Array(80);Q.set(E.viewProj,32),Q.set(E.viewProj,0),Q[5]=1,Q.set(E.viewProj,16),Q[64]=g[0],Q[65]=g[1],Q[66]=g[2],Q[68]=l[0],Q[69]=l[1],Q[70]=l[2],Q[76]=I,Q[77]=I;let C=this.createCameraBindGroup(this.cameraPool.getBuffer(this.device,Q)),p=e.beginRenderPass({label:"ShadowMapPass",colorAttachments:[],depthStencilAttachment:{view:this.shadowTexture.createView(),depthClearValue:1,depthLoadOp:"clear",depthStoreOp:"store"}}),h=this.samplerCache.getSampler(this.device);for(let d of r)if(d.kind==="mesh"){let D=this.meshModelMatrix(d.opts);this.mesh3dPipeline.drawShadow(p,C,d.buffers??this.getOrCreateMeshBuffers(d.mesh),{modelMatrix:D,normalMatrix:d.opts.normalMatrix??qA.computeNormalMatrix(D),isSkinned:d.opts.isSkinned,skinningMatrices:d.opts.skinningMatrices})}else{let D=this.quadModelMatrix(d.opts);this.quad3dPipeline.drawShadow(p,C,d.texture,h,{modelMatrix:D,normalMatrix:D,width:d.opts.width,height:d.opts.height,textureExtent:d.opts.textureExtent,opacity:d.opts.opacity,colorTint:d.opts.colorTint})}return p.end(),{matrix:E.viewProj,lightIndex:n,mapSize:I,softness:o.softness??t.shadowSoftness??2.5,bias:a==="directional"?6e-4:8e-5,normalOffset:E.texelWorldSize*1.5,darkness:o.darkness??t.shadowDarkness??1}}beginPass(e,t,n,r,i,o="clear",a={r:0,g:0,b:0,a:0},s,g,l,I=!1){let B=this.getOrCreateDepthTexture(n,r),E=this.packCameraUniforms(i,n,r),Q=this.createCameraBindGroup(E),C=this.getOrCreateLightsBuffer(g,l),p=this.createLightsBindGroup(C,!!l?.shadow),h=this.sampleCount>1;if(h&&o==="load")throw new Error("Renderer3D.beginPass: loadOp 'load' needs a Renderer3D built with sampleCount 1");let d=(G,M,w,b)=>M?{view:M.createView(),resolveTarget:G,loadOp:"clear",storeOp:"discard",clearValue:w}:{view:G,loadOp:b,storeOp:"store",clearValue:w};h&&(this.msaaColorTexture=this.getOrCreateMsaaTexture(this.msaaColorTexture,"Renderer3DMsaaColor",this.format,n,r));let D=[d(t,h?this.msaaColorTexture:null,a,o)];return s&&(h&&(this.msaaLinearDepthTexture=this.getOrCreateMsaaTexture(this.msaaLinearDepthTexture,"Renderer3DMsaaLinearDepth","rgba16float",n,r)),D.push(d(s,h?this.msaaLinearDepthTexture:null,{r:i.far,g:0,b:0,a:1},"clear"))),this.passWritesHdr=I,I&&(this.hdrTexture=this.getOrCreateHdrTexture(n,r),h&&(this.msaaHdrTexture=this.getOrCreateMsaaTexture(this.msaaHdrTexture,"Renderer3DMsaaHdr","rgba16float",n,r)),D.push(d(this.hdrTexture.createView(),h?this.msaaHdrTexture:null,{r:0,g:0,b:0,a:0},"clear"))),{pass:e.beginRenderPass({colorAttachments:D,depthStencilAttachment:{view:B.createView(),depthClearValue:1,depthLoadOp:"clear",depthStoreOp:h?"discard":"store"}}),cameraBindGroup:Q,cameraBuffer:E,lightsBindGroup:p}}quadModelMatrix(e){if(e.modelMatrix)return e.modelMatrix;let{position:t,width:n,height:r,rotation:i=[0,0,0],scale:o=[1,1,1],anchor:a=[.5,.5]}=e,s=_.identity();s=_.multiply(s,_.translate(t[0],t[1],t[2]));let g=i[0]*Math.PI/180,l=i[1]*Math.PI/180,I=i[2]*Math.PI/180;I!==0&&(s=_.multiply(s,_.rotateZ(I))),l!==0&&(s=_.multiply(s,_.rotateY(l))),g!==0&&(s=_.multiply(s,_.rotateX(g)));let B=n*o[0],E=r*o[1],Q=o[2];s=_.multiply(s,_.scale(B,E,Q));let C=.5-a[0],p=.5-a[1];return(C!==0||p!==0)&&(s=_.multiply(s,_.translate(C,p,0))),s}drawSlugText(e,t,n,r,i,o=0,a=!1){let{width:s,height:g}=i;if(!(s>0&&g>0))return;let l=this.quadModelMatrix(i),I=i.normalMatrix??qA.computeNormalMatrix(l),B=_.multiply(l,_.multiply(_.translate(-.5,-.5,0),_.scale(1/s,1/g,1)));for(let E=0;E<r.length;E++){let Q=r[E],[C,p,h,d,D,x]=Q.transform,G=[C,p,0,0,h,d,0,0,0,0,1,0,D,x,0,1];this.slug3dPipeline.draw(e,t,n,Q.font,Q.instances,Q.instanceCount,{modelMatrix:_.multiply(B,G),normalMatrix:I,opacity:Q.opacity*(i.opacity??1),slant:Q.slant,twoSided:i.twoSided??!0,depthPull:no*(o+E+1),material:i.material,shininess:i.shininess??32,roughness:i.roughness,specularIntensity:i.specularIntensity??.5,ambientIntensity:i.ambientIntensity??1,metallic:i.metallic,emissive:i.emissive,emissiveIntensity:i.emissiveIntensity,matte:i.matte},a,this.passWritesHdr)}}drawTextureQuad(e,t,n,r,i,o=!1){let{width:a,height:s,opacity:g=1,colorTint:l=[1,1,1,1],borderColor:I,borderWidth:B=0,borderRadius:E=0,twoSided:Q=!0,material:C="lit",shininess:p=32,roughness:h,specularIntensity:d=.5,ambientIntensity:D=1,metallic:x}=i,G=this.quadModelMatrix(i),M=i.normalMatrix??qA.computeNormalMatrix(G),w=this.samplerCache.getSampler(this.device),b;if(I)if(Array.isArray(I))b=I;else{let N=et(I);b=[N.r,N.g,N.b,N.a]}this.quad3dPipeline.draw(e,t,n,r,w,{modelMatrix:G,normalMatrix:M,colorTint:l,borderColor:b,borderWidth:B,opacity:g,borderRadius:E,twoSided:Q,width:a,height:s,textureExtent:i.textureExtent,material:C,shininess:p,roughness:h,specularIntensity:d,ambientIntensity:D,metallic:x,emissive:i.emissive,emissiveIntensity:i.emissiveIntensity,matte:i.matte},o,this.passWritesHdr)}meshModelMatrix(e){if(e.modelMatrix)return e.modelMatrix;let{position:t=[0,0,0],rotation:n=[0,0,0],scale:r=[1,1,1]}=e,i=_.translate(t[0],t[1],t[2]),o=n[0]*Math.PI/180,a=n[1]*Math.PI/180,s=n[2]*Math.PI/180;return s!==0&&(i=_.multiply(i,_.rotateZ(s))),a!==0&&(i=_.multiply(i,_.rotateY(a))),o!==0&&(i=_.multiply(i,_.rotateX(o))),_.multiply(i,_.scale(r[0],r[1],r[2]))}getOrCreateMeshBuffers(e){let t=this.meshBuffersCache.get(e);if(t)return t;let n=e.positions.length/3,r=new Float32Array(n*16);for(let l=0;l<n;l++){let I=l*16;r[I]=e.positions[l*3]??0,r[I+1]=e.positions[l*3+1]??0,r[I+2]=e.positions[l*3+2]??0,r[I+3]=e.uvs[l*2]??0,r[I+4]=e.uvs[l*2+1]??0,r[I+5]=e.normals[l*3]??0,r[I+6]=e.normals[l*3+1]??0,r[I+7]=e.normals[l*3+2]??1,e.jointIndices?(r[I+8]=e.jointIndices[l*4]??0,r[I+9]=e.jointIndices[l*4+1]??0,r[I+10]=e.jointIndices[l*4+2]??0,r[I+11]=e.jointIndices[l*4+3]??0):(r[I+8]=0,r[I+9]=0,r[I+10]=0,r[I+11]=0),e.jointWeights?(r[I+12]=e.jointWeights[l*4]??0,r[I+13]=e.jointWeights[l*4+1]??0,r[I+14]=e.jointWeights[l*4+2]??0,r[I+15]=e.jointWeights[l*4+3]??0):(r[I+12]=0,r[I+13]=0,r[I+14]=0,r[I+15]=0)}let i=Math.ceil(r.byteLength/4)*4,o=this.device.createBuffer({size:Math.max(4,i),usage:GPUBufferUsage.VERTEX|GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_DST|GPUBufferUsage.COPY_SRC,mappedAtCreation:!0});new Float32Array(o.getMappedRange()).set(r),o.unmap();let a=e.indices instanceof Uint32Array,s=Math.ceil(e.indices.byteLength/4)*4,g=this.device.createBuffer({size:Math.max(4,s),usage:GPUBufferUsage.INDEX|GPUBufferUsage.COPY_DST,mappedAtCreation:!0});return a?new Uint32Array(g.getMappedRange()).set(e.indices):new Uint16Array(g.getMappedRange()).set(e.indices),g.unmap(),t={vertexBuffer:o,indexBuffer:g,indexCount:e.indices.length,indexFormat:a?"uint32":"uint16"},this.meshBuffersCache.set(e,t),t}deformMesh(e,t,n){let r=this.getOrCreateMeshBuffers(t),i=t.positions.length/3;return{vertexBuffer:this.audioMeshDeformPipeline.execute(e,r.vertexBuffer,{config:n.config,audioLatentBuffer:n.latentBuffer,vertexCount:i,timeMs:n.timeMs,sampleRate:n.sampleRate}),indexBuffer:r.indexBuffer,indexCount:r.indexCount,indexFormat:r.indexFormat}}drawMesh3D(e,t,n,r,i,o={},a=!1){let s="vertexBuffer"in r?r:this.getOrCreateMeshBuffers(r),{opacity:g=1,colorTint:l=[1,1,1,1],twoSided:I=!0,wireframe:B=!1,isSkinned:E=!1,skinningMatrices:Q,material:C="lit",shadeColor:p,alphaCutoff:h,textureWrap:d="clamp",shininess:D=32,roughness:x,specularIntensity:G=.5,ambientIntensity:M=1,metallic:w}=o,b=this.meshModelMatrix(o),N=o.normalMatrix??qA.computeNormalMatrix(b),U=to[d],L=this.samplerCache.getSampler(this.device,{addressModeU:U,addressModeV:U});this.mesh3dPipeline.draw(e,t,n,s,i,L,{modelMatrix:b,normalMatrix:N,colorTint:l,opacity:g,twoSided:I,wireframe:B,isSkinned:E,skinningMatrices:Q,material:C,shadeColor:p,alphaCutoff:h,shininess:D,roughness:x,specularIntensity:G,ambientIntensity:M,metallic:w,emissive:o.emissive,emissiveIntensity:o.emissiveIntensity,matte:o.matte,maps:o.maps},a,this.passWritesHdr)}loadModel(e,t="auto",n={}){if(typeof e!="string")return hr(e,t,n);let r=`${t}|${JSON.stringify(n)}|${e}`,i=this.modelCache.get(r);return i||(i=hr(e,t,n),this.modelCache.set(r,i)),i}materialTexture(e){let t=this.materialTextures.get(e);return t||(t=this.uploadMaterialTexture(e),this.materialTextures.set(e,t)),t}materialMaps(e){let t=this.materialMapCache.get(e);return t||(t=(async()=>{let n=e.name,[r,i,o,a]=await Promise.all([this.uploadImage(e.normalTextureBuffer,`${n}:normal`),this.uploadImage(e.metallicRoughnessTextureBuffer,`${n}:metallicRoughness`),this.uploadImage(e.occlusionTextureBuffer,`${n}:occlusion`),this.uploadImage(e.emissiveTextureBuffer,`${n}:emissive`)]);return{...r&&{normal:r,normalScale:e.normalScale??1},...i&&{metallicRoughness:i},...o&&{occlusion:o,occlusionStrength:e.occlusionStrength??1},...a&&{emissive:a}}})(),this.materialMapCache.set(e,t)),t}uploadMaterialTexture(e){return this.uploadImage(e.diffuseTextureBuffer,`Material:${e.name}`)}async uploadImage(e,t){if(!e)return;let n=(await import("./sharp-V6ZTBNDW.mjs")).default,r=Buffer.from(e instanceof Uint8Array?e:new Uint8Array(e)),{width:i,height:o}=await n(r).metadata();if(!i||!o)return;let a=Math.floor(Math.log2(Math.max(i,o)))+1,s=this.device.createTexture({label:t,size:{width:i,height:o},mipLevelCount:a,format:"rgba8unorm",usage:GPUTextureUsage.TEXTURE_BINDING|GPUTextureUsage.COPY_DST});for(let g=0;g<a;g++){let l=Math.max(1,i>>g),I=Math.max(1,o>>g),B=await n(r).ensureAlpha().resize(l,I,{fit:"fill"}).raw().toBuffer();this.device.queue.writeTexture({texture:s,mipLevel:g},B,{bytesPerRow:l*4,rowsPerImage:I},{width:l,height:I})}return s}applyBloom(e,t,n,r={},i){this.bloomPipeline??=new ut(this.device),this.bloomPipeline.apply(e,t,n,r,i??void 0)}applyDepthOfField(e,t,n,r,i){let o=this.samplerCache.getSampler(this.device),a=this.device.createBindGroup({layout:this.dofBindGroupLayout,entries:[{binding:0,resource:{buffer:i}},{binding:1,resource:o},{binding:2,resource:t.createView()},{binding:3,resource:n.createView()}]}),s=e.beginRenderPass({colorAttachments:[{view:r,loadOp:"clear",storeOp:"store",clearValue:{r:0,g:0,b:0,a:0}}]});s.setPipeline(this.dofPipeline),s.setBindGroup(0,a),s.draw(3),s.end()}destroy(){this.bloomPipeline?.destroy(),this.depthTexture?.destroy(),this.shadowTexture?.destroy(),this.placeholderShadowTexture?.destroy(),this.linearDepthTexture?.destroy(),this.msaaColorTexture?.destroy(),this.msaaLinearDepthTexture?.destroy(),this.msaaHdrTexture?.destroy(),this.hdrTexture?.destroy(),this.quad3dPipeline.destroy(),this.slug3dPipeline.destroy(),this.mesh3dPipeline.destroy(),this.cameraPool.destroy(),this.lightsPool.destroy(),this.cameraUniformBindGroupCache.destroy()}};function hr(A,e="auto",t={}){if(e==="gltf"||e==="glb")return st(A,t);if(e==="stl")return Se(A,t);if(e==="ply")return ve(A,t);if(e==="vox")return gt(A,t);if(e==="3ds")return lt(A,t);if(e==="off")return It(A,t);if(e==="fbx")return Fe(A,t);if(e==="obj")return Ne(A,void 0,t);let n=typeof A!="string",r=typeof A=="string"?A.trim():"",i=r.toLowerCase();if(i.endsWith(".glb")||i.endsWith(".gltf"))return st(A,t);if(i.endsWith(".stl"))return Se(A,t);if(i.endsWith(".ply"))return ve(A,t);if(i.endsWith(".vox"))return gt(A,t);if(i.endsWith(".3ds"))return lt(A,t);if(i.endsWith(".off"))return It(A,t);if(i.endsWith(".fbx"))return Fe(A,t);if(i.endsWith(".obj"))return Ne(A,void 0,t);if(n){let o=A instanceof Uint8Array?A:new Uint8Array(A);return ce.isGlb(o)?lr(o,t):re.isBinary(o)?Fe(o,t):Le.isVox(o)?gt(o,t):ke.is3DS(o)?lt(o,t):o.length>=3&&o[0]===112&&o[1]===108&&o[2]===121?ve(o,t):Ue.isBinary(o)?Se(o,t):Ne(o,void 0,t)}return r.startsWith("{")&&(r.includes('"asset"')||r.includes('"meshes"'))?st(r,t):r.startsWith("ply")||r.startsWith("PLY")?ve(r,t):r.startsWith("OFF")||r.startsWith("NOFF")||r.startsWith("COFF")?It(r,t):r.includes("FBXHeaderExtension")||r.includes("Kaydara FBX")?Fe(r,t):r.startsWith("solid")&&r.includes("facet")?Se(r,t):Ne(A,void 0,t)}v();var{cbrt:An,sqrt:en,PI:he}=Math,ro=(A,e,t,n,r)=>{let i=e+t*A,o=i**2+n;if(o>0){let l=en(o);return An(i+l)+An(i-l)-r}let a=An(en(i*i-o)),s=i?Math.atan(en(-o)/i):-he/2,g;return t<0?g=(i>0?2*he:he)-s:r<0?g=(i>0?2*he:-3*he)+s:g=(i>0?0:he)+s,2*a*Math.cos(g/3)-r},io=(A,e,t,n)=>((e*A+3*t)*A+n)*A,tn=A=>A;function pr(A,e,t,n){if(!(0<=A&&A<=1&&0<=t&&t<=1))throw new Error("bezier x values must be in [0, 1] range");if(A===e&&t===n)return tn;let r=6*(3*A-3*t+1),i=6*(t-2*A),o=3*A,a=r*r,s=i*i,g=i/r,l=3*i*o/a-s*i/(a*r),I=2*o/r-s/a,B=I*I*I,E=3/r,Q=3*e-3*n+1,C=n-2*e,p=3*e,h=r?ro:tn;return function(D){return D===0||D===1?D:io(h(D,l,E,B,g),Q,C,p)}}var rl={linear:tn,ease:pr(.25,.1,.25,1),quad:A=>A*A,cubic:A=>A*A*A,poly:A=>e=>e**A,sin:A=>1-Math.cos(A*Math.PI/2),circle:A=>1-Math.sqrt(1-A*A),exp:A=>2**(10*(A-1)),elastic:(A=1)=>{let e=A*Math.PI;return t=>1-Math.cos(t*Math.PI/2)**3*Math.cos(t*e)},back:(A=1.70158)=>e=>e*e*((A+1)*e-A),bounce:A=>{if(A<1/2.75)return 7.5625*A*A;if(A<2/2.75){let t=A-.5454545454545454;return 7.5625*t*t+.75}if(A<2.5/2.75){let t=A-.8181818181818182;return 7.5625*t*t+.9375}let e=A-2.625/2.75;return 7.5625*e*e+.984375},bezier:pr,in:A=>A,out:A=>e=>1-A(1-e),inOut:A=>e=>e<.5?A(e*2)/2:1-A((1-e)*2)/2};function yr(A,e,t,n){let r=n?.extrapolateLeft??"extend",i=n?.extrapolateRight??"extend";if(e.length!==t.length)throw new Error("inputRange and outputRange must have the same length");if(e.length<2)throw new Error("inputRange must have at least 2 elements");let o=e[0],a=e[e.length-1];if(A<o){if(r==="clamp")return t[0];if(r==="identity")return A}if(A>a){if(i==="clamp")return t[t.length-1];if(i==="identity")return A}let s=1;for(;s<e.length-1&&!(A<e[s]);s++);let g=e[s-1],l=e[s],I=t[s-1],B=t[s];if(g===l)return I;let E=(A-g)/(l-g);return n?.easing&&(E=n.easing(E)),I+E*(B-I)}v();var oo={damping:10,mass:1,stiffness:100,overshootClamping:!1},nn={};function ao({animation:A,now:e,config:t}){let{toValue:n,lastTimestamp:r,current:i,velocity:o}=A,a=Math.min(e-r,64);if(t.damping<=0)throw new Error("Spring damping must be greater than 0, otherwise the spring() animation will never end, causing an infinite loop.");if(t.stiffness<=0)throw new Error("Spring stiffness must be greater than 0.");if(t.mass<=0)throw new Error("Spring mass must be greater than 0.");let s=t.damping,g=t.mass,l=t.stiffness,I=[n,r,i,o,s,g,l,e].join("-");if(nn[I])return nn[I];let B=-o,E=n-i,Q=s/(2*Math.sqrt(l*g)),C=Math.sqrt(l/g),p=C*Math.sqrt(1-Q**2),h=a/1e3,d=Math.sin(p*h),D=Math.cos(p*h),x=Math.exp(-Q*C*h),G=x*(d*((B+Q*C*E)/p)+E*D),M=n-G,w=Q*C*G-x*(D*(B+Q*C*E)-p*E*d),b=Math.exp(-C*h),N=n-b*(E+(B+C*E)*h),U=b*(B*(h*C-1)+h*E*C*C),L={toValue:n,prevPosition:i,lastTimestamp:e,current:Q<1?M:N,velocity:Q<1?w:U};return nn[I]=L,L}var rn={};function Dr({frame:A,fps:e,config:t={}}){let i=[A,e,t.damping,t.mass,t.overshootClamping,t.stiffness].join("-");if(rn[i])return rn[i];let o={lastTimestamp:0,current:0,toValue:1,velocity:0,prevPosition:0},a=Math.max(0,A),s=a%1;for(let g=0;g<=Math.floor(a);g++){g===Math.floor(a)&&(g+=s);let l=g/e*1e3;o=ao({animation:o,now:l,config:{...oo,...t}})}return rn[i]=o,o}var on=new Map;function so({fps:A,config:e={},threshold:t=.005}){if(typeof t!="number")throw new TypeError(`threshold must be a number, got ${t}`);if(t===0)return 1/0;if(t===1)return 0;if(Number.isNaN(t))throw new TypeError("Threshold is NaN");if(!Number.isFinite(t))throw new TypeError("Threshold is not finite");if(t<0)throw new TypeError("Threshold is below 0");let n=[A,e.damping,e.mass,e.overshootClamping,e.stiffness,t].join("-");if(on.has(n))return on.get(n);let r=0,i=0,o=()=>Dr({fps:A,frame:r,config:e}),a=o(),s=()=>Math.abs(a.current-a.toValue),g=s();for(;g>=t;)r++,a=o(),g=s();i=r;for(let l=0;l<20;l++)r++,a=o(),g=s(),g>=t&&(l=0,i=r+1);return on.set(n,i),i}function sl({frame:A,fps:e,config:t={},from:n=0,to:r=1,durationInFrames:i,durationRestThreshold:o,delay:a=0,reverse:s=!1}){let g=s||typeof i<"u",l=g?so({fps:e,config:t,threshold:o}):void 0,I=g?{get:()=>l}:{get:()=>{throw new Error("did not calculate natural duration")}},E=(s?(i??I.get())-A:A)+(s?a:-a),Q=i===void 0?E:E/(i/I.get());if(i&&E>i)return r;let C=Dr({fps:e,frame:Q,config:t}),p=t.overshootClamping?r>=n?Math.min(C.current,r):Math.max(C.current,r):C.current;return n===0&&r===1?p:yr(p,[0,1],[n,r])}v();v();v();v();var Te=new Set,an=!1;function Bn(A,e,t=2){let n=e&&e.length,r=n?e[0]*t:A.length;Te.size&&Te.clear();let i=Mr(A,0,r,t,!0),o=[];if(!i||i.next===i.prev)return o;let a=0,s=0,g=0;if(n&&(i=co(A,e,i,t)),A.length>80*t){a=A[0],s=A[1];let l=a,I=s;for(let B=t;B<r;B+=t){let E=A[B],Q=A[B+1];E<a&&(a=E),Q<s&&(s=Q),E>l&&(l=E),Q>I&&(I=Q)}g=Math.max(l-a,I-s),g=g!==0?32767/g:0}return sn(i,o,a,s,g),o}function Mr(A,e,t,n,r){let i=null;if(r===xo(A,e,t,n)>0)for(let o=e;o<t;o+=n)i=xr(o/n|0,A[o],A[o+1],i);else for(let o=t-n;o>=e;o-=n)i=xr(o/n|0,A[o],A[o+1],i);return i&&Je(i,i.next)&&(Ke(i),i=i.next),i}function ae(A,e=A){let t=e===A,n=A,r;do r=!1,n!==n.next&&(Te.size===0||!Te.has(n))&&(Je(n,n.next)||MA(n.prev,n,n.next)===0)?((t||n===e)&&(e=n.prev),an=!0,Ke(n),n=n.prev,r=!0):(t||n!==e)&&(n=n.next,r=!t);while(r||n!==e);return e}function sn(A,e,t,n,r){r&&ho(A,t,n,r);let i=A,o=!1;for(;A.prev!==A.next;){let a=A.prev,s=A.next;if(MA(a,A,s)<0&&(r?lo(A,t,n,r):go(A))){e.push(a.i,A.i,s.i),Ke(A),A=s,i=s;continue}if(A=s,A===i){if(an=!1,A=ae(A),an){i=A;continue}if(!o){A=Io(A,e),i=A,o=!0;continue}uo(A,e,t,n,r);break}}}function go(A){let e=A.prev,t=A,n=A.next,r=e.x,i=t.x,o=n.x,a=e.y,s=t.y,g=n.y,l=Math.min(r,i,o),I=Math.min(a,s,g),B=Math.max(r,i,o),E=Math.max(a,s,g),Q=n.next;for(;Q!==e;){if(Q.x>=l&&Q.x<=B&&Q.y>=I&&Q.y<=E&&!(r===Q.x&&a===Q.y)&&yt(r,a,i,s,o,g,Q.x,Q.y)&&MA(Q.prev,Q,Q.next)>=0)return!1;Q=Q.next}return!0}function lo(A,e,t,n){let r=A.prev,i=A,o=A.next,a=r.x,s=i.x,g=o.x,l=r.y,I=i.y,B=o.y,E=Math.min(a,s,g),Q=Math.min(l,I,B),C=Math.max(a,s,g),p=Math.max(l,I,B),h=un(E,Q,e,t,n),d=un(C,p,e,t,n),D=A.prevZ;for(;D&&D.z>=h;){if(D.x>=E&&D.x<=C&&D.y>=Q&&D.y<=p&&D!==o&&!(a===D.x&&l===D.y)&&yt(a,l,s,I,g,B,D.x,D.y)&&MA(D.prev,D,D.next)>=0)return!1;D=D.prevZ}let x=A.nextZ;for(;x&&x.z<=d;){if(x.x>=E&&x.x<=C&&x.y>=Q&&x.y<=p&&x!==o&&!(a===x.x&&l===x.y)&&yt(a,l,s,I,g,B,x.x,x.y)&&MA(x.prev,x,x.next)>=0)return!1;x=x.nextZ}return!0}function Io(A,e){let t=A,n=!1;do{let r=t.prev,i=t.next.next;Fr(r,t,t.next,i,!1)&&Oe(r,i)&&Oe(i,r)&&(e.push(r.i,t.i,i.i),Ke(t),Ke(t.next),t=A=i,n=!0),t=t.next}while(t!==A);return n?ae(t):t}function uo(A,e,t,n,r){let i=A;do{let o=i.next.next;for(;o!==i.prev;){if(i.i!==o.i&&Do(i,o)){let a=Ur(i,o);i=ae(i,i.next),a=ae(a,a.next),sn(i,e,t,n,r),sn(a,e,t,n,r);return}o=o.next}i=i.next}while(i!==A)}var gn=!1;function co(A,e,t,n){let r=[];for(let i=0,o=e.length;i<o;i++){let a=e[i]*n,s=i<o-1?e[i+1]*n:A.length,g=Mr(A,a,s,n,!1);g===g.next&&Te.add(g),r.push(yo(g))}r.sort(Bo),Qo(A.length/n,e.length),Nr(t,t),gn=!0;for(let i=0;i<r.length;i++)t=Eo(r[i],t);return gn=!1,ae(t)}function Bo(A,e){return A.x-e.x||A.y-e.y||(A.next.y-A.y)/(A.next.x-A.x)-(e.next.y-e.y)/(e.next.x-e.x)}function Eo(A,e){let t=fo(A,e);if(!t)return e;let n=Ur(t,A),r=n.next;return Nr(t,r.next),ae(n,n.next),ae(t,t.next)}var Gr=16,wA=new Float64Array(0),pt=0,ln=[],In=[];function Qo(A,e){let t=Math.ceil((A+2*e)/Gr)+e+2;wA.length<t*4&&(wA=new Float64Array(t*4)),pt=0}function Nr(A,e){let t=A;do{let n=pt++;ln[n]=t;let r=t.x,i=t.y,o=t.x,a=t.y,s=0;do{let l=t.next;t.z=n,l.x<r&&(r=l.x),l.x>o&&(o=l.x),l.y<i&&(i=l.y),l.y>a&&(a=l.y),t=l}while(++s<Gr&&t!==e);In[n]=t;let g=n*4;wA[g]=r,wA[g+1]=i,wA[g+2]=o,wA[g+3]=a}while(t!==e)}function Co(A,e){let t=A.z*4;e.x<wA[t]&&(wA[t]=e.x),e.y<wA[t+1]&&(wA[t+1]=e.y),e.x>wA[t+2]&&(wA[t+2]=e.x),e.y>wA[t+3]&&(wA[t+3]=e.y)}function br(A){let e=In[A];for(;e.prev.next!==e;)e=e.next;return In[A]=e,e}function wr(A){let e=ln[A];for(;e.prev.next!==e;)e=e.next;return ln[A]=e,e}function fo(A,e){let t=e,n=A.x,r=A.y,i=-1/0,o;if(Je(A,t))return t;for(let B=0,E=0;B<pt;B++,E+=4){if(r<wA[E+1]||r>wA[E+3]||wA[E]>n||wA[E+2]<=i)continue;let Q=br(B);t=wr(B);do{if(t.prev.next===t){if(Je(A,t.next))return t.next;if(r<=t.y&&r>=t.next.y&&t.next.y!==t.y){let C=t.x+(r-t.y)*(t.next.x-t.x)/(t.next.y-t.y);if(C<=n&&C>i&&(i=C,o=t.x<t.next.x?t:t.next,C===n))return o}}t=t.next}while(t!==Q)}if(!o)return null;let a=o.x,s=o.y,g=Math.min(r,s),l=Math.max(r,s),I=1/0;for(let B=0,E=0;B<pt;B++,E+=4){if(wA[E+2]<a||wA[E]>n||wA[E+3]<g||wA[E+1]>l)continue;let Q=br(B);t=wr(B);do{if(t.prev.next===t&&n>=t.x&&t.x>=a&&n!==t.x&&yt(r<s?n:i,r,a,s,r<s?i:n,r,t.x,t.y)){let C=Math.abs(r-t.y)/(n-t.x);(Oe(t,A)||t.y===r&&t.next.y===r&&t.next.x>n)&&(C<I||C===I&&(t.x>o.x||t.x===o.x&&mo(o,t)))&&(o=t,I=C)}t=t.next}while(t!==Q)}return o}function mo(A,e){return MA(A.prev,A,e.prev)<0&&MA(e.next,A,A.next)<0}var FA=[],pe=[],oe=new Uint32Array(0),Pe=new Uint32Array(0),He=new Uint32Array(256);function ho(A,e,t,n){let r=A,i=0;do r.z=un(r.x,r.y,e,t,n),FA[i++]=r,r=r.next;while(r!==A);po(i);let o=null;for(let a=0;a<i;a++){let s=FA[a];s.prevZ=o,o&&(o.nextZ=s),o=s}o.nextZ=null,FA.fill(null,0,i),pe.fill(null,0,i)}function po(A){if(A<=32){for(let e=1;e<A;e++){let t=FA[e],n=t.z,r=e-1;for(;r>=0&&FA[r].z>n;)FA[r+1]=FA[r],r--;FA[r+1]=t}return}oe.length<A&&(oe=new Uint32Array(A),Pe=new Uint32Array(A),pe=new Array(A));for(let e=0;e<A;e++)oe[e]=FA[e].z;mt(A,FA,oe,pe,Pe,0),mt(A,pe,Pe,FA,oe,8),mt(A,FA,oe,pe,Pe,16),mt(A,pe,Pe,FA,oe,24)}function mt(A,e,t,n,r,i){He.fill(0);for(let a=0;a<A;a++)He[t[a]>>>i&255]++;let o=0;for(let a=0;a<256;a++){let s=He[a];He[a]=o,o+=s}for(let a=0;a<A;a++){let s=t[a],g=He[s>>>i&255]++;n[g]=e[a],r[g]=s}}function un(A,e,t,n,r){return A=(A-t)*r|0,e=(e-n)*r|0,A=(A|A<<8)&16711935,A=(A|A<<4)&252645135,A=(A|A<<2)&858993459,A=(A|A<<1)&1431655765,e=(e|e<<8)&16711935,e=(e|e<<4)&252645135,e=(e|e<<2)&858993459,e=(e|e<<1)&1431655765,A|e<<1}function yo(A){let e=A,t=A;do(e.x<t.x||e.x===t.x&&e.y<t.y)&&(t=e),e=e.next;while(e!==A);return t}function yt(A,e,t,n,r,i,o,a){return(r-o)*(e-a)>=(A-o)*(i-a)&&(A-o)*(n-a)>=(t-o)*(e-a)&&(t-o)*(i-a)>=(r-o)*(n-a)}function Do(A,e){let t=Je(A,e)&&MA(A.prev,A,A.next)>0&&MA(e.prev,e,e.next)>0;return A.next.i!==e.i&&(t||Oe(A,e)&&Oe(e,A)&&(MA(A.prev,A,e.prev)!==0||MA(A,e.prev,e)!==0))&&!bo(A,e)&&(t||wo(A,e))}function MA(A,e,t){return(e.y-A.y)*(t.x-e.x)-(e.x-A.x)*(t.y-e.y)}function Je(A,e){return A.x===e.x&&A.y===e.y}function Fr(A,e,t,n,r=!0){let i=MA(A,e,t),o=MA(A,e,n),a=MA(t,n,A),s=MA(t,n,e);return(i>0&&o<0||i<0&&o>0)&&(a>0&&s<0||a<0&&s>0)?!0:r?!!(i===0&&ht(A,t,e)||o===0&&ht(A,n,e)||a===0&&ht(t,A,n)||s===0&&ht(t,e,n)):!1}function ht(A,e,t){return e.x<=Math.max(A.x,t.x)&&e.x>=Math.min(A.x,t.x)&&e.y<=Math.max(A.y,t.y)&&e.y>=Math.min(A.y,t.y)}function bo(A,e){let t=Math.min(A.x,e.x),n=Math.max(A.x,e.x),r=Math.min(A.y,e.y),i=Math.max(A.y,e.y),o=A;do{let a=o.next;if(o.x>n&&a.x>n||o.x<t&&a.x<t||o.y>i&&a.y>i||o.y<r&&a.y<r){o=a;continue}if(o.i!==A.i&&a.i!==A.i&&o.i!==e.i&&a.i!==e.i&&Fr(o,a,A,e))return!0;o=a}while(o!==A);return!1}function Oe(A,e){return MA(A.prev,A,A.next)<0?MA(A,e,A.next)>=0&&MA(A,A.prev,e)>=0:MA(A,e,A.prev)<0||MA(A,A.next,e)<0}function wo(A,e){let t=A,n=!1,r=(A.x+e.x)/2,i=(A.y+e.y)/2;do{let o=t.next;t.y>i!=o.y>i&&r<(o.x-t.x)*(i-t.y)/(o.y-t.y)+t.x&&(n=!n),t=o}while(t!==A);return n}function Ur(A,e){let t=cn(A.i,A.x,A.y),n=cn(e.i,e.x,e.y),r=A.next,i=e.prev;return A.next=e,e.prev=A,t.next=r,r.prev=t,n.next=t,t.prev=n,i.next=n,n.prev=i,n}function xr(A,e,t,n){let r=cn(A,e,t);return n?(r.next=n.next,r.prev=n,n.next.prev=r,n.next=r):(r.prev=r,r.next=r),r}function Ke(A){A.next.prev=A.prev,A.prev.next=A.next,A.prevZ&&(A.prevZ.nextZ=A.nextZ),A.nextZ&&(A.nextZ.prevZ=A.prevZ),gn&&Co(A.prev,A.next)}function cn(A,e,t){return{i:A,x:e,y:t,prev:null,next:null,z:0,prevZ:null,nextZ:null}}function xo(A,e,t,n){let r=0;for(let i=e,o=t-n;i<t;i+=n)r+=(A[o]-A[i])*(A[i+1]+A[o+1]),o=i;return r}var vr=Hn(mi(),1);function Dt(A){let e=A.trim();if(e.startsWith("#")){let t=e.slice(1);if(t.length===3){let n=Number.parseInt(t[0]+t[0],16)/255,r=Number.parseInt(t[1]+t[1],16)/255,i=Number.parseInt(t[2]+t[2],16)/255;return[n,r,i,1]}if(t.length===6){let n=Number.parseInt(t.slice(0,2),16)/255,r=Number.parseInt(t.slice(2,4),16)/255,i=Number.parseInt(t.slice(4,6),16)/255;return[n,r,i,1]}if(t.length===8){let n=Number.parseInt(t.slice(0,2),16)/255,r=Number.parseInt(t.slice(2,4),16)/255,i=Number.parseInt(t.slice(4,6),16)/255,o=Number.parseInt(t.slice(6,8),16)/255;return[n,r,i,o]}}if(e.startsWith("rgb")){let t=e.replace(/rgba?\(/,"").replace(/\)/,"").split(",").map(a=>Number.parseFloat(a.trim())),n=(t[0]??0)/255,r=(t[1]??0)/255,i=(t[2]??0)/255,o=t[3]!==void 0?t[3]:1;return[n,r,i,o]}return[1,1,1,1]}function Ye(A){let e=0,t=A.length;for(let n=0;n<t;n++){let r=(n+1)%t;e+=A[n].x*A[r].y-A[r].x*A[n].y}return e/2}function bt(A,e){let t=!1,n=e.length;for(let r=0,i=n-1;r<n;i=r++){let o=e[r].x,a=e[r].y,s=e[i].x,g=e[i].y;a>A.y!=g>A.y&&A.x<(s-o)*(A.y-a)/(g-a)+o&&(t=!t)}return t}var Mo=.1,Go=64;function Rr(A,e){if(e.segments!==void 0)return e.segments;let t=Math.ceil(Math.sqrt(A/(8*e.tolerance)));return Math.min(Go,Math.max(1,t))}function No(A,e,t,n,r){let i=Rr(2*Math.hypot(A.x-2*e.x+t.x,A.y-2*e.y+t.y),n);for(let o=1;o<=i;o++){let a=o/i,s=1-a;r.push({x:s*s*A.x+2*s*a*e.x+a*a*t.x,y:s*s*A.y+2*s*a*e.y+a*a*t.y})}}function Fo(A,e,t,n,r,i){let o=Rr(6*Math.max(Math.hypot(A.x-2*e.x+t.x,A.y-2*e.y+t.y),Math.hypot(e.x-2*t.x+n.x,e.y-2*t.y+n.y)),r);for(let a=1;a<=o;a++){let s=a/o,g=1-s;i.push({x:g*g*g*A.x+3*g*g*s*e.x+3*g*s*s*t.x+s*s*s*n.x,y:g*g*g*A.y+3*g*g*s*e.y+3*g*s*s*t.y+s*s*s*n.y})}}function Uo(A){try{let e=new vr.Path2D(A).simplify().edges;return Array.isArray(e)?e:null}catch{return null}}function So(A,e,t,n,r){let i=A.path?.toSVG();if(!i)return{contours:[],simplified:!0};let o=Uo(i),a=o!==null;o??=(A.path?.commands??[]).map(B=>[B.command,...B.args]);let s=[],g={x:0,y:0},l=[],I=()=>{if(l.length>=3){let B=l[0],E=l[l.length-1];Math.hypot(E.x-B.x,E.y-B.y)<1e-4&&l.pop(),l.length>=3&&s.push(l)}l=[]};for(let B of o){let E=B[0],Q=B.slice(1);if(E==="moveTo")I(),g={x:(e+Q[0])*n,y:-(t+Q[1])*n},l=[g];else if(E==="lineTo")g={x:(e+Q[0])*n,y:-(t+Q[1])*n},l.push(g);else if(E==="quadraticCurveTo"){let C={x:(e+Q[0])*n,y:-(t+Q[1])*n},p={x:(e+Q[2])*n,y:-(t+Q[3])*n};No(g,C,p,r,l),g=p}else if(E==="bezierCurveTo"){let C={x:(e+Q[0])*n,y:-(t+Q[1])*n},p={x:(e+Q[2])*n,y:-(t+Q[3])*n},h={x:(e+Q[4])*n,y:-(t+Q[5])*n};Fo(g,C,p,h,r,l),g=h}else E==="closePath"&&I()}return I(),{contours:s,simplified:a}}var vo=Math.cos(30*Math.PI/180);function Ro({contours:A,simplified:e}){if(!e)return Lo(A);let t=A.map(o=>({contour:o,area:Math.abs(Ye(o))}));t.sort((o,a)=>a.area-o.area);let n=t.map(()=>[]);for(let o=0;o<t.length;o++){let a=t[o].contour,s=a[Math.floor(a.length/2)];for(let g=0;g<o;g++){if(t[g].area<=t[o].area)continue;let l=t[g].contour;(bt(a[0],l)||bt(s,l))&&n[o].push(g)}}let r=[],i=new Map;for(let o=0;o<t.length;o++){let a=n[o];if(a.length%2===0){let s={outer:t[o].contour,holes:[]};r.push(s),i.set(o,s)}else i.get(a[a.length-1])?.holes.push(t[o].contour)}return r}function Lo(A){let e=A.map(r=>{let i=Ye(r);return{contour:r,signed:i,area:Math.abs(i)}});if(e.length===0)return[];e.sort((r,i)=>i.area-r.area);let t=Math.sign(e[0].signed),n=[];for(let r of e)Math.sign(r.signed)===t&&n.push({outer:r.contour,holes:[]});for(let r of e){if(Math.sign(r.signed)===t)continue;let i=r.contour[0],o=r.contour[Math.floor(r.contour.length/2)],a,s=Number.POSITIVE_INFINITY;for(let g of n){let l=Math.abs(Ye(g.outer));l>r.area&&l<s&&(bt(i,g.outer)||bt(o,g.outer))&&(a=g,s=l)}a?.holes.push(r.contour)}return n}var Sr=new WeakMap;function ko(A,e,t,n,r,i){let o=Sr.get(A);o||(o=new Map,Sr.set(A,o));let a=`${e.id}|${r}|${i.segments??""}|${i.tolerance}`,s=o.get(a);s||(s=Ro(So(e,0,0,r,i)),o.set(a,s));let g=t*r,l=-n*r,I=B=>B.map(E=>({x:E.x+g,y:E.y+l}));return s.map(B=>({outer:I(B.outer),holes:B.holes.map(I)}))}function El(A){let e=A.font,t=A.fontSize??48,n=A.depth??20,r=n/2,i={segments:A.curveSegments!==void 0?Math.max(2,A.curveSegments):void 0,tolerance:Math.max(.001,A.curveTolerance??Mo)},o=e.unitsPerEm||1e3,a=t/o,s=Vn(e,A.text.replace(/\n/g," "),{direction:A.direction,letterSpacing:A.letterSpacing?A.letterSpacing/a:0}),g=[];for(let X of s.glyphs){let V=e.getGlyph(X.glyphId),Z=ko(e,V,X.x,X.y,a,i);for(let mA of Z)g.push(mA)}let l=Number.POSITIVE_INFINITY,I=Number.NEGATIVE_INFINITY,B=Number.POSITIVE_INFINITY,E=Number.NEGATIVE_INFINITY;for(let X of g){for(let V of X.outer)V.x<l&&(l=V.x),V.x>I&&(I=V.x),V.y<B&&(B=V.y),V.y>E&&(E=V.y);for(let V of X.holes)for(let Z of V)Z.x<l&&(l=Z.x),Z.x>I&&(I=Z.x),Z.y<B&&(B=Z.y),Z.y>E&&(E=Z.y)}Number.isFinite(l)||(l=0,I=0,B=0,E=0);let Q=I-l,C=E-B,p=(s.baseLevel&1)===1,h=A.align==="start"?p?"right":"left":A.align==="end"?p?"left":"right":A.align,d=(l+I)/2;h==="left"&&(d=l),h==="right"&&(d=I);let D=(B+E)/2;A.verticalAlign==="top"&&(D=B),A.verticalAlign==="bottom"&&(D=E);for(let X of g){for(let V of X.outer)V.x-=d,V.y-=D;for(let V of X.holes)for(let Z of V)Z.x-=d,Z.y-=D}l-=d,I-=d,B-=D,E-=D;let x=[],G=[],M=[],w=[],b=[],N=[],U=[],L=[],F=(X,V,Z)=>{let mA=b.length/3;return b.push(X.x,X.y,r,X.x,X.y,-r),N.push(V.x,V.y,0,V.x,V.y,0),U.push(Z,0,Z,1),mA},J=X=>{let V=X.filter((k,eA)=>{let q=X[(eA+1)%X.length];return Math.hypot(q.x-k.x,q.y-k.y)>=1e-6}),Z=V.length;if(Z<2)return;let mA=[],$=V.map((k,eA)=>{let q=V[(eA+1)%Z],sA=Math.hypot(q.x-k.x,q.y-k.y);return mA.push(sA),{x:(q.y-k.y)/sA,y:-(q.x-k.x)/sA}}),lA=mA.reduce((k,eA)=>k+eA,0),IA=[],yA=[],AA=0;for(let k=0;k<Z;k++){let eA=$[(k-1+Z)%Z],q=$[k],sA=AA/lA,BA=eA.x+q.x,T=eA.y+q.y,oA=eA.x*q.x+eA.y*q.y>=vo?{x:BA/Math.hypot(BA,T),y:T/Math.hypot(BA,T)}:null;oA&&k>0?IA[k]=yA[k]=F(V[k],oA,sA):(yA[k]=F(V[k],oA??eA,k===0?1:sA),IA[k]=F(V[k],oA??q,sA)),AA+=mA[k]}for(let k=0;k<Z;k++){let eA=IA[k],q=yA[(k+1)%Z];L.push(eA,q+1,q),L.push(eA,eA+1,q+1)}};for(let X of g){let V=X.outer;Ye(V)<0&&V.reverse();for(let AA of X.holes)Ye(AA)>0&&AA.reverse();let Z=[],mA=[];for(let AA of V)Z.push(AA.x,AA.y);for(let AA of X.holes){mA.push(Z.length/2);for(let k of AA)Z.push(k.x,k.y)}let $=Bn(Z,mA,2),lA=Z.length/2,IA=x.length/3;for(let AA=0;AA<lA;AA++){let k=Z[AA*2],eA=Z[AA*2+1];x.push(k,eA,-r),G.push(0,0,-1),M.push((k-l)/(Q||1),(eA-B)/(C||1))}for(let AA=0;AA<$.length;AA+=3)w.push(IA+$[AA],IA+$[AA+2],IA+$[AA+1]);let yA=x.length/3;for(let AA=0;AA<lA;AA++){let k=Z[AA*2],eA=Z[AA*2+1];x.push(k,eA,r),G.push(0,0,1),M.push((k-l)/(Q||1),(eA-B)/(C||1))}for(let AA=0;AA<$.length;AA+=3)w.push(yA+$[AA],yA+$[AA+1],yA+$[AA+2]);J(V);for(let AA of X.holes)J(AA)}let W=Dt(A.fill??"#ffffff"),K=Dt(A.bevelColor??A.fill??"#ffffff"),aA={name:"front-material",diffuseColor:W,shading:A.material??"lit",shininess:A.shininess??32,roughness:A.roughness,metallic:A.metallic,twoSided:!0},j={name:"side-material",diffuseColor:K,shading:A.material??"lit",shininess:A.shininess??32,roughness:A.roughness,metallic:A.metallic,twoSided:!0},rA=[];return w.length>0&&rA.push({id:"text-front-mesh",name:"front",positions:new Float32Array(x),normals:new Float32Array(G),uvs:new Float32Array(M),indices:x.length/3>65535?new Uint32Array(w):new Uint16Array(w),materialName:"front-material"}),L.length>0&&rA.push({id:"text-side-mesh",name:"side",positions:new Float32Array(b),normals:new Float32Array(N),uvs:new Float32Array(U),indices:b.length/3>65535?new Uint32Array(L):new Uint16Array(L),materialName:"side-material"}),{modelData:{name:`extruded-text-${A.text}`,meshes:rA,materials:{"front-material":aA,"side-material":j},animations:[],bounds:{min:[l,B,-r],max:[I,E,r],center:[(l+I)/2,(B+E)/2,0],size:[Q,C,n],boundingSphereRadius:Math.hypot(Q,C,n)/2}},bounds:{minX:l,maxX:I,minY:B,maxY:E,width:Q,height:C,depth:n}}}var Qn=class{positions=[];normals=[];uvs=[];indices=[];vertex(e,t,n){return this.positions.push(e[0],e[1],e[2]),this.normals.push(t[0],t[1],t[2]),this.uvs.push(n[0],n[1]),this.positions.length/3-1}grid(e,t,n,r=!1){for(let i=0;i<n;i++)for(let o=0;o<t;o++){let a=e+i*(t+1)+o,s=a+1,g=a+t+1,l=g+1;r?this.indices.push(a,s,g,s,l,g):this.indices.push(a,g,s,s,g,l)}}build(e){let t=this.positions.length/3;return{id:`${e}-mesh`,name:e,positions:new Float32Array(this.positions),normals:new Float32Array(this.normals),uvs:new Float32Array(this.uvs),indices:t>65535?new Uint32Array(this.indices):new Uint16Array(this.indices),materialName:`${e}-material`}}};function Cn(A){let e=Math.hypot(A[0],A[1],A[2]);return e>1e-12?[A[0]/e,A[1]/e,A[2]/e]:[0,0,0]}function En(A,e,t){if(e<=0)return[-A,A];let n=A-e,r=[];for(let i=0;i<=t;i++)r.push(-n-e*Math.cos(i/t*Math.PI/2));for(let i=n>1e-9?0:1;i<=t;i++)r.push(n+e*Math.sin(i/t*Math.PI/2));return r}function Po(A,e){let t=A.width/2,n=A.height/2,r=A.depth/2,i=Math.max(0,Math.min(A.radius??0,t,n,r)),o=Math.max(1,Math.round(A.segments??4)),a=A.taper??1,s=t-i,g=n-i,l=r-i,I=En(t,i,o),B=En(n,i,o),E=En(r,i,o),Q=A.height>0?(1-a)/A.height:0,C=x=>a+Q*(x+n),p=(x,G)=>{let M=[Math.max(-s,Math.min(s,x[0])),Math.max(-g,Math.min(g,x[1])),Math.max(-l,Math.min(l,x[2]))],w=i>0?Cn([x[0]-M[0],x[1]-M[1],x[2]-M[2]]):G;w[0]===0&&w[1]===0&&w[2]===0&&(w=G);let b=[M[0]+w[0]*i,M[1]+w[1]*i,M[2]+w[2]*i];if(a===1)return{p:b,n:w};let N=C(b[1]);return{p:[b[0]*N,b[1],b[2]*N],n:Cn([w[0]/N,w[1]-b[0]*Q*w[0]/N-b[2]*Q*w[2]/N,w[2]/N])}},h=[{axis:2,sign:-1,u:0,v:1},{axis:2,sign:1,u:0,v:1},{axis:0,sign:-1,u:2,v:1},{axis:0,sign:1,u:2,v:1},{axis:1,sign:-1,u:0,v:2},{axis:1,sign:1,u:0,v:2}],d=[t,n,r],D=[I,B,E];for(let x of h){let G=D[x.u],M=D[x.v],w=[0,0,0];w[x.axis]=x.sign;let b=e.positions.length/3;for(let U=0;U<M.length;U++)for(let L=0;L<G.length;L++){let F=[0,0,0];F[x.axis]=x.sign*d[x.axis],F[x.u]=G[L],F[x.v]=M[U];let{p:J,n:W}=p(F,w);e.vertex(J,W,[(G[L]/d[x.u]+1)/2,(M[U]/d[x.v]+1)/2])}let N=(x.v+1)%3===x.u;e.grid(b,G.length-1,M.length-1,(N?1:-1)!==x.sign)}}function Ho(A,e){let t=Math.max(3,Math.round(A.segments??32)),n=Math.max(2,Math.round(t/2));for(let r=0;r<=n;r++){let i=r/n*Math.PI;for(let o=0;o<=t;o++){let a=o/t*Math.PI*2,s=[Math.sin(i)*Math.cos(a),-Math.cos(i),Math.sin(i)*Math.sin(a)];e.vertex([s[0]*A.radius,s[1]*A.radius,s[2]*A.radius],s,[o/t,r/n])}}e.grid(0,t,n)}function To(A,e){let t=Math.max(3,Math.round(A.segments??32)),n=A.radiusTop??A.radius??50,r=A.radiusBottom??A.radius??50,i=A.height/2,o=A.height>0?(r-n)/A.height:0;for(let a=0;a<=1;a++){let s=a===0?n:r,g=a===0?-i:i;for(let l=0;l<=t;l++){let I=l/t*Math.PI*2,B=Math.cos(I),E=Math.sin(I);e.vertex([B*s,g,E*s],Cn([B,-o,E]),[l/t,a])}}if(e.grid(0,t,1),!A.openEnded)for(let[a,s,g]of[[-i,n,-1],[i,r,1]]){if(s<=0)continue;let l=e.vertex([0,a,0],[0,g,0],[.5,.5]),I=e.positions.length/3;for(let B=0;B<=t;B++){let E=B/t*Math.PI*2,Q=Math.cos(E),C=Math.sin(E);e.vertex([Q*s,a,C*s],[0,g,0],[(Q+1)/2,(C+1)/2])}for(let B=0;B<t;B++)g<0?e.indices.push(l,I+B,I+B+1):e.indices.push(l,I+B+1,I+B)}}function Jo(A){let e=new Qn;if(A.type==="roundedBox")Po(A,e);else if(A.type==="sphere")Ho(A,e);else if(A.type==="cylinder")To(A,e);else throw new Error(`Unknown 3D primitive: ${A.type}`);let t=A.type,n=e.build(t),r={name:`${t}-material`,diffuseColor:Dt(A.color??"#ffffff"),shading:A.material??"lit",shininess:A.shininess??32,roughness:A.roughness,metallic:A.metallic},i=[Number.POSITIVE_INFINITY,Number.POSITIVE_INFINITY,Number.POSITIVE_INFINITY],o=[Number.NEGATIVE_INFINITY,Number.NEGATIVE_INFINITY,Number.NEGATIVE_INFINITY],a=n.positions;for(let g=0;g<a.length;g+=3)for(let l=0;l<3;l++){let I=a[g+l];I<i[l]&&(i[l]=I),I>o[l]&&(o[l]=I)}let s=[o[0]-i[0],o[1]-i[1],o[2]-i[2]];return{name:`primitive-${t}`,meshes:[n],materials:{[r.name]:r},animations:[],bounds:{min:i,max:o,center:[(i[0]+o[0])/2,(i[1]+o[1])/2,(i[2]+o[2])/2],size:s,boundingSphereRadius:Math.hypot(...s)/2}}}var wt=new Map;function dl(A){let e=JSON.stringify(A),t=wt.get(e);return t||(t=Jo(A),wt.size>512&&wt.clear(),wt.set(e,t)),t}var fn=new Map;function Oo(A,e){return JSON.stringify({text:A,...e})}function dn(A,e){let t=A?String(A):" ",n=Oo(t,e),r=fn.get(n);if(r)return r;let i=e.fontSize??48,o=e.fontFamily??"Inter";te.isFailed(o)&&(o="Inter");let a=e.letterSpacing??0,s=e.lineHeight!==void 0&&e.lineHeight<10?e.lineHeight*i:e.lineHeight??i*1.2,g=te.getFont(o,e.fontWeight,null),l=e.padding??0;if(!g){if(!te.isFailed(o)){let d=Jt(o);te.preloadSlugFont(null,o,d).catch(()=>{})}let E=t.split(`
1447
+ `),Q=0,C=e.width!==void 0?Math.max(10,e.width-l*2):0;for(let d of E)if(C>0){let D=d.length*i*.55+a*d.length,x=Math.max(1,Math.ceil(D/C));Q+=x}else Q+=1;let p=Math.max(0,t.length-1),h={width:e.width!==void 0?e.width:Math.ceil(t.length*i*.6+a*p)+l*2,height:e.height!==void 0?e.height:Math.ceil(Q*s)+l*2};return fn.set(n,h),h}let I=Wn.measure(t,g,i,a,s,e.width!==void 0?Math.max(0,e.width-l*2):void 0,e.spans,e.direction),B={width:e.width!==void 0&&!e.keepNaturalWidth?e.width:Math.ceil(I.width)+l*2,height:e.height!==void 0?e.height:Math.ceil(I.height)+l*2};return fn.set(n,B),B}function Dl(A,e){let t=e.fontFamily??"Inter";if(te.isFailed(t)&&(t="Inter"),te.isFailed(t))return Promise.resolve(dn(A,e));let n=Jt(t);return te.preloadSlugFont(null,t,n).then(()=>dn(A,e)).catch(()=>dn(A,e))}v();v();v();var Ko=(()=>{var A=import.meta.url;return(function(e){e=e||{};var t;t||(t=typeof e<"u"?e:{});var n,r;t.ready=new Promise(function(u,c){n=u,r=c});var i=Object.assign({},t),o="";typeof document<"u"&&document.currentScript&&(o=document.currentScript.src),A&&(o=A),o.indexOf("blob:")!==0?o=o.substr(0,o.replace(/[?#].*/,"").lastIndexOf("/")+1):o="";var a=t.print||console.log.bind(console),s=t.printErr||console.warn.bind(console);Object.assign(t,i),i=null;var g;t.wasmBinary&&(g=t.wasmBinary);var l=t.noExitRuntime||!0;typeof WebAssembly!="object"&&aA("no native wasm support detected");var I,B=!1;function E(u,c,f){f=c+f;for(var m="";!(c>=f);){var y=u[c++];if(!y)break;if(y&128){var S=u[c++]&63;if((y&224)==192)m+=String.fromCharCode((y&31)<<6|S);else{var P=u[c++]&63;y=(y&240)==224?(y&15)<<12|S<<6|P:(y&7)<<18|S<<12|P<<6|u[c++]&63,65536>y?m+=String.fromCharCode(y):(y-=65536,m+=String.fromCharCode(55296|y>>10,56320|y&1023))}}else m+=String.fromCharCode(y)}return m}var Q,C,p,h,d,D,x,G,M;function w(){var u=I.buffer;Q=u,t.HEAP8=C=new Int8Array(u),t.HEAP16=h=new Int16Array(u),t.HEAP32=D=new Int32Array(u),t.HEAPU8=p=new Uint8Array(u),t.HEAPU16=d=new Uint16Array(u),t.HEAPU32=x=new Uint32Array(u),t.HEAPF32=G=new Float32Array(u),t.HEAPF64=M=new Float64Array(u)}var b,N=[],U=[],L=[];function F(){var u=t.preRun.shift();N.unshift(u)}var J=0,W=null,K=null;function aA(u){throw t.onAbort&&t.onAbort(u),u="Aborted("+u+")",s(u),B=!0,u=new WebAssembly.RuntimeError(u+". Build with -sASSERTIONS for more info."),r(u),u}function j(u){return u.startsWith("data:application/octet-stream;base64,")}var rA;if(rA="data:application/octet-stream;base64,AGFzbQEAAAABugM3YAF/AGACf38AYAF/AX9gA39/fwBgAn98AGACf38Bf2ADf39/AX9gBH9/f30BfWADf398AGAAAGAEf39/fwBgAX8BfGACf38BfGAFf39/f38Bf2AAAX9gA39/fwF9YAZ/f31/fX8AYAV/f39/fwBgAn9/AX1gBX9/f319AX1gAX8BfWADf35/AX5gB39/f39/f38AYAZ/f39/f38AYAR/f39/AX9gBn9/f319fQF9YAR/f31/AGADf399AX1gBn98f39/fwF/YAR/fHx/AGACf30AYAh/f39/f39/fwBgDX9/f39/f39/f39/f38AYAp/f39/f39/f39/AGAFf39/f38BfGAEfHx/fwF9YA1/fX1/f399fX9/f39/AX9gB39/f319f38AYAJ+fwF/YAN/fX0BfWABfAF8YAN/fHwAYAR/f319AGAHf39/fX19fQF9YA1/fX99f31/fX19fX1/AX9gC39/f39/f399fX19AX9gCH9/f39/f319AGAEf39+fgBgB39/f39/f38Bf2ACfH8BfGAFf398fH8AYAN/f38BfGAEf39/fABgA39/fQBgBn9/fX99fwF/ArUBHgFhAWEAHwFhAWIAAwFhAWMACQFhAWQAFgFhAWUAEQFhAWYAIAFhAWcAAAFhAWgAIQFhAWkAAwFhAWoAAAFhAWsAFwFhAWwACgFhAW0ABQFhAW4AAwFhAW8AAQFhAXAAFwFhAXEABgFhAXIAAAFhAXMAIgFhAXQACgFhAXUADQFhAXYAFgFhAXcAAgFhAXgAAwFhAXkAGAFhAXoAAgFhAUEAAQFhAUIAEQFhAUMAAQFhAUQAAAOiAqACAgMSBwcACRkDAAoRBgYKEwAPDxMBBiMTCgcHGgMUASQFJRQHAwMKCgMmAQYYDxobFAAKBw8KBwMDAgkCAAAFGwACBwIHBgIDAQMIDAABKAkHBQURACkZASoAAAIrLAIALQcHBy4HLwkFCgMCMA0xAgMJAgACAQYKAQIBBQEACQIFAQEABQAODQ0GFQIBHBUGAgkCEAAAAAUyDzMMBQYINAUCAwUODg41AgMCAgIDBgICNgIBDAwMAQsLCwsLCx0CAAIAAAABABABBQICAQMCEgMMCwEBAQEBAQsLAQICAwICAgICAgIDAgIICAEICAgEBAQEBAQEBAQABAQABAQEBAAE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GiABQQA2AvADIAFCADcC6AMgAigC7AMiAyACKALoAyIERwRAIAMgBGsiBEEASA0FIAEgBBAeIgM2AuwDIAEgAzYC6AMgASADIARqNgLwAyACKALoAyIEIAIoAuwDIghHBEADQCADIAQoAgA2AgAgA0EEaiEDIARBBGoiBCAIRw0ACwsgASADNgLsAwsgASACKQL0AzcC9AMgASACKAKEBDYChAQgASACKQL8AzcC/AMgAUEANgLkAwsgBSABNgIAIAEgADYC5AMLIAZBAWohBiAFQQRqIgUgB0cNAAsLDwsQAgALUAACQAJAAkACQAJAIAIOBAQAAQIDCyAAIAEgAUEwahBDDwsgACABIAFBMGogAxBEDwsgACABIAFBMGoQQg8LECQACyAAIAEgAUEwaiADEEULcAIBfwF9IwBBEGsiBCQAIARBCGogACABQQJ0QdwlaigCACACEDZDAADAfyEFAkACQAJAIAQtAAxBAWsOAgABAgsgBCoCCCEFDAELIAQqAgggA5RDCtcjPJQhBQsgBEEQaiQAIAVDAAAAACAFIAVbGwt5AgF/AX0jAEEQayIDJAAgA0EIaiAAIAFBAnRB7CVqKAIAIAIQU0MAAMB/IQQCQAJAAkAgAy0ADEEBaw4CAAECCyADKgIIIQQMAQsgAyoCCEMAAAAAlEMK1yM8lCEECyADQRBqJAAgBEMAAAAAl0MAAAAAIAQgBFsbC1QAAkACQAJAAkACQCACDgQEAAECAwsgACABIAFBwgBqEEMPCyAAIAEgAUHCAGogAxBEDwsgACABIAFBwgBqEEIPCxAkAAsgACABIAFBwgBqIAMQRQsvACAAIAJFQQF0IgIgASADEGAgACACIAEQS5IgACACIAEgAxB/IAAgAiABEFKSkgvOAQIDfwJ9IwBBEGsiAyQAQQEhBCADQQhqIABB/ABqIgUgACABQQF0akH2AGoiAS8BABAfAkACQCADKgIIIgcgAioCACIGXARAIAcgB1sEQCACLQAEIQIMAgsgBiAGXCEECyACLQAEIQIgBEUNACADLQAMIAJB/wFxRg0BCyAFIAEgBiACEDkDQCAALQAAIgFBBHENASAAIAFBBHI6AAAgACgCECIBBEAgACABEQAACyAAQYCAgP4HNgKcASAAKALkAyIADQALCyADQRBqJAALzgECA38CfSMAQRBrIgMk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AWsOAgABAgsgBCoCCCEFDAELIAQqAgggA5RDCtcjPJQhBQsgBEEQaiQAIAVDAAAAACAFIAVbGwscACAAIAFBCCACpyACQiCIpyADpyADQiCIpxAVCwUAEFgACzkAIABFBEBBAA8LAn8gAUGAf3FBgL8DRiABQf8ATXJFBEBB/DtBGTYCAEF/DAELIAAgAToAAEEBCwvEAgACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCABQQlrDhIACgsMCgsCAwQFDAsMDAoLBwgJCyACIAIoAgAiAUEEajYCACAAIAEoAgA2AgAPCwALIAIgAigCACIBQQRqNgIAIAAgATIBADcDAA8LIAIgAigCACIBQQRqNgIAIAAgATMBADcDAA8LIAIgAigCACIBQQRqNgIAIAAgATAAADcDAA8LIAIgAigCACIBQQRqNgIAIAAgATEAADcDAA8LAAsgAiACKAIAQQdqQXhxIgFBCGo2AgAgACABKwMAOQMADwsgACACIAMRAQALDwsgAiACKAIAIgFBBGo2AgAgACABNAIANwMADwsgAiACKAIAIgFBBGo2AgAgACABNQIANwMADwsgAiACKAIAQQdqQXhxIgFBCGo2AgAgACABKQMANwMAC84BAgN/An0jAEEQayIDJABBASEEIANBCGogAEH8AGoiBSAAIAFBAXRqQegAaiIBLwEAEB8CQAJAIAMqAggiByACKgIAIgZcBEAgByAHWwRAIAItAAQhAgwCCyAGIAZcIQQLIAItAAQhAiAERQ0AIAMtAAwgAkH/AXFGDQELIAUgASAGIAIQOQNAIAAtAAAiAUEEcQ0BIAAgAUEEcjoAACAAKAIQIgEEQCAAIAERAAALIABBgICA/gc2ApwBIAAoAuQDIgANAAsLIANBEGokAAtdAQR/IAAoAgAhAgNAIAIsAAAiAxBXBEBBfyEEIAAgAkEBaiICNgIAIAFBzJmz5gBNBH9BfyADQTBrIgMgAUEKbCIEaiADIARB/////wdzShsFIAQLIQEMAQsLIAELrhQCEn8BfiMAQdAAayIIJAAgCCABNgJMIAhBN2ohFyAIQThqIRQCQAJAAkACQANAIAEhDSAHIA5B/////wdzSg0BIAcgDmohDgJAAkACQCANIgctAAAiCQRAA0ACQAJAIAlB/wFxIgFFBEAgByEBDAELIAFBJUcNASAH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IQEgAEIANwIEIAAgATYCACABIAA2AgQgAkEQaiQAIAALGwEBfyAABEAgACgCACIBBEAgARAjCyAAECMLC0kBAn9BBBAeIQFBIBAeIgBBADYCHCAAQoCAgICAgIDAPzcCFCAAQgA3AgwgAEEAOgAIIABBAzYCBCAAQQA2AgAgASAANgIAIAELIAAgAkEFR0EAIAIbRQRAQbgwIAMgBBBJDwsgAyAEEHALIgEBfiABIAKtIAOtQiCGhCAEIAARFQAiBUIgiKckASAFpwuoAQEFfyAAKAJUIgMoAgAhBSADKAIEIgQgACgCFCAAKAIcIgdrIgYgBCAGSRsiBgRAIAUgByAGECsaIAMgAygCACAGaiIFNgIAIAMgAygCBCAGayIENgIECyAEIAIgAiAESxsiBARAIAUgASAEECsaIAMgAygCACAEaiIFNgIAIAMgAygCBCAEazYCBAsgBUEAOgAAIAAgACgCLCIBNgIcIAAgATYCFCACCwQAQgALBABBAAuKBQIGfgJ/IAEgASgCAEEHakF4cSIBQRBqNgIAIAAhCSABKQMAIQMgASkDCCEGIwBBIGsiCCQAAkAgBkL///////////8AgyIEQoCAgICAgMCAPH0gBEKAgICAgIDA/8MAfVQEQCAGQgSGIANCPIiEIQQgA0L//////////w+DIgNCgYCAgICAgIAIWgRAIARCgYCAgICAgIDAAHwhAgwCCyAEQoCAgICAgICAQH0hAiADQoCAgICAgICACFINASACIARCAYN8IQIMAQsgA1AgBEKAgICAgIDA//8AVCAEQoCAgICAgMD//wBRG0UEQCAGQgSGIANCPIiEQv////////8Dg0KAgICAgICA/P8AhCECDAELQoCAgICAgID4/wAhAiAEQv///////7//wwBWDQBCACECIARCMIinIgBBkfcASQ0AIAMhAiAGQv///////z+DQoCAgICAgMAAhCIFIQcCQCAAQYH3AGsiAUHAAHEEQCACIAFBQGqthiEHQgAhAgwBCyABRQ0AIAcgAa0iBIYgAkHAACABa62IhCEHIAIgBIYhAgsgCCACNwMQIAggBzcDGAJAQYH4ACAAayIAQcAAcQRAIAUgAEFAaq2IIQNCACEFDAELIABFDQAgBUHAACAAa62GIAMgAK0iAoiEIQMgBSACiCEFCyAIIAM3AwAgCCAF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ASAAKAIAIQAgASACQQFxBH8gASgCACAAaigCAAUgAAsRCwALYQECfyMAQRBrIgIkACABIAAoAgQiA0EBdWohASAAKAIAIQAgAiABIANBAXEEfyABKAIAIABqKAIABSAACxEBAEEQEB4iACACKQMINwMIIAAgAikDADcDACACQRBqJAAgAAtjAQJ/IwBBEGsiAyQAIAEgACgCBCIEQQF1aiEBIAAoAgAhACADIAEgAiAEQQFxBH8gASgCACAAaigCAAUgAAsRAwBBEBAeIgAgAykDCDcDCCAAIAMpAwA3AwAgA0EQaiQAIAALNwEBfyABIAAoAgQiA0EBdWohASAAKAIAIQAgASACIANBAXEEfyABKAIAIABqKAIABSAACxEEAAs5AQF/IAEgACgCBCIEQQF1aiEBIAAoAgAhACABIAIgAyAEQQFxBH8gASgCACAAaigCAAUgAAsRCAALCQAgASAAEQIACwUAQcM7Cw8AIAEgACgCAGogAjYCAAsNACABIAAoAgBqKAIACxgBAX9BEBAeIgBCADcDCCAAQQA2AgAgAAsYAQF/QRAQHiIAQgA3AwAgAEIANwMIIAALDABBMBAeQQBBMBAqCzcBAX8gASAAKAIEIgNBAXVqIQEgACgCACEAIAEgAiADQQFxBH8gASgCACAAaigCAAUgAAsRHgALBQBBvjsLIQAgACABKAIAIAEgASwAC0EASBtBuzsgAigCABAQNgIACyoBAX9BDBAeIgFBADoABCABIAAoAgA2AgggAEEANgIAIAFB2Cc2AgAgAQsFAEG7OwsFAEG4OwshACAAIAEoAgAgASABLAALQQBIG0GkOyACKAIAEBA2AgAL2AEBBH8jAEEgayIDJAAgASgCACIEQfD///8HSQRAAkACQCAEQQtPBEAgBEEPckEBaiIFEB4hBiADIAVBgICAgHhyNgIQIAMgBjYCCCADIAQ2AgwgBCAGaiEFDAELIAMgBDoAEyADQQhqIgYgBGohBSAERQ0BCyAGIAFBBGogBBArGgsgBUEAOgAAIAMgAjYCACADQRhqIANBCGogAyAAEQMAIAMoAhgQHSADKAIYIgAQBiADKAIAEAYgAywAE0EASARAIAMoAggQIwsgA0EgaiQAIAAPCxACAAsqAQF/QQwQHiIBQQA6AAQgASAAKAIANgIIIABBADYCACABQeAmNgIA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AkEIaiAIIAYQHyACIAcgAC8AABAfQQEhAyACKgIIIgogAioCACILXAR/IAogClsNAyALIAtcBSADC0UNAiACLQAMIAItAARHDQILIABBAmohAEEBIQMgBCEGQQEhBCAGRQ0ACyABLwB6IgBBB3FFBEAgBS0AekEHcUUNAgsgCCAAECAiCiAHIAUvAHoQICILWw0BIAogClsNACALIAtcDQELIAFBFGogBUEUakHoABArGiABQfwAaiAFQfwAahCgAQNAIAEtAAAiAEEEcQ0BIAEgAEEEcjoAACABKAIQIgAEQCABIAARAAALIAFBgICA/gc2ApwBIAEoAuQDIgENAAsLIAJBEGokAAvGAwEEfyMAQaAEayICJAAgACgCBCEBIABBADYCBCABBEAgASABKAIAKAIEEQAACyAAKAIIIQEgAEEANgIIIAEEQCABIAEoAgAoAgQRAAALAkAgACgCACIAKALoAyAAKALsA0YEQCAAKALkAw0BIAAgAkEYaiAAKAL0AxBcIgEpAgA3AgAgACABKAIQNgIQIAAgASkCCDcCCCAAQRRqIAFBFGpB6AAQKxogACABKQKMATcCjAEgACABKQKEATcChAEgACABKQJ8NwJ8IAEoApQBIQQgAUEANgKUASAAKAKUASEDIAAgBDYClAEgAwRAIAMQWwsgAEGYAWogAUGYAWpB0AIQKxogACgC6AMiAwRAIAAgAzYC7AMgAxAjCyAAIAEoAugDNgLoAyAAIAEoAuwDNgLsAyAAIAEoAvADNgLwAyABQQA2AvADIAFCADcC6AMgACABKQL8AzcC/AMgACABKQL0AzcC9AMgACABKAKEBDYChAQgASgClAEhACABQQA2ApQBIAAEQCAAEFsLIAJBoARqJAAPCyACQfAcNgIQIABBBUHYJSACQRBqECwQJAALIAJB5hE2AgAgAEEFQdglIAIQLBAkAAsLAEEMEB4gABCiAQsLAEEMEB5BABCiAQsNACAAKAIALQAIQQFxCwoAIAAoAgAoAhQLGQAgAUH/AXEEQBACAAsgACgCACgCEEEBcQsYACAAKAIAIgAgAC0ACEH+AXEgAXI6AAgLJgAgASAAKAIAIgAoAhRHBEAgACABNgIUIAAgACgCDEEBajYCDAsLkgEBAn8jAEEQayICJAAgACgCACEAIAFDAAAAAGAEQCABIAAqAhhcBEAgACABOAIYIAAgACgCDEEBajYCDAsgAkEQaiQADwsgAkGIFDYCACMAQRBrIgMkACADIAI2AgwCQCAARQRAQbgwQdglIAIQSRoMAQsgAEEAQQVB2CUgAiAAKAIEEQ0AGgsgA0EQaiQAECQACz8AIAFB/wFxRQRAIAIgACgCACIAKAIQIgFBAXFHBEAgACABQX5xIAJyNgIQIAAgACgCDEEBajYCDAsPCxACAAsL4CYjAEGACAuBHk9ubHkgbGVhZiBub2RlcyB3aXRoIGN1c3RvbSBtZWFzdXJlIGZ1bmN0aW9ucyBzaG91bGQgbWFudWFsbHkgbWFyayB0aGVtc2VsdmVzIGFzIGRpcnR5AGlzRGlydHkAbWFya0RpcnR5AGRlc3Ryb3kAc2V0RGlzcGxheQBnZXREaXNwbGF5AHNldEZsZXgALSsgICAwWDB4AC0wWCswWCAwWC0weCsweCAweABzZXRGbGV4R3JvdwBnZXRGbGV4R3JvdwBzZXRPdmVyZmxvdwBnZXRPdmVyZmxvdwBoYXNOZXdMYXlvdXQAY2FsY3VsYXRlTGF5b3V0AGdldENvbXB1dGVkTGF5b3V0AHVuc2lnbmVkIHNob3J0AGdldENoaWxkQ291bnQAdW5zaWduZWQgaW50AHNldEp1c3RpZnlDb250ZW50AGdldEp1c3RpZnlDb250ZW50AGF2YWlsYWJsZUhlaWdodCBpcyBpbmRlZmluaXRlIHNvIGhlaWdodFNpemluZ01vZGUgbXVzdCBiZSBTaXppbmdNb2RlOjpNYXhDb250ZW50AGF2YWlsYWJsZVdpZHRoIGlzIGluZGVmaW5pdGUgc28gd2lkdGhTaXppbmdNb2RlIG11c3QgYmUgU2l6aW5nTW9kZTo6TWF4Q29udGVudABzZXRBbGlnbkNvbnRlbnQAZ2V0QWxpZ25Db250ZW50AGdldFBhcmVudABpbXBsZW1lbnQAc2V0TWF4SGVpZ2h0UGVyY2VudABzZXRIZWlnaHRQZXJjZW50AHNldE1pbkhlaWdodFBlcmNlbnQAc2V0RmxleEJhc2lzUGVyY2VudABzZXRHYXBQZXJjZW50AHNldFBvc2l0aW9uUGVyY2VudABzZXRNYXJnaW5QZXJjZW50AHNldE1heFdpZHRoUGVyY2VudABzZXRXaWR0aFBlcmNlbnQAc2V0TWluV2lkdGhQZXJjZW50AHNldFBhZGRpbmdQZXJjZW50AGhhbmRsZS50eXBlKCkgPT0gU3R5bGVWYWx1ZUhhbmRsZTo6VHlwZTo6UG9pbnQgfHwgaGFuZGxlLnR5cGUoKSA9PSBTdHlsZVZhbHVlSGFuZGxlOjpUeXBlOjpQZXJjZW50AGNyZWF0ZURlZmF1bHQAdW5pdAByaWdodABoZWlnaHQAc2V0TWF4SGVpZ2h0AGdldE1heEhlaWdodABzZXRIZWlnaHQAZ2V0SGVpZ2h0AHNldE1pbkhlaWdodABnZXRNaW5IZWlnaHQAZ2V0Q29tcHV0ZWRIZWlnaHQAZ2V0Q29tcHV0ZWRSaWdodABsZWZ0AGdldENvbXB1dGVkTGVmdAByZXNldABfX2Rlc3RydWN0AGZsb2F0AHVpbnQ2NF90AHVzZVdlYkRlZmF1bHRzAHNldFVzZVdlYkRlZmF1bHRzAHNldEFsaWduSXRlbXMAZ2V0QWxpZ25JdGVtcwBzZXRGbGV4QmFzaXMAZ2V0RmxleEJhc2lzAENhbm5vdCBnZXQgbGF5b3V0IHByb3BlcnRpZXMgb2YgbXVsdGktZWRnZSBzaG9ydGhhbmRzAHNldFBvaW50U2NhbGVGYWN0b3IATWVhc3VyZUNhbGxiYWNrV3JhcHBlcgBEaXJ0aWVkQ2FsbGJhY2tXcmFwcGVyAENhbm5vdCByZXNldCBhIG5vZGUgc3RpbGwgYXR0YWNoZWQgdG8gYSBvd25lcgBzZXRCb3JkZXIAZ2V0Qm9yZGVyAGdldENvbXB1dGVkQm9yZGVyAGdldE51bWJlcgBoYW5kbGUudHlwZSgpID09IFN0eWxlVmFsdWVIYW5kbGU6OlR5cGU6Ok51bWJlcgB1bnNpZ25lZCBjaGFyAHRvcABnZXRDb21wdXRlZFRvcABzZXRGbGV4V3JhcABnZXRGbGV4V3JhcABzZXRHYXAAZ2V0R2FwACVwAHNldEhlaWdodEF1dG8Ac2V0RmxleEJhc2lzQXV0bwBzZXRQb3NpdGlvbkF1dG8Ac2V0TWFyZ2luQXV0bwBzZXRXaWR0aEF1dG8AU2NhbGUgZmFjdG9yIHNob3VsZCBub3QgYmUgbGVzcyB0aGFuIHplcm8Ac2V0QXNwZWN0UmF0aW8AZ2V0QXNwZWN0UmF0aW8Ac2V0UG9zaXRpb24AZ2V0UG9zaXRpb24Abm90aWZ5T25EZXN0cnVjdGlvbgBzZXRGbGV4RGlyZWN0aW9uAGdldEZsZXhEaXJlY3Rpb24Ac2V0RGlyZWN0aW9uAGdldERpcmVjdGlvbgBzZXRNYXJnaW4AZ2V0TWFyZ2luAGdldENvbXB1dGVkTWFyZ2luAG1hcmtMYXlvdXRTZWVuAG5hbgBib3R0b20AZ2V0Q29tcHV0ZWRCb3R0b20AYm9vbABlbXNjcmlwdGVuOjp2YWwAc2V0RmxleFNocmluawBnZXRGbGV4U2hyaW5rAHNldEFsd2F5c0Zvcm1zQ29udGFpbmluZ0Jsb2NrAE1lYXN1cmVDYWxsYmFjawBEaXJ0aWVkQ2FsbGJhY2sAZ2V0TGVuZ3RoAHdpZHRoAHNldE1heFdpZHRoAGdldE1heFdpZHRoAHNldFdpZHRoAGdldFdpZHRoAHNldE1pbldpZHRoAGdldE1pbldpZHRoAGdldENvbXB1dGVkV2lkdGgAcHVzaAAvaG9tZS9ydW5uZXIvd29yay95b2dhL3lvZ2EvamF2YXNjcmlwdC8uLi95b2dhL3N0eWxlL1NtYWxsVmFsdWVCdWZmZXIuaAAvaG9tZS9ydW5uZXIvd29yay95b2dhL3lvZ2EvamF2YXNjcmlwdC8uLi95b2dhL3N0eWxlL1N0eWxlVmFsdWVQb29sLmgAdW5zaWduZWQgbG9uZwBzZXRCb3hTaXppbmcAZ2V0Qm94U2l6aW5nAHN0ZDo6d3N0cmluZwBzdGQ6OnN0cmluZwBzdGQ6OnUxNnN0cmluZwBzdGQ6OnUzMnN0cmluZwBzZXRQYWRkaW5nAGdldFBhZGRpbmcAZ2V0Q29tcHV0ZWRQYWRkaW5nAFRyaWVkIHRvIGNvbnN0cnVjdCBZR05vZGUgd2l0aCBudWxsIGNvbmZpZwBBdHRlbXB0aW5nIHRvIGNvbnN0cnVjdCBOb2RlIHdpdGggbnVsbCBjb25maWcAY3JlYXRlV2l0aENvbmZpZwBpbmYAc2V0QWxpZ25TZWxmAGdldEFsaWduU2VsZgBTaXplAHZhbHVlAFZhbHVlAGNyZWF0ZQBtZWFzdXJlAHNldFBvc2l0aW9uVHlwZQBnZXRQb3NpdGlvblR5cGUAaXNSZWZlcmVuY2VCYXNlbGluZQBzZXRJc1JlZmVyZW5jZUJhc2VsaW5lAGNvcHlTdHlsZQBkb3VibGUATm9kZQBleHRlbmQAaW5zZXJ0Q2hpbGQAZ2V0Q2hpbGQAcmVtb3ZlQ2hpbGQAdm9pZABzZXRFeHBlcmltZW50YWxGZWF0dXJlRW5hYmxlZABpc0V4cGVyaW1lbnRhbEZlYXR1cmVFbmFibGVkAGRpcnRpZWQAQ2Fubm90IHJlc2V0IGEgbm9kZSB3aGljaCBzdGlsbCBoYXMgY2hpbGRyZW4gYXR0YWNoZWQAdW5zZXRNZWFzdXJlRnVuYwB1bnNldERpcnRpZWRGdW5jAHNldEVycmF0YQBnZXRFcnJhdGEATWVhc3VyZSBmdW5jdGlvbiByZXR1cm5lZCBhbiBpbnZhbGlkIGRpbWVuc2lvbiB0byBZb2dhOiBbd2lkdGg9JWYsIGhlaWdodD0lZl0ARXhwZWN0IGN1c3RvbSBiYXNlbGluZSBmdW5jdGlvbiB0byBub3QgcmV0dXJuIE5hTgBOQU4ASU5GAGVtc2NyaXB0ZW46Om1lbW9yeV92aWV3PHNob3J0PgBlbXNjcmlwdGVuOjptZW1vcnlfdmlldzx1bnNpZ25lZCBzaG9ydD4AZW1zY3JpcHRlbjo6bWVtb3J5X3ZpZXc8aW50PgBlbXNjcmlwdGVuOjptZW1vcnlfdmlldzx1bnNpZ25lZCBpbnQ+AGVtc2NyaXB0ZW46Om1lbW9yeV92aWV3PGZsb2F0PgBlbXNjcmlwdGVuOjptZW1vcnlfdmlldzx1aW50OF90PgBlbXNjcmlwdGVuOjptZW1vcnlfdmlldzxpbnQ4X3Q+AGVtc2NyaXB0ZW46Om1lbW9yeV92aWV3PHVpbnQxNl90PgBlbXNjcmlwdGVuOjptZW1vcnlfdmlldzxpbnQxNl90PgBlbXNjcmlwdGVuOjptZW1vcnlfdmlldzx1aW50MzJfdD4AZW1zY3JpcHRlbjo6bWVtb3J5X3ZpZXc8aW50MzJfdD4AZW1zY3JpcHRlbjo6bWVtb3J5X3ZpZXc8Y2hhcj4AZW1zY3JpcHRlbjo6bWVtb3J5X3ZpZXc8dW5zaWduZWQgY2hhcj4Ac3RkOjpiYXNpY19zdHJpbmc8dW5zaWduZWQgY2hhcj4AZW1zY3JpcHRlbjo6bWVtb3J5X3ZpZXc8c2lnbmVk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",!j(rA)){var fA=rA;rA=t.locateFile?t.locateFile(fA,o):o+fA}function X(){var u=rA;try{if(u==rA&&g)return new Uint8Array(g);if(j(u))try{var c=Ci(u.slice(37)),f=new Uint8Array(c.length);for(u=0;u<c.length;++u)f[u]=c.charCodeAt(u);var m=f}catch{throw Error("Converting base64 string to bytes failed.")}else m=void 0;var y=m;if(y)return y;throw"both async and sync fetching of the wasm failed"}catch(S){aA(S)}}function V(){return g||typeof fetch!="function"?Promise.resolve().then(function(){return X()}):fetch(rA,{credentials:"same-origin"}).then(function(u){if(!u.ok)throw"failed to load wasm binary file at '"+rA+"'";return u.arrayBuffer()}).catch(function(){return X()})}function Z(u){for(;0<u.length;)u.shift()(t)}function mA(u){if(u===void 0)return"_unknown";u=u.replace(/[^a-zA-Z0-9_]/g,"$");var c=u.charCodeAt(0);return 48<=c&&57>=c?"_"+u:u}function $(u,c){return u=mA(u),function(){return c.apply(this,arguments)}}var lA=[{},{value:void 0},{value:null},{value:!0},{value:!1}],IA=[];function yA(u){var c=Error,f=$(u,function(m){this.name=u,this.message=m,m=Error(m).stack,m!==void 0&&(this.stack=this.toString()+`
1448
+ `+m.replace(/^Error(:[^\n]*)?\n/,""))});return f.prototype=Object.create(c.prototype),f.prototype.constructor=f,f.prototype.toString=function(){return this.message===void 0?this.name:this.name+": "+this.message},f}var AA=void 0;function k(u){throw new AA(u)}var eA=u=>(u||k("Cannot use deleted val. handle = "+u),lA[u].value),q=u=>{switch(u){case void 0:return 1;case null:return 2;case!0:return 3;case!1:return 4;default:var c=IA.length?IA.pop():lA.length;return lA[c]={ga:1,value:u},c}},sA=void 0,BA=void 0;function T(u){for(var c="";p[u];)c+=BA[p[u++]];return c}var iA=[];function oA(){for(;iA.length;){var u=iA.pop();u.M.$=!1,u.delete()}}var uA=void 0,QA={};function cA(u,c){for(c===void 0&&k("ptr should not be undefined");u.R;)c=u.ba(c),u=u.R;return c}var gA={};function bA(u){u=Rn(u);var c=T(u);return XA(u),c}function DA(u,c){var f=gA[u];return f===void 0&&k(c+" has unknown type "+bA(u)),f}function hA(){}var pA=!1;function UA(u){--u.count.value,u.count.value===0&&(u.T?u.U.W(u.T):u.P.N.W(u.O))}function SA(u,c,f){return c===f?u:f.R===void 0?null:(u=SA(u,c,f.R),u===null?null:f.na(u))}var LA={};function Nt(u,c){return c=cA(u,c),QA[c]}var vA=void 0;function ze(u){throw new vA(u)}function Xe(u,c){return c.P&&c.O||ze("makeClassHandle requires ptr and ptrType"),!!c.U!=!!c.T&&ze("Both smartPtrType and smartPtr must be specified"),c.count={value:1},ge(Object.create(u,{M:{value:c}}))}function ge(u){return typeof FinalizationRegistry>"u"?(ge=c=>c,u):(pA=new FinalizationRegistry(c=>{UA(c.M)}),ge=c=>{var f=c.M;return f.T&&pA.register(c,{M:f},c),c},hA=c=>{pA.unregister(c)},ge(u))}var Ze={};function Ft(u){for(;u.length;){var c=u.pop();u.pop()(c)}}function we(u){return this.fromWireType(D[u>>2])}var le={},qe={};function Ae(u,c,f){function m(H){H=f(H),H.length!==u.length&&ze("Mismatched type converter count");for(var Y=0;Y<u.length;++Y)WA(u[Y],H[Y])}u.forEach(function(H){qe[H]=c});var y=Array(c.length),S=[],P=0;c.forEach((H,Y)=>{gA.hasOwnProperty(H)?y[Y]=gA[H]:(S.push(H),le.hasOwnProperty(H)||(le[H]=[]),le[H].push(()=>{y[Y]=gA[H],++P,P===S.length&&m(y)}))}),S.length===0&&m(y)}function Ut(u){switch(u){case 1:return 0;case 2:return 1;case 4:return 2;case 8:return 3;default:throw new TypeError("Unknown type size: "+u)}}function WA(u,c,f={}){if(!("argPackAdvance"in c))throw new TypeError("registerType registeredInstance requires argPackAdvance");var m=c.name;if(u||k('type "'+m+'" must have a positive integer typeid pointer'),gA.hasOwnProperty(u)){if(f.ua)return;k("Cannot register type '"+m+"' twice")}gA[u]=c,delete qe[u],le.hasOwnProperty(u)&&(c=le[u],delete le[u],c.forEach(y=>y()))}function St(u){k(u.M.P.N.name+" instance already deleted")}function ee(){}function vt(u,c,f){if(u[c].S===void 0){var m=u[c];u[c]=function(){return u[c].S.hasOwnProperty(arguments.length)||k("Function '"+f+"' called with an invalid number of arguments ("+arguments.length+") - expects one of ("+u[c].S+")!"),u[c].S[arguments.length].apply(this,arguments)},u[c].S=[],u[c].S[m.Z]=m}}function jr(u,c){t.hasOwnProperty(u)?(k("Cannot register public name '"+u+"' twice"),vt(t,u,u),t.hasOwnProperty(void 0)&&k("Cannot register multiple overloads of a function with the same number of arguments (undefined)!"),t[u].S[void 0]=c):t[u]=c}function $r(u,c,f,m,y,S,P,H){this.name=u,this.constructor=c,this.X=f,this.W=m,this.R=y,this.pa=S,this.ba=P,this.na=H,this.ja=[]}function Rt(u,c,f){for(;c!==f;)c.ba||k("Expected null or instance of "+f.name+", got an instance of "+c.name),u=c.ba(u),c=c.R;return u}function Ai(u,c){return c===null?(this.ea&&k("null is not a valid "+this.name),0):(c.M||k('Cannot pass "'+Ht(c)+'" as a '+this.name),c.M.O||k("Cannot pass deleted object as a pointer of type "+this.name),Rt(c.M.O,c.M.P.N,this.N))}function ei(u,c){if(c===null){if(this.ea&&k("null is not a valid "+this.name),this.da){var f=this.fa();return u!==null&&u.push(this.W,f),f}return 0}if(c.M||k('Cannot pass "'+Ht(c)+'" as a '+this.name),c.M.O||k("Cannot pass deleted object as a pointer of type "+this.name),!this.ca&&c.M.P.ca&&k("Cannot convert argument of type "+(c.M.U?c.M.U.name:c.M.P.name)+" to parameter type "+this.name),f=Rt(c.M.O,c.M.P.N,this.N),this.da)switch(c.M.T===void 0&&k("Passing raw pointer to smart pointer is illegal"),this.Ba){case 0:c.M.U===this?f=c.M.T:k("Cannot convert argument of type "+(c.M.U?c.M.U.name:c.M.P.name)+" to parameter type "+this.name);break;case 1:f=c.M.T;break;case 2:if(c.M.U===this)f=c.M.T;else{var m=c.clone();f=this.xa(f,q(function(){m.delete()})),u!==null&&u.push(this.W,f)}break;default:k("Unsupporting sharing policy")}return f}function ti(u,c){return c===null?(this.ea&&k("null is not a valid "+this.name),0):(c.M||k('Cannot pass "'+Ht(c)+'" as a '+this.name),c.M.O||k("Cannot pass deleted object as a pointer of type "+this.name),c.M.P.ca&&k("Cannot convert argument of type "+c.M.P.name+" to parameter type "+this.name),Rt(c.M.O,c.M.P.N,this.N))}function zA(u,c,f,m){this.name=u,this.N=c,this.ea=f,this.ca=m,this.da=!1,this.W=this.xa=this.fa=this.ka=this.Ba=this.wa=void 0,c.R!==void 0?this.toWireType=ei:(this.toWireType=m?Ai:ti,this.V=null)}function ni(u,c){t.hasOwnProperty(u)||ze("Replacing nonexistant public symbol"),t[u]=c,t[u].Z=void 0}function ri(u,c){var f=[];return function(){if(f.length=0,Object.assign(f,arguments),u.includes("j")){var m=t["dynCall_"+u];m=f&&f.length?m.apply(null,[c].concat(f)):m.call(null,c)}else m=b.get(c).apply(null,f);return m}}function kA(u,c){u=T(u);var f=u.includes("j")?ri(u,c):b.get(c);return typeof f!="function"&&k("unknown function pointer with signature "+u+": "+c),f}var Fn=void 0;function _e(u,c){function f(S){y[S]||gA[S]||(qe[S]?qe[S].forEach(f):(m.push(S),y[S]=!0))}var m=[],y={};throw c.forEach(f),new Fn(u+": "+m.map(bA).join([", "]))}function Lt(u,c,f,m,y){var S=c.length;2>S&&k("argTypes array size mismatch! Must at least get return value and 'this' types!");var P=c[1]!==null&&f!==null,H=!1;for(f=1;f<c.length;++f)if(c[f]!==null&&c[f].V===void 0){H=!0;break}var Y=c[0].name!=="void",O=S-2,z=Array(O),tA=[],EA=[];return function(){if(arguments.length!==O&&k("function "+u+" called with "+arguments.length+" arguments, expected "+O+" args!"),EA.length=0,tA.length=P?2:1,tA[0]=y,P){var xA=c[1].toWireType(EA,this);tA[1]=xA}for(var dA=0;dA<O;++dA)z[dA]=c[dA+2].toWireType(EA,arguments[dA]),tA.push(z[dA]);if(dA=m.apply(null,tA),H)Ft(EA);else for(var NA=P?1:2;NA<c.length;NA++){var PA=NA===1?xA:z[NA-2];c[NA].V!==null&&c[NA].V(PA)}return xA=Y?c[0].fromWireType(dA):void 0,xA}}function kt(u,c){for(var f=[],m=0;m<u;m++)f.push(x[c+4*m>>2]);return f}function Pt(u){4<u&&--lA[u].ga===0&&(lA[u]=void 0,IA.push(u))}function Ht(u){if(u===null)return"null";var c=typeof u;return c==="object"||c==="array"||c==="function"?u.toString():""+u}function ii(u,c){switch(c){case 2:return function(f){return this.fromWireType(G[f>>2])};case 3:return function(f){return this.fromWireType(M[f>>3])};default:throw new TypeError("Unknown float type: "+u)}}function oi(u,c,f){switch(c){case 0:return f?function(m){return C[m]}:function(m){return p[m]};case 1:return f?function(m){return h[m>>1]}:function(m){return d[m>>1]};case 2:return f?function(m){return D[m>>2]}:function(m){return x[m>>2]};default:throw new TypeError("Unknown integer type: "+u)}}function ai(u,c){for(var f="",m=0;!(m>=c/2);++m){var y=h[u+2*m>>1];if(y==0)break;f+=String.fromCharCode(y)}return f}function si(u,c,f){if(f===void 0&&(f=2147483647),2>f)return 0;f-=2;var m=c;f=f<2*u.length?f/2:u.length;for(var y=0;y<f;++y)h[c>>1]=u.charCodeAt(y),c+=2;return h[c>>1]=0,c-m}function gi(u){return 2*u.length}function li(u,c){for(var f=0,m="";!(f>=c/4);){var y=D[u+4*f>>2];if(y==0)break;++f,65536<=y?(y-=65536,m+=String.fromCharCode(55296|y>>10,56320|y&1023)):m+=String.fromCharCode(y)}return m}function Ii(u,c,f){if(f===void 0&&(f=2147483647),4>f)return 0;var m=c;f=m+f-4;for(var y=0;y<u.length;++y){var S=u.charCodeAt(y);if(55296<=S&&57343>=S){var P=u.charCodeAt(++y);S=65536+((S&1023)<<10)|P&1023}if(D[c>>2]=S,c+=4,c+4>f)break}return D[c>>2]=0,c-m}function ui(u){for(var c=0,f=0;f<u.length;++f){var m=u.charCodeAt(f);55296<=m&&57343>=m&&++f,c+=4}return c}var ci={};function Un(u){var c=ci[u];return c===void 0?T(u):c}var je=[];function Bi(u){var c=je.length;return je.push(u),c}function Ei(u,c){for(var f=Array(u),m=0;m<u;++m)f[m]=DA(x[c+4*m>>2],"parameter "+m);return f}var Sn=[],Qi=[null,[],[]];AA=t.BindingError=yA("BindingError"),t.count_emval_handles=function(){for(var u=0,c=5;c<lA.length;++c)lA[c]!==void 0&&++u;return u},t.get_first_emval=function(){for(var u=5;u<lA.length;++u)if(lA[u]!==void 0)return lA[u];return null},sA=t.PureVirtualError=yA("PureVirtualError");for(var vn=Array(256),$e=0;256>$e;++$e)vn[$e]=String.fromCharCode($e);BA=vn,t.getInheritedInstanceCount=function(){return Object.keys(QA).length},t.getLiveInheritedInstances=function(){var u=[],c;for(c in QA)QA.hasOwnProperty(c)&&u.push(QA[c]);return u},t.flushPendingDeletes=oA,t.setDelayFunction=function(u){uA=u,iA.length&&uA&&uA(oA)},vA=t.InternalError=yA("InternalError"),ee.prototype.isAliasOf=function(u){if(!(this instanceof ee&&u instanceof ee))return!1;var c=this.M.P.N,f=this.M.O,m=u.M.P.N;for(u=u.M.O;c.R;)f=c.ba(f),c=c.R;for(;m.R;)u=m.ba(u),m=m.R;return c===m&&f===u},ee.prototype.clone=function(){if(this.M.O||St(this),this.M.aa)return this.M.count.value+=1,this;var u=ge,c=Object,f=c.create,m=Object.getPrototypeOf(this),y=this.M;return u=u(f.call(c,m,{M:{value:{count:y.count,$:y.$,aa:y.aa,O:y.O,P:y.P,T:y.T,U:y.U}}})),u.M.count.value+=1,u.M.$=!1,u},ee.prototype.delete=function(){this.M.O||St(this),this.M.$&&!this.M.aa&&k("Object already scheduled for deletion"),hA(this),UA(this.M),this.M.aa||(this.M.T=void 0,this.M.O=void 0)},ee.prototype.isDeleted=function(){return!this.M.O},ee.prototype.deleteLater=function(){return this.M.O||St(this),this.M.$&&!this.M.aa&&k("Object already scheduled for deletion"),iA.push(this),iA.length===1&&uA&&uA(oA),this.M.$=!0,this},zA.prototype.qa=function(u){return this.ka&&(u=this.ka(u)),u},zA.prototype.ha=function(u){this.W&&this.W(u)},zA.prototype.argPackAdvance=8,zA.prototype.readValueFromPointer=we,zA.prototype.deleteObject=function(u){u!==null&&u.delete()},zA.prototype.fromWireType=function(u){function c(){return this.da?Xe(this.N.X,{P:this.wa,O:f,U:this,T:u}):Xe(this.N.X,{P:this,O:u})}var f=this.qa(u);if(!f)return this.ha(u),null;var m=Nt(this.N,f);if(m!==void 0)return m.M.count.value===0?(m.M.O=f,m.M.T=u,m.clone()):(m=m.clone(),this.ha(u),m);if(m=this.N.pa(f),m=LA[m],!m)return c.call(this);m=this.ca?m.la:m.pointerType;var y=SA(f,this.N,m.N);return y===null?c.call(this):this.da?Xe(m.N.X,{P:m,O:y,U:this,T:u}):Xe(m.N.X,{P:m,O:y})},Fn=t.UnboundTypeError=yA("UnboundTypeError");var Ci=typeof atob=="function"?atob:function(u){var c="",f=0;u=u.replace(/[^A-Za-z0-9\+\/=]/g,"");do{var m="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=".indexOf(u.charAt(f++)),y="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=".indexOf(u.charAt(f++)),S="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=".indexOf(u.charAt(f++)),P="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=".indexOf(u.charAt(f++));m=m<<2|y>>4,y=(y&15)<<4|S>>2;var H=(S&3)<<6|P;c+=String.fromCharCode(m),S!==64&&(c+=String.fromCharCode(y)),P!==64&&(c+=String.fromCharCode(H))}while(f<u.length);return c},fi={l:function(u,c,f,m){aA("Assertion failed: "+(u?E(p,u):"")+", at: "+[c?c?E(p,c):"":"unknown filename",f,m?m?E(p,m):"":"unknown function"])},q:function(u,c,f){u=T(u),c=DA(c,"wrapper"),f=eA(f);var m=[].slice,y=c.N,S=y.X,P=y.R.X,H=y.R.constructor;u=$(u,function(){y.R.ja.forEach(function(O){if(this[O]===P[O])throw new sA("Pure virtual function "+O+" must be implemented in JavaScript")}.bind(this)),Object.defineProperty(this,"__parent",{value:S}),this.__construct.apply(this,m.call(arguments))}),S.__construct=function(){this===S&&k("Pass correct 'this' to __construct");var O=H.implement.apply(void 0,[this].concat(m.call(arguments)));hA(O);var z=O.M;O.notifyOnDestruction(),z.aa=!0,Object.defineProperties(this,{M:{value:z}}),ge(this),O=z.O,O=cA(y,O),QA.hasOwnProperty(O)?k("Tried to register registered instance: "+O):QA[O]=this},S.__destruct=function(){this===S&&k("Pass correct 'this' to __destruct"),hA(this);var O=this.M.O;O=cA(y,O),QA.hasOwnProperty(O)?delete QA[O]:k("Tried to unregister unregistered instance: "+O)},u.prototype=Object.create(S);for(var Y in f)u.prototype[Y]=f[Y];return q(u)},j:function(u){var c=Ze[u];delete Ze[u];var f=c.fa,m=c.W,y=c.ia,S=y.map(P=>P.ta).concat(y.map(P=>P.za));Ae([u],S,P=>{var H={};return y.forEach((Y,O)=>{var z=P[O],tA=Y.ra,EA=Y.sa,xA=P[O+y.length],dA=Y.ya,NA=Y.Aa;H[Y.oa]={read:PA=>z.fromWireType(tA(EA,PA)),write:(PA,xe)=>{var ZA=[];dA(NA,PA,xA.toWireType(ZA,xe)),Ft(ZA)}}}),[{name:c.name,fromWireType:function(Y){var O={},z;for(z in H)O[z]=H[z].read(Y);return m(Y),O},toWireType:function(Y,O){for(var z in H)if(!(z in O))throw new TypeError('Missing field: "'+z+'"');var tA=f();for(z in H)H[z].write(tA,O[z]);return Y!==null&&Y.push(m,tA),tA},argPackAdvance:8,readValueFromPointer:we,V:m}]})},v:function(){},B:function(u,c,f,m,y){var S=Ut(f);c=T(c),WA(u,{name:c,fromWireType:function(P){return!!P},toWireType:function(P,H){return H?m:y},argPackAdvance:8,readValueFromPointer:function(P){if(f===1)var H=C;else if(f===2)H=h;else if(f===4)H=D;else throw new TypeError("Unknown boolean type size: "+c);return this.fromWireType(H[P>>S])},V:null})},f:function(u,c,f,m,y,S,P,H,Y,O,z,tA,EA){z=T(z),S=kA(y,S),H&&(H=kA(P,H)),O&&(O=kA(Y,O)),EA=kA(tA,EA);var xA=mA(z);jr(xA,function(){_e("Cannot construct "+z+" due to unbound types",[m])}),Ae([u,c,f],m?[m]:[],function(dA){if(dA=dA[0],m)var NA=dA.N,PA=NA.X;else PA=ee.prototype;dA=$(xA,function(){if(Object.getPrototypeOf(this)!==xe)throw new AA("Use 'new' to construct "+z);if(ZA.Y===void 0)throw new AA(z+" has no accessible constructor");var Pn=ZA.Y[arguments.length];if(Pn===void 0)throw new AA("Tried to invoke ctor of "+z+" with invalid number of parameters ("+arguments.length+") - expected ("+Object.keys(ZA.Y).toString()+") parameters instead!");return Pn.apply(this,arguments)});var xe=Object.create(PA,{constructor:{value:dA}});dA.prototype=xe;var ZA=new $r(z,dA,xe,EA,NA,S,H,O);NA=new zA(z,ZA,!0,!1),PA=new zA(z+"*",ZA,!1,!1);var kn=new zA(z+" const*",ZA,!1,!0);return LA[u]={pointerType:PA,la:kn},ni(xA,dA),[NA,PA,kn]})},d:function(u,c,f,m,y,S,P){var H=kt(f,m);c=T(c),S=kA(y,S),Ae([],[u],function(Y){function O(){_e("Cannot call "+z+" due to unbound types",H)}Y=Y[0];var z=Y.name+"."+c;c.startsWith("@@")&&(c=Symbol[c.substring(2)]);var tA=Y.N.constructor;return tA[c]===void 0?(O.Z=f-1,tA[c]=O):(vt(tA,c,z),tA[c].S[f-1]=O),Ae([],H,function(EA){return EA=Lt(z,[EA[0],null].concat(EA.slice(1)),null,S,P),tA[c].S===void 0?(EA.Z=f-1,tA[c]=EA):tA[c].S[f-1]=EA,[]}),[]})},p:function(u,c,f,m,y,S){0<c||aA();var P=kt(c,f);y=kA(m,y),Ae([],[u],function(H){H=H[0];var Y="constructor "+H.name;if(H.N.Y===void 0&&(H.N.Y=[]),H.N.Y[c-1]!==void 0)throw new AA("Cannot register multiple constructors with identical number of parameters ("+(c-1)+") for class '"+H.name+"'! Overload resolution is currently only performed using the parameter count, not actual type info!");return H.N.Y[c-1]=()=>{_e("Cannot construct "+H.name+" due to unbound types",P)},Ae([],P,function(O){return O.splice(1,0,null),H.N.Y[c-1]=Lt(Y,O,null,y,S),[]}),[]})},a:function(u,c,f,m,y,S,P,H){var Y=kt(f,m);c=T(c),S=kA(y,S),Ae([],[u],function(O){function z(){_e("Cannot call "+tA+" due to unbound types",Y)}O=O[0];var tA=O.name+"."+c;c.startsWith("@@")&&(c=Symbol[c.substring(2)]),H&&O.N.ja.push(c);var EA=O.N.X,xA=EA[c];return xA===void 0||xA.S===void 0&&xA.className!==O.name&&xA.Z===f-2?(z.Z=f-2,z.className=O.name,EA[c]=z):(vt(EA,c,tA),EA[c].S[f-2]=z),Ae([],Y,function(dA){return dA=Lt(tA,dA,O,S,P),EA[c].S===void 0?(dA.Z=f-2,EA[c]=dA):EA[c].S[f-2]=dA,[]}),[]})},A:function(u,c){c=T(c),WA(u,{name:c,fromWireType:function(f){var m=eA(f);return Pt(f),m},toWireType:function(f,m){return q(m)},argPackAdvance:8,readValueFromPointer:we,V:null})},n:function(u,c,f){f=Ut(f),c=T(c),WA(u,{name:c,fromWireType:function(m){return m},toWireType:function(m,y){return y},argPackAdvance:8,readValueFromPointer:ii(c,f),V:null})},e:function(u,c,f,m,y){c=T(c),y===-1&&(y=4294967295),y=Ut(f);var S=H=>H;if(m===0){var P=32-8*f;S=H=>H<<P>>>P}f=c.includes("unsigned")?function(H,Y){return Y>>>0}:function(H,Y){return Y},WA(u,{name:c,fromWireType:S,toWireType:f,argPackAdvance:8,readValueFromPointer:oi(c,y,m!==0),V:null})},b:function(u,c,f){function m(S){S>>=2;var P=x;return new y(Q,P[S+1],P[S])}var y=[Int8Array,Uint8Array,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array][c];f=T(f),WA(u,{name:f,fromWireType:m,argPackAdvance:8,readValueFromPointer:m},{ua:!0})},o:function(u,c){c=T(c);var f=c==="std::string";WA(u,{name:c,fromWireType:function(m){var y=x[m>>2],S=m+4;if(f)for(var P=S,H=0;H<=y;++H){var Y=S+H;if(H==y||p[Y]==0){if(P=P?E(p,P,Y-P):"",O===void 0)var O=P;else O+="\0",O+=P;P=Y+1}}else{for(O=Array(y),H=0;H<y;++H)O[H]=String.fromCharCode(p[S+H]);O=O.join("")}return XA(m),O},toWireType:function(m,y){y instanceof ArrayBuffer&&(y=new Uint8Array(y));var S,P=typeof y=="string";if(P||y instanceof Uint8Array||y instanceof Uint8ClampedArray||y instanceof Int8Array||k("Cannot pass non-string to std::string"),f&&P){var H=0;for(S=0;S<y.length;++S){var Y=y.charCodeAt(S);127>=Y?H++:2047>=Y?H+=2:55296<=Y&&57343>=Y?(H+=4,++S):H+=3}S=H}else S=y.length;if(H=Tt(4+S+1),Y=H+4,x[H>>2]=S,f&&P){if(P=Y,Y=S+1,S=p,0<Y){Y=P+Y-1;for(var O=0;O<y.length;++O){var z=y.charCodeAt(O);if(55296<=z&&57343>=z){var tA=y.charCodeAt(++O);z=65536+((z&1023)<<10)|tA&1023}if(127>=z){if(P>=Y)break;S[P++]=z}else{if(2047>=z){if(P+1>=Y)break;S[P++]=192|z>>6}else{if(65535>=z){if(P+2>=Y)break;S[P++]=224|z>>12}else{if(P+3>=Y)break;S[P++]=240|z>>18,S[P++]=128|z>>12&63}S[P++]=128|z>>6&63}S[P++]=128|z&63}}S[P]=0}}else if(P)for(P=0;P<S;++P)O=y.charCodeAt(P),255<O&&(XA(Y),k("String has UTF-16 code units that do not fit in 8 bits")),p[Y+P]=O;else for(P=0;P<S;++P)p[Y+P]=y[P];return m!==null&&m.push(XA,H),H},argPackAdvance:8,readValueFromPointer:we,V:function(m){XA(m)}})},i:function(u,c,f){if(f=T(f),c===2)var m=ai,y=si,S=gi,P=()=>d,H=1;else c===4&&(m=li,y=Ii,S=ui,P=()=>x,H=2);WA(u,{name:f,fromWireType:function(Y){for(var O=x[Y>>2],z=P(),tA,EA=Y+4,xA=0;xA<=O;++xA){var dA=Y+4+xA*c;(xA==O||z[dA>>H]==0)&&(EA=m(EA,dA-EA),tA===void 0?tA=EA:(tA+="\0",tA+=EA),EA=dA+c)}return XA(Y),tA},toWireType:function(Y,O){typeof O!="string"&&k("Cannot pass non-string to C++ string type "+f);var z=S(O),tA=Tt(4+z+c);return x[tA>>2]=z>>H,y(O,tA+4,z+c),Y!==null&&Y.push(XA,tA),tA},argPackAdvance:8,readValueFromPointer:we,V:function(Y){XA(Y)}})},k:function(u,c,f,m,y,S){Ze[u]={name:T(c),fa:kA(f,m),W:kA(y,S),ia:[]}},h:function(u,c,f,m,y,S,P,H,Y,O){Ze[u].ia.push({oa:T(c),ta:f,ra:kA(m,y),sa:S,za:P,ya:kA(H,Y),Aa:O})},C:function(u,c){c=T(c),WA(u,{va:!0,name:c,argPackAdvance:0,fromWireType:function(){},toWireType:function(){}})},s:function(u,c,f,m,y){u=je[u],c=eA(c),f=Un(f);var S=[];return x[m>>2]=q(S),u(c,f,S,y)},t:function(u,c,f,m){u=je[u],c=eA(c),f=Un(f),u(c,f,null,m)},g:Pt,m:function(u,c){var f=Ei(u,c),m=f[0];c=m.name+"_$"+f.slice(1).map(function(P){return P.name}).join("_")+"$";var y=Sn[c];if(y!==void 0)return y;var S=Array(u-1);return y=Bi((P,H,Y,O)=>{for(var z=0,tA=0;tA<u-1;++tA)S[tA]=f[tA+1].readValueFromPointer(O+z),z+=f[tA+1].argPackAdvance;for(P=P[H].apply(P,S),tA=0;tA<u-1;++tA)f[tA+1].ma&&f[tA+1].ma(S[tA]);if(!m.va)return m.toWireType(Y,P)}),Sn[c]=y},D:function(u){4<u&&(lA[u].ga+=1)},r:function(u){var c=eA(u);Ft(c),Pt(u)},c:function(){aA("")},x:function(u,c,f){p.copyWithin(u,c,c+f)},w:function(u){var c=p.length;if(u>>>=0,2147483648<u)return!1;for(var f=1;4>=f;f*=2){var m=c*(1+.2/f);m=Math.min(m,u+100663296);var y=Math;m=Math.max(u,m),y=y.min.call(y,2147483648,m+(65536-m%65536)%65536);A:{try{I.grow(y-Q.byteLength+65535>>>16),w();var S=1;break A}catch{}S=void 0}if(S)return!0}return!1},z:function(){return 52},u:function(){return 70},y:function(u,c,f,m){for(var y=0,S=0;S<f;S++){var P=x[c>>2],H=x[c+4>>2];c+=8;for(var Y=0;Y<H;Y++){var O=p[P+Y],z=Qi[u];O===0||O===10?((u===1?a:s)(E(z,0)),z.length=0):z.push(O)}y+=H}return x[m>>2]=y,0}};(function(){function u(y){t.asm=y.exports,I=t.asm.E,w(),b=t.asm.J,U.unshift(t.asm.F),J--,t.monitorRunDependencies&&t.monitorRunDependencies(J),J==0&&(W!==null&&(clearInterval(W),W=null),K&&(y=K,K=null,y()))}function c(y){u(y.instance)}function f(y){return V().then(function(S){return WebAssembly.instantiate(S,m)}).then(function(S){return S}).then(y,function(S){s("failed to asynchronously prepare wasm: "+S),aA(S)})}var m={a:fi};if(J++,t.monitorRunDependencies&&t.monitorRunDependencies(J),t.instantiateWasm)try{return t.instantiateWasm(m,u)}catch(y){s("Module.instantiateWasm callback failed with error: "+y),r(y)}return(function(){return g||typeof WebAssembly.instantiateStreaming!="function"||j(rA)||typeof fetch!="function"?f(c):fetch(rA,{credentials:"same-origin"}).then(function(y){return WebAssembly.instantiateStreaming(y,m).then(c,function(S){return s("wasm streaming compile failed: "+S),s("falling back to ArrayBuffer instantiation"),f(c)})})})().catch(r),{}})(),t.___wasm_call_ctors=function(){return(t.___wasm_call_ctors=t.asm.F).apply(null,arguments)};var Rn=t.___getTypeName=function(){return(Rn=t.___getTypeName=t.asm.G).apply(null,arguments)};t.__embind_initialize_bindings=function(){return(t.__embind_initialize_bindings=t.asm.H).apply(null,arguments)};var Tt=t._malloc=function(){return(Tt=t._malloc=t.asm.I).apply(null,arguments)},XA=t._free=function(){return(XA=t._free=t.asm.K).apply(null,arguments)};t.dynCall_jiji=function(){return(t.dynCall_jiji=t.asm.L).apply(null,arguments)};var At;K=function u(){At||Ln(),At||(K=u)};function Ln(){function u(){if(!At&&(At=!0,t.calledRun=!0,!B)){if(Z(U),n(t),t.onRuntimeInitialized&&t.onRuntimeInitialized(),t.postRun)for(typeof t.postRun=="function"&&(t.postRun=[t.postRun]);t.postRun.length;){var c=t.postRun.shift();L.unshift(c)}Z(L)}}if(!(0<J)){if(t.preRun)for(typeof t.preRun=="function"&&(t.preRun=[t.preRun]);t.preRun.length;)F();Z(N),0<J||(t.setStatus?(t.setStatus("Running..."),setTimeout(function(){setTimeout(function(){t.setStatus("")},1),u()},1)):u())}}if(t.preInit)for(typeof t.preInit=="function"&&(t.preInit=[t.preInit]);0<t.preInit.length;)t.preInit.pop()();return Ln(),e.ready})})(),Lr=Ko;v();v();var jA=(function(A){return A[A.Auto=0]="Auto",A[A.FlexStart=1]="FlexStart",A[A.Center=2]="Center",A[A.FlexEnd=3]="FlexEnd",A[A.Stretch=4]="Stretch",A[A.Baseline=5]="Baseline",A[A.SpaceBetween=6]="SpaceBetween",A[A.SpaceAround=7]="SpaceAround",A[A.SpaceEvenly=8]="SpaceEvenly",A})({}),kr=(function(A){return A[A.BorderBox=0]="BorderBox",A[A.ContentBox=1]="ContentBox",A})({}),Pr=(function(A){return A[A.Width=0]="Width",A[A.Height=1]="Height",A})({}),Ve=(function(A){return A[A.Inherit=0]="Inherit",A[A.LTR=1]="LTR",A[A.RTL=2]="RTL",A})({}),mn=(function(A){return A[A.Flex=0]="Flex",A[A.None=1]="None",A[A.Contents=2]="Contents",A})({}),$A=(function(A){return A[A.Left=0]="Left",A[A.Top=1]="Top",A[A.Right=2]="Right",A[A.Bottom=3]="Bottom",A[A.Start=4]="Start",A[A.End=5]="End",A[A.Horizontal=6]="Horizontal",A[A.Vertical=7]="Vertical",A[A.All=8]="All",A})({}),ye=(function(A){return A[A.None=0]="None",A[A.StretchFlexBasis=1]="StretchFlexBasis",A[A.AbsolutePositionWithoutInsetsExcludesPadding=2]="AbsolutePositionWithoutInsetsExcludesPadding",A[A.AbsolutePercentAgainstInnerSize=4]="AbsolutePercentAgainstInnerSize",A[A.All=2147483647]="All",A[A.Classic=2147483646]="Classic",A})({}),Yo=(function(A){return A[A.WebFlexBasis=0]="WebFlexBasis",A})({}),xt=(function(A){return A[A.Column=0]="Column",A[A.ColumnReverse=1]="ColumnReverse",A[A.Row=2]="Row",A[A.RowReverse=3]="RowReverse",A})({}),hn=(function(A){return A[A.Column=0]="Column",A[A.Row=1]="Row",A[A.All=2]="All",A})({}),De=(function(A){return A[A.FlexStart=0]="FlexStart",A[A.Center=1]="Center",A[A.FlexEnd=2]="FlexEnd",A[A.SpaceBetween=3]="SpaceBetween",A[A.SpaceAround=4]="SpaceAround",A[A.SpaceEvenly=5]="SpaceEvenly",A})({}),be=(function(A){return A[A.Error=0]="Error",A[A.Warn=1]="Warn",A[A.Info=2]="Info",A[A.Debug=3]="Debug",A[A.Verbose=4]="Verbose",A[A.Fatal=5]="Fatal",A})({}),pn=(function(A){return A[A.Undefined=0]="Undefined",A[A.Exactly=1]="Exactly",A[A.AtMost=2]="AtMost",A})({}),Hr=(function(A){return A[A.Default=0]="Default",A[A.Text=1]="Text",A})({}),yn=(function(A){return A[A.Visible=0]="Visible",A[A.Hidden=1]="Hidden",A[A.Scroll=2]="Scroll",A})({}),Dn=(function(A){return A[A.Static=0]="Static",A[A.Relative=1]="Relative",A[A.Absolute=2]="Absolute",A})({}),HA=(function(A){return A[A.Undefined=0]="Undefined",A[A.Point=1]="Point",A[A.Percent=2]="Percent",A[A.Auto=3]="Auto",A})({}),bn=(function(A){return A[A.NoWrap=0]="NoWrap",A[A.Wrap=1]="Wrap",A[A.WrapReverse=2]="WrapReverse",A})({}),Vo={ALIGN_AUTO:jA.Auto,ALIGN_FLEX_START:jA.FlexStart,ALIGN_CENTER:jA.Center,ALIGN_FLEX_END:jA.FlexEnd,ALIGN_STRETCH:jA.Stretch,ALIGN_BASELINE:jA.Baseline,ALIGN_SPACE_BETWEEN:jA.SpaceBetween,ALIGN_SPACE_AROUND:jA.SpaceAround,ALIGN_SPACE_EVENLY:jA.SpaceEvenly,BOX_SIZING_BORDER_BOX:kr.BorderBox,BOX_SIZING_CONTENT_BOX:kr.ContentBox,DIMENSION_WIDTH:Pr.Width,DIMENSION_HEIGHT:Pr.Height,DIRECTION_INHERIT:Ve.Inherit,DIRECTION_LTR:Ve.LTR,DIRECTION_RTL:Ve.RTL,DISPLAY_FLEX:mn.Flex,DISPLAY_NONE:mn.None,DISPLAY_CONTENTS:mn.Contents,EDGE_LEFT:$A.Left,EDGE_TOP:$A.Top,EDGE_RIGHT:$A.Right,EDGE_BOTTOM:$A.Bottom,EDGE_START:$A.Start,EDGE_END:$A.End,EDGE_HORIZONTAL:$A.Horizontal,EDGE_VERTICAL:$A.Vertical,EDGE_ALL:$A.All,ERRATA_NONE:ye.None,ERRATA_STRETCH_FLEX_BASIS:ye.StretchFlexBasis,ERRATA_ABSOLUTE_POSITION_WITHOUT_INSETS_EXCLUDES_PADDING:ye.AbsolutePositionWithoutInsetsExcludesPadding,ERRATA_ABSOLUTE_PERCENT_AGAINST_INNER_SIZE:ye.AbsolutePercentAgainstInnerSize,ERRATA_ALL:ye.All,ERRATA_CLASSIC:ye.Classic,EXPERIMENTAL_FEATURE_WEB_FLEX_BASIS:Yo.WebFlexBasis,FLEX_DIRECTION_COLUMN:xt.Column,FLEX_DIRECTION_COLUMN_REVERSE:xt.ColumnReverse,FLEX_DIRECTION_ROW:xt.Row,FLEX_DIRECTION_ROW_REVERSE:xt.RowReverse,GUTTER_COLUMN:hn.Column,GUTTER_ROW:hn.Row,GUTTER_ALL:hn.All,JUSTIFY_FLEX_START:De.FlexStart,JUSTIFY_CENTER:De.Center,JUSTIFY_FLEX_END:De.FlexEnd,JUSTIFY_SPACE_BETWEEN:De.SpaceBetween,JUSTIFY_SPACE_AROUND:De.SpaceAround,JUSTIFY_SPACE_EVENLY:De.SpaceEvenly,LOG_LEVEL_ERROR:be.Error,LOG_LEVEL_WARN:be.Warn,LOG_LEVEL_INFO:be.Info,LOG_LEVEL_DEBUG:be.Debug,LOG_LEVEL_VERBOSE:be.Verbose,LOG_LEVEL_FATAL:be.Fatal,MEASURE_MODE_UNDEFINED:pn.Undefined,MEASURE_MODE_EXACTLY:pn.Exactly,MEASURE_MODE_AT_MOST:pn.AtMost,NODE_TYPE_DEFAULT:Hr.Default,NODE_TYPE_TEXT:Hr.Text,OVERFLOW_VISIBLE:yn.Visible,OVERFLOW_HIDDEN:yn.Hidden,OVERFLOW_SCROLL:yn.Scroll,POSITION_TYPE_STATIC:Dn.Static,POSITION_TYPE_RELATIVE:Dn.Relative,POSITION_TYPE_ABSOLUTE:Dn.Absolute,UNIT_UNDEFINED:HA.Undefined,UNIT_POINT:HA.Point,UNIT_PERCENT:HA.Percent,UNIT_AUTO:HA.Auto,WRAP_NO_WRAP:bn.NoWrap,WRAP_WRAP:bn.Wrap,WRAP_WRAP_REVERSE:bn.WrapReverse},Tr=Vo;function wn(A){function e(r,i,o){let a=r[i];r[i]=function(){for(var s=arguments.length,g=new Array(s),l=0;l<s;l++)g[l]=arguments[l];return o.call(this,a,...g)}}for(let r of["setPosition","setMargin","setFlexBasis","setWidth","setHeight","setMinWidth","setMinHeight","setMaxWidth","setMaxHeight","setPadding","setGap"]){let i={[HA.Point]:A.Node.prototype[r],[HA.Percent]:A.Node.prototype[`${r}Percent`],[HA.Auto]:A.Node.prototype[`${r}Auto`]};e(A.Node.prototype,r,function(o){for(var a=arguments.length,s=new Array(a>1?a-1:0),g=1;g<a;g++)s[g-1]=arguments[g];let l=s.pop(),I,B;if(l==="auto")I=HA.Auto,B=void 0;else if(typeof l=="object")I=l.unit,B=l.valueOf();else if(I=typeof l=="string"&&l.endsWith("%")?HA.Percent:HA.Point,B=parseFloat(l),l!==void 0&&!Number.isNaN(l)&&Number.isNaN(B))throw new Error(`Invalid value ${l} for ${r}`);if(!i[I])throw new Error(`Failed to execute "${r}": Unsupported unit '${l}'`);return B!==void 0?i[I].call(this,...s,B):i[I].call(this,...s)})}function t(r){return A.MeasureCallback.implement({measure:function(){let{width:i,height:o}=r(...arguments);return{width:i??NaN,height:o??NaN}}})}e(A.Node.prototype,"setMeasureFunc",function(r,i){return i?r.call(this,t(i)):this.unsetMeasureFunc()});function n(r){return A.DirtiedCallback.implement({dirtied:r})}return e(A.Node.prototype,"setDirtiedFunc",function(r,i){r.call(this,n(i))}),e(A.Config.prototype,"free",function(){A.Config.destroy(this)}),e(A.Node,"create",(r,i)=>i?A.Node.createWithConfig(i):A.Node.createDefault()),e(A.Node.prototype,"free",function(){A.Node.destroy(this)}),e(A.Node.prototype,"freeRecursive",function(){for(let r=0,i=this.getChildCount();r<i;++r)this.getChild(0).freeRecursive();this.free()}),e(A.Node.prototype,"calculateLayout",function(r){let i=arguments.length>1&&arguments[1]!==void 0?arguments[1]:NaN,o=arguments.length>2&&arguments[2]!==void 0?arguments[2]:NaN,a=arguments.length>3&&arguments[3]!==void 0?arguments[3]:Ve.LTR;return r.call(this,i,o,a)}),{Config:A.Config,Node:A.Node,...Tr}}async function Jr(){return wn(await Lr())}var Mt=null;async function Wo(){return Mt||(Mt=await Jr(),Mt)}function zo(A,e){switch(e){case"center":return A.JUSTIFY_CENTER;case"end":return A.JUSTIFY_FLEX_END;case"space-between":return A.JUSTIFY_SPACE_BETWEEN;case"space-around":return A.JUSTIFY_SPACE_AROUND;default:return A.JUSTIFY_FLEX_START}}function Xo(A,e){switch(e){case"center":return A.ALIGN_CENTER;case"end":return A.ALIGN_FLEX_END;case"stretch":return A.ALIGN_STRETCH;default:return A.ALIGN_FLEX_START}}function Zo(A,e){switch(e){case"start":return A.ALIGN_FLEX_START;case"center":return A.ALIGN_CENTER;case"end":return A.ALIGN_FLEX_END;case"stretch":return A.ALIGN_STRETCH;case"baseline":return A.ALIGN_BASELINE;default:return A.ALIGN_AUTO}}function se(A){if(A!=null){if(typeof A=="number"||typeof A=="string")return A;if(typeof A=="object"){if("unit"in A&&typeof A.unit=="number")return A;let e=Number(A);if(!Number.isNaN(e))return e}}}function qo(A){switch(A.kind){case"flex":return A.dir??"row";case"block":return"column";case"box":return A.children&&A.children.length>0?"column":null;default:return null}}function _o(A){if(A.kind==="block")return"fill"}function jo(A){let e=0;if(A.kind==="flex"||A.kind==="block"){let o=se(A.gap);e=typeof o=="number"?o:0}let t=0;if(A.kind==="flex"||A.kind==="block"||A.kind==="box"||A.kind==="text"){let o=se(A.padding);t=typeof o=="number"?o:0}let n="start";A.kind==="flex"&&(n=A.justify??"start");let r="start";(A.kind==="flex"||A.kind==="block")&&(r=A.align??"start");let i=!1;return A.kind==="flex"&&(i=typeof A.wrap=="boolean"?A.wrap:!1),{gap:e,padding:t,justify:n,align:r,wrap:i}}function We(A){let e=A;return e.position==="absolute"||e.position===void 0&&(e.x!==void 0||e.y!==void 0)}function $o(A){return"children"in A&&A.children?A.children.filter(e=>!We(e)):[]}function Aa(A){return"children"in A&&A.children?A.children.filter(e=>We(e)):[]}function Kr(A,e,t,n,r){let i=e,o=A.Node.create(),a=qo(i),s=a!==null,g=[];if(We(i)){o.setPositionType(A.POSITION_TYPE_ABSOLUTE);let h=se(i.x),d=se(i.y);h!==void 0&&o.setPosition(A.EDGE_LEFT,h),d!==void 0&&o.setPosition(A.EDGE_TOP,d)}else o.setPositionType(A.POSITION_TYPE_RELATIVE);let I=se(i.grow);I!==void 0&&o.setFlexGrow(typeof I=="number"?I:parseFloat(I));let B=se(i.flexShrink);B!==void 0?o.setFlexShrink(typeof B=="number"?B:parseFloat(B)):o.setFlexShrink(r!==null?1:0),i.flexBasis!==void 0&&o.setFlexBasis(i.flexBasis),i.alignSelf!==void 0&&o.setAlignSelf(Zo(A,i.alignSelf));let E=i.width??_o(i),Q=i.height,C=r==="row",p=r==="column";if(Or(o,"width",E,t?.width,C),Or(o,"height",Q,t?.height,p),s){let h=jo(i);o.setFlexDirection(a==="row"?A.FLEX_DIRECTION_ROW:A.FLEX_DIRECTION_COLUMN),o.setJustifyContent(zo(A,h.justify)),o.setAlignItems(Xo(A,h.align)),o.setFlexWrap(h.wrap?A.WRAP_WRAP:A.WRAP_NO_WRAP),h.padding>0&&o.setPadding(A.EDGE_ALL,h.padding),h.gap>0&&o.setGap(A.GUTTER_ALL,h.gap);let d=$o(i),D=Aa(i),x=[...d,...D];for(let G=0;G<x.length;G++){let M=Kr(A,x[G],void 0,n,We(i)?null:a);o.insertChild(M.yogaNode,G),g.push(M)}}else if(i.kind==="text"||i.kind==="media"&&i.dataType==="Caption")o.setMeasureFunc((h,d,D,x)=>{let G;(d===1||d===2)&&(G=h);let M=n?.(i,G)??{width:0,height:0},w=M.width,b=M.height;return d===1&&(w=h),x===1&&(b=D),{width:w,height:b}});else{let h=n?.(i)??null;if(h){let d=i.aspectRatio!==void 0,D=i.dataType==="Caption",x=h.height>0?h.width/h.height:1;i.kind==="media"&&!D&&!d&&o.setAspectRatio(x);let G=E===void 0||E==="auto"||E==="fit",M=Q===void 0||Q==="auto"||Q==="fit";if(G&&M){let w=i.aspectRatio??(i.kind==="media"?x:void 0)??1;o.setMeasureFunc((b,N,U,L)=>{let F=h.width,J=h.height;if(N===1&&L===1)F=b,J=U;else if(N===1)F=b,J=w>0?Math.round(b/w):h.height;else if(L===1)J=U,F=w>0?Math.round(U*w):h.width;else if(N===2&&L===2){let W=Math.min(1,b/h.width,U/h.height);F=Math.round(h.width*W),J=Math.round(h.height*W)}else N===2?h.width>b&&(F=b,J=w>0?Math.round(b/w):h.height):L===2&&h.height>U&&(J=U,F=w>0?Math.round(U*w):h.width);return{width:F,height:J}})}else if(G){let w=i.aspectRatio??(i.kind==="media"?x:void 0);(w===void 0||w<=0)&&o.setWidth(h.width)}else if(M){let w=i.aspectRatio??(i.kind==="media"?x:void 0);(w===void 0||w<=0)&&o.setHeight(h.height)}}}return{yogaNode:o,layoutNode:i,children:g}}function Or(A,e,t,n,r){if(t===void 0||t==="auto"||t==="fit")return;let i=se(t);if(typeof i=="number"){e==="width"?A.setWidth(i):A.setHeight(i);return}if(i==="fill"){if(r){A.getFlexGrow()===0&&A.setFlexGrow(1),A.setFlexBasis(0);return}n!==void 0?e==="width"?A.setWidth(n):A.setHeight(n):e==="width"?A.setWidthPercent(100):A.setHeightPercent(100)}}function Yr(A,e,t,n,r){let i=A.yogaNode.getComputedLayout(),o=e+i.left,a=t+i.top,s=i.width,g=i.height,l=A.layoutNode;We(l)||(o+=Number(l.x??0),a+=Number(l.y??0)),n[A.layoutNode.id]={x:Math.round(o*1e3)/1e3,y:Math.round(a*1e3)/1e3,width:Math.round(s*1e3)/1e3,height:Math.round(g*1e3)/1e3},r[A.layoutNode.id]={width:Math.round(s*1e3)/1e3,height:Math.round(g*1e3)/1e3};for(let I of A.children)Yr(I,o,a,n,r)}function Vr(A){for(let e of A.children)Vr(e);A.yogaNode.free()}function ea(A,e){let{layout:t,viewport:n,measure:r}=e,i={},o={};for(let a of t){let s=A.Node.create();s.setWidth(n.width),s.setHeight(n.height),s.setFlexDirection(A.FLEX_DIRECTION_COLUMN);let g=Kr(A,a,{width:n.width,height:n.height},r,null);s.insertChild(g.yogaNode,0),s.calculateLayout(n.width,n.height);let l=g.yogaNode.getComputedLayout(),I=a.position==="absolute"||a.position===void 0&&(a.x!==void 0||a.y!==void 0),B=I?l.left:Number(a.x??0),E=I?l.top:Number(a.y??0);i[a.id]={x:Math.round(B*1e3)/1e3,y:Math.round(E*1e3)/1e3,width:Math.round(l.width*1e3)/1e3,height:Math.round(l.height*1e3)/1e3},o[a.id]={width:Math.round(l.width*1e3)/1e3,height:Math.round(l.height*1e3)/1e3};for(let Q of g.children)Yr(Q,B,E,i,o);Vr(g),s.free()}return{rects:i,sizes:o}}async function Jl(A){let e=await Wo();return ea(e,A)}v();function Wr(A,e){let t=Math.floor(A)^e*1013|0;return t=Math.imul(t^t>>>15,t|1),t^=t+Math.imul(t^t>>>7,t|61),((t^t>>>14)>>>0)/4294967295*2-1}function ta(A,e){let t=Math.floor(A),n=t+1,r=A-t,i=r*r*(3-2*r),o=Wr(t,e),a=Wr(n,e),s=o*r,g=a*(r-1);return(s*(1-i)+g*i)*2}function na(A,e,t=0){let n=A.frequency??2,r=A.amplitude??50,i=Math.max(1,Math.min(4,A.octaves??1)),o=A.seed??1234,a=0,s=0,g=1,l=n;for(let B=0;B<i;B++){let E=ta(e*l,o+B*7919);a+=E*g,s+=g,g*=.5,l*=2}let I=s>0?a/s:0;return t+I*r}function ra(A,e,t,n){if(e<=0)return t;let r=Math.max(.001,A.mass??1),i=Math.max(.001,A.stiffness??180),o=Math.max(.001,A.damping??12),a=Math.sqrt(i/r),s=o/(2*Math.sqrt(i*r)),g=1;if(s<1){let l=a*Math.sqrt(1-s*s),I=-1,B=-s*a/l;g=1+Math.exp(-s*a*e)*(I*Math.cos(l*e)+B*Math.sin(l*e))}else if(Math.abs(s-1)<1e-4)g=1+Math.exp(-a*e)*(-1-a*e);else{let l=Math.sqrt(s*s-1),I=-a*(s-l),B=-a*(s+l),E=-1/(1-I/B),Q=-1-E;g=1+E*Math.exp(I*e)+Q*Math.exp(B*e)}return t+(n-t)*g}function RA(A,e,t){if(A==null)return 0;if(typeof A=="number")return A;if(typeof A=="function")return Number(A(e,t))||0;if(Array.isArray(A)||ArrayBuffer.isView(A)){let n=A;if(n.length===0)return 0;let r=Math.max(0,Math.min(n.length-1,Math.round(e)));return Number(n[r])||0}if(typeof A=="object"){let n=A;if(typeof n.get=="function")return Number(n.get({frame:e,fps:t,time:t>0?e/t:0}))||0;if(n.type==="Signal"&&n.data)return RA(n.data,e,t);let r=n.samples??(typeof n.channel=="string"&&n[n.channel]!==void 0?n[n.channel]:void 0);if(Array.isArray(r)||ArrayBuffer.isView(r)){let i=r;if(i.length===0)return 0;let o=Number(n.fps)||24,a=t>0?t:24,s=e/a,g=Math.max(0,Math.min(i.length-1,Math.round(s*o)));return Number(i[g])||0}if(n.type==="audio_extractor"||n.extractionMode!==void 0){let i=n.nodeId;if(i){let o=n.channel??"primary",a=Yn.getChannelSamples(i,o);if(a&&a.length>0){let s=Number(n.fps)||24,g=t>0?t:24,l=e/g,I=Math.max(0,Math.min(a.length-1,Math.round(l*s)));return Number(a[I])||0}}return 0}if(n.type==="generator"){let i=typeof n.amplitude=="number"?n.amplitude:1,o=typeof n.frequency=="number"?n.frequency:1;if(n.syncToBpm&&typeof n.bpm=="number"&&n.bpm>0){let h=typeof n.bars=="number"&&n.bars>0?n.bars:1;o=n.bpm/60/h}let a=typeof n.phase=="number"?n.phase:0,s=typeof n.offset=="number"?n.offset:0,g=e/(t>0?t:24),l=n.baseType??"sine",I=!!n.fmEnabled,B=g;if(I){let h=Number(n.fmAmplitude)||1,d=Number(n.fmFrequency)||.5;B=g+Math.sin(g*d*Math.PI*2)*h}let E=0,Q=(B*o+a/(Math.PI*2))%1,C=Q<0?Q+1:Q,p=h=>(h%1+1)%1;switch(l){case"triangle":E=4*Math.abs(C-.5)-1;break;case"sawtooth":E=2*C-1;break;case"square":E=C<.5?1:-1;break;case"constant":E=1;break;case"noise_smooth":{let h=B*o+a,d=Math.floor(h),D=h-d,x=D*D*(3-2*D),G=p(Math.sin(d*12.9898)*43758.5453),M=p(Math.sin((d+1)*12.9898)*43758.5453);E=(G*(1-x)+M*x)*2-1;break}case"noise_white":E=p(Math.sin(B*12.9898+a)*43758.5453)*2-1;break;case"pulse":{let h=a===0?.5:Math.max(.01,Math.min(.99,a));E=p(B*o)<h?1:-1;break}case"bounce":E=Math.abs(Math.sin(B*o*Math.PI+a));break;case"staircase":E=Math.floor(C*8)/7*2-1;break;default:E=Math.sin(B*o*Math.PI*2+a);break}return E*i+s}if(n.type==="gate"){let i=n.sourceSignal??n.signal,o=typeof n.threshold=="number"?n.threshold:.5,a=n.mode??"gate",s=!!n.invert,g=typeof n.debounceMs=="number"?n.debounceMs:0,l=Math.max(1,Math.round(g/1e3*t)),I=Math.max(1,Number(n.holdFrames)||4),B=0;if(a==="gate")B=RA(i,e,t)>=o?1:0;else if(a==="trigger"){let E=-1/0,Q=Math.max(0,e-300);for(let C=Q;C<=e;C++){let p=RA(i,C,t),h=C>0?RA(i,C-1,t):0;p>=o&&h<o&&C-E>=l&&(E=C)}B=e>=E&&e<E+I?1:0}else if(a==="toggle"){let E=0,Q=-1/0;for(let C=0;C<=e;C++){let p=RA(i,C,t),h=C>0?RA(i,C-1,t):0;p>=o&&h<o&&C-Q>=l&&(E++,Q=C)}B=E%2===1?1:0}return s?1-B:B}if(n.type==="signal_math"){let i=RA(n.signalA,e,t),a=n.signalB!==void 0?RA(n.signalB,e,t):Number(n.bValue)||0;switch(n.operation){case"add":return i+a;case"subtract":return i-a;case"multiply":return i*a;case"divide":return a!==0?i/a:0;case"min":return Math.min(i,a);case"max":return Math.max(i,a);case"clamp":{let s=Number(n.clampMin)||0,g=Number(n.clampMax)||1;return Math.max(s,Math.min(g,i))}case"abs":return Math.abs(i);case"negate":return-i;case"invert":return 1-i;case"power":return i**(Number(n.exponent)||2);case"modulo":return a!==0?i%a:0;case"remap":{let s=Number(n.inMin)||0,g=Number(n.inMax)||1,l=Number(n.outMin)||0,I=Number(n.outMax)||1,B=g-s,E=B!==0?(i-s)/B:0;return l+E*(I-l)}case"normalize":{let s=Number(n.aMin??n.inMin)||0,l=(Number(n.aMax??n.inMax)||1)-s;return l!==0?Math.max(0,Math.min(1,(i-s)/l)):0}case"smoothstep":{let s=Number(n.edge0)||0,l=(Number(n.edge1)||1)-s,I=l!==0?Math.max(0,Math.min(1,(i-s)/l)):0;return I*I*(3-2*I)}case"custom":return i;default:return i}}if(typeof n.value=="number")return n.value}return 0}function ia(A,e,t,n=.15,r=2){if(e<0||!A)return 0;let i=A,o=0,a=-1/0;for(let s=0;s<=e;s++){let g=RA(i,s,t),l=s>0?RA(i,s-1,t):0;g>=n&&l<n&&s-a>=r&&(o++,a=s)}return o}function oa(A,e,t,n={}){let r=n[A.inputHandleId];if(r===void 0&&n){let B=Object.keys(n);if(B.length===1)r=n[B[0]];else if(B.length>1){let E=B.find(Q=>Q===A.inputHandleId);r=E?n[E]:n[B[0]]}}if(A.channel&&r&&typeof r=="object"){let B=r[A.channel];B!==void 0?r=B:typeof r.get!="function"&&(r={...r,channel:A.channel})}if(A.signalMode==="accumulate"){let B=A.threshold??A.accumulateThreshold??.15,E=A.debounceFrames??2,Q=ia(r,e,t,B,E),C=A.multiplier??1,p=A.offset??0;return Q*C+p}let i=A.multiplier??1,o=A.offset??0,a=Math.max(0,Math.round(A.smoothingWindowFrames??0));if(a<=1)return RA(r,e,t)*i+o;let s=0,g=0,l=Math.max(0,e-a+1);for(let B=l;B<=e;B++)s+=RA(r,B,t),g++;return(g>0?s/g:0)*i+o}function aa(A,e,t){return A+(e-A)*t}function sa(A){let e=A.trim().replace("#","");if(e.length===3&&(e=e[0]+e[0]+e[1]+e[1]+e[2]+e[2]),e.length===6){let t=parseInt(e,16);return[t>>16&255,t>>8&255,t&255,1]}if(e.length===8){let t=parseInt(e,16);return[t>>24&255,t>>16&255,t>>8&255,(t&255)/255]}return[255,255,255,1]}function zr(A,e,t){return Kn(A,e,t)}function xn(A,e,t){let n=t;return n<0&&(n+=1),n>1&&(n-=1),n<1/6?A+(e-A)*6*n:n<1/2?e:n<2/3?A+(e-A)*(2/3-n)*6:A}function ga(A,e){let[t,n,r,i]=sa(A),o=t/255,a=n/255,s=r/255,g=Math.max(o,a,s),l=Math.min(o,a,s),I=0,B=0,E=(g+l)/2;if(g!==l){let d=g-l;switch(B=E>.5?d/(2-g-l):d/(g+l),g){case o:I=(a-s)/d+(a<s?6:0);break;case a:I=(s-o)/d+2;break;case s:I=(o-a)/d+4;break}I/=6}I=(I+e%1+1)%1;let Q=E,C=E,p=E;if(B!==0){let d=E<.5?E*(1+B):E+B-E*B,D=2*E-d;Q=xn(D,d,I+1/3),C=xn(D,d,I),p=xn(D,d,I-1/3)}let h=d=>Math.round(Math.max(0,Math.min(255,d*255))).toString(16).padStart(2,"0");return i>=.999?`#${h(Q)}${h(C)}${h(p)}`:`rgba(${Math.round(Q*255)}, ${Math.round(C*255)}, ${Math.round(p*255)}, ${Math.round(i*100)/100})`}var la=new Set(["fill","fillColor","strokeColor","textBackgroundColor","color"]);function Mn(A,e){let t=A.keyframes??[];if(t.length===0)return 0;if(t.length===1||e<=t[0].frame)return t[0].value;if(e>=t[t.length-1].frame)return t[t.length-1].value;for(let n=0;n<t.length-1;n++){let r=t[n],i=t[n+1];if(e>=r.frame&&e<=i.frame){let o=i.frame-r.frame,a=o>0?(e-r.frame)/o:0;if(typeof r.value=="boolean")return a>=1?i.value:r.value;if(typeof r.value=="string"&&typeof i.value=="string")return zr(r.value,i.value,a);let s=Number(r.value)||0,g=Number(i.value)||0;return aa(s,g,a)}}return t[t.length-1].value}function Ia(A,e,t=24,n={}){let r=n.startFrame??0,i=e-r,o=A.source??{type:"keyframe"},a=n.baseValues?.[A.prop];switch(o.type){case"keyframe":return Mn(A,i);case"wiggle":{let s=typeof a=="number"?a:0,g=A.keyframes&&A.keyframes.length>0?Number(Mn(A,i))||0:s,l=i/(t>0?t:24);return na(o,l,g)}case"springOvershoot":{let s=0,g=1;A.keyframes&&A.keyframes.length>=2?(s=Number(A.keyframes[0].value)||0,g=Number(A.keyframes[1].value)||1):A.keyframes&&A.keyframes.length===1?(s=Number(a)||0,g=Number(A.keyframes[0].value)||0):typeof a=="number"&&(s=a,g=a);let l=i/(t>0?t:24);return ra(o,l,s,g)}case"signal":{let s=oa(o,e,t,n.signals);if(la.has(A.prop)){let g=o,l=g.colorA??"#ffffff",I=g.colorB??"#ffffff",B=g.colorMode??"interpolate";if(B==="threshold"){let Q=g.colorThreshold??.5;return s>=Q?I:l}if(B==="hueRotate")return ga(l,s);let E=Math.max(0,Math.min(1,s));return zr(l,I,E)}return s}default:return Mn(A,i)}}function Wl(A,e,t=24,n={}){let r={};if(!A?.tracks)return r;for(let i of A.tracks)r[i.prop]=Ia(i,e,t,n);return r}v();var Xr=["x","y","width","height"];function ua(A){let e=A.matte,{matte:t,...n}=A,r={...n};if(Array.isArray(r.children)&&(r.children=Gt(r.children)),!e?.node)return[r];let i=e.node,o=i.id??`${String(A.id)}__matte`,a={position:"absolute",...i,id:o,matteOf:String(A.id),matteMode:e.mode??"alpha"};if(Xr.every(g=>i[g]===void 0))for(let g of Xr)typeof A[g]=="number"&&(a[g]=A[g]);let s=typeof A.startFrame=="number"?A.startFrame:0;return a.startFrame=s+(typeof i.startFrame=="number"?i.startFrame:0),i.durationFrames===void 0&&A.durationFrames!==void 0&&(a.durationFrames=A.durationFrames),Array.isArray(a.children)&&(a.children=Gt(a.children)),r.matteId=o,[r,a]}function Gt(A){return A.flatMap(e=>ua(e))}v();function Gn(A,e,t,n="forward"){if(t<=0||e<=1)return 0;switch(n){case"reverse":return(e-1-A)*t;case"center-out":{let r=(e-1)/2,i=Math.abs(A-r);return Math.round(i*t)}default:return A*t}}function _l(A,e,t="forward",n=0){return!A||A.length===0?[]:e<=0&&n===0?[...A]:A.map((r,i)=>{let o=Gn(i,A.length,e,t),a=r.startFrame??0;return{...r,startFrame:a+o+n}})}v();v();var qr=Symbol.for("framefields.inlineSignal"),Zr=new WeakMap,ca=0;function Ba(A){let e=Zr.get(A);return e===void 0&&(e=`inline_signal_${ca++}`,Zr.set(A,e)),e}function AI(A){if(typeof A=="string")return{handleId:A};if(A===null||typeof A!="object"&&typeof A!="function")throw new TypeError(`LayerAnimation.signal: expected a signal object or a signal name, got ${String(A)}. Pass a signal (Signal.fromArray / Signal.builder / an audio channel \u2026) or register it with comp.addSignal(name, signal) and pass the name.`);let e=A;return typeof e.inputHandleId=="string"?{handleId:e.inputHandleId}:typeof e.gpuBinding?.nodeId=="string"?typeof e.get=="function"?{handleId:e.gpuBinding.nodeId,inline:A}:{handleId:e.gpuBinding.nodeId}:{handleId:Ba(A),inline:A}}function eI(A,e){Object.defineProperty(A,qr,{value:e,enumerable:!1,configurable:!0,writable:!0})}function Ea(A){if(!(!A||typeof A!="object"))return A[qr]}function Nn(A,e={}){for(let t of A){if(!t||typeof t!="object")continue;let{animation:n,children:r}=t,i=n?.tracks;if(Array.isArray(i))for(let o of i){let a=o?.source,s=Ea(a);s&&typeof a?.inputHandleId=="string"&&(e[a.inputHandleId]=s)}Array.isArray(r)&&Nn(r,e)}return e}function _r(A,e,t,n=0,r,i){let o=[],a=A.src??A.inputHandleId,s=d=>typeof d=="string"&&(d.startsWith("http://")||d.startsWith("https://")||d.startsWith("file://")||d.startsWith("/")||d.startsWith("./")||d.startsWith("blob:")||d.startsWith("data:")||/\.(png|jpe?g|webp|gif|svg|mp4|webm|mov|mkv|mp3|wav|ogg|m4a|srt|vtt|json|lottie)$/i.test(d)),g;if(A.kind==="media"){if(e&&(g=e(A.inputHandleId)),!g&&a&&(s(a)||A.src)&&(g=Tn(a,A.dataType??"Video")),!g&&!e&&a&&(a.includes(".")||a.includes("/"))&&console.warn(`[Compositor] Media layer '${A.id??"?"}' source '${a}' could not be resolved.`),g&&A.crop){let d=A.crop,D=typeof d.toOperation=="function"?d.toOperation():d;g={metadata:{...g.metadata},operation:{op:"Crop",...D,dataType:g.operation.dataType},children:[g]}}if(g&&Array.isArray(A.effects))for(let d of A.effects){let D=typeof d.toOperation=="function"?d.toOperation():d;g={metadata:{...g.metadata},operation:{id:A.id?`${A.id}-${D.op??"effect"}`:void 0,effect:d,...D,dataType:g.operation.dataType},children:[g]}}if(g&&A.vision){let d=A.vision,D=typeof d.toOperation=="function"?d.toOperation():d;g={metadata:{...g.metadata},operation:{op:"Vision",id:A.id,effect:d,...D,dataType:g.operation.dataType},children:[g]}}}if(A.kind==="media")o=g?[g]:[];else if("children"in A&&A.children){let d="staggerFrames"in A&&typeof A.staggerFrames=="number"?A.staggerFrames:0,D="staggerDirection"in A&&typeof A.staggerDirection=="string"?A.staggerDirection:"forward",x=typeof A.startFrame=="number"&&Number.isFinite(A.startFrame)?Math.round(A.startFrame):0,G=typeof A.durationFrames=="number"&&Number.isFinite(A.durationFrames)?Math.round(A.durationFrames):i;o=A.children.map((M,w)=>{let b=Gn(w,A.children.length,d,D),N=n+x+b;return _r(M,e,t,N,r,M.durationFrames===void 0?G:void 0)})}let l="Image",I;if(g){l=g.operation?.dataType??"Image";let D=l==="Image"||l==="SVG"?void 0:Jn(g)?.durationMs;D!=null&&(I=Math.max(1,Math.round(D/1e3*t)))}let B=g?.operation?.dataType==="Caption",E=A.kind==="flex"||A.kind==="block"||A.kind==="box",Q=(typeof A.startFrame=="number"&&Number.isFinite(A.startFrame)&&A.startFrame>=0?Math.round(A.startFrame):0)+n,C=typeof A.durationFrames=="number"&&Number.isFinite(A.durationFrames)&&A.durationFrames>0?Math.round(A.durationFrames):void 0,p=i??Math.round((r??1e4)/1e3*t);if(E&&o.length>0){if(C===void 0){let d=o.map(D=>(D.operation?.startFrame??0)+(D.operation?.durationFrames??p));C=Math.max(1,Math.max(...d)-Q)}}else B&&I!==void 0&&I>0?C=I:C!==void 0?(l==="Video"||l==="Audio")&&I!==void 0&&I>0&&(C=Math.min(C,I)):C=I??i??Math.round((r??1e4)/1e3*t);let h=C/t*1e3;if(A.kind==="media"&&g){let d=g;for(;d;)(!d.metadata?.durationMs||d.metadata.durationMs<=0)&&(d.metadata||(d.metadata={}),d.metadata.durationMs=h),d.operation?.sourceMeta&&!d.operation.sourceMeta.durationMs&&(d.operation.sourceMeta.durationMs=h),d=d.children?.[0]}return{metadata:{durationMs:h},operation:{op:"CompositorLayer",...A,startFrame:Q,durationFrames:C,dataType:l},children:o}}function sI(A,e){let{isVideoMode:t,fps:n,durationMs:r,resolveMedia:i,signals:o}=e,a={metadata:{width:A.width,height:A.height,fps:n,...r!==void 0&&{durationMs:r}},operation:{op:"Compositor",width:A.width,height:A.height,fps:n,mode:A.mode??"Video",backgroundColor:A.backgroundColor,...A.antialias3d!==void 0&&{antialias3d:A.antialias3d},volume:A.volume??1,dataType:t?"Video":"Image",layout:A.layout,signals:{...Nn(A.layout),...o??A.signals??{}},...(A.onRequestFrame||e.onRequestFrame)&&{onRequestFrame:A.onRequestFrame??e.onRequestFrame}},children:Gt(A.layout).map(l=>_r(l,i,n,0,r))},s=Array.isArray(e.effects)?e.effects:Array.isArray(A.effects)?A.effects:[];for(let l of s){let I=typeof l.toOperation=="function"?l.toOperation():l;a={metadata:{...a.metadata},operation:{...I,dataType:a.operation.dataType},children:[a]}}let g=A.vision??e.vision;if(g){let l=typeof g.toOperation=="function"?g.toOperation():g;a={metadata:{...a.metadata},operation:{op:"Vision",...l,dataType:a.operation.dataType},children:[a]}}return a}function gI(A){let e=[],t=n=>{n?.operation?.op==="CompositorLayer"&&e.push(n);for(let r of n?.children??[])t(r)};for(let n of A)t(n);return e}export{nt as a,qn as b,R as c,_ as d,Ie as e,pi as f,er as g,it as h,Kt as i,Ot as j,qA as k,Pa as l,Ha as m,Ne as n,Wa as o,Fe as p,sr as q,Bs as r,at as s,ct as t,El as u,dl as v,mr as w,hr as x,pr as y,rl as z,yr as A,Dr as B,so as C,sl as D,dn as E,Dl as F,Wo as G,ea as H,Jl as I,AI as J,eI as K,Ia as L,Wl as M,Gt as N,Gn as O,_l as P,sI as Q,gI as R};