feature #17458 Add strict image validation (Koc)

This PR was merged into the 3.1-dev branch.

Discussion
----------

Add strict image validation

| Q             | A
| ------------- | ---
| Bug fix?      | yes (current validator does not validates corrupted images)
| New feature?  | yes
| BC breaks?    | no
| Deprecations? | no
| Tests pass?   | not, but fail looks like not relates to this PR
| Fixed tickets | -
| License       | MIT
| Doc PR        | -

getimagesize returns correct size for corrupted images, so I've added another check

Commits
-------

7b6a96e Add corrupted images validation
This commit is contained in:
Fabien Potencier 2016-03-31 09:41:07 +02:00
commit 26c84dd85f
4 changed files with 135 additions and 1 deletions

View File

@ -30,6 +30,7 @@ class Image extends File
const SQUARE_NOT_ALLOWED_ERROR = '5d41425b-facb-47f7-a55a-de9fbe45cb46';
const LANDSCAPE_NOT_ALLOWED_ERROR = '6f895685-7cf2-4d65-b3da-9029c5581d88';
const PORTRAIT_NOT_ALLOWED_ERROR = '65608156-77da-4c79-a88c-02ef6d18c782';
const CORRUPTED_IMAGE_ERROR = '5d4163f3-648f-4e39-87fd-cc5ea7aad2d1';
// Include the mapping from the base class
@ -49,6 +50,7 @@ class Image extends File
self::SQUARE_NOT_ALLOWED_ERROR => 'SQUARE_NOT_ALLOWED_ERROR',
self::LANDSCAPE_NOT_ALLOWED_ERROR => 'LANDSCAPE_NOT_ALLOWED_ERROR',
self::PORTRAIT_NOT_ALLOWED_ERROR => 'PORTRAIT_NOT_ALLOWED_ERROR',
self::CORRUPTED_IMAGE_ERROR => 'CORRUPTED_IMAGE_ERROR',
);
public $mimeTypes = 'image/*';
@ -61,6 +63,7 @@ class Image extends File
public $allowSquare = true;
public $allowLandscape = true;
public $allowPortrait = true;
public $detectCorrupted = false;
// The constant for a wrong MIME type is taken from the parent class.
public $mimeTypesMessage = 'This file is not a valid image.';
@ -74,4 +77,5 @@ class Image extends File
public $allowSquareMessage = 'The image is square ({{ width }}x{{ height }}px). Square images are not allowed.';
public $allowLandscapeMessage = 'The image is landscape oriented ({{ width }}x{{ height }}px). Landscape oriented images are not allowed.';
public $allowPortraitMessage = 'The image is portrait oriented ({{ width }}x{{ height }}px). Portrait oriented images are not allowed.';
public $corruptedMessage = 'The image file is corrupted.';
}

View File

@ -13,6 +13,7 @@ namespace Symfony\Component\Validator\Constraints;
use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\Exception\ConstraintDefinitionException;
use Symfony\Component\Validator\Exception\RuntimeException;
use Symfony\Component\Validator\Exception\UnexpectedTypeException;
/**
@ -46,7 +47,8 @@ class ImageValidator extends FileValidator
if (null === $constraint->minWidth && null === $constraint->maxWidth
&& null === $constraint->minHeight && null === $constraint->maxHeight
&& null === $constraint->minRatio && null === $constraint->maxRatio
&& $constraint->allowSquare && $constraint->allowLandscape && $constraint->allowPortrait) {
&& $constraint->allowSquare && $constraint->allowLandscape && $constraint->allowPortrait
&& !$constraint->detectCorrupted) {
return;
}
@ -178,5 +180,23 @@ class ImageValidator extends FileValidator
->setCode(Image::PORTRAIT_NOT_ALLOWED_ERROR)
->addViolation();
}
if ($constraint->detectCorrupted) {
if (!function_exists('imagecreatefromstring')) {
throw new RuntimeException('Corrupted images detection requires installed and enabled GD extension');
}
$resource = @imagecreatefromstring(file_get_contents($value));
if (false === $resource) {
$this->context->buildViolation($constraint->corruptedMessage)
->setCode(Image::CORRUPTED_IMAGE_ERROR)
->addViolation();
return;
}
imagedestroy($resource);
}
}
}

View File

@ -0,0 +1,86 @@
GIF89ad d ÷ Ro«(DHÏÓÔm/t8f†j<E280A0>üÿÿ2W[ #V¥nkwLPQ&9C³É!49†)u)3²êꮳ´15%ITEtx8Wc65jCiw
e§«¦±Ôtœ¼KFCE‡UŠ˜;djè÷ø2FXx·¹Æƈº¼"'7toE2k±,<2C>ÑÜîÏLºèêêW‡ˆ8$G¾ËèL…Šg8€fs¯Hx‡e˜¥36G†—)5:GzHYÚ÷÷7)XU”ËæëE&V8B©ÈÖ#$Z£©ˆ“ºÄǨÖ×%#EoH˜FYažÀÀGceÃ3¡4juv¥«gVu(RW49Ugª²)*x©¹T+ek³¶He™7A7JdI+aB9F7s”0„†—SJ¶R¶S0jØèé
(Ug"*óþüh½6VuU[¦W{W7vFDdDw”¬<E2809D>ÌC K—S³iS¥—˜š(6X»vÆEj‰AQˆ¶ØÛwµ VJj¦ËÎN€|"*æìöiVBLaŠ¦ÙìòœÄóôôXxz™Ö×14IQz‡K”(Kb777<37>pµ7s}<7D>y‰W"W"*€‡ˆÉöõC0Hh´RD<52>Ei[#"%3#;¼ÇÆV£žE;VœÈѸe¹& $Xj˜™§ª !$v°®,[s‡„“)ah/,gri#^”½» rš¦PT<50>…«»WWd ô÷úX.GMEXt„Jž³ÊÞIvm _ersŽ³()  *)Og <67>BA}Š¢¤}ÃÈKMVefÉíðXZo7^^m¶¯p­¸áâ$?>íñðQgŠµ±=ˆ¸Ã`¼0,¡œ££ÐÏÝßßÈáá0 *œ®°£Fœû÷üöûúòïô 
$1PR¶½àH<C3A0><48>0/,1[[ˆJBO ($($-.-RM<>ÌÐ+NO_/o:2y!d¿¾Ãðëïóóï¤áá¡¢¢ ÿÿÿ!ÿ NETSCAPE2.0
ÿ , d d ¡ û  Áƒ*\È°¡Ã‡#JœH±¢Å3jÜȱ£Ç<C2A3>I²¤É“(Sª\ɲ¥Ë—0cÊœI³¦Í8sêÜɳ§ÏŸ@ƒ
J´¨Ñ£H“*]Ê´©Ó§P£J<C2A3>JµªÕ«X³jÝʵ«×¯`ÊK¶¬Ù³hÓª]˶­Û·pãÊ<C3A3>K·®Ý»xóêÝË·¯ß¿€ L¸°áÈ+^ÌXp@ !ù
ÿ , d d ÿ 7 Áƒ*\È°¡C#JœH±¢Å3jÜȱ£Ç<C2A3>I²¤É“(Sª\ɲ¥Ë—0cÊœI³¦Í8sêÜɳ§ÏŸ@ƒ
J´¨Ñ£H“*]Ê´©Ó§P£J<C2A3>JµªÕ«X³jÝʵ«×¯`ÊK¶lÆe´š¶©Yw$¤ƒP<C692>n*YjÛê7 †d€1<E282AC>H„â®;!¿{ÕU<C395>žˆ Šd¼˜|ÇÖàˆseìøE0 ]-ÄFƒ`Ì™·.hœëÏzD&}oꬾ:Þ-ÛÕî µo_åæ@ÄkÞ¾“auÚ½T%<1D><>¼ºr6jÛ~^uµqP¬‡ñ¯!€óáÅi…_?¾€{òæÎC<C38E>š À…`¥Ø¿o$ lgU}5à§ß û%XC|†q]q†— k!PÈÜ`:øà}ù%‡`… †x òuWÁw~8ÙŠ"NÑ †SIW`Š*²Ys¦ÙƒÉxÖß{6Vf^ŽÂmhãHdBÆÆ“G§<>ŽLVU…_¶<™ˆ"0¸äŽÃýá h p ùå|X1„_d^ö"Œ]¡—\ÌY%_Tîùný)è „j衈&ªè¢Œ6êè£<C3A8>F*餔Vj饘fªé¦œvê駠†úШ
ÿ , ! & % ÿ ÿ H°`· *\Èa·‡­"J„Ø°¢@ˆã2.ÐÈq¢Eƒ5I<64>%ê*©®BË—&3¢tˆ€¥ 8qºŒ‰2âH—9¥ªSÝJ™}¶Äi¦)ª§P‰î<Êp<C38A>Ò 7¡>Ùúˆ«ª¨7<C2A8>êB
2ãR¡_»F[˶ëצaGøp%V´<56>Ø¢ÛË·íÛ¸=Ò¬<C392>U-_+ÆÁö©Abç"´káéZÅ<5A>2kÎÜ×íãÈ)ÍV~rsÓ¨O3^»õ³¯±•2R•×ôf¸q/öä5Ø”IÛ¾<C39B>[÷jp%Àž¨°™ÚÄS/’ø ï©Ì<C2A9>_žÎ}zuäŒ KÙZ^+íÄÿJ©§Ò½øw5á!(ïHŠ°ðÓÐÖ·7μøÀÕ7Zbûq‡X¦Ä7R¢¡]tÝبŽ Ïía„ï)Hžl÷mè‚É}XÞ€ŠHÝq º&Sv†¨b$º8—ljauÖµXF YhÞƒÃñx<C3B1>‰t5è ÖY½-(Xܜŕ^~ùè vSRéË]ååÖVŽý(YYõ£Vešy¦Bu¥y×ctºùæB*<2A>÷V.q äLŹK1ý hhôýd—‡EA2
ÿ ,  / - ÿ ÿ H°àÀn[)\h°¡Ã‡ŽH±¢Eˆ#þ*ƒ c] Cz¼˜cBRJPÉR$Ã’=bY¡¦Í•8gŽ„YP"Í @ƒ
½™r'Ï
Cª»9´)Q<>$!&U)T<>Õ«X<C2AB>í˜Ð丙K«bµ@¶lÖ [£ö”Ô,£·pãšÕªöàD_aÝÊÝ+whÚ®kÁŽ5×°a¾uкŒ™7®©Ã<C2A9>#K><·&TÀH7JZòdÏŸá:P•ãÒ·ªž¤VÍ:´kѤ/šbAÄ£Û8rçþw{õkÊdcÛ] ®v tŠ(W¾hQ´Þ¿<C39E>_]¹)© ¦¢)XN¥»wçoˆÿ÷ýú,H†I=Ú®¬½{÷EÀ<45><C380>7\W•‹ÿÿ v'ß|¿M·Ôù"È
äF`<60>Á˜ ”p+žà` þÅÞ„ÖwßùI`JƒLtØá‡"Ž(Þˆ&þq^;U@ G˜ÐbB~¢„wda£<61>8æÈU<C388>ªä<>Eè`„2.ɤ“>E¹!•ˆ¤Zcf“îhÝŠº¨¡˜Y‰%vbŠêqð¦•pÆ)§hÚ÷W7º`ÇÞƒ|þƒ%™Œþ9š Oâ‰CƒF†¸h<68>¹E…ƒ"´ß¤•Æˆi¦K<>wÚUœ z'à¥óý—yª@éè~ªV žvÛŧ蘱ʊêŽÓF)ª½¡t$þ™Á°kì±È7*̳оDÐTÔÒ'Y¶t2Òíè:îU ÑWg­¥+H<>µ[žU9q$í¼ô¶åؽ±ÕÅU<>ýÛ
'z[ÒTTq¦Wš<57>?i•ðF¯•àO<C3A0>b±ÆG+ðÇ1Y„¢Ç%
ÿ ,  9 8 ÿ ÿ  Á<C2A0>Ê(\Èð Ã‡vcèNVE/6ŒÈ"ÅT CŠL@RãÆŽ(?ŠL²¥Ë'S:Té˜Í8_f”éqáÊœ=
Í 3¦Ì‰ÍÀtéPEyLZÓ©Õ¦O[š”Jµ*Ö¯`±­ˆ4¥O¯aÓKÖ,I´juxFW-Ô<>F "}{3®Ü¿€ç
{wgOV bñÚÂyîÙÐõëâƘ33v|/噕™^ÆCz´<66>?ô§ €KËÖ1»6ÝÓX=¤ŒX(lÒ; n¶qÍ*æ-¹{/ËßÀ³HŸNøéëusÌZÖsèÓEÿO½|ñâ„™œÜ{Ktòðã?<3F>[»;½Ÿã™ž¦ùòUG_vu¤†Ð?( tþ ò
‡]}þ3$ ÒÆÆ ,áƒBHž„6f_C$9à Xáb‡0†(bÅX7¡‰'Z˜_ j àÁL˜pÄ %¼âŒk<C592>x#<23>,Y$™w<10>À†°°bÂ5Xi¤ƒH¾Ü8¦ÖJŠ¶ <52>XfùOŒ\Îhã6yß… j`C C^‰ÄžZ¶è_—%†)§ŽdZ§ž{öÑg‡2¨ä%ž¸WvZdš|ÂÂ& ¯€©œ<C2A9>Qjæ ˆfº)§a@ª*…rî•@”SÿÚǬŠjÊ(/<2F>F¨Ä»®ÊjIP©¬BÉf®ð­Áë²½úšYœÀr÷êwp䢧BÈì®Üb­“<>¶h ç*pd—Û6\SºéØ]n˜Æ­ÈÊ×n·ï~;'BÝ%1…ÁÍÈn»ÎÊU!wì)H°ÁŽ¾²¯»¶ºZÀ*îÄ4N¬DÂðF<1F>ôjÌ1usËï³þÜHPòÆn~™êÊÈ-|qkðhr„ÔÕ˜ð¯m¦ †3 t bÅÛSBGËL´ ¨qªö40'ÝÕõ1• g ¹ÅWÉÇ¥­öm
·™D„¶Tà×k˜\Úµ×sÃK&jþêµÖ\<5C>%õkô>¦ÓVyÜU@Õ*Y„7.ïã<C3AF>g.'°”WnùåIEÍùèá~Z¸0§®úÛ¦ŸŽ:ë­wTzì¦;G
ÿ ,  J < ÿ ÿ  Áƒý)\È°!‡#J4Ø°¢Å‰3J´È±£Æ<C2A3>B²ä¦“ Syò—IY0cÊ4©²&ËgdæÜÉs&JoêÌ©%‡Ñ£H{º£ ô¡P¤0ŠF•:•êQŸMWŽŒiHT.^Ê {uéϬÿ¶r­
öJÛ·pÉÝÉ´éV¨cãŽqË7î\ºgUvL ¯Þ¾‡÷¾<C3B7>
8ðG "§2
¬G˜#ÞœXncÁ<63>%¡HRù²—Ó¨5wæ 㘎1V$,<2C>tiÔÂÚèÞ­zuo×ë†l‰€T•ã·qç¾Ä¼yêÞÐU¿†ýø¤."Æ+©ÃÝôòæaœóÿŽNÞ3õáÅÿ×Þ]ˆïáÁ‹/Ϻõtá7èO/AÝvAlñ^1ñÉgàx™ùf_peì§Õ~ JæŸí<>°Ã+fX xÌ=GŸ_ æá8$fÇ€jàq¡†k°x JWÖXb'Öb†{+®ñ -¹á|1rvE­¸d#7¾àø#ª¸ 4TY¥<59>CvcŒÀÍXq2™£ PJIå<49>i¤ $Yidˆ´Þ“Rl"•Vª©&Dº)£Qfi¥Þ˜dZp'žz&ÊgŸ~ÚwÞ—ƒ` Ðyhž‰¦¹¨<C2A8> ƒiEJéRb)¢™îé"£äÕóÛ§•ÿH!0J꩘¦ºf­~gZK%âÆÂŽzk¡—êª*¯½–ÕgKéÁ°Ä[ª©Pf<50>ª²nÙ¬b°[F*ÄÒjm¡†â±-šzþÓí·®¾ú©ƒãÒZ¬­™l»í¾; ¼ñò.AÐV«¤“&¬î¶‰º»é¿G\ß‚ÐLR“t껯@ý®z‰Äƒ,/ øÅ*aÂ(_x&»š¾ëEÈ0 <ºÒu„¦¨rÃ.G³Ì,(Æš9PÏãýì󟋈ó‰Zèqk¦4ÐÃ[œ7>)5<>SsšôÕ2ÓlsD]{-%Õ¬îE¶ÄæŠÞ?µUÈvÕ*ööfónÆí4Ýu{7à<37> ï}߈…9Yrƒ<C692>ˆ™mV7 &>îâ–)ç­n3­µ¸ÕYwe™wúíá~£·é@ ÌyÜJ¦.å«kòÕ믓<yå@ÕNUë¸<C3AB>¬{„ ÛE{a¿¿˜ä<CB9C>ÊžB:%<25>{U}7ˆ8±žWgÔ7}ýÍkIïi—Õüù÷}Wä'eþç¼£Ïu´£»oÿð N¿ü"f<>üý>‰ÿB§¸0I´Éˆv Ì
˜Á:#
ÿ ,  [ ; ÿ ÿ  Áƒú[È°a·2ÿm˜¨°¢ÅñaÇMCfIÒ"Ç“BB¦¨RbÉ—/QNT™²¦¬•.mz„ÉӤǟ3iž¹9”hÑ£5<C2A3>ö\:(M¡Õ<C2A1>ž¹AUêÍLa|êΨר`«ŠTdV[;zM°`j*·9âÊ%«¥®]<5D>`¯&=‹‘ãÚ·€çÚ¥:¸yõâä«0èßÀI"Ã0<™²å¹Š¥eLЯ$¶Ÿÿˆ–\¹‡i ¨ã”¾l¸ìÊÍœ<C38D> ™ôéÔªs³¾93EÆžg×vñã¸*©fØ1¹ê>œxqäÉu/gîúHém©Kÿ€€Xyë×±gßÎÝ·Vð´Ï×q0?QzøÕ¯g_Õ}IÇ…&_}$ÔwŸ~ûñ×Ýo}9¥V|óé@ fà……ùe¨a
ú—_ÅG<C385>ÜQ"‰jT(Ì…¶ˆ`‡Î™Õˆá !ä¨H &€‡@®è¢‹ÚÁØ•ŒÉ” ôhT” %>èèã<C3A8>Bù"íauQZAIÐä“Qž0%T²ÁÆXf©%‡F"9cŒbŠP™¥ÀbæžiðÊ úæqÊyЃ:`Î8B©çž|þ³æ+—¸9h…zg¢‰b <62>“6@aEž<45>òɤ”VÊ⥘nל‡:ÿ"“æ$cÌ.l¸¢k©¬˜ÊŸÅ¨º*‘­ºº K€)
Íd§"„**¯{žJ[¬±¾ÉÚmMŠÖR«“jîJ-,Vxð+¶Ã²Êe—\I´l3âþól¹Óžû+°Ùjû.¼†"b²)Ñ:.£ƒ˜«ïµÅ´ë¯rµzìœj1+®­ä&¬°©üjè0¡K ë¡—±€Á7ºq)–„бLJ¼mb7& ÊM€êüF0 §ÌºMühäÑs°Žjš$†Aƒ¼­<ÿD©Ñ2„4­(v=Eu€u†SËóAÙb3rƒŽ±Ä„ô5ÌpšmµÝgÏŒõw…ÿ7y€ØnÙwã­÷Úhía²Éâ (vÌ….¹äý!žøâ~ è8ä>yÞ /ÖSߌknÛ<6E>uNyå{ÿGzãè 1è´×NsŒ|)» ñ<>>3ч¿Š;pZcÞûìÀv5ëï{æ‚%/ýí<C3AD>þ:ôÑO™6Ôkêüõ_eßÚøp ßzlJ%þúi—oUõgÑx¤,a¹OYï¯Õ<ú¥¯>ûÌûNø÷%ÿÑï€ÿËŸN0×0V¤³Éî£À-Î{<”Û‚@ý-0^dü$˜ ÎO$ !Å8uBZÐK*¼Ü_ˆÂÅ<E28099>'¯ñV¼žsCô)KV%ì!ÿ j(¯ ±‡?,"L
ÿ ,  d < ÿ ÿ  Áƒ*DØ­ŒÀVB6m˜¸°¢Å3œÈ±á/<2F>CÔH²$I<>e$>D±¥È”0ÿM3I³æÊŽîrêÜ9r Ë—*m
½(&OYg ]zÔçÑŸC£24š4•Õ«X³“É´kÕŸí(JÊ2k³hÓæXëµm¨·]cŽ­YÖ,°»xó²ýZõL5<4C>Õ †Ët.Ý<>Võæ]ÜÇkoHÜ¥²=Ë—µ †jآǾj7M:Î?Ó§1§ÆŒÙoRÎ<52>§rµ+º´m ‘â|ØͺwkÂ@cô·'%èеo_Yž7oß½]>¼8bäÉK3¯·]ÞsèÑ<C3A8>Sÿ¿©òxÚì=T¤_Î}€{æßÁÿ?–¸ýû³ŸOŸ¡¿zåc´Q<C2B4>{3Ì |ò…WO6Ýçàuûù'Œ„üý§Â<C2A7>¨! *(Yøá¤_„za¢@b¨áŠv8l%=8ŽQ(@à@‰þ¥hâ‰ö¨"˜Ù¸ 6nŒ-wì€Ç“x䈢<CB86><R9àŠ6'äE… 7U4s€wÔðÆ™hB©ƒ„ÿìèæX©åC:"<22>ô$óˆ™è âƒ6üs¦“O² 'œqf9'<27>HIõ%˜è)C‹Ø` T@ñ<> 8ˆBèšo†ša¢ï)$\ÉEÔCºø€¤“ÿaŬÿœ`«%ƒ <20>…šUö:*©¦žJNy`7Õ£AŒyA¬%@c« G@k… º~ê믤*ê£<><C2A3>õ¨·^7¤°bú,´èÖÊ©§ÅLxí<78>À.Ê­<C38A>ß&ðèD”£TLFB<46>ç#èÈZʹѦKE®Ö
„(¶q+ìL÷âë@36âû%½2ú+³Íl0Âí¾ o¼ÛÎKo«xPËľè{1K)¹š'Ç\-îŠze¶í•l2«ؘˆÊ,Û»¯CK0 ™ÖŒn)¸&Üf “ì3£''€ïCí2Æ É¼¬À;m´7ç¬3ÃÚÆ÷0«õ½µÑ/?X=cëlÁèJÿ ²ÚVîlµÛ.ˆ<C39D>ÉÍká~™Î«4ïÝ·ßìâÜ+#Ë)¯°Hùò¾_Ë•˜y—]ó´ƒX#欷78á ž*¸3ÆE<C386>G®n܉ÞßjÉ €³®#Û=_Í9íÈ# ÛD­Îü§é¶: (»S˜®YòªBôáFãæ^zÇPwºÃS¬^áðÄg¯ýVÜÇè¸ÒÑüi) <66>þ<EFBFBD>§­¯]àWrßû:?<3F>0OfŒXþð°¿:¤Ïzý w˜ù F‡áˆÖj$4ôX<C3B4>=ÝY ·.ÃX'?$QýG5‡ÁÎC$Œ<>®âAÿ9G7Æ{¡j ó—ÊðA´ˆõæ3: i3äH"çâ9Ž¹<C5BD>#3Êä;ÒùG·à·Ä"M´!âb¨(<28>Áh†2G¼ •ØE&Ñ5E£Z<C2A3>È8¼Åw¤ã°ÔØÆÎàÇ<rcãBH>B¥€ãqJHe:º…{¢cci¬GBòˆ¤äA<‡ÉN¥(2 ¥&7ÉIOå(<28>•JSz)A™$udT”ZºR&¶ Ñ*3BËWºR—»Ì`ˆr‰b˜Á4`/qYÌø!3™¼ì¥ƒ¬3Íj>š'ÌŒyMlvÉšàôf"ÁNqŽœ6 
ÿ ,  d = ÿ ÿ ¸iÁƒ*\È°¡Ã‡ »m<C2BB>±bĉ-jÔXæ_1nYÑŸI<C5B8>&OLø±¥Ë•%;ŠT˜²¦Í*7ºÜ9&K™ªÄI´¨PŽ<{ú<´iѤO<C2A4>B„úÒçK§£¤ŠQêT®0·bE©U,׳f"X˶-Ù®1»†”¬GYBÈå-£·¯_»wÛ
üó-Ö²tý
L +U¨3<C2A8>k“üO²åÇY .ØÌy0a¦YášEœóåÈ<C3A5>µT«ü¯j×°a_&ËMWgÏŸ5<1E>¸wcÎŽƒ·~=\žñã‘>(_n¯y¨_zÛžŽpèÝu1â-<2D>:‡÷šÀkÿYŽ|•ùó<C3B9>Ò½¶{ê·sóÎîn»ýÓâ¿ÇÙý½ÿ ¦çßz˜UAÄ<41>ð ø^uJ å[bïyWNpR¨_~å `v €Ì5gàˆ$Â7ƒ…ö K¶X¡°%ÉyÖèူ¥£ãŽ *Èà\*žx‚À™Ä‘(iä…¯<E280A6>Ç<1F>6F9 zöT<04><šøãŠ<C3A3>ùŽ `Ö!æ˜JC“Î8£†~ᦔª·^3tBPg‰ZÒ'$Vi#€’&™üq&“gªi^o6zcœrvQg ƒf¹àm6b˜¢BÀ§j„º…„z
‡¦™!£ŽÂ©<æÿ`Š¬±Òs§<73>[Ÿfxúį ŠªÃ°k*†¦êd²Új«ª'&(’˵˜$#¥#æÚÒ®ôªÊ¸¼an°Â`쩨&> -‡SÊC˽®Ü+ƒÙÚzežn}»i¸äû碛®
»ûîšÎÊû(zÆ•b1pàÃ"üNëï¥BîTŽˆ[ð?' j±m«ì“lJ<o´ê!q +Ð\¼1- °®Wl²Á)«ÌòÅ\òò?17<3ÄÛ<qz#ð<>ÇÎ>o4<>¸J7rFüiÒJ/íòÓQO ¥ÕÎâˆt3óI c Ð"0ÿbå<62>¸qCrÙãðÚi7m»Ý,Ü®¢GwÝ<÷lùÞ`<60><>Ýv Ù}øÁˆ«½ƒâ‹Ë,žqoC-Å“ƒcwå—ó­ƒ·Â÷9Ù¨ˆþé8pœøâs̱¸ÃË>Ëûì´ëýBæ:hÛ¯ô˜ 输¼%
Ü¡r1§?GãMÊÓúòô;!Ÿ°bBô{³Qíµ~|=ièÝ“þðŠkòW3öµvtÓZäwú)"öC‡ó§` <>Ù6X:­! §sZ»EµªY­y „ýöfêkù{Ðö5=•nƒŸRã 6³Õ•Ð€T8ÿØÀ"^Nz”øŸOƒP´àÊZ&Œ*f ‡Éû¡·µùå툃<CB86>aôõÀ1N¯‰h4{ש6 éÓ¢ëäfÄ/"±Œg\â ÷(Æ4*Œ<>â
˜RD- ^&”X´º<C2B4>·Œý,_I´Öýð‡ÇÆ0<C386>j ÃEªN: I†,Ô?Ö9HU,]sâô4p z`pZ”Œå%Ñø)Mn“•JÒwvIB9*g®aa0XHFê {Íصd¹Lü)Ñm$UѲ§,^Z“f4á"ƒIL'b [¬°EÎfÆš%Ë¥Ž^tÍCb37k^sT Ã\h lï¡Ó8Í™ÿ-l½r“ê §{PÀÎvúPQðl”<<3C>CÉUfîž0Ñ\ÙÏŠ.S[µÓßÂi©Û¤Æ ¼,)ƒhçèEVšìд#JíÓ¢=¦DA8<>v¤h" Ü¨dÒ_øƒ{µ TîÚÂ'}¾4[1<>(ȶ„œÆQFŠ"POQ%¥ÎT0
êEz=|Ƈ>7Íie ŠœaÆ)ÚKkàªZTÔ_ÕÑf°¿ò£ÖljlØC×¥®5­ZÅ \åê­§èµxÍ+b{ֽ؄CóLV*ÔŽRä0óáfÃê¢Î†4ÞzÏdQ<64>Ž }5³ µ«g«˜èÐÕ)¬hq¤Ës¦³uUíj!ÛÚÔêi¶5‰o¡SŸÊÄ6¶Ãý-Š’–¡$7)ÇíÇstÛ±Xeº¯EHN@»”¸L×+jAmwZî:·ã]IyÁû•ª¤·»F9‰|Õ[]ê¾7,쥯mï{]ó’Ķ™á¯€¼_Ø'
ÿ , d d ÿ   Áƒ*”U†¡C! !>\HQá¦3jÜȱ£ÇŠIò£É“(Sª´q¥Ë—0»…œI³e͘,qêÜÉÓæÍŸ=ƒ
•™ÓçУE*]JÔ(Ó§[EuJu$P¨X¥&­šµëÕ¦`½rK6ìײ[­šEËößÚ´lϺ<C38F>Š€î8»pãÖÕÛö.Þ2Y윗/áÁ‚oRü±cÃ<63>#Kv̸rãÂo3¿´\7<>çÏ<C3A7>Cû½LZs`ѨA'V<>ºäÙ±§[þSŽµmÖ¯sÇݹŠoÚÀ¹_Í[·ñØDÿ^®¼¹sáÐQ%>ùêçÌÓeÇ<1E>ôŸÔ'/ÿ½¾€»öó臫WO¹ø÷ñÄͧŸOß»}]÷Û—¬ÍþçäåV0`}ÜåÞm šfgä5W`3VèÀ„¸]wám6 x½<78>(`†¦¨"‚Ìýçâ‹Âö ]&Ò†b 8æXËŽ9¢È"€5Âc*26a€ÛÝÈ£Šô¬h ?&è¡<C3A8>güCäDÇÍåtôM¸¤Ž_šÓ¤“n%ˆX:tÆgkVce*Õ¸fÜuz&˜ˆ &™u¶ˆ&•pj¢Å 9´™&IGÚx¡{ê)fžô@Ú£<C39A>(”)%’©$Q覄v
œŸ’#j¨¢Ž¡<>>
i2yŠÀêªNÿZ欗VÃi¦¸v‡®¶vÑë?öØzXhʙ㫮j ì4«¬«ÈŽÉ§¥(äÚæ­f«ë®Ü~àí·ò„ûÁ‚¾-j'ŽÈ6Ëƺ!´ëC»ÎBëŠuhÌ› À`mÛöÛm$ ÿóO bp ä2i2øá.PD\ŠÄÁ¼.Ná€Æ Lµšê멶"Ãðï*(üOAT÷¡Š.ÃÛ q)'°¢ó:Olƒ  DYàÇ!“¬´ÉLsò=P»¼ÂÔ_Lí—„{¦J³7ç| y€Ý‡ &”à3ÐAÃ:4Lj40=$÷Ü@ôÀÅ¿q ìrÕS÷ÿíw‰çâ¹58ñu6?£8âa“ ñ»2à€¶¼ó²]G˜g®Âæœ<C3A6>áùÝu?-ð¤ûmú
XSøªªØ"B³\mBˆ<> ¸<>@Hâ_q6ä5ÿìêkíÅñš#¯<Ÿ×3Àó£ŸîÄôÔKàŽÿ´úººã|8· þø·³¾SÁ<53>À Ϭ«[ÄOôÇ/Ì%ø“øóß¼ó¥“õú¶œ
­n{ïRßÄ7»l€<6C>|Ä<>ùa¶õ±Or“«êG¿Wxp ü`ÂÀ¿”Єѓ†
ÈBÔÙ)]´½F6f<0œ ú÷® bðb:€Ÿÿ>˜…"†P„#<áèþ1µ¶p€æbÝÖеy lÇÀ¡
òЇ?dïPÄ! GD" •0ƒ[ÜâNl<4E>Ÿ¨ºtqO†ÞC„Øl¨Å-î£l6cÇHF2<10>hLãéF9HÃ*”ãY †mÏY«Y ö‡\dé¾Rà ˆL¤"y HFROœ^ë Õ0î½ <20> Äb'm÷Iòñ ”„« 4\1ˆb¢Í”§L¥*W©„VþÃrl<72>4c)Ëd-ëŽxôZ'=ÙËŒ[ÄŒ9d¢2•«a#¡)ÍvRÓ –´¦ðÊ» å :9ÿ¶~Ú€œðúa2ÑÉÌ9´RbHh;aùD;ªëŽD ñ)>.†M˜CøÄ0ÿé®yƒH'ªÐ…Nr€´¼f¼.ܤèø²aˆõŒ˜¤tßG—©¿,Ò -©Ic)Å´±45%Ü,È N™Vt'°BÎpšÓ<C5A1>t xð©I*T†¶pGñÔ ö"Ç5.¦øü¥ËÆ3 ­TæUÉÕ®žtzZX<øºÈ<C2BA>À ýt Z?©Ö?ÊŽ£dZ\ƒ'
eŠT<EFBFBD>­ìªWYh 
<11>¯³Œ\ Û<C39B>ícaá»<C3A1>v®æä)T¡¾³ŽPöúZ
ÆÿqŠ#ì/)±ÖÒ"VŒ•\!‡ÛØÇ~°v¥&ÍüÀ\±Ž•žïúkÚñ<C39A><C3B1>·:ücú~kNCÔ*dåÐÚɲ<C389>¥1¤Å-Ð ìvÉKëîvø]kÁ¨ÁþžÑƒY 0VÚÌ[¼ò®ÔKl1ööΖ¹ <> {<7B> P"|ö5~ÅFÚý^ð}Û[ÝÔ Õ;X¼âÅáè ÷- æ®XU*a4|/Ÿ¼û£5êáÏ¡jÐ \Gd[ôtÀ ÖŸ™(À˜ÁE°X³ì88,V÷©è#Ï*èÖ)ËY$²<>ÕÀÁ¬"™~Ë{^ ©ùä¬/ÿÂ8 ªü
<EFBFBD>ã¸qÂ4Û‡ÇüåÙŠ€ƒòÛ <20>æä9OÍMÎdŒÕ«^?´wftçmÃ7Ú¨*ƒËR†Ÿàˆ[BZɳ[èÆ· ~v0^oœ…'Øì’Þhu§»ûVÆš¶ì8ݺ2:Ô T¸H5¨=4ÕŽf“DàjÙÅú³ …v6Æfé.¯:¶Ëf]ÑýkÈ­[%×°†É‡<0E>BgJG3ÜÛlX¢Âµ“u8yŒþæ:Ý•-Þ¶í×íoÃ-iÁòU>Ыo=k¥÷f=Ž*;Xs2qó¦7Ë)¯fàû7Q¼SñüÝ4OÙŠT¯†5}¡ç¬ÎÐÿHù³#žr=ONÙ8ÒŒ*8Y™ÌZS"Õ”*©6tûé`w×Të.R{ªQv°ž ÀLõ‰Z¸Â<C2B8>Mt.„rm=øIN3f œµ¼ÎC[ãŽN…LüäYO Ìd"Y€ªHSúy‡zt‡-PªDïgµ9êå˜kh:j{Ô÷ø(H@̦˜â¿žTö]Ûï¿qÌôžÍH˜Z8l¦xλbœ òÒŸ„ù÷I?—ÓFßÍ/8<>§ýqÆH/y©^)†úáçŠC>òµ¼u /7mæòSðM?¬Â;ÿ.
J lWgqÚ—žù¨ŸKåq/ùrA<72>òË?—TN_"]ü¨‡ÐˆJÃ}Å=÷å ÿö×OÿÝÌŸõò7<66>ý÷GÿþâwL" Ѹ¶'"ì—Íw{ è Ø€¥1xø€+A<>ˆ<>ã¡(~A€¨} X$X(€%¸!<18>(¨‚,Ø‚¸'X<>1hƒ7È<37>3h<33>üǃ9øƒ2ƒ@X<>ˆƒ‡²€
ÿ , d d ÿ Ë A*<Ȱႇ#r+7¢Å3.Ô¸¡£Ç<C2A3> mt²$É<>D V<>ÇRË•-YrIÓäÉ6kª„³çKž>yÎÔ™gD£
/]Ê4¨Ï£D"<22>º³éS«NŸ¢”ÊuêÊŒXej«+åÃ*g³VŒ:®«[‰a—¦%k¶¢L´Dðªýš-U‡ öælW0a½U±"@ûöï†À a:Ðl²\Ä_3³âÆ~ÿ<>•\¹t…Ξ Ó­;—)h¨H [†@»v껫U÷-ÓïëѤgŸ¾ªº8k ¾“'8(;®ótƒi£6^á±Èß\•fµ-Xºdç¼Söÿtœ}ºyîÑŸ«<17>ùã좗kGýÝvú÷¹ë__´uù©üáKpû­W`æ'TY¬aYkµ™!~ ¦3á…"8\V2\-jâˆ$há†""×Ø{Àñ&\Š“Åø¢‰4Ú&ã‰Ay߃<¦GÙ<47>5N"Cö#<23>4v[y=ú$XË”1Òs$RV™¤wf1Ùd<C399>O&"£˜dVIå•gjy%\ªÕQ*9<>à—<C3A0>(¤•Y¦©çžz> Óot*ˆaGòihŸkfÈXQÁVg9a*é™Tjé”ædš =—bše<C5A1>ŒŽåáO|ã˜FâÙ©¥"°êꦭÂÿêiþùX 1•Š"
ƒšéé«ÉÄ*,k¬±$Û©‰µ¾Ùh£±餚ڢì±2û ¢p+ÊÏ kí¸i†(•­¸
ú¯l
¬Æf+CÞ²1Ƚõ~ .¼ãnZî„ÍÊçaº»â¸.ª¿úl°ÅÎKozØÀËÄËPlo¾Çò[i¢´I5'Á8†|°Œª¾ îÅSaE!FDÜrÅ_ìm¸ýZK 3ºÇ´;¥ëÏ¿&ÌjÃ(sPÈH?àÁÑ,·üò24Ìl ÍnØ\¤†èî8XžJrÉA/ ïwÌ[ñÑ ¶ÚLtà6ÓMC-u²6+;E„^‚üµÐ«Âÿ:¶Ã
,½6.„Ç`ø9…³ KÜsk°…Uãü3y6ßÀ^„àCàÂÂç “ñùሿírã<72>Û]ÛšTt{cþϵbÿ ± ° ýIè³ôÞ;!€„N:ãÛÖy[mÝš¦ï*L·°k ˆÙ¹ã9ð¾ =8†tÿûèj/s·ëŒ{ü<>£;»7“]Ãû ;tô¶ß®û<Œ€Æöü÷ÿ=ánXÔžQ¾Ç™ÏJ(눩 ëšSÀÃ?úU~l˜î—?ÿy<C3BF>Á3\Óh0@ªyÁ<16>£Ì³Ä3Ö€^–À1J@Cr@œ¶þ¡éMÐ~GøÄ>ÿ°÷Á"~¯p€ƒHH3ÇAÎ 7˜ØÕ(z@Pe%ÐÝ>þ<>ˆ ÚPb>£¼âÅà N,wCxŽ$:s@ÆPøÄ ™XÉÏP ÀÅà›Óݘñƒ  &ð"yC1Æ/1ä ¡Æ5²ÀpIœƒ&•`­;Ù#Ï<C38F> íðqŒ ìÕŠ\¤+÷WI#‰ppÄh˜Ï 3ðBZb¤ MìJ¼È"*E‡=V² ûèâfÈHÎÒ<C392>Ãâ'¦ÉË^úqJt„0£ðÄ<>uúÇÝD) -°AHKå*ñÿýµÒ•Ùô"7eø,á ã"O<>ÈAƒ{æôå%Ý8LNV<4E>ï¼ìÄô“”$žGæ>û9V<01>¡JÚH,jñŒè9Û¨‡7ÞÂQÈè-¼Aªy:óg<>æÑô¹JæïŸ(E),çÁT¦
E§ Ç9ÑAT¦E¼$… G<>ºÊAi#Vù8àøìÜ>ùiT“* 'u*T9àRiN •WŪµÊ2uvõrƒ8ÚQ‰œ5­„býG üq<C3BC>®ll\¹‰@|¢SÍF9õšULÁ¯€¬`™Ù¥¤œµ¨*QIjT£>V²KE%ôg€<ÿ`i”Ì+gýÇÆ"˜4<CB9C>ƒpE>G- "P@j‰
Òö(<28>m[a9<61>£ÖVey0€e»Û½Šð·Ÿ ,5@A^7pôŽ(Á@n«Êæ: Ð}euYûC1ˆ,¸n!Û9C궻½ý­#à`ò’·Å]R¬ˆÚqæV{<hl8x€M€ÎV·, ìuKPRW·»ý»¤g•Hà˜°è…J3k÷Ãÿ,)\çaJ¼rr½Æ†ƒGUîX{"~[0Ml`j„Õ¸ÜXqr© S.>4þ<E280BA>/J÷gãlâx% ë' pYä7ãôï<C3B4>gA†ÒùÖiI$ðxÌ%GI€ÿS-Ç•¿œ‡}d÷¦ñ<C2A6>ÊÍ"èaÜ28²˜Ž¹·gNg<4E>Õläu­2\ ßÆN™µ#˜ ŸUjP
èð<EFBFBD>b<>=í^x·A>³Ó˜ž¨²<C2A8>E0êöÌ‘=ꦻÕÀMœƒ`B¡É€ë˜bµÌ<1B><>æV·ÀF³ž<C2B3>´<EFBFBD>”,„ªlÿ`AR¡¼ënû›÷
ç BÊÜco„o,ñš£ôÀŒmÌɺb °ÍŒy@9¥rí5½0˜ÃânÞ5¶/µ{n.C<>Œ/mª¥-é] VUc±¨p9aÏÝöæÃÿvÁzι ¸À[Rgжàÿ'¡:‹Œ%†]<5D>G!Ý^ .ošÏOµA¯ÝÇó˜»/ƒá$÷ç¬ÛACÑt«\ñRãÙœâx¼Ü­02<>®5d)éªoŸ{ý}Ó ˆˆØì‡CZÜ,6@M:ý£c³ ü25s<
Àìææêû–Æ|N=€Üm%Û:pU>éøj;`½1Z—ËYt7Ñw¬[áï*<üj7®“ýŒäNã¿ÁÇ[ \F¿Z)ÆïöÇÊ|[þ@ÍY¡ïQå»#1O»ú¥,—«WÓ~ÈÃÞ„mhƒ¾à ËOæ¹Gàî<C3A0>$ñ‰‡žïàÇáÿ¾š¯ÓSì÷¬_š%Ö®t™‰ ™^P ¾`÷lýãòÅÒ}3kSÿoßRçú†PÃ7;™u×-ör~I·€`ô|w,u}`Ew ×*Gv³vþçM8zÈ7eS6bn&(3lp<6C>t<13>«°
Èõ€ÑÓCùGw«¡d/äoè€þ9ñÂ<C3B1>Ï—A)˜ûBu•òDÀqPØs08ƒ6hKµ$…8<Xz„t2*X3TÂ+e• g•-SG„º…ý‡ƒTt<>·0˜ó<Xx<58>rè…_˜" w*¨{)VµÐ}j¨…Zè„oˆ) Ã/shˆÊ‚ÚÇ.q‡¦ÿWA±r†{Ø5<07>…Sh‰dˆ<64>ƒø†x¨1b£ˆˆx”v׉;ÈcQŠ=´Š?‡‰2¸ƒ˜4`C~3+ôñ¤ø*WÃh(«XKe$/:„yu'AS&„ø.œR‡6ò'îA"¼¸‡QÈo$Œ¬(ˆÔ"QbŒÇ<08>%á&-Ò‡åW<C3A5>:4F™ˆ<E284A2>Ô²pÌH"ÿB!ðÀ@ã:1WKw<>!Ø.úh&Ó"!'Êó(óh€—øŠ±¢{P¢Žv<08>ˆ(=“ôx<C3B4>´ô€ªã'¤R»«á1Z#<23>ó8Dc<44>ùˆç±†±y¸Rw…HŒëèŽ2IJòŽ,Ù’”âÁ<ÐŽ3ù„4Iq“';ÍX0øaDY“*"”ì¡,$$ ©Ñø“½á”C™GÑSôä3½¡”Ky²<>.PÙQT¤aÁ5­Yk<> q—A—jY”¸z)–È—rù<72> ¢—¯“•R•éZXÙ"©+¹±—`¹ Šù—·Ò3I™T¹$”Ù![ikÙ “I žq\Vi“H¦™Y™;#šm˜‡©”Óš£±š ‰£i;#”m¡<¼¹ÌášÂYðhœÑGÇ œÈ™œ
ÿ , d d ÿ   ÁƒþýC€<43>¡Ã…e"Jœè°!Ň hÜÈ<C39C>ˆ„* =~ YA¡É“(7@T¸á¢8.c¾”I³fÇ$ÓéÜ™2eËš?aJt<4A>ÑHqæ„À´çI¡gB *UhÑI+, Â4@ >­ª¤*öªÙ£Y·Vàêµ™ƒ³UÉÆ-K×´Lײm ¡.ܨpÿâݹ׭ƒÃÆf9÷o`ÁƒõÖâ«7ñãÆ~/[ü÷§3áÂy+Öœ™tÅ»ž?S­GÓ¥awÔ…w5âЯÝÁÞmõMÕ¶YÐM|£\ÞÈ}«e]9ïðÑÆ“ÇîM{yó®·û*׸R:Zͳÿÿ=žyöâX¿»>íýlxg?/•#ŠÎåì‡?:<3A>?{÷#&`Iæa7Üv÷e_nûýקÐu
¸@ú-ˆƒúçÞ‡Õˆ|Øa*&xbƒ :è¡rÊG¢€µp¸¢<C2B8>,Bøbz0ÆXa‰åÑH=7¢h¤†Ûq†äŽ<2Ùdjd‰B∤ŠÝ­´äl:ªçŒ2<48>D¹¥I_Zùdš= MF¦9æly"Yª¹&i*_<>S¶%ç z*©¤<C2A9>|r¹g¢¿¹e€
˜y册"š©•Žþ9¢<39>ιÄj¨ tœ¦ª*”’}z‰tRÿšL¥zj©šZ•p:ê¨MЊk®«»k˜¯Š+°Â:É<>BGFk,œŠøh²‰d;Ŷ$,¬—µ¢*I„˜6¸aH¦6j­«(hË-·Ì6QDÒ¦ˆÔÞî¹ûz®Zƒ²ëî»4ïŽÑÚ«¯VãšÊðgï$ÒRûj·4
æÄrðzö«ñ„\õú°R/ œ¬o«-.¬P·ÈÔ¼Ë! s§à¿*b;éœØ)s*û*EÁ±0ðÒïºá´Ç7ã¬%Ï=ç×®·"̪5¥dþx-Ñ+#MgÌd—ý4PG=NÉ¢\Ä-÷t?a7× ûfacÿ€wÓf{r¶-63`¸­ö‰™m<1C>‡ü3÷!u×ý<C397>ëÍw«<77>ûý7à<37>£]x
¤o­ac/³ã”¿pˆë°Ã^ùçyç]ò×#rìy˼ î»à¢G!<é<>Lƒé"cœ:êO¼^Àó“@<>×M»íqÜõ¯º+í4èÁo8ñ§ Ïtê²:?ýúì»n}íð{êUÒ@/ß½òßç|øÃ_<æûýt÷8õ<38>á€Dàóª—5¼mu,Sívw?ý NxÃc€ÿNѶ%ï~ñ‚›<32>GÃœ[(Á¿QÐÄ É÷¿Šìƒ«YéöéP<E28098>`pßûÿRˆÂñ…\ƒ!ÿd8¾ ö‚0ÓجxµÎ‡?T ·FDÌuñˆÝ!Çà¥D&f°†t ]ö0YÜ"¿˜ #VPwÌ*ãÇ×DÒ!<21>a d WÅæ<C385>ð<EFBFBD>ˆ,áë¬WG#6ÒŽb¬â õ8Ã>ú‘Ë¡ÍŒ!ÉQ2Š¤ÜÝ)+RQ<E2809A>£ãïbhF^Òs©œ"C8+çáC  ¤€ þáŒlQŽu´Û0ÈàŠRÓ.E é7dèÛÀ,<2C>‰L¶Ò‰œc3c ¬RÒ<52>¼L¤4yi8ã—vKg ˜à …P …ø 9Á!€
òºT$z€ÿŒ]Bx{´ä+iY°Áq³ `(g2ÿ¨KlŒây ¦+À lücGÆE8ŠYŒ¢ˆÃÀÇ6Èð<C388>}2`—È`e5øÏKb²“”åîÚ(MNœó<C593>ÒÜôüÀθ1 <„M1jÔ“ˆÅZ*w!M“ºÀ|ð]@]‰ÈNÆT¦žKè(؉Hl`Ä~8\q"“¨É ç0,<2C> 2 •R“˜Å¨¤‰L0„±©SØE>°UVN O¤ƒUwç.
"LàéMéàUŸºO¬d5äPÑÈŽÚUn%¥X—šÒ@Ú4yíegÏÆDÀ> <E28098>œ,oùÍ`¨Õ{A6¾ÌÊÿþ£ 8€Mq{´&xhðªÅgùùT¦ ª¥å#ù»5nª²cÄÀ 0 ˆ:zÛ('+\1Œš20<32> òV€p¾à˜DjS{KdôÀ ½ À8Ó(¾]¬t¹½ÐÚ`×Û-p:£—ÿÅ'ª›Ý“@ˆŒÌšxãC<C3A3>ŽšÄDå¯[äÕJÀ ÄÍÇψ_SÆRÂ/¨hE-ÚËm@Î"6±(gT«0   '( -Š“è…–Ö CôuªNô03—ÛÜwè!yX¹Qš2~ ¶ñ£'8k„ƒ´:¼ï‘øáÉ •GöXcÛä>™Èaš_Ù¢àÿÈÄca—UWXs ˆüdâ.4Lã©bYË •°”gDÈé¹Ì“5ó)¯U´& òÅ>mèCG<43>t\tvÜÖ¸IˆÒ‘>3”å¶Í¾½ í…W©ÒOCW¸q5 é'iH®úv­®Øê”vC*ttj}˜U{ñ×¼BY¹Ž¤8`;Y¶Y³½³ª™eÙc5ƒ<35>]2iï‡Ú¾6¶Ó,_½ yË.ÐÞæì\µ«lÛV#V<>å³\[×Ò>™âÊ-ðs|#ÉË<C389>¾÷<C2BE> VÜ_ ?¹Ö•²i+q÷Ô—ó]MfˆbW
¢¬#q# ÝïÿŠâÂQɇÜM©ÃM²|k\Íüí¸^nnÚL+GÎ*N*:%ê<>å¼[â¸ÐDþs C(ãùãøÏR+sx«ÈçMgTLî”ã¼iÜYÔ®žõ ?‰o_¿¹ÚÛ"ö¡ïÌjÐÒ“Ösf”§ë$íøöº‰¢Sö¹»èïÿ±”n( êçø*UÎNñ—y<E28094>ï}÷;uì>¤çÝðÓJ|Ý7O÷Î9VÑI²r<C2B2>ÝìŸ×¾ñ)È]W‰jÖ•>pÒËí4<C3AD>ýƒÚ*]|E§×½ìóÕ{WÝ>÷¨þìYÅz«bÈ÷¼òûÄ||;ÿùo'Öð1S*£ñ¥ûÑßþ…qxï}¯œ†jáfâîð|sžm<C5BE>W¿êCó·|þH©ß½lØ2í€>þãÇ}!ü'1÷—È}ãG%W[—í¡ Ø/<2F>A/M<12>˜Lw<4C>¸<>
¸ärpÒçÓ !˜tD°|Ü€<C39C>ˆØúGg2ƒóR48
ÿ , d d ÿ 7ü8Á‚ƒ \¨° 8‡¿ œ8Ž!È%Žk˜°£Ç<C2A3> »‰G²ŒIŠ'Kª\ɲ¥Æ”0[e|™¥Í8cêlÉó¢Å—;-º3gHžiöüµôbQ—P‰9RêS¤B²ÎtºAàÕŸV§<1E>6òjײf¿†mºX·XÅ®]ÚŠiM¡v}šuË·¯_²hëV+sî\™^¹~K
.àÇ7Jž|6-S­†#>¬YÙ2ÈÆ gŽì9®i®—÷úåF„ukÈ<6B>zš-ÇÍ‹‹ºöÕº÷"°cÏ&HûaêÚI‡ã=~uµï*Ðý×MÚtñÒ¹… =]õï„¿jÿ-­\»yÆé¢7/>1uöÌ×ì^¥Ýy…ø<73>]nö<çÝpðÊ·€Ÿ5XàfÆ)¥àóýÖÛIm=Háƒì<C692>&`} rxøc 2˜Šål¸Üˆ'²è!}ù9˜À7ö·aŒ)â(`3ú¨¡<C2A8>2:çc€¹šˆ&yä“Ò¤<>J6©ÛŒ"™e\¸äXL†ˆ”[BÐL^~9d˜T2X¦™žåH%ˆe”dš g•s§<>d~¨çžr:ù¢u|Vˆç¢?ž A*‹Š©&jˆþ h9˜>—i”ƒ>Ê]—j^JU<4A>Nêbj ŒvÚ<76>(xZP¨6†ÿféd…ƪ)£œ~Ú)«­âZ+ª¦i«Äúšj¯ðª§oÃ+e©¿: ,®Èr™l«ËF{«´ðÐÇ[ŸÐf iÔb[mµŠªê­®ëb.·ìž‹,¹æ¢iG«*kí¾üöë.¬ÓÆ;¯&lðÁ½6ØÚ®Ž6Ìp @Dzÿ*¬í<C2AC>åÖ ÃƲ
'ëp3×bŽÉ(—œrÊÖÞyjÀ#,s%žÐüq«€>|òììó@]KÄ-» sÌ3{\s%çÌ*É%ó,õÔ=WmõÐû}§À\£<>o¼4Ó繫9T§<54>ŒÚ';¬¼[û;0ØdÛ<öÍ›Æí@Ä(OÿmÌßl7±öÚXO\4Ürkì5ÝuÛÝøâŸnu~^¹àTKœx×ý*ž ã<>;n³È†s·àÞ?_Žùê™[@téY¿ÝùìúúÝLïý<C3AF>ºŸö­:ëÀîúë°Ón|í¶n7êšÎ<Ú”ÿ¼ðį¯õÉß¾üÞÜ_ÏåäÒ‡?|ñØ{JûÍÙã^I÷ìŸý?˜<>–ƒ!À,áàsÈÔãC=‰ ‡ðÐÿf<C3BF> kxOWü¾öCèã<C3A8>ØPŸöF×><3E>ImÈØþ<> Ëm£<6D>.p8 (4‰a€H
ÀØ!'Ø€m¤09`G À‡Xð!lJÃ]ÿ¯79`áà àþ'€ý-aààæÆ7 NPà~Ã0Õ$¾ñìmƒ+ìW/(@‡ž<> ”`Õ7ħqzÜE
ˆBÀ¡0ˆß7r<37>¶)AKp!NtqYøØ]X©Z4<5A>9LcúîÖÆA™Œ~r´†!&QGú @Š˜<À!þ±?º`êø£fð{\J<>!HfJHh
†ÜE<>Ç&%+ù=zHmŽóS¢'Àº<02>ògœØméJ.kÊj
…]örK#¦û”9
ØQ…S»Ÿ1ÚV½-2 1u´#9È¡<C388>gŒ!: ÿ̱ ófÚT÷F †¿ur Æ$ªˆNv6oÆh F‰&â~8œ]îy†Jœƒ<E2809A><˜òþ9…õ‰³SÌ6îçŒmŒb`àeÿ!EcMeÒ4g*}1À™†Q£4%Ûû‰Ttn éIx
Ò<>3<EFBFBD>„1jE0”<30>8­€1¬Ú²&ðƒŒï4ß¹À HÈ ‰üìg”ºÔe}<7D> ¸Z½A9†…b­çÜ!„q¬.8*RÙZ8Þ!°dpe\ªQq•«¡Ð!n Xµ“±‡ëÄ(ÕÔ m±Ñ$Ÿé¶…±Òú•)¸ß+ˆ~†SœÚ,8±2ÏÿÒU´H*ASšv3­&m­paË,N5à<35>8Ūr—ZÜŽV·»](24ÑQà÷ºm4V=u×þ97·ÐõÈH¾ÆZ¥¹Ñ°ÏÍÙš[×Æ~ `Û!/ã΋^í¶Qns¯ÞB«ÑK¾I£/=Á[ÜoËxz}ˆ†êWÈÍ,»÷U¯„<C2AF>&-põè¿ÎðÓ8gàO8ÂÆšÒÅr¥aÏyøÄZC\Åø;¦ o¦°iU`¹8‰Ãõúpxwœ)˜¬xT,1ç²õ<C2B2>븕°ŠŒ»gMnÖ“Lå(éÉY«aUÙ´ò—-6æ./YË¢2š¾œä)¯iøG—JpäØ «ödˆÎ0Ãs<C383>Ù„ I9rzÞ³Ž(µ!¤šÉpÆ žãóg])ˆÏ²ˆC†'%͘N­l¶C'šRhõ<>æå_õ'Ó<>ÆW®&]+LWªÔqþ ¬ÅdäÜ%Õ”&<15>Q ^'‡Éœ6Ò¦/-Þò¼Czás¸”]";çEÔ³¶“W|í'ÛüdØ6vÒt\ êA¿
ØÆw°“3S{<š™I¯]„¢rûÝÍv6FˆÓmlC{×î&Z „¡c'{Ú¸þH¾áMð­ÛÖw®ò¶]]m~_»0 WøÀ HGúØfö~øƒo° ÆÞHI@ !ùd ÿ , d d ÿ ÿm¸¡ Áƒ*\Hp¡Ã‡#JôG±¢Å3jÜȱ£Ç<C2A3>I²¤É“(Sª\ɲ¥Ë—0cÊœI³¦Í8sêÜɳ§ÏŸ@ƒ
J´¨Ñ£H“*]Ê´©Ó§P£J<C2A3>JµªÕ«X³jÝʵ«×¯`ÊK¶¬Ù³hÓª]˶­Û·pãÊ<C3A3>+•¤~àsáN9¼waØN|'•é8I@#¼{<7B>Inx3Ö?…S€3„ÍÅåL…+.h¼Y1Ekäû‡o1ÆLtþÉnЯÜìx<C3AC>âåÌ$3^v†ð<E280A0>î·Ë?<18>Q€ÄéŸi¬-À;É<>éÐ<C3A9>øAð<>v<ÙÓwRÿÀÖ Û&ê.tW„ôt¹Lð׉}×>á…ù|o|ÝõÓÈ?ùȇ“1á°“y<E2809A>QZ#†<ÆÖË? Ôæ\h±èƒÀ€ìxr»¹ ØçÍ×Za üóXm X<>1µ @G7™yHÑ{®A&£€.àMü¼¸Ýzÿà8b<38>GVmýÌX9ø¦Ñ„º}Ç$3Öa,ð5f„ú0Ð;lX„¿}Óäšœ@ØFÖ´Izæ$Mº b*ªÙOØÈ&ÛqQJ9$E *ªÏ)<29>VD6 ƒ45$ãH•ñôB?»TZQ#“üµjltPeÉQ,  hAÞ4àŸE±·Ó®ªö”É?ü S<³”HT&–é©„a>Œj,L càOå¤<C3A5>²t]î¸äkî¹è¦«îºì¶ëî»ðÆ+ï¼ôÖkï½øæ«ï¾üöëï¿æ
ÿ , 1 ?  ÿ ÿ ܯÑÀþþñãǠѯ„vHa£F ´ƒX±¢?v Ê 4FG@><3E>ñ&1¨È@ c 8äH±L|âÅMcšË4J1iR<„ ø<:<3A>hŠn9=XNæ„þ²úË“BÎS?µnĪ•ëÐ^Gv`,±ø]ý—Ô'Uvaó&춲£È z7=ÜkÌè?µ<>ÚþkD'ž1NÕÆ"µ<E280BA>Æxì2­Œ-§ÇbËatkX-ƒÁ‡·õ­Ë2ÇxWlDa²çÙ n[RnÓ öòJ·&ærý^ <{Rìœ¬Ê¦Ø …HÄ<48>Rüv;:»ß<C2BB>äZ¾ý/SCÏ<43>vY'ÿ¯:h$;ßÞu=sL«@+rßQ€söíc—@G¹à™5L uHùU´@<ÁUÄ<55>A ´<08>vèᇠ†(âˆ$RôX‰(røWE
ÿ , 1 B  ÿ ÿ ¸i Áx â-hçÏ ÃþÊ”+Ób&…>ldl`ƒ] ؉¬8pAÈnwñk0"IƒË]\v-5DËXKc ZŽs¸!žQøvm€ØÍåÃM`ü— RÇ—O¥Êl„ æÕ¬™dö̦ #ªeŠ ,Ù45ªMÓåQ°¹ÖdGÔ%Ã_™ºí6)Ö<>l˜»0fN˜<4E>2ùËÄnì¦( ¶£9·¢cˆü ÔÙ™íb´PINn$<24>2ÛÁ¹<>Û’6Ö¤û*®»;s2žj4ÁaÍ{(™ôéác†lD§Ðr¬§ç¦ŠSç?ÜÎ<C39C>ÎSÅÑhõé~±köžñ¡ÙïìM÷<4D>‡ò%àžã÷ÕÏ~íÙægáÇ߀>¥ÖcˆÝW<> ò7`}át\ƒ&¸ 7b·vxVcÒåሠú÷O@ ;

After

Width:  |  Height:  |  Size: 20 KiB

View File

@ -31,6 +31,7 @@ class ImageValidatorTest extends AbstractConstraintValidatorTest
protected $imageLandscape;
protected $imagePortrait;
protected $image4By3;
protected $imageCorrupted;
protected function createValidator()
{
@ -45,6 +46,7 @@ class ImageValidatorTest extends AbstractConstraintValidatorTest
$this->imageLandscape = __DIR__.'/Fixtures/test_landscape.gif';
$this->imagePortrait = __DIR__.'/Fixtures/test_portrait.gif';
$this->image4By3 = __DIR__.'/Fixtures/test_4by3.gif';
$this->imageCorrupted = __DIR__.'/Fixtures/test_corrupted.gif';
}
public function testNullIsValid()
@ -323,4 +325,26 @@ class ImageValidatorTest extends AbstractConstraintValidatorTest
->setCode(Image::PORTRAIT_NOT_ALLOWED_ERROR)
->assertRaised();
}
public function testCorrupted()
{
if (!function_exists('imagecreatefromstring')) {
$this->markTestSkipped('This test require GD extension');
}
$constraint = new Image(array(
'detectCorrupted' => true,
'corruptedMessage' => 'myMessage',
));
$this->validator->validate($this->image, $constraint);
$this->assertNoViolation();
$this->validator->validate($this->imageCorrupted, $constraint);
$this->buildViolation('myMessage')
->setCode(Image::CORRUPTED_IMAGE_ERROR)
->assertRaised();
}
}