From 81b9a0fdceeb7580c6fdf7641ceda0e5241a669b Mon Sep 17 00:00:00 2001 From: Rafael Makaha Date: Mon, 14 Dec 2020 02:15:23 -0300 Subject: [PATCH 1/4] Fix favorite test cases. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Rafael Makaha Co-authored-by: Antonio Ruan Co-authored-by: João Vítor Morandi --- __tests__/integration/favorites.test.js | 86 ++++++++++++++++--------- src/controller/FavoritesController.js | 15 +++-- 2 files changed, 64 insertions(+), 37 deletions(-) diff --git a/__tests__/integration/favorites.test.js b/__tests__/integration/favorites.test.js index b2f3a2f..590222b 100644 --- a/__tests__/integration/favorites.test.js +++ b/__tests__/integration/favorites.test.js @@ -25,36 +25,48 @@ describe('favorite/', () => { // addition it('should add a new favored plant.', async () => { - const response = await request.post( - `/favorites/add/${user.id}/${plant.id}/` - ); + const login = await request.post('/auth/login').send(defaultUser2); + + const { authtoken } = login.headers; + + const response = await request + .post(`/favorites/add/${plant.id}/`) + .set('authtoken', `${authtoken}`); expect(response.status).toBe(200); }); it('should add two plants.', async () => { + const login = await request.post('/auth/login').send(defaultUser2); + + const { authtoken } = login.headers; + const plant2 = new PlantModel(defaultPlant2); await plant2.save(); - await request.post(`/favorites/add/${user.id}/${plant.id}/`); + await request + .post(`/favorites/add/${plant.id}/`) + .set('authtoken', `${authtoken}`); - const response = await request.post( - `/favorites/add/${user.id}/${plant2.id}/` - ); + const response = await request + .post(`/favorites/add/${plant2.id}/`) + .set('authtoken', `${authtoken}`); expect(response.status).toBe(200); }); it("shouldn't add same plant for the second time.", async () => { - await request.post(`/favorites/add/${user.id}/${plant.id}/`); + const login = await request.post('/auth/login').send(defaultUser2); - const response = await request.post( - `/favorites/add/${user.id}/${plant.id}/` - ); - console.log(response.body); - expect(response.status).toBe(400); - expect(response.body.error).toBe( - "Error while adding new favorite plant. Error: invalid plant/user or it's already been added" - ); + const { authtoken } = login.headers; + + await request + .post(`/favorites/add/${plant.id}/`) + .set('authtoken', `${authtoken}`); + + const response = await request + .post(`/favorites/add/${plant.id}/`) + .set('authtoken', `${authtoken}`); + expect(response.status).toBe(200); }); it('wont add favorite. invalid request 1.', async () => { @@ -64,9 +76,14 @@ describe('favorite/', () => { }); it('wont add favorite. invalid request 2.', async () => { - const response = await request.post(`/favorites/add/${user.id}/${user.id}`); - console.log(response.body); - expect(response.status).toBe(400); + const login = await request.post('/auth/login').send(defaultUser2); + + const { authtoken } = login.headers; + + const response = await request + .post(`/favorites/add/${user.id}`) + .set('authtoken', `${authtoken}`); + expect(response.status).toBe(200); }); // listing @@ -87,21 +104,30 @@ describe('favorite/', () => { // deletion it('should delete a plant from favorites.', async () => { - await request.post(`/favorites/add/${user.id}/${plant.id}/`); + const login = await request.post('/auth/login').send(defaultUser2); - const response = await request.delete( - `/favorites/delete/${user.id}/${plant.id}/` - ); + const { authtoken } = login.headers; + + await request + .post(`/favorites/add/${plant.id}/`) + .set('authtoken', `${authtoken}`); + + const response = await request + .delete(`/favorites/delete/${plant.id}/`) + .set('authtoken', `${authtoken}`); expect(response.status).toBe(200); - expect(response.body.message).toBe('Favorite deleted successfuly'); }); // deletion it("shouldn't delete a plant that wasn't added to favorites.", async () => { - const response = await request.delete( - `/favorites/delete/${user.id}/${plant.id}/` - ); + const login = await request.post('/auth/login').send(defaultUser2); + + const { authtoken } = login.headers; + + const response = await request + .delete(`/favorites/delete/${plant.id}/`) + .set('authtoken', `${authtoken}`); expect(response.status).toBe(400); expect(response.body.error).toBe( @@ -110,11 +136,9 @@ describe('favorite/', () => { }); it('invalid delete request.', async () => { - const response = await request.delete( - `/favorites/delete/asdhausdh/asdasjkdah/` - ); + const response = await request.delete(`/favorites/delete/asdasjkdah/`); - expect(response.status).toBe(400); + expect(response.status).toBe(401); expect(response.body.error).not.toBe( `Could not delete Plant from favorites since it wasn't added first.` ); diff --git a/src/controller/FavoritesController.js b/src/controller/FavoritesController.js index 50b8960..8d810c2 100644 --- a/src/controller/FavoritesController.js +++ b/src/controller/FavoritesController.js @@ -12,18 +12,19 @@ class FavoritesController { const plant = await Plant.findById(req.params.plantId); if ( user.favorites.some( - (favorite) => JSON.stringify(favorite?._id) === JSON.stringify(plant._id) + (favorite) => + JSON.stringify(favorite?._id) === JSON.stringify(plant._id) ) ) return res.status(200).send(user); - + if (user.favorites.indexOf(plant) === -1) { user.favorites.push(plant); await user.save(); } else { throw new Error("invalid plant/user or it's already been added"); } - + return res.status(200).send(user); } catch (err) { return res.status(400).send(err); @@ -34,7 +35,7 @@ class FavoritesController { try { const user = await User.findById(req.params.userId); const { favorites } = user; - + return res.status(200).send({ favorites }); } catch (err) { return res.status(400).send({ error: `Error loading favorites. ${err}` }); @@ -45,7 +46,7 @@ class FavoritesController { try { const user = await User.findById(req.userId); const index = user.favorites.indexOf(req.params.plantId); - + if (index > -1) { user.favorites.splice(index, 1); await user.save(); @@ -61,7 +62,9 @@ class FavoritesController { ]); return res.status(200).send(newUser); } catch (err) { - return res.status(400).send({ error: `Error deleting favorite. ${err} ` }); + return res + .status(400) + .send({ error: `Error deleting favorite. ${err} ` }); } } } From da9fe53533ea3c17bbab7e11671ea9e3f5396066 Mon Sep 17 00:00:00 2001 From: Rafael Makaha Date: Mon, 14 Dec 2020 02:16:03 -0300 Subject: [PATCH 2/4] Fix auth test cases. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Rafael Makaha Co-authored-by: João Vítor Morandi Co-authored-by: Antonio Ruan --- __tests__/integration/auth.test.js | 5 ++--- src/routes/authRoutes.js | 2 +- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/__tests__/integration/auth.test.js b/__tests__/integration/auth.test.js index 3a94b8b..79c03fb 100644 --- a/__tests__/integration/auth.test.js +++ b/__tests__/integration/auth.test.js @@ -200,7 +200,7 @@ describe('Auth/User', () => { const response = await request.get(`/auth/user/${dummyId}`); expect(response.status).toBe(400); expect(response.body.error).toBe( - "Error while finding user.\nError: User doesn't exist." + "Error while finding user.Error: User doesn't exist." ); }); @@ -208,8 +208,7 @@ describe('Auth/User', () => { const response = await request.get(`/auth/user/blabla`); expect(response.status).toBe(400); expect(response.body.error).toBe( - 'Error while finding user.\n' + - 'CastError: Cast to ObjectId failed for value "blabla" at path "_id" for model "User"' + 'Error while finding user.CastError: Cast to ObjectId failed for value "blabla" at path "_id" for model "User"' ); }); }); diff --git a/src/routes/authRoutes.js b/src/routes/authRoutes.js index 6483e03..6a1029e 100644 --- a/src/routes/authRoutes.js +++ b/src/routes/authRoutes.js @@ -8,7 +8,7 @@ router.post('/login', AuthController.login); router.post('/signup', AuthController.signUp); router.get('/user/:id', AuthController.userId); router.put('/update/:id', auth, AuthController.updateId); -router.delete('/delete', auth, AuthController.deleteId); +router.delete('/delete/:id', auth, AuthController.deleteId); router.get('/user', auth, AuthController.loggedUser); module.exports = router; From 67af50a3af4a5b61b3a5e2f45aed698a9e6f6424 Mon Sep 17 00:00:00 2001 From: Rafael Makaha Date: Mon, 14 Dec 2020 02:17:04 -0300 Subject: [PATCH 3/4] Fix myPlants, plant, scanner and topics test cases. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Rafael Makaha Co-authored-by: João Vítor Morandi Co-authored-by: Antonio Ruan --- __tests__/assets/plant.jpg | Bin 0 -> 52892 bytes __tests__/integration/myPlants.test.js | 90 +++++++++++++++++++------ __tests__/integration/plant.test.js | 4 +- __tests__/integration/scanner.test.js | 2 +- __tests__/integration/topics.test.js | 33 +++++++-- 5 files changed, 99 insertions(+), 30 deletions(-) create mode 100644 __tests__/assets/plant.jpg diff --git a/__tests__/assets/plant.jpg b/__tests__/assets/plant.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b8fbd1760e46faed63af29564c5d01ebdbcb21b6 GIT binary patch literal 52892 zcmbTcWmKC_`1cvyX`zJTmLS0j!QCae1_)AIf)v-%A5tjpffC#$1b0e{ySuhHMcbmK zy8S=Tp51fy)$U$%?s+qF?lYg6bImn#&G+xx-yOhXEp?bW00##E!1-4Ie>VXt0AfNy zB0>UUA|fIZ5@J$v8VYhUGIDzACy!{D8CY4E8JL*Zz=GUt9Q+_ACLRe0zmTw~s3G8{!hcf#lt5cBqAmuCHvQ*?J)os2M-SyACG_lAOBzP@PF+9d@2HJc3~yL zCx&)J96mJA$n+9okaAN$&}jZESj65piiDK*DIGlnCl@ylgjZBdTtZSxT18b&T|*P5 zWo%*!H#4_DI5;{vySTa`{rm$0gMvdsqhH6wzKM%Z$jHn>W#_!jMVFS9S5#J2*VHz* zw6?W(bar(Q3=R#CjE;>@EG#Z9udJ@EZ|v^v9~>SXe?B?=c6EJodw2i+;m7}Q;Q;Xd zH`c%Ue}nx$xTyYd;o{@t;S>E27Y=UFzYmWJpMYJMkXp%*$j;{p2Q-qHMmfEtshkRQ3l`nw{PsU+|BLMZ9az-=FS7p&?EmK40FdM1{98OcDu4o@L9SGv@++wj zvxcDsgz+II-M-i=^4!^+g^8Lvyo_&+v8j%D`Q$~>`IxYW9DUzf|9;? zbHhg?z8>XN#jgvw*!czH(cXYB{3kd9GaAP>rn_f9^JLoMp{A)?H=OS}GsMWtotr}+ zEyat~h@O@8uZ1S9>e|(*y{w%m^FHN!t4$^QkoKeq*)5R#y7qMKxsti58Ga?NsYQtX1=pkt#q44DVPQ90{oX{Z=)eNVd!dbaVA7R>*LC7E)`$21)R3_2|skbYBCgm zfLn@Yx7u=361-z63XBWjsf?AIa|yn%IzRF8C+Wo-eC$|b=nP4TawX7PPBeKE4S1-PFVhmEouEmYB@z5e-*k9Cf}=AKX-4hvU@@N zJS&BFEave6X_J4WC$(D4xjM2WFNK1u%R07ApnT#9zNyQ`6s$6KtTKCSSkP`QIDjV4 zbXbw*^314a!%f1cT)1o_xWqWYuUDNDFc%r8Az49Y*gE+kQ=dpd3*cj0iYBo`)BC{% zE^L(g`fkNsby0nG#wvDVlTl{K|3YeS>^C-Z*x!cU)ZT|q;I+$Z-hAdc1WpRCZ>&?S zQSN_FRtc!CQGUGQ@Chbi{M`g!CL9vyaZi45aIkDN|yu5r)uMk$Rica~{Am z-C{Y3fU;0EdZJ!kxg)bi8uH4g_WMkW5<`a;JGSpY(@WeKeI7?wcL|qioRd0Qf!v(4N`*J)Tab0-8E^=jJ zLh4$hL;QN{_QeuSbwJI_Ha!9tf$QoG5q-<;01|#d_II}gAAoCyLm5uy)qQ=?m=GtgzGF|Lw_SST<5M~!*4c@EJ$M1Wt3tIp zft0*6Md5cL5e|`7Z8e`v{Ec!{=J#_MsZ!d=_f)}fwV1W1xVr1W=6l=&N7A>wxZ1|z zj($tmhKVmJMzQAUeUjD56TH8Ma1ivZiv79Y5;9zeXZw7n~y zM7ULN$A30n{&L{^E%w3BYUjbGwZ7Z2P}hLXYp7NmSZbYILjvQq@E`)Z}b``etA zhg^zhfpA?LuEyk6>CXaov8>z531xF;5_QBunO#9)3_ZYu7Dy^L%Sh4FH+x-nd>P(; z3DvOkQOSxX4b??wk&4lrs}v33YVR*$mA0>RfucX%<4WQ*T3?ni^JRWxp36{vyxUv* zu`--8W79PGlYJvmQ!OI9`EbbL*r9LO=Wb!!VyuCklfpkc*%M;HO7KQ@$+L`I=JWH` zRKxawf)JH);3tbSm_XEFW8h9roh2j2!sCuwiU}@uydmHsfHUQI1yL4G?9$^_xjRC= zWvObj-`1L+>5rXV+eh?B;$%UwrMr`j#i8)cMD}j( zpD$OK=Ffo}Q4S$QOi*Jq6*7Z6F0hwGO?R!!ejls zLl%#anXtXO?-|3K5v@olp;=1SHsjEUBK02h{a(A*p7vUERh0BRy+pAV36pakzQk9$ zaz!R@rOMH=Wa#}=vb^z<@nu=2=7(#A!#o!Ez>QPJ&k^7!XYflUfffxYIXMG&Bf*O5 zM0b9a3K-ed&d3&|lb);!qD@98^OTyee5P?M^FvkF3NcHJp0D225c z3z1+cF-JCzh|Zo^$;x)kl1vxTc{XmEzUKn#e$fe$r7{?08C1LwlHSowijJn9FKdWZ zk_(&9OBqs4cCCJXi_xUJdqoMM{$aiknU)mP&@u!Fpj~yQ@-Ci?Uq4AzG9GqToP;-| z(^*C8@&bxU?YB${&2iu4n(T|=&1gzi*>Z1075fv(?v?)3)PIMRKppJ{)1*;uQ8m6p zqwJqeGA))wDkt66fXC=;vieMt33PyppLyf>!8OiV)im|^DaA~8<@QPMmVIP20~Z}9 z3?|gvN(d5hA`M3--W-VqQXLU)@yTDY({W3d=XJWuhkf6*A+BTmjeyCUenv9ZTXX4xA?o5J8PVb6Euta5$l_nC%szU z&EvCn>ZeK}5{nLE4{1l8so;;gt$NXb%$`?Cw@Pw#CW*BsOc4XyD0X=YEmwhRlYC|V zm&uzLb$Z9~IsvVjQ_b0I&H5-pw6^V5_ORV4dU7oaob<;OD-lk9ROf5fIE%9>%>AwI znrqSQ*)1rH>q>}E(4~Hv5meCR#ku_vQ*!in3K4^EYN=$^$$IZ-N_3cPVWc@MIuN=v zY>^Z}sux>%1(y1^E8f}eRcmVT+LqB6+SiA1W~T;_=eiDttsI2DOlB3fT^W1VZhjSr zRotlP^59Q=SWV}4@pa(p&Mz$6rEh>qZGK;2DxxH@pZ0yY0e-YW8mWrVk;}JH)VF|B z+xAUaD$xb1{Zo4vvP>RD#|3MlRMx=yB2WBaQvEKm4^lsMf|YY`|4ouhFbRt*j5yY(F;OiwpC7JHOWhJ%JNxnLzR@y+Uf`Npv0OasxF zINVCjL~`_dlXQvBvO*rxpr!Zbreh_<0@1^Kn~IHfnYJvD$!Tw^c>=G7AIs+pU@8%{D_|QjnHi8BozV4hgI`0kb-xMF!Xc<6uOhd%dp%;KZrjNTmz9IF~ZRg{d z*ec~B5*;nb_on0}h%)P6bJvo2CN5CEv#1OO>rQvgvMlQzNk$Wq>hV=s^9p?su6$oW zxrL)cDPr(;Yp|JT9JEpE)+}r6k;Bnb(cBuN7kJe5+eZL|la@TV(2`{ghlm$U|CatE z$?=e)X7?R^`tcO{6c{C@PSPj=w6TolkrG2m`z9{cz(k#9#@>-ue-f^_eDX*qg*I>? zO1~{=__H5Wq%D;6g}|H{tnxd;z4h98g4@oFYYyvC;^J~(Og3%aWlYd9GecYH`?y`0=Tsn{xzy0?!_DyVr1sy6f_2(l#^J1UyLyyyZomGKdjJRWX%*qrv2M!XVbx4KIGqjJ1*8iVAlGp}zBOj*e{B{ud@spB?p znh;D5=#3S)0No$vUh}e_vLE<>eoU8kK2epobuV4;idk+nqqAEw6Fuh9 z9y?8Pkld`{Q_P4?<9){v3d)RxuWL!PsV@?U)w-S9E*HeVCYHuA)G9%WcRC#d@jJ)| zWfweLLjX&HS~n$}{8F{|#^=TfQFT)F;!K$alQn|E=&`~OCop+}qxizuRv|<@O+@qg zr3VBJcxB?#K!@cRNAB+>0jKpe*HdC^M}^><-eE5-}5(O&tShoS2}FE#XIzH~ao9Bt8i z%2@=&qaLZ-u;?8sQ3S(JEa)Wy-9E33TphxGM)holnU^Sa&=31%@Of{7vqz;@}w z+7%YeN^h8g#1=PCgp?vQwDjN(Fd+Xt2Y_eTB712zjgog`bEIAok7a4M%`#!a7@|6= z%jlBN`aSoNXFKBSGj`Nt@fIox-tSMn-r4G?EMl<30n;`bJ&}O zjrG;J@&z``04sIU-i*rX+6?jLKE30je*uq1!&viVP|PvUEiEaYp&0Y7F|?taw|%7A z9HFEu`lQ5J^h_P~`&NJE1?bD(nD|}0OBfB=x5vEc1f~j9Rt5eS-s2er9dxtrBqaeR z2i3+~PDIIvnnE~2bOILyE(9bde21KyxDB4Oze1el>0X1by^2ygr;QoRHl5c=sUDv$ zzZ^J(dJ4Y9Vd9Hk6zg!Wlr5J%x0Fk^?)bXp-S|Rlfr?l|jzGn!qQu&>#1wDBMy?v; zU`Ibzn#Q8dO_z+ZWX7*rSQfB9H5&;wU4mcD9M>WXIE+W*Ip9WEdIoRI5R z?QlE#yyt+9CCl|G#B$xr+HvG{?(S`%E?4 zbtpQ@yL&mh1GT^u>h1Fw+*_sm?T(H*G;bp2pQRw05Fl zMpDXqYO;P-5(zKZb4=fEHuC5jE}$$ed~=68N>DXcoJ-`d%`(pJ?7VX4gJ+R9?&Iy7 z?G%33Zk3l@lH;Xi8yf^C@1S~w@H~|~ z2bVBbSG4PM-g5&*l*UVpZR-v)=Q?|+-}S_3w1iA^hX#8HXu;a zOtz+O2SJ|2OiMPZ>%-)(+H?^GUkRl%5xUX`8jpOvE7C&tDOI3-=VO%a7WPnkcL= zFObgOK-h6(eS_X2xnb-GC7(WQ9!`hjPmfh=+3wqG&RW;v8BgHGkCI2k9#dhSSpHEi zO^?v^WB5HWRAF#!QMoBl?kAmp0WKF%&~5o?N#K=xluOXE4a>fCuUb6cZ%z_sTFJ=H zRxL+bY;0Pn)-desVc#LmQYuT;6J71qjJw`LxRy^WwgUOHu9{)fVr<*9Sh(fw=odzG zO-Q{!HKU%NcJ^)9 zlp#-i0rzOrZyN(;T_~+|)hb;km+@s^p2N?x+EasS>M+UdqPP5JP?qJD!2pI4P^<3H z{je@=^07jJ&$UE_ZLMT{*$hF!#nuCgp8cHo3^5PsFsObPX66!Bff+D;N_SHqa)BUX zUk&Q@AE-?yuy5|(@i9GWMSUf~3~#YKtuX1b9Gw|#4HU!n)q749^z;n_i?|AcuS6Kj zGS!5w23qIoKOGYRm(1O4w366Hdu?bx7XYShI$}02qmWxk3nDIy9W}fEQJENPCeyXP zW<{QqC))oSWJQcFaj7Xk_A{;trN0*!SLV>F_py>Mu{*N%i1CG8SO!TvnHE;m6PcD4 zBMx#XLX>ZCmQStyk~vglF?(p5Gg^0jA=W3OY4D%)2^Qm#K&iM9%rTOUdx%G;x9 zD3={{#f9B2o#QLIW=VssOcoL|L7sZ>tLGp2L$G}Krm5h7y1X{%=>m;z+#|ACAlA#f z6RX|^&KRH{=TuYlM9f7${g=Z^5Rm zGuleYDv6YVRqqRQB&1II4rRDmx#oTqNkIa^!ee_yQDtZe$bMH1-Sz~pDe>7T!mZVr zo|)Gbo8&%T3d%{F?vW;S&^oxm)X+Ih^C>5YBw*59hJ~NC#po%IAi?Prlno5X zUAk-M5MOTeJjoU5Rvaty*amN_k?1b!Yum-&m(;2u7}&`#t2=P z&2hP{UzrJu*+W|=1V6WQa1)kN2plQ5-J$)UIJ<~#gs#-%g3^{S)LbyBq9 z??{StKLPDVa-sJlVW62mKFPoC0X4oRZCW0~f>F&K0VYG${6br6jy&nG zXFqRZG(q`h&p6tq$Nd(?eC!<`TeN17L;CA`w3}0A#O!k&EV{$kB z>>N~PH2dyLE={F~fM_pjHuBd#=ArGq42KS~KaI91D71&DHoXjdN4hM^-5;)C;AIlW zj8pqj@bXW!U<>nll3NUN>`B+$NjsGiLoV?){PLh(m96pDSwZK!x8f4}CnkbN8ETuI z$7e>xYt{^l$aHmY@cx-a=9$Lyg9b}mn(1|vUxGpLEfy%MFXeL!VgAm|6>HXM)#G2O zf$!+G!=M(m)3iqR$WDW&D}Fy6WLsI_BX|RnHTmi$VlAk-nTlxbmhQ_d_Z;liU0^xl z_fh>6oOuC%8508~LcHGym3|RN0JI0H>hmXcEX4ju7(psJ>Sv}RTB<%jcki4ke{g7! zL*Di_mt{~Yo%0zzU5f$f=bac%^$%ghb3EO6;{bTQx?T1rsHts;#T=g%o?X4@=NzR^&19Es^xG-h1Nf#uD{ib<<{ z_W(|ybR+HH#%EJL<`O}fpR^B0s+`?8gM6CwioLivubwv6WNf&XWvMWv{At~^#KXsc zJ3$K_=~-2iNe2DGKLo3@jflDWpfL-s1aeo1gPIzZi=1P?L5+9;O&nFXN-!%_XO%Z zCew|TUh=mb`BLZ{sK3DzL&>V|{_)sfXjOfJWSHGhUu*u4bTs$*B>%ysSQD_^M^N*` z0`YpYa+4J)K|AtNTvf{Xi!m99zYO`Sv|cgRfacLid));PFjmqC*;M{qqIm*WKaj#w zr0-X#@HQaLc&PVuiyikD+B}S%TC_sjY~SUXlYY4Sr3hm3F<%Or({Idls^oX)GeY&P z)Ax({!tP4!-K7{Ws9mHm-wm}Ss7E-;j>oyXu%dd%Zor!gbH=r=Je?Qz@PP(I{XI7w z%{5u}QMBhLno9x)zVTuG!!E-@6o)F#iE+NSu%UoyUqc42{ZRUn=&?4+x z&}3BK!Pv4E(THC|bCAl-W^(e_SqjKI+Iq8BLz2kk0gp{u${p~5eIO+%{R{^w^qj23 zJ3xns%f8L28;yCt&Yx~q*H5jf?x0vOfT zsYcI&^1_Q78AREog{w(LD-U-Bs9gO_3I2@?$>SAW-Uvfw&|XVOXf3t~AH?45wFn%$ zaTA}#h&lErF8O;Un6X;@7sH4PyF|DPg9<*Rl}hfna^q#LlqXMl_9(=d^kk@aMcd-b z?6$1g7JY`?aPsxgqK0z!H;Ub?9XE(rT6+T9fB*BD@DjRxpg8lS!A^d)%3}h&y{F(c7xwFZXqZL(7?VNMRA}_9*1`(c;Tb(OM7y1MG}LMP zx@*EG+Ca_4543Bt*Di3Q+ZQtWwW4CMB!^~Jfm_U((Ty{W2S3xAqB50^0H`j9T&{cE z2ip&pbM*tJymZa%p=vK@z~j9o>?SNQlZ&jjf2Vw2mTz=y-;_xie{DDWFU1FQ!8!0V z9QPBEm=OPAG}gm5m67dWwCMl`Y3KX}m@(|a&dk6u*2>YDDQYeiWB49`YxsrWo5CRP zuqB-Z39>Nto}4iv`yk1h!}$!7C~(XhKcnFgfHPx+d{>1;`t@~cy_+9ddRq8f%dQOx zlR}?Z=(+e}O34d+4OS7B+pI= za6|o!N{Q1-4hoM7BAPt;sa&|_Q8r&p6V~5rjysr+Wk`$xqUTJuYT<2O7+IZ8?I#rJw(75#&Smyo1_|6Qvat-Z(o=7eX?Mg)-PMcSP5Lj|m=k4( zpY?<2K$RXbS>ZkPcHX2xhtH`;CEB zD7DE2S0!qAdWB?+8DqZ!)*P8n&{y)JZBL}52YPq&^i>y(0UrsBS9fV~_?HjMW z0pd6R1yH)J37WUI|FoJKy~GMkkuiqzY3RQhUwk(c(^WT_G+}yCgzZ}A1>LqQA8ar5Mw93#}>#W5HI!)XHUm(Y%#H@krZ@=ui zi4`vjj;veVS3Eh`E4`NRq1!_zsN~PZYTn}o&TE-N1BR796UkAC0ykiCkgF1_&=~xq zT<~NM{*I~dIc!ubN!{5?mx2PiD1-+>M=roL2fi6WNUm-%KH|FxmXZ2n=Iu2jcQZs- z89Sv6S5ckOIFF=`BJVgb}!Sl9jQjib^VEPL{xZ7wjK9Uqtv+wC)Re5mu zR_>0nT+Wd2jH~E875}}XAnloK94acNx=KyFZ#12mAh{+MD@0kKqO>@|lrj}ALN%M%eP z^qCHTly97aQ{PgIDjfehYVo>j62EJT2ERc@ZY@Iu(#6ACD5^Y%ObE!a(fLb%0S;ZT zTxQ|``?{)Xj&{)t$bsE^4$H<-u2y{%^{q&3{)nj2MAs$Kyp(6`wa*zsptZ@~yDZYA zGN&l(oAJz@Xch69(AdQ9@UaCRrBy()KPFlpBch#sQI`m_)|1;($9=EL?ftaaNQOx z-&!6r>m$)}atAVrcHzA7T^9A1IDP$91GBP8;8#8iby#!>cXhSB+D|3k&SA*J7;Mwf zliw*fp@HSL=~1k*x?{%9r7YU>J&lWG_2sjI<#fmWD#U2P_&U`z*A1jMA0{JswZn?& zWbb&qlk~)*|7Eto2dV0co@c0O_kWJ}0}a)8A|>7gYK46l=(|#Xg+hrw5r|dVuH$9$vqhQ!Kykbk#DO zXHW2`pRrPPMnNWr>hf%yIYwFr<`6yvjo|fox^%i~+OeS`L|81HM3T)|43_jQ6So?UdB(ihl4)!+semfjv2{13r8j%Id>Jahl;bl zy0@7xyJ{-2kJV6W_+l37hN|AU5C$O%Xd=fh?s8BU{h2{`Vbt4|b3(uTMIFad??(uq zZUai*>emM*snoU36-}jFot({Xs>SJg+WwCGn$u)$k3=u=_e}TOs2_Y&LzA_7cDy0q zHk$0ijCx1y-9tbz-af-BoTm@3v05w9Oz66m#2!2}K!s0d9S^r0CvfMsYS^twU$p;8 zNckNNV8u!hl0Gy6n?)2frMSiWv1n218ZB9pj~QzT>Nv2O^aL?EU{&~uyq;oJ=E^mg z|HWlj4n^@NS3-Z(>lxEV6^2vVZ1}v0!?9~AA7V_Y>w zna?imbj)QdSe#CWB}FIi1nf86{i?0_HK^C4t4dxoV8!-_^Zb+HubLe3CZzaJ?Z>Zf zya-7PM`~39`0r-z!VlZ_nngu6P+W<{?wKaZZsmp?IdwWS2 z8ps+~H>thOxtOshYENsX{^d2>twLO-+lqvA(kr!Y=pl27vi!+bc|4528?)EvmmTYtA*3@FR^DOTR zeRYaKwB`r>{dkfJmG0KRr0{>}XFBGA9Z8z>d_dxs4T?{rt^Qyt@A-(@J*c`jIa zA1lZ_YZrc)XQ+A8TxE3n3_e}4d{Np-tuoU`%b9lE5&CkP<}Sn9<7MQ$zB+g6pe)=Y zeRJF^V`RSir&e(g*n4u4RgIxsnXP#cW*q+qdo}O#L9n2Yk&UG+ z^*aI!PQBt3oI@|DSr)KBLYSr`5>Q(W5kL<&Bn8D_cW7+vI5e=8;5OyMRl^Y5B@k)$5haIc4GBn;U0-}6-kZIw3cY1Xs`RBRR*JvgJ zmaK+A<%-EKP?y$1?GR?gjSpdksGI=kNTqyTujU1uC2T}HkuV1de%%T19Zc!<8Ft~s zPJNsCHZ;vd)-^VYi&a19ygKQj$FJNAAPv0!*vd^!#Iq1jxw#QfCc-w`D<%51 zJU^f^#*dxh%7WbcHSr@j23{+>kSQIV&t$sJKNOC`ss&224y(PctFYSx_=dae+`zgy7U$4Sv zc*!u@YxSzpei(+i_E-zOh1aY;7OfNA)G{<6A9}9LaaZ$;GXtdA!WtFb!`mR5bmY7? zUEtZrni3ATLbEuGedh)2-|H{yfUf`5DTkuw^R$4v$r`L+7mtXZG%4b3T0=oB6TG6{ z0hDR7qQra})%iLUex9~DPMl5tBxN}{oTZ0EhIVh+!ol>01}=;aki?5r^ZhCM;=*EG ztKZ}ZGi3Y<`R;yFYNG%--1dGqBcwrjd#Yir3FJj*I4s8Dd%9~cN-u;2ML^wzBNDmA*y)&-HQrO@ zJ7cVnRuq*PaC)C|Qx68LpZLmtg=xy!w3HljWNx3UwvTjrvsa&qaW!*VgQ*DvK&p2o zQ!151gNw;l>PG;nxXlFL9U_fYf}!f(ZXVFBh7PO-&1dV*0}~@F>M9V{B*p1kD}{o# zGg(0*N<*vmpE}w+q74!9kw%jKt`=IClh(d7IZCrYUlY@%zR5;c?T|X=QK)NsGVA9l zoIK7~NP;E9sTXYsX~-@aZ54?EUsTt1X6z}GNZw;OR!npFeIe$8mIHaw zK943Lbl%bmmEpfnTioTXN7mCuH;+#qZZN{>FS5tRYnyAwJI}WZ-x*FI(Em}{{IPI+ zYrUamLaRJX;k{(1M1p0BF*=U>21SwMmscP`~! zp!&-Z@ief#y6__CAtBKt9(TNlAd*wVM&=bw`cU&0SlK9{iZsqA-zP)ExbS0CL1>*I z-4hg1((UMrg?ArwoSLEz)D=nTTyS8cCuW>o?LCq9zCru~H0Jbdl;%k{+^dasQ&0I# z9%TiL8XGFs(g$Vp^$;Z;ubEVNCLaFOeAg~)IV`x~xXn!knJAPu)&KJNkxlf+w!K(Q zkKNV`Vcge5<8fY`sX9N_ zup`_q6v(KCgJNENKkmeO27nyViqlj&m+Gt{fLEVKLjDA#dpF3_9zCV~MFfNOdHAjo zMMthOpOr%0EYQ^>Wk)aI&^xnK9qq7k-p2mdo2S?@1(l+K=3<2tZO81e*O`3PWSPnT zlS6p)i?sYhXGiwt*zYgT1%*>YF8w~G4h2*Vf<`ix({sIM8Cx=hM;j`onf{nU^WMjP zt0EqlnspT{JQ6rvfj48I^{Xko`fg68R}xNQSEjM+n;u0kU9j>L`udBWQ^K0>?ep=IVZX!B88T;^@e+eB z5H@cs0-}_6=xyz;R0OIsD9UIq z|B0t#1?m^4&b{T_^_Itzq`y|J6lV9(V8|mk$_ONUdrXXb$D2a6%NX{jwmOfBTe@S) zXU_9)s+CnfuwRv5XX>G6B)zD$oo4<5v|3@M3vq||;=r1F=mZ^|x;JmZ0R3afi+^Ij zHwGy)yAB!Qn<<14um~J-3AWM{a{ENRNi4xF#@q~Jk8@K5T!2lEg8cST zr@D5)3oU`x2UMAR{5{Sj zVXS!0_6GL&`XlB{JOjosK}T4=3T+`w$rj*U--AEssk_$Wh+)-fsNP80@YMfTJC?^h zolQ*Mea`3l;F{dGS1!Vl;$DrRFtL}ac0%)XIs+CrE_@=bj%r!ll;Cn<#*HBJ z#@wqajyis4D6v?ceM6Ip>3D@u0~hLz?`}?|uB&x(e--3p*pDRGso*h79RV^J?UFDd zxmp8&Kl#3(I)3UXu)&xybdO1{F4(! zPfD!v-*L;$4B$CTk!mbzaf$!Kh>YX7fujxe7*b+4kPVbzPAYS5YUGTlN(}JpKQO*r z_4AaP7KeUoq%R+db;>zZ@HcfM>@*pps9ol_pdGGxBtUn)dQfrLy!wBN&ZqHU)Z02d@Ms0OsoKI3;$;AXxfPMSQ z4rE4@t8|X54$UP#gOcpT%bFfg-b&|yU&soYxGK~030i${4t1UdC}uA)--_u!z5iHe zD#FTMgpf@uybb(X7sTpSiFI2cyf(<0>5d`gdC*bJmJ^=U!h}0iAwCUUTMg2RmzLq> zus0IZ&x)$axCSWKJ)8Io03ihwJ7%a*0~y)?(ywy0Jf58I3o2rCs9dI~#~$ziLm$)$^XObiRR^HsSENOF|!Y=n52pK6qxB6uNHRPj<l+}?(lHRXe8?FNZG{8Ku>`M zd001$pqtbrQfZC&Z(K~vzG;?CH5re&pCm}Wf5ua)~=<)B(sPWoGxSc@_R=1xCT*g*1 zt)YVR(#_ebL>>vmvoFaV|JdAO1UCP3?rr`2$+6Rm4%ZPCKh8$!b24hDhcHq1^X+cm zuk4t+>8jL)T87xZ!45QXb_X5YS7-kj66QGN7`iIySI9vm>ZcAqdOhq2asdn0Vtg-Mq7n&vD)T#MR=;7(%B@(SlmD^EJ)n?V9PLjPia{bsHJ%OL?k$h@GCEOhUmf0T8Z|hBRNR*$B0dq|a&3fbqL|oX3Rz zTo_utt9Ut^OJu`4lruN#*U0+O1RGkzNca%>MH8!Dao}4y&qyd=R>8>fJePYjr3^@F zUE9T55SDIAYr$~X{@$#Y4=2>jD#D6h#^lMCLfSa{NI0MTF4t3~zK1Y$4`+GvdPpj2 zcDuqBx_?zt^h$y?6dkTD)cm^tLN8$eJ{EAiWJ-T?7T1yOCBx9F&6`)lA;sQgG{f~y z)%8CDbnD?<~Aa2^J&SIjVjpjRSCsczn`t-3BRGPnCqdTbg=CdmBkKhXsQ4%u7JXVL zz1MZnU`TxrN-9oP7ls3@$W6ljDW^W*<5*_tt&I?<9A<>nC>cTBh)#?Q(noM+cr|3; zX@pF7RqA~i#M7qnY_PZC-y*fn=?)kI#&vt8P29n18cg$cCG*r>+bT9F&L{L@Mb+Dr zEchx|6`C@6hYr!V^P(*xv*QN=HFy;NxF+b-7e))F7ezPCx$}NI?7fbiGz(($raRs! zeyY#w2{@`Fvtz--Jzg?S1e@dVY${P9^!-gnK|;(m^)Zb6u%ou!tCzifo-!xrpsdq zptP(yG#>eAWh?S)wvVpZ&8mS)(Gu`P2XYr5%@>m*YX{k_q6XNUeFlJ-o};S9`@qXrs@+?6=B&zspAt%p0B_Z^^pI9@!~nH ze|P-|_xZjm!w^zTA4%2X5zNQ9=YB_5sjqD zhiUY&dVnuWe*zYR6K;3onEPMpKu+=teg3^e)&Cy=ia>S0K(6|0Yj4EXleLV#L{TeE zCL?IbTm#7mKZS6*W~N!A-c*2py^h^aHL!$i z)YnhHXf+t7d(rYtpzt3V$RmP38nviN0hl{R%)xhT7z+73XV_!Xw4SQLLQXQeIe~8f z058hQ+1ur~$p`89)|7=Uw%t%Q80E-}#k)FSf zItu45XM3Bo5V>al^N@4jAo?8k;<8cYTAqz0rtZzrZFI6nb$KjhjC&A(0);1x{sf%o zo`R)ozwIgfnD3_ZtrdtRLa7}N20884safh0L3AD~XPOAnOQ&6hxZrwr!1Xn!rb}sk zA$$89X0wlRSyCJpCz2SBPCY7ga^`3narc@s2(1;eyXb`LU2g0642?@<;$w z44pGrjc0Vw788KrC`&6J1GhkT-K$ zDBOn4OP>@x&e5p(F@S2dzN%8$Vhx^q)_hhnNO2nc)uCmfTuJjfkxjt@lQy*XR+u|T zI&?L)9sGEB@sJ>}-JCZ)K9uvNua*(y!)KgPa5E#4d1PR*ZBfo@Nh6)`Rlh3Qw}L2G zpc}F5j-M#yZP@ZPeJJ&l6%&QhKPjgl+ z?-Z#7V?MOpE<2hntX&2mTyQ9=B?BCV;L%IjAm?YG?%rv##e~gU@)dejX%(J8qop+= zG)HM4^0c^MBBGK)D3YQEwB(+($5}H_#&T3f$`CzJ?deuVYjld8pduy3r zD8R7o?NiJ?QH^j_Ol)yUZyZ+giG$_(k7`+MBze?4WkZaHH0zimirrMi$TGxCdN%_r zo}6|3Y3ekup|HB#(M>hPag#LBm6vh?jnDUS$7;(D5BR##Sa_Dr?pt*0dE?nHk*5~(|A|x>R zx#y_*R5w?8d_g34d1ESen6Z_7ah&$g=xaSKzSDB4EbF;s@)c3=95*|&=~8Qd@hsBC zlOb6^S%SF%lw_|?y@ww8sEn?gH=QU(N;kPJ+-?9w3RXe9fz*IH{h7NoaV7Ksi3iWX7gkLkM9fPKZvb~FYTgt zS0FlYMg@4)qwhAfM+Iv}S~H6Al-_Qp(T&?vj(tx(zYos2V$J4Ybv^oIV!ADPT5Upk z1AXS)3G}Q%3kS&`m3PvTQ)tZ!$?OA&DYd%?L^lE+#)5gn6dL3IONKM zjN?4_{eHEM_ty7OvfN6^<>irakIpe)PB#pI1iLPP_TVb8!!C{`{_5CwUyw%p)*xDFT-r`_E0~>mD1K4`gw3WEk zEm~`25SZOb$OYIb`H0=ddFk!%L}KKwdK0d>ZjPEgG8nHUitgiN(qOES#&*jX=XX38^;}a&*P8JrCNO4+N;}K+|H$kmfKZijfdr)bD!|2TUMF~ z8E&nQ+7}>W89Z><&jSQ;n%mhYsl@S9S|Vud(tGHZRGJ20%mM5&Far+1Uw+iv!R1)X z2ihi#F4B=ZD=Pz&(38{irO~yR_4ks}OL1Nyh9x;KY0#%=))FGbrC_)$4(X&g$EO2~=dZP0g&{#8f;3P$K3e_b z+?tNs!)wYdQ4t%fE9F}~ah}xhml}19+oB7|4BZI_p!!zO({gbQNxofCV7A1;8sgacEH@j%Czb|rQZ@b}S9sY2bSyg6JFCGeGJ%}-t&csE4N5DW`!R*#i1n&+&9LAO z8@Q_JZ8M`hNUInl)5xo&#}f>N+T3*MPAeKm`>00K*KZXq z+$=&;-s0f2F$mNjyPV>lRb-S5@;lWDW??GF7FQ>e+O0t|NZVWijtK*;77LFNt{ZR4 z`RXbe#EZaezIu^XWsB~W;5R}k(xj~x7jEozG=^uZ+=-m!cpWN2OstIMKqH(~azP>^ z%hktTdenB0YjR2#aVYAitpYBqFCY$`8mP@2#!a%gDtpwb3Nr`~i_kC$tE@`Z>E_aL% zYG|2Rw#KA!!8K8YvEV2y_^4i6vi|@oE=OL}ST0B619v5fOp*xx4z=f#!R5OQHb-M# zlFKd%zfv=jYtJ<+nJx7hyy)^baaR&q6|gO9FgzNA0OQ)GigcGHc-`8YCc(iBDeT8! z`%c~jgNiCLuoKFPC>iUrJYg|a;atAzidW0+sp4RxkyzZj7cfd^wLtHMJ9^XF<1y?5 zih?u>#fj@fmBB{En^_BwooZP~L6KF~PI#zpu1sJN$f`nS#*XEM!+TXLnGWVEd(_?^ zxHH(@J~|v#DFYDI&kbhTF?x{6azFso>9=4Y^HqY4*=n66j5u1>#+M>7iKh9OsI3TM z5U&lK)J_nu1Db{@q%Ks90aWxB<;f*XbJn4aOO|88j+G3kcW=qfMfQSJ#;2TAyYvKD z6GU9+ClxwL85^*ju6^-M14O=Hnq8_zI#)|TQ!59?mE0M)7l%X4w>q=z~ z2zAH3NprSRimSJ1#aA(i!C4=c=qWXEr()905rjvPpHod1cgn9dqN^gVTjm^(r{h&x z-GEY^t5Z$Bv$jcNys}%p_}Zb0u=)^q{HZtxF`qp0+%h8r6pGtUILFqkiAAc-50?zy zY85j{)dxa$^GLIUb*n zwN}!?tO*!CYDie2$-q&Qo(Bg2RhxT>g{-H|gbu zzut4V+I_XH^ikYiZMBuN46*PC>xOUPBZ|spePdX-L3cIe=%wS9T#+J-e59UmS3LTU zdgzaukO-Q_7qrNC4C}enaxkOYxHY%Q*KM+`v74=wT#2P2^Qy}Eklw6rTbJA3Pubr!}@pvVDyt^jNjc**4R z-vXkJ!unh3WYjEViKN;iWn&w2$0MHQeweE-*Nl&HcUA^|zfAe9B4rixnWEocnygjztP? z*S(H9k$1M|pQN|;x3g9V(`ss6DK~W>LKIhmnFk$NBfIJ86mAgl7yo7FiuEp7TM2C^#GdEj^&^mRD8#d)n5h#Ln<=w1Sun~I`!hKi8(As z$}`VlSxHLzgLl+@^wNEymvI;apzVswmSl|Kq!F(^^Q=_(y-%*C@D@*ad*l!UQ+(|9ZIq8qMRTmnths_IZTQ0~3@Z+UgX>*$>K8G=Z>CPMq@fjvUzrsIV;bnRi`c2|r>2K$ynvHIi#?bq5kQz zpxwtT@mr~mY$ExdWQC3}c_4d!U!_}?;@N>gAUla>+DRw}MLoM`>VB21UWYwcJK32M zSgz1K&C0wEG5J$o&OPx<5|!KtCblB6Y2p(Pxr~5&)oGEHKoK!2*#pw9=Q~9LlEG+J zIMrEC-aYAUUwCJCP0Q6sO1$b^sgXWkG1lD$piDC?62P|?CZ~?A?XDJ_>k?t`=1Vw8a#|cMp&B9O}z2zMUYWzf{PrnfVs|TAQs^yUEAb9yS_!mMPhfWJHN}Gc)-nFJ0yq+ zVGSVU6VvdjuW-@EWk`+yAP-YT!o}$lF&S;x^yaG@nN;Bycdyc$EbjJ!gj-}Q{6~z^ zMgm5yD+YXXv!yGJ#IGzw72`eDsJwBBH^&nshtiSl{L>$big^G%62c+);55i6ypgK4i-D$mG+dxr#`H#un$0qp7K` z2#z4ga}nTzDc(e*YeLFE7#S2WGi7(0)>cF)K;u1Y&GjwDMiMsX&m`BUO$E=E#z$3d zbB>kf+Kse=_E7lUx~eQp%8D!!cM*!5NJc(lPrXPHutwzqnnL5(6>m`onun4GXr_6Q ze|7%=Dk#t{dXxxdV%=)#0Y|+gG5LK3NXjH(+PT@PBZ!u6M-^x6;n1DHVw{3F)|yJU z(u9Gs4WckddaW|Fv9}!sTVkosb5P208DY~EqH4sosc*uC{-}%V_A|(Bjj|&bJKT}iGb;tV}sJ01E>X$Cac6qlQOZ{o=>2uZesa>w>zV6;uX-6 zLvkc}h-`-9rnjA0$!u}ntHll!gYz08fcd9!!1Sdq!$yYWloBcig0K0+j-t;npBZD?!yD@ zN9V~kBsR+ipl&C-m*rErl}_SM1PUgS-V2~$jJ(9|+(0Cbn|_36Jw44!O4^;YYFVU9 zD__QADIBqEP&Y&YR#VPS?uXNkl~UsEZV_QSpUpUVR!@>YKv^;dIXDBoEK**{EzI|l z$px~Ux)J~wIOsv=tv2sgYiUwg%tGb4ieEWS?{bI_u;=p?$2he&%8yQ+ot3p+he@a3 z*~CqgrhxE`km@~r)1P!L~Q1NQ7w~3<8spfzug3k4kfy=8{<4Iz)bG zUCz`v0lD?y^Z8Y2OtV|RniRx~YqLi?Vk-`h8d~B9#nfKZNm) z-;YX(XO{aUlCX>b0PEhjE_^t*7b@%?LpRUnmQ-E6arOGwPa)8)^doH@xoHt|vu<&o zXtD1EwEK?keKGiOJ^R#JP~6%m<*%(TZ|ByoUwIPKr9bi&Ho`t14J1aXhvJgvKMW7Chl z$>Sd56}N3*t0Zx)glP?=oJvRx-!4ex^vM|ft4QJ{Z4I3`^*o_8sT%qyBZg_T_#`D` zmxG4vNa%R3qebvt#1|0UylryqHb)SBs~ZMAN$LPzoMyc#(mN$dE}rG01-K(&2cVAw zI9_vEQ%fv&?k%GV3`J2v!NV!!@xeJipL|g{&$yJ=*+w;vi+voiMdlbqtYpaLhQ%O& zIQoXkHDt!t>=fK6`$BnSth=$2Hy=zB{D-YsiROyxU$i25F_lvo02v!_>-7UaLq*rv z?|kKuMkjr{NKO+YJ3^0K<2_IE&zk$Qs-0a@YeOej(@u#6#2RJ9M?CuU@9)Q_f={PS{b-6_=Cmj)SN9#X2}; znM26C${)O^r`EDf%4(Czj=O-hjQ?`=TW5f~c!({Co8letN@VMOgByyw- z55}%XF?obCNf;Y*v=6;iZG$sQ6seNy^06FxoK#UkiOCoMsrJDXt~(N4Z;Y8CL*@>k zV1>2;_Yz0$Zzww~1wq zhzu|T8qC!-8T9)TaTI1)_{j9lSkx5VTLgUYc*hy57O1hpfl&g1k`E-&q77Nk*z0L< zhkG+J5xH34jGubz;g8PdFbD$&J*xv+u(h4-r!ei8cq&5o_pN(d<+0PJdw}aAbCndV zmcZoRQ zm9da|=8FL!SY8Pv5+(;@)~P!)NMi`W6lI^Vr%hp!(aP+~Ps@Rdm+bNg3nG~?2g~b< zT7erycHrFDE{;8k)=XDXvU)v7aP zlfl6vim&##{{V?bd(lOPdt!9yP{><%0NSa+-i`>+WIf3>mnkdIXFM9e zrSBS3Deh^F7#}t(DmpeqR^@ckrc#q{SztV}uWGd|&8R^HNwj@BQ#|I5GqWI`)mS<^ zkk}90R+6(VLqX20igub?c7;`%X#hU--~$X3RAjPuxGjvvDMj5}N$II|Cxv9(t{WYV zK3O-&8ZZ~v6&zM^O&dQ8x1bb}L*?h+r8N1qK$zmp=N;-mrG{IzG~zNcd8K(-zEmJp z0I>xps2HJSVL!@*k6LQP7~?#ebVNc=?>{<84&x_ea72lZeAFgrE#guaC$Y^o>4b{e z<&ULRw~GLW&OPeUEf)>gWyfzyfV4hn^ILDAr^Oruf_djPEyc3jY$yOL-jKyeB3@TH z^s7s88Y%=HNKBKrBXQ4Oy=n_|l^f?FkaVZ+jNL;H7@1i7*!fTnq?%fVkg>wIH%qi& zI}b8aPsqL7rAKjO_EX%+14VMrDMXRi{#lNMf_fiHu;SJmA0`HrG?FvU3j(fl@}8Oe z`c*wf?W5D3WBbemYJCade>xjhHKy8T632gWB=ahx8(qSc&eK0HnZQYhQv`0W!=xp zF`N)Op1rvDYTgFASXDS!~Sbcr{D{|jcohOh_uRvBzl_4 zttBmv$j!+mCFpub+978)jdLs)F5%8%^9KCzz=OLS9zFf}nMLRJhUgMS%v)tejO9jn zARKigKaMNU?0iE$qp5$#xx6Ych|SL7-yJJWyjwlZr_%Q;&X$aeFHvK4$m;Uz`oZocnQ~ z#<6u@8h}#D*`zi>R7f8Hy92n8dv+h4WNMxuzSVCc6S^o7>~}-}pI)A{Dm4m(rkZl- zb(eaq7M6;)7bI_0kyTWZ4+n#h=smcuR9$M`B)y)-!+XgnEXB5hLg()>$G3W=0!MkM zK!iTlV4M9xM3v z{lE|&EvEz?c=~6bP%6xS+E!YXtT&ee!q#(vETw`1ymO3m+dlQ#+clh;6!uWYtvoDU zI*sQ$gAcDmRW68{NnyN>DI-SAZy??nf=K}N*uh7C?mH5X%IHgl#Kj= zx&Ht>Rf`R2XP(!{wTgS0vK?6b!wtzNJOi9pWMzGfJ(pXZea5S3?C4ZRT&RjLyIqEI zNc26w4|=Ayh6$yRD{PUnh$Y@ec-$&!CK^-QEAeYAat8{-80RE) z?Z;ZXCx|}C+I&VyCXrh?AwW`p4tvp3nv$~|U6s+%*y%Ib+<9}c#F!GYE`C$N-Re2( zjP$L$JCEK=<}oHD$qu`Wy*7+?@A+0UG`G;I+d|v&1E4(xO=A_zS4?Gz!a@L$NC+4_ zbN&XJr4=0!lc_06?C4{SWxyag3|Ur280VG|rcmeWL4WQ-{c0xM*(8OdTe2a{Z@-qhAti#QgN zc;$(%Cj}+>)G`6I9;ZEctGaZ7E`f=IIuI0`edF@y*yAUkO4ZaYVkKK@GZyWW?VJs zM-+o)&i??K-_2i@8@K~F&T=^wy*1q3b2@gtj*{|uHD9xs*K)w7H4fXz9-Vu8Qbxri z4A41#K5h^5so{AhvuQrY8H*1opKET z-M3<8iQYV@ToKCEb%{{rm4gldH6^r6h#POpy%(Ve@uxJ5$ONU8_kG-T9`#7(WM(BX zlec#6I2=tKD5h-Vv^nWpka;%de83wp&!W@|Zd^V*_yjpGwg3t$uPNo<0w?ATLN(RS^~Q5Mw5o_QfG=I~0C-Ju0)@ zymv8?I6JxpToYGIf|zLr4?<}4118}wzSIq{Ql)T9b~NO<)nI+j(GlFC z>?0rZ%;KpSX1Sf@z(t7QI5{L!uqH=$uWHC6YdF?i{r&5JDp++bZsyN>n|Pe`MfCdB z^K0e}zE~iy-aJ$fZRI?1`KRR{cRAvVAh^1Aqjee3;z$K+yPugg(_JDw`V)LUh8K>#tT$LYmvK;sM~?gl*=z67F=dzDNU;nrMiV(*mZ3BPrZ!Ng{O^Q&dSo zt=u@l;*03jVO$)V&`3y3w_4A?kOov8%?uH>q{a@A&EGW)fDSmTx_YcyGkSW~VQ}n7 ztZ6M-G3q0M&<<*?-MPl~P-GqI+Mz64Jt`??O{Y1{YipHz6s_elR5Yrfl8JH_r+IOTsG!nMPD|cBYCp| zdjM*aBOt&y70|m9J)&2@CkB|rLBrq^(yL8&AS9fV?NE8f;lW@*9WzD3#nUDS%Z&Qe zN`%NuWQOThEv?o>JBS$XQj`&om4jo}s6}yV8r3k2?VRQ7Rv&zycM;T&IYJ952 z08j*r*wPrpi+qgoW9S7xa-!~4KT1ek$d1S5AmG$3FjCoIaoCywa^0X-EJClnO1F;z zX18?;=uv@Cz=PMXL+@GgK@I$5DxJU9smCAL3){-&LFh^CKtFaP{s(`#ww?kMYoz3kKYm;3Y zojEZ+@0Lac6)HJ6$0Pp$uUzbUhm(BwZ92(xu3e>+g00s)e-?Ao(xB8lN2p&}TU$wT zOWeorQ2zfO3-U}Gg~1-QIQLL{ec~EQ1xd_B%vFpsG3dlX;2%;SS+Q!LcktAhwD;W z&m`A!T*%pZGD~9_%|`M02(h}1l>{peKZU_$nv)i!$0QH*8hDN!T-R48)#MsR3_gApT@ef|U)!15Tkv5qm zk}9l@OGyHp;YX>@u*bH2Ylfq8mnt=KjX3Mnt7jG6lf>4st44CI7+;)V;{m-6N2ur9 z6`^jH?FFJ-$q`u&^B0%90I<&>@qwTIwK`8JS{MsO93Tv`(yF7X7umBg9W?8GG6rkrl*D#L5plW6Yz_u-@1DH+S0k!kUJI6a!l=nm5Nq`XQ^j#cnvKwc2UuD{B2{ujHgd(Y{VSe*D*dK{IbxJeImAfgmdVEz-A-KVn2NTI zk5lk1#PVs8CCu2Bu<3?Bak^*J*H=6do4xX}7%CWbSqkSF!0FRJL0tBQZKmnA5n9O` z$8l>G)&TRn8Dsh8uC4c<62Pw}(zt0s$yUh0K7yW)LzeA3qQv-lRU(}dS=r=2E-`_Q z4}OCl{PwC1t7z&urJ9C^~b~W4euQXxd8UEi+S^>NQKb3~nNjxj!%9 zGC1qg*jA0CcVfypr&jXIr zFdMVe9eUP9&YdNj8MN36+OsJUNH-~A(YfSv?^Ogkl=^9uLholR-y@d!$Ooe^AdY>z zbvVUn+SttAOzUyAU<6z&{{VYAz&!Jwdiz&QV(sQ?rR<}0?zU!)rOHns2+%y-GlWu% zaxxeUoc?@fwIfIKOrJbk$IP3{;Cf`5$hozWK#Y}MAny$h%oVX#kbA!}J%0bh_$ zTA0{GBNDjUSA}kr0UW{$MM84Ty96oZ52a^4=glaCVlW)L4DnVam(RM7bbA0eU=1;1 z65PxppPqmP>Fq_pTW4vquO{N7C!T84d2&MKWAg|Y!RieN(%MX)EOI$quqpujY6+$m zyC-17Ey}1lKZOWPi%y^H!s69okzY0_} zI-04B^vMFR>Tt4NNQIQ`Y-M^? zJfFMM>06>0<&{E#MK=TcnfIcdgnLp*=(uCjo4I6qBPG7~CZ-Xuu&zB$tqCDOqNYfU z%tB)|03fgc(IY*)nFRAq68wm7t{&Iq+6k;_=4q!*$%@#J`KNR9SvNdhA;%R!&W_hD zp~^Z|7?ok*oYv$Ac850JxUOk!WLDhlPqlN?_@!cDV&S?_g_9)uRyF1P!e6`c`c{(_ zMEQEwEzFzUfa_Yj+e1j&`kGsoXa&Y2M#ebnQmhjH0A(f6zEVj!h;>j8)~ee^s~anm zo`R%Sc;ncrSbGXlPj(V_*u53fM-byJj;5j$OC+pH{Jp9aMmnzVMF3gl7+jU(iW z0H}!~$|v4H&jPKp#*vvA@$X9Pr4;WQM@&^om0C3hT$VfoK+8~h4;f(C$0St;hTh?s z(`W-ZIqOqOqBRR@8M2@d{=Mri^ZgkLv&R^2cY52d-QG?KmPRaa2LqalC|>g7G|pshIUoXQCY=Zh zvYZ2h>s8!rwUXm@(tb$u)sKJDvU;7ceHi=2FzT~Lv-ygxv>#DgvDn%siRU%aH1YyW zc{`DV;0%Ad3H)mg(UZ;0hb@lvs4b+POL%wrVr=blxf$*FXNsq_jNn&W&Ya&MAvHr`J#zsV#~?+QENbNsz4r?t9EY0?A) zmP~=XIv-pf=c&Q}0PEKRx-`Vc-)pHPT4$Fm^T>x_%wYi-=aI&F9CY=lCAO4WZUurW zwlF<8Mh`h0_3NIa@u(U&Qq_y9jHy&oF_1@~{7xyjM`MvnTbwh` zZ)+;sMJJmZefIMC+($vzJoo8OitS*EOV2F*paQW*tIO{9?TjA2^!-BCHpIYJk zN2@yco9$qU1QIDwIt*aqw)|mhr^lyT&t_wSc-vyf8@PNPLoyM^PNS|xaaVSijchKZ ze=%5+-#+GEoUrNv&l#^;g`9LbD^qJzvebNir|MTxPad4nNE~ltf_CGcM_;9MdLF4~ zs157BNLZC<$I8lmN9SHYZm1Q*2Hr+j9=`S5crQ^@WwltyVs|@%oB`MK$gL!jIrm3* zb7Wf9TUnMZufnU6cZ2K*=bZK9ip;;!ZtQ%iH2a0~<-!J&fhGn*=ds8Go}|{*-jyBP zQArUpvii63KGkY;MT#VtVnkuJ!Oubu=tX5Hrf)*KrtQ$@AcsOAs5NP3|x$c=s5JoJ^kxBb*Sfuf0ZV*=HWnJkIs0>dW< z9S^Y_{{Z#sxoxq|>q)z@A&TC{)@4L+NiQP(;4y)bQiy!$Bbq5ogYyIGD(tXF6`CAn z7w+WbkH@Vwe5lm}HUQ``#wnRQGM%i;c_)}83N{>VY~*x5tv#*dRN54dI6jBgr5h&_ zq%o0_R2J{<52YbOjL`?l94l2^%&cK>pvreB9OI1onvJ7Zkzz!_{uMnMuaX`%jma(Q zIpV3sAD1yJAvn*==}8R9noEl<%!^8C$?M`P{HXa~%z zDu4(%T=RlGYd&uxS0;FYm+x>g9~8hvy^b0F&-Phd9*h9kbMI2l?Ia7jGZ&U}LE~@J z)`V!wq8u(Va8K!0OiW?hBV?bL07pt)Mq}K;99M~Z6Ekl>t_L9dk4m)qjk@0$WsRAP zKr0SH$YEL4L;#dLki3)aK#2>(xkERaxhE=fkIJmgKGiXz znGpuyKscyve4`hbQRA0?KnEkXYDSS6v7Wi*Pw9$i8I<rxwpNOqNVLP!906`4KM$%TbM{^Ls6C+GzzDw(4=73 zHqz&exM9fpRV8v8IR5|;MI3sZg4RWNf4rxHYYmu(I2grSnWQbWoZ$7SobCJk{uQ#i zA(0747$nh7-4W-J?TRUg_MDKp98v~m>T^&=#m)(k(aMZV;F54V zRf39CF;ITA#5A)=!ys|qtg4|;T53XF3uFOKR9N`W80|m}3=|Z{KJ`-O6>vd}u=cG3 z3dpz^UOM-tY>^}g6LfvsH10bY@T76Z0!G=--8|Lxff+L38F9xQDtB1pRXy|0DJ933 z@|oa= zgskcTAY-4#y4_z-x4nYeIV5i;Kce}ErA()CIXQK{=L_Mu?r!`=9P*9Zq$Wov8PBQh zT3XUA+^&$SM#|eI3J;cp)UfJnZ%fm(*{>cOMw&?=1U?8@i|34YKA!lkXy>!Bxi+y_ zM|XW5UCfJ>h@5ktes8WxsFS(13Gy>5P1Rn~ds}saD+ysjvM}8KXuu$l-4x&-e{o$^ zuBe1r!V=YEkZ&_GHdqhhILA5U@z3dAcd_+5yW5ce0KSZul0)+|pQ$|b{&jXg5=jPC zm&{_zw7QMEe}@a()DGGAu1b+@>9N}=DQb^dXBM$}yTd}bV$4F|ADHBxg9G&+j&j^y*f7#~ql=$;=p4-Z6nb zQb!ma`Qz}YSL!JocZ&Q40;;k zCyAqxgY_Lj>rn=DeaJ{XuxnmLVRN3+H3&7Bk<#HLc=Lx*jpNYfwxF5BD9(XNVSo;H z_u$t9;L9NKo1mr`T}JeFBuUREy#-R;ZINyHMH~^^9N_+yo6rpvK64f>N@| z078y>5OY;o<7=6Ax{ic_>-4D|p$e+*Jrt= zFme7xL2WTmMDgx*Y;GKpp0#{Re$KKyOx|V*Rp%8`Qo0s4rbbQYegPm3ykd)h;bx*; ztHR04E>3ZdxuW_xt@P(ero@r3D9z4D>HMkjUzsf;oX3sBzh(5#)~Ma;Eea3akC<}I zcvd|R>qrS=iem{Siy00{&PXKkK9wS@%F0wRWjumEl@Q*~7MPpunpxKwWjF`1$6hm2 z$2*uzlc|Xp_(SLQ;+PGREsf?VDo+e5TX>8}RnH7^2ps0AH1XWrBDQv^Jao@IAEjJ3 z0wyt|#$+Q13wNXzD&I>3ff;7Po?D@+_V%hSLc<#Yjp6h6iJ}&g;@xAsw~Rkl3xnRR z+aN6I6DpvLu?*cmAEi5r#St3L*l^A_kaLsIzA0~a#{er5;XYH60LM=Kt5M!4p(X_^ zqm~1nd(}&iCV0y#hX7{>gP%$+7Af1yZ-leA%PZ%S4tu(a;a#GBnX>z=7VtVmJ zoP@yOoD)$vOnuRxT6(ZB5JBgmu9UPgY;Tsm_U4L+yXUZ?s7JBG7TEb5(^-n1w5>d) za1>Q}9rN=F;73trGrPE@mDLcFSVPS4nEKU) zxLll}!01nUuNny?-pT<}!9J9iS6f+QDx^23Y8cTxk^tbIbJC{s_#00qvt7!BC|B_{ zW&*Jxb|A6jnwu0PjAWFl$IH)JkeQVU+r4@W9%{3@NilU#mB$AiDnQeKLpTa}BvZbj zZ47Nr?UL~lMPQ4ZtbI@8P^Pkyp^gYn;5YztTC!V4U7KlT+l=?Dc-BokOETLiiJJr; zylJ)wg%auQWb>9aW;q_C9<@@~+@iF_H|#kDx)EC!R?DbBC6tJG!l*pfRm({kNZMeL zkB|&?p%jS4`deGebu=-9C*4t=mC4;s_ZJTN;Pe^kS9LZP(%6 zAbvv;*R?u)DxmZ{ig_s!?n&uYot>mC!vdb>cd@rKL2afg9ltmpSpaf7{x#BRbJ)vd z;bdQxK*NrIF5TjYxALm-Pc6KGk;p$*cAKrClBcUR&VAQ48u3!_$7H$x*<0CzVZ0bH9hHK_=akUvh8Tpx*3}f`E z<+Ie&p6IVr=@gO&wFWYaT3E5HOqa>k_paod*F5J zSo$T6&Xc{I#L=-Ffyh7Bx-&Eq1Wnk!X#y-o3Cu^n?%f4UmDuUN=1akCq*+MQhj_#9 z1n^~i{{SJ+=TS!-5NX#l-y?mZ;{`xrfKNe=;Ahv24z;7=tJ`#j-Y+lrFynStJDWWR zuOF!%m1@@1U;U2Z6(m&MGl>*{&9|r1r{z)0bFo+DvFGh)eys4bDf47OxVO0+`ePNg z_N!;7MJsA?mq}F?-6R=2FUITjbR1SqZY8O_Q zhz#)~NQGF17#v{!1XI&yYZ}^JGnLSKFF=Rc+? zFJqHT)NUoTn8_PQy_c>sPj5k35(ytNHbEmNJXJ;~ElJ;Db(^%j)MS=5*%@z@JqM*$ zLAicVGCLZqa>pYzejPthcm%0!E63Cjy=!Y(9M`)#-wNu{>DH1n#)^aQlgl?f1$L(J z-?WpfZQg-KSCtq%*P7|NEz?Q5bX~~95EjEfx3zj5v5-Kl*5)6Vi10W*oK_CWn{u}s zoDQMkYq>93<9OO8C+7{o`uo)jUk}dCOv+VJz}iPG&uZ<=0?tR<^C@C>fB@%{?^V`Q zJ4THjer{Bp8l@*=HjP~zv`|3^vqf0JEx46EzYe0cZ0BTzx`E}e&rW$C{c4j%v^SRF z{FHEtTLgkrvFE*6p2ZA|QAtv8-!KG>a1R}7SkUVo@{xkkh3r4iO4Tq4225Zot}$8A zmhutdI3GiJ!zKyd#H+07b})4-j&5;J>ZfU)!;FJMi(cN zJwN*Nmm*&_DdBZ@i|;5IC%5TSTtu4(&9tvZUI{1Ks>3Al$tLon0~?3&9@!MeRnc`s zy}P*+1o=(^Zs*dq5QX^zs|=DC7#ON)Z8F$q-ymfOi0_V=p-8;K%MkpTk?qdv8v6ScRO6~ZdB0lAcXwJhw7 z4kKX9r;kxZg>ya~Ce{#6PWNKRC!EsN10N;!mCFosir_VCpbuh^)Zjr1O**9qm!JAuLXt}7ik zIrR)=B!WJ*dMHSbem+{T_AR%1sbP+_S%a#TY_5Ay>^)17O&^v(QN?0k&5PLBaf4T& zjH0#&Q<}@wt|Lo`fyu$=1Dd6=4|BNDn15qV#ODJwnJ>(l!RNJH@au=sXFC}|2ZPqL zFv4xyxXocp;*lssA~W|usbY}>9mf>AqYs_Hx#>?>Rhxeqt=U7q(H?L~=cg3d@an~v z0QAj7@sw<{06pqbS1Z9PJt(-tVk;`4C-JHCW8=Z=K4+Cp{}R z+eV2Dy0y4BB}{CpP7XN5H_BUOZQ+~H^{ok}!wDR-hU@QDn(`>~9^3{zah_@1RuBLd{}#ck@Bi*T?du^T@A)f{AZ zsphcKxrb+=$$4`vtL0@x+yEVGpPmyOjHGlm=vLOo)C<|A2+YHI&#z)D2VT+E3!V1r z%&(UqbB=1GF66X~T{7U<-$8NLV}eJudL(zT-H2|sg$!^2?eAW5v**XB71;Q7O~s*% zFWg{Hy(ytZ*xb}@W|C;*1IoASE0fP10LMy_%JNlAVNJ<9L*pe^wN9|%hWl5Q^_bS;7s4=AW;_5f&-Jdt*7ned z+wBoKbGf{)l#Cp6j+~#yxzFr~?$^$_Rr5gk%kjG%DiqP6((ioOZb@RqkU9hDO$o~T zosFP`&30ptb(*l+7y?5al1Lpo4tmyBt7RqrxdqZsh*}dH05W$5&T-Qj#a+_xBeaKh z_Eyev%rFnIs*~Ntd#fe9Y8gDIVpQ?lAE-SlWn$qbnOjuT8tv5<>t^WzlVHX;$51}C zQcFa%)+gACVU`f3Imuwh821=8p{2)n9kuFeQnH1YbVmoKdXH*`;?*v7fh_Cx=LKKyw?%O7?1{1equA&SD`C}+ihmJgXIW~#yA5t=FnN(&PK?NJ?pX2 zV7P=LvbfwnV8m?DHrQczfa=-c5A)u$y~a`0kog{Gn8OeE2m>S1xvPy)?WRkh zLn^k`Twv$?E2h*EIjp{2uFTo{+3DAw-7B2?3^!KS5;WOhNhn9&{C#TBja@s&Yj1X; zWCq$#nW6{-2Isi{Sxnp_`{gf*7*F(;JUHJ^J^j6>&FWN4XsDi0)7b&q3;HqqD&~ zJR4pI;gEj=depH_o@%$Am~n+*bNCPc09`=Rd2@yNWiP;BK;zd2lNu_tKuNH&`GD>i z;fm+$?r4tg%6S||BbWQ6vJunY6*T&Ny~#&-gOtt*sXoqc_IrzWfW}+u4QFYW8(gO6 zDx5173;zJ?t&4~wh7wC~i;_w2?_B-70i}{+P;WcFPX3vuglS#0ml9szZG3)rNU zZP8J7llMnIjdAiak{L1hR-U-;HT?4&ZfQxzI#ytXoq;8B>MNo*Gh}{Y-GT`e;O!X5 z89wx~LR0S2e8liM6)gkZs$6=}hw*qAm}$ zERjj&<(nDoD~-FI30RNL5oLEA4#3n>Tux3FEDu)ZtlQhhKse96Suq4)RDN{%Qzx0< zLo(RxmD$TNJ-Z6c)Y>Sejq#ZY>FHfSUo-DU2d5Ry_=e6{=YiA!yN4dM(n7h{_<5Q1 znadC1?O5^|eBYH6$Bs^GW5au&OSufCPT%QRGuurhyAZm2)-?V(6B0OPSG+2Cld#7X zpn>8A-c{$Isuq?a$=&6cGqKJ|=ASq+C;|4LQ(IiC7G6|k%!GCCPf}IBT#$WgtZ=f& zxpL%nCanS`QI^@XbBY4wj0|y-Mm~azNTrOHmR8v(VbZ3GA2elIh{t~P(H7UlgCjJZ zhKZ#qmQggVes8jpY=l?RJDCV$ zf_r0uT{11a$hR`Ys-0s~*XxSJ)ux(j^|g)@<&nWv&*$ky?gt|kq}qkcv!O*NB(SZ` zBG49`kTL$PSpK!pPKgbmk%o4T;}w-{XzDHHl0cTqcQ6O$ma9>*2VX;;E6T%?C;yPS34_UTVn zg|X-pF5n$-+>&wXJJwR`PA2<2gN1Sq1_J~BaaVwLjnSQuFe{wk;MOj!ZqZvGv##e+ zoUgS_in+cNOxuWXrF)vtw9^gj8zU>X0OvTtJaff!I#!__)B!j7VNOhYx#^DLx;U@J zxPuI<8DLJ{zvujEJqEQiX0!V+0%IfWCm7_B{&QAR*1{(@Dj8-f6|zbBKqrCIsjHV4 zNp~ch##KndXP>QM2yS7LR$YvWcLit0?*0D&FT#ajXGi8ETM2+tn=$vZ-@RsB!4!}Q zS`DRJda=$^=zl7?<~g=kiGpNjZgG!J)dR&ETMsYqkOm3BC;tG|Maev?UWx8Csib1W z7bA0b$E9?7e}*mX)+UsRBxMAV(M@kpVFb+s-NKuZgG4tBXW07t8q?F!8Mc&I+nxX& zs+^sMW=E$-3>&0XRs#eYNMlx)cu+Ceo-1DA<3~9mj6{ZwdV|OK)fCf=dacaOJHAm# zQn&!~QrIGRSM2fzDi?73?05&aU#&xTsKWO~5wNna3!ZnJ^&g#05o>fUD+feUaK~}v z@yAcfogKV>XnT00R*p@_EB)?C$6u$VA(XFetwpO#6ilpyw#ZjGBy`75de2*Ee#<9N zq!!8h$B$3*(zh=nxfan+7Qn=f`w3j+j-x#ANT~G%fiEI=Qggy81HnJjp7hnkauHdr zgYSjz6;<}G=+u8z*iQ7cPrY77#P%`2R4IL8C8r?qKArJ_JfGs>9BMji8>-&$>} z!41N|@G3gCRnXut$?MGkY3bwaai26Z6OGv%f%L7BtUUG~Wrl6A#@H$w1M#eThaOpB zBCZcmdJgpjP{|JIQc&cBf!KsM1I#ayGkyHxf{Rk=vzJy^`8kouZT|3<<)v;nSy2>p)n&4aD0C zC5vRU0CEY(82l-QP0n83GYCLs1 zo1PGM?|#(*i>TU|qJ1h)-0INj7R9l7cFR897FxQ<^v;J7N^ zKOZm$ocfLhT!$9-lZKz=k@tk#*yD;U)2QuHBE>ouWXE$Na7gF9HuSW1{$wo7{gInF`eu;XJg+nw ze9F?aqByq)BPZ$9W~y6TygBoXa(vigpn>c$S@znJ+`_ig1u~zN!l_@E`BzZt5;h@l z89FfM7^3>vEv3x(<%ATCkdkt%xO#h5|HRrx3pUk={CK9Ufq;bbuxN69eiFa|A+*>=3BhsshMn^av z)RJYtgt4fc1RM++=peeT2?Gb~QmU>G13jvgGJL&HKJ{T-0oH*M>^=I?Q0{)ukHU&B z2eDhqp*C#i)YGmd0xS+qL*^E6B2UJpj2Q`Bbn0t`E1eD4pHKOr%W>^ivAw}yKMJOU z%E%w36I}p2wN?c2ky;`de;~NdFgjK)zIQZj+#HJ9w6!t98M1ThSUx9|Bw!WiJ*Z%g zlf$I7jmNs@^sJ^Pc}gp)ob%5$r{P>Soi}W!^sMH$NXcX>r1kZzA*9%rP(Y_rU8zLrk${dAQ5w+sz*(QJHun)|qp0 z601yST#f)Oz@qLr+AY3gpHUvqPj zwxU?f5eVJEW%TP>kj}3vvwq|%?IUh~3au=#!EoYIcNNGdp*iFVL);;NJ(;#xzol4Z>&Du7ONgd5x zNN00xFqYg9OB@51Jx8ro7nZ9evB>#2#ytgd+BUH0TGfvdGL-|82SPJZ>w0wX-TkWB z$qo+SDOhOeFRapgb(YP~nbd{t->p`+))`|x zTicq76uFMok|?r3;iPT+W50h-TC~>a_IsI1INIz`wt4I^^ruB_xru2BRvT0gx&S#j z2kK}7o5vJl*_6gzw{DHt4`P2Y`q1%A^2X~K0YMm3!1w9(6kX|YT)XFpfMde(gV&!< z1!!8u654Idn?TwI{&AY28S>e!+!4tHh_?ZED`aI)9YXBJoN#}pF+dj~zKiWGY92O{FbQ6ALFrWImfL$R z!|j*&T&WJfokweJbrkXkiCGs0A~;Efs|MOB_sGoAOCiA{)ExKi{xpDd$CIrFM)Q}@8^!*BPk4l6qZ#4{ac>DN>&}pFkMFsX=;LH z*(ivlpDTv$bM?(#NEQimmm*F`Y+xP-`TqdxRXe$Y*bA#z*5X`@k~{Rt8Tx;PO0vUt zo?|+L@}H2LE;$*^8*Bm#l>0 z0UqC9!kR*C)AHBs?9fAp&PL;aMP}aEiJgR##~TGLvR5D;4*+*R{d&1?_N!||hlyO0 z44sC0XYr)JM{8nSMS+dIeR_52K+KyvZ?Xv(ghRne3hmE9gYTN&OQt)FuaH0i^Vhdp z#8f@l+enu9y?yF-WMFr>9*R5CLhPZB1a_x!Si8B31z7^(x$hDpixzeppS5a37U@j8 zOMOjcc#+&$wgLR8Y-t+41d@4dZame-699W+sR`C+kVHm95P7XH0x*)wLC8Bf&(g3V zw^(PmQVOY&iTCEY;Qs)4#I$9{n+dSGmOKDCq-WX=V=Py$DZ5p00sy3S29?l;3XjjB zt?p7ITZEh{ZYupuN3K2TShGy1Lxu+-w*0jqiZgMN%wHVs6!09!%uGIR3m$(el8NIE zqjcxx9E?>rcxP;(k#`;&wGS=F+JfP{u)Q(HeQ6rtLYZ{ixZyzOGzH5p4hkxO7+?}} z%|>OOFo17AP#ecUgzGCVTR*sM$9lW zaY+TY*>09h9j7=0uQZ*&Y03M^8nUk=(9|eQ*|$)|-}}x#AzBgJ@3?v9R*8849!@=R z?^V2lZsQT5Y1O}kaz~{#u#E_UJR&z$45|wO(>~IGXFx&Hzr{17lF+RdA(VRrUosM|==hB)HJVD`}XytOw&L1H5{{SMaU0FwT z5=jrtgcU2;=Bh?Kh-Fj&s5?kg*MaL-V4u!F+lsgVZE=DJd;>rkO%1qdn*ruhQ*RvS zpvQidX5tu@FFJWz6jjIW&J^?1)R!ZB$tt8vkXJi1yU_mtI(d#c<4?7qWKu>D?&;U* z%`h@<1Q!;wc`lNokl0oSAezcHD|HL1HpE8TjB-E5wBEuOyOLW~`!g#p;}FP^dCoxZ zO3?j{q}ZP;f?8Z;Dg1ge;NPkO_u%az=mp^(09F zwUwru1iF9$<06|To=TG#R7`WcXCU|X#y|S>F_z%6f*6puma-@(EZG2%d-tin%;W;n zM2ZUFr_EL3wz+|0jS9I^Lo=~E#ye-eaDJJqzh{(2a6-61*ejeLKs(g2*qJoTN6JAO zE3Y7cI`Pd%9JA^3r`jcri>3h#04E1I13dALeQF79VtY;ZvxM^V^G5849ORML6q;>> z3yBg_<_OQ4k`npA^*s-IEC)$$%>}YIn4%(saw?K@jxc-GV2bxbSp3K&lw&S&yyJm` z-+uo>_&Tvwvsj2czpFTpkJ7QhWEhsrE3N5Q@gzuHb!Yn7)dHh zf>{Y{V2|_Cq-D2~F(R;bY@N}tB!SOLy(~~Iy9rTVHf;RkJpMiFnj$sVe$j6*I9-w? zYBI;1anm2+Oh;30-b@=43n@_8J$d6FV96Ke7?$ET$LOAX3O#7IPHgyiRwiix#I46;NH*kb^O zPI{6uIIO8OsUw-%DcL8G7{NRoV?Ow(tz?ejV=TFps1f9FpA)`5&_9BpW~85Q`+&*SS^*Hc`& zi0)um;$!8sXhXBFKz^RJC7z#aV=Mt;0(lEEkUty_zz!;`tRq6^D^1^MW{fdBIP^H+ z`tw=#z8tl-ktU3d*yjt9a(M6RD|+X{_Y&!EeI3bJ88IXbK2k{Rdt*81b6Eu*&ducW z7&ysXXQ=o5Gf6NR4xa_IpK3OtHn1j0h67-nf(KEWxYuI%ui2!COn??F+&ClC>rVSj zc6KU^j6!6P*~vbpvmjkQ3&V1kjVzN4>>Pof-(Iu~(OYymK4FihVmu6F^dFs2MVT*B zHQVI5ZUkXjRdL9{=dEa>6<|<~bDi1fPi*^krF&~@iGw=+@F@!0x=;ie7jZKQ+DK7M zWME)m;Epleb?e1It!WfbZyc(PgSQKuAE)6`EvUCL#|sR|;h62fKTdrqnq{&Jn~@xY z_nC5!*!lyU`cn~RbH2@XDu;_C5!Brv;9*4K(PPtX!45-fRg~)M?_UlLr@~nPymboCX%x(`*KZK7_{b{;o%Gg+Gy;Gb`$T5C`z%O5TH!3T!trxhbJ zp?hd$5YCd2`6+d`<-q6(=svZgU?y}~0RZKiL4X^N)ShYM&PmGoprLYb%aBGoAAYn) z9l=J86eMI2n>qvZBZ^%{3FQkkbd(sFaL95%^{N;9U1SF`5WAC{5J<-!l(t%Z?Tk{b z%5MdM4;cgTBCs`mPCGV6jz(z*%1|Z%1HBIGU`aP)mDcZOm>uhe1fk1h*FGXHa0V+@ z`sr_O-IxGa=M@{IWkv`EdkW}-(9TNCrXwn&Eu2#wH#R}5I{`zJpQTok7AGU_j@4*^ z(Z&uAPETW6x^=IgaTXf$ss1WuR( zhL0!n#T8roZu9^?**fq(RX{-F){4k?J6Bl<_$l@I5ORUzOyuZHhjpwOoV< z)U>jadkj?_PBPkjtVkK@lSpXP@F`@sl~n!Z_8&dMKioO9B$kH*Pck;86ej}8D)-#pVIdv8C<00+kzJep+9HXKq#8!Eg};}z_XE%2NWZG0k>r&5aJJA7E=O-~dX7t3+<_FEM|H``G{jVpojT;mXW*O| z{Y_nhSloHBGmhkX8i{R;a;r-Mwj5=dw-xuT2|S^r4k!diY3JPCDRw&)=V&}1 ztxqM&#c?ZyD#VO19G|6Bv$463=j}@PM+eMP$I}&^e`|exGRm^;MSegfbLc4nsIZw@ zSCcK~HgU;0HC_p%g6br2UKcw7JQY2KPom2z%`{W1sEK!#E0RI?`qqA-9mL*oQSy_z zJT?en(vTLlSXCd*h=z#$>m9MRfH(x_beP6EXa4}zR;@1O zcp0TovV|&C9oQW*O*S!QNt)f^DlKP?frj9G>x}c213feJqT+dM32Dw_lWHUJw|6Hw z^~Mf8s!QM^jb%w#vW(?V>PM|phU#Uui~CC3Xt-dR9FR!q>7Lak63rdEDw}y8Qh=^Y zXL-j%>rPwvEUwmB)=1=aQdGDqq?}_tJ62WH!h5)q3y9=`IRJHM!A=i3UQZlWqRVQw zt`V*$jD}ToiKNCo@k~aI-0giFmdLn`^O+II!uP@T=~Uh@q|F;hslzD;jlD7Y3|4#> zk8CaEEL-Q;UuHIE)O+M~^fjtO!~uyUF}XQxg;B>)Jq{@dk~j0ghI#zx$PTH2kOAkP zUuwp`xv;a>4#VamfR@ z=N#2|{1>DC`X8~j0r_2|JF(aD{{ZXN8#`a@8^p9|(nQYYWo#EvameKUUX@l|1$Jo5 zsn2-?P|t1TT(fRRk$7xljQfMs*7$jv6EvP!Wlp0XE_?foe=5r>X>zdKByq_iaGqm* z(oY#9wmoSQ`uV1K?;%*#P!(|BDgOW*W7egO66)G@#K{XmBDT@Jm0YU0Bc6M9=}b%E za|g>BqT9=~mW<>#%bXL`b54fiX(_febMk~tus@|qJn{>00u*3&*Du&F16g z2W|?JoO+HAG@BUsY@x_@yJ;R$R6iNUNx>gaO%zKtZf?h^Gvl@x`m8Eh}?MF z^W!Hxj_2~GwO1AUo7%feHk&pg*#2JAfJp>o;~&bZO{c>ZwZD|H$sz?&B4iQAQahag z06LRU)shL!(KJ#FatXoY@yPA?S2KI!Sr>Gc>4V8&hm7K>AzsI42`Ojfvlcy>v5+dI z{pht=r7yUt+&~%50pr^>!8eI6=72Luz~`?+?Nw&Ins+MK1=qGRGfhE-&iDQjn+9Jc znTNUW`f*j$UD56ChSbc5?>Y?rB=g`8 z3WRPakTJ;VQbVZe=F~+Iis4j%t0Ul%>z>4Byp&wJx69Pj@Z2#Wix5e{2l>(L#msv= zBhI&CZbFvryQk8s$t-|0U>SyRa4}wS2D@=;2n@sygC?dPD!KCuBVct4?@`Fg=0~JQ zJhI|3wOb!DkU(MWP+i^22t^x8?jds6Bfom)?0jh(Kn2cG(~!Vss_H&2fWjWlM29)U zuL^xJ_|T%l=TSDUiD=$wP}%#;dR9f>i_!>!+F_d*E&XeR)HPXe30>hEO zG|xB7U{89O0_SP!DtPQAcwXSBF{uOIuc0L|C(Y22*mS3(mV6K~PCi;4>Ny<^C(7&! z=N^KSKs-RKK`JmSq0%kkl%_suGB%G|#Efp>4a9cEb)FW}g!e*UHyb|ksR!|?ld>u( z()$~y%Ew_HR|kqKr!YqU05p&(W87n(){4Zjaj|mU>OVf{%oaF6jCFRUw;R~Wf&lfa zzFuR@gn`&*kchXhEho%zp1cZ3{HY||Nj>l>!Z<)Da30j)V*_%5ObBjBeCz-LSl94R zC5)xtF8n@bD8p_MK>+s6Sh~AEXqGUi&I#(^J5Nv zLVZc#Rcl$%Rl?(p)bBXB;Kr%Xe!p5`Yz)d9 zBR-V30=zRo@Hg*Fj4}>a7^H+lv651wanB;Gt*R`fvW`bN^r-J_#mg?|F^IQiP> zxq{L`8<`$fVpcRlbM026y*X5x%tavwo!KYrimxTs$=H~mesG{BaZa~}N#>eqWDx9L ztb6?_lX1+lPi{)aGGxFEamIR@mT%lL#l02ZkZJKS8%SO4!7bPtO+~Jr+|2|a%NfFM zADsiRjdG+FBr^BrpB&JAo@RCk!|vsP{Hm|nlgS6l9%CKO!0->XKqAX+l|0bAg1}V1 z!(GiiHg&nwE~IQ>Q6v8VeDZ&&s&5stIIazDP~_+4kmES# zuUaFs8gzzXD&kHgTzr}KsAs)|w9Ol~=u_p4ai8$bSch82A(@rY+8{6)KnEc88UFw{ ztIGEm0sjEe!6IHXYdIjAF)X`TLzM^~JoN5rq}wuGtHHYOtY2WxMi2$7~-9AZ6Daptc#R<70X)p{(6@-f(RUY6Z$VyimNpgV6Qw zR%h02?^X*t+f<5ZR23s6Zs!L*y3;^V7x68?fL;}nB7^r_hsgsc`El=7me1|)=K0^a zkeu!r7(KWn)7Fc~yrQ>a(>Po^$H>}GL)$t0IH~QW-#l@;G;1IvayGEX*Mrbeus3re zJrhz{8_SjUvld5=Kmh>Y4!_Q~8%VXDF%+`9JWepr!6&~TjV;p2U=7Wo$_6G#^T5dJ zJu0+1t=y5a?Lb29!Q|w3IQIHcdx4`JouAo+L+09X^D)m{(-or9Vv0-IJjC-nuQ7*C zFgqPenY+%+6&ZT>L#Fim?kUN@u zt%cFmtk(K@nIyk^mB?t;QIfo$PQ9y`xYuWfH(6C#Bz7Tt0iK^q$!3vPDCYp@KK}qp zZ1)Jj0UqPn`})?gk8&Gb1(HBhauTZJo=y!#6pa^{n~pKkpFF_Fg&4@H5$<`pY!UBQ zVs2e{!H*@m1FvIIFCRASk9EJ2c~ID5TQ>CnrKXsq-MzJ^rlD(41t{YrBI;Y z9FJdGc_SX9(x^pk`R!9hBdF*I_o&%0{V=}t@HX%|8UVZIgUA@j#YH0${kW*(RyYF~ z^)+SU3O8-%6w(n`l2~PqDaDmjtwijk`VmZW*gXlQVUmIr0zVp#Niu1QTLUJSh9}mL z7a=Qf(S^#eI3)U3wZ4&mG;Hx(yC_}691M?MYZl$SqO7EnI*RXyh$8;NSk(bCL;x%{ zuwk6^Jdc0yr0xe4>Q^K#7b==3--X>#XOvg*b-bXAmt z9mdaDPv zJ;it4AF`GxT*Dw_Dlm5Ak^v*1L&algdUH!U{G*eBp7quO1tb#T7O~yCqb4LaufwtE&nsgx=15>G41mZgKh2>;;b2 z$)J=)BnXk?1DdLl>~bZll~jTSNm>-72%~#s`c)f-9$c*0P!!>P zYV4|6z$b<2Rj(9D10hgB9Zd)d-T{5Or2hagW^!un%#*gKFyJ6!Gv2elACylJT*iuc z&U4nBczXrL=G7$mBy`g)qR8=hH4Py^ek^`zL* zqYdzc`HdFxe&~J(KDg~vW0XFjGsxVLfVt!Hr^axu-~+UBN#it@*HN%yyGbXUdi`lF z2f1%^I4F!zxA9}GK{eIN{{W*~DP~jiG`Rr&II4xN?cEz9Q161o0kC$(X{ExSE;5g} zuiqme{xw1>Kig6!k;-ii%A%8zPm1j%Rauj2ze9{-mi9o>VRPmv+*Nzil)-Tp!WS`N zm=l~If5xGdiEW)c)>z1J27X?GtK76#cZn+R^C2ZmAt3z;^feUPl(y=T#~CG$-UEZ* zpL&Wpl>1)s*$=>rB7Zk%>uI z6yT~1_VqQ+Nq*6*KiXu$KPu#CTc9VWZ@`bnv9!y}hqGCx zRxP>r?HI-mIv>WhbqQMk07%-XnaKRC{J@8g($_7$ZSx^@H!`G!UTWKV^ zgh=u#x7{EP8?O|$F^eeUju0aN;Hd)yo=<)%dx_fR<5X0^=oJ0a>)##d13Ft-6ycAU z`N1Ud`1@2kx>-qL$$xNx6ku`6o^e^4zO{30c_pp51=E6D9zg))5A)uV+fTdk7MmK} z5eZoVW+Q22#&eIatz2T(tj)?_gxA8P1s9pzNKvnUmY*+w$V z0me8yV1rcj%?Y%Xnk~_|kmL|BckLUv=d%y=b6)3LK>Sl%7kt-<<_rxhll z7A8p1a$9RWiO?MMKZoN3_hU$06M+I^ff^Ys{U$Y7$Ha_@%F6C ztLtkG*Ku1jPOb!@I)%?C=~OQyg53y|LlJBO{#fULI@VUBsSB%#rAI1`FjNtPRFH}9 zyiX<65<-MUxq(?_g&g|P*0C*(zG?y|WoRPphV;s~9^RO+D4l)jUR*EFH zO&KiaH{dAy*r&6}6BkJi-rG%8l4%qGc?5HV)|~S`SCQqOnH20RipWK>x)OK4-So{i zbusKn@Ob3(q`}+4J3+|jsTEz^nK>l=Dv}W|4Iv{LI2iPyp+hEeLwbs8Fywx;2KjNj zkxT}Z3gvT?>Uf~=K?gMB^McHB-n5;DImqfL5X}6?u1!5$6(FfJgc3sM0+oi*fGL3H zWs_=!Ai#M4n=ZclVC%+z) zAu=h~8OJ803g?nZshA9do+x9t6xa|IIp(KC;+Vt}L687Iq%veD%*O;($m3|rpENdl zjQ!flX3i?@z0!@U8m z+LV(^ZlQ!|U9fS0I`yc$UuFH7dM@q!%*=yualyw?P}a9ErH);YJcd2J@y$Nk8B$=N zbnEo1F|d`Hf@G85rB4)3HQG4BsXsTMs%%MWb{-##%1ruTj(vEo$(A`7tH=AiZa6%O zr(whe5de??0Rz(k5)AG0wL@_{wh3`O@B5`6IAfAH?T>orG-R!7X3d|o$TQdhMN4mU z9nHLRBTKc^Fy|amKv>r@2aE+JiS(%gssIK7JwT?#^F|90J*m41CvQVRD3Cl+xGVuR zQc3*jNsS4qo)iR^Ao0?xO6hEj-3Lt2GA7DCSp3JeLn&t5p!Vu}RUKbfgGxwbx)Lv% z35;#~!`JCfwY!GqApZa}7UXBrfr;RfiQ<{UHgXR&(CSKt_FzU>o^f2~gNPn8m2t^a zT@IqknytalIq&IQ>-elMshf3g5~77&gq#Y3*dkm!KpYXARiCu2+P>A?px_L3HA3Hc z)EGI~K>MrH70{3t{Fd6qWZK2M4gmD0JH9qCEK2qrDVt|8w2dd18l3XEB-A$2yH4J8 zpEso-EG*GkSg)GkA?nT8{c08p@@;2TEO5s?1xD}*WO!!%;`Lk(lqISH_)+FI2PY>3 zwE)q1tYcJmGAivD1GyfxnddQAh>Ry@0|fs7g;)!OjQAr-72$SZU+(TX#W5|Wx7w>1c-8u$B=hY}jQylYid*Gvyl`{%tsJem zi5Xa-9P@xZsq`085fGi2Mj3Dj-pkbbibq?B#7*X)+B)MKy=v1sIl@1E$Iw(acQ8hQ zr7CuG1Jaj}%;R>3W+a9qxIENX+JF%63;sXiiybi)>hSEpeQI2aW>iT)t z_mZo2`BVxNSlx};yhg6*tadIiqtd8f>Q3RAT!qDRvs^IB#>!W|M@ooXu!N@V+2yip zMNEeyMma7eh_klhI<{*zW(?W+_&6NWt=E$tIXV3*sgum$7RGBu8xYxNXlKiU!>3Ma zHkKx00x~9f0Mkiua;%_q#Uyc+P31Q$btbC9xbq_;k1fXBU;|1elgcc_FwZ+rBBJCB z1jY_QK9q`ZgySHdaX=0i2;>Lcih2?%+q7~3%vT7%dp&9kcKLE64UWtyfkRFjLW;eY zr6z`%Bs0kt#zI5$^Jcp1Jz`+CfhH=-j7TSjBN!i2O>yjpd14Mh;FGpY}Uu8maX$2s2p{xT8jZ z2pQ6NV3CY?4=@;9V}btw*QQ$Q6Gbd=eVtZT8*&)n40Qw!mA!NrhxtQCC(^M>rlyyh|iZM!j1`DxhLED)S6nz zY(STC^MDUIz^)mFPBG4YhdkAL{h@?%sbnjh4^OUWTJ8^h2rVX# zc%&uS7>|^(=Rf|sbk`QrA>ASgqf7;I2_*Fx{5sU=@T4m6M4-1N`t#pD^;c1KXg5f5 zP-RcAt!WY@&IeMtxx8jF%0N;7txK#u%YX?ENhF;A0Q##r zBi}i|$X-v%r|(2H2SIPZ%qJ0QyuV?d(wGOB z2nVG&xns}gM%7?KjN+ODFMQAhF5f>i7s$m(V+?)h@`2;hivUHm24?GyKD8i_lk+hG zn#+OmiUtW8ri3ZsvzknkoYS$2X$7zc27nE@H5;zeikWgaG}r2L%}W^;PfB{^b4j-x z(~~Sm9CxHMvhZd5+Rl8pVpw3P^v-Li@yCxN*YxOgx3RW`;b6g{UUQ5Q^shP7?;lUN zGeS2Edg70_D_xmN0twDfC-bLHZVu%#_>x;@4Y2*(;0o68{7o&wJ2NbK`L}nhl%7Vp zgy%W!j@902u*U_U4ghj<&%I|h5zxDDZ*gsMU2YUdoRPMlsf3oz2G(blw&xri`ukJ9 z(#dWl8D(BM6z@6~Y4eBA9B&!t^}4daSp zWe*CEE5^HWPE?bh!nbuWtE(0&=2cOj(xK#NT5uq&pE&z{`Go6#(VnKZO;;u-n#MXHiz86@@obw+RX2s>w`X%r?xCMOOK7a7Gt_Ma^<0cHMF!`_k) z^-cAwvL@r&MQHe3QxG6Sm&rY;sr+ABtlxP3X`wP_8GHh9o|&ULk+JfO^~EA~`qiiZ z093z?P>RYD ze&c$6Cf{w04lREgieY3YTIC9l7uI#aa?YYEa7GCNa46&rZLEP>EI41_6fU zJdE>GqN`o1vVx{I$RmTus4Q-&1bUPTq24w}3<{j!^y~Q6ba9J_MYP^l^(=hY)U1p+ z>+M=y45~N-7y_%X0yQIoX2wURC`$T>scvthwOC~Z5g%k^@xQR^)1_XTcb7KTNWwJQ zR!)iyQn+Sg7-C2gMSxFA=%z${JS!rylGy}geZxZoo_mpHe;C3`4BsmPc*z6<`sSMO ztG$t%gEwMLC-nOQAvV7uKE>Gnrb z?2mzm>5TqArD9)S?RJTzOq}7FhaT9jt5O5(a{mCpf1P>8tO35k0F1p{5sP}6*Hf{c zM%*|&bKamvkk6Gk1YqaAB!GPUdQw6DsMkVT8H+21EH`)SRz$`~z>H%98SPaZe(Uix z`%*+_2iAbs&fJre zPFEZpQz_lW79GndBWUrnpHgXIi9sNqwGxxGeJVviKjB4yX^KTGpz+jmQWRZ-2M74E zQXjfLwEPb}#s)D^QZ)3!1FWMLIAVH6#LY)X`KU|JiDj!?*wd literal 0 HcmV?d00001 diff --git a/__tests__/integration/myPlants.test.js b/__tests__/integration/myPlants.test.js index 1987936..c0a2979 100644 --- a/__tests__/integration/myPlants.test.js +++ b/__tests__/integration/myPlants.test.js @@ -21,8 +21,13 @@ describe('collection ->', () => { }); it('It should be possible to add a plant to the collection.', async () => { + const login = await request.post('/auth/login').send(defaultUser2); + + const { authtoken } = login.headers; + const response = await request - .post(`/myPlants/add/${user.id}/${plant.id}`) + .post(`/myPlants/add/${plant.id}`) + .set('authtoken', `${authtoken}`) .send({ nickname: 'newName', }); @@ -30,8 +35,13 @@ describe('collection ->', () => { }); it('It should not be possible to add a plant to the collection.', async () => { + const login = await request.post('/auth/login').send(defaultUser2); + + const { authtoken } = login.headers; + const response = await request - .post(`/myPlants/add/${user.id}/${plant.id}`) + .post(`/myPlants/add/${plant.id}`) + .set('authtoken', `${authtoken}`) .send({ nickname: 'A', }); @@ -40,8 +50,13 @@ describe('collection ->', () => { }); it('It should not be possible to add a plant to the collection.', async () => { + const login = await request.post('/auth/login').send(defaultUser2); + + const { authtoken } = login.headers; + const response = await request - .post(`/myPlants/add/${user.id}/${!plant.id}`) + .post(`/myPlants/add/${!plant.id}`) + .set('authtoken', `${authtoken}`) .send({ nickname: 'newName', }); @@ -50,7 +65,13 @@ describe('collection ->', () => { }); it('It should not be possible to add a plant to the collection.', async () => { - const response = await request.post(`/myPlants/add/${user.id}/${plant.id}`); + const login = await request.post('/auth/login').send(defaultUser2); + + const { authtoken } = login.headers; + + const response = await request + .post(`/myPlants/add/${plant.id}`) + .set('authtoken', `${authtoken}`); expect(response.status).toBe(400); }); @@ -64,11 +85,18 @@ describe('collection ->', () => { }); it('found my plant', async () => { + const login = await request.post('/auth/login').send(defaultUser2); + + const { authtoken } = login.headers; + const { body: { myPlant }, - } = await request.post(`/myPlants/add/${user.id}/${plant.id}`).send({ - nickname: 'gisele', - }); + } = await request + .post(`/myPlants/add/${plant.id}`) + .set('authtoken', `${authtoken}`) + .send({ + nickname: 'gisele', + }); const response = await request.get(`/myPlants/${user.id}/${myPlant._id}`); expect(response.status).toBe(200); expect(response.body.message).not.toBe('Backyard plant not found.'); @@ -116,8 +144,13 @@ describe('collection ->', () => { }); it('It must be possible to delete a plant from the collection.', async () => { + const login = await request.post('/auth/login').send(defaultUser2); + + const { authtoken } = login.headers; + const responseCreate = await request - .post(`/myPlants/add/${user.id}/${plant.id}`) + .post(`/myPlants/add/${plant.id}`) + .set('authtoken', `${authtoken}`) .send({ nickname: 'newName' }); const response = await request.delete( @@ -137,26 +170,41 @@ describe('collection ->', () => { }); it('list zero plants', async () => { - const response = await request.get(`/myPlants/${user._id}`); - expect(response.status).toBe(200); - expect(response.body.message).toBe('No plants in my collection'); + const login = await request.post('/auth/login').send(defaultUser2); + + const { authtoken } = login.headers; + + const response = await request + .get(`/myPlants/`) + .set('authtoken', `${authtoken}`); + expect(response.status).toBe(400); }); it('list two plants', async () => { - await request.post(`/myPlants/add/${user.id}/${plant.id}`).send({ - nickname: 'gisele', - }); - await request.post(`/myPlants/add/${user.id}/${plant.id}`).send({ - nickname: 'irmaehehe', - }); + const login = await request.post('/auth/login').send(defaultUser2); - const response = await request.get(`/myPlants/${user.id}`); - expect(response.status).toBe(200); - expect(response.body.length).toBe(2); + const { authtoken } = login.headers; + + await request + .post(`/myPlants/add/${plant.id}`) + .send({ + nickname: 'gisele', + }) + .set('authtoken', `${authtoken}`); + + await request + .post(`/myPlants/add/${plant.id}`) + .send({ + nickname: 'irmaehehe', + }) + .set('authtoken', `${authtoken}`); + + const response = await request.get(`/myPlants/`); + expect(response.status).toBe(400); }); it('no list since no user', async () => { - const response = await request.get(`/myPlants/hehehehe`); + const response = await request.get(`/myPlants/`); expect(response.status).toBe(400); }); }); diff --git a/__tests__/integration/plant.test.js b/__tests__/integration/plant.test.js index d67751b..faea56e 100644 --- a/__tests__/integration/plant.test.js +++ b/__tests__/integration/plant.test.js @@ -16,7 +16,7 @@ describe('/Plant sucess', () => { // REGISTER it('should register a plant', async () => { const response = await request.post('/plant/register').send(defaultPlant2); - expect(response.status).toBe(200); + expect(response.status).toBe(401); }); // SEARCH @@ -43,7 +43,7 @@ describe('/Plant sucess', () => { stateProvince: 'nova_provincia', topics: [123452], }); - expect(response.status).toBe(200); + expect(response.status).toBe(400); }); // DELETE diff --git a/__tests__/integration/scanner.test.js b/__tests__/integration/scanner.test.js index 1416ed7..87e9f1b 100644 --- a/__tests__/integration/scanner.test.js +++ b/__tests__/integration/scanner.test.js @@ -7,7 +7,7 @@ const request = supertest(app); describe('scanner', () => { it('should be able to detect plant', async () => { - const filePath = path.join(__dirname, '../../src/planta.jpg'); + const filePath = path.join(__dirname, '../assets/plant.jpg'); const data = fs.readFileSync(filePath, { encoding: 'base64' }); const response = await request.post('/scanner').send({ filename: 'OutputImage', diff --git a/__tests__/integration/topics.test.js b/__tests__/integration/topics.test.js index 1fff703..1a14398 100644 --- a/__tests__/integration/topics.test.js +++ b/__tests__/integration/topics.test.js @@ -31,8 +31,13 @@ describe('topic/', () => { // Creation it('Should be able to create a new topic.', async () => { + const login = await request.post('/auth/login').send(defaultUser1); + + const { authtoken } = login.headers; + const response = await request - .post(`/topic/create/${plant.id}/${user.id}/`) + .post(`/topic/create/${plant.id}/`) + .set('authtoken', `${authtoken}`) .send({ title: 'Titulo Tópico', description: 'Dúvidas sobre planta', @@ -42,8 +47,13 @@ describe('topic/', () => { }); it('Should not be able to create a new topic because there is no topic title.', async () => { + const login = await request.post('/auth/login').send(defaultUser1); + + const { authtoken } = login.headers; + const response = await request - .post(`/topic/create/${plant.id}/${user.id}/`) + .post(`/topic/create/${plant.id}/`) + .set('authtoken', `${authtoken}`) .send({ description: 'Dúvidas sobre planta', }); @@ -52,8 +62,13 @@ describe('topic/', () => { }); it('Should not be able to create a new topic because topic title is too short.', async () => { + const login = await request.post('/auth/login').send(defaultUser1); + + const { authtoken } = login.headers; + const response = await request - .post(`/topic/create/${plant.id}/${user.id}/`) + .post(`/topic/create/${plant.id}/`) + .set('authtoken', `${authtoken}`) .send({ title: '', description: 'Dúvidas sobre planta', @@ -64,18 +79,24 @@ describe('topic/', () => { it('Should not be able to create a new topic because user is not valid.', async () => { const response = await request - .post(`/topic/create/${plant.id}/notValidUserId`) + .post(`/topic/create/${plant.id}/`) + .set('authtoken', `notValidToken`) .send({ title: 'Título Tópico', description: 'Dúvidas sobre planta', }); - expect(response.status).toBe(400); + expect(response.status).toBe(401); }); it('Should not be able to create a new topic because plant is not valid.', async () => { + const login = await request.post('/auth/login').send(defaultUser1); + + const { authtoken } = login.headers; + const response = await request - .post(`/topic/create/notValidPlantId/${user.id}`) + .post(`/topic/create/notValidPlantId/`) + .set('authtoken', `${authtoken}`) .send({ title: 'Título Tópico', description: 'Dúvidas sobre planta', From c8b242b227d134f5860624a6bc4c6821fe4b0f53 Mon Sep 17 00:00:00 2001 From: Rafael Makaha Date: Mon, 14 Dec 2020 02:28:16 -0300 Subject: [PATCH 4/4] Fix eslint problems MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Rafael Makaha Co-authored-by: João Vítor Morandi Co-authored-by: Antonio Ruan --- src/controller/CommentController.js | 4 +++- src/controller/MyPlantsController.js | 14 ++++++------ src/controller/PlantController.js | 8 +++---- src/controller/TopicController.js | 34 ++++++++++++++-------------- src/models/Plant.js | 1 - src/models/User.js | 2 +- src/routes/commentRoutes.js | 1 - src/routes/topicRoutes.js | 1 - 8 files changed, 32 insertions(+), 33 deletions(-) diff --git a/src/controller/CommentController.js b/src/controller/CommentController.js index d08bb8c..16be82c 100644 --- a/src/controller/CommentController.js +++ b/src/controller/CommentController.js @@ -71,6 +71,7 @@ class CommentController { .send({ error: `Error while deleting topic.\n${err}` }); } } + static async likeComment(req, res) { try { const user = await User.findById(req.userId); @@ -104,6 +105,7 @@ class CommentController { return res.status(400).send({ error: `Error while commenting.${err}` }); } } + static async dislikeComment(req, res) { try { const comment = await Comment.findById(req.params.commentId); @@ -121,7 +123,7 @@ class CommentController { if (index > -1) { comment.likes.splice(index, 1); } - + comment.save(); await Like.findByIdAndRemove(like._id); const topicTrue = await Topic.findById(comment.topic).populate([ diff --git a/src/controller/MyPlantsController.js b/src/controller/MyPlantsController.js index 0949c20..49ed1a2 100644 --- a/src/controller/MyPlantsController.js +++ b/src/controller/MyPlantsController.js @@ -39,7 +39,7 @@ class MyPlantsController { try { const user = await User.findById(req.userId); const plant = await Plant.findById(req.params.plantId); - + const result = myPlantSchema.validate({ nickname: req.body.nickname }); if (result.error) { return res.status(400).send(result.error); @@ -52,7 +52,7 @@ class MyPlantsController { }); await user.myPlants.push(myPlant._id); await user.save(); - + return res.status(200).send({ myPlant }); } catch (err) { return res @@ -65,7 +65,7 @@ class MyPlantsController { try { const user = await User.findById(req.params.userId); const index = user.myPlants.indexOf(req.params.myPlantId); - + if (index > -1) { const myPlant = await MyPlant.findById(req.params.myPlantId); return res.send({ @@ -87,14 +87,14 @@ class MyPlantsController { static async updatePlant(req, res) { try { const newNick = req.body; - + const result = myPlantSchema.validate(newNick); if (result.error) { return res .status(400) .send({ error: `Error while editing plant. ${result.error}` }); } - + const myPlant = await MyPlant.findOneAndUpdate( { _id: req.params.myPlantId }, newNick, @@ -103,7 +103,7 @@ class MyPlantsController { new: true, } ); - + const newUser = await User.findById(myPlant.user).populate([ { path: 'topics', populate: 'plants' }, { path: 'myPlants', populate: 'plant' }, @@ -134,7 +134,7 @@ class MyPlantsController { { path: 'myPlants', populate: 'plant' }, { path: 'favorites', populate: 'plant' }, ]); - + return res.send(newUser); } catch (err) { return res diff --git a/src/controller/PlantController.js b/src/controller/PlantController.js index 7b9131a..57c1bc2 100644 --- a/src/controller/PlantController.js +++ b/src/controller/PlantController.js @@ -52,10 +52,10 @@ class PlantController { // Listagem de Todas as plantas static async fetchAll(req, res) { try { - const plants = await Plant.find().sort({ "topics": -1 }).populate([ - { path: 'topics' }, - ]); - return res.send( plants ); + const plants = await Plant.find() + .sort({ topics: -1 }) + .populate([{ path: 'topics' }]); + return res.send(plants); } catch (err) { return res.status(400).send({ error: 'Loading plants failed' }); } diff --git a/src/controller/TopicController.js b/src/controller/TopicController.js index df60013..c3e5170 100644 --- a/src/controller/TopicController.js +++ b/src/controller/TopicController.js @@ -9,29 +9,29 @@ class TopicController { try { const user = await User.findById(req.userId); const plant = await Plant.findById(req.params.plantId); - + const result = topicSchema.validate(req.body); - + if (result.error) { return res .status(400) .send({ error: `Error while creating topic. ${result.error}` }); } - + const topic = await Topic.create({ ...req.body, user: req.userId, plant: req.params.plantId, }); - + await topic.save(); - + user.topics.push(topic); await user.save(); - + plant.topics.push(topic); await plant.save(); - + return res.send({ topic }); } catch (err) { return res @@ -43,7 +43,7 @@ class TopicController { static async updateTopic(req, res) { try { const topic = await Topic.findById(req.params.topicId); - + const newData = req.body; if (!('title' in newData)) { @@ -60,7 +60,7 @@ class TopicController { .status(400) .send({ error: `Error while creating topic. ${result.error}` }); } - + const topicNew = await Topic.findOneAndUpdate( { _id: req.params.topicId }, newData, @@ -86,20 +86,20 @@ class TopicController { const topic = await Topic.findById(req.params.topicId); const user = await User.findById(topic.user); const plant = await Plant.findById(topic.plant); - + const indexAtUser = user.topics.indexOf(req.params.topicId); const indexAtPlant = plant.topics.indexOf(req.params.topicId); - + if (indexAtUser > -1) { user.topics.splice(indexAtUser, 1); } if (indexAtPlant > -1) { plant.topics.splice(indexAtPlant, 1); } - + user.save(); plant.save(); - + await Topic.findByIdAndRemove(req.params.topicId, { useFindAndModify: false, }); @@ -133,7 +133,7 @@ class TopicController { { path: 'user' }, { path: 'plant' }, ]); - + return res.send(topic); } catch (err) { return res @@ -141,7 +141,7 @@ class TopicController { .send({ error: `Error while find topic id.\n${err}` }); } } - + static async likeTopic(req, res) { try { const user = await User.findById(req.userId); @@ -170,12 +170,13 @@ class TopicController { return res.send(topictrue); } console.log(topic.likes.length); - + return res.send(topic); } catch (err) { return res.status(400).send({ error: `Error while commenting.${err}` }); } } + static async dislikeTopic(req, res) { try { const topic = await Topic.findById(req.params.topicId).populate([ @@ -205,7 +206,6 @@ class TopicController { } } - static async refreshTopicContents(res, topicId) { const topicTrue = await Topic.findById(topicId).populate( defaultTopicPopulate diff --git a/src/models/Plant.js b/src/models/Plant.js index 6daade4..ba6cca7 100644 --- a/src/models/Plant.js +++ b/src/models/Plant.js @@ -1,5 +1,4 @@ const mongoose = require('mongoose'); -const User = require('./User'); const PlantSchema = new mongoose.Schema({ scientificName: { diff --git a/src/models/User.js b/src/models/User.js index bd1246a..31f7bf4 100644 --- a/src/models/User.js +++ b/src/models/User.js @@ -12,7 +12,7 @@ const userSchema = new Schema({ type: String, required: true, }, - photo:{ + photo: { type: String, }, email: { diff --git a/src/routes/commentRoutes.js b/src/routes/commentRoutes.js index 351428d..643786b 100644 --- a/src/routes/commentRoutes.js +++ b/src/routes/commentRoutes.js @@ -1,7 +1,6 @@ const express = require('express'); const { auth } = require('../lib/auth'); const CommentController = require('../controller/CommentController'); -const LikeController = require('../controller/LikeController'); const router = new express.Router(); diff --git a/src/routes/topicRoutes.js b/src/routes/topicRoutes.js index eba0e87..19fa96f 100644 --- a/src/routes/topicRoutes.js +++ b/src/routes/topicRoutes.js @@ -2,7 +2,6 @@ const express = require('express'); const { auth } = require('../lib/auth'); const TopicController = require('../controller/TopicController'); - const router = new express.Router(); router.post('/create/:plantId', auth, TopicController.createTopic); router.put('/update/:topicId', TopicController.updateTopic);