mirror of
https://github.com/haraldk/TwelveMonkeys.git
synced 2026-05-27 00:00:02 -04:00
TMI-101, 102 & 103: Now better handles broken data (throws IIOException) and better detects bogus Adobe markers.
This commit is contained in:
+124
-1
@@ -94,6 +94,16 @@ public class JPEGImageReaderTest extends ImageReaderAbstractTestCase<JPEGImageRe
|
||||
// More test data in specific tests below
|
||||
}
|
||||
|
||||
protected List<TestData> getBrokenTestData() {
|
||||
return Arrays.asList(
|
||||
new TestData(getClassLoaderResource("/jpeg/broken-bogus-segment-length.jpg"), new Dimension(467, 612)),
|
||||
new TestData(getClassLoaderResource("/jpeg/broken-adobe-marker-bad-length.jpg"), new Dimension(1800, 1200)),
|
||||
new TestData(getClassLoaderResource("/jpeg/broken-invalid-adobe-ycc-gray.jpg"), new Dimension(11, 440))
|
||||
);
|
||||
|
||||
// More test data in specific tests below
|
||||
}
|
||||
|
||||
@Override
|
||||
protected ImageReaderSpi createProvider() {
|
||||
return SPI;
|
||||
@@ -396,7 +406,120 @@ public class JPEGImageReaderTest extends ImageReaderAbstractTestCase<JPEGImageRe
|
||||
assertEquals(384, image.getHeight());
|
||||
|
||||
reader.dispose();
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testBrokenRead() throws IOException {
|
||||
JPEGImageReader reader = createReader();
|
||||
|
||||
try {
|
||||
for (TestData broken : getBrokenTestData()) {
|
||||
reader.setInput(ImageIO.createImageInputStream(broken.getInput()));
|
||||
|
||||
try {
|
||||
reader.read(0);
|
||||
}
|
||||
catch (IIOException expected) {
|
||||
assertNotNull(expected.getMessage());
|
||||
}
|
||||
}
|
||||
}
|
||||
finally {
|
||||
reader.dispose();
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testBrokenGetDimensions() throws IOException {
|
||||
JPEGImageReader reader = createReader();
|
||||
|
||||
try {
|
||||
for (TestData broken : getBrokenTestData()) {
|
||||
reader.setInput(ImageIO.createImageInputStream(broken.getInput()));
|
||||
|
||||
Dimension exptectedSize = broken.getDimension(0);
|
||||
|
||||
try {
|
||||
assertEquals(exptectedSize.width, reader.getWidth(0));
|
||||
assertEquals(exptectedSize.height, reader.getHeight(0));
|
||||
}
|
||||
catch (IIOException expected) {
|
||||
assertNotNull(expected.getMessage());
|
||||
}
|
||||
}
|
||||
}
|
||||
finally {
|
||||
reader.dispose();
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testBrokenGetImageMetadata() throws IOException {
|
||||
JPEGImageReader reader = createReader();
|
||||
|
||||
try {
|
||||
for (TestData broken : getBrokenTestData()) {
|
||||
reader.setInput(ImageIO.createImageInputStream(broken.getInput()));
|
||||
|
||||
try {
|
||||
reader.getImageMetadata(0);
|
||||
}
|
||||
catch (IIOException expected) {
|
||||
assertNotNull(expected.getMessage());
|
||||
}
|
||||
}
|
||||
}
|
||||
finally {
|
||||
reader.dispose();
|
||||
}
|
||||
}
|
||||
|
||||
@Test(expected = IndexOutOfBoundsException.class)
|
||||
public void testGetImageMetadataOutOfBounds() throws IOException {
|
||||
JPEGImageReader reader = createReader();
|
||||
|
||||
try {
|
||||
// Any sample should do here
|
||||
reader.setInput(ImageIO.createImageInputStream(getClassLoaderResource("/jpeg/gray-sample.jpg")));
|
||||
reader.getImageMetadata(-1);
|
||||
}
|
||||
finally {
|
||||
reader.dispose();
|
||||
}
|
||||
}
|
||||
|
||||
@Test(expected = IIOException.class)
|
||||
public void testBrokenBogusSegmentLengthReadWithDestination() throws IOException {
|
||||
JPEGImageReader reader = createReader();
|
||||
|
||||
try {
|
||||
reader.setInput(ImageIO.createImageInputStream(getClassLoaderResource("/jpeg/broken-bogus-segment-length.jpg")));
|
||||
|
||||
assertEquals(467, reader.getWidth(0));
|
||||
assertEquals(612, reader.getHeight(0));
|
||||
|
||||
ImageTypeSpecifier type = reader.getImageTypes(0).next();
|
||||
BufferedImage image = type.createBufferedImage(reader.getWidth(0), reader.getHeight(0));
|
||||
|
||||
ImageReadParam param = reader.getDefaultReadParam();
|
||||
param.setDestination(image);
|
||||
|
||||
try {
|
||||
reader.read(0, param);
|
||||
}
|
||||
catch (IOException e) {
|
||||
// Even if we get an exception here, the image should contain 10-15% of the image
|
||||
assertEquals(0xffffffff, image.getRGB(0, 0)); // white area
|
||||
assertEquals(0xff0000ff, image.getRGB(67, 22)); // blue area
|
||||
assertEquals(0xffff00ff, image.getRGB(83, 22)); // purple area
|
||||
|
||||
throw e;
|
||||
}
|
||||
}
|
||||
finally {
|
||||
reader.dispose();
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testHasThumbnailNoIFD1() throws IOException {
|
||||
|
||||
@@ -0,0 +1,88 @@
|
||||
ÿØÿî Adobe d€ ÿÛ „
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
#"""#''''''''''
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
!! !!''''''''''ÿÀ &å" ÿÄ¢
|
||||
|
||||
s !1AQa"q�2‘¡±B#ÁRÑá3bð$r‚ñ%C4S’¢²csÂ5D'“£³6TdtÃÒâ&ƒ
|
||||
„”EF¤´VÓU(òãóÄÔäôeu…•¥µÅÕåõfv†–¦¶ÆÖæö7GWgw‡—§·Ç×ç÷8HXhxˆ˜¨¸ÈØèø)9IYiy‰™©¹ÉÙéù*:JZjzŠšªºÊÚêú m !1AQa"q�‘2¡±ðÁÑá#BRbrñ3$4C‚’S%¢c²ÂsÒ5âDƒT“
|
||||
&6E'dtU7ò£³Ã()Óã󄔤´ÄÔäôeu…•¥µÅÕåõFVfv†–¦¶ÆÖæöGWgw‡—§·Ç×ç÷8HXhxˆ˜¨¸ÈØèø9IYiy‰™©¹ÉÙéù*:JZjzŠšªºÊÚêúÿÚ ? âµZoŒ,ÄËeuß"ãp0DS=p¸‹¡ÅS5¸-Ôâ©!#ã;ïƒ âM1B¡Ï¶,ˆ Ëà m˜’£aŠU8ñÅ ”)Àà–Û Jb©ô"§lNiÂôÀ�ÉEÛ‰ Å^å™SYò}͈þòŠƒÀŠg!ÔUo$‰¶*Äd¯È~jƒF½hn~(.ìpëÎþL†êÓ:AC çUþ9Ÿ8Œ°ÛøªQþ·ñE¤îØûžwo~ð�Aé�OÈìßT½¼”‘$V=93n>ìâs™#s؃Lèzåàò¿–´Mûë±õû§Ëlƒè‘Œ±Ï`ú2—0C×õ*ÇÌ6Æh(d"¥?¦F´+Y|»ª½�À?R»¬n@NÙò·�ÞEi?êP\éÞc· �·lùË$%ŒŸT^ä%¿"ñÌ
|
||||
MX—ˆ¤nISÚ‡"ÐÎCvïÌmê¹"·º”øÓ쟻8*ËÂCpi”fá”s;ëÖÊ=bôï&êe%U'¸Î�¯Bš†ƒê0©N‡ØŒâX¸ãv‚½ÅsºZ®hr»±Z�ò̬‡ly<ÃXþ(¾pó^…˨ñÂdm·9=ó‹q6¤bIf nIÃÝòòÎ(ÄÚ¼¥M*`ˆoöGÔs[C-Ž¢Üyk#ŒpDqÈs€÷’ò‘es1øâ£A¿oØ9Ý-4ï-ißZl²‘ûrÄì>æ^?†:ç̶P7{AÄuøB}¦bú¹Õ8y{RQ,¸±÷ Cú'•59ER&o’“‹§’õ‡Ùmä'Ùÿ î¶ÞdÒZÝdyDlFñž£èâ�´õ~ž-OÕ‘âó_ÏH€N¯¿ ?KÂfò^³«ÛÈ£Ý
|
||||
žRÔä4X˜Ÿ`Nz=G¸<Vu¯ù_üJ˜1ÚMã=z¸ÆË8êsKû½L%îˆ?¥óœžMÕcZ´.>jGðÂË�ú
|
||||
òŒšg§¤·¯C\�k66«W¹��mƒqïJ6™HˬÕa�¥�ÎÇÚùá']¸»(E ûJFuÙôÝ2¿©'±R?Ž—H±}š!óÊF<ÇÉ¢>ÐÆêX�À¼ÑWlŽ™1¹òÕ«‚bøNË Ý[=@ä¾8Æ`òsôý¥Í·î–ÈX�ôÁ¶ö�ÍNh�H´8e»›°`ØP:p#n˜
|
||||
{1H½&UÂëèZ•¥ tßlMÐ`‰Ã°$ņء¥ QAÀ…›\ƒ\R›Dâ¸-Z‹„ÑOA‹çlUÒŽùGâÀ«*±ÅÕûbŸlgÃE,ô!à(µ!ã›ûb�ʇ³;⨲¥p;€7Æúã�04’žÇDß4’Ž;`5”“¾g”ôÅ*r=[;ã]¾,µ5Å\+\YV¸™W bª¼E3ezƒŽlU,å�SˆãÔÓD¥1E ÏÃ/™ÅQÜÆØ¼rñßCœ¯µ1Tî;¥¦ç©A†¸-f¢ÓMRAËlŒ„o„KpF Šèž¸ªlÒé€ï. ]± .ˆÀ²Ì[SH¯PhAÎãùsxú§–/ìårì«ÈkÓo㜠žG;/äÙ?W¿ýôÙ“¦&²€ |AkŸ0~3×aú¾©4gj9ýy'üÌV6¾]¸ ˜šÁH>ÍGjá�[޵qþ±É”¯ ó~�qä½EÀ¼ˆ´‰\ïϼU?Í–JŽL¸ùqn>H¢{˜ÒA *Ù׿.õ§3F$zšŽùÆ5++Í*ö[ØÌSÂÅYXS¦I<«Ki2pAtÓ$KCîµÉQ|€æ_Kù‚Ô]iwüEVxD€ÿ ”½^y¦ÿ D»µ¹wàyNzËä—–<n£g�Çiãá\ªiI/w<è»új*Hù.ù1,y=]Õ»V\Ñㄇ/ƒÉ<§åÍbæd’Y”ŠC²�›³·hñM¦@¿X�3ºŽŸyÈ›yÆÞÞ�ÚY•�>RBP âù½ÞàŽ°Pr
|
||||
³W¾bKU#*`êGiá‰2–c9ÈDˆ�r}tÚÔ91�n�@[}üjáœkŠª�œ÷YŽÖ玧bõW4š>áüi†Ú_šmÖÙ!»ä®€/?´
|
||||
;åFfRõ=/¹¯¾4ã”B ïŽRe–´ lº¶±¼¹·I=Èûò?wæÛdÚ/îßÄ ól
|
||||
ýôEkЩ
|
||||
ý0Xï6s×i¤x%!!æ.?sWžMŠgf¶¹1¡èŒ
|
||||
G· pµü…v(o¾–K-/à¾�Ô�ªÄˆÁøô8(Ói¤8 6—óNÌóI¿ÒÀk‘Tí*î1k?8\D1´rqÛâS_ÀŒ3ó&¢4 ïÉÈ5éÛ#údZm¥Á–âÜJðú2<�W¿“‘†óŽ,’�!ÅÒúÝt–ßÎD�õˆ+âÈ�þ¸8ëú=Ü|e`ê’)þ„c ²Ò®¡Y"·‰‘†Ä «"^eÒZÎp¶ŽÈ®9 ðÞ…k†ä9¹sÉ«Å)d†XKk"ùòåHýLiRV®¢¿Èv¯ÈÓ ™xô5?HÐo.¢Y.[‚PÝÏËn4-ã.$&ƒ¾èï$Û�=>iñfŽ1óôúG¼Çq¤(qIB«Ãno$�û=ʸH‘CF8š�4KA?Tx¯\zZBã÷, ³ÐýØ;õmÎÇðÅÄ‘HAVâã}�LNQæìtÚíV›måÐîˆÐÃ\À8>+�ÿ ºœÐþÌž?<eÅ»õê<rè̤Òkñj"(ԺıۋE© ß
|
||||
ní)Ó%O Uy9'1�4FãH)‡W;a\°š×B©#›œ¾íŠGN*7Z`Øãf ¦-k”Ã(mÖ•CÅnÊS=8ÐŒxÓuªU:Ò§¶Îôc‡w´ ŒŽÜÈâ«›×7©^¸ƒŒ©ÅQ!…s;`R™FJ⪛W7*b<órÅU‹æ
|
||||
ˆ“˜6øª"¦™±>B™±T>^YCo,ªeUP66»ã+—\Uà”zázµ1t�ŒU6Åàxؾ.\P½ªN6A¶)É:ânàŒU
|
||||
½I Î÷ä
|
||||
=<»åK�Zàq’t*•ðês‚¬¾ŒÉ ߉™èMâ/7yêñšMlœJ®Ûv;f^˜ yÊ"^QþÖ¹óã^÷…y›Q†<ácÓ
|
||||
»žÎâ;›g1ÍŒ»F
|
||||
ÖìeÓµ 䯕Å4]çU¹H£B܈ ¹')Ï)²‘؃ý‹,�Ç�ŠG`ŒÐÚþhhF̺rZ‚ŸX�z·»:òŸ�-tØ’óU@Î!‡úÿ Ó¼«åm•€k¶v½U|~xs¬Ú]]X¼6;JÔiU®ùV\¼|&¨�½:Ìù'’f¨‚F;ú»¬w¢á½·XÓ�E‹e@´ ð˜5eG×9ãyg\U? ߈qŠYkz–›p¶·àð_…ƒˆ÷ʸ·÷ïpáÚ3�Q†X� %ÒþÆ]}¢i·Õi¡^gö×fûÆDï|¡t²ÒÎ@ñÕÏ>{o’–Õ¬¡Œ<󪎴¨Àñë¶7s‹{w.ç
|
||||
¦æê1hò‘Æc“µ$oïHÉÓˆ [Áë/‡ï¯ðÈF±eªéLÌ…¹'÷ˆGãòÎÇ4ñÚÂÓLx¢Š’r-5áóæÎeXÆæwܪøíãჄ>ŸŠ¸åþLŽ.?w½ç#WÖœ%¼,î>ÐQ†ƒË^a‚aq$/Åv
|
||||
¿ÈgO°Òìô¸6‘„Y©»€µ‹�BÝ)ene$nà�‡ý‰Ã_̘1™Ã·ÓñUôHt•¾²>´¨ÑBGÆoî;Qó¿Ââ4é˾FõÍgZ�©=»ÔšŽdÓ
|
||||
m‚<· Þët¾ÔX¥¸?
|
||||
�‹|½°Ý ä*Ë…Y¸81ÈÆò°fOÃ�GéÚuÖ¬åÐñŽ¿ÏZ}8>ïË3Á©o/®Ë»''ýŽçÚîÃKT´Z!ðƾM¨ë·%�·>š
|
||||
ýðv�!̧&-&pä&yÞ“¸?wÍ-²Õ®t²h~
|
||||
üHÝ+ƒ.|ánÀb‡’ý’ç‘,q4à›ˆÀ‘¾Ó§ÃËýa¸Â–Ñ,‹kO
|
||||
°Æ2«Ð¸øõ Àå˜�p÷òLÎ/s2Á´f4ýØ }ç
|
||||
RâHLR¿*õ'0–"ÎÞOZ*‡;ÿ -Ö5›�2P«eaU&¸ñN2ŽÜ�~†U=FA�O9’FüR«ïOd]± †EâèÂ;T½Ô�hâƒbæ´Á"ßPIƒz¼’»îVU-äNÑò
|
||||
g±HÂs”z^ÿ bÛ�5€ñ>¦]Mwhô ŠdÇ_YÅrŸÜwÆ3è[´Ú®”qÄ÷óJtíQ§$Zö®E$±(*yFz£tþÌ*µŽÖÕèFþ'
|
||||
VDqU;a‘£`#>Aœxb`9Úù I£õ`ÿ d½ÁÂþH
|
||||
FøuÌÄüÐÐ÷ð#ß½‚;´,ƒ‹�Êÿ L²/bîû?µ„„qçØòïc⸢¸*â3;SaEË]ÝÚ
|
||||
H”
|
||||
Ó�‚¶/#Óá8�ZŒU7´�5…׎G-æEpÖ+¥¾)VšvWÛ¦ZÎ
|
||||
ï…×
|
||||
NÇB”®*¾òNDÓ ec\$¢½pÌ ¨ÅP®)ˆ1Å]±¾*Ñ9Yy±V³W6lUºæÊx«uÚ™³fÅW‘\°�òÀÌN*°ãN8åb«lqTÅ\1êq˜àqTLrÓ7˜“Š£R{æi
|
||||
02¿l¶lU¶rs·þI$‚ÊþvbPG@½·9ÃUYØ"Š“¶z3òëO/”}Gøf¼4½ þÜ¿ ŽI…ó-9§ÕžV~‚ê¾V¼ó7™nÖ4cɺ($ä£J²Ñ|¥(…¹KxÇ ]’£¢�‘Gykap–0¥%›â4oÝ�‰¦ËolèZhQÙÅ*Ê 9�šg$Ìù_+î:l‡&k1Ê8¡.D\cå]þiU¿˜MýÊÛY[³ŽîO£ÄõÉ«*¨
|
||||
~#×#¯y¥ù~�(õ[~ö˜ûœa¨ÜKgõËÅVUðNÄ× º|¤¹òW˜ëLgŽWä¯'ÏFO…½÷Â/0Yý~Ù-íT<ÈâŒiP:Ÿ
|
||||
ºÕÞ³}õKI=p y«?”8·±[86`! �ïSVñoÄΘÎ0ÀÜLïrGH�Ò‘ÙùN£ê—nñ§Â¿S†¢çBÑ�…hãaÕSw?>�o7§šly¼rI,Gv™9qùPl3›¾¥©K0I¤rkÒ§ ˜é°í/1˜Ý™ž)ü¿k×õ¯0þ�S°+ ûE¾ÑÁ¾W»±HM¿Ù¹$–¯íxSä0ƒBòÕÍÕ’L÷A ý‚9øQ‰ÞYÞi3ÖBj»£�oÚ#껫¹×œ™ñæ©��¨÷wy=IT¹û#r}°�üÏ¥‡1ó$ŽÁzü°ºËÌÉqŠíCFGqÔý
|
||||
îÓB»`ËÊ:õ¥ãøäÀ'é¢äæ×Ø£ç m+÷™×ú5äEf)2ªË_ÀŒjê6±F#µâ¨‚Šª:–FšÆÚŠÞ踔ãjF[V.@Šp²vŽQ.Xî¹ÇŸÎËw×{£)55댔‚´®i"U£òͽoc\
|
||||
#…ÜÐ
|
||||
ÉÊç30G×ÈwN¹Jɳv}å+¿ÔÛM” #/}’0e•Ñ»ˆKLj=0ÖÓd¤Qš†ïþg
|
||||
R4‰B
|
||||
ª( è2‚rß«“›ÃŽ8Ç‚²ÿ ¾�>+û`;ë/ãÎ6SÈÔ`ºœ¬ïa¢”$%Dr!Nc·�b‰B¢ì Å3WÌ=\ŠîM�ÉB^ÞIfUøòˆì}Ž>;ˆ/b"6ë۸ř#™
|
||||
°�ÔaLº{Ù?¯lIJî;Œ˜£·"ߌc”xO¢c‘è}ê÷6Kéе[±Âد$µ“Ó~ž8p¤Ïbj{á6©°Ø®ã'âäéÏ8²ogäS%¸õAË0 Ž£"ÐjÍÀÛá…®ª$`ìš�³Ã²3R¶.È6=pžO„Päš)ÒUàÛ©Œ Õàú¼„�ðž™d%{;^ËÖqÄiòýq_ñ±èN—áéŽ,k\Bg©ß&íœ$>8¨¹jR¸ÉLa›£dž½ñ=;àF�œacŠ¢šrO\M¤Ä9f®*¹š¸ÊæÊÅ]—•›vlÙ±VÆ8hÅR˜«\sb”ÍŠ¹‡†Q]±Í”tÅT÷Ë\q׸ªÑséŠôßf®*¢Â™YlwÊÅW˜ŒªÓ1jâc…XÐu8ÚáÆ�¦µíÊ’>pBÚóeŽ,rÉ3´E§~TÐYVêðIMiÜûì6³Jof´ê Aöa„tQî|rIk|!Féwíe+ÎÀÈJñ Ÿ‘ÈÃ'¢¹Ù÷‘ŸhÏ. Ï!1‰ mÒ(íjé-õdx�Z%PÞÄi÷`[Ÿ2^ÊJ,�ØSíá‘ýNîòk‚‘ÞÎK4ž;â–vâØ‘½Y;±þYÈH �C[ÓFL“yÌYDóó,‡JÒe½‘o/÷UåFÝžŸÃ$:²É.™<p hµãì:Ó!ߤîÂúk+*vPiƒm5Éb�¢œ”©ß}þuÂ/i|ú¶`Ôá†9b1”|H‘)ó6BÆò[�4[°Ú†¿Ã&vZå½Ü`òâß´§·Ó�*Ôš˜àÄt9Î…^MZ}^\#¼O8— O¨[ eyañ
|
||||
Œ�ëºf‡ysíšzs†
|
||||
PšoÓÍ8�KÈÛbV×à3�DñÂg¶Ãâ[²ësd‰�ˆ€X翚¤jkc¬„ñ&ª1MGZ¶½€Å$F£ì½FÇÇ#W7ÐÛ¡f5§a‘-G]žæB‘±ô ïŒxˆØVÌ´˜µYááD�Œv:^©©Ï¦_Ÿª¸hœ
|
||||
7ã[ù¶2 ž"§¹Sýqm3G³–Ú9î“Ô–AÈ«€=69´M)Å
|
||||
²�‘#øà2�"
|
||||
Ž™3h ²âœåIœvºø‹Ìzs�ïŠû08ºëV,*.Sé48O,iïR…ãö£ñ]?”¤ÜÁp€`GêÂ&:NCâÕ]›3ýìñÿ X_Ü›\y�NˆÞú‡ÁF]Hë2‹{`V>¦½~œ�M êqÌ#x˜ò!U†êkî2c£i?¢à!˜4�OP�·È2¡½ñ›‘¨Á¢ÓbÅ“ÄÉ/§{ý“+khí£
|
||||
¿Iñ8ö;æ©Æ’ ©Êå0@ {Ý9²I&Éo6j~eŠÕÌ6ª%�lXý‘ò¦Ò®î/-„÷‘øiµF—"zLÐÄ3N<1—+æ~i57³»0Î*•ëìza²:J�ÐòVèp&¥§¥ü$ÆUûü¶F´íNçOº6³Ê‹)ì}²T$6æá§Ž£–²c¨÷ŽðÉdv²~G{v;ÿ ’pZºH¡�†SÜb$WnŽ:d<ê×zMÓĨ
|
||||
8ž”ÄG‹ÞƒI=H�†Ù!Ðÿ ýlà*¨ }kÈAë„Ñy\|iCíŽmx¿ÙS„B@¦:V9Ù‰‰R›�Ež‰º±ë‡Vj ¹ø°7éE'“ ´×Pž
|
||||
’<U³›Ÿ&¶xÄGð�ém~®E
|
||||
iÓß"^@@ûiú°KÞ¤¢ âuˆQÆÍßà $n\<RÉ G!±8›õ°éÁ�Š�©€%}òIØ‚¿Y‡ìž£Ã"òÔeàØz½.¢9ñ Ž|ˆî*LÄœms•\.C‰ÊÍ›vlÙ±WfÍ—LU¬ÙtÍLUÔÍLx.˜ªÊc†Ç1 b®å›\تö>˜&¹‰ËN¸ª²-zã¸S2WR*q27Á-@1oЍ2q¼i‚)�+Ѝ•‹'Àâ« iåX׹Γ¢éñØÚ«RŒG\ŠyvÈ4ž»�…r\÷aUcNBNÁç{g<²LiñŸL~¯z=%M6¡=ñej<p‰o¹Üè ©Á×Wž•³H›ÉO„e`�C¥žžBQ�}H†’êìÁOrO†êcŽ c¶äñí‘É稜FiØŠž˜¶–lþµë\|j›ªíÚ¹!Œ
|
||||
ÎîÓfCN\ד„Xˆä|“½2
|
||||
FíÅíôŒ‘Õ:ôv6÷X·´øGÄÝ_kËû½‡`:d}ÅÕÅ´ŠÜIëCJxá³rù#�ê'âgÇ�¡¨w2³¨1µW?Éñ|�é…Òj³'IË ]ݱøì6¦2¹8DCvh“¹ºG]j—RÉ+ôÄ–öiˆ/Ä}ÎøLÿ f½Ž6f
|
||||
+ò¸¤!@ß.«çÔg–ªÌhsXG÷($û òsì0âöŒT;ä«g.x£RÇ
|
||||
ŠÙžC}(:Sô•¸L�¹
|
||||
[©QIµ–[‹ Kõ'å•ðé’âDäeB"ÙÛ^(éÓ·ñFÛß…ÃS�k�ŠÖæéÀŒ…^ìÆŸÛƒ€uq’ 3Â;ÓÓ{l:È.’«Qƒ)ðß
|
||||
¿@ÀÈD’·3ûKAýpžêÏVÒ˜É3Ä?m7Ûü¡Û" þE†=6§ƒj—N1@û‹+’T‰KÈh£©ÈΫ®´õµ´û'béÂ[Ífötôå|4òͬDµíÍ(¿ÝòññÉ‹;¹Ðìøéq�F¢¦côÄr'¢#Kòà%n¯¾bù«nf1-QP(×Ôm�¸ θ¬l¬6£ã€“v\Ù³d˜ÉœÝ@&9uæ9cå{v¯†!¢Fo¯Zæˆ.ÿ N_i}Õ[‡¢ýÊý“�ì–=Z4q¿Ú9 El7sã›åå<rLQ÷uÝ3�Ò¡vðÕ4Ùï¦åU†Í‡"ò&;¾ü]5(TR‚¾;b,r
|
||||
'›O.<p¹y¤Z–e¨{–⣶–Ÿ… ñ uÿ ´ ]sª"׉©ÇÔy³™Õêes‘QØ#®íìÝHT ûdfêµ—’¯c‹µõÄÆ‰_£*\H‡šš{Œ�ÙÎÓcžS�ƒÌj–÷Ì(á¤S™c¿lŒ«ðja��ÝÓêt¢¸¢<Óˆäû«þ"ú½“ZLŸ ܘÛfPHï€<Áh&´,¢ßGlc*.6‹UájDyFf¤:_BÁÎV8Š2²×£k6l¼U¬Ù³b®Ç��ª)8«@e¦,��+Ьt¦<
|
||||
ªbVƒÍ\Q†$ÛbW6VlUT!®*™{Ä⫆Ù|é‰3Ó¦$X×E
|
||||
˜
|
||||
ð:¾øº8lUqL±®,€bª…ŽØªŠÁ·LÆÚ½°XZz Hø �“{ŵœj6-¹Åä•AÛsD‰òÿ Jìñ�XtÊ^`ÇŽvyÊE¨ŸŒÏ/ŽÃ凷JJÀÈ› ùdb[ž"ƒ½Óžø˜Ût´RÌ9˜ù†]¨iºV …‹,rSgOâ2%=©±™ã²Ã¾'õ©Wì±ûð3ÎÎõcZáŒHÚíËÒi3b)œ?šz{‘py
|
||||
œÚŒŽž�cĘVkÛ-d©ÉžŸ¨�6ä«,µ8Ô5ë‰È
|
||||
2Ðü8¶�‡Þ3L@’qkrø·C±® ¾²ú 5¨}8´Œ‘„Æ3Î[„µ�Å` .øÞ'§·†-çÕ/0ƒ*Ö^Ì:œÇ.+\kf'à#½8Šâ†¬i†vú€P(vÈÉ‘²ÖY|.Mf7¦kÿ 3@pÂ)Õº÷È<²B¿Ç&°àõürërödÉ<fKy¢i×õb�$?¶›}ã"z�½Õ„æÐÀ}‚+B0Ê
|
||||
{‡Ú4ÅŸY¶½dF‹›!ª1ê1ažœjôò©ÄåÆ#ü>b×èº8Š1uz;
|
||||
¤mÐ{œ1¸£-#j7ìÐÐaί!%A¦¾¥-~Ö<$›AÒê3ä9fw<‡@;‘·-|Qˆäãâ?ˆÂ)于B²rVî
|
||||
Aû
|
||||
NEjÖƒÛÝž¤²qYPu?µ’¹‡+s§ŸL1áë(�ïÜÅc–sП£Þ‘P¯÷5ÂÛTE@G€Àë©\áø9|s˜â†(�æ¢æâ1ñòQ5Ä¡+@Näá£Ü ¢*ûÔnÀ¾Œ¤øck�%Â~‘�µ2M”@F ·w=q/QÑ�Þ¸Y$ìýN&à§:[õH“#½”ç÷¦ž8èØ‚1Ó çÈåŽ.ŽÒÇ ÚöLu„€NØv$[»w^¼”þApHv8wb� ¡« ]>®8Ǫ Æ@°{¨Ìs:‘Ðâ8yæ?Bè¸nÓ-ýÓåqC êÜÔË9†×S52éŽT'iWD•Æ,d`ˆÁb²Pb.¤`–$
|
||||
ð4�\UI‰Æ×1leqUäâg/(âS6_lت ŒÕãÓ|Ucœes¡Š®Œâ@cÔŠ£âaMðTtꬄm‹,个:W
|
||||
6;â)1ä)ã�ZRNhž²(÷ÅŒ¹s'�ü·ùÙ'ŽKvŒŸˆn1Ó
|
||||
Eú˜PìCœ©ÐbÆ'åÂoíR”îqX¤†¸‘ÉkŒl´œ
|
||||
/!¸&ª»õ>øœŒÒ
|
||||
Sn‰£Ëf¢¹ZQñít‹öp:YÜHi>¸¿è}C�/Aéò8vY ú¤‘.K…sÄâ¾Ã IП�J‘�Šà‚}ø×rL`45Åg`5Ì�duË0?P*2-Âý[Þ§ËlL}ºxâ†7F"àƒ\-‘®�U�1ˆÜ~˜>ÎT”pq¾k›4;¡ú0_BÕã�3� ¯52ðñ¨ÜøcGò“ÆÃÅC‚šÞ£le(Dðñú¡d”¹ð€Æ OL{ÄTãƒ²Ž S` À˜ŠW4POцV–Ëm4’`|(7ûÎ õß1’Fíá‰kÉ“6":_#Õ‰ÀîÄš³Ë)6`Ol[cßH¡°(fÚ»Ó+ë2
|
||||
|
After Width: | Height: | Size: 20 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 228 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 687 B |
Reference in New Issue
Block a user