{"id":1452,"date":"2024-11-10T15:33:22","date_gmt":"2024-11-10T06:33:22","guid":{"rendered":"https:\/\/heyyocg.link\/?p=1452"},"modified":"2024-11-10T15:54:32","modified_gmt":"2024-11-10T06:54:32","slug":"normalize-lecture","status":"publish","type":"post","link":"https:\/\/heyyocg.link\/en\/normalize-lecture\/","title":{"rendered":"All You Need is Normalize"},"content":{"rendered":"\n<h1 class=\"wp-block-heading\">Introduction<\/h1>\n\n\n\n<p>This time, I would like to explain &#8220;Normalize&#8221;, which is commonly used when doing somewhat technical things in visual effect creation.<\/p>\n\n\n\n<p>\u203b By the way, the title is just an exaggeration as you know. I just wanted to give the title an interesting name&#8230;<\/p>\n\n\n\n<p>Normalization itself is a mathematical term and is a concept that appears not only in visual effect creation and CG production but also in statistics and many other fields. The meaning of the term and the calculations involved can differ depending on the domain, so I don&#8217;t intend to go into strict technical details here.<\/p>\n\n\n\n<p>Furthermore, normalizing is more about an approach or habit for improving efficiency and generalization rather than simply a piece of knowledge. I believe artists who do a little bit of math in tools like Shader, Niagara, or Houdini should definitely make this concept a part of their toolkit.<\/p>\n\n\n\n<p>I\u2019ll explain using examples from Unreal Engine, but the underlying concept doesn\u2019t depend on the tools used, so even if you&#8217;re not using Unreal Engine, I encourage you to take a look!<\/p>\n\n\n\n<p>The data from the two examples mentioned below are available for sale, so feel free to check them out if you&#8217;re interested!<\/p>\n\n\n\n<p><a href=\"https:\/\/heyyohanashima.gumroad.com\/l\/nlnnq\">Procedural High Smoke<\/a><\/p>\n\n\n\n<p><a href=\"https:\/\/heyyohanashima.gumroad.com\/l\/mycyh\">Procedural Thunder<\/a><\/p>\n\n\n\n<h1 class=\"wp-block-heading\">What is Normalize?<\/h1>\n\n\n\n<p>In CG production, when we talk about normalizing, there are generally two cases: normalizing a single value (float, scalar) and normalizing a vector (Vector2, 3, 4, etc.).<\/p>\n\n\n\n<p>The core concept is the same in both cases, but for the sake of explanation and examples, it&#8217;s easier to separate them. This time, I will focus on normalizing a single value.<\/p>\n\n\n\n<p>To put it simply, normalizing means &#8220;scaling the value range to 0~1.&#8221; It&#8217;s quite simple.<br>By the way, normalizing a vector means &#8220;making the vector&#8217;s length equal to 1.&#8221; It seems similar, doesn&#8217;t it?<\/p>\n\n\n\n<p>To explain what it means to normalize a value into a 0~1 range, I\u2019ll use Niagara\u2019s &#8220;Normalized Age&#8221; as an example.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Normalized Age<\/h2>\n\n\n\n<p>As the name suggests, &#8220;Normalized Age&#8221; refers to the age that has been normalized. Age in this context means the number of seconds that have passed since a particle was created.<\/p>\n\n\n\n<p>For example, if the lifetime of a particle is set to 2 seconds, the age will be the elapsed time since the particle&#8217;s birth, and it will disappear when it reaches 2 seconds. So, the age value will range from 0 to 2.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img fetchpriority=\"high\" decoding=\"async\" width=\"1024\" height=\"298\" src=\"https:\/\/heyyocg.link\/wp-content\/uploads\/2024\/11\/image-1024x298.png\" alt=\"\" class=\"wp-image-1454\" srcset=\"https:\/\/heyyocg.link\/wp-content\/uploads\/2024\/11\/image-1024x298.png 1024w, https:\/\/heyyocg.link\/wp-content\/uploads\/2024\/11\/image-300x87.png 300w, https:\/\/heyyocg.link\/wp-content\/uploads\/2024\/11\/image-768x223.png 768w, https:\/\/heyyocg.link\/wp-content\/uploads\/2024\/11\/image.png 1201w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>Now, what happens when you normalize this age? You scale the range from 0-2 into 0-1, so as shown in the figure, when the age is 1, the normalized value will be 0.5, and when the age is 2, the normalized value will be 1.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" width=\"1024\" height=\"306\" src=\"https:\/\/heyyocg.link\/wp-content\/uploads\/2024\/11\/image-1-1024x306.png\" alt=\"\" class=\"wp-image-1456\" srcset=\"https:\/\/heyyocg.link\/wp-content\/uploads\/2024\/11\/image-1-1024x306.png 1024w, https:\/\/heyyocg.link\/wp-content\/uploads\/2024\/11\/image-1-300x90.png 300w, https:\/\/heyyocg.link\/wp-content\/uploads\/2024\/11\/image-1-768x230.png 768w, https:\/\/heyyocg.link\/wp-content\/uploads\/2024\/11\/image-1.png 1273w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">What Are the Benefits?<\/h2>\n\n\n\n<p>So, what benefits do we gain by normalizing the age to a 0~1 range? Let\u2019s look at how Normalized Age is actually used.<\/p>\n\n\n\n<p>In most cases, when creating effects, you might want to change attributes like color, size, or opacity according to the particle\u2019s lifetime. For example, when fading out a particle, you might use a scale color node and set a curve on the alpha channel.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" width=\"749\" height=\"404\" src=\"https:\/\/heyyocg.link\/wp-content\/uploads\/2024\/08\/image-17.png\" alt=\"\" class=\"wp-image-1358\" srcset=\"https:\/\/heyyocg.link\/wp-content\/uploads\/2024\/08\/image-17.png 749w, https:\/\/heyyocg.link\/wp-content\/uploads\/2024\/08\/image-17-300x162.png 300w\" sizes=\"(max-width: 749px) 100vw, 749px\" \/><\/figure>\n\n\n\n<p>By default, the curve index is set to Normalized Age.<\/p>\n\n\n\n<p>The curve reads as follows: the vertical axis represents the value returned (which would be the value assigned to Scale Alpha), and the horizontal axis represents the curve index (which is the Normalized Age). So, when the Normalized Age is 0, Scale Alpha is 1; when it&#8217;s 0.5, Scale Alpha is 0.5; and when it&#8217;s 1, Scale Alpha is 0.<\/p>\n\n\n\n<p>As shown in the image above, this means that as the particle ages, the alpha gradually decreases, and when it dies, it reaches zero.<\/p>\n\n\n\n<p>Now, if we set the particle\u2019s lifetime to 2 seconds, we can recreate the same behavior by using Age in place of Normalized Age for the curve index, and setting the end point of the curve at 2 seconds, so that it reaches 0 when the lifetime is 2 seconds.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"909\" height=\"399\" src=\"https:\/\/heyyocg.link\/wp-content\/uploads\/2024\/08\/image-18.png\" alt=\"\" class=\"wp-image-1359\" srcset=\"https:\/\/heyyocg.link\/wp-content\/uploads\/2024\/08\/image-18.png 909w, https:\/\/heyyocg.link\/wp-content\/uploads\/2024\/08\/image-18-300x132.png 300w, https:\/\/heyyocg.link\/wp-content\/uploads\/2024\/08\/image-18-768x337.png 768w\" sizes=\"(max-width: 909px) 100vw, 909px\" \/><\/figure>\n\n\n\n<p>This will have the same effect as when using Normalized Age. However, this only works when the particle&#8217;s lifetime is exactly 2 seconds. For example, if the lifetime is set to 1 second, the particle will die when the alpha reaches 0.5, and if it&#8217;s set to 3 seconds, the alpha will reach 0 before the particle dies.<\/p>\n\n\n\n<p>In reality, when emitting multiple particles, you often use random ranges to give particles different lifetimes. So, if you create a fade-out curve where alpha becomes 0 when age reaches 2 seconds, the fade-out behavior will change for particles with different lifetimes.<\/p>\n\n\n\n<p>This is where Normalized Age comes in.<\/p>\n\n\n\n<p>No matter what the lifetime of each particle is, the Normalized Age represents the particle&#8217;s life as a value between 0 and 1. If the lifetime is 2 seconds, 1 second, or 3.45 seconds, the Normalized Age will start at 0 when the particle is created, reach 0.5 at the halfway of its lifetime, and become 1 when the particle dies.<\/p>\n\n\n\n<p>By using Normalized Age to set the curve, you can ensure that the fade-out occurs evenly for all particles, regardless of their lifetime.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Challenge Question!<\/h3>\n\n\n\n<p>How can we calculate Normalized Age? Think about it!<br>(The answer is at the bottom of this article)<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Using Lerp with Normalized Age<\/h2>\n\n\n\n<p>You may not yet fully grasp the benefits of normalizing from the example of Normalized Age, so let\u2019s take a look at a simple example where I combine Lerp and Normalize for even more useful applications.<\/p>\n\n\n\n<p>I often use Lerp and Normalize together when I want to fine-tune the start and end values, or when I want to adjust the transition curve of the start and end values separately.<\/p>\n\n\n\n<p>By the way, Lerp (Linear Interpolation) takes three inputs: A, B, and Alpha, and it returns a value between A and B, based on the ratio of Alpha.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"304\" height=\"122\" src=\"https:\/\/heyyocg.link\/wp-content\/uploads\/2024\/08\/image-19.png\" alt=\"\" class=\"wp-image-1360\" srcset=\"https:\/\/heyyocg.link\/wp-content\/uploads\/2024\/08\/image-19.png 304w, https:\/\/heyyocg.link\/wp-content\/uploads\/2024\/08\/image-19-300x120.png 300w\" sizes=\"(max-width: 304px) 100vw, 304px\" \/><\/figure>\n\n\n\n<p>If Alpha is 0, Lerp returns the value of A (100% of A); if Alpha is 0.5, it returns the average of A and B (50% of A and 50% of B); and if Alpha is 1, it returns the value of B (100% of B). This is called linear interpolation.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"842\" height=\"303\" src=\"https:\/\/heyyocg.link\/wp-content\/uploads\/2024\/08\/image-20.png\" alt=\"\" class=\"wp-image-1361\" srcset=\"https:\/\/heyyocg.link\/wp-content\/uploads\/2024\/08\/image-20.png 842w, https:\/\/heyyocg.link\/wp-content\/uploads\/2024\/08\/image-20-300x108.png 300w, https:\/\/heyyocg.link\/wp-content\/uploads\/2024\/08\/image-20-768x276.png 768w\" sizes=\"(max-width: 842px) 100vw, 842px\" \/><\/figure>\n\n\n\n<p>Now, when would you combine Lerp and Normalize? For example, I often use this approach when I want to apply power to a texture and control the fade-out by setting exponent (Exp) value dynamically through a Dynamic Parameter.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"617\" height=\"554\" src=\"https:\/\/heyyocg.link\/wp-content\/uploads\/2024\/08\/image-21.png\" alt=\"\" class=\"wp-image-1362\" srcset=\"https:\/\/heyyocg.link\/wp-content\/uploads\/2024\/08\/image-21.png 617w, https:\/\/heyyocg.link\/wp-content\/uploads\/2024\/08\/image-21-300x269.png 300w\" sizes=\"(max-width: 617px) 100vw, 617px\" \/><\/figure>\n\n\n\n<p>When applying power to a gradient texture, you can fade smoothly reflecting the texture&#8217;s appearance, but the exponent value that controls this fade-out often needs to be fine-tuned according to the desired look.<\/p>\n\n\n\n<p>Normally, you might just use a curve to control the transition animation of the value and its easing, but the problem with this approach is that when you change the value, the curve\u2019s easing also changes, requiring you to readjust the curve every time you change the value.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"909\" height=\"485\" src=\"https:\/\/heyyocg.link\/wp-content\/uploads\/2024\/08\/image-22.png\" alt=\"\" class=\"wp-image-1363\" srcset=\"https:\/\/heyyocg.link\/wp-content\/uploads\/2024\/08\/image-22.png 909w, https:\/\/heyyocg.link\/wp-content\/uploads\/2024\/08\/image-22-300x160.png 300w, https:\/\/heyyocg.link\/wp-content\/uploads\/2024\/08\/image-22-768x410.png 768w\" sizes=\"(max-width: 909px) 100vw, 909px\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-gallery has-nested-images columns-default is-cropped wp-block-gallery-1 is-layout-flex wp-block-gallery-is-layout-flex\">\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"894\" height=\"439\" data-id=\"1364\" src=\"https:\/\/heyyocg.link\/wp-content\/uploads\/2024\/08\/image-23.png\" alt=\"\" class=\"wp-image-1364\" srcset=\"https:\/\/heyyocg.link\/wp-content\/uploads\/2024\/08\/image-23.png 894w, https:\/\/heyyocg.link\/wp-content\/uploads\/2024\/08\/image-23-300x147.png 300w, https:\/\/heyyocg.link\/wp-content\/uploads\/2024\/08\/image-23-768x377.png 768w\" sizes=\"(max-width: 894px) 100vw, 894px\" \/><figcaption class=\"wp-element-caption\">When you chane the value  from 1 to 2 at the start point, the easing of the curve also changes.<\/figcaption><\/figure>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"892\" height=\"447\" data-id=\"1365\" src=\"https:\/\/heyyocg.link\/wp-content\/uploads\/2024\/08\/image-24.png\" alt=\"\" class=\"wp-image-1365\" srcset=\"https:\/\/heyyocg.link\/wp-content\/uploads\/2024\/08\/image-24.png 892w, https:\/\/heyyocg.link\/wp-content\/uploads\/2024\/08\/image-24-300x150.png 300w, https:\/\/heyyocg.link\/wp-content\/uploads\/2024\/08\/image-24-768x385.png 768w\" sizes=\"(max-width: 892px) 100vw, 892px\" \/><figcaption class=\"wp-element-caption\">So you need to adjust the easing to be the same as before you change the value<\/figcaption><\/figure>\n<\/figure>\n\n\n\n<p>If you used just a curve, changing the start value would also change the curve\u2019s easing, requiring you to adjust the curve every time you change a value, which is super inefficient.<\/p>\n\n\n\n<p>By using Lerp, I set the start and end values as A and B, and use a curve to control the transition speed. This allows me to adjust the transition independently of the start and end values.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"911\" height=\"472\" src=\"https:\/\/heyyocg.link\/wp-content\/uploads\/2024\/08\/image-25.png\" alt=\"\" class=\"wp-image-1366\" srcset=\"https:\/\/heyyocg.link\/wp-content\/uploads\/2024\/08\/image-25.png 911w, https:\/\/heyyocg.link\/wp-content\/uploads\/2024\/08\/image-25-300x155.png 300w, https:\/\/heyyocg.link\/wp-content\/uploads\/2024\/08\/image-25-768x398.png 768w\" sizes=\"(max-width: 911px) 100vw, 911px\" \/><\/figure>\n\n\n\n<p>By separating the control of the start and end values from the control of the transition curve, I avoid having to adjust the curve every time I tweak the start or end value. This makes the process much more efficient.<\/p>\n\n\n\n<p>Even though I haven\u2019t directly used a normalized attribute here, the concept of normalization is still applied. Instead of adjusting the start and end values in the curve, I normalize the curve\u2019s output to a 0\u20131 range and use Lerp to adjust the actual start and end values based on that.<\/p>\n\n\n\n<p>This illustrates the point I made earlier about Normalize being more of a mindset or habit than just a technical knowledge.<\/p>\n\n\n\n<p>I hope this gives you a better understanding of how Normalize can improve the workflow!<\/p>\n\n\n\n<p>(Note: The Lerp example here does add a slight overhead in processing, so if performance is critical, you may want to optimize further. However, the overhead of Lerp isn\u2019t dramatic, and the benefits of making adjustments more efficient often outweigh the extra cost.)<\/p>\n\n\n\n<h1 class=\"wp-block-heading\">Example 1: Procedural High Smoke<\/h1>\n\n\n\n<p>After covering the finer points of Normalization, let&#8217;s look at a more fun example. This one involves using Normalization to create a smoke effect that rises high into the air.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"774\" height=\"489\" src=\"https:\/\/heyyocg.link\/wp-content\/uploads\/2024\/08\/image.gif\" alt=\"\u753b\u50cf\u306b alt \u5c5e\u6027\u304c\u6307\u5b9a\u3055\u308c\u3066\u3044\u307e\u305b\u3093\u3002\u30d5\u30a1\u30a4\u30eb\u540d: TestBed-Unreal-Editor-2024-08-21-01-41-43_1.gif\" class=\"wp-image-1371\"\/><\/figure>\n\n\n\n<p>When creating background effects like this, how would you go about making smoke rise high into the air?<\/p>\n\n\n\n<p>You might consider using Velocity or Force, but adjusting parameters this way can be tricky and time-consuming. It\u2019s hard to get the ideal look, and it\u2019s inefficient to wait for the particle to rise to check the result.<\/p>\n\n\n\n<p>Instead, let&#8217;s reverse-engineer the physics: by understanding the visual behavior of the smoke at different heights, we can control the effect based on that.<\/p>\n\n\n\n<p>Before jumping into the creation steps, let&#8217;s think about what the natural behavior of rising smoke looks like:<\/p>\n\n\n\n<ul>\n<li>Smoke coming from a fire rises quickly due to heat.<\/li>\n\n\n\n<li>As it rises and moves away from the fire, the smoke disperses and becomes lighter, influenced by wind.<\/li>\n\n\n\n<li>The smoke gets thinner and lighter as it rises higher into the air.<\/li>\n<\/ul>\n\n\n\n<p>This behavior suggests that the appearance of smoke depends on its height. The higher it goes, the weaker the upward force becomes, and the more it spreads and thins out due to wind.<\/p>\n\n\n\n<p>To achieve this look, you can adjust parameters like Velocity, Size, and Color based on the particle\u2019s height. Let\u2019s see how this works in practice.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Creation Steps<\/h4>\n\n\n\n<ul>\n<li><strong>Step 1:<\/strong> Decide the height range where you want the smoke to appear and spawn particles at that height.<\/li>\n\n\n\n<li><strong>Step 2:<\/strong> Normalize the height of each particle and store that value in a new attribute, <code>NormalizedHeight<\/code>.<\/li>\n\n\n\n<li><strong>Step 3:<\/strong> Create a curve, <code>HeightBias<\/code>, based on <code>NormalizedHeight<\/code> to control the attributes like size and color.<\/li>\n\n\n\n<li><strong>Step 4:<\/strong> Use Lerp and the <code>HeightBias<\/code> curve to control particle attributes like Size, Color, and other properties based on height.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Normalizing the Height<\/h2>\n\n\n\n<p>First, let\u2019s go over steps 1 and 2 of the creation process.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"414\" src=\"https:\/\/heyyocg.link\/wp-content\/uploads\/2024\/08\/image-26-1024x414.png\" alt=\"\" class=\"wp-image-1373\" srcset=\"https:\/\/heyyocg.link\/wp-content\/uploads\/2024\/08\/image-26-1024x414.png 1024w, https:\/\/heyyocg.link\/wp-content\/uploads\/2024\/08\/image-26-300x121.png 300w, https:\/\/heyyocg.link\/wp-content\/uploads\/2024\/08\/image-26-768x311.png 768w, https:\/\/heyyocg.link\/wp-content\/uploads\/2024\/08\/image-26-1536x621.png 1536w, https:\/\/heyyocg.link\/wp-content\/uploads\/2024\/08\/image-26.png 1914w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>We create an attribute called &#8220;Height&#8221; in the Emitter and set it to 10,000.<\/p>\n\n\n\n<p>By setting this to the &#8220;Cylinder Height&#8221; in the Shape Location (Cylinder), we can randomly generate particles between the z-values of 0 and 10,000.<\/p>\n\n\n\n<p>Next, we create an attribute called &#8220;NormalizedHeight&#8221; in the Particle, and by dividing each particle&#8217;s position in the z-axis by the Height value, we can normalize the height. Simple, right?<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"427\" height=\"427\" src=\"https:\/\/heyyocg.link\/wp-content\/uploads\/2024\/08\/dwqqffw.jpg\" alt=\"\" class=\"wp-image-1375\" srcset=\"https:\/\/heyyocg.link\/wp-content\/uploads\/2024\/08\/dwqqffw.jpg 427w, https:\/\/heyyocg.link\/wp-content\/uploads\/2024\/08\/dwqqffw-300x300.jpg 300w, https:\/\/heyyocg.link\/wp-content\/uploads\/2024\/08\/dwqqffw-150x150.jpg 150w\" sizes=\"(max-width: 427px) 100vw, 427px\" \/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Creating a Curve Based on the Normalized Height<\/h2>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"905\" height=\"437\" src=\"https:\/\/heyyocg.link\/wp-content\/uploads\/2024\/08\/image-27.png\" alt=\"\" class=\"wp-image-1377\" srcset=\"https:\/\/heyyocg.link\/wp-content\/uploads\/2024\/08\/image-27.png 905w, https:\/\/heyyocg.link\/wp-content\/uploads\/2024\/08\/image-27-300x145.png 300w, https:\/\/heyyocg.link\/wp-content\/uploads\/2024\/08\/image-27-768x371.png 768w\" sizes=\"(max-width: 905px) 100vw, 905px\" \/><\/figure>\n\n\n\n<p>We create an attribute called &#8220;HeightBias&#8221; and set its value via a curve. By using NormalizedHeight in the CurveIndex, we can adjust how the value changes as the height increases.<\/p>\n\n\n\n<p>It might be hard to grasp the meaning of this until we see how it is used, so let\u2019s look at how the particles are affected by the wind and how they sway more as they move higher up.<\/p>\n\n\n\n<p>The swaying behavior due to wind is expressed by simply changing the particle&#8217;s spawn position. In other words, particles that originally spawned in a straight line will be shifted according to the wind direction, with particles higher up moving further in the specified wind direction.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"576\" src=\"https:\/\/heyyocg.link\/wp-content\/uploads\/2024\/08\/image-28-1024x576.png\" alt=\"\" class=\"wp-image-1378\" srcset=\"https:\/\/heyyocg.link\/wp-content\/uploads\/2024\/08\/image-28-1024x576.png 1024w, https:\/\/heyyocg.link\/wp-content\/uploads\/2024\/08\/image-28-300x169.png 300w, https:\/\/heyyocg.link\/wp-content\/uploads\/2024\/08\/image-28-768x432.png 768w, https:\/\/heyyocg.link\/wp-content\/uploads\/2024\/08\/image-28-1536x864.png 1536w, https:\/\/heyyocg.link\/wp-content\/uploads\/2024\/08\/image-28.png 1920w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>First, we create two parameters in the Emitter: &#8220;WindDirection&#8221; and &#8220;WindIntensity,&#8221; which define the wind&#8217;s direction and strength.<\/p>\n\n\n\n<p>Then, we simply add the value of <code>WindDirection \u00d7 WindIntensity \u00d7 HeightBias<\/code> to the original position.<\/p>\n\n\n\n<p>When NormalizedHeight is 0, HeightBias will be 0, and the value of <code>WindDirection \u00d7 WindIntensity \u00d7 HeightBias<\/code> will be 0, so the particle will not move from its original position.<\/p>\n\n\n\n<p>On the other hand, when NormalizedHeight is 1, HeightBias will be 1, so the value of <code>WindDirection \u00d7 WindIntensity \u00d7 HeightBias<\/code> will equal <code>WindDirection \u00d7 WindIntensity<\/code>. This means the particle will move in the direction of WindDirection by the amount set in WindIntensity.<\/p>\n\n\n\n<p>In this way, the movement of particles can be controlled based on their NormalizedHeight. The degree of control can be fine-tuned using the curve for HeightBias.<\/p>\n\n\n\n<p>For example, by setting the curve to a straight line, the particle movement will change linearly.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"576\" src=\"https:\/\/heyyocg.link\/wp-content\/uploads\/2024\/08\/image-29-1024x576.png\" alt=\"\" class=\"wp-image-1379\" srcset=\"https:\/\/heyyocg.link\/wp-content\/uploads\/2024\/08\/image-29-1024x576.png 1024w, https:\/\/heyyocg.link\/wp-content\/uploads\/2024\/08\/image-29-300x169.png 300w, https:\/\/heyyocg.link\/wp-content\/uploads\/2024\/08\/image-29-768x432.png 768w, https:\/\/heyyocg.link\/wp-content\/uploads\/2024\/08\/image-29-1536x864.png 1536w, https:\/\/heyyocg.link\/wp-content\/uploads\/2024\/08\/image-29.png 1920w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>By adjusting the curve, you can control the movement based on the particle&#8217;s height. This is the purpose of setting the HeightBias.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"566\" src=\"https:\/\/heyyocg.link\/wp-content\/uploads\/2024\/08\/image-30-1024x566.png\" alt=\"\" class=\"wp-image-1380\" srcset=\"https:\/\/heyyocg.link\/wp-content\/uploads\/2024\/08\/image-30-1024x566.png 1024w, https:\/\/heyyocg.link\/wp-content\/uploads\/2024\/08\/image-30-300x166.png 300w, https:\/\/heyyocg.link\/wp-content\/uploads\/2024\/08\/image-30-768x424.png 768w, https:\/\/heyyocg.link\/wp-content\/uploads\/2024\/08\/image-30-1536x849.png 1536w, https:\/\/heyyocg.link\/wp-content\/uploads\/2024\/08\/image-30.png 1916w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Using Height-Based Changes with HeightBias and Lerp<\/h2>\n\n\n\n<p>Now, let&#8217;s use the normalized height to affect other attributes. For instance, to simulate the spread of smoke that disperses more as it goes higher, we can spread the particles out in a spherical shape the higher they are, and also increase their size.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"799\" height=\"416\" src=\"https:\/\/heyyocg.link\/wp-content\/uploads\/2024\/08\/smokestudy01_4.gif\" alt=\"\" class=\"wp-image-1394\"\/><\/figure>\n\n\n\n<p>For attributes that should be zero when the height is zero, like the spread of particles, multiplying by HeightBias works fine. For example, the ShapeLocation (Sphere) &#8220;Sphere Radius&#8221; can be set to <code>2000 \u00d7 HeightBias<\/code> to increase the spread at higher altitudes while not affecting lower ones.<\/p>\n\n\n\n<p>For the SpriteSize, since we don&#8217;t want the size to become zero, we use Lerp. We set HeightBias as the alpha value to control the size at both extremes: when HeightBias is 0 and when it is 1.<\/p>\n\n\n\n<p>In the same way, we adjust other parameters:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"799\" height=\"412\" src=\"https:\/\/heyyocg.link\/wp-content\/uploads\/2024\/08\/smokestudy01_1_1.gif\" alt=\"\" class=\"wp-image-1395\"\/><figcaption class=\"wp-element-caption\"><strong>Lifetime and SubUVAnimation speed:<\/strong> Particles higher up live longer and move slower.<\/figcaption><\/figure>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"798\" height=\"412\" src=\"https:\/\/heyyocg.link\/wp-content\/uploads\/2024\/08\/smokestudy01_2_1.gif\" alt=\"\" class=\"wp-image-1396\"\/><figcaption class=\"wp-element-caption\"><strong>Initial Velocity and Acceleration:<\/strong> The higher the particle, the weaker the velocity and acceleration.<br><strong>Curl Noise Force:<\/strong> The higher the particle, the stronger the force.<\/figcaption><\/figure>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"798\" height=\"414\" src=\"https:\/\/heyyocg.link\/wp-content\/uploads\/2024\/08\/smokestudy01_3_1.gif\" alt=\"\" class=\"wp-image-1397\"\/><figcaption class=\"wp-element-caption\"><strong>Color:<\/strong> The lower the particle, the darker it is; the higher it is, the lighter it becomes.<\/figcaption><\/figure>\n\n\n\n<p>With these steps, we&#8217;ve created the basic framework for the rising smoke effect using normalization!<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">The Strength of Normalization<\/h2>\n\n\n\n<p>So far, we\u2019ve seen that by using a normalized height value, controlling various attributes becomes much easier. But the real strength comes next.<\/p>\n\n\n\n<p>When creating environment effects, you\u2019ll often want to reuse the same effect multiple times across different areas. However, you don\u2019t want all instances of the same effect to look exactly the same. To achieve variety, you can randomize various parameters.<\/p>\n\n\n\n<p>For the rising smoke effect, for example, you\u2019d want the height to vary within a certain range. And with normalization, you can do this easily! Not only that, but you don\u2019t have to adjust other parts of the effect even when randomizing the height.<\/p>\n\n\n\n<p>This is because, by using the normalized height to control the parameters, regardless of whether the height is 10,000, 800, or 15,000, the value of NormalizedHeight is always between 0 and 1.<\/p>\n\n\n\n<p>So, with just a single effect, you can easily create variety by randomly varying the height. The beauty of normalization lies in that you can create these variations without worrying about the input values and adjust the subsequent processes accordingly.<\/p>\n\n\n\n<p>By simply placing the effect in different locations, you can achieve the desired variety.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"566\" src=\"https:\/\/heyyocg.link\/wp-content\/uploads\/2024\/08\/smokehigh_thum-1024x566.jpg\" alt=\"\" class=\"wp-image-1398\" srcset=\"https:\/\/heyyocg.link\/wp-content\/uploads\/2024\/08\/smokehigh_thum-1024x566.jpg 1024w, https:\/\/heyyocg.link\/wp-content\/uploads\/2024\/08\/smokehigh_thum-300x166.jpg 300w, https:\/\/heyyocg.link\/wp-content\/uploads\/2024\/08\/smokehigh_thum-768x425.jpg 768w, https:\/\/heyyocg.link\/wp-content\/uploads\/2024\/08\/smokehigh_thum-1536x849.jpg 1536w, https:\/\/heyyocg.link\/wp-content\/uploads\/2024\/08\/smokehigh_thum.jpg 1859w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>This is the real strength of normalization!<\/p>\n\n\n\n<p>If you\u2019re interested, you can find the data for this effect available for purchase at the link below:<\/p>\n\n\n\n<p><a href=\"https:\/\/heyyohanashima.gumroad.com\/l\/nlnnq\">Procedural High Smoke<\/a><\/p>\n\n\n\n<h1 class=\"wp-block-heading\">Example 2: Procedural Lightning<\/h1>\n\n\n\n<p>Here\u2019s the second example of using normalization: a procedural lightning effect. I\u2019ll briefly explain the foundational mechanism behind this effect.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"800\" height=\"426\" src=\"https:\/\/heyyocg.link\/wp-content\/uploads\/2024\/08\/ProceadualThunder.gif\" alt=\"\" class=\"wp-image-1400\"\/><\/figure>\n\n\n\n<p>This lightning effect randomly selects two points on the surface of a Static Mesh and creates a lightning strike between those points. The great thing about this is that with a single effect, you can generate lightning for any Mesh automatically.<\/p>\n\n\n\n<p>The fundamental mechanism is shown in the image below, where two points on the Mesh are connected with a Ribbon Renderer. Let\u2019s walk through the details of that.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"513\" src=\"https:\/\/heyyocg.link\/wp-content\/uploads\/2024\/08\/image-32-1024x513.png\" alt=\"\" class=\"wp-image-1429\" srcset=\"https:\/\/heyyocg.link\/wp-content\/uploads\/2024\/08\/image-32-1024x513.png 1024w, https:\/\/heyyocg.link\/wp-content\/uploads\/2024\/08\/image-32-300x150.png 300w, https:\/\/heyyocg.link\/wp-content\/uploads\/2024\/08\/image-32-768x385.png 768w, https:\/\/heyyocg.link\/wp-content\/uploads\/2024\/08\/image-32.png 1293w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Overall Flow<\/h2>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"653\" height=\"545\" src=\"https:\/\/heyyocg.link\/wp-content\/uploads\/2024\/08\/image-40.png\" alt=\"\" class=\"wp-image-1427\" srcset=\"https:\/\/heyyocg.link\/wp-content\/uploads\/2024\/08\/image-40.png 653w, https:\/\/heyyocg.link\/wp-content\/uploads\/2024\/08\/image-40-300x250.png 300w\" sizes=\"(max-width: 653px) 100vw, 653px\" \/><\/figure>\n\n\n\n<p>The basic setup consists of two Emitters. In the &#8220;Anchor&#8221; Emitter, the positions and normals of two points on the Static Mesh are retrieved, and the &#8220;Thunder&#8221; Emitter uses a Particle Attribute Reader to read and process this information.<\/p>\n\n\n\n<p>The key part where normalization comes into play is when we use the Ribbon Renderer to connect the two points.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Ribbon (Particles) Placement<\/h2>\n\n\n\n<p>The Ribbon Renderer connects particles based on their RibbonLinkOrder, which defines the order in which the particles are connected. So, the key here is how to place the particles.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"537\" src=\"https:\/\/heyyocg.link\/wp-content\/uploads\/2024\/08\/image-34-1024x537.png\" alt=\"\" class=\"wp-image-1406\" srcset=\"https:\/\/heyyocg.link\/wp-content\/uploads\/2024\/08\/image-34-1024x537.png 1024w, https:\/\/heyyocg.link\/wp-content\/uploads\/2024\/08\/image-34-300x157.png 300w, https:\/\/heyyocg.link\/wp-content\/uploads\/2024\/08\/image-34-768x403.png 768w, https:\/\/heyyocg.link\/wp-content\/uploads\/2024\/08\/image-34.png 1344w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>In the &#8220;Anchor&#8221; Emitter, we use the StaticMeshLocation to retrieve the position and normal of two points on the Mesh and create attributes for the start and end positions and normals.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"981\" height=\"649\" src=\"https:\/\/heyyocg.link\/wp-content\/uploads\/2024\/08\/image-35.png\" alt=\"\" class=\"wp-image-1407\" srcset=\"https:\/\/heyyocg.link\/wp-content\/uploads\/2024\/08\/image-35.png 981w, https:\/\/heyyocg.link\/wp-content\/uploads\/2024\/08\/image-35-300x198.png 300w, https:\/\/heyyocg.link\/wp-content\/uploads\/2024\/08\/image-35-768x508.png 768w\" sizes=\"(max-width: 981px) 100vw, 981px\" \/><\/figure>\n\n\n\n<p>These attributes are read by the Thunder Emitter via the Particle Attribute Reader.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"779\" height=\"329\" src=\"https:\/\/heyyocg.link\/wp-content\/uploads\/2024\/08\/image-36.png\" alt=\"\" class=\"wp-image-1408\" srcset=\"https:\/\/heyyocg.link\/wp-content\/uploads\/2024\/08\/image-36.png 779w, https:\/\/heyyocg.link\/wp-content\/uploads\/2024\/08\/image-36-300x127.png 300w, https:\/\/heyyocg.link\/wp-content\/uploads\/2024\/08\/image-36-768x324.png 768w\" sizes=\"(max-width: 779px) 100vw, 779px\" \/><\/figure>\n\n\n\n<p>The &#8220;Read Anchor Info&#8221; is a Scratch Pad Module, and its purpose is simply to retrieve the Start\/End Position and Start\/End Normal from the Anchor and store them in the emitter&#8217;s attributes. Additionally, we also create a &#8220;Distance&#8221; attribute to store the distance between the start and end points.<\/p>\n\n\n\n<p>We also wanted to specify the overall lifetime of the lightning, so we read the lifetime from the Anchor Emitter.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"541\" src=\"https:\/\/heyyocg.link\/wp-content\/uploads\/2024\/08\/image-33-1024x541.png\" alt=\"\" class=\"wp-image-1404\" srcset=\"https:\/\/heyyocg.link\/wp-content\/uploads\/2024\/08\/image-33-1024x541.png 1024w, https:\/\/heyyocg.link\/wp-content\/uploads\/2024\/08\/image-33-300x159.png 300w, https:\/\/heyyocg.link\/wp-content\/uploads\/2024\/08\/image-33-768x406.png 768w, https:\/\/heyyocg.link\/wp-content\/uploads\/2024\/08\/image-33.png 1334w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>Now, let&#8217;s get into the particle placement process, starting with the explanation of the RibbonLinkOrder attribute.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1003\" height=\"775\" src=\"https:\/\/heyyocg.link\/wp-content\/uploads\/2024\/08\/image-37.png\" alt=\"\" class=\"wp-image-1410\" srcset=\"https:\/\/heyyocg.link\/wp-content\/uploads\/2024\/08\/image-37.png 1003w, https:\/\/heyyocg.link\/wp-content\/uploads\/2024\/08\/image-37-300x232.png 300w, https:\/\/heyyocg.link\/wp-content\/uploads\/2024\/08\/image-37-768x593.png 768w\" sizes=\"(max-width: 1003px) 100vw, 1003px\" \/><\/figure>\n\n\n\n<p>RibbonLinkOrder defines the order in which particles are connected by the Ribbon Renderer. The value is set between 0 and 1, and particles are connected based on their order, with lower values connected first.<\/p>\n\n\n\n<p>Here, we set RibbonLinkOrder to use the normalized Exec Index value.<\/p>\n\n\n\n<p>Normalization is involved here!<\/p>\n\n\n\n<p>The Exec Index is the index assigned to each particle when it\u2019s spawned (e.g., 0, 1, 2, etc., depending on the spawn order). Normalizing this Exec Index gives us a range of 0 to 1, which allows us to connect the particles in order of their spawn.<\/p>\n\n\n\n<p>By normalizing the Exec Index, we can effectively connect the particles in sequence using RibbonLinkOrder.<\/p>\n\n\n\n<p>Next, we\u2019ll use this to actually place the Ribbon.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"568\" src=\"https:\/\/heyyocg.link\/wp-content\/uploads\/2024\/08\/image-31-1024x568-1.png\" alt=\"\" class=\"wp-image-1413\" srcset=\"https:\/\/heyyocg.link\/wp-content\/uploads\/2024\/08\/image-31-1024x568-1.png 1024w, https:\/\/heyyocg.link\/wp-content\/uploads\/2024\/08\/image-31-1024x568-1-300x166.png 300w, https:\/\/heyyocg.link\/wp-content\/uploads\/2024\/08\/image-31-1024x568-1-768x426.png 768w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>When placing the Ribbon, simply connecting the two points obtained from the Mesh with a straight line will cause the Ribbon to intersect with the Mesh. Therefore, we need to keep the two points on the Mesh fixed and adjust the placement to avoid the Ribbon intersecting with the Mesh, by &#8220;inflating&#8221; the area between them.<\/p>\n\n\n\n<p>To do this, we create a curve from the Ribbon Link Order and set a coefficient that controls how much the Ribbon will inflate.<\/p>\n\n\n\n<p><img decoding=\"async\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAj0AAAD8CAIAAAAT2IJuAAAgAElEQVR4Aey9B3gbx5k\/zCv53\/0vudzlvu++x1azJW4BdrEoC2AbOkgAJEiCvYC99957kdhFUiLVzKJKUZRIdas5jm0lsePEJYlrHMeRZMuxZcuWZDu5XKo\/k2ttEBawgSQk7Tx8yNnZmXfe+b3D\/e28MzvjEZajk\/CBR4BHgEeAR4BHYH4IqNXq0NDQjIyMqqqqvLy8yMhIg8Ewv6ILy4XjOIIg3\/nOd\/7j74MHz1sLA5LPzSPAI8AjwCMgkchkMrlcLpPJlg8MqVQqnwyKvw88by0f5rxkHgEeAR4BHgHXI8Dzlusx5SXyCPAI8AjwCCwfAjxvLR+2vGQeAR4BHgEeAdcjMMFbj\/KBR4BHgEeAR4BH4B5BYIK3PPnAI3AXgbVr196N8n95BHgEeATcEYEJ3gL4wCNwF4G1a9fejc7wF0VRmUyGLzBgGAZB0Azi+CQeAR4BHoGFI8Dz1sIxu69LOOEtlrQ2btz48ELC+vXrURTFMAwEwfsaOb5xPAI8AiuEAM9bKwT0vVKNE96SSqULJS2W4NavXy8Wi3neulf6AK8nj4CbI+AK3gIBgQKRBhHyBLU8Rbv6P8kaWTQjMstAAe+bWnD3c8JbOI4vZKD1d3n58daCLcEX4BHgEZgFARfwlthXTpWbmHofVZNVtdk9fhp9mVofIs8gJNFZGs4nz4zAnLz1KLguaDPuWyZdv3Ht31GT0wuet2aGm0\/lEeARWDgCS+UtsQVnuUqzxd\/UHmruCDN3hHm1BWu2+LPphtZA7\/ZQbfPEpbY5gM1gag\/VtwSqNlu920PYFPa3rsXGZlZv8TO2BZs7wrzbQrTNAaxwbXMAVxdX0NQeqmsO0DYHeLeHmDrCjBNV+3H0SRZ6CQmeuhbQL+bkLYTeWP6SKf97BlD2yHSqWrt2rc0WODC0Ny4+Yd26dVwGnrcWYAM+K48Aj4BTBJbEWwI5MjHMmhxjRe9Ke\/Xd119+46eXX\/jBpRefLDpQrd08wVUjz4699u4bmY8VMQ0+uftLb9z+6CevvPDDnz178JkRc3PI4y9f\/MlrL757472fvvmz77\/wg4Jd5T\/\/9asJ2zIyBosu\/fzJyy\/\/4Lsvfq\/+WGvi7uzXr7+Z2ZtP11lUm63Ru9J+fu1Vtsjjl89n9BW2nNj6wzd+dPmlH5z98fnUx\/LV3MivyRePYUDkbw5DCIJ0Op3ZbDaZTHq9XiQSwTCs0WgAAMBxnKIoDi4cx2ma5i7njEgkEqPRaDKZCIKYLbNcLidJcra7EASxEkwmk0ajEQqFMAzrdCu64HNu3mI2Vv7cUvCMEcIneGvdunVSmcxgMGq1WlbhvPyCtPSMktKyRx75G7FhGCYUCv38\/EyTgUXeZDLNBgWXjiDIFM4TiURGo5E1GZdtoREEQVioGYaBYXihxfn8PAI8AquIwAy8JRAIAgMDw6aFwMBABEEcdZVGUNzIZoK3rr6WWpSmi\/PqG9197OK4uTrIqzXozetv\/fLKL2t7G6kyU+7+0nfefSc8IzK9MfvlN34aXhrj1xoRV5f8g5d+mFmWTUfrgvMjXnjlxbjypNPPPr7naL860lDeW3PozOGsnoLXrr4elBCM52m\/5q0rr6aXZFARGipW55Nj+9HrP27r7\/RK9Oke7i3qLKdKvTnFqGIvISni1EZRtKenp7KyMicnp7y8PC4uTiQSxcTEAAAQGxtbVFTE5YyOji4rK+MunUdEIlF+fn5xcXF+fn5NTY1KpZoxf3x8fF5e3oy3AAAQiUQDAwOFhYV5eXlVVVWBgYEoiiYkJMyWfznSF8pbAQG2XXv6j46NHxs73tbRmZqWXlRcnJuXZ7ZY1q79myMRwzC5XH7+\/PmcyZCcnKzVakdHR+dsgq+vr91uFwqFXM7w8PDm5mbWZFzigiIgCObk5FRUVOTn59fW1np7ey+oOJ+ZR4BHYOkICIVCrVYrkUgcRZEkqVarHVNmjM\/AWyKRqKqqavu0UFNTI5VKHaUQ2QaOHljeyizNCq63H3h65Mjpo0yiofBg5dvv\/mrw8NDB8UNeFQG5+0uvvn+1prtu+4ldP\/nFiyp\/raJYH9Wb+sPXnovMjJYX6pN2Zb\/wyotFLSXPvvqjoMRQNF6pb7AF1dhDy6JeeefVKby1b2Rv17HtFcMNAR1RY8+evPDUxbqBzfHbMlQZXvJ8narJl9WNqfdBdX+DBkXR7u5ullesVmt9fb1SqWTpKi4urre3t7S0NDs7WyAQxMTE7Nixo6SkJDs7G0EQoVBot9srKytTUlKEQqHRaMzLyysoKCgqKpJIJD4+Ps3NzRiGwTCclpZWV1eHIEhERERBQUFkZCQIgrGxsZWVlW1tbWxdISEhlZWVSUlJYrFYpVKVl5cnJycbjcb+\/n5WSEpKSm5urkQiqaysBABAJpOlpKRUV1fHx8ezQ8PMzMyqqqrg4GBHiyw9viDe+uqLxOGRI61t7RaLjy0waHz8xPDIESGCrF+\/fs2aNZyT8OGHH2Z56\/jx45yGJEmyvKVUKjMzMysrK+12OwAAJElmZWVVV1fb7XaZTLZ58+aBgYHAwEC2IMMw3d3du3fvNhgMJpOppKQkPj5eJpNZLJbKysqCggK9Xq9UKgsKCtLT08vLyyMjI9PS0qqqqhyHuTRNHzp0CMdxCIIiIyPDwsI0Gk16ejoAAGazOTIyUqPRsBax2+2RkZEwDEul0rS0NJFIpNPpSkpKSktLjUYj1xY+wiPAI7BQBORyeV1dXVlZGYZhbFmVStXa2urkzZ7NlpqaOgNvgSBoNpubm5sdmaulpcXX13fK16NkkdcU3nrjl2++cfXN51\/\/cUxevCBUdvali+cunw\/LiHr6x88ElkZmD5Xc+OTGS6++9Na1X55\/5oLAS8zUWaJ3Zzz7xo8is6KJcq+UgfwXXnmxtL3i+dd+bImyEpUT8ul6n6htya9de2MKbw2PH+7s78prLiSy9D5t4dmb80bPHH3u9ecL91aqGr8mLVY91Pg3umV5KzMzMzY2tqmpKTMzUy6XDw0NAQCQkJDQ3t6u0+m2bNkSGxsbFxfX1dWl0+kaGxvj4+N9fX23bNmi0+lqamqio6PDw8O7u7vVanVtbW1sbGxSUlJxcTELq06nGx4exjCssrIyIyMDx3GNRtPb26vX6ysqKoqLixmG6e3tNRgMVVVVNpvNx8dn\/\/79NE3LZLLBwcHNk6G7u9vHx0ehUIyOjrIWSU1N1Wq1AwMDarXabreXl5cbDIbOzk6BQLDQHuMk\/4J4y2Qynzp91mAwPvzww2vWrElITDpx6oxMNsOyQ5a3zp49a58MWq2WpunR0VEEQXJyctLS0tRq9fbt2\/38\/EJCQqKjo7Va7cjIiEqlSk5OrqysVCgUrM5CobC0tDQ\/Px\/DMLvd3tnZSUyGoaEhLy+vyMjI0tLSgICAI0eOaLXauLi4HTt22Gy2zMzMhoYGrtVBQUHbt2\/nBKIo6ufn19nZCQBAVFRUSUmJ1WplLWIwGNra2lAUDQgIqKmpkclkra2tfn5+Vqt18+bN3P8bJ5mP8AjwCMwTARiGw8PDh4eH2VdzuVze0dHx2GOP6fV65xJyc3Nn4C0AAEAQDAoKam9vZ6mro6MjLCxsCmlNvBrnG6fwVkJe0iYS+m\/04Q06wLvO9v6nv7l6\/drb1371wc0PsmvzcodK3r76tiZIb4r2ee7F51LqM9SN1um8ld2Y9\/TLl5Pyk+lqk31X2sEfHCkfqXv93TeCE0Pk+Tr1Fr+J+a0rr4anRAD+ImGkPKA2Yselx3w7I5h8r95DO4bG9hmrbZxiTIMPqv+78VZPT09HRwf7Ih8TE4PjOMtbnJ8wPDy8s7OT8xOGhoZ2dHRkZ2enpqYCABAUFNTW1hYWFlZXVwcAQGpqamFhYUpKCudj1Gg0IyMjGIYVFxeHhIQAAJCSksKyGusnTE9PHxkZaW5uHhoayszM9PX1ZR+jrJ8wJiYmKiqqoaGhvLxcrVazgxKRSBQSEpKXlzc6OhoQEODn57djx460tDQcx53beKF3F8Rber3h9JnHvb1NLG8lp6SeOHlaLBY7jrTYOMtb586dy5oMZrOZ5S2lUllaWmo2mwEASE5OLi4ulkqlUVFRXzHTiRMnLBZLZGRkXl6eSPQ3T29OTk5ycjI7VKqqqgIAIDQ0tLm5mR2rlZWVxcbGsgb19vauqqoiCMLLy2vv3r0cFMHBwd3d3ewlOBmm8xZHbK2trQaDoaysLCQkxGKx9Pf3t7W1tbe39\/X1zcehwVXKR3gEeASmI2C328+ePVtdXd3R0XHw4MH5zHkDADAzbwEAIBAIoqOjOzs7u7q64uLiZnypx+NUHD2wfsKQpFBJpopdrFF\/vPX6zfcj0u1BmWGHTh0+cPRgzo7Ct6++bUry9W0K\/cEbzxbVF+O5mum8FZwX0TPed+n7390y0n76hcf3njwQU5v0yjuvdu3qrju4uW6spfBg1c+vvLLtse11BzbXjjVnDRVffOm7hx4f6TzT+72fP93Q3SRLYJi7Qy663IQwX49DAQBw9BP6+fk1NTWpVCr2MRcXF1dWVgZBUHR0dHt7e3R0dFVVFQRBUVFRbW1tqampubm57GVDQwPHWyxj+fv7b968GUEQ1iXY0tLiyFuJiYllZWUgCCYnJ+fn58fFxbW3t6vVaq1WK5VKfXx8ON5i\/YQAABiNxqqqKj8\/v9HRUYFAkJ6e3tDQ4O\/vv2\/fvoCAALlcbjAYEhMTDxw44PhMn94tFpqyIN7asGHDvv0Hevt2+vn5R0RGnrv4xK7HBjZu3DjhJJyfn1Aul5eWlvr5+YEgmJuby7rg2BHP0aNHWd7Kz893bON03goICOjq6oJhmPW42u32KbxlMBgOHDjAQaFWqw8ePMgu9wgODg4NDfX29u7p6QFBkO0DVquV462wsLCqqqodO3ZgGGY0Gjs6Okwmk0qlYhhmxn8KrhY+wiPAIzAfBGJjY0+cOLFv3z5\/f\/\/55HfGWwAAIAgSHR0dFxc3ZTkGJxrRiDmPXEB39LZTu0hfhl06odpsLRttaB\/a+pByA56vTd2ZX79zsyXdv3dslzyYVlf5NJ\/oismJEyUQAT0xLaNbNaEGotwrZHtC28EuKkprrAkoH6jr3ru9emudNtpLk23uObGz+7Ft2wZ723Z3xtUkdxzp6enfvm2wt2Vnu19hSFhL3Ja97V1D24qaSxUhjCSD+Xp+q8mqSNbA4r950hx5y2g01tfXG41Gjrc6OjpiY2Obm5tDQ0Ojo6O7urpiY2O3bNkSHh6u1+sbGhoSEhLq6+v9\/f2n8JZYLC4vL09PT4+Pj29qajIajY68xTBMR0dHfHx8XV1dUVGRQqFoaWmJnwwKhcKRtwYGBhITE2NiYvLy8nJycnQ6HctbKSkprH\/y4MGDISEhYWFhFRUViYmJ27dvnzLpyFlncZEF8dbDDz9sMBq3dvccHhk9eOhwQ+PmguLiuPiE8PCIsPAIVCTiBl6zzW8JBIK4uLiioqK4uLi2tjZfX9+8vLzi4uKv1mIcO3bMarX6+\/s3NjZ6eXlxzZnOWxKJpK2tLTk5OScnJysry9fX1zlvgSBYWVmZm5sbFxdXVVXl4+ODYVhPT09cXFxNTU1lZaUjb2EYtn\/\/fnaFjkgkKi0tTUtLi4mJCQoKmu6B4JTkIzwCPALzRyAgIGBBy6NmHW+xVcKTYbbqQQjEo2luyEVVm9AEgqw2cSnSLLUk4+sxmSxPK05nlGVGSQZD11mYBh8smVIU6VWbrUSltziVZte4K0uNkkwVXWehai2SDEaUREqz1FSNmRWOJhBoAoGlUMpSI5o4EZ+4TKWpGrOyzIil0qIkUparoe+uzqfKTahBAjhsjAfDcEBAADszIZFILBYLjuOsN4+iqMDAwNDQ0KCgIBiGHS\/ZFd7e3t4RERFWqxWGYZIkWe+WWq02Go0gCBIEERoaGhERwfpnBQKB0Whk18SDIOjj4xMREWGz2QwGAwAAer0+IiIiODhYKpXiOG6z2QAAgGE4JCQkYjKEhoaSJImiaGRkJAAASqUyPDw8MDAwJCSEJEmJRBIUFGS32+c5rJ7NgtPTF8pba9auRVBUq9WpVOpHH90oEAjyC4uKS0rt9ujComJH3kJRlF15wVbKNU0sFgcEBERGRnp7e0MQpFKpwsPDAwICQkNDFQqFWCwODAx09MjpdDq1Wg2CIEVRXPNpmmbxVCqVYrGYNahUKjWZTCiKSiSSsLAwx8ZiGBYcHBwREWEymdhhk9lsDg8Pt9lsXl5ecrmctQhbJCgoiPsiQqlUhoWFhYeHG41GnrccIeXjPAIrhsAcvDWnHhAC4Xaac8pxjOUOEbrKjHnLQNiBteZszwOfYW7eojeWv2zKf2rm747XrVsXEhoWGhYukUrbO7oceYvfn\/CB71w8ADwCrkFgqbw1oQUIImpMma6l677+BnmVSavRlyr1lkVQEMJ\/T7rgXjInbz0Kr4vYRgQ2yTds+tvnWRw\/Pfzww0qlsqNj6779B3V6PZc+5dvhBavFF+AR4BHgEbiLgCt4664s\/u99gMCcvMVR0YIiPG\/dB32DbwKPgJsgwPOWmxjCXdTgectdLMHrwSPAIzALAjxvzQLMg5rshLcWff7Whg0b+PO3HtQOxbebR8D1CPC85XpM72mJTngLQRAcxzdt2rQgD+H69etFIhHvJ7ynewWvPI+AWyHA85ZbmWP1lXHCW+xX2zKZTLGQIJfLMQzjl4yvvml5DXgE7hcEJnhrEx94BO4isHbt2rtR\/i+PAI8Aj4A7IjDBWxs2bFg\/e1g3GdauXbtmMny1tQ8f7mME1qxZcx+3jm8ajwCPwH2AwNd+Qk9Pz42zhEcffZQlNvY4pftloMm3Y2YEnPsJ2TKbNm3auHHjI488smHDhpml8Kk8AjwCPALLhgDPW8sG7b0peD68xZLWunXrHn744XuzlbzWPAI8AvcwAjxv3cPGWw7Ved5aDlR5mTwCPAIuRIDnLReCeT+I4nnrfrAi3wYegfsaAZ637mvzLrxxS+EtBPEkiE1a7SaddhNFbRJjnguvny\/BI8AjwCMwBwI8b80B0IN2e3G8RZKbSks8D+wHz54Bvvek59NPeZ57HBg5DDY2eBoMGx80DPn28gjwCCwrAjxvLSu8957wxfFWeytw82P4y78Kp\/x8\/hk8fAgQifiB173XE3iNeQTcFoGV4C2hUFheXn7gwIGBgYE9e\/bk5uYWFBT4+fnNCUpcXJxMJgMAQCqV1tTUDA4O9vT0WCyWOQvyGRaNwDx5a8OGDY7fRQw8Bv7pj4IppDVx+Rfhk09AM\/KWUqns7u4eHBysr6+nKGrRCnMFk5KS9uzZExQUxKXMGMEwbO\/evQOTobe3Nzw8vLe3d8acjokikSgoKEgkEjkm8nEeAR6BVUFgSbyVk5OzfVro6uqKjo52bIxQKKytrQ0ICGATURQtLy8PDAxk9w3CcVwqlcLwxFlZIpGIu8QwbHh42Gq1IghSXl6ekpICAIC3t3dDQwNJkuzh9BAEYRiGIIh0MrD74LHH1+I4DsMwBEFisRjHcf6J42gRJ\/HF8ZZBv2ln34Y3Xwdu3BDc\/Hji56Mbgiu\/gg4feiTAfyMETa1QKBQ+9thjgYGBMAynpKRkZmZiGMa+owgEAgzDhEIhjuMSiQSbDOw2UTKZDIIggUDAHhKNIAgnF8Ow\/v7+wMBACIKEQqFMJsNxHEVRCIIkEolUKuU6wFc7\/I6MjHAFZTLZ4ODg5ClyIIZhOI6LxWL2ku05EokEBEGdTtfZ2anRaEDw62xcp+VE8REeAR6B+SMglUpTUlIsFgu3CZxAIIiKioqLi3MuRCKRLIm3\/Pz82tvbpzBXfX290Wh0rJjlrZiYGJIkCYIQi8Usb6EoWllZuXnz5qampqCgIIFAUFJSsnnz5tbWVpvNFhsb+\/jjj9fV1VksloaGBvakdhRFTSaTxWLZtm2bQCCQy+VVVVUxMTF9fX3l5eXR0dElJSVBQUEoih44cECpVBqNxrq6uqampvr6esfHnKN6fNwRgcXxVtdWz9OnNtbXeRbkeVaWb6yu3FhY4FlV6XlkZOOhA5uk0k2OVQAAYDAYdu3axSYqlUpvb29fX9+9e\/cCAODn51dWVhYUFHTs2LG8vLzExMTKykqSJMVi8e7du3Ecj4yMbGhoaGpqKioqYt9RAABISEg4depUeXk5QRBJSUlNTU2NjY15eXl6vb6zs7O6ujosLIytTiwWHzlyhJwMMplMLpezvMUwTG1tbVNT05YtW2ialsvlbOdsa2vDcbyoqGh0dDQ9PV0ulzdNhoaGBu5VbErr+EseAR6BORGQSCRVVVX9\/f3+\/v4AACAIkpCQcODAAXaI4qR4XV3dkngLBMHAwEBH6mptbbVYLFNOZBcKhXV1dfX19RkZGUlJSSRJsrzl7+\/f19cnFAptNltFRQWO4ykpKVartbKyMi8vD0GQAwcOGAwGlUpVU1ND0zTXEpVKNYW3duzYwb6MR0dHZ2ZmBgYGbtmyRSgU5ufnt7a22u32kZERb29vTgIfmQ2BxfFWYsKms2c833kb+OQj6PZN6PYn0Ccfgdeugt970rO4yFMgmDq\/ZbVaOzs7HXUwmUxTeGtsbEwgEKAoWlVVZbFYYmNjy8rKlEplW1tbQUFBVFTU\/v37VSoVJ2TPnj1sb2ltbSUIAsOw6urqxMTErq4uhmG4bCxvZUyGkJAQiqJY3kpISCgsLIRhOCsrq6ysTCaTxcTE+Pn57d6922azKZXKlpYWgiBkMtnBgwdDQ0NtNpvZbJ7S1bla+AiPAI\/AnAiQJNnU1DQ0NGSz2RISEvbu3Zufn49hmPOCZrN5SbwFAAAEQaGhoZ2dndu3b29vb59OWgAAsOOtuLg4hmEoipJIJCxvxcfH19fXAwCg1+tra2u9vb23bt2amJhYV1dXWFjIjpkMBoNSqXQcb5knwxTe6unpYR1BXl5eBQUFra2tAQEBrEOyuro6IiIiOTnZJZMozgG9D+4ujrfqa8FDBx5p3ryhqHBjViaQlQnk521sqH9ksH\/Dtm5PqWSG8dbOnTtZuNjxlo+Pz759+xzHW8PDw2yG2NjY1NTUXbt26fV6jUbT0tKSkZERERERFxeH4ziHOctbJpOptrZWLBYLhcKcydDW1qZUKrlsLG8xk0EulysUCpa3cnJyEhMTAQAICQnp6OiwWCz19fVxcXG7du0KDw\/neAuCIKvVmpSUVFFRERoayvMWBywf4RFYBAJKpXLLli1jY2OHDx8uKCiQSCTzEbJU3mLHd9HR0W1tbf7+\/pyn0rHu2ea3tFrtgQMHMAyLiooqKSmJj4\/v6+sTi8UFBQUlJSUoiu7du9dsNsMwXF5enpycDACAl5dXXV2dVqvds2ePWCxmGGbr1q0xMTEcb2EYVlpaunfvXnb6ISUlpaCgAEEQdmbCUSs+PiMCi+Ot1hbPTz6Gbn06Ma314QcTPx\/dEHz6ieDzO\/CREWD6eIud37LZbDAMJycnZ2Rk0DR94sQJBEHsdntDQ0NQUBDHWwqFYvv27YODgxAESaXShoYGm80mEAjUarUjbbC8JZfLu7q61Gq1RCLZsmVLZGTkdN6acX4rIiKipqYGQZDKysr0yVBUVITj+I4dOyIiIljeomnaYDA0NDSgKGq328vLy3nn84y9iE\/kEZg\/AiKRqKysLC0tbf7\/TS7gLQAAYBhm58Bn1FUoFJaVlVmtVvYugiCFhYXsesKEhIShoaGOjg69Xs9OYOzevbuzszM3N1ckEqWmpvb19TEMI5VKa2trh4aGenp6TCYTAACxsbH79u3r6emprKyMiIhoaWnhJt7j4+Pz8vKEQiEAAAqFgl2I2NnZiaLojOrxiY4ILI63VKpNuTnrTx5\/5BdvAB9\/CN+8Af\/qLeDShUcrK9ZrtRuFwql+QgAAlEplT0\/P4OBgbW0tSZIAAOTn5w8NDXV2dhYXF\/v7+\/f393OK1dbWxsfHs5fe3t7d3d0DAwNVVVWsldn0np4erVYLAIDVat21a1d\/f398fDw7WFcoFJwoDMPYARabIpVK+\/r6AAAQi8UlJSVDQ0N1dXUCgUCv1z\/22GPd3d3bt2+32+0ikaiqqqq8vFwqlZaWlh46dKivr8\/Hx4cTy0d4BHgEVgwB1\/DWiqnLV7TcCCyOt3b2AT\/+0aadOx4tK\/VMSwNSU4GiQs\/uro3PPLXx5HFAMs1PuNyt4OXzCPAI3McI8Lx1Hxt3MU1bHG8FB206dBD42cue164CNz+CPrkJvfcu+PqrwKkTQHKSJwguRhO+DI8AjwCPwIwI8Lw1IywPbuLieAsAAJnM08+6KTJyU0K8Z2ICYI\/yDLRtIoipKzIeXGT5lvMI8Ai4CAGet1wE5P0iZtG8db8AwLeDR4BHwN0R4HnL3S20wvrxvLXCgPPV8QjwCCwUAZ63ForYMub39PTcuHGVd09fed5yh1Yvo1F50TwCPAKuRoDnLVcjugR5GzZsWLNmjafnDKvGlyB1YUVXnrceeeSRNWvWbNrEz4QtzFJ8bh6BBxYBnrfcyPT3Cm95enpu2rRp48aNjz766NLh43lr6RjyEngEHigEJnhr3WRY6zSsuRvYzPzv5UBg7dq1a9asWQ7J85e58gqwrV67du38leRz8gjwCDzICCx4vLVh9rB+\/fp169axj6FHHnnkgeJ\/lzTW+XjLEwQ9IYHLfkABADj7rsoThFxWFyTwBOHZquPHWy7pPLwQHoEHBwGet9zI1k5461Gh7Fs+9R7ZP\/MouuKan7Rn\/0uXtWmCvWYIG0T0vwZu88j7hWvqKrrikfy9\/4+K9JyJKXnemsEAfBKPAI\/A7AjwvDU7Nit+Zzbe2gQh\/+7b5DIKcWC+72hSp7fyEUT+b6H9rq+u8Nf\/L\/H1IViOlfK85YgGH+cR4BGYEwGet+aEaOUyzMZbj6JKj6yXXU8kRVc80p+f3rw1ZIFRUjoAACAASURBVIhHzivLUd0\/J5yfXh3PW9Mx4VN4BHgEnCBwT\/IWBEEGgyErKysuLm6e57U4gcB9bs3KWyJqOViElTm9+WsYu7Pqyq56lCzSV\/nPWS9Mr47nremY8Ck8AjwCThC4J3mLbQ8IghkZGfv37w8ICHA8h8lJa938lvvz1j8WX1Ee+OiRrvedEZuDH3JKNp633LwH8urxCNwTCNzDvMWepJyZmTk6Omq322c8svKesAGn5JJ4q\/Tqut4Pmn5w54Xrf3jmyv9mP3H7v9qvexTPPTDiaucis463iq\/89\/YPCi\/d8h29+S91707hpPlc8rzFgcxHeAR4BBaNwL3NW+zxg11dXePj4+x5kosGYokFCwsLiyYDe3Shr68ve1lUVFRYWDhP4UvhrUe2vn\/+yu\/fuvnHfT\/97bHXfnft9p96XvriP+bBLtN1m423\/nPze5nnPi28dCv3wi3Fng\/\/uezqfLjKMY+b8FZ4eLhcLp\/ecD6FR4BH4J5A4J7nLRAEk5OTz58\/\/9hjj8EwvFqg37p167PPPrt161ZGRgYAAMHBwZcvX\/5sMty+fXueWi2et4qvJB27+fFv\/xI9etOj\/Nq36t7d8r07H3z+Z0n3bxxpY8b4dN1m463\/anoP7\/1N4aVb4aMfP9px\/W+8VXrVo\/5dj83veZTOwWQL5S0cxwsLC2tra+smQ21tbV5eHk3T03VeUMrIyEhAQMD0IhKJRK\/Xz\/+w8OkSFpoCQZBMJpvTVYAgCIZhLnGGy2Qy\/eyBPVt8oa2Ynl8gEEgkEoIgVCqVVquVy+UuUX56RYtLEQqFJEkqlUrnTwyhUEhRFEmSjsdqL67G6aUgCMJxfE4dphfkUwAAuPd4SywWBwcHJ04GPz8\/AAC8vb1HR0effvppm83GGtVsNickJCQmJoaHh8tkshWw9O3bt5977rnw8HD2SHihUDgwMPDFZLhz5848FVg8b1VczX\/qzi9v\/smz9TpLTrZ9H33w+Z+Vwx\/PyFWOidN1m423PIqu\/FPJlcJLtwwDH7ISnr3y+7FXflt08daz1\/\/w7G\/+8Oy1\/61+8rZH03uO8h3jC+UtoVBoNBotFsu2bduam5stFovBYBCJRNN1XlDKbLxlMplqamooilqQtMVlBkGQJMmkpKSWlhaDweBECAzDUVFRVVVVgYGBKIo6yTmfW\/Hx8QcOHDg0SxgYGCgrK1s0AhKJhP3Xq6io6Ojo2Llz59DQ0P79+7OysuZ89EMQ5OXlZTQaMQybT0MWlwfDMJvNVlVVtWvXrtraWoIgnMhRq9VtbW07d+4sLS21Wq1LB5+rC8Mwu93e0dHR29ublZXFPjS4u3xkTgTuPd4yGAxhYWEYhsEwzL6oymSyffv2Xb58uaGhgW0wBEEwDCMIYrPZrFYrh4JUKo2NjVWpVFwKAAA2my0yMtIxZRHx27dvX7hwgXupbGhouHPnzsrxVuW1gmfuvP7RHzc2f80ZfkM3rn\/2Z+LI8vLWl19++c6tP7U8+9krN\/74wvU\/3PztX\/7w57\/u+ulvPWpnnv1aKG9xhmhqaiopKeEu5XJ5T0\/PqVOnmpqalEqlRCI5ffp0RkbG8ePHt23bFhISMjQ0ND4+Hhsbi6JoR0dHbm7u0aNHBwcH2c7A8haCIKmpqceOHTt69GhkZCRFUfv27XvqqafOnTsnEAjMZvPevXuPHj2akJAAQRCCIFlZWePj4wcPHvT19eU0WVxEIpHExsbu2rXr0qVLx48fDwkJ4XrOdIEoihYVFZ07d45tr4+Pj0Aw89fi08tOTwkPD9+2bVvvLGHv3r0XLlxoaGhY0JOU5eDk5OTe3t5Tp049+eSTly5dOnny5KFDh\/r7+\/v6+pKSkubUOSMj48iRI0ePHi0qKloO6gJBUKvV1tbWnj59+oknnhgeHq6urp6Tt5qbm0dGRp544onx8fGSkhKSJJ1YajraM6YIBIKoqKjR0dFz586dOXPmwoULhYWF99O66Blb7drEe4+3jEbjlKksEAT7+\/svX748ODg4BR2VSuXv788l4jje3Ny8a9cudhYKhuHw8PDh4eGcnBwuz+IiHG9hGPbVQ\/aLL764ffv22bNnS0pKXnrppXnKXPx4q\/RqyulPX7nxR6Dl6\/FW4P6P3rr5J+nurwdGjoOeKfHpus1\/vDVFlEfZ1YGXv3jtoz+qdn0w9dbkIkOX8JZQKOzu7i4rK1MoFDU1NXl5eV\/5W86fP5+enk5R1NatW\/v7+wmC8Pf37+\/v1+l0fX19tbW1GIalpqZu3bqVIAiWt7RabVNTk16v9\/f3f+qpp6RSqa+vb2trK8MwIpHo4MGDdrvdx8dn\/\/79JElqNJqhoSFvb++IiIjdu3dPB20+KQKBQKFQREdHb9u27fTp06OjozU1NT4+Ps69VQAASKVSttTZs2fHxsZqa2utVqtYLJ7TwThdKwiChEIhMktgGKa1tfXo0aMRERFzagUAAAiCCoUiLS1tYGDg\/PnzY2NjXV1dubm5ISEher1eoVCIxWIURecUJRKJ+vr6zpw5Mzw8PDY2lp2d7cLBDQAAIpEoMjJyz549Z86c2bZtW3R0NE3TCII4JyEQBFEUValUiYmJu3btOnPmTG9vb2Bg4BI9yd7e3oODg4cOHYqIiPDy8tq5c+fY2Fh8fPycQ9Lp1nxgU+5t3mLfi2NiYo4cOXL58uUzZ87ExMT4+vpyHWsKbwEAoNVqe3p6du3aZTAYwsPDBwcHKysrxWLxEnsAx1uJiYnXr1\/\/7LPPzp49a7FYAACIiIiYp\/DF81bRFe2eD7ue\/\/zhxq\/HW+SOD7qf\/3zD3eHXjCzCJk7XbfG8VXQF2fvRjS\/+HH5w5nGeS3jrq3eOw4cPZ2RkJCQk1NTUVFRU0DR9\/vx5dt6rqKiovLxcKBRKpdK+vr6AgIC+vj7WgaxWq1tbW319fbnxlq+vb1hYWGRk5OXLlw0GA8dbQUFBp06dSkpKSkhIGBwctNlsSqWytbU1KyuLfSJPB815ikAgYBgmPj6+u7v7+PHj7Mu+v7\/\/\/AcWEAQRBBETE9PV1TU2Nnbo0KHa2tqAgACZTOb84etcsSl3QRAMDAw8dOhQa2vrfBzscrm8oqJibGxscHCwoKDA19dXKpUuQh+VSnX06NG+vr7IyMi+vr6xsbGioiKCIBZBzFNaBEEQTdNFRUVHjhw5cOBAdnb2IrygEARpNJqioqKRkZHDhw9nZ2cvWjepVNrc3Hz06NGUlBSWm\/38\/Pbu3btnzx6TybQI6Ka09wG5vLd5SygUJicnnz59+vLd8Pjjj+fk5HBTINN5i6Wubdu27d+\/f9++fZWVlS5ZWsbxll6vHx0dPXv2LDsoBCfDPDvTUnir4NQnX375pbjz6y+rMsZufvnll8Q2V67LmD6\/NZUOS67mXLz1q0\/\/ZBq4MfWW68ZbOp1ueHg4Pj4+cjJ4e3vL5XKOtwoLC0tKSoRCoUQi6evrCwoK4niLYZiWlhY\/Pz+WtwICAtrb21NSUmJiYi5fvmw0GjneCgkJOX78uN1uZ6sgCALDMIvFEhcXV15e3tLSMqfXi7M4BEEMwyQmJvb09Bw9enT\/\/v0VFRV+fn6Le75DEERRVHR0dHt7+5EjRw4fPtzQ0BAcHIzjuKseeTiONzU1DQ8Pm81mrhWzRZKSkkZHR9va2iwWC\/eyOFtmJ+mBgYEXL16srq7GMMxqtXZ3d585c6a5udnPz4\/7X3ZSfLZbIpHIZrNt3br11KlTPT09X5l1KdIkEklUVNTu3btPnDixZcsWX1\/fhY6QEATJzs4+depUfX0954kVCoWpqalHjx5taGiYz7vCbI19oNLvbd4CAADDsK9mki9dunT58uUnn3yyvr7e0VM8I28BAEBRVFNTU2Fhoas6CsdbAADQNK1Wq1kvSnNz8xNPPDHPLrUU3lrf9J7X7g+\/Vfn1ir61je967f7w21XXZuQPx8Tpus1\/vPW9t\/9n+OUvkk9+MvDjL3Y++\/nRn\/\/2N5\/9+egv\/uc\/tsy8NMMl4y2RSNTb25ueno4giEajUalUEonEOW+VlJSgKBodHd3d3a1Wq0dGRmw2W0pKSltbm0wms9vtLG9ZLJauri5vb2+ZTDY8PGyz2TAM8\/f3h2HYbDY3NjYqFAqbzfb444\/P5xkNQRC78mLHjh0nT548cOBAeXm5xWIRi8VL5BiBQEAQRFRUVEdHx\/Hjx48ePdrU1BQUFLSUhzLXDQQCQWJi4vj4eHp6Opc4Y4SiqP7+\/qGhIavVusSBUXp6+lNPPZWamgqCIAzDWq22vr7++PHjBw4cKCoqMpvNC3UbgiCoUqlycnIOHTo0NjZWUVGhVqvn\/7YxY3vZD0b1en1DQ8P4+PjQ0FBqaqrzGTJHOTAMR0REjI+PDwwMTBlakSTZ1NR0\/Pjx+SxgcZT5wMbved5indednZ3PPPPMnj17pjheZuMttgsuvR9z\/eb27dsXL15kl4pAdwMMw6Ojo8u9Dv4fK67CfTPPJ3kUXcGHbng4\/dCKawIXmT9vsesyel\/44s9\/+fJPkz+HX\/vdv3W+P9v3zi7hLQAA1Gp1X1\/fyZMnWSeeVCp1zlvNzc2jo6P79++PiIiAIIgdb6nV6j179oyPjxcUFDzxxBPsGKixsXFkZEQgEAQHB+\/bt+\/EiRPt7e0YhonFYtYhNjIykpiYyGE1WwRF0aioKHblxfj4eGVlpZeX15wTKrNJmzEdgiAMw0JDQ7u6uh5\/\/PGTJ0+y03UzZl5QotlsHh4e7uzsdPIPAoJgTk7OuXPn8vLy5sPiThQQCoUNDQ0XL17k1gODIIggSHx8fH9\/\/8WLF8fHxzs7O\/Py8mJiYry9vZ2PcmQyWXh4eFFR0eDg4IULF4aGhqKjo50XcaLbjLcwDEtOTj548OCFCxd2796dm5v7lWPZ8XV5eimJRBIfHz88PHzq1KmoqKgpLy4gCJrN5oGBgdOnT+fn55MkOV0Cn+KIwP3AWwAA4Dj+lW9h+uDJCW85orD0+O3btz\/77LPb0wKbOE\/5Cx1vfaPs6r93vp\/2+Kf2Yze\/XX1txp+Ci7fCj3\/yrZbr\/zTLx1XTdZuNt\/5P+dXv1F4rvHTLsu\/Gv1Ve+wduM47yqx4t1z0633f591vTdVtoCoqinJ9woWWXkl8mkzU2Nh45cqSmpsZsNs+5MGEpdUkkErvd3tPTc\/Lkyejo6KWIYsviOJ6fn5+ZmelklAPDcHR09ObNm50v4p+PMgiCJCQk1NbWTnlesy7WjIyMvr6+EydOXLhw4fz5801NTTiOOxFrtVqPHTt24cKF4eHh0tJSrVa7xLHgjHXBMMx+NTE6Onrx4sWhoSGj0ThjTjaRYRjWUZyUlDSjPuzM4v79+48dO+a4BNqJzAf51j3JW76+vjPafoohQRA0GAzsN15Tbrn88sSJEydnCSdOnJhndQvjrZIrQN8H7AYWhZduOf+JOfXJQ7Ns+zRdt9l4a0P3+7kXJirKv3hLf+Cjf7nrk3T0OjqPL3q8NV3JeaasFm\/BMKzX6y0Wi0t8d3M2FgRBgiCCgoKmv7rNWXZ6BnYd3Zz\/YiAISqXSObNNlz89BYIgFEVnFAVBkEKh8PHxiYmJycjICA4OdsKm7AY6ycnJ8fHxBoNhiQPB6XpOSRGJRN7e3omJibGxsc6RRxDEYrGYzWYnIz+2z4SEhCx9mdgUPe+\/y3uPt2iattvtgYGB\/nOFgICAr6Yu9Hr9vWK2hfFW8ZXvNL2HD93IPn8r+dQnxI4PZvwpuHgr8cynoj0ffqv23Rndd9PBmY23PEqu4Hs\/mtgv4\/gn\/88sM1juxlswDNvt9kUsIZsOi\/unTPE+ub\/CC9WQdcA7LwWC4Iz857zUUu7Os8Z5Wmee2Zai8H1Q9t7jLYFAoFQqGYZRzRUYhlmmPVqWyfAL4y122\/WKqxs6rhN3N7CYThvmIx8\/1PKekymu6W2ZlbeKrvxj1TXL6MfIjg\/mdAlO18Sj6MrKj7emt45P4RHgEbjXEbj3eOteR9yJ\/ovhraIrHsVX\/nmWuSuPoivfcLoow6PoynR9nPDWhMDqa\/9UPsc+hDOSFs9b06HmU3gEeAQWgQDPW4sAbbmKzM5bpEf+L2cjgyWl5781vTFr6EiPgreXJHaWI7j+Of3Z6dXx50ZOx4RP4RHgEXCCAM9bTsBZ6Vuz8dZGAfZ\/wgaWg0j+1do6vZHrxNpvxBxfjuq+5V02vTqet6ZjwqfwCPAIOEGA5y0n4Kz0rdl4CwCAdVLjv0Ye8sh73WV0kv3Tb4bsehSeYe9tTwB8mAj9RuwJV466Mn7y7YDOTQA0HVOet6ZjwqfwCPAIOEGA5y0n4Kz0LSe85QkAG0TUQ4z9IU2iK34SHqLCHxVIZ2uhJwCuk+geUsW5oq7Eh9QJDxEhG0HhjNXxvDUjLHwijwCPwGwITPDW2nmENQsM8xDJZ5kBgTVr1syQer8nPZitvt+tyrePR2C5EHDH8Rb7PcTdzZIeoL8bN25cv379g9b8TZs2rV+\/HgAA55aesoeW88z83eVGgDeHI8LugIY76OCIybLG3ZG3MAyj+EBRBoNBo9GsOhJqtdpgMKy6Gr6+vquug5tYZNVxoCjKbDavuhparVav16+6GjRNm0ymVVfDHSyyYiC4I285+jSFQqFIJFrhD+AdFVjFOI7jK7NLkPM2oijqkqNenNcy512dTjdnnuXO4CYWWe5mzkc+e9rZfHIuXx4Mw5zvrrR8VTtKZg+XcUxZlbg7WGTFGu7WvGW32wsLC9PS0pRK5Yoh4j4VuclTkuctrku4iUXWr1\/\/0EMPeXp6coqtfMQdnpI8bzna3R0s4qjPssbdkbfEYjG7hVNsbGxJSUlvb29oaOhcmzrdh\/e9vLx0Ot2qN0yn03l7e6+6Gn5+fquugztYRKdQbPrP\/5R+85s4gqjnsdvZMoFmsViWSfL8xer1eqPROP\/8y5RTrVa7Axo+Pj7L1MD5i9VoNGaz2WKxqNXq+ZdaRE535C1Holar1a46VchRrPM4juPFxcUtLS3Z2dncsaTOiyzHXTd5u+fHW5xxV8UiEARZLJba2trGxsYwi+Whf\/u3ox4eP\/Lw0PzLv\/hptT3d3Z2TITY21sle41wTXBVxh7d7frzlaM1Vt4hEIqmtre3r68vPz1\/ursjzlqPpJ+IwDFdUVGRlZXl7e+fm5qalpTk\/N2Fqedddr8pTcrr6PG9xmCy3RUBg4sNsAQAgICgCQQkIyiBQj+PdtbXZERFRXl4+AsGYh8efPTz+4uHxQw+PgP\/+7+r09DijIdbLGEgQeoFAA0MaCFJBEANBNARREERAkByCpCAoBkEUnPiGDp6sBeRatajIqj8l2bPO+fktznqrbhEYhlUqVV5e3lcnrC73CTL3GG8JBIJFDCoXVMTHx+fgwYNWq1Wj0SQnJ7e2tlqt1gVJcFVmLy8vvV7vKmmLluMmfsLVsoIjbouwiFqlUqtUWpVKzzBeDGNiGB+a9qfpQIoKI8kokowliESlMlWhyFLICxXyCjneIMfb5HivHO\/H8YNy\/Lxe91Zc7H6pJPi\/vnP8H\/7hzx4eX07+\/MXD43kPD\/N\/\/ueQAH6eUDynVPxAqbislD+tkD+pkF9SyC8o5Ofk+Ek5PirH98nx3XK8S45vwfFaOV4ql+fJ5RlKRZJSGU8QdoIIJ8lAirLStIlhDAyjnVTbse1T4u7gGeP9hI5GcQeLqFSq\/Pz85ubm5X5w3Xu8tdxLLQMCAg4dOqRSqSiKioqK6ujo8PPzW+5KZ5TvJquuNRqN0WicUcOVTHTbdfAMRelp2sowYSpVjFqVrNFkaTTFWm21TrdZr+s06PsM+iGjYcTLeMrLeNHLeNnL+BMv4ytexje9jG97Ga8Y9e8aDb8x6G\/otZ\/otXd0ms+16s816ttq5hMVfYOmPjIaPvX3O46JQr\/970\/eJS2Wut708PD6v\/93h0L+65CQN3x9niOVP1IqfkIoXiKUPyWUr5DK10nl2xRxnSY\/YqhPVfQdtepzjfpzrfqWTntTr\/3QoH\/PaLhqNLxtNPzCy\/gzL+Oz3l4XvIzHvIwDRkOXwVCt02VpNHa12l+lMtA042Bvs9lM07RDwipE3WQdPMMwbrIOftUtQlFUbm7uli1btFrtsnaIe4y3uEHx8kXUanV\/fz+78t5isdTX16\/WAHy5vVLzxJD3E3JA4TguEYmkIKiF4SChIB1FazDRDqlkTCb7oUL+mlLxDqm8ThK\/ocgbNPkxTX7CULcZ6jOa+oKhfsdQv6PJOzT1MUm8RxHvEMpXCcXzSsXTCvnjcvwYLtsnk+6USjol4gaxqAwT5aBoEoJECYWVwcGD1dV6CBSuXRv5H\/\/xo7vU9QsPj+xvfAMDAINEUhAb21xUZJbJ1BCkgSEdDOth2AjD3gLYKhCECoWxiDANRQpEoipM1CzGtonF\/VLJYZn0lBy\/pMCfVch\/Tih+TShvkMQdekLVLyY1\/5ihfkMRvySUP1LIT+KyPRJJI4ZloWiYUBjOMDgECcEluhs5aBcT4ee3HFFbrceUow4AAMTFxZWXl\/N+QnVjY+NKnlmsVCr7+\/vZOS2r1VpTU0MQxBTbrMwlz1uOOK\/891sgAICTs0E4CFoFgmwU2UUoHyeULyoV71PE\/9DkX1X0X9XMX1XUX1T072jyfZJ4i1S+RCgvK+Tn5fhROT4kk26TiJvE4jKRKBNF41AkVCj0FQj0MExBkBSCUBCEJmtxbOmUuL+\/f2dnJwzDAgCIi40N\/va3f+Th8Y6HR9Y\/\/ZNZrVZIJAAABAYG1tTULO4zOwgAhJNzaTQEmQSC8EmGq8Swbon4KC77oVL+a1L5OU3+haH+qqIm20v\/L0PdVDOvEMqLCnxIOkFmGSgSJBCoYFh8t0UselPa4tpLnrcc8WQYxvFyteIPLm+JxWL6btBqtVarVafT3U1Y9r8ajaa9vb2ioiIsLKyqqqqiokKv1y97rTNVYDQatVrtTHdWNE2r1Xp5ea1olTNVZrVaZ0p2TRpD02qGMTKMj0oVqFbHatSFGk2nVjui1Tyj1fxSrfpEzfyOoe6omBsM9S5NvkGRP6DJEzT1GE1voekimk6g6WCanpgfomk9w2homnGNarSPj09vb29aWlpsbOzAnj1Grdb2zW9mfPObik2b6qqqampqwsPDa2trq6qqXN5RVZOY2Gg6lqZzGbqRpnfS1DGaepoi39Cor9HkBzR5k6E+mxhN0nfUzHW16lWN+hmNelyreUyradFqcjUau0ZjU6vNkzN8aoZxFSw0Tet0OoPB4CKYFy9GpVKxXtPFi3BFSYvF4lJ0F6lTXl7eli1blvuJ7e5+wlV5a1Cr1VlZWQUFBSkpKSqVClwlZwg\/3nK0vsvHWzAASEBQBUM+AkGUUFggQjsl4hGZ9HsK+euE8jcU8QlF\/IYi3iSVzyvlp\/EJJ95mgsiQSoMEAgMMKSZHSyvgJoNhOCAgIDc3Ny8vLzIyEoFh2NOTkkqFMKxRq3NycgoKCtLS0jQazQp0VBAAhACAQ1AwwwQIBXEIkidCG8TYLol4TCZ7WoG\/oFS8QSqvUeRNirhJEdcp4qeE8pJCfkAmbRZ\/7WP0hmESgkRLVpcfbzn+g7iJn9Df3z8+Pl4gEDjq5vI4z1szQApBkEQikclkGIat4hZTPG852mbpvAUCgBgENZNTUxko0oBhQ1LpJTn+olLxNkXcmHzUXiOJlwjlBTm+XybZgmGZKBImFHDPWcUq7bwlFAqlUqlMJmOnDQQCAYZh7P7LbEcVi8Ur3FEdn5IQAIhAUDExtQZbBHCIUJCIIMUiUZsYG8al31XIXyGVH0y8B5AfUOSbJDH5HiDbIZFUiEQJCGIVCEgIEiz87ZDnLcd\/EEeLOKavcBxBEJFo6e8kc2jtjryFYdgix6j3VzH38RMajcZVh3bRfkIdTYfSdCFF9VHUWYr8KUVepSfWTdxh6C9U9AeTrq2LWvU+rWaLVput0URp1AEqlVnF6BlG9ffNdhOL\/L1Sq3NlsVicVMzQtIaZANAy6XeN0WgKNJoOrXZYp31Ko3lLo\/pUzfxORd9iqA9o8lcU+SxFHqKpzRSVQtN+NK12Itrhlpv4CRmGcRM\/oQM293nUHXlrDqp9YG7z4y1HUy90vCWHoAgE2SIWn5Pj75HEX1T0X9TMn1X0TZp8Uak4hsuaxeIkBPGGYcnkUgJ2fYTz1QRuYhFHWFYrzjDM\/P184GRW7qtqOQT5CwQ5KLpNIjmPy35BKv9nYtHHhIF+S1OvEcqjcrwGw0IRoQKC4NlbyI+3HLFZkEUcC96LcZ63ZrYahs1wgP3MWZct1U2eku6\/Dh4CABQEcRDUwXC0UNiEYcdw2StKxS2K\/IKhPqbJtwjlGVzWJhYnoYhJAEsniWoRdnMHi4AguFobuDgi5iqvlBAASAgKFgpKRKJBmfT7CvlVUvkJTf2WoT6liNeUipO4rEMiTkVR8+SsmAQEuZkTnreWwyKOMhcan1j1uswzW6xKbs1bCIJ4eXn5+PjQNO3ovhcIBBqNxmq1ent7SybXAS8U3znz2+32OfMsdwZ3eEoCAOC2vIUAAAVBvgJBMoK0iCe46ieE4jo5MY9yhSJeVCqO47IWsTgFQUyTg6qlr6FwB4vAMOzv77\/cfW9O+a7iLceKYAAgIMg28ckB2ikWn8BlLyjl75DKmxT5MUm8QSifUMgHpJIykShcKDTAMCMWK2QyRwmrEufPMeFgJwhCq9Vyl8sXcUfeYh+UCoUiOzu7tra2tLS0urra19dXfjdEREQ0NjaWlpbW1dVlZ2dTFHX3jsv+2u12l8larCB2EfxiS7usHEVRWq3WZeIWK8hiscjlckIu95LLI+XyAjm+TY6fUchfJJTvUsQthn5frXpJoz6tVm9TqfJpOpIkvZVKUqFYbIUzlHMHixAEERQUNINyK5vk5eW1rBWSCoW3UhlBEjk01aJijqhV39eo39KoPlYxxn0XtgAAIABJREFUH9PUL0ji+0rFEYpsoelEudwsl7vW0AtqmkKhMBqNCyqyHJmX2yLz0Vmv15vN5vnkXGIed+QtGIZRFCVJ8vDhwz4+PhRFlZaWZmRkoJNBJBKVlZUVFBQQBBEcHNzR0aFWq9lbLvxtt9tdKG1xokiSlMlkiyvrwlIymYyiKBcKXIQoGYomeHnlyWQ7lcqnaOrXKvpjtWpiVQVFPq9UHJRJa8SYHUW9EIRGEOkiKphfEXewCIZhNpttfvouYy6NRrOM0v9etBhFlSiqRRB\/BMkUibokknNy\/JckcYeh72hU19Wq5xhqN6HMksm8xZj478uuwJVIJFqOR9BCNddqtQst4vL8DMMYDAaXi50u0B15C5gMX7V\/fHycdQ8mJCRUVVWx6SAIpqWl5efnQxDk5+dXX18vFovZWy78zfsJOTBX0U8IA4ARhktE6AlcdkOj+gND\/UlF\/5am3iCUR3BZlUhkEwpxaGKP8zl3neCas5QI7yfk0FsOPyEn3EmE3cEEmfyeIUsq7SfJ55SKz2nyTyrqtwz9C0I5LJPmoagOhp0s6HAifxG3eD8hB9oD7SdkUTCZTMeOHWPjcXFxtbW1bBwEQW9v79ra2tjY2IqKitjYWHYmEEVRkeuC3W53nbBFSqIoin1QLrK8i4rhOE7TtIuEzSEGE4lwFKURJAhF6zDsjFx2jSL+R01\/oVVf1+nOMXSHUpkkk+nEYmwOScty2x0sIpFIbDbbsjRvIUK1Wu1Csi9LXrlcTpIkjWExMmmHUvEkTb2vUf1Wq\/6jmrlKEadwvF4sDkMRFYLIUVTs0ueDY3swDNNoNI4pqxJ3B4uoVCqj0bgCzXff8ZbRaBwfH2fX2iYkJFRXV7O8JRKJCgsLIyMjcRz39vaurKxUq9UAAJhMJh\/XhejoaNcJW6Qkf39\/q9W6yMKuK2a1WgMCAlwnbwZJVh+fcF\/fDD+\/zf7+R\/2sL1jMNwz6LyaePuTzFHlYxTTodDkBATaLZYbCK5jkDhbx9fUNDw9fwUbPXFVgYODMN1Yw1c\/Pz9\/fn6sw2GzOMBqbtZpRhn6RIq5S5C0185Fe9zOz6bTVZ6u\/X76\/X4yv73J0ZXdAwx10sNlsQUFBnEWWL+K+vCWXy48cOcI6bQsLCzMzM1nekkqljY2NdrsdgiC9Xt\/S0mIymdhbLvzN+wk5MJfPTwhO7BgEBggEhSJ0r1T6rFJ+lSJu0uQbpPK8HO8QY4kI4jW5VSsIAAv9fovT34UR3k\/IgblafkJOgdnOjWR3RfGC4UQEaRVjp3DZzwnlTYr4kCJeJpQnZLImDItFhDp4YlNjR2mLjvN+Qg463k8IQBCUmZlZVVVVXFxcVVVlNBoBAEhLS1MoFHa7vaampqioqLKyMi8vbznOPOV5i+uLLuctEACkIBgkFNRhohO47HVC8RFN3qLIVwnFKC6txERBQgEzbf86nrdYi9zH6+C5LjfPiPPvt8DJ3acoCPITCPJRdFAqeVYp\/4Aib9HUNUr5nEK+RyrJQVFvGEaWRmA8b3H2eqB5SyKRaCaD2WyOjY1NSEgIDQ3V6\/UajSY2NtbLy8tkMkVFRSUmJsbFxfn5+bGZXfs7OjratQIXIc1kMrFHRy6irAuLGAwGk8nkEoEmjSZVo+lVq3+oUt1S0b9X0b9XM7\/SqI9rNXVabbhWa9Jq9RqNdqbK\/P39Z0pe0TR3sIhOpwsJCVnRZs9Uma+v70zJK5pmNBq9vb3nU6VOo\/HSam1abZ5W+5hW+7xW84ma+aOK\/p2KfldFX1Cr6tTqEI1GNx9Z0\/JotVofH59pySud4A4WsVgsy\/RAnoKm+\/oJOQ5flQg\/3uJgX8p4CwQABAQJCIpChB1i8dMK\/GOa\/L2KvkOTP1Mq+qWSVBRVOd3Lh1ODH2+xUPDjLa5LOB9vcdmmR1AQ9BMIqjDRcVz2DqH8nCF\/x1Cvkcp+qTQBQQgIZM9Fm15wxhR+vMXB8kCPtzgUVjHC8xYH\/uJ4CwYABQQGCgRNGPZdOT6xjcXEDqrE0wp5t2RiY0C14w4oXGWzR3jeYrHheYvrI4vmrb9JAEHz5PTqiEz6Gqn8mCZvUMT3lfI+iTgRQfSTc6tc5tkiPG9xyDzQvIUgCL7awW63r7YKuFqtJkly1dUgSVKj0cxfDRLHbTJZsUw2IsdfIZSfMNQVteqSWrWVodNJwqpQLK5JZrN5\/josU053sIhCoQgKClqmBs5frNFonH\/mZcpJUZRKpXKJcJ1cHksQW2j6nFr1C43qloq5RpFPK+W9uCxdJvPBZcTs1cjlcoPBMPv9FbrjDhbR6XQmk2kFGuyOfkKBQLACXwA4r8JNvt+Sy+XO9VyBu\/P\/fkuBYTG4rI8kXmDoj9TMLZp6ViHvkUpiMJFOJJItTVcvL6+lCXBBaXZHMRcIWoII\/vstDjyFQkGSJHe59IhUJFKLRIEiUaVYPI7jv6SI2yr6fTXzHEP1EkQiLlOJsekfDorFYnf4fkun0y0dgSVKUKvVD\/r3W9zYc1UivJ+Qg31OPyEIAEoIykTRcZn0N6Ty9wz1IUWcwGVZKEK57lBg3k\/IWoT3E3I9c+l+Qk7UlIhgcsmrr0BQh2FPyPFPKeL3KvpDivyuQl6LYRYYdjzlkvcTcug90H5C9iBXCILYc13F4oktx2AYhhyCUCjEMEwsFiMI4pDssij7fZjLxC1KkEKhYM+xXVRplxXCMEypVE4XJ4AgDIIsAsFmMfa8Uv47hvq9in6LInfIZCEoKvp7e00vvtAUvV6\/0CIuz+8OFkEQJCAgwOVNW6hAlUo15V9yoRKWnl8ikXz1lefS5TiXgMFwGIpuk8leIpSfMdQfVfT7NHkMx\/NFIi0MYxCECAQMwzgXsgJ3VSrVCtTivAqKonQ6nfM8Lrnrjn5CDMNIkqQoKi4urmkylJWVmc1m8m4wGAy5ubmNjY1NTU1JSUl3k1351263u1LcomQZDAZ2QmVRpV1WSK1WGwwGThxFUQaaCmOYarX6lFbzjlp1m6GvUOR5kqgnyVCSVFEUl9mFEV9fXxdKW5wod7AIwzDBwcGL09+FpUwmE7U8hp6\/khqNRq\/Xzz\/\/UnIyJOlPkoUkuY8kfkYSH9DkLRX9hkY1ptXUajRJJpMXTdOrCog7WIQ9dmopOM+zrDvyFjvqFIlEu3btCg0N1Wq1FRUVjo67iIiIyspKvV7PMAxBENwo1YURx+pcKHZBotxhdwbH87fAyeOR7AiyVSJ+RiH\/gCI+pMnvK+Q9EnGMUEhA0IJat9DMvJ+QRYz3E3I9Z\/n8hFwV0yMoCJpgOAdF90olzysVNyjiY4p4QUXvlEriEYSGINdswjG94rlS3GEHkwfaT8ga6KuDEsbHx1EUhSAoJSWltLSUTYdhuKysLD093dfX19\/fH8fxuQy6mPs8b3GooShKyeVeMFwsQk\/hsrdJ4iZFvkkqR2TSbBTl9mHi8i9ThOctFliet7gOtiq8xdYOAQAOghYYzhWhB2WyN9SqT2jy1xRxTi4rx0TeMCzktFypCM9bGx3Do48+umHDhvXr169du\/bhhx\/eMHtYv379unXr1q5du2bNmkceeWSJ9jKZTGNjY6wQx\/3gEQSpr68vKCjQaDQhISHZ2dlSqXSJdU0vzvMWiwkMAOEY1k9TP1MqbjPU\/9LkjxTyFjHmLxDIQHDFjooA+P0J7\/ZRnrfuIgGsIm9xOsAAIIPhSIapw7BnFPIvaPIzhnpVKd8uEQcLhSvJXjxvOdLWxlXkLe4ck\/j4eO4cE5a3YmJiIAgiCKK2ttbHxwcAgLCwsEjXhejoaNcJW6SkqKioRZZcWrGoyMiYyMiMyMju4KBnrT539No\/alSf6jSXzaaOQFtyePjSxC+y9Gqh4aiuO+gQGRlpt9sdtVqVuJtA4VZqJIWHt9psz5hNn+g0f1Qzt\/W67\/v6doYEp0ZGrsDTxB2giJoMK9Ah3Xd+i6KosbExHMdhGM7KyiooKGDfcUAQLCoqysjIEAgEJEk2NDT4+\/tzrz+uijyY4y0BAJAQFCoUdErEP1Qq7tDkDZp6mSJ3EMowoVC0tO1Hl2ga3k\/IAsiPt7iO5A7jLQCY2AGcoihOKwQEQ4SCbon4J8qJDaNvU+TTCvkWMWYTCOQQuHyTwPx4yy3GWwKBoK6uLisrKyoqqqamhiUnf39\/FEX9\/PxqamrsdntqamplZSVJklyncVXkQeMtMQj6CgTFkycLv0kqP6LI10jlEZk0T4RaxWJKLncVsIuWw\/MWCx3PW1wXck\/eYtVDJpdvFE3+Q\/2CnDhI5RVCcUAmzUBRw5J3oOcQcIzwvLXKvCUSiZRK5f\/f3peAR3Fd6SozL5l8M28+iO04ZjEyUNVdS3dXdXctXdXV+6p9QaAFLWhFElrRviChBSGEhEAgAcJC2CwGIRsbsFkGbGdf7Swe4yRvEk88jiebk0zeZN7MZGbygspU2kJLS+pN6ns\/fdKtW+eec+5\/bt1f91bVLYZhoqOjS0pKysrKsrOzjUYjTdNFRUVGo1EQhO3bt5eXl5eWliYnJ+t0OtrXKT093dcqF6zPZDLp9foFV1tgBTvDFNPUSZr6BkP\/jGN\/KfBfNAhHBX0Bz7tYlqFpnufNZvMCtfpe3O12+17pAjUGJiJzO6XT6RITE+eWCcBZu90eACtzmxAEQRwW5hbz91mGYWw224xWdAwTxbLFPD8qCN8U9B\/q+X\/SsV9k6H6aymKY+yOa71IoRMRqtbpcLt+1aVZNobhOKL5xjCCI+HKxUqnEcRxFUfE1ZHQq4TiunEoYhiF+SOnp6X7QujCVNE2TJLmwOl5L4whix\/Fmkvw7lvnF1AcdfsjS42oyD8d5BCEQ5D7cU4kgCIZhHhwF7a\/FYgma7QeGaZomCOLBUXD+4jgeFxcXHNseVgVBEC9Jj7JAZ9VqNUVRgbb6kD0Mw\/R6\/UPFfy5AEYREEDOKVijw57Xqn+mYfxX4H\/PcBZoqJAjaRyNYKESE4ziz2fznlvsnp88qD0Xe8pz8Biu\/UtcJxQ+LJCDIEZK4x9L\/JfD\/zuu+QVOdKqVVLp9x8X3efZ4CEyOwTijiDNYJpf4WyuuEkpPTMjIISkTRYZL8EUv\/Qc\/9gWNf1WpqFQreu6\/5TNPmeRgm64SRao4\/9noo8pZcLseCndLT04PtAsayrFqt9okbCgyjMMyBYdVK5fMa9Xs65ncC\/66em2SZCpI0KhT47GZIkmRZdvbzATpjtVoDZGl2Mz6MyOxG5jmjVCrj4+PnEfL\/aYPB4H8j81jQaDQ0Tc8j5P\/TCoVCEIQF2SFwPFal7NZqv8TpfiHof6vn3mCoAVKViOMMhikWpOuBcChEhOd5i8XywCO\/\/HW3jkTsuRWKvIXjOBXslJ6eHmwXKKPRyHHcEt1gKSqGYSo47oygf9Mg\/FbP\/UTH3qWpg5Q2m9IavdDOcZzR6I2gF7qWIOJyuZZQ2zdVfRKRJbrCMExiYuISlSy9us1mW7qSJWrged5gMCxRydKr0zRttVoXoYehKDdFVWi1z1Da7zD0hzz3A4NwyaCv4Dg3wzAL1BgKEbFYLE6nc4GOL0zcOvxqiPKW5+Q3WPkVsE6ogOFYBGlRKl\/RaP6BZX7BsW8w1NPq+58YNsvluNcPtYN1QqkThsLOW2CdUArHclwnlJyXMvDU1htJCNKrUn6Zpj7UMf+HZS5r1KU4rlvI3mlhsk645sBroc5bGo1m586du3fvTkqa4d1zFEUrKyujoqKkHuDDzLLmLTUMZ2PoKZL4PkP\/htf9Usfc1GpalEoXIifhBb9BAnhL6leAtyQoQmGUXBm8JUIKQ5AShs1yWZNS8Rqt\/RXH\/oJjb2k1VQqFl+wVChEJwP6E90krNNcJSZI0mUxms\/no0aNtbW07d+48fPjwjh07TB9PjY2NV65cqaur+3ixb44yMjJ8o2gJWpxOp81mW5CCZJOpx2T6qtHwe4P+jwL\/zwbhstFQYTK6FqTl48I2m83lWoqCj6tb7FFcXNxiq\/qs3iIi4jPbDxRZLJYtW7Y8OAra3+jo6KDZfmDYbrc7nc4HR0H7azabo6KifGg+xmTaazJ93WD4g577b4H\/jkHoMRnj5zMQChFxu92xsbHzebr480azBTr0hRDlLfEfkD89CzAxMaHVahEEEd\/ikv7XgyDIarXu37+\/q6srLy\/Ps9xX+WU038JgWCeTZaDoMUL1PYb+fxz7zxz7ulaz9\/4EC5nxEcEFoQTmWxJcYL4lQREK\/92vpPmWBKyUoWWyXTh+Xav5Ocf+mmO\/RGvbVEorIlfBMy\/xh0JEAjDfMgz9XUjzls1mm5iYEGOUnZ3d0tIiRZQkydra2ri4uKampnDmLQKGYxCkWam8plH\/iGV+pmO\/Q1OnSaIIxwW5zFeb3gLekjoe4C0JilAYJVc2b4lQ0zJZEY6fV5PfZ5kPdezXGbqfUKagqOYh9gqFiASAtxzNx0KatxwOh7Svrud+8HK5fPv27WVlZWq1urW1NT8\/XwywxWKx+S5lZGT4TtkiNUVFRblcrhkrR9lsO43GUU73Bst8yHM\/t5i+7HIej4oqd7kSHQ77jHUWW+h0OqOjoxdb22f1EhISfKZrsYrmiMhiVS64nsPhSElJWXA1X1eIjY31tcoF63O5XFFRUQuu5usKdrvdr2g47PatDkeT2\/2i2\/kjm\/U3Av8Wy5zVsVWCEGe1Sq3xqw+SlbkzMTEx8fHxc8ss8awQncge+3woPgcv8pDRaJycnJRNPVGTm5vb0NAgljMM09nZeeDAgYaGhtHR0YGBAYfDAUEQQRCk71J6errvlC1Sk16vZxhmWmU1SaZS1Gk9\/w8mw78Z9G+z9DBJZiuVZpWK9ikCkl2apgVBkA6DlXE4HMEyLdmdMSLS2cBktFptQkJCYGzNYcViscxxNjCnWJbleT4wtuawolarzWbzHAI+OaUmSV6lilcq+0jiWwz1LwL\/S6PhuiBUMoxRrSZJMhQiYjQa7Xa7T9o7hxJDbk3o8haO42fOnElMTBTnVVlZWSJv4ThusVhcU6mnp6e2tlbrh11fQ\/D+FgxBNrl8kCTe0zH\/xet+wjKHCcIql8shyK+fWAXrhGLHgyAIrBNKUITCqlQ4rBNKgEsZOQQJcnm7SvkdhvpvPfc7Tnddqy7AMSvPSzLBygRgnVBsWijylrg\/IYqiSUlJ7e3tnZ2d1dXVHMchCNLQ0MCyrLTrVU1NTXZ2tnTow0zo7E8obm4WhaJ9BPE2S\/+rXvdTnhultMlKpXJqz0YftnpGVWB\/QgkWsD+hBEUo7Ia3XPYnlEDzYQZFEAuOt6nVX9Gx\/yLwv+J1rwn6cgXOIYjSY3NRH1r0RlVg9idEECQUeUvcD56maY7jnE6n2+02m80sy9I07XQ6PXd\/t1gsftoQOhT2gzebTC5ByOG5U4Lw9wb9r\/Tc2yxzkqZ20LRh1o2SfX8C7AcvYQr2g5egCIXdx0N\/P3gJLj9lGJqOpekWmr7B0O\/r+X8R+NcMQqegT9bpeIbxk9E51Ib1fvDBmuR62g36OqEShrO12pM09W2G+o2OfZOmjhBECooSMz8E6+m7j\/NgnVACFKwTSlCAdUIJimnfjZTKA5a5v3Iok9Xz\/PMa9Y9Z5oOpfQbqlQqzXObXOwgPNzCs1wkfhiPwJUHkLRiC4hFkmCTucezveN13aeoQoYpHEPKhJ18DAwvgLQlnwFsSFIC3JCiCzluiJwLHsTLZDgy7pFG\/r2N+zjFfoLR1SoVeFjj2CmveIgjCEOyUkZEReBdMBkOWwTBuEH4q8P+p5983GcdMpnSj8f5iaOC9eWDRYrE4HI4HR0H7GxsbGzTbDww7HA6r1frgKDh\/TSbTli1bgmPbw2pUVFRQe+V9V6xWq91u93AqOFmj0eh2u4Nj28OqGBGT0RhlNNYYjbcNhj8I\/L\/puW8JfIfBEGUwBGAMcblcMTExHk75KxuK97ekf2SCmAnwfEsJw25EPkCofsgyv9dz7zL0UYJIo2lCoQgiCKJpMN+SQgDmWxIUYL4lQREi861pESFgOB\/DXtaoP5zabuOGVpOHYYvYnlRqpjeZsJ5veQOQv2UCxltqGI5DkEOE6tsM\/UuOfYuhhghVEopiMBwKoyQEQYC3pM4WChEB+8FL4QjP5+Cl5k\/LTOMt8Swtk5Xh+DWN+gMd888s\/ZxanYVhlPhW7LT6vjgEvHUfRaVSmZiYuG3bNovFMvWe0kfQoijqdDrT0tKSk5MpivIF4NN1BIC3CBjeOrWp4HdY+tcc+y2aGiRUySiqePDkRSiMkoC3PHtGKEQE8JYUEcBbEhQQBM3IWxAEiU9tVCsUt7WaX+iYH7D0KZLYhqHef8nI08rc+bDmLaVSybKsTqdrbGxsbW2tqqrq7OxMSkpiH6SsrKzOzs6ysrLm5ub6+nqTyfTgjM\/+pqen+0zXQ4r0LJvHsuMsc0\/H\/l9ed88gjBqEHXq9jeN0Op0kbrFYBEGQDoOVEQTBYrEEy7pkNyoqSsoHKxMKEeE4zvNaCBYUDofDs68GxQ2DwSC+IRMU65JRjuPsdrt0GKzM3BERdLoknj9gEN406H+t597RscMsk8qynE\/dtdlsbrfbpypnVhaK97dgGJbJZDRNX7x40WAwqFSqysrK4uJiuVwuvpKcl5eXlpamUCjsdvv+\/fv1er3M1yk9Pd3XKu\/rQ2SyGBw7oVG\/z7H\/rufeYegDKtX9rzjKZPfb9vFEUZRKpfp4WRCOlEolTdNBMPxxk2az+eMFQTgKhYhgGBYXFxeExn\/cpF6vF6\/HjxcH9IggCK1WG1CTMxlDEITn+ZnOBLTMm4hgMpkFkfcRqh+zzL8L\/Nss00YQHIL4ylGdTmcymXylbQ49ochb4lTUarVevnxZ2g++ublZLIdhWK1W4zgOQVB8fHxHRwdJknPPXhdx1ufrhAoYjkLkg6TqXYb+dz33Y5YeJFROz9XPh7wMhVUpsE7oGZZQiAhYJ5QiAtYJJSjmWCf0lBHzcgiKR5EzavLXHPsvHHtHqynCMfXCvyj7sOawXicU4ZhtP3gJLIPB0NbWlpCQIN5l1Gq1lO9Senq6T5TRFGXSaraSxJCGfIuhf2sQ3rWYxo3GbJ2Op+m5TRiNRp7n55YJwFmO40wmUwAMzW3C5XLNLRCAs0ajkeO4ABiawwTLsomJiXMIBOaUzWYLjKE5rPA8bzAY5hAIzCmapq1Wa2BszWFloRERaLqa5\/\/OZPzQZHyf013SanJJ0qLRzDMqzeEBRVksFqfTOaeIb06G7nzLYrFcvnxZ5KScnJympiaJsSAIMhgMe\/bs2b59O4qiYrnRaDT5Li39e8dmkynWbN7tsD\/vdPzYZv2twH+LoY8xTB7P2b3zMxS+rmsymULke8d+\/Y6qdwExhUJEwPeOpWCt1O8dSw1cUGYR3zs2m0yJgtCqY28x9K943ftW81WHfbfdHmU2L8i0JOzv7x1LhkKXt\/60+nfu3Dm73a5UKmtrawsKCiTe0ul09fX12dnZCr+93rTEdUIUgrah6EmSeJtlfsfpvslQfSpVHIIQC9nzIhRWpcA6odTrwH7wnlDM9vSap4y\/82Cd0BPhRUcEhWGTXNaoVHyRpn7NsW+x9GFCFYUgnsq9zIN1QgiG4czMzI6Ojvb29oaGBkEQIAiqqamhKKqkpOT8+fO9vb0dHR319fUWi8VLWL0XWzRviWvHJ0niJyzzr7zuuwzVo1IZ5TJ8IYwl+gl4yzNeJpPJ8zAo+VCICLi\/JYUe8JYExYLub3nWkvLo1OdRulXKdxjq9xz7PYbao1Topj5\/KMnMmwlr3pL2ebJarSkpKampqXFxcSaTyWAwbN261Wq1xsfHpz9I27ZtczqdPt9OZKH7PBkNBrvRkGsynTUaf2bQ\/4eee1fPnxT0qUvYXsXhcFgsFp83baEKwT5PEmKhEBGTyZScnCy5FKxMVFRUsExLdsE+TxIUBoPBJxExGwzZgnBRr\/9Qz\/2nnvuGQWg1GmOMxvuDrxcJ7PM0L7X7V8D7+RYMQWoYTkSQIZK4x9C\/mtrzYoBQxSKLmml7NCsU\/rsH64QeAQHfjfwzGItelfqziiXnwHzLE0IfRkQFwzkY9rxG8wHHfqBjLmnu77Kh9WJ\/3rCeb3kGI1h5b3gLhiCNDE5F0eMk8RZL\/1LHfp2m+lTKBATBfOE34C1PFME6oYgGWCeUegXgLQmKpa8TeqoS86xMVq7Ar2s1H+iYH7LMaTWZiqLqB7v5PCwPQVBY85ZCoWCCndLT0+d2wcAwBQz9DE3d0zG\/47nvGIRhg5DF82aWnbui92fFrxR6L+8nSfG7kX5S7r1at9vtvbCfJEMhIjqdLikpyU8N9F6t3W73XthPkoIgmEwmPyn3Xi3LsjabzXt5P0n6IyI8wyRz3H5B\/1WD8G967p6OGWXoDIbhZ2mD+N3IWU76sjgUnycUN8VAgprS09Nns69A0a1KxTMU9U8896967k2G7lQqrShC+Prz2KHwVXgEQVQqFcMws6ERsHKLxRIwW7MZCoWI4DgeFxc3m4cBKxcEIWC2ZjNEkiRFUbOdDVg5hmF6vT5g5mYz5L+IKBHEhCCdKuVbDP3\/9NxbnG6fWs1j2MOecBxnNpsfLvd5SSjy1owz0AAXpqenb9682dMoDEEYDMcgyAmS+JmO\/U899wOGFp8V9NNHRcE6oSf+YJ1QRAOsE0q9AqwTSlD4Y53QU7mYt8vlJ0niAx3z33ruK5S2FMenfcyWYRiDwfBwRZ+XhCJvyeVyfCqpVCppKUChUIiFAfitQFGrxbL2b\/5608aNOIYpcJzFsRQFPqImv88yvxH47+u5wzQVr1Kp\/OkNy7Lijlb+NDK\/brVardPp5pfzs8Sf9v3ys4X51YdCRJRKZXx8\/Py++lnCYDD42cL86jUaDcMw88v5WUKhUAiC4Gcj86s3Go3zCy1ZgsLxfJK8qmN+LnC\/4XXPazX5CgWPYaL341+SAAAgAElEQVRinU6nUqkiIyOxByVLNjizglDkLfGDTxRFFRYWtra2Nkwll8ulDUhiNBoSQWJWrz7wl39pfOwxs1JZotM9J+h\/aND\/ktN9jaH7tdpUSqujKH+7I+4q5G8r8+rX6XRGo3FeMX8LBKwDzNGQUIgIwzCJiYlzOBmYUzabLTCG5rDC87wgCHMIBOYURVFWqzUwtuawEsiI2CmqSqt5habe59ifCPrLgn6nTmemKC1B6B9\/HP3sZymSnMPVpZ8KRd6CppJKpTp16lR0dLROp6upqcnOzhbL\/fpbvnnzU2vWxP3VX307IuL\/RkRc+MQn0lavflWl+K2O+TJNdauUsQiinPOJGh+6B9YJPcEE64QiGmCdUOoVYJ1QgiIw64Se5mAIMslldQrFq5T2Q479PsscVilNjz16\/C\/\/svov\/iLy8cc9hX2eD0XeMsvlpTjeYTB8q6+vmiAqFYqT27ZdKCioUCgqcNyvP1siI7d9+tPfjoj4n4iIP0ZE\/D4i4spf\/EXBI59pk8stcrli4XteLCVggLc80QO8JaIBeEvqFYC3JCgCz1uiaRSGLXJ5h1L5XZb+Do7t+tQnfxkR8ZOICPWnPlUtg\/03VocibzUrFb\/Xc\/8j8H80Gf5H4O\/\/GPT3f8S8336\/R2sLV6966QFp\/XGKuv4QEVEZEfHo6tVwwJNWq1UqlQE3O92gQqGgKGp6acCPTSZTwG1ONxgKEUEQJDY2drpnAT\/meT7gNqcbVKlUGo1memnAj+VyOcdxATc73WBwI2KWyYS\/\/dsvTY2Zf4yIeCEiouDxx\/9rahj3x7gdiryViCJHCdUlk+ndutpRNTlKEjfj476SuX2UJMa0mktms59+njEaCqHNuz\/1qR8\/QP8\/IiJej4hw\/O+\/Mej1CQFPycnJiYmJATc73WBiYmJycvL00oAfp6SkBNzmdIMhEpHU1NTpngX8eMuWLQG3Od1gYmJiUlLS9NJgHIcCGkH0ITE+XqNWt3ziE+L\/+uLv0k9+sk2lnDCb\/DFchyJvwRAkhyAdTV+6cEHPcQoUrSwrK9+1Sz5V7tffso0b8cceq\/lf\/+vdiIj\/iIh49ROf2PrpT0Nr18o\/\/ky85\/Tcf3mwTuiJLVgnFNEA64RSrwDrhBIUwVonFB3Y\/OSTf\/3JT16PiHjL4+dMRMSjf\/3XsshIf4zYochb0vVZXV29e\/fuoqKipqYmp9PpGSQ\/5e+\/ibVxo\/yxx3b\/1V9di4hI+fSnZWvWwMEgrRD5agbYn9Czp4XCfxKAt6SIAN6SoAgubxHr1jGrVxevXt34xBMt69ZVrl5duXp1\/urV9COP4Bs2eDrpq3wo8pZSqeQ4jud5t9udl5dXWFiYlpZmMpm4gCSe4\/Qsa2NZ4ZFHaIVCr9PxAbH7sBGr1So+eP3wqUCWGI1Gm80WSIsz2oqOjp6xPJCFoRARvV6fnJwcyFbPaMvlcvF8sK6MjzwymUwWi2VG9wJZqNfrnU5nIC3OaMvlcs1YHoBCk05nZ1k7y8ZbLMkOh5i3s6xNxxr8Yz4UecuTk8Wbj54lgcl7s6+uvz0Jhf\/uwXzLM8qhEBHxuQxPr4KSF58CCIppySiYb0lQQBDE87znYVDyYb2vblAQn2YU8JYEiPgauHQYrAy4vyUiD9YJpR4IeEuCIrjrhJIbgLckKIKTcTgcwTHsYVWpVKIo6lEQnCyCIEqlMji2PazSNO1xFJxsKEREJpMFZgu4uSFWq9VzCwTgLIZhCoUiAIbmNgHDMEmSc8sE4GwoRIQgCIqiAtDYUF8nDAAEwARAACAAEAAILCMEAG8to2ABVwECAAGAAEAAArwFOgFAACAAEAAILCcEAG8tp2gBXwECAAGAAEAA8BboA8sGARiGZTKZHKTwRkAmkz28wTXoG2HVKQBvLZtRO8wdhWEYQRAYhjeBFN4IyGQyFEU9qQv0jXDrEYC3wpwOlk3zxVcC1q9fvxak8EZg\/fr1IlFJfVekMdA3wqdfAN6SOj\/IhDQCOI6vW7cufK5M0NI5EFi\/fj2GYVJ\/xTAM9I054Fp5p5Ylb\/E8n5CQkJSU5HK5ZDKZ1H2XdUYul2s0GpvNlpeXt2PHDqvVqlarF9c6kiRbWlpu3Ljx+uuvX7lyJS0tbVkjIzqvUChW3uUHWrRoBHAcl3o1juOL1gMqLkcEliVvZWVlXb169fXXX5+YmAiFt8Sl62fRGZVKlZ2dffLkyXPnzp2cSufPnx8ZGcnIyFjEjgAMw3R1dR16kGpqajxvBizayeBWBLy1HMcX\/\/kMeMt\/2Ia+5mXJW9HR0RMTE3fv3p2YmNBoNAsdT8WZjVwuX2jF2eTlcrlWq12KwpqamvHx8d27d0dFRVEURdN0TExMfX39M888U1FRMZvdaeVut7uqqqp29pSfn++lky6XKz4+XhQWBGH79u0L+v8gLi5u91SqqKhITk6ebZsoccsiLyMIeCv0R5NAegh4K5Boh5qt5cdbVqt1eHj46aefzs3NHR0dJQhi2vA99yGCIAUFBcePH9fr9XNLen+W47iTJ0+WlJQgCOJ9LUkyOTl5YmIiJydHvBSVSqU4x1IqlQUFBVeuXImPj5eE58js2rXr5s2br8+exsfHvdzwsKSkpK6uDsdxpVLZ2dlZVFTkOUzM4YN4qra2dt++fVu2bMnKyurq6iopKZmxOoZh9fX1ycnJ8yqEIAjwVqiNHcH1x7NHgXXC4MYi8NaXGW8hCFJcXDw2Nmaz2WQyGUEQC1oBk8vlOTk5L7744sTExEIJb46xVaVSXbp06dq1a0VFRYugrueee27fvn3STKijo6OpqUk0hyDIwMDA2NjYHNalU+LG7drZk\/e7f0q81dHR0dDQILKdVqvt7++\/cOFCfX29RqOpqKjo6+uDIIggiM7Ozq1bt0qxqK2trayslMvlMpksKiqqv7\/fZrNBEORyuU6cOHHu3Lldu3ZhGNbb23vr1q2rV68mJSXxPH\/kyJGLFy\/u2bOHYRipUVIG8FbgR4dQtgh4K5Sj42\/flhNvEQSRnJysUqkWccsHgiC5XJ6amnr16lVxBjNtePe8DKSxcrbMwwzhdrtfeOGFa9euZWdnL4i6KIq6c+fO1q1bIQjCMIwgiOHh4YGBAYIgRLZIT0+\/evWqVqudzRnPcgzDXnvttePHj3sW\/unjk7du3SorK\/P+KY+SkpLm5uba2tojR46IhIogyLFjx2pqaliW7erqysvLczqdd+7cIUnS4XAMDg56fmdE4i0IgiiK6uvrS0hIgCDoxIkT27ZtM5lMY2NjVqsVx\/Hu7m7xkzEHDx7cuXOnVqvt6uoqKip62FXAW\/4eC5aXfs8LFsy3llfslu7tMuAtjuMsFovZbD558uSpU6dYlvUclL3Pcxw3MTEx2ypaZWWl96pKS0tn0zM5OWk2m71XFR0dfffuXaPRiKJocXHx6dOnb9y48fLLL4+NjeXm5iIIYjabX375ZafT6aXO27dvj4+Pe477Vqv1zp07BQUFXmqAIKikpGR0dPTUqVO1tbXiAGE2mycnJ7Ozs9PT09vb26uqqhQKxTPPPJOTk5OVldXW1uZ5A8yTtzQazYEDB0TeMhqNsbGxCQkJY2Nj27Zt8+QtnU4XGxsbHx\/f0dFRW1vr+ZSz6DbgraVf7StJA+CtlRTNhbZlGfBWfn7++FQ6f\/68l3d6ZhygSZJsb2+\/devWjRs3urq6aj+eYmJiZqw1Y6Hb7f547dr29vZXXnnl9u3bXV1dXs6NRM1Go\/HOnTvR0dEymczlcuXn558\/f\/7MmTN5eXniWmhcXNy1a9cEQZjRk4cLJycnz5496\/koRGxs7M2bN3Nych4Wnq1EXCc0m81DQ0OFhYUIgthstsuXL+\/YsSN7KjmdTgRBcnJyhoeH6+vr8\/PzPZnSk7f0en1\/f390dLRWqx0aGqqurs7Lyzt79mxqaqrEWyqVqqenp76+Pi8v7+DBg+KttWm+Ad5a6LW9suUBb63s+M7dumXAW4WFheLkpqSkZNpYttBDiqLa29uvX7\/e09Pz8H\/0C9UmyaMo2tXVdf369e7ubpZlpds8ksAcGQRBrl27VlNTI8n09\/d3d3dLh83NzRcvXvR+7XF8fPz8+fOeX29LTU29du3agr7gLN3fslgsg4ODaWlpJEk+\/fTTWVlZGIYZDAbxFpRKpZqYmBgcHJw2HZR4S61WV1ZWdnd3Mwxjt9tffPFFMfPss89KvFVQUGA0GicnJ3meZ1n2wIEDgLfmvmjB2bVr1wLeCudusAx4Kzc39+7du+IrtIu7syVxAARBGo2mu7v71q1bnvdjPAUWkTcYDLdv3z548KBWq10QaYm2KioqLl26JD65AEGQIAg8z4unXC7XSy+9tCDCHhoaunjxouf8LDc398qVK1u2bPG+aRJvwTCckJBw9OhRt9vtcDiOHTt2\/vz5oaEhl8sltrSzs\/PAgQPT4lJbW3v16tXLly+fP3++vb3dZDKJG\/P09\/efP3++s7NzfHw8JydHLpeLc6\/ExMTm5ubnnnvuyJEjvb29TU1NnvNF0W0w3wrncerhtgPeehiT8ClZBrzl\/WjrpSSGYeL9JC\/l5xVDUdRkMnleSPNWmSZw4sSJkydP2u12FEVlUwlFUbfbPT4+PjIyMk147sPu7u7JycmYmBjVg1RVVXXp0qW4uLi5Ky7iLAzDzc3NhYWFi6i70CqAt8JnVPKmpZ6XG3guwxvEVpJMOPLWQkfMAMgLgnDw4MGzZ892d3cXFhbu3Lmzp6fn3Llzvb29Mz4UPodL5eXlr7766rTHRsbHx6X53Bx1F3RKpVJlZmYePXpUp9MtqOLihAFvraRxZ+ltAby1dAyXrwbAW4sbRX1fS61W79ixo62tbXAq7dmzJysraxEvmfE8X1dX1+SRGhsbs7OzH155W2IbWJatr6+PjY1doh4vq2MYtmHDhuV7pQHPfYhAZGSk5\/1pDMMiIyN9qB+oCnEEAG95OWwGSAxFUZqmKYry\/kGMAHkWbDPyqQSoK8QHlAC4FxkZiSCI9J6++GomgiCAugIAfoiYALwV7PEY2PcaAblcjoIEEEBRT9ISuw\/oG2HVLwBveT1qAkGAAEAAIAAQCAEEAG+FQBCACwABgABAACDgNQKAt7yGCggCBAACAAGAQAggAHgrBIIAXAAIAAQAAgABrxEAvOU1VEAQIAAQAAgABEIAAcBbIRAE4AJAACAAEAAIeI3Afd7atGnTxo0bn5olRUZGbtiwYf369evWrVuzZs2TcyZRbO3atRs2bNgEEkAAIAAQAAgABHyNwH3e2jCVZuOj9VNp3bp1a6eSKAx+r1QExP85VmrrQLsAAgCBFYDAgtcJvZ7JAcFlicC6devm9VucoIsT8WnCMAyjKKpUKsVNfXEc9\/wu1zRhcAgQAAgABBaBAOCtRYC2kqt4w1sbN26MjIxcv379mjVrpmGBYRhJkhAERU4lHMcJggDUNQ0lcAgQAAgsBQHAW0tBbwXWXSJvEQSxefPmNQ\/SunXrcBz33AJ1BUIGmgQQAAgEFgHAW4HFO+StLZG3SJJ8wFkf\/d20aZP0VUlYBstVCKLBEApDKDzYPxiixWQqBJbBIR8W4CBAACDwZwQAb\/0ZC5CDIMgnvPWUbD23DYFUG9asWSPxllyFqGIpZpeZb3XpO6L1ncH\/4VvdTJmFiKflBAKiDxAACCwXBABvLZdIBchPn\/CWbqu85Z47pun+3EvkLYREqTyDfm9UKNDVdB\/2RtFFJkSDBghiYAYgABBYGgKAt5aG34qr7RPesu1S7vtFXNbTOpG3lIRSs50XSct1IOXIzROvv\/Pl1+996flvXisdrxVZpOKZhrtvf6HqbJO+MzrlyI4r33r59Xe+fPt7rw3eGIkbyDh6+9T9Kg9+Wi\/vu\/v250tO77b3Ju99vvflb9966Vsv7z7X4u7bOnTrZPvkflN3vL4z2nkg5fDN42KtV+99sfvF\/i1Hck7cOX37rVef+8pkxnCRJ4FpcwUYAQuGK65DgwatRAQCxFsEQTQ1NZ0+ffr48eNxcXGLRtJsNnd2dqLozP8akyRZX1\/v8w\/SL9rb5VjRS97asGGD+B76tDaK97fsZap9v4jPHuNE3tLYGV2tXSSJmP6057\/20tPnnk7KSR44fuiL3\/7ylp4sfWf05Deu\/vzDn4+9cIYsETJHdt57752Gjsb8qoLPf+0LHc\/0ZA4VJhWlvHL3xnNXLsakx9lSHD\/9xU931BZUHav\/5v95o\/5gc\/fhfW\/\/6F7pkaor37jW3r+XKjbqO6OjD6ZOfu3F0xdOJ+YkR6fFmpIth84O3f7m3bz6wsnrz9\/+xl1TS4xEXVyTU2EhpObIZLK8vLxLly6dnkrJyckYhhUVFdlsNrvdfuTIEUnSZrMNDw9Lh3NnCIK4du2aJKNWqwcHB6VDMYMgSG5u7o4dO6RyFEV37NgxOjp6+vTpjIwMqXxapry8vKCgYFohOAQIrDwEAsFbcrm8oqKiuLhYLpfr9fru7m6e57VarUwmg2GYJEmFQqHRaCiKIgiCJEnx8TOaphEEkclkJEmyLCs+XW2xWPbv369QKLRarUajYVlW\/JK9QqFgWdZsNu\/Zs8fhcGAYxkwlHMcRBBFtiVZWXgh92yJ\/8Baz1cC3uT15q2uwm841xHemvfH3b2Y25bo7kt9+\/52br9\/6\/Ne+YN7lzhwuuvfeOxnF2901iZdef77zULeu0kbXWK5+9eWh08dkW4i4jm0\/\/dUHxY2lY9fPDJ46jLiVZKlw5NJwVt2OS69Oth1o0+40fMRbX33x0IlB+64Y554kW2v8+J2zJ8+OWvJcCR1p2+t3qNJYrv0jx\/j2KDKFlcCUyWQFBQXFxcUQBKnV6rNnz0qd0+l0jo6O0lMJRVGHwzE2NiYdQhCkVCpZlqUoCkVRBEFomtZqtQzD4DhOkuTt27c9reh0OhiGVSoVRVEMw9A0jaJoQUFBfn4+giAsy8rl8sTExNbWVo1Go1Aojhw5smXLFplMJl4yKpVKzDMM09DQUFxcPO2SUSgUDMOo1eqHv7UouQEyAIHAI6BWqwsLC6Ojo6X3ZFAU3b59e3Z29tzOaDSaQPCWVqttampyOBwQBCEIYrfbHQ7HgQMH1Gq1QqFobm7Oysrq6+trbGzctm1bdXV1WloajuMjIyM0TRuNxpaWlj179rS3t+M4LvKWyWQ6fPhwWVlZR0dHfX29VqstLy\/v6upqbm7u7++PiooqKChom0pFRUV6vb6rq8tms9XU1FRVVUkYzQ1N2J71B2\/pMs3SgxjifOva7WsDl45cf+Pm5M0X+FRTzWjzvfe+r481fv27Xy\/uKU8byLv33jtXXnnx+ldfeeMHb6btyiQKeX1n9PU3bx49fQzLorcczvnphx\/sai6\/eOdyx0AXma\/nO6K4PS7DLsflz78wjbe+9sbXJv\/u+Yt3JxytCTuGS5+7PfHCnRdH75xJP5hP7bbwez\/iLX1ntCZTL8Vd5K3a2lqe551O5\/Hjx1mWbWpqio2NdTqdExMT9fX1PT0927Ztc7lck5OTdXV1+\/btS0tLIwiiubm5ra2tvb09JSXF6XSeO3euoqJi\/\/79O3bsoGnak7domn7++ecxDCspKdm3b19jY+Pw8LDBYCgoKCgqKsrMzOzr61Or1Tt37szLyxN9S05O3rt3L03Tvb29TU1NKSkpZrNZ7PwjIyPFxcWCIEiXjFKpTE9PHx4ezs3NFf\/zkxoIMgCB4CJAEERDQ8Po6Gh8fDwEQRiG5eXljY+P5+bmzu1Ya2trIHiLZdmGhgaLxSJ5o9PppvHWwYMH9Xo9DMOJiYnV1dVxcXFtbW0wDBcXFw8MDGRmZo6Pj7vdbom3RkZGCIKgabqtrW379u2iNoqiurq6srKyhoeHCwsLCwoKjhw5wjBMcnJyb2\/v4OCgRqORfACZGRHwF289eHpQ5K1X7t7Yd2R\/bWe9fbtbkUqdfe3i9\/\/xB3sHOt\/+x3uHzgyl7dtx7713Dh0\/1Hqw7eW7L1ftq9U3uB7mrZKmXc\/cONd7rI\/ZZdF3RDdd6ip8uvLKN65N463Rs6eSy1ITqrbSOYacYyWpvTtyuoqeffHsy1+54WhNlNYJ9R3RmkxewkQmkxUWFg4PD9fV1Y2MjOzZswfHcYm3zpw5g2FYYmJic3NzQkLC2bNnMQyLi4trbm5OS0sbHh5GUTQ6OrqxsTEpKWliYgJF0fj4+Lq6OqPROCNv7dq1q6ioSCaTdXd35+Xl7dy5c2hoqLe312QyYRhWVla2fft20TeXy9XX10fT9IEDB4xGIwzDeXl5ZWVlcrm8paWluLi4sLBwcHAwMzNzbGwsJiYmIyNjz5494N81KbIgEzoIMAzT1tZ2+vTppKSk3NzcsbGxsrIy6bWZ2fy02WyB4C2NRiPNt1AUjYqKcjqd03irp6eHYRgIgvR6fXV1dVdXV3Jyskwm2717d1tbW0pKSlZWFsdxEm8dPnxYXABsamoqLS1tbW3FMEytVjc3N+\/cubO\/vz8jI2Pr1q0pKSkivV28eLGzs3M2IEC5hIA\/eIvd9tA64aFuIo1VFXCaMuOWg9lf+v5XT50fa9nfOj5x5sWbL5UOVL79k3vx2YlsoWns1jNHx48JVc6HeSuvpmDPqY5bn79VeqS65VLXt3\/0vZK+ionXXxg8eTh5T1rasfztw0WTX33x6NixhLqtW3ozU\/qyT796duzGMzlHik9cf\/rL3\/qKIdeua76v+f5PexS5VSfhIM636uvrjUZjbGzsyZMnaZqWeOv48eMQBFkslvb29qSkpFOnTkEQZDKZ2tradu3a1dHRAUGQ0Whsbm5OSUk5e\/YsBEFRUVF1dXVms3lG3iopKcnJyYEgqLGxsbS0tLi4eGxsbHBwkCRJBEGKioqk+daWLVva29tpmu7u7uY4TiaTlZWVZWZmQhBUXV1dXFxcVVUlTvWysrJ4nk9LS2toaJDaBTIAgZBCQKvV7t27d3Jy8sKFC2VlZSqVyhv3AsFbMpmsvLy8pKQEQRBBEHp6esxm86FDhziOE+9LZ2VlSbyFYVh5efnp06c5joNhePv27U1NTRiGibOxGXkrIyPj8OHD4i2Evr6+rVu3Dg4OCoKAoqh482D37t1FRUUnT5602+3egBLOMv7gLa2T1dU7PO9v7e3v0BYZxMXDhosdb\/7Dd2g3p8piUztyvvTGlztP7nvrH\/4+ITuRrbYeuXF84uqEqez+K1\/T1gmzqnLNNdFHJkfe+Ps3v\/uj77UNd5Ix9KXXJt\/76XvvfvDuj3727oXPT1z6wuQ\/ffBP4uHw9dHM\/sLn77x478fvvPHDN3e27droQnUtH\/EW1+xU2O7vUCUmz\/tbMAyPjY2ZzWaJt5577jmCIFJTUxsbG+Pj4y9fvkwQxJYtW5qamlwu13PPPadUKlNSUmpra+Pj4yXeqq+v94a3du3aJd5aa25urqqqgmE4Pj6+ra1Nq9UqFIrh4eGkpCSJt2AYzs7Orq2tRVF03759xcXFaWlpra2tOI7zPC+TyQBvPQgp+BuiCGAYtnv3bvGGrpcuBoK3IAhSqVQ1NTUjIyOHDh1yu90QBKWkpIyMjBw8eLChoSE1NbWlpYWiKNHplJSUiooKpVIJQRBJkmLF\/fv34zhuNBpbW1sFQeju7pbL5Wq1urKy0mq1pqenj46O9vf319XVWSyW6OjooaGhY8eOlZaWOhyOtrY2kiRjY2P37t2LIOAN07n6hj94S0kqtbmCvuOjl7eYBtsGm0xVwElrdGiGdr2wSTxUFfJPmiFVvu5xzXptlZlrc0HxCjhRpe+IZpscTznlilxW3xlN11rWcE9pyo1sk0OWpFrDbHjSuJko1jP1tg1W2ePq9Y+r1z\/BbEC2kpF2+UeHbKQil1WXGyNtsie0GyLtck2FSfKBLjbBiEyCRiaTZWVlSQ\/1dXV1xcXFVVZWulwuq9V64MCBvr6+Q4cOOZ1O6XBwcNDtdov\/bB0\/fnz\/\/v1Wq9VkMh07dgyCILvdXlZWJgjC5OTkyFTq7e11u91jY2Moiubm5qanp0MQVFFRkZ+fn5WVlZmZSRDEiRMnTCYTiqLZ2dlDQ0MjIyNpaWkQBIn3jMUlCoqi9u7de+zYsc7Ozh07dqhUqurq6pGRkd7eXqVSmZycXF5eLrULZAACKwCBAPHWCkAqTJrgE96ylX7s\/S2FQoFoMabULFGXxBYhkemIYiutKI2HSYhBMwECyx0BwFvLPYI+9t8nvMUkyZq+53LXEtJ+GfcfJdWg6m06tsrK7\/nzI3zB5K2OaH6Pm62yqdM4RIv5GEegDiAAEPAbAoC3\/Abt8lTsE96K3LxOEw1vwp705C0IgmA5jNI4ZlThZgK3kEH+MROYUYUwOIz+eXlweQYNeA0QCC8EAG+FV7znba1PeMtzS3hpX915TQMBgABAACDgDQKAt7xBKYxkls5ba9eu9eStzZs3z\/tCRhjhC5oKEAAILBkBwFtLhnBlKVgib4lfNxa3LlyzZk1kZKRSqZxtP8mVhRxoDUAAIBAgBABvBQjo5WJmibyFoqhKpUJRVDaVlFMJhsE+68sl\/sBPgMAyQADw1jIIUiBd9Ia3Nm\/evGnTpo0bNz711FMP+yaXy1EUxaYSgiCAtB6GCJQABAACS0HgPm+t8yKtfZC8kAUiyxiBtWvXLmPvgesAAYBAGCAA5ltLYf0VWNeb+ZbY7M1TaQVCAJoEEAAIhDYCgLdCOz4B984b3tq4cWNkZOT69evXrFkTcAeBQYAAQCDcEQC8Fe49YFr7F81bcrlcoVCID2KA394ggGEYuPk3rfuBQ4CANwgA3vIGpTCSWRxvIQii0WhwHN8AkncIbN68mSRJcfPoMOpeoKkAAV8gAHjLFyiuIB2L4y2VSoVh2KOPProKJO8QWL169YYNG9RqNZhyraCrBzQlQAgA3goQ0MvFzOJ4iyTJNWvWrFq1ikrZ6GpUeDd0h4TF3jQAAAeySURBVLvU6tWrVSoV4K3lcmkAP0MHAcBboROLkPBk0bz1xBNPrFq1qvP9mLxL+mmM9JnPfGb16tXTCsHhqlWrAG+FRKcHTiw3BALEWyqVKiEhIT09PSkpad41fQRB4uLi5vhgM4qi0dHRGRkZW7dupWl6uWEe0v56z1viZk5iY0iSFHnr8B+3ePLW2rVrd+7cWV5ejiCIJ1HJ5fLMzMycnByKojzLwy0PeCukLwbgXKgiEAjegmE4JyenoqIiNTW1srKyqKhobjRUKtX+\/fsFQZhRDIbhtLS0mpqatLS0oqKi6upqgiBmlASFi0DAS97asGGDl7xVUVFx7do1p9MpcdITTzyxb9++qqqqoqKiw4cPy2Qy6VS4ZQBvLaKLgiorAwEcx10ul\/SZe7FRRqPRbrfP28BA8BaCIM3NzVu3boVhmKIoMeNyufbv39\/X1xcXFwdBkMvl6unpGRgY2LZtm8RbIuH19\/dXVFRI5ESSZGtra1RUFARBarU6JyfH7XY3NjZiGKZUKouLi5OSkhoaGvbs2ZObm1tSUmKz2SAI6unpYVmWJMny8vL+\/v68vLx5oQlPAd\/y1qpVqzZv3jw0NOTJWxqN5vTp03K5fO3atYcOHYqPjw83upLaC3grPK8y0GoIgrRabXd3d1dXF0mSIiBms\/no0aO7d++eF59A8BYEQXFxcWNjYw0NDRzHiXwzMDBgMBgYhunv79dqteXl5RzHqdXqo0ePGo1Gcb5lsViOHTumUqlaWloSExPFxnAc19zc7Dkb4zhuYGBAoVCQJNnU1JSZmTk8PMzzPIIgeXl5BQUFPM8fP35cJpNlZmbW1dUplcrR0VGdTjcvOmEoEADeMhgMTz\/99KZNmz73uc\/19vZu375dGsfDLQN4KwwvMdBkCYHo6OgLFy7s27cPgiCGYUamEsMwksBsmUDwFgzDKIpqNJqsrKyhoaG8vDyn09na2ipetAqFAkEQh8ORn59fUVExMjLidDpF3iouLj59+nRTU9OhQ4eysrLENuh0upaWFoPBAEGQTCZTqVQGg2Eabx08eFDkcLfbXV1dvWvXroKCAhRFGxsbjx492tTUNDIyEhsbOxso4VweAN4SBMGTtzIyMsKNrqT2At4K52sNtB2CoMTExAsXLvT09AwODg4PD5vNZm9gCQRvKRSK1NRUkWkcDsehQ4csFktnZ6dWq8UwLCoqymAwHDhwYNu2bTExMcPDwxJvpaen9\/b26nQ6QRCkdUKlUtnU1JSUlATDME3TxcXFTqfz8OHDBEFotdqOjo7MzEyJtyiKqqqqOn78uCAICIKUlpZWVVWxLGsymTAM8wagcJMJAG8plcpnn30Wx\/F169YNDw9HRUVJ43i4ZQBvhdv1Bdr7MAJJSUnj4+OHDx\/25s6WWD0QvIUgSEZGRn19fWVlZWNjY15eHo7jJSUldXV1NTU1paWlHMe1tbXV19eXlpYePXo0KipKnG9pNJq2trbq6uqKigrPyWNsbGxDQ0NlZWVdXV1+fj5BEHV1daL+np4eT96Sy+U7d+7cv3+\/OEA4HI6WlpaqqqqKigoEQR5GEJT4lbcQBElPT\/\/sZz9bW1s7MDDQ29u7b9++yMjIcKMrqb2At8AVBxCAIMhqtXre+pkXk0DwFgRBOI4LgmCxWIxGI47jEASpVCrzVCIIAoZhnU5nsVj0er0gCEqlkud5cT5E07RYy3N6JJfLOY4Ty8Wn6tVqtXgo3iTT6\/UymUxsvEajYRhGPJQqGgwGSWBejMJKYIm8deg\/kz2fg1+1atWjjz6qVCrXrVu3atWqNWvWKBT330p+8sknOY7T6\/WbN2+WBvEwzADeCquLCzTWVwgEiLd85S7Q428Elshb+Zf103grDNnI+yYD3vJ3fwb6VyQCgLdWZFgX36jF8RZBEOKM6pHHVq+DHvN+4A5nyc985jPiYsPiowVqAgTCEgHAW2EZ9tkbvTjeUk6lz33uc+HMQwtq+yOPPLJp0yawr+7sPRGcAQjMigDgrVmhCc8Ti+MtuVxOkqRKpZKB5B0CKIqq1WrxXm949jTQaoDAohEAvLVo6FZmxcXxlvguHYIgKEheIyCXy8Fm8CvzKgKt8jMCgLf8DPByU79o3lpuDQX+AgQAAssVAcBbyzVyfvLbS96KjIx88skn165d6yc3gFqAAEAAIDAbAvd5a+PGjU899VTkLGnDhg1PPvnk+vXr165du2bNmo0grWgE1q1bt6LbBxoHEAAILHsE7vPWLIQFigECAAGAAEAAIBByCHy0TjjbdAyUAwQAAgABgABAIKQQALwVUuEAzgAEAAIAAYDAPAgA3poHIHAaIAAQAAgABEIKAcBbIRUO4AxAACAAEAAIzIMA4K15AAKnAQIAAYAAQCCkEAC8FVLhAM6sEARIkoyPjxc\/ug3DsNvttlqtK6RtoBkAgWAjAHgr2BEA9lciAhaL5dy5c\/n5+eIn3yYmJsrKylZiQ0GbAAJBQADwVhBAByZXPAIKhaKpqenSpUt2u318fPzZZ5\/lOG7Ftxo0ECAQGAQAbwUGZ2Al7BAwm80nT56cnJy8efNmampq2LUfNBgg4DcEAG\/5DVqgOLwRgGE4IyPjpZdeamhokMlk4Q0GaD1AwJcI\/H\/DpZt4CeXiCAAAAABJRU5ErkJggg==\" alt=\"\"><\/p>\n\n\n\n<p>We create an attribute called <code>RibbonOffsetBias<\/code>, and set the CurveIndex to RibbonLinkOrder to create the curve. As shown in the image, we create a curve where the value is 0 at RibbonLinkOrder = 0 &amp; 1 and 1 at RibbonLinkOrder = 0.5, resulting in a &#8220;mountain-shaped&#8221; curve. This way, the positions at both ends of the Ribbon stay fixed, and we can offset the Ribbon toward the center.<\/p>\n\n\n\n<p>Using this coefficient for inflation, RibbonLinkOrder, and the Start\/EndPosition and Start\/EndNormal values obtained from the Mesh, we can now place the Ribbon. Here\u2019s how we do it:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"315\" src=\"https:\/\/heyyocg.link\/wp-content\/uploads\/2024\/08\/image-38-1024x315.png\" alt=\"\" class=\"wp-image-1414\" srcset=\"https:\/\/heyyocg.link\/wp-content\/uploads\/2024\/08\/image-38-1024x315.png 1024w, https:\/\/heyyocg.link\/wp-content\/uploads\/2024\/08\/image-38-300x92.png 300w, https:\/\/heyyocg.link\/wp-content\/uploads\/2024\/08\/image-38-768x236.png 768w, https:\/\/heyyocg.link\/wp-content\/uploads\/2024\/08\/image-38.png 1360w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>First, we linearly interpolate (Lerp) between the StartPosition and EndPosition using RibbonLinkOrder. This process alone will create a Ribbon that connects the Start and End Positions with a straight line.<\/p>\n\n\n\n<p>Next, to apply the inflation, we use spherical linear interpolation (Slerp) between the StartNormal and EndNormal to determine the direction. We then multiply it by a value called <code>Push<\/code> to calculate the offset, and add that to the position calculated earlier, resulting in the final inflated position.<\/p>\n\n\n\n<p>To clarify the difference between Lerp and Slerp: Lerp is linear interpolation, which is used when you want to connect two values along a straight line, while Slerp is spherical linear interpolation, which is used when you want to rotate between two directions (vectors).<\/p>\n\n\n\n<p>In this case, to prevent the Ribbon from intersecting the Mesh, we inflate the Ribbon by rotating between the normal direction of the Mesh at the start point and the normal direction of the Mesh at the end point. This approach works well when using Slerp for the transition in RibbonLinkOrder.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"568\" src=\"https:\/\/heyyocg.link\/wp-content\/uploads\/2024\/08\/image-31-1024x568-2.png\" alt=\"\" class=\"wp-image-1415\" srcset=\"https:\/\/heyyocg.link\/wp-content\/uploads\/2024\/08\/image-31-1024x568-2.png 1024w, https:\/\/heyyocg.link\/wp-content\/uploads\/2024\/08\/image-31-1024x568-2-300x166.png 300w, https:\/\/heyyocg.link\/wp-content\/uploads\/2024\/08\/image-31-1024x568-2-768x426.png 768w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>Finally, the amount of inflation controlled by the Push value is calculated by multiplying the RibbonOrderBias and the maximum offset value for the inflation.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"437\" height=\"130\" src=\"https:\/\/heyyocg.link\/wp-content\/uploads\/2024\/08\/image-39.png\" alt=\"\" class=\"wp-image-1416\" srcset=\"https:\/\/heyyocg.link\/wp-content\/uploads\/2024\/08\/image-39.png 437w, https:\/\/heyyocg.link\/wp-content\/uploads\/2024\/08\/image-39-300x89.png 300w\" sizes=\"(max-width: 437px) 100vw, 437px\" \/><\/figure>\n\n\n\n<p>With this method, we can create a Ribbon that connects any two points on a Mesh. This is the foundational mechanism of the procedural lightning effect.<\/p>\n\n\n\n<p>Afterward, we can add some noise, animate the Ribbon, tweak shaders, and add particles to enhance the lightning effect, but I\u2019ll skip those details for now.<\/p>\n\n\n\n<p>Though I won\u2019t go into full details here, the complete data for this effect is available for purchase at the following link if you\u2019re interested.<\/p>\n\n\n\n<p><a href=\"https:\/\/heyyohanashima.gumroad.com\/l\/mycyh\">Procedural Thunder<\/a><\/p>\n\n\n\n<h1 class=\"wp-block-heading\">Conclusion<\/h1>\n\n\n\n<p>Although this might have been a challenging topic for some artists, VFX artists are increasingly able to create complex effects with tools like Niagara, Houdini, and VFX Graph without relying on engineers. Understanding mathematical concepts like normalization can be incredibly helpful when exploring these tools and creating even more compelling visual effects.<\/p>\n\n\n\n<p>Normalization is just one of many tools that can unlock new creative possibilities. If you\u2019re interested, vector normalization is another important concept commonly used in VFX, and diving into it can be very rewarding!<\/p>\n\n\n\n<p>(For those who want to check out the answer to the challenge problem, it&#8217;s: <code>Normalized Age = Age \/ Lifetime<\/code>.)<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Introduction This time, I would like to explain &#8220;Normalize&#8221;, which is commonly used when doing somewhat technical things in visual effect creation. \u203b By the way, the title is just an exaggeration as you know. I just wanted to give the title an interesting name&#8230; Normalization itself is a mathematical term and is a concept [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":1435,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_lmt_disableupdate":"","_lmt_disable":"","_mi_skip_tracking":false,"footnotes":"","_locale":"en_US","_original_post":"https:\/\/heyyocg.link\/?p=1348"},"categories":[17,31],"tags":[28,30],"modified_by":"yohanashima","_links":{"self":[{"href":"https:\/\/heyyocg.link\/wp-json\/wp\/v2\/posts\/1452"}],"collection":[{"href":"https:\/\/heyyocg.link\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/heyyocg.link\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/heyyocg.link\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/heyyocg.link\/wp-json\/wp\/v2\/comments?post=1452"}],"version-history":[{"count":2,"href":"https:\/\/heyyocg.link\/wp-json\/wp\/v2\/posts\/1452\/revisions"}],"predecessor-version":[{"id":1457,"href":"https:\/\/heyyocg.link\/wp-json\/wp\/v2\/posts\/1452\/revisions\/1457"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/heyyocg.link\/wp-json\/wp\/v2\/media\/1435"}],"wp:attachment":[{"href":"https:\/\/heyyocg.link\/wp-json\/wp\/v2\/media?parent=1452"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/heyyocg.link\/wp-json\/wp\/v2\/categories?post=1452"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/heyyocg.link\/wp-json\/wp\/v2\/tags?post=1452"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}