minitest-reporters-1.0.19/0000755000076400007640000000000012556740435014530 5ustar pravipraviminitest-reporters-1.0.19/LICENSE0000644000076400007640000000204112556740435015532 0ustar pravipraviCopyright (c) 2011 Alexander Kern Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.minitest-reporters-1.0.19/assets/0000755000076400007640000000000012556740435016032 5ustar pravipraviminitest-reporters-1.0.19/assets/progress-reporter.png0000644000076400007640000012515612556740435022256 0ustar pravipraviPNG  IHDR^íMiCCPICC ProfileX YgTsQrs .IQAE( fQ0!$(*b$`xsϽ33TW ΩSW)@Oxt#:8(_+Wƭq85<]OO `N0%_: 4_dVzGLj?>c߃ǏW0f巧[SilF_Qtp: C8N/ǩAO pz7u(Uֱ?qZ_>32f+8"Vi ~P?5e>v{5`ׁ0քcUZtq-Ї?:J5JJKJUc8QdT-80(F UX]Wu渶V#]Ȩah@o,pZG& Gm.9~í0'1 }R@` 3[`ԃ@8dn2RPyp \ nù|`,"BD(ƒ!h!qD<o$@b$d ǑSH5rA"=352|EP %**Zj:@tB =^C~t`c81LŒ0; hX2`eX-vlqN'9ۆKUpOpqӸx /_t|>;o EЄϦ!pPB#4z"C#Tb 1xxD%% 1H*$S')J* %5zIE:f: tvt~t tYtt7-ҳK;Ӈ/K(6C0C C! ɬdYًK>L>Cn&?#P(}'%rRMi S~01*0Z01b,bIɀi S"Se.)f:fIf#f*s2s A6e;p,gYLY%YMXXXY[YG0616#6_=llw޲إ-C3ϳwOsrqrl(1‰qJrZpqfq^\2:U5ǭϝ]Ͻ#cʓs%/Wׁ7])>v>>_ K|C(,#rA3(cS!yBlB򄚄 s  OĊYuM})F/% '"6-.$n#$^#>$A'%$qTĜ>RRRR5R/)zۤˤd2Z22%2ݲlll*!,W"׳N{]ĺudy8 >)+z*f+WT\UR9UWY_">U.z/jrjj'ԞۨSoQ_ԠijLjkzkkjkkz6ޥݠ=^c}K?ՙ CņQ]Q])ݑ78'G+{/_?n cbp!zFƘqq qaSQ@i3ufxs+lA  _jiKM˝mVd+'Voei7mPK\퀝]K{)mE;9mu:4lE%֥ŕ˵u-m]}#^`zOg&Mz{{ lڼ}-[¶ʴ7ՎZF)5=O/o_?<@7 '`"P707p2H/ h*(xҐP3+anaupm#{ңFߖmfEF7GǰÏXؽ6we{ل ㉦wvhIIڝzSHOr.]iަTqRjN=n{n 5[ΘNKܧt?nўYt`!CV:qp$@^vUKNbhM<Ἄ[?{tк#ǖ/2,+/>Po|VTg]p!.Y]juĕlW3!M_>RQsFMWo): PtvV#}cZJSbLsTԝ;-[[9u޵>hxv4]PXNk]]7{64yb^Eߣ~^#ON< {e(nhy / ^ɼu7G}G?E-M{GyW0.4^=20i:~>,NdXIӕ;ݧ~}YzϷ3վ φ.eQ55ma|1~T,|+++QTu[G4 gx )\k:"  ۃs$n:!z][r( )yVrQNY&^&>7 oBD;J|$ dTe䎮kSVrPNQQWG557keh_[zEWk/H&G͇-+qk3,+O~8q:عrxzӴŭ#k5?!D8  k ?'2(~M89f 1*>w{rBX$ݝS v[Oٻ7=o_3:2:4~c#3ٳ933y 뎙-U\XR{ɾSCe#+3UՆgj坿TS"%NWV}f7ojzN~KFkR[]{?y~Qkǝ u]=F'OUObeC#:#^qF\[iq|lbSS3>~f|u~ݗ\_}1C hl!L]ħ܉$y:)z)Qe=/s2K)k#$3{?a~UMB)§DDH0H IK[x&宻(ߡ0SQ٠QyC7t6*d^06hJ20W0t򵎰nl~C~ .in AΞƛL7{nߚ}{q@ `rTHwͰ𢈬(6/~PbLx& J;xvr$3"My=->@؝yCÇ?e˞;1ǘkEWt-<ԫg=N7V6ixVf/^W Rkz{oceSCs㝳-GZwMuAv8=uu] uxbg034پ^}95|վoHoލN<7Q>}២>GMG}}=~&xli=?.t/_!VS#`Y89\>H$&)ӷ3)*LLXYrwrr:rrp,N7  fIP%M~HwȔF˙G'(T>R歮Ar~Do.Awx5, cCI#fc`dtyU Ѧv={F\ g˰y$wKWU"~-)[I=bP ~d!3SBCAhsp\ȽQQ?<;:.{la܆o'x'r&Iڳ=Y:yvWkJT=i{A}8I=vxh#f99r7N%t @u$oE=gmY-@B} H0B@Lxy;83s:Š 0?F|.2"j`׋.`b Ua8n=.W{g[ )"hIjipWm}N! Yc`BɜdAgIbQshp|LqQsp~ңs܋a׭IN~N{BBGFn35ĨoaG])yi{gXqaWُs_ .>dBɊ3')Վ\( wIeJ?yq7'?~>|W՞[X_[\3jEsm@jHZ^ A``DK$V` CPkG[?f%au92qw^ D#!<$2=_I\;:\)zS8K W`&L#Q)'33y0u227ldib5bmgsb{ 3,NYG\۸98MU d Z 1 ,rX4XP[m#R҆2ruxy"2Iy^eBuP]v_u7(:l ֋ѧkjoH:乞tkr⩾)1]>b~W:ǂC8CUÜ"G6GqEŞΜ`N䝻FwaNkOO8/wpa\|:ttJKeNUU]Sqe ]f*_O񨁩ѸR6y ?x~dosaiKί? ~Xm:XAhH!ҌG9Qc4D0KÚeXI- A a7%q#D"EJQX g0fE&ߡS12053{1ϲag}Na0x%}LJאOQ`Pp8A|^go˲rRKꕟ|SUHl&ҹKߪƜ&f,=m#]U\<];=l e7B/ BZn "cc[cv|JHI=%3S}/G)RX}|K1}əR͓ʛOWWW85qQ+;-)yvjFdKq=[uuve۟5hte bGߤaoSщ=qvM}d9aˡߌ}?;c;|6hvv.nn׏yBBb%e??ϭ +.+gW?:@+ᆐ aqxe$WVVVa_*OTjw@&- pHYs  #iTXtXML:com.adobe.xmp 1 5 72 1 72 662 1 94 2014-01-05T12:01:66 Pixelmator 3.0 z@IDATx]^m{ {- tBB(H @B Ccq|+Fk fo4z{3V^^.մmn$ 񸷶J&ummm7 e $RɄh] nn;ǓS)ִכL%cx<+Li.-Sax 1]4t=~tOR^͝^mV*4E[*2V`Y[蠊`JKē~]OŢF"` ϽзAcH?F.W*<5&6fk#4PQȓ_%7ڊƿ7Tݎ؎F irרLJBJ38^˰wOkn$SC=SQ1j@M?;8e>vzU8xQye<~pIĕExrww*c,wF 8 Ew[8ev7 p6rPU %Uǩ ˪[r~9;w (z0z]֨/?S{a3g/7c{wnJ#xqG<OW>}Kf*^} 1c~fXyݬ3v݂7gN>}xN97oxv7|-H_ q=\j(\!mЉ߅(|Q3ZA%_5|XYil"='v9^Ƅv~+ݸ;#`οS<''Gw[Sx3o 7<̓.;^&{ =t˯_~v#>î3_ܓW<]^Mw=+TВ M{ͿוsN?>BoC& ENr cVy7-X2\x`.2j!]T/ z1F P֯o%J# 8e *3f€#3 ڨ[K`y#i4{@򼽇VO%GË+ȲS5M` Le~g~`#e-J*P8)-qvk H|\,Z 7'K˴HSܕ%ze|_(fʾïOP UFEySb?;.g(}٭|+Mj%xreB8O~}!M7: ^sߞ\U\TUU洅}Y1 0\sy7omcHxX(yJ@"Vm;<5C ܏\ 鲪_jJi}iIJf2EZ=KÎ8#s_d{P-~+nw2Yug/OyEƆڀ,LK#6*bh^{4_J?CA?z2W_s OOtG\~UsobQq%xbV]^J&{$ҫ;ޑq  'BH9n3sc!4 %DHqV0&fB6y fC.)ԊL%aFAfr*N0)fy3r ?JV!eM EP=HPdiN)` t $XL{^܉p ` $[PlQPPmG3IEh`#n(KPQ +XG12mMÑzvX\e}7mXxnm {() 44GRFޫ l'\pĺ ?#x<ع>i%Ԃf[ٹ˰#BZr_oh1db(4̢K/\RU/\*I+^=&O~):=3sPw;^s8f4`Rbx5k QY68{ Õ`lc i/DY!Aixfy0r Ηx{ALT` p1S0P)KhᇼINTՆyR=dn 2L R㓩Ȍ@$ܒKt0Jȃ J)(4jS" ;IU h@0r!pcdg†!HʂV=1,tXV5yXƆ0]ޣwQЋϑ|X^ٳoP(Ǭsb+ᆑ`xE*o%;ῠXˊR{Li:vJUh-\gMe8|&PQq !=&x^fs[$΄\TPS!-nAnпA&S@0F` lY r4v8iCZ8gȡ"\8ƒ,A]InÙ1By<k.,tk :$@ m}wخ>R IѸE `'RjpC<^/n)m  gx±/OTBHhuFhG&Ta5cO.G5Dw%O uGɠ6\U@bp+0_r `s< /"&6%B3J.v!]+X' ",RtŜncǂLb-e3:ʡ:-4`|shk<nm;?ݗ^K?8⒚E|]~Y*wC9GoDb܈طн}˼u-]C<}lZG1!;'A3^TN1C<I|xHzT[yd }q*sސ<we18kwS{gx4#"t2D9e&usJ=.1O%-!3 q8 =b'J\]8b<зtJCpX"vw4xco; J@J8%<qdJqJ 7x}RP(q-| C{a"\r% g鎐-*@C/!\Rގ EhWd@|T0 j4a)#FX.&c-  H, G6Cqo,@%!!C)2,?RBC{v`G ujK^DRa,vZ| MG8sjW_5^~nqniX3>[o2>n.>7ϻk{8ro_-I N 9 ^Y8bxy09MAsph"D@H"1V0Qȡ93a${8UE47x a¡2;Mw&b .;UxGj &@+EPE@9 ؤBؤOK$bQ9Hx2+?6e_$c Ƭr9-K*)TqD$ػP#`Ԉt?DS8-PD!S-x"i> 5*D@a3q * z]K K5bDBɏJ b2U̗K_/0("̨E~`\9NJR3,`I&W`}4[&@)s9j Htx[_{QξK.>k/}w65D0U޴iah7sƴ+IajHJIW>^oe4}}:wm>sb1l 9SϞ%]rat#|󓏫J#¾I\/i(>n&̕L<5K!*8M8*&HQh|*nD0sc O4_y)m`:Hc$`@8AS8 !ǒΚU.` K3`.wZj\a-A,`C p.riTg00&1+! %PiPT&©nҵHkI sSˀd2%*xNR%+P23mn&&m#g Nvd0i/cw@Gxaij{~6)nsvغi?O*8r?<ԳOo% =~?^]K?EcǏ3㑦95u`('NcH&cbHiט<];gi(KE#patTaG0mIn%Xcϴ-+Tnj,+a @{9eÀPoghdlOos{rf"a]m]ضp~V^)w40}y'yl/[tqUcS?Dl[={crI}!?|nC.JָE5PV^ZQ"+7, t~w>%{뵁}cT"98 8p4h7A± 9]* {hn~!7Ru3gL{s^| ݎk!]KC4[\\w0X6ו}_7nx__y/>iX;q O?=d0G=of!Pt_{\yBt,SJLz⧵W&_W[4fĂhxh:aA\H#qHk@v;$]_da]cKYYs]ϼ xԜ,\lɢyϛ?ݻ'{ifT4֥fWh\CoX>_b٢ pn۽˺OO~hɗ>XӤ?y}c3 Tx{odAcظ r˓'DdmugJ_/K%{f]<ỹ"lk`.)X{\swb'0^scm{T#shk-*3$TQ()%ƒ^D}n.-{3 oʭyUԢsŅXY0YhRcaj\eR)EME"WauRI { 'SBa`˂n<|8Y` dHOc<)F_OŠT4c؍x0p ƶc4?Ϗ iz2ŃPNq8w0$;y^$VnU?Ļ9p-P5WK@8"*5V U"VaB8e3(iC/zl 1%{n^k"ش-p%tx]IG %^l֣ L ~^NnQAB . oi1@R >.Db؍-/|i=$ 'nS,q/6I@7O'ԅ7u7@yQY H tXR9)t6r3ڸ@NOqpQ'rXw.i e}SrjPfJ+!'0Ӥ\#0EJ̴F4צ)(3-z-n^0 ȄXN?-5O vm$v% %EF]e_J#H]pީ[ԃ & '"\WX+uSbsvP۝\ P&k$[sƉ3._P+#fԎkPCG5YDŽσo<$BEVi 8 ti 0=ٲLhX DECi?E˪İdC@ړ y:'' `ϔtȇ^Jvu)0k^ PbwJzpf5 hc3mopAG)9ŠpG żd/胧f߂D,(x{z57= > рJ '*7 !ڹ\:Ԅ,!I2jP -9ӂ`_@(rjGpߛlblfaE䐐Xn# 3 fT+Y"&7V9H@aB $~!d9@7V,AM"0/" 9|KEd-a1Dg=G>%@Y'l h%pH"GvF }&*-5K* Tn@<ܲ`_#d$ Ӧ21Et @6|\vlfwnN#O#"@Lds}г S  qE~11@K‡x1Kb ϥ| s2.SCAp)%<|w"Kx > ʤHΔ#c|˅_#j  1EQXnc5L >8g a*= ]APD2)$I~@B<.a"2$]R/t˝ ꉊ*!7 !Q r e|HjB? ĩ^?B\)Ii1pa!`FAZ.o6 9gR*MMC"%rRG#m(,1dFTfCj\Y+z # & ;B#-EXC}FR]041Ŗ#}&AL)+Őap8L`B{,zվ)lYF!q <%6@ K!XRUH줅= W&99݃~L+Ԯ%; ~7&D=fM]QAxJE+H*``czS Ұ-QXV~ E2 Dt%Ӳ5ƐVƦE`!^$.lc0CH&MP™HEQOzrزy33ʂA:J`2li&)JK~*DmḰBH#`NpBx^lEj@l7(ejw1m;a$LJ/a ^\]TtoѸO:-жPs>%,[7H4~0񞬁]J?XlktXKϒl]wǪh`<рG 8؅4]|R6#}EDH;׈j[%]^l,&U oFp瑣AN. -$62zYHmHMYwl,ߌ;[H"܅%X,l c6s=Cs;*{ˆ#8Nb)k\dMN< sVXLkmH EHKH츰ƳIgTd[@cX 8 *T#Gxk 6lHf6u(,J8w4,Hd*m˂ ZT{\BT-O 'pIXVb}b\NZJ;?vw;J68lԖPã-P0G/,qdL.gm8͇mX[8>\OyOe.6HY;"s,. MSpx8%vJ7oHI& kt@x萔װLQn&9t! o>ťxxn&ϰ?B~3x kz/WG fXd2/d;@v(M2S bxp FP Wȇ_ !ex`i#2q: 8r->ؾGX3=x<<\ gq$t ʣ99#A`}m S @H r` "x fNzɨH/!3a[ V?V3peR`6xNʴ"<-{62U '| Ɋd| >0%etCF["3PFq~ /7H7?92)AA͔@/",+B><K:;0 ,N #(Vĭg9{däYqbA%d)A@Gr"'TX s9pBWfmc ; Ttpm&%]ȁAG@B̿3"YhxE2+ pO xl :) .trp˳RxJ~܃=z, Gt~BN`Dynd <t@(t}8 N$A3'8  6PTJœn0kGn8]ayΓby3Qt{/>6,F2.)%X9mKN3"//;:'@QOh5Ao9 Bѹ"xc^Z:7ɱFI)"̱㢦:(PL*G˱"e bۊ} 2 ]iA\A <%A eP7bymÐ"=[5'4RG(lqƛ$3HYpƖQPaeBoq(qYv̈́p,/.}exDLhu &bQ~mki' \nߞc~3ZIō]{ĵ!bG7T >YjqBĠ^wkyTV3w{仰{kaJJ$ ɚD,'cMpƆpu`ѤZM4(*bKV`nK!N;%D]%bF%ع{mٶE]7:utm\G4=.Ejc ؍G.xSj57[6lbGW k eNCg{Ůg.^:aAtB^So9\ Q u@ ?!8=+_|Hw32+рGy49]uoq e Ѫ~ι6%yWEZ -}~KU?6k*q~pX'@i9ax1]O;~2wνWWUuG/_].^s=CNNO_mh;`lȓJYSzw۾_ =ڞ.4ѧz͒Yv upQΞB{vыwzq~Ci5W?>{|TAm kg>c[jX"2{Y4BZC yaHX,oEdž̉4=ᜍ~#SDSq]^эZ3_ `&J)+I zSg 1ȳ?Jm`Iչs,)ʀἒ\7) eph}s'J[c]_ 2`BlGXCm*X m`Q1[/Py X27EΕY`zIB5 < F/ľ&c-)OB8L./McZܐ!df*Ջ$zS@hpBhcG[RK)\r KSdoѸ4K*+UMi/x'ɱ!gl?pNY-&bQJƝ|~)ْc{]l]? ؅*e]Z *骲^ݱɷx9B#KCĿ^?̾.1# ~yFGnm"8MzoU\xte{-Ic1Fu6OuP0`\4f|p^i:]>rx;m 7}DžG%bc`Q%[|Gz{Fŝj}]Cx%}s)_{TZox؉z?^\2x$Q}&yf2C8ޜׯƣӊ*7|,K5 i<'ݿPz׽+8[CqyxS*0wiI͈_ȇFYkG=`S"2 z\+Dbn 6&?:耠ՠωhӌ@y'sR†8H{p@ SMK5ǧ-4&O#Gq"R7ԻK+b37/fFz uHZ&6kvD_|򹍙3U#`Ǜs׻'OigӣCGeG{& ݀E]T0; PxȺo(nӏ>oQRvN[vI4`E&o`L01eH(8bcIX,qgECdveG]M鋌;EK^6c_,s|Yv9$ԭܴ ZJ;d?ƌ#*K2 o3yMR.ѻ}.iqMcaiFcC޴]kHs^9]#gevjv*j/K|<֌[]f}?Գs3"rRj6],٥ictIgcM+#b}v&[ڋG[4\k8(O2ьD]V-{ "x,l^$UfHr𫈯spPLC[e^~2`6]/Sb|>#{hkh %Yv lw("ZmZ+/{ 2`{FM5 ng<Z6#GTX!eSl䮧X4H.v]7 \=t5jM7!LJai=`ޠiCl{2;z[gwe4rji}z?ܽXqOQ+E=}sBQIħ4 H=Dwɸv=ḫD%$UzC! B KVC`{qB~B{%GhTGo^Lv)!gKnp*.hK–" g*ԏ!hF@[مZ[ P8b8(|>pFt$ʵK>?.M 0o'dg Jġg}sr',)~DǯY}گ5ה1qz/QuB8mwqۊks=V}ZN}Gx_[xߔfc`Ī1=;O v MVGv90yc=>}vb츠5C?cÊH? _171~\6 ,Ă}2Wtrg.H3>`a`[(bf."}߽ўG[2?_ptk˥ƾ}F~bHY`NQ:_rMA)#̝/h^ч&E'7h*~c|ǥ8Xw͚KY6(jEl^!hn]tC7f'fg«WGjuH?];C!HώˊE,`@|v v 钱K51k85(Tv)^etRUDk\*3 `}Qg1O8k6'QJmviα˘elP켡!.m26LGiVEeܸm_i˘S3&sz fGexfG #ZE`m'X;>ڥ%1kx? ˜Hy`f: m/ndٳ*lQձu#%=fմ13vX reld]jEbCE>+>zlȟmz?^R hK?/&Dfgcdq`0=M\ʱ˲O2 !]ϋuK˂9>Ak: !'Fo/<9;Km|*+W{Ə(<^ݚlۜfV'Ή_hcq#VsOf/u5&'_yկ/HU ݈驿ܦ?tӡwEX0xb,]@0EC=dS.Y\/g9hWZeh OإDqۨ%oW?+'դ[\"1G]>U!#LLG7[?_q9': 4DS[C?NrAͅh=Tt ȱN]- h6-_h~J&lօ _| ásvX3"u G<4zԊ%1WC5HzU8 tdcƢLw0{* 6vwPbehQ\떆}5C,_&iCyE۹,n-X65-[^55jQk*̂ c5 o} V,l[WTJF׹KERX(ܸ+sVG[7EӅ |~8^bJ]ɦ 7+F@z`.iXR&vS+\8$-eVl+0D.mmY=0.CL@تB[Smxe}$d֣]4omfvYnBX̲KM] }H]6DBXd+`>?kn h/bg]V$W,m,X%H|ʔ1. j/9vY{цLC7Von/kMkʋ`򶵋ba]FU˦HMؓZçV,&AsQ4ٸ!ܐ&إ~]Z9I?ƆV:[zvkep(-njhr4g;Þ@],bocVCX4dKK|*(͊vQ4p.vGV Ұ>Vlk/f1I;["EOΓxZ `}?POvL$Z҆s^VaZ'vY{pm59%?XsCP~N3 ѮF]KqpQEUϙ߸&%I/ךQ?~jPLjUcקGG(VT^P٫u%'VVW6_ ??1]qCP_2t̝mh0b뚧Jr_)`%Mlg6= GوN?{nV6۞?ュ ;-O"-A9Nا/WR;_ ^!SV,K*UUS 1엮 >P!`(Yؤ`6b"I`@꽼aY`c7^!lI~ڶD) ,KE,GEn!pd[lֱviIÕ|y Z gg^ ؎n9*P <#={ +ǾmvAܥج^#9'{Nq{cyc⏫~qϦ7|ܔҭk7Wojj۪qO3# ިx,l\Y^#<>a潽W*3]JCuKST{ǽ/*FEl3EO1+FUKOΪ8~E"FQͅ#J=>״fR{VrQ)pu|߫$dilŴ-]LÃ}jOiۭh݊wYGvϜXB>?;x g7 |?xDq+!Z5b~^>߫Q+1'W \m]#"a\;4x:t^Tnq8 p{ XdeLNr'#lMu uzd~tzZkUj#ݯ #c?"6neɯ猪 .|t;;q|9H~NF2klO;,i1nCAr#VDQ\o!-n[7i^=`&>=%>^nϞeA!\e ~6PaMBv"G 2 )c;?(dM@`ƀL > h$N4`7UdI efRit$|ƂX 8mH4XYD=g-ر0h4 9Rh 3{B YVT܌Y|,gk,v۲堵Z=`| 5P1~7[BeteX%R@X@nNfF4כ9;ؓGCKx<)=rk OPdJc1E߇Y{F(8Ӏ Q|>o"N nW Q DiA_ όlR@`0 6 HŬRn^hH0+G O(rOZQ XHtǖsڃ5ΰxz{D|d{8e QBm!D!".#⺡H,^ ܈p̹r<1n24V>.n4s,w=X=EI_[O(-ς=?8JIi A8``*3qЂ a|);"H@2+ e&h|¡k>H4|yD "@ hPU}(H\`)04Q^(HAqn#R0嬸tTtr-|ls/&FQRMb`CW,h%0TYWQ EŻZ.l `PЯF&P$&x˱ ґ_ +݈A>Ow}L@/a7$Cdv 7%UGǬ%G[c 0 c 3OUUZDc~P s {Ԏ K: g 8+dM*X$}^QB 8]D9H{18Z 3x1QD&9 Tf="b<<* :G%THKQCqHg.|:FOOK L M̦rH '!#60bb#N9ĽǏ?~>&Qb{`-oj_"ќuuoÕ X_ݘ́ve]wց~yu)S:𷮙tm[C=K.=Ӓ%Kq}ϸG+YhYߣJ~59ckW6Nw*mC71MC=qAW·Kzw/<^EūVa\up2:Zi9qn7Fr 9SLk>~sBG>=8BI9‹(lM[Ė<篣G ͳQ;0G6?mZY]|p7}xH 5Zȡ /_ g|Dm k\M Do.5=zOAp2_?-o lIWyЉA|Hf~hB{EWs`b,)hJt0Up9?|[.yš{ZS0ǒg\rף\q}.?hWr>O<Zug\Sk*{\Љ,)RrrĭnCǟreHk^=any9Oa±|ı!_sN%7s*|^=X>X3œ/{/:y0/2↛.Yg||.?KWrGw=g~|?|.}>3˺K zCFO.Eg$6;h쏯='ߺ<'e c'r~#κ~Xœuvssl@(k[Lr8p4h.Lb ׼Go ްzuWgx74zޫV]}v|mW^лgD<𸫞z'EC)o︻qGym<5P67e^dzKF^=V}F^!r.?辽;պYG:vl%x+;O;kqu37+Cc!}_X Ȇ;w#z3?_“<`XGU-K;խ'[ns࣫.3.k_L=|_|S#V3h䃏}C;O65}rbI8p4hрh %G9'O6޷݁*sa_W~aS.v|D`:)-[Tp"5~/;I0͑$^wx}Dn]xy]ڒ߽`)go3O|_ǒcӮ\YO/e31 s>:O3TM1`ȚJE4|o^ې,U/sV/W_لHWFk_x;E@eW7X=̋uxgޝ!!ޣ65[աVyhyQjU(UZVZjEDDHD<7}}s9;7 ̞0s%f3nj{yzⱎ*wdZ6n3mИG ʳq 8(?G*''͝rjNV-Y&#T+K{frFznN~)bR 60G^-}v(lǚ FĴcsSKKJ2o ^W[RwڪߨN쵔´gnͽu)Mҗ"3 ng sĴP G`/+Hpfmd L:3[l/(`̨qo{_YVUA6EgP^zW U$Gȡ}Oy-w :gq<*^<á?S/ic4)Pxޝ?nѣPj㛃 8(ࠀ@@TvZJll܉*Lk. O8+*m3VD68! `ZOܸ2wAÆ,[6+)Ek;o-yqqܑ+>;ը`.|u*E[7'Qk:w>RQ)7] }qR}W=f[>=Isn7ϧ(˚Ԯ1\ faVzav>6E Xv6u?YEm* skoI yw)2KC\X'38mY ݍ㻃 8(ࠀ5QJ /ud)Eh70IH}vrrkҸ B>f5h\W]]ݛ4nd}`l*~C {^C2>FB;䫩qsdE܈!MgIr v\%F߸]O7F]zF|đK4%zbO ׋g 7J?ͩW4:*c=9b7?AfNjm.y7"%%i߻S}=6.]PTxq堀 8(QJ VX"vz煫PC^C2,fbyV;-^m' 5@ֿ7`C3ӳ\=:V۪ J0 D-Y3ߛqբ ezmi#-Y]~YK6|Bd͵ F4uKL_XR\l(db'iF4Sג [̦bf-}i4̚Js޴7f|M2c,2x%HGqEZCeї/CJ\Zbޘx`3Xy}vrvY}>_:!N{ؖg;{pPAC?C .Ny9U2^>jׂ-aJ JKy{yyK J>0Wݸiӆ 뗤&:{>dQi|ŵ=5X*5>%WYHA[!n5j(tƭ;"%d&gj*7jv+jjBe(v)w"=~_P K{ k4wȾ$WUQn 6s2'MÖ͐㾪D}JoZG_D 餶FJ,ey̝bEv~6k7w0 I}+{VZQo~ XW<41d?Kg(TVZY0𬆛 s26*_k*xcm:yc{Xο5P igi}]TPmѱN3=Dfv-ۯw!<,x:pPOrn2CqٌkUHR4Vk4|oWޠ #EwrssskH$9mL@+\0,Q$Wyr͢ |'y̘/Yz;Zǁ7h%زL<ՄF@OrÝ;IsoOƎu1KO]kye3u,T`F_0yT uHcaW?ݝiɽ1v+’/|oIaC{RrvKNrӪҜ%X.l2IW3#N5%w)siFW?kfZeE qo:ء $fqf"O ˄uߎ"rļ//R_MW"VڸҿO-O2)0@_YlnV02V(5~j c^TÖRU8J*20Es8ͭvo--a5TJif xBT9`Z  hB%J-]@+Zٽ)"/ 冟Y:ԓ e4;^dȓ5-E)~J;o gAkIfsg'2k~CDW0H6~&Q w[%eDOL}:3XeWrILcW6I|M4,;n \^`='uLL0,b{+H_s“9YVn VRj m5_]~ ?$,r'RvdɔT S:\UR?5ϨA$eɚ.gxQчTeү| }Pg1[|~~~lx2QQLe!0a H `ǧ/ pg^m3-Y|x6ϏI: Vi.I1sV^0=׳I/ڵLtǻh ;1]6~D)[~haAUy_:.%uPv;zsmK&|ұ{gx5AK>Ի8j܋o5>.\\{0Rݪ]S?oOڴKv|֬Wߙl`VY`#nC>|wN=v^l)vߛ+~k.8r5LXvcY|J(?*`dpB|A\0rX$))Q.]hbʌ%rKhuYęܩ3C%NQ[syF^G/(0Qύ ?:Kb*5h&{Q\;INz&[neU[71i\pR0Q\z;,>:rҥEr{ZtUO =Ծ-?ڿmSCo=jT {а=² s;PwQd|0Yz9pmwKغ~.gϾ8y3p'[of%}'- otҋjj*Z"R%*RVmU@6;Ȫ_J% \Snڧf a16Ya3(Ut5–PMT|wTCT*%P%R Z5E%2yϦK~WFkHq8hH @ Z8<"Ցkm.SLB9*t 8?_)L ^*kh9t Lqj"!\H˜(6Mgʅh~*8A/z):*,r1?~D`!=F[RTSʐ`}dYѵ߷O)CG B/x8ӬƽԿ16 @i9ku XCT%CQyOAЃ$ge_7ƿ:xGu  h'hk1B)8H'hO' D@dl87q^h($ j@V#:tŅdP(Ck/!$ jQъ" S(P510 1?ai[5ӹ j-2&AWyڷ&M|{ڻ|lwhŻv9[t>-`/3N^6 ט4kWt0a =֩U}!*}4u# hYdRwp5^n{<=9XpqcOu~ڭme_.߻G2)ϑC{ wߚobաs`(Ry-D-,2< 0XUttPE IDAT߂3l [b PO$?XhTD;zuG<ީS-G.5] V;=DRҹlvpo3}_=Rh!V9y%&.v툅q]t d Fv_n' K"T f.k m#ԐrA(@WE0·Guj/b ̦OO.wf[GͮTJ\J#̣>bX]k@sټ5J٬9Nt" OC$՗ل7#pQ'" TT@n>ҍ2.d$̂ɵCP!ڏJ0vѡĚG1`CVr;~TY˰i2O@%B*] Q&q9(@!.'V hv#ODimS.0o^9.1yNv>o&鮃MYBߺ9ܮ5?%f"SY^g_aۗ3oVy٦]fߎ(tMZXV+nd~;'_=w&N#ߵ ܼ;tk5myZ ?1إ=IuFBjX>ԑsWc"ܛnӷHݻw%>y^ !Kop#Q'2ΞC4_\=.X|u7xij:2ڠ3rp1:N6]R.E%nZb#v ޵tP䜧E@9 Ja)bB穒Md)S,5ah= JgJy93kBuջKKjX+@TI B4:g{1cLah,S0;q+|` @kW)pZ<ߡW),=U)5`0.BJ, u)fE1ݛ ~zA @i$IQK!KlRg ;X`ob T25J\,ˀP>L9.6+`Uף"sʨ'8igϝj I`}t-%aJՠQ+kj٢/~8RE˖.|=? ?[bHv̕ȨXb0ƅ5]OS嫜331𑣉iWNq:4ʉmg~(oبȨPL%ϟOLX?].xmF2lD'v~eWLjaE@ňcYc3ٻΝ:u.R{+ BΥJOi"[tN2cmAy빘LE&G68It<ΦgP,k\$W(R+l &M eAA6%2Z`2f#[؄pV6=$4=(+J6QIUŒ +, lsA;ͦi~1lFQ,LmEyeN& GgE2E.5,1i㘌hDg60< }*N/)D ZJXŪi)7J?EhA/&R½igfey9ZKwǮg`w]bRM QLr·̩vn&&sZGqmmKS o$ H8rָ\o?a:)ޅ[M`&$}@{6U/PmמnB~pVSyOz#B](;X]q|}$  @aIENDB`minitest-reporters-1.0.19/assets/default-reporter.png0000644000076400007640000012231612556740435022031 0ustar pravipraviPNG  IHDRy #MiCCPICC ProfileX YgTsQrs .IQAE( fQ0!$(*b$`xsϽ33TW ΩSW)@Oxt#:8(_+Wƭq85<]OO `N0%_: 4_dVzGLj?>c߃ǏW0f巧[SilF_Qtp: C8N/ǩAO pz7u(Uֱ?qZ_>32f+8"Vi ~P?5e>v{5`ׁ0քcUZtq-Ї?:J5JJKJUc8QdT-80(F UX]Wu渶V#]Ȩah@o,pZG& Gm.9~í0'1 }R@` 3[`ԃ@8dn2RPyp \ nù|`,"BD(ƒ!h!qD<o$@b$d ǑSH5rA"=352|EP %**Zj:@tB =^C~t`c81LŒ0; hX2`eX-vlqN'9ۆKUpOpqӸx /_t|>;o EЄϦ!pPB#4z"C#Tb 1xxD%% 1H*$S')J* %5zIE:f: tvt~t tYtt7-ҳK;Ӈ/K(6C0C C! ɬdYًK>L>Cn&?#P(}'%rRMi S~01*0Z01b,bIɀi S"Se.)f:fIf#f*s2s A6e;p,gYLY%YMXXXY[YG0616#6_=llw޲إ-C3ϳwOsrqrl(1‰qJrZpqfq^\2:U5ǭϝ]Ͻ#cʓs%/Wׁ7])>v>>_ K|C(,#rA3(cS!yBlB򄚄 s  OĊYuM})F/% '"6-.$n#$^#>$A'%$qTĜ>RRRR5R/)zۤˤd2Z22%2ݲlll*!,W"׳N{]ĺudy8 >)+z*f+WT\UR9UWY_">U.z/jrjj'ԞۨSoQ_ԠijLjkzkkjkkz6ޥݠ=^c}K?ՙ CņQ]Q])ݑ78'G+{/_?n cbp!zFƘqq qaSQ@i3ufxs+lA  _jiKM˝mVd+'Voei7mPK\퀝]K{)mE;9mu:4lE%֥ŕ˵u-m]}#^`zOg&Mz{{ lڼ}-[¶ʴ7ՎZF)5=O/o_?<@7 '`"P707p2H/ h*(xҐP3+anaupm#{ңFߖmfEF7GǰÏXؽ6we{ل ㉦wvhIIڝzSHOr.]iަTqRjN=n{n 5[ΘNKܧt?nўYt`!CV:qp$@^vUKNbhM<Ἄ[?{tк#ǖ/2,+/>Po|VTg]p!.Y]juĕlW3!M_>RQsFMWo): PtvV#}cZJSbLsTԝ;-[[9u޵>hxv4]PXNk]]7{64yb^Eߣ~^#ON< {e(nhy / ^ɼu7G}G?E-M{GyW0.4^=20i:~>,NdXIӕ;ݧ~}YzϷ3վ φ.eQ55ma|1~T,|+++QTu[G4 gx )\k:"  ۃs$n:!z][r( )yVrQNY&^&>7 oBD;J|$ dTe䎮kSVrPNQQWG557keh_[zEWk/H&G͇-+qk3,+O~8q:عrxzӴŭ#k5?!D8  k ?'2(~M89f 1*>w{rBX$ݝS v[Oٻ7=o_3:2:4~c#3ٳ933y 뎙-U\XR{ɾSCe#+3UՆgj坿TS"%NWV}f7ojzN~KFkR[]{?y~Qkǝ u]=F'OUObeC#:#^qF\[iq|lbSS3>~f|u~ݗ\_}1C hl!L]ħ܉$y:)z)Qe=/s2K)k#$3{?a~UMB)§DDH0H IK[x&宻(ߡ0SQ٠QyC7t6*d^06hJ20W0t򵎰nl~C~ .in AΞƛL7{nߚ}{q@ `rTHwͰ𢈬(6/~PbLx& J;xvr$3"My=->@؝yCÇ?e˞;1ǘkEWt-<ԫg=N7V6ixVf/^W Rkz{oceSCs㝳-GZwMuAv8=uu] uxbg034پ^}95|վoHoލN<7Q>}២>GMG}}=~&xli=?.t/_!VS#`Y89\>H$&)ӷ3)*LLXYrwrr:rrp,N7  fIP%M~HwȔF˙G'(T>R歮Ar~Do.Awx5, cCI#fc`dtyU Ѧv={F\ g˰y$wKWU"~-)[I=bP ~d!3SBCAhsp\ȽQQ?<;:.{la܆o'x'r&Iڳ=Y:yvWkJT=i{A}8I=vxh#f99r7N%t @u$oE=gmY-@B} H0B@Lxy;83s:Š 0?F|.2"j`׋.`b Ua8n=.W{g[ )"hIjipWm}N! Yc`BɜdAgIbQshp|LqQsp~ңs܋a׭IN~N{BBGFn35ĨoaG])yi{gXqaWُs_ .>dBɊ3')Վ\( wIeJ?yq7'?~>|W՞[X_[\3jEsm@jHZ^ A``DK$V` CPkG[?f%au92qw^ D#!<$2=_I\;:\)zS8K W`&L#Q)'33y0u227ldib5bmgsb{ 3,NYG\۸98MU d Z 1 ,rX4XP[m#R҆2ruxy"2Iy^eBuP]v_u7(:l ֋ѧkjoH:乞tkr⩾)1]>b~W:ǂC8CUÜ"G6GqEŞΜ`N䝻FwaNkOO8/wpa\|:ttJKeNUU]Sqe ]f*_O񨁩ѸR6y ?x~dosaiKί? ~Xm:XAhH!ҌG9Qc4D0KÚeXI- A a7%q#D"EJQX g0fE&ߡS12053{1ϲag}Na0x%}LJאOQ`Pp8A|^go˲rRKꕟ|SUHl&ҹKߪƜ&f,=m#]U\<];=l e7B/ BZn "cc[cv|JHI=%3S}/G)RX}|K1}əR͓ʛOWWW85qQ+;-)yvjFdKq=[uuve۟5hte bGߤaoSщ=qvM}d9aˡߌ}?;c;|6hvv.nn׏yBBb%e??ϭ +.+gW?:@+ᆐ aqxe$WVVVa_*OTjw@&- pHYs  $iTXtXML:com.adobe.xmp 1 5 72 1 72 662 1 121 2014-01-05T12:01:54 Pixelmator 3.0 "HZ@IDATx]`E~-H (`ߊaޱH;$RHۻ7{\BAAΊ)o7{oxa??h&[O;$Ij=$! hXź{bqlPes,/ f΁p@>%KBC i/ΘЧ {T(1DI[Lpk+--J涐P]Z EkĮ΁ƁzQM|Xl^w, N[AH ~4s䗟;. PbM6y=7_陛9Ub"X67.>g)-lYA>`{0bqfއ@ .Cu#XSEJE@]3ȉ5999@XP~w|YVhE6ϛm]EWƒ0f︸$]*=ƦݵU 6*j\P"441+4D9-#SEgMUEKSwNu/ʯB~@bJz/Y.+JH-嬩uY19*xFr*U U%,"MbPta!!ɪ咤]#qwz\{|HA"A_c6aV:! .᫫?@lYbAc+ QQ `!R q_sssr&PЈ{ivᛇ~Fe MҎ>_Ni`zG|9}3f̜_Mؐ-y`!A!f/͛?9ӧ}>@Xb `)w~K!es-?sG:]Κ8}3fΟ7kSu;?a3fWrք~ [py7_G&΅ׂ47ļx 7~C4`T%`,tPBG"E훧"!Q4y͚J<999p0s@ZmEG `Ÿlh ]?+F~wvxvl+|>v G}o9kz>p_|-{`zo`)pC6ݬT-:W$ e V,ZVd聀3G3dNER PkAģђ֔XҼ90m>: -$Q,m~?`Ȼ}{4} osś\fʮ"_Ж߫e=O1l]RW͔V꬟%Ѯd57NF[i㈃j"Pr>2>|S/{GV}qc3c-3i&a%vW`?u >* EkhoVCh$~=(ʊE~988:+ƶΌ7~U3bmhj=7[tl**5zNhK_ݧ-\]`KYvuGrL׿ZTc/ۺaنl]xʏɵ iڪ\0tæųg!օ~yKqCR㎚پ9v"+lD Y~% $&y?@V4LQrITF%G łk$\SUI63K5zuÛt  AÙ Kb)AdINuHo^o?h lqFY ǜۯ5 =+nCk6eKs9Mg;uTt8r̥%)jm+O}ǗxΦm#ry㕥+cd&Wzw¶-Zl)i\(%;nzfi۱C6 _O=bE~f..o0)`m@i~O(}̕6&7GX F4"uHy7$qtI66quE;hh0Z3UE: m+oaΑX%"FaV5Ksss`U1M޺iqIAWX6V"#chA7\sIoM(>oPvk/EYcb&/t[_zo~̹wg\ZkԫeeJǟ{;>zΗY~Qζh{y_ҦkwѺYjرhq᧮uw?0jf?&D͝F $Hf ̶ R:yE od Y~spp5` [cSf%۰cG*6ZD(N{ʈ!j᫘CwH<'9c|˯{gL(Ǐf[R!8Iz ЧEW.9=wxʭsfYm:z#uھ>|bUO9!pq(\С56@G$v_%QĕݗW#-yP6#!Q/Bk['[+8]QNáYBgMPj7 \ N0[Y!"(avZgs98aW \b$԰V>EYV5K83u'khL;N^T8Bp:*g !:ǚ@ PaX2oEr+nxtٗhZDG 7G?]!0[^,#NO\Eua@w*KGvvA&+35!LH&ӛ$L3FUuMpiS L$nR.Vvb@Z6)o Ub!#/Y0O20}H Z EдcM%D8iO$x ?8999`rKI`veu@ 8t$.'2LNI@Cw3 Z\V O8uyi_(~v1NnHBT$D]P`1%2-!:q/Ėa*mD"N8L[-{  G)v{u߅|Sa-g*`O]ǞΤ[: nSYO6煱>ÄsZNB}H@ٻ|⋢=6ICo5l4 !q)a$ #,ꕺQA4PWIG sQu 5)`pE{?CVO{ĮWa*$P4$i:OaCy1\0i^6f@5/CM+/)@R8sq~2:BqEԐpFëoh*b".~VsdasRb/BqyXYYI, xR6}f:l疃{/99@2 eKʇL?`Y>a~lR^;g~}ф붕@αX,PC|PHDP5*!|7*,ڡjB!3w;U EԚ$,ʊł8A1?Hv>\έ7>fG|9MAK|>x4aF)!T]->f垠bC"|~͉S+`]L5 }c7PQ<3 *D̺ME#M7*r_]U nF[-c2tlځ|`>w{`zqO[8- ZҎ5c#: t޷c ݻtX:ƨH;&o|uʄ#1wjoÏɲ7{Րa#,'>5;&>{oe}X6b_FjvI+Z0Bۮny>ɑc_. =9dq0̙8r{#1mFg̘ zgάEev9>U]cƬ9Nbj:CFn(*z"B±jdGV{MAN*tAd'h@tĘ'5֙d (vo& @A8&sU˘4]rwSbդ?kٚ{_DGC8IΚ+/%tNy1:}'5gw/ض#)m՚#O8Ǩ {.Y _zЦۡ~WvZ~9m/(uuSo]XC6qcOdI3{jM;*s ;qNg4"('_w w2c3oxmRl\3^W oV.m~+N[ӒRbܤ'kmmG^ke;g3WT;?cp;Ǟx|mȓiBft$3{ L27>G<GQ&u i?h 9fө'­y-^xjo5COz^|~XPeŤ!rh~!l_>cԑϼᑌvoO'sQN~Ѫ!|朓%Yn``=w>_|x#nm=]sw?"co A( 2⺘v06O-l@uHkeuڀ*aM^"=RuL ERu6&̇YV,)SqpSӗ%#@wfp_*'.hȾd;䤳={D]R89mfy㒋Ϝ.X57a6Mzqҽ}kǛkI@ F;8{aEFNhzw0MH,$ɗ08hEJn$pM=\9C>ߍͰڌ*څ5Ӵ}6 W8]17l_y˽{_ Ad4U+Y5#?fG2IWzX2/roD!Ł3 E3:KQ do~3@4-X+a 'Jf]XPA5( v/2yQ+2 X8&DPXZ z&ٓA7\!V4̀ACI\"v݊2p S;?۝Ͽ^܉w)LO][K%A}>lԠn20 s?A015Ez]!MCzvM춸^=zfg%3fOP20A:~yz/EZ'|N-> A\2sMyAa0b7~><M1*p\?aeQnP8L.Y@0l S $ Hu+2*AO*>,3SpxU΁6$)c H޾dҵkֹF<."o|82ߝ?Ւ NC JX#>/^ŵ<~?꫟?xuImckx=n=$nX/w˕=: >c#TC5}מ#W;̔JIֻ/:HO{ˢ<(d疻Z~U-'<Ֆl8q9}}^WYll^'ә᭭=K &~(XVmAqg!ֲ B 1Xp7$@6UVH)JfpUmAeb!D1 =#F@qBA?BU#,9:@\R}kd-B{g_h !4ӜC*(=h I?Įi`Ei6K= 2'!?u]D1!196֕U5tw#ĦĤd묮ucfV5krrRUyi(&e!VPy31))wW׺d͖[]YbJL䐯6!9Ůpg .GclRyyY'&R#5̌}mSOu9zlT6L)%-B^箨+z\V!Ĉ+m/duh/kȷt;+e $N;qI+򲐠k߳WOUpjy b|B͢VVȢ_t4}քYVʐO늁r0_-QҬ'9y0t7GDNhPD;f¼Ê=C5UU8k>B(֦>.b9888PQ+^~XN.L%9?U$vX|J < %+ agj>K/:` ,5n6u {b ˜s pOaM20o% 0S|F &^~/c!Ř"B})pIC}%" ,5M_΁Zlp= !g\킚l'yJR#uG-^""]o@ @M2"5 @e&lkT ́4hُ@a-`"E 3ہ] Gwk:@`UuqUK/f2rw Ȏplm§bq΁rF[XkR% LcW$`-w}cS>ʠ8/f@GMs4"6K% L|5A]Õ۴ n,#K:'F&bh@(c>04 **Ö#,rqP`rO#֟»l@P #҈U0Of%@hbk !5bQ_e0q7}It0cg:v6 ̫ `χF ( 8Q4e烜؁Ʊ #vd~$D mbDp1:B](LO21=DQePu0m/įrpp#9!VLFDU ((a%" `cEL+y(IXoP~Lg آ$-4V͒'ME2dNz\d ۉ -f@4teJ@,HmM="Ũ4.;%e#B_4zL*FDi&#f mc5heS/f>.rR8X8ҝ"RKZAF:x`"L@F"#FX?%#TmA/b""WΞHˑ) P}7~{_oSqipphl{$LFуl2dft ttId#R&0/FNwMDjfw][Zc]PF=EX5W"ӎ;IXêsss?dL| r 9\nxsssus[c^zp׆?y]Z11a}!v<љyna{[Qc oGC>;YtzD Fԡw}av?h@]D, EMm4@+ §E,%gh7"uO > љZ|| _&{oIBf qmQqTC&³6*R+6fIFIiX飥+0T'pZ[h>TE w}aϝ=AX}C@nd, *Ua"0طCPd1A|{CA+䲍~37-0%TwéX58QlDZexI8MRh*2u62RS 0mAds%: ʚT0-@:%[H&KhEN=ƨ8Ӝ-0Lu(tc/ ]988NǏpA!2!w"Jdqe *ɐNpM`_ 섄$Z$D6EKEQ3TeC<8aB+@}IF,hǙ-ȴ@VI G\N=b[cfT Y'ml#nP- Bm9j hӁlE쌵N2ۨ7f?89]# GRdY_Ҕ "c_Rf҄"V 4fD!1r"X6!42#*C_aj. Z*ȂuџU"j~^4`c3{0 :pxuÔGFf@xUhryQρ!8x)hun fO(ƶ>l꽙[nysa{w(Բr˟shވ! ,4u h/ϫrpppppp/l36~L{W{-%;~Q>b:PWLv{0m~sssUs!àشn4S3 OqC@6b 96܇N3fƟHHH&e?юY覐fUsUAІ ?~=rN25^7awOF Ɓfo`U|>?岿cI<}ΜlAQ~9999cpU527qéՏXgg"DhZfIm( mlk`_p#[Ȱ&-p Y]m_&EB__$*RI %?6X2p3B B!/φ Ô0脺dUmS#;#b6ןxRHGYŎl<^6A!hA|%V58oǽnp:999G  BxnPkUyrUf9Ob:pܚԅg( (E_  !ۀ\@(@ V674s>NJ lxWpmFhXhP) S7w @PЬuҁ+hW"Q[" J"1d3HHbQ$i4(RJ^`Zc8h:!`j: "Gn>RHkJ)R'@kƠC(,ъ@Ў3V͊Pb4UEk0Zh*$zT L:?QXØ4Zx\sś.999998!|qːw#9^r"}/{{d_Eo{m yy3'(U888pEp8p:3CQuy\1}tTA89;Qo Oo>^$Ir?p)Hޓd 5?| gG> 8]G8;aCh tS.")Fo@?9ʔs5D U|$ZC_?0!{#ªN88+"}78m$a3y#s6WZՖPTQf)QAΟukxDw9[Gt|]1cb0U2x4xss W7g9,΁[9999GhLf]O}`=qD*d7I3m:pW)΁}-ka`!ɜ:GL90!& 2(lm:+&(lVai'i6,f^1;w*f#$ ]riWҸ}eT HRu&Λ蔍9rq@Zk͊P 透Bڽ!}!86W #U|Pe˺#QTdH!''E`AaI@<IUBp7 :-eIۧ3V0@1'6n?0JX GשYQ K*J⢰vt@yuWWZ *;3 >dn2eK x o6K4^?BF0W7^3~\A ECᇁ6 `$"̀pDkLjq?>: ZiWgQ;F}{D|c<3{BDECU2H}]<:0Q7"[Y"˿+q|!h3^s`pa9{b~/9P^G'Y^F)}G$ȁ`MFjm$`($fX 64oqP9PB}w*3hn0-}S7-8OeƝ}h;Ҡ}4os`/9v* x_9 LzdM*^Rq%[C\DǢo y΄fC OS"Dė;x߆w^,E=A!4:/UULaJ{ݛ`nP;m5~0}wqWoZT/' 8h8"FkV̕Yn~qZ4Ubub@ok㬺~EôFrɍNkb {yO E(, &$j^?{`-$IϽ6y^q{C^nۦ qi_V'^B^Tܓu/Mڼd7k'A\mSnpD) !a%Oݺ)SDuEQ1Cfq r6¤`QFܣ_k .N=Xǖei-3O#>V횗iU"-hC7kv%t9ƁGh۟m9`88Iu떧`E\O6qѓiy ?P$]u wn/F]7TM.(%a3EV Ao)fm{<ђc1ϊ'*O]M{ʞ+z>-{(rEZ8"O=Q,X|#:s-^/<ƈX)qڐ1i'yF?tejs_ڳ; ]5y$XȢ=y܆1m)8pR ǥj 3Qey dTGuݮOd72r%f  R]AZj0ű1)Xy[EKjqm:Z}͙CfsB+oh{<Yw,>}aC@IDATk{Ww&%^|gK6h7Mͺ`BU]X wr{ _hm=u޺mN$[J/{C~ x_`l{`ʙ볇MvO>UT9 n*!0 4@69tu pCY8.(%3dž#'O-O͐vLȖXT}A%^.X-ۜ~q7nt'^sOn2oW2 L~xaǂX Tx]^c'Ǣas`9crnu[rGg]wgW[x kދ~]hVK'yܔ/hD[=v਄>W`bU!ۄMСv2 biw5A*;,M4q)bs CM 9C.'t~'-USދڠer9GepMzz^= K;$~50bTKP"`bN܄'w+]ϵ/^yWMmE/2^SN _iܓ魆m yNHIm3kWnZS_Kʉs| {oƲ>^c!;bh׳wͮ%2Bn'6:H i& $,1QU SUb>!.Arl rסq\P']C%ɚZ۶+*/ħ!ҏ,o !IblP1(t"k]A؋229.Q"&3@VvYr=K5UƱڌ29 9N|>;'$̬x読%աSpqNLvyR{Mj iҺ~VL:J6nJ̥/r\UI ;^8sܤztPj+t{8wci眶y+$&os w}  ïuiTNL裥K*n:3CG\6U_?|Ge\LVbKLܶ+Pij#9*hg۽!)9U\Sś7ъJPkKp9Aʀ k"DRѱ>.UIK*^uzӹmAR-b tv1K_<`(r#]ϕ_nzҁ^PVS|ȑw݋aNyn8a]#b52Ox~Tf;/ܘ.qKyy [qUj#غ&*BKMؖ%5TpiqUp0yM9*` A>L ̝U\޼-bsz;uW>xC%8ls,;=l%<Z;wCߗG){].k:vcUt]/ ^a-NfjnP˿m5ƀqW]_\!tž.JNLfM? xaVʩ]eU۠O{ɃY5bRβյ\ic1oJ*~`{/Yl vLyR̜׷nśnQOKc k7Mڄ39: ԃ򄗻b}e++}r粇ڦd2b=Unk0'S{.s޻;򗺯}4+>;|BZ~m^%=Ck7Rl;/2q3)8:ͬ:M3׎LTōҘߴYgdym%+OlQ7ᶫqaJTWjj5~}uۖWܝ3=2đ F\^fV>TĂ%UONNUI-jV;7Vj{iq-7 6PwĶ]ӍETfI0M ʶgݞ&eUZJT,letƙd9 YhU.\qhimş(:{>R-(cO<]tn9Qlva/NT v15[KN6mM:$Fx4ͦE)*,Y:Ըh @{tނީr$[foI۰;K3fJׄG.~krJݞk}ݪ$ac_k&>5jQ™#2ECS_m7.YOw &+X9,yMӞ+c|sM|kͭ\P;{~m9~,:R{ +6 =CZ'=Nu.,[wcKxu۪}m&Bc-1Y/l),"HͶ_,#$E(^55$lušnea\7;c?,}lB-^Ćo5l9!]0 qRcOsou.\ƍ>:c.p]b9'~bԫm;8 [V쾶b3WKYv 3+}8n͚MUqɇbr~V".[;ybzٶ$('h<վ՜<=fW89GǗ%Ypu ` & =_ҵ& %vOo<]qrϿj[8-zrNJ)'2z8 g\cCoޫ-Nlg9ĕoo}Wb*2@=[>YTZiIe݅ۅq.W%5nsm*T蘯wr._=AG3SͨYel1ek߿XtpJJҾkL*nɲ*Eut|J__KTi:}|jZ>:dsR%!˺5`r3vpM e?}L|%6Ү,%5.eWFjKRQxgO¬jc%3k~kX:8K WiWG ׊-[sC= -]%r#[\1_}0 r-Y/u LOOHfuݦL2jGإU_|Ѳarϙ9㳊y^2>boHO*QUl7 j,rag=8yĢIZ!)>wДsj7칿>h&Nr~eztCUMBӬ?zyT8[!m&L C{ƝuKVѬUŶƪ7[9$~`sjd <;+=YgϞmKTecHܜ*GIէUCEEXBߒ+,6 Ꚑk9rl_~]uq {*hK6.y񌚅_T⁌}TOcP l-rj&4kxoYN1UW!Jyca$e;mIQ-1?BC %uQs]4gxXMبڰG])=v]yz8!/*7qپ>6 YXLlyʡq??i˸ R1+xR(i5+foWxQbrL+xXWMMi`{͑ RՄc #Ʀ \.2֣$.Zƃag'ޞ+Xƍ3חPry)|TpS%?qŕBmO'o{ݖ%}qٷev߲ȵv}*Ej|,l;6l [H-YҠhcQxLm bbeo1 ^ϖqqv7gmS,Cge/UwOum붞~N҈3Ͼ=[7z9jIri$`~@3$lh'XQ $ bnu1p1Y߳e1+^Z~`\v {PUy`U)>V7U`)6q)D~&`4Vx dqOk~({)K5S5cڣ7jY}bZb3TڄӠ6͓^+eU./$FoC y*Cu%ŝifJ=Hjo.ݾc . l+ZqX|#~C`~&zd_;ԶsoPVgW>17l5+YqScE]`f3?ZTAL bW#^ $qZ/\jluǬZ+?ܡ#3{ȍ# !GSn.M(X0y%B8`3)FG֡j Zv*"`B_XbdڻT j=du+(-!6's4/J?~d"gFTXAk3^ČNiVaG0 mTAx XK^HcӀdQӃ߫1o+7m~ۉdn=Ў}SFl&BH@ O>[pӨT%KOk?3-]֘9*li ҆+Jp"Ѝ DV$8P}bRJw_HR>'yJBqMۇ2$V֣N/SvU@kj>|tǼ5=uW`[l(*1B@3YU%P[kT{RLZ7HqiMb-W=r +}V#T.T=-v;z՜EFalI>?qW+VI? [?vͪőn<9=8e=?8p,*1 D֌x8;ϒssҞ8RLxx1왶KORWFwu>=ĵ˽.:\B&cӟk|CRvˡ3'/g?i- 4u`-Z洛R^--=rLv1Hn;: $ZWֹq_5&:)cw%/>Vys];fׯw=2>Jt}`_NدEOYN`ȅ +]/keȾ,{ꙿ@~L L6tO{iySR-ʗ+cidv:QzioV]~Sv9,oVv~[=)uC[n~ՏӜgܖ;(ms/ (R6;)W6،~,TgXfT-տZ0?69:rzI$;<;7ᗇ6u:u,[+_r/?k\E|u;m>(=6ɹ+Z; pr\=AY>wpRUm{e.,U DE,} & *h P.A%FAzۗ}gwfv3,삐 Oos)sϿsMn2ʮ6nXLxC얏Z};U3k晣-};G:9[Ųu49WNI;sʄ^6ݣDM(MJcQ۽L  P{I n>zqf/̚/`> [rߞC۽uC#}z)%{|lA΂}@uh[}MmY*-]ޖ`ᦎF96Y/mٷ/PwSQ%ǧnl_#=RK O| u(`_8MK{򊠫I%ƚzBzj@S}фrleKV-]~)ǃ 6مj;nr"{⠷|h(]d">6Mt3Ue{4wv! :)6UWݹv"PRs$갵(mxq2&=E5IlZC=UEAEzlK)FE_)$H =ۿrՕpij}fO G{*y(5]޶f,hL؏nӧoEYob{ؐk+?6?u`݉YFQOm6[ ]ZA]V!BvaVɚo2琨%XƂ'a"Y`胫6(( ?95RF"oi 蘵#>>J:fQyI^Tu پ ; ,[!t~NZ=$#bU𮺑+I1(2nh{ނ2jHbw4!3>lEg.ڛ[c!Ac4O"kFi& Іx (@!b(Fԗ ,dK4xK2аG+AWYS> += Xt*Y>9`KClpװtw6̚ Kӱ t5-ø$#!)j"ON('BFz# H H(p|d')q0FBF~8%ӒemX/݀LcL+fwc;I9AP;ra݅cT J2cRh }Pc#bk^!\>vc,tIX4:4|%uaа z#P9 1HQMx«ƻ瓮)Cm  (hbx@q'h*Bpo8|PHhM?yF|XѻL_-C =WU2XY.Qa\=i6Gs8 3,įrڑ%lDCC wa/`*؅h3 `*"M-<1Iٕ%|z1}b[rlL*JpF"66̙h-1(ڪ &aD;Y.ܕGZ! ͩ3AdY]yOv\9w45 -pDsE jڟ* cǜܑQOHbpcdb#F"@x-OޑeD0`KX/ P; x?Ia(UR@uY͹X#Lj:Q^4KM""#B@ΈgN.N] .Ux;]awÏ´{]n"q<ž%G*y]}ox (ݪQPP8cT-!!z?R-n?K7od#pZ~Ќ]HZ6)Tje****Bt#nNUNE@E@E@E@E@E#sZ@@egE s9j*****g 2TTTTT9* ?琫 T~6PTPPPPP8)رL'i***7,nr #\(TTT8+tg݇ wyq"9:L/c3\zL@)tޜhT]M;k|:8}b/rBv$Tg_<،cq MD3\t:9:H9$;w~:q%Ni8'\8ᩏE?!SE@EHq#LIɜ׉.çQj%fOU xqfק~a2 / S'1hF9'sM$.%]/qX -tNR{0ijQɆ3F6|[ԳҞHu׳ioD '?%lAESn1\#]-YYͬ ;2e&mjgQX}-#!'GX^,w赴mӯ"k5 ` IUK:2G{A 8hzv~IK}8P_9lz[OFOX|?<-EA8|;k5|$Jg`ǧDΞC :ˇ  Mv#<(h?%Eds^?cNULʵddN/|ޤ~ڊL @Ҥ҃[=[edQμ$amOj5ߗǝQsnVrԆlt\Y,Pu#{i;djBžu.?d-& :ߺ}bsΏYa38ߵ.jbP*i®`M87Ƀ,hQzj}P~}exᚦ:15Gfa->9BUQ5z͉c&Jڄ2{???̻fZxsju?h EU_>_HޅyL7BvVWkĘ ^7rz9%{_tL}(OƴAьҴrוqO-_pRI)҇*>ØgoQ'KrH L*ע"e' j~u`KKd7/Qvo5'^Ix֦}ON/Q<$5._vU-l}Gc/%;kAw?2Bi M Ȳ`d'PKkAmCc 2lZKQ=y17n蔌f\f恷4nr.۬6\PZz ;8r4 EtUY[epp7#oafYL1_-1]Y1-A[?/fqTe{&YphOחV#Nir(ij=G1kcfd!#)h{*I??d(diV̩^˰RNYC2OvKn()i~JH{ÂG7ӮZ5W ZOr[Fy-zcO'= :KWisN8ɳ2󈭥7ikw=qke oKnBnOq /w;vFm2@88D /qƫy^5ThԪԼ{#,|!,HE } 1{#w5n,ku!81cΪ'3ޛncPkޭ *FS>\aLL~Qv/̭fC`bY{a!EJVfŊCL8O&7gЮ{t)QC$T:d[|V76Լ3*˪^ə>3i׮L,zZ%2G|H7--(ab6[6g 12sQf&x]N?jIWV4YP{/6jJR+RgͥMrRꥢ@b)YɊ21jXL)i M_߿]Je(4h5H ^|_գ~ G ʣ?1V}ꪃɜy Q04Ġ(qNQ,H0G0wB͂?2 z04gEYh+,8寷o\qp1woHs獊vatZ4'B>)`C]swՈ`o]_FPrNgtfbi[7^Oz,wCߴo/ad}O`9f#,|N9OwBfmV}| ֣~C'ss$ox3u5OW}]ѳ_޿"wo)pɿy ?|cјiR.Q""FXD: 9_ &;ezCiS )=+w{-5 HdiEo]0#,kބ֤*E *i]7ZS^Zo{(Ѫv t]`-c0{9cs~LchtaB{<8h#QJoҏ6cAVSrPܿJh9N)~9o;Mێ:Ê|L3 FQ/`"}zzj: n[~6{tA˰6v.,D֤|:#`GR˒^S`NC M(aiYpnB i~67 TawJ^YGM_0>yl駭jp,οw˜JgC`aNоÕF"A7=TƝ '{e1 '2o`Ë)Ut&-$y |hxo]Tz4*#zb8Ȼe[nHL-}Ly #!㶛nWqI/|t}{n`E aoh]8 (Α^@qPN݁1Ē]jO J""SE '3œHt\ qW1|}. "pYSwfTV{5p'tQc l^iwcW\pԧg "> -gX,odLHd"iz0: )ZZCc5TkO ;d1*{| c.I R㮊ōW{QL W1#,˧0/70it;dc^S>Fz%xzaIKc ,:)Mh!GXձhŲTGF̿b 4k:MmJLi_Ƙ~Ţ|^/$7ako Ofcu kf1Pc92۴CZ)Moq}LvS^ >)0T b/׼Ӵ_nM!1$pgHpPe+h8>+GLM`hZp Bta:hº3fpF'Re ܒ`fMM?gms  WOvQY-1ƬaE@+`@{M9Тc5'dؽubObbaQx橜ɟ4Hp|1auz|!ħ0_}鈧 FT ?Gjh݀d 0HoF \{))Ko߽B3 U7jEBt"2>qAI&_NO8!+T+Wݝ`!n╆m8H`8u;7_t=rPJ7 4 1IXq䍉u`75[ Kl3^Dқm^Ʌ}U/qSĉ:Wd>n.)4:_/Uw$9i]aY[o7IM쳰Ka ؍[?=d{=ӆ!s71;Zb[IDAToWo]iP6fLKWi K:EukdX]+Խ]34,ϛ|l]cw7naeQ޵!kعq XFvajal@F"E!kfzºRs H! ͵Of$OaUز'?ѠZ a:=tм^h~/Zz^Vww\0\"r[5 `0kIKMٿQ8FK)Q+w}XQF Ocm4mvf4's``!ąhFMX M1({:?ˤ̙đM`0 hy5']j z$d(!2v69LPt6*'D=E&J5¾nxA?3醗./%=jQnyBnTaI&ĢS#D4!~-Aἄ ( *.z{@N? ֽP|KD!aVCL5'»"V"n(BWZ)Ǐ1,+G/qwuWfc  EdV^35D:kwHh)D%#? xHa15rwS8xlZ&1I IP۝AQP#ЃhZiTĹGC1B?d},]g_`" ΩSW)@Oxt#:8(_+Wƭq85<]OO `N0%_: 4_dVzGLj?>c߃ǏW0f巧[SilF_Qtp: C8N/ǩAO pz7u(Uֱ?qZ_>32f+8"Vi ~P?5e>v{5`ׁ0քcUZtq-Ї?:J5JJKJUc8QdT-80(F UX]Wu渶V#]Ȩah@o,pZG& Gm.9~í0'1 }R@` 3[`ԃ@8dn2RPyp \ nù|`,"BD(ƒ!h!qD<o$@b$d ǑSH5rA"=352|EP %**Zj:@tB =^C~t`c81LŒ0; hX2`eX-vlqN'9ۆKUpOpqӸx /_t|>;o EЄϦ!pPB#4z"C#Tb 1xxD%% 1H*$S')J* %5zIE:f: tvt~t tYtt7-ҳK;Ӈ/K(6C0C C! ɬdYًK>L>Cn&?#P(}'%rRMi S~01*0Z01b,bIɀi S"Se.)f:fIf#f*s2s A6e;p,gYLY%YMXXXY[YG0616#6_=llw޲إ-C3ϳwOsrqrl(1‰qJrZpqfq^\2:U5ǭϝ]Ͻ#cʓs%/Wׁ7])>v>>_ K|C(,#rA3(cS!yBlB򄚄 s  OĊYuM})F/% '"6-.$n#$^#>$A'%$qTĜ>RRRR5R/)zۤˤd2Z22%2ݲlll*!,W"׳N{]ĺudy8 >)+z*f+WT\UR9UWY_">U.z/jrjj'ԞۨSoQ_ԠijLjkzkkjkkz6ޥݠ=^c}K?ՙ CņQ]Q])ݑ78'G+{/_?n cbp!zFƘqq qaSQ@i3ufxs+lA  _jiKM˝mVd+'Voei7mPK\퀝]K{)mE;9mu:4lE%֥ŕ˵u-m]}#^`zOg&Mz{{ lڼ}-[¶ʴ7ՎZF)5=O/o_?<@7 '`"P707p2H/ h*(xҐP3+anaupm#{ңFߖmfEF7GǰÏXؽ6we{ل ㉦wvhIIڝzSHOr.]iަTqRjN=n{n 5[ΘNKܧt?nўYt`!CV:qp$@^vUKNbhM<Ἄ[?{tк#ǖ/2,+/>Po|VTg]p!.Y]juĕlW3!M_>RQsFMWo): PtvV#}cZJSbLsTԝ;-[[9u޵>hxv4]PXNk]]7{64yb^Eߣ~^#ON< {e(nhy / ^ɼu7G}G?E-M{GyW0.4^=20i:~>,NdXIӕ;ݧ~}YzϷ3վ φ.eQ55ma|1~T,|+++QTu[G4 gx )\k:"  ۃs$n:!z][r( )yVrQNY&^&>7 oBD;J|$ dTe䎮kSVrPNQQWG557keh_[zEWk/H&G͇-+qk3,+O~8q:عrxzӴŭ#k5?!D8  k ?'2(~M89f 1*>w{rBX$ݝS v[Oٻ7=o_3:2:4~c#3ٳ933y 뎙-U\XR{ɾSCe#+3UՆgj坿TS"%NWV}f7ojzN~KFkR[]{?y~Qkǝ u]=F'OUObeC#:#^qF\[iq|lbSS3>~f|u~ݗ\_}1C hl!L]ħ܉$y:)z)Qe=/s2K)k#$3{?a~UMB)§DDH0H IK[x&宻(ߡ0SQ٠QyC7t6*d^06hJ20W0t򵎰nl~C~ .in AΞƛL7{nߚ}{q@ `rTHwͰ𢈬(6/~PbLx& J;xvr$3"My=->@؝yCÇ?e˞;1ǘkEWt-<ԫg=N7V6ixVf/^W Rkz{oceSCs㝳-GZwMuAv8=uu] uxbg034پ^}95|վoHoލN<7Q>}២>GMG}}=~&xli=?.t/_!VS#`Y89\>H$&)ӷ3)*LLXYrwrr:rrp,N7  fIP%M~HwȔF˙G'(T>R歮Ar~Do.Awx5, cCI#fc`dtyU Ѧv={F\ g˰y$wKWU"~-)[I=bP ~d!3SBCAhsp\ȽQQ?<;:.{la܆o'x'r&Iڳ=Y:yvWkJT=i{A}8I=vxh#f99r7N%t @u$oE=gmY-@B} H0B@Lxy;83s:Š 0?F|.2"j`׋.`b Ua8n=.W{g[ )"hIjipWm}N! Yc`BɜdAgIbQshp|LqQsp~ңs܋a׭IN~N{BBGFn35ĨoaG])yi{gXqaWُs_ .>dBɊ3')Վ\( wIeJ?yq7'?~>|W՞[X_[\3jEsm@jHZ^ A``DK$V` CPkG[?f%au92qw^ D#!<$2=_I\;:\)zS8K W`&L#Q)'33y0u227ldib5bmgsb{ 3,NYG\۸98MU d Z 1 ,rX4XP[m#R҆2ruxy"2Iy^eBuP]v_u7(:l ֋ѧkjoH:乞tkr⩾)1]>b~W:ǂC8CUÜ"G6GqEŞΜ`N䝻FwaNkOO8/wpa\|:ttJKeNUU]Sqe ]f*_O񨁩ѸR6y ?x~dosaiKί? ~Xm:XAhH!ҌG9Qc4D0KÚeXI- A a7%q#D"EJQX g0fE&ߡS12053{1ϲag}Na0x%}LJאOQ`Pp8A|^go˲rRKꕟ|SUHl&ҹKߪƜ&f,=m#]U\<];=l e7B/ BZn "cc[cv|JHI=%3S}/G)RX}|K1}əR͓ʛOWWW85qQ+;-)yvjFdKq=[uuve۟5hte bGߤaoSщ=qvM}d9aˡߌ}?;c;|6hvv.nn׏yBBb%e??ϭ +.+gW?:@+ᆐ aqxe$WVVVa_*OTjw@&- pHYs  $iTXtXML:com.adobe.xmp 1 5 72 1 72 662 1 107 2014-01-05T12:01:75 Pixelmator 3.0 &@IDATx]`E~7B TC% I&"JUP+J {^HﯗB Rݹ};3b HVfIgmMfL.l2Rkg"$H)*yS|5t OU i:!^'0bی"&Uٟle>~OqWxO1|^ss`p {7fd {S0=}rޏ2#fԩWS CC*RB"4|euX0LmF ց<%P ʬ8Dqu^/;ob+ DbآwGn4Md2) ΅Y+ߜ2aX6@LZ_FSm\`0 4[lRL|0AJ,TJ h2T/V,->RB['_I 7ږZ? ]B.ܨމ*%0SZe1J3i #q\>>8h2!l2`8ɚ!AlMX`1˘CM3 UAM)4b1kVB*͍I0Ióe*Eb9xf*\ :b6R(uDV02B*jlJjlB!7)/W(| >΁rAMdHL)ټz{qv-v]i$jߐ~.YN}RD*ݿ~fޒz>FdԻywHK{#$F.]w.hb9  ^uADʎWjzЦ5ۏ ].>%vтWFl7$޾e%jl׶i ?WcOޘhD0pf2 `` 2 lʥX_`Fx87m*%lId a?<!?Q|w"2X<^rHtfZVZВe^+T¦},w?m^=Ң]F5jճʛsyaDIF׬^Y(Fj. 7NT;`ʹ|A.^SiⵄI/4lT"[lb`MJRvrDT@D? +X ^2:yο07z˱`katmz6y@A+F!c#f#qU.T ,]ߧ}7ESI_@NؠIB1fH4ܪ+:m_Jtً<ВRnˆ+ھ|eRy7ϛ˂au/H8mWVw{6ڶ?yn+*QΏ 'ɘLƒV0H} 3fPF+-2=vƀ=ɝ X]D  '/W7LX@u A[) %V*C F=b9$+%R'9S`x99_}U̮J8Qvzi%i5G$:q%Ƶ&0r W/ěW^D ]'ޗ}Kw;@F6nGJ4*-}T}C*H|S%$A\̧fڰ匼ySr÷_Q{5q4Xm`(Vh~͐"0$oXX0ʹ訌)9Ŷ/hdHs?(M؛+UوRt`r7c~]d`v rIbr!\S;!f!\A U} 4o΁WpBtnOBKIzF=41'sਏ]1]/j5u=kujg,oUb,5KO0qwk'uk`d6-sǖ0щTox)ԶW٪cwy`ð}wJ9;gc(wd4{ h-H {`m-iFg%aT*L><hR`COXAPdxxIud s⫇^ ARaא6ߨvm#hd մylU4ġnCh5+ʿ?5A3ep?:]ؽ#QaMնy5[w:ẅ́]Mm&01ރ'#:_IV`vi^j6a UJ,r&l&<5iktb^-&#b3hbef^50 ^( San]M?w])Vn\&,RUٲ8_ۻщ7٫OZݼyʵB)2^zSk5/?2x׷[UNwuݦ\He6w Znٸ͘uݳo4 p\ʳT ܥkz^!YRԪߤqD"lכ鿈|xLe&f-cTD^7͐I̶6E눺YP ; DCƀva-/!o,P/ L ܨ.erUcl'Ջxj/fA999  ޶Љ4١$/vB=4dB̃P}3 Ȑ DrրE}b܋JC&  (\ԬKuTĒx-` pm&c{l6ܔILT2ijΰ|*@8 \犡"t :`5lH9@I LSLP\"&jo) B6a(W8T&E:y~΁'q aRqD-Uȑs7nD$n^".M '_7 \ꪒ$'g ^I>e h bE s~vcҡ ¤sLTIJt,*1AƄ}qAʤg#F<\&#+Gxz(*Yw MF$*\P"r~5Qŀ& 4yL%Bjà3 f_=zml޾OF}Ѹu7Z8=]kVx0o}[P2JZOa3D7lt2M[۾7Y(%F@Z~yZ" R,A3Ōɒ~KPuEߔdY;En1>e3/b,F3@Z A6L uHu ÖN@b"wJ{#sss qp|ͥ#Fnlk;`lIUNxC]*TZLIJM>NX\7j_<^t<--RfN|*()Hљ._8]z57<&ӗ`wli4~fqJOK'>p[BwHdfFNJl!@:زĩjë#N H*6x"V%8e/1ȟPEeN5c.(%gyzSn#~8qtf#zG_=ԽWKc1*Us*~38_.| 1aHnfis淬]:61C1iݏ_ hԸ)l_[8\| ?.m{T>@u A\ysnz888^4>=J{{c[6_9|%ְg`<6 mӱmjgE_xaU%m{S#"jo1µ FqT4>'|?]g'5 &̢mX · z|bNҦ&z5$s+g^N! E0R0m'b'{택86>Pm&?<N9 q'vEd2p_lIc=#V3O,Urq J¦29<xi l6,Q8G5 9M< `@Aj0y&ч_9`Ęm,\kRj"֦u%j/[&0檼}~='z3$8`xϠ*W)\L#O9yL lNN3 utN^i֗D Ʀ- &2.Aր`+a,wEt͙`Є}'jTL22$3W}5&Q?jH݁.w# h*TxCVa q@AH:D6 śC_x CmZ1ftp7UhVI~f2 Oxe΁u%ZEqb\LqWH/VV0-Mo]qg+7cpiS'4S I afQ{6ϴ!t]OkT~骑>EYߢ_f/ݏjꙖJJ$u!=!WCC q .@& B&O>x>AV!"[ Y=%AoU0i=X$_Ulj>|m$ A|r~E*! 4 .~㱳K e9ǜ9{M.Tv"jgᆅE%+@G (ga"C *KlB5A[Z$ 3g'N|^DiM~ǜPMB,*;3DN'sBnP##Q J잢!>Y>tznQ[* 0eI>B"=-U7!h,O31C p-{ȥ6Å)2ٰ7Dr qUA!`(@;rABڰ/@^^f3yssp fX!͖prQ :I,VsL,3N<@vnRo:MXC 1-DC?k߬\|MPƈҮ~\{|I5QZ {kP ;&UU)11 'zDLЈ0W#,F#(!rpaEo|!gGt;fH/Rn%9lԈ2n6pHPÇZLԑ̈Q92$ eȌ:zj̚fT[;CdF]rJBBҫD f=TvjIe[u9ՙ'h_-~@;v98 *2ұ6Y o|<M|>ru`%B~|oٰvs5>tfSV.r%K[|+/~qf'wos)ҥKEAeg-W϶tt?fM+b+i{lٹ_Y8EP2~H\=⛟+w7?hRͷxo\zٲM>~i);5':yĩh.q gtf+d!̙&$ۍ_$ﭞW wa @ bGfI3L R;Y.PIUR8sbH0lI\f?mWފM?.I0xjlf#థQwSM`}rso޿qm# XydrͱYZCbZ!h;8CnB,2xX̘a)L f8|`P Ji&-PB(`͂qTBf fPd4$2^!'2r`e==*lG~Wx(D0xF&x,PNAeQqAސC/X4(_2r;a0AWiTi䳎u4gf48{)2q  BHer, 0;/9iجA5X)ߜɂqJ5 ׮DݴURTk]?l2\㦐K5~- q4Q1}ltA!T*19Bbà/,\JU9U;q)B*(,"OO7Ң$6uDserOϘQ錑̖%}I+<42BdZհeSTk)MnRK$ $b PpƼu ]( pI]_p&%0(dL2n6"B xxTȢ U9|"jH^f"xKbة_xA4z& B /G0l {@U pZ28Y3$~ZFq$0Q( 9vR"31X[P;=;^y( Ȅp( p1\ơ{5i/ Ԛ^56noh4jaWXPU+h^pc3~qѓIr%HF`HpѨRIqAo= THHLՉ4=)^JyIײs3JQ >[OŎaּv)^a͒c;ΦX+)4jX!Jc][vȑ.nJ_m?}|ܘ$sSqpjr\@35*Yl \*;v!R/×ٍCmP*2m3bʄN(C~%@dpߤu&:cFl(^Fu 0)@) ,B< ,i.I8lozǮhlFhα4A5o!ȗ 6zıCGa($ 5V.vGYgtw>8@W#)܈^xND#1'΁a1k$S͸+O^ԥipSʃ\}&Z:gVG4kVbluvڝJIHhn]Oz{j3gΧRϫӜjs)4R1h5ϝ۳{,?ع>.ܴy4s˄xlY?zxshhwݪ[=_lfM"|ްbeDN;}F{Rxʌ;w,R͛U._<֙myPr )so/J7`9dS%;z$.Y>urLJ~4x^Ƞ!R~3*GPOv[@*R4@C7P 8 ̲uKA@9d:z=42R!]= *SU N/]7 Ǜ6H,R٘FAĆHpxj_Ł$3&\dINIaD%%%)E+%S ؉~.^ONz~H7"x'(ߨsƟKgss;q4yl:#E"PYIjlԗjv=T-Lrb=mv$AJ Wԅ + %Ah5}OA 3G/ϼ΁8_9fV]E3UϗZ8:BPAjDw8yiՄ/|H́<Tl1OH,:>%BP;d~eQI)iFW=sOhjp 2"(p8{y}yEV/wmj6ᛀ:l撽x6l/vh63mȐx]ywbyt|P6>&"ZҠ8ECKMf2y)UJ b!5Ŋy{L^QY~M*)Zgsy[#ew#(ÛwmQ/ٴo>KVh6طvKv 6-ҧ[mg#]vwvjMM:ղ\"6dB.޹viNm+C${y<_'Uj)+ªTS-ܜ%f@bFuh^1Ӿ\p`ʵ{8`CTX"e֭[x:{x2aU7k;j䇡!,YZ UNJ˺BӜc(ةſ}f=Y˗joĴo>vA |aMëO Z#ӊ%Vѧwg.V:jXyVxl@ +Vanm$%+@HޱՐ3U*^o @0LtKQsx8`YSu{TMM:qX 1PZwيj|LQ$ƙÁj5t/(s152BLTԨWŜpDm|F)}#W}:R%x˳3J5JF>z IW8(v]4a~kEJUצ)ZG^ŋxmRR;ڊuj/wp 9HOٷS~kCvžuq?/=y[^~+4S?P\uۉc]uqwE3'ZŞ5 O|.j%B`X^GM˕SV9m޺׷;A(G?(7kݦQy?[@6& VƍRnKv]\VϚb]7 u +aO\hmRS?Y  swbLI7L㳷\]ayxIQ}p EGxwđS݄49_W3xloQ)|;RKU(/0"殯Q%J*.LظA^ծU+=EeM-AL5ICx U"\ƻ*&ľyP_+w(*ՈD9ۺ^F_^D%2Sq͜owJr9HQ,kMI>tyٔ =qlŀT$r (뎽?={Vn޾'sU۰%٭ ܧeC '_FkmyNN8 H;,\Z,`PFs}Z߹qSfLJUP$bCyPt(Q!mܼ=FQzњvmЦ _@IDATN^E0- d lzˁ][uiTKqg^&AvN$"B/ chޙ~`8s}s(Ub7O)?~sznj{i/SQ)Vk[^=V}pPх5[9:S+ώxr4vxM(ʴᰚ|KܻwNP۔o?*i!5sg8=nڪ7}/GQ_ʁg 8 6j2\ԱExDM4mS~kPN!]э{rWv3F XLL~jywc'MnXF}:O';^ͺWfb>H$ׇ iQe+[J{8X69*)֌_G9Kcre;7K+Uz̕nRՊ^k᪒wao)fy(k;GO}کbLRPea%$W|j󕔠|hy+6&&im=~`Mb/jR?Іs6,Y.$-61~4}̧A<䦇Q֤ǻ5 oݾ׊; MuרUwf q w{}إS[T:h@6nfŀ!mލWn>g>׋ZvӣGJ<'TnѮ 2y۶qSuŔӼwj@NKqn I|?jhMZ|l\y!]sʂjQ(mֺ}/YаMܾtF$BGǦYգGUKFڢƭ+n܏esTa)׎>HB2\Q;9`TF(Ij<֪> jd Ú^ظQZ׽J{qK Zq/ROAeJ6ZgN Oܖ&lQو{7lMtږ]hY-tF|)6iѾCJLXX5"Fk6(}ЮC'Μ8wGd)Wﳑhur&oO=Hj>y沁"F2՛nv82Gs"/w=4u]=s`ν{ݥ5-Z~ ۥk!1l پVlLB\|*6\:`1I: $ᝋ[u~]x9ٷo~YzjKz>v߷nHKr-֬YDܹs%kFh?]Q-qiY#"< 뷝zGzuڵ^)/j_􎼊#06_^_%FgRΜI@>[6ω|ـ(Fb UE]:^wΝޯwOښ|09[u&.*t-{Q,Mxx;*Fޡg8vĸF3a5vWܶ+r"W>=Z^ĖEc&/U|Td&#lGlGCtҢQ[Ӽt~iFO/Ը7Gůx0eH2f%J&FB\Ʃx[ ._'A% ::&b5ޝQS!cX qthl20Xk4zՒ0&w<\oͻO{/TXsN%]S1qbb|ؠ.0o Nh!a0B *xΝ8(Hb1'CFc)'O2r D fA//L~{j%>< `S"V tqq^H0L7f:6qa||㻏s5C!ZHPowͫ-p`].?5[l˖wS]-L3<JKxpxBglڔnqY]T䵿}dӉl<>D^Z9,.LSx)^:ْ4J? *E![; _R{-o+:l(:s,`:[i&^4y4\F]=-Dha#t)=<9i"fıX8efqjbDpGH/kiEܬw x2ʝ?Q!<opI4Z=za'75%3dy N|`Na;C * 'ft 6K w32<;CF N+٬-R3o 0:,z)9@8\դT7SJ?E LO8@["% t?r?h9 dGr  ^7-dޱBM8EsGlƺ X*dRD͡ZFX;p8*ЗHohAG2b z)O9vbwϑ@z+e8kui9o=QWlѧ88R"x 4C-dV'C'٬Ti}ù/%ٌ(u,d= vtЂԱqąXhL b@s+ D kXZH֑&_p P-WR cv]"bbFkI€=AC 8N ;C ăN E-O$ <^Z+9$\Rw4:g KC IpLAG6'@spzB4D`gr\@#(Jp e"4c B ђ˱X/@="MH}/t!'<: ̣X~Y{F݉ b fa(FSQ1T-X1XfR9YK8ƏjݳD8E)t:lo9]@ yaȱ)dR9΁|ɁW&KnAA攐f[& lAn@.mcL֗z< PbG&0RB)7pQʖlPCi 8H"M@K)$"+ ;zP`/\?":$^:QL$aD0^}B1{Q[NH=o∽2e:~"ftք% 6 &fb-fmǯ8888G"CtXDKIDQ ѐæ1$BO'NHbX!v c p& l`IFUJmQcK+Fv}ީ#gP ?+ n@ZPyӅ`'v6ta;RAGdUH:tıE r{JӇ_N["4 ɧ 06t,%-P@`w+<0 -Zu1a988ŸW$ | <YAg2dL΁] pTF/ܧuRjB9ʐX5y.2;='t楜σ:Ax`vy脜#C}Bp80׾ /TP$xWwkB4`88cpK/Ibew8/u988^%8?&VFF H)k23fmpM l("oEQ>S !#k$Tb/sdX_Ыr@>_Á3#SZ,TC͆Qy #D<5<nj$XxSXVE`50N}"zv6c6r''J4A1rBHNsYJ9r-Yc~jt#!$lgn 8/{5LB+5E<1z4m.&QlPT?!9B'9F!cNA¸pV:c, ǽ,9Ly:ߜRJņcjoo/WW$WWWHqF akk୶F'g < Vm@-%1Zۤ.ڰvXEnEպ x*su6s [%!6Zoف.K9/ .jJOHӛQVE5KŃ kSF Y]lY@K)k7o+eD'xU禊cb2~!"ґ$P24.0a֖s6ЬPz,7+Y@w}Ĕ. D+璬yWl6S>ӗ1A/|y}΁ρ )ܨ5c]۶m۾}={oa2(}'̘?_[ވ R#@P.,&GKth7P5$P k{-7(DBA:I3 ^7o]V+\ (G5֢èM[Ys^ q "歛׮_l7A׮ٴy}F2x-[6۸q/_{Köغ|[6OĤ/l庵Zi'h:d Y,W)u4Bbq Q?QQCOp|aI$)a@<P4CVADLh7F` X ʏ\eyssssq C !՚:|k>ziū*!5}7@S݀#*;Ӱ,JQ'޷$6_5>^ kܶAek\\ HL)ZNELצ~k@V$IZ98$vPK\9xh$\^^.*>] B6!s93Z坡U+\ z)V2m+&{S~ߴl䰏}ʼѯSM+V2c1yɖ{C?|?m=pX!}گ_:``ג|ΑǯBpWiYcO]D'mzOȥ's C  Y {[tٲKVn<5zg]GY%,Vwn۴uǮG=@V1jޭݥBf[`-_o[m4e뎇1]vd?vjĮq Q[i{Z-'N!N(%>6wahU3^80,Zxu˯;#7<\K6(_͌Qg?hk5.桑?C+w)TnEʖ>a;~cξI 6osОݻO;2fpGHWL΁|'dž>zcG 7&IÎ) B1e'^NMPma,, 6ڝ*~on)cG= Ӕ׿& ۙ?&_޹g?-1N t7c_=i:_Ojי9Q/[24TRbhM![q%|<Xxz Q*r?tYMN~x;l;_tUYҖϾf-Aػm~.*Z(ޱY6u8vKO\bX|%"Wo'kǶF|rf4N2~99999XdpQd֭^𗙿N13J* wE/ܻ`KltƦ 6<4!$jߩKl튵z#L&mmٰu[jOﲡ~GmU5jTkW[~ٳ.Mnmnó{O_aS׼[ms1L%p,!#>- &1Hf!6m]G?.Wq`դS">ՈS*oj }وC+ow6dJ7 ҨbM妑ߴB^ ,\eD;mWbЦ7YJ@*)ed6{7^#7X%fsך*?6+VGFGt엵 ޺ibF?Fekՠg7%ƌpt:~'k'S6:!"΁&fd,R T!@2?-BOP`- [6D/6̚8IDѠB8*P?&,K{ '}՛_8~7&PJ*;$ ꎎ3(hDBJKnI*\8yK$۰x7[7HwZ>#?߰q'}:tzD|x{_ǩxqU\?|&:&.=W{Lws |=[+qr2(4¼X͆3ж;tVpQ=uv^ ŤKXPSĘKFH$ zbAQ8"1)¬GssfHJO5<>=1"Iv.I/9x^HhARP`#WVUĄ\x9:.IRRbttlcGzUuilģgI 2wo1lU{OߢёZ^TͻʐUݹ})hvmZvp6_hzu;JNCASi7<5d7K;VT+WgWj*n5 sr),.޻uq> o~Cb  PbeHȥFaj Tdr-l|5 fbIH[2BӍD+4dOK5r8lpbHi0!*R7PヌT՛s VWLZŒT&lh0Xs )°WdY +Ȑ,*51=BiL]=+@ kAo`qTȓJ\tȭZb88a* `-3 Xyw$ëPk8!!kц*^*8q$xPlMӺuC_\ 6tom6 4| 7v9 ks-d<:C p'H=3-d{ VD'6?򩡎ͫۆJ b eNp/[LP2CAQ 6Tv1k5pZ h5T~RnVNVd$.LpT׶?AoblUA%7-b4{X ?U!BE;0z4kYb rk[6bn |W c/;Uc2$/D ' dvat(8k}ӷXka%gz]`ޝc5NmuC{~G%?S#O Sʂ?G [w `{GW),?:y̘6I]U\aRS8+;/Wpgczԛ :=n#g85%Et:C=iVc4rkJ{^*hԙ;ZG<-w>9@o_%L.w:K\z& Qi菍~G]:/3hTD25~NP̢9 *yPfZ#4|DX6Uyѷ/b –/v6kdO}t{͞ZVͦ ^on]hItZhnDn[5kʼ6mAME\rw'W(ShDo0Tbd<'Ze+@RYTTH.Nkƚg "_6lhƆ,p(tˀc;֜y/tNh^^6g ߹}>ŰRVX/u/q}]cĠ4n§+NE<펓.{~j~fT1NWe8EꢭKgX3gu}F~8oD1N8pF"äںa啻v_ʿ}S ٩PM|4 YkS J| 떪+s[y6uݿ|Iv;NKrag;⋹&"Q@a&v/= 0<v][yF|/rY!#?9|5J\a焩ܦ@}:6odZ1)Q2d{ P :S^>Z$uiˤMc>wɊ/Duh\{hLE>R2-.F9k!! =g}@V>myBt>+WO8 >XҼC2\.a ~jEUҘ^,yOTeN]y|.q |{)zSG483IVSw2 [i&amXڣ_?^J5^]ڞ!-{{ # .2P{~_t9\JWcN`\yS9?/Wn NTкwdi'Nڼ[FPܵߠf*3'H;$G\_!xnFMe3LRl+n+8(ev^RyUJ;OF-Z_xm:3KIFGeQD{ӞϲR{.9}{ yLD'^GS%Mݗ/CsKyz?:15i0`@C8lQn]Ck_NO)Rl*Wzj~0o{W:mҩ r3o]..)E=3|H[NCq2kP+rRB_*+^:0,rŽӉYRZP37Vr2YgOXЩ 2oĴ !!gspy|<2Vw$EE]7rKxߌ˷;X60]<wV3$5Z TH}q54JO\տտ7o8D FO*,5%'[K3!ݟ\U dh:$Nlŵݹ.ralvc`&4&(-i`)0S"RN7XkWjrtY^*4R p05G Yq7NtKϑ"d\G /n)șB/]p h'IX3OY=Qˆ2pCΩi:A[`,%wb*&t|{Y_f1E-_&oe鉉{isRT {yҞ~d 1^qmZMba&f^^;X աJˉeճi¡q(S^^L8b;l0sd\2 Ҭ"9 ] esC4.\iM5z8<2ЦLo%5H\ {׮}?EEE~ŬEZ֑N~<$ѡsؾ śI#]yekvݛ<ʠtD "}žm(l+Z0x`¥ ٿA5>B.f|&Αɕ0,uW,΅ǫ- yiq0n3Ғ*PM|A @2!ȵ_n||!BVN v5pd1%~sAKs+($ۺ ?Qؠ@EǢ! y |un[ )349A-$\ u$*AWc"nCte03<^Cm( Tjn+tvב-dPJd 0W7kSA*Su;9pgG^%-0f |!J֯'RX5L(_LHYTP%#T,$!H8ӄ5{|~T1:$aҪ-uLZ9x uo$ zq^f}nec4[ l,Yyn;@6!_,>T0 Zf$[wR' ;m憹![ia$zgd7GTEֹL29\#@Q)(4t7k"zvӻwE0ZC;C*v$9 x-|ŒRNޛvڻeiS1$נc5B Y~uвw |jTjڱ#̞2B'ӵGO 0=cԤ(zÆ _},HPB%HYWA TTE4jkAB jU3(-p)TmX(Si$4ܞi%cSKQC H½'<'}LyXե&bP[]E f9;Ëx2JήF$}u3+,|қa#U D]4jɧi a@S1DOCu> H<Ӏ'>?(H.lc/Ȏ tj]QUG,<Ř||[;^zj[ 6 }1P6"׀Kgx$J;{'-$x8}˶S3~otЌ9}'Nǻ}uyAAirմ˚_v8(6dߏJlUV]ZYќ!q3~"ݛ3e hl5ӧ߾]GC.yTKa2yc4yfc;>KGVLJȕ\; %M}ߍG)+,.+I=zbSi4TN 8;+_nlcc9y][6 h܌زek\xp;oٰ6q,>1e2gts֎ʍ-:QUyJ}91E:.dZ<9 CJ'*22z mk5d'xcA^k3-c@M29dl>j9QLnkI #m`RhRO{JE0 І~ab2G[FE籚{G J5-\Fsy2bdth̘g:"/$nD9WRN Mkۭ_`{p͇1禾]{ɬݰbeptCb-"QeQVXL_׮=֬XRH1}M7<+ξ5eBLӾq59OFJeaZhd Zyz*)-?0aQa!YC=:ꙕ(S]tիGYy ⳽ӷgwS~  E :=P STQ\"CY<+MӹtcJүJL87[Y \UTllށ]yTzl[VsSάa4 t(l'_w>&Dk vqDW?YTBFu*!BYgqw+e$?#N3H|W/T#M1ܑPÖA5b{ |z9jݙչp8 SSZ 9 UT(;tjĹ۽7S s܋4Hܖ-tj"b^tL'p2ӊҋ\ViڸPԊg%4&K3ffr9r;B+nҩ>ub(cj1fa9Qg8w`۴տ1sheQP4LӢU*@U7)JHЬ?((TQsxGjTJ˕Jc؎/{:jFS -*z\ɹRV',9eС, vLxh*Im/di4 6W@BPhҧsx".GB-6&zK)l6HW5&Z`) r|[0FH(}\W<ŨRkQEPP(`% @FJРx$_5m0\/VAv6Rj+EWk+B뛸BRjVTAAPBeB|!MPֲ!N**@Ŝ=[K' (\I#1TBYiHg=Ys]kOM؄WavעE \Y|q 0P >4r^Z\L8J9M9 07kLt6˧F`Q7}Ӿ&gUUV q~0HR~[E?D>wK`A\ w:9 ^jgX37ȝ;v=u?'ˀT(sh ~@Jg|v^ Ɔ^? Y[ԻDn8|kH;{"xw4ZC ,GQu4|ɭ;Xߛc`~dE4C XSIDAT/>.K/z@p'/~޼"|k5K/-J+;#% ED1SKz6^V-{W?Nެ+& u 7s/3u'ivwT veEFmaa/#Ig7#T+!Z=opڿ_wS<-fD ?pȈ(;P/@y=d? Ix²w[wC!ot740߀ˋm{Xo@K IENDB`minitest-reporters-1.0.19/minitest-reporters.gemspec0000644000076400007640000000212012556740435021747 0ustar pravipravi# -*- encoding: utf-8 -*- $:.push File.expand_path('../lib', __FILE__) require 'minitest/reporters/version' Gem::Specification.new do |s| s.name = 'minitest-reporters' s.version = Minitest::Reporters::VERSION s.platform = Gem::Platform::RUBY s.authors = ['Alexander Kern'] s.email = ['alex@kernul.com'] s.homepage = 'https://github.com/CapnKernul/minitest-reporters' s.summary = %q{Create customizable Minitest output formats} s.description = %q{Death to haphazard monkey-patching! Extend Minitest through simple hooks.} s.required_ruby_version = '>= 1.9.3' s.rubyforge_project = 'minitest-reporters' s.add_dependency 'minitest', '>= 5.0' s.add_dependency 'ansi' s.add_dependency 'ruby-progressbar' s.add_dependency 'builder' s.add_development_dependency 'maruku' s.add_development_dependency 'rake' s.files = `git ls-files`.split("\n") s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n") s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) } s.require_paths = ['lib'] end minitest-reporters-1.0.19/.travis.yml0000644000076400007640000000011612556740435016637 0ustar pravipraviscript: 'rake test' rvm: - 2.2 - 2.1 - 2.0.0 - 1.9.3 - jruby-19mode minitest-reporters-1.0.19/README.md0000644000076400007640000001020212556740435016002 0ustar pravipravi[gem]: https://rubygems.org/gems/minitest-reporters [travis]: https://travis-ci.org/kern/minitest-reporters # minitest-reporters - create customizable Minitest output formats [![Gem Version](https://badge.fury.io/rb/minitest-reporters.svg)][gem] [![Build Status](https://secure.travis-ci.org/kern/minitest-reporters.png)][travis] Death to haphazard monkey-patching! Extend Minitest through simple hooks. ## Installation ## gem install minitest-reporters ## Usage ## In your `test_helper.rb` file, add the following lines: ```ruby require "minitest/reporters" Minitest::Reporters.use! ``` This will swap out the Minitest runner to the custom one used by minitest-reporters and use the correct reporters for Textmate, Rubymine, and the console. If you would like to write your own reporter, just `include Minitest::Reporter` and override the methods you'd like. Take a look at the provided reporters for examples. Don't like the default progress bar reporter? ```ruby Minitest::Reporters.use! Minitest::Reporters::SpecReporter.new ``` Want to use multiple reporters? ```ruby Minitest::Reporters.use! [Minitest::Reporters::SpecReporter.new, Minitest::Reporters::JUnitReporter.new] ``` The following reporters are provided: ```ruby Minitest::Reporters::DefaultReporter # => Redgreen-capable version of standard Minitest reporter Minitest::Reporters::SpecReporter # => Turn-like output that reads like a spec Minitest::Reporters::ProgressReporter # => Fuubar-like output with a progress bar Minitest::Reporters::RubyMateReporter # => Simple reporter designed for RubyMate Minitest::Reporters::RubyMineReporter # => Reporter designed for RubyMine IDE and TeamCity CI server Minitest::Reporters::JUnitReporter # => JUnit test reporter designed for JetBrains TeamCity ``` Options can be passed to these reporters at construction-time, e.g. to force color output from `DefaultReporter`: ```ruby Minitest::Reporters.use! [Minitest::Reporters::DefaultReporter.new(:color => true)] ``` ## Screenshots ## **Default Reporter** ![Default Reporter](./assets/default-reporter.png?raw=true) **Spec Reporter** ![Spec Reporter](./assets/spec-reporter.png?raw=true) **Progress Reporter** ![Progress Reporter](./assets/progress-reporter.png?raw=true) ## Caveats ## If you are using minitest-reporters with ActiveSupport 3.x, make sure that you require ActiveSupport before invoking `Minitest::Reporters.use!`. Minitest-reporters fixes incompatibilities caused by monkey patches in ActiveSupport 3.x. ActiveSupport 4.x is unaffected. **Rails Backtrace Filtering and Custom Backtrace Filtering** Minitest lets you configures your own, custom backtrace filter via `Minitest.backtrace_filter=`. If you're using Rails, then by default `Minitest.backtrace_filter` is a filter designed specially for Rails. But minitest-reporters overwrites `Minitest.backtrace_filter` by default. That means it will overwrite your custom filter and Rails' default filter. (You'll know this is happening if you see overly long or otherwise unexpected backtraces.) To avoid that, you must manually tell minitest-reporters which filter to use. In Rails, do this in `test_helper.rb`: Minitest::Reporters.use!( Minitest::Reporters::DefaultReporter.new, ENV, Minitest.backtrace_filter ) The third parameter to `.use!`, in this case `Minitest.backtrace_filter`, should be a filter object. In the above example, you're telling minitest-reporters to use the filter that Rails has already set. ## Note on Patches/Pull Requests ## * Fork the project. * Make your feature addition or bug fix. * Add tests for it. This is important so I don't break it in a future version unintentionally. * Commit, but do not mess with the `Rakefile`. If you want to have your own version, that is fine but bump the version in a commit by itself in another branch so I can ignore it when I pull. * Send me a pull request. Bonus points for git flow feature branches. ## Resources ## * [GitHub Repository](https://github.com/CapnKernul/minitest-reporters) * [Documentation](http://rubydoc.info/github/CapnKernul/minitest-reporters) ## License ## Minitest-reporters is licensed under the MIT License. See `LICENSE` for details. minitest-reporters-1.0.19/.yardopts0000644000076400007640000000025412556740435016377 0ustar pravipravi--readme README.md --markup markdown --markup-provider maruku --default-return "" --title "Minitest-reporters Documentation" --hide-void-returnminitest-reporters-1.0.19/test/0000755000076400007640000000000012556740435015507 5ustar pravipraviminitest-reporters-1.0.19/test/fixtures/0000755000076400007640000000000012556740435017360 5ustar pravipraviminitest-reporters-1.0.19/test/fixtures/progress_detailed_skip_test.rb0000644000076400007640000000031312556740435025466 0ustar pravipravirequire 'bundler/setup' require 'minitest/autorun' require 'minitest/reporters' Minitest::Reporters.use! Minitest::Reporters::ProgressReporter.new(detailed_skip: false) require_relative 'sample_test' minitest-reporters-1.0.19/test/fixtures/progress_test.rb0000644000076400007640000000026512556740435022613 0ustar pravipravirequire 'bundler/setup' require 'minitest/autorun' require 'minitest/reporters' Minitest::Reporters.use! Minitest::Reporters::ProgressReporter.new require_relative 'sample_test' minitest-reporters-1.0.19/test/fixtures/sample_test.rb0000644000076400007640000000033412556740435022225 0ustar pravipraviClass.new(Minitest::Test) do def test_success assert true end def test_failure assert false end def test_skip skip('Skipping rope') end def test_error raise 'An unexpected error' end end minitest-reporters-1.0.19/test/fixtures/junit_filename_bug_example_test.rb0000644000076400007640000000066312556740435026312 0ustar pravipravi# This is a test for a bug that was happening when the JUnit Reporter was # creating filenames from `describe`s that contained slashes, which would crash # since it was trying to create directories then. require 'bundler/setup' require 'minitest/autorun' require 'minitest/reporters' Minitest::Reporters.use! Minitest::Reporters::JUnitReporter.new describe 'something/other' do it 'does something' do 1.must_equal 1 end end minitest-reporters-1.0.19/test/test_helper.rb0000644000076400007640000000122712556740435020354 0ustar pravipravirequire "bundler/setup" require "minitest/autorun" require "minitest/reporters" module MinitestReportersTest class TestCase < Minitest::Test end end # Testing the built-in reporters using automated unit testing would be extremely # brittle. Consequently, there are no unit tests for them. If you'd like to run # all the reporters sequentially on a fake test suite, run `rake gallery`. if ENV["REPORTER"] == "Pride" require "minitest/pride" elsif ENV["REPORTER"] reporter_klass = Minitest::Reporters.const_get(ENV["REPORTER"]) Minitest::Reporters.use!(reporter_klass.new) else Minitest::Reporters.use!(Minitest::Reporters::DefaultReporter.new) end minitest-reporters-1.0.19/test/integration/0000755000076400007640000000000012556740435020032 5ustar pravipraviminitest-reporters-1.0.19/test/integration/reporters/0000755000076400007640000000000012556740435022057 5ustar pravipraviminitest-reporters-1.0.19/test/integration/reporters/progress_reporter_test.rb0000644000076400007640000000211412556740435027227 0ustar pravipravirequire_relative "../../test_helper" module MinitestReportersTest class ProgressReporterTest < TestCase def test_all_failures_are_displayed fixtures_directory = File.expand_path('../../../fixtures', __FILE__) test_filename = File.join(fixtures_directory, 'progress_test.rb') output = `ruby #{test_filename} 2>&1` assert_match 'ERROR["test_error"', output, 'Errors should be displayed' assert_match 'FAIL["test_failure"', output, 'Failures should be displayed' assert_match 'SKIP["test_skip', output, 'Skipped tests should be displayed' end def test_skipped_tests_are_not_displayed fixtures_directory = File.expand_path('../../../fixtures', __FILE__) test_filename = File.join(fixtures_directory, 'progress_detailed_skip_test.rb') output = `ruby #{test_filename} 2>&1` assert_match 'ERROR["test_error"', output, 'Errors should be displayed' assert_match 'FAIL["test_failure"', output, 'Failures should be displayed' refute_match 'SKIP["test_skip', output, 'Skipped tests should not be displayed' end end end minitest-reporters-1.0.19/test/integration/reporters/junit_reporter_test.rb0000644000076400007640000000071212556740435026516 0ustar pravipravirequire_relative "../../test_helper" module MinitestReportersTest class JUnitReporterTest < TestCase def test_replaces_special_characters_for_filenames_and_doesnt_crash fixtures_directory = File.expand_path('../../../fixtures', __FILE__) test_filename = File.join(fixtures_directory, 'junit_filename_bug_example_test.rb') output = `ruby #{test_filename} 2>&1` refute_match 'No such file or directory', output end end end minitest-reporters-1.0.19/test/gallery/0000755000076400007640000000000012556740435017146 5ustar pravipraviminitest-reporters-1.0.19/test/gallery/good_test.rb0000644000076400007640000000032412556740435021461 0ustar pravipravirequire_relative "../test_helper" module MinitestReportersTest class GoodTest < TestCase def test_a assert_equal 1, 1 assert 1 end def test_b assert_equal 2, 2 end end end minitest-reporters-1.0.19/test/gallery/bad_test.rb0000644000076400007640000000061312556740435021260 0ustar pravipravirequire_relative "../test_helper" module MinitestReportersTest class BadTest < TestCase def test_a assert_equal 1, 2 end def test_b assert false # simple failure end def test_b assert_equal "ab\nc", "ab\nd" # some nice diff end def test_boom raise "A random exception" end def test_long_method_name skip end end end minitest-reporters-1.0.19/test/unit/0000755000076400007640000000000012556740435016466 5ustar pravipraviminitest-reporters-1.0.19/test/unit/minitest/0000755000076400007640000000000012556740435020322 5ustar pravipraviminitest-reporters-1.0.19/test/unit/minitest/spec_reporter_test.rb0000644000076400007640000000121112556740435024555 0ustar pravipravirequire_relative "../../test_helper" module MinitestReportersTest class SpecReporterTest < Minitest::Test def setup @reporter = Minitest::Reporters::SpecReporter.new @test = Minitest::Test.new("") @test.time = 0 end def test_removes_underscore_in_name_if_shoulda @test.name = "test_: Should foo" assert_output /test:/ do @reporter.io = $stdout @reporter.record(@test) end end def test_wont_modify_name_if_not_shoulda @test.name = "test_foo" assert_output /test_foo/ do @reporter.io = $stdout @reporter.record(@test) end end end end minitest-reporters-1.0.19/test/unit/minitest/reporters_test.rb0000644000076400007640000000256012556740435023736 0ustar pravipravirequire_relative "../../test_helper" require "minitest/mock" module MinitestReportersTest class ReportersTest < Minitest::Test def test_chooses_the_rubymine_reporter_when_necessary # Rubymine reporter complains when RubyMine libs are not available, so # stub its #puts method out. $stdout.stub :puts, nil do reporters = Minitest::Reporters.choose_reporters [], { "RM_INFO" => "x" } assert_instance_of Minitest::Reporters::RubyMineReporter, reporters[0] reporters = Minitest::Reporters.choose_reporters [], { "TEAMCITY_VERSION" => "x" } assert_instance_of Minitest::Reporters::RubyMineReporter, reporters[0] end end def test_chooses_the_textmate_reporter_when_necessary reporters = Minitest::Reporters.choose_reporters [], {"TM_PID" => "x"} assert_instance_of Minitest::Reporters::RubyMateReporter, reporters[0] end def test_chooses_the_console_reporters_when_necessary reporters = Minitest::Reporters.choose_reporters [Minitest::Reporters::SpecReporter.new], {} assert_instance_of Minitest::Reporters::SpecReporter, reporters[0] end def test_chooses_no_reporters_when_running_under_vim reporters = Minitest::Reporters.choose_reporters( [Minitest::Reporters::DefaultReporter.new], { "VIM" => "/usr/share/vim" }) assert_equal nil, reporters end end end minitest-reporters-1.0.19/test/unit/minitest/extensible_backtrace_filter_test.rb0000644000076400007640000000231712556740435027417 0ustar pravipravirequire_relative "../../test_helper" module MinitestReportersTest class ExtensibleBacktraceFilterTest < TestCase def setup @default_filter = Minitest::ExtensibleBacktraceFilter.default_filter @filter = Minitest::ExtensibleBacktraceFilter.new @backtrace = ["foo", "bar", "baz"] end def test_adding_filters @filter.add_filter(/foo/) assert @filter.filters?("foo") refute @filter.filters?("baz") end def test_filter_backtrace_when_first_line_is_filtered @filter.add_filter(/foo/) assert_equal ["bar", "baz"], @filter.filter(@backtrace) end def test_filter_backtrace_when_middle_line_is_filtered @filter.add_filter(/bar/) assert_equal ["foo"], @filter.filter(@backtrace) end def test_filter_backtrace_when_all_lines_are_filtered @filter.add_filter(/./) assert_equal ["foo", "bar", "baz"], @filter.filter(@backtrace) end def test_default_filter assert @default_filter.filters?("lib/minitest") assert @default_filter.filters?("lib/minitest/reporters") refute @default_filter.filters?("lib/my_gem") end def test_nil_backtrace assert_equal [], @filter.filter(nil) end end end minitest-reporters-1.0.19/Gemfile0000644000076400007640000000004612556740435016023 0ustar pravipravisource "https://rubygems.org" gemspec minitest-reporters-1.0.19/.ruby-gemset0000644000076400007640000000002312556740435016767 0ustar pravipraviminitest-reporters minitest-reporters-1.0.19/metadata.yml0000644000076400007640000001162012556740435017033 0ustar pravipravi--- !ruby/object:Gem::Specification name: minitest-reporters version: !ruby/object:Gem::Version version: 1.0.19 platform: ruby authors: - Alexander Kern autorequire: bindir: bin cert_chain: [] date: 2015-07-16 00:00:00.000000000 Z dependencies: - !ruby/object:Gem::Dependency name: minitest requirement: !ruby/object:Gem::Requirement requirements: - - ">=" - !ruby/object:Gem::Version version: '5.0' type: :runtime prerelease: false version_requirements: !ruby/object:Gem::Requirement requirements: - - ">=" - !ruby/object:Gem::Version version: '5.0' - !ruby/object:Gem::Dependency name: ansi requirement: !ruby/object:Gem::Requirement requirements: - - ">=" - !ruby/object:Gem::Version version: '0' type: :runtime prerelease: false version_requirements: !ruby/object:Gem::Requirement requirements: - - ">=" - !ruby/object:Gem::Version version: '0' - !ruby/object:Gem::Dependency name: ruby-progressbar requirement: !ruby/object:Gem::Requirement requirements: - - ">=" - !ruby/object:Gem::Version version: '0' type: :runtime prerelease: false version_requirements: !ruby/object:Gem::Requirement requirements: - - ">=" - !ruby/object:Gem::Version version: '0' - !ruby/object:Gem::Dependency name: builder requirement: !ruby/object:Gem::Requirement requirements: - - ">=" - !ruby/object:Gem::Version version: '0' type: :runtime prerelease: false version_requirements: !ruby/object:Gem::Requirement requirements: - - ">=" - !ruby/object:Gem::Version version: '0' - !ruby/object:Gem::Dependency name: maruku requirement: !ruby/object:Gem::Requirement requirements: - - ">=" - !ruby/object:Gem::Version version: '0' type: :development prerelease: false version_requirements: !ruby/object:Gem::Requirement requirements: - - ">=" - !ruby/object:Gem::Version version: '0' - !ruby/object:Gem::Dependency name: rake requirement: !ruby/object:Gem::Requirement requirements: - - ">=" - !ruby/object:Gem::Version version: '0' type: :development prerelease: false version_requirements: !ruby/object:Gem::Requirement requirements: - - ">=" - !ruby/object:Gem::Version version: '0' description: Death to haphazard monkey-patching! Extend Minitest through simple hooks. email: - alex@kernul.com executables: [] extensions: [] extra_rdoc_files: [] files: - ".gitignore" - ".ruby-gemset" - ".travis.yml" - ".yardopts" - Gemfile - LICENSE - README.md - Rakefile - assets/default-reporter.png - assets/progress-reporter.png - assets/spec-reporter.png - lib/minitest/extensible_backtrace_filter.rb - lib/minitest/minitest_reporter_plugin.rb - lib/minitest/old_activesupport_fix.rb - lib/minitest/relative_position.rb - lib/minitest/reporters.rb - lib/minitest/reporters/ansi.rb - lib/minitest/reporters/base_reporter.rb - lib/minitest/reporters/default_reporter.rb - lib/minitest/reporters/html_reporter.rb - lib/minitest/reporters/junit_reporter.rb - lib/minitest/reporters/progress_reporter.rb - lib/minitest/reporters/ruby_mate_reporter.rb - lib/minitest/reporters/rubymine_reporter.rb - lib/minitest/reporters/spec_reporter.rb - lib/minitest/reporters/version.rb - lib/minitest/templates/index.html.erb - minitest-reporters.gemspec - test/fixtures/junit_filename_bug_example_test.rb - test/fixtures/progress_detailed_skip_test.rb - test/fixtures/progress_test.rb - test/fixtures/sample_test.rb - test/gallery/bad_test.rb - test/gallery/good_test.rb - test/integration/reporters/junit_reporter_test.rb - test/integration/reporters/progress_reporter_test.rb - test/test_helper.rb - test/unit/minitest/extensible_backtrace_filter_test.rb - test/unit/minitest/reporters_test.rb - test/unit/minitest/spec_reporter_test.rb homepage: https://github.com/CapnKernul/minitest-reporters licenses: [] metadata: {} post_install_message: rdoc_options: [] require_paths: - lib required_ruby_version: !ruby/object:Gem::Requirement requirements: - - ">=" - !ruby/object:Gem::Version version: 1.9.3 required_rubygems_version: !ruby/object:Gem::Requirement requirements: - - ">=" - !ruby/object:Gem::Version version: '0' requirements: [] rubyforge_project: minitest-reporters rubygems_version: 2.4.5 signing_key: specification_version: 4 summary: Create customizable Minitest output formats test_files: - test/fixtures/junit_filename_bug_example_test.rb - test/fixtures/progress_detailed_skip_test.rb - test/fixtures/progress_test.rb - test/fixtures/sample_test.rb - test/gallery/bad_test.rb - test/gallery/good_test.rb - test/integration/reporters/junit_reporter_test.rb - test/integration/reporters/progress_reporter_test.rb - test/test_helper.rb - test/unit/minitest/extensible_backtrace_filter_test.rb - test/unit/minitest/reporters_test.rb - test/unit/minitest/spec_reporter_test.rb minitest-reporters-1.0.19/lib/0000755000076400007640000000000012556740435015276 5ustar pravipraviminitest-reporters-1.0.19/lib/minitest/0000755000076400007640000000000012556740435017132 5ustar pravipraviminitest-reporters-1.0.19/lib/minitest/minitest_reporter_plugin.rb0000644000076400007640000000205612556740435024616 0ustar pravipravimodule Minitest class << self def plugin_minitest_reporter_init(options) if defined?(Minitest::Reporters) && Minitest::Reporters.reporters reporter.reporters = Minitest::Reporters.reporters + guard_reporter reporter.reporters.each do |reporter| reporter.io = options[:io] reporter.add_defaults(options.merge(:total_count => total_count(options))) if reporter.respond_to? :add_defaults end end end private # stolen from minitest self.run def total_count(options) filter = options[:filter] || '/./' filter = Regexp.new $1 if filter =~ /\/(.*)\// Minitest::Runnable.runnables.map(&:runnable_methods).flatten.find_all { |m| filter === m || filter === "#{self}##{m}" }.size end def guard_reporter guards = Array(reporter.reporters.detect { |r| r.class.name == "Guard::Minitest::Reporter" }) return guards unless ENV['RM_INFO'] warn 'RM_INFO is set thus guard reporter has been dropped' unless guards.empty? [] end end end minitest-reporters-1.0.19/lib/minitest/templates/0000755000076400007640000000000012556740435021130 5ustar pravipraviminitest-reporters-1.0.19/lib/minitest/templates/index.html.erb0000644000076400007640000001045412556740435023700 0ustar pravipravi <%= title %>

<%= title %>

Finished in <%= total_time_to_hms %>, <%= '%.2f tests/s' % (count / total_time) %>, <%= '%.2f assertions/s' % (assertions / total_time) %>

<%= '%d' % count %> tests, <%= '%d' % assertions %> assertions, <%= '%d' % failures %> failures, <%= '%d' % errors %> errors, <%= '%d' % skips %> skips

<%= '%d' % percent_passes %>% passed
<%= '%d' % percent_errors_failures %>% failed
<%= '%d' % percent_skipps %>% skipped
<% suites.each do |suite| %>
<%= suite[:name] %> <%= '%d' % suite[:test_count] %> tests, <%= '%d' % suite[:assertion_count] %> assertions, <%= '%d' % suite[:fail_count] %> failures, <%= '%d' % suite[:error_count] %> errors, <%= '%d' % suite[:skip_count] %> skips, finished in <%= '%.4fs' % suite[:time] %>
<% suite[:tests].each do |test| %>
<% if result(test) == :pass %> <% elsif result(test) == :skip %> <% else %> <% end %> <%= friendly_name(test) %> Assertions <%= test.assertions %>, time <%= ('%.6fs' % test.time) %>
<% if !test.passed? %>
<%= "#{location(test.failure)}\n\n#{test.failure.message}" %>
<% end %>
<% end %>
<% end %>
minitest-reporters-1.0.19/lib/minitest/extensible_backtrace_filter.rb0000644000076400007640000000351512556740435025171 0ustar pravipravimodule Minitest # Filters backtraces of exceptions that may arise when running tests. class ExtensibleBacktraceFilter # Returns the default filter. # # The default filter will filter out all Minitest and minitest-reporters # lines. # # @return [Minitest::ExtensibleBacktraceFilter] def self.default_filter unless defined? @default_filter filter = self.new filter.add_filter(/lib\/minitest/) @default_filter = filter end @default_filter end # Creates a new backtrace filter. def initialize @filters = [] end # Adds a filter. # # @param [Regex] regex the filter def add_filter(regex) @filters << regex end # Determines if the string would be filtered. # # @param [String] str # @return [Boolean] def filters?(str) @filters.any? { |filter| str =~ filter } end # Filters a backtrace. # # This will add new lines to the new backtrace until a filtered line is # encountered. If there were lines added to the new backtrace, it returns # those lines. However, if the first line in the backtrace was filtered, # resulting in an empty backtrace, it returns all lines that would have # been unfiltered. If that in turn does not contain any lines, it returns # the original backtrace. # # @param [Array] backtrace the backtrace to filter # @return [Array] the filtered backtrace # @note This logic is based off of Minitest's #filter_backtrace. def filter(backtrace) result = [] return result unless backtrace backtrace.each do |line| break if filters?(line) result << line end result = backtrace.reject { |line| filters?(line) } if result.empty? result = backtrace.dup if result.empty? result end end end minitest-reporters-1.0.19/lib/minitest/relative_position.rb0000644000076400007640000000066412556740435023224 0ustar pravipravimodule Minitest module RelativePosition TEST_PADDING = 2 TEST_SIZE = 63 MARK_SIZE = 5 INFO_PADDING = 8 private def print_with_info_padding(line) puts pad(line, INFO_PADDING) end def pad(str, size = INFO_PADDING) ' ' * size + str end def pad_mark(str) "%#{MARK_SIZE}s" % str end def pad_test(str) pad("%-#{TEST_SIZE}s" % str, TEST_PADDING) end end end minitest-reporters-1.0.19/lib/minitest/reporters/0000755000076400007640000000000012556740435021157 5ustar pravipraviminitest-reporters-1.0.19/lib/minitest/reporters/junit_reporter.rb0000644000076400007640000001022612556740435024560 0ustar pravipravirequire 'builder' require 'fileutils' module Minitest module Reporters # A reporter for writing JUnit test reports # Intended for easy integration with CI servers - tested on JetBrains TeamCity # # Inspired by ci_reporter (see https://github.com/nicksieger/ci_reporter) # Also inspired by Marc Seeger's attempt at producing a JUnitReporter (see https://github.com/rb2k/minitest-reporters/commit/e13d95b5f884453a9c77f62bc5cba3fa1df30ef5) # Also inspired by minitest-ci (see https://github.com/bhenderson/minitest-ci) class JUnitReporter < BaseReporter def initialize(reports_dir = "test/reports", empty = true) super({}) @reports_path = File.absolute_path(reports_dir) if empty puts "Emptying #{@reports_path}" FileUtils.remove_dir(@reports_path) if File.exists?(@reports_path) FileUtils.mkdir_p(@reports_path) end end def report super puts "Writing XML reports to #{@reports_path}" suites = tests.group_by(&:class) suites.each do |suite, tests| suite_result = analyze_suite(tests) xml = Builder::XmlMarkup.new(:indent => 2) xml.instruct! xml.testsuite(:name => suite, :skipped => suite_result[:skip_count], :failures => suite_result[:fail_count], :errors => suite_result[:error_count], :tests => suite_result[:test_count], :assertions => suite_result[:assertion_count], :time => suite_result[:time]) do tests.each do |test| xml.testcase(:name => test.name, :classname => suite, :assertions => test.assertions, :time => test.time) do xml << xml_message_for(test) unless test.passed? end end end File.open(filename_for(suite), "w") { |file| file << xml.target! } end end private def xml_message_for(test) # This is a trick lifted from ci_reporter xml = Builder::XmlMarkup.new(:indent => 2, :margin => 2) def xml.trunc!(txt) txt.sub(/\n.*/m, '...') end e = test.failure if test.skipped? xml.skipped(:type => test.name) elsif test.error? xml.error(:type => test.name, :message => xml.trunc!(e.message)) do xml.text!(message_for(test)) end elsif test.failure xml.failure(:type => test.name, :message => xml.trunc!(e.message)) do xml.text!(message_for(test)) end end end def message_for(test) suite = test.class name = test.name e = test.failure if test.passed? nil elsif test.skipped? "Skipped:\n#{name}(#{suite}) [#{location(e)}]:\n#{e.message}\n" elsif test.failure "Failure:\n#{name}(#{suite}) [#{location(e)}]:\n#{e.message}\n" elsif test.error? "Error:\n#{name}(#{suite}):\n#{e.message}" end end def location(exception) last_before_assertion = '' exception.backtrace.reverse_each do |s| break if s =~ /in .(assert|refute|flunk|pass|fail|raise|must|wont)/ last_before_assertion = s end last_before_assertion.sub(/:in .*$/, '') end def analyze_suite(tests) result = Hash.new(0) tests.each do |test| result[:"#{result(test)}_count"] += 1 result[:assertion_count] += test.assertions result[:test_count] += 1 result[:time] += test.time end result end def filename_for(suite) file_counter = 0 filename = "TEST-#{suite.to_s[0..240].gsub(/[^a-zA-Z0-9]+/, '-')}.xml" #restrict max filename length, to be kind to filesystems while File.exists?(File.join(@reports_path, filename)) # restrict number of tries, to avoid infinite loops file_counter += 1 filename = "TEST-#{suite}-#{file_counter}.xml" puts "Too many duplicate files, overwriting earlier report #{filename}" and break if file_counter >= 99 end File.join(@reports_path, filename) end end end end minitest-reporters-1.0.19/lib/minitest/reporters/rubymine_reporter.rb0000644000076400007640000000741612556740435025270 0ustar pravipravi# Test results reporter for RubyMine IDE (http://www.jetbrains.com/ruby/) and # TeamCity(http://www.jetbrains.com/teamcity/) Continuous Integration Server begin require 'teamcity/runner_common' require 'teamcity/utils/service_message_factory' require 'teamcity/utils/runner_utils' require 'teamcity/utils/url_formatter' rescue LoadError puts("====================================================================================================\n") puts("RubyMine reporter works only if it test was launched using RubyMine IDE or TeamCity CI server !!!\n") puts("====================================================================================================\n") puts("Using default results reporter...\n") require "minitest/reporters/default_reporter" # delegate to default reporter module Minitest module Reporters class RubyMineReporter < DefaultReporter end end end else module Minitest module Reporters class RubyMineReporter < BaseReporter include ANSI::Code include ::Rake::TeamCity::RunnerCommon include ::Rake::TeamCity::RunnerUtils include ::Rake::TeamCity::Utils::UrlFormatter def start super puts('Started with run options %s' % options[:args]) puts # Setup test runner's MessageFactory set_message_factory(Rake::TeamCity::MessageFactory) log_test_reporter_attached # Report tests count: if ::Rake::TeamCity.is_in_idea_mode log(@message_factory.create_tests_count(total_count)) elsif ::Rake::TeamCity.is_in_buildserver_mode log(@message_factory.create_progress_message("Starting.. (#{total_count} tests)")) end end def report super puts('Finished in %.5fs' % total_time) print('%d tests, %d assertions, ' % [count, assertions]) print(red '%d failures, %d errors, ' % [failures, errors]) print(yellow '%d skips' % skips) puts end def record(test) super if test.passed? log(@message_factory.create_test_finished(test.name, get_time_in_ms(test.time))) else with_result(test) do |exception_msg, backtrace| if test.skipped? log(@message_factory.create_test_ignored(test.name, exception_msg, backtrace)) elsif test.error? log(@message_factory.create_test_error(test.name, exception_msg, backtrace)) else log(@message_factory.create_test_failed(test.name, exception_msg, backtrace)) end end end end alias_method :output, :io def before_suite(suite) fqn = suite.name log(@message_factory.create_suite_started(suite.name, location_from_ruby_qualified_name(fqn))) end def after_suite(suite) log(@message_factory.create_suite_finished(suite.name)) end def before_test(test) super fqn = "#{test.class.name}.#{test.name}" log(@message_factory.create_test_started(test.name, minitest_test_location(fqn))) end ######### def log(msg) output.flush output.puts("\n#{msg}") output.flush # returns: msg end def minitest_test_location(fqn) return nil if (fqn.nil?) "ruby_minitest_qn://#{fqn}" end def with_result(test) exception = test.failure msg = exception.nil? ? "" : "#{exception.class.name}: #{exception.message}" backtrace = exception.nil? ? "" : filter_backtrace(exception.backtrace).join("\n") yield(msg, backtrace) end end end end end minitest-reporters-1.0.19/lib/minitest/reporters/html_reporter.rb0000644000076400007640000001733512556740435024403 0ustar pravipravirequire 'builder' require 'fileutils' require 'erb' module Minitest module Reporters # A reporter for generating HTML test reports # This is recommended to be used with a CI server, where the report is kept as an artifact and is accessible via a shared link # # The reporter sorts the results alphabetically and then by results so that failing and skipped tests are at the top. # # When using Minitest Specs, the number prefix is dropped from the name of the test so that it reads well # # On each test run all files in the reports directory are deleted, this prevents a build up of old reports # # The report is generated using ERB. A custom ERB template can be provided but it is not required # The default ERB template uses JQuery and Bootstrap, both of these are included by referencing the CDN sites class HtmlReporter < BaseReporter # The title of the report attr_reader :title # The number of tests that passed def passes count - failures - errors - skips end # The percentage of tests that passed, calculated in a way that avoids rounding errors def percent_passes 100 - percent_skipps - percent_errors_failures end # The percentage of tests that were skipped def percent_skipps (skips/count.to_f * 100).to_i end # The percentage of tests that failed def percent_errors_failures ((errors+failures)/count.to_f * 100).to_i end # Trims off the number prefix on test names when using Minitest Specs def friendly_name(test) groups = test.name.scan(/(test_\d+_)(.*)/i) return test.name if groups.empty? "it #{groups[0][1]}" end # The constructor takes a hash, and uses the following keys: # :title - the title that will be used in the report, defaults to 'Test Results' # :reports_dir - the directory the reports should be written to, defaults to 'test/html_reports' # :erb_template - the path to a custom ERB template, defaults to the supplied ERB template # :mode - Useful for debugging, :terse suppresses errors and is the default, :verbose lets errors bubble up def initialize(args = {}) super({}) defaults = { :title => 'Test Results', :erb_template => "#{File.dirname(__FILE__)}/../templates/index.html.erb", :reports_dir => 'test/html_reports', :mode => :safe } settings = defaults.merge(args) @mode = settings[:mode] @title = settings[:title] @erb_template = settings[:erb_template] reports_dir = settings[:reports_dir] @reports_path = File.absolute_path(reports_dir) puts "Emptying #{@reports_path}" FileUtils.remove_dir(@reports_path) if File.exists?(@reports_path) FileUtils.mkdir_p(@reports_path) end # Called by the framework to generate the report def report super begin puts "Writing HTML reports to #{@reports_path}" html_file = @reports_path + "/index.html" erb_str = File.read(@erb_template) renderer = ERB.new(erb_str) tests_by_suites = tests.group_by(&:class) # taken from the JUnit reporter suites = tests_by_suites.map do |suite, tests| suite_summary = summarize_suite(suite, tests) suite_summary[:tests] = tests.sort { |a, b| compare_tests(a, b) } suite_summary end suites.sort! { |a, b| compare_suites(a, b) } result = renderer.result(binding) File.open(html_file, 'w') do |f| f.write(result) end rescue Exception => e puts 'There was an error writing the HTML report' puts 'This may have been caused by cancelling the test run' puts 'Use mode => :verbose in the HTML reporters constructor to see more detail' if @mode == :terse puts 'Use mode => :terse in the HTML reporters constructor to see less detail' if @mode != :terse raise e if @mode != :terse end end private def compare_suites_by_name(suite_a, suite_b) suite_a[:name] <=> suite_b[:name] end def compare_tests_by_name(test_a, test_b) friendly_name(test_a) <=> friendly_name(test_b) end # Test suites are first ordered by evaluating the results of the tests, then by test suite name # Test suites which have failing tests are given highest order # Tests suites which have skipped tests are given second highest priority def compare_suites(suite_a, suite_b) return compare_suites_by_name(suite_a, suite_b) if suite_a[:has_errors_or_failures] && suite_b[:has_errors_or_failures] return -1 if suite_a[:has_errors_or_failures] && !suite_b[:has_errors_or_failures] return 1 if !suite_a[:has_errors_or_failures] && suite_b[:has_errors_or_failures] return compare_suites_by_name(suite_a, suite_b) if suite_a[:has_skipps] && suite_b[:has_skipps] return -1 if suite_a[:has_skipps] && !suite_b[:has_skipps] return 1 if !suite_a[:has_skipps] && suite_b[:has_skipps] compare_suites_by_name(suite_a, suite_b) end # Tests are first ordered by evaluating the results of the tests, then by tests names # Tess which fail are given highest order # Tests which are skipped are given second highest priority def compare_tests(test_a, test_b) return compare_tests_by_name(test_a, test_b) if test_fail_or_error?(test_a) && test_fail_or_error?(test_b) return -1 if test_fail_or_error?(test_a) && !test_fail_or_error?(test_b) return 1 if !test_fail_or_error?(test_a) && test_fail_or_error?(test_b) return compare_tests_by_name(test_a, test_b) if test_a.skipped? && test_b.skipped? return -1 if test_a.skipped? && !test_b.skipped? return 1 if !test_a.skipped? && test_b.skipped? compare_tests_by_name(test_a, test_b) end def test_fail_or_error?(test) test.error? || test.failure end # based on analyze_suite from the JUnit reporter def summarize_suite(suite, tests) summary = Hash.new(0) summary[:name] = suite.to_s tests.each do |test| summary[:"#{result(test)}_count"] += 1 summary[:assertion_count] += test.assertions summary[:test_count] += 1 summary[:time] += test.time end summary[:has_errors_or_failures] = (summary[:fail_count] + summary[:error_count]) > 0 summary[:has_skipps] = summary[:skip_count] > 0 summary end # based on message_for(test) from the JUnit reporter def message_for(test) suite = test.class name = test.name e = test.failure if test.passed? nil elsif test.skipped? "Skipped:\n#{name}(#{suite}) [#{location(e)}]:\n#{e.message}\n" elsif test.failure "Failure:\n#{name}(#{suite}) [#{location(e)}]:\n#{e.message}\n" elsif test.error? "Error:\n#{name}(#{suite}):\n#{e.message}" end end # taken from the JUnit reporter def location(exception) last_before_assertion = '' exception.backtrace.reverse_each do |s| break if s =~ /in .(assert|refute|flunk|pass|fail|raise|must|wont)/ last_before_assertion = s end last_before_assertion.sub(/:in .*$/, '') end def total_time_to_hms return ('%.2fs' % total_time) if total_time < 1 hours = total_time / (60 * 60) minutes = ((total_time / 60) % 60).to_s.rjust(2,'0') seconds = (total_time % 60).to_s.rjust(2,'0') "#{ hours }h#{ minutes }m#{ seconds }s" end end end end minitest-reporters-1.0.19/lib/minitest/reporters/version.rb0000644000076400007640000000010412556740435023164 0ustar pravipravimodule Minitest module Reporters VERSION = '1.0.19' end end minitest-reporters-1.0.19/lib/minitest/reporters/ruby_mate_reporter.rb0000644000076400007640000000226112556740435025416 0ustar pravipravimodule Minitest module Reporters # Simple reporter designed for RubyMate. class RubyMateReporter < BaseReporter include RelativePosition INFO_PADDING = 2 def start super puts('Started with run options %s' % options[:args]) puts end def record(test) super if test.skipped? print 'SKIP' print_test_with_time(test) puts puts elsif test.error? print 'ERROR' print_test_with_time(test) puts print_info(test.failure) puts elsif test.failure print 'FAIL' print_test_with_time(test) puts print_info(test.failure, false) puts end end def report super puts puts('Finished in %.5fs' % total_time) print('%d tests, %d assertions, ' % [count, assertions]) print('%d failures, %d errors, ' % [failures, errors]) print('%d skips' % skips) puts end private def print_test_with_time(test) print(" #{test.class}##{test.name} (%.2fs)" % test.time) end end end end minitest-reporters-1.0.19/lib/minitest/reporters/progress_reporter.rb0000644000076400007640000000453012556740435025274 0ustar pravipravirequire 'ruby-progressbar' module Minitest module Reporters # Fuubar-like reporter with a progress bar. # # Based upon Jeff Kreefmeijer's Fuubar (MIT License) and paydro's # monkey-patch. # # @see https://github.com/jeffkreeftmeijer/fuubar Fuubar # @see https://gist.github.com/356945 paydro's monkey-patch class ProgressReporter < BaseReporter include RelativePosition include ANSI::Code PROGRESS_MARK = '=' def initialize(options = {}) super @detailed_skip = options.fetch(:detailed_skip, true) @progress = ProgressBar.create({ total: total_count, starting_at: count, progress_mark: green(PROGRESS_MARK), remainder_mark: ' ', format: ' %C/%c: [%B] %p%% %a, %e', autostart: false }) end def start super puts('Started with run options %s' % options[:args]) puts @progress.start @progress.total = total_count show end def record(test) super return if test.skipped? && !@detailed_skip if test.failure print "\e[0m\e[1000D\e[K" print_colored_status(test) print_test_with_time(test) puts print_info(test.failure, test.error?) puts end if test.skipped? && color != "red" self.color = "yellow" elsif test.failure self.color = "red" end show end def report super @progress.finish puts puts('Finished in %.5fs' % total_time) print('%d tests, %d assertions, ' % [count, assertions]) color = failures.zero? && errors.zero? ? :green : :red print(send(color) { '%d failures, %d errors, ' } % [failures, errors]) print(yellow { '%d skips' } % skips) puts end private def show @progress.increment unless count == 0 end def print_test_with_time(test) puts [test.name, test.class, total_time].inspect print(" %s#%s (%.2fs)" % [test.name, test.class, total_time]) end def color @color ||= "green" end def color=(color) @color = color @progress.progress_mark = send(color, PROGRESS_MARK) end end end end minitest-reporters-1.0.19/lib/minitest/reporters/default_reporter.rb0000644000076400007640000001221112556740435025047 0ustar pravipravimodule Minitest module Reporters # A reporter identical to the standard Minitest reporter except with more # colors. # # Based upon Ryan Davis of Seattle.rb's Minitest (MIT License). # # @see https://github.com/seattlerb/minitest Minitest class DefaultReporter < BaseReporter include ANSI::Code include RelativePosition def initialize(options = {}) super @detailed_skip = options.fetch(:detailed_skip, true) @slow_count = options.fetch(:slow_count, 0) @slow_suite_count = options.fetch(:slow_suite_count, 0) @suite_times = [] @suite_start_times = {} @fast_fail = options.fetch(:fast_fail, false) @options = options end def start super puts puts("# Running tests with run options %s:" % options[:args]) puts end def before_test(test) super print "\n#{test.class}##{test.name} " if options[:verbose] end def before_suite(suite) @suite_start_times[suite] = Time.now super end def after_suite(suite) super duration = suite_duration(suite) @suite_times << [suite.name, duration] end def record(test) super print "#{"%.2f" % test.time} = " if options[:verbose] # Print the pass/skip/fail mark print(if test.passed? record_pass(test) elsif test.skipped? record_skip(test) elsif test.failure record_failure(test) end) # Print fast_fail information if @fast_fail && (test.skipped? || test.failure) print_failure(test) end end def record_pass(record) green(record.result_code) end def record_skip(record) yellow(record.result_code) end def record_failure(record) red(record.result_code) end def report super status_line = "Finished tests in %.6fs, %.4f tests/s, %.4f assertions/s." % [total_time, count / total_time, assertions / total_time] puts puts puts colored_for(suite_result, status_line) puts unless @fast_fail tests.reject(&:passed?).each do |test| print_failure(test) end end if @slow_count > 0 slow_tests = tests.sort_by(&:time).reverse.take(@slow_count) puts puts "Slowest tests:" puts slow_tests.each do |test| puts "%.6fs %s" % [test.time, "#{test.name}##{test.class}"] end end if @slow_suite_count > 0 slow_suites = @suite_times.sort_by { |x| x[1] }.reverse.take(@slow_suite_count) puts puts "Slowest test classes:" puts slow_suites.each do |slow_suite| puts "%.6fs %s" % [slow_suite[1], slow_suite[0]] end end puts print colored_for(suite_result, result_line) puts end alias to_s report def print_failure(test) message = message_for(test) unless message.nil? || message.strip == '' puts puts colored_for(result(test), message) end end private def color? return @color if defined?(@color) @color = @options.fetch(:color) do io.tty? && ( ENV["TERM"] =~ /^screen|color/ || ENV["EMACS"] == "t" ) end end def green(string) color? ? ANSI::Code.green(string) : string end def yellow(string) color? ? ANSI::Code.yellow(string) : string end def red(string) color? ? ANSI::Code.red(string) : string end def colored_for(result, string) case result when :fail, :error; red(string) when :skip; yellow(string) else green(string) end end def suite_result case when failures > 0; :fail when errors > 0; :error when skips > 0; :skip else :pass end end def location(exception) last_before_assertion = '' exception.backtrace.reverse_each do |s| break if s =~ /in .(assert|refute|flunk|pass|fail|raise|must|wont)/ last_before_assertion = s end last_before_assertion.sub(/:in .*$/, '') end def message_for(test) e = test.failure if test.skipped? if @detailed_skip "Skipped:\n#{test.class}##{test.name} [#{location(e)}]:\n#{e.message}" end elsif test.error? "Error:\n#{test.class}##{test.name}:\n#{e.message}" else "Failure:\n#{test.class}##{test.name} [#{test.failure.location}]\n#{e.class}: #{e.message}" end end def result_line '%d tests, %d assertions, %d failures, %d errors, %d skips' % [count, assertions, failures, errors, skips] end def suite_duration(suite) start_time = @suite_start_times.delete(suite) if start_time.nil? 0 else Time.now - start_time end end end end end minitest-reporters-1.0.19/lib/minitest/reporters/spec_reporter.rb0000644000076400007640000000245212556740435024363 0ustar pravipravimodule Minitest module Reporters # Turn-like reporter that reads like a spec. # # Based upon TwP's turn (MIT License) and paydro's monkey-patch. # # @see https://github.com/TwP/turn turn # @see https://gist.github.com/356945 paydro's monkey-patch class SpecReporter < BaseReporter include ANSI::Code include RelativePosition def start super puts('Started with run options %s' % options[:args]) puts end def report super puts('Finished in %.5fs' % total_time) print('%d tests, %d assertions, ' % [count, assertions]) color = failures.zero? && errors.zero? ? :green : :red print(send(color) { '%d failures, %d errors, ' } % [failures, errors]) print(yellow { '%d skips' } % skips) puts end def record(test) super test.name.gsub!(/^test_:/, 'test:') print pad_test(test.name) print_colored_status(test) print(" (%.2fs)" % test.time) unless test.time.nil? puts if !test.skipped? && test.failure print_info(test.failure) puts end end protected def before_suite(suite) puts suite end def after_suite(suite) puts end end end end minitest-reporters-1.0.19/lib/minitest/reporters/ansi.rb0000644000076400007640000000114412556740435022436 0ustar pravipravimodule Minitest module Reporters module ANSI module Code def self.color? color_terminal = ENV['TERM'].to_s.downcase.include?("color") $stdout.tty? || color_terminal end if color? require 'ansi/code' include ::ANSI::Code extend ::ANSI::Code else def black(s = nil) block_given? ? yield : s end %w[ red green yellow blue magenta cyan white ].each do |color| alias_method color, :black end extend self end end end end end minitest-reporters-1.0.19/lib/minitest/reporters/base_reporter.rb0000644000076400007640000000440012556740435024336 0ustar pravipravimodule Minitest module Reporters class BaseReporter < Minitest::StatisticsReporter attr_accessor :tests def initialize(options={}) super($stdout, options) self.tests = [] end def add_defaults(defaults) self.options = defaults.merge(options) end # called by our own before hooks def before_test(test) last_test = tests.last if last_test.class != test.class after_suite(last_test.class) if last_test before_suite(test.class) end end def record(test) super tests << test end # called by our own after hooks def after_test(test) end def report super after_suite(tests.last.class) end protected def after_suite(test) end def before_suite(test) end def result(test) if test.error? :error elsif test.skipped? :skip elsif test.failure :fail else :pass end end def print_colored_status(test) if test.passed? print(green { pad_mark( result(test).to_s.upcase ) }) elsif test.skipped? print(yellow { pad_mark( result(test).to_s.upcase ) }) else print(red { pad_mark( result(test).to_s.upcase ) }) end end def total_time super || Time.now - start_time end def total_count options[:total_count] end def filter_backtrace(backtrace) Minitest.filter_backtrace(backtrace) end def puts(*args) io.puts(*args) end def print(*args) io.print(*args) end def print_info(e, name=true) print "#{e.exception.class.to_s}: " if name e.message.each_line { |line| print_with_info_padding(line) } # When e is a Minitest::UnexpectedError, the filtered backtrace is already part of the message printed out # by the previous line. In that case, and that case only, skip the backtrace output. unless e.is_a?(MiniTest::UnexpectedError) trace = filter_backtrace(e.backtrace) trace.each { |line| print_with_info_padding(line) } end end end end end minitest-reporters-1.0.19/lib/minitest/reporters.rb0000644000076400007640000000444012556740435021506 0ustar pravipravirequire 'minitest' module Minitest require "minitest/relative_position" require "minitest/extensible_backtrace_filter" module Reporters require "minitest/reporters/version" autoload :ANSI, "minitest/reporters/ansi" autoload :BaseReporter, "minitest/reporters/base_reporter" autoload :DefaultReporter, "minitest/reporters/default_reporter" autoload :SpecReporter, "minitest/reporters/spec_reporter" autoload :ProgressReporter, "minitest/reporters/progress_reporter" autoload :RubyMateReporter, "minitest/reporters/ruby_mate_reporter" autoload :RubyMineReporter, "minitest/reporters/rubymine_reporter" autoload :JUnitReporter, "minitest/reporters/junit_reporter" autoload :HtmlReporter, "minitest/reporters/html_reporter" class << self attr_accessor :reporters end def self.use!(console_reporters = ProgressReporter.new, env = ENV, backtrace_filter = ExtensibleBacktraceFilter.default_filter) use_runner!(console_reporters, env) Minitest.backtrace_filter = backtrace_filter unless defined?(@@loaded) use_around_test_hooks! use_old_activesupport_fix! @@loaded = true end end def self.use_runner!(console_reporters, env) self.reporters = choose_reporters(console_reporters, env) end def self.use_around_test_hooks! Minitest::Test.class_eval do def run_with_hooks(*args) if defined?(Minitest::Reporters) && reporters = Minitest::Reporters.reporters reporters.each { |r| r.before_test(self) } result = run_without_hooks(*args) reporters.each { |r| r.after_test(self) } result else run_without_hooks(*args) end end alias_method :run_without_hooks, :run alias_method :run, :run_with_hooks end end def self.choose_reporters(console_reporters, env) if env["TM_PID"] [RubyMateReporter.new] elsif env["RM_INFO"] || env["TEAMCITY_VERSION"] [RubyMineReporter.new] elsif !env["VIM"] Array(console_reporters) end end def self.use_old_activesupport_fix! if defined?(ActiveSupport::VERSION) && ActiveSupport::VERSION::MAJOR < 4 require "minitest/old_activesupport_fix" end end end end minitest-reporters-1.0.19/lib/minitest/old_activesupport_fix.rb0000644000076400007640000000070112556740435024071 0ustar pravipravirequire "active_support/testing/setup_and_teardown" module ActiveSupport module Testing module SetupAndTeardown if defined?(ForMinitest) ForMiniTest = ForMinitest end module ForMiniTest remove_method :run def before_setup super run_callbacks :setup end def after_teardown run_callbacks :teardown super end end end end end minitest-reporters-1.0.19/Rakefile0000644000076400007640000000254212556740435016200 0ustar pravipravirequire "bundler/gem_tasks" require "rake/testtask" task :default => :test Rake::TestTask.new do |t| t.pattern = "test/{unit,integration}/**/*_test.rb" t.verbose = true end rubymine_home = [ ENV["RUBYMINE_HOME"], "../rubymine-contrib/ruby-testing/src/rb/testing/patch/common", "/Applications/RubyMine.app/Contents/rb/testing/patch/common", ].compact.detect { |d| Dir.exist?(d) } Rake::TestTask.new("test:gallery") do |t| t.pattern = "test/gallery/**/*_test.rb" t.verbose = true t.libs << rubymine_home end # - RubyMineReporter must be tested separately inside of RubyMine # - JUnitReporter normally writes to `test/reports` instead of stdout task :gallery do unless rubymine_home warn "To see RubyMineReporter supply RUBYMINE_HOME= or git clone git://git.jetbrains.org/idea/contrib.git ../rubymine-contrib" exit 1 end [ "Pride", "DefaultReporter", "JUnitReporter", "ProgressReporter", "RubyMateReporter", "SpecReporter", "RubyMineReporter", "HtmlReporter" ].each do |reporter| puts puts "-" * 72 puts "Running gallery tests using #{reporter}..." puts "-" * 72 puts sh "rake test:gallery REPORTER=#{reporter}" do # Ignore failures. They're expected when you are running the gallery # test suite. end sh "cat test/reports/*" if reporter == "JUnitReporter" end end minitest-reporters-1.0.19/.gitignore0000644000076400007640000000034312556740435016520 0ustar pravipravicoverage rdoc pkg test/tmp test/version_tmp test/reports tmp pkg *.gem *.rbc lib/bundler/man spec/reports .config InstalledFiles .bundle # YARD artifacts .yardoc _yardoc doc/ # Gem-specific Gemfile.lock .idea/ .ruby-version