@fps-games/vfx 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (375) hide show
  1. package/CHANGELOG.md +34 -0
  2. package/dist/EffectPackageService.d.ts +26 -0
  3. package/dist/SceneVfxService.d.ts +27 -0
  4. package/dist/chunks/legacy-particle-runtime-CbJYVxdd.js +75 -0
  5. package/dist/chunks/manifestRuntimePackage-CXQFSTo2.js +356 -0
  6. package/dist/chunks/rendering-CV3nhygX.js +13 -0
  7. package/dist/chunks/space-shared-BXV1hc0k.js +124 -0
  8. package/dist/chunks/wood-sawdust-effect-factory-DlETNaBn.js +129 -0
  9. package/dist/effects/building-upgrade/effect.json.d.ts +9 -0
  10. package/dist/effects/building-upgrade/index.d.ts +20 -0
  11. package/dist/effects/building-upgrade/index.js +337 -0
  12. package/dist/effects/character-entrance/effect.json.d.ts +9 -0
  13. package/dist/effects/character-entrance/index.d.ts +18 -0
  14. package/dist/effects/character-entrance/index.js +271 -0
  15. package/dist/effects/coin-burst/index.d.ts +6 -0
  16. package/dist/effects/coin-burst/index.js +45 -0
  17. package/dist/effects/comet-trail-flame/index.d.ts +11 -0
  18. package/dist/effects/comet-trail-flame/index.js +103 -0
  19. package/dist/effects/conveyor-upgrade/effect.json.d.ts +9 -0
  20. package/dist/effects/conveyor-upgrade/index.d.ts +20 -0
  21. package/dist/effects/conveyor-upgrade/index.js +349 -0
  22. package/dist/effects/debris-smoke/index.d.ts +10 -0
  23. package/dist/effects/debris-smoke/index.js +108 -0
  24. package/dist/effects/door_open_gold_flakes/door_open_gold_flakes.json.d.ts +501 -0
  25. package/dist/effects/door_open_gold_flakes/index.d.ts +1 -0
  26. package/dist/effects/door_open_gold_flakes/index.js +524 -0
  27. package/dist/effects/electric-arc/index.d.ts +8 -0
  28. package/dist/effects/electric-arc/index.js +71 -0
  29. package/dist/effects/energy-shield/index.d.ts +46 -0
  30. package/dist/effects/energy-shield/index.js +365 -0
  31. package/dist/effects/explosion/index.d.ts +11 -0
  32. package/dist/effects/explosion/index.js +129 -0
  33. package/dist/effects/ground-tile-upgrade/effect.json.d.ts +9 -0
  34. package/dist/effects/ground-tile-upgrade/index.d.ts +20 -0
  35. package/dist/effects/ground-tile-upgrade/index.js +357 -0
  36. package/dist/effects/hit-flash/index.d.ts +8 -0
  37. package/dist/effects/hit-flash/index.js +71 -0
  38. package/dist/effects/laser-beam/index.d.ts +1 -0
  39. package/dist/effects/laser-beam/index.js +152 -0
  40. package/dist/effects/laser-beam-factory.d.ts +12 -0
  41. package/dist/effects/lumber-cart-suction/effect.json.d.ts +9 -0
  42. package/dist/effects/lumber-cart-suction/index.d.ts +26 -0
  43. package/dist/effects/lumber-cart-suction/index.js +322 -0
  44. package/dist/effects/lumber-debris-scatter/effect.json.d.ts +231 -0
  45. package/dist/effects/lumber-debris-scatter/index.d.ts +20 -0
  46. package/dist/effects/lumber-debris-scatter/index.js +637 -0
  47. package/dist/effects/lumber_vehicle_gear_spin/index.d.ts +1 -0
  48. package/dist/effects/lumber_vehicle_gear_spin/index.js +363 -0
  49. package/dist/effects/lumber_vehicle_gear_spin/lumber_vehicle_gear_spin.json.d.ts +341 -0
  50. package/dist/effects/lumber_vehicle_upgrade_aura/index.d.ts +1 -0
  51. package/dist/effects/lumber_vehicle_upgrade_aura/index.js +391 -0
  52. package/dist/effects/lumber_vehicle_upgrade_aura/lumber_vehicle_upgrade_aura.json.d.ts +368 -0
  53. package/dist/effects/lumber_vehicle_wood_chips/index.d.ts +1 -0
  54. package/dist/effects/lumber_vehicle_wood_chips/index.js +360 -0
  55. package/dist/effects/lumber_vehicle_wood_chips/lumber_vehicle_wood_chips.json.d.ts +338 -0
  56. package/dist/effects/monster-hit/index.d.ts +15 -0
  57. package/dist/effects/monster-hit/index.js +156 -0
  58. package/dist/effects/player-upgrade/effect.json.d.ts +9 -0
  59. package/dist/effects/player-upgrade/index.d.ts +24 -0
  60. package/dist/effects/player-upgrade/index.js +539 -0
  61. package/dist/effects/pulse-laser-volley/index.d.ts +17 -0
  62. package/dist/effects/pulse-laser-volley/index.js +173 -0
  63. package/dist/effects/resource-collect-sparkles/effect.json.d.ts +9 -0
  64. package/dist/effects/resource-collect-sparkles/index.d.ts +21 -0
  65. package/dist/effects/resource-collect-sparkles/index.js +222 -0
  66. package/dist/effects/run-footstep-dust/effect.json.d.ts +186 -0
  67. package/dist/effects/run-footstep-dust/index.d.ts +23 -0
  68. package/dist/effects/run-footstep-dust/index.js +343 -0
  69. package/dist/effects/space-shared.d.ts +44 -0
  70. package/dist/effects/thruster-flame/index.d.ts +15 -0
  71. package/dist/effects/thruster-flame/index.js +301 -0
  72. package/dist/effects/tree-chop-dust/effect.json.d.ts +11 -0
  73. package/dist/effects/tree-chop-dust/index.d.ts +17 -0
  74. package/dist/effects/tree-chop-dust/index.js +165 -0
  75. package/dist/effects/tree-leaf-chop-burst/index.d.ts +19 -0
  76. package/dist/effects/tree-leaf-chop-burst/index.js +219 -0
  77. package/dist/effects/tree_chop_dust_burst/index.d.ts +1 -0
  78. package/dist/effects/tree_chop_dust_burst/index.js +443 -0
  79. package/dist/effects/tree_chop_dust_burst/tree_chop_dust_burst.json.d.ts +415 -0
  80. package/dist/effects/ufo-thread-flame/index.d.ts +21 -0
  81. package/dist/effects/ufo-thread-flame/index.js +140 -0
  82. package/dist/effects/vehicle-exhaust-smoke/effect.json.d.ts +11 -0
  83. package/dist/effects/vehicle-exhaust-smoke/index.d.ts +19 -0
  84. package/dist/effects/vehicle-exhaust-smoke/index.js +242 -0
  85. package/dist/effects/vehicle-upgrade/effect.json.d.ts +9 -0
  86. package/dist/effects/vehicle-upgrade/index.d.ts +20 -0
  87. package/dist/effects/vehicle-upgrade/index.js +349 -0
  88. package/dist/effects/weapon-trail/index.d.ts +26 -0
  89. package/dist/effects/weapon-trail/index.js +351 -0
  90. package/dist/effects/wood-crusher-sawdust/index.d.ts +2 -0
  91. package/dist/effects/wood-crusher-sawdust/index.js +648 -0
  92. package/dist/effects/wood-crusher-sawdust/wood_crusher_sawdust.json.d.ts +595 -0
  93. package/dist/effects/wood-cutter-sawdust/index.d.ts +2 -0
  94. package/dist/effects/wood-cutter-sawdust/index.js +648 -0
  95. package/dist/effects/wood-cutter-sawdust/wood_cutter_sawdust.json.d.ts +595 -0
  96. package/dist/effects/wood-sawdust-effect-factory.d.ts +36 -0
  97. package/dist/effects/wood_crusher_sawdust/index.d.ts +16 -0
  98. package/dist/effects/wood_crusher_sawdust/index.js +634 -0
  99. package/dist/effects/wood_crusher_sawdust/wood_crusher_sawdust.json.d.ts +595 -0
  100. package/dist/effects/wood_cutter_sawdust/index.d.ts +16 -0
  101. package/dist/effects/wood_cutter_sawdust/index.js +634 -0
  102. package/dist/effects/wood_cutter_sawdust/wood_cutter_sawdust.json.d.ts +595 -0
  103. package/dist/effects/wood_peel_material_test/index.d.ts +1 -0
  104. package/dist/effects/wood_peel_material_test/index.js +157 -0
  105. package/dist/effects/wood_peel_material_test/wood_peel_material_test.json.d.ts +139 -0
  106. package/dist/generation.d.ts +7 -0
  107. package/dist/index.d.ts +8 -0
  108. package/dist/index.js +309 -0
  109. package/dist/legacy-particle-runtime.d.ts +30 -0
  110. package/dist/manifestRuntimePackage.d.ts +68 -0
  111. package/dist/registry.d.ts +20 -0
  112. package/dist/rendering.d.ts +5 -0
  113. package/dist/types.d.ts +83 -0
  114. package/docs/AUTHORING_EFFECTS.md +297 -0
  115. package/docs/VFX_LIBRARY_ARCHITECTURE_chatgpt.md +1580 -0
  116. package/docs/VFX_LIBRARY_EXECUTION_PLAN.md +229 -0
  117. package/docs/VFX_LIBRARY_PLAN.md +546 -0
  118. package/docs/vfx-ab/RESULTS.md +35 -0
  119. package/docs/vfx-ab/lumber-order/vehicle-exhaust-smoke/after.png +0 -0
  120. package/docs/vfx-ab/lumber-order/vehicle-exhaust-smoke/before.png +0 -0
  121. package/docs/vfx-ab/lumber-truck/vehicle-exhaust-smoke/after.png +0 -0
  122. package/docs/vfx-ab/lumber-truck/vehicle-exhaust-smoke/before.png +0 -0
  123. package/docs/vfx-integration_chatgpt.md +462 -0
  124. package/docs/weapon-trail-visualization.html +241 -0
  125. package/index.json +381 -0
  126. package/package.json +51 -0
  127. package/packages/EffectPackageService.ts +240 -0
  128. package/packages/SceneVfxService.ts +96 -0
  129. package/packages/build.mesh.yellow_build_upgrade_indicator/assets/runtime/simpleMeshEffect.v1.js +333 -0
  130. package/packages/build.mesh.yellow_build_upgrade_indicator/assets/shaders/mesh-effect-preview.frag.glsl +25 -0
  131. package/packages/build.mesh.yellow_build_upgrade_indicator/assets/shaders/mesh-effect-preview.vert.glsl +11 -0
  132. package/packages/build.mesh.yellow_build_upgrade_indicator/assets/textures/effect_jianbian.png +0 -0
  133. package/packages/build.mesh.yellow_build_upgrade_indicator/effect.json +927 -0
  134. package/packages/build.mesh.yellow_build_upgrade_indicator/media/contact-sheet.png +0 -0
  135. package/packages/build.mesh.yellow_build_upgrade_indicator/media/preview.gif +0 -0
  136. package/packages/build.mesh.yellow_build_upgrade_indicator/media/preview.mp4 +0 -0
  137. package/packages/build.mesh.yellow_build_upgrade_indicator/media/preview.webm +0 -0
  138. package/packages/build.mesh.yellow_build_upgrade_indicator/media/thumbnail.png +0 -0
  139. package/packages/build.mesh.yellow_build_upgrade_indicator/metadata/description.json +197 -0
  140. package/packages/build.mesh.yellow_build_upgrade_indicator/provenance/03-effect.original.json +895 -0
  141. package/packages/build.mesh.yellow_build_upgrade_indicator/provenance/03-normalized-vfx-to-babylon-report.json +241 -0
  142. package/packages/build.mesh.yellow_build_upgrade_indicator/provenance/04-preview-overrides.json +542 -0
  143. package/packages/build.mesh.yellow_build_upgrade_indicator/provenance/04-preview-tuning-report.json +69 -0
  144. package/packages/build.mesh.yellow_build_upgrade_indicator/provenance/asset-map.json +125 -0
  145. package/packages/build.mesh.yellow_build_upgrade_indicator/provenance/lineage.json +44 -0
  146. package/packages/build.particle.golden_upgrade_starburst/assets/runtime/particleEmitter.v1.js +210 -0
  147. package/packages/build.particle.golden_upgrade_starburst/assets/textures/effect_guangdian.png +0 -0
  148. package/packages/build.particle.golden_upgrade_starburst/effect.json +880 -0
  149. package/packages/build.particle.golden_upgrade_starburst/media/contact-sheet.png +0 -0
  150. package/packages/build.particle.golden_upgrade_starburst/media/preview.gif +0 -0
  151. package/packages/build.particle.golden_upgrade_starburst/media/preview.mp4 +0 -0
  152. package/packages/build.particle.golden_upgrade_starburst/media/preview.webm +0 -0
  153. package/packages/build.particle.golden_upgrade_starburst/media/thumbnail.png +0 -0
  154. package/packages/build.particle.golden_upgrade_starburst/metadata/description.json +161 -0
  155. package/packages/build.particle.golden_upgrade_starburst/provenance/03-effect.original.json +762 -0
  156. package/packages/build.particle.golden_upgrade_starburst/provenance/03-normalized-vfx-to-babylon-report.json +260 -0
  157. package/packages/build.particle.golden_upgrade_starburst/provenance/04-preview-overrides.json +436 -0
  158. package/packages/build.particle.golden_upgrade_starburst/provenance/04-preview-tuning-report.json +40 -0
  159. package/packages/build.particle.golden_upgrade_starburst/provenance/asset-map.json +115 -0
  160. package/packages/build.particle.golden_upgrade_starburst/provenance/lineage.json +40 -0
  161. package/packages/build.particle.orange_upgrade_transform_sparks/assets/runtime/particleEmitter.v1.js +210 -0
  162. package/packages/build.particle.orange_upgrade_transform_sparks/assets/textures/b5b27ab1-e740-4398-b407-848fc2b2c897.png +0 -0
  163. package/packages/build.particle.orange_upgrade_transform_sparks/effect.json +887 -0
  164. package/packages/build.particle.orange_upgrade_transform_sparks/media/preview.gif +0 -0
  165. package/packages/build.particle.orange_upgrade_transform_sparks/media/preview.mp4 +0 -0
  166. package/packages/build.particle.orange_upgrade_transform_sparks/media/preview.webm +0 -0
  167. package/packages/build.particle.orange_upgrade_transform_sparks/media/thumbnail.png +0 -0
  168. package/packages/build.particle.orange_upgrade_transform_sparks/metadata/description.json +179 -0
  169. package/packages/build.particle.orange_upgrade_transform_sparks/provenance/03-effect.original.json +859 -0
  170. package/packages/build.particle.orange_upgrade_transform_sparks/provenance/03-normalized-vfx-to-babylon-report.json +260 -0
  171. package/packages/build.particle.orange_upgrade_transform_sparks/provenance/04-preview-overrides.json +478 -0
  172. package/packages/build.particle.orange_upgrade_transform_sparks/provenance/04-preview-tuning-report.json +40 -0
  173. package/packages/build.particle.orange_upgrade_transform_sparks/provenance/asset-map.json +114 -0
  174. package/packages/build.particle.orange_upgrade_transform_sparks/provenance/lineage.json +41 -0
  175. package/packages/build.particle.wood_chip_dust_burst/assets/runtime/particleEmitter.v1.js +210 -0
  176. package/packages/build.particle.wood_chip_dust_burst/assets/textures/effect_yanwu4.png +0 -0
  177. package/packages/build.particle.wood_chip_dust_burst/assets/textures/suipian3.png +0 -0
  178. package/packages/build.particle.wood_chip_dust_burst/effect.json +1400 -0
  179. package/packages/build.particle.wood_chip_dust_burst/media/contact-sheet.png +0 -0
  180. package/packages/build.particle.wood_chip_dust_burst/media/preview.gif +0 -0
  181. package/packages/build.particle.wood_chip_dust_burst/media/preview.mp4 +0 -0
  182. package/packages/build.particle.wood_chip_dust_burst/media/preview.webm +0 -0
  183. package/packages/build.particle.wood_chip_dust_burst/media/thumbnail.png +0 -0
  184. package/packages/build.particle.wood_chip_dust_burst/metadata/description.json +173 -0
  185. package/packages/build.particle.wood_chip_dust_burst/provenance/03-effect.original.json +1277 -0
  186. package/packages/build.particle.wood_chip_dust_burst/provenance/03-normalized-vfx-to-babylon-report.json +329 -0
  187. package/packages/build.particle.wood_chip_dust_burst/provenance/04-preview-overrides.json +749 -0
  188. package/packages/build.particle.wood_chip_dust_burst/provenance/04-preview-tuning-report.json +60 -0
  189. package/packages/build.particle.wood_chip_dust_burst/provenance/asset-map.json +146 -0
  190. package/packages/build.particle.wood_chip_dust_burst/provenance/lineage.json +69 -0
  191. package/packages/effects/building-upgrade/effect.json +6 -0
  192. package/packages/effects/building-upgrade/index.ts +387 -0
  193. package/packages/effects/building-upgrade/vfx-params.json +24 -0
  194. package/packages/effects/character-entrance/effect.json +6 -0
  195. package/packages/effects/character-entrance/index.ts +308 -0
  196. package/packages/effects/character-entrance/vfx-params.json +24 -0
  197. package/packages/effects/coin-burst/index.ts +43 -0
  198. package/packages/effects/coin-burst/vfx-params.json +5 -0
  199. package/packages/effects/comet-trail-flame/assets/textures/trail_5x4.webp +0 -0
  200. package/packages/effects/comet-trail-flame/index.ts +106 -0
  201. package/packages/effects/comet-trail-flame/vfx-params.json +5 -0
  202. package/packages/effects/conveyor-upgrade/effect.json +6 -0
  203. package/packages/effects/conveyor-upgrade/index.ts +401 -0
  204. package/packages/effects/conveyor-upgrade/vfx-params.json +21 -0
  205. package/packages/effects/debris-smoke/assets/models/rock_debris.glb +0 -0
  206. package/packages/effects/debris-smoke/assets/textures/smoke22.webp +0 -0
  207. package/packages/effects/debris-smoke/index.ts +101 -0
  208. package/packages/effects/debris-smoke/vfx-params.json +5 -0
  209. package/packages/effects/door_open_gold_flakes/assets/runtime/goldFlakes.v1.js +397 -0
  210. package/packages/effects/door_open_gold_flakes/door_open_gold_flakes.json +498 -0
  211. package/packages/effects/door_open_gold_flakes/index.ts +11 -0
  212. package/packages/effects/door_open_gold_flakes/vfx-params.json +23 -0
  213. package/packages/effects/electric-arc/assets/textures/spark_4x4.webp +0 -0
  214. package/packages/effects/electric-arc/index.ts +62 -0
  215. package/packages/effects/electric-arc/vfx-params.json +5 -0
  216. package/packages/effects/energy-shield/effect.json +7 -0
  217. package/packages/effects/energy-shield/index.ts +431 -0
  218. package/packages/effects/energy-shield/vfx-params.json +29 -0
  219. package/packages/effects/explosion/assets/textures/baozha29.webp +0 -0
  220. package/packages/effects/explosion/assets/textures/glow01.webp +0 -0
  221. package/packages/effects/explosion/assets/textures/lizi01.webp +0 -0
  222. package/packages/effects/explosion/assets/textures/xulie_lizibaozha02_5x5.webp +0 -0
  223. package/packages/effects/explosion/index.ts +114 -0
  224. package/packages/effects/explosion/vfx-params.json +5 -0
  225. package/packages/effects/ground-tile-upgrade/effect.json +6 -0
  226. package/packages/effects/ground-tile-upgrade/index.ts +410 -0
  227. package/packages/effects/ground-tile-upgrade/vfx-params.json +21 -0
  228. package/packages/effects/hit-flash/index.ts +69 -0
  229. package/packages/effects/hit-flash/vfx-params.json +5 -0
  230. package/packages/effects/laser-beam/assets/textures/laser_glow.webp +0 -0
  231. package/packages/effects/laser-beam/assets/textures/laser_noise.webp +0 -0
  232. package/packages/effects/laser-beam/index.ts +6 -0
  233. package/packages/effects/laser-beam/vfx-params.json +5 -0
  234. package/packages/effects/laser-beam-factory.ts +135 -0
  235. package/packages/effects/lumber-cart-suction/effect.json +6 -0
  236. package/packages/effects/lumber-cart-suction/index.ts +399 -0
  237. package/packages/effects/lumber-cart-suction/vfx-params.json +30 -0
  238. package/packages/effects/lumber-debris-scatter/assets/models/lumber_prop_model.glb +0 -0
  239. package/packages/effects/lumber-debris-scatter/assets/models/lumber_prop_model.glb.versions/.active +1 -0
  240. package/packages/effects/lumber-debris-scatter/assets/models/lumber_prop_model.glb.versions/1781589063890_upload.glb +0 -0
  241. package/packages/effects/lumber-debris-scatter/assets/runtime/solidParticleScatter.v1.js +236 -0
  242. package/packages/effects/lumber-debris-scatter/effect.json +228 -0
  243. package/packages/effects/lumber-debris-scatter/index.ts +780 -0
  244. package/packages/effects/lumber-debris-scatter/vfx-params.json +19 -0
  245. package/packages/effects/lumber_vehicle_gear_spin/assets/runtime/gearSpin.v1.js +202 -0
  246. package/packages/effects/lumber_vehicle_gear_spin/index.ts +11 -0
  247. package/packages/effects/lumber_vehicle_gear_spin/lumber_vehicle_gear_spin.json +338 -0
  248. package/packages/effects/lumber_vehicle_gear_spin/vfx-params.json +21 -0
  249. package/packages/effects/lumber_vehicle_upgrade_aura/assets/runtime/upgradeAura.v1.js +353 -0
  250. package/packages/effects/lumber_vehicle_upgrade_aura/index.ts +11 -0
  251. package/packages/effects/lumber_vehicle_upgrade_aura/lumber_vehicle_upgrade_aura.json +365 -0
  252. package/packages/effects/lumber_vehicle_upgrade_aura/vfx-params.json +15 -0
  253. package/packages/effects/lumber_vehicle_wood_chips/assets/runtime/solidParticleScatter.v1.js +310 -0
  254. package/packages/effects/lumber_vehicle_wood_chips/index.ts +11 -0
  255. package/packages/effects/lumber_vehicle_wood_chips/lumber_vehicle_wood_chips.json +335 -0
  256. package/packages/effects/lumber_vehicle_wood_chips/vfx-params.json +11 -0
  257. package/packages/effects/monster-hit/index.ts +128 -0
  258. package/packages/effects/monster-hit/vfx-params.json +5 -0
  259. package/packages/effects/player-upgrade/effect.json +6 -0
  260. package/packages/effects/player-upgrade/index.ts +635 -0
  261. package/packages/effects/player-upgrade/vfx-params.json +28 -0
  262. package/packages/effects/pulse-laser-volley/assets/textures/bolt_guangshu.webp +0 -0
  263. package/packages/effects/pulse-laser-volley/index.ts +204 -0
  264. package/packages/effects/pulse-laser-volley/vfx-params.json +5 -0
  265. package/packages/effects/resource-collect-sparkles/effect.json +6 -0
  266. package/packages/effects/resource-collect-sparkles/index.ts +254 -0
  267. package/packages/effects/resource-collect-sparkles/vfx-params.json +25 -0
  268. package/packages/effects/run-footstep-dust/assets/runtime/runFootstepDust.v1.js +215 -0
  269. package/packages/effects/run-footstep-dust/effect.json +183 -0
  270. package/packages/effects/run-footstep-dust/index.ts +377 -0
  271. package/packages/effects/run-footstep-dust/vfx-params.json +27 -0
  272. package/packages/effects/space-shared.ts +120 -0
  273. package/packages/effects/thruster-flame/index.ts +305 -0
  274. package/packages/effects/thruster-flame/vfx-params.json +5 -0
  275. package/packages/effects/tree-chop-dust/assets/textures/tree_chop_dust_atlas.png +0 -0
  276. package/packages/effects/tree-chop-dust/effect.json +8 -0
  277. package/packages/effects/tree-chop-dust/index.ts +202 -0
  278. package/packages/effects/tree-chop-dust/vfx-params.json +21 -0
  279. package/packages/effects/tree-leaf-chop-burst/assets/runtime/particleEmitter.v1.js +303 -0
  280. package/packages/effects/tree-leaf-chop-burst/assets/textures/tree_leaf_chop_burst_leaf_atlas.png +0 -0
  281. package/packages/effects/tree-leaf-chop-burst/effect.json +498 -0
  282. package/packages/effects/tree-leaf-chop-burst/index.ts +294 -0
  283. package/packages/effects/tree-leaf-chop-burst/vfx-params.json +27 -0
  284. package/packages/effects/tree_chop_dust_burst/assets/runtime/particleEmitter.v1.js +318 -0
  285. package/packages/effects/tree_chop_dust_burst/assets/textures/tree_chop_dust_burst_dust.png +0 -0
  286. package/packages/effects/tree_chop_dust_burst/index.ts +13 -0
  287. package/packages/effects/tree_chop_dust_burst/tree_chop_dust_burst.json +412 -0
  288. package/packages/effects/tree_chop_dust_burst/vfx-params.json +9 -0
  289. package/packages/effects/ufo-thread-flame/assets/textures/flame_flow.webp +0 -0
  290. package/packages/effects/ufo-thread-flame/assets/textures/flame_spike.webp +0 -0
  291. package/packages/effects/ufo-thread-flame/index.ts +152 -0
  292. package/packages/effects/ufo-thread-flame/vfx-params.json +5 -0
  293. package/packages/effects/vehicle-exhaust-smoke/assets/textures/vehicle_exhaust_smoke_atlas.png +0 -0
  294. package/packages/effects/vehicle-exhaust-smoke/effect.json +8 -0
  295. package/packages/effects/vehicle-exhaust-smoke/index.ts +298 -0
  296. package/packages/effects/vehicle-exhaust-smoke/vfx-params.json +23 -0
  297. package/packages/effects/vehicle-upgrade/effect.json +6 -0
  298. package/packages/effects/vehicle-upgrade/index.ts +401 -0
  299. package/packages/effects/vehicle-upgrade/vfx-params.json +21 -0
  300. package/packages/effects/weapon-trail/assets/textures/trail_wedge.png +0 -0
  301. package/packages/effects/weapon-trail/index.ts +313 -0
  302. package/packages/effects/weapon-trail/vfx-params.json +5 -0
  303. package/packages/effects/wood-crusher-sawdust/assets/runtime/particleEmitter.v1.js +312 -0
  304. package/packages/effects/wood-crusher-sawdust/assets/textures/wood_crusher_sawdust_dust.png +0 -0
  305. package/packages/effects/wood-crusher-sawdust/assets/textures/wood_crusher_sawdust_fiber.png +0 -0
  306. package/packages/effects/wood-crusher-sawdust/index.ts +43 -0
  307. package/packages/effects/wood-crusher-sawdust/vfx-params.json +24 -0
  308. package/packages/effects/wood-crusher-sawdust/wood_crusher_sawdust.json +592 -0
  309. package/packages/effects/wood-cutter-sawdust/assets/runtime/particleEmitter.v1.js +312 -0
  310. package/packages/effects/wood-cutter-sawdust/assets/textures/wood_cutter_sawdust_chip.png +0 -0
  311. package/packages/effects/wood-cutter-sawdust/assets/textures/wood_cutter_sawdust_dust.png +0 -0
  312. package/packages/effects/wood-cutter-sawdust/index.ts +43 -0
  313. package/packages/effects/wood-cutter-sawdust/vfx-params.json +24 -0
  314. package/packages/effects/wood-cutter-sawdust/wood_cutter_sawdust.json +592 -0
  315. package/packages/effects/wood-sawdust-effect-factory.ts +194 -0
  316. package/packages/effects/wood_crusher_sawdust/assets/runtime/particleEmitter.v1.js +318 -0
  317. package/packages/effects/wood_crusher_sawdust/assets/textures/wood_crusher_sawdust_dust.png +0 -0
  318. package/packages/effects/wood_crusher_sawdust/assets/textures/wood_crusher_sawdust_fiber.png +0 -0
  319. package/packages/effects/wood_crusher_sawdust/index.ts +29 -0
  320. package/packages/effects/wood_crusher_sawdust/vfx-params.json +14 -0
  321. package/packages/effects/wood_crusher_sawdust/wood_crusher_sawdust.json +592 -0
  322. package/packages/effects/wood_cutter_sawdust/assets/runtime/particleEmitter.v1.js +318 -0
  323. package/packages/effects/wood_cutter_sawdust/assets/textures/wood_cutter_sawdust_chip.png +0 -0
  324. package/packages/effects/wood_cutter_sawdust/assets/textures/wood_cutter_sawdust_dust.png +0 -0
  325. package/packages/effects/wood_cutter_sawdust/index.ts +29 -0
  326. package/packages/effects/wood_cutter_sawdust/vfx-params.json +14 -0
  327. package/packages/effects/wood_cutter_sawdust/wood_cutter_sawdust.json +592 -0
  328. package/packages/effects/wood_peel_material_test/assets/runtime/woodPeelMaterialTest.v1.js +196 -0
  329. package/packages/effects/wood_peel_material_test/index.ts +11 -0
  330. package/packages/effects/wood_peel_material_test/vfx-params.json +9 -0
  331. package/packages/effects/wood_peel_material_test/wood_peel_material_test.json +136 -0
  332. package/packages/env.particle.forest_edge_fog/assets/runtime/particleEmitter.v1.js +210 -0
  333. package/packages/env.particle.forest_edge_fog/assets/textures/f12a23c4-b924-4322-a260-3d982428f1e8.png +0 -0
  334. package/packages/env.particle.forest_edge_fog/assets/textures/yuan.png +0 -0
  335. package/packages/env.particle.forest_edge_fog/effect.json +854 -0
  336. package/packages/env.particle.forest_edge_fog/media/preview.gif +0 -0
  337. package/packages/env.particle.forest_edge_fog/media/preview.mp4 +0 -0
  338. package/packages/env.particle.forest_edge_fog/media/preview.webm +0 -0
  339. package/packages/env.particle.forest_edge_fog/media/thumbnail.png +0 -0
  340. package/packages/env.particle.forest_edge_fog/metadata/description.json +148 -0
  341. package/packages/env.particle.forest_edge_fog/provenance/03-effect.original.json +827 -0
  342. package/packages/env.particle.forest_edge_fog/provenance/03-normalized-vfx-to-babylon-report.json +196 -0
  343. package/packages/env.particle.forest_edge_fog/provenance/04-preview-overrides.json +432 -0
  344. package/packages/env.particle.forest_edge_fog/provenance/04-preview-tuning-report.json +28 -0
  345. package/packages/env.particle.forest_edge_fog/provenance/asset-map.json +124 -0
  346. package/packages/env.particle.forest_edge_fog/provenance/lineage.json +41 -0
  347. package/packages/generation.ts +14 -0
  348. package/packages/index.ts +14 -0
  349. package/packages/legacy-particle-runtime.ts +113 -0
  350. package/packages/manifestRuntimePackage.ts +519 -0
  351. package/packages/registry.ts +85 -0
  352. package/packages/rendering.ts +13 -0
  353. package/packages/resource.particle.viscous_oil_suction/assets/runtime/top_disk_suction/particleEmitter.v1.js +424 -0
  354. package/packages/resource.particle.viscous_oil_suction/assets/textures/Glow ad.png +0 -0
  355. package/packages/resource.particle.viscous_oil_suction/effect.json +1254 -0
  356. package/packages/resource.particle.viscous_oil_suction/media/preview.gif +0 -0
  357. package/packages/resource.particle.viscous_oil_suction/media/preview.mp4 +0 -0
  358. package/packages/resource.particle.viscous_oil_suction/media/preview.webm +0 -0
  359. package/packages/resource.particle.viscous_oil_suction/media/thumbnail.png +0 -0
  360. package/packages/resource.particle.viscous_oil_suction/metadata/description.json +122 -0
  361. package/packages/resource.particle.viscous_oil_suction/provenance/03-effect.original.json +1051 -0
  362. package/packages/resource.particle.viscous_oil_suction/provenance/03-normalized-vfx-to-babylon-report.json +200 -0
  363. package/packages/resource.particle.viscous_oil_suction/provenance/04-preview-overrides.json +581 -0
  364. package/packages/resource.particle.viscous_oil_suction/provenance/04-preview-tuning-report.json +28 -0
  365. package/packages/resource.particle.viscous_oil_suction/provenance/asset-map.json +111 -0
  366. package/packages/resource.particle.viscous_oil_suction/provenance/lineage.json +45 -0
  367. package/packages/types.ts +107 -0
  368. package/tooling/check-dist-runtime.mjs +166 -0
  369. package/tooling/generate-index.mjs +55 -0
  370. package/tooling/test-guardrails.mjs +157 -0
  371. package/tooling/validate-boundary.mjs +92 -0
  372. package/tooling/validate-effects.mjs +304 -0
  373. package/tooling/validate.mjs +53 -0
  374. package/tooling/vfx-cli.mjs +232 -0
  375. package/tooling/vfx-package-resolution.mjs +28 -0
@@ -0,0 +1,71 @@
1
+ import { ParticleSystem } from "@babylonjs/core/Particles/particleSystem";
2
+ import { Texture } from "@babylonjs/core/Materials/Textures/texture";
3
+ import { Color4 } from "@babylonjs/core/Maths/math.color";
4
+ import { Vector3 } from "@babylonjs/core/Maths/math.vector";
5
+ const sparkTextureUrl = "data:image/webp;base64,UklGRpSUAABXRUJQVlA4WAoAAAAQAAAA/wEA/wEAQUxQSHVSAAARGUZtI0lSHb/U8gc8s7sUIvo/AfLa8lGZ7dm+sS3jTIAt4ZDUJFnuOtctGQlIuzMWjMrWjS4pSIJ2vmNJ6nRgw6XDHtvYRNva9iMo9mW2+bLFAMKe7RIriSRVf1V+2P9fd0uynWtmZmZmZmZmZmZmZmZmZmZmZmZmZmY7WGtX1171PLXWNvW7I9PINFHrJ5UmMo0q+DvCVpuiE/VE5h2sji6NOjKdqCcyjXawdfPu6NJEfSLT6Am2TBN1BV/jRKNOTnS+QelidCr462LUujSRqXQwGm1p6USm0cXI1LoYjZa0NZGp1aYIWx2ZRk+wT2QadfCZyDSayDT6BtWRabSDR6YTzUSmiboj09EOlozRdHQxal2aaFawjSfqikwnKl2M7j8oXYxGW/rqRKaWaSJTyzTRUUmPTmRqVXIiU2si02gF60amVpuiS6WJzCvYE5laFZkm6hNdGv2CmuhSq4KfcaLTkWmiUpui3sEj04m6o4tRq03RrGDJNFGrkhOZWhej8wRbNx91EDEBE/CV5ZFM/EG6Dn9QJ+IEfzA/CMdwgZ9YE4TxgxLHAHfhJ9DkIoNACHf0ByHcdcJMuFDwg1YyzDHzMA85foJMLuRm6XIzFIY7/IE0x06IyYWiFYs0k5nrDywUpTQv4sS4wCyap6eihVD8AYXnUH4wKrITX3Jhhsm8Sc07QzWm/AGkTw0QOrElb+4N5PmDZbJeP3jZqL9v09+PnCYuIU50t0rnpKXRZ28/VD8U+z9yPxr7vye/DF6jQDMAncgSrnTLkpmdtR+CH6Yfos0WEb9WPzPhEN6QOk5wy6VossxePxw/JLII+D26rxBRaA0TJ7QFnt6Cvtlmnp93EQD1h6apGl4hm3J8aTXfyAKZqXbRd4vNH4atiGDl79+PQKvmRUOfPWJMC2w1gW9UKQIsOrVc/PD9SEQEUBJ+uPppkVvRPDtrY0qYgQBXIHxjCuQtmnc/OJvnf+wigN+X34e8NOeH7GhRWKp61zVxzPCxogaCLNBwN+QbVKQnnfZP/7hFUH9nbrP5/rD/I8aP0Hxn6vX3q8z6liTgjsc4UUOJBLgXNXeTb0iZgZjtt5+miN+r356rP2x5emdZyB+ZduXSbL6MutVnQinupXj4+JCh7LJBUChlUKsm34iSI1vM7eck6q9F+2HZ6a+UVEbt74ajH7qjtlzMWkYQpVbHY3yQyvn+zCqFWkspQ2mVDWrlrNcvRPwq/c79ZNi5xTxlBZVupwHz80dbPbVMp5NpKaV4+NgwaPOfp5+6n4UyGcqkTCbDbFIw+caThZT9435etn+uftoemi16S1Ppvea0O8fKfYtpKZNhUqe1OqWMCwGmX5nfit+Qn5/frcnk92l3d3cyaZNW2ZBOuh+Xn65fqt+in7hsswYZNNdQI/fbCvBl2f39mRxMpnVSSo1xgSnl5afkl+yXgF+V35Xfg9+1235vdpNuEPKNJgHdj89/4d1/wl7WWsNkYVkiWhmm86PVmB5sn9rdnkwm0zK4+7gAjHr4C3Pfe/xM8Nhfk9+G+/tZNyA5G9B538/Dj82PyX7f+kChQljGNKrrdFuN5e/d797Zk6d2DyaDex0jIobJ9vLP81PBj8Ev1M/FZkuRhY1nh/Kz9iN1K302jJKAu2pSJ9PFlWNMb7v8e3Zyb3t7Mq3DOAHcp1MBD9LSMoU2nkqNx/1UnW6hZkOGuUF6UfgwTOP0zmr9mXPzbDQBYlzKIVQ0ncLub15Vio1pr/xO9XhPRaUZxSKwKCWGOrHz81V43M5sRiIQGhdAWFiUbegPp8hW00YT7rinsTLczHGLAjZMJwf93fNV+IlpCJAYr8XC6iloJA4SG9MuoqyQK9wsKOCVsuSw/fBsAnv370yrM2ZdjqIwve0qzBLAfYMKZ1U5YUSYG8Xdqx/olO4G6m/XL8uyUMYMEDaoxoXfFGitFDa+HUVBEeaOFS+lLOOgP4TYPns4rYxbF1VepmevAu5E2fACB1VFYJXwoA6V7d8diMmyRCnFx4qrhKIQF++ECaUU3AHf0AJcVeGRFUq4c2DPBavLybQyXl0uIjz84u/Grwf7k1KKBzgb3y5XIZya0yzFpleXbIWFQ4CPD8AjsBKnbvvN4SdhOVQPL2yIO948cPMowHBqYJ5enMJ4dRAlbLp98+/E7uZBrV4c3xADJwJzb4NFsNyGzoBw0BgBPCyC5dm3/QxwqpQSbJS7XEXhVi1ApyrM544b7oxTB5Vwn5w6eaGemkwLBY8NMXBUo+HpEb57GTYbCIlxW1txTSeHJ7+Oj5oSzoa5ywWOFQUc/F7AfN4xhh25ipUyWf7ClQDwjbKVJd2Mgnw4gASt0HgBBw2DR+GubCYgNs7w5kAWhiXMemst3RmzrghB8WyfuNX3rPQNMTmQxQIw8+372dlZtESM37DaQG3zoR+va7OWOBvl8m4QkVmx9N8F7ju3mZY2hgDHbHZ++1fooa2UtDEmb+4iECZjvnUazp9uFMauHFBJ9XfscFePnI1w4c09SyMsUupf/vKXw2O2jIyxs6onNv+JgJ+VhrMBLlxyTzOHFKnTP1o/TjtwBUUx8LGhFY4Aii0/8sKn/5t2vRAbWwJzE26YuclQY+fox2EO/GZcnBQiCsQo0zEMfAXmK6LuftRPx2/VC89W38gSEEYoMEW6NzC5zc7nESxf9/kuTGphxAtHqwRipQJ3CvXs5Rc+fNv24M4GtcAFZuCpEookLCyyOz0L4LfptZdPTiZ1cErFR5LAQuBaAb6KA/L0OtnePZgMBcc3oAQu5MINgUvgzc3CFJsPBfyO/I79Lu3tTgvuDsEolpuZOWBCXGfHwUuZDpPizmgX4OsvAZLLMVoxb2HysFYzUJhlBGdfeP/e3nJSpu6MaIVFuicNnMCOEeHC5E4dCu6Ojy6xqsDXVQI1cEwqFpHm8lDDm+GRgQfcdts9h5PppEYweIwiBaaaQsXCMAKEg4Xhka054B44o1qgVXCEr6NACO/koCBdEQmIDDNNxTTg4tndyXJSinsBfPQoMLwL4TJIB3AEIUfRd9Yx4oVAyHHhyMeQjuHjRihTWRSBsqiVBMtiGWZItlsCzl6s06mXUit4MHLlZlhXBA2znCaF1Q2VotmsT+VIE6JBAhRvFfm4Ee0YpYwXAUoskFSzVWsB8mzuM5tX2/XtYHLqYDopyxoRTjCCBdZCwiLNSkdpQcmS4KaYbs3nmQJiVAlJ2WhGVPfSSjBmZUkDrJBZxksq1QJFg45o3hrVk2hd37eO6eRC8KxTy2mZULxSHB85spAprDOpc0VGSVdYzSmZ6ordd2XR9SBGuJSt6xpQ6rQMWeTjhaSlDApDyscJolmfYWmmsFm/lTg1Sq/MTh4RQ3BqMtTqJZyKByO4hcnU2nzezcKslelkOQjPbt7Pazd96MfiaJFdh0aVaOSs6zdns1Z3d3fLrhizarRuNu9bPZhMBmNMypubRYYybOZmrV/M949+oiLqhVsejBwmERHQgt26CWEGyQhWCLXZ0ZnzD9x9x4/aB1+p1W57wsW9SR0O+p3TH/7yBB778/as1hjpatrcf+DWc3Hx6tmTh/00y3gB5eaVM1f63csn97ZTPhbkwgxS+FzR2qw/mj81IqCdOXMtVnLMSek9SfdWbASRJbvNo5t+RH5U/ooPAbQ5D30gu2eb1/k1Y9W7tjbTBPIRZdJs69odL/rmgMPftGf9Rr3TKSEfJ4YWl25/zC8G8Lf6lWJsCrOgQS/N2s7+vL0oIrjwhMnVWz/KuO6Tzo2sUm2ukSPVpjY7+tW4m5V7vxHTtz4d2LyDYz7r8tt+gh7oZUkWRnd2+3f/sj0EsP9TwBt/zh685zJjNrutX5E7AH6OvoPfljEhF24ZLVqnxc75/gEiov4mPCseajdNn/zWHz1brYT3TC0spCAZtQLVFv3sF+CnZ5Mlt7zT3tXtdvr2Z/8Y9awsb5ucvHDPPdOnPckzMUZ6/mV+xpi+9o2/QzdfPbl34erBwNjVr8+Vw9+s34DL99920scEwozoomUe3b14fkTAp91y+8581mzq09nj5qvgiINoaaEQbjFKhJu5LD/7j/MLVDePjmbEQa1tcXT3HXc/cO35jbx977ds7549XlAlQ6PMqd1P0n7LOjm1nOzuTovjY8Ynn31lwfap3b1JKWNBYS5DilmbP3BTRHBh+Qm3t0vzTTPKwe720Uv7FamMZWnpSYgwY3SKwCKJfMNjfqaY9W3WSGjZZpv758699NL5O27n6DW/bb8dk/aTddSQ+SijTD9r0UqWqNM6rUMtwTGlRp+jr0wuzNJLnZTB8XGAmQUSHfMH+giuPm24+RnX9vsOo3hOrx7Mf5QagAV7M1criSFGqAJaEHT1S39PKgd0LS2TbK3v5/P5/NzOpdPzV930Y8bVuEYrTowul/vuXmYK9+JlcK7rqz4kuzM/ARpxpeRkWwIv7iUYhxbIkJlmm1s7wRufu18v7XTqIyPMJ1FOHU7ueKBn5UWfZTQzc7MYGQpkNZtb+aV5iIGBKUkjaX323WzWd/1ssflN3P39tCvw6zBUd8rIgnAfaJAF96iU8GN9vh+/37D+851rIw5KFlY64ONA3iIE9Da/9lBw/0Fs7kCTt0LIyuDLw8OhbJ6bLa7xW3fHTloGkhujUkG6NY/M84++I1RKTExYE9nS+pxnn13fZud+SV70qfCEw4kXIEaVy33QhNUrjnNsf9qzX/hRWxp1JUuuQsUZvQJ/RLBQIFp086OAW2LemTefeYhWq4bBJ5Pt3aGofwW/fXfPmJE2dDEy5JaVRrae8w+XLIEDsolMjZZpfbaW2S/2z7/9X/zcvWcntTqVke1eVUE4gONcl4O9m2iM/EJdzRm1wgyQg18HhTkNOU3714ILg+2ghmorRsUGxYRpLfWgTvLX6GfkyjxlZFaNDCxgVjL7+c/B5/uEgzZRJaBAmsnUaJmWmSy6+f7PzU0PX5zUMjDKXQ5ywAHnOk8vWmEc+mojV0gIXBXhx1gp8D4j+whOKju5isIywINa2xCD14jhN+6pi0XXixYCHx1ZZyXJ/c0fq1+dW4fdVuU4wCASySSZWjIjG+zuTqbgET6ycISzqvOIFm7Ei4aygRdRkR/DLCvIousUcI/tu3cRsgjHLCJsEkWDUcvJ813rzFpYSIxIgXdDb9ltfnC88DHbfaYAL0AiZJIw0Wgk1DIdygRntDvrUCFly9kvxc9diUBUgYNcDjLD1PpgerCwhptKEElxOXhQLQrgfSoxM+GjAmSRobbY/6i4dqrt9UupUHAoAB3IJITJAq+lODXCR9o6taXmmy/+yl9eXBN58wiBQ4bcSONIweHCsoSKobCCqFYwIiiyIpkhM2OUyjFrllv7wc6U3mTgOHgFMQAdAmNlOAM1go1WIVrbvPuX5/s5P1VJpxDmhskd4ZBtNgssY6VjrjCnILnjGB5pjmRmoJEhBxlmee5FwaLQWtImAO4YBUMMAFkSKECNwDdaQJlt/4HNnWFJ4OEhJxS4Qi4FMYug37JDL1BENQVJcaMINyCEhQzkI2OlImuf7XywCGZ9UzHAHQJwKxhIhUHgOBE4G64S1rbOcMdhIYhBDJKDZ6iYq6QD7Fwpu9vT2qgSxXBBEe4EYJKnI0apPN08SyPgEnXRZ5tIeICzuhzzinCHIMDZiJVptsW1yJbbS4/ACUPFwjyrBdttBjc9/YX3BuFZFYbLwdxAgANyyUcKcjlkIYxb/dS8zzRABeeYDnKorO6M6EwK4esUmSCozu17lxY5vbg3xcK7ASPMu2IedXLzywEeuh+KPF24wAkM3AgByBm1coCy+6y34yXLk/OuGSuD6+6M/jZrPlQJX5eAA0z2+Ck6elJw+N0elkLIRWlR2hDIuRjnIH4LDl5ldYabuQtnpQPBSFYEYJTC9oUXwdMnr+sT4Yxftbsf9dNwsKQ669fw7Vs+/ZfpgV+9D9t84oNe0vEwVE2FLJRBJNw5HG31WUyUBGfkm7kiwnwYbtt+L+5+339Px3iWuun7XjrYPpiYfGxlUsJHlQnwg6sf8ld7yfvc+7PEzKIkWOAZ4c0puCLgTs51ypBLLmfUKpPAr4MiWLVi27vlpXA0iyJ3AT6SWvNSrh+QPv1pr7lwWVkZ120x02Qy9REFuFNPnQQbzv/fflLmMyADCytJiQhoJbi/7M/VzCJdjGB76kvedhWFr6bAyEqQZfDh8NKcT7tnWkrgOCO535zFwW749SLnQ+w35qflkxjjbfONv3a/IGcZ1Q6iEBXjveI36FX7zEorpjBXsbCwgnaCexf7s4xMo5jZiBH8Ef/Fe/O54wYuCMwBqVoNytUfhfjVeuC5u7UQxRnJ0v6Tpy/NyvXrENbnGFPX/3n+4r1sVImVjhWVz/Fbcte8m3mHcNIjiNIiMufByezNklCky0cM7LVunmduHsIK5hjmssBpNQcvP2Xxnb3m7gvbtVQHH0mw+7hflML1Ld+1xz9hOsaAr/Ss4jGqEErLzMgSH/czNF9InoYoFlbTMW2WiMubdNbI8AbBiBXQ5vn8e2sQmCsMLCKDLGXB9Ok/G586Xywn0+oAPoqsLre/wtKvH3f3n5wf+Bdsb9uLjyufbH7Y17ccGM1CJNZk2ezZX9+Pjs1TmkEEuE0t5Nk1gvt3FkY0ZEOajRpQdPv/m6/pV27qpTlyuXfFcmjmkvIHulhC3WRSvQzujGYNuxAmvx6Am176XQyTCcHYLk/uvEx9NK2aylk/z/zEf94fpje1xGjmhZqTaNG1eQS1SgaBpctHjXtMyl8x/z3PLkQRLk+VtKHDQgteFZ/+xSPLdBiqw2gSJYEsyK+H4Cl/tZi4h4+xKeCM7mapXBz1l2JZvDXN6BQeUagRpbEZAUtaMRkmCEao4+D4dPmLE5df6rKgyDMwizSi63PrfZ/1gKMspRbc8REkklWTKn+EZI9+FNQojHNnhIvENJvtnNt893h+pGXnmzJgWB4Ulej6GsCh9YroLGraSMGhlFjufhL3XGJWTWGohHAp6DS79pHxy/epZDCU8IIzgkVDMjnFW5E/IizOVcdZz5oyF5t3X4l4E7O+w5dDBGo9xYjBIyBu21RTFm9yY4Q67ngpF6/+v6/8/L1jn+ku4WYlw9Nnmt3dos6XBuGlFnd8BAHK1tJrTByTPwL2XXy34axv5Wmtv7YTvHVBidWxrt9pCosI4An9tc1Za31mM40SkDKzbV76FWOSXWKiSObyaNMZbf/0y+OVjyszikWAOyO5kd3m/qzu7k6XXuIRScJZz8rlCexfuxQ8EBHBde3NIoj7n/ssvWVn3reUMEaqAGW3ODri872l34xIpGFwi2i0mv3pZwcn91slKV4cfAQJ1BaXHvpn/u0ffO7hdh3c/brdfTPr4dZtLoLr/QkHg/ZP97NsLbNJI2WlMmeX/op88gfMcwA1y5gONUy0Ot+M4LatriumcNwZ0bLuppf9ovGr9ve7/20HZRjCr9NbPmGd41rhXXvR9ffwMrodzdXSEDB6zPqjm57Km659sc39/nAr+B34H52cWkQhcuEB9yw6bwE4+EgyaDuXPh7ghd/8l3ufp735y+HXZXzmu42pVUsW3wrq2VrdUevVN/WrlLed6rfmpbfOWhNNjGCxeAh+5jL+u9/87uby5V/2Kf+8B/Kv/0dssmjbffBHvLSz1deGF5yR7AnwMu7/gR6+f+/ktAzDS+8fR3rWS8aUaxCqk4t3PrjDpiuyx+hia3MxmwG3nJxvNZt1JZF1gEYQbfESsD/Pl3rSW4DLX+z0bPrT93/74LjnycMpIvgjnjnde2fhOCPbmf7tL3/6yQuH2weDuzvraBc4xad7vy5vrW1rnk1FpGvpduXMjIcPd7pu0yJmrJQYwUHEy+CX7sxPyLzN8GEYWHzaF/2eHrryQETwW/NtffkHrqgFVtzx0RT4ZPfDe18e1OngJZx1txevu7s1ZoTk5jZAWF3O7/t8s3l/embq0yUh0Aii1MOH+Kw7z+zPe1oMw8Qzyq/CA58T4Dv0S+fPNcveGOUlh8OZPGotXiiss51C1hrTau4hhA0WhWHp9z/2DVtH5yT1xZqTjGCXU6fTq9/TJ22f2t/qMbcwc5uUUyc/4lPheTvn5rN59qGCV3xEuUoOpwTuFArrbEcwREyzDBYKCE8PCrE7FJttqptBM2+AjR5wL3Fw8r+epS5CHRYWUKiTw/sf+/9+np05veitIWuMcldJKkDFWX87JYtTwU1RSgsLd/NSHKk30VLeAjGanWGybYk3QwbhFlAmk8M7fw1e/OXPz7PJrIVnxUcWTmVVZx3uQLEIArzSM83BIqvjrTZvaWZGC2M0u7y2YYIQFgjIQVSY7E4m7OS8S6MVUox2X2197kDJYh5uWaoIAzeHodGqqXdkFiMKl09bYaVSOCoElFpsGFLz0iIzSFV8pK3vHW+DqnBcrnBKi8DCcGtomEVgOapwUZFAjiM5KhGRtRYw+miYp6qcjWtXlWOOBVRZgIMZLlxkaQYxsnCEVyAhcATh1CxKCqZwpaqcjWyXY9VUAFxQEQ4CWcjcjJHuACJWCHeh4uBVme5KcDkb2w6hcABRBDiryjHMgjHorOoId0QADjJwydkAdxCOgyNA4GAYwXh1kLscAbhccjbKnZUCBxwEwVh2VvoKIWej3blR6DzS/4/0/yP9/4f+uAA7RqzwE2kCwlYR4ObgOnEmc0MrHAwQgcv9hJjAImQ4hpAVCMiqAqATXnJhhptQMUQYYXhYhELiBLfw5jKX3IWwwEIGEeFEAPiJLLnk6ZauSHAVLBUAjocDHpzAFgIzA3lGGJiwJiOo7l6MlX7CSkgGyGWGAmSWpiZi8FpLFKdAnKiSWQuLDOuCNIBwyz4XO7PY3juYRglw/Iam6+InFmTWkFl0kdkIAxuarJ27cu5xp29+p3uGqHg4OH4DEoDkgLvwEwcCNTqPzqyZWus8hoBYXNnvI+Kuena6tFrdy+DEDUeA8Gd+PkDg4CcGBJLIJrNUttYd9bOyO/Hq83MtApa3l6FGqV4q3JBAnuIFD0wKHoDLN/oEhiGUtMSS3MzTlxbPrw/67qmt+xQBML8USx+8lOLhePgNx5pH2nw3K3igKt/AEwaGECRSNln0/fzaviLipUeXTkdETQM4nweDx6QUr148uGE6JKjB3lElIqy4nI16YZgQQAqRtFlh1m2e2SKCVR9/gWt33/4QcGZ/cirqpNQogMcNQd7cSGtd++L/2Bii4K6CyzfkRJgpHBPIHRTpTs/5T42IYOW9j31JXw5isnnTPrxod3Lgql4UTnNfe3JhBl3bfL/nTbbLNIpHqKjKN95EmJkbDXeJIB0PC3jD+0Sw6tX7y+xoZnFqd3fryk30d/hJvDhOaAD5WkMKI9Lm5z9wuHPv4lCnlIIVORvuCjMzbyWrrAWOBW5Wstrn+2q33u7Vz94h7r9n2Lk0z/BhONytR0/hrklcXWapTrqZO2tcYa5QmnUZ7Sft8ObDZR0KEeDyjTWBmRFZGyIcSwuMgEm3LPXshQN/TH/wcG/72UVSfHlqOfB0nvnc7d0pBNUKcvnaMszIYiQWvOSut12+Oi1eAwucDXWFgZkhOfK0gGweUJKhlN2ye+HwlZ/9xO37F5mkFwIOtsPu40k3X51UwiMURc6aVmSYm6yoTv88Xxz7zCdfPqjFKuEK8400w0hAyCw6t4TAkkJ1j5jU6fTq9ic85RfrL9TCuiLVYtOc7voTOXdmsr0sJYIIsbYU5qQhz+Bw+8Jb4cWvPFkdHIsINtAVRrrJpGjgDaNT6cOJUqxOSp2Ucuhv/sz9s5YD6YqglOXytvflffcubhcvlMBBvoZMYeYZyGwok9r1XMk9KoEV5PINMwHpaXROk1l6dK3fPBJy93owHQ4uTodiRU94aymJwM2jxHA1zt3Nl9++uqweRlDkrF2FmYU8kRVrZASaMe0mIhShKt8gUxjpGc2ik1pLq3Bm/sC5g5mVmNpsevLJ26dKtLQnvv++gEIShYjpxQffwh3zyfa0MMUAl68VhTlpyEDSIpcB1N5Ix8McORvkhlnImqc07/r9rr8as9lLI4iYt515Ht3xdvWfuZz1L3qfiCkWJooLqOXw1OWn8oqrV7e9Es7aNjMjS0IPXddHQFnO5kS6WVEBfENMkWGReG/Za+dS/5SDV1pnwXV/6NN3IiLe/0lzq80cy2pRrQyHw/TVvOrh7YNqThTka0Vh3gKSlka3bxacmt77ojMyQ4UsBGE+TuTrNIU52Uq2mq2/stUipi/xCG6+OBmGg93t3cnJiwfb577Sj0eWL9u9c/YZAUaoUK2W58bbce3K1d1SCmTg8rWBWdakyZj5fIed4PLFy5devtUyKYqAiMB8PAiweNn9D67LMDPDG3Rd7nd9BEddBHee3a2TIpqxOc/Z2cd/iMo7Pv3SrPcEKGbhRB3Kbc96Pa+/98LEw2UROGvTzGmmOvdO86NuK7i657Otnb4ZmKqbW1gJ+eiTsdIeeI6xHleYt0CRatrqZhGseufJmUVnkWZKZMUOBrWdbuEtVDCjppXiDHsnN+/j/HAqjBKAma8FudLDrK+buXk0i2Byy3yrzbJTZ9UKEarhzZ0RLwBJvOX+J1isy0xhpYHMurY48mBlfeXh5mIHB0szM2S1OF02ueRJmJu7hQ3DsPvkz+aZr90dLAhzBbEWsEDptK5tnl5EwMObWwv1nZEW7lHCCQ0gH2lymqvrj/a/yUkW1uMKMwuwpNl8sYxVDt+2XFzKMGEiHbUiN0S06NyFvMhwXMXr8sJzPuOmi7Y0jFAhzNcCSN7kObuyFQG3zLZmdiRZBtRScoJb9VaCUS5Xq9lm3Tf8UuSBfL0lwhwayLNrW30EwNXbJptHsSCtNgtPMxeAvHk6gjB5kVnBptqdnNVbb71KIQIsCPPjZ+YWRmdtfi4CdkOLLrNb7HTB7rKU3ZyaextspMmFp8023/3TW5eluQsfRwJ8TGGYWeCdIdvsPQAunIx+y2bI6jzCUGA4khsWEhARpkGlq54T2z71gs/xOb9asGhUizA3P26QxQRqmxbAclPkrN/Z7/vNU8vpxclQY0BTRr3ojJ2jX6QntdbqIDkCfLzIMCLDx5HcsioSDb2sm80jIJ57svX76sJkfQFakVXJcFmYOauaudwKRtSYnnrdh0YnrFpWiwji+Ak8IU0loM6n++p2FkREnN+cTvaWQ/FS5AobXXKRnv2ZL7156cKsm8jVqoh0Bx8bslTnDEU+fuSNkGe4ydMWOwTs3nK4pZ1O2Qx5Bma4EgjDzDl2hMAtgiyTybt83nODZXglq4UV8+MGyDERDuCLdm42i4gAztzdL0+eGryAwhnlcim3HvceXNlsXZfFaYCaF+TjwlLzzZ+t73Y7C2NX3mqaWaGFihZbWwEP3jadzfYbfaTM5GnUZqgiM+e6upmHCcJKyP2f+fMxsWpEKVmtKszXwEpr4QGNnf0WEay+8/K2e2F3SHecUS4nmW2+tcXzn7a5rTYRoM6IA6p8PAhtXnn9u565bRf5uEEuwkzmKTSfR/DCvczTM0WXrSjdm2eky5Fz/crlpAX9K//2L6i1uFMKQURw3F0uorT9IYAdRQTX9dV3f5PVK4DFCENWGudeg73dHa+8rcsskPP5gsn2rgVjMpmf/26XV+ZkZVW1rtQ6DgSkJ2EWZm22eFPwHM/ZJal1ChoWGYaFIed6lcstWhY1ny2fktvLXa8TYFBEmB8vShbI1NaKlcvhoG2qX4VnPLkE49DUFh8L3wXf4Qu/1HNERpu943/ptV/0f5NZxwVYz/wTP45ja/HQheWpMgZARoZktBKz2WOC7/CSzi1SljJLjHSZo+B6z9K8K9FMObsWH3nv3t6ylFKqvCiC4+wiilHrxwbA4T0Hh5b75+yKgHLx/m/rO+is4SJstIWnG/D4P/vlPYC0zQfv+6n5hr+0GKPDyT8ZX2q4Lt3TOG+MfoHLyOyQq8vHRHwdL8/zXRe9GVKASFxyrl+5XOYZqcic5WbwzIPDi5Naq+Gq8uMUEemKidcv984XJtOLmjHTrCtnFsD0nrOTxZn9RMbo9+Esy7/f57r35GQogFq/yZ3/7zpGSh7c9ivB8sDLMXz4G7yxMhZl0LKz1sWWfXjE9/7h+0fqvDMjwdLCcDnXe3MLkSUlk3UetDfl8nCIKVVDFovjA1TVwA+/yac98RqL2XzWz2Ne81rAgxeiO73ZZkEbUqPMCXx69jM3pxf3Dg/cB3C19+Rn7+TEx4arTE4mxQk/xsEH+VDHAkjWbV3amve7b4j46PfZ6mZdWHozQyADOcdT5i2avDNbxBCwc1M9HKotrXaDwvx4UeQcDHsHw7DZ960Zs+msLYIH92Y273o1y5KMevfpXt9qmU5qccCTd/zsvdsmQxkXECUHKMExfbrtjEmFcv7xw4XtIWL59h+Qi4WHutKH20pHHEeBheQdZmmLSVvBtZ1ythaCKud4O2HuJQ/c3YW6kLmVzc3gloHNTtmR0XCL0eVyCj7t5JRavEDp+Iw3X97drR5jwxXVCPBjgDMe5YpA7/2e+xFx4dfvs+ddX1paaVXNMwzkxwO50q2fZmtlVvqIFXaFOq02ZU26nNBEgxejUTtSNesmy1u0NbPWlUQojFHuYnCUUNwLLnx4zKcOk6FiZVzgjHcf3vZEWD7t7v3WuVRSLk9zM+O4Ck+ii+gRffM2BCuPuunSS1Lk8uPjwgMbNGSRh9GXRjXzGZ/v9q0uQzEzTzcxyl1VhANJAccVw990uwxeCNbBLqgXv+H3hVsW9M3pSjoZhoUFx1kgi1SDWV+7IVZri2VxC+Qc/wh5GDbIW5BFLqxON3m4HaX3lhGK5hajDFdFAAPHrMO7TCtO+PrHhUct2/ff/Hqe+C/uPEzFIi3M3BQcf2GWWN8trJt4sLpsEDjIdZxcgBNmno5QyAmb9M+7bz/VSrpouBmrZ0etowcXVYhjO/UUDsH6V2qZrZ/N5vPHfwyf/c1NlpPJtBYfqBHO8RakQxrdfN7bJOJYp2zWAmNteiR4BlKEsiSwH097UxPRSmJuJj9G94Ff7+dZltGDI6cYoBXIQRV8XUTXuta3eN7b//Puq3Vaa6m1UCOc4y+noZItbXMWEawe9tydPjHZWgiTy5G3iIaCLnze3xeLUxYEZm6YgmN9xXheYSS7iMBwIUA462OZ6JAok3/xTb9c73lmqMPgFXfHWZPytBbZ5rNlcMzlg0949tbCO8PQ8UOeRSZPM+9kLVILi1j4JBzkJnCOPXniZEujCUdhYUIkEHL5eghMkHhMZt/w47+O93hqGWoUd8dZkwlWszVmimOdumc5a/tdNjC5xXGSg0JGkkp5s9Z1ZHD6FB4FU9R0XYe6dDGyXWEgWdeIWgvrYxlAuE9bW/zive5gd1rccZw1KBcu793oOw9WjYtnvVfft96VTnLchUtAQ9Yx75oNCyLYqV4K4Ijr7BGM9JCU/Xxx14csdwfJ5esfMAD3aWZrr9pelsHdcdaqkJvUWV0tzh6WGX3XGiQNt+Mkl3eOJDLVZrPspO0IOIpdV8niAvw6jEPr+/0zj3/m5c5YJ4uVQykk9nCtxd1x1qYcOcJaZKyI6dUpi2iZZtabgcVxQp4huTqsmy26vk08IoC5exSKyeVinKq1+QNP5I43pqT1ERBUGBIKUHFnLZtKw40AKGd3rYs2g05yGWYcNzAsoc9ukZslIoKVDR+SMSzr+jPP/965NBPrZyeCWkFACZw13qpF2iq7h63QMrIvScPT4jjJQUJSWj9vM4/gmHKgKJCbjREhtaO7IEHrJ3DCAwoBzg1TK2LPrTQl5o0WkhvHu3k6rail9bNNj+DYjqenG574GAE96egrfQzsTorj6ydwd26wVSWdBpShUBRkkq6saXHcQIIms/l8NongOp4a9iExcGNcCoR/fZOPfvZ7xy277sR66oZcEkqUGeAHTHpvkaWL5tbcOM5ypXtGmnIrPYKVJdLgnoUaZiDGpkDA5cWF175+fnlSw8E3PtyIEhFLHYEvzRW0SDcyQhx3OWrIs2vWewDEMAxxiQu0WVNGaax1reI3AIEBeNm9emcrdXdwgg1QF4Oo07LVwTAMqTQ3UoSxJkRgPZpHxirTU8OBXdn/Jq9dmWW6mqM1JDBbJQN8TQk3DOElfXIIMbgXNjxdLo8s1epMBsO0pGUIBQny4weGaLVJW8sAqNunJjk84SfvQ67sZ6i3IMOug66LQRzLAQEIaRV3QvjakVsGAodCAgX3wDc6VrobUbCjgD1Ti1BiWBjHXy4LDJ97mmJFTLYhDuuXfbetLXVp3nCxqgBHx1CAAQ64AIcGYnU1qly+VuSyYKXAKeBQwdnwdBXMKVb7nYAH+07pfU0Uho4fcqGQDf1MNQCGg2Vn01ymLWg9pa8doBWOQK7VPFlZBA5EIiAlE3i4l0Z1+doQwq01SnGK3MEdcK5XHcs3AFwUw7y2SvTi6pRzbn1tnsjla2BVM1pIZZXJ9ixqqxaiJSlvLgDDEGA4CERZxXAUEKEP+6KIliQFSokJrTprUoA12exd/37LqQM4Ds71KtywFS7w9R64qDgVmxyJk+pLE0iBIdakMIzoSjddZTvMFXJFA9ISwAASc1oB0iHAQA7yCIqwe/8y/+m0Xp21KLXUMh8Kkq8BuZxmbfGyf9KHnc2SRZUA53qVm4VihXCXr/siMCdKTLeXb2JxGyazBiaXr42VRhbrYkWt1ZB5WJYmhYUhAxmBkcUQBSNEIJcqFoRBeeXftF3anS1mDR+mw3SSbdIqa1Kurthi9s3fe7TYnQ5AgHO9KiwS55iq8nWey8McmE4mX+7pd99xbxc08BaRwVqUryApSQCUqTeXy0CBYYkcgXeRLrfEDCpYglGwqFjghSS3H3NlNxe2e7i9N9mdZDdI8uMml6erbW7ydWy2lgLMnetTYEalE0Y4xVuVr+8Iw4Pqwd5tL7jvNe/50Zk1yVCwxjOclZPaT2aeEWaGReJCQKoKUhaN4JjpqOBWC0F4SfTG05/yXfA1fcS9d568Ot9uiViLcmGS9vGtvmWCnOtTeHM8mxUyANeAqnx0tLc03fjCicBKTKbLk6/9Tfocv2ZfmEZgoVhLYR7JqrUYZm7m8oZKAsg7p0ELMiNalFVapBGlVCKKmxwj9cn/9c/4QH693uXrO7ow21aWNSAH5Mmi56atlkYWrk9Bo8qQp6wlXr3mRM7ozMXPzlv7G18uR6VYjRKlv/BBVz7oTyYwQ6xNF7go0Qq5IoqsKszC5BZygUxuZqRlS7WuXrocmGW2jKFSvdaiMmCkaLzyza/gi3813+FHbLaGWLMtWr6ID5xnS4EeMYGEMDPvUJs1leHAi5dWR4a62YtPd228ycLXHLgGVMwZvsT7fvwnfMiv0x00DPkaAVdQohXSVlgrYUOGqRAIQFYkE0lTl/P97ovd9tXKCG0e9W26vO1gOWUYMmoQBtOpAa959dfUhLEmzbACyDjfzWWstEdAIClBNS2y7R9d6g8uXjw1iSjIR8WsO7fdKcdZdjCUNeeqzQvhHh///q9+kZKudnKxdl3FiMHKwoB51PAsFCzNQeC0ENZao/U753eeHZ/2nm84up1YubNcXn1weeBDMXCgRg1gfse53hKtiZVmRknenKAmAPl1EZISmSLB+q0rr3hinH7dc85OaxXOqGC+tdt1pvGV881/3i/Hdq1rDVdtHlCHAaxr0OHyteLCCbdBJfoO0OnJ1AYAFZMDpIVCRqf5/PxRH8HrH4qIYNWbntFNbzl14EMU5FFqra8A+LDOAF8zUDCx3bIlyoHrLiSllGYeTdFd+tAI+Dzv+p5Ld8diNIjWz16/02Tjq50785Hnzh7K1xquKoqHldo6pxlr2pG7ufuk9kfAfBZsQ8mSHsghLUxGNlvMrswjAuaf60M4PLW46SkvAXj5M07esjv14gFQpi+OqzN22naNwtqMQOFyBZ89n3E9CknZrKXINpj1XzLi1GufcG++w87XPglcPhKAGd/t0UysQfGH+dyjKPvzT3zGlcsy1r7LcWlwYFZBa8hFAYsKBz4904BzmxdrqVlazYjonHAp6DrLxd3zCKif8PC5N5V2NFlOTn3wFWDnKZPLu9OiAj6d8D+66cy5XD54+WBaY1gTQEncD+7k2rmtNLNHQEjKli1bs8wWfiYe9cb20B3nL/z9us+4678+DcxHQxTok+tdkgBHxrv/jxhJef4Un/InyxsCDniYgCLka2ilYyV8amcn+3cD+dKLS6JYuAJcYBgpdYvTXQRM/sVH2XtdmB3cc7C9desT4SHtbQ9yKr45uTx/YetbPdjenuKsRRfgbmX7JPztv8LRbQEQxxKSslPXt1nM+s1FOfc+//YPeFzpcnN2Tq975dZDRy8kRoIP298Fd3A9SwIJRwb8axnNee4in7PgNwRwFOGAzFnbLnewWn1yeHDtAWC2eVAJC4pZGJjhHdhi53QE7N4Zs6MuzYtKOXV1d2fzPnjquwxW3FTKybbd9dl5KZODoQ7UOH4QhofH8vLf/hfhzAf8j1oKcZ2l7NS12azvNo9u+sQu3u39JtE1iy6SxtXdd/hTh48Aj+HwHd79mxiuH6HWmhq4nPKqUdVm97z1s3YLN1TnhqpsrbXs+mz95NJDwPl2qkSxAmEFRchq65oddQHx4N7WZicUePh0Ws7arde4/Ox7MtwKzjClNzllKLUUCD9+wkCJytW3f9n/5p5P8hKuY8lbzSAtXV31nTm8fj/rMKlEEbj76/njMBIFJ1/3jKM743oQDQEklJte+v2+zspoUtPMhkm9/rTCr78brCSys0w12Vnfuq9x31JnBy9GeDR35JaYFvMIuPnUZtcrzQolqnwYDo/u4M3nn496v3ShgNouQKGUgRqsSROA+d7yzf91/w7fHJ5hvhogMsigy4PDKXzYW8/NoJYaDvJS63er0QAcoDvDHzHRUDZMinioPIesjGqZuXM9CwwI+cgxZUNpylIOLu5OX303rzrrJye1VqAG6QaKricgrk67WYZUEzy8xrS+9kvzhskf0bK85XVBOLIV4QPUCF8LwiDlJQ4G/8SPu/OsOceUt5qEJdapf/B1cHTfmaNZM4cVgBdnZFbAeYRFQ52y0ZInXr6cQ2UMC0sBXuQjBkwgMr0MsXv24Ors8/KKZzxtcmq31AIwNA9LeRcBp05pU8gwFaBE8YtX/7TsPP0f/MQf6M/+Z4riDpOEAuAe4azd4uFlUuLjnvqZXy0RqwECa2Ez2fwkcOnM0Vbfp8kYm0JdZpv1m9378uvWHajVcdTQrGWdDFU+gmSi1DJxn546tfyIM+86f/TzH8UwqbsehaBRmHkJuFg7mhouRx6UqNODw9g//dWePPuP+JBaKTiDACoROGt6IKKm3/v9vuMncJ0lyE7aOv0w7J/b2Zy3vknCZWj0CanLnPf7R5c+4N/+URltAvJxI+tyttj5T/0rLu5aMGrF6lHKhKjL7bPl27rv9fx83fHKf2xhcjAthZJqmg8BezX7kJCLIpxCnUaxvukVt14bChVQBYIAZw2744Hjcr05r0PzrNHTmY5Od/C+D+xsLfqWZkI4zhgUKGeL/Su3P/Rv/2NvtgTkjJ3WdUfn737fc29jJNsK91IY3GpZLk/e/PmOvvL5G76fc9/5t3pqMhR6UzdbRsBzc792FmZZMxygWpQWYNAGagRUVjpr28GrIwhROKYcSGg5O3d6FrQnnp/PFpktLUGIMWk527zyxDe8G89pmDGGRVvs3PGM/zrzzKwjaNWopdqgElXDwXJaPq573KccfcZrbv1Pvxky2/x8BFxdzvoWahDmJg+KPEAGYfLKSl9l7TuAgzmPoLwx29+5pAhe8erzW33fZ2ZLMS6lVLc4/9ZnfgYQQA7jqJ+fue//xrNqoTCCRcDgVHDHJvJaJkN98KuFxR/nUS++vH0tVgLf6plL6oQrPTEnADcwrDRzB+eG7DziLiDJ+fwp5yLgw1+0v5i3VALYuADUbd309M+Ab/jUAVAYR23zgcdy/5fcmxZGtQMlzPGwKo9Sp2WY5sEP9EZuOrr5yrU7Hrr7Gk94/pmjPlsaJSMQgLPSlY5wRnLJ/JQnRgCPe9NNW33fy7LRjDEabf43vQK87uZpjWA8LY6u7ZSrJwvhI8mBygC4HIocwqfTwoxZTsuwPDi5uzfccf7MLCVhZpGOA1rhciRnFLtchXe41uWlK/3LTm+2ZqlGAhoXTiFefERsP/f7vbA9FMayrNucWQyTYWBkR1DNPUtGRMnAKoZVlegm07Lru3Td/qx1loRlGE4G+AohZ3SHT/6I/7cr+3FqeU/pW99EKiXGaUy/yPuc349Tt922rFHBxxBNJAUPH1lOREFBJRqFLKYCqhlQvBQNoVQXapEuw0VBq410L+nDcnlqMpno5G6tHFtjw13DZPttfWqYTA5qKe742EFYAiUY7QEuIICKnAyXUS08hsASSVmad9VMDjij3kElYhrD1I29SYlVJManC4bJqa4lpdRSnTEtVvXR5shxkAsQMCBqZBBFBaBhIrqaBONzwEotOU12J1NfZczWpslsYgZRYoK7j6Vx6YBw3MANJAcNRSUDID1kZi4LxqZ7GzwLQwQHk6EW8DHjqo0JHXIGHHd8/bLSAQwIwJEcCsXEqvJ0yRmbriit1PTAqLU4hbHrqs0ZABzccdbBzurCHckhHBwljpxx6kZRVKFCqcPAOHZV5Ks5OOtpB+QOzQFVQM6YdQtcgUPBnTqGcOF1BeCsvx1EZaXAGb8uBwfh7hV8DOGAAGe97ox3Z1XHHZyx7WzoOyvdnUf6/5H+f6T//1CTaxU/USeIVQz8BJwILASOBXbCTQQo5CDcnNCJNbkhcwwBBQLTiTS5YXg2T6OEvChAJ87khuEziwTMPWyiNNblWs3XV3LD8FmRZUs0GQo2yEzrL4ElVISvmwRuGN55xrwtFv1h3Z64OWL9LUtWNqhaLynAzNzA6Lv9M3f/2/ffbTsmnsjGkyQ0rkSiFPhAq1oXaTV3ENb6/WvPvykmLz81jeIJpjEkU9+bxhRG65uyTGeDsy6WN5fJHSKrdYvNv0EEdtPhUCKEGMPS5pVL+/Oxleo3Lx3V3b3d5dDWRTRP0lChVJHfyl0B9NcOl5RkPHt756/4Hg8ctdQ4EmTuP/orf+yf7OEHW6to/aOwrt9Kym6dejwQd0wf9cYPfsND7LftklOBjSHxxu1P+RU4mqeNo5U2+5KbL/uTfYU3NmNdnNL+0ZX3+ovf9I/9frs3P+HBV37ZD/zws+Wp9pU+7aB4MK6nHx/PnPWM7+kf5ku87CmnZwm2DtFqfgxZbu7/j94Hls88u5xC320uti7d/pJ34+/5bT18dndMuS/3XsysE/KxFHX7/j/7i7/ka94ese4UxCoh8GM8Oz/yi/H4v8vbTg6DkX2b90eXnn/7Z03+Bl/fycMxpTI5vPnmR5GM6VoOHnzt3+/+/3dhWGeIlYFwLAjhq8wWl67sHOzds1xCM7XZbLZ57qHv6XHfxRsv75HEGHKG7VNPvd3Bx5CrZBl2b97/mNftOuDrB+GSC3DkmBPIV7CYNdNf/B881JJlRrbWzzYvvfQ/NXmf+89SGMvBZHnyuUXGWA7qMNm+2p4y7FKC9aJwycGT5iAvCqMYnqRSJB/1TgWgU9K6fvPMla/jqc896RA+hjxiMvnKn+kxlly1VSRwHF8vyCUHk8BFEKqBAxgkCFzuNKBLNZtt7v9dvq0/2Z57YSx7GSaf/IUL49lVLb0ChcI6US7ABEQiWgkvOWBWAgzIAoRhNKCTtVx0f5fPuQ34WIIyPXjMv2lM4YpqrCysEwVggkDNu5bRTStTCw2lOrg8CVYaRoOUaHn6T/sxlGBcex1+icqYwllnKqK5WZjRYepm+20yHEyqAQeTEs6xBWCGEKS6d39CYZyXwsawgqypkEk1tdi68s5P6k4v5sO39aQrs496bMUd+SorBQYmELzGx9rGsWVNhcwiJR3d+pqIO7/Ebdv97S+4enTHN9l6v4cIPxYgVloYWcJP+CiCVJgaM2H9zl0RfPPvyiwo3DO4B5/xku/8sTdfp5Vi1XBOALcqkywXs+7KVXvHCOJtWzNPWrFCgQznendO/BqBzLLPc+c+ND75VREPv+A577rfCYU5OCe45fK0sJxduvujIj7m8B2+rXNPuf3cTq80Vp7wWtkiuq4/c3sEX/Eb/vAn5nyxNZPCwuSsVZ3Ysegsr52L4PPdtOnZslNn6aawNZG3poRWnrDB6LdO3xXc8/W9dL+jM5pnnbmZc/ylvKlrWmlIJ2aykLOd9wte8Ni3nNk0gyRprjCOvzAe+9auNUkpQydkkKTPG/EnPfOM84vW+tIizAzkx09YKl/aZrOu66SU6QSM3JuuPeZRn+/Rl87tZGcoLMNAznEXZsr2rc66NutaJ8nQCZeI6Izv/T1f8YZ21KulyczCQM4aMFO2bvHlz13a2pzlDEloDOkYviHjAo9v61/x9FvbZotOmIEM5KwJSa3f+hwvPX9pc95nBzLGr2hAIdigLRZbH/7yx3XpKSSFpYOcNSgz0WW/dfUdXnTr/mI26zoxhpKcdfgwFPnGDAz3HFyTrLnCCJkjOWtCjU6tLR7Le99169FWa0phGjMi2+Lf9L1PdpdDZYP22j2TKI2wIIUBctakUENk3xaT2ce89dxi3lKIsWt0m4+995mXT3ZL+YbM058zyAicDnfkYq2KpkTZaK/lqU+/datLxq4AidkF3vIO/XZWxnZ2DOXG2nv9byQKgXCkYO2KhmQYGXvw1NuPWjaBjRNhmNJIvrmPbcLG2Be9+OgDv5H2R2SlglWdtStoStJEKcDtz9/sjTErzBAw2ds7KuaM87/n+3Mj31n7oqFME8TBKeArzQwbK5LJJFIxvfCsb//qwBhPf97+cCPvBigayiaZl+n2ncCVaY0AYkxIJmsNQMT2J39Nu5MYYyWr+zpLNETXyYxY3vO0ePuv/Zs8Ox2KMy5lstYglUT6y957b1Krx9jRKi4vrLflcpmINGUpe/f+TV+w+1lXdocy4ONBgalmMxKM8pKTQy2Ejxnhqwjk6y0EFhnRmCVle+tRTKaTiQdO+BiQI3zmIdICtt578OIEY1W4AOS4WG8rDIsMWrYkmZwMH7zWYYIHY9EwnxVJ1luUyV7B8UA+RuQIIXBvFfn6CjNXRib9Vov3eh1DKbVUd4hxkXVWomWbbXX+7C96amkFwBmrEiFhA6VV1tcK88TS1C6d+YCPfVdKGXzwUos7+BhQmKerpeZXHrj7Pb73zUzGrlyq2VknJtOhyOXrKcy8BZn9/ov+4ne9YA7FBy+1OI4zJltY0+a1+76Vo/rJbRwhp5PNTs+Hs4fbg+Sss7Nks37zzB/mDI8HA3cvTsUZi2ZOkv2lO/7t8DeFhroBfIzIaUHrTr/p33Pms+/vTCAfQxK4jyGBywx158+c4QW7lfBCGcAZn+nRs7jyzlCn1cMAghukMCPKmlsp2f6tX3gnjjqJG7j8BqI2E5Opjx+Qi1DX330fPOGwADi4Oz42kIXauYBv6+wUwrmhyqH9K97/rPsNANnigR2+WsK4oWoVY/8w/AaRmzufdeG73WYsZxER8wxO3XZQAWfAA2c8WgAIB7htORkCfO1pFYTp07+n3uU3AGM2h8tDcMMUKwWht/xruWHmzqUXfuWNMW2R4DV5+OLgpVQCCGdMhq0oVifdnO3twAtrXjhthaf8g057BDfAoFyFywceNwThkguX8Snv17v5DWJz55O/VI0xtbKUg9N8w9vTiADHGa8exLD9Ee/IxeW0VI+ytoRLOCmw+C7+1OcsMF97Hge3Ue7fq8XXnlzCSWHpn3tfUeQ3ALUFTMZY2GR3vx3UUik447bIwoe9gMuHk2mt4LGG5BKeyC06uo99+2ueUYSvLcemyz3+mZe3J7VU8DUlb453WZTGX+gDGExVvvaQwH1sFaIMh48b3IHAwcdIhDyql3oPXN7drYWKs3blAmvFFDL1f7V/3surRUAYvmZcTkQsL9YPenC3VHDWtLxVpQLR56O+i5dPM0qr8rU31sNcPpQLz0SigDN2PRhse5dyYW+6LFEgfM0geUY06KPr4kn/pRcBYURBgK+JlV68Tv9Nj92dDqWytuWtKlE0ej0uvshTqObeqvzGFFXhpifzXlkdnJU+NtyCcLPpcptyYXdZygQP1qzCvPMG1hmz/u9y72NqEGGDmoNjKwLw4+JyPGr9+x1ELY7jawm5ktIZs27/S+zdujRVUQjzG0tOmApZoueuDtw9wBmnEYR7Kdtf+Cvf251OB3wtGZaeoUxsa/Hi+NrfMa0E0VUChPlqYeDXHy6Xl3ISnArOGpaLJJLMPPe4+KD3syFwpxXMbxy5XB5Z3TyZz3uPwIszXjAvFsvJV/yEq7uTAffA14oiAzNSTfOdo1tjxz2IUFVJF44oCCJw4dcbrgoCx8FZ0/IkTDZn/9yL4/J90ygYURQY+I2glSUd97oHaaWEOx4+RlzhhkeJva/21DAU9whnrZq5aCF1dFtXXhYPv13NAjiRDi45ScFDOC6/3nDkzkpnjQswS3JzZzM4fxGsBOEizBHgN35cXjDbmwBJKRQIxqkriIK7nrc7UINw1qrCDIOc0c/OtIh7PzjBQwUDXHIIzJG7OS6/3sC5QcrJEElnszO3B4uIKGAhD7nwAMNv3Dho6GoM04NPesOrS41S8GC8uiIiVLgTiMBZu3KRZi1m/RmLYOY9ASWJIgNHRMgj3EJBlV9/N1ThFrKWuTWPYFbSa1IyIl0FBQ6G35iBCE264suDX5v/9X8hvBbHGbeOItyAAGdNZ8itk/r9rg9YzAfCzEuQGGSBsGoqEeEWqvIRAyLIZHYtA9SXUCGrIuTpRWBOyG/U4GjZlTj8hO/pezo7TAtOjBtwUADOmpZDYsj6trkTwfQoZ4N5GOBAIyEnMJhNRESoykcNtIDZVh8BfVgEFEUrZMgoBYKQ34hxI9DU6uT+r+Oz3/0/Xb144GMHcG6AwpGRzbbmEaBF66pbtcCEpNIIzxI+FDGERajKR408sW4xC6CzYtTEgkbtIsC8EAQ3aoOAQfVs5jc/raVGODeaBaaQZi0AOzdbdhPvqgGpRucYhalH1EIpGaVVRnBzbe2vmFUrykEYZHNRCKcQIb8R4wqiqALtWV48wrmxLAfMmnfYilzsD2U2GQyLJNvmzrx34tTysExLxW0wHPmIcVFba1qxqEVVhpE0dZExqTUIIrgx61jgKmjiUHFuRMvNnGZZV9Dvbw5DNzWrrfazc5ubtrkZs73bpld3J9VjwK20yqitDS90APuxrawG6X072twsJ3eX7h7FbtyAy3EQRODcyLYAuVZhdi0ndaZJhs3b1pmIiLQ3PWV6223bkwklCBz5SHFRrZS9B6iN599cCq26yK574L2euqn3Xr7WKzeCHRAOzo1qlys8wfG2CrNLXXVv6W13sR8c8xlvuPfq4aRY8SjIGaUuN68xuefxt9905a5563bdEyfy9EPPj/i093rJoz+3Cm5xI2elc6O9UqIdwxY7O5F9sUk98BV7Z5f5DPiAN57d3R6IyMJIcRXCiYPDq3uRV+761OdNS3GKdz7rAzq9+ft9XBhy+Y2fG+cu96IaxXZWg51uf1MZcXBYBVG29w5ue8ZNfJ7X3nM4eHVGqwscK2UyHSbTgye/ZudDnzNMJrvV02ICLHxSkg1rN6MqiDLd1t3HYmaB1PqogB2U3eHgrJ7OX/zNVw8GlzvCRwZUqQRTBo/psPzf/Cse86F750/f/bTPtffPi3dy4033DxEW2qDCSEOJ0uPWzVPNsvGI3//aO+9h84EXPZ1b/j2LbFgWRqloIJxSDpb9nef+03e921P4v/1dzk4X38XrP9TgrQfTIQDHN6bCmkVi4buvvHI4m+8sduarVEhb5YXPefgQnXnck65NdpQkI1hAeJnUWbfzDX/Sn/RLftA/9nC77G393/4yL//y7zc7O9RaihNsTJkFCgumy4vPajvzxekrV87P4OrJPWxrcWUT7nzeC7fLzrlnPPR0ZjOJEe1QS53lhfn++z96enXvAPbmz/pWz/V7Jw+nhZXyjagwo1mE3GtdHswW+0db+w+ceeLyW31wWdXPF5c234s/+/0T3f2ix7x8RglnBAtBwWsZtlvLvpUYaoXWMnvKwWSoEye4/eGNKAwFWKUMtU43+9nmYvP01uxgd28YIHN2xLt91tm6+Yyv14DllFJURg3gOEMZXKKlEe6FXFoaGphUB4/bz7IhHRYGYQWvpbRFm81mrcvikxqOjN7rZOL7d33lcOfr7hlKw/HwUQOOs8LSkEMwzZK4SpRa3INnsUFtGBDhHrX0OWvZpyAK4WFAFIp2Xv5vuonnvdPiZQ9+h7Xgwah1cMcBUgAOCDJwL7hHOBvVYWEAxQue2WlGkuAUgpUF+nbl1jserXv+xd/c4cDASHbwuqLwiLsT4QAv3ZAiLAyciFIasyRJ5EBhZYHMNpvNcnlq+3AyLdQYReAAwq+LAHeIwFn5to0pwsLw8HCsyWQkxyxAWEK2hFKnk0kMED6SwB2nAlqtQkAAzsZ2WIThQU01SLNjEWAuAYkXL3UYqMEIdwD5aqs6G+ERRJgTKWQgQDiACxACKOFloEb4CFvV2YCPwMMCASkeQeECHKdAjeDEdISVgAY8QiuTwspKBH5iCiJCHFuraBVHrHSIwDnxLY6ncwJeq/hqj/T/I/3/SP//Id3WdfATcQLXMcIAP8Eml3C0WoALP5Em5JDyFa7AceQnzgSQHDvMFbjrhJmAVGQxhAN4RKCqE2Ry0dUW1ko6qqpYAENDJ8TkzdPTksySpVgxd6wE3jgxLs9QzzwJlVCplKieRQVpjOhYvtEmF5jlYn6E6rSUUmoJSs2CxPgUaIUjfGMNYVi0T3lq3Pmt1npq91TxmLr7EIA0LoQEchru8jGmFb6uUpgLb/VRz376Q0/vD2K3XtjejWmloJQYk0JSAoSrVfnYEhghX09hZiFzpv/1/Ay4duaBMj88uXfA4KUCprEghDo1I0oZXM64Fm0xK8uJfP2kMMdCVibD2Wc9CbCHbj06PLt9cYgoHRjjUbTsZvNZ7k6mk0HIx5Tn4tJRPXlyYN2sUJi5KFkPdre5nZVnXrZ48tW9gwGlGIuCRut2znz4LSevnjw4KHLGdvvgx3MfsX7CzCwsoKgc7PrdEAY842O/1Qt7B8XE+MzW77zou+XTvvDlvW4pG1/x2Au7U2y9JMJcYekWbQLbkytcvThd3D2H//c/9mBSGaettdMPwWv+PB/5Lv3sAPmYit29l3FYWTcrLItULNpkXqcMMx57MEyuWuMTv/YP+TpKjA0JpMVp+F9/k59+7eRX+PoY2z692qi+XhK0QITMghKtU5y6p9bpwUGx/9vZf+1tJ92J8QAYrespt5z8N23vHjDGvU4BXx8JKczNZGYY1nV3xbu8tMsSdVmHzf/rix6gVManG5/IH+3+k7sHkwF8bIGzfpZcZjLMSKnbKhFvm5vCI6uz6FphjEZQ74uPuLy7O6lOsAEuRxayENnUWuxzU/zAHzyfuSsiTSEhGwvCoZa6x8c8eHI5DIXKhrgwM8/0lq3Loy3fjN2ztiMjFJ5CKUzjYPU6ya/wrO3DOhR3fANMjtxaJLOk27w024rgHV5+Ji0SR3hGE2PTvdTDx36p6kMt7s6GuDDDu+jo949O14jg+717S30YmQHyxMaDVkAZtoFwd8fHibDw9ZgcEQ3R+v7MDhFw9ZTtLDyT8BSlozIGhUFAlQrgUMEZoxIoyzoMM0feYra5f6mPCOBf3F3aQsIwc7qKRp8wEoo5XiUcB5wxqraY5XS5LOsvwwzL6Pqjc8+OAHhstz9v1iLDLMxc8pEnLBGeVQ5eWemMVeuOjh7D+yfrboW5sNLi9McSTHt44eHR0VxKwMIM5Ix+S817pstWWOkrxq36p/GPfTfW3QrDwhth+ZTgG+4fx2N3F1e2pIzmCjPGokhtXdr8jM99dQCc8ezTb/47fHNdf2FmYW2SFpOv5v2es9h99fO2du6edU3WAoUxNnP/Lf+pyWM6sGA8x3D4X2KyW9ZbQhEWIgr13ld3T15+mXc+d3ffOqUVZcgtxoVmn8kXawh8THk5JdVYbwkcyaoM3x42H/OcuiytzC26aBAW6YxHg8l3+6/9+iaDE4zrokI462oRhlkIs4oN0y/zoW/5ts4GQWZtbgozxqTBsHv5b/C2vUL42MJZfxtmFs3No4tS6tXzT79zulfAvRWZJxZjIgzfvvoJbUJhA11uaWEq8i4HyMK3+oZn37N3QEWGIbdgXEbJYfcbftXravgGGlKUVCQNb6QzOeyf+fDudq0WjmHGGDVX1fMINtDlciWRpCwtjd49eMVrt6eAzOUW40ErHKcAvoGGsJAMy0xT21/EcBg8bm+vZrGamBnjUBzTAZyNc7nMzE2tM5v1W7N2LSICdnsLLMEtxoGAtkoFnI104Ugyuvl8a3M+RATAg3aUSrfahTH6BY1jtsqGuxQN6+ezc5tdRACXH37CxQ/YmiGhqjEgaCJXFLzVDTW5LCKS2Wx2ficigPrCi6U/urRoMkzgow+astGIQi3O2M6OWtddq0rRaX73TgTAzQ/T72/NWmZKOGLki6ZsXfZZ6jBMaFU+lrTY+tQP2puuxyyytNw/FwGcetverN+ZZ2qOuZmJMSho3WLzaF5n3/BuFmdMt3NvfuKtYp1u0fbvC6iX76mz2X7TjIapFRM+8gTq2uzojpc/+h1fM882YWxduXzzS3yd5gKWc7jlZHaLmTp8Bn14c8R4tO7K2/2n4UzfJcjHU24u/KCs0ygqh297L65eTJs1SzWzpCQJPg6Esu1/CbhnlmKMZ1LWZ2FhZXLq4Pns3LLMlKWU4cpQlRib8Rf65/ERpbABX8yhsn3h7Ef1h3jNDIWRWCRj00s59cqSt2xX32hzAXilTO/Z/mDOnZ2AERkKIdeYcIh69Qkf/R88PKy1gG+kQRWBe63D5cd+6uf9mpaUsCzNzEoyHl34EJPt+/+13H9xWivORnsJRS2+PHjbQw9ZLoHocARgIR954DCZH+zd/73/a/cmtTj4xppAQCKmN73H90MpxUtFFcR4FJI6zVo+5pu0FIgNdSGxspZhcvjNv+lfS2AI1HlpXscBQo2ky7u+HBv3hnudDl/mO/tTdwaQBIVaWpWPPoQkZBQXaONNgJcatfB3+ae84XUzs/Qs8ihtkFw++hBIABWcjfpCdfa+yP/6Yy5dWBZy1qi7BybGpdjYd5yCFybf/OP/r//BxWHJzUtXFntvu9BNNS6O6Rt14Diu3D3kKY//nj7t6OiOj/1EePRz0pCPlY38cIeye/Wjv/LXXzhk8/ZvEpg0Q5w4D8Hk5Df/sulk2nc7nwf+S7seAPITYk4Ay70HZbTSb76aP9kbbxtWcTbQtXJMrT60g0bn1St7975td1KobJwLM6mZ5dhysKrKMO0PwJ57cjJ4wTfKhMusLRbztBxX4KptUC3D4Ud8xsdf2D4Y3Nkol0tg850nfuZmsxxbuKq8DO3wlu/39dODoRZ3fENM3hyTbR59v8/q1UxjC5e7lzo5THvF87xUNsjlrSpRXrqL7VmH0NjC5e5Dmxqf5u4OviGGXCYxO/+oH7gnU0JjC5fXVlnpDs5GuFxO867fesnsq7VUQ2KMu6gc09kwV4bY2f+zM2uWrNT4wkGrOBvmcmSmrXOwlYklMsa7r7KBLsfocmsTWmaCONEuK1kW8w/jVBRMgJ1gW3XWBfNJKcFK0wk1FyVrGn+e7SX4ihPrriLK9OI+rzwstbC6TqCtLL688DfFr+6WWCHjRLqLaj493PuzP/5kLaBkpXSizOUEUSaH7/3kvaG4JCHMkHRCDFxeVL1e3TsIpZpSCGtmdmLM5fKhK1QP29rfbymJVLe/P+9PiIEjL55D9e6D3vGlD2z1idDWuWtXZjoh5nKAGAa3j/64r/jSS3MJcvbXf+PrkxPmDijbzh3/4JfwvDf/eV55uNcdPflZ/4p7D/0EmYO7lPOjM0f1wtXdYSpt3n243J6eKFu9tZzNOiYHw0QuhFfnxLmDJCV4qQEQOCfYZSZWFgjnRLyM1Qsn7AU4j/T/I/3/SP//IbADAFZQOCD4QQAA8PgAnQEqAAIAAj5RJpBGI6IhoSS0iWBwCglibu5hVHxxcndZn1FOSXRLwB/APwT/Qv6FaHOAQYv+h/hb+gH+S1g/+efgp+gH+qtcfLDf2b+Afo7efM+fZP77/Vf8L/Sv//5r0BOXf1T+k/3r+uftb8p9Tfon9d/wX97/t37LfFP/GfY73589/7X7kPgI8c/Mf9D/hv7/+uHvk/vP5e/0v6Kfof/VfnD9AP8b/kf+f/vv+M/X/4qP1v9zn9w/1X47fAH+f/2r/q/4P9/P+V9NP9z/0H+L/fD5Jf0z+8/9n/B/5j5AP51/bP/b+enzEf77/6e4Z/VP+p/6fcB/mH+U/93sqf5r/4/3/9//+x9if7Mf/f/ef8D/////7Cv5x/cP/p/nv91////X9AH/O///sAf7z//+5X/AP3//53gX/0r+7/h7+iH//+r30f+N/x347dot7l9w/27+xLAHcn9WXyHse+7Hwh/c/EC/Iv6B/l975AF+f/13/p/4D2Vptf1xqAfz3+q/9b2J/8Hhlfi/UC/oH+V/73tJ/73/u/1noe/aP+L+03wF/y7+5/sP2i/3v9j/9j//+uCmTfLlSMWCddMhIgvuDIQEsEQX3BkICVap2plC1qUsVLk6wYOCkd2PXE1n2RUFMMw0cP6OSDSs7w071mylgiC+4MhARiXo+jaXmYQf6NFI7327IujrRMV65QBR7ghCSb66iPbTX1IQEsEQX3BkH//6AGbdqbMZv++gddfg5X7DVcQQCBS+VQCKuoPKG1eMWK25vtM3LSMUL4YODIO90OSI2Zqsqi8ysP/DmdsVNrPBppe/Tnhn+jegVPkWxFbIfLnmv9kbMVvr7SKKaD3jlbeErpr3GVhq0MTqVZlRIorEGLlWXLYtARLNlV3HXvtMvIYhbP2NNJ3XtjyMVq9/dKXls4KbL3v1IH3o4bnzMouCM3eSWilb3ciDMYBQMwFGfxpK240JKvli2OKaOe6Z9IQptGNovVx7qOSPDCJ43WqNDDqyEooDPU8nenRXq6DMvwFVG3GHSzJpKZbOBTgMx/927vKw9mOio1E7giqUE4hkYJ4Exjsg8Ej4/eRnYn9BKiWQ9X6YnwQWgC5P5KLhzeSr/JrJ8j91tJWQ7KWCIL7gyEBLBEF9wZCAlgiC+4Mg70VQaJf+DX1QRBfcGQgJYIgvt0ZEl1MhDWt6C63ghtaN1e5QVaBD+8dmKEDMGl15pvWveM5x0mEzI2Rjrqjp/4QRyC+4Mg70WKBOl9o+InQRp8PWhc1nJV72jDbk3vZM20SmujOAIsxhv6C77ZLPg1YxItCdoLOD9uzdak+mlYXqhuF77jHXL7dT27j67WxgskQoCmyipzOWdV+VHbIubPpgFkgz2yLuOXy/oK5yh+z/tV81FH5Tw5ZKbhr7PWucKJLngAo0yjtDOEkgWmoH4nqVn8hGNbEsjczy5Dcu/go0BMeT1R2PIJnEGs4QMOnBVkeLXgAW5FU5xKeRDq0Wdy6RoKMiwLQjvH6q5xbsvnpfidI9uAKS7OiU9de2COoO/em19KJrNdrpuRmSAd5B/fpU9uPnSS92jkQgZ/HCGkNvSVik8dI0WsOSUTjuw5ToCBv59QqfGd4B9RibMRKvbrGEhNuk0DfllM2m3mSrQw6yaLogfiikTpwz1Sf7LRJQEzNde1mZ8pHdkln7M3Olh1pWfpx6bIhtt3dP+lvdid1LFRHBruPaDiBkFEKUswVUPmIrrac6nu4c6QhWaa8afVkhZ2EdmBCItXuuGhli4EzxlMUmOLu2shfcJZh1P/MhpQBODYRh2Ux3EF9wZCAlgiC+4MhASwRBfcGQf+ZbVH/IExod3gjsXOtjQFSPCAjCTu/zUcqGGRvMReDHOOQX3A9Ecr8VRCddN5gy4ALHOVk24O7iyaSH1idS61YgguilXf2cEr9xBByUM2htJe8v7gyEBEmcAMHzlKMtMcHC3+/FB9DIsi4N//ObMEEH3aF9ujJeiDA0IvYjxAEECojXd1NGrSHbBEF//2U36BVvGhLhgo7dGjc7bUBUMOlogS8UDEmRaBJ3FfKiWk41BmZeJi1n1vGELdl8Vt6ACOb0KfvocEvXhJcTccUsp7vPYdjyfO+SaRe4colKhH1LuLuyzukiaho/AlgYRQFzAfhiyLwgD1YxkqVzJqseDMrDyqHfHdU9gV9CnJ5+8yQybpBVBASyCFyCIL7geCKOkFxLZH2EJpDz3mzWZgydDpgh9mbvywlld1E0SU7VxzuJLlOf0I22m0qGQgJYIgvuG5ZqxEORpvCo3X3BkICWCIItBygP+m0YP3BkICWCIL7gyEBLBDtVomJXol3gFnoR2S4daz2oxcnpVKhHFR1+uDITF2SLbqXWyE+kPKP5zAoutlQyDwHcJXa9UbZ5hREQXD8OwkPSE/t1Pgt7RVZiyXcgYLnzIOqaf28CJqicICWCIL6h7TMd/CAkbCZ4Mr+pjOtSZPkOYImrVdfcm8FwRxYQSfX9wYiAtN4zhNGr4P+/+4rDuQA3Mvf6iIOCR3sSFNLgj4idj+llUhpW5xzCnOQX0/23wsyJeZ4oIUOrPOXDjhl4JYxf5enJ0CIbSoZCAlgiC+4MTFY8fDY/9J7+qr+QX3BkICWCIL7gyEBLBEF9wZCAlgiC+4MhASwRA+AA/llw/Qs7wKYsXAgqyNkjXh+BgOQP27rpxdZ2tOKlKy+Og/GmZoKD1LxJsZwesGpqIOor4bSCZYLNRTyev8H3sBEPsFEoCAIzf5TeeaBQpN3ZzGtPRI/cmjRHdOCG846MCtY96dxnmYKOS3Tmu6cON7u02Ft0ufJyCyr6IJpIAE/Cc067DMgyFDNBWbbkFWzjNBIX3OevQ5hxTt/XXmMYp0iMPMCNWCMRpdcc40F2tEWA/PKvO/N9bT3KBWE1heBlunfgyd4Eo78XK1KKWFiwUKwXfyJvMZa91/TCHuQbi9ww6KV7TELgh1py4JQrEdxzQthO3GNKN4SMX8dGGMshWkLoRrf8rZhzLm7DSoFdSZVs0WGqWqXqSA8DRxlnXU67VWMRVKiw1NDz6Jb7UZK1yuUkHo0VdZjj8xsKzuASSN9Tutx0gqepVC4xppnJcY2Nxm3yBfcbYslIjwlQm+jp7m701lYCd4hbCV4oIc9Eh2jK5UBtA5Q99Vm8GgNqBv5o6B5qAU85JfK18PJnNWk9rrFxF52YcuqJL4qRH7ssucOWsQKYF4LKhUmnv+NThFYI9s7OLAHewtZZ0tktxS0HzNVjOBc7OPw2SKObNeVxQgzcl+4g2yuZjPtAwmTVH4kFHBI89Y2ysnrTBDoA5uLitFDA7+QmL/jgjoW86P2Iflpe5PNvMrH60lS3wbPUXecE4tOnwLEQBz2QD3VpL62A2RkK3ZEK/6dCArcW2FXfz/jRUM7UVyexn22MAfOsAuP388ZOaAPO+xv4/Pwn7XVjLWmNJS281uDMaDGYIjS8qQzL/uracGh1Da6LQDolabcAPKD8NsQJLUwWH7I56OrZzL4f93RADQDkmJJAUFnZCl7KTYcH/AHyvQ6VEBHskgQ5wHa0oSiTLoj74vOwMP9xlttx1GM9YIKnStXeJHCTEbaV2RXosncTkX5nr/3D1hrMaLJ6pwvXEkHFui3Nh0BQAxq3/ms0gkcEerWUurFbV/5SKXSvhSHBoPl/DBiLAP6Bqy1UQggD2vXoimfGVQubS5Iet0cvGKbw0LeCu4KZB2Fn97RFjF5hRiDq5+7Dmx1zM3XgmMsFtxVfACdx/iFKc2osr75gisR54Ie2pzIHZ1pjFTIAAaDpy+Dl7r0jPZ1iFFxLaxURCEIR5ioeslhO8x/9DOmKnu+eXyX3nmH+TS/QQMu4QUV3U4xk/9DmCxBL2VsxjA4kMDYTpnZCRIRqPHAt0Xx1dpzAc64UqnzC6kBZbggUEkM7E58Fg7RpzgA2A2MP6izWlPnGuTUigbtWhYmcWMpS7po/iGu6j6chltQ9XP5JTPbZDyyFIKXbZ9KVepfI/FV9MCSomdGiv6E8eVN1HaOaYOxeP2/jy7Cy9JXTQsJh3WH1wyGpove7o7+Yo3GbPl5n7koY3Fki/qjSRJO649qi9r2wq8Pk9DfD2Ckkfd5/mhjWcoRn5Daze9pDDsyoi/kxkYtxZXXDaClCc/FgljhfAA/dpTj+40hjx/zp2NSyfRN1YR3MIclQp4G5oNXEyUNr5MhGoMbRbAnMdDNjllqIlFCdvPGDzVFO1GWiRpvtauwmrAQSWcuAdX4JKZbNWQciljNioU4n2+r5/lma3CSd0TzNwrjynCJr2QLCosKuR8xvpnIRky95Dyg5cHXmFMw6iAXYR7egVEYdJAgLfWpMhsKudS3lHBKO+VxkNnHFl5XlWIrq2xfdZfy/MWW3fGhwudMc0Nq2M5Y5z94tVPFaQ8XK7IZ84SDjJcYHt4FbQFQcf/ddY0TlR4pN/oa9OwLgDmoDmU+pnDHv4ahKdrl6rD9QRCuNf38dEEXzikyEUqFrWItBmKDQbd3qSuJvnpTx5bnamc3b1sJTF/k0pAhmcGFI49lkEOZg19TkLmZoo4jQ2WqVEux91BiQvjWB8QKQzBFZgq65V702fHOo50tvV8oIfZoLSRsnH7Tp2WOws+gwqs6s0XggJSxZ/0cPmfzg7sEj8nvWP69tdEYFnMDnf+U0xRWldyqO/ariEmVBt5xaxcgpKKxhyomGPdMr7+JqN1jyvF+/GXKbx017ZSTaoobs9sH2yDNtZF3RO37+3e8srljv8hTcXVnos0ShH3tOlhW5ntV5cIeNoG+0t7c0s4yRRadVr7CtDptjqR1V34UPczmct+53DGzywj4u996jZK13WNp5Hwo9H0LJtatJeEH7Tisq5HPEh+yCaLXXy0jg/F9qLvctl1smvUuppqIXMuD2MD/piMk1nNaiSzRcbI+QHFQZXiqWo8E6C973z56v+uX/9LobwZKe8sZuENI8xi4KEgDfkggT8wRxUOM+SgBfrfKYgWUVZ+JPJPHO8jbBTLMAKoI6Q5mDX1OPKol2PuoMR+fuahZbGygrHjFdPar2pjpI2CsHnyWDDhBlSPLVoI5uOWd5QY09Z2J7YZ+/ae6qrgjDs5fz6zSFyMLWZg7C/epgMGJ6RtqBqZBfHJQZzUDHK8deLjznGGZPwF+qjXOVqtnRNBc057/5AUdZEaR8e9/sD0dy66w36v02+LBxPyIDK/2dqOk4rigiXoj7aeCcABsG+rHoaCP7UIwskzXIAH7eMuZZ+/Uw6qb1HEz2QxI8PjKMD5MWezBsWBDQYLMAFXd8HeBVWbtlXhXG1f1y75FOO8M+tmg9ye7ocvIHP3IIZpprM9QeooZH5V5kbLL8s87LCAJ0D+8X0pUmun1do359vl7QKr0s7mXR5tuFy+mKR3vM+qkWq2HQLkEth4taCOZHyp7VpnbEkGBcNhDlCkBPQZfCNTzQy9TQEGquRtTPIWJJSRYvPAPx+pyNy74uo4FBxpTN/hL+5FwlJWk+4wgZT1Z76iJNQgsZp0sncCT+8pVCd3t1HZAvo4u88bT6yrWFNwm5hjIwL0/hSIrtC5Uc78ORvvP5wV9KXpVYRRmVhSDl6e8z3YrApVLh4pZJqO755S26+o3KsaPTBpH8vToO+OuUToUdLMweb9DJtFoFmpD9PHBoH1QC2eP8L1Fb0cvhJ90eP8vbSuPeNLaAxsmY+4BBPOsZh0oDjyLIoqk7mGl9SzSpUocttv4SnkJlxtauhtmhtIzf56P0tnfnm/ABCq90tHptTXYVkviBpuxtDo4zjpaZ71mJk/u62NuRof8mxcdZ3fqYuLf/yDPF6SZ3Fu4LvjlLiePsiHTBghCbeE/Yk+aBXcJBGjHuN3RsWTHtoUV3j8lAYCRMmRLKaeTWodrt18jUKa6digndy6AhHnQtj8dkiBMdnQDDRLUqdMbAVYvz9MSVtWTx+RnhFPoJuFHfQixRz3CslFh7r0xcSL5dsy5L3S9UYx0Q2xuNwD7lXcLNM4mF48snMb+DMafj9YxgtRzr9rfNtXBjC6frdPBxz5G63fa0jl9LjnX+RWBighhoD2yOdLvIBjUz2zcukboDF1OysewB43eE/0Bxv+8nOi26Uk6pU+j/ISMmdU26fuQR/HuUPK0kOVIrmO2WWBA3avWfgH4/91GxPCs8yl7hv1AJhJUhuQL81T//34mwhKH9j+gyRnewZumoo2WXqJTmr6mixn17V/gWqq4XvAtVWAsgFDqIsv9MWCxUktKlxE9UkRSbL4YeDFcC62I8eMof9fDKbAaWj8NuY7RM8DVtICiXBnU96XUSvBHnKSKOfTEgHHk682a9PBlPAqZLD5bTpEtv0piuf3XagIw2H3mX9L0z/2J8YDxwffyuWzAPp8BIlGuhGxmwGNAU19QC8h9zjcMZmB91Eesp19WfNJlvPh1zVvGeIyz1ViByaOsRUXeOF7UVqXJRE63r3dGkhU19w+6SnqRriGcdqp9GoTWr8FXk/T1dm/MJ+JxQd7nl7FE68w/qGydUfbggxyvs2+9BzXU4ttSdECRpD2eSfGswYLF1XFF+MI6nmWw7eLyn13lfFhZHMZdea4c2/72xW2k+bHTbFkEaEBVkMu3iPrwKu5C8Z+WNZ1SYfe+uDrr+RMoflhybesnMRdBSi/OvaDjjEQ5dMP+hUUGCkYngEzC6LS2oUuHgNmKqC0DwYO/z/N9wYJvU25bI0aE2eZHemGXZ/9T43RbyXMorDyr0xGLx2aFmmeS+wxPvwBnrxaRBqtrzuxnKP2W8br8ONGXUrGAtAKcFO8EOJCNVtBxOyUX5uaHGHHo5NRR8ca4s2f/5C3yHgHrn8sSjXsM8qVAGQFEA9Tdw+Dplw0HpXwMjz7e2dVSOWR63SyJ0UHpJVxqZ1XGofJwLUp4i6SgSfohnXBfDxj2UNrN72kMOwMUWIZzlOjLc43x1PbbiXU603NIJwrUtZiLK8dAeX7CrVBJthqz9zP7gq8qMko+f+K+mTYsKg7JbNGYhrk1QIOhyoPoQqCPFNakdu6NbalIEH7sWr8B+IyMuFMVEtB9XYV4Uk2JMND8NB5+fs6d42Sc+iDlq6IVSR80lAGE5wnGzDBDRUhVpJ6FS18mmCzKke+9cERsU2n67NdPS+okh/ONiocoQMgD+PuBoUzP6tBw7CmkQuLhwk/CE2iLwD3RSsJheQMpvd7Aa6AL0uYsCcRqkIpcLrf4U+dxXS0Lybcb4Ynm+yzEkj39UPSorhm+b8JJBTnsEWdgyJ3km1mG8PXYr7EwgXb/h3XuYk+YukW/xmvHAOmktaleQBFwoZMPc4YOZD/uY0dCHXkYVriW3vQwdTQG2BIlK6rYWm/sX9iEE4zLPPB1r87D+WlnVqtNNHXMA/mZLan0J65edAK+2H6yeq+I3w5/L1vFAfiv/Ln+ihKEH1NnnyypxDEEBvylTMGK+qQEioV3AeCIHJVDIeNK9/YASSU0AppPmRFT40I5arj4m/ujjfXMsXrptEdvT2Y/MGakCJeysr0OyjEAj95ejECBvJHZvaY+ZvdugMNyGbvPmlqkHgG0d2tUAWtF1zgQ5nZJzppzlKZbcaIf2OhZHM6SOJzzF7mpu0ihPOUOgh5gGawXZIHu1VBpOgPrsqYOW5r2jQp/veANDcYYlYi6HIlvyh2Jnou9MAmIQv5ztbQpNe/1dvH9j1F1x6V6I3JLHRfbeIVfiOArljvRLj67oDj1C+htiB4Dhx8IBVa5e/xusMxGpteD+a0d7A7NJkHCrGMP35wjueu/+mR+LjtyeXIJp0sN3ayPSzkDzgcyzuI/XAFkanemNyjRe/WGFdGjysaTBgAC1oqqwyxmi4HgO9m+4Lv9FlkXXN5h5i5zu8CEGH7uSbYxNi7n+uykEgVi4ZD0b8+4a4vdTGKnpJPTYsfthtrQFqvqKgNFNTQdZb2e7r6Uo9BOwdwTCbE3O+yjYlZk08LRDz8CfmalAjDNPkcZ+g3Xi0HUlcDGL651NrpIsZTWYgP4lvTp2C0gh4FkQRdL2bqsSVgP+k4YRkLpoXUJ1JvOf94o1Ns8CLxQtymBKoJUyto7B6gCs88hG+qzXnTaZ2Opz7U7bx8PevGlAnfKn00KDAAMASaCK+uhcSCJULLBD+B1NPR7dtgmlxwwEBUqt2ucq6FwZ9yCXt11cb2Hsq0wJrUJPT6MllB1uHRc/SMT/y8kMn9M7CHgDEDPTAXyekqgdbUAABHPpszq/CU+WvnDrw0kvcK13KeOeE/3tg2P+IOo2YuMeW5w4WB+7GfhbL4crzZ1nCvkPwAAAAAABL/XtW56teFTXbVKfYJYW+beeP91CxVtryIerRlvxZ7OOS2cb7WFypQFNzaI/2XuEiODer2NYgBFu/UIPy8fHwEy07UtKjRuca0CARpUmHHSn2ck6sSKmL3Zo8lVwRT7szs96i0cWdmsKLkQDjFxmSg7VGAWRZK8Qm9pZiazRGvYV9X/B7JHrXiWGtFtNUUoIzwBHm9jVnfluNp1Vw+sanCoSYOJplJj83SDQm35N7Fd4wFGUbFUc+UqHsmDsT5QfTRJBjj/2ncAsrk+/10GCaIKIDNOt1jlSBCjfxNNlZVMblesqa/m1lK8pmFyqJfq5uC3/igFPoQUzKsDyrnHkJxHkZXxBfbXpTN+xMJPi3Jgr8UUESVVlMzDKNINJn6+7iDXlqoOWDCT5vRkDEBDGurJgvAH8RooQQ6y2X16EpCfVzQ0GgCQYVT83hpypCbhjS05NrIZiEkyJ92zkM/jzm5Cc8oD5GTd2OCrEr9d43+JhkdLPzc9uo0kgS6ca/pH9DOIwfqXhekSlPED9wFF2YOpu1vjHsaE4NHo9z/hMIzS17QMHDePbHYKBIWvhEBxjke4Hiju6I53bLGIq6a2cY58p/xfETQVYC20NLWHp6R99OpbB/gdBzezLlu8i1lvMUhdufKHYhyC54Q/WZDYckN8rXq3WfSFX91LG9sascky80YU9gNsKjcN9z6jCV3Jnb0ajco4nre2KZ+ng6952hOB3mMcYKTve963+VJJuM2khuz55zL7UE/OLKB7zewJXE888es37VR/nqaLMqB6q7uTdHNM6edS8Aqa2Le8DAH99wveGr6Q8XXAxDikQCvofX0c6M9ozal0AHwKoIJc9p7V0WMtj5roMnMpcGO6v8Wgo6ogTOOTxS1DSbZCOz0KhRX3pfoEi0ts1kg303ML9doWPHPeZNL/JrdXhBuTzGF7p/u+LMHLG+wm6AtXKf1aYBMJYHeXvHbYV6REtcW22ZalcVzK6Z4/DQcUh+IN+6pfZfTvbcQQ0+UGwU6DhbTPoqhqTQlT98CoQVwLm0lOqw1qdkP6Y0QN0c0Sx+6pYgIFw7gu7oLNTQAIRxewL7J06eAz+o/VCl8VsP9Kx76u213BFnOgWA8j8fjTMKYUBnUDVVa1UWGpKVovoL7SFV9bvK49imAGw1xBn1CDuS3YDHGsgxUnN/P9Z7Jmf0O46ExIXK5b3zWLTcFec/NmXBsi5u7ZqDPZCZTHZ37KcI2Jc5jI6jpaqhb84tUHe1JbLh2K43GTBQC83aPMVT32oYwiKt+uVH7VpMgCJ7D3D3cOdl7Or6iZzJguV9X2TdxdGtJbljUYZwf4lT6ACtlSwO0tvc19ZuyxIvDFfQhKq8LWT/9IjPupDmkYkTy0diJDxsB19SpK2ixg0BuaScDJhYG0LD6i/c+fucmD5pnTyPgvoeb+iWQLKyjaGwfC59tcs/8W0ttHexD10iHfyT+HKFxtYKQlEfO/gffsf3tD8Ns2gWUA2OkZ+gvVVhUvHFZ6gMZnsvLuYJkmFlnSh9/DB/Tpo6TN7GqmHHoQHoLQ3vyc44jRMRTi4SjMghxML1z6f3JSxT1ImBlivO1ELWwRDv19xxI9H8ZFt9yvtHp8KHOHE3Hpgb1nXYhyvGDO/IisG/b7hOSloUTzEdflNbzDdEC9Mf/01WCo4FQNaqYBg3/yxLYGaTBHn7TWnz0dOSv4rHFUs5ihwYdpXK63zGkE0OmhI+fqB87kTajjE6URq25232K7W7QQK+5csNqMK9EOee5tPDaDMI1Z27mFfZuUkcAfoV3MMHld9WDTHUtTuiESo8WCdKRhmyU+/BaVlIFh8mYLUVSttk1IVD2GrSM7jb6ohD8COebZLJKvAx+75GDd6Sp/tuqw9a8HfaXqbcjRbMD/vrXZPbT/7Qf8CqG8qQbm/OBHjbPg50TJSCtw/74BjJbL+cZbI3tLXjJq8tPNTewJowudUv51XvpCZCXW6iSwfYps9hpOzCKllSR6eRwtM5c+3rKt+2RuaoBEiGIngu39ZQcfNv/akC3MyH3O2ht4sZBppAzDwkXO2kim1BoXOOO9nYBXmDBXFxCWAXWhlIzZVOHb+rCgfi8KQRSfGCthM8MEYFyN2w0rDEYm00hPuYCTGmVZtlw1hyX5fACBjQ1WxtDow2LVP6VmI0c50/foZVqLsrZd3w4VPbCgT92idTB9jTeOU7Rr4bgH7OHmB8EJcUkl4oZZbDlhkF7DFa0A6MmX1TxDFct+SPOXFliEQ1DpCCqLvra9qfhgbtwQKmYAg6mM5pyuPKrACGnZ+eKhR81Esp38GrMD/TcA2mxZE8335007hlSR5M82GydiugZUievtXyf1GbFKHu5T3Tp4jqDTaDiPxbVBbqdndsBl0oPrFd6tXe+oX8q7NyYsOKJju5dkcU53r1e/yANTcyU+6T8MVHH2T5JCWCVGJ2FFkesEtvehfk4NEtedjUI5/jhE9pJx+4SPVGZK/PCAZflIIjBIz6TmAm5Ag7nI1SVDESUQpiz0wnONMLjgwknSeDJ6AoPkdX5eRVvfrLULtr7toAc+DBF4lOGGhTvfMSGKPGDocS9b9IZKQOH4ZWWP8cVaTk6NoCpYdmSCIVLzZgFf7oybtf2TVNcwMRtnfQZ1Qp37Gn0n6bUvbVQhrhBjXI/Ty2xvx/gZ4l4dWxGUm1jgqWiTYwKDjcVGiZWiMgbAjeLGDDOP76tjmzabiqIjxQME8aS0dag42x7NED8uLYH22XASag6b4IpV+vHL4NRT6exieY5OET2irsIuJxWjorTsuUOtcSUuxNuKBHAO3fJG2gTNohm+m9YA87Doo8XjUikbqxFkEnT1/aALwax+erSVypnIPm2PYH4ALxrHimZOgic73hkSF/RwaAClnie7FeXUhwAqWMmeGxmTc7nSsY5Pjn4gSCdCsI/RFM4GcQ27O2qlVSgyrysKb0MhnM/hLTLWxFAVqnymXQnkWCUDO1AEBECqvWxQcGuxGUnSuJY5WramlaMYVjJu/OA88wqyOQptSVnQCc0cGnLjx1q+XILdYJZ83GSX2T+jUMOHDoqPSTwN0nwvFHR4rQUgOTsI6081xEOdRXj1RLxzA+7ktxu9oeodS8WjsduspMqf+mfXIBZUUAtTLP18Yxb1UXaFx7/h0IQXNmdca2Y9+cF1IfaQYT4KV5pxhrymwr2m+3qYKwd106mx5pnNAVyDag+fVMuFgh7rZ/EJ06ILMLW0BlyfUXzpNulpODG1xZY3gisuNtg6q+9DrZijuEOi03f77/BNoLG/ZSQPrCrhMuP7fjYCK5qdZ5B/RC1KmCZ+QN4UnTkhlnAAlH0iQJIe5lP5xThuK1/MnMt4Gf50TIH/AzVe8aNimhx9zmjK/5fefR67sOKpr3aAOHEYLAcWNcQBBWKVeCU4cxmffn33xsnCvJs07P3cbZqW7bjkN1uNTAvTmKR5KJ8dE88spNYjmoh+L1MzZrzjhYYYncn0y8rpdxHgvOj25LEq52U4ckeppTbGqyhOAE5FqQLjwm46+u4+KIZdp5NjCu7vfPxsGgcwDB6x6m79emLOFdZKKmccWYzcwiXdKTCMluYD1pV/XuJoBTORY4uLETtD9kv9ca987+YqKxogmsbKDlahPzK9JfclmMQIJJMPZnCZzTqLgH8U46gGbdoX60CSxtNkrnWzP00J5PZMOyXHoC7XeVZfzHaiMb5uwEduMXHcoFERFOt6xcV30+qld0c/mFcW2KGnBwhdk7tP8WYV1Zky3lzpXLjSF1/UVCPbspHhVTf9nxwoKLDs8Wi4sfC/TUauIcrSy37xS/5rEPFMoV4CPenht3taBrktcZGllRcDECQElG5j1xeKE8Cldm/dIvob63Oap8vkZaN37z9jOAnPB5eiZoYJoZsmj5xgkUa/jnMBdGIjY3efotFNFG5wUbwbfegEm4ps/t7JbslNqRJ/LhiasDtw+n65F9YkYI2jSdwkwd9qcu6rjZMLkRFNOQnzPllUIUy3aNpj40v83xSpjoKRnDk2Qvmj0aDbivLOdzsl9QuevC6lNGogmkXSDok3KxLLyBBZ381ZqYmFRtdEX5NU1eyMMvySWIWnc/TEfI+yUC+fREY4v1nwwe4ffWrp52YR/x4mVQMdnunaKVh2Tjf+zm8EJTWBzpEXm8kQ4WcrwumFxxh9k5MoOoTCX2aJ/SrZo/RJkLh5dc0aoLhmTGj+NbpUiju2zzm3VTJfnjLD9OLyUKqTHvBpKmDkQXJMM0g9AS6ocughu75fJIsV4Jggc2wrO0nE3WI6F5GrCklpMmZzDR2qR2Owx7hKkg6ic/eoxvArUVvyJO0HiYbK5HAsI5UMU4sthODdzOzXSjm/p6yzHK/Oo9JNVtcU9f3zqBqz87wETG/zTMFNaSrdl2jx61KQAGPtn5+nL01NiQg7QqR+myQU7ss6RxQS5cYGVlLIh7H8BmogF26i1BbiWw9zUHkIgcNHsr1ATIidB7EvdOE9mIg4o8C+7vPv9CpjO+W08dlf4Qe9Z7Rm08+ru0oTymXYGhq6YM0VAIHIS82cux1y6OCsJtr9wBkQdYmvhHRVdBnO2cqVrNqIp8QzMCwfZyUP+uE00396RwHz+W7PltQo6T/P9Q+5VTtx00K6b0bwWBNVqZ+Zt0+CYmmqxw90JWBbgCIBIU5h0Dm5+esBAUIZpr2sgPBe9ULzO/nS6vUA9X+9NxLbwNsiHfsuhP9XCLDqw67/dTxtgn4mgeoVV/weyR6149+AEDCkJEV46paiDBSYkFIN+7cjjErwcUXmJUdOwj68a8ms5v6yhdYJdpGux9n7px3LCR5ZNo6BFgw+JWvcEPWwW2AH41xQXbXoKN/hVzhqngr5a/EKEHOKh3+YhwcRi2R8Yl4DOZhP+ANT/QW9T80d1+mRFMdX76khgR4RZFVmxaSVxhgtGuSXfauRCS2JMDWDOrhQGfOD/GeeD6O7xOw5BTIEgVpOUL4Br/IQSn5HnZETI5yWXM2ViZogIAp3uEo9MIdzH3vc5oM2VvABjyfY/ikdeKXHcw0lWLhS9GWdc6DjM+/XTmuHckCH3XDCk8/R88LIWOXso5XXUioInbFVC27z/dzIy6iUf+zmVImhyTNeTMPJvgxp2YnLloG/hhc0ARMj/JmDXxfanyCCel+Mc4YHCQxqqgWScXRbFLmTvmoHcxK0nwrHjqVOLIIYNGxCBMMiorspE5cH220Koa7NP86J6zHmuCPOqSHg0sdRKjqS9KbGWM39Yi3RNtOggolqZUhGzQhMKlFyMTvFUxX1cUIjHu350OM4gas4cP6M1ODDZ9hJGG2KcKEAbXTaYkJCK1sF0Zj+ss1CdLlgbjX1InwOE1rr86Jb4xIpd8VA7ZT+cMyJWCO4O/zHZkt7d9IMULhZrjouu7/9j4Xp4lARoqlFwIK8h/goVebxSvDpU/+hC0htxBgfNDILiY8lfltzl3jPrjD/NjP6PQnBI02jCi4lJAYmWrVwEmlcRGGVZpxPxdXJsk6vcGzDlORRi2oTHE5T8y/AVqKs5sJwHZzSUtera7ISS/BE14vhYlXYhQrn/P4pPTwV+U3sQIggcXPQququzvEk/6bMDTa6Xz7qufPZXUErRkbxwM+cbtqk96fACN+dA1Y206jmlqtw9/wIknn+isr4hMjk1ADy2SYX0ivqz54STnVnQl+VP1jp6XuIk5d7IH3gsxWrF4G905rtH8ZPMqyNOZTw4C8U+5uGKohy0UlbkkGXW8oxIOcUNWO4qtVOZgGP5iaxyEKpzcPA+OSjzW9ibpsa0sYRGrxLF1dDT5ppbKOQFXTJs1DwLQQZb/5UV73dcAjb+pjhQvUQ3VUmUPOYbkeJIOIBLDmF6EEv/JU8PdN6VQqwIORjAn7VaD+WBAXpEQiyLqf8fl94QmlC7Sdvs5Qe6nMQ3dazovkPwDKEDuqWRltDO/A/jbYkguSeQXZ4J1ZMhOgshRdPnQ/+W/ZKPdvBymhpsPhxL9AZapMCNxRIIFOxB9ojZYnLD+kbH4LyVM7YII/rutJBpW6t1pHnTC8Br4ssBVow+Wvsio+y+vZaLhPg2751+3NPtaBwLzUok6joowjKXyp7UpnTwFKaLWt9f8WGBt8+Z1l9+Xk67JDLFK8TVxcF2varw+Ako3DeNRI22qL+a35WSZ/eNHagcq+0awRPnKrEqDYQG1mFFvOs3U0A1gM+WY9KxrMjJ8XD/5UxYycHEQ6tVml7IsNfaOMIGqKxARsQELM7p2G8fFLqqFvkj+KBN5lYM1oLs5k0oRlQbcu4whKVhzQ7aCrL6PUN4fosvd5/+/dy11FTg58A5oTIkSpsKR3WNwNfYSureUrkvptMDvBOeJa8qgxrTzY5fIbLALr68kF6EQaZfppYyA70ejHofwsEMnREXimMIACBvYbriF/hjncsXiUHy2h2ZCiDvbeIf62UpFoYkxk1t+DcGpkmcpOQutwlMyWym+z18G5vc8848oTGqtSoH+3BM1p3F+7XroJyfuvO7I/h4APann1BLcr8qsg7pfEPXRkQMQDrXksGBW1YlzZvmEbgfXsR76boHQhGumws8OuoY3y9jcFxP4vnkZzFAmpPc+4Jz7zRovU3jAAA0BPOf0yqvlSuthJ962kWj9aXsDxmAFPzTjGYx2Zu9+m8BawoVh3UkcA32ZmHVnaf0Gu+mc2C7WG2QBQjla2uydmfRgDfM1JmSK3a4Icn7Nh7F+RtqLPN/s1CM/2HWITiOugixnq4PYOEH7ETG0VJOU2hWStGNbibnHxKuiV46Kbu40zBo8wLuZjbbXBGc1rJ/wEj+ekUj5z3UoQq08u1vdKbF1rV6C4FRYfugSze3ej3FLc2OABPQA+61NbxXkCIZEe0+3BIp7UNHJ8hzOWvnb9Ctpi/o9jO8K4MDU24v6XIWDw1lFyq9CHS0CJA7nuGKEUb2LOmW+d8AAAAAAdoZuiz7SBvvZeVMhhegWjl3KRluUQuaD9h1B9JqVgtE47o0EYFmZQD8CZBA4mqmXUv9l6F7linIiUhygW4rASmtNw5Uux14MXkyelWZgkGq/wCpL9cgrMEyvBuBkR9RiOERBXSscbd7cYjaKz3VrRrCnavoRg+eOVMnhksKPhOFPXyQMXYww8LyCx5tRYg8zIAFps958aM4G/cltF6cNxlOS+7EqVWUckk8QwVNHrst2xV0KWFL/fjjSrTL2lEW4k5G/3ch0mC+Z+mYg0ajUwlKD3GNUml4/v/f9dJfZsy/cq75ba5hNWWAqW4QFtiefQOSWZZXyI9gppZZgfN5wj2AImz4eqRm2xHqsitWGW+l5AdFvgPXqogaTg7ZKDtUYBELz3h7NynnOqYsckHLxOc3y3/B7JHrWhjjoy7KkFCKWsY9qtn7GZuHiG5JHG69NOYs7WlZGSV+A56vdhn4ZRwC+3vFNs5asEcuMEQPAwjBJX1kYZN3QIItZSkWFjtWDdYphglEF1mEnWWOgChQK207IbDFgAYvE8ivRRl9vHEWk6xXEzn9JbXSW7Q+2UQ912ABAJBWs8QHmarxmuz18fwJoms1i09ywroSrO+E5HJXr/HqUVkQ+lEOsw0f0xFgWWFOqVMBVSETWqJjXTJN9heRhbPUwXcNaCdQx5BDYoeUSxZ76dmVDoKHoQ8bfSzAUHYksW67mjXGZwypEYS/ojm5UhH1q1T2gO90kyooI74puna6srZ5xRzd7Y91m1TT3wlZyn0m1Zaat2GpRjiIAm5WFXw9ot7rFBbsFBwpmwbAZDcHz8I2vQQq3ZbU4d7w6QgdPb5ksa75mzxZ0ojgWUzxU5AMacDe4IXqno7//sAQ9W0BIB+6+TZk+RHkKSC+FilVrqEe1qWyee/3C0KpTHB6aiSw29hODrM78hJBl4UBqBVOwn2FQsTyh609eJR49zmG56BB7nvb5Ig2zQz8RRXgzcbagGNEDTupY+eRRopzUVsHfla2ordtk2lAqU4m0g/LsRbz08nqMO+L+20gwk1Mv7zvss2KnB+ZBUngWJUxMBhySngCma2+ympMIdb0e7ZhsYAxs9GNkUTYr69anEZqGGUQB/xgbcvFvB0Fy+e0ocpQM0TXoPTCTtaB2FOH0o6rym0s8MH2nn1hVDHxTFfbkWIVLe1dMnFW9fF8G3Dq68B0XVGpdF7Ga5K+l9mNU6+fXQlRi1dhaQA1DiPzkz8I/9nwtkHWL7Y9felBXtdChbGZPEjMp5IBAz2rK+HgP6NjrwT4FyhbIHCNILie5yVigl6y3lTZ7KbF1G5ViwohFgJBtCgEky89Tye7o6K+1MY1bEoQaxUWDwrPgEWMRY+TGydIMwzHWV3BTeJhzuoU3cZNpLjCV0ipodszuwZP0vjFeXKIifga/ZnOewTggu7CRwOyzPryceerFC6gbdkiKZvplWTCDjcTsNVLfyL2nnrVhHCum73ntpj8bqkLIrOffpfClAeFA6AgQcqRIrmk/8JRMehm5bKx2ENsuUIUYUCO6mipBIbZiheG26itDwlHlm2qCm0r6gufgfz19hHEzYrdpCXnqSDT8SlMk+MJ1aE+PbOziwBtBoJSiOSg/5hGuNEBHWgsehufwMGMNTyuSoadm4JHiBBoYkgQSAuKS3sVv1xvlW1DZRNX/pTkz8VUCBZsuCeQYAvUofNp+HmHZ2n0Du5MJOEvFMrBHnV8TH3NHAmCJp7jjIbOOLLyvKsRXVtitqqSa1r3joLfJHBPE1Bua6Xkq75YjsxrBJOyFuChVRxn9Y18Saw9pYRqEn5qTGINbjwUnAUAAt2aAdj+Yoj+eDJHKhVqdm3jHp/um7v0UVaQwkc3SiEO8Xc4mblAkdyCKMNrz8DPEw8pbrPrGs9j4AUZgiS2YJbntGLDBedMUJXgocHIWlLUa/SnEH1vWulVEOclwLnUu9ou1VbMuN8JhGtfDgh0S/mAolnN+bbQwPcQ6Kfa991sBQkM1a5B0ftkUs01HrWbyDRzIVDrF9xz834axFv0ifsHB+3YJzBntiakF13coWYPE1gLoiRJ01NbCz2jD9Lz2H+IhgJIht0aC5F18G2d6mwG2JX8zKM38vUj28v/wAaZkpOaKUiUG1QhsZHb4Va2/r549m1DXi7Yl8IYy1Zc6vm1HkQtSDZQFpbKuWh46+yJps5tuW4ike9Quh9g1/5EzLJTS4LMbcwOLziLqnqxcc3w5nMSegJxBINg0qZAMoF5smRBbrZ2odIsc5awwwOSG3bMz7iBFoVDeoCctkZJu9GxibM7Dvx7JjO6ih0a8bW604rCBsjVV7mTCFeaQJCJNpQ7XGFLlRWYdsV1ti+yIhFL4l7ZorCn96iqfFbQBOcdDHh0Ek2CMzzHZK+1Nqpx9o02jwReSmsJa6557Oc+FqIxPpRX8LNx/JXfZ5c2Se7bSVHt/RGJ7qrnFl8vibvPf6tZKvCZlm0pAMK9WoB2/hqDX4AUa7UJ+/L3tK0Eh4b390f8HHVXcKy0I1qZd3kOr9fXirXJc3FiJ9w61i9PHazf8cqrjWUxDXSPBpplZ9tOB+1iWm4F2+8KDDzy8W0AxRP7/wX+Q1rehn6mfixGzrNIn6k9mXvjuIOcjFg107dszPuIEWXTku/mO+pP578iOWsmsm1kLiXpAHChCtenkdvYLeYwkBk5X2viyQ2X3/GoxL+3pljhRCzVmow0S+1k7hNl9Lt3JJm4K5ITftT5ixukknVUBYDpWhJmuwzSSIxbbLvEgCBYWICDhabC39cq9MRi8dmVQdRSdmwPjgJKv2uZ4H2FveMKzvZLgCF5N3BC7JeYJJyCHibGoprrcaH5voQPqkIxXlvxju3rjJS7U9b8o8aDHYk+zjvpQ48TK4ktUQ0bc6lPX/gJrRtCoNFyQ8rvzH3VpcfJG0l3CLCnv06/6200SaFCNpY1viQgIOXi3HTGtHf2abDzMx89L8bPUb5WA04XbyxgMRLEOsqdp39yBXmnYIHKZR3Lm12VuJVGbKMd1PETCs1PRz4ZAAFWgM73XIubYRKwhNUq1IOwYG28bO4PUdBvy8KY0A14O8luggCD7wdwxsUWQjPu/kRf1b01cRoLWbMwPdljKKdeEu8ART3p8avAKBgJffNFAP+DFfMyUPckoLRdl4JffZeHgIDEGE+odg2QdrbAlD9ByEzKz9/bvQvMcqvBBCgkxgbqFNT9pNod7BHP6aEdHfGH1Qg1jE13KsnVBl6tChK3oliKNZeb+onXvkVlLn5ZBvX4LJStpzJvvmsR7oDiLZYzlUODelPYvaAfCW9z1lvezTR4LWeLRAOQSdZtyG5GlC+5KxvIddxJuDgoDjTdQUP3Gy8yzzqJGMEtc08Hi08kEzs/AdsO/8yntZwlC/L9IXWqZ0cRJs4FyNtG/u4B7BIb3JTnhJBO4JAKS31DRUwvKwKwnyta00PM8rZ3yBDkphdPDMQiz5710nCWxynwHOZ91aihHEBYMDiMWiEoq4NQcc15M6n//tLDGdSGu1oRZE4IChPZ9z0wS7CS8V+eAPT+Po5t2Ct3MJMB66m1juYKFqyuYxXQuOZTHW3ELPD9IS4Hopgyza4LZSGjM/8q83+IrrZr8Jfy7P9+zWi6rmodChhGicgH8TW1KeoYK7f3XLNsiHQ+JXrnnHqoQEMpaet1FlAcFeP+ZbepOrcYroJHPiXFOJMRSGyX3TL18r+SMWNDAtMNabL5OxvlzaXnoqqm15mKi9boS9/Tj0GazeYfy67nOkNtEDKOvYU3MNuGd1tDUsLcswUS3yTLl2oK0UHb8QjW0NYVY7RBr+LdmKrGpRQ3OLy3I6rhOLBEXkAAAAO1DbjY7s93welO4hvndo37AH9rVBbEjZcdz6mYxxdGDnztKXD5YBHl+0n/8KSouIQElnQJAIOzkAGiKY3WXDiSrYmUXmuEANddgpG16iofMrajpojC8h3/9L+ETRK9EFb+zpHr82Ia0VeNV3X7wMB6p/hXpUwmn6P7VnjxlSj57D+Owkbz80S6ZeAdm1lCHLec+kDWgvza4DbwG6ZPfHx5IPnzy0FoAdEzf6mc2wmM/taMmSJxMUEA2moft4cnQKEOyDBfNH7+CJF0MZxPhUDdmAE5VwADTBpzG7wbI4dAdCk9zm88zkKyH/EsWA6NUPunRltOpDIrbvMJPlLk97AaB7ewVZL5BoVkwnIRYMUdJXgvzRKvzNxk9ADrqaq1vOJgdgTGxKDSX9OPo/qtfWaaLg1wtB53iDWEtxSLCZYwUfKkB+3O79C7IB3wuihSkp25//Dp7QVneWB4ei12u8hpbO0eWDA+C6S1ixtWZ5Q3K6mvx1KzETPmvFYs9TxEDEh/ZdN8gObfd2ob2y4bGST9Of0JlwehY9Tl2T3xOJ00u5+9QMAlLt0CL/efW8AAAYK2g6eL7jmBrgiE0TR0eJzgwYlBpL+nH2ZlEWIU2V4R30uCmoSKJJUKgQRAAAAMQRr5b39HC2W4f5vXhcdQL+BCP8KgOCFHwaT2iAOBn0acOVNB+TX8BIIeBWT4TP0/fr+yKl3AAAEeus8DJT51ebardfpHBekSvURo+ppPz0AL/wiNmqMcj7ntmpFp/tptY1LYOp3gvZ/ijhbqO4LhfGE9dxEw7C5IJK/5f1vPDPvtol8httNpJGb0U0dwnOFEdz6qDVRvwDjtwLlDfcAVlcngbKAMnZWIzSwiyXG2EYtN9xqhzIgjFViiCRVI0/loGHnrVDe7x8Sabw/rnzNe1oZayYN1YhZOtylueGaSOiAjs58GH9F831NB0rGy+sQHGIpMkPwn5Mn4AmpSNoCMP5vx+HzV0cKPZ6n2ncNHS5cm/X52hKjRuC6u5w0ED5lfb6moOUzXnU6n7m/s+vnFK5LregX4L7leVGmmHAz+YzySee2uAV9ddSfA20SHCh7FQm7URgQigKBGx57181X1npwvLdF3+PJO7NtWmzanEGelCdsDGpjlyqDoVOX9Y3AMBf2tdLPd9fUxyeqOERwYBGacz4zpnU5wvu3r21o2d6DNV8Ca8kLJWrldE+wg4/TPIkjolHIATXabYTg0JVOjBLd9WG2c0ikpPQ+UwL8kzevVpwhbuFvRvH1+TV/hoEKXS2tQBvoeGDEkGtr6hVJpLYX5kbqivEwfYID+vLQOyNfZBCVByGfxMcbiH3ujJ+HmCEQce1HDLA5TlqYMA1Z36PZQ6msFEp7qOUbzpNlfgG3O63XNn95lZzQqnEvVSjRCLgQWPb7G0P7/hvPeP6chO+p60wfCz63KOhu7Kvgt2x7J47i7LiMqje5RUFZK5Z4gWRAAKE8uF+X9BlR/JzrcJKPUKEEa5bUPQ2meEIvt3XbI9NLmDmVyzgjoQOiZ5CvaY51Jjck56quiThiGr3RZjehuXJgI8VnwQH29bZuHohzfukKM7KxNDI2ka2JUhAjZszlxkNnHFldljf5u6ol2PuoMRSUpEVAnitAMCkSnQoNjt8Ll+qMhW8W4ZkUWPXXCtSwtD+KIKRelsBMoYv9fLP4yrzcvjeAXjm/p0NODh1gi01Z8GW/n/XSuT+5ZMkSt05YW3QY4XTBpT15vs1UQbTQHPEwSFktX6s3+ssQ4abWKh6E1tssgbWY383up2d5tJby2BWmQR7DC0oLVKbxZjQqa0BiI0YL/+Fe0E7AIuw8SQ7fzeqkDW5H3D6J+ygzofVoASm4GKj2EW2Nx4Y7zre2y8Zpvuom999qoM/yy4z1ifn/0pMzM6r5W3EFGk7ft90AHYJ1bJtqj3aV0YTsG4q5JlOXkireE1RvMwHFQOpRxwmR6aQKCKZ9JIZkrOEMtvdYudXwX643uuFaxMuGXw9W+m8QgxZZ2iZZuKlgMmQh0ShutsJNkHfdU+vDRYoA5GgJ4imBrIP81xfRYZu6CF43gWg1PMDSEuC0yF1H2xFAFPqVwyQrWcuEkCxArJ9cB2+stZnCaUjpV/8HjtOZHxm8y4mF8AMLukA2PPhSSVs4ejhzfXNA66sJgPB3mK+iK4BoMABTyt1tVkibGWp47BqaxXBKeHmjLPmSLP6Wp1j/7wTfmrZTeIY1tQuMYwEacRcbXM3YuBUAE5CoJqJnJZG3UoHA7Msojs8mdeXlu2hzpbMuVM3Tjg2dSVnmm6aakpJ3RU1rCVf7rMsAaqmLMBcOFnPi8e6OUfbBamN0iD0jrQHwAeMgmxYn7j1vyAZNigr0n8qwnJgNBojEe2EwiBHegpisB7EYK2FdYrzFKD09bBaM6UixWE/YI0Dj0YeP8Ca7TScPNLi/byl903VpwhUxchRelecv8AChavAE77TlE8x5Vv2fOTdzM0qSu1Oh7jEKQaVcbdFT7W7/J6smFDk3UYP08zOACG65rJI5ZCcl5pJxGDnr/RuZM5N/vZIKfjFiSpj/260bp4mx9YH0ClbunWuvV16Ed2T1U3Nj/7sdVIE2sNekK/4ObZELlPoGsgO8HI1IdEzzuFRB932UlaliiGeSikxmktN/uP0E+K+B7R5zAMjGwC+Mkq5Nj72OAhf5OoppCkKSooaBFZ25pW3GKSrB+BH2JxhXSzwjXvb6+Rvr8R7cM1sACeShY3mp3361DvPc7VdIlsqgpxHjeovnxUfIp3xiWe5z8ahnguF1p+cFEUiX8EZ3jxmft8tD6/COTEadu6/95Yaop+Th6c2oxBU5IbM37et4lNSWB5YpU/wppser+nwFy4xFXRMzYfM04pv4sz7zSYzhtEDl+V7wIJR37xtFaqW6XqrmfLWa01TS2gASzTM3ETJKFhnnsBypt+1kQJ9yFvNnLuqt/8Cwsk1/QXGv8VdY80/Yg9QcCM+7aHE9DOx243npgZCbfllOmtM7P1yYyKMspQHyncokCX6h9V/QkmTooBptTSWnr19P4O0qMNRmyCa2MDXK9dcHp3XTckjrO7ZriYZWF/e8nFyjxujTPhxjNIq8Jq0BOY2NGxllcPrxcLhEU/VfVbYTxjuUE4s3KKPdNGLbRXfdekdHX7yUhK5Z3u750Hkn7aOGnUq5IJeFFX9kDNW7jYsfuyCLoV/C1vsKlFpzZmfc2CQOMVIAASTjRtIIXRKc/XLsXbJbDgwYFGgHScf2yDEF2IClWX1EjgQoFA7A3FB+OQzYsXL+Yrx/zovdB63XWUxhmDmUer+a8muZFRgEA1Fk7nBDUt+72z5HRul8PFAVwndCs7OhFs/9c/lSUDJ5xrcarAVPAAAAAAAAAAA==";
6
+ const DEFAULT_PARAMS = { radius: 1.2, rate: 48, duration: 0.55 };
7
+ const electricArcEffectPackage = {
8
+ id: "electric-arc",
9
+ nameZh: "受击电弧",
10
+ debugAnchor: "playerRight",
11
+ defaultParams: DEFAULT_PARAMS,
12
+ debugParams: [
13
+ { key: "radius", label: "环绕半径", kind: "scale", min: 0.3, max: 4, step: 0.05 },
14
+ { key: "rate", label: "电弧密度", kind: "number", min: 0, max: 150, step: 1 },
15
+ { key: "duration", label: "持续(s)", kind: "lifetime", min: 0.1, max: 3, step: 0.05 }
16
+ ],
17
+ create({ scene, root, position, params }) {
18
+ root.position.copyFrom(position);
19
+ const radius = params.radius;
20
+ const e = radius * 0.9;
21
+ const ps = new ParticleSystem("vfx_elec_ps", 80, scene, null, true);
22
+ const tex = new Texture(sparkTextureUrl, scene);
23
+ tex.hasAlpha = true;
24
+ ps.particleTexture = tex;
25
+ ps.spriteCellWidth = 128;
26
+ ps.spriteCellHeight = 128;
27
+ ps.startSpriteCellID = 0;
28
+ ps.endSpriteCellID = 15;
29
+ ps.spriteCellChangeSpeed = 3;
30
+ ps.spriteRandomStartCell = true;
31
+ ps.emitter = position.clone();
32
+ ps.minEmitBox = new Vector3(-e, -e, -e);
33
+ ps.maxEmitBox = new Vector3(e, e, e);
34
+ ps.direction1 = new Vector3(-0.3, -0.3, -0.3);
35
+ ps.direction2 = new Vector3(0.3, 0.3, 0.3);
36
+ ps.minSize = radius * 2.2;
37
+ ps.maxSize = radius * 3.6;
38
+ ps.minLifeTime = 0.16;
39
+ ps.maxLifeTime = 0.38;
40
+ ps.minInitialRotation = -Math.PI;
41
+ ps.maxInitialRotation = Math.PI;
42
+ ps.color1 = new Color4(0.85, 0.95, 1, 1);
43
+ ps.color2 = new Color4(0.5, 0.75, 1, 1);
44
+ ps.colorDead = new Color4(0.2, 0.4, 1, 0);
45
+ ps.blendMode = ParticleSystem.BLENDMODE_ADD;
46
+ ps.minEmitPower = 0;
47
+ ps.maxEmitPower = 0.5;
48
+ ps.emitRate = params.rate;
49
+ ps.start();
50
+ let disposed = false;
51
+ const stopTimer = window.setTimeout(() => {
52
+ ps.emitRate = 0;
53
+ }, params.duration * 1e3);
54
+ const disposeTimer = window.setTimeout(() => disposeAll(), (params.duration + 0.5) * 1e3);
55
+ function disposeAll() {
56
+ if (disposed) return;
57
+ disposed = true;
58
+ window.clearTimeout(stopTimer);
59
+ window.clearTimeout(disposeTimer);
60
+ ps.dispose();
61
+ tex.dispose();
62
+ root.dispose();
63
+ }
64
+ return { root, dispose() {
65
+ disposeAll();
66
+ } };
67
+ }
68
+ };
69
+ export {
70
+ electricArcEffectPackage
71
+ };
@@ -0,0 +1,46 @@
1
+ import { GlowLayer } from '@babylonjs/core/Layers/glowLayer';
2
+ import { ShaderMaterial } from '@babylonjs/core/Materials/shaderMaterial';
3
+ import { Vector3 } from '@babylonjs/core/Maths/math.vector';
4
+ import { AbstractMesh } from '@babylonjs/core/Meshes/abstractMesh';
5
+ import { Mesh } from '@babylonjs/core/Meshes/mesh';
6
+ import { TransformNode } from '@babylonjs/core/Meshes/transformNode';
7
+ import { Scene } from '@babylonjs/core/scene';
8
+ import { VfxColorValue, VfxEffectHandle, VfxEffectPackage, VfxParamValues } from '../../types';
9
+ export interface EnergyShieldParams extends VfxParamValues {
10
+ radius: number;
11
+ verticalScale: number;
12
+ color: VfxColorValue;
13
+ opacity: number;
14
+ fresnelPower: number;
15
+ fresnelStrength: number;
16
+ rimIntensity: number;
17
+ surfaceIntensity: number;
18
+ noiseScale: number;
19
+ noiseEdgeWidth: number;
20
+ noiseEdgeIntensity: number;
21
+ noiseEdgeSmoothness: number;
22
+ flowScale: number;
23
+ flowSpeed: number;
24
+ flowIntensity: number;
25
+ marbleContrast: number;
26
+ bloomIntensity: number;
27
+ bloomKernelSize: number;
28
+ segments: number;
29
+ }
30
+ export interface CreateEnergyShieldOptions {
31
+ root?: TransformNode;
32
+ target?: TransformNode | AbstractMesh;
33
+ position?: Vector3;
34
+ params?: Partial<EnergyShieldParams>;
35
+ renderingGroupId?: number;
36
+ disposeRoot?: boolean;
37
+ }
38
+ export interface EnergyShieldHandle extends VfxEffectHandle {
39
+ shield: Mesh;
40
+ material: ShaderMaterial;
41
+ glowLayer: GlowLayer | null;
42
+ update(params: Partial<EnergyShieldParams>): void;
43
+ }
44
+ export declare const energyShieldEffectPackage: VfxEffectPackage<EnergyShieldParams>;
45
+ export default energyShieldEffectPackage;
46
+ export declare function createEnergyShield(scene: Scene, options?: CreateEnergyShieldOptions): EnergyShieldHandle;
@@ -0,0 +1,365 @@
1
+ import { Constants } from "@babylonjs/core/Engines/constants";
2
+ import { GlowLayer } from "@babylonjs/core/Layers/glowLayer";
3
+ import { Effect } from "@babylonjs/core/Materials/effect";
4
+ import { ShaderMaterial } from "@babylonjs/core/Materials/shaderMaterial";
5
+ import { Color3 } from "@babylonjs/core/Maths/math.color";
6
+ import { Vector3 } from "@babylonjs/core/Maths/math.vector";
7
+ import { MeshBuilder } from "@babylonjs/core/Meshes/meshBuilder";
8
+ import { TransformNode } from "@babylonjs/core/Meshes/transformNode";
9
+ import { V as VFX_RENDERING_GROUP_ID } from "../../chunks/rendering-CV3nhygX.js";
10
+ const SHADER_NAME = "vfxEnergyShield";
11
+ const DEFAULT_PARAMS = {
12
+ radius: 3.18,
13
+ verticalScale: 1.02,
14
+ color: { r: 0.34902, g: 0.568627, b: 0.968627 },
15
+ opacity: 0.2,
16
+ fresnelPower: 1.8,
17
+ fresnelStrength: 0.66,
18
+ rimIntensity: 0.4,
19
+ surfaceIntensity: 0.3,
20
+ noiseScale: 1,
21
+ noiseEdgeWidth: 0.1,
22
+ noiseEdgeIntensity: 0.42,
23
+ noiseEdgeSmoothness: 0.5,
24
+ flowScale: 0.36,
25
+ flowSpeed: 0.25,
26
+ flowIntensity: 1.15,
27
+ marbleContrast: 0.67,
28
+ bloomIntensity: 0.45,
29
+ bloomKernelSize: 36,
30
+ segments: 64
31
+ };
32
+ const VERTEX_SHADER = `
33
+ precision highp float;
34
+
35
+ attribute vec3 position;
36
+ attribute vec3 normal;
37
+
38
+ uniform mat4 world;
39
+ uniform mat4 worldViewProjection;
40
+
41
+ varying vec3 vObjPos;
42
+ varying vec3 vWorldPos;
43
+ varying vec3 vNormalW;
44
+
45
+ void main(void) {
46
+ vObjPos = position;
47
+ vec4 worldPos = world * vec4(position, 1.0);
48
+ vWorldPos = worldPos.xyz;
49
+ vNormalW = normalize(mat3(world) * normal);
50
+ gl_Position = worldViewProjection * vec4(position, 1.0);
51
+ }
52
+ `;
53
+ const FRAGMENT_SHADER = `
54
+ precision highp float;
55
+
56
+ uniform float uTime;
57
+ uniform vec3 cameraPosition;
58
+ uniform vec3 uColor;
59
+ uniform float uOpacity;
60
+ uniform float uFresnelPower;
61
+ uniform float uFresnelStrength;
62
+ uniform float uRimIntensity;
63
+ uniform float uSurfaceIntensity;
64
+ uniform float uNoiseScale;
65
+ uniform float uNoiseEdgeWidth;
66
+ uniform float uNoiseEdgeIntensity;
67
+ uniform float uNoiseEdgeSmoothness;
68
+ uniform float uFlowScale;
69
+ uniform float uFlowSpeed;
70
+ uniform float uFlowIntensity;
71
+ uniform float uMarbleContrast;
72
+
73
+ varying vec3 vObjPos;
74
+ varying vec3 vWorldPos;
75
+ varying vec3 vNormalW;
76
+
77
+ vec3 mod289v3(vec3 x) { return x - floor(x * (1.0 / 289.0)) * 289.0; }
78
+ vec4 mod289v4(vec4 x) { return x - floor(x * (1.0 / 289.0)) * 289.0; }
79
+ vec4 permute(vec4 x) { return mod289v4(((x * 34.0) + 1.0) * x); }
80
+ vec4 taylorInvSqrt(vec4 r) { return 1.79284291400159 - 0.85373472095314 * r; }
81
+
82
+ float saturate(float v) { return clamp(v, 0.0, 1.0); }
83
+
84
+ float snoise(vec3 v) {
85
+ const vec2 C = vec2(1.0 / 6.0, 1.0 / 3.0);
86
+ const vec4 D = vec4(0.0, 0.5, 1.0, 2.0);
87
+ vec3 i = floor(v + dot(v, C.yyy));
88
+ vec3 x0 = v - i + dot(i, C.xxx);
89
+ vec3 g = step(x0.yzx, x0.xyz);
90
+ vec3 l = 1.0 - g;
91
+ vec3 i1 = min(g.xyz, l.zxy);
92
+ vec3 i2 = max(g.xyz, l.zxy);
93
+ vec3 x1 = x0 - i1 + C.xxx;
94
+ vec3 x2 = x0 - i2 + C.yyy;
95
+ vec3 x3 = x0 - D.yyy;
96
+ i = mod289v3(i);
97
+ vec4 p = permute(permute(permute(
98
+ i.z + vec4(0.0, i1.z, i2.z, 1.0))
99
+ + i.y + vec4(0.0, i1.y, i2.y, 1.0))
100
+ + i.x + vec4(0.0, i1.x, i2.x, 1.0));
101
+ float n_ = 0.142857142857;
102
+ vec3 ns = n_ * D.wyz - D.xzx;
103
+ vec4 j = p - 49.0 * floor(p * ns.z * ns.z);
104
+ vec4 x_ = floor(j * ns.z);
105
+ vec4 y_ = floor(j - 7.0 * x_);
106
+ vec4 x = x_ * ns.x + ns.yyyy;
107
+ vec4 y = y_ * ns.x + ns.yyyy;
108
+ vec4 h = 1.0 - abs(x) - abs(y);
109
+ vec4 b0 = vec4(x.xy, y.xy);
110
+ vec4 b1 = vec4(x.zw, y.zw);
111
+ vec4 s0 = floor(b0) * 2.0 + 1.0;
112
+ vec4 s1 = floor(b1) * 2.0 + 1.0;
113
+ vec4 sh = -step(h, vec4(0.0));
114
+ vec4 a0 = b0.xzyw + s0.xzyw * sh.xxyy;
115
+ vec4 a1 = b1.xzyw + s1.xzyw * sh.zzww;
116
+ vec3 p0 = vec3(a0.xy, h.x);
117
+ vec3 p1 = vec3(a0.zw, h.y);
118
+ vec3 p2 = vec3(a1.xy, h.z);
119
+ vec3 p3 = vec3(a1.zw, h.w);
120
+ vec4 norm = taylorInvSqrt(vec4(dot(p0, p0), dot(p1, p1), dot(p2, p2), dot(p3, p3)));
121
+ p0 *= norm.x;
122
+ p1 *= norm.y;
123
+ p2 *= norm.z;
124
+ p3 *= norm.w;
125
+ vec4 m = max(0.6 - vec4(dot(x0, x0), dot(x1, x1), dot(x2, x2), dot(x3, x3)), 0.0);
126
+ m = m * m;
127
+ return 42.0 * dot(m * m, vec4(dot(p0, x0), dot(p1, x1), dot(p2, x2), dot(p3, x3)));
128
+ }
129
+
130
+ float fbm(vec3 p) {
131
+ float total = 0.0;
132
+ float amp = 0.55;
133
+ total += snoise(p) * amp;
134
+ p = p * 2.03 + vec3(17.1, 3.7, 9.2);
135
+ amp *= 0.52;
136
+ total += snoise(p) * amp;
137
+ p = p * 2.11 + vec3(4.3, 13.9, 6.4);
138
+ amp *= 0.5;
139
+ total += snoise(p) * amp;
140
+ return total;
141
+ }
142
+
143
+ void main(void) {
144
+ vec3 normalW = normalize(vNormalW);
145
+ vec3 viewDir = normalize(cameraPosition - vWorldPos);
146
+ float ndv = saturate(dot(normalW, viewDir));
147
+ float fresnel = pow(1.0 - ndv, max(0.05, uFresnelPower)) * uFresnelStrength;
148
+
149
+ float t = uTime * uFlowSpeed;
150
+ vec3 spherePos = normalize(vObjPos + vec3(0.0001)) * max(0.05, uNoiseScale);
151
+ vec3 flowA = spherePos * uFlowScale + vec3(t, t * 0.62, t * 0.38);
152
+ vec3 flowB = spherePos * (uFlowScale * 1.91) + vec3(-t * 0.46, t * 0.82, -t * 0.27);
153
+ float n1 = fbm(flowA);
154
+ float n2 = fbm(flowB);
155
+ float cloud = saturate((n1 * 0.58 + n2 * 0.42) * 0.5 + 0.5);
156
+
157
+ float veinInput = spherePos.y * 0.92 + n1 * 1.65 + n2 * 0.74 + t * 0.13;
158
+ float ribbon = abs(sin(veinInput * 3.14159265));
159
+ float marble = pow(1.0 - ribbon, max(0.25, uMarbleContrast));
160
+ float nebula = saturate(mix(cloud, marble, 0.58) * uFlowIntensity * 0.34);
161
+
162
+ float edgeWidth = max(0.01, uNoiseEdgeWidth);
163
+ float edgeSoft = max(0.01, uNoiseEdgeSmoothness) * 0.22;
164
+ float noiseEdge = smoothstep(1.0 - edgeWidth - edgeSoft, 1.0 - edgeWidth * 0.22, nebula);
165
+
166
+ vec3 deepBlue = uColor * (0.12 + 0.42 * cloud);
167
+ vec3 marbleBlue = uColor * (0.34 + 0.9 * marble) * uSurfaceIntensity;
168
+ vec3 rimBlue = uColor * fresnel * uRimIntensity;
169
+ vec3 edgeBlue = uColor * noiseEdge * uNoiseEdgeIntensity;
170
+ vec3 color = min((deepBlue + marbleBlue + rimBlue + edgeBlue) * 0.72, vec3(1.12));
171
+
172
+ float alpha = uOpacity * (0.16 + 0.34 * cloud + 0.24 * marble);
173
+ alpha += fresnel * uOpacity * 0.58;
174
+ alpha += noiseEdge * uNoiseEdgeIntensity * 0.05;
175
+
176
+ gl_FragColor = vec4(color, saturate(alpha));
177
+ }
178
+ `;
179
+ const energyShieldEffectPackage = {
180
+ id: "energy-shield",
181
+ nameZh: "半球玻璃罩",
182
+ defaultParams: DEFAULT_PARAMS,
183
+ debugAnchor: "player",
184
+ manifest: {
185
+ id: "energy-shield",
186
+ nameZh: "半球玻璃罩",
187
+ source: "https://github.com/cortiz2894/flow-shield-effect"
188
+ },
189
+ debugParams: [
190
+ { key: "radius", label: "玻璃罩半径", kind: "scale", min: 0.4, max: 10, step: 0.01 },
191
+ { key: "verticalScale", label: "纵向缩放", kind: "scale", min: 0.5, max: 1.8, step: 0.01 },
192
+ { key: "color", label: "主体颜色", kind: "color" },
193
+ { key: "opacity", label: "透明度", kind: "opacity", min: 0.02, max: 1, step: 0.01 },
194
+ { key: "fresnelPower", label: "边缘曲线", kind: "number", min: 0.2, max: 6, step: 0.01 },
195
+ { key: "fresnelStrength", label: "边缘强度", kind: "number", min: 0, max: 6, step: 0.01 },
196
+ { key: "rimIntensity", label: "轮廓亮度", kind: "number", min: 0, max: 4, step: 0.01 },
197
+ { key: "surfaceIntensity", label: "表面亮度", kind: "number", min: 0, max: 3, step: 0.01 },
198
+ { key: "noiseScale", label: "噪声缩放", kind: "number", min: 0.2, max: 5, step: 0.01 },
199
+ { key: "noiseEdgeWidth", label: "噪声亮边宽度", kind: "number", min: 0.01, max: 0.5, step: 0.01 },
200
+ { key: "noiseEdgeIntensity", label: "噪声亮边强度", kind: "number", min: 0, max: 4, step: 0.01 },
201
+ { key: "noiseEdgeSmoothness", label: "噪声亮边柔和度", kind: "number", min: 0.02, max: 1, step: 0.01 },
202
+ { key: "flowScale", label: "纹路密度", kind: "number", min: 0, max: 3, step: 0.01 },
203
+ { key: "flowSpeed", label: "流动速度", kind: "number", min: 0, max: 5, step: 0.01 },
204
+ { key: "flowIntensity", label: "流动强度", kind: "number", min: 0, max: 8, step: 0.01 },
205
+ { key: "marbleContrast", label: "纹路锐度", kind: "number", min: 0.25, max: 4, step: 0.01 },
206
+ { key: "bloomIntensity", label: "Bloom 强度", kind: "number", min: 0, max: 4, step: 0.01 },
207
+ { key: "bloomKernelSize", label: "Bloom 半径", kind: "number", min: 8, max: 128, step: 1 }
208
+ ],
209
+ create({ scene, root, position, renderingGroupId, params }) {
210
+ return createEnergyShield(scene, { root, position, renderingGroupId, params });
211
+ }
212
+ };
213
+ function createEnergyShield(scene, options = {}) {
214
+ registerShaders();
215
+ let params = mergeParams(options.params);
216
+ const root = options.root ?? new TransformNode("vfx_energyShield_root", scene);
217
+ const disposeRoot = options.disposeRoot ?? true;
218
+ if (options.target) {
219
+ root.parent = options.target;
220
+ root.position.set(0, 0, 0);
221
+ } else {
222
+ root.position.copyFrom(options.position ?? Vector3.ZeroReadOnly);
223
+ }
224
+ const shield = MeshBuilder.CreateSphere(
225
+ "vfx_energyShield_hemisphere",
226
+ {
227
+ diameter: 2,
228
+ segments: Math.max(16, Math.round(params.segments)),
229
+ slice: 0.5,
230
+ updatable: false
231
+ },
232
+ scene
233
+ );
234
+ shield.parent = root;
235
+ shield.isPickable = false;
236
+ shield.alwaysSelectAsActiveMesh = true;
237
+ shield.renderingGroupId = options.renderingGroupId ?? VFX_RENDERING_GROUP_ID;
238
+ shield.alphaIndex = 20;
239
+ const material = createShieldMaterial(scene);
240
+ shield.material = material;
241
+ let glowLayer = null;
242
+ if (params.bloomIntensity > 0) {
243
+ glowLayer = new GlowLayer(`vfx_energyShield_glow_${shield.uniqueId}`, scene, {
244
+ blurKernelSize: params.bloomKernelSize,
245
+ mainTextureRatio: 0.35
246
+ });
247
+ glowLayer.intensity = params.bloomIntensity;
248
+ glowLayer.addIncludedOnlyMesh(shield);
249
+ glowLayer.referenceMeshToUseItsOwnMaterial(shield);
250
+ }
251
+ applyParams(material, shield, glowLayer, params);
252
+ let elapsed = 0;
253
+ const observer = scene.onBeforeRenderObservable.add(() => {
254
+ elapsed += Math.min(scene.getEngine().getDeltaTime() / 1e3, 0.05);
255
+ material.setFloat("uTime", elapsed);
256
+ });
257
+ let disposed = false;
258
+ const dispose = () => {
259
+ if (disposed) return;
260
+ disposed = true;
261
+ scene.onBeforeRenderObservable.remove(observer);
262
+ glowLayer?.dispose();
263
+ shield.dispose(false, false);
264
+ material.dispose();
265
+ if (disposeRoot) root.dispose();
266
+ };
267
+ return {
268
+ root,
269
+ shield,
270
+ material,
271
+ glowLayer,
272
+ update(partial) {
273
+ params = mergeParams(partial, params);
274
+ applyParams(material, shield, glowLayer, params);
275
+ if (!glowLayer && params.bloomIntensity > 0) {
276
+ glowLayer = new GlowLayer(`vfx_energyShield_glow_${shield.uniqueId}`, scene, {
277
+ blurKernelSize: params.bloomKernelSize,
278
+ mainTextureRatio: 0.35
279
+ });
280
+ glowLayer.addIncludedOnlyMesh(shield);
281
+ glowLayer.referenceMeshToUseItsOwnMaterial(shield);
282
+ glowLayer.intensity = params.bloomIntensity;
283
+ applyParams(material, shield, glowLayer, params);
284
+ this.glowLayer = glowLayer;
285
+ }
286
+ },
287
+ dispose
288
+ };
289
+ }
290
+ function createShieldMaterial(scene) {
291
+ const material = new ShaderMaterial(
292
+ "vfx_energyShield_material",
293
+ scene,
294
+ { vertex: SHADER_NAME, fragment: SHADER_NAME },
295
+ {
296
+ attributes: ["position", "normal"],
297
+ uniforms: [
298
+ "world",
299
+ "worldViewProjection",
300
+ "cameraPosition",
301
+ "uTime",
302
+ "uColor",
303
+ "uOpacity",
304
+ "uFresnelPower",
305
+ "uFresnelStrength",
306
+ "uRimIntensity",
307
+ "uSurfaceIntensity",
308
+ "uNoiseScale",
309
+ "uNoiseEdgeWidth",
310
+ "uNoiseEdgeIntensity",
311
+ "uNoiseEdgeSmoothness",
312
+ "uFlowScale",
313
+ "uFlowSpeed",
314
+ "uFlowIntensity",
315
+ "uMarbleContrast"
316
+ ],
317
+ needAlphaBlending: true
318
+ }
319
+ );
320
+ material.alphaMode = Constants.ALPHA_COMBINE;
321
+ material.backFaceCulling = false;
322
+ material.disableDepthWrite = true;
323
+ material.fogEnabled = false;
324
+ return material;
325
+ }
326
+ function applyParams(material, shield, glowLayer, params) {
327
+ shield.scaling.set(params.radius, params.radius * params.verticalScale, params.radius);
328
+ material.setColor3("uColor", toColor3(params.color));
329
+ material.setFloat("uOpacity", params.opacity);
330
+ material.setFloat("uFresnelPower", params.fresnelPower);
331
+ material.setFloat("uFresnelStrength", params.fresnelStrength);
332
+ material.setFloat("uRimIntensity", params.rimIntensity);
333
+ material.setFloat("uSurfaceIntensity", params.surfaceIntensity);
334
+ material.setFloat("uNoiseScale", params.noiseScale);
335
+ material.setFloat("uNoiseEdgeWidth", params.noiseEdgeWidth);
336
+ material.setFloat("uNoiseEdgeIntensity", params.noiseEdgeIntensity);
337
+ material.setFloat("uNoiseEdgeSmoothness", params.noiseEdgeSmoothness);
338
+ material.setFloat("uFlowScale", params.flowScale);
339
+ material.setFloat("uFlowSpeed", params.flowSpeed);
340
+ material.setFloat("uFlowIntensity", params.flowIntensity);
341
+ material.setFloat("uMarbleContrast", params.marbleContrast);
342
+ if (glowLayer) {
343
+ glowLayer.intensity = params.bloomIntensity;
344
+ glowLayer.blurKernelSize = params.bloomKernelSize;
345
+ }
346
+ }
347
+ function mergeParams(patch, base = DEFAULT_PARAMS) {
348
+ return {
349
+ ...base,
350
+ ...patch,
351
+ color: patch?.color ? { ...patch.color } : { ...base.color }
352
+ };
353
+ }
354
+ function toColor3(color) {
355
+ return new Color3(color.r, color.g, color.b);
356
+ }
357
+ function registerShaders() {
358
+ Effect.ShadersStore[`${SHADER_NAME}VertexShader`] = VERTEX_SHADER;
359
+ Effect.ShadersStore[`${SHADER_NAME}FragmentShader`] = FRAGMENT_SHADER;
360
+ }
361
+ export {
362
+ createEnergyShield,
363
+ energyShieldEffectPackage as default,
364
+ energyShieldEffectPackage
365
+ };
@@ -0,0 +1,11 @@
1
+ import { VfxEffectPackage, VfxParamValues } from '../../types';
2
+ interface ExplosionParams extends VfxParamValues {
3
+ flashRadius: number;
4
+ flashBrightness: number;
5
+ sparksCount: number;
6
+ sparksSize: number;
7
+ embersCount: number;
8
+ embersPower: number;
9
+ }
10
+ export declare const explosionEffectPackage: VfxEffectPackage<ExplosionParams>;
11
+ export {};