From 5aa83c67e7b8bc0b1ec7a5d7f4e2ed0bd4f37ce8 Mon Sep 17 00:00:00 2001 From: Digital Artifex <7929434+DigitalArtifex@users.noreply.github.com> Date: Sat, 18 Oct 2025 08:44:35 -0400 Subject: [PATCH] Added new manipulative shaders --- data/shaders/manipulative/ACII.frag.qsb | Bin 0 -> 4909 bytes .../Aberrating Aberrations.frag.qsb | Bin 0 -> 4770 bytes .../manipulative/Brannan Filter.frag.qsb | Bin 0 -> 6359 bytes .../shaders/manipulative/Chroma Blur.frag.qsb | Bin 0 -> 3392 bytes .../Circle Dither (Color).frag.qsb | Bin 3552 -> 3717 bytes .../manipulative/Circular Pixels.frag.qsb | Bin 0 -> 3346 bytes .../manipulative/Color Invert.frag.qsb | Bin 0 -> 2470 bytes .../manipulative/Color Reduction.frag.qsb | Bin 0 -> 2594 bytes data/shaders/manipulative/Desaturate.frag.qsb | Bin 0 -> 2700 bytes data/shaders/manipulative/EGA.frag.qsb | Bin 0 -> 4578 bytes .../manipulative/Fake Thermal.frag.qsb | Bin 0 -> 3015 bytes data/shaders/manipulative/Gameboy.frag.qsb | Bin 0 -> 6808 bytes .../manipulative/Gaussian Blur.frag.qsb | Bin 0 -> 3377 bytes data/shaders/manipulative/Italic.frag.qsb | Bin 0 -> 3150 bytes .../manipulative/Median (Fast).frag.qsb | Bin 0 -> 9438 bytes .../manipulative/Melting Snow.frag.qsb | Bin 0 -> 4794 bytes .../manipulative/Mirror (Bottom).frag.qsb | Bin 0 -> 2462 bytes .../manipulative/Mirror (Left).frag.qsb | Bin 0 -> 2461 bytes .../manipulative/Mirror (Quad).frag.qsb | Bin 0 -> 2558 bytes .../manipulative/Mirror (Right).frag.qsb | Bin 0 -> 2463 bytes .../manipulative/Mirror (Top).frag.qsb | Bin 0 -> 2460 bytes .../manipulative/Modulo Dither.frag.qsb | Bin 3183 -> 3349 bytes .../manipulative/Nearest Neighbor.frag.qsb | Bin 0 -> 5461 bytes .../manipulative/Night Vision.frag.qsb | Bin 0 -> 3660 bytes .../manipulative/Oil Painting.frag.qsb | Bin 0 -> 5232 bytes data/shaders/manipulative/Old Memory.frag.qsb | Bin 0 -> 9788 bytes .../manipulative/Perlin Noise.frag.qsb | Bin 0 -> 4247 bytes data/shaders/manipulative/Pixelation.frag.qsb | Bin 0 -> 2710 bytes data/shaders/manipulative/Posterize.frag.qsb | Bin 0 -> 2864 bytes data/shaders/manipulative/Quadtree.frag.qsb | Bin 0 -> 5971 bytes .../shaders/manipulative/Radial Blur.frag.qsb | Bin 0 -> 3220 bytes data/shaders/manipulative/Rain Drops.frag.qsb | Bin 0 -> 5054 bytes .../manipulative/Rainbow Filter.frag.qsb | Bin 0 -> 4108 bytes .../Randomized Transitions (x2).frag.qsb | Bin 0 -> 111779 bytes .../manipulative/Ripple Distortion.frag.qsb | Bin 0 -> 3499 bytes .../manipulative/Scatter Blur.frag.qsb | Bin 0 -> 2932 bytes data/shaders/manipulative/Sepia.frag.qsb | Bin 0 -> 3276 bytes data/shaders/manipulative/Soft Blur.frag.qsb | Bin 0 -> 4870 bytes data/shaders/manipulative/Solarize.frag.qsb | Bin 0 -> 3413 bytes data/shaders/manipulative/Stone Man.frag.qsb | Bin 0 -> 6868 bytes .../manipulative/VHS Tape Noise 2.frag.qsb | Bin 8279 -> 8608 bytes .../manipulative/VHS Tape Noise.frag.qsb | Bin 4893 -> 5086 bytes .../manipulative/Video Artifacts.frag.qsb | Bin 0 -> 5223 bytes .../manipulative/Video Bubble.frag.qsb | Bin 0 -> 10733 bytes .../manipulative/Video Glitch 02.frag.qsb | Bin 0 -> 6011 bytes .../manipulative/Video Glitch.frag.qsb | Bin 6442 -> 6701 bytes data/shaders/manipulative/Video Wall.frag.qsb | Bin 0 -> 4939 bytes .../manipulative/Water Ripples.frag.qsb | Bin 0 -> 4693 bytes data/tools/stc.py | 14 +- tools/src/manipulative/ACII.frag | 102 +++ .../manipulative/Aberrating Aberrations.frag | 53 ++ tools/src/manipulative/Brannan Filter.frag | 89 +++ tools/src/manipulative/Chroma Blur.frag | 21 + tools/src/manipulative/Circular Pixels.frag | 34 + tools/src/manipulative/Color Invert.frag | 16 + tools/src/manipulative/Color Reduction.frag | 14 + tools/src/manipulative/Desaturate.frag | 40 + tools/src/manipulative/EGA.frag | 73 ++ tools/src/manipulative/Fake Thermal.frag | 18 + tools/src/manipulative/Gameboy.frag | 129 ++++ tools/src/manipulative/Gaussian Blur.frag | 27 + tools/src/manipulative/Italic.frag | 14 + tools/src/manipulative/Median (Fast).frag | 132 ++++ tools/src/manipulative/Melting Snow.frag | 51 ++ tools/src/manipulative/Mirror (Bottom).frag | 14 + tools/src/manipulative/Mirror (Left).frag | 14 + tools/src/manipulative/Mirror (Quad).frag | 15 + tools/src/manipulative/Mirror (Right).frag | 13 + tools/src/manipulative/Mirror (Top).frag | 14 + tools/src/manipulative/Nearest Neighbor.frag | 68 ++ tools/src/manipulative/Night Vision.frag | 25 + tools/src/manipulative/Oil Painting.frag | 97 +++ tools/src/manipulative/Old Memory.frag | 181 +++++ tools/src/manipulative/Perlin Noise.frag | 47 ++ tools/src/manipulative/Pixelation.frag | 17 + tools/src/manipulative/Posterize.frag | 34 + tools/src/manipulative/Quadtree.frag | 147 ++++ tools/src/manipulative/Radial Blur.frag | 31 + tools/src/manipulative/Rain Drops.frag | 57 ++ tools/src/manipulative/Rainbow Filter.frag | 36 + .../Randomized Transitions (x2).frag | 710 ++++++++++++++++++ tools/src/manipulative/Ripple Distortion.frag | 37 + tools/src/manipulative/Scatter Blur.frag | 23 + tools/src/manipulative/Sepia.frag | 38 + tools/src/manipulative/Soft Blur.frag | 64 ++ tools/src/manipulative/Solarize.frag | 35 + tools/src/manipulative/Stone Man.frag | 121 +++ tools/src/manipulative/Video Bubble.frag | 243 ++++++ tools/src/manipulative/Video Wall.frag | 93 +++ tools/src/manipulative/Water Ripples.frag | 78 ++ 90 files changed, 3074 insertions(+), 5 deletions(-) create mode 100644 data/shaders/manipulative/ACII.frag.qsb create mode 100644 data/shaders/manipulative/Aberrating Aberrations.frag.qsb create mode 100644 data/shaders/manipulative/Brannan Filter.frag.qsb create mode 100644 data/shaders/manipulative/Chroma Blur.frag.qsb create mode 100644 data/shaders/manipulative/Circular Pixels.frag.qsb create mode 100644 data/shaders/manipulative/Color Invert.frag.qsb create mode 100644 data/shaders/manipulative/Color Reduction.frag.qsb create mode 100644 data/shaders/manipulative/Desaturate.frag.qsb create mode 100644 data/shaders/manipulative/EGA.frag.qsb create mode 100644 data/shaders/manipulative/Fake Thermal.frag.qsb create mode 100644 data/shaders/manipulative/Gameboy.frag.qsb create mode 100644 data/shaders/manipulative/Gaussian Blur.frag.qsb create mode 100644 data/shaders/manipulative/Italic.frag.qsb create mode 100644 data/shaders/manipulative/Median (Fast).frag.qsb create mode 100644 data/shaders/manipulative/Melting Snow.frag.qsb create mode 100644 data/shaders/manipulative/Mirror (Bottom).frag.qsb create mode 100644 data/shaders/manipulative/Mirror (Left).frag.qsb create mode 100644 data/shaders/manipulative/Mirror (Quad).frag.qsb create mode 100644 data/shaders/manipulative/Mirror (Right).frag.qsb create mode 100644 data/shaders/manipulative/Mirror (Top).frag.qsb create mode 100644 data/shaders/manipulative/Nearest Neighbor.frag.qsb create mode 100644 data/shaders/manipulative/Night Vision.frag.qsb create mode 100644 data/shaders/manipulative/Oil Painting.frag.qsb create mode 100644 data/shaders/manipulative/Old Memory.frag.qsb create mode 100644 data/shaders/manipulative/Perlin Noise.frag.qsb create mode 100644 data/shaders/manipulative/Pixelation.frag.qsb create mode 100644 data/shaders/manipulative/Posterize.frag.qsb create mode 100644 data/shaders/manipulative/Quadtree.frag.qsb create mode 100644 data/shaders/manipulative/Radial Blur.frag.qsb create mode 100644 data/shaders/manipulative/Rain Drops.frag.qsb create mode 100644 data/shaders/manipulative/Rainbow Filter.frag.qsb create mode 100644 data/shaders/manipulative/Randomized Transitions (x2).frag.qsb create mode 100644 data/shaders/manipulative/Ripple Distortion.frag.qsb create mode 100644 data/shaders/manipulative/Scatter Blur.frag.qsb create mode 100644 data/shaders/manipulative/Sepia.frag.qsb create mode 100644 data/shaders/manipulative/Soft Blur.frag.qsb create mode 100644 data/shaders/manipulative/Solarize.frag.qsb create mode 100644 data/shaders/manipulative/Stone Man.frag.qsb create mode 100644 data/shaders/manipulative/Video Artifacts.frag.qsb create mode 100644 data/shaders/manipulative/Video Bubble.frag.qsb create mode 100644 data/shaders/manipulative/Video Glitch 02.frag.qsb create mode 100644 data/shaders/manipulative/Video Wall.frag.qsb create mode 100644 data/shaders/manipulative/Water Ripples.frag.qsb create mode 100644 tools/src/manipulative/ACII.frag create mode 100644 tools/src/manipulative/Aberrating Aberrations.frag create mode 100644 tools/src/manipulative/Brannan Filter.frag create mode 100644 tools/src/manipulative/Chroma Blur.frag create mode 100644 tools/src/manipulative/Circular Pixels.frag create mode 100644 tools/src/manipulative/Color Invert.frag create mode 100644 tools/src/manipulative/Color Reduction.frag create mode 100644 tools/src/manipulative/Desaturate.frag create mode 100644 tools/src/manipulative/EGA.frag create mode 100644 tools/src/manipulative/Fake Thermal.frag create mode 100644 tools/src/manipulative/Gameboy.frag create mode 100644 tools/src/manipulative/Gaussian Blur.frag create mode 100644 tools/src/manipulative/Italic.frag create mode 100644 tools/src/manipulative/Median (Fast).frag create mode 100644 tools/src/manipulative/Melting Snow.frag create mode 100644 tools/src/manipulative/Mirror (Bottom).frag create mode 100644 tools/src/manipulative/Mirror (Left).frag create mode 100644 tools/src/manipulative/Mirror (Quad).frag create mode 100644 tools/src/manipulative/Mirror (Right).frag create mode 100644 tools/src/manipulative/Mirror (Top).frag create mode 100644 tools/src/manipulative/Nearest Neighbor.frag create mode 100644 tools/src/manipulative/Night Vision.frag create mode 100644 tools/src/manipulative/Oil Painting.frag create mode 100644 tools/src/manipulative/Old Memory.frag create mode 100644 tools/src/manipulative/Perlin Noise.frag create mode 100644 tools/src/manipulative/Pixelation.frag create mode 100644 tools/src/manipulative/Posterize.frag create mode 100644 tools/src/manipulative/Quadtree.frag create mode 100644 tools/src/manipulative/Radial Blur.frag create mode 100644 tools/src/manipulative/Rain Drops.frag create mode 100644 tools/src/manipulative/Rainbow Filter.frag create mode 100644 tools/src/manipulative/Randomized Transitions (x2).frag create mode 100644 tools/src/manipulative/Ripple Distortion.frag create mode 100644 tools/src/manipulative/Scatter Blur.frag create mode 100644 tools/src/manipulative/Sepia.frag create mode 100644 tools/src/manipulative/Soft Blur.frag create mode 100644 tools/src/manipulative/Solarize.frag create mode 100644 tools/src/manipulative/Stone Man.frag create mode 100644 tools/src/manipulative/Video Bubble.frag create mode 100644 tools/src/manipulative/Video Wall.frag create mode 100644 tools/src/manipulative/Water Ripples.frag diff --git a/data/shaders/manipulative/ACII.frag.qsb b/data/shaders/manipulative/ACII.frag.qsb new file mode 100644 index 0000000000000000000000000000000000000000..c7b69416cf5378f8dd05b056c34cba4e9f1ea990 GIT binary patch literal 4909 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 literal 0 HcmV?d00001 diff --git a/data/shaders/manipulative/Aberrating Aberrations.frag.qsb b/data/shaders/manipulative/Aberrating Aberrations.frag.qsb new file mode 100644 index 0000000000000000000000000000000000000000..c2d0c21c7aba35585dfcafb925439f9eb0da0bed GIT binary patch literal 4770 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 literal 0 HcmV?d00001 diff --git a/data/shaders/manipulative/Brannan Filter.frag.qsb b/data/shaders/manipulative/Brannan Filter.frag.qsb new file mode 100644 index 0000000000000000000000000000000000000000..680553d60ac378e2839976ad8a8881aec5b97b21 GIT binary patch literal 6359 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 literal 0 HcmV?d00001 diff --git a/data/shaders/manipulative/Chroma Blur.frag.qsb b/data/shaders/manipulative/Chroma Blur.frag.qsb new file mode 100644 index 0000000000000000000000000000000000000000..d67b0e0542e199641ef1724fac0e0a3868224b70 GIT binary patch literal 3392 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 WgglQ1{@{!H!x~+G=Hovv1`8arTe%Sc literal 0 HcmV?d00001 diff --git a/data/shaders/manipulative/Circle Dither (Color).frag.qsb b/data/shaders/manipulative/Circle Dither (Color).frag.qsb index cf8c78b929241304c90d83acb6c9afbfc2581648..887524528a988328619db83e2f6f9a5521544cda 100644 GIT binary patch literal 3717 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 aJoe{3eeAhE@Mk~z&nrTI?D221_UxJ=)eFr4 diff --git a/data/shaders/manipulative/Circular Pixels.frag.qsb b/data/shaders/manipulative/Circular Pixels.frag.qsb new file mode 100644 index 0000000000000000000000000000000000000000..62e1e761d3127b4eca63f9406f5976c8dd7ecfaa GIT binary patch literal 3346 zcmV+t4ejy(06n~Tob4OgavR5Sc!?H7U$T5V_F9)076f4z7a@w2EYg-_OQB5CR~QCf z0t<3&U>Dw9NT3`ga%9I=e8g4BLw+Jpc}b-zFL`#V`~#`{KweWhs!~b!Ob;+vEI`>M zyPPVlYsBqyx_f%2d&dRF*j~oiB#bc_kFa-G$jWSu*{sbLnFs&*tjaP#8;8OEOAm{A zP{Dpy0|AR|ap5`_7wUHv-NQCn3&a__3;xpk*nJAu44*()cnKy6LAe8VGPaL6&M4d+ z$pa*^%$gun0g;gH(4=RibG+p!ny>b4*D$;IzLS41s*CCTjAcw znJx|zdI*G8xkwXciHcnwBsSAC7i0IpSR3Z}Qb#YcyvdYcM)h8TC2p~x!`vLijJB@; zTfp<81^OL$bAd7e;|3GU+xI*IY>R9g407Q=3~ukLe9puoj>Y+NxKDVn1z!$RBp)Q~ z?^BAqL#NapixcY?F%*&U+Y>Prk%`+A$tofPeflcTH2tl1QFm(-)44oG3sO+HfV6u-?Ic;)upC?v_5h4q3{z=><8k71@P_y& zX%2)BF+4a#${~EX2cBR@n27IrpdBH(DGpC{;A!Glafj%y#ElW|jDi~{+>(NuAl!Kc zH%YjQ3T}#UmlfO|!mTN|X~Mm!;O-(^Q^D;e+zkbnAl&B)ZXe;kqPbjcT|CH#H3M}alfYxzNpWyQN{t&!j+%y;u1OGI| zagyUEd90>sAbl^<$BCXG+Fq`AipOW1Vw@nJ`$z_P<_Nx@a7f=z@safXOyn=(9t8LR z*@w?Df*&LpLF;+qjUK@gejFllfr-6|@-Gtp0@;i3OUk;ekbZUkHw5)L z39k$Gvl9Lhj4yxp#)5>)DD!afw1nS;@teQ=YCZ)J+HH|cnP_sowv@P`+}kjI|K!xd z0l+pC{5vpy`KQ01k}!5#fBxc&c?ky`zPKRg3rWT&n&f+r{7!+#==0AArw)wCM@;0^ zG{p?zTZEG_{Frn}_>&0yDZvHUZ|I|}OsM0ZfSDp*+=Dlixe&goz_>r(C-^y#!hQ5G z6MGN$*F5?52;n8qJn7_|5k>fh)61gn! z%V61F9#erkMt)*Gen2{plV0RmfC$`AIDEfB>o8B})(1?SJ4kz<;1XDiG5k3bZQV_Z z$vmBf9}-UL`%t0%g5ry`TLk|Hteb@)*XACw8PCNc@ZlQF&^yNeZd$W@l{HC6)@U{Y zpHX1k!{-zj_uOg(-sr6H9)2bmO3c-DHi;(rvI?KN);XemL~ETV*_^W01;S$vd`7q; z;ZIP^(u9-iQ=)jt+&CGN8*_x0xp9hcb4qS}MDxv)&Qr=93lv|OKc|Urfoz)X-~|73 z6#p6U6ydWp$6Z8|{$dZaNaH=iJx}~gr27ovP&b~L*w4JA%yo&@R>I#WTctnC#Dn

26oMVmrlkh8K!%dp=RpNPtVz7tLEp(nGy4>@x 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 GVdnt>sb^UL literal 0 HcmV?d00001 diff --git a/data/shaders/manipulative/EGA.frag.qsb b/data/shaders/manipulative/EGA.frag.qsb new file mode 100644 index 0000000000000000000000000000000000000000..b3e5f72fb5e3b17ca719f3f895cfaed0f7826327 GIT binary patch literal 4578 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 J`VZhi<)!%%E*k&< literal 0 HcmV?d00001 diff --git a/data/shaders/manipulative/Gameboy.frag.qsb b/data/shaders/manipulative/Gameboy.frag.qsb new file mode 100644 index 0000000000000000000000000000000000000000..6cb3b72abdd4974413248c9fa670bc992061322d GIT binary patch literal 6808 zcmV;J8fWDI0HT|Cob6o+m>k7*?$YXj73LI(%g`W@XV7Yy>6x9~Wp%-dLtGNlA~4H( znBARO4b09gbBGnPYz}ic+%Y(b!MTh{oSP)}7ZYqC1}ApngczT(W9-CQ#@hEbBnavKGoq$m?k9TB~kltr074&051& zMgCW{Car|TEs&S>Dn3@ohXfpM6(mE>no`Uq#jeG7WL<2HTMfx>SqI2(+>1jQ)j>*u zw(ugUq%MUQrJa_w6cig6wad8-ESs$v$uuEZ>eenO-C(Q>e!3;uh`gqyCp78CR;0@q z=|*{#r2HJ1&TGeXj&c>TZB@N7nl5a`bd+S;rdVdAmLS`fR%{3PbXnHH@)~K^@r|xr zBDu<9&J4=ENDgtss=357t%%9?t&*&!;-Vqt7v)`9V!GsYgQbVJ>2tIs8@6^xgUa$h za;|?=?zQwFim?8i(!|`_f@j+aG9N-5-XxS}M+~7Y!q}Qwl8j}++*lmO(ls}h6k}=G zr}=!A;Cs>ooixz3V8s&Z_)??wL)lf9zbrE*%+_qi8tyRf%bpX^Qdk+)MjuO z5Gi&cES%02X+W&ByzUSbN?i(0iqDmI1U~_qsePtJi9?4Rwa@akyQDv~f6tS+Vel3nT{5`-g zWNm{#LP}kr?Cnzgbbpk*Bfr`5S}y6Az>kDKQnn8Ojy|iW(amL+RH$DFl;#*^a~*G7~qdq^oy)xaeoXhW8aD3A)PjOPK1t= z&>zyVOj4Z+_)7VGD${)$bT5SNRgiNUboW5VD(EJfBzVZCA+#O92%oadB0=M+od(R< z-UnY3ea12mc8#a+L500xy`ewDmATMb5BnBk>^7jU0=_VF{Xn$OVq^a5vde8)~ z4Ul~rcu3Y+uyZ4PF^qmu`)t=g+KzLehv?4*ZVB2KGCf0RUli!~#o8^y2ERFgr#$e; zgHI2UA1;B9P26k+?In;;?QH@65%|4FjxF(C3fLfnZAW_qFp_r}XtzVx<>*&8>-!au zZFG&w>jy8+tTpW`<@K#^UbU`AwupBOG*{x=$jP!;A-=2R_0*Fa)|ob~nVxz2X;;oT zXma>Aawgf>5FafC?!05^def#Q%97TZ{1<0Nl_Ff#wWGvj*^+CCy?5*S;nA z7R<+WkhK=FD6i1EfpX6|kVUp^0(`S<5#RZMZDM183uImZx#z3zE|tG8z&+)pi*di% z(m99jDVJP^d-4yB)ml8iZWH<$KsfTvZ7Nn4D?i^Z?@xyhZv_vH<9mgM8F}wzxI2X& z1H#cbQ~Q5p4+i8#<41YN>;sl!{N94`q1^O#%Nrkh*1ZF;D_|qF#~6MB_$=_$9%uL+ zz)u2C?J0(z2EGV9wM!Tqvb7BS|4KW{YCLs6C?6b-ejKXerAx^>41GEReWLtPMW4)g z*FZN29d-ER5-FGP4Zth~U!vk`C*oij{0;Ph^3g1G7$41o-ssyE(06@6-)_JJ)AvrM zZx?8czCF-qe7*;z-2Aa>N8ZGw!s!yhJ+h zVr`lS_pmn6-xr|&0NP~Voowt$&fUxx_re#1y9aH$zYjb=m3I9i?4$3OB;Wn=`vLTW z@b3ry{qVsC`Ta|<=~3BlT9^I`VDzkeMbc3Fee${=yzgVY4}#as!H3Y_2icf@5OCA} zRrt}2->NHn<`MYO$axs;2he_i@%|QgZ;`-aV0q7wKLCws{~_qiGwY8)LvZtK zeALo$O4sdx{V`}CRpY!^!Tto}d;suwgZ58>yPN6#DD)b69|PS-(btc$zS@>o131a@ z=IY7l-zk=tzdvqybB|~qv;1@O6PAB&elmc6B7lD~fPX50|BU6&1>a_ET0efz@;^`h z9ClNDJcjllo>7lm`Z@I&@E-?^?#XVGH$Dkp()|+*{v?AxWqCQ{FW@KorkwG#{C)=h zB>bm=|Fq@B=3k<(CTIK=U?yi!`&06I8oZxkyq^WH$O!qfgAD%$l==c`v!;@%JAB>#m1ATf9?Pt(_hUxhy=rMWop8+#@ z^C`f1>{6VW=j6Xw-gENXXdBu8it#h;?^t?Hn>hYA(0m8Jd4c(caNm{JkD&9rOwRWq z*W~K|u=HI2zU9sB{{-Cdya?Tf=Lg_v+HL8yIuf4(f_xlb06h$x;MF;#vlft zQ=QD@^0z@o-12fcRmyoTw}d|zcL{$kUKqeH3g8z9@Jj;tLxew93!&|z{*rDXyj;CN zU{8Vl)2o2dJ=tY)GTCHu@*)Ob%-~Cem#YsD+7I+ixw>0^FU6jk@CN~ZknqOyEkgIj z#Q4EN!%VKG_JQ*12JeB4_fYVfd~=x4em_)rbN_Im;bbfM=x~NRLTJC4_A;Tz!Q`SN zg{C1m&9~*~3)w}uqvUlw>^h3sb+pjqYy5UJ({T)R7(X7v_>M(?%s3p&_>P0EW?ZOE zK3xv|$1~cu2Kse^(D7sXb)wKTC!k*^v3?QGme)y;Ycu;!X7*9PPG&k*F#AZ?3fO1l zoD{HkIoeCnUdr^G0zD?jo+>oV39uVF-{tThV!_>@% zM03q-jnHsYGg~V(Yz^iNeVKj0I-zB*WjfXiJ-%j-vO#FN^}^eGoGHA$#|FlG7I=;P zVWDZyLVqYuh8g`iLdOo_C`Qgp<|eE6swmD{p_Oo z_jaM5!33w=H7dN^MYt>EHH(~Z1+zB`-WTGHYYRRD9hF^mD zSr-~c9|LOuCKzldU=$}?Q1ib|XnvyKDRljt>{tyPJqJcH=CdqjcLiehdc=T<+1;SI zp2h4Qq2aqjVwUpW9*m2sKMGxkdnfDXyM>1He%=5W@8^wx@qXSUG(XYb80hCsfqv4r zsdvlILcH%lS~ghj=diD>*qN`^ij}gRauVI$6P0qUZtu)br0i@e?Tk8O_FB~(9gERd zEZLig_b5m#A#dYD-QBf%wJ}k*#~X$2-QBkQOy}xp``UW;qFlXNoE=iILaCCg6L9lP zZlYM<#i7NK;&i?VurXh%=X}s}s=4X>)?D3ByDc|8Q)1v^*^uhCv^8xPH@bM;zNpfu zd4QB%+?uadN{zbogireLj$FB%FOfl`=`qd#jK`<&d!$1eG47EWf+aaBH$dpuCER(4Yd3_{5J6x$$C#AMZqpp2WsOF}IE2T(r z)}5~vug{zN`i^S8wxd##NIATYJz1>p$XBz{2F*N`uV?GUQa-Cqi7DU&Nvri}DD7qw!z9meeq;r+BlytN`HJ+Uy+iNi+RE>%Y z&L-XA;;@8?XNumwfdMDg=L}|2iGjhvv@@7;lFq4E;t zKqlGO?>L!0VB2xWn-wRS;v_ix`v(V;$wWHo^bPjAf>Q(OR5I0{a#90*nN(k@pCend zhUj#d&c1YCVsIdl$)udY!M;qQFP$0aS0Xe03gx6yjw5@MOgnx31IfMWWQr+Nu1h5| zl627NchZ@}U`i|OPxU)}>A_@w#z|(RqO{a84}}OGrdI`q3R7QXWG9QYdagX7f-z+) zpa~Wo)P|tu#)=0~k>W~F%so8nBtbmLlkCKkZ02z~@i@&qsZKnpF~751R^_VkN~L6% z^Z7|~5l!O|2Pw!*PNq?*YC>m;aK}k}h|3jg+{?&?VzpM!7A0|l3)0|836}HRqps!U zgJ`mu9B?1KOn`PwC4EILzt-4k`L$|QT;X+pnC;AWwb3F5UTH4au}OQ)T4Pn*#dtF4 z!>mKMhQjcZE`HLF_k2+dLns41#2)u9U#jI>nBe-~ z;T4k2xFMQlOgptwoU~~>wP`vxm5(*Ar?W{cdEFItHpx<&S_)&&poiLt(Nep|j?r$R zmu*FQcgdx16L6N+#l+zSuwyrN()88~YNj`oe^*>DwgJHU+PD2tGEM4j>;I-jA zv&W>G54BA2FEp3KkY#!Gp<0`xrz!Oz69*wP`B zj(Gy)T#K3g*l4}jJ3B^yca6p6?4kX7hor+yPKW!xv6K0{g*hzCKvvwZozEP1)8Tx$N}&{RrH1gwN^y)LJE_c29vhjr3a;>-b5mk(4Rgh*_Tda(n+~d$z=Km zX+vaI+S-|tfi}BpGfNvr-61`>sS=`gEO9T4(>hrhmn7WY2PO{NX}g>XJB0d)$t|Jt z#pqxh?s$0XBRydQI+VmsuGoQ zyX4a(HZG@ju{=dl9JdXb_J3&osEN(#%$5vcOLb;*LfF!s*-~ETN|lKmo_sQmhL@;9 zNu#<|RJV%iR#Dw5s#`^MtEg`E`V7LTZWYz7qPkU7w~FdkQQb<-=%U_bowqBgDbp=Z0VP1pU zO&u-t&d$!NE~-15iY*h;?S*_*6+H^Cms$B)iWQ2qhsv=ht_4OgtZt<&$`nnKm zuP7EE?_-NkCOAmtHy9pMMYI5ACX7xM*8+t7oG=AKZ?*)e2SWPfFU18I2E)XMmFNO| zNy=#yMFrr5k~%ciZ{v%}R&t(M(X zo@vy16~!-2Y92ZJ^5M;!w{A@6p$?I;xls=YVQQs>ZQHXWxvE?|xFWdmEPHYU%9TD4 z+jaV6%=!wLkQ-dA0BnkwXwJQi>FC6XB}2hi#iR$Jw{WHnhnv9i#%&{=3-=?qis_!Ng1I}7cqoqN^Yluv7T z#k0_^>JCY$0<&{9(&}xpX9urf|l~K7CNG3DQ0Tv^$?_n|T5~>pH)=ph* zjuWcQapqQJRRWUDQv1WD_BTllEyF4SPLtGBxUH#XTSE)AN`PCTZ5r85wc0j=*0NNV zb@~QE(uHdo;jzqYIl59VkJ;-On4XsEZWj?PFU%*PQm*r*$C9$3ojc zmiV~@vLt&$269vw-f!V;(z#p)gr#!{_UCbxmV?5*MfA)Y`Z&FkZBig_}ywT zN$61Iadq`21G-ulms{xSOLARJ&o5SfHlFiJLt%4%ZYAh~&)?Z(Ivx5DPN)5&)>N)0 zk~eLgI=I)ON_B8o<<+Xa9gkP7)-YbL&W6>iv+e5DklVguot#cZEREz8+%^)Qok6CkFg zw-g|(abT)hMW7l^)UB$`I)>+7{x(~vPN~tWfX`_RJJiHsWvi;VXOx+!#GY+g8^^Q@ zsg4&~mdCT5%HxIk*T)M@1#(kRLAivA4h3}4z!^P&gYI-E;lvi*%os)P%sDg zYfv(8u2Sjqilz#fEuR8Y`D~Hy&4BspU~4%=ufO1C^kcj=AVjs6P*DvGAA|JrF0iT{ zdo=h3?BOQ@^#2e#$U6}@_R$qHQp9vlKCN@*DLKNqsdA-8C9|Tuspco`lUH9hU98oL z<*C&()k?im-!+r3o!mVizVT{qf_S=D6w4E(#$?`JGo7#JO4(X{vQ!*j$KbW%^yKOE zr+3G??(PP$+vVJJzBVI8*oteYyStv3(=k`iuOVXyZIAS*7|+)2iyPDHO!ZN&QZ6mm za)tbv)oN}R#%n}ogZy;9T(6BvT6;Zl*k{;Dv4thA@-gG6X zQvJ=zrCevFhIDV#YTr*)D~*{sM1-Q-FJaMHV-xi}^zI3JtK2=kd)>TQj-=1tEjJMM zcDY$jguY*%4u8Si@U(u#+zl^(8qw!8sUF)|r_N3(=eHt=?KXvCeT3|l=;QVt_Fg|_ z=LBW!R;MGQqv~lDOT@>giubFo^c6seyG~efl3j~o{P-vbfsg?dpNlR($ z%s@Tq-wbcD&ubi-k5O8C+s#-Cy3*SpbuLnO9w7VY>qX@^a1r{AbFi{Mo^j4Pe?6vi zvWcSH4VCEBWxvIK>t&UW7CYpH^41}3&KgV~JD<6&fuGwsak zOU})#b_Y4(X8BKYntwhp|E+=Vu%~m5na{5e=CmLW3!k6&bDnvPQs7XCuXNHYy=`WT zU7K5n?eR)3wYNX9c)cB1fz|KW{eD>0!`9RLbZ)h;$5yRVu6wj(&;559dvP$e59d-X zhN|_MROb^Zejr6`R44SRQTi@sYE1O+4UCSO1CFt=uyh~^^p6EpsjA(imXzj4Cz>>T zj*~`>P-JoU-@h<6(zVv!y~j6ALQc_&<=*h0nFJB-e`$i{XVdRZG<^QQIx(5B!|9s& z5sG)V=KC2+;A9P>?)?;H|DCP%AnSX19+}-ss3-)vEz1!&XN#rPMZ-PL?T)?VJL_z*9wkC}UacXhQ|$w^7iDLqoo zT074>cV_O)?4C#nu}uguOxFNi4~h%I7kRNH9I-BDM2-G6L{X%OHb|HF7d|55!wT*Z zB@(d3suV6uaixA!(GjsCnj|j7R{F;Mz)pi}hg?8ec$yaRNx4gQ3b7p=(*}1SxeFrm zqE12u67j_b7M<4Cg+DQ3TcWE%o=~i_-B@=Sth02LNxu!Dlf8tVm9Ap31-To&(p)#8 z`$=d~iqvV9u-KVyVmsQ_65>v}mU?Y`Hqgr~uL{GNVZEm*#7*G^%=K=}Z2JPSc``4W zq~E2xDp7{$x*}9~J3bE*+l*KvgR1n8o!cIj4}}WiK-7L7>k#g4!B@Q$=?@d`=}^k2 zBaYM_h!X1*NgE=AHz$%YM22ooBx{It-P5gnM)6&2q3+x@G`Me+H@=+??jL}?n|8&n z*iOfqzn`01oJ)FsF`1i4NhxfBX?Ky@VOUtPT@Hw_=(-^|m4+mq7k-ZJ7{3Q=FwDwE zgi1Mv({1pObQ=5jB+)XE+alpD0XzzR6SoiF8aDvkw1FE0Zq~pJ0e8~C4Ffl4;I;sF z#=wmLw`AZ(fqT`!Z3V7w;I;vG#lXdY`_RB`2ktBQD@WgZ4SzEHr~zLCeZYWC`i)RL zJ_G-t0h|1vgFa-yCjAT0hYeWM?A0qu+F7JT8yMVtF>+OX6u+%?7d9QNmF08Q?au0}Bp6#VrJO~>f zFnGQVUCcKHcn@$)e*|`E`Xksk^818tw2IE(`z7_tQ=0z?p$CCs zF$Q~wp?}<1kN2L0t|4Q+L*RedIGcw6^Vv)S-a{Vbd>jK$_!`IBJ0Zim(%459zRSQ5 z4CjD52sIM(zZcl#DY0p-N6#?Y_dh}`*pADvV+20pe7t7l z2Ft%AR6St+-#~UJ_!+(doR-|22TR`H;ISg145k< z#-AbFsI*_{IsjdqUq^(>!3pT%T$==bo}^grC~%Y5C&%tB=zJ1-ndby~U=MJ7&wGC! zdYSiELe&MPeFFF>S<62Bwcwhi{PPK9IHsQhr}cem(0&X5GVKQ7e~@*PbRC8t^nkrh z?rBK+Jcc;!Fl;*xy!O=zq0Sax*MWNqd?&DGEWjxp)6nrT)_xlFY50qA-x2BzGi?W9 z7&il-J_P!8@IC_?pXq;+z0b%PsJ-$2@5A2i#@;xW?=kjyuW`Q%d%j<^a*=zz&P6`| zb0PQz(VnZzA^1FC_QgrWn(tZ9Y23dcRNeR+t$hYI@b_Ox#{zvXVh>DT0(}WS<+FAc zc4+t|*s0-{0be7ZF#HO582?AYah>`;^f2x3B**ZJbS+@L7Y%(s2(5Px`rn2AAA*PR zHJrUX@LJ~8kPaI<-iD49@Ysfq0`NNjiqOmW4}dEH?-+b*Le*Qo-UQAC?;2vT44lr> z*APplodV#g)*@oPXvAe5ak_%Iybj!kXyxwfqCIyP zjP>8Z`dmx7Z~YkXk3_33{{;9m*y9!8%$1KEu03 z>x_R3Ha;v`XOw4X^UQt(SjXxu$mxFYQ_Ya!ec;|R^y)nSK&XDU-&pJCz`u`peTen>{v*(j!tcKjs$O1$Pd)y<7QtuBJNqs=4bQDrt!yS0i+O&dS@5luW-0bY%%V@l_H)(+KY!Zx z8}9m)#Fff5+h^o_-7dKPhKY5T+=|nIn03m&-G+U(VON|5+i&Mxv@7+pfp)8!RlygX zLe6q$1G<7w*P31nk+s|f$E%f_KJBVa`^=hMtvY2kXgPPz6ab|qC+U}`VzFk`E!7$o z_K4M_KL*N^#x^pufqZJJ2Ql4?nCV5#(xPsaP0g^^mz?#PTCGu})oM*&`JmLWS7&PF zT4O3E*%VAnB&v45YBxR4wX1Qr3aO0cCJ! zmBBWP#2c6Uldg)p*5kxKW@+dULA;|Jt!j-cPo$3|wI>2Sb(=DkbQN28<@}AvW^D0QW_gO>thxfL7{2GZm_p{?IdRv_{el7RcM#SVG1NAbqXa? zd$?mSOx9}{62WODbU~e3+I2*g#*2@U7tJbdIbN*Za0;$OthuXeb(LpR9cVfUQ~jcT zGex~@Z_xROuejBsTV18Nq!X5AQ@)HW_Z?!H&Bf9YV%g2bG7)0A&Bd~<&6R5foBhD0 zF=0h_lt|WZewztLdkuk1EqHu88hqijnZ z+^m^ibYyEc)z^V3|}NCEMipn7_O3 zberyUSKaAI-RYjXGi|yvU3F(7b!U3&&bH~!cGaDY)Xn@f=uy)ysDOnVyGd(nL)+3$rN|>Ifb4O+Tc>Se7&_zLa0G8>@~V zs4$J+bg}?nFk1j_n=S%eYrf#oqLf@;zlrIh)MLCT$s&qf$u83wSnjLsA@u4xc4OMM zv%y{41Om<6!>CiR!GXzNZwA3)atcxRo6jL79z=KsX*teN^)&|(ubxy+nsY8X<#?Nq zqNbA4W@8CWByd;sRH9wm3PC7^!m~*}s-v5{vTvtVm;#wwo=rN7UXOW&k4L`i(1O55 zj4h?Eb4&MKwkDTQDt7oFG`m3hzc9UY))_Uyb<{A6s>-U9cllm>s;!b8H#w5+B~z~t zM=M0c(n>>30*cARB+V@tb=OGSb_JKs;f(*grty=Ft-JTtNkzrB3T2xf0gJA^TCI6p zI9d1XI9RO2fmAkIx-nnmTj9~7i`v; z;j`e4!7ar()X2?@&F$xA-Yu*WVOM3r+AljD@rDz{Xu~>R0+ihPCL==RLw{#`M6kZr zD~xu#qDKTSGZm+5lp%E&*Tscj{w*)-&Ufxyl$(e_y$6srs+ZG<6GX5^`;b>u1j&{N zUPfyh`8saBak5{x$v5)6U#GcXzZ}DM?Ry3avJ0qn+P8?!9y8 z&W!e0LWsRWh;g__;C@zI7ojMN4PlG6SQZ}q^F>wUfj0`b_$OT= z!YE0#%l*{$ca0^)qi}BwTKGz27ezi1%$Z5Mmtc!qB8Y^W{e*GuYakZLxM+cW2cBHu zjKO_JsO{~!o&~XGu>%uw;U7A;dsluCY7)R%2-YPh+D;CUN2W;Nbp|&?jJ3=!$)Ctnu^h zi|ZG2L0HX|X3$#@f@%rKdkoBu(+nGygBv2Ag!`_*P#Tjs4*WJeA^tLrf%Fl9i9>}P z(nq`KG4ZNU{yh)8S4nR|(i0IqN%9;!LZ2ENA?z%}MhRPC*cf5w88%MXMTSifc9~(1 z5VpavNy0v1*dD@~4BJcC9foBH`+;Hm2>Y4*^%{I0V*W(>Frz;r{s^Nv|88PGz9sol zMsxY^h(E??&i|hHxd_D+I=r;rIXFz_E{5USLap|i`x{<$^_@l(n z5O1%vJ0bluNDLH5PV>x?pHO~^c!!9dCA-`Yr{VtVPZyUo{kEdt(DXaX zjS>Bx zdPe{MhW6|+wkNs79+en9D|KTUWB)4AdYvc9uJ&<0#m5E0wU1503e3mflaGsJ)1@E|&A1I_($X_oIPwT#!qWc!%dhO>4!+iHA!Y&BiYs7Nz z68;Xee=)`WCBpTZe@EE6Om8)@=2eo@HZCXpy++u3%*J}k*c*g@NqWC0Y>nw%NsN7k zll=Rjk1<{*nUCc<_Q+WNgmAnC?ZqhBze;>PK7L=zCFZ?FxR$A; ztgTA8-VdAfsvx4C#p3ml|^#a26o`-~8XL>EBhx2KXoc7x;@%8*~ z5GEMbCTxUZ9m3GJm#OaFB>gt=pQADN6Hn)7xW?%_2oNJ@MRZM^JF;v0f#bPG(adKu zLFl(Cp|RDfWo~5*xEfYiGOmZ^OIGMR?FEU|>Yf!MxZ1QTPT1k7v*9%C9$>|;hgKK* zmTxueH7o3vUAG#|I)fcoiz<58u9OUCCE_dklGh4iplCR2cHq@pA*`y)`tpwDx^^8W zv{|~w6^Ik-N&fAHOs3^JHP3ILM~oKy$Dlw?);Cuo{rtiJW?>N19K4X>KD+s!OtQ_~R_XE3KM6$EbrHmp0e+hNPMvr)XzM5e%dH<@&~ zkT*dbl$cKeECGnT+)eadwzVr)pjSmlrm>y7spLwzc8qm2*5Puv8Zwj575h1YHZhJD zu!SL%1tZf&A(sb<+bqzsI(nj*Q3__3hi|Seb-|5YXb1g1D7;EW1!tk>ke9k-(0# zz0*|ZVxb3yw6`$K#rKno>sANyS$4~DtB#9DtT1J0G3CqDEZw7K-dnAZqE@`Onwg?j zy0=;}UR>R)Sm*~(%ugBVg&A2}0Y?ZsoOu zeD6lNVSNfF#!QK}3H*;22pEDuRB@OZkQtRp?r zH&dje`qCqPBSku{I|*?eX;_Gu;iOdegvn#FP9-E~)8u6RN(i3ff<+RHqc0&nm$Ihr zYL`%$PcxrZ1rvIO;*_e38!B;_D`(VFmf}*!<0{1PP~P>|L-a>9OukGNh|32k-`{qj z%XXo!?Lw;U!a&<*mu<7JZ8O!jInZ{o%XYD^?P98Jl!wj?s%%AVSh5mxURUMS{oMNH z3u{-(%f1%`gw7`UTt-Xjn!6|Fv5lf3+q?P8>(-_RzYd8nsDDi}&9r z)w;8zYL%kAl~ZRo+ndRHnR8*Z7hpDb z;K8@6#^Dq1H=H1VubC&Bz8897r)dX=GnpffTdB9IwsEFmhgQ8Dgw?vUwZ!niX;e?* zf4Q9{_^OR23>Vs~09p>)kXle8PM$O_;PGnMZm7O#dNm{5u?_swbeV0Zj9SaBAZyyV zvEx*B3@0#xI(*Fy>m8UfcD$erN|tL}LbFCq>SaP3EJF!CgOkRgjSYy~nCL8J9JlVc zh|8hi0|YiY_n**vUa3TV^)KeN3Y{DFVnrkD)rwArsV`Sb>2FuGPXG5S%T9>#2b>ROtn;|}O(HaB4rKE9}Mxw>pgXm`tHD}m%LgXk;#d8Cy+vc%2OHC_=<;rk4Cez@w{tj+dRoloq>1q9vCWh95 z_6L^wL9ap{W}*Kdc^T5D#w*8XyZ!#_sqe}1-do(MWyRc%sWCc$>M5&_6~6o1+|(uO z+O@P01_AX}L7vV*0S%J+jgt~hk8d1NF{Id3^e$S@5${Fg*6l8Dr!*vvn@fMclVl8j z#gpht$dmDFo`=_$OjAx^DIjt5`!+6KqViXIs=lX+Jy!b(=}US+lz2%be{LYJlwZc_ oKYPV{jOmXPJ=WVo47SI9Tsp>{#}hv~)j#g*`KjT*0F-u@_uhLKZA9oy{`IVg58?2+^?@Agmgp~ui%#p1ol!BC2u3Qo`GYDYS&N|87bSEoqlP?ezZee+Z) ztH@Zs`}H(H?&x8qNUGa*58fp@=4#rftSHxnhJNv4(d3dmQMm2~A=Q_j={aQ1)Q&&U zR&felPIyt6gJxBiJa;vmC1e^{538g9&EZ3AzIM4Z67&&_nX%gv9Tqfkg+xQ zY7`N$1#&*6y0Os^wSJL}3Cerx5Zyp~&d;M{gPT?P_v5yZp?y`LiLL&%r^v9@hBbrj zs4SmVvollSenChd=Jm|3(OcTHRWjwEY){ow1Tv!ho6Pmid`*+*8i zV@+7yVLIOGiY&IV=4agQ>E_TqYa^GYUSTi}=i$S*lIM=E#@BeM9YR21koF#!7oM+@ z{Vp$H-$qz6W%K~>v-03e)@kRE@#^Ye$c_BWprEBTT9>f1UdI9ECU^Rj+6z|!R!!do z4yiee!)ifGdCh>PZ7$Z%=}Ed0n-|&Y0D3wGYeRG|w`0QHCi+@OfHS|axF(%ib;~>{_ZrOz0$GI}~ z7)&t6Ab*_&k~EvQ8xwAC{6QQ=tLl{1H(YIQ)mR|Z4O-y+;qZ>q+?9Rx<|uD8v!0qGlI!H5K@GVqC&x{%vJnT$WcaPVdQ3k8m5f8qSRY zDJwR(u!0Z&5QCVO^9(gEbeVhj;EtFbx}l9;X_bn*n=^3<+%gF^4Xu2N!e>FdCO0iU&x$Ky1MbJnB~pe0Wx)YRNqysyof zW{ZG`$kQ{xUYS|nvAOjYJ5}>0iaW0hYm}0T`;Q&7-uLt0bE48I@5%{Y^ATY%Fw->t zXoAYQN}UVQl$f>pdv(+g$q-Q8X?2{D9icA}*1I<6M|YnaQZz2wbyB)VN$a$jW!eeg zuHl@w*CaZsR8fhvA~8>CY(Kv|`exU^D99|y5p==_?<$Btv~@kyYfr2q{mGm1zEaSS zx-*ISnc3^KmE|+S}^uxGDMqsmrat($Os&+0?A#B8Web;^ww&SD zCkah2i_XpxZcB8J=1uz+ZHvG)$a$M1hAQ}o&YfW?vdOxy#k|O<8rfuebZ@=-3%UC; ze(_$r@XW2~>;!%dhF|;7v@Fc(ja0#*m2iLfHPFs0w#vKobm99{F-zK#-IRLgs@+si z2o5gtuxj_w%8^G8d+PB;WVVczK9qGv!z66vh!}T-TB7GC+ZFL~O@K95OZZxwfgyVYXjJ?6S_GIwbejXFcPFQM-JDOffR3cNH-N7t*;cxD7C*~<{6eT z8iQ%u2FDtY{IM7F5ARIXEUHK*npt0VE3x1&ZEbc0vs^JsQoV#xM%~`e`-q}`t_F7> z+tD>jpo0a9md}npC>~y8eVe!BM++jS_q@mc8YSkph7;1`p0>7BMeGjE6j&mdni~;z zpEqSFl~6t$VZ7V!ltF?G1$ z$l3Jc0=w4jKIrTHO{V{W|KSao4XT~8I3;|EiL?vxDO#N;0c|dM3^=gi)E?Zw9z|QN zi6AU2dEGM!^PsqDGQ7OSKWYYgPo*ph;kO8p-m@)V6c9HDl`W=(bbFh4`HR3~_lY94 z?~U9VuUi7)_7{TX1daMOLyh1+hJJ2hMOVn$jxIC|k-#1RchPSB%YKTC zRZ_z{Im69n+0)oKgPB{#qdG%|OugFZm|}^>86%_u3}&vq8u8XI$vI-~Q^_1@-cU?uxjgw~wj!{fEn2>LVXE z@718FZ@I+`RQ~bILdSu8w7V zTKL@P5$J}u*ztl`_^M8`mtU6uxplJj;q)gaFD<%kwMT1yl5Ix|l=3eRn*E_d;pz&w zgmatq_%_BtXM&n{HxxSlbg9yfP#-*yptd)tT1`PL&5=6y4ais9j5x!O-hHUn{x`DL z^DUF|N;$_QdWR!1AZgqn30M@{=jlLeGKfJ4>O}dMMDKy^a(Tn? zJ|8uN}1LDO6 zqM;arlLGMk2o6^^6r$2#3j=yZfvX*DJ}zwHcV{azrF~Ay zkAgEhCgmWZ^2Xxvj?1^KSb%YEkmUX$4YWN4Fnm;K@O4aL zcSK)c+DMdlB_^#MtZ@|i@Zf_lO140m*jlR54p9nM5duu^Tqj4R;(CrciN!yY z^8OvD7<4Ql$p?^saKR?9QWYPRz;VC%NhkM#P8|cHLI42-Rw_P%d_w8=dSi=CjM{I& zi2y=@Z$k#*LY3L`Sb4>%5G9;scYC({*AXHrh+&{hceW}MLdQ>0dXi>i|a1jh&Yy2XgVW71-=0POm;o_Z+RobXX- zxn!u5Ip;g|8z$RFJTTep5toJgEicBS$8U zz3`UXZ*=ADE>mxx-dd(g6ddxsl2ol#Vv0C`LYb10d&JNRlUvpz=#z7R_GMiX!r)g_ z_xZEu$(}ezSVtK=7~-xMB0t(UeUVAW1o$_sjdz*t68++Fiv>^m(ddsoB6@iaiv@cG z0(vI#Jtz)Eu0_|qBI~vO-p2qJ=8=19Oo$INVzb{DeFUzslXfY(kFffTl*#`F6XR8r zK$q&HVBky#Q`L!dp!c(1ptlFdK_5s+)aE3~&JOeP=%c(QP@7V(L{2GXf7MB1Z`UeQ zojZ`}=ai~m)kz$1hCI_Xo$Oc=g=kaYny&uhgnxZkB${VQ+%9s{nr9@`-6ykgWcBp| zlymJf0*NxwF33Tg-F9;me-*9JTTX&0fl`)>@#MRRxAZkn@XS>pr%%pd3{Z6Q7J_fX z6F4zEfG+5r9W^ZIT@-a*5H<5v_7~Jh6Ob`-i$B>B_T&OABaYOXAnv_`$9SptHs_au zhpSHVd%F&RPDjZoJ$=BF!@Kx4B_T6k4SMg}^3#M0XRfkk#NNd~?qUYogZ>yC*C?iUf+zUP6E~Vkk9>fs*%`pjM^Mh7Tm*(PnzYr2m*9!k4Qs zdrv>pwX&Ox`(NrfTl**a zh;;&YfekA8t9;UZo24ni_`FpaiXEhCUu}M}gX7p18wW zBF>MSi-H4Bn$zS&H@!R}DiJP@h`qE_&1sYT|6Ji5H0BqUW)-FnIt-gO0BNymb z%J4)yM>VJTP#Gn{LY4G@6(N2TbL1_<^3yI?i{-&}#BU%5GBTOilGOyR0}& z2H|VpA5%nGK15?xQ|p>63(x~Pjpj%9>WA2AAVXvSgZl z-C!b-nN4&YE4Q`h>A(8jArB^d0{`hp|J>HjVRUf+18fCIeq8awKTky=gFdgB8 z0sb+OgEShO0ibQ}%T_r#mNW+!JD3Fuuue{LK8_%98KiRN$luijoREGP7)$QytiU~9 z8Y^I(Yb0r%upld?IL+6_{VLmBRhA<82^DD6h;G$5YJ5J^SX^@$VWWn6eMmi{X-&3K z79nnxa76q7S2*!+RIt^>3Lf+;VnsC|4T`N$uqXGOPgP#psw`LP1^ELUyDcp3v4$8F zzw~pAoan4hLA0xe0wT3=bVRQod+;V*>8$j}%3Wn%kmiGa90_|gOdk2&S0=@2nz8^D zg1#;*{$qEq`j28()-W%*iD7Esol=48aJlWKeZ*@k^=3HA;{!V9!mOrLmKAYrkC7FN z#!VX(V`|C2DS?N~)V)PD;N;aBxoMqFC&p{aq}3CcPjp_Iq6`XBQ2+%Aom6Pxhq(d> zNgCup7Sp8D>n*ifC^9unDFbMx ziU})tpse~RHf0Sncy7B%!{k$h`lDNQ@;u`8lzMY9#6-#IyB=6T=Y?vkZ?#*=&iD(sPo|E$U8N7U8Mf+5WXfmL=`v?n^|aKG1d( zjz(K!1FMLb6&U+O@H-7`ed;W>j&T>cMEik6NOR6D_*<*>#JfzBaGdv+UnRBb2x>*vvm_8U? zrQ%1I2W&$l*4Lk~-LC~_Id1pP4?E+NJeg8Uf@R@-MZY+NQMUTrH= z#+I#y(w~fXdAd3#EAH<1Wrw{5{ekWeKGjyVtrnk6;b0jYI(;%Ov4ei)0=87I-+~yV z?jsIJ*X$X>R=!!}@KFy8b02*cmlRSve572qm#M@w#iz#KaI6chV4k0XZ2S2putMHr zueg5$+;`dt2w-|m?}M5tABPYn`e6ND!bwpbuKk4?O6dGZH6pJLH2X$bTY8Lbs=9_A+Ii< z*sw)|soEj#MGnNOk)9w`bmfd!QiJ{|8oV$WHI|+jT_$8uZq!@cM@8XURTJ{H6y9k2 z>dM!sV3#Wp+ubk|9s)8iVVck#j2CW z!L*&FeiBZq3M1@$DXLwVu6!6KllG_Y%f`2G;yip#GC%g=ON;5|_89l?Dkg4|wG+YU z6;C;(Uagpf%TQ%;ghvya!P=>YOu`dh$=Ok5al800>yylg84_rpClmCC>ooovRaGVd zvMEl0B(w;04IT0{W5x#$w)spCJ&xBzwJ}twpnHsc#4&q}1J~=f+3-=;&-RMK z##H2-4rlzcub!CLWi~z%ORl|+K{9`&M1AYUuc6T=_hw_lX8%wWZ9~Nm;kaz7k2Eaw z)65TH;+mFe9crmM90PgU=LU;|(3i4}mO5z;jCeTq>$Y;b8Z$dxI)mOTzcVX^@ow1= zCS`0ekxyXY?F0vv=`+a+(#FOqRN}DyPI4Y^=h2gnS^I=nh?Uc~ULUd(?3_RNQYGOl zbt>SZ8xt_(CF?HcUz0gA6TcrwK87p$DcPN9YR{ST4c9Zwg@!NU&i zvObsY`q9Y_YTKkYynm${IdPAo#S}iQGx9p&Dt{EQrm6Ec|41Ce;ue+PFJ-$%oLu1a z=ZzCCH)@Hx&L5snR~b1crT>w5W}zcQYyLN#56`AkJp0Mvu;pS(u*cUufttRJO6$`_ z?9)yBV>V;m;koZ$SXU2m&p^2eY9$lJ5g3V(C9s)<>+N`lKZ%ABQ&B?Gly-in>X z+~D+ULTkNDj|Wv_)!I`4u#Nk6(3~fw(abi1&hKUUJs#AB-&Y!&L{CHmH}yO>TmiXf_;|lhxLOmZ+XvPDrq83gmAU;DP(aIfr-f zT`&)X$EOpJo(v4gq|_dBsjEG|{&2^JM{ULc%)&xjAyJmB*!5-Oxy9?Z?1OE;p*Z&UxO(e?o zzv~?h6ATnSp~%ds>`$S0Pp%{ps?k});EAgU(H8Yhp&jJRVBQJs7w>=9inbVckXkN} zzj(hC4gSx%T-xG)Z#eTK`_HZa7yfVg=6?2y=<;SQXX_x=3!c@Y8hIxn@}CM&jEWlR zjc2aU{#z#ny^O(5C~+p>i!AQHdbAz?tyXQm-qG-Q|L@Yj@=?M6ucUt&FVrD4cd7$; z2M4hi?hWJiSz@tnH~E@oSA)m)zY_bV0CwiS$8{g+o3_ou-(66@b$Ye^sVQqBOwjgr zd)Ul*em+pCta^M=*;su?O~1U)Nw-GXAuN8zpgLoA1Q2UT&S?{K zwZu{S%3kpbldW^kyYBfk9qXo6^Yg#V*eMEs3M3Tk1&meiiW{>3JT;fdqXlnwrRglT16>QoRslvGag#{OWnr9CD|ai!M;uWK;oLZ zcI^%)yKd*3JNaSVQsdD%Ii)YY5!jfr1Hq1VTwD^3S>kC%=^P14y-Vu~7!(=eac^Um z&G1;44u){!9jA?fX43f$CXSBoW_a0|4y~OCh%%+^fMQY*#jAST9*X*xgD?N0b*viD zz6V>Hu=Ykp#xXd3lDf=ub&|>pp2nV4o!$f1sCwwE62SP5(Q)#JOd?-JX-z-I97Tvx zzyI`?5i>66H@r=%EjWmm%p^SLmE7y_XnZsNAYQ$8sv?u{>OVw3z~a^i=Zw-d(7{+j zr8}XYuY1d9TRRA|ztb%XV{W%>`u+ISvf#5Jz(80EHL&Phew;%w)j`W8*kpf ze+fb@*NmT|h8ImCE7*Ja!Y4!*jLrT|phF*ZFe7A~EgSp)? zzAu^y_E87-Ct?#z#l4z+(!Gz1?0jH6Slo_wWUlS@k<&=?~ppjx?D8(>cN< z>eLmje!*mxDJu#x7K0d8%aOF55;m;RH8R^43oP!j z_{lIpS%IkyZ<*fNMCm^!GK$Jd$X;v>apE+u6sbPV0iHKHnYQqbrbK=@hutLf)R%9s zd(~mM*jH@GN{myayjl-lu>Tc>(3i-TgudJeEx6$e#1rTk)lX1$`>rz7X>VjT@>ZKo zut`W$>B8knsDb#j1s`@(6aq1WduOA=TajalHeu$qy`c1KF)_GKZ`{^4G-=^3-G!Hr z{yVyBVUq+7q9xLF?~mU?(p)Xzv;?VR#5A8aEd*69$?>d8iRB+p*?##nfol3M*PmeJ zh_2u0n|GQZ^q&YbM67AuosxtBzcG(4O~G@@4Nwsa=`KGED~^t;FZ-^dxkPP{@O<;= zqkuPT=~YwRy^DpGC6SAC-P`Dk+IUW+LR++bm+SUj%Kl5OlIpsMCNAy05MCyMPLl!9Ss>A@1B_qh+CW* z;V3{v`%SmJ(~JGLL!mwmED1qtx@Or&RuS^XGfN)&!OhCD+)I4AS*b9K#ehFaM^J6h z#bpAXy>23zmz5BhRFSC_ncDcy1LbPXWU3J&HV^-CXJi&Wv@#@&$h-YPJ zm+<8~xZ_VHb*C8Z_gX5#f!Q}17t*f%I6pW&NBh(;rRTSSpLZrqB8Wa-#k03*N+0AV z{rc9Qu8}DVOt`rDx$LWUrUd=JDy1#YYOexkqfI27QReL2VTcTh)+PGYz(afV&MOu?@HY|iZ4gu5I5wGhj)!86- z11&WcvFUpGRL=aB<|N!7!$p#H%dHYPyXYdg95N2T(=he~&Tcv)u4zm~3bV+K_`R>$ z?|J1{-_ve+fCRT~vO{_0JKkG#yr=Mww2T*=tEoc4{RFpN3cT;!pEC@(0+(&oaj#mCKi~GZ%ysN%Gt|mR}0r7sT-S~{#Pz+`^`^D#u KB-x7~^?v{s;MZaR literal 0 HcmV?d00001 diff --git a/data/shaders/manipulative/Melting Snow.frag.qsb b/data/shaders/manipulative/Melting Snow.frag.qsb new file mode 100644 index 0000000000000000000000000000000000000000..06620cd089bfaac71b64066c2f326f950ad92d17 GIT binary patch literal 4794 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 U1EF70*S}WX@!Q$o1(@npRtx5+$p8QV literal 0 HcmV?d00001 diff --git a/data/shaders/manipulative/Mirror (Bottom).frag.qsb b/data/shaders/manipulative/Mirror (Bottom).frag.qsb new file mode 100644 index 0000000000000000000000000000000000000000..9b43998f7d634600f0459f9ad41e2bd428339775 GIT binary patch literal 2462 zcmV;P31RjC04rX2ob6g|ZyU!EUXfH}(W(tq<3!Fg^UTi9 z?9Sd96hh1jAyRNp!F@seBm&V8bzzAEu_j#j=ZTicgDwHL_%~f5=0XQ&L>maE*puXr zq$~GFQr{7~q7QT-PQWL9pL&m3&B*~&gc~qO0M2cQQ;3sfvC6Cm%(Fz<6g?m{ff9&A z8gx}h7roM8R)@O_nNX(Hai(XPX%+4c_&15PK8bWsrV43WayELTN8?E6fmD-}9*h#D zJsC%v3ymejDY)yCCSD!*MUx)|OJ>yX29&rj{DE70+_9deF(^bf0*2GRelkwh*NR%ximr^AHnNMj`W3!Gb2uMcVuX3PsPzjDFsGJ zycwm)D9JaYlo(~~oPNzUL!Yf7bmDa~u`q)ZKM5Q62SQK7tS}WPVO!(p{YSM&IX`IS z%1f9nSb}N_sCyUOrYOR$X=6de`*7C;E~TWzap3##4e`%t43rlHHV(DqP`(tBlj5>a z`CSLyW#Uasd3qqvkUhs1=u=};gsn0xL0FYxNy63{mLlvC!=?#)!mxJ;t21ndupb$A zg0LRLW(j-6ury)6Fzh5@uPI+&z~@DlPn74Ge2?@~Oy>Gpq#oaseS*o{ew*}3CUgB$ z(x;fL_3wk%gw!V`AHSc6Z{fCD+O4WD~s&mQUoMuS+zKE0nv- zln0c*AnYo|nV~$PeU@|=*}TgtEq77BMC0(hEGzx$hu~$6bkUZp<&Pl)xHs2myl)Aw zQhX@iV|77azbAPSM#ixp5yo%ywMF@zAzvuh2-Cj5Ctq6Lj>u0*{tDJzLJT`J`uHax z(`1Wl@gW-v5E zDb)T$-D8q(L9_{>`spdk&tu|XUcMtt`}>aR>Xcv9)kyvqM0XQzU7J%BGxmoYV23rB zqwkpi-%-upWi`oBO?2GX$xi1iACt2J;W}qU!U`;Bf1{k0$Y+sa&k=_Hm*l!qG4T4{ zAbbw|qkNNm;+SR9YyPbm{%ykb`lt}^Hq{cbJLI>*uoc3Wng6>n{#ObAGx5GAY=!Z@ zVLY7oH)MxCaBtriYG3QTuao^#;A1@=kj*;r=Lpj^hbu+TAs|exiouoq`@(a}^KI8L zO2vFS?FU}J85q0$cKYYE0aw=y%EnJYW5WzQ`=BDRcE>dX1UGwT(+&mh=PMJGg-OcdBxMN(wH*w# zh*_^&2WzhDwO};2AE+F(J#%l(?YLegEzOh+MnHY;+ARai|DbE`S(#Bzqp)a%S&c%L z>M!x0vCMVGb(xAB%X994RzWX!Xk1-3G8sRxdYOD~X%V5U@uh)+aZO4n7IXP5Rc9Cn zj1yP~LEp17gPei`Fnr18kziGV9B=hE+3Fqh5VlKZ*LGUAvj=r4WDRYmav9qMMrg&OX@wYC>1bLp zhE_hBRvJ#O<2Fsq0}%6BBfihXnjSZw|F`DzkUcp3W7vF3#}5wwYYz^`8~S)d(}s?D znkXGVO&mW>96wDQH=noGd=m7(Jao-$H(?rW%ahyXw&7WOHe}t)?B;cXJoiPTYyJUT z%1v25D9fog1}z3?&{h8Ew%fiHWSWDL$Stf*sqsW?%cHik`$WwkFO^sOpDaLxx zzDBHH#8?m8TEu)QJM44JanvdtFl9`(!HDHoadxsjMhtIo!x9+|S6{^XX3U(z%``%| z73V&#$wqjEQdYIyy4rKa>K!$em0>64>ngzIp|b1M0?fx?n0$j89Jlw;e!TBO$ai6^ z??SBa!bIQ2kniGH-^Ezp#fiR4A>XC3zDu#b(H;(dXyQ#(uxO*_x=>@+j|;UY54N@& zYo6=-jR#JzALwp4>J3J&fBVDQ=H^y4uSy-`W3wMboUmcRLv6cJH@!V87`WiUA92z| z{oz>?We!gp(!`%PjW;@P+Mxrd9X@f|u}98e5$9APGo#Bod=e^icsPQ9E}4S0$9IaR(By-@=hJx_H#FJhCtiSSou~!^ZDAQ=#R#%q?=^eW1su zL@OX>Xyw6`f->Srj!%JYCV4tqu*02*gO~ioO^ML&QKt77df=jK8qJOg&v`A|+;dzX zcY_UIJga5QUwhiMeIK3zuk}1PaD&61<!j=j6WaNq8> zuH&EF{t7$^qYJ}<ZHXh!)?B(6s9AW!xh;_7WMOUv8B!} zc9bvbmyjV;1KFF@eBaiieyHoJurlGO1|1hUUCUurRo^nYR`|lSv!ffyvuAO60R#1{ zEK5EqOJJ#AL6m8H(r`qjkY?Gz3%rgI?`7lXm!W1Ib4=JyF8-}0s+j!Z5;-fB$X;H4 zyVGKk78+Yuk@Yn8IB_HWxH-~`UDblI2T#jf(rZuT)kpp)LS8Yyw@Z+Wcarf_Bqv83 c`(%IYC#y;JJr(&WtNzL0$PXC*18-nCbB+Mk@&Et; literal 0 HcmV?d00001 diff --git a/data/shaders/manipulative/Mirror (Left).frag.qsb b/data/shaders/manipulative/Mirror (Left).frag.qsb new file mode 100644 index 0000000000000000000000000000000000000000..04adcc6d02a7ee4fa10f189337ad149bf39fe5f2 GIT binary patch literal 2461 zcmV;O31apD04rX2ob6iwZxdG%f3cm0m>ew>DE+=9KEpEU96z%GjXBv>$`b~ho#ec=y;d*g)B_iYgKWnJ{az70S_8&xSV zmBgE=6q!o$%~VQEW$c{(ooj}ETSMs7>tteK1}AB`;}p*342ZP`T~A0vv?vs&*=NapJFuU*CP4&f#eg6=JGqlPcoYG zpAtXCXw82gtR^HsDfRLBB0OQ-47fi4`5B61N@6J)s~NhHKTG@s@zcbcm3F6Pd=eDn zG|9Y2Iw(^i`Yd6{KS%M={BuIpFJc#fK2QGPb)D!7M5F#ip*KLq$KMYn_tiZu|B=ue zbV__qKBvgOLH4I;j+e<+l8rY{@}ICZGf(stiut_Er_&g>ZjLY|gX?x!@UY+8Lyc*H}0Pk+Yt#fmRe8&E83*;~d zbM%by{~hJ*U6zv^Gu60P%`Xo%Xd5d0A>}kzII?b zj@3bjcFWJW0&#|VlK--jPWK(V?Rs5|h|z~X4DzM3Ua>mR&sQce3zL||Nz4)qYCGs^ z5u;wW4%b}QYr$x4KTt7fd*=R{+i|^0T8b$egh2JVYqtzc|HH1iZ)HYx8ihq8tko!F zDgP4h8Oxk!+?1inu{h@rsS0|zL*vG>k;(Xh)yw2_ON$6)jW3OiWElWuku2u&S<24P z4;Uw~4uigDWd<sY1z&`_h*2vY zuU3pvD<7{`8cwd`HcgBJDCV<9e4mLGJ!wAwZ_VcsJ2?C{Y(AxvgTw#Y!Qo^{+x=zn?Wn%QZ>G}@LYm&@0NXYJb%buY7**8%d}7mcp@ z2QVoYW%;lyr`{N}7*K<*@<+Gb_N^e(9Hc}pVJ%9HCn8%Om6hEmDh3gc7nE&kMEXxL z(u4LjBK;ypdf3(?;!D|KpJRrjQelTFVzLcJB)^K2lkG7gc#8{`NN`wv5$W48a|$=p zh{ByX^Knf!qE{$oRoktrHCL?ORa03Rc2Ztf0hWh~u2%~%9)n@>4Qg;)-beZIwhJNK zg|W5^v9=2nZ5Knfi(_pUV{I2F+Af7`m&V#I#o9)B*!ZD|H&w!-jh^#Dja?rXYEK?+ z?=;pt*Y_I_onAlC-EhyFUKZqD%!-9p{PNQym`&KY8!JR*5 zr-|Cby(X$T+--;xzuz?8XuoO4Y&dPb23OQS9_q0XtDUcL-M{6svI?5^2AMEoroP)V4fQm7}b~?5LTR_7MAQOB2z-lxy z8ME`kJn|cgnaxJqWN_eFW{aG>HuQ4QAWqYDeCnjdYr|!}s2HXr%i)^rBa8a{Tx_X* zi*4nL`Xyut)qwUUHQ%>&)DLxC&c2x_;9y~2$Nv}PTS0DLNguG(Dw@VO>carI+h)#|+ b_R03xC#y;JoQizPsy`VV`GE0X@a{QVs=wD% literal 0 HcmV?d00001 diff --git a/data/shaders/manipulative/Mirror (Quad).frag.qsb b/data/shaders/manipulative/Mirror (Quad).frag.qsb new file mode 100644 index 0000000000000000000000000000000000000000..49c7dc4a4fca3d032bfb731f490c5049f4d422eb GIT binary patch literal 2558 zcmVfI*cVH}gMYqghyv)w;THd-OC((A;G}2* z!4kWY+>&(V{!r>0Vn=j=F2tMgr1!D6nbovxK=p798VSL<1N{`@7+EYb>mKtIQPxEV zNOhou;(!`m)V+&e88EBC-G)dg)8%2Nr7EP~(l+F1bW5wlNN0ew zDJdOjB~E)Zj5Zxd-j52gg|IRf@&qg1b`XMzwJBb571`Ag!PQa)z6vtp$sjmki4g_C3Rn5%wd+>l1jMXYoXNhRGYGA7e7to3Z(@$bOv3+32fL zXPjc3A)B{}gEm!?PY{OslN2AVKPgoHB6b?&Q`A4aE|YwkWaOU_dIMB?e7+~OFYjvm z_l4e|)8b?5bDI1c%hXd*EfAY~v+Y%O5}laDA!&`T=Xk6 z`uIB_6J(3I_?WeY^4CnpJpG2`&wz#b^sZ1jcv{9xjqNPq+U5hYd7s&wBm56wgYt($ z<>EORw+T6SACa#Q$rsM!r$WtjmVBL;F;)0F^lVDTRAHCdJpGY;ULn6|vj7n|K^VS2 zrg@mB^}8k1`a|6}B;SJGVhn#J)bZwPipf0Hgl)pKzip;_O7TUVN%B9ScQ@hIb90>f zjP>CL*x?*Z(>uohXEbMTu{p`poalaEB|9CnLPE@ngzK1<2rIIf{fS~$CZ8qhd!8`# zk89}~^?~QWb;75?Kgu`BXMuD#82?rR|2E+|KdQvJO>>FZ9r9ac*aG46%>Ug4|BHnG zo_L=Tw!nCwGaionbF$O=CDQY}UM5_R`wKSi8>H9#dkOsegzIsy5br)4;{)=$!mx*g z^Kt(?!T&1ZdfaP-J!HHu84t((CE1}5tZAD<)ia%MHL`yKe9XgNl1+{H(}d|{lh$YG^Gph|z^V3<_jt{nB!e zU#N~y7Dp*dqm*T6)N!$^C5(E_-e2-OzX7dz-B87#>07%?Ud!{V8EK|uFaqi`&uJJq z{SVsKuALp^n8i6G$})>NntzFRjCrmzuF6p4S)B9xlm(sqzHxcp$Yz7k?qorlGYa`@ zIpb3!3s2(;8stzcQ4}?uH#?I=)?ZB(Ue~?se2ssSd!f5UWSk;Z>?b%Q}D+ zmfdmOhU4zSycBbWHdC=otQ!Ng(&4mX0eW%bI<#IrWXF@g_3Ksn=y>w~c04(%0Y^39Kd%7^XO{BOndRura&%@ns#mX5y~6)R zEcMSUlYg$mFq*b6SJ-XCw|52*hO)8^SpP1;x>xZAte+=X_bXw{{93MG8kys` zRkXttF+_Y#Pm?n^*2L|N3WTJNi~t%2WUUscQN9-IMjDB(RXpA?^48fX{hf~qVLj3 z-{pw!@=)L9MBiu+X9cMHbv0q}y@Bf@dx1V-Y(9Fh@z`AQy&y0jxSejOtKpzGXu0;q zS4->b8_NYX)d@bRVJ( zZ#d29Ce<9aOEn|gR5Q9yH4`_gUh3!7^k)YbLv-sxx;b?JQbSML!J0$2u*8T^#PtRP z`&To+4_7r3;bGetvHu4f* zDJUb39mOa5^3VEvmJ2Jwv2kqf&*p4v36ZAz%}H+i*GlK znJZ7)P7uIx^Ge6}LN7e%*uhLDGwZnZR<~grciMJnwag%Fw49vy=_QV(zi+PIPlthpHSklFBFZiZxq_$lD|?a$)72jGyFq^qJy(nz!@D@ z3b(doHfIaD?Ifn-jwr-iTQCS8Py8;Y%S!6FEysn8!?Z$}iJfj}n`Sm^wVqoCfvJ?a zT)eo3d%kTosFRoay__>hQ}^6}>Tl^%f0@rIh2_e0xFqYyoIZ7z8fv#=2Y@;KwbO?- zLH0+L?APd5we=g`g;yrJC_aai?6LuEI%_n~z#TBE!kYd}564_VMe{X}CqugYv z7)!ySJCGME;q`&??WwAbWqU%#lD@BE-&pb&H1bOLappM5c&8XYO>$~*FBt8Q{k}QH U-qW$)J?r0>4*c5nU-Ht9RH+;&0ssI2 literal 0 HcmV?d00001 diff --git a/data/shaders/manipulative/Mirror (Right).frag.qsb b/data/shaders/manipulative/Mirror (Right).frag.qsb new file mode 100644 index 0000000000000000000000000000000000000000..1483de5f2c0b657f79ef2e0fff684c4486cd6780 GIT binary patch literal 2463 zcmV;Q31IdB04rX2ob6g|ZyU!EUXfH}(W(yOX z1cNz|N9kJfj=4M9QUe1niUR$ZpU^+i|KXq0FGV}EJ4?H}sqCkIdwZonV`IJY5AAx@IT3bP(C&k|)*^nla^N+1qt z&=nnB^h$$S9quk_nVw~)Rk%Cg-z3u7B+>(!Dx_`6+31nh$C1thsU|5s7$r)3 zI*v9M8cT>%aMveIygKlUCO-+5%&6ZDC~;r-1LNK}V~l+Z%zU{n`rzM&Zw_dZaK9F+ zyd&2IFk2P-5Re1^FuCEX{3=utr{d;wX@opJf;W>K=?fKSMx5gA$k5WBildEE3XGC? zJ4%sJl5a;TG0NCE{X5qTeYS?si8sl_!VFIQBy8Lt2|W$7!c?4uZH=D~*K6xJKWOF3 zH!xeU1l1H!_dd8yQG{L7#)60s;jRf>N=b?1zz^XY;$P4hC@%u=fb7Gi-*ipBQ$6 zupYx^346`3G-1Co>?C1tC|_T}=S7xJl;@fJfb>&L=K5Ns9zT$Mg2~)|oAgO0bNw^Y zrYZq(0`K0*34>1L(hX_=n{xvDCi4ukAk(`hZS} zFDd2}`8UY_6wUD>`AV|!=E?puwrA!^zC<~nm$f`4*U6V;6TJ?*~Xp**2|mUI_ME|XuLhg&L5_qDvFn?wgKd zbugfv@^elg&5$ScuPW(u-?7`S*Tsw&efYy5Uk2+Hs{?+%GC^6Gq%2NSmS9lZ!BC5s z^}2Pi>bhPFMsxdt%0b&R_g3AG>s8XyOvzvb)EBPZGO+xQy5^ph8Rawzi$<8$C}gSr z67LyHTxVRDsmQTB=MHEU^l}Hr)g>d7@dK-u0cp|5=Wb+;uZ;|R8rRSui()aC&r)@U zalkl%brAGDD>KOHqR|7xS8N^`9o!%$;9;N{o*f*zkjul6A@mRj9~-_*OcR4qF3S+L zj#H(=gw-emWhovorM5yFM<-l@i<(K!^cajW$OFJlRZEz4%-*HPft1Pju3`D<kK9AXh!{3I@r*!<_@W1xpaJ-?9H#BYN zn5T)-@zccd)5P)9#BuX^XU!);|I0(y%ytu|(Y8FfUG5s5wP!=tz07W2C&+VOHoE5T zz@^-j<%6=EdSlRHfCgRV_inrGTS2BdD2d#{+LRhk#I`(YE4xqB3^E>XDBIMC^&eua z2kmRb`elsuu&qVRZ)AskjyaB6g#)IH$u=0VycuUF+hfG=7B?)B;c)dutZ&E6DcnpW zggbHWl^Li;D;vOR0WGRdaesKcKx_ed-`Z= zyRquIzTbG{^!kDBhNIqK{FWdDD3N^QNs2oObxcX~!NpgGHQEh0KgD>+m6j^v2keNKGQ{ENYKE zjAG|Txzk4loJ8&10bG?(uErfm#C``y(&*w*$MVR+G+?RhSq&S%>r91~=MuNbh4+CT zpAxNrn4y&iR|?9ABRM_=wwdJVXu%G5A`V{h6E`J7zekzgU+960u4yzoCOqf0Y;(_X zecTN;eDSQ7F@Nn@*YKc+v(U2903h8fJ*H41FO-< zWX#S>^U!Z7Wi}galfk}cnJo(P$}q}BgEURo@u`y*uMD^OqEeWSTn<-cA6eAT&&8HH zx7bm>s9!>cPz_{nQuBRRkNTmmtHR2JqZ)KvBr5HUhJwCj6HZ-=8|4}BCkI3M-lRh`Mq6&WW1A%pCUOq d+Sn)iV?S9o5QS literal 0 HcmV?d00001 diff --git a/data/shaders/manipulative/Mirror (Top).frag.qsb b/data/shaders/manipulative/Mirror (Top).frag.qsb new file mode 100644 index 0000000000000000000000000000000000000000..aea04a7669041ff8643302eba5f74c0254d54f77 GIT binary patch literal 2460 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 literal 3183 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 Jo!omK{|{A44YB|L literal 0 HcmV?d00001 diff --git a/data/shaders/manipulative/Night Vision.frag.qsb b/data/shaders/manipulative/Night Vision.frag.qsb new file mode 100644 index 0000000000000000000000000000000000000000..81fb7f0bc8d20e1aaab322ce08a05a3b9d680221 GIT binary patch literal 3660 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 literal 0 HcmV?d00001 diff --git a/data/shaders/manipulative/Oil Painting.frag.qsb b/data/shaders/manipulative/Oil Painting.frag.qsb new file mode 100644 index 0000000000000000000000000000000000000000..da6535aad9029e51e7f64c89e3cc5224e5531690 GIT binary patch literal 5232 zcmV-$6p!lw0B*{7ob6o+cwE(WzE6^EESt?3FksB{f|;>oSu-PVjO7Iju))U064)Tb zFdB{IXV1ngwgh!*0<>g`z*e;~&nv0>bPnEP%MypiS6dK*m-UUCMT5L#Pc^wHOI?zmX zu@D{5S5DhcLuuD^N;kNnBDDibR8e4 z+a-~Eln7?f?p{5_HC3q#mzoKa?+3J4#hn*5ZQs#%1d+_{phWJB_MGZzNJ0h6cR+w6&N=&G<%}ymQRN7~!k`O9Q z`*b>=dH5dlpk*($x2>E<9bcdmw}k#*sCz}X3v^o3_lyPO6@LA4d1Bm2w#SliC(E_;V@H<=v6+tU0tnAe0OQy)zF*c z(sSzcJjhFICB7N6fNd988?XU^wFBEFunu5*1U3iQeu2#eHYBil!0r*)IlxK+n-A=y zz&e3FBCrL(o=3c{(cjBOJc(W*=;Pp9f|h(5BRL*<%gDD0TFMu|Zx^)W7s2lkH1jXg zR@+>E+FgCRzeL|r+-!Yas^#Y)jvX%6;l^qnF5=GzzYY9O@aDUA=eY4{LyS8ia{+Wn zCJFjNV8ma9_%MHwGV_8sb6p@qoWy z48(V_<&8VFwc0iQ>~%a3_FG22TYE;njah!b+4m!`GY@SOeH0k`l856=7Xow<^ah<* zZOVHBk&Tx$G6%AhYZ=RHi|DMNDG$d%@6cM5FPAElW0Xhz=<5>TEOP~9E*COOfj_8a zh`v&pTwCgn{Tz30E`zNrVTqM&+obJ zx|R_0P0sN?@K|oWkdyO#19&{AH$ry<=28q8&$G=KSDx?JhRpXQaGvj5fF;FzKZW-C zVRH-G+XSp1>(q8-*7lQHp6KgP=G&CX6Y0wj17}};1lU`J-rI#9`SNzi(OfBFyo+MI9>I8W ze*Gvg&Mya;oQnm}SWIuimGVg^SM88{KPr}x_m6xACul)J>3(B9LzlgRt|9%M=^M4sJ zVE+4oaen>^blxx8_*Lc4&tHQa;hdizfG@=3{QMyNB_8MJhk$<&F_ZcEKJa_EGPYXS2=V{2Xjo(5$On(G4=jTTu^ATb5x0T5=>C5i` zXJ397*hhul$AljF@-fKK+<6M){gfE5-@|xvKK(v0)_($+oSRRAejN1U!rmWX{Mp_g z0%LoR0+TuR7nCZ_3{P=Uod=`EX{b^;+n#k6t zm6wlyq5S#ym&%`ye}%R<-~JjH^Zy1hVgBcVaX$VnbUrWI_&ep#$G?Xh;hc~E0AGm5 z`S=C+OFYiUe+2#o#7ySn=fLOr{Uv4g4?LIuNtwL*qLBG#;G6^h0_;md@5@4u+W9i% z*v7x29j3nmn)C6ikok(R`ESbPmGtG`fwM3F0qm zIe-2O80XJ(z~tO~9`v)IpB4808{^OR{s$P_`#3O}bI*WBdpFL5{{@e}DGy$BY4aie z%izB(+Wv+z`#+|?sr-5HEy#RRnLPNGYg@r~n|sf?|F8Vd?Qa7kKVJb&e$WJa3E$*r zoBnRMJU=_Y@31`Eb1btjWxwWH2IJ>8(U!j2plexPex76b^K-uC&(BWS=KNb=8I1W0 zEfXW=pKBS6^Yc8*=$vbLZJclU^Ya4B$Pv!@d7))|As*-FBFp$oJkHOHEQ2pXjAVY& z-uxoVo9`D}X1~sJ`x49K*%`c^ErajJxp2ZVdVHP2nDtpk zHX+7ry|71pC%RAgvqAVn^hVIEzX@Z$QTVgjGC23)TJ(YaOIilwi~ZYT8Qr94uRqY< zR`}a5+S_IsynfCT(Afc`J1t{}@CShnSjH#fErjpaTi)B+0nx?{h{FcN zk?8A%PrK?q&2`V-c0- zMfiR(UI#40V_Sokv3CG{qjSSSAwOi9vqYwEv&`A!)0qFaTSkWP7q$K&<+`f_JrjE6DCcZxB-%QE<_=*NgXeY>_oh`v$Iky*D_Umv^L&(f2XZK`E<3PC>eD*-P>X#i%=Sw*OI|UXs^s#KF&vpjtd_(Uo)+!#5 zu$=?hN-R$P*?>w9?6tX#TXt-}gDuCnZx%?B!&dyrF884Re6cM|oe+a1JI$Mqp z)b)Fl(=cPxG2_!Q6S`5SK(59q>O~zHpt%Z`E z6vJ|Q%&AqhnPWv~%%-WZJD;A&Mw~*Ug;cED_S;CsqL>XXUhi$H;@p?D`&~3b!RZl^ z@0skj8?dQp(z8=LrgcRl_PR!eN#EoukOJLBBBn=nmmQ1RYivnI#lYtM<6NneI?{H8 zB6C!m>`m&gEq0&&>gtNReA8Vw0fvu`m_8;Vy*<6KPM=CB=R|$trZ#WX?6n+wU$aLv zNAr{VW{c~jq0(vFX=O%AMPEoyZY^nAFcq7Wb{a7L;z0&0~TA~+dN`= zg7mv0N%tOMOT`)k=LN^rp_mv27$$P2Ai0{e3X{%`dZ6_EY(o_@p-RPq!HOYR+JiO3 zZxS#On7EBt#APQnIc;d-9GbX4H1Qcj6Q6Zx;vzKhS%)T$(8PnGiF0V;ZfN2&hbF504!%VWX6Y!a*APLEb15m4(`E^4o} zBhX$0Gf|;!+^o9@{hmo3MchtBy?YTQXIu*#wJoBX%|^`^2y^2Ptax6Uhd>|P?zUsT z#{>uYgn0T!_<>q~{PAN{KHupPs%`0r_|PeO;x&Cz;z_7SFD`1N40+0adJil2Ib2HX z0?X}%s2b{;E;or}E|E<2HmwJxChPnDRu2A*38dfxVzlmZNsI(pf5JGmZ-! zb|wy&%=jl8U_CXHt?G3))oU(2rE9*(s8bko3KKL>qBe_}SccZM4Qlb3)nXxPiJ8^n zA!>ayt0lb7<%*d!#er6;s2yH9hl;l9=~g}6s;67^bgQ0j)zhtdx>ZlxXJb8mlQ`Zz z<<--P*75GycD&oFQCl@?t43|rsI3~cRin0Q)K-o9y;Y-zocShNXTGg7-`1ILtDfdm zYSq&mr&c}Ps;67^bgQ0*N3D9gRZpXyrr$V@duP7qO=Wby#H9*Y>lJx}^zjgBuTl?)uaA1AyD%J-@;i)(xs`oDazmJ$Tk!`3H%h?- z1ik4Pklqy1C;$E+ps+d2eAvDrpckX%jdl`4W~q%2Y%yKg>Mf#jUR7y&nCO-Vs}zrv zSZob0BKbwi8WlCqiwLyxz;|eM!a) zSa9zmdA_|0?|=vQ?>=yQYG=7vsibxnO0_C4kB!!J%R|>6+PQDvfq`B#)FC$Z)v5s_ zqFHTW@b=VDx;&As)=fy~#WD!S%zLO{BeaVOn)CKi;56){3?2z)6Yr%`VS6dqYO_F!(tq^O>?Er(oLFqM$2v5_%!=8 z(oHqptYI#MY}dw{?$<(}#SQy4R1&nwVSPrripCI zp?eOUuY&8B5k=sY)4G_|_u~2jgBP5X?*#%K=x&hDXBDfGRa6)cM=|6QA|C{U! z`d5~;iG145R8Sh-74^klOJ10KY9*t?d+_Px?Rw_zKY%nWo=hW zm#NjPUc7YmzJ;72wmsBs)4G(Z+PBp5Te)tol#bn2sHDfUJIdws6vk`F&gQcDY@u2i z*0T0C($IBt48@-Nqk6cUO^?|_tLj>uXs zQ!MCx#bl{$?q<`D6g^?~%z0r{{O{Xx;j(>PqccM(MJ_}MEJM)}V$l9q?x~fNF zv{ucgQjthHcRW2+Nf~A|8r-sDMKMmU_Pp%owZ_aDx$lb#N%-G_QzM-R$s zJk7iLq(44pj#|X&Q#Zc~_MkycmrvtpVAii$Lyrbt+t;lAr-$inqTBAqiHt6|R}j4c@p12d5Rt znNJPQs@J<%aA)y?w=Q}1ogRdq9fThpkPg+6UPWZ?B3$RtuXha(^9FciB&?>;0_HWS zTP{skO=wB}r2-=wUR+R%hT)1u>%VTuKGM~1-+#haH-wybIE9|@H`GDK^e?Hs_bJT} zJ`i#5QU2N;eRQL8<7!P5XMv)u=^05eaLABpIAAE6a|JqBnBxW-ue$@Uyxl+0;eJB? qwpANwy4r<)2k7?3(~9Zsi9Zk5F77)5e>RT)hi?skEbKcyQWfb$J*L?J literal 0 HcmV?d00001 diff --git a/data/shaders/manipulative/Old Memory.frag.qsb b/data/shaders/manipulative/Old Memory.frag.qsb new file mode 100644 index 0000000000000000000000000000000000000000..2a753db326351337291c68691129cdc63579c7eb GIT binary patch literal 9788 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 Mc#lz%K|3t{572klO#lD@ literal 0 HcmV?d00001 diff --git a/data/shaders/manipulative/Perlin Noise.frag.qsb b/data/shaders/manipulative/Perlin Noise.frag.qsb new file mode 100644 index 0000000000000000000000000000000000000000..121e5f2906543d0d591717e0cb351a3cb5fb0ff6 GIT binary patch literal 4247 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 literal 0 HcmV?d00001 diff --git a/data/shaders/manipulative/Pixelation.frag.qsb b/data/shaders/manipulative/Pixelation.frag.qsb new file mode 100644 index 0000000000000000000000000000000000000000..4e49f6fc3d0688d60a8f0f610d92dca44729f4c6 GIT binary patch literal 2710 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 B?CAgi literal 0 HcmV?d00001 diff --git a/data/shaders/manipulative/Radial Blur.frag.qsb b/data/shaders/manipulative/Radial Blur.frag.qsb new file mode 100644 index 0000000000000000000000000000000000000000..76a20a2a714d3035666300af6f2e970403c7ffeb GIT binary patch literal 3220 zcmV;F3~TcM06E}zob6kCcN^6azqaf=l$d8oDTQ>2Ln_6JqL*Jd4hc4SK!StqhKC7a zEv@VYX;;}@B{q;YG=-8jq=EK}^n0}D@L#`0|LmbXr_h;u=W0i*m6Ejd95~hHY_#*c zGjr$8%)K+KV+kR43n50}9)kNxaYY28ELMdjw#0&P;h!g}A_rr`aEov05-}Glcudql zz!V!&xGu$&`g@A*5bL4^;zI0#PkJ7DgmLYa6DSKWz$5`Ex4}*!_7KNO#@&|OMoMp;#AtvF>B6i*VOLzez%8`w5+vu0pY8xf(sw`CdZ% zL1;yaG+~yg*u`FAdpqV5;vu+K`z?I2truC|70j7Yy%!+FE#bGBo4uIP_GMu6WnQ#E zzYR|gj3nT`Ayjy~t|x(QL2QCS4*Wysc1Go{P(d7uThE~`;ocT})lZSWaNw~nrMNp% zl-fgaV%;KnCNg|~A_XRrxId916Y0682f23AXElVz&L)P(cjChLz{dRpp^w6<&=q@N zTjS@M^DF1Geo)PpCed4vf@%pk_Asa&AqyL(jR6rqg8PoZR7yx3Cq4sDh##Oikp7v# zgF~ep(y0zQA<{zm_biO1Np4iqqiuR8@pEjPJ~cK(*hz*B6Sl~(1Yu_xHbU5WhK&+- zkzqRsTV>cz!ro=rF2b4&+fCRFh9wER%dkC!eMSD7fX`={KaoDj=u0#{#ArT#ClZgl z#6Qev&i@6CCm7AgzohXIM(gp%LF=#_Pe^%u-VaacH$z~~j7Wd&pfLmJUF5@^Qf@^0 zX$Scb`NxPJA^wMmcTDn+LT)Nu50MP=>?0ZEn)`Ad)Q7b>5JB;N=eY06%_ zCW!tq(J23v&;?PAn&;<)uab|Dz7(0~9TDbUnS38C7ME?t{n}K_Z{Ggj`+^^HXhdxhIoc1!?3WWcWFGA>LUU zn_;}q6K|5nzk&Ilmpnu5ym^dldzfs){CI@f`6$`>ILnuLmOpq-EHWDR|Jg`>U5?OK zh}P>qLG$Q*cp)YqP7<#3;S^yfSw4J5`S2p?JVkMtZ(|8*>uGvMJMnD#2dwX9S|@(~ z9p=QI;{xf%@mFd5RkG=jv_-A;PcSc@W6Ol$`SwrXLHZS;`WKXag=F!}dR?gVO8ejq z^6TrM3uF5x@w_2*?vg%ui|{wununQ>)+iPqgASzMChRS?_P5E;cpkn>ett)U`D_xd z{k%??$>!8?s>H;pO1PG{2&*!A9j6-Ux0oL`$PYJ(XOs9gXbqPM)BNuXm0xHRp3x53 zR2Sj7}iobdakR41ow(A(hLN1x~1FuyHjP+J6`C-z4t6>Hu<4RDzUzAYg4^;#plI03mhaYE0j#P+`@*K_I944ES}R@V0yGlJ$?@xR$z;p1Yp&Noj~FfZ zk3qgP)+;Qw<#Tg=2J`&}3;hO*FsbdJsRi`CCa=17)xfkn*DyD%lq&ohiiIzsx(uWoGIjH3xydK9Z(@-EOkOmLM`A# zSW*fnxrYuCx~{wyMoGD}ltS+uQ{K&^dm$sFlX zKUodSPc}WPVoPAt-q>uaQ)#XXhCH1c9K`o?5ZBFZI8svUwo|p84TwuVZD=;-%h)5j zORR8jv3!hJ@!n#E7_rj5#fstL>TbnEKj6WYHsY&5EbE{&3`)bGG<<(b!^^DcUI|M> zanN-C(3wY@o>3N&F76LvxZB00i~Cv(cUW{H>^k{ypEAW!u1#YRnkM=aVGL;|B?<0S2-T4mP`JTG-vAXkpbr(8x7kcV0#Of~e)m`k+UF@m57^@rk zp)G?FTTuavmSH~DQFe7Rw{r2^@}=^E=lXv6oYQOt`ZVm;1~ad|^v1%{((+0XdI#!WZ zq1>xgsNF}eQ2Q>Lg<79(K?Rojg}ipWEcrYiP^jFqX`u9rX&Y)i`-a|G5OxmQ9R7mU zr*|Of|3UZAz0Xw#)pdp#u&Xz$vW?H$QynMCJm<)E9$9*RaQ zo1PoE!FJQ~4<87ly?%n>zTK!E!~e3IC*YM5RTvI*5-Y??h9gJQMBigI}tgXpxPUX^< z<0NgTPxV_{gGG4wM(c2KS-xziZaYw|%Vq$PSZ@VZxtvOw^=sy~Usi+ZG_PpEre~Q| z*jtWIWupqa#ky1#eE8iXtotrUY7u7zUGHSqdWELNm$6rRjxfZIb zGh)qRMt=zrLMuRfeamaV7w(SYs)+yUr8}&z%FtA&o%c~&AM_=>M{WInzJ^E3DtSEm zB98nG%VC>WJ*D)P#4niE)^xqNd^s+UfI+>z%AMUWtAJB~S)y3ulMH861ClM>{=!q+ zi1)nl;q{K19McWhPB#8~gy=y3uM#3H0Xdds?|0S|WN2fueHht)J-Y@sQg$m{CD&Dz z7EA4@^d)@}5&1Gg{z)&gwz4zK{uf5he$&C}` z4b~aDDx^OTp{x4|T`5h)VteImbWb~b37tbi`=m&NdI^i|=_R%z(3cRW(>2>~;xnFJ zX1Q4y#tiG-MN8ZfEswd;iX0q&1XZGaPJX3(NB^7aKl+$N_lt0;o4S|Shq;Z5Lt9$B90+4bYdcDL!{@N zp37$mzKcGz=3PUJ)-U0SFQ<)rG3I|J&5CcA)3)aCt9I_&nP|0(iOd*Vi(F7mf!od? zwZj-;HDBfh5$DroTkJ|h66cPuqC3VfLeETZ5*#>`%Q1aPfF2T~LfQ9fY8!>zVo5Ld z=q2DcvGw@Ym<4Q`fh__yV_-wTt~Rh?U^@+LF|a)bb{eo*16u;@W&>LatYKiwfE_ci z7_fT`Y&ozeV6OyyuQlw+^g4rn0PU7Ro9(nV8=xg8|&%W%IG{Hwq}4E{3>e^^U4I}5tb zgbeeX3mN8{0=)(px1R@l>2{{i2lfJ@FTi;Da|!4RL9_e|g+35f`)MBkvCB2TUXwLM zZ^U?qq5s9;w=l;zbPXB(je!3`V-Jmh<~V?AN%o=Uu^F}- zg&mkq0J{X^yi_RPWqzGx#4)ci*if(KIOs9ME|YX+KfC)1O=s!)>N_spI!bHDyq9Sn zLuQJuormA_5>0QRYscpw@MNaJvqg@5vFvXvbWIz2w$pXjQ=6{RG{*t=>6@<9dUk+k z#*o<~*Kyl6O<$*$-J^5x1Fhp`U^xSGvA!l&0c{&t6SNKcEx>-JU)@XBryhTNTGRK* z-ml(%9<9oo!5co(G<^Yi)LZEL&CvhLz~6%PX8HkOTK|KRvc38KhNO>eTTQF{TL#~I z>AL$Poh_Pvgsw-w{g@~BL8bO`O@Bh^*{c2OE5i4izr($rH~atBgztxpe@Dtc;OYM! zU9rzSIL-2wrR)|r_!nDjx1C!xeHPJgyzf5pp(S!JoM-v#rZ3j@B1`SVRj?7$HZX0o zbuh4|*N5m0pvP&Qc@FwyXB|%yvKYJ^v({LC9Af%>gXVa40q848isKH)a*kCTkESuV z7XjBi>%g;T_QQY@DS=3t&Y z{Z~V026~xiD_LL-FnMpOb(qGvaG|B*G`I1*nav?R0 zj(gF^72sif1REq z5Pcv-&xPn>h&~viZwb-05ZwsTZP40wKZ0@Vx$nf>m!ggBe=Tq=^U{#aZo^(Lh0HGC zTIOY#`)gspy}DW5R1hFh<-RqTdjr?>A_k*RO}#-x;Fc7or~x(H|4RGx>>7`;#I1 zGok*!WYCea8N*=ssib04p96Lm?8)~3X{^y}p_6&ouU`X9_jeEa z(=qDjf!%A2;TIyt@H*gn46g_Fx`;9SBJ{oXtT9rYOA2<$%a-w#ah)i()s zrrnSBHvnUOoWK5xP`Rtt|Eutu8Pi}uZ+TSkxz4DvzwfEDQIX8X>FwP~PAs(jRM%P1-eVbwLcSYFy-N3cIe;e4l z4SVap--EujJ%0!M?=i671^!;l_npAB&3+Fy)BNuT_K3mr0ipJfK9_zUd>=4){y?Zb zsbj{6gv$T<(r4Eng6~5{e;)?UXQhteA3+}<#+cs+O!xIsq4uvn>;FjjdDKTC^C)mF z^Kr~m(~pJb^vB?N%$UO`g{oOTVa(xi@P5+h|5NDSLc8wc)96F*k3RwLr!mHl0n_|{ zDpcIjw)rz)dVf3#Oz)3B7ixbzY3TSYbTI#CKx_WbfuHf0p$7Oo^aum{0x-+K{sQtQ z-xqXMYV`^ZX5X%(Lms!0*5q{uXjyh8)+C ze=pR&`idd%i`XpD^}M(Dijg*FQs-InHkY*Sem9>^I;y zjQxx7bJVAdKE8=I-V?f3`&XfAwQoxKB@+7<a#o zZQz>zu2AtskKt*dYVhwG{X7GlYw<@A1OEfMo-uU&r%-32j+4&<4-`2c!lGhZ$3&9{TR`|{OB#emB-&8p}_r9#Fo&v@;M-c|3kd?0O?_m*1qN~cY; z3TWScFkh>cDm(t6_y;)_8*d6*|KrK1grZeNoC#U)}rusEH z{TkEMX}QKjb=c~&rG@SFdb3Eq)jMrv1Gkx<-(IiOn^Q5#rf6a!Q3*8jwPIY}6-NA} zb?mA=EpKF7Jmn;^liA5+GBcJ=O^zqiW2v!mXKd6?CQ{?6i7b64lG&7#O{deD?07Pp zo){Y$l_QH!OeUOkI+;vOBuPbvT39Td%B04U$>iAB#AG&`nHWoEC&pRl$cS2iW~tq2 z)_A~$cDz-t#jExv8YBIXT3OFzVk|R0$@)lH#z`czx@*#L6cfzV>g85RO|hY;s3u&e zIg$(1oAJiTl#f?CjLUvCE}?jwzBbwEM3P5Q?Tpx)2~(isgYu`Lu8}7{C2{KR5;gWD zF&hkdYLv?$IlDx2seo`Qk!1S?G|UAw7M>;$Xlcg9GPX|}A zT3(3rl^?a|;1<V zOK`iiK*lNUtQX^6pcu6~qvT9unyucn<0?uuNg_k4>1HdhKi_Pgma8aP)$F}~7kF+F z!=@oNN92@wuJSWJo|$mclN0F_&DoilNb}yB3aV>J|7TAhPdJloDJMzsVA9|1)U+@{ z&JmB-XkWn1XeVNGg!HvYA8+bLxZ#j=_h!9At|a?g81dC{bfDE(2oKKNCM+FTgNSWF zJb|{1^j*G*n+rv|Xf&{Lv?YweszqtDSz3t&ns@U zHj?P?b!^L`(#iHSx-Pq9OUN9YiW&y{P%a&4a0B{gDe zHf77mJg`g5IlfpbLM(lJF(*PSb9}M1KeSw> zGsX1and0D?;^3L$ApacXpM(5!kbe&H&q4k<$UmR&{FDDRf#W|@T>0?=O~WlUWyW+F zh2i;ft6gfw=aSk$&HCY7HGd1Kl&+jv$jGVZyeyN%D6xEb-E~`~cD$gcsvKXlBKHjO zX1aNm?}ymP;?ayUQ|;ouErQ$2V7s^vM{xU@ZHQe5TuyZj#bK`CfMGG235PhxqxfWo z9Aca>8Pj0&y)VQ)88N3|J{=OsMyZd=vqN$zKEOHio>hC*nc1SIvei$fO}}chdnoHR z_qEv`UN^}ca$J+Y#r(Z>rvkcDJ$0udb*K93b^^Mcp1Pe#-A-TK>45HZPu=NA-ONw5 zALa1{wP4{~-)sxy_PS!+x96I@*XOo3>#bJqnp&gN*3qzA8}&T9~R&;+=8l^$;2+QX%T3i93M zhugRQa3cy3Rey9UoTyf1N(1F)72iVt#e!gsyO6TMwV?Pz}w6e+o=j01cpR;IWkC!ngU zQgH*#eTo$?nkQ65+gUnPs>Hj4ye?q8rR%C-T(5+2{Tjv%7cm%-SH|Q{u8eV~!WxfT z$+)3XhO$_8q!GQVx->@BGJ5GEs~Ik2l*&LY)3v{hY9?YH(FF~>uBapF^I6njQ|huN z9yc<(6RT?6P+8;lt83g7DQw(eW#jfNZIA(V6*mg^${V@W`_(tDEO1<}!f_)@obYyu z-YF+o^tk=19zJAqJxd=%)QIB8?OFZw4j_L0gF_<}Uwc+Skp6F|fx5F5RR?xuLN?_l z^QByw@3o}@`Ovh6VYhG2r z@r;)h8Zlm1AT&h3u*gKevCuNT-&w#qyn0Dq(Oy~f{{7OMYh<-a1Zs`AlC{!Y0Q*<4i&qI+kibKIT146OC zXBAZsl_7<$5~Qvw4=z0xOIzagQs@zV%gjQ<8; U$haR4{r3P?gkJgiFVczlY8R}bu3n5C#aT#9NC?X#4o0$NSzB-Jw9}zGPK<5Zw0jbQ z$0)C*r|uWDS$cA}5)2L@5EznS8wSEQ83If~W?^4uGK8@G$`AYz{0A)Ou-seqm0rE4 zC%HSA?HtMHx!+yu-dne-zAh&cLR=w)7^i21o*TtE;faD+5sugt3!+YcnxZ7qBpani z`~e>k@nHwoi82}3Voe%Xq`7i`Nz<2!RnaDMA$HMEypLRKXzi8*s0dHeARak)DNZ4- zgvPv~-L>2UlO@q0qavAjqJu%_b#&oRjMP@>sZu4B>S90DJ%;KcJr(kA!|3ioMn`3- z*lby5qenW?&*%m+IxS5aG)ma)R6n!bfw6?Rnx2(Gi7$5jvdaC!C}!C2Nt)ueXmynv z{ggTOWm0R&zG#zwm)>e58KdW-P}AGJ`uP3jgQa&c_`TYiZF1=+`1Y{u}`PI?!xy34MSnx$YzChTFCNtwJC0 z<065W$KiiJ{Ery^4?zBEV~rgEeGoM{Am{#S*;fhZgrEIJ{n>_n9YoxRP^%R3W?BP{ z1Bi?F$t$3rh3qOL&l!52{PcZCG<}#J@7Af?H9gBQJoE9nBvEX48*C0kruFWi=c~`| z@7ldd($9ANF35V$&nGDp&Seobz5}`ohOZM+_l0>~%VncqPNNp)T>T^F@+Qi(23hzR z(e%yKsdf5UgTDs&b<~jQbKq(J9YuC?yP$ewUeg~`^7%a!&EWC-_c0H1 z*th;)sC|cJ&x4+!Xt{+we67{t{_$4W_}HGIHiPKLNjU(Bbv`dy*(xjm!2ghut+8m-p{$G46Fn zKg=8bz&dw==A2lzXw1t|_|P%l1>R8+{OFwShJUSpOlVvX%;{mo{AT!Mz1`Tajzcd7 z`4iAR3E2r_ytjnLTLO=tG2?jzK2E{Uk}=*}g^z$wp$>O~&ppfg*9z*eEd2ie2k><) z_k?1(7rc8SYQ^%mq4wJTzL5Rf!MiVHuX8yAA8(g&t6a{C;Qpie?+|Kj>Ss5`Cg}6^zqhT4;NDj?XwIh{lAjOB9}3YIL-Zpd`lBKGQzE#wJ{O{&3h9426wh;@ z_5QVvJoVn`ir&5R0r2(S`A+a2K>c_Q9>d;Qflt=qK3@Zmeerq9Hy7uO@mr|ry=2dE zdC+OWz6zf1;SJQBW#>W9VE@vW7R-MXya&PWz@`nJ?zMMe&b0o!!Mh;T`eojGkmD}M z+0R4ZYd;TTZXbi6_kwo;`WL~|`tQTIntl|$pwGJZL+4Q=whw@>eLe!7_VE~EcpUm4 z0*|rCH;Ko1;=|zc+Wi&zcmi|yTk`Q?X)7d;`~Gpm_dg5On>s%J{bw)uIu_>rhU~Qc z6X+|(IiEmZea!IrFW~F^{uR7W!skc9)B2wd)$B>3*2lxJ{|t1VG-~i!@b|*!r@+%b zJ}=ao()1UQr`~)14LW-vV;@g}KZAYd--S9GpMv~z;BkGwWYm|j+|zO{RDGTn{u=v= zP;2?Ei2Fal69(@Y@J0;Yv*3-&m=#X^D(s(uT<88AWO}{)r%>zVImo{Zp034z3AKOd zTKqS7`q44`4`gPnUjxsK_3Pl7v3>*gUxQr7dIMzKPhUd4zG>9!TcLV=8$2_H?|^5< z@LllC7`_Ml??7(G@V!tB{8QsG`i$dlg@}=P(f#cF!QS&uv*p%nRxX>4#adpoUG%Kg zb~*M?%%V@#_VU&_uW-`#n(pST4see)?W(hE zdqLgPcC}G4*lta$D*C)r%v)i=oyngy z4IuIDr2N8cEY_~M<$ANq6|vg%m%(buV4K;+u6=rTfG{&im>nd{(V%XPL(Ov4SDej- zdc9eq(duna)u7z8*B0uPdUG}=)f7!iWU8`nuC1=r?`qnexHKTrPGF9kj@NG1tWw>J zGds1}c`zvp6HlkIne0TGJ`*#O>HK6qKQ%Rxn@LY*Cz4h=HI*S^W@b7)k)KHCb2Isg zTt-RKQ`z(kiza4rxm-FoO@F1Qrb(JeP+?;+S@-qU`7DhXmqbyABjY=6&B>Q|CY5G~ zlj<`)Ig!gxPiH1(GE*~?(^GP=ociQ**~zJVK0P%vF+DS#&#^Fmbn^8ym1gajNcS{5Y#8tzv~{DBh5Il7UjC6L_VN z6Z*ZF>Ll26G4-IzyY7}OUW>=7_L>v#oxnmSX$7aSkTEKgwc6(?2}5Wdl8u=%x}MT8 z)<==ul8xtVQYuco+pS6Rl`s?=Hmx*LEUHHGS5Bo}wTbVykksU~(y58C;;~xE+2jx_ z6klAL?zi&YdGHmFvH~gkMu%80thVfMxk?VJDt8Bc^Mvw^-J)#8tMyX6>o93$c|zyr zxFZu%M-`GkVc#@s@Z9Apw-=0nJlZ>s)rzF9YR-F!EJH@Fl8AK@PG_N0tT<$^1EuzZ z(BY36pARqJ|dtCft3~4%cZ+Wlxa3@Zl0;lB&IyT z?QlnJZ9U0o(&m(9jVUvB;9zNIajxnuKr)k7aEkO8hDEm&{tBh6BaU|57Vf%e9_^OX ziZz-}(UpvKcWu3)=5V%$O^5F65D9Dr2~_M3ZQ$`$T7hnDjrWj*rPWj|BQZjcS@zOq znFzDorOmPtX8B8-<^1F-^`gynAVbJXa@vB?md46(@&n+&mu#3pYxt{r~i zW0TzQ+Tri*+F^L!56}DIc|Sbwhv)t9ydQktN8Cl^hIbLeyNKak#1NYdvB?md46(@& zoBXA*3I7)rS^q9#_t%S*Mwxn>Pt(J+k*&Ec&uPY2)7_1~zEP;!50Fbao%zkYOuf)W zAY?|M8Gvkm8i7n1iCfp#O-lkGH;sY(SuRLxKRo&)kkL%GLCS3sjG4)%l-`{s8;5*aTcP7$zW}xqEz<0K< z?`)*+>_FeSfbU#i-?>QNtWUoe5XLL22@B&uQx?E|`nQSGr;aV(Q&?!$Tdl&eTBGgh z-LTgijl6Q_+ZL9VmKW1%sv~?XwY`uNV_5QV`kumy-CT3Lt_w5xULeW`pL(MmSiN*Y zNOY5Su8-_Co#cEcxvrDkHl5^sC;6_E{5G8!=O^qhiOp58 zgV1@oKRhoF#^>ckph_A+fb4>FgnC>7J$hx-TONee%LAc$Sz`5aaH|Ty^+>c{?gQ6p zSvC6NbxOai-ZFS2FhW3Gz759e;r?f|9`1A>uS3!Yu@|Bc1_sdQe|G~-sZAu_yQLZ^ z9>y;X$CtMX1J7S2z5nwLNq{ASfT;vq_;Z%2x|63g?&m0{yKl zL%m~|S8@ZuzFF_f3-@~uX7wvi&!KP8F}&s!Tz=P;3LO1&rba4=G4%K-v|>aItvu8v zp_EKc%1prkD#kV)ba27^ZHE6}E#tcrV!zzmAQ!a0Xgja1StZwAtJPbKG+cUVIwk9t zgZEb5R?Dre9c(n~Uft_7oYpO|*j~3*th7sxbz9Z(>`I~Kl`8J)5rf}ytEEHyS8Dx8 zEY@ZhR*j&4i{P+hNh^XchYnfCc*m_eHBa5a)ytN*?pXXa0CN2&ta7_nWKq)ESa*x- zmfNyg6?bjjt8^%2{%wqm$;hr*C)ur4mUc1EABQM6OSd)vZJ#+qNi_Kiw`Q74xQy8?6l{-XVzuo#g+e@TS2pZUtDuC5L=Rx} z)|-x9qWz)P(%59*<$#ZW;^pr4bMk>^Z%Vm+mw=s@<$gE{a=z3X;aOUvFl{S6CC={ikFcZ?*fqIV?2~6?QePftOX~Ms;|d_D z|82u(ohG_D5CjjpwC)Rm)j09sFqaGd4zIEQ4Ap;3 zWmQHS{;{Oq;`*@Re=9t5MgzICXQS3GDX4p3d1eh-$)u_OjYz3RFKixB38Y%0`)}7e zMt|=Kuy!ZCcG?YJ&DcG*!x0zUSBw058>fr4;HQ~ z2+SCGhpZ*8^h4MB@{2&^C*r%gMnUs4X4sDl|BDhrzWrrJ-eo>9fk*C=Pr8 zjvY!%JZ)!Jn0DT;_{05_%g4`L`}Wt469yVu6eLrjy59R_b#*sZfe9B8$l=&U0){vx z5zyg+d;xNKaf%x?VDjv8f#d1@!g6D$`_9IN=UUIzoqPY__C1S&kYB4y#QV?Io&_1? zE7sny1Vbnd&Oj*x2<1I1skM^hSs`crT zgOS8icTXjU+ufhoyL)psOFqA{r+--VJV~|m3A7y9NO-F++E?RXs~?}4p1RX-%2|@* z8;IT+=e_%8xA^VvoQg2_ElG1f50DPlJ|!==FG`HAuBXWT9iUk>SakvsRIF1qc1$(x zg+Oxh$DNmvl8|HLnyVemv%NN~`?qXw+X;hmiTKVX$EQGA(r>_XD4B17YVjB=6l+ zwvclxsAN3gw%01Mw2~)lFzFCpVANCIaDmfuI4XMbIPz*#05+X%Ab!D`Bj1g=S$Rz7 zimv{oPxQq}Igq< z?GlDg4g6`N?%x55xL*-=Q$NT*@JMon34YmF-Y$gX=)!?35A0j(eePvdiGUh5!O_Tc z#m~+A&*>>hcK6^{T$%o~Di^3b+Gj2~$-rvTsnXJZdzc-yDrX;lJN4T9(*5}*`yoRv z`+z#q1oVJcKov(8^}=@56+@VPkUdcQ8*66#wMjUjB3` zgWa0ttLtGyJv~H3a1go~)VQ@)icu-E3{}j3?0QOUKI$HDV6mW7)Xn*Qc;$rYHPLDg z-@f&kA| zzGIRHP-<}Vaw$jtuXEP_iXQD@;aAo3L`+e%uFfmI9z_z2tP5BCKs|8mO@vd@*!WFg4lA)%@!ICWl3?FI&LO8Ma!$`>7%ZZCw=fFKB0f0khO7a%-$ru%{W7kjUN;{0Zx)BM>dvSGfutGY*o{F!%qI}{#fX;b2~^C_X>c}!R> z69Tnm+V}HjomyEr@aPvPiT;Q}f&3ZrMv*^N_0>UtdPG6WwSc){LgVRdC-TAa zgps=!i@#rN{d=)6szhVo8tK4TOn!W$ncFtX>pt@~dsOX>E zWG8PcuiD5NA-fB6Mt*>Spg%^~M4VB7^Poq&R*QF&uo0A~ckO(S)^M{g<&EJ2`4D_R zjVRxHdrDxm{Uo2SHP+VY2PwRRd&3_)%U7*F7Uc0O@A!qP=nFxvbn;JvCii7@X+Hug zN*dX8v&$c0zbd`8xQT^|r0k2s5ry`+;Q3syVTKD|r+Q)MS+QvaKlY&H)IpJMnYi9w z(pB1(?4<5D%&l9PE$2s;fd@;is}?+5*rOK~`^)*h(AIo=rsr_8Gg}XvjW+m11DSr!0KYx4g%i$4Wf{hM83hTqibAl~vi)al8`umR0w*l01of}aExEp7J|ohVx|I=^Uo;XDiZ+#VM&%y43xmh;_8-G?OQeCIMT z&K_~tY0ZV5Th3>>W}>AhX@eKFk%gC@jUfx$6MM0Ka$a_G>dPXAkdLuPYExiC~-{IHJ*sqeNiBrWXLjEf{Y%g8B;4@6 zfifxG?UC&3iZXewx7@p{vsSlDUx%R5MaXL>sE|Ninvz@ILK#lTMXy3H-z~^XzaTI5 z*0~wG-U`xFm5R|^_3UJ)iR}UUs#i>l{(=3qbkADzH#&QUW7=6njnjRMOF2;9@U^>-gBr5TaYt13k1R8z#x7u>J;cOv8 zWkgG#p+92To!8ayX^mIT01dRObiT88z1^nfI^e5#@PT3TBOb%RLYS7Cu+wZ8G3XmAJZcN$DO^9-j`*aiH?8mU)`6|Z;67Vmf4_42I{G;$Mr!HI zNbL)>N86!VZqX8XxTo_%h6mZ%u+nSk@CkS;jr=$CtdV|1>-yr!k?^-b*o(JHAIRNl z%-F-c>UwI*Ad7o&_*AfV7Mf$&>D@O`F!sW)9!7H*fj9qvJ8VJQ@dqapcZk%=n3KI( zD@d-M4w@M=0>>?Q$Ul%Y;bxmt^}3nn+w$h$i63l1Fp574HTqcRdLiEq^&>yIL!8_4 zD#>LXiB=-Lx~eQV$Cw4`G;t{mv-otXdL6`AdU+Xq5PSCS*?*hOI?$IEtl^l$ubhfZ zXJJkjJ^iS9zRD2RQ|UgJ(J-0$ahYMCr~6ZZkpR?IbontW*4V=rn`u1YV4rsdc|t3s zy28OO5APJJLu+^^zSyN5s^g`kxtF1Q!=*D4YKU zy`ZY=N#dTND#icSe(8FKT5&5{+9$pbCHN@g&M4y!^qH)%o|t%`+ecy7>Ag=(y3qFL z7#(;e4RH1>;hvjE4HI|Hq6+UxB-k4gYJ|=~luc|EGp$cP!vo@6CHy)n--E|Fk*$GH zn+Vm+C+>d$JC0^$KA{+SXlHqa?I1I!`S@q30b#}6fqtSv#OeB9xYEBd`1Wev&&OEE zXdLmc$dH%rl79RN^?;oXq`gSV!ENGl5BJDu&(=`#?aGF>f!tInNp-H1$X z#I32eAWlb1%YvRJOnu*?Gpil;Cig)+O}+DYMqzBTan+r$KF7UXiA76~PTeuIm2LQH z6Z*!;zUpU<=ZBDvA8lK#(M9zI(ypHOfB%CpPky!{r)Gt5mLfVNh0jQiCM0L`Z4ajmZH@5MI(q@0U`_ zoBLH)_vkG8?v#zrF+C*hnJX4&YI_w~As_94OYi{!H$crT{A&h^lEjez1Ar&a*?>0<4%#`yAMRn)h0_E5I zh^3jD@|=e{^vFV06?i{$AuAxpNLJs*yPvu8$YR|sALYJ0KnNk#Ay1E+I@ck>`q1{) zT@w!Mup=5*1Gy3ZXz;K-5h1-Cj%zV5YXO~yikVx?f=6Ox9U%jZfit)(%KxR8IWnaf z7}BrU@=&9!Mg6$HL)#1-+1Uk9oKk1_D@w-}(z)T3=ceDUehPcO$MADIy7T>w%q+`` z^a;}*J;v1F?nt>zldwc-SMP}MzNiSJt~?k5(N>fDqbg3?l}<7HqXnMhy^pELu;6)7 zR;yhw=a*~VS2kMp?qzBUOUtnH;xr|NJt#2oIv^46o|;ua%Nn;GkCVN)zNF{(E_O=# z;_Z3kZ|wpL8^~z8;7Xy_*2R)@H$Bb1K3Hx6RMl^{ zJX<%gKfQ|>4`i9P*U)De|14M z*w|8eAN-tRf5bYE{je*~gY=+}7oO}jfQPGo`}Y-(eM9#AYuxN_)?)T<`q0oQ2XtV_ zY4?cH2V4-l0&eU(@4~n^ZDP5W*X89(uVbmMD(Ez3GuuXZdAU37gI`2kg6eolbZ$2` ze(UM)fCe9QY;64cIB|b>f6;EgqY%2@Knw#r{Zcl^55r^V{(c(yA;$P8cI-sLJA z@^H2MapGF8%IZW3zr8=X5jr*Vi0Rt_FDqgg%A)GeV8>PAX02cJ$U~-orW<-iN49Cj z&Wj&>%EOvz)7abvCxxT{Gg@q1AKQnpHlB`hT{~Mf_UoD~$||j*c;O@aleFss z$*~R_-o{FdpEr@^Nuez=Ke8K`mzj+rFGLP1t1aalEzWURvdXlL zhyQ%kWw&7IRN63FBYeBLtA!}J^ha{)M*3|TL zkS{fKJ?eg=*MJq%gr3*%S R`$w=*^U{At_t$UM582)Hd<2Da-A7>F%dt#0ITf>% z1)n*!+xy*%Woy;%|BAhQ1h&1LW>+G1vFzs|VV@qOO;_bE4h|;T@Q#mVI+^@X2GZHlTC*%*!ND(>oW@}}@Ks$D)+UKir%&nQI?K&HKb=IEic<$Km@q24# z3mJrT`8lCH?>`{?6^R(VY}YFjA!P+K5W;C zTxjMwl|G&cnFEp*I_K__I)h^}{D0G7A3CphMOQ}A@6Y7Gu~i4_DCYy<|+ zPk#O}Zo_MS_G7%~S)kR36-mC%Cfd1~P6@FhPvAmmIWVH34zR=#Mn;}t4TEDi0cC-K z%QKBvKh)O;2F}iySXNb4?8FA8CGFPP2<$bSYwX&69cD=ec|_QKT6SfjDBasmZVXgL z5hkX#S;LHQU+Nu%rVWuRul+V!XuIP_lJ0w!HSfGJXLi=bv}t<2oj(_K^RstIRjLaz zWN>JkPUAey({27kCp5$e62b{%)dYqVHK({BCBx)xI!%JA6~c7{rl=X0i}Mkb8Ot`% zog!dlQ19-C?dHZ6MX{5Y`ytL&FAYy?X}Fdb#ZI6w=e}Ox%9^{uG3S7JFWcPk->YMS z*k3w+$02?FT-h&fOS0Q*mKDyte^nWkq3Xk)9sCo|K7oDuQB@Xz^+CYfEgOFOA{6T) zW+#?DgqeRbtJcpDjhoYab+wF;E{&9~o_>Ok_q%_CIq*vwJT$Q21BBgmU1!E;&yEY4 z>DVcYZapjX&^$$uc)@wr2+GRF!fm#C^xIpUc z0_46aqX>H1i(R;)*zk#bLowRgE;R3V4zf1Y4UUh9--%64pK{W9key&1UVzNVCEYJB z1?!Ffsh~fe_E0Osz;!jRGH@VN36=|Yo6CReX)+Y=gFVpeq!UTkY=t$qoydT@&Vk4K z8DjVZY6U{BFyrDFTQm8*%0@DdnZtB)pMC-(9Nwqc^c}v1i%YPV938vr)R-lpUG2eb z3*Usl-08ZI=`41o|Dj!Z61N&RiqmqPYs~9cy#gUaT;P8^0 z#{3HRf(Co?l+&3;9GW1gl82=&>qG|IMiIX}!;VuBRp``p(Je)>EeP>3 z<+ot62QkyAr6pf2bPEQjOwH!7=2|NorzROWi<2TiF}{KLk9HpJrZVWPIq4YVaV8rdL<%NQrJqu3CG#vn879o0N2_qKcok z6MM>D5PEPOBy_a9dPi%`_O_iFgMwFa)r3IZ^0wPQM7nd zQQzhrrj_=@Vm+ip%swa}qy-Tx);YISMT>5V4L>vClGhv*X&WglnS}N9~+Nz1-2bAy9O9*NeQ1!S`zrzi4uCo@!`LhjR2-GjFxM+#1Gn8 zrd_etzaPgv==NEpxXuDpb05ugEv@>;Bbt@_6tM?OA=;3ZJPrU48}x^3d#ZHO?`sx(2QN;N3vr`{%?~&HJG3! zpzXEdY*{m9c%CN`J#3L1xti-4(h2BCKX5Rwxev{$5x(!?9t__kWXrZhb74Hfvtgoh z^fcu%8xK|6_~cFPh=9|O0rG%mSNs`iEr993?DQbV7^`98n4_qy0*IVM0Ri%V)T5RQ z9JnJ&F|{yiz32G&>G5&rI@3tHQqx-)wxFK%=S+@R2S}28B2M*kpimEM5Ioo|sDftY z24_YZkzo&7Ycg@nI&PoA=5Do*IumM>cE~*y0nkcMNK>>#uxo14fJ{`w@}}mJ)gq%y z!1bvx0)A*nntCg~IJ2m@UY6hItH>CO3O ztX<&m2BhiOKiM!^yV`?SN;BDvkf~>2j`pPBUUwg;p)eMH zB@>AoecU4!QFNGx1#()6Mq`o_q42Is_hpj^BS0(&ZXcJ#U2Usro}mo+ceR36mp=q9 zyTw(YLDM!=a&;|E7K^sO)fxSrh`l$Ay~yK%Bc_!#RoEbl?8LdTrG` zrQAFYIi3BP)vn+VJ~H;RT;&U^-A)&$Q5;2AiFyYccr|1OPX_hGChpJHNZ|l-n0E(T zsx9BUW%?vY{jF!#y^e?FFmUdJJXx%l$@_hFH?Ek1wKA)wX4A3zv|A0#SZGozXtmD{ zbP7pF!ipXBYe1`cg`KPqY7hI@*Gcre(uV__KGGd5{Z|dBrd3$;Pw|I3ID21jobk}yAyO*QIn{%_9o!*`r_VRe4~3M%SN6G zvq5u`qpa^v_1Ym_gOif9K#LSpQZ#2EHZg6X2B8Mr0d7;=y(!@K!&;UPT9wK8^>sGG z{||+9#NR3Di+}c;aHsiMRt;iG@}&lWWiRE!D%nO+(~Wm(sr}f-Wa>=z;%0?fWboQL zZ`Dw~>BULbuVr_z`qX<*!WRSbnyDFFmDnpS|7)039^H18u10e0VzT?fgi~s<{9+_K+f<%P=Dz6Z_mmGyiRO(F9OqGe2DpyM z32A7ngw+Sr%ZQwg`rM1_a4g)!Z2)QP`lD;jpk*4#6GZzHR6GQEb?^Xb#;)dNLdI9i zd#EfmZyakKAa#iL__#svn@4x|;({XY%%dr>OIGgUvz@)ynOayACeeQ$eUm3B{n7k0 zb}8UbhD{MS+={7h#Z>O0`dnw`s(Djaftsf5qN(dZ<5QeIt~Pb;&l?-KU6z~on$1O# z|8Q3s*uuyrd6s_+Y+(X1YWgt)?c-G>Yo;E_t2v~Vo+NL^a!Qmxu&hBs9h~)&&-xBo z>tkqu*=?+sIb^WCunYv`+sAXVVc>+dM%nUcYd;GAhcrp?4_le;1cb1stQ8>~lh$eE zb$)Rb)E;)BM)O#Esox?Ij}lgxEn|YkVYLT?BC|#JiieUn4>3#{(?$GdMmPwJ=Vtd8 z?vrl!C73+u=@5UtEEBJLMeuAX8WlH33z!SRHa-`xWD9yBAUK9sEUTnh{aj3YY_X1s zRK&2HtJ!7E=kI83K>{*gp%lKr?Q7aMmBTJcJIrS2i-}tUk(nQHp1c< z&;5d-@hzMm0o_T=+{PU!1EYcv`pNa98dt;i3EsQ{b^jYIS3D6J*gVGwO$TychS1+H zgThy^}g8oiyJ;7CIo{eD!RqNmqBbyWZ8cC_Nu$#{&d7O5YN z!eA502f>j!TG{<5RIxidnDm0NC~&A(cI(oi(q z>Q8JRWD%KL9@rH$VnOj^AIL~rM&Hd(yP?>NS1osJ;A3K37V;Y6-u&d*ksUY)0PB1oW*Q3|q`)RPF!|xXG5OsLhxM zZ{=R)i+`A>4ZI}qTtx*?(K%|1Y0mFh#yKCaYI(C%p)k(H9vKbC65Qh9hk%rtRif)?HyHhk-_LtiivRt zLFbJJ{Bg5@93MWx;fTo&=wDaVt55x_Y|>VWh{>2rJ==Opz~e0*FXHY8z6*eg_7@>C zhINXaqhVSYYx`(x)=|@O5-Firv$fbIn)GpF;Eotuura_sYT5;ShNn+Ofe9Fg1(;Jb z2`a`GZD423Ie{Zq)IntO4>-1ni?U*(XiVO9<~Fc5qsEM>?uRB zKryxQ*s`Aut(|e$GM|ZyZCAQ#fo$SHb!ck{wku?{9o||U`c~e|Xp!UPAtqKb2>VMz>&fBhQZtdhGE?$YA>q!M^teNGdP3qmXXwqMv-eq8@gmklRcfS z;EjndhI7qWru{`Gs~`DHuzxv*+Tsw|CVO&27R@S`{3nl<6``!x|C_;#8Zi&3K|fid zSnj{>sAqjwbg5HgwbzW2fX}u<>&;DUK;aH@$X z=PDFhgYhVtK>5(<0a`{>$41^r+#g^M0ropCN$TlG0E85d{{b==8XWU6jP*7>7l&FE zmOKU+oG`fR&UCgfuVI^>Hr&d?*z@^97Hc37Tc|+?AU3C!VO!fsrl*f9# zJmEr23=q#qx~i*2s@L%H*xKuKh&tSsEj}wn#Q>R?vsO(XXTyxnF~KcTpvu>4(k#O9 zkKUi9Ku;YYR?7b<4*nKv*j$`#6RLH3J`%h({>F5OzcgiJbt%T<_4cS-1^0oT=m}pR zpSOFnxO>@KS;+-4Qssr-hh^xkSH85h^!n|W(f~JR`l`u&61h#a0h~ zT@OI_S`0}!?mJQQm_~jMJ*&K}&G2?ikjg(~iynNEHu1+1GUaSrh~Brzpw1Q|D{}Hm zZP)w9CJyK2`&7aiR;nD{}izQT<vVyV6|haCgYtF!EzKIXMVn7a9bky-!Wg9e@Vc$+rzT&Cl(fHZnVIWGXYgSQs{R z;ZcREvC$+T<`HeJNeVIeIzqk|r>c#K_^Ykv?dy4^EJSDP)>Zbd^{Bec8DBg0|BSe9+dKRKx zR<>>TOeo@ozj@)!BM|es>^(we^YqKdJj$TCG)w8#m#si>Z3}?MHFtGyd7$KByLB$V ze8w1bj(NU#J3XJSuqE>Snbx7L)A|RKcfCP6|A*5|whJ;fI|nh1PCL*$2tC^+Gi~Bb z$y1QZbWHyH4dQt`%~&gAw!-n2TpPUQ2hvl@)iYb^AMVRbF`S$ao+cFkOxtotU#F_P z!;fGY)h4D=?ycrK-yrJ#AMGi3qyzPt&*v)x^$h?mR<2{*?}A}Ss1zYeMOQ>0a*CIz zlr0a`&X|$nxk4!rLz76CZ7W0gY}puaSabL5K)yP_?AQ{iV-u|?({^IYYU`Z)8zJ#$ zJhxg3l^NEukqgb-#-s4p-*71Wc&Ub;ireW(HHYnVM*G2SfS(H?mRl+neQ-_qASp-v zMMOBX@>dkYpGK+$pdvS^mS}5V9^CwHOy^=JFfn_%3sd|5Ati008w1yIn!#Qp+0|Tn zSuSw76+wZ^?ZoSJ7bo#S0OYx}Z2I50GyoQ9oTKh+GB^jx4Resfn%e6ycfVoi0Kf^g z6h%Ds2mnqd0pKJC2Vf8@{XOWj82q|Od=Z5?0*sSG4GMD_D7pSX3L9rPrM}}0uYQ>CpS!rRmUWGA<_Ogaq?RR^IJK1pzIW~J)G3e>Fqf9#xW9ng+KEeq zU~mTk(piUtMj_uPi}`^-@8n@@GDBK8lJ|+Xb4w)FAxP{gWv2T;#~s>uWX#GbDq9qF zjmNsKDsDL}mB|mtfLKw~?{|@Lu6KS*J~01V1jBx*hk8B zib|kS?Fd9SOLf#KDIGSV0^9&;iF+By^G=X3XfSEx*rd%Ly zD?pvX%2!vvra^8KFphCd^=)ls+y@y<+#iddwe%{gaGh}G5!M>O%vx=DVkap84Y3Et zPy7rRKQO7sz2%g^l_&O5MbpawQ4@Ffk&vi;kK$GrYC;}Ib8dFWDBg|9Fc@EuYN1x) zAg3WOIcR9iv@y{kM(k*rjQQ)41Czd$#Zn>4O!J(0ys~wc;t7GvBi;?6&`gRMl80QI zmrWNywth9|3G>l-UQ2oW%Sdrw&&fOi#QsLW!i#yPR3w`)5Pv^N3X8G3At}uoIYW_b zg`*233QSCo?5Xleaj=~0g1cWGQT+*kupE_xtD{aRKc~kW{j1%o;rGSezmx}0V~Wm^ z)Cc38?)UNDl4p>6M+Q7hWOUf)&$AqMw5Oh-E^1P>uGhu*(ean$rugy2_x!}-8*lfZ zp7v7e@4Nup%^W&hc4(wbLvr&nV27dhV21X97RwG9-qt&BU#;xSqn?&wK97faX+8Hn zx@id2J742@I#i^qrkGojWmuu{o_-Xt(th+DJ1b+o^S}`O%=`YdrGo_~#h-SyH*e$O zMoJ}nD(s;bKT<2wa4sXi7|=iTRl-2!C&fwYHTml`6|X19deDMBEiPJEU{w!MeiEXb zE(kIqSC~BCedc*`c;e&b%hSUGqkvrxcef8+>-g9jUr_UUd2bGDX7|y^<_DF{A6)kV z;7wB%&Mh4`xwu+mDfdTTd5yMmSk-i#Svt;Clj2@r0!7A6FBe7f9UE7apWst^!aW9R zzkUbiQa~A1QbZq*Dd3@eC40DcMW2OJ<(Mp{o9t7b+31mU%g?gDKF7yZN<0s#3I!vL(rvR%(=8g{@2GVjYjtC?abOU zdiq378I2qaJ=+}D7GWQ=tZm{vNX}^V@%tA8C#rO0vKae96i^BOQ&uDo0SU?k4SQtQaQQ%E{hY- zVXz^|)exid*6n#pTNMSY%Xi1bPWL8>4yXt@XLeNmo^@Cp4~}7!5FP}-U^KjoaeqM# zRphbESM!R!>2dU$dx}ptD-f?5&&iOsoq3*cd9La9e53K#n#3Q;J1?)gsnAJ#b#4nY z9SQFKl-9E{q@wHeuwJrO`R2jrz{)?6@9_M4?d^FdZ(g*$9O3FcF>1y>UXrtiRCx{Q z)|@O3bCb)NYX!@2YMLyYjy@$U+7lb~kmztZH*eg6(P@Fvv&gzzOVk#C(n>C8lz2hr z{WA67Woku_csY=`ZM>Kt6dx0}j*qTa+=`!?eb%<}m!1bzna;W}xYGUCz4IQ_w-2cf zaVrAz>Ag(p#c$l$qkdty)!TATpYP`@AU7NaKFP zrf0g=+HBRHhTk)5dq&-s;^w04cxzYWJigU;QPg;A@77}@GrVcnGCT@}k)^vK*xiq< zrm#+ykSIf$o9i4`ISP#8QN?|?&gJa^+wLM&dHiN3^mxof9o15=7Vf+!7BF?6)nX(f z+MWiXSfF+EW2RH_mzFEY^x1T3EJj;~^H&OBuRTad=99mmn7sGvuU3t!tMkyPSRc;7 zT*xyzvz*v(NJETJceJx2vLpli=A)~KG?GrrTc4wIX+uVosW2aA>v!Sg=7Ee>uK8;D zZ4OxOF_E|%sqV;`+QmZQ``mSBQQCjsIW?u2%{9L&_*U3@h`z}0Drg+Q?9CCxS)1RD zmV7+(RAtb6S#nlJCmJl@PxTicld*`tLhs$v&=>0Q>^sXR3l~cGYk1P#59>tO5$emk z*he}`Es0@OEErMCV$3%e%7p_w$BIDVo*Y=Ldd)@JN4}u)=tuRmK2kxH;pU0+qZgPoZ^GMDj!e>^#7Z1@UivM~nD)1h0j1j5kz%nqG?*^oK1enk9 zEqS#g>x;-?c}c%JMv=~Vj>+a8p^L29I}Xe7U8gPD^5lYkTSh4>^!N7A6fkOMd)P9s zqIBdmSgw1n0{Y2!R@tJM?di=C*m$pmq{@L#6unj1k}1xy_}`><*T~!X;w0nA^|bnH zt=}eQ$tmmbORc9Nia#Cn|2~`j{7#IH-yRy{$@4P=3n(f{1MZ4f+%h!VbWNs_ZP&MG z*>=_1){40uI%SyHR`d8r)g2kv^}0}*)~CIVZ=AfbI}MY8`f5&lXc@iq$L%ysdeqzU z9klg5m!@6V#8u6``sSJ-NbOQg4bWm>7rOZy+6j7D0tZ4g=|cUXjUJ3bC~K??m2+Qk5mf2V;8X3I3CBqBrpyRS%d=O8Mz}XCcnK<^Ve+gy16M z8dimrxiPS<5SF;^l_E#@FQmD~Y~4$jCcCzjo!;sgV@>Ot3g4`<{v!#1$L<&fzt{Cu z3f|n=mY1!qX~fxMn>X|leSqqv(}-VdFwkUQp6IR6^}$^`f$KT&RvpHZ*kgBRor=MV zDk|BGCp#2A#uf@)&mHaIBI2&_#4G1$8o%Ovea;9X{nD62r>@c)?}mA=3>9CQ&Q_rb zHoj;~+oqAKt#OAQ-!d^vT)t_~Nq*4>Z$IBV^-3Y~y(V%7*xOg;2Gjah{1MAf3;A9$z~-_yo006Ka1OmYg2 z>g^v#3<+f&IWg@e5v~k7MaMP_h)W1%jGma116wCJ_7DSk=39@qoWmKr zX;~a0L#W?RGR+Vp(#43hrFFS=<{1k2tcQbR)0D&V$IJ8lBTtqD*CUFCcdJ`WyL^ZQ zS1+LhDS|5$fg?q5{>jp*>k;Wb%o;gVS=t0cLAZINR-mX5wq{aK{UMh%C+b;WTU=t> z*h@|#(YR7fFMEOc*aFRBmnRI_-$uEjiJ{_)0wn$BNAK85GDdz@CSE0nwO_mS1xKw6XkUUn7_KEe|Pq z30NiO9F@0ZMoN<2AS!xT7|J5{8HhwVSoNFzYX#BswnHhbDgSBCvIMdAA}j*oqB$~E;Nz!uG`o} zcROa*m?&|vUc;;BBBE~23Y7}j2dLXA0b?$C{n18=?af;jgZ4`A6DK+0H(vTqaFoly zRo8a8a#QJgt2b-(p9z8!4jEG@r!Cz0Y+p*iXL=}c3bZ}K?XZV4ZnC%smCa~HN^zxDWNUj3L4TX(pnI(!%4oMg1@H8Z@h)Zjfhr!a@Ub2Mc`&49JHDHrUnn-WgPa(< zn`3Eg6g!KWR63l?px>+FEe-4Z304mQhw=%~vF%B}5ieOaeR9E>M+1@X;seqSaQ%{9 zJP+@Sg`MyElpFujui4k<@ZzNXJZ17nv+QDeOg(HD)@(n?y^5DOGo`o5iD$t#rs6TU zQII9GSA@YCLoAtP>n$F6xVKz~&^_Q}{=qK2TNL9XhNLptPC5mS>dSgme9!eGLo+8eKb$+^X|oKLeIu^wVl)=zVG}V z-mo4}N+XLyD_Jj=*p9>8BGZLbKxNmgABk!vy z(l^iRR972YNs>0ozu_Njk8Didb z3Gmyd_nVAdW(As6Xw>f8ZkI&pOBm)r`L+$xu} z6OSUF{Rl7e3AwY2pp`yhuP1ce&j^?t)(g9Iz6yCW5C6fTjPM|6R}OgALz#^3Bo4$c zM{Ct7+cmr5Q7wAUm;OFems=h|G}%tQ8P7OqC8@YB(Y`JT()%4^UtRA)n7TLLWLx`1 z^*Y&2&zou2v{E7Xk~)COINztJO z@GMb9TG0&ul|CWx4;*O4cK}Drhi8)>TeaZ3zBk*|_ErOJ5*1=Yvi+GxK>bS`=q^{> z+Kw{bveQ8Cc<8bL;X5{gRl{wjEFxxvqI;$Lh~F~}+@^@`!GqL<0IEXy3t)94s(a!cqhoY_t-4vn$=czq3X zFqct4@?s@VCm0hoj!co#molrOELZJ!iFId%$xd<8J*R~DScD&w$MvYCk zq@Y4kM*4qT81cg)abjp?x_A}v5i)06l}bMFdk??2BD#MOK{rJEa^W-11NYgi(oh1u z+R#^|0!|N9~sh3tt^rs`o$y zP0X<1Vx9JS=wP4nutpKl@jS~SJip#XVfhIAYkZMwA1kB8@y9Xm-X3U2kMgiB4QbX3 zMfXCb)9d*?&@acll~21QmABk!El97Y+UHg{d~Ho0^)H-pww`wb*0_eOu7B7k&pdyh zf&Dv;bTb|Mw^PcdCHrqjc{9kzPzBb5{syf=oliF%>*!A9#}+OJ3@l&!bTgr3XOO|b zjzQ=BcbLvE0)!JFWUD(TGw{`|*FkssnEx3%=mp<7&-j*cl{HXeuK?0czXAM54fe@r zu*G1k6hIt&#DTU?bqcS6#}Bg1EOR|$U_YT0e~0r-<2s!jgvD|KJ%7;fDzKk&wZ;z? z#QB{M2|r6`9UQ#q?IVk=zqp@;?u)p}TAKLaH>DK*r^L7-V8$L8aEk|Qunf`#upjJ5TNp=O{ew&oK& zLXT*$@OD#hu;27;%+;l%{DUmuE$Gk7|(rU?~4jncj@D5&c*{n2Q(>Q86U#)l53+dkA3ed;eQxyn?yKKVYEEhPxp+2hA|nS;b@%-hvcNSe zcVu+<#Rm#f9#EQ9on&sAfJ$C8jb^!@C*89237=`qhd+F%0J02C_AOCSSk5Z%`>mq- zmfv0lg%}Sk$acAirk@@ITu>p#RdT=G5LcI@kj=hzu(eVtv_-2JvmT7^nezz~efve1a5B-{0SSZ7}NnurDi~ z9>py`25iYOVZc?89b74w57Y7>Y3DE||Cc8`7CB%W%}{*YD~!3M(8Q==BJ@uR@^>cG zl9Ch;Jhl?e6!Oqlc2@KA{ckqB`-6ei({;5klTPH3d+ps{MmRw$=`HT>`8@}q9!`Gj zbgc?Pb%~sk<`0L;GXSp+rG&5p+@xL#XZVaF`RA*IfCRvx@Bpe)$#AuUq&myU|5`6! zPr5qS_!u5q)3a?b_?YSv>E;>5ddJ3w;hv5ls7|mh;C=ghCi$4(aZGMchiYCzE`^id z!*R=4Zm!_Xs09!j>VXD51%y8oDb;AeyV$qPO^3mEt)${RJETVr#gxb`T^e9&oFQI8 z8f$rc#KtAik$)Gm?gZ@8t?OL%y1IH6>b1OfY;{4TlJcu79dA{xCwzC|Iqu98#Y0FD80gc){Z*oTDIn zvji1Ax`Tx7>qC1tP;WO-u%z+fkp>Y#4m<3R65W>3(T6yDZJY{76uZihtgmiQ>&OZl{r@Qq$-LfbP&N+D0_M5&~54s$R7Z;b)EgH9UGl;}KxCH-Jo4+_uj z9hN{hYQsl)^#CX@abn2^W#k&@cy(%CO7^=zOm*%VPy6F|Gx2`InP1^i9doMIn=}3q zcuHgdw-M?!ZNQ`FxP~ZWHHUi9d;F?Tvz-lb@r@9`MAM(2we?lvCtfS^j(K0?-YrbL zCfW<=JSpq^=`DDY;Rfu+>%DUqhzV_+!)K65*Xc0l!!Dc=t;fYx)#P_FsMhe&08fgQ zRTP0tazAwjv*^NOHHfuSSnrEaXM=9*ckwJv+*J<4`MnRj@hRy;kQ1}>I_czzM7Rvz4__@A74cw+@&9)V6jND#cu=2N6L#9@R+W9*iQeN=w7hH6#9pn*9t**B%p@N5s zjySLQPF6-dEqCDs`|5bD+YY{N2(`NwIM`qp2^04@=j-$C)5%}jEB9W!JtJl`oepd< zoh+4lf?JB4L}Sr!(mHq&4$RZJ0zLRi3MA?nC;I<{Bt3I8xXWS>}J@ zH)agFJDzWvByp#YyzutHMaWJj3?m}Pp zPzp>+`|YlP(h@DI(`I_js*g01+^0W(>9fm3_c2con_dQ@DFqg*S#;z{TFPYogGh*T zZ(G@P`;jN(DL|572;eIw0OI;IVN?T!UlE5pAl7{+CyI|e0m;->EsZ1W6g^BksJ4iA z3OB~@EsbmUS0xuZlh~81^QG7g|J`xFU)sL--G|PQ_i6Y~JQ+XejQ4_Hw!pG-pEaeY zzB)8V@185)IcKFt^As{AV%CNPDQVku`WL}~Nnx4>U3bd!0(hc%_ z9vUesly7toVNtset~rA8?(5zW++2~!Un2d?K;zOng6oD=KOJ%22R9sPSD&zCAo@JU zz`@QElpk9%zpWr2qRFSyS>tgsn|U3+VJVMwKMwrp^PYLCK9;4|{9v%SIPC{L#I85b z(o*The{X&i*P6ah1{_BKTT6~^oG-fQ54hb1PKN!*+XU>GhY#u)eAjP`Chw$8;1#3% zm2rrSH~Eh!kDO~*uq)KsiV1wRJ7oL~t4$CP5^JPPps|B(*GR!@Ue)XLJ}P&{I-e== zS>)Yb=PHmgfN#R}&Y^dUAgczEdky%Ssd?#2%ij!{(nRRv0lv)4=PuoJm(PGZl|oHT z+OG459cS-%jfTI%TT73i3?G*}yBtzh8^5=(?&#CzVt)uq?f$ zhB8-`J_xt4PDaldfea3s*;j8xLHk$f%`};lHlm)?XeJf3U zc|bjFsRXfiKp^Z6;ja`fPy_?EDDi?jh)Uuc&}cZlCZYLHnP5N((nXDSijdYpx!O1z zR=WP0>T8D}>Tg!8pvx-Q^!BToh%epUi3c@g)2(?mQaCqu@#rQ_B(4Ez7s$54wQc(F z0`~R_4%qoShw%RANN7Ngu#(e}lfR^{3}VZ*$L|HQeZSK!dDX0>2kT`3g`>YP$uWUq z*}$r*VWB-+ld^)JrvkrRU_*R@DmY|}deEggKSf2`4PqA9W~MC(Xi1x>wwT~*mnkTS$cSWGCAb@;8)}RlgISt8;4Luw{bDN0b9YJjy%&c z+tzXWBrPQ_E>}-_{*X7oL0!w_%R^1mAe6aKFm?#cMJSp<<(5#T9plTN^sY}{>}9SI z<0ictjel$ntEu8l%Z>n6^Y{h}pc`eB;v0zitzy%2R^KtUR&duxssB{XwaXCOhLpK1 zof2x>0sjOiuR@{eDaY^4?}SMWc6k!z+Pbny$yV)f(*xOkWpG`4kou%GwPtp*roH_t zD5RSBN>?Lj*GCy95%&VAT6uA6t5 z%%x~MPo7QBqOE)qa=R(j+3*VEbI8n{pu|P3WmIBkg_bYm%y?~N|3kRci+(w!z-6H$ zn*H8__3#L@xpCV=s;r&ni7m{hngUJg<{|XEWxX3HA)aj)!6V%vopD&m?HXo_cjw&a zKf0H>Di?IMxsEJ!XD!dY~g~w7waLb*`J@Bf=r$|%Sxw{ zzZ6hsAo5(w1TQU}5+?kgV(IrLZLxAm`5)c0`c!SuuS}nt%oWKb>E2vg?m5!5oHcmu zVX(Ml`g5t%D*GD-O#f`XjgF{InO9>T1>0%}g+%|p&>=&Vte z#B+6_A!#o;AWz93y~(~wd0v$*nBAdfYnwp}^XKsilXim^rXA`|fA#dZl=acoC($J7 z_qLF-oa;{$`g*hD=xo(7l5BGV%miU+5lJtXMhg6P9!unf$SH^fLG@xohv0c686v!t zBu9kjQG|d69XZf7=^r#OcY)`5$-N($(9T?U`Ml6pYQac@IcqK6!nw`EnF_?a(vaGzRvf)pQ zEEj(4N~Mp`@A1*oiyzx0b-D)w}I`_CyToJA%`@8wZWUD+EV&U4_?1M?Cg6;5N z>a!1h3rf5yefe$ZAfFfeg633}#+pG?IYsj-%FptLUSB@%7hSi8C1h+-B1J%oafX}3eTTv-v1U*KQNR_*9#W%`(YW~`;_HOh0Frf&8)N_)H48@ho@U(^A?`=Z^HZkI& z%=1x|G}x2K&)xt2w0pRuF8N6zH9~p+vMOF%N{%Q-O6>wKMC1S>GcV9i1{hc59wY93 zr*y_XVX6y{lg?!>(&LYazO(kmfoydJT~JGVSGe9`Jo5jr{`+oPS5>=xX?oxBJF`NV z9A?*6RuPW11ble@ur6@DTeL3=NB$1S-k*k)h9hej-|%sC7gMbCUS2l%FvaJPh~=Vp)U_& zzaxm_*gnu7huriNFh6M76Smiqv`_daOKnepeZhWWuoRsMg_nr|I$F=(5J0)4?)Ptl zKS2la?{4UjFWuK6NS*12or}gfcy|PL_5D}!M1LeHZGa@y=jkRRlbSK$b@qxUMd$T1 zPq!{Pp8%Fx$e0J=liHUY_#tXpRL#$!?XqOgPl00h3}k9iOZGwv8N2-*zpN2gl?=ui zeN{yn(CxbJBTo?ng~~^BAP@@=LE^nUUcYbVc89pAv?b!gs>d3fd`%^Q3}7$|yzp z6*9bZ0ab@@?Qq<}Bf#C(clRaLF4xccXhVI<%P4dqEmsIi}H`?Tf~^Y)B`H6smhUUltzD%Jm#&!>Ffr$UEt&u1gn z8JoKr*-u9`LMLZF30ywBieGr}eg%4KI@{fxUR!({|GTEyNXkl+wrtQ3C@QJLoqZji zgjQ4PvpZr<%VMrT!lgcmJh@}X93Hxr;lP5Za+C=NEb*NDUPg+#`z+oNC z;WY9>#ooy)Fa6twBLgJ1%q}0!WL%hBO&vuhl&yX4L>(F;>)<%*>0YleTb9W`m!jM4@oS#@gR33t?tG6r_NT4aK4 z0Nx<0nkeBj;DJl8z&B(Z{4QK7WK8~219T5)66BFZ2w$wStdBTpXE7+B3r`I0 z2hLXL&9m2}Ns=j4lt}@erHRh>25FLfHs_+DdFh7daNqm7 zWq?v)>z-7OXQoHFe0-n`%Jtb7_6&x8`NF@p9fawII>c1I8YcC1e2)D03p76MU6~@b zvf+ud_0gy4Db0YH#WjVD)&7o3Tg2?0n99|3sMbA%(q+;${~xZK70;s)HW`bk2+h{DEY(i+r40) zT|B8=pA{iCQCo_{05u^^(&YL&9wWliS>UeoM_EanGXk$$y1 z0UKNdy9Pr26NuZp`Px3BqxQ?y*x<Q@b)dfntna(`aG`IvEc*bBllP>vxPAIpiabChh?U2F?E#VOt0T8p`IbbsB2ek% zd+gvb1k`bzmJU3e)@kNqz}%IEQF{5`Hnfb&%!uT?@I@B?aq%4h5uDbyUXDpZGQLt? zK2AjU4N)%PSn+RiA3?m9L>gGNj}xJ*j}i$7c;SFh&z!V3k`Fn(E}Nih5oKL@+Z(0uE#9F7-+ZMAR+%#T!&c`i zZPNSkMy-N8u%xYADg0kYtjc4>&gm1H^z*FZ8;-3U4YMfI_PdW0NZs<`X9M%hZSrn8 zffOVre?7a6XV|rBm=A=8zdQprPyZ29(tOfC?S+4*1~gX7YG1sVcx^`U`?a>foT|YIFM+N`(EY+$$2_Hku$g*7ldt|m1 zg@0SyEh>dPb(@p@F@2X_n}7ABu0v!&@NtyI?T7HP#1NCOjqNL!T+VP#+DZNGi+sQ{ zX4F!uKWx66EMY5kq0PvS5qwTB?OlF(!?O2Mz5Vegaxx>+kK^_2n7igtyLP@mL9Z$? zYjE0`djnyy)lgRYJFX01Nvu|WTUsl|UDFBr6*qEZBtGDP^N4I^9#*AV- zt6IzS)qbp8GPeposZdDV$96lSv0tc`0N0)$4>K9dcYizwOE8OiXZ(}+$u?KW*T(MO z8mUidC>LwWU~uDT8)Zh1TVOs&tJ&yy8v_ibJ~KP+yt9^`6NZ8p6Z1*>^5ImwXEgJu z{;UbmtBuH!{lQ?Y29{JnzCMPRF`iB|A7~v2l;6XH)}?w*>a45sr3)^V$~H znuEpzuwaYFgHgfOZeEwO)vbf)@-lOR*B#_l{-nYvYiC*p-3eaB9iM$Iy|4%Fx%K_`>V)mpLkbyu)^3z^s7T>Z=!fmqi~WGdwKM7aO;j`F(pd}|NEu((IkB%3vP-^8LL3Eo1w2FRtJ+xj`uayr! zR)u(|$*ru``2SG{svhGgdx(1OP0;)pA>DYMlJBjLo-1Tb&4SsUu2{JNtQW&CL+2u( zcBVP1(F*BdZ|C~eMht$}D9@mOxq3+&NAYk$Sap#Eei-6J4yo~&#F@l%*h1Og2%`>}}OPwR~dnl_w zNb0x7;&dp!h)9{VLH_p>U3LkLFYYiT^X1`5wu+$2OK4Ex`#3bHI0s>^a z_Xt`9f1LP)4bs{%IS%zkFtb<}k@oV)IMPUYxjWr59g8k;j*~(ccgTo93py4X^={#> zEa5WcBQ6jyZtz9ic%Q%@`V|Fe?Y@0qqW{X~!t|M@#r4+Eox(ABz~qf=-2-gk#I;wY zV<82b+3tHN06x-+Er?Hakl#MLeTmuX`ya=Fe$i(EB)>VIed3w&{`i>*Q2EGx*N?33 zt>FlZU4pfnv_WLXBW&6J{#_$1L!DbWxC092*)LiAbuXB2jB|Tz)-8vOW!qK@VKfya zahMFxWjc*xMWKf|Uf-dREw~RxKC&OTws7w&Fo$h<{MkUT`i$KJ`!%{Sh0gA%5wYtK zx(vU|9o}>jp6p2`X!zr_Ke1AQgF&)jNcTB+89cPaeIqmF4J_lb{g2vPj=(umlOWqG z2ZO}x^*5eOxs8$WfOc0Ig3)MI7V}e#u-l0%j|koAZIN-mE-T;ynVMFr751t$Bl9aA zYpkCP;h`P&XYcPbQoeV9NO3zrd$H!LSqdEY^iF}u{_Jp&V#Q^tUg$A$d~?Nr&<;57 z$pPYM^E;Sw8v}WK_ik96aBx*EOokxkYu8IN%2mi#Qq0ask3iNL0&(@_iyk$$h16$r zEr*}p-!Ad}?yNO!+c9oO{}NhAotnh}x{8S+D_TUWFSo`| z!iPhXzUcxIKuPYm9^X5bNiVhL#`qTRuQ;oc6iUOacGg#WTr!UbY{6qg7b|_ZHMUBe zxNBU}3A0LAxJ}2n3;m0SMDuhB0Cl-JVP?1Vxhw;2e}3AOK7@OW#Rvl@bum#0;k{q> z^f9da2K@7!BCI%dXNkk3ZloZnjwa33b34+5A=*aO#`{ZHJ|8XNLdx(DO`xq76Hta&*rBZOK2G z&TEcbvP{XJ>bL3DPTU99nl*s6roe%p*BRxXtT2l(yQuc}zFGO0wdID!~g^rjXdeaQiDRD=L2{x?i-c~C0Wc=F=0UJvU;n9fk8&plXGlx&2L=!qp5aI4DQVu=U(hY9>kdzzR%8O&q&W6LWc%TSf1 zNPO;~`rh3l3$Ri83$1dsrIn#JW>Ficzbn&pgs5NZpECO@*LH-kWBpYWDtJA$c*&W$ z_*WXQ4u+w!fp@P(;5}Q%UQSOzOB<)J8#`|$rzc0M>PP2xYEKrCmQ={Wyykd(31ylu zC~Jcr9V0?KN}7ld7FAx4629W$Ea z&Cb=xJ$lT!nErM;*0B#F!x335{fpbktRd#lnfI*C z>T@xst`Xqa`@;#zOA*mSTXE-x57k9FkMe{#TP#1aT6XyW(qxnpbc_9oIneOaJ56FcW&l@z7Q-8*`P&dU7~684PD|J z0FN%QUx&Z-W}3-*R@I`7F0o99|0Q@hfqrEkKOV6c>j3Y`*0VXFnUv z=feUG`^i7G!CbV$>_InIEe1-XRa2;1RNw8mX7GHXtOpU*| zZpq6*WB~cmBpc?kh|ZWk!}BDi2VIwlNbl6{;qY0}s=%ShyI`m^3Yj0g{+h4|&>)3+5aj)2f42stHDtqO&M_pn-~5>JPeJ67`5-e_1&B6UDgzgwlOcd#xTmj3Ucvg1SfqEWi>ek4l-FQl zY(O@#r|nv%WI8UyNU)`0iHEeeN>p_o4y}8?+7eyK>1D1iIZG})$ftve_|q+K+aANu zY-bIg5B-;7>>oAsm}r~Ji;9;<^u^-F`#qWzX^f9b}_NYcHZ97HJJw^l| zDwkB9w?Co|VD<(*xoLDMvF;z=(7RGYKQD${&yi);-(t&t__S_-GlB7EM(FBX&v?3| zYO%eZ1}4tR?8&bBoPHKYN`CmLQ~rhWd)hAmdhiwItok8}MkV`()AY zG2v^NJ(_S$uL_9k_Yhr7emc6o?Z;5R#el!wX%z7|fk+g-AJ*fsCsy!QcX5`!l>i%m z*uv*67fr}!ZOBi-NNqlyGgqso%)$8}h$?&f`b&1Y?e~*6QK`59hQwSjrSb&VmX$wf zNi_ixOKWRmO3cX&SH=>@bgyMnME@hhW-@UB4(!{K{VxMxiF1!7JEIyYu!xM%HGEma z9R2(PjHcU`4=&PyZq^uu^9H(5Td!}{m@aw@T$17eZ*Qq2MwF9O6ZduWap3M7?AX)v zWj@$)Tnp%YC}hT(c4>QsUC&1WZbn2PS8ofb&*R)8Hfc06xp)H=K6eQvWw^(Dl=wtn zGx2`n>HP@syj+*w$&kbggV*D)p*wI|TY5Dl^^<|jWq=i07gZD~@&#tE;c84hmm%td zo70>(K?M6ygepq4gj49X`W-B@3 ze6ue+RI=04NqNAdxk}czd2}ShEA<+*lO2Oet6@%oWAYKN_b{Npy0769%O~y*u5Pc) zp4;{V59KD1lM9;JBKlVtF%CIAG8aZtecM3O``AvF z^^Hhe{?y1fHD@}tr*A1vK;ynpZiz##PaO-)tR~=Y>11;6+>NW-dMTL$NyDk!ro?g& zNL^fK1Fj23;0VU&-y=rG;*cv-dt5iBaX@IpdqEE1PsWFD5EB3fFmB=B1nHYhUB=t& zr`Cnd-?5d2EP0cQ0nVFdiv66k6k>-A*Km~NbW5SZV!d}qv!iLWpP3i97_;xA( z-4>Y&C~b&w;>PMYZw29e4aMA&QFe>rpF(w(2}c&bUvMhWBT(x|x-fpH)_)sF@B+P4 zG#4uK!(~z{SIwnqVtPIq{)iRzewP{jOX`>-R&HhQ!iQZWNk?QJ?n_bDcoo1!GnVh6 zw{#%AWi|7KPQxqdQDuf~wBR)a@xuZM#-B?44&s$KMdPC~3onyI=wDTd?dZSuC{^kz zIOeA+Ra~_jVZQiB>y|QNRem81#{bE4-!*MZ_Zx@6$2NV2%(kZo)E6T$q~r<(%E|=& zqt^^{@WiLi;I#m?*?kbpzmqNW;KQPiQG!CW^*x{3hJ1x(I-oXy@9_@a~ zpKchbUVw2h*v(zv8MRkc8L+TId%A_oyw~ryhE4_$$i7sqf@Jb)gE2hM*hyx;>@@o- zFXw#QS48VA)KPEC{t;9|v7Ve*R+0Hsa81;_9KEjC&kZ~@ab|b@;%@$*zg4p+hQ(Et z0Y583#R-1M)%O@D_==Apdp3sUBDdfAE*6Q4BYh0VD9w|+Z^ifoys1|?HyvtoM#Px?4O~YAt&CFm|BHz<(qMd({9C-|RVPkHM zcK7Z^yNM3%s*MzZqdvMj!#rr-Lh^4mz$ah<6&p_H;S*z=&GUyxz)5LaZihPyQQ+y0 zpbO3`y|JR7QXM zhi%4v6F%?tGw~$Rm1mpHF|9EXCqD%DcC?YsR=#Vw)u)HI-Z0QxQWmdF-1|^46M2;A zqUqckDkUHG{SJv?`}HurjnF~2$q2(lc~gZjVf>1u2rIwwj#lmmIjE?=EiV$%4OGpF zpfA-P5h^qVB69T!z*nYP&l$R%4ihLs~sFpSNF|nLt-CMd*JEAYTq| znx8A&JZ3fcs{6g(w(;Rk&sLD28r|56`pI}wL~LW0Kk=gPv$`l+VIK(>&RD8GI`{oN zb1Cp>5lm5jVe9DJmhyUooM_g@mh^y-A*5HsQcXo7x}TYhdU9URQn2Mu$u0ZqGu9Ji zhnx1`?*Y5>oU^6+5jh`LI*Y}DKui>D(Q>8J>#Qgb9qre|IQ8uYLCd8c z6X2j$=Lr;kGm5iSH$`tB9u@T$Wf@Mnd3g0%)bD}#WB%ti+>I5MTeH$w?gEjZts$Bf z@K9G7Ff|ba(S~Tp50A9x^$-+Jl&=a)6J$Q(m%?G`QGbD6F7#HV79w#E`$~&Xo;@4@c3(t!ujSNxJ`%~qqM{iB2-72 zr{^BKi58@WNwf`g)XZIZgsh0Vzpv*wwENTwrwa~gAF;-@^7F%adMSPaF66DcrS_vS z?YTp{`iJ|Ufj+E8O18NAH+f>vES96%zjL5rjB!Ex+Z`MacwzHp%wwU*o;$uD1;n$A z*o)fxucHE!I0gk9iQy}VWG`oZTQI>0j2sOhu@l8gUAB1-cj_y5k1X9noZm=Y3nP5o z#GPg9d#y+@(xPa&y(G(cFP%z#54Rl4R5r6*)P9>D{AW^!;OCZu7u%R%zKHU?kvB?# zYTUsSoV)tBs4|Bami3zz_{S<4H6NyIp{fV6BzL*&pm#vkZCY1u8`PI!fWIr4h!Ip& zoQJ9Ahk@0|^O@5Go6Bk_0E zzmUa6W$BE=2QmIlPbUP7#UL6s@V`bek3p=7fb}m@$qnqTjy8xU(1+y;X3F%I*rV1P zc>eK|OnG@4=_rwvJwJ6HBDci;20(+JU5VIKFsScD_yY1hY(MX42F0hdz8Yb$vRCn8 z>K;}m5UXw@zDhe9)4K-|Eq%9Zba-Sx>g`uZ%Fei`Hg2;$Ja(aW!9ybgbJf?a=}ABO z1b^znSz;d~RgLY=Kjn%9#)FJ4t;3xU#5jWY)mVfRp(oj~u_TVhsLmerXc1jbet{5k zjfaCfkl()1oU`{tx_Vos1?1hdY4ZO%OYqFc)<{JMqTRn%tbTcMn>^2*KIbE1^Q_9c zLt|Xl^W5F*&twu46y2^J%Vf4CTzTDc{F{LMqbOt{$UpbJRLJJt7Y`rx|13~SBDSoB z)%74@K^VeOVy??8{sQ+O7m8bsk_Jo`>AD;X8Jd!ukNzgYvqS=#cp;;h#llxnuCwBc~n+IQ4 z?7cg_?}Uz*4j{{3Jf>vw0W4flq3Y71-6H@40!mXsd7t6B^Mp9=Q5~{y+tl3-mFDq~ zj5@AA4=4QX($o$5Cjb7Oe&dzrfWp-AWp!Wlw9%`%r{LCd#l)IN2Rvgwa@norTJrcq zuD{+%2ybDPb5kLL-a^rhlVs_iMVck64=i(^!lpvr6q~p5Wf9LCIh0YWN6}X_q_Q40fqI%~;a-sr-m6R?wbAe7Y7E(}UE#iCfoO zZ-40(F<1Tkz8c#CMI|&p_ujZQJo9~|I84c{r8P+-jI#50mM?3=ufURg_c~+4g0X|* z<|l<&rD)#V%U%lu{p?mZaq)sph5K8IldXZaLP9OYIZ&>VnaqM_G;k6ev?GLe$y@UG z-vyq3Rb~$xOF=$A-_g6XQ(eGuEl8A7oZ@Fu&;PVAR$x;2Q>bf)`i}JUyyS*RlO?S> z!g~~O6vbX$`|B?MwEVen)Ac!?5{*xKD8QVxZgX0@uMq<6+M_`_ zqryMjqg#kqa+?dj#Udp$F8IZjkqWRk`zYU>y1 zfR$^)Zg8z`q(%scY|HzO8J$s??c`IIlDaVry?2M474d+JB`%VpA6}4DmGFpZD9!l< z_KghT>O4otFRn;ba?8ObX(UqKw&FxoW*3Ze?$vji=FO z!;tSI)Z#Y{kXLoA5>!Lj@h+VGc|wV7&7pZi?{a=W$c1~W)usn@K0^?-x%jJmH_Pxg;p0QhzP5!y^_Yq z>xHy;jbvp0tFrbzx-wJvOF5v#b0vOQ72|IFky(pH+XeW(&y24l#nn}v-)Xbz$rNDr+g^;mTFk^lfrAmo81c)fD zXWc(?k7p6z-Lh|Qe!he;8QQbEd8w=Y6-)o}qX<5E;7kU`xs4A?65RZ$TjZUg?aD(% zFgX*7Ut;AmORkaj+~rc*zh5?JNfBhq+i@B|CuUE0B*X-n?bU|3{&u|ISSsRr56;PO z8e+VS>>2qbAfjT{jqDovmH4m9fRS-dA}nMK2XM8A^ne_=WhIr{jK-Tn46>Yt*mi_u zrZyno6maT_*U_haIU3$fFR(9C;ioNHre%fimfiV%%34@q4+UmL64ARhZ;INAH00{U z7;i^ReiFj``FRPd)K5AtdeoQx;{EDvE8MtVNMxrqPK!^J8k$17 zBH%*Uu3MVs=5Kv7w3`n!kMGU#FmOm@)N(1g1`9C?84EL<8h=wqxU>_2eLrOjx$Gu7 zCJxzIE|n4n$X+TXqC!rLmTbz|QR-qvv;5AlwV{V|C?bHjiNE4?EW<`*?&kehdhEEit`x|bG`mR>R zZRnIQub@`XxHvrD^r?kf^pNUJ@{P`nsUjZSm8dcjR$V)m;^lN#VqsjV^x6FK#h4q{ zbh5wI337CLOOmV`^)1BMWmOl+L|9bb^obG%RUAZb;T`qrf zd>0(zQoNi2i=@)#4ee>p(1Lcy9o&gydRmI5Plw;V5&dts<6ZoU?yNZw48@zrXNmlI z@9+N~8GM zyr71JQFzdc;teO*iZXl!rR<)gChq~iJEkZ1FQD)1ude;{IyB#Sd*IC2mbOz@h`M2> zWvw*J0v}%fdaEgQvk4$?_)oidVBgWV?Aer^f_u)DUTaWkOYz;VkkFJO2b)mKve$oe zq|K*Cex<(2sx+T^CTN1JDXwU}4*?`8J##$W>1VK=w;{IBNLhZR{zmlaH6RFbckp`Mu%_%T3aL_9ZaG}CkRaKzu~@P& zXvp7ssW(_ez$I+AZpjaLVW_z37hTy3Uv9bjQ;+sMbHh+Q4jaIR9x@b=-sTAu_(x2mI*;d!78H-XbJqor3;=GB*4N&W zW(>{+AUCq|b0vu^@1E2Av8<68fA8O}-ul^BA6ronXb6rxcd=VZP(RQ5pb$zxAxsU; z4$lWEvD+@jn6^kdcGci7Eh&qPU1diahQ314g_i; ze0fm^QfOg1x?1$X3{TT?doVE1)1A+&)COb>Lr<*O8k&Xi%9F-Ub?>n>l8M6?i{SO2 zMKB8?@+O>|j|`WR@#EQn8?P1JMb`=ABC6*Y_9&re2B-U9Xb*w>FEY6Q%=IA1r#zP4 z6|l8xvG>9M__ii=dF?UFJ2(BaH!5BzzlNKhMoU1@j}CXWSG>lnXcDAX;5;Tw3rjd* zN$e7t`Zk$%Ms=W-*K*FOE1)lx1~lgOBFnIx9Qi^{>O45Asegi;`l7r4*a<0VFqeKr zQdgw$^1r=R0?ADRd{Z)s`euLh{{UJ#J=T8p#h9O(k!`Q%hh%jg>fi0E(RU4@vv|Lf z1ztBqq>RFwi{~t1dn|7OEX2A?11;;Vudv;tfmU#D!3#1V(5`^n9FaGo7R<$X!-Btj zA1y1-M;;1}aos45v8WAz3e=q^@T0|> zKGe4OO`6sVN$+uX!}7+f{SzN3VTM1LPFCaONdiZ@u7g58wvOB!-8Hgw89y`2N=8bD zvPxdVsxE}G(4S2k_)wf%D-89z)HIgJZ~`PXh~39VUF$0pLve2Q(Q}LQutH}!|Mk&h zFB<{JrXxj`IviS%!av!6$V!G08G)SBunQZ6gHUYN1o9M(a8bX%$tSz#@N3=CE)w;E zQP4F34k$TpVXbdI}P$^(62_0S9JxINgNOVj9!oqSi z(qMQ)95xl{@zZazC^svM*!|HQm!x@P#ykr2aV9q<$e$=rBYt!ynN`Pm`&n$ye6zv7 zni=j2X;g8+jw+cjJj};Hp?PtL5)bonQ0TdN%9gAS)NG1tzR?}~<`J&KSYo7Tg*@q3 zipdo+=g*aeJAZorTsqPSd|bWKsfrJ*>XH17Vt zz1EZ=TUuS=efN9shQ>6i%a492`}?8nNsDL01VQf9q)%KO?sc8-u#_BZk^R7Wwye3| zhV~fcelRcuVW)wrV&g~Kr>$wKsK7gC@B(Loi6uo$6w=3f_tNaIt}oNC0|TxlOTE^8 z2Yh>G3H4uJGjQIK%%F-bwrl;M6^4-kJVKqGDBYY=fj<^SD=(XBe$f3J@5{Cu}Hhcj#5p&cinT_68UI9rUD~f&I3a zQa534EO`?gik{&o+Rgbt(caGDx*}+@zL=`G`2^6A^#%(Z(TW8S8TExfkDE{N7tpAl z;mO*VOy$Yh$lE_3ycx;5uNN-m_vn1nzQ0F3>QJhn05z|!sMJjqL_-nx$XIGx-4b+{gulJmQ zS5dXV6hlV3+D;AP&%FV5^_w{~2if7{lyB@o!3 z70??`$`zGmwb$g4PF-_#yQp-1nqnAv9rr!@q%q|twe{X2^1_D&L;aAp2_SQ0=8>LW zQ}ef}5%BCd81xFT)7c8x2m}dv$7r^h4RP;aQik}vUB4p8|I(rNTf%gp?kDG#_OA$a zF1ZX=X{xT-e*9q|5J-qrzB<;L2la5DDEprEs%bo{Qjg*|QV$|re-ynrUQ2M|epe*| z`>mg*m9xT9@COKYXYPr6j#l;8TtZh@63a~u&!V@6(+=P$JwlZrR9|B?de7TrKYEn@C60dHVoE?tRn<9z za@V?@w&ww~-PPj6Tv6rFWjQlN(n1k)j>0=4VT#rmqoMlEfm0I;{$gm(7JCf&iwVoETyh>@-@RYEP5YSrcbf-RNX zL%R+aNd$K!aw>$NhmjfX3wtqQzU#6O1xz5AK?ZuC5K;#1rlc*{t}9UwwtI355{~H% zN)FE;ROAZcw{=@HUz0cHOu@iu!-V-q)uj1Hf#ZbG@A*f@zmu%LQ%e5OFK~lDB`IZ7%hz&uX=^w z1c5n!?nJ~OVTi4Wl5kA>!Ns1wu*c8&MseyoxP-n_gyO)++}?kCX7pa^?Dn$v!;MtmiV?FTk8`%6`~3KegwB^$KMdjK{t4^2Y8D-J1HWN4o^b z(j2K=V>xq*kWgnKrhTd_0&;mYSMm8W>qROl6Pk=Mu^=%gqcS!HkPKuPt zKKj;dp9A~=C4^bW1OdXJh4a`QgH4J+3WfFqd7viy5VJIh;|2u4LK0wmx@Y~M_zNwW zHSnM~hJQGh`U)Z#fJ|09p|MAfRt{%_;;_Hc`qdq}?^}y1kDSwA8lK<#QLHkvm2G(+ zw9utTf5KY`GX^f*4na#WI3&+ zId$&9psF&}SAlf-c{%h=iEpgMHS!_m4N+QZEt1p8zWO~lxo&}>AJO*pOiaIqR$dS; zW`TnG7BKls9Kb4`9HF%Z?3NX)I2Y+W?317*5a7o|u((4CV^W&EDJ` z+={fk-{N%4^`&2{ObJsP-I9p@7C?d<>#K#7$@6FKq!+6YDvUASQYhd5OQ`cW0Hto7 z<xKD1dS~$0PLkF4oLC_nS&fSd0EE zm`}l4OphGFI@em%?poKtc+R&r^9xwH)AUzOn#_FZ#d`BTeTShF+YvRdA#pun@rfA* zCka}ObwS6ZuEowVPQ`Wh(>(+fpSGBmDHN8vOg2=WQ?lsd@Im(yz{<2`bV{J@!GriCi9iyCIU*{iq{`b!JrMW!8Xa9Nm0iPWT*1Nji zPNc3wWxtv#sLAU~-OH;=&#(ylvqi5g^KsF7@920fxVp8a?UzS|)osZ7OmlkrchB?7 zT=hIZ`7d@4;1)n&*mOgEdSQE6eq=}T@L8r5?@ExnF7>YkyRTRLmZP}gl(?atL!qg{ z_0kj05T8I+-PqXRp)%jlidgW(bha+3Zft36uy;CKE#hIE#oSTwgNW<@!_`?v#St~@ zdItC4?h@SH2Mre7-QC?8+}&LV8{8cdB)A244IW%VNOJkkId`pd?~mH6SNGoCKU#Km z?f0o7_tay*)H5<-^U@B0a;5wcjXo1%KG=m%b#(6TY+CvPdh%%;Eaud=v@lch#6JnJ zGCsDqIV*rLa1>}qz0T0_?DJ8HeAI_muE*K65lHS@lU zFmqwg>s{7+X)ADRL)3HYO}`LeyZhr~9;y!K3C-kPsSfLMiyCcA)Ku1=uIJ3$@qBeB zDYXtC%b2R`*sjVTqbMM-3yO|s{i z!d6{!QVbi#Tn~hi^(<;%2SnW|Ia&vJw0pfWDeF}kl_@Ns;E$}{xbwV=pElcb<_PZ3 zLGiR3Ho;y*{*cbD*^N$J?~Dly*)1OE8w_v#Rr< zt8%MfC#i|Po5#>;RPYYZ>g*zlWqpU7&HePZ?8~!7#yXXLvN%JF^eO7A1(`AF-H3>O zO@Bxhrb@>oVK$*75)Lmr5h8d&#K#Z*C^%NWc~oW)=1%g2JzAIq--dB?{mW>xZq_J7s0lTt_s?j0 zKUDz1@{-R!FUd;2(MAK z2&3qQ%Ha2n?VouxfdMej|{<6=FKYL=63EY zYkOOA$Fa#emCYZ&B{)$p3OY^gkRcOYn|f-MjQCA^!#^U$<~EX3GD-MtHd!(4_|{gw zXu?uk6N-MB*c3a2CxnBK)Y4attMeq#_Ad*8G(W^tBQT(9v^bgySBE-L;Nj?ckdUl> zY6$yiaGG2a>a+tIR7SQpZC^xr@8Jon$Ji3u+Z0NlR2Hh6_)eE)O&fe^K@;@TuHQ&W zr=P;&@RLmVcZAGokt1T2e>vIYWS%uJ$Oy;zw-R&2(HRB3!_M|lu8Z{tK7t~?bJFqh zpLmJXeh-2GF$6f-hPmIih-Uu~K3&~XNV(@#N8x?hI}7`UpiBf9!@%Db9UL~^c{$=t zW;qSqGOjN{NB0XlAg@I(9 zQSUt^VguR`lixJbU+1_Y_w_M7TfacS?kB57N%P*TRQYx*AO=5oxj$Ap$O3%vL=_`h zVXRZ14*_Q03L43u@ecw)&bsH@^FdO1R_;xmP$~prmycvOSN8K@7oBhfk$7bOJz#8Z zae>T@wWfEEU+9#OoS$jK-W?#!hgWPkVxJ6rmwb%2M=|np|H1t0{fE6dDG(*aaHr_| z&-3Qf5ONc~0B}W81x(Tz#KE%?A;0YHvIe*MA7r@0TP9qXpvWekk}E(z(KlV|W* zx7IVu&EMxP%InCM>xzc^Wsi|Q{Dkdij_f1laey&lEn2I~cOfB_HVTI(k6*r!a@1&% zy0Oy|7G*hwLY&6xAT5QBDX}2zZ4B0tmB-lwyM3>lbIGe1^h*=Xugtl2DY6U-r`3dC zF2^XE(ZW(`uMvU)Av&7t|72O0Xy8^yA=D~GTLPSjFts$buiNr#mtg$8Mq8C7IYD)} zREXgBr;FkYez&k~e>m97QYPx$uPZzm>sOX7eryIact^q+YvZ;)ixJ#A+ti_HiBY`x z_7*kX6j6F%MnPB&S`+N=C*+HUzw37h3sK`{xh)%sw!Cps-(24ilTh_}YDN(1i^X84eyUi$_<^UzMmxh*=HRAb&Dk3LFwI;L%ltao(w#1Z!*t-;qm(w#4qVx+P zRf*a~eS}a9TusU0^b)0;-m})5!^pkPImr|PGlNA>{5WryHq0NRIlpFV(CE`je{I`G z9s7K@nV5`kVzuKfjO1l&mYfe-fIvb2^C4}CsvmQFaW*fmJyM5i2k+w1AR|kh zD!>3Nm zTc}jZ-v@EYOo%=(;-R>k(^X`Ch~eSX$78O^#fn4eAw(;KaYhKQ_8ov@MN1?+!8*`F za}{bOJ_aB~Zj>&Ue5Vv)s+NMP&4sJl+5~?SzQ7#}2DCz6&Qu|Psg@e`v#vB&FweCZ z6TY_texk|JgosDp-7=b|E|_Q(Qjb*IqM2o?N&CBG#;gnjl-=CfTd;?FJAtW&TVTtL z;-UNo>9(hM{#{$ij7U6q=pykCzHG{BoKH}^o3!cjx7{>9O=4!jLlZ4P!Z;42N$jVN ze_k&-7DW!Hs}>+GAEuWKp)q0nKG%kW)1-qS!#4KCdW_JF4WnOWLg_s9Zf}TSUokk4 zp*Rd>13U06=1c`7Y5s}}m?aA-+wA2;a%Y35wHk#?VSS@T(m;t<&~sElW2f!lA9GqQ zVpCsw_b?K*^Abnbiw-W$;z?GFM((A3h|DsFdlH)#2^(m@eMd-yomC`^*Zu_Zr(?9C zKI9i)ZKc=3P=uL?Zb|L>B6MeY0B+S@-;U#(9fl2YPZ38etViK zL%vgKa+<@n(+Ir)nhQL^r~M!HmgukRV5L2Dfz-lRfQefgi4!tPA@K?v_LdT>F&`#+ zi0kuxbSM{Rs^VKev*Zze$aNfM_n7z(Z?mDBAWkM9N>IGlU@h5dB=o6;%u|s+8Rgt6 zU@f5MPYRvEck<%qGZ$NFqxyT3*LYj&grO0+p}rIvnrSD~U^%C&#!2>=%^rsk=ilvm zzvF48&l)6vvR#`p!6=U7Ul<4R_$>L3x#OrBcq<5vam!gWLNqtRChBs z(e#BAErkU=zAf-E!ar6=--YgRDoAXLW)1Ftd*%!OsXnwxA!a2)1Oj?{Y4gjWM6mtS$NU_q}jC3Ip)*WVXm_}ykmGJlQ7CcRsL3K zy9SVU-dYpAp?YPY+r+wbNB)x4ll)({_)c?Zuc;sPsC0H zEv8i;Q9+<}8l*RLa{LAnsp#MBWjMsex_~0Wdx)36{INI9)h6YvNdWQtU-K9qM1Z|g4CH-2rRx)FbiPxluR)(>{8fvkY@lp9i zdcHNMm4u4^!lkzj-%1>x0JQQ&%9sR6wIf*i#`F^j-<_tNUnQqQXRS8W*kK*7*Lj(^ z{oQM>qxa`0fESk|epD)#&Nk5?zGW$gD@xnp?=*IvI|$viuGe$w$n)a!z3>`~@7b>A z%hQIo3uxF~GDHe+kR@V^lrqm8O|qQ)-6(4BZ&kEm^VZ2;^?wf}v|{zYFDc*rMTq?5 zS-qFL<4&aCRQSlc7IQ2Xa!MUSm|ed3IsWHC#zywz2vc6-t=?KP+)}F~qF~~;9h#?) z89M~@Mt>BpzcCpJJmtOFyE~3MuchNHbh5>_(&)FH5|}R~>?+RMdh0e_WQ>d{T2GTt z0B8T=YHR1I1x-m>U*fJf7WEi;rTv zHB6^XyJCzG9=NUS>mDEe^jKMi6b5U^C3t**NW1eWwyET)%9olY4b!gQOUtbd-R;8jEf07mxCMw6*nYPi zz^lM6fW~VGD0?0;jGr)#75$JrO@v5TFQvS~Ayh>Q>bvP6PLw9~XdAa?{rOQ$R?D9q zE8(x2z&U^@C>E4-<1Al(rQV>=X{j-;)tXgi*v=Fya1YSKtH388j)72PV^+ijTmmIi z^s$mH0S6wqi>%{fIr)ASTM zSX3$zTiJ?R^yDWzy4}jnR@PoUsJ32yKHkdrE=lap;_QXaV&7g1g5|qf5y;L@L{X_;k@BoR5-w^? z+hRVK{gQqrK0_dxaJ`$O;S;(-p*Ch5&BNDE1Y%o zfS_8{B}-!}6Zh#?qugz^rA`HH%ew?PPLcX8EbI^G+nF;J=LsVVZ4~_~EA3c^8u$P^ zshJ2JGlYl!U3N=HcR-GiuqcBzKlgdsK$J^|6BOXnJRG*rl_2<`&65OH-GdA^&5Z&U z+y7$Wdm@@ZbwXFf)+G2PaD7l{QzedAd&OVfDskiroiOu)ghS}LQ{&ava1V^Tz1R0@ zX|xZvjJgPpSM)N}VPj-#27a3whE@Byl^4SillHsCQtbYt`ke%165==#_?>z*QJODH z_9Ka6-o)5n_#N{TI0x(`R&DEIa_i4!N`d8t7t>c3bl-y1bWlY|esp%RPZd#{*~eTU z-{2zejCTbCL5Mc>qsrNz_pOYdFeZ?GMYH~^{&+jfai_%#`pWD8wlqpv_TT#8^jpGB zqJ=3;d!3TWG!wln&BO|pR8vDI4eAU&T49oHe;u1r4u(%6U>=h$7|t}N?ZHNrYlsH) zwU?Wu!qT?Z!pS*WVQ>fqC%Hyqq>zdqD;SxFh0L=J34ON~K1*c8K3`gQMyTJB&>T7^ zlTNgL#K0VM`K}KOXWODSruQYz_tC5c*R59D9|HT;tF4p!TY{^vhQ97q<|@YJ9)8Gr zi_K=eH&nf58LACct65>yHCk7*@36kIZ->F~#-DTHKWMOef$|zO^6LBUVu?!Tr0~FS zXXpI#0P){{vX9FXMS&$Lu|?7ToKgv{27Csp2|1vE$67)4c}HsIDD5uL_7Vby7!=>o zuw9+1}`B`731wycOdG2!4IfJ*xsZ+h55O;*pAMTD3|m>!h=)uke?@$88J z$F)k1_BZjKZHz4TF7t=5S~}uo5bHuUf_<#4SA;%H6P@vI()BIY!QK37SC}+9!aXEA z4^4J%?Aj7OSf6bv&6Eb_y^S zmD_a0U5%{W9JbnBtvwu#BL;N6fsj(Kdw!+@*7h&o1)(+PPs>NCJDS*hbrN!R zd1H}d_$Lm!#L5S;tfYpBBd97VepfnmJdVA^QV}Y+R)8c_u>}*aLV%>)Fb%S{h*OIj zZylB&#(=#$EyYQk1rYco>*wTwnMNQxBnOAh@t0igQvZ}Pp%U>Zsx%di$LO;-NOmWK z?6AHtlcq-z7IVHMqedgFnrzCKEeD7+nBm4!{) zDPSkTkM+=sGP|t?q*8Urfa`>fJw5@57EI%c<~zMVGjMWrSnSSLMq2G8;Y5& zebJ_C({2~_$0AvGXc{?%#CzC_*qFR==r@zpJi#S&hR6nHjeRJ;qWFa(y7)yX?<1|r zd6u{SB7t{+w8qmZ!o}Cu7afy=p5JH7pZRH7>TLeXR5?MO%D#8Nn0Rhz@5L)`=JlOM ze6c-_HhGqE@d;a)pX)JW_$1THReLWgp(=|26|=PjX%3Bpt8bIghDLI>;gXaRXJVO3 zCpDY6+lelfoRXGvnK*@VC*zFJ#;bAGnr-XrHe~JeJNo|O)*FC@IvZQNgDRrfOcU(8 z_>$_oaBGPh;GL%;t4nJ7`5K(Manoypa4O8;U}bl?z})8NSDeX&U?KbSt0A@FvM^cn zc;bK6zy$9jfUKB5z#^+vR@6(-VF@=X@Z>qYB-ye2xBxhKkYJ`30J_kJZO7p zWvLV{7-2#wVacMM|FJRmOF^V^3MFte8Uu*9g}>I|oG<*-6O2o9cr{>{q->G14_Kbv zUzhg`4j<`1Bs^LUANBnHh2zB2*0cat{l;6dqU7hrq48Rl>T-~%YbZ%sm{OuYG3pjJ zjs^|2dec7e(1CJ@$du++i;He`cpX;P(vm$K8*e+Y9Sg5of=vloJQ@QJ+jFCS1~oKz+0isIhkyBVh#`j=##ZuQSKM9N!m~NE{akkN^U$kB6F4$4;8q_+qi#40U%u(w^7N(&uH}=odiwyPhl&bl^K@F#nsV-)-wLt)`fv=(2zH*K-UdfUpt4Ad#9d*{(Fe$}8kuibyy zd2?C2UJuH*k*VLi*mi{wIFz}o!1n{MbYxJD5Fs$3DemMyf%$IH?Ypl%TR)p&kJJiw z6+)}+F}2&S#mo z*SvV_(SmL!+Lzn4>&J6vMhutlZiHe8zxVgoJXwK-8bCmR5zKTD!Qqf_)6VR{w-isZF5e*#Y$LWv+Dc5f@)81 zC-fAm%dQ_W?1MW<7AA6c)S?S;u0N}MN}puqKB)oK^K$^N<5DODzAh0DM-ql_g+*m~ zYc>`zCcbGq>W|Bg&{@n8aLu{J7uU&$CUXHs+X-E5RwE(xPHVu~Bs2IqqDUK^vOgCs zrPd2}UQvvv)%|^cbep%jmNm|yIQ)1d9#kmF#WOmxW$3FMssQm!`CGE=eYIz@Y(Q#K zVDjL~?TWy_#>W729B|8w%kOU?OOeM|9UH(%N{LE>R(K8v$5!=vEPz(Kmw#c!9&stb#`O(j5#n?-Go}STc z+gz4PP}dW*;u{lL8P{W&elqfzNL(niAjRFdCJ zsgOLQ3ywVrQNj!;xm3_a2P3G-a+aL55Kj6vPHQ5J+!X(8qjk{@ImzDbW4T+ z7y*H}j-vwvOhd#A1j)mo{Py_?bz4kETbvE=Nl&FLNkLzg_x2B`9*Wj`mL%NsP(zf@ zTDhMc`*A6EyX?Jw2?=!3uxzJNG1hIK&9xS&rRQcnMh1#+75@B9Wy;lFiN=T-=;>&s zhsjhXcA!Gz9Q8max!d1XAQWUwEhu;((~?@&C?gr4Ef0F-Lfh*vyH=#5G)hF23qpW9 zrDrD|u!LF6COEO;c8cWZB-MyA)af+nse>vqTwEmdmGpPL2OkIs${sf2QRP&A&<*2)lG;yE3S0bc<;n zb7`kyn;Ef}A>dZy{6M59@q(2@9~z`wT1bGU zS2bwJGkhz6io3ch-$%AcJ`zWOe+)19Ic0~$32^381gH>`kUM1*&vWhro>Gas!zSS? zaK0x1<1Ba}RPevvgtv7xZyS4=cuC~oWt~eX$xVm#KFwnGbV7 zpYD%v)B#Qer#yFg^6+bNZt;vDRCc}B9rPWXSO3wE!kp>|nIF*mjr|Stvue5W9Zi*h zNo2dV_U7MUH4O%|&^Jm@)qo_PRQ4?r&wJ12Fdg&VZs!(tD;;^O68@2sCFS^8LXLrm z!8OMf>V6+@q!@0vEatQ;*OyGR4bzS1Eb}nXeUbA`t_}ip<03pmQ+_TgoJZ7=fsp|{ zyMO-93O(%q|M4TjN#i}eJTAwftKW3zQf1D0-*8JM{@kFSm(BFJg?kG4=$*XR4EMQG zUihXgUt8r1gFY9!{Jqbe_bMHn@GnX3@-Fqd-Z~rDaT5@YizLR>VZJMD&p28Sm1JG+ zyg_~x+I332cirG#md1L2Az>H|kj|LPWaCJ-DyZ#U%w(2qh2qA)iJiO1ENpGq$D&G4 z;!AGm*l>Jw)XE&vl(0Kt6mwBvtc8&v@cAki9a;FJmjqO2x@3?Z`O;>EKNJA-6VAZ! zy50+aO0lX?xU;3D%kc|+%az^7K?28P$jXFzU`d4LM{Jms_}dz$w%CPim?QJR{_Q0% z&Z1QOwr2b?7`_$B3^5W1pn(-9d6QP>!=%+6YwvjrBx?$|!IBHxrpJfarFiltRC~#m zJ2m#e?~?F$>KL#e;Q6MkC7yzk}*^x3KvsMzoUgkZh3iW zh-zHes;o!X#I|)BBZmQ+K_w#ziz+{L62dLoI*ME4%G`)^flDHlbMD#}^=4w>Xme&5nHQge?eyqO-CA=&SDqYYz zCKDv{Kq3fPlves=8vrHtouHUT?QJuU`-ibfKk{&XSW z51ky;2@N1hE9Y!8FUeUshs}zRK^`ve>|(1YWJE|=>gZ-li{Rw;9ujB8z=Z7LBMxc* z!Dps?#LD@5s?i~;WE=$7arA@;_BNmdY&eAjr2B@&g$<|ySl5qpvrkCxG*+iR-c^Sj zfb>pXOqV`1m}{*5fgTl1j)MSxPW@r<5pXv63!vWFPy2vFDc19`DN$6gf{k8gI#AmOi47QO2!VLV%*kp|CEYZ@~oY?gWM2Hp|S9el>=Kyp5uaMrqdYk zfO!#%LJG#EOk^PywS?Egu$YxTuAUEaKmgbtK|k_!g;%=8M~NN9;#GA(CSqW1+tpx8 zl1E^DU98N85kMc%QRc13;4P)f+BS!P^PkF&WHFpFs>tgWtV_>JsE6nKR)pz{O&7+O`~fT2C_e#LI;2C{p$gQuZuTc632wM?qs2L1SX~zBTtg z-Sk^7fN1r+^~gE5ex}hEVnbr8(ht#qz{sa0W+j8mLJO{nxl@D^I%w)J871kKVVie0 zkKgZ<_XKu;x_>#Y@=-GxJOWi$@C5&iZ9a3Kty);8&Ra*N&KoY#x8S0wmiidx+Ri2} z5y5wSA8clrT8X#n zPDcX=D;C6D;=F?MQaRDb=+SgV;%g{MgCwf0MV1r|ls-Z}OW@YZ#`9sn-l7iSK_Q#- z>6nvRQtcl=@bS?>xxvfnmIyhbACGIYY(i~Zq<1Z1+QZ9dR=PYWDR zsApc7`?^(Htbkx!lLdUOB`hoA)t`NkH2DjR$Xn4xhI#17p<8(jJbb3+?r4oDLLn)s zUqm>q_l>z*IlA$~eE2~Fa`8co90;~z=h{aoonP9$j2xIGEoqlTJZ(&fF<;#q4#<}X z35I#_(NeXv5rVN)UV!D=w=JDFxPood`2%*WX6Aygcw4w?8b>ezuDhwI1vcN^hoiSHv}nUI;b*FmHZ$CdNh!%p)Brt4i_Ldmk+S6 z?qvBof7!KfJ&s=tT-Wt~4F4;f5|+{(BrY+&rQS->!hLKRuKuTHDPJi+7`-nH@PL9cEb6BzM5RcKq@+acgZkCV^jLf)#kl)&iir;llov375;w&1leqgk&q zW9AoH5iF73JR%i;#t&CJ-H(|pVrc)l@1;`p3R>)J$YdKUj#gTqKZp$ z>a+V)JWnc9upy;ZkZczDZ96+(Ewby8*q>X3eb*H~;eNM@H;YS|mPzqPX0V{MGWT1` zpE4=7rk}jZ;|AyDpE3Mx5rN$y>}pn=GE#jJlt0^Hx@Z5;B>svqkyoPwPRhoCc}SNA z7)Kko*5(DuOrTzgefm^tlMUmWY<*mAj_d!~9(#jG0ed|i#44U4S6T%ZH@AIOQ~hX> zn+2;q_l1cSoEOF43;PitM0-PCc)D9r0+9q-s=(0m+0qK&gOlR)*|W}M61{7s#4|Z> z*U`d77cCvyc>hKf!u`o2OCh~s6(&Fa_ufFBJ1=P;7DWJ8Z684QZp(Ex&W5}fz+KH_ zwZH#q{6jRfBpclzA9!C?%QA}=6bBiKgvi0_(f@o-Dj)Nvfv=xW0l)06bhuAiOlcAO z_1}Z2P(10+#`R?qP#t7s(QkNaYOur#;@fcZ>B(T&ra6Kx!NaM~Iaj=GX|xz!1m|S) zmxQp91&G9XPL-AO{@;M0T~4^YepD&sN)f&Y3|)?hy@@b-gJD5c$-!<_$tgiKYT-Lu z#yeY;BTl9xXE-Ok?xMQy-h>yz5rsP6v}s@)lK_v8&C5vow^7w#JeQcsu{eIvU~?sb zjK5lWA;zN0^E_U!z04p1@Q(n({BH!seiwvMtvUDSH|0h{>x8Y@u2^e(iode|U=3xF zp=BiO(dX-+ZfgA^;K?uL6%o<1>9Gw4O6H4la9v$0jA`MLO|GVjxt9?wyrpR=u4~DM zmKvx_Hv4g$$MeRlaiFNqmQ4w3>OoeqJz0;i?Siz+B1xYA(--3bc$@m*4la;N0MU>z z-mzQuCvuyI%uoHswsdU)&6)EiZ!c?w0~72hM@zASvra<3RRBUb zukC%bEb0i?-UTXJe%7f9D{A@3nyqc5G9_b@noc5E>m(dcB1pI{aRQ)Z+9L%>TOE=D zKyy_5YS&Uy1F&~4Rh}mbo%3(K-C;XV<-M+sr2AVulyr6f$E7s(3K7crJ%3APLFg>6TqwP6|?c8p5U)&W zjRnwuf&zZ(K&3QDn_B)N&371{&pEETeFD>;Tl0rKx3uk7*2&`T!f0{C$`c~L zkR7j|Y~BB<1y}6nhvM;_8_dQl-kFAQ$h-keXy|dI*NeJ8e3DF&E6h$rWb&&!UJ1Vq z@Qsb7UI&ftrC%qvBx7s2vM=s}6$Kr%UAxl&L;(}py$o{ge}ZK0V4jM^Rl{xhl6&kf7SZCx_=s?CXHaE3!ZQ#<%|%9 znpy3wl}lF|>Vq9?u-MSoeVl+T+!*xV55_^qg2N4LAnzl+o<1(_X3OyQTs53^HLSnF zZCq}($<)GVh?aAB2;)Vwf(FKrYXwThG>Dnk3BAjJ^)#1n{aKI+dJ>kEVugOj zrEH-f#_#^`WvA@Zc3R{#t1;aW(jDFf={Nhc7L_p2%BIoXR8Gfy*C8o)u@&k z4ZFW!P6huylq-nGwJoXmpVRsF{(O99&r%kIXtqBDPOPMRfPZ-nd@Vbp{|USg+Gf10 zb04(+@6QX`_H0*Nqjk^=i4Fx*YdznmR z7DFg-EVd$FhSo0Xp0poHy#PU<$oD`dT_eqd5V#C$g%vO^xPZfW?#tk^9@Khy)4SDL zi=}s`Zi9EzK9uE(MUSWg4AFNOz`(f5M{wM}{jd1*gI*u8OvAa*^^`_fOKw0!pPFvm*Gk9*f+fo6jfj zP^K`)<_YtkSL~iyWL9p4)zC$+y(>eXe+PjoCV2rTY)?N3mpzn}C+mR1;BDeTR#$(s z){%kbNOz(daW~kr9~5R=z;KB}S;2GFL#I`YL}C|}eP>eK6r&r3k!3HW?W)@`g?^_e zjD(Tdv;l13sV)&EHiCGy*~jJ$9F(^avr6`w*MZv4hH$C-%h$#MB2#hXCH&98+<6F~ zAXod5eo5S9a<`#C41Z5`N9zmc(}#@S!?nD z=m!!o^K-M2W54)W`F>aamvt^W0cb0>1rRMb>!}mw-W2 zSU8Yzi`7}!7;G@3-*4Y}We;7c(;~T2s5i3P@GjqZuYWkY?Q*;PJ88^;AVK;Mzr@vstYhlO4{oeK8Z^#`vwo0PAsm{aOie$1LKFSu!#XHwu?{Z9_%j4&q;Mk0zVMd(k+4~Kn}$jJBM>>mSjP^gdi6-n466n3||+az4)`)GvN$6F7NlcfXo|s ziJy65r?G-r57v;UVdH;P>?RhQ z-l9^C&46RAtWNV9Vj`Sk^qa~=@r>cZ`9W=*RJY&k2V;z%g%JWLh81S9 zm1$l{cq9*Tj=_(91A@u&cp8G{g6P`ct&i;WbuLDEK)Y4QMm?0(&;FFASAd^Ep*yCQ zAClns`kbyhPb8R4Ph`bQ@ct;Zna?o=)C=|+*X;FU&U5zi?h3-Yjyqp`rq4+!=zY~s z2K2Ma0j?cBN&6J0b^p?s>y$)x+Qp!2p(zdQQnBO|s&MY)*?~h(>FF0;xVjzst$+Fy z{Bin2KjOS}?zbr13ACIX|EV&~AKqFnY$#UF%k+~X4OzNQ zeUh&)?Eh1#Wi!k;PtmlW@#&X~z_D67deuZ2g~_I?B6c9Ff(wStsX#vI;JYjVvpuA9 z-o)g-2>)AX?Yi(lW#@U`8cs77OL4A1LuF@RoQ1tVbAYH`HHDVHTEz!mf7LWGyfgI_ z~^;n75w}+ zhvl>0=`HJ~sgvhfF$cFoM6DsJIA>P6w(F2R<+_GOFnb-fcY*iG&B2~O{6gI_^P@Io z$9YI}#(OGFhuh~J=W0q@(lhXcp>%2AzcjwONgLe-H6j%o{A6YE%9v(BQX!t=8AA1? z(7%!!>mtZX4-n{PS9gy%I%AW;+Ke1oONnr>c zxiZB631Ikrz4F37Y_{5Wv<4er$aZK~W3QtSzwPu}IR0KyWN!=NF}s~yw2+P%maVP3 z*TH5n9N0M0^U3q}ouES(x@qv}pG^~32`!$s4E5O+=O0|U_&yJ5&3a!EF}N-SXu zj786lElc=8O%VMVfM)08Q<-L?sAk3ait=Cfhtq0`bhbGUp)Jm z5+YBz%>usfrYya@=6(3^z9XZ@EZFqC7-eSzD3si!XJvEa$@mHGD97L@(@!(vn_>E)%)FJG7{LQac?B2q&%&nvA>U&By87%I3L$vo z`cA2{KXQ{1c>_>RZB?SFSGV*i0+wzk18}gP)Xy^YB}LYmEDX($mg(@=iG~|Y5$f;{ zCJVIaC1B%CYo#c#qkHq_c?mLk!hmAi7tYGHc;-J2#N>m)5cYEF%ot$0i4 zf6Io&{AOaaSBtb@wGl~KOpf@ip=zo$gW+Zbw5mEJh&n1w?Z2~D1e3jQLR-Tx!)}(K zd6%$Ineb!brAvf7#8t6Bs~)(uj>?(sK&|kMU+M&g6xk+z9`F_$2tKot;TS`#gC)s9 z8gT4t6J`e{E&m*FDB{d*;TT0Q>-_05sFy-gl2OTXu0tvUT*QT?sQhlniR-?a0icQxiKDQR-UY)HHO^4p!(&8WG5ptPw|4O`ggczefkN!1A$thk8mPE@0m$2`ZVBsS2CG6U z1KUjePnn1%w=>LY!ONV)-Jhb)YF;fx;g_H+(&<*Vs=!LPt@RGk7I zl7iz@jh9OK*L?c*R=c=ge}BlY@XJX?pCb^6IWE@ZW9Svxe>Xz~W2}ut>}4Z6>!Tvy@g@(}dgBI2VZbxP5G&6lV zt8pr8j(glQ8d;wBh2x>AeiEmhN-74?pcb`Bw#&Clr_Q`DaPg}%Qg&r<$ zkC$JJ>OO{-U=tU?S%vL>riiX32-~IlS%kKkR(S~C?oSP0kLSG4*C0}+mAda;Mw_~> zOlDsDFG!0l`dRj`GyB-Ii?WqK>Q(`lr8%@)YX+Ih<){8^L#WqCVk_UD75z7G!IMGA zt(3qy5F}Ai1BdB+;(jVs`@d+cN8o?aSfB6yhsIL)e`zdDw09Z{xtbVce~I5>-#ay4 zs`X*Q7=2v_aETlcv)Me{i2zuV)|LU^d}50d;-{#=8>&`QWqYm1SC;`c?bcE)Eg#RXV5xRjgiCV8D}WOn4k` z`+IWyoTK)19Nwg?!+%}0qBPq9m;atp&har*xf3SW>XFMWNEd!Er&A&G|AL+JHA_O}@y?N5Z7fm$_*P)~?M2FPB_Y^_&?S zSSy)9B!ao)c4jGKEyA;+H6(VEgr@zuXLyO;Y`n!js@V?+??hDWeU#K=AHH%+v+$n- zqGj>#d(EYhA}6c-$TMtBTYHCOmCo4FOe@3?$)hjb&e zQmbZpqhr~A#Vq~Oy4Qj+YTHPO^G(?zj-fY+vFsA0eUaQmqDM#hb=ERYt~VnShWbjk z5~(#nPhNaW*}A=!qc?APGHPr8eUP&a-SfO~G2=MfX$n3&<=7GKb-#A}1mD=swl5wm zwl}t|&EL^YDEWWbCYl#Jl6SUAGxL-n7$P*;$Oe9GLluW;uHS$W4alr zLa=Vr^P2}6vFf9N1qVmQ6|`kWlJA|+C)&hA`B`Iaud=iGWw6UGeZ9Wlm?!T-Q3+EK z6$YXb9k17K8ZAUt=Nm1-ma|c>?+jCGnX$m9xZZMKMBJ-*Pa)nE^z)iBIrbMhs_V}RtnHmdi4>1mbVg=2qa=Zk5;^L+nv>>(f9@sC z0{~mzS7+2RMjzz2Z6WKr1y_u-p8W9If^|?B=EVI5!1xp~*e#$Z^{&Au zHNsg5+xMiIEkQPdwYsT14QtMCSTW{!2#86q?9-x?M6LEu%Eu8SW@(oQU=jF9VdV^` z5CfDpOTjWX2jr>fQAcUR@qxKD=O1k3)8srwYuV%!6C?Q@4qXVK7^+d(;e?C%>y)oc z@uHMOfh_cY=(@+?N}{%J^l@flV@HG7wr$&(9ox1sv27bWwllG9+fGjI`+c9oI$hn> z{iQ$k>RR2auHXL(2b+HWNgx^vO~d5fifRcDb#%M@yZes}2{T%w+1WKN%Llr}Tq4RR zFfnxYKUKV8R6_q<&!e(~aimPuSx2 zN1tKK(L-TD?LuKx1Hp)f&>ja-&0#QNSE&X5>5=s`7I7BuX9}qGS)sE(YNgmJma;x` zlvjU}RLWbD{j8q+f~WRH*wqH*zJpU3ah*atCJB1|He@nACyqVe`$r(QT7WT^Pxu7o zKSU1g^f-JNOf<8E&?*IPW70p3s{;p6i1vc$F-q_c_PBEBtB$gSSugYjG3^{hx;~&& zW;S=T2{k;78XUYv6_#8g)X8^6e+2p+Idx641PNrgl%!p{WH)t>{btQ@@XD}q5+>;_ zfI!LHdE73i4;^CYqBFJnu7LWWKX*+arF>#g{dg-FE(x`Yf)Zlnv}qG-1+LH&JcP43 zy%MgYgY3anggvcA4NTY+{+>=XY<9B_N#qczSVz!9n1o{a-6Oe>XovQg;YDX+Sn0M6 zme-U6fw8qYEMsduR&+IpdZ}~-; z*huaX-AoA7;n}-a0|TZDK~>u^D|-fNCkEjg7hlr);p8}m%RT9H5X zG?$n(5VyXqw1t|~6JO08cDCHxdtf2cvs#Rs*UwjIMVWU@xGI3~=0#`C8?j6%qX-I7 zVEOYE{K=3C%`{W@*YsBFn_Qfa{|#K6+-TaEIRRPoV2ds>Ha2svLS+%S^VMmE;G60@ zq1!6f4v}^Ckaz8sTg|3*G6rAjveZTD8F=A6Y<%5SkA4(i}Ba4zpEF* zn`q9K*@G&g#&i=6kO@5gV~JvqA`HGP5!3kpWr?H_|Cc3VN>g}m`L87s|G!(Jde;B3 zL~FMHKbENT|6z$53AVM&7Jeat@t<^Jit?ZbZtS?*RMxBOa{f2Ld)3wX6Xs$`Mv%A0kOohe=S`vWD8Rt+gdh@vgO>HXd4BtjP7=PmV=6 zc9O*XjxqOvA;%|z_Nx*ULHW1or?qvI9@7t=5WF9##b3t|9zW3`o_+xmd$)L|?UH{i z$4<;gEXOWbzSHmsK=d#HG8B75H9t1g=r7iC#lSlIP>JLviT^YooEX86d^*%&)D0T5 z2AxqAs$fgF7V`zggmP69R1?A<<^FTM`N*}(!Vvx#c6wa=-xR5K7{2j)(l&{1UqSv+ zt+KuKpvFXX38DM_izXE(NC@SJ?zGl94qg>lEkS_qQ`@bpl<58ss6XBoK$H+PI~<4| zyJ0*0!MI^*N{;C};mI+{{-q@jLG0gjeA7|+R$K@D*(WQNAHMA$Y0HDAYoN#a{^}jm&k*~_ocu6}+-8vZzN9vl#iAg)4-_GE6 zY5ZOXs32Ex!-=`r%L7HpFi$ybXuO>El;CP~KHcR^l?$Vw<>hzDTUk|&dUF*p#Pact zu(Cw=e1&r6v*{|_s|9}+#q`Ps^F-sq>AF+r4uwhy`l1uP7VWhU%Ip*7Yo_<#El%(UrA|nyf+0u;%yn$j-a|RRX1#BwtF^ z3k2tXjGq_%jOE6-8k(tJMPUCaQ$U*(&ebiQ)1+ww4q!rmq@K-hn6J>)?=;QV;V4YR zKm>SPt#BMwZQ#FYWj30tc8o&}l+hbAmpe!Kyu&bRRI2Mr@E_>;#a2_?3Q%`%rz3yv zLGg*TqT^O6TnWm|02{E_E-RmFY^lhhts2fx*ney@cZ zU`!7|{6Twf`A2^{k^&Dg*8KNE9bPqHVz>S!nr?YkzpUSu1ac?BGlUAQ=PWa$C8x2) z{+!xwop6X3`j0M+Bfe3H3=>>A^RCK}vn8hXhi-Q9=_WlhdW@dxnDv8?cc$6Nqe$ct zM!xU?aPhe2udc}+mwvrd94FS~n9QJF3C4(5NRvv0tLZ?5@PZ(5+%Y1U&9*60ky1aN z6k6?2Lci%#@|A#d_@5`Tw}g>zPM&dS#}j{A?V&(%?y()GT#Amjw?Y@MMo*#Zf`${Y z>f#8O1zO^fl_6jQ8^UL0fb2W7f@st+CRodMpYc0Oh zEsmKpV!I2_1xG9U^JJ$R(8NsIk6PMgyRBprc43I@x`c#fc83eXfdUC@$t1U_Y_W03 zlq$5q-v{Yf6xPIbwakpm>NC=;51&2{8_q*^drP+uI~>^ul*~&*kScP?X_p0OS)4?c z)LYOm~_DO^oFjO&Z@^q>EEYrgRX&-B&-Dq;t}#zaLT0LcLH;5;Do=wB5|57EfS& zj+0`*4h#D|?3++!L#Ier4c9Xug8WZaf5n~HvAL-l#7w3K*^+PH^HsRa79T$Db;!Q! zvrZnQ9*Wo_f84bsB0Im>yk@{chza&lccVF4ruSp$Fk-mxaM~3|M_p=D@IU$o_$5L* zmjB3cAOVL=aQVz+IBIHdak}(v5zBI!p?UcFFY!Puw7%bK*t(ckveAV{UzuEgyt%Mv zpL_oe7eJeu>d**jJN*MZgcB^$G-?(p9z>c+rX%x0fyPfVbEq1s;#eJ-gB=9bx5#gz zMWZ?`hj`R)O@|m&E(MK`%djsyy_T3Y7wC(o6n5f3=NZjz53k z_L6?Fj?W9`J?UqT{au^ptGtL0C4zg}qvi`ahp<$y+b8A1s=Ul>m$QNdB2#ozr1yN4 z+UfV;%IvJe{iJD|_ag({>ZrzSwWE(JH3D@e*hB$29cQ1Y`)%OUu*b()M~6xJ$ZSZm z-IguGZg(z}=8g4*E!g==+l8sd93wrarb!J(;LM#GU)2*|_w<&=MaxswgC8poj(evF z9Sp{62KMyf-N}@1?U>mB-jTf}J7>-(8)Q-=@?E)KjtdPG)`^8H?6*5Dy{Z=V?rQ_> z3moXG$HFE8;<%o=c&K2wXVbyXGNuiAJ*SjLuFyWHU^j+teq4c1xbH9ulKQ0|XY7hO zpDzycI*>Mho>I8fX^_Y($LMK71M)@e>1~^QgN74~&u-ke5uM$z-WcfD;2}sQ;er*E z=~L<;BJRy5IDQsQ?$N6{mUa<+DU*hgKW9$%-^6qVty>`fo+Kd* zQ1V$Hmzm>MKC?}yd1R>C|GRSH$zdR@I=Jh^8RZqoq_DWLzPUR-zO}r+wQu{lY0#=9 zGNB9My=GH9+`Q^JtwvOnc3+LkyLx5Ze!LI7-104JExG5rWhZD_JoloB8L6pEkenTS zKmta3S;8vMn_jMpBrs@4nXkq;JHEIRY;;+B*#*!>l1<) zx&@`iQ~XW8apc~ZPWV-N5cZvJwf}8Jut2-{ty-)?mW9+Ff5}0(X8@*yFXlCEz0O-#*eP zlt|Zc^n>S4Vf-5OLs^{!6Y<0*mk%;R!~yWf&r5l5-}q+IN47|EvR5ArCIqsO6(KtuHD!X>@kfcO^&g5Z1?Il>u4;4=PoMES3lX zNrzBqj8G2?@UZ$B{<}Iy2SzrV+B-RZzP(BytGc?O}7(*LQa$KAZZUuF>b1 zn5#?x-xOq%DJ{pt%@i-mLY9@1`jOH{DrL9PT1^G6xGgb$L}+n99!MT=Busd{Zo{rR zY%)K1S_Y$gcjM>~eq)&=y%ID=_m$p$%ZlFS3d$h)F?y&OaIXAeFNl)q=)t#@c4Rb& z5((V^Ay3sj*s4a_efcaut5h=riaKthRQS_M^No6pp=kA6Ss25*>O_h))zMIjHJ4!V zY6YNvda>S@&`zY55UDfE=?@5K`hBqieT2^0%jB_&x#B znrgad{n@4-ystPQ`mEFMXU9YAvki1rHs#U!-otmBwV`L^J%W>pNqUI02T6=?tS;Ut zz=%t?i02u5XBP z?*^P^U{_N_JZ`>03JrS1)M@C^Mg1NVKlRTH|3DJ%dW268kO!HYIx?K}^pZkky)d=n zm<;P6Ac;;}$3`-3Z7iS<#UFAO)!-Sr)1+GvIE&nw*qs#K5=(b1N%>PtKy0Spu3@8= zAi~ke@YOijRtDc1`)%z_R}C6_Jdj2ao|Cx%l_F9|I|oaFkOob@*Xn59tfd3wGX=k- z6%6f0iS$u5>WEOk#yOq@z=TeHa1J>*_7~wQu?CCrE))lRBsys&pOZG#%5P(Qs>mv< zKjpuXl^XU#=8bPI=i5F%%@{i>*R+WyeCThjh1ED{0=xd^>tUTki}+nEYH?WCk`H6~ zTdGAbK)bmk8Ph4hhcFT7%7@5hXYo#|^3j1#>EznxUlhD4VcK`Nl%#LglD*8L>8z}1 z>wDqPPrIg6UtEjzLi<{4Q=BOh=ABF!{#t}%XlV=lUaakB1raxN#7QLhRG|?`-My~7 zG1?Azx2k?K$6Qo@Y|*G==TS^8dtDMN3GOEI#-R*n;}<`pQyFIyC2080?xK43^p6 zWIiQYJP9F9X6sHqIKhsD>D0r#k1%LZ0&MV?w`eienJS_JqVVTS;>skKz_Xf} z(F3T)OcV9D4ConDap8>;HP_MrS5yBY%}xN3MPrPb0ywTX__738L3Zb)0T$+XC6@NR z267ZwxIle9AlN+I;XlTjE|#==TG*=v9M)80eLW+`!R6LzJTI0p`U(C3i?2X1?Q73a zLDiQNbO6cnF*?Q3NH(RzV%48w@Nxte{lr2TY~!-xK^QMjriGUQ+F{K_cZSntiyXle zvtE9zm+OqJ&7uItrpT7tq|2 zBDftb`Rn?_zLX#BNV+}aFDKf4$IlekKnxm zZ1$9pMAvhFf?FmF2EbL(0boQ?u*zDr(w1P{)a3fJyAW*5;p@V%-D3H7fv~KD@nX|8 zW~QEiR7mt6zFzOObl~vk`?)O#1)=%~H-xqBYcg3r0H^_0kwZT*DCi#o_3 z4@yl&z^bu$NUfLuSN&jp|;p{JVf;|4t0A~(?DNH=ynofVM%hH|zANqnmS_psU z+^au+#8B|jHjd78emGrkx^zbmI4I*iQDmXd_3^-`IW%L9fOQ;uE`#};&kI%+TQjLe+TKnNHmKdRnV)AdCtpR7DKORxi)KKL=$*b5ZaRC5Qdwavg^ zF@k(EN1(aKLk-+h|9#^PHfaIx?5sTSo@|K+n|NwX>wx!y<%>s9PXl%@_TwC+DsbN7 zbne3@q#9d7f!joD-1a*3`$RHz)(02&z*t7HZdth^?2iBOv%zd1L%l+BNx6!mBH9(k z=?^q(f5zz?#IIpJ^6g?^MBoY#>YnK7;s*be4+`U2N41@pf+T~WA#ES$)wg-^!#fx~ zf}kb>)5c~S#cW2cVX!N|h4>3)FP(9U0`@5j&OXfm<`S7QEkM5n(MfxeKxa!fXSk#L z2!nq{@B91bZ*;a+ge_?h_!^^?=wpv%%QnXvrOB4)Nh87sQ%sqy^@begL}A*PZSk0$ zkm85pO;Sv?BR9z|875trt3*IYdt`lR%NejLHhoVli}SZG;X3h)MV8_Ox~~27#|k;O zt}Yi}b;gOT#nMnVsZw(w->#Av-0a^tKUBz_+GMEaIB6r z8jKn4DqN4_>Qs2^6A#~*Dfw_RVa7nAgZe|XN%c8*&j*a{EQOh;14OUde~b?>ZPzkT zu4aXQL_deW#f(U>4ApSmj0Kt`LX;_}Az3qS&zG7laYzClnPc`197(xZ$s26OLC*xJLgD z(C|5TW%|lRAe<}F*mG>!Crjq8X4rUVu3`gKUU%m&;D)Fs-R{HNCE(yJgSWCe{~<6w1=8Zp$nU7r=gL#^GE1_9ltd&sxvX3?U7MlU=>f1kz_H*Y=QP% zMafwaQ4+)^Pn)WbCKYDTd!y1{f;E4-4+124H~eQWSWsUA|2WxFx$PSgh2l4QfgC{an2USlL#2qLn_ zC__$q9FZ=%k`=zsrRg?xV1ISl)HG`nEF%!^#hKSh6yKt8?`2*=^m+E6)b#FT+&ZR% zEK@FxCW^khPO9d;0Zf@MAzHG$%}1|XlvvzPV{sU*ERR&`3h)1gd1iDRDC+5vn%d?6 z_zN+t62DF980CzkSoHG!>4ZE7j+Y%tjB<3z1&rH@Q~y*5jEy-i?Y_h#S?D5=n!lwR{W>G7Ppgq`1tlCaYrgS{Ibtz-*w}Ec>3>9i3FW|}f2o8DtkGKYF|94pEJ<5M) zHJOYJ`Dl!?ai&kFj5*@VS6u}NP= zC%XLbT8DXDd$q7BG%4Y3JPradItzzeS#GUIG@r={c~3U>OAI{vExBaSHvpj!8NBUV ze+-eOpnaYME>eg;M?lKpmvPVyCTORTxxo)&_JWE=a@D=^8K5eNj~6&`^gCWXpdVMo zxW@)l=8F$PBY)#%GUTt@b2FBT4xT6}no7okry3$HO`j_pGjqCb(+Nj-3iJmL2=lcX z1m#of3)GVB&CbEB3MOeUCre}jL?5qt54gHZ6jyALSL4a9k<*;%A;Et~`H(+5!%!CI`+22WZAD zhOize>;9<=q)v7giuL0fMSv41pK(CS1TaCu4vqWz6j$2i-7YjQ;g7L}+tLR@4<0Nr zQD!7QAyIqGv186aSf`@Sz&r|Rb!R%WJ4bXFoYeQ_(r*3bJ&j3bB8b2fIgL!U9THBM zoU%7m$qwU!Mp}ap0)Ol^=)R7@v6X7+!9$1w7aQ8`jzZGimHrwajbWXowzxRyNBl=q z8Yek?Tgp!e%_h3yOdFy&h|Tk?Ll^Zf((lgP6)+pg_;UT`Jtu zi*T1kW%kF>Vuxx7*oh7Z?)%tmrAStnSDUdBIX)S|?8BURlM%mH>```l z9vFhP%ND6-4W$g5|NYLt$R?EGmz`aMA_qO{zt%Uxh)ldOT$i~cdYK0`rzZ6lBGw&A zyzAWxY{rlYuX`YOkzlNB>NhIgnmD^b`+kQVaHwN13jq3-%%|!GF!x`h?tY)aOnf)H zZZV>rhp=`47=2&7B`Qzge zPF9wQ$EfEm=3Nj}CY*%ck7M{z=i2wC_RZ@=x5ra^5Q-vQV3za%e7l$(6Cq7ZdkXiJ z(>r~pA31XS4@)_Qp z{!NQ4kO#*{lSO`YVCUW5vkktxbqwqcak0EAf5~Oa$HgWW8T_prlHDlJ@9YU5bs@DU z@W83dzQtnbQ^w7O(br2162I1(78ikRhaFJNZ7grNp5{UHrk4sz-K8SX8z~v+$Ug&R zi`wD*3!smfA(uYTWqzFbA-+SbpE2-$p!DF~$L{h|c#rSJt*`KPli;6Ddq2zP_b<_Ert+pI+cu<30zMh?s<iAhTAX_86J11Q$PVH zoNNcczh58PsFx4SD-R2%h)&%DdzBHR#xUEaOshXF_xFS}!~l=mVND3 zfW`8aM!63+z{ds+Sv8+$r|YNY{ynVRX*NMGpTlbOb{T5@&3#A^%K{!tlhnncUP8b? zhuW4-(wP?Tr)ssbU54i}d_%?Y-W`5MSzlWqf#yMh*LlC6KEQ)7{j2?Rn(COa;A0ZY zHLH%%=1Q9RyQ3j4y3M=tSh6dgN0!L29HlPWb!>15@k3z^m0w5ks@u)~tVgDh-G3%{ zXHRXezqU9$x|~1!U0<(E=W6VdYU5)5bgI|W{U{&vR`^`K?{xdnD(+J7YJ3|#m5a#6 z{~-B{`}}mPe|pth&|65?Ls9n7-4Mf(=nylNL@4;UUw4^2o$uQ_HN0ov}~CtUV3C zoxaa&E4!|h^Km(~&z6@~&-)&|WIgAI-r`T0(DpaCS}N~HAKFguS3}Qs_c=WlIMe&Z zx7N2upNj0J5aiylT#BH!@-tkh7rp6ER-c?Id~dPE&-=s6P7il&FI}6?JYjLfsOTo* zGtwuE506~1dF*#3>;NU~fzX$>`TRM8db_vhHoA!S7qhQ6x}AFb=0{uO!k)k2N!5b+ ze8jp~8W5qW;KZ;HoFDVTqD^sLgc`m-cZ}!1Tn4*GUu>f|#YzM8>HYKSg)+d_eZP5!X75MfT_`rJA4LmB@*&jm`A} ze9QKuC3@=HVXnv3EUMm^4$tvpCUxB(^kqW z17FnSsZ#>z-7OF<)gz_q{V{RbQ_pXVcJtN33JqiM^{POKYdz3Zd*GBdF2>1Kedo$c ztjVo)aDR?3l6`nT_HOH*I$KlT%Rn1+w>z_|rufPC3dFkHknqXL4O%wWXj$SGZ+tuO z0|*OI%z~FntW86){$roP$KN6_FZU+WMerL4ss1SW6NU7 zezV9PDlTU8d7Fc zvwe%P5Le*KQ-0)W|515ETbWRXjnGkX11*(=tj4XeCepPf_UzC1aP5D?u%CGIGI58s zLx$~~l}n_vXJ#jALmJRpuW zvX#5xAzL9hnrJExg)|aOvBeVj&UfJn;}%-*6Km9Z)WlzeaIb3D^e40Mo7AV9V0WUP zuSoMQxmrbduiO>WOUEqZFnq}6fH&?6^Q#@n4j5!k2for!dd9Sa`8WPnB%10smHT&J z%C=DV6iy)QzZ>+f3UWSe3OYXRQa$e+&TR+#1^o_}>iO%$P7fd~j*7Fd!a35_U0b%4 znIAl-^sJ>=GHdtjL3*d%Od#ZJWc<(19K#5<(E_56^&q>&%L<~BM}KPG#`&>?RnyX#BfrIDthxcW_*jgi&VXNVy3P#31e?L88l}4 zyOwMh!`aL?F0us&v&D-uwTHv5o8vRKi^s3C{SH;pch1`5Av0)BoA4tolW|mj=nOj= zGog`s7e6JHF#(>&eCzY#(sgkj?tl*usfDAv%M;GFv=`ax1GGamhcNW7mJ5`=TY0d! zd}Xf%5o;H3Vty;R4Oit3Ot*3z=g%%D9G4+lf^kaYnj6e9E{NtEO&?1?K1I$M{1495 z1sqmX!REL7Z#n%S(CcSWyQ+>HZ429HdlJVu32fap=aw;<56AMCaq>Uj{U~qy+xmN^ zQ}$^u^pZlSg zVP{NttekUyr=4#R)PPa>%TlGB0JJSNLZr>y`li{uUUZt+Ky%_wi{n+Fga@O!7p%Kp z=2mrtlPW15#~tP1Lg}P@e+p>BRTS6bE~bKyEIueLR!S{4f@$=Vlx%m!jw`*9l|thi zD!Hkujka88leiV0UN041Vt`C$lhBYOu}F4FTA;aXAO<=~ud|KJa5K12(z*QW-j`8a zP#U?78xj0BQ?=f(V&D`n2y**YOVnl-g7R9M?)iG>B;_Z2D>JcFAz)AyoUMNNQ=R?D~~yDtOKJo1C9_tO@~Lm~b_dYzj{4y88Zp6{~v?ObBTSf-9C& zR=qXWN@iJfR*K0TVHE{;5KM@)J_J@(^{fW~3~6Uov$}f8_{>I@W#7!!uUz|aWTgE< z(zWLCH^EFu#rQfH6MdbJCNRY&*5j=k8EU{e&e92uLXA*+YQ^Wjwy8Ntjn7;7aUN53 zM#0eqW1_1npXa3Uw7q>B(Zm!tY-iY<<d@ZD#Cegdji7;TD6fNi1IBA9x) zvhINsR%KSc`oV2DGfP!Maj9LQ#^`4XsI?yDNZ&sy4WwbDXTe0Vsi9cxZJ*Vt!zF-B zExpa_-p(8Peoy%_O7t8&oGA-Yoh^vMI2CxEQ;g!0#FAOo*{XJncv~3!uLB;$Y~7IU8PEelIlH<4P^rPA z22{KBctfaYKe*SK>8ajw`xi(80}Aqe>zkE=BEqTmX(_7^P;ISGCw!5Lxk?a2A6TLy zKitQEhe(GM-)6i3|02Kd{5piaYr<&RF@SY3IT=T5vCt$HjdGy7?;uZu^-da8pR%P45u~TrE;-PzUaL4e1{=jGx_R4nf@@b^7S&^0YG^{QZH_Iazirx} z9zAu@^P~D-%?JcaykStVO1Z$1qDoM(%wj-FjYHRJrIY!m=MPT`O#)5V59kAsYjw_^ zF5;v|!tN|=AX8u@Gw;CreivY)?!CpjRfQNa`n!!2l4d;shS<&pQbVSGdJU8;XQjRoVn?C>6H#MRARP`=?|y#f*?H@6D)4 zRtUoyteipo8?@}LI=08>w20W#HfbS|d%x)r@kT?`n-ox{(|W9^LIaz8F{=|S z)oDzhQLk}f$~?Z1So{HK#pP+nA!x>K1F`Ke_(Ql&rKmW5j_RM<{X8sKXt6)kCt#krlnCPL zZ!@C_O{X0V>4r2H@KjIoxw-0auw8_3pA4?7Z^0s#Nj?zT0&o1mK|R6eCb-SfYysY3 z(zmc|>%~jR>1h5-vQ0NPT1&N%)VA~&i=UKQOxo0V$DQX=krB4nY#pT3X--4+S;;bI z1MZkep~-@7&kxm3_QaQ%%d~RIfC)r$6$-8f5YoA1#o66vxjg26GON{Qr7}rX+xrEB zrV8MxBu6G}pzx4f&#!D4+h)2my`#M1r1@fEeyBm*n1Y}%Gmim$c*$<}VqV}*<^rGj zYK)~!{p5m0M|4%WJmyoL(cJ`9ff4(x#xpWs!bAg2nSgae=U7l*2Kz_%oj9r~RCNEm z!fbA{s)N8PJp5jGtzsA-Gu&<}bG7)CWURnYp;8H3dEst>U5@m|=|q4EeCsx zY$y7*Xu9s^R+vG)HO*G@e;BmOQmBKaY@8&wz~X1-PBLJeRX^-kx03TZ14fkMpVbR| z^Ze=7SWz&FyqQDw*(_MyRgUjiQ=v7EOzaY%bx~dw(0~dlgP9lOKtXtk^eVGCOSANu zU<+Ip`^3A&fiXwkczEwwa>QBcD3RSLBLytGm_UgWljWNQsSP=E>J)3zFzwv(^*=VE zg`fZLf;z-}f!DW#S9CTT9Qjxa_hO~?9xesY6>71^%aCePH2HqfS4YT=QCg?!?Aeor zyr@ZfqVF>i>7BG@EoU7DRy!9SjWdmB7q6-=YJMFFO{B?m_8}Y^h(@O`&H_Tws)Ip+ z%za`bLI2!PJ>N>}A9f;F^QC;lHwBGJtN>c7oapMqi$wxuj>em1%j|{3jJ9jdVIZZr znt=sn;&y0~@4MO(qX<%coiikvxoD=-{i}Q1{e2--4hoC$$Uq(O2<~`5LXkor3|PgG zTi~4_s`FU#`m8aB&inr2!0zr%#3vz%^Y8G($MT4~gyc{YkTCsS0%B8X6Ngd8T)Cp< zpv9R8n}-fucs4%thV0oTOllFLT7rfaDk-t*^z0R-TA)ft*8rwLR6^+e+`M4UxxY^F zDj)6=e6yddzjaQ0H{KSyCu9fA7Jsz>`!h@j^iIKB2lOs~7dXdz;D^6GKcZ_r@i8&I z$p&N8itG-$;xeA_x98VybKqjIsCB|6nwITt3*{9-)|4HRza!ie-7=wWeapiWMu0e# z(!#LebGCnZ^kG*IPo+b&7|&SbWCUs!6dkJ|Ia%_{Ivt0c*KP4rlq zc&B}6U@>DjZXAjsTko2cXuQoS{B6jx%vdaQ!HE#}HuUNME(?u+0m#=$DP$-c+8&K%81(KYh)5&OLHqAW1YK-WLYt6beAq?}QxWmR zH*qxoh_b4_FMm4#bu+||ps4lVOdIK{BnjnVLD z!NWmM)ad755p(IljkQ}PIn#FeprzY9YIw%3O3LnG%Z0Ya^Pa{PRF^VM<&AndjDbgCg8~DT>0_0r*zCseIEcfLy*h20YxIz}xt6|F0 zMjNw&T4tctb&xGgs_U>vD00A$@VWr5zBf-DzA1C1R5kBt@5;h=_3ftKLsZ1j2Hge( zHwOjs;xzG;21&@7{8}|X*AF7H9z^X#tX!)p-F>z{;>rd-IlV#iq`R#eu~s&_*${{0 zy`(PA!fZ<9l*Yiu@Ai5kMZ0@Ei0K~Up8MRfMDX+FL11#&(J0A1qn!^;?8<8|? zbI2*Yhx%AwiMFN!v-Kk8_XNEmJmeHdC2vaSl_*6Jc4_>{SrO&!MbyDxr{xYmL+oT? zOk9dq<*e8|sdeK5<_jxGBL)&dJPc0@R5`x20w5oW&CIVjk7kJov-}(sG;0Q2#0H!3 z^}yg`+04KYf$X1#-E`8@HtSj?I5o)FhayvQ!zrV_z$F}Yc!B`y-l3d)1>{M3Mpq?S zZ7~DjRHt@lrO9hm0qUds@riCnV26NSuFaI*6IYi9-%ne81_asYOI8e|R$BP}ik7^lOIPNw_z%(Z8kRQpOi8ZphmbNA^e6`R&t!y>#*!lS5L z%nBW-rhcBs1H%Q{3ktD@i1D5BW`|Wj_v_%U93KlVb>3Ez*5IaC-+ZlKfMr%%FxI+7 zP3xvS`0SaE%~Ss=AE=k;ng|A=OAVGOJ7YvgJb#4UCRnRvg>M4kV#>hfuPJvdSZdv5 z`O7%8w*G7NyRgUf0&f1tIBXp?mB}<{XuEw82loFV4)!_e6=+A)Oka=si#Ry`mpHWk zmpJI(T03mq_hZP^o@NxQEOTj>4R35K@-1^sby{2PgMr6~F}lH&Z!d(bOA0IUT#!yu zI^Ma}qsX$0N+O@G-yJ{mxV$+99mv`&MA5R#&>#VLi&j-<)-mMJ@sKd&3FhHB6zFug6mt0RFkgFO zSS7iu%CdV4!@c2>2ffQ~(?;%-@GFve@u{aewtlE>@{u9ZcpZPE@PU9KQ#HTNy1fgBl{%l z<;5G_ggT0RE}LU*WAcKJ(d1Cnd(v>&Tyq7N!_ee_i2_EF2q~3dreh`&3;TJ3GS!HN zJ_!NROt}Mw<6?2JMDgrZR<-F4Mt@xlGz2}!Oe=UD5k8h2GKBk?speMi?$}uSi}rDy z<7pYPsuRsIp(` z4Y=dMSiCIKQkEJlbS6w!uiTsS^wiwX-fE^XzEl$N1YR`OKHS2sZ{C*$Bpvwj9F>k; zRM+yhBV>DxWOslbEgb}V`yy^3Gh1w|a+n^eU^yMS?7uFC{A3AU=80A=hSt`8V>p#@rlhIDD$NQ6l%{<+ zj$(G>5Y9NfRbDd851%zX;`4cgjeCoB26 zMf+)yI^=WMA#M?2hmar~c}te-_PY5{DV0i5Z9wO|ueTP`QOCWn-#v9$<*5dm z8t2H4Vq!csE#f6{fcO1B7B+l#LdB8H!)_;^u_kmGMs??c9{Fv<@fudH+h8PfU;lBe zU&_xg&C1(&TQf&^4f;4dTotOg{k1TC?Ks1D3YTN)<>agdC%{RK`?^ER7~rJJ-DXPn z4@9`7sg6$PQm&!c3zZAQ5Gl;RY_!XE?E;^zhh-kf8{)2HF2jAGomM;Be-cPA6C5=t z=L_oekJnRSRx;CTLy6z5wae^T4Dr5Oj~|&c_xmFw2YU#_u+`|weua+J#*!qK7EzZ< zvjD@Ql;cO}5fKp9=qOGk&~LRQ?0!VT`G@28<$jr@w&9&OxK z9Cd>0Q5xD$YG%^#ZNHGp{^A!>0V$6{i4nbhA(f+H|NlWM9v8|CmW#LPydiVy^VJ{T z%3`{+KT&HJM|$#|aM#0;*vqsSG0NXUkITz|4F{XT78iDDy9|Ac_r8O!&1th9%@nUt zPDKdkZ6mYA#gp~(lVj&EW3$$c-WeVEFa4Y1nLd56)m^OG497G(;k}n*ft!oyodH5E zr+F|W{~M`{*Zps#f~EI=A{DLR#Q%j`!L+{-DChl;Fw_EnlTP<(#3 zEh6{mitMF)3ZnjosVX57@S=4z*=;!OiKC%UlxWwI`gWTgUmC~uY0Dk}7tB(|Unnm` zSC=XXZ4AKNQ7%w8R&)a-(k{#7`)_lL(jT#dAynrx`(h>uae#y3DT%gVxKJid9DYU3 z&|?z4NZ<_B5)BBTk(Ooy$F!>RnJnoHo(v(~Zkt$1CJL7Nk!N>xS+4u;n$=|9=y@g# z(P8^o9q3(^V3Y2gX_Q6goCSyAO1w4ke2KQ7G!(bBYyM5#8o-xo2ZQvx|FVKnI(V7K z(BD2n8aqk{+dOnj&cZ%WWi-5}ooKRM|BWUskLUm-zlKX$_@qaV@^-JRminNLPE=H? z8ItqSp1a+iDj{Tva}H*iLr{8o;F)Ll{>_D0;3Vx9Bcit4@`Cet$zlCyGAR-LwERJS zU65Zmkh|RYfD#Oeesira&Pb?>5cZ1)ck^p9HCRvo@+_G0GFNxzz8zTz{|9S#8Po>5 zE_$Ef6f5pl+}+)ayL)kWhoHr!xVt+PcPmod-QC^wrO#S>**<&TGqcZ3$mAPel6xk1 z{=e%|zqJ9Of7RdH1!;ZCX~!$;w{m);%|@XHa{R(tb*3ay4>UuQ%KNzdnKElJay7qU zbh+_-C_;GtwVBB_7JBO2!_w(DJ>RRf)a%q~gl?3R)u({&CU_z)5id&Ax(F1IX~*&C zC*WNg@?!S53eQOK*;pIW7VmOiBbulMq2B-fMp3kd*5EXN+IAn;JHjLNEqHWCm3;D( zP932eJ|ygqgv#_3C(>&+$$gc#i-1%21Z+>kAg?xt#%AYO3Hx#exl%I2O~pPV8tpAc zEZB&ccRzW@Y*2b5HqK$xvGYguQ>8&H++43pRwSWadUDJ538Mh5f$c{{i zn-J=-Tf2+f2!>W#VJS?gyJrom;+i5f=bV9HSC@fc{S!^vJT!mJ0oG%GCM5fDapKJ0 z4zY_2DXFPTERk3a3&IrjhwF!!Hb`^!3+H+&}5f@GS0MVO>U2tmRn0QaJ+Oj-@18Gzo|3_ ze;m*FTgU|Wc6GX7Ij`XSJUh#7ZVZJ^ez%WFxxSUoS7-_RaW6~BagDyJAQliG)?x@8 zT#fsk>D~>L4j+-igIBPA9!1%c7eHPG6@fkmYPPX{TyNrPY&m*`NP8v@@c{l?_&Du_ zK&cLDHtj9=&mRrjE5C^}oCf6G=I03yp{#5fm&4@wbqVwB3l zdEp9(=xj(AGg*^;9KvVc>=?pa!j01H9~&|`GCwadeqU9Xwp_G2ua+w14_BhkAU8Pb z(?vFtKz>+D-{&h4uvWJ)4-3fhxE#35(UB)s3Q{Siul7}nv1t|~LpR}co%(!?S=;r*;2Z6|u%KZv(ri6}y#D2nz~O<02uRW2TMeo7(S(-47bmlZWMP1A)wA8@7|A8ng8r$) ztBJ95h=m7I`fm3&277dII6b|;c(lLk^15r@sL4Mh*9W5OWf}(4^!$_l^s=C0)Huv7 z$NLpyNiys92G(BP6>FNV{AbGF%9gIZ|TM@Iry#qJo%s)zDT^tG+|} zzZR228Y^mjEkHf}Y4u#>(srG0lk_m6qlfAFq6QIc0^i<%qa|~UXnG|?YsEwY+g-!QYfl|A9f3!5u!o33u;&b^*x+Q2q(6^rtQOkHr61SJ=}$P%nZRs zn;S8`Q6{duOb?{I2rdev+3#*D8qObIvr4y-tID~W8mxu7(Z)3>jh3qTB$Q(9`D0Wu zWE!4Qaj;ywsE!fTjn}%rFW#5bbd#>rv;k{inJ(*fM?A#vi>s|tFEj>$G@2In&8cER zz9N*7h8{4pu-i1e)%*grd`y5g)F92tVw@m%L%YH_Cfkxeh%0Qqr6JSqw*HQ(C`elI zGH4XUz7CrYq{EE~Qzuy4G@;uoro~(dd(L{N;>KdjscDexMsepXoDx5>CFBi{2*1gL z19Ff&Y5?Fz=~k{JyT)va_Z@YD=n`%O%znN%hwbXH2B&$F?a~WSmoWt4VfiX&s&9aK ziUAW2*_X$7cnF^|Zr%$bV-ObbxyB+4j7~+`zKay7gxgi0+4rfuQQ*0vis94%_vwT1 zJb~%6Lx5JNK?1PPHqXc6p(pJ0d|V5~LD1&MJ_rvg%pbyIkRjIp``-u;6W}D;>%S2m zw7I_s59Z9@2#+Sj|4evv^#4wHN-+K>!easH8xhY6^BJKfMv3Jiq=-q@F-syGtengO zgby3BxIsI)8sMfb-&HsOVPl5c3WMt#Ep`}+YZXBroog^X@xa2wTVsg-1V`@T+p~i} zWHP&h@Npl!;wQyJ?h5j3-P-|9qe&L6YW@)!_k-LaecYVwJYpmM?OAc1Qb@8J+vvPqo>7xaUmH$6`|VCmJLV&G*1UGE@DlxyRZ3c%*%MIx zp~16v7K5M3BE53!XEk#pX^aaRm&wnsfs;J8aTuDT6rbQvQQ%c8`*z3=bYX_d;oLRC zYm~Uc4dk&%tyx}%V1F3gHnZ|ZGF8Hj^8J8RrMpABODOu`spbLD-9xWtZuTw0Vw9$j zTRa-LpkeQtZ=78@=X6Ex!qQW#bMHoo{WO-Do$Zk#e& z>bgZeMBDef&Rwu9_*P6pw!udmw58DSRr$Meg05{Mpmf;p8m2=BBr`;^6ZFm}gUvzW zU9gJ<8JOB#tZ_ahk#7)`GT0Y!gN|W&Y=~s{1vV~1oyhRp^=f13`0fff9&d>?gR+CN zk=Z!wcEt!pg*xJaZmd&+kaIz9L?JPAK|>Cp%=BekL7W9@O0OKR`3B%Y+L0I;ZHXlT z(hu2uwF*ZM_>yVad4jce;a0x3CwBWlDx!^zK9}?~D?4JHIdR&29nzCrL%vFgDl&S> z-y%h#H?PJ>vwvex^1fre0tp@*R^-AJz^5krhXYzW|KB(u+U5U^1CqoarL{tZPqamf z?2gi*F%|s1P2%ikDM^kP!hhF1I5I-L(Zor#Q4}g*6O8{z6sHs)W#EdN0W(eop`2HV zOJ&kirZipc7|(KMPBNQ2D#boLgl+n*KjPOM*-B>(nX#8iM zRNMH^>5HE{z8SZGk!2NZ?)l28rY&ie7G+=|mClxTVQG+B>lQIQfrR=ZmhN4F-O6Kn zQc`bOzAw)#MY4OGYg~yW4?e==5>E%$TF7+hZt8!LA>x?7k)hRpAw%E)kRii=kfFvh z@dgKAYH_GSuAs!Lmv|ha%`d2B2!3~S%5(A{hsl%3WjO{B<){}CFM&x~K5O$HNMRK( zH-)R+<3e3b$xxtH{LZQo*C@_N?{MUS^V$8w`{`DYnkmAA^ML?jh5tnJkMEzGEzG`4 zp$SuKV+X5_>a)gATv(|Eg?bq0JS>uR)#7$D?>*+S*h)#EwDStnOI&*`$e*VyGC`uO zB9e@dDWz3s+Jiha5DC0BgjxeQP~_`BeA6s>~tzdZT7z-BiJ|Q=iDTINnyLNg=C#F zGP~pq*b;VC{Q^11qj5inqpHoEKILa?Jyb^B;Z{hUl3Crh#q#Mgi60EhlnuV}63jr# zSo`AkCfJ5A$GJKf395FL*Oh=vDUex5A~U3L^@ZXJos>F*G%430fF!M`LxH%lHBYwbMc{)?EmAJ`?Rf6(?@_rE zM|t9yD}VjIEI~%*g@$|}d8bHRr`S+^=0484S~^*U%wVG=;7*-8_((;&QPJc}wH(se zHZ-HZ3GdmyyVz~H;BtfQIupP2QXD?|n-_VnfTA5);V{q7Hn{R)Li#1%7?^G+FHqSt zg78iy%uPkK9rz=tlMbxZt=E8Z_%r8bEy$WTg#LLeNFz(qNOy7CDG|FEI>mj5udBgN z+npDjrkwDV0P;5HnB0O~!cJ4ZubWz7(t~VtaldFaDDE_R2x-QzAS?0>#FEY zy-%@g)RPw0P5I(iU3`xNIvv$Vgz{5Sb(=(*cBK&fNPI< z*Xn2F4=&Wb{D~AW0NL#8YFlowPHm}e>1|8e2Hrn6k3uzrIv_niOt3B81k+^5_!Vpg zfg8ZSw6d`6997a86_n$P^HkQWAnSzv5Gi2eVWO*o1I>y!9*TfGvQ-|-ApnT2Zs&h3%7M7N=9RU-=2DhLSO(94FlUirov|VFIWA= zy#A6O=yt;qKiHZGmO#(ydTX>!;FYrQ5S#(7HyXih>4)ko6q=?Zf!t)dUO|Z{Wlz#8 zly)1s6mU%#2w+jczkIcZ;Merc;5fMOp=_KkuuZut~1&=90y#k7Q zOuKlmg;Fosdd#{i8aQ3D+6|8yw+&b~5`p`htVvu1>|x2B@ol6#f0&87t6EztnRmaM zP}z|V$2KhL*duc8v113Q_gE7B_+w8&dq>@T(%sY4`JV^!ykiH*_}zdU6%e_mPLAgk zS!}-bwQ+Z+D2ps--0{a~?M~M#tg(7BzCGgE{R-(yIb~(@>wpP+Mi{6!xugoh=!Zcx zA!yTJBcJ*e&CLI)%_>vW0Ne2Nc%S~b&!z>rbCGANaThB3VZ+ZJDxjfJ<9v=s3vXlj zs_Rx0TdU^2UEeJSv9iBSI3sD zG|$?RupT@|I>c<$3NE>b?rN*z7qoM>$BUVsv#?ltO~YRcfj`||o@Kvca}yn^e#N%C z8_v(?CZgifpjsx7uye`*>@%r;i93+JzkBv{f|DDsKf3aq9w5 zYwi4DsO{OgSqr)ZLrAW03t}y=2`d`?tFCn7Lklojw%~?8bHauz@RAoBY&&UalxW+0 zzBwYIs7M}DoN7=UE_6_PzS=v2T=nX1k=-mb4NWf+1ZN#UH2Gi<^u7Nl2I?+l8kU~I zBf@O|XF22c4~r6Tu*Fvw(EQNdXtHDCpx6eWB|Xz2=qr?f1eqZmh13JV2B>dlFm_ zialB~;#<|o^2lXERF%=p)|$fIvRobq+@4^vs5vT`BYmo;`DYS)WQMUV z;5DUZr$Kt_=Py@T;7EhtereV`-=d2}T!+=z0?;T!TXlGUV%+;ls-e;Bla&8Jg(w?} zugxDHe%8OT{upBR3W2llV|WscmD~UMwi`wPC1hx!96Pu0bAtVl1@Vp+?^$Bn=@pP& zMe>N83d@%sse-ktNMr?!5;UrGIKV;s(T%-a2q(8Dcwx;Jl_< zcQ45}v~2h#@IYnwX}xTmNd5;{TjTw4wiUA|V>?3!Y3cprZ!;6!PMYzrB@b z`ys5My>u+)>1|#`|62LyVUIrq+F>307h$q&eOM~*k!1s{13s-IgL|m#{71a9i&H5L z%U#*FWD(HlmtRo&m369&3B%>M%qkDI#|9lyNV5XA5k>LydI6rhfIV$3J8`7X)6I>0 z!;^cnj*t6N#mBHTj5Ye2alLOoTcns(6j1c{ESz#?2@IT689`P{6=Q|g8syVm9Xn_Z zCPF`4`9AaT4mZ;m!xP;dClaQ*b^$%`*Fc%s@6c>(T(@ZXD*CGTk`}IaIzAUCbMG-1 z3DDi8H>TSWl{h_mMEf>E!4y|IqP;%EIlhvQE93;79>{M;1t~fbIM;A4H9SXr48XTu z-p{kPg_^DZdFn~Ng1826#th0R!5nQ8CpDT5y60(oM1=@dqjrx$2I3SdLzDC=m;el?(Y_O;g?DD ztwo~_ElR^+nyTH=wadVQw6p3Ea83ZTR9^R#Kd=@a` zZ`iP{Dk+?G$ew85wQQ4_Kai^{)a1`luk6?2pJifQ>(4Yrx{3=+67kC4BntJWJdxBt zKXl3Dc~J`X-m;U!*^_wXFIXqPalHqgt-R{Awi~*-9`DJXo==@2jQXseBqhBc{nVRz zcWJlHe4jhCRo0{Jyn346A`kZY-MRDbvqtmwmUNqRyN96{#6=vDzedbL3aR-1bk@3m zdt`9sT;q|x=5_BAkyXx)cm>scL(r=C=J+T?;0_%!RIR!>?fvM_ouK0*LNlVoEZYd% zY;SiWF-38=H4?rLb7zjgq-Q(Y_Hhgkl34#2YpPZIKd`2Pntx$Uy$*&1vi}Fx6j0LG z_D|OIQ}w^ICc1a(2cNgj_h-GVq_hf(X$ee^xZS%}+qB)+Fun)p+k3sv--8EPdfsgw zs06@9v_8Aew2&hOl^5rlaCyJ?ngwfB3yokNCMB;2{tntRwbu5>!y|q*y`(C>hvTbZ z8-<6P&QNykx3&ee&S!oMy-sgNK6IgyD(v0nCrhBt+cW>1+;T6}<}dm3o>dipB+%EY z1D`a0c{PO2yyJIdh^w2Xr?xdO(a;}rVbL8lcgIDmH`7O#2BM}&&+I6#tQv`09+5H^ z^DkpUak{TG9PiAXJEohDSrDZB;bZSKJZ&pUx38ePzG8O7rGiJzi$C7A-&8I`%M-Ni z-(T=v=ghE*RTP+is#b5~%1Db6&k^Ll4xL-$&-xI|%o_zH5R@iT{ZeI3KWCDP*0xpk z(c|q%`Wa3T3M(Xgdv0raX}$g;o;`}~oo{$K?hx+mPOr&A<5M!v!8`mqI(z%N`LxFH zd7SFD6kTg*AYoOS&QN*2%%%{OX`E>Fgw3b+MT=;4_rg7A_3f&iDg5v-Pc$(&f$AU-H%F(pZC8d|MeOb!b+{*q zIIpNaYG!;(A{vWIWZIv4I3Tn^oC?X!@j@_SSpSAGnDr=5ze%8*`@q~b;zX56HqWvm z4SXN0jj7cq+0THr^x#@#aJO^o_t7ehYfD*=-}k82&xhfn{&j0~ zrUM0_GE6`o9jsRjbo01VBOr@@Fi*xxkl}wL9yyV#o)kx;k~*C@9{$*Ne>I@T5;i}h zYfU=S>Hn=8H*iub$!*}9c4~L|Ao|cqIspzryQDuF*wceUdj$;Q**79n1@~5F?g2cT zBB7DynFJL=Dc8=I>r3*iq`v#vz7w_fTVM)C*4o}qQ+f1H$So{&^^SbJ+VG?ck)?o5 z;tu%{wvMsP!N%7Xj~pfsIr#l{M%b-`X3?Zqm4<`cS4ZU36S#GruA?})e8r=h|)|VdqBw!wwXhE99W5#f>%nYi^bZIgbX_|(-Gs(#B zHplwvrp?{fz{E}wW6hemZTf|qnwQH`iKN7dL%{>;&2Z3RNFSfNYHjZp`sbURn^wf< zd24m8$PFtLU=G0ickAkTStU=K{9=z3c;d**7@2k`LMv+5F66TlbBZB4_@W3Xt zD`g*V-6>r&1HUE(odEyVgJ57h;%m)IPQ^)x2OLS6qv@+Z=`qwU?3k3a^lsel9+ZPO z&5?NgQAaRFKH5n^g5s@zPLfK8{_m-SF!J!$1B@36y^8@pU3tF3Hbvd_lr^E3K+6Fa zgZsB9cMR7Di{ds4PI+BHMqHFCHw zcI2KrjXcj>W;jE!4&3SOOAs11w2+NAk?5ObJ!-MxkBL*Ql=5w%`~@RY5E9&Dqs$ZW z)YHR0`~(5gjciV zPS(FK{^fvZ@m1GH?p4a`5}}H@)W&+2m(rl#$=wI|tvBHhCAvDGd--pa$V7>^X0ta% zl6TqYP|Gxp_75c@GGp$pbrsy#7)Ii(PqX--L>Ux+qeK;Ve<%@a>eE={9x}POV`#18 zzf+>JKa?or=O0QGFUM*6hZ33p2PNu2On%R8pfBb;MzN4x{xp$`0#a0DnVzxequXJ^ zXY~3UkZ24tCTCSrKa}Iwmc)sCyTj{!E0O?idbA_t-S)Cdmq7@w*(7h0lu-w~)zo44 zu2sE<*Zife_u+rw?l7@(rDAz_JY1lx#fA>F@&gAhOcn+Kddb>z+?<};#_3=bf zEi~_nV!Vd{60?~EUk~OaOM1n2bqmz5NwK9|mzK$h0?x6C#&JVUJEt#o3TiMkb1)J* zdIiT4RIrOx2Hym{?YS9PyEN^ob>I=qca{nV9^BPyD}BpDH~d#?jyvIfSt4bSiaU3< za-FXu*FYg=gLg{Ta#P7Z4SK*@rc&A+;)suqqUkHz#<1umv4lRw4oikuq%zv2Jm94; zcja=$XAblyUutVNZ=wH&xP>v2>BGPWwOd>Ue4R7%HE~!>tqX62HGfg1=;B)!nYH%t z!vg}&zq z%!k?O;ez@}RtvdbqWw3sQ?hZ@*B$Bd&EhtZVu5H)dd_E0$IQa7{QdF!9y$vR7Ll=K zEv(yor`NEF%+(cpp5#ay>?otzod;f;aaRi$_g4x0YgJb&5ImCp*_R^hXQNb!p)>!L z`nZIf(krm%5`1{_G9_TDQ7P7(A)aCa=$19XuVgMl&#QzmGY3C2<07!ozU^6U$76 zVZnGUZzb$fJ9Gpon4BZ+Gxxb>_zxP`hOsBji#23PV{~lIUWGLhaT)_;GA4u=S?l_2 z4hp`I%yBZoiB|G@DyR$6VbMDwe5yS4C(ke$V5YD)`vziuMvUks ztMKi0-wLCDP}jata9KgRT=@nq-CI^yMySFF#&^$o2#!fqFn<~A=K7ku9{0&L#C2Np zGrP_Oj33mD|3mf8^^PF+{zfIlO(wjSsUz*zRJ!NDKLW-<{lWdJF6JKsW^+l7#|h3a zD{t}n$VAnnUvZi-pu>DIhu>MgUe`ri32!MPCwIy*t5W}hLN8s?d(d@Mr9iL-1?CK*6Iae)3o?l%%$E=`&_Y$5c{IxYzJ6I{8vJ>8Dwm!P1qUx;e zYC2+=+F3KFuoQ|MM;$S{<64E_Xyve0!O)zpECwrT;(G zV)^+)wdiHCEN06ZdLL;BX|+Tujg$OQEgo}!sTSS7nOXpue#tB(yj2>PM{75|C@Dl- z5t(E3U{qLXhut%^eDdA|p~Z@{$}Ls%p*0ii&x!FZ3fMNnyF8MiT!u*Q)%E^B^nO;I zyn@B423Pob6Z4(Y@v88oLoYH6hQg1@#TwYpADve&%@!d{+|2mT-H)~MSu^S&OVY^A zTk@@iYY~#~|4~VdVTr6Rd+4e5|TD`Z})m>b@uQ;ppH!mSjRA>8PPJccnIxx@( zi|rA^gif4~#m7WzG#0+GEtgS`VX6(U1FHOj{u9f5+O2XbrAsJ^1zxd$`B`>Dsf$k74K_HxLjqIKjpU){Hyd~3%;#f#?$3@wS zG!mN)M4z|eOFl+ewbsAQF2$S=LvBUtyMCS(RU4A}Rjc&{(_;v7S$R2~QT9lMGJA{l zE;p^64kA}B3e=YT&NV@5I;gCuyaI@fToz*NmQa>ey0*S`R3s+(%cI4NXu_p?tl~5a z?gU~*fLxG$LSh5{0;a=H7tAhuo-o}jU=7q>@omlDK6~9a9Vp}@$e9hF# zUHSZRe7S(jHUuAC=`+~Z)#P%bKqOA1V?_Jd>W)}=zBw;*(`aHsx(Cx&*iL-oS5bj0 zYjDl}YzoV%8r}N4^wqPjLoiK^!Eg`0$jvX2*Ll0W`ID=8n_N<;S+-MJK1;~@*;*QF zpZX*>fvou(A%0>|2NbdoUB5^U2D!uzsbD83n1_}d@#M(x7y8>+nvehvm^_xyzTV|k zEEAn9E!s6L{N?J4!~BHNr~Vg^edXbE!b<^y)zb5L;Mxgl;*=VqiN+5x1Bx}yTM?Pz z2$5xvw=af=8J(_Dr&@wk_Ul?2jCuzvq4ZmfdPXrGwIgYsz$2JQjMC4Zy79(>dyOg( zTx6c@TFdw&rK_q%rJ}nspAhbkt@q`1S|Q$W#$E=a_k|R^mq&vksia;OV%J6EP@tQPmk=`|37%X~_~?T35YcO)*1*+kzh$pzEV8`P@yDv#O4v zG!-bXo6aYz>gx!oS5zN(ase@O;fX{aTWfcfQDEX!&DlLz=C;H4|BT}3QZYx8ggjLN z3I~ax-9b@lt6MWwrlBp~vAt2+tdQ%ssu-$gHht{xJF9rn5vYwv(>DFS)e%aGQOX-67pwKHyJ>V1zJL#l^ z?{U~1i-L7MKwAC#A=|3pm-i^W{$!|VR}K7P(ikLvzONRosI78+lVP7Udk60X&VCtTD>PxK=h-MkjLwQulo>`^pPK!C z1K8~rypQ1foJ+Nrlav#@H8J30oyJU+wKj;AQC0oNlpPGd0?*EQh@5xm8v+9i!=N>0 z(d=z2qywUvdG9&swi3GBVH)HEy1O+sw$QUxZ?RAt>RL&IkL?!&PN^E8tFxc88&COr z!CQXE`i?QlWOrVjFm8jlP|IbwA4y-XTM60wN~4a;$E*x#>uBc!@`=ER>INwp(PZRmoSE0F9OO*>zvHbWWSfxM)6RYx#Bi zN`kZ~flrh$`DP9`@~a6>>pZ$R7O@}qeC%3A59Y+5t_eN2;z|sSj6$OTdlt$#mYUC? z#yqtIK%H1tqPRXSJd7oPI?;1rs&fi7egfrELuL?gzhB1+uo+I%x<^R%+;Jyg{l?$G z)G{xBq$(#1d#1~KyI0SU^Sa_qe@+)Hyvm=;a1fiqsm2Y00gr4~3??5s$8pNwZaL*X zHJhLH1)%)J+vdBv==~71hr(9|FL7mCGrqDXcYlQSGmzwmVEu4{w!Iv0(*kw4&A2;~w`>&xJZ5XUYMUS3Ku{jolMl1L#w;vdl_CuLmQ@V6?#8m$2w()!65U~utB zH&s9MKNo-}9*sv4Lp)XStF5wLhy_JA2h48yPPM>I`*Uz;l0bo(!m5WzoA=XIVXWyV znRXL^^|ll0=jQ8Uib4cXQdg^I-Mz3dNPD-OA^Eejg^a#7CX&<78aJVfO(!CjSq+9> z*#>ENC{c~uDgBVCcHXiD#n6QPk;@l*U9oQEgriq^7{y-m;a3=WqeNryTE{o?kyG zSA73WyXT@0GMN>g!Ri_$fE`J{sDr;k^!q!q2aL60=@aCt9WZ}7Fu3Z{Uq2;dzc)y} z8E*Z`56>DzdC%kC)&Tz;YUE2Y-1>=MLLuUb8i)Ba>ukNv79IhkJccJL-F-;>+#4GK zjF)eHqtZJ`d`5~;)vs(L(SrhBTO+ry?l_Er1tl4Q0$W?hUrGy%%3YcR;134@-$ya! z4CDxA$fEAxW)HI9!AZHD0xLOKTIcY4?DU2B@Zlu-d&7wo^2xWKV{|ynJ(;^IJ3vce zGIimr=i>lnYw#Nd1S4&@`fB`jjfNiy{a7aiCha>tZD^Di71v(`28cUp1r>q>I(&dDsgOB%$0e&_mFzZ(uWeOjzG!g)-dGBQm#|KO} zHlZRWcm3qAt^S|^z~CP=fZ3rmr~J^ohpaJkniN<@d%1}NNxNh}-MFWVeybx(# z%gHun$fAYI{#`$D4O=3!Q!%HlcOwoP{DB`-@LQg3fw*aIXr)Z@*KV-0Z^t)N5( zgp>PPWqCt6>La0O#PgFV#O{T9O)+Zl`Y6je2;(nXnb8JZ!QPP@+%Z zHJFx@)tJ(t&s=cDst*WMemdb$<@dh6Sse_xMxf76v50KeIBk>mb#U9wnO&K{2xgh* zt*3@3=)GX+cf9byC}f%&8so=V25TG2UR%d~D1|*Zrsr*=tpDTz(mJIzeTac)TCW#B z#y2OA)21Ni_U}VMTjqZAD!)lzu^W!fgK7eb(XVjg@`a?_*cFZ3e zpAF3o?+|FN1VA#tYF=pwmike+sI)+ozBNMA)$R_)v zwu{4H>Pcy!K9~1fe@)N9l2`-R6@#c2P~DpBUAO)DJ&SC5d1&-@^973eT+At9TIk`J zkZS042M*q*SB9`0{NH0W|`rt_m{U;j>M)`w$y6TdMGiXLRzn-Sax;f0oq1nizzQL}HwC(I>M3QQs{q_e@!2=n2CS6mj1s87&IXF^ zO}e3)#6<}L zr1cOqdz0_zOd1aa{$AD96dNFaxlVJvAVUh$?3RdOX>P{bd z1`SZZZ)bTy4bhx0riQA6N!QY?FPkKrxcb5ZPYs_beo{yPf*;0%-L7VqV6d}!F@a`$ zv!~mYryM_-rnROa(kl@lipQ9h3*uIMYX+*9gBB7K+$*e>{~PH$b87mRl_CaTa;~IT zcXt9pTqoiprVAuF8I$B^X-!;x)*Qgaq?;zq^v4!Ua z7Rt8`7fG(jdeM=A3CO9&amPaN9@P&^$ zmw6bcf%v@PK{AMW29-y7bShvdPmKeU4w)vkZUT+zRTdX|v=*4o<*Adp8GXtOzkuZ;8m+k5r#?NQ8=E0>X1V2>GH#c$XOOqB0IccGBf^R1UCPF3K> zszGh#eG8NseGJ7B{%_d8U5LTzr;^)x@W2CTH;%VtA3w3{krHn#Kb1{sQOMru$-UcS8?mX^#@vY|J+vc-GD@hKu^{Y^tXK z5ja;Ds640%=+eo_Hx~%00MM1`u1P3sku!iD%S>BXL=wx1^v7Zq#(pch?i}VdmNrci z{dp=su&4g#2uXN)@9n>;_O+r zgS?T3J#*o;Wrfy`Wy$7}qn%U(D=|kq2-4Y&yruXwKHr35f9(g#zQ1F_^|XjgJ`%j- z(LT4N>Us!b11#`rYHC~#Za3HJ{gfQ@3zazV3t#pDdR9aHhG}saBE4jXSH>u;Fy*9e zcx+pmbdh_2yIV6-``9b~d#BFI#nA|$69F$mI0`|3_nW2LQQD-FUcENZ8vTMs{37Bp zmSS{yYD$EDaKdwfhk%XD(}WFgMa0-TAaF5X8D%a-tE&+nP^!a1>g1OT!~1L|gnHfA z2^!>`9i*pMY_LfFF-lv!GdsGwI9g^>L+76be06|^aF^Ws-(vUESUpdcT5h6R=6ygX zGFY4Iz;^p__Q(&J#`lGjLM4SC=OX5k^VZRwyUDmXt3&}VT+aR15YBg29^nGVP?sJ& zyH3Q>klMcs0BTp}Ae{BF@z`<(&15saU=pksZNWAUk*vuY zj!pzV#-s+s-@1>1&n_5C3K zZ^HJVcw^!J3fq?{{|ehlLjM`Ir*izi3frey{t>p5-Bl}Je1z>$68{X_$^Hu4eMtU< z?Kf2a8n$1ne1z>wZ69HK$@^bnJMe!D+wVXl_M{tsFd1}`XZOPo3)G+O;rn5~om!s! z=IWhM8@T&Cb1|>hUPSne;ODCF)AsHqtqlR&o90&pAJ=Cl(3fG1CKN8vv%qNIRw9y( zpf~?UG)d4Xcn84wntE@C+T6?gX}eZ5F=s59rm4vtX$`+ndpI4%&oA*nS2b6Y6XDxM zQ2_UWsEXkj06V~!Nl2rBD@L&{KLlo0`u)OtsdxOqsag9hcHJEAG5Boghu(o$-lQ1| zb8O*lN8^?*Xwcd`(l@oZb7mdk%zCg2?&}%PZzLW!)Fkmwb%RwaXmVw^AmCiVrGlOF>h$s7j6{(zY28)fR z0KoP~LEZ(mx(b4E1MBx#;m_jrFhVjuN9LxbGB}lQ5*E(9hoUeA6 z=-k4ZneZ;ofW5(52X`#y>f~-s!eGfP;yUuOdO%G9E$LRXp@})Y%P5VY^ zdg;kU<4wO-oS7sv*mAVhculVPPIFFleYPIHTJ5PD(V7PRp}D(3C@f+G6y{C)twrnB z;xR}EFQVIGAKkabHAzr0cH-x+p9snQ=b2xQWv#~ViewKK6HgyU<_W)uiN<#5MG#{b+Fdswk8qZz1GDyiZ^)~7O*Cr5k zL@W@WK4%su+$g-8^E=uIB9QkzkO+lIU)%>cqPgVXfjyT^imP?odP-{na9zM`0NkVv z86_O?3&$rhjS+z;moi)Liz+5t)`29hj(CM=Pq|53?i;W96fT>c@0mE#w6+%Cqfj3F zdO5phe#lFEgD>+{Vjy5Q@r;86flJ|tm6jiyWtw!d;eQCWSqZOzKqeA?ry z3oh(wJu=L#c=j7KmMeFv+@Q7#Nne||1)Op1`2mKaG^Uaq)*-^(7fskycIJM3{x!!< zgGDVU{nNZn+GvRZ-Rsjy5L-G>2d!MzHZ02rvX8YVIvU;8yun);o`vX!aiZPHs~!*c zG`^avCpzvAQCXkL2NWQ#cV;I(7IX}kEy)DG`gWxyoV4=3)A=w|IGSmi;xJW!Jq(e{ z4Y?`yH4t2%c0#qLb9hBMci@80gf(BvFxY>YkMg2-pc!av?~-EM#w0lDx37Z-vxSft z#zYFrEoCBiF&v1YKnc+q#|N*MM7I$mA#9Lntp^D{)~_mo^gRwPxH#kCO3-xU+pWGe@w?V>CCl;%_&;#v;v28?k> zGJ_YqvzPn4x@?fu@?Dd#w3E8HZ!AR9OE>iQ?+jZFhj9>=5!&l=Y(gT>p)}d#AHQ@u z=7_tN{lSYXP>^09em7ml?U&2@ou0^dIZ4OhABw`&%o$DoU6DOHJlb+!_@dHn8FTL@0>ew4d=Ya_hs$XeBv}Rhhzo> zC9aXCpKID4Dq|5&NG*zQr*|>ot!5e`LLLa3)dL z?j2i`iOq>^+qP}nx|2+7+qRR5lZiF4ZQikY@;vYP>a99o)$XeO$EvRCs$RQyuYLX2 zb^hXc^TE(`=p1{1K|HG=>>IGp@Uu&ew$FbQdNNhhCVqw8sngC*5p9jfW5WKbH-+KIY`m1S3L*M%_kMcQX>VWFy#^OoHXptfZ*{J3A(zru zr3a5Pc5Q=?(l%wqMp+j+Nb$SA3JjwY!<9KP!5BeV!V%d82#&VNBdCb_OVPH);!vVrJiLw|WF* z^v;pn+D#V+Xn_V>jFR96kI#8~n6O&1e4QdR%4=3rnO;@I}RQ=pW2e?#8;`o{tHWxBZq zzvZ7%C$X0|ODKN+G95ML-a`=3s#;Z}@#X&H_E<%km|eV8B>{Az$UM!nSbx}4>w0AU z_MlZa=&?Oozv-^5l#j0F2^=~K<RyRKCeZ9A+(fxEY zpKlF5ufCq%1ioHI1hg6}T*ja8?$}i%&zcH<=Y1YtGBiC*-`OdPW^1- zWz7s>Qp#ak^WMRry$E5SAMQ?v4UiOb3wV;L9|wtRks%eP1Vn&Je>TXd?(4E%IsZ1B z<6)AG=&X9cnh^4EhKa69L)#@Y<3xvddJ6d?MQlGL+~r5CuNLjOrJ~SO= zrp(l@=%hj!bud0J-DN`f=~|0KE_>=9b0?nCke)+Tw zhn^Dc!HZ=WSEDGd=+u<@hj+o1r@Uo|5>|T;aHaJsBtf9J;V%QTbIViT2%;CMEUA&V z?~BQrZ4z|u{ND3#0$lT@sa%47g2>3ANLRkrSl_9CssmdZ``2u$7PR-yUD8Jrizn+2 z62fV}dXwM@smfmtEAy#!c=RHQUQ4FrtQc!@+a$bC>=}Y1hJOq%6cF+E76X}$O8hu+ zY<}LUoT79w`D{$icO_B;$MNI$c2CgV8a|h#uaTEJbQk-cqvl9&t^4{k6 z-lq2?#Bn6%s3eF}d0c^>)wMqf2xPk)O?~G>YxbsS1&okyy)kO4ysA@wz}ZeLV2G=+ zR?yNPlJeby(NjomLml0teD6<_iii8zKl+}#td8%IRP*d~=z^`NOMVt&O@TFgLGj1} zHLYJC%o-!s9)~v4p0t%~;NEi=q8h3E19CM?T8~rA;yPQ_km?r}r22L!doMxA3v3C$ zfsw}S`}9a9Rhmdyx0b{pAu28UvR^6kpoWK+2BCAF-wJ*eNy$gHOXkUE3a^fTtm)Zk+(s_8$cqM&u zA^*48^?m1i9J?~bjfJ3AMxq*|OX}e`oO}%&da_UCsM)b4VgI5YG$%w(9bn}FMi*bTDBM8*be3@YYciUf~zXCKa6I>ur9Pkk^%UkT%RxfsZ~y#S9i z8Kn3bGokkJ-lw7X@E3H31`nir4t(ddG7mlo935)1dF!$Av4`a~i-4rgY{V3c)7UyIpa-XRz0=qgrN_hVYT;jQuL6r@TRR zlDLOdL@zbpz^xW{QAm%yDyGNW$a9t`h{%?Q^_{4v(z#p>V5+O`7KE!g0S9-h6qg>y zgkF3%lG>0tE5A;f-;))^?pM6rAo5}Vt)w=?0$+>`)l-<26zm4{K3#4IhB5eszqaD} zxj*!^d^8HWHmekeKGn*Np|5&>vh-El7c9t_^{S5D%IiDt`Nbe_aku3jCvWERs{Hfc z#)OrYceB$fCzWxN#?UeHj_*?T&&+pp@5p!5HUYUQ-&dIKfS=>U^BSChBt^bFh~xdE zVs`*4Z=sT_=joA)|4@p3I00>(3axI1E3q37EChhH?#uJ9JC$*-2i{fGmMrn9nz7fTKc2XCtX%)hNvnR z35Bz=X|+#dIewZbj>V__4+R|Oci6YMlaPK~So~)YQN+PUZX^MEx1KSw>g`$7RdWg8 zW|8dGmHIhZtd5(p6cybexG{a(NdAH%Dt(*WJ&#@|i7^6wGdD8CY?h@rV%(WTD|1^( zGxa-UfjX*@E#fa3y9YIEn%MOFFY1Yi1FvzipGEa{G&R``rm?odD(UGLPbg7m*rv@`3wk-505P~zT5ui9cSVUIagaQ2 z+3+qG<{bg8>am^SP18WCnj7W1PI57bc(5H+PS|2!I}k+`9dNM2v<3Aw%nEh7zH)lX zxb-QT3T)6-dwVG$jA~7ThJg&2?Alb4c9V1(r9!(cL|ySCL}fx4KbJ6TwCb?gi2B=M&+(@83QCGhK*a%Z#_%fCz`#I z9BW--%JfY_T}%#n^f6C;;ZacT9}G3FjUV8fHr8G`Ph7MSkD=sW)gT=%5;o<)K?e*Z z2%%{*GVjQLjske5B%lB-qU5v!osJK9jkI|fzssE{1Vm$a9tuCSx)yUr0T|3Sd(~5@ zZ#!k+w>2Ry)DTCfH@E#>f+AoZM|VzO2LGgA|E67_jn$L_(&7kVa47XQPDgw3#Zp|V z0nyqKk<12;Wr8)LZp;Q~%`a{9c5^B7(W$fhG|WsIl8fmFZL+zSN?MSe?#Y4Ll>#l) z_QCq+2$48V4nmp_Wj9D1^9b>B9aV&&?5tKX6)UR(w$(Iwb5C(fuKxMpn zLk@FMiGs3ZS|#3!veZzXC?Ao@RZea7(vB0ae~A%iwk{Us>~A*k1FBD?32|M>w7o2 zSh)oo^hv=*oqU?KLcGgl7x?q*a$egQH`U5DzC2%b6vAc0X;;)$y=Br!Ov7R+snex|D^`CdzTK=g3a%<1DRh z6vV4q6dhG@)cjl@j00i4BL|WDfE8593o0%uFc3nWn`r|f!~Glr_E-rjHi{TlR+qYx z->yIzL5D1sR5wV3!dYFUtS+D5i7Pjc#Wz=IWRga?Fb{F5MOB@#7kZp^#vV{qb;KP= z;QomRY1#dO_2i{;zPTJjW;7oUVa+@H`yt%Xm^!<|l-0Fd>Bm&IwcvO|>*)m5zGsOC z;-tuMBSs1O_e!Z|sI|X@D_h97o4k5|lp?jZ>cAxgPma;rV&M7+ve^M>{^O4C{BR1g z<~licdz*rOY1~#B^iV9J;JPLausV>tBr|Z{?IN>Y!XgaGR}q z_^T%v^`=39zPaU}I-)wk;wm%ar)IP{Mf`9>@o(PX>8CSa4bbb&j$0x3R=uMOrz+6O zjzaR(E`K-;R+TTJ-ETooD$u|qgCFKn3GV$v_#>(8CI{SuD&KqQBIlum zsJv5?5aNjvvfsb`bBq*zIk@=THAmpU6*-*r}-xAx86dV&=lql&f;vTb^ zXcMn8P=nv)gXUJ7pPQ1Z?~PeE<^`f9p%HMbyXkp8wYQMrk=35TpL%t*jTIk_Z<-df zwAmrn^F6bYVA6K|PCl-zemRLbIOgrblc|k73daRj^=dP{$I)xnqK>71LnpMbaNJX~ z^N(hfo-{G=>>5G9hOve6VR?fzGHONaYhHh|Q((kTj5t$$Do#YDiGPGb;J`A^Fnb`a z$<=eX$X&3;x>ZZUAqv-iuZ=bqdNRRJOlt^<_!V#tqv{RrEz8$``T zmi{J?2DM4Ad76THacJ$j8W|I#O`uM~0 z8Q&3;h23sTea)zS{Ern$Bv|ofa$dcA@z`pfha7RSs9b&_W7KlY5P~LdeHeo#A*FYE z{g+IQ_gbx+h9rh!zX>xn`-D6-w_X2M-m+3RnjF!f>`%R;prhZ=gaR!~7ST)qH0baT zoWHb2dJ-vMG41$X<2gcE!@0@j^Jc16AwhuhghJgYAwy5Slc^K!=~JJqZ?E^9 zgxlmAm+Y=)eu(t?u&E#JPOcjjh@#qKh;)i&ZUc)sA+4dp`Ks;3%py%1zyKs z_ou>#>=TVNU8pi!LrjDAR(8+y4}=>FUu|?H)n&ppDY^(akEm^RHs2=z;?Vdrkx59F zLrTz$&P$-1+!p}*9QQ_~9Ii`KNN$%cP<)>21qyE0JZEoZw3V&E;6Lz<_1&FOJxWLel&N`d+5uR5(I z#2u6=KM%r)GtqnW6Qa_GPmqgNkF5NAhn^kegqK?ZeYue@*)}giJ6eJBP8-402vvhw znh6#m>L^@2`_Q$RQ2aex)s~bVUgGnfw3YPJUKy*d-1FXUDLq7?h0oZc3MX@N@3NN< znG_s{>RTD2@+a-J_w;_OqT_-c2Q{CAWY)^a2^ z)~f~N2l|r14qEzXTnU?+IQe!+|A#gbiWbO{bGWv7PRPZC;UIe&o@*mSnszMKVd42N6sWv2(STD8_tK zs=%pD`6M)e?#d%xoaa62qXG!y=8~vw_0K(%8GDEFuDS&jX%xv>ND-y1Q0K*ox?|Bk zTe`pN!-7>@YR~USE)M7F{17W%wJH;$Zr7j|zxLXsGqEv0gZXN z0Nz8``mku>-3soE^E;yDvfSxwj6B%1$gmt$k0M&s_pVbD&%T8)3Vdq;Wy#zY$&w*^ zRxLVq{E|o>nyi7lZR~c6Ry$@H6v&1u*aGCYhi?Aq1Ew9d4Z3;LG{8wPLm;5WTgTQP z&}6h`x|7|S*;g2k&s%1s6ph>lXYBiDQ7#(Ua;v$6Bm^YscP3ennhV3QI~7S~>iVqA zh2(2v?q(d5iMOWR$TY)EuE4()_h0jtI9jR4o$hFwwGJv9hu&!7KS$i?IJbttok_`^ zx%Q_m_k4uVu4Trsxu9s09maBXnEl>RJEk-^RIA%RSm8b_!*)OV}k03&RoDxl#yxvF)OGb|rC zKRwZWY(1FCJqqYjMMvf(E%6ehST@;@(U(YB&*cN%fdO;!}5cOz^ZmFgph$KdICMyT3^&@;k z*o4g)K4x(gIHRd%sQ|G?bvlJJ3(c+)9302AY(3; zujR2a;9aDD!HVyo@}rPR^Z)%Q;IvZ{?m{Jtrw}avfgz~w1QkN8wLz_%EtE#Q%1ZCe zE642lUO&{8&#FCrBvpi43No1B{}e(m{00W+N>VHsU^h3=GcR^hDyOQhM3IwF6$pdH zoFy;YRY5i2zqVlGAaI^!@E-J?L;e(##hy-!rDK6QW%W;!yGf-nOyj@cZL4gu5Jp$b z_Nv6(vF*`U%>FFK=|Lfg7({n}W6ssMLeL#mpz$zW^X*UK#5DKv1;IFNaM?cJQ7#Gv zxc$)FKmGG{ZoH%zEHTdXqb)X(ncz+Wg8(|(60>^H5FLjkg4xYFI-Xj;FN?8Gtkq-) z61|*vr0oyW!4s^mb z(i1}i%KPvBqoD<7=mm>o-1#J?-l5OlO4Hw4#7ryWqLB(%a-e483i9|2*8}RcELF7m2+M*j+knk zN4R+prz%U+r&sB1ITNhaX~8H&1Xlw#qEn{N=4k?OQ=b?Cx(l{Fb)~u=ZLe2sf^B@z zCtXhL(gz66$sIh(tw=kdR`jp!VpRP=DAop%7={(t(&Q_r_}AAF2qFuZnFl`BCvei6NPy zqP>z?B?g(Is2M*4Fz-_Z0MhKaDPgAzCu;X!ze~rezO!LEK6Q?n?vo7bb#RBlmL$#n zOPz*wPR&D6Xz&TVncY+Mnf%KSeUmjfEw?Mo;Z~=r(Yb54!B%uAnWA5;n%9B>=n#pY zi=Wv2W(hzOA){m}IJhENrF_!yWO0EHgp-;&(9A)m1?C2b#yupf={KsS0mzS=}-@DbAYwf*B0$>2EB z{%vH^vS2%}$eF8|yDIK>)|OI%PoIj|iBc0X->RG>=?P;-T5Z8nHz^I;#Q6$_>YUl4 z0Cc{N0ooDTR|g;gx^nTb`j9o3*CujwZzAtk zB>YI+!^p3elnvsWPToC_!*GXP+N(y%R4Rp!`t63cJMsyu`*nqgEZ$bIi2=sjR)8(8 z&4xBD@<+>!e(>+hd?9TxCztrzwpt;iwP#}q*wairnV3vlTH@9Dfq$rQBBB+)EFrM$ z{-dGbivx*JsSjb{pC~jS7t#$8vA_6#G#)Xe0zUlf2Y3VrT%PjlVeQ!;_8b83OLO8WGR}KH%}I2+?ad6F8-2X-TiR42+_u=n zfB2r}4D%!1uTKYVy>aI&*v_tjM)R`C(;!~sM++d*`3q_mAHOMv4yJvgW93WWfb6w% zH%OMhyb%gMNNlu6aQOdXSd5Ss?tk`9><&Dl-(wH|Be-r1vu317vBg{D5lHPY!$ZgqG=BneI_CDO>%K-Qk z_2FkHnPCSC%@xqEqae3>{0aG!!WlUFL^9&+yAIzq>heXTyhVJ0)JViGN$XLz@9dq zGDawEX>LAFcJW8znzp->(u>Ub-ng_Y9frE`FgKbix>neCK@5KngYeu@QJ+sJ1Gcpj z`Ogib;oJh(nhPUjFg+V+)bli1A3MY$n;#` zezXa~dmwSRU9TAVs`a;!=jKGZi^T(UOI>_n|Mb3$Q4_m89|Na4+S#xG12p%RMHAa1 zUK1NHxllh9K`PDRJZfOIfNtM#WZ_!*abx`|+gjm$2Cgg+SGxzDQwfE$mCdZfgBs<^ z$l7XUB8k7wfkp}N;9l5wsxmyU<8(Hm{?C@(D=@+^o!Ogr&pX32R|9YQE^^&N)8rEi)@A9U(%u0q>*YeC1@Q ztvI42?aSz);TX7<4Zm|#qMK6{krrlKsOe_g)g%PHC8XEd;)!?Kk-K7S0TaSj*pT-9 z)n1d%CnL@_8ew!0Yz%2Bs)q43A>lJ+6TNf{bugaWQ&miMv=x~txG;NEiMw#F0V9+k zn6kueSK*KUr(mP3k3R2tGl_-W-q{uA?rB-%vPfdxT%}kP)2ySg96rD;o7ZZVg6Li~ zznNP)w)}@ojvnF8&Hittk5&Fo0Lf267l`+{YL=ZK3PNe3at&SMbqZ@K6Kb34)OUFO z#!HpQ7QBdW)HwLp90)mhrX0jaCgn`}Whv|IeGr=x%CAhy5y3URLQDNtZIZwlTauG4 zSrNuvWwjth$RgxC=Td1LH6d9{E@RZZkRq2yD6$`30yreM9YYxTsVF3k&!1_l&RhY_ z6arH{{CxjLJjPNw5%sk8S?!LcVICaP@Ivql?$$fiP!*7%LJ`9KEuS#Zf{=U?)%k)R3Fg*{>I4zG&8gJ z{B~XO=wW^*Jr}$vM|=k;xbn$q?40KL{`3hwZL@?gopm=%x3LLDMLDBOqlK4t3qg1f zU7!p;L$&LtAVEf0lV(YlWn^SZx2y^eX@z6EbV0t3pA5HJAiz>hGp7VKGBkGNG|^|= zpHqWcF6WOQoCQbH$!iEN0e=mF%2#KiDMdQjo>zEdgt$&71~Q7ij zhPFf|_ECMHnQuJ4*NJ!hHn_d3KSMO1NV;pkiu)ib+VBPs82FQuer5@v2VnX=4$6rb z-+@#;^Y&4TBdbQw$IWM1+#;@2WvaofrB!7-p75dYI1T`2U!Q613WmiT;pTM6R#;^} z$;WxduYLFvw?gfv8x&entAPhO0>zJAL$mA;a!wbAeE{ z$ypnK{7NSGLQE*(f|UrAvj^`J>H1y_?ws*JKHz>DGUbE$nvKV2Lj%HOD>k4p##IDl zG+mhpHf0WlMcK3bV9=OfP=fvz`oe5bkB0Tp`M;p_l@P$gTV4TPdA5aO2N{JTohsT< zK{|b50eb%+6rb=wgHb5~9bxcT$#S5B^4FA&&t|G1uzs0o7gUmUnTBbfLf|`0jvx!- zlPt6#A3uo%I}uC!6aeKOh>eY5%7H3VHf`w1a0^{%N`Wa53Vi-rSRlw!1kGDNk|!CN zojgaSs~<{J2ZCuDma?q3jKl+zAfnifb1OivQO<=R34~x#NPmWfRZFIjrn8i1i#Sdn zfCv^%9;SEojJqQ750b;;t7J*Vfoqbxf%uXULGWCeGD9NKSb?I5D@f+N1HVLeXO_lx(-;txw4oCW*? zgrH;Mho@qH>A>x2HMG?r0(+6-&Hyohq+NivfWcfi^!eUiFtaII_fGHvhGMn@pD81V z@*0(1usIKpBEpD+6l$WkiRfm#HZMa;ATB{Ha0;fVPj>-YiyBJx1bITpC3o2SF@Mri zJI{oWZW`OP8Y{SmJE|Gb?}90_N@R`>q9*SBH6K1!`4iIr);%u8YH83S(LHDQ!+wy8 zls860`va!6AgXYBxQgQ?p(9G_a9CWQ+5{`(A4!QC_K+Rg^9?)^(7Nf|2d*LXu>2jg z!fgMrUwG`c*xBNrW}nP4*u_14pGsQsJwwv_BdzBxqM_{}^~RMZGCDv=z3%V7aN^(J z+@eNzvc8d1-7CGFF%|Z-@u`LH(KSTbjiE%VieW#)Yv^5iVr^ZhiCwuJg z1IhIfY2U_M0+fk?3x>I;*xb%p(7&KMVQ5VnH$bnjG?fPw^hXYOfIk@2Gu<4cr7YN_ z$|C?ghJe=%5JljEn&I5e#k^ zOCp1aitvwz65iz*9_zqOYM_q^iP32WMAnJ0#Avu46pO_b#Jr+y0p+i))E-y*kVRj- zqb&h~q&#&{AhwVgBO^!-vcCm0$ZJ_ny=){-BWRjVT;ekGeF6qj22Ef9IiMzYD0L5at}O_9vgudclQBoCNL#k=~!EfBx`xje7dw z4cCQ++$aA6GTEtilC@ML-1}{1+mR9wPqVq_7heTdXFn8%!=GHQ%+j?m(JytbqR)=R zAP;&=OHR9o(@hwohT;<7x$N!bT8&!fGKbC{N7MX#5_(KPzHV@|jt$lRAKenMF*dVO zt?F;lE=-eob6HiEVwbc+mnO}|lDj)f`6g68X}A*~X|q45nCvY6_j9j1(+H=9y75`l zGophM{$%_Bx29>_@lQj_NaQ*uzc(|@I)t&o6*^5X9-O!&g1c*P^5L8}{Ljt|y&Iev zQ2$`=d~=Oho6LD(MP1g;zcoRt==O+BRo;edS&BQWHOe?=l0r8sav%!)U<{);P#g}< z?GdxN1u4bXiEEWtA*+?)tcleS6o#oeIZ)@55C8`buyVKAEXK14{d?mg%-ysY1Ec{X z#lUUH@;+xxRYnN{Ah?$+lvg!;NZftUg}@*(09V@ttGOyS4{+UW{sAhG#0^ z0{&+zKg`+=YX9uKkWwz2s?+QZBHjt1=!fT=l{f&6kz5ik9hDLig?1_;<(4efrWlQp zNE@!}f+$NDzYA?TM&tGlzn8KS_bQ<;ZQS#mXjvi{b4cDZiGcCpYQXXnzacfRAK{uc z6VzIjDvprl)^k9Ez-!7HePzlX{W*&8VN+;nT*T^N^mvS|eI&_pLx@--*m`AVRR`Ak z*XXt)29XMe?iV(~Hw;*0gcqZ*_~w;w4g?$;mzT^v9OMACxMR(U}FSqYtnRk?8W0cnbz4O_c~SVHWg0%GxmingaK3Q$$X1X z3zqO@0D845)^qKWX&s9laSIg&Dwa^+>AgdYhP3xX{W2W=>u5p)z~KP8h8E>9qZsJk z#~i${&}s)g@3b`scb%pQ5EZgJOg-)zupUgqpD#huQY2K>>BJUf+1^zTY#A#vRMw!m zr{TW{tz9C1_GmHfm2en$&8lZzxq2%%40X;|=WrpEg#6^Q#hTO>(bh*?r%(>;?W*)6 zT}6iJ(i-bozq`5}_qxBC`8Mc*SpLzMHvkZ#C+j2PKsBtTfn^j43T!)629wP?2kQzm zg?tog3bNX~s`--vD0p)V89Y3AlU<&+FpB=>u_UbGA<}{VV3Q|q1NqC`bGJ6-JaCL6 z{wX@+;X=UzGBJwK=H)?!coZh@ssQY2D1l%p%mCM^ayNA-A&GvrWMCm7%e9x z-p7nV?y=3jxR?6ilZjV@Q|5C!CQwl?Dq~r~JqtG_(GQM8K9}TQNu^`J>Mb7Q##)6AkDE=I{YUA4h7%t&!p`c)^MBc`vxqY7zX#s`%WiS8{|~!m zc7rXUb?I>-rCT@J*8Z~Y%|ig6+Jotv;?nfJZVcscHS4TWeC z<@ZB8t-6ax4nxT4c^L^zWicp>!cr!Rvxx6M13u`KmF4yo~X@0*teFCYH+< zO-FieAQS2?BFI7nGU)=g;FSGXBsXD{@t2@7$=qlxhYV#lK4K|H6wm69oMl;N?Vsy= zJ4aw{-kDdG4)PcZ>O@a86<^_`4f;3!dvbdybN86`;tmy-9gk)~Ywd{W&yvf9(m$H} z+~NJ*D&%E52i1|g=>`Ws$f*XkWRw$^ry#+p2d>?%__y!id$_AR)yD|udSV-BuegOS z!}B;qeJdgn>Ly{O<|wU?aKFOp>~rF{#~S-HyftanZj*WYY9+zWR6rk$9o%Sx)ll9{ z_t`d<(1rfT{9Xi{ImXr54L&o-(g0MSfg3&|Vc0(ON2ed|K1^S)5QxbFD-pDSNI09h zbb%vp>jKmD^K#0QAb35YEr`f{mK5~>Oh9aqk~>R$(RQXL(L2qQ&g{*9_`QYWEfvuX zB))C8(pX%tf@3I^i7f4ceF*;@$JlfJRkS$+79>*`R7A-bM>4{O_zVA*K$88g?29qt zT-5fgp+vrRd?JsYx1gXU(>ZNMYCK0>_KAm&)e*V@KGnJ))AkwIpw~eL~p#; z-*j(jZI61XdF`3545r7gn_SGQ7Jw2ORtJWnqJA?5N*mk~*xph-Mm>JLyTZ+-e*}Tf zotoi)aW0QaHaspHPqY8QxteRrzFnxlaV}E1{&cylXAk=S;9OG~&qxJu)nUs2#krM*J_%Rrjk=WrV|w1m5&lQ;;`XM$4kI!lVHA`WdEhT)ZK2>w4iaf zIDL;Pe7RuC4-@yZ4EIE9@n7^0G-Dln0^7Dz%zW$VCT9Kdy4c9*jKyXW&c?G>V(>@s z<%rz*d=v+2<3qB3z=qq+wet1tQd?ZqLnH)zzP}&Z-|YJ~dHZhBt53kXuvn%o7<*J= zL~CS$*F7ayQyfTB=5Q8=hOfm$mfLAUF97u9(b-S)iLTO#uHQ-S3}|Y z=pZi&;*8Yhp5Gel_Vy3qE!YDYr`gMdGJ~~m z_<$}-I*W(ifqr;x;}P0!3*q}-?9)vP8E+AuPh~=F9HEJd;I^_`jacWhBlxc7EHHXp zukpw8hPBk7Db8m)^mhoPhLT)%=nH3>&JX{kygn@z{4@RhytCu35@|eeI~sdJlMP@K zK4W^5uhlz2d{{sjRYGe>v0I_AFTtKhq2Epaj`nAzUATb;@Sz-+zNT`p(Q+)xk(UL% z2OX$(q~v8ww}l=oxC=#X%9}In-cxPiv0L4&`(vPD?O2)$fbZ5dRFv!wiPU;UZF<_& z^%q)38^5p`JK;LKL}Rwxs6X;*jmA;yqumsQLX*E%%*X`x)SbUL|KIv_O&){WSBib_ zjNa*H@`ir}Fm*-W3Yfgmm26JF5YV}mwYXjRDE?A5!RPf^F|UBOJ=N>t`*1z}nf5O8 z`847Ec=uE_viM4WQ{|N|qn8vQJz4S%)ND>z-v}aa`Q^~1?pJwy<$Ald$fy3~-tV=$ z`eY6$iNfeAYKS}Exup*%(8r56_{(Chbvt7Ii-YiyE@I}6PN4DK3NV$MGb;b+p~8|+sphvG?>FT4VKdAEzS%zU$n@*g@PS>vAm$yl0b2z z)Nr(8*TGN+ND%PN`QT0Cv8vQ#N!eHSqj(UXQ*5SJf0vQFoBw*<9SLZE^Y31>z5IOd z^7GzOp54EHAWZ$!wHjHsNq605-RIh52zve*A@#cS`R4RC0ne3}N?v^;u@O{3ljMq? z*t`Fj?vN+;hKF(e*Rrn< zeOMBIYEBc1e;pouy>zVDVoc;Y_d-#3(0)F*we1l)nB;pgR%P&V(?gE6fIsv{tNg#ePzmHf}S5fWp+V zg}~&;j{M_U49e3RP|{U&F;7a`fNyk2V7m2OOuNJBX1ee-3P|tgc9S-={4yINFh$tb z6kPSCH+u6fp;QoD#f;b0+of44f&4nPrx3;vN%Pg^y;aQ6UX;wt<;#l17F^rw{pI~E z@9XeI&3E%8@M|ORS_@?qoS=kz-{4C+$H`Xj!)7Zh%IsC_xPIc}p{@}1{AT~mKf~Wo zT$onp>C(Oxo$ltvi>J2}H_jsNi+$bh@?ff}%7ck8$%kF*5L89tm z?>HpBZzD_iZps99s{5-MwPd}_o?9bKO%*f-v%S0fox5f()vV&dl)>5I<@wV-AiyJE z)nE_Cy{kjbpSg~+-Ile-Kv(x-+1sh&Pge2g8J83I;YA(ceb9d(vey5B$Zq-PmQSDP z)#K1&p1ZL3W2$CHW?h+6V7g~Kcqy9yQby};yW6fm{T-_pgTlSuuZN}F_m zPb|0{`=}SJ|EZo%K8F6gt(W|q^bG|ee!zKYV)80XmT3-!%a^iMba3dUYG--F>sgZU z&!)wqZrmPO=0{21;MGHf$Hl&ftvAJdTAsn&a5M_6qeY@c+pIN&5N&QAAHm7d^ZmyO*VP;m83zwx9Jvz~4@Ak*AflgU z9nwSKc3kQkhp~&3?_&*e5xKrwk?M3|T7ZCaZ9QFV4v;Ug%4c8IJ&!Cg*^hDPv$;~y zn(On>6uX5&0yu4A23vvStzmR2o2(<2Z1*23&C>@f{O`aa`_6`f3zD(jf2cGU^ydsk}w^Rt0P8l?~10WjA1ZM3MlTf zy7YlVd1PGbS6S`zh3^>96O&h|2zzT76~#N>76F)8v0+V?8&TzFS|+a zC50D*%dK-8ebdX6e5+?XV&5OL0ku<<@8V=pFGk}qQJf;tr*xD~MQ|`CzwG(ONwvrK~%OeQob0ejg+I3O&j)$JAqW`a6rC6C#?QjjOIQvD3*L?+bg0~WF zooVOT#KboCxT-R*S-Cayx|5@GKl$xQy81nxygPEn)v88Ua13gl4xMsG&~}zQ-t=(Q ztM2TyB>L`=?5?BI*g@Gf2IXXutuZ7?IBSEkjC7D+a) z8y4WZ*}zVU=)^#Vydz85?g;^+AxGYr=0qAf0E*_1m1t3ToUjj?Z?yPeFvXoXG>9{4 zZjacV8msl$gIGRWXJmPp9KXEwPT(L4nC7#(lh;(Gnl9UpDZ3e4;yBgXJXuauA9`Z8 zg0=RSXA1dgF+m}P{22*RO`IgDU$`EZMuYv@m%WHg1$Py4@;_6pmZ_!^Ls~kswCpv-KljUfHJWt3!Jpj)JwC79jqI_)UOEy5 zkyAyALyxNg6y^YxQ;~|aasP_MmXxl8!OkXvE;oAMXL3#IH`ryq{$H@m=Klk`w#a0+ zDD7~lv)O*2%b&yLuX2K9%ZqS#8XxjTJjjmU9)eG;f@DvxQnvug2*wtpBb~|edVC6v zvRUX<^cbr&>a3ygX8H=Hk++5R*V1r?Psfx+xMupOd{kBaDC{ui!Z0BszV08Br&~{e zs5+pD4066@bSZ&#zxcOR=(lOT7g3o~$~|$Dhu)D~cx$x=-{~9RZB{dXM}$2-CPQ;a z<-W+Nrv4n8dyoCw_#NUqq?KGFh4zc!Mg{4H*87M76h7O8Yhr*V;# zwN;~6s&S-rK+w0+P zJxD`2>ASAupil%#t4)UCCcx&!du&TjNm4#j46vo`-D}5Mw1x&WYO}PkR@U@XcQMHW zwF3k7mdNba>w|tln65*iHxny{!5ejJ8Q~zTvnOjeTBlX2|6G+cg0zEGt&{K6{%N>u z?8FgK>N8(ii6Mv1QnPXau$?R)rV?4Sfd`BaYonLAz)S8*UZ?2dSDotFl}`=msbE zFUnD~21*A~f$iNgVGO6IbHuWOBHBhrcW2ed`(n-^469U$I&!kKSBvPZil{~NEz1r5 z(91_|vUg?wr>(mTiy~mu2E0K@cXvy73rHzQNq0$?bjQ-&-Q6G{-67qjlyrAD$hW?6 z-gCZl{?9dkc6augndg2UMs>KVh9Bz20_o-(?88cF$Mpr@FH;7R{j?@|p%!Xd)5>?7 zP?;TSp`87o7V4`s)IzoXpj4^QYnQK88m+TSJ2(gNkZk(l7JR>GebOCX{YJ{_?(<;@ z!TjB|`Z#_rF9QLLsF_s`qHrTGaNrkptYDpl5h;6v*z#q2*_RJ_F)B-r{Ph+pd@aZyrmOf$2>)flsYww3b(y+Jivqrzr zK3Dmk1X;T-zlcDT$~PzJQ9N@VVeX90@AwWx+qXPVY*U@1kSvk~rm~KQJD{Q5)JSH) znYyBAhzUQx$xk6+S@|SVwqYEu8I?CXqx#$tl_Fo1KJt)$_fIdGL6W&@Q;kCA_6QfI+mnKb$>qwqas zlHZ^k-L&jdtYSB6Hpe?br27|2^!5iWOVnx-+7ds85=0sCs8!e4C>2|cgRzA^Xc4Lf`z~=OV(UX z@ZtUjbEOabb zy26_^?U*H0sF4-E`>pviu3hY<;ty{f1*4yct^Z$PP6YJfqV@_L9f}s0y6a1FZ?Ma7 zMT_mH_umj+IF_wn&qJ!~<}aKmQ}}}Q_Jcp~FGGWM{#2b<&F{@WOg|4Ge#4^8)S%Rg zA#I`ktXcjmaB2PF>MCV;bMV3R=DuCGGC3g~HBDFP{#0Uv+ndk;upN&XnbW4d zfQ)FEtmmlJsU%``h~1{7bGFocdY*1*0C^+kR(sFPb8tLSXA!P~v)j4+Ax>6h3t z4Qmxufq~jjli|h9%yg+Dr*QkL zJgfnZI;%OGNKDLwwyKr>j5lG+24uvPdI7P`K9tn%;YGU|7V%@~@Ptkmw0Ue77oE#G z^*8(CtLQW2a|z8_V%4U2fciEqm>V%{+_hH@ZI->5TVu|DP$D`!A54+?`StZAgZZy` zdmjATF-bcy{ScAV?2%I)b)C?$FiZ|67z%n~?+$Y(i!hs)wW zrhdudKY`eixE>;{@Sj24jEG_1GorRT#pTU&t;s7EeJ!WhKkLnd#}{acCC)RQ{_IMl z{u#U&xx;YHHKJ{oq`b>Eq||pID-fEK<6BaKJA+GP`5E zN*Hoj0k9aY#`#Et6tS{D3oHVJm~(5v80Oi(K5!ol#v$P6f6En_w6Dyj{)}@`%Ad!3(D*^4$LA5LX38;C@hLL zhB0nfjF**Dh?Ik_&)qk@-FReQ)i_Mn2KP)OJVrSwp&gJ%-}Q8hSl2VHACM`roepSy zXzx5asPr8wPGu?Su65Ms`0FJ;jpjV?Vqy)?9I|CVbdtKWY@2zv9L4KMGWd?+K#8p-=B{4c(Z=k4K5HTS zL?I}5A=yA`Ux1XPAt2?rG;Rx%%}0&tp*#)EK2m@`-NE0Jd)9UXt@q;3JFB1#cjr0@d@eg0oJ)bLikYaV}t&@vwChJMBD%TT}O z#|-ttddfTF@|t586exTd@4EkU_F)1iG8xXtEVt#nTDquj?2qVJ&>vdvHoe&7uSR8{ z0me{gquWs69z=D_t-%GeLULe4|7^C$!D$?KTit6%?K#Co?q?^Rr0WqiP9)x1;rOri zQSM{Y7f-@*j|8zTy`m|US1mo( zoWD9~CHX%(=z9iL({N{4BP4y3VP1WS2>y>E&zD$nfLnJ5*PM?ljW5}GYYWH2Q?Avxqhx6aKWx7 zuFS<_;h0aPK;L@I<8tR$&Nq%6_6;LB?d-!o+TGHw9Sm$BnL9ns>@7P#gHD`&(`9V8 zm2GjT>R9QE7Q#4|CSm4DpSU|XwG*fgEJpy%_NWz1U6ktvl^6#x#XwmfSd&~Z z@73Y=C48h)ZA{UZ?+~piN>gI5mO6LG4Rb1rtmdT|^SoFpf@e!s)U)&9+oqg~%M&{t zd6-~}9PYfywB_*|^Xe!-xy>CreQp*X;*=H>;(l}v$v`3G_P)$Wx$4cI3>5xbtO`(i zouYall0kexT%U#Isl+^sq{L4LL65K%O8sA)6q2d1LY0kMdnsO&F5Rq(Ret_PR*X#`ZZp2^4q?f5K@y@gy8P)2?S~lD9FAbr3#n1!WW&Dy6_6 zPg$;LtU_$7;MnTcutv%E2@BH*>4F$#h-!usPUkFY+3s9Pr+=+guUK3s0iwlC#0M z?@UqIB5B!gS22fdctJ2u>R{2BWr;i@Ly!O#eeN=?yL7cGX1R3f>O?~xC{WAm6_+4m zC5&r|84b8uu=2|&oYIM|SM>sLA-qD7HngXKMV-xamu-5ny?-T>Y`s04mlSf zKIwB#v*>PL9GCiHt=z7aHLvG~>08{pC_^gWK9%Q~2((;Zr<7*GxtKpU3{FmWhLe5p z?;w+shmXjQn5w@0qe=oBul0iS+7UUKlb^-pU6E8LGGc_ErY%}*BmJ2v{wkZLJZU<^ z7pJ4;M`Qw&iX4$9*+Z!a&tm8eR$tmC{XeOQEUw4|Z^hu=iBUsl`{`hxzI3KybWT5d5)(RB5^(kmannl9Q1s71ZMOi?d8Z2tBOo@pn^gVL6Lt#kEL84^PwlwFIfK<^gtB*2lNmr`U^e0*8c@P zuD8id^8AVaLXWUbDD=1<63ems3q6Q9v;9d`q0l4!AJBtp=pWDnF8(j{$h(0-45U|B z+1UOE^mwy%S!)=|LF$4WyTI{J=i6mGH_C3Ako zb4lp?{7mSC{cRyifnW!1cZY4cQDCbh`w$Tc>w_~HoAuNx* zPauYIL%RCHLJdpF%YOUx%D0o;3+UfdKy6VfxwoY+B~1-_XyQYcha=1AP) z?LP&@VS@8iITJ+{&zg-jLsbLUF6QhwsAuC! zHow7sUQ*^*Z}#{GPS-LW?IK5-*evwL@;{ozj)iA7raBLREb|^bMdwrUYx4JQRgN@^ zD*g9G8lKaRqS4`Rf4Cqh4R3LANFu&fNK zK1p)COK82>=nacaaD^Afm+PI7evj+5a5UumALd@l%}64qfQi0V%z~Z!Zi?ia5Q{my zZM;@}o9%5$DheX>@0v^vSeMV6vU+6?cOfF}`6z!uMHFy7v&PRt#ov$=9}*YnwaN0Mx@V0Fv4Q^ zFTE{X2<&=_TQLz1aiBgaOlu~UgP?-u)n9$>F>!}+&~Sz7XKpB$Xc)v4>3tU^B3H5M zTS=}C14-<_Fv^kI7?%|K^pvXPkK|n12(3-9=(5c!N#rU$`#(xD)8eI6(Pt&)@po$M zoF-Nv)E*}v#ILoQ=0J0pVq*XIJt|-I&lb$f=Vh7?j3MT?aqSwK?zM34(z*G|T1hJg zn3jOGYx#Ah{N?T<+T`-)tNvhi7KT5_HDT|;)|*q^!nksRNNGd?YDtS()yS{+oalmF zU=ahX0Qm$Qw@13NzAVFZh9!RsSwj5XqVznNK#x(HQGX>}3h*l-_egH5gmz7sHaOt> z3^ENSG7~cG2!l~xrC8LH7FdXy(}-{x4(?|Wfs81=20n2#3+`C6Q&JE2EeiF{z z`;Uw{JHHVhgIpBN-z0{z)hb?(1}mAjdb>iD%n4Kc7;EBwg&uvkgMFbCDs6(1F-X;* ze>9;|dmA@kvW+N29q4FIq9~m4a_K-DNMrvxWMrTMvNn1JpdCPew__tf!1a*~q+bK^ zJc$nM00NLgBj#WYdbt-S!|4t;C+0sbASj2pMli=yd-3;(6=55rFw!w51$MKf01Q$T z0CT^~S2BNta(8b}cDD%twE=wLOfD^OqGH**J9>yS8`RB3zBK?hWPCsa#?^1I=qojF z%GUGkITrb$Zb0R6p31t)RjWR15r~`hi?RVtk8+Hz52#x_7QV<8hK3`OiJ0^|CSyn0 z&iT4b<#loT9qs3J>Yn_l)IBzUP@jjQ-v>od-%u~q3@Gg&>>@Mlq5pOyhL{PwW@Tog z5{s#GEc>DPNq7F3Go3jCsPUr#$jabL8^%Vx0dD&$ka2wE^JG?W2MXxlWsw8r0=*h( zrQz(!y%RsD12y1jP3mOx5n{~&UScji5sQn$ScZ%MK=Nr{kX_oIw1$nJmiryjs z`u~_eN7L7(OMv-b^5KR)k~aECE15)VvvY6L3m6!Cq0V*D0pVa?r6a)MrOJp{0+2IC zOf&QKiYo$ydqJt3sDMZAS`boHWw&;rHRfA0^fIjV_pn5HyHr!~7U{^zKN!z9&_yZg z$dc^@CjyZ#4pt!bVfYUsehbSV^PL5aj0PG0DH+gN`fD;U0&q$-WADGtPmUGl3=ZXY zn+AS1U^xt6!T~c}hwS9?D|~^bn5IRwK!#*h5d8m01~B%2mkiP_T_6$nw!uv@t6qc2 zW~NhDDygt0i}smIjvlUS1t*ObzG$+%wp2w^q3t5(;P(eiN{C5uNBVwbT>zy@o~Cal z=#1*YmSnMrYTr7sACu_f1eK+LdWX0MB@V!BOX?zzv_dqqo`kOe{bjWcpF#InKxC~m zjtgxh$+HSaw-PhhOI23p9VeohX-|r;Xk{@0<9kR`f93gz<3LUjdt)6)Aqb^LbqVmb zKS60#Rt=2j$4drWJ&oqNe@v=l>qUu&Q}%Vl^-ALJ*2)7vCw-Qw<>XU3CceMIT0blQ z_#<-zflYoIEXAiavtD%zye%hV6W1*Y28<8BNeLqGf*rG4C^Y=F4vW7zB>kfq2wWGT z2S_0!L-=KwxJB6(SUZ`QpKjz@fc6*EF;%M6$ zFS%kDTV&KHFxRM~rxWhHpQve^R8Sbvm>`fi5w~PdROCMVlq)zXCXFpV8lJ-RcEy78 zcX>3S{Zv-Tdz%s`y5q?e1K;HCTyf|jxc@k$zjeg4@iH?mmeT}3de+lY!EGk zdTSZ+@faK}lZiL_Hzgl;u1p@#Rf0GsKq>F1UIMe=EZdD7x8*%m1Y(Wb5=SAE(QtmR zr+c>^?X)v*M~o>!%C;D@5-_8vZHfwkz?!K zwq9=!6mgwuB#?|OS|F|<)-lChvA8QUq(acxq(t;#nTbl22B#G9#Hy+=s#L#7# z_RRv6jVvK=?YRN94VhDf3Pvq(zW`u=tL{D?LEkg`#t+sm`ihG%ONNJ$5>Vu6hNb86fmQRn55l~_f$tx-j{{&VRW>UT9# z8LAJm@PaKCk^jRSkp9~o80o$zK&DWBfVm%`7e#63CFYIFCOorGa~5wvf*q8(V@P8{2#vHl5e}}v&W)+l-OTi5c!0Sj<)H);}wLv&fE;( zb{Rpj$L{VHL%DSrb%dxJ2u?AkQWekb!E08=^idj4NLnO?N|9lEahAfl&R)c}Lqaj& z5Mx8x>JmIJbCGdU>@y|&x|qOo=WhdOSnZ4g$3f?$jDXulB!lGbcmaIlI{u-^IOH8+ z+;dafC;5r4fD+@lwyVGc%Y_a zQL{#**n_+xT4lSd=ZE<0xxkj(5M19**qD+F@^x4BMEXvK?p7D?-L$v1leE0QGe1E1QK`Fi=r9d}pFv+o(_rv<#$nxJ1`v-wn840@tZCb`0maXb5W?z) z@6uRkCVTNiuneLn$ltInU%;eJ9|f~lI~VTED}KO+o`4}F5hDQ3H<>UGbxaW!)?KdH ztrWnCkCM7m1{%9m1A4}&S`OC}_#>xMjdlAiGu(}d7nqJi{5Z`ZuentQed|>QMy_LP zOueFXxNJ^?(Q$nBpk+vZ45Ac&1E3E3jdZ}n1ao(0HXm|i76tPpoM0Qkaa)tWBa%R4 z%%FYqE~m((Z>f`O%#hC@n-iIBk^&C@6dOE-X}gXhFbEJg+lCN;+x^+W9sXsy z*K+)0ki3Z7z>X^>t|>~k5kI)p5`&K%tHD$#Y!$AkVDr6?qfHyp+}%tM^2FA(D8i;S zsUk`3Z?`{@=#OZiskes|A7g0nkoZA|Utn;%m8t(Z{Gyv|rrsa;--ch@|26#LV&Fml z@8Oq;|1tbh1s#5I8vb9yFOqrNrv$8hf=4v(m|2F#|~V=`&rw#2zduN{6H}96elZZHxOx98j&4k2})J9WY5?SGBM7JQ) z4qcGDHq_`LtcI~~dtc!9q*Oucw4yy{kqGr$WeV4lR4=7tnpf^P&N1EW@FPO|T9H_I;n`mVp{Wa>)S?65fw&%>6jp}h=8KzH5z?`fgRgB2-}gv<+kby+Le5RF=657CtT=N=GNz(*9S$| zUsPrO?w6MPe*~X*R8Q)D_=v8L%iOMH`=(4zoDiokF9wgD06Hm05;(F|YEMSI+Rl6a z(4p#kX0gHp8yco;SQ4+j`#Jd-(&mpPVK@xKr-UcZ6zj6jt) zNmwB|==Lq2F;Y;DAV@W%Wxcc{T$?1Eplp5PY#1%^SnuCh5_c{OB@TJGp_gZfmbIMu zxT!&rr(UD+ZEtc7ZPUya0dE$SSDktTsZTE(NP(-k)S@<7q5Fdh15r6bW*;R&^qi zT29bL+Mx?ESSHzKrJQ#d7pDpVwqKEH^59Za+fCSir9}(wkC~#kI$Tps7WL?;f*9^* znsj!{c)DXf7a2-_))MbM>6?!3JWpp^o9gF~?rm-NDs1jO5@Pz$^gZzY!R*!E0UgT$ zx@8|4zF%6QTrLZos>jqm^n3TMkAJ%LfOMgTO4<)i93$4>9~l2ZMcv*QHw?fPKZ&~N z2KW+rif49#3X-Go5}J3JeKxDwgMp3g;XAXT{qpTQoO;`R+KX4l6e8trpZh`xNfY-= z#8_b;JHPFXzW6q*vEJS__;k*_sJFg|xfZ!9J3JLNY8!bLH7F}xDWxYVzMgn|Rr9S_ zBHGDex!Zmykr(;w#rryO@$(1cll~>^!y4<+;^bO2sk+sU$`xBeYp|n?Y#}uFPeOVx zpl|y@-z=iYxyd8?m2h+|V&~)YS+(zqwVB9df3@$6db424W{KMlG|%w$Eeta$`s)ja zeoPgkP;FM1ZO**o-UgNTl?xd&hQa{vDCs8r14@~fer#)M7H$iyww z&$eaV^sSy>XZP1$S@t9^ZiC~!E1bURNg8A8UZ(pEacB2~tibj`kenSvcBrZ$;0PWnpQ1ACD7JU3K7CwpN;$ z#9(vV?5$CWHuA%9^SjQBkc{%7Axj!=#f$tByta5eue$xkx_9gAU?GmrJp;Au>3Hd_ zVSRO&?|cD`)=hf(r`P_q&85c;0oq5c&+Z*5(MO+os8c@nIZN>w^{PfGCB7+3Eqp?M zNBOmCPmCwU&0k>V?_5pJ$Min3SM=Al2h*6>!aw&Spv|0DM&~oK&9(bik>b_YlKVT6 e0pHg>ft{Bee0r*zJKl>I>z2S*vfgNvl>Y}-*=_Xz literal 0 HcmV?d00001 diff --git a/data/shaders/manipulative/Ripple Distortion.frag.qsb b/data/shaders/manipulative/Ripple Distortion.frag.qsb new file mode 100644 index 0000000000000000000000000000000000000000..62086fdfaab76782ea5b11af5f1aea8ce13f9eee GIT binary patch literal 3499 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 Z_&$+7@!TK#o)PnX4sG8q@n4@7YQF%B_fG%- literal 0 HcmV?d00001 diff --git a/data/shaders/manipulative/Scatter Blur.frag.qsb b/data/shaders/manipulative/Scatter Blur.frag.qsb new file mode 100644 index 0000000000000000000000000000000000000000..186c186db2600184d496a69eac92495cb5d4bae6 GIT binary patch literal 2932 zcmV-)3ybss05!3Aob6j*a}(DUzqVvU1SUWT4QWC*7^nn7NV~Ev$Jm(I}UUPbsR)aM!`VNk+E^8QtViq1hUbMvk=7 z&*(H5t#gwmj1o0_(9i5>Xe`E#!M!mk@a2wQRC&S_Fr$9&!4kKa-%)P%Q^vWkftt_r zq6PkKcyd6Jfcpg#%iD9k18Pfb2PWjeKLj_tD&I1(h$C_FobNI2KZEZFIg%F&PWCv( z-I1o$9*HySH7O`2qc3NoD<+ATGcgpCzA+u-Iz*q;;ksW zG2%T?c;m#|PcM)9{42X$*5F$?+N|nFjP>!tfBc zOLCmX2}9JMAUa9<$4GaA>yJTh3SY;_26ax64eHGi{WkGXewy%-^3zP@^9a{VLP-fYGCwiZ!u_wp|eWfXmON3p9aJaimp!&MG<@ z@qY(8NaOx~pZE`G-OiD(56BnhLXL@i$&xS3i>t(61uL}66Yr|BPQNFg1@enJ3xL4e z#KY$uT8DY684V`(Fv{vg&%$gGLu^PV37znFuM}m(}aV3 zX~q1X0X@V#MeB4_SqEKN2iy}y(o@%Aiugx?8t3aTu$Um3w4EVab$v?2m$tKHdyHgq zjXos5vlN$3Jc;2P&GkEq?>g}o6yJ-=yspz)A^#(i-B5IwNH<0D9{`snKBtjRexD=^ z-y{ri&c_uzPY|AO5uS*_O%~4c+Y$P1guWl4KPMV7Kwq~MEboy2-w^#V@gznoG$*vZ zOY|&ZaF250uA;w6`ZC`i5O0-rYZCgpPcrH26Y_OmS-&+J;}d1R>onhQNN0oe))n4E z;(x06dPK3|{afOFM*N2~r`yDnvHX%^k@O~EFYSLtI-9Ip10J*98t?`2B_?I!eL;92 zE`K1OPsneX=JYx7&==NhJVsQNIn`)=AAvpQ=r-xp$o@F-bFJO|xPLdn(u7 zup3qnW7(<)W{7*!GaJ^L8H9D$%|^4Xux&@G3i_#4DQfm|M=t1lZp-g749#A%e7D{T zAgYk}r5)38tU69;v-nswAW7Gb%b(AsQZ2`>xn2Vi(OU3BVflQrp1$0%&(94I76u9R zK|%utwH=(Qj;L=~?IqXssxX?{3Iql<&)i;e>#jGK;%b5hB`_7ymmSyktu&Wb+zc%* zCw8SN_1#GI1mxwhPdU7)}|u-dR>R=Sg)S@0V{I^BU!jwRz!Q!UrdYK2^0yAn!3 z$PJiz-^uW$tKe*e%VIho4l)K}#ga?ss0zuH;LNPFBxiCA#i9cQuq$F?K-4jXkowcu zU(`aVS$?YNSrwZzcI@q)rbw^39yXMyxnbRWnYvjw_h3V(w``|sJKMNJGn!NrSjJY= z9y5J^vqFrSvA>xfV^-YX%;*MJcPl310EYRD7GJbuRfm;)SjmT#{FN*D$K6-jvC(cN zH-@jYKekueVRal<$6 z5i4TBqFqy!g}S7C_ga5&XYFBm$#Z?be8*|F0=1chy}`&EzxZrvb#-kyFP1vS$7(Bx zI8lZL59<%h8>Y8y1sxaaLr_Zq<52TpYC0YYu~lr{$1S9rg-P++4UOi!)>c< zui znDw$BRO|NEg2MOhM)fNG$n7k^nGIcN4)lH>`k|$9tGL5$=dJ1g=739yryOx5M>*uu zi$MG_w-|rUl{WoPx`Ym{ULIGpU&q+ogqcjZ2L(HxWmaK#IX+c&{o?ECNYUfu;Fffd1Lc9D zjWjQcS1ifJ?wVw^SR^_{Eh_}3!;}9aubNqT7SpTZ6-aq2%*tO5bXn^_d#`e??bi|a zE5v=fAuUDdZ2M{rabQ0@;OREh3k7=VFnHZQh(-;|QTCd6O3NLDzi`>yl;!>L>F!-z<>EMD? z&g-wQhi7R+DES}B`@T)yjdaOMPlt3xW5mul#<8T6e&n>z|0b4SF<;>rB^vL9VxJ^B e(c5kZ`%}IJl~A6Ok#9%IZ=v*jC+5GD5X>0|^w-q@ literal 0 HcmV?d00001 diff --git a/data/shaders/manipulative/Sepia.frag.qsb b/data/shaders/manipulative/Sepia.frag.qsb new file mode 100644 index 0000000000000000000000000000000000000000..32822cb8e90eb51bf03acda67e58c503f7640366 GIT binary patch literal 3276 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 literal 0 HcmV?d00001 diff --git a/data/shaders/manipulative/Solarize.frag.qsb b/data/shaders/manipulative/Solarize.frag.qsb new file mode 100644 index 0000000000000000000000000000000000000000..f47105330001730a882861b39dfc14d0b2e22b83 GIT binary patch literal 3413 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 UUp@u8lZjPWV=$mniij`&0ie6_8~^|S literal 0 HcmV?d00001 diff --git a/data/shaders/manipulative/VHS Tape Noise 2.frag.qsb b/data/shaders/manipulative/VHS Tape Noise 2.frag.qsb index a7aaa169cabe743aef8342f3a163c3a32b538853..a8c674a69cbb1cb893adb94d7c8ed3ecaea42a55 100644 GIT binary patch literal 8608 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 literal 8279 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

Um6SXf(+G#v); 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 A(*OVf literal 4893 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 P=QDNyuloESL$s>xDO&NY diff --git a/data/shaders/manipulative/Video Artifacts.frag.qsb b/data/shaders/manipulative/Video Artifacts.frag.qsb new file mode 100644 index 0000000000000000000000000000000000000000..bd355b293363d36ef626628692e10c3d4b614436 GIT binary patch literal 5223 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 h?rrUOJL_YAVyl2^%KHQ5D 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 literal 0 HcmV?d00001 diff --git a/data/shaders/manipulative/Video Glitch.frag.qsb b/data/shaders/manipulative/Video Glitch.frag.qsb index 23da27d62de54a44b93b7c97c0516b47649e2776..a283ac46fc196d012f123d061454fa5736953878 100644 GIT binary patch literal 6701 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 D5uSfi literal 6442 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 J{{z|6hY!{S8khh8 literal 0 HcmV?d00001 diff --git a/data/shaders/manipulative/Water Ripples.frag.qsb b/data/shaders/manipulative/Water Ripples.frag.qsb new file mode 100644 index 0000000000000000000000000000000000000000..1333697de15fec4c0b954eba10a20d78c3c1168d GIT binary patch literal 4693 zcmZva=OYx31IDGS2Ki>j5sHdP>TJSAcAd=2sI#(5XWyOdbXK;rw~+0!vo}W^m)u#| z+?jWr@#_!xz4<)PtLJ%MJalv(=|1UOmMjSnQ{UEI)Rq}R{l99uYt8?Sww{woUHNFVAJ>*<*D*ws-N z4Yqi$`_7#H;{~0Zgs0lHa|(j8hBP%ylU6PSY7O}2(JCnC=S|JD7TKM<1-N?!VQZ0N zu!csBqi@;vugo8m+?&ikPjfP{dtM(Yd7w%yj$l*#@!YsCyLh?wy*`?cGMM)LWv?-M zD6uiHbu8NQZY^+?RWF38_(oQ`={ci^5DWQ0 zjVXHLj$#7}xCK;f@XJ`_{29;IhQr5rNlr8Xho8o8b)HF!{feaa|M9&r)G%pAOr}0ln%D zTSq%l`8VS-MKVWa-4vH_7=8%*&DB|c=b+X@3UoG_TlS+NGwBJE*nHl1_Hi&ve?_ao z;xU8%Wr-O*w{Z4(^{Ro3xn7m7sG{-MWzSw&qc2CMxekS5obLSg1JZEI2mx?YVhKs* z>sHvTlYRy3Y8^JY*_B$~%;V$F;LhpuD@gVdL8YCK(YgQkyqsneon=%k}OtL4a-KI z)%K3l>EL&^=#|8Jvlp!v)yh%VXpOACn`&ELd8~TYYy{S>25xBkvFuZz&@MuL{gFDf z{Xi+qqWLv>n{kV!NehKPNJ3n(6rA?jiAqB7SqdVkxq%2p%NTu2b}Z@bMvHr9J^V!F zWJX2qkga5d|IDa%iuuU;&B$~b@{&R_cC_u&Eb$ZOS=X7A!hWx{&6<>xA2FezEq|@4 zup)Z^ei7b?d916NtaA$GCQ3Dg>ZP2SyjZNW7wFbg{@Y!@lai_du^HU=BbQY~ ztxk`l`Tb;8Enk_A%n)|MKB7wZGZjC>XX8Q)?Mz{q?_~;!cIG_ zRA!##zLKF~fRs|(_A&s3jp&Aqu=m_w}-0L6<9LW*CNny#PO4 zjyS6_i3;&pZOm(1#p;J20**r#NeLQl17oUNSc<}aDd6}*FVPur42wSF<3AP(N91X! zmUTF<-|g8KKpn9K^-{oAiVWm31pDGh^^Drgk!gpL4gNjW#H6R$1~1_#j_y=?W6n^U zXe{k+24wRK@&Y8asHeh<1ARUD_ws^#ZJ>xdADY?ZaX)M1B?BD}_=I~E9Qj58!oAP1 zCb<9Pfoc$Q$kJ+XeYN7VXtAd={K>H*y?s?4S^7hRH@?+`r-PJ}Kmy+KP@2ZvY*eek zCx-*1+0yBKEU?EPL?}{&;Nij~|9^5SOfvnKBFOHmO80yD^w#b&k383QJiI1`2{fd- zj@okmx1g0vsr1}0ZgJ!3j1NL@iOPsIIb0O(4Sx#38%FRGnST!;z)RGJj_5^0A+6{* z=)4MEmgZxI+Cslz!(kkvvwBk6v}bq;==PPp2c#9f!PAqYfdHP3Y2_2zD+i=Ke;>_L zz3W_NZiY588q^D)_Fo*m=b80cZKT19rS)KMj|^S2_Bc5c_Hk!N5HDw;Z($Cocc}iQ zmFIS3qUa{_8EhLbfuXcmhi%@(H&s{?ldIlg1vhOW;$6XoRG~cJZqL}Y1&&|}V`nUVDEk`JQQMuek z>TdRXH6*SAbqgN`4&70Su`W>X+@wiYAfCdup(LYu+HWRfs>*>F>*P>$;2 zwCdl!wmGb|*J_2_p*3u^LVh2qus>zYge3EvsCDr)3kE1M3eu5I-(D5y;yKBABo`0! zfw!s%n%8f-@S$?mtVZEsYJaWBrtFrN#CZob?d^`W}ALz|DRmsYeVR?+#R)iJ*g zw1;Y9M7VoKky0m+fISwn>+Jc3X2Xa^&oaT_&3C&;w*!#ii8Voy^?k#CO-2S8D%Ua$ zKUW<~^hDE6t~$D@GQfL2lu_jE4n1(bI$czGu^zEd(x`Y1(2T-@1=b@?>@D%rXPioi z9veyu@*?qu%DH71&FRNv|D4@Co(rE-UzmvsmJ2u`iP2l9l_ zY^*nfUGd8sl}GgZKadEw9pZpeP32AiB(aKHSk6Z=ES~fNh}&8zSFeG zaxB4d8nD3H=8?TBTdEtMW?J$jQbmSMl1tb4Jb%f=;oFtJl06?Ambo?lpwqfTcjt2j zamwJ=W@Rj1b#BJj;JL2{#J>Id^asmybIT+=PWKgCG9=1krl?GvP_+Ezz^|d_0$^A$ zo-y|0X6?y@trFq8sd&^fz3J_-LcyTP@pfR%uTOCM>KN>X*wEpP<>FsX85+YMCLIQJ zjiNL?ll+`(;YPtaHFC0(#ZS`W-SXyJXlQHgnBKiJWPyQDB@2sT5$V#6D6Qeq|!$u&sc=Uu4^B25 zW!s0zLR{bPP)p6E65~B2npmd54i)9!r2(EgWW92ndfxmf=43bbi8?OtxWm-Je_cbiK2$BGW z0xU5S6?PoX7{>&V=ky&7$51QZg}Az3PI&$n1F&Hgc##lp(z_IMQc{uV=qzZ!|)h`oHg*W(wu#K7*O z#*Due;vzPiJ?bJEI{SN5H)`D_h)oD1!Lc&XKR05$(8T2>TB8;QOy)`?ejns;{Tep| z&nBp_4;7d8o3Iucdc&3Fp9cqog1U0~?E4LGk^-LIqWx4K(bR!)IK=DFA0MB@wTf41 zk@zee!Ea}}%+b6sKZC(3o>%q@I&(a_gSF606u2;}8D8!q7Ycp=U%kS@j9(6(OL>0SEb?XVtxZWm{L>3wvzjA(GvSrYtoeT6)!=(}fD0gU z8VqVd9|vmSw023-H6BhWn)Mz-ZP;?7Z*?ruVahIHCL+b&P3a3%;2cU1;#xg=>_g^IBp-H$W&I2#=BDKVwh9(Q(rXgN|-Ho**6n5L@vDU1>0BiGtcmzol8Ye`|D1?#ZS@o) zHe|MX#cnsrrbU^Qdg#Kdwse&^4>grX|4^$- zf|=M19fn?LQRSu&0b;q3U5_PPhhCL7A97BeQR24(UJPP zJ@p$s^J{bVpzqAgvwzzO8kfaEWAl#!j|D*EZ|SEsI=n>=+(1#<8kF7DbM2eLh4SLbe%Cr1f@(TnMtQUKJn~J4`tYf-U8h7|_b%XG>H)B4 zL);v;1tuQJHGH+Qpx@kXRAoL$yhzgF*fof};Vnzn6r9C2T@NE9s!TUkf;RzmOcX8R z?0dsT!WoG=!)h!`&-MVq6dZ0Vt~Jm3ldOYz8`vpgd*OOaEG*XN4##ivi;L}VR9snW z`?nWQKakT6gF`cU0E*yCIu-jNYc0tyn2H^Sav>IxzZ08s6v{^F%}6RHXeKU8t;0(h zW6J}f_c5*o>P(bbun0htxgN>!`=M|nP~c|TL!GbjN%xpjgtl+JVJcdxVLqFB(cM(hU@3~2MeL19eJcbX|0nSeqvFEbDmWAw5UE-6emY0gm??3O5nC7GF>=P4-+HlV$YOjR~+7bo`n41 zbihC!UPxVbGo*@WmYPk)+cXiBO{fU3zdU>Alxth5+`r_-%CpnonDdmtN?kBN9_ZM< zd|j&tZM-`sf7z|=SE>sMyW+e>%W*y;Py)Je%8RPV*t!6k|JlMi!Tjor17Fm)(SXH| z*MBtku3#V>1b6W*l}o7UDHPs(@1b=wk*BK79`^7?f5+i6ocX*k_5tVjs}$@{6Cxhd0_Ck(qD^6t(9 z$vI-XlHWuS4%(Z`C44VM7I)KXACi>+4*BF~v1SE$dyKi(;yyLQhEK%0>4taKWlp(; zI8a??^x5nMQ|$Q^Q~Jt(VS0!1!th>0QO(Ml&rw78pMENhj&jp&6QMLd#%&pbb-D9r zYZVW~1+{Y)j?>RnXS>o@D_Qdb{~dN_hc^le?^DFi=7_P5Y>G%`>{)x=ch&R5wgM@Z GFaHB_d8ya{ literal 0 HcmV?d00001 diff --git a/data/tools/stc.py b/data/tools/stc.py index 6a395b8..9d276fb 100644 --- a/data/tools/stc.py +++ b/data/tools/stc.py @@ -181,7 +181,7 @@ def compile(): # Construct and execute the command cmd = [ - qsb, '--glsl', '330', '--hlsl', '50', '--msl', '12', + qsb, '--glsl', '330 es,330,320 es,320', '--hlsl', '50', '--msl', '12', '-o', output_file_path, source_file_path ] @@ -266,11 +266,15 @@ def process(): common_file_contents = re.sub(r'void\s+main\s*\([^)]*\)\s*\{[\s\S]*?\}', '', common_file_contents) # 3. Remove declarations in the common file that match the replacement vars - for var in variables_to_update: - pattern = r'(\w*\s*)(' + var + ')' - replacement = r'\1_\2' + # -- This really needs to be moved into a detection function that checks for + # -- ubuf names within function scopes. This is messing with correctly formatted + # -- defines in the common file + + # for var in variables_to_update: + # pattern = r'(\w*\s*)(' + var + ')' + # replacement = r'\1_\2' - common_file_contents = re.sub(pattern, replacement, common_file_contents) + # common_file_contents = re.sub(pattern, replacement, common_file_contents) for file in files:# Stage for processing, if a shader if file.endswith('.frag') and not file == 'Common.frag': diff --git a/tools/src/manipulative/ACII.frag b/tools/src/manipulative/ACII.frag new file mode 100644 index 0000000..ee68e26 --- /dev/null +++ b/tools/src/manipulative/ACII.frag @@ -0,0 +1,102 @@ +/* +ASCII filter. Current version from July 7, 2024. +Based on the genius implementation by movAX13h and inspired by Acerola's video on ASCII rendering. +Original ones here: +- movAX13h : https://www.shadertoy.com/view/lssGDj +- Acerola : https://www.youtube.com/watch?v=gg40RWiaHRY + +I plan to try implementing the border detection to render ASCII borders, so expect some update someday. + +For more ASCII bitmap generation: https://thrill-project.com/archiv/coding/bitmap/ + +For this version, I focused on understanding the basic ideas and implementing it +in a legible way for me. For this, I have implemented: +- A helper grayscale function; +- A downsampled uv function to help downsample the coordinates, therefore the image; +- The original character function, that now deals more clearly with spacing and modulates +some more the original code. +*/ + +#define CHAR_SIZE 5.0 +#define SPACING 1.0 + +float grayscale(vec3 p){ + /*Convertes a given pixel to grayscale. + Parameters + ---------- + + p : vec3 + rgb pixel. + */ + return 0.299*p.r + 0.587*p.g + 0.114*p.b; +} + +vec2 downsampled_uv(vec2 coord, float d){ + /*Maps the current position to a downsampled position + + Parameters + ---------- + + coord : vec2 + Current pixel position. + d : float + downsample proportion (image will be d times smaller) + */ + + // Below line maps the current position to a downsampled uv + // mod(fragCoord.x, d) is the distance from the current position from the target + // position, so it is just subtracted. + return vec2( coord.x - mod(coord.x, d), coord.y - mod(coord.y, d) ) / iResolution.xy; +} + +float character(uint char, vec2 p){ + /*Returns if current pixel corresponds to character bounds + + Parameters + ---------- + + char : uint + character 2^25 (5x5) bitmap value. + p : vec2 + fragment position. + */ + vec2 local_p = vec2( mod(p.x + 0.5, CHAR_SIZE + 2.0*SPACING), // ALWAYS sum +0.5 + mod(p.y + 0.5, CHAR_SIZE + 2.0*SPACING));// ALWAYS sum +0.5 + + //Checks if pixel position is beyond character limits, if yes then returns 0.0 + if(local_p.x < SPACING || local_p.x >= CHAR_SIZE + (SPACING - 1.0)) + return 0.0; + if(local_p.y < SPACING || local_p.y >= CHAR_SIZE + (SPACING - 1.0)) + return 0.0; + + //Starts at bottom-left position + uint start = 16u; //0b0000000000000000000010000 + uint bit_pos = start >> int(local_p.x - SPACING); // x offset + bit_pos = bit_pos << int(CHAR_SIZE*(local_p.y - SPACING)); // y offset + uint result = bit_pos & char; // acts as a mask to filter only the pixel value + + // bitshifts to the most significant bit so it does not overflow the output + return float(result >> int( CHAR_SIZE-(local_p.x - (SPACING - 1.0)) ) + + int( CHAR_SIZE*(local_p.y - (SPACING) ) ) ); +} + +void mainImage( out vec4 fragColor, in vec2 fragCoord ) +{ + float levels_size = 8.0; + + vec2 uv = downsampled_uv(fragCoord, CHAR_SIZE + 2.0*SPACING); + + /*char levels = ( , . , : , > , * , o , @ , ▄ )*/ + uint levels[8] = uint[8](0u, 16u, 65600u, 4357252u, 163153u, 15255086u, 13195790u, 1048544u); + + vec3 tex = texture(iChannel0, uv).rgb; + float gray = grayscale(tex); + + float ds = 1.0/levels_size; //levels size + + uint final_value = 0u; + for(float i = 0.0; i < levels_size; i++) //Runs for every intensity level + if(gray > 0.0 + i*ds) final_value = levels[int(i)]; + + fragColor = vec4( tex*character(final_value, fragCoord) , 1.0); +} diff --git a/tools/src/manipulative/Aberrating Aberrations.frag b/tools/src/manipulative/Aberrating Aberrations.frag new file mode 100644 index 0000000..bc2ad21 --- /dev/null +++ b/tools/src/manipulative/Aberrating Aberrations.frag @@ -0,0 +1,53 @@ +// https://www.shadertoy.com/view/sldGW2 + +// Fork of "aberrating aberrations on video" by morisil. https://shadertoy.com/view/7tdGW2 +// 2021-11-13 05:24:16 + +// Fork of "depth of field focus study 2" by morisil. https://shadertoy.com/view/flc3zX +// 2021-11-13 05:16:16 + +// Fork of "depth of field focus study" by morisil. https://shadertoy.com/view/sld3zB +// 2021-11-08 19:52:49 + +const float SHAPE_SIZE = .7; +const float CHROMATIC_ABBERATION = .02; +const float ITERATIONS = 5.; +const float INITIAL_LUMA = .6; + +float getColorComponent(in vec2 st, in float modScale, in float blur) { + vec2 modSt = mod(st, 1. / modScale) * modScale * 2. - 1.; + float dist = length(modSt); + float angle = atan(modSt.x, modSt.y); + float shapeMap = smoothstep(SHAPE_SIZE + blur, SHAPE_SIZE - blur, dist); + return shapeMap; +} + +void mainImage(out vec4 fragColor, in vec2 fragCoord) { + vec2 uv = fragCoord / iResolution.xy; + vec2 st = + (2.* fragCoord - iResolution.xy) + / min(iResolution.x, iResolution.y); + + float modScale = 2.; + + vec3 color = vec3(0); + float luma = INITIAL_LUMA; + float blur = .2; + for (float i = 0.; i < ITERATIONS; i++) { + vec2 center = st + vec2(sin(iTime * .4), cos(iTime * .45)) * .3; + //center += pow(length(center), 1.); + vec2 modSt = mod(st, 1. / modScale) * modScale * 2. - 1.; + vec3 shapeColor = vec3( + getColorComponent(center - st * CHROMATIC_ABBERATION, modScale, blur), + getColorComponent(center, modScale, blur), + getColorComponent(center + st * CHROMATIC_ABBERATION, modScale, blur) + ) * luma * texture(iChannel0, (center * vec2(-1, 1) + 1.) * .5).rgb; + st *= 1.3; + color += shapeColor; + color = clamp(color, 0., 1.); + if (color == vec3(1)) break; + luma *= .63; + blur *= .63; + } + fragColor = vec4(color, 1.0); +} diff --git a/tools/src/manipulative/Brannan Filter.frag b/tools/src/manipulative/Brannan Filter.frag new file mode 100644 index 0000000..c091723 --- /dev/null +++ b/tools/src/manipulative/Brannan Filter.frag @@ -0,0 +1,89 @@ +/** + * Brannan Filter by Ruofei Du (DuRuofei.com) + * Demo: https://www.shadertoy.com/view/4lSyDK + * starea @ ShaderToy,License Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License. + * https://creativecommons.org/licenses/by-nc-sa/3.0/ + * + * Reference: + * [1] Overlay function forked from ben's https://www.shadertoy.com/view/XdS3RW + * [2] starea's Dotted Drawing / Sketch Effect: https://www.shadertoy.com/view/ldSyzV + * [3] starea's BrightnessContrastSaturationHue: https://www.shadertoy.com/view/MdjBRy + * + * Write-ups: + * [1] http://blog.ruofeidu.com/implementing-instagram-filters-brannan/ + **/ + +float overlay(in float s, in float d ) +{ + return (d < 0.5) ? 2.0 * s * d : 1.0 - 2.0 * (1.0 - s) * (1.0 - d); +} + +vec3 overlay(in vec3 s, in vec3 d ) +{ + vec3 c; + c.x = overlay(s.x,d.x); + c.y = overlay(s.y,d.y); + c.z = overlay(s.z,d.z); + return c; +} + +float greyScale(in vec3 col) +{ + return dot(col, vec3(0.3, 0.59, 0.11)); +} + +mat3 saturationMatrix( float saturation ) { + vec3 luminance = vec3( 0.3086, 0.6094, 0.0820 ); + float oneMinusSat = 1.0 - saturation; + vec3 red = vec3( luminance.x * oneMinusSat ); + red.r += saturation; + + vec3 green = vec3( luminance.y * oneMinusSat ); + green.g += saturation; + + vec3 blue = vec3( luminance.z * oneMinusSat ); + blue.b += saturation; + + return mat3(red, green, blue); +} + +void levels(inout vec3 col, in vec3 inleft, in vec3 inright, in vec3 outleft, in vec3 outright) { + col = clamp(col, inleft, inright); + col = (col - inleft) / (inright - inleft); + col = outleft + col * (outright - outleft); +} + +void brightnessAdjust( inout vec3 color, in float b) { + color += b; +} + +void contrastAdjust( inout vec3 color, in float c) { + float t = 0.5 - c * 0.5; + color = color * c + t; +} + +void mainImage( out vec4 fragColor, in vec2 fragCoord ) +{ + vec2 uv = fragCoord.xy / iResolution.xy; + vec3 col = texture(iChannel0, uv).rgb; + if (iMouse.z > 0.5) { + fragColor = vec4(col, 1.0); + return; + } + vec3 grey = vec3(greyScale(col)); + col = saturationMatrix(0.7) * col; + grey = overlay(grey, col); + col = mix(grey, col, 0.63); + levels(col, vec3(0., 0., 0.) / 255., vec3(228., 255., 239.) / 255., + vec3(23., 3., 12.) / 255., vec3(255.) / 255.); + brightnessAdjust(col, -0.1); + contrastAdjust(col, 1.05); + vec3 tint = vec3(255., 248., 242.) / 255.; + levels(col, vec3(0., 0., 0.) / 255., vec3(255., 224., 255.) / 255., + vec3(9., 20., 18.) / 255., vec3(255.) / 255.); + col = pow(col, vec3(0.91, 0.91, 0.91*0.94)); + brightnessAdjust(col, -0.04); + contrastAdjust(col, 1.14); + col = tint * col; + fragColor = vec4(col, 1.0); +} diff --git a/tools/src/manipulative/Chroma Blur.frag b/tools/src/manipulative/Chroma Blur.frag new file mode 100644 index 0000000..e293974 --- /dev/null +++ b/tools/src/manipulative/Chroma Blur.frag @@ -0,0 +1,21 @@ +// https://www.shadertoy.com/view/4dl3z8 + +const float blurAmount=.00017; + +void mainImage( out vec4 fragColor, in vec2 fragCoord ) +{ + vec2 xy = fragCoord.xy/iResolution.xy; + vec2 center=iResolution.xy/2.; + vec2 diff=xy-center; + float dist=dot(diff,diff)*0.0004; + vec2 amount=vec2((center.x-xy.x)*blurAmount*dist,0.); + vec4 tx; + + tx=texture(iChannel0, xy+amount*-0.02)*vec4(0.666,0.0,0.0,0.2); + tx+=texture(iChannel0, xy+amount*-0.01)*vec4(0.333,0.25,0.0,0.2); + tx+=texture(iChannel0, xy)*vec4(0.0,0.5,0.0,0.2); + tx+=texture(iChannel0, xy+amount*0.01)*vec4(0.0,0.25,0.333,0.2); + tx+=texture(iChannel0, xy+amount*0.02)*vec4(0.0,0.0,0.667,0.2); + + fragColor = tx; +} diff --git a/tools/src/manipulative/Circular Pixels.frag b/tools/src/manipulative/Circular Pixels.frag new file mode 100644 index 0000000..c523620 --- /dev/null +++ b/tools/src/manipulative/Circular Pixels.frag @@ -0,0 +1,34 @@ +// https://www.shadertoy.com/view/XlSBzm +// by Nikos Papadopoulos, 4rknova / 2018 +// Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License. +#define LUM vec3(.2126, .7152, .0722) + +// Configuration +#define CHROMA_KEY +#define CHROMA_BIAS (00.13) + +#define BGCOLOR vec3(0.03, 0.1, 0.2) +#define GRID_SIZE (35.0) +#define BIAS (10.0) +#define SCALE (32.0) + +void mainImage(out vec4 color, in vec2 fragc) +{ + // Aspect corrected grid size. + vec2 gridsz = GRID_SIZE * vec2(iResolution.x/iResolution.y, 1); + // Grid coordinates with half a unit offset to sample + // the center of the cell. + vec2 pc = fragc.xy / iResolution.xy * gridsz; + vec2 cl = floor(pc)+0.5; + vec3 col = texture(iChannel0, cl / gridsz).rgb; + + // Calculate the sample's distance from the cell center. + float dst = pow(1. - length(pc - cl), BIAS) * SCALE; + float lum = dot(LUM, col.rgb); // luminance + + #ifdef CHROMA_KEY + if (lum > max(col.r, col.b) + CHROMA_BIAS) col = BGCOLOR; + #endif /* CHROMA_KEY */ + + color = vec4(mix(BGCOLOR, col, min(1., dst*lum)), 1); +} diff --git a/tools/src/manipulative/Color Invert.frag b/tools/src/manipulative/Color Invert.frag new file mode 100644 index 0000000..31a5cae --- /dev/null +++ b/tools/src/manipulative/Color Invert.frag @@ -0,0 +1,16 @@ +// https://www.shadertoy.com/view/cdcSz7 + +void mainImage( out vec4 fragColor, in vec2 fragCoord ) +{ + // Normalized pixel coordinates (from 0 to 1) + vec2 uv = fragCoord/iResolution.xy; + + // Get the color of the video at the current pixel + vec3 col = texture(iChannel0, uv).rgb; + + // Invert the color + col = vec3(1.0) - col; + + // Output to screen + fragColor = vec4(col,1.0); +} diff --git a/tools/src/manipulative/Color Reduction.frag b/tools/src/manipulative/Color Reduction.frag new file mode 100644 index 0000000..812811b --- /dev/null +++ b/tools/src/manipulative/Color Reduction.frag @@ -0,0 +1,14 @@ +//https://www.shadertoy.com/view/Ml33Dl +#define CFG_QUALITY 0.1 + +void mainImage(out vec4 fragColor,in vec2 fragCoord) +{ + vec2 uv = fragCoord.xy/iResolution.xy; + vec4 col = texture(iChannel0,uv); + + float colorQuality = 2.0 + (CFG_QUALITY)*8.0; // (1-255) + + // output + vec3 q = vec3(colorQuality); + fragColor = vec4(floor(col.rgb*q)/q,col.a); +} diff --git a/tools/src/manipulative/Desaturate.frag b/tools/src/manipulative/Desaturate.frag new file mode 100644 index 0000000..207ced4 --- /dev/null +++ b/tools/src/manipulative/Desaturate.frag @@ -0,0 +1,40 @@ +// Source: +// http://stackoverflow.com/questions/9320953/what-algorithm-does-photoshop-use-to-desaturate-an-image + +// comment out the algorithm you do not want to use below +#define USE_PHOTOSHOP_ALGORITHM +//#define USE_GENERIC_ALGORITHM + +// Generic algorithm to desaturate images used in most game engines +vec4 generic_desaturate(vec3 color, float factor) +{ + vec3 lum = vec3(0.299, 0.587, 0.114); + vec3 gray = vec3(dot(lum, color)); + return vec4(mix(color, gray, factor), 1.0); +} + +// Algorithm employed by photoshop to desaturate the input +vec4 photoshop_desaturate(vec3 color) +{ + float bw = (min(color.r, min(color.g, color.b)) + max(color.r, max(color.g, color.b))) * 0.5; + return vec4(bw, bw, bw, 1.0); +} + +void mainImage( out vec4 fragColor, in vec2 fragCoord ) +{ + vec2 uv = fragCoord.xy / iResolution.xy; + +# ifdef USE_GENERIC_ALGORITHM + fragColor = generic_desaturate(texture(iChannel0, uv).rgb, 1.0); +# endif + +# ifdef USE_PHOTOSHOP_ALGORITHM + fragColor = photoshop_desaturate(texture(iChannel0, uv).rgb); +# endif + +# ifndef USE_PHOTOSHOP_ALGORITHM +# ifndef USE_GENERIC_ALGORITHM + fragColor = texture(iChannel0, uv); +# endif +# endif +} diff --git a/tools/src/manipulative/EGA.frag b/tools/src/manipulative/EGA.frag new file mode 100644 index 0000000..e107524 --- /dev/null +++ b/tools/src/manipulative/EGA.frag @@ -0,0 +1,73 @@ +// https://www.shadertoy.com/view/ddXBR7 + +// EGA palette colors +vec4 egaPalette[17] = vec4[]( + vec4(0.000, 0.000, 0.000, 1.), // black + vec4(0.000, 0.000, 0.667, 1.), // dk blue + vec4(0.000, 0.667, 0.000, 1.), // dk green + vec4(0.000, 0.667, 0.667, 1.), // dk teal + vec4(0.667, 0.000, 0.000, 1.), // dk red + vec4(0.667, 0.000, 0.667, 1.), // magenta + vec4(0.667, 0.333, 0.000, 1.), // brown + vec4(0.33, 0.33, 0.33, 1.), // lt gray + vec4(0.333, 0.333, 0.333, 1.), // gray + vec4(0.333, 0.333, 1.000, 1.), // lt blue + vec4(0.333, 1.000, 0.333, 1.), // lt green + vec4(0.333, 1.000, 1.000, 1.), // lt cyan + vec4(1.000, 0.333, 0.333, 1.), // lt red (pink?) + vec4(1.000, 0.333, 1.000, 1.), // lt magenta + vec4(1.000, 1.000, 0.333, 1.), // lt yellow + vec4(1.000, 1.000, 1.000, 1.), // white + vec4(0.28, 0.7, 0.2, 1.) // clear index color for green bg +); + +vec4 indexToEGA(vec3 color) +{ + // Find the closest color in the EGA palette + float minDistance = distance(color, egaPalette[0].rgb); + vec4 closestColor = egaPalette[0]; + + for (int i = 1; i < 16; i++) { + float distanceToColor = distance(color, egaPalette[i].rgb); + if (distanceToColor < minDistance) { + minDistance = distanceToColor; + closestColor = egaPalette[i]; + } + } + + return closestColor; +} + +vec4 background(vec4 indexedColor, vec2 uv) { + float threshold = 0.35; + if (distance(indexedColor, vec4(0.28, 0.7, 0.2, 1.)) < threshold) { + indexedColor = egaPalette[11]; + if (uv.y < .5) { + indexedColor = egaPalette[12]; + } + if (uv.x < .5) { + indexedColor = egaPalette[14]; + if (uv.y < .5) { + indexedColor = egaPalette[13]; + } + } + } + return indexedColor; +} + +void mainImage(out vec4 fragColor, in vec2 fragCoord) +{ + // Normalize fragment coordinates to the range [0, 1] + vec2 uv = fragCoord / iResolution.xy; + + // Sample video texture from iChannel0 + vec4 videoColor = texture(iChannel0, uv); + + // Index each color channel to the EGA palette + vec4 indexedColor = indexToEGA(videoColor.rgb); + + vec4 background = background(indexedColor, uv); + + // Set the fragment color using the indexed color + fragColor = background; +} diff --git a/tools/src/manipulative/Fake Thermal.frag b/tools/src/manipulative/Fake Thermal.frag new file mode 100644 index 0000000..bdbffbf --- /dev/null +++ b/tools/src/manipulative/Fake Thermal.frag @@ -0,0 +1,18 @@ +// https://www.shadertoy.com/view/lXBczw + +vec3 thermal(vec3 color) +{ +vec3 invColor = vec3(1.)- color; +float len = pow((length(invColor*2.2))/3.,2.); +vec3 col = vec3(len,len*pow((1.-color.r),2.),0.); +return vec3(len*1.5,len*pow((1.-color.r),2.),0)+dot(col,vec3(0,1,0))/1.5; +} + +void mainImage( out vec4 fragColor, in vec2 fragCoord ) +{ + // Normalized pixel coordinates (from 0 to 1) + vec2 uv = fragCoord/iResolution.xy; + vec3 inColor = texture(iChannel0, uv).xyz; + // Output to screen + fragColor = vec4(thermal(inColor),1.0); +} diff --git a/tools/src/manipulative/Gameboy.frag b/tools/src/manipulative/Gameboy.frag new file mode 100644 index 0000000..c6fb36e --- /dev/null +++ b/tools/src/manipulative/Gameboy.frag @@ -0,0 +1,129 @@ +float size = 128.; // Pixelated resolution x-component +float threshold = .006; // Threshold for dithering (0.0045 found to be optimal) +mat2 dither_2 = mat2(0.,1.,1.,0.); + +struct dither_tile { + float height; +}; + + +vec3[4] gb_colors() { + vec3 gb_colors[4]; + gb_colors[0] = vec3(15., 56., 15.) /255.; + gb_colors[1] = vec3(48., 98., 48.) /255.; + gb_colors[2] = vec3(139., 172., 15.) /255.; + gb_colors[3] = vec3(155., 188., 15.) /255.; + return gb_colors; +} + +float[4] gb_colors_distance(vec3 color) { + float distances[4]; + distances[0] = distance(color, gb_colors()[0]); + distances[1] = distance(color, gb_colors()[1]); + distances[2] = distance(color, gb_colors()[2]); + distances[3] = distance(color, gb_colors()[3]); + return distances; +} + +vec3 closest_gb(vec3 color) { + int best_i = 0; + float best_d = 2.; + + vec3 gb_colors[4] = gb_colors(); + + for (int i = 0; i < 4; i++) { + float dis = distance(gb_colors[i], color);; + if (dis < best_d) { + best_d = dis; + best_i = i; + } + } + + + return gb_colors[best_i]; +} + +vec2 get_tile_sample(vec2 coords, vec2 res) { + return floor(coords * res / 2.) * 2. / res; +} + +vec3[2] gb_2_closest(vec3 color) { + float distances[4] = gb_colors_distance(color); + + int first_i = 0; + float first_d = 2.; + + int second_i = 0; + float second_d = 2.; + + for (int i = 0; i < distances.length(); i++) { + float d = distances[i]; + if (distances[i] <= first_d) { + second_i = first_i; + second_d = first_d; + first_i = i; + first_d = d; + } else if (distances[i] <= second_d) { + second_i = i; + second_d = d; + } + } + vec3 colors[4] = gb_colors(); + vec3 result[2]; + if (first_i < second_i) { + result = vec3[2](colors[first_i], colors[second_i]); + } else { + result = vec3[2](colors[second_i], colors[first_i]); + } + + + return result; +} + +bool needs_dither(vec3 color) { + float distances[4] = gb_colors_distance(color); + + int first_i = 0; + float first_d = 2.; + + int second_i = 0; + float second_d = 2.; + + for (int i = 0; i < distances.length(); i++) { + float d = distances[i]; + if (d <= first_d) { + second_i = first_i; + second_d = first_d; + first_i = i; + first_d = d; + } else if (d <= second_d) { + second_i = i; + second_d = d; + } + } + return abs(first_d - second_d) <= threshold; +} + +void mainImage( out vec4 fragColor, in vec2 fragCoord ) { + + vec2 resolution = vec2(size, iResolution.y / iResolution.x * size); + vec2 uv = floor(fragCoord/iResolution.xy * resolution) / resolution; + + vec2 tileSample = get_tile_sample(uv, resolution); + vec3 sampleColor = texture(iChannel0, tileSample).xyz; + + vec3 colors[2] = vec3[2](vec3(1.,1.,1.), vec3(0.,0.,0.)); + + if (needs_dither(sampleColor)) { + ivec2 ti = ivec2(floor((uv - tileSample) * 2. * resolution)); + //fragColor = vec4(closest_gb(texture(iChannel0, uv).xyz),1.0); + fragColor = vec4(gb_2_closest(sampleColor)[int(dither_2[ti.x][ti.y])], 1.); + + //fragColor = vec4(colors[int(dither_2[ti.x][ti.y])], 1.); + } else { + fragColor = vec4(closest_gb(texture(iChannel0, uv).xyz),1.0); + } + + // Output to screen + +} diff --git a/tools/src/manipulative/Gaussian Blur.frag b/tools/src/manipulative/Gaussian Blur.frag new file mode 100644 index 0000000..3129dbc --- /dev/null +++ b/tools/src/manipulative/Gaussian Blur.frag @@ -0,0 +1,27 @@ +// 16x acceleration of https://www.shadertoy.com/view/4tSyzy +// by applying gaussian at intermediate MIPmap level. + +const int samples = 35, + LOD = 2, // gaussian done on MIPmap at scale LOD + sLOD = 1 << LOD; // tile size = 2^LOD +const float sigma = float(samples) * .25; + +float gaussian(vec2 i) { + return exp( -.5* dot(i/=sigma,i) ) / ( 6.28 * sigma*sigma ); +} + +vec4 blur(sampler2D sp, vec2 U, vec2 scale) { + vec4 O = vec4(0); + int s = samples/sLOD; + + for ( int i = 0; i < s*s; i++ ) { + vec2 d = vec2(i%s, i/s)*float(sLOD) - float(samples)/2.; + O += gaussian(d) * textureLod( sp, U + scale * d , float(LOD) ); + } + + return O / O.a; +} + +void mainImage(out vec4 O, vec2 U) { + O = blur( iChannel0, U/iResolution.xy, 1./iChannelResolution[0].xy ); +} diff --git a/tools/src/manipulative/Italic.frag b/tools/src/manipulative/Italic.frag new file mode 100644 index 0000000..44b7bed --- /dev/null +++ b/tools/src/manipulative/Italic.frag @@ -0,0 +1,14 @@ +// https://www.shadertoy.com/view/ldKfWc +void mainImage( out vec4 fragColor, in vec2 fragCoord ) +{ + vec2 uv = fragCoord / iResolution.xy; + vec2 shift = uv; + float offset = shift.y * .2; + shift.x -= offset - .2; + shift.x -= mod( exp(shift.x), shift.x * .8) * .5; + shift.x += offset - .1; + vec3 img = texture(iChannel0,shift).rgb; + img.bg *= uv.x * shift.x; + img.b += uv.x * .3; + fragColor = vec4(img ,1.0); +} diff --git a/tools/src/manipulative/Median (Fast).frag b/tools/src/manipulative/Median (Fast).frag new file mode 100644 index 0000000..10a3cc7 --- /dev/null +++ b/tools/src/manipulative/Median (Fast).frag @@ -0,0 +1,132 @@ +// fastMedian +// +// Somewhat inspired by Oilify effect in oilArt shader +// https://www.shadertoy.com/view/lsKGDW +// +// Once in a while there is a need to perform median filtering in +// real-time at high frame rate on the GPU. Exact solution can be +// quite complicated and involves array sorting. +// However, if the exact solution is not needed, it is possible +// to estimate median using histogram only. Also, it turns out +// that you can get away with relatively low bin count if histogram +// is built knowing minimum and maximum values upfront via pre-pass. +// +// In real-world applications when shared/thread local storage +// is available such histogram calculation is trivial. In this +// shader due to WebGL limitations the inner loop is unrolled. +// +// Created by Dmitry Andreev - and'2019 +// License Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License. + +//#define RADIUS 2 // 5x5 +#define RADIUS 4 // 9x9 +//#define RADIUS 6 // 13x13 + +#define ADAPTIVE_QUANTIZATION + +//#define BIN_COUNT 4 +//#define BIN_COUNT 8 +#define BIN_COUNT 12 +//#define BIN_COUNT 24 +//#define BIN_COUNT 48 + +// + +#if BIN_COUNT == 4 + #define UNROLL(X) X(0)X(1)X(2)X(3) + +#elif BIN_COUNT == 8 + #define UNROLL(X) X(0)X(1)X(2)X(3)X(4)X(5)X(6)X(7) + +#elif BIN_COUNT == 12 + #define UNROLL(X) X(0)X(1)X(2)X(3)X(4)X(5)X(6)X(7)X(8)X(9)X(10)X(11) + +#elif BIN_COUNT == 24 + #define U00_11(X) X(0)X(1)X(2)X(3)X(4)X(5)X(6)X(7)X(8)X(9)X(10)X(11) + #define U12_23(X) X(12)X(13)X(14)X(15)X(16)X(17)X(18)X(19)X(20)X(21)X(22)X(23) + #define UNROLL(X) U00_11(X)U12_23(X) + +#elif BIN_COUNT == 48 + #define U00_11(X) X(0)X(1)X(2)X(3)X(4)X(5)X(6)X(7)X(8)X(9)X(10)X(11) + #define U12_23(X) X(12)X(13)X(14)X(15)X(16)X(17)X(18)X(19)X(20)X(21)X(22)X(23) + #define U24_35(X) X(24)X(25)X(26)X(27)X(28)X(29)X(30)X(31)X(32)X(33)X(34)X(35) + #define U36_47(X) X(36)X(37)X(38)X(39)X(40)X(41)X(42)X(43)X(44)X(45)X(46)X(47) + #define UNROLL(X) U00_11(X)U12_23(X)U24_35(X)U36_47(X) + +#endif + +vec3 readInput(vec2 uv, int dx, int dy) +{ + // Force nearest sampling for demonstration purposes + vec2 img_res = iChannelResolution[0].xy; + uv = (0.5 + floor(uv * img_res)) / img_res; + + return texture(iChannel0, uv + vec2(dx, dy) / img_res, -10.0).rgb; +} + +// + +void mainImage(out vec4 fragColor, in vec2 fragCoord) +{ + // Fit image to touch screen from outside + vec2 img_res = iChannelResolution[0].xy; + vec2 res = iResolution.xy / img_res; + vec2 img_size = img_res * max(res.x, res.y); + vec2 img_org = 0.5 * (iResolution.xy - img_size); + vec2 uv = (fragCoord - img_org) / img_size; + + vec3 ocol = readInput(uv, 0, 0); + vec3 col = ocol; + + const int r = RADIUS; + + vec4 bins[BIN_COUNT]; + #define INIT(n) bins[n] = vec4(0); + UNROLL(INIT) + +#ifdef ADAPTIVE_QUANTIZATION + float vmin = 1.0; + float vmax = 0.0; + + for (int y = -r; y <= r; y++) + for (int x = -r; x <= r; x++) + { + vec3 img = readInput(uv, x, y); + float v = (img.r + img.g + img.b) / 3.0; + + vmin = min(vmin, v); + vmax = max(vmax, v); + } + +#else + float vmin = 0.0; + float vmax = 1.0; + +#endif + + for (int y = -r; y <= r; y++) + for (int x = -r; x <= r; x++) + { + vec3 img = readInput(uv, x, y); + float v = (img.r + img.g + img.b) / 3.0; + + int i = int(0.5 + ((v - vmin) / (vmax - vmin)) * float(BIN_COUNT)); + + #define UPDATE(n) if (i == n) bins[n] += vec4(img.rgb, 1.0); + UNROLL(UPDATE) + } + + float mid = floor((float(r * 2 + 1) * float(r * 2 + 1)) / 2.0); + float pos = 0.0; + + #define M1(i) col.rgb = pos <= mid && bins[i].a > 0.0 ? + #define M2(i) bins[i].rgb / bins[i].aaa : col.rgb; + #define M3(i) pos += bins[i].a; + #define MEDIAN(i) M1(i)M2(i)M3(i) + UNROLL(MEDIAN) + + // Show original image on click + if (iMouse.w > 0.0) col = ocol; + + fragColor = vec4(col, 1.0); +} diff --git a/tools/src/manipulative/Melting Snow.frag b/tools/src/manipulative/Melting Snow.frag new file mode 100644 index 0000000..2b62d95 --- /dev/null +++ b/tools/src/manipulative/Melting Snow.frag @@ -0,0 +1,51 @@ +//https://www.shadertoy.com/view/tt3XDf +#define SIZE 50.1 + +float rand(vec2 p) +{ + vec3 p3 = fract(vec3(p.xyx) * .1031); + p3 += dot(p3, p3.yzx + 33.33); + return fract((p3.x + p3.y) * p3.z); +} + +void mainImage( out vec4 fragColor, in vec2 fragCoord ) +{ + vec2 uv = fragCoord/iResolution.y; + vec2 ouv = fragCoord/iResolution.xy; + + float m = 0.; + float t = iTime*2.2 + 100.; + + for(float i=0.; i<=1.0; i+=0.25){ + vec2 iuv = uv + vec2(i*.05, 0.); + vec2 ruv = iuv*SIZE; + vec2 id = ceil(ruv); + + for(float y=-1.; y<=1.; y+=1.){ + for(float x=-1.; x<=1.; x+=1.0){ + vec2 nuv = ruv + vec2(x,y); + vec2 nid = id + vec2(x,y); + + nuv.y += t*2. * (rand(vec2(nid.x))*.75+.5) * i; + nuv.y += ceil(mod(nid.x, 3.))*0.3 * t; + + vec2 guv = fract(nuv); + + nuv = floor(nuv) ; + float g = length(guv - vec2(x,y)); + + float v = rand(nuv); + v *= step(0.9, v); + m += smoothstep(v,v-.8, g); + } + } + } + + m = m*.2 + step(1.25, m) *.2 + step(2.0, m) *.1; + + + vec3 col = texture(iChannel0, ouv + m*.125).rgb; + + + fragColor = vec4(col ,1.0); +} diff --git a/tools/src/manipulative/Mirror (Bottom).frag b/tools/src/manipulative/Mirror (Bottom).frag new file mode 100644 index 0000000..38c5fdc --- /dev/null +++ b/tools/src/manipulative/Mirror (Bottom).frag @@ -0,0 +1,14 @@ +/* + * Andor Salga + * March 2014 + * + * Simple demo showing mirror effects. + */ + +void mainImage( out vec4 fragColor, in vec2 fragCoord ) +{ + vec2 p = fragCoord.xy/iResolution.xy; + p.y += step(0.5, p.y) * (0.5-p.y) * 2.0; + + fragColor = texture(iChannel0, p); +} diff --git a/tools/src/manipulative/Mirror (Left).frag b/tools/src/manipulative/Mirror (Left).frag new file mode 100644 index 0000000..28f50d7 --- /dev/null +++ b/tools/src/manipulative/Mirror (Left).frag @@ -0,0 +1,14 @@ +/* + Andor Salga + March 2014 + + Simple demo showing mirror effects. +*/ + +void mainImage( out vec4 fragColor, in vec2 fragCoord ) +{ + vec2 p = fragCoord.xy/iResolution.xy; + p.x -= step(0.5, p.x) * (p.x-0.5) * 2.0; + + fragColor = texture(iChannel0, p); +} diff --git a/tools/src/manipulative/Mirror (Quad).frag b/tools/src/manipulative/Mirror (Quad).frag new file mode 100644 index 0000000..b5d1701 --- /dev/null +++ b/tools/src/manipulative/Mirror (Quad).frag @@ -0,0 +1,15 @@ +/* + * Andor Salga + * March 2014 + * + * Simple demo showing mirror effects. + */ + +void mainImage( out vec4 fragColor, in vec2 fragCoord ) +{ + vec2 p = fragCoord.xy/iResolution.xy; + p.x += step(p.x, 0.5) * (0.5-p.x) * 2.0; + p.y += step(0.5, p.y) * (0.5-p.y) * 2.0; + + fragColor = texture(iChannel0, p); +} diff --git a/tools/src/manipulative/Mirror (Right).frag b/tools/src/manipulative/Mirror (Right).frag new file mode 100644 index 0000000..d0bd68b --- /dev/null +++ b/tools/src/manipulative/Mirror (Right).frag @@ -0,0 +1,13 @@ +/* + * Andor Salga + * March 2014 + * + * Simple demo showing mirror effects. + */ + +void mainImage( out vec4 fragColor, in vec2 fragCoord ) +{ + vec2 p = fragCoord.xy/iResolution.xy; + p.x += step(p.x, 0.5) * (0.5-p.x) * 2.0; + fragColor = texture(iChannel0, p); +} diff --git a/tools/src/manipulative/Mirror (Top).frag b/tools/src/manipulative/Mirror (Top).frag new file mode 100644 index 0000000..7d5c9cf --- /dev/null +++ b/tools/src/manipulative/Mirror (Top).frag @@ -0,0 +1,14 @@ +/* + * Andor Salga + * March 2014 + * + * Simple demo showing mirror effects. + */ + +void mainImage( out vec4 fragColor, in vec2 fragCoord ) +{ + vec2 p = fragCoord.xy/iResolution.xy; + p.y -= step(p.y, 0.5) * (p.y-.5) * 2.0; + + fragColor = texture(iChannel0, p); +} diff --git a/tools/src/manipulative/Nearest Neighbor.frag b/tools/src/manipulative/Nearest Neighbor.frag new file mode 100644 index 0000000..0896d6b --- /dev/null +++ b/tools/src/manipulative/Nearest Neighbor.frag @@ -0,0 +1,68 @@ +const int half_width = 5; + +// Calculate color distance +float CalcDistance(in vec3 c0, in vec3 c1) { + vec3 sub = c0 - c1; + return dot(sub, sub); +} + +// Symmetric Nearest Neighbor +vec3 CalcSNN(in vec2 fragCoord) { + vec2 src_size = iResolution.xy; + vec2 inv_src_size = 1.0f / src_size; + vec2 uv = fragCoord * inv_src_size; + + vec3 c0 = texture(iChannel0, uv).rgb; + + vec4 sum = vec4(0.0f, 0.0f, 0.0f, 0.0f); + + for (int i = 0; i <= half_width; ++i) { + vec3 c1 = texture(iChannel0, uv + vec2(+i, 0) * inv_src_size).rgb; + vec3 c2 = texture(iChannel0, uv + vec2(-i, 0) * inv_src_size).rgb; + + float d1 = CalcDistance(c1, c0); + float d2 = CalcDistance(c2, c0); + if (d1 < d2) { + sum.rgb += c1; + } else { + sum.rgb += c2; + } + sum.a += 1.0f; + } + for (int j = 1; j <= half_width; ++j) { + for (int i = -half_width; i <= half_width; ++i) { + vec3 c1 = texture(iChannel0, uv + vec2(+i, +j) * inv_src_size).rgb; + vec3 c2 = texture(iChannel0, uv + vec2(-i, -j) * inv_src_size).rgb; + + float d1 = CalcDistance(c1, c0); + float d2 = CalcDistance(c2, c0); + if (d1 < d2) { + sum.rgb += c1; + } else { + sum.rgb += c2; + } + sum.a += 1.0f; + } + } + return sum.rgb / sum.a; +} + +void mainImage( out vec4 fragColor, in vec2 fragCoord ) +{ + vec2 src_size = iResolution.xy; + vec2 inv_src_size = 1.0f / src_size; + vec2 uv = fragCoord * inv_src_size; + + float center = iMouse.x * inv_src_size.x; + float width = 3.0f * inv_src_size.x * 0.5f; + + if (uv.x <= center - width) { + fragColor.rgb = CalcSNN(fragCoord); + } else if (uv.x >= center + width) { + fragColor.rgb = CalcSNN(fragCoord); + } else { + fragColor.rgb = vec3(0, 0, 0); + } + + fragColor.a = 1.0f; +} diff --git a/tools/src/manipulative/Night Vision.frag b/tools/src/manipulative/Night Vision.frag new file mode 100644 index 0000000..f166d48 --- /dev/null +++ b/tools/src/manipulative/Night Vision.frag @@ -0,0 +1,25 @@ +// by Nikos Papadopoulos, 4rknova / 2013 +// WTFPL + +float hash(in float n) { return fract(sin(n)*43758.5453123); } + +void mainImage( out vec4 fragColor, in vec2 fragCoord ) +{ + vec2 p = fragCoord.xy / iResolution.xy; + + vec2 u = p * 2. - 1.; + vec2 n = u * vec2(iResolution.x / iResolution.y, 1.0); + vec3 c = texture(iChannel0, p).xyz; + + + // flicker, grain, vignette, fade in + c += sin(hash(iTime)) * 0.01; + c += hash((hash(n.x) + n.y) * iTime) * 0.5; + c *= smoothstep(length(n * n * n * vec2(0.075, 0.4)), 1.0, 0.4); + c *= smoothstep(0.001, 3.5, iTime) * 1.5; + + c = dot(c, vec3(0.2126, 0.7152, 0.0722)) + * vec3(0.2, 1.5 - hash(iTime) * 0.1,0.4); + + fragColor = vec4(c,1.0); +} diff --git a/tools/src/manipulative/Oil Painting.frag b/tools/src/manipulative/Oil Painting.frag new file mode 100644 index 0000000..1ff7589 --- /dev/null +++ b/tools/src/manipulative/Oil Painting.frag @@ -0,0 +1,97 @@ +// https://www.shadertoy.com/view/ddlXz4 + +// +// +// MMMMMMMMMMMMMMMMMMMMMMMMMMMM +// MM. .MM +// MM. .MMMMMMMMMMMMMMMMMMMMMM. .MM +// MM. .MMMMMMMMMMMMMMMMMMMMMMMM. .MM +// MM. .MMMM MMMMMMM MMM. .MM +// MM. .MMM MMMMMM MMM. .MM +// MM. .MmM MMMM MMM. .MM +// MM. .MMM MM MMM. .MM +// MM. .MMM M MMM. .MM +// MM. .MMM MMM. .MM +// MM. .MMM MMM. .MM +// MM. .MMM M MMM. .MM +// MM. .MMM MM MMM. .MM +// MM. .MMM MMM MMM. .MM +// MM. .MMM MMMM MMM. .MM +// MM. .MMMMMMMMMMMMMMMMMMMMMMMM. .MM +// MM. .MMMMMMMMMMMMMMMMMMMMMM. .MM +// MM. .MM +// MMMMMMMMMMMMMMMMMMMMMMMMMMMM +// +// +// Adaptation pour Natron par F. Fernandez +// Code original : crok_kuwahara Matchbox pour Autodesk Flame + +// Adapted to Natron by F.Fernandez +// Original code : crok_kuwahara Matchbox for Autodesk Flame + + + +// iChannel0: Source, filter = nearest +// BBox: iChannel0 + + +int radius=12; // radius :, min=0, max=100. + +void mainImage( out vec4 fragColor, in vec2 fragCoord ) +{ + vec2 iChannel0_size = vec2(iResolution.x, iResolution.y); + vec2 uv = fragCoord.xy / iResolution.xy; + float n = float((radius + 1) * (radius + 1)); + + vec3 m[4]; + vec3 s[4]; + for (int k = 0; k < 4; ++k) { + m[k] = vec3(0.0); + s[k] = vec3(0.0); + } + + for (int j = -radius; j <= 0; ++j) { + for (int i = -radius; i <= 0; ++i) { + vec3 c = texture(iChannel0, uv + vec2(i,j) / iChannel0_size).rgb; + m[0] += c; + s[0] += c * c; + } + } + + for (int j = -radius; j <= 0; ++j) { + for (int i = 0; i <= radius; ++i) { + vec3 c = texture(iChannel0, uv + vec2(i,j) / iChannel0_size).rgb; + m[1] += c; + s[1] += c * c; + } + } + + for (int j = 0; j <= radius; ++j) { + for (int i = 0; i <= radius; ++i) { + vec3 c = texture(iChannel0, uv + vec2(i,j) / iChannel0_size).rgb; + m[2] += c; + s[2] += c * c; + } + } + + for (int j = 0; j <= radius; ++j) { + for (int i = -radius; i <= 0; ++i) { + vec3 c = texture(iChannel0, uv + vec2(i,j) / iChannel0_size).rgb; + m[3] += c; + s[3] += c * c; + } + } + + + float min_sigma2 = 1e+2; + for (int k = 0; k < 4; ++k) { + m[k] /= n; + s[k] = abs(s[k] / n - m[k] * m[k]); + + float sigma2 = s[k].r + s[k].g + s[k].b; + if (sigma2 < min_sigma2) { + min_sigma2 = sigma2; + fragColor = vec4(m[k], 1.0); + } + } +} diff --git a/tools/src/manipulative/Old Memory.frag b/tools/src/manipulative/Old Memory.frag new file mode 100644 index 0000000..df52ece --- /dev/null +++ b/tools/src/manipulative/Old Memory.frag @@ -0,0 +1,181 @@ +// https://www.shadertoy.com/view/7sd3zX + +// +// Description : Array and textureless GLSL 2D simplex noise function. +// Author : Ian McEwan, Ashima Arts. +// Maintainer : stegu +// Lastmod : 20110822 (ijm) +// License : Copyright (C) 2011 Ashima Arts. All rights reserved. +// Distributed under the MIT License. See LICENSE file. +// https://github.com/ashima/webgl-noise +// https://github.com/stegu/webgl-noise +// + +vec3 mod289(vec3 x) { + return x - floor(x * (1.0 / 289.0)) * 289.0; +} + +vec2 mod289(vec2 x) { + return x - floor(x * (1.0 / 289.0)) * 289.0; +} + +vec3 permute(vec3 x) { + return mod289(((x*34.0)+10.0)*x); +} + +float snoise(vec2 v) +{ + const vec4 C = vec4(0.211324865405187, // (3.0-sqrt(3.0))/6.0 + 0.366025403784439, // 0.5*(sqrt(3.0)-1.0) + -0.577350269189626, // -1.0 + 2.0 * C.x + 0.024390243902439); // 1.0 / 41.0 + // First corner + vec2 i = floor(v + dot(v, C.yy) ); + vec2 x0 = v - i + dot(i, C.xx); + + // Other corners + vec2 i1; + //i1.x = step( x0.y, x0.x ); // x0.x > x0.y ? 1.0 : 0.0 + //i1.y = 1.0 - i1.x; + i1 = (x0.x > x0.y) ? vec2(1.0, 0.0) : vec2(0.0, 1.0); + // x0 = x0 - 0.0 + 0.0 * C.xx ; + // x1 = x0 - i1 + 1.0 * C.xx ; + // x2 = x0 - 1.0 + 2.0 * C.xx ; + vec4 x12 = x0.xyxy + C.xxzz; + x12.xy -= i1; + + // Permutations + i = mod289(i); // Avoid truncation effects in permutation + vec3 p = permute( permute( i.y + vec3(0.0, i1.y, 1.0 )) + + i.x + vec3(0.0, i1.x, 1.0 )); + + vec3 m = max(0.5 - vec3(dot(x0,x0), dot(x12.xy,x12.xy), dot(x12.zw,x12.zw)), 0.0); + m = m*m ; + m = m*m ; + + // Gradients: 41 points uniformly over a line, mapped onto a diamond. + // The ring size 17*17 = 289 is close to a multiple of 41 (41*7 = 287) + + vec3 x = 2.0 * fract(p * C.www) - 1.0; + vec3 h = abs(x) - 0.5; + vec3 ox = floor(x + 0.5); + vec3 a0 = x - ox; + + // Normalise gradients implicitly by scaling m + // Approximation of: m *= inversesqrt( a0*a0 + h*h ); + m *= 1.79284291400159 - 0.85373472095314 * ( a0*a0 + h*h ); + + // Compute final noise value at P + vec3 g; + g.x = a0.x * x0.x + h.x * x0.y; + g.yz = a0.yz * x12.xz + h.yz * x12.yw; + return 130.0 * dot(m, g); +} + +vec4 SCREEN(in vec4 src, in vec4 dst){ + return ( src + dst ) - ( src * dst ); +} + +vec3 Blur(sampler2D tex, vec2 uv, float blurSize, float directions, float quality){ + float TWO_PI = 6.28318530718; + + vec2 radius = blurSize/iResolution.xy; + vec3 res = texture(tex, uv).rgb; + for(float i=1.0/quality; i<=1.0; i+=1.0/quality) + { + for( float d=0.0; d0.3){ + float dirt = + texture(iChannel1,uv*0.1).r * + texture(iChannel1,uv*0.01).r * + texture(iChannel1,uv*0.002).r * + 1.0; + res = 1.0 - smoothstep(0.4,0.6, dirt); + } + return res; +} + +float FpsTime(float time, float fps){ + time = mod(time, 60.0); + time = float(int(time*fps)) / fps; + return time; +} + + +void mainImage( out vec4 fragColor, in vec2 fragCoord ) +{ + vec2 uv = fragCoord/iResolution.xy; + vec2 mUV = iMouse.xy/iResolution.xy; + + mUV = vec2(0.5,0.7); /*fix mouse pos for thumbnail*/ + + vec4 col; + + float time = FpsTime(iTime, 12.); + fragColor = vec4(mod(uv.x+time*0.5, 0.1)*10.); + //return; /* Debug FpsTime */ + + vec2 suv = ShakeUV(uv, time); + fragColor = vec4(mod(suv.xy,0.1)*10., 0., 1.0); + //return; /* Debug ShakeUV */ + + //float grain = mix(1.0, fract(sin(dot(suv.xy+time,vec2(12.9898,78.233))) * 43758.5453), 0.25); /* random */ + float grain = mix(1.0, snoise(suv.xy*1234.), 0.15); /* simplex noise */ + fragColor = vec4(vec3(grain), 1.0); + //return; /* Debug grain */ + + vec3 color = texture(iChannel0, suv).rgb; + color *= grain; + + float Size = mUV.x * 8.; + float Directions = 16.0; + float Quality = 3.0; + vec3 blur = Blur(iChannel0, suv, Size, Directions, Quality); + blur *= grain; + + float Threshold = mUV.y; + vec3 FilterRGB = normalize(vec3(1.5,1.2,1.0)); + float HighlightPower = 3.0; + HighlightPower *= 1. + fract(sin(time)*3.1415) * 0.3; + vec3 highlight = clamp(color -Threshold,0.0,1.0)/(1.0-Threshold); + highlight = blur * Threshold * FilterRGB * HighlightPower; + + /* dirt */ + float dirt = filmDirt(uv, time); + fragColor = vec4(vec3(dirt), 1.0); + //return; /* Debug dirt */ + + col = SCREEN(vec4(color,1.0), vec4(highlight,1.0)); + //col = vec4(highlight,1.0); + //col = vec4(blur,1.0); + col *= dirt; + + vec2 v = uv * (1.0 - uv.yx); + float vig = v.x*v.y * 15.0; + vig = pow(vig, 0.5); + + fragColor = col * vig; + //fragColor = uv.x>0.5 ? colR : colL; +} diff --git a/tools/src/manipulative/Perlin Noise.frag b/tools/src/manipulative/Perlin Noise.frag new file mode 100644 index 0000000..b94c5c3 --- /dev/null +++ b/tools/src/manipulative/Perlin Noise.frag @@ -0,0 +1,47 @@ +// https://www.shadertoy.com/view/43c3zf + +vec2 GetGradient(vec2 intPos, float t) { + + // Uncomment for calculated rand + //float rand = fract(sin(dot(intPos, vec2(12.9898, 78.233))) * 43758.5453);; + + // Texture-based rand (a bit faster on my GPU) + float rand = texture(iChannel0, intPos / 64.0).r; + + // Rotate gradient: random starting rotation, random rotation rate + float angle = 6.283185 * rand + 4.0 * t * rand; + return vec2(cos(angle), sin(angle)); +} + +float Pseudo3dNoise(vec3 pos) { + vec2 i = floor(pos.xy); + vec2 f = pos.xy - i; + vec2 blend = f * f * (3.0 - 2.0 * f); + float noiseVal = + mix( + mix( + dot(GetGradient(i + vec2(0, 0), pos.z), f - vec2(0, 0)), + dot(GetGradient(i + vec2(1, 0), pos.z), f - vec2(1, 0)), + blend.x), + mix( + dot(GetGradient(i + vec2(0, 1), pos.z), f - vec2(0, 1)), + dot(GetGradient(i + vec2(1, 1), pos.z), f - vec2(1, 1)), + blend.x), + blend.y + ); + return noiseVal / 0.7; // normalize to about [-1..1] +} + +void mainImage(out vec4 fragColor, in vec2 fragCoord) { + vec2 noise_uv = fragCoord.xy/iResolution.y; + float noiseVal = 0.5 + 0.5 * Pseudo3dNoise(vec3(noise_uv * 10.0, iTime)); + + vec2 uv = fragCoord/iResolution.xy; + float noiseWeight = 0.05; + uv.x += noiseVal * noiseWeight; + uv.y += noiseVal * noiseWeight; + vec3 col = texture(iChannel0,uv).rgb; + + fragColor.rgb = vec3(col); + +} diff --git a/tools/src/manipulative/Pixelation.frag b/tools/src/manipulative/Pixelation.frag new file mode 100644 index 0000000..d99ed30 --- /dev/null +++ b/tools/src/manipulative/Pixelation.frag @@ -0,0 +1,17 @@ +// https://www.shadertoy.com/view/ldVSW1 +#define PIXEL_SIZE 5.0 + +void mainImage( out vec4 fragColor, in vec2 fragCoord ) { + vec2 uv = fragCoord.xy / iResolution.xy; + + float plx = iResolution.x * PIXEL_SIZE / 500.0; + float ply = iResolution.y * PIXEL_SIZE / 275.0; + + float dx = plx * (1.0 / iResolution.x); + float dy = ply * (1.0 / iResolution.y); + + uv.x = dx * floor(uv.x / dx); + uv.y = dy * floor(uv.y / dy); + + fragColor = texture(iChannel0, uv); +} diff --git a/tools/src/manipulative/Posterize.frag b/tools/src/manipulative/Posterize.frag new file mode 100644 index 0000000..78b5762 --- /dev/null +++ b/tools/src/manipulative/Posterize.frag @@ -0,0 +1,34 @@ +/* + +Copyright (c) 2023 Roel Bartstra + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +*/ + +void mainImage( out vec4 fragColor, in vec2 fragCoord ) +{ + // Normalized pixel coordinates (from 0 to 1) + vec2 uv = fragCoord/iResolution.xy; + + // Sample input texture + vec3 input_color = texture(iChannel0, uv).rgb; + + // The actual "posterize" + const float color_length_steps = 5.0; + float color_length = length(input_color.rgb); + vec3 color_direction = input_color.rgb / color_length; + float stepped_color_length = round(color_length * color_length_steps) / color_length_steps; + vec3 posterized_color = stepped_color_length * color_direction; + + // Debugging: Use left mouse for image slite to compare with input. + float debug_mask = step(uv.x, iMouse.x / iResolution.x); + vec3 output_color = mix(posterized_color, input_color, debug_mask); + + // Output to screen + fragColor = vec4(output_color, 1); +} diff --git a/tools/src/manipulative/Quadtree.frag b/tools/src/manipulative/Quadtree.frag new file mode 100644 index 0000000..c45aa1b --- /dev/null +++ b/tools/src/manipulative/Quadtree.frag @@ -0,0 +1,147 @@ +// @license MIT +// @author ciphrd +// +// This algorithm is sort of a probabilistic quad tree construction where quad divisions are +// added if the color variation (variance) in a quad is too important. +// +// The color variation is computed by taking n samples within the quad, and then we compute the +// variance on each color component of the samples. +// +// +// Limitations +// +// If a certain area, which is large, has a small section of it being detailed while the rest +// is pretty much linear, divisions might not be added. Because this algorithm picks random +// points in the quad, the small detailed section has little to no infuence on the overall +// variations of the colors in the quad. +// You can observe this behavior on the Google logo when it appears. +// + + +// the number of divisions at the start +#define MIN_DIVISIONS 4.0 + +// the numer of possible quad divisions +#define MAX_ITERATIONS 8 + +// the number of samples picked fter each quad division +#define SAMPLES_PER_ITERATION 55 +#define F_SAMPLES_PER_ITERATION 54.95 + +// useless, kept it for reference for a personal usage +#define MAX_SAMPLES 200 + +// threshold min, max given the mouse.x +#define THRESHOLD_MIN 0.0001 +#define THRESHOLD_MAX 0.01 + +vec2 centrePoints[4*4*4*4*4*4]; +int centrePointCount = 0; + + + +// taken from http://glslsandbox.com/e#41197.0 +vec2 hash22(vec2 p) { + float n = sin(dot(p, vec2(41, 289))); + return fract(vec2(262144, 32768)*n); +} + + +// Computes the color variation on a quad division of the space +// Basically, this method takes n random samples in a given quad, compute the average +// of each color component of the samples. +// Then, it computes the variance of the samples +// This is the way I thought for computing the color variation, there might be others, +// and there must be better ones +vec4 quadColorVariation (in vec2 center, in float size) { + // this array will store the grayscale of the samples + vec3 samplesBuffer[SAMPLES_PER_ITERATION]; + + // the average of the color components + vec3 avg = vec3(0); + + // we sample the current space by picking pseudo random samples in it + for (int i = 0; i < SAMPLES_PER_ITERATION; i++) { + float fi = float(i); + // pick a random 2d point using the center of the active quad as input + // this ensures that for every point belonging to the active quad, we pick the same samples + vec2 r = hash22(center.xy + vec2(fi, 0.0)) - 0.5; + vec3 sp = texture(iChannel0, center + r * size).rgb; + avg+= sp; + samplesBuffer[i] = sp; + } + + avg/= F_SAMPLES_PER_ITERATION; + + // estimate the color variation on the active quad by computing the variance + vec3 var = vec3(0); + for (int i = 0; i < SAMPLES_PER_ITERATION; i++) { + var+= pow(samplesBuffer[i], vec3(2.0)); + } + var/= F_SAMPLES_PER_ITERATION; + var-= pow(avg, vec3(2.0)); + + return vec4(avg, (var.x+var.y+var.z)/3.0); +} + + +void mainImage( out vec4 fragColor, in vec2 fragCoord ) +{ + // Normalized pixel coordinates (from 0 to 1) + vec2 uv = fragCoord/iResolution.xy; + + float threshold = mix(THRESHOLD_MIN, THRESHOLD_MAX, iMouse.x / iResolution.x); + + // number of space divisions + float divs = MIN_DIVISIONS; + + // the center of the active quad - we initialze with 2 divisions + vec2 quadCenter = (floor(uv * divs) + 0.5) / divs; + float quadSize = 1. / divs; // the length of a side of the active quad + + // we store average and variance here + vec4 quadInfos = vec4(0); + + for (int i = 0; i < MAX_ITERATIONS; i++) { + quadInfos = quadColorVariation(quadCenter, quadSize); + + // if the variance is lower than the threshold, current quad is outputted + if (quadInfos.w < threshold) { + if(centrePointCount < MAX_ITERATIONS) centrePoints[centrePointCount++] = quadCenter; + + break; + } + + // otherwise, we divide the space again + divs*= 2.0; + quadCenter = (floor(uv * divs) + 0.5) / divs; + quadSize/= 2.0; + } + + + + vec4 color = texture(iChannel0, uv); + + // the coordinates of the quad + vec2 nUv = fract(uv * divs); + + // we create lines from the uv coordinates + vec2 lWidth = vec2(0.5/iResolution.x, 0.5/iResolution.y); + vec2 uvAbs = abs(nUv-0.5); + float s = step(0.5-uvAbs.x, lWidth.x*divs) + step(0.5-uvAbs.y, lWidth.y*divs); + + // we smooth the color between average and texture initial + color.rgb = mix(color.rgb, quadInfos.rgb, uv.x); + + // we smooth the lines over the x axis + // s*= pow(1. - uv.x, 4.0); + + // for black lines, we just subtract + color.r = mod(color.r, s); + color.g = mod(color.g, s); + color.b = mod(color.b, s); + color.a = mod(color.a, s); + + // Output to screen + fragColor = color; +} diff --git a/tools/src/manipulative/Radial Blur.frag b/tools/src/manipulative/Radial Blur.frag new file mode 100644 index 0000000..8539bad --- /dev/null +++ b/tools/src/manipulative/Radial Blur.frag @@ -0,0 +1,31 @@ +// by Nikos Papadopoulos, 4rknova / 2017 +// WTFPL + +#define JITTER +#define MOUSE + +float hash(in vec2 p) { return fract(sin(dot(p,vec2(283.6,127.1))) * 43758.5453);} + +#ifdef MOUSE + #define CENTER (iMouse.xy/iResolution.xy) +#else + #define CENTER vec2(.5) +#endif + +#define SAMPLES 10 +#define RADIUS .01 + +void mainImage(out vec4 fragColor, in vec2 fragCoord) { + vec2 uv = fragCoord / iResolution.xy; + vec3 res = vec3(0); + for(int i = 0; i < SAMPLES; ++i) { + res += texture(iChannel0, uv).xyz; + vec2 d = CENTER-uv; +#ifdef JITTER + d *= .5 + .01*hash(d*iTime); +#endif + uv += d * RADIUS; + } + + fragColor = vec4(res/float(SAMPLES), 1); +} diff --git a/tools/src/manipulative/Rain Drops.frag b/tools/src/manipulative/Rain Drops.frag new file mode 100644 index 0000000..80843de --- /dev/null +++ b/tools/src/manipulative/Rain Drops.frag @@ -0,0 +1,57 @@ +// Author: Élie Michel +// License: CC BY 3.0 +// July 2017 + +vec2 rand(vec2 c){ + mat2 m = mat2(12.9898,.16180,78.233,.31415); + return fract(sin(m * c) * vec2(43758.5453, 14142.1)); +} + +vec2 noise(vec2 p){ + vec2 co = floor(p); + vec2 mu = fract(p); + mu = 3.*mu*mu-2.*mu*mu*mu; + vec2 a = rand((co+vec2(0.,0.))); + vec2 b = rand((co+vec2(1.,0.))); + vec2 c = rand((co+vec2(0.,1.))); + vec2 d = rand((co+vec2(1.,1.))); + return mix(mix(a, b, mu.x), mix(c, d, mu.x), mu.y); +} + +void mainImage( out vec4 f, in vec2 c ) +{ + vec2 u = c / iResolution.xy, + v = (c*.1)/ iResolution.xy, + n = noise(v*200.); // Displacement + + f = textureLod(iChannel0, u, 2.5); + + // Loop through the different inverse sizes of drops + for (float r = 4. ; r > 0. ; r--) { + vec2 x = iResolution.xy * r * .015, // Number of potential drops (in a grid) + p = 6.28 * u * x + (n - .5) * 2., + s = sin(p); + + // Current drop properties. Coordinates are rounded to ensure a + // consistent value among the fragment of a given drop. + //vec4 d = texture(iChannel1, round(u * x - 0.25) / x); + vec2 v = round(u * x - 0.25) / x; + vec4 d = vec4(noise(v*200.), noise(v)); + + // Drop shape and fading + float t = (s.x+s.y) * max(0., 1. - fract(iTime * (d.b + .1) + d.g) * 2.);; + + // d.r -> only x% of drops are kept on, with x depending on the size of drops + if (d.r < (5.-r)*.08 && t > .5) { + // Drop normal + vec3 v = normalize(-vec3(cos(p), mix(.2, 2., t-.5))); + // fragColor = vec4(v * 0.5 + 0.5, 1.0); // show normals + + // Poor man's refraction (no visual need to do more) + f = texture(iChannel0, u - v.xy * .3); + } + } + + // Debug noise function + //f = vec4(n, 0.0, 1.0); +} diff --git a/tools/src/manipulative/Rainbow Filter.frag b/tools/src/manipulative/Rainbow Filter.frag new file mode 100644 index 0000000..a23995e --- /dev/null +++ b/tools/src/manipulative/Rainbow Filter.frag @@ -0,0 +1,36 @@ +//https://www.shadertoy.com/view/MdffDS +#define posterSteps 4.0 +#define lumaMult 0.5 +#define timeMult 0.15 +#define BW 0 + +float rgbToGray(vec4 rgba) { + const vec3 W = vec3(0.2125, 0.7154, 0.0721); + return dot(rgba.xyz, W); +} + +vec3 hsv2rgb(vec3 c) { + vec4 K = vec4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0); + vec3 p = abs(fract(c.xxx + K.xyz) * 6.0 - K.www); + return c.z * mix(K.xxx, clamp(p - K.xxx, 0.0, 1.0), c.y); +} + +void mainImage( out vec4 fragColor, in vec2 fragCoord ) +{ + vec2 uv = fragCoord.xy / iResolution.xy; + vec4 color = texture(iChannel0, uv); + float luma = rgbToGray(color) * lumaMult; + float lumaIndex = floor(luma * posterSteps); + float lumaFloor = lumaIndex / posterSteps; + float lumaRemainder = (luma - lumaFloor) * posterSteps; + if(mod(lumaIndex, 2.) == 0.) lumaRemainder = 1.0 - lumaRemainder; // flip luma remainder for smooth color transitions + float timeInc = iTime * timeMult; + float lumaCycle = mod(luma + timeInc, 1.); + vec3 roygbiv = hsv2rgb(vec3(lumaCycle, 1., lumaRemainder)); + if(BW == 1) { + float bw = rgbToGray(vec4(roygbiv, 1.)); + fragColor = vec4(vec3(bw), 1.0); + } else { + fragColor = vec4(roygbiv, 1.0); + } +} diff --git a/tools/src/manipulative/Randomized Transitions (x2).frag b/tools/src/manipulative/Randomized Transitions (x2).frag new file mode 100644 index 0000000..b83f2eb --- /dev/null +++ b/tools/src/manipulative/Randomized Transitions (x2).frag @@ -0,0 +1,710 @@ +/* + + Video Transitions v2.0 by Mark Craig (Copyright © 2022) + + I originally wrote this as a "filter" to create transition frames + for videos (C program which outputted PPM files). But eventually, + I figured it could be relatively easily ported to GLSL - this is the + result. + +*/ + +int n = 100; // number of "frames" in transition +float sa = .05; // smooth amount - size of smooth edges +bool roto = true; // if true, rotate transitions that can optionally rotate +float rota = 360.0; // amount of rotation from start to end of transition +int rn = 1, rd = 0; // select based on whether to start with full +//int rn = 0, rd = -1; // frame of source1 (only for some transitions) +//bool altdir = false; // if true, change direction of rolls +bool altdir = true; // if true, change direction of rolls +int alttype = 0; // alternate slide up center type (0-8 or 9-17 for slide in) + +#define SPEEDADJ .375 +//#define NEEDMOD 1 +//#define SELECTTRANS // uncomment to enable @morimea's transition selector mods + // If selector mods are chosen, click and hold down left + // mouse button on desired transition + +#define imod(a,b) (int((float(a)-(float(b)*floor(float(a)/float(b)))))) + +#define iGlobalTime (iTime / SPEEDADJ) + +#define num_transitions 38 + +// macros for selecting/mixing the textures + +#define MEM2 col = alt ? col1 : col2; +#define MEM1 col = alt ? col2 : col1; +#define MEM12 col = alt ? v1 * col2 + v2 * col1 : v1 * col1 + v2 * col2; +#define MEM1S { col = alt ? texture2D(iChannel1, uv2).xyz : texture2D(iChannel0, uv2).xyz; } +#define MEM2S { col = alt ? texture2D(iChannel0, uv2).xyz : texture2D(iChannel1, uv2).xyz; } + +// Solve some incompatibilities + +#define atan2 atan +#define fmod mod +#define texture2D texture + +// Useful values + +#define _TWOPI 6.283185307 +#define M_PI 3.141592654 + +float intersect(vec2, vec2, vec2, vec2); + +void mainImage( out vec4 fragColor, in vec2 fragCoord ) +{ +vec2 uv = fragCoord.xy / iResolution.xy, uv2; +#ifdef SELECTTRANS +// I modified @morimea's mod to make effects start at top and progress in order to bottom +uv.y = 1.0 - uv.y; +uv *= vec2(6.,7.); int idx = int(floor(uv.x) + floor(uv.y) * 6.); +vec2 im = iMouse.xy / iResolution.xy; im.y = 1.0 - im.y; +if (iMouse.z > 0.) { im *= vec2(6., 7.); idx = int(floor(im.x) + floor(im.y) * 6.); uv /= vec2(6., 7.); } +else { uv = fract(uv); } +uv.y = 1.0 - uv.y; +#endif +bool alt = false; +int type, i, i2, j, v; +vec3 col, col3; +float v1, v2; +float ye, yfe, dx, dy, cx, cy, rad, slope, theta, xc1, yc1, b, rad0, rad2; +float xc2, yc2, b2, cx2, cy2, r1, vy1, vy2, dx2, dy2, ro, ri, ang, a, a1; +float r, r2, l, l2, theta2, theta3, tang, ang1, ang2, angt, angs, c1, s1; +float xc0, yc0; +vec2 p1, p2, po, pd; + +float aspect = iResolution.y / iResolution.x; +vec3 col1 = texture2D(iChannel0, uv).xyz; +vec3 col2 = texture2D(iChannel1, uv).xyz; +#ifdef NEEDMOD +i = imod(int(iGlobalTime * 20.0) , n); +#ifndef SELECTTRANS +type = imod((int(iGlobalTime * 20.0) / n) , num_transitions); +if (imod(type , 2) == 1) { alt = true; } else { alt = false; } +#else +type = idx; +if (imod(int(iGlobalTime * 20.0) , (n*2)) < n) { alt = true; } else { alt = false; } +#endif +#else +i = int(iGlobalTime * 20.0) % n; +#ifndef SELECTTRANS +type = (int(iGlobalTime * 20.0) / n) % num_transitions; +if (type % 2 == 1) { alt = true; } else { alt = false; } +#else +type = idx; +if (int(iGlobalTime * 20.0) % (n*2) < n) { alt = true; } else { alt = false; } +#endif +#endif + +//type = 32; + +// some of these equations are long, so I'll forego extra spaces + +// was a switch, but some GPUs won't do switch + + if (type==0) // fade in/out + { + v1=float(n-(i+1))/float(n-1); v2=1.0-v1; + MEM12 + } + else if (type==1) // window down with soft edge + { + ye=1.0-float(i)/float(n-1); + yfe=ye+sa; + if (uv.y<=ye) MEM1 + else if (uv.y>yfe) MEM2 + else + { + v2=float(uv.y-ye)/sa; if (v2>1.0) { v2=1.0; } v1=1.0-v2; + MEM12 + } + } + else if (type==2) // increasing box + { + cx=.5; cy=.5; + dx=cx*float(i+rn)/float(n+rd); + dy=cy*float(i+rn)/float(n+rd); + if ((uv.x>=cx-dx)&&(uv.x<=cx+dx)&&(uv.y>=cy-dy)&&(uv.y<=cy+dy)) MEM2 + else MEM1 + } + else if (type==3) // increasing diamond + { + cx=.5; cy=.5; + rad=sqrt(cx*cx+cy*cy)*(float(i+rn)/float(n+rd)); + slope=-cy/cx; + theta=atan(-slope); + xc1=rad*cos(theta); yc1=rad*sin(theta); + b=yc1-slope*xc1; + cy=b; cx=(-b/slope); + dy=abs(.5-uv.y); + dx=abs(.5-uv.x); + if (dx>cx) MEM1 + else if (dy>slope*dx+cy) MEM1 + else MEM2 + } + else if (type==4) // increasing circle + { + cx=.5; cy=.5; + rad=sqrt(cx/aspect*cx/aspect+cy*cy)*(float(i+rn)/float(n+rd)); + if (sqrt((uv.x-cx)/aspect*(uv.x-cx)/aspect+(uv.y-cy)*(uv.y-cy))>rad) MEM1 + else MEM2 + } + else if (type==5) // increasing and decreasing diamonds + { + cx=.5; cy=.5; + rad0=sqrt(cx*cx+cy*cy)/2.0; + rad=sqrt(cx*cx+cy*cy)*(float(n-(i+1))/float(n+rd))/2.0; + rad2=rad0+(rad0-rad); + slope=-cy/cx; + theta=atan(-slope); + xc1=rad*cos(theta); yc1=rad*sin(theta); + xc2=rad2*cos(theta); yc2=rad2*sin(theta); + b=yc1-slope*xc1; + b2=yc2-slope*xc2; + cy=b; cx=(-b/slope); + cy2=b2; cx2=(-b2/slope); + dy=abs(.5-uv.y); + dx=abs(.5-uv.x); + if (dx>cx) MEM2 + else if (dy>slope*dx+cy) MEM2 + else MEM1 + if (dy>slope*dx+cy2) MEM1 + } + else if (type==6) // four corner vanish + { + cx=.5; cy=.5; + dx=cx*float(i+rn)/float(n+rd); + dy=cy*float(i+rn)/float(n+rd); + if ((uv.x>cx-dx)&&(uv.xcy-dy)&&(uv.ycx-dx)&&(uv.xcy)&&(uv.x>cx-dx)&&(uv.xcy-dy)&&(uv.ycx)&&(uv.y>cy-dy)&&(uv.yrad2) MEM1 + else if (r1>rad) { v1=(r1-rad)/(rad2-rad); v2=1.0-v1; MEM12 } + else MEM2 + } + else if (type==8) // increasing diamond with soft edge + { + cx=.5; cy=.5; + rad=sqrt(cx*cx+cy*cy)*(float(i+rn)/float(n+rd)); + //rad2=rad+7.0*sa; + rad2=rad+.7*sa; + slope=-cy/cx; + theta=atan(-slope); + xc1=rad*cos(theta); yc1=rad*sin(theta); + xc2=rad2*cos(theta); yc2=rad2*sin(theta); + b=yc1-slope*xc1; + b2=yc2-slope*xc2; + cy=b; cx=(-b/slope); + cy2=b2; cx2=(-b2/slope); + dy=abs(.5-uv.y); + dx=abs(.5-uv.x); + if (dx>cx2) MEM1 + else if (dy>slope*dx+cy2) MEM1 + else if (dy>slope*dx+cy) + { + vy1=slope*dx+b; + vy2=slope*dx+b2; + v1=(dy-vy1)/(vy2-vy1); v2=1.0-v1; + MEM12 + } + else MEM2 + } + else if (type==9) // increasing & decreasing diamonds w/ soft edge + { + float xc1s,yc1s,xc2s,yc2s,rads,rad2s,bs,b2s,cxs,cys,cx2s,cy2s; + + cx=.5; cy=.5; + rad0=sqrt(cx*cx+cy*cy)/2.0; + rad=sqrt(cx*cx+cy*cy)*(float(n-(i+1))/float(n+rd))/2.0; + //rads=rad+7.0*sa; + rads=rad+.7*sa; + rad2=rad0+(rad0-rad); + //rad2s=rad2-7.0*sa; + rad2s=rad2-.7*sa; + slope=-cy/cx; + theta=atan(-slope); + xc1=rad*cos(theta); yc1=rad*sin(theta); + xc2=rad2*cos(theta); yc2=rad2*sin(theta); + xc1s=rads*cos(theta); yc1s=rads*sin(theta); + xc2s=rad2s*cos(theta); yc2s=rad2s*sin(theta); + b=yc1-slope*xc1; + b2=yc2-slope*xc2; + bs=yc1s-slope*xc1s; + b2s=yc2s-slope*xc2s; + cy=b; cx=(-b/slope); + cy2=b2; cx2=(-b2/slope); + cys=bs; cxs=(-bs/slope); + cy2s=b2s; cx2s=(-b2s/slope); + dy=abs(.5-uv.y); + dx=abs(.5-uv.x); + if (dx>cxs) MEM2 + else if (dy>slope*dx+cys) MEM2 + else if (dy>slope*dx+cy) + { + vy1=slope*dx+b; + vy2=slope*dx+bs; + v2=(dy-vy1)/(vy2-vy1); v1=1.0-v2; + MEM12 + } + else MEM1 + if (dy>slope*dx+cy2) MEM1 + else if (dy>slope*dx+cy2s) + { + vy1=slope*dx+b2; + vy2=slope*dx+b2s; + v2=(dy-vy1)/(vy2-vy1); v1=1.0-v2; + MEM12 + } + } + else if (type==10) // increasing box with soft edge + { + cx=.5; cy=.5; + dx=(cx*float(i+rn)/float(n+rd)); + dy=(cy*float(i+rn)/float(n+rd)); + dx2=(cx*float(i+rn)/float(n+rd)+sa); + dy2=(cy*float(i+rn)/float(n+rd)+sa); + if ((uv.x>=cx-dx)&&(uv.x<=cx+dx)&&(uv.y>=cy-dy)&&(uv.y<=cy+dy)) MEM2 + else if ((uv.x>=cx-dx2)&&(uv.x<=cx+dx2)&&(uv.y>=cy-dy2)&&(uv.y<=cy+dy2)) + { + if ((abs(uv.x-cx)>dx)&&(abs(uv.y-cy)>dy)) + { + if (abs(uv.y-cy)-dy>abs(uv.x-cx)-dx) v1=float(abs(uv.y-cy)-dy)/(sa); + else v1=float(abs(uv.x-cx)-dx)/(sa); + } + else if (abs(uv.x-cx)>dx) { v1=float(abs(uv.x-cx)-dx)/(sa); } + else if (abs(uv.y-cy)>dy) { v1=float(abs(uv.y-cy)-dy)/(sa); } + v2=1.0-v1; MEM12 + } + else MEM1 + } + else if (type==11) // rotating vanishing (gets smaller) square with fade in new/fade out old + { + theta=-_TWOPI*(float(i+rn)/float(n+rd)); + c1=cos(theta); s1=sin(theta); + rad=max(0.00001,(float(n-(i+1))/float(n+rd))); + xc1=(uv.x-.5)*iResolution.x; yc1=(uv.y-.5)*iResolution.y; + xc2=(xc1*c1-yc1*s1)/rad; + yc2=(xc1*s1+yc1*c1)/rad; + uv2.x=xc2+iResolution.x/2.0; uv2.y=yc2+iResolution.y/2.0; + if ((uv2.x>=0.0)&&(uv2.x<=iResolution.x)&&(uv2.y>=0.0)&&(uv2.y<=iResolution.y)) + { + uv2/=iResolution.xy; + col3 = alt ? texture2D(iChannel1, uv2).xyz : texture2D(iChannel0, uv2).xyz; + } + else { col3 = vec3(0,0,0); } + v1=float(n-(i+1))/float(n-1); v2=1.0-v1; + col = alt ? v1*col3+v2*col1 : v1*col3+v2*col2; + } + else if (type==12) // rotating vanishing (gets smaller) square with fade out old + { + theta=-_TWOPI*(float(i+rn)/float(n+rd)); + c1=cos(theta); s1=sin(theta); + rad=max(0.00001,(float(n-(i+1))/float(n+rd))); + xc1=(uv.x-.5)*iResolution.x; yc1=(uv.y-.5)*iResolution.y; + xc2=(xc1*c1-yc1*s1)/rad; + yc2=(xc1*s1+yc1*c1)/rad; + uv2.x=xc2+iResolution.x/2.0; uv2.y=yc2+iResolution.y/2.0; + if ((uv2.x>=0.0)&&(uv2.x<=iResolution.x)&&(uv2.y>=0.0)&&(uv2.y<=iResolution.y)) + { + uv2/=iResolution.xy; + col3 = alt ? texture2D(iChannel1, uv2).xyz : texture2D(iChannel0, uv2).xyz; + } + else { col3 = alt ? col1 : col2; } + v1=float(n-(i+1))/float(n-1); v2=1.0-v1; + col = alt ? v1*col3+v2*col1 : v1*col3+v2*col2; + } + else if (type==13) // increasing flower with soft edge + { + cx=.5; cy=.5; + ang=36.0*M_PI/180.0; + ro=(1.0/aspect)/.731*(float(i+rn)/float(n+rd)); + a1=234.0*M_PI/180.0; + l=(sqrt((ro*cos(a1)*ro*cos(a1))+((ro*sin(a1)-ro)*(ro*sin(a1)-ro))))/2.0; + a1=162.0*M_PI/180.0; + l2=((ro*cos(a1)*ro*cos(a1))+((ro*sin(a1)-ro)*(ro*sin(a1)-ro))); + ri=(ro-sqrt(l2-l*l))/cos(36.0*M_PI/180.0); + if (roto) { vy1=float(i+rn-1)/float(n+rd)*rota*M_PI/180.0; } + else { vy1=0.0; } + yc1=1.0-uv.y-cy; + xc1=(uv.x-cx)/aspect; + theta=atan2(xc1,yc1)+vy1; + theta2=fmod(abs(theta),ang); + i2=int((180.0*theta/M_PI)/36.0); +#ifdef NEEDMOD + if (imod(i2,2)==0) { r=theta2/ang*(ro-ri)+ri; } +#else + if (i2%2==0) { r=theta2/ang*(ro-ri)+ri; } +#endif + else { r=(1.0-theta2/ang)*(ro-ri)+ri; } + r2=sqrt(xc1*xc1+yc1*yc1); + if (r2>r+sa) { MEM1 } else if (r2>r) { v1=(r2-r)/(sa); v2=1.0-v1; MEM12 } else { MEM2 } + } + else if (type==14) // increasing star with soft edge + { + cx=.5; cy=.5; + ang=36.0*M_PI/180.0; + ro=(1.0/aspect)/.731*(float(i+rn)/float(n+rd)); + a1=234.0*M_PI/180.0; + l=(sqrt((ro*cos(a1)*ro*cos(a1))+((ro*sin(a1)-ro)*(ro*sin(a1)-ro))))/2.0; + a1=162.0*M_PI/180.0; + l2=((ro*cos(a1)*ro*cos(a1))+((ro*sin(a1)-ro)*(ro*sin(a1)-ro))); + ri=(ro-sqrt(l2-l*l))/cos(36.0*M_PI/180.0); + if (roto) { vy1=float(i+rn-1)/float(n+rd)*rota*M_PI/180.0; } + else { vy1=0.0; } + po.x=po.y=0.0; + yc1=1.0-uv.y-cy; + xc1=(uv.x-cx)/aspect; + theta=atan2(xc1,yc1)+vy1; + theta2=fmod(abs(theta),ang); + i2=int((180.0*theta/M_PI)/36.0); +#ifdef NEEDMOD + if (imod(i2,2)==0) { p1.x=ri; p1.y=0.0; p2.x=ro*cos(ang); p2.y=ro*sin(ang); } +#else + if (i2%2==0) { p1.x=ri; p1.y=0.0; p2.x=ro*cos(ang); p2.y=ro*sin(ang); } +#endif + else { p1.x=ro; p1.y=0.0; p2.x=ri*cos(ang); p2.y=ri*sin(ang); } + pd.x=cos(theta2); pd.y=sin(theta2); + r=intersect(po,pd,p1,p2); + r2=sqrt(xc1*xc1+yc1*yc1); + if (r2>r+sa) { MEM1 } else if (r2>r) { v1=(r2-r)/(sa); v2=1.0-v1; MEM12 } else { MEM2 } + } + else if (type==15) // dissolve + { + // easier to use this common shadertoy random number gen rather than the one I used in original + int v=int(fract(sin(dot(uv, vec2(12.9898, 78.233)))* 43758.5453)*float(n-1)); + if (i>v) MEM2 else MEM1 + } + else if (type==16) // split horizontal + { + cy=.5; + ye=1.0/2.0*float(i+rn)/float(n+rd); + if (uv.y=cy+ye) MEM1 + else MEM2 + } + else if (type==17) // split vertical + { + cx=.5; + ye=1.0/2.0*float(i+rn)/float(n+rd); + if (uv.x=cx+ye) MEM1 + else MEM2 + } + else if (type==18) // slide + { + ye=float(i+rn)/float(n+rd); + uv2.x=uv.x; + uv2.y=uv.y+ye; + if (uv.y>=1.0-ye) MEM2 + else MEM1S + } + else if (type==19) // window right with soft edge + { + ye=float(i)/float(n-1); + yfe=ye+(10.0*sa); + if (uv.x<=ye) MEM2 + else if (uv.x>yfe) MEM1 + else + { + v1=(uv.x-ye)/(10.0*sa); if (v1>1.0) { v1=1.0; } v2=1.0-v1; + MEM12 + } + } + else if (type==20) // inset down right + { + dx=float(i+rn)/float(n+rd); + dy=float(i+rn)/float(n+rd); + if (uv.x>=dx) MEM1 + else if (1.0-uv.y>=dy) MEM1 + else MEM2 + } + else if (type==21) // inset down left + { + dx=float(i+rn)/float(n+rd); + dy=float(i+rn)/float(n+rd); + if ((1.0-uv.x)>dx) MEM1 + else if (1.0-uv.y>=dy) MEM1 + else MEM2 + } + else if (type==22) // inset up right + { + dx=float(i+rn)/float(n+rd); + dy=float(i+rn)/float(n+rd); + if (uv.x>=dx) MEM1 + else if (uv.y>dy) MEM1 + else MEM2 + } + else if (type==23) // inset up left + { + dx=float(i+rn)/float(n+rd); + dy=float(i+rn)/float(n+rd); + if ((1.0-uv.x)>dx) MEM1 + else if ((uv.y)>dy) MEM1 + else MEM2 + } + else if (type==24) // pixelate + { + // this is simpler (not as good) as my original non-glsl code + v1=float(n-(i+1))/float(n-1); v2=1.0-v1; + if (i=cx)) { v1=(theta3-theta2)/xc1; v2=1.0-v1; MEM12 } + else MEM1 + } + else + { + if ((theta>theta2+xc1)&&(uv.x<=cx)) MEM1 + else if ((theta3>theta2+xc1)&&(uv.x>=cx)) MEM1 + else if (!((theta>theta2)&&(theta3>theta2))) MEM2 + else if (uv.x<=cx) { v1=(theta-theta2)/xc1; v2=1.0-v1; MEM12 } + else { v1=(theta3-theta2)/xc1; v2=1.0-v1; MEM12 } + } + } + else if (type==27) // fan up + { + theta2=M_PI/2.0*float(i+rn)/float(n+rd); + dy=0.0; dx=1.0/2.0; xc1=M_PI/180.0*sa; + theta=atan2(abs(dx-uv.x),1.0-uv.y); + if (theta=0.0)&&(uv2.x=0.0)&&(uv2.y=0.0)&&(uv2.x=0.0)&&(uv2.y=0.0)&&(uv2.x=0.0)&&(uv2.y=0.0)&&(uv2.x=0.0)&&(uv2.yv) MEM2 else MEM1 + } + else if (type==33) // slide up center + { + bool In=false; + if (alttype>8) { v=alttype-9; In=true; } else { v=alttype; } + if (In) { rad=(float(i+1)/float(n+rd)); } + else { rad=(float(n-(i+1))/float(n+rd)); } + if (v==0) { cx=.5; cy=0.0; xc1=.5-rad/2.0; yc1=0.0; } + else if (v==1) { cx=1.0; cy=.5; xc1=1.0-rad; yc1=.5-rad/2.0; } + else if (v==2) { cx=.5; cy=1.0; xc1=.5-rad/2.0; yc1=1.0-rad; } + else if (v==3) { cx=0.0; cy=.5; xc1=0.0; yc1=.5-rad/2.0; } + else if (v==4) { cx=1.0; cy=0.0; xc1=1.0-rad; yc1=0.0; } + else if (v==5) { cx=cy=1.0; xc1=1.0-rad; yc1=1.0-rad; } + else if (v==6) { cx=0.0; cy=1.0; xc1=0.0; yc1=1.0-rad; } + else if (v==7) { cx=cy=0.0; xc1=0.0; yc1=0.0; } + else if (v==8) { cx=cy=.5; xc1=.5-rad/2.0; yc1=.5-rad/2.0; } + uv.y=1.0-uv.y; + if ((uv.x>=xc1)&&(uv.x<=xc1+rad)&&(uv.y>=yc1)&&(uv.y<=yc1+rad)) + { + uv2.x=(uv.x-xc1)/rad; + uv2.y=1.0-(uv.y-yc1)/rad; + if (In) { MEM2S } else { MEM1S } + } + else if (In) { MEM1 } else { MEM2 } + } + else if (type==29) // diagonal down right + { + rad=sqrt(2.0+2.0)*(1.0-(float(i+rn)/float(n+rd))); + slope=-1.0/1.0; + theta=atan(-slope); + xc1=rad*cos(theta); yc1=rad*sin(theta); + b=yc1-slope*xc1-sa; + cy=b; cx=(-b/slope); + dy=abs(uv.y); + dx=abs(1.0-uv.x); + //if (dx>cx-sa) MEM2 + if (dy>slope*dx+cy+sa) MEM2 + else if (dy>slope*dx+cy) { v2=(dy-(slope*dx+cy))/(sa); v1=1.0-v2; MEM12 } + else MEM1 + } + else if (type==30) // diagonal cross out + { + cx=.5; cy=.5; + rad=sqrt(cx*cx+cy*cy)/2.0*(float(i+rn)/float(n+rd)); + slope=-cy/cx; + theta=atan(-slope); + xc1=rad*cos(theta); yc1=rad*sin(theta); + b=yc1-slope*xc1; + cy=b; cx=(-b/slope); vy1=sa; + dy=(uv.y-.5); + dx=(uv.x-.5); + if (!(((dy>slope*dx+cy)||(dy(-slope)*dx+cy)||(dy<(-slope)*dx-cy)))) MEM2 + else if ((sa!=0.0)&&(!(((dy>slope*dx+cy+vy1)||(dy(-slope)*dx+cy+vy1)||(dy<(-slope)*dx-cy-vy1))))) + { + if ((dx>=0.0)&&(dy>=0.0)) + { + v1=v2=0.0; + if (dy>-slope*dx) { v1=(dy-(-slope*dx+cy))/vy1; v2=1.0-v1; } + else { v1=((-slope*dx-cy)-dy)/vy1; v2=1.0-v1; } + MEM12 + } + else if ((dx<0.0)&&(dy<0.0)) + { + v1=v2=0.0; + if (dy>-slope*dx) { v1=(dy-(-slope*dx+cy))/vy1; v2=1.0-v1; } + else { v1=((-slope*dx-cy)-dy)/vy1; v2=1.0-v1; } + MEM12 + } + else if ((dx>=0.0)&&(dy<0.0)) + { + v1=v2=0.0; + if (dy>slope*dx) { v1=(dy-(slope*dx+cy))/vy1; v2=1.0-v1; } + else { v1=((slope*dx-cy)-dy)/vy1; v2=1.0-v1; } + MEM12 + } + else if ((dx<0.0)&&(dy>=0.0)) + { + v1=v2=0.0; + if (dy>slope*dx) { v1=(dy-(slope*dx+cy))/vy1; v2=1.0-v1; } + else { v1=((slope*dx-cy)-dy)/vy1; v2=1.0-v1; } + MEM12 + } + } + else MEM1 + } + else if (type==31) // increasing gear with soft edge + { + cx=.5; cy=.5; + ro=sqrt(cx*cx+cy*cy)/.9*float(i+rn)/float(n+rd); + if (roto) { vy1=float(i+rn-1)/float(n+rd)*rota*M_PI/180.0; } + else { vy1=0.0; } + ri=ro*.9; + po.x=po.y=0.0; + angt=5.0; + angs=2.5; + tang=(angt+angs)*2.0; + ang=tang*M_PI/180.0; + yc1=uv.y-cy; + xc1=(uv.x-cx)/aspect; + theta=atan2(xc1,yc1); + theta2=fmod(theta+M_PI+vy1,ang); + if (theta2<=angt*M_PI/180.0) { r1=r2=ri; ang2=angt; ang1=theta2; } + else if (theta2<=(angt+angs)*M_PI/180.0) { r1=ri; r2=ro; ang2=angs; ang1=theta2-angt*M_PI/180.0; } + else if (theta2<=(angt+angs+angt)*M_PI/180.0) { r1=r2=ro; ang2=angt; ang1=theta2-(angt+angs)*M_PI/180.0; } + else { r1=ro; r2=ri; ang2=angs; ang1=theta2-(angt+angs+angt)*M_PI/180.0; } + ang2*=(M_PI/180.0); + p1.x=r1; p1.y=0.0; p2.x=r2*cos(ang2); p2.y=r2*sin(ang2); + pd.x=cos(ang1); pd.y=sin(ang1); + r=intersect(po,pd,p1,p2); + r2=sqrt(xc1*xc1+yc1*yc1); + if (r2>r+sa) { MEM1 } else if (r2>r) { v1=(r2-r)/(sa); v2=1.0-v1; MEM12 } else { MEM2 } + } + else if (type==32) // rotating expanding square with fade in new/fade out old + { + theta=-_TWOPI*(float(i+rn)/float(n+rd)); + c1=cos(theta); s1=sin(theta); + rad=(float(n-(i+1))/float(n+rd)); + xc1=(uv.x-.5)*iResolution.x; yc1=(uv.y-.5)*iResolution.y; + xc2=rad*(xc1*c1-yc1*s1); + yc2=rad*(xc1*s1+yc1*c1); + uv2.x=xc2+iResolution.x/2.0; uv2.y=yc2+iResolution.y/2.0; + if ((uv2.x>=0.0)&&(uv2.x<=iResolution.x)&&(uv2.y>=0.0)&&(uv2.y<=iResolution.y)) + { + uv2/=iResolution.xy; + col3 = alt ? texture2D(iChannel1, uv2).xyz : texture2D(iChannel0, uv2).xyz; + } + else { col3 = alt ? col1 : col2; } + v1=float(n-(i+1))/float(n-1); v2=1.0-v1; + //col=col3; + col = alt ? v1*col3+v2*col1 : v1*col3+v2*col2; + } + +fragColor = vec4(col, 1.0); +} + +float intersect(vec2 origin, vec2 direction, vec2 point1, vec2 point2) +{ +vec2 v1, v2, v3; +float dot, t1, t2; + +v1.x = origin.x - point1.x; +v1.y = origin.y - point1.y; +v2.x = point2.x - point1.x; +v2.y = point2.y - point1.y; +v3.x = -direction.y; +v3.y = direction.x; +dot = v2.x * v3.x + v2.y * v3.y; +if (abs(dot) < 0.000001) return(-1000.0); +t1 = (v2.x * v1.y - v2.y * v1.x) / dot; +t2 = (v1.x * v3.x + v1.y * v3.y) / dot; +if ((t1 >= 0.0) && (t2 >= 0.0) && (t2 <= 1.0)) return(t1); +return(-1000.0); +} diff --git a/tools/src/manipulative/Ripple Distortion.frag b/tools/src/manipulative/Ripple Distortion.frag new file mode 100644 index 0000000..f42ee3b --- /dev/null +++ b/tools/src/manipulative/Ripple Distortion.frag @@ -0,0 +1,37 @@ +//based on the barrel deformation shader taken from: +//http://www.geeks3d.com/20140213/glsl-shader-library-fish-eye-and-dome-and-barrel-distortion-post-processing-filters/2/ + +//CONTROL VARIABLES +float uPower = 0.2; // barrel power - (values between 0-1 work well) +float uSpeed = 5.0; +float uFrequency = 5.0; + +vec2 Distort(vec2 p, float power, float speed, float freq) +{ + float theta = atan(p.y, p.x); + float radius = length(p); + radius = pow(radius, power*sin(radius*freq-iTime*speed)+1.0); + p.x = radius * cos(theta); + p.y = radius * sin(theta); + return 0.5 * (p + 1.0); +} + +void mainImage(out vec4 fragColor, in vec2 fragCoord ) +{ + vec2 xy = 2.0 * fragCoord.xy/iResolution.xy - 1.0; + vec2 uvt; + float d = length(xy); + + //distance of distortion + if (d < 1.0 && uPower != 0.0) + { + //if power is 0, then don't call the distortion function since there's no reason to do it :) + uvt = Distort(xy, uPower, uSpeed, uFrequency); + } + else + { + uvt = fragCoord.xy / iResolution.xy; + } + vec4 c = texture(iChannel0, uvt); + fragColor = c; +} diff --git a/tools/src/manipulative/Scatter Blur.frag b/tools/src/manipulative/Scatter Blur.frag new file mode 100644 index 0000000..be3303f --- /dev/null +++ b/tools/src/manipulative/Scatter Blur.frag @@ -0,0 +1,23 @@ +/* + Blurring by scattering pixels + + Based on https://github.com/FlexMonkey/Filterpedia/blob/7a0d4a7070894eb77b9d1831f689f9d8765c12ca/Filterpedia/customFilters/Scatter.swift + + Simon Gladman | November 2017 | http://flexmonkey.blogspot.co.uk +*/ + +float noise(vec2 co) { + vec2 seed = vec2(sin(co.x), cos(co.y)); + return fract(sin(dot(seed ,vec2(12.9898,78.233))) * 43758.5453); +} + +void mainImage( out vec4 fragColor, in vec2 fragCoord ) +{ + float radius = abs(25.0 * sin(12.0)); + + vec2 offset = -radius + vec2(noise(fragCoord), noise(fragCoord.yx)) * radius * 2.0; + + vec2 uv = (fragCoord + offset ) / iResolution.xy; + + fragColor = texture(iChannel0, uv); +} diff --git a/tools/src/manipulative/Sepia.frag b/tools/src/manipulative/Sepia.frag new file mode 100644 index 0000000..d59cf0f --- /dev/null +++ b/tools/src/manipulative/Sepia.frag @@ -0,0 +1,38 @@ +// Writer : Rasool Ghana +// Sepia effect gives your images a warm brownish tone. +// Sepia filter improves the general look and feel of your image. +// Sepia tone photos appear hazy, warm, and a bit sentimental. + +// this code is written based on FFMPEG's colorchannelmixer filter +// FFMPEG command line for same effect : +// colorchannelmixer=.393:.769:.189:0:.349:.686:.168:0:.272:.534:.131 + +void mainImage( out vec4 fragColor, in vec2 fragCoord ) +{ + vec2 xy = fragCoord.xy / iResolution.xy; + vec4 texColor = texture(iChannel0,xy); + + float rr = .3; + float rg = .769; + float rb = .189; + float ra = 0.0; + + float gr = .3; + float gg = .686; + float gb = .168; + float ga = 0.0; + + float br = .272; + float bg = .534; + float bb = .131; + float ba = 0.0; + + float red = (rr * texColor.r) + (rb * texColor.b) + (rg * texColor.g) + (ra * texColor.a); + float green = (gr * texColor.r) + (gb * texColor.b) + (gg * texColor.g) + (ga * texColor.a); + float blue = (br * texColor.r) + (bb * texColor.b) + (bg * texColor.g) + (ba * texColor.a); + + texColor = vec4(red,green,blue,1.0); + + fragColor = texColor; + +} diff --git a/tools/src/manipulative/Soft Blur.frag b/tools/src/manipulative/Soft Blur.frag new file mode 100644 index 0000000..eac91ac --- /dev/null +++ b/tools/src/manipulative/Soft Blur.frag @@ -0,0 +1,64 @@ +#ifdef GL_ES +precision mediump float; +#endif + +float normpdf(in float x, in float sigma) +{ + return 0.39894*exp(-0.5*x*x/(sigma*sigma))/sigma; +} + +float blendScreen(float base, float blend) { + return 1.0-((1.0-base)*(1.0-blend)); +} + +vec3 blendScreen(vec3 base, vec3 blend) { + return vec3(blendScreen(base.r,blend.r),blendScreen(base.g,blend.g),blendScreen(base.b,blend.b)); +} + +vec3 blendScreen(vec3 base, vec3 blend, float opacity) { + return (blendScreen(base, blend) * opacity + blend * (1.0 - opacity)); +} + +void mainImage( out vec4 fragColor, in vec2 fragCoord ) +{ + vec3 c = texture(iChannel0, fragCoord.xy / iResolution.xy).rgb; + if (fragCoord.x < iMouse.x) + { + fragColor = vec4(c, 1.0); + } else { + + //declare stuff + const int mSize = 11; + const int kSize = (mSize-1)/2; + float kernel[mSize]; + vec3 final_colour = vec3(0.0); + + //create the 1-D kernel + float sigma = 7.0; + float Z = 0.0; + for (int j = 0; j <= kSize; ++j) + { + kernel[kSize+j] = kernel[kSize-j] = normpdf(float(j), sigma); + } + + //get the normalization factor (as the gaussian has been clamped) + for (int j = 0; j < mSize; ++j) + { + Z += kernel[j]; + } + + //read out the texels + for (int i=-kSize; i <= kSize; ++i) + { + for (int j=-kSize; j <= kSize; ++j) + { + final_colour += kernel[kSize+j]*kernel[kSize+i]*texture(iChannel0, (fragCoord.xy+vec2(float(i),float(j))) / iResolution.xy).rgb; + + } + } + + vec3 blenColor = blendScreen(c,final_colour/(Z*Z),0.8); + + fragColor = vec4(blenColor.rgb, 1.0); + } +} diff --git a/tools/src/manipulative/Solarize.frag b/tools/src/manipulative/Solarize.frag new file mode 100644 index 0000000..548167a --- /dev/null +++ b/tools/src/manipulative/Solarize.frag @@ -0,0 +1,35 @@ +// https://www.shadertoy.com/view/ll2GWc +// by Nikos Papadopoulos, 4rknova / 2015 +// WTFPL + +#define THRESHOLD vec3(1.,.92,.1) + +vec3 texsample(in vec2 uv) +{ + return texture(iChannel0, uv).xyz; +} + +vec3 texfilter(in vec2 uv) +{ + vec3 val = texsample(uv); + if (val.x < THRESHOLD.x) val.x = 1. - val.x; + if (val.y < THRESHOLD.y) val.y = 1. - val.y; + if (val.z < THRESHOLD.z) val.z = 1. - val.z; + return val; +} + +void mainImage( out vec4 fragColor, in vec2 fragCoord ) +{ + vec2 uv = fragCoord.xy / iResolution.xy; + uv.y = 1. - uv.y; + + float m = 0.0; + + float l = smoothstep(0., 1. / iResolution.y, abs(m - uv.x)); + + vec3 cf = texfilter(uv); + vec3 cl = texsample(uv); + vec3 cr = (uv.x < m ? cl : cf) * l; + + fragColor = vec4(cr, 1); +} diff --git a/tools/src/manipulative/Stone Man.frag b/tools/src/manipulative/Stone Man.frag new file mode 100644 index 0000000..a997ca6 --- /dev/null +++ b/tools/src/manipulative/Stone Man.frag @@ -0,0 +1,121 @@ +// https://www.shadertoy.com/view/l3dyRB + +// Ruido pseudo-aleatorio basado en hash +float hash(vec2 p) { + return fract(sin(dot(p, vec2(127.1, 311.7))) * 43758.5453); +} + +// Función para calcular el mapa de normales a partir del mapa de altura +vec3 calculateNormal(vec2 uv, float heightScale) { + float d = 1.0 / iResolution.x; // Delta basado en la resolución + float hL = texture(iChannel0, uv - vec2(d, 0.0)).r * heightScale; // Izquierda + float hR = texture(iChannel0, uv + vec2(d, 0.0)).r * heightScale; // Derecha + float hT = texture(iChannel0, uv - vec2(0.0, d)).r * heightScale; // Arriba + float hB = texture(iChannel0, uv + vec2(0.0, d)).r * heightScale; // Abajo + + // Normales derivadas + vec3 normal = normalize(vec3(hL - hR, hT - hB, 1.0)); + return normal; +} + +// Cálculo de Ambient Occlusion (AO) +float calculateAO(vec2 uv, float height, float radius, int samples) { + float ao = 0.0; + float angleStep = 6.28318530718 / float(samples); // Paso angular (2*PI / muestras) + + for (int i = 0; i < samples; i++) { + float angle = float(i) * angleStep; + vec2 offset = vec2(cos(angle), sin(angle)) * radius; + + // Altura en el punto de muestra + float sampleHeight = texture(iChannel0, uv + offset).r; + float diff = height - sampleHeight; + + // Incremento AO si el punto de muestra está por debajo + ao += smoothstep(0.0, radius, diff); + } + + // Normalizar el AO (invertido para que las áreas ocluidas sean más oscuras) + return 1.0 - ao / float(samples); +} + +// Calcular sombras fuertes basadas en luminancia +float calculateShadows(vec2 uv, float lowerThreshold, float upperThreshold) { + vec3 videoColor = texture(iChannel0, uv).rgb; + float luminance = dot(videoColor, vec3(0.299, 0.587, 0.114)); // Luminancia + + // Máscara de sombras fuertes + return smoothstep(upperThreshold, lowerThreshold, luminance); +} + +// Luz puntual con PBR (metalness y roughness) +float pointLight(vec3 normal, vec2 uv, vec2 lightPos, vec3 lightDir, float intensity, float roughness, float metalness) { + vec2 toLight = lightPos - uv; + float distance = length(toLight); + vec3 dir = normalize(vec3(toLight, 0.5)); // Dirección ajustada + + // Atenuación + float attenuation = intensity / (1.0 + distance * distance); + + // Especularidad controlada por PBR + vec3 halfVector = normalize(dir + vec3(0.0, 0.0, 1.0)); + float NdotH = max(dot(normal, halfVector), 0.0); + float specular = pow(NdotH, 1.0 / (roughness + 0.001)) * (1.0 - metalness); + + // Difuso y especular + float diffuse = max(dot(normal, dir), 0.0) * attenuation; + return diffuse + specular * attenuation; +} + +void mainImage(out vec4 fragColor, in vec2 fragCoord) { + vec2 uv = fragCoord.xy / iResolution.xy; // Coordenadas normalizadas + + // Luminancia del video como mapa de altura + vec3 videoColor = texture(iChannel0, uv).rgb; + float height = dot(videoColor, vec3(0.299, 0.587, 0.114)); // Altura basada en luminancia + + // Generar normales + vec3 normal = calculateNormal(uv, 18.0); + + // Calcular AO + float aoRadius = 0.02; // Radio del AO + int aoSamples = 32; // Número de muestras para AO + float aoIntensity = 0.4; // Intensidad del AO (0 = desactivado, 1 = máximo) + float ao = calculateAO(uv, height, aoRadius, aoSamples) * aoIntensity; + + // Calcular sombras fuertes + float lowerThreshold = 0.2; // Inicio de sombras fuertes + float upperThreshold = 0.1; // Fin de sombras fuertes + float shadowIntensity = 0.3; // Intensidad de sombras fuertes + float shadows = calculateShadows(uv, lowerThreshold, upperThreshold) * shadowIntensity; + + // Configuración de luces + vec2 light1Pos = vec2(0.1, 0.9); // Superior izquierda + vec2 light2Pos = vec2(0.9, 0.1); // Inferior derecha + vec3 light1Dir = vec3(0.0, -1.0, 0.5); // Rotación fija + vec3 light2Dir = vec3(0.0, 1.0, 0.5); + + // Parámetros de luz y material + float intensity1 = 2.7; + float intensity2 = 0.4; + float roughness = 0.4; // Entre 0 y 1 + float metalness = 0.5; // Entre 0 y 1 + vec3 materialColor = vec3(0.5, 0.4, 0.3); // Color base del material + + // Calcular iluminación de ambas luces + float light1 = pointLight(normal, uv, light1Pos, light1Dir, intensity1, roughness, metalness); + float light2 = pointLight(normal, uv, light2Pos, light2Dir, intensity2, roughness, metalness); + + // Aplicar AO y sombras al material + float combinedAO = mix(1.0, ao, aoIntensity); + float combinedShadows = mix(1.0, shadows, shadowIntensity); + + // Mezclar iluminación con AO, sombras y material + vec3 finalMaterial = (light1 + light2) * materialColor * combinedAO * combinedShadows; + + // Mezcla con el video original (10%) + vec3 finalColor = mix(finalMaterial, videoColor, 0.1); + + fragColor = vec4(finalColor, 1.0); +} + diff --git a/tools/src/manipulative/Video Bubble.frag b/tools/src/manipulative/Video Bubble.frag new file mode 100644 index 0000000..77da713 --- /dev/null +++ b/tools/src/manipulative/Video Bubble.frag @@ -0,0 +1,243 @@ +//https://www.shadertoy.com/view/3d2BWz + +//The MIT License +//Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +float smooth_max(in float x, in float y, in float s) { + float bridge = + clamp(abs(x-y)/s, 0.0, 1.0); + return max(x,y) + 0.25 * s * (bridge - 1.0) * (bridge - 1.0); +} + +vec3 smooth_max(in vec3 x, in vec3 y, float s) { + return vec3(smooth_max(x.x, y.x, s), + smooth_max(x.y, y.y, s), + smooth_max(x.z, y.z, s)); +} + +float smooth_min(in float x, in float y, in float s) { + + float bridge = + clamp(abs(x-y)/s, 0.0, 1.0); + return min(x,y) - 0.25 * s * (bridge - 1.0) * (bridge - 1.0); +} + + +vec3 smooth_min(in vec3 x, in vec3 y, float s) { + return vec3(smooth_min(x.x, y.x, s), + smooth_min(x.y, y.y, s), + smooth_min(x.z, y.z, s)); +} + +#define MAX_DIST 8.0 + +#define SUPERSAMPLE 1 // per IQ, enable at your own risk +// #define SUPERSAMPLE 1 // it's a boolean + +float length_1 = 0.4; +const float crinkle = 0.01375; // make this smaller to make grid finer + +vec2 bright_clamp = vec2(0.0, 1.0); // ramp brightness values in this range to 0.0,1.0 + +#define HOLES_OR_RODS 1 // 1 for holes, 0 for rods + +const vec3 light_dir = normalize(vec3(0.05, 0.05, -0.15)); + +float do_bright_clamp(in float x) { +#if !HOLES_OR_RODS + // return clamp((x-bright_clamp.y)/(bright_clamp.x - bright_clamp.y), 0.0, 1.0); + return smoothstep(bright_clamp.y, bright_clamp.x, x); +#else + // return clamp((x-bright_clamp.x)/(bright_clamp.y - bright_clamp.x), 0.0, 1.0); + return smoothstep(bright_clamp.x, bright_clamp.y, x); +#endif +} + +float core_sdf(in vec3 pt) { + const vec3 p1 = vec3(0.0, 0.45, 0.7); + const vec3 p2 = -vec3(0.0, -0.1, 0.7); + float d1 = length((pt - p1)* vec3(1.6)) - 3.1 * length_1; + // float d1 = dot(pt - p1, normalize(p2 - p1)) - 1.85 * length_1; + // float d2 = length((pt - p2) * vec3(1.6)) - 3.0 * length_1; + float d2 = dot(pt - p2, normalize(p1 - p2)) - 1.9 * length_1; + // float d1 = length((pt.xy + vec2(0.0, -0.15))) -0.8 * length_1; + return smooth_max(d1, d2, 0.05); +} + +float wavefront(vec3 p) { + return (1.0 - length_1) * smoothstep(0.0, length_1, abs(mod(p.x, 2.0 * length_1) - length_1)) + + length_1 * smoothstep(0.0, length_1, p.y * (p.x + p.y)); +} + +float sdf(in vec3 pt) { + float result = core_sdf(pt); + if (abs(result) < 14.0 * crinkle) { + vec3 cell_rel = mod(pt, vec3(2.0 * crinkle)) - 1.0 * vec3(crinkle); + cell_rel.z = 0.5 * result; + vec3 cell_center = pt - cell_rel; + cell_rel.xy = abs(cell_rel.xy); + vec2 uv = cell_center.xy * 2.0 * iResolution.yx/iResolution.x + vec2(0.5, 0.0); + float max_hole_size = crinkle * 1.0; + float hole_size = max_hole_size * do_bright_clamp(dot(texture(iChannel0, uv).rgb, 0.8 * vec3(1.0, 0.75, 0.75))); + float in_image = step(0.0, uv.x) * step(0.0, uv.y) * step(uv.x, 1.0) * step(uv.y, 1.0); + hole_size = mix(max_hole_size, hole_size, in_image); + cell_rel.xy = max(vec2(0.0), cell_rel.xy - vec2(0.5 * hole_size)); + float hole_dist = 0.5 * hole_size - length(cell_rel.xy); +#if HOLES_OR_RODS + result = smooth_max(result, hole_dist, 0.05 * max_hole_size); +#else + result = smooth_max(result, -hole_dist, 0.05 * max_hole_size); +#endif + // result -= crinkle * smoothstep(0.0, 0.8, simple_noise(32.0 * pt, 28.1)); + } + return result; +} + +vec3 sdf_grad(in vec3 pt) { + float f = sdf(pt); + const float h = 0.001; + const float h_inv = 1000.0; + + return h_inv * + vec3(sdf(pt + vec3(h, 0.0, 0.0)) - f, + sdf(pt + vec3(0.0, h, 0.0)) - f, + sdf(pt + vec3(0.0, 0.0, h)) - f); +} + + + +float raymarch(in vec3 pt, in vec3 dir, out float sumdist) { + vec3 d = normalize(dir); + vec3 p = pt; + float accum = 0.0; + float s = sdf(pt); + sumdist = 0.0; + for(int i = 0; i < 512; ++i) { + if (accum > MAX_DIST || s < 1.0e-3) { + return accum; + } + accum += 0.25 * s; + p = pt + accum * d; + s = sdf(p); + sumdist = sumdist + 0.25 * s / max(s, 1.0e-3); + } + if (s > 1.0e-3) { + return MAX_DIST + 1.0; + } + return accum; +} + +float raymarch_out(in vec3 pt, in vec3 dir) { + vec3 d = normalize(dir); + vec3 p = pt; + float total_step = 0.0; + float accum = 0.0; + float s = core_sdf(pt); + for(int i = 0; i < 256; ++i) { + if (total_step > MAX_DIST) { + return accum; + } + float curr_step = 0.75 * max(abs(s), 1.0e-3); + total_step += curr_step; + accum += curr_step * step(s, 0.0); + p = pt + total_step * d; + s = core_sdf(p); + } + return accum; +} + +float ramp(in float a, in float b, in float x) { + float p = (x-a)/(b-a); + return clamp(p, 0.0, 1.0); +} + +vec4 color_at(in vec2 fragCoord ) { + // Normalized pixel coordinates (from 0 to 1) + vec2 uv = (2.0 * fragCoord - iResolution.xy) / iResolution.y; + + vec3 dir = normalize(vec3(uv, 6.0)); + + vec3 orig = vec3(0.0, 0.25, -1.5); + + float theta = 0.0625 * sin(0.25 * iTime) + 3.141592654; + float ct = cos(theta); + float st = sin(theta); + + mat3 spin = mat3(ct, 0.0, st, + 0.0, 1.0, 0.0, + -st, 0.0, ct); + + theta = 0.25 * sin(iTime); + vec2 trigs = cos(vec2(theta, theta + 0.5 * 3.141592654)); + ct = 0.8 * trigs.x - 0.6 * trigs.y; + st = 0.6 * trigs.x + 0.8 * trigs.y; + theta = 0.25 * sin(1.21 * iTime); + trigs = cos(vec2(theta, theta + 0.5 * 3.141592654)); + ct = 0.6 * trigs.x - 0.8 * trigs.y; + st = 0.8 * trigs.x + 0.6 * trigs.y; + + + theta = 0.25 * sin(0.93 * iTime); + trigs = cos(vec2(theta, theta + 0.5 * 3.141592654)); + ct = 0.8 * trigs.x - 0.6 * trigs.y; + st = 0.6 * trigs.x + 0.8 * trigs.y; + + orig = spin * orig; + dir = spin * dir; + + float cloud_integral = 0.0; + + float dist = raymarch(orig, dir, cloud_integral); + + vec3 color_mul = vec3(1.0); + + + vec3 col = vec3(0.0); + vec3 refl_color = 1.0 * vec3(0.8, 1.0, 0.5); + vec3 trans_color = 1.0 * vec3(1.0, 0.1, 0.5); // 1.0 , 0.5, 0.4); + float thru_dist = 1000.0; + vec3 n = dir; + if (dist < MAX_DIST) { + vec3 pt = orig + dir * dist; + thru_dist = raymarch_out(pt, light_dir); + n = normalize(sdf_grad(pt)); + dir = normalize(reflect(dir, n)); + + + + col = (0.8 * smoothstep(0.99, 1.0, dot(dir, light_dir)) + 0.5 * smoothstep(0.2, 1.0, dot(n, light_dir)))* + refl_color; + + float pen_length = 0.1 * length_1; // 10.25 * crinkle; + float soften_subsurface = 1.0; + + col += ( soften_subsurface * pen_length / max(abs(soften_subsurface * thru_dist), pen_length)) * trans_color; + + } + float sweep = 20.0 * fragCoord.x / iResolution.x + smoothstep(0.0, iResolution.y, fragCoord.y); + float cloud_modulate = 0.25; // + 0.25 * sin(1.71 * iTime + sweep); + float cloud_contrib = 0.05 * cloud_modulate * cloud_integral; + // cloud_contrib *= smoothstep(0.4, 0.6, cloud_contrib); + col += 1.0 * vec3(-1.0, 1.0, 1.0) * cloud_contrib; + + // col = vec3(freckles, 0.0); + // Output to screen + return vec4(color_mul * col,1.0); +} + + +void mainImage( out vec4 fragColor, in vec2 fragCoord ) +{ + // length_1 += 0.05 * length_1 * sin(0.11 * iTime); + + + vec4 col_out = color_at(fragCoord); +#if SUPERSAMPLE + col_out *= 0.25; + const float scatter_scale = 0.8; + col_out += 0.25 * color_at(fragCoord + scatter_scale * vec2(0.6, 0.8)); + col_out += 0.25 * color_at(fragCoord + scatter_scale * vec2(-1.0, 0.0)); + col_out += 0.25 * color_at(fragCoord + scatter_scale * vec2(0.0, -1.0)); +#endif + fragColor = col_out; +} diff --git a/tools/src/manipulative/Video Wall.frag b/tools/src/manipulative/Video Wall.frag new file mode 100644 index 0000000..a1d7f0a --- /dev/null +++ b/tools/src/manipulative/Video Wall.frag @@ -0,0 +1,93 @@ +// https://www.shadertoy.com/view/MlX3Rs + +vec4 white = vec4(1.0,1.0,1.0,0.0); +vec4 black = vec4(0.0,0.0,0.0,1.0); + +vec4 noise(vec4 c,vec2 px) +{ + vec2 uv = px / iResolution.xy; + + vec4 r = texture(iChannel0,uv+vec2(sin(iTime*10.0),sin(iTime*20.0))); + + c += r * 0.2; + + return c; +} + +vec4 colorFilter(vec4 c) +{ + float g = (c.x + c.y + c.z) / 3.0; + c = vec4(g,g,g,1.0); + + c.x *= 0.3; + c.y *= 0.5; + c.z *= 0.7; + + return c; +} + +vec4 frame(vec4 c,vec2 px) +{ + vec2 uv = px / iResolution.xy; + + float d = 0.59; + float e = 3.8; + + c += 0.4*pow(distance(uv,vec2(0.5,0.5)) / d,e); + + return c; +} + +vec4 scanline(vec4 c, vec2 px) +{ + vec2 uv = px / iResolution.xy; + + float y = mod(-iTime / 10.0,1.1); + + float d = sqrt(abs(uv.y - y)); + + float a = 1.0 - smoothstep(0.001,0.2,d); + + c = noise(noise(noise(white,px),px),px) * (a*0.5) + (c * (1.0-a)); + + return c; + +} + +void mainImage( out vec4 fragColor, in vec2 fragCoord ) +{ + + vec2 uv = fragCoord.xy / iResolution.xy; + + float aspect = iResolution.x / iResolution.y; + + float squares = pow((1.0 + float(int(mod(2.0+iTime / 3.5,5.0)))),2.0); + + vec4 c = black; + + float sw = sqrt(squares) / aspect; + float sh = sqrt(squares); + + + float b = float(int(mod(uv.y*sh,2.0))); + // a(0 || 1) selects square + float a = float(int(mod(uv.x*sw * aspect + b,2.0))); + + // Texture coordinates + float vx = mod(uv.x * sw * aspect, 1.0); + float vy = mod(uv.y * sh*-1.0, 1.0); + + c += texture(iChannel1,vec2(vx,vy)) * (1.0-a); + c += texture(iChannel2,vec2(vx,vy)) * a; + + + c = noise(c,fragCoord); + //c = scanline(c,fragCoord); + c = colorFilter(c); + + c = frame(c,fragCoord); + + c = clamp(black,c,white); + + fragColor = c; +} diff --git a/tools/src/manipulative/Water Ripples.frag b/tools/src/manipulative/Water Ripples.frag new file mode 100644 index 0000000..fcd5655 --- /dev/null +++ b/tools/src/manipulative/Water Ripples.frag @@ -0,0 +1,78 @@ +#define CORRECT_TEXTURE_SIZE 0 +#define TEXTURE_DOWNSCALE 2.0 + +#define VIEW_HEIGHT 0 +#define VIEW_NORMALS 0 +#define CHEAP_NORMALS 0 + +#define nsin(x) (sin(x) * 0.5 + 0.5) + +float rand(vec2 uv, float t) { + float seed = dot(uv, vec2(12.3435, 25.3746)); + return fract(sin(seed) * 234536.3254 + t); +} + +vec2 scale_uv(vec2 uv, vec2 scale, vec2 center) { + return (uv - center) * scale + center; +} + +vec2 scale_uv(vec2 uv, vec2 scale) { + return scale_uv(uv, scale, vec2(0.5)); +} + +float create_ripple(vec2 coord, vec2 ripple_coord, float scale, float radius, float range, float height) { + float dist = distance(coord, ripple_coord); + return sin(dist / scale) * height * smoothstep(dist - range, dist + range, radius); +} + +vec2 get_normals(vec2 coord, vec2 ripple_coord, float scale, float radius, float range, float height) { + return vec2( + create_ripple(coord + vec2(1.0, 0.0), ripple_coord, scale, radius, range, height) - + create_ripple(coord - vec2(1.0, 0.0), ripple_coord, scale, radius, range, height), + create_ripple(coord + vec2(0.0, 1.0), ripple_coord, scale, radius, range, height) - + create_ripple(coord - vec2(0.0, 1.0), ripple_coord, scale, radius, range, height) + ) * 0.5; +} + +vec2 get_center(vec2 coord, float t) { + t = round(t + 0.5); + return vec2( + nsin(t - cos(t + 2354.2345) + 2345.3), + nsin(t + cos(t - 2452.2356) + 1234.0) + ) * iResolution.xy; +} + +void mainImage(out vec4 color, vec2 coord) { + vec2 ps = vec2(1.0) / iResolution.xy; + vec2 uv = coord * ps; + + #if CORRECT_TEXTURE_SIZE + vec2 tex_size = vec2(textureSize(iChannel0, 0)); + uv = scale_uv(uv, (iResolution.xy / tex_size) * float(TEXTURE_DOWNSCALE)); + #endif + + float timescale = 1.0; + float t = fract(iTime * timescale); + + vec2 center = (iMouse.z > 0.0) ? iMouse.xy : get_center(coord, iTime * timescale); + + #if CHEAP_NORMALS + float height = create_ripple(coord, center, t * 100.0 + 1.0, 100.0, 200.0, 1000.0); + vec2 normals = vec2(dFdx(height), dFdy(height)); + #else + vec2 normals = get_normals(coord, center, t * 100.0 + 1.0, 100.0, 200.0, 1000.0); + #endif + + #if VIEW_HEIGHT + color = vec4(height); + #elif VIEW_NORMALS + color = vec4(normals, 0.5, 1.0); + #else + color = texture(iChannel0, uv + normals * ps); + #endif + + //t = round(iTime) * 20.0; + + //t = iTime; + //color = vec4(rand(uv, t)); +}