@zephyr3d/scene 0.9.26 → 0.10.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 (506) hide show
  1. package/README.md +60 -27
  2. package/dist/animation/animation_bank.js +634 -0
  3. package/dist/animation/animation_bank.js.map +1 -0
  4. package/dist/animation/animation_bank_gpu.js +256 -0
  5. package/dist/animation/animation_bank_gpu.js.map +1 -0
  6. package/dist/animation/animationset.js +146 -30
  7. package/dist/animation/animationset.js.map +1 -1
  8. package/dist/animation/cloth/gpu_cloth_component.js +406 -0
  9. package/dist/animation/cloth/gpu_cloth_component.js.map +1 -0
  10. package/dist/animation/cloth/gpu_cloth_system.js +332 -202
  11. package/dist/animation/cloth/gpu_cloth_system.js.map +1 -1
  12. package/dist/animation/gpu_animation_driver.js +289 -0
  13. package/dist/animation/gpu_animation_driver.js.map +1 -0
  14. package/dist/animation/joint_dynamics/collision.js +112 -1
  15. package/dist/animation/joint_dynamics/collision.js.map +1 -1
  16. package/dist/animation/joint_dynamics/controller.js +6 -0
  17. package/dist/animation/joint_dynamics/controller.js.map +1 -1
  18. package/dist/animation/joint_dynamics/joint_dynamics_system.js +11 -0
  19. package/dist/animation/joint_dynamics/joint_dynamics_system.js.map +1 -1
  20. package/dist/animation/joint_dynamics/solver.js +50 -12
  21. package/dist/animation/joint_dynamics/solver.js.map +1 -1
  22. package/dist/animation/joint_dynamics/types.js.map +1 -1
  23. package/dist/animation/skeleton.js +300 -56
  24. package/dist/animation/skeleton.js.map +1 -1
  25. package/dist/animation/skin_palette_atlas.js +252 -0
  26. package/dist/animation/skin_palette_atlas.js.map +1 -0
  27. package/dist/animation/spring/multi_chain_spring_system.js +298 -38
  28. package/dist/animation/spring/multi_chain_spring_system.js.map +1 -1
  29. package/dist/animation/spring/spring_chain.js +2 -0
  30. package/dist/animation/spring/spring_chain.js.map +1 -1
  31. package/dist/animation/spring/spring_collider.js +159 -21
  32. package/dist/animation/spring/spring_collider.js.map +1 -1
  33. package/dist/animation/spring/spring_particle.js +1 -0
  34. package/dist/animation/spring/spring_particle.js.map +1 -1
  35. package/dist/animation/spring/spring_solver.js +173 -0
  36. package/dist/animation/spring/spring_solver.js.map +1 -0
  37. package/dist/animation/spring/spring_system.js +249 -24
  38. package/dist/animation/spring/spring_system.js.map +1 -1
  39. package/dist/animation/spring_modifier.js +32 -1
  40. package/dist/animation/spring_modifier.js.map +1 -1
  41. package/dist/app/app.js +26 -0
  42. package/dist/app/app.js.map +1 -1
  43. package/dist/app/engine.js +86 -15
  44. package/dist/app/engine.js.map +1 -1
  45. package/dist/app/gamepad.js +191 -0
  46. package/dist/app/gamepad.js.map +1 -0
  47. package/dist/app/inputactions.js +271 -0
  48. package/dist/app/inputactions.js.map +1 -0
  49. package/dist/app/inputmgr.js +331 -22
  50. package/dist/app/inputmgr.js.map +1 -1
  51. package/dist/app/loading.js +138 -0
  52. package/dist/app/loading.js.map +1 -0
  53. package/dist/app/pipelinecache.js +209 -0
  54. package/dist/app/pipelinecache.js.map +1 -0
  55. package/dist/app/runtimescript.js +25 -0
  56. package/dist/app/runtimescript.js.map +1 -1
  57. package/dist/app/scriptingsystem.js +54 -0
  58. package/dist/app/scriptingsystem.js.map +1 -1
  59. package/dist/app/scriptregistry.js +7 -2
  60. package/dist/app/scriptregistry.js.map +1 -1
  61. package/dist/asset/asset_manifest.js +59 -0
  62. package/dist/asset/asset_manifest.js.map +1 -0
  63. package/dist/asset/asset_preload.js +258 -0
  64. package/dist/asset/asset_preload.js.map +1 -0
  65. package/dist/asset/assetmanager.js +117 -65
  66. package/dist/asset/assetmanager.js.map +1 -1
  67. package/dist/asset/loaders/ktx2/basis/LICENSE +201 -0
  68. package/dist/asset/loaders/ktx2/basis/basis_transcoder.js +2 -0
  69. package/dist/asset/loaders/ktx2/basis/basis_transcoder.wasm +0 -0
  70. package/dist/asset/loaders/ktx2/basis_location.js +17 -0
  71. package/dist/asset/loaders/ktx2/basis_location.js.map +1 -0
  72. package/dist/asset/loaders/ktx2/ktx2_loader.js +88 -0
  73. package/dist/asset/loaders/ktx2/ktx2_loader.js.map +1 -0
  74. package/dist/asset/loaders/ktx2/ktx2_targets.js +118 -0
  75. package/dist/asset/loaders/ktx2/ktx2_targets.js.map +1 -0
  76. package/dist/asset/loaders/ktx2/transcoder_pool.js +259 -0
  77. package/dist/asset/loaders/ktx2/transcoder_pool.js.map +1 -0
  78. package/dist/asset/mesh_lod_builder.js +104 -0
  79. package/dist/asset/mesh_lod_builder.js.map +1 -0
  80. package/dist/asset/mesh_settings.js +111 -0
  81. package/dist/asset/mesh_settings.js.map +1 -0
  82. package/dist/asset/meshopt_decoder.js +18 -0
  83. package/dist/asset/meshopt_decoder.js.map +1 -0
  84. package/dist/asset/meshopt_simplifier.js +26 -0
  85. package/dist/asset/meshopt_simplifier.js.map +1 -0
  86. package/dist/asset/model.js +177 -3
  87. package/dist/asset/model.js.map +1 -1
  88. package/dist/asset/texture_settings.js +231 -0
  89. package/dist/asset/texture_settings.js.map +1 -0
  90. package/dist/asset/zmsh_binary.js +131 -0
  91. package/dist/asset/zmsh_binary.js.map +1 -0
  92. package/dist/asset/zsdf_binary.js +111 -0
  93. package/dist/asset/zsdf_binary.js.map +1 -0
  94. package/dist/blitter/bilateralblur.js +1 -2
  95. package/dist/blitter/bilateralblur.js.map +1 -1
  96. package/dist/blitter/gaussianblur.js +1 -6
  97. package/dist/blitter/gaussianblur.js.map +1 -1
  98. package/dist/camera/base.js +31 -10
  99. package/dist/camera/base.js.map +1 -1
  100. package/dist/camera/camera.js +178 -200
  101. package/dist/camera/camera.js.map +1 -1
  102. package/dist/camera/follow.js +342 -0
  103. package/dist/camera/follow.js.map +1 -0
  104. package/dist/camera/fps.js +9 -7
  105. package/dist/camera/fps.js.map +1 -1
  106. package/dist/camera/orbit.js +46 -19
  107. package/dist/camera/orbit.js.map +1 -1
  108. package/dist/index.d.ts +30475 -19865
  109. package/dist/index.js +67 -12
  110. package/dist/index.js.map +1 -1
  111. package/dist/material/blinn.js +3 -0
  112. package/dist/material/blinn.js.map +1 -1
  113. package/dist/material/eye.js +1 -1
  114. package/dist/material/eye.js.map +1 -1
  115. package/dist/material/hair.js +2 -3
  116. package/dist/material/hair.js.map +1 -1
  117. package/dist/material/hairstrand.js +235 -235
  118. package/dist/material/hairstrand.js.map +1 -1
  119. package/dist/material/lambert.js +4 -1
  120. package/dist/material/lambert.js.map +1 -1
  121. package/dist/material/material.js +362 -300
  122. package/dist/material/material.js.map +1 -1
  123. package/dist/material/meshmaterial.js +118 -45
  124. package/dist/material/meshmaterial.js.map +1 -1
  125. package/dist/material/mixins/lightmodel/blinnphong.js +1 -1
  126. package/dist/material/mixins/lightmodel/blinnphong.js.map +1 -1
  127. package/dist/material/mixins/lightmodel/lambert.js +1 -1
  128. package/dist/material/mixins/lightmodel/lambert.js.map +1 -1
  129. package/dist/material/mixins/lightmodel/pbrblueprintmixin.js +34 -61
  130. package/dist/material/mixins/lightmodel/pbrblueprintmixin.js.map +1 -1
  131. package/dist/material/mixins/lightmodel/pbrmetallicroughness.js +16 -2
  132. package/dist/material/mixins/lightmodel/pbrmetallicroughness.js.map +1 -1
  133. package/dist/material/mixins/lightmodel/pbrspecularglossness.js +2 -1
  134. package/dist/material/mixins/lightmodel/pbrspecularglossness.js.map +1 -1
  135. package/dist/material/mixins/lit.js +223 -83
  136. package/dist/material/mixins/lit.js.map +1 -1
  137. package/dist/material/mixins/pbr/common.js +31 -206
  138. package/dist/material/mixins/pbr/common.js.map +1 -1
  139. package/dist/material/mtoon.js +1 -1
  140. package/dist/material/mtoon.js.map +1 -1
  141. package/dist/material/pbrmr.js +3 -0
  142. package/dist/material/pbrmr.js.map +1 -1
  143. package/dist/material/pbrsg.js +3 -0
  144. package/dist/material/pbrsg.js.map +1 -1
  145. package/dist/material/sdf_debug.js +78 -0
  146. package/dist/material/sdf_debug.js.map +1 -0
  147. package/dist/material/shader/helper.js +733 -190
  148. package/dist/material/shader/helper.js.map +1 -1
  149. package/dist/material/shader/terrain_blend.js +204 -43
  150. package/dist/material/shader/terrain_blend.js.map +1 -1
  151. package/dist/material/skin.js +331 -297
  152. package/dist/material/skin.js.map +1 -1
  153. package/dist/material/skinprofile.js +1058 -0
  154. package/dist/material/skinprofile.js.map +1 -0
  155. package/dist/material/sss.js +353 -0
  156. package/dist/material/sss.js.map +1 -0
  157. package/dist/material/sss_kernel.js +265 -0
  158. package/dist/material/sss_kernel.js.map +1 -0
  159. package/dist/material/sssprofile.js +879 -0
  160. package/dist/material/sssprofile.js.map +1 -0
  161. package/dist/material/subsurfaceprofile.js +4 -8
  162. package/dist/material/subsurfaceprofile.js.map +1 -1
  163. package/dist/material/terrain-cm.js +464 -188
  164. package/dist/material/terrain-cm.js.map +1 -1
  165. package/dist/material/unlit.js +3 -0
  166. package/dist/material/unlit.js.map +1 -1
  167. package/dist/material/water.js +2009 -201
  168. package/dist/material/water.js.map +1 -1
  169. package/dist/node_modules/meshoptimizer/LICENSE +21 -0
  170. package/dist/node_modules/meshoptimizer/meshopt_decoder.js +197 -0
  171. package/dist/node_modules/meshoptimizer/meshopt_decoder.js.map +1 -0
  172. package/dist/node_modules/meshoptimizer/meshopt_simplifier.js +677 -0
  173. package/dist/node_modules/meshoptimizer/meshopt_simplifier.js.map +1 -0
  174. package/dist/physics/character.js +226 -0
  175. package/dist/physics/character.js.map +1 -0
  176. package/dist/physics/collider.js +209 -0
  177. package/dist/physics/collider.js.map +1 -0
  178. package/dist/physics/events.js +79 -0
  179. package/dist/physics/events.js.map +1 -0
  180. package/dist/physics/joint.js +272 -0
  181. package/dist/physics/joint.js.map +1 -0
  182. package/dist/physics/node_physics.js +234 -0
  183. package/dist/physics/node_physics.js.map +1 -0
  184. package/dist/physics/part.js +91 -0
  185. package/dist/physics/part.js.map +1 -0
  186. package/dist/physics/rigid_body.js +379 -0
  187. package/dist/physics/rigid_body.js.map +1 -0
  188. package/dist/physics/vehicle.js +335 -0
  189. package/dist/physics/vehicle.js.map +1 -0
  190. package/dist/physics/world.js +25 -0
  191. package/dist/physics/world.js.map +1 -0
  192. package/dist/posteffect/bloom.js +49 -14
  193. package/dist/posteffect/bloom.js.map +1 -1
  194. package/dist/posteffect/motionblur.js +668 -63
  195. package/dist/posteffect/motionblur.js.map +1 -1
  196. package/dist/posteffect/posteffect.js +12 -1
  197. package/dist/posteffect/posteffect.js.map +1 -1
  198. package/dist/posteffect/postsss.js +572 -0
  199. package/dist/posteffect/postsss.js.map +1 -0
  200. package/dist/posteffect/sao.js +48 -50
  201. package/dist/posteffect/sao.js.map +1 -1
  202. package/dist/posteffect/skinsss.js +605 -355
  203. package/dist/posteffect/skinsss.js.map +1 -1
  204. package/dist/posteffect/ssgi.js +91 -162
  205. package/dist/posteffect/ssgi.js.map +1 -1
  206. package/dist/posteffect/ssr.js +3 -11
  207. package/dist/posteffect/ssr.js.map +1 -1
  208. package/dist/posteffect/sss.js +34 -15
  209. package/dist/posteffect/sss.js.map +1 -1
  210. package/dist/posteffect/taa.js +1 -0
  211. package/dist/posteffect/taa.js.map +1 -1
  212. package/dist/render/abuffer_oit.js +40 -39
  213. package/dist/render/abuffer_oit.js.map +1 -1
  214. package/dist/render/clipmap.js +328 -62
  215. package/dist/render/clipmap.js.map +1 -1
  216. package/dist/render/cluster_light.js +958 -224
  217. package/dist/render/cluster_light.js.map +1 -1
  218. package/dist/render/cull_visitor.js +26 -5
  219. package/dist/render/cull_visitor.js.map +1 -1
  220. package/dist/render/debug_views.js +37 -0
  221. package/dist/render/debug_views.js.map +1 -0
  222. package/dist/render/depthpass.js +5 -1
  223. package/dist/render/depthpass.js.map +1 -1
  224. package/dist/render/drawable_mixin.js +53 -6
  225. package/dist/render/drawable_mixin.js.map +1 -1
  226. package/dist/render/dualdepthpeeling_oit.js +53 -53
  227. package/dist/render/dualdepthpeeling_oit.js.map +1 -1
  228. package/dist/render/envlight.js +196 -113
  229. package/dist/render/envlight.js.map +1 -1
  230. package/dist/render/fbm_wavegenerator.js +8 -13
  231. package/dist/render/fbm_wavegenerator.js.map +1 -1
  232. package/dist/render/fft_wavegenerator.js +268 -136
  233. package/dist/render/fft_wavegenerator.js.map +1 -1
  234. package/dist/render/gerstner_wavegenerator.js +113 -28
  235. package/dist/render/gerstner_wavegenerator.js.map +1 -1
  236. package/dist/render/gi/probe_volume.js +1334 -0
  237. package/dist/render/gi/probe_volume.js.map +1 -0
  238. package/dist/render/gi/scene_gi.js +282 -0
  239. package/dist/render/gi/scene_gi.js.map +1 -0
  240. package/dist/render/gi/voxel_atlas.js +198 -0
  241. package/dist/render/gi/voxel_atlas.js.map +1 -0
  242. package/dist/render/gi/voxel_lighting.js +652 -0
  243. package/dist/render/gi/voxel_lighting.js.map +1 -0
  244. package/dist/render/gi/voxel_scene.js +642 -0
  245. package/dist/render/gi/voxel_scene.js.map +1 -0
  246. package/dist/render/gi/voxelize_pass.js +223 -0
  247. package/dist/render/gi/voxelize_pass.js.map +1 -0
  248. package/dist/render/globalbindgroup_allocator.js +3 -2
  249. package/dist/render/globalbindgroup_allocator.js.map +1 -1
  250. package/dist/render/gpu_picking.js +9 -36
  251. package/dist/render/gpu_picking.js.map +1 -1
  252. package/dist/render/hzb.js +80 -22
  253. package/dist/render/hzb.js.map +1 -1
  254. package/dist/render/instance_culling.js +499 -0
  255. package/dist/render/instance_culling.js.map +1 -0
  256. package/dist/render/lightpass.js +23 -9
  257. package/dist/render/lightpass.js.map +1 -1
  258. package/dist/render/lod.js +46 -0
  259. package/dist/render/lod.js.map +1 -0
  260. package/dist/render/oit.js +11 -11
  261. package/dist/render/oit.js.map +1 -1
  262. package/dist/render/primitive.js +301 -9
  263. package/dist/render/primitive.js.map +1 -1
  264. package/dist/render/primitive_readback.js +209 -0
  265. package/dist/render/primitive_readback.js.map +1 -0
  266. package/dist/render/render_queue.js +198 -11
  267. package/dist/render/render_queue.js.map +1 -1
  268. package/dist/render/renderer.js +14 -7
  269. package/dist/render/renderer.js.map +1 -1
  270. package/dist/render/rendergraph/blackboard.js +15 -1
  271. package/dist/render/rendergraph/blackboard.js.map +1 -1
  272. package/dist/render/rendergraph/executor.js +136 -0
  273. package/dist/render/rendergraph/executor.js.map +1 -1
  274. package/dist/render/rendergraph/forward_plus_builder.js +585 -59
  275. package/dist/render/rendergraph/forward_plus_builder.js.map +1 -1
  276. package/dist/render/rendergraph/frame_resource_requirements.js +1 -0
  277. package/dist/render/rendergraph/frame_resource_requirements.js.map +1 -1
  278. package/dist/render/rendergraph/history_resources.js +8 -1
  279. package/dist/render/rendergraph/history_resources.js.map +1 -1
  280. package/dist/render/rendergraph/scene_render_context.js +31 -2
  281. package/dist/render/rendergraph/scene_render_context.js.map +1 -1
  282. package/dist/render/rendergraph/types.js.map +1 -1
  283. package/dist/render/renderpass.js +28 -5
  284. package/dist/render/renderpass.js.map +1 -1
  285. package/dist/render/sdf/box_allocator.js +98 -0
  286. package/dist/render/sdf/box_allocator.js.map +1 -0
  287. package/dist/render/sdf/global_sdf.js +865 -0
  288. package/dist/render/sdf/global_sdf.js.map +1 -0
  289. package/dist/render/sdf/scene_sdf.js +562 -0
  290. package/dist/render/sdf/scene_sdf.js.map +1 -0
  291. package/dist/render/sdf/sdf_atlas.js +227 -0
  292. package/dist/render/sdf/sdf_atlas.js.map +1 -0
  293. package/dist/render/sdf/sdf_programs.js +42 -0
  294. package/dist/render/sdf/sdf_programs.js.map +1 -0
  295. package/dist/render/sdf/sdf_view.js +199 -0
  296. package/dist/render/sdf/sdf_view.js.map +1 -0
  297. package/dist/render/sdf/waterline.js +610 -0
  298. package/dist/render/sdf/waterline.js.map +1 -0
  299. package/dist/render/shadow_mask_pass.js +142 -25
  300. package/dist/render/shadow_mask_pass.js.map +1 -1
  301. package/dist/render/shore_wave_generator.js +1193 -0
  302. package/dist/render/shore_wave_generator.js.map +1 -0
  303. package/dist/render/sky.js +516 -86
  304. package/dist/render/sky.js.map +1 -1
  305. package/dist/render/transmission_thickness_pass.js +477 -0
  306. package/dist/render/transmission_thickness_pass.js.map +1 -0
  307. package/dist/render/underwater.js +524 -0
  308. package/dist/render/underwater.js.map +1 -0
  309. package/dist/render/virtualtexture/virtual_texture.js +1214 -0
  310. package/dist/render/virtualtexture/virtual_texture.js.map +1 -0
  311. package/dist/render/volumetric_cloud/cloud_common.js +472 -0
  312. package/dist/render/volumetric_cloud/cloud_common.js.map +1 -0
  313. package/dist/render/volumetric_cloud/cloud_noise.js +189 -0
  314. package/dist/render/volumetric_cloud/cloud_noise.js.map +1 -0
  315. package/dist/render/volumetric_cloud/debug_view.js +131 -0
  316. package/dist/render/volumetric_cloud/debug_view.js.map +1 -0
  317. package/dist/render/volumetric_cloud/resources.js +380 -0
  318. package/dist/render/volumetric_cloud/resources.js.map +1 -0
  319. package/dist/render/volumetric_cloud/sky_cache.js +380 -0
  320. package/dist/render/volumetric_cloud/sky_cache.js.map +1 -0
  321. package/dist/render/volumetric_cloud/volumetric_cloud.js +318 -0
  322. package/dist/render/volumetric_cloud/volumetric_cloud.js.map +1 -0
  323. package/dist/render/water_caustics.js +1195 -0
  324. package/dist/render/water_caustics.js.map +1 -0
  325. package/dist/render/water_foam.js +627 -0
  326. package/dist/render/water_foam.js.map +1 -0
  327. package/dist/render/water_interaction.js +1795 -0
  328. package/dist/render/water_interaction.js.map +1 -0
  329. package/dist/render/weightedblended_oit.js +36 -36
  330. package/dist/render/weightedblended_oit.js.map +1 -1
  331. package/dist/scene/basesprite.js +9 -4
  332. package/dist/scene/basesprite.js.map +1 -1
  333. package/dist/scene/batchgroup.js +108 -12
  334. package/dist/scene/batchgroup.js.map +1 -1
  335. package/dist/scene/environment.js +28 -7
  336. package/dist/scene/environment.js.map +1 -1
  337. package/dist/scene/foliage.js +1020 -0
  338. package/dist/scene/foliage.js.map +1 -0
  339. package/dist/scene/foliage_buckets.js +147 -0
  340. package/dist/scene/foliage_buckets.js.map +1 -0
  341. package/dist/scene/foliage_mask.js +358 -0
  342. package/dist/scene/foliage_mask.js.map +1 -0
  343. package/dist/scene/hair.js +15 -4
  344. package/dist/scene/hair.js.map +1 -1
  345. package/dist/scene/light.js +179 -13
  346. package/dist/scene/light.js.map +1 -1
  347. package/dist/scene/mesh.js +327 -45
  348. package/dist/scene/mesh.js.map +1 -1
  349. package/dist/scene/meshdrawable.js +6 -0
  350. package/dist/scene/meshdrawable.js.map +1 -1
  351. package/dist/scene/msdftext.js +9 -3
  352. package/dist/scene/msdftext.js.map +1 -1
  353. package/dist/scene/msdftextsprite.js +9 -3
  354. package/dist/scene/msdftextsprite.js.map +1 -1
  355. package/dist/scene/particlesys.js +8 -2
  356. package/dist/scene/particlesys.js.map +1 -1
  357. package/dist/scene/physics_settings.js +157 -0
  358. package/dist/scene/physics_settings.js.map +1 -0
  359. package/dist/scene/scene.js +190 -44
  360. package/dist/scene/scene.js.map +1 -1
  361. package/dist/scene/scene_node.js +147 -6
  362. package/dist/scene/scene_node.js.map +1 -1
  363. package/dist/scene/terrain-cm/bladegrassmaterial.js +735 -0
  364. package/dist/scene/terrain-cm/bladegrassmaterial.js.map +1 -0
  365. package/dist/scene/terrain-cm/grass.js +881 -42
  366. package/dist/scene/terrain-cm/grass.js.map +1 -1
  367. package/dist/scene/terrain-cm/grass_gpu.js +929 -0
  368. package/dist/scene/terrain-cm/grass_gpu.js.map +1 -0
  369. package/dist/scene/terrain-cm/grassmaterial.js +180 -9
  370. package/dist/scene/terrain-cm/grassmaterial.js.map +1 -1
  371. package/dist/scene/terrain-cm/terrain-cm.js +465 -36
  372. package/dist/scene/terrain-cm/terrain-cm.js.map +1 -1
  373. package/dist/scene/terrain-cm/terrain_gi_albedo.js +257 -0
  374. package/dist/scene/terrain-cm/terrain_gi_albedo.js.map +1 -0
  375. package/dist/scene/terrain-cm/terrain_rvt.js +395 -0
  376. package/dist/scene/terrain-cm/terrain_rvt.js.map +1 -0
  377. package/dist/scene/update_queue.js +54 -0
  378. package/dist/scene/update_queue.js.map +1 -0
  379. package/dist/scene/water.js +997 -96
  380. package/dist/scene/water.js.map +1 -1
  381. package/dist/scene/water_surface_sampler.js +324 -0
  382. package/dist/scene/water_surface_sampler.js.map +1 -0
  383. package/dist/scene/wind.js +317 -0
  384. package/dist/scene/wind.js.map +1 -0
  385. package/dist/shaders/atmosphere.js +388 -166
  386. package/dist/shaders/atmosphere.js.map +1 -1
  387. package/dist/shaders/fog.js +100 -32
  388. package/dist/shaders/fog.js.map +1 -1
  389. package/dist/shaders/gi.js +365 -0
  390. package/dist/shaders/gi.js.map +1 -0
  391. package/dist/shaders/ltc_rect.js +202 -0
  392. package/dist/shaders/ltc_rect.js.map +1 -0
  393. package/dist/shaders/misc.js +1 -10
  394. package/dist/shaders/misc.js.map +1 -1
  395. package/dist/shaders/noise.js +5 -1
  396. package/dist/shaders/noise.js.map +1 -1
  397. package/dist/shaders/probes.js +309 -0
  398. package/dist/shaders/probes.js.map +1 -0
  399. package/dist/shaders/sdf.js +537 -0
  400. package/dist/shaders/sdf.js.map +1 -0
  401. package/dist/shaders/shadow.js +104 -70
  402. package/dist/shaders/shadow.js.map +1 -1
  403. package/dist/shaders/skin_brdf.js +243 -0
  404. package/dist/shaders/skin_brdf.js.map +1 -0
  405. package/dist/shaders/ssr.js +6 -159
  406. package/dist/shaders/ssr.js.map +1 -1
  407. package/dist/shaders/temporal.js +38 -27
  408. package/dist/shaders/temporal.js.map +1 -1
  409. package/dist/shaders/water.js +40 -87
  410. package/dist/shaders/water.js.map +1 -1
  411. package/dist/shaders/water_medium.js +42 -0
  412. package/dist/shaders/water_medium.js.map +1 -0
  413. package/dist/shadow/dom.js +110 -19
  414. package/dist/shadow/dom.js.map +1 -1
  415. package/dist/shadow/esm.js +3 -3
  416. package/dist/shadow/esm.js.map +1 -1
  417. package/dist/shadow/pcf_opt.js +15 -48
  418. package/dist/shadow/pcf_opt.js.map +1 -1
  419. package/dist/shadow/pcf_pd.js +15 -53
  420. package/dist/shadow/pcf_pd.js.map +1 -1
  421. package/dist/shadow/pcss.js +34 -9
  422. package/dist/shadow/pcss.js.map +1 -1
  423. package/dist/shadow/shadow_impl.js +3 -8
  424. package/dist/shadow/shadow_impl.js.map +1 -1
  425. package/dist/shadow/shadow_region.js +87 -49
  426. package/dist/shadow/shadow_region.js.map +1 -1
  427. package/dist/shadow/shadowmapper.js +93 -53
  428. package/dist/shadow/shadowmapper.js.map +1 -1
  429. package/dist/shadow/ssm.js +18 -72
  430. package/dist/shadow/ssm.js.map +1 -1
  431. package/dist/shadow/vsm.js +3 -3
  432. package/dist/shadow/vsm.js.map +1 -1
  433. package/dist/shapes/shape.js +44 -1
  434. package/dist/shapes/shape.js.map +1 -1
  435. package/dist/utility/buoyancy.js +287 -0
  436. package/dist/utility/buoyancy.js.map +1 -0
  437. package/dist/utility/physical.js +10 -1
  438. package/dist/utility/physical.js.map +1 -1
  439. package/dist/utility/pmrem.js +17 -43
  440. package/dist/utility/pmrem.js.map +1 -1
  441. package/dist/utility/sdf/bake.js +435 -0
  442. package/dist/utility/sdf/bake.js.map +1 -0
  443. package/dist/utility/sdf/bvh.js +576 -0
  444. package/dist/utility/sdf/bvh.js.map +1 -0
  445. package/dist/utility/serialization/manager.js +36 -6
  446. package/dist/utility/serialization/manager.js.map +1 -1
  447. package/dist/utility/serialization/scene/animation.js +77 -7
  448. package/dist/utility/serialization/scene/animation.js.map +1 -1
  449. package/dist/utility/serialization/scene/batch.js +11 -4
  450. package/dist/utility/serialization/scene/batch.js.map +1 -1
  451. package/dist/utility/serialization/scene/camera.js +140 -279
  452. package/dist/utility/serialization/scene/camera.js.map +1 -1
  453. package/dist/utility/serialization/scene/cloth.js +25 -0
  454. package/dist/utility/serialization/scene/cloth.js.map +1 -0
  455. package/dist/utility/serialization/scene/common.js +14 -6
  456. package/dist/utility/serialization/scene/common.js.map +1 -1
  457. package/dist/utility/serialization/scene/foliage.js +821 -0
  458. package/dist/utility/serialization/scene/foliage.js.map +1 -0
  459. package/dist/utility/serialization/scene/hair.js +11 -4
  460. package/dist/utility/serialization/scene/hair.js.map +1 -1
  461. package/dist/utility/serialization/scene/light.js +115 -7
  462. package/dist/utility/serialization/scene/light.js.map +1 -1
  463. package/dist/utility/serialization/scene/material.js +388 -220
  464. package/dist/utility/serialization/scene/material.js.map +1 -1
  465. package/dist/utility/serialization/scene/mesh.js +69 -4
  466. package/dist/utility/serialization/scene/mesh.js.map +1 -1
  467. package/dist/utility/serialization/scene/node.js +140 -5
  468. package/dist/utility/serialization/scene/node.js.map +1 -1
  469. package/dist/utility/serialization/scene/node_physics.js +1318 -0
  470. package/dist/utility/serialization/scene/node_physics.js.map +1 -0
  471. package/dist/utility/serialization/scene/particle.js +11 -4
  472. package/dist/utility/serialization/scene/particle.js.map +1 -1
  473. package/dist/utility/serialization/scene/physics.js +120 -0
  474. package/dist/utility/serialization/scene/physics.js.map +1 -0
  475. package/dist/utility/serialization/scene/primitive.js +124 -10
  476. package/dist/utility/serialization/scene/primitive.js.map +1 -1
  477. package/dist/utility/serialization/scene/scene.js +1687 -51
  478. package/dist/utility/serialization/scene/scene.js.map +1 -1
  479. package/dist/utility/serialization/scene/sprite.js +11 -4
  480. package/dist/utility/serialization/scene/sprite.js.map +1 -1
  481. package/dist/utility/serialization/scene/terrain.js +163 -33
  482. package/dist/utility/serialization/scene/terrain.js.map +1 -1
  483. package/dist/utility/serialization/scene/text.js +11 -4
  484. package/dist/utility/serialization/scene/text.js.map +1 -1
  485. package/dist/utility/serialization/scene/water.js +2473 -114
  486. package/dist/utility/serialization/scene/water.js.map +1 -1
  487. package/dist/utility/serialization/types.js.map +1 -1
  488. package/dist/utility/shprojector.js +97 -109
  489. package/dist/utility/shprojector.js.map +1 -1
  490. package/dist/utility/textures/foam.js +170 -0
  491. package/dist/utility/textures/foam.js.map +1 -0
  492. package/dist/utility/textures/ggxlut.js +17 -43
  493. package/dist/utility/textures/ggxlut.js.map +1 -1
  494. package/dist/utility/textures/ltcdata.js +4 -4
  495. package/dist/utility/textures/ltcdata.js.map +1 -1
  496. package/dist/utility/textures/ltclut.js +16 -6
  497. package/dist/utility/textures/ltclut.js.map +1 -1
  498. package/dist/utility/unsupported.js +24 -0
  499. package/dist/utility/unsupported.js.map +1 -0
  500. package/dist/values.js +13 -1
  501. package/dist/values.js.map +1 -1
  502. package/package.json +25 -12
  503. package/src/asset/loaders/ktx2/basis/LICENSE +201 -0
  504. package/src/asset/loaders/ktx2/basis/basis_transcoder.js +2 -0
  505. package/src/asset/loaders/ktx2/basis/basis_transcoder.wasm +0 -0
  506. package/src/asset/meshoptimizer/LICENSE +21 -0
@@ -1 +1 @@
1
- {"version":3,"file":"skinsss.js","sources":["../../src/posteffect/skinsss.ts"],"sourcesContent":["import { DEPTH_FARTHEST, Vector2, Vector3, Vector4 } from '@zephyr3d/base';\r\nimport type { BindGroup, GPUProgram, Texture2D } from '@zephyr3d/device';\r\nimport type { DrawContext } from '../render';\r\nimport { ShaderHelper } from '../material';\r\nimport { SKIN_SSS_LDR_ENCODE_RANGE } from '../material/skin';\r\nimport { SubsurfaceProfile } from '../material/subsurfaceprofile';\r\nimport { burleyDiffusionWeight } from '../shaders/diffusion';\r\nimport { linearToGamma } from '../shaders/misc';\r\nimport { fetchSampler } from '../utility/misc';\r\nimport { AbstractPostEffect, PostEffectLayer } from './posteffect';\r\n\r\n/** Taps per side of the separable kernel. The full kernel is `2 * TAPS + 1` wide. */\r\nconst SKIN_SSS_TAPS = 8;\r\n\r\n/**\r\n * Stylized screen-space skin scattering pass.\r\n *\r\n * @remarks\r\n * {@link SkinMaterial} writes the diffusible part of its lit color - the stylized diffuse ramp\r\n * plus back-lit transmission, without specular - into a side buffer. This pass diffuses that\r\n * buffer with a channel-dependent kernel and swaps it back in:\r\n *\r\n * ```\r\n * result = base + (diffused - original) * scatterTint * strength + diffused * glow\r\n * ```\r\n *\r\n * Because the term added back replaces exactly the term subtracted, the redistribution is energy\r\n * conserving: light that appears on the dark side of the terminator is light that left the lit\r\n * side, rather than light invented on top of a finished image. With `scatterTint` white and\r\n * `glow` zero the total radiance is preserved to within the kernel's normalization error.\r\n *\r\n * Two things follow from that formulation and are worth knowing:\r\n *\r\n * - Nothing happens where the diffusion changes nothing, so a disabled or zero-radius pass is a\r\n * true no-op, and quantization from an 8-bit side buffer largely cancels between the subtracted\r\n * and added terms instead of banding across the whole face.\r\n * - `scatterTint` colors only the light that actually moved. Tinting the whole diffuse - what the\r\n * material used to do with `scatterColor` - is what made the old look read as red haze.\r\n *\r\n * Stylization survives in two places. The material owns the direct lighting ramp (wrap, softness,\r\n * shadow tint, brightening) and this pass diffuses whatever ramp it produced; and {@link profile}\r\n * selects the channel radii, so the `wax` and `jade` presets are as reachable as `skin`.\r\n *\r\n * This is intentionally separate from the profile-based {@link SSS} pass, which supports per-pixel\r\n * profiles via a profile-slot MRT. Here a single global profile lives in uniforms.\r\n *\r\n * @public\r\n */\r\nexport class SkinSSS extends AbstractPostEffect {\r\n private static _blurProgram: GPUProgram | null = null;\r\n private static _combineProgram: GPUProgram | null = null;\r\n private _blurBindGroupH: BindGroup | null;\r\n private _blurBindGroupV: BindGroup | null;\r\n private _combineBindGroup: BindGroup | null;\r\n private _profile: SubsurfaceProfile | null;\r\n private _strength: number;\r\n private _glow: number;\r\n private _opacity: number;\r\n private _sampleStep: number;\r\n private _depthScale: number;\r\n private _colorBoost: number;\r\n private _scatterRadius: number;\r\n private _smoothness: number;\r\n private readonly _scatterTint: Vector4;\r\n private readonly _channelRadius: Vector3;\r\n private readonly _channelFalloff: Vector3;\r\n private readonly _blurDirection: Vector2;\r\n private readonly _radiusParams: Vector4;\r\n private readonly _targetSize: Vector4;\r\n private readonly _cameraNearFar: Vector2;\r\n\r\n constructor() {\r\n super();\r\n this._layer = PostEffectLayer.opaque;\r\n this._blurBindGroupH = null;\r\n this._blurBindGroupV = null;\r\n this._combineBindGroup = null;\r\n this._profile = null;\r\n this._strength = 1;\r\n this._glow = 0;\r\n this._opacity = 0.18;\r\n this._sampleStep = 3;\r\n this._depthScale = 80;\r\n this._colorBoost = 1;\r\n this._scatterRadius = 0.02;\r\n this._smoothness = 0;\r\n this._scatterTint = new Vector4(1, 1, 1, 1);\r\n this._channelRadius = new Vector3(1, 1, 1);\r\n this._channelFalloff = new Vector3(1, 1, 1);\r\n this._blurDirection = new Vector2();\r\n this._radiusParams = new Vector4();\r\n this._targetSize = new Vector4();\r\n this._cameraNearFar = new Vector2();\r\n }\r\n\r\n /**\r\n * Subsurface profile supplying the per-channel scatter radii and falloff.\r\n *\r\n * @remarks\r\n * Defaults to {@link SubsurfaceProfile.getDefaultSkinProfile} when unset. Only the channel\r\n * ratios of `scatterRadius` and the `falloffColor` are read; the absolute distance comes from\r\n * {@link SkinSSS.scatterRadius}, so switching profiles changes the color of the bleed without\r\n * changing how far it reaches.\r\n *\r\n * The channel ratios are what make skin read as skin - red travels several times further than\r\n * blue, which is the red-to-orange-to-yellow gradient at the terminator. They are also the main\r\n * stylization lever: the `wax` and `jade` presets are the same code path with different ratios.\r\n */\r\n get profile(): SubsurfaceProfile | null {\r\n return this._profile;\r\n }\r\n set profile(val: SubsurfaceProfile | null) {\r\n this._profile = val ?? null;\r\n }\r\n\r\n /** Final blend strength of the conserving redistribution. 1 fully diffuses the skin diffuse. */\r\n get strength() {\r\n return this._strength;\r\n }\r\n set strength(val) {\r\n this._strength = Math.max(0, val ?? 0);\r\n }\r\n\r\n /**\r\n * Additive, deliberately non-conserving bleed layered on top of the conserving result.\r\n *\r\n * @remarks\r\n * 0 (the default) keeps the pass energy conserving. Raising it adds the diffused term a second\r\n * time without subtracting anything, which is the glow-heavy look the pass produced before it\r\n * conserved energy; around 1 approximates it. Use it when the art direction wants skin to read\r\n * as lit from within rather than as a physical surface.\r\n */\r\n get glow() {\r\n return this._glow;\r\n }\r\n set glow(val) {\r\n this._glow = Math.max(0, val ?? 0);\r\n }\r\n\r\n /**\r\n * Tint applied to the redistributed light.\r\n *\r\n * @remarks\r\n * White (the default) leaves the pass energy conserving. A warm tint pushes the classic reddish\r\n * terminator further than the profile's channel radii do on their own. Because it multiplies\r\n * only the difference between the diffused and original diffuse, it cannot wash the whole\r\n * surface - only the light that moved.\r\n */\r\n get scatterTint(): Vector4 {\r\n return this._scatterTint;\r\n }\r\n set scatterTint(val: Vector4) {\r\n this._scatterTint.set(val);\r\n }\r\n\r\n /** Skin mask coverage threshold. Scattering fades in as the blurred mask coverage exceeds this. */\r\n get opacity() {\r\n return this._opacity;\r\n }\r\n set opacity(val) {\r\n this._opacity = Math.max(0, Math.min(1, val ?? 0));\r\n }\r\n\r\n /**\r\n * Maximum pixel spacing between blur taps. Caps the projected scatter radius for close-ups.\r\n *\r\n * @remarks\r\n * With `SKIN_SSS_TAPS` taps per side the kernel reaches `sampleStep * SKIN_SSS_TAPS` pixels, so\r\n * this is the real limit on scatter width. The separable form makes taps cheap enough that the\r\n * default no longer has to be tight: the old single-pass 9x9 kernel capped out at 8 pixels, and\r\n * a face in close-up projects a 2 cm scatter radius far past that - the shot that needs the most\r\n * scattering used to get the least.\r\n */\r\n get sampleStep() {\r\n return this._sampleStep;\r\n }\r\n set sampleStep(val) {\r\n this._sampleStep = Math.max(0.25, Math.min(6, val ?? 0.25));\r\n }\r\n\r\n /** World-space scatter radius. The blur width shrinks with distance to keep this constant. */\r\n get scatterRadius() {\r\n return this._scatterRadius;\r\n }\r\n set scatterRadius(val) {\r\n this._scatterRadius = Math.max(0, val ?? 0);\r\n }\r\n\r\n /**\r\n * Skin smoothing amount (\"beauty filter\"). Blends the lit color toward a mask- and depth-weighted\r\n * blur of itself on skin pixels, removing pore and albedo detail while facial features stay sharp\r\n * wherever the skin mask excludes them (eyes, brows, lips). 0 disables smoothing.\r\n *\r\n * @remarks\r\n * This is separate from the diffusion and stacks on top of it. The diffusion blurs *lighting*\r\n * only; albedo detail such as pores and blemishes passes through it untouched, which is correct\r\n * but is not what a beauty filter is for.\r\n */\r\n get smoothness() {\r\n return this._smoothness;\r\n }\r\n set smoothness(val) {\r\n this._smoothness = Math.max(0, Math.min(1, val ?? 0));\r\n }\r\n\r\n /** Depth rejection scale. The reference shader uses 80. */\r\n get depthScale() {\r\n return this._depthScale;\r\n }\r\n set depthScale(val) {\r\n this._depthScale = Math.max(0, val ?? 0);\r\n }\r\n\r\n /** Multiplier applied to the diffused irradiance before compositing. */\r\n get colorBoost() {\r\n return this._colorBoost;\r\n }\r\n set colorBoost(val) {\r\n this._colorBoost = Math.max(0, val ?? 0);\r\n }\r\n\r\n requireLinearDepthTexture() {\r\n return true;\r\n }\r\n\r\n apply(ctx: DrawContext, inputColorTexture: Texture2D, sceneDepthTexture: Texture2D, srgbOutput: boolean) {\r\n if (!ctx.SkinSSSTexture || this._strength <= 0) {\r\n this.passThrough(ctx, inputColorTexture, srgbOutput);\r\n return;\r\n }\r\n const device = ctx.device;\r\n const outputFramebuffer = device.getFramebuffer();\r\n const skinTex = ctx.SkinSSSTexture;\r\n if (!SkinSSS._blurProgram) {\r\n SkinSSS._blurProgram = this.createBlurProgram(ctx);\r\n }\r\n if (!SkinSSS._combineProgram) {\r\n SkinSSS._combineProgram = this.createCombineProgram(ctx);\r\n }\r\n const blurProgram = SkinSSS._blurProgram;\r\n const combineProgram = SkinSSS._combineProgram;\r\n if (!this._blurBindGroupH) {\r\n // Two bind groups rather than one program per direction: the only thing\r\n // that differs is the step vector, and rewriting it between draws would\r\n // race the first draw's read of it.\r\n this._blurBindGroupH = device.createBindGroup(blurProgram.bindGroupLayouts[0]);\r\n this._blurBindGroupV = device.createBindGroup(blurProgram.bindGroupLayouts[0]);\r\n }\r\n if (!this._combineBindGroup) {\r\n this._combineBindGroup = device.createBindGroup(combineProgram.bindGroupLayouts[0]);\r\n }\r\n\r\n const profile = this._profile ?? SubsurfaceProfile.getDefaultSkinProfile();\r\n const radius = profile.scatterRadius;\r\n const maxChannel = Math.max(radius.x, radius.y, radius.z, 1e-5);\r\n this._channelRadius.setXYZ(radius.x / maxChannel, radius.y / maxChannel, radius.z / maxChannel);\r\n const falloff = profile.falloffColor;\r\n this._channelFalloff.setXYZ(falloff.x, falloff.y, falloff.z);\r\n\r\n // Pixels per world unit at unit view depth. The shader divides by view depth\r\n // so the footprint stays a constant world-space radius.\r\n const projScale = 0.5 * inputColorTexture.height * ctx.camera.getProjectionMatrix().m11;\r\n this._radiusParams.setXYZW(\r\n this._scatterRadius * projScale,\r\n ctx.camera.isPerspective() ? 1 : 0,\r\n this._sampleStep,\r\n this._depthScale\r\n );\r\n this._targetSize.setXYZW(\r\n inputColorTexture.width,\r\n inputColorTexture.height,\r\n 1 / inputColorTexture.width,\r\n 1 / inputColorTexture.height\r\n );\r\n this._cameraNearFar.setXY(ctx.camera.getNearPlane(), ctx.camera.getFarPlane());\r\n const encodeScale = skinTex.format === 'rgba8unorm' ? SKIN_SSS_LDR_ENCODE_RANGE : 1;\r\n\r\n const blurH = device.pool.fetchTemporalFramebuffer(\r\n false,\r\n skinTex.width,\r\n skinTex.height,\r\n skinTex.format,\r\n null,\r\n false\r\n );\r\n const blurV = device.pool.fetchTemporalFramebuffer(\r\n false,\r\n skinTex.width,\r\n skinTex.height,\r\n skinTex.format,\r\n null,\r\n false\r\n );\r\n\r\n device.setFramebuffer(blurH);\r\n this.blur(ctx, blurProgram, this._blurBindGroupH!, skinTex, sceneDepthTexture, true);\r\n device.setFramebuffer(blurV);\r\n this.blur(\r\n ctx,\r\n blurProgram,\r\n this._blurBindGroupV!,\r\n blurH.getColorAttachments()[0] as Texture2D,\r\n sceneDepthTexture,\r\n false\r\n );\r\n\r\n device.setFramebuffer(outputFramebuffer);\r\n this.combine(\r\n ctx,\r\n combineProgram,\r\n inputColorTexture,\r\n skinTex,\r\n blurV.getColorAttachments()[0] as Texture2D,\r\n sceneDepthTexture,\r\n encodeScale,\r\n srgbOutput\r\n );\r\n\r\n device.pool.releaseFrameBuffer(blurH);\r\n device.pool.releaseFrameBuffer(blurV);\r\n }\r\n\r\n private blur(\r\n ctx: DrawContext,\r\n program: GPUProgram,\r\n bindGroup: BindGroup,\r\n source: Texture2D,\r\n sceneDepthTexture: Texture2D,\r\n horizontal: boolean\r\n ) {\r\n const device = ctx.device;\r\n this._blurDirection.setXY(horizontal ? 1 : 0, horizontal ? 0 : 1);\r\n bindGroup.setTexture('skinTex', source, fetchSampler('clamp_linear'));\r\n bindGroup.setTexture('depthTex', sceneDepthTexture, fetchSampler('clamp_nearest_nomip'));\r\n bindGroup.setValue('cameraNearFar', this._cameraNearFar);\r\n bindGroup.setValue('targetSize', this._targetSize);\r\n bindGroup.setValue('radiusParams', this._radiusParams);\r\n bindGroup.setValue('channelRadius', this._channelRadius);\r\n bindGroup.setValue('channelFalloff', this._channelFalloff);\r\n bindGroup.setValue('blurDirection', this._blurDirection);\r\n bindGroup.setValue('flip', 0);\r\n device.setProgram(program);\r\n device.setBindGroup(0, bindGroup);\r\n this.drawFullscreenQuad();\r\n }\r\n\r\n private combine(\r\n ctx: DrawContext,\r\n program: GPUProgram,\r\n colorTexture: Texture2D,\r\n skinTexture: Texture2D,\r\n blurredTexture: Texture2D,\r\n sceneDepthTexture: Texture2D,\r\n encodeScale: number,\r\n srgbOutput: boolean\r\n ) {\r\n const device = ctx.device;\r\n const bindGroup = this._combineBindGroup!;\r\n bindGroup.setTexture('colorTex', colorTexture, fetchSampler('clamp_linear'));\r\n bindGroup.setTexture('skinTex', skinTexture, fetchSampler('clamp_linear'));\r\n bindGroup.setTexture('blurredTex', blurredTexture, fetchSampler('clamp_linear'));\r\n bindGroup.setTexture('depthTex', sceneDepthTexture, fetchSampler('clamp_nearest_nomip'));\r\n bindGroup.setValue('cameraNearFar', this._cameraNearFar);\r\n bindGroup.setValue('targetSize', this._targetSize);\r\n bindGroup.setValue('radiusParams', this._radiusParams);\r\n bindGroup.setValue('scatterTint', this._scatterTint);\r\n bindGroup.setValue('strength', this._strength);\r\n bindGroup.setValue('glow', this._glow);\r\n bindGroup.setValue('opacity', this._opacity);\r\n bindGroup.setValue('colorBoost', this._colorBoost);\r\n bindGroup.setValue('encodeScale', encodeScale);\r\n bindGroup.setValue('smoothness', this._smoothness);\r\n bindGroup.setValue('flip', this.needFlip(device) ? 1 : 0);\r\n bindGroup.setValue('srgbOut', srgbOutput ? 1 : 0);\r\n device.setProgram(program);\r\n device.setBindGroup(0, bindGroup);\r\n this.drawFullscreenQuad();\r\n }\r\n\r\n /** Shared fullscreen vertex stage for both passes. */\r\n private static fullscreenVertex(pb: any) {\r\n pb.getGlobalScope().flip = pb.int().uniform(0);\r\n pb.getGlobalScope().$inputs.pos = pb.vec2().attrib('position');\r\n pb.getGlobalScope().$outputs.uv = pb.vec2();\r\n pb.main(function (this: any) {\r\n this.$builtins.position = pb.vec4(this.$inputs.pos, DEPTH_FARTHEST, 1);\r\n this.$outputs.uv = pb.add(pb.mul(this.$inputs.pos.xy, 0.5), pb.vec2(0.5));\r\n this.$if(pb.notEqual(this.flip, 0), function (this: any) {\r\n this.$builtins.position.y = pb.neg(this.$builtins.position.y);\r\n });\r\n });\r\n }\r\n\r\n private createBlurProgram(ctx: DrawContext) {\r\n const program = ctx.device.buildRenderProgram({\r\n vertex(pb) {\r\n SkinSSS.fullscreenVertex(pb);\r\n },\r\n fragment(pb) {\r\n this.skinTex = pb.tex2D().uniform(0);\r\n this.depthTex = pb.tex2D().sampleType('unfilterable-float').uniform(0);\r\n this.cameraNearFar = pb.vec2().uniform(0);\r\n this.targetSize = pb.vec4().uniform(0);\r\n // x: world scatter radius in pixels at unit depth, y: 1 for perspective,\r\n // z: max tap spacing, w: depth rejection scale.\r\n this.radiusParams = pb.vec4().uniform(0);\r\n this.channelRadius = pb.vec3().uniform(0);\r\n this.channelFalloff = pb.vec3().uniform(0);\r\n this.blurDirection = pb.vec2().uniform(0);\r\n this.$outputs.outColor = pb.vec4();\r\n pb.func('readDepth01', [pb.vec2('uv')], function () {\r\n this.$return(ShaderHelper.sampleLinearDepth(this, this.depthTex, this.uv, 0));\r\n });\r\n pb.main(function () {\r\n this.$l.uv = this.$inputs.uv;\r\n this.$l.center = pb.textureSampleLevel(this.skinTex, this.uv, 0);\r\n this.$l.centerDepth01 = this.readDepth01(this.uv);\r\n this.$outputs.outColor = this.center;\r\n // Background, or a pixel no skin material wrote: nothing to diffuse.\r\n this.$if(\r\n pb.and(pb.lessThan(this.centerDepth01, 1), pb.greaterThan(this.center.a, 1e-4)),\r\n function () {\r\n this.$l.centerDepth = pb.max(pb.mul(this.centerDepth01, this.cameraNearFar.y), 1e-4);\r\n // Per-channel radius in pixels. Red reaches several times further\r\n // than blue, which is the whole point - a shared radius is what\r\n // makes Gaussian SSS read as a flat haze.\r\n this.$l.viewScale = pb.max(pb.mix(pb.float(1), this.centerDepth, this.radiusParams.y), 1e-4);\r\n this.$l.radiusPx = pb.div(pb.mul(this.channelRadius, this.radiusParams.x), this.viewScale);\r\n // Burley shaping distance per channel; falloff tightens or widens\r\n // the profile without changing its reach.\r\n this.$l.shape = pb.vec3(\r\n pb.mix(0.72, 1.46, pb.clamp(this.channelFalloff.x, 0.05, 1)),\r\n pb.mix(0.72, 1.46, pb.clamp(this.channelFalloff.y, 0.05, 1)),\r\n pb.mix(0.72, 1.46, pb.clamp(this.channelFalloff.z, 0.05, 1))\r\n );\r\n this.$l.shapeDist = pb.max(pb.mul(this.radiusPx, this.shape), pb.vec3(1e-3));\r\n // Tap spacing follows the widest channel so the longest tail is\r\n // resolved; the narrower channels simply weight down sooner.\r\n this.$l.maxRadiusPx = pb.max(pb.max(this.radiusPx.x, this.radiusPx.y), this.radiusPx.z);\r\n this.$l.stepPx = pb.clamp(pb.div(this.maxRadiusPx, SKIN_SSS_TAPS), 0, this.radiusParams.z);\r\n this.$l.stepUV = pb.mul(this.blurDirection, this.stepPx, this.targetSize.zw);\r\n this.$l.sum = pb.vec3(0);\r\n this.$l.weightSum = pb.vec3(0);\r\n this.$l.coverage = pb.float(0);\r\n this.$l.coverageWeight = pb.float(0);\r\n this.$for(pb.int('i'), -SKIN_SSS_TAPS, SKIN_SSS_TAPS + 1, function () {\r\n this.$l.fi = pb.float(this.i);\r\n this.$l.sampleUV = pb.clamp(\r\n pb.add(this.uv, pb.mul(this.stepUV, this.fi)),\r\n pb.vec2(0),\r\n pb.vec2(1)\r\n );\r\n this.$l.dist = pb.mul(pb.abs(this.fi), this.stepPx);\r\n this.$l.w = pb.vec3(\r\n burleyDiffusionWeight(this, this.dist, this.shapeDist.x),\r\n burleyDiffusionWeight(this, this.dist, this.shapeDist.y),\r\n burleyDiffusionWeight(this, this.dist, this.shapeDist.z)\r\n );\r\n this.$l.sampleDepth01 = this.readDepth01(this.sampleUV);\r\n this.$l.sampleDepth = pb.max(pb.mul(this.sampleDepth01, this.cameraNearFar.y), 1e-4);\r\n this.$l.depthWeight = pb.clamp(\r\n pb.sub(\r\n 1,\r\n pb.div(\r\n pb.mul(pb.abs(pb.sub(this.centerDepth, this.sampleDepth)), this.radiusParams.w),\r\n this.centerDepth\r\n )\r\n ),\r\n 0,\r\n 1\r\n );\r\n this.depthWeight = pb.mul(\r\n this.depthWeight,\r\n this.depthWeight,\r\n pb.sub(3, pb.mul(this.depthWeight, 2))\r\n );\r\n this.$l.tapWeight = pb.mul(this.w, this.depthWeight);\r\n this.$l.tapSample = pb.textureSampleLevel(this.skinTex, this.sampleUV, 0);\r\n // Non-skin taps are excluded from the numerator *and* the\r\n // denominator. Leaving them in the denominator - as this pass\r\n // used to - drags the diffuse toward zero near every silhouette,\r\n // which was a mild darkening under the old additive composite\r\n // but would eat real light now that the term is subtracted back\r\n // out of the base color.\r\n this.$l.isSkin = pb.float(pb.greaterThan(this.tapSample.a, 1e-4));\r\n this.sum = pb.add(this.sum, pb.mul(this.tapSample.rgb, this.tapWeight, this.isSkin));\r\n this.weightSum = pb.add(this.weightSum, pb.mul(this.tapWeight, this.isSkin));\r\n // Coverage keeps its own accumulator: it is the skin fraction of\r\n // the neighbourhood, so it must count every tap in the\r\n // denominator, skin or not.\r\n this.coverage = pb.add(\r\n this.coverage,\r\n pb.mul(this.tapWeight.x, this.isSkin, this.tapSample.a)\r\n );\r\n this.coverageWeight = pb.add(this.coverageWeight, this.tapWeight.x);\r\n });\r\n this.$l.diffused = pb.div(this.sum, pb.max(this.weightSum, pb.vec3(1e-6)));\r\n this.$outputs.outColor = pb.vec4(\r\n this.diffused,\r\n pb.div(this.coverage, pb.max(this.coverageWeight, 1e-6))\r\n );\r\n }\r\n );\r\n });\r\n }\r\n })!;\r\n program.name = '@SkinSSSBlur';\r\n return program;\r\n }\r\n\r\n private createCombineProgram(ctx: DrawContext) {\r\n const program = ctx.device.buildRenderProgram({\r\n vertex(pb) {\r\n SkinSSS.fullscreenVertex(pb);\r\n },\r\n fragment(pb) {\r\n this.colorTex = pb.tex2D().uniform(0);\r\n this.skinTex = pb.tex2D().uniform(0);\r\n this.blurredTex = pb.tex2D().uniform(0);\r\n this.depthTex = pb.tex2D().sampleType('unfilterable-float').uniform(0);\r\n this.cameraNearFar = pb.vec2().uniform(0);\r\n this.targetSize = pb.vec4().uniform(0);\r\n this.radiusParams = pb.vec4().uniform(0);\r\n this.scatterTint = pb.vec4().uniform(0);\r\n this.strength = pb.float().uniform(0);\r\n this.glow = pb.float().uniform(0);\r\n this.opacity = pb.float().uniform(0);\r\n this.colorBoost = pb.float().uniform(0);\r\n this.encodeScale = pb.float().uniform(0);\r\n this.smoothness = pb.float().uniform(0);\r\n this.srgbOut = pb.int().uniform(0);\r\n this.$outputs.outColor = pb.vec4();\r\n pb.func('readDepth01', [pb.vec2('uv')], function () {\r\n this.$return(ShaderHelper.sampleLinearDepth(this, this.depthTex, this.uv, 0));\r\n });\r\n pb.main(function () {\r\n this.$l.uv = this.$inputs.uv;\r\n this.$l.baseColor = pb.textureSampleLevel(this.colorTex, this.uv, 0);\r\n this.$l.result = this.baseColor.rgb;\r\n this.$l.centerSkin = pb.textureSampleLevel(this.skinTex, this.uv, 0);\r\n this.$l.centerDepth01 = this.readDepth01(this.uv);\r\n this.$if(\r\n pb.and(pb.lessThan(this.centerDepth01, 1), pb.greaterThan(this.centerSkin.a, 1e-4)),\r\n function () {\r\n this.$l.blurred = pb.textureSampleLevel(this.blurredTex, this.uv, 0);\r\n // Both buffers carry the same LDR encoding, so decode once here.\r\n this.$l.original = pb.mul(this.centerSkin.rgb, this.encodeScale);\r\n this.$l.diffused = pb.mul(this.blurred.rgb, this.encodeScale, this.colorBoost);\r\n this.$l.coverage = pb.smoothStep(this.opacity, pb.add(this.opacity, 0.35), this.blurred.a);\r\n // Energy conserving core: swap the original diffuse for the\r\n // diffused one. The added term is exactly the subtracted term, so\r\n // brightening the dark side of the terminator darkens the lit side\r\n // by the same amount rather than adding light to the frame.\r\n this.$l.redistributed = pb.mul(\r\n pb.sub(this.diffused, this.original),\r\n this.scatterTint.rgb,\r\n this.strength,\r\n this.coverage\r\n );\r\n this.result = pb.add(this.baseColor.rgb, this.redistributed);\r\n // Explicit, opt-in departure from conservation.\r\n this.$if(pb.greaterThan(this.glow, 0), function () {\r\n this.result = pb.add(\r\n this.result,\r\n pb.mul(this.diffused, this.scatterTint.rgb, this.glow, this.coverage)\r\n );\r\n });\r\n // Beauty filter. Unlike the diffusion above this blurs the shaded\r\n // color itself, so it removes albedo detail (pores, blemishes)\r\n // that scattering physically leaves alone. Uniform branch: free\r\n // when disabled.\r\n this.$if(pb.greaterThan(this.smoothness, 0), function () {\r\n this.$l.centerDepth = pb.max(pb.mul(this.centerDepth01, this.cameraNearFar.y), 1e-4);\r\n this.$l.viewScale = pb.max(pb.mix(pb.float(1), this.centerDepth, this.radiusParams.y), 1e-4);\r\n this.$l.smoothStepPx = pb.clamp(\r\n pb.div(pb.mul(this.radiusParams.x, 0.5), this.viewScale),\r\n 0,\r\n this.radiusParams.z\r\n );\r\n this.$l.colorSum = pb.vec3(0);\r\n this.$l.colorWeight = pb.float(0);\r\n this.$for(pb.int('y'), -2, 3, function () {\r\n this.$for(pb.int('x'), -2, 3, function () {\r\n this.$l.offset = pb.mul(\r\n pb.vec2(pb.float(this.x), pb.float(this.y)),\r\n this.smoothStepPx,\r\n this.targetSize.zw\r\n );\r\n this.$l.sampleUV = pb.clamp(pb.add(this.uv, this.offset), pb.vec2(0), pb.vec2(1));\r\n // The skin mask is the edge stop, so eyes, brows and lips\r\n // (mask 0) never bleed onto the surrounding skin.\r\n this.$l.maskSample = pb.textureSampleLevel(this.skinTex, this.sampleUV, 0).a;\r\n this.$l.w = pb.float(pb.greaterThan(this.maskSample, 1e-4));\r\n this.colorSum = pb.add(\r\n this.colorSum,\r\n pb.mul(pb.textureSampleLevel(this.colorTex, this.sampleUV, 0).rgb, this.w)\r\n );\r\n this.colorWeight = pb.add(this.colorWeight, this.w);\r\n });\r\n });\r\n this.$if(pb.greaterThan(this.colorWeight, 1e-4), function () {\r\n this.result = pb.mix(\r\n this.result,\r\n pb.div(this.colorSum, this.colorWeight),\r\n pb.mul(this.smoothness, this.coverage, this.centerSkin.a)\r\n );\r\n });\r\n });\r\n // Precision can push the subtraction a hair below zero.\r\n this.result = pb.max(this.result, pb.vec3(0));\r\n }\r\n );\r\n this.$if(pb.equal(this.srgbOut, 0), function () {\r\n this.$outputs.outColor = pb.vec4(this.result, this.baseColor.a);\r\n }).$else(function () {\r\n this.$outputs.outColor = pb.vec4(linearToGamma(this, this.result), this.baseColor.a);\r\n });\r\n });\r\n }\r\n })!;\r\n program.name = '@SkinSSSCombine';\r\n return program;\r\n }\r\n}\r\n"],"names":["SKIN_SSS_TAPS","SkinSSS","AbstractPostEffect","_blurProgram","_combineProgram","_blurBindGroupH","_blurBindGroupV","_combineBindGroup","_profile","_strength","_glow","_opacity","_sampleStep","_depthScale","_colorBoost","_scatterRadius","_smoothness","_scatterTint","_channelRadius","_channelFalloff","_blurDirection","_radiusParams","_targetSize","_cameraNearFar","_layer","PostEffectLayer","opaque","Vector4","Vector3","Vector2","profile","val","strength","Math","max","glow","scatterTint","set","opacity","min","sampleStep","scatterRadius","smoothness","depthScale","colorBoost","requireLinearDepthTexture","apply","ctx","inputColorTexture","sceneDepthTexture","srgbOutput","SkinSSSTexture","passThrough","device","outputFramebuffer","getFramebuffer","skinTex","createBlurProgram","createCombineProgram","blurProgram","combineProgram","createBindGroup","bindGroupLayouts","SubsurfaceProfile","getDefaultSkinProfile","radius","maxChannel","x","y","z","setXYZ","falloff","falloffColor","projScale","height","camera","getProjectionMatrix","m11","setXYZW","isPerspective","width","setXY","getNearPlane","getFarPlane","encodeScale","format","SKIN_SSS_LDR_ENCODE_RANGE","blurH","pool","fetchTemporalFramebuffer","blurV","setFramebuffer","blur","getColorAttachments","combine","releaseFrameBuffer","program","bindGroup","source","horizontal","setTexture","fetchSampler","setValue","setProgram","setBindGroup","drawFullscreenQuad","colorTexture","skinTexture","blurredTexture","needFlip","fullscreenVertex","pb","getGlobalScope","flip","int","uniform","$inputs","pos","vec2","attrib","$outputs","uv","main","$builtins","position","vec4","DEPTH_FARTHEST","add","mul","xy","$if","notEqual","neg","buildRenderProgram","vertex","fragment","tex2D","depthTex","sampleType","cameraNearFar","targetSize","radiusParams","channelRadius","vec3","channelFalloff","blurDirection","outColor","func","$return","ShaderHelper","sampleLinearDepth","$l","center","textureSampleLevel","centerDepth01","readDepth01","and","lessThan","greaterThan","a","centerDepth","viewScale","mix","float","radiusPx","div","shape","clamp","shapeDist","maxRadiusPx","stepPx","stepUV","zw","sum","weightSum","coverage","coverageWeight","$for","fi","i","sampleUV","dist","abs","w","burleyDiffusionWeight","sampleDepth01","sampleDepth","depthWeight","sub","tapWeight","tapSample","isSkin","rgb","diffused","name","colorTex","blurredTex","srgbOut","baseColor","result","centerSkin","blurred","original","smoothStep","redistributed","smoothStepPx","colorSum","colorWeight","offset","maskSample","equal","$else","linearToGamma"],"mappings":"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"}
1
+ {"version":3,"file":"skinsss.js","sources":["../../src/posteffect/skinsss.ts"],"sourcesContent":["import { DEPTH_FARTHEST, Vector2, Vector4 } from '@zephyr3d/base';\nimport type { BindGroup, GPUProgram, Texture2D } from '@zephyr3d/device';\nimport type { DrawContext } from '../render';\nimport { ShaderHelper } from '../material';\nimport { SSSProfile } from '../material/sssprofile';\nimport { linearToGamma } from '../shaders/misc';\nimport { hash21 } from '../shaders/noise';\nimport { fetchSampler } from '../utility/misc';\nimport { AbstractPostEffect, PostEffectLayer } from './posteffect';\n\n/**\n * Intermediate quantity to visualize instead of the shaded result.\n *\n * @remarks\n * `'none'` renders normally. The rest replace the output with one term of the\n * diffusion, which is how an input problem is told apart from a kernel problem.\n *\n * @public\n */\nexport type SkinSSSDebugOutput =\n | 'none'\n /** Scatterable energy recovered from SceneColor and its diffuse-luminance alpha. */\n | 'diffusible'\n /** Fraction of the pixel treated as diffuse, from `SceneColor.a / luma`. */\n | 'diffuseAmount'\n /** Per-pixel profile id, as written by the material. */\n | 'profileId'\n /** World normal carried in the skin mask buffer. */\n | 'normal'\n /** Per-channel diffusion distance `d`, scaled for display. */\n | 'diffusionDistance'\n /** Median sample radius, in pixels. */\n | 'sampleRadius'\n /** Accumulated kernel weight, before normalization. */\n | 'weight'\n /** Fraction of taps that landed on skin. */\n | 'acceptance'\n /** CDF mass attributed to the centre pixel. */\n | 'centerWeight'\n /** The diffused result on its own, before recombination. */\n | 'diffused'\n /** Light-space thickness from the transmission pass, for the lights in layer 0. */\n | 'thickness';\n\nconst SKIN_SSS_DEBUG_OUTPUTS: SkinSSSDebugOutput[] = [\n 'none',\n 'diffusible',\n 'diffuseAmount',\n 'profileId',\n 'normal',\n 'diffusionDistance',\n 'sampleRadius',\n 'weight',\n 'acceptance',\n 'centerWeight',\n 'diffused',\n 'thickness'\n];\n\n/**\n * Radial-disc sample count, matching UE5's `BURLEY_NUM_SAMPLES`.\n *\n * @remarks\n * UE5 drives the count from a variance history and resolves the remainder\n * temporally. Without that history every frame stands on its own, so the full\n * count is used throughout.\n */\nconst DEFAULT_SAMPLE_COUNT = 64;\n\n/**\n * Screen-space skin scattering — 3-pass pipeline aligned with UE5.\n *\n * @remarks\n * Pass 1 (Burley): Radial-disc Burley diffusion with Halton + inverse-CDF\n * importance sampling, 3D bilateral distance, per-channel kernel.\n * Pass 2 (BVar): Luminance variance + depth gradient → transmission estimate.\n * Pass 3 (Recombine): Specular/diffuse separation via SceneColor.a, then the\n * diffused half summed back with the specular remainder.\n *\n * The pass exposes no scattering parameters of its own — every one of them\n * belongs to the {@link SSSProfile} the material points at, as in UE5.\n *\n * WebGPU only.\n *\n * @public\n */\nexport class SkinSSS extends AbstractPostEffect {\n private static _burleyProgram: GPUProgram | null = null;\n private static _bvarProgram: GPUProgram | null = null;\n private static _recombineProgram: GPUProgram | null = null;\n private _burleyBindGroup: BindGroup | null;\n private _bvarBindGroup: BindGroup | null;\n private _recombineBindGroup: BindGroup | null;\n private _profile: SSSProfile | null;\n private _debugOutput: SkinSSSDebugOutput;\n private _debugExposure: number;\n private _sampleCount: number;\n private readonly _projScale: Vector2;\n private readonly _profileParams: Vector4;\n private readonly _targetSize: Vector4;\n private readonly _cameraNearFar: Vector2;\n\n constructor() {\n super();\n this._layer = PostEffectLayer.opaque;\n this._burleyBindGroup = null;\n this._bvarBindGroup = null;\n this._recombineBindGroup = null;\n this._profile = null;\n this._debugOutput = 'none';\n this._debugExposure = 1;\n this._sampleCount = DEFAULT_SAMPLE_COUNT;\n this._projScale = new Vector2();\n this._profileParams = new Vector4();\n this._targetSize = new Vector4();\n this._cameraNearFar = new Vector2();\n }\n\n /**\n * Fallback profile for pixels whose id is not in the table.\n *\n * @remarks\n * Scattering parameters normally come from the per-pixel profile id the skin\n * material writes, so this only applies when that lookup misses.\n *\n * @public\n */\n get profile(): SSSProfile | null {\n return this._profile;\n }\n set profile(val: SSSProfile | null) {\n this._profile = val ?? null;\n }\n get sampleCount() {\n return this._sampleCount;\n }\n set sampleCount(val) {\n this._sampleCount = Math.max(8, Math.min(64, Math.round(val ?? DEFAULT_SAMPLE_COUNT)));\n }\n\n /**\n * Multiplier applied to whatever {@link SkinSSS.debugOutput} renders.\n *\n * @remarks\n * Defaults to 1. Several intermediates sit in a narrow band that reads as a\n * flat tone at unit exposure, so raising this is how \"no variation\" is told\n * apart from \"variation too small to see\". No effect unless a debug output is\n * selected.\n *\n * @public\n */\n get debugExposure() {\n return this._debugExposure;\n }\n set debugExposure(val: number) {\n this._debugExposure = Math.max(0, val ?? 1);\n }\n\n /**\n * Intermediate quantity to render instead of the shaded result.\n *\n * @remarks\n * Defaults to `'none'`. See {@link SkinSSSDebugOutput}.\n *\n * @public\n */\n get debugOutput(): SkinSSSDebugOutput {\n return this._debugOutput;\n }\n set debugOutput(val: SkinSSSDebugOutput) {\n this._debugOutput = SKIN_SSS_DEBUG_OUTPUTS.includes(val) ? val : 'none';\n }\n\n requireLinearDepthTexture() {\n return true;\n }\n\n apply(ctx: DrawContext, inputColorTexture: Texture2D, sceneDepthTexture: Texture2D, srgbOutput: boolean) {\n if (!ctx.SSSMaskTexture || !ctx.SSSProfileIdTexture || ctx.device.type !== 'webgpu') {\n this.passThrough(ctx, inputColorTexture, srgbOutput);\n return;\n }\n const device = ctx.device;\n const outputFramebuffer = device.getFramebuffer();\n const maskTex = ctx.SSSMaskTexture;\n const profileIdTex = ctx.SSSProfileIdTexture;\n const width = inputColorTexture.width;\n const height = inputColorTexture.height;\n\n const scatterFormat = ctx.colorFormat;\n const profileTable = SSSProfile.getTable(device);\n if (!profileTable) {\n this.passThrough(ctx, inputColorTexture, srgbOutput);\n return;\n }\n const fallback = this._profile ?? SSSProfile.getDefault();\n // Projection of a world-space length at unit depth into UV, per axis. Two\n // factors, not one: `m00` and `m11` differ by the aspect ratio, so a single\n // one turns the sampling disc into an ellipse. UE5 reaches the same pair by\n // building x from m00 and correcting y by `Extent.x / Extent.y`.\n const projMatrix = ctx.camera.getProjectionMatrix();\n this._projScale.setXY(\n // x: world length at unit depth, in horizontal UV\n 0.5 * projMatrix.m00,\n // y: world length at unit depth, in vertical UV\n 0.5 * projMatrix.m11\n );\n // Row of the fallback profile, used when a pixel's id is missing.\n this._profileParams.setXYZW(\n fallback.encodedId,\n 1 / SSSProfile.tableColumns,\n 1 / SSSProfile.tableRows,\n SSSProfile.tableRows\n );\n this._targetSize.setXYZW(width, height, 1 / width, 1 / height);\n this._cameraNearFar.setXY(ctx.camera.getNearPlane(), ctx.camera.getFarPlane());\n\n if (!SkinSSS._burleyProgram) {\n SkinSSS._burleyProgram = this.createBurleyProgram(ctx);\n }\n if (!SkinSSS._bvarProgram) {\n SkinSSS._bvarProgram = this.createBVarProgram(ctx);\n }\n if (!SkinSSS._recombineProgram) {\n SkinSSS._recombineProgram = this.createRecombineProgram(ctx);\n }\n\n const diffusedFB = device.pool.fetchTemporalFramebuffer(false, width, height, scatterFormat, null, false);\n const bvarFB = device.pool.fetchTemporalFramebuffer(false, width, height, scatterFormat, null, false);\n\n // --- Pass 1: Burley diffusion ---\n device.pushDeviceStates();\n try {\n if (!this._burleyBindGroup) {\n this._burleyBindGroup = device.createBindGroup(SkinSSS._burleyProgram.bindGroupLayouts[0]);\n }\n const bg = this._burleyBindGroup;\n bg.setTexture('sceneTex', inputColorTexture, fetchSampler('clamp_linear'));\n bg.setTexture('maskTex', maskTex, fetchSampler('clamp_linear'));\n // Nearest only: the id is a table row, and an interpolated one addresses a\n // profile neither neighbour has.\n bg.setTexture('profileIdTex', profileIdTex, fetchSampler('clamp_nearest_nomip'));\n bg.setTexture('depthTex', sceneDepthTexture, fetchSampler('clamp_nearest_nomip'));\n bg.setValue('cameraNearFar', this._cameraNearFar);\n bg.setValue('targetSize', this._targetSize);\n bg.setValue('projScale', this._projScale);\n bg.setValue('perspective', ctx.camera.isPerspective() ? 1 : 0);\n bg.setValue('profileParams', this._profileParams);\n bg.setTexture('profileTex', profileTable, fetchSampler('clamp_nearest_nomip'));\n bg.setTexture(\n 'thicknessTex',\n ctx.transmissionThicknessTexture ?? ShaderHelper.getDummyTransmissionThickness(device),\n fetchSampler('clamp_nearest')\n );\n bg.setValue('sampleCount', this._sampleCount);\n bg.setValue('debugMode', SKIN_SSS_DEBUG_OUTPUTS.indexOf(this._debugOutput));\n bg.setValue('debugExposure', this._debugExposure);\n // Intermediate passes always render into a texture, so on WebGPU they flip\n // unconditionally. `needFlip` cannot be used: it reports whatever target is\n // bound at the time, and these values are set before the pass binds its own.\n bg.setValue('flip', device.type === 'webgpu' ? 1 : 0);\n device.setProgram(SkinSSS._burleyProgram);\n device.setBindGroup(0, bg);\n device.setFramebuffer(diffusedFB);\n this.drawFullscreenQuad();\n } finally {\n device.popDeviceStates();\n }\n\n // --- Pass 2: BVar transmission ---\n device.pushDeviceStates();\n try {\n if (!this._bvarBindGroup) {\n this._bvarBindGroup = device.createBindGroup(SkinSSS._bvarProgram.bindGroupLayouts[0]);\n }\n const bg = this._bvarBindGroup;\n bg.setTexture(\n 'diffusedTex',\n diffusedFB.getColorAttachments()[0] as Texture2D,\n fetchSampler('clamp_linear')\n );\n bg.setTexture('depthTex', sceneDepthTexture, fetchSampler('clamp_nearest_nomip'));\n bg.setValue('targetSize', this._targetSize);\n bg.setValue('cameraNearFar', this._cameraNearFar);\n bg.setValue('flip', device.type === 'webgpu' ? 1 : 0);\n device.setProgram(SkinSSS._bvarProgram);\n device.setBindGroup(0, bg);\n device.setFramebuffer(bvarFB);\n this.drawFullscreenQuad();\n } finally {\n device.popDeviceStates();\n }\n\n // --- Pass 3: Recombine ---\n device.setFramebuffer(outputFramebuffer);\n if (!this._recombineBindGroup) {\n this._recombineBindGroup = device.createBindGroup(SkinSSS._recombineProgram.bindGroupLayouts[0]);\n }\n const rbg = this._recombineBindGroup;\n rbg.setTexture('colorTex', inputColorTexture, fetchSampler('clamp_linear'));\n rbg.setTexture('maskTex', maskTex, fetchSampler('clamp_linear'));\n rbg.setTexture('bvarTex', bvarFB.getColorAttachments()[0] as Texture2D, fetchSampler('clamp_linear'));\n rbg.setTexture('depthTex', sceneDepthTexture, fetchSampler('clamp_nearest_nomip'));\n rbg.setValue('cameraNearFar', this._cameraNearFar);\n rbg.setValue('targetSize', this._targetSize);\n rbg.setValue('debugMode', SKIN_SSS_DEBUG_OUTPUTS.indexOf(this._debugOutput));\n rbg.setValue('flip', this.needFlip(device) ? 1 : 0);\n rbg.setValue('srgbOut', srgbOutput ? 1 : 0);\n device.setProgram(SkinSSS._recombineProgram);\n device.setBindGroup(0, rbg);\n this.drawFullscreenQuad();\n device.pool.releaseFrameBuffer(diffusedFB);\n device.pool.releaseFrameBuffer(bvarFB);\n }\n\n private static fullscreenVertex(pb: any) {\n pb.getGlobalScope().flip = pb.int().uniform(0);\n pb.getGlobalScope().$inputs.pos = pb.vec2().attrib('position');\n pb.getGlobalScope().$outputs.uv = pb.vec2();\n pb.main(function (this: any) {\n this.$builtins.position = pb.vec4(this.$inputs.pos, DEPTH_FARTHEST, 1);\n this.$outputs.uv = pb.add(pb.mul(this.$inputs.pos.xy, 0.5), pb.vec2(0.5));\n this.$if(pb.notEqual(this.flip, 0), function (this: any) {\n this.$builtins.position.y = pb.neg(this.$builtins.position.y);\n });\n });\n }\n\n private createBurleyProgram(ctx: DrawContext) {\n // WebGL1 has no texture array sampling. This effect is WebGPU-only at\n // runtime, but its programs are still built for WebGL by the shader\n // generation tests, so the thickness debug view has to compile out there.\n const hasTextureArrays = ctx.device.type !== 'webgl';\n const program = ctx.device.buildRenderProgram({\n vertex(pb) {\n SkinSSS.fullscreenVertex(pb);\n },\n fragment(pb) {\n this.depthTex = pb.tex2D().sampleType('unfilterable-float').uniform(0);\n this.sceneTex = pb.tex2D().uniform(0);\n this.maskTex = pb.tex2D().uniform(0);\n this.profileIdTex = pb.tex2D().uniform(0);\n this.cameraNearFar = pb.vec2().uniform(0);\n this.targetSize = pb.vec4().uniform(0);\n this.projScale = pb.vec2().uniform(0);\n this.perspective = pb.int().uniform(0);\n this.profileParams = pb.vec4().uniform(0);\n this.profileTex = pb.tex2D().uniform(0);\n // Always declared so the cached program has one layout; a 1x1 dummy is\n // bound on frames without a transmission pass. Only the debug view reads\n // it — shading takes its thickness through the material, per light.\n if (hasTextureArrays) {\n this.thicknessTex = pb.tex2DArray().uniform(0);\n }\n this.sampleCount = pb.int().uniform(0);\n this.debugMode = pb.int().uniform(0);\n this.debugExposure = pb.float().uniform(0);\n this.$outputs.outColor = pb.vec4();\n pb.func('readDepth01', [pb.vec2('uv')], function () {\n this.$return(ShaderHelper.sampleLinearDepth(this, this.depthTex, this.uv, 0));\n });\n // UE5's spec/diff separation (SSS::Setup): SceneColor.a holds the diffuse\n // luminance, so the diffusible fraction is its ratio to the total.\n //\n // The skin mask comes from its own channel, never SceneColor.a, which\n // every opaque material writes 1 to. The alpha returned here is UE5's\n // subsurface Opacity, a continuous 0..1 scattering weight.\n pb.func('readDiffusible', [pb.vec2('uv')], function () {\n this.$l.scene = pb.textureSampleLevel(this.sceneTex, this.uv, 0);\n this.$l.opacity = pb.clamp(pb.textureSampleLevel(this.maskTex, this.uv, 0).a, 0, 1);\n this.$l.lum = pb.dot(this.scene.rgb, pb.vec3(0.2126, 0.7152, 0.0722));\n // Below the floor the ratio tracks brightness rather than the split, so\n // treat those pixels as fully diffusible - one that dark has no specular\n // worth preserving.\n //\n // `pb.select(x, y, cond)` is `cond ? y : x`, following WGSL's builtin\n // where the *false* value comes first. It reads like a ternary and is\n // not one.\n this.$l.diffAmt = pb.select(\n pb.float(1),\n pb.clamp(pb.div(this.scene.a, pb.max(this.lum, 1e-4)), 0, 1),\n pb.greaterThan(this.lum, 1e-4)\n );\n this.$return(pb.vec4(pb.mul(this.scene.rgb, this.diffAmt), this.opacity));\n });\n // Per-pixel profile id, from the depth prepass rather than the mask\n // buffer. Keeping them apart is what lets the opacity above be\n // continuous: one channel cannot carry a table row and a weight at once.\n pb.func('readProfileId', [pb.vec2('uv')], function () {\n this.$return(pb.textureSampleLevel(this.profileIdTex, this.uv, 0).r);\n });\n // --- Burley diffusion, transcribed from UE5's BurleyNormalizedSSSCommon.ush ---\n //\n // Radii are in profile space and unbounded: the inverse CDF produces them\n // directly and `burleyScale` converts them to a UV offset. There is\n // deliberately no sampling disc to normalize against - one would couple\n // the kernel shape to the mean free path.\n\n // GetSearchLightDiffuseScalingFactor: s = 3.5 + 100 (A - 0.33)^4.\n // This is the default of UE5's three scaling-factor variants.\n pb.func('scalingFactor', [pb.float('a')], function () {\n this.$l.v = pb.sub(this.a, 0.33);\n this.$l.v2 = pb.mul(this.v, this.v);\n this.$return(pb.add(3.5, pb.mul(100, this.v2, this.v2)));\n });\n pb.func('scalingFactor3D', [pb.vec3('a')], function () {\n this.$l.v = pb.sub(this.a, pb.vec3(0.33));\n this.$l.v2 = pb.mul(this.v, this.v);\n this.$return(pb.add(pb.vec3(3.5), pb.mul(pb.vec3(100), this.v2, this.v2)));\n });\n // RadiusRootFindByApproximation: d ((2 - 2.6) xi - 2) ln(1 - xi).\n pb.func('radiusRootApprox', [pb.float('d'), pb.float('xi')], function () {\n this.$l.x = pb.min(this.xi, 0.9999);\n this.$return(\n pb.mul(this.d, pb.sub(pb.mul(pb.sub(2, 2.6), this.x), 2), pb.log(pb.max(pb.sub(1, this.x), 1e-6)))\n );\n });\n // GetCDFDeriv1: 0.25/d (e^{-r/d} + e^{-r/3d}), clamped as CLAMP_PDF does.\n pb.func('burleyPdf', [pb.float('r'), pb.float('l'), pb.float('s')], function () {\n this.$l.d = pb.max(pb.div(this.l, this.s), 1e-6);\n this.$l.e1 = pb.exp(pb.neg(pb.min(pb.div(this.r, this.d), 40)));\n this.$l.e2 = pb.exp(pb.neg(pb.min(pb.div(this.r, pb.mul(this.d, 3)), 40)));\n this.$return(pb.max(pb.mul(pb.div(0.25, this.d), pb.add(this.e1, this.e2)), 1e-5));\n });\n // GetDiffuseReflectProfileWithDiffuseMeanFreePath: r R(r), per channel.\n // D = 1/s3d, R = radius/L, (e^{-R/D} + e^{-R/3D}) / (D L) / 8pi\n pb.func('diffusionProfile', [pb.vec3('l'), pb.vec3('s3d'), pb.float('radius')], function () {\n this.$l.D = pb.div(pb.vec3(1), pb.max(this.s3d, pb.vec3(1e-6)));\n this.$l.L = pb.max(this.l, pb.vec3(1e-6));\n this.$l.R = pb.div(pb.vec3(this.radius), this.L);\n this.$l.negRD = pb.div(pb.neg(this.R), this.D);\n this.$l.e1 = pb.exp(pb.max(this.negRD, pb.vec3(-40)));\n this.$l.e2 = pb.exp(pb.max(pb.div(this.negRD, 3), pb.vec3(-40)));\n this.$return(\n pb.max(pb.div(pb.add(this.e1, this.e2), pb.mul(this.D, this.L, 8 * Math.PI)), pb.vec3(1e-12))\n );\n });\n // GetCDF with XI = 0, used to weight the centre sample.\n pb.func('burleyCdf', [pb.float('d'), pb.float('x')], function () {\n this.$l.sd = pb.max(this.d, 1e-6);\n this.$return(\n pb.clamp(\n pb.sub(\n pb.sub(1, pb.mul(0.25, pb.exp(pb.neg(pb.min(pb.div(this.x, this.sd), 40))))),\n pb.mul(0.75, pb.exp(pb.neg(pb.min(pb.div(this.x, pb.mul(this.sd, 3)), 40))))\n ),\n 0,\n 1\n )\n );\n });\n // R2Sequence: the low-discrepancy pair UE5 samples radius and angle with.\n // The index must stay an integer - offsetting it by a per-pixel fraction\n // turns the sequence into a phase sweep correlated with pixel position,\n // which shows up as banding.\n pb.func('r2Sequence', [pb.int('i')], function () {\n this.$return(pb.fract(pb.mul(pb.vec2(0.7548776662466927, 0.5698402909980532), pb.float(this.i))));\n });\n // Fetch one parameter column of a profile row. `id` is the normalized\n // per-pixel profile id; rows are addressed by it directly, as UE5 does\n // with its SSProfiles table.\n pb.func('readProfile', [pb.float('id'), pb.float('column')], function () {\n this.$l.u = pb.mul(pb.add(this.column, 0.5), this.profileParams.y);\n this.$l.v = pb.mul(pb.add(pb.mul(pb.clamp(this.id, 0, 1), 255), 0.5), this.profileParams.z);\n this.$return(pb.textureSampleLevel(this.profileTex, pb.vec2(this.u, this.v), 0));\n });\n pb.func('readNormal', [pb.vec2('uv')], function () {\n this.$return(\n pb.normalize(pb.sub(pb.mul(pb.textureSampleLevel(this.maskTex, this.uv, 0).rgb, 2), pb.vec3(1)))\n );\n });\n pb.main(function () {\n this.$l.uv = this.$inputs.uv;\n this.$l.center = this.readDiffusible(this.uv);\n this.$l.centerId = this.readProfileId(this.uv);\n this.$l.centerDepth01 = this.readDepth01(this.uv);\n this.$outputs.outColor = this.center;\n // Two distinct tests: a pixel can carry a profile with zero opacity, or\n // an opacity with no profile where the prepass and the light pass\n // disagree about coverage. Neither scatters.\n this.$if(\n pb.and(\n pb.lessThan(this.centerDepth01, 1),\n pb.and(pb.greaterThan(this.center.a, 1e-4), pb.greaterThan(this.centerId, 0.5 / 255))\n ),\n function () {\n this.$l.centerDepth = pb.max(pb.mul(this.centerDepth01, this.cameraNearFar.y), 1e-4);\n this.$l.centerNormal = this.readNormal(this.uv);\n this.$l.scaling = this.readProfile(this.centerId, 0);\n this.$l.albedo = this.readProfile(this.centerId, 1);\n this.$l.mfp = this.readProfile(this.centerId, 2);\n this.$l.boundaryBleed = this.readProfile(this.centerId, 3).rgb;\n this.$l.worldUnitScale = pb.max(this.scaling.x, 1e-3);\n\n // UE5 draws the radius from one representative channel\n // (SurfaceAlbedo.a / DiffuseMeanFreePath.a) and evaluates all three\n // channel kernels at those radii.\n this.$l.aForSampling = this.albedo.w;\n this.$l.lForSampling = pb.max(this.mfp.w, 1e-6);\n this.$l.S = this.scalingFactor(this.aForSampling);\n this.$l.S3D = this.scalingFactor3D(this.albedo.rgb);\n this.$l.dForSampling = pb.div(this.lForSampling, pb.max(this.S, 1e-6));\n\n // CalculateBurleyScale: profile space to UV. Purely unit conversion,\n // including the 1/depth perspective term - nothing here shapes the\n // kernel.\n // Perspective divides the world radius by the view depth so the disc\n // keeps a constant world size as the subject recedes; orthographic\n // has no such term and takes 1.\n this.$l.viewScale = pb.max(\n pb.select(this.centerDepth, pb.float(1), pb.equal(this.perspective, 0)),\n 1e-4\n );\n // The world unit scale is applied here and only here; the packed\n // mean free path leaves it out, as UE5 does. Applying it in both\n // places would make the diffusion scale with its square. UE5's\n // extra cm-to-mm cast has no counterpart in this metric engine.\n this.$l.burleyScale = pb.div(pb.mul(this.projScale, this.worldUnitScale), this.viewScale);\n\n // Centre-sample reweighting: the radius within one texel and the CDF\n // mass it accounts for. Sampling then covers only [cdf, 1] and the\n // centre is lerped back in at the end. Averaged over the two axes,\n // as UE5's CalculateCenterSampleRadiusInMM does, since they carry\n // different scales.\n this.$l.centerRadiusMM = pb.mul(\n 0.5,\n pb.add(\n pb.div(this.targetSize.z, pb.max(this.burleyScale.x, 1e-9)),\n pb.div(this.targetSize.w, pb.max(this.burleyScale.y, 1e-9))\n )\n );\n this.$l.centerCdf = this.burleyCdf(this.dForSampling, this.centerRadiusMM);\n // Per-channel diffusion distance, the same `d` the kernel below is\n // evaluated with. UE5's scalar DiffuseMeanFreePath works there\n // because its `.a` and `.rgb` are related by construction; here `.a`\n // is simply the widest channel, so substituting it would flatten the\n // channel ratio - and invert it, since a smaller `d` concentrates\n // more CDF mass inside one texel.\n this.$l.dPerChannel = pb.div(this.mfp.rgb, pb.max(this.S3D, pb.vec3(1e-6)));\n this.$l.centerWeight = pb.vec3(\n this.burleyCdf(this.dPerChannel.x, this.centerRadiusMM),\n this.burleyCdf(this.dPerChannel.y, this.centerRadiusMM),\n this.burleyCdf(this.dPerChannel.z, this.centerRadiusMM)\n );\n\n // Integer sequence start, rebased per pixel so neighbours do not\n // draw the identical 64 taps. It must land on an integer to keep the\n // low-discrepancy spacing, as UE5's 16-bit `Rand3DPCG16` rebase does.\n //\n // UE5 also advances the seed per frame and leans on TAA to resolve\n // the remainder. Without that history a per-frame seed would read as\n // flicker, so this is held fixed and trades it for a stable error.\n this.$l.seedStart = pb.int(pb.mul(hash21(this, pb.mul(this.uv, this.targetSize.xy)), 65536));\n this.$l.radianceAccum = pb.vec3(0);\n this.$l.weightAccum = pb.vec3(0);\n this.$l.bleedAccum = pb.vec3(0);\n this.$l.acceptedCount = pb.float(0);\n this.$l.radiusSum = pb.float(0);\n this.$for(pb.int('i'), 0, DEFAULT_SAMPLE_COUNT, function () {\n this.$l.rand = this.r2Sequence(pb.add(this.seedStart, this.i));\n // Restrict the radius draw to the range the centre sample does not\n // already account for.\n this.$l.xi = pb.add(this.centerCdf, pb.mul(this.rand.x, pb.sub(1, this.centerCdf)));\n this.$l.radiusMM = pb.max(this.radiusRootApprox(this.dForSampling, this.xi), 1e-5);\n this.$l.pdf = this.burleyPdf(this.radiusMM, this.lForSampling, this.S);\n this.$l.theta = pb.mul(this.rand.y, 2 * Math.PI);\n this.$l.uvOffset = pb.mul(\n pb.vec2(pb.cos(this.theta), pb.sin(this.theta)),\n pb.mul(this.radiusMM, this.burleyScale)\n );\n this.$l.sampleUV = pb.clamp(pb.add(this.uv, this.uvOffset), pb.vec2(0), pb.vec2(1));\n this.$l.tapSample = this.readDiffusible(this.sampleUV);\n this.$l.sampleDepth01 = this.readDepth01(this.sampleUV);\n this.$l.sampleDepth = pb.max(pb.mul(this.sampleDepth01, this.cameraNearFar.y), 1e-4);\n this.$l.tapNormal = this.readNormal(this.sampleUV);\n this.$l.normalWeight = pb.sqrt(\n pb.clamp(pb.add(pb.mul(pb.dot(this.tapNormal, this.centerNormal), 0.5), 0.5), 0, 1)\n );\n // Bilateral term: the depth difference in the same millimetre\n // space as the radius, so a large world unit scale does not\n // over-penalize the sample. UE5 compares the two one-to-one.\n this.$l.deltaDepth = pb.div(pb.sub(this.sampleDepth, this.centerDepth), this.worldUnitScale);\n this.$l.radiusSampledMM = pb.sqrt(\n pb.add(pb.mul(this.radiusMM, this.radiusMM), pb.mul(this.deltaDepth, this.deltaDepth))\n );\n this.$l.profile = this.diffusionProfile(this.mfp.rgb, this.S3D, this.radiusSampledMM);\n this.$l.tapId = this.readProfileId(this.sampleUV);\n // The tap's own opacity, UE5's Opacity semantics: 0 contributes\n // nothing, 1 contributes fully, and the values between give the\n // smooth transition a painted mask is for.\n this.$l.tapOpacity = pb.select(\n pb.float(0),\n this.tapSample.a,\n pb.greaterThan(this.tapId, 0.5 / 255)\n );\n // A tap that is not skin falls back to the centre pixel rather\n // than dropping out of the estimator, for two reasons.\n //\n // Variance: this is self-normalized, so a dropped tap leaves both\n // sums. Beside a large non-skin region most of the disc lands in\n // it, and since the per-pixel seed is fixed, neighbouring pixels\n // survive on different taps - spatial white noise.\n //\n // Numerics: importance sampling is exact only for the channel the\n // radii were drawn from, so `profile/pdf` is constant for red\n // while blue decays to ~7e-9 in the tail. Dropping the near taps\n // leaves blue's `weightAccum` on the order of the 1e-9 floor\n // below, which clamps it to zero.\n //\n // The substitution assumes the hole scatters like the pixel under\n // consideration - the same assumption the centre-weighted blend\n // already makes - and costs a slightly firmer edge at the hole.\n this.$l.tapColor = pb.mix(this.center.rgb, this.tapSample.rgb, this.tapOpacity);\n this.$l.sampleWeight = pb.mul(pb.div(this.profile, this.pdf), this.normalWeight);\n // Taps from another profile are tinted rather than dropped, so a\n // face/lip boundary softens instead of seaming. The comparison is\n // against the prepass id now; 0.002 is still half a step of the\n // 8-bit channel it rides in.\n this.$l.sameProfile = pb.float(\n pb.or(\n pb.lessThan(pb.abs(pb.sub(this.tapId, this.centerId)), 0.002),\n pb.lessThan(this.tapOpacity, 1e-4)\n )\n );\n // Only taps that landed on skin contribute a bleed factor, and\n // both sides of the ratio carry the same opacity, so the mean\n // stays a tint in [bleed, 1]. Taps that fell back to the centre\n // are excluded: they carry the centre's own profile, so counting\n // them would dilute a real boundary tint towards white.\n this.bleedAccum = pb.add(\n this.bleedAccum,\n pb.mul(pb.mix(this.boundaryBleed, pb.vec3(1), this.sameProfile), this.tapOpacity)\n );\n this.acceptedCount = pb.add(this.acceptedCount, this.tapOpacity);\n this.radianceAccum = pb.add(this.radianceAccum, pb.mul(this.sampleWeight, this.tapColor));\n this.weightAccum = pb.add(this.weightAccum, this.sampleWeight);\n this.radiusSum = pb.add(this.radiusSum, this.radiusMM);\n });\n // Energy normalization, matching UE5's 1/0.99995 compensation.\n this.$l.diffused = pb.mul(\n pb.div(this.radianceAccum, pb.max(this.weightAccum, pb.vec3(1e-9))),\n 1 / 0.99995\n );\n // Mean bleed over the taps that landed on skin: a tint in [bleed, 1],\n // never a gain. A branch rather than `max(acceptedCount, 1)`, which\n // would only be correct for an integer count - this is a sum of\n // opacities, so a half-masked neighbourhood would be darkened by\n // exactly its own mask on top of the fade applied below.\n this.$l.bleedTint = pb.vec3(1);\n this.$if(pb.greaterThan(this.acceptedCount, 1e-4), function () {\n this.bleedTint = pb.div(this.bleedAccum, this.acceptedCount);\n });\n this.diffused = pb.mul(this.diffused, this.bleedTint);\n // Blend the centre pixel back in with the CDF mass it represents.\n this.diffused = pb.mix(this.diffused, this.center.rgb, this.centerWeight);\n // Per channel: importance sampling is exact only for the one the\n // radii were drawn from, so the three weights differ by orders of\n // magnitude and a single scalar test cannot speak for all of them.\n // Built as a mask rather than a vector-conditioned select, which\n // has no legal GLSL form - the ternary there takes a scalar only.\n this.$l.weightValid = pb.vec3(\n pb.float(pb.greaterThan(this.weightAccum.x, 0)),\n pb.float(pb.greaterThan(this.weightAccum.y, 0)),\n pb.float(pb.greaterThan(this.weightAccum.z, 0))\n );\n this.diffused = pb.mix(this.center.rgb, this.diffused, this.weightValid);\n // The centre's own opacity fades the whole result back towards the\n // unscattered pixel. Taps were already weighted by *their* opacity,\n // which controls how much the neighbourhood contributes; this\n // controls how much this pixel accepts. UE5 applies the same value\n // at both ends, which is what makes a painted mask read as a\n // gradient in scattering strength rather than as an edge.\n this.diffused = pb.mix(this.center.rgb, this.diffused, this.center.a);\n // Alpha is unused downstream; Recombine reads its own mask.\n this.$outputs.outColor = pb.vec4(pb.max(this.diffused, pb.vec3(0)), this.center.a);\n this.$if(pb.notEqual(this.debugMode, 0), function () {\n this.$l.dbg = pb.vec3(0);\n this.$if(pb.equal(this.debugMode, 1), function () {\n this.dbg = this.center.rgb;\n });\n this.$if(pb.equal(this.debugMode, 2), function () {\n this.$l.lum = pb.dot(\n pb.textureSampleLevel(this.sceneTex, this.uv, 0).rgb,\n pb.vec3(0.2126, 0.7152, 0.0722)\n );\n this.dbg = pb.vec3(\n pb.clamp(\n pb.div(pb.textureSampleLevel(this.sceneTex, this.uv, 0).a, pb.max(this.lum, 1e-4)),\n 0,\n 1\n )\n );\n });\n this.$if(pb.equal(this.debugMode, 3), function () {\n this.dbg = pb.vec3(pb.mul(this.centerId, 255 / 8));\n });\n this.$if(pb.equal(this.debugMode, 4), function () {\n this.dbg = pb.add(pb.mul(this.centerNormal, 0.5), pb.vec3(0.5));\n });\n this.$if(pb.equal(this.debugMode, 5), function () {\n // d in millimetres of world space, so skin reads around 1.\n this.dbg = pb.mul(this.dPerChannel, 1000);\n });\n this.$if(pb.equal(this.debugMode, 6), function () {\n // Mean vertical sample radius in pixels, 32 px mapped to white.\n this.dbg = pb.vec3(\n pb.div(\n pb.mul(\n pb.div(this.radiusSum, DEFAULT_SAMPLE_COUNT),\n this.burleyScale.y,\n this.targetSize.y\n ),\n 32\n )\n );\n });\n this.$if(pb.equal(this.debugMode, 7), function () {\n this.dbg = this.weightAccum;\n });\n this.$if(pb.equal(this.debugMode, 8), function () {\n this.dbg = pb.vec3(pb.div(this.acceptedCount, DEFAULT_SAMPLE_COUNT));\n });\n this.$if(pb.equal(this.debugMode, 9), function () {\n this.dbg = this.centerWeight;\n });\n this.$if(pb.equal(this.debugMode, 10), function () {\n this.dbg = this.diffused;\n });\n if (hasTextureArrays) {\n this.$if(pb.equal(this.debugMode, 11), function () {\n // Shown as optical depth (bright = thick), not the stored\n // encoding. An unobstructed surface stores 0.92, close enough\n // to the 1.0 of \"no light wrote this\" that blue calls the\n // latter out separately. The minimum over layer 0's four\n // channels shows whichever light sees the most material.\n this.$l.th = pb.textureArraySampleLevel(this.thicknessTex, this.uv, 0, 0);\n this.$l.enc = pb.min(pb.min(this.th.r, this.th.g), pb.min(this.th.b, this.th.a));\n this.$if(pb.greaterThan(this.enc, 0.999), function () {\n this.dbg = pb.vec3(0, 0, 1);\n }).$else(function () {\n this.dbg = pb.vec3(pb.sub(1, this.enc));\n });\n });\n }\n this.$outputs.outColor = pb.vec4(pb.mul(this.dbg, this.debugExposure), this.center.a);\n });\n }\n );\n });\n }\n })!;\n program.name = '@SkinSSSBurley';\n return program;\n }\n\n private createBVarProgram(ctx: DrawContext) {\n // Placeholder for UE5's `UpdateQualityVariance`, a luminance-residual history\n // that drives the next frame's adaptive sample count. Without a history buffer\n // there is nothing to accumulate, so this is a straight copy and the diffusion\n // always runs at full sample count; the pass is the slot history would occupy.\n const program = ctx.device.buildRenderProgram({\n vertex(pb) {\n SkinSSS.fullscreenVertex(pb);\n },\n fragment(pb) {\n this.diffusedTex = pb.tex2D().uniform(0);\n this.depthTex = pb.tex2D().sampleType('unfilterable-float').uniform(0);\n this.targetSize = pb.vec4().uniform(0);\n this.cameraNearFar = pb.vec2().uniform(0);\n this.$outputs.outColor = pb.vec4();\n pb.main(function () {\n this.$l.diffused = pb.textureSampleLevel(this.diffusedTex, this.$inputs.uv, 0);\n // Alpha is the subsurface opacity the diffusion wrote; it is passed\n // through unchanged rather than repurposed.\n this.$outputs.outColor = pb.vec4(this.diffused.rgb, this.diffused.a);\n });\n }\n })!;\n program.name = '@SkinSSSBVar';\n return program;\n }\n\n private createRecombineProgram(ctx: DrawContext) {\n const program = ctx.device.buildRenderProgram({\n vertex(pb) {\n SkinSSS.fullscreenVertex(pb);\n },\n fragment(pb) {\n this.colorTex = pb.tex2D().uniform(0);\n this.maskTex = pb.tex2D().uniform(0);\n this.bvarTex = pb.tex2D().uniform(0);\n this.depthTex = pb.tex2D().sampleType('unfilterable-float').uniform(0);\n this.cameraNearFar = pb.vec2().uniform(0);\n this.targetSize = pb.vec4().uniform(0);\n this.debugMode = pb.int().uniform(0);\n this.srgbOut = pb.int().uniform(0);\n this.$outputs.outColor = pb.vec4();\n pb.func('readDepth01', [pb.vec2('uv')], function () {\n this.$return(ShaderHelper.sampleLinearDepth(this, this.depthTex, this.uv, 0));\n });\n pb.main(function () {\n this.$l.uv = this.$inputs.uv;\n this.$l.baseColor = pb.textureSampleLevel(this.colorTex, this.uv, 0);\n this.$l.result = this.baseColor.rgb;\n this.$l.centerDepth01 = this.readDepth01(this.uv);\n // Subsurface opacity. A plain gate is right here: how strongly the\n // pixel scattered is already baked into the diffusion buffer, and\n // weighting by the opacity a second time would count it twice.\n this.$l.centerMask = pb.textureSampleLevel(this.maskTex, this.uv, 0).a;\n this.$if(\n pb.and(\n pb.equal(this.debugMode, 0),\n pb.and(pb.lessThan(this.centerDepth01, 1), pb.greaterThan(this.centerMask, 1e-4))\n ),\n function () {\n // UE5 SSS::Recombine (lines 32-40): split the lit pixel into the\n // diffuse part that was allowed to scatter and the specular part\n // that must survive untouched, then swap the diffuse for the\n // diffused version.\n this.$l.lum = pb.dot(this.baseColor.rgb, pb.vec3(0.2126, 0.7152, 0.0722));\n // Must match Burley's split exactly: that pass diffused\n // `baseColor.rgb * diffAmt` and this one keeps the remainder, so a\n // disagreement leaves the halves not adding up to the original.\n this.$l.diffAmt = pb.select(\n pb.float(1),\n pb.clamp(pb.div(this.baseColor.a, pb.max(this.lum, 1e-4)), 0, 1),\n pb.greaterThan(this.lum, 1e-4)\n );\n this.$l.specKeep = pb.mul(this.baseColor.rgb, pb.sub(1, this.diffAmt));\n // The diffusion buffer's alpha is the subsurface opacity, not a\n // transmission term - nothing in this pipeline produces one here.\n // UE5's transmission likewise comes from SubsurfaceProfileBxDF per\n // light, and the back-lit term on SSSMaterial that stands in for\n // it is already part of SceneColor.\n this.$l.diffused = pb.textureSampleLevel(this.bvarTex, this.uv, 0).rgb;\n // Straight sum, as UE5 does it. No blend weight or tint: how far and\n // in what colour the light travels is the profile's business, and a\n // second knob on top could only disagree with it.\n this.result = pb.max(pb.add(this.diffused, this.specKeep), pb.vec3(0));\n }\n );\n // A debug channel must reach the screen unmodified, so recombination is\n // skipped and the diffusion buffer is shown as it was written.\n this.$if(pb.notEqual(this.debugMode, 0), function () {\n this.result = pb.textureSampleLevel(this.bvarTex, this.uv, 0).rgb;\n });\n this.$if(pb.equal(this.srgbOut, 0), function () {\n this.$outputs.outColor = pb.vec4(this.result, this.baseColor.a);\n }).$else(function () {\n this.$outputs.outColor = pb.vec4(linearToGamma(this, this.result), this.baseColor.a);\n });\n });\n }\n })!;\n program.name = '@SkinSSSRecombine';\n return program;\n }\n}\n"],"names":["SKIN_SSS_DEBUG_OUTPUTS","DEFAULT_SAMPLE_COUNT","SkinSSS","AbstractPostEffect","_burleyProgram","_bvarProgram","_recombineProgram","_burleyBindGroup","_bvarBindGroup","_recombineBindGroup","_profile","_debugOutput","_debugExposure","_sampleCount","_projScale","_profileParams","_targetSize","_cameraNearFar","_layer","PostEffectLayer","opaque","Vector2","Vector4","profile","val","sampleCount","Math","max","min","round","debugExposure","debugOutput","includes","requireLinearDepthTexture","apply","ctx","inputColorTexture","sceneDepthTexture","srgbOutput","SSSMaskTexture","SSSProfileIdTexture","device","type","passThrough","outputFramebuffer","getFramebuffer","maskTex","profileIdTex","width","height","scatterFormat","colorFormat","profileTable","SSSProfile","getTable","fallback","getDefault","projMatrix","camera","getProjectionMatrix","setXY","m00","m11","setXYZW","encodedId","tableColumns","tableRows","getNearPlane","getFarPlane","createBurleyProgram","createBVarProgram","createRecombineProgram","diffusedFB","pool","fetchTemporalFramebuffer","bvarFB","pushDeviceStates","createBindGroup","bindGroupLayouts","bg","setTexture","fetchSampler","setValue","isPerspective","transmissionThicknessTexture","ShaderHelper","getDummyTransmissionThickness","indexOf","setProgram","setBindGroup","setFramebuffer","drawFullscreenQuad","popDeviceStates","getColorAttachments","rbg","needFlip","releaseFrameBuffer","fullscreenVertex","pb","getGlobalScope","flip","int","uniform","$inputs","pos","vec2","attrib","$outputs","uv","main","$builtins","position","vec4","DEPTH_FARTHEST","add","mul","xy","$if","notEqual","y","neg","hasTextureArrays","program","buildRenderProgram","vertex","fragment","depthTex","tex2D","sampleType","sceneTex","cameraNearFar","targetSize","projScale","perspective","profileParams","profileTex","thicknessTex","tex2DArray","debugMode","float","outColor","func","$return","sampleLinearDepth","$l","scene","textureSampleLevel","opacity","clamp","a","lum","dot","rgb","vec3","diffAmt","select","div","greaterThan","r","v","sub","v2","x","xi","d","log","l","s","e1","exp","e2","D","s3d","L","R","radius","negRD","PI","sd","fract","i","u","column","id","z","normalize","center","readDiffusible","centerId","readProfileId","centerDepth01","readDepth01","and","lessThan","centerDepth","centerNormal","readNormal","scaling","readProfile","albedo","mfp","boundaryBleed","worldUnitScale","aForSampling","w","lForSampling","S","scalingFactor","S3D","scalingFactor3D","dForSampling","viewScale","equal","burleyScale","centerRadiusMM","centerCdf","burleyCdf","dPerChannel","centerWeight","seedStart","hash21","radianceAccum","weightAccum","bleedAccum","acceptedCount","radiusSum","$for","rand","r2Sequence","radiusMM","radiusRootApprox","pdf","burleyPdf","theta","uvOffset","cos","sin","sampleUV","tapSample","sampleDepth01","sampleDepth","tapNormal","normalWeight","sqrt","deltaDepth","radiusSampledMM","diffusionProfile","tapId","tapOpacity","tapColor","mix","sampleWeight","sameProfile","or","abs","diffused","bleedTint","weightValid","dbg","th","textureArraySampleLevel","enc","g","b","$else","name","diffusedTex","colorTex","bvarTex","srgbOut","baseColor","result","centerMask","specKeep","linearToGamma"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA4CA,MAAMA,sBAA+C,GAAA;AACnD,IAAA,MAAA;AACA,IAAA,YAAA;AACA,IAAA,eAAA;AACA,IAAA,WAAA;AACA,IAAA,QAAA;AACA,IAAA,mBAAA;AACA,IAAA,cAAA;AACA,IAAA,QAAA;AACA,IAAA,YAAA;AACA,IAAA,cAAA;AACA,IAAA,UAAA;AACA,IAAA;AACD,CAAA;AAED;;;;;;;AAOC,IACD,MAAMC,oBAAuB,GAAA,EAAA;AAE7B;;;;;;;;;;;;;;;;IAiBO,MAAMC,OAAgBC,SAAAA,kBAAAA,CAAAA;AAC3B,IAAA,OAAeC,iBAAoC,IAAK;AACxD,IAAA,OAAeC,eAAkC,IAAK;AACtD,IAAA,OAAeC,oBAAuC,IAAK;IACnDC,gBAAmC;IACnCC,cAAiC;IACjCC,mBAAsC;IACtCC,QAA4B;IAC5BC,YAAiC;IACjCC,cAAuB;IACvBC,YAAqB;IACZC,UAAoB;IACpBC,cAAwB;IACxBC,WAAqB;IACrBC,cAAwB;IAEzC,WAAc,EAAA;QACZ,KAAK,EAAA;AACL,QAAA,IAAI,CAACC,MAAM,GAAGC,eAAAA,CAAgBC,MAAM;QACpC,IAAI,CAACb,gBAAgB,GAAG,IAAA;QACxB,IAAI,CAACC,cAAc,GAAG,IAAA;QACtB,IAAI,CAACC,mBAAmB,GAAG,IAAA;QAC3B,IAAI,CAACC,QAAQ,GAAG,IAAA;QAChB,IAAI,CAACC,YAAY,GAAG,MAAA;QACpB,IAAI,CAACC,cAAc,GAAG,CAAA;QACtB,IAAI,CAACC,YAAY,GAAGZ,oBAAAA;QACpB,IAAI,CAACa,UAAU,GAAG,IAAIO,OAAAA,EAAAA;QACtB,IAAI,CAACN,cAAc,GAAG,IAAIO,OAAAA,EAAAA;QAC1B,IAAI,CAACN,WAAW,GAAG,IAAIM,OAAAA,EAAAA;QACvB,IAAI,CAACL,cAAc,GAAG,IAAII,OAAAA,EAAAA;AAC5B;AAEA;;;;;;;;AAQC,MACD,IAAIE,OAA6B,GAAA;QAC/B,OAAO,IAAI,CAACb,QAAQ;AACtB;IACA,IAAIa,OAAAA,CAAQC,GAAsB,EAAE;QAClC,IAAI,CAACd,QAAQ,GAAGc,GAAO,IAAA,IAAA;AACzB;AACA,IAAA,IAAIC,WAAc,GAAA;QAChB,OAAO,IAAI,CAACZ,YAAY;AAC1B;IACA,IAAIY,WAAAA,CAAYD,GAAG,EAAE;AACnB,QAAA,IAAI,CAACX,YAAY,GAAGa,IAAAA,CAAKC,GAAG,CAAC,CAAA,EAAGD,IAAKE,CAAAA,GAAG,CAAC,EAAA,EAAIF,IAAKG,CAAAA,KAAK,CAACL,GAAOvB,IAAAA,oBAAAA,CAAAA,CAAAA,CAAAA;AACjE;AAEA;;;;;;;;;;AAUC,MACD,IAAI6B,aAAgB,GAAA;QAClB,OAAO,IAAI,CAAClB,cAAc;AAC5B;IACA,IAAIkB,aAAAA,CAAcN,GAAW,EAAE;AAC7B,QAAA,IAAI,CAACZ,cAAc,GAAGc,KAAKC,GAAG,CAAC,GAAGH,GAAO,IAAA,CAAA,CAAA;AAC3C;AAEA;;;;;;;AAOC,MACD,IAAIO,WAAkC,GAAA;QACpC,OAAO,IAAI,CAACpB,YAAY;AAC1B;IACA,IAAIoB,WAAAA,CAAYP,GAAuB,EAAE;AACvC,QAAA,IAAI,CAACb,YAAY,GAAGX,uBAAuBgC,QAAQ,CAACR,OAAOA,GAAM,GAAA,MAAA;AACnE;IAEAS,yBAA4B,GAAA;QAC1B,OAAO,IAAA;AACT;AAEAC,IAAAA,KAAAA,CAAMC,GAAgB,EAAEC,iBAA4B,EAAEC,iBAA4B,EAAEC,UAAmB,EAAE;AACvG,QAAA,IAAI,CAACH,GAAAA,CAAII,cAAc,IAAI,CAACJ,GAAAA,CAAIK,mBAAmB,IAAIL,GAAIM,CAAAA,MAAM,CAACC,IAAI,KAAK,QAAU,EAAA;AACnF,YAAA,IAAI,CAACC,WAAW,CAACR,GAAAA,EAAKC,iBAAmBE,EAAAA,UAAAA,CAAAA;AACzC,YAAA;AACF;QACA,MAAMG,MAAAA,GAASN,IAAIM,MAAM;QACzB,MAAMG,iBAAAA,GAAoBH,OAAOI,cAAc,EAAA;QAC/C,MAAMC,OAAAA,GAAUX,IAAII,cAAc;QAClC,MAAMQ,YAAAA,GAAeZ,IAAIK,mBAAmB;QAC5C,MAAMQ,KAAAA,GAAQZ,kBAAkBY,KAAK;QACrC,MAAMC,MAAAA,GAASb,kBAAkBa,MAAM;QAEvC,MAAMC,aAAAA,GAAgBf,IAAIgB,WAAW;QACrC,MAAMC,YAAAA,GAAeC,UAAWC,CAAAA,QAAQ,CAACb,MAAAA,CAAAA;AACzC,QAAA,IAAI,CAACW,YAAc,EAAA;AACjB,YAAA,IAAI,CAACT,WAAW,CAACR,GAAAA,EAAKC,iBAAmBE,EAAAA,UAAAA,CAAAA;AACzC,YAAA;AACF;AACA,QAAA,MAAMiB,WAAW,IAAI,CAAC7C,QAAQ,IAAI2C,WAAWG,UAAU,EAAA;;;;;AAKvD,QAAA,MAAMC,UAAatB,GAAAA,GAAAA,CAAIuB,MAAM,CAACC,mBAAmB,EAAA;AACjD,QAAA,IAAI,CAAC7C,UAAU,CAAC8C,KAAK;QAEnB,GAAMH,GAAAA,UAAAA,CAAWI,GAAG;AAEpB,QAAA,GAAA,GAAMJ,WAAWK,GAAG,CAAA;;AAGtB,QAAA,IAAI,CAAC/C,cAAc,CAACgD,OAAO,CACzBR,SAASS,SAAS,EAClB,CAAIX,GAAAA,UAAAA,CAAWY,YAAY,EAC3B,CAAA,GAAIZ,WAAWa,SAAS,EACxBb,WAAWa,SAAS,CAAA;QAEtB,IAAI,CAAClD,WAAW,CAAC+C,OAAO,CAACf,KAAOC,EAAAA,MAAAA,EAAQ,CAAID,GAAAA,KAAAA,EAAO,CAAIC,GAAAA,MAAAA,CAAAA;AACvD,QAAA,IAAI,CAAChC,cAAc,CAAC2C,KAAK,CAACzB,GAAAA,CAAIuB,MAAM,CAACS,YAAY,EAAA,EAAIhC,GAAIuB,CAAAA,MAAM,CAACU,WAAW,EAAA,CAAA;QAE3E,IAAI,CAAClE,OAAQE,CAAAA,cAAc,EAAE;AAC3BF,YAAAA,OAAAA,CAAQE,cAAc,GAAG,IAAI,CAACiE,mBAAmB,CAAClC,GAAAA,CAAAA;AACpD;QACA,IAAI,CAACjC,OAAQG,CAAAA,YAAY,EAAE;AACzBH,YAAAA,OAAAA,CAAQG,YAAY,GAAG,IAAI,CAACiE,iBAAiB,CAACnC,GAAAA,CAAAA;AAChD;QACA,IAAI,CAACjC,OAAQI,CAAAA,iBAAiB,EAAE;AAC9BJ,YAAAA,OAAAA,CAAQI,iBAAiB,GAAG,IAAI,CAACiE,sBAAsB,CAACpC,GAAAA,CAAAA;AAC1D;QAEA,MAAMqC,UAAAA,GAAa/B,MAAOgC,CAAAA,IAAI,CAACC,wBAAwB,CAAC,KAAO1B,EAAAA,KAAAA,EAAOC,MAAQC,EAAAA,aAAAA,EAAe,IAAM,EAAA,KAAA,CAAA;QACnG,MAAMyB,MAAAA,GAASlC,MAAOgC,CAAAA,IAAI,CAACC,wBAAwB,CAAC,KAAO1B,EAAAA,KAAAA,EAAOC,MAAQC,EAAAA,aAAAA,EAAe,IAAM,EAAA,KAAA,CAAA;;AAG/FT,QAAAA,MAAAA,CAAOmC,gBAAgB,EAAA;QACvB,IAAI;AACF,YAAA,IAAI,CAAC,IAAI,CAACrE,gBAAgB,EAAE;gBAC1B,IAAI,CAACA,gBAAgB,GAAGkC,MAAOoC,CAAAA,eAAe,CAAC3E,OAAAA,CAAQE,cAAc,CAAC0E,gBAAgB,CAAC,CAAE,CAAA,CAAA;AAC3F;YACA,MAAMC,EAAAA,GAAK,IAAI,CAACxE,gBAAgB;AAChCwE,YAAAA,EAAAA,CAAGC,UAAU,CAAC,UAAY5C,EAAAA,iBAAAA,EAAmB6C,YAAa,CAAA,cAAA,CAAA,CAAA;AAC1DF,YAAAA,EAAAA,CAAGC,UAAU,CAAC,SAAWlC,EAAAA,OAAAA,EAASmC,YAAa,CAAA,cAAA,CAAA,CAAA;;;AAG/CF,YAAAA,EAAAA,CAAGC,UAAU,CAAC,cAAgBjC,EAAAA,YAAAA,EAAckC,YAAa,CAAA,qBAAA,CAAA,CAAA;AACzDF,YAAAA,EAAAA,CAAGC,UAAU,CAAC,UAAY3C,EAAAA,iBAAAA,EAAmB4C,YAAa,CAAA,qBAAA,CAAA,CAAA;AAC1DF,YAAAA,EAAAA,CAAGG,QAAQ,CAAC,eAAiB,EAAA,IAAI,CAACjE,cAAc,CAAA;AAChD8D,YAAAA,EAAAA,CAAGG,QAAQ,CAAC,YAAc,EAAA,IAAI,CAAClE,WAAW,CAAA;AAC1C+D,YAAAA,EAAAA,CAAGG,QAAQ,CAAC,WAAa,EAAA,IAAI,CAACpE,UAAU,CAAA;YACxCiE,EAAGG,CAAAA,QAAQ,CAAC,aAAe/C,EAAAA,GAAAA,CAAIuB,MAAM,CAACyB,aAAa,KAAK,CAAI,GAAA,CAAA,CAAA;AAC5DJ,YAAAA,EAAAA,CAAGG,QAAQ,CAAC,eAAiB,EAAA,IAAI,CAACnE,cAAc,CAAA;AAChDgE,YAAAA,EAAAA,CAAGC,UAAU,CAAC,YAAc5B,EAAAA,YAAAA,EAAc6B,YAAa,CAAA,qBAAA,CAAA,CAAA;YACvDF,EAAGC,CAAAA,UAAU,CACX,cAAA,EACA7C,GAAIiD,CAAAA,4BAA4B,IAAIC,YAAaC,CAAAA,6BAA6B,CAAC7C,MAAAA,CAAAA,EAC/EwC,YAAa,CAAA,eAAA,CAAA,CAAA;AAEfF,YAAAA,EAAAA,CAAGG,QAAQ,CAAC,aAAe,EAAA,IAAI,CAACrE,YAAY,CAAA;YAC5CkE,EAAGG,CAAAA,QAAQ,CAAC,WAAalF,EAAAA,sBAAAA,CAAuBuF,OAAO,CAAC,IAAI,CAAC5E,YAAY,CAAA,CAAA;AACzEoE,YAAAA,EAAAA,CAAGG,QAAQ,CAAC,eAAiB,EAAA,IAAI,CAACtE,cAAc,CAAA;;;;AAIhDmE,YAAAA,EAAAA,CAAGG,QAAQ,CAAC,MAAA,EAAQzC,OAAOC,IAAI,KAAK,WAAW,CAAI,GAAA,CAAA,CAAA;YACnDD,MAAO+C,CAAAA,UAAU,CAACtF,OAAAA,CAAQE,cAAc,CAAA;YACxCqC,MAAOgD,CAAAA,YAAY,CAAC,CAAGV,EAAAA,EAAAA,CAAAA;AACvBtC,YAAAA,MAAAA,CAAOiD,cAAc,CAAClB,UAAAA,CAAAA;AACtB,YAAA,IAAI,CAACmB,kBAAkB,EAAA;SACf,QAAA;AACRlD,YAAAA,MAAAA,CAAOmD,eAAe,EAAA;AACxB;;AAGAnD,QAAAA,MAAAA,CAAOmC,gBAAgB,EAAA;QACvB,IAAI;AACF,YAAA,IAAI,CAAC,IAAI,CAACpE,cAAc,EAAE;gBACxB,IAAI,CAACA,cAAc,GAAGiC,MAAOoC,CAAAA,eAAe,CAAC3E,OAAAA,CAAQG,YAAY,CAACyE,gBAAgB,CAAC,CAAE,CAAA,CAAA;AACvF;YACA,MAAMC,EAAAA,GAAK,IAAI,CAACvE,cAAc;YAC9BuE,EAAGC,CAAAA,UAAU,CACX,aACAR,EAAAA,UAAAA,CAAWqB,mBAAmB,EAAE,CAAC,CAAE,CAAA,EACnCZ,YAAa,CAAA,cAAA,CAAA,CAAA;AAEfF,YAAAA,EAAAA,CAAGC,UAAU,CAAC,UAAY3C,EAAAA,iBAAAA,EAAmB4C,YAAa,CAAA,qBAAA,CAAA,CAAA;AAC1DF,YAAAA,EAAAA,CAAGG,QAAQ,CAAC,YAAc,EAAA,IAAI,CAAClE,WAAW,CAAA;AAC1C+D,YAAAA,EAAAA,CAAGG,QAAQ,CAAC,eAAiB,EAAA,IAAI,CAACjE,cAAc,CAAA;AAChD8D,YAAAA,EAAAA,CAAGG,QAAQ,CAAC,MAAA,EAAQzC,OAAOC,IAAI,KAAK,WAAW,CAAI,GAAA,CAAA,CAAA;YACnDD,MAAO+C,CAAAA,UAAU,CAACtF,OAAAA,CAAQG,YAAY,CAAA;YACtCoC,MAAOgD,CAAAA,YAAY,CAAC,CAAGV,EAAAA,EAAAA,CAAAA;AACvBtC,YAAAA,MAAAA,CAAOiD,cAAc,CAACf,MAAAA,CAAAA;AACtB,YAAA,IAAI,CAACgB,kBAAkB,EAAA;SACf,QAAA;AACRlD,YAAAA,MAAAA,CAAOmD,eAAe,EAAA;AACxB;;AAGAnD,QAAAA,MAAAA,CAAOiD,cAAc,CAAC9C,iBAAAA,CAAAA;AACtB,QAAA,IAAI,CAAC,IAAI,CAACnC,mBAAmB,EAAE;YAC7B,IAAI,CAACA,mBAAmB,GAAGgC,MAAOoC,CAAAA,eAAe,CAAC3E,OAAAA,CAAQI,iBAAiB,CAACwE,gBAAgB,CAAC,CAAE,CAAA,CAAA;AACjG;QACA,MAAMgB,GAAAA,GAAM,IAAI,CAACrF,mBAAmB;AACpCqF,QAAAA,GAAAA,CAAId,UAAU,CAAC,UAAY5C,EAAAA,iBAAAA,EAAmB6C,YAAa,CAAA,cAAA,CAAA,CAAA;AAC3Da,QAAAA,GAAAA,CAAId,UAAU,CAAC,SAAWlC,EAAAA,OAAAA,EAASmC,YAAa,CAAA,cAAA,CAAA,CAAA;QAChDa,GAAId,CAAAA,UAAU,CAAC,SAAWL,EAAAA,MAAAA,CAAOkB,mBAAmB,EAAE,CAAC,CAAE,CAAA,EAAeZ,YAAa,CAAA,cAAA,CAAA,CAAA;AACrFa,QAAAA,GAAAA,CAAId,UAAU,CAAC,UAAY3C,EAAAA,iBAAAA,EAAmB4C,YAAa,CAAA,qBAAA,CAAA,CAAA;AAC3Da,QAAAA,GAAAA,CAAIZ,QAAQ,CAAC,eAAiB,EAAA,IAAI,CAACjE,cAAc,CAAA;AACjD6E,QAAAA,GAAAA,CAAIZ,QAAQ,CAAC,YAAc,EAAA,IAAI,CAAClE,WAAW,CAAA;QAC3C8E,GAAIZ,CAAAA,QAAQ,CAAC,WAAalF,EAAAA,sBAAAA,CAAuBuF,OAAO,CAAC,IAAI,CAAC5E,YAAY,CAAA,CAAA;QAC1EmF,GAAIZ,CAAAA,QAAQ,CAAC,MAAQ,EAAA,IAAI,CAACa,QAAQ,CAACtD,UAAU,CAAI,GAAA,CAAA,CAAA;AACjDqD,QAAAA,GAAAA,CAAIZ,QAAQ,CAAC,SAAW5C,EAAAA,UAAAA,GAAa,CAAI,GAAA,CAAA,CAAA;QACzCG,MAAO+C,CAAAA,UAAU,CAACtF,OAAAA,CAAQI,iBAAiB,CAAA;QAC3CmC,MAAOgD,CAAAA,YAAY,CAAC,CAAGK,EAAAA,GAAAA,CAAAA;AACvB,QAAA,IAAI,CAACH,kBAAkB,EAAA;QACvBlD,MAAOgC,CAAAA,IAAI,CAACuB,kBAAkB,CAACxB,UAAAA,CAAAA;QAC/B/B,MAAOgC,CAAAA,IAAI,CAACuB,kBAAkB,CAACrB,MAAAA,CAAAA;AACjC;IAEA,OAAesB,gBAAAA,CAAiBC,EAAO,EAAE;QACvCA,EAAGC,CAAAA,cAAc,GAAGC,IAAI,GAAGF,GAAGG,GAAG,EAAA,CAAGC,OAAO,CAAC,CAAA,CAAA;QAC5CJ,EAAGC,CAAAA,cAAc,EAAGI,CAAAA,OAAO,CAACC,GAAG,GAAGN,EAAGO,CAAAA,IAAI,EAAGC,CAAAA,MAAM,CAAC,UAAA,CAAA;AACnDR,QAAAA,EAAAA,CAAGC,cAAc,EAAGQ,CAAAA,QAAQ,CAACC,EAAE,GAAGV,GAAGO,IAAI,EAAA;AACzCP,QAAAA,EAAAA,CAAGW,IAAI,CAAC,WAAA;AACN,YAAA,IAAI,CAACC,SAAS,CAACC,QAAQ,GAAGb,EAAGc,CAAAA,IAAI,CAAC,IAAI,CAACT,OAAO,CAACC,GAAG,EAAES,cAAgB,EAAA,CAAA,CAAA;YACpE,IAAI,CAACN,QAAQ,CAACC,EAAE,GAAGV,EAAGgB,CAAAA,GAAG,CAAChB,EAAAA,CAAGiB,GAAG,CAAC,IAAI,CAACZ,OAAO,CAACC,GAAG,CAACY,EAAE,EAAE,GAAA,CAAA,EAAMlB,EAAGO,CAAAA,IAAI,CAAC,GAAA,CAAA,CAAA;YACpE,IAAI,CAACY,GAAG,CAACnB,EAAGoB,CAAAA,QAAQ,CAAC,IAAI,CAAClB,IAAI,EAAE,CAAI,CAAA,EAAA,WAAA;AAClC,gBAAA,IAAI,CAACU,SAAS,CAACC,QAAQ,CAACQ,CAAC,GAAGrB,EAAAA,CAAGsB,GAAG,CAAC,IAAI,CAACV,SAAS,CAACC,QAAQ,CAACQ,CAAC,CAAA;AAC9D,aAAA,CAAA;AACF,SAAA,CAAA;AACF;AAEQlD,IAAAA,mBAAAA,CAAoBlC,GAAgB,EAAE;;;;AAI5C,QAAA,MAAMsF,gBAAmBtF,GAAAA,GAAAA,CAAIM,MAAM,CAACC,IAAI,KAAK,OAAA;AAC7C,QAAA,MAAMgF,OAAUvF,GAAAA,GAAAA,CAAIM,MAAM,CAACkF,kBAAkB,CAAC;AAC5CC,YAAAA,MAAAA,CAAAA,CAAO1B,EAAE,EAAA;AACPhG,gBAAAA,OAAAA,CAAQ+F,gBAAgB,CAACC,EAAAA,CAAAA;AAC3B,aAAA;AACA2B,YAAAA,QAAAA,CAAAA,CAAS3B,EAAE,EAAA;gBACT,IAAI,CAAC4B,QAAQ,GAAG5B,EAAG6B,CAAAA,KAAK,GAAGC,UAAU,CAAC,oBAAsB1B,CAAAA,CAAAA,OAAO,CAAC,CAAA,CAAA;AACpE,gBAAA,IAAI,CAAC2B,QAAQ,GAAG/B,GAAG6B,KAAK,EAAA,CAAGzB,OAAO,CAAC,CAAA,CAAA;AACnC,gBAAA,IAAI,CAACxD,OAAO,GAAGoD,GAAG6B,KAAK,EAAA,CAAGzB,OAAO,CAAC,CAAA,CAAA;AAClC,gBAAA,IAAI,CAACvD,YAAY,GAAGmD,GAAG6B,KAAK,EAAA,CAAGzB,OAAO,CAAC,CAAA,CAAA;AACvC,gBAAA,IAAI,CAAC4B,aAAa,GAAGhC,GAAGO,IAAI,EAAA,CAAGH,OAAO,CAAC,CAAA,CAAA;AACvC,gBAAA,IAAI,CAAC6B,UAAU,GAAGjC,GAAGc,IAAI,EAAA,CAAGV,OAAO,CAAC,CAAA,CAAA;AACpC,gBAAA,IAAI,CAAC8B,SAAS,GAAGlC,GAAGO,IAAI,EAAA,CAAGH,OAAO,CAAC,CAAA,CAAA;AACnC,gBAAA,IAAI,CAAC+B,WAAW,GAAGnC,GAAGG,GAAG,EAAA,CAAGC,OAAO,CAAC,CAAA,CAAA;AACpC,gBAAA,IAAI,CAACgC,aAAa,GAAGpC,GAAGc,IAAI,EAAA,CAAGV,OAAO,CAAC,CAAA,CAAA;AACvC,gBAAA,IAAI,CAACiC,UAAU,GAAGrC,GAAG6B,KAAK,EAAA,CAAGzB,OAAO,CAAC,CAAA,CAAA;;;;AAIrC,gBAAA,IAAImB,gBAAkB,EAAA;AACpB,oBAAA,IAAI,CAACe,YAAY,GAAGtC,GAAGuC,UAAU,EAAA,CAAGnC,OAAO,CAAC,CAAA,CAAA;AAC9C;AACA,gBAAA,IAAI,CAAC7E,WAAW,GAAGyE,GAAGG,GAAG,EAAA,CAAGC,OAAO,CAAC,CAAA,CAAA;AACpC,gBAAA,IAAI,CAACoC,SAAS,GAAGxC,GAAGG,GAAG,EAAA,CAAGC,OAAO,CAAC,CAAA,CAAA;AAClC,gBAAA,IAAI,CAACxE,aAAa,GAAGoE,GAAGyC,KAAK,EAAA,CAAGrC,OAAO,CAAC,CAAA,CAAA;AACxC,gBAAA,IAAI,CAACK,QAAQ,CAACiC,QAAQ,GAAG1C,GAAGc,IAAI,EAAA;gBAChCd,EAAG2C,CAAAA,IAAI,CAAC,aAAe,EAAA;AAAC3C,oBAAAA,EAAAA,CAAGO,IAAI,CAAC,IAAA;iBAAM,EAAE,WAAA;AACtC,oBAAA,IAAI,CAACqC,OAAO,CAACzD,YAAAA,CAAa0D,iBAAiB,CAAC,IAAI,EAAE,IAAI,CAACjB,QAAQ,EAAE,IAAI,CAAClB,EAAE,EAAE,CAAA,CAAA,CAAA;AAC5E,iBAAA,CAAA;;;;;;;gBAOAV,EAAG2C,CAAAA,IAAI,CAAC,gBAAkB,EAAA;AAAC3C,oBAAAA,EAAAA,CAAGO,IAAI,CAAC,IAAA;iBAAM,EAAE,WAAA;AACzC,oBAAA,IAAI,CAACuC,EAAE,CAACC,KAAK,GAAG/C,EAAGgD,CAAAA,kBAAkB,CAAC,IAAI,CAACjB,QAAQ,EAAE,IAAI,CAACrB,EAAE,EAAE,CAAA,CAAA;oBAC9D,IAAI,CAACoC,EAAE,CAACG,OAAO,GAAGjD,EAAGkD,CAAAA,KAAK,CAAClD,EAAAA,CAAGgD,kBAAkB,CAAC,IAAI,CAACpG,OAAO,EAAE,IAAI,CAAC8D,EAAE,EAAE,CAAA,CAAA,CAAGyC,CAAC,EAAE,CAAG,EAAA,CAAA,CAAA;AACjF,oBAAA,IAAI,CAACL,EAAE,CAACM,GAAG,GAAGpD,EAAAA,CAAGqD,GAAG,CAAC,IAAI,CAACN,KAAK,CAACO,GAAG,EAAEtD,GAAGuD,IAAI,CAAC,QAAQ,MAAQ,EAAA,MAAA,CAAA,CAAA;;;;;;;;AAQ7D,oBAAA,IAAI,CAACT,EAAE,CAACU,OAAO,GAAGxD,EAAAA,CAAGyD,MAAM,CACzBzD,EAAAA,CAAGyC,KAAK,CAAC,IACTzC,EAAGkD,CAAAA,KAAK,CAAClD,EAAG0D,CAAAA,GAAG,CAAC,IAAI,CAACX,KAAK,CAACI,CAAC,EAAEnD,EAAAA,CAAGvE,GAAG,CAAC,IAAI,CAAC2H,GAAG,EAAE,IAAQ,CAAA,CAAA,EAAA,CAAA,EAAG,IAC1DpD,EAAG2D,CAAAA,WAAW,CAAC,IAAI,CAACP,GAAG,EAAE,IAAA,CAAA,CAAA;oBAE3B,IAAI,CAACR,OAAO,CAAC5C,EAAAA,CAAGc,IAAI,CAACd,EAAAA,CAAGiB,GAAG,CAAC,IAAI,CAAC8B,KAAK,CAACO,GAAG,EAAE,IAAI,CAACE,OAAO,CAAA,EAAG,IAAI,CAACP,OAAO,CAAA,CAAA;AACzE,iBAAA,CAAA;;;;gBAIAjD,EAAG2C,CAAAA,IAAI,CAAC,eAAiB,EAAA;AAAC3C,oBAAAA,EAAAA,CAAGO,IAAI,CAAC,IAAA;iBAAM,EAAE,WAAA;AACxC,oBAAA,IAAI,CAACqC,OAAO,CAAC5C,EAAAA,CAAGgD,kBAAkB,CAAC,IAAI,CAACnG,YAAY,EAAE,IAAI,CAAC6D,EAAE,EAAE,GAAGkD,CAAC,CAAA;AACrE,iBAAA,CAAA;;;;;;;;;gBAUA5D,EAAG2C,CAAAA,IAAI,CAAC,eAAiB,EAAA;AAAC3C,oBAAAA,EAAAA,CAAGyC,KAAK,CAAC,GAAA;iBAAK,EAAE,WAAA;oBACxC,IAAI,CAACK,EAAE,CAACe,CAAC,GAAG7D,EAAG8D,CAAAA,GAAG,CAAC,IAAI,CAACX,CAAC,EAAE,IAAA,CAAA;AAC3B,oBAAA,IAAI,CAACL,EAAE,CAACiB,EAAE,GAAG/D,EAAGiB,CAAAA,GAAG,CAAC,IAAI,CAAC4C,CAAC,EAAE,IAAI,CAACA,CAAC,CAAA;AAClC,oBAAA,IAAI,CAACjB,OAAO,CAAC5C,EAAGgB,CAAAA,GAAG,CAAC,GAAKhB,EAAAA,EAAAA,CAAGiB,GAAG,CAAC,KAAK,IAAI,CAAC8C,EAAE,EAAE,IAAI,CAACA,EAAE,CAAA,CAAA,CAAA;AACvD,iBAAA,CAAA;gBACA/D,EAAG2C,CAAAA,IAAI,CAAC,iBAAmB,EAAA;AAAC3C,oBAAAA,EAAAA,CAAGuD,IAAI,CAAC,GAAA;iBAAK,EAAE,WAAA;AACzC,oBAAA,IAAI,CAACT,EAAE,CAACe,CAAC,GAAG7D,EAAG8D,CAAAA,GAAG,CAAC,IAAI,CAACX,CAAC,EAAEnD,EAAAA,CAAGuD,IAAI,CAAC,IAAA,CAAA,CAAA;AACnC,oBAAA,IAAI,CAACT,EAAE,CAACiB,EAAE,GAAG/D,EAAGiB,CAAAA,GAAG,CAAC,IAAI,CAAC4C,CAAC,EAAE,IAAI,CAACA,CAAC,CAAA;oBAClC,IAAI,CAACjB,OAAO,CAAC5C,EAAAA,CAAGgB,GAAG,CAAChB,EAAAA,CAAGuD,IAAI,CAAC,GAAMvD,CAAAA,EAAAA,EAAAA,CAAGiB,GAAG,CAACjB,EAAAA,CAAGuD,IAAI,CAAC,GAAM,CAAA,EAAA,IAAI,CAACQ,EAAE,EAAE,IAAI,CAACA,EAAE,CAAA,CAAA,CAAA;AACzE,iBAAA,CAAA;;gBAEA/D,EAAG2C,CAAAA,IAAI,CAAC,kBAAoB,EAAA;AAAC3C,oBAAAA,EAAAA,CAAGyC,KAAK,CAAC,GAAA,CAAA;AAAMzC,oBAAAA,EAAAA,CAAGyC,KAAK,CAAC,IAAA;iBAAM,EAAE,WAAA;oBAC3D,IAAI,CAACK,EAAE,CAACkB,CAAC,GAAGhE,EAAGtE,CAAAA,GAAG,CAAC,IAAI,CAACuI,EAAE,EAAE,MAAA,CAAA;AAC5B,oBAAA,IAAI,CAACrB,OAAO,CACV5C,EAAGiB,CAAAA,GAAG,CAAC,IAAI,CAACiD,CAAC,EAAElE,GAAG8D,GAAG,CAAC9D,GAAGiB,GAAG,CAACjB,GAAG8D,GAAG,CAAC,CAAG,EAAA,GAAA,CAAA,EAAM,IAAI,CAACE,CAAC,GAAG,CAAIhE,CAAAA,EAAAA,EAAAA,CAAGmE,GAAG,CAACnE,EAAAA,CAAGvE,GAAG,CAACuE,GAAG8D,GAAG,CAAC,GAAG,IAAI,CAACE,CAAC,CAAG,EAAA,IAAA,CAAA,CAAA,CAAA,CAAA;AAE/F,iBAAA,CAAA;;gBAEAhE,EAAG2C,CAAAA,IAAI,CAAC,WAAa,EAAA;AAAC3C,oBAAAA,EAAAA,CAAGyC,KAAK,CAAC,GAAA,CAAA;AAAMzC,oBAAAA,EAAAA,CAAGyC,KAAK,CAAC,GAAA,CAAA;AAAMzC,oBAAAA,EAAAA,CAAGyC,KAAK,CAAC,GAAA;iBAAK,EAAE,WAAA;AAClE,oBAAA,IAAI,CAACK,EAAE,CAACoB,CAAC,GAAGlE,EAAAA,CAAGvE,GAAG,CAACuE,EAAAA,CAAG0D,GAAG,CAAC,IAAI,CAACU,CAAC,EAAE,IAAI,CAACC,CAAC,CAAG,EAAA,IAAA,CAAA;oBAC3C,IAAI,CAACvB,EAAE,CAACwB,EAAE,GAAGtE,GAAGuE,GAAG,CAACvE,EAAGsB,CAAAA,GAAG,CAACtB,EAAAA,CAAGtE,GAAG,CAACsE,EAAAA,CAAG0D,GAAG,CAAC,IAAI,CAACE,CAAC,EAAE,IAAI,CAACM,CAAC,CAAG,EAAA,EAAA,CAAA,CAAA,CAAA;AAC1D,oBAAA,IAAI,CAACpB,EAAE,CAAC0B,EAAE,GAAGxE,EAAAA,CAAGuE,GAAG,CAACvE,EAAGsB,CAAAA,GAAG,CAACtB,EAAAA,CAAGtE,GAAG,CAACsE,EAAG0D,CAAAA,GAAG,CAAC,IAAI,CAACE,CAAC,EAAE5D,EAAAA,CAAGiB,GAAG,CAAC,IAAI,CAACiD,CAAC,EAAE,CAAK,CAAA,CAAA,EAAA,EAAA,CAAA,CAAA,CAAA;oBACrE,IAAI,CAACtB,OAAO,CAAC5C,EAAGvE,CAAAA,GAAG,CAACuE,EAAAA,CAAGiB,GAAG,CAACjB,EAAG0D,CAAAA,GAAG,CAAC,IAAA,EAAM,IAAI,CAACQ,CAAC,CAAA,EAAGlE,EAAGgB,CAAAA,GAAG,CAAC,IAAI,CAACsD,EAAE,EAAE,IAAI,CAACE,EAAE,CAAI,CAAA,EAAA,IAAA,CAAA,CAAA;AAC9E,iBAAA,CAAA;;;gBAGAxE,EAAG2C,CAAAA,IAAI,CAAC,kBAAoB,EAAA;AAAC3C,oBAAAA,EAAAA,CAAGuD,IAAI,CAAC,GAAA,CAAA;AAAMvD,oBAAAA,EAAAA,CAAGuD,IAAI,CAAC,KAAA,CAAA;AAAQvD,oBAAAA,EAAAA,CAAGyC,KAAK,CAAC,QAAA;iBAAU,EAAE,WAAA;oBAC9E,IAAI,CAACK,EAAE,CAAC2B,CAAC,GAAGzE,EAAG0D,CAAAA,GAAG,CAAC1D,EAAGuD,CAAAA,IAAI,CAAC,CAAIvD,CAAAA,EAAAA,EAAAA,CAAGvE,GAAG,CAAC,IAAI,CAACiJ,GAAG,EAAE1E,EAAGuD,CAAAA,IAAI,CAAC,IAAA,CAAA,CAAA,CAAA;AACxD,oBAAA,IAAI,CAACT,EAAE,CAAC6B,CAAC,GAAG3E,EAAGvE,CAAAA,GAAG,CAAC,IAAI,CAAC2I,CAAC,EAAEpE,EAAAA,CAAGuD,IAAI,CAAC,IAAA,CAAA,CAAA;AACnC,oBAAA,IAAI,CAACT,EAAE,CAAC8B,CAAC,GAAG5E,GAAG0D,GAAG,CAAC1D,EAAGuD,CAAAA,IAAI,CAAC,IAAI,CAACsB,MAAM,CAAG,EAAA,IAAI,CAACF,CAAC,CAAA;AAC/C,oBAAA,IAAI,CAAC7B,EAAE,CAACgC,KAAK,GAAG9E,GAAG0D,GAAG,CAAC1D,EAAGsB,CAAAA,GAAG,CAAC,IAAI,CAACsD,CAAC,CAAG,EAAA,IAAI,CAACH,CAAC,CAAA;AAC7C,oBAAA,IAAI,CAAC3B,EAAE,CAACwB,EAAE,GAAGtE,EAAAA,CAAGuE,GAAG,CAACvE,EAAAA,CAAGvE,GAAG,CAAC,IAAI,CAACqJ,KAAK,EAAE9E,EAAGuD,CAAAA,IAAI,CAAC,GAAC,CAAA,CAAA,CAAA;oBAChD,IAAI,CAACT,EAAE,CAAC0B,EAAE,GAAGxE,EAAGuE,CAAAA,GAAG,CAACvE,EAAAA,CAAGvE,GAAG,CAACuE,GAAG0D,GAAG,CAAC,IAAI,CAACoB,KAAK,EAAE,CAAI9E,CAAAA,EAAAA,EAAAA,CAAGuD,IAAI,CAAC,GAAC,CAAA,CAAA,CAAA;AAC3D,oBAAA,IAAI,CAACX,OAAO,CACV5C,EAAGvE,CAAAA,GAAG,CAACuE,EAAG0D,CAAAA,GAAG,CAAC1D,EAAAA,CAAGgB,GAAG,CAAC,IAAI,CAACsD,EAAE,EAAE,IAAI,CAACE,EAAE,CAAA,EAAGxE,GAAGiB,GAAG,CAAC,IAAI,CAACwD,CAAC,EAAE,IAAI,CAACE,CAAC,EAAE,CAAInJ,GAAAA,IAAAA,CAAKuJ,EAAE,CAAI/E,CAAAA,EAAAA,EAAAA,CAAGuD,IAAI,CAAC,KAAA,CAAA,CAAA,CAAA;AAE1F,iBAAA,CAAA;;gBAEAvD,EAAG2C,CAAAA,IAAI,CAAC,WAAa,EAAA;AAAC3C,oBAAAA,EAAAA,CAAGyC,KAAK,CAAC,GAAA,CAAA;AAAMzC,oBAAAA,EAAAA,CAAGyC,KAAK,CAAC,GAAA;iBAAK,EAAE,WAAA;oBACnD,IAAI,CAACK,EAAE,CAACkC,EAAE,GAAGhF,EAAGvE,CAAAA,GAAG,CAAC,IAAI,CAACyI,CAAC,EAAE,IAAA,CAAA;AAC5B,oBAAA,IAAI,CAACtB,OAAO,CACV5C,EAAAA,CAAGkD,KAAK,CACNlD,EAAG8D,CAAAA,GAAG,CACJ9D,EAAAA,CAAG8D,GAAG,CAAC,GAAG9D,EAAGiB,CAAAA,GAAG,CAAC,IAAA,EAAMjB,EAAGuE,CAAAA,GAAG,CAACvE,EAAAA,CAAGsB,GAAG,CAACtB,EAAAA,CAAGtE,GAAG,CAACsE,EAAG0D,CAAAA,GAAG,CAAC,IAAI,CAACM,CAAC,EAAE,IAAI,CAACgB,EAAE,CAAA,EAAG,EACrEhF,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,EAAAA,EAAAA,CAAGiB,GAAG,CAAC,IAAA,EAAMjB,EAAGuE,CAAAA,GAAG,CAACvE,EAAAA,CAAGsB,GAAG,CAACtB,GAAGtE,GAAG,CAACsE,EAAG0D,CAAAA,GAAG,CAAC,IAAI,CAACM,CAAC,EAAEhE,EAAGiB,CAAAA,GAAG,CAAC,IAAI,CAAC+D,EAAE,EAAE,CAAA,CAAA,CAAA,EAAK,SAExE,CACA,EAAA,CAAA,CAAA,CAAA;AAGN,iBAAA,CAAA;;;;;gBAKAhF,EAAG2C,CAAAA,IAAI,CAAC,YAAc,EAAA;AAAC3C,oBAAAA,EAAAA,CAAGG,GAAG,CAAC,GAAA;iBAAK,EAAE,WAAA;AACnC,oBAAA,IAAI,CAACyC,OAAO,CAAC5C,GAAGiF,KAAK,CAACjF,GAAGiB,GAAG,CAACjB,GAAGO,IAAI,CAAC,oBAAoB,kBAAqBP,CAAAA,EAAAA,EAAAA,CAAGyC,KAAK,CAAC,IAAI,CAACyC,CAAC,CAAA,CAAA,CAAA,CAAA;AAC/F,iBAAA,CAAA;;;;gBAIAlF,EAAG2C,CAAAA,IAAI,CAAC,aAAe,EAAA;AAAC3C,oBAAAA,EAAAA,CAAGyC,KAAK,CAAC,IAAA,CAAA;AAAOzC,oBAAAA,EAAAA,CAAGyC,KAAK,CAAC,QAAA;iBAAU,EAAE,WAAA;oBAC3D,IAAI,CAACK,EAAE,CAACqC,CAAC,GAAGnF,EAAGiB,CAAAA,GAAG,CAACjB,EAAGgB,CAAAA,GAAG,CAAC,IAAI,CAACoE,MAAM,EAAE,GAAA,CAAA,EAAM,IAAI,CAAChD,aAAa,CAACf,CAAC,CAAA;AACjE,oBAAA,IAAI,CAACyB,EAAE,CAACe,CAAC,GAAG7D,EAAAA,CAAGiB,GAAG,CAACjB,EAAGgB,CAAAA,GAAG,CAAChB,EAAAA,CAAGiB,GAAG,CAACjB,EAAGkD,CAAAA,KAAK,CAAC,IAAI,CAACmC,EAAE,EAAE,CAAA,EAAG,CAAI,CAAA,EAAA,GAAA,CAAA,EAAM,GAAM,CAAA,EAAA,IAAI,CAACjD,aAAa,CAACkD,CAAC,CAAA;oBAC1F,IAAI,CAAC1C,OAAO,CAAC5C,EAAAA,CAAGgD,kBAAkB,CAAC,IAAI,CAACX,UAAU,EAAErC,GAAGO,IAAI,CAAC,IAAI,CAAC4E,CAAC,EAAE,IAAI,CAACtB,CAAC,CAAG,EAAA,CAAA,CAAA,CAAA;AAC/E,iBAAA,CAAA;gBACA7D,EAAG2C,CAAAA,IAAI,CAAC,YAAc,EAAA;AAAC3C,oBAAAA,EAAAA,CAAGO,IAAI,CAAC,IAAA;iBAAM,EAAE,WAAA;AACrC,oBAAA,IAAI,CAACqC,OAAO,CACV5C,EAAAA,CAAGuF,SAAS,CAACvF,EAAG8D,CAAAA,GAAG,CAAC9D,EAAAA,CAAGiB,GAAG,CAACjB,EAAGgD,CAAAA,kBAAkB,CAAC,IAAI,CAACpG,OAAO,EAAE,IAAI,CAAC8D,EAAE,EAAE,CAAA,CAAA,CAAG4C,GAAG,EAAE,CAAItD,CAAAA,EAAAA,EAAAA,CAAGuD,IAAI,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA;AAEhG,iBAAA,CAAA;AACAvD,gBAAAA,EAAAA,CAAGW,IAAI,CAAC,WAAA;oBACN,IAAI,CAACmC,EAAE,CAACpC,EAAE,GAAG,IAAI,CAACL,OAAO,CAACK,EAAE;oBAC5B,IAAI,CAACoC,EAAE,CAAC0C,MAAM,GAAG,IAAI,CAACC,cAAc,CAAC,IAAI,CAAC/E,EAAE,CAAA;oBAC5C,IAAI,CAACoC,EAAE,CAAC4C,QAAQ,GAAG,IAAI,CAACC,aAAa,CAAC,IAAI,CAACjF,EAAE,CAAA;oBAC7C,IAAI,CAACoC,EAAE,CAAC8C,aAAa,GAAG,IAAI,CAACC,WAAW,CAAC,IAAI,CAACnF,EAAE,CAAA;AAChD,oBAAA,IAAI,CAACD,QAAQ,CAACiC,QAAQ,GAAG,IAAI,CAAC8C,MAAM;;;;AAIpC,oBAAA,IAAI,CAACrE,GAAG,CACNnB,EAAAA,CAAG8F,GAAG,CACJ9F,EAAAA,CAAG+F,QAAQ,CAAC,IAAI,CAACH,aAAa,EAAE,CAAA,CAAA,EAChC5F,GAAG8F,GAAG,CAAC9F,EAAG2D,CAAAA,WAAW,CAAC,IAAI,CAAC6B,MAAM,CAACrC,CAAC,EAAE,IAAA,CAAA,EAAOnD,EAAG2D,CAAAA,WAAW,CAAC,IAAI,CAAC+B,QAAQ,EAAE,MAAM,GAElF,CAAA,CAAA,CAAA,EAAA,WAAA;wBACE,IAAI,CAAC5C,EAAE,CAACkD,WAAW,GAAGhG,EAAGvE,CAAAA,GAAG,CAACuE,EAAGiB,CAAAA,GAAG,CAAC,IAAI,CAAC2E,aAAa,EAAE,IAAI,CAAC5D,aAAa,CAACX,CAAC,CAAG,EAAA,IAAA,CAAA;wBAC/E,IAAI,CAACyB,EAAE,CAACmD,YAAY,GAAG,IAAI,CAACC,UAAU,CAAC,IAAI,CAACxF,EAAE,CAAA;AAC9C,wBAAA,IAAI,CAACoC,EAAE,CAACqD,OAAO,GAAG,IAAI,CAACC,WAAW,CAAC,IAAI,CAACV,QAAQ,EAAE,CAAA,CAAA;AAClD,wBAAA,IAAI,CAAC5C,EAAE,CAACuD,MAAM,GAAG,IAAI,CAACD,WAAW,CAAC,IAAI,CAACV,QAAQ,EAAE,CAAA,CAAA;AACjD,wBAAA,IAAI,CAAC5C,EAAE,CAACwD,GAAG,GAAG,IAAI,CAACF,WAAW,CAAC,IAAI,CAACV,QAAQ,EAAE,CAAA,CAAA;AAC9C,wBAAA,IAAI,CAAC5C,EAAE,CAACyD,aAAa,GAAG,IAAI,CAACH,WAAW,CAAC,IAAI,CAACV,QAAQ,EAAE,GAAGpC,GAAG;AAC9D,wBAAA,IAAI,CAACR,EAAE,CAAC0D,cAAc,GAAGxG,EAAAA,CAAGvE,GAAG,CAAC,IAAI,CAAC0K,OAAO,CAACnC,CAAC,EAAE,IAAA,CAAA;;;;wBAKhD,IAAI,CAAClB,EAAE,CAAC2D,YAAY,GAAG,IAAI,CAACJ,MAAM,CAACK,CAAC;AACpC,wBAAA,IAAI,CAAC5D,EAAE,CAAC6D,YAAY,GAAG3G,EAAAA,CAAGvE,GAAG,CAAC,IAAI,CAAC6K,GAAG,CAACI,CAAC,EAAE,IAAA,CAAA;wBAC1C,IAAI,CAAC5D,EAAE,CAAC8D,CAAC,GAAG,IAAI,CAACC,aAAa,CAAC,IAAI,CAACJ,YAAY,CAAA;AAChD,wBAAA,IAAI,CAAC3D,EAAE,CAACgE,GAAG,GAAG,IAAI,CAACC,eAAe,CAAC,IAAI,CAACV,MAAM,CAAC/C,GAAG,CAAA;AAClD,wBAAA,IAAI,CAACR,EAAE,CAACkE,YAAY,GAAGhH,EAAAA,CAAG0D,GAAG,CAAC,IAAI,CAACiD,YAAY,EAAE3G,EAAGvE,CAAAA,GAAG,CAAC,IAAI,CAACmL,CAAC,EAAE,IAAA,CAAA,CAAA;;;;;;;wBAQhE,IAAI,CAAC9D,EAAE,CAACmE,SAAS,GAAGjH,EAAGvE,CAAAA,GAAG,CACxBuE,EAAAA,CAAGyD,MAAM,CAAC,IAAI,CAACuC,WAAW,EAAEhG,EAAAA,CAAGyC,KAAK,CAAC,CAAIzC,CAAAA,EAAAA,EAAAA,CAAGkH,KAAK,CAAC,IAAI,CAAC/E,WAAW,EAAE,CACpE,CAAA,CAAA,EAAA,IAAA,CAAA;;;;;wBAMF,IAAI,CAACW,EAAE,CAACqE,WAAW,GAAGnH,EAAG0D,CAAAA,GAAG,CAAC1D,EAAGiB,CAAAA,GAAG,CAAC,IAAI,CAACiB,SAAS,EAAE,IAAI,CAACsE,cAAc,CAAA,EAAG,IAAI,CAACS,SAAS,CAAA;;;;;;wBAOxF,IAAI,CAACnE,EAAE,CAACsE,cAAc,GAAGpH,EAAGiB,CAAAA,GAAG,CAC7B,GAAA,EACAjB,EAAGgB,CAAAA,GAAG,CACJhB,EAAG0D,CAAAA,GAAG,CAAC,IAAI,CAACzB,UAAU,CAACqD,CAAC,EAAEtF,EAAAA,CAAGvE,GAAG,CAAC,IAAI,CAAC0L,WAAW,CAACnD,CAAC,EAAE,QACrDhE,EAAG0D,CAAAA,GAAG,CAAC,IAAI,CAACzB,UAAU,CAACyE,CAAC,EAAE1G,GAAGvE,GAAG,CAAC,IAAI,CAAC0L,WAAW,CAAC9F,CAAC,EAAE,IAAA,CAAA,CAAA,CAAA,CAAA;AAGzD,wBAAA,IAAI,CAACyB,EAAE,CAACuE,SAAS,GAAG,IAAI,CAACC,SAAS,CAAC,IAAI,CAACN,YAAY,EAAE,IAAI,CAACI,cAAc,CAAA;;;;;;;wBAOzE,IAAI,CAACtE,EAAE,CAACyE,WAAW,GAAGvH,EAAG0D,CAAAA,GAAG,CAAC,IAAI,CAAC4C,GAAG,CAAChD,GAAG,EAAEtD,EAAGvE,CAAAA,GAAG,CAAC,IAAI,CAACqL,GAAG,EAAE9G,EAAGuD,CAAAA,IAAI,CAAC,IAAA,CAAA,CAAA,CAAA;wBACpE,IAAI,CAACT,EAAE,CAAC0E,YAAY,GAAGxH,EAAGuD,CAAAA,IAAI,CAC5B,IAAI,CAAC+D,SAAS,CAAC,IAAI,CAACC,WAAW,CAACvD,CAAC,EAAE,IAAI,CAACoD,cAAc,CAAA,EACtD,IAAI,CAACE,SAAS,CAAC,IAAI,CAACC,WAAW,CAAClG,CAAC,EAAE,IAAI,CAAC+F,cAAc,CACtD,EAAA,IAAI,CAACE,SAAS,CAAC,IAAI,CAACC,WAAW,CAACjC,CAAC,EAAE,IAAI,CAAC8B,cAAc,CAAA,CAAA;;;;;;;;wBAUxD,IAAI,CAACtE,EAAE,CAAC2E,SAAS,GAAGzH,EAAGG,CAAAA,GAAG,CAACH,EAAAA,CAAGiB,GAAG,CAACyG,MAAO,CAAA,IAAI,EAAE1H,EAAGiB,CAAAA,GAAG,CAAC,IAAI,CAACP,EAAE,EAAE,IAAI,CAACuB,UAAU,CAACf,EAAE,CAAI,CAAA,EAAA,KAAA,CAAA,CAAA;AACrF,wBAAA,IAAI,CAAC4B,EAAE,CAAC6E,aAAa,GAAG3H,EAAAA,CAAGuD,IAAI,CAAC,CAAA,CAAA;AAChC,wBAAA,IAAI,CAACT,EAAE,CAAC8E,WAAW,GAAG5H,EAAAA,CAAGuD,IAAI,CAAC,CAAA,CAAA;AAC9B,wBAAA,IAAI,CAACT,EAAE,CAAC+E,UAAU,GAAG7H,EAAAA,CAAGuD,IAAI,CAAC,CAAA,CAAA;AAC7B,wBAAA,IAAI,CAACT,EAAE,CAACgF,aAAa,GAAG9H,EAAAA,CAAGyC,KAAK,CAAC,CAAA,CAAA;AACjC,wBAAA,IAAI,CAACK,EAAE,CAACiF,SAAS,GAAG/H,EAAAA,CAAGyC,KAAK,CAAC,CAAA,CAAA;wBAC7B,IAAI,CAACuF,IAAI,CAAChI,EAAAA,CAAGG,GAAG,CAAC,GAAA,CAAA,EAAM,GAAGpG,oBAAsB,EAAA,WAAA;AAC9C,4BAAA,IAAI,CAAC+I,EAAE,CAACmF,IAAI,GAAG,IAAI,CAACC,UAAU,CAAClI,EAAGgB,CAAAA,GAAG,CAAC,IAAI,CAACyG,SAAS,EAAE,IAAI,CAACvC,CAAC,CAAA,CAAA;;;4BAG5D,IAAI,CAACpC,EAAE,CAACmB,EAAE,GAAGjE,EAAGgB,CAAAA,GAAG,CAAC,IAAI,CAACqG,SAAS,EAAErH,EAAAA,CAAGiB,GAAG,CAAC,IAAI,CAACgH,IAAI,CAACjE,CAAC,EAAEhE,EAAG8D,CAAAA,GAAG,CAAC,CAAA,EAAG,IAAI,CAACuD,SAAS,CAAA,CAAA,CAAA;AAChF,4BAAA,IAAI,CAACvE,EAAE,CAACqF,QAAQ,GAAGnI,EAAAA,CAAGvE,GAAG,CAAC,IAAI,CAAC2M,gBAAgB,CAAC,IAAI,CAACpB,YAAY,EAAE,IAAI,CAAC/C,EAAE,CAAG,EAAA,IAAA,CAAA;AAC7E,4BAAA,IAAI,CAACnB,EAAE,CAACuF,GAAG,GAAG,IAAI,CAACC,SAAS,CAAC,IAAI,CAACH,QAAQ,EAAE,IAAI,CAACxB,YAAY,EAAE,IAAI,CAACC,CAAC,CAAA;AACrE,4BAAA,IAAI,CAAC9D,EAAE,CAACyF,KAAK,GAAGvI,GAAGiB,GAAG,CAAC,IAAI,CAACgH,IAAI,CAAC5G,CAAC,EAAE,CAAA,GAAI7F,KAAKuJ,EAAE,CAAA;AAC/C,4BAAA,IAAI,CAACjC,EAAE,CAAC0F,QAAQ,GAAGxI,EAAGiB,CAAAA,GAAG,CACvBjB,EAAAA,CAAGO,IAAI,CAACP,EAAAA,CAAGyI,GAAG,CAAC,IAAI,CAACF,KAAK,CAAGvI,EAAAA,EAAAA,CAAG0I,GAAG,CAAC,IAAI,CAACH,KAAK,CAC7CvI,CAAAA,EAAAA,EAAAA,CAAGiB,GAAG,CAAC,IAAI,CAACkH,QAAQ,EAAE,IAAI,CAAChB,WAAW,CAAA,CAAA;4BAExC,IAAI,CAACrE,EAAE,CAAC6F,QAAQ,GAAG3I,GAAGkD,KAAK,CAAClD,EAAGgB,CAAAA,GAAG,CAAC,IAAI,CAACN,EAAE,EAAE,IAAI,CAAC8H,QAAQ,CAAA,EAAGxI,EAAGO,CAAAA,IAAI,CAAC,CAAA,CAAA,EAAIP,EAAGO,CAAAA,IAAI,CAAC,CAAA,CAAA,CAAA;4BAChF,IAAI,CAACuC,EAAE,CAAC8F,SAAS,GAAG,IAAI,CAACnD,cAAc,CAAC,IAAI,CAACkD,QAAQ,CAAA;4BACrD,IAAI,CAAC7F,EAAE,CAAC+F,aAAa,GAAG,IAAI,CAAChD,WAAW,CAAC,IAAI,CAAC8C,QAAQ,CAAA;4BACtD,IAAI,CAAC7F,EAAE,CAACgG,WAAW,GAAG9I,EAAGvE,CAAAA,GAAG,CAACuE,EAAGiB,CAAAA,GAAG,CAAC,IAAI,CAAC4H,aAAa,EAAE,IAAI,CAAC7G,aAAa,CAACX,CAAC,CAAG,EAAA,IAAA,CAAA;4BAC/E,IAAI,CAACyB,EAAE,CAACiG,SAAS,GAAG,IAAI,CAAC7C,UAAU,CAAC,IAAI,CAACyC,QAAQ,CAAA;AACjD,4BAAA,IAAI,CAAC7F,EAAE,CAACkG,YAAY,GAAGhJ,EAAAA,CAAGiJ,IAAI,CAC5BjJ,EAAGkD,CAAAA,KAAK,CAAClD,EAAAA,CAAGgB,GAAG,CAAChB,EAAAA,CAAGiB,GAAG,CAACjB,EAAGqD,CAAAA,GAAG,CAAC,IAAI,CAAC0F,SAAS,EAAE,IAAI,CAAC9C,YAAY,CAAG,EAAA,GAAA,CAAA,EAAM,MAAM,CAAG,EAAA,CAAA,CAAA,CAAA;;;;4BAKnF,IAAI,CAACnD,EAAE,CAACoG,UAAU,GAAGlJ,EAAG0D,CAAAA,GAAG,CAAC1D,EAAG8D,CAAAA,GAAG,CAAC,IAAI,CAACgF,WAAW,EAAE,IAAI,CAAC9C,WAAW,CAAA,EAAG,IAAI,CAACQ,cAAc,CAAA;AAC3F,4BAAA,IAAI,CAAC1D,EAAE,CAACqG,eAAe,GAAGnJ,EAAAA,CAAGiJ,IAAI,CAC/BjJ,EAAGgB,CAAAA,GAAG,CAAChB,EAAAA,CAAGiB,GAAG,CAAC,IAAI,CAACkH,QAAQ,EAAE,IAAI,CAACA,QAAQ,GAAGnI,EAAGiB,CAAAA,GAAG,CAAC,IAAI,CAACiI,UAAU,EAAE,IAAI,CAACA,UAAU,CAAA,CAAA,CAAA;4BAEtF,IAAI,CAACpG,EAAE,CAACzH,OAAO,GAAG,IAAI,CAAC+N,gBAAgB,CAAC,IAAI,CAAC9C,GAAG,CAAChD,GAAG,EAAE,IAAI,CAACwD,GAAG,EAAE,IAAI,CAACqC,eAAe,CAAA;4BACpF,IAAI,CAACrG,EAAE,CAACuG,KAAK,GAAG,IAAI,CAAC1D,aAAa,CAAC,IAAI,CAACgD,QAAQ,CAAA;;;;4BAIhD,IAAI,CAAC7F,EAAE,CAACwG,UAAU,GAAGtJ,GAAGyD,MAAM,CAC5BzD,EAAGyC,CAAAA,KAAK,CAAC,CAAA,CAAA,EACT,IAAI,CAACmG,SAAS,CAACzF,CAAC,EAChBnD,EAAAA,CAAG2D,WAAW,CAAC,IAAI,CAAC0F,KAAK,EAAE,GAAM,GAAA,GAAA,CAAA,CAAA;;;;;;;;;;;;;;;;;;4BAmBnC,IAAI,CAACvG,EAAE,CAACyG,QAAQ,GAAGvJ,EAAGwJ,CAAAA,GAAG,CAAC,IAAI,CAAChE,MAAM,CAAClC,GAAG,EAAE,IAAI,CAACsF,SAAS,CAACtF,GAAG,EAAE,IAAI,CAACgG,UAAU,CAAA;4BAC9E,IAAI,CAACxG,EAAE,CAAC2G,YAAY,GAAGzJ,EAAGiB,CAAAA,GAAG,CAACjB,EAAG0D,CAAAA,GAAG,CAAC,IAAI,CAACrI,OAAO,EAAE,IAAI,CAACgN,GAAG,CAAA,EAAG,IAAI,CAACW,YAAY,CAAA;;;;;AAK/E,4BAAA,IAAI,CAAClG,EAAE,CAAC4G,WAAW,GAAG1J,EAAGyC,CAAAA,KAAK,CAC5BzC,EAAAA,CAAG2J,EAAE,CACH3J,EAAAA,CAAG+F,QAAQ,CAAC/F,GAAG4J,GAAG,CAAC5J,EAAG8D,CAAAA,GAAG,CAAC,IAAI,CAACuF,KAAK,EAAE,IAAI,CAAC3D,QAAQ,CAAI,CAAA,EAAA,KAAA,CAAA,EACvD1F,GAAG+F,QAAQ,CAAC,IAAI,CAACuD,UAAU,EAAE,IAAA,CAAA,CAAA,CAAA;;;;;;AAQjC,4BAAA,IAAI,CAACzB,UAAU,GAAG7H,EAAAA,CAAGgB,GAAG,CACtB,IAAI,CAAC6G,UAAU,EACf7H,EAAGiB,CAAAA,GAAG,CAACjB,EAAGwJ,CAAAA,GAAG,CAAC,IAAI,CAACjD,aAAa,EAAEvG,EAAAA,CAAGuD,IAAI,CAAC,CAAI,CAAA,EAAA,IAAI,CAACmG,WAAW,CAAG,EAAA,IAAI,CAACJ,UAAU,CAAA,CAAA;AAElF,4BAAA,IAAI,CAACxB,aAAa,GAAG9H,EAAAA,CAAGgB,GAAG,CAAC,IAAI,CAAC8G,aAAa,EAAE,IAAI,CAACwB,UAAU,CAAA;AAC/D,4BAAA,IAAI,CAAC3B,aAAa,GAAG3H,GAAGgB,GAAG,CAAC,IAAI,CAAC2G,aAAa,EAAE3H,EAAGiB,CAAAA,GAAG,CAAC,IAAI,CAACwI,YAAY,EAAE,IAAI,CAACF,QAAQ,CAAA,CAAA;AACvF,4BAAA,IAAI,CAAC3B,WAAW,GAAG5H,EAAAA,CAAGgB,GAAG,CAAC,IAAI,CAAC4G,WAAW,EAAE,IAAI,CAAC6B,YAAY,CAAA;AAC7D,4BAAA,IAAI,CAAC1B,SAAS,GAAG/H,EAAAA,CAAGgB,GAAG,CAAC,IAAI,CAAC+G,SAAS,EAAE,IAAI,CAACI,QAAQ,CAAA;AACvD,yBAAA,CAAA;;wBAEA,IAAI,CAACrF,EAAE,CAAC+G,QAAQ,GAAG7J,EAAGiB,CAAAA,GAAG,CACvBjB,EAAAA,CAAG0D,GAAG,CAAC,IAAI,CAACiE,aAAa,EAAE3H,EAAAA,CAAGvE,GAAG,CAAC,IAAI,CAACmM,WAAW,EAAE5H,EAAGuD,CAAAA,IAAI,CAAC,IAAA,CAAA,CAAA,CAAA,EAC5D,CAAI,GAAA,OAAA,CAAA;;;;;;AAON,wBAAA,IAAI,CAACT,EAAE,CAACgH,SAAS,GAAG9J,EAAAA,CAAGuD,IAAI,CAAC,CAAA,CAAA;wBAC5B,IAAI,CAACpC,GAAG,CAACnB,EAAG2D,CAAAA,WAAW,CAAC,IAAI,CAACmE,aAAa,EAAE,IAAO,CAAA,EAAA,WAAA;AACjD,4BAAA,IAAI,CAACgC,SAAS,GAAG9J,EAAAA,CAAG0D,GAAG,CAAC,IAAI,CAACmE,UAAU,EAAE,IAAI,CAACC,aAAa,CAAA;AAC7D,yBAAA,CAAA;AACA,wBAAA,IAAI,CAAC+B,QAAQ,GAAG7J,EAAAA,CAAGiB,GAAG,CAAC,IAAI,CAAC4I,QAAQ,EAAE,IAAI,CAACC,SAAS,CAAA;;AAEpD,wBAAA,IAAI,CAACD,QAAQ,GAAG7J,GAAGwJ,GAAG,CAAC,IAAI,CAACK,QAAQ,EAAE,IAAI,CAACrE,MAAM,CAAClC,GAAG,EAAE,IAAI,CAACkE,YAAY,CAAA;;;;;;wBAMxE,IAAI,CAAC1E,EAAE,CAACiH,WAAW,GAAG/J,EAAGuD,CAAAA,IAAI,CAC3BvD,EAAGyC,CAAAA,KAAK,CAACzC,EAAG2D,CAAAA,WAAW,CAAC,IAAI,CAACiE,WAAW,CAAC5D,CAAC,EAAE,CAC5ChE,CAAAA,CAAAA,EAAAA,EAAAA,CAAGyC,KAAK,CAACzC,EAAAA,CAAG2D,WAAW,CAAC,IAAI,CAACiE,WAAW,CAACvG,CAAC,EAAE,CAAA,CAAA,CAAA,EAC5CrB,GAAGyC,KAAK,CAACzC,GAAG2D,WAAW,CAAC,IAAI,CAACiE,WAAW,CAACtC,CAAC,EAAE,CAAA,CAAA,CAAA,CAAA;AAE9C,wBAAA,IAAI,CAACuE,QAAQ,GAAG7J,GAAGwJ,GAAG,CAAC,IAAI,CAAChE,MAAM,CAAClC,GAAG,EAAE,IAAI,CAACuG,QAAQ,EAAE,IAAI,CAACE,WAAW,CAAA;;;;;;;wBAOvE,IAAI,CAACF,QAAQ,GAAG7J,EAAAA,CAAGwJ,GAAG,CAAC,IAAI,CAAChE,MAAM,CAAClC,GAAG,EAAE,IAAI,CAACuG,QAAQ,EAAE,IAAI,CAACrE,MAAM,CAACrC,CAAC,CAAA;;wBAEpE,IAAI,CAAC1C,QAAQ,CAACiC,QAAQ,GAAG1C,EAAGc,CAAAA,IAAI,CAACd,EAAAA,CAAGvE,GAAG,CAAC,IAAI,CAACoO,QAAQ,EAAE7J,EAAAA,CAAGuD,IAAI,CAAC,KAAK,IAAI,CAACiC,MAAM,CAACrC,CAAC,CAAA;wBACjF,IAAI,CAAChC,GAAG,CAACnB,EAAGoB,CAAAA,QAAQ,CAAC,IAAI,CAACoB,SAAS,EAAE,CAAI,CAAA,EAAA,WAAA;AACvC,4BAAA,IAAI,CAACM,EAAE,CAACkH,GAAG,GAAGhK,EAAAA,CAAGuD,IAAI,CAAC,CAAA,CAAA;4BACtB,IAAI,CAACpC,GAAG,CAACnB,EAAGkH,CAAAA,KAAK,CAAC,IAAI,CAAC1E,SAAS,EAAE,CAAI,CAAA,EAAA,WAAA;AACpC,gCAAA,IAAI,CAACwH,GAAG,GAAG,IAAI,CAACxE,MAAM,CAAClC,GAAG;AAC5B,6BAAA,CAAA;4BACA,IAAI,CAACnC,GAAG,CAACnB,EAAGkH,CAAAA,KAAK,CAAC,IAAI,CAAC1E,SAAS,EAAE,CAAI,CAAA,EAAA,WAAA;gCACpC,IAAI,CAACM,EAAE,CAACM,GAAG,GAAGpD,EAAGqD,CAAAA,GAAG,CAClBrD,EAAAA,CAAGgD,kBAAkB,CAAC,IAAI,CAACjB,QAAQ,EAAE,IAAI,CAACrB,EAAE,EAAE,CAAA,CAAA,CAAG4C,GAAG,EACpDtD,EAAGuD,CAAAA,IAAI,CAAC,MAAA,EAAQ,MAAQ,EAAA,MAAA,CAAA,CAAA;AAE1B,gCAAA,IAAI,CAACyG,GAAG,GAAGhK,EAAAA,CAAGuD,IAAI,CAChBvD,EAAAA,CAAGkD,KAAK,CACNlD,GAAG0D,GAAG,CAAC1D,EAAGgD,CAAAA,kBAAkB,CAAC,IAAI,CAACjB,QAAQ,EAAE,IAAI,CAACrB,EAAE,EAAE,GAAGyC,CAAC,EAAEnD,EAAGvE,CAAAA,GAAG,CAAC,IAAI,CAAC2H,GAAG,EAAE,QAC5E,CACA,EAAA,CAAA,CAAA,CAAA;AAGN,6BAAA,CAAA;4BACA,IAAI,CAACjC,GAAG,CAACnB,EAAGkH,CAAAA,KAAK,CAAC,IAAI,CAAC1E,SAAS,EAAE,CAAI,CAAA,EAAA,WAAA;AACpC,gCAAA,IAAI,CAACwH,GAAG,GAAGhK,EAAAA,CAAGuD,IAAI,CAACvD,EAAGiB,CAAAA,GAAG,CAAC,IAAI,CAACyE,QAAQ,EAAE,GAAM,GAAA,CAAA,CAAA,CAAA;AACjD,6BAAA,CAAA;4BACA,IAAI,CAACvE,GAAG,CAACnB,EAAGkH,CAAAA,KAAK,CAAC,IAAI,CAAC1E,SAAS,EAAE,CAAI,CAAA,EAAA,WAAA;AACpC,gCAAA,IAAI,CAACwH,GAAG,GAAGhK,EAAGgB,CAAAA,GAAG,CAAChB,EAAGiB,CAAAA,GAAG,CAAC,IAAI,CAACgF,YAAY,EAAE,GAAMjG,CAAAA,EAAAA,EAAAA,CAAGuD,IAAI,CAAC,GAAA,CAAA,CAAA;AAC5D,6BAAA,CAAA;4BACA,IAAI,CAACpC,GAAG,CAACnB,EAAGkH,CAAAA,KAAK,CAAC,IAAI,CAAC1E,SAAS,EAAE,CAAI,CAAA,EAAA,WAAA;;gCAEpC,IAAI,CAACwH,GAAG,GAAGhK,EAAAA,CAAGiB,GAAG,CAAC,IAAI,CAACsG,WAAW,EAAE,IAAA,CAAA;AACtC,6BAAA,CAAA;4BACA,IAAI,CAACpG,GAAG,CAACnB,EAAGkH,CAAAA,KAAK,CAAC,IAAI,CAAC1E,SAAS,EAAE,CAAI,CAAA,EAAA,WAAA;;AAEpC,gCAAA,IAAI,CAACwH,GAAG,GAAGhK,EAAAA,CAAGuD,IAAI,CAChBvD,EAAG0D,CAAAA,GAAG,CACJ1D,EAAAA,CAAGiB,GAAG,CACJjB,GAAG0D,GAAG,CAAC,IAAI,CAACqE,SAAS,EAAEhO,oBACvB,CAAA,EAAA,IAAI,CAACoN,WAAW,CAAC9F,CAAC,EAClB,IAAI,CAACY,UAAU,CAACZ,CAAC,CAEnB,EAAA,EAAA,CAAA,CAAA;AAGN,6BAAA,CAAA;4BACA,IAAI,CAACF,GAAG,CAACnB,EAAGkH,CAAAA,KAAK,CAAC,IAAI,CAAC1E,SAAS,EAAE,CAAI,CAAA,EAAA,WAAA;AACpC,gCAAA,IAAI,CAACwH,GAAG,GAAG,IAAI,CAACpC,WAAW;AAC7B,6BAAA,CAAA;4BACA,IAAI,CAACzG,GAAG,CAACnB,EAAGkH,CAAAA,KAAK,CAAC,IAAI,CAAC1E,SAAS,EAAE,CAAI,CAAA,EAAA,WAAA;AACpC,gCAAA,IAAI,CAACwH,GAAG,GAAGhK,EAAAA,CAAGuD,IAAI,CAACvD,EAAG0D,CAAAA,GAAG,CAAC,IAAI,CAACoE,aAAa,EAAE/N,oBAAAA,CAAAA,CAAAA;AAChD,6BAAA,CAAA;4BACA,IAAI,CAACoH,GAAG,CAACnB,EAAGkH,CAAAA,KAAK,CAAC,IAAI,CAAC1E,SAAS,EAAE,CAAI,CAAA,EAAA,WAAA;AACpC,gCAAA,IAAI,CAACwH,GAAG,GAAG,IAAI,CAACxC,YAAY;AAC9B,6BAAA,CAAA;4BACA,IAAI,CAACrG,GAAG,CAACnB,EAAGkH,CAAAA,KAAK,CAAC,IAAI,CAAC1E,SAAS,EAAE,EAAK,CAAA,EAAA,WAAA;AACrC,gCAAA,IAAI,CAACwH,GAAG,GAAG,IAAI,CAACH,QAAQ;AAC1B,6BAAA,CAAA;AACA,4BAAA,IAAItI,gBAAkB,EAAA;gCACpB,IAAI,CAACJ,GAAG,CAACnB,EAAGkH,CAAAA,KAAK,CAAC,IAAI,CAAC1E,SAAS,EAAE,EAAK,CAAA,EAAA,WAAA;;;;;;AAMrC,oCAAA,IAAI,CAACM,EAAE,CAACmH,EAAE,GAAGjK,GAAGkK,uBAAuB,CAAC,IAAI,CAAC5H,YAAY,EAAE,IAAI,CAAC5B,EAAE,EAAE,CAAG,EAAA,CAAA,CAAA;AACvE,oCAAA,IAAI,CAACoC,EAAE,CAACqH,GAAG,GAAGnK,GAAGtE,GAAG,CAACsE,EAAGtE,CAAAA,GAAG,CAAC,IAAI,CAACuO,EAAE,CAACrG,CAAC,EAAE,IAAI,CAACqG,EAAE,CAACG,CAAC,CAAA,EAAGpK,EAAGtE,CAAAA,GAAG,CAAC,IAAI,CAACuO,EAAE,CAACI,CAAC,EAAE,IAAI,CAACJ,EAAE,CAAC9G,CAAC,CAAA,CAAA;oCAC9E,IAAI,CAAChC,GAAG,CAACnB,EAAG2D,CAAAA,WAAW,CAAC,IAAI,CAACwG,GAAG,EAAE,KAAQ,CAAA,EAAA,WAAA;AACxC,wCAAA,IAAI,CAACH,GAAG,GAAGhK,GAAGuD,IAAI,CAAC,GAAG,CAAG,EAAA,CAAA,CAAA;AAC3B,qCAAA,CAAA,CAAG+G,KAAK,CAAC,WAAA;AACP,wCAAA,IAAI,CAACN,GAAG,GAAGhK,EAAAA,CAAGuD,IAAI,CAACvD,EAAG8D,CAAAA,GAAG,CAAC,CAAA,EAAG,IAAI,CAACqG,GAAG,CAAA,CAAA;AACvC,qCAAA,CAAA;AACF,iCAAA,CAAA;AACF;4BACA,IAAI,CAAC1J,QAAQ,CAACiC,QAAQ,GAAG1C,EAAGc,CAAAA,IAAI,CAACd,EAAAA,CAAGiB,GAAG,CAAC,IAAI,CAAC+I,GAAG,EAAE,IAAI,CAACpO,aAAa,GAAG,IAAI,CAAC4J,MAAM,CAACrC,CAAC,CAAA;AACtF,yBAAA,CAAA;AACF,qBAAA,CAAA;AAEJ,iBAAA,CAAA;AACF;AACF,SAAA,CAAA;AACA3B,QAAAA,OAAAA,CAAQ+I,IAAI,GAAG,gBAAA;QACf,OAAO/I,OAAAA;AACT;AAEQpD,IAAAA,iBAAAA,CAAkBnC,GAAgB,EAAE;;;;;AAK1C,QAAA,MAAMuF,OAAUvF,GAAAA,GAAAA,CAAIM,MAAM,CAACkF,kBAAkB,CAAC;AAC5CC,YAAAA,MAAAA,CAAAA,CAAO1B,EAAE,EAAA;AACPhG,gBAAAA,OAAAA,CAAQ+F,gBAAgB,CAACC,EAAAA,CAAAA;AAC3B,aAAA;AACA2B,YAAAA,QAAAA,CAAAA,CAAS3B,EAAE,EAAA;AACT,gBAAA,IAAI,CAACwK,WAAW,GAAGxK,GAAG6B,KAAK,EAAA,CAAGzB,OAAO,CAAC,CAAA,CAAA;gBACtC,IAAI,CAACwB,QAAQ,GAAG5B,EAAG6B,CAAAA,KAAK,GAAGC,UAAU,CAAC,oBAAsB1B,CAAAA,CAAAA,OAAO,CAAC,CAAA,CAAA;AACpE,gBAAA,IAAI,CAAC6B,UAAU,GAAGjC,GAAGc,IAAI,EAAA,CAAGV,OAAO,CAAC,CAAA,CAAA;AACpC,gBAAA,IAAI,CAAC4B,aAAa,GAAGhC,GAAGO,IAAI,EAAA,CAAGH,OAAO,CAAC,CAAA,CAAA;AACvC,gBAAA,IAAI,CAACK,QAAQ,CAACiC,QAAQ,GAAG1C,GAAGc,IAAI,EAAA;AAChCd,gBAAAA,EAAAA,CAAGW,IAAI,CAAC,WAAA;AACN,oBAAA,IAAI,CAACmC,EAAE,CAAC+G,QAAQ,GAAG7J,GAAGgD,kBAAkB,CAAC,IAAI,CAACwH,WAAW,EAAE,IAAI,CAACnK,OAAO,CAACK,EAAE,EAAE,CAAA,CAAA;;;AAG5E,oBAAA,IAAI,CAACD,QAAQ,CAACiC,QAAQ,GAAG1C,EAAAA,CAAGc,IAAI,CAAC,IAAI,CAAC+I,QAAQ,CAACvG,GAAG,EAAE,IAAI,CAACuG,QAAQ,CAAC1G,CAAC,CAAA;AACrE,iBAAA,CAAA;AACF;AACF,SAAA,CAAA;AACA3B,QAAAA,OAAAA,CAAQ+I,IAAI,GAAG,cAAA;QACf,OAAO/I,OAAAA;AACT;AAEQnD,IAAAA,sBAAAA,CAAuBpC,GAAgB,EAAE;AAC/C,QAAA,MAAMuF,OAAUvF,GAAAA,GAAAA,CAAIM,MAAM,CAACkF,kBAAkB,CAAC;AAC5CC,YAAAA,MAAAA,CAAAA,CAAO1B,EAAE,EAAA;AACPhG,gBAAAA,OAAAA,CAAQ+F,gBAAgB,CAACC,EAAAA,CAAAA;AAC3B,aAAA;AACA2B,YAAAA,QAAAA,CAAAA,CAAS3B,EAAE,EAAA;AACT,gBAAA,IAAI,CAACyK,QAAQ,GAAGzK,GAAG6B,KAAK,EAAA,CAAGzB,OAAO,CAAC,CAAA,CAAA;AACnC,gBAAA,IAAI,CAACxD,OAAO,GAAGoD,GAAG6B,KAAK,EAAA,CAAGzB,OAAO,CAAC,CAAA,CAAA;AAClC,gBAAA,IAAI,CAACsK,OAAO,GAAG1K,GAAG6B,KAAK,EAAA,CAAGzB,OAAO,CAAC,CAAA,CAAA;gBAClC,IAAI,CAACwB,QAAQ,GAAG5B,EAAG6B,CAAAA,KAAK,GAAGC,UAAU,CAAC,oBAAsB1B,CAAAA,CAAAA,OAAO,CAAC,CAAA,CAAA;AACpE,gBAAA,IAAI,CAAC4B,aAAa,GAAGhC,GAAGO,IAAI,EAAA,CAAGH,OAAO,CAAC,CAAA,CAAA;AACvC,gBAAA,IAAI,CAAC6B,UAAU,GAAGjC,GAAGc,IAAI,EAAA,CAAGV,OAAO,CAAC,CAAA,CAAA;AACpC,gBAAA,IAAI,CAACoC,SAAS,GAAGxC,GAAGG,GAAG,EAAA,CAAGC,OAAO,CAAC,CAAA,CAAA;AAClC,gBAAA,IAAI,CAACuK,OAAO,GAAG3K,GAAGG,GAAG,EAAA,CAAGC,OAAO,CAAC,CAAA,CAAA;AAChC,gBAAA,IAAI,CAACK,QAAQ,CAACiC,QAAQ,GAAG1C,GAAGc,IAAI,EAAA;gBAChCd,EAAG2C,CAAAA,IAAI,CAAC,aAAe,EAAA;AAAC3C,oBAAAA,EAAAA,CAAGO,IAAI,CAAC,IAAA;iBAAM,EAAE,WAAA;AACtC,oBAAA,IAAI,CAACqC,OAAO,CAACzD,YAAAA,CAAa0D,iBAAiB,CAAC,IAAI,EAAE,IAAI,CAACjB,QAAQ,EAAE,IAAI,CAAClB,EAAE,EAAE,CAAA,CAAA,CAAA;AAC5E,iBAAA,CAAA;AACAV,gBAAAA,EAAAA,CAAGW,IAAI,CAAC,WAAA;oBACN,IAAI,CAACmC,EAAE,CAACpC,EAAE,GAAG,IAAI,CAACL,OAAO,CAACK,EAAE;AAC5B,oBAAA,IAAI,CAACoC,EAAE,CAAC8H,SAAS,GAAG5K,EAAGgD,CAAAA,kBAAkB,CAAC,IAAI,CAACyH,QAAQ,EAAE,IAAI,CAAC/J,EAAE,EAAE,CAAA,CAAA;oBAClE,IAAI,CAACoC,EAAE,CAAC+H,MAAM,GAAG,IAAI,CAACD,SAAS,CAACtH,GAAG;oBACnC,IAAI,CAACR,EAAE,CAAC8C,aAAa,GAAG,IAAI,CAACC,WAAW,CAAC,IAAI,CAACnF,EAAE,CAAA;;;;AAIhD,oBAAA,IAAI,CAACoC,EAAE,CAACgI,UAAU,GAAG9K,GAAGgD,kBAAkB,CAAC,IAAI,CAACpG,OAAO,EAAE,IAAI,CAAC8D,EAAE,EAAE,GAAGyC,CAAC;AACtE,oBAAA,IAAI,CAAChC,GAAG,CACNnB,EAAAA,CAAG8F,GAAG,CACJ9F,EAAAA,CAAGkH,KAAK,CAAC,IAAI,CAAC1E,SAAS,EAAE,IACzBxC,EAAG8F,CAAAA,GAAG,CAAC9F,EAAAA,CAAG+F,QAAQ,CAAC,IAAI,CAACH,aAAa,EAAE,CAAA,CAAA,EAAI5F,EAAG2D,CAAAA,WAAW,CAAC,IAAI,CAACmH,UAAU,EAAE,IAE7E,CAAA,CAAA,CAAA,EAAA,WAAA;;;;;AAKE,wBAAA,IAAI,CAAChI,EAAE,CAACM,GAAG,GAAGpD,EAAAA,CAAGqD,GAAG,CAAC,IAAI,CAACuH,SAAS,CAACtH,GAAG,EAAEtD,GAAGuD,IAAI,CAAC,QAAQ,MAAQ,EAAA,MAAA,CAAA,CAAA;;;;AAIjE,wBAAA,IAAI,CAACT,EAAE,CAACU,OAAO,GAAGxD,EAAAA,CAAGyD,MAAM,CACzBzD,EAAAA,CAAGyC,KAAK,CAAC,IACTzC,EAAGkD,CAAAA,KAAK,CAAClD,EAAG0D,CAAAA,GAAG,CAAC,IAAI,CAACkH,SAAS,CAACzH,CAAC,EAAEnD,EAAAA,CAAGvE,GAAG,CAAC,IAAI,CAAC2H,GAAG,EAAE,IAAQ,CAAA,CAAA,EAAA,CAAA,EAAG,IAC9DpD,EAAG2D,CAAAA,WAAW,CAAC,IAAI,CAACP,GAAG,EAAE,IAAA,CAAA,CAAA;wBAE3B,IAAI,CAACN,EAAE,CAACiI,QAAQ,GAAG/K,EAAGiB,CAAAA,GAAG,CAAC,IAAI,CAAC2J,SAAS,CAACtH,GAAG,EAAEtD,EAAG8D,CAAAA,GAAG,CAAC,CAAG,EAAA,IAAI,CAACN,OAAO,CAAA,CAAA;;;;;;AAMpE,wBAAA,IAAI,CAACV,EAAE,CAAC+G,QAAQ,GAAG7J,GAAGgD,kBAAkB,CAAC,IAAI,CAAC0H,OAAO,EAAE,IAAI,CAAChK,EAAE,EAAE,GAAG4C,GAAG;;;;AAItE,wBAAA,IAAI,CAACuH,MAAM,GAAG7K,GAAGvE,GAAG,CAACuE,GAAGgB,GAAG,CAAC,IAAI,CAAC6I,QAAQ,EAAE,IAAI,CAACkB,QAAQ,CAAG/K,EAAAA,EAAAA,CAAGuD,IAAI,CAAC,CAAA,CAAA,CAAA;AACrE,qBAAA,CAAA;;;oBAIF,IAAI,CAACpC,GAAG,CAACnB,EAAGoB,CAAAA,QAAQ,CAAC,IAAI,CAACoB,SAAS,EAAE,CAAI,CAAA,EAAA,WAAA;AACvC,wBAAA,IAAI,CAACqI,MAAM,GAAG7K,EAAAA,CAAGgD,kBAAkB,CAAC,IAAI,CAAC0H,OAAO,EAAE,IAAI,CAAChK,EAAE,EAAE,GAAG4C,GAAG;AACnE,qBAAA,CAAA;oBACA,IAAI,CAACnC,GAAG,CAACnB,EAAGkH,CAAAA,KAAK,CAAC,IAAI,CAACyD,OAAO,EAAE,CAAI,CAAA,EAAA,WAAA;AAClC,wBAAA,IAAI,CAAClK,QAAQ,CAACiC,QAAQ,GAAG1C,GAAGc,IAAI,CAAC,IAAI,CAAC+J,MAAM,EAAE,IAAI,CAACD,SAAS,CAACzH,CAAC,CAAA;AAChE,qBAAA,CAAA,CAAGmH,KAAK,CAAC,WAAA;AACP,wBAAA,IAAI,CAAC7J,QAAQ,CAACiC,QAAQ,GAAG1C,EAAAA,CAAGc,IAAI,CAACkK,aAAAA,CAAc,IAAI,EAAE,IAAI,CAACH,MAAM,CAAA,EAAG,IAAI,CAACD,SAAS,CAACzH,CAAC,CAAA;AACrF,qBAAA,CAAA;AACF,iBAAA,CAAA;AACF;AACF,SAAA,CAAA;AACA3B,QAAAA,OAAAA,CAAQ+I,IAAI,GAAG,mBAAA;QACf,OAAO/I,OAAAA;AACT;AACF;;;;"}