From f83c31df99e4c73b66c2b6b9edae88a657333db9 Mon Sep 17 00:00:00 2001 From: Gabrielle Jonathan Juanillo Date: Fri, 20 Sep 2024 18:38:19 +0800 Subject: [PATCH] Create ValidateEmail & NameParser Utility --- .../example/midterm/ConcreteNameService.java | 16 ++- .../example/midterm/MidtermApplication.java | 2 + .../com/example/midterm/MyController.java | 15 ++- src/main/java/utility/NameBuilder.java | 111 +++++++----------- src/main/java/utility/ValidateEmail.java | 14 +++ .../example/midterm/ConcreteNameService.class | Bin 651 -> 1110 bytes .../example/midterm/MidtermApplication.class | Bin 748 -> 867 bytes .../com/example/midterm/MyController.class | Bin 1062 -> 1359 bytes target/classes/utility/NameBuilder.class | Bin 4688 -> 5079 bytes target/classes/utility/ValidateEmail.class | Bin 0 -> 876 bytes 10 files changed, 87 insertions(+), 71 deletions(-) create mode 100644 src/main/java/utility/ValidateEmail.java create mode 100644 target/classes/utility/ValidateEmail.class diff --git a/src/main/java/com/example/midterm/ConcreteNameService.java b/src/main/java/com/example/midterm/ConcreteNameService.java index 2008297..9f7ba50 100644 --- a/src/main/java/com/example/midterm/ConcreteNameService.java +++ b/src/main/java/com/example/midterm/ConcreteNameService.java @@ -1,13 +1,27 @@ package com.example.midterm; import dto.Name; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import service.NameService; +import utility.NameBuilder; @Component public class ConcreteNameService implements NameService { + @Autowired + private NameBuilder nameBuilder; + @Override public Name process(String name) throws Exception { - return null; + // Use NameBuilder to split the name into first and last names + String[] fullName = nameBuilder.process(name); + + // If the name cannot be processed, throw an exception or return an empty object + if (fullName == null || fullName.length < 2) { + throw new Exception("Invalid name format"); + } + + // Return the Name object with parsed first and last names + return new Name(fullName[0], fullName[1]); } } diff --git a/src/main/java/com/example/midterm/MidtermApplication.java b/src/main/java/com/example/midterm/MidtermApplication.java index 76c2a64..76f3391 100644 --- a/src/main/java/com/example/midterm/MidtermApplication.java +++ b/src/main/java/com/example/midterm/MidtermApplication.java @@ -2,8 +2,10 @@ import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.annotation.ComponentScan; @SpringBootApplication +@ComponentScan(basePackages = {"com.example.midterm", "utility"}) public class MidtermApplication { public static void main(String[] args) { diff --git a/src/main/java/com/example/midterm/MyController.java b/src/main/java/com/example/midterm/MyController.java index e521f1d..23d74e5 100644 --- a/src/main/java/com/example/midterm/MyController.java +++ b/src/main/java/com/example/midterm/MyController.java @@ -5,6 +5,10 @@ import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; +import org.springframework.beans.factory.annotation.Autowired; +import utility.ValidateEmail; + +import java.util.regex.Pattern; @RestController @RequestMapping("validate") @@ -12,12 +16,15 @@ public class MyController { @GetMapping("/email/{email}") public boolean validateEmail(@PathVariable String email) { - return true; +// Validate Email with ValidateEmail Utility + return ValidateEmail.isValidEmail(email); } - + @Autowired + private ConcreteNameService nameService; @GetMapping("/name/{name}") - public Name processName(@PathVariable String name) { - return new Name(); + public Name processName(@PathVariable String name) throws Exception { + // Use the ConcreteNameService to handle name processing + return nameService.process(name); } diff --git a/src/main/java/utility/NameBuilder.java b/src/main/java/utility/NameBuilder.java index 68a4035..14c8f33 100644 --- a/src/main/java/utility/NameBuilder.java +++ b/src/main/java/utility/NameBuilder.java @@ -1,86 +1,65 @@ package utility; - import java.util.Arrays; import java.util.List; import java.util.stream.Stream; - import org.springframework.stereotype.Component; - import lombok.extern.slf4j.Slf4j; - @Component @Slf4j public class NameBuilder { - - private final String[] suffix= {"RAMBO","ED","DR","CSAR","THE","TERMINATOR","BSC","CERTIFIED","PROFESSIONAL","DIP","DIPED","MSC","MPH","PHD","MACA","ASSOC","PROF"}; - + private final List suffixes = Arrays.asList( + "RAMBO", "ED", "DR", "CSAR", "THE", "TERMINATOR", "BSC", + "CERTIFIED", "PROFESSIONAL", "DIP", "DIPED", "MSC", + "MPH", "PHD", "MACA", "ASSOC", "PROF" + ); public String[] process(String name) { - log.debug("Parsing input name [{}]",name); - String first=null; - String last=null; - String regex1 = "^[a-zA-Z|,|'|-]*$"; - String regex2 = "[\\.$|,|;|'|~|\"|'|(|)|.|-]"; - String [] fullName=null; + log.debug("Parsing input name [{}]", name); + String f = null, l = null; + String regex1 = "^[a-zA-Z,\'-]+$"; + String regex2 = "[\\.,;\'~\"()\\-]"; String[] names = name.split("\\s+"); - - boolean reverse = false; - for(int i=0;i list = Arrays.asList(suffix); - if(!list.contains(o.toUpperCase()) && o.length()>2 ) { - log.debug("Check if clean string [{}] is from list of suffixes [{}]", o, (Object) suffix ); - if(i==0 || first==null) { - first = convertName(o); - }else { - if(last==null) { - last = convertName(o); - } + String cleaned = n.trim().replaceAll(regex2, ""); + log.debug("Clean [{}] results [{}]", n, cleaned); + + if (!suffixes.contains(cleaned.toUpperCase()) && cleaned.length() > 2) { + log.debug("Check cleaned string [{}] against suffixes", cleaned); + if (f == null) { + f = convertName(cleaned); + } else { + l = (l == null) ? convertName(cleaned) : (l.equals("Del")) ? l + " " + convertName(cleaned) : (convertName(cleaned).trim().equals("Del")) ? convertName(cleaned) : l; } } } } - if(first!=null && last!=null) { - if(reverse) { - fullName = new String[]{last,first}; - log.debug("Composing name [{}] with last name at the beginning", fullName ); - }else { - fullName = new String[]{first,last}; - log.debug("Composing name [{}] with last name at the end", fullName ); - } - log.debug("Parsing input name [{}] results [{}]",name, fullName); + String[] fullName = (f != null && l != null) ? (rev ? new String[]{l, f} : new String[]{f, l}) : null; + if (fullName != null) { + log.debug("Composing name [{}] with last name {}", Arrays.toString(fullName), rev ? "at the beginning" : "at the end"); + log.debug("Parsing input name [{}] results [{}]", name, Arrays.toString(fullName)); } return fullName; } - - private String convertName(String inputString) { - log.debug("Converting name [{}] to Proper Case",inputString ); - - if (inputString.length() == 1) { - return inputString.toUpperCase(); - } - - StringBuffer resultPlaceHolder = new StringBuffer(inputString.length()); - - Stream.of(inputString.split(" ")).forEach(stringPart -> - { - if (stringPart.length() > 1) - resultPlaceHolder.append(stringPart.substring(0, 1) - .toUpperCase()) - .append(stringPart.substring(1) - .toLowerCase()); - else - resultPlaceHolder.append(stringPart.toUpperCase()); - - resultPlaceHolder.append(" "); - }); - log.debug("Converting name [{}] results [{}]",inputString, resultPlaceHolder.toString().trim()); - return resultPlaceHolder.toString().trim() ; - } + private String convertName(String input) { + log.debug("Converting name [{}] to Proper Case", input); + if ("APC".equals(input.trim()) || input.trim().startsWith("de")) return input.trim(); + if (input.length() == 1) return input.toUpperCase(); + + StringBuilder result = new StringBuilder(); + Stream.of(input.split(" ")).forEach(part -> { + result.append(part.length() > 1 ? + Character.toUpperCase(part.charAt(0)) + part.substring(1).toLowerCase() : + part.toUpperCase()).append(" "); + }); + log.debug("Converting name [{}] results [{}]", input, result.toString().trim()); + return result.toString().trim(); + } } + + diff --git a/src/main/java/utility/ValidateEmail.java b/src/main/java/utility/ValidateEmail.java new file mode 100644 index 0000000..2ba9c57 --- /dev/null +++ b/src/main/java/utility/ValidateEmail.java @@ -0,0 +1,14 @@ +package utility; + +import java.util.regex.Pattern; + +public class ValidateEmail { + // Regular expression for validating an email + private static final String EMAIL_REGEX = "^[A-Za-z0-9+_.-]+@[A-Za-z0-9.-]+$"; + private static final Pattern EMAIL_PATTERN = Pattern.compile(EMAIL_REGEX); + + // Method to validate the email format + public static boolean isValidEmail(String email) { + return EMAIL_PATTERN.matcher(email).matches(); + } +} diff --git a/target/classes/com/example/midterm/ConcreteNameService.class b/target/classes/com/example/midterm/ConcreteNameService.class index fd057f31aab48b0c3ea0b770c6732ce75a167a44..25bd596bd4d1199fed0d62122945b6fd0d3c7ead 100644 GIT binary patch literal 1110 zcma)5T~8B16g|@qmM%r01qBo=enCrR6@4(Nnjq1{WQ)d{Cd8-db_xT#JI!>;$GgA8 zU!aMRL=t@S!QW(zcS{3`UW0;ASy~EW>i3B2OIgs2vI~l1(FYYw^G+eeChU1#hEk)S=X(Sz$P8Kr z-*ZaOkn>f*!#dZ}?)%P^*_DJ>^#8NP1h6C4W!DD zCNhlI3=j6Jyxk+{pv>S7T1iYNtHSK6=38!6p+O{y7Pr$p;*+IeId*>vdy>`U+X z4z2bWaB-Jbn}7mv56fg3&Hf6Ky~`iTnl8AWrfHtR0_J*fh4YksI7*HpN(7rB_Nyop|NC?= hgT!y-9js-j1W+pK3Lem3nnr?50uOuZ`k?klz+WPL6I%cP delta 287 zcmXv|y-or_7@Tk6*z@=oIYsG74B?$Q79g1__6FMuK1n;| zVqeb}v)Ckw9jlj0@Vbu8d^wqYBpTu76xxFt+O4#0HP`#pP!Qbk5yu`1#3Efp7P9yJ z4cVu0iRfa$N10g43aFq;C#a#0TsrR4Dc+Rq9I|;`7Sm;zrCbi&)KzZL;OLGzPj2F# S$`hVl_>f`?k7W0QC*T4#(j))? diff --git a/target/classes/com/example/midterm/MidtermApplication.class b/target/classes/com/example/midterm/MidtermApplication.class index ea5eaf7dbb6c0f011443137a182decdab123e83c..3ea93c0fbcfc92c795ad0503e430114ddd87a257 100644 GIT binary patch delta 150 zcmaFE`k0OD)W2Q(7#J9A85B2inJ_UkGMG(b5)DYs&nro-DA7;M%gZlGEXmBz(|69# zEy&MH%_|8`PRz4rWZ+3kEKUtbOwLYBPc3F-5Khj|)l02N%q_@C)yvIHDM>BLWn^G4 zEy>KuEUBDq$7IIHIk}X{o|T7zoq>1qP9_~OQ3fUk8KB*=42%qN(F{z*4D!Vc3II9- BDk=Z~ delta 47 zcmaFN_J)<~)W2Q(7#J9A8DuwdnJ`UW#$?9GKKU+_Ju4RjI|KJ*MP?m#HU>rp83qOb DT&4=h diff --git a/target/classes/com/example/midterm/MyController.class b/target/classes/com/example/midterm/MyController.class index d2eeb938ee28dfd2c1a6dd87467f5d5f108e774b..bc96df7b2f5280e67586129051766369ffbcc27e 100644 GIT binary patch literal 1359 zcma)5TTc@~6h2d0mX>lW7eTz@1t`jRAx49k5Q4rGBw+fWPt)xHgS$I*cFHBhf8>KE zMvV{t0DqM6o2B#;Yr@0MnRE7h=lkZIncshY{vx6kTFOz1dOS+!DMP)Ch7ZJ{;DLzt z`0L7n^ev;_=PFY61*4w1`Eri>DCNu=S9 z&y`wrcdSv--tzq0EDh3-N5gpNgBt3p{;v8n`eHHx$qR_O@frzLIncwBP_-!;fT(&jy{ND;++SNK+&6E2znzFN2X zNEum0+4P#O;;cg@70JzdSdr$9KzT-mlJ-SV7DhS05lq{C1-_ZCooVkSDi0iX&MYI( zW>@%kR=5`%((dc(mT>AZ8IUY>J=Bq`@QRA6?dN$V?S`n;+|(ImKwF3YL7wpO)5Ls) z=*|W&!vX%_Vqx+0TTer0N2bY<p<)$#w-qb}0|KGH`HD+7JwspUuvin8p4*gIEy4Bad^KsHmysH#mH^YjT z1v>?=7xpr24=kQK)@gVgmceF<--&&}CPi1Uy5B@YbQNp7QWHwXE^P&(`~fbCT*6A3GD*1(4*PTuQi=6^eXp>`kkfau{ LdkFtgQ}5%y1#VP# delta 418 zcmZWj%`O8`7(L&e8FSrM%NRqcnid-tlXPLl&RQf^VkKdRF4*@On)?pYg$0SE3E}~4 zJcAbz=iW|a#Nzuo_nx2c)7)$G@%{1+-~ihrQ?z1efxfsK6i4URmj*F{7&Sp|za+O~ zxf%^Jo2b4$k+wZlZ?-SpD7+!p?gr0814S<&fFQyQd!4A@6wYX80(s)1Fvsq`ff^d@ z^(g^O%o7O~kRbHpJtAkS!UxwY%BELl(_gO~l0mqLl%gf>kq`hGtHGyb*2)>=7A>su zEp~UUaS^n!UIy;d!3FA9#HSO?K60jaZEixm0 diff --git a/target/classes/utility/NameBuilder.class b/target/classes/utility/NameBuilder.class index 00c9bddedc2d83c77e3b3d2b447bd59d85b448c2..e85bcbf9103c8390d6c56d0e51c0644d33e29bf8 100644 GIT binary patch literal 5079 zcmcIod3+pI9sj=FO=hw?ZPIDevJ}d;O=+%8q+kn4TS>Pm4dx;ng6V-yHj`wV&CD`8 z+foqlz+1dUf(M9bye(IHARwYe5pTs?@j$$95frW8H?v8$$J9czP7N-kny?s49+LOtSp6<3z6=#rgdq=N|RTRj9q>6E^OP*dM z2faI0)Ns(dlUrv~c2`@XO+_u~+mgv1lGSrjat)&qaRp5pn(@3DtMYC-)7<7b#=#s- zH*%fn9DT5^c6aA|&$QP0OWp}d)>?rLI9I`W8lI1h0!!si+CA9ZZA_Tk^6AX5=?JK~ z{K!c9N|WrXN-;QJ!v$!e0U3K#K<~7j(dJxc9nfYEU=>2aB}o~ENx}; zZp@;D*zT*Z*&D%DygNzt_+Aw|sq>y(Ll_D!*6>1fQdTZY2b7jo zSM1S(e0jE8Ll1fdlnKL4jY&6Em(a9smx?}tc$XxSevrn;4y4_&n2}1ES=SiKn6cED z;TS2`baJ!K>6f0lRN#UVOc$EJa78-gG6B&jbsf~O3%eQ9lx?|2+M=>6i}@xfKWSc( zH?5S}DplSqa7JRxOpV9VBfiS%T+E1NjGP}s$@Ikz;SXNueGp{HMj#7~l zfTT7xjDX<`J7zXxq|CNVM&SHnB^JiEuu_t5nz@z8n1!Y|BW?WR1e1(Xqcmr$NaAWS685=T3)0X9-?+uK9 zVb!#TRlHfC<~aZ&Rvb|kZxvWeL!{4S70s#c+Ob~8W`tuh#46rS7q#^gJ>N-KA2y|{ z-lgFtS*c;V!EtlaCkk$+pXQL#*SmmyVN4>Z;=Qb%SOmA=Rt4|Za2q}_bHvLThT1eH znt75PW!WPFO{ehB!b7b(1U{(YLzt2f?!iIHnkeXX5|EGNt(2R#t!5eC`~>kdMZv zWp?K$hD@hlUPRtKo-#56hLe`_!eYoBOH+7tr(`?tp+IIz*0ED&juc7(2PL1m;1}ew zoGeO~rOP3!MeqhFcg#`q%5!E08+aE>0`gi~3^lVXf{wYLCwCE+M)H|Vx5sQz(lt`! zT}IZ^SHa^1pDxoKvxf;Tq>vXY8GBC4>fVanNBHvVOc7f1my3??RGiI)))3(R++2V&;A!J2vIq6_O)h$6@ z9P|?ROMykg$Yhdf*W?@XpTv6+6SVEwF#e7IC^(@pL4?4X1-5m1F{R?h$V`bwm>qMo zNB{qJp3(^?ZThY)_R&e(o&$>kZoY4-MDRJ@Gy|38qKwZGQLf=P_-&O?=MffS$IC(R zgDD`rsdZRH91pn6oFWzx(H8i(R7xnKQef4oNm-MA{$MrVNC7@&0ytfMUGRSVGH2!N zzrtRZ-zyw{)uZ?tzXVy;-tO1Aa*HJ}84hy&^dn(j&>iGJR2Uuw1W9 z4l4SR(y)(eFa-pkFu@MSF#Q3XR?jxXR+1v)od5(YuPT=*RieC*R!qC z>yk&%a1YM8!&B!QY~@EPP=OFf-{eT6f>a3K!nfHAJcdqEP}#s!q*=tJ^qttGw>BKb zmLNoz=++Z0A-%n&tUlFKD>dKAeJq7i*y8ZVl}^2Udu%e_6(h$kXMc9CgZ9xc;{rZL>2$;~ky)VzcB zcjKI>HjRBpF%iJc7?l&J>~>r(>Gn%1>Pe=H>gCRrT~pW|e;ArSo5IGp{?ch&I|)7R zFCD|nfhnx=XB1r6pFI(ZcV8bCQzz;gkE1?*9A{T6JYD9+F3!+3Ca18}pEhzD=QJdw zKaQhG>U4cnJ%U%uL#qDzDU|7N^bC<(Z)))Ne2=Jy7=R#TkVX(?TZIUgpprSYlz&%X z8O}mA)?hg{bG8Ggp`Ua^%tH$+8NxGh9aiB6#AwcH+(pX6Sc?a-P6YU~fc#kBhz8M$ zMlpc67~!Y7On@wY@) z2nA2Dp7AWUapzg|u+>&XFJ$)&@HEO+F6Q`&6STbIIT^^GVz&B>Pf+z!5Qb(66$F;y zmsGDz&|+ER{1o!b0guwcAlJra;NIewgZ{P#CJfW*W>m_N{*Gzf$T-XKAvR9vR&TQJ z(7l)(JdAgDHR$hQ(Hz118js<2;3z&E;4^iT{_%#!X?&8$yj&=Z=MrKSpO+x;MCim? zoacee7Hq;L3|I~9l_lVEaRioxbGM~Bg;kM{=R8EB+Yr~G6^q!=AO=&1LqT9 zE?^F}U>(Qx?3>W)DY@Kd?{DFM{f5e~I%hf-#{|o=0M&^Iz{2Ba9rGkitDnte9_L=+5_KfLFwhxZ&v(mmmbcgNO{)GaSjZM21 zs3!@fe9v|!Rm23UhP(Q^2UTbS6+JsuEa!9Qu!=f?NFvq6p3Xf+dV5ryDi9m#8Sd{J z=o%U1#7a(drxGew3sfh1hDZ8#^~o(x6VQf+2Y21r9kysV2V1Ey<4y|bN!Ocf&u1pK?rTrF zlarR$sbZVJ>LJt16Dh-Xas}UTsKPMz-f-hpH8>yJ6?ACm#12Bccsb1;x5f(GdSl~K z14>51aCJ8AR>4@Ea`j%b?fR~^Ju|H{8)w?CYHm>RQi1s1D>pT8sFQ=Qm|4fRai(cz z69rUs(}yebEiowAsi6nEs5+k`BIQ*#mBB-8Gcxyg+>!!<+V~ND8#| zOCgDi#KJgW`%{LQPFp$O9Lrcnddl?7v~PL&d8`H`P=f;7%WS$7jinnP1~Wdr#z^RQ*B~}!Pqv9$7Na<@dyc{O;!LxE1Gi`NcG6Lt98c|%bbd$3CrUkYp zGM4Ft<{4uL4bRHD`z6MU;N(QUkntC=wIsF^0*z(VmqvS@YB5Z~RCm}iq=`i4Jc z8DrL@?KnZ5J;a=O@e3_yT*XZU|M{xVNfc1=I)Sqjp+k}{3wHUgG32=nh9RS&;PnD4 z7gxh>7D~&D;by#19wu*M1~m4`bbAZa&8WfK@OB07(C|*YOJLPP1c|$4X4^?~K6qxh zWZ97Ee%F!VrMZV0e>b6PTIF!r=5Q13t84{Y3X4N z@5cvN#3o#?$4rwpMsc_2StR}ZpupO)=#}P~#OK2rZj%gGeV1MnX-U-EHGC9z@chdc z#^@bKiE(3JUm5<$JwB%42tF>|WsW%G0KX) zaC|#!^*Q_Pyv-A!%W+)al<{FL(UTcBJLXQeUu-#+XZqGSmqZfoI5V#{X*5Zd@l}0{3)9|)hA^b7oGLoOv!m}+R9TxxN?WZ6qovBNnoj4T)DW! z=6@e0WZLlToUlD98IkGCIC<8jb=~H<&K5?0qL9gib)!lyp;pDSSWNOFdF&0OHTBJVhL{gyxFj-Ecce4L8)q!# z7QD2z%a#GHlUNn+Wt(JVc%3QoWp^32G=~Js$xND%?jCTx>GnLGwp^cBGT~W&9n0|v zRb991`ZU7Kg#hJiqxe}2KgTZ={8GcO@N0o}3v95R{qD5Yo(!Dl3UgwP^)-Zb;q8f1 z9EyuV1-+&-p0V-`N!Oh&T$N!`sr+A`k8EN^t0G%`dYTj z^t0J6*VnVH)i<)O)0A}$cwDKk z-V%?@;^MhTGh_^n5dMU9x7!6cJwyD9(EM69`(yyGw)g3V@ zG8TOZ6{D5G9MOtb5v_PEbpqp+Xuc0E$1&Ma6R(NKW|2LCTm_HT4*623x&xc#1_$FY zDHj+~Uws$~l`m_SA~*CO!Sc4p5DVW1ZmJeXp4-~`D2Cb|MY3K!45KQDQyUexraGc> zyI01ef$k$XGn{PYWLt6a)x}9E_?i~^B0Y~DCB%^+42NK_ucHPl7>rXHjC%G~VikW+ z!)mN!yB?>LKxgp#`AiI84X(ji43xo3>N*_4*|;4IxQkMcU<1B`jd&W3_#K+@3|jCk z*Zu>W@f@~@2+k2YKOWce6R{oViB4=6y}X0V@L$gmAL32;Av{cK+{NI39$%nUjd&7Y z#FtPl2~Z@5>^(v`)_idxzRX?)YQ+wGg}q9w5a;7j_99p%w&F4Ns`zES8DFIjQGPTx z;cM(EST8o1Gkf$w+&n4=j^Pdc zE&7{D>En27>jQW9w z&T4L{WS)J5PR!!Y7Ir@|i%+q8#Sv)D(l^;}mM-0Sg{%RgvCRxM`2DQXv|3zB8eT%$ zB}ut{QY}e?2GNGgSkZ<9!&in%10%T*=i>W;;WAt_h#&nbelTC**3ww{Q?0ii$7k=w zW~o>ND9IuyV;;c|`K-W?@MAvZ=uh~3I+zpqDb4&1nfyomi6b%2{uzJ8-x2>Gx60F= diff --git a/target/classes/utility/ValidateEmail.class b/target/classes/utility/ValidateEmail.class new file mode 100644 index 0000000000000000000000000000000000000000..8be6f2d6a3690f35f41ae8b93b31a81e98ffd360 GIT binary patch literal 876 zcmZ`%TW=CU6#j-wm&?{7ib%b*XjLvQYhrvbR3mB7m_Q|k5QEWXSSB#dva8Er)ZgTb znpES1KfoVlJiDwdMts;g^PN5OedqS`*Y_U)9-x*&1W^q!9dWENWRCb-Zra=#o6m+v z!cq)tyV8;BAw#rO?kABzQbS5d8ahL6uB0v1d$Z4NIpRt*r(D_$>&!Jg1(*8Ek0C=s1fkL;gQ;4BC_{Ya%>`yQKwNkmcTldtLEn zE*wkL%m2u<7mrBhJaQT?=*Z*Z3YjqOL}nJ0J4j%Yq4?@W!x(Vm!yV&(^{{5VtUfw* z_;ANB;bjH*~QepYl%Bj^EbU6zK8BQ^` zs(=AQTr8%XX$v)RM;-3*si0{RcVgGF!*xk@-MMFp$3ZW$e=SJOpE8QHOA*?_2sW{W zZBVBJR3J>-MfWKAXf5fyM#v<~$i^#Q!9E3{*Xi_slM_31>f!wcZW2o37D`0#KfXuS zk4t}sRyoG{G0uG?7{MupzC@8m8Qb)~LSLK_03};JNu?NYkwUic4VS(^^V4BVTnR$A I$rpj~8>&jf9RL6T literal 0 HcmV?d00001