From 523a5e6d8b28298291c54df858c2f17cec7d02ce Mon Sep 17 00:00:00 2001 From: Rohmad Eko Wahyudi Date: Tue, 16 Sep 2025 14:34:50 +0700 Subject: [PATCH] feat: change to bps rw --- Controllers/HomeController.cs | 6 +++--- Dockerfile | 8 ++++---- Filters/GlobalExceptionFilter.cs | 2 +- Models/ErrorViewModel.cs | 2 +- Models/FeatureModel.cs | 2 +- Models/HomeViewModel.cs | 2 +- Models/StatisticsModel.cs | 2 +- Program.cs | 4 ++-- README.md | 12 ++++++------ README.pdf | Bin 118086 -> 118338 bytes Services/AppConfigurationService.cs | 2 +- Services/BaseService.cs | 2 +- Services/CacheService.cs | 2 +- Services/HomeService.cs | 4 ++-- Services/IAppConfigurationService.cs | 2 +- Services/ICacheService.cs | 2 +- Services/IHomeService.cs | 4 ++-- Services/IStatisticsService.cs | 4 ++-- Services/IValidationService.cs | 4 ++-- Services/StatisticsService.cs | 4 ++-- Services/ValidationService.cs | 4 ++-- Views/_ViewImports.cshtml | 4 ++-- appsettings.Development.json | 2 +- appsettings.json | 4 ++-- docker-compose.yml | 14 +++++++------- package.json | 4 ++-- wwwroot/js/site.js | 10 +++++----- 27 files changed, 56 insertions(+), 56 deletions(-) diff --git a/Controllers/HomeController.cs b/Controllers/HomeController.cs index 244c790..4744180 100644 --- a/Controllers/HomeController.cs +++ b/Controllers/HomeController.cs @@ -1,9 +1,9 @@ using Microsoft.AspNetCore.Mvc; -using BankSampahApp.Models; -using BankSampahApp.Services; +using BpsRwApp.Models; +using BpsRwApp.Services; using System.Diagnostics; -namespace BankSampahApp.Controllers; +namespace BpsRwApp.Controllers; /// /// Controller utama untuk halaman Home dengan .NET 9 best practices diff --git a/Dockerfile b/Dockerfile index 7e6e584..c0f099c 100644 --- a/Dockerfile +++ b/Dockerfile @@ -29,7 +29,7 @@ WORKDIR /src # Copy project file and restore dependencies COPY *.csproj . -RUN dotnet restore "BankSampahApp.csproj" +RUN dotnet restore "BpsRwApp.csproj" # Copy source code COPY . . @@ -38,11 +38,11 @@ COPY . . COPY --from=node-build /src/wwwroot/css/site.css ./wwwroot/css/ # Build the application -RUN dotnet build "BankSampahApp.csproj" -c Release -o /app/build +RUN dotnet build "BpsRwApp.csproj" -c Release -o /app/build # Stage 4: Publish the application FROM build AS publish -RUN dotnet publish "BankSampahApp.csproj" -c Release -o /app/publish /p:UseAppHost=false +RUN dotnet publish "BpsRwApp.csproj" -c Release -o /app/publish /p:UseAppHost=false # Stage 5: Final runtime image FROM base AS final @@ -64,4 +64,4 @@ HEALTHCHECK --interval=30s --timeout=10s --start-period=5s --retries=3 \ CMD curl -f http://localhost:8080/health || exit 1 # Entry point -ENTRYPOINT ["dotnet", "BankSampahApp.dll"] \ No newline at end of file +ENTRYPOINT ["dotnet", "BpsRwApp.dll"] \ No newline at end of file diff --git a/Filters/GlobalExceptionFilter.cs b/Filters/GlobalExceptionFilter.cs index 208818a..9dfc88a 100644 --- a/Filters/GlobalExceptionFilter.cs +++ b/Filters/GlobalExceptionFilter.cs @@ -2,7 +2,7 @@ using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.Filters; using System.Net; -namespace BankSampahApp.Filters; +namespace BpsRwApp.Filters; /// /// Global exception filter untuk menangani error secara terpusat diff --git a/Models/ErrorViewModel.cs b/Models/ErrorViewModel.cs index a04f9ed..a555391 100644 --- a/Models/ErrorViewModel.cs +++ b/Models/ErrorViewModel.cs @@ -1,4 +1,4 @@ -namespace BankSampahApp.Models; +namespace BpsRwApp.Models; /// /// Model untuk menampilkan halaman error diff --git a/Models/FeatureModel.cs b/Models/FeatureModel.cs index a92f6db..1d8e95d 100644 --- a/Models/FeatureModel.cs +++ b/Models/FeatureModel.cs @@ -1,4 +1,4 @@ -namespace BankSampahApp.Models; +namespace BpsRwApp.Models; /// /// Model untuk menampilkan fitur-fitur aplikasi Bank Sampah diff --git a/Models/HomeViewModel.cs b/Models/HomeViewModel.cs index 04b829f..735c4e6 100644 --- a/Models/HomeViewModel.cs +++ b/Models/HomeViewModel.cs @@ -1,4 +1,4 @@ -namespace BankSampahApp.Models; +namespace BpsRwApp.Models; /// /// View model untuk halaman utama aplikasi Bank Sampah diff --git a/Models/StatisticsModel.cs b/Models/StatisticsModel.cs index dcbe43a..47184e6 100644 --- a/Models/StatisticsModel.cs +++ b/Models/StatisticsModel.cs @@ -1,4 +1,4 @@ -namespace BankSampahApp.Models; +namespace BpsRwApp.Models; /// /// Model untuk menampilkan statistik dan achievement aplikasi Bank Sampah diff --git a/Program.cs b/Program.cs index 45efd97..e8983c1 100644 --- a/Program.cs +++ b/Program.cs @@ -1,5 +1,5 @@ -using BankSampahApp.Services; -using BankSampahApp.Filters; +using BpsRwApp.Services; +using BpsRwApp.Filters; using Microsoft.AspNetCore.HttpOverrides; var builder = WebApplication.CreateBuilder(args); diff --git a/README.md b/README.md index 29eb2ab..92f1d02 100644 --- a/README.md +++ b/README.md @@ -1,15 +1,15 @@ -# 🌱 Bank Sampah Digital +# 🌱 BPS RW -**Aplikasi ASP.NET Core MVC untuk mengelola bank sampah dengan teknologi modern** +**Aplikasi ASP.NET Core MVC untuk mengelola BPS RW dengan teknologi modern** ## 📋 Deskripsi -Bank Sampah Digital adalah aplikasi web yang memungkinkan pengguna untuk mengelola sampah dengan sistem reward yang menarik. Aplikasi ini dibangun menggunakan ASP.NET Core MVC dengan design system DaisyUI dan Tailwind CSS untuk menciptakan pengalaman pengguna yang modern dan responsif. +BPS RW adalah aplikasi web yang memungkinkan pengguna untuk mengelola sampah dengan sistem reward yang menarik. Aplikasi ini dibangun menggunakan ASP.NET Core MVC dengan design system DaisyUI dan Tailwind CSS untuk menciptakan pengalaman pengguna yang modern dan responsif. ## 📁 Struktur Proyek ``` -bank-sampah/ +bps-rw/ ├── Controllers/ # MVC Controllers │ └── HomeController.cs # Controller utama dengan .NET 9 best practices ├── Services/ # Business Logic Services @@ -39,7 +39,7 @@ bank-sampah/ ├── Program.cs # .NET 9 minimal hosting konfigurasi ├── appsettings.json # Configuration utama ├── appsettings.Development.json # Development configuration -├── BankSampahApp.csproj # .NET 9 project file +├── BpsRwApp.csproj # .NET 9 project file ├── package.json # Dependencies untuk Node.js └── tailwind.config.js # Konfigurasi Tailwind & DaisyUI ``` @@ -56,7 +56,7 @@ bank-sampah/ 1. **Clone repository** ```bash git clone [repository-url] - cd bank-sampah + cd bps-rw ``` 2. **Install dependencies Node.js** diff --git a/README.pdf b/README.pdf index 8738ca62420a27d877f15b27389430a88a4abe94..f2ec20125ae035e116d51dbad89482ba62cfd704 100644 GIT binary patch delta 21345 zcmZU(1y~zvy9L?=x8m+@#Wg^2cXxNExHq_aD8aqByOb99qQ$*9#i3|{%fHX*zW=#5 zPv*(2nas?3?OX3RGlQ83z1av!rVM;s>^wZo?CkWfUq)m$B^OIcGY=~Y21x-&KYvM%ssi(H@e2!6xO=!+nK>c*WSg%(qWE1egq{-LzetZ$|%lRDN<>k}2 zKA&ts@YWy_(OD;j`48T&q6S;61gC|#MPGmHUCj3B)E@n0%lq25C}#H&(-|VKALtrl zB>Z%K-u&(P@bb_E-S0}AJs`|F@A>2X@;CSkomzpnro61Akol5Ha;pa+B~v~YoY|S; z$xpI<$d&0}bE@b8cPxkf3@qQK%8}~kV65ksHq^o|HYrzCDJbTRgf z^`@cgs`Z3}8K$g(&*P7$y1b_2@#K${+t1p+pMt+_jpJ1FkU!4eg;?2!$!deT8Lq10 z5~bxP395f(YD0EC_iirj*J{VdN-fwRgDK+DczoMnx(v!Nw)Br%vA!cP z{Y(egL(}$#4v}{E6Q$qlr)?VDxI&nktZ9oU*p(bO?`({~iK3j&ae!EkV%#p1Zqj#! zdQmF{7mm_w<_Xg7T|GrP0uwBJHT->(R6=_k0X4j~gJG-yYj`rjuby=@-R86sllXFlHrtMif$m*=!b7E{Xyh`6GPgZJdK7<*UUZa{rlaZphVef zXMHM{P6}w`ee<>aNAk6t`;>=e5|#n8qne-F1+#^FlBPp$7AFxnEM@BlNr;QTicUJx z8(E!aB^oA-)@s_?;|)#?Gfs9dZVZhJkz0?zo~)A!#kLT`b-Q;z)Bo5!bm#HWlR&ld z_Ol*j_gXY_1U;?K6Ha8B4eDOvL`2?yP%;FPDZP}(ZqB=`5(Fk28l;l35%-25;!EEr z#dcedcA6z|otl4vBNvy-Qp4x&d0DpJYw$(!U;Z{7z=mqXM`OUuCejb>Jsh*~E04+q zgTClY%`mzbB%+CDArRUFFIg=IxssPDHBbm7x=6naPuYGzC;VZPb$gylp>%}`vd_}kL(Vt0UERBhAz#Crb7MO?d1+!%`oGgqtm4q~n5yy7pJa|Y% zAXT33q&Pt{tx)n2nov8^85*sbsiRaLB+jZF`}qV*S0{_Sww*k3dxI}3dkY+L(inHv zUMW(DKV{Wa&`sY2>p<<%N8SM5yo-QD8K;NoOAc@2qBIv%$u;nM3}joX0<#&az=ryy zDdI+?I`o+smObyVQ)kVZ!xh;?L^Sitlq%1DP*y^lAv)kHd%V`_dCeE+6V_nWi}DL~ z*Q(@Cn2CWJi1VMz3-qCNu)kZ;Uy2KT#8=uLQh$j-)t{WUU@SeWPiDq{TsadUcLP zZ*LmxoZks~*({SfW+&Jv3QCNZP1QS6=IYrHBV4H$xeE8HPN3AWM8^y9!mJX1YL(?Z zm06|Bxk*FsFjJdezJHe%j_x1TSU$S1*TB>*Yj>>g{taL7$Sk^{*MT!`0=)kozi~?9 z8oRJak#wltWUzfp!L-%*EiuOguk_W@R_aKv3?M4)$&Z%{_%X6do%eY6pd>?`@zBWG zR4F&PzvI+Ak82*7+#g#il*m;G2ZRAMI?{Ygcq14_*VN*RS2VM;NM>>H&dYbfrp~mb zX)mA_n+q#pJIzyG#?;VJ9!#xrcCPTTHcsQs4TTZI zid*X9eW+(Aw{Du2Q|kPe<)MaS^QHT>`mt3bB{#rvN*8uT;`_E5F|h30;AN%7q2v27 z#!u$6zk-zVWV3=nyqyz;X{TKQEyd%!NIwYgb8($e3Glts#G3J+ri}iek_C{7fQTu) zy9qx2)DyOv5=N!tUH9U5Q|URn-!J~%|J%l@ceOq#&{4j}#ldZ(1Iq0H&{7&js!$(| zPKf`Ut$^>)o@7tM(+D2i9dFnr5Rz`Rh|)Atek(O7wZAnbXm0XKcj%qt!P zk(0=jyx^*`dnaG-8Fd`25)_MNu>)eqX6#WnrQg&7#bzrq4wYj03-?z$=gCm?b@RnD zf1;o#Ljv=-`K*em?x#aim}bbcCBTsPUfY9->&KY z##klpon~(xJ;0*SQJnp@14FupaC~akgxvfv>~*cR%v3ZoHAKGBRQXzJR9rTWLU|}qkPiBk&hju+#BwBOQGd+ic!$hLu2zd` zX`O8y5aaNV!^XQ?xTw63L3uyZ@2${q3h&w(r{4T4XB%w%lD58HkEitu=?Eg$QDqmy z6Aq_zIb;`pupmqBm}$+>HjQo`;VIP`UUv}Gv}-JX`MX}4sU|Hl7pKjiszz1rl+Z%F z%jT1T#>4MtsT3I46tdBjJfFts+6ww5dMEz#T6H!`hK?k9V7qV|sn{>x>%JrPX>W z-#7$@nOhA$UMYGOUiHrjoAzc33QF##qYWivbA1J?H1(o5RISoM&qkUWQ*J0%Hx)3O z?GEpy%FpEfJSZW*OB-c2Cd2XYf4R)gSEetPa%BJ~aHb`uD=V70@{))6ZRA=-qq>1B zyaLz1+c4T?gbv9K?aje>8F6;frRYrP(9zT~n;WC%&f9rN((V(@(Zj9=VOMOWtok_i z$_y8P_a9x9@m-cy|3EXeZRBXHuoX_Xtsv(wZhz`l+nSK!>Q*tIfPc;pJ|vyGMMMr# z!4-r1LDkvQn3*_uv~@xB_7k4~k1kIvvKF_3assZoHQ#v-jTHgkaORZHt~| zVw3DD^v&z7$6?^!NFvQza%W0#h3?|e7bzY+2xy4Nby{!=)-a9HPdLyMl@94K(-Ym$ zxqe(o9_(y|ukA!SCaY4n44@0y4z3T$hkX1w&v8D$Ptq@2K z>Zm$6AoERj8=ML*LRo89GM6w{;ujzSuR8V;(94zae(y7K?Wj0BNO%_(^`-8u#|fSW zyG>tP$e)~oYEuuGg)qRuTh_I3JYBlIZACe0@4kYr{KqaWdA{HRpJ6m7a38Ofs5ds@ zSHfS%`Kj#YMRALSZvxL7xVU4|9mSB=AZ=84AO%WlsVc;^S?;8sjxsBCM5<_9aD(fY zVu3Jw$i#yJ567?&>3}wS!#m@=$!;x1I|!xoLuvE*iIClrWT~p&W`&Py*x*+fmBO*H zp0VP!rk`)r+!!U`XxW(6^XZd5Y)uzCVxeG3xX2l5$;#vh(Ye!MNcRE)3KpgLIw?6l zNEs+UXCk6aYQ zL8oJHFn~NAF2>)(6lb0a72s%MdvPB^j6aFz06k8O@rpBOYe=wj1gzqT!CkRj+(LOY_Bn# zN5I6PCLcB7Jrr+6HknOS;GEIw7akL#dnR6g z;9m%I&(#||gzZB#LNg4N0I#4%o@#n6qn!)UY3XS?Xn88*_DU{F^J@>~w=56vUOVmN zOUx)N{YcnrFPZfH6StS9`JLn`HkG=Mqm-UxM|zKqa|*EsDn2ULM70iunfm7 z`>XU$z}|K5eANYBD#nAMi1l#ucmLLBJCgClhc7)NLvwR>bBZK_RbW+Vp;lid=8x4^ zdB41@n{o5G&Dt9-6jY~cEU-{5YJ8Rv`dL1qhvtVLmBWjXN!%Z?(lCo9g~HX&DY)&4 z;itJB)eGB9OlXDFzG;9buUMiAAP1}=lE?RyxvpiWFI#Kpm~7t}bLKJ`Xr6p+?Y;%I!s$yh&EME+maU|-$F`bI zRGNnPyQF9Epq&z9l!xEDb&TUMtJW@*w3$qPk#FD8g3IUO9{|TSK|Fi1EkClKb&<`9 z&%-Z&2Tcl%gorUcoM;cE^UThr=I7zg9g{X?E?6|X?3R6cw#laP*Hu_nAX~wF;5x%J zr`A@d(1V#u*LoAksi{ueHZ`P8u~}I}=Pq$yNa3fn^9P9eK<0P*j8$~PKf;eH+?dG5 z%A=M342>KbqhIPY7-=YzW9RewzK+pZm_$}Qj{2pjAxeWUuTpXQ%EdaV+e@>{&K;Bw z6qp8vd1Ofp!Yx;|hBZ}lv4|%l#Z>60EOjS(?`S`Va!2|ppO`#&J%}bYo2&P&uSrD4 zn|$t@;l|;bGrkOJR@FrVfYI+IFNCx|{#got6G-3H=C(IIqIC8)ya22_M513siC8hZ zfrlqOKph7*za^4)>(#hrV8I#E@Q6SK6A|9xwRK!DM^yLZe=qJ12SUINL{y+Y17st2 zb%B|@fS6@x45+fQMliE>)smx5xw-MoW9*}zr9vl?a#m>Jc;?YZ`7LEEEmpaX==ynw z(yWjsO{hJ8PG$jjQI@Sd!o-1Cy~eP3Lv#l{B4JhQ^YPZ1&pO zY)vw~VnrhDn|o8OA)!&cN+Uaf7m~o{ zd6R8DBp6=ze$0TRQnRwt)cBU&8y)7iqn{0BWse0#SU?exbeZ{^X!x5N`DVaNfXvj} zCt&to^{4Wkdh-LKcfAvB+PrH&zN@S=v%=XgzdLV07&&5DdxDuQIiovxJ7I~qe1lqg z~ko}f0N%Cz&Jqyv4y~Vp#O8X$7rR77Nj0nTe~cbDCfn*Zg%MAN*}g z>@ol4&#Z{hL*&cDRiwzDQ1GAoZw7($X%BVf{1s;^Xq=iYU{O6Cva(am&;pzC@u57C zKU)qyKZYj3;%iE_j~{l=d-m@bCWJmd@AhrXD5t2QM8S;aa_Ycw$-EBp}Z{U^(*K{<2mh#id$Y1;J zQNF;w$+ta-+F>hT-EbU zr-DAv@mnNJ3L*Z&n=yB8`fjkb{n#_NBrhhF3TZnV^uoec;x6|2DZ`dBZm@8K3emoq z#i_yDY@FY~+aw|abCC~n{pQytiCLcTcL0F=g5%2~_DchbKA6yCL8I@ivoothJTGo~ z-6+C2qPCJuIwzRo?2v9BhH_c$YcvZ+dM$aQAI*FJViH%B`KxI+d1vr$-BMbE{^RB0 zZcBv>UfNGaXsbhUKeypmNdi~&XYb4Iyu_a|zu!&n&IRFCLr9atp)JWpIlreWkeYNY;s zQ)1XQK8=J&Lic{d=NJ`S7-N}m7vusRV%z4@o!cf3eB1v83qWYZxGqvA+B?-uDmitV z(G6>JfoE!=S;RO-6@ii8y;KKgL;R%Tjmmcg`GQW_VHfYLCkazkWOc+N zEF?9S%&g z@bB*LR}i*X3%Lc;%Ah%_BkW(a5XY2RItE}w?SqDpD`OBoP1zBDtSM1?5z-8=_ECkP z5HQ0qBc?+@1k7L+6a^UJ@Fe&aj2V%5jG1p`7@YFRi8~Krx1%lLrH$F$sCr%T!sPMBoRjx3daBzBoTNZBH@r1V9-k- z1{)w!9*~Fw;bdU<8D3%8dypM0u#<)<3`0?U3~`1%0Zei2DV_AJCxxMw`DCy8E9Sa~ zQap+(1W|9PRH}CIg&I95EerruFOHxCMe`%IXS>?!4eG^ zdD!U@^f;?Zpy-n?7)7KyUJ8ZR3y{KagToc0VsuZWfX$^s493TVT^5kR0Jb8EPk}=E zaV8*mKo!ieZk~W8Q`p3UiPz{wVmt^)$i9H9#G@F#C(s^Q(Q9&|y5ROUXv8{Syh$S3 ztnaP(DMsrtN-240f~wW>iQtFh94=s86toUA=-=&wPH+a;7UY*1^$bt4Yz?2WWW$q3 zBAEb5Ac~E}x3`Y8gm--{;hGbtXd=XQpgyMxqv>Qz#d1TYgf$Ms2vMOd4rU3vR-p!m zU9&NT#ibl47Yg4P&++?>RUdA_lNlk@>_$AT)kUTwF8T~N0_0u z<;m0$nr#H>W8CJjY}hr^&+s2F$Vk>h`}{xLz2K327rn(_irh2i)W?wi zINTG0f&B-Mx#2cma7Xqi@X<33ddwavRKld(4Ud_@%Q+r)>T*4w_KgQPA;m{0@tJ6fn zm%DKwLtXoAjie2!AJM*Sy~p^15OOPe4hCWTK~C5#1KLot=(S9yd3_2fnyjuD7d?F5 z)n(|-B=4YnX5bT=k56bh;=K1NNh!uyp|r)sZP-I}&%x@f*}ieKKh6Rp_r8q~$1vl* zS!LHf!9Wt5d^?*E;>6#%1++3n=L6?V7l75K3nY4|F z*2Ou_%vaHK+@<+XT3HZb7#t--qlipFqE*)>T@S5j0!hzYr<+&8gvd# zstBCP5zrz|damM-T@N;nzV!vZ=}(N>R4^@bP8C?z0|7C?S8j2n9xhyDohhs|V@N~D|< z%`D?VI)HT+)LJ!_buMRE_OLcT!F983Rx@-M!rgo_eu^6pA5lx0oBA0jyY9>~ScG@i zpfy9OVy3zTu6PjJe`mq!`iqN7djMye>1hgNqk`>LE{A$^U|5$mzimb(#L0{zW!3*& zjXS7n=Z`N=7w}%5q61Yh)>?4|b9%i9B^vc4hoKpXTZ$gls71>QA{xM2BO;5nl76Y-|f5c88C~-Z0X3aDc{N<(Yi@4A@8BLa%4K`N20rJvP zxR%J$TDY>0Y2Bp{svOVN2W-5pU`9usQl%G8mx%m87AAH&0YZCml(?VTA;zQR0KM`m z(=6%yGM<(JSWjtwa$2hJd!(2C$V`8yDQmGExzeI-E1pPEUAt{3w)43>`yhQL-xsfV z@pimB@R*7U6Grs0epvD_=kVKHgZ=Y0RY|ePp8^Egm-8f!r`_D+17fGY_AHn4unbas z)}|>IW!Nyb08>o2_rAC`eWGERYm8mBOkN-vq-Crehb2zZG5AW;8UB9qJzn1 zS<7h#^HlI2ZE|ZZ?!9tj(P3BD{xZ{*=@*$mu+^HJsz~MW!DO< z!o*T0X#W`ToJkNk=x+MLDF_s@kqOdS!eo~_)%5HCQ}h`VzolPR-KB^eoYiP1R*{E+6Uh8*oGkcM(JJx7()tq=iZZm8!nhirwwsnQrS!Cpz zO3sVZhi9)zkuU z@zJE{;8Qe2&_le2>d$4H)f3)ep6$1G)Odfm=o_@+Wqli@lF9T0l4aY;sSZblA$nA# zV561}!VQ5FUN6j5yHTaZ48u2HsPKbSG@OBxJHXA?P5)U|=KV!h2U(WUds$X}M_ICx z*Y{Y<;Ko=37md_W=A%gnPq}xs{nB8Zmn7dRv1Ld#9${N!%9~t0dsyS;hS>OV(h_BS zoIG=I!*|Boywd&BYpidkqI6{}Xb09-D!ad0nVCV0?3h+Su8luxMLn3Mg&~SXqQ5J- zF4d^}Rv_U*Yi@IN*CLfnKD_fRpT=?8|A)KXAUL#G-TPK)Vf|5GKR*pbC9SG2xr;D~ zXRK81Vt@L(dI2GZZNRguOu^vW;VwI;`$s(em<`!$=SCmT@I&l1~dN@J88rj@zY#ks9mhUB{_tytO&8B zT(fA^)rx4f{t;PiR&v=)Mv4W4+pqX)cP*zh=1yI9j5qFAgw2+1Q6ftG-9NE?)7UX! z<5QQQng5Q$_WLQn6#91Bbt$>#W*03Gj_#tJD>75-!xv9x2GL8d&w$@=DM%D19Z2Aa zias_TIT5tv!kAKx<>2G5BD1VpqyDywXwJ+Qhn>9cIO_V^+_s6rpBqR8zKNk6u}t+! zWQoY%Xm&gcu~?BzRq|E;?bl3-UH0^2xQ*$y`ZiAZc{>z+Z`dOYY1fX(#7_S_Hb|im zS9GDqEvpPHiZ%?wgb1PXkLPlrbyw|0-SGf`Tj))Zz^a$?bcyNJ9&8>N-2_pNXtySj z(b+GIZKAm5Zr03nl%@}0nF01FU{SSk+4{6JskEJfO0kZItV5hRt9e2YW11~O`g?Wh zvQJn5PXynzB+_&lslreg4&$=I_kyYgtuEMfQ=~{7F)cOUwco&ZG&bu9zyhOu3xAva z5U^~u{CWVhXR|67B)dbYN?$4fkGF#2HlGtT;;ixAu#a2jlM>n(n6`2tllP_pz(-TO1_*rjLTGV?6Y{iF=F)32NG|`(jtZFs|Em0J5w5(yo zCEP+TN;0JA7s(}E*xuWBtQa_}3Jbx@zpyO_$#mNAG@Rvu$Nb6Od63fi%{VXdZqfgF zv^==+u=s;IA!88pp30~N(TrVwdE$vw(tt01>OkszLaq7J`5E)F+nvpYFKy_;^-&FN z|2GYV!R?oC`JZH~H^EP~JgzP)-haq0NPE+DrF~@y;^?qTwGT&~&ox_{ANsCkq%Q~M z2X@H|-Yx%x0jEhU|2&d2pnS{nxd83qc@~=macyk*qgD*~m)6gj5w`NrDmM?#ww@Dz%g*bg_Jvj!FRSMnM>h!qa&Y(DX5zBkAJEJBZ3;;d*LYQK>_Q zDE36_^la7)UyPpt!~tM-=u&(3s~my^ShlzkDotAm1K*YO{1*4L^W*3+4ULAOL|L3hZI+b@2DxT5-rXKZ)OuQC{U-wSQ zXU?Kh0@Pjwk`%`GqW=8^ekI1)WObl`m1x#QIu9R9KM;j(*Bjbu{JNdrK)juFVr)r$ zWI9MP+vTW{PMgeKh;Rr@3gYl z<|Jj!;DMPau(NP8aDD33sRPsCgCq^p_?kFN%qG}?3T^s69d@9!f2lVVm&7C}Wd}vK zApn3riuoCw5F%<*UL`AjHvqnEhBt?0t)kZLJns*fVQmyN^R-7LglF>guU zgrFhncR?o*Yx4F(b0*EwnJEwPl8tV1V2wCIBr$eGY6w!1JAIh{hu2g*Zl!*_4(ZTn zlm?$4-^PBKq!qFa#EyI28zxC1MeCP7)!0^L2y&J){jjG<< z8L#&k#}1<_<*6%t5T@4ksg`CGsU5eRlRWIW`Zx0PA576p0~vV4k9?LR8}wHd{@51! zNIcD>(2DJ0091ee!P`tg9l{pr4BYUq{Mrn5KvFD{_BIax=I|%Fpt`TjSf;~gR$Z!B zf*o9+0$sYi#cT?RBdPeFnMVuDhk^I)g6l`@oAs-68r!;KO!r}JtR~3?ewhtzaab{h z;OFuD%9woG<-`!~LPVm_n0$^ZM54Zs%?}nKsB%59u0NIEg$xAZYR3I8Bv@82q_7PK z^WHB0q!nR4L9gUzre*qJ_weWxlY@(BX%JzY^Uf(zJ}M;(?VX){i|WAm{8dQCck9<# z?Q+Cg38h@KiJJT9$;t{P_q7%p#X5cW1XghT14Frx54m)7QwxI#;X_?Tqe z<&>NX8q09rTKu9rT~}K~G4a{@pSI{ZP|GTQ#ZMM$D77$^nK3My9QD7yu#Y%O6SxdF z*4NRte~6mvVNQHFVbHz4fJ2_2UzQ(Q&^J8%QKeSDy0BwQSU25t9hMnV1k04Vb=77#_7$ zBnDu$w;p>*#55Xu2s;PeJyuZ)E5~S9=!%&=6|Ff|UxP|TAE~8$e?^jH^xUB22*}4x zaE*5P!@L&}WwGnLSP?5@A?yzcXA@WrAl|{G970bj0YoucZ6uYzs-*vf9jujt#i3=s z6pm6QY}`JT!Gu{UfMNBeP=2DxXj~7I)<%d_L|*Eg#?<30Z?q&z)N_lRO$;;j?1sNg z_pR~=8q+3(w}cVyLKZ2M985@9MT+cgq$O19g#&tNJL8URp;*M3N&QiuZj_2XD0dJ- ziRw}ky%LZ3_NN9o(>Vg{nl z2hUYBb_!waHQ2GVsNmvaBPqSvG}&65N57sU<6^#;%w|;CZ+;e<^=bEQ6fBjvV)|i1 zAx-Z_!k=`|YghL}n)+1}Ump%7r-`~`*|N2ov-I>Ak>X*Ovk<66Hfds^ddN*gx0pV= zX?AQW7Hjp!6`<*52jQ34zEX42E0cYtCWaFsDK?!(>6b(kAJnALS(Fc4%&@h7Ap8`q_|+pQd|)n1vJ_ z<_SISMbXBu{c_Ms%?g^+!GeBmxjOdLXKI+(K#^kHF6pY>14(6AeS3Yr$24xoCqJ+= zZ65NK1?kuujJRew@G{UP@DfST*B0=Jm5n8u%7YL=+X&`>{j?}9v>GO+iLfIl$m!RZ zhm2<@TElfwgU82~DbM+|nCWQ!4S;34C`L}#31Uw1Df$duW=qQIkUz6bsjtQ%0Sj}g z>+4YO5to%qiV%h%5A{uT4f7FicB(94!#PtB@y)IT|7p%sO;FaHN#yLTGH@u(wLlZE za1{`c-@2!0KDHKdCvDIi;?Hu@vw6a3os@6hZfmtc32V$SZ>5YGBS-t)Ix?b_{#Br6 zne)fi6tMy4fIO))E%dm1%A(Xyu2WoL<&xqzrh}mCQ<6Q*-f)z9PyK|%>I|00C;&^O zc;F{H*lGot7H#dLsm{S9-XT{P=E9TH{XCY;-6od*eZ>J;=k-kJ`Qv9ckf?5>8-)^a zDvH6Jom>Zt7X0xnhigYiJnyAr7Utb%k#Nhyu{ydiMgq4sBaBOO#H8hVHUikKbslBG zuNuz%{CnnoZ$8&4T|biSIX%o!;s^xb_LT_FEc?owoB2FaH%KcD`G!bTmZ?0G}_&KLXsHfi#NeT((2?pQ#|1^?54}L~LCsl1r44ts5 zXL;s&Zhv+mv#=Gs+D|A?3>Xf|b=Vbqsv>{sO}!7;z2GS?jJI#GX=GhASpYqdo8_o7 zf|t@;IydJ9Hk=4w`Z>Lf4XTtSb!Js0`&xNAzkP}HOZB3+_VuQ1aCeMSBadm5WgF5W z5j2YaGd=!6b{*3#Q2k?6!$u89NcHE1<8+a#GJ(5eByt_yrI{O!_PgS_PJ^b%$gfAL z0^jYIJsnyR>R6maivPEb%|;8FQ)I%-6*GVEx8R$5omeJ`X*wop zPf=%Gu}y2A_$0|kX(i4__$cC@e0cVax{@|Ndx8twNE`m6oBGH0ob{584Kfdr5>&%R z8EXBgdvYCQ>&-?x4mCvZ%I(Dmq+5>1i=Uzulf2uxESnekf;Jh;Zp)xeNC@nP_TdWb2jbL6N@KznH=y67C1dVQq2VTKcS}_y=_?RGov4s@ zLBu?7}}O8zqmmn!y>&i6gGcgN8v=|H z=AA$&{^e#!JBxq|%a7QvvFBEmrp2t9cVxCtv6M`#ra^)`5S&807|Qtcse04vi55C z=r0{nMl{Vq(40Dnc*U!72-@@4-b0m2fjVX3r2rlK>JJ)W1yhV(m~D)k4614%qx<5` z0^7Kh)^b&Fo*ibZoR6|v6=@7}@D4%w7lWDRrT(UdoHD$YiWiIs`&>%OW-%jsrp8Dr zty3jOi~`(h^AoG!_tAvAHNR9RFH^q{xyAY*I^7sMOJJ~6;MJX*#?X;n8gagxTlpw) z$XAugbB3a*%WS~Y`(-J=glO4|M`5iuowY2BbaufVymY-W*D7SCG0PVq-S^1}#CL+9 zwRgC@UvQY{^P_n~G*p(<)*wKb`n-nUI@0pqqW5>&P10^?2d(_vS0&OVF8y6%2CY~V zgwOU_8Xqf^YQyFoQW=6NV$tccS{(F~^z=5YO*2Ywn_zKAuFee(&^P1$SQA zwS4jwz{Tue82q*c9N&;qP~p=qe;~i^*}H8V5&8@R0f}ff_KKR2f_eV$n+RH(3Msq% zh^vn{9YH4N2sxz!bk=HtFHWIJ$4oA9R>E>AwkfCt@3vb;sOfeV$iEan9KU){0ljt~oiOP%@si)!@;u2hpReF+3b z3SKTviE3sgW=m4c+2Kuz4Gp&-^Fc^o9f>U1qtxaIgf~56qcM2AJHX8>>D%{piMR@_ zh2JbhMOQXF8rRpQwY7KEETkjQWv;J~ou*v1+0rj-16qh*9!aVsdy@O(R4;B^?RPBu z@5NlcUw~rw!{j|h+-_%~93?zPe%JIIYsjQ@#yWx%TSxa{qsBWT*ss5*RkR7`sg2G(y`F2LvIDt4;YqxICTdHzwRF&ULMXK z5EAJL^&nz~*pMU>hDIu5X8;7>j2`mw7`<`OL=6B5v7m1hHj@BC!mSt@%PrOb5IGx$ z#u}?E0Du#cY(fv@=7+f32*NJ=S`0xNY;?Fzu2+wsUa+T5R*(A2f9k6I4X#S>ba~D{ z#KO2y(;+oF!=-Dl1%3XSchOYA2`~RV7LEWBvelI;y^fxq{3JxnzZ7R<&xVAkMr_gA`aZ+SsjW_|XItw~&I0$N$j8W9N{Ctj zHh>G7ZvtR~VB0Oi@PpVPr*=%xX(a$2kcX?0-F_Yb1LEXvL~#5A1LTx|Y~A5NL_=U3 zi9hrJbR?uGxOpkqDb$hKY&a#kDY*Im1w0ho{C|PeD**ik(jW>R_J4r{1rNu6fbi=F z*~;0{#oQj52g0#K4@nX;gM9X2XqMehiJjy^>%c zRQ~jkDnCykFFQmmf&nt=f!3(&-vRg!?uo$za5Yl2cmWyaf@ZU^%p{_iD|Doy=h6)i6B- zNg(-Q-vHbY)9_%3Xaox6I9wAF5y{wS7eNYu3`H?E)Q>%YH}Z1+FIir0aSC3pzu?u4ynk)teWlI&*Ct*bX$s!IHu3Vl z{_P)|{tt5y)YSuk-AIu@i3Z?NeC!aN?19(Z z<=A6rl*+LJ5dA~V2$@aOMa$XF!o|{xg6|)K!om=xJobMAM_s_s7?@WIfDjhaLlg=o zAi~A;jiQCm0LVrOeWO*e9}vP=M&J1Q@)H1JUP0feT80UPTvstPMprljA?!8ujU?4L z07zy%eWOl|1Pp|$iN3L?-VOMl%xKhassX(E_HTGO;lY1h!t_tzyn zQhXGAe_g^O#ZSTaH_SXzAPT;}Vdi;_Ip5z@<&hGn;QyPdJW>)A{C|VOBPB_}|2HT+ zQg~7n{Qpq+Zx8eHK!fuE(h%oCbqKf%6~NaR*R_rK`txDX69&K!6@&wjLU$cs>yBlV z2!g4>(C9J>1OPz)Z!B`g#sIufWfuSiBzj!pbx%(WE)c{H9d`kkLq%Ny(-8a#LcG5g za&Yoc@c(1Se^@{!C;lfA3sa1ZbWbQi$nP13M*Wu=AO!mdW2-h0APj_L&ND!}U;+M+ zUkj*EDL8;OWN(q7wI2?^0Dy!pGqmC&05*Y;x2p`$ZUq2(D+@9}1pv8NWoRu%0TjLt zdm9X`&S(G!AVh7Gp%s7u7zaWaelkFRV*#8X>^qFDvDkoi0EBIi0n7{H`|q~_wX_u6 zXgLs9ZW#lDy)qKxK`QDRjl-*8LE!44CFJAtFd}6XbL+J3a+hHy#NxLce!F+>-P2j& z`^QD9wvbNCAD*YWW_hmNoztsEjxAY>kHFJys)6!Z&cPZx@|cbIF#n+7_6(tmnJ5|9 zPT%j!;Bc~efU&{~i)6I%cO7Gh9U;w6i*kv_7Eww?XT=Gdv};2Ce)VFDsLxLFxoa9H z>{=7lfayan%Jpt8^)xsm%>tFY&lqh>K6oY=HrJbWi%Cl`;_(3W^5cl#0 zYwFQU-wdeQetyd*p)5zJmSfH|KJtNQdX!o%8$CT80Fhk*>o!$j|t58To8WxXUZo@2Zt}CJR5hiAzb==@z9$d+8=| z2*FvV$)HNR%^YQJf-grkPLv;rq)dGQSJlKWI)ijuLhC7SBv$wtHt6_~{L*099 zy04xdcGn>68{&GqFYruN-^Wg3gzYBMh|!|-4Z$uh>*z%;&8f$S$2Fa()LU|pBSE3i z`{;osT?E9CwH#Ga#96BRJ^6xcZ1%?)S3r|bh*hK2wTtl2p+Gj5=w$0}4Y3(XY+XcA z!n2i@SjIBLXJ8hSg^gd6zsWyIio!uTZ~@p5!+nNUM_fP~5VCa00C|}}Z!ISRi~=Ae zzZjrdBmhkCN=zs_M#R|_PW!PjPEmDQ2;xt`mqnOgr!b3_jxY|W9L9Gyf^x+u{>kTP zTrZO(g%y>8v@G$$JZnihA=_Ib})tk&wkbiZ=>+d zhEpbi2CEFqk@8C^PX^ZxFHO*1TJ0}ioX%31gsO~^vlrh5>PNLev~spiGpn zW2mV;JPbF81JV=A-3p-uX#ZEQA`6wG1*pF^EvV4Xv;YDy=PxX%%HzI!ucwKpual8`Km&ozdFMCx|xIh zuaG!%f+SzzUlN>R+^^_g7GmPB=wBKVVz2059-NC3cW^`Hmf0wLcn7$AQnFk5>W0k6I4@)biX%R9h45aRxa0lLW! zIDVQjtQ05k$1oG%Qmvs{220F(s?V1TCc0A`_|U;zxR5MF>55DJ0=ph8GANTI$G zfVZvWAb=16n*FLFt)T({Z6Ndn{&f}b9>4^I-XOiMYKQ>n0MG!G*VO`1KrIj|jrMv{ z4A85;$K~a)nALj-Sj9++G5{(=q z{&?7E*Ah1aRzbT7K8yzaP(~{4=V=5l{34wW(8WEn3XR_^NmCME$GxLp)nljn2753! zH=ULgDDJKlD%SNDdun*8g>>jE`!Brr;Fz(BppqKp03u#@-5=ee=$Byl;<)XYw0(Ce z(Mxa_%~jg3;ji%VGbEo~0~U3P6|p7>-Tcn8sn3A;!;fA2klkK)r~4)M&;UdtRMoxs zZ6Rsll3b0k^{lg`*z+}O2K`B1iIb}xUWveK!?ptPhaK-Uc5iDbJ=r<<&u2?Yiw^I# z$4~XQz1HN`^iRaY!-i1i=Bld3ghllFvhM#=WjIiKGJq2_P6;3hb zK4j_!1sbmmK!H4d#A=OG20Q^?%Lb=4PZb~t1ath&V6NAc{FlsYyT-x!FBv}RSM)C#{?`Lv3H|SB`2Vx-UoxQA+Inr7{&%0)s}Y?4 zk`aHsJm>$XnxK>f0OtQx5)20yJA^-s3<}W%P($5GUbA;y6R-?DAbqU^g$UBtEiC{% z07|9=aE5B>0K{IWSFf`v{MP}l^|ihKf7-a3(7K8!%)DB#Q4>SyLTRN!qDd8e$Pa)7%diO4|ZME7jp5K^u z-YsrUClX!iY-)^V-_Z*MNo0$yAgj9d;0Bw znAoc8C1%xnrR#-GO{IVDgVJJ2X;q5J&VT1Fh;*(JJ5GLaRiqPIOs;G@zn)&Sc((J) zg;qM`aQE?7llV};!_61Yr~MDWG<@-8kuE%lyZ662DAJB;JapfFl#b4biIth-Bb|xw z{t#(yHymazjf(Wi!(yUy^zsKH-7|~3xgRczH2f&;p8WA^k=}U>5gk4yMpmBrX+8bC z7xvfJ_O(Q}Ej)YV*3RfJH;MG&JYGJ1X{59F$_9~6?StDZzb=ZF^|j2inkHKlDVi=@dnAW$n~jE26Gf24dZfSyZ8I67h;1fA6tUCIY<3}UHLbEH z#x%XMeh86inq^J=>2=Gi_a79yp4woHOfQ`lWAolpDx_=s3)_e48$^p5wcKU{b#j@_ zAQ>Xwxy?oE(v{OP0vbeB0eHfXA!a=#E*c&iZIVA$||DXUmxG9Mfjm0g9+Q(acrLMSJwq$VjCz4aUY$ z5n0%D+VdF#>8KLTA8D#POPgVVv_?{<&BtQhgY%?^zyOt$xt~SuBHLgfA;(Oztb-br zgPmtVvmR1Z`gzA7ZUb02;P)&|%SQYgFm`Qcs__v8iM3bRU}>g$wb2-7T{2dP5}L~1ylT?O;n=O z)x0oNyg~|9V9Z5bMt>y8$11~k5maD=3>t++xw@bo{k7B1^y#-FxX5(O{Q2ju5Qc zHYk-*yK8vr?;r|qhP!Au7D33eg2b6w$YFxwQ#zSJk&pu;b#d8l!N&R!*kUOUI1hnZ o6=QLRP(~0ZC1J2=J92nw`MIYL52a0Kh1ukF7#bgc4@-60Kr>+}Bb z`ycPi!NPUTJv(z=G3R~W!z{g7NP`(j2`2Ph+}!MJOl)j)ux|#Gx5|zmq)go`DCngG zIM_J2+4$Lc*#6rkF|rcG!^0;cLgDJ>Vqt2J;+1t|xD@}Z3ClmXW_JfJ(YqT?CNL*6 z7tEZ1;e?IUBOsRa2gxP+O$;tg(|jj1ldpCTdR$gKRNmJ{qN8{uy_fdXiu`bUH1+U0 z_I-XV`}=^0+r3=X%PtP__YHVw=QZ6zk9)ijkXSW7d1$gvw&^{Hm^GQ;?jnMm^&kfH zczL;kad$r5J?*Cv?v=<&pK($nPyO-m4rs33V$v4F9b8?+KAxM?<;x54y1mr>mYtkR zfQN72&w!R`HKPJ)!sPdYV!ga}5QEIabpE6oM;=s5M z37QmlEU~(%M=I5uK#Dh4?w$jTj%2I0n-`4hq*Nnm>oM^aerFr=ow~JJ`4cJTlJ^Pl ziN8VDpgT~|OA4ydEctWhw-GgP48IBS+GEk(zEh6sMF8!F^Z1@WRE#r^87b}U)MoxC#kk!}e{au?^Pl zlA0e?e2IJ$*|c3ubJv8b;GbrETYh+5(H=8YRx>uKPg;D;D3T-KXd{o%^_F+_t=wev zew=cYScmBS7|rovQtdpe9z?OPx+P57hX`16b>-&^sw!0vGx*KJ`j%g#a+H;vnWs+m ziOPR{Tv1JYzkK{a*}nl@05ZQZN@F!luq)_% z=;-?K4z$JD$t5)g44`8PaVGFtqHM58%A=(?k=V{x^CsbF3}$z84R~4BE0&* z-m953^u^{TUh09VNSCNH*{x2=ak?>_6<``XRIp14O^hub^kZZ}Qjz7*cr!7;$gn+^ zSXiB(_#qIZ;xPX_lkm7>xJGpPK-$)NgzavH5>(fqnaHdkvAM*$FVx_PoGl}qq^DeG zJVuf3x$5}MoveitDFcx(Y4~%8^(j?4KAU|AmwcSZAh&PQhk3#2L(<{dPQx0#=7$SS z(wH^qt-DH673Pl_c|>G8J^vX_83<+RRf1huAR3*zPhD_R7pl`P3KlD#T#~6J!RsOU zCeVHY538-rl=f0vkbG*Ti#%^GkHOx<`Gux?lt4q9N_M?~Ub~n3*K%54`^MrnPjj9K zap@8nMd`Xh?HJFvFKwLM8VBeuN`G!Hc@+>h>Yo((KX<6Sq}2$%<%WOA00fM|{rO6? z{s}3T5**VXRS0*oR4?EhbR?CVe6TzF@fQfI$LMP>gj$8BEz9McQq{+14Ozsg`_?Zz z*#hg(QY)BHdpp6o6Wc44f+QC~>BGpluEMDs3D7EKgbw?Cq&=QrLx#GI@FqR;UaUzS zXio=Wsn1lFk9cQiww~9{>Mq^%_HwBjdm~yr)MazBs4n4-DrsDu2n&G^)7gj&Edulv z0&U(u3d<$VI&PujFm;rjbq0nCWVa8@u(yIjpgjWgn@+R^oB{3dfZC;93(uiJ%GU*w zhu?Z{sU<3X$IZ0Y8wXz#{QAx~M&%S5nWMT)naWvvI#CcpN|51a+I?lv-DJe2LagqI zWKO~IQFzV$QD_Pgu5LN8xO!X{Y@TtMyRtW!^$oM z`;Ep}R0-t?y~T0Kb7bp*b}y^^^#;;ATGYuj37qLmoFdRJg!D%`ReG)YRMKV{nyHKQ zW2Luh2ew=k-@KuW_{jI+7y3=$eC=eIAt5yJF{zG%8J_an*L^Sg_@bRKB}{nG$ybx4 z{jC}H;F(EsyJ@-ZEJVOdmlt-t1}(m^NIpA-IG9%@AMb+ zET1}9XS~OGQR31cAd?>VS~E+` z{Da|7FJ}6pBvZ?i&4~^2fK$}G^+<~QPgGUH-r&_Ha?8A=K3+q<{C=7?`X-yahJm>a z_Q?uXgpZsf?!7$+E8kDb&9Tp7+wS3Jrm@%r>Qs#+c) ze$bx3$SAu(fF8Xg*J{sk?l&igSR7%_C6tTf^TP3nY15Cs2CM zr4#8Rsju^XeTY0y6ll7R`KGeNV;*Nj{tR=)Go`_wbu$E$m(* z?$yppC8I59IQ`#g1dhnjS=Odgbaq&r(`i$2+;8nP5r0?LxP(lSs2U);3kK;{`Mws& z<6f%_HV^ZpBR*Z$oi{|wS%2}BDO!YCq>_ic;mxs-@hb&a_gauI4n%lq{-=~NcN@GV zns6|`^VfnOv60nQ{maD1uX{`E8n5;au%!C0B7f5x*e~=UO@t~7%}NQFR6L^h$y)DUVO>9x12%^s$Car+AQ=X}7KLbA_L-k-ti6L|t+ zvU|0OOWexA;RfhxVVoQE^s(Vg#FFP@fWL6~kf*%w&pKB+&?C5J08=$1(tpP(f5x5Q zOnB3QnD0C=@}^L=(eo4a4`tm@olx&xXhTs|!s zv5|c!v!`i!tU~`JIPv*%b=p2FKTd{r(aRWW`$Y>;rJJAr@OWaMX*WChhld<-3mNk| z-K5=|i*Or5P!2i`X7x#C9dCGf!IBcjiSas$;fZlV3<$HItx1}id4%zlxY51pDL#~B zJB?ZftLjh$1L#kgq)XmR`b{K*mVVH6rpfrvk9DsVqDp*Q;aBm3(_eO(zt;bR&*5OS z$zd-cXv@UeQC(X54Q)T`t6f|BZL+vUuBtHA`4e5dG$lXcV`2=*p-^K29(c*cwZf1) z5Z~`4SOc0KJ9f)$3xSA5rWLo3*R7iYR~FETrV=njR_a-M&ZJJQ^=nnc5c-qln#T^b zOJjN6{s=e8_q!LpDWntl+?Bs{PRzd20zV0hg0*2u?!jKHEk&2H+FR(#Mc9%iOv`g-7m3$w35{)KW%uJI2 zdcI{QxC`Y<;?)ZB=|C4(|JAtpYA~-#jQM5C^CLIqhd-n4#EyPOyVh; zx8`NZKvtF%`Em0Pb-)q!32@gt**&qe^->hd=&Iz)FNr;t)4KeTk!ebw9ta!dXkOWW z_)!YV>M>hV^1(-Vfg#aRgJpv$pv2PX5QdOjY|@Zf7n(bW;=`m*m(O}&d})FvjNY7bi7|MSqhO++T^5QtI2D&9L4k^VL5m4jZkRD97vu1+`a)@zAVu!=~9#`U!8%DF4r3dcN{?1V|6t`qNw zXW0kzlx9b7gyLsgb&v|KKibEUvr3V>Q?vT2FVv^9NWSt zH;vVx>ZSA<3Km*>0%B356psRvUDtt85ekPgKSBf+t+(9BBP6sso|HsL;xAKcEhm3{ z%VxDcRLkYGf)szzg-Z_^U(~x10k)BKX^1JTVsgKAS{+i?b@~2PQWoR2CcY)}HYh=o zG}lw;2%UM~1?4e-pq%_yq=!cHTS+3V34{X47Y^v#rF1bXxi%)iUX0{2iim zR(<=1Dovf%0*90;b*E@ty>dI7aY5Gy>AL9&ozZ}dkm-0iK|RQ~;cdE$t{(;ZLyKbV zt=s8z-fVJ`YpP!dzoj3CBRp1?;-7q8=^(4{XObOz4;qw@j%X~*zL<}n$o2lDfm(+h z{sH|9rX?VDflV{6?lzeX%?Ne9GtlD8QX_boD{Rw(H1|W4ZZ0L}5ORd#6p!k(w4e`HL) zh~*1YbPjXbsE&}IRNxj?|B^YBKW7W+%l*re$7PVKcZl8NPdLiSK@jlyG1Ib%-p@1By+5YPWx+LF`D0yRTDbWHG{&my8r7oc*`7IW;Hi@=a=+MLjnz2JAUU3Oh1zC)r={-Gbtq_fp| zX{}dDNZ-PGKOol%xQ-AzSNi>dq5|&B;5@c^3!s^+q$n%Dt;rQXMumeY(ilO^%vpK{ zgm%{?3LalHuj!R>ziPU*y#l=^y2fwuIW_OwHaRs_Th|C;5S2zt$=*nmm~&I`z0+(f zJpwqFyJn!07_eKpW)($SD4x7Mwo0se%%>(rf0xcMvsXb(Ho8?ry+AvtUqecUa;|gM z`nZ_fOftvlnc6^Hlky9cd6aG0YIjK@q!`bR@9katlw@Mjm z|JKokwOYrsN9f4()dWeFkJq?_r>yh{FOsKbDdLrKiVghJ@A%J0)rwASvP?KT>^yGh z_&BofE7FelH%hYbKqWwXT(5x;x8JE_k4V+ZYswR(mmiQ9n<6xS3kZi!`unIypnM^D zA75r|e5Atn()XJ<8;Q;!aL&ypXGi7@k3r(sMZfUkni%a8>m1P)OR?8CUHgCPOoK?`2A~UZ&@b<}CUU7rHIeJ%?zbzl$_+aeV z-gigzfS#@}jTLKU8yi!1m_;>0txo&pJ8i=|m@|u}H*@F@EG;Gvt-RH|o52F#?6{3%iKX*WXFhA{Q^{9Fs?tuIs3?CQQ zMg8JB1Kr*k$BuhHJWYODlYMa;$(ptcn!XWkQLh~BLHLOXlO24iHo=)ikICE9?BbDk z933bx8(%vf;g)gnk(PbHu~{)l(os~?N7kHp+m?4MH~89Wf!RJ;ZN7a&LLdJs$ImBqu5Rd(7XxS zQ>TXTp835nNy4|57J+v;o%{eEkfy;^31xj0ruY7ke`_qcByq3t<;l1ds;L&fGQPN4 zg}pVn6V-okq3xc7EA~rQdLhy~h!w{DrL_m_X4I#Rfz%s_;l$nOP21}0fVGvCA9!~k zVy})l+&KLVFWL5AA$Y6u@{=P^#-A(O1%2^*Oq*faTVUFXG^ov~N!4^=0!559C2KE1 zRNu~N3)k1;syr$WT*6snziV$EPI)W~bM{}Dieq>({J@X-VmZsp_{*^qaKJv3QnE}l z^GYN%cJ|}2I%jCgpSZd26rgCi?MRFp5AO#Kkq~X+uE`y-Z%kMTlgXQpA!Ks9ZA~G_ zcOp1x>y@Mu)QF__RGmiaG{aa~@rO~`fJ(ejW>2=lQ2GSswiee;B?ZIp)Qn%IPF~i- z#b1*3a(p>-l~ofWRCUoRVyX+l>~Gp9eMta4VhfeA0!CVfW+C3l1%Lv2iTS_1UE3Yq z=*&*}DGyg$bX_hK$X%S=+{WqSF2Sqr0*uWOXtP8AlI60hpM&)Y>pXZ0Tg>1+xh(e6Fe$1A-I`<3FL^X2rm+rfY^jNB^rl0)m@6ok%LP%y!G-V#T`}EieEZ+ecS0I zk%izfwvpP0`atv2sLXeAdO_h0ZLP5EkH7(4WJ+B%N`x=`p_pDMln4@(?7NuQ^db_J zD&d&GW=x3*{!j#zc;xTuFjw8jWeOR=LtYD+GOaKbtI(7LB))qPOYsPerr5N;s!*?F znnH>|ri?~@^T8q)zsl?n1ZBOtH)B(TMr#C1sw~&HoDJ{V+Vlq=+^QJ=>dyh+4zEuH zCuf^;obkwYmIzUU`^eaF)+0(B!I;Pvw4+#|6s6cYnpg+}SyaeDCCCyKB1`#Ha-|kA z6rovfkb?+9K={F`ScO3>!I!F3!Iy6tgJbE!B(KgT)W0ts$WUn^V7WxI_Kafaz`N2LD81MG#w}78rozEPGBlU#+Fa_MW8&z6-Vxfq?nlH55{bf z#tix=<>t;~3(p@qF-IhE2eQJG=$}4(m;c^Ff~N0Ohmu*a z@gu$`Tp8e)sgm(nOQM8CBKb*L*TNu5WlYBqYaK25r?5!}QtWl$85vtwh-=|{U1WKW zOnT)jv;5>Q8(Ey8m<`Km2AOu5^9Qa1nk)zsnd)^sz_$`|_4iT?lqHxF>(a=SH@Fh7 z=OyI+aDiYy@+F46l7uyqzphs7TdEScxa4Av>2=CBX5FVxU|-ASsUCMKTrW?DrSQ=r z`(BkMR;JO@{4KedW_T<`Xrf3m@|U3?_XoKFF8iTVal&NNA|Tv`=F|q2X`og3Rj~p< z9i+90B=e{ffi7`9snGYaM2Gj9r0(uk?*%$2;GNerqZVIIX@J0Pl19s!U96MWq|GF6 zs*e<%zRj;lN<3D9ZH~Czp3%^X=I$Wl4y1_d^;0sEr|uUK#$z-bDA^lt?o0cmukuvQHsSKg?(j zlIqis-OZJW-8I&VB~-0HaCSZ{tT*%6p`jEMZZ`XkzVQB7rjqd3p;GKPO=D&`Y=L@t zX2DGuKfzwtgrcD03*0&`A+jQuQQ~j-5bP#(+3NJ<1Pc=iJJeSQ+3=EsgkyvigCwDP zi?3-?&<{z7ki$BRWWvL%h7xv4r^m+`K^&)jyM=zBBB+bEyB9K0%t(d-8-&X1H-lO*gSK1<^cWl(){S2%2oUurL_13CI& zda&UJBNue-g!kA)$RYc9rg;d>w?T8BT^W@7Mo-1y%D%*$PSmmpaUF66 z!tGzf?D@gB1zTwR(nz1VqImN`Ho6vlY7JUGeH5X(lX-cVx(E^IiAW`^`nf4?0Rc}} zLBb*AmKgdL^%cV-3v_zlw%V3oUpX%v&k&{hw2ao`x4O#vyYhY*b@H@8b(ssmllS_B zaFVz#jQt=QiSWnIS;oCK$Rl}Rs^X3<-us=_>i14Rg(d#3%x`bZ>{Z__nj&;VFOoI)yo7fPWtC3iFPq_z(NW z&62d{zj9^b&JMdwxI?p8j@-HRT4T;g4u9t?a_>`B_m;dFn;DJL5A7bS$G51aAd6W< z+2^(`r`Cf}SjS+Jpur<=8ic&r7LPeMKF2e1S4yC~P5Q$)mceQ+XkcJthc+vqgRGT; zx)LYUf~>D$AjAQQ#aB4C#I?Blc<;ge3p=ru*(_RBBnH0ljBSOF)8Xz>a0JG$J~flL ztF4j)T+AnIjYicB%@P~FGfMY~ym=k5+MdKXBfP89W7o;-8 zYh*5?Xfng{ATBjq?1`7l9_1}P3CmLjrPJwAjWoX|6bf2qdX#LBXqT2vHD=71zh>a`m~zUvLX-<-9Ss*I-0*S^bh{hovPO9Q-nIN55#TlKY1 z%Ikv;e)LG>qk%7>VbPHxa{B3S#-NWJhs@>d_Oen2vIN*fi-PJlI3J@`2s7*|>}Z2- z-oFQd%0o>$=5n(~s4(%wN+c!`B=DEUxR@m<3XfG)rU8DJmdT)F#OYs;5nFhh7FQH{ zXo8sukt-TQ-&rdchmTp^dPzf4zWU3Rr?+R;B6}*CwhP$bLA*H;j%?L~*e8e8aP&=Z zo3SrT9R_em_I7kNVzdmmY5sGC=x! zC_S(%U>UWz^{tbZ!Sy%1U9pR#p{2QKzmf&@-$rY$_9@;Vw$*};`eW+STx}0Ghtc@Y z7dwZ@r&*)`BMaG`xAjzCTs;uHQb++mg=<0Sq<|bK)t8DxgH2%UJ7kV zErpx+5M+aJS>nDb{NBn7<=v^2qY!CkZ_tR&yH*OI|DEotL!D6Q%*cYR5Dban$Rfh$ z7GSv|4;8G06dgqR6lSKo8sSbU?%=Vc#5;WVR^L_iAkVX1m^tLlb+ng^(nh#P0O*!$@D`a= zoeAEOxM#bbB$Q3vr?=y*77g)+qh6Y$X4yDEjg=?JiyoKR+x?N zvya$+rU|jh%5#;R7A6yKrEwZg%lIuWI~!t2;MPgDub9lrQytYT(n`PUT-7VJ9!TK+ z1NNhQ1Cm)z&XbTBNr(zMMnmSmi_=uwT$Eit;tAs3M7O5Gf8eC6*N&C*u9rz9(-TOP zYbAZNH^LKxFm{Jkmc`95)%Bz8GqPP?Y3zKrvIo|~i*`6U<)*gRYp;)ZJg}Cnhm_~j z-@|phAqZ5JbO4V30&PE*) z9drHC@ku3hSdj8iew!{0-N&)SQpmk{aDk57)D&7o+oU2&P27I-tKDfD_}Acdx!N1~Fwv+?jvnlRh_9n;2exm`(xf?x9>Cijgo6{T3!`L}3gW@s zG}^>&MfbrenXUr>>+Gf?d&yWsKI#ih_0y#n39cbaHaYn6cd0(Lb8e2T=Ud#;UB6wZxTVZiI!-m#FnshuZjtf1 zqY!4@%Zzo$$zCr!MwogYHV#Dt(B2Q`ji^A^Y&WeI24K4PE$1mLFFk$QDLvBBmu z$Oc!CLA5!DfE+41L55QM)Mx%m+8jys2Z<>^aDZZD@`+ycXYo1^FR~}SiZC>Aj~s7> z0wuP|C(lck*qyM5ML02aH({1=;9WlnK$2Mp0Kw{FM?m_MZs`sm$<9ESZSkz&VN65$euBtOfj zxW8gzrE{JlAxz%F?1fiTOw-VC97chK0foB^cLfN#Xq@yFJh{7>6FjvDa3_e7x z&ShMQHd3ds_uwQH6!B}KN6bfwtz0Ly=%G;KsKSsvLwO!J+}Jpx;UF_Wwbxf{urw%7V4jN2mHur zX*?1P_;iDAs>J-$TaGZ67NP`rW{F%MsK;`O)@WZTX5G5!kbPa4bqD)YSHiic@+5BL45~D8Z4oVsx&T{=^oY z-gh$UjukG-jLeTmTmHh_9F!k@V@r3OE;6Xsv|8}>AUdAldYzRx9dBvxXoOV>5u!fp zgRh@~b z)4XV={Q|Ed*)I<}y+ll0Z<+)R+0=GVhZ;;M(z@ViW(aD3-2w4K)0uF7>7&p_^6{Es zUCn6q9O^MepF+`JY<&HAh}_iw=A|g#8)uW64=8Q~JuNgKy&-axqhAlFSu>CE76 z^tC@~!FurOM7%>Ajlro5HDm0K1WWX#!5i$!+cboulKzF>5WEiKz@!`0cN`!9>eaWD zm&GhE%r(B-gD?-X4VZe0h`8ZQgafA8sw`*ek>CK5hP7Nfh3^2>TjEquGPpn#(|2+) z&iQpWTX3KXd2~2|cVj$oChySTT98dis+9;eP-tVn$6+4#RCQj~t~tPo#mr`BaNF2@ z{gWY%D2m4HUcMYjKDk+=I+QDIX9J>>)jIXv2yi3Z0-ZY^yoWsybLi>Rtrsd>bmT)Z zKbPDLW^ArVVQgNVXlmq?{^gQ=l#3I~&Y&>sWP(xB$-phK@3oj&Z?l|xGbwczepe+; zE53~hIPLegSdV}86-Tt)5WY)$ZE+Z(SiL}S{M(xLQ~$(lo^Fk~QAc9gn+?je?sr3@ zcDMJ)`XF%`^cl;saqM7XgQKv7dS$xfgawQz`s7n%g~IaA^HY&M}V4*ICSvS(1oY>*%husci2 zO}YB2la+#vXT$ZV%scQM1)-irvPLGg$&p5CcnpM?%EfI^YG!%h-}B9qI~elP8-c|j z3Dxl(ONUDds)~-CgRd($O+jCWTIdoz5ozPmX!{$%5*fH8O-*lxX`^2vDU9_2`O_oo ziP1?k0&w;&I?1u((!+$XU#2})EgU`mg(gbi7PMehXInfz?gIJ+jRLa|VNKR0j4$=_ z&_G86^ddSWj1mbGZk2qCx;r#POz4tZ?|ytZ{8CWp7hb}cG{n=$pCgj5-gCnGgSjdLPk-<9j)EB7Cx79woR z9ZTaJSLoj&L-qRaE}C43(uyB#1Ja{AKtgY?n`ovoQ&x6j1_c2d3$KgmbxY1vrez$k z)qZu1_+rmG3k@?^U+0S+(X?22-A<=xS=V1%94Af|?%pE2=TqM7k<1&`GE(hC^jv=V zb5!RK>*6nx!HM{!szT-O6F&0sDs{A<8zft$Xq5xm^vA`k4dEqs;JMY4U(y4sJVAPF z#o?1x7{P4pw71v=Nv!N6p&0y&%lptiDD;;nNJY&IN)7XSxd@)o>^seR zyrwL4o)s@(WynYPA?aX@pb5m^RaHXjNhSmV5WuwP$XEE@kUge{MPnsIDi2bSKBYEs+vbUqLXCV{mA8s!qMBX{l>Kt8;zVuI z@D`mY+*QatiISc1C3b-lTMJq78;$${z0_ad>{^1bi8B)VBU7%F3!GHiSRhPwFWB=4 znTmQQP~`g%rDLWpm z(17=B^>L7EjAU`Qko1XUFN|};9g7(Pq{9DTaSD#xw(9kDq*u15pWXth{JkaDuCX9# z){-f|Gg=x%{bzx#a{5On4U-@s#s$7HTVatju*bl!xO-(UWSd1~y3vePZdD@9-5%T2 zVm*vuwO(z&0H5*vPq{4H3(CZGT*a#aAszS^lIa<04HgW_6Zi?lZJJE-i`bO02mNL* z;Tfz;)Mp!LrjpEZ-@Y4*X~-|t8x6diA})w-{5JQ(TCWj#>dh~#LJN5i>tVOP*OmxD zAx*eXLnEWKKCp^s^2uR9KR8NOP>fc?fGr2zp^TbvcQXsezUOAE)a@W$t|F93GP8jX z@K$LuHH>kwUM=xSS2&pdRa9_3i{vFU|A_yeVsp;5l zrefuv(Zz;{G+)^9v*77%pM>QnJKwMBUS#Eev+54X|MupaHLt?J`lMN4m-5TQYm}7_ z1AhiO1^z@3_O&FWuyV0Py>TOocxMQ|8+cq0+gA-A-5}nU9c_OB8g+AYZ>Oxk{0Vg{ zZkoWGOC>ANZ0dp^atWdk__Ty2V7OvjsLW+g+j@O{MUs80Tx8Bwr8cO(9zQYZ;Nwa1 znvCA?RDG~+^W{v_Oh%Vl$J<9Pm+JGm02_V*bve=1!}{u~?9g~_p3i#-z}q8!oA)WIS`s>VG)N3w=+q7W^~P_Dz&MJ zBP5ToCx=9lX(s2DwNytI=THpRI!I0QcAer|VdQS(yCl+35I2+HRD*bHt#)>5A+eUl z7ZFm@l7r=sRO3xVLF4KB1(oBhck2TIg>?!8~2 zDrlUXH-k|7`Oj^_hq1lU%_fhdIiJVI_Zm=_f~KVG|yF}3k^Tp#}g9E>2 ziwB(1d2ix+0UASPQ5v+h*~6!EhyAk#LH5yh+oWuBkYw!nX=F?TU-jnvUdFFamf@1; z@d*duoe28-IAW@KeSOQXH>T1vJyxnWEwdx3O`nDb=o(j7DusnEwUK75wWh00+J%$t zt?%V+KzPbgP~(q&uI~g9j#-!Loc#UI9eo(@Rc^>ZIYyQxbJ-=Lc&+565PnxCjkSQs zrSg_#bFSs7)np0IK-K-#rANeEQekJ^p^0VmrF%h)hVgEFEuv^1^~nl&mp&9A?}}|G z^&+oL(gLs8GBP4};B7c}f2Vq1q^zJ&pL+ABmGPrXfyXYNiN`dTF|xRiZ?-{j6RkEv z&{Z~dWKiavS4-%9+M|~<#f(*^^Em#g*97T4yav|}!rEXmZO+$=z8>6O6$Aq;)yLM| z>7SFSu`3)+n?KRg-z&?{&pDz0L?c=vX9e4(Ff7+j?3{Jn1k>%P6;{abz zUKrvf%~2J;D*~W$R*iNn3VS zwG!0X{fl5$IXHmq#HG-Ifo3;%clMXS`Anp6uML3Q%0Sq^ZOC&uB&ZnKFS`fT+o@+6 zKf4)!UwRE&_OM!Vuv!as8KFmZ;;dtL>DNSRi%`_=NJ+Ls0B}ON0iH|zta|n9Z5A-&pfvCXibCMuv+Iie{FMh$ZKq^BvgZuSU%!eYfb{C zmJT_Ylu^|-6JxZFt`a&LlSYUg^=E)G9g+LO)!SwOD*9>I-w1IDOe;*P?0#cPF76M9 zHyNT4Q_iZyzMnYG87@+G!DisD^cpceRtj^vCde=^$Xg{ zl&aUJt9ELdX!h+HMGmG)1V6^&_YPV?c6TTH208U*d&D9I8zW6wnO8B&7j8!v6PL0= z`-_gB#S76JSVVHMymU#RlJyVl8$OD@L+9cv*hMyL#qozkRp)5QHFrZ52TtG0MIX$%0Vg&%%ln2m3E3L8s;4mwCAQuUTvEkNK@49JQ^{mcjeFGoqmy8m&)Tg8sbLYz&orUrU@4Dl&pW(%=7T~pOC z4ypQ(3YYZ!RWmA(Jpr!crVAWk^|+$7s$cwT;9@R=Q&fvjc90;LrTzUWsQd|^VJQQpc8YpkAIHb5KxOkr(X_&+J?8xv_aPj|h zBq_Mr{yHMCufHh%J^{iF-uN5|=69oq?z>F@z}UjL2{g9-UU0U(1KgLD8;XkZ6|0_XqE$u7Y` z!OivTNU>3HbN_RADY%~_V3!uB;C_yPU51;2`@abO;smq!vw@>0Oo2S?V5M+zuwpnW z_}fnsa6@=EI1Xk9M0kQ-Be20pk;>qpc{-?XBsl=A70CeYiy{PoGol!v2r&}?0Pp|u z`5#cQF(@9I7Do>>{VyG`6!O4Q#>4(UXgpjJ6g(Wy4lHFn&*AXEK=M3?!^15@!Sfsr z4-ag&|HApd$>rgLQYLVrK^$@b_(`_-;Gpb!r2j<*R?a2^zstb_^6-Oga|QtHQ1;w7 z0M&nh3{l={Ichstn>&86py2%v*8jg?yx^Xn^x&8Y6Ie`VY;@4Xyb=J|CXWtmT<{&t zS3n2VDtrQfSqkZ(-o-vZutqT*^mQ2(0DMtO2mMfv1q2I~(?hc>?SNp9N;)W84K4uu zvW5<7TPq0yR9w^H2 z2@t>w32Fhzg2lhR2H%dNLY8F!q!1Mc045mx?HsKC?G?l)2Y>>r7{uQZpap*M-4oX7 z{@=|3eE+3`j~{yTT?s(`940#lHwE8+!Tet+{NNx9I#}zPfz2oAnrnFg^8oO{1VeK@ zAK*6tOg>EynGgV6fr((B8#xsO7y-e7^YqQ0A^-*eke>$}Bu@(&76nX$!xre92gCsG z0PxHreY3d)z#ITxS)qrVNCMiy=4c~DJZbV`K1D29RQZ!VQ9uy0>Jo$X^*}cQw8t>0A@aj5qRDX9SZ z=5_;sH2@5M;Q&c8gzd-ve>;dAf@usug0Q{;pf^()0Y(u({LjVZWaFaXe=aU3n=}Rg zb9-@ea8U3+w-+Y|Ck6j=-Z?p7yFIrTCns#=xxF~K*eUp*+lv#%l>E=_#RQV1&fZ_74P%5ZKxNp@8)yJKH}Pypk~Q9}Zp_nD-9|-`}JBL&EoW>>m_< zahUfHi#V?o%>9Q(T$+NN{T~+kOk_r>-Vb_vl2YXa#I9_R^BM#S@08dV_L|3{o z$I}(o9fh~!cP5NZt$kx7^`uwtcWfo+N3rLnky|-fTcByLIX`~V=(;3~@V+;Na7Cv8j^7ZLwj%#x%Zdtj9Mi6T@2H1#H9tKD{|o z52W{Cf`q(g~ zukWJuieuJg%_0KXTU1^dU5c*+1hT|winE~V>D`f;os(}c3NUZwY%5xHQHq9sl!Q;CmUAknd(M)f1$(g zBnpx#CqC@jkKa75{*9pmDrN4kWENkSQ+eANa6}h6GmCskv^mNLur5a`y`}cw)2x!HEW3?XFnwc9cu6OAI^9;Vp&E&tNsP{ z({#SImNz2ye$E}Y@1w?h=we8DgR((*HXJ*~FF^H{(uPRiqiX2JSy~UOywMLE#<)*= zFj|y1W!!hX4inbm@_yfD-gdUe$%lP{?&}Gr_;%CzB~JfMBgBs$@H{V(f*a3OAeZC- z2k@dT9*~0<;zt2s1akhT8sXVFIiTMzMgU+vdsgt^Z$`)}1ppa(^*at8T;E;fM&)mhq%>nbCsfz=qm)JR;sf&a6 zulGz{956Y+4&(6uiB%XAvwwiG__GURK#pfH9O8d>{Rc)Ic0!JSU?gGG$?*>iOmnbv z`~w5ix$GSOz{tSJnUf7N&kWWL z_yMzdA+QOK4#dO#e?N||t)ZB-!iKzjkJ}c=a7M7>U8aQ(zIQB1+$!s5`ca%`eY#~H z|HIj8&`G5u;4DQU?vH=4;0nFJpCQN5uuz_B;vqRn;UfUYDU}gJz1X@=CqzCP+bm|@ z(k({?B|#Jt3Qn`wDVy5w7|==`K;!3<163Wn8RaTcmhrtYl1o(ET`KQ?DV*T2J8AEj z`?1IH)>V(q!u6~Ds5PVK_7uc{OpCETT-%PjdAJY=3Oa@wwXq7;nm?tM6ql^W$nhUB zV6bhZ=G#9JtR{&+jT3V>I6R8KE{KAw(G@@62wt43BMw1UJ(BIFdr-3M)w5Kv3jhLthC1VgSg7{NFba0os9(Jw=#_ zO#(0jLUxs5^WTeA3@pQ>QHPMf1onjTc3Qfh>LsLu3_t>kwPI~^RsP{-PZyRq*`A|^ z5gsq$f;Q?m_i7iG*(6pPsmU_r^Mi``$`}9}mj!bzX3}yKk=4 zruXF|BKjnNcquGMbQ^?nnSe=u4rtOL?`5yJKaz|&bHzjbrAMgG{KQl^$NA4$v&dN@ zE`Z+M*M9Zyy{cJ6eH{{@Y$28-9nM)_hra%BwOO#eAa%j|UX`2w+wSqls-(l?583fB z12(&)hhsbrzWF>!rh)vA+4#v5#Rt7SDUijWgJPPtZ&84}d!)%u)D{ zyDAs}4iGa6m>%Tj_$#6Ra@60Ym=^@Y7=YX?LJ1%THm8{Y6abKAV*nbYo*Hlmf(g3+ zha~=LLw3$*lK3kQ**Tv{;;$fN=X@rKzlxBZ^O+?6NsWLoPT8@*FP|SWg*u;Fn?ts*FP|Sh2Xz+Ip<#?_-|p(`Bw=3 zTbXnI6@vek=A3_(-~Y2Vhb=}q|7yMeUl~`=a#s0vfmNxzY3rqii&z$=?Gq<`tclONe?Cdii z2QHVJYK=A&>uZm;V(-fvOz45{te@UZ@2!7*j9c)_-SqeR#$!b1ulLd`Y5khhzaXRSR+RW3NN=jlrZfO>71mT(x<%n25Hc2Af%e@w3gH-pkXD&@Pa+x#x>f?axB% zZ-2njsqQ-eF=x)&R2Z!Erm5Rvwf893HOE@H-nEl*m}s2myqqk}r4Q}Ft)MiWia2a) zn`N=VEvy|=!_Ugitw%ay(4TXeRhz{lxWh96rk_^ebXIEGE(km3<(M;MU5dV;U>Ra|Fem zlo(HP>i^n@62l2pY*wxE9M*Jr=dhu}HG{QWhBpR0uPv^X1Gz8$>{{WVxHZvE+AeNG z+1Oz-Dxng{19XBic3Zogn1@=pPRJxWp0G+dYlUsGjsx}B6ipshZcaxe@IU3M#kLWo z+);#kOu~7>sqEd44ePMPJ`Y#I8v`elv3Nlols{uQCUPxS2PMQh=CO*IbdYMXjuL*4 zEeGPK(L(goAg%n(V$PxiAB%yx{E;9%I9G#MkrteR3&0W1lj{s_MG^{U%!G$}V_>sW zl9{H~D%NNu8ot>0@5BMj9I_NM@`_*Fn-)#>ft@wYT1>X7lf#fE4|2;s?=oU5>|~I3 zk9P5x(Liv8CoXVLVAc*^@Nx^tR>yKi379%uyNM*yqQpkXvdN8_^sDYdR zj~vjsg@D8OU+0z9z%C&l;P2iJq;h&*pE~2WYo(p7U3O(pA30PLh-n?L+r@B9@B&H* zZ=mEBuCZha$w`(xbs}$+NRe>vQd@|0!OiheEy#d=$HFe@K$|ck4tmx9M|VlbMfS$P zHOFY(2dfB+k8~NaY61g<_>dv`0_d>e-TjkU Ef6P6ux&QzG diff --git a/Services/AppConfigurationService.cs b/Services/AppConfigurationService.cs index 158ed9f..56e0a45 100644 --- a/Services/AppConfigurationService.cs +++ b/Services/AppConfigurationService.cs @@ -1,4 +1,4 @@ -namespace BankSampahApp.Services; +namespace BpsRwApp.Services; /// /// Implementation of centralized configuration service diff --git a/Services/BaseService.cs b/Services/BaseService.cs index 4e89722..8692d50 100644 --- a/Services/BaseService.cs +++ b/Services/BaseService.cs @@ -1,6 +1,6 @@ using Microsoft.Extensions.Caching.Memory; -namespace BankSampahApp.Services; +namespace BpsRwApp.Services; /// /// Base service class yang menyediakan functionality umum untuk semua services diff --git a/Services/CacheService.cs b/Services/CacheService.cs index 41dad22..9b8239e 100644 --- a/Services/CacheService.cs +++ b/Services/CacheService.cs @@ -2,7 +2,7 @@ using Microsoft.Extensions.Caching.Memory; using System.Collections.Concurrent; using System.Text.RegularExpressions; -namespace BankSampahApp.Services; +namespace BpsRwApp.Services; /// /// Implementation of cache service dengan enhanced functionality diff --git a/Services/HomeService.cs b/Services/HomeService.cs index b602b98..4c3ba95 100644 --- a/Services/HomeService.cs +++ b/Services/HomeService.cs @@ -1,6 +1,6 @@ -using BankSampahApp.Models; +using BpsRwApp.Models; -namespace BankSampahApp.Services; +namespace BpsRwApp.Services; /// /// Service implementation untuk menangani logic bisnis halaman Home diff --git a/Services/IAppConfigurationService.cs b/Services/IAppConfigurationService.cs index 3b19e53..9cf3970 100644 --- a/Services/IAppConfigurationService.cs +++ b/Services/IAppConfigurationService.cs @@ -1,4 +1,4 @@ -namespace BankSampahApp.Services; +namespace BpsRwApp.Services; /// /// Interface untuk centralized configuration management diff --git a/Services/ICacheService.cs b/Services/ICacheService.cs index cacfe09..b714b4c 100644 --- a/Services/ICacheService.cs +++ b/Services/ICacheService.cs @@ -1,6 +1,6 @@ using Microsoft.Extensions.Caching.Memory; -namespace BankSampahApp.Services; +namespace BpsRwApp.Services; /// /// Interface untuk cache service yang mengelola caching operations diff --git a/Services/IHomeService.cs b/Services/IHomeService.cs index 897be73..5ff31b2 100644 --- a/Services/IHomeService.cs +++ b/Services/IHomeService.cs @@ -1,6 +1,6 @@ -using BankSampahApp.Models; +using BpsRwApp.Models; -namespace BankSampahApp.Services; +namespace BpsRwApp.Services; /// /// Interface untuk service yang menangani logic bisnis halaman Home diff --git a/Services/IStatisticsService.cs b/Services/IStatisticsService.cs index 5e65a47..442343e 100644 --- a/Services/IStatisticsService.cs +++ b/Services/IStatisticsService.cs @@ -1,6 +1,6 @@ -using BankSampahApp.Models; +using BpsRwApp.Models; -namespace BankSampahApp.Services; +namespace BpsRwApp.Services; /// /// Interface untuk service yang menangani statistik aplikasi diff --git a/Services/IValidationService.cs b/Services/IValidationService.cs index 0d33967..be4991a 100644 --- a/Services/IValidationService.cs +++ b/Services/IValidationService.cs @@ -1,6 +1,6 @@ -using BankSampahApp.Models; +using BpsRwApp.Models; -namespace BankSampahApp.Services; +namespace BpsRwApp.Services; /// /// Interface untuk common validation logic diff --git a/Services/StatisticsService.cs b/Services/StatisticsService.cs index 7575f7e..c15fce4 100644 --- a/Services/StatisticsService.cs +++ b/Services/StatisticsService.cs @@ -1,6 +1,6 @@ -using BankSampahApp.Models; +using BpsRwApp.Models; -namespace BankSampahApp.Services; +namespace BpsRwApp.Services; /// /// Service implementation untuk menangani statistik aplikasi diff --git a/Services/ValidationService.cs b/Services/ValidationService.cs index 89350c6..77f0ab2 100644 --- a/Services/ValidationService.cs +++ b/Services/ValidationService.cs @@ -1,6 +1,6 @@ -using BankSampahApp.Models; +using BpsRwApp.Models; -namespace BankSampahApp.Services; +namespace BpsRwApp.Services; /// /// Implementation of validation service diff --git a/Views/_ViewImports.cshtml b/Views/_ViewImports.cshtml index d06bcbc..f7f8e2b 100644 --- a/Views/_ViewImports.cshtml +++ b/Views/_ViewImports.cshtml @@ -1,3 +1,3 @@ -@using BankSampahApp -@using BankSampahApp.Models +@using BpsRwApp +@using BpsRwApp.Models @addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers \ No newline at end of file diff --git a/appsettings.Development.json b/appsettings.Development.json index 4215fae..f892209 100644 --- a/appsettings.Development.json +++ b/appsettings.Development.json @@ -5,7 +5,7 @@ "Microsoft.AspNetCore": "Information", "Microsoft.AspNetCore.Hosting": "Debug", "Microsoft.AspNetCore.Routing": "Debug", - "BankSampahApp": "Debug" + "BpsRwApp": "Debug" }, "Console": { "IncludeScopes": true, diff --git a/appsettings.json b/appsettings.json index cf4fdcc..7d28e83 100644 --- a/appsettings.json +++ b/appsettings.json @@ -14,9 +14,9 @@ "CacheExpirationMinutes": 15 }, "Application": { - "Name": "Bank Sampah Digital", + "Name": "BPS RW", "Version": "1.0.0", - "Description": "Aplikasi digital untuk mengelola bank sampah dengan sistem reward" + "Description": "Aplikasi digital untuk mengelola BPS RW" }, "Features": { "EnableCaching": true, diff --git a/docker-compose.yml b/docker-compose.yml index e888cb7..bb24c55 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -2,12 +2,12 @@ version: '3.8' services: # Main application service - bank-sampah-app: + bps-rw-app: build: context: . dockerfile: Dockerfile target: final - container_name: bank-sampah-app + container_name: bps-rw-app ports: - "8080:8080" - "8081:8081" @@ -20,7 +20,7 @@ services: # Mount logs directory - ./logs:/app/logs networks: - - bank-sampah-network + - bps-rw-network restart: unless-stopped healthcheck: test: ["CMD", "curl", "-f", "http://localhost:8080/health"] @@ -32,7 +32,7 @@ services: # Nginx reverse proxy (optional) nginx: image: nginx:alpine - container_name: bank-sampah-nginx + container_name: bps-rw-nginx ports: - "80:80" - "443:443" @@ -41,11 +41,11 @@ services: - ./nginx/ssl:/etc/nginx/ssl:ro - ./logs/nginx:/var/log/nginx networks: - - bank-sampah-network + - bps-rw-network restart: unless-stopped depends_on: - - bank-sampah-app + - bps-rw-app networks: - bank-sampah-network: + bps-rw-network: driver: bridge \ No newline at end of file diff --git a/package.json b/package.json index 7d1ccf6..e8cc64a 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { - "name": "bank-sampah-app", + "name": "bps-rw-app", "version": "1.0.0", - "description": "Bank Sampah Application", + "description": "BPW RW Application", "scripts": { "build-css": "tailwindcss -i ./wwwroot/css/input.css -o ./wwwroot/css/site.css --watch", "build": "tailwindcss -i ./wwwroot/css/input.css -o ./wwwroot/css/site.css --minify" diff --git a/wwwroot/js/site.js b/wwwroot/js/site.js index 6251ce0..3838890 100644 --- a/wwwroot/js/site.js +++ b/wwwroot/js/site.js @@ -3,7 +3,7 @@ * Optimized dengan modern patterns dan clean code principles */ -class BankSampahApp { +class BpsRwApp { constructor() { this.config = { animationDuration: 600, @@ -359,20 +359,20 @@ class BankSampahApp { console.log('🌱 Bank Sampah Digital - Aplikasi siap digunakan!'); } catch (error) { - console.error('Error initializing BankSampahApp:', error); + console.error('Error initializing BpsRwApp:', error); } } } // Create global instance -const BankSampah = new BankSampahApp(); +const BpsRw = new BpsRwApp(); // Initialize saat DOM ready document.addEventListener('DOMContentLoaded', function() { - BankSampah.init(); + BpsRw.init(); }); // Export untuk penggunaan di file lain if (typeof module !== 'undefined' && module.exports) { - module.exports = BankSampah; + module.exports = BpsRw; } \ No newline at end of file