framefields 2.3.2 → 2.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (266) hide show
  1. package/README.md +24 -1
  2. package/dist/audio/index.d.mts +4 -4
  3. package/dist/audio/index.mjs +10 -10
  4. package/dist/{audio-BNnEclHU.d.mts → audio-C6toT7F3.d.mts} +3 -3
  5. package/dist/{audio-BNnEclHU.d.mts.map → audio-C6toT7F3.d.mts.map} +1 -1
  6. package/dist/{audio-C7Kn5xBm.mjs → audio-DXwNhi1z.mjs} +3 -3
  7. package/dist/{audio-C7Kn5xBm.mjs.map → audio-DXwNhi1z.mjs.map} +1 -1
  8. package/dist/{dist-CPUIfrtw.mjs → dist-Cl0mvShy.mjs} +2 -2
  9. package/dist/{dist-CPUIfrtw.mjs.map → dist-Cl0mvShy.mjs.map} +1 -1
  10. package/dist/{dist-CturBK2Z.mjs → dist-DRB6Vg5u.mjs} +1188 -743
  11. package/dist/dist-DRB6Vg5u.mjs.map +1 -0
  12. package/dist/effects/index.d.mts +4 -4
  13. package/dist/effects/index.mjs +34 -34
  14. package/dist/{effects-CW1VgdI5.mjs → effects-lBqG-vd1.mjs} +2 -2
  15. package/dist/{effects-CW1VgdI5.mjs.map → effects-lBqG-vd1.mjs.map} +1 -1
  16. package/dist/fonts/index.mjs +2 -2
  17. package/dist/{fonts-EgMNL8KE.mjs → fonts-DlRJD6NS.mjs} +2 -2
  18. package/dist/{fonts-EgMNL8KE.mjs.map → fonts-DlRJD6NS.mjs.map} +1 -1
  19. package/dist/{gpu-CN14e7Bi.mjs → gpu-DOQX1W2q.mjs} +2 -2
  20. package/dist/{gpu-CN14e7Bi.mjs.map → gpu-DOQX1W2q.mjs.map} +1 -1
  21. package/dist/{index-QmkcUL3W.d.mts → index-BHqdtJbN.d.mts} +2 -2
  22. package/dist/{index-QmkcUL3W.d.mts.map → index-BHqdtJbN.d.mts.map} +1 -1
  23. package/dist/{index-CeRv1KC0.d.mts → index-BONyHjZX.d.mts} +3 -3
  24. package/dist/{index-CeRv1KC0.d.mts.map → index-BONyHjZX.d.mts.map} +1 -1
  25. package/dist/{index-Cg2ptXcs.d.mts → index-CaiZ5p6q.d.mts} +2 -2
  26. package/dist/{index-Cg2ptXcs.d.mts.map → index-CaiZ5p6q.d.mts.map} +1 -1
  27. package/dist/{index-BU51pxZO.d.mts → index-Cf1pVxn0.d.mts} +4 -4
  28. package/dist/{index-BU51pxZO.d.mts.map → index-Cf1pVxn0.d.mts.map} +1 -1
  29. package/dist/{index-AdrZIWT0.d.mts → index-DEODKaL6.d.mts} +13 -1
  30. package/dist/index-DEODKaL6.d.mts.map +1 -0
  31. package/dist/{index-B3BwLHa6.d.mts → index-DN9oXO-X.d.mts} +3 -3
  32. package/dist/{index-B3BwLHa6.d.mts.map → index-DN9oXO-X.d.mts.map} +1 -1
  33. package/dist/index.d.mts +177 -9
  34. package/dist/index.d.mts.map +1 -1
  35. package/dist/index.mjs +485 -90
  36. package/dist/index.mjs.map +1 -1
  37. package/dist/preview/index.d.mts +2 -2
  38. package/dist/preview/index.mjs +10 -10
  39. package/dist/{preview-1sjnhHQL.mjs → preview-Ca4tF5Ro.mjs} +2 -2
  40. package/dist/{preview-1sjnhHQL.mjs.map → preview-Ca4tF5Ro.mjs.map} +1 -1
  41. package/dist/preview-engine/chunk-7QJUC6YY.mjs +1525 -0
  42. package/dist/preview-engine/framefields.mjs +32 -25
  43. package/dist/preview-engine/player.mjs +1 -1
  44. package/dist/preview-engine/{renderers-WP2LBR5U.mjs → renderers-HQEKSUNR.mjs} +3 -3
  45. package/dist/{program-DtiNMTxO.mjs → program-CJEg2wMa.mjs} +2 -2
  46. package/dist/{program-DtiNMTxO.mjs.map → program-CJEg2wMa.mjs.map} +1 -1
  47. package/dist/renderer/index.d.mts +2 -2
  48. package/dist/renderer/index.mjs +2 -2
  49. package/dist/renderer--IHe-yqK.mjs +5 -0
  50. package/dist/{renderer-CMzd3BrW.mjs → renderer-445i0uxs.mjs} +2 -2
  51. package/dist/{renderer-CMzd3BrW.mjs.map → renderer-445i0uxs.mjs.map} +1 -1
  52. package/dist/{renderer-MS70wrQB.mjs → renderer-5tQ7ImPk.mjs} +2 -2
  53. package/dist/{renderer-MS70wrQB.mjs.map → renderer-5tQ7ImPk.mjs.map} +1 -1
  54. package/dist/{renderer-Dw1e5phO.mjs → renderer-Ai5nZsof.mjs} +3 -3
  55. package/dist/{renderer-Dw1e5phO.mjs.map → renderer-Ai5nZsof.mjs.map} +1 -1
  56. package/dist/renderer-B16iwR0_.mjs +5 -0
  57. package/dist/renderer-B3EEYpx6.mjs +5 -0
  58. package/dist/renderer-B3Si5IB4.mjs +5 -0
  59. package/dist/{renderer-ktpusVT2.mjs → renderer-B4JmNa_T.mjs} +3 -3
  60. package/dist/{renderer-ktpusVT2.mjs.map → renderer-B4JmNa_T.mjs.map} +1 -1
  61. package/dist/{renderer-CBG6ewNf.mjs → renderer-B6UqWjtH.mjs} +3 -3
  62. package/dist/{renderer-CBG6ewNf.mjs.map → renderer-B6UqWjtH.mjs.map} +1 -1
  63. package/dist/{renderer-BmWH4dK1.mjs → renderer-B8v8iEkB.mjs} +7 -6
  64. package/dist/{renderer-BmWH4dK1.mjs.map → renderer-B8v8iEkB.mjs.map} +1 -1
  65. package/dist/{renderer-dJcu7WqI.mjs → renderer-BFWRUTov.mjs} +3 -3
  66. package/dist/{renderer-dJcu7WqI.mjs.map → renderer-BFWRUTov.mjs.map} +1 -1
  67. package/dist/renderer-BH8vZKmX.mjs +5 -0
  68. package/dist/renderer-BHZie6Pa.mjs +5 -0
  69. package/dist/renderer-BHpJ1e15.mjs +5 -0
  70. package/dist/{renderer-CRYO5HQw.mjs → renderer-BL36f2IQ.mjs} +2 -2
  71. package/dist/{renderer-CRYO5HQw.mjs.map → renderer-BL36f2IQ.mjs.map} +1 -1
  72. package/dist/{renderer-Bq9jXYJ5.mjs → renderer-BOvCstdU.mjs} +3 -3
  73. package/dist/{renderer-Bq9jXYJ5.mjs.map → renderer-BOvCstdU.mjs.map} +1 -1
  74. package/dist/renderer-BPJ79b47.mjs +5 -0
  75. package/dist/renderer-BPbM_6WR.mjs +5 -0
  76. package/dist/{renderer-DjwF10p2.mjs → renderer-BPsi7Q7Z.mjs} +3 -3
  77. package/dist/{renderer-DjwF10p2.mjs.map → renderer-BPsi7Q7Z.mjs.map} +1 -1
  78. package/dist/{renderer-BYj8x8YM.mjs → renderer-BTJyO6ov.mjs} +2 -2
  79. package/dist/{renderer-BYj8x8YM.mjs.map → renderer-BTJyO6ov.mjs.map} +1 -1
  80. package/dist/{renderer-DmOewVsB.mjs → renderer-BZCLdb8F.mjs} +3 -3
  81. package/dist/{renderer-DmOewVsB.mjs.map → renderer-BZCLdb8F.mjs.map} +1 -1
  82. package/dist/{renderer-CbNW0KHh.mjs → renderer-BZF48o1T.mjs} +3 -3
  83. package/dist/{renderer-CbNW0KHh.mjs.map → renderer-BZF48o1T.mjs.map} +1 -1
  84. package/dist/{renderer-_Fh9IBlE.mjs → renderer-BZWiY6Jw.mjs} +3 -3
  85. package/dist/{renderer-_Fh9IBlE.mjs.map → renderer-BZWiY6Jw.mjs.map} +1 -1
  86. package/dist/{renderer-Fm2brScz.mjs → renderer-BZvWlGsa.mjs} +3 -3
  87. package/dist/{renderer-Fm2brScz.mjs.map → renderer-BZvWlGsa.mjs.map} +1 -1
  88. package/dist/{renderer-DL4oR40b.mjs → renderer-BaBluD-r.mjs} +2 -2
  89. package/dist/{renderer-DL4oR40b.mjs.map → renderer-BaBluD-r.mjs.map} +1 -1
  90. package/dist/{renderer-DacnnTjY.mjs → renderer-BaHEN_Kv.mjs} +3 -3
  91. package/dist/{renderer-DacnnTjY.mjs.map → renderer-BaHEN_Kv.mjs.map} +1 -1
  92. package/dist/{renderer-Mdyv_W8K.mjs → renderer-BhZutM8K.mjs} +3 -3
  93. package/dist/{renderer-Mdyv_W8K.mjs.map → renderer-BhZutM8K.mjs.map} +1 -1
  94. package/dist/renderer-Bn-WnRh9.mjs +5 -0
  95. package/dist/renderer-BqHvDAUe.mjs +5 -0
  96. package/dist/{renderer-D8tdGi2P.mjs → renderer-BtJ6XYN7.mjs} +3 -3
  97. package/dist/{renderer-D8tdGi2P.mjs.map → renderer-BtJ6XYN7.mjs.map} +1 -1
  98. package/dist/{renderer-F410V727.mjs → renderer-BzgnTEvf.mjs} +3 -3
  99. package/dist/{renderer-F410V727.mjs.map → renderer-BzgnTEvf.mjs.map} +1 -1
  100. package/dist/{renderer-D-eTVnDS.mjs → renderer-C-La-IAt.mjs} +2 -2
  101. package/dist/{renderer-D-eTVnDS.mjs.map → renderer-C-La-IAt.mjs.map} +1 -1
  102. package/dist/{renderer-BFHgl-0f.mjs → renderer-C2ZIAhdJ.mjs} +2 -2
  103. package/dist/{renderer-BFHgl-0f.mjs.map → renderer-C2ZIAhdJ.mjs.map} +1 -1
  104. package/dist/{renderer-BebePsG7.mjs → renderer-C9pl21Zb.mjs} +2 -2
  105. package/dist/{renderer-BebePsG7.mjs.map → renderer-C9pl21Zb.mjs.map} +1 -1
  106. package/dist/renderer-CAtXDNsh.mjs +5 -0
  107. package/dist/{renderer-BkXqFmNO.mjs → renderer-CCCitH4J.mjs} +2 -2
  108. package/dist/{renderer-BkXqFmNO.mjs.map → renderer-CCCitH4J.mjs.map} +1 -1
  109. package/dist/{renderer-QMGrRiab.mjs → renderer-CCu1Q8ib.mjs} +2 -2
  110. package/dist/{renderer-QMGrRiab.mjs.map → renderer-CCu1Q8ib.mjs.map} +1 -1
  111. package/dist/{renderer-DvoPplvC.mjs → renderer-CG4TmDWH.mjs} +2 -2
  112. package/dist/{renderer-S6ez0leJ.mjs → renderer-CJmZURPQ.mjs} +2 -2
  113. package/dist/{renderer-S6ez0leJ.mjs.map → renderer-CJmZURPQ.mjs.map} +1 -1
  114. package/dist/{renderer-CPNLkir4.mjs → renderer-CN3iCli4.mjs} +2 -2
  115. package/dist/{renderer-CPNLkir4.mjs.map → renderer-CN3iCli4.mjs.map} +1 -1
  116. package/dist/{renderer--S2cNYXS.mjs → renderer-CNS8LA2_.mjs} +3 -3
  117. package/dist/{renderer--S2cNYXS.mjs.map → renderer-CNS8LA2_.mjs.map} +1 -1
  118. package/dist/renderer-C_5nfVce.mjs +5 -0
  119. package/dist/{renderer-ButaUWLr.mjs → renderer-CduDa1qf.mjs} +3 -3
  120. package/dist/{renderer-ButaUWLr.mjs.map → renderer-CduDa1qf.mjs.map} +1 -1
  121. package/dist/{renderer-Ch1rv1XP.mjs → renderer-CduL1AOK.mjs} +2 -2
  122. package/dist/{renderer-Ch1rv1XP.mjs.map → renderer-CduL1AOK.mjs.map} +1 -1
  123. package/dist/{renderer-z3YOOR3k.mjs → renderer-Cfto0m0-.mjs} +3 -3
  124. package/dist/{renderer-z3YOOR3k.mjs.map → renderer-Cfto0m0-.mjs.map} +1 -1
  125. package/dist/{renderer-CJwgsecF.mjs → renderer-CgZ1G37H.mjs} +2 -2
  126. package/dist/{renderer-CJwgsecF.mjs.map → renderer-CgZ1G37H.mjs.map} +1 -1
  127. package/dist/renderer-Cie7KKeQ.mjs +5 -0
  128. package/dist/{renderer-BaOC1Pd1.mjs → renderer-CjTxu89O.mjs} +3 -3
  129. package/dist/{renderer-BaOC1Pd1.mjs.map → renderer-CjTxu89O.mjs.map} +1 -1
  130. package/dist/{renderer-C2Ff-9u_.mjs → renderer-CoN2JgLO.mjs} +2 -2
  131. package/dist/{renderer-C2Ff-9u_.mjs.map → renderer-CoN2JgLO.mjs.map} +1 -1
  132. package/dist/{renderer-DjPC9l3w.mjs → renderer-CoO2j8AC.mjs} +3 -3
  133. package/dist/{renderer-DjPC9l3w.mjs.map → renderer-CoO2j8AC.mjs.map} +1 -1
  134. package/dist/{renderer-BRWpn3dT.mjs → renderer-CoX23zo_.mjs} +3 -3
  135. package/dist/{renderer-BRWpn3dT.mjs.map → renderer-CoX23zo_.mjs.map} +1 -1
  136. package/dist/renderer-CuoxvPsX.mjs +5 -0
  137. package/dist/renderer-Cvd3oIJQ.mjs +5 -0
  138. package/dist/renderer-CxAgpBrJ.mjs +5 -0
  139. package/dist/{renderer-C4puWDLK.mjs → renderer-CxSH3F_n.mjs} +2 -2
  140. package/dist/{renderer-C4puWDLK.mjs.map → renderer-CxSH3F_n.mjs.map} +1 -1
  141. package/dist/{renderer-B6c_Rk_2.mjs → renderer-Cz9fzS11.mjs} +3 -3
  142. package/dist/{renderer-B6c_Rk_2.mjs.map → renderer-Cz9fzS11.mjs.map} +1 -1
  143. package/dist/{renderer-BAmGO6Hj.mjs → renderer-D-IcBLT0.mjs} +3 -3
  144. package/dist/{renderer-BAmGO6Hj.mjs.map → renderer-D-IcBLT0.mjs.map} +1 -1
  145. package/dist/renderer-D-cWBX0r.mjs +5 -0
  146. package/dist/{renderer-DqlvbOUt.mjs → renderer-D-e3vDnO.mjs} +3 -3
  147. package/dist/{renderer-DqlvbOUt.mjs.map → renderer-D-e3vDnO.mjs.map} +1 -1
  148. package/dist/renderer-D0q2VyJR.mjs +5 -0
  149. package/dist/{renderer-BqSiWRoD.mjs → renderer-D4E8Yf61.mjs} +2 -2
  150. package/dist/{renderer-BqSiWRoD.mjs.map → renderer-D4E8Yf61.mjs.map} +1 -1
  151. package/dist/renderer-D6NXn3Ky.mjs +5 -0
  152. package/dist/renderer-D9bp2jor.mjs +5 -0
  153. package/dist/{renderer-GlyeFl5R.mjs → renderer-DA1brg35.mjs} +3 -3
  154. package/dist/{renderer-GlyeFl5R.mjs.map → renderer-DA1brg35.mjs.map} +1 -1
  155. package/dist/{renderer-DNhOjz6C.mjs → renderer-DAFi5TC_.mjs} +2 -2
  156. package/dist/{renderer-DNhOjz6C.mjs.map → renderer-DAFi5TC_.mjs.map} +1 -1
  157. package/dist/renderer-DEzIOIB7.mjs +5 -0
  158. package/dist/{renderer-B5Icb0XW.mjs → renderer-DFX2V9Dp.mjs} +2 -2
  159. package/dist/{renderer-B5Icb0XW.mjs.map → renderer-DFX2V9Dp.mjs.map} +1 -1
  160. package/dist/{renderer-w8LKBg_5.mjs → renderer-DH0wkQkR.mjs} +2 -2
  161. package/dist/{renderer-w8LKBg_5.mjs.map → renderer-DH0wkQkR.mjs.map} +1 -1
  162. package/dist/{renderer-BXCZev4l.mjs → renderer-DOZJeWM4.mjs} +3 -3
  163. package/dist/{renderer-BXCZev4l.mjs.map → renderer-DOZJeWM4.mjs.map} +1 -1
  164. package/dist/{renderer-Cz11KJmQ.mjs → renderer-DOkEalxy.mjs} +2 -2
  165. package/dist/{renderer-Cz11KJmQ.mjs.map → renderer-DOkEalxy.mjs.map} +1 -1
  166. package/dist/renderer-DSSTVulw.mjs +5 -0
  167. package/dist/renderer-DUmTURPu.mjs +5 -0
  168. package/dist/{renderer-BI1nmIqA.mjs → renderer-DVaVVz-D.mjs} +3 -3
  169. package/dist/{renderer-BI1nmIqA.mjs.map → renderer-DVaVVz-D.mjs.map} +1 -1
  170. package/dist/renderer-DXCAgI9m.mjs +5 -0
  171. package/dist/{renderer-BlafvK-L.mjs → renderer-DY8fPeH3.mjs} +2 -2
  172. package/dist/renderer-DZ9j3fQj.mjs +5 -0
  173. package/dist/{renderer-6QAlE1Mp.mjs → renderer-DZndEvZN.mjs} +3 -3
  174. package/dist/{renderer-6QAlE1Mp.mjs.map → renderer-DZndEvZN.mjs.map} +1 -1
  175. package/dist/{renderer-B3x-uogM.mjs → renderer-DaV95CAd.mjs} +3 -3
  176. package/dist/{renderer-B3x-uogM.mjs.map → renderer-DaV95CAd.mjs.map} +1 -1
  177. package/dist/{renderer-YtRSM2cv.mjs → renderer-DautVsW4.mjs} +2 -2
  178. package/dist/{renderer-YtRSM2cv.mjs.map → renderer-DautVsW4.mjs.map} +1 -1
  179. package/dist/renderer-Dd1G_VKM.mjs +5 -0
  180. package/dist/renderer-Dee8079X.mjs +5 -0
  181. package/dist/{renderer-B48vtpou.mjs → renderer-Dg5yLAM9.mjs} +3 -3
  182. package/dist/{renderer-B48vtpou.mjs.map → renderer-Dg5yLAM9.mjs.map} +1 -1
  183. package/dist/renderer-DgWh5noB.mjs +5 -0
  184. package/dist/{renderer-DlESyfg7.d.mts → renderer-Dim2ZlfK.d.mts} +2 -2
  185. package/dist/{renderer-DlESyfg7.d.mts.map → renderer-Dim2ZlfK.d.mts.map} +1 -1
  186. package/dist/{renderer-R0sJId_6.mjs → renderer-Dk0dnuHr.mjs} +2 -2
  187. package/dist/{renderer-R0sJId_6.mjs.map → renderer-Dk0dnuHr.mjs.map} +1 -1
  188. package/dist/{renderer-Bf4BdBtb.mjs → renderer-DkM_wN8j.mjs} +2 -2
  189. package/dist/{renderer-Bf4BdBtb.mjs.map → renderer-DkM_wN8j.mjs.map} +1 -1
  190. package/dist/{renderer-DS64UaYK.mjs → renderer-DkYiOWPJ.mjs} +3 -3
  191. package/dist/{renderer-DS64UaYK.mjs.map → renderer-DkYiOWPJ.mjs.map} +1 -1
  192. package/dist/{renderer-ITtBRR4o.mjs → renderer-DqgduGiO.mjs} +3 -3
  193. package/dist/{renderer-ITtBRR4o.mjs.map → renderer-DqgduGiO.mjs.map} +1 -1
  194. package/dist/renderer-DuD9QRix.mjs +5 -0
  195. package/dist/{renderer--Da6pAJ4.mjs → renderer-Edn9xltT.mjs} +2 -2
  196. package/dist/renderer-KtG5p44R.mjs +5 -0
  197. package/dist/{renderer-DDBmBmQN.mjs → renderer-Tf1AS1aO.mjs} +2 -2
  198. package/dist/{renderer-DDBmBmQN.mjs.map → renderer-Tf1AS1aO.mjs.map} +1 -1
  199. package/dist/{renderer-_-MCpvGq.mjs → renderer-TyZu7nQ2.mjs} +69 -69
  200. package/dist/{renderer-_-MCpvGq.mjs.map → renderer-TyZu7nQ2.mjs.map} +1 -1
  201. package/dist/{renderer-CgEMtLOL.mjs → renderer-eWBBsCv2.mjs} +2 -2
  202. package/dist/{renderer-CgEMtLOL.mjs.map → renderer-eWBBsCv2.mjs.map} +1 -1
  203. package/dist/{renderer-ClK7_Yzz.mjs → renderer-fXRwAdO2.mjs} +2 -2
  204. package/dist/{renderer-ClK7_Yzz.mjs.map → renderer-fXRwAdO2.mjs.map} +1 -1
  205. package/dist/renderer-fdVdNIhL.mjs +5 -0
  206. package/dist/renderer-gBKWL0_E.mjs +5 -0
  207. package/dist/{renderer-D90PpIKG.mjs → renderer-gbBgGPNL.mjs} +2 -2
  208. package/dist/{renderer-Kj9AhRCc.mjs → renderer-h9sJnoxw.mjs} +3 -3
  209. package/dist/{renderer-Kj9AhRCc.mjs.map → renderer-h9sJnoxw.mjs.map} +1 -1
  210. package/dist/renderer-hmWhsR6C.mjs +5 -0
  211. package/dist/{renderer-Rg1BFv8B.mjs → renderer-i4RJ-_sx.mjs} +2 -2
  212. package/dist/{renderer-Rg1BFv8B.mjs.map → renderer-i4RJ-_sx.mjs.map} +1 -1
  213. package/dist/renderer-jkL9FU2W.mjs +6 -0
  214. package/dist/{renderer-8k-TR_Cy.mjs → renderer-nMnE_T2y.mjs} +3 -3
  215. package/dist/{renderer-8k-TR_Cy.mjs.map → renderer-nMnE_T2y.mjs.map} +1 -1
  216. package/dist/{renderer-CczmOPAO.mjs → renderer-q971j1BW.mjs} +3 -3
  217. package/dist/{renderer-CczmOPAO.mjs.map → renderer-q971j1BW.mjs.map} +1 -1
  218. package/dist/{renderer-DJWQWN1E.mjs → renderer-wFyrVuuj.mjs} +3 -3
  219. package/dist/{renderer-DJWQWN1E.mjs.map → renderer-wFyrVuuj.mjs.map} +1 -1
  220. package/dist/renderer-yAWv-daq.mjs +5 -0
  221. package/dist/{renderer-DYo_a5-8.mjs → renderer-yGARXwV0.mjs} +2 -2
  222. package/dist/{renderer-DYo_a5-8.mjs.map → renderer-yGARXwV0.mjs.map} +1 -1
  223. package/dist/{renderers-CP8CFWDs-DXiR_PLR.mjs → renderers-CP8CFWDs-DoVn7dbW.mjs} +2 -2
  224. package/dist/{renderers-CP8CFWDs-DXiR_PLR.mjs.map → renderers-CP8CFWDs-DoVn7dbW.mjs.map} +1 -1
  225. package/dist/signals/index.d.mts +5 -5
  226. package/dist/signals/index.mjs +4 -4
  227. package/package.json +57 -56
  228. package/dist/dist-CturBK2Z.mjs.map +0 -1
  229. package/dist/index-AdrZIWT0.d.mts.map +0 -1
  230. package/dist/preview-engine/chunk-U7NIY7UC.mjs +0 -1522
  231. package/dist/renderer-1hypa-l7.mjs +0 -5
  232. package/dist/renderer-6D8M4DRu.mjs +0 -5
  233. package/dist/renderer-APrj6tdP.mjs +0 -5
  234. package/dist/renderer-BF8wlbN1.mjs +0 -5
  235. package/dist/renderer-BOUcMCJB.mjs +0 -5
  236. package/dist/renderer-BSwn6KmG.mjs +0 -5
  237. package/dist/renderer-BUxvuC5A.mjs +0 -5
  238. package/dist/renderer-BYOsmJ8F.mjs +0 -5
  239. package/dist/renderer-Bp7LqSTt.mjs +0 -5
  240. package/dist/renderer-CD0amH_Q.mjs +0 -5
  241. package/dist/renderer-CIJGjrt7.mjs +0 -5
  242. package/dist/renderer-CNFTl94b.mjs +0 -5
  243. package/dist/renderer-CTJ0gHPS.mjs +0 -5
  244. package/dist/renderer-Cc3INn7w.mjs +0 -5
  245. package/dist/renderer-CeHh2lKY.mjs +0 -5
  246. package/dist/renderer-CfjwkQP4.mjs +0 -5
  247. package/dist/renderer-CiuOB-Md.mjs +0 -5
  248. package/dist/renderer-Cor66Y2X.mjs +0 -5
  249. package/dist/renderer-CtIM0LWe.mjs +0 -5
  250. package/dist/renderer-CyqgTsnx.mjs +0 -5
  251. package/dist/renderer-D2QG9yIW.mjs +0 -5
  252. package/dist/renderer-D2woU27o.mjs +0 -6
  253. package/dist/renderer-DAhDiQQY.mjs +0 -5
  254. package/dist/renderer-DIjxOQFi.mjs +0 -5
  255. package/dist/renderer-DRzalGhU.mjs +0 -5
  256. package/dist/renderer-DY6S1jWp.mjs +0 -5
  257. package/dist/renderer-DeW0KNQV.mjs +0 -5
  258. package/dist/renderer-DsVSVFkl.mjs +0 -5
  259. package/dist/renderer-DxvcIgEU.mjs +0 -5
  260. package/dist/renderer-F0MKqmol.mjs +0 -5
  261. package/dist/renderer-OkbovcAc.mjs +0 -5
  262. package/dist/renderer-QyBeWMEL.mjs +0 -5
  263. package/dist/renderer-hSh5IrDp.mjs +0 -5
  264. package/dist/renderer-puLncHft.mjs +0 -5
  265. package/dist/renderer-wnFCaw7j.mjs +0 -5
  266. package/dist/renderer-xjtlyGS1.mjs +0 -5
@@ -1,1522 +0,0 @@
1
- import{o as tt,r as $n}from"./chunk-RQLMW6MA.mjs";import{b as Kt}from"./chunk-2SJ4BBMT.mjs";import{h as Vn,l as Yn}from"./chunk-24P6DAB3.mjs";import{d as Xn}from"./chunk-6YJP57MZ.mjs";import{e as te,q as Zn,r as qn,s as GA,t as _n,u as jn}from"./chunk-LQENNFBA.mjs";import{r as fA}from"./chunk-MTJHQATU.mjs";import{a as et}from"./chunk-IQC2I5A5.mjs";import{c as Wn,e as zn}from"./chunk-IQKIHFNZ.mjs";import{o as TA}from"./chunk-YAQFFQPG.mjs";import{a as On,c as Kn,e as L}from"./chunk-BVF64D6H.mjs";var ar=On((as,or)=>{L();var ot=()=>new Proxy(function(){},{get:(A,e)=>e==="__esModule"?!0:e===Symbol.toPrimitive?()=>"":ot(),apply:()=>ot(),construct:()=>ot()});or.exports=ot()});var Pr=On((Sl,kr)=>{L();var bt=()=>new Proxy(function(){},{get:(A,e)=>e==="__esModule"?!0:e===Symbol.toPrimitive?()=>"":bt(),apply:()=>bt(),construct:()=>bt()});kr.exports=bt()});L();var er=new Float32Array(2048);for(let A=0;A<2048;A++)er[A]=.5*(1-Math.cos(2*Math.PI*A/2047));var tr=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;tr[A]=e}var nr=new Float32Array(2048/2),rr=new Float32Array(2048/2);for(let A=0;A<2048/2;A++){let e=-2*Math.PI*A/2048;nr[A]=Math.cos(e),rr[A]=Math.sin(e)}function Ui(A,e){for(let t=0;t<2048;t++){let n=tr[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=nr[a]??1,g=rr[a]??0,l=A[i+o]??0,u=e[i+o]??0,I=A[i+o+n]??0,B=e[i+o+n]??0,Q=I*s-B*g,f=I*g+B*s;A[i+o]=l+Q,e[i+o]=u+f,A[i+o+n]=l-Q,e[i+o+n]=u-f}}}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,D=0;M>=0&&M<i&&(r===1?D=e[0]?.[M]??0:r>=2&&(D=((e[0]?.[M]??0)+(e[1]?.[M]??0))*.5)),this.tempReal[G]=D*(er[G]??1),this.tempImag[G]=0}Ui(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,D=this.tempImag[G]??0;s[G]=Math.sqrt(M*M+D*D)*g*2}let l=t/2048,u=Math.max(1,Math.round(20/l)),I=Math.max(u+1,Math.round(150/l)),B=0;for(let G=u;G<=I&&G<1024;G++)B+=(s[G]??0)*(s[G]??0);let Q=Math.min(1,Math.sqrt(B/(I-u+1))*4),f=0;for(let G=0;G<1024;G++){let M=(s[G]??0)-(this.previousBins[G]??0);M>0&&(f+=M),this.previousBins[G]=s[G]??0}let h=Math.min(1,f*.15),m=Math.round(300/l),d=Math.min(1023,Math.round(3400/l)),x=0;for(let G=m;G<=d;G++)x+=(s[G]??0)*(s[G]??0);let y=Math.min(1,Math.sqrt(x/(d-m+1))*3.5);return{fftBins:s,bassEnergy:Q,drumTransient:h,vocalEnergy:y,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)}},Ar=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 u=0;u<l;u++){let I=u/a;this.frames[u]=i.extractAtTime(e,o,I)}}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}};L();var k={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}};L();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=k.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=k.subtract(e,A);k.lengthSq(n)===0?n=[0,0,1]:n=k.normalize(n);let r=k.cross(n,t);k.lengthSq(r)===0?r=[1,0,0]:r=k.normalize(r);let i=k.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,-k.dot(r,A),-k.dot(i,A),-k.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)}};L();function Ge(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 ce={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=ce.computeViewMatrix(A),t=ce.computeProjectionMatrix(A);return $.multiply(t,e)},dolly(A,e,t){let n=k.normalize(k.subtract(e,A)),r=k.multiplyScalar(n,t);return{eye:k.add(A,r),target:e}},truckPedestal(A,e,t,n,r){let i=k.normalize(k.subtract(e,A)),o=k.normalize(k.cross(i,t)),a=k.cross(o,i),s=k.multiplyScalar(o,n),g=k.multiplyScalar(a,r),l=k.add(s,g);return{eye:k.add(A,l),target:k.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,u=A[1]-e*a,I=A[2]-e*o*s;return[l,u,I]},applyOrientation(A,e,t,n){if(e===0&&t===0&&n===0)return A;let r=k.normalize(k.subtract(A.target,A.eye)),i=k.normalize(k.cross(r,A.up)),o=k.cross(i,r),a=k.distance(A.eye,A.target),s=r,g=o;if(t!==0){let I=t*Math.PI/180,B=Math.cos(I),Q=Math.sin(I);s=k.normalize(k.subtract(k.multiplyScalar(s,B),k.multiplyScalar(i,Q)))}let l=k.normalize(k.cross(s,g));if(e!==0){let I=e*Math.PI/180,B=Math.cos(I),Q=Math.sin(I);s=k.normalize(k.add(k.multiplyScalar(s,B),k.multiplyScalar(g,Q))),g=k.normalize(k.cross(l,s))}if(n!==0){let I=n*Math.PI/180,B=Math.cos(I),Q=Math.sin(I);g=k.normalize(k.add(k.multiplyScalar(g,B),k.multiplyScalar(l,Q)))}let u=k.add(A.eye,k.multiplyScalar(s,a));return{...A,target:u,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=Ge(s,a,o)*n,l=Ge(s,a+101.5,o)*n,u=Ge(s,a+203.7,o)*(n*.5),I=Ge(s,a+307.1,o)*r,B=Ge(s,a+409.3,o)*r,Q=k.normalize(k.subtract(A.target,A.eye)),f=k.normalize(k.cross(Q,A.up)),h=k.cross(f,Q),m=k.add(k.multiplyScalar(f,g),k.add(k.multiplyScalar(h,l),k.multiplyScalar(Q,u))),d=k.add(A.eye,m),x=k.add(A.target,k.add(k.multiplyScalar(f,B*10),k.multiplyScalar(h,I*10)));return{...A,eye:d,target:x}},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}};L();var vi={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}},Ri={none:0,aces:1,agx:2,neutral:3};function rt(A){let e=Wn(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 ir(A){let e=vi[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:Ri[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}}L();var it=8,Yt=736;function Vt(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 Li(r,i,o)}return[1,1,1]}function Li(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=Vt(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=k.normalize(A.direction);else if(A.target||A.targetX!==void 0||A.targetY!==void 0||A.targetZ!==void 0){let m=A.target?A.target[0]:A.targetX??n,d=A.target?A.target[1]:A.targetY??r,x=A.target?A.target[2]:A.targetZ??i,y=[m,d,x],G=k.subtract(y,[n,r,i]);k.length(G)>1e-4&&(s=k.normalize(G))}let g=Math.max(1,A.radius??1e3),l=A.decay??2,u=Math.max(.1,Math.min(180,A.angle??45)),I=Math.max(0,Math.min(1,A.penumbra??.2)),B=u*Math.PI/180,Q=B*(1-I),f=Math.cos(B),h=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:[f,h,l,0]}},packLightsUniforms(A,e,t){let n=new Float32Array(Yt/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 u=Vt(g.color),I=g.intensity??1;r+=u[0]*I,i+=u[1]*I,o+=u[2]*I}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,u]=Vt(s.color),I=s.intensity??1,B=Q=>Q<=.04045?Q/12.92:((Q+.055)/1.055)**2.4;i+=B(g)*I,o+=B(l)*I,a+=B(u)*I}if(A[r+0]=i,A[r+1]=o,A[r+2]=a,A[r+3]=1,t){let s=ir(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}}};L();var Ne=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 u={};i&&Object.assign(u,A.parseMtl(i));let I=e.split(/\r?\n/);for(let H=0;H<I.length;H++){let rA=I[H]?.trim();if(!rA||rA.startsWith("#"))continue;let j=rA.split(/\s+/),sA=j[0]?.toLowerCase();if(sA==="mtllib"){let BA=j.slice(1).join(" ").trim();if(r.basePath&&typeof fA<"u"&&fA.existsSync)try{let O=TA.resolve(r.basePath,BA);if(fA.existsSync(O)){let oA=fA.readFileSync(O,"utf-8");Object.assign(u,A.parseMtl(oA))}}catch{}}else if(sA==="v"){let BA=Number.parseFloat(j[1]??"0"),O=Number.parseFloat(j[2]??"0"),oA=Number.parseFloat(j[3]??"0");o.push([BA,O,oA])}else if(sA==="vn"){let BA=Number.parseFloat(j[1]??"0"),O=Number.parseFloat(j[2]??"0"),oA=Number.parseFloat(j[3]??"0");a.push([BA,O,oA])}else if(sA==="vt"){let BA=Number.parseFloat(j[1]??"0"),O=j[2]!==void 0?Number.parseFloat(j[2]):0;s.push([BA,O])}else if(sA==="usemtl"){let BA=j[1]??"default";l.faces.length>0?(l={materialName:BA,faces:[]},g.push(l)):l.materialName=BA}else if(sA==="f"){let BA=[];for(let O=1;O<j.length;O++){let oA=j[O];if(!oA)continue;let aA=oA.split("/"),IA=Number.parseInt(aA[0]??"0",10),QA=aA[1]&&aA[1].length>0?Number.parseInt(aA[1],10):0,cA=aA[2]&&aA[2].length>0?Number.parseInt(aA[2],10):0;IA<0&&(IA=o.length+IA+1),QA<0&&(QA=s.length+QA+1),cA<0&&(cA=a.length+cA+1),BA.push({v:IA-1,vt:QA-1,vn:cA-1})}if(BA.length>=3)for(let O=1;O<BA.length-1;O++){let oA=BA[0],aA=BA[O],IA=BA[O+1];oA&&aA&&IA&&l.faces.push([oA,aA,IA])}}}let B=1/0,Q=1/0,f=1/0,h=-1/0,m=-1/0,d=-1/0;for(let H of o){let[rA,j,sA]=H;rA===void 0||j===void 0||sA===void 0||(rA<B&&(B=rA),j<Q&&(Q=j),sA<f&&(f=sA),rA>h&&(h=rA),j>m&&(m=j),sA>d&&(d=sA))}Number.isFinite(B)||(B=-1,Q=-1,f=-1,h=1,m=1,d=1);let x=(B+h)*.5,y=(Q+m)*.5,G=(f+d)*.5,M=Math.max(1e-4,h-B),D=Math.max(1e-4,m-Q),b=Math.max(1e-4,d-f),N=Math.max(M,D,b),S=1;r.normalizeSize&&r.normalizeSize>0&&(S=r.normalizeSize/N),typeof r.scale=="number"&&(S*=r.scale);let v=r.center??!1,F=v?x:0,P=v?y:0,V=v?G:0,R=[];for(let H=0;H<g.length;H++){let rA=g[H];if(!rA||rA.faces.length===0)continue;let j=new Map,sA=[],BA=[],O=[],oA=[],aA=!1;for(let cA of rA.faces)for(let gA of cA){let DA=`${gA.v}_${gA.vt}_${gA.vn}`,bA=j.get(DA);if(bA===void 0){bA=sA.length/3,j.set(DA,bA);let hA=o[gA.v]??[0,0,0],pA=((hA[0]??0)-F)*S,SA=((hA[1]??0)-P)*S,UA=((hA[2]??0)-V)*S;if(sA.push(pA,SA,UA),gA.vt>=0&&s[gA.vt]){let LA=s[gA.vt];O.push(LA[0]??0,1-(LA[1]??0))}else O.push(0,0);if(gA.vn>=0&&a[gA.vn]){aA=!0;let LA=a[gA.vn];BA.push(LA[0]??0,LA[1]??0,LA[2]??0)}else BA.push(0,0,0)}oA.push(bA)}if(!aA||r.smoothNormals){let cA=new Float32Array(sA.length);for(let gA=0;gA<oA.length;gA+=3){let DA=oA[gA],bA=oA[gA+1],hA=oA[gA+2],pA=[sA[DA*3],sA[DA*3+1],sA[DA*3+2]],SA=[sA[bA*3],sA[bA*3+1],sA[bA*3+2]],UA=[sA[hA*3],sA[hA*3+1],sA[hA*3+2]],LA=k.subtract(SA,pA),St=k.subtract(UA,pA),vA=k.cross(LA,St);cA[DA*3]+=vA[0],cA[DA*3+1]+=vA[1],cA[DA*3+2]+=vA[2],cA[bA*3]+=vA[0],cA[bA*3+1]+=vA[1],cA[bA*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 DA=cA[gA*3],bA=cA[gA*3+1],hA=cA[gA*3+2],pA=Math.hypot(DA,bA,hA)||1;BA[gA*3]=DA/pA,BA[gA*3+1]=bA/pA,BA[gA*3+2]=hA/pA}}let QA=sA.length/3>65535?new Uint32Array(oA):new Uint16Array(oA);R.push({id:`mesh_${H}`,name:rA.materialName,positions:new Float32Array(sA),normals:new Float32Array(BA),uvs:new Float32Array(O),indices:QA,materialName:rA.materialName})}let X=(B-F)*S,_=(Q-P)*S,AA=(f-V)*S,CA=(h-F)*S,Z=(m-P)*S,W=(d-V)*S,q=CA-X,mA=Z-_,eA=W-AA,lA=(X+CA)*.5,uA=(_+Z)*.5,yA=(AA+W)*.5,tA=Math.hypot(q,mA,eA)*.5;return{meshes:R,materials:u,animations:[],bounds:{min:[X,_,AA],max:[CA,Z,W],center:[lA,uA,yA],size:[q,mA,eA],boundingSphereRadius:tA}}}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"),u=Number.parseFloat(a[3]??"1");n.diffuseColor=[g,l,u,n.diffuseColor?.[3]??1]}else if(s==="ks"){let g=Number.parseFloat(a[1]??"1"),l=Number.parseFloat(a[2]??"1"),u=Number.parseFloat(a[3]??"1");n.specularColor=[g,l,u],n.specularIntensity=(g+l+u)/3}else if(s==="ka"){let g=Number.parseFloat(a[1]??"0.2"),l=Number.parseFloat(a[2]??"0.2"),u=Number.parseFloat(a[3]??"0.2");n.ambientColor=[g,l,u]}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 ns(A,e,t={}){return Ne.parse(A,e,t)}function rs(A){return Ne.parseMtl(A)}function Fe(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 fA<"u"&&fA.existsSync)try{let o=A.startsWith("file://")?A.slice(7):A;try{o=decodeURIComponent(o)}catch{}fA.existsSync(o)?(n=fA.readFileSync(o,"utf-8"),t={basePath:t.basePath??TA.dirname(o),...t}):n=A}catch{n=A}else n=A}return Ne.parse(n,e,t)}L();var gr=Kn(ar(),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,u;if(i){if(o+25>t.byteLength)return null;g=Number(n.getBigUint64(o,!0)),l=Number(n.getBigUint64(o+8,!0)),u=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),u=n.getUint8(o+12),o+=13}if(g===0)return null;let I=new TextDecoder().decode(t.subarray(o,o+u));o+=u;let B=[];for(let f=0;f<l;f++){let h=String.fromCharCode(t[o]);switch(o+=1,h){case"Y":{B.push(n.getInt16(o,!0)),o+=2;break}case"C":case"B":{B.push(n.getUint8(o)!==0),o+=1;break}case"I":{B.push(n.getInt32(o,!0)),o+=4;break}case"F":{B.push(n.getFloat32(o,!0)),o+=4;break}case"D":{B.push(n.getFloat64(o,!0)),o+=8;break}case"L":{B.push(Number(n.getBigInt64(o,!0))),o+=8;break}case"S":{let m=n.getUint32(o,!0);o+=4;let d=new TextDecoder().decode(t.subarray(o,o+m));B.push(d),o+=m;break}case"R":{let m=n.getUint32(o,!0);o+=4;let d=t.subarray(o,o+m);B.push(d),o+=m;break}case"f":case"d":case"i":case"l":case"b":case"c":{let m=n.getUint32(o,!0),d=n.getUint32(o+4,!0),x=n.getUint32(o+8,!0);o+=12;let y;if(d===1){let M=t.subarray(o,o+x);y=(0,gr.inflateSync)(M),o+=x}else{let D=m*(h==="d"||h==="l"?8:h==="f"||h==="i"?4:1);y=t.subarray(o,o+D),o+=D}let G=new DataView(y.buffer,y.byteOffset,y.byteLength);if(h==="f"){let M=new Float32Array(m);for(let D=0;D<m;D++)M[D]=G.getFloat32(D*4,!0);B.push(M)}else if(h==="d"){let M=new Float64Array(m);for(let D=0;D<m;D++)M[D]=G.getFloat64(D*8,!0);B.push(M)}else if(h==="i"){let M=new Int32Array(m);for(let D=0;D<m;D++)M[D]=G.getInt32(D*4,!0);B.push(M)}else if(h==="l"){let M=new Float64Array(m);for(let D=0;D<m;D++)M[D]=Number(G.getBigInt64(D*8,!0));B.push(M)}else if(h==="b"){let M=new Uint8Array(m);for(let D=0;D<m;D++)M[D]=G.getUint8(D);B.push(M)}else B.push(y);break}default:break}}let Q=[];for(;o<g;){let f=s();if(f)Q.push(f);else break}return o=g,{name:I,props:B,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("{"),u=l?g.slice(0,-1).trim():g,I=[];if(u){let f=u.split(",").map(h=>h.trim());for(let h of f)h.startsWith('"')&&h.endsWith('"')?I.push(h.slice(1,-1)):Number.isNaN(Number(h))?I.push(h):I.push(Number(h))}let B={name:s,props:I,children:[]},Q=n[n.length-1];Q&&Q.children.push(B),l&&n.push(B)}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,v=String(b.props[1]??"").split("::"),F=v.length>1?v[1]:v[0],P=String(b.props[2]??b.name);i.set(N,{id:N,name:F,type:P,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]),S=b.props[1]??0,v=b.props[2]??0,F=N==="OP"?String(b.props[3]):void 0;o.push({childId:S,parentId:v,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(S=>S.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 S=N.node,v=S.children.find(O=>O.name==="Vertices"),F=S.children.find(O=>O.name==="PolygonVertexIndex"),P=S.children.find(O=>O.name==="LayerElementNormal"),V=S.children.find(O=>O.name==="LayerElementUV");if(!v||!F)continue;let R=g(v),X=g(F),_=P?.children.find(O=>O.name==="Normals"),AA=g(_),CA=V?.children.find(O=>O.name==="UV"),Z=V?.children.find(O=>O.name==="UVIndex"),W=g(CA),q=g(Z),mA=[],eA=[],lA=[];for(let O=0;O<X.length;O++){let oA=X[O];if(oA<0){if(lA.push(-(oA+1)),eA.push(O),lA.length>=3)for(let aA=1;aA<lA.length-1;aA++)mA.push([lA[0],lA[aA],lA[aA+1]]);lA=[]}else lA.push(oA),eA.push(O)}let uA=[],yA=[],tA=[],H=[];for(let O=0;O<mA.length;O++){let oA=mA[O];for(let aA=0;aA<3;aA++){let IA=oA[aA],QA=uA.length/3,cA=R[IA*3]??0,gA=R[IA*3+1]??0,DA=R[IA*3+2]??0;if(uA.push(cA,gA,DA),AA.length>0){let bA=AA[IA*3]??0,hA=AA[IA*3+1]??0,pA=AA[IA*3+2]??0;yA.push(bA,hA,pA)}else yA.push(0,0,1);if(W.length>0){let bA=IA;q.length>0&&(bA=q[IA]??IA);let hA=W[bA*2]??0,pA=W[bA*2+1]??0;tA.push(hA,1-pA)}else tA.push(0,0);H.push(QA)}}if(AA.length===0||t.smoothNormals){let O=new Float32Array(uA.length);for(let oA=0;oA<H.length;oA+=3){let aA=H[oA],IA=H[oA+1],QA=H[oA+2],cA=[uA[aA*3],uA[aA*3+1],uA[aA*3+2]],gA=[uA[IA*3],uA[IA*3+1],uA[IA*3+2]],DA=[uA[QA*3],uA[QA*3+1],uA[QA*3+2]],bA=k.subtract(gA,cA),hA=k.subtract(DA,cA),pA=k.cross(bA,hA);O[aA*3]+=pA[0],O[aA*3+1]+=pA[1],O[aA*3+2]+=pA[2],O[IA*3]+=pA[0],O[IA*3+1]+=pA[1],O[IA*3+2]+=pA[2],O[QA*3]+=pA[0],O[QA*3+1]+=pA[1],O[QA*3+2]+=pA[2]}for(let oA=0;oA<uA.length/3;oA++){let aA=O[oA*3],IA=O[oA*3+1],QA=O[oA*3+2],cA=Math.hypot(aA,IA,QA)||1;yA[oA*3]=aA/cA,yA[oA*3+1]=IA/cA,yA[oA*3+2]=QA/cA}}let rA=o.find(O=>O.parentId===b&&i.get(O.childId)?.type==="Deformer"&&i.get(O.childId)?.node.props[2]==="Skin"),j,sA;if(rA){let O=uA.length/3;j=new Float32Array(O*4),sA=new Float32Array(O*4),o.filter(aA=>aA.parentId===rA.childId&&i.get(aA.childId)?.type==="Deformer"&&i.get(aA.childId)?.node.props[2]==="Cluster").forEach((aA,IA)=>{let QA=i.get(aA.childId)?.node,cA=QA?.children.find(DA=>DA.name==="Indexes"),gA=QA?.children.find(DA=>DA.name==="Weights");if(cA&&gA){let DA=g(cA),bA=g(gA);for(let hA=0;hA<DA.length;hA++){let pA=bA[hA]??0;for(let SA=0;SA<O;SA++)for(let UA=0;UA<4;UA++)if(sA[SA*4+UA]===0){j[SA*4+UA]=IA,sA[SA*4+UA]=pA;break}}}})}let BA=uA.length/3>65535;a.push({id:`fbx_mesh_${b}`,name:N.name,positions:new Float32Array(uA),normals:new Float32Array(yA),uvs:new Float32Array(tA),indices:BA?new Uint32Array(H):new Uint16Array(H),jointIndices:j,jointWeights:sA,materialName:N.name})}for(let[,b]of i)if(b.node.name==="Material"){let S=b.node.children.find(V=>V.name==="Properties70"),v=[1,1,1,1],F=32,P=1;if(S){for(let V of S.children)if(V.name==="P"){let R=String(V.props[0]);if(R==="DiffuseColor"||R==="Color"){let X=Number(V.props[4]??1),_=Number(V.props[5]??1),AA=Number(V.props[6]??1);v=[X,_,AA,1]}else R==="Shininess"||R==="ShininessExponent"?F=Number(V.props[4]??32):R==="Opacity"&&(P=Number(V.props[4]??1),v[3]=P)}}s[b.name]={name:b.name,diffuseColor:v,shininess:F,opacity:P}}let l=[];for(let[b,N]of i)if(N.node.name==="AnimationStack"){let S=N.name||"Take 001",v=[],F=o.find(V=>V.parentId===b&&i.get(V.childId)?.node.name==="AnimationLayer");if(F){let V=o.filter(X=>X.parentId===F.childId&&i.get(X.childId)?.node.name==="AnimationCurveNode"),R=new Map;for(let X of V){let _=i.get(X.childId);if(!_)continue;let AA=o.find(eA=>eA.childId===_.id&&i.get(eA.parentId)?.node.name==="Model"),CA=AA?i.get(AA.parentId):void 0,Z=sr(AA?.propName)??sr(_.name);if(!Z)continue;let W=`${CA?.id??_.id}|${Z}`,q=R.get(W);if(!q){let eA=CA?.node;q={nodeName:CA?.name??_.name,model:eA,kind:Z,defaults:Pi(eA,_.node,Z),channels:[void 0,void 0,void 0]},R.set(W,q)}o.filter(eA=>eA.parentId===_.id&&i.get(eA.childId)?.node.name==="AnimationCurve").forEach((eA,lA)=>{let uA=ki(eA.propName)??lA;if(uA>2)return;let yA=i.get(eA.childId)?.node,tA=g(yA?.children.find(j=>j.name==="KeyTime")),H=g(yA?.children.find(j=>j.name==="KeyValueFloat")),rA=Math.min(tA.length,H.length);rA!==0&&(q.channels[uA]={times:Array.from(tA.slice(0,rA),j=>Number(j)),values:Array.from(H.slice(0,rA),j=>Number(j))})})}for(let X of R.values()){let _=Ki(X);_&&v.push(_)}}let P=1;for(let V of v)if(V.times.length>0){let R=V.times[V.times.length-1]??0;R>P&&(P=R)}l.push({name:S,duration:P,fps:30,tracks:v})}let u=1/0,I=1/0,B=1/0,Q=-1/0,f=-1/0,h=-1/0;for(let b of a)for(let N=0;N<b.positions.length;N+=3){let S=b.positions[N],v=b.positions[N+1],F=b.positions[N+2];S<u&&(u=S),v<I&&(I=v),F<B&&(B=F),S>Q&&(Q=S),v>f&&(f=v),F>h&&(h=F)}Number.isFinite(u)||(u=-1,I=-1,B=-1,Q=1,f=1,h=1);let m=Q-u,d=f-I,x=h-B,y=(u+Q)*.5,G=(I+f)*.5,M=(B+h)*.5,D=Math.hypot(m,d,x)*.5;return{meshes:a,materials:s,animations:l,bounds:{min:[u,I,B],max:[Q,f,h],center:[y,G,M],size:[m,d,x],boundingSphereRadius:D}}}};function sr(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 ki(A){switch(A){case"d|X":return 0;case"d|Y":return 1;case"d|Z":return 2;default:return}}function Wt(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 Pi(A,e,t){let n=t==="S"?1:0,r=Wt(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=Wt(e,`d|${"XYZ"[o]}`)?.[0],g=a??s;g!==void 0&&Number.isFinite(g)&&(i[o]=g)}return i}var Hi=["XYZ","XZY","YZX","YXZ","ZXY","ZYX"];function Ti(A){let e=Wt(A,"RotationOrder")?.[0]??0;return Hi[e]??"XYZ"}function Ji(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 Oi(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 Ki(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?Ti(A.model):"XYZ",a;return t.forEach((s,g)=>{n[g]=s/re.FBX_KTIME;let l=[0,1,2].map(I=>{let B=A.channels[I];return B?Oi(B,s):A.defaults[I]});if(!r){i.set(l,g*3);return}let u=Ji(l,o);if(a&&a[0]*u[0]+a[1]*u[1]+a[2]*u[2]+a[3]*u[3]<0)for(let I=0;I<4;I++)u[I]=-u[I];a=u,i.set(u,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 us(A,e={}){return re.parse(A,e)}function Se(A,e={}){let t=A;if(typeof A=="string"){let n=A.trim();if(!(n.includes("FBXHeaderExtension")||n.includes("Kaydara FBX"))&&typeof fA<"u"&&fA.existsSync)try{let i=A.startsWith("file://")?A.slice(7):A;try{i=decodeURIComponent(i)}catch{}if(fA.existsSync(i)){let o=fA.readFileSync(i);t=new Uint8Array(o.buffer,o.byteOffset,o.byteLength)}}catch{}}return re.parse(t,e)}L();L();var lr=`
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 Vi={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:lr}),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),u=Vi[r.mode]??0,I=s/2048,B=r.frequencyRange?r.frequencyRange[0]:20,Q=r.frequencyRange?r.frequencyRange[1]:120,f=Math.max(0,Math.min(1023,Math.round(B/I))),h=Math.max(f,Math.min(1023,Math.round(Q/I))),m=typeof r.amplitudeMultiplier=="number"?r.amplitudeMultiplier:typeof r.amplitudeMultiplier?.value=="number"?r.amplitudeMultiplier.value:1,d=r.damping??0;this.uniformUint32[0]=u,this.uniformUint32[1]=f,this.uniformUint32[2]=h,this.uniformUint32[3]=o,this.uniformFloat32[4]=m,this.uniformFloat32[5]=d,this.uniformFloat32[6]=a,this.uniformFloat32[7]=0;let x=this.uniformPool.getBuffer(this.device,new Uint8Array(this.uniformData)),y=this.device.createBindGroup({layout:this.bindGroupLayout,entries:[{binding:0,resource:{buffer:i}},{binding:1,resource:{buffer:x}},{binding:2,resource:{buffer:t}},{binding:3,resource:{buffer:l}}]}),G=e.beginComputePass({label:"AudioMeshDeformComputePass"});G.setPipeline(this.pipeline),G.setBindGroup(0,y);let M=Math.ceil(o/256);return G.dispatchWorkgroups(M),G.end(),l}resetPools(){this.uniformPool.reset()}destroy(){this.uniformPool.destroy()}};L();L();L();function Be(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=k.cross(k.subtract(n(o),s),k.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],u=a[s+2];g<e&&(e=g),g>r&&(r=g),l<t&&(t=l),l>i&&(i=l),u<n&&(n=u),u>o&&(o=u)}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 VA(A,e){return e>65535?new Uint32Array(A):new Uint16Array(A)}function YA(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),u=n.getFloat32(s+4,!0),I=n.getFloat32(s+8,!0);s+=12;let B=n.getFloat32(s,!0),Q=n.getFloat32(s+4,!0),f=n.getFloat32(s+8,!0);s+=12;let h=n.getFloat32(s,!0),m=n.getFloat32(s+4,!0),d=n.getFloat32(s+8,!0);s+=12;let x=n.getFloat32(s,!0),y=n.getFloat32(s+4,!0),G=n.getFloat32(s+8,!0);s+=12,s+=2;let M=l,D=u,b=I;if(M===0&&D===0&&b===0){let S=k.subtract([h,m,d],[B,Q,f]),v=k.subtract([x,y,G],[B,Q,f]),F=k.normalize(k.cross(S,v));M=F[0],D=F[1],b=F[2]}let N=i.length/3;i.push(B,Q,f,h,m,d,x,y,G),o.push(M,D,b,M,D,b,M,D,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 u=l.split(/\s+/),I=Number.parseFloat(u[2]??"0")||0,B=Number.parseFloat(u[3]??"0")||0,Q=Number.parseFloat(u[4]??"0")||0;a=[I,B,Q],s=[]}else if(l.startsWith("vertex")){let u=l.split(/\s+/),I=Number.parseFloat(u[1]??"0")||0,B=Number.parseFloat(u[2]??"0")||0,Q=Number.parseFloat(u[3]??"0")||0;s.push([I,B,Q])}else if(l.startsWith("endfacet")){if(s.length>=3){let u=s[0],I=s[1],B=s[2],Q=a;if(Q[0]===0&&Q[1]===0&&Q[2]===0){let f=k.subtract(I,u),h=k.subtract(B,u);Q=k.normalize(k.cross(f,h))}for(let f=1;f<s.length-1;f++){let h=s[f],m=s[f+1],d=n.length/3;n.push(u[0],u[1],u[2],h[0],h[1],h[2],m[0],m[1],m[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,u]=i.size,I=new Float32Array(e.length/3*2);for(let h=0;h<e.length;h+=3){let m=h/3*2;I[m]=l>0?(e[h]-s)/l:0,I[m+1]=u>0?(e[h+1]-g)/u:0}let B=VA(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:I,indices:B,materialName:"stl_default"}],materials:{stl_default:Q},animations:[],bounds:YA(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=fA.readFileSync(n);return A.parse(r,t)}return A.parse(e,t)}};function ve(A,e={}){return Ue.load(A,e)}L();var zt=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 u=g[1]?.toLowerCase();u==="binary_little_endian"?n="binary_little_endian":u==="binary_big_endian"?n="binary_big_endian":n="ascii",r=g[2]??"1.0"}else if(l==="element"){let u=g[1]??"",I=Number.parseInt(g[2]??"0",10);o={name:u,count:I,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(R=>R.name==="vertex"),i=e.elements.find(R=>R.name==="face"),o=r?.count??0,a=i?.count??0,s=[],g=[],l=[],u=[],I=[],B=r?.properties??[],Q=B.findIndex(R=>R.name==="x"),f=B.findIndex(R=>R.name==="y"),h=B.findIndex(R=>R.name==="z"),m=B.findIndex(R=>R.name==="nx"),d=B.findIndex(R=>R.name==="ny"),x=B.findIndex(R=>R.name==="nz"),y=B.findIndex(R=>R.name==="u"||R.name==="s"||R.name==="texture_u"),G=B.findIndex(R=>R.name==="v"||R.name==="t"||R.name==="texture_v"),M=B.findIndex(R=>R.name==="red"||R.name==="r"),D=B.findIndex(R=>R.name==="green"||R.name==="g"),b=B.findIndex(R=>R.name==="blue"||R.name==="b"),N=B.findIndex(R=>R.name==="alpha"||R.name==="a"),S=m!==-1&&d!==-1&&x!==-1,v=M!==-1&&D!==-1&&b!==-1,F=y!==-1&&G!==-1,P=t.trim().split(/\r?\n/),V=0;for(let R=0;R<o&&!(V>=P.length);R++){let X=P[V++]?.trim();if(!X)continue;let _=X.split(/\s+/),AA=Number.parseFloat(_[Q]??"0")||0,CA=Number.parseFloat(_[f]??"0")||0,Z=Number.parseFloat(_[h]??"0")||0;if(s.push(AA,CA,Z),S){let W=Number.parseFloat(_[m]??"0")||0,q=Number.parseFloat(_[d]??"0")||0,mA=Number.parseFloat(_[x]??"0")||0;g.push(W,q,mA)}else g.push(0,0,0);if(F){let W=Number.parseFloat(_[y]??"0")||0,q=Number.parseFloat(_[G]??"0")||0;l.push(W,1-q)}else l.push(0,0);if(v){let W=(Number.parseFloat(_[M]??"255")||0)/255,q=(Number.parseFloat(_[D]??"255")||0)/255,mA=(Number.parseFloat(_[b]??"255")||0)/255,eA=N!==-1?(Number.parseFloat(_[N]??"255")||0)/255:1;u.push(W,q,mA,eA)}}for(let R=0;R<a&&!(V>=P.length);R++){let X=P[V++]?.trim();if(!X)continue;let _=X.split(/\s+/),AA=Number.parseInt(_[0]??"0",10);if(AA>=3){let CA=Number.parseInt(_[1]??"0",10);for(let Z=1;Z<AA-1;Z++){let W=Number.parseInt(_[Z+1]??"0",10),q=Number.parseInt(_[Z+2]??"0",10);I.push(CA,W,q)}}}return A.finalizeModel(s,g,l,v?u:void 0,I,S,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,u=[],I=[],B=[],Q=[],f=[],h=a?.properties??[],m=h.some(M=>M.name==="nx"),d=h.some(M=>M.name==="red"||M.name==="r"),x=M=>{let D=0;switch(M.toLowerCase()){case"char":case"int8":D=i.getInt8(o),o+=1;break;case"uchar":case"uint8":D=i.getUint8(o),o+=1;break;case"short":case"int16":D=i.getInt16(o,n),o+=2;break;case"ushort":case"uint16":D=i.getUint16(o,n),o+=2;break;case"int":case"int32":D=i.getInt32(o,n),o+=4;break;case"uint":case"uint32":D=i.getUint32(o,n),o+=4;break;case"float":case"float32":D=i.getFloat32(o,n),o+=4;break;case"double":case"float64":D=i.getFloat64(o,n),o+=8;break;default:D=i.getFloat32(o,n),o+=4;break}return D};for(let M=0;M<g;M++){let D=0,b=0,N=0,S=0,v=0,F=0,P=0,V=0,R=1,X=1,_=1,AA=1;for(let CA of h){let Z=x(CA.type),W=CA.name.toLowerCase();W==="x"?D=Z:W==="y"?b=Z:W==="z"?N=Z:W==="nx"?S=Z:W==="ny"?v=Z:W==="nz"?F=Z:W==="u"||W==="s"?P=Z:W==="v"||W==="t"?V=Z:W==="red"||W==="r"?R=CA.type.includes("int")?Z/255:Z:W==="green"||W==="g"?X=CA.type.includes("int")?Z/255:Z:W==="blue"||W==="b"?_=CA.type.includes("int")?Z/255:Z:(W==="alpha"||W==="a")&&(AA=CA.type.includes("int")?Z/255:Z)}u.push(D,b,N),I.push(S,v,F),B.push(P,1-V),d&&Q.push(R,X,_,AA)}let G=(s?.properties??[]).find(M=>M.isList);for(let M=0;M<l&&!(o>=t.byteLength);M++)if(G){let D=x(G.countType??"uchar"),b=[];for(let N=0;N<D;N++)b.push(x(G.itemType??"int"));if(b.length>=3){let N=b[0];for(let S=1;S<b.length-1;S++)f.push(N,b[S],b[S+1])}}return A.finalizeModel(u,I,B,d?Q:void 0,f,m,r)}static finalizeModel(e,t,n,r,i,o,a){(!o||a.smoothNormals)&&Be(e,i,t);let s=JA(e),g=OA(s,a),l=KA(e,g),u=VA(i,l.length/3),I={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:u,materialName:"ply_default"}],materials:{ply_default:I},animations:[],bounds:YA(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=fA.readFileSync(n);return A.parse(r,t)}return A.parse(e,t)}};function Re(A,e={}){return zt.load(A,e)}L();L();var Le=128;function Yi(A,e,t){let[n,r,i,o]=e,a=n*n,s=r*r,g=i*i,l=n*r,u=n*i,I=r*i,B=o*n,Q=o*r,f=o*i;return[(1-2*(s+g))*t[0],2*(l+f)*t[0],2*(u-Q)*t[0],0,2*(l-f)*t[1],(1-2*(a+g))*t[1],2*(I+B)*t[1],0,2*(u+Q)*t[2],2*(I-B)*t[2],(1-2*(a+s))*t[2],0,A[0],A[1],A[2],1]}function ur(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 Wi(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 ur([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 zi(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 Xt(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=zi(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,u=ie(e,a,t,i),I=ie(e,a+1,t,i);if(i){let B=ie(e,a,t,!0,2),Q=ie(e,a+1,t,!0,0),f=l*l,h=f*l,m=u.map((d,x)=>(2*h-3*f+1)*d+(h-2*f+l)*g*(B[x]??0)+(-2*h+3*f)*(I[x]??0)+(h-f)*g*(Q[x]??0));return t===4?ur(m):m}return t===4?Wi(u,I,l):u.map((B,Q)=>B+((I[Q]??B)-B)*l)}function Xi(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]=Xt(a,a.translations,3,t)),a.rotations&&(r[s]=Xt(a,a.rotations,4,t)),a.scales&&(i[s]=Xt(a,a.scales,3,t)))}return A.map((a,s)=>a.matrix??Yi(n[s],r[s],i[s]))}function Ir(A,e,t){let n=A.nodes??[],r=Xi(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 Us(A,e,t){let n=A.skins?.[e];if(!n)throw new Error(`model has no skin ${e}`);let r=new Float32Array(Le*16);for(let i=0;i<Le;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 Zi={SCALAR:1,VEC2:2,VEC3:3,VEC4:4,MAT2:4,MAT3:9,MAT4:16},qi={5120:1,5121:1,5122:2,5123:2,5125:4,5126:4};function _i(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 cr=1179937895,ji=1313821514,$i=5130562,Ee=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)===cr}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(fA.existsSync(s)){let g=fA.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!==cr)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===ji){let u=new TextDecoder("utf-8").decode(l);o=JSON.parse(u)}else g===$i&&(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=Zi[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=qi[r.componentType]??4,l=a.byteStride??g*i,u=new DataView(s.buffer,s.byteOffset,s.byteLength),I=(a.byteOffset??0)+(r.byteOffset??0),B=_i(r.componentType,r.normalized);for(let Q=0;Q<r.count;Q++)for(let f=0;f<i;f++)o[Q*i+f]=B(u,I+Q*l+f*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(!fA.existsSync(o))return;let a=TA.extname(o).toLowerCase();return{bytes:new Uint8Array(fA.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 u=o?.baseColorTexture,I=u?e.textures?.[u.index]:void 0;if(I?.source!==void 0){let d=A.imageBytes(e,t,I.source,i);if(d){s.diffuseTextureBuffer=d.bytes,s.diffuseTextureMime=d.mime;let x=I.sampler!==void 0?e.samplers?.[I.sampler]?.wrapS:void 0;s.textureWrap=x===33071?"clamp":x===33648?"mirror":"repeat"}}let B=d=>{let x=d?e.textures?.[d.index]:void 0;return x?.source!==void 0?A.imageBytes(e,t,x.source,i)?.bytes:void 0},Q=B(n.normalTexture);Q&&(s.normalTextureBuffer=Q,s.normalScale=n.normalTexture?.scale??1);let f=B(o?.metallicRoughnessTexture);f&&(s.metallicRoughnessTextureBuffer=f,s.roughness=o?.roughnessFactor??1,s.metallic=o?.metallicFactor??1);let h=B(n.occlusionTexture);h&&(s.occlusionTextureBuffer=h,s.occlusionStrength=n.occlusionTexture?.strength??1);let m=s.emissive&&B(n.emissiveTexture);return m&&(s.emissiveTextureBuffer=m),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 u=A.readFloats(e,t,g.input).data,I=A.readFloats(e,t,g.output).data;a=Math.max(a,u[u.length-1]??0);let B={nodeName:n[l]?.name??`node_${l}`,node:l,times:u,interpolation:g.interpolation==="STEP"?"step":g.interpolation==="CUBICSPLINE"?"cubic":"linear"};s.target.path==="translation"?B.translations=I:s.target.path==="rotation"?B.rotations=I:B.scales=I,o.push(B)}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,P,V)=>{let R=F.name??`material_${P}`;return V.findIndex((X,_)=>(X.name??`material_${_}`)===R)===P?R:`${R}#${P}`}),o={};(e.materials??[]).forEach((F,P)=>{let V=i[P];o[V]=A.buildMaterial(e,t,F,V,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,P)=>F.mesh!==void 0?[{mesh:F.mesh,node:P,skin:F.skin}]:[]),u=l.length>0?l:(e.meshes??[]).map((F,P)=>({mesh:P})),I={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}},B=Ir(I,void 0,0),Q=1/0,f=1/0,h=1/0,m=-1/0,d=-1/0,x=-1/0,y=(F,P,V)=>{F<Q&&(Q=F),F>m&&(m=F),P<f&&(f=P),P>d&&(d=P),V<h&&(h=V),V>x&&(x=V)};for(let F of u){let P=e.meshes?.[F.mesh];P&&P.primitives.forEach((V,R)=>{if(V.attributes.POSITION===void 0||V.mode!==void 0&&V.mode!==4)return;let X=eA=>eA===void 0?void 0:A.readFloats(e,t,eA),_=X(V.attributes.POSITION),AA=_.count,CA=X(V.attributes.COLOR_0),Z;if(CA){Z=new Float32Array(AA*4).fill(1);for(let eA=0;eA<AA;eA++)for(let lA=0;lA<CA.itemSize;lA++)Z[eA*4+lA]=CA.data[eA*CA.itemSize+lA]??1}let W;if(V.indices!==void 0)W=A.readIndices(e,t,V.indices);else{W=AA>65535?new Uint32Array(AA):new Uint16Array(AA);for(let eA=0;eA<AA;eA++)W[eA]=eA}let q=F.skin!==void 0&&V.attributes.JOINTS_0!==void 0,mA=!q&&F.node!==void 0?B[F.node]:void 0;for(let eA=0;eA<AA;eA++){let lA=_.data[eA*3],uA=_.data[eA*3+1],yA=_.data[eA*3+2];if(mA){let tA=$.projectPoint(mA,[lA,uA,yA]);y(tA[0],tA[1],tA[2])}else y(lA,uA,yA)}I.meshes.push({id:`gltf_mesh_${F.mesh}_${R}${F.node!==void 0?`_n${F.node}`:""}`,name:P.name??`Mesh_${F.mesh}`,positions:_.data,normals:X(V.attributes.NORMAL)?.data??new Float32Array(AA*3),uvs:X(V.attributes.TEXCOORD_0)?.data??new Float32Array(AA*2),colors:Z,jointIndices:q?X(V.attributes.JOINTS_0)?.data:void 0,jointWeights:q?X(V.attributes.WEIGHTS_0)?.data:void 0,indices:W,materialName:V.material!==void 0?i[V.material]:void 0,node:F.node,skin:q?F.skin:void 0})})}for(let F of s)if(F.joints.length>Le)throw new Error(`glTF skin has ${F.joints.length} joints; the mesh shader holds ${Le}`);Number.isFinite(Q)||(Q=f=h=0,m=d=x=0);let G=Math.max(m-Q,d-f,x-h,1e-4),M=n.normalizeSize&&n.normalizeSize>0?n.normalizeSize/G:1,D=typeof n.scale=="number"?[n.scale,n.scale,n.scale]:n.scale??[1,1,1],b=[M*D[0],M*D[1],M*D[2]],N=n.center?[(Q+m)*.5,(f+d)*.5,(h+x)*.5]:[0,0,0];I.rootTransform=$.multiply($.scale(b[0],b[1],b[2]),$.translate(-N[0],-N[1],-N[2]));let S=[(Q-N[0])*b[0],(f-N[1])*b[1],(h-N[2])*b[2]],v=[(m-N[0])*b[0],(d-N[1])*b[1],(x-N[2])*b[2]];return I.bounds={min:S,max:v,center:[(S[0]+v[0])*.5,(S[1]+v[1])*.5,(S[2]+v[2])*.5],size:[v[0]-S[0],v[1]-S[1],v[2]-S[2]],boundingSphereRadius:Math.hypot(v[0]-S[0],v[1]-S[1],v[2]-S[2])*.5},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=fA.readFileSync(n),i=TA.dirname(n);return A.parse(r,t,i)}return A.parse(e,t)}};function st(A,e={}){return Ee.load(A,e)}function Br(A,e={}){return Ee.load(A,e)}L();var Ao=[[0,0,0,0],...Array.from({length:255},(A,e)=>{let t=(e+1)/256;return[t,t,t,1]})],ke=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=[],u=[...Ao];for(;o+12<=n.byteLength;){let I=new TextDecoder("ascii").decode(n.subarray(o,o+4)),B=r.getUint32(o+4,!0);o+=12;let Q=o;if(I==="SIZE")a=r.getUint32(Q,!0),s=r.getUint32(Q+4,!0),g=r.getUint32(Q+8,!0);else if(I==="XYZI"){let f=r.getUint32(Q,!0),h=Q+4;for(let m=0;m<f&&!(h+4>n.byteLength);m++){let d=r.getUint8(h),x=r.getUint8(h+1),y=r.getUint8(h+2),G=r.getUint8(h+3);h+=4,l.push({x:d,y:x,z:y,colorIndex:G})}}else if(I==="RGBA")for(let f=0;f<256;f++){let h=Q+f*4;if(h+4>n.byteLength)break;let m=r.getUint8(h)/255,d=r.getUint8(h+1)/255,x=r.getUint8(h+2)/255,y=r.getUint8(h+3)/255,G=f===255?0:f+1;u[G]=[m,d,x,y]}o+=B}return A.buildModel(l,u,a,s,g,t)}static buildModel(e,t,n,r,i,o){let a=new Set;e.forEach(y=>a.add(`${y.x},${y.y},${y.z}`));let s=[],g=[],l=[],u=[],I=[],B=(y,G,M,D,b,N)=>{let S=s.length/3;s.push(...y,...G,...M,...D),g.push(...b,...b,...b,...b),l.push(...N,...N,...N,...N),u.push(0,0,1,0,1,1,0,1),I.push(S,S+1,S+2,S,S+2,S+3)};for(let y of e){let{x:G,y:M,z:D,colorIndex:b}=y,N=t[b]??[.8,.8,.8,1],S=G,v=-D,F=M;a.has(`${G+1},${M},${D}`)||B([S+1,v,F],[S+1,v-1,F],[S+1,v-1,F+1],[S+1,v,F+1],[1,0,0],N),a.has(`${G-1},${M},${D}`)||B([S,v,F+1],[S,v-1,F+1],[S,v-1,F],[S,v,F],[-1,0,0],N),a.has(`${G},${M},${D+1}`)||B([S,v-1,F],[S+1,v-1,F],[S+1,v-1,F+1],[S,v-1,F+1],[0,-1,0],N),a.has(`${G},${M},${D-1}`)||B([S,v,F+1],[S+1,v,F+1],[S+1,v,F],[S,v,F],[0,1,0],N),a.has(`${G},${M+1},${D}`)||B([S+1,v,F+1],[S+1,v-1,F+1],[S,v-1,F+1],[S,v,F+1],[0,0,1],N),a.has(`${G},${M-1},${D}`)||B([S,v,F],[S,v-1,F],[S+1,v-1,F],[S+1,v,F],[0,0,-1],N)}let Q=JA(s),f=OA(Q,o),h=KA(s,f),m=VA(I,h.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:h,normals:new Float32Array(g),uvs:new Float32Array(u),colors:new Float32Array(l),indices:m,materialName:"vox_default"}],materials:{vox_default:d},animations:[],bounds:YA(Q,f)}}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=fA.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 ke.load(A,e)}L();var Zt=19789,eo=15677,to=16384,no=16640,ro=16656,io=16672,oo=16704,ao=45055,so=40960,go=40992,lo=16,uo=17,Pe=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,u=a+6,I=Math.min(l,n,e.byteLength);switch(s){case Zt:case eo:A.readChunk(e,u,I,r,i,o);break;case to:{let B=u;for(;B<I&&e.getUint8(B)!==0;)B++;let Q=new Uint8Array(e.buffer,e.byteOffset+u,B-u),f=new TextDecoder("ascii").decode(Q)||"Object";A.readChunk(e,B+1,I,r,i,f);break}case no:{let B={name:o,positions:[],indices:[],uvs:[]};A.readTriMesh(e,u,I,B,i),B.positions.length>0&&B.indices.length>0&&r.push(B);break}case ao:A.readMaterial(e,u,I,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===ro){let u=e.getUint16(l,!0),I=l+2;for(let B=0;B<u&&!(I+12>n);B++){let Q=e.getFloat32(I,!0),f=e.getFloat32(I+4,!0),h=e.getFloat32(I+8,!0);r.positions.push(Q,f,h),I+=12}}else if(a===io){let u=e.getUint16(l,!0),I=l+2;for(let B=0;B<u&&!(I+8>n);B++){let Q=e.getUint16(I,!0),f=e.getUint16(I+2,!0),h=e.getUint16(I+4,!0);r.indices.push(Q,f,h),I+=8}}else if(a===oo){let u=e.getUint16(l,!0),I=l+2;for(let B=0;B<u&&!(I+8>n);B++){let Q=e.getFloat32(I,!0),f=e.getFloat32(I+4,!0);r.uvs.push(Q,1-f),I+=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,u=i+6;if(s===so){let I=u;for(;I<l&&e.getUint8(I)!==0;)I++;let B=new Uint8Array(e.buffer,e.byteOffset+u,I-u);o=new TextDecoder("ascii").decode(B)||o}else if(s===go&&u+6<=l){let I=e.getUint16(u,!0);if(I===lo&&u+18<=l){let B=e.getFloat32(u+6,!0),Q=e.getFloat32(u+10,!0),f=e.getFloat32(u+14,!0);a=[B,Q,f,1]}else if(I===uo&&u+9<=l){let B=e.getUint8(u+6)/255,Q=e.getUint8(u+7)/255,f=e.getUint8(u+8)/255;a=[B,Q,f,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);Be(g,a.indices,l);let u=a.uvs.length===a.positions.length/3*2?new Float32Array(a.uvs):new Float32Array(a.positions.length/3*2),I=VA(a.indices,g.length/3);return{id:`3ds_mesh_${s}`,name:a.name,positions:g,normals:l,uvs:u,indices:I,materialName:a.materialName}}),materials:t,animations:[],bounds:YA(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=fA.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 Pe.load(A,e)}L();var qt=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 u=[],I=[],B=[],Q=[],f=[],h=0;for(;i<r.length&&h<g;){let b=r[i++].trim();if(!b||b.startsWith("#"))continue;let N=b.split(/\s+/),S=Number.parseFloat(N[0]??"0")||0,v=Number.parseFloat(N[1]??"0")||0,F=Number.parseFloat(N[2]??"0")||0;u.push(S,v,F);let P=3;if(a){let V=Number.parseFloat(N[P]??"0")||0,R=Number.parseFloat(N[P+1]??"0")||0,X=Number.parseFloat(N[P+2]??"0")||0;I.push(V,R,X),P+=3}else I.push(0,0,0);if(s&&N.length>P){let V=(Number.parseFloat(N[P]??"255")||0)/(Number.parseFloat(N[P]??"255")>1?255:1),R=(Number.parseFloat(N[P+1]??"255")||0)/(Number.parseFloat(N[P+1]??"255")>1?255:1),X=(Number.parseFloat(N[P+2]??"255")||0)/(Number.parseFloat(N[P+2]??"255")>1?255:1),_=N.length>P+3&&Number.parseFloat(N[P+3]??"1")||1;B.push(V,R,X,_)}Q.push(0,0),h++}let m=0;for(;i<r.length&&m<l;){let b=r[i++].trim();if(!b||b.startsWith("#"))continue;let N=b.split(/\s+/),S=Number.parseInt(N[0]??"0",10);if(S>=3){let v=Number.parseInt(N[1]??"0",10);for(let F=1;F<S-1;F++){let P=Number.parseInt(N[F+1]??"0",10),V=Number.parseInt(N[F+2]??"0",10);f.push(v,P,V)}}m++}(!a||t.smoothNormals)&&Be(u,f,I);let d=JA(u),x=OA(d,t),y=KA(u,x),G=VA(f,y.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:y,normals:new Float32Array(I),uvs:new Float32Array(Q),colors:s?new Float32Array(B):void 0,indices:G,materialName:"off_default"}],materials:{off_default:M},animations:[],bounds:YA(d,x)}}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=fA.readFileSync(n,"utf-8");return A.parse(r,t)}return A.parse(e,t)}};function ut(A,e={}){return qt.load(A,e)}L();var Er=`
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
- `;L();var Io=`
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
- `,_t="rgba16float",It=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:Io}),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:_t,...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:_t,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:_t,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 u=this.mips,I=(Q,f)=>this.uniforms(1/Q,1/f,g),B=i??t;this.pass(e,this.prefilterPipe,u[0].createView(),B,this.placeholder,I(B.width,B.height),"clear");for(let Q=1;Q<u.length;Q++){let f=u[Q-1];this.pass(e,this.downPipe,u[Q].createView(),f,this.placeholder,I(f.width,f.height),"clear")}for(let Q=u.length-1;Q>0;Q--){let f=u[Q];this.pass(e,this.upPipe,u[Q-1].createView(),f,this.placeholder,I(f.width,f.height),"load")}this.pass(e,this.compositePipe(n.format),n.createView(),u[0],t,I(u[0].width,u[0].height),"clear")}resetPools(){this.uniformPool.reset()}destroy(){for(let e of this.mips)e.destroy();this.placeholder.destroy(),this.uniformPool.destroy()}};L();L();L();var Qe=`
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
- `,fe=`
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
- `;L();function Ce(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 Qr=`
775
- ${Qe}
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
- ${Ce(1,2)}@group(1) @binding(3) var backdropTex : texture_2d<f32>;
797
- @group(2) @binding(0) var texSampler : sampler;
798
- @group(2) @binding(1) var mainTex : texture_2d<f32>;
799
- @group(2) @binding(2) var normalTex : texture_2d<f32>;
800
- @group(2) @binding(3) var metalRoughTex : texture_2d<f32>;
801
- @group(2) @binding(4) var occlusionTex : texture_2d<f32>;
802
- @group(2) @binding(5) var emissiveTex : texture_2d<f32>;
803
- ${fe}
804
-
805
- struct VertexInput {
806
- @location(0) position : vec3<f32>,
807
- @location(1) uv : vec2<f32>,
808
- @location(2) normal : vec3<f32>,
809
- @location(3) joints : vec4<f32>,
810
- @location(4) weights : vec4<f32>,
811
- };
812
-
813
- struct VertexOutput {
814
- @builtin(position) clipPos : vec4<f32>,
815
- @location(0) uv : vec2<f32>,
816
- @location(1) worldPos : vec3<f32>,
817
- @location(2) worldNormal : vec3<f32>,
818
- @location(3) linearDepth : f32,
819
- };
820
-
821
- @vertex
822
- fn vs_main(in: VertexInput) -> VertexOutput {
823
- var out: VertexOutput;
824
-
825
- var localPos = in.position;
826
- var localNorm = in.normal;
827
-
828
- // Linear Blend Skinning (LBS) on GPU
829
- if (model.params.z > 0.5) {
830
- let j0 = i32(in.joints.x);
831
- let j1 = i32(in.joints.y);
832
- let j2 = i32(in.joints.z);
833
- let j3 = i32(in.joints.w);
834
-
835
- let w0 = in.weights.x;
836
- let w1 = in.weights.y;
837
- let w2 = in.weights.z;
838
- let w3 = in.weights.w;
839
-
840
- let totalWeight = w0 + w1 + w2 + w3;
841
- if (totalWeight > 0.001) {
842
- let skinMat = skinning.jointMatrices[j0] * w0 +
843
- skinning.jointMatrices[j1] * w1 +
844
- skinning.jointMatrices[j2] * w2 +
845
- skinning.jointMatrices[j3] * w3;
846
-
847
- let pos4 = skinMat * vec4<f32>(in.position, 1.0);
848
- localPos = pos4.xyz;
849
-
850
- let norm4 = skinMat * vec4<f32>(in.normal, 0.0);
851
- localNorm = normalize(norm4.xyz);
852
- }
853
- }
854
-
855
- let worldPos4 = model.modelMatrix * vec4<f32>(localPos, 1.0);
856
- out.worldPos = worldPos4.xyz;
857
-
858
- let norm4 = model.normalMatrix * vec4<f32>(localNorm, 0.0);
859
- out.worldNormal = normalize(norm4.xyz);
860
-
861
- out.clipPos = cam.viewProjMatrix * worldPos4;
862
- out.uv = in.uv;
863
-
864
- out.linearDepth = dot(worldPos4.xyz - cam.cameraPos.xyz, cam.cameraDir.xyz);
865
- return out;
866
- }
867
-
868
- // Toon (MToon-style): the base color as authored where the light reaches,
869
- // the shade color past a soft terminator. Highlights stay out: the texture
870
- // already paints them.
871
- fn toonLighting(in: VertexOutput, baseColor: vec3<f32>) -> vec3<f32> {
872
- var N = normalize(in.worldNormal);
873
- let V = normalize(cam.cameraPos.xyz - in.worldPos);
874
- if (dot(N, V) < 0.0) {
875
- N = -N;
876
- }
877
- var lit = 0.0;
878
- let numLights = i32(lights.params.x);
879
- for (var i = 0; i < 8; i++) {
880
- if (i >= numLights) {
881
- break;
882
- }
883
- let light = lights.lights[i];
884
- let lightType = light.posType.w;
885
- var L = vec3<f32>(0.0, 0.0, 1.0);
886
- if (lightType > 0.5 && lightType < 1.5) {
887
- L = normalize(-light.dirRadius.xyz);
888
- } else if (lightType >= 1.5) {
889
- L = normalize(light.posType.xyz - in.worldPos);
890
- } else {
891
- continue;
892
- }
893
- let terminator = smoothstep(-0.05, 0.2, dot(N, L));
894
- lit = max(lit, terminator * min(light.colorIntensity.w, 1.0));
895
- }
896
- return baseColor * mix(model.shade.rgb, vec3<f32>(1.0), lit);
897
- }
898
-
899
- struct MeshFragment {
900
- color : vec4<f32>, // premultiplied display color
901
- hdr : vec4<f32>, // premultiplied scene radiance (bloom source)
902
- };
903
-
904
- // Normal mapping without tangents: a cotangent frame from screen-space
905
- // derivatives (Sch\xFCler, "Followup: Normal Mapping Without Precomputed Tangents").
906
- 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> {
907
- let dp2perp = cross(dp2, N);
908
- let dp1perp = cross(N, dp1);
909
- // The derivation assumes cross(dp1, dp2) points along N; with this
910
- // engine's y-down view basis it can point away, mirroring the frame.
911
- let handed = select(1.0, -1.0, dot(cross(dp1, dp2), N) < 0.0);
912
- let T = (dp2perp * duv1.x + dp1perp * duv2.x) * handed;
913
- let B = (dp2perp * duv1.y + dp1perp * duv2.y) * handed;
914
- let invmax = inverseSqrt(max(max(dot(T, T), dot(B, B)), 1e-20));
915
- // glTF maps are +Y up while v grows down the image: green points along -B.
916
- return normalize(T * (tn.x * invmax) - B * (tn.y * invmax) + N * tn.z);
917
- }
918
-
919
- // Glass: what is behind the 3D batch on screen (backdrop), bent by
920
- // refraction along the surface normal with a red/blue split, frosted by a
921
- // disc blur, tinted by the color, under Fresnel-weighted reflections.
922
- // shade.rgb = (dispersion, thickness px, frost), pbr.w = ior.
923
- fn backdropAt(uv: vec2<f32>) -> vec3<f32> {
924
- return textureSampleLevel(backdropTex, texSampler, clamp(uv, vec2<f32>(0.001), vec2<f32>(0.999)), 0.0).rgb;
925
- }
926
-
927
- // rimWidth: how much 1 - N\xB7V changes across this pixel (fwidth, taken in
928
- // uniform control flow by the caller). Rim effects narrower than a pixel are
929
- // faded out, or per-pixel shading turns them into stair-stepped lines that
930
- // MSAA (coverage only) cannot smooth.
931
- fn shadeGlass(in: VertexOutput, Nin: vec3<f32>, tint: vec3<f32>, alpha: f32, rimWidth: f32) -> MeshFragment {
932
- let V = normalize(cam.cameraPos.xyz - in.worldPos);
933
- var N = Nin;
934
- if (dot(N, V) < 0.0) { N = -N; }
935
- let NdotV = clamp(dot(N, V), 0.0, 1.0);
936
- // Also fade toward edge-on: a face seen at a grazing angle is a sliver
937
- // under a pixel tall (a slab's bottom), which would alias the same way.
938
- let rimAA = clamp(1.0 - rimWidth * 2.5, 0.0, 1.0) * smoothstep(0.03, 0.22, NdotV);
939
- let rim = (1.0 - NdotV) * rimAA;
940
- let ior = max(model.pbr.w, 1.0001);
941
- let screen = max(cam.screenParams.xy, vec2<f32>(1.0));
942
- let uv = in.clipPos.xy / screen;
943
- // Screen-space bend: the normal's in-plane part, stronger toward the rim.
944
- let bend = N.xy * model.shade.g * (1.0 - 1.0 / ior) * (0.6 + rim) * rimAA / screen;
945
- let disp = model.shade.r;
946
- let frost = model.shade.b * 22.0 / screen;
947
- var col = vec3<f32>(0.0);
948
- let taps = select(1, 8, model.shade.b > 0.001);
949
- for (var i = 0; i < taps; i++) {
950
- let a = f32(i) * 2.399963;
951
- let r = sqrt((f32(i) + 0.5) / f32(taps));
952
- let o = select(vec2<f32>(0.0), vec2<f32>(cos(a), sin(a)) * r * frost, taps > 1);
953
- col += vec3<f32>(
954
- backdropAt(uv - bend * (1.0 + disp * 6.0) + o).r,
955
- backdropAt(uv - bend + o).g,
956
- backdropAt(uv - bend * (1.0 - disp * 6.0) + o).b,
957
- );
958
- }
959
- col /= f32(taps);
960
- // Light travels further through the glass toward the rim: the tint
961
- // deepens and the body darkens there, which is what outlines glass.
962
- let depthTint = mix(vec3<f32>(1.0), tint, 0.55 + 0.45 * rim);
963
- let transmitted = col * depthTint * (1.0 - 0.45 * rim * rim);
964
- let f0 = pow((ior - 1.0) / (ior + 1.0), 2.0);
965
- let F = f0 + (1.0 - f0) * pow(rim, 5.0);
966
- let lit = shadeSurfaceFull(in.worldPos, N, vec3<f32>(0.0), model.materialParams, vec4<f32>(model.pbr.x, 0.0, 0.0, 0.0), vec4<f32>(0.0));
967
- // Grazing faces mirror the room; keep that faint so dark scenes stay dark
968
- // and the studio highlights below carry the shape.
969
- let sheen = vec3<f32>(0.9, 0.94, 1.0) * F * 0.22 + tint * 0.05 * (0.4 + rim);
970
- // A studio in the reflection: a sharp key and two strip softboxes, which
971
- // is most of what makes glass read as glass.
972
- let R = reflect(-V, N);
973
- // Tight: a flat face only flashes as it turns through the light.
974
- let key = pow(max(dot(R, normalize(vec3<f32>(-0.45, -0.75, -0.5))), 0.0), 600.0) * 1.8;
975
- // Two tall softboxes: narrow bands in the reflection, brightest above.
976
- let strips = (1.0 - smoothstep(0.03, 0.07, abs(R.x + 0.45))) * smoothstep(0.3, -0.5, R.y) * 1.1
977
- + (1.0 - smoothstep(0.02, 0.05, abs(R.x - 0.6))) * smoothstep(0.4, -0.3, R.y) * 0.7;
978
- let studio = vec3<f32>(1.0, 0.98, 0.95) * (key + strips * (0.25 + F));
979
- // A thin bright line where the surface turns away: glass silhouettes.
980
- let edge = vec3<f32>(1.0, 0.99, 0.97) * smoothstep(0.8, 0.97, rim) * 0.55;
981
- let rgb = transmitted * (1.0 - F) + lit.display + sheen + studio + edge;
982
- var out: MeshFragment;
983
- out.color = vec4<f32>(rgb * alpha, alpha);
984
- out.hdr = vec4<f32>(srgbToLinear(transmitted * (1.0 - F)) * alpha + lit.hdr * alpha + srgbToLinear(sheen + studio + edge) * alpha, alpha);
985
- return out;
986
- }
987
-
988
- fn shadeMesh(in: VertexOutput, isFront: bool) -> MeshFragment {
989
- // Every sample and derivative up front, in uniform control flow.
990
- var texColor = textureSample(mainTex, texSampler, in.uv);
991
- let normalSample = textureSample(normalTex, texSampler, in.uv).xyz;
992
- let mrSample = textureSample(metalRoughTex, texSampler, in.uv);
993
- let aoSample = textureSample(occlusionTex, texSampler, in.uv).r;
994
- let emissiveSample = textureSample(emissiveTex, texSampler, in.uv).rgb;
995
- let dp1 = dpdx(in.worldPos);
996
- let dp2 = dpdy(in.worldPos);
997
- let duv1 = dpdx(in.uv);
998
- let duv2 = dpdy(in.uv);
999
- let rimWidth = fwidth(1.0 - abs(dot(normalize(in.worldNormal), normalize(cam.cameraPos.xyz - in.worldPos))));
1000
-
1001
- if (!isFront && model.params.y < 0.5) {
1002
- discard;
1003
- }
1004
- if (texColor.a < model.shade.a) {
1005
- discard;
1006
- }
1007
- let alpha = texColor.a * model.params.x * model.colorTint.a * matteCoverage(in.clipPos.xy);
1008
- if (alpha <= 0.001) {
1009
- discard;
1010
- }
1011
-
1012
- let baseRgb = texColor.rgb * model.colorTint.rgb;
1013
- var out: MeshFragment;
1014
- if (model.materialParams.w > 1.5) {
1015
- var toon = baseRgb;
1016
- if (lights.params.y >= 0.5) {
1017
- toon = toonLighting(in, baseRgb);
1018
- }
1019
- out.color = vec4<f32>(toon * alpha, alpha);
1020
- out.hdr = vec4<f32>(srgbToLinear(toon) * alpha, alpha);
1021
- return out;
1022
- }
1023
-
1024
- var N = normalize(in.worldNormal);
1025
- if (model.maps.x > 0.0) {
1026
- var tn = normalSample * 2.0 - 1.0;
1027
- tn = vec3<f32>(tn.xy * model.maps.x, tn.z);
1028
- // The frame follows the surface side the camera sees.
1029
- var Nf = N;
1030
- if (dot(Nf, cam.cameraPos.xyz - in.worldPos) < 0.0) {
1031
- Nf = -Nf;
1032
- }
1033
- N = perturbNormal(Nf, in.worldPos, in.uv, tn, dp1, dp2, duv1, duv2);
1034
- }
1035
- var pbr = model.pbr;
1036
- if (model.maps.z > 0.5) {
1037
- pbr.x = select(pbr.x, 1.0, pbr.x < 0.0) * mrSample.g;
1038
- pbr.y = pbr.y * mrSample.b;
1039
- }
1040
- if (model.pbr.z > 0.5) {
1041
- return shadeGlass(in, N, baseRgb, alpha, rimWidth);
1042
- }
1043
- var material = model.materialParams;
1044
- material.z = material.z * mix(1.0, aoSample, clamp(model.maps.y, 0.0, 1.0));
1045
- var emissive = model.emissive;
1046
- if (model.maps.w > 0.5) {
1047
- // Linear multiply in display space is close enough for an 8-bit map.
1048
- emissive = vec4<f32>(emissive.rgb * emissiveSample, emissive.w);
1049
- }
1050
- let shaded = shadeSurfaceFull(in.worldPos, N, baseRgb, material, pbr, emissive);
1051
- out.color = vec4<f32>(shaded.display * alpha, alpha);
1052
- out.hdr = vec4<f32>(shaded.hdr * alpha, alpha);
1053
- return out;
1054
- }
1055
-
1056
- struct MrtOutput {
1057
- @location(0) color : vec4<f32>,
1058
- @location(1) depth : vec4<f32>,
1059
- };
1060
-
1061
- struct BloomOutput {
1062
- @location(0) color : vec4<f32>,
1063
- @location(1) hdr : vec4<f32>,
1064
- };
1065
-
1066
- struct MrtBloomOutput {
1067
- @location(0) color : vec4<f32>,
1068
- @location(1) depth : vec4<f32>,
1069
- @location(2) hdr : vec4<f32>,
1070
- };
1071
-
1072
- @fragment
1073
- fn fs_single(in: VertexOutput, @builtin(front_facing) isFront: bool) -> @location(0) vec4<f32> {
1074
- return shadeMesh(in, isFront).color;
1075
- }
1076
-
1077
- @fragment
1078
- fn fs_mrt(in: VertexOutput, @builtin(front_facing) isFront: bool) -> MrtOutput {
1079
- var out: MrtOutput;
1080
- out.color = shadeMesh(in, isFront).color;
1081
- out.depth = vec4<f32>(in.linearDepth, 0.0, 0.0, 1.0);
1082
- return out;
1083
- }
1084
-
1085
- @fragment
1086
- fn fs_single_bloom(in: VertexOutput, @builtin(front_facing) isFront: bool) -> BloomOutput {
1087
- let f = shadeMesh(in, isFront);
1088
- var out: BloomOutput;
1089
- out.color = f.color;
1090
- out.hdr = f.hdr;
1091
- return out;
1092
- }
1093
-
1094
- @fragment
1095
- fn fs_mrt_bloom(in: VertexOutput, @builtin(front_facing) isFront: bool) -> MrtBloomOutput {
1096
- let f = shadeMesh(in, isFront);
1097
- var out: MrtBloomOutput;
1098
- out.color = f.color;
1099
- out.depth = vec4<f32>(in.linearDepth, 0.0, 0.0, 1.0);
1100
- out.hdr = f.hdr;
1101
- return out;
1102
- }
1103
- `;L();function oe(A){return{binding:A,visibility:GPUShaderStage.FRAGMENT,texture:{sampleType:"float"}}}var fr=new WeakMap;function ae(A){let e=fr.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(),fr.set(A,e)}return e}L();var Cr="rgba16float",co="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:Cr}]:[]]},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:Cr}]:[],{format:co,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]}L();L();var dr=`
1104
- ${Qe}
1105
- struct ModelUniforms {
1106
- modelMatrix : mat4x4<f32>,
1107
- normalMatrix : mat4x4<f32>,
1108
- colorTint : vec4<f32>,
1109
- borderColor : vec4<f32>,
1110
- params : vec4<f32>, // x = opacity, y = borderRadius, z = twoSided (1.0 = yes), w = borderWidth
1111
- dimensions : vec4<f32>, // x = width, y = height, zw = texture extent the layer covers (0 = whole texture)
1112
- materialParams : vec4<f32>, // x = shininess, y = specularIntensity, z = ambientIntensity, w = materialMode (0=unlit, 1=lit)
1113
- pbr : vec4<f32>, // x = roughness (<0 = default), y = metallic
1114
- emissive : vec4<f32>, // rgb = sRGB emissive color, w = strength
1115
- };
1116
-
1117
- @group(0) @binding(0) var<uniform> cam : CameraUniforms;
1118
- @group(1) @binding(0) var<uniform> model : ModelUniforms;
1119
- ${Ce(1,1)}@group(2) @binding(0) var texSampler : sampler;
1120
- @group(2) @binding(1) var mainTex : texture_2d<f32>;
1121
- ${fe}
1122
-
1123
- struct VertexInput {
1124
- @location(0) position : vec3<f32>,
1125
- @location(1) uv : vec2<f32>,
1126
- @location(2) normal : vec3<f32>,
1127
- };
1128
-
1129
- struct VertexOutput {
1130
- @builtin(position) clipPos : vec4<f32>,
1131
- @location(0) uv : vec2<f32>,
1132
- @location(1) worldPos : vec3<f32>,
1133
- @location(2) worldNormal : vec3<f32>,
1134
- @location(3) linearDepth : f32,
1135
- @location(4) localPos : vec2<f32>,
1136
- };
1137
-
1138
- @vertex
1139
- fn vs_main(in: VertexInput) -> VertexOutput {
1140
- var out: VertexOutput;
1141
-
1142
- let hasDimensions = model.dimensions.x > 0.0 && model.dimensions.y > 0.0;
1143
- var pad = 0.0;
1144
- if (hasDimensions) {
1145
- let viewPos = cam.viewMatrix * model.modelMatrix * vec4<f32>(0.0, 0.0, 0.0, 1.0);
1146
- let viewDepth = max(abs(viewPos.z), 0.1);
1147
- let projScale = max(cam.projMatrix[1][1], 0.001);
1148
- let worldPx = (2.0 * viewDepth) / max(cam.screenParams.y * projScale, 0.001);
1149
- pad = max(4.0 * worldPx, 4.0);
1150
- }
1151
- let scalePad = select(vec2<f32>(1.0), 1.0 + vec2<f32>(2.0 * pad) / model.dimensions.xy, hasDimensions);
1152
-
1153
- let paddedPos = vec3<f32>(in.position.xy * scalePad, in.position.z);
1154
- let worldPos4 = model.modelMatrix * vec4<f32>(paddedPos, 1.0);
1155
- out.worldPos = worldPos4.xyz;
1156
-
1157
- // Normal transformed by 3x3 normal matrix
1158
- let norm4 = model.normalMatrix * vec4<f32>(in.normal, 0.0);
1159
- out.worldNormal = normalize(norm4.xyz);
1160
-
1161
- out.clipPos = cam.viewProjMatrix * worldPos4;
1162
-
1163
- out.localPos = in.position.xy * (model.dimensions.xy + vec2<f32>(2.0 * pad));
1164
- // A layer of fractional size renders into a texture rounded up to whole
1165
- // pixels: map the quad onto the part it covers, not the whole texture,
1166
- // or the content is stretched by up to a pixel and resampled off-grid.
1167
- let uvExtent = select(model.dimensions.zw, vec2<f32>(1.0), model.dimensions.zw <= vec2<f32>(0.0));
1168
- out.uv = select(in.uv, (out.localPos / model.dimensions.xy + vec2<f32>(0.5)) * uvExtent, hasDimensions);
1169
-
1170
- // Linear camera depth along optical viewing axis
1171
- out.linearDepth = dot(worldPos4.xyz - cam.cameraPos.xyz, cam.cameraDir.xyz);
1172
- return out;
1173
- }
1174
-
1175
- fn sdRoundedRectWithNormal(p: vec2<f32>, b: vec2<f32>, r: f32) -> vec3<f32> {
1176
- let q = abs(p) - b + vec2<f32>(r);
1177
- let sx = select(1.0, -1.0, p.x < 0.0);
1178
- let sy = select(1.0, -1.0, p.y < 0.0);
1179
- let s = vec2<f32>(sx, sy);
1180
-
1181
- // Outside corner arc region
1182
- if (q.x > 0.0 && q.y > 0.0) {
1183
- let l = length(q);
1184
- let n = select(vec2<f32>(0.0, 1.0), q / l, l > 0.0001);
1185
- return vec3<f32>(l - r, s * n);
1186
- }
1187
-
1188
- // Straight edges or interior
1189
- if (q.x > q.y) {
1190
- let dist = q.x - r;
1191
- return vec3<f32>(dist, s.x, 0.0);
1192
- } else {
1193
- let dist = q.y - r;
1194
- return vec3<f32>(dist, 0.0, s.y);
1195
- }
1196
- }
1197
-
1198
- struct QuadFragment {
1199
- color : vec4<f32>, // premultiplied display color
1200
- hdr : vec4<f32>, // premultiplied scene radiance (bloom source)
1201
- };
1202
-
1203
- fn shadeQuad(in: VertexOutput, isFront: bool) -> QuadFragment {
1204
- // One-sided quads cull against their declared normal, not the hardware
1205
- // winding: the Y-down view basis mirrors winding, so front_facing reads
1206
- // camera-facing quads as back faces.
1207
- if (model.params.z < 0.5 && dot(in.worldNormal, cam.cameraPos.xyz - in.worldPos) < 0.0) {
1208
- discard;
1209
- }
1210
-
1211
- var outerAlpha = 1.0;
1212
- var borderFactor = 0.0;
1213
- let br = model.params.y;
1214
- let borderWidth = model.params.w;
1215
- let hasDimensions = model.dimensions.x > 0.0 && model.dimensions.y > 0.0;
1216
-
1217
- if (hasDimensions) {
1218
- let halfSize = model.dimensions.xy * 0.5;
1219
- let normData = sdRoundedRectWithNormal(in.localPos, halfSize, br);
1220
-
1221
- let uvDx = dpdx(in.localPos);
1222
- let uvDy = dpdy(in.localPos);
1223
-
1224
- let dPdx = normData.y * uvDx.x + normData.z * uvDx.y;
1225
- let dPdy = normData.y * uvDy.x + normData.z * uvDy.y;
1226
- let gradLen = max(sqrt(dPdx * dPdx + dPdy * dPdy), 0.001);
1227
-
1228
- let distPixel = normData.x / gradLen;
1229
- outerAlpha = clamp(0.5 - distPixel, 0.0, 1.0);
1230
- if (outerAlpha <= 0.001) {
1231
- discard;
1232
- }
1233
-
1234
- if (borderWidth > 0.0 && model.borderColor.a > 0.0) {
1235
- let borderWidthPixel = max(borderWidth / gradLen, 0.0);
1236
- let innerAlpha = clamp(0.5 - (distPixel + borderWidthPixel), 0.0, 1.0);
1237
- borderFactor = clamp(outerAlpha - innerAlpha, 0.0, 1.0) * model.borderColor.a;
1238
- }
1239
- }
1240
-
1241
- let clampedUv = clamp(in.uv, vec2<f32>(0.0), vec2<f32>(1.0));
1242
- let dxUV = dpdx(in.uv);
1243
- let dyUV = dpdy(in.uv);
1244
- var texColor = textureSampleGrad(mainTex, texSampler, clampedUv, dxUV, dyUV);
1245
- let texAlpha = texColor.a;
1246
-
1247
- let unmultipliedRgb = select(texColor.rgb / texAlpha, texColor.rgb, texAlpha < 0.001);
1248
- let baseRgb = mix(unmultipliedRgb * model.colorTint.rgb, model.borderColor.rgb, borderFactor);
1249
- let alpha = mix(texAlpha, 1.0, borderFactor) * model.params.x * model.colorTint.a * outerAlpha * matteCoverage(in.clipPos.xy);
1250
- if (alpha <= 0.001) {
1251
- discard;
1252
- }
1253
-
1254
- let shaded = shadeSurfaceFull(in.worldPos, in.worldNormal, baseRgb, model.materialParams, model.pbr, model.emissive);
1255
- var out: QuadFragment;
1256
- out.color = vec4<f32>(shaded.display * alpha, alpha);
1257
- out.hdr = vec4<f32>(shaded.hdr * alpha, alpha);
1258
- return out;
1259
- }
1260
-
1261
- struct MrtOutput {
1262
- @location(0) color : vec4<f32>,
1263
- @location(1) depth : vec4<f32>,
1264
- };
1265
-
1266
- struct BloomOutput {
1267
- @location(0) color : vec4<f32>,
1268
- @location(1) hdr : vec4<f32>,
1269
- };
1270
-
1271
- struct MrtBloomOutput {
1272
- @location(0) color : vec4<f32>,
1273
- @location(1) depth : vec4<f32>,
1274
- @location(2) hdr : vec4<f32>,
1275
- };
1276
-
1277
- @fragment
1278
- fn fs_single(in: VertexOutput, @builtin(front_facing) isFront: bool) -> @location(0) vec4<f32> {
1279
- return shadeQuad(in, isFront).color;
1280
- }
1281
-
1282
- @fragment
1283
- fn fs_mrt(in: VertexOutput, @builtin(front_facing) isFront: bool) -> MrtOutput {
1284
- var out: MrtOutput;
1285
- out.color = shadeQuad(in, isFront).color;
1286
- out.depth = vec4<f32>(in.linearDepth, 0.0, 0.0, 1.0);
1287
- return out;
1288
- }
1289
-
1290
- @fragment
1291
- fn fs_single_bloom(in: VertexOutput, @builtin(front_facing) isFront: bool) -> BloomOutput {
1292
- let f = shadeQuad(in, isFront);
1293
- var out: BloomOutput;
1294
- out.color = f.color;
1295
- out.hdr = f.hdr;
1296
- return out;
1297
- }
1298
-
1299
- @fragment
1300
- fn fs_mrt_bloom(in: VertexOutput, @builtin(front_facing) isFront: bool) -> MrtBloomOutput {
1301
- let f = shadeQuad(in, isFront);
1302
- var out: MrtBloomOutput;
1303
- out.color = f.color;
1304
- out.depth = vec4<f32>(in.linearDepth, 0.0, 0.0, 1.0);
1305
- out.hdr = f.hdr;
1306
- return out;
1307
- }
1308
-
1309
- // Shadow-map pass: depth only, alpha-tested so a cut-out casts its shape.
1310
- @fragment
1311
- fn fs_shadow(in: VertexOutput) {
1312
- let clampedUv = clamp(in.uv, vec2<f32>(0.0), vec2<f32>(1.0));
1313
- let a = textureSampleLevel(mainTex, texSampler, clampedUv, 0.0).a * model.params.x * model.colorTint.a;
1314
- if (a < 0.5) {
1315
- discard;
1316
- }
1317
- }
1318
- `;L();var Bt="depth32float",Et={format:Bt,depthWriteEnabled:!0,depthCompare:"less-equal",depthBias:2,depthBiasSlopeScale:2.5,depthBiasClamp:.01};L();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 jt(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:dr});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"}},oe(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=jt(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 u=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]),I=new Uint16Array([0,1,2,0,2,3]);this.vertexBuffer=e.createBuffer({size:u.byteLength,usage:GPUBufferUsage.VERTEX|GPUBufferUsage.COPY_DST,mappedAtCreation:!0}),new Float32Array(this.vertexBuffer.getMappedRange()).set(u),this.vertexBuffer.unmap(),this.indexBuffer=e.createBuffer({size:I.byteLength,usage:GPUBufferUsage.INDEX|GPUBufferUsage.COPY_DST,mappedAtCreation:!0}),new Uint16Array(this.indexBuffer.getMappedRange()).set(I),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()??ae(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 ft=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:Qr});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"}},oe(2),oe(3)]}),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??jt(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:u,mrt:I}=de(e,l);this.pipelineSingle=u,this.pipelineMrt=I,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 B=new Float32Array(2048);for(let Q=0;Q<128;Q++)B[Q*16]=1,B[Q*16+5]=1,B[Q*16+10]=1,B[Q*16+15]=1;this.defaultSkinningBuffer=e.createBuffer({size:8192,usage:GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST,mappedAtCreation:!0}),new Float32Array(this.defaultSkinningBuffer.getMappedRange()).set(B),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=e.glass;s&&(this.modelData[44]=s.dispersion,this.modelData[45]=s.thickness,this.modelData[46]=s.frost,this.modelData[50]=1,this.modelData[51]=s.ior);let g=this.modelPool.getBuffer(this.device,this.modelData),l=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:g}},{binding:1,resource:{buffer:l}},{binding:2,resource:e.matte?.createView()??ae(this.device)},{binding:3,resource:e.glass&&e.backdrop?.createView()||ae(this.device)}]})}draw(e,t,n,r,i,o,a,s=!1,g=!1){let l=this.packModel(a),u=this.defaultWhiteTexture,I=a.maps,B=this.device.createBindGroup({layout:this.textureLayout,entries:[{binding:0,resource:o},{binding:1,resource:(i??u).createView()},{binding:2,resource:(I?.normal??this.flatNormalTexture).createView()},{binding:3,resource:(I?.metallicRoughness??u).createView()},{binding:4,resource:(I?.occlusion??u).createView()},{binding:5,resource:(I?.emissive??u).createView()}]});e.setPipeline(g?this.bloomVariants.get(s):s?this.pipelineMrt:this.pipelineSingle),e.setBindGroup(0,t),e.setBindGroup(1,l),e.setBindGroup(2,B),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()}};L();function An(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 en(A,e){let t=[1/0,1/0,1/0],n=[-1/0,-1/0,-1/0];for(let[r,i,o]of An(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 Ct(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 mr(A){return Math.abs(A[1])>.98?[0,0,1]:[0,-1,0]}function hr(A,e,t,n){if(e.length===0)return null;let r=k.normalize(A.direction),i=e.flatMap(An),o=[...i,...t.flatMap(An)];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 f=k.subtract(Q,k.multiplyScalar(r,1)),h=$.lookAt(f,Q,mr(r)),m=1/0,d=-1/0,x=1/0,y=-1/0;for(let F of i){let P=Ct(h,F);m=Math.min(m,P[0]),d=Math.max(d,P[0]),x=Math.min(x,P[1]),y=Math.max(y,P[1])}let G=1/0,M=-1/0;for(let F of o){let P=Ct(h,F)[2];G=Math.min(G,P),M=Math.max(M,P)}let D=Math.max(d-m,y-x)*.5*1.08+4,b=(m+d)/2,N=(x+y)/2,S=Math.max(10,(M-G)*.02),v=$.orthographic(b-D,b+D,N-D,N+D,G-S,M+S);return{viewProj:$.multiply(v,h),texelWorldSize:2*D/n}}let a=A.position,s=$.lookAt(a,k.add(a,r),mr(r)),g=1/0,l=0,u=0;for(let Q of o){let f=Ct(s,Q)[2];f>0&&(g=Math.min(g,f),l=Math.max(l,f))}for(let Q of i)u=Math.max(u,Ct(s,Q)[2]);if(!Number.isFinite(g)||l<=0)return null;g=Math.max(1,g*.9),l=l*1.05+1;let I=Math.min(170,2*(A.angle??45)+4)*Math.PI/180,B=$.perspective(I,1,g,l);return{viewProj:$.multiply(B,s),texelWorldSize:2*Math.tan(I/2)*Math.max(u,g)/n}}L();L();var pr=`
1319
- ${Qe}
1320
-
1321
- struct TextModelUniforms {
1322
- modelMatrix : mat4x4<f32>, // paragraph px -> world
1323
- normalMatrix : mat4x4<f32>,
1324
- params : vec4<f32>, // x = opacity, y = slant, z = twoSided (1.0 = yes), w = pull toward the eye
1325
- materialParams : vec4<f32>, // x = shininess, y = specularIntensity, z = ambientIntensity, w = materialMode (0=unlit, 1=lit)
1326
- pbr : vec4<f32>, // x = roughness (<0 = default), y = metallic
1327
- emissive : vec4<f32>, // rgb = sRGB emissive color, w = strength
1328
- };
1329
-
1330
- @group(0) @binding(0) var<uniform> cam : CameraUniforms;
1331
- @group(1) @binding(0) var<uniform> model : TextModelUniforms;
1332
- ${Ce(1,1)}@group(2) @binding(0) var curvesTex : texture_2d<f32>;
1333
- @group(2) @binding(1) var bandsTex : texture_2d<u32>;
1334
- ${fe}
1335
-
1336
- ${jn}
1337
-
1338
- struct VSOut {
1339
- @builtin(position) pos : vec4<f32>,
1340
- @location(0) uv : vec2<f32>,
1341
- @location(1) @interpolate(flat) glyphScale : vec2<f32>,
1342
- @location(2) @interpolate(flat) bandScale : vec2<f32>,
1343
- @location(3) @interpolate(flat) bandMax : vec2<u32>,
1344
- @location(4) @interpolate(flat) bandsTexCoords : vec2<u32>,
1345
- @location(5) color : vec4<f32>,
1346
- @location(6) @interpolate(flat) fx : vec4<f32>, // x = blur, y = chromatic shift, z = dissolve, w = vfx
1347
- @location(7) worldPos : vec3<f32>,
1348
- @location(8) @interpolate(flat) worldNormal : vec3<f32>,
1349
- @location(9) linearDepth : f32,
1350
- };
1351
-
1352
- var<private> pos : array<vec2<f32>, 6> = array<vec2<f32>, 6>(
1353
- vec2<f32>(-1.0, -1.0),
1354
- vec2<f32>(1.0, 1.0),
1355
- vec2<f32>(-1.0, 1.0),
1356
- vec2<f32>(-1.0, -1.0),
1357
- vec2<f32>(1.0, -1.0),
1358
- vec2<f32>(1.0, 1.0)
1359
- );
1360
-
1361
- // Screen pixels moved per paragraph unit along the axis whose clip-space step
1362
- // is dc, at clip position c: the derivative of the perspective divide.
1363
- fn pixelsPerUnitAlong(c: vec4<f32>, dc: vec4<f32>) -> vec2<f32> {
1364
- let w = max(c.w, 1e-4);
1365
- return (dc.xy * w - c.xy * dc.w) / (w * w) * 0.5 * cam.screenParams.xy;
1366
- }
1367
-
1368
- @vertex fn vs(
1369
- @builtin(vertex_index) vertex_index : u32,
1370
- @location(0) aScaleBias : vec4<f32>,
1371
- @location(1) aGlyphBandScale : vec4<f32>,
1372
- @location(2) aBandMaxTexCoords : vec4<f32>,
1373
- @location(3) aAnim : vec4<f32>, // x = rotation, y = scale_mult, zw = translation
1374
- @location(4) aColor : vec4<f32>,
1375
- @location(5) aExtraParams : vec4<f32>,
1376
- ) -> VSOut {
1377
- let quad_pos = pos[vertex_index];
1378
- let angle = aAnim.x;
1379
- let scale_mult = aAnim.y;
1380
- let origin = aScaleBias.zw + aAnim.zw;
1381
- let slant = model.params.y;
1382
- let rot = mat2x2<f32>(cos(angle), sin(angle), -sin(angle), cos(angle));
1383
- let shear = mat2x2<f32>(1.0, 0.0, -slant, 1.0);
1384
- let glyphToParagraph = rot * shear;
1385
-
1386
- let clipFromParagraph = cam.viewProjMatrix * model.modelMatrix;
1387
-
1388
- // Slug's dynamic dilation, under perspective: grow the quad by one screen
1389
- // pixel so edge pixels whose centres fall just outside the outline's box
1390
- // are still shaded. The pixel is measured at this corner through the
1391
- // projection's Jacobian, along the paragraph direction that gets the fewest
1392
- // pixels (its smallest singular value), so foreshortened sides are covered.
1393
- let corner = origin + glyphToParagraph * (quad_pos * aScaleBias.xy * scale_mult);
1394
- let cornerClip = clipFromParagraph * vec4<f32>(corner, 0.0, 1.0);
1395
- let jx = pixelsPerUnitAlong(cornerClip, clipFromParagraph[0]);
1396
- let jy = pixelsPerUnitAlong(cornerClip, clipFromParagraph[1]);
1397
- let e = dot(jx, jx) + dot(jy, jy);
1398
- let det = jx.x * jy.y - jx.y * jy.x;
1399
- let minPixelsPerUnit = sqrt(max(0.5 * (e - sqrt(max(e * e - 4.0 * det * det, 0.0))), 0.0));
1400
- let halfSize = max(abs(aScaleBias.xy * scale_mult), vec2<f32>(1e-4));
1401
- // Bounded at three times the glyph: seen nearly edge-on a pixel spans
1402
- // most of the paragraph, and the glyph is a sliver either way.
1403
- let dilation = min(vec2<f32>(1.0 / max(minPixelsPerUnit, 1e-6)), halfSize * 2.0);
1404
- let grow = vec2<f32>(1.0) + dilation / halfSize;
1405
-
1406
- let paragraphPos = origin + glyphToParagraph * (quad_pos * aScaleBias.xy * scale_mult * grow);
1407
- let world4 = model.modelMatrix * vec4<f32>(paragraphPos, 0.0, 1.0);
1408
- // Slide toward the eye along the view ray: the same pixel, a nearer depth.
1409
- // Passes stacked on one plane (shadow, stroke, fill, a backdrop) resolve
1410
- // by draw order instead of z-fighting.
1411
- let world = world4.xyz + (cam.cameraPos.xyz - world4.xyz) * model.params.w;
1412
-
1413
- var out : VSOut;
1414
- out.pos = cam.viewProjMatrix * vec4<f32>(world, 1.0);
1415
- out.uv = vec2<f32>(
1416
- quad_pos.x * grow.x * 0.5 + 0.5,
1417
- 1.0 - (quad_pos.y * grow.y * 0.5 + 0.5),
1418
- );
1419
- out.glyphScale = aGlyphBandScale.xy;
1420
- out.bandScale = aGlyphBandScale.zw;
1421
- out.bandMax = vec2<u32>(aBandMaxTexCoords.xy);
1422
- out.bandsTexCoords = vec2<u32>(aBandMaxTexCoords.zw);
1423
- out.color = aColor;
1424
- out.fx = aExtraParams;
1425
- out.worldPos = world4.xyz;
1426
- out.worldNormal = normalize((model.normalMatrix * vec4<f32>(0.0, 0.0, -1.0, 0.0)).xyz);
1427
- out.linearDepth = dot(world4.xyz - cam.cameraPos.xyz, cam.cameraDir.xyz);
1428
- return out;
1429
- }
1430
-
1431
- struct TextFragment {
1432
- color : vec4<f32>, // premultiplied display color; alpha 0 = discard
1433
- hdr : vec4<f32>, // premultiplied scene radiance (bloom source)
1434
- };
1435
-
1436
- fn shadeText(in : VSOut, fw : vec2<f32>) -> TextFragment {
1437
- var out : TextFragment;
1438
- out.color = vec4<f32>(0.0);
1439
- out.hdr = vec4<f32>(0.0);
1440
- // One-sided text culls against its plane's normal, as one-sided quads do.
1441
- if (model.params.z < 0.5 && dot(in.worldNormal, cam.cameraPos.xyz - in.worldPos) < 0.0) {
1442
- return out;
1443
- }
1444
- let glyph = SlugGlyph(in.glyphScale, in.bandScale, in.bandMax, in.bandsTexCoords);
1445
- let shaded = shadeSlugGlyph(
1446
- in.uv,
1447
- fw,
1448
- in.pos.xy,
1449
- glyph,
1450
- in.color,
1451
- model.params.x,
1452
- in.fx.x,
1453
- in.fx.y,
1454
- in.fx.z,
1455
- );
1456
- if (shaded.a < 0.0001) {
1457
- return out;
1458
- }
1459
- let lit = shadeSurfaceFull(in.worldPos, in.worldNormal, shaded.rgb / shaded.a, model.materialParams, model.pbr, model.emissive);
1460
- out.color = vec4<f32>(lit.display * shaded.a, shaded.a);
1461
- out.hdr = vec4<f32>(lit.hdr * shaded.a, shaded.a);
1462
- return out;
1463
- }
1464
-
1465
- fn textFragment(in : VSOut) -> TextFragment {
1466
- let fw = max(abs(dpdx(in.uv)) + abs(dpdy(in.uv)), vec2<f32>(0.000001));
1467
- let m = matteCoverage(in.pos.xy);
1468
- var f = shadeText(in, fw);
1469
- f.color *= m;
1470
- f.hdr *= m;
1471
- if (f.color.a < 0.0001) {
1472
- discard;
1473
- }
1474
- return f;
1475
- }
1476
-
1477
- @fragment fn fs_single(in : VSOut) -> @location(0) vec4<f32> {
1478
- return textFragment(in).color;
1479
- }
1480
-
1481
- struct MrtOutput {
1482
- @location(0) color : vec4<f32>,
1483
- @location(1) depth : vec4<f32>,
1484
- };
1485
-
1486
- struct BloomOutput {
1487
- @location(0) color : vec4<f32>,
1488
- @location(1) hdr : vec4<f32>,
1489
- };
1490
-
1491
- struct MrtBloomOutput {
1492
- @location(0) color : vec4<f32>,
1493
- @location(1) depth : vec4<f32>,
1494
- @location(2) hdr : vec4<f32>,
1495
- };
1496
-
1497
- @fragment fn fs_mrt(in : VSOut) -> MrtOutput {
1498
- var out : MrtOutput;
1499
- out.color = textFragment(in).color;
1500
- out.depth = vec4<f32>(in.linearDepth, 0.0, 0.0, 1.0);
1501
- return out;
1502
- }
1503
-
1504
- @fragment fn fs_single_bloom(in : VSOut) -> BloomOutput {
1505
- let f = textFragment(in);
1506
- var out : BloomOutput;
1507
- out.color = f.color;
1508
- out.hdr = f.hdr;
1509
- return out;
1510
- }
1511
-
1512
- @fragment fn fs_mrt_bloom(in : VSOut) -> MrtBloomOutput {
1513
- let f = textFragment(in);
1514
- var out : MrtBloomOutput;
1515
- out.color = f.color;
1516
- out.depth = vec4<f32>(in.linearDepth, 0.0, 0.0, 1.0);
1517
- out.hdr = f.hdr;
1518
- return out;
1519
- }
1520
- `;var yr=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:pr});this.modelLayout=e.createBindGroupLayout({label:"Slug3DModelLayout",entries:[{binding:0,visibility:GPUShaderStage.VERTEX|GPUShaderStage.FRAGMENT,buffer:{type:"uniform"}},oe(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:yr*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"}]}]},B={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:f}=de(e,B);this.pipelineSingle=Q,this.pipelineMrt=f,this.bloomVariants=new ne(e,B)}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),u=this.device.createBindGroup({layout:this.modelLayout,entries:[{binding:0,resource:{buffer:l}},{binding:1,resource:a.matte?.createView()??ae(this.device)}]}),I=this.instancePool.getBuffer(this.device,i.subarray(0,o*yr));e.setPipeline(g?this.bloomVariants.get(s):s?this.pipelineMrt:this.pipelineSingle),e.setBindGroup(0,t),e.setBindGroup(1,u),e.setBindGroup(2,this.fontBindGroup(r.curvesTex,r.bandsTex)),e.setBindGroup(3,n),e.setVertexBuffer(0,I),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 Bo={repeat:"repeat",clamp:"clamp-to-edge",mirror:"mirror-repeat"},Eo=5e-4,br=class{device;format;quad3dPipeline;slug3dPipeline;mesh3dPipeline;audioMeshDeformPipeline;dofPipeline;dofBindGroupLayout;cameraPool;lightsPool;cameraUniformBindGroupCache=new _n;samplerCache=new $n;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 ft(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(Yt,GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST);let r=e.createShaderModule({label:"dof-bokeh.wgsl",code:Er});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=ce.computeViewMatrix(e),o=ce.computeProjectionMatrix(e),a=ce.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=k.normalize(k.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"?en(this.meshAabb(e.mesh),this.meshModelMatrix(e.opts)):en({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]],u=o.mapSize??2048,I=r.map(d=>this.worldBounds(d)),B=hr({type:a,position:g,direction:l,angle:t.angle},I,i,u);if(!B)return null;(!this.shadowTexture||this.shadowTexture.width!==u)&&(this.shadowTexture?.destroy(),this.shadowTexture=this.device.createTexture({label:"ShadowMap",size:{width:u,height:u},format:Bt,usage:GPUTextureUsage.RENDER_ATTACHMENT|GPUTextureUsage.TEXTURE_BINDING}));let Q=new Float32Array(80);Q.set(B.viewProj,32),Q.set(B.viewProj,0),Q[5]=1,Q.set(B.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]=u,Q[77]=u;let f=this.createCameraBindGroup(this.cameraPool.getBuffer(this.device,Q)),h=e.beginRenderPass({label:"ShadowMapPass",colorAttachments:[],depthStencilAttachment:{view:this.shadowTexture.createView(),depthClearValue:1,depthLoadOp:"clear",depthStoreOp:"store"}}),m=this.samplerCache.getSampler(this.device);for(let d of r)if(d.kind==="mesh"){let x=this.meshModelMatrix(d.opts);this.mesh3dPipeline.drawShadow(h,f,d.buffers??this.getOrCreateMeshBuffers(d.mesh),{modelMatrix:x,normalMatrix:d.opts.normalMatrix??qA.computeNormalMatrix(x),isSkinned:d.opts.isSkinned,skinningMatrices:d.opts.skinningMatrices})}else{let x=this.quadModelMatrix(d.opts);this.quad3dPipeline.drawShadow(h,f,d.texture,m,{modelMatrix:x,normalMatrix:x,width:d.opts.width,height:d.opts.height,textureExtent:d.opts.textureExtent,opacity:d.opts.opacity,colorTint:d.opts.colorTint})}return h.end(),{matrix:B.viewProj,lightIndex:n,mapSize:u,softness:o.softness??t.shadowSoftness??2.5,bias:a==="directional"?6e-4:8e-5,normalOffset:B.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,u=!1){let I=this.getOrCreateDepthTexture(n,r),B=this.packCameraUniforms(i,n,r),Q=this.createCameraBindGroup(B),f=this.getOrCreateLightsBuffer(g,l),h=this.createLightsBindGroup(f,!!l?.shadow),m=this.sampleCount>1;if(m&&o==="load")throw new Error("Renderer3D.beginPass: loadOp 'load' needs a Renderer3D built with sampleCount 1");let d=(G,M,D,b)=>M?{view:M.createView(),resolveTarget:G,loadOp:"clear",storeOp:"discard",clearValue:D}:{view:G,loadOp:b,storeOp:"store",clearValue:D};m&&(this.msaaColorTexture=this.getOrCreateMsaaTexture(this.msaaColorTexture,"Renderer3DMsaaColor",this.format,n,r));let x=[d(t,m?this.msaaColorTexture:null,a,o)];return s&&(m&&(this.msaaLinearDepthTexture=this.getOrCreateMsaaTexture(this.msaaLinearDepthTexture,"Renderer3DMsaaLinearDepth","rgba16float",n,r)),x.push(d(s,m?this.msaaLinearDepthTexture:null,{r:i.far,g:0,b:0,a:1},"clear"))),this.passWritesHdr=u,u&&(this.hdrTexture=this.getOrCreateHdrTexture(n,r),m&&(this.msaaHdrTexture=this.getOrCreateMsaaTexture(this.msaaHdrTexture,"Renderer3DMsaaHdr","rgba16float",n,r)),x.push(d(this.hdrTexture.createView(),m?this.msaaHdrTexture:null,{r:0,g:0,b:0,a:0},"clear"))),{pass:e.beginRenderPass({colorAttachments:x,depthStencilAttachment:{view:I.createView(),depthClearValue:1,depthLoadOp:"clear",depthStoreOp:m?"discard":"store"}}),cameraBindGroup:Q,cameraBuffer:B,lightsBindGroup:h}}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,u=i[2]*Math.PI/180;u!==0&&(s=$.multiply(s,$.rotateZ(u))),l!==0&&(s=$.multiply(s,$.rotateY(l))),g!==0&&(s=$.multiply(s,$.rotateX(g)));let I=n*o[0],B=r*o[1],Q=o[2];s=$.multiply(s,$.scale(I,B,Q));let f=.5-a[0],h=.5-a[1];return(f!==0||h!==0)&&(s=$.multiply(s,$.translate(f,h,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),u=i.normalMatrix??qA.computeNormalMatrix(l),I=$.multiply(l,$.multiply($.translate(-.5,-.5,0),$.scale(1/s,1/g,1)));for(let B=0;B<r.length;B++){let Q=r[B],[f,h,m,d,x,y]=Q.transform,G=[f,h,0,0,m,d,0,0,0,0,1,0,x,y,0,1];this.slug3dPipeline.draw(e,t,n,Q.font,Q.instances,Q.instanceCount,{modelMatrix:$.multiply(I,G),normalMatrix:u,opacity:Q.opacity*(i.opacity??1),slant:Q.slant,twoSided:i.twoSided??!0,depthPull:Eo*(o+B+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:u,borderWidth:I=0,borderRadius:B=0,twoSided:Q=!0,material:f="lit",shininess:h=32,roughness:m,specularIntensity:d=.5,ambientIntensity:x=1,metallic:y}=i,G=this.quadModelMatrix(i),M=i.normalMatrix??qA.computeNormalMatrix(G),D=this.samplerCache.getSampler(this.device),b;if(u)if(Array.isArray(u))b=u;else{let N=et(u);b=[N.r,N.g,N.b,N.a]}this.quad3dPipeline.draw(e,t,n,r,D,{modelMatrix:G,normalMatrix:M,colorTint:l,borderColor:b,borderWidth:I,opacity:g,borderRadius:B,twoSided:Q,width:a,height:s,textureExtent:i.textureExtent,material:f,shininess:h,roughness:m,specularIntensity:d,ambientIntensity:x,metallic:y,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 u=l*16;r[u]=e.positions[l*3]??0,r[u+1]=e.positions[l*3+1]??0,r[u+2]=e.positions[l*3+2]??0,r[u+3]=e.uvs[l*2]??0,r[u+4]=e.uvs[l*2+1]??0,r[u+5]=e.normals[l*3]??0,r[u+6]=e.normals[l*3+1]??0,r[u+7]=e.normals[l*3+2]??1,e.jointIndices?(r[u+8]=e.jointIndices[l*4]??0,r[u+9]=e.jointIndices[l*4+1]??0,r[u+10]=e.jointIndices[l*4+2]??0,r[u+11]=e.jointIndices[l*4+3]??0):(r[u+8]=0,r[u+9]=0,r[u+10]=0,r[u+11]=0),e.jointWeights?(r[u+12]=e.jointWeights[l*4]??0,r[u+13]=e.jointWeights[l*4+1]??0,r[u+14]=e.jointWeights[l*4+2]??0,r[u+15]=e.jointWeights[l*4+3]??0):(r[u+12]=0,r[u+13]=0,r[u+14]=0,r[u+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:u=!0,wireframe:I=!1,isSkinned:B=!1,skinningMatrices:Q,material:f="lit",shadeColor:h,alphaCutoff:m,textureWrap:d="clamp",shininess:x=32,roughness:y,specularIntensity:G=.5,ambientIntensity:M=1,metallic:D}=o,b=this.meshModelMatrix(o),N=o.normalMatrix??qA.computeNormalMatrix(b),S=Bo[d],v=this.samplerCache.getSampler(this.device,{addressModeU:S,addressModeV:S}),F=f==="glass"||f==="acrylic"||f==="frosted",P=F?{ior:o.ior??(f==="acrylic"?1.49:1.5),dispersion:o.dispersion??(f==="glass"?.04:.015),thickness:o.thickness??80,frost:f==="frosted"?y??.5:0}:void 0;this.mesh3dPipeline.draw(e,t,n,s,i,v,{glass:P,backdrop:o.backdrop,modelMatrix:b,normalMatrix:N,colorTint:l,opacity:g,twoSided:u,wireframe:I,isSkinned:B,skinningMatrices:Q,material:f==="unlit"||f==="toon"?f:"lit",shadeColor:h,alphaCutoff:m,shininess:x,roughness:F?Math.min(y??.05,.3):y,specularIntensity:G,ambientIntensity:M,metallic:D,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 Dr(e,t,n);let r=`${t}|${JSON.stringify(n)}|${e}`,i=this.modelCache.get(r);return i||(i=Dr(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),u=Math.max(1,o>>g),I=await n(r).ensureAlpha().resize(l,u,{fit:"fill"}).raw().toBuffer();this.device.queue.writeTexture({texture:s,mipLevel:g},I,{bytesPerRow:l*4,rowsPerImage:u},{width:l,height:u})}return s}applyBloom(e,t,n,r={},i){this.bloomPipeline??=new It(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 Dr(A,e="auto",t={}){if(e==="gltf"||e==="glb")return st(A,t);if(e==="stl")return ve(A,t);if(e==="ply")return Re(A,t);if(e==="vox")return gt(A,t);if(e==="3ds")return lt(A,t);if(e==="off")return ut(A,t);if(e==="fbx")return Se(A,t);if(e==="obj")return Fe(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 ve(A,t);if(i.endsWith(".ply"))return Re(A,t);if(i.endsWith(".vox"))return gt(A,t);if(i.endsWith(".3ds"))return lt(A,t);if(i.endsWith(".off"))return ut(A,t);if(i.endsWith(".fbx"))return Se(A,t);if(i.endsWith(".obj"))return Fe(A,void 0,t);if(n){let o=A instanceof Uint8Array?A:new Uint8Array(A);return Ee.isGlb(o)?Br(o,t):re.isBinary(o)?Se(o,t):ke.isVox(o)?gt(o,t):Pe.is3DS(o)?lt(o,t):o.length>=3&&o[0]===112&&o[1]===108&&o[2]===121?Re(o,t):Ue.isBinary(o)?ve(o,t):Fe(o,void 0,t)}return r.startsWith("{")&&(r.includes('"asset"')||r.includes('"meshes"'))?st(r,t):r.startsWith("ply")||r.startsWith("PLY")?Re(r,t):r.startsWith("OFF")||r.startsWith("NOFF")||r.startsWith("COFF")?ut(r,t):r.includes("FBXHeaderExtension")||r.includes("Kaydara FBX")?Se(r,t):r.startsWith("solid")&&r.includes("facet")?ve(r,t):Fe(A,void 0,t)}L();var{cbrt:tn,sqrt:nn,PI:he}=Math,Qo=(A,e,t,n,r)=>{let i=e+t*A,o=i**2+n;if(o>0){let l=nn(o);return tn(i+l)+tn(i-l)-r}let a=tn(nn(i*i-o)),s=i?Math.atan(nn(-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},fo=(A,e,t,n)=>((e*A+3*t)*A+n)*A,rn=A=>A;function wr(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 rn;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),u=2*o/r-s/a,I=u*u*u,B=3/r,Q=3*e-3*n+1,f=n-2*e,h=3*e,m=r?Qo:rn;return function(x){return x===0||x===1?x:fo(m(x,l,B,I,g),Q,f,h)}}var yl={linear:rn,ease:wr(.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:wr,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 xr(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],u=t[s-1],I=t[s];if(g===l)return u;let B=(A-g)/(l-g);return n?.easing&&(B=n.easing(B)),u+B*(I-u)}L();var Co={damping:10,mass:1,stiffness:100,overshootClamping:!1},on={};function mo({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,u=[n,r,i,o,s,g,l,e].join("-");if(on[u])return on[u];let I=-o,B=n-i,Q=s/(2*Math.sqrt(l*g)),f=Math.sqrt(l/g),h=f*Math.sqrt(1-Q**2),m=a/1e3,d=Math.sin(h*m),x=Math.cos(h*m),y=Math.exp(-Q*f*m),G=y*(d*((I+Q*f*B)/h)+B*x),M=n-G,D=Q*f*G-y*(x*(I+Q*f*B)-h*B*d),b=Math.exp(-f*m),N=n-b*(B+(I+f*B)*m),S=b*(I*(m*f-1)+m*B*f*f),v={toValue:n,prevPosition:i,lastTimestamp:e,current:Q<1?M:N,velocity:Q<1?D:S};return on[u]=v,v}var an={};function Mr({frame:A,fps:e,config:t={}}){let i=[A,e,t.damping,t.mass,t.overshootClamping,t.stiffness].join("-");if(an[i])return an[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=mo({animation:o,now:l,config:{...Co,...t}})}return an[i]=o,o}var sn=new Map;function ho({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(sn.has(n))return sn.get(n);let r=0,i=0,o=()=>Mr({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 sn.set(n,i),i}function xl({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?ho({fps:e,config:t,threshold:o}):void 0,u=g?{get:()=>l}:{get:()=>{throw new Error("did not calculate natural duration")}},B=(s?(i??u.get())-A:A)+(s?a:-a),Q=i===void 0?B:B/(i/u.get());if(i&&B>i)return r;let f=Mr({fps:e,frame:Q,config:t}),h=t.overshootClamping?r>=n?Math.min(f.current,r):Math.max(f.current,r):f.current;return n===0&&r===1?h:xr(h,[0,1],[n,r])}L();L();L();L();var Je=new Set,gn=!1;function Qn(A,e,t=2){let n=e&&e.length,r=n?e[0]*t:A.length;Je.size&&Je.clear();let i=Sr(A,0,r,t,!0),o=[];if(!i||i.next===i.prev)return o;let a=0,s=0,g=0;if(n&&(i=wo(A,e,i,t)),A.length>80*t){a=A[0],s=A[1];let l=a,u=s;for(let I=t;I<r;I+=t){let B=A[I],Q=A[I+1];B<a&&(a=B),Q<s&&(s=Q),B>l&&(l=B),Q>u&&(u=Q)}g=Math.max(l-a,u-s),g=g!==0?32767/g:0}return ln(i,o,a,s,g),o}function Sr(A,e,t,n,r){let i=null;if(r===Ho(A,e,t,n)>0)for(let o=e;o<t;o+=n)i=Fr(o/n|0,A[o],A[o+1],i);else for(let o=t-n;o>=e;o-=n)i=Fr(o/n|0,A[o],A[o+1],i);return i&&Oe(i,i.next)&&(Ve(i),i=i.next),i}function ge(A,e=A){let t=e===A,n=A,r;do r=!1,n!==n.next&&(Je.size===0||!Je.has(n))&&(Oe(n,n.next)||MA(n.prev,n,n.next)===0)?((t||n===e)&&(e=n.prev),gn=!0,Ve(n),n=n.prev,r=!0):(t||n!==e)&&(n=n.next,r=!t);while(r||n!==e);return e}function ln(A,e,t,n,r){r&&Uo(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?yo(A,t,n,r):po(A))){e.push(a.i,A.i,s.i),Ve(A),A=s,i=s;continue}if(A=s,A===i){if(gn=!1,A=ge(A),gn){i=A;continue}if(!o){A=bo(A,e),i=A,o=!0;continue}Do(A,e,t,n,r);break}}}function po(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),u=Math.min(a,s,g),I=Math.max(r,i,o),B=Math.max(a,s,g),Q=n.next;for(;Q!==e;){if(Q.x>=l&&Q.x<=I&&Q.y>=u&&Q.y<=B&&!(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 yo(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,u=i.y,I=o.y,B=Math.min(a,s,g),Q=Math.min(l,u,I),f=Math.max(a,s,g),h=Math.max(l,u,I),m=Bn(B,Q,e,t,n),d=Bn(f,h,e,t,n),x=A.prevZ;for(;x&&x.z>=m;){if(x.x>=B&&x.x<=f&&x.y>=Q&&x.y<=h&&x!==o&&!(a===x.x&&l===x.y)&&yt(a,l,s,u,g,I,x.x,x.y)&&MA(x.prev,x,x.next)>=0)return!1;x=x.prevZ}let y=A.nextZ;for(;y&&y.z<=d;){if(y.x>=B&&y.x<=f&&y.y>=Q&&y.y<=h&&y!==o&&!(a===y.x&&l===y.y)&&yt(a,l,s,u,g,I,y.x,y.y)&&MA(y.prev,y,y.next)>=0)return!1;y=y.nextZ}return!0}function bo(A,e){let t=A,n=!1;do{let r=t.prev,i=t.next.next;Rr(r,t,t.next,i,!1)&&Ke(r,i)&&Ke(i,r)&&(e.push(r.i,t.i,i.i),Ve(t),Ve(t.next),t=A=i,n=!0),t=t.next}while(t!==A);return n?ge(t):t}function Do(A,e,t,n,r){let i=A;do{let o=i.next.next;for(;o!==i.prev;){if(i.i!==o.i&&Lo(i,o)){let a=Lr(i,o);i=ge(i,i.next),a=ge(a,a.next),ln(i,e,t,n,r),ln(a,e,t,n,r);return}o=o.next}i=i.next}while(i!==A)}var un=!1;function wo(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=Sr(A,a,s,n,!1);g===g.next&&Je.add(g),r.push(Ro(g))}r.sort(xo),Go(A.length/n,e.length),vr(t,t),un=!0;for(let i=0;i<r.length;i++)t=Mo(r[i],t);return un=!1,ge(t)}function xo(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 Mo(A,e){let t=Fo(A,e);if(!t)return e;let n=Lr(t,A),r=n.next;return vr(t,r.next),ge(n,n.next),ge(t,t.next)}var Ur=16,wA=new Float64Array(0),pt=0,In=[],cn=[];function Go(A,e){let t=Math.ceil((A+2*e)/Ur)+e+2;wA.length<t*4&&(wA=new Float64Array(t*4)),pt=0}function vr(A,e){let t=A;do{let n=pt++;In[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<Ur&&t!==e);cn[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 No(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 Gr(A){let e=cn[A];for(;e.prev.next!==e;)e=e.next;return cn[A]=e,e}function Nr(A){let e=In[A];for(;e.prev.next!==e;)e=e.next;return In[A]=e,e}function Fo(A,e){let t=e,n=A.x,r=A.y,i=-1/0,o;if(Oe(A,t))return t;for(let I=0,B=0;I<pt;I++,B+=4){if(r<wA[B+1]||r>wA[B+3]||wA[B]>n||wA[B+2]<=i)continue;let Q=Gr(I);t=Nr(I);do{if(t.prev.next===t){if(Oe(A,t.next))return t.next;if(r<=t.y&&r>=t.next.y&&t.next.y!==t.y){let f=t.x+(r-t.y)*(t.next.x-t.x)/(t.next.y-t.y);if(f<=n&&f>i&&(i=f,o=t.x<t.next.x?t:t.next,f===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),u=1/0;for(let I=0,B=0;I<pt;I++,B+=4){if(wA[B+2]<a||wA[B]>n||wA[B+3]<g||wA[B+1]>l)continue;let Q=Gr(I);t=Nr(I);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 f=Math.abs(r-t.y)/(n-t.x);(Ke(t,A)||t.y===r&&t.next.y===r&&t.next.x>n)&&(f<u||f===u&&(t.x>o.x||t.x===o.x&&So(o,t)))&&(o=t,u=f)}t=t.next}while(t!==Q)}return o}function So(A,e){return MA(A.prev,A,e.prev)<0&&MA(e.next,A,A.next)<0}var FA=[],pe=[],se=new Uint32Array(0),He=new Uint32Array(0),Te=new Uint32Array(256);function Uo(A,e,t,n){let r=A,i=0;do r.z=Bn(r.x,r.y,e,t,n),FA[i++]=r,r=r.next;while(r!==A);vo(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 vo(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}se.length<A&&(se=new Uint32Array(A),He=new Uint32Array(A),pe=new Array(A));for(let e=0;e<A;e++)se[e]=FA[e].z;mt(A,FA,se,pe,He,0),mt(A,pe,He,FA,se,8),mt(A,FA,se,pe,He,16),mt(A,pe,He,FA,se,24)}function mt(A,e,t,n,r,i){Te.fill(0);for(let a=0;a<A;a++)Te[t[a]>>>i&255]++;let o=0;for(let a=0;a<256;a++){let s=Te[a];Te[a]=o,o+=s}for(let a=0;a<A;a++){let s=t[a],g=Te[s>>>i&255]++;n[g]=e[a],r[g]=s}}function Bn(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 Ro(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 Lo(A,e){let t=Oe(A,e)&&MA(A.prev,A,A.next)>0&&MA(e.prev,e,e.next)>0;return A.next.i!==e.i&&(t||Ke(A,e)&&Ke(e,A)&&(MA(A.prev,A,e.prev)!==0||MA(A,e.prev,e)!==0))&&!ko(A,e)&&(t||Po(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 Oe(A,e){return A.x===e.x&&A.y===e.y}function Rr(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 ko(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&&Rr(o,a,A,e))return!0;o=a}while(o!==A);return!1}function Ke(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 Po(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 Lr(A,e){let t=En(A.i,A.x,A.y),n=En(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 Fr(A,e,t,n){let r=En(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 Ve(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),un&&No(A.prev,A.next)}function En(A,e,t){return{i:A,x:e,y:t,prev:null,next:null,z:0,prevZ:null,nextZ:null}}function Ho(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 Jr=Kn(Pr(),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 wt(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 To=.1,Jo=64;function Or(A,e){if(e.segments!==void 0)return e.segments;let t=Math.ceil(Math.sqrt(A/(8*e.tolerance)));return Math.min(Jo,Math.max(1,t))}function Oo(A,e,t,n,r){let i=Or(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 Ko(A,e,t,n,r,i){let o=Or(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 Vo(A){try{let e=new Jr.Path2D(A).simplify().edges;return Array.isArray(e)?e:null}catch{return null}}function Yo(A,e,t,n,r){let i=A.path?.toSVG();if(!i)return{contours:[],simplified:!0};let o=Vo(i),a=o!==null;o??=(A.path?.commands??[]).map(I=>[I.command,...I.args]);let s=[],g={x:0,y:0},l=[],u=()=>{if(l.length>=3){let I=l[0],B=l[l.length-1];Math.hypot(B.x-I.x,B.y-I.y)<1e-4&&l.pop(),l.length>=3&&s.push(l)}l=[]};for(let I of o){let B=I[0],Q=I.slice(1);if(B==="moveTo")u(),g={x:(e+Q[0])*n,y:-(t+Q[1])*n},l=[g];else if(B==="lineTo")g={x:(e+Q[0])*n,y:-(t+Q[1])*n},l.push(g);else if(B==="quadraticCurveTo"){let f={x:(e+Q[0])*n,y:-(t+Q[1])*n},h={x:(e+Q[2])*n,y:-(t+Q[3])*n};Oo(g,f,h,r,l),g=h}else if(B==="bezierCurveTo"){let f={x:(e+Q[0])*n,y:-(t+Q[1])*n},h={x:(e+Q[2])*n,y:-(t+Q[3])*n},m={x:(e+Q[4])*n,y:-(t+Q[5])*n};Ko(g,f,h,m,r,l),g=m}else B==="closePath"&&u()}return u(),{contours:s,simplified:a}}var Wo=Math.cos(30*Math.PI/180);function zo({contours:A,simplified:e}){if(!e)return qo(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;(wt(a[0],l)||wt(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 Xo(A,e,t,n){let r=e.x-A.x,i=e.y-A.y,o=n.x-t.x,a=n.y-t.y,s=r*a-i*o;if(Math.abs(s)<1e-12)return null;let g=((t.x-A.x)*a-(t.y-A.y)*o)/s,l=((t.x-A.x)*i-(t.y-A.y)*r)/s,u=1e-9;return g<=u||g>=1-u||l<=u||l>=1-u?null:{x:A.x+r*g,y:A.y+i*g}}function fn(A,e=0){let t=A.length;if(t<3)return[];if(e>64)return[A];for(let n=0;n<t;n++){let r=A[n],i=A[(n+1)%t];for(let o=n+2;o<t;o++){if(n===0&&o===t-1)continue;let a=Xo(r,i,A[o],A[(o+1)%t]);if(!a)continue;let s=[a,...A.slice(n+1,o+1)],g=[a,...A.slice(o+1),...A.slice(0,n+1)];return[...fn(s,e+1),...fn(g,e+1)]}}return Math.abs(ye(A))>1e-9?[A]:[]}function Zo(A,e){let t=0;for(let n of e)for(let r=0;r<n.length;r++){let i=n[r],o=n[(r+1)%n.length],a=(o.x-i.x)*(A.y-i.y)-(A.x-i.x)*(o.y-i.y);i.y<=A.y?o.y>A.y&&a>0&&t++:o.y<=A.y&&a<0&&t--}return t}function Hr(A){let e=0,t=-1;for(let u=0;u<A.length;u++){let I=A[u],B=A[(u+1)%A.length],Q=Math.hypot(B.x-I.x,B.y-I.y);Q>t&&(t=Q,e=u)}let n=A[e],r=A[(e+1)%A.length],i=(n.x+r.x)/2,o=(n.y+r.y)/2,a=Math.max(1e-4,Math.min(.01,t*.001)),s=-(r.y-n.y)/t*a,g=(r.x-n.x)/t*a,l={x:i+s,y:o+g};return wt(l,A)?l:{x:i-s,y:o-g}}function qo(A){let e=A.flatMap(r=>fn(r)),t=[],n=[];for(let r of e)Zo(Hr(r),A)!==0?t.push({outer:r,holes:[]}):n.push(r);for(let r of n){let i=Math.abs(ye(r)),o=Hr(r),a,s=Number.POSITIVE_INFINITY;for(let g of t){let l=Math.abs(ye(g.outer));l>i&&l<s&&wt(o,g.outer)&&(a=g,s=l)}a?.holes.push(r)}return t}var Tr=new WeakMap;function _o(A,e,t,n,r,i){let o=Tr.get(A);o||(o=new Map,Tr.set(A,o));let a=`${e.id}|${r}|${i.segments??""}|${i.tolerance}`,s=o.get(a);s||(s=zo(Yo(e,0,0,r,i)),o.set(a,s));let g=t*r,l=-n*r,u=I=>I.map(B=>({x:B.x+g,y:B.y+l}));return s.map(I=>({outer:u(I.outer),holes:I.holes.map(u)}))}function Ll(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??To)},o=e.unitsPerEm||1e3,a=t/o,s=Zn(e,A.text.replace(/\n/g," "),{direction:A.direction,letterSpacing:A.letterSpacing?A.letterSpacing/a:0}),g=[];for(let Z of s.glyphs){let W=e.getGlyph(Z.glyphId),q=_o(e,W,Z.x,Z.y,a,i);for(let mA of q)g.push(mA)}let l=Number.POSITIVE_INFINITY,u=Number.NEGATIVE_INFINITY,I=Number.POSITIVE_INFINITY,B=Number.NEGATIVE_INFINITY;for(let Z of g){for(let W of Z.outer)W.x<l&&(l=W.x),W.x>u&&(u=W.x),W.y<I&&(I=W.y),W.y>B&&(B=W.y);for(let W of Z.holes)for(let q of W)q.x<l&&(l=q.x),q.x>u&&(u=q.x),q.y<I&&(I=q.y),q.y>B&&(B=q.y)}Number.isFinite(l)||(l=0,u=0,I=0,B=0);let Q=u-l,f=B-I,h=(s.baseLevel&1)===1,m=A.align==="start"?h?"right":"left":A.align==="end"?h?"left":"right":A.align,d=(l+u)/2;m==="left"&&(d=l),m==="right"&&(d=u);let x=(I+B)/2;A.verticalAlign==="top"&&(x=I),A.verticalAlign==="bottom"&&(x=B);for(let Z of g){for(let W of Z.outer)W.x-=d,W.y-=x;for(let W of Z.holes)for(let q of W)q.x-=d,q.y-=x}l-=d,u-=d,I-=x,B-=x;let y=[],G=[],M=[],D=[],b=[],N=[],S=[],v=[],F=(Z,W,q)=>{let mA=b.length/3;return b.push(Z.x,Z.y,r,Z.x,Z.y,-r),N.push(W.x,W.y,0,W.x,W.y,0),S.push(q,0,q,1),mA},P=Z=>{let W=Z.filter((H,rA)=>{let j=Z[(rA+1)%Z.length];return Math.hypot(j.x-H.x,j.y-H.y)>=1e-6}),q=W.length;if(q<2)return;let mA=[],eA=W.map((H,rA)=>{let j=W[(rA+1)%q],sA=Math.hypot(j.x-H.x,j.y-H.y);return mA.push(sA),{x:(j.y-H.y)/sA,y:-(j.x-H.x)/sA}}),lA=mA.reduce((H,rA)=>H+rA,0),uA=[],yA=[],tA=0;for(let H=0;H<q;H++){let rA=eA[(H-1+q)%q],j=eA[H],sA=tA/lA,BA=rA.x+j.x,O=rA.y+j.y,aA=rA.x*j.x+rA.y*j.y>=Wo?{x:BA/Math.hypot(BA,O),y:O/Math.hypot(BA,O)}:null;aA&&H>0?uA[H]=yA[H]=F(W[H],aA,sA):(yA[H]=F(W[H],aA??rA,H===0?1:sA),uA[H]=F(W[H],aA??j,sA)),tA+=mA[H]}for(let H=0;H<q;H++){let rA=uA[H],j=yA[(H+1)%q];v.push(rA,j+1,j),v.push(rA,rA+1,j+1)}};for(let Z of g){let W=Z.outer;ye(W)<0&&W.reverse();for(let tA of Z.holes)ye(tA)>0&&tA.reverse();let q=[],mA=[];for(let tA of W)q.push(tA.x,tA.y);for(let tA of Z.holes){mA.push(q.length/2);for(let H of tA)q.push(H.x,H.y)}let eA=Qn(q,mA,2),lA=q.length/2,uA=y.length/3;for(let tA=0;tA<lA;tA++){let H=q[tA*2],rA=q[tA*2+1];y.push(H,rA,-r),G.push(0,0,-1),M.push((H-l)/(Q||1),(rA-I)/(f||1))}for(let tA=0;tA<eA.length;tA+=3)D.push(uA+eA[tA],uA+eA[tA+2],uA+eA[tA+1]);let yA=y.length/3;for(let tA=0;tA<lA;tA++){let H=q[tA*2],rA=q[tA*2+1];y.push(H,rA,r),G.push(0,0,1),M.push((H-l)/(Q||1),(rA-I)/(f||1))}for(let tA=0;tA<eA.length;tA+=3)D.push(yA+eA[tA],yA+eA[tA+1],yA+eA[tA+2]);P(W);for(let tA of Z.holes)P(tA)}let V=Dt(A.fill??"#ffffff"),R=Dt(A.bevelColor??A.fill??"#ffffff"),X={name:"front-material",diffuseColor:V,shading:A.material??"lit",shininess:A.shininess??32,roughness:A.roughness,metallic:A.metallic,twoSided:!0},_={name:"side-material",diffuseColor:R,shading:A.material??"lit",shininess:A.shininess??32,roughness:A.roughness,metallic:A.metallic,twoSided:!0},AA=[];return D.length>0&&AA.push({id:"text-front-mesh",name:"front",positions:new Float32Array(y),normals:new Float32Array(G),uvs:new Float32Array(M),indices:y.length/3>65535?new Uint32Array(D):new Uint16Array(D),materialName:"front-material"}),v.length>0&&AA.push({id:"text-side-mesh",name:"side",positions:new Float32Array(b),normals:new Float32Array(N),uvs:new Float32Array(S),indices:b.length/3>65535?new Uint32Array(v):new Uint16Array(v),materialName:"side-material"}),{modelData:{name:`extruded-text-${A.text}`,meshes:AA,materials:{"front-material":X,"side-material":_},animations:[],bounds:{min:[l,I,-r],max:[u,B,r],center:[(l+u)/2,(I+B)/2,0],size:[Q,f,n],boundingSphereRadius:Math.hypot(Q,f,n)/2}},bounds:{minX:l,maxX:u,minY:I,maxY:B,width:Q,height:f,depth:n}}}var dn=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 mn(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 Cn(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 jo(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,u=Cn(t,i,o),I=Cn(n,i,o),B=Cn(r,i,o),Q=A.height>0?(1-a)/A.height:0,f=y=>a+Q*(y+n),h=(y,G)=>{let M=[Math.max(-s,Math.min(s,y[0])),Math.max(-g,Math.min(g,y[1])),Math.max(-l,Math.min(l,y[2]))],D=i>0?mn([y[0]-M[0],y[1]-M[1],y[2]-M[2]]):G;D[0]===0&&D[1]===0&&D[2]===0&&(D=G);let b=[M[0]+D[0]*i,M[1]+D[1]*i,M[2]+D[2]*i];if(a===1)return{p:b,n:D};let N=f(b[1]);return{p:[b[0]*N,b[1],b[2]*N],n:mn([D[0]/N,D[1]-b[0]*Q*D[0]/N-b[2]*Q*D[2]/N,D[2]/N])}},m=[{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],x=[u,I,B];for(let y of m){let G=x[y.u],M=x[y.v],D=[0,0,0];D[y.axis]=y.sign;let b=e.positions.length/3;for(let S=0;S<M.length;S++)for(let v=0;v<G.length;v++){let F=[0,0,0];F[y.axis]=y.sign*d[y.axis],F[y.u]=G[v],F[y.v]=M[S];let{p:P,n:V}=h(F,D);e.vertex(P,V,[(G[v]/d[y.u]+1)/2,(M[S]/d[y.v]+1)/2])}let N=(y.v+1)%3===y.u;e.grid(b,G.length-1,M.length-1,(N?1:-1)!==y.sign)}}function $o(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 Aa(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 u=l/t*Math.PI*2,I=Math.cos(u),B=Math.sin(u);e.vertex([I*s,g,B*s],mn([I,-o,B]),[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]),u=e.positions.length/3;for(let I=0;I<=t;I++){let B=I/t*Math.PI*2,Q=Math.cos(B),f=Math.sin(B);e.vertex([Q*s,a,f*s],[0,g,0],[(Q+1)/2,(f+1)/2])}for(let I=0;I<t;I++)g<0?e.indices.push(l,u+I,u+I+1):e.indices.push(l,u+I+1,u+I)}}function ea(A){let e=new dn;if(A.type==="roundedBox")jo(A,e);else if(A.type==="sphere")$o(A,e);else if(A.type==="cylinder")Aa(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 u=a[g+l];u<i[l]&&(i[l]=u),u>o[l]&&(o[l]=u)}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 xt=new Map;function Tl(A){let e=JSON.stringify(A),t=xt.get(e);return t||(t=ea(A),xt.size>512&&xt.clear(),xt.set(e,t)),t}var hn=new Map;function ta(A,e){return JSON.stringify({text:A,...e})}function pn(A,e){let t=A?String(A):" ",n=ta(t,e),r=hn.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,void 0,i),l=e.padding??0;if(!g){if(!te.isFailed(o)){let d=Kt(o);te.preloadSlugFont(null,o,d).catch(()=>{})}let B=t.split(`
1521
- `),Q=0,f=e.width!==void 0?Math.max(10,e.width-l*2):0;for(let d of B)if(f>0){let x=d.length*i*.55+a*d.length,y=Math.max(1,Math.ceil(x/f));Q+=y}else Q+=1;let h=Math.max(0,t.length-1),m={width:e.width!==void 0?e.width:Math.ceil(t.length*i*.6+a*h)+l*2,height:e.height!==void 0?e.height:Math.ceil(Q*s)+l*2};return hn.set(n,m),m}let u=qn.measure(t,g,i,a,s,e.width!==void 0?Math.max(0,e.width-l*2):void 0,e.spans,e.direction),I={width:e.width!==void 0&&!e.keepNaturalWidth?e.width:Math.ceil(u.width)+l*2,height:e.height!==void 0?e.height:Math.ceil(u.height)+l*2};return hn.set(n,I),I}function Yl(A,e){let t=e.fontFamily??"Inter";if(te.isFailed(t)&&(t="Inter"),te.isFailed(t))return Promise.resolve(pn(A,e));let n=Kt(t);return te.preloadSlugFont(null,t,n).then(()=>pn(A,e)).catch(()=>pn(A,e))}L();L();L();var na=(()=>{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(c,E){n=c,r=E});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"&&X("no native wasm support detected");var u,I=!1;function B(c,E,C){C=E+C;for(var p="";!(E>=C);){var w=c[E++];if(!w)break;if(w&128){var U=c[E++]&63;if((w&224)==192)p+=String.fromCharCode((w&31)<<6|U);else{var T=c[E++]&63;w=(w&240)==224?(w&15)<<12|U<<6|T:(w&7)<<18|U<<12|T<<6|c[E++]&63,65536>w?p+=String.fromCharCode(w):(w-=65536,p+=String.fromCharCode(55296|w>>10,56320|w&1023))}}else p+=String.fromCharCode(w)}return p}var Q,f,h,m,d,x,y,G,M;function D(){var c=u.buffer;Q=c,t.HEAP8=f=new Int8Array(c),t.HEAP16=m=new Int16Array(c),t.HEAP32=x=new Int32Array(c),t.HEAPU8=h=new Uint8Array(c),t.HEAPU16=d=new Uint16Array(c),t.HEAPU32=y=new Uint32Array(c),t.HEAPF32=G=new Float32Array(c),t.HEAPF64=M=new Float64Array(c)}var b,N=[],S=[],v=[];function F(){var c=t.preRun.shift();N.unshift(c)}var P=0,V=null,R=null;function X(c){throw t.onAbort&&t.onAbort(c),c="Aborted("+c+")",s(c),I=!0,c=new WebAssembly.RuntimeError(c+". Build with -sASSERTIONS for more info."),r(c),c}function _(c){return c.startsWith("data:application/octet-stream;base64,")}var AA;if(AA="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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",!_(AA)){var CA=AA;AA=t.locateFile?t.locateFile(CA,o):o+CA}function Z(){var c=AA;try{if(c==AA&&g)return new Uint8Array(g);if(_(c))try{var E=Fi(c.slice(37)),C=new Uint8Array(E.length);for(c=0;c<E.length;++c)C[c]=E.charCodeAt(c);var p=C}catch{throw Error("Converting base64 string to bytes failed.")}else p=void 0;var w=p;if(w)return w;throw"both async and sync fetching of the wasm failed"}catch(U){X(U)}}function W(){return g||typeof fetch!="function"?Promise.resolve().then(function(){return Z()}):fetch(AA,{credentials:"same-origin"}).then(function(c){if(!c.ok)throw"failed to load wasm binary file at '"+AA+"'";return c.arrayBuffer()}).catch(function(){return Z()})}function q(c){for(;0<c.length;)c.shift()(t)}function mA(c){if(c===void 0)return"_unknown";c=c.replace(/[^a-zA-Z0-9_]/g,"$");var E=c.charCodeAt(0);return 48<=E&&57>=E?"_"+c:c}function eA(c,E){return c=mA(c),function(){return E.apply(this,arguments)}}var lA=[{},{value:void 0},{value:null},{value:!0},{value:!1}],uA=[];function yA(c){var E=Error,C=eA(c,function(p){this.name=c,this.message=p,p=Error(p).stack,p!==void 0&&(this.stack=this.toString()+`
1522
- `+p.replace(/^Error(:[^\n]*)?\n/,""))});return C.prototype=Object.create(E.prototype),C.prototype.constructor=C,C.prototype.toString=function(){return this.message===void 0?this.name:this.name+": "+this.message},C}var tA=void 0;function H(c){throw new tA(c)}var rA=c=>(c||H("Cannot use deleted val. handle = "+c),lA[c].value),j=c=>{switch(c){case void 0:return 1;case null:return 2;case!0:return 3;case!1:return 4;default:var E=uA.length?uA.pop():lA.length;return lA[E]={ga:1,value:c},E}},sA=void 0,BA=void 0;function O(c){for(var E="";h[c];)E+=BA[h[c++]];return E}var oA=[];function aA(){for(;oA.length;){var c=oA.pop();c.M.$=!1,c.delete()}}var IA=void 0,QA={};function cA(c,E){for(E===void 0&&H("ptr should not be undefined");c.R;)E=c.ba(E),c=c.R;return E}var gA={};function DA(c){c=Pn(c);var E=O(c);return XA(c),E}function bA(c,E){var C=gA[c];return C===void 0&&H(E+" has unknown type "+DA(c)),C}function hA(){}var pA=!1;function SA(c){--c.count.value,c.count.value===0&&(c.T?c.U.W(c.T):c.P.N.W(c.O))}function UA(c,E,C){return E===C?c:C.R===void 0?null:(c=UA(c,E,C.R),c===null?null:C.na(c))}var LA={};function St(c,E){return E=cA(c,E),QA[E]}var vA=void 0;function ze(c){throw new vA(c)}function Xe(c,E){return E.P&&E.O||ze("makeClassHandle requires ptr and ptrType"),!!E.U!=!!E.T&&ze("Both smartPtrType and smartPtr must be specified"),E.count={value:1},ue(Object.create(c,{M:{value:E}}))}function ue(c){return typeof FinalizationRegistry>"u"?(ue=E=>E,c):(pA=new FinalizationRegistry(E=>{SA(E.M)}),ue=E=>{var C=E.M;return C.T&&pA.register(E,{M:C},E),E},hA=E=>{pA.unregister(E)},ue(c))}var Ze={};function Ut(c){for(;c.length;){var E=c.pop();c.pop()(E)}}function xe(c){return this.fromWireType(x[c>>2])}var Ie={},qe={};function Ae(c,E,C){function p(J){J=C(J),J.length!==c.length&&ze("Mismatched type converter count");for(var Y=0;Y<c.length;++Y)WA(c[Y],J[Y])}c.forEach(function(J){qe[J]=E});var w=Array(E.length),U=[],T=0;E.forEach((J,Y)=>{gA.hasOwnProperty(J)?w[Y]=gA[J]:(U.push(J),Ie.hasOwnProperty(J)||(Ie[J]=[]),Ie[J].push(()=>{w[Y]=gA[J],++T,T===U.length&&p(w)}))}),U.length===0&&p(w)}function vt(c){switch(c){case 1:return 0;case 2:return 1;case 4:return 2;case 8:return 3;default:throw new TypeError("Unknown type size: "+c)}}function WA(c,E,C={}){if(!("argPackAdvance"in E))throw new TypeError("registerType registeredInstance requires argPackAdvance");var p=E.name;if(c||H('type "'+p+'" must have a positive integer typeid pointer'),gA.hasOwnProperty(c)){if(C.ua)return;H("Cannot register type '"+p+"' twice")}gA[c]=E,delete qe[c],Ie.hasOwnProperty(c)&&(E=Ie[c],delete Ie[c],E.forEach(w=>w()))}function Rt(c){H(c.M.P.N.name+" instance already deleted")}function ee(){}function Lt(c,E,C){if(c[E].S===void 0){var p=c[E];c[E]=function(){return c[E].S.hasOwnProperty(arguments.length)||H("Function '"+C+"' called with an invalid number of arguments ("+arguments.length+") - expects one of ("+c[E].S+")!"),c[E].S[arguments.length].apply(this,arguments)},c[E].S=[],c[E].S[p.Z]=p}}function Ii(c,E){t.hasOwnProperty(c)?(H("Cannot register public name '"+c+"' twice"),Lt(t,c,c),t.hasOwnProperty(void 0)&&H("Cannot register multiple overloads of a function with the same number of arguments (undefined)!"),t[c].S[void 0]=E):t[c]=E}function ci(c,E,C,p,w,U,T,J){this.name=c,this.constructor=E,this.X=C,this.W=p,this.R=w,this.pa=U,this.ba=T,this.na=J,this.ja=[]}function kt(c,E,C){for(;E!==C;)E.ba||H("Expected null or instance of "+C.name+", got an instance of "+E.name),c=E.ba(c),E=E.R;return c}function Bi(c,E){return E===null?(this.ea&&H("null is not a valid "+this.name),0):(E.M||H('Cannot pass "'+Jt(E)+'" as a '+this.name),E.M.O||H("Cannot pass deleted object as a pointer of type "+this.name),kt(E.M.O,E.M.P.N,this.N))}function Ei(c,E){if(E===null){if(this.ea&&H("null is not a valid "+this.name),this.da){var C=this.fa();return c!==null&&c.push(this.W,C),C}return 0}if(E.M||H('Cannot pass "'+Jt(E)+'" as a '+this.name),E.M.O||H("Cannot pass deleted object as a pointer of type "+this.name),!this.ca&&E.M.P.ca&&H("Cannot convert argument of type "+(E.M.U?E.M.U.name:E.M.P.name)+" to parameter type "+this.name),C=kt(E.M.O,E.M.P.N,this.N),this.da)switch(E.M.T===void 0&&H("Passing raw pointer to smart pointer is illegal"),this.Ba){case 0:E.M.U===this?C=E.M.T:H("Cannot convert argument of type "+(E.M.U?E.M.U.name:E.M.P.name)+" to parameter type "+this.name);break;case 1:C=E.M.T;break;case 2:if(E.M.U===this)C=E.M.T;else{var p=E.clone();C=this.xa(C,j(function(){p.delete()})),c!==null&&c.push(this.W,C)}break;default:H("Unsupporting sharing policy")}return C}function Qi(c,E){return E===null?(this.ea&&H("null is not a valid "+this.name),0):(E.M||H('Cannot pass "'+Jt(E)+'" as a '+this.name),E.M.O||H("Cannot pass deleted object as a pointer of type "+this.name),E.M.P.ca&&H("Cannot convert argument of type "+E.M.P.name+" to parameter type "+this.name),kt(E.M.O,E.M.P.N,this.N))}function zA(c,E,C,p){this.name=c,this.N=E,this.ea=C,this.ca=p,this.da=!1,this.W=this.xa=this.fa=this.ka=this.Ba=this.wa=void 0,E.R!==void 0?this.toWireType=Ei:(this.toWireType=p?Bi:Qi,this.V=null)}function fi(c,E){t.hasOwnProperty(c)||ze("Replacing nonexistant public symbol"),t[c]=E,t[c].Z=void 0}function Ci(c,E){var C=[];return function(){if(C.length=0,Object.assign(C,arguments),c.includes("j")){var p=t["dynCall_"+c];p=C&&C.length?p.apply(null,[E].concat(C)):p.call(null,E)}else p=b.get(E).apply(null,C);return p}}function kA(c,E){c=O(c);var C=c.includes("j")?Ci(c,E):b.get(E);return typeof C!="function"&&H("unknown function pointer with signature "+c+": "+E),C}var vn=void 0;function _e(c,E){function C(U){w[U]||gA[U]||(qe[U]?qe[U].forEach(C):(p.push(U),w[U]=!0))}var p=[],w={};throw E.forEach(C),new vn(c+": "+p.map(DA).join([", "]))}function Pt(c,E,C,p,w){var U=E.length;2>U&&H("argTypes array size mismatch! Must at least get return value and 'this' types!");var T=E[1]!==null&&C!==null,J=!1;for(C=1;C<E.length;++C)if(E[C]!==null&&E[C].V===void 0){J=!0;break}var Y=E[0].name!=="void",K=U-2,z=Array(K),iA=[],EA=[];return function(){if(arguments.length!==K&&H("function "+c+" called with "+arguments.length+" arguments, expected "+K+" args!"),EA.length=0,iA.length=T?2:1,iA[0]=w,T){var xA=E[1].toWireType(EA,this);iA[1]=xA}for(var dA=0;dA<K;++dA)z[dA]=E[dA+2].toWireType(EA,arguments[dA]),iA.push(z[dA]);if(dA=p.apply(null,iA),J)Ut(EA);else for(var NA=T?1:2;NA<E.length;NA++){var PA=NA===1?xA:z[NA-2];E[NA].V!==null&&E[NA].V(PA)}return xA=Y?E[0].fromWireType(dA):void 0,xA}}function Ht(c,E){for(var C=[],p=0;p<c;p++)C.push(y[E+4*p>>2]);return C}function Tt(c){4<c&&--lA[c].ga===0&&(lA[c]=void 0,uA.push(c))}function Jt(c){if(c===null)return"null";var E=typeof c;return E==="object"||E==="array"||E==="function"?c.toString():""+c}function di(c,E){switch(E){case 2:return function(C){return this.fromWireType(G[C>>2])};case 3:return function(C){return this.fromWireType(M[C>>3])};default:throw new TypeError("Unknown float type: "+c)}}function mi(c,E,C){switch(E){case 0:return C?function(p){return f[p]}:function(p){return h[p]};case 1:return C?function(p){return m[p>>1]}:function(p){return d[p>>1]};case 2:return C?function(p){return x[p>>2]}:function(p){return y[p>>2]};default:throw new TypeError("Unknown integer type: "+c)}}function hi(c,E){for(var C="",p=0;!(p>=E/2);++p){var w=m[c+2*p>>1];if(w==0)break;C+=String.fromCharCode(w)}return C}function pi(c,E,C){if(C===void 0&&(C=2147483647),2>C)return 0;C-=2;var p=E;C=C<2*c.length?C/2:c.length;for(var w=0;w<C;++w)m[E>>1]=c.charCodeAt(w),E+=2;return m[E>>1]=0,E-p}function yi(c){return 2*c.length}function bi(c,E){for(var C=0,p="";!(C>=E/4);){var w=x[c+4*C>>2];if(w==0)break;++C,65536<=w?(w-=65536,p+=String.fromCharCode(55296|w>>10,56320|w&1023)):p+=String.fromCharCode(w)}return p}function Di(c,E,C){if(C===void 0&&(C=2147483647),4>C)return 0;var p=E;C=p+C-4;for(var w=0;w<c.length;++w){var U=c.charCodeAt(w);if(55296<=U&&57343>=U){var T=c.charCodeAt(++w);U=65536+((U&1023)<<10)|T&1023}if(x[E>>2]=U,E+=4,E+4>C)break}return x[E>>2]=0,E-p}function wi(c){for(var E=0,C=0;C<c.length;++C){var p=c.charCodeAt(C);55296<=p&&57343>=p&&++C,E+=4}return E}var xi={};function Rn(c){var E=xi[c];return E===void 0?O(c):E}var je=[];function Mi(c){var E=je.length;return je.push(c),E}function Gi(c,E){for(var C=Array(c),p=0;p<c;++p)C[p]=bA(y[E+4*p>>2],"parameter "+p);return C}var Ln=[],Ni=[null,[],[]];tA=t.BindingError=yA("BindingError"),t.count_emval_handles=function(){for(var c=0,E=5;E<lA.length;++E)lA[E]!==void 0&&++c;return c},t.get_first_emval=function(){for(var c=5;c<lA.length;++c)if(lA[c]!==void 0)return lA[c];return null},sA=t.PureVirtualError=yA("PureVirtualError");for(var kn=Array(256),$e=0;256>$e;++$e)kn[$e]=String.fromCharCode($e);BA=kn,t.getInheritedInstanceCount=function(){return Object.keys(QA).length},t.getLiveInheritedInstances=function(){var c=[],E;for(E in QA)QA.hasOwnProperty(E)&&c.push(QA[E]);return c},t.flushPendingDeletes=aA,t.setDelayFunction=function(c){IA=c,oA.length&&IA&&IA(aA)},vA=t.InternalError=yA("InternalError"),ee.prototype.isAliasOf=function(c){if(!(this instanceof ee&&c instanceof ee))return!1;var E=this.M.P.N,C=this.M.O,p=c.M.P.N;for(c=c.M.O;E.R;)C=E.ba(C),E=E.R;for(;p.R;)c=p.ba(c),p=p.R;return E===p&&C===c},ee.prototype.clone=function(){if(this.M.O||Rt(this),this.M.aa)return this.M.count.value+=1,this;var c=ue,E=Object,C=E.create,p=Object.getPrototypeOf(this),w=this.M;return c=c(C.call(E,p,{M:{value:{count:w.count,$:w.$,aa:w.aa,O:w.O,P:w.P,T:w.T,U:w.U}}})),c.M.count.value+=1,c.M.$=!1,c},ee.prototype.delete=function(){this.M.O||Rt(this),this.M.$&&!this.M.aa&&H("Object already scheduled for deletion"),hA(this),SA(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||Rt(this),this.M.$&&!this.M.aa&&H("Object already scheduled for deletion"),oA.push(this),oA.length===1&&IA&&IA(aA),this.M.$=!0,this},zA.prototype.qa=function(c){return this.ka&&(c=this.ka(c)),c},zA.prototype.ha=function(c){this.W&&this.W(c)},zA.prototype.argPackAdvance=8,zA.prototype.readValueFromPointer=xe,zA.prototype.deleteObject=function(c){c!==null&&c.delete()},zA.prototype.fromWireType=function(c){function E(){return this.da?Xe(this.N.X,{P:this.wa,O:C,U:this,T:c}):Xe(this.N.X,{P:this,O:c})}var C=this.qa(c);if(!C)return this.ha(c),null;var p=St(this.N,C);if(p!==void 0)return p.M.count.value===0?(p.M.O=C,p.M.T=c,p.clone()):(p=p.clone(),this.ha(c),p);if(p=this.N.pa(C),p=LA[p],!p)return E.call(this);p=this.ca?p.la:p.pointerType;var w=UA(C,this.N,p.N);return w===null?E.call(this):this.da?Xe(p.N.X,{P:p,O:w,U:this,T:c}):Xe(p.N.X,{P:p,O:w})},vn=t.UnboundTypeError=yA("UnboundTypeError");var Fi=typeof atob=="function"?atob:function(c){var E="",C=0;c=c.replace(/[^A-Za-z0-9\+\/=]/g,"");do{var p="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=".indexOf(c.charAt(C++)),w="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=".indexOf(c.charAt(C++)),U="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=".indexOf(c.charAt(C++)),T="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=".indexOf(c.charAt(C++));p=p<<2|w>>4,w=(w&15)<<4|U>>2;var J=(U&3)<<6|T;E+=String.fromCharCode(p),U!==64&&(E+=String.fromCharCode(w)),T!==64&&(E+=String.fromCharCode(J))}while(C<c.length);return E},Si={l:function(c,E,C,p){X("Assertion failed: "+(c?B(h,c):"")+", at: "+[E?E?B(h,E):"":"unknown filename",C,p?p?B(h,p):"":"unknown function"])},q:function(c,E,C){c=O(c),E=bA(E,"wrapper"),C=rA(C);var p=[].slice,w=E.N,U=w.X,T=w.R.X,J=w.R.constructor;c=eA(c,function(){w.R.ja.forEach(function(K){if(this[K]===T[K])throw new sA("Pure virtual function "+K+" must be implemented in JavaScript")}.bind(this)),Object.defineProperty(this,"__parent",{value:U}),this.__construct.apply(this,p.call(arguments))}),U.__construct=function(){this===U&&H("Pass correct 'this' to __construct");var K=J.implement.apply(void 0,[this].concat(p.call(arguments)));hA(K);var z=K.M;K.notifyOnDestruction(),z.aa=!0,Object.defineProperties(this,{M:{value:z}}),ue(this),K=z.O,K=cA(w,K),QA.hasOwnProperty(K)?H("Tried to register registered instance: "+K):QA[K]=this},U.__destruct=function(){this===U&&H("Pass correct 'this' to __destruct"),hA(this);var K=this.M.O;K=cA(w,K),QA.hasOwnProperty(K)?delete QA[K]:H("Tried to unregister unregistered instance: "+K)},c.prototype=Object.create(U);for(var Y in C)c.prototype[Y]=C[Y];return j(c)},j:function(c){var E=Ze[c];delete Ze[c];var C=E.fa,p=E.W,w=E.ia,U=w.map(T=>T.ta).concat(w.map(T=>T.za));Ae([c],U,T=>{var J={};return w.forEach((Y,K)=>{var z=T[K],iA=Y.ra,EA=Y.sa,xA=T[K+w.length],dA=Y.ya,NA=Y.Aa;J[Y.oa]={read:PA=>z.fromWireType(iA(EA,PA)),write:(PA,Me)=>{var ZA=[];dA(NA,PA,xA.toWireType(ZA,Me)),Ut(ZA)}}}),[{name:E.name,fromWireType:function(Y){var K={},z;for(z in J)K[z]=J[z].read(Y);return p(Y),K},toWireType:function(Y,K){for(var z in J)if(!(z in K))throw new TypeError('Missing field: "'+z+'"');var iA=C();for(z in J)J[z].write(iA,K[z]);return Y!==null&&Y.push(p,iA),iA},argPackAdvance:8,readValueFromPointer:xe,V:p}]})},v:function(){},B:function(c,E,C,p,w){var U=vt(C);E=O(E),WA(c,{name:E,fromWireType:function(T){return!!T},toWireType:function(T,J){return J?p:w},argPackAdvance:8,readValueFromPointer:function(T){if(C===1)var J=f;else if(C===2)J=m;else if(C===4)J=x;else throw new TypeError("Unknown boolean type size: "+E);return this.fromWireType(J[T>>U])},V:null})},f:function(c,E,C,p,w,U,T,J,Y,K,z,iA,EA){z=O(z),U=kA(w,U),J&&(J=kA(T,J)),K&&(K=kA(Y,K)),EA=kA(iA,EA);var xA=mA(z);Ii(xA,function(){_e("Cannot construct "+z+" due to unbound types",[p])}),Ae([c,E,C],p?[p]:[],function(dA){if(dA=dA[0],p)var NA=dA.N,PA=NA.X;else PA=ee.prototype;dA=eA(xA,function(){if(Object.getPrototypeOf(this)!==Me)throw new tA("Use 'new' to construct "+z);if(ZA.Y===void 0)throw new tA(z+" has no accessible constructor");var Jn=ZA.Y[arguments.length];if(Jn===void 0)throw new tA("Tried to invoke ctor of "+z+" with invalid number of parameters ("+arguments.length+") - expected ("+Object.keys(ZA.Y).toString()+") parameters instead!");return Jn.apply(this,arguments)});var Me=Object.create(PA,{constructor:{value:dA}});dA.prototype=Me;var ZA=new ci(z,dA,Me,EA,NA,U,J,K);NA=new zA(z,ZA,!0,!1),PA=new zA(z+"*",ZA,!1,!1);var Tn=new zA(z+" const*",ZA,!1,!0);return LA[c]={pointerType:PA,la:Tn},fi(xA,dA),[NA,PA,Tn]})},d:function(c,E,C,p,w,U,T){var J=Ht(C,p);E=O(E),U=kA(w,U),Ae([],[c],function(Y){function K(){_e("Cannot call "+z+" due to unbound types",J)}Y=Y[0];var z=Y.name+"."+E;E.startsWith("@@")&&(E=Symbol[E.substring(2)]);var iA=Y.N.constructor;return iA[E]===void 0?(K.Z=C-1,iA[E]=K):(Lt(iA,E,z),iA[E].S[C-1]=K),Ae([],J,function(EA){return EA=Pt(z,[EA[0],null].concat(EA.slice(1)),null,U,T),iA[E].S===void 0?(EA.Z=C-1,iA[E]=EA):iA[E].S[C-1]=EA,[]}),[]})},p:function(c,E,C,p,w,U){0<E||X();var T=Ht(E,C);w=kA(p,w),Ae([],[c],function(J){J=J[0];var Y="constructor "+J.name;if(J.N.Y===void 0&&(J.N.Y=[]),J.N.Y[E-1]!==void 0)throw new tA("Cannot register multiple constructors with identical number of parameters ("+(E-1)+") for class '"+J.name+"'! Overload resolution is currently only performed using the parameter count, not actual type info!");return J.N.Y[E-1]=()=>{_e("Cannot construct "+J.name+" due to unbound types",T)},Ae([],T,function(K){return K.splice(1,0,null),J.N.Y[E-1]=Pt(Y,K,null,w,U),[]}),[]})},a:function(c,E,C,p,w,U,T,J){var Y=Ht(C,p);E=O(E),U=kA(w,U),Ae([],[c],function(K){function z(){_e("Cannot call "+iA+" due to unbound types",Y)}K=K[0];var iA=K.name+"."+E;E.startsWith("@@")&&(E=Symbol[E.substring(2)]),J&&K.N.ja.push(E);var EA=K.N.X,xA=EA[E];return xA===void 0||xA.S===void 0&&xA.className!==K.name&&xA.Z===C-2?(z.Z=C-2,z.className=K.name,EA[E]=z):(Lt(EA,E,iA),EA[E].S[C-2]=z),Ae([],Y,function(dA){return dA=Pt(iA,dA,K,U,T),EA[E].S===void 0?(dA.Z=C-2,EA[E]=dA):EA[E].S[C-2]=dA,[]}),[]})},A:function(c,E){E=O(E),WA(c,{name:E,fromWireType:function(C){var p=rA(C);return Tt(C),p},toWireType:function(C,p){return j(p)},argPackAdvance:8,readValueFromPointer:xe,V:null})},n:function(c,E,C){C=vt(C),E=O(E),WA(c,{name:E,fromWireType:function(p){return p},toWireType:function(p,w){return w},argPackAdvance:8,readValueFromPointer:di(E,C),V:null})},e:function(c,E,C,p,w){E=O(E),w===-1&&(w=4294967295),w=vt(C);var U=J=>J;if(p===0){var T=32-8*C;U=J=>J<<T>>>T}C=E.includes("unsigned")?function(J,Y){return Y>>>0}:function(J,Y){return Y},WA(c,{name:E,fromWireType:U,toWireType:C,argPackAdvance:8,readValueFromPointer:mi(E,w,p!==0),V:null})},b:function(c,E,C){function p(U){U>>=2;var T=y;return new w(Q,T[U+1],T[U])}var w=[Int8Array,Uint8Array,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array][E];C=O(C),WA(c,{name:C,fromWireType:p,argPackAdvance:8,readValueFromPointer:p},{ua:!0})},o:function(c,E){E=O(E);var C=E==="std::string";WA(c,{name:E,fromWireType:function(p){var w=y[p>>2],U=p+4;if(C)for(var T=U,J=0;J<=w;++J){var Y=U+J;if(J==w||h[Y]==0){if(T=T?B(h,T,Y-T):"",K===void 0)var K=T;else K+="\0",K+=T;T=Y+1}}else{for(K=Array(w),J=0;J<w;++J)K[J]=String.fromCharCode(h[U+J]);K=K.join("")}return XA(p),K},toWireType:function(p,w){w instanceof ArrayBuffer&&(w=new Uint8Array(w));var U,T=typeof w=="string";if(T||w instanceof Uint8Array||w instanceof Uint8ClampedArray||w instanceof Int8Array||H("Cannot pass non-string to std::string"),C&&T){var J=0;for(U=0;U<w.length;++U){var Y=w.charCodeAt(U);127>=Y?J++:2047>=Y?J+=2:55296<=Y&&57343>=Y?(J+=4,++U):J+=3}U=J}else U=w.length;if(J=Ot(4+U+1),Y=J+4,y[J>>2]=U,C&&T){if(T=Y,Y=U+1,U=h,0<Y){Y=T+Y-1;for(var K=0;K<w.length;++K){var z=w.charCodeAt(K);if(55296<=z&&57343>=z){var iA=w.charCodeAt(++K);z=65536+((z&1023)<<10)|iA&1023}if(127>=z){if(T>=Y)break;U[T++]=z}else{if(2047>=z){if(T+1>=Y)break;U[T++]=192|z>>6}else{if(65535>=z){if(T+2>=Y)break;U[T++]=224|z>>12}else{if(T+3>=Y)break;U[T++]=240|z>>18,U[T++]=128|z>>12&63}U[T++]=128|z>>6&63}U[T++]=128|z&63}}U[T]=0}}else if(T)for(T=0;T<U;++T)K=w.charCodeAt(T),255<K&&(XA(Y),H("String has UTF-16 code units that do not fit in 8 bits")),h[Y+T]=K;else for(T=0;T<U;++T)h[Y+T]=w[T];return p!==null&&p.push(XA,J),J},argPackAdvance:8,readValueFromPointer:xe,V:function(p){XA(p)}})},i:function(c,E,C){if(C=O(C),E===2)var p=hi,w=pi,U=yi,T=()=>d,J=1;else E===4&&(p=bi,w=Di,U=wi,T=()=>y,J=2);WA(c,{name:C,fromWireType:function(Y){for(var K=y[Y>>2],z=T(),iA,EA=Y+4,xA=0;xA<=K;++xA){var dA=Y+4+xA*E;(xA==K||z[dA>>J]==0)&&(EA=p(EA,dA-EA),iA===void 0?iA=EA:(iA+="\0",iA+=EA),EA=dA+E)}return XA(Y),iA},toWireType:function(Y,K){typeof K!="string"&&H("Cannot pass non-string to C++ string type "+C);var z=U(K),iA=Ot(4+z+E);return y[iA>>2]=z>>J,w(K,iA+4,z+E),Y!==null&&Y.push(XA,iA),iA},argPackAdvance:8,readValueFromPointer:xe,V:function(Y){XA(Y)}})},k:function(c,E,C,p,w,U){Ze[c]={name:O(E),fa:kA(C,p),W:kA(w,U),ia:[]}},h:function(c,E,C,p,w,U,T,J,Y,K){Ze[c].ia.push({oa:O(E),ta:C,ra:kA(p,w),sa:U,za:T,ya:kA(J,Y),Aa:K})},C:function(c,E){E=O(E),WA(c,{va:!0,name:E,argPackAdvance:0,fromWireType:function(){},toWireType:function(){}})},s:function(c,E,C,p,w){c=je[c],E=rA(E),C=Rn(C);var U=[];return y[p>>2]=j(U),c(E,C,U,w)},t:function(c,E,C,p){c=je[c],E=rA(E),C=Rn(C),c(E,C,null,p)},g:Tt,m:function(c,E){var C=Gi(c,E),p=C[0];E=p.name+"_$"+C.slice(1).map(function(T){return T.name}).join("_")+"$";var w=Ln[E];if(w!==void 0)return w;var U=Array(c-1);return w=Mi((T,J,Y,K)=>{for(var z=0,iA=0;iA<c-1;++iA)U[iA]=C[iA+1].readValueFromPointer(K+z),z+=C[iA+1].argPackAdvance;for(T=T[J].apply(T,U),iA=0;iA<c-1;++iA)C[iA+1].ma&&C[iA+1].ma(U[iA]);if(!p.va)return p.toWireType(Y,T)}),Ln[E]=w},D:function(c){4<c&&(lA[c].ga+=1)},r:function(c){var E=rA(c);Ut(E),Tt(c)},c:function(){X("")},x:function(c,E,C){h.copyWithin(c,E,E+C)},w:function(c){var E=h.length;if(c>>>=0,2147483648<c)return!1;for(var C=1;4>=C;C*=2){var p=E*(1+.2/C);p=Math.min(p,c+100663296);var w=Math;p=Math.max(c,p),w=w.min.call(w,2147483648,p+(65536-p%65536)%65536);A:{try{u.grow(w-Q.byteLength+65535>>>16),D();var U=1;break A}catch{}U=void 0}if(U)return!0}return!1},z:function(){return 52},u:function(){return 70},y:function(c,E,C,p){for(var w=0,U=0;U<C;U++){var T=y[E>>2],J=y[E+4>>2];E+=8;for(var Y=0;Y<J;Y++){var K=h[T+Y],z=Ni[c];K===0||K===10?((c===1?a:s)(B(z,0)),z.length=0):z.push(K)}w+=J}return y[p>>2]=w,0}};(function(){function c(w){t.asm=w.exports,u=t.asm.E,D(),b=t.asm.J,S.unshift(t.asm.F),P--,t.monitorRunDependencies&&t.monitorRunDependencies(P),P==0&&(V!==null&&(clearInterval(V),V=null),R&&(w=R,R=null,w()))}function E(w){c(w.instance)}function C(w){return W().then(function(U){return WebAssembly.instantiate(U,p)}).then(function(U){return U}).then(w,function(U){s("failed to asynchronously prepare wasm: "+U),X(U)})}var p={a:Si};if(P++,t.monitorRunDependencies&&t.monitorRunDependencies(P),t.instantiateWasm)try{return t.instantiateWasm(p,c)}catch(w){s("Module.instantiateWasm callback failed with error: "+w),r(w)}return(function(){return g||typeof WebAssembly.instantiateStreaming!="function"||_(AA)||typeof fetch!="function"?C(E):fetch(AA,{credentials:"same-origin"}).then(function(w){return WebAssembly.instantiateStreaming(w,p).then(E,function(U){return s("wasm streaming compile failed: "+U),s("falling back to ArrayBuffer instantiation"),C(E)})})})().catch(r),{}})(),t.___wasm_call_ctors=function(){return(t.___wasm_call_ctors=t.asm.F).apply(null,arguments)};var Pn=t.___getTypeName=function(){return(Pn=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 Ot=t._malloc=function(){return(Ot=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;R=function c(){At||Hn(),At||(R=c)};function Hn(){function c(){if(!At&&(At=!0,t.calledRun=!0,!I)){if(q(S),n(t),t.onRuntimeInitialized&&t.onRuntimeInitialized(),t.postRun)for(typeof t.postRun=="function"&&(t.postRun=[t.postRun]);t.postRun.length;){var E=t.postRun.shift();v.unshift(E)}q(v)}}if(!(0<P)){if(t.preRun)for(typeof t.preRun=="function"&&(t.preRun=[t.preRun]);t.preRun.length;)F();q(N),0<P||(t.setStatus?(t.setStatus("Running..."),setTimeout(function(){setTimeout(function(){t.setStatus("")},1),c()},1)):c())}}if(t.preInit)for(typeof t.preInit=="function"&&(t.preInit=[t.preInit]);0<t.preInit.length;)t.preInit.pop()();return Hn(),e.ready})})(),Kr=na;L();L();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})({}),Vr=(function(A){return A[A.BorderBox=0]="BorderBox",A[A.ContentBox=1]="ContentBox",A})({}),Yr=(function(A){return A[A.Width=0]="Width",A[A.Height=1]="Height",A})({}),Ye=(function(A){return A[A.Inherit=0]="Inherit",A[A.LTR=1]="LTR",A[A.RTL=2]="RTL",A})({}),yn=(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})({}),be=(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})({}),ra=(function(A){return A[A.WebFlexBasis=0]="WebFlexBasis",A})({}),Mt=(function(A){return A[A.Column=0]="Column",A[A.ColumnReverse=1]="ColumnReverse",A[A.Row=2]="Row",A[A.RowReverse=3]="RowReverse",A})({}),bn=(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})({}),we=(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})({}),Dn=(function(A){return A[A.Undefined=0]="Undefined",A[A.Exactly=1]="Exactly",A[A.AtMost=2]="AtMost",A})({}),Wr=(function(A){return A[A.Default=0]="Default",A[A.Text=1]="Text",A})({}),wn=(function(A){return A[A.Visible=0]="Visible",A[A.Hidden=1]="Hidden",A[A.Scroll=2]="Scroll",A})({}),xn=(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})({}),Mn=(function(A){return A[A.NoWrap=0]="NoWrap",A[A.Wrap=1]="Wrap",A[A.WrapReverse=2]="WrapReverse",A})({}),ia={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:Vr.BorderBox,BOX_SIZING_CONTENT_BOX:Vr.ContentBox,DIMENSION_WIDTH:Yr.Width,DIMENSION_HEIGHT:Yr.Height,DIRECTION_INHERIT:Ye.Inherit,DIRECTION_LTR:Ye.LTR,DIRECTION_RTL:Ye.RTL,DISPLAY_FLEX:yn.Flex,DISPLAY_NONE:yn.None,DISPLAY_CONTENTS:yn.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:be.None,ERRATA_STRETCH_FLEX_BASIS:be.StretchFlexBasis,ERRATA_ABSOLUTE_POSITION_WITHOUT_INSETS_EXCLUDES_PADDING:be.AbsolutePositionWithoutInsetsExcludesPadding,ERRATA_ABSOLUTE_PERCENT_AGAINST_INNER_SIZE:be.AbsolutePercentAgainstInnerSize,ERRATA_ALL:be.All,ERRATA_CLASSIC:be.Classic,EXPERIMENTAL_FEATURE_WEB_FLEX_BASIS:ra.WebFlexBasis,FLEX_DIRECTION_COLUMN:Mt.Column,FLEX_DIRECTION_COLUMN_REVERSE:Mt.ColumnReverse,FLEX_DIRECTION_ROW:Mt.Row,FLEX_DIRECTION_ROW_REVERSE:Mt.RowReverse,GUTTER_COLUMN:bn.Column,GUTTER_ROW:bn.Row,GUTTER_ALL:bn.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:we.Error,LOG_LEVEL_WARN:we.Warn,LOG_LEVEL_INFO:we.Info,LOG_LEVEL_DEBUG:we.Debug,LOG_LEVEL_VERBOSE:we.Verbose,LOG_LEVEL_FATAL:we.Fatal,MEASURE_MODE_UNDEFINED:Dn.Undefined,MEASURE_MODE_EXACTLY:Dn.Exactly,MEASURE_MODE_AT_MOST:Dn.AtMost,NODE_TYPE_DEFAULT:Wr.Default,NODE_TYPE_TEXT:Wr.Text,OVERFLOW_VISIBLE:wn.Visible,OVERFLOW_HIDDEN:wn.Hidden,OVERFLOW_SCROLL:wn.Scroll,POSITION_TYPE_STATIC:xn.Static,POSITION_TYPE_RELATIVE:xn.Relative,POSITION_TYPE_ABSOLUTE:xn.Absolute,UNIT_UNDEFINED:HA.Undefined,UNIT_POINT:HA.Point,UNIT_PERCENT:HA.Percent,UNIT_AUTO:HA.Auto,WRAP_NO_WRAP:Mn.NoWrap,WRAP_WRAP:Mn.Wrap,WRAP_WRAP_REVERSE:Mn.WrapReverse},zr=ia;function Gn(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(),u,I;if(l==="auto")u=HA.Auto,I=void 0;else if(typeof l=="object")u=l.unit,I=l.valueOf();else if(u=typeof l=="string"&&l.endsWith("%")?HA.Percent:HA.Point,I=parseFloat(l),l!==void 0&&!Number.isNaN(l)&&Number.isNaN(I))throw new Error(`Invalid value ${l} for ${r}`);if(!i[u])throw new Error(`Failed to execute "${r}": Unsupported unit '${l}'`);return I!==void 0?i[u].call(this,...s,I):i[u].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]:Ye.LTR;return r.call(this,i,o,a)}),{Config:A.Config,Node:A.Node,...zr}}async function Xr(){return Gn(await Kr())}var Gt=null;async function oa(){return Gt||(Gt=await Xr(),Gt)}function aa(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 sa(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 ga(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 le(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 la(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 ua(A){if(A.kind==="block")return"fill"}function Ia(A){let e=0;if(A.kind==="flex"||A.kind==="block"){let o=le(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=le(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 ca(A){return"children"in A&&A.children?A.children.filter(e=>!We(e)):[]}function Ba(A){return"children"in A&&A.children?A.children.filter(e=>We(e)):[]}function qr(A,e,t,n,r){let i=e,o=A.Node.create(),a=la(i),s=a!==null,g=[];if(We(i)){o.setPositionType(A.POSITION_TYPE_ABSOLUTE);let m=le(i.x),d=le(i.y);m!==void 0&&o.setPosition(A.EDGE_LEFT,m),d!==void 0&&o.setPosition(A.EDGE_TOP,d)}else o.setPositionType(A.POSITION_TYPE_RELATIVE);let u=le(i.grow);u!==void 0&&o.setFlexGrow(typeof u=="number"?u:parseFloat(u));let I=le(i.flexShrink);I!==void 0?o.setFlexShrink(typeof I=="number"?I:parseFloat(I)):o.setFlexShrink(r!==null?1:0),i.flexBasis!==void 0&&o.setFlexBasis(i.flexBasis),i.alignSelf!==void 0&&o.setAlignSelf(ga(A,i.alignSelf));let B=i.width??ua(i),Q=i.height,f=r==="row",h=r==="column";if(Zr(o,"width",B,t?.width,f),Zr(o,"height",Q,t?.height,h),s){let m=Ia(i);o.setFlexDirection(a==="row"?A.FLEX_DIRECTION_ROW:A.FLEX_DIRECTION_COLUMN),o.setJustifyContent(aa(A,m.justify)),o.setAlignItems(sa(A,m.align)),o.setFlexWrap(m.wrap?A.WRAP_WRAP:A.WRAP_NO_WRAP),m.padding>0&&o.setPadding(A.EDGE_ALL,m.padding),m.gap>0&&o.setGap(A.GUTTER_ALL,m.gap);let d=ca(i),x=Ba(i),y=[...d,...x];for(let G=0;G<y.length;G++){let M=qr(A,y[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((m,d,x,y)=>{let G;(d===1||d===2)&&(G=m);let M=n?.(i,G)??{width:0,height:0},D=M.width,b=M.height;return d===1&&(D=m),y===1&&(b=x),{width:D,height:b}});else{let m=n?.(i)??null;if(m){let d=i.aspectRatio!==void 0,x=i.dataType==="Caption",y=m.height>0?m.width/m.height:1;i.kind==="media"&&!x&&!d&&o.setAspectRatio(y);let G=B===void 0||B==="auto"||B==="fit",M=Q===void 0||Q==="auto"||Q==="fit";if(G&&M){let D=i.aspectRatio??(i.kind==="media"?y:void 0)??1;o.setMeasureFunc((b,N,S,v)=>{let F=m.width,P=m.height;if(N===1&&v===1)F=b,P=S;else if(N===1)F=b,P=D>0?Math.round(b/D):m.height;else if(v===1)P=S,F=D>0?Math.round(S*D):m.width;else if(N===2&&v===2){let V=Math.min(1,b/m.width,S/m.height);F=Math.round(m.width*V),P=Math.round(m.height*V)}else N===2?m.width>b&&(F=b,P=D>0?Math.round(b/D):m.height):v===2&&m.height>S&&(P=S,F=D>0?Math.round(S*D):m.width);return{width:F,height:P}})}else if(G){let D=i.aspectRatio??(i.kind==="media"?y:void 0);(D===void 0||D<=0)&&o.setWidth(m.width)}else if(M){let D=i.aspectRatio??(i.kind==="media"?y:void 0);(D===void 0||D<=0)&&o.setHeight(m.height)}}}return{yogaNode:o,layoutNode:i,children:g}}function Zr(A,e,t,n,r){if(t===void 0||t==="auto"||t==="fit")return;let i=le(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 _r(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 u of A.children)_r(u,o,a,n,r)}function jr(A){for(let e of A.children)jr(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=qr(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(),u=a.position==="absolute"||a.position===void 0&&(a.x!==void 0||a.y!==void 0),I=u?l.left:Number(a.x??0),B=u?l.top:Number(a.y??0);i[a.id]={x:Math.round(I*1e3)/1e3,y:Math.round(B*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)_r(Q,I,B,i,o);jr(g),s.free()}return{rects:i,sizes:o}}async function su(A){let e=await oa();return Ea(e,A)}L();L();var Qa=/-?(?:\d+\.?\d*|\.\d+)(?:e[-+]?\d+)?/gi,fa=/([MmLlHhVvCcSsQqTtAaZz])([^MmLlHhVvCcSsQqTtAaZz]*)/g;function $r(A){let e=[],t=[],n=0,r=0,i=0,o=0,a=0,s=0,g="",l=u=>{t.length>1&&e.push({pts:t,closed:u}),t=[]};for(let u of A.matchAll(fa)){let I=u[1],B=(u[2].match(Qa)??[]).map(Number),Q=I===I.toLowerCase(),f=I.toUpperCase(),h=0,m=y=>{let G=B.slice(h,h+y);return h+=y,G},d=y=>h+y<=B.length;if(f==="Z"){n=i,r=o,l(!0),t=[[n,r]],g=f;continue}let x=!0;for(;d(f==="H"||f==="V"?1:f==="A"?7:f==="C"?6:f==="S"||f==="Q"?4:2);){if(f==="M"){let[y,G]=m(2);n=Q?n+y:y,r=Q?r+G:G,x?(l(!1),i=n,o=r,t=[[n,r]]):t.push([n,r])}else if(f==="L"||f==="T"){let[y,G]=m(2),M=Q?n+y:y,D=Q?r+G:G;if(f==="T"){let b=g==="Q"||g==="T"?2*n-a:n,N=g==="Q"||g==="T"?2*r-s:r;Ai(t,n,r,b,N,M,D),a=b,s=N}else t.push([M,D]);n=M,r=D}else if(f==="H"){let[y]=m(1);n=Q?n+y:y,t.push([n,r])}else if(f==="V"){let[y]=m(1);r=Q?r+y:y,t.push([n,r])}else if(f==="C"||f==="S"){let y,G;if(f==="C"){let[V,R]=m(2);y=Q?n+V:V,G=Q?r+R:R}else y=g==="C"||g==="S"?2*n-a:n,G=g==="C"||g==="S"?2*r-s:r;let[M,D,b,N]=m(4),S=Q?n+M:M,v=Q?r+D:D,F=Q?n+b:b,P=Q?r+N:N;for(let V=1;V<=16;V++){let R=V/16,X=1-R;t.push([X*X*X*n+3*X*X*R*y+3*X*R*R*S+R*R*R*F,X*X*X*r+3*X*X*R*G+3*X*R*R*v+R*R*R*P])}a=S,s=v,n=F,r=P}else if(f==="Q"){let[y,G,M,D]=m(4),b=Q?n+y:y,N=Q?r+G:G,S=Q?n+M:M,v=Q?r+D:D;Ai(t,n,r,b,N,S,v),a=b,s=N,n=S,r=v}else if(f==="A"){let[y,G,M,D,b,N,S]=m(7),v=Q?n+N:N,F=Q?r+S:S;Ca(t,n,r,y,G,M,D!==0,b!==0,v,F),n=v,r=F}x=!1,g=f,f==="M"&&(g="L")}g=f}return l(!1),e}function Ai(A,e,t,n,r,i,o){for(let a=1;a<=16;a++){let s=a/16,g=1-s;A.push([g*g*e+2*g*s*n+s*s*i,g*g*t+2*g*s*r+s*s*o])}}function Ca(A,e,t,n,r,i,o,a,s,g){let l=Math.abs(n),u=Math.abs(r);if(l===0||u===0){A.push([s,g]);return}let I=i*Math.PI/180,B=Math.cos(I),Q=Math.sin(I),f=(e-s)/2,h=(t-g)/2,m=B*f+Q*h,d=-Q*f+B*h,x=m*m/(l*l)+d*d/(u*u);x>1&&(l*=Math.sqrt(x),u*=Math.sqrt(x));let y=l*l*u*u-l*l*d*d-u*u*m*m,G=l*l*d*d+u*u*m*m,M=Math.sqrt(Math.max(0,y/G));o===a&&(M=-M);let D=M*l*d/u,b=-M*u*m/l,N=B*D-Q*b+(e+s)/2,S=Q*D+B*b+(t+g)/2,v=(R,X,_,AA)=>Math.atan2(R*AA-X*_,R*_+X*AA),F=v(1,0,(m-D)/l,(d-b)/u),P=v((m-D)/l,(d-b)/u,(-m-D)/l,(-d-b)/u);!a&&P>0&&(P-=2*Math.PI),a&&P<0&&(P+=2*Math.PI);let V=Math.max(4,Math.ceil(Math.abs(P)/(Math.PI/2)*16));for(let R=1;R<=V;R++){let X=F+P*R/V,_=l*Math.cos(X),AA=u*Math.sin(X);A.push([B*_-Q*AA+N,Q*_+B*AA+S])}}function ei(A,e){let t=A.closed?[...A.pts,A.pts[0]]:A.pts,n=[0];for(let s=1;s<t.length;s++)n.push(n[s-1]+Math.hypot(t[s][0]-t[s-1][0],t[s][1]-t[s-1][1]));let r=n[n.length-1],i=[];if(r<=0){for(let s=0;s<e;s++)i.push([t[0][0],t[0][1]]);return i}let o=A.closed?e:e-1,a=0;for(let s=0;s<e;s++){let g=r*s/o;for(;a<n.length-2&&n[a+1]<g;)a++;let l=n[a+1]-n[a],u=l>0?(g-n[a])/l:0;i.push([t[a][0]+(t[a+1][0]-t[a][0])*u,t[a][1]+(t[a+1][1]-t[a][1])*u])}return i}function ti(A){let e=0;for(let t=0;t<A.length;t++){let n=A[(t+1)%A.length];e+=A[t][0]*n[1]-n[0]*A[t][1]}return e/2}function ni(A){let e=0,t=0;for(let n of A)e+=n[0],t+=n[1];return[e/A.length,t/A.length]}function da(A,e,t){if(!t){let s=Math.hypot(A[0][0]-e[0][0],A[0][1]-e[0][1]);return Math.hypot(A[0][0]-e[e.length-1][0],A[0][1]-e[e.length-1][1])<s?[...e].reverse():e}let n=Math.sign(ti(A))!==Math.sign(ti(e))?[...e].reverse():e,r=A.length,i=0,o=Number.POSITIVE_INFINITY,a=s=>{let g=0;for(let l=0;l<r;l+=2){let u=n[(l+s)%r];g+=(A[l][0]-u[0])**2+(A[l][1]-u[1])**2}return g};for(let s=0;s<r;s+=4){let g=a(s);g<o&&(o=g,i=s)}for(let s=i-3;s<=i+3;s++){let g=(s+r)%r,l=a(g);l<o&&(o=l,i=g)}return A.map((s,g)=>n[(g+i)%r])}var Nt=new Map;function ma(A,e){let t=`${A}\0${e}`,n=Nt.get(t);if(n)return n;let r=$r(A),i=$r(e),o=Math.max(r.length,i.length),a={a:[],b:[],closed:[]};for(let s=0;s<o;s++){let g=r[s],l=i[s],u=(g?.closed??!0)&&(l?.closed??!0),I=g?ei(g,128):void 0,B=l?ei(l,128):void 0;if(!I&&B){let Q=ni(B);I=B.map(()=>[Q[0],Q[1]])}if(!B&&I){let Q=ni(I);B=I.map(()=>[Q[0],Q[1]])}!I||!B||(a.a.push(I),a.b.push(da(I,B,u)),a.closed.push(u))}return Nt.size>256&&Nt.clear(),Nt.set(t,a),a}var ri=A=>(Math.round(A*100)/100).toString();function ii(A,e,t){if(t<=0)return A;if(t===1)return e;let n=ma(A,e),r=[];for(let i=0;i<n.a.length;i++){let o=n.a[i],a=n.b[i],s="";for(let g=0;g<o.length;g++){let l=o[g][0]+(a[g][0]-o[g][0])*t,u=o[g][1]+(a[g][1]-o[g][1])*t;s+=`${g===0?"M":"L"}${ri(l)} ${ri(u)}`}r.push(n.closed[i]?`${s}Z`:s)}return r.join("")}function oi(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 ha(A,e){let t=Math.floor(A),n=t+1,r=A-t,i=r*r*(3-2*r),o=oi(t,e),a=oi(n,e),s=o*r,g=a*(r-1);return(s*(1-i)+g*i)*2}function pa(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 I=0;I<i;I++){let B=ha(e*l,o+I*7919);a+=B*g,s+=g,g*=.5,l*=2}let u=s>0?a/s:0;return t+u*r}function ya(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),u=-1,I=-s*a/l;g=1+Math.exp(-s*a*e)*(u*Math.cos(l*e)+I*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),u=-a*(s-l),I=-a*(s+l),B=-1/(1-u/I),Q=-1-B;g=1+B*Math.exp(u*e)+Q*Math.exp(I*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=Xn.getChannelSamples(i,o);if(a&&a.length>0){let s=Number(n.fps)||24,g=t>0?t:24,l=e/g,u=Math.max(0,Math.min(a.length-1,Math.round(l*s)));return Number(a[u])||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 m=typeof n.bars=="number"&&n.bars>0?n.bars:1;o=n.bpm/60/m}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",u=!!n.fmEnabled,I=g;if(u){let m=Number(n.fmAmplitude)||1,d=Number(n.fmFrequency)||.5;I=g+Math.sin(g*d*Math.PI*2)*m}let B=0,Q=(I*o+a/(Math.PI*2))%1,f=Q<0?Q+1:Q,h=m=>(m%1+1)%1;switch(l){case"triangle":B=4*Math.abs(f-.5)-1;break;case"sawtooth":B=2*f-1;break;case"square":B=f<.5?1:-1;break;case"constant":B=1;break;case"noise_smooth":{let m=I*o+a,d=Math.floor(m),x=m-d,y=x*x*(3-2*x),G=h(Math.sin(d*12.9898)*43758.5453),M=h(Math.sin((d+1)*12.9898)*43758.5453);B=(G*(1-y)+M*y)*2-1;break}case"noise_white":B=h(Math.sin(I*12.9898+a)*43758.5453)*2-1;break;case"pulse":{let m=a===0?.5:Math.max(.01,Math.min(.99,a));B=h(I*o)<m?1:-1;break}case"bounce":B=Math.abs(Math.sin(I*o*Math.PI+a));break;case"staircase":B=Math.floor(f*8)/7*2-1;break;default:B=Math.sin(I*o*Math.PI*2+a);break}return B*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)),u=Math.max(1,Number(n.holdFrames)||4),I=0;if(a==="gate")I=RA(i,e,t)>=o?1:0;else if(a==="trigger"){let B=-1/0,Q=Math.max(0,e-300);for(let f=Q;f<=e;f++){let h=RA(i,f,t),m=f>0?RA(i,f-1,t):0;h>=o&&m<o&&f-B>=l&&(B=f)}I=e>=B&&e<B+u?1:0}else if(a==="toggle"){let B=0,Q=-1/0;for(let f=0;f<=e;f++){let h=RA(i,f,t),m=f>0?RA(i,f-1,t):0;h>=o&&m<o&&f-Q>=l&&(B++,Q=f)}I=B%2===1?1:0}return s?1-I:I}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,u=Number(n.outMax)||1,I=g-s,B=I!==0?(i-s)/I:0;return l+B*(u-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,u=l!==0?Math.max(0,Math.min(1,(i-s)/l)):0;return u*u*(3-2*u)}case"custom":return i;default:return i}}if(typeof n.value=="number")return n.value}return 0}function ba(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 Da(A,e,t,n={}){let r=n[A.inputHandleId];if(r===void 0&&n){let I=Object.keys(n);if(I.length===1)r=n[I[0]];else if(I.length>1){let B=I.find(Q=>Q===A.inputHandleId);r=B?n[B]:n[I[0]]}}if(A.channel&&r&&typeof r=="object"){let I=r[A.channel];I!==void 0?r=I:typeof r.get!="function"&&(r={...r,channel:A.channel})}if(A.signalMode==="accumulate"){let I=A.threshold??A.accumulateThreshold??.15,B=A.debounceFrames??2,Q=ba(r,e,t,I,B),f=A.multiplier??1,h=A.offset??0;return Q*f+h}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 I=l;I<=e;I++)s+=RA(r,I,t),g++;return(g>0?s/g:0)*i+o}function wa(A,e,t){return A+(e-A)*t}function xa(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 ai(A,e,t){return zn(A,e,t)}function Nn(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 Ma(A,e){let[t,n,r,i]=xa(A),o=t/255,a=n/255,s=r/255,g=Math.max(o,a,s),l=Math.min(o,a,s),u=0,I=0,B=(g+l)/2;if(g!==l){let d=g-l;switch(I=B>.5?d/(2-g-l):d/(g+l),g){case o:u=(a-s)/d+(a<s?6:0);break;case a:u=(s-o)/d+2;break;case s:u=(o-a)/d+4;break}u/=6}u=(u+e%1+1)%1;let Q=B,f=B,h=B;if(I!==0){let d=B<.5?B*(1+I):B+I-B*I,x=2*B-d;Q=Nn(x,d,u+1/3),f=Nn(x,d,u),h=Nn(x,d,u-1/3)}let m=d=>Math.round(Math.max(0,Math.min(255,d*255))).toString(16).padStart(2,"0");return i>=.999?`#${m(Q)}${m(f)}${m(h)}`:`rgba(${Math.round(Q*255)}, ${Math.round(f*255)}, ${Math.round(h*255)}, ${Math.round(i*100)/100})`}var Ga=new Set(["fill","fillColor","strokeColor","textBackgroundColor","color"]);function Fn(A,e,t){let n=A.keyframes??[];if(n.length===0)return 0;if(n.length===1||e<=n[0].frame)return n[0].value;if(e>=n[n.length-1].frame)return n[n.length-1].value;for(let r=0;r<n.length-1;r++){let i=n[r],o=n[r+1];if(e>=i.frame&&e<=o.frame){let a=o.frame-i.frame,s=a>0?(e-i.frame)/a:0,g=t?t(o.ease??i.ease,a,s):s;if(typeof i.value=="boolean")return s>=1?o.value:i.value;if(typeof i.value=="string"&&typeof o.value=="string")return A.prop==="d"?ii(i.value,o.value,g):ai(i.value,o.value,g);let l=Number(i.value)||0,u=Number(o.value)||0;return wa(l,u,g)}}return n[n.length-1].value}function Na(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 Fn(A,i);case"wiggle":{let s=typeof a=="number"?a:0,g=A.keyframes&&A.keyframes.length>0?Number(Fn(A,i))||0:s,l=i/(t>0?t:24);return pa(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 ya(o,l,s,g)}case"signal":{let s=Da(o,e,t,n.signals);if(Ga.has(A.prop)){let g=o,l=g.colorA??"#ffffff",u=g.colorB??"#ffffff",I=g.colorMode??"interpolate";if(I==="threshold"){let Q=g.colorThreshold??.5;return s>=Q?u:l}if(I==="hueRotate")return Ma(l,s);let B=Math.max(0,Math.min(1,s));return ai(l,u,B)}return s}default:return Fn(A,i)}}function Qu(A,e,t=24,n={}){let r={};if(!A?.tracks)return r;for(let i of A.tracks)r[i.prop]=Na(i,e,t,n);return r}L();var si=["x","y","width","height"];function Fa(A){let e=A.matte,{matte:t,...n}=A,r={...n};if(Array.isArray(r.children)&&(r.children=Ft(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(si.every(g=>i[g]===void 0))for(let g of si)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=Ft(a.children)),r.matteId=o,[r,a]}function Ft(A){return A.flatMap(e=>Fa(e))}L();function Sn(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 hu(A,e,t="forward",n=0){return!A||A.length===0?[]:e<=0&&n===0?[...A]:A.map((r,i)=>{let o=Sn(i,A.length,e,t),a=r.startFrame??0;return{...r,startFrame:a+o+n}})}L();L();var li=Symbol.for("framefields.inlineSignal"),gi=new WeakMap,Sa=0;function Ua(A){let e=gi.get(A);return e===void 0&&(e=`inline_signal_${Sa++}`,gi.set(A,e)),e}function bu(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:Ua(A),inline:A}}function Du(A,e){Object.defineProperty(A,li,{value:e,enumerable:!1,configurable:!0,writable:!0})}function va(A){if(!(!A||typeof A!="object"))return A[li]}function Un(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=va(a);s&&typeof a?.inputHandleId=="string"&&(e[a.inputHandleId]=s)}Array.isArray(r)&&Un(r,e)}return e}function ui(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=Vn(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,x=typeof d.toOperation=="function"?d.toOperation():d;g={metadata:{...g.metadata},operation:{op:"Crop",...x,dataType:g.operation.dataType},children:[g]}}if(g&&Array.isArray(A.effects))for(let d of A.effects){let x=typeof d.toOperation=="function"?d.toOperation():d;g={metadata:{...g.metadata},operation:{id:A.id?`${A.id}-${x.op??"effect"}`:void 0,effect:d,...x,dataType:g.operation.dataType},children:[g]}}if(g&&A.vision){let d=A.vision,x=typeof d.toOperation=="function"?d.toOperation():d;g={metadata:{...g.metadata},operation:{op:"Vision",id:A.id,effect:d,...x,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,x="staggerDirection"in A&&typeof A.staggerDirection=="string"?A.staggerDirection:"forward",y=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,D)=>{let b=Sn(D,A.children.length,d,x),N=n+y+b;return ui(M,e,t,N,r,M.durationFrames===void 0?G:void 0)})}let l="Image",u;if(g){l=g.operation?.dataType??"Image";let x=l==="Image"||l==="SVG"?void 0:Yn(g)?.durationMs;x!=null&&(u=Math.max(1,Math.round(x/1e3*t)))}let I=g?.operation?.dataType==="Caption",B=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,f=typeof A.durationFrames=="number"&&Number.isFinite(A.durationFrames)&&A.durationFrames>0?Math.round(A.durationFrames):void 0,h=i??Math.round((r??1e4)/1e3*t);if(B&&o.length>0){if(f===void 0){let d=o.map(x=>(x.operation?.startFrame??0)+(x.operation?.durationFrames??h));f=Math.max(1,Math.max(...d)-Q)}}else I&&u!==void 0&&u>0?f=u:f!==void 0?(l==="Video"||l==="Audio")&&u!==void 0&&u>0&&(f=Math.min(f,u)):f=u??i??Math.round((r??1e4)/1e3*t);let m=f/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=m),d.operation?.sourceMeta&&!d.operation.sourceMeta.durationMs&&(d.operation.sourceMeta.durationMs=m),d=d.children?.[0]}return{metadata:{durationMs:m},operation:{op:"CompositorLayer",...A,startFrame:Q,durationFrames:f,dataType:l},children:o}}function Su(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:{...Un(A.layout),...o??A.signals??{}},...(A.onRequestFrame||e.onRequestFrame)&&{onRequestFrame:A.onRequestFrame??e.onRequestFrame}},children:Ft(A.layout).map(l=>ui(l,i,n,0,r))},s=Array.isArray(e.effects)?e.effects:Array.isArray(A.effects)?A.effects:[];for(let l of s){let u=typeof l.toOperation=="function"?l.toOperation():l;a={metadata:{...a.metadata},operation:{...u,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 Uu(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,Ar as b,k as c,$ as d,ce as e,vi as f,ir as g,it as h,Yt as i,Vt as j,qA as k,ns as l,rs as m,Fe as n,us as o,Se as p,Ir as q,Us as r,at as s,ct as t,Pr as u,Ll as v,Tl as w,br as x,Dr as y,wr as z,yl as A,xr as B,Mr as C,ho as D,xl as E,pn as F,Yl as G,oa as H,Ea as I,su as J,bu as K,Du as L,Fn as M,Na as N,Qu as O,Ft as P,Sn as Q,hu as R,Su as S,Uu as T};