From 442e41684016c9a2bb1718b59551d61fa641c047 Mon Sep 17 00:00:00 2001 From: David Bomba Date: Thu, 27 May 2021 20:03:26 +1000 Subject: [PATCH] Import Company Test --- app/Jobs/Company/CompanyExport.php | 2 +- tests/Feature/Import/ImportCompanyTest.php | 216 ++++++++++++++++----- tests/Feature/Import/backup.zip | Bin 12051 -> 15475 bytes 3 files changed, 173 insertions(+), 45 deletions(-) diff --git a/app/Jobs/Company/CompanyExport.php b/app/Jobs/Company/CompanyExport.php index 58baf551121d..6a411cb5908d 100644 --- a/app/Jobs/Company/CompanyExport.php +++ b/app/Jobs/Company/CompanyExport.php @@ -215,7 +215,7 @@ class CompanyExport implements ShouldQueue })->all(); - $this->export_data['expense_categories'] = $this->company->expenses->map(function ($expense_category){ + $this->export_data['expense_categories'] = $this->company->expense_categories->map(function ($expense_category){ $expense_category = $this->transformArrayOfKeys($expense_category, ['user_id', 'company_id']); diff --git a/tests/Feature/Import/ImportCompanyTest.php b/tests/Feature/Import/ImportCompanyTest.php index 1f585783d9b7..354a3719cee0 100644 --- a/tests/Feature/Import/ImportCompanyTest.php +++ b/tests/Feature/Import/ImportCompanyTest.php @@ -14,11 +14,15 @@ use App\Jobs\Import\CSVImport; use App\Models\Account; use App\Models\Client; use App\Models\Company; +use App\Models\CompanyToken; use App\Models\CompanyUser; use App\Models\Expense; +use App\Models\ExpenseCategory; use App\Models\Invoice; use App\Models\Payment; +use App\Models\PaymentTerm; use App\Models\Product; +use App\Models\TaxRate; use App\Models\User; use App\Models\Vendor; use App\Utils\Traits\MakesHash; @@ -40,6 +44,8 @@ class ImportCompanyTest extends TestCase public $account; public $company; + public $backup_json_object; + public $ids; public function setUp() :void { @@ -57,6 +63,20 @@ class ImportCompanyTest extends TestCase $this->account = Account::factory()->create(); $this->company = Company::factory()->create(['account_id' => $this->account->id]); + + $backup_json_file_zip = base_path().'/tests/Feature/Import/backup.zip'; + + $zip = new \ZipArchive; + $res = $zip->open($backup_json_file_zip); + if ($res === TRUE) { + $zip->extractTo(sys_get_temp_dir()); + $zip->close(); + } + + $backup_json_file = sys_get_temp_dir() . "/backup/backup.json"; + + $this->backup_json_object = json_decode(file_get_contents($backup_json_file)); + } public function testBackupJsonRead() @@ -78,51 +98,18 @@ class ImportCompanyTest extends TestCase unlink($backup_json_file); } - private function unpackZip() + public function testAppVersion() { - - $backup_json_file_zip = base_path().'/tests/Feature/Import/backup.zip'; - - $zip = new \ZipArchive; - $res = $zip->open($backup_json_file_zip); - if ($res === TRUE) { - $zip->extractTo(sys_get_temp_dir()); - $zip->close(); - } - - $backup_json_file = sys_get_temp_dir() . "/backup/backup.json"; - - $backup_json_object = json_decode(file_get_contents($backup_json_file)); - - return $backup_json_object; - } - - private function testAppVersion() - { - $obj = $this->unpackZip(); - - $this->assertEquals("5.1.52", $obj->app_version); + $this->assertEquals("5.1.65", $this->backup_json_object->app_version); } public function testImportUsers() { - $backup_json_file_zip = base_path().'/tests/Feature/Import/backup.zip'; - $zip = new \ZipArchive; - $res = $zip->open($backup_json_file_zip); - if ($res === TRUE) { - $zip->extractTo(sys_get_temp_dir()); - $zip->close(); - } + $this->assertTrue(property_exists($this->backup_json_object, 'app_version')); - $backup_json_file = sys_get_temp_dir() . "/backup/backup.json"; - - $backup_json_object = json_decode(file_get_contents($backup_json_file)); - - $this->assertTrue(property_exists($backup_json_object, 'app_version')); - $this->assertTrue(property_exists($backup_json_object, 'users')); - - unlink($backup_json_file); + /***************************** Users *****************************/ + $this->assertTrue(property_exists($this->backup_json_object, 'users')); User::all()->each(function ($user){ $user->forceDelete(); @@ -130,9 +117,9 @@ class ImportCompanyTest extends TestCase User::unguard(); - $this->assertEquals(2, count($backup_json_object->users)); + $this->assertEquals(2, count($this->backup_json_object->users)); - foreach ($backup_json_object->users as $user) + foreach ($this->backup_json_object->users as $user) { $user_array = (array)$user; unset($user_array['laravel_through_key']); @@ -152,12 +139,16 @@ class ImportCompanyTest extends TestCase User::reguard(); $this->assertEquals(2, User::count()); + /***************************** Users *****************************/ - $this->assertEquals(2, count($backup_json_object->company_users)); + + /***************************** Company Users *****************************/ + + $this->assertEquals(2, count($this->backup_json_object->company_users)); CompanyUser::unguard(); - foreach($backup_json_object->company_users as $cu) + foreach($this->backup_json_object->company_users as $cu) { $user_id = $this->transformId('users', $cu->user_id); @@ -170,7 +161,7 @@ class ImportCompanyTest extends TestCase $new_cu = CompanyUser::firstOrNew( ['user_id' => $user_id, 'company_id' => $this->company->id], - (array)$cu_array, + $cu_array, ); $new_cu->account_id = $this->account->id; @@ -181,11 +172,140 @@ class ImportCompanyTest extends TestCase CompanyUser::reguard(); $this->assertEquals(2, CompanyUser::count()); + /***************************** Company Users *****************************/ + + + /***************************** Company Tokens *****************************/ + + $this->assertEquals(2, count($this->backup_json_object->company_tokens)); + + CompanyToken::unguard(); + + foreach($this->backup_json_object->company_tokens as $ct) + { + $user_id = $this->transformId('users', $ct->user_id); + + $ct_array = (array)$ct; + unset($ct_array['user_id']); + unset($ct_array['company_id']); + unset($ct_array['account_id']); + unset($ct_array['hashed_id']); + unset($ct_array['id']); + + $new_ct = CompanyToken::firstOrNew( + ['user_id' => $user_id, 'company_id' => $this->company->id], + $ct_array, + ); + + $new_ct->account_id = $this->account->id; + $new_ct->save(['timestamps' => false]); + + } + + CompanyToken::reguard(); + + $this->assertEquals(2, CompanyToken::count()); + /***************************** Company Tokens *****************************/ + + + /***************************** Payment Terms *****************************/ + PaymentTerm::unguard(); + + $this->assertEquals(8, count($this->backup_json_object->payment_terms)); + + foreach($this->backup_json_object->payment_terms as $obj) + { + + $user_id = $this->transformId('users', $obj->user_id); + + $obj_array = (array)$obj; + unset($obj_array['user_id']); + unset($obj_array['company_id']); + unset($obj_array['account_id']); + unset($obj_array['hashed_id']); + unset($obj_array['id']); + + $new_obj = PaymentTerm::firstOrNew( + ['num_days' => $obj->num_days, 'company_id' => $this->company->id], + $obj_array, + ); + + $new_obj->save(['timestamps' => false]); + + } + + PaymentTerm::reguard(); + + $this->assertEquals(8, PaymentTerm::count()); + /***************************** Payment Terms *****************************/ + + /***************************** Tax Rates *****************************/ + TaxRate::unguard(); + + $this->assertEquals(2, count($this->backup_json_object->tax_rates)); + + foreach($this->backup_json_object->tax_rates as $obj) + { + + $user_id = $this->transformId('users', $obj->user_id); + + $obj_array = (array)$obj; + unset($obj_array['user_id']); + unset($obj_array['company_id']); + unset($obj_array['account_id']); + unset($obj_array['hashed_id']); + unset($obj_array['id']); + unset($obj_array['tax_rate_id']); + + $new_obj = TaxRate::firstOrNew( + ['name' => $obj->name, 'company_id' => $this->company->id, 'rate' => $obj->rate], + $obj_array, + ); + + $new_obj->save(['timestamps' => false]); + + } + + TaxRate::reguard(); + + $this->assertEquals(2, TaxRate::count()); + /***************************** Tax Rates *****************************/ + + /***************************** Expense Category *****************************/ + ExpenseCategory::unguard(); + + $this->assertEquals(2, count($this->backup_json_object->tax_rates)); + + foreach($this->backup_json_object->expense_categories as $obj) + { + + $user_id = $this->transformId('users', $obj->user_id); + + $obj_array = (array)$obj; + unset($obj_array['user_id']); + unset($obj_array['company_id']); + unset($obj_array['account_id']); + unset($obj_array['hashed_id']); + unset($obj_array['id']); + unset($obj_array['tax_rate_id']); + + $new_obj = ExpenseCategory::firstOrNew( + ['name' => $obj->name, 'company_id' => $this->company->id], + $obj_array, + ); + + $new_obj->save(['timestamps' => false]); + + } + + ExpenseCategory::reguard(); + + $this->assertEquals(2, ExpenseCategory::count()); + /***************************** Expense Category *****************************/ } - private function transformId(string $resource, string $old): int { if (! array_key_exists($resource, $this->ids)) { @@ -199,4 +319,12 @@ class ImportCompanyTest extends TestCase return $this->ids[$resource]["{$old}"]; } + public function tearDown() :void + { + $backup_json_file = sys_get_temp_dir() . "/backup/backup.json"; + + // unlink($backup_json_file); + } + + } diff --git a/tests/Feature/Import/backup.zip b/tests/Feature/Import/backup.zip index 404d5208044dbf1383886864d3d64606d111e702..fa90df5ae0b23b1ca7e69e84df4c3adc616be1a9 100644 GIT binary patch literal 15475 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%0A34~|IGbB( z%>359f2iX7yOsDcF(V&s6i847sQs5Ukwh&DfpP0Xr#m+{xcW^iyH}maT7FmJl8vzEWMyWKs!Kn*mT82Ue+&*^hVMe3 z$0a16d3{A}?2(b^%$Ou{0;a5FulqMwi*Z<2DUr8FDzXx!|Hv$?+P_^@-gr=nZ`048 zV2?LnkZ)8FACRoTe2kw_s;4D}HNmWuAW@vDm!X(Z6VaQi;D3%%J`gp(0 zea!r-_nY_-H)2~46Fb;C{+YAxAa4WHwBHMnK%=~zG$>; z((aPdoRLZ0@7-vC?tcXuSbxF|jJ4vBsFGpbxZNtT3&_}vD2^QHp$p@CUo@%6yGnjw zUoon%_lQ1TH>In3$XZY##YPh+Mx~!iP8@zMO;9Rmfw-F%e_2Tc5@TRK`+3gJ9*tq@ zvTqBdBaV%X1-f6)nwfw9@X7=SCu3Kb)jX~lKWk8QNW4mYC)@;9b*$GjybdAHW?N~@ zY!Bmsa_ojBDXwXfxedqe3N{bh@@=mD2?EX*k3fdDl^(g8co?H%X5Rf$9;p-DsQy-? z$HHJS<^kn_W8(<1xxq;k-*biY>OO%(M242;Sm!A>lFon))<-Aqw-iJ&V=Z|mWhf{f2VYR{9`VC@i|id zB)JW1$=Kl`5Kw0sCQf1%Lpw4lf#bJ3K5$WweheI3P-Ll3B2sh#GJVn0d@Ec?dYg+2 z?KOR8 zJzDgzWW3?lY1;ju8%tIR+U!M=$r_LKe0LPqn58SIp6^lSJ$Jz81A z$~a4<@rp9p*e01C@Uh6_Z#S+3vM4wnKw3@214AN{^LEQS@y`9G>selUcXIoSBog-C z0}l5BAOok#=*ox&o%GbMq>-c8kCWlafOdo&PCe3`-=q6H>m%YyDw3AEuUX7~w|Quu zg{u0gMgry}Q_T{imLVq*Md;Bg1nZzCOXZUt(ZOIS9sb3)bBh2_CDrsZ8})pJ@h9>Q z;$QKPmZ7T9FIQo6ofAXnw1i6NpVIkJhh{ z$qM*1%kP*J`-`2bLCyspp~IL>aE7|p;LTCEL02__v0eW}K(G7Fp>J9}}&^gTK_eGTeAM9{;H{(1@gTT%I|7g2vJ;m0-u z*@W?7vZfu7f(!k_miQh^uvP$>l^&uRopt$>aINfii?d1tFNqDfV9%GF8bK|D?GWH* z?TEbG$v!Xlm#!U_ukhdwF2cR^5zP9hp??82n4Z7-`I7OU*Z$$rVKZ}i3!S>!gpi8m zy8xfM`YfgPfoZ_Un#hI(+?0QnLpQs<2Mey8nfkBFn!TZ3a@B7FLez=nDcoX>Y!kL@ z6Tehg3)K=vQzqYMki>-!cKfA{USi1C3XVdtrGXzl3+!SI5G2^X#Qy^}x7RQOP3euCrsyWNPFe<}%1<@@JCg&FldQ z1|y*_#Lt@<+$QYeKbskxx(4+h0_ep@yLA4v?Jqsg{geG0{ta4j*^peH3*bq9djs*D z=}bTku~plqo0I;(%ogr^CNg`+R!;wOZiQ8!Y+m z4_&E3t;&B|s6VSBQ}jQq)S^#ds`Z|QMbf}|i3TJfvSd**HI+#EZs!u`;^Whwy#HG{ z|6GihE*^%(eErW0^`AXY_!g=V28I?5sf8x=@yLz`6Zj`2(BO4{_0oXnN9qt3+@0q~ z>Se{AAE}qE2!5pgG>ac>J?Je!7J=bT*enMwF(hkHpD|gaa9dlUvfnjsyDcgcyXG5f zFw&`le#>IFm?|b2bN7wr&-So&$?DIHiv;gQEp9F$;4#1r)Ep|i9c~V7O?(r~fO1Bh zp_MNJgBF7hs9%`H)37B<-2SZn@Bk%JSwBwLO-wNGfwxaBLq;nSOoy^Z?Ad=l+yT@5 zV(F^PfaxKbo)U=oz8-T1neT;q=Q=pq{|s(z$z%!eddz`To65cthMRSnRI;l_8FOQG+X;Hm z&lDxEURa)6y#fVJ@Z9Pb=I2(wNcz+2=i-L=|0=Q5m-B&|Olh^r%{wR(HilNP5F!Q2 z2oVg*w&{JPA(>$ZFiDmEJ8+TZE6pKkF_18DPNw8X5=k~KhR?iO(X@BDFwpetIAngOSts@7mGR*2;aSqo*G$(2CN+E0zogoi5c63iu|G z6lXsGnW~SzxF120Whbk?b!qn&zr-fKkuLGzKt1vD4NC7hiT2ECQ*Lyy0!7PAI1mfn;zC>hZ1lHW+^YsG)M1Cm0H=( zR2xI_da-xMl9+C63{pXk+J)&2*Xl{#Rz+RzA0$`R&-WMDGcYtdUV-@W=67vf*Q{hrLwc&MeEHck(CK=eh0u~zgoG)}x0Gq~6jana z+J(Xx>fsW{zo51fMt8Z_;FQd|rSu?ZaP72qC=hBhq=gnpQpDOup%ZI>JY8pw*zU~4 zwhbPzN{wdv5^yT(jqa#bti=`UdlP5h59Jpw+26&hnMwpd9mO#%VkM>Vc6zf1=e4g6 zZd_W{s^W+A4eHOFipzErk<6Ih9gp3`OYA$l)p#i`^Yd4cw0rMfPF!1hxw^Wmv@p|; z@sxP~a!gcuTC^}RtW7UX$#+HnwH;liq0*kYs__6wEnrfu{ri{cI@2wJcu(QD%UDHY z?u;twD)p`ATV;1rOYzzF?NaW;VYtbR-hzRtRP3kP8pHdK$MP6mDIsUWyneyW_--}B zI>h^*4o6os7JemPHSkNDWVE}U@H%;dY@QB>+^s!1mlnU`i7#iF_SHGIua=rd+(krm zi;D2;NwewlTj{3c$2oC{tTI&$&c~_8wQ%l+av2t+BouK1uo$& zxc`n|0qgSBskzGqCW^s^3)27#5XbqglW4C$;NhUV3aEzRb-%wlUv@BeT*NWoH!u6U z(vh3*?(BGPv_n*~aoHIt4iM%U8<`}R?N4#ar>(^A%`?LHXRulP%py@p{TVdTRj{0e zz$6pqyUsD$V&m$*q-9`!Hq|f^N=Lc>9=Y6e}=xJ+ze& z_ga1sG>zqLm&hvHy^_Px6Fc;JvITuD^uHWf+apWaod_rFX@+$B^t~DU*(J6yL(VCU z?{NL{4`JQaB2}?crqL@kZRpGE`;>qdTgbQZYYS=4!K#$3n!rIP-kK5jGGb81l+z(W zZT6OnNxbCuo$-ae&+$xg)gK)DT?jwEVTu^2$=;PEmw<8jKz~k_z||w%%&0+iX5O&R zhqIz7jc!iH(mllWSxin zL>CWvee!Q!Yq%ri*vd~86=DY2@ni_yqv^hCB6iYy zD_a~97qRSUfW5D2g3SjBb3?F?{HAfuAK7vM0w(GbGX*BBe$U948#Z$xzw!@r8>nTKM^v4Qp1P`te&{CAenX@vUqfsA97@pFi-~V|Klf?zY-`icfOZAB z>couo10*%Og}5JHl#@$hzxWANz5N)x6OB^iTyBqExa z$4`zHNkV3`C>=2kOV?D(t?A8`KsAMAXqvZW;6h`5E<6LChtfy1{?Cazauf!xq{y4< z#3?^kWK%X29u1VbrfEbFRcH;-MYg>pcX0}~=*PQ*YXH=}+Bp7dy( zDZl?UweYPYh1o?rI1V@N2sq`)R`cN2Hi?PNqVz%i*NxpAAf7lZ;Rht52jgV&m9-Hu zwdkiE@AB&}C@CAF)4~2Uz;pI@7WK;puX$Srh@~SmWnDEznW&@z2X$1&T2Ww-y~xYtrI^kKVpS7^97N6e=9*J%k6H2-&#&u(FI zR|Pi`tmaqY+ z(^#7|nj`r0*{i}vs!5>7^tN;|j@;ldONo$OE6_(Z!vRjL9I5~qNxIJ(l&nTMA@}U5 zQsV{21v5XVjV>bdXMk*pAqGoLBt6y~f3|{k+vZ z?}r!}mZ`~D01YX1D|u}6bJ!rLLXtwCqc6r9%G(PIg|rCLZG;<-WD2&ODt6PY-)0zD zhkF@#6)+kkLc90ymeY5gk*XlHd!fLFYZAaq4l#gKx*a-MY+DVjS{xCoFd5ZAfK*;^zl@UJLFwHbQ;7pG4HHih6_%+2{NOnil?u^G`(fId<57(%E}+~f&ueeuZdt86{@ z;{nvTJ%4QF?<(0(vV7~t752G;P8LBFXe_Bb?{nY0e9Ms!;?(6Y&}!^tp3Swb##YP= z?L-Rn+*rPH+lUkJt4mZ+dpoo|xhIDm9xubS#jNS2TyZ2Wm2{SB%Pb{Rad8V;=ppLd z<#zEX4EqtHea{{iac|!my&L6ZAz)IFkn0my+`;q?bB~e;zYIcP z3Y?aGwih08P;hPW-oWta0)a*1_rHlA-yT|rK0UBB?_R9D{BNeFA8U4Oi##8e-0gQZ9gV(a+@l1y5 z=j^2JiUjZ{Xw>13@7QQ0$QJxxN8i{2{Y|{nm;@tosd9>wDpMIun((BOr(oxl)zyWiTuEc5aHiq@_jmLbET3 zoo#CJLLrxhz))n}E*ay>w%X47OJ-0Ek6DsK2HnqUuIf4fDodM@l@THF+I32MzGhoT zzhq-zXQ}b?JObhU<@?7{MqpJ$_l*e3qb8rvEb}k5qoPW^u2p6F=UIuFWDfx0kt z^~w+Kn2+wbOtg({K7pM{rTTc#Jxg+Yg1i^O10|`g%kyP(q;o9X-)`kr{rJi|lg!Z$ z#DY5`vKIB?AM7pd03B9b^lF{Vs$`*ml4_QE`*mVImNqTy^cQ#3yFaM)x#c}7MRO3( z=?%|R1>Y7y6u(SMgx)80udXT&+9^@?%f!uo|12=~84qJyY)wQXRouVZ=HOdRM_~7v zccU>D5y)*-S)*9DH!Z2^Yi-@PkcB?V_5sg?X2+Df1NN)=f*(Xrb}B3@r+U6Tj~h`w zirLSm2}r_?@@$Tmd|TOnRw6f9LjODX33c(b^K`=u4@_33%;H1&CReXNB)R=XR_^y6+YGbk5`+a5mDwq5D z#>JV{llxAH>7A~zye;Zlrfa3U?dtC`pIb;T3F-P1U7)0mE^k%k!P4}(;y$YNIB`_r zQk{b39Nl;w!?@!Fp2g7;S(MStd}J!f>1uWVaV>Rc!7IOA^r+)b+GF;76|%*xBd6-% zATcbbDp|_-sORwKN7n@TqsY=qD)SOg1Y7td4DY_&(6j)?{UU7I;gowTF@-3Ffg2Xc zLg!E(xivL-X=Ny3gf75O_wgmjNI@oibA#A|6hG{k#gBgN)~vLcdQt2~iwh-ap{E!@ zZa`IJjv3|w4f14-nV_%-)Orhs`OaB5#gqlg1}X7Nc+7Wcj2E9>j?n4p;FZ~IY1TVXmksSwpIFVN*G5^C z&8ha4l5dv1x4e`!NsJy{T`cDkf1_lA^$M!z6DnKb$23Z)xX;e3)h8bW1u04=H;7=B(J}R?0rk?%De>u z@o1n4?H`^vg}Z$pbJ!qk^@DrVDLpO+Scl5unbf98^X?F1Y;VRoLHiM0g~5gONq<6v9AAG!=iN&)OXn0M zv>gQxM>eWmgYfm;fMPSjSg!aJM0a=;pY-#G)v1$N=j4|rnT_heW^!tqI9*#g9lNT& zS~}ff7^&3nw|uvJs*3%~jl^osQn0@@tQ`g%B-D>Ybb^|Gx^uKzq2GTOVA6&ejBV1gw2lSHWh?k&$6A;j-k*S0rq zsZMQOIqG=Fn!Y9@Es2`;i%vUC1{-kSsBR7qE{2o$vmY+K#`&)8+)6sR_Gd?HqmSg; zk0!ToCha<}@b~+tQ44fxPrm>iO|La&H5>(e&UMCR>pP%}MK@Okd zb}{qbA~rd%rm!Q+y*W?(O5xRz0^S0F_jQx~?@AT(*~$6wkV?~|y7YiwgU#p1R)=hi zsB(1Tm+>G8pOYq#{kpg75sc3GaT2Hzr9(FhRf}Hb)i0?;zh!IpRa-nXR9*%LgDw6c zU-U#jcOP+|b%NWXe)0a0<*~v34TMx;S9X^u0cDi&+j)=q{@UZ+IU6t2B97On9jUF} zmTp|78On`aWuH$x6Ndzyn_Ygo98_Ity$YNrK_YT(j%Jn*9TLoQ@UBxk(aZ2$I3)sV zcY1p0!|Y}ScsVK8GOoJjX1 zyYehF_%#yI7??70=)29`?Rjj4&#!i`TAec8j*{29&ZauH25PPuVaM%0mtTMvgwFh) z+*~V`+R=BH=W`yWzzZygTVdDxL7fujZ`Im(O|!)p-ow6j--08slw2D&6%3rNFk1m( zM6dV-bHs`;8X4$HjAOOZ;d0J`m_i&{2CcH=r)B#UlQKJE|wqRX&2 zgefR1E2~rIp)82RVk9;tDP*{sI+R6GlAKpn-}g53ZF8{n0g)A4^dZt8DOYN#84sVM z_V%Ue=@e#eP;(re+iu43c=&(Y8-qD5i)CrY6X4Cmh54OmccYf;cG&DOloxZ|&zxH? z+c8G%lL+ZN8~277HHN_R-4`s%W(qApspj@Lt|lgEpVAk9ljGax@L_?@cy1jrTLyAh z?b^htyHpf9Z&KLs1=yhbBn$J0NKTzL2=6>{kys%oW;;Zg*_s`%im*Z-V`-Xtj!Jck zAYR&^?z$Btyf>cRvPyG5%(jVD`>LvFy-8$LjzbA0A3ED-Opjwt*p>{~Xh-Mc&a@%r zn*~(blR9lFj<6i)m9~BL*QOmC4^~>-Y zQhnwsOpN8A@5aAP-$#>JSm5Ga+29Mf7u|U4SDN`<_k(t>!UDH1cTnB&HBe*_F_Y)R zE~K$9jwf2HA|!HLL)M7guMXGv48z(^yX9n8l}?DC%zmH-^jrhqL88;Ev}{Kn5AFsW z*&qEb=6-N+(=7EVt%sX;1~#27O?0xC&L_>%>JV9_TY1^ht(C1=T^%jX?H)ZW4bIDg z5a)z#5zd3oc}^hKZR)N$L%;QGd_di~2nhbnRcNos&6|p{)?z)q^tiCh?c?a8%HIBw z;Vb)LU%rc{%caX%^IhT9@xbB}C+F={mGk&JrKerOOcMzFH13vdDt*(S&H0bn|Kld1LPqnSgEzVTxk4w-4C4MXm41fgb-NpP)+fT zdW5RJGu?YBd}|Ny+7ZoBuB?i0?UTX@I{AeqXDDp#NtdN}s!ji!gzTFB_7dI1>C0&R z37!qG8gJsD^BxoDZ#Q1a+XkoY^q9`056l%Q*e$8s{F@w% z>zk45sBFB3dsBMs?rpYKE1Qw73(+!sb7~b^DE_(V0#&P4)gN!)T-s?5RDCH}?|34S zmx6;&$z0#eV}O7F4|>Z>K|*0d|M!#Re+`vGJbVPB|LeK(7t()Cmj5#$c(VLouLeKS ceKt2D}KmY&42>$ec0K1AVW&i*H