@tsparticles/engine 4.0.0-beta.1 → 4.0.0-beta.10

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 (190) hide show
  1. package/67.min.js +1 -0
  2. package/README.md +53 -944
  3. package/browser/Core/Engine.js +1 -1
  4. package/browser/Options/Classes/Options.js +1 -14
  5. package/browser/Options/Classes/Particles/Paint.js +20 -0
  6. package/browser/Options/Classes/Particles/ParticlesOptions.js +60 -22
  7. package/browser/Options/Interfaces/Particles/IPaint.js +1 -0
  8. package/browser/Utils/CanvasUtils.js +3 -3
  9. package/browser/Utils/Utils.js +16 -10
  10. package/browser/exports.js +1 -0
  11. package/cjs/Core/Engine.js +1 -1
  12. package/cjs/Options/Classes/Options.js +1 -14
  13. package/cjs/Options/Classes/Particles/Paint.js +20 -0
  14. package/cjs/Options/Classes/Particles/ParticlesOptions.js +60 -22
  15. package/cjs/Options/Interfaces/Particles/IPaint.js +1 -0
  16. package/cjs/Utils/CanvasUtils.js +3 -3
  17. package/cjs/Utils/Utils.js +16 -10
  18. package/cjs/exports.js +1 -0
  19. package/dist_browser_Core_Container_js.js +1 -1
  20. package/esm/Core/Engine.js +1 -1
  21. package/esm/Options/Classes/Options.js +1 -14
  22. package/esm/Options/Classes/Particles/Paint.js +20 -0
  23. package/esm/Options/Classes/Particles/ParticlesOptions.js +60 -22
  24. package/esm/Options/Interfaces/Particles/IPaint.js +1 -0
  25. package/esm/Utils/CanvasUtils.js +3 -3
  26. package/esm/Utils/Utils.js +16 -10
  27. package/esm/exports.js +1 -0
  28. package/package.json +2 -3
  29. package/report.html +1 -1
  30. package/tsparticles.engine.js +18 -8
  31. package/tsparticles.engine.min.js +2 -2
  32. package/types/Core/Interfaces/IPalette.d.ts +15 -2
  33. package/types/Options/Classes/Particles/Paint.d.ts +10 -0
  34. package/types/Options/Classes/Particles/ParticlesOptions.d.ts +4 -4
  35. package/types/Options/Interfaces/Particles/IPaint.d.ts +6 -0
  36. package/types/Options/Interfaces/Particles/IParticlesOptions.d.ts +3 -4
  37. package/types/export-types.d.ts +1 -0
  38. package/types/exports.d.ts +1 -0
  39. package/155.min.js +0 -1
  40. package/umd/Core/CanvasManager.js +0 -317
  41. package/umd/Core/Container.js +0 -383
  42. package/umd/Core/Engine.js +0 -183
  43. package/umd/Core/Interfaces/Colors.js +0 -12
  44. package/umd/Core/Interfaces/IBounds.js +0 -12
  45. package/umd/Core/Interfaces/IBubbleParticleData.js +0 -12
  46. package/umd/Core/Interfaces/ICircleBouncer.js +0 -12
  47. package/umd/Core/Interfaces/IColorManager.js +0 -12
  48. package/umd/Core/Interfaces/IContainerPlugin.js +0 -12
  49. package/umd/Core/Interfaces/ICoordinates.js +0 -12
  50. package/umd/Core/Interfaces/IDelta.js +0 -12
  51. package/umd/Core/Interfaces/IDimension.js +0 -12
  52. package/umd/Core/Interfaces/IDistance.js +0 -12
  53. package/umd/Core/Interfaces/IDrawParticleParams.js +0 -12
  54. package/umd/Core/Interfaces/IEffectDrawer.js +0 -12
  55. package/umd/Core/Interfaces/ILoadParams.js +0 -12
  56. package/umd/Core/Interfaces/IPalette.js +0 -12
  57. package/umd/Core/Interfaces/IParticleColorStyle.js +0 -12
  58. package/umd/Core/Interfaces/IParticleHslAnimation.js +0 -12
  59. package/umd/Core/Interfaces/IParticleLife.js +0 -12
  60. package/umd/Core/Interfaces/IParticleOpacityData.js +0 -12
  61. package/umd/Core/Interfaces/IParticleRetinaProps.js +0 -12
  62. package/umd/Core/Interfaces/IParticleRoll.js +0 -12
  63. package/umd/Core/Interfaces/IParticleRotateData.js +0 -12
  64. package/umd/Core/Interfaces/IParticleTransformValues.js +0 -12
  65. package/umd/Core/Interfaces/IParticleUpdater.js +0 -12
  66. package/umd/Core/Interfaces/IParticleValueAnimation.js +0 -12
  67. package/umd/Core/Interfaces/IPlugin.js +0 -12
  68. package/umd/Core/Interfaces/IPositionFromSizeParams.js +0 -12
  69. package/umd/Core/Interfaces/IRangeValue.js +0 -12
  70. package/umd/Core/Interfaces/IShapeDrawData.js +0 -12
  71. package/umd/Core/Interfaces/IShapeDrawer.js +0 -12
  72. package/umd/Core/Interfaces/IShapeValues.js +0 -12
  73. package/umd/Core/Interfaces/ISlowParticleData.js +0 -12
  74. package/umd/Core/Particle.js +0 -433
  75. package/umd/Core/ParticlesManager.js +0 -377
  76. package/umd/Core/RenderManager.js +0 -317
  77. package/umd/Core/Retina.js +0 -47
  78. package/umd/Core/Utils/Constants.js +0 -23
  79. package/umd/Core/Utils/EventListeners.js +0 -102
  80. package/umd/Core/Utils/PluginManager.js +0 -159
  81. package/umd/Core/Utils/Ranges.js +0 -91
  82. package/umd/Core/Utils/SpatialHashGrid.js +0 -116
  83. package/umd/Core/Utils/Vectors.js +0 -126
  84. package/umd/Enums/AnimationStatus.js +0 -18
  85. package/umd/Enums/Directions/MoveDirection.js +0 -27
  86. package/umd/Enums/Directions/OutModeDirection.js +0 -20
  87. package/umd/Enums/Directions/RotateDirection.js +0 -19
  88. package/umd/Enums/Modes/AnimationMode.js +0 -20
  89. package/umd/Enums/Modes/LimitMode.js +0 -18
  90. package/umd/Enums/Modes/OutMode.js +0 -21
  91. package/umd/Enums/Modes/PixelMode.js +0 -18
  92. package/umd/Enums/RangeType.js +0 -18
  93. package/umd/Enums/Types/AlterType.js +0 -18
  94. package/umd/Enums/Types/DestroyType.js +0 -19
  95. package/umd/Enums/Types/EasingType.js +0 -58
  96. package/umd/Enums/Types/EventType.js +0 -28
  97. package/umd/Enums/Types/GradientType.js +0 -19
  98. package/umd/Enums/Types/ParticleOutType.js +0 -19
  99. package/umd/Enums/Types/StartValueType.js +0 -19
  100. package/umd/Options/Classes/AnimatableColor.js +0 -52
  101. package/umd/Options/Classes/AnimationOptions.js +0 -79
  102. package/umd/Options/Classes/Background/Background.js +0 -56
  103. package/umd/Options/Classes/ColorAnimation.js +0 -44
  104. package/umd/Options/Classes/FullScreen/FullScreen.js +0 -34
  105. package/umd/Options/Classes/HslAnimation.js +0 -30
  106. package/umd/Options/Classes/Options.js +0 -171
  107. package/umd/Options/Classes/OptionsColor.js +0 -42
  108. package/umd/Options/Classes/Particles/Bounce/ParticlesBounce.js +0 -31
  109. package/umd/Options/Classes/Particles/Bounce/ParticlesBounceFactor.js +0 -21
  110. package/umd/Options/Classes/Particles/Effect/Effect.js +0 -46
  111. package/umd/Options/Classes/Particles/Fill.js +0 -42
  112. package/umd/Options/Classes/Particles/Move/Move.js +0 -120
  113. package/umd/Options/Classes/Particles/Move/MoveAngle.js +0 -35
  114. package/umd/Options/Classes/Particles/Move/MoveCenter.js +0 -45
  115. package/umd/Options/Classes/Particles/Move/MoveGravity.js +0 -45
  116. package/umd/Options/Classes/Particles/Move/OutModes.js +0 -38
  117. package/umd/Options/Classes/Particles/Move/Path/MovePath.js +0 -46
  118. package/umd/Options/Classes/Particles/Move/Spin.js +0 -40
  119. package/umd/Options/Classes/Particles/Number/ParticlesDensity.js +0 -41
  120. package/umd/Options/Classes/Particles/Number/ParticlesNumber.js +0 -37
  121. package/umd/Options/Classes/Particles/Number/ParticlesNumberLimit.js +0 -35
  122. package/umd/Options/Classes/Particles/Opacity/Opacity.js +0 -35
  123. package/umd/Options/Classes/Particles/Opacity/OpacityAnimation.js +0 -34
  124. package/umd/Options/Classes/Particles/ParticlesOptions.js +0 -116
  125. package/umd/Options/Classes/Particles/Shape/Shape.js +0 -46
  126. package/umd/Options/Classes/Particles/Size/Size.js +0 -35
  127. package/umd/Options/Classes/Particles/Size/SizeAnimation.js +0 -34
  128. package/umd/Options/Classes/Particles/Stroke.js +0 -39
  129. package/umd/Options/Classes/Particles/ZIndex/ZIndex.js +0 -42
  130. package/umd/Options/Classes/ResizeEvent.js +0 -34
  131. package/umd/Options/Classes/ValueWithRandom.js +0 -56
  132. package/umd/Options/Interfaces/Background/IBackground.js +0 -12
  133. package/umd/Options/Interfaces/FullScreen/IFullScreen.js +0 -12
  134. package/umd/Options/Interfaces/IAnimatable.js +0 -12
  135. package/umd/Options/Interfaces/IAnimatableColor.js +0 -12
  136. package/umd/Options/Interfaces/IAnimation.js +0 -12
  137. package/umd/Options/Interfaces/IColorAnimation.js +0 -12
  138. package/umd/Options/Interfaces/IHslAnimation.js +0 -12
  139. package/umd/Options/Interfaces/IOptionLoader.js +0 -12
  140. package/umd/Options/Interfaces/IOptions.js +0 -12
  141. package/umd/Options/Interfaces/IOptionsColor.js +0 -12
  142. package/umd/Options/Interfaces/IResizeEvent.js +0 -12
  143. package/umd/Options/Interfaces/IValueWithRandom.js +0 -12
  144. package/umd/Options/Interfaces/Particles/Bounce/IParticlesBounce.js +0 -12
  145. package/umd/Options/Interfaces/Particles/Effect/IEffect.js +0 -12
  146. package/umd/Options/Interfaces/Particles/IFill.js +0 -12
  147. package/umd/Options/Interfaces/Particles/IParticlesOptions.js +0 -12
  148. package/umd/Options/Interfaces/Particles/IStroke.js +0 -12
  149. package/umd/Options/Interfaces/Particles/Move/IMove.js +0 -12
  150. package/umd/Options/Interfaces/Particles/Move/IMoveAngle.js +0 -12
  151. package/umd/Options/Interfaces/Particles/Move/IMoveCenter.js +0 -12
  152. package/umd/Options/Interfaces/Particles/Move/IMoveGravity.js +0 -12
  153. package/umd/Options/Interfaces/Particles/Move/IOutModes.js +0 -12
  154. package/umd/Options/Interfaces/Particles/Move/ISpin.js +0 -12
  155. package/umd/Options/Interfaces/Particles/Move/Path/IMovePath.js +0 -12
  156. package/umd/Options/Interfaces/Particles/Number/IParticlesDensity.js +0 -12
  157. package/umd/Options/Interfaces/Particles/Number/IParticlesNumber.js +0 -12
  158. package/umd/Options/Interfaces/Particles/Number/IParticlesNumberLimit.js +0 -12
  159. package/umd/Options/Interfaces/Particles/Opacity/IOpacity.js +0 -12
  160. package/umd/Options/Interfaces/Particles/Opacity/IOpacityAnimation.js +0 -12
  161. package/umd/Options/Interfaces/Particles/Shape/IShape.js +0 -12
  162. package/umd/Options/Interfaces/Particles/Size/ISize.js +0 -12
  163. package/umd/Options/Interfaces/Particles/Size/ISizeAnimation.js +0 -12
  164. package/umd/Options/Interfaces/Particles/ZIndex/IZIndex.js +0 -12
  165. package/umd/Types/CanvasContextType.js +0 -12
  166. package/umd/Types/CustomEventArgs.js +0 -12
  167. package/umd/Types/CustomEventListener.js +0 -12
  168. package/umd/Types/EasingFunction.js +0 -12
  169. package/umd/Types/EngineInitializers.js +0 -12
  170. package/umd/Types/ExportResult.js +0 -12
  171. package/umd/Types/ISourceOptions.js +0 -12
  172. package/umd/Types/ParticlesGroups.js +0 -12
  173. package/umd/Types/PathOptions.js +0 -12
  174. package/umd/Types/RangeValue.js +0 -12
  175. package/umd/Types/RecursivePartial.js +0 -12
  176. package/umd/Types/ShapeData.js +0 -12
  177. package/umd/Types/SingleOrMultiple.js +0 -12
  178. package/umd/Utils/CanvasUtils.js +0 -145
  179. package/umd/Utils/ColorUtils.js +0 -395
  180. package/umd/Utils/EventDispatcher.js +0 -63
  181. package/umd/Utils/LogUtils.js +0 -37
  182. package/umd/Utils/MathUtils.js +0 -203
  183. package/umd/Utils/OptionsUtils.js +0 -25
  184. package/umd/Utils/TypeUtils.js +0 -40
  185. package/umd/Utils/Utils.js +0 -484
  186. package/umd/bundle.js +0 -32
  187. package/umd/export-types.js +0 -12
  188. package/umd/exports.js +0 -82
  189. package/umd/index.js +0 -32
  190. package/umd/initEngine.js +0 -17
@@ -1,27 +1,26 @@
1
1
  import { deepExtend, executeOnSingleOrMultiple } from "../../../Utils/Utils.js";
2
+ import { isArray, isNull } from "../../../Utils/TypeUtils.js";
2
3
  import { Effect } from "./Effect/Effect.js";
3
- import { Fill } from "./Fill.js";
4
4
  import { Move } from "./Move/Move.js";
5
5
  import { Opacity } from "./Opacity/Opacity.js";
6
+ import { Paint } from "./Paint.js";
6
7
  import { ParticlesBounce } from "./Bounce/ParticlesBounce.js";
7
8
  import { ParticlesNumber } from "./Number/ParticlesNumber.js";
8
9
  import { Shape } from "./Shape/Shape.js";
9
10
  import { Size } from "./Size/Size.js";
10
- import { Stroke } from "./Stroke.js";
11
11
  import { ZIndex } from "./ZIndex/ZIndex.js";
12
- import { isNull } from "../../../Utils/TypeUtils.js";
13
12
  export class ParticlesOptions {
14
13
  bounce;
15
14
  effect;
16
- fill;
17
15
  groups;
18
16
  move;
19
17
  number;
20
18
  opacity;
19
+ paint;
20
+ palette;
21
21
  reduceDuplicates;
22
22
  shape;
23
23
  size;
24
- stroke;
25
24
  zIndex;
26
25
  _container;
27
26
  _pluginManager;
@@ -30,21 +29,24 @@ export class ParticlesOptions {
30
29
  this._container = container;
31
30
  this.bounce = new ParticlesBounce();
32
31
  this.effect = new Effect();
33
- this.fill = new Fill();
34
32
  this.groups = {};
35
33
  this.move = new Move();
36
34
  this.number = new ParticlesNumber();
37
35
  this.opacity = new Opacity();
36
+ this.paint = new Paint();
38
37
  this.reduceDuplicates = false;
39
38
  this.shape = new Shape();
40
39
  this.size = new Size();
41
- this.stroke = new Stroke();
42
40
  this.zIndex = new ZIndex();
43
41
  }
44
42
  load(data) {
45
43
  if (isNull(data)) {
46
44
  return;
47
45
  }
46
+ if (data.palette) {
47
+ this.palette = data.palette;
48
+ this._importPalette(this.palette);
49
+ }
48
50
  if (data.groups !== undefined) {
49
51
  for (const group of Object.keys(data.groups)) {
50
52
  if (!(group in data.groups)) {
@@ -64,25 +66,17 @@ export class ParticlesOptions {
64
66
  this.move.load(data.move);
65
67
  this.number.load(data.number);
66
68
  this.opacity.load(data.opacity);
67
- this.shape.load(data.shape);
68
- this.size.load(data.size);
69
- this.zIndex.load(data.zIndex);
70
- const fillToLoad = data.fill;
71
- if (fillToLoad) {
72
- this.fill = executeOnSingleOrMultiple(fillToLoad, t => {
73
- const tmp = new Fill();
74
- tmp.load(t);
75
- return tmp;
76
- });
77
- }
78
- const strokeToLoad = data.stroke;
79
- if (strokeToLoad) {
80
- this.stroke = executeOnSingleOrMultiple(strokeToLoad, t => {
81
- const tmp = new Stroke();
69
+ const paintToLoad = data.paint;
70
+ if (paintToLoad) {
71
+ this.paint = executeOnSingleOrMultiple(paintToLoad, t => {
72
+ const tmp = new Paint();
82
73
  tmp.load(t);
83
74
  return tmp;
84
75
  });
85
76
  }
77
+ this.shape.load(data.shape);
78
+ this.size.load(data.size);
79
+ this.zIndex.load(data.zIndex);
86
80
  if (this._container) {
87
81
  for (const plugin of this._pluginManager.plugins) {
88
82
  if (plugin.loadParticlesOptions) {
@@ -99,4 +93,48 @@ export class ParticlesOptions {
99
93
  }
100
94
  }
101
95
  }
96
+ _importPalette = (palette) => {
97
+ const paletteData = this._pluginManager.getPalette(palette);
98
+ if (!paletteData) {
99
+ return;
100
+ }
101
+ const paletteColors = paletteData.colors, paletteFill = paletteColors.fill, paletteStroke = paletteColors.stroke, defaultPaintStrokeIndex = 0, defaultPaintStrokeWidth = 0, palettePaint = {
102
+ fill: paletteFill
103
+ ? {
104
+ color: {
105
+ value: paletteFill.value,
106
+ },
107
+ enable: paletteFill.enable,
108
+ }
109
+ : undefined,
110
+ };
111
+ if (paletteStroke) {
112
+ if (isArray(paletteStroke)) {
113
+ const firstStroke = paletteStroke[defaultPaintStrokeIndex];
114
+ if (firstStroke) {
115
+ palettePaint.stroke = {
116
+ color: {
117
+ value: firstStroke.value,
118
+ },
119
+ width: firstStroke.width || defaultPaintStrokeWidth,
120
+ };
121
+ }
122
+ }
123
+ else {
124
+ palettePaint.stroke = {
125
+ color: {
126
+ value: paletteStroke.value,
127
+ },
128
+ width: paletteStroke.width,
129
+ };
130
+ }
131
+ }
132
+ this.load({
133
+ paint: palettePaint,
134
+ blend: {
135
+ enable: true,
136
+ mode: paletteData.blendMode,
137
+ },
138
+ });
139
+ };
102
140
  }
@@ -0,0 +1 @@
1
+ export {};
@@ -88,12 +88,12 @@ export function drawShape(drawer, data) {
88
88
  if (particle.shapeClose) {
89
89
  context.closePath();
90
90
  }
91
- if (stroke) {
92
- context.stroke();
93
- }
94
91
  if (fill) {
95
92
  context.fill();
96
93
  }
94
+ if (stroke) {
95
+ context.stroke();
96
+ }
97
97
  }
98
98
  export function drawShapeAfterDraw(drawer, data) {
99
99
  if (!drawer?.afterDraw) {
@@ -326,6 +326,19 @@ export function updateAnimation(particle, data, changeDirection, destroyType, de
326
326
  if ((data.delayTime ?? minDelay) > minDelay && data.time < (data.delayTime ?? minDelay)) {
327
327
  return;
328
328
  }
329
+ switch (data.status) {
330
+ case AnimationStatus.increasing:
331
+ data.value += velocity;
332
+ break;
333
+ case AnimationStatus.decreasing:
334
+ data.value -= velocity;
335
+ break;
336
+ default:
337
+ break;
338
+ }
339
+ if (data.velocity && decay !== identity) {
340
+ data.velocity *= decay;
341
+ }
329
342
  switch (data.status) {
330
343
  case AnimationStatus.increasing:
331
344
  if (data.value >= maxValue) {
@@ -338,9 +351,6 @@ export function updateAnimation(particle, data, changeDirection, destroyType, de
338
351
  data.loops ??= minLoops;
339
352
  data.loops++;
340
353
  }
341
- else {
342
- data.value += velocity;
343
- }
344
354
  break;
345
355
  case AnimationStatus.decreasing:
346
356
  if (data.value <= minValue) {
@@ -353,18 +363,14 @@ export function updateAnimation(particle, data, changeDirection, destroyType, de
353
363
  data.loops ??= minLoops;
354
364
  data.loops++;
355
365
  }
356
- else {
357
- data.value -= velocity;
358
- }
359
366
  break;
360
367
  default:
361
368
  break;
362
369
  }
363
- if (data.velocity && decay !== identity) {
364
- data.velocity *= decay;
365
- }
366
370
  checkDestroy(particle, destroyType, data.value, minValue, maxValue);
367
- data.value = clamp(data.value, minValue, maxValue);
371
+ if (!particle.destroyed) {
372
+ data.value = clamp(data.value, minValue, maxValue);
373
+ }
368
374
  }
369
375
  export function cloneStyle(style) {
370
376
  const clonedStyle = safeDocument().createElement("div").style;
package/esm/exports.js CHANGED
@@ -28,6 +28,7 @@ export * from "./Options/Classes/Particles/Bounce/ParticlesBounce.js";
28
28
  export * from "./Options/Classes/Particles/Bounce/ParticlesBounceFactor.js";
29
29
  export * from "./Options/Classes/Particles/ParticlesOptions.js";
30
30
  export * from "./Options/Classes/Particles/Fill.js";
31
+ export * from "./Options/Classes/Particles/Paint.js";
31
32
  export * from "./Options/Classes/Particles/Stroke.js";
32
33
  export * from "./Options/Classes/Particles/Move/Move.js";
33
34
  export * from "./Options/Classes/Particles/Move/MoveAngle.js";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tsparticles/engine",
3
- "version": "4.0.0-beta.1",
3
+ "version": "4.0.0-beta.10",
4
4
  "description": "Easily create highly customizable particle, confetti and fireworks animations and use them as animated backgrounds for your website. Ready to use components available also for React, Vue.js (2.x and 3.x), Angular, Svelte, jQuery, Preact, Riot.js, Inferno.",
5
5
  "homepage": "https://particles.js.org",
6
6
  "scripts": {
@@ -96,8 +96,7 @@
96
96
  "browser": "./browser/index.js",
97
97
  "import": "./esm/index.js",
98
98
  "require": "./cjs/index.js",
99
- "umd": "./umd/index.js",
100
- "default": "./cjs/index.js"
99
+ "default": "./esm/index.js"
101
100
  },
102
101
  "./package.json": "./package.json"
103
102
  },
package/report.html CHANGED
@@ -3,7 +3,7 @@
3
3
  <head>
4
4
  <meta charset="UTF-8" />
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1" />
6
- <title>@tsparticles/engine [31 Mar 2026 at 08:44]</title>
6
+ <title>@tsparticles/engine [8 Apr 2026 at 15:54]</title>
7
7
  <link
8
8
  rel="shortcut icon"
9
9
  href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAMAAACdt4HsAAABrVBMVEUAAAD///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////+O1foceMD///+J0/qK1Pr7/v8Xdr/9///W8P4UdL7L7P0Scr2r4Pyj3vwad8D5/f/2/f+55f3E6f34+/2H0/ojfMKpzOd0rNgQcb3F3O/j9f7c8v6g3Pz0/P/w+v/q+P7n9v6T1/uQ1vuE0vqLut/y+v+Z2fvt+f+15Pzv9fuc2/vR7v2V2Pvd6/bg9P7I6/285/2y4/yp3/zp8vk8i8kqgMT7/P31+fyv4vxGkcz6/P6/6P3j7vfS5PNnpNUxhcbO7f7F6v3O4vHK3/DA2u631Ouy0eqXweKJud5wqthfoNMMbLvY8f73+v2dxeR8sNtTmdDx9/zX6PSjyeaCtd1YnNGX2PuQveCGt95Nls42h8dLlM3F4vBtAAAAM3RSTlMAAyOx0/sKBvik8opWGBMOAe3l1snDm2E9LSb06eHcu5JpHbarfHZCN9CBb08zzkdNS0kYaptYAAAFV0lEQVRYw92X51/aYBDHHS2O2qqttVbrqNq9m+TJIAYIShBkWwqIiCgoWvfeq7Z2/s29hyQNyUcR7LveGwVyXy6XH8/9rqxglLfUPLxVduUor3h0rfp2TYvpivk37929TkG037hffoX0+peVtZQc1589rigVUdXS/ABSAyEmGIO/1XfvldSK8vs3OqB6u3m0nxmIrvgB0dj7rr7Y9IbuF68hnfFaiHA/sxqm0wciIG43P60qKv9WXWc1RXGh/mFESFABTSBi0sNAKzqet17eCtOb3kZIDwxEEU0oAIJGYxNBDhBND29e0rtXXbcpuPmED9IhEAAQ/AXEaF8EPmnrrKsv0LvWR3fg5sWDNAFZOgAgaKvZDogHNU9MFwnnYROkc56RD5CjAbQX9Ow4g7upCsvYu55aSI/Nj0H1akgKQEUM94dwK65hYRmFU9MIcH/fqJYOZYcnuJSU/waKDgTOEVaVKhwrTRP5XzgSpAITYzom7UvkhFX5VutmxeNnWDjjswTKTyfgluNDGbUpWissXhF3s7mlSml+czWkg3D0l1nNjGNjz3myOQOa1KM/jOS6ebdbAVTCi4gljHSFrviza7tOgRWcS0MOUX9zdNgag5w7rRqA44Lzw0hr1WqES36dFliSJFlh2rXIae3FFcDDgKdxrUIDePr8jGcSClV1u7A9xeN0ModY/pHMxmR1EzRh8TJiwqsHmKW0l4FCEZI+jHio+JdPPE9qwQtTRxku2D8sIeRL2LnxWSllANCQGOIiqVHAz2ye2JR0DcH+HoxDkaADLjgxjKQ+AwCX/g0+DNgdG0ukYCONAe+dbc2IAc6fwt1ARoDSezNHxV2Cmzwv3O6lDMV55edBGwGK9n1+x2F8EDfAGCxug8MhpsMEcTEAWf3rx2vZhe/LAmtIn/6apE6PN0ULKgywD9mmdxbmFl3OvD5AS5fW5zLbv/YHmcsBTjf/afDz3MaZTVCfAP9z6/Bw6ycv8EUBWJIn9zYcoAWWlW9+OzO3vkTy8H+RANLmdrpOuYWdZYEXpo+TlCJrW5EARb7fF+bWdqf3hhyZI1nWJQHgznErZhbjoEsWqi8dQNoE294aldzFurwSABL2XXMf9+H1VQGke9exw5P/AnA5Pv5ngMul7LOvO922iwACu8WkCwLCafvM4CeWPxfA8lNHcWZSoi8EwMAIciKX2Z4SWCMAa3snCZ/G4EA8D6CMLNFsGQhkkz/gQNEBbPCbWsxGUpYVu3z8IyNAknwJkfPMEhLyrdi5RTyUVACkw4GSFRNWJNEW+fgPGwHD8/JxnRuLabN4CGNRkAE23na2+VmEAUmrYymSGjMAYqH84YUIyzgzs3XC7gNgH36Vcc4zKY9o9fgPBXUAiHHwVboBHGLiX6Zcjp1f2wu4tvzZKo0ecPnDtQYDQvJXaBeNzce45Fp28ZQLrEZVuFqgBwOalArKXnW1UzlnSusQKJqKYNuz4tOnI6sZG4zanpemv+7ySU2jbA9h6uhcgpfy6G2PahirDZ6zvq6zDduMVFTKvzw8wgyEdelwY9in3XkEPs3osJuwRQ4qTkfzifndg9Gfc4pdsu82+tTnHZTBa2EAMrqr2t43pguc8tNm7JQVQ2S0ukj2d22dhXYP0/veWtwKrCkNoNimAN5+Xr/oLrxswKbVJjteWrX7eR63o4j9q0GxnaBdWgGA5VStpanIjQmEhV0/nVt5VOFUvix6awJhPcAaTEShgrG+iGyvb5a0Ndb1YGHFPEwoqAinoaykaID1o1pdPNu7XsnCKQ3R+hwWIIhGvORcJUBYXe3Xa3vq/mF/N9V13ugufMkfXn+KHsRD0B8AAAAASUVORK5CYII="