From 3e125bf1b35965d4a29a85e2c1cf973b86a9246f Mon Sep 17 00:00:00 2001 From: Emanuels Zaurins Date: Fri, 8 Aug 2025 15:35:43 +0200 Subject: [PATCH 1/5] core ex completed --- src/main/domain-model.md | 84 +++++++++++++++++++++++++++++++++++++++ src/main/img.png | Bin 0 -> 101864 bytes 2 files changed, 84 insertions(+) create mode 100644 src/main/domain-model.md create mode 100644 src/main/img.png diff --git a/src/main/domain-model.md b/src/main/domain-model.md new file mode 100644 index 000000000..bf5f6b389 --- /dev/null +++ b/src/main/domain-model.md @@ -0,0 +1,84 @@ +``` +1. +As a member of the public, +So I can order a bagel before work, +I'd like to add a specific type of bagel to my basket. +``` +``` +2. +As a member of the public, +So I can change my order, +I'd like to remove a bagel from my basket. +``` +``` +3. +As a member of the public, +So that I can not overfill my small bagel basket +I'd like to know when my basket is full when I try adding an item beyond my basket capacity. +``` +``` +4. +As a Bob's Bagels manager, +So that I can expand my business, +I’d like to change the capacity of baskets. +``` +``` +5. +As a member of the public +So that I can maintain my sanity +I'd like to know if I try to remove an item that doesn't exist in my basket. +``` +``` +6. +As a customer, +So I know how much money I need, +I'd like to know the total cost of items in my basket. +``` +``` +7. +As a customer, +So I know what the damage will be, +I'd like to know the cost of a bagel before I add it to my basket. +``` +``` +8. +As a customer, +So I can shake things up a bit, +I'd like to be able to choose fillings for my bagel. +``` +``` +9. +As a customer, +So I don't over-spend, +I'd like to know the cost of each filling before I add it to my bagel order. +``` +``` +10. +As the manager, +So we don't get any weird requests, +I want customers to only be able to order things that we stock in our inventory. +``` + +| Classes | Variables | Method | Scenario | Output | +|-----------|-----------------------|------------------------------------------------------|---------------------------|--------------------------------------------| +| Member | Member.basket | boolean addBagel(Item type) | If type is valid | true | +| | | | If type is not valid | false | +| | | | if cap is reached | false | +| | | | inventory is empty | false | +| -------- | ------------------- - | ---------------------------------------------------- | ------------------------ | --------------------------------------- | +| Member | Member.basket | boolean removeFromBasket(string bagelName) | if bagel exists | true | +| | | | if bagel does not exist | false | +| | | | if basket is empty | false | +| -------- | --------------------- | ---------------------------------------------------- | ------------------------ | --------------------------------------- | +| Basket | Basket.maxCapacity | boolean member.setCapacity(int cap) | if basketcap is negative | false | +| | Basket.items | | if Basketcap is 0-100 | true | +| | | | if bascetcap is >100 | false | +| -------- | -------------------- | --------------------------------------------------- | ------------------------ | ----------------------------------------- | +| Customer | Customer.totalcost | Float getTotalcost() | It the basket is empty | 0 | +| | | | if it has items | price of basket | +| --------- | ------------------- | --------------------------------------------------- | ------------------------- | ----------------------------------------- | +| Customer | Item.price | Float getPrice() | if price for item found | price of item | +| --------- | --------------------- | ------------------------------------------------- | ----------------------- | ------------------------------------------ | +| | | | | | +| Manager | Manager.currentStock | String setCurrentStock(String type, boolean state) | if type is valid | "The stock is set updated" | +| | | *This goes into the add bagel, it follows the stock* | if type is incorrect | "The type is written wrong" | \ No newline at end of file diff --git a/src/main/img.png b/src/main/img.png new file mode 100644 index 0000000000000000000000000000000000000000..ce226aa1e059a0bd38cdb2babf9a8b0b365e9d6c GIT binary patch literal 101864 zcmdSCd0dlc_CBn`R9Xe%j8##A)H>D$5G&fSCMs>MQUO;)mS|N_k+91a5-m#VMmi!y zWeI2zWs8cCKp;_5n?isft3V(`NCE^BAV3J&-X{puAmCEx_xZkmwV3cM_kGTF&bh90 zZZ0@EY}1{)bndKKvvjxr@a^tdvp#{$nx(b*(>cJuDD7NYXU#e@Yx}ob_J(?N7c(mi zI>Wk4A}Tk1`o;62IWnVjv)jL_vEE|sdyop{a$!K4A*#1$^_XX9lXKM7~$cjy1p zHGcii*=Ofi`~w=a;K&&#v-Y!|-?$BYiP^PJx{tR^N^x0IGWX%dJ}smBE-wG=`*z>g zDw`yiU;?}Z2S*iT=H0dGm9bS6F!ylmE4+aW0_kW#%ch$a%-KAhz z{ffNY#jiWteq=9#{uZzBV88+i> z7tq+hJmeC@B9i8AzSjj@`?>i8A9d-ZTT(yj^_CzU{Kw7tq;vzz#BcnkcQbB{<;ZVm z_;l`>@Q8yH9mu?ipQiN>jY~{>*OYj`3jZR#5Bj(mQHy1$<1)3 zT$&S2MfW{h91Ejw^4Q-MP3H%3`UkO&q z=rHBiwQPAgySqypHay$ZH3I~b`#E#l?DuuG!jyq-ZO76Op-2bkb&k*+OX{ACnw9YW zxWa(2e*bc5((WVf1)vuX(bqG*8&&1|`fI%_MAy~^m*9|TIc}7dV3gBcx4MjnOo%O9 zI=nlsu-%@r+j$*<%ZQuOjVsawg*ns^k;mG&9cei!b@v~kkNfM&sEc05Kfs5jd9NEb zyKu#258th|XAg=^r-VU%Rd6$kB<)Pc-`Ra{Z`W4u7x9F{CsdU$mkyy#H8$N;8sIwe z`S?bs#QQe?>w5wuwQF;>bkS6xOAYKSL?}M<|8)5|$h>2&l&PLq1FxMJMB%5m>l2)U zQ|gfO{=(_M%!pkOierZ}0zRPtDIrm(!^RAVXH|6|P z(Lm%@nB$7xYOwWFPWje`c(WexK{uL`@ZIb9d4DAwVUK?~j$SqW+15`x2EW>Ccy|+f z>r_!EWSx6`Hf*`x@^ihOsizpYA&_a#VO9N?n$gD$wtC}h(coR4G!s9cEq?~j$(g_P zQ`Etx{-yRZ%%b}HD)0Zk9_vn(;5fYZ+^HPY*2{;vOjQrtF-Het_bF$vvN68?z*H-I z$ezNAhra)lgJ|V2WgqrZ9LMw1Z6WXUPZPN~{uu9wy)hF+6;zM|1+PtKq}K5UOkQ$6O$9 z5JbhnqZ`oj_Eicx73JftK# zF8QFDN70LY0HoZrsuA;1IxCz-~S$vCasl{)G!c-bjtvoi7l-N$yoKf{(faM zOzEu}B&ZsMmU&P6RSK|bC9Qn^*3g|n06MrJ+FbJh_pMbwfcjVQu9zLrb%2N3`IKNd zo&{O^)G1WnN;Qxb1mA6M8@;1CAtAVoe{&@m2l!v=RjmD>H4brtB#ouYTvRmb$SxHP zth_5-l?>z?fL$0B>Ok)8ef>d!yER@FU2HGUmlH=Di-p1Lc}>C;LCNzxO4Llwrii)-#2~E`ff;@W6P31 z$ExyG4NUZd18Or({R6=D6m)N|hpLq)4(N*^&pr+qZ`PeWQ^JF(!1#lL$E%kWsRkWK zz(rYmlx2SAHTuyBSYM+-i4jy7RwNBm4RfND&m%DW=6HtPr>4{TJpfzq_lDU~Cv|gO zUgi&B6-73}ZZ7j^feOJzlAwX2pBjW0D~{~UQ6l?~KN3C{dm_%V*+bBrZML?Vy%B!m zM`-zdH*oZW>R{XO4F_4Gh_E2@gY`ecmKUv^=^@`6TSudyx22w`#O_IdU62Xg@7L%A z%$ByJexzldF-F$%$PIUGY`z(4(EVnW^A)2x*V^bmK$ia0qPq%YSF@z~0rPOBmHD5# z9G%ro{b>rjOWrS3d4B~(px${SzYE@`U)*voLo1KxI%RRBP9_Fd{k}Zwn9U=W0;0P_ z5>*mFD$y$8NN*orp}WW{*&OnpPePm{Uz(ZI9M-#)gdK2hXnU;8s66~QTpz(ZS$=4` zVEF++s}7ZiO=HitA`VzA)%)o&X}tx@Kjgfp|4Q!B&6Z9&kX6@+*FcSm%@2z*f~@Xl z>1=-T8@91ZvOLXk8bFhrW5b9U8Hj^?pTVblEAl`hj2ZQkt~;P zb)fo+{myd_MD)Hq+x~)Ja5)}`W1+UwZ%IUaQ`M^1u=!o$n85KDy94%?k8E0Q#w>5` zBX8hGry%2gThB@?4vq{(p7_Etkjv{{n0n--U@pgI`g=1#b9cU$1J@ZI9tfYInzhE| z2dz?Tsat7$Lq!a>Tz=51xhk3C z*?Vi+tV-kpdqhAc&*!u!WVZU+^e^6k??IB zSUMhs2pG$R*q40}NSL~S)H!=BKE4+9{<@*M{(|R@2I0RVsrs8h-UuMH$pi4-DoJp3 z@0{nr+5?aL=5tO2@_h{A$SME%Ip5WuZ9JAfeTqNgy2Os;;F&Yj%_pqaN<$IPSZz~>wC)H$0-WBG6yf)V1^cNwq-yS6k~_ zpew&!)}6~d?vhyp-Dh~xp3>i!7BB&wGay;>dX{{UfKJ+xw)@_^Y~M(M>k49RISSMg&cMTKK-=!?TS$w5(hrxEKTYi?Nk@;QE1W6)an0NP)zrv3q7f8% z0P!+m$}$ir4T> zDIFiE)9T;bs0P8Qq-dlj2cynwj$acw?pK_##_##NHN!eu`KCA0Ll!_b9^E?wpZ;$4 zs{^S|nM|Df@fm)xyEJKAfW+41>)yqQH?Z8ICX+djlgwy4zpvGx`+?B#{;>1Ts{&-* zeu3{9%m89$=^H$p5Wukw8JZHsWQO{k3eV^S?>F3pBtAwexjTaxl81bk%ybDNXUk-& ztF;2h`RaC;28s6p>HjfO!JNr#-x+IwJh+^pA?|!oWO|+L``WaB+p4K1=rk`Or{&ylHJBd(FPCt7g(2?gchd5>M`MZ#NEE zf>9}lh}2^1<;kunT`6y^v}+STWXCvp{ECL2dsD(js}QcJE7BZ=!X7$7caM?V%?ZgO zB2{5(>bf9Tz!AGjGbN#J-jb?)|H&^CU3ZUbJg4?w{%M22;hDM zYw%fyfJTa1>=n0_oxtKKg?FfE5VpKFO4--*EsE}j2Z)r`;39}c&skmxL^y~|{?RCz zb3)aTrhHP)55Xp0B^=FR?wKT)d?Zs%@*-IpeW|BID=pY^w85*Og?5`fo14gHS>Y^J z!nZf@?@bgwuadoKAdmXq{Ha(M@srUw9dGH7iTDi7NDt zyP6b(HtjXE;3|wKDX_=ij4B_3pI$}?Jz_i)8Nz$OWXkBEbS=ixKxaftq%;5bBM6dZ zPh@EK3t1(7H5+l?Qs+l)&IWsto$fwuhcML+P22_D)PXFSM7w>6#8F|(veD7Gl)6&l z;-!?*H;JN+@47Z0kTF7nNtQ4D5=Q+0 zEJ4|@5>;P+NimI-CwBS;B5XVQh9V^9lSIUnk~gBU2CH;Z`Yy59K_8*yOD=I<`u{*e zk-|!SI)h7HE0`OARqn zp51PVNeC2d!4?F>PB0+q)tvga?=QiK^&kvB=*N*nX%1sWwJV)z$x0Mx+48I*OUAV^ zwW2w-d2L`NzNd^NjZUDMas%xc51EQ^X+gV$8>?)7DvHyEV5nGy5M^5IhECYPzIWHk zuTT=b+R!zc3J6dZg}X~jeU4_v=aXGA3CB#OwScT}PpYg(lO44x)6{Ci>P`5U zW4gt7vLDO&3YRgiKD<^1{KX{!Izfb8xT1g8c3~J1YM$NeXmc_&)%6)#Yw$C)=+^ zWE`!B57J9E?R|fv0$vKx<>t4{dAnIXii!2U`{u^aT#)!)$_cKFKFm#5^$XMjGL11p z7#EQ3+sSMNBG~$X+F639uC3~=9CA`Wz#x`I$EkXA;X`1w{5REbiQ`T5OSJ$wf8Bp` zGC^N@oA`vd3W}~NqHeum#NdtDZS6~^aG*&=-E@?C(=8bQ(;1`2q9G^;*Z@63^PjG) z3YKj-T5#o5ZPn=zi{IYOm?ybLJIDh^yRE-!Qb-MNAF+infce~fSf64ds|ADpy@%2S-ClegLO|KvRR z!tD|uvoRb1oeePFCZF|La=cn$#R3|0S9AidVm%AVf}uo!2JY#Z7%C$HdiX9?M{m&$uc80| zVE(tyl9TOMVt`4&!@@RNJIUp|Evk-^j2OfbLP=CiGHj=+$=`wjfb`Zb_ZSL;v9W_M7O7bh4H zZ7UUpr4+jt)xm>Xj$TRYL3k(O9-^IsG+GSRHBQv`mJU;KsHOnTuEd*3P2x!yhFX=u!P_ z+R$&sO)+&depVR};B6Isj#e8hrj?&8zR2N~ZN7?0FmJ&Ck^0g9E~Tm85!N)+Q5U4M zo*~Lf)PeAGZYDlFK?y8& zhwDUNSJU~?*MLnp;b*BzN(l0nxA*BlXf|)p9|(;+$g**>4R=F_t>hbx2+Ip70QP?3P6U4&-}L8xQ=bsbf|vdNHKU38 zYi(g;S`p|b$D+WkZfz}y3uNn)LbR!LJ<9}_x1(oIZEAkIF&Mt~RZAK0yBR=NyLe%j zI(IAT30i^xy3pQiJp*rCf(V%WLEcKX7e4ZP#=*3qdtFYh{c%{cxQRZq+Wze1-*x|L z@gjbg&O$8M`f2^QA^M1%!|z{mXh6cGHc{Z>29M6qf4b@UBH~x-Z$1~r#G4HBnS6$kklM{rO1}5qNNG8GC;i_gqQ_mxz{up^`HFJuc_O<{yeS@% zKmj23d_ZxaMu>Csb1qD_L0Ye`6)RDuY*7xo7qdeH2AXW+IbZ1u_Ul5}1#C7|g5Va= zW(DyS9ZZ=tQK$IC@z4>;m-sFSy$e~xzt9b(`?mNkz~AoA%>?L%Lu=RuK;kf+8B0t6 zuJg(Gl*79&^dSVPVQE-FhgpPCUt$S#6MH~5Swg0aN!X31C(mB-wVYj!m`>o_TnMJOLHo&OR`vxA&JF2om z-_A&V_c&7KbMKAjtRk`X1IH9y2!251FtYaHS>(*@($3~ zxu!-o2nY^xNr*PU6xDOYCn5l7lidDmRz3Ak0CSbeC#fOf?q4x8rOg8B5Idb#-p}4$vR$4{gTUyPeNQMqP72d^aBRWgpfdgVx!74w|%V!<7BEY~kE zpUDY(Mt$(p0VL$HZD^ebPT{S}vjd4ED;~%a6+%x6b&h@0lcgDYCJ309lVTcH=zSsj zk_>ZWi*x6;sB4CSw4KTds-=&miRH)@jF%0v(Z9JXkkO?gP?i=ChK zRP52^x4>^$p==!sm;M?Z&5by)?-A~ynGw|Rx?9-kMnCbNeeq3X;~yCu&j-pCZ5*C_z4z1O_d``linxTL zieq&k2#7{a)w8W|KVfCGvFGH*fusnwg(QenfbRL8$i>lWo(nb&LXUgqu-fZS$)P{q zaOcm`)nzd2J5F~ugfGA(aQXQLi1;Njd9Li`^FRw9wbkoA=Sa?sig zJrb4>H(l;E-CUl=%*m@NL7fBC*J}TF6TsnS2e0b^AOE2$m%TkIrGQ>}|a8ww%zQSFR|G1IELp>(?xsK?B(C*VJ?<288*9tCi zc*no^OcB~zijS*C*z;LPu4hT;pJ5VcyvRC|Qc4BiKtjD>V6Gq_bRZ7|VMqu^sR*NQ zV#GD@#ePWD!AK$d(%}X7(ASsLb<0l^ zUkWj+a-*(tO20i!atUwYCfIl^$uQA_U^x4a-4E0^+DBkz>133qR?F}E)rgOhq-g_& zQHPrS#I0}?=H;&!MhpY>TZ~ZiPYy-iuD@e|F!I1jj3ji|Di?@R*%cUGCh_6yAL>_l zpBYSova*f|LF^k=ii&bbB*~KPB@N|@cgve{ir2~L>Fff_dN1jVs-diC*O_hl4KaKY z1^CAMhLtK0TkZXs9jmDIr``A5uvzQ2>pr0S7BI>lIM#cHhyh*q9Gs>yH z-1)w|K?B5=WS!mfnmLvoQlU63L=f;bD{&w!G|S+Rq<`q@f(Q&Zd>eg7a~c19zb@7a zlc3!k+QGmRY5dScQEy>&WyniQRbgxJa90RwQp{@4 zLfx>gKqQhCA`Oq3lV@&+_xF`U4Yd8*Vdg9wC|YH+)T#XbY0_syRAHov$qK>-c5!D< ziCE-n`Fp|=M8yEDFj>*p==g|szq@Z>Q*tEO;Y@V2;x}!hqu_a3v<>(TEEd{`QUB=7 zNFsP?m8=1rQ)KADC=uTwz(31b8_n-c)P^{Q5T4Y;!WS3Kq4zM5_`n}Ta8do)Jw*Iy zGt-n1ppj{ul)mE(pKGj0Az`x(A1OxasSZHj8Sx=yFx$5$KZ^TJzzLZPf!LV2pIfn}qD(JKxtC7FO) znWAoj+75LaY>>B9+h(xCo8=*hANXGdhtUXl0+mKD(WVEleM_o#lf-=pNwUOck@ zGu!;VK;s)>w6AcYHE(PND1a~HL8#JFM-TFN(^P1L*q!aSfcQ%_NM4pQa-tAW_OOC; zv%5Dd6q&aNJL_kM0L{;D>RE3?z-6Rs$Vq~a5LtTKuY@3&x*1Gl08GYxK+>v(yXyE{ zL!5e?3{!m2^Z^`E;@*^fqMxAl*LBjWlGWsS?TmU)|>a*|GsQ(j3^< zXs@H10;RLA+Yab=8XcB^Hh0XL)LuW0UK0|du$%XWeCG-bzFST=D>+IuoV71W*OUWW zE7DJC?nIG{+Z_Ua-&ihQd4H=R(P!rzw@|n5?cSmh1 z&^zaVHH}ll<`Zpjw_aoEG5g>(($6PpMFIRh`BC<$(WZq`z)7bN?Y9I1`jSczjG|=3*X*n@6iJhGV`VOcV8rvZZxNXNM+6uYg90RfC6cqTjc0 z9>+u39UR{M?xX}|{($w_2B=I2vTuxH0r6-;}cW) z>I!K$=(IF?3#VMkBsV=`CoG{CBZZ2-K+idGBzI&0S#tPS5)%R>gKl428qR_?+lolZ zGJ0xDvp8J<4!B%jE@FR1EBCdzQ3Se%nGoy}=dg zHO>#c-^1&mG!Gpi3UwY$908!Fk?v`ek(ksk2I$7iL9}OmXT-flB|c4k4qqX7!5jpFQTnuwil!+hb2wc&C0xG8yqkR zv_swg>Jl%!y9{8y58}u^Xl=(Gc>_kC6hdNonnquKSb3$3WbgHAbuzP-E zw)F;#u*;zA<0MPSi|(+^h4sx2m`I@Ss5dG5xnC~t>oE72sIo>`hykMi(1O-YVIjQW z6bUeg9XsCCt$pP^%t8k>X*y;KOC)^ryK&BDgBOF+=j7_t*2C*ViXy|U&XKEi0qGXQ zf4=Y<@>xf3;g30IvW9HVv#B?XztoO4{vMbE%r&^U$d287L?oPZd!>v5E-EWRdo+l9 z55{Aw?^}HMGc$ohCjL3zNT(j%)L7N#?W+b=QblLTNlF$0#dpS}8i7`vAXyeh8s?#q zz*y?bFxqAW-WSGVb%L}iI(r|N`&*R| zmmy+M>+k(>*^KY%IW%Z9dwi8f6V!LM+rPSCTYbu>^fq%XqMNm$we|wNfReTL3OR+GzAGh1?K+;Y(D&sr!wSsK!;nSnzu(5oVs^f ziVCS_qwhsZB4jWLjokLD=l~HAf#_UX?R7`WSyc1)l_Q#-K8w zL1mucTab^em`Hs})um1bYPC9x)ja26$~o5dwx#m734y>))ugrW33`3X7Gd}SH-gH# z%@5YC1;}&YGzj&~!bDb(0iZ;2R540=_peTz(w^(B>db5cuGMBw60iAqVf_F04P1Mwt%@hrw z8jmrNRYgr2nhEww`Rh~z*Pznvwo|hL@8hW&$AC?N+*4=McRyBO_`iMmCGyEfK50Z_ zb#l3GC0?_U@O{(2$#wV}vGZ>(ky=02Z0Y&VOeK%2r@Qu!U-( zO!G?xuW)aQMvhk}_0;6?WxX_z46htW&s5L5HmHven&@V)5tKSBtxwd(qtW%0$nCEV z{wW4Zn`Y}50vtAD?9?5=4xTXiy(j2 z-wYXkJ<|B-1el75h7|x^O*n^o_XDTlYK`eN}LRlfuM$FH_3F2Q?Z z3=BZYk7W;N30BpJRtV7f5f0h+4PL$E6pKp6eB#|D74ykUmC9#};Xf)3>O)=bEi=Mb z$1!|;eNQy(R-Y7^hS*5~W_HoUU4~}rPs~=rJAq+e=ge1!O0v1!Wxm>kui1H2bP1iY zqq%oDF~=<#>Gt}`mEKGVAFbrq9@dMFgGt-H6u`*AZ6yXhc>C4R0jH`H=*RA7zhF`E z&V3?Z#?U9DM=wk<16(fp*Rs0{_V3fK>^Qhr&6r(W`2jv}>Rup);gx$-V5-zdm4K@q z8M6gonVb>4Ne3dl;isX4(&QnmAGriLG3}ED&3p*RV@Q^QMq0}u?3@kRArT%&O4KZ4 zn(zQN`5F_SojLq7w#+kSCp_bBF{)d=)AAPB!`He3kUUEsD<$jjb5tuU1$-f z4M!L{aanP?m{5sOAcZhjS^dci<%CO*>yX}l>UO)CcoraJ0rLeIuqsl;fGfiv^cDf_ zuN6st4!JPLxxP@`K-AW^!m~5p7olD3m9-26u`fNlx5>BcFmT9Jax<5GekV$i zxeTEc@({Kw$!A+T27lx5?qc@5sNrvM9;*2n=&Njbu!+4?E$;zR!So4reX=ib(%x;b z%14!pSN$~ls9qIGr}?I0{&r6JZNWNzY58Azv#&QLcyb&>QQPEQU4~v{<_*Jvvkxku ztVEanZ9!C}9B8SE*l1W$4Df@+e7VedLmeP>9P_4ZA_c#NlE|@TSNVyx(TZ55%uH|% z(4rG9)$n(#133K8e*Ex>Q8sf?iY6NfUyA7Oc_~Zk{*6gH840LJr6-~eW%-< zQSm2l_6Z)QBdI%7ih!bZj+C!a9+p4&pi%3N$!>MLlMOY7lW*ujTcaLW^M^KXlM1D!q5-Y8=Z`!m9LT+ zs>*s}PXy^yjqlCQ-9lxD^xwa`>M1vcMQ(?0hsifXnmi z4McWd=MMEk%XAN8?K++VJuXRX#ob|K@-RA%ju(&zu{QkZTQa_F2N|xTQtD}=eoH6` zl_>in+-iS}zV$3ZM~~3g_n@s;JY0CqcHKL#Nu8g07Wa`c1aqXV?MN2cy5f%be!-Cr z?vY`?rK9LNnRC@x5n)a2Naw<9Zn9KHnV+`792?o;ik`C8IiFiM(hg-6`H=JWm}>8? z?8ZcM_xV?EVIS3ox*mzNZBy9&(G~c|>B-r1jnu^@94S59fg%-9uUN;&`D zNOnb^__cAdfMd)Rwoo};B?Z9);w9-=@qKT)-~GN`zlH6P(%a{5XvJ&URWvWm2Hd7U zSpR?lqC#)=6V6~*!wQe;hC${@V_Nxw=#WElilg?qZC@2%ZmI61QvVCTA&p_m5<+4` zT7(b}bCmm6I{1Xti=3~*m++0@)oDy-+9~+whHoJn#@E3u)xz?fOj>zkHVB}Y)7%R#q_rhQ ztXQE7p|f<&L5eGSdOXa1hSuX|!3N+A066Asb##K5V5;AO0d`VP7vAR=$ct=W-u~1t zw+sn@XrMIsgkD@6hj;xspRW=!km(POS#xSe_3!DK51_^ZYS0}HhKT+LCrViUL){Nf z3|d&N4gwk{R*s);qvo97*rTWhWUf|Dn`#p>l3h^3#OvK^q?MNhI{ta!2;zruoGzBb~D=HKw8>kmU2g|y;E=wR=JZEg%gsI4$)QML;*p^j zkMb#BJXdcAa;V#7%0vC%+?pq+D4ec`eGWsyi@DDUcGzeqEg7eFueHu2V0>SJa2MO9 z1a#!1-94TW(y+-9TmNW?x>9x90D-b}lhU>SgRI<8SMK(it7UHrFx*p#(65TgU z71nh+5QY|EZW}XLA^zH(+518Y5cF_dIP8dOPjo^Llc}nARw_*Izx(ES#w_-#m_0mv zjTr&VQQD4HgOdv72-*(E?8Rmt-5CG}yVp>i+z!0heGiy^1S5N&AZ{OA=bCYn0(6<@ zoN3YxI(`1^^H`<3Tyh&56B*Bx{ZZcR^Q3LC2VqQ&XaNM72$4`FH;fPws#u`Ay^=OT z0I4UUDER`#4Vry;HThbfU|57(B4Jt|HLACU$TCg02_6?>BlT_`nd8BHAlVXvyb@E` zd?c5^Ra(+ykaR`=ilRSQl2&I*#gX!XyhaI1MO6?=__^IaR7$_?4OC9ZOvf%$?E_h6`yHRuxRC^qzn#bI;V!<$yKCAY!x&ML*GlikESEGyvT z0d-LsZHob-YdEsk!DIN<- ziE~~Zo|3X_Ce9du@}?>~3jo0aT}KX1{LKNiNM^cul1@EJ9o7HW7fmi@Wv?Kt1XH|Y zQGV$$UD_V@l(<(%Sk0_}0+~5*3^;JNC5ZTmBd?~v*X!poz6%_Tz6ap?@c^~{+6kk7 zuPW!MyhM>(O&Q{>mR=Qj{y+WY20?cJ*{Ap0=l@Fl)VIpv_x*(>_veOJ{xbKNcjY1R z&lSxMjsN*`%L?5JBO5Zuj8Q(nLdPy12n5>s1A=EgX9ted0JlA<7|EG+8}(_eRvwM$ zB+d^lg?By49@t~^E9&x1{`fNpQKi97QdbJuraoNS$}k@GhBUP_mz8L@W2o@sT`?}j19F4Zbbchj!5X%+GZ#@_h# zPkSq6#|oA_y>Xb7#Pu{A|DE3aAp!Xxmq(WG1=Z-Wx0W}(T!X%+O{{Y4)3^jlwx)i| zCJ;$xsrkUKZeTNjasj;3Q~x2$WY^di9yc|98$UhtL;+rb6|%Z@z5R*-nm|97z?DB9@&G$kNdHM4Cyilo?|0a$B&)va~ z;+myqpYH~CD6~TY2XN3R(KTFtgUg%YE{pelh_!z;j%M2Ycq8=8=;gNegOG6?M~xC~ zlt=fDx#JWF_IF=k6&ALncFe1bvfse3HRRaJ%ERvr~-kA=Y$1AD?ziqe5| zkJVXGHRl6--y^<4!+oSaGbKl3I|oF=K8TSa6rL9*xvjJrOl&U>-O4XWAfVQxPNSG7 zsf(^blA+*d^mQ)cUvS{dqR+wnj$#AYaM$g=Bz`)vRbf=FT$Un%K%pv0C|YqHOJ9X; zSpo|Uqj0T2$kQELCFLiQi&nF#6$*)UQueUT&-u>V1|KUVnOfTl^fJO8H#0jmBG9Wu zvo%#B>yJ+emG8GfWu@@Wb}1m}%Sv9KP&Ft|f~b^7f4{wM6QL{HW?k~0!JL#v!dW0- zo*}bMZIy4yXK&3N4T%S-Z2{upL%)4nPKJmE9$&y6O@CHe|%`z#q-qjtk$d~-PLgK1= z_r;H}#wEzJo|{0-+JI$+8=*I3j78i~SJ|NZ?C%xxGqg`)d{cQoeb+9Xj4ZG;jf7et z7vMd@{pI_W4a0Kd^d^T~x2HSV!!Qp@kmQQ0zuXdzj1=aWEN0-2;)`hfwEThF-!%*z zIx^&cQCquy9RvjCmoI^mB9_Ry)5^Fm)PA{N-Gvj+C4DbVR#E*Hn?(@@|A`?cG5zEt zHmC~MNJi1NXAl32yUNE}CTW?O64(;??w(E`j7(n6_k7Up%JSk$`3j1wf+WU@+rR7k zni3PTw&GE~U!rYx)Wd14<1~IX%4SWXmGQg1a6E5e{q;Gm+9zfeU@~OIz9t z`Lf|QN&0$Jbko4&sKuV57&E=FbZqfZt5<%O<+^|v(5V;+IKrJ#ev;RpMSsR7KeOZs zyPwo&N&H-yRn98q0g)7B>i-3g2@9u`|PuNpRwuk-ea$Hi5tTb zMO%jhZ!6WFw}9~-r%@}qnr@ujKyusBuNAH3Yc$IS732{Ucj?Cw9$W?^JlmZ$81^`K zbvkMfpZkwcMHU?g$NR!vQ*t7UO2`qL_b9>apLhjq#WQfa&U*NUczkXiAy+ITn0}Lv z{TiNOxW>9FKpdocZg#xzr-HDucCPHpSg77evBkQdE@__&%Gctv@|X;(+?9h}Cb*~G zaO3I%w0to&0!gTAxYOjQr!+CCC>U<^P>IhFO-D?VXBR2?k>U7$W&}tm;OEspv7D() z02X;W_R1pc&XZ`-0cg%zaGQ}O@MjTiJi^8LD*s%NqdF-imJlL6mm&* zDU3I8`A-_-@-`IpC6&SDNR_V1nQo=!H`t&|(9KfwL{db{{t+pR-PRW;T(^ks<>TL^Bv95!0}qV}yCY42%|i}9d=VQ=988;jvS z)h#o37G9!odD7D(g*gx1=B$I_tNDe)EOBJmh(3C-o~fer&pNFfBr3lEmr?Tt;7jPN z%@0^6NdSnxoR)8BrU%3tEnA4yO{Z^WIRBbulMD|#rQK?P-|hm<`NSIyx6DPU9^@WC z#AEqPQJ&Ib-ZjVLtHIg?%T<$?kO@;2A@?j8One*Z^4-3Jhzja#Gtahw+`>xZ_=IN- zrQEhYDkC?E?-8F6munTD5W>ja^T)u$0dh?3DT<0GdH!f)v8$hlA8rpEVI)HwKo#LY58`}gs%2MPH>?< zlyw&$FK~hWX|@Jh*G+LtG-s4s*UZ2)x#zJ=NQ_L|Z@N%CULIp7DiL{MP=-~-jBoa) zh{R`JP?X0gWAyd}VQ!r)8*S%~{`G>2x}jvI3^S1c=pTL z)$Y`nL!s0`o$Ki@C3a0 zI*$95(+nI?2$-=mysrHvx+obess*wRi=dai7TRc$g`#X{_>aZ?!~PW`3ObtZVgfP7 z!f=sNe-1|+UxM#Sv;{{e_);Y4F^G`WyHPhn3>AG5WJc__5?-ct(nSD1B7+7Z%q7K3oNH~(Y_@bH9xDj@b_U{;9ccntjD=@nqZ%3IWNJbgn7t4Sk5}0(zJ^V@ zJ}4uUc|e8V)p6PJ9!f}21M^$_Al`^bDI^~&d9QF*`ki{2Osw^Ov@a5y;QRo%6}Gt_ zKp2r+ixR0N1eC}A_#XoAJgbzql{FNyY@CwwLK}t}H)OkQ{JAk8F!&-CBNHKRge^rn zlp2g6%fx@wxiIlZl;<~cBViRr_mhihTE)`cK|`oZGT*w05fXLKm2GSLY1UDMJHluK z6SRZj^(e>OcD*}zB=Jl?)HYJi#Z#-b2FNa|!rORoo`s+k-@IWNKI$1C{p?1V3!+Y4 z`%O(}sgnWZCw0=k?b7SYLN1SEdx?HbesN*Afg6;!#s~)hexf^&dxmk_ayDG5h(Kn2 zhlW^2CIT6mcc3)JRKgCYexokwg(%{{FyPd$Gl`%2cHD3#co=$)h``ET%q4V%momR9 z0Rb165~)b()t1vI>iTnTR0%pI1D(~h?}C*>n+Ql*_JFatN)$b!fQhcalss?oDixO7 zRA1EJ13yI-8F|!UanXb@XNhY`(>7|pWWKDN5CwX`9<5#3`@^eyygj5t18pu0vgZyn zMHOM7ln5I@vE@9-Vzh|lDePBrH)H3y?n$nGE=pyiJL$RcA?1(NoC;gkBI)qSUc)Sq zptwD_I|Ef_iX8-GL^iuw)iNv>GeN4wv&ABnf=X>d#Ss@`RcE+`lUhWNcHuBM=9kmXcq)3PV+7Kc&0s;UfM)eDMSSIb2hfM z*U21DS@Ho9EI&M=N8ycynH9tQ@Ou{g(;p%1)}wS3ENs&AvIGH`_N%+N&?jl z4ZPYpS>ZoR2~2wth{bm!vt31KFwvS>z!i5YmC1BG^0hY;5}0{S-Xa*)U5fmfI4BSg z8$O8YoDUGOkCUn|sd?CBJ*F ze2YBM%wSa2qb@V&s;LB<0ht*f$bcN)Ql70P#i1^0C^e6p9cM1Sn;x;cfqWN(Ql$YB z%qSfv_L8PS7S5V=X4dv^x9m-Dj|z8q8*4vSYrm?G-jRNO$U3T)iqzk3WmUB~7A59u zze7s%5%@+I#Jbmc?T<{PsmZ{Z<(a?BnU=IUem^)SNdaoWB!TAtIurQ6r!v($Ftc{> zcS&(ItM6G*Fnys2MAnbZi~m35Ok?SIn~ZVN72v2`5G}VM?t6ju@L|S5Tc3qGLT%3jHgM@UH9N&pyfTnK z17gR!G@@dGzuFak$e!vk{*;p%C&uiQs6A9;#(e*$XH-qc4YwJAaR?b^EN=|J6ijsPPE%RP9D*<^N4S;f7KYIu{W=G>x8*j zy|z&v@yYDzdr-zr4seYAdFMyo4m&)q3=6`?K0~&(y)1?<17s)bHf=K|F)La8EEb~d zSM1ndY`kma-WZJ-U`{oSyzokWMSyBXG=z%rJ|f`7jukXGzU8%mWKcT1?0_f5nsT5$ z(gq3~EsDP!Vq6iImZr{oixp?a1SeBS#01C^^E8P0_qBN5WwpXqBy}s2J>SvN>Eq~; zsI+F3XYNwVLu$93FxBa9!(QL+g&4Z}`u@DRagX!4yuKw@L^i7Kfy?w0o=m^QQ0bH5 zVPOybETpeN91_!V_(UiQY_b475XGMtB24P;iz2Lp4Lv%SD5SPY_g8GO6o%L{%8N|i zWrw&o-ii=@U`DxgL!a;)lc75ab;7dUJ@=M7k6QC%gL7R$Ppp6;p%`f zlL_|KJ-E>bm%zyFlVuMkqW<7FBvkC8=oqOWWEhV;A&&*mZO$Xx57QkSxpJ#=K5~|HNp^Mu_0@~a9nrZ*`x4d+In5p!eVo*Hg;>ZIi1~?o&XKmlEW2izn&NvhI)zrttcU z+AOp((Fkayk;Pa{w9mZ@swShjPnXA*u$TjWN-@Q4qr){u`GqLSb26j*SwODex^)o8 zc~#QfZ&o?jKjXkX(2+Mt0_URtkG(e!X!6R!ho`IUXl1NZsS2cOl~R$YsF5{Qr&2}5 zsx2ZyTtSK^Kokf|QfrmADp*k>1`;KBlJS%E zdJ(i4r-;qj3rDco8Bw&Q0v9{PQR01e8%aS4^PHIgFg@bI>g&xeLogpIE$L%|H;{H}SIDhmTtTQW10Q_`NIpPD0tmcE`-l*B)@d^Q zJd}-*!h*uXxAOt`KIss@NcBwn-t7RM&cZy4yy8FaE0lramQk`;i$= zUDiHYF(we;8RtuK;q^~lY&Wo}E|>6u&6-HyfmEJqteytQotWD4%zPzuY9YJ9)5nnyd`84;3PmX`wY(4 zHv#|5Q)4@%Nm(7P*aUN@MDMl|svM-$^NoIM(< zwnFArIR7tzZuxXpKBlEF(2y|c12C&+n19@^|wX#v_H2sJz!n6w*Ih`Q_ZuIdn z=9P>cOulV_iNx$&8jOwrY4`#C1{x=mMrrD{KmcypIW8k|@)z)>;P2`UQ5)pFIw3jG zU2V|`#2?oILAw330O43j_hAM2%O(1p{Di5Tq}2I&4<7@|K&K_()At=l1_9%w7yx-l zefRwDFpX%RJ$$Xc^7a5TM09MF@?Sq^z(W+CAf`x6V9Ne}Kt_+f^crpD3vBCH(HtcD z$MsNt)S75%oV}2sdg`dY0==n?nST$DGR7Gp)__ol;>B17|FRKvaFRp1JMp!4%IzeTOa zxPqUwQC$OZHEY^ZP_omYNCY{>pLdsP{w}fuVf+9k2^5SPcG3g==Lyf+xVSMiWIr4H z>N|qAinObQabI#J-^*S4<-%%NG=Q=(nFvKz6eFYr+qj%Twkd#Tp}6YCPsJZyZGX$+ zmbsqc(l7^bccBU11FSnSg=$EboUuc+1lFC+Dbkq%8OuD=k*(hYa>M8Et25RV z!*nhUxYvDp)B1mz7c=9Mj%+^x0!V8cVkpJ`YJ|5O(2$a%{O34g!~`#sIVSK2_G7qW zz;Quh@lw%Ej&t+CSHtyd#<>+B986^9Z_1CE&W*vi$8a^Y6rP{9V(@$~iQ}83J0Yk) z?Z~n+Y~;B#?$5f|1ZE7tfgbk<0RXYdY;Rl5(HF7K7eyq-Ash~Mcs(DJkIA2r@i?yt z11f)x9~;)4S z1*EWMy2^`=a?ohJvrz!btbs)2sGItN$v`DW#z+A5g#2p2fbQF*?<*SK?BfB!nIRo| z0!h<*q-}r!H0a>r<)aZi03dL7AxM~q*GXRJT*2Kj;6Q50ura8-bS0owp9!DFLLb2G z0G_X1kIwG!dHkc+%@;9I`B5>N3U-o^!G2&ym$g1T;OgOP+Zb(u!q0bAm56$Ihx6HF zhUfudVHxQvNK1MiGF%&!=m1)xmS0Q<)cP}B382ELW5E_9HwBSl0o!xrJbqF0WLtYC zcE&`?BOmBZo|)QWK#yOiNjOjRN8dI?Kk9ZG zZNQfKYu`RdzY+=LYXH_m_1ot0I^+XBTW=uN+FR6D$ys094n9pFrNylkfK}Mrq+wRrpyBmB zwArhtN2Ym)ZS^5pH}>Ys-*Xl0ZoHc(-`AE!OwCkG>CFa;L%Z>rP2uXbaIE0|4(W#8 z=JLLV-un&U#ncI;Ko=q2TUO(=nq_dM+7kE>BoRL9UzV9%lZk?*0wU&KEL}t`FpNwW5bze4pK8i|uxO(BN!EQE%gQWgQFQOSnz`-gd6OI6llWA+v%O z>+k4yN)QR0V(^xqRIP6CIQTq5-=jYK(rEPeNO(oQgWSy{7L6MS><`RP* zV^|$96=GeQB2NLlIp0N@YE*%!&F5TW1*}?%>a@%cpn2JSG9CM!@9qJDy1;^~F1gs- z3s)27V)C5j!nDXw!x(@=!OPmx`fpcjxWNQSGzbQzfx}D@U&Z9( zNsM=EH3UPc`q*xT$ud=chS27s35Sxv>Uc0d97>eCBWbmN8msI;y5S8qy}m%Y;T2&@ zU7>-Gdb~9(d;c0sKhYt0y%MD(vqBK@6@G`v2nE5+! z(8EYuqZH{yt0-e-Umy@agB$4I`2wJE4DA9L@W?};aimy8&zL-i`2~r&DUr`;9@}V1 z>=`e}myES0V{tJWNzUW)Oi;LbzMVgVd^9@7#{3|Zw2uI!FRtuZ?%jwl4rGyKRV&5A z?_bcBIy6;A1#jcn5eBLP;h>8Iz~vD^WS2-kx#&k-YjUC>y06$;&!cJjjsqDWmpHQp zWPOZX`ixK`kWt)rA6{M2-8u1$1kswg)(VoOu^~$OIT<1FkHD9j5aGB$+1?Q4O-!*j z@DzPF_pj77A_C<6ywZtc`FYc@?^*V&QN}&rgNz9&$9lG=7Nfn2=GD`bo1DFdT-lhv zfwEFf7yhfe)@KzlUXYd>LvJ^BM0jCRZmhKJ4Xg)ZLZJrB90f(z^Ll-Yak}+vsvg)F zXvcUy&K;9``hU8;ASM9j4L(}K18~GM%3d#OF)xyW7`xX0qvfc$o+D&%0YugIRJ96R zFP$?eh~i`B7PM(PXqZHJ+diTnRJkYsGTHLETzVQFsTLs#IS&&wzvbNl-n8z{==Y{% z=LZ`4Tr|pyh1$O>5R;4_pkiV0qHb{OGSn<{ihNPqZUYrZ4vIkYP8H*w)55$Myq1C6 zNX7~wt=`(UhUE=03NZ!szEU>uel_Q1@ytdaK-oE}@x zjTSYQ`m?zXIFDEip|_=n>*0HiH;>!6L#Ya+NbH2Xam`LBAn$)bOM zFZU@P>XQNz=NAMfFIJLX0!Q5VS5z}Y6h(VGDdDuJJ`kkE_xT7vjPybR$ulXeL_Rnj zQ?~zp2zG}!$@5&qk1`+qg%CP@9;o#{2P3`MP;T2HyvN_^+XqHab$`y_Pe4(T$X|nr z#FYdV2&Y{YfHcdc2_Ve4K8*!@M z!MmQGQwlyR!Pi`uN%P;Pf*TE9B7}`?ULdjC{%H$gAN?0$P;Ecrpnq zd(mX-MaScJ*QYUHm8Z}ADdYd@GygY>8{_-HRsJ|oIfeP>`$y%%5)obgXn}CNH=3VF z@@&>?W#811Ujl9#pjfW@FY`_nkH1;YTQ2yTy9K$$`TNa{gqmc@cmi)#&V=2)=D(?Ygy&hMXA2{q-@-R@_7>A}8q&;5x&nYw$AcyZR-}1&!bI6eM38F=*;<+`=xwn7EKS<_AzIy5 z@$vN}^X5G3un4cg?f9OksQkg4qW5f~k5$Om9(@>4Eo2PfgfiAmGnnLJm}g``l)ATR z4a_n>ZlX&G)`FWBbQB%OB?K?^Y`g7OfQlSc<)JxN4;qBES^hEd3y|2|8IZ$?Nt&JT(h(YYs>-?ZblXz}uz%W|PSoQ~s zHbvUTAiy<(myP=(&}LX~2{-s|-sW!KGxhC7n7l<=qTGbQUjtc*0>JLc$aya99G8rg${w`XriN=dJrGo&SR)14U@e-D!<$v$Ka8B`J z80i)B@|Pd?%VLJ*u{S50k{Nid%4h=p{!>_4+@-xP!mN|K@){1SC-uNST|ububTKBb-L)IRvwf zf_mq5czo=JsIksgppp)*Q-}lCL8v8td=0+;LI}QJ9Tfgy&Fs~}E#N{sah{Q^35FkR zYJyk0*t=AuYZcw;{qj75MA$gbAwqL?BcIt`Q<#7xcxS++hnIuPF+EN&-ll!7 zTRK-lmlX7RD1JpQP&E@2aYgE0q^hW)ix)B(ZX>IuC~JG+io=ZgSshTJ>w2~DV?FJu z^;7$LRgb{hUX3e&2W#&+w&(5Ew0bwhE0B z+7CA3zXHYpx*_DNuf4>u&s7Vp34PXP+@tu;BK%&3wYr6JOf4dSmwWU0U=r$JMLj`| ziDL*QN_yeG@Y}4#(CC4N+Q{|*o0dNhB)=UX^7DWa8!Y*HS(8^?#fGdTt~`<;9NdT$ zZ%hgK$|bG+trQ9*QA z*EuR7Ret(Ax9T#&IVF&*+`bSmwUgxv(h^CEp^=Fn`|nYi`YbTrNZ^)6}=Z2j<|*!p9F? z0WL*CiM33*&66yUoB6A9hw zK9q`iKXL)|XM4M94na!!2G1R0{r#6lZKY#*(VBh|=&@nfDdGuz9;`0r<$1$blip7yIywYa^*b_#l41~L=;s8;Y;2X;2whZF&v(C1WNJ=18h}o zXZit+gXg$00-;W>7m{e86!%fi&Ue1VfYx--M)kuO7d~WkNitPc496&pY$KuFqZk|m z>^_FnNUs4Y9;x@`RVZauRZ*ki*5A~86J0~P9>3>jaCSIKR9|uX6RPjdlKRZVVX?nV zKY{ zKf^y3*JT-xS>w{*_X5qFKL@F~+&tvTh)KHlG8oGME^qzJ4mS^|SdQo~zJ=Pl>~Jf1 zvX7U4fcm^W+ux&xt-IdfcDNThBOX8D=1tCorqUqx{|_GfHd)=Su63F5bI?cWfgVRq z?A{Nc2e@ce&6*FWueu^{_xww)RuKrz?Zxl({pZi@TNy6%2KFnjX^U}~qkt4~Y%BV# zqa5@Z=U1L}PWU&q>=hUP?bLBC8iXI*_oMUA4_9>5RqQaazZqWOu1iw&oVb)fS8RJl zqkIeZmDTdW3wwMbw{*72ytG!^I0clA50u9(`(E<`k#4CxQsTA&{-A`wnIPvL>S?;CB{K;F*gipeM<86;VlzM#nX$zrjlf|FLqt$1TbVQ8^j<(LP+oHo~ObJ9r63#Z`cY zpdOy0K3y&E7s_&dPY^eBmzdLg4mUMsJ(%4^nRVH^j(r~ImT!e7rztIV@3TbHM#ZnNwWr}Js1(U4Iqi2}6q@2pTd0TQVc$Hl6 zLA&N}CS}Hu1OZ4lFYg$VFiMbD*pXIGP*;aV%=^yDwZcUm#Z`W@fATr#cSz>EMNE2Y4`TCkz7=TWhB47y*&c0Qr#T~OH$w>(Ohaj z8jTdp6B0nPKqo!jffz>gis-7ryJK+b*l^?rse0A zmU|E6)uPJ4s$>#GP9h>haats@&QxKdec*q&+l2A>_t{+qZRfivRKWsORE~>BIv1vV z1QW|erOGbB#cSZ!kFLCg+ylz}kT=t#3Unc$j}nvy%ZHTQ@KQ zdQiyQ`HStYaJ9?pTQ|8&@GyTKW?CnFx%p!?7eRMXE0GEjzqKP`neS@a+`vfoG~z8n z>^Y4IS@z1xbW0M39@z4S^X$|}m6R_3y>-r4E(^9Ors=jCJQr;Kw7vg%h7}+f1LmSI zhFobTh&+TOEP{*><%m4P=+7nmx7*KES>4wWpTD&p7PS-ShP%X(z%4fK41`(yuG!>a zn-iCjQnnQsro19IVGCmpt}EN43>6`)u8H0s-E&-8fy`CMqZD^z2+K08=NHIH7 zdE$z$dP-ULe+#->!Q21r8$@hLL)`xmZ?*sW=xNP4T!7AnA6VLI(MPJ9~;AA)YJ-gc$|CJb+NQ{e=PvcD| z1QErjXIJcJjJ;)tKH9Lnl5f(v3t;vs?)cdH$7L|XhXktU8U4YtRnZ_cVo{ED+&Rv2p0=t5; zj%}vRaoCQF{?|kV+c%Aqn?RGs-3o08(G2gEyplWa7{@W(*@U`s4wt_Dq>w_D|X3 z;<*Vm<0J=wUBQ0n3f%9ZX06qD^sx^AGcBnD{`tDb?GBDP&eF{?au~R@xI24S&)b)r zx3o55O@uEO&ga)q@%cM&(Lvl8l5P#!$YaOQ_ov@Wpgx!_p02e%ZFr^f)*e!(IIpaR zS9+*eSK`O3JvsT~;}s+lv&c~{468eOv~Tm6_Ax)_$b4uCqH}5qSP?z3TPl!uyImmt zOMGunZ{YAiaedidTp)-TlPWb4LK{Q88y7uBmF(QbJAAK?N`{+#f#HVA&xN!#>`LPB zVK_ zRLn=>MV_9Xq4m{ZNNE8`7>MhOh?PSAIDX&2Jj^~2z4lzzf8HfnA-bLKdjdJz*V36x zdgL@06@A>-Hc3joG6f|mhU1$Z{iVSN<@fz!N;T z`WD3uM2xcoqVqU!Uo!+#DQX)3u9NLN-joU##-JA|JvwMnfCqT^B5mA)zNWp2zq6(A z&?6q<^1OQJ$G;EGK=AI>;l(k`S3=5BHO_KXZ%3uLDuNKDK zZBi6V$Fkn6Q=ZyIn)PVyj}bd=4KCiJLoc_ifkiBO{MlH*CgoIL^H_d?wZV76s|CDM z8%p9Pk63SQAp0J?k{$P|%e>kKxo#{EV$1vFpN0KrVYL=pgCVZE&Uy(&+3C;rt>4Q6Smok*vgTVg z$y}N;>eK;j4viylOio)0(v@flVM)#;$#Rzk5%p~&GKl=_NK<|fudE?NtL|C51{W0V zcT8RfE;Le#c?q|Qje!x~Rtdqijv9Pd4WA-Sq}*`HsKEV!r2zjYyk|0LT9+;T3q#W0xp%7OaffeBjF*l>!p)V~bO)>P)&vT?rKfXCASs}lCOrvY{B z7`|n1w|wl-3j%{LlzZ#Z^%Xf2J@oI`@P4j5`U~YR!}IgsmB%vTBYql~rTeqk@D}N3 zE0v+h^55@IHj$xQxpt;#@^xKWoXhA;HT+xnOBff9uU>ky?9xBqqUSXJS+Rd?Ovf+* z8tJvpi*KG+sgL0PQS+Lt{OG{TX|&wjoAtMk0O~>KPHC6$i0SvnLc87Y;gHiUU%;kN z8X|A=&-c&Ld0OFdL}RN&kO<)OZtcEJtBY&VeZed%oa>&Iz<~pQKCMpJMdgyYI6<<{ zEbF#_#wgL+ynTTHTvY)0Z{<1|?G52pc$da=?ZY*o6!df*DA)QviSnuczSwK_Z93lu zk}iB5+s$hi@?ys&@)33XI+Thjl{!VZXGjq}i|{iFL7_NYpu| zRJ?6893rW-DTrIXT=lqanp<^ZKlBR#PRFHCAcFFRjPs{~JgHx}q#;b`j1cyCH_{hZ zRz!)fqO!HC&ze2p-4`51IBDR_AodjS8^c|4Y&bOKE+z3&$0F(`&eJqta4c<|9#lk7)aX6LRP^LYirs2mpCK*)%-mO z2iyt!lPf3Rf(=_%10Opg-c5?zD*P>`JT4q!O#hh{WOM)Q7F0U;#|TGZssGQME#DU| zXb?G&7`lc#fhn){qm{XLQ%m!hwgm%$j1+1K=f^O2ogN223M?1z=b8I)ZjhR zxP8)~TiouQ<+H4_?oHm(>I)_Ow_px!sUWPJQ+{Je|A)Xa!S^v@|74; zWPqmV29*q)p8nq9)4N_aNkf<$IR2UPsXo@?ce~vBw0{lGl4#j6Sr`7&tfSWYx)t~_ zed@5_p&giRj`J{QBXVd&P(;&xFw2V8_=#BxtXCHVwS}sGruENm{bPjxpFLXzp;>40 z%8r`DGyHM#>h&Jj0|$0f_k9GIX8_`*B7xR39|32;2wBVc45{F7h>qr)P~!O z^;v}>Eul45K?L@+_7SNBLS7q^=}np?x9(kJ#uL2LtKqUB91hr{$geQ>3V;fsF*FyF zA%MV)X-;`oh>-Q{Y)f93CJHX~9ai4k*(QLL28c|qQ*znWT4t-1I;^t&VI5%m*J(@U z`l7lvK?vhUOFB6U^T)idu*6Kf`08kmsJpP9ImAwd^{SeYs+}q#K}w9TZ#gy*0XmJ< zSXB{0QN&}xf&-LgP~9i?<}He{n4p&nDCKoi~_8?&c>!6Z_yk}rxgi5+D|1G1+ z^)k6QsA82)i2;R%VNt|*%-UGgP$e(m$_u0tf?6Vwa0zOeFeD*{q!y#pi`8uuRht5f zlwd_vhO#RTjSBfynP4m^Npb1jB=2&XN|Mer)XraF1Zf0WT1Sm9QW}qRP&dI;O^Qsl zEYmuMgeeeLD`Xv+D7DfP&-0uzU_*S2`OrvF0)nAOHkTfMBN6_Sp(Jn%Wrj!|Jym^K ze@G0X3;kBYFoGm36Gc$=d#L*rkaSsuQ9QtGRV&T$P3EqSgOwDnteTq8{vokWxCE+) zaa!8eN0~v1m7A<WQ z4D1ILB(elu0Scx&E2k1qJr4kkV2&_T)t;FUmcAV1kHMF?zWRqRXr~Hy?d2ae=wROM zswrG+tsmJ?`m8VJYo$V3p#!uc)Eap*SDG9*(VoqM6qmN2G@q0=d<9IfY%M5gdFX8l zV5HYvZeO8L)h+D&O2qdeY2HVr=*!v~!k7-}jcCOkMdfeqyR3TgawT?t;8UR|7r5Xv&v_WnoqEdZFBosTVwb``X_TEd(TY>o$=&q1T)k zmf2_c8q^p2SL=P=N~Lce?%^|I5ONJslKv4uyo)rXgQg~`Eq&?&je+DcB9Y4VtQB~r z1|ky`r<79EvAS z#dQ`qm1Qlek)V#w!|VeMeOLmU7;yX-a;W0x-aSE zL?iuS1G+7!a`(q?HDT`&tI@*pZ{?P|L%@$X4itn6gFU zAgm#Nrq#X1A_Nl)SpYK-xJlr_MRyjtBo(qiz3r4f?g9*6|JJLI1>&+if=DTiK`NT!_}uT+l{Mm^Ea&||@d}?n zF`E_Ztd8x316kgi*-)Su#Y7A8L^bq*YDG4cPM4+8Gh#@*^Y*}Sl1a+VG8=sW_*5L( z#a||Lg!|^_kO4Md;liq_I;}&;dl-P)M`4}<#^qVKUh6-Hyc;A$3Ge`yOlLK1kDWM| zAte%=2<;mg1m)t3kCd`pjWzW51!1MmUZh!UhQ=>wBrItV#svbG^H6y=USCTd?mM+l zH>wH%Hw@OdhN~)5@Zf~qsy<58Zm~zS4^YCa@NaKQHPoK@R|cHalY*|tR>4#_RSb+(N6}4Zk$7jD`(^9c{(ASJaP=Dg2ndcb z_%1kKh?mGo7c(R4Vo2OG$O6S*st(jy!ga+>r@ljQd|y?w;x2+;QKW8Bq(~B0(#&Mz z4_mbVI!ih5#te6u%ygp*C*R>0MTD6SzqCy()u{b_6KSHme>Rs3^>t7 zT5Ta~qy8iSc=+l;1o9!xYN=StQ19vP6T~}nqB<&S)Ic}x&2+lQe5b5H_#{f`F0wX{ zlO9L@D{f;bWaDqpIfAoPAiDL~HD7Vpn|p@P(`dF%NWgt2d&KGUaE-;gsQ0N3$1@lM zeLLH0P|CiB^O=0bj6m94O)QZZcHy=B-Hp&3uiN2L;WqsK$2lxk6YuJZzew+tc*7hR z6;240AD6yQ>~o1{w`QXmf~bd>uNP#2FS^5A@mB>Q5c`pux+v4jwajuN0_ps@n7|gv zI%F8^4y}*e*_QUE0^2*bX0xeFv3sO5;M@Y7XyQYAR2Yb!eZhkrVHnwYf7*0yfF6H% zogqMhjNo+wwA*9pjsB*h2Te_>H`(jV5H=N{{xy44X7%c^)e3F3QyLuHJaCYoxPobR zFoqQ7vT0tJ-&w1&CO_nxLod#M^)#H>A!YvbzOa8QK0jI%B;s>9{RD69{z%=ry&+=+ z2&9>#c)!1b5Gks1E5g7ws5TS4Wql`Zb^2++juvdb9(V*|aF^b`ZQrUHiaje~o&+hH z9p~4xu1s9Gwn;s}mxi54$XjUQq-VCpx&UVCfD3}4esaicohsjjs_A^7h!P|WNn>Ov zw>pUl6%O3HB_Kj|tc}8P>x`-YE^2>*gi6u&M}X>qcLY;j&lYTL^zm!UM#<+D@IdDS z)=p@b)&H^5RYGHTxt7}SZY(Tt=4^E>Dsv%pH%r5I5gvi79~-GlmRP;QkHGI#v}f zN&45ne*D*}|1I03sj0kH)G}Jr;R)<(AOdZM^2Xg$Lf>y1%s(6yzV=pC6gmJgn;r^5 zEX3!@TBmrOWD_rP3J$GGufJV4sq>>zo zr-vinEPr+=jDMvttjDdAGJIlpaG!fC&594bPaeC9BsHiiT>ra_L{+FF{s z*`f_JC_XC$%|-;bf2fgt8Rx=d8bE(ggc2yHj#7BNM~lE zl%OXUbmmjI7U~R!)+;_f%EvagAN1TA5fGzd%}LTyBgMj4r4xg}0u-Uw=jjjD|1pB& zD8ce87uHTSHxux?1Rw~H7hcX^q01H8w`eHl^z7?D}M{=UQi>-a2&>-7%Z(sB^ujAHL7 zg7Nho>a&yG*L;2(ewD7-)l}-_3rA*JS@UM>0tr>rmqX-~8}kprfE3i8y=p>Rg>#`yrl9K{6Wey;Av& z4}^W@YR4ZV&K9W{D4;KJb||j751{3M-{fjB&#vCQwku@JduBbPcx{qVzm7>vV=UkRQUaa$ zPqQ^M8{low1sNa)LlTHL8z;(@CpCIWt-xa>=zhI{gF4)E3PrE|eAV*ve=8~m4GzyL zdA?qp2)+cW#?LINzTWfy);RQc2GGBIVZieV=O6y9sCamJ@&5**)Q2%~u-%gpA;5`P zh)hUDXj_1kXCa-Wq5%#a)7HSjmw7j;Ar+c|r5%V2SE3nq>of&YwSukQD@kXCBoiAU z{excpO#l^jLgN{!F{?^cz&E{2`kaFk_@!0g7Dq1aQ$%*kb$ys7z|xD?>d%K=E0A~R zXNHZUmJ zK@A)56~m}447d34E7rq@aR30_1&NGH_pc}E)1%?hp8m}|cNkIqy22-u5|7uG(-}lu zqnLtMXU&F9do)AvS|Uh8CO?W9cyp%va*O~BZTBjy>@$R4#~>@;Ij{)Qhen$gObjD< zpYbT2h78yqC4elgce`S}6653pT^$AFuRGgJNQ9pY??z{EZ|rQ3$lP8_i)c75qqxU6 zXV}9z$2as`V@(%GDBg^xHzpuoTN!J721l?!Z|rQ3V1HguuB_)6N3%X}%ydVP8gJ&g z#%gGwQ~O(jQVrUwKST8N{?QIEO_T9fAD`NN-Vn|>G7t&fFJ!0^4fRJqS06jF9)-Qc zl?xddo!r(i3mgRo;cCr}xUtF3@KaQZ=US*M463|gJ|B$1OaKP#{iFYnSgX9Ld& z-OK}&tQ*^?9M75~-8Dc!`HLWKjME^cF#>|_a-jH+vc~i>#|3eQOUJw`lwr|YVfw%&Y2)NrEUH~q^ z*t#45JCs+$|d zfWF51zUGchK0&gRj5^EagbtP zyYk6noP!Y&<+&SbN{GLK{IN#z`mA0}Ku*2%H4WwsrmksF-;l^T0#`&-a7JNCCPSGl zWujCi3La8g(ymp~L*wahYT}0wd`MWi7-%kM<6X5Yt<_xWWRwGSX~gYt8tTM!9>9AGISLeaa6lnZ_pn7s#hz-FrVHa#->EaHbS(D6(FX?I zH$s9k{6ydTo}p$GNTi9gSXW&>`h{^$ePqh*65A&~y*oYOgU>&|G-b_BX7;79g5Eya zz}oNsir~#=*3S1KHeL9ks^_Ok@44Liib&u5!ve*pSH>6IoHxU(;q3O$LleHZYwtQ~ zYT_jJufH5yDy_a@DU^PL`p(mj>l@cpkvq-d+2cei3XzL2*9rY@gj)*micmkS zVE+NZS*hR<4(qX3l?hrX-tFD?F;bbRR^!!XP<|*DS!^N zZ>W8ZyVQem>Tu}|nEXax7U0KO40WZ4vhw`kJtRbc=OJ3tnwc88(l7R_wf zpCO@nr$~$cpy)?;B5Ks;KS||#OJdVokFGzk?T210wEdgUW;#V?kupj>aM24Bose_R(B~+fi1x!{FZ1?UP6$_DO6sF(hlH7~Anx-vZ;6StB4a%VTo%7PnDa zU9fYmZ007*Gg}lE&@WcE$m_ug{oU+Lmlp{svPW)2CTVu;Y?S5DgRYCCY!HPGYsfTQ zPJd)4{ZAq}Z1zs!%>%hx3$~-sjb9&h*qBh>wOd$wnhbtXI<{F!mz|%1w*1Bw8ta`+ z^aH}jztKPVZd~dVWDInIv!!^@fQ9StWFeIm$aL6h$U|(~=X!4F)OfRrV8Vs_X|>7A zYV-b^FQc<==UdF3DwQvc`&!T|Uzqn3cJog+LzjYqh;P)VaIQfnJiKvB0x=l~Yfrxj*PG zm)yQ*ffvk?Q}FbJl(_NR&o*1N@U&OAbPIdMawvb_CJFcMUcW<@R68hB4< z`FjmmA!IwhI%NM(s&rF|k8%cE9<$1oTxN#+ViR|)fuyVMjemro_kQHqF*Bal zmUX1tENC8xcaB|=6QM8z4h*w=#RtoFQsIc2b9CQ45M-g*8ri_fxHd&!VA~3Vbzh0< zXuNScbdnEEnk<{m?iP4jU4*^FbR$(9x*-`Vx5Y&|hex8B*i;4J+2i4O>3i z>lwuZPNi-pHi#8VZ@$DFZuXDxQ>*iS0fV-v?doev(|E6HQ3_|mjCYUwsO0OQS!tb` z!2yF6J+yrEiekZQN`wk()#N|rr7t=k;Kf6*BcgG+-P27psi#_mG5088_0V5te@xA7 zHjmFxbuh?Dr%2n!cZN!PHtOIQh(G`N>4BX(+IlD~8F0eTyzi`KLHH`b{CBX?v+{gg z6_u~J)k$9>7$PLyQ^iB6cq|1WOMR~y3__C3m8EmfDk9G;SMCh$xKnwwNE5*fw(t^A zM!R?df)v3sQ}^6dH1S|8)#Nzf(Hp};^P&bdUPlx3pmRf1(+ ze#uSmUPUbHsL5nrbc>tA?L2=?QK1%PGCdixD*l3vhvdCE00l<-Qv;ETO2S<1A;zpV z(ef+79rH7N3oht9$8EB(sW2u!vu4K6|4FUoF@%e>K47G4T0!#~(;-C9;PGM6G9pic z7fP5yrI3M?djK5m7tXEa6`JXMPUc($12h%v1}`Y{yC2mRhysW4Ds<-7^z}kJH{^wq zxgr6(jZXU(Ai4R1ma7=#V#AN^Ph;}WC%tuHBQZq{^H5(e zGD$pj6&C9F_G_>AIPM)Ih29Z+J8nXP|7NC61iY z@7$itVo=h95c1-X^l3}6Xw&YN-<4P)JEzmmU5M=1bL6h53+^UF zsp$Ue?^Orpo;RR&a7tX0>_-`&X@eY!3c9T8*3q0|9=|>76Swhqeiw2&QFgB1@2_Ut z(_#Z{5!Ti`KgugjbFB5E$cIFcz%WYOzm_G$_gh3}G|d(i2wOUdr{#b4&aX;L$~N1)3B9C}Tj22hom38|t1cu9!nz8}?OHdB z6SsfT5UOENv}nDw*Gm(NPR6+b3^%{H2s+?r^6`Dc!_Vjd2vQaR#gdBccysgs8dipb zR?~o)HSw}V9B=&OVZL1#-mm~*qQ96?vbzm}c1+gd{e&L_g8{k-;A&_C09ChsUknXs z7`*F~js6S*(IH-=ee?fHSpSJNI$K;EtgJpWwUyBDKD~X%p!gFvO?LT%+LAuAC6qR} zw}6sc=H(-v6|{JtYoi%<5uW06%4rtz-w3z7GItrd)$h1HdofA)?$rSQ;ml9rhupx5bM%ofOTqQO;P=MxVSa#>&~^`IjgL}kLyhina*oC^y`1@FLxwW z&HEBj^HwHvoFbaJ@k!*FCT>PNlXXLg?zRVGNizEyt#;G$T1gtvG7dnQEhwbNlj?)% zLWVv&(E4yd&GGo7g4n2q%Em7xWP;4CHg0WiSV!aDgG-Kpm1*#{MaYr6BnM#*gn{4IMGcLO=Pnc0F^nRjF$ zIA_;%@}}}79eF5n|7xUj>LYq@!JgHRw!3aYWuEA84*oETptig{PPO}6S}`#tUbsCk z{|j^21mRWefIADH5Xz7+S?0XrhBm=8SC6!|)@sH6K@0hTi8UzVnQUPXUM#!|W=4pv zji8Hsku^;wmez<_G$0dzo`ZJjnE=4PmC1vAPyevfA05iwDQ&7al!5yErxhPo&z%#; zt5$~8O1qfsZfSi{|Izg5wyL?061o@#XrWpv@Z9&-X3Fu$r!%X%V#LTCi_USb7lT_X z_L1u2G9z-oJhUE7uCwcz=7hzrUpeu&zY;>#^PI3*K818!t18R!!ouE=!Lo{-2{6Tz z+8|O@{~{kh&4ie->>1D=0)xq~VIRl=`KcT}oFX-fw_3i!kc|yFS&?fJ#SS6=y8c^) zt+f4S)_KoevGU;G9UfdzdZthJ^^C)?Gp?{(r=FQrf8jhXwi_pz>YDR~=f>PB9>1;Y zr^VGgeyi){J(3kZ8)8q9s?M6pG1rv?JpQ)i@1)*!QHSik{99wQ1y8w$WMP-u?_6lk zf>KZ5W|Ji{+C*S`(dyY64%+|^_v7Ix`ZeL%uYJ<~ct_CUeN<0bY6;bHyO|*GcQZm| z!hAD9S_y0W!77wLM+5JL6oQt`0h4^DSy+ zLu4%9A&ybDu71Y>8ZIJl+wlXm4>LMSS-D?WatTp31)I?PQr3NFQKe;(%B?Y@fo982 z)3I*UdAwi--Yw7aJyE+zG+AO7GZC5cK{N0!kJPn{BxCgI*(yyTiK!i|AANp23H zg+UHq`z0=Pl31n zI+OB=#u!GRVQ7%2NTc)Vk#0;7y%hC5x|~=1$yVRfJRbkYjLXhbLed6M(Frq_4ptG* zZ(LBja0|M+F7|i9p5Gpr*_Dj1!+#A&jGI6mU%k{59op}{+Bq!GCn14Um3aLYx2QV* z5~q{+sM#MID^Grq{!UsfTT`z9t_GJ$=?DTAAVG~}T_t@yrYyq?a_m9t=-DF(*shr- zP9**hj>Qy|^1uKllX?C9D;(QRUzQ1xb`@WBh2;<~oq2aBkH0zK-!kN_ie9O;Ellw#(&5{JlOb8}cvYVwiGzb4lMmGwRhP=&k>+qL;ESCq8RMuEOJS5|9Ts_A z$6>xn%pf-N9>J^#^9t-f%MOV@I)6QZ!0%L%zL+Sl$FARy@dYAJY(|bGcq=VpQ2v=P zvpLm|AMw4ZKGz=%jEm>H|9LhvFNo%FTMdv)<{t-+Tg;sm=tjRGpsY|vg7xg|bvOv6 zTn$1nH&H9a@Y(zj%&mM!FZ7a<_B``Io!74U*8IHXp|0Aw z{+_2vPuBZ&k4tIz#_K~?Yi8CvvhLERC|+1c$mCKCaSlpyXjRn~{vPUhB1yS;fO3`K z6={D6X7fkQgbirBWv}iCgj2dV+XDjNOF&=lZR~{ZmSpZiE1-ltP-WH5I8D3Dos>#f zR#xVM*AT}XA`GMvQ0X0LSVfft<>T`xI?b;XQ(T$b;)LYZFjQg-O4Tvxyu>ZkIa~yx z>wDUPNKdl38&)9}3pdj1;L?+rA08+Y)}&)wm>t&aGu)F`4ipokvNPyNX}IPG?sO_i z$2W={xnhX+Os$@c>Z{6?sQ@jg61J8vxyI-j&sb0IPl1EfZr4IY7?ixLuasU;AwNM| z-Wh*?i#8ae%A7&k?Gsk3*x{%geE4=_T-4d2Lf=>*$|Munu)9q>b+0~cCzb;4bu~44 z8o)n##@5O?91x6J=b_DSF$LY>G*wrTr#Sg&I8~H=d5F9RlQ)@8j)1{h7PKS`jh}Rs zvSNs7>}!gFOc1~(2iMU#v*|n<@@m=y--y-RwMh>wT@~}SK@eUvdT6GzU(-?X*dIDX z_*V=J`VA-%7#y8zjFo?kF8o1fYtF@X9kcl=QwJ2n`aPov%-4Tv3Ck2o`~ScN_-F48 zrDWmvl1uIaaYqgB(M2~FsX#`j9h|t4OW);N5b^bh6YUzcM-C#wd;sP_6{FcyHs^~p zk@$TM^AN;@WYIBbC<2!{NVOU0Ds6>l4bPn>O*o+E`dk$~P-yh)kcLE=NIi=?taSyU z;kjg+0$ho+PQudEq8zMIS}IqU!~#c|k!{n}c9CYA{H?zFO51z)1@G9_Ly4%F+H-tBr?(-w;d$VEj% zH`sV&L?BQuHq>uF!v}r4@{fmJ>$;N=>}WxCc<|C}?3Q+poS>dr!b)6R*1m2&1!Do_ zw$h$L9d5Cp7!h4M9yZg&XOQlLk>EN)PZ40=ODB?+I`vkk%XfDsx~e-b*erEp_a`;A zlqK3sObcD-UZ6Tf!UCiQ!)tOVjlmh=3~dGrD1}jhhu(9UY@xfb^Cl&pgA&q`hQQ$`}zhO603F&u$@9fXMS4$S63o=*5Mzh zjnM%gu-`fE;bD*czNNA(;EH_+4Hpu`)?4?-UFwUI!NAL86Lk+bj4+-l!mrck0(er<`ckXdX-|hdux7OM^ z=)J9b&Pv_Z-NEHyWlElKr)@!DoZOB4LoyNb7h;AD@*2iWon))Qv?N9W+Ws` zQ%Ob13{eqD2~ZIDy}?6Tv{~)(_5zaui&Y;*~n4=QYf*g07Of``j)1p(d30jP|NiM{o~Q| z0@KHL2yBNQqdr?uz~D-yX{6Q*{a?I7(vlwoEfNV>F>#YvMli(8S2D(pKg z_mj>k_^>Gd{UClhJudxyLt2}yxg_Si6(nKqy7Ias>823-ov#$R!f?-{C_q#Y0C|@Q zO;a=L^Q@q<02C;|?`5yvFxDUKKC<1=EBy_+eXbXG%Xq+&c<_2IN`%C^I3@gyC9Txf z4MDd9IjA;Jf!@J*Q9C6-X_x&Agu@*Oy=QO`(BJYvoKDXpS#tgH=IP;MYq~mu#k`&i z9~UlYE|7Y#LORHh)zH>lFA=V2WX15Dopz^-vJM>PUvDDkb8annEfW1I!;u^Y;s(oo zNt=B)QBTB%Xn}xNim4(VgCK#GYKgrx43J1C(!reJj{c0WzABuO>=5(ha&)N&=u7^& zHw7--+E2!EoO*U^Ee zofL!}$Ru{WjijY6AjcweQ6Y6 z9p9cAhOu$#j6e@1|7gTu+xj9NZmIDm4iY*^37e#IJ+N={D=XDa$kOI;TOLNVk2HGR z-$celz|H|-`%`UU*eJ;D)rc56wD0HHFAd_ zM$&5oGEL|eC5xNh5nI zq}?|C2Ib+m+e6m*mJ=7X%sal(3;S*i3ZsXxm#-%jClqFP;2qUxtb7#2)QPWlC@MdMN9W^3AhjH?wr8vB>L}ng)A&0{wh_|(B~gKFlI4*6SR3_;UDB7! z0}z7?NLOzjOe_CEJ`Bk)3b`mTiZAXCwru-xI5xgpo^Lg0>B0JK3`Yl#ZR`)-ee4EB z*;bHEtSv?KyFF_u!R%$3emwv4d6XjT;O&sEY8z!VIUFEh*0;~K{N=8nv?NE))Za?p^A;06b z#)MQivMKq~zO2LQMT{F*l4p8X+?%3^k}dfQYLmK_cvqu&$SWpt!mmIZr_H~5AyTUyr!%lhyJ) zQ5bOew_-j>IcF>$|JtlUK38ncB$m2+jI{^cESfF>9HMk1~CR=KTDlCLAC>W%;r z;&KDL)elw-grc_w8E{HvU$4cE{*K2y`6wv9OWc@DHL^N@SK>ch$fzg#Y$cK2BIG~@LoViW#UXX;F2shB&E7AWM`12_`*d!6~#56Kif`Y0TCE753eu5?f$`g-iN~K z`I@roFM^ZK#+>du5r0E!<$vG1euc0564!M*5QEhVu0k2twyD=W7{ptW%qTb}*ibY^ zQe1+3AH81Xc>-f-T|%^la=l2T{q3Aztso|MgTDQI$ClW0shXtejXsIn6OCf^DvJ8L z{0V9CX$2>%HOZvCInXce6RlsCWCse-Tl#}x3vp&Wy`w=_)Y28(-4QLv*pKZYG!r-V zhOLz$%jpc2Po_yO$G9H8S=iy}qvT@dIK|`(4~B-nVB)jseWq$jOhk z%Agp<&9sGgN?A8~Lgm0xxG^UK=_Ug=VW5^rgDUj-M&xY8Ady!B>*|}i9u8&XGw>{9 z+kzr^sF6~-aVHFFWN`|b^i{B7crO+y8O;CT%KXj@{iB8Mj3Y zQw)*Rh`TBd4&&Z80{*NMcAe4zu8iu9T+MKHkl*v!=i``TAOHBFl|znsHo}Q|kdcQN z#P8rOg@-7{gsmyTR1tv|OACim_)(#@$wR$FONKl_m}6V;WTdJde0a(a((?B*GYncf zgmK+cTmO$zW6=6UNnfy7$vv(r;O%?tpbWmZlrF393tszY)ex4WLSfQ728hDFaz#l0 zNFlq;2qF{{$)W^A+|_U?rP`AxV7_TIn9w!!xk3i90;pU`rh_JT*k3;1avZaS)l)JUnYO4$*}i^{Ngnb{`@9H%8u(E`>Fb) zJ103lR4LqvHdDcxNPWX_BfwqoLcFh|%qH6ryPlA3HMPH{a#NANN#@ub$1fz67BJMI z;X9GrjSpHJ=~TB#gQ!OiS7%=)=ZP-;H-==_8Hbtt?FatVxYN_BuAfA)Nl6EI{t8&CBr=pKsy@;bPM*}>APNaeD=1BV z-Gp|Y&SelR1(p69w($?!(U#ferl6XbroB&4dpfDGX`0nE6j?_?KKo*E)(OMxTN5ur zBXlIjv%hr!Y|T2^f2mK^!9u@&D?yjCq_Z-Z{iXiz-On`Gyr9&Y{R4fLgMX%X+Qrov zVfDb@q*G!4+}p39g-Mhi9v)%bJVUYfx-yH=vn4IfGQ3g%cN%jvOJ7^P!cDMj6r^+7 zB3oB4^e>yFB8^cHV9|N((PF*^ik|$2ZNN^1-$W?i3%p@ZliFmXmzITe?DU7}77$Aj z!P^8Htb|ssj_fS_ATT{uLD)3<$gU*goIR-74J1PJ?QlzaVkI#}^7%G~GREAB1-BZ6 ze2uSM7$#gI^7(_L=wa=T~$ldo}}J4Srz^PsK;MH$I^Ad z9p;dP0}n5o%)gp{x6rVe($yCy=5<#fsyLVrenRYDB*L#{vBQeht(z+p40J!L&rhnRrz#&Da zdTh@7yZq+mU4fC9eS6DA3M2?R>58TLHmJ=cY?0%IyUfrb@_D)T#tS( zHBloo?N-Smzj^rvt4`g~@*-z|=^w;*jYdYBeVPzo0#Hi>lmts;)CM%)P61G;N{I}K z$_s~Wv02gn2hn42JIU79R~pHTXXFC-I)3jVqUAUGVrRVdhL567ZDREa*SY^2**AKf z6Dz%O=Xl^pLp1Se;CPCu@R>`{&*$3*c}V4Owd%5)`rB7kP<5fI#g&|(1vh=`$}B(W zIs!nD_LzXh<;V6{FH7C<^;JJ`mkJ`8QT~JAKX|{5d(`E-BHhmu!bv1cX@2RaxeDv=^zQqb_J|Kt>Hi)>YlMC6&=%k`CAixoXePEAyVUiw`1;G$`$EaBowKgAp~ zPyR=*x+(~u+YQR1={DC!i+zVkbph6Txuz}BV;-<;5*JG|Dz;eVd8R&VCF54ZDeGN` zT|}d>W?uKsocez9&9cwlU3JY>m{#}ZaJ`s=Ln(x`&y%C>{%}UPuG~DPDS8tzpf(R# zien}nHW_4xixTN2awuzv?^VuR`)ZF~N89b{b9OAjjg4pttgR?#C>Z;uMTq2`i8=Rm904LY|PCYw;Pl+Kokq zNvRl{gY){n;}e}eNGcaRQSH9=4_@q%blyt17d6*ozz7sp4UGCW^<{e)LXWkj1HKX( z+0)a;XxxOuTt2W{0~9lChdMH0RJ+KnunngXtY5sW%pkPVST6{t81P0t{;}TkRwl3v zCy1SnRJV5QwuviUo=zgMG8v6D4O0Bnu=FyLuKxT*)5P|1H{7?po~DPZ zESim#%=$Cy0;3e){>%<2G%Fm_C+AlcDg{<1_AqoyR~X6D$#TPBnzCDeZr82W)3GAX zvVaQe^mT~=Hrg|ua66|lW<8=~WTTAA4XqrO+a(pE7P`M;lTJrB@kF3GWPyPP%}T$$ zJ*761n7(>`WuxHm-H?la3KT@aBe;u+$diiZ%99T%W8vjgCku%f=%pBk!FD97?QRnr=x`Tqh{s~$ylQ2z((k7#>1)LTOL$9Uy~gZ% z6g6A~>`LRM!f*7*0(4`xSS}F^_cmnp)caz&oG;??LPS0NLqhD)VXZ~%77+?(6(s8$6AF~wZ8RSv z3zHJ1oE6ywUq+|hXo7}hgj6^RgzJWVmbYiu`8W+;DOZ(K%;3kQs#R6xo!8s1n8Ok> zhzyX)Ak<|nYo9>T&>YzL16N>9CPCF9V|Ds^ZEm#IrptDBYvS}%!<&dKEhc{&k7xV? zO$&QBMC1Co9^RO(<~YPI1!aX%PZ2M5HQLhT`rQ6Y2wqhgW{q?6-hZ@1Qs$ckm8YlH zxD@5O+Nb+9irzvPMWv3WFe(*XSnGhk>cRyt;&Ebfh$%P;u37&>*waHV#@5gg*V^tU z3?>+SuvP#8p{5f-l`5>;g&iu9+91L;GZltl(g0q6XgGWycC02UaJy!P0`#dAbS0V1dUv+c;;k}5>Z(Z#|3vvYm9C-H z39P|QP5D;zN|V)<6#I;5>aWq&hnVc4gtGL93ml;`CwUSQWjxswdaSC(F-u>kS;AG| zFi_>cYyHvApB|B1!jSCl;on8!P-!K=eJ(!MQxH1YE$o!BS#G*O>Dg0f0Y;gM(&Zxf zVD&swYEGJfd6~oNSjEft3h>?{&Gpz35#XyA*6f**#jWG;H;(p3W@@R504#T`1Ra8? zRF0f&*=EtP1dURx{m|wT<-cPizjenb2-$Ew;@-p~Bg)22ZS9qe!FE1h^wpqMm6Kl}Z&IG^BNC7^*1 zItHI zTf%1AK{v6|mN~UwG3|p^9Aw^Hw&v}n`Rf*4=XFw$qpcggFG({Z>kQ*TOZHAA909#- zyz>z0zqJvz8Sk}z-o-AgY{<~`A~;l8V>jwLr;z1bM8wnU!T5s-=VPg_lLruDbhOT1 z+=ZUBiRW_0Fk)AQiOWmX;{qVygV>iOF zTR$Qb5%#`k^>W0E49y_|Gf9ja!U7CF8OMLpBy!UGx>0|fX+4m&pQka+?V#$>)NZbM zv@^+etdoH~XP{;nzR!HaJ#O`VnoUm)-xq_?+l0=$=tyOZQY_*7E%E_H06pr6bf0kpa;7@dI;% zK!RGKtJC!&dz7x`0$5|UNL2olEEBG+j~%YW2ZyuvT76pez?GIN!IFqc2dFM!4w6GR zKNEI+V^DYmKP;Jih2y}%RSyZBxQ*Rbyq-f-;|yN3pmdvMbTkqoTZU}CI!_tkfoVpM zS;679Sl%PUH_=u+#8!7Dr@-Ez2Vlwxr|`Vp7>i*?9F4!04ZU|^x6nb6-5+0L`KzoH zwbvf`cJDyR9g%GzYWE`xM<_sU+N%4Hbi-MJ=Os6s#xF zWO1f~U$desPQi89<^-21Q|tX=Slo_I6Nlqct|=EHP=BV9g*Xi=e|?W{yZ9#x4I}Ah z^AZ&!+zt1_VuER9qRej9Dw>k*%{?pp1tS!5EetXxCQfP6wL-FQwF(!#kZX6ZQ_7iXds+<~L@ zG%JRT6f2g?>J!M!jpT+;J?n^nhU}lBKLGy;fOJg|oCHIseDEMU{{4H9^=aUj-%!KN z#LOjAR>Nd4R>~{2F$0>yXnZQ`GFqk>Lf|r=cg!`b81-{8sSxuBDUpmOjh+Ia!gxdh zSEd^m*KNCgk z^+`H=3H@av(d=*iMJ_5`@$F?kRk!Ww>0+D8{QiGGfd9SwNps80VIV0Gv;>QqW0XV1 z)>XwwenHqmFVe^*k7BX!DJx7kiIA|5s+f@DO)vWq)VgD z-fa8bJBE_$_OCMx zZh6r#B3&}_lrcI-fCrDR}1_2$ZV zjWQ#trH9F-Ni%!{6X+k}JF2yIXw-cc8% z49quA$DcjZzkFIiPR*s!?83CfXBqh7Gp52%FCoQ==#cfqfcQMqoDW$i&!;Nd2cf1} z%^lPS19a!`<%x)kC(!b}*rcAy?-5D;K|B1vV`nUCXJ>PKe$=-6+wlvgin)oxb0%Z= z+@)?<_3Zo*?eG@Nd%T{PfX%C0{f9tz*g_G8Fx^^ZeA9%kw<-N;JYjSLmk08rIH1%P*kFc6^owOfbj&rF+yc8LJrD`sV9XbLhA?$yGT z-A~VBpHEemzJpH4x3J|SQ9h7G=g*<#teRt;cbJBz5BuK?!3+A3sQpW=aa;Fd%sgq= zT6l;o#lXHt3mb1z9anRWJ3j;hDn-4fv>i2Yvc-?u8ROr=UR%a=0|g%_K|oZRv34f_ z*cTeWXDmBlv{{m@mF!yshVRzr-OP`Sc%+Yeyd7OP`k?YN@8i6-QC<%(7LuTTaPhN` zk8BD_r&zgEzMl}G$FnOAzSD;+wOIY7AkudA`!xDJulC*?di|NRS7V2Tw(baCoFn()SzfSs-&XmGh}BhYUVBpXwHGG78=NXL`|w5$0Aol}`S1sVSsj`0Ray zz;wJKJ=N!C2DvI7_aNZXiKVPiGH2Nuqg0IhW?Si40lmJBNNZBryCceF_~eYl>YA|L z1tsO5yOLUIU<{R|v39nHj!p66g~)&O%#c>?ZYeI~n86xq5BNrUmyVnPDz<%h$(oVk zw{Z%Wn*t=V#6K;nO4-w0eoXvC(FK@xT7HD1P%dUrt#`$KB}6y1(deSg!*^qku1E&j{r#m~Y{- z*pq@Ry|BgNq5kR>jFk*(C|^{~zM4*69mtNhR%Y3tj|+^%0_-aOh5LbQrzguy zA)CsUXXqb~cPiloIV$G*sR!tJ%1AQjmI@t#L`!AfRwh2@3Y2yUtZ}<=)RQ01Q^?uXxDoVjJ3pLDPK)huux7G@Ey!CA}E!!Rs^lmtFA|hxkZd(tHvB`{SL}6t zkw04c(gH%LN(`pOzrF%t7~%wGnHb#x?11LPeVOP2Mh)l+>0pt*C0SAD-f9b`i~1}5 zuk@x=(OgK}2x?CwQvM&=Cw}DYDj~+@l@G#a#w?HT3<}5L#>AlIiCy(-htxCGk0#nr zFM=l$x0i{?fb)8GPLJm7o=*F`!llj#9blrYHu;v@^Hdg8+QkDhV2 z{$F|-Gal}5bTBgh=A=seQn~O%pJ&xG1JyvYcS_cNsUmKC#R1J?W+E}gU1;aD=GQzg zo&7~L`72LnTH>r_vsuT@nGp>&?1)#TO^p6Vxl-j)H_*$N_&;tS{fK#;O)z8MXr@`b z)^nfns@z6je*?_K_<{NAB^9F?Ymr$;0QJ)}EdMp{7Ob)vy3OmykD2jJq@LFrmjdB? UU6}hX@Ne@**Kdly+VkW816YlH7XSbN literal 0 HcmV?d00001 From 88955737a595b9bf578f6497e1fe8761c1e4d6b1 Mon Sep 17 00:00:00 2001 From: Emanuels Zaurins Date: Mon, 11 Aug 2025 15:26:25 +0200 Subject: [PATCH 2/5] Red stage, all tests are created but not passed --- src/main/domain-model.md | 46 ++-- src/main/java/com/booleanuk/core/Bagel.java | 51 +++++ src/main/java/com/booleanuk/core/Basket.java | 73 ++++++ src/main/java/com/booleanuk/core/Coffe.java | 51 +++++ .../java/com/booleanuk/core/Customer.java | 27 +++ src/main/java/com/booleanuk/core/Filling.java | 52 +++++ src/main/java/com/booleanuk/core/Item.java | 14 ++ src/main/java/com/booleanuk/core/Main.java | 7 + src/main/java/com/booleanuk/core/Manager.java | 26 +++ src/main/java/com/booleanuk/core/Member.java | 31 +++ .../java/com/booleanuk/core/testCore.java | 209 ++++++++++++++++++ 11 files changed, 564 insertions(+), 23 deletions(-) create mode 100644 src/main/java/com/booleanuk/core/Bagel.java create mode 100644 src/main/java/com/booleanuk/core/Basket.java create mode 100644 src/main/java/com/booleanuk/core/Coffe.java create mode 100644 src/main/java/com/booleanuk/core/Customer.java create mode 100644 src/main/java/com/booleanuk/core/Filling.java create mode 100644 src/main/java/com/booleanuk/core/Item.java create mode 100644 src/main/java/com/booleanuk/core/Main.java create mode 100644 src/main/java/com/booleanuk/core/Manager.java create mode 100644 src/main/java/com/booleanuk/core/Member.java create mode 100644 src/test/java/com/booleanuk/core/testCore.java diff --git a/src/main/domain-model.md b/src/main/domain-model.md index bf5f6b389..b923c7b48 100644 --- a/src/main/domain-model.md +++ b/src/main/domain-model.md @@ -59,26 +59,26 @@ So we don't get any weird requests, I want customers to only be able to order things that we stock in our inventory. ``` -| Classes | Variables | Method | Scenario | Output | -|-----------|-----------------------|------------------------------------------------------|---------------------------|--------------------------------------------| -| Member | Member.basket | boolean addBagel(Item type) | If type is valid | true | -| | | | If type is not valid | false | -| | | | if cap is reached | false | -| | | | inventory is empty | false | -| -------- | ------------------- - | ---------------------------------------------------- | ------------------------ | --------------------------------------- | -| Member | Member.basket | boolean removeFromBasket(string bagelName) | if bagel exists | true | -| | | | if bagel does not exist | false | -| | | | if basket is empty | false | -| -------- | --------------------- | ---------------------------------------------------- | ------------------------ | --------------------------------------- | -| Basket | Basket.maxCapacity | boolean member.setCapacity(int cap) | if basketcap is negative | false | -| | Basket.items | | if Basketcap is 0-100 | true | -| | | | if bascetcap is >100 | false | -| -------- | -------------------- | --------------------------------------------------- | ------------------------ | ----------------------------------------- | -| Customer | Customer.totalcost | Float getTotalcost() | It the basket is empty | 0 | -| | | | if it has items | price of basket | -| --------- | ------------------- | --------------------------------------------------- | ------------------------- | ----------------------------------------- | -| Customer | Item.price | Float getPrice() | if price for item found | price of item | -| --------- | --------------------- | ------------------------------------------------- | ----------------------- | ------------------------------------------ | -| | | | | | -| Manager | Manager.currentStock | String setCurrentStock(String type, boolean state) | if type is valid | "The stock is set updated" | -| | | *This goes into the add bagel, it follows the stock* | if type is incorrect | "The type is written wrong" | \ No newline at end of file +| Classes | Variables | Method | Scenario | Output | +|-----------|-----------------------|-----------------------------------------------------|---------------------------|-------------------------------------------| +| Member | Member.basket | boolean addBagel(Item type) | If type is valid | true | +| Item | | | If type is not valid | false | +| Basket | | | if cap is reached | false | +| Bagel | | | inventory is empty | false | +| -------- | ------------------- - | ------------------------------------------------ | ------------------------ | --------------------------------------- | +| Member | Member.basket | boolean removeFromBasket(string bagelName) | if bagel exists | true | +| | | | if bagel does not exist | false | +| | | | if basket is empty | false | +| -------- | --------------------- | ------------------------------------------------- | ------------------------ | --------------------------------------- | +| Basket | Basket.maxCapacity | boolean member.setCapacity(int cap) | if basketcap is negative | false | +| | Basket.items | | if Basketcap is 0-100 | true | +| | | | if bascetcap is >100 | false | +| -------- | -------------------- | --------------------------------------------------- | ------------------------ | ----------------------------------------- | +| Customer | Customer.totalcost | Float getTotalcost() | It the basket is empty | 0.00 | +| | | | if it has items | price of basket | +| --------- | ------------------- | --------------------------------------------------- | ------------------------- | ----------------------------------------- | +| Customer | Item.price | Float getPrice(Item item) | if price for item found | price of item | +| --------- | --------------------- | ------------------------------------------------- | ----------------------- | ---------------------------------------- | +| | | | | | +| Basket | Basket.currentStock | boolean setCurrentStock(item item, Integer amount) | if item is valid | true | +| | | | if item does not exist | false | \ No newline at end of file diff --git a/src/main/java/com/booleanuk/core/Bagel.java b/src/main/java/com/booleanuk/core/Bagel.java new file mode 100644 index 000000000..940369581 --- /dev/null +++ b/src/main/java/com/booleanuk/core/Bagel.java @@ -0,0 +1,51 @@ +package com.booleanuk.core; + +public class Bagel implements Item{ + private Float price; + private String name; + private String type; + private String SKU; + + public Bagel(Float price, String name, String type, String SKU) { + this.price = price; + this.name = name; + this.type = type; + this.SKU = SKU; + } + + @Override + public Float getPrice() { + return price; + } + + public void setPrice(Float price) { + this.price = price; + } + + @Override + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + @Override + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + @Override + public String getSKU() { + return SKU; + } + + public void setSKU(String SKU) { + this.SKU = SKU; + } +} diff --git a/src/main/java/com/booleanuk/core/Basket.java b/src/main/java/com/booleanuk/core/Basket.java new file mode 100644 index 000000000..ca03c15a1 --- /dev/null +++ b/src/main/java/com/booleanuk/core/Basket.java @@ -0,0 +1,73 @@ +package com.booleanuk.core; + +import java.lang.reflect.Array; +import java.util.ArrayList; +import java.util.List; +import java.util.HashMap; + +public class Basket { + /// SHould this be List or ArrayList + private ArrayList items; + private HashMap currentStock; //Should I use hashMap instead here maybe? + private Integer maxCapacity; + + public Basket(Integer maxCapacity, ArrayList items, HashMap currentStock) { + this.maxCapacity = maxCapacity; + this.items = items; + this.currentStock = currentStock; + } +//should I use arraylist here or List<> + public ArrayList getItems() { + return items; + } + + public void setItems(ArrayList items) { + this.items = items; + } + + //This is added for first test: + public void addItems( Item item){ + if (checkStock(item) && getSize() < maxCapacity) { + items.add(item); + + } + } + + public Boolean checkStock(Item item) { + //check the key item, and check if it has any integers left. + if (currentStock.containsKey(item)){ + Integer stock = currentStock.get(item); + System.out.println("the current stock: " + stock); + if (stock > 0) { + currentStock.put(item, stock-1); + return true; + + } + + } + return false; + } + + public Integer getSize() { + return items.size(); + } + + public Integer getMaxCapacity() { + return maxCapacity; + } + + public boolean setMaxCapacity(Integer maxCapacity) { + this.maxCapacity = maxCapacity; + return true; + } + + public HashMap getCurrentStock() { + return currentStock; + } + + public boolean setCurrentStock(HashMap currentStock) { + this.currentStock = currentStock; + return false; + } + +} diff --git a/src/main/java/com/booleanuk/core/Coffe.java b/src/main/java/com/booleanuk/core/Coffe.java new file mode 100644 index 000000000..2a65cbe64 --- /dev/null +++ b/src/main/java/com/booleanuk/core/Coffe.java @@ -0,0 +1,51 @@ +package com.booleanuk.core; + +public class Coffe implements Item { + private Float price; + private String name; + private String type; + private String SKU; + + public Coffe(Float price, String name, String type, String SKU) { + this.price = price; + this.name = name; + this.type = type; + this.SKU = SKU; + } + + + public Float getPrice() { + return price; + } + + public void setPrice(Float price) { + this.price = price; + } + + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + + public String getSKU() { + return SKU; + } + + public void setSKU(String SKU) { + this.SKU = SKU; + } +} diff --git a/src/main/java/com/booleanuk/core/Customer.java b/src/main/java/com/booleanuk/core/Customer.java new file mode 100644 index 000000000..c475d67ef --- /dev/null +++ b/src/main/java/com/booleanuk/core/Customer.java @@ -0,0 +1,27 @@ +package com.booleanuk.core; + +public class Customer extends Member{ + private Float totalCost; + + public Customer(Float totalCost, Basket basket) { + super(basket); + this.totalCost = totalCost; + } + + public Float getTotalCost(){ + return 0.00f; + } + + public Float setTotalCost() { + + return 0.00f; + } + public Float getPrice(Item item){ + return 0.00f; + } + + public Float getItemCost(Item item){ + return 0.00f; + } + +} diff --git a/src/main/java/com/booleanuk/core/Filling.java b/src/main/java/com/booleanuk/core/Filling.java new file mode 100644 index 000000000..247446ef9 --- /dev/null +++ b/src/main/java/com/booleanuk/core/Filling.java @@ -0,0 +1,52 @@ +package com.booleanuk.core; + +public class Filling implements Item { + + private Float price; + private String name; + private String type; + private String SKU; + + public Filling(Float price, String name, String type, String SKU) { + this.price = price; + this.name = name; + this.type = type; + this.SKU = SKU; + } + + + public Float getPrice() { + return price; + } + + public void setPrice(Float price) { + this.price = price; + } + + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + + public String getSKU() { + return SKU; + } + + public void setSKU(String SKU) { + this.SKU = SKU; + } +} diff --git a/src/main/java/com/booleanuk/core/Item.java b/src/main/java/com/booleanuk/core/Item.java new file mode 100644 index 000000000..dfe45c339 --- /dev/null +++ b/src/main/java/com/booleanuk/core/Item.java @@ -0,0 +1,14 @@ +package com.booleanuk.core; + +public interface Item { + //all getters and setters to all variables. + public Float getPrice(); + public void setPrice(Float price); + public String getName(); + public void setName(String name); + public void setType(String type); + public String getType(); + public String getSKU(); + public void setSKU(String SKU); + +} diff --git a/src/main/java/com/booleanuk/core/Main.java b/src/main/java/com/booleanuk/core/Main.java new file mode 100644 index 000000000..e9f326f0b --- /dev/null +++ b/src/main/java/com/booleanuk/core/Main.java @@ -0,0 +1,7 @@ +package com.booleanuk.core; + +public class Main { + public static void main(String[] args) { + + } +} diff --git a/src/main/java/com/booleanuk/core/Manager.java b/src/main/java/com/booleanuk/core/Manager.java new file mode 100644 index 000000000..bde39b288 --- /dev/null +++ b/src/main/java/com/booleanuk/core/Manager.java @@ -0,0 +1,26 @@ +package com.booleanuk.core; + +import java.util.Map; + +public class Manager { + private String ID; + + public Manager(String ID) { + this.ID = ID; + } + + public static boolean setCurrentStock(Item item, Integer quantity){ + return true; + } + + + public String getID() { + return ID; + } + + public void setID(String ID) { + this.ID = ID; + } + + +} diff --git a/src/main/java/com/booleanuk/core/Member.java b/src/main/java/com/booleanuk/core/Member.java new file mode 100644 index 000000000..c0ae5148d --- /dev/null +++ b/src/main/java/com/booleanuk/core/Member.java @@ -0,0 +1,31 @@ +package com.booleanuk.core; + +public class Member { + private Basket basket; + + public Member(Basket basket) { + this.basket = basket; + } +// this is the start +// public boolean addToBasket(Item item){ +// +// return true; +// } + public boolean addToBasket(Item item){ + int size = basket.getSize(); + basket.addItems(item); + System.out.println("size before add " + size); + + System.out.println("actual size " + basket.getItems().size()); + + return !(size + 1 == basket.getSize()); + } + + public boolean removeFromBasket(Item item){ + return true; + } + public boolean setMaxCapacity(Integer maxCapacity) { + return basket.setMaxCapacity(maxCapacity); + } + +} diff --git a/src/test/java/com/booleanuk/core/testCore.java b/src/test/java/com/booleanuk/core/testCore.java new file mode 100644 index 000000000..4ede44676 --- /dev/null +++ b/src/test/java/com/booleanuk/core/testCore.java @@ -0,0 +1,209 @@ +package com.booleanuk.core; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +class testCore { + @Test + public void addBagelandCurrentStockTest() { + Item bagel = new Bagel(0.49f,"Bagel", "Plain","BGLP"); + ArrayList list = new ArrayList<>(); + HashMap currentStock = new HashMap<>(); + currentStock.put(bagel, 2); + Basket basket = new Basket(4, list, currentStock ); + Member member = new Member(basket); + + + Assertions.assertEquals(true, member.addToBasket(bagel)); + + Assertions.assertEquals(true, member.addToBasket(bagel)); + //scenario inventory is empty + Assertions.assertEquals(false, member.addToBasket(bagel)); + + + //recreate in order to test capacity + currentStock = new HashMap<>(); + currentStock.put(bagel, 2); + list = new ArrayList<>(); + basket = new Basket(1, list, currentStock ); + member = new Member(basket); + + //add a test where the inventory is empty. + Assertions.assertEquals(true, member.addToBasket(bagel)); + Assertions.assertEquals(false, member.addToBasket(bagel)); + + + //How do I test something which would return a error? + + //member.addToBasket(bagel); + //System.out.println( + + } + @Test + public void removeBagelTest(){ + + //Set everything up + Item bagel1 = new Bagel(0.49f,"Bagel", "Plain","BGLP"); + Item bagel2 = new Bagel(0.49f,"Bagel", "Onion","BGLO"); + + + ArrayList list = new ArrayList<>(); + HashMap currentStock = new HashMap<>(); + currentStock.put(bagel1, 2); + currentStock.put(bagel2, 2); + + Basket basket = new Basket(4, list, currentStock ); + Member member = new Member(basket); + + //the tests + + //basket is empty + Assertions.assertEquals(false, member.removeFromBasket(bagel1)); + Assertions.assertEquals(false, member.removeFromBasket(bagel2)); + + + member.addToBasket(bagel1); + member.addToBasket(bagel1); + + member.addToBasket(bagel2); + + Assertions.assertEquals(true, member.removeFromBasket(bagel2)); + Assertions.assertEquals(true, member.removeFromBasket(bagel1)); + + //does not exist + Assertions.assertEquals(false, member.addToBasket(bagel2)); + + //remove the last: + Assertions.assertEquals(true, member.removeFromBasket(bagel1)); + + } + @Test + public void setCapacityTest(){ + //Set everything up + Item bagel1 = new Bagel(0.49f,"Bagel", "Plain","BGLP"); + Item bagel2 = new Bagel(0.49f,"Bagel", "Onion","BGLO"); + + + ArrayList list = new ArrayList<>(); + HashMap currentStock = new HashMap<>(); + currentStock.put(bagel1, 2); + currentStock.put(bagel2, 2); + + Basket basket = new Basket(4, list, currentStock ); + Member member = new Member(basket); + + //set the capacity; + //QUESTION! is it better to have member.setcapacity than member.basket.setcapacity? + Assertions.assertEquals(true, member.setMaxCapacity(10)); + Assertions.assertEquals(true, member.setMaxCapacity(50)); + Assertions.assertEquals(true, member.setMaxCapacity(80)); + Assertions.assertEquals(false, member.setMaxCapacity(-10)); + Assertions.assertEquals(false, member.setMaxCapacity(120)); + + } + @Test + public void getTotalCostTets(){ + Item bagel1 = new Bagel(0.49f,"Bagel", "Plain","BGLP"); + Item bagel2 = new Bagel(0.49f,"Bagel", "Onion","BGLO"); + + + ArrayList list = new ArrayList<>(); + HashMap currentStock = new HashMap<>(); + currentStock.put(bagel1, 2); + currentStock.put(bagel2, 2); + + Basket basket = new Basket(4, list, currentStock ); + //how does extend work here? + Customer customer = new Customer(0.00f,basket); + + Assertions.assertEquals(0.00f, customer.setTotalCost()); + + customer.addToBasket(bagel1); + + Assertions.assertEquals(0.49f, customer.setTotalCost()); + + customer.addToBasket(bagel1); + Assertions.assertEquals(0.49f*2, customer.setTotalCost()); + + + customer.addToBasket(bagel1); + Assertions.assertEquals(0.49f*3, customer.setTotalCost()); + + + + } + @Test + public void getPriceTest(){ + Item bagel1 = new Bagel(0.49f,"Bagel", "Plain","BGLP"); + Item bagel2 = new Bagel(0.49f,"Bagel", "Onion","BGLO"); + Item filling1 = new Filling(0.12f,"Filling", "Egg","FILE"); + Item coffe1 = new Coffe(0.99f,"Coffee", "Black","COFB"); + Item coffe2 = new Coffe(1.19f,"Coffee", "White","COFW"); + Item coffe3 = new Coffe(1.29f,"Coffee", "Latte","COFL"); + + + + ArrayList list = new ArrayList<>(); + HashMap currentStock = new HashMap<>(); +// currentStock.put(bagel1, 2); +// currentStock.put(bagel2, 2); +// +// currentStock.put(filling1, 10); + + Basket basket = new Basket(4, list, currentStock ); + //how does extend work here? + Customer customer = new Customer(0.00f,basket); + + + Assertions.assertEquals(0.12f, customer.getPrice(filling1)); + + Assertions.assertEquals(0.49f, customer.getPrice(bagel1)); + + Assertions.assertEquals(0.49f, customer.getPrice(bagel2)); + + Assertions.assertEquals(0.99f, customer.getPrice(coffe1)); + + Assertions.assertEquals(1.19f, customer.getPrice(coffe2)); + + Assertions.assertEquals(1.29f, customer.getPrice(coffe3)); + + + } + @Test + public void setCurrentStock(){ + Item bagel1 = new Bagel(0.49f,"Bagel", "Plain","BGLP"); + Item bagel2 = new Bagel(0.49f,"Bagel", "Onion","BGLO"); + Item filling1 = new Filling(0.12f,"Filling", "Egg","FILE"); + Item coffe1 = new Coffe(0.99f,"Coffee", "Black","COFB"); + Item coffe2 = new Coffe(1.19f,"Coffee", "White","COFW"); + Item coffe3 = new Coffe(1.29f,"Coffee", "Latte","COFL"); + + + + ArrayList list = new ArrayList<>(); + HashMap currentStock = new HashMap<>(); + currentStock.put(bagel1, 2); + currentStock.put(bagel2, 2); +// + currentStock.put(filling1, 10); + currentStock.put(coffe2,20); + + Basket basket = new Basket(4, list, currentStock ); + //how does extend work here? + Customer customer = new Customer(0.00f,basket); + + //item exists + Assertions.assertEquals(true, Manager.setCurrentStock(coffe2,25)); + //item does not exist + Assertions.assertEquals(false, Manager.setCurrentStock(coffe3,20)); + + } + + +} + + From 0a60865059c54251c4f02223b4e2b8d9449bcf30 Mon Sep 17 00:00:00 2001 From: Emanuels Zaurins Date: Tue, 12 Aug 2025 12:51:22 +0200 Subject: [PATCH 3/5] Green stage everything --- src/main/domain-model.md | 1 - src/main/java/com/booleanuk/core/Basket.java | 49 ++++++++++++------ .../java/com/booleanuk/core/Customer.java | 10 ++-- src/main/java/com/booleanuk/core/Manager.java | 15 +++++- src/main/java/com/booleanuk/core/Member.java | 16 +++--- src/main/updatedclassmodel.png | Bin 0 -> 68823 bytes .../java/com/booleanuk/core/testCore.java | 20 +++---- 7 files changed, 69 insertions(+), 42 deletions(-) create mode 100644 src/main/updatedclassmodel.png diff --git a/src/main/domain-model.md b/src/main/domain-model.md index b923c7b48..371063d66 100644 --- a/src/main/domain-model.md +++ b/src/main/domain-model.md @@ -62,7 +62,6 @@ I want customers to only be able to order things that we stock in our inventory. | Classes | Variables | Method | Scenario | Output | |-----------|-----------------------|-----------------------------------------------------|---------------------------|-------------------------------------------| | Member | Member.basket | boolean addBagel(Item type) | If type is valid | true | -| Item | | | If type is not valid | false | | Basket | | | if cap is reached | false | | Bagel | | | inventory is empty | false | | -------- | ------------------- - | ------------------------------------------------ | ------------------------ | --------------------------------------- | diff --git a/src/main/java/com/booleanuk/core/Basket.java b/src/main/java/com/booleanuk/core/Basket.java index ca03c15a1..c2294f4b3 100644 --- a/src/main/java/com/booleanuk/core/Basket.java +++ b/src/main/java/com/booleanuk/core/Basket.java @@ -8,13 +8,11 @@ public class Basket { /// SHould this be List or ArrayList private ArrayList items; - private HashMap currentStock; //Should I use hashMap instead here maybe? - private Integer maxCapacity; public Basket(Integer maxCapacity, ArrayList items, HashMap currentStock) { - this.maxCapacity = maxCapacity; + Manager.maxCapacity = maxCapacity; this.items = items; - this.currentStock = currentStock; + Manager.currentStock = currentStock; } //should I use arraylist here or List<> public ArrayList getItems() { @@ -26,20 +24,21 @@ public void setItems(ArrayList items) { } //This is added for first test: - public void addItems( Item item){ - if (checkStock(item) && getSize() < maxCapacity) { + public boolean addItems( Item item){ + if (checkStock(item) && getSize() < Manager.maxCapacity) { items.add(item); - + return true; } + return false; } public Boolean checkStock(Item item) { //check the key item, and check if it has any integers left. - if (currentStock.containsKey(item)){ - Integer stock = currentStock.get(item); + if (Manager.currentStock.containsKey(item)){ + Integer stock = Manager.currentStock.get(item); System.out.println("the current stock: " + stock); if (stock > 0) { - currentStock.put(item, stock-1); + Manager.currentStock.put(item, stock-1); return true; } @@ -47,27 +46,47 @@ public Boolean checkStock(Item item) { } return false; } + public boolean removeItem(Item item){ + if (items.contains(item)) { + items.remove(item); + return true; + } + return false; + } + public Integer getSize() { return items.size(); } public Integer getMaxCapacity() { - return maxCapacity; + return Manager.maxCapacity; } public boolean setMaxCapacity(Integer maxCapacity) { - this.maxCapacity = maxCapacity; - return true; + if (maxCapacity >0 && maxCapacity <= 100){ + Manager.maxCapacity = maxCapacity; + return true; + } + return false; } public HashMap getCurrentStock() { - return currentStock; + return Manager.currentStock; } public boolean setCurrentStock(HashMap currentStock) { - this.currentStock = currentStock; + Manager.currentStock = currentStock; return false; } + public Float getTotalCost(){ + Float sum = 0.00f; + for (Item item : items){ + sum += item.getPrice(); + } + return sum; + } + + } diff --git a/src/main/java/com/booleanuk/core/Customer.java b/src/main/java/com/booleanuk/core/Customer.java index c475d67ef..8289c11ca 100644 --- a/src/main/java/com/booleanuk/core/Customer.java +++ b/src/main/java/com/booleanuk/core/Customer.java @@ -8,16 +8,14 @@ public Customer(Float totalCost, Basket basket) { this.totalCost = totalCost; } - public Float getTotalCost(){ - return 0.00f; - } - public Float setTotalCost() { + public Float getTotalCost() { - return 0.00f; + return basket.getTotalCost(); } public Float getPrice(Item item){ - return 0.00f; + + return item.getPrice(); } public Float getItemCost(Item item){ diff --git a/src/main/java/com/booleanuk/core/Manager.java b/src/main/java/com/booleanuk/core/Manager.java index bde39b288..2c28e770a 100644 --- a/src/main/java/com/booleanuk/core/Manager.java +++ b/src/main/java/com/booleanuk/core/Manager.java @@ -1,16 +1,27 @@ package com.booleanuk.core; +import java.util.HashMap; import java.util.Map; public class Manager { private String ID; + public static HashMap currentStock; //Should I use hashMap instead here maybe? + public static Integer maxCapacity; + + + public Manager(String ID, HashMap currentStock) { - public Manager(String ID) { this.ID = ID; + Manager.currentStock = currentStock; } public static boolean setCurrentStock(Item item, Integer quantity){ - return true; + + if (item!=null){ + Manager.currentStock.put(item, quantity); + return true; + } + return false; } diff --git a/src/main/java/com/booleanuk/core/Member.java b/src/main/java/com/booleanuk/core/Member.java index c0ae5148d..6b106cc4e 100644 --- a/src/main/java/com/booleanuk/core/Member.java +++ b/src/main/java/com/booleanuk/core/Member.java @@ -1,7 +1,7 @@ package com.booleanuk.core; public class Member { - private Basket basket; + protected Basket basket; public Member(Basket basket) { this.basket = basket; @@ -12,17 +12,15 @@ public Member(Basket basket) { // return true; // } public boolean addToBasket(Item item){ - int size = basket.getSize(); - basket.addItems(item); - System.out.println("size before add " + size); - - System.out.println("actual size " + basket.getItems().size()); - - return !(size + 1 == basket.getSize()); + //int size = basket.getSize(); + return basket.addItems(item); + //System.out.println("size before add " + size); + //System.out.println("actual size " + basket.getItems().size()); + //return (size + 1 == basket.getSize()); } public boolean removeFromBasket(Item item){ - return true; + return basket.removeItem(item); } public boolean setMaxCapacity(Integer maxCapacity) { return basket.setMaxCapacity(maxCapacity); diff --git a/src/main/updatedclassmodel.png b/src/main/updatedclassmodel.png new file mode 100644 index 0000000000000000000000000000000000000000..6c314a1d2bb5b610b7b44f5b318d3863672291cd GIT binary patch literal 68823 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 currentStock.put(bagel, 2); list = new ArrayList<>(); @@ -75,7 +75,7 @@ public void removeBagelTest(){ Assertions.assertEquals(true, member.removeFromBasket(bagel1)); //does not exist - Assertions.assertEquals(false, member.addToBasket(bagel2)); + Assertions.assertEquals(false, member.removeFromBasket(bagel2)); //remove the last: Assertions.assertEquals(true, member.removeFromBasket(bagel1)); @@ -113,25 +113,25 @@ public void getTotalCostTets(){ ArrayList list = new ArrayList<>(); HashMap currentStock = new HashMap<>(); - currentStock.put(bagel1, 2); - currentStock.put(bagel2, 2); + currentStock.put(bagel1, 4); + currentStock.put(bagel2, 4); Basket basket = new Basket(4, list, currentStock ); //how does extend work here? Customer customer = new Customer(0.00f,basket); - Assertions.assertEquals(0.00f, customer.setTotalCost()); + Assertions.assertEquals(0.00f, customer.getTotalCost()); customer.addToBasket(bagel1); - Assertions.assertEquals(0.49f, customer.setTotalCost()); + Assertions.assertEquals(0.49f, customer.getTotalCost()); customer.addToBasket(bagel1); - Assertions.assertEquals(0.49f*2, customer.setTotalCost()); + Assertions.assertEquals(0.49f*2, customer.getTotalCost()); customer.addToBasket(bagel1); - Assertions.assertEquals(0.49f*3, customer.setTotalCost()); + Assertions.assertEquals(0.49f*3, customer.getTotalCost()); @@ -198,8 +198,10 @@ public void setCurrentStock(){ //item exists Assertions.assertEquals(true, Manager.setCurrentStock(coffe2,25)); + Assertions.assertEquals(true, Manager.setCurrentStock(coffe3,20)); + //item does not exist - Assertions.assertEquals(false, Manager.setCurrentStock(coffe3,20)); + Assertions.assertEquals(false, Manager.setCurrentStock(null,20)); } From e8562e9f59a8acc17d73de1d7a1120916863572c Mon Sep 17 00:00:00 2001 From: Emanuels Zaurins Date: Tue, 12 Aug 2025 13:19:53 +0200 Subject: [PATCH 4/5] Now it is refactored --- src/main/java/com/booleanuk/core/Bagel.java | 30 ------------- src/main/java/com/booleanuk/core/Basket.java | 33 +-------------- src/main/java/com/booleanuk/core/Coffe.java | 30 ------------- .../java/com/booleanuk/core/Customer.java | 9 +--- src/main/java/com/booleanuk/core/Filling.java | 29 ------------- src/main/java/com/booleanuk/core/Item.java | 7 ---- src/main/java/com/booleanuk/core/Manager.java | 21 +++++----- src/main/java/com/booleanuk/core/Member.java | 13 +----- .../java/com/booleanuk/core/testCore.java | 42 +++++++++++-------- 9 files changed, 37 insertions(+), 177 deletions(-) diff --git a/src/main/java/com/booleanuk/core/Bagel.java b/src/main/java/com/booleanuk/core/Bagel.java index 940369581..32a626375 100644 --- a/src/main/java/com/booleanuk/core/Bagel.java +++ b/src/main/java/com/booleanuk/core/Bagel.java @@ -18,34 +18,4 @@ public Float getPrice() { return price; } - public void setPrice(Float price) { - this.price = price; - } - - @Override - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - @Override - public String getType() { - return type; - } - - public void setType(String type) { - this.type = type; - } - - @Override - public String getSKU() { - return SKU; - } - - public void setSKU(String SKU) { - this.SKU = SKU; - } } diff --git a/src/main/java/com/booleanuk/core/Basket.java b/src/main/java/com/booleanuk/core/Basket.java index c2294f4b3..adf9633a9 100644 --- a/src/main/java/com/booleanuk/core/Basket.java +++ b/src/main/java/com/booleanuk/core/Basket.java @@ -1,27 +1,16 @@ package com.booleanuk.core; -import java.lang.reflect.Array; import java.util.ArrayList; -import java.util.List; import java.util.HashMap; public class Basket { /// SHould this be List or ArrayList private ArrayList items; - public Basket(Integer maxCapacity, ArrayList items, HashMap currentStock) { - Manager.maxCapacity = maxCapacity; + public Basket(ArrayList items) { this.items = items; - Manager.currentStock = currentStock; - } -//should I use arraylist here or List<> - public ArrayList getItems() { - return items; } - public void setItems(ArrayList items) { - this.items = items; - } //This is added for first test: public boolean addItems( Item item){ @@ -59,26 +48,6 @@ public Integer getSize() { return items.size(); } - public Integer getMaxCapacity() { - return Manager.maxCapacity; - } - - public boolean setMaxCapacity(Integer maxCapacity) { - if (maxCapacity >0 && maxCapacity <= 100){ - Manager.maxCapacity = maxCapacity; - return true; - } - return false; - } - - public HashMap getCurrentStock() { - return Manager.currentStock; - } - - public boolean setCurrentStock(HashMap currentStock) { - Manager.currentStock = currentStock; - return false; - } public Float getTotalCost(){ Float sum = 0.00f; diff --git a/src/main/java/com/booleanuk/core/Coffe.java b/src/main/java/com/booleanuk/core/Coffe.java index 2a65cbe64..1c5475778 100644 --- a/src/main/java/com/booleanuk/core/Coffe.java +++ b/src/main/java/com/booleanuk/core/Coffe.java @@ -18,34 +18,4 @@ public Float getPrice() { return price; } - public void setPrice(Float price) { - this.price = price; - } - - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - - public String getType() { - return type; - } - - public void setType(String type) { - this.type = type; - } - - - public String getSKU() { - return SKU; - } - - public void setSKU(String SKU) { - this.SKU = SKU; - } } diff --git a/src/main/java/com/booleanuk/core/Customer.java b/src/main/java/com/booleanuk/core/Customer.java index 8289c11ca..4262b8886 100644 --- a/src/main/java/com/booleanuk/core/Customer.java +++ b/src/main/java/com/booleanuk/core/Customer.java @@ -1,16 +1,12 @@ package com.booleanuk.core; public class Customer extends Member{ - private Float totalCost; - public Customer(Float totalCost, Basket basket) { + public Customer(Basket basket) { super(basket); - this.totalCost = totalCost; } - public Float getTotalCost() { - return basket.getTotalCost(); } public Float getPrice(Item item){ @@ -18,8 +14,5 @@ public Float getPrice(Item item){ return item.getPrice(); } - public Float getItemCost(Item item){ - return 0.00f; - } } diff --git a/src/main/java/com/booleanuk/core/Filling.java b/src/main/java/com/booleanuk/core/Filling.java index 247446ef9..7edc93e70 100644 --- a/src/main/java/com/booleanuk/core/Filling.java +++ b/src/main/java/com/booleanuk/core/Filling.java @@ -19,34 +19,5 @@ public Float getPrice() { return price; } - public void setPrice(Float price) { - this.price = price; - } - - - public String getName() { - return name; - } - public void setName(String name) { - this.name = name; - } - - - public String getType() { - return type; - } - - public void setType(String type) { - this.type = type; - } - - - public String getSKU() { - return SKU; - } - - public void setSKU(String SKU) { - this.SKU = SKU; - } } diff --git a/src/main/java/com/booleanuk/core/Item.java b/src/main/java/com/booleanuk/core/Item.java index dfe45c339..4cfa62ead 100644 --- a/src/main/java/com/booleanuk/core/Item.java +++ b/src/main/java/com/booleanuk/core/Item.java @@ -3,12 +3,5 @@ public interface Item { //all getters and setters to all variables. public Float getPrice(); - public void setPrice(Float price); - public String getName(); - public void setName(String name); - public void setType(String type); - public String getType(); - public String getSKU(); - public void setSKU(String SKU); } diff --git a/src/main/java/com/booleanuk/core/Manager.java b/src/main/java/com/booleanuk/core/Manager.java index 2c28e770a..70c088e53 100644 --- a/src/main/java/com/booleanuk/core/Manager.java +++ b/src/main/java/com/booleanuk/core/Manager.java @@ -4,19 +4,25 @@ import java.util.Map; public class Manager { - private String ID; public static HashMap currentStock; //Should I use hashMap instead here maybe? public static Integer maxCapacity; - public Manager(String ID, HashMap currentStock) { + public Manager(HashMap currentStock, Integer maxCapacity) { - this.ID = ID; Manager.currentStock = currentStock; + Manager.maxCapacity = maxCapacity; } - public static boolean setCurrentStock(Item item, Integer quantity){ + public boolean setMaxCapacity(Integer maxCapacity) { + if (maxCapacity >0 && maxCapacity <= 100){ + Manager.maxCapacity = maxCapacity; + return true; + } + return false; + } + public static boolean setCurrentStock(Item item, Integer quantity){ if (item!=null){ Manager.currentStock.put(item, quantity); return true; @@ -25,13 +31,6 @@ public static boolean setCurrentStock(Item item, Integer quantity){ } - public String getID() { - return ID; - } - - public void setID(String ID) { - this.ID = ID; - } } diff --git a/src/main/java/com/booleanuk/core/Member.java b/src/main/java/com/booleanuk/core/Member.java index 6b106cc4e..e12e48f3f 100644 --- a/src/main/java/com/booleanuk/core/Member.java +++ b/src/main/java/com/booleanuk/core/Member.java @@ -6,24 +6,13 @@ public class Member { public Member(Basket basket) { this.basket = basket; } -// this is the start -// public boolean addToBasket(Item item){ -// -// return true; -// } + public boolean addToBasket(Item item){ - //int size = basket.getSize(); return basket.addItems(item); - //System.out.println("size before add " + size); - //System.out.println("actual size " + basket.getItems().size()); - //return (size + 1 == basket.getSize()); } public boolean removeFromBasket(Item item){ return basket.removeItem(item); } - public boolean setMaxCapacity(Integer maxCapacity) { - return basket.setMaxCapacity(maxCapacity); - } } diff --git a/src/test/java/com/booleanuk/core/testCore.java b/src/test/java/com/booleanuk/core/testCore.java index d5d563a02..6f07dcaa1 100644 --- a/src/test/java/com/booleanuk/core/testCore.java +++ b/src/test/java/com/booleanuk/core/testCore.java @@ -5,7 +5,6 @@ import java.util.ArrayList; import java.util.HashMap; -import java.util.List; class testCore { @Test @@ -14,7 +13,8 @@ public void addBagelandCurrentStockTest() { ArrayList list = new ArrayList<>(); HashMap currentStock = new HashMap<>(); currentStock.put(bagel, 2); - Basket basket = new Basket(4, list, currentStock ); + Basket basket = new Basket(list); + Manager manager = new Manager(currentStock, 4); Member member = new Member(basket); @@ -26,14 +26,16 @@ public void addBagelandCurrentStockTest() { //recreate to test capacity - currentStock = new HashMap<>(); - currentStock.put(bagel, 2); + Manager.currentStock.put(bagel, 9); list = new ArrayList<>(); - basket = new Basket(1, list, currentStock ); + basket = new Basket(list); member = new Member(basket); //add a test where the inventory is empty. Assertions.assertEquals(true, member.addToBasket(bagel)); + Assertions.assertEquals(true, member.addToBasket(bagel)); + Assertions.assertEquals(true, member.addToBasket(bagel)); + Assertions.assertEquals(true, member.addToBasket(bagel)); Assertions.assertEquals(false, member.addToBasket(bagel)); @@ -55,8 +57,9 @@ public void removeBagelTest(){ HashMap currentStock = new HashMap<>(); currentStock.put(bagel1, 2); currentStock.put(bagel2, 2); + Manager manager = new Manager(currentStock, 4); - Basket basket = new Basket(4, list, currentStock ); + Basket basket = new Basket(list); Member member = new Member(basket); //the tests @@ -92,17 +95,18 @@ public void setCapacityTest(){ HashMap currentStock = new HashMap<>(); currentStock.put(bagel1, 2); currentStock.put(bagel2, 2); + Manager manager = new Manager(currentStock, 4); - Basket basket = new Basket(4, list, currentStock ); + Basket basket = new Basket(list); Member member = new Member(basket); //set the capacity; //QUESTION! is it better to have member.setcapacity than member.basket.setcapacity? - Assertions.assertEquals(true, member.setMaxCapacity(10)); - Assertions.assertEquals(true, member.setMaxCapacity(50)); - Assertions.assertEquals(true, member.setMaxCapacity(80)); - Assertions.assertEquals(false, member.setMaxCapacity(-10)); - Assertions.assertEquals(false, member.setMaxCapacity(120)); + Assertions.assertEquals(true, manager.setMaxCapacity(10)); + Assertions.assertEquals(true, manager.setMaxCapacity(50)); + Assertions.assertEquals(true, manager.setMaxCapacity(80)); + Assertions.assertEquals(false, manager.setMaxCapacity(-10)); + Assertions.assertEquals(false, manager.setMaxCapacity(120)); } @Test @@ -115,10 +119,11 @@ public void getTotalCostTets(){ HashMap currentStock = new HashMap<>(); currentStock.put(bagel1, 4); currentStock.put(bagel2, 4); + Manager manager = new Manager(currentStock, 4); - Basket basket = new Basket(4, list, currentStock ); + Basket basket = new Basket(list); //how does extend work here? - Customer customer = new Customer(0.00f,basket); + Customer customer = new Customer(basket); Assertions.assertEquals(0.00f, customer.getTotalCost()); @@ -154,9 +159,9 @@ public void getPriceTest(){ // // currentStock.put(filling1, 10); - Basket basket = new Basket(4, list, currentStock ); + Basket basket = new Basket(list); //how does extend work here? - Customer customer = new Customer(0.00f,basket); + Customer customer = new Customer(basket); Assertions.assertEquals(0.12f, customer.getPrice(filling1)); @@ -191,10 +196,11 @@ public void setCurrentStock(){ // currentStock.put(filling1, 10); currentStock.put(coffe2,20); + Manager manager = new Manager(currentStock, 4); - Basket basket = new Basket(4, list, currentStock ); + Basket basket = new Basket(list); //how does extend work here? - Customer customer = new Customer(0.00f,basket); + Customer customer = new Customer(basket); //item exists Assertions.assertEquals(true, Manager.setCurrentStock(coffe2,25)); From 4252584f8df5c340f7274d2528bb11602ab298dc Mon Sep 17 00:00:00 2001 From: Emanuels Zaurins Date: Tue, 12 Aug 2025 14:07:26 +0200 Subject: [PATCH 5/5] red stage extension 1 --- src/main/domain-model.md | 58 ++++++---- .../java/com/booleanuk/core/testCore.java | 108 +++++++++++++++++- 2 files changed, 143 insertions(+), 23 deletions(-) diff --git a/src/main/domain-model.md b/src/main/domain-model.md index 371063d66..600621844 100644 --- a/src/main/domain-model.md +++ b/src/main/domain-model.md @@ -59,25 +59,39 @@ So we don't get any weird requests, I want customers to only be able to order things that we stock in our inventory. ``` -| Classes | Variables | Method | Scenario | Output | -|-----------|-----------------------|-----------------------------------------------------|---------------------------|-------------------------------------------| -| Member | Member.basket | boolean addBagel(Item type) | If type is valid | true | -| Basket | | | if cap is reached | false | -| Bagel | | | inventory is empty | false | -| -------- | ------------------- - | ------------------------------------------------ | ------------------------ | --------------------------------------- | -| Member | Member.basket | boolean removeFromBasket(string bagelName) | if bagel exists | true | -| | | | if bagel does not exist | false | -| | | | if basket is empty | false | -| -------- | --------------------- | ------------------------------------------------- | ------------------------ | --------------------------------------- | -| Basket | Basket.maxCapacity | boolean member.setCapacity(int cap) | if basketcap is negative | false | -| | Basket.items | | if Basketcap is 0-100 | true | -| | | | if bascetcap is >100 | false | -| -------- | -------------------- | --------------------------------------------------- | ------------------------ | ----------------------------------------- | -| Customer | Customer.totalcost | Float getTotalcost() | It the basket is empty | 0.00 | -| | | | if it has items | price of basket | -| --------- | ------------------- | --------------------------------------------------- | ------------------------- | ----------------------------------------- | -| Customer | Item.price | Float getPrice(Item item) | if price for item found | price of item | -| --------- | --------------------- | ------------------------------------------------- | ----------------------- | ---------------------------------------- | -| | | | | | -| Basket | Basket.currentStock | boolean setCurrentStock(item item, Integer amount) | if item is valid | true | -| | | | if item does not exist | false | \ No newline at end of file +| Classes | Variables | Method | Scenario | Output | +|-----------|-----------------------|-----------------------------------------------------|-------------------------------------|--------------------------------------------| +| Member | Member.basket | boolean addBagel(Item type) | If type is valid | true | +| Basket | | | if cap is reached | false | +| Bagel | | | inventory is empty | false | +| -------- | ------------------- - | ------------------------------------------------ | ------------------------ | --------------------------------------- | +| Member | Member.basket | boolean removeFromBasket(string bagelName) | if bagel exists | true | +| | | | if bagel does not exist | false | +| | | | if basket is empty | false | +| -------- | --------------------- | ------------------------------------------------- | ------------------------ | --------------------------------------- | +| Basket | Basket.maxCapacity | boolean member.setCapacity(int cap) | if basketcap is negative | false | +| | Basket.items | | if Basketcap is 0-100 | true | +| | | | if bascetcap is >100 | false | +| -------- | -------------------- | --------------------------------------------------- | ------------------------ | ----------------------------------------- | +| Customer | Customer.totalcost | Float getTotalcost() | It the basket is empty | 0.00 | +| | | | if it has items | price of basket | +| | | | if item does not exist | false | +| | | | | | +| | Customer.addDiscount | Float addDiscount() | if basket does qualify for discount | return Float as the amount the discount is | +| | | | if basket does not have discount | return 0.00f | +| | | | | | +| | | | | | +| --------- | ------------------- | --------------------------------------------------- | ------------------------- | ----------------------------------------- | +| Customer | Item.price | Float getPrice(Item item) | if price for item found | price of item | +| --------- | --------------------- | ------------------------------------------------- | ----------------------- | ---------------------------------------- | +| | | | | | +| Basket | Basket.currentStock | boolean setCurrentStock(item item, Integer amount) | if item is valid | true | +| | | | if item does not exist | false | +| | | | if item does not exist | false | +| | | | if item does not exist | false | +| | | | if item does not exist | false | +| | | | if item does not exist | false | +| | | | if item does not exist | false | +| | | | if item does not exist | false | +| | | | if item does not exist | false | +| | | | if item does not exist | false | diff --git a/src/test/java/com/booleanuk/core/testCore.java b/src/test/java/com/booleanuk/core/testCore.java index 6f07dcaa1..675220741 100644 --- a/src/test/java/com/booleanuk/core/testCore.java +++ b/src/test/java/com/booleanuk/core/testCore.java @@ -128,7 +128,6 @@ public void getTotalCostTets(){ Assertions.assertEquals(0.00f, customer.getTotalCost()); customer.addToBasket(bagel1); - Assertions.assertEquals(0.49f, customer.getTotalCost()); customer.addToBasket(bagel1); @@ -140,6 +139,113 @@ public void getTotalCostTets(){ + } + @Test + public void checkDiscountTest(){ + Item bagel1 = new Bagel(0.49f,"Bagel", "Plain","BGLP"); + Item filling1 = new Filling(0.12f,"Filling", "Egg","FILE"); + Item coffe1 = new Coffe(0.99f,"Coffee", "Black","COFB"); + ArrayList list = new ArrayList<>(); + HashMap currentStock = new HashMap<>(); + + currentStock.put(bagel1, 80); + currentStock.put(filling1, 80); + currentStock.put(coffe1, 80); + + Manager manager = new Manager(currentStock, 80); + Basket basket = new Basket(list); + Customer customer1 = new Customer(basket); + + Customer customer2 = new Customer(basket); + Customer customer3 = new Customer(basket); + Customer customer4 = new Customer(basket); + + + //No discount + customer1.addToBasket(bagel1); + customer1.addToBasket(bagel1); + customer1.addToBasket(bagel1); + customer1.addToBasket(bagel1); + customer1.addToBasket(bagel1); + Assertions.assertEquals(0.49f*5, customer1.getTotalCost()); + + customer1.addToBasket(filling1); + customer1.addToBasket(filling1); + + Assertions.assertEquals(0.49f*5+2*0.12f, customer1.getTotalCost()); + + customer2.addToBasket(coffe1); + + customer2.addToBasket(coffe1); + customer2.addToBasket(coffe1); + customer2.addToBasket(coffe1); + customer2.addToBasket(coffe1); + customer2.addToBasket(coffe1); + + Assertions.assertEquals(0.99f*6, customer2.getTotalCost()); + + //Discount 1 + + customer3.addToBasket(bagel1); + customer3.addToBasket(bagel1); + customer3.addToBasket(bagel1); + customer3.addToBasket(bagel1); + customer3.addToBasket(bagel1); + customer3.addToBasket(bagel1); + + Assertions.assertEquals(2.49f, customer3.getTotalCost()); + + customer3.addToBasket(bagel1); + customer3.addToBasket(bagel1); + customer3.addToBasket(bagel1); + customer3.addToBasket(bagel1); + customer3.addToBasket(bagel1); + + + Assertions.assertEquals(2.49f+0.49f*5, customer3.getTotalCost()); + + customer3.addToBasket(filling1); + customer3.addToBasket(filling1); + + Assertions.assertEquals(2.49f+0.49f*5+2*0.12f, customer3.getTotalCost()); + + + + customer3.addToBasket(bagel1); + Assertions.assertEquals(3.99f+2*0.12f, customer3.getTotalCost()); + + customer3.addToBasket(bagel1); + customer3.addToBasket(bagel1); + customer3.addToBasket(bagel1); + customer3.addToBasket(bagel1); + customer3.addToBasket(bagel1); + customer3.addToBasket(bagel1); + Assertions.assertEquals(3.99f+2.49f+2*0.12f, customer3.getTotalCost()); + + + //Discount 4 + customer4.addToBasket(bagel1); + customer4.addToBasket(coffe1); + + Assertions.assertEquals(0.99f, customer4.getTotalCost()); + + customer4.addToBasket(bagel1); + + Assertions.assertEquals(0.99f+0.49f, customer4.getTotalCost()); + + + + //Many Discounts + + customer3.addToBasket(coffe1); + Assertions.assertEquals(3.99f+2.49f+2*0.12f+0.99f, customer3.getTotalCost()); + customer3.addToBasket(coffe1); + Assertions.assertEquals(3.99f+2.49f+2*0.12f+0.99f*2, customer3.getTotalCost()); + customer3.addToBasket(bagel1); + Assertions.assertEquals(3.99f+2.49f+2*0.12f+0.99f+1.25f, customer3.getTotalCost()); + + + } @Test public void getPriceTest(){