pax_global_header00006660000000000000000000000064147671156570014535gustar00rootroot0000000000000052 comment=062c317f69ed46e3c97a3ad762957ea552627b1c golang-github-johanneskaufmann-html-to-markdown-2.3.1/000077500000000000000000000000001476711565700230155ustar00rootroot00000000000000golang-github-johanneskaufmann-html-to-markdown-2.3.1/.github/000077500000000000000000000000001476711565700243555ustar00rootroot00000000000000golang-github-johanneskaufmann-html-to-markdown-2.3.1/.github/ISSUE_TEMPLATE/000077500000000000000000000000001476711565700265405ustar00rootroot00000000000000golang-github-johanneskaufmann-html-to-markdown-2.3.1/.github/ISSUE_TEMPLATE/01-cli-bug-report.yaml000066400000000000000000000045421476711565700325020ustar00rootroot00000000000000 name: 🐛 CLI Bug Report description: File a bug report for the command line interface. title: "[CLI]: Your title" labels: ["bug", "cli"] body: - type: markdown attributes: value: | ### Thank you for contributing to the project! You are creating a issue for the version **v2.x.x** of the **CLI**. The bug report form helps to streamline the process. Please fill out all required fields and choose a *minimal* reproducible example. - type: textarea id: description attributes: label: Describe the bug description: What did you try to do? What did not work? Anything else to be aware of? placeholder: "A clear and concise description of what the bug is." value: | A clear and concise description of what the bug is. Also add any other context about the problem here. For example, what `--version` you are using. validations: required: true - type: textarea id: example_code_input attributes: label: HTML Input description: Please choose a minimal input that shows the problem. This will be automatically formatted into code, so no need for backticks. placeholder: "

Title

" render: html validations: required: true - type: textarea id: example_code_actual attributes: label: Generated Markdown description: The *actual* output of the converter. This will be automatically formatted into code, so no need for backticks. placeholder: "# Title" render: markdown validations: required: true - type: textarea id: example_code_expected attributes: label: Expected Markdown description: The *expected* output of the converter. This will be automatically formatted into code, so no need for backticks. placeholder: "# Title!!!" render: markdown validations: required: true - type: dropdown id: operating_system attributes: label: Operating System description: On what operating system are you using the CLI? options: - MacOS - Linux - Windows validations: required: true - type: markdown attributes: value: | ---- Thanks for taking the time to fill out this bug report! *We usually answer you in 2-3 days and then fix it on the weekend.* 02-golang-v2-bug-report.yaml000066400000000000000000000046601476711565700334520ustar00rootroot00000000000000golang-github-johanneskaufmann-html-to-markdown-2.3.1/.github/ISSUE_TEMPLATE name: 🐛 Golang V2 Bug Report description: File a bug report for the golang library v2.x.x title: "[Bug]: Your title" labels: ["bug", "v2"] body: - type: markdown attributes: value: | ### Thank you for contributing to the project! You are creating a issue for the version **v2** of the **Golang** package. The bug report form helps to streamline the process. Please fill out all required fields and choose a *minimal* reproducible example. - type: textarea id: description attributes: label: Describe the bug description: What did you try to do? What did not work? Anything else to be aware of? placeholder: "A clear and concise description of what the bug is." value: | A clear and concise description of what the bug is. Also add any other context about the problem here. For example, if you changed the default options or used a plugin. Also adding the version from the `go.mod` is helpful. validations: required: true - type: textarea id: example_code_input attributes: label: HTML Input description: Please choose a minimal input that shows the problem. This will be automatically formatted into code, so no need for backticks. placeholder: "

Title

" render: html validations: required: true - type: textarea id: example_code_actual attributes: label: Generated Markdown description: The *actual* output of the converter. This will be automatically formatted into code, so no need for backticks. placeholder: "# Title" render: markdown validations: required: true - type: textarea id: example_code_expected attributes: label: Expected Markdown description: The *expected* output of the converter. This will be automatically formatted into code, so no need for backticks. placeholder: "# Title!!!" render: markdown validations: required: true - type: dropdown id: plugins attributes: label: What plugins did you use? description: You can select multiple. multiple: true options: - base - commonmark - strikethrough - other plugin - type: markdown attributes: value: | ---- Thanks for taking the time to fill out this bug report! *We usually answer you in 2-3 days and then fix it on the weekend.* 03-golang-v1-bug-report.yaml000066400000000000000000000044151476711565700334500ustar00rootroot00000000000000golang-github-johanneskaufmann-html-to-markdown-2.3.1/.github/ISSUE_TEMPLATE name: 🐛 Golang V1 Bug Report description: File a bug report for the golang library v1.x.x title: "[Bug]: Your title" labels: ["bug", "v1"] body: - type: markdown attributes: value: | ### Thank you for contributing to the project! You are creating a issue for the version **v1** of the **Golang** package. The bug report form helps to streamline the process. Please fill out all required fields and choose a *minimal* reproducible example. > [!TIP] > There is a new v2 version of the library. Consider upgrading. - type: textarea id: description attributes: label: Describe the bug description: What did you try to do? What did not work? Anything else to be aware of? placeholder: "A clear and concise description of what the bug is." value: | A clear and concise description of what the bug is. Also add any other context about the problem here. For example, if you changed the default options or used a plugin. Also adding the version from the `go.mod` is helpful. validations: required: true - type: textarea id: example_code_input attributes: label: HTML Input description: Please choose a minimal input that shows the problem. This will be automatically formatted into code, so no need for backticks. placeholder: "

Title

" render: html validations: required: true - type: textarea id: example_code_actual attributes: label: Generated Markdown description: The *actual* output of the converter. This will be automatically formatted into code, so no need for backticks. placeholder: "# Title" render: markdown validations: required: true - type: textarea id: example_code_expected attributes: label: Expected Markdown description: The *expected* output of the converter. This will be automatically formatted into code, so no need for backticks. placeholder: "# Title!!!" render: markdown validations: required: true - type: markdown attributes: value: | ---- Thanks for taking the time to fill out this bug report! *We usually answer you in 2-3 days and then fix it on the weekend.* golang-github-johanneskaufmann-html-to-markdown-2.3.1/.github/ISSUE_TEMPLATE/04-feature-request.yaml000066400000000000000000000011351476711565700327660ustar00rootroot00000000000000 name: ✨ Feature Request description: Request a new feature title: "[Feature]: Your title" labels: ["enhancement"] body: - type: markdown attributes: value: | ### Thank you for contributing to the project! You want want to request a new feature? Great! - type: textarea id: description attributes: label: Describe the improvement description: What feature should be implemented? How are other libraries doing it? placeholder: "A clear and concise description of what improvement you wish for." validations: required: true golang-github-johanneskaufmann-html-to-markdown-2.3.1/.github/dependabot.yml000066400000000000000000000004251476711565700272060ustar00rootroot00000000000000# Please see the documentation for all configuration options: # https://docs.github.com/github/administering-a-repository/configuration-options-for-dependency-updates version: 2 updates: - package-ecosystem: "gomod" directory: "/" schedule: interval: "weekly" golang-github-johanneskaufmann-html-to-markdown-2.3.1/.github/images/000077500000000000000000000000001476711565700256225ustar00rootroot00000000000000golang-github-johanneskaufmann-html-to-markdown-2.3.1/.github/images/autocomplete_register.png000066400000000000000000007053161476711565700327510ustar00rootroot00000000000000PNG  IHDRv|7 @iCCPICC ProfileHWXS[@h@J- *! JbG\X(XEa_,((bI]͝s?gΝj'9"Q.@@OB'  /bFGXڿw7"mK_8̓x%W$.(ͦV%BH3Rx&>q+J*8+r3j?ĎB@b< 6"t2>dc\dE)@/L?K^dȇ%*YXanLbQkBACR$! r{Ԁς9:;8a@$̍ W 6pxu!^SlOUB3,?J}=$0l>Z1bBAb$Ī;ą)le"lĒXir}0C//%KTY!`\,~8 _L  (;&)t> ccq(7Zas).qxb\r}W0C#d=BxEO x !u_AP6"<8\x/{KO #w\o.&dd#]mȒH 6>{=ݞAxDA"ܞ$(eA\ j7Tʸq臉BϮe)ffPؑ(yُlHU[Uaȉ<|{~!<؆l-bSX3ֈaǥxxu=!oxr45_}iw4`MM 2 LEB( &F@tھsyppw.pY3CGqå|Kqn @ @j%:eL4 G'].EסU=^Bo] t2`caQX X)VUaX|װ.qN p.>/7z?o*`G$ B9a0 K݄wD"QhEt{1MA\BH#$vH$ɎM"qHzR3*AIYXI)H)EITT[UgJd '9#O'/#o'7/ɟ)+7%MGYGܣQVV6UPQ(U^OC***,TR*'UnRT?j ZM=M}@JSuPeTV֫^U}FVPcMT+R+W;vYOnRVP?ީ>ADcMf&Os6Ӛi͌ƢqiiighZD-+-VV^v~mMmDiǵt0KN2:7u>0xD툫#G [נw_׷ՏџI~H^##KGy555a͠`0PdaQjF4ccjftm:K_GoHL|62M0-63oF1ce6k17760i^c~ǂlȲXkq⽥eB+]+UU=k*6DMF+mme;N`Ѯca(ᨪQ*LB: /GNb]s;9&tL1lNNםAs_ع]6rF.tmq&vuu7wOstdh1K=s2 v |2"m沫B[T6= 7E"EZD #@;jUh)Gc111OcΌ=G;] DII+ƍ7kܥddArc )%1eGkwޜ`5aڄ 'N<>Img4BZR/(Ng ^eqr_xy|oJ =ޙ2{|ʳ,srv &)j s&O!xNY3_&ޑOo,Ђ?mk/>&N=8McpZt鋧?+ *m>;ey3b:>eٜs52/gŎ+Oߴp DD\ҹkE"΋/V+XXV^e w_Kۗ-۴\ Vj,ZxUĪե߮BK浔]57_| YnTWUT.|&M 7mEUUۈ =ݞoߪw(upg׮]ջ v/Ak$5{R\־vkN]>O7h98X{Paz~z}CVCWcrcǑ#-M^M:yXqNPN,81\xSҧg~!}YkӷoE1G+fdz'dh|F/? "?OX~F7j{L`vxjDSp:ΕB-q_)3q |sV^eXIfMM*>F(iNxv|ASCIIScreenshot )& pHYs%%IR$iTXtXML:com.adobe.xmp 892 2166 Screenshot ,sKiDOT(AG@IDATxu\YGQBT\1Zcn}BE1Z ] E@}9fnze~^9g;W8NNN  @ @ @ @ A . @ @ @ ;E @ @ @ @*`>\ @ @ @ @@@ @ @ @ `vXeA @ @ @ ; @ @ @ @*`>\ @ @ @ @@@ @ @ @ `vXeA @ @ @ ; @ @ @ @*`>\ @ @ @ @@@ @ @ @ `vXeA @ @ @ ; @ @ @ @*`>\ @ @ @ @@@ @ @ @ `vXeA @ @ @ ; @ @ @ @*`>\ @ @ @ @@@ @ @ @ `vXeA @ @ @ ; @ @ @ @*`>\ @['?3wѾ{^@ @ @ >8\6 @* ^j]U,N<>F>FW9p @ @ r;bAb@ҠC6r[v(X @ @ @   *n  YR x6=zYٖWj*E)e;wr~%"lS4yBG\'Yu~mRã&?8H.G5؀ @ @ @E$q )A_ݴOn_ 'YKiժ*n]U9app(ծ=HٖW֮${b];oO-ߛU\w#rwKF#ShϞSgIgU+q&g  g!@ @ @@i޳6{ J5<[tͮRCmV\T铱n}g.]PY._K={Ng]i,eOCCwb @ @ d;~!=UceȐy;ʕ#(N8CChΜtVhќʽm|&MZlc Ķ`Gԅɽp:@ @ @ O$`XT*+Sv5ĵGD| қ7o52|x[*S&h :ukcb[)7*o/M=ߜ|{p@ @ @,M"i(K>G>#Kt zvV쒧KR&A"zt>0{ 9Svb̽˧),4 wyMDz|/{d8 S/SלΞg+ƾ cdc$II&ğtݘ<=VtXzf퓓t{T&ABʜe]JKݤsw4}a8)eD)$}GrHIR~!}1uJUx;5sK"E7Okq!C%MN $܅!6QrY@7 zzXQ/[?5)+٧L-i3Rh>Y U7i9k>{>i;,1*rD ܹ[tk1yd}< -xEd\yҥ)RQiD($X33+aJȖ6nZRnꇓ#(eKOʕ{t z]D{Ѣ)9޿&XK ql}QID_9:&ͷn=ׯ(i:P4b鯤KR<3PX{q?O_7{|>F)=?z"SE(t:u:ݺe=obQf)*UJߗ̙Jϛ*Grt|_Kߓ;>3ӓ]"1…;E8%KDzF%Žs>q*1ZXъk?y鶥Gu,C @ @ _QIS:R[9olI/E/oM6#|rh))ؑTO Q;ۻVxش UmW zCQYo6h"PS=mRgݺfP n˕i3f̠[Y8 GSB"d7WlϪJ^JP= ,--1:,ߥ/'4w 7A4lr_%wJf,=U3!X!D/{c <9&ԼMhp -ڙ^҆gzI/ءͶ݄Z8s9@l84bli=b)UEtۼIa5}4|k~+WFq˗RϞSCF'QŊ+w>(o۶:hXx;-Y]AYu[s)PPTu68…(CTbwТEĺ%KGDDl%^qtLAGw$$[882jbƏo/vk\BP3hݺkrߴiq58peϤL M\d0DY5ј1K+[FlGOt6iӦqiٺu;6RE+1&1P~ l٣n֬^AɓBnnwWVܳ4y{/[QݬYwLH3jm#©ɚ~l@ @ @ .`1$}AQzć4e9zaCW&6:@j#yh:/ŷ6uҟ_r1ŻUP|\{j/gyuѹsgUKɓ'ԱcGׯ41ǏҥKM1>x>Q]#.Mm1:ЩL5}5ĺ:$8F6,np ߹d*{n0/^}`ܠ*D :?7|^nQu#Hؑ8Y )E5U@b2UG1U-;Fޡg6:93naCض($0a* v,[68 an͚T n#zRnu5j4̙}+N7zyQ;HVOwL% "o*@(cӎ'MTF ۷hjիI$G˛v?4'W!ixT;† FkR?ܼm826T`GPG;S){AvDu?\]w頻S! g8U;[ @ @ @ XL͔:nZ6/[bO[!/\mçu%ySq kA~.MqjxqCz1xym+vQZQ;]H0m_0QLSU8Cֶ ]&wM9G6.#i# Oxᗦ]҇poQ^=j^W>ץb[epܯ${omNlgc:c*$4H*@Ehͩ3-B]'Pڸ M˥ij|Tj%T2F4޽ R:ؿ/zl4%#9K<phq*RhzP>3>rצ w+p ܺ7UjMitx'^T\sR|Np\:!]?ulXJ\)\d z,bRꇼ$O{ -)blY=a03T/ꐈp]=.!B*T2|Էy-k.\`,&L,34/ mSM:\6~2aeWL4}<Tki@ܗPa~cJzEiT+< /~nHU.t/AQyЌpO{ UܪwW>&/3F)}.[^5cU.+;mACpxJ^aS}BɽfdB3PoCw̾MSQۻR&J9֖nօ(u26IK?'ۤpmLj6yS„b>=yrci~pU!/;vLATh3U6$pa͚},E<^};D%?8!Fj[QΑXJ%>!@ @ @@l`Gr5WІE{+ٳAF츦52,᫏ S;/Hc/y^)G*U"8JsVfت+eWU=Y4?oXYYI%J(UxI/B 5$=?83Gbg`` ]r찄 Hb'^6==[ƵX3A1`qSO.Mw KRNIG6.FQs(W p,I3F0* B?\_<|OSvyt:ouUcA!nUsjB*ܖTYӟNֽnV5zY7|m#oigj5l8dլu|U p؅C/E _8} %0?/Nn v ]&mz .]:RN!ITW)D5*Ut/9\! t2ΞI3*6RBWC=u ,&\bLlliV]e܏8 /n&J)ʧ|0C 7[w@zHm\z7.9AJӦ#s2eK9]HŋZ!ĺrp:+iJn,<= ?^Z6F0gi=Z;W4~|7qjS娃]ҾtӧԢ6&GC' @ @ @UvWݻYXWW0uCV"e3iǢȿ0I<7BrnP@KTTm#2_tȿV:-x֖RHxU~޼ Tq(OI4!N45I|4C5zv[Wnѝ%֍Mv'G^r${㛗ir:ChHa!oiH华ދ([a]pD9^"W`wȱr7ofu| /\AKEͭ4`ԩ&qalMQwDW S;ΜAsZD0HS~mc޼b>󗏯3rXHOuC=zLӳh2FCu@ @ @m(zae/{~~'/goI38`GCϺ{z>U2lMWd)RH/uӐ/^^콕7O82b|o#^ʛF?jvU vB%UnDfTH!yҽǷ5u[Ӱ//LQӤpՈ9> /}Q6(UX]?8tXK 6ء]aɒKy*or+,҉)PXW?zX1-[憧KiSUȑ#2} DןND>_ڴ))qbs۶cREr6h(Bt'R`CTmULQZBev@ׯ?TIrnjn+pEyQ;U>$v3=0<5L؝*61Ç.g,iE"nԿnS;LM 㼽Gyt ĺ v=8ÁcKD)ucȅ_Iф ݅ ;  @ @ )ؑ4# Y~P|ŗ{>,Tld)w=v.1_D{S=w~666Ҕ x#@4 XC ;}[Rp^UbwM:/źDnn[掫`xֿ%a1g,]j45JRq=+j88۵ӫJc+*UI/͛BǓ'/t(,C /U T0/MUs2C`G!zH S~!^ZG"DɃ#E--DC>o v;!@ @ @/ e(%I Wq%W)vS#DDp$B%zM///Ww9ily-p+++)FAS71Ħ`G3)O)1ٮ-\ ͝,bGE)[$ Mf8 "8MidQݾ~ v~4/ *h3H$!zˡ/(s4<O) OQ?*G8qT."n~i_ZdqdԨQyK$mێќ&nZW邫\|Q9NDim ;B,q_7=>ź=z ?$Zۖ{{%&3)2=[|%a@ @ @ XDùuoBܦqunӇr}zӓWq\ـ+/ݪ:Q|^=kq5^.3=?>b2ء&~9V5uYHY '\:@Aӓےq=㼥nډs6x˘-(hҭ=qQ-֫GO?wg1^h;m Ґ]l 0z0/sTNYvסb[ jwҔ?FDoR=FFYz/wѢ>o9ؑ2XvN.}޽ 5q_cRş"•~-yx,ј1Xty*U*TI'h~2kV?ʖ-h= N֩u9D D@iSZt<#"i` @ @ @P"ًca4%./ewޮtfK|yC)?eyzHΑMD}Wo:O["&|kORB; [>_c1 |F%&^kQ?xJ5jU'M&SgȐ!1|WOtϘ_zN[KEm2N!zp*5CM\-Ft#MgFqEL}F4=U}sT"DfvTH7EңGh…sy7LM/K]ELkq]Uˍ޾} .+͘9s\)VIr"D"~xt,ҿշԾ 5kVI/goիj1`@3rv=[Qκpzٹ[IޝE[XX8UnTqpHJ3RٯR> vp/pP}{ZMl5uAGѢ9хؒM-UL?Hm*&<>_mjذSuc}0իWFsE͛`|YUdVߎ^t/9@ @ @bE;R6쿛h[Dz9-/j!~^! 1c _Nl.eWb:ѸRO;[bgO~$H@$O/0ǎ+u |kNPq8]߃\+PQsO({QKIޗC@^(C8y1`:m4?.y5(_6~ N9^/gǩvѻ ݻ|Z}J^u]Y%۪U\]#;]bӚp0DҤ.HF țqa2ep%K]X"|eˆcrq\I$CTbuX{ҤUA~HpEtfRԻ ?ZS}~y;lIOS7^ teԃb:1*8ũ''iQa @ @ jvpٔDE;Hz~)Al<4a)?7}"V yKO_Μx y}RT>c:Sjߦ_^9仄6/ڴi#vjks,C2~ '!wbzINeB=h )D1R;Cc=|1[/Sּ,&P (oJ5ෲ9o1J{nke%ًKL;^.HʩY3ܥ/6x:y$)RR*\a4z(>&6+_WW|5kFQdIM1E WH41(UJ_6/:|-SϞ[tUdϪL3gڵ{;:tp9ot6]{`Юn>-)_itI)R$?W4ԩk4n Ou()zy"6sg%^p4UNySTcȅJW8gS={mF*X @ @ @YbB{?G(af߅G/mJʘi_{6)E|,%||Ӕ T^R'7o9ݻw5myZ|l$^XeҪ._hКn;+#ib`Isq6c1ml•3_1 "|`Gj aѦ.">'j ) |n͸vF3KWQ/]vgϞ4Q;*T($MuJ`7+*M3V={N+WwIӰ*aW/_+ ;vL+!!a#.gE +k[@Ç/0:\YA 0:Hjq!u2{;K` 444LƸzVIvv*>zpp(i3ZTPzL;^^x*3ܦ^n~L:S7ug̾JX`p>ǠCHt!Cgh @ @ @Jb74 EU)R̞fRxnj>#h&bjO>>O 8sK@yeHR8|0A+666|rսLe///:z0.*Y Oݡ3۳'~/os8Ő).r;> (_vRKhQr(ir6U)C,)UYBdghA,lRų1Ε-;9䁹KV6#g@4J >•7tN% j|\s&aTr\a++p%^* xWiܸ2uץ*q ҋZbѣiȐ)qՁ nk|qEcKJvjkbĉ rvMT_ u%&1jTʙ`Ȼw*kh}0ePIC,.MKn|ƋzJ ic䞔7ofѼxvqL1I42FHtqJ4*UODGyzVSP\+/ѹyL.TΟR(3>ٲEVx꽴h6s2h|4Ij*}bp~4@ @ @ $`Q5,Oᔳhzt2xtW$(s?(BB_c!*Q4mBR)<<&Ihg/M7Rl%!{7ɭ+ӦDuɜ%IR|8QW]8PEs'_v!eW>~@n^#?t?9OYSpՅ۷HH,i)S.\m2`ҥK)?~oߗ6˗E |UGEVڱ@ @ @ JB.yJjwھpR{Į=S:MwFZݓDx.JK})RѪUbϟ7%dΜV< nڴɓYϙ5\E ׃ggKjS۹APAv>>~$M++tٶ4ucLYJ#((D:erQZi3gT_]hڈݿrn9LA_܇;l%!ĘW/kb=Grl5 .\n=J?F>TNY>njnwHt&|xNO=\YstʶO5ߤ7/( T2+F~wӍӇ+ݻ'Q8qÇrvi'@IDATkBի'{p!88j$F@%KÆEG>g,-|goRL DV۷1[2A2V^;wțT,|lnaܿGO_7[Av?gxSpE^jroɛϯ vɓIrMr-z渼,Yʚ5h ݽ`蘜#D<ݻOEwKUE3zϘLxy>Ν)̙ӈ!W9~Qȑ#˗RQ„Fѱc{޺iPkFDX]*1Zb @ @ @L aJBړtsB[8]cݢ_7s@yK;.pH/<|OI]5>v!ʶnޮaMPv}А74^nf&R 5E&u֭%uHE{A˖ ] .8<!;鹄 jhݺr#q(mZ>(0$/ܔR!GVt67} @ @ @/찷7%I@U< ƴ,Go^+]F??IUݪѪ`%ŏ+au;Bݪ?}(oj>G=I\Eb](irʄ-<)T;B:VT`GL܏:-}f7BҰ 71_?#D5F\cɒ!e%۩UUJ+W)uYSKux*-8L`j tmcԨŴoYqv ܒ*V,lڸƍ-[z|2cj;v9aLV*t* P5R5kVЇR|1 @ @ @F vڒc*qo;w3Δ]y\9ҡ|(kJWi]IٖWjtHu7tj/ EP>^1(.$/()M!k.6c},n#xyy/W]҇p_ȫC#"ht1%L T*6QuCn~ ٰ8Rr]*TE/#6bRꇼ$O<':wL|0^?{iQ;| |/ϟvʗ}Μٗg zř37h&o1ȑ ݽйxum#= Wi>KBfT;СջJkdQ*9ӓ'~޸|.-ZMӮ\ateij{j׮qD^8xvyS|F7ء?KݺVs,yg;ppFQ8k+WQƌԴi%e^Soy|\u+,]S e P: 5+ѺMT#1xƅ)eSxy-1:ܟhJV|u$:\' @ @ @Z vr{{ݔ =ܡ_b_i9]V #rډ Ѕzs"mO۫CmjꦛҀ;F(g>P;8h1N!6:Ler`B4[;;]Ө&ݕϚLe@^WAo2oS{1ޕ7M.kF;mACp(F^a擧=kh3uN7b~ҍӇ4:ieʣ'p4;Fsc%8:u mpv$^h18 s /i@ko{LQ;;@/KmlA~k t Oӿ¡A;ll@`Ix{V ?3ѩS-jܸ~M/"+(Y[Ǘ*x)S vgKRy#*R<'͛Y4zH SwY)ۏӤI i%|#_Wzsq܅O@ @ @ |/;A-u/B6-6%ۄE oW:G0^g59ma>&*;p?ҩ4c4k>(VV:wo [uTiz敲+Ƃ,yK;Sa>/W2yCwW'oUI}}DfXGPxeڴޔ+WFvMoXv| @ @ @0'Ss(! 5ԅ,r}y5V}WݻYXWW0uCVfҎE$HHϋm0C(REJ\آi=Ѓkc74//?@)u W"1|m#GyD;oD~g*hfbC.H4~|7O/8O˖9st)xZ!CEy{>|u:99҂n%qvvh:Llܸt`W3ʕ{h<ÊT(.G;*Uc0 _ܹ)KPƮT@kvO_+MtT z}m_/x@ @ @ `G$q#z15QP*U`0b0>G>9m.`txGEnjVꉃ5A[s4QEwҺh7u(YWwO/'֕mО\:^Ƀ&xܥL%Yŋ'ڌUP;LM ;Wk׏,y7]9XuSØ,TldMisTAo v8AsL; jD7a1?~u!;a [u$sE$N4MH\>~Q 4|jO>Rk1sѭaz1`9Rpp(ݾJ_asW'z.H 6cCZyۗ6XJa1Va$W4mZoq[^CmTaU>£|nvD`zjۏӸq+"/KIGnUj sg S 4A={NѦ%S8, @ @ @V_&akk+(N%76WsTE7m^7u/:CN9 sr9qwȭne޳6Wb8S2%H2[qܱ{F~Tnѝ%FdoJ[\g!e-PB \:\5hzφZJ#RKԩSU &%oekI&3={ER%'sSh?My/G>)Sbsʹb߄osܸTP6ѽu10aP9\ٹfLRϞ DϮرix&|1sر+k~Haʕ{ԣ.p%tskT[iu4!w)'vW;bC+˖ !%|Tce;Il| _A  @ @ @V v r^b+>^4u@l}.C(Mە٠3v i8mL7<7#DRt~͘ vG=I tϒurJHSԜ_P}F4(&wi>Cmv.J?Fhc:ؑ&KN3{8LJ4znLm|`oF[&''':s -_\F|'y3:vKw<m۷'xĔ5k~Tc_:`Ǻu^4hݺѺuet)k 7oeΜFotXz5cU\]*m7IV) mr Rܸߏ~W֭.իWVӛ7ouwW;wOOa^!@ @ @ ETa m71}MY4I&J۠yDAiV! 1c M@*0ʇ/J!CPL;"Us<x~K y<9zCdtlB^G54/bއC1пн˧54v,]$o޼InnCjVWyYvJ,wӧԢ(eʷ;||GE,51g+e͚N\?u0BCԗnt}РTR֭2t|4bD;ecNٖWnt^";D">Kva#VWge*JN4߽TlljcE9 Em2+ @ @ @;Fc6.QQ9[Ыt)AixkiZݔS>S['E9)EpbZ_b:ؑ)+ߦ:仄64հ锷/{>wHIQB"yԮ] Ij ܤ Jŋww6tRࠛ _|Mǯ'#!Rhڴ2Ei VyeѢmmv!K vl,MRM~~6ʶ{)7o)W{j):u={MY9Y .M?8NW,NZU[Ƃ1 2xTX1}zVܣ&t~WvC.\2RlZNŗ&Gb> q, @ @ @Z;V/5 %LRi߅G)& ˛F?BCȳI)c/1{u/ϫyY xCn&++Sۡ4i]GX԰hޓ[\1q?1H<|Z¨Yf6 V+g;w è tDӁ j!㌽`_eC1mhO&UYiUPӦN~]6mGƌRez4mx?~)ew=JV6Iİ'wCC @ @ @Y;θq)R.ʼnWsA>}3{6ҚIC ` 6xm #h&1b J4mj!:uyIT|d/pJ s(}lҰh*\ W3xh+-e4_6rHʓ'؇#Ri:В%Cp0];oewTf_m^Ryk_Bq\s,F„J6USAxvڷ˛˫#/[iy/<%Iĺٹ  0Ӵh@@@@@@@@@@@@ q#=/;r@)9sfKѣ}kğ2;Ξy/UpHd H` ̜v*:o,0-"вeUOYj?hedʔ4 yLǏ_kOH=YA {1ݼ|}?ĵi^֭t} ׇY2SSeO:{DS߼yeӧއ}kWי5cpf Kљ`iiF#zd&e0Ur @@@@@@@@@@@@ #=3;L?dV4uPV3h6fkןZ35kۊ{PϞ3Rر.ɓ4i:bʷvBvvn)?Çgieӧ}ՉbprvΤjaW6qVJ;~T7O /1[ZӝTW-Zd@@@@@@@@@@@@,;أ4/m1v> ʩR|7o+^ըQfM/GWxҹs čuQ4EWn3݋w7Wr1﩯N            HŽxov!!c*Jfm7v-OۤWoXhFe! dM)Ol^MQbժpwj^}Z6"ceB\+'&!bMr}lUa !p9k7A;؎Hޅ0 ͛63*}Q0}ժ}߾4gίZѣsft2Uc,W*Z4sY1}4&;;[m~5B/*c7GwFԴi%0W]hѢzrBTVB^^OiԨeBDUJ ;x-ZT# =tJ9vtX:u-bD^B;v0*a̙ ?YPz?y5T:rMTo{߿?y65hP^H?|ѣ ZgZ$ m,B?}XhՍ앁4Չ}>QNI۝&Zp@@@@@@@@@@@D%찷6&1[bLɓ'02v|jTnVz3S"eNEL0Dllm+Y$ѩ}Q]B6Ra) 8Lj}تP@+:t%>xrpY"X"MNz޽dks~K9D'Ʊnp:y2Z#*Ž-[Ɠcj1fٲ=ex5ӦMu޽Z4y5e!\o,?a:q⒱&=Jδm;^DwcTŽԩS֭Me]f zB(J6mӋ kRÞ ,x!J6mj(7iOusU, sF             3,}}*L}1x ۧgkYء7ܶJ+)XP|rkTL]Um@mG6P.'ۧ=|ti?9>gg~';tb<+hkvuw$p`̘їVˡ[x*|Diɒ]mq]3iy9ƒ-c„nb"Љ} 9 |QS&ݻj1JWlwԬ98'Zލ2eҽ1ӛ_vs?~OoOE/Pq%4j|Oa;:4S[̰{aq!0%ڰJfhSaB@!@@@@@@@@@@@@@@WaG*ʊ=;s ;R+! # ~Lf*JŽa59m-F36ynjS5:޿Esz5cVutxpZ#z=SE ;ucĮɘ1ѭ3vx>8gQSghގQΜŭ.C{eX[[ߋSHH2 O4vb(s-DyxLi_YFgЄ ,@h@_PUa^+BƌaXfSr(7*2,0YB?c{UOއJ'ejuSDxJ Xp7E SA B4IggZ/|Bz >|ɮ]=C9wn'1Lq͛)]:{ " >ıT(,21܏;dȃ0xvKIO{1~"<؄6ړ!]gRb]vpvK=|.$KFĉKr^>lhNkkW Y("|al8d0!e8OS!3H"qK1,VA!A@@@@@@@@@@@@ 2*쨐{JaS Ž4P!Dt֘{LL&x'%W<,h".?Pƍ"Vr횗wȄ&WmLر}$%RJ R ['C*baI%!QF^Fɓi0aJl 7%ԩ En3^V' fr"p&*"v03Ϩ?8 ?g)aRFka ʛ>            %ŽRYJ>_Di.,ER X)-_ʇ̅ðp8b˱m)J6G8myI)*ۥqz=SR6ⴢe; da;vЮQ-(Kv&=n1ncX%#FL3fG&-G ,dPEjƍG)V*Pnɓ涒X,XؗȄ..iB Qţk͚Q5X;zqAuk~$jvTkiעb|ЧTυ            qO Q ;'ON3B=$EQ?;Q aG*9R&-(߲N4 U0}N !9rd7]aǷ"`6#PHp0gҀ%)Kn s~\*R(W\:&,əZRv:w ;o5tTT4wuo^[eA>D; ryts2v d`ʛ7h_jG~4p`K1B-[¦<8CwZqi(/ի}"Ȟ=a(Xvûƺu:EtZKO~ҍrLiiz7QVCh"t`qkr~ڴщk Vƅc,7?kGk(Eaœ١[}Co_1)H9nS^1c@@@@@@@@@@@@@vogBgӪ1=69sZSL'0&9R)aX8ݿ?z<\3Oȣ9dE>u 7/׮jwHVUCdB۷'[[[u>|h?Ҕ̕\nT1lX[UK3gp!MK_ 4-[ZzbAGڴ4`|Qyi/P 2\B"1ըQJG$8JӦ&+;nLvx$W.#ǣG[oZPCpy3w;E 0*2a%f׮?:ƶUaӇB" |ΝE 3Tbf o bd@IDAT|0Pt#*;&SԺ9?8>,^<ؕEMEy,,ta~D'P둕)/0_yk ked@@@@@@@@@@@@>D%81vfŽhJ*)_[z#aaut>e(S63#vV ;dWwBT:>$0sQ;&)E2pCALZQ Wk//ի޼y3mݺUΰcJx}щ1u\t0>}w+v`'No޼uNr'Y;w$ifwJN'GϨKK ;w8ETư>)_BeK,Rǒ(vt름i ڵ@/^ *U*Jcvk"y9#[4bze)SzjuYqw_E>6?.ФI.(!JձE_Fp?'~B v_u\bv[f 1xQn6}-φwuLG~#˸RժUn>Aied@@@@@@@@@@@@>;>hӸ 3(_vKS&|/:wҹPI;gZ@tIpl٤LEū7Pؘb԰ODߺBwQ9RdkH8v!}WZ$kޥd6Zy.5=uk^{쩸fǝ^xA{6_H.BNƄܾurpH%Aɓ׊,T`=#GiE~2V?y: /}*di'6fڴitֈ W!aWI!0Nv|JAZQ|dp[zް:O ^` +8vpe$\g,.5yOnOm0p hFZKcZ]zk׮Z3oVD sZÅƐ<֔#wn'qX. ' [lcMbprvΤ;1pǦԤIXw+b?jFvuƮ,` P #a;/_ԄƄܧwFԢEFfD5oƌBbJ~G7n<k; F ;XȲexaj כ #iݺcooGf]y!͜Yqz9 ;p/|߿ƍþO_CkçփЕ"ֺ=+U/guN#sbUxGEs_GҤylԞn{Z9*%)&LIJ{nZn]T@,#aTvDb:'gʖx矿"u!{n^PCD70#RC :mzC|(aYӧ1svr.\B uyt/@A a;#>˗U/~NqyLϟ|=ӥWB8+a\lKPЧhϛ)SZVw< &S SW ;DvjϒQpaͥKw:w,Bp; g9ekg㲒bD4gsZVfRښ)٩h~MmQ^(gk +,fj׮Fi,:;beaG`$ 8'tvmF߾ 'a)bCgdavYӁx3Of&iB =s` v*NL $KfI'̙)cFCV% 4GFxDEq+fzF}6-0U[l2Dq\            e 2~>ŽXG A(kڷoZ[x'm~"~ di[мu/-7Mj r1X},4O hРA/_^z*@@@@@@@@@@@@q9w#ʨ@'/NoT_jU_}v:uT'X!aG`I = @ i0332e\m}1}kEQ            @Žx-!숈@@@@@@@@@@@@@@@"aG{v$@<#5ƨ@@@@@@@@@@@@@@Mv$aG{ X#;[Ca @@@@@@@@@@@@@@@$aG{v$@<#5ƨ@@@@@@@@@@@@@@Mv$aG{ X#;[Ca @@@@@@@@@@@@@@@$aG{v$@<#5ƨ@@@@@@@@@@@@@@Mv$aG{ X#;[Ca @@@@ f̨C#*QЖ?6:7'z;zEAA%;⋼Ba A@@@ ,̉&LjۓQHgr{ P2K3 U4ҨRHѮ8'aG#vD    կ_Rсx]dִe3Q;ԾBt3@@@@@@@@@@@!0 r.M.ez^nd\/Aڊ:u˷c fJOŊ'. ̌4(O :SŒիiDNN25kOӓ'/e P¹ Q,{B/{қ7luӧ`cS޽dk\[O?ͧkkjM{$dMś`Z%c\pҪn>OkO} PC@@@@@@@@@@A={B4@h=|XjL8{ح2ft ƆU("Oԃʕ+(m|/߫7&ʔ)@Fu)m.ۏ4nJ!0 7 Dϙ37g0Jˌ}xqhJEM.\0}z*Q"^\2d]xWJt93+s(UzuqQ2s򑍵ΩZ$o:׻(ݾjY;ZUnAL珸,QN          __k'#0b@Bvq-ڡ$ȝۉ~y0cGDr"ۡ$zUD& ĥC]ĦMGiŊ}jaodeL7\N*3o!:z}D}KAf}̓]ItHT H` Ž@o@Bv~f=$ضm"Ic'mێkN :yʚCgt8Io(@T Ķ֭Gt?l%,O{gc:qX!N&PδjU%ӅH ԩSPӦ>}>C*SFdtb}Y}fV5lE1;Խu"28q" oRtyw~I rt>#8;6E4Xyʖw ;z>ʓXR¥)G&Cz.y]\BCCcʞN=K\hэ>vdaiIe궦gӕ͕dEQ)z*4lOi2fVkoіte*Z={NYO!+R91q)B6)5w,<#w g6)uQ*)Gdmߺm]ygItʕӿ7s&סO)+9f!>>dieM%76/zg*EUؑə2:iZ?S3ft Ɗ?.ФI봮vX[[QѢ@ iիu/bch<Ày{ ⒝RC yv#{pz9:uҐ!EޘhP> [8z2:sJ6+WqNN66ć/{j 3eJ+.]$gL԰bѣv h޼ H9gԁ8=+4j=3ۺWLTJ1{כv9FbO~׮y 1Lժsg א*U ʗ/_qmѢ }O/@SegoD)FlĻ5kz1=Pχ| _FTHn5?<=u/q5?KY45cF_*^<֔uOmVU#DGL 9wӧ&NYm_|U~?y='~?#ƪy~7o>u?++KJ;~]l*~>} QsoS(g{={znKukZ5MZ&~W+G`*:K8-@ @md_weD!ӨX"W Q΢naeFlO?PDkԨ\ |Xbeþk, 0a -X0@o;iZW),Ȓ%Ƃ+'N\KmTSu{R7յ jbQД)5ZϢ"+BBB}fHqav,1X$2bD{baϟ9?}?+}}aQoiBfjpȓC sDEa/}w%"a).*.G+*:LwP:w#=Q3&nݲzu\x5 H6U4n<*\#Gf°1sYgD߽ޭ¾{jeMftZ!ӮE#j           ^SHqy;'ONqxרDžFd`qv6 ;2ms[" !Djӣ[EQv9Xbܹ,dXMnOQ?GjF.da Gx} fVk & 7ܨ}غ0Ž8mR"X%*Ža;vpLhY?ͫsU": ծ]&ҥM ;^GׯQcE;Y[Bl:*ʝ:զk< (?ؔ4 ;Xb_OiI's덍Qvc1!L}䫱9-)w/O Ɂg*u3f^,k`j??8'C9h&y-[Sjv=3)~~ԨpbȄRuML2;O]U/ :5J%5n#\oԿ3q%vN>'W=ǭCao^,-~mw n/Z2           G 3~#ۧgqmNZts%Jq*^&`qe;WRI*ݨ?c8Un{tBR֟;w9YhJFvp=9jpRjuHVm!s4 cL7٥Y߳t'^6!bkծ+yӻӕ?+a{ ^Y]==.sLQP᪢Mn+]Z,x-[Go T)2a',^)MAZ54 ת].&OֹrpǓ'/ γF q5 %`בV9RQPkcN&keȇℶmk(~cǮ/}iA Ed(={ q *ad<;a" ұ$>Xd␞q.u)y0V^3˜~%GG{,y>N$BΨus*Տm&vzaוtųQ۸8.op8NVWB1YjeϞQk"BtZڵ!y=v>MQkv;MO``ĈG%5 ׵k7Aqx6 ;8V$Bt,.<|0͇un[Iڴ_'vyr\X9  ,Pga%eŽ7 7n.|X{YTbNdI,S c[jƘ!"a xj6m":kTNNMQ!X~Vq-EDL94v횬|1Ukx=vlӛXl$'HLMb$3[os.O6uO>vbJ[N⎘;˷ 07iܛ&f3~\Eˊ맏Қq}Hv.OkBK@٪?h[O,brR9_8+YWOq>ehzj#4UyQ_m_eZ8Gf2QQQ,`a&}= 2dw㸭gSNPUvڵv-΅nWPҕD祿iЎZ`“Y G3YW{6OyvT6daXXbX4taQ͎jbJ!d 'W7> C=`=<6o/R9PiȐTs5rs[u78ѯ\S{c9ɂ]FZ~m7l8>~ غ}$77 30a 8qIqB>d>-լ-]Gh.y,va 'аΆÆn_e;O*!sW/^K,*P,`̅ӂ?8l z8*BD0̫ޭ/eW]v<{ZqT cvf˖Aqщd L ;xԿ‚5Li#ؔ,Oѻ7 AJF~Vq-Ϗ?ܦaÖ!?Կ;r;\]g ùwL,Jh%I. aQ,H"UQť %"w(#ew 5%5v%zսFvU(LN0`nSN ܘ5a*Tw v^7P+:WгjvG'Q~X _ҵ"vdȞ8(~ QED{6(wm? kzhNZ`M̔}W(iŽᝌ* D E1.B|צ"dB1a;fNwzC; 4i205lX~6thݺTWOкuc(KGZbp>C{Cvss2m%;gPGj[}bɓ }s~{nPDKڄdBt!CdaGD ]㱆"SvOaN,aa ;Kbݰnc|^jZرbp!ZkrXĕCôlPʕ+6^nÐ          I@ ;Rإ'鍿/鞠#}Z{2{?}Eۇ9p({Сd=ʤcI_Ž)sS_}D gh̰>a}| ;bc?_Y,0x"t.WjQuDvۧT)gJ(Ԛ vyQ3"v?~8[yoDS>?P& ;޼y/D )Rh8`|b$+p= &MZ.\1ka;c 'فF^g|Yib]8vȢ0yZ!PI            īB)] 8vHoVl8vtvHP v$laGZʁ3^auXݠX3%`!GĽ O'lSvDemnx@4٭['C*Et {ppp>|ٓX8aH;bƨ@@@@@@@@@@[#ŽRYJ |QboooOEߤ7Nnѧ|T>d.ñ$Uw aGvڀڎٝ%0 I8jq%GNA5;L산|0q'O^ŋw~իw.LE:˷C @  P9h߾¹MblӦ۰/v$}aGj%hԨz;N`}Jc;evy^ ;8Cf9O( eNsJ,,Ԧb͡ʟ827(atQ5y΄a           sJؑ*~q!`7*ДexނoM/S"o# ;d 5Y$iNEk}"Q&_Odftm6:oh"          Q$9rdJ\tߊ٤͔FL#>Xo+J 0u5\pu0Um[=$|Ԥ8Qr 28+ew)Jhd݂._"u<-F-YE4iZ۾T@Q?k-zO?rGʜ+4**1sv(Gdݔ%wϝkiI"~LylRp~ځ]:6i~ߢ9hm܂<~Mc]8[a\ ;gICVuMyuU^cl#vߜ5^7>}7&8xpYY%Z#KD7yxRaǎCp%0a Z9'҉|˖cnӹsС{u2U]-!4-ۣܞ%#[7Ft5&QXt$;vEvM$yNɓ[75S ޖj,-K_խE%V!Hv'x#C1JlOsss:rd:upI~'R i֬D[;5(]oǎ{=6X̙B[Sݺ:P3#F5J9^֭E^=G*R$JLŽ ;SJ[]ҙKanA/φwBH[Q~           E |}}cBB,^;%)_1|6s}ۉöp~(Gqyjv3k,;Ƚr"觵ņ!(U赏V53i%9;<.߯6kBv$MIw_5V~ j(^5{:/Bj.OtuLTϠcW4F7MchQ"#6mW ! ;S ? ;6lp]OH3FŊ2etsn҅ wtVڶՅXa!CڴH:d˖V)\:gk|ٓ ~0">)H sތX`:*$xLvJ:\;M+&N\KǏ_a}| ;x}_#!;Xt5ը1HEn,^5ŵ+BBBMw!F҇ĖCvYhsR9kןJ:s&iS4wV>uꔡ!Ch>iΜ_>-ZT޽i$8279;Y8K#f#&3Qz:'nY`%K3fн{5:HTŽoD-pQH;daÌn)8(PmeRKƩ{2gA48XCkX5\) ;o٦҉?GzD9*.5+E~Q A 8x,,-Z/F][#\6ߣMKѧ@n26l|ꪈ|BD';[ ;&MA]޾H!UԔ*U ԩ"ײe =*%KB'p'>Ck9Y[[P;LZ Q ߉<>X`(عs29#Fnz5T4vhd4{}>!;t?DŽ u>ӦM4w{PϞ3x9zI~WbK!EIݻON7z76R9=U^R[ yX0wU*YXA{bqifuoQЧ֣P?ud.{~KC=… Ӹq:w/8n:߲(O          4;ㇰ#RfSj5t։]>G|_Q\.?1ߏFCF'%1J9QRhHݻr޾!Y5nNP" ;mENZ'vO3g^?~j152aGǎz ;cfwmގכiZBS.(vETEATy@"RZB@HB!7wԽ{+9ٳ{fwg~3 qACcڵk.BMСy=1h)\VTD賤Jo3@UڞK>xڵj'<$Ǟ@+Ygk{i4ɛo ; o~W_o+,P,ڞRG˨' [ks.2F R~*G`֯a4f|p ;ԺGo 6ϋ/nщ;@u|~&F{p3BWD+Uݗ\=qzm_CIu+墋~`?6g|WWB`6+%CA5w݌sR' h"*\ڦ{_`\x`V`Gtn]Ifo}w?׿ьi?}zIoawA]zO& W_`޸Hpyѐ/E>;\}{h.p7+{\saúw3={ qeU~@@@@@ #Hp3ڴgeѕf]+8߽-_Oߵ0vh{ ykkDt_ͰC6[7o29kC:|{^q͛0?׌ཆ1.9KMͲڊ a5?Oí٫LV&M᝗23CkFa]s) ,s@ {~\ycڊX =N[̡ .)B~n>o6?Tn0ݻ˃ L*X>Gu^7on{ѸsT;vՃao u{[ *yd~֭u}2_;{Ai׾Vۺ.2g]/0<2!ᩧn +@IDAT墋“z4Pn0˖޻j*ʃ㖭W-_(͘1?J'cqu9 [n9Q//ZLs u |{1vbMӥK`hɬ|?i>Ãϟ{ swEU_L4ioĉמ!seܸ.ۏz9A`_XܐH|A|;O6FC.F޷^;n^B(-yM)[`kݪd{hצW.MW`\fcȒ47>\~qp. rM[vrQp}Tuu=5>G@@@@@ QD|@`Ga;u1C:ҴPee͞1lJ>KSpPQխY haƤ=P`Vg 4ƤcWzǬXTm|l4^ N:$#:3qIJN6RUj+@cڵW#-aԨ}ow 6 ^U|мy33g΢=2|쏆5j߿G ̙K 8(áUw|CMn7xA`|v([ R>*o:(snC漖W@@@@@X;bY7ٳf@071bP@1RX:۠a٭e;v29=V^P;ٗ1^{qqgO}Sq1 @@@@@țaf$aY  {yoƌ90MVf}`4,RcLK{tja Xz+͟-G;Uƍ3_Z_B@@@@@ $* 9l MXŒo=0,];Lά5ќgZC~fk+o6$UV̽kve.ReKaC4O@@@@@ahXk##'3  @;̍7e֮--Сlt_ׯk2e뮻>     '@`G;*쀰9 4AAz~g왍0/5̘      P^;_gv!a       {v 쨰        PF;ʈj;T       )@`Gw;*쀰9       Q2ǭ8!       w Qaǝ ; l       e q&#Ni       vǝF@@@@@@@F @`G#8Hl"       vǝF@@@@@@@F @`G#8Hl"       vǝF@@@@@@@F @`G#8Hl"       vTq|9ENfۏVi        PvԇjJp-gK2,~Gf)-        @ QGfܺ̿ aKl       %@`GZ6݇'\a4$Y?g?        hEfgfnߞm,@@@@@@@hzv4cڼu3 cFl&       #@`G1jeN̈k^>+̺O@@@@@@@x;a[~xS        JU|:5}`kva4ڱB@@@@@@@@4HS5L6Ufle٬Z3A@@@@@@@hT]t ljjjҨ5L>f l       .h;ڶmkqM7w VyGej+L`         Pq&Cr걣K]8,zf@@@@@@@@ =Ѵ~        Ie 8yM֭͂UV&mcťy۽P       {@;:Tu4 -07*PP,E8| @@@@@@@F Pㆎ5:cG' =v       4Rvm^{fyvt9f{MituZK ]kj~)       U`AGm变G̽f·8@@@@@@@@ 4mۚ>}z`oÝ#ʹhS9gG׺xE@@@@@@@&$h;d;W1 o1~r(믿 2$'0o7on>ӬY`Ǜn-2       I2b:pV8[{ٴhj8-7sk/2jժo        @ Qy$"ر}r|M6ꫯ6cƌ 2oج=kfӶ(@@@@@@@@`7Nyk锽        w TL`G\l4$~̔%ox       ;d~1; p7yo        {@v]v槧" z       ءԦ7~b&.|%7        @S+̩N '@@@@@@@*:G)vKl۹-x        MY;7[UO~_Sݔ       qn5C 6LYFA@@@@@@@@v\=:3f[smǃ}C@@@@@@@BWSlo'npy       4e;e@@@@@@@@Q Ѩ       MY|t7@@@@@@@hv4#       @Sk\ox\p n{3|<7@@@@@@@@ _veHz3kpy       4e>no]ߔ       ѿ3~l[%\n8o@@@@@@@@.PсWΌ868,j췛`@@@@@@@@Pb;tc~}^7͜Uÿy       4u Ѿ[MUS?~,?@@@@@@@@ C;>|Aګ:c@@@@@@@hqHC4 4߱kk/'@@@@@@@@`o֌t|mVge欚N         7 T\`MC7ϼٲ}t,W@@@@@@@@ Cb; k6mhXz        TL`zo@@@@@@@@ I$#       e #       Iv$0@@@@@@@(e>@@@@@@@H #I        @(`        @I2LG@@@@@@@,@`GG@@@@@@@Ha:        Pf;|X=        $@`G @@@@@@@@2 Q@@@@@@@@$;d       Y2V       $ ؑ$t@@@@@@@@vz@@@@@@@@ I$#       e #       Iv$0@@@@@@@(e>@@@@@@@H #I        @(`        @I2LG@@@@@@@,@`GG@@@@@@@Ha:        Pf;|X=        $@`G @@@@@@@@2 Q@@@@@@@@$;d       Y2V       $ ؑ$t@@@@@@@@vz@@@@@@@@ I$#       e #       Iv$0@@@@@@@(e>@@@@@@@H #I        @(`        @I2LG@@@@@@@,@`GG@@@@@@@Ha:        Pf;|X=        $@`G @@@@@@@@2 Q@@@@@@@@$;d       Y2V       $ ؑ$t@@@@@@@@vz@@@@@@@@ I$#       e #       Iv$0@@@@@@@(e>@@@@@@@H #I        @(`        @I2LG@@@@@@@,@`GG@@@@@@@U`GǮLl\lٜ_۴oe:h|}zy@@@@@@@(@ 8늣MNmO2sX\gg'™+KN+x|@@@@@@@hFѵo93&~Q-yiѲym[]".: ֘u+75ҽnٺ;ٹ}Ymٴ,JhjpkpW~&5qf@@F,h;ic=1m[oy^]g[yܵOUU֚+6YO6-L=[6lHGSG6 ϛ.7:kǘf͛oٵ @r4_ Z|Yx]l[R@ێmfGhR|6oNoHA"iЭT=uٵFxM>#MUvO1Fy>|[{|w7wzv_4k<w ]a^~C  Ի@PO_36<|ooe5C‚w_y߼ ^F>_8!fY~=3|Sˎ+_x]kܪ.+zr_]ŢӪMZJR si;/Tx|ˋfۖ†jw=lzñ]̂yu1ivT t26o7 TC`Gav̍@C hB*0 _{R.  @% T|`ǨNF>5:X.۪[^Bhۡu@Vkk9`t]lEon&1ַʬ[ɬ^l3XyfSh} B~[xhXض35\t3TClߺgL+e:N:lWJvmq:Ecv2UZ%Bof 5<ѱޕgc-s[;yVSc[uVI;mjߥOi[, ;hM?ѴޞֽyؖL]t R> [iaT|rtXunW7j]ź\ia߯]1 6Yl)cKU2I5%m..\*4}{^sXL'kL Z۞_s^v{ު]爟7θ)tumߴE׎l-ݭPR>cMj۩gyeiIIyp~Ut,2:Wu[\>}ʰo=;,yo(|uS8!FI&TD~֭ژxEV^THw?t0`&=z[3j~ݣZ?7Hk[+)C={D{ɉ~^7tezP^&>D,UzT9>?y޷G.'q_|UJ:za,:䛺?Yx=叺7W~ȆM9aMZ/s}Qc z(b'5P3su[ow ZZoo l>!;G_;5Y8 Rx@{ 嗺Y]F{߀M{=罞;u(}V\raqҾo]{o嫼ES<Ǹd>-<+׳Qn|=fh']SҜO$^~?:u\6GyhZϓKJm޻%{{bCoYⶅW@@'PiF 3h E?LR$sWxxjNP1ʫOr̬"}p KU=n*|yMK՝ъceTɦmtSC479|-a3O!\t_, VOAJꎳ3 +ܢt_|Ăͧ?rs*Rw9_dsg  u=&%Un($WRP_Q'ثqߍƿgٓH-#`%ĝ䬰P;:OX`_~dt$VTyŵ wJhϹޱ"q+*|s!}O^SnRR}s -Zͻ5" RG_] _lH;d\ȶ ZOus}hR*Ey]T =FU u͊Wr]Oq~漱ؼnʸT냟>tLJm_ϽL.5׺:v#C}v 7C$ɼ4<&{@c=J\εO2-syMYpwm=OR`G%Ck:qpKvY}1&bMBO *q_}eGZsb;}o]Sgf MHZbAPB,%O1.L*zΖҼo˶B>ĕE;fڄ/^t}I {{6J;݅ _'+{M_Rpҳy3ZZ&i7 *3tN{qf;3=IX6o5:xqՙV}\Zj9J c  @4zhѲyPjgJТ>RZ9Gg`m- K~™+]Un0/a؂qȘgT']zi{QT Z澹8(ׇzwzPʽ?n[[ѫ ۉY }HZ.hN\*3U)MRGB[ĥ\PZ+g`_nϓwL&{z7H;K ZuƽR_:)cv` T蒔TX_pu*TWRЀzg3 .cr%/L#h:9>_ UMiv sExtϿݴ|^;-GA&~Zw'~7)ֱqw_Ȯk֛OrEzIJ:guFS(뺲Kh r#i%ve~t_m:EA?ͽ/5r8n{!6q; 2Kc-ףZ|G+>ߺ?qKie:-.C5 NJʫȮʓ\IYǥ8֓kZZ_Tr`}|ec}NB}vR u}\oQ1\I۶>P0{V7!e#2*ݺ cջi6N%sW+if`Gmi쓂ϺgA$ 4ݶeNa=h*-?#W-˃zT9|L+P4d+Gq  x*:sF}6U&,NȩV- U|"Ch_Lޔ%uv/XԇWGQG{4v9Gm4N{Uj1*LԢ߼*}COfۮqaPCU1Z` ?Yj!Z)U Uglj:6YT,jx3ͫ<'@-\޷VՕz Q*PUID((Yj68H.)"}|Rs4 *՝x'{pWU.+;TAr7ƄP|ۓWAR;\Z e*xHꒆa~'*%4L4kcu)OTjIVԮ5)LUc.ߓzP*OJ}P&1>֞n h٪Q]Kž27]:ڱ}_491tːZmٰ5h{{c|ޣ7zpۡfNZs)S.#Z쾣[j)7^24O\`%_uiwT`HFC@?ky5GFPJ^VRO'CFWRTߡKIOŪuIkg}pxBWO?/Wecic-'͔СJݯ~N*%۵u_{I ^}>WqoZnZ)RM4ĝ?~^Uе$.M׵^}_ѧeTCQE3>;ƪt鹱pa/9'aOkV>=vDGǣPmK1(" 4^ ZH) M~t\P*U]U0I TYk J̊,dhL%U~4E  }{PQT7 W"*0TҐ, fw/:vaU1xU'|zy-+a*X9V24޷R;c\IJI 3{g/dTZ]5+i[U~R7RR ju.B_ p_O0v0 kWظ[^̨ղ-f{5ܟ毲{lmh~FݐG Uߗڑ1v_Uqpk u]P r/>2G32J}vpC;=alqZ,//Uy|/)l>깶}f5f ȸqg޸Z"j0'$W>vz6ر^ϣ*Kٹs:!R_{:{FK[|Iuv 2/j6xԪU]yk-Ϸ=vKvuK'fj;K\'k1~Aj֩CT7|ح HjyWNd?_*}=Bn /_E'0b@yJ%+\>߽Wͣ0uDвCt1yTlA\mjVmѮ];{_UzB"hAvH+HWi(#< juN% =yQ0,{h`G4ӭKCиa4,OUq6Iy?z4OO+׶rOwNˍK U.Afɜ!42WEۃmƍ߹+6?q֫^g(ݣhzXpIrݻ-ܤ /襙늂gOC^ihJɫ`H*a=RLWmCܴx[WtZ>&;S{3v=c^ wٞi a\pWy \ڊu{tҭǿ݇T&֩^. `uIϤ?~^(ŭ/kgl 2%M|:çZ\eθ \v*_req3 (m{+RгۓRee]g@=+ߌ~;J ^&z}hr_Cǎ4CbQ =@@2*2C-#B¥ *yҫ߻@\7uIsӣ䚞!SjiVѤ5Ey+:0]*%ƕKUD{P~QKR Jh['wq-P|zUD߾}IA+ŋdLЦ,rE]!Gwu Zĵ\J{۷3z|+]EzɎ{+Xzp-2szQ,Y$g1@B<.qˈPuå120Vu-\qqy-?ءȳӝS^m j/|ұk;T 9]mpRuqh*%#n| .z&ъQ}dR%?VV8ͫvo_s]qaʫ y^% 0V^_ e P[/V5K7! t][~hivI=|~f]]R/RmMaMJ _'̫rLJ m_{?#z@=c^~3wjýY#@JﵮR^u5ߵOmo rwnܫzDruu+/6?I_ֽId^}U BSnZ+oO}(_RtߥnIqr}r.-;Y~e1wԿ>3^'WCmk>O^eC{4]f$t/{ϫ>]_S%sWl ߿_,jpᢌiB;Zo趩aL߾}2&qʒ%uL~#hSŖRotjhb7Kޯuw;F~kϓq/ǎ|_6r}a  @ nE"g19AUz-$MV~`G>CR:nsCSWd}sݫ8g7- S>{XPZP}u Xfbѷ[Gp*U!|**T`-_M|Ψ<:;_=η?>oa՟>@?-XmZ+V.j)ʕs\wqצѻwoev' òpay}/5@=:o\ZE^_ ܓV`zY:'IJBVݬI[ICvG>}2^ ,j.ܕ?Tʏ{J We&U~Fl(ؑmgq/}K>)C%%?#i^zQ4g= 6U`z)$.[w=J}vɬ'\ֵl=:FJɫU\x폫w|b6rp1ɵ- F|xJm?N"U8$h,ϕ+C5}/W[vؿM##.Wr,ٟ\MRpU~;7j0&>{W%${M3 ?_6Xܞo*OqI.]YЫ3zΖҺoC4`@;dϞ\}h2J wq?}Rb>O]Ra Œ}(qGi  )P=m<6xQuzpPkB hrZJzhVZa-PzȖHqQWZ]ϰْСiݺU A ]+xp5Ma]C'fJq{<ѲËIT \T0YݠJ\jmh߾ lC>cקQ?PjC?eBo,65.[Y}vhи@óc?N=ؑ9;m|+w4};4?;mNq`[E=v(O Uqො-oe~R~|%ZءkG4[ϯrvTQL]^lBl؂|L:C)=暵9|h(s蚨k؋ fQ%{ _bQҪ cG/YQl~m)k.z~ci]VhW:k Bսڵk't{m =vmw4YK}Uҩ2X-=PМzۋB3u|y,/w^}'G=R^a^H4zuTR_xJKS H{U1z~w35&۽|oyn>lW~B1'R•4ko(} [grv6}ze\G0v3EQg}":A[ǠNw|[Wp+qiiݷXzo(۹߇6YTcEgQO`QɺK"#΄i   'Pqzp>ɶ@Uf1=ml¨U>kXi(6糌4;X4n:QWSTgvOp-Mr&᾿QYHj-/NvӾxQ>=_S*~T_֡&%0}@Sm I/ϽOuҨ;gY>?y\ܤtCD\_U>U׽'WW-^1x^϶8q /G`_@χ~>!nӂo(EU6ެI !n 7 Wv{wo%] Y/ .p]쫆8KGv4%w族 ִ\ _s]Ode6gTؠ#Ai\d_K^R12/_׾*;3W lTo1 Z` }C36Vq)m{oOZ3MLU6H^Ջj;JktDv pۣߑPrivd{>Pm(q|K ($[O)ns]{Zn9<bSa  @C T\`1<( zR3w lUJjyد^)x|!sckuw]LJ#@z_2Jbuj=f}/o^2Ta?a***aTa|uLJG@{sQF?NmwONan[_6۷-SO .5t`[^;z9ĶUxɪLϖ|;J,7 Qu$}1[v9;n%W*AԶC (/+DWRxk[݀*m9W",i=N nA"U;׶G+a4U4e 씊='U.:i{ &q~Z>6ʿ"'!w3^ yңLS멻)[!s0s uk::}^Z|wl){;Ʊa ڤcpmڧ91i\l2{mKXХ9#{wm~c S^ca=\'f}*PrcoQM н;/3'<߰ȫפOv}V%?ii8˦1☁FiJIՇ~h~x`8tCĂwWL@Bާu ᗝ,¼`fnJnYI!Vyu!hfƘ0#O䠰\=}iVJ`G_~Om(@2o{SOeJq H$6@{VmZڞntS^ɸؑ?EއϥmZ bD@@:=m | .|w~AWqi{uZՐ,~J#CT=oق{UUlsw?\~! ϯ7j6zr@kh{7~{(;8Q+ 8+T 8mBuLͿp~rCvH}*%:/oE@|ϕoih#۹%~P!˔_iؑKO?^R12|7]89yZ4S#l .QJ G]pt8ewRGTJ^&Uh)Âvi"/%տv~Z dԝMͲ~iTZgPo5!.caa 2í8cB8+Dzތ&)ϥP5~&[eӥ;5 2FVʦ `?uAR>wO_nZݽBJy﹓Y=ǟ{՘p5qy\ιX{'d{(.So;c%EQL`VIoOm/dI-; H>.M3ʖg{յB>TJB@l +iC̯Ry~7ivztpioשP*tI]ّܑF`ZѩU ͨ]RY\JqnR_ -kҥT&ި+5UyJhR-jR%vŜti8yׯoWy-Fy.%TYvT_}Rd8apIT-lۂvQtwb}uyٹ=hd}:՘}+cۢU WP^;V`OءBIܶs%n3U_]MWFRZm֑gjtu{=W+]JE3c3?~/A2:ZvaF`GY?L.ОTIߪP|ϒZWŚٶkjWhf9i0jd:UZj[3/aQ_|I'?*(*̑Oء+;T0BhW+_ucC&ۃF[3dtߌϞ:oo=Ï.C;dJtͯrET7{̧rm 9QZ|d ^Ro˪3{R8mGصmjhBqOܢWRm維3UvlA,~pkZ1^(iUD{6EAH.IA~ i\e3#^Ik9J R`o\YN+ ;tmoݮepmVSES8x-_UۙӿxdȠ^tl]\kfli.xI txW`4ӨӆHz?. s#➱|5оDpeqM{ZZ8&\VmZ*C+_(/pC곸kmZا`h@'I JھG>wж RO|jUF=u1(GqQZF!i|ۡ0nXXLxҺonCZ6wV_Hw7HwJH"(]"- HI#*)"H#]R JtKHw2ݽ{wsvvvvv۽g9 SmL3Ӧɚ԰Zvz='تD2ĨpF_W.4`W*Z+be-mvhBs "â_u`ݭN ky n6Y>q\ 0 u M@cX@/%.bg#Oޱ]"+^2Vb w(fAVv'wldK[}yz̧*Jv`9%#Ek3VcqSyحc|6ؽcs};#CX ء9QO -63?w}QaI=s~qn=0cG;qbmw 96_=hVp髄u>/N8T:G\gem.0F`F`"!v$K)a"/ؽ "'>O'~,i~."0Y<+H ĢDU GoBA#\Tߨ0? .FTU!>u;’i1ᅢ|lJ7KArS*cF7,}4"+wssAۈ;rJdJM H; pVo?:A< [^0bʼnl=waňӓΰc|k}"w;Bz$ܼ_N`i߀јc`._#6,(o{N215n@"Jtb@Ƴ w}95ǖĘnC16V`;09Nҕ]",A`7됋ҏ]=V0FK[?|8D`D]#[FQ#0#0#0@#ĎG\BFXI4GdT#NOε{T(YF`F`$eXkuzp(>wSOa`F`F`F`B`bGbF`F`F`F`F`F`F`F `bGP. #0#0#0#0#0#0#0#0!0# 1#0#0#0#0#0#0#0#T0#^`F`F`F`F`F`F`F`F`F`F`F`F`F`F`F*T 0#0#0#0#0#0#0#0@LC#0#0#0#0#0#0#0#LaF`F`F`F`F`F`F`F &v`!F`F`F`F`F`F`F`F` &v0#0#0#0#0#0#0#0#;B#0#0#0#0#0#0#0#0A;upaF`F`F`F`F`F`F`FA!Xp`FROMTґ)#0#0#0#0#0#(57NsѓO͎g`bC@r6#04 'R۾ǖ9#0#0#0#0#0#T{:%=yH3MŇeB00?u#ڐ&KA.M=Ԋ05sצUnpI /v,*7 =|68)W`Fgx>s#)p)CF 'Wj4G%3^R>802PsRu_ҥ;UF `bG$Q|hTe'S:sp7e = 9QU-Iq%0?]C:oq΁CdɼT`v޺u֯Eg^U#%O !M;wmTJ;X@nٲEg}֭s`HX'O]j\Q09O74@dH27h Q-g3]Jx^3"$~\^Y |*VRgN_ 'Ӷ_өw:sODIe]n]HMʘ(SI;h_=S0u!NǸv-갲-]|#`bGxI1FX4h~tҝW _ѶU i㖸kU4w>I,%m?P>ܱiŤȠ?"E\ kv|$ >C;b-K\/Ҙ1d5{@ժuU (lѾ0_Tږloaéu_S|y}7ާ#U)Meeg/Q+3 nljR|ɋWi8;L?#m>xv8\ɫG qw~Q1uȂ{gH#/Hjx$4,S45K޿K3JIHEus&C5yTsaoŤU2C7|HK]烗b܃WΟM˻Gx,Iɂ N?TR2a=1J^SK6)޿Gsu/գ-ï7hMY-K g[ `Օ9[-X<.Wx"%'ms0^۳~9҉?zģCͣZ.Tn t3q)HNO0'k|܃nfꑝhXgm\p !gjk gz(5?IvmJFilI7PdkGK[ˏF 0~A}:UM(q>+Q֩>S#"Ͽ_$eH#_ԗ5H CDeabGN3M9qz '&FH4 mYS?VT/!ۏCCS&N@#[6}?G!;ǁD XpWnpOĎĎ,%dJD%bGlyQst'vXyP*u "q-}82>XueNꖸm O Dv hڶ={7|5E{'K'.7u/{oqQ)D}"{>nQRGPa?{oK7hLg*5t̥{ DޒetP-~r&8+Ji\ڻa.'(09½̞/%4`ubi۩S'Pƌl.\J5Σbak:V[N]j&[υ.4/ܒ!r%pIKHN"v w7 =z;FQm=?elE\d#3v\z{QRI$?: P"R %JJF9o͜6.! qGPD)uwK\Sc:/Qao_y B|>:Op< Lsrv.¯WhxEb X'^ʔvye( (|sAm+Nu@rT XLYU~r`w^B%?բO S;nVx<%^}"~ѵ;bĈ)vP6 SLǏzTa|cY 'lOG5ZM2w'9vC8.XЏӣ]p)z1WA>{'ٱ1T02@.:"ϰRB-oCdp ?%N_b̘4o:eȐIreѵkl_-?zv:BcǢjJQ֬'wqϿ֭^QӤIF $ɓIsv8D7zƌ Lj-G6mr½'/bŤQB٥5mQ/$vJry'-oy+[(H \V-%{[Н;;ÃؑKM4 O| ˨kQ]*Et̿*6pI(k.Y"#٫7Mk26$(I(}ZacÉdbjO6Z_)O=">Z͋Ҷ8R,VOIRVͧ]{*R Ͻ$tK.wO +> ,KVm@Ʉ~OWz&s^+rRmC^~Re&u"ǟX,?AzW<6|-ٶGD71m,mZN'kta b׬yj?8bXJ9c?u8ucs}>yM>WX]pFZ=%F_ƴzO^=BuGFؑ8ejwb~ycݨP*P-,?v.;eymZ5l8ouJ7~$X"-_ֱ4: wb m@FhQ=;eGU?l( D~n~\#Avl".ٙw3 Ogtdk byn]}⨭ #C ҈L-KgQ %j$ (҇+c6TZĂyNAbpV={z=[ &D1cƠ+iM?vm"CJ*,xHM%HۡCReR\݋#Moi#;2}zՂ9KnbA ;Axz#vYjժ 3IWgYYz~ۏPg.l l2$^+D%m={zE{wi>I7) \w@ף=oeL}$㷟F7H-]Ͳ2 ;Xy.z:E#{5_,]*^?:qF,\GMd.A3z]~ZJ/]H>ybjUH"%9y/LW JZY(S^i$2y|-XG?Ƒ,Y=}i˩g7)^nyڸh{$z)B[_A^RY&~4s0"_]˘2) ~:8ı?-#Jl~N{vRYW.O!s)AZ~zxR? Lck4Β: hZU^pT ,O1a1KnP76 ,>yBgUSFFM_slH%5xMZ.7? XX?m^jMxu/~PՒ8_Ȓs~0GQ\[2n `Mo5*4qnB9ټdQO=F q0_C6 +v RHH}C bG6=wfK{}8ta<ĎvM4f,9[m\ee7B>'}Btbs:x%:PRGz}cgc Ď@9ao#|ҩFٛ d-ʯzWcs[%N_ U8usX"@vIVgyW]{԰GR٩o1HQ wBbGhl5׸ѓ`n]0@;ЙtC!b;[ΖsF7_qqaӕNP s dpPV,~m͑cPC`kߝ:DZ^[oQK%Ebu"L'zd(]ʢL:9xND|P{7|2_GR_E:;qNC{UCż@"N=Df(( 6@ >ޞ5XUd㢩rWU:'|Jx@*^5k| ]pX;XbZl5vc\sb|t [>CO?1װugE+qm72E[B ir[\0A72*sAh*HyJwB^ |9{1E=GYX )8m#;s`6*5eΗ{7hMUZt 5 6Jtb\B"SǴw߁꤮,IݒĎڶ3[;B"}Db Wg#ms]mctb +iJO;ѧ;EA۴u^cj<* qj>\1 )}|"E cѯAi^}`WhIlVT;bG pj'XOXgNZ9'>};`A hUCcUr:+j`fԩq5rZmu\-v)qn+ѐ?&!aZq}G5=LuV)Mӂo{#&0t(6U+Aޱ=%;bG] v]*q{nf gON<8{S)^u^`ɢPbES,7N s۩3 LAPbGkҬ!\@oTYeVK\+Mx3J`^{fZڗĎ$%03v`3:;N~jL=b@ ?Be嵥*wC6-&A{%vL\uߣ/XXXx|;w-}}@q߁r|AٳІ )n8T+EFȤƍsY57?:CŴiTKTV[|p#Y~?*=3z;̙PÆDb;;po} =S~y 1|lɳD0i2iH>ARy(k.L/K+9L㪥ռ!-}DzJ&zǶ %$(%c(k+.0)F1m˲r,(R1VHSeby\SDj܆%i/! dU嗟Bu*svF;q;A +aX-&,8817̹i$z,Z {hp_6,ajVyTO`EY R]J=q4&X8UcaBƜz>G?X0M ]C Lj\CAJ;Оb'Csթq-lX0`[m`1 Dxaq7-*Ytb @ß96S#>V偕߄%WBUWj6m%u8:նyFfX_4Q8m},ZgOҐ\&з;Y6+n.2QŦ`..N_ȯ9APܲlx[2qX;zNe,fO^]_z]a\ wBzi89'<-j̱+H( z!XunyD'v{jH:Լ %%)4iչ;_]Y`i۠ǪӶZ.y4Hia>"Q;xlcs'ۥ`j_6+%cJz}:,4>iH+\ldby3 JL%C}O:5VW.]B/p5#[K>IH#ejÈݫ236% )\hkWvĎ@:88,)a,7\nq` v\,3 :Z!h޽_v]BZE '`r RnS~P8E&I >2DQ7Xz`+& gwh%K,B0!i%*T)G\m G/˰aeŢ]-Q:å'lj#ݧv@٪]2]#^߱.R%AͪQu ʄT/VD^.گ ~Kj悕p#B -ŷEʄ.U4Aڅ8'-vaJ9bw989E+b0^Xq+f&9|i]:}pstL"C5^D؊$XaA0+峫;?T;7."!;CeXlt}a/&sNd(a%Xw \\ V1a%v0wv[ۄN7߻n DusR(C%9fu~*~[/b ߓ/I}AH'9HNms#3l^40=[@HoUIj6 ~{^ti7v$23&tKZ@b Ob'@0P]eޢF^t4zͣqT0EXkǨBӟNqLDb3u꤆%u:tAC^{}KEk*~u[bwuكѦ0:x}Q, ˅wͧ#hȠA  ۷/޸:ÊD},WUIs+Thg\C@w[ңڼyut؀*Wv6mG={NH;uOP:n\G|曐N"eWQ#Q ݹsyK&`rG'v7`fŊo +3;~G;wx"%vXfNu^\ĩ-T0J p !pCX|e1wn䵖~& 1:Îl[9ewN|V:t焥[ ?SZE[ ;[:OJ(nXXb Υ'Xv Ҿ*$VL@d!#g\E'x#v xQDCn߾MzZu˪/Tع+S @*ݞR*(;e9|= aG_#mJH?)|L%GݪՉq(+, AZ> s'I +wTc&ab2kH'gO 98] CuF,@v=Cn yVJkC_x=kFxxÒBpvuE՜ƩʣKz7S șEwhL?c$Nmn:t?~|ŧ/zE7Tkپ Zpw = )J`BYs7>E62De֣téwT{I n#g|}%0 v]צ&oE%+RK/evk~ʜr[A_u[3&mz7ԗa&^@ѣGI q%Ν;tmտ5 MHۥ`WX%!B:sS w d8ѧe$}nKCaVz`É̏06+ N [WΣ%LLhowZ hͷ[Zu|Y8QVslNa 3@P;t־ծ&:t_ !S:Sv8qJۏv=@uؑ)Sirݎ$/-Z5-N찲rϚ՛R W&;w D6kFX |ҥS\vsVyYMŋvtýԉK7XeC:AL 7"a!2̢l nŜH`kVnyz)]vZ͓8 buS'e߱}YmA__'w]#uTRz@Dt毮een\Ub̋Z1ȽݧyXI쬛f}hUIMN>ʡU]m;zCZqAPƋw#ҰPUXA@]j ZC볇X$JKM= NǪC9n VksGߓUk+%,YݜTʭSs sN]szR=_w= z:_'\8`vb׺]X};Nm:q6mZ*!q&]vkl]_m 8{o%.Vޱ>Ўb&`a+4\7*nAHZK>)]Yh8zh^շm[E3!ʬBAH<: ׿!>޳ͯPꍨg}dpm] ƶGҶ!,L:yc}UJ&\aςxء,n[NRB}u>tFІ]JW*N?\?n5ZO9bw\oC(B~z(d.O Xѿ/3fz @P;jIk5y[鋹 gߺL'm}j't%+Sn`QN,D^@.?쒁 DCJ'NFdk0;%nћ2|5e{稼q|Wt9u݃sq˖`Ϛw5߽nM2 NFe-o!b<~bۅO>Ck&vW?ssW<.!؁olB$V X ȸqŋ52ɕE3E*"v8QR VC͂N _u>;㲞O#Jr 7<)H\v$=s_\0gA,yoc_J=!ZF|MwxNs!PTkrco*bUW0<{te)g \|79]˂<.[XSu$V8n&KiX]s_;9JXΩ,[Qj55o[nn?U}&V/L0!v2Ve*G{e>ϱOо mSs+V,=x@,^У<;Z+ ^}K޿t`7k(aJ^UPF[DtKzy! ܁c}N_ȧhZTj}ʘ2 m= z}bL{ɔp/=f,Bb7Xib,]fLo#йGA|~+%DShyf~ J{a]鵷KW^S!w!Q, VcCU澴|bzV ANߗ]LPo@@&` :36ȯ tN+<ܱ l| LwWcgr3"m"킕b1V<6,UULG,dLъ.&^kVT_;{=@4lX` E:DVqQaUv8s}WbU~*N'v8o@ՉpSNwo-E4òM@GʺEQXp]ڢRXX<ӟg_ˀ BOCU;TZ#k/JQM&ܽ{.^ 6>沛|¾"Ry%1YT%&n#ú=+kn:&*jj*z|U鋅>'bp2?(H⡕'*;RD'fTe@㲒4ubed郻 ė9ih1#a$$ކ1:k۬3fLJ"2^u c_&2/o5+ءhexF㏍N]@K2 -teN_z9-yaoK˜޶ٍe v$IXhM ]K]rE2"mV#Zoۂmwl4/jɸ޶G`\Cֵ+tbV>V$؉Veҿ=_*@*#\)^;zчbIm>;#Nߗ/1;_3;‰؁kfJ4QoFgeװ:ٸ螊k:~@ɔE^ں; X91%}"7,0ievdl<Szsʜ)R(z]EW`Ud|"c&8{}ubDze[hYXbҥC ;|zV(OOX#v@k Vs xGQ$ rx;IĎзߦ`.TgֈuV]5mRu#~rq K3x묏#c`P._u&|~\Oڶ&v}_;Efjq`!vR¥y\oscbAQw'^cɹFh X06mUl.<|&v20;|i wy„ ?^&ڏ\' ozҽ[7}];2:oX0CwUa2sp} (b2'/B&d8;*ֈ#OLҕJX?65-\&ȖBW(rH_FXM]Ͷ;E& E=M#pءp3tZsovE<]<jM۔,kՈ\?>U}e7OƂ؁&|WG{fUMZСjaǡL-n H>WE>_>eJu E]]B7zvr2uޣuQL؞Zt휄UŽ;kL0ybm=z/ ԁgeoXK .A*JGT{ŤU2C hlgUO!c<篾.qu{NTu2.2o+nICo'" ]EazUD; !/m*>㱹 `jiP`rYowBSoӭV"7^,]K}̘ߞI=@z>valm3µiiz,lK [Gt"}Kd;t VX*Z}_n}hL[ED!:ͮ50F b bL?Vh2O/LeZ?s\nI<څqb.T]*L/ei;KBf΢5 Y>eW=&޾A篥WL~4t:e-X\FE4C/]nt}$ƹ?u`̵edcGyMؑv4r{2O?u<zp1a5k:wy*˕+L={^V'8AXkH_7d8ؑ>} 2,cH[,1n\Gʞ=6:C,_uT^rի XkwP*Ԭ z$=zM[n,фljoykhm|-v|ӢKXfr%&]ߩ@2מwb*9c[;s]LX0u#MT$vXh/k ;Z)5` :JƸH*۶c|CX0:3ӏ+=w80&3G_1=OynFݯc8y QB~(U]?Oj,(q>{@xJ0 \@a^O^s +#Z4P̣tdkȰ}N =~7f~*C ~_CtN5T~gNmDщEZ1i81&rJ9'abGB_& 'K;o7nԗPߋq?S薴?HZWW<,xMjw2/,-޹呷n!# 1GB'teN_z-yaD$CAcb9}o;(vEq KX܅I0iP`OXS6M Dn;""ȏk?G=>XV(q|R߹Fa235$ֿU>&6hXBU{%;ҎՋw/͚[>No6; Z6DZ٦iTki諸63^{Z/ia8` v0VtbγjZu :]9 h12+%v}mxry;s_2SbE\4=sLڻzB҇6'̸gI1f'fv;g@V];.19Ju^AFԖhH("mAZXObC+Bv[nW=Lmׂ=L"țLeC.oտ{oϨԼ$෱j(:B8UTԬY3ʔ)رf̘!;s:FjKva1j/N'z˹i`ƍ;Tk["qUI!=|~ )bG߾-t2N' 7;6ԊD}Ď{Q4A+Wa Ap6@0;P~n "%KPxy~iڝ5&vIV lgv{fx̜N`zޓPfTLa}l'aIݓFX&o@#gK1cФכ|3Ͳ tءy'vm%GV:=vq]J5FQ<5,[D޿y87r.kt:rgOiN{OYf>4,i#E"Rzz ѥe^ Ʀލ21(bG9C%Ç>ӑ ZX2Kw?7c^*fyiӺ,]0ܯ+niX3ԕx6/Ao6k+7eP Obݳ~9MXS'3Oa6w7y7bJ5 @zn8!#iuFUJr;g@`Us+ k8"/Y qhǿˀnj,u8/bρ{B_|1Wk&v'|Xy1̋7z޼.GwWbIQX.=ShOȓ` vzKJaР<}D}0Pbǚ3+ܽCGwo#m<X)+ќ vΔ:N4uog eӥKviڵx;e@Ei믧Y2~'>325 `N8c72cY̢}sщB?FVy:fH5gX77 \G=@ĸzt!g>ê u F'j⒛&p]R) ZE5މ+ɓ' x(֭XC#v&π ȃՎ/lNVH}ΝG(yĔ?ʘ1-#]":;=+ꐒJk QN+bpؑ"Eb5QfwtM*P +ɓIybqR7$ \Qj)Z_}@vl7Jߡw8:M@r֠][owD|&K~%$X|6H "E!F˷P->OV> EzXI :{֋9QQ)izމJze^RYgӁWXH$!U*u*QhĎd Ve[ E<؉mƘ {ҕsR%knF}IM7^9{&L"Ko^0FZ1u3ś{ΩqZ@,򨣾qMʏn[_'E~A_yKT@ [btEljڕL䋅W! ߸;x>Ṉl}P1Tj'擾̱Qо69h^bnAeKDSU}TgXRͫɣG@[4]#zǁ v d '\ 9S .˚Sh7HzTEG-CUSFNa3)3"?^D}+%㨏bD?q(6 ǧ/(Y0'uj>FD 5t7yBMt"1iÂHj+_ ʘM}!9+]‹؁Moay_PP5*6[;vbGވ<ߴn\Wk`W+| Ԧg6軛-lBW`"!v`+ j][*}Ȣ򈆷RcNJ KŤz(zp>}Ģv~hǘ7o[~&0XuJ/W%U3^%43d`]et)bEy-`N0b`ԯ2и` c%yj{} `WY<%KF&ŵPFda_ l;`C3fcXcЯ۷{ kn뗧V\ Ɍ?,,nȶcYgx/}) vĈ&\r]fGkF1WnO\h,ۥ-9X#wp0R0[[z.ňpO;^AmJĵc T; 1F}*r,<@-r2'XA@9PµL wE٧N=T,F 9s wܡMқv<~62a@,O&~q٩1=cݴǂv&NC]3LYcIjp+Ru?ܪN*+eʊ>#ҰaE3+rƔjR)H4>2C J'33tBMD3ij#!ҔTPAD2asϹ{܍v_uۇ߸6wRUӛF.ߞvIJbhֈ=oqM{rTmRnj6iTߖk/>_y'g׉FލCuƵwt*c_m1_d8yVƋ AM'i{ =7mX>ς*`qޜ" F#h\o emnlcoڼ1kGc]jf:=z.oS=voK'>/nwg6@i;b#Mst=}r@֜ԥ Fne~:=7_ˢcZ#1n4u[ZPL\h@ej MlQaԩS٠aĉEW kDD1tFdc}ra=z!tv|U+K8-E&^SA8!]9uՊC?eк4ں+n}~)mU8T޸Ƽ]~&̓[#OʟY_>7 bܹ .v}ӦQdUgܫ5?B#2/vɓ?I<0<,,и$.4a+Ψ^StK~6R|晟d3g&K4ՙneiX0'{7"ONۗxiT_ߔN=(/oYOL^G>yŊUEw9?NW^ ]W? T7cǾ)M~deUOjgDw+&ГNfڴj~u7ՉV"푎eC qƵ_I?z'V:^ }Ǧ.Ӭ-\6:wI/+y;FmednkbZ5PK.6w1 -24/,Y:D`ǘ׎(PٳW)6?~k;q]Z|wo1ck7o^q~ؐ٬6 qu߬4ȿ.?7»"ĢWr/7n\Xy~Wk<-g~miynvEerp?N[]s-C_Cߋk݉QȜpάdXhֿ;"mYڢo:=ik4[N8g~f7sn5LuN X[2ad(!% =7o"nl!" >Tz[냁pSdnk[' 7hcwfpFںxٿ'@ГmeCޞic翝fY1뱭>}GNv:EK۱*"UsmNt*&yEm7gOM[J>o;u qzF7Vf-H⑕{G]fh2"l=ڷw>zjtq*]+U;ju%2ʾxغn{+WO-ؖy {)gϮ]m.z65֕rlkRlӛkvmYr' vritŻGg_]xNM+K{޴5FڻvFC3)2;\6cz'{z:uêu 9"Z0ic}rgOҶ.~sJk_5=N>7N\s'?d@ t^%O!v{ό'NG^Ѵf톬͖5(U`G}72jYqSpŲ%qC`Ʀxwre):caMEG8rQR6[qyYƎؖE߶-&tDJ..j{ˆoF~GZ[% sBzeYpȑiԨQꫯNV79n=5i͚i{*݃M=1,m.ZtgL!֧,۳C*-]˖>RtN-t]҂6tW/tލ3ҽ׍/yQ]l I]-+WVTt~?yia[2\hZ.máTܜ|eѵTuQbDCsoupSQء&MJ[emq9*Y:&G..=Jv(FHqKv:u@ylYhD{4f`ֈ񛏛uϟ;."`d-Ztom[FHKlNxh> ;W~tZQN!jBt=t^WkCox\Dj@:n4QV]R=ۡ%j @N`WMǽ uλ;~^7 Dn}sYZ^]Ed1,Zp4R6hkqiB9';okhny|& 8U .M|A:5S[VcIke@tزb& @mkꪰ| !CkOoiSk;67uآmQ!ҘF:S6gm&19yo{D]߽@|Od4ٮRMkQ:㍨/'ONKDW|C]kߚ~э֕qEY@g@of33j`Gt3~-˯KW@ Xgݷߺ!a2~t]L#@@o(#\jI˃{x ) vkշܹ2C o|]_}Ye شejkDzo'0'@vd_~ My7pnuǂߥn0xtEUEbzOK[c ;7Opߍ鞇<7@  @l/ﲑO>&-[*y]V`J25%+_7V?2-[}oǝ.=cm/kF 05&`uՈߜ}> @@Y$ L{C] @ @ @ @ C @ @ @ P&eB @ @ @vd @ @ @ @2 (P @ @ @ @@& #P$@ @ @ @I@`G @ @ @ @2" @ @ @ @L;ʴ7ԅ @ @ @ 0  @ @ @ @eQ. @ @ @ @L@`GH @ @ @(2 u!@ @ @ @d;2 E @ @ @ @@vio  @ @ @ @ ؑa( @ @ @ @$ L{C] @ @ @ @ C @ @ @ P&eB @ @ @vd @ @ @ @2 (P @ @ @ @@& #P$@ @ @ @I@`G @ @ @ @2" @ @ @ @L;ʴ7ԅ @ @ @ 0  @ @ @ @eQ. @ @ @ @L@`GH @ @ @(2 u!@ @ @ @d;2 E @ @ @ @@vio  @ @ @ @ ؑa( @ @ @ @$ L{C] @ @ @ @ C @ @ @ P&eB @ @ @vd @ @ @ @2 (P @ @ @ @@& #P$@ @ @ @I@`G @ @ @ @2" @ @ @ @L;ʴ7ԅ @ @ @ 0  @ @ @ @eQ. @ @ @ @L@`GH @ @ @(2 u!@ @ @ @d;2 E @ @ @ @@vio  @ @ @ @ T@IDAT US_)"%"iFBEBBydLy~xL}p[c#^ѫO'PU&        PeXuj`r[FF7mڸQ6cDz;0@@@@@@@lѨIskeWۨV-7_N>gNzojj;k֮c"h}D6C/2YێF<_MؖȶeokYgUه&v=Գr>c묵mnޅ%i:sM`e>v,^.UT֬ܬ5h}?sjդbEr9_OffqQ`}=e|e[m ^ gXtMA8:Zm5nƝ',^8GFegM]^i6laO /{7?c.=~ݦ-l7h--?/Ǿg27e:ld3_ວ[oc#۩<       T`Gu׷.Ӕ!|?}=|i6q8u1ry;;fN|D`G}7kα^'O mehmϣr])ÁCϿ޶>nw}eB_OY~0!MY;Tq}6C5s3[?^<{ucqq 8>yI͠,>`<;EO2#cc|vԭ0QJ<۩1nK 9Gj戦bNdM%ΫܐȜvfcϱ:ke9Q@Rq,˖i ߾l\mOtR'tpfD;*fLuE,|8UFl沽lЪl]}}6=-Rou箂'>}$a D/[fo?}MxUtmCN{%g״&9߄:?M u⋲z "?+       @ D`G4K^k{=;丸B6.=+޵r޵~Ю>|b a`.꽵]`(%OJv_\(h@*mW{ ؎F)e1{>-va1pQmS]ː0akeW7*ըaW78*' QUdOv^hY(h&]`Gr͠׿tCvtrn^~y]~PQ`HJS-;FL@ut,. pu.Eҭ;qyG Wc'ݐ͊.Rd@@@@@@@R "= otʐrŰOvzn϶o5kyuJ2#2/j.yz)ʓε1B{Ȟ N)\uf'7nsHne.~Klk 997aV@s;ԨQ^խr/G"nj8 Q3&Z8jS& Ii\|B,^}mȚއqOLKd|N߰~k`;aG\|޼9U(:?K(% PF,Eg9WhwDe@@@@@@@p "#^)v )_]d(b~"ۂ/y zR^OkֶMJï(ȑi5vrx7,+%В ȴ~ {e/O *͟źsٳD_[lFɻ{]iG]Q<;<{ucMumۇ/>)V,F(S2vĕ>sv|9}~~REO) 0       PlG8L ܙ6jv7˒E  e=ۤSQ(=})䠌Sl~;ztc}LnptZr<6CYGacb:5ܴYOnpnOϲG3es}kڍ{kIlnVA<;J(׹?I؇/?ef'g|5#<3'WnWv~ cg NxGc@@@@@@@(o{Yep𙃇[^{r9uqỸTV}d l_qZ:ig &z`qNԺ[y8SL%N+K`G#      vS`O}`k6h΄_m ?Fuܫ&-T}8jۦnXA;0#&e9ylY)cÌEݱDK[)7=Fg]uɳǑgXlk)Ikءc/?l@"@DhI;       /P\lrE[G!tŢu]|-wi_xˏ&hޗ?;j]MTF=u;q<%Ա1R{ڢh^tף 9a. ʔYFnDveb;ݍy4I۳͖ZU2vhxmn2oG[Ū3ʼnVcZn~cyJq𹃬nl|oWcENQk6n|EvD+s7u̚awYùv٭ePI87vd l       J(Pvp[`-Lr f.3x}sX, ܸ}w&e6jթ?r6~ċ)3C+lht>\~`DsSi{֣G[x=駟fJ O"u.cGFXO:Ƽltv۝Gc_}?e.{3 9n Oؐ.Jxg`T<˶|d=}Oo; .OQ6i<܍R`{u'}Qg}6^{b-[g͛7cc=λ;@@@@@@@r(k(h×/EQ(uqN\آzι:/ٳzrB/-kh?~G/)C3y֤U[.LDNkn af\ZnIa\r{s3Y \{"'RND0ϊd`Nyv xi zQE&=|i:7%gg|nT5zvդ]nȍ٨HYWٶ=LSГR<򈭱FQ_yxn       'Pڽ#/l~c3&˖YͻXFӾ2n9OrؿvϙwdB:~HddؠU;[gu-hܼ}ȡٰۯ(6>݈[nŚ4i2yĈJ6A%WC7S>N"袺o쓷f'MgkvKF:)%Z-efYF$7v{{ر Xǝ*lxnur ]b÷tHfULo=>^qoz~^@/ d7ثآG\|m:种\g]kYd fHw;]vvmS3i@@@@@@@(!(KB5gŋnW,k_:W&\yuEK;ˇ~lk[+eSW͛]ʸL]vmf){!C   M};qw>Xs()BAG\r5n Q?QLSЅJ\`Yw`405GN H]q?b ٦vYŻ,[ףL$'D`)`&|v4l,Y=Дq       @vhWW_DKf+V,ogn_ ?Uw+{uf ?^Y&=zYivr۬)wף[M|a`[wWjn)6m۶vj-\Ў9?G(3?s˖.MR^NxvzX<Pjk6hTlڼ9MMrhG`Sםo_y& ojwm s {]Iiy)X _ϪSԍJ\yN{;ӑڐ/N[CϿ޶>n~͔j\H$Cڣ>Zu03       @ *#57o͗l73YWBZjSǙSZPgRP;l}GV͚Htmoh+s}e@ /M7`4i,Wvd/my .4[t@zzBʫ-[:ȑ#m޼'E@@@@@@Ve XٷxnbmZBݳ :f       @ B{vMNZ\ eas^yE@@@@@@@J Q%{ [vXurVJW(+D@@@@@@@*X رb :{myUG@@@@@@@V5rk9~/ilu9m#es].l1],uv֝9W/]j>,?kY.>rv\K>c&hRƒ6s]N 1D@@@@@@@*=Zkkgj/^jVݖ&2;g^N+)iٸeu\nS*%u.W6wc[Mh+?/s]#+Ϟu@@@@@@@ Tz`:Y)Sm/۳4[l(1]ۻy,r׭ciqٸeͲq ,~>41ۺm3uձ mWF=nizVx__>˕t,5{Yv]. >Mkx}̥Z?}}NϖQ-OA@@@@@@ȟ@vMtrQˍan&-XdqЮLdXlY=u9(ݲi9Mf6iY-}Լiri{+f(6zO>=Λ{l3.@@@@@@@rUEZvG6ɶ|Ebr].6K^4>e} K6废.-2UPR}14Oܲ%m/rl3n{,WYv)       eּye_?k@@@@@@@@QX WnkիWV_}u0@@@VM˗a ,y晆7dUsg+@@t/P 2&9[o=Q*   Xt͞=ۚ4in#  e L|,U]@A͢ES:{R۰   ԹkuI/2e@@@ W7-J`G,U^@7qZh2u/6w*o   UMQF֠Anؑ   QWѐ@ 4ltF:*#   Pu6pC;쨺{  @ #C 4kj׮m}-\?;   EuMvJ`g  K;u.@6mLݱL6͖/_WX[uZL`5~z @@@ȃnڭ< @@pvG(&5Mkٞ6tjժpŊ+?l O   TGl@@*[/**j x6$qlíN5E? gW2^A/yF)؃   /oQǂ   v*G@ W`G6`SueƸmɟ~eP,C?þ; "   @J`G C   A`G,U\j׷]Y6&]4n .7Mމ fubrWD,/Y #@@@@ W;ߚ-   PU ;g?@ vT^ݺD7+u\-cx}%SA 7ϔCem̗o{.]X۶mKaѢE6d?k֢E W#FجY*MֲeKkذ6}t{3.שS'k߾[ѣmʔ)i@@@`U7\ XU0  @ vT=[DUD [N p Kio:7icRɬz]ۣu`ggZW/2СC/[:bQy7x5mUaÆL͚53ΰmݶ4Xbvmq\r%曻oqYF@@VyÕUP  TA`G!XJev?NM2L5Ɔ~\lаe{MA#*塷ڤrY]2vpv 0vO>,v#a  TA*xe@@I Y- Us ;^66YU]2y'ٓlɟia`ncǎ͸Fq&V@IzNKV￷|ЦMfZ>7nxP   PU W;~#  ;۲F" f;h32j6Qu6o]ruό>p.oÇC=jXJ ͟s̱O}[ǬY^G͚5]]Zhak/6uTW+]` ,;w5oܶn;)MN-Z[la[?tN7~׬VQzu!W96|+)5\m[o#FfϞ=r㵿'pBZQP'lN'Zm|wn_&o;>qH u .bzjs9Ƕv[믿n>Zj)˦.) 0   oQT9L:ur-ZT[`  TA`GUXr Xd]xf֣־6I9~k/y&}SZuۺNgVn#7Y ylނ96B 0`@2Fta0(@AѢ+m㤓N~ɏJy L vFƦv(8M11B "+.N|PE<8c'+=ܓqn;#S Jl%#C+L6tS3֫mwqu ; &]ֳxb;#l @@H'oؑN(t]wM} kD@@r ;*ǟ"* P-]lƏŏ|7mt9ʚ4l?O7st'? -CY6?c3f5hf׍ϨڠAWei(>3ӼjWa6urꩧ&ova; 0aChժUJP]vA ZkO>qݎ˔×zȆN* FqWSӸvڹq ,#<2e:   @.kιN:A1"z?UUA+Ѓ*[:tE5ǝs[ou߷%K$M8Cyɝ=zaT=ua>O@(gQFHG+)*(&ݭVZu:˗6Eeژo$3o#ݫ4tA&+@* PEioogy[,:[Nٔ2{iƍ9r͚5+emOE KؑMfv>lt]T^WuwA< 0";tC3H˿QjO< .\izUP5ͼyL]ĕ~:y#裏v̙3'p&urM7Q 9ɼG@@r7\sZab!etT}4ïORQ2u]VV^{-9\қnݺYӦE($]W%0e$Ep ~0Lܹ֭sxS1zG"聨}[Vgng]*&Mɓ'z)XEs\֥]#P+< ";ҙ(ͧєsl->p9a`bW(cLi2@@ᚯsόU-CŦ/d8cmuu1bӯoexvκOB`GQ97nlz(EE^wuSklA's%ySzvu%8+ү R -Ǖmw+ۑ P0wEvRϢ5zMn<;>b]cQh$ Q5N](?`ӧOwy'%hAE]'2Bdz:akLUZR`ǛoiwqGMi|I7>.#eЍҢE PS*z%]W-Z7ޘ|";ҙ.;Zk-ģ}oذaҚ5kWR`RͪҿSZ="C    P5_]:7~[Ѱ1?_ [;PUrmD];t<3)J(1er-]pB) BK^FV3j 8U:@?hj6̣ qjݵ4ebw9 hڨoQ/k_X >|xQ11z)$Fda DY;Ԑ饗&m(2";"L;X;e~~&-_QҺ  VpWc[}]5r*52 (/@zbРA)vpT c^]'-U)CVqY 2e]ܵPnwuWƇnuY{̞},3(5 EvL_ E `Vء/`eE_ʿkJĤ?ءCzEO#eP~=,heT @@@ |v){~*q֭kLs΍]F,}_m KVܠfΜi5ktO olԩYg?Q)c&My湮C[H)Ҵ}nVwߝb.W-jTQ}@IDATfɓ'? ,4<ԩc_Sd'o{* U6P.f bѱ|*C fi;~>um{]܆GW]E2uL4k=meKui=/u*[y\ՕIE}Y~D'H*|d-kРn>c:FqEF? dt}u_M΋iӦ%ϙw7]%xd~~}}\Cׂmz+5zu<=b}xbUԱ9e}}Kk,eώmnȀFS9z3+m`:Tt>$܄?[oeGb__O=gT`9rK6~'+O(l^;Q>]֏TpĈ5wI'&QL]%< p h4vN3jXST_tiʺT])|Qß(yX|}_`p9kovlp|o׮ v׭Ą LYtDF$:-Ӱ΍6O{oS`G(矏>9EӰ֫FLEth;z˩J~S~~^;k&vv/`LjgIpx=bE_v5쫼k[^7u.)c:/|+w| T]wݵصI#?x7}^>3:tG'+੧oӻwo]ڦn]wGnqvi'pwc?ߚkiQx^xXЩ oԶ a?|뽷5_C>mK>z[}^խufYAK,I;i&vFy@@oO7yTV|֧O7aG˃>袸tlnP7J,WM*)cر9T馛G_\pAt%n!6 € ( 臐wy繛1t^x?2KY;cK7߷ra'8@@,5!4ӭK蟮AE%vh~{ME j+j%Vp6|d8uO<1jc 8܃* # :ƕr}p@\Zx jSzE+pA6q5)(,a`G8޿h]{ŞWJ* (iLW㷂Q2~}׹|6OW>B=^=y?|w`t+=3zǮFl:]`~%vI,[o56ӆ>:Wto-z@+ePYN=>w?Ǘ0C;m#~vm.S_>|յg LJu\HlUڶm뺝.i:FڟtSN1Cd*:<.KؑXY{tm']Q`>WOۿ輏+a`Me0s'5.||z*KW>meٗ|/sUHmKw)um- 80oAژA`G1zF  lnTV؊E^wu>ÏS,w);ZlK/4y3)]@)]DٳuQzұ?R+!gQ$/z'ICꇽC9.C?`ٯ 0cJ\`MhKU|9SՏWxyah*zKS@@@7\Ov ᰄ j lttJu 7ih_ӹuVfnOr5"eB0P-^-Z|-XYt4hPFgFATm)utN}lk^׮]#K{υm\Xl](݉h:nʰ-zRuEjuݥM]htAa֓X}PEMй0@?Cw䥿5MSfh ;4MRtuݕh|},re_cYŜzꩦu*3QmN~zhV1ǏwA`G>4YTI76[,["#mɟK4˥+zŇ5?3VCJ_3\veizrF?K[G?.r/Z?$,zD?}YÏSJ~Pƃ/G}^nP7F4Nu'r'o\膆n% bxeӿǜ>?D(k4]7zn,QU_v([n^?8O#Xi_ .a Mr кt3o#'<4L)P@@@P ldSRΌ{P" =RukUjDVmxPߠ2Bq:] =y=X[wu#J6%n95\귱,|Qg|V̸NF8W#:J P#LE ~ P ;tz‡G|40G%aC5|h: |@5*ц5*X"HA xϣd2#Ϊ>CM%9<~rѽH~Ro/l-m`džG_gVPK>p}^Ay:UJsn)zޢò;'%'1Eg(—Ϗ_s aKf;_qa(F }VUⲇ^fje(M{}OPm; ̉kwCrEE}>>i-C$F th`G\`[+wi>1.Wy]WmԹ2뺪돾`ڔ?|}븮v| #@i;VY`[NCg{i6vڈn VmgíN5YdDرxԏvh 3 XR{U~Eᆑ>O;wNZOK(Y_zb"L22 +?Uhn!ƾdءy)S\Բ) MSdQ6(#־(FQ]eKhZ4CTTVʯ'.`BO~\?4T=y:7z;ء?§bGn )0F)cDD`?"  @!Z`2'Ih 6Tĥc׼aHǿ_QU+!ireO5lj}a#x\cTᏅ~ӫ]qǢ'U06ֻʢ;h9ސ>T^|QFv.y @!\^}ݵls4͵aLm:l}2uPR+m`G\#׺N笖 KI}8o!ϵAX9q:Wt?ߗSp|Q XxUAQч4oQ^ڎ5%@ ܣU㨮ia)is=mGˆS jgK|0@7{bP`>衶ZIwE\h>ϱ2h;DGzNݖ~&::*EEmS #]sznW>mԯ\Yj+? 5NqGP >E^4٭Y;ݾc_Qwٷ?M6z~N )J|2{+m7?b7fdؑf2;蠃Ri@t6k֬-?dŒ~KFD⧅顧o~DC{5 %v(ڧˇq:t폞*DI4Z:nU{ͻ~mr^ꫯs|I$F(}~)[?   P ءƐh, jWXĸͫ߳>Ӥ2dj\pҽ.?-$L<]fء.a_E]!([ ?smhh}ء_hЇj{J[װW ^@\K c^x5ƇJ'ۣuxK1l0SPSAuGY(ù6g[:U=ոZNO+ JsM\2vh0ӂ6kcs5 D3>!7]gUmGLqA4OYK6{mCQXf|ACv*qx۟sXuwƫA_q*A:a q~ް>`.ݿQb4o|};^_2}rY ?k[묨q 'd[öf>we} PeJ!kDhݍӊ~>^-\BεA_HMzKɰ(P~kE3VjW7(AS2jK]nŕ|+Əo/Rleޗp20P%n2:9|gԎ#inţ6uXݶ}1a`|V@c@P~ry-Wk[.e/N^Y ;Su#*-K`@m[GXEҋf%;F}J2 ]`~uk0zQLuGڸQ+saA ?1P.qia3-]Wdo:7|F>Eۙ:԰k߾9?ҬCJF?G~8fy_'nRWA.ZO@L_? L6BA@@ Yp YekȠݗTi:2=)Ԉ^;8@^{^^ 1ߘ>I}Mf 6:_0#dS*"#zd:'Yy:n^m_qe(~IYƲi苫_I^;J*yz Znd`I[~m3C?#K Fhw`Gt![ء#@P௃a/5ph ; %#:s8θt_uCUk[uԡO!ݛoeM+zv0EU^zfZlm{$\{?Lr=N۷(/k_\vmР]veƸ'lɟe{e?`y<   k N`G2< h93GRg^hj81jQv :ءk,-zF*fм;'vMomܸqּydVhj 0C%YU 럚eXxۇth<jݞpa*;#>seN˵AC.* D3 (π7i)q2 ihժUn]=2*EEYs\)LY}Wݗ仄J`koaB瞛η _}V 8Sv%h|ɎA 8Ǽ;}uǢ'Um6y^GL0EAzJk`G?w*+YIC=׮];ݻ.I5*;,SW,ٮ;qx^Vp_re{*z>VA 4h;Pwo]vzozwye PU!/]ѳQVo+V,O86v7*Vfk   "oVf`G.]L *Ϸn-O)u/BE7/KqDq]*PcrP:_ݽGݠ( JYRءwdj,T_>U ;>v $< Z~Ua5Q9uQXM6r!"2tP2e{3{RD8*hF]|'|>"UA~ꩧs\ 7)CU>A`G>UYT)|vxZ5[j۵iU_͏vJg/kcKt(e'пr-|M;*nl @@@` Pc9kuCpkPLXء55>Ű!)S>;o޼gHW/m/,aPԩS駟''߇a`a-={AS+VJKi;F'5DYʙgiXm ,J:[t/877L˖-<}صOhg gM]to'|2~z '|UBUDHPHm}2m!0ZgЗXO?tSE tPJzL k?ءϒꥆΰ}Q!uq} gļku,Y${((@KY&]k[s# DK5i f`X%\}Ub%'SN;>;w)w`G.ckxU6uѦcǺUlK._e[ϊO[3Xkv렠OKmkMG*we= P##6^z5Y?eFݕveJ%:k,={v%Մ"  X&OlÆ K2馳C}ł \oqX6mܪ8s]w2|Q?=4 |yGK=mFݻ' Hh7,&t yaC֯51T 0j (m`,D_? '#_faдXϏj0WО\4v: (#2W+a`ꫯOo߾ִiS7Nq,sMZ:Һuk;$g.ś豉\(RÆ Z]Ϭv瞔< JЊEa בkV0Aߣ묳_D lTcXz|RmDw`G+&o[ϿFU_zTR0U܀umvs}3e -A`GIRLGg`GM2@@@ TpETzw̙iZ5hJ_R~+C s7,CAjW,͚5K'kuk$۠pyW|QBâ=ՠ苞"6mM4dtuU PAiW;F6C Ϛ4iD@ͣn[tc5ЩQ^ZبDݺ̙3u} 3{W+a&CA<  ݰh{oOkk:|}I49c7o,76(A}t?9{}8qAˌ3LqWi^ $dn *+,ϱvW]ouuTT`Gvw޾CA 8IWOڪ/Dx]w_?s>s7,믿~sW ?چW>qk2G+};]jj+p#Z9񙺜A tU6$ifGDKe'QLYJcm3<,#}tl`oAe|)M+׶Ե<5;ꫯݶ@ڵkWwSwuCWgQVIG*+@`G=8    P)V҆+CیQC}T a5>~0װ%nhӧO2g2*5L 4*aJcjSëU.]~s h߾KIhtE To+m_2" WFysXt[O;v+j\G\ցͥ/ D&D3A,}.hLb(K*ىw-PC2d:Wo~mQ3u?{fE. QD_AA&1ִʧkN( ADE\E2H"9Ȑ-4uay_]9 mڴIFm^&Y't<2S f3[؁CL'Ms:SlٲvqQAߧo x= {ǷCuiZ޽PP׽>Q%w^Ăoaʏ{~z-]y~S2qѣHa:~wCw^xt[AaG @'@aGHHHHHH/a=Sd0w(a 1ϵl wݬru:tpD vѶm[O B6.>;wlf\k>)9yܟ(BwW{+ d={e\{hExK؁\ko1?aiٺaP3t,c m̘1RukTڳ ,c@eb m;w`F{ ̎E1F]00UVx(Tߵc< zK-Z 0ӫ\CHKuo ?|q{< {JvZF[^Z@LJ.mn8< fD*1}ڡ}qpoCH PF[رsN9(hp f(%6p$p t{RqǽdΜ9!_܇0 58_^1 %O|G xUHaaZ 2xdgX";ri|QFϯXv/ιg"XxtԢy~%i[ @b2!x#4Y @$@aGRÀ%-q믓>x@[p\_v%q&O mݺՄ.E}0 +dQ+ 7-Ivr"q@Z8͛ˁ ؃,i[øqgDs5+ЧOSM<]iڵ?7]F(% r^ 1G D"ކRJA<(MD m% =<]7 ?+KvKTZՈj-Z4 gmovbHR){jX1      H:pM5aGA$7|uy$QC t\̢~ws:ۇ]tqu!ې%vܑHH  ;rfICŽpe$@$@$@$@$@$@$Վ=qoذquz(-a? trx]>i֬Y&dGNmp=h9I" ZK'BNQ˫2. Ha& @x(s @n v$lcQF2qD2#5ڵ * z왶.6s%x\1<Fp o k+<$ &ܹsC5CVs5DNŽXs L@3(gm#H( ; @ZW ;eKe pczݺu2b(r x\-Ҷm[d͚52iҤ'vvdff?K, [`7.k׮-͚53yw%} k?f" @@3( gm$H ; @ZW ;%%Kx ;vݻd.@!>1VTW8[lGmKdBaa\Ʋ~ٺukX1 AaGn8l# @BPؑ,HHHHHHҒvRؑ&    $vaHҁpXG      Hp#9y     =ŽpF HUM.rfJ[w3ȆMH[X( @lՎ8ro     =ŽLD$@HpSمEoO0O}ku>۸B$@$@$@$@$@$@$Վ=<: $AaGN:l @R S՚f::H{ C1f b @W ;\$@$@$@$@$S{9匲$@I'/aGդm䬒UL?&S~/#L'e>#Ǫ$      %vr @=ŽrO \N VaGŤyRUYaWݼPF+IUM|u\f'c³sX[h!%K,СCΪ˗KffgxJ5<~9slݺs{&GCMW\)sIצ$@$@$@$@$@$0JaG`    u=Ž\w` xVؑ7o^ipN iZCVB:l'Y=@ҢnG'؁̽2z@ q 2`)RH:_^^y?BM uԑf͚2mڴ /HZ=r䈬^Z^|Er۝w) yӽI? ĝvRw,HHHHr-}Ϡ#^l8 @vT*SC4OʞV#2y09|42v՚ "4Y6Xmc9~KxX;u$^{9Pȯڵ믿Iܹ۷YO ;팱$@$@$@$@$@A@;\)<& LAaG± E]$*Txȓ'l߾]V^-3f-ǃMJzM>MÇeٲe:P,ȇ-E~,{+[wyRJ1 pBٳgWv' A`G5 322I&R|y9v올XBϟ/w x5kYF"vG1p4ҥKC%33S+&\s.]Z_~?#X3mzZZ5ukچ <?|sm)[5wWtu9x`"N$@$@$@$@$h+ij$@$@$@$@$@AaG!h M a; >)S)ڳFҤm7)>G#3It%\aw!Z2c K.~]<#Rpam!|_mp-[)U@Ań 42d@^r. ; nYwңGrO?-+Vۆ3gJ^ȑ#~'C5Ǐ={C=m4h5ʯ M(TVGw>5jԐ'|gQwĈv~*ŋ7i/vFyxp}<rۻ9ׯW^y%@g`79~m2ztl3b\     HkJaGZFVHHHHRgPؑR!H';2_LUb5hLeZ1VgyvJ~Vr7JFBfcǏ2.qY.aݻiFFIZ7ok^o6]oE@ a>Zaǫj7O>O)k%Pv_?e`w2ydMx3qgǏ"E@ŽOl/nyM2GdͶe2jNY?Ny\{Qg9De'-eYd ;7nlBfh0 _ *0P"j j*?'[Ix~ "g}V#G11'@8}ñP 8Ú[ɖ-[!(m۷mۚ$:t`o6[؁p)b O=gTP$ٳGG*U"5/a8'Lٻ@ xgL~-KZE$^PlИ1c_~!n+laΝYg%ް/ǻ: @."%쀰B^BO#x83ZjM6I*H4hgBI(04 3By0i=Kp饗:0yj/0xL;wӔUg 0q&˂}+V]v%:I9_ĨI@3RwTM*[AGdD$ovhjVh .VL@IDAT =( ǘyY^amz=w,p6&R1n8ټyS%KJ͚5rBر@CYp, Qv!@TA Kv<9~K,_|ѧvؒ@V b@Fe $ jn@6x(ZI8f>Y 6[% 0?K^EE]wv*^;z/g@(Vs:0ËL2&uűf ;^yY`;؞j&N(}_& ]Ž/\.䒨CoOˆD4i"u5[6l GHB µÇ Lh$+뮻LdD)xMgB,;{9AaG;l @[ءΟ㲚q%#_!yO;d>?fckyArNx" 4 `'@6@X}v.v@ ?]]g*7ondZ Z_Ž@P֫*% ;-Zy ;sU T_[AʬYf=Djp svZwgH…Mr Oota!20Cgv+H$@$@$@$@$ Wv ;0iB*luq<9bWy~n3S@O!!$!+ iE1 x>u/b'؁e˖iXbƻ~޽;g@@3~ǧB]bI4aOvO7]+=tN25k}>'6/ _"dݲ#"@f"DaEߞ^A!@,C8`m۶Me @lD/^۽EUwwZ,wY-Ӄ-"V. >N?A2 d*n?ydq` a0tH.?}l~PAa;ץ#Hͦv,\rFpݨ$11]ϯt=s9AaG]n[Uv⋲dɒupg" ´4lPʔ)fqsر,[6~g.ƫ"={xesСaǦMT؁X-ZylGývڵwyó@& Za&7;vqXBI<@'!Ra޷֭[vq>Z$c(PGR ZMNYP!^07˓'0K6"Q.xJ*n:t .0zj(Q0-[Ě5kBrlp 4]jU&8?qw f7 0qD8x^ K$%tMN?ȑ#=w8g(;eW{'Db\}C}_5j0 ?'?U3n\xᾅ>jX˗/oڂzw\WSv`=~a m,{_' SO=T 5>~ s YZ0q>=,\! Px ;GďrGXG Mx ;p\4h`N;.nLa]PX>2e65Xq30Xђ~$@$@$@$@${ hk M9C ]d̂;w(T؁w[ 04tPC``SS"'|3 j,FUK A믿ǻ?fxO?mz|zfPٮa2 D vk~#DѣG5Dx'|Ҭ]w3YE3&M :0A{`&xYrIޮZg>ҥKWx;E.^f_~eH]h1hm5*dHL]t ~~u k1 :,@G_2\ {6. @(믿.PF-A={4AQFN{g+W:D;N;4۷C/[r:m%gyƝ%zD@{/4O<ԯ_v~~X(ݻ9,~v^#zREi$@$@$@$@$@hk`VZIF,c (aG-7U;o)DF0H֫W/m05;Vui^`@!MzG7x V0 [nsv9 ns ;=bP ^͋%9q3Y IhW]7^bI Cو#}>^֦Mk6f3Nò= -~2uT6m0fov!}*v;^Ut?C-91sw^@-(X?% L^b_o`ϯPthaG˖-`< bf ;lq؂m|~4N,>wv7z7oߖkܚv+&v^aSMK{ǐsJ(t44n+O~,(9{ͪ*}7v x8. L /`\!Ew׿e:1"pܹYf8 mKZs^2" (0/a:q͟?a*#ߖ ;PfB4α`ՎPQ'k">*±sHHHHH5~X+s5NI%(R<8@g.mƐw[ ;87?11aglvuv+&+.Rf²_h0PO.g5 U}g6[ 3cB u6[ءR0}t:s̺kX͚5" cxA[ܳt:*f~$i`0j^vX8?s1, iԨ HAW^xKA8/S@Do0\kgam蓳'`; \z=x5g؆'DlCIlwvآC x=6<;{[oWu 3&2fVB=)w 50Aq\p{s}q aOo>6Xr<-І⾅k߅uH  U~!vM$@$Wuw/#dyX 7\G0:6tpM ^&=%ؽk6+~_< %wxPK$\帝;mꪫ /a 1 \*Y8GKQ9:/3(LJ<}Y#7ԩ!}=j^{J$@$@$@$@$@hk[Dܳ1P&%@٘p~xOU`[Xo]-P 3t`Ǐ"'ƣ_2y"wy# ALTg ;0O>>U-Yᯃ/8y35x@mxP^ .^^ UDTxǵLvc^x>c`LD;0`+l/'Ԡ?$ p_k< mw#ڣ׫PF90)U}ϳ ^p? b3A#w e~{j: 騯{SO90)KSww[؁֯b10q? >ӽN%` h&ã@00Uˌ3|^] s7J<!u6~YI ts}ϠW DI aG*Fɡ__u#w*D㱣HbvMqL@ǷC8𢅙:0- vP8 vU/$ (AP4~eTE ?6pl60A /J؁b ,"L 8j^N%창x`[~ε.^lEh+fAXSR%SF%+\]^x:X@WRËoG7#R'6 . C@;\v!Q{({ T`Inr& x`1fϬ `;3\Ļ >1hKFh #]pDl &V[w^'$n'GnUI0p ;Q}1^^Žxc{` WexˀG>#Tء>' =5<u^M6{G *3fb_;7XnÄZxSċ M:1̫.W/!} | /nqCmaGr ҁP!\aG*4uN~v@y0~`?LbC4+}oa?>PxB3=bavoyuyL>W{=[V#hߘ`B'Y ;0H"^?W@Z=SF ~#OrqR(=C@sPJ*Y88k) pʊ dQm;ʷwx ԗ{N) %@򊟀>~Cp $`?v|cAaʱֽ Z? KkcR' @0N?W9Y0Խ‹Ha`Jg q쁱#GʲeYL(apHEc}ǻEeŽ@:VC9_-Jh{m͛7&3l{-0&hLȁmv[sly ^k5H7 Cho^"B8!2B#9c0)p,LZnme~0d׀ u[oL º'![>l{fA*xud6pܞ@ /aGc6{f?={ףHI]Pb!H/M65e{-Y~^sf<вvuJ2_b̙2e=%'<xJdA`{ HH JnM,\H59md䬾ij+(_mpU)c2`˲b@AmOxŠ| >`&n[mע)ŽW_}ճC=ҤI-vs45Hnl`B];LB^y:> I܉>\> [. pװE ^ _1{E8Ɓ9=Mnm8۴mr|ܤAsv:A/C< l9+Hxf ; $K/q>Vo*^p_Kay= ^^JjXq{1>NK̏#G7\lI3(FHH H( b K)BV' -aW(u^m">c}olUy?1x0jժRpaN ;$3ga^ |p4@@eI A}QNʕMYs5k'mCg f9m(<钌z$@$@$@$@$@9v F!AD ;0v}9Uݻ >ٴ^Ta1iD ٵ#X쁱`m"h99g`,Pn ;n4oO{ŽmO 7 t \ /6[h=aG2h^ez%=^f ;l1{?{%:q^mwC ;K{g9 g'->M^߆I ;R眰&$@iF apk"! jZ}0swZ9$ysZJ:@BfwaN?YzY?       x;0`5[ha/:W0, ^oa&B,c;f~S؁A4:f3tPk}T9Nx|Ei WPx21v"4رc=L^/n3f0Xp=vZ9G+Hjx;0 -1;z4mŽpx9mdS[vYYl]j{<QeRsM.R&XVؕiK #?P8$      H<pVaw/ZHFWڵkKfLz2Փ9z4(1[:[؁koI ;b9ǩ20OC'3S`9IqgKL0`ooXd: # ((Tvr{a_~6aG"١{w<=&HWj*~<`?}Ϡ#nHY @n#CyYrX^X&eyY~gM^K*<.3]4. dpVquI͚5Mo߾/_IС37l X!a̲?[ *nkԨ4l$ãD߾}}tI0O? fϧ*K.1uРA#I/m@+?'Kq v[VF6COsl5'Lx #@=! m6߿Yv"vIaG*>x;u&E5~yΝ; b%뮻t͓,W.E¹&;Ė]{Q3=Flo؂ dܸqj_~HLB<ڵk'*T0u yۑuRa$䟾gPؑ,H 7:K :~m]2jg)& d?pVaj5 E]$W]u&% v7K*Ueͺi@axȑ~yAիWW_}哧e˖.@B[Ƀ١ΡL2NٳD.*\5ҳgOb Ɠf1Op>p>^Žxc.}\ҩC ?DjzbDngh{ wU+fv:uL6]؂+V}֌0I8ȇ ؄ dܹZߧ^2333uaϞ=>y-spJ'_|re p^]M1z`čf^=J HP>(PKg%n^?*t"4;"c}8 k{0qs筷oTy~]yrs%ņ+BׯoܹS>c(P ;ϖ% v(|:arJS4|?_d]9賍+$@$@$@$@$@$@$@K@;\v ֏9"P`A3X0:#6;P N,:v!ywu[؁z>(=^keGvs '׽{w(>[X05b͛\Y%x ;lQݻqjժ%^{#^8UB ~F$"^ ;ApܳnFdZZt[D}?#ٿ PVě=8`  &mzKLmY b3-~ہ]]Nb`f vs=ƃ uAzƍAX4G ^z/O1v2d_qK.Npx(~ ZfO|7 Wx\^"Pcx@3]m̙2e]5|~yJWժU妛nrو#|Bم\ a6 ;l]0HrD;_u{̒LҖke䬾YaWi~ pE؁rinfc4,Yt:5=C& b3Dv +R=)GHFӾ^ݗy@H2QIb:uDX9x~ᅴ{ʄ#pEP-FA5yd]5x9<=ǨטpǶߟ~~痿gTy~].g^x 'QaӈﲾgP_,H H#adSIHHHHHH GX>N?t3ЂV,nv GÆ to ;0xA@0(&M܌N: 3{ y~uI͚5Mwva!3uf< 1@xvH냁"E@ŽxT g3Ri$v}a2`W1tPYR] ʘ1c]l ҇2}=M67I"nAI!Q-gA <[ ù3XX(;wǾ?#@w g F(1cO~,Zj a_6˩Bm 뮻AmODaG b{d $@ij$@$@$@$@$@$@$A@;\cvx$GŽ:(dƫS` "Lj8[\rTX"9qD7oO{tp^lY&3yܹa 1 7|oFA`6W.-Z;Z ´@6̤njz,fݾv-fڴiZlW "D h؃kךBb=yNN1_n+T @^!IJ6 " +={7ӦMAO_u27pS\o8A+ 2 L >g/ý^C; f 4hݺXU/vu7r5t@ 񲧞zt~s·"xf! rù=$^6;̀d˖-/66XM6uPg8þ`ڬY3/xPZ.>B \rFx%|cxp~w^C:%U_Z#|Ȥ Fo<c yQz/1mz\~sϢW DIŽ(q7      ȁ! y^;Wb|f&? * \`5A)N3\!غud@4Jx: H-srS~eddHC; ЎTbJ&.bZ ]vTXє1eٰaCLqg      oJa7 DN@3(순  C ZaG޼y9-iYaV v.O.D ujiQ@^=wg0`)R$d֯_/!fgpԩS?Ϊ+WΔ7x`9rdfA$@$@$@$@$@$@' h+'pHHHHH 6AaGl7 @.&RҦ}RcGearhd^/ /,M/ 5E`_i³lڱڬ/!K/ŋ5)>#iܹs_O6DZ! ;"%$@$@$@$@$@$p#:~܋HHHHHgPφ)$@$HDnAYȎ}[hʖ@4CxA^fES>bܸqyfg;BԪUK*UұcG#-P{|R^=)ZSɓ'K޽t\#L$@$@$@$@$Վt<{3 &}Ϡ#5kE$"vd+(o+E wʷ{ sUE3-C#Fhg宻2i[lE5\I4W_5bMs4E_ɰaä~Fthȑ#}ʵ^kru[o%/~rqN.bSQ8 Y[>zR P& @JaG@L&    gP1:@$@'D#}~maoˣ `v}駟ep2*R Ķk׮rWj?{)SNܞ*vlڴI:,"^U J $`@$@$@$@$@$@pÂE \~?}K D$@$@$3{9|$@@ aǁ̽cH)S4{(S{6yeYN{!ORJ#ivRf3<3@,2v ٽd ;P,C頿W_ɶmLn'EN^u'| |2k, o  Cm w7;U&׿}!v g}& 0yPO&aTnf"= [ء={L0xhѢ\pI~7޽ (ηj* A@ڵ5v $ ت! D`ѡC[^~e)\oݧ,o%.gynaw}'_|n6=g`B[ng;VY}̛7O^{5!?Z`1ߚe_c㥗^_ծ z& ^|d DH@;\)\6eB?>܁ 2hLw&&&/Η*N$@$@$}Ϡ# x܅H@ %YBiVv)]&ɢ,/c |0j8۶^/:iXH^6odɒFPI ;v4B'cւ=+Ȃ f1qD裏tҥ&\R4\kР@H4i`RM:[<ģ> Oޡ!Q[.Ⲹ @z ;$@)@ mR,l-k]/ #ʔ%#L]ŽoxI2{o"u fϞ#" lWCa@-2 Ga¸w1M;;b޽J*f#- MA3nŽU:WA9v}_}~C|-ZT)۶m<>۱*v̘1Cy"sڄ=0 @,ՎX(&g_,[s0L"1bn xPeŊa7NJ*eO2EfΜ1V&hm@;|`P4VP!ҥ#Hg!R4>$@$@$ {J`I&(aVbҵkfdE)g"f2 Cr>mavPg5quQή]^B tvë1qv,Yl;v8y .l/ԄǨ\92̗/p xժU=מ~G~kƔyQoͲL esg6w7+W_˃-Z0阁?䉇H_S.<3g]hvx ;>CX޽1Z݆P5k6ɿ`RS>3\'    Hp 6.sm6T6ٻwy 13Žm۶ 620+|*`v];Ytի;Z3f,\ss<?~ϺKt ;y0j͛7yJV:! 8;F -@D) ElNvD_ƍ ԁ+$@$@$@9gPؑ-[D$$vQ-af>!KS⪫,#PŽ:YQZDpskD:‘|PAeЀ{Quy!@Y60Qx 1 fq\tEf;y ;HݺuMfvYhQF]bF -U13u     dhA[} Bwy>^'  Uvxׄe˖/اERNn:u qE l}3! !"ؾXQD wEҥKMR\uY6t;J1T{.)&w̞=۸D\\{Wp-v,f@x,x9)UOսG9.\O6mڵBBǗEadDgRS>3\'    HpVW_mAyfD{C-\]rGsx~ }i2kg}رo̮_8;yN4lM=LD- As 78IlZ;$Al!Hf e4a„X$@$@$@)N@3(H .Hn#*!{sȂߦm\$Žm867ݻ;}V!7p#ab ;1رy晦 v{&HHH AaG,/ @&b[HwH3,qǬc@ Ri/2#sS: $vRq-H#3m/ՄѴ'|[ D1ԨP_TiYuGZqHHHHHHH {h+'S}hhHD m@4;-*ݺusp°O~wg{"a.{wʕ+!  &AaG6H KFzH_J뷼]2jg)f d?pVѩS')[iȼyl_/&ň#ѣ;5j,ZȯJ5 ;vH߾}<6Å]pB<䓂؀d˖-fg?O>l-7;up )曥J*Ki%DBTJA>JPTBP) DE1A$EIK>sֻޙٳgo9g;kvI?j(xN: жpBYv޴]n0-[JϠ|89¸b ;^Z-Z;T!DZt,[0ժUի{;L9N*;G] ?f ;w矶ۛvQ=k" ATmضp0-a}' 4">~.= ܹs2rHp' @!gPؑx){B$avD8#      xL@?p E؁!bG"@n_~]c͚5:␞={Z&cܸq{)2eTZU 1 Q/~7YnޫW/DVر{n>}[[)M4؇f;ݓڟ`E lڴSTTƍa !bnۘSeС1"p0IJDJ*RfM+oS$nZwƍyfYd@E#  Hz ;޹gIDŽ0d1$@$@$@$@$@$@$AaFO}%)$K.9sfՐ={w}J-Zr l: @8v& H(H&      Gk|vdϞ]6mڹw^Yhcc3ŽؤΒ%tjԤIСC6WHHHH'gP;fj9$[lȵk-8v $O\)*4,HHHHC@Π#<-׌3C뺉v؃F$@$@$@$@$@$@$W ;\$@$@$@$@$Xv$3~ D@ru|9>ܼ,,0U^RiN<0-ˏ+Gɡ#wVH$@$@$@$@$@$@$N@?pÝ HHHHH'gP}JN      8$R'U @"#gPؑN,C$9 ;*SWZTf5pu2kX9uᨕJ]ӳ(0=EeUv?}ڵkeȐ!z3.)H '     8%R @"gPؑN+;C$I;ҤJ'=[i˧eƊڰ6+"ytJY^Rc޼yrU)PTTI2edձxb1bW(Hgm&     'R-     B@Π#QH vT(-- _ǏDkN.\  dɒ*ǩSdǎuVgQGѢEٳge߾};wnY͛WΜ9#۶m?Sn޼im+WN/'NUV޽{%aGAPv}vzdɒEի4sIoݰeΜYʖ-+ŋi88O^Xl˗*Uӧټyla $v+L$@$@$@$@$9wcΚH 灍v\~Y6].q 1+"?ʪs+?2Ej~o#u_sI*:ߛ7TUK5TۑvI&ItTƍ_UJ*%o%f02uT9slׯ__y}Qٴi@h1x%yXDٗ2 02bxFd.cfC /%k֬J׮]mʲe?(H"tEjԨaf8p@ Q RZ5yWT~E}O<\ak: $5? HHHHH 8wQ$@$`E9灍v\z^Li%yHX$9wXZ_eW%K.֔*,rݷnRbLvL2EҤI3f?} ʕ+K=݉b 6lXtSq I2e<:;:u"M4s9zhɑ#~Eɘ1J$?(v:tHEqk2rHc™Ν; "v  "hё=/k&؏6 $? HHHHH twd $@I@0;C#+<^]B'5?YiX)v}vrg"V嗵]*-Kiax6!*^hK*|Wjz]rEEXӨ$Ul-I5e˯&Jix־gȜ_k4DZq]w ɐ!jDkSÆ Si 6tPK܁om~o-OݭH⩧rۏ>H ,!С'E!CX9 ;T` ;^0?m1qDKQS`Lc?/bvaǂ QMLkܸy}gիf @'Rؑ @v ) "Hj);20eK+7o"R` ˧e)non/6K.%K&ٳgWX6a={TKDRZ_t|gnhS\!RHq?v?1vXK%cVZYY-eذaL}JٲeUSTSqE9<^#G9ԦGHHHHH*Ž:o    ?;Že$@I@l ;4ByJI1s{#.˸v\pA>T!N}GO1?睲 !ZēO>v=zTu_o@̗]vۭ}ҠA$GP)T4V7EEAt UΜXb2xpf߾}1GwaMoɨQŽӧOKǎ D\ڄ@gݺuz$@$@$@$@$@$@.+$@$@$@$@$@"gP.,H maGŤ{ב}Ƿdvء;"FΜ9#:tPNL!~{ZBvGTN3:2aHHHHH:Ž>    ;Ž1eI$@I@Rv_l٢r2e_~GOLa}x3G kĎ`[/bLo_es? $u+I}$$@$@$@$@$>wcʒH,;vd˖M'NHΝG)>|,Y1H ;yA}0_S7Eɹs(!     W ;ba @p ;ǣHH@^zұcGk$Wmfm!CHѢEԩSeƌzp ;M&)STS =zʕ+t'aG8CvɓGF%ZR#PbO$@$@$@$@$@W ;0HHHHH pw$@$$ua L]%KUiӦ\|Y֭+yUIsDW1IHHHHH x+3$@$@$@$@$@ ;ܹpH&5_koף|֓?g1co/=e>ɘ6}f>a„ 1cFeѤI+7ސ{ZXb͛7(j[-Ӵ"1x`)VիҩS'pn<ҵkWkIp;+ɔ)j dV۱R|yy4G>(0ipHHHHH'RdN]_>-sN{x+aGdcZI4я]o%H*ڑ"E UݻW^14E w^Z' VSdϞ:)Fʕ޽{[uݸqC֭['N9je :TVZ{Yzuy嗭ơ)U ,>WPءIpI$@$@$@$@$@\)#&    M@Π6 @@6]Q;k䪞}ǷɬUcWQ wqiP'ɗ*eK؁0IժUb1M K1 D"sI.a4hP ن3gHlT'aGA8$Xaׯ)S b>}Ν;c䡰#& @PWU "    HR ;iggII PaXC/]VMub<~\:<_LRR[XK,L&qh9q[YnS} v˒%)6]V b&ȇiAd2m43Z7?9t萼+>seɒ6mZԹsgA '>ی<?,X@._,M6Um޼Y TDHAG9rCv_ڴi#b7

& x'R O@ΠfI$@nv *]WWl#fVe^zAvU$zv$O\*MR3R"y 7oޔg߸]춏$@$@$@$@$@$@$@qK@?p#nk'    D@Π#1UH bCء;'ki\ܙJ:zzZ55~K       xD@?p#6HHHH8;Ž~"| #Žk&      ~JaG0x ;':L# ?P$f!      $B@?p#pvHHHH"@@Π#Y @$@aG< C@?p#z<HHHHHAa ( @!RؑDN8I$@$@$@$@ gPجH q#qWHHHHHH!R =C$@$@$@$@$D@ΠÉHHvYHHHHHHH \)H"'$    п3(lVA$8 ha g+        ܗKaȘHHHHH ; w WvxÝ$@$@$@$@$@$@$PؑN7;K$@$@$@$@!@ah3 ;eHHHHHHH 0vƋIHHHH|ߣ9H+$      $EŽ$uY     ;(@c%$ Ħ\2赶R =Яm{3RHHHHHH, ;cIHHHH Žx;80H(bCؑ-KFyӓlG$ydn(nݺ%g-NΜ趏$@$@$@$@$@$@$@qKŽIHHHH 1Ž8'(p ; hݸݩd͜Q3o$snu Li@A#      {v9` HHHHH Ž68p ;*.&{<'eR}~_\h܏rJJsiYz~8A6B       wv @(젰#QH Uؑ3[fݹ|$K=lw>(q[dayE7oɤYdШK0HHHHHHH PY $5vPؑz\PdL/=_l!5-ز[Mϲ}j;;珖2x-(aƐ^%_m-Vo):Pg޷_-~:EFO5cHHHHH3 ;aHHHHH aŽ9rjGv<Ӱ {Ճo&Cǭ`Vcə-?yVz[_> ?VU Hoibc eɒK~ -KFi`^8N+v~Laǁ#{-֭[ՌrHHHHH ;b[IHHHH aŽ1RJv<隦st0Dv22f`ޝ[JG*YŽ>xLneb ;u$+3yd2w=T:܎J9lP23歐G^      NŽ~|    (젰#K6@iX+Qd_I?Y#{LzҶimI2^C'nnv8aۜ,Y2Uz/A3@IDATk|b%+eͦr" RDU?ɖ]cդh;+ ?ˢߛ7'WT)'j?b{u~˲[= a=RB))[\vMc>P"P}ع9qZҤN%-\*q}!Yz:ך$@$@$@$@$@$vGI&RLuacG;iJϞ=@2w\>}{n@,Ȕ)+M6ɬYbƄW||f͚RT)ɜ9\tIz뭄8,)"ݻwԩS /[α 2H:utҒ'OzCAtiZTZUjժ%7nܐCWx. ;gI <v ϋVSאɓ/ZV%.]|QTAϧ;V5w}HyCu/Esv%e w7v@3eh0Q>ÕiW_5+]]{9iذ^gZ\!&pwg}9yt9M(C׷o7oPvx("mf5L >\ 0mĈxb)Vໆcʼy&!H*L8Q=VZxPAaGxFK!$L a"Y ֽ_zJ^"Q8b+;]^l!wɡvCQ:k*y+_H ;-/ҦVW5+)Q[+ž#b1J2Fn*4}YEjiϙZt~Eɚ9$?(vwD.tnB ;K312 hĩs3[f8s2$\Žɺ?!*b{t'mSرkkA\/^{v(q$@$@$@$@$@$@8plƌ2m4xOb4&mv58 ;4v`3d]R]Kin=5ƲgZ&V~\xEר ][ǚ*n3T)-^ue\s`z5 '{j.aǒﻦ*{ѪMpşՆ*n&Pz~8ʫWLa ?cj.wM=#CcF$@$@$@$@$@!C7t2f vw.^(2A L0p@ɕ+,_\6w8 S ,-Zg,+,T9x͞$A\r/+ ,o^S~)?M|UlY9t+кu릦B־kڧ~}`JoŽ6&Hp!Нo[tYF}+Ӧq?Zo {XG,p9MGf'Y\ӛ.]"^0$zL}%Z=hEt׮m{`-AnŽO'$F}gDcj7cb[_x%`pOFbD ; a:tyq5ui6J8ٲdsU6-M J5A;fv8 b~@TC2ԥ#IHHHH'NaDŽ dnȚ5ҦMAqm_~̝;Wo&%˗ܹc=3&@aЬY3ygT:=swٳgĮrOcРA}fǏ9s≣vPؑ8F2{AqH@ߤ6^4) z* x?5IYU8S"R1<+C~/f/u>"6 x orX)2zگzS- &k?g[!rۏjKɌVNlO4SɁ}e]% At h`7S$GP)rۢ&}^nHm?|Bhޥđ?Uk8&|=FQ2v 1TpWh%' 붩u3Vo]sѸNenWv%)^Et?Gڊ`)8tkZWjӳ,ZGVm#HHHHHH P-p9dɢ (젰#]o ;PZms.La'A9S3Ou]aG?WTή H6B`xn.c)Xv-k,Qu;Ѣ%{>n "%@{091ݸqC=@Wӧ֭[Kŕo:uJ-Z#HΝUsG߫9W.Jtɉ'd۶m2e&V&C<… ~4i*_aGg|6^rEกmq2UTQ1ÇݟDSaD@>D@{frS\zUΞ=+bCY5lPʔ)6ǎ+)\/խ[Wʗ//ٲeM6ɰatv`ʂHQFCI9tA~jժ)0F}UVO?I׮/۷O\[ڴi|,VԨQCi[]n,[-oҥ?JP?ѯ+9L%R.\([n:uHJ?^Qׁ%8׮][}ڵkrAٹs̚5+dG\Z%`,ݻ֯_o6`+V7x`຅qdp0|Augѣ:p9ʙ3⚅/#}g|?l྅:2ӧe޽*+ΡӴIz&MTpJ:9rDvء=`(g>׮]+%JPDA`69sF}Fqw_81y+ epl٢>_8v͛d\1 iؗ1cF}i,mÇWol?;wn|С:K%<ֽmlƍrJu|$@)RDc=رcW_\EɓGׯ˛7buS3p?uS'Q{ェZWo9ߎ~o8e҂Yƈ^k>8 ~G~Y(젰#G![@ @l ;4#?6t2.g]NF qS? ݩv!"r8YETSSرqu"T4wnŽOv |txQ$GP)xOeHLCGOMr2wu 0[x$ko~^"-)8vnnK80(}gʹO?T Cee9cҤIX.;{q܏p9ep 8P>ytt{*V8ʴ;(ƌc+Ϋhg/B 0-1סCygX ,Pyr٧"<:/<0r2|I Xz288O 8dAb7y "dˣsB 9i|G$/tr D}u &(aC `?q !`NA:Y(DT= ]}Bf Ȋ+,y1민`Z|d'ԫi?D~={(s:2OcQfv}'U0N ^{͑5q,ƂaNei`kN?{>L'µ",ocLŽvW*ڹݰY=2vt;BlKU;m؛rO|jÔONm2Ni IaoӶSaSy:v4_P6 VlV=<+=iav0HHHHH%Iav->p{|vv*rQFrהT0p~1괷Msv s=2',Nfo#ɺc q{O6l؀,3av>8\|) -(̱j!Ұ"h#z*drHDāU5?GfCc l3PƜu:HNpD1E:` hy@KikMhD0)ޠ$ (ן|N.85:s2<Ωy@Ƨ>.\}5>P_$/1.7`v0|mA[|"ByxC X}\" |u^,C'8_ idn# qD< ;yu?0 1v "LQiӦ*B>@!j9iц͚5ӛj>7ߌ 1X p/9]Co!XЇrex[:>40cƀ:jvc$h$5aGdѡMkT*-?eo|Z1W]/cpImô#ov@`>zV)_l ;>     B 08`^x 3y5rHb80] ?ʯpc-A!Bi-0% qp<ɤ իWM:Ct<_xr#JQow(zz7  &+6f?t˟逃}ӔD.4P;q͛7+:څPf͚J?p@ H8c`l8bb 85f'X D@ xD,7vCxиqc9,8o"h 0+by~fΜ)'Oa S!!cQ7Qct֢n?˒%K po߾V D=At=V̙:> 8| p"؏Xke ΝD,prBxLǘKŏB7w}WM {1k25?l:DY i|D.l=:Fv KGwGygN=ܗ!Z B 5usڴiJ)A۷Hf@?_|^ #p{?pOl< ;~DQ SqzL؝z mS< ^z{@ PGjo[<7|P.R{ȑִ hv7]h  ؏a7#+؝xsXG.G;1Fip~wfzY;'6Q:cٲecN;9G8b o1(fV? @f|D>LcF oŽҥK[Q%m۶jkkժ[Ȥ\ϗUk%1g:kQ8?g>l; 0V P3k(bŊ*;c qD޼yU:NS8'M~>qD%2˅.8^tr4<湽c0 Wy^"!_ pCcO#uZODsO@81Aapcx.ǘ|q21^1n?O< DpDm0pSasϐ|A ,s\yz{ 5Ff -K,fVpahӽJP{NDw<μ6,iSp(QY s,:4 ;(8c$ $uaGۦ7Yi?[z`Z'f]~/&X:uN}}ٰ}o64|$zA'aG8JCv̗[|j+Wpcş"١־j}Go:6ү$^>q9j+ҠfÄYct,$@$@$@$@$@$"p ;n- ~89 *?oF!ctgo#_ځ!F,{_𷟈G4Q؇q;|%4¶Y=k3'L0AfϞwzs!ґ`?|=ˬۺ/aG|zއRٳgWbtOP>}UV^'UV,'#H ګW>",wqr.\ 6D~q^ C9N揰84}P|-ZmzDմty?EDŰ[8y2ۦpBM6ٳm|w {QAaG<l $<I]؁3w8I.:y;>$5==>(-Ϻ`şҪGz̗'txQ14s+vleʞE=x2쫙n`caR\*IP(BnG92ݬuZR;Tڸ/ŽZab+Qפ#ډɆn 5Vmz w-n8A$@$@$@$@$Avl8 0 6ߚD؏N Ōa!I' -tz" 6L2t( UG{[^Lpq7f$ҝEQNԩ*SD ]d doYpi.0s|mooipXz2s7QxZ;ytY渄o )t6Kl4 ǘ3˖-eÜF$ ƼNE81hYdQG]S;!o?!PP*pݻDS̺6l` @~ٳTby4j>WEgm|D.җu^^e %> ι6ۧ7}.C ^)5XD=Q5ejF 1gӼg$ɺOC/aG|h "g9tO%*3lkLkiy<9{{=UbO76-KѢEeȐ!*رcҵkWzC߇N}3ϯ.+e h-Qjt%:w3‹9ӱ7 R)vڂHm0OsT4;)F¿6dDQO0. Sxt >gs8-aǧ~*sk9%L= ;aÆ>_MP,g$ɺTgKa~~|q5&kSv`?F#F85IU^ݚȌ8ux?wĆw鏰7= S`k|թWZUpM!v3?}޶{|f; q`wߩϪ{=o|ڦŽ4HvO/aG8ƜGءۋ%S2e܇Y>T>u2f̨vfٹs=zTMs)5^y'TCPɺuNU`'L= ;L1& 3}d]~3 ,ѣG߮XcN/{سg``#Zk̗ݭ|qmbڋ6ٛ=B'nB3T6vJu鏰nݺ/ZUA017(]̀SL"?U}\i"yt)AחӮ5IuK Rz A!9"q@xa\ٳí6] A"_LU޾Kmӟo՞u<`o_JiUR'^Dpat]SĘ j3sMsE^fٺҼNEO<9T١;P/=#iR|b=q)JQAE4M),_M2KXJBM[Ԩn!?'fy,L6ұ"<$@$@$@$@$@$v `nڡt8?W M؁i=ʕ+5kũ ]j3 fx2v];LݙKf31tYޖeN?X}  $;v%8;vˮ\1H6mLӟCONpoYl+Bɜ7o^iI0=?5kVS s'YŋWEƖ[녺 nyejeNł1"g_ƷOH%re8 ;5 gn9TaYϰ9!Ԃ" n~V!CX8Ƥ.zKv"y2~; ywT{=SR?D{U=89rDO αdF^7g~mvCĒJKQ16l[?&K|ws.Mҕ_c8oPqt!" d0'sǖ`p]Zۡ)ST/Sm ;P鼇nl)q3}d]v} ;5O>r}K;  #ϰ9Q~(WM ZO0'}; Q}k)̀ŶT|} [m% u~6[nu^󘑐< ! j֬:.0R ڵkeȐ!x9E@=- \avqeyZڧ{9Zp[vS ;(숃a*I q?6^hf =;6j 08xt9+!^o#E+o~v \(!63? 3H;P3Bk'-K`J᮱; M؈#dj=i+J^Tݡ`~o۝'ժUsz8&SL<ƪbK؁ͩ~sJ}^~e^D[!0/So>p)>>D.| ;p?#u 4{r)}4Nhg(QO4AlРjC&Dn2SbPk>0Ɯ]bܖԇxVJ"L3Ǖf~).3AQHߡziKΗyCAW\Def龖{hqLA0PJcgiCDԜ.~)ǸHvDẕ>Ht`H =eI+̅)2^x32GZy~s;       .3g?ޭc;s)+V74a3 fXm{JӦM Ώm۶ +Ur6Xz0D5jf1 Pp֔,ÝJ(2_1y@ʲ~sQc'wuTPr_a: !Dq!}4jH%ބC_^ G~a+; Gw3MGGJA Xctzv.sA D5xe0׶n:ֶ4#T@9 iƌ݊MaD=z\={i ɒ%{D zvqh80q)i>Dzt-vħk9%k>ca\[;a 3lk].ڛ/_>5.uAt\#L uL,3q}+ џ_Lh$뷎ځvA6B0H; ڏh":5jE#Lk篿'|vquv]!G9 Qy Tg/_mwʘD?8Bm.-\ϵEB؁ D;tS){mVUGJ6\eFhpI؁pT[p]X@ Dgaz V\αSPyfD1LvCT:D(3#E!*J xvUp"!H\vd$ ];L27;_>;C.\b: @Ua"#v.[L 0 o91(.1CkZ;+8t[u7nTaz-ˡ!"(g9s`~w8*L/1ˌrrq( ۻ'"ޚT N0:INF{y3(6XDoq{28ׯoE@>DY v̙opv4P3pܟ>}Z}ΫV*>*ΟOڶmk9Цqիdo]( QP0צ5" ʂǧ?Wu!vv8fr DFHӨ_0},knaSpo ? 8tx4)ؿ:vcl޼NvLS0oS/h `?'Q 't:iVΞ=['{\oyL30(ߡ0 "T2Xbݻy.#K ;(c}$ĆCC*Q$j)}OmAy㉲}AK       xD TaGluLo'`a'b$ N8sέE 5]r ؅))$Ԇ@^80v/<{uHY΋paL?UOG`OƍK֭U1ox*k:DS7o^ Lśs(cCĜ;vE ocL9sfup0%eGa8M:u**#ٗH 5sL>p ۅ(D8߸FkCV|?T0bSdxԶ 0N|G}ez1`Z/3:Sӧ;f +="Zoy=tTWC@h͂aA gg:"z3{DT/ʀ pzT^ivP$ Ħ#%      H`⫰#adsI' qҥK4p|& @"!IؑHn8p-}ᇎQY`>SլY3u" U$͜B;0+ $JVKI.%$0ňLVT`(,QD9H?_nO}ܙtzo[U_~x)mc7nn-ŌZvPIO @IDAT CIpI%p?\^!,Yb%=f#Lh $˻S @# oJ p" <-^X ^ܚ7onhQhÇ7!Ly"y6hȈ#~V aEw9h >}z4gy ;( NŽ~Y~      dN$@~N̸GZ @n$@aGnbDCHhҤ\.+}¦Ɋ9>Y$     'v3     h;Žظ15 8bv4{+ۜY;W&vmtųRT,7 D#0g@Yzf<94!DNsB$@$@$@$@$@$Վ, Π#GNVH +"(b-X\vC>,Y;'b7vxǎ=n}VZIbBh& /l=zT>#=,W^-sue%']$@$@$@$@$@$@h+|"HHHHH" ;"|HrXNee##pO('mzt5Udg;2eȐ!CLVΝ;me ya      W ;0 @ P]v;xѲm۶Qx2 tANC?K&f j2]Ao>Yb,ZHvU5aÆRN9x|l2snʕDf}> 5j|/5N:$)_9-_I{ 'Hj)VkٲTXѰ<᯿r *v)_ ןY֮]4#     vcǎR^=S۷~[֯_Լjժr/8՞8/RGs=3޷o_8q|'ٽJ۴iSS_7O}<]t1/r V@h˕7o^ywH"S?ә.8n09rc~#/^܌C {裏JݺuMr޽{ft~رcu h;Ž 6 @&iҸB~Pf2QdxwS_r)9#MgnoMѢE ٳ-Z4S? ?È>V 0It9(k;Ž`27 \D ab\krT:o˚:R|}i5RTUg ewe￙}y3&쀇xYd,k63R׿n'>1{l+-W|J\s}Y%h݇|/}XvYC ۳frݻwqw*>} HHHHHH 5^aWO0E}٩SKn 1}/㾎׉i_݉;5.@ KhvyQ{U5>L쀈iM&Z<>(H{i]C.u}9a8<vtMY:.Qafq1Q| ѯX F<&y8DaGQv˕ "A;WJͤurRSt㋹#$FQ㔆α s˒s}XIGafR[S/rfSOA9oubv5jԐz 0իu,uV6~'yC^?Oëu޽{(+x}駝kgu)WHHHHHH x`ˆ L'@aG$@kW:!dhXW}߰2'j.\ЄG~J,)Æ 30yk׮0EM6, 9 DmgP,WF$)62jp+\ʐ;AwՂsnaM_$b##\9 qmҼys{„ &N;MvA1gAaGξ]$knbvd_|QN9ؤ[\~ ޻^e[f`}B!SDvi  8 -b㜺y. ) ?-Ф(THvɣImV{G,=-v&S؁4XչW^yvqI?.bAH5[wN3yy$     Hv+na6ܳgӷI(\#|(w9d761|۹sxer,ZH0 #IC ^[s9=Yti5K?<{'޲4lЩ7cx̸g:݌P^< 㳃ϋ=1 c³w ,Y"kMƱX񾋴_lrܷcQ~sz2)v7Ɇd9pcׯ7Ŝ;}73ren$@@rrsfsćeن2 ry  qefGKaǯ"/S8La !\G3dv7f y8E5{1AQCCN>dychF$@$@$@$@$@$<pW؁apu GAkskРqT8}xEX˂U3{L^}ߠQQ^z\~П?Ϫ>pۚYkO;y>L X%D#(lĈ=9nkq0yd#\zN^~dƌmϼBiL׭['gvp6b"OPOo0a c}cAa @.wxnj59PnS@g^]gaʊ ;⭷jbitCk8G:IHHHHH"D 蠭W^y̶KA3. h+V4*#`&c1*Nۃ:PA ̞@X ; 74X(7 ^&uhZ{IAYg}/S|Vt"^ziQxV6!)-V|6w5A cwx(h6=5+·Zlx矍A[bׂޘ n8`]f 4=xj>z._\Kz rfC>> b@a/+p?aBYf spl۟k@!m,ek\!1Y՚.vuto#?B ״ZF+H]S'L6 F4g??y b xIFz<'> ۼ>n!~_@hL;հ[|^Re>?:' &dn< ;cI҂Ga䊳o=vc#EU"Lf͚?vcS tR3l=v志K800AUp Z&/uk]&g}L     ȅ5~?<h`p %CRJ]{`f8,+v :g3iBGF|ló؀fBx&x@ >?FmalK۟/xp0J lC"q8ܳ~2!N P}> BDШQ#A>k0\o߾=>[Āmʊ Bwk0:XcݞcP6Ad0,}5w9Pߦ.xЏh!=d`P"عk<h}/XÿXKڵsq &9<im/Q8'5~ ;}ݭC<~y!t̶xn1+lxﷅzަM6߭?wuOKZI ^1~oBkT.gP23mgPؑ @T(,pÏ0;"AvďuqոF xq[ӻCjxf !v;`sva~?krHHHHHH 5 JpXv-?0,d :\ Ll޼yN[X2K"zi|盙}2N11 ӵjrD7~}/{hma<5`0b ~ڈ4W0F<:ȬѯqgxyBwբ}5= h;ŽlH"@aGda/; !tJݻ7_ۅ[PjQ4@C6*8QKYP&Q2jlaG8׆lL{զ^K      T ;z̝;w1fPbZ,xq9ڻ^m /̢EqeYb֮z@1tv`6fbЯx)H{yv`~[@ôxy WӐAX;C8$K ^j&TBʦFg[cAaT"7Їks`Mv?C(f؞ B翧 =%o I?罹j*/YL•  ٰaÌ7w_xq%C1h GICA}hє]tg;H<[z,[T޶E~m 2[g.A!`󏥗 m!gɦ; IXϠIAa'$ (,h׮8f8C֭Wf[ǨԤhP`ԙH aPjXn~]U H8648W6yxfඳ\r&(3R4.IHHHHH#v`@`hC~fݙyك2k,v^zt;X9LYEȊr @{*tW2cƌLUCŊs&xy~Dn ;h`m?sH bCG? &AXAvd ;oxzꙁKz4HZG{Bp"vlo -bY B+` dG`e/C9430wS`$"B㊆rϠ,ҥ_d; qy~MPk&W˻"Ga^P1g9E؁^=o{@e ;~r{HbYl.!.A <1h{hGx׎X~Wڵ  b|}~1! > $@$'X 'W5#>Z *)e)P+6/Jhү{fߨi_3nj 9! GY4jժ \_֮]rU4GC ܡlPffץB2yҎk!C?H#!vw:@k{:p k=K      dAmL43{gŽ-[ fQlwv_yop4m~^E؁,Gg(pǚ7on/_>dr;xe"e~3ma(V:#`X8KGih L0a ̶~~!bAaxnw/y>Z3R@MLQlCK^x4Lhƀs}$k`34!>ߚW8aGϐC󵗶wzA ;"=w:vG"kvS#w-$qV O.x™7m &E7d ;"}Ctagsw w‰-ns\ i "k08>Ariyi;ŽvgY Eq|reCXRs2aλ2eEؑ'O^GunR }y[`pG?~0fU@ݠAAQHy@ePyEjD"x㾶;#2mL/7t&\(N3k GuKRa>?(5ϧ-H>] ;dI@bKSO)ѣGdI2iHٳgH" ;vM W[: oI>l34IH l?"/7[c f@KijDŽxLG3zfΜ9vL붰xt~e'FG v#=zC "4Pi$@$@$@$@$@$@#vb1cƘW 8OFp~ؾW*g>1|F&LhBg!lZP[(Oy~F=1` $ލ1 õ ذaٶBedGm<4jN#5wm ;x~?;"5;Axv?7±4nxsi/Q `F; u@m…Xdx/xf?<] 5Iko@A>? ;l(1t6c>|?ΠLF$@1Wء)T\Ԡ42:#5 :tpW؁ l3xz@8y'ptk ) .%C1UhAϯ>xn֯_oB*Tp^1{I bQF`WHdxXEYbq  H&4 jv9v Ν+(@f["{y޸&z2uT!lp{C-]T۟#?AP óY@kD;n?цb (Ż6 eE ?!\/Q"aҥCk׮5;Ng OjxC 63oH5gB`$#AMV{?c~yr_8uP @$vfc0* pس@fBP`F"=(jMtyٶ؇ Dk;0Ps9?  ;p.X`РA!1Pg}T ;-{(M6uWنnE;PXxA ݫfyYgwn, Z/ aV?RuW!jjذaϛg}&|245Xl#Ϛ:-pA]5I"{J۶mݗȴ=yd}|לρ8`v DאG*-aʓH\_|FC=>i!{B2^aWǰyA,aXC]B6Ğx o%~XBU$c5W ;g1cy&IϠ_~/78PH$CP aa9V;9.q,cq2yaWBu! sF$af?RakXzZ2QF/(;A$@$@$@$@$@$,v@~xZ;>}0) 0wbݛڷo/W_}ČO y hDRq뭷,08}0CZwy}8= N~8 I28!?06\wRhѐ{A;vXD+?P{{&- 8׉x>uV5UVirmy^b0=ȎA'ayr $ 3B@f?~35menݤcǎ&"#s2+^43Ctbg et[P6LgCC5agּw/1۳gOO<[2k,i!wL؁ <c7o4@P#ڲxl)&b?sڴi+ӲpFn]7ʡHlj~eXwxÔ%.r牰A(a)>0hRE|G ;4vx?Ž 6S~8ٟ`B~mb @An(޲ oԽ\rfA*Wla`q),{ 0+Em#C Uء04| *0{G\,y,!\֭[M?\Ab% S~fy;?Aء! oinaD0|W^x3峊f<Q",l<0~#x&w>Alq]wxGg#z4@IDATb1s;>Π#>~<HY.Ya@$@$@$@$@$@$@$Õ a0C1Y BIOKi$ P3U>J_~f]^r-ҢE -K*𻎟/}*WVx ,zb h$*Π#Uy G@ձq"      h+ bFyB D 7ߔ'zN '@aG wE1<[<%,Y҄dQ+\s0xŀW֭[Xܡ޼.N; ;Ջ<!LH UAaG:$@99B$@$@$@$@$@$@$7p#nΉ{p7sI ,'@aG (\˂0 3훔p!x!E֋E ; T=6mdZAUԩSW^C\@Jh;ŽEHr" ;r]eHHHHHHH >JaG|.9묳.Ľ_l}$@iF aǵ^+m۶554i 6,j@@ .ܥ:p̝;W >ض[رpBy,"Ye&Y4["]%\bӧCJRLh=zee^$3(DIH>`HHHHHHr!p#_`A׎Çˮ]ϐ9 $(P q]  ޽{4 eN:RbEYb@`NÆ \rƳŢEd :ZX1#J9xٳu4k74_|{nGP}emy\I@vJ AŽ (2      Վq?Y     HΠ#@$- Pؑ-o M$@$@$@$@$@$@I!v$/3%    \I@vJ AŽ (2      Վq?Y     HΠ#@$- Pؑ-o M$@$@$@$@$@$@I!v$/3%    \I@vJ AŽ (2      Վq?Y     HΠ#@$- Pؑ-o M$@$@$@$@$@$@I!v$/3%    \I@vJ A ŽSTMo򥫘nھZ>1Dn-3       h+ev$@$@$@$@$ h;Ž\$@HHbҺQw9$O!|X:wlj47o.z}8 ]v&+!     W ;     \C@v[Ί M aG㙽\ʦ8:$S~.<| ":\Ԩ4F ٲԄgYmELyy%ŽZڷootRy衇0죰#GR7ʖ-+l{]/*G$@$@$@$@$UՎ. <Π#[ֈH Ebv4{+ۜv9Lg\*YnF`2⛁hxsiժ+v#,\\|fѣEV^-sSv^>TNW^ywqfɓe۶m!i+_|E>n'p 7E]d9rD,X +W 9iΝ2~}      "vduIHHHH v9޲F$@)"@BR`qٹtkd@KڠyFO;l>Y5ʔ)#C 1yf";`9R (`u]vZ%zJjԨaRm 3p#F$@$@$@$@ً3(^%H#;Uo!ν˔5.F&iAT mRNv*l!cTV-Xl/ȢEdE^-Z߰alٲ3*K6'f>xhҤ9~zyw4Mwdɒri  XYFxS~}ɓ'@ .=7/;nxohӦxa 0`b 1 PH}^u`g)pBw @|5Qaڪ}x@r)M{4C$@$@$@$A@vx. FaÂ> hagC@[l jXm׮]-nCYiڴ޸q53пyG,z >\&Lxa-Wy ;ٱcK:ɜ%Xr-r:5kȀ|E@ye]Ҽ#? @5~po^e0h/n޼l@Pfرc\֥KLxM!o׮Y6lt ;n69 ƍͩLC$@$@$@$Π# p% @ iҸBcwW?|(3(G2yDc;^ΩAί_؜ב&j7$=jmP`o^ I:\{n' 1Jرn:Alj;n'pPыOxvrF@Tܹsev:鱂k@ZƍͨrҵkL*3x@稟v $g4f-pvZ+x p==@O( y| ;-?NN>}D>$@$@$@$@$@ⴉvs='+W6Xс !m ~q` ,3gOW]u|c2Bn4x͞=[y/hC hEkhk_r%&9<{v݈=HHHH#c/vǔ9 2;)&eKT6{Hg8ԶX/Eg:+y䕆՚KFݥx20b!8o{ ׋tv`7:X J ~aO?t&fkl_cձo]ЩVJGЀN 7x0@gZ$KcGO#S6`Kq}g@4Yfr';3lDʕ+MdΝ{cAD"5x7o@(#lYf 8jud4=D ^!B ʀgt;dԩ/fs5j9vmCZ%/P>̦;[1ds_!~:{1qD=x/r-ĉMpuԹ? B͛x*S WI>Gw;aݧ@Ax6;;Nn@NѿvM7IV&7 IHHHH AaG$@9@"EPl-itRM%+7/ߖ5[uazk|9ʺ3f?Ma' MD3 3NTK[8lٲ?` eö1KTҨ#!\Ba?x5A:{5eժUXuv#;~֡CsAh{Iqu ANB7>L>6}l1\xy׬P⋎iv؂4 jHHHHH'A;pՖ-[J޽MЖb1߀!La1;2oLwhṂPL@ډ^.ɋiHHHH' ;g3Ir9 nfҺqw9q㋹#$FQ㔆\6F&.Kqa%?3M9;yCʌzI~2wH N׮][9 `AHN?.q饗 !Llk۶ NO?4Dtf2;mapiz!iРVGx +СCG-ŲVtX&(ZT6[1`?;:/0x-ؾ}ʁ6'xQ3|)3:Vu놤wɳ u([9/;jK\}m>%b[:]aÆWж4    C@vd{ƒ Z3p aD |n /؆7~xJ<^9a;ta5"R4ڻhq1cL9vU}[j%J &XSŒ-,RSɈHHHHҎ3"~NT<Ǐ!ȥ%P֖y1tòlOzw߂[" ;݂mtL\{Q`AzXvv+t!GBYG%%5j$w_&auyӁ׭3gδw{gag3v&Cw-DM$@$@$@$@$pMwat )lƌOAȁ0x>9<@`p&-!ڬ^ͯXb2x`)X Y.YD/^lB^//RHlU wAOjiE{*̞t<'   zΠ#K@$M $[qJr{ ʪK"JwaǡC u]ᒘ:Hbɧ~]QLyB:0{i׮]!uGgv<%S؁/^\z) 4E:!rB /$ .t٦CLu 8۷oa䵁YZ>zʏHHHHH'.HB bǏwyǩ$C xTd Q}.v-쀷 L惶ߜ9st,qL @6JCz ; 𦩆^Z+q,niѢI84    A@vdR ! ;KΝ#{Vȫ*SLxN͚5;Sta̖-[2ڑ݅{0UC:ϦO!_v܊+J&M /4njm䦛nMe<"g3vîώ;dvÃ$@$@$@$@$m{TRo8" ٧M0o`Bz}*@;&U؇ e~98E>Z''$BBpYgav]UFix@Ђv/Ry-\d9_=v9c<~"BF$@$@$@$=h;ŽqXJ 4$@aGt{>VsܹsJ*Ƶ*7n(1ewa:Mexf[]iժ+WlN81S)PR\ @r hkV ; pIbЮ3fnʓO>)5k4SNW^y9fK<3 rs2LIv[KO`<Bt];#h1sKp=4=WJqI$@$@$@$AaG(H } P1\!E)}׸-6AtvY`hڰaÐYPD:ώsHHHHH >ᚕŽhJ/h@c?&O;q+V}ݧYC6H! A8 @ ;b)IҐ@,ŽΓS_-XST;` WVm^K.t*XƐ!C) k޶w /f͚%V201~ռµ*TH~mg&իP@ w}!hsc@\Z}?~Ž뮻Nڴi ^2fϞm\VPAZne4Q۷Qe˖(KZhѢzX .^z9Bٸ\ྫa}LaeRvm;Iun"&    tv6Ӟ={2Ahd:؁p+Cula?.h"̳:ˤu ;RYT^T6C=$ 4089v9!@?HHHH h;ŽW,! @Eq|reCXRs2aλ25Eؑ'O^GunR }y[`pWQJvelB n{'8!@'<GL^;.VxiԨnfZB|r=dޑEa.jÆ 8ʰd ; / +VjX0%X~v ? _|,,]([^z^t^kҥK}BaHHHHK@;\RZƘj}5B|%BFjkZ]z$*0`h &xL0A/i ڵ3ŽT%Rhڴ?~kH$˩a\"$@$@$@$@YO@vd` H)hæa׎N)aVm^,cfVxVQrI^Rt5ϑ#ɻ_=)o";+fwu hc`[O?2gyFVja Pp֥KU`{'$$$Q/8P37n4%mҥMV/ qC$t}!m]e˖70/2m:t0!Lߏ ̖u{v_۶8#Gv>(3bke=Ilr{6E-΋ m߾]nsy۳ Iُ8g!OCG,ȸx^5iDq c(/BG$@$@$@$@h I'xv:'M6ɭޚvW_5kdJqAALDwq`lԩЭ~u5ŽT%R^{]wM^j;.:u>m    4% ;X$@O Vaj%z˩'Tь$K'ɤ#e!$@ؕ6MzJ-A?3ސ- +60 0 pS9SY0 < bG򈑬sB,Y҈' 8@ IAP>vPhD%.c,׃N:& ;8oV\԰<9]~Kl @j hk: ;@]ٳGz[n-Z} ^d֭`'}~X~瘽b /p]ϖp Ż+#qiI~t3#uI嵴௡cYO>zs >9FOHHHҖ3(H[Ă ;xZBE JӚmLJeEŽ*'בnr%+l2mXjGr>HHHHHHHRO@;\UQzu8pSN1<4L9s駟vc@& ¿͛'?:%*@#G4:(_}%J믿#uIVreAXWc"m8KhaAu+vɶmLhx}$@$@$@$@ h;ŽlH"C/RT ƍRlmݕy;1F 2fԮTV;Ib2zٴ=r[$ $v0`hÇ{!W_ٵk,]Ԅs5b˖-N ٿ',O._܄J*q\+na.ݺu;G#&M l/+<ṪHHHr=mgPؑ va0mkr-T#y3ڷ]~G/oy @5~X6۷ψ5G^{Mx "n袋0!xe̙!v :H=B7p3fșgiv{RQ-W*k" B $ӧO7^|Mw!ׯJ׾jժxvo+/D$@$@$@$3(̆{HH *A ; v3k>9rL_2N& #^=K       4 vvq K߾}I&;w+$)vmV ,-[f!֭ 9_|Qv=OfoСRT)^?6oJ!rWHǎ,`ӦMFTҰaCꪫn?a&.ZT_H6GUpa>|D9.~A8wŚӓ v>H"HCYDERX%cfZpI$@$@$@$@$@$@$F5Žd"([T\ل_YvT"Cŋ޽Mv:"? KdIE(ЁdS6Fx(AQ# F3"n"06 $, KxtH:{[)ΙTs,xn>#3]r t'''0∉ h_8@@ OALy@Q;B"   I طcyWdÆ 9Fgp3pOC@@@;⯊5[ɞ={駟v /رc@@p9`"Cv8tb    `}JCC֭[^zI6nҘ4itMrey$==U   @`X3v|KpN ]B@@@/\ vk#""d̙)2`#q˨Qܹs?Q! 9`G`#Gb Q@@@ X_pĄ@w4QL2GZZqxxĘs |p  9`G`Fp$@@@"`}J!B7@@s L#@xy+   Np%١O  9`G`Fp$@@@"`}J!B7@@s L#@xy+   Np%١O  9`G`Fp$@@@"`}J!B7@@s L#P-IfpSʼUoc;g@@@p%ؑ'   9`h4EE(#6#N\"kv,>inu\    @ X_(y  9`G0*cA fCC-ёe8Ν/̐JkcQr {uм @@@ X_C!  @Ax܂@a;j֓.*7Wc`.- eϳ%b)󶒇n2oT9p|i@@@(> W7@@`>ge< 7 v*'' ufofeir^<YSJ޾Deor>{sR\99sȹsr<...NNSgYre6[.?OYvl۶ͧ{h   @A/\ vT@@@SASk@  v(QBZth;{hSg竧˦v $9JzL~ ;,f͒H#F͹GnݤG(%%EFi.hILLYK,w}ק{h   @A/\ vT@@@SASk@  vWi(R8K/w|*.eWth[ZֻO4,Ǿ,O:N@nG@@ W!3 @@">g(rj^*k-۟8O?+' rRB|,DC#z,ߎ-{*qb#++Kᅲ'Nx @@@Bp%Q<@@>g W`GdD)y4)UNΝ9+'k n7s xJϞ̋z`ǥKgϞ   +"e  9`GHM;E%Ѽ=FoeY&Q}XE?iG>[1IX.Ia;V*UT1?p?~\ׯ/-Z *mܸQvڕk%11VnݺҰaC^ϟ?/usgj $..NΜ9#wYN>4oY5j$ժU3mRRRd˖-r\ъ^M6oli۶Ԯ]ۜ36l y>Ǫ[oOʕe߾}uV+u4iDꋶUkΔs/Ν1!  +`}   X:N% ¥LYy|iNWֈ,+>$ߗp7ޖ~VEa;ƌ#76o%>> ^Q<Ӣ [xꩧlٲ9\rEV^-&MuԑaÆ;0a9r$GuDD̞=۔k瞓_~Y~h݌3d:u>}Hx#mxYyeӦM9 >3sze9&ZW_]߿K39G@@"@)3A?@@>7$P`GsPYQAz&,0[~ڶXWQ2ҦIW6\κdqGNډ/ǫ\<"s^X(yD_0Ő!C6kժhZlj'dРA^իWOƎ5HaAc `GjjTX~ɓs+.,mڴ.s=qDY|z+ءA]!\r^i~( ,ȵ @@@ `G~sF@@@a_qv8] iR|M/40>(_% [*< +!괖{r+j]B"%ʩ3d|܉혮KrrTTIz!V-ZQXx@zm=l5[6!zF˖-!V_b P haժUf+2eʘ}5oFN >}+9t g$$$괭 ;cǎ[ y4mT #}ͱW_aIJJ2hDt\zhGLW{ vX׺>G2v<7   @d   N @ \Ov\ұE[*_G\3C*ӓ՚H?jjw$_)4e%Nv<3&DomBZ[|[-Zz[ѣe֥[4jȜ8p@x zݚ壏>rYt9s渵 {СC2tP6݌eLidҥnm@@@Y`G }G@@' p'L0֐j%&rխ"%{EɉQ2҄?Uo;rj|ٺLO~mVq=gJ~̹3a{ѢEfE b͛EC Е=e˖5zXUIt U?:wlVЀ駟_$--3˶m\։}e3g_|aUP9?~Ќ΍Αv=ءׯl"ǛV2q   @   0;f(;w^]-#tPbVCڮ}Ӈ$&ڳ.?,z;)Kϒ]RCXz~ԨQC|MSmu v %KJ$+\;t  0V {CW]˰a䮻2ٲe3Ɯ@@׎+p   P;Cw"dxn^Fݍ["#Mq||p)jӃPR%Z dx[1Ž[N:nfX۔XUWC)vnTyOJJ2+hݻw{{ $دIDATȑ#2dȐ]ׂ۷ӐW8@@@` ,38@@@);2(`EW xuˋi]bU;ނx`nq!)< v,]t%k;9U|yؑ'o7o'ϊ9n@@"A4 @@!@@'lW[nңGs"#Gt1cHƍM@—Xwe_DDD-s #{6m`ʮ]̵nUibGn[9d(G@@P *38@@@_;%{bPv|RT)3ƍuAIMenmplŔ)S$66o2l0&ԩSǔ-ZHOVo]htҒ)o\xT+III8z-~Ϟ=O0`.;:^{57k'[}M'.#  @ IeH   P;#찯N-3K\\To+r8)ء+r㏒e?t;t~Ȑ!r=_UFe6UTɓ' h`:weʔ3gZͮU?֬Yjo9|Vmh;zW6mj7l 6mц`G @@@ v؄3\@@(rEN ~Pv-[4[GuMnBB<쳮S;쇓)VZeVҰU}]M}'tkҦMcn+-[֘,YҴYv%O@@@ vڌ3^@@(jE-_M-~R2.W̋ܨW+:O0S|FRlͭLT9WWl$Yc '*U2[hXA]b˖-f5j$ѺgϚ-FYvmtϝ;W>c׵uۯ+Wκ Htty~TTN$sq]}%+Wew^WtAtʈ}m_%--MׯڂE+ՊQbE@5ϟ+VHjj4h@֭ڎG>|Gvx uCW=xa:uʬ^T6u1=zȜV-o+LAv3gDWɰWfҥK{{⋲yfk0!a@@BQ`G(:cF@@ Q<%ء$ͲWq! =RG4Mc=7Q3tiWb󈬬2s˲:GYffU$GǛU'瞓͛EvyȌ3L:ѫW/&Fbb[ٵ.r{Wllhn72eFtNǠۭ,\^v'O=k{V_+W`СCEC4>g۶m1j( t3gn_駟f3]vͭ   @ Xwcd`   ?vSw!;A]Z=.5*Ψ\%/%gٌ47k;tەZm]P}9zj۳ TRfˡCdΝ@h   @f   7~E[F   ;|=   }E|M@@@!2 @@&@oԼ s@@@U`bG@@ ؑ @    !"@#D&a"  v!;wn    U   @;!@#H4A@@@ DvD3L@@Q"W`G-#C@@@W@@[`G>"@>v&   h  ~ 7j^@ #FH *cǎÇ @@@P j3x@@@v0G | vnZZ,*֭q˻y)   "@#Tfq"  vK ;ڴi# {].x6i:Xd@V:l3tEc Tږ :[{m#((fg&+ e8 >((>gɝ llsD`m2R4HHHHrXΛ%   6vUfyAQ33 Tb+s$@$@$@$@g_5bnA1;6iF$@$@$@$P PPO$@$@$@7 %Z+TPTE$@$@$@$@ȇHHHH@#w6x*6I ssB$@$@$@$@$@$@$@$@$ tAPd>%$@$@$@$@$@$@$@$@$@yYE/(2ԙO @$Y 6ɀ.HHHHH@@hcC($@$@$@$@$p:d2!    ,HHHH:t!     |HHHH $`s#%Ap9 T:PtG Eln$_7XԅHHHH* ᔹG   (<T ύ=HHHH'@A?bnHHHDb $gMq7 XLŨؐHHHHHHHHH"          PP PP3@$@$@$@$`@}6D$@$@$@$@PP@$@$@$@$`<    0G"      |HHHH,&@AbTlH$@$@$@=+ys$@$@$@$`) b;   d((VvIHHHB-f$@$@$@$PPPl' e((ZƉHHHHOR{bW M"          PP PP3@$@$@$@$@$@$@$@$@$`1 bC   \ujv6k- @((!   0KU` #@A E>$@$@$@$@h1*6$   E뼹[   EKI T2+فs$@$@$@$`! -(;kT.Աp@bL 2RRL;TMZ @*1k³wo;bd$' =1JUxVEOTHHH$p5%KݫUͼSYХ#"2U勇}$%_G`̢8q<Ѭ;WwFrJbbP 4iXl|ǎq|jr1S?յ]ZyŞga̞ۅ ŦMШQ]|ؒ^#  ($J)(^޿i.)TN@pXG./>{ @{A̙ M)ԌcL|gv׮Õn h٢ ^yb|jN5y/ɘx% C۶ŞXOl jaO9 6"wkc28 @! TJAјQ5HX8mۆKᰭR-~8C/ :_;#pθᆴ;Ucj0Sm睧g=t IIww%+J-!bA:"=q5%$cDEFtxyG^m y"s Q^/%" ԭ[7$\: ETtbҥs 4lX/fʔQh;xr:xd ..Uq=5ڵ+ǎEnh[Ǿ`ccrHoϞ]#owtݸpw+\B8 ;H)3zo@th4AK"+r_"<*nY*(겳qjj\;~P5||տzai"I@iڌ5^%juT3|~~jmr ¥TyQ}!,[3lɽRkք'px#vd.)\e¯wbf'Q:6|y,pAl@$@$@5Uy2e.^  }KDDDKnyYG q;WUpEc>VkG]ޱi!b￿2};{ ^}unKuvvT9]]oIcϖc߾cw ^6q=cz51㓼oy8s2TXx|:\"_skbR` U Ij_ye.U1lX7x{WENl $Dy]2x2e{ѡíY=]ةctIE،VUjn]1zF1ϧu{JMPg:uO1wY_S/X C ƏlNS6CvQ5p cNugXfMݓH(mULY_OxHHHHFP:|Ry#A֪eb,(6nTop'~ nk-g|rxldgdPۀѣasU<eR)ZFUޑ9s[2)6NkC,5)(JU[6"5>ZDX 3,k>2oZXIWVF6vH CQKxN5~b.Ul{~Th&m#wHHH $(2SocۡX3KU۩Zt]D4gkw%͟(Yi*G-rƴ/r!מE5ʓdX|sμQ2Ihn}k{{[8; V+ҤqCc>|M]~g`w߭Wijڇܴ* 9K{PJhDhqwC<qaܓ*W*x#GNÏ}J`$@$@$P RM==}{y><( yr(+!b{V`ٳDPP] 3h(C [ʹs8>Ž{wmڢXPF.mx3g*o=a^2#E+ A0W/DFB/Vsub4^kaE-$[ ÜxM id~yS $F3ؽkKxx0עE& T:&(+;RbVo zj2[ԬWY< ÕpB O<)eb=aL8( M'߇ML*hI/hxu?aCE"I8 vrf璼 R7F׷v|и7nd`~/8 [֯[~Y[X)#7oXy6HHHn(wAq]GHwk඾pu-8@41~H*a,%oɕ+UwGQXXl2h\7VH̙͛k\<$PsQF}<hоIWWP˃__ir_nwףTP4' G+a-~:f8pl=^$tX|O$@$@5 U ;{eXe>zj\n| 4;@5;}"{{PLR{WEd)2}矍Gڷȵ;`֬s&Y@oٲM*9xZص7׭ݗj 6֔#GMUM_Ut66&އm} B$@$@$P(O8;#cl^i狦ܑv,R!Y*4MPӪa`- HD<~2J識qx;U> f8cAQr;T)"I#s9c̅V9c?FP"/R4+- sИ 뇾ZUd/fhn)#v k.\ŞcKqH[EF$@$@$Pqp@ VA̙7ur)h "J4XT 6yB*5BmX@ SsgD|wyG5iOz_!%wcķ";=]N r]< sA-?uzS̙N'%'xy>ݺF<4e ]Vu\r IDAT/Em"Jȸ1F={N˖fK#QyEUC޲'ٛ!p:?6Ş??ؚ3.IHH*ۏ@'_R4|͑qWvu_&i^m^bVq(9}j Av 21ӔP&>0|0qzjTW噾|9Q3(~G+\AFf,^Ѓ=pݡ&si墳#lmmlHϚ5.՜Tʛ.uf1.^ 0iǎEhh ?3[S>Oh;~`,Ssc_  T(A1'|MP담xU@D3<)PLQwj93ZƗaxs21 KL"uxX:u(ʚIecɿhλR4ٷZ vQCuA/f2%arHݲE])(0+ CCUw f=/E id"zWHry%[.k4PNu̇nh  (+$(՞ey//)ZAQ#Wf3Cx /ύgϠN[r͸؈ŒCqՈ1-(}ԩ]ZLq% ' 4x{/j{:O> u)U)"7_0 rC$Y|tx/<2V%ܓoڵ0*灮][᫙/xVU Ђb!-i8֪aa"楞=vvwWŸ%&/-7U(Nukxyo88֬ N0r "FJ>":f@=uX&{~ႚB撂 _FJ|Q¯EOO /FPrG*ji/٨DƆ ki6Z&  (KX*\"0$(Vp$@$@$@eCbp,eO@rF+wj2^Ƽn<|_1g$  "@AѺΣTVCATrP   PP폸n;U%wY378::<N.y%gTy"i$@$@$@ PPOJp" k<՝JatIG |3WG[ g&  +'@A$'9-_0[F$@$@$@$@@Tiĩx-Ets@ol8tee} 9\ XLŨؐHHHHHHHHH@LMcڨZT,fqӧ/ʕ$4hPKe:pHe>/*<2YBTn5TV2m{% (:5M9)IHHHE O&bBd$%++LI j@fP?$D^l&$$ysot2א;wF`cQ?|gILYcB:u}ÈG{9vFF&<>]ݟGU밆d+WNCp/u/^}EegC#G4V5Q;PǢq؈HH`w1 XB%EP] 11y`#Jɧ>Ej tkίfH8;;/XkFA;#vuᕗS#sB e 9 @!@AJ$@$@$@eJ"(W$BMjHGbt4RqH Ww"(feecµ ĠAPU:[ԩ? Fh drEP<4{6ӕGjFҩSx/i z(sHHn/onHHHHPPdQ)1VPPYb-#S,bqU˯R'NZ5]-(ټYWsw7KD#!;3h3H$@$P((!lNE$@$@$@E3]~ 4WއLTmz}ժ䴋]N.n\,bRn윜tШQ]i6$ X8g*mlk[29oHHHHlPPYcG\VWAgMPtvsS,cG%&BP_zѫ=zpK{ C̍_TAQZx=6mgvٽj#XܿS1@&mΜwNz46hkkfHN^kjߧwrZVMKv\ץKddp˰+cO_Ď8rjϻ NTt,ݤ>@4lP+Xl~N@Mk-Ǐ.^LY&5jTC@~]*j[ IH6&t]õmRI2Qmлw[ԫWr@$@$@$@@㓰3,(!O3W6®&(}[[ V⡄5gnڶ[.= '~I'Oj*Oơy4@y &(ׯ\kX:Ly,w [pwoxt0}Ɍмyckw:+N?V9W^1-…j<@%w[*iiص+RKĢE-]pΐ^v.{wZf{ŌO_/ǟ-_Ï"lW4L>js׳ $ _"?pvGD=}ԭSݤ&(4(h/4[u0mƌػ(TǼ/‹D4/:9 }PDJ9߼Ui??3X Sf\SjNP4^x&%/S{KMM3PwAy/ڵ] ^rG3'(JTgPnckڤ%9؋P?zT4n|K4OœO謴4;Pukw^Уs۶R>\K?c{~oy.'ag7Ϸ؀HHJw|?qC8ΞbQ;ߣGk 7%0    ȏ@SC+Q<$X<̇j+nzri`O_stT"O~#竪I_ݻFNAJE:_n\K<Č_~نlS_{)ח8X~8<<I<Q S{r.>jW҂=tLŵɯ/x={zO@s8OÇߥM"7lԋo(WzA#oR+"k?|*c$^6U(qEi T?>go}QE]V7PcQr-eRtgcؽ; W |!@ IP +Y$Z$o{ݑ 1)! %؆ mnUPZnQ裩!%(À/UA&5\._MR^Yj\eƸ"jyt5Q9EPI~Pb}V@@G-}Fuoꂞ' XIPZZXNuNvvvX`Z   ((T,%u@UW(p۶M$@$@$@$@%@bꯣ֩ZEP\7CL;:ZQ]p(!$?p$v|9HgWϝ[0,iS7%B8(Ye~،Uv~m)O.9EYפgN[TptuUL敗DFuU#?R[ZEڦg75 Y&6ޗ@-Í;Q<;w Bs.)h& W//HۋǪV,h?O$@$P|i'VJAŜIHHH,$@ABPR7=150[{{xÈ u۴{n|3MPڥ%ƍ _yA$)9^J/pƍ ̛Z46ܳB*6+no67p`(yOP1c9;<@Ǐl2vFF&,\={!"|JNMӪi0؈HHHHHHH%@A=oL;5\РAM:9xI{)ݴ[9yNF$@$@$@$@$@$@$@ŊpJ\cb;v vqNJ_Q^0D寤 @E!@AY&{+UɸSpw4Y۷V[Z ;fegFZ$jjU2'!  HKשnN̩[~C$@$@$@+ r_E" $%9P.S{C49+m!{Kc I$@$@$PF((hNC$@$@$@$Pq3 .+K/~xz/ igFuчcӧ/a}ptrúi K:?^wŨQ},6$@$@$@VJ E$@$@$@$PDPPw߭džjQ},t1Ӕٽ[+;$/ѱuT5qwk%:>#  ([˖7g#   (oVnCx q4lXOW]l?1g6M̀(Fֱc7n"^DǜŋW!BaZ*s[R8p\-[h7چv"E؈HHH@HHHH,ުCqȔHHz5\0SKi~.K{lsxɁe9ٹo?YP{o4X3g.?v℡s ?fۈסxjg?#<<5N T+Yq$@$@$@$PnmM߹yS m/ٖyR&8[?jdնLdխo XbeyFE?n6kB*A?3 %J.]Z (:bfn }zKe+7beDȬS:yN94izjZt!   IDAT    6$( v8:} jTŽZ)EKΰ̜`moMYϡAZEZ5t_R 濔6ÂkhdV,8:V1;'χR!F$@$@$P PPՓ @6Axg$bCxV}D.`W\V]Gmj\d _ ~W]/_N fء}h ?CϞW_~U1F$@$@$P PPՓ @sW!<kvQE[ĤXˏo)Q.7`xv%:vQ۵;_~֛#^a$DyUg򜟭X7~cʣ~'zhgm9+UE߾ZnU HHH$@A Y7‘e> [`UĜh[]KG_Vu,$$$R=ȝ߯}]ԁ.ۄիTw}(9 k'NǛo}}2)ԯ_pai"TͤTy6g UKHHH*>      dfeaWT,GM;cKoaޣr5? ??8w;e#*괪,ՙb ]BJtaMɷY<}|7G7ʼnUe' ,4lO$@$@$`((ZpI$@$@$@$@FL]K "ؽJ[澘g%cE<6zIhYb|b #$?7HΙ o;oxE 226ߢ.Z߉߻He'   @ X=!S"=# B1}s4s[jkW Ϛc ?quVy3&s&%avs_zSQEd2)"SG˳)Zuk.}̛Z{tx/*'C1HHHʑrϩIHHH XSGN EXX1 &a."L}՝1 {ŌL¡EtxoeMe5jT3\AoJ7rTC;Ƀ)!R&7GƜkzk"?~pY4cA[}   +$@A K"   k P<_~نlwrf\6>4[om8qn+s # M7ڪmjjNDB0wB~!zpdFx6j6ft?Ƣ5 uh]Ր -$==CA{UNUr)$@$@$@eEbY<$@$@$@$PPP` @XF9 T4+ډq$@$@$@$P6(( gB$@$@$@ wd\0  e @#p==[-CJo7\1 @IXR$9 T+!s$@$@$@$@$@$@$@$@$PR((LsR$\c|3g%m;O>yxAIHHʆŲf] 11ː9"  (:.(y|:222!a oe$$#PƎZr1{N~}bc/QñEKؼyEÒN/2ǣ]m1jTK XCA as*   b̂bff~a3muk<{ ^}u!.6 LCVV5EܴVacSƍ]֥r]$@$@$@h|q޵; a"!:'euݩn]G _q["(v{?EY)pl@$@$@$@&A煶>-ą7iih ZHdx={hNe?lD4иq|ǐ=^DǜŋW!BaZ*s&⫄Rk!))iزU6>psm׷ڵhlD$@$@$`((<y:q ;vD ^,?u8z57G7o%/|wpW/VMxZ    JE!S"!:pN-ѧ]l_%LBϞ TV G榰'ͶhSy%tch\&nVq$@$@$@$P6RocۡX3LZӥ*Jy-.wY~Gz֔E8~4E,^ K*U`Kyi>,XV_|N&mZ>;:V1;'χ޽5>޿(Ke   +"Pl?fQO]q*N]7h0jj&TP4^ˉؽ;{EzѩS@i$@$@$@$P QX.%+.uƠN)ߑ.ۄի<^^QoyVS <"-㫙",,͚c[#Cơa[9 ظxcGu}   +'P;#v>C^p[_V$oɕ+UGQXŋYL]j2h\76;^QEm '9s'ΫGHHHHH`Ual&_>ޯ(Ӄ U+Py5QzG6yV޶8WJwa J%(O8;#}+\ BH;_4m掜iFƍ Otp5MV-EY"/V={F@YaŤػ]K5)c:tPޕΎ|IHHHTXSg p@ VA̙[M\=µjߑY`^wȑ}`S5j`~-%baMދ|[O~ H 6CXX*Tw*l?aC pi @'PER@xQ4srm}.WUK9{ǖ/W?72.&'tNpnv-x:̬,9&ƞ,mEoHHH5 +*D`끣&ulYrHR$Dt#KXq:wwPލ%e=NR(&^})!R%&,V>>֛#2v'  BVP4>؋*7ᑈX#ro'i Yii8;vn}u^N"vjVF5v@;|5O>\ @)&Aqň`ر"$vogǒe(^x?\pUm& m| ELB'Oӏ҅0G'̀i9sVm]1` "#c-y;1"N$@$@$@EyK}ǔ(/b~ )Ab\M_;W:\<$ 5?5kv+HHHKU4hP mEp/ n=`#*:ǎUrzAv^^@1 :/mO˷_?<2kUW[m`6mѡJΙIHH̙ mm[?2ۚΆk!  |((Ù#|Q DbbZ&2̵#sEY.^LY5jTC@Ѧ $RApI9 *"_^+e[Eg{{DE.p خ0 ">> MaԈ^QA1z]6e*ʲ jOWQ`  f՝o}+/TcLҳG1^K$@$@$@2 XUoTDYQr(̲9m0,?NN6TuYSGQ Qyqmfo`3m6p?wY{= wq2YMilTy>~6'(g\ҥ둔b4g> xGP96[n/'[YB_:.\VUV"GGŸƔ)ѽa1z1]m!T#ڦM 4kV_Dr^2cIujVJ-v^ƿ˗#, õk!|J@g d+T$@$@6F<ϙvFj Æ!(vvumC$@$@$@5J>,; -a6gG-8Y~"(;W]2'(jm%|X{W C:+aQBdz+ǒ*"?KUi/A"E,st4[=/Y܂q*<<[4Ƥ[FPz5Rccm^^cF FhӦEd#  EE!yu{q:Xz0; k!q$@$@$@$P((Va˖M4 ~|oSق|㓕t$4СigMAKCQdžbР:1KŊ:ӧ/yhڷoiz+SP/ #*S笅T8t>QZx6" lMPԃ_['Ѭu1"}t @UXI']'9 ]Q2Jckξؼ%/g[Z⑇)(|xcN)bEo7 h")w[| JJJQ¢Ԭ\o IHj[5@D֮m,MQg͐ -XIwE D%`%Y[Pχ90G #yXy IDAT%WܹTrwwŃ D>QRKŊ8/)"XF(cIK3gO,vU(5{ٻФI$@$@@u㓕U1ɝ`ZrJ& XJb~-7GX'v釠--Z3$jR0&44]:1$;ط(?u(<7z7{ q^?MyvJɗ_S*bv5DF]Fyg2$$M)&V8, TO9)P`Ihذa䃞fqȐп;ܜ,G$@$@$@E+T(޹+ZgыuRX=ڙ>111HXFyD9H)je$!<<S "+=BCTeVU~G$` EYiEa\sƇ0Ç)vEhsw-(53Q F1[z5A>Щ2ِHHJ;|T,޽:` {W8) 6xyy8|8aaQ $ߞ+lWΞEe!h`PUlղiR@(AQ6goG|f+ Rޕ_}JN4ju8v:_ԅM흝驧,^gIO˷P xS`4nd*[<1 <,I1thoʫt$@$@$@$P PPPZܽ'RbJ7χ| g.IP<{6sĈdpp/q\i_2RM( |_=hۦ~1CK 0lXZ0~/8Wy(k煷kT~oսѣom)~PA[Q(q&\Pڗ\$AQ+6LUp6ʼnť^8; x4=6n,;M#q%Խ}*|i-7+K_~^QI["%2FcÍy]vHUqY3w4l`X\u= @&p)3NbW+,s$@$@$@$PPP&}`˽.ʲ ̱h7"4icQ[sD̙?Z)Jf:Ʃv g1wH,".$,ȢMtbV܉-["pj*C*syo*7fp?n\RSqbJd]xC$trB  cJ>Ԙph HHHCHHHHNbٱ U;<<NmIջtӦ[pjk @i PP,-1'   Ab8g|0'dd\Em0ޛ+iK$@$@UCbp$@$@$@$`(( q}6M@<'=>MHH ȸ`     VIHHHHXΌ+&   kh ʜHHH!kRS W% T E @ $@A539ԭ&ݺji @~>\ZcZŋi8w\\Ѫ59o^^pnuf_a-dž$@$@$@$`-Ǐ'#55Mk 3'1[d:vo+aj¡AYx)&Fr9Ï~RkzqhY&"Wޅ߀ƍ0eZgY;_!86*qfk" 偂bYi @emT߮2EX" ?pwGkۉDt)>7[Wg)C=#ѷOsGOb ¯~cM4ao_vJs^5p  J'@Aoh$])+W~I-D׻ݻ!cylÍŶZU;hs>ó"+w^z9 pʕR )WΙF$@$@IU+ec\I@ً/܃ `VG-W3-?NNE*W&EVXaOqP<>53 FCX6'O8;X)aҜW/  6((QUPmUXkƮ*A1??3>\ҹ {s-h HHh׼%\V",$Gc^_L3.y ~m͝R6l؇/Z ;r+S ge(ͫWUXФqA)ӯLZҜUƫw¶ca̝,I|1m}\)/QsZp>?G_}/`J|X﷗k}8yy|67uYi)F$@$@ HaGu$hVyxAd51|&,LlNPLϸK#)9hN}Q}-#(Ĝx}m.NP//NKJPS[^ 5=ԋWy 1Ə0ڒ|o֬d&ujVJ-v^ƿ˗#, õkI䫸{GVHHl- ݌_0"կ/ 5uʃtΜ3hv0lhM̥SBeCݓ{TԻүj~ֵ-DBx'p*lX)^ypdMT{y5g[񡲞=z3%qcǽo]CB%y|D*YK>WD<3w\dS5A>4/.\VCVUbII)xB3_J܋M3~#!,n+&LݨDI"4yI/3#Z`D<6nگM9OgMf<,; ME{Kn-4~+"(;W]2'(OMٻ(2dpsuV¢ZVAQ?%UEn^E^|D, 7(m̽`jJ<1ibQ[iE W#56HAQ+]8lo 6mlrd%$@$@ WjW!Ɩ.)3+]?3F=粳t̢I8#~^aDtzӳ h,2ϧUښ5E9G.M|DLGyVoR>|M^ 0h`kF]˻qCpۭZ}o4nifQTC&aea>$@$@՛J:a˖M4 ~|oSق8d%:>D(:th7w5xYSP<P{pҘbEłUj<4۷h)(yũse@ҷOG#6F$@$@$`e/\ºXv.D&ȾзӍt(]}ز4kݺ9FQj1wM͒L째|9S_񏇌//wIP!Ⅸ7?S^÷)9ȇ#b-y,,x/ۏs&P4` *Bo7K?DՇK(i{Ĩ!|X;]]`^o1mkRB%\Nƴy3k ԴGmKMJ HHvXI]'] ]Q2Jckξ*F^R#|(K#wux։Xg%NKŊ:n@D4rw S%($!;",J>O͊iFؐHHL@>8;#~_]<qX+"k6+Zyމ3>- <G{x Λ\uހ"l>5#uIwoFSKxI}-Qh0·bYQ{ xIcIx뭯UWB+b(+i լUtEŋix~uOJ͞. }Ik}  ǒ.`#X~Xmb-?8o`E5>>Yy*nqX +bye^(70k?\&;ύ%QQ {ߩsL1 k0֤rO(嚤y^oNuWj9oI.ks9 N+B1ר%Ô"M)VyxX;sWQX?)xyTyopȪ⠘l]*lL$@$P#PPcC#,QIBA;[D[E qI<`LhhtncH@nmAQcoQTy+Nyno$-+~e씜/g;yoRoZ@}>)"#d R.aEUt1FMEh$lY<58cȻPwVkٲ)7Z%^/>W?A$@$PsPPYE*z|{w]9{˖CQeBUI>6;;GUw^:M%QM.ޛ!O = y^o{ Nu==i$Գ &۶Rޭ~k\e`$@$@Ր*>4'ObmQNR~n.$@^vNݺFwmgUbI_%_ȋ\ZݵK[K> qO^5+.$q}#hY3w^6G`J쇨 IDAT{̾4GnV:<$=nEJda8>v73\vHUqY3w4lp> hlIP~8{ñ<5 ZpEN,.Tz`ccQC+>y{-E"yH–*yGzͱӜIXj&ⓣc=ԭ[?}(BC[whhGL~.6m:EW+ůs(Q4_2ö́GDÌ?y $/twnكvV8\\^-c=S}…wy^zOImAZ"iϋRF$@$@Bb5yoWlEBYvaA9F&6ej{ f^a+iys@@1KuI}D\վ~ʗ۹~6I>n" h/^LÊ;eKªݪ<c?ܘA}DpJMʼn+u 'L0)4%fIа! rIxHHx$(ִD?ǓD5^\n'խuTEӌ zKJJ'lTMDm=ܳ1p0HfhR\E?!H=w4'|k DzeM=:P1M"d"5)iq_ Ƶ3n5徼Ӿofݺ"$8 R 5kuPʳ z"hW Z\´=<ѰpjkmJ֥:ش)Zk<$@$@$PZyRWeҒ"ڝ? h>>ͪ01;s.%Qc74p/u: 9w$|bR[qeDYdgpq-5Zd;;4n]*[> mhUU W {s5Y5I$@$@$@$PQ~}~ZY W0.C$@$@Ibe5xNJ1G{r$@$@$@$@$ƍ77""  Ob?bnHHHHHHHH*ŊcɑHHHHFĕ^5`   (' $@$@$@$PS sM=YHHHGb7 Xkrc$@$@$@$P.˅r:礧ѣ&ٹr&$@$@$@$PE>$@$@$@$@PP̙{a5СPũ\xb*1qklv&   K PPۑ @"@A{;ƍ0Q1'- gvT"5:ZLAh9 @)PP,,6%   ZDb9˘oj{])]ás)(V(UF$@$@$` VuXҚmHHHHj  Fݺ29J!0Ce l   (- ׉p SÃP$Uwah88W]]N!ߐkr=ڎ^^Ea#, kVcx@>1/$@$@$@6K 5 <⮾]1wGseODN5899`<81$   jI ))iy{ڵ3ƌ}=ثW!B䠁n&Q\4 @,݌_0ү/ 5[VzsQF۵°A 7s TGRPá1)9pn>ӭk[ܲebsش9Byptg޽HڶM]2nx;^<|'׭SnM{0;%sCJ˳Zܩ5_RHH- 3+]?3F=7ZWH_.ƬWtzӳqAHHHHUKز3F0a?ةJ,l~BFR֫.O?mF7`ڪ|G. p-7'kW!|[bp]ѠKd   MEip FcE!n#vCNm+Nbփ($!ۧSŁHHHH:U>נxJrpss.YI5᪏Tvvu5ȗ_";- .͛M] WΞCÆ7E@/gpnyּK Y*lL$@$@$Pc زArg$Vco=U抈ڵy\/M8 2Z%(uVb-7Ryp$Y Xby1'd^R}S4hs&iǏ(J\xDD#<<gΦnWlC$@$@$P;TAX{-bR>Q<8IV\HHHl@ Ep{XbbnݑR9w{BbN@1U)ύBE<,YYpwHL3:=e+zi|;ш6ޣ+ 툶mZ3ɵ [E8;#6񬁖gSKq@psvؼ%6CƀKR! $@$@$@$Pjý{",,ʨ:c=W41M'@r1kGT|-^GwwkȒ%NM?ٱssqpuխqf۝? Ī/b+1$8\A/Urj   ZJ@rDNQqԈ>]1<Wɓ+5^^M=VтNF! D-ZwaÊg!?/gpv{0ޥskǻYu|.f   0"Kp܍."ؿ\*BiX>2[vqqй8 TGu&USx!.^+^M0%x'x!wAcWϟWy9^%JMU}[ F;Պ4rwEhhGUѱ^c   .~ksr1,#FwF;'j9ޛѥs z7D q0h&MԴX h'u @hن_ /t/B܏f   ( Ǿ$@$@$@$Ps PPlsZN.Py{,X @X9 TKq$@$@$@$P((V>c@$@$@$@Ցxj\3 X\5KW;+)HHHH  夸N        m        .((V:IHHHj$ gp1%ѼyGnHHHfXΓ!   #_0T:6$2C"155W#yϿfj?GcѦm <`w2/99۶±cIj>ԩ :E}n%!)9-];/  Ύ&slظgS3=<6mq0"Y9h߾%kmđ#'GGA=٤gHHHZ((Z4!   jF'kJ`qh`BZE \zA'O3Bkuڵ\L1dp/%G?o1%Ү` sԜl`< ["j~ZlܸlC>:u+}Ǐ'ʤ"VY@CFm7l؇%<1|}=}ɘ2^}_oob$$E^p8I_GOgUo/FaUoOM7u)1/ XED$@$@$@$P7vϙvFCȆ BP_yk͹d,C O 8x|ak\:E͙3x6i|Ly`Uؼ%Bﮑ}ѡC+%H8kw#?~VykÃϫVB\i wD4ؽ/tme6;+YX~hKpp~ -Z4o+>_[/g'2Q瞟˗3յf8q1>5 z5MPճWapU[C sgk- T+m~3>Y?HHlE[?!HHHH@̼mGbaFu RB\E5 ةSk4!O.̛;&&•{{G>q'wڣc! Gd8Fr~~>}@kٲ)S<e\ =‘3DD15ƫǟ@2xu/8Wy07xdk\[D`us{ѳa_ɬ_&݉~};Exo,R^76+{*Zeϥ a'-sup+,BIo hPd>8c%xp)(ΟS^Z?YYjxlܴ=zKSǨkO?3 W`']ll"7[o3Yw?t+ +t \0獶$¥|2OhHGL|&(ʳ7'+W4 }KWfaQ/[_VM+ / @XG Sa0%T\0(9LmBb LB%Yl)ps+^|ՂZϻ߀Uw7o^:cMrJ-{߫x0 f:npe嘒&{ܼ.Zm6팧'ݩ?TEq%g_ci7hͷ߭ ELA-YOU4  emt6   ByjvJ\-JQ Tܾ㰡`\0jy5۷n ĸqCL֊ĈS{3SD ֖ h%6>,HXԇEj'"RlNP~FZznKܹTǦFB‹k[ۚW8?W 7/ ¿E^:#AQ<#{Ò[jkF$@$@L-F$@$@$@UH<1%!RW<4.yn+/>k̥ RWƒ &(}3푆[/9kzb0aQؿ,,YO3qw!2^xarUP"*K~=K .zP;wQ3gL4*(EPaQ@$@$@$PU((VyK$@$@$@6Nkr+gŕ U PP*nNF$@$@$@ՆE *#) 9/éiS85iba/Rl,r22;4hQ ^ n[WTHHHX%   +h!E0بcGxla/ jb䤧 nnxqǨ̆'Vĥ8;;SOUTHHHX%   +h! s,q8PPz%7;t4r  E((֢VIHHH((Z~իKAB,i6ۻuC!9  ]j͞Q    PP,jAABP6֌C$@$@$@$@$@$@$P PP4s֭ÿC+A""pׯ74 AޗC1??vFɓ{''87k={ã/e۷WΞEK*W x-C7 Xh~RBٳppuUf yդYp0կohjzs=L \8xPW׸sgɽ6YYpl>>hֻI[HB3bNM-C@Q&]Ӥ6<IIȺtIAբOUF+= @˖M        q8v©1j Pb=WW"+r_"=*nRY*(J񗸟~&VnYrL4|ێP͊Svj&]D]{{C?5϶m&sp)HSugP(e EOOctwww{/]\ }Y/٢o_vi'N@]f_/{y{gϦbμ? GЎ٣J HHHHHHHHbJJvv-pn3iiN4 R^vq1uY⢸?rwQ0'-M.{|w =+Y>"JgG7HHVyvG U*Aҥ lzy#z@p?:u}y5AQv4p$TWBvżF%ݻ}/CÆFciދ~g 2TWhڽE^PF.mO?9s05h#EA0W!/D?+5Kjϐ"aaQHKb81'z l޽ڣI뚠(EM:< %Vq—KX11*Y’Y֭8o4T`cySKQ[${1ef6;'<ZnHHHHHHHh k{ h&“'$&*1.''VFƩSAN\PŽ&ޑmGTދLkR\m&MyAPU&(y&b`o!3)>CaŞxE&o߮,*x! 74o<%HHj:kMƣ5G$@$@$@!@A4tmEHK?yY2Rr7fLNVz,–wY))*X<)6-2גj#K?u S;+,(jcqړDZFDؓ\i+gERG]ssl  l 5 h{gRW$cIb O$@$@Zt* RbӒ PP,[ @u!@AI$@$@$@%@AѺklks$@$@Zt* RbӒ HUC)#i$@$@$@Փyn\5 T6 M @5%v%O͹n5M$@$@$@$P((VUI$@$@$@$@$@$@$@$@5z}[)y͹IHHHHHHHPP0˷j##ǧYԣcO{i woWmanṹyk6ū ;suuƼSlj=D8tSZ)(l~:ܹKX\d27v+yUb;R^z² R\99 , 6{4]!28ZljWۊF"Nz%vi3M||2W{﹥ʏ4UՋnj##*tn1\K$@$`((1p$@$@$@$`s((V:u;w#*?7֯Wj'p)&Y.iS4G[=zhGzѵkԇJ4N,]W0p7'cD1xlАز%Tio-277@T $8 wg.^Lǚ5 V.ϯ%:oi;5]\0Gumשc>|K"XOGSkaÂhKXmԨ~J ={by[7#BЪGGq~,^FSFcE8y {ʾ̚6i{P5k ެu^ڜ=cp,>9hۦBB;9🯢Ͽ 4$D2?|H$Pk PPGύ @((V"}GD{vHx4mܬ,D~а!/]2YaxbdzŝVwZ|ޖ WG/W%y߇O̿MX2 ͛7yG&yqhit=--3f&%'G2;zx4&8dp/%n|O{ T u y"艽ڃ`J՛x{gYmUؼ%BuW ÏbE4 v^SQ_{}чnҚ%%ADSsvۭ;vЀ(f4%n{6fWcP^=)_oun8{;{6s~nذ>vDPg? ;'%   '@AъGt;B5DyAd$(윜"4T gv2GPRb;¢n>(Y."FO?8 bhyZhL#=W5gS4J&zbփ8qL]ܹٜ_sui l˗3㏞6xgߡC C`MPk&So(DuW?%^0;yHqw s(Ϙ1e *Gptֳ&b^PHvśR~oŬr 3f?9w/O%u Xe, n{iefٴ7fi+1sR+mQ}WDTEQvd;,Auuy>yW{9q" kz5kmk Z};t@~Z2Wx{#GܼB,[ iSv UēF$@ ņpJ\# = 1)kġ0~>…(JڊLb}Tь<)hs|M(mUv:Mt}TGPog3 6*?jzU_x/h=RRϣMk<6{#1 ݺzfst j(m)o_ .}|*aON h$@$P_ =,z.    !@A8N͇qSD\4J+ьOǒ6O nskpUxpa&>ZaiPF+^B˻wk^bLxMlskJBŻL\ϝs' T#(y}Vj?9O C]Py(fv|xzX{5%Uă^5Ɉ2tԌ[o=`[y٫j-lذ/ߤjRUZ󒜌.f\׿-DZcrcXߗqk*OAa*5A]g϶YRܿ/# HI IDATLy/"싧xd80ݺلzX$@$P]E nWVw,#   qPPTq^:b`~h=jYjfL R6E> ':* MAKPU5hT$/Ia)z!+#(~HɓNV^klW_W=MP|qrs ON+⨇0U0dYQ[o_M.B ]voh$ycy}ظi_CU~_Xx11JEY*K-TSvvHqx)W"~>jN9 g\Ok#   Gb/-+ѣر#VU5o7zDBPub.3QKܼB~Uu[K:_\ByJtLڴ):O TZ/@af&2v5Ky ;w *$^G¯W 7ۉp=$@$@$@$P?PPiС ܚZx(jKmXRPg\le(Jcl`a,'#2~@`HuEYGN1'VV 6'd )Ҽh_-%:((eeeHOĬ;yVWjJD"&r4 &0MSBeھèP\߇<ںlW}I_~=9DnNqG7ooTf> ]g wN>}Ny[VT= \o p~   ((ֳs1z(&ݹe%f!KAtp-RWʣ^qɽ'9Ĵb#VoV'g>T%_u8`אF ɍXQueigOhF]HP?HP^|b3z$x?BYUp&n4(E-KH"lڴ'Ґr-Z6CA=:M;|o/cDסCWoFvv>:wn)jѶ.|7$@$@$@$@$@$@$@6((^K!ξ ر -e|z֬lV<2!#Gϗ.ۄ3{0p@BBZV3(Bۉi6}ŭ'T{晉ݫMG^8*]AL)D{/qTM?Ycqwv(..Ip%%XGkm}C#m_7Gۧc <$>~䈾?w)x-y'1K>}wT S5x zcum;?!      :!IIg{,bV:u*RaWZ&Mpv.]`l7v,u2yRbaK3__O ޽;]EiM [BBԼЯ_>3ϾB'^WࣳTp <2xO?.\V32+D\\ ~aznb Ν3YG>Yޜ8ZhE+**Qc5i۶ULD_gi<۷tqvƖ-cgj7s Ss%<z''쉃bwa/MPy焛vn!hoB & Chh \/~Rg%坷*؞\} ʛV< 5Б#`@KOVΞ-1s};MIH`Fx2 8@I~1J1xy6uG~~ͼ)⊄w9Sbztb=++3!.4vSF Q*hFAQ <{pغ?^Qwa[|?x0osz>k]=;ATA55)&|>8B'ҿ}zڟQE-~kjȌ7gO| ~ϔϩ6FapJx4@#ޚ QbpOO?Wz CjxN.xI5X~~!ڗiO6g_x&^|qC({5xx`-:oDD ad%߫Wӧ.5]Fv& FHUs$@$@$@$ @N)ؼ0ǛDx ŀŠۡnb-[,6u;W2BߟE-ZxyypTQP:fk1ԊQmb"^~-Y<ƌ8p QyϽ꠳s|P(Hve&ǟ|A5NDBiދޢ+MPTLGARɋs0海ݿꫭXV% ~s6~FAm͡{"6B9en1994AQB%h/w뭽t'<4&m-4j}_R2/%|\Dmc7xj&RYMGlɧ?TY vھ󎬙mHH@$@$@$@$`ZƼ" ݻ)Q\ish٧ED;L<S"KKT¢lLXZO>oe1/Rn5س8ZS^obFG`Ĉ5B/ӧ3X!ѽ2<Ma[.QT(ֶ?;}^Y˗QmmIH2mf!   h((ٗd3BPtAtKիHQ6HL>8*]7,Hb!r(:bM|-n=rE{"Xb"by^Y m!>ž}x3OODޝ, >&:Kea|90UU=vĞ{={n={;_aC*(cǎA*y1Gy-sBܠ_pzc͖^Eھ; \%@A:kQ @/b֒ d%$ i:摑i  RD<*35f@  R؞Ɨ8t;-=*[GEOchB~R Y`-ߜ塚a:ѼF eY\>3aa-K ^Jw ƍ8dg+qVr<:rnVGPܾ(gΉ8vUZ75nNUAw/KȞc%+Ef.AN7q>lo{*";-w}IHHHHHH((^Pf2tnM\-<+Ē9;+&^^{|BQa5AU{&b\]stۻ8zۜOH%\3)"aF۶(޻"x&ubRoź 2\C_?Ԟ}"={>D<ARrPj̙3DY: UrAA(++CzE9WJċrv%Yrxw4+3ֶ|ek{       PPQ0+mn gwDYY~]P#fV]J˿ķdf|CRZeT>9DgY [k',Gh#,*kBIIg1 80JUy,`7HHHYaM,&}Khn7.tfWa%B8hm7/~DN8gώp%^gx($xyzT:\]J$@$@ X$@$@$@$@W PPg(߰0^ x׷VW,%x5 $⋋׹sT M&/^U!"ҵl̦EK>}^ iYauk]x)މ͚yU+?xV8lQQ1NGNv>BB["vXf5h*Etu嫯@bU|x"?{|u~$@$sc8eHHHNbՙj{JNx/X5vS#5.ݯ]O?uMUi HHE^     {((ֳ{E CNKĎGpaa&SbU iSwnwͰ! `((` @ XC kj صNUEWWqpqp$@$`A"/ =ٽ,VU]#WjzwStuռ5~W4;_q5$@$Pw((kD$@$@$@ ņtZ\+ !"ͩgT$@$@$@$@Z<"dbuݹSSVZKqq38,8`Lee`/6#       k<o(®YP4.I VY5SUz]4t(ZUlO$@$@72ob?  IDAT @xWނGN?;NNWWC5J tX9 @'*    `t)vǡ]Vܶ\99xc*~mYx((v{ ݱ9(|m_ƭbs8Oǽysx"_J/P#IJB >*gx97i(glqqwGаasw#i+8X_44mݺ}OPm|}m1Vq^b*榛a]سO03h{yV%/;^uki3d]V OHG@,<ܢG^:*J HHH PPcHHH W̄Iؾ=)ӱc1dGn.ġ^..@FAQ/ڌ%[=˝*bƾ}HۺXn~~4q"\==m_]&E<ޯT1c稠(uJrr2 xI}D(w zת8b2 ( 'LOh8x/j&!۷5!(^Dܲevي7n2+JGGs(\CFwŠJQO1N'-DF`Ѐ(_8G   k @A+ [D ﰐ-ѿt K-ucHmO((r zXz1J`Y먠xxBH~B{^/]Bҥj67ߌ}s(>X{FAQػ%J,HɋhmQ^b(fRdAbi֬r4EϞ9*(3.>s股6< xg+[0/'*qQfRG¡kҡc#  &ڽբsUΦ$@$@$@$@7(F%(JB S'>>Mt"~nG*;{{o;Ot-_p!%BY9"(pxեՀ?kN >\}U 8EcHٸGE ovl`Mx(jy˛K!+RǼyv쨠h ^СyOKTWï-,E{       -JPܹ֭7 Ib[5Gtt s*XɄ__˪=w\n7(h4P|v.HytDP,±>S㴽6wjWyGJ"x9b 7lxxZHvyfM\:{͖.9+9_騠'zxȂoͣm{go< vN@@UNGΈmHHHHHHHH4*AQ :7in?n'c5l{BtpTPglTT\$3iWܧw' ̕HHHHHHHj@5ao_vENnNý Gv濵F S;"{lr &oؠD/S\P _Q ÆY,دZ<"i!~hU% \o p~   ((:x.-'N",R3 ⅘$%oxj[Ecf'&*KD*M lֱ#ڍwOG)Vb4l 9˝BD땧u_ɻjyPL X{LÛ%YB5"`ͳU+Y۞w N|(B-"MSф>Ky+"}waQNμAzjZIjm"tfґ6$@$@$p PP'IHHH~ddda変CЭklL&9|x(O0?{%yyiċO-(vhByդf^J SկenϝCqv6CCmHW><Z۱KVp$/>.!4  h((6SIHHH PPt5[qIxyyg'&PlRE#  {E%)n[9# _8RV((_:~6=sIٴvv8հ1￯1ͣjk*K$@$@$HPPl$m @ ܰex>x;u,srpvN5NYi).ũx㮡 `*+C- Gk]IHH!@AJlC$@$@$@ )(w|Ns=Cн[5 ƫQVR#QPˡwU!ACE^u<;#  Gb;sHHH!pC Vo#矝''' ܆zކb=? .HH#P\jR{jrnMrC$@$@$@$@U&`KrkwڵkmhNNޘJ7?G[^1@Yqxjt?p@=svsCٳ-²y%B0b1׹3/Y?xP}|a}}EH<|YsrBظq6WF^jGD6푗̘}s<'ͣQ."x əHumR~I}M߰y1\]iZ%4"~nG*;{{o;Ot-_p!%BY9*([}'W֦"EN>qCCEcl܈̣G⢄7k_ZoH1o=;*(C+gj}ZZ~=wxla)V6ߓ @C#@AK$@$@$@uC ;wúf!Iu戎PaRX+3+_pYfO&U"n騠y Jq۬ڵ9uƃ;喝RiY/G*cy|^QAQ["OwQQq bbkWΤ]_Isޝ0`@$ZPL2Wv  hx((63IHHH. AQۨxۗ;b[ý Gv濵F SW((v܂6(ѱgZACDK0Tuv*Ç6HLN%o^k 4`%`su(VoK'   z+(j),,J\/ıc1?i/GgQPo9,UlތϡF/".KT8qJ(&\{U1~ ?7^c}*,KxRk5fǫf彌U<[Ve"ʟMס['X }<ϕ}$N?껈Aܢ[Kƌb3%%szUi#wPݲO܏}b#s Pd"Pq'x](*ھ.ۄ3 T#"BT  %z/(znz) ɴTz'BTVk) R$%74i֩ڍ*lJi+&ἒ87WvbUa6v.JH"+ETˌ*[Ν?m}RqZڋȨ<<9$_QۛP*1(y=v5&Z[Tߖ*ܺ99\=<5cYYVjl77XM|B*׫;$@$@$@$@$@$@$@$И 4(A>[#NLWEX#f 1tIKBNLTTpլcG7΢ehSA讈b+O;c`~h5`"AQÛELj-<[!EV ygW_Y"6|nHHH'\꞉╷,»C$@$@$@{9 J{$*UV,-Le$I$@$@$@$ЈPPlDͭ F& q6K*JTV A L| ".'ѹR4SaóIENDB`golang-github-johanneskaufmann-html-to-markdown-2.3.1/.github/images/point_bold_italic.png000066400000000000000000001711431476711565700320150ustar00rootroot00000000000000PNG  IHDR} sRGB IDATx^xTU7PBoP7aUDD@{]bTDP,bbE齅^B'dL*y}9wMJIZHj.ѱ@@ħKm  @H@H`G1PLKԳ"i9 @@|G@w;A@<R"0fѲ Og|3MC@/Eo@peܢuTb5! ~,@ǝϭ# F @҃Kg9PLK! ?>  pN =X@9P4#O  (  XNb@R<ӜyN@@@@@E @Ck@,<%     B-"SyR@@@@@ lŀ4@@p?  @@@II   $@Q@@wg$&  "  @ҙ  ~'Ern@H 1xH84@@,E@@w Hy6@@2 (P  (  x,w*l[L!  0B;D@@@@ !    !    &@X`@-}%K֍q7   P;# +@g[ @ȏb~@aE\n @ȇb>@eE_] @Ȼb@iE^n@ȳb@mE_@ȫb^@qi˖ ;@@r#@-E@@@@@@@@ȍbn@@@@? PG@8bS  p^@@@Uy0@@ (\  (  x,@1" %Eo@T@S)C@L@:E@<(ցbݒr Uxxl  'Jl,{!9z4^U(5jgCzȶm{%--]""JR!9-@ PŘɓ%9>^*DEID^⋝=[RΞ5LjJ .]:_cg@@ IJ7P:$n$+KJumݺWH, ߱ĝH5\PI8uVl#ʗϢrBDבK/((zzuPzl'zyKNN!w1?%::Я y PYK >  E 2a !?w9?wIg m9y<-&e&hѼ< n(Ut>3_߾eKsW6?d%vJI[[f:K5!RNUFO/С8yt{f{Z^"ӮKH2bDO]d(5'B"@1)>^6~5"z8   Gq㿗Ebʞ=0`xyp8sƏ&?&AA+[o\۫)s呣Pw#Pt;__7Ygʛʕ[7;.1Shc@155M&Omo.R*]35#~(n:U>,f=Fms  PHO?}D5-3g-SZFʨQ׻ygJ5go7'uwƨƗwԬY~EyɒecҲEdS]})sjr]<;eCd͎m۵*U2VHӦuz n?_m/*K.<=ZIXX崡?9Y> -&PK%K7IݺդqTmg_CZNrdjI)]#۵o MBBj|s\@Ht8xB0q  ['N*toL5%%W?tc _)3aaNMT"q3kթSEuk)n2:Y/sժU@l_qc\ݻxcI>GfO<>./f_̑tKbh#2fzj6K'9L?jW4i!RV&KfI$83bYziY[_}nڲn߫W{Ѡu񒍲vs >Ww43MiWup9 0P\{pt&ٺm6.ܨVmH:wn*.khHn6mIjZ,{lٲz#Цצh5 +/Y*DDžWsMFO۝_a7*V↘]|fپ$%%Kzեc&3i?厝ѓ#VF k?\:./KeӦ=,MՓ/k-oMk(E"e\~y[ sl\ye{9 nRҲE}ӧS׸l&so;w:UM(;~sTr(^(je+Kqٳ}U{Ybhr!IOǢwе&%Ɇ>0GN}\_2$$X[K es  @6TY?+D4$O)Ժ^QKkiPw @?@㦪6'<f|AUEh-|@ʖ-mD{r՝K:sg ~ON4aiS:k~dm}]W{zg*c7511 1Eޓ>{RrfS{ վz_~qScwK6{x7{R=<KSk ;)˕1jeʔr]#v>Gh(?7eʯ2UnO{em{:BmHC1}ej#{D^x[hhI 4fh=9)+b==h+zo?@˖2h>M&Oeh۾c{] E7[(k--uE}OҶ Z%ɧN^ҦԸL=Z4zOVWuw:vM#$(0w @VōvE®#5eFbi ]ۚm44ȴ/T_`mlo?VMu-UuNQ+/Su$S~1.%Kd u~3~#k63]#t?-j>Lμ-{k:{ڻhFf״7@1(j;jNZ?{2RV}_^E D3PCʕˋk77kO7#i[@5PT`B̲zNEYs3qLZO~unmFɥ4ZY8Ɯ:׿2&EILxa.fBNtή[zhX]%?%%bI' B{ f_WS_߯ j]nK ^(_$4@ǠоN  j8hI$9!AJV(osPݲoE}R\S_f,Y|k5vmҡCT> $  (=]+5[!Jv't'*{wgZ+syh!64xp/3[GXA6y&vͥs&N#ڷo,ݺ465~:jo>̄K@ϧ~!]Cz#fTiLx5P~C^cFiUo> ]Gw>W$]D hb5׾v(VPV4SJWZ4gF(j1֓t `5ĵfO>5Iz^Z*7^n@hd5@Q7q (8{A}p*:m/tK:竟WnF{x]7s>G+?03?uk?^ϝ'#<큢}޽;4]j:PCJmLצGȓ3O_lSFtwjzmwwF{vYۦ>wGxx6fuu+&PtzLGo_776zpZ#ܯb!aa=xuݿ*cb$dIiv}OOK3SSrVR[7^v#]9!Kn6IJ:bҥKS@@.yȱ֪/*5[#bkT>Qn(ϕgE9sڵ"L֖@:`떽jh<<\  @@F2߲ ]â4,.hhӁXkIg;Mqut$)mv66 AcU5P԰ykM4qY=vvj2ްfYC^u롏9kAJv@Qįϓ_~YipU_pHhZ흷9ho u?矫~t: [rWYþ)S~1MGD-&ߖ5ǎN/ΘJS>r%?/?o-Σ#I]=w4a3Kc`Uw=tn䧎:'[_蟟~VjQjs箖2?(>f:Dj_|:OdU#ze|b ʡKĸ84e٤nRjoy ;*Km5kw8FW5?ϛx@@b/nDPF 4\Hi6 ѮEGhzr(~>=dN^q(ZANS *P293p}LEHZ?fFт%zZzZ_Q.jtkViSuUQGGI6@o? {:ItoH"wmxb5+[2^S*4v`|o4Hi Vӂ1]X@@ F`oe ݑhCTZę]OwB\XWͅj@:sۿkع_Mz뭗%Ș)m۾lO!n ]V@sOqܓaQHH(j^ 3XMj%eG]/- 8P):j}nSX/i}O>LŶ~YEYL#lԑ: T[taȳfeѰW5>z<(Zk}.gY|}h$ t[ jYB<9bNeSXUרmӦ=rՆ F40?j[T]k(z8Yi>~NӴǍ}LXG^Z^vLw5LPj o댩܍5~ͯiim:m}7 n'Ͽܓ6i 4뮫NC̲z@h%h ׭)v`{LGipsyEZ`wkhS>S{|lfmM'큢.՜pX1q*{Ekntt mo=< FS ^(ZݣYj Fj/juyvk(璖&͚֕NHڕyz@@8j1lWqˢ1fD{!דLHG^5^/! !W\~Ey⦧_+W.5P ex ;))ű^3x (I5ґޣxjإa}l (*Zk[8O`y\ttNeWѣS!Dm8t uv:ԳtcGms;AQTo]S^5P4?zA^E]GƛGG:RR6n-::UztTA6-=uzxa﨓 ju2PLБZIޓ}-V@H IDAT>l x}hd\yE-ݸNEb@@Wʳ5К:sbS@B$DwM\N8S>5W*'@1cg(sEw'nrZn媭NSn}wLiA+j˩ *PXṻs}UfdUӵ sǓ(us0 /g޸sz}7;.u}dd kpPtWEwV-|ga3]E y|!u]>:V{l ˵YEYtdyK&ES6 PEǒtT*/_`p4|u5ό!w)!2BK  (L otϤGQVHs=۸&k]3k53QEyzBNULsWKHH $]@QG<]{n=4m=ɧUv|g!5={S'M-Knt/¯ղ uDEѶpoӉB3ݟWA٫Sǭ]Au;fJҶmǏK9\L*SQ .ʰa}YGӈUk*U*H+ښ%agMZIiSu;]u0k#ly#㧞14@QkȮtlIg˲eMjUϣGF :P^@@"@nSxkSJuTզ{|2)Y]N=uP$@nD53[{d$zӵyQa^w˗j* bk/t{}"x H=K躭y-Tzll ~}hw :8>Oo\5  PN \ !@ <S]?;g@(@X{kF@@@9"+6.]):-~쥲`zsbOaUrt(šF@@hm_+&@o=8i?Wwo^ԗ@ (ӎ@@5ϕ];ʺt[~˗oի=M!!]31"tB T@S)C@@@@!P!@@p+r` @   Pi@@p+@Q @@w<^-qc9wMX&v^}\\ $'O3HzzmHFT- l (HGr  @ (0hV2u9|XՓ}YifX$_L3)U*D>H\YKd?$<..A,$uVQ8m]ZNd *UJJU$\dӶ{~]SSkn"]ӑNz{KNH 2B}?98NpֹVߙCȪU(%+VR];_~1WQغurj~ *QWkW p%n&9{9O %n]9rJn̾gDGv-jUi8y"M֕_].'O/n.W\Vf\U+ݤ^Yjl5¥E+eR y%,kj%Ie$2\ziKYR4hPSڶkwȊ[dӦ7=ZIpp̛F=biٶms:8_UGpۮ]eMc9zդQÚҭ[K}S}KE 7Ȇ]fDhONN? g/qVekkذD5x=,,웛,+WmdֵEצϣj-7p_iirx 9mgM[phqs $'tiyqmYz񱱒rꔔVLw0mk$-{e΃ҡCcPLnm@ ?ep  !@xN5--݄% ȞsMK=&6~!-xiVF2q o!S0xfzW_-;g4,D2䮻/i@| PAhB{[ Iܖ-`M7ez=vlۼ9tj$ɸw4/_F:wjbڇiT[cWVQw #hZ&Xxs(VTNX/QZjhF.~1mY =+Pwf$eӾ( SNKC\}mdQk=6mɓ o>L*W.t(jףEVtnwa裃Ly;qQ=wv:ZUk%͚Փv̈I9!ݏ?-4㫅YaZe%H^mOu25m?z2続[7dapL,_U/hFZMߞWq ]28Ѱz=ud/կoF GMKJr SϞ[:72R;_fk3#+5k&qqrpb]@q箃2}_{~i׶ u/ @@@2Pef4=Q6 4Sש@h=4tpl?k(C=N} }-qnjT:Jk 3UZ[o7S5f:}0R>0Aa.^'%) 1'1Q6|#EkG .,+VlgΏV6mJhi`n@M1gC}8Q )wzeL hvO?}D5ʘ p<{:ۮp\C7].dk ztcĤalP`vqhK X]<_:Z~+P -)caFjoi/zۢ,:SGmڴ2#W7!Nan$\l!pfwzq3"Og9k(zgY 'ϸ o5,v9,Kn6kut4Q͚ i   )Wd_D6G#h&]i >v(CmQ7,*n-:r(lƙݍBGL1׸b!iMJ/w:GɒoFpǼֽh;;c/]EkCv8`ܸ֩iS ѥ][Hڙ}s(> ,YQy;/H~]du̥F:=.)fn*4i[o7# ӥ?2S7߸ms(fQ7Ki5+Pr󁲾SD<]q`#= s3ԩsx uj":NGw7]M.3AxaÜ)< litUu7  ^*%5U֯%Klr,E;]u*'l#AH0KxOp%  @Ѿt[KiۦQ6ݓ$i: P1tG-BnOX+b&Y>-:zر}-smn޼5@Q X}L*g25jHAZe_?ܿك׬EII)fv55ur(?wIUZCM8Ӝ>  MG=Gm:Lx$?/O?ͼ>'qjVSǼz#6P<~<^~q)Ӗ5smVknC^#wi۷o,u{(ԃC(^yʜ`ǹKI,w% v͚eP1,"sl5+Pi]i1ckKQ2rIx ;eʔLmӾ+bbE?@n>G:홮[GݬuUOM؟6U5TϪkO(>IɲfSI\װս;%$h P|oq  @a UZ`cdٛV*m߮D6mJ\)fڤHZ~o60N`NnnxSd|ÆR" uĒ\Lvdj7wy?@Q.[EV4\Nyzn_+@1pЪk>'M-sUJ{(H MG0VWyF=zM8qfTNSj:QS/DPQ̺>jV2Kz|lt)̨N&ig,zZjZ Iͪ'PyȪUfՖ#Fd}' Yyܾ},^)ӺVs 4(Żz@@.P (uKK,ajRwE,#QzZNn(֮-܏h/SY!G.Z*}JtvzE4r(>QZݻK-w9rtZ=PԢ +Wm3#Zku .BUդGeG-rISyȐuuN{'6ՓooiF(=vRzh9# 4U͚VxWKKZwS~.S,ilڤ mU:o:vF"nMA뜎@kWܺu孟eU/C*^s 󅀚Ve6 3 @kk0@@ mhWNkwV.S=5>5u;k=Ru9vznCGҥMe{OCvڜ@Qkqw/T{f::w2ZvҹsSi$"ʽ}*Ps7;ç!Ïk.[.^W7^bfƈG([;vZZ+Ag5:5Q̏&?1yѫ#Vڵs~jM] :Pv[f:wkڳcͨEo/Ԣy=x]Wn˯|i~9~ IGm-6E5abͮ%zgYGe\Ek5wm)Wl5kq[fuM5:E]^%@U  ^#@h늳g(: u/HNH0!Ce{mlF6iԼԲ<+:_.壢$08usBH kgMW璖,%JHCF%P=haYkط_%nm[U0CGx:DKDhXk94Ӧͨ04Z/k(1H!Z/2M6n5#Ǐ{PBCKsx\c e3~X(_MϘ}ݽ[7ќz^EKaЀ]Eׂ +QGƍQKɒ%3g-SpSЁ3|$;v0}3ҠALEiwukF-sX\ zJ=Z u̙Zh^3h=ZXC5icPHDک7K1`Lthͭ_~iQ=P [UPV:ujb*9[SN} P<NI3^tG;@@< PBi#RTTTlENlfABp2n@K@`4ֵeldӔ)N/k1"E [nC֬с*eBPkZ=z(j8M4ѵYNw}HjKk3v+ (~ 4U;ꨊܯo8,XA}7SVeKpTR6Lӡuli5]#Q۝w\iFZ탉3e޼5##kjq*ʲpŲb0Ρ3!NWy3)9ŌN.MMnO7j\蚉'N8>'NΪ]Fi{&D?z,wygY.ixtGl8&iRs1&O@@@w=K-^p`"IKJʴVSBg_@ _XsqW)jh맟$a^9Ԭ)Wy1m6$P ve*UVX?7#z3Ugvrۭ;$t4W  1*ر߉Ej(vL &74rx4c ˤWue3zQ7/?Uy~rVԱ /^lԖ#uF2FtQ_Vk . !ZvMGe-b}5Tlvϲ~ٱE_E0Je8/I3'VG@@#\v}1IIH0K{4\Gjrꔙکga6k:%rp"3i VȨ /)IIɲu> )!U3drjZEórHD*V'XӑZ<~L |y< &&K ߹9!KhŐTJfT7",8E C}MF\    @ (Ws; IDATOѪ iop ڸgͷyYVp:yÄ f*tV:4OӉCK>5  ^@'#O{OBV5S#KW")gΘщ weW"O',N&g͒KgI˽ÇTAFhc:[q7n;eȫU*~  o (vݭ;|!TlT-n@כ_]AJu?a4! (os  @v<y8a)lx,X4J-[JXDDyw;w,]IdY|B_#G ԑի%>6VElԂ4:ZNYV/kX ?\  p/$GKjF,.m^jUuE߼Z O@1~ _|1GNfJKZdEbdmR\t?ߟzzuPzl'zyח"Cc_7Kttu! GTyV@@\]x7Dҹ 7q%4ù,M ƙ     Ptq@155Mj}Hժ     oE dp@@@@(2P  'Ϥ,W:/+D@(2\R|tbYCFAʖ)xkm2浯˨QKrN{D^x֣麎pmQ''e:_vEYnfW_~]iߖ-#e3g쟗fz]lk^iּDxA?ۜ@| $c_%  ^@ѥ ?6'$S|hӧG>8@68ۡCq@>[ry3=`1/TcyُuZWw ˻h^#P,?p    @&E+o~m%˗Q:ztb@Q8k5gmo5\*V s~N_/Tq0MKb     N@ѥɄ 3kEC{oѢ.VǘuϛLRfᝃ_14n\GF^J,a~9kLcńSg6gOϩ#zz#K3V֦FX>@p8~*\L2  8]E |~(Dפe߾sj'N{D֯a7O;wiԨiM֐ܿB>3SGk@@ (߾@@ P,L]?((④'坱ߛx]WiѼ^fIܖ-(ৃ[B@@@,|2P_vN)S~tV/m_}.E>b  s>ץ  P &PK%K7IݺդqT,o>>y}yC{+9u9rDB$Y3 o<㧧Kĉ]j^zX@t[ΝCR|, Tsy_s(s! Wii!f,\#{1"j/;Dg3sYd AANŊMjRsg?^BBʕ;u6P\(FfN*ҹsi!Eӳ@@@@B@رxYx,_ERR2V MFTuKqlꗢA?z\$vki;{oZU*5o.vɉE% 0P *N'ɦO>14FoV]e$>AҮm#1Z+BwrH@@@@ Wk4Y~1]눾-ꛩ˵jUVcΟϹk('AJ6P,]4&6'l]f# Vkxo@^}.@:=eͲvtZfJfbu3,.    ]'NyU9Fiº`Ӧ=:/O31Zޭ}b>}\dc4Y;vevdj7w){$($ģ@?%5U֯%KlrLtbV [R\h{=@@HN2DK0-C@k BܶM# ++X"=kRVv.[@R"y,VEkgXb>м^kWܺr&N)UhPqÏ yұcDԩOw >-@! y@Ѻgdm&\QK{?pLjլ$;GPYhXtTr.YD  8j.|r}\  @βw)Y*D*{al].5rT,@QCGLxl     @)L-I߹Svٴᒩq*5.Di!׿&%Iڵ%rg@@@@@ >!cgv~@@@@(6Pf)S~t p.@(.gͥYťϸN@@(m")ɩ$!!Ea9@@ʳ_u77 x,PlE @@$@'6vB@|^@绘D@&@77B@|]@{C@(@G8vC@|\@;C@*@W9C@|[@ѷC@,p*1[d`  '@{}!    PhFˁ@@@@=ES@@@@B P,4Z ok(-Ż'z@@` ֓! >#@gJn@(P`  (N_r'  @A (&B@|H@ч:[A@ P@19  Kԛ   Ppgɑ@@ Pf@@ P,0J @br%|Ƹ@@| (拏@@@@/Eo@@@@| (拏@@@@/Eo@X TٶB aC@@ P>@@< P9Ol w17 M@1on 0 Q@1p w0 U@1r o/w Y@1t Ow/7 ] %-'  (\rC    brd@@@@|N@纔B@@@@ ϖ## Z,źx@@ # [@xW bar\@@ (@@B P,$X wރ\?  P8Q@@b/@X컐@@ E@PX9(  Pr  @a(*D@|@@:[@@ A@P9$  Ћ  Po@@ Pn&@@ P,pR o#w bAr<@@G}# @@ ! "@+=}  +@X @@@@ P@@@@(Xłh    Ow/7    @ ('GC@|FhBJe|枸@@ (ߐ#  >)@gVn @ȷb 9  ٯ  _ ?  >ڱ  O|;  ڳ  ?7  >۵  /|3  ȝ! ^@1f    (ms    ^@1f    (ms  @RA  C@@@Uy0@@ (\  (  x,@1" %Eo@T@S)C@L@:E@< P@@ P~@@=sb+@@3n90nF@F@@@@@< P @@@@@@g@@@@< P @@;jnB q@@ [E@@Ty@@p'@s  @3  Tl #[@@SEO@3Ţ'Nڵ;2URL<]Ć]" Ԕy:gO2mYCj֬Dx9|ڵxI IDAT"\8 gϙ?,IzKfoJQnEF`6cH@mmySdi%}vqc x"pH٬NX'W6e* -_yAn,~~"Ek]y{$$$~7'H+QKzrД7*(_"uCixacx2 }1 C^Q)#-黥GJsV{X\︽̠@y{ɲ}Ǿrҿ ]@4e3wL:Lv5Cߝ?nqj(ߟ%K֛FdD-[7B^|aW@Q1~‹l\$gъP+}6G tְE~A2sV 1ȈǪ*k=-X֫< ɕU5qy0CCQ׮mNaC2`@Wm^H.yPa`eEuټe.ώ5\yI?3?KmZm*Q}⽯Yguh]Z J1r{9j(0ZT#kh`N-gRB2{@EiWrxV4vV{~5c$'?lѴI=Sء}s?[ # R}E NL=*2^>OsӠ_'JAr۸ LhMy*KJ`Γ.#1cFk̝B&Oa~]w5/N_vܸ miᇳݠ_x~DmС? gtX6<[Hf B׭+us(-޾cyK`GSYCo/=,}>OTf EmҤ^[36᎗LAklFeE{'mL|?L82a(];L$=dkHvg 8Nhq9 N?>sC|AIs_eױQ$ZI`i6V*nyeo.?|vVegaQ^& O֍jkҿ_'/#  եBQ5eR_M5U+ʵQ#ϒK2ӡS8MII6!+@Qstm]SΪ>Ǝ,Cw/i~|;^} :{j'_4PW:Ny>UU:+:5EN\tz}g@ի-?w;o /o@{{/Len-ƔiUiGsvۅҷO{pvhOͶ?VuLh4iq )5jDн[DFr@1"6VZYm%gM:KtV_,:z+U56@@N3(ZyyՈZx%gdm2YRE 7 r*ZCQ7Lԡᕵ&jjeV(O?jժ_׺|[< \|X:[pՔdϏ^/,1.?p zG.k?(T:Y1!yi1*>GUz'/Z+3g&kFU歑W_Ɯ0Ċ6FJ:ZxՃd9gϙ@_8₅keduFQ`9V @n۶7thmWhXR":v=v[b]3ۍLf  (PE8⋹f5ǡ"tݼfh;dMM^{`qtD wMYBnmϛ3(nx  ח)3DJ`Iթ:j8 ƛ1 O?/ZӚ+A5*N5D0V8dH{ "y5*>GU:UI+yժekn?j Iy*ůCS]Xz z{*3=v6XEϕ@_8偢k7槈.8sRxiպZ kl)-.pH=(juV):M;dA:Y ҧw;@U"ZӁLiVff6SY5(Ԁ`^r}|ϙskʣg]3Su u t9jûy\*9W )|[]y(cy=;3Zcx2 }7U~gu5xEo /o@qsɨQ?uS(֢wyZ3⣏5Ztf]144sZ>A+:'z@-#9yd??ũshHYtY1a4+pzE ؁%cGkhz39?оWDޭMSe| @@S,zhY;OCC:bD/S%o/?,|AYnBHpA_`[MYzto+olܸl3p`W< gƙdMJZ˿=͜u+2Փ֣ΗMk8ZC]œm+cUy/}:MYlj+k=Yk8V=,} oe gVحݵ6zE+h׮׻-4eq76Ԭh蚏 GoqY'^7MY{hc֡ASn%TEg?9j(:ꧧ]_qMJC3{g??xl+ױgb񧭫_K e ͷױCs+Q5 # 5A@v{7q(38**\VidMlظM{vYb7r5aK6Ѫ4k]N0E^:v~wڏدzSN}|:>km?W^>Y3Vx } FÚ@ޓ{X|V@{egܬ *PuGSwNhydySMp\jci&½{w=P|oW]k}+-Z4/_f?@mh=6pQ((:94f?xPR?@ %("Bp9&ntr ͽ" 5R@[Y7P:P>wܶ~EOAcS?J =sd׮tpꚉ:Z/Og9^|f_N+ޓ 5n|3Sе41ztB[ZǦ8dzY׉1y\Dkkn5:ڶm[rZ-;T;&\,[Ǹ9ّ=|kg~Se:ůi*=b Ԩ@r{eo:?iן1 x%P<;ވ6Z8r$O4hthphqo\7or7 -n2ifn>ѹf|2iNvwZ]iwoy5}/~%Zig ƻ):U@ _Eksx>0ƬM5.}\xaawMWɵ#NGcTtq" WOC='ϼh:w2}nou.:嗧)kvcw>]~~6{H֨?ˏ?.rKXG]_;s=nغ/Ju]V 6@ bt{R-eLd  x/PE,..;iIzu4ݰqDג-ߩ}8n{iٲ}OGCoBq}"TCݭĬUϘVU2@Ni(2΂ o}$Y3iu%'54VXnPNNm%3#"js&'Mٹsw/0QR;2YٳdIn;a@ _.q   P޼"Qבsgf_v^N֤IY`xӦվ\^2SSȮ]jΩ_@}_}^{-[wJհUj5hP3uhF __u({.-[Dv}l?.M?_o=^gä$ڼY23v˖fyJKT@.@Xӟ ׏ TQY&H6[2|Xy,@gٿfMOӄ &HƊ^NnF1cGv ~jl1bl1̱åݍ7ڏ!VuJѣ%0y*_4׍ANW<},tj&0ڽ;S^y[Y:ҧw;ڥGS+ ~|o?|o~9YYG䩧>[vƀrY+|2۶9tl Lnh(ظo2YkĘ,Ζ}f2O'tqjO?=V-  1A`jHuK 7|=1Kݶm%nPմ_w\zj'͚ 8Y= PkS@@@Q o/Y/jBKK>kLTJ:Ɓ5kض6ЊA vd5@q8Rq4ъB9i+PuZ Fz1(,L[gs\h3ZV*ښ=TpkZ*­aϞ&9oq8;Wٱ4Z}8ݻnZx٥gM;e쥢Ht}_W˂kbC:-} t躋U0˖oOc򬝠_+)kӝJxsѦM;~6a[T+ּyJ30SZelY#+-M o\O IDATU+ 59 VVhJI9Vשc*37lCC̍_|!۶hu^ZEh \#!uOeZ=ף׫W]tyk&O"6~p OYχڵlx6RY@S(@x 95  P|2Pj-1ΝZ.n=[Zeeo6)-;~_5E=N /G`Z 2 7ulK9!഻z >TiC+P԰íڧ<لA4uRz˄=5mU+ ktSɵyȒ%Hαj> o5X֭rVuyn+S=2]Ǝlkc;зomxz(\Y&Mc'&}7vCzثQl >/ݻu+)3MEm2.pp_;O&$8m:f E{x4*\)ftxۿ_ֽ9V f w{X:w 5)ڵw??mL{]Jqۜ9f9s{`^nY affҧW;iy _"5D 6"$Я\1  p2|*P)s_e6=}8 tXYTh{fݶʌ u-V_\V \U!TuӦu4p%vs2uRӵ![_z֕q3th݀ɖ;M8vVXmX9_'{(JÆ괜<3XCA:uܸ D2e۳̯_x~DGG:YՋW*Փ@~2CM|h(m wd~(n#s箔<_bbJJ8ھ}16+J||{Y0M[eC޽h}k5Uê^@ۿr sRt}ut{دӾuV>KhȩҁhҥkMKCͻطO; <6de@@@ SN]"\49g-^"# ]=|Y}4HӪƍMŠ6!v*JK+WXJ^Qbmt:xMHK/5Tl~;ർ@qBYr̙B61rUk,o E ~|N5>vVe`hhL~sb~X$`&<݇J;nIӟu^S\{ά(:ɧkJ{ةc 2f $n}%ۦjӰ;'PJ^bhXV;SzTɶnޝۜv)>U&kwWa]z kի)'ڱc uKk[2Ϙm@@@>(j3mƍ$))Ls$J] i5=+Oiw=\ca+@TX+|u tu贻wbqIfi6ؚ^HH+/`~]QSzWtA]G'}^yk Eի-?w:N1*E/tijx(>Ѧ,gtn%wYX+:|8۩:QԤпڥkj3#/9ӜӞtwv:YuZ{yx8˚C%tS{S0iMN9 W_-!{k@>պdnGCٲxzYxdgssEc    p TQy5?Y]b$VJEiޥK%+=]ow꼬 Rq_6xcmuj5)Z'{O6l&:aӁ1P,,*Ukiݺmӻ{_|RH]WPNO7;sDw(IEcwɡML7ҕcƙ;ux(B^}u<;n_P(W…d}g׫W'Ly%,ùE"Bmˊ0@@P ǮMA9)N 1BCLGV隅VբQϞҨwoo=PV#G} `+^zɄt'^) {}_@Y3e?s^N_eʕ3@Q.]QɁL[޽ˬu߻ X6BuMũo_fJ_._MӬ{[,Áuo|'J7&MI7L2k=y߾C`2]uG ti]Qv~͹ M2vތC7yzܪwY4P4Au;GVC$]P7o12qKx8YWL۲K5)Nk~4'}7޼[.pu  @<=}8K.+]hXSKd5(2 6pf4S+(uZ `\7 ZSĴsjdR]ȣo>?[xYqɒ*ʉ]8V;@k'h|GtZK/c `V"OWVN߮.!6rvxnA @  PKF@NrnnpQ$z "v 8dJ,[Gz;JC jgBAN۶N]iK?rvs֡+~):eԱ̛@q_Lsϝ:i%%%O~V@qLyo:Zu׳g-gVx$//_:yٲ]w*?k /Vڊ:=ogorMå KkV3A2p`S8gʄ /*D|}pSߧV p(:33Z\8Uicyb'}hpF YOXFSgew1y5)эm"[;w 3:xeE5>u9.mkn;W.[f~]C7Vfyh=z:󦡿~1P5kh:8'$40/{@& (ǵ# U'@X6 rp-5%!{1tãAHefʺiӜ>֪0 ⯼RlV)ZՁ:[<` 7k}Wtsh_ usҶmkYǵŊ~t'wS歑^` N ԕg0>E)((t:}ŏ?M~Fcl(J22 }5Z5AosVȯ-7փ_V|`>)ɱ+<14,^껫i~e u{ǵ7TC{]T5 CCMh0ܛ@Qo oLjUFg1PN ֕:]Zѻw @M POG@F@CW9iPzhuWܐ!c+d_j(+]uqv ^vlk9cfՉ/{EO>#vIu,m&Ts7mj{;0󄾼@1"Ysΐs>+6/O GϤD=(' `Qgq^o_تqe͒R]6sF6=dn_7!m ).Vj(3keV~_zMNk+P,U j_ { M:MTh&w^S#k%N}[9s졸Z tF5 @} @@|3O>lC= *y\4,6S\+}\':5ZkB5x'} vkK\e- @-[vi1'<: zL[G&v4pݳGt>(nɱr@]C> Zjh50aڤ_?iеkU"5F 6!4ȹaV.@@Jwv4OT|ӟIvvtB.ݯ` ef [C@@@c ^ hc PmjD:֭x-/H"7Z@nk3@ 2gp" y3@@\ (@sZ@X@c*6D@|J@=nSi@@c|[Zty @@ Pr}=^\0E)*!@&p ]}Ys  @e|2P[|ʁ2lh2\t?U?w.?@n뫮:Wϔ)3dy[@NId  @@QJ9p zF/]ԷLطomNx֬d_D_|{w۷l~_-mce۳k̏  (3@@O|.P:b5:tA```ȑ䒋,(C^=(\Y&MlnN8ȔgO^UA@-@x9  P3|.Ptj| CYa>2k6l?6ͼkF̟"@fp =q@Lntr2;IPnif˄;^2ǚ8qt\}7t{&PEe+@8ty>@ >(ZwkJ(\$պVghŚc5"   X>(>Kgo:uŚ5i2OLx"E="~H6{+}׳]&S`3?    5EEǵ !iBٳ'SsPx@ w]Ul7cƂ2~oCPni#RC26U"k IDATt ot-;Uh:=J&LE5iwD9Ա^OYnkۧw;ڵ }b#@ P]# |2PKC;FܱsO:wji: Jeo&82RV ,R)bn2SQZxSHdj|&Y*{'00@wk#={&Jz+|99yrHsq ?X{'s7߸Gj qy PPP(7@Vkk;v :8))ҹs+4\^`d>VV+DzJ:O2T6i-nrM_~)32{WwD6]8Pu(;3ӥuXޓ[Di6tfҧW;iѢV=  (C@@|*Ps_%˖otjL- `vYytQ#%"y]E W  @󝶮[Vm,ZUjBlѢ#۳$'cSc5۷ @] +zv: U(>Dzz/ܚG])oO8镔q}>yc s( K/h>|v4̔Z HW EX]WQCN&m2cG8qҥMhM֍CMg>Dk *p8@Dz6C5@@@QayݿtﶱǞŋeǟzFV\bPt {g͒Tѫ_]ِ!xl'+.) 뷙)V?JUՁYͷdf@+=ku&.;|Yt tn95XNy7:ulaֲxٲ~6w]r׼LY7mGiZ} ی#:ٚ-vvo-[n| V9voE]ֆ@@@Nk ;):7SWQpZ~T4tݺf XGRk^']roɋReJGUU(ڋNeBZ^{TamxO\^9e-\vNo#IImMݶ5Xf,:F^rQj:u7l*F ϗI(jŢV.Zq |ڴIn-Gn:x([/^/\ip˩n@@@|FE}7HjjCn'I=UWo;W.[f>/{C)ώ u K7 С#SjØ^MueX5 2PWLU;GJ׶{w{2PujrĈrs=.),*Uk*n]HRNi\/0xD:NoqR:]f4Ypl߱~r6[H6@@@@^Eɓ%K6)N7BC[x=^u %Edk4Lwgw@Q5kͺ[mgމҼU(HUsI']8]g>3U(XIzS7'Ҟ OXߥKkw⥞ھ;}due:z,154tZ3 M޽ʟSu]?QQdx(Hږ]hII7ֈiZOi_\' >yo@@ lH۬Mv.ⓓ> ;i8Urnoe9sWȔ)3$ _ޙ@=DzHp?5uT(n۶WzxU0Yx(=x۽[T\l] kuDkTzR~?8mcOpݺ))o>+V䵲UEG,| ty]# rse鲍&\Ç%IJ_-Yii킛TUVRT$V=ḰjyPCnll}w|_TT,(X;.7n->0yTT K`>9 :f5z뮟dKHh&wϘP>hErϘ֊[n!qq ޫZ35sFAuղxqy)/Dhũ۶c󒼼yb'O pߊiO犟CqkߥY7l&YCYu@@EO@=rVЅה+ɑ#fm΢ 307W6%M7I`XׁЬ݅wɣNuOzi$v%%%r=axݵ癩֘={1t͠pPx䈔c z:_{(j JᕺO6F@@y@@\ (V01},C"$n06ڧ<H?,׬-Ϭ.q'uW@Ǖ\D~ ZW]y dVMyk 8 }a>~I˖+Ye欅NAcG>rsڑWv:~\v ͣcy'>1{&%Ȉ=+uh9prves Z #GdyR\Xh;|:Cjcԗ޽Iq4jsi    'PEE&j;oO:wji.ԯm6g>=8FB* B1kefʺiu(1ڿӰrM09U=h<00@wk#={&JzOP  (,*1zԧIpv@@z @l*Y|S5bfjVUJ=9F^2lh}+c=W;tp.$w> wy={Jrr,]A 4i-}7(@tyOG@FȬBܽ[DF֪陳>9"bJp:NOr %EWx %%a6{شyV+ȕv6F@bu|*\  pNy`Z1h(JL6AdhSɑ<ߨgcix+Ud"[;+<$yQX^]Wxrl Tkjx8@@ @Q|IMph'I=UR=_i뎋%::ң@-X;l3G._nt2:#Kn0ACGkØ^MueXX){@8Q'J  @-R0\d̟"Y#4$Hu㥞'>Zmb꫎5Rq+\v5nٖモC6I@HtV]aQYnMLߺi{ =N^ow >/@  Kj(:^azn6ᚔt Ro>m~åiz>j@1}{4iU*ŅRA6uI֨S'4~ֵj! #EꄹowZpS  .mh]mnn,]фZ8|Xh^v/1M-7wEz( omlٷjuåN6yC)..K^$6    @ѷm+!R{d[&׎$Z5qţ[KQAOkז뮳K$&4Iۋ`@@@@j@ K;'ٴyi¢X<bJ"%%]5VFg=9'     p@qϞߘp~ұC c;Xo\-٣  p 54;n @@[(~SC{Gg-(z ~  .@ s  w56P/(‚" چ޽( '@{Ϝ;F@<'7jEo@|M@מ8 x&s $GL@@ P-# \  "  +E @@E!  ` Pe@@@@@=bC@@@@ P@@@@@=bC@@Kl[" T,@  R.ϼ  y/@@y@@< P @@Bѷ7w x*@! >&@cE@< P@@_ P'"  (zV  8\d9*"F@(_@@@@@< P @@@@@@w@@@@< P @@()ݯo7w  P"o  K'pz>w0  @     Tl         Tl      .̋  J@@@@w@@cE@-*}ys  J  c>]@@CE @5E_{/  gNl =rn@H@#&6B@|O@9w x"@  >(@[F@< PM@@_ Pŧ=#   >عi@@["6@@|S@7;w  Pt'  (@@7"     Tl         Tl      .)2 @@@"/  K'PPTb9(F@(_@@@@@< P @@@@@@w@@@@< P @@8Wln8,߷nE@P@@@]y1@@\ (^  (  x,@1" %@o=ow`Twi#%tTA("DA\A E+ *zG:$fݓ&C9gw>  ((%v$@$@$@$PPLg7%   ((f$@$@$@$PPLow%   {((V$@$@$@$s0 "@A&6"         $@$@$@$@$@$@$@$@$@ PP IHHHHHHHH((r X>ϔ!HHHHHI"' %Vy    "@AHHHH" mmbC   H_衘7GK$@$@$@v ւ⥣G%_>ɒ71Z9o^T./' ڈM IDATR`n)\8"{x)QdfvsCʖ-"ٳg?6'j[ta)R$e9wN.?.%{vKu\yhJɛ+XǕsN> gΰuvCʔ)"BWHt Yvl~welKicmڝ5JlYl'X=X A$@B}\tIrW(ś7OsΝpWSXD}xsə3vfȁǥEҭk3C~3N~s]BI^cό,+bem۶<`c[縕6o/;wҪemgW013EDH^nezw)Ǐu @.)UTVFBT!%+7(Xa+H}YP\oٹWMLƮحcM3NRgeƍ{e츯:p˖2/gJKrbWoޝyFH"fr7= !@A1x < c^| O\6/=Gy:GzesҥRr). [jμVCFxe}f y ._8u9Gy.p'O$$4DZ-ҞYC+[61c樟_xN v"<<9f)=zv|]C?.͛ײf JR!HHnxEYf,YP";89Qƍr!e%`ݺfWN pAؾ=Z8$og U +WʅhvM իKb ~T,&Kh2/Y/Ǐ5I|9?6ɦZu)WtpD9=*(+R84lXEqQC%LYC֭%/_UͽuX.O-/ٳ>tJ)eV$k̖OEkdǎCsT\JL|[9|͚ղt/\"k퐃'TRvyU_; 9_-8V\~,UHԯCdҼyMClr@L}v/_N&V}{9v\<|XBBB$pa)Tʯ Nխ Eߔld#119.o"6 lx.io6RKnmH#g6A{K_fgs|~`ߓ@jx*e'3Fؾr#gyr_z+(;JByd]l';uGt8W.zaS²'{̙ J-qA-f̨NwÑ#R2:Hx! )SP?XPzƝek>xBV. ×4U?渼 篔/,U}rc}_4Lː!TW5y}0XeYbH)xd s9'Al~'A2g|_ys jvG%ZF%„_,Vm̪ r~bG2&:]8i00/`Ç?hCym2eJsC ZZe}?>hX JkѼt떸#trC jAsϧCY,Yo9- v\mzzXgh$(z{&= ;F$@$IADtxkȞU:u[J&#Ђ}H,y;޽KKms 0vrRnɓ男['[+#]VztxK5$U9|SlA5\>M+V4ԫWQ*U*!Bo1"΅STΒ%,XF56m\w! z]BK6vV^mU–iaPnE1-(Bz):ѩ=#/X2s"AP0CMW:On/kGzevz!ygwч/ ~Ƀy"c lhkצ-A%gٲrq9)CR_?KWe_3.׬TY6ד+Wɺv+Lxi߅k:7/Rs\ZP}t_, "ae*܅w ¡ϟwTb<.{C20XǕJgx`:Ur玐~Qk}x?;vN:mtDZDwAaKٳƍon珠cV}WeUñ!j4la[`n9vEMvٳGaz) Pa]_&.[_2ЧJFU.MU93uRLQy≛s1Y7 @oDS\ D:TuPLAT6L'}ɅaR߾1fC'e͚j/mTXRIqJUw(.Su"z.;h#D=9^:urD~ŋ5;ԆgeN /oA?oosDFG=ri(Y}뽤d Wg/ȹs"5%D1k; ,,x9zZFP [?EV”6 cn%(Hjg,'OǜO ,0WDTF 4ʕK)MӰ@ófڵ˩|5|)\P߯3+J7wOo,;<Jl)HS ^(F_^DY2xc𦕾˗/"535KsllqNGTW'3|< qyynoiEPf /pncǻdwՆG>wr (Z廄ui@:!Ӧޟ0%p7E(>AsrY} P9zȐqn*OC,jpKOĽ˷ʱ7C\f96n,yUs~"$ңZ"΁BAiР[,"T_~DX5F-B]Qf ȳؿc1нhuk2/2KΚ,o=a.1߰0ZPDNG*^~0c(r`l8D0աC:Je!/[I?Tx`V7*RycG?twT״2Sx3=o_:6J2edĢ$}B;g1 ۔7"õ!""y|҂",OJ]]^+ӧ;*_X"hN}IC`:.;ۤiEPq ':U sM.|l;r֬_dKBnŹYӳg )^GP|.Rb 1أ[ fJH<7NP`D % ]g%X.3:Ђ0rXGăqD95ԩOy)n/)(j' b93 b"b)4[y!ދVݯzyEj<:HGsw5TDʷc9u Dkx H6$@$pkrAk/uL (PSDM7NrfB{=^bZ&5꼆84"^s)(mKU!P:h]WބdfF*(Zy.,,,  tE#XSPU !1,D MOP@ zMt.r cnY衭 O=sgŸ(aT:άٿ:a Zљbٵԓ0+ӂ"r%V80QfɵsTHŽŲ^y NkwNTyO0.O9?|=7MBZ#\}g<ۙ<_:u\I}> %AQ+ވsx-oc6i3>Y(Xh(ջw+T鏠hۻ>`*Oh)(b#[9]CزcP#4S 5}MxB*n$EPD3`MyDG~ctЎvym-" LrH7MGNN6ah"DYYJo)1QBumߣ0k-kfҤquߵ}Sx  d"~Z9BsKTT%zhAѓӦɓUU6q+ѪGPhq>U!svmBMA"U)j)(ƒիG_̊BB!hON(TAJ\"hn'5A)(>9'^X\x[ /uWmN3BЇF:[E+#F~.O.q/ - Nx!8pAX>_A.*0[E;(CsOcﵠRx2 9{#?,2tq~oS9d˖E=+_'5( 3U-x/;ɱSx":arN0Xƃ@Z7T5e)\О#dƌ6-ѽ}VZP0=IMLYgF~Jʾxq7a7aBDl#ߠi}|;#D.4lPٲ)~ Nm!c-Uز B0K[e-O$@$pkrAF+)4T`]NJ)"Vu˴QqdZPD1BM/HG "o ۭ֭u`)5k\b޽ըMCakת vxיkn%#Wɲ!x LIA/8rRsJw1̋_rt#Vq@$ AJ.]3ҋ,q.ߢ=ޛ2X=?c}a7+&0^FY%ZOL%d#᝼ jaaR- ο/ɓ9W.M;~]+QR7W וYI<DE8pσZH^bSRs\E36IMO]s fHTrCyu븒\}pHK" bAD] aPPwWߙfITź+͐gٳ }77^IeVy'gW_;<ݽyw[wG ;^p -(Z3=2=aL~[: P}| .s*Yf.q\~O=cgE;ҡeT}ƳeapA=S[`mig[4bUbC  ҄{b (ʀɦp%s& hA1Kw!*۝g&@D8iPh9KqBZD!|=!B"{Q<\~^FY,a!!a밞{Se] *wKiAQ{:R MA]Z >'OV"{/Cu_ h Ҟ6sꞯjΚظ\5F@/A oKuHP^\lRwwM]8@d#<,sm>UҧMS9<`0D!/ID A$@$@FGPm.hYr~!0S6ȑ;Z[n U\Ry+Ȁ hzB9QsW [VH3[%Dkf1"E~DIԆtHKqّ% r?Yd֒\9g9~f8nXh>_͂:v~R۝9{Ay-, \;8D| .sh,P[< 0XǕI !" ޽Z9xɌX͜Hv9, {͓ݛ]6k[O}g,[r[J fjlIV=7e%aԁSZ˭DPq/ֶ[q_.ܑ(ʆMdXT¿xzz3)vN|[XT!7o8yQXs@q:9qL}`{  H"vUNu)";tP}&qׯTP` ԫWQUu.fdp߼\^Ej 4G-S -[JH35ũKTr-V,n`'YGX > j䈇C\3CF88}m,p;wd˞UB]w [彩waۣ< 4JMr&>Au IIqm0 >W} 62VsOm o#u*)'^=uJ9(|SʙuRƹm{ZD^LjKz/kb+|i\~ ݓO>~F8"wn0b&l[IyMqP[^(R{#N87՗NqNRE=I}sHH ւ;&{xdΝ[uirgQ Ya$`g^CO.G%zlu ,kprz #T_E fo y(v'0hz3lhGO\޸%$cF^"KBX? \! /\U!} %   J j̍aϜ)$@$@$@$@$@$@$@$@$@PQݐIHHHHHHHHH< (HK"  ː "OR$@$@$@$@$@$@$@$@$@$`Gȳ6>s $8u/EY8)HHHH @fQ\ܸq$@$@$@$ PPLSHHHH@ϘE$4ICQ<0HHH1 s$@$@$@$H|ƬND ZPL- p @%@A1{HHH$ :ފWEHHHHH n6J$@$@$@@Hg@#_8 !:.͙F$@$@$@Lb0]HHH HHC@̀<>SͰIENDB`golang-github-johanneskaufmann-html-to-markdown-2.3.1/.github/images/point_code.png000066400000000000000000002445511476711565700304660ustar00rootroot00000000000000PNG  IHDR&"sRGB IDATx^xTϦF $%Ф t H"EXJ "*HS)J"-B{YnKv7 =޹sg~3EFVN>dyDY!K ̠@@@@ICrw4/kCx@@@@JH|3 "s+"2+gEb^)r3 @@@@g-10ŒmX`c T|i@"Ab7f    joinAs֌}    : ʷVHh     0}xD ߂C9EᙘX     @ @@@@$v*OE5AQ0g  ʷrT" `%PRPD3v @8Y<|L*     $0cA1+_$     FEY!@@@@tPd+r@@@@@ (bI@p"9T8PpK A)D80@P^E@5{@@@@@El     HHm]  A@@@?x(5 A@@@@@@@@@P,1@@@@@@@@?1C(1K %:E 3[YRQ&ـb    P~ s][ @@@CbqZ( (@@@@ (.Lby^] @@@L'Atv@@@5zy190EB( (@@@@TM%@@@@H3t1+3@@@@!AZh          0}0Ech-Tp+A@@@@LeE{kP.( A@@@@@'TyE"E @P4@"Ŋޘ-J@@@*l1]0EAT4+ڊc    `qB+pҳŜmejg΄P [כ[ԥf81( (וż@@@@aڱΙמyDgA}Zeo]_͝+]|:vhL#G(.J"6SAcWh?X}|݋$[fXNKˠiWQJJ:ժU>5AP#rDRTu^2խ- qNN&g??RSŋEX:ylI 33rxHwFR˖uپ-#   %O 1-Wtlg^cttMR\ճgkzzAڵ8hxTII@ff ٻ1#3Z 꾕Eٳ7T:vxݡCcrQ߿hQWwXX,:t ߞ=M.ݡԴ SǛ zj͜NS5ߺNgφ Jun˖Ô#>eJJJޓmޙ V%\yl\ H99!?שSw>EvBsll襗Z'ݼjԬBwyψ8:z2ݾNIAנN5!TgOݸP\cmmInԸq-j*@o;{,rv-^=_- 2ͣ9C/ߡ$[]FG׮#j׮22h{ah {8_m/-=r#Ξ盒ˊ@@)2-(kk(G@j2@,Ǖի)7#,i֮dne%N?q=-^6mQ_/t1-0@Y|5ZlAuͅ3~&ql}UBի־K07|X7ԩhsqڼP5Iiߵk{ѭ[aZ}35o^G8T'd׮-h/cQΚV:ְBSQW#ۣfgpyzޟ:լYX{7f~VfBcQ_Ajm8G7 {Z"drr:M~gJռy-;kM#d2dQCu% ^U+ќ9Ԇ¢… ]Mcg&`]ǟ'Ub  reRPK'd4p`ɮ$( Unْl(5J{Wv  ]"i˖#,Th/>H@Y q-^4Կ'┩+!P.kSE8j6͸uQzذnjy\P4E/МSqE&.bgWhȕ%AMg,ɍ˯8&aU/ռކBCchCb^j" ̮a/Uի eҾgE߯FVVh7kg&}>jZf:|Qm'){޻)ۀbiOT"*~36<,xHdG.s (s@*&2#(?xވqఔƍjRT*Ś{0gnoF)1*/E> 4BD5<1fPJ5@y#PEz•Hac-Kmh)|ɡ'CTar+QsEjLc|EY<ἚƂӟ57m W,,reΛ]x[H'6\F1w,ugoE t4CfC8甋|l#mR\!M5|X'LVO͛am5Ee^y9רPXx,͘AϋgMhƅ  Pr_!ɜ~}_0םGmlj FljINji-lNn.]rN FشIm񴑟@@@@"(Kxlֿ4dqs&›I ki͡,z}0A?j7mРԽ1(ڵ{D&MjӴEw/^R/6sf ڵ633ƌ](9Me !QC&~vh:ohY\ܹBS5+Jo ,I .5mgEfȾԎ󇲨(و݊6_\>@@x₢UjؐuN,ʦPPuJPuR"   @v25ʎLj+Eᮓ^*shE]'W2\ *brrkq!tø9T%(JջB WR7;/Z'U7+WI\Yn,jru 5y1Y\_5zcPg=9_֭CWy/޷b>cu֧CL].\  P }oQ]O[ ph     P .+bRn=~-/^b;jUY>bA⺺:蝫(fh=ty}v~>|ݼP9Z6Cs0AM}7_ )ga.i.j>)As-\%پX ""h7[ށWM 3k+aNK2Sra.ƕsK9\5'܌ըQ  P)AQΛS«-C>m31UgCfVVgPkFtMq6.rxVA@@@$O#G- t4 Y6͂r!JDCIoQB"X"˾2PYiZ2ITjܸ;ŋ3!Tߛf|SFaR._A%b.i(Ey@ ڦ8|"}#+%{xԕ-סɓ r0**MWW^yz= 9zo9*j2)U Zj4 O Sso q+B E"fJL)/',;n]OTr.,H   P ĥ9 8s5g6.E[ztoI^;=dž 'qь^&77GQY?c'(ʫGs7xAerAT?5TTtfۺmۮ|רA.6o9D;w*zOGg?8|Àm9Kn;7FjBϗ_n;w#Dky Rsjސ/ަy}k 2;Wt Mt<>6MA|NG+!lߧv2A9@72/(s>k+r,ܜ,(;%EcaK\[GyZ9wcv    `TgB\*"fB*زbt6cE^VIb{A)m4thWUrAQ:USS3T%D'X<433t! V)}L]֧Ǘ_ SKdNtD˖+CoxN:JBI )4cj,,2C#\][*"PGJI֭[ 1y5l~KS9OD*_s_ !WWGu2 %#}*$DkˣxU_&֭im Kp T<O<*QQPPYaf&*?;i?uxˌʚ3Py~SygI_Qˑ(cE%1*}ϢR﨑=C:!ځE]lL3Z.(N~/-]C%d5 6iRރ\c? v"/G,3.Ʊs1:w=jy{{Wcޫ"!s8#r%Uy\lKJUOHqGNKˠZY؂Mn')ZXPsi<Wfb?)x!sQc!׺f11<Nڸ^g;΅8qBojѢn4ZP{7e&&{&PlLpڶZ }  A@ʯ\KQ )zWWExjAq½@@@@@@@@@ (b$>dag"  (EYH'vx t54 $`ɈJiz)KS'x5+ȿަxՉ\ -?;Ndf"Dٗ6jfF]DpV{=+&eT~P:7h KŤ~BCh%O^6r| 2D]bt7|ʈ :[lDssʊA,NW좤 Zh PTHA1&&f~k}[TR>>b>egЄuzen}*' IDAT6m:@nnxQ~Y)sǀ* "(칿RVV K/hYaxUA1?/GQdـ*uxGTmbyٔ~x]ԛSv}1𳔗LeYP >s2ڳ>U}Kv]N'^.(%_O9YmڽDTk{+{5v`<-@l⤷RBBX/%jt=$R6XD3'kװ]NҦ_ ˖]Ƈ@I(+b/iSKby@)("O5/+vO4r~M.s(|I%RJ=YfŌ3wl@yY~xEj8T(. T&E9=s ʊ  !@E PkW_,7^e7n]K %: A1??-B԰A 8  Pʲ(DŌDNfRXՌ e)2bY7GW9+t]# 3sTA  PT8A%((Xuk% s2feeӈ|[գ M@Q T^uj@=tlPDڳ 5l~~ը2kٳ\ڼKJτYlL;kʕ^ə:uj5i^_ъɞ(G[au>ې|}=4L:w]p(99Vu+SZ5wSպf);+ׯNs҈<zΝIn4`@QC:dFFx]3nZtMO~~^ԺM}ZIuq{)z+flreWjԟ7W۟Aq>}]w#׃5Cux}`fnF/jC BkΜw"#5kTVQW۶(efVq)5:y*ti&5ŜTJq2͍\!=cΟ(") J H!glт+|mrX4erwwV59r2YYYP&Ҙ- \ѯϵRq)uZ?0.baIv5#[6D WMp!\8YNWF;IanI.͇S)aΝjv$.ipߜhB**Y;U#7pk(;6FY&}b>!.xdZ,!z(^Jn4yE<'{zSCa}l^%!(:6/Gfe]{\AY7)'5Rv'Vx,yeE]bLb?w׹JBPK:9?w+Ot  @'⒩V٬Z+ut^ȡh>^KGQ׮-h=M?m'+Z9Es'>T0OW5a1ko<۷_vƢ믩鯿NjΜQjY4|57 ƒ2QHׯ+fo z^iŵ3X݌ك:th\ې  u~)j]ȍPZw5Y{kB4i}?e8X=}WD;Snܸ ҺW@/+ i ,n_1|32+iu`*ΞI'N_b8epwV)+1QK.[tٍM(=:U#3KKJ{WY݅/ٮ :XdOU~Ń ?0Ȍ**r;]ƕlʾ%\UT $UfrAkic*-)"g \G^soϛ=v:öXAw[MIIԩSSVVvq\l_o8RXY}U̦M/9-O,8q0p`GK?o:@6cL5'i2vz 5n\xzEJMˠ_TaS${B@0COƵԮ3!{d~p>R^^>)(nq]ucdnfFG\'#GtyECOӵGE7,<|ʊm+ LPzz?<5h%AQzg??bq2#&nޤݺ~GN^O\}kӺASc?w@FG5I|vH֕Q(aс\{r/J|gP*M'ك̾f'ʈ(Fq9UZ2uNJE홦dt.zJxVf K;ƪR:ҵeݢ{D; UJM|s(d"WxMW>Wfhz$%+sKrߟ*Qͽ«O2}bJt7}SW~cKRoZRG$ǀc;AN_W77=:ogz^^{+lJ[P,hSb|w|Bnq@!賲ØΞ`[UcFT{E$'9*]yp<䂢[)ys)wed/D8cҥ_şzIUgR<,| 6RxzHZ:lgNUœ50DP4u8%=B Y,,@Y¶Vz3+{A0| ۢt:JMkֳ04Eg# T^,-Oƞ#^@@@FB rq] BlrIr ^z -OܜAPd.t0D\$EQ&:4szJ$tq 6'+O}YH]4w,7l۪.ߡs?XT Szj^A87EB(+ 3+{W~n3ƌI/dbHƶtvS5DjL.(Viӆ<vekz$(`,?m<@7n>$Wzgr_cLqBXI! zgC!kB)E㼉oMU}/[dSEYxL.(VHM+$;(T(͏Mm=<\EEp1~}ʍYIt :}xHޢ @J@y3#/Q쑹{Ǐ#H\_3n,r2 ӔExX[88XJU䷓otn:+7R;.|6^͈!5M*`Qhd![ ט^SsExI!)%c~*l q>^6IP&u/ orA1a(&$LaUGg:\YY0 gW6]|qP+9Fa  &pg>];g{V(Wy\ Sr(NԇZUgQtè2Za"Wɫ-YS.,}E\b(J}Nn|D0GĩgaaN͚Q`:: =:v$g%EDߔkC@^vG;Ĺ}w`iVv]rNV]#uh!iʃھC6^͋v%Y#_es MvۋzJF%ʊ*"#s ڈ9RVF9#ee|2l\Z+f1"(^Ҽv&)#[ ja%9m YsFؽ*MA٫T-O)P)%1±a  p$ FFT劻͇"rFd!/QvOK'/"/"{Z7/Rzy-|vlOJPBhTqysGkV.x…Om[ ƼX}qUqٜ٣K=IW,͞Ma`mM|Lʕȯ傢[%|[(!!bl+fqSEqyud~/ؤIm!E&Mȫ¢d ׯ{şÆzR|SE^y Uw ֭{p{w#)uz-Y5Jbնa  8A=·*{eY1!Y Nn)PFqE=IuZTF8C fE>$=^q*'OF3|,RA]21ƞt, IfW3~.O.}KEuann]1Uj oL٪OP<\1ؘeФe)|6O.L)!ExWfNNg}ɹi!CNPܳ'6FOA1{#㏕\i+KxV:}&D7U/Zr}HZ [$QI^`;;x<]GgM)9  .7TXy9ĖI 5Ҭm*z{2vnԩSMk'SPT%}8Hm 796x%Z/q|oR: ,G.Wiz_Jr㜅P.(Z:8PqDΣ_pO5MS]`Q<ZDetJw+l̟ZKn!k6  P\APdp$<8QQsgݒ\[ yXyRv7U%ra*s)8F ) [ڮM졯)3r%SV U\LCLOOezƥ0m!<{x(Shr>͒6cEϡސ)YEkܝfNTR4;'\ǒm JHT6q{$-+Pedi*Ǝ[G}prȹ[ΝŹIP``]Q8C^u0AO~;w#!__6^4g"٤\GV"Ϟda\Էo;QZ~?o_",ѱyl6?P>IA|N%蕁ժ3˿v6SM T^,q_~9Hv++kDQnj9lE>6Me{)ʵێzj#^ot~T 7er~`/iSP)boՑ:{܂|?2GZYY9$/ ^^%2ߟ|w \j_!;wRּTlSTpb=\ O@RIJ0ǕY\ffSٵI*UQ/lbsզ /ȚME^FȫhnZnfz3WeOI.r9)y6ϮsKɱl*|[~ANrEUzY8U^<|/9t 垂,4H)"'M0tհyS9e!6}|.J[YM4lzkj,ސ 竃d.ImD8bsV;Es9-\ >Zгdn.IPF85~(FW[[Qվ߳  #PE; [,HT 5Kw)?⡙"٫EX7k# mYd+#kk ~\XHg!;nLOPd,IP<*k컈w[ *,~ܟsrhJ9L9//""U 'LM[:mDyM=<\Dn;wUsV]moy#ٸ=KᵓEd2ʦ3P'6.D IDATE>!_}j,9QLLj ~4|1Na`ei(1"9大C 33 :,5⿇./Qpƻ0*О.do[ A@ ^I읤W|ya,hz nG<-/S2[M3UPd2i-ٸPnZ2摹}Ad =:2#.ژ۹RnZ$"۳S %s?fS-ڼ:tvA,JWA'c1e?x80AQ `JL>GQ sKߕ}9WAyȮz鼨Xs"XdX9 4?GY|Ncư;Lj4sH8 @@tRPd\^[Xx: uۋ˴jjoZUXY\YqCr J%h.ûӯV?x Z{ݻ) o ]UȅHtY||2I:|${c“n.ݮ6>/ЭaaGI$d-?V3׮\Tk4M>&c`gjӠ;UK>-fҘk׬̅rvkY62}!Oea+3sAg[t?Tx/v\ސ %Fn^l/PҶ-E>MyY{ښ$kyCWԼz"cR>(&teÑ\Z&I8Ga̡8ӽÇZ+̹9obIJL¡2KVnr.q:ɩz}Xe1[l 6kٳsJ8YPkM HǍ],ׄWd!Ʈi*D, <X$C5W{J>&¹˒bG{g^Y5΁,KZyXKK|+#7{8_Ag-aO~}qǢ蒅u.R΢O;AѰeu}qeQZT{yS CSh $: J 75o[:cAZ]HXPrr'{畆qearYsiK );),Wx5q~;L!sp6:bi5uRaf.!啻,-"wOb,,Ɩ%wy_CXsR"(;ٸU%W/_f'?@!PŲŲ6Fzu+Lg3'37lmؠ  wbHTP~s(. r)J9bS9ϣggWx졯HaiK/T+SSBb[(elAp&c8/$ ]ѱcW M\N4X-¼DJe@(/U wPg.zc^G4K#^kI%el'@P,c RN3|||iRkzL1 $A$iH@x- _RnY1 (건U}u_y,M*}mzMi"g"о ] (b_w\%S+xsE G/j&r@@@t    El ] (b_I!7B)22j"+BC5 Z9a     Cbp-^""(+1ã 'Aݻv9n]NJѣPVUQ,Zrr:Mz{ -J )b>P(/FE%PzF&)5oc,T::ږM哭5yzɓtvK&Ex׫^2K&+nTU#]g}:D=iEI{; (>>EmߐKkC׮97$A4BKj1y!=wSrN].++"e(++GkϞ Q ,p6zKԾ]#+4 Pi1\ڽx]EΝiCdnnF+W#e|vy\6> F     OOقAP, ,YE9w[MqeVP鯿NqE*t (mɥaYA1--OV -tӯRprriS?s#B[ŧib^0SD=,(r1 )##0Z9 yݚ]tETɉ-_ACBB -\Mӻ-5mR Igue@Rz;ei #AQkz*:U^j*bePvJȏeW*U $KGG9ysA$rr"*UrVdny$Q~n.WFtg۶Bs(ffRTP(H^UڴQ3ԺUUne_{w#),,mD>o  Fڵ{t^99رJOU͝Z' .X@}=饗Z2:|";{Sgssu$??/jݦƈܾAi>|鹎MQY8ۿ,ݺNCcÙj{Qndkkmv1%tލ$_j֬x/1W3s3zWUX9!@d9MڗhG'_ 5nTSxnJ^49g|oc=SS3}gp UD]O%!(:LKn|;\\Lڷyy|RǎEkKޫdf,ȣu~^N_`I7"s(F;'ˈ%3 qGZEm?Fun(8EUi@@@.eQk0F=Z P( {nлʍ~[c5<Ӈ콼NGE͛Q #/'GgQ{_E݋.[hlOmZ^>@ᎺO_5)܍ja#Gv_8qN:M5k(ծUU븼8I#9PXB+# t=ޟK MY/ƍi a mw+ak:-_6*vi.DuMkܸ;]/ctsc;w"hMHO%!(r%?Z+n9vl/zml\|2:uΜ!| }eyʴ/vmNmq}^fdЍ_DqX:8:ieKnL ɽIթ/,E:Բe]r5Q5jиXN^P'NcM2G[8NL _g͍2cc)eR.(ʕU(/;[tѴ)VLis8ffeE ƌQw^f̈́a͛E2*sm:|bѓ=\Th?,-|Jj~$|uzjֵsh쬩_S J;B}8XDltdsMY3JJJ%+j GΪk$AQ:У{KY*=r.\-7hPCor{5n\(,<H,JZ*Ӧװ3hPgrt#cm4nl/]H1CE#b,Q 7!;"N*(^ݤon#`1QYm!"]Mx6ú G/63fFnnJ`yeQ[Ӥ |>b[eސPAOz{ %%˹z7'dl9 j5 Nq}P~^>YY4bцE5s=:q= Uk^*BV:>{vg655 @xFc6]UYC9irWk阝*4lܕ䛷W՛=[ף} En<40E"(*"0coDasce`]0xav+SW^ 0ha(Yٳ~ӧkWCSW}OT(7nнݻj='$@Ӆ!ffTwP^GGӍMD7-ZPmU}rxw:{&x6?T5#;[/L].D"XWfOBOOW!EG'iJNSt13e4;FUcߴ}J4tVk3gIpܖ-A'N^-^4AxnJt9'|qPH}`Z(3f|'c"$Ab!CY[0 R.ե _|' })iE—.Dl#t/OJb I*(r(9 lSMTݜ9BoAh"[ $&&N.•p!BuƵR_Hݾ]CZA=kYdбzuٻj8Io?U5E ջw'gu !^ 2c~r*(d,6oG-[&Cm@@    T(AL/R1!\; 0? !+"wԭ͛)5<\x67NEx7O{fa /ĵBMAߊ5ձֽׯRC{'B @`Noؾy{+=eݏ?V7e!A<]GbN&HpbdեrAQS{I^5E-Gܒ%TP0hġ*8fB. 166IlF ^yF4dlqp%% ֤{ȽfLCES+33FRzi|}!}46}aS_[IPի 2Pk(ԩ MtQReix',ޗt„ѫ$xr7HfdMcر!REs5teڷșZ;ku|pHk"ܮ\IYYZylJuk{>@@@@PhbiZGG9%^\*};WqEjP:ի竳h Cߚ#ҕ^x/U)gm(cVr+[mi6ԢE]Q4D4{Vrma![š!)%q9\.7Em>AQ4=U zH3VJ޸JZ/C ǍWz =+}IlJCHL!ȑ=VB.(ş-ꐗW%WD۝NGN) 4;y\zJ"4_ZT5d.Υ ]YXX@R9{,'@@@@@ $PEf•P&D3 Tz/yr1zÆ ffvۭԇ֖RcOC8T5R\P>/6.Y4ָ`37r׺u5lPC6E6lGfoϢl=tySQ3$WWfFڴ4x%|-I,njUmK {/.3D4=ɧ??`|fhzgoQ͚UԦŅzVTV'(â(!Ʋ3VP,2dohPAQ'vK)J#7e||2=Y)Ƴ.{jA:s&:Lɲyآ.5kZ`q-z{>뇇Q .Ս'MҚ)xqKV>y[XpH,$J^ !Eu2?n= E;s- D,&i:nzmOXtUwb.B*ϙ=JCasEaۋʿrDsZŋi90*o̅WfXb*7_*$OpJNMhأAQh2bIѐ9ޏ/y򹯿$s?j:+[fNΫW׳E>9$wEjz q 5dǯ"O7= (쐲6|r %Os__Gy_9t}7(6*@{0@吸z}RG! *In|M#Eb~8Û`#}NYM8୷ʩ ,WڬYE b1r/jn ]dajByrqk9|xpn={.RzQN26-B+M[)*Ak6O'+ J6UĞBPYyf]9\RO.1 1)J77wKL]/i\sH^t|C}bJjHUI"߿}74+Ԭ.oi>e.j!%' l] K ?"kU%WeUg,)ר^;X~N [[[{u@M >O;4[sJw6 IDATRJhft[͙08-?iO]T8?Ң=F^ڢCbw w/]|WP.o_E{*?Mt-p}e ?JN9ŵ胆<8ք:DSxQՕgYV2SeKϕ_um `VZlL9^ mxT{jcz)8i|+x?#DWRSD[_?Dz|Fԩ_a0ByŊ/=D׆ws8Yjªw \q-Bz=g>WFH糺0@_ S6n.3f.E[PdTy W]qϟ'ϬZ?kDB)- i鼼mGaӦ-4zǛ6p#իԉ(߇&n-mN?ݼtjQb:lE. @@_e.r]9{n-$eKise41jÍ{!C|{ۻ;w6INz@Qj/Ĵٳ{0KL4]c RmoE_vJF: z}5߈Zҿ_yJj|ņB붩Dҋ={dx^:>,:+40馳{6tލVuɧS{ ]xLՒu;ko's\Orfgk=쥬KBu3gW;U=aU?n<5E>4ljRI)2ޥ˾׆}CP{5o{O8D{o_wzm hXx@kk.yͿ/(T+Wl=cԞ1E=u߇N_t@󻞂 P<|6  P}ynGٳ q!ڻ_/:Yi_4aIE{dl,RU+ 'm3U~vu4!ړOCP4h/F!YNlѸؐ[]Z==.,iР$&֓6iqIߗ)-Z6 zq9*܎6zb@M;WM{1*ʵPϺ^#:_Iꥨ֍-}27T=mnT^V&t^L-=xo߬(ǟNouxUædCiʒTʒu߈8/b   |wNiRZiׂ-XW^f\z2kj;)S_.={3s;TϽZ3K(:@   !xi2)pMuh L4[{IA4UKll!@b|RUTC@@ (ָS#PbsBZG+g @@@5qTKY! 1+g9[l"CtWc@@@@s+j" !%PXjnXXH5" "@%  SEY0@@| mmn%'Gb@@ @X," !$&Wo  SJS@@(Ƒ  &⎝W5C{vh  PN  5R (/C]Ncϑ0f' V@  @u1=2kri*Q:uL뙞~@}K)K~<HK }l>]7lMLƽzI\R6_tJN)-$p^ X`WFc3C@:P,((%KKeyd@?M%3g-Zr]KDDG]˦~3Eի'9{W㎓]_O$//oҿ'_vM>;    ]2c2gJY%v{PiղfeS|.DsarE}3I+1/3SRO<{5HDke/C-^籯dҥKK -u&@@@@ Pmioĭtaң{3tyF%N E%:*@Q{(\vN=7Ms= +,\#f;_U+Bn/Huj)@@@@(!/X$"Z=kE>od|f'b|ҠkWz+>XvI ؾc̞B_%99y:IM]LJA@j@n~iBdDXMo Ǐ  @C(NT&<4I{0>;HBBlC'Nmѕk=PL1B*.Zחx jf6YjjLNe@@: su<+  py8s2i+4EP y Pu%{޸iyw2mۤRi<Ń#%?7W rr+QuH嗻tjxR     P(z᯲fmYEcqRbʦ)SD ݛ%&J%|&u@@@@(n߾W^};s=gt9=nI d-%hTB@@@@ DjlՄ?E"ȝ#aaaNwh#*! !(p 5#6}Vd@@ $jl'yRVD6$P F# @9Xhl @ {n+v  jvi/  L ŌMdJxd>ܙ@@ P N@@!(:0   (r   P@@)@ȅ  @5  X`vx*" =B@@@@&@0Jv    @ (9    L@1`@.,cC1,A@*&@X1?F@VU0@@Bcc@@ x2@@"c[@@ 4@@cS@@ 6@@cK@@ 8@@cC@@ s M#Â@@Le2    -@#    P&2qQ@@@@ P O@@{G  [@@@0@@| (r]  (r  8 PtLEE@@@@ P@@@@@    \     X@1@@؛o\7."Nk@@J PA@)#(6J PA@( Pj@@ P@@p,@蘊  @h C17E@ (:  b!vi.  P@!@@P P 3N{@@gΜ @n~isdDXȵ#  P@@@@@    \     X@1@@.0 Z@@@@@| 3  /E @@E@@ =C|Z@@S)! !&@b'" BQ @5P;@p&@̉Z  @ sȝr 8 PtD%@@@@PE@@@@p,@蘊     @5  S 7м  nE.@@̅  K@@@@k@@c**4!ׯ k::{˾}%<<\7oh*! ձbZΑiذ#\IKm&%5Z"mWrTbe26 @ P iٷO2nXIh2{%&!WI6Wuے-vןQ6ZJXXg,cUU%X@1Uv/]*W`n*iTyȥϕ61s><\w3mBygOehǶJL4[Zl"?veY7cYLgph [2Cٮ?Yӧj٤ _~'JNvU+PExoeƌ3OtpӦrc%?L Y=K毒f܇Ttww{&<ᄾr%tvV򞯲4h5̳WsYB^|i2%::2P.u?t?V Y* L@1'$+zV4'ĿRՁ>YwD_;T9n_.?L_T`Prmx lYNT&.M}*'Tfu ԃ\CG'kluNs.Z+O?=<4|+g9: ?(jmG!W_=ď>by s "cEWDU~/(g. pp)P3gfɰsO'NºC(jo&=i/ZWٳJ`+BXkۭסSwWS{(SO\ճy4(V5@ 8mF"ڕ.F&dI桡w2by?y8qyPduYEX^/(r?y5T~z  P @eI9Tiǎ~|yS'Q35(!AaҪemV"Pt*z55P`|䖛ϒj'{$P "@:& IDAT#Msƍ%//_9.;.g9> T bE sp(:Q:~**G"1=2kri*Q:u,@DƦMfì;$7#g$IdBB1d۬Yr 5UtQ:u$iSI0@"b|#,,(m3gJƆ 3b4=zȞ+JC1?;[f6 dk*j:hgixY[E&UC}. ~"'K_=F宻/ 톍i2}2YdyCrOu4MnNz޽I.sI̾J' wl:{gc^(ꃕ3D mU?<" Y:[ @K`îU^}FMtnn~磏\.[+}HS[%Rx$9(g&/<]}fMy(=͊ϩt˸&/4U9\vۻ_W@3w/PԞo{mH-lW}:Ȁ)Ҡ~~ax-P]Wy.w*iC}Xo:K̙׾9N>X^lه>H6m@Q&!'N1ڵkVll}`k8mo_;$&&R&NrG)x4$C[{6ǟDŽ}4}qM'u]ZJbf^l\t1rIkwÍi N-$@V,?4SN9e{Αn_޷?8S#!]~Cz @ T@Qo-^gz#5퍢aTl8Y>n9%qa;>lL0hKɓڿD%cƘ`0U+ismgϺ~0(0A714bvhO6|)>=g̝J2=5@U޽K+Xݧ7QzO= )CQ-1ӛX-zs9 3NMg( ޸[}mJϞzi'A-#.;M7}j3הZY41w%ߙ(7xVrmx:]5ÑE]}CӼNG{iۦ usItwǺ+F [50^b8W2jѐto+: CWU潂YKQ܇ZRZݺ-3{h~Һ:OR)!qv={YTϹUthZڥ N/ @=桬>$cnhᇊz7(*CQ?ǯ-z/}WةS 3R"؋=Pw {OR]sǻ9w 5g? ט菽_h=vE931;Pܾ}<f>|~?8?8c~>@ @Q{HMcވGҥԊ)=k4 ԒreUɸWߺ vuo-3êt3wr;P'^͎,zhmM/ƍÅ;nm;R笳!d֓O~y-g=̈́j{ŕϘ{/Νz?Ic_>=\O GSCOO5y Iq#sW:*5yu{έTi1N4u؏^W}|,׆Nêl~qZDѡL%{RQ{1ZE2Q2`I/cq~7YǦ״g@ƻncb }޲6Z~ yhŪ/YעzN\rNp (:>lLQo̜T!W^麿y|YVё!b( 5=P}^J ros~1ν8\;TGP@/1ӯ}?<.C~0@-pE,ʎwȖ;|p$]Rla<=wh_ Y{j Z :u{]$n`\;qrvُUWԹg|/YosjKVf(Ϳ~֫=|8`?p]yYW`9^u-[d_j:XۋN'KJVAZ|6}E]k㯮ҬܕPELJUE٧w{=@Ql1c~2[vʆik7a\CF rK*Pz hֿ;8jշWo )/Ћbϳ:Jbذ~we GZʦ:,=s"4)gem^Z Q]Wy"/؋C큢}NY_s/:殒゚VdisaRqTӗo|gF>8 G?:zggJYE롣kE@q =WeϞ e{nj>E;hVK?+DGheG\ZX1 @ T@:\h= 5@OcV9 οev~DsBEW)՞7ñ0?_V/Y;v:]rD7(sb%KT:b-y ŝ W"k>*֮m3gJ= #I[?EՍwtY?>H3g?7O_^k>]jo8Sڵ*|2b=P^ʢ~Чzάy_. X+uܹO~ށ~رp+-\rG0*E}oɒ9|-}\;pzVUV*S̓N'ɍ݇_2nust F MZ`ɪ_C{ᅠdu}duʆvÇ{1]Rڝ{PLl[Z+{{V &z36m5_mb!̃[m+Do7_YuSWr#@*?ԏiftI?ϖ?vM3(~4;oli5.{Fz2܆zϥ^Zn\ٳҥ'?1>2!&ɕL?c@qΜ_up]ۦaڱ=큢.P it^EX@|l޼CcmسX jK^F乆yb{p~Cu-VI/ĺE*ށO&4G- w7O3uhLǎ/sj7Z4 J7C 1 F'u?07&ZCW{`:vfLoO>Y{E'(ZnT鼙D:|EXEdݫj@kD-z Ȗ~|j4{ż~?sq=}jp>ebdWuj)`3lDJF;thpۢEcs?fqbNGsy-m9uj  V˳}abV.܏դ+ PjT6g^3/{n*aaв9b ٸW/IR4 Pc52v|ZG{!͞oX%&1 +Q/#KIGO[n CFH}Ej2ztU~J?Z+ӛT}~rYGYgy.xh7/'Wm16uBb7:{OdS_dE IDAT>'|Ͻc$5uU}ڨuX)>.쎸x70+ kD;ϕ/([ pĉڋnҷ$gIC5&7g>Xok(NHK+0x{(ZiF]XJe2TH`oiݸalKd?+L ׻[l ؃҈{YuLbݏ{ⴽwC`5׿ӥOM~(_NG馳b:^zy Lcߚg>C|>)5;wkG_+Gkhחw~&_; P}"PxGI'i3:YPk",h /㓓MCE$ضTy5vP\Y"k9ptE$JcyF&+Kz#~aHJjhz:R#6qzҸq]Gs 9աO==^swrF)+iO#1s6Z>J2N׬v\Zظ@##jf8j@@J PVv |Vy  !@X@ 84@J@e  @0(Y   @o@@ P H#@@ (" !@V   P (C@D`ofiIݸ i@@b     !"@"'f"    @(@@@@BD@1DN4D@@@@ Pd  @ sT @@1@F`< @b   AyZi  Pa @@ 8*@@d{@@ H,@@ds@@ X.@@bck@@ h0@@Bcc@@ x2@@"c[@@ 4@@cS@@ 6@@cK@@ 8@@cC@@ :@@c;@@@@BP@1O:MF@@@@c;@@@@BP@1O:MF@@@@c;@@ 2 L kDŽyKi  @YˢE]@@ X9N6ME@ @X," $@Jg" [Q@)Ő:4@p,@蘊  @h (  SERC@BL@1N8E@ (:  jٹёatڋ  P"    8 PtLEE@@@@ P@@@@@ @nkP 3Ok@@B@@| 3  /E @@E@@ =C|Z@@S)! !&@b'" BQ @5P;@p&@̉Z  @ 7mrm  :@@@@@c**"    "    8 PtLEE@@@@ P@@){kQ,%  P$@Հ  S`G+Pl@%  @޽e߾.͛7 6( C Rv,$ T@u HvvHÆu=;;WvII V H $w&Yu[JXDcR۷Y HxTmUi|u+@ C1&g>ܺU"bc%e|Xt<'f#O!Gt/ߎV"WoBiٲ&}}qvҵo̱|׻B>;;އӊcˊAyk%2C^A^[ڴnǎ2m @ c7Ʉ HDD£ώ?LD@,&}T"*e[ݯ25 A#@S_eҥR+.N\}uX]LPSniUenn\yճ$%%pǟ&&6A]q~6U~if>>R1++GwܹO"]wzY6HEɊ%..ZN:o@ȝ[Feѣ%,z PcF̘P|鑎mڴ]`Tל]eJ.NnǓh(Ƶ9R 3d5;g<[vMXof,wdo_"Qx˕_eq. @p( i@ ddJ||L2nܸ]%99pWTv:$"Xi Jn#4TΚpW*;G65&Pܳ'Cf^.Z%J36m2f!f>ø$IO";p@͚%RSEUSG6$"& *,(m3gJƆ 3b4=zȞ+JC1?;[f6 d+泚Y ?2p@JҬgg?k_VۧoGء}muf.ZҲUthLw ݚo379VJff9  ɍǓ)'&綗# W9'毖 VaMAv}]>gdl(YvI3֨W/m\t=xo{ٽ|d)I$*!95tܳ|ؾ] ͱ5lo/HjIϞ$:*  :L7/cD5h+O~]k$~ku%`HaYqtj;V %1RN3\YDY+9~*uz/ʢ?ݾ.Kv)_d-濻um%t-u/ @p $,BH|2*ƶ:\e 졙/Hipĝ~÷-_]nlٿWyf7e-_]Vo{I*+1J7HXxgZ I&,~Wo҆<.;=!]5,2Ǽ[=Lƾ};J%K?L7anm䮻/v@12"+дo[{+fgz|͚+'7O>;z[/GK4l0a}?]w'#E렵` iS:4P[^3V{Gեn)|: !/t8>E?}2Yln<^r1织N|fk: U^mBt-z]7[Mi֧f~dz;fp.@H֟-z~u颽(CHܰ{w ]>lВt'3y.sc^%6&*}!J 3/.:U#WwfPhXi3 *:r姟lҷ4<օ/]% T5Xݻ`8~sGi`%?')#FHXa6HL={d%?^ݻIOeo~jh!m:w5cDth` /^큢>XǦ{Y5~dnf~f]-[zfڅ5kS=t֭+7iE?#<=uFIA~nEya\a 7=u4ԹK][V睯ضmq['P{xdԵ:=TSiXN_x+;we^@Wn/Qy wj,'lf3T8(L>4ltqv6_YO))-e@NC-[v[dcCϖik^Jڜ9ߦ:\^ދ:|Z'7\5gGj/kN׭3/Sa^ZT(?|»̒yVKkA+uXb^#$+Hg9 &3249bL_31f !u8᤟k :Cw I/h%,;Vדx}fPC -:R(kQ_BJ{g,C'7ܴo' ]+O[(e:o.\|W?v O}[vkw'/0=^yݻ]ÇwJAwy{2\z\8 5=gL8'Ҋ IDAT[RSwPyKi:W[oZP8Yj9'u'.bs˭= [־߷rWn"#e)}'9 ~}{ui_6 @0 @QWi+,4 s.-zɎC%0bm{Y==7Y V{3uxfͯhuE}]n~j6=,BYbjkq-:%E]S+ԡ:\5k;wϙ39Çz|hԞh (LzR37'c5g' q(?xBUthqlk;]YZtTU׆wz/'IB6 ;*~ J "EEAz-RHkNM23޽ɝsOyΙp.<7dڌ?XJkpΜ'NWzJ ysߛφ1f}U;E>}:CGΙX0b,lw1umc.`GADRjC_ p.䭪&\ySM>ay~Exv ˑ=ÇkKn_$:|^)ɞ~jt`XېkL4BS1ש"7B(t*ͥ/q!t=O$Aѐ+O|OT^ spUW J6Cb࢕:ߐMxsL!ͩk#'#:<ÂA@@!"NHH= Ln1Qԧw{j6I7! ,4(1.IJL*(yv:~\<I$OI&/6.Yq0$/NÂV1ԹS+Bx[o=J'O%ܹ?r~B|Ğ|<}'uXƕ_x3q1A񣏞W"kRȳ1Aѷ}?7r]7&(Vdӵߟ]8{RAVpv^-7$(DG,qtU՞ɖl  v@*E# B$("Bc{jy 9PI}0W媱ڦ/a㔲}hyYԧ\P䜊[Q<$)%mxcxUyR1g' ޿_ w1 }GvS8~"@CE.Gh): >1UW)MoN4}CĉK4oG}:a|bц,aj@Nt>O,,rb?m:58u3r~Pcs'e=k"xNd/EB]\ʡէ4vU;mcGT{Mfn)p˖l  v@E9Ϥt} u寧f'T*I|?WeP2˕cG5rx]BW 3ގȦ]E b1u4KCKk̓TElNbS?eHȯ!>x#U0猛R13OA{GkLcKZS ,HOP\y3g+ HSHO?Hxτa4vfW~G}nm#ܐ3Pŕ$ ј6ˍ#rD8%`A՗5ZlD.yGEQo7:Eyx>q4W.--zp<pX4 Қ؛=X\䊪G~}UTr˗SeI^Vk_[Î9 = {=ǚ*:OTXzqwb$W__1_~#(lC7(ƒ,?!OAݻ‹l#coj*u>]Nq4W(=7~Pck*AUiÆbb{w+ޫKP wޞ$Byu(d\3!rf>=-[Ҕ'PTfUpnwtzqHɞ%ӈ=t@񖹹ksąE8sy\epyD)_ACTXpa D>QPjs[ʎyx>x0+if=wN,O+\drA:eyرռ6'.wTy]*l"DTpsBa   `jECvRE8gNiaIS )G({χbNGE%ivΡڂfE^*NJ~GE7N'KV0pȳetSeAJRIdqQGW/0ZV/(7]5r^ʥo8Plڕ .B`ͷukj5V3 098{X`d!R2mA*Pcyy !Rx\!Kt%:tT\0Tdz {,>A/[v6m…w,)-ʢ$" sϿD=Xc&>>gtfK9{'En_dd0q.KnF v7Y۳IzuP_r2JkjJKQW͞1cynj99oOQuyѿ휄YUETS%dCQݏj*hyҎS֮:mZs|éKssF_CU@ ؔhhyyB (l 8QO{pG=,%! AASJm I`s=PrSs:6c0q`Esټ m|@L[PuaZ@ڲ٭[[zĕ-m\ŀ1k ,_P(y!Jgʖ-"=AǍƟ ?*}R!o_Jݽ[4ZYn.]*oUxع3 4P/h  6L> ib-Kqb@N8*ɕDٻ?$J~C qAc`if*o^vɔkJD[X7rD(⮯r^EΓ^9?XK45!31"Ƚyo *#YiQFl=.(nhpx@@+v!(J;"{ CR{8ę %BJTydѰ"'A}\ɣ6e̞ŊD17Xk<U[HG\Fg,ϾH5eLξȫXOh  p+A6K`UTTTJ; w2@@Z@P<@@@@@Pl@*pHWLβBBV19L@@b (Z 5"AѦ h9 @@@lE[-@@@,Hac(!mh0U$*1\3zѰ1@$1(&o54 MmhY@$1(X?bUQ?Oe A@@@r (Z5F"Y| (a    `f ݃h;yy @P4/_   6Kn&   f%AѬx9.w9EsE    ` (a    `F]-wqre`    &&A@3XEEw         ` (bm    en.ȡ@@@ER,@@@LCUMho;@P4Ht   vFm(   "AT$X EDG    `W (vb1    `:M==hO V޼M+um}1 @@@@@@@@@ @PA@@@@@@@@ (Z6['Aw3@g3E    ` (b    `.Emhك@P4Zt    6MMo&   #A|l32{;E3E    ` (a    `NI}h{Y @P4+^t   6Kn&   %AѼ|;*s7E3F    ` (a    `nMmhY @P4;b    6IMn&    'A1"k34MÂ-h9@D1,X;1EgGk*    `A-C-@Q[-@@@,GXc$)mj0YC@@@@@PlA@@@R (Z4#A6  h!@@@lE[1@@@,Ce8c9EUb^N67wL@@@@| (-z#A h>@@@@@@@@ER,@@@LCFt` ]hۈE ʳ院Ga0f.A@@@@PM@@@@ (*'A+h@@@lEB,@@@CyWum}10jѳF@    H-         MDbǰ         ` (a         D (6x    NLC 9}0?$@@@@ʳ m    $Aт1[+XE˱H    `S (va    `1-mFA1==ӝ}-+6<<gɱM@@@@J@PiTWVRŋb9~:M--1zEDGHM-:OD5@N^A˚rȽ,^;yG3oֹC.L1-aʮξ&aME U_9Fx]UMUřⵋ_98lLt I_5kv#͞8Eݶ"R*..ciƓ ,9|B%tB 9::P׮m@@@@ (Zu0VKtJ̘AN<͉O>љJXjq2Ẹ4~{J؎)^=^mo$jͧRV?3GVCȿX@ںT]QL^n!M6S/E>&X{h)_)^In]L6&:$PZ^#.Z?]GN!g[wjJ)SА~wXr,iѢkŏ|ѵXEKl]PL޾j**.QMu5APHwk, w[#AP>E_o ]Jv*S 4wO»ٓ)<<} @+!AJ6^a낢|,[F%%塨y6̠|7S?SUa:yD $&[-<M]())W^]N4mX4unvV,ϛ(%Ef!ggYQr IDATF    `I-I: }lrC!( U@P},@ p(*&diҵKkk,j б#yGE"EW .|-\*JV ^}@6X|,YewfuEe<ɴEN]oPB([Aܫ4Fۜ]R-4{GF_&LụUkU,(.[&<^/U ВbgXs =ÂxYu^=E>u%oݪ/dA=OBr㏫oYnb`1lg]aɿd<35ɫMu4",!؎( SU˄ok@;x']$<Ybѐo1Ǵ ORuJe=Jӎ{2؀u$*43TSUyϊbb>-/m3>nhekWN]bea:o~AAߒ* QT~\I^͘oggwPWdVSU%lDRǎQdk] &Ar̙DVvdm߮=[|Fھ(23~@!(1!;|rH   NjE7bYcohj])N|heXl)Y>"d|0p!.Ԉ\`+rr8̙yx.µn WYˆ۔(k)ש"OI[SU&:{QH[C HǞzږ~iA뒇dJ-PT|Y1< Ao,@gPMf[[hS?RRs"/jG `*TZ\_Ɇ1X|JBVXg;v¢wAEƜF{sT9$oXnOmFK* $A+첗Up^C[ce;&ޖ|(МXg)l5f mkt\ )G>mqka>y)9?%[ De8-}-fg /Iέ N.Z$r_0Y[8JEpn6.b(7ªUTWPڰX9ܻtw2Q-8֣tbb;|7P(˕{.Dug%>/›幻XחmGJpY\g(uA.qrb1-}EH7uN8zTtl0{)ʽ89 ٸ 1XO"U_W]ŋ"CmGGH'eCL*>79>Bbt'TEj>E}'$ 쑧tJrѦ."yιGe(:RX[oOQuiI]48 _'kUy pk̏Æ9|M.(6d]N^/_Gths%j RnE}jٯ=}sxZT}I}:5.=s&IMLj@jٲq9ZA@+(jM,XMii;qMS=X(ߎt!9Z,Tw*yTg_NIEP(@#(؅ҍ#zP.mUXyywp9MD,_xf) X(_,qswÞ"c.\dZ#ri[}EX詮]MeeTE5biTS]cJC7$\JU&ỷk%C?ϑsqn>2*1G"N 9W|Ƃ )7YeAdU\,*25h o];|(vwy,<ʈ(Jʽ˲)kbaVC urlŜ3g_*M:KU%%cJu1?W3͍~>)Qw8O?^e~ oyE]<$Gu,g AcN_`9j ,襮"+&@, ]qm"[X*`kDTvvP{]<9W/dDP²ř繹SUqT1uБ+QS+1-j #4DP/ݟ(FC>P4   HE WyT qgvZP4PDM,w6|(j(}zțo&V4ކWl—ܼ""qe99*<]8cݢx._WR,qHy&C$*)oڤ#v~-<2/J"ϳӔ)1?5 ߟRRerk֌'NTÅZ۰H*7%ًT_A>R{~AgR^d QeAeMaTyٸqj%Dx'BnGT)N& ݶHc\1:ckZ[3y%ɣv}@ȿd>3Q5HP֎ՐuqG,fHx oJGgr &U#V9WgwU};צIhĶjܪDPB,ee=8{i~@Ob%"{(?Gp!T_J&Uy} )>@@@@@"`uLիB21-ʢ 5$G'a%׮݃Α3^aaQE3.xIf"pyn.pd3ekS= ܃DS ||Xx䳧{ufd:8KF_regu,ڲpVH)ߊ\4oͱ6. K]3Ix,.zw3c%*$И5v]^l\6~fA"Y|1pM5yTxFznj5*XVdJ'’#MEbӐ_~/Z]x:'bbjjegPUu5Shh397aTnؕx  `reNRιߠa5Xl@_kz 4;RG\њYirIE' Abû$! Ο7i&QA@@@q<@+Wtq yNa]՗2Έ*ɢw(ߤLR>Amȳ0Y]OgRYi1,0cNJ$*UUn[Ln>ME4۹sW)?*+E擧TuƌG72(    P MAlj䕟r)pfNSi>-'B;ΰ>$wXz:@9<|fm%1@@@E;P,@@@LDE}iԲe($K5X<*((ƩN2*T=h   rq@@@@AqsI:y"+}t]C]>*/x{vԺu"ݎ' +4v"W])idWb@@@@G.޽:Й"LZnoUң r3V7VRb5[>޸         `BPd..t=7 m|3ƌ鯳 ĉb'l|x]-ZV~Cwڵ5ySJj~K&[vcz         8v#(w { Jڬ/ʕ nAzNJ/\Jiiu L@@o?N˿T { ?+s-{7{2e[oC.hFAXyX K)--ۨ(?ǎ]ZA'_zYb5zͯĺ>6t,{CPZ@@Pc喑G5֣{; xЮԲe<˵M1R.v۶+7/y9AI>Œ2avvM6 ԐquHK>[*(7@-B23󨠠D~ yxs"oh>zŸ+ty޾bmpw,=9%x"cWuz2 1BK%MCQ܆ ,{6^*<3w3\h~uwQQHusB4]P~1T1y4qhM]f.Avb矿[h7l?u/{AQ׭C!D셟)ImJXP T!š<2bGy0w,yjE11ӖsC=WXeQ֐I{x;\[nE'ެÊ}Sq UOESV 4),*%'Gu➽ghɒbL~?wQ`wVcy@QcbfqM99_OX.(~ᓢ@M]&֟I4gO8V&=z+ѣG +;}Sq>Q `o<տOA{Gi/9bgﲉ}$A@@@lVPJNa6œ"ksO >& 97."y:>/))Y+.$ExO?CO/[+mzEGEb$(jh^6 ʏlƮ]PLL j߾">qSoaj.8X$\MPc9% .1dJEιȹw S\g m6+(reO7՟YbwMKv)"Wϙqa XLPs\t6yD'܂"W}EEЖ-ok,xAVH$Xǟk7y#iΜ'{} B06έ^lEcޭRE>{}c^EÞ?7-7N p}iNK!\ @@@yeX1MeY%"<4牱cШ}{{r~0-lH<3uygz'^ɶbfQeד/zZ<^+Ԍۍ• B|C9d.;z;v5}r2!Tˋ4X(-wVbIhf@.A@@@bWPБOg?JLy! .ҢEN_jAXR<jm{eeTPĽûӤI*-8qY pjvU=Bw֬)FOطN 9r7ki2<1FeȞw3jyu.]=9S(<<@xJ[(5k EGС]ub AQ:Iɦ]UTڶ(ه"#k=uYl~Oj6Y+w3wZl_0@.T}t005 ܶpZqDҥ:?qyywp9M<._N.G @NP̣_1erttwޞ$_HvZ˂T((XXaUqX8PW3&(rJr3J- Xpʁ&>)ȅOa,ƞ~ȶc"m={В%gy _,`TMyR5~Qt ߓ|J Ϗ+ O#?{\,W}2 Xyb!_L%%|>p@@@ Xȴh="X{kƒsȍCL_|qpc<@U?HJ'D/߈nAz"edȂe7Mn!AD. Go14erss;MIP8M6RO#B.?b"yBx>yf;αW֭SyCP4Mh vCEy;'EMpE*E{ׯvc<>~sQQh   VH*ņpP#;1\(+qRt%|}(EѐvbcNN!: =8IM}fAњ3cjj"Bs[3G @@@z ؍h-?3 Ε[    %A@@@d9555;C7nM{4&@@@@6@P}2:˅ ҁqv\ fk (940DF@-vr Kф@@@@E P2#/NL{vnp'O%P^n,FYf FunZf'999ُSDxѻ̗RqqK3onАulcjjjymVK#4~ezΏ:1I6 r%C-C靷'Yf GY:ڷP7wr>/B,уwo+nKPRiI=~@e;vG.PzḞڵ:-g{=XS    `֯KVo7:.[̙jKHH k}B𓬡c@}tW^Z3s u}Y)m/\Jii݂^QSΝJuiSosRq(m}ϡ|O÷?|՗/AA^|au!%B8E`uZAw `E:3iͯĬ'M+$<ť{﹁BD_?R gcIb`XX ڕG LZۻto*!&^%T V (3bg)*uΌ4q T.=J]9II]3 gZU~0BFX@QEآE}ԱDT C/;@Qg7Dzoqi^q}i ktTV$G?ltyQE@} (kŲޏ  P,kbfyobnBg%oB.}3  AP-=:L:wnϗ2P͒ڵCN쏖ɷ߮zk.cOLޟyg[h@J:E}a -G?u*IjԨjSps6)mj?dgɞ=GͲ(ԷtLBG<]A|(  xvCf٥'4ibnҶMciݺ J?V-`d_r u@ʩb98 \jǎ˛xSf\,?qgQsFg03Դ8rP'(_@Q1w r6\ٸiwR_j<剟CW~@q]7ʀ,-PzHm#R׿TD3bDR͛R|YүK) +@cK@@R CcsҫW[;B% ާ3z_,wuu#fMx6i۶YldxX.Nޚ<ߵ,^=G`P8;?p)o~@qԨA{]f@[g||Vbb\En/wp]buU7b@S@W@ǖ! (ս/|OM(m 猳`w9gE)aVVh(@QOL= vmei ?d,Y 2'vJ>3w <6b!~^Ig8k7vL{9 %+;G-Zm6KswubRﰤ}__] ?o,Wgej?^=[£ ~>t@(]gɣN7~ AٲeLݷOJ*8tͿ*}S!9ӡ&|N>xy~Q^wGIocf<.EsVd:,Β~?zÏLŧΜ9/+=7֛]K(jCt.wrțdydTSW ,s)((, -=C@J%p.-_bpsoֽoylǎM8K==Ok.uLt%k_cf,y Rx}TeNzeC-6[v>b>8>-;sӽypLީ΢hLNJo5cO[ p]3Q\sM;3vRbP=f k8kRiܨ a~},zw-xޗ]׼w @?c  P3f,?nqY ճw_SpߛXVljPҠ~ 9|++ezիwȴy]ԯ_C23%!!фZ4T(Bu¯3,x[ke;eC ?|ks{ZeZ&O/kƙG4-:?c}^}P?;oUuͻo1W/*=P~a܇1N@@M@V~&zY텸p*| :E]_}Z[ a<ԝƛL[G VY;uV;~Y7I]i;gZ*72'[;%CG 7fADiyҽ{{ժfOE-:CFV(GXTq?Ź{}z eGL>kyZ-ܷ E U@? P  E 2cN.?%uƘYh s)5mZȥyҥMheꔇm<Խ\aI-40ՓSS%:Ԯ]uLI} '@cJ@@"_p{xQ:ѥ׏>6.RS# E>@@v=*.hK]/Kbc܉ '@pCN@@k֜S-=955[o)w1\J.t @qӯ{dأn*]B= Z|Z+⥶  @y(7bbbY'זVW4j||\sAݥ{7{fgKºurd=kPDmuOx:eGԨ![-[zmSѣrj&I=qBBårFRgO:}zhKb\%$HnNDHtօ޵ǭ*;6 aȒHffݾg<9w.U:rrZݻ$)>^2\[|K;yRՓmHҮ]f44"˜UBB=u@x QS/#6B@ʑ\lq@V!xvz%^eM ؞yN QO>|Xffz|VLR\r`bрSڢ48l[ȑ/tKj$#1^0PԠ_˹}/;OK==gYo7n2;? UI?nBɸY5cBD]¬'1￯6FPxޓL VMbキЫ\.3wiBZgQ+SY^q @9 P,ǃG@@K(PbRRXU@و:ӭ{VҦM# -/'s3z\+tʶy3M2l:tO^_1nlS,D}{p!]k֔m/vuy^әxǏwΛu}_`Zd!aJjlܸDŽ,zH.ճ I^FLIIwթZ5ʄzJsdd6Z}+5{=PҬ4|\) 7?P~V.ܤ  < @(@:3n7Lt.SҹT\X%_/Ykѓ+U|VJQ 7Htv>ߣ&~Z.s{Bv}RIS Ƙv t)=Iʑ#>ۤ<o'̙ΐOD M5|zoEsQ^⾤S_u2rҹY~[+,G"j6uBcubW0W_ZپO<1\ @өB!Cr =,eS*@@@@(@Q%;.?!kHum)͚Tn+_ ʄJtte\5fҼ;SIz1>FOlT>hN.䤧˶3L-ZHAUuE-mnjp֬'IcsoΝ7@Q&J4S;?Bn;຤{+}g9{Z\.>߬a]h;qҿͿo(EO/ z(KR@ }~T@@M1-Addh&  pYl(:{)71B49Yyw;~Ft&}gE֭+͆ 1x>z7@r9}YO(ҴoY؜]Aiv&%K̿k\yԻZY;G{{/n1x6|<'׮58Orٳ4jX˜ܪUCsMirܱ󠙵xpBٟKmfsK@Q~0Kr@ J~ 58] KϽ AS0 @Ew#GNIpt|?/Ywϙ#'N (s"vEm+ nSԣG?#lŢީ0&:df=mt>KC7 #$ʕMhi_q[z9eN2ǹM6ai UWb9%d7Ò{@( ŲP  m8e}!O>1r@g!w ݼWicnj*Yj@ҍTB@2 P,3z^ Z_vV<#P+YTXr -SQ@\&$6M!  6( hB1EU@@@@6jcg\ӥFܧҟN_@@@@ PƱIDATѤ/  Ep8[إ<(!11uȒ'Ϛ.ԭc̱R.绬:  ]2@e'⋕,/W7ƧZRR< IM͐=ZqC|ޣ.,5J  Mm24@E56KYzʤg?\=f}M{\wYj@@(`h  `G ecҫW[;VK|[Iٍ/8J֍y|P@Mf  vkNii̟fʙ3e̘[^m-}&KW_y~]:A%@@xx=  `W;j& I!jUxPdgH5,-*" e$@XF@ĘJNE{h   P8<@@@@ P a    \ŋS@@@@ŀf: _ +an *܁  ~;t @(Oy.]@@%>@@|  PBq  >@(bܸ @{Eb: H@Dl܄ 1=D@J"@X5A@@ )5jdH." X P*E=@@@@E>@@@@,@h     @7  Q =a~B@@"  GNy@@$@w  @7  `Y@2@@`b`7E@ (Z  `6t@(@hj  @ (ڈ_@@5'j! 'kU!8N@@ (u     eETTD@@@@E@@@@,@h  @` $X)=k-  P"_  GNy@@$@w  @7  `Y@2@@`b`7E@ (Z  `6t@(@hj  @ (ڈ_@@5'j! '0}p}  :@@@@@e**"    "    X PLEE@@ SrLEV-  @|   8@@@PFYH ~@@|   ŔD8rA@@ "  @1=-  |  >33A>+R@@ XMo@@AَdaٳU2! !vhpP`t^"  (Jne      e8r#    @A!oU2ϋH      '$y%g@@ §  Х!Pԟr3%(;-@@ P # ".3?i,A@X@1# F H]3( W9o@\{z ȅXN$@$@$@L存ZPLNF$@$@$@$((:IHHH<F~EY 3a PP"    2{*Z. s:!        "")y5,\%$@$@$@$@$@$@$@$@$@v )b̕B$@$@$@$@$@$@$@$@$>+A%1N$%HHHHHHHHHH>W ). qD$@$@$@$@HRr#    0p⒔@$$@$@$@$@$`AU HHHHlpuJ Ý8HHHH PP    -(]NI!     @A HHHHxj" @*(HHHH((r &@A0*6$   "r+N9Y   0H 1b6#   p-s$@$@$@$@$@$@$@$@$I((fHvC$@$@$@$@$@$@$@$@@3eΑHHHHHHHH2LnHHHHA#pVW>mj @PP/#    PPto#    s~$@$@$@$ q]$@$@$@$`s$@$@$@$ aM$@$@$@$@$@$@$@$@$((:{IHHHHHHHH!ƛHHHHHHHHH9 PPtY @RTw7t۲ <3%   {"*IHHHiPPtW͉ xoؚHHHEgyӜ' # IHHHIׂb܉r Wx($X)U)S$SRD:))WR<<>@r߯FG#HH&<ϻ|9V;'{4'~~=^/(ŊtH) b9{$Jk0渘sܼxQn_....P!)X__}vr5N*W*+ zIx9p F * +v`~@lkݺTT&U_?N_*AҬYMU7l9v쬴iSOz=coK~oCjH=G$YٳSB/ec?")))R+i~֮/T_= 44dyi>IzU].,%jזBUꇍHHr,('Hdq' '%6=t̪7ᇿRjyiҸzo);vB[Eleرϧ9ə3Sҭk\7t5񧵪7% w]=7 @:NP:蕬ڏ8hܸqK5 ;zɿQO\IPDd U::>]=7 @:NP<w@8,Xx,).hIJHP.,{gAXNj'>5hܸϴgzGIPLJJٳ+V:5raYp R\,xHrJPo%JZ΍,㈠%9!Ay$zGѢ{ދb5jHͳdNHHyL I.M$&漼Lqw#f "+cg9+R^ԪU\#?P{O'Ț/aq$@$@/ء"!!^Ё~ΩA{+Q$l]2}R\y OD}۴+zi9!HH o+WdK~)_s( ;w*Ô۷ųT))ע4BT+V>?,EVU_Ct _qVoSy`Q9}}KHӦ5$6FYϞ7Zf"Ih9|$$$J AX-\ˑgya7_R_<^W# %jipmb/vs(ժUR Um #ԗWd}9zyyHC0cܺuѣgׯԩ0pusNf(&߆ %r℅+9*DDDK`&ӳ[eC➴ ?tTMyK{ӧ] I&MñK9U 7)Axs  șKu[~_OPWޮw)~z+͛הڏa, `ç^{ Ңy-ݽxl */7y@~D\!s(qj}4s(&IHmkժb7w3v)Q d#r+!Q}ҥ1bmN}B6 )R,c iR {_O:exzK5s&$@$@@o"ƍsؾ]}iE2egaJI P+D#$fIбh>p4͛G T\qMQBveDPļY)c[=\GzncܹGÄ *\Go*ʢyY?0,zըQIF^ղ|Ex( 4l'㹤w[(Ϟ?qN6n}&U3='`#AJ*kMP,o3(*?yhpCCMv'O]@Oð`~݆! 8 j"Iϝd~ cgeDP\f̙>9)Gn!a\Ob^On޼%AֆC'-beZEY|k?~N~>jeK|5TZ{T]j7Y37nː_*JAtJZ7v$@$@$RPt)V6mm~wO֭&(3WW)Q֜xRN)Ӹ!FG~]b6Ʉ uΆBȧ\qu'n6GۉIl Rm>b*zv\^T֭]:W l3Ye;wYp[7@5nn ߯Ee;g(hի6H䏍jd̈ߨ0xDa˗l fx[/AJ*+=,[E }f8)|O[\GNAڋ~Kq۶]hEtfa]Eҥ؇`9XA2l"~͚֐r>%~ ?[!wiwws2G~h>}I_m3Uy{@yFEX?\<8r#E4,AA]2Bq7/yHϺ#g  K  Q/.`3B"b'ҥ35K$_"ثW<.&FjpJYVB&UwG˅ WA[Ibm>$Lf(ӛ^P׾}%; ό鯪9 B6lހ)a$i(>"4C:+H3%(QaFElsOvm*;-D3ԆhQol M<QAQ?_/ ]J(0sTgFظ*U,DDx2jz٦ Oªx;} *^m,e'ׯLah[e۶r]V"`ԩSE Jwl@$@$prudN~?uz?_vHy(>ӳeY?3; uƂ 'Uؘ1}r2B{xX4b\yRڵ5yKbi/MVclAB)P˟K7/&- EJmϪџVaS&nNjG׼w6$@$@$(i|)^U[n D5QTzq g6ls[bްZߨHyxjUj (52 _?P^|nZH=Sf\.e^4Pki D{PJb~zٽ]6m*kղhw`y/SF*wfx 3\9g%enM{7Cߵv9;ܐ‚mIH'EGz?r$~?oԨ  bd݂}uB4DVPN\WUǍj߈z\i77',E}=M=dp'i0$Os  qtz(^~(<wfF9xɓ1>-[JjwE:uQiBм+1g{mMlq_֩Q~n' B۵pGE- iZ0-E﹨݃!ãLQ;JrNlyݯghkvH=|jTy\.eDPıT?ǏM"g*5-۲eK^*L^&nկE7iDž}U>W_* vۦ\80Т<yHU;IuK8Eb\gڇ룣cH|C Cr;T-lHjt&)*Ey?c8̮gi/Aq r+;sk{9}fsZ:ЈNl/"G˯قvo/>} Mf'E8ž._373<APHHy ,]E%{8u` 3xA)X`.]$cٽüyQVm[L'իE'^PΜnq8KN ځ6>dVx;|+(WRyoL;kժIH@G%Z&DxԪie騠x|D~<&YT "GUEP2m۽Jr/W_{^Veڴ?գ~U8=|Re(N~"3Ts}9q4ۻ|2T#E<[ۘ zCҁeDPD h/ب[˥˱kz*H.wsA:z4ô׷#b .\¡amH &~>劫\B!~iVNos   dơdZFj!n>/*4A*7^4p 1l2W~x)JWPn/rf;rēj38$u5)E5lؗ~=>pg 6X& ͡/k9DIpA4n)Sފ]^'b΋u񒕫*OsuDPNl 7IA o5K_xL<==TNTb,EVi|Ț9%  \H zfHx#/VP]vDP3Gb>ը!7WMPt%(אa9Y:*(? BK-(.\T!/VrhAq meA#iJ?B{cbΛւ"6:krA0N_Y)(nܸOL5CZ қ#k'F$@$W59TMzU u糛7 s͓G bըXV-)TyQvT:wj$DQ!/3D#1{f+kBbJ47U4J(m?u+Qf\r] y^:i tCݻoM D~jfO?С-F6gX+Vyw% /NR1}T%J-\(? APM{+gϪB+0Uʆq"-Ι d7TG2 ɀ3kHuZӻjeYW{Tv|&(hmSP\j4 Lkm'FOSM c 搡_*AQ2xPGc]Y1NI$@$@kA3s @ PRTalr%+U,n>I#<8F^IGdSͶ@|m"66Y=GGq %VjhHH9*A;g 1˪h [cb.(b҆ ˩S쟵'b A[1\!sTݢP"RHHH Ǘ+yo:tJN[l3/Ss$@$@$@$`E#؆HHHE'|2  @A$6!   g$@A:L$@$@$@>#    $@A)_;'M$@$@$@."6    $@A9;gM$@$@$@!~N$@$@$@NJxNHHH!@AKHHHHHHHHH0 Q! E         ((Fņ$@$@$@$@$@$@$@$@$@HHHHl|=I]/ߍHHHHHL" M̅A$@$@$@$`E      \$@$@$@$@ PP4 IHHHCѹ7gK$@$@$@F PP4JHHHHPPt A b3   p6s$@$@$@$`Ec؊HHH@Rr͝&   O"W a bC          \$@$@$@$@$@$@$@$@$@ PP4 IHHH\&\չ&ْ I" M̅A$@$@$@$`E      \$@$@$@$@ PP4 IHHHCѹ7gK$@$@$@F PP4JHHHHPPt A b3   p6s$@$@$@$`Ec؊HHH@5y\n0 }:HHHHHHHHH h PP         0LaTlH$@$@$@Ed5\k- @((r $*\$@$@$@$@PP    5@$@$@$@$`EèؐHHH=}s$@$@$@$`E۲w1նfJb˗cO||JꟍHHHcٱc$~/N ׯKXтa @6:.^$0WpI)A~ׁ^MPnKh@y}hցg$@$@$n&<{*Cf#}1a+Wa_ʵk77{a_%իUQgAƍ[Ҩa )U_&*7Go~9Cʊ)(fUI$@$@& S~0?!ҥĜߘ)ydxgn/;vKv5ZszE z{ehmf  pf84 AF浤o߶!/v(qssq=G䙞 F8+R^ԪUo    PPt 2Qno?#>tY`ԬQIFxҁSP\~sJJ|O*P[&| ~K$:up)Pv.>cT\VƼ[RRD7Ey)[=gؙ $@$@$@=FPr%NKI`fFIBU\ܵKn;' wR24T\\D8)G@)\(wY3pӿ맟j!nzvCӰ`ȗPz(~mri9sA($U*mLj9ܼyK8$;wsHl )S0,Dʕ+nSDDz'GQauK"̡eK A6wQٵb k,C`#r)WR}4LJڼ⯭y\%$z ,{-sA6o֭qg1񧵪v YEsZQAIr5+!!!G:wH5R?ȵÇ]R%%fyHnij5S / Âv*ـHH '(iԂK7T3R̗=?8%@5-v׬.s殴9V'Fn!A<|v<~:؇dǴ'N[˴,9~ԫe>j?&jnU?CGxԬPkG)!  +E1o"0(c<[3 )*EʥH=jo6O?S՘5T4h$ExdDlV]Km_A<[Um P:ZO/(:U(O*q8L_B&M(LwLy>uQ/X ! `BߵkץEڪrbJ}Fuþ{ p۶2ዟgU֭DA"okfKPQޜUjFEOZX_[v:.cs To#F~#g^Vvm4ռp==A߸)읪ʇw|vS>N V$7N۷ W} 歖wi)Xg!  MUp/շI3'fKx#տlW!kWQp&(boF~h_XeAN>Q=t㍥po1uU }<,MPDfMk">DSiXڃX?4PN$6'ȁQPLos  Z9.(³n=c! oD$#aHqsIA<<m:%~I]СIIw1ٲe9mൈpҦM+>._ORj?Hy(fFe@Vpyj"joΝȡCT^QZUB7D3uk_ghB^tc v3j)Fz/=zA"ڵy65' J :uQT}L*?- YKD)ST(t`m:U9,A|Y6=# x6"  ;rxUyjWzԯȆ {sFҵKSu8 2 IDAT Y3Gw5A$!`N4-0[i\~!_/_M !BD"D`}b ߟ邢|-:[}'Xpy)(Z2lD$@$@YF ET],<ҥH*9=1G _۶ 킠"ŪUrR놨4k:{Gۇ*<ys{\5q#^Uƒ=٭ FqGGENJN&c u츅ERp4y}'u?9LAI>a%JVcBރ0k{կ+_cA~ajI R3MP%!j-\Xzޗ-KNID&A#=ja>~@$@$@FfAĉsƛ4aڼO@Q5"<~Ŕ"Qia=נA]3GAQ+2gx\Zϧ~G.IyDqNv8‰yej3CVMеFX>mÖ*}$@$@$9r\P49#6E*aDo\T\Vlł+JwOk>4AމR4_|.TEn?͛(fjJ~6OAy[`?CGE^a֥Kv!ZuχkN`=pӦH^?Sok3LiHS_RM5G%K6ʢUkzZjcӧ۷4i\B BK:'x[N VI;6xH0 RG$@$@C WTPd& J bxsWɤQyV4E%-$ǫ*0@ r@Ax3BE5CHm [9>C yw`:*d'1XN_UoAqi! a%Fl_Ux\~:2%G!EFWJZU,MTS唠mQ/YdW4OUe!U~ TL9 (W .R}qo[D/`'+q!z"M1HHHY ~(R l͚*#)\UOGgՕW KGE}tǤ^PW9Kҫee'^P^$a3g*y[< EYP%'E-#,MRP4J؆HH@<~ FRI3Wyvqjk^S.|D?SOgɒdEժ ϷdSn-/rB†m+3A6r#9-AUP}1S|8Z>ܗSYMy?xYPy[£;aEqRrw\ ܨڬ7GDD}{n(uѠ[W9&/ВK Sk)W\6 `TU3c-  hNǮyQE8$|n6MGE}^@[y N@lݺpbܫ筷g. (9)(NlV.CБa3mٲ#  p@`s,J1 fIzU.mq/P@Ui` JiEh0BM#LCm䨠q>2we TNGh`Tkٲ٫5CE0 "ղ|)?-!?vy֛H2E")(:,=AQ~\S^³uNRx! ?PAn-jbOO x)IIr`tI*]S =  }LYч׷l.^&/4Efd*48rexiʺ C\A.ݬkZH6APNlܷt:E|E`Exړ&&8x夠72ƬZcrkiuZHH#E\;G^)~'Y/(Eb\*+RɣK"e޻7v;JjS$Eof"?nBU4%晜,g\VC;K؝ Gfp"Dյ! B|!TspLHHT^tzrUIlMsP]^a?矛lnle}zc5uuuUϽAQVR2TwT^G>gzAQuq H뒒lhժki?qN| Io HH#dOf9|/~#E $J+٢yMPt,Z^aߟ8j  ((w:@`p~jw+?;uBA1S0  ,&p? Yg#}Ak= HHHr}-(_Ln]*(`Q$(((ɹlܰO˥˱C3] sb#"ʁ*_"3IHz#I5+ܾFxM8rl%+WM|}K 6j9a/$@$@$@"p_ 9o&        go         %@A1 =I U=PלAP=tHg vqM|V5Q#I~/c% d¢mJRĬ^a;&WիQ "yHZ%_^IHH PP1|0 jZPLNNQƍJXoW_DӦIR|{{+a)"Uw")%a`UD5L,"}sf!(>ھts{|X>Ry䯿LlY˖wvW,U<O`Q#5AMʈT֨QIF.9#mÿqv}{iڴFϿ~,_zPDz9~l ̿J9ygKc#><.UĢmҭ[oԵ Iի*$mژϙZ:V5__SM &sXHHHH ȕKisDl; o'iynݚ+jj"BCţhQ)Gz1豳OT5fW4h$Ex|3QOHhuƍ[b]+qu ʧni!(:<Қ4.{ݩrBxs箔kKU%8OJ,",߆a^=ZJ˯LIѢҮ]*szßPazE\'#B[TX7<a7n˞=&&m٢TZ|]ųF&׮]-jK X1oߗlx>ޭ}A|O3 !4/_9{ExFFl;(D)OC۴c-{)SsWt~mS5 CJݲ,0o^y lZbm,% Â3;UmHHH ; \3Êp1Y$@$@$@$@@!{Ty#>sL BoC ;wVaΚ^XNPBcՁ^Dy {(qJe)Ū!SyimRRoS}ep~T^_7nv̘>RR8.\B=lK/+oD>j7Yj_YjW> JA82K%zvT:w]^%*otIJH KP[?9cgP4lly $@$@$@$@$@$@$@$r\Pz]GPB0: b Br͂smfsj*"ZPD_!ߝڡB4*R7lXC0}g0i-^і!P ՞9&hjK]Ӈ#azC_.V4/\I77H6Mje_qAW_*V̷EG:~S|1\v]""ֈޕ/,ŊLoHHHHHHH@ %6lh\w\T\֦ +V ; N p>|Z6Oc/0G@C&v5)S;"(a(2p@)Swݚ5e~ւ6&2ٱt{ .AqH<75Vב.]<}1YXvQ/BTD;aSaȑ労>QaJgzAѧeK)ZEӸ9ݺI2wseZBmsؽ6Ԯ-3CHHR`Q     [r [mAٴ)ҢG>wS_Uc{jigK| =507O3x!^:Un˶Hl UXܡCmŊ*y)૪9׮%g,UOJ,sRaE=*< xTUg&*7G)OY=GOWC!† $ Xtxzezu͖(挊(Z IDAT\^BkիdZ}mtwqsu;/X^=)Ȳxͥ{%fju?|"';zV·W^@=1OM d *ŽY9;x$@$@$@$pU "=X#uʳT8P\ga#"zJx y7"_SıcT6Gŕ+#dܕo~IL0xۡ4!Ìh@x7_l1̌ O6wV[ ?'پMAyA|7zXtSk-AQX5kz ҵKsSc-?>*J $PCD:((, m+ *"d]TJdzo NÝ$42k_&37sc~K˝G^=P !C6嗒o)ƢEY}1c߰۱fǎ$*2<7@Ss! #ുEZ݄:^((0KکSu4<^*IСpVȈ09T ݲBnL9,}fA# ݵ6% /~bׯ_WJZZLl5{}?oAbbۜ<$h=+ ?uP7JZ&_"_+^k 8}t ]*|2MV6}<(ZhMͨ={H&ud kJ mi,dѦqqRW/G$۷7!Vp:z> &@mw  !I:֔]@R!4TғL1m* 8x\2v휣 H.iҤ̞D:_.mDF 5{ɷ#tuMf ݍPԠQ!Ԧkj |8c[.jhF8B- !mdd|m5-3wժPVRk0kAӔezIҠ~ gu$e]K{,5Pϝ3:rb*IRs|O \dŋ @@@^Y馞PXC\I" PemFYᆱ\sM[زe<4_5!}^gF[ƛ3E}ۛn5N?Ѿ|0)ۺ{6 o\X+P)w/ÇQ-ϚHvN~I}j_9Q}Skd{~eZ3Zo rOS[Vo<f$gQLڞ=@*٦v\{XВ%fdt&*AE" P*I@@(bTsՒ,{JPdY3כ*U*IzM_rD!Uw^OzM:bNjf$eAX ̞O+7#2'MYVBggn+=:f+4cܑ#Rvm \9C> ^+=CXkoC@JEL"IKM}d"tWZvovG$:ӓ.Pd?A@@@|U@WGKzҵk err̙L.`S$LIMI7eBB<>Tl   eD@Ȳ|C5iܵ>}:m*'P,5zN   $Ӂb9zTkF"JӖV^f{DΜ9kL5%]T.ͦXϘaE(Rws#UB9   tt@z<{-  @( ;'E@_@=D@JC@49'  e!P<$%&fͼR=i9EEIHtWN! vE@@(ja;wJ` oLb *7l(僂ko]~k~n5| 7M"gHDlY x! 7GW*UHwuKVf48PBk@qr6۷N $@OwkE@ eX>{]Mw̜)I{JT˖ӣ=tH>LʕV#F8:#N&)ǎIXݺ覛. ,  ~}x@@7O(K~$~}9rd ^]voVz >"@#7n" ,ٽdիmۚu_/Z%0"B"6ݮ]5Ol$ѣ.Q-ZQ-+#CN!'n'̱+HpjRqcҴiC=h=xP''K BhXӾ5kt,G׬1dΟ5NDƤ\`TiiݺI`kE.:\GjbbF.rD$K? @ʾbٿ\!  ,p^LGu #EEVC٥ˉs01bk5S-=9Y6Obrt"n^NoYbhZraGPhmdjkǍ3!^~;n[vy9N\nޟ䵕s}@(b@P,,94+ ӻv͛ͩuDpիZDDmipg_CQ_)U[4OaB9ݶŃVK3GN&$HxzVGEV>a$c6޾ՉcYrf.=+P꨾c֙ٮ@귎PGaj@MGbֺrǹNl-uM=mIiU7 s]ڇM￟Z _+gp@428' #@X:@zo~$3W+4 s@1$:Z~Զm{{^79C}=#%i fz֬8ɓ%=)I"#ٝw}f R0וwrrsnj[N56E bQr @@l xcvljp3bnf@Ke:-yX1W_mSZT-^n3zRCA =iVk: ˞~0Ӵuap{y'f I@V}>j#Pn  eC@lG@(vo uX}f 5:b!R1<}k_S-y>S=:qHOwfho{^N15[G0g ݎv}@1n]itMNdzF_jpV@e:=z8uAGl (= @@HI2 uKgϚ$Vx!-4 Vͼ#53?f⑕+ouB{d}-q\9uy?@Ѯr::ҰK@b cbLqZak[oIFZݰ_?ßIL_}e^#P,Ό  P@@PV ñ~;"NP@В%2H ogO¼fKPTcӢۿRt](<8W^W_L=dBQk9s'bhvB@w}s@@v̜)I{J֭UWك%\_0;d7[]NfDafz+Y>BQFN uliPkљʙzέ-{$r:G@/ P@@@o Pƻ]}7[.hM%A@ P,nQ 2r#2(KfjDj%j2G\p`p@@ OE@@Ty@@p'@s  @3  Tl #~s  J  g~vù\@@CE @7E\/  gNl s+k@@r P@@@@@=bC@@@@ P@@@@@=bC@@22/_" )@  V*<  y.@@y@@< P @@`o@T@S)C@L@n8 x(@!! &@owE@< P̉@@8a9Ryv.@@ wE@@@@X@c*6D@@@@E@@@@X@c*6D@@@@E@@Ty@@p'@s  @3  Tl #~s  J  g~vù\@@CE @7E\/  gNl r.@H@#&6B@O@9W x"@  ~(@7KF@< PM@@ Pǻ5#  (o  _ (m@@|%b@@?s  @~ >  ~zl@@ E@@@@X@c*6D@@@@E@@@@X@c*6D@@@@E@@'3둕#  C@@@Uy0@@ (\  (  x,@1" %E\-  Rl p.@P@C(6C@M@8׋ x&@[! ~'e|v.@@ wE@@@@X@c*6D@@@@E@@@@X@c*6D@KLsCׅs  y (  3  ;E @@E@@=bC@@_E@< PT@@? P"  (zf  (z@@=sb+@@gkw# .@Ӂ     (zLņ     @3     (zLņ   $f Tο.E@S@@@Uy0@@ (\  (  x,@1" %E\-  R>]V$33Kի.>vt@J[@t@JJ$& mS:  @^x\M."+С 2tX3C8͉/kF ΞR? d}$ԾC@|_[.;wzu:y%~9)]4֭V'ȫ0Nυ:74o*ٺm_]xCw @@XkөSX!˗Oׇ{./LKͤuk@ΥeWy ,*篖SRje=>C }[I] Nj(sXdӿB5^ϧaî<{i&2j-n33Y~\٭{u?  P,]YLSݷoW^=D{ϐ1[^.e#!a,Zq\ Z4fuϡrW=KdrP0bpͷKLwuT.(k )7|uݯjSY%W\}GeΜ%g({sDD;o;>rRVn~n.VF5-umV ٵk y@ /@Xx۳8ˁK:P.++K?楛nLw"@Q]^~e$'H d-\  P_X><{¤v} IDAT#%,,8_cWXxp(ڻ# uġ}GkC(zp#@R@$`5Yl-3gJ&P[V>,$~}ޱ0EGpٵtL"T*%O[@̙+skIxxU+̷ڢ"åIҹKs]'N$ܹߘk)ښ4#M8^i3_9- f_ۖ{eu|e-HGצ#~ilq@=*բHƵw/Hzyi޼ 9}q{l'_\ V%KԠA\޽Geҳg1 %)QE?g <]]@q΃zu9*^~8w2ٖO;-~;usʼeѵ<, n0?wZ*;ݴii߾Y?< gX`g+=kR:Z@دkeEGFqxԭ-͛70Z.BBGIGӧԫ[]>IضO4i+ C@G:Pԅ7n-mD]A:u3yG2RRbx ][Pd48PfW8^xnnLt/q\9ۧ / k/#,ٽ+[7Z^x~=~RŊdO]A64P|ikڄu^y/%)\uğ̈́VFhn\F:tzRB PRҳUWJ@(E м%P}v藀#\/SoY3~ɗUˆSݮ x(\/0Lbb?XM|4864z@G0kA?r~5q  4 @.xe*+Vn`f0cT(Fǎ%7m3zw>$3f*gla<55극 (jtfs i7?(.YYOlܶnPT ɂ_Jy{,gϦ7>{_עEv!K+'Odouas>żuĠ}mI C~ Ҍ`<|2}YIb|`6C. c˙:>":rcsihfٴ9m:xpzaԀ}é?vQh~7QQ#9{Yʼz5?'%$wKzW7!x7UytF4~[|G]Lآ?> q-@f/ ֚%ZF+&CU;o&] /;/u6f2fJq6O+:A 7ckV_y k͚QƍwWݼG l/iHZj(~M 7tsgSǟg=uq @a&Py߰ˌF:zurK{ذ_?3j;_Iڳ-x1JQ߳,[TQVFG-h^6P*#3%X?/G5@Ԣ' K6>>Ѻ~pR~LM郧5b;zȵ/L>{6ՄCА i߾Y<7njޭU3J|dZF*]Z/Ȟ.7k+TDZ5`m&}!]o U BtՉF6/Jh?U%[^9g)9,͗:u $]FG.jә7:(Zq Ⱥg[7e,>{ś_rL`:5=Nԡ4hpaJu^wgMCt#w(^N^?q /u{qw>.vϨm6@].Km=\̎.jŰ=PFNkl|aNڬQz3zOB13ߪe |p6Mb T49IK;/k4ӫoF[&ud  tl (*o w*a?x|zO6uO(7]<.nk@_{uBzES?Q~h]Gc5lh  -PꁢV=g~Ԭ):43Ӝ X@1"6V㞮@1+Kl)ul<]7LMKkwʲe[*\LM;x{:]@Q>N_Z׬U9K)+ |jS?X~`wm:m:=t2erݽd'F'j סCaX^~0H?j1moLtܚ(V ^X~irFDH]efe֭{4脄ښ5;n^ǝ@XE{1:\33rϟѪφ5>B@8? / xEhi-ًTU4j5f f!۝3RRDצE(6]sGެ7#:uvmHH)(@юh.h^KIU>Vv}[ig{'f^">b]'}ji0ʹ'0:z-9*- u 'z^~%{}PyйS\]ŀrՈ9ے*`^cZz{dvlmzz΢1-  fް]iv+VA~MgfuvMddX~Ez*}ٵKsy衾m_=]z@H@()ϹߴnܔM7v6469<HrmX!~$zuY2Af}x-[7ԫ[kĉ$ytxcl7P^%7\߹D (Z`SyϺƍk;4wAE gdfƍ&Lת#:V%t @ϼ(kԓ'eGݫw 5t1Yөԩ&]4& ֵP47z w.+JttDcOceG̜'|%Kl6ZZ7xEbDl @^5B]Ou䘎pQ+B[Rt[GSqlYN].y&CC[`49Trkzv@Qګڍmrzy:lW?1w?Hz͈)&}m0Q;ID A6@@ZE h{aRntV]bOz\?Z =@z =׸_=.V9>sM3 }헏/juFA׈]̙泋͛|c~ ٟ-sl6c߬fF֭9>w_[g7՝/$:sET)5Fs,@@~W;*ARi@Q (_^DzR)Ƣ~>RqKVfVw y)""Lƽ=U?(zbcs 4ҦA=D{j@ѵY M/Z4zt}!cUAxj`AiԨZ3Jѷ[Qe͹$0,Lғ%+3>Gh!1W_m~Ή{@3?OU,n5kٕx۷#Zb~/eǗ~>6 w*8(|氶kzjEu4tG5+Tk\Q5e9hdREVqesRRr<;rYs(L~1DZ>N8ҼŢ]Gw ]oÇEoZM׋U4{U=iVX֬)'nuڭZ6R[7O6 ~&UZD_br5/-+1kl|QWz. 9>Y<'ϋ:]w4#6@9R hrיcX_?9 e"PFW鈫{%(2ҬH\@3gϦHTTeQ#BBC=?@Rבܻ2#KN=gϓnuz뭰q#钔hTKC@4=< 3+/{]77Tc&5GG/>[c, CN̈jժ@@TX|, 3 INN-Ȁ[_lܺ@!xMt41 _z3E@@l(UNK׵1*H*$P􃇃KDJHEw~MnZ4@@ P,W(zͭ# Rst@ȃSDJDm+mfD3GFʢ沪nY\  PX {     P,{!    ~y۹ v.BWo7}hܸ2@@@(b gU9c0xU<MNtXu';ǗInxFF43IK;/;4>uEG*sR@@ Z)s|V9~xSxϐ1_/_޲W/,[UvyQ7KP@2*@XFo, Q@1SVJXDGoߝ@1eee˯̐i٢ ou@EcW@@ Lxd,]Eׯ!bc-9h9#U4ڵra&K%\9ۺmuH:vl&U*m+PYvmѹTto̙s+s;,ݹ?n}\7kؠ@iղVثg;lݺ~ny?%%MVJK6˩SJKHh?2S;q]|#wr+JVfded8mSBi<`DG50k]:˥mKpp, @tKן# *rXMΟHȀݤ~ /RcG 6ə]ˑqqRW/݇dƌ_L9`5N$*2$EM0}i֬tԮ]͌\j,\Aٳ)~}j7+H kxM |;^]^y scvfT_ȬߨAbV&鲎Β.}k8wdR0jpzHNm/흷?=ٷ塀W>x41Mjs uZ骕< IDATG<2X]sM[`[m{K;94L (qxxxvoi?Klv CC}{^27njU3J|fZ=]Z/Ȟ.ӽʕ r\cAŶm   /PꁢN\zYfhDk6o^O*w(酪l1ü()v>#C6l-KnqLmtԢNԑM-@QM|ݗ/5kFI)@1zO~l̚i:NC4%zy+--]dР:8m{kkb^:uĦ# Oңǥ](pCuN<ɒxLi4<_`VӐ>.tL4}$ߝm^|Gij[Ӿ=P6iD~D3:2>^5׵+u [81r܎@@@@XJ=PkAǕZKM%<<$ ŰiԿ:tݸqZ_.myӧϚ\ ~]15sI}jN$^ڦjL$0Sz׭ihXbfיx\ֵƌ̌СIoo~5 U=y-aDFc#9PPAZ>pM6Mb;T4]V'@X[?qgu„% 6P N9m/xo־=P?c>-b5]TDDiz񭷾#G.RRJśL`oZCҨqmqUfVXaCip 9T@QG'(E{ HL,Y7 -ڬȯ Y:@y~U]g=a.Y|c ?}oℑ,@Q hȤ|4o~aJēoZ>2}R?y/$&j5S5WoB4\8 mVJի4_Ƒ$; uZYxڤ:MCX^="O/gfF G3AAfR׶eTI=qBVArS旯fO 2;I <^ߴEYs  @^(Zb ZA{%ࠊҶmSS^ C;]mFJ ia-M׮B7JZ:IM TH~hIuRMيhX8tXynX̟Z>ɝw^=۹Vx}[`cOcM4{umokl|a^@Q*]7,6՞2NtK]ҵ=1#ݱoޜ(/Sk'i[rTO*,i8G 8_~%{-k{wΝ|Z@1\9i59`7dK-jv3B$5G 8z&sp<_|}Έ xWv&-.+nܔwӍ]qUHiڎX!~Ϯ$zuY2go-[ԗN^%Ϊ#\+y>UrcGNʨ'G빮'hBIh0Z];nmsW w.֧Atִ[}ߗEC1A^׮-G;Uwik {зzց223eDkf{uDr,{yzg^^ŵRɓQ;t]tj1uI.ͥy|a`  (K  _ xmh ]CPG/iR :%V[R1,L5 h`ҹs{ ٻwuҺu#G2{R>}嶁WI>ᝎ*2exf(:\yW˩IҰڵ;屟_o2 ?uМ7JZxo tuMah})PN.{=Ͽvi=[ǔ)YϿE#_zf ύ>k}?oAbb.Tg'`q?,@$tԢ#jU&Ҙ̺Z̥GK}bPwTZ*@Q(_^DzR)Ƣ~>Rqc%+3Kj׮ZNEutDmZcđnIo}- npaB&Ǫ(N;7oGϥs|}@"#O]hL4qNnG}o,XqFj`HGNQ},X?>jôtۛ=P{9w[ZZܪh@qŊ+jS5"MA՞5LCc[EP^V̮/kek(G*z-5{h 0IONgE j %9,1ɯ P|gɑ@@$S+ÇETZMpU8Wtf5k}(uTu/2oVV?1a|֭}-ĢY#QkÆyL/bavӦ!, >:rg)H'Gm^# _ئ*=?)5r?y9=PߵB_9_; kտ=sNWCrצwQE+P_w/Ç+syLat=iVX֬)'nuڭZ6R[7O6 ^ @7.  ^(P&EkēJ޻W"#͚ݒSH'8F٧$v>,#4<SJ럎>,ᡦMҴ& i԰G#ؼC݇NjVAcih1s5d4 <.'N$i:5:uO:fSص=9\+jG2%)1ѬoZvm3 ;>\1-;WNO@@(S"G`/D-Ȁ[ܯLb    7 (zݠ/xb,ABF(z    b rhM@8׋   >(&Ι#Nz5#UGV۶)U 8u6W%5p N  @@. @ <{m  (z-C  w(z}  (z?  (zɍvKZyiܸLB~IJ:'5jDJZQN @i (  xk8srȩja2֫TnwdK! |g6YK^xv@@,(5  % ୁ'ޒ#GN∈0(!njL֭)Wvk-{]ny0@E@:,ӧo?R?[3MKT6l%]|3|; @Y P,KwkA@P7fʊ[ (M@|B@'nD@M @S2fכwrG[~"IIM~9N y:tBΥI*nh!N9m?cIO?o^rYrvvrcTziYllޜ(G3nLԯ_CF*uݻϿ[Jxxl@2tX%5322E \M;*'O&kHKI s;wlK'ǎ.[7N;uv_['Դtiڴ|s7/{y@|K@ѷE@p+PܸqtǔɣBN{k@!!{6N}/cn)OIo3dh_{afyᐡ/MhhۥaÚE:Oix&09NݤIIHg^w ~|\ۣǥrם=n|9Gz oVؾ] 1ϞMuz?,,D^{! , >Ή E P(̜@=p,,BhWQɨAfJ+ZI…5PiVyfƍkR#ߊ6Yb͚QKjRR{TIJ:'+Vw#D{hIGufs"SB-rcyk߼Ԩ)))i ^irmo{{kQ]%66Fdw!ҡ}34j'2+PX+W9sɾ}GͶ J @" (@@+U]K"P9WWS51ٳ)QeϞ#fkPyϼc7K۶M}!y2gR7^.QQ第,??]EڮveRF}' kM^˝>tEC=3g(  P,# ~"ρ9N<~ёi#P̫?nTסk 8qip# F?M~IMx53eYCW _=iVkU>!N||vZÞm@IEmt@(y5PNNMiժyVN|/F.?Rki'o5`2e{יi؅i֚7x!t&;wuPNJvԏt9#"5m.VI\\\[b׮-op:wOkX!`@|B@'nD@.?աu ACϜ9k5뚃V*:csiF{?{fA+.oU]̶6x5˰{_1/|X>g[;kՠzjo\ۻC`^u  |@}_@@" J3dqopɯʳU]g=Va.YB}oℑnthѓx ֔1s:uVd~x9E8qu-KZϛJ|y5PN{!Yx^(io}6@4 Ή mvG  %)Y'Gg?;5˿#II:V[nZYywSzlS@Ksy衾oJz~퇽ٯG/:juiO1j`ZyujZe?*r ~+0k9yqSj8s@@ PF@@):8(ӥge(@7.# & ޽G{3ZPC khmUҧOg' }ټU~DEgDG6h8m$9u2IzTT8ڵ;屟61coB󫆜V>vwucC>1/(Hk⚵;dM.(Wt(nڔ(/y] 3P\8kYb(1nWruKUFb B{nuy'(p y.@@^@͛PPX5X4qdä 78f:rQ\E]sOӦ}9tW> n hJrU+|M2aZ|DKC0mZRY*uzO<;vlnhٳ爹n='@^[]LL<8WdW;@H.;#2r# @@Υe J-]YfZdF6 ӆ?τH58fgfęB6,{tbѪFqǰny診Y1:ILX+rӱ~jʭ0rۥ -muoWt4$ZGkÇOo{=mղ _LyqLk]&$s2 *71rZWZWʇ}/z4! PV@@" xcĉ3&Q#iJrnk-=cjU< zӧ%<NI@@2%@Xn'    @ (/GG@@@@L (     P%@@H;eX!g# brD@@LPLF.@(vb'  @ P,@@[@E9  PFȍ2@@b P,fP Ųr'@@xד! eF@J.@(Vb`  @8}.\Lre碸@@" (     ?sR@@@@,@XdB    (ϽJ@@ ddf˗ (~l  P@@B Pt i2}{8@@cO@@, Z|IDAT&ɞBC@@ PY@@p'|2K2A@@I@@@mr.)+ # @@y@@HIK HKwC6@@/#+ j@@HI;$L{IA@@@@rbEk @Yu^y;ES @ZFãr:n~ @@[ @`}٭;NwϚ а@W: @`(ú3qA(oԢw @ ]{ @2rM@q`حx>$'I А@V* @`(0@Z'v  G6_&;PA@@]bR   >l  HXv8[A@@@g@@[Gs}:q  pPL.  -Gs>H8@@,E@@@JD @@<  <  dp   @ 0B1"    6ŰQR    /@}L @@@@b(@/fiPVzR|5  H@G| įmuZZd1Թ@mm,zfԩAV EgK4i:+wذ4 @<kno>|&BZvԕ'y#G~*\~NZ`6ʭ>-Ir}7Jzzjw풶FIϗ]{W^Ns[~w p5@*Pܷjl}mC7{%B. ħ@m>wQ4B;l{;LRSSd"5k;h#Hk]ai2K;{(|&Y~\nyMmn[nwopL;'}G Rp9o 'HjvvuxA(N$C?>kqB qkdȁ__7ʝ!= P" eIZ[裦WjFdd:A{Zv6lh#QyƜ;˻ OgB׵4-Çˈ3ϴ]K.L'^1~۵RTgց=df~ 捙6n,_1s?2qbQ-WN> Z  5(zly Z~s{YSh 2RE kچ5O>)M{JС2lWj?"[)SFoYj#EStYǎ>j7n ٠o"&ӟ=,[SFM!hIJZljO{[cyG^Kjm5mj3訣$9#̡P|Յ3>zAYXl Tv~iwѶk=_}eޛ䔕߼wd$CN8A*-KSNS}NoJmۤμ_*O%fuxcgsZl.uH}5C;E>{酅?z^HN6.9$2'~PwTc;#; +/իu#)IuT7nyՕGLD@T򊕛emy)9=;?XvE@gq8'k2 =k~ZIϗjIʒW\! v9P曞/ebBΊ@QC=w%9nꀞ\K3Pt>7WV'qMX6s|N[Sir7;1kYro}KxX(.ruwo~u^΄[utbrr:MYo&/4k]F} itjkeiF̛9:0;7^3/:?~=-^}ՄMO+xk:R0fYtw}/]w]}ѵ UQ(VVOW_O(dʹ%J=OG@Q?MOv}痖‰EꧡZ&_s%AO&M*SM bT=  P E]p:-+3i'%kaY2:U(:KFۻtZGvyPu-\kCI[C| ̈A waYe췿mFpZEG -:Кɣ#,0ݍG^[P)1ç:B49== G(UW& f D#-?yOuDfgEM1bZΞ-uQ2cT|oxzV3JJઽu{3;G5m׺Jufc"7m~]ov@:Vۖ7r#gȄ. -7`\ AG}>F6Zs6jy?R^^)zfr  3Q(e7ш;|)9~A $w$ډMnzZOGf_ ^0(sύ" Dc.oYN a0嗢Su ;{5Q^^yv#5pOAO?'77eE01w `nw2F : :ngk˵.ϤSuc]^w1Ż'`a-߱֍Ԁrl$IMwk@pdrqt5^G_XLA^Aʇ6AݺUn7k@Iww0Lf##G  Hr dË/Jݖ-PG K`׮*oΰU@l4#> 't@iME=P6[2jݬ&Z#dCy}#4&::زD| 1׬@K1Bq`El#8ɻsk7E쳎:"XGZ Eo-[vb&Ӧ @Ѭӧˠ#S $-Qss  @mHM3W${x{ihIJJd[5 +>T?-f^Ld1pgMEu&]}uoZ7>e6 Z;:}vw1[5<4کi:2BB ?|ƫvUt9$&ܓTh@=ZzO3I@1;Vx?chքԵ!A,#"sH%@QmWg .mvO~>QG'(E  OQ(ZMM-&\O=eT_ڊNj~zgb<ՠ-  ͛ZEnM'eeh56Z 'O+ìIK>t(n"_|;l 9x UKQGijwXˈ}ڡaz*#=qh_{x2um@]Nйs%.G4Z(9ʫn3!7q;.W= {ӑ|QLIwfۿ%UkzUoʻ-6=w_oĕ@۷4)?Y)'Vq9O\Fy9{\ /0w1FuL]"zη-=B ǟx[/M@}=%II XGH@;EKV)CSS=/3DŽk7;;JSE'馓TlY(w w|hoy2ip۷dR,++[~wYG^v6"|&ԝnVByKA5hȬS佧@ށ@n3RVp]'Ek$EZgf|Ili`tbO:s@ {EzO:Tt@@O1Pܺu9}hN'Kꈰ>ZpFCCgHss/|6mj%h'xhy(nuYnƢf-\f{èjEB P)׸{YCQc>q5PtNyOu60@@ *w_ϲrT6B :۹Z4 c$v$,qK56N@YN%( @ (y][CXΉ   &wz;P\z]ׄߩ&L0S@D Pi䞯M5;tWg! Y(   @, D_|a67+zzi޷n9M1DU@1Z{B@@ IDAT@@ S%@@ ]68{@@E@fO+u8`8I̴YKs6Va@ZhG/m5ZolR5ԂahٻVDܒQ(EZ6J$9x E wy   .@h0qw8zKȑ6kaIʿ6(=7|]q7pˎ.PW#`֕a ͷӊFK2_7R*?|=xɟ~ x E@1,T ĝ.ՍX*>r:jj@%l1ǘ|]z7P^ZL36nXi[$fɀy§޼V K_%{N!P U@B P U@@ P ]mm{ ymv$+6-v}JowSuj "P|JV& 8[xWXjCv"lO@ǜL*$!]@1T ąbHFCu b8@ rf@@ 2Plʕ+n6i%IfI̚&+vŖXl[|^P Yx <?CPtIO:|ΆfbJc%߈nNXuibj\'mu̲}5ӊt{ͮ\ R%iٻN+$9Y;seψR$onK7Q_~θ$58H<6n|3@R Gy'yS3S{Xp2 @   pw2b<2(jX}IIrm(&TuV/9cO趉9ϐɵ˗H;ő&EGXҊz^jT}sA*LVz+)=Ov8RyJo#Y؁ؔ{3@@@@ $l#/%%fDb]k"ѰPC\#.*vEgSVȑ7|sZ쭑츓tgO e2aꯟƭ RRrJ{?VmL)=;TaQ2"E%%Č]gw~%i;}H- >&\˟[uա>^X)YPM~#zԮxAܮ635[?KίD){h/=VImB-ofHƀkj9N=o7YW[ʅws'rcPM9@@@.PԆ7L;04T\SCO8AMI(hgS]{_t=X.8:uFI-(q:luz;ɽQJ0Q:zP-'3*Uen?R*^k͔EKj_0 qt~vPQGs2    & [zv:t,pX?@t{msҥ8_äd: >Ex}d%w:wכ7yl]ݨ#[kuaa7vO #P4 el[,紤lnU!P V@zK@  [ (.s1Rv)>=@QHkeKIgS#ۛyCNpF{{K׋@q`6J^(;_Ԧ':I{;찆bz$):}gΊ(M@rƜe9@ (F@@H@?z ;T+_@v-ZdU/.q\@Odj8#>0M-|yI;~2tHCcm(PXu-My Mw,xL( :牐Ή\k 5$Srw:95mMR ֨ujoS/.B&jHA@ Z'@@ .P\R[kLŒkzfzfE]Lrqo„.{vcIKM$I٩JnYY? U?$ >0=W7(oRg^.Pq_osly3.6\,9>{\ə0O3 "̵ -W#)s_M;/HΘ$pԂ=]kӒYGR!KzɺcD<@`Z&s)7E@] ŽKkjvNq65@vfK@# 4LȐ _'Y[=!^i/k0j6Pԑy/_n|gk#)6!cJ2Tmn#YtmӾH!N Tx3걫곑"Ii9f F     M (*?݋{4^RJ7O68[Zx4tQ]jpSWQ2W|R#$*t}L4nL'n]5H˛tY-M_KJ )=]c[mT.]V؀3 x~,{FnBK?C&3^KG!֮|C@A_Z?rIjں{M7BJݼ{K?ضHٰsHA<V *C@@@z*ihXQ!m =x2f@OG0u5,ܲouSL@@@HD i3  ű  @(&N_R@@ (Š8@Hńj '@G# "@(=M;@@ p@@ Ai&  bb $bR {Lk G8m5Zole"nԬ\J{WeZqKrF$g-Z|U"əz @ (*7C@bF@1fOT9?HJ`u7zAkP_4\ruzL;_ܼ^x$c'jW77V4ZiǗRmQKK#@@@bDy{pngt]m1x=>bw7   @ (FmwckW$˟37?KrvI灢M}ry=oёI@1z{A@@@ ?Bn|*q5Iz):!'Ʀblw[6U&;]5! İ@mR`4K[}$HJV.'Kjvvnjk3dʾ+j:i<)6M ƍpnKM+iܵKZ%9-M2dL0ǏP8 J{*;I-MURϙ0_3 :|ĞH7R+YeKijG|$eHoKZx[J뾍jIJԼV`ԯ}Sđ,S/K^@ ؔ%  H@^V=]Ə'wew`ҿtHjeY/,n߿?_rzԿ _V\͵?TJN}j\'{M:۔e?/ \s-Oq$#9|q'{;݇e݆5|oEׂ.4̡tlFwӿEG~=-npA_vsw<s!KO;܆}-[vnޣ;kx#wŞ0#!@H+@@p $d嗥v&C&O2щ< wR6LN>9(Q:nv߾]ekR2cd/uum*8CF={k_&y㫿~R.0_kSjџj$dJmMI傿㊎YK'?Pӑ"9ϐ~#zԮxlP35XUG%sL3ڰnəi}a+P?k;Liӑ'l[>19Xr'qf>aOR'޾ٜ1`̺|ݲgT.|dEr( n@# =);6`plj䌌] 5p:U}qIz~{:qEdKJf[ө99kW}+1˅gx;z&i0SSos vp9@1ƥ=8YŌHLɐ]oXjw /o7k:_JNi)]kgMGn[x9_f9W/~B˼(Ҽ{?Vm pw5X)q(#~h%[ u33rj?}$׾'}%O()YqPy %@_Ik@@p $dt G=[@QIW]%I߹S?yuGKԎytd=xbtNjdgKqq[ݫd͹F2G?vW N4k麊 :1s4^!Y#ήZUv}Ø~mF:j0QCES[E`,:G@-;|?εΦww;}Kt)YÏYWzNŬG{F Z/Jg^4C |[G|k]?2o>ӻnGLr, ϴ@V !ŭo-V2V:bP8F0S*V?z ;.5>-xҕWv:1NDG?%@ :nYKY@sygn^3Q}VP߳ڑ_JOSfhX(Օˮ7h:RGUxPjw}V83KV?Bs-JIV4VyMS=vխ~Mj>e^'PIr.  |8-U  $dR[+^~YҍTtihf*{Ϭɨ-N`׏(ꆂ ]9+dV8#+] !;?:Ny?ѣqv=ne{i޵ܬ7p>ӄ#bKWnk;:4s;;qwtu .ӽuNdif-Db'vwTz_#ԍ   @$tݍM{Ȇ^Fk >b0bu]ǜdtզ,;Or'}#'R/nljWۧOî_=&1(   @b (z/}d3 %SLZW'+yԑSV&#)klj7~'CtRکl»qۧfTNvs@{g備WH)zށHkuBx6 ˳bgk/vlَz,#"je[9oluXhĦ\q0#'2JOJb@@N.PtɆ矗iӤ`XU<Ԙ5'_s$t &Pԓ7l`)>]yN 7 8p-+T,Z3b/kR0ݕo4RM%r)߈:Ri[VE _Rܮ6s|1?ݙr}wZ|wy_o׆.b:<M;/HΘ:sB s?_};0S9p=f(,{FVbuM@c`Z@{(_A.DuF#3/L(Mś7N/ކF @ (^q  @o$\#\U0ykө(:(3Nkn}-^EE&PL˳SUX1# _XgK߳UN)<&0(&):iǗfoRj wʚ쳶a[T~|4^sbJzctOx4 |lBj1SuQ+_{I7Rg^ad=ƚ2m=jV[%p4n]sHDw/]{]+?]Zvl"i$s衞]vc@D@1A:f" A $\h].iܽ[ZE(,4k&ini]$%+K2%up]#zjWGd֭~M}*icnbjiWkӜG͕ٯ#@@@@ @@@@8@H(io~VrB" t-@  P]y0@@ (ײo_ʬcxj@@ PLخ  @^<^59cd<>  @ (&lp@@@3ߗUJ^^ϱ{! q)@J@@ 0Bq?aUUv O&ӧ1.  ,@˽ǽ#  Po ˯IFzGߒ$G?ȸC%qjF@^67?}  ="R$ﳦWN:qvD-6ȬceΜqү 'zz;A@@@@E}!BRR??܇l& \,2A&N,䤤^..    @ $|&ǧrˑGLO#MM- ٢5gO !g-s挗⢼M    @>Pew2k&s%+3[{eѢ5uU((Sm DD{q  @$tt|ڄf3N?$^pݲnvYplXnٷ@@h P^@@H@/˯,4ϖzdǎ5dFiݸg?9?z8@Fh @{ "5 eom7ZgĚ99re1i[ @@K# Q,gckϐҒN+uls܄er!eذQ  bf $@w٭yr%'vihl-<^fL-iF@H@t H@qry/=IJ-%&C C۠@@@@O !Ň~Sn-K kWuӕ㆚ W(    $@;+_3}~yǘ    .P|ɚ5$//KߍS(@@ ZndG&# t&PbMMm4&ӧ@@DMYx4@@ $T 5gf@@: P@@ P@@-@h@@H ջ4@b8@c8\ D@'z įb--C@z$P4g%NF@/OZ    @D#K    ėb|'A@@@@ r@@ v]ғb9  @NJ  @|s|#@@-@nQC@D@1N:f  a P 3(! "@/=I;@@ (ד@@ P!  @XIe  @(O_@@ Ԥ.@@ 9:  a P #&U!    ô@@@@0 (@@@@wxaڇ (P4gg%X! ģb<*mB@ .a@ @@ Si  p(R  ק@bX@;ŸR G@1<Ԃ ěb(A@$@&HA@L@1:  huMUɎpUI=  q @H@@@@-ޒ:    ābt"M@@@@@{K  1&,1a.  Ke@@X P~@@ Pg Ĝbu7 b0s@@ cϸc@@7{Ck  1(@-#  @ \@EX5@b䍹  1m4  qňs@@ 6c߸k@@ ~@@ Fcm@@ z@@ Vco@@ v@@ fcq@@ r@@ vcs@@ ԥn@@@@L@1:     IHR7    q&@gJs@@p ܦ$G@@8 PN   @$ؔ%ԉ ľb!-@@""@V*E@b^@1滐   P+" .@=#  P," 1.@#  P," -@# w #v *F@=3@@@@> P3z.    @ (^q    bsa@@ [S}  @ (*7C@bG]cS@@7{Sk! 1$@Cŭ" (@؋\ @%X-@=޳J  @L (Twq  @ (5B@bK@1E@zK@  cuM.s9I1v.  @$#K    ębu(A@@@@ ԥn@@@@L@1:  on_C1;5eJ=  @<(C/@@ TD@@@1:&   P*u" /@}H @@(FJ@@ P.  @d=P\|]9KvvFd@֕+HyEOkO-9AWKcS̘>8QA^rdQH@L@1:  @׿yB֯r Zc;F2%ESsu>tϓI۾ͥ6ʭ>-Ir}7Jzzs#q`/\hsR~lz5sA]'`[~[Z:S^AV<3k@} dӫ:H{lXkU7jZd䒰^ zqPƗ_MLK^pU> zy52r@ͯ/@a+P1uiC?ۏdJh=mޛm#.]ZmϮkYkln]nX\]m>dѶ 8N]}tQ&txPQ!{ܞ ,щ,{jƷk]cSߴJ8F(7n#|>cͱ@TP􊕛em{_SO-_t{˛oz~BPŞ@@beg;k(n~uh07骫d}nR0v|r+_uWOniuR *ZY*˵ɫܜL9ܣd"֙Os$P]Tn @Bx {W0fy+7-oT[?{!oj3CFKȑ;E[Eodt3zK7E4P}+VxP@N+(3|$!jJxշICCH@78dhT|NE#2JJLh۸k Vu rt302ˮw舭ɓj}vncͭ]u NEG]|Ekuj5`khA`~elB0a]8}Vo_!s皯ooa?gf+z~`k#'uXőa4EG6[kYbP?o3,3gJҴ{ ݴRW^٣{.k#m o{NQ<#T&^q}TNөuZxOؠۼ濹C(wG(w.ܹ3N w2j`YЩR"o|O8A4IJJ"]l@{D_v'H Gz1,ٔ Cyk7_k5RJavB]P#]C]CkRq_c]gZwԻh8h?Pk}f"-oĉb2 GD[ubx^bdʽ|?\R*buue>)9sĉe7Ž~¢ÛeA@U ^| {t-C7fZR<} [ `,ZRsg;T^a翻tmr2f^0WN:igFUv6NeKucSD/;>zw#hudU_C?-?6P-}; eu_C153;nf>n(._͛:լu_V=YK?]>:VKB %r{3{ьu8d܅uX;+}(>{Jrr*-fB}_4:En{^@Qwʾ?>kr7Ѷւ'\zv@׶455\?IφwEi0_ ç=d6 Jf0_2k5 h ̎[# mLGSGz9)Zut{_/Ň~C>kIMMGN9@Vo, Ofg9t eB燔~f|Gu7 1 l65wkggeV&-JAyڢ+[kMw}֊*uvk+ZXg߬J:Rͷ\%u9t9.ndMtqi\ZZ+|<ߐ=\Be)+(g͛x ~"m+ƍEV2Xf*QX죏N3S6_B(ŭ9@@'PPfX3zV@x[㞝fk|w(Zٳ?}->$eذAۯռFZ|Wو:N7 ĬG; xM/ |5NӟAZ? 7F+k*9Z7ѪvJ^;o%CG??GN ,EKYV,˗F7VRb̘Q"fHnnysk);,qDvB@z-OhmVBZZsכ%sگfد{gDy>vg+1+.O3q#dYgy $ hғMY}l֧=g۰5>Z<ݸ=yw(҉j;ߪsg(^z$d~j_MY<ǵG37nMCUsYo5@1s$:S#d :᎗^-[$&!A&]sMwvxtF'egpR֟;ׁs>Z>耯 =Av/vz9H6ug}~!y;>  !.P4ntuEׅ=7l:9tEsϕ!C8>Vsg莺i5/yD,= |k棯0++WniVw&J*zZuv5xyYh~7h7` uXn9'MU|) VQC#fM5hskhO.]L52r"I>{N8?9AN>>F>f)79{Zq?p-šu"H@ljjO>bEzieR3i 6ͬ̇20C1oM -PYo7]M<wZZkꮵ:Q?stYcl1o@]{?!M=hN/xC֮5=ɞ8ќsE㇝tdczmmv:w,:. ktvU_xӍk[LH}cW@ uu˰OC@3 , )\Ru E(\V^-{~t?ԄҞK nf&MfVt/~؄:Kqg`}?fvɅg|?/4槞2_w~kL=٢kƧ;cKͷ>5yY"R EO={*$1)Ar331Lբ:Gk]"ÛG&F@~]>e;aVw^c:Fgh gXuo+CgzGiZ9F?j9RFy13¬s?zE_LQ.}WIIs!O?0+PԶ4ұo_4 Ϟ0&﷿'>=㒒̬7Ϣ8a߾4)EE7EkowTYwu`@KgZYu3?{D^ktc꞉^MЙ /_nvRɣz_< 2=Xt@O|t5ms޹ʢE]Q'J (W`a!ga-Հq@@"=PlMCqOHKMէ+PԵt.k7h}O v)D=݀D7"i_ts<7.*uƐg|53v-]jfXk1\ )>@FMӳXkJkffߗ^_|ү3F kW }|]yL.o&g߈ȳ- it&A!ZV |+pkxYol @Q!z_ޗs` 7x :]]\PX-Йfvo.#m_tID7m~><;D٤ͦBU?]Q}X%,zsֱK e#qN@ T(Z(O!OK3;@@w(z^w\-ٽpGcE]?T<)/Ϩ4k~0QCP{}N>Zޫ2qOgR,.ΗqybHq@@ =Pe͚^  [ ]cWo܀6hhhQinnRjz\AGk  d_.qq>q4b`^F@F ŨP]*(zB@@"  Ok ;&q  x (r?     ~SQ@@@@@@| ccB@@@mRs7.b{s48 m>ǧI!K&qJlRĦiv2Hb{}6V_.U[$&)S's\ΥZ'HlRVX^סMK:+aPg贿~%4B@MYS  (ub-PMzņVxC֮4P彺M5R\UɛcuUR.u%s~$Uq:$d$NX_~4Z&)R^52\+G%9eЯH֬|7a%@ "#r4  r07nKeIRN Arse' ES)_Wz]$C7[bSpCmKu dNDRG>|8ZL ;7#P 5"! P 91'@@"R@1m?/u;vHL\LoN{ⴷJbT=^@R%%ŏ}5@"NdNARh%P 54#! P ," .@?ICe9v vX]WS~-qE/7!bo)@@@1," Q$uffitə8Qr&Mhk3uc=zfi ɛ6f/+a>iTI),#ؤk״ozdI>zҠA2h^ݪ˞Z 3ZNI9ZE75 h=$)yfQ%>{dc<cz4=./b: b@@@@ :PJϗI:5[E) 5k_@Ql6S71+KG؄߳G#VZ_/{flϜ)Ʌt8vW]t hm53u6~J\jdt׳Ȇ tN1 I֬+-j+PKد;_I̷w싆KζFI:OsH\ խA /{Vh5<I:[Z P$JY0*on\%OC $Pԙz:RKwjb$sN yc%.ccYE+P4ם.gI[C4l}}]yH|Ztv8|u0cn lUij6 [ZtjB)ns:nP }k`@@@@n:PL4HJ.ЍTixW/@QDrN!UE;L6m׿~nPHUM6,)i^llz6OXuN:>zYH||ٗ=%uc[ fś?1?(,{DC={8m4dq9X)uH\ZW7ً >")PLq{Fu/̖@W]_%@Q׭L̟`ju=|2rdͼ@=@ <\_$uy'<{N@@B)Ձ.xY m:cPg/cym O>cϓg]ENJj%k敒2{ƦiҰm:uK>2l㺞e[+^4l&tcXg?&óWq_}WKg33Ms~<)8N){(Ml-ݎYE#ɁwG[žl  @(0P\Z+*-5;G1Y/+ 1o:cM>6]OM@QD0O@.oȽ&c~i}]e3}9 |g9UuƔ %mutκԒ\|dM\^gbӾOߘSG$iIlRVׁ,y7Hb$^+P 9? }"I+=lBA FgxrkAGƕK@@` (0PԁIftcTq: NC%wdI=nf,J[^+".IbxK8q:ں ]m+jS_>|'W19h9$w-1 iGv/qqx^Eq:~lmpsbS.2!cׁ{<~9XZp:Agww>   @u۷˶^0>wy~q٦+֦-EkfSt+gRP`f.&l JJ9]Ԯot`]pƽ³:Ը#^{q[=XɘxTl$.HO}kؔ\3akURG(/y͍KU)!o} 5ۗRޯΚuTzH\Zs5OIӞ^ kts}/.@vȳXy{:mC ?'Jw~=I+P?W1欛x/im~>L?b)Sz6fo{C9OO;]T9<_I\uvEwyL9;4xz㔽OC{)#\m| IDATYW<4)h`^J#ylnڻJeN}dN8@@@7ox!#:+4PpȐvaΝRqO2P!mf.z( @@Ulk1}jNp Ty3H:m@1H4   @ Du/JI6LF}v@K+tJѱJ޴i~z,PoxIlqI2x#~[hEM.1B*{zq4׆i > sgN, P%"   N= Db u͹O;?FAѵbF2k(x@@ \.Pۍ͖-hm5kLt&alRkwK&c$8V) Cm 랗v隅ϓ4sծyJ U+$a^Owg ]nqi3zlRdL=<@ $VE@"^ Ek`w#7 $ھ>P_kj_47O!HXcx%quh*&.NF.^,EE = =i]ӒVzdL:߫^KfxlSޜ$IӾO|^_ҐYsncЛj.[-U~gvNn_l {$!ooIGjBCh0YM[1Rp'I;mRtcSͨb?sZ@@ .P<fs-ꌾ,ɟ1k2KJ$615]oQC;-v(ڛff|Ό%#F_Iviibk}{1f-6VgΔBi:p@?ٔʼ_QY+<߷Ųxё~g]y&qi, j[-{Cya;RńPӼwUP5j@moomR+,P͹<;oab͡:l@bo͌{Pox=.{c-׽gBQVSx֬KYy*Ul2,D-oLZ*7O?Kw͸uK@2h$^7Tgq_9Neͺ|R^gNˍ]z1  (voD @@ .Pl.ϡ^CQgCH8K$!=}Kh%,)yܵ&~Ll1ށ*|5[3HZ){vMsdNi/Ŭi5\ M`ٍ:CvZg./@7#̱ @x(8 @@ @\]-|ү{K{t~ U%ð=@̩ͣ_ԒTmeɭݶPWS NnbW (N%@ Z\zL:a}t@@ `(Z;^v<4)5<0i-P,&7t&t)9RIށkشgT-s^GϠJ H05@:jw_E=:n7݀ET뾾JM H S'gUKo4ZO3tqf` b=D@C EG-]* ee@H_sRP d端5FSng=  isK7meKPQKJ@Q_Yz+@tWŤn CvSfA VzdL:*ܯ}$xs:I[]T-[`Q³V_&UF2juuAT tbݺ;%d̙WH|0s_՜]A'COw~i^O<]r6l{G?'lRt @ (@@@1BǭnՍ妞Dz>mT葀k=)1ǹ{t!ju@IAt`,@@p@@` (ԑ@@ (Ώ@@+p-,15`ǘ C@z"@5A@@@@ Jtl@@@@z"@5A@@G`D@@=@@@ ؔ%FkD@ P ܌#@@ Pa"@@&@@ :cJ@@ P@Ũ Db 4 (@ @@h P:@@*Pܸil^.s挓 D@U\qNZl]9  Е@T˖%4Æ#/K%&]    ~DU}G<{RW覉Y3KdRN*    D@T0}@V(&=EsͬʼnKllL\9    DehYv {OHg-N6Z=fddp  Q)kBD E# ] M{g-.RywMG+qqj6ir˙E_3}P~[ʌ%뫯K}Bo}SW.cB@O@@T?: ܖ?u>˼@sB ֬B]Qat8rɥ6U.)rI3:Wiv^H9c uW EiI=A@Q(.]ٳ1GOv䫯k]k>$c+P<r%tZTUߺԻ;2{k(U    Q ŷL+ݎeǐ@'Wix9ًfL=ǵ/^;o4uU 뿛гk(v;T@@@@@V ':nwȔ)[wo\u\[].{1xQ^x>?`N@ܹ^_KYY_UW5!    @Q+h Ek棯e@@٩B=@@(@O6oz 2yCj&g:}٥r f??zTjk0GmK_x9yk]7G=fHѴen{\m/d[/0w|zUh;Rxb=zx45 ``(  0*P|/ҥk(>ͭfݰE())){TZn|:e.ǚּaVV1_Hug}t/_`j -BrƤ6$&Kvvxw1W ! P +" /U(1CǷ]'O֭ +P<䙲{w|n8sDͦyʏ7zO馳}Βt:ɛo~>FCo|ɧMadgE~es~w|DM  @(3gA@"M `μy^4(S}UvV\     P &m!    0sy  @ONב6[O[8@@(@8GkB@ ,A@ @@` (A@@`(C6@@'0`/̈zLIMIx! ! P !.M# ,0`'lٲWrrGu@@ǝ" .0 ŊZy#'q  @ (ݐ!@@ ,d3kKjjքaq @,zpnZldu" T bzh>@ƍ)J]]ۧ/#sfPZ֭ݻ^$fgKA2h,KN:J鸡2tNq@@@@@pvȲed #2wNi/|IHU&kxm2r"Iz86is̱2g8J w    @ ,Ū:Yzx&Y%=-YcexqOO'̟*;C=+PY٥4hظ_B}[LLZpQ?~O֬!y2ox0Xbco IDATCM"    a(l}eUnL<< KԩRtq]tM{Da2SWg,u]G@^@1쇈" "_qZ eqfnO`;) s9Z O>)Vw]+QMb;e 9.OwoXQV=RПnS@kŰ: @z۶d^Ke5HZG6׳coqw nk}yW5źF&HmpG7;̮LII  @%I;  @"Vm׉wVIJ3JdoZ%c׿vB#NY%%R|i^uE@n/iMܹk1z1T/XwW Q/@  O ={s~6vzuGʴݯmܴG7Wsv9 1cd…^u˖-+\_{VL5̘>F@@)PZg:3%v@^  3 ijjO>bE2wNjKJU}1i3k&^rħݲE!P!' ysСy=(@@@@"\ EO={*$1)A|y?.1U.$5jpQzymwTqboj}R5CQ7])7Mb@@@@P ?u[لE7c{=9وz\L\\H[Z$o4):X    Q!5r/AyȤ#0 ˥AR 2  0Z\K$%|@`@@/ "&ɭ=Ol~]6@@`x@N [Zۤ.qqm.W ! P 10# *bzm@@ b#f(  Ч}@@ P  @_ (6B@"H@1" }(@؇؜ @$CĘH6}E@bi@@@@$@8FkA@@@@ !y@@@@@M@@}k Ŵ$P "+M! /@C  `и*  >@b`i@p@ J@1T DbdG@B&@2ZF@"Z@1#  P --# ,@ɣG@@ 4:M@@"M@1F"    Џϩ@@@@4H1    @? (#>F@Yt/+56I@@X@9  ))#E?@@ P[oΆ Db E@T@O9  93V@Kž\  @ (F`U@@S! $@IE_@@ P;k΄ D@ic~Y@@ (֗@@@@Pj8@@@@B+@Z_ZG@@@@`@ (b@@ )K,i @Hi4@@ AĤ)@@` (R@@` (S@@#@8pƒ+A@*@TNC@J.@bp=i @(e$@@ A9@@`(2@@` ([@@!@80Ƒ@@.@tRD@F.@bMi@a@@ !@I@@`(A@@P(B6@@ P1 @@(F@@ P!@@@@;žL    Db!    @ (5gB@@@@ #~@@ 4МV@@"R@1"N# `s@@ #q3  })@@ PA  @_(2@@"O@1ƌ# }"@'̜@8ň2: b8s@@ #m/  GD1>:!A@ň&:    @x(8 @@@@"B@1"N"    1@;SfJl! bsf@@ 9! &@o@oz bs^@@ |  Oi@@p P   @(;gE@^@1쇈" "@/@6t2.  }&@gԜ@@@@ P1 @@@@3>D    Db!W DaMO I4  9n@<  )@F@@ (ޘ3  (@F@@>@q@Ĝ٥:@^E?Ǿ~.ikhĜI4ϣZsU4UUn7I>\bz!X% ^Bk]=h=d7S:@ =PO-[zQeذ[Za>穠@@ Ps=IرR`G_esωɫ.1 ޿S>3+b.?t񇶼!M{WJLBdϽ>c#r( #с>#@2gN=|=%ϫ]-a*e_%NG$ -9GD!-1)R.mث`@:hnswlaidPYJPڣ @H@OH [u#YJ; [ԭ}ڜJljuv-&FR#$>- s:LΖbɟ=ijl-[-55rEóJJFq$|sOq(ԬzteI^j4}.C_ubI>\M})NԭQZ!u{#$lf1VW&:slJ$ #)Ï[lzƗzj՗S%!a]]2on ӡ8@@EVef࣏騛_|zRfl,Wĉ3iRcgw1Ig4rp:bOU9@@pvȲed׮ O-s\t{%&LhX|i&mŔMgp'㯼RbM{eK1qq螷Нqkk"Ϣ3ǜWak MY^Nu9L]Zz4]e#]tEϢ^:jxb?oI攋$:M{VHղ{:%̞w$~ߓ:%}VzdL:Vr/33Syeђ~ X j}| >C; _z?y6?$/~ 'b$i@@N^>^IIOK|X^o^+RyV\,I99bonk݋L`o(j;P9ӄ2h ESZ\ADwP4cHwXa|USOg=̝kf/nnm>"=}Y:CО={ <+Wt&ȴJȑ*#/2~|,^r/Ҹk:$.5)%&.Ym۞]ߗEGIrLi$_1/&gK!`۷KKz~_eU`I %65kوILML)sfgsuĥ7r^g=wJ^Z_oIw(j7_ w=!uufCz<3KfXZjnv [k֤7pJ ]g[#8q»|(/Y3.w;i 7}$N1_}|:CGs r |mK=E@ z=P9$ᄋF>llaCɜ9d„bXߡ*#)_܄qo8({|zV!_eym}MLW_bqIԩvC[s>lZhи桇L KE p쩐TZjJos|wV/<ł3Z/˾g0B8Ff]e_Ԯy|7VE}\zٮݰIE.}(Zq۾̬+~.2vP92t(k-4TF @x$@qgHƨQƟw^W_on]q, +dɫ+l㎝"3gHz N>"Vkci+PL6LF}W7P|&@q>cE ]Gǟ/惩3i?uqf6J)~x|^$%`$Lgݻ$@ѳ#--mmλh@ <K.vi.ǣ~{{DZ D@~^^~e{ eq1焄k}'>[6{=fm@1kX)^ཙGٲe iw(3[rk~`]|r=P]̩_ԒÛѴ+PIʔ3\,ڎV 4oUKi>NbRw8sg邅wKlJ>|Ru>1+:F#Pt8qn͇77n\+Ga@E#~6,@#D7g~lq, +oV&K3g_Z,gȨE"]P.Ԓ%O;lrbS2!(j@8뺼7'PԵ~c w iyZ1/~Xa۳-wI8hKЃ?ҡk^ ^;Άm4H׸7qY3ܾ ʏ7ɪO6{-P48W+IGHllxȽB]@hlq]=C(_oq, +ůLf˗F$%ˌ%2kf639j{}[zKݓDRxp:vZ_~9O_]P*쪸PJѹwZ5fWf9kWյ&E3 "dN9Ʋ b=wˆ UGi$@$@$A1rB}IHHpXAQ;2%T0~(œ'תYo^ '''T5(:{pCQ?unhВ2!;2⮻U;\A%.y2}-e<;{˸y+ˑӟQq1]qvbUEYu%ήB%aOMw 5fEo;l) IDATA} WǹOus5.~\UO3٨*uQ*yE^aâӐ!ٗHHZ=[EɅ5.ݼ-kƸ %uk<}FUO, C 77[f{   vBE9;:un.]RD H%|U=O`;ZQk<e/Hx]%I?W__TP:vL͞9=X^P9h'xu\]^C40{5'HFWW0ҷ,2 .Jل59s+Py2J?ͅWH+~,\3N͍x(^pԴLDFىވrd?  ǘ1r?%)t44[_pruܓ]HHHHHHHHHPPlȜHHHHHHHH  vdIIRS3' 2"Qح>e(:wٳ|HHHHHHHH ;AY*{ۅx$̟Z} vhRR2GPUUθA-oEcpČ- |n'1dHzvipb  h.j*W<۶^:Q-.HHH3v'(VTTb|ڴј#)OA2j̛%rP:>^$\8 @%Hbue%v{.8 4 v -}p5߿bt;/rCRPLxbVOA`oc8$@$@$IPPg6o}ؙ3Ue @hN & 7{rwI1ش JFfV7qbBw4>(++GxX7 v,y+fd?C.?y9N:"bii9?:j>S sn ݻ[\ʯh F1z4*'PU^Ϡ t1]>ŋE w_kh_؃hgHHHQ8XYV#o TW#0&=ǎuT\ +mYs RQOVnuѵk rjӻјqŊˆf/ 򣷄mp)߈EgWW #&N..3u*uŪ(#I~^8)|1>h>i|/snFX+Q!ўC% hMPi89;pvݶ{rg$@$@$@J H ,EhCE'ݱe!8xRܯ_^x.PobCDb̘pqv͇}Gz}1f~]5X\\={cga%CQ{? 2}*Y{jxxCbKGuU|CBgcuENT%(.^egHg|&9 K?lccBJЍ~ur@  &_\rn-W^Xefg9.HHH=h0y(J{780x:ǣ3]u-~  !!sbOٹqZPLNɀTLNLR_zꊿ<ٯe"*ܙ U5 ÆE_l/4AQ*87}pQDMnQP>5m}W\5tK>sr{Z{A9.. af\!  "U,$YŸ||,R8/ ULP|O{{ٯTVVSض-gf'XbczPhS53PtrGҥ(*oϞ=ez[ŵ_mǞSUضdEEطvJDNn!2nx49! 4G/ emMDI3) 8 @mLPܼzk:?>U9E^.+E {-iSVMEYzނe/"wUNFJW>Up.k #b:\$@$@$ ]P5/[Bx"yp$@$@$@$@@] 747"f??oxx}$̟Z̶d[PO>"VOMCXX7%}K7~ 'jx=0NNM?INgA_D/(xx/ /JO,9^Q'zGPǽ%% H 9lX4}|&HH@ksEڏ?*d}.79 GHHHv-(ws܂#fiXra2H>PAQƓ"Ix6~PP?Ka2]=N$ZΦ6_(až (/*BueM.h7l+wxKfd,ƍRvS2sM͛ @]Z(?,+w{OA<{pїHJJ5TK<,jRQZ*Kg=lnE7??‘#FK8`첌3Ww.CLE瞽>ޞͽ]G$@$@E ᝿Ct1Y{-e)&h$@$@$@$@MG MiFo;]4}Ԫ pri/8v=()-+b/=HHHZB9d^[niupR   h/((>$pI|ů͓Oin @ET5 ^^78G"   0"@A +PZR.)A&$@$@$@x)VUv @!@AWJ$@$@$@Jf:gf 88 ~@\ R幥p^   h((דIHHHy #@A Yya PP5n #++ n9p$.8 Woc 8( ?LU, # `ٳڭWS'p=놿v/bOHCff***ѭk""C0y҈fP}H KWM7^hf" UT-\f5q"ikOsvD= 9IL nS?JP !_o8-ݱid8lT Ч O#  h?((6Ycge/, &5ӬOF^zݮMAqxYܿ+{NDG*+WVÆFaav_E֞=pqwG9smOQŦ*g$%SP⸋l_'' |Qgi  {;c7'v$  h]((6yCdgS4ӬwN#&o<9 ozK "MwS7BrJZ;^?^M]u;O?5/-ڻnn?wnOQŦÞ$@m@c g6nDi^*\_޽ե J.\@ޱc,+S{@r\4 ((̮¦DPovꕐ \JTw^9sƌ$ƿ_]ۧ]ݨPPlTM2#M}6 8J$$3ig@™#"j_c V/́߿_VyO y"ŢO3OdSHHHMhXss sW"zꊨy'N1e/.ꉭN+kBwvwIGqV^P5}ɽ#78AA:bv5'7tr'W#0rep0 Ϟ-Ĺprjǿo_G*ahw!Ν HO?o4_pH' mv Gʋ1nx 6m:C^]0qbBCX\SسN&g\kmڳ=eg^w ̘qMÜ>};v&`uz>r VoRc?$9-KΟG(AeI =<秾ϊeAT<XaFrsտ:C޵ݧGE'q;srRYw -M]N-:]y%:.#?wRijS'tY!?%s*~7Y46Y9}; +\S(Ep AlpwwŠA}f6UckTP{\mXCEOoldM9<8<+*յ+^h+:bwZc_7r/wjX)"-YSWc M%>UUAh۶x$BM?Ç]5N#.=jGQBf,yg-a(#I~Mo5䩉yA" 9}MUDD 21W"~DSAA?D\,Zz#bp>*<>ky@DBU哕nvt??o$%Z<vbe~۹>}`j29sƟ4in6޹JJʰw_H@^^jÓй7/X ѻww

Paragraph 1

Paragraph 2

``` A well-placed backslash character would prevent that... ```md Paragraph 1 \- Paragraph 2 ``` --- How to configure escaping? Depending on the `EscapeMode` option, the markdown output is going to be different. ```go conv := converter.NewConverter( converter.WithEscapeMode("smart"), // default converter.WithPlugins( // ... ) ) ``` Lets try it out with this HTML input: | | | | -------- | ----------------------------------------------------- | | input | `

fake **bold** and real bold

` | | | | | | **With EscapeMode "smart"** | | output | `fake \*\*bold\*\* and real **bold**` | | rendered | fake \*\*bold\*\* and real **bold** | | | | | | **With EscapeMode "disabled"** | | output | `fake **bold** and real **bold**` | | rendered | fake **bold** and real **bold** | With **smart** escaping, we get some escape characters (the backlash "\\") but it renders correctly. With escaping **disabled**, the fake and real bold can't be distinguished in the markdown. That means it is both going to render as bold. --- So now you know the purpose of escaping. However, if you encounter some content where the escaping breaks, you can manually disable it. But please also open an issue! golang-github-johanneskaufmann-html-to-markdown-2.3.1/LICENSE000066400000000000000000000020621476711565700240220ustar00rootroot00000000000000MIT License Copyright (c) 2018 Johannes Kaufmann 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. golang-github-johanneskaufmann-html-to-markdown-2.3.1/README.md000066400000000000000000000336421476711565700243040ustar00rootroot00000000000000# html-to-markdown A robust html-to-markdown converter that transforms HTML (even entire websites) into clean, readable Markdown. It supports complex formatting, customizable options, and plugins for full control over the conversion process. Use the fully extendable [Golang library](#golang-library) or a quick [CLI command](#cli---using-it-on-the-command-line). Alternatively, try the [Online Demo](https://html-to-markdown.com/demo) or [REST API](https://html-to-markdown.com/api) to see it in action! Here are some _cool features_: - **Bold & Italic:** Supports bold and italic—even within single words. ![](./.github/images/point_bold_italic.png) - **List:** Handles ordered and unordered lists with full nesting support. ![](./.github/images/point_list.png) - **Blockquote:** Blockquotes can include other elements, with seamless support for nested quotes. ![](./.github/images/point_blockquote.png) - **Inline Code & Code Block:** Correctly handles backticks and multi-line code blocks, preserving code structure. ![](./.github/images/point_code.png) - **Link & Image:** Properly formats multi-line links, adding escapes for blank lines where needed. ![](./.github/images/point_link_image.png) - **Smart Escaping:** Escapes special characters only when necessary, to avoid accidental Markdown rendering. 🗒️ [ESCAPING.md](/ESCAPING.md) ![](./.github/images/point_escaping.png) - **Remove/Keep HTML:** Choose to strip or retain specific HTML tags for ultimate control over output. ![](./.github/images/point_wrapper.png) - **Plugins:** Easily extend with plugins. Or create custom ones to enhance functionality. ![](./.github/images/point_strikethrough.png) - **Table Plugin:** Converts tables with support for alignment, rowspan and colspan. ![](./.github/images/point_table.png) --- ## Usage [💻 Golang library](#golang-library) | [📦 CLI](#cli---using-it-on-the-command-line) | [▶️ Hosted Demo](https://html-to-markdown.com/demo) | [🌐 Hosted REST API](https://html-to-markdown.com/api) > [!TIP] > Looking for an all in one cloud solution? We're _sponsored_ by [🔥 Firecrawl](https://html-to-markdown.com/sponsor/firecrawl), where you can scrape any website and turn it into AI friendly markdown with one API call. --- ## Golang Library ### Installation ```bash go get -u github.com/JohannesKaufmann/html-to-markdown/v2 ``` _Or if you want a specific commit add the suffix `/v2@commithash`_ > [!NOTE] > This is the documentation for the v2 library. For the old version switch to the ["v1" branch](https://github.com/JohannesKaufmann/html-to-markdown/tree/v1). ### Usage [![Go V2 Reference](https://pkg.go.dev/badge/github.com/JohannesKaufmann/html-to-markdown/v2.svg)](https://pkg.go.dev/github.com/JohannesKaufmann/html-to-markdown/v2) ```go package main import ( "fmt" "log" htmltomarkdown "github.com/JohannesKaufmann/html-to-markdown/v2" ) func main() { input := `Bold Text` markdown, err := htmltomarkdown.ConvertString(input) if err != nil { log.Fatal(err) } fmt.Println(markdown) // Output: **Bold Text** } ``` - 🧑‍💻 [Example code, basics](/examples/basics/main.go) Use `WithDomain` to convert _relative_ links to _absolute_ links: ```go package main import ( "fmt" "log" htmltomarkdown "github.com/JohannesKaufmann/html-to-markdown/v2" "github.com/JohannesKaufmann/html-to-markdown/v2/converter" ) func main() { input := `` markdown, err := htmltomarkdown.ConvertString( input, converter.WithDomain("https://example.com"), ) if err != nil { log.Fatal(err) } fmt.Println(markdown) // Output: ![](https://example.com/assets/image.png) } ``` The function `htmltomarkdown.ConvertString()` is a _small wrapper_ around `converter.NewConverter()` and the _base_ and _commonmark_ plugins. If you want more control, use the following: ```go package main import ( "fmt" "log" "github.com/JohannesKaufmann/html-to-markdown/v2/converter" "github.com/JohannesKaufmann/html-to-markdown/v2/plugin/base" "github.com/JohannesKaufmann/html-to-markdown/v2/plugin/commonmark" ) func main() { input := `Bold Text` conv := converter.NewConverter( converter.WithPlugins( base.NewBasePlugin(), commonmark.NewCommonmarkPlugin( commonmark.WithStrongDelimiter("__"), // ...additional configurations for the plugin ), // ...additional plugins (e.g. table) ), ) markdown, err := conv.ConvertString(input) if err != nil { log.Fatal(err) } fmt.Println(markdown) // Output: __Bold Text__ } ``` - 🧑‍💻 [Example code, options](/examples/options/main.go) > [!NOTE] > If you use `NewConverter` directly make sure to also **register the commonmark and base plugin**. --- ### Collapse & Tag Type ![](./.github/images/tag_type_renderer.png) You can specify how different HTML tags should be handled during conversion. - **Tag Types:** When _collapsing_ whitespace it is useful to know if a node is _block_ or _inline_. - So if you have Web Components/Custom Elements remember to register the type using `TagType` or `RendererFor`. - Additionally, you can _remove_ tags completely from the output. - **Pre-built Renderers:** There are several pre-built renderers available. For example: - `RenderAsHTML` will render the node (including children) as HTML. - `RenderAsHTMLWrapper` will render the node as HTML and render the children as markdown. > [!NOTE] > By default, some tags are automatically removed (e.g. ` ` conv := converter.NewConverter( converter.WithPlugins( base.NewBasePlugin(), // <-- registered the RemoveTagType for " if output != expected2 { t.Errorf("expected %q but got %q", expected2, output) } }) } golang-github-johanneskaufmann-html-to-markdown-2.3.1/converter/render.go000066400000000000000000000026351476711565700266400ustar00rootroot00000000000000package converter import ( "github.com/JohannesKaufmann/dom" "golang.org/x/net/html" ) func (conv *Converter) handleRenderNodes(ctx Context, w Writer, nodes ...*html.Node) { for _, node := range nodes { conv.handleRenderNode(ctx, w, node) } } func (conv *Converter) handleRenderNode(ctx Context, w Writer, node *html.Node) RenderStatus { name := dom.NodeName(node) // - - A: the #text node - - // if name == "#text" { return conv.handleRenderText(ctx, w, node) } // - - B: the render handlers - - // for _, handler := range conv.getRenderHandlers() { status := handler.Value(ctx, w, node) if status == RenderSuccess { return status } } // - - C: the fallback - - // // If nothing works we fallback to this: return conv.handleRenderFallback(ctx, w, node) } func (conv *Converter) handleRenderFallback(ctx Context, w Writer, node *html.Node) RenderStatus { tagName := dom.NodeName(node) tagType, _ := ctx.GetTagType(tagName) if tagType == TagTypeBlock { w.WriteRune('\n') w.WriteRune('\n') } ctx.RenderChildNodes(ctx, w, node) if tagType == TagTypeBlock { w.WriteRune('\n') w.WriteRune('\n') } return RenderSuccess } func (conv *Converter) handleRenderText(ctx Context, w Writer, node *html.Node) RenderStatus { content := node.Data for _, handler := range conv.getTextTransformHandlers() { content = handler.Value(ctx, content) } w.WriteString(content) return RenderSuccess } golang-github-johanneskaufmann-html-to-markdown-2.3.1/converter/status.go000066400000000000000000000001461476711565700266770ustar00rootroot00000000000000package converter type RenderStatus int const ( RenderTryNext RenderStatus = iota RenderSuccess ) golang-github-johanneskaufmann-html-to-markdown-2.3.1/converter/url.go000066400000000000000000000054731476711565700261660ustar00rootroot00000000000000package converter import ( "net/url" "strings" ) var percentEncodingReplacer = strings.NewReplacer( " ", "%20", "[", "%5B", "]", "%5D", "(", "%28", ")", "%29", "<", "%3C", ">", "%3E", ) func parseBaseDomain(rawDomain string) *url.URL { if rawDomain == "" { return nil } u1, err := url.Parse(rawDomain) if err == nil && u1.Host != "" { // Yes, we got valid domain (probably with a http/https scheme) return u1 } u2, err := url.Parse("http://" + rawDomain) if err == nil && u2.Host != "" { // Yes, we got a valid domain (by choosing a fallback scheme) return u2 } return nil } func defaultAssembleAbsoluteURL(tagName string, rawURL string, domain string) string { rawURL = strings.TrimSpace(rawURL) if rawURL == "#" { // Golangs url.Parse does not seem to distinguish between // no fragment and an empty fragment. return rawURL } // Increase the chance that the url will be parsed rawURL = strings.ReplaceAll(rawURL, "\n", "%0A") rawURL = strings.ReplaceAll(rawURL, "\t", "%09") u, err := url.Parse(rawURL) if err != nil { // We can't do anything with this url because it is invalid return percentEncodingReplacer.Replace(rawURL) } if u.Scheme == "data" { // This is a data uri (for example an inline base64 image) return percentEncodingReplacer.Replace(rawURL) } // The default Query().Encode() encodes the query parameters "sorted by key". // Instead we want to keep the original order, but still encode the parameters. u.RawQuery = ParseAndEncodeQuery(u.RawQuery) // For better compatibility (especially in regards to mailto links), // instead of encoding a space with a "+" we use ""%20" to prevent // e.g. the email reading "Hi+Johannes" instead of "Hi Johannes" u.RawQuery = strings.ReplaceAll(u.RawQuery, "+", "%20") if base := parseBaseDomain(domain); base != nil { // If a "domain" is provided, we use that to convert relative links // to absolute links. u = base.ResolveReference(u) } return percentEncodingReplacer.Replace(u.String()) } // - - - - // func decodeAndEncode(original string) string { s, err := url.QueryUnescape(original) if err != nil { return original } return url.QueryEscape(s) } func ParseAndEncodeQuery(rawQuery string) string { if rawQuery == "" { return "" } rawParts := strings.Split(rawQuery, "&") encodedParts := make([]string, len(rawParts)) for i, part := range rawParts { splitted := strings.SplitN(part, "=", 2) if len(splitted) == 1 { // A: Just the key encodedParts[i] = decodeAndEncode(splitted[0]) } else if splitted[1] == "" { // B: The key and the equal sign encodedParts[i] = decodeAndEncode(splitted[0]) + "=" } else { // C: The key and the equal sign and the value encodedParts[i] = decodeAndEncode(splitted[0]) + "=" + decodeAndEncode(splitted[1]) } } return strings.Join(encodedParts, "&") } golang-github-johanneskaufmann-html-to-markdown-2.3.1/converter/url_test.go000066400000000000000000000165221476711565700272220ustar00rootroot00000000000000package converter import ( "testing" ) func TestDefaultAssembleAbsoluteURL(t *testing.T) { runs := []struct { desc string tagName string input string domain string expected string }{ { desc: "with whitespaces around", input: " example.com \n ", domain: "", expected: "example.com", }, { desc: "empty fragment", tagName: "a", input: "#", domain: "", expected: "#", }, { desc: "fragment", tagName: "a", input: "#heading", domain: "", expected: "#heading", }, { desc: "fragment with space", tagName: "a", input: "#my heading", domain: "", expected: "#my%20heading", }, { desc: "no domain", tagName: "a", input: "/page.html?key=val#hash", domain: "", expected: "/page.html?key=val#hash", }, { desc: "with domain", tagName: "a", input: "/page.html?key=val#hash", domain: "test.com", expected: "http://test.com/page.html?key=val#hash", }, { desc: "with http domain", tagName: "a", input: "/page.html?key=val#hash", domain: "http://test.com", expected: "http://test.com/page.html?key=val#hash", }, { desc: "with https domain", tagName: "a", input: "/page.html?key=val#hash", domain: "https://test.com", expected: "https://test.com/page.html?key=val#hash", }, { desc: "with domain that includes path", tagName: "a", input: "/page.html?key=val#hash", domain: "https://test.com/random_stuff", expected: "https://test.com/page.html?key=val#hash", }, { desc: "data uri", tagName: "a", input: "data:image/gif;base64,R0lGODlhEAAQAMQAAORHHOVSKudfOulrSOp3WOyDZu6QdvCchPGolfO0o/XBs/fNwfjZ0frl3/zy7////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAkAABAALAAAAAAQABAAAAVVICSOZGlCQAosJ6mu7fiyZeKqNKToQGDsM8hBADgUXoGAiqhSvp5QAnQKGIgUhwFUYLCVDFCrKUE1lBavAViFIDlTImbKC5Gm2hB0SlBCBMQiB0UjIQA7", domain: "test.com", expected: "data:image/gif;base64,R0lGODlhEAAQAMQAAORHHOVSKudfOulrSOp3WOyDZu6QdvCchPGolfO0o/XBs/fNwfjZ0frl3/zy7////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAkAABAALAAAAAAQABAAAAVVICSOZGlCQAosJ6mu7fiyZeKqNKToQGDsM8hBADgUXoGAiqhSvp5QAnQKGIgUhwFUYLCVDFCrKUE1lBavAViFIDlTImbKC5Gm2hB0SlBCBMQiB0UjIQA7", }, { desc: "data uri (with spaces)", tagName: "a", input: "data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 56 56' width='56' height='56' %3E%3C/svg%3E", domain: "test.com", expected: "data:image/svg+xml,%3Csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%2056%2056'%20width='56'%20height='56'%20%3E%3C/svg%3E", }, { desc: "URI scheme", tagName: "a", input: "slack://open?team=abc", domain: "test.com", expected: "slack://open?team=abc", }, { desc: "already with http", tagName: "a", input: "http://www.example.com", domain: "test.com", expected: "http://www.example.com", }, { desc: "already with https", tagName: "a", input: "https://www.example.com", domain: "test.com", expected: "https://www.example.com", }, { desc: "query parameters", input: "https://www.example.com?a=1&c=2&b=3&x=&y", domain: "test.com", // Note: If we were to use Query().Encode() the query parameters // would be re-ordered as "?a=1&b=3&c=2". // We want to keep the original order! expected: "https://www.example.com?a=1&c=2&b=3&x=&y", }, { desc: "invalid url with space", input: "https://Open Demo", domain: "", expected: "https://Open%20Demo", }, { desc: "invalid url with space and brackets", input: "https://Open [foo](uri) Demo", domain: "", expected: "https://Open%20%5Bfoo%5D%28uri%29%20Demo", }, { desc: "mailto", tagName: "a", input: "mailto:hi@example.com?subject=Mail&cc=someoneelse@example.com", domain: "test.com", expected: "mailto:hi@example.com?subject=Mail&cc=someoneelse%40example.com", }, { desc: "invalid url with newline in mailto", tagName: "a", input: "mailto:hi@example.com?body=Hello\nJohannes", domain: "test.com", expected: "mailto:hi@example.com?body=Hello%0AJohannes", }, { desc: "mailto with already encoded space", tagName: "a", input: "mailto:hi@example.com?subject=Hello%20Johannes", domain: "test.com", expected: "mailto:hi@example.com?subject=Hello%20Johannes", }, { desc: "mailto with raw space", tagName: "a", input: "mailto:hi@example.com?subject=Greetings to Johannes", domain: "test.com", expected: "mailto:hi@example.com?subject=Greetings%20to%20Johannes", }, { desc: "mailto with german 'ä' character", tagName: "a", input: "mailto:hi@example.com?subject=Sie können gern einen Screenshot anhängen", domain: "test.com", // Note: While a space " " is allowed inside then
href attribute, // in markdown the space would cause the link to not be recognized. expected: "mailto:hi@example.com?subject=Sie%20k%C3%B6nnen%20gern%20einen%20Screenshot%20anh%C3%A4ngen", }, { desc: "mailto with link", tagName: "a", input: "mailto:hi@example.com?body=Article: www.website.com/page.html", domain: "test.com", expected: "mailto:hi@example.com?body=Article%3A%20www.website.com%2Fpage.html", }, { desc: "brackets inside link #1", tagName: "a", input: "foo(and(bar)", domain: "", expected: "foo%28and%28bar%29", }, { desc: "brackets inside link #2", tagName: "a", input: "[foo](uri)", domain: "", expected: "%5Bfoo%5D%28uri%29", }, } for _, run := range runs { t.Run(run.desc, func(t *testing.T) { res := defaultAssembleAbsoluteURL(run.tagName, run.input, run.domain) if res != run.expected { t.Errorf("expected '%s' but got '%s'", run.expected, res) } }) } } func TestParseAndEncodeQuery(t *testing.T) { runs := []struct { desc string input string expected string }{ { desc: "empty string", input: "", expected: "", }, { desc: "one pair", input: "a=1", expected: "a=1", }, { desc: "multiple pairs", input: "a=1&b=2&c=3", expected: "a=1&b=2&c=3", }, { desc: "keep order of multiple pairs", input: "a=1&c=2&b=3", expected: "a=1&c=2&b=3", }, { desc: "encode a space", input: "a=hello world&b=hello", expected: "a=hello+world&b=hello", }, { desc: "value with space is encoded with percent", input: "key=%20", expected: "key=+", }, { desc: "key with space is encoded with percent", input: "%20=value", expected: "+=value", }, { desc: "key with space is encoded with plus", input: "key=+", expected: "key=+", }, { desc: "value with space is encoded with plus", input: "+=value", expected: "+=value", }, { desc: "continue on error at value", // The error would be: // invalid URL escape "%" input: "a=1&b=%&c=hello world", expected: "a=1&b=%&c=hello+world", }, { desc: "continue on error at key", // The error would be: // invalid URL escape "%" input: "a=1&%=2&c=hello world", expected: "a=1&%=2&c=hello+world", }, } for _, run := range runs { t.Run(run.desc, func(t *testing.T) { output := ParseAndEncodeQuery(run.input) if output != run.expected { t.Errorf("expected '%s' but got '%s'", run.expected, output) } }) } } golang-github-johanneskaufmann-html-to-markdown-2.3.1/examples/000077500000000000000000000000001476711565700246335ustar00rootroot00000000000000golang-github-johanneskaufmann-html-to-markdown-2.3.1/examples/basics/000077500000000000000000000000001476711565700260775ustar00rootroot00000000000000golang-github-johanneskaufmann-html-to-markdown-2.3.1/examples/basics/main.go000066400000000000000000000004571476711565700273600ustar00rootroot00000000000000package main import ( "fmt" "log" htmltomarkdown "github.com/JohannesKaufmann/html-to-markdown/v2" ) func main() { input := `Bold Text` markdown, err := htmltomarkdown.ConvertString(input) if err != nil { log.Fatal(err) } fmt.Println(markdown) // Output: **Bold Text** } golang-github-johanneskaufmann-html-to-markdown-2.3.1/examples/options/000077500000000000000000000000001476711565700263265ustar00rootroot00000000000000golang-github-johanneskaufmann-html-to-markdown-2.3.1/examples/options/main.go000066400000000000000000000012061476711565700276000ustar00rootroot00000000000000package main import ( "fmt" "log" "github.com/JohannesKaufmann/html-to-markdown/v2/converter" "github.com/JohannesKaufmann/html-to-markdown/v2/plugin/base" "github.com/JohannesKaufmann/html-to-markdown/v2/plugin/commonmark" ) func main() { input := `Bold Text` conv := converter.NewConverter( converter.WithPlugins( base.NewBasePlugin(), commonmark.NewCommonmarkPlugin( commonmark.WithStrongDelimiter("__"), // ...additional configurations for the plugin ), ), ) markdown, err := conv.ConvertString(input) if err != nil { log.Fatal(err) } fmt.Println(markdown) // Output: __Bold Text__ } golang-github-johanneskaufmann-html-to-markdown-2.3.1/examples/register/000077500000000000000000000000001476711565700264575ustar00rootroot00000000000000golang-github-johanneskaufmann-html-to-markdown-2.3.1/examples/register/main.go000066400000000000000000000032151476711565700277330ustar00rootroot00000000000000package main import ( "fmt" "log" "strconv" "strings" "github.com/JohannesKaufmann/dom" "github.com/JohannesKaufmann/html-to-markdown/v2/converter" "github.com/JohannesKaufmann/html-to-markdown/v2/plugin/base" "github.com/JohannesKaufmann/html-to-markdown/v2/plugin/commonmark" "golang.org/x/net/html" ) func main() { input := `

Golang five stars

Build simple, secure, scalable systems with Go

` conv := converter.NewConverter( converter.WithPlugins( base.NewBasePlugin(), commonmark.NewCommonmarkPlugin(), ), ) // Here we a registering a custom *renderer* for and pass in our function. conv.Register.RendererFor("star-rating", converter.TagTypeInline, renderStarRating, converter.PriorityStandard) markdown, err := conv.ConvertString(input) if err != nil { log.Fatal(err) } fmt.Println(markdown) // ## Golang ⭐️⭐️⭐️⭐️⭐️ // // Build simple, secure, *scalable* systems with Go } func renderStarRating(ctx converter.Context, w converter.Writer, node *html.Node) converter.RenderStatus { // The "github.com/JohannesKaufmann/dom" package provides helper functions // to interact with the html node, like getting the attribute "count". rawCount := dom.GetAttributeOr(node, "count", "0") count, _ := strconv.Atoi(rawCount) rating := strings.Repeat("⭐️", count) // Write the content w.WriteString(rating) // w.WriteString(" (") // ctx.RenderChildNodes(ctx, w, node) // w.WriteString(")") // And then return whether it was a *success* // or if the next renderer should be tried. return converter.RenderSuccess } golang-github-johanneskaufmann-html-to-markdown-2.3.1/go.mod000066400000000000000000000013421476711565700241230ustar00rootroot00000000000000module github.com/JohannesKaufmann/html-to-markdown/v2 go 1.22.1 toolchain go1.24.0 require ( github.com/JohannesKaufmann/dom v0.2.0 github.com/agnivade/levenshtein v1.2.1 github.com/andybalholm/cascadia v1.3.3 github.com/bmatcuk/doublestar/v4 v4.8.1 github.com/muesli/termenv v0.16.0 github.com/sebdah/goldie/v2 v2.5.5 github.com/yuin/goldmark v1.7.8 golang.org/x/net v0.35.0 ) require ( github.com/aymanbagabas/go-osc52/v2 v2.0.1 // indirect github.com/lucasb-eyer/go-colorful v1.2.0 // indirect github.com/mattn/go-isatty v0.0.20 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect github.com/rivo/uniseg v0.4.7 // indirect github.com/sergi/go-diff v1.3.1 // indirect golang.org/x/sys v0.30.0 // indirect ) golang-github-johanneskaufmann-html-to-markdown-2.3.1/go.sum000066400000000000000000000245541476711565700241620ustar00rootroot00000000000000github.com/JohannesKaufmann/dom v0.2.0 h1:1bragmEb19K8lHAqgFgqCpiPCFEZMTXzOIEjuxkUfLQ= github.com/JohannesKaufmann/dom v0.2.0/go.mod h1:57iSUl5RKric4bUkgos4zu6Xt5LMHUnw3TF1l5CbGZo= github.com/agnivade/levenshtein v1.2.1 h1:EHBY3UOn1gwdy/VbFwgo4cxecRznFk7fKWN1KOX7eoM= github.com/agnivade/levenshtein v1.2.1/go.mod h1:QVVI16kDrtSuwcpd0p1+xMC6Z/VfhtCyDIjcwga4/DU= github.com/andybalholm/cascadia v1.3.3 h1:AG2YHrzJIm4BZ19iwJ/DAua6Btl3IwJX+VI4kktS1LM= github.com/andybalholm/cascadia v1.3.3/go.mod h1:xNd9bqTn98Ln4DwST8/nG+H0yuB8Hmgu1YHNnWw0GeA= github.com/arbovm/levenshtein v0.0.0-20160628152529-48b4e1c0c4d0 h1:jfIu9sQUG6Ig+0+Ap1h4unLjW6YQJpKZVmUzxsD4E/Q= github.com/arbovm/levenshtein v0.0.0-20160628152529-48b4e1c0c4d0/go.mod h1:t2tdKJDJF9BV14lnkjHmOQgcvEKgtqs5a1N3LNdJhGE= github.com/aymanbagabas/go-osc52/v2 v2.0.1 h1:HwpRHbFMcZLEVr42D4p7XBqjyuxQH5SMiErDT4WkJ2k= github.com/aymanbagabas/go-osc52/v2 v2.0.1/go.mod h1:uYgXzlJ7ZpABp8OJ+exZzJJhRNQ2ASbcXHWsFqH8hp8= github.com/bmatcuk/doublestar/v4 v4.7.1 h1:fdDeAqgT47acgwd9bd9HxJRDmc9UAmPpc+2m0CXv75Q= github.com/bmatcuk/doublestar/v4 v4.7.1/go.mod h1:xBQ8jztBU6kakFMg+8WGxn0c6z1fTSPVIjEY1Wr7jzc= github.com/bmatcuk/doublestar/v4 v4.8.1 h1:54Bopc5c2cAvhLRAzqOGCYHYyhcDHsFF4wWIR5wKP38= github.com/bmatcuk/doublestar/v4 v4.8.1/go.mod h1:xBQ8jztBU6kakFMg+8WGxn0c6z1fTSPVIjEY1Wr7jzc= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/dgryski/trifles v0.0.0-20230903005119-f50d829f2e54 h1:SG7nF6SRlWhcT7cNTs5R6Hk4V2lcmLz2NsG2VnInyNo= github.com/dgryski/trifles v0.0.0-20230903005119-f50d829f2e54/go.mod h1:if7Fbed8SFyPtHLHbg49SI7NAdJiC5WIA09pe59rfAA= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/lucasb-eyer/go-colorful v1.2.0 h1:1nnpGOrhyZZuNyfu1QjKiUICQ74+3FNCN69Aj6K7nkY= github.com/lucasb-eyer/go-colorful v1.2.0/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0= github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/muesli/termenv v0.16.0 h1:S5AlUN9dENB57rsbnkPyfdGuWIlkmzJjbFf0Tf5FWUc= github.com/muesli/termenv v0.16.0/go.mod h1:ZRfOIKPFDYQoDFF4Olj7/QJbW60Ol/kL1pU3VfY/Cnk= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ= github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= github.com/sebdah/goldie/v2 v2.5.5 h1:rx1mwF95RxZ3/83sdS4Yp7t2C5TCokvWP4TBRbAyEWY= github.com/sebdah/goldie/v2 v2.5.5/go.mod h1:oZ9fp0+se1eapSRjfYbsV/0Hqhbuu3bJVvKI/NNtssI= github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= github.com/sergi/go-diff v1.3.1 h1:xkr+Oxo4BOQKmkn/B9eMK0g5Kg/983T9DqqPHwYqD+8= github.com/sergi/go-diff v1.3.1/go.mod h1:aMJSSKb2lpPvRNec0+w3fl7LP9IOFzdc9Pa4NFbPK1I= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= github.com/yuin/goldmark v1.7.8 h1:iERMLn0/QJeHFhxSt3p6PeN9mGnvIKSpG9YYorDMnic= github.com/yuin/goldmark v1.7.8/go.mod h1:uzxRWxtg69N339t3louHJ7+O03ezfj6PlliRlaOzY1E= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc= golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU= golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8= golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.15.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk= golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= golang.org/x/net v0.33.0/go.mod h1:HXLR5J+9DxmrqMwG9qjGCxZ+zKXxBru04zlTvWlWuN4= golang.org/x/net v0.35.0 h1:T5GQRQb2y08kTAByq9L4/bz8cipCdA8FbRTXewonqY8= golang.org/x/net v0.35.0/go.mod h1:EglIi67kWsHKlRzzVMUD93VMSWGFOMSZgxFjparz1Qk= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.30.0 h1:QjkSwP/36a20jFYWkSue1YwXzLmsV5Gfq7Eiy72C1uc= golang.org/x/sys v0.30.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/telemetry v0.0.0-20240228155512-f48c80bd79b2/go.mod h1:TeRTkGYfJXctD9OcfyVLyj2J3IxLnKwHJR8f4D8a3YE= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU= golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk= golang.org/x/term v0.20.0/go.mod h1:8UkIAJTvZgivsXaD6/pH6U9ecQzZ45awqEOzuCvwpFY= golang.org/x/term v0.27.0/go.mod h1:iMsnZpn0cago0GOrHO2+Y7u7JPn5AylBrcoWkElMTSM= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58= golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= golang-github-johanneskaufmann-html-to-markdown-2.3.1/internal/000077500000000000000000000000001476711565700246315ustar00rootroot00000000000000golang-github-johanneskaufmann-html-to-markdown-2.3.1/internal/domutils/000077500000000000000000000000001476711565700264715ustar00rootroot00000000000000golang-github-johanneskaufmann-html-to-markdown-2.3.1/internal/domutils/add_space.go000066400000000000000000000026231476711565700307260ustar00rootroot00000000000000package domutils import ( "context" "github.com/JohannesKaufmann/dom" "golang.org/x/net/html" ) func getFirstChildNode(startNode *html.Node, matchFn func(n *html.Node) bool) *html.Node { node := startNode.FirstChild for node != nil { name := dom.NodeName(node) if name == "span" { // A span has no special meaning. So we just skip it... node = dom.GetNextNeighborNode(node) } else if matchFn(node) { return node } else { return nil } } return nil } func getLastChildNode(startNode *html.Node, matchFn func(n *html.Node) bool) *html.Node { node := startNode.LastChild for node != nil { name := dom.NodeName(node) if name == "span" { // A span has no special meaning. So we just skip it... node = dom.GetPrevNeighborNode(node) } else if matchFn(node) { return node } else { return nil } } return nil } func AddSpace(ctx context.Context, doc *html.Node, isOuterNode, isInnerNode func(*html.Node) bool) { node := doc for node != nil { if isOuterNode(node) { firstChild := getFirstChildNode(node, isInnerNode) if firstChild != nil { prev := getPrevTextNode(node) if prev != nil { prev.Data = prev.Data + " " } } lastChild := getLastChildNode(node, isInnerNode) if lastChild != nil { next := getNextTextNode(node) if next != nil { next.Data = " " + next.Data } } } node = dom.GetNextNeighborElement(node) } } golang-github-johanneskaufmann-html-to-markdown-2.3.1/internal/domutils/add_space_test.go000066400000000000000000000023571476711565700317710ustar00rootroot00000000000000package domutils import ( "context" "testing" "github.com/JohannesKaufmann/dom" "github.com/JohannesKaufmann/html-to-markdown/v2/internal/tester" "golang.org/x/net/html" ) func TestAddSpace(t *testing.T) { runs := []struct { desc string input string expected string }{ { desc: "space needed before & after", input: `beforeinline codeafter`, expected: ` ├─body │ ├─#text "before " │ ├─strong │ │ ├─code │ │ │ ├─#text "inline code" │ ├─#text " after" `, }, { desc: "no surrounding text", input: `inline code`, expected: ` ├─body │ ├─strong │ │ ├─code │ │ │ ├─#text "inline code" `, }, } for _, run := range runs { t.Run(run.desc, func(t *testing.T) { doc := tester.Parse(t, run.input, "") AddSpace(context.Background(), doc, func(n *html.Node) bool { name := dom.NodeName(n) if name == "strong" || name == "b" { return true } if name == "em" || name == "i" { return true } return false }, func(n *html.Node) bool { return dom.NodeName(n) == "code" }) tester.ExpectRepresentation(t, doc, "output", run.expected) }) } } golang-github-johanneskaufmann-html-to-markdown-2.3.1/internal/domutils/adjacent.go000066400000000000000000000031451476711565700305740ustar00rootroot00000000000000package domutils import ( "github.com/JohannesKaufmann/dom" "golang.org/x/net/html" ) func collectAdjacentNodes(node *html.Node, matchFn func(n *html.Node) bool) []*html.Node { var collectedNodes []*html.Node node = node.NextSibling for node != nil { name := dom.NodeName(node) if name == "span" { // A span has no special meaning. So we just skip it... node = dom.GetNextNeighborNode(node) } else if matchFn(node) { collectedNodes = append(collectedNodes, node) node = dom.GetNextNeighborNodeExcludingOwnChild(node) } else { // Return the collected nodes return collectedNodes } } return collectedNodes } func mergeChildren(destinationNode *html.Node, nodes ...*html.Node) { for _, node := range nodes { // We move all the children to the `destinationNode`. children := dom.AllChildNodes(node) for _, child := range children { dom.RemoveNode(child) destinationNode.AppendChild(child) } dom.RemoveNode(node) } } func MergeAdjacent(doc *html.Node, matchFn func(*html.Node) bool) { node := doc for node != nil { if matchFn(node) { nextNodes := collectAdjacentNodes(node, matchFn) mergeChildren(node, nextNodes...) } node = dom.GetNextNeighborElement(node) } } // - - - - - - - - // func MergeAdjacentTextNodes(n *html.Node) { if n == nil { return } var prev *html.Node for c := n.FirstChild; c != nil; { next := c.NextSibling if c.Type == html.TextNode && prev != nil && prev.Type == html.TextNode { // Combine adjacent text nodes prev.Data += c.Data n.RemoveChild(c) } else { MergeAdjacentTextNodes(c) prev = c } c = next } } golang-github-johanneskaufmann-html-to-markdown-2.3.1/internal/domutils/adjacent_test.go000066400000000000000000000146021476711565700316330ustar00rootroot00000000000000package domutils import ( "testing" "github.com/JohannesKaufmann/dom" "github.com/JohannesKaufmann/html-to-markdown/v2/internal/tester" "golang.org/x/net/html" ) func TestMergeAdjacent(t *testing.T) { runs := []struct { desc string input string expected string }{ { desc: "don't change other tags", input: `a b`, expected: ` ├─body │ ├─span │ │ ├─#text "a" │ ├─#text " " │ ├─span │ │ ├─#text "b" `, }, { desc: "don't change simple strong", input: `a`, expected: ` ├─body │ ├─strong │ │ ├─#text "a" `, }, { desc: "dont merge two adjacent strong tags with space between", input: `a b`, expected: ` ├─body │ ├─strong │ │ ├─#text "a" │ ├─#text " " │ ├─strong │ │ ├─#text "b" `, }, { desc: "merge two adjacent strong tags without space between", input: `ab`, expected: ` ├─body │ ├─strong │ │ ├─#text "a" │ │ ├─#text "b" `, }, { desc: "merge three adjacent strong tags without space between", input: `abc`, expected: ` ├─body │ ├─strong │ │ ├─#text "a" │ │ ├─#text "b" │ │ ├─#text "c" `, }, { desc: "merge four adjacent strong tags without space between", input: `abcd`, expected: ` ├─body │ ├─strong │ │ ├─#text "a" │ │ ├─#text "b" │ │ ├─#text "c" │ │ ├─#text "d" `, }, { desc: "dont merge if there is tag content between", input: `a

between

b`, expected: ` ├─body │ ├─strong │ │ ├─#text "a" │ ├─p │ │ ├─#text "between" │ ├─strong │ │ ├─#text "b" `, }, { desc: "dont merge if there is #text content between", input: `a between b`, expected: ` ├─body │ ├─strong │ │ ├─#text "a" │ ├─#text " between " │ ├─strong │ │ ├─#text "b" `, }, { desc: "dont merge if there is break between", input: `a
b`, expected: ` ├─body │ ├─strong │ │ ├─#text "a" │ ├─br │ ├─strong │ │ ├─#text "b" `, }, { desc: "merge three adjacent italic tags without space between", input: `abc`, expected: ` ├─body │ ├─em │ │ ├─#text "a" │ │ ├─#text "b" │ │ ├─#text "c" `, }, { desc: "dont merge two nested strong tags with space between", input: `
A
B`, expected: ` ├─body │ ├─div │ │ ├─strong │ │ │ ├─#text "A" │ ├─#text " " │ ├─strong │ │ ├─#text "B" `, }, { desc: "(for now) dont merge nested strongs inside div", input: `
A
B`, expected: ` ├─body │ ├─div │ │ ├─strong │ │ │ ├─#text "A" │ ├─strong │ │ ├─#text "B" `, }, { desc: "(for now) dont merge deeply nested strongs inside div", input: `
A
b
`, expected: ` ├─body │ ├─div │ │ ├─div │ │ │ ├─div │ │ │ │ ├─strong │ │ │ │ │ ├─#text "A" │ │ ├─div │ │ │ ├─strong │ │ │ │ ├─#text "b" `, }, { desc: "dont merge two nested strong tags enclosed in a", input: `
AB`, expected: ` ├─body │ ├─a (href="/") │ │ ├─strong │ │ │ ├─#text "A" │ ├─strong │ │ ├─#text "B" `, }, // - - - - - - - - - - - Span - - - - - - - - - - - // { desc: "merge next strong nested in span #1", input: `

abother text

`, expected: ` ├─body │ ├─p │ │ ├─strong │ │ │ ├─#text "a" │ │ │ ├─#text "b" │ │ ├─span │ │ ├─#text "other text" `, }, { desc: "merge next strong nested in span #2", input: `

abother text

`, expected: ` ├─body │ ├─p │ │ ├─strong │ │ │ ├─#text "a" │ │ │ ├─#text "b" │ │ ├─span │ │ │ ├─span │ │ ├─#text "other text" `, }, { desc: "merge next strong nested in span #3", input: `

abcother text

`, expected: ` ├─body │ ├─p │ │ ├─strong │ │ │ ├─#text "a" │ │ │ ├─#text "b" │ │ │ ├─#text "c" │ │ ├─span │ │ ├─span │ │ │ ├─#text "other text" `, }, { desc: "dont merge other span tags", input: `

aother text

`, expected: ` ├─body │ ├─p │ │ ├─strong │ │ │ ├─#text "a" │ │ ├─span │ │ │ ├─#text "other text" `, }, { desc: "dont merge span content if space between", input: `

a b

`, expected: ` ├─body │ ├─p │ │ ├─strong │ │ │ ├─#text "a" │ │ ├─span │ │ │ ├─#text " " │ │ │ ├─strong │ │ │ │ ├─#text "b" `, }, } for _, run := range runs { t.Run(run.desc, func(t *testing.T) { doc := tester.Parse(t, run.input, "") MergeAdjacent(doc, func(n *html.Node) bool { name := dom.NodeName(n) return name == "strong" || name == "em" }) tester.ExpectRepresentation(t, doc, "output", run.expected) }) } } func TestMergeAdjacentTextNodes(t *testing.T) { div := &html.Node{ Type: html.ElementNode, Data: "div", } textOne := &html.Node{ Type: html.TextNode, Data: "one", } textTwo := &html.Node{ Type: html.TextNode, Data: "two", } textThree := &html.Node{ Type: html.TextNode, Data: "three", } div.AppendChild(textOne) div.AppendChild(textTwo) div.AppendChild(textThree) MergeAdjacentTextNodes(div) expected := ` div ├─#text "onetwothree" ` tester.ExpectRepresentation(t, div, "output", expected) } golang-github-johanneskaufmann-html-to-markdown-2.3.1/internal/domutils/alternatives.go000066400000000000000000000060171476711565700315250ustar00rootroot00000000000000package domutils import ( "context" "github.com/JohannesKaufmann/dom" "golang.org/x/net/html" ) // TODO: make this configurable via the options??? func getMarkdownStructure(name string) string { switch name { case "#document", "html", "head", "body", "blockquote", "ul", "ol", "li": // A container block can also contain other blocks. return "container_block" // Note: "p" would also be part of "leaf_block" case "hr", "pre", "h1", "h2", "h3", "h4", "h5", "h6": // Leaf blocks can contain inline content // but NOT other blocks. return "leaf_block" case "#text", "span", "code", "b", "strong", "i", "em", "a", "img", "br": return "inline" case "div", "p": // Since these are just placing newlines, // we dont categorize them. return "" default: return "" } } func headingAlternative(ctx context.Context, node *html.Node) { node.Data = "strong" newChild := &html.Node{ Type: html.ElementNode, Data: "br", } node.Parent.InsertBefore(newChild, node.NextSibling) } func blockquoteAlternative(ctx context.Context, node *html.Node) { newBefore := &html.Node{Type: html.TextNode, Data: ` "`} node.Parent.InsertBefore(newBefore, node) node.Data = "span" newAfter := &html.Node{Type: html.TextNode, Data: `" `} node.Parent.InsertBefore(newAfter, node.NextSibling) } func preAlternative(ctx context.Context, node *html.Node) { node.Data = "code" } func hrAlternative(ctx context.Context, node *html.Node) { dom.RemoveNode(node) } // TODO: make this configurable via the options? var alternatives = map[string]func(ctx context.Context, node *html.Node){ "h1": headingAlternative, "h2": headingAlternative, "h3": headingAlternative, "h4": headingAlternative, "h5": headingAlternative, "h6": headingAlternative, "blockquote": blockquoteAlternative, "pre": preAlternative, "hr": hrAlternative, } func LeafBlockAlternatives(ctx context.Context, doc *html.Node) { var finder func(node *html.Node, isInsideLeafBlock bool, isInsideInline bool) finder = func(node *html.Node, isInsideLeafBlock bool, isInsideInline bool) { name := dom.NodeName(node) structure := getMarkdownStructure(name) if (structure == "container_block" || structure == "leaf_block") && (isInsideLeafBlock || isInsideInline) { // A block inside an inline OR a block inside a leaf-block // is not valid markdown so cannot be rendered. // // For example, you cannot place a blockquote inside a heading. // // Instead of this weird output (## Heading > My Quote) // we try to find alternatives (## Heading "My Quote") fn, ok := alternatives[name] if ok { fn(ctx, node) } else { node.Data = "span" } } // - - - - - - - - - - - - - - - - - - - - - - // if structure == "leaf_block" { isInsideLeafBlock = true } if structure == "inline" { isInsideInline = true } for child := node.FirstChild; child != nil; child = child.NextSibling { defer finder(child, isInsideLeafBlock, isInsideInline) } } finder(doc, false, false) } golang-github-johanneskaufmann-html-to-markdown-2.3.1/internal/domutils/alternatives_test.go000066400000000000000000000030671476711565700325660ustar00rootroot00000000000000package domutils import ( "context" "testing" "github.com/JohannesKaufmann/html-to-markdown/v2/internal/tester" ) func TestLeafBlockAlternatives(t *testing.T) { runs := []struct { desc string input string expected string }{ { desc: "divider in heading", input: `

Heading

`, expected: ` ├─body │ ├─h3 │ │ ├─#text "Heading" `, }, { desc: "simple", input: `

Heading

`, expected: ` ├─body │ ├─a (href="/page.html") │ │ ├─strong │ │ │ ├─#text "Heading" │ │ ├─br `, }, { desc: "two headings", input: `

Heading A

Heading B

`, expected: ` ├─body │ ├─a (href="/page.html") │ │ ├─strong │ │ │ ├─#text "Heading A" │ │ ├─br │ │ ├─strong │ │ │ ├─#text "Heading B" │ │ ├─br `, }, { desc: "two headings formatted", input: `

Heading A

Heading B

`, expected: ` ├─body │ ├─a (href="/page.html") │ │ ├─#text "\n\t" │ │ ├─strong │ │ │ ├─#text "Heading A" │ │ ├─br │ │ ├─#text "\n\t" │ │ ├─strong │ │ │ ├─#text "Heading B" │ │ ├─br │ │ ├─#text "\n" `, }, } for _, run := range runs { t.Run(run.desc, func(t *testing.T) { doc := tester.Parse(t, run.input, "") LeafBlockAlternatives(context.TODO(), doc) tester.ExpectRepresentation(t, doc, "output", run.expected) }) } } golang-github-johanneskaufmann-html-to-markdown-2.3.1/internal/domutils/domutils.go000066400000000000000000000015041476711565700306600ustar00rootroot00000000000000package domutils import ( "github.com/JohannesKaufmann/dom" "golang.org/x/net/html" ) func getNextTextNode(startNode *html.Node) *html.Node { node := dom.GetNextNeighborNodeExcludingOwnChild(startNode) for node != nil { if node.Type == html.TextNode { return node } if dom.NodeName(node) == "span" { // A span has no special meaning. So we just skip it... node = dom.GetNextNeighborNode(node) continue } return nil } return nil } func getPrevTextNode(startNode *html.Node) *html.Node { node := dom.GetPrevNeighborNodeExcludingOwnChild(startNode) for node != nil { if node.Type == html.TextNode { return node } if dom.NodeName(node) == "span" { // A span has no special meaning. So we just skip it... node = dom.GetPrevNeighborNode(node) continue } return nil } return nil } golang-github-johanneskaufmann-html-to-markdown-2.3.1/internal/domutils/empty_code.go000066400000000000000000000014001476711565700311430ustar00rootroot00000000000000package domutils import ( "context" "github.com/JohannesKaufmann/dom" "golang.org/x/net/html" ) func hasTextChildNodes(startNode *html.Node) bool { var found bool var finder func(*html.Node) finder = func(node *html.Node) { if node.Type == html.TextNode && node.Data != "" { found = true return } for child := node.FirstChild; child != nil; child = child.NextSibling { finder(child) } } finder(startNode) return found } func RemoveEmptyCode(ctx context.Context, doc *html.Node) { node := doc for node != nil { if dom.NodeName(node) == "code" && !hasTextChildNodes(node) { next := dom.GetNextNeighborNodeExcludingOwnChild(node) dom.RemoveNode(node) node = next continue } node = dom.GetNextNeighborNode(node) } } golang-github-johanneskaufmann-html-to-markdown-2.3.1/internal/domutils/empty_code_test.go000066400000000000000000000025041476711565700322100ustar00rootroot00000000000000package domutils import ( "context" "testing" "github.com/JohannesKaufmann/html-to-markdown/v2/internal/tester" ) func TestRemoveEmptyCode(t *testing.T) { runs := []struct { desc string input string expectedBefore string expectedAfter string }{ { desc: "", input: `

before

middle
after

`, expectedBefore: ` ├─body │ ├─p │ │ ├─#text "before" │ │ ├─code │ ├─pre │ │ ├─code │ │ │ ├─#text "middle" │ ├─#text "after" │ ├─p `, expectedAfter: ` ├─body │ ├─p │ │ ├─#text "before" │ ├─pre │ │ ├─code │ │ │ ├─#text "middle" │ ├─#text "after" │ ├─p `, }, { desc: "two empty code nodes", input: `

between

`, expectedBefore: ` ├─body │ ├─p │ │ ├─code │ ├─#text "between" │ ├─p │ │ ├─code `, expectedAfter: ` ├─body │ ├─p │ ├─#text "between" │ ├─p `, }, } for _, run := range runs { t.Run(run.desc, func(t *testing.T) { doc := tester.Parse(t, run.input, "") tester.ExpectRepresentation(t, doc, "before", run.expectedBefore) RemoveEmptyCode(context.TODO(), doc) tester.ExpectRepresentation(t, doc, "output", run.expectedAfter) }) } } golang-github-johanneskaufmann-html-to-markdown-2.3.1/internal/domutils/list_end_comment.go000066400000000000000000000026531476711565700323510ustar00rootroot00000000000000package domutils import ( "context" "github.com/JohannesKaufmann/dom" "golang.org/x/net/html" ) var ListEndCommentData = "THE END" func AddListEndComments(ctx context.Context, doc *html.Node) { node := doc for node != nil { if nameIsList(node) && nextNameIsList(node) { insertComment(node) } node = dom.GetNextNeighborElement(node) } } func nameIsList(node *html.Node) bool { name := dom.NodeName(node) return name == "ul" || name == "ol" } func insertComment(listNode *html.Node) { comment := &html.Node{ Type: html.CommentNode, Data: ListEndCommentData, } listNode.Parent.InsertBefore(comment, listNode.NextSibling) } func nextNameIsList(startNode *html.Node) bool { node := dom.GetNextNeighborNodeExcludingOwnChild(startNode) for node != nil { name := dom.NodeName(node) if name == "ul" || name == "ol" { return true } if name == "li" { return false } if name == "#comment" && node.Data == ListEndCommentData { return false } // If there is any text between two lists // they are automatically not connected anymore. if node.Type == html.TextNode { return false } // - - - - // if name == "hr" { // A divider already seperates two lists... return false } // TODO: RunContext.Render() // -> get acess to keepRemoveMap // TODO: look in the KeepRemoveMap? // e.g. ul then script then ul node = dom.GetNextNeighborNode(node) continue } return false } golang-github-johanneskaufmann-html-to-markdown-2.3.1/internal/domutils/list_items.go000066400000000000000000000026071476711565700312010ustar00rootroot00000000000000package domutils import ( "context" "strings" "github.com/JohannesKaufmann/dom" "golang.org/x/net/html" "golang.org/x/net/html/atom" ) // MoveListItems moves non-"li" nodes into the previous "li" nodes. func MoveListItems(ctx context.Context, n *html.Node) { if n.Type == html.ElementNode && (n.Data == "ol" || n.Data == "ul") { var previousLi *html.Node // Collect children to avoid modifying the slice while iterating. children := dom.AllChildNodes(n) for _, child := range children { if child.Type == html.ElementNode && child.Data == "li" { previousLi = child } else if child.Type == html.TextNode && strings.TrimSpace(child.Data) == "" { // Skip the node, probably just formatting of code } else { // We expect that inside an "ol"/"ul" there are *only* "li" nodes. // But sometimes that is not the case... if previousLi != nil { // There is a previous "li" node, // so we move this content into the other "li" node. n.RemoveChild(child) previousLi.AppendChild(child) } else { // There is no previous "li" node, // so we wrap this node with it's own "li" node. newNode := &html.Node{ Type: html.ElementNode, DataAtom: atom.Li, Data: "li", } previousLi = dom.WrapNode(child, newNode) } } } } for c := n.FirstChild; c != nil; c = c.NextSibling { MoveListItems(ctx, c) } } golang-github-johanneskaufmann-html-to-markdown-2.3.1/internal/domutils/list_items_test.go000066400000000000000000000046331476711565700322410ustar00rootroot00000000000000package domutils import ( "context" "testing" "github.com/JohannesKaufmann/html-to-markdown/v2/internal/tester" ) func TestMoveListItems(t *testing.T) { runs := []struct { desc string input string expected string }{ { desc: "not needed in normal list", input: "
  • A
  • B
  • C
", expected: ` ├─body │ ├─div │ │ ├─ul │ │ │ ├─li │ │ │ │ ├─#text "A" │ │ │ ├─li │ │ │ │ ├─#text "B" │ │ │ ├─li │ │ │ │ ├─#text "C" `, }, { desc: "#text moves into the previous li", input: "
  • A
  • B
", expected: ` ├─body │ ├─ul │ │ ├─li │ │ │ ├─#text "A" │ │ │ ├─#text "B" `, }, { desc: "div moves into the previous li", input: "
  • A
  • B
", expected: ` ├─body │ ├─ul │ │ ├─li │ │ │ ├─#text "A" │ │ │ ├─div │ │ │ │ ├─#text "B" `, }, { desc: "ol moves into the previous li", input: "
  • A
    1. B
", expected: ` ├─body │ ├─ul │ │ ├─li │ │ │ ├─#text "A" │ │ │ ├─ol │ │ │ │ ├─li │ │ │ │ │ ├─#text "B" `, }, { desc: "no existing li", input: "
    AB
", expected: ` ├─body │ ├─ul │ │ ├─li │ │ │ ├─span │ │ │ │ ├─#text "A" │ │ │ ├─span │ │ │ │ ├─#text "B" `, }, { desc: "basic moved list", input: `
  1. One
  2. Two
    1. Two point one
    2. Two point two
`, expected: ` ├─body │ ├─ol │ │ ├─#text "\n\t" │ │ ├─li │ │ │ ├─#text "One" │ │ ├─#text "\n\t" │ │ ├─li │ │ │ ├─#text "Two" │ │ │ ├─ol │ │ │ │ ├─#text "\n\t\t" │ │ │ │ ├─li │ │ │ │ │ ├─#text "Two point one" │ │ │ │ ├─#text "\n\t\t" │ │ │ │ ├─li │ │ │ │ │ ├─#text "Two point two" │ │ │ │ ├─#text "\n\t" │ │ ├─#text "\n\t" │ │ ├─#text "\n" `, }, } for _, run := range runs { t.Run(run.desc, func(t *testing.T) { doc := tester.Parse(t, run.input, "") MoveListItems(context.TODO(), doc) tester.ExpectRepresentation(t, doc, "output", run.expected) }) } } golang-github-johanneskaufmann-html-to-markdown-2.3.1/internal/domutils/redundant.go000066400000000000000000000010151476711565700310010ustar00rootroot00000000000000package domutils import ( "github.com/JohannesKaufmann/dom" "golang.org/x/net/html" ) func RemoveRedundant(doc *html.Node, matchFn func(*html.Node, *html.Node) bool) { for _, node := range dom.AllNodes(doc) { if hasSameTypeAncestor(node, matchFn) { dom.UnwrapNode(node) } } } func hasSameTypeAncestor(n *html.Node, matchFn func(*html.Node, *html.Node) bool) bool { if !matchFn(n, n) { return false } for p := n.Parent; p != nil; p = p.Parent { if matchFn(n, p) { return true } } return false } golang-github-johanneskaufmann-html-to-markdown-2.3.1/internal/domutils/redundant_test.go000066400000000000000000000041651476711565700320510ustar00rootroot00000000000000package domutils import ( "testing" "github.com/JohannesKaufmann/dom" "github.com/JohannesKaufmann/html-to-markdown/v2/internal/tester" "golang.org/x/net/html" ) func TestRemoveRedundant(t *testing.T) { runs := []struct { desc string input string expected string }{ { desc: "don't change other tags", input: `a b`, expected: ` ├─body │ ├─span │ │ ├─#text "a" │ ├─#text " " │ ├─span │ │ ├─#text "b" `, }, { desc: "don't change simple strong", input: `a`, expected: ` ├─body │ ├─strong │ │ ├─#text "a" `, }, { desc: "remove double strong", input: `a`, expected: ` ├─body │ ├─strong │ │ ├─#text "a" `, }, { desc: "remove more complicated double strong", input: `a b c`, expected: ` ├─body │ ├─strong │ │ ├─#text "a" │ │ ├─#text " b " │ │ ├─#text "c" `, }, { desc: "leave italic inside bold", input: `ABC`, expected: ` ├─body │ ├─strong │ │ ├─#text "A" │ │ ├─em │ │ │ ├─#text "B" │ │ ├─#text "C" `, }, { desc: "dont leave other italic inside another italic", input: `ABC`, expected: ` ├─body │ ├─i │ │ ├─#text "A" │ │ ├─#text "B" │ │ ├─#text "C" `, }, } for _, run := range runs { t.Run(run.desc, func(t *testing.T) { doc := tester.Parse(t, run.input, "") RemoveRedundant(doc, func(a, b *html.Node) bool { isItalic := func(n *html.Node) bool { name := dom.NodeName(n) return name == "em" || name == "i" } isBold := func(n *html.Node) bool { name := dom.NodeName(n) return name == "strong" || name == "b" } if isItalic(a) && isItalic(b) { return true } if isBold(a) && isBold(b) { return true } return false }) tester.ExpectRepresentation(t, doc, "output", run.expected) }) } } golang-github-johanneskaufmann-html-to-markdown-2.3.1/internal/domutils/span.go000066400000000000000000000016561476711565700277710ustar00rootroot00000000000000package domutils import ( "context" "github.com/JohannesKaufmann/dom" "golang.org/x/net/html" ) func isFakeSpan(node *html.Node) bool { name := dom.NodeName(node) if name != "span" { return false } var containsBlockNode = false var finder func(*html.Node) finder = func(node *html.Node) { name := dom.NodeName(node) if dom.NameIsBlockNode(name) { containsBlockNode = true return } for child := node.FirstChild; child != nil; child = child.NextSibling { finder(child) } } finder(node) return containsBlockNode } // RenameFakeSpans renames all "span" nodes to "div" if // any block element is found as a child. func RenameFakeSpans(ctx context.Context, doc *html.Node) { var finder func(node *html.Node) finder = func(node *html.Node) { if isFakeSpan(node) { node.Data = "div" } for child := node.FirstChild; child != nil; child = child.NextSibling { finder(child) } } finder(doc) } golang-github-johanneskaufmann-html-to-markdown-2.3.1/internal/domutils/span_test.go000066400000000000000000000027251476711565700310260ustar00rootroot00000000000000package domutils import ( "context" "testing" "github.com/JohannesKaufmann/html-to-markdown/v2/internal/tester" ) func TestRenameFakeSpans(t *testing.T) { runs := []struct { desc string input string expected string }{ { desc: "don't change other tags", input: `

a

b

`, expected: ` ├─body │ ├─p │ │ ├─#text "a" │ ├─#text " " │ ├─p │ │ ├─#text "b" `, }, { desc: "don't change simple span", input: `a`, expected: ` ├─body │ ├─span │ │ ├─#text "a" `, }, { desc: "don't change span with inline element", input: `link content`, expected: ` ├─body │ ├─span │ │ ├─a │ │ │ ├─#text "link content" `, }, { desc: "change span with block element", input: `

paragraph content

`, expected: ` ├─body │ ├─div │ │ ├─p │ │ │ ├─#text "paragraph content" `, }, { desc: "change multiple spans with block element", input: `

paragraph content

`, expected: ` ├─body │ ├─div │ │ ├─div │ │ │ ├─p │ │ │ │ ├─#text "paragraph content" `, }, } for _, run := range runs { t.Run(run.desc, func(t *testing.T) { doc := tester.Parse(t, run.input, "") RenameFakeSpans(context.TODO(), doc) tester.ExpectRepresentation(t, doc, "output", run.expected) }) } } golang-github-johanneskaufmann-html-to-markdown-2.3.1/internal/domutils/swap.go000066400000000000000000000022011476711565700277650ustar00rootroot00000000000000package domutils import ( "context" "slices" "strings" "github.com/JohannesKaufmann/dom" "golang.org/x/net/html" ) func swapTagsOfNodes(node1, node2 *html.Node) { if node1.Type != html.ElementNode || node2.Type != html.ElementNode { panic("swap only works with element nodes") } tempDataAtom := node1.DataAtom tempData := node1.Data tempAttr := node1.Attr node1.DataAtom = node2.DataAtom node1.Data = node2.Data node1.Attr = node2.Attr node2.DataAtom = tempDataAtom node2.Data = tempData node2.Attr = tempAttr } func isEmptyText(node *html.Node) bool { return node.Type == html.TextNode && strings.TrimSpace(node.Data) == "" } func SwapTags(ctx context.Context, doc *html.Node, isOuterNode, isInnerNode func(*html.Node) bool) { var finder func(*html.Node) finder = func(node *html.Node) { if isOuterNode(node) { childs := dom.AllChildNodes(node) childs = slices.DeleteFunc(childs, isEmptyText) if len(childs) == 1 && isInnerNode(childs[0]) { swapTagsOfNodes(node, childs[0]) return } } for child := node.FirstChild; child != nil; child = child.NextSibling { finder(child) } } finder(doc) } golang-github-johanneskaufmann-html-to-markdown-2.3.1/internal/domutils/swap_test.go000066400000000000000000000262301476711565700310340ustar00rootroot00000000000000package domutils import ( "context" "testing" "github.com/JohannesKaufmann/dom" "github.com/JohannesKaufmann/html-to-markdown/v2/internal/tester" "golang.org/x/net/html" "golang.org/x/net/html/atom" ) func generateANodes() *html.Node { div := &html.Node{ Namespace: "", Type: html.ElementNode, DataAtom: atom.Div, Attr: []html.Attribute{}, Data: "div", } link := &html.Node{ Namespace: "", Type: html.ElementNode, DataAtom: atom.A, Attr: []html.Attribute{ { Namespace: "", Key: "KeyA", Val: "ValA", }, }, Data: "a", } text := &html.Node{ Namespace: "", Type: html.TextNode, DataAtom: 0, Data: "ContentA", } link.AppendChild(text) div.AppendChild(link) return div } func generateBNodes() *html.Node { div := &html.Node{ Namespace: "", Type: html.ElementNode, DataAtom: atom.Main, Attr: []html.Attribute{}, Data: "main", } link := &html.Node{ Namespace: "", Type: html.ElementNode, DataAtom: atom.B, Attr: []html.Attribute{ { Namespace: "", Key: "KeyB", Val: "ValB", }, }, Data: "b", } text := &html.Node{ Namespace: "", Type: html.TextNode, DataAtom: 0, Data: "ContentB", } link.AppendChild(text) div.AppendChild(link) return div } func TestSwapTagsOfNodes_Basics(t *testing.T) { a := generateANodes() b := generateBNodes() swapTagsOfNodes(a.FirstChild, b.FirstChild) // These fields should have changed: if a.FirstChild.DataAtom != atom.B { t.Error("expected different a atom") } if a.FirstChild.Data != "b" { t.Error("expected different a data") } if len(a.FirstChild.Attr) != 1 { t.Error("expected different a attributes length") } if a.FirstChild.Attr[0].Key != "KeyB" { t.Error("expected different a attribute key") } if a.FirstChild.Attr[0].Val != "ValB" { t.Error("expected different a attribute key") } // The pointers should NOT have changed: if a.FirstChild.Parent.Data != "div" { t.Error("expected the same parent for a") } if a.FirstChild.FirstChild.Data != "ContentA" { t.Error("expected the same text for a") } // - - - // if b.FirstChild.DataAtom != atom.A { t.Error("expected different b atom") } if b.FirstChild.Data != "a" { t.Error("expected different b data") } if len(b.FirstChild.Attr) != 1 { t.Error("expected different b attributes length") } if b.FirstChild.Attr[0].Key != "KeyA" { t.Error("expected different b attribute key") } if b.FirstChild.Attr[0].Val != "ValA" { t.Error("expected different b attribute key") } // The pointers should NOT have changed: if b.FirstChild.Parent.Data != "main" { t.Error("expected the same parent for b") } if b.FirstChild.FirstChild.Data != "ContentB" { t.Error("expected the same text for b") } } func TestSwapTags_HeadingLink(t *testing.T) { runs := []struct { desc string input string startFrom string expected string }{ { desc: "simple", input: `

Heading

`, startFrom: "body", expected: ` ├─body │ ├─h3 │ │ ├─a (href="/page.html") │ │ │ ├─#text "Heading" `, }, { desc: "simple with whitespace", input: `

Heading

`, startFrom: "body", expected: ` ├─body │ ├─h3 │ │ ├─#text "\n\t" │ │ ├─a (href="/page.html") │ │ │ ├─#text "Heading" │ │ ├─#text "\n" `, }, { desc: "more content", input: `

ReiseinspirationBeste Orte in Berlin

`, startFrom: "body", expected: ` ├─body │ ├─h3 │ │ ├─#text "\n\t" │ │ ├─a (href="/reisen") │ │ │ ├─span │ │ │ │ ├─#text "Reiseinspiration" │ │ │ ├─span │ │ │ │ ├─#text "Beste Orte in Berlin" │ │ ├─#text "\n" `, }, { desc: "not possible", input: `

Heading

Some other content

`, startFrom: "body", expected: ` ├─body │ ├─a (href="/page.html") │ │ ├─#text "\n\t" │ │ ├─h3 │ │ │ ├─#text "Heading" │ │ ├─#text "\n\t" │ │ ├─p │ │ │ ├─#text "Some other content" │ │ ├─#text "\n" `, }, } for _, run := range runs { t.Run(run.desc, func(t *testing.T) { doc := tester.Parse(t, run.input, run.startFrom) isLink := func(n *html.Node) bool { return dom.NodeName(n) == "a" } isHeading := func(n *html.Node) bool { name := dom.NodeName(n) if name == "h1" || name == "h2" || name == "h3" || name == "h4" || name == "h5" || name == "h6" { return true } return false } SwapTags(context.TODO(), doc, isLink, isHeading) tester.ExpectRepresentation(t, doc, "output", run.expected) }) } } func TestSwapTags_PreCode(t *testing.T) { runs := []struct { desc string input string expectedBefore string expectedAfter string }{ // - - - - - Pre - - - - - // { desc: "div with pre: keep", input: "
content
", expectedBefore: ` ├─body │ ├─div │ │ ├─pre │ │ │ ├─#text "content" `, expectedAfter: ` ├─body │ ├─div │ │ ├─pre │ │ │ ├─#text "content" `, }, { desc: "p with pre: keep", input: "

content

", // The
 is a block node, so cannot be in a paragraph.
			expectedBefore: `
├─body
│ ├─p
│ ├─pre
│ │ ├─#text "content"
│ ├─p
			`,
			expectedAfter: `
├─body
│ ├─p
│ ├─pre
│ │ ├─#text "content"
│ ├─p
			`,
		},
		// - - - - - Code - - - - - //
		{
			desc:  "div with code: keep",
			input: "
content
", expectedBefore: ` ├─body │ ├─div │ │ ├─code │ │ │ ├─#text "content" `, expectedAfter: ` ├─body │ ├─div │ │ ├─code │ │ │ ├─#text "content" `, }, { desc: "p with code: keep", input: "

content

", expectedBefore: ` ├─body │ ├─p │ │ ├─code │ │ │ ├─#text "content" `, expectedAfter: ` ├─body │ ├─p │ │ ├─code │ │ │ ├─#text "content" `, }, // - - - - - Nested in correct order - - - - - // { desc: "keep correct code block", input: `
content
`, expectedBefore: ` ├─body │ ├─div │ │ ├─pre │ │ │ ├─code │ │ │ │ ├─#text "content" `, expectedAfter: ` ├─body │ ├─div │ │ ├─pre │ │ │ ├─code │ │ │ │ ├─#text "content" `, }, // - - - - - Nested in wrong order - - - - - // { desc: "swap wrong code block", input: `
content
`, expectedBefore: ` ├─body │ ├─div │ │ ├─code │ │ │ ├─pre │ │ │ │ ├─#text "content" `, expectedAfter: ` ├─body │ ├─div │ │ ├─pre │ │ │ ├─code │ │ │ │ ├─#text "content" `, }, { desc: "html parsing already causes swap", input: `

content

`, // Notice how the html parsing already looks different... expectedBefore: ` ├─body │ ├─p │ │ ├─code │ ├─pre │ │ ├─code │ │ │ ├─#text "content" │ ├─p `, expectedAfter: ` ├─body │ ├─p │ │ ├─code │ ├─pre │ │ ├─code │ │ │ ├─#text "content" │ ├─p `, }, { desc: "different ast then expected", input: `

beforea

b
cafter

`, expectedBefore: ` ├─body │ ├─p │ │ ├─#text "before" │ │ ├─code │ │ │ ├─#text "a" │ ├─pre │ │ ├─code │ │ │ ├─#text "b" │ ├─code │ │ ├─#text "c" │ ├─#text "after" │ ├─p `, expectedAfter: ` ├─body │ ├─p │ │ ├─#text "before" │ │ ├─code │ │ │ ├─#text "a" │ ├─pre │ │ ├─code │ │ │ ├─#text "b" │ ├─code │ │ ├─#text "c" │ ├─#text "after" │ ├─p `, }, } for _, run := range runs { t.Run(run.desc, func(t *testing.T) { doc := tester.Parse(t, run.input, "") tester.ExpectRepresentation(t, doc, "before", run.expectedBefore) isCode := func(n *html.Node) bool { return dom.NodeName(n) == "code" } isPre := func(n *html.Node) bool { return dom.NodeName(n) == "pre" } SwapTags(context.TODO(), doc, isCode, isPre) tester.ExpectRepresentation(t, doc, "output", run.expectedAfter) }) } } func TestSwapTags_StrongLinks(t *testing.T) { runs := []struct { desc string input string expectedAfter string }{ { desc: "swap strong and link", input: `

beforemiddleafter

`, expectedAfter: ` ├─body │ ├─p │ │ ├─#text "before" │ │ ├─a (href="/") │ │ │ ├─strong │ │ │ │ ├─#text "middle" │ │ ├─#text "after" `, }, { desc: "empty span", input: `

beforewith empty spanafter

`, expectedAfter: ` ├─body │ ├─p │ │ ├─#text "before" │ │ ├─strong │ │ │ ├─span │ │ │ ├─a (href="/") │ │ │ │ ├─#text "with empty span" │ │ │ ├─span │ │ ├─#text "after" `, }, { desc: "span with spaces", input: `

before with empty span after

`, expectedAfter: ` ├─body │ ├─p │ │ ├─#text "before" │ │ ├─strong │ │ │ ├─span │ │ │ │ ├─#text " " │ │ │ ├─a (href="/") │ │ │ │ ├─#text "with empty span" │ │ │ ├─span │ │ │ │ ├─#text " " │ │ ├─#text "after" `, }, { desc: "spans nested", input: `

before with empty span after

`, expectedAfter: ` ├─body │ ├─p │ │ ├─#text "before" │ │ ├─strong │ │ │ ├─span │ │ │ │ ├─span │ │ │ │ │ ├─#text " " │ │ │ │ ├─#text " " │ │ │ ├─a (href="/") │ │ │ │ ├─#text "with empty span" │ │ │ ├─span │ │ │ │ ├─span │ │ │ │ │ ├─#text " " │ │ │ │ ├─#text " " │ │ ├─#text "after" `, }, } for _, run := range runs { t.Run(run.desc, func(t *testing.T) { doc := tester.Parse(t, run.input, "") isBoldOrItalic := func(node *html.Node) bool { name := dom.NodeName(node) if name == "strong" || name == "b" { return true } if name == "em" || name == "i" { return true } return false } isLink := func(node *html.Node) bool { return dom.NodeName(node) == "a" } // Remove all unnessesary span tags // for _, node := range dom.GetAllNodes(doc) { // name := dom.NodeName(node) // if name == "span" { // dom.UnwrapNode(node) // } // } // collapse.Collapse(doc) SwapTags(context.TODO(), doc, isBoldOrItalic, isLink) tester.ExpectRepresentation(t, doc, "output", run.expectedAfter) }) } } golang-github-johanneskaufmann-html-to-markdown-2.3.1/internal/escape/000077500000000000000000000000001476711565700260715ustar00rootroot00000000000000golang-github-johanneskaufmann-html-to-markdown-2.3.1/internal/escape/elem_backslash.go000066400000000000000000000001671476711565700313610ustar00rootroot00000000000000package escape func IsBackslash(chars []byte, index int) int { if chars[index] != '\\' { return -1 } return 1 } golang-github-johanneskaufmann-html-to-markdown-2.3.1/internal/escape/elem_code.go000066400000000000000000000011721476711565700303350ustar00rootroot00000000000000package escape func IsFencedCode(chars []byte, index int) int { if chars[index] != '`' && chars[index] != '~' { return -1 } for i := index - 1; i >= 0; i-- { if chars[i] == ' ' || chars[i] == placeholderByte { continue } if chars[i] == '\n' { break } return -1 } count := 1 i := index + 1 for ; i < len(chars); i++ { if chars[i] == placeholderByte { continue } if chars[i] == '`' || chars[i] == '~' { count++ continue } break } if count < 3 { return -1 } return i - index } func IsInlineCode(chars []byte, index int) int { if chars[index] != '`' { return -1 } return 1 } golang-github-johanneskaufmann-html-to-markdown-2.3.1/internal/escape/elem_code_test.go000066400000000000000000000066131476711565700314010ustar00rootroot00000000000000package escape import ( "reflect" "testing" ) func TestIsFencedCode(t *testing.T) { runs := []struct { name string chars []byte expected []int }{ { name: "not needed", chars: []byte{'a', 'b', 'c'}, expected: []int{-1, -1, -1}, }, { name: "only two", chars: []byte{placeholderByte, '`', placeholderByte, '`', 'a'}, expected: []int{-1, -1, -1, -1, -1}, }, { name: "other chars before", chars: []byte{'a', ' ', placeholderByte, '`', placeholderByte, '`', placeholderByte, '`', 'a'}, expected: []int{-1, -1, -1, -1, -1, -1, -1, -1, -1}, }, { name: "just beginning", chars: []byte{placeholderByte, '`', placeholderByte, '`', placeholderByte, '`', 'a'}, expected: []int{-1, 5, -1, -1, -1, -1, -1}, }, { name: "just beginning (with tilde)", chars: []byte{placeholderByte, '~', placeholderByte, '~', placeholderByte, '~', 'a'}, expected: []int{-1, 5, -1, -1, -1, -1, -1}, }, { name: "just beginning (with space before)", chars: []byte{' ', placeholderByte, '`', placeholderByte, '`', placeholderByte, '`', 'a'}, expected: []int{-1, -1, 5, -1, -1, -1, -1, -1}, }, { name: "just beginning (with newline before)", chars: []byte{'\n', placeholderByte, '`', placeholderByte, '`', placeholderByte, '`', 'a'}, expected: []int{-1, -1, 5, -1, -1, -1, -1, -1}, }, { name: "simple", chars: []byte{placeholderByte, '`', placeholderByte, '`', placeholderByte, '`', '\n', 'a', '\n', placeholderByte, '`', placeholderByte, '`', placeholderByte, '`'}, expected: []int{-1, 5, -1, -1, -1, -1, -1, -1, -1, -1, 5, -1, -1, -1, -1}, }, { name: "only one end delimiter", chars: []byte{placeholderByte, '`', placeholderByte, '`', placeholderByte, '`', '\n', 'a', '\n', placeholderByte, '`'}, expected: []int{-1, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1}, }, } for _, run := range runs { t.Run(run.name, func(t *testing.T) { var actual []int for index := range run.chars { output := IsFencedCode(run.chars, index) actual = append(actual, output) } if !reflect.DeepEqual(actual, run.expected) { t.Errorf("expected %+v (l:%d) but got %+v (l:%d)", run.expected, len(run.expected), actual, len(actual)) } }) } } func TestIsInlineCode(t *testing.T) { runs := []struct { name string chars []byte expected []int }{ { name: "not needed", chars: []byte{'a', 'b', 'c'}, expected: []int{-1, -1, -1}, }, // { // name: "one delimiter inside text, no end delimiter", // chars: []byte{'a', '`', 'b', ' ', '\n', '\n', 'a'}, // expected: []int{-1, -1, -1}, // }, { name: "simple", chars: []byte{'`', 'a', '`'}, // expected: []int{1, -1, -1}, expected: []int{1, -1, 1}, }, // { // name: "without content", // chars: []byte{'`', '`'}, // expected: []int{1, -1}, // }, // { // name: "code inside normal text", // chars: []byte{'a', '`', 'b', '`', 'a'}, // expected: []int{-1, 3, -1, -1, -1}, // }, // TODO: also nested: ``some `code` text`` } for _, run := range runs { t.Run(run.name, func(t *testing.T) { var actual []int for index := range run.chars { output := IsInlineCode(run.chars, index) actual = append(actual, output) } if !reflect.DeepEqual(actual, run.expected) { t.Errorf("expected %+v but got %+v", run.expected, actual) } }) } } golang-github-johanneskaufmann-html-to-markdown-2.3.1/internal/escape/elem_divider.go000066400000000000000000000012561476711565700310540ustar00rootroot00000000000000package escape func IsDivider(chars []byte, index int) int { if chars[index] != '-' && chars[index] != '_' && chars[index] != '*' { return -1 } for i := index - 1; i >= 0; i-- { if chars[i] == '\n' { break } if chars[i] == placeholderByte { continue } if chars[i] == ' ' { continue } return -1 } count := 1 lastChar := len(chars) for i := index + 1; i < len(chars); i++ { if chars[i] == placeholderByte { continue } if chars[i] == ' ' { continue } if chars[i] == chars[index] { count++ continue } if chars[i] == '\n' { lastChar = i break } return -1 } if count >= 3 { return lastChar - index } return -1 } golang-github-johanneskaufmann-html-to-markdown-2.3.1/internal/escape/elem_divider_test.go000066400000000000000000000031071476711565700321100ustar00rootroot00000000000000package escape import ( "reflect" "testing" ) func TestIsDivider(t *testing.T) { runs := []struct { name string chars []byte expected []int }{ { name: "not needed", chars: []byte{'a', 'b', 'c'}, expected: []int{-1, -1, -1}, }, { name: "two dashes", chars: []byte{'-', '-'}, expected: []int{-1, -1}, }, { name: "char afterwards", chars: []byte{'-', '-', '-', ' ', 'a'}, expected: []int{-1, -1, -1, -1, -1}, }, { name: "three dashes", chars: []byte{'-', '-', '-'}, expected: []int{3, -1, -1}, }, { name: "five dashes", chars: []byte{'-', '-', '-', '-', '-'}, expected: []int{5, -1, -1, -1, -1}, }, { name: "space after", chars: []byte{'-', '-', '-', ' '}, expected: []int{4, -1, -1, -1}, }, { name: "newline after", chars: []byte{'-', '-', '-', '\n'}, expected: []int{3, -1, -1, -1}, }, { name: "newline and space before", chars: []byte{'\n', ' ', '-', '-', '-'}, expected: []int{-1, -1, 3, -1, -1}, }, { name: "with placeholders", chars: []byte{'\n', ' ', placeholderByte, '-', placeholderByte, '-', placeholderByte, '-'}, expected: []int{-1, -1, -1, 5, -1, -1, -1, -1}, }, } for _, run := range runs { t.Run(run.name, func(t *testing.T) { var actual []int for index := range run.chars { output := IsDivider(run.chars, index) actual = append(actual, output) } if !reflect.DeepEqual(actual, run.expected) { t.Errorf("expected %+v but got %+v", run.expected, actual) } }) } } golang-github-johanneskaufmann-html-to-markdown-2.3.1/internal/escape/elem_header.go000066400000000000000000000026241476711565700306560ustar00rootroot00000000000000package escape func IsAtxHeader(chars []byte, index int) int { if chars[index] != '#' { return -1 } for i := index - 1; i >= 0; i-- { if chars[i] == '\n' { break } if chars[i] == placeholderByte { continue } if chars[i] == ' ' { continue } return -1 } nPoundSigns := 1 for i := index + 1; i < len(chars); i++ { if chars[i] == '#' { nPoundSigns++ if nPoundSigns > 6 { return -1 } continue } if chars[i] == placeholderByte { continue } if chars[i] == ' ' || chars[i] == '\t' || chars[i] == '\n' || chars[i] == '\r' { // TODO: fix calculation with placeholder (maybe own for loop construct?) // Returns the count of # that we encountered return i - index } return -1 } return 1 } func IsSetextHeader(chars []byte, index int) int { if chars[index] != '=' && chars[index] != '-' { return -1 } var newlineCount int for i := index - 1; i >= 0; i-- { if chars[i] == placeholderByte || chars[i] == ' ' { continue } if chars[i] == '\n' { newlineCount++ continue } if newlineCount == 0 { // Without any newlines, this character is on the same line // as the delimiter. So the delimiter is inside a normal text... return -1 } else if newlineCount == 1 { // The heading content is on the line above the delimiter // which qualifies for a setext heading... return 1 } else { return -1 } } return -1 } golang-github-johanneskaufmann-html-to-markdown-2.3.1/internal/escape/elem_header_test.go000066400000000000000000000075051476711565700317200ustar00rootroot00000000000000package escape import ( "reflect" "testing" ) func TestIsAtxHeader(t *testing.T) { runs := []struct { name string chars []rune expected []int }{ { name: "not needed", chars: []rune{'a', 'b', 'c'}, expected: []int{-1, -1, -1}, }, { name: "inside text", chars: []rune{'a', placeholderRune, '#', ' ', 'a'}, expected: []int{-1, -1, -1, -1, -1}, }, { name: "inside text with space between", chars: []rune{'a', ' ', placeholderRune, '#', ' ', 'a'}, expected: []int{-1, -1, -1, -1, -1, -1}, }, { name: "h1 at start of file", chars: []rune{placeholderRune, '#', ' ', 'a', 'b'}, expected: []int{-1, 1, -1, -1, -1}, }, { name: "h1 at start of line", chars: []rune{'\n', placeholderRune, '#', ' ', 'a', 'b'}, expected: []int{-1, -1, 1, -1, -1, -1}, }, { name: "h1 with space before", chars: []rune{' ', placeholderRune, '#', ' ', 'a', 'b'}, expected: []int{-1, -1, 1, -1, -1, -1}, }, { name: "h2", chars: []rune{placeholderRune, '#', placeholderRune, '#', ' ', 'a', 'b'}, expected: []int{-1, 3, -1, -1, -1, -1, -1}, }, { name: "h4", chars: []rune{placeholderRune, '#', placeholderRune, '#', placeholderRune, '#', placeholderRune, '#', ' ', 'a'}, expected: []int{-1, 7, -1, -1, -1, -1, -1, -1, -1, -1}, }, { name: "h6", chars: []rune{placeholderRune, '#', placeholderRune, '#', placeholderRune, '#', placeholderRune, '#', placeholderRune, '#', placeholderRune, '#', ' ', 'a'}, expected: []int{-1, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, }, { name: "no h7", chars: []rune{placeholderRune, '#', placeholderRune, '#', placeholderRune, '#', placeholderRune, '#', placeholderRune, '#', placeholderRune, '#', placeholderRune, '#', ' ', 'a'}, expected: []int{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, }, { name: "tag", chars: []rune{placeholderRune, '#', 'a'}, expected: []int{-1, -1, -1}, }, { name: "also take empty heading", chars: []rune{placeholderRune, '#', ' ', '\n', 'a'}, expected: []int{-1, 1, -1, -1, -1}, }, { name: "nothing afterwards", chars: []rune{placeholderRune, '#'}, expected: []int{-1, 1}, }, { name: "tab before content", chars: []rune{placeholderRune, '#', '\t', 'a'}, expected: []int{-1, 1, -1, -1}, }, } for _, run := range runs { t.Run(run.name, func(t *testing.T) { var actual []int for index, _ := range run.chars { b := []byte(string(run.chars)) output := IsAtxHeader(b, index) actual = append(actual, output) } if !reflect.DeepEqual(actual, run.expected) { t.Errorf("expected %+v but got %+v", run.expected, actual) } }) } } func TestIsSetextHeader(t *testing.T) { runs := []struct { name string chars []rune expected []int }{ { name: "not needed", chars: []rune{'a', 'b', 'c'}, expected: []int{-1, -1, -1}, }, { name: "inside text", chars: []rune{'a', placeholderRune, '=', 'b'}, expected: []int{-1, -1, -1, -1}, }, { name: "blank line before", chars: []rune{'a', '\n', '\n', placeholderRune, '='}, expected: []int{-1, -1, -1, -1, -1}, }, { name: "with heading", chars: []rune{'a', '\n', placeholderRune, '='}, expected: []int{-1, -1, -1, 1}, }, { name: "at start of file", chars: []rune{placeholderRune, '='}, expected: []int{-1, -1}, }, } for _, run := range runs { t.Run(run.name, func(t *testing.T) { var actual []int for index, _ := range run.chars { b := []byte(string(run.chars)) output := IsSetextHeader(b, index) actual = append(actual, output) } if !reflect.DeepEqual(actual, run.expected) { t.Errorf("expected %+v but got %+v", run.expected, actual) } }) } } golang-github-johanneskaufmann-html-to-markdown-2.3.1/internal/escape/elem_image.go000066400000000000000000000012221476711565700305010ustar00rootroot00000000000000package escape func IsImageOrLink(chars []byte, index int) int { if chars[index] == '!' { return isImageOrLinkStartExclamation(chars, index) } if chars[index] == '[' { return isImageOrLinkStartBracket(chars, index) } return -1 } func isImageOrLinkStartExclamation(chars []byte, index int) int { nextIndex := index + 1 if nextIndex < len(chars) && chars[nextIndex] == '[' { // It could be the start of an image return 1 } return -1 } func isImageOrLinkStartBracket(chars []byte, index int) int { for i := index + 1; i < len(chars); i++ { if chars[i] == '\n' { return -1 } if chars[i] == ']' { return 1 } } return -1 } golang-github-johanneskaufmann-html-to-markdown-2.3.1/internal/escape/elem_image_test.go000066400000000000000000000026671476711565700315560ustar00rootroot00000000000000package escape import ( "reflect" "testing" ) func TestIsImageOrLink(t *testing.T) { runs := []struct { name string chars []byte expected []int }{ { name: "not needed", chars: []byte{'a', 'b', 'c'}, expected: []int{-1, -1, -1}, }, { name: "image A", chars: []byte{placeholderByte, '!', placeholderByte, '[', 'a', ']'}, expected: []int{-1, -1, -1, 1, -1, -1}, }, { name: "image B", chars: []byte{'!', placeholderByte, '[', 'a', ']'}, expected: []int{-1, -1, 1, -1, -1}, }, { name: "image C", chars: []byte{placeholderByte, '!', '[', 'a', ']'}, expected: []int{-1, 1, 1, -1, -1}, }, { name: "multiple starting brackets", chars: []byte{'[', '[', '[', 'a', ']'}, expected: []int{1, 1, 1, -1, -1}, }, { name: "newline in content", chars: []byte{'[', 'a', '\n', ']'}, expected: []int{-1, -1, -1, -1}, }, { name: "at end of file", chars: []byte{'[', 'a'}, expected: []int{-1, -1}, }, { name: "at end of file", chars: []byte{'!'}, expected: []int{-1}, }, } for _, run := range runs { t.Run(run.name, func(t *testing.T) { var actual []int for index := range run.chars { output := IsImageOrLink(run.chars, index) actual = append(actual, output) } if !reflect.DeepEqual(actual, run.expected) { t.Errorf("expected %+v but got %+v", run.expected, actual) } }) } } golang-github-johanneskaufmann-html-to-markdown-2.3.1/internal/escape/elem_italic_bold.go000066400000000000000000000005261476711565700316720ustar00rootroot00000000000000package escape import ( "unicode" ) func IsItalicOrBold(chars []byte, index int) int { if chars[index] != '*' && chars[index] != '_' { return -1 } next := getNextAsRune(chars, index) nextIsWhitespace := unicode.IsSpace(next) || next == 0 if nextIsWhitespace { // "not followed by Unicode whitespace" return -1 } return 1 } golang-github-johanneskaufmann-html-to-markdown-2.3.1/internal/escape/elem_italic_bold_test.go000066400000000000000000000065631476711565700327400ustar00rootroot00000000000000package escape import ( "reflect" "testing" ) func TestIsItalicOrBold(t *testing.T) { runs := []struct { desc string chars []rune index int expected int }{ { desc: "not needed", chars: []rune("normal text"), index: 0, expected: -1, }, { desc: "nothing before", chars: []rune("*a"), index: 0, expected: 1, }, { desc: "newline before", chars: []rune("\n *a"), index: 2, expected: 1, }, { desc: "text and space before", chars: []rune("text *a"), index: 5, expected: 1, }, { desc: "character directly before", chars: []rune("a*a"), index: 1, expected: 1, }, { desc: "point before", chars: []rune(".*a"), index: 1, expected: 1, }, // - - - - // { desc: "char after", chars: []rune(" *a"), index: 1, expected: 1, }, { desc: "point after", chars: []rune(" *."), index: 1, expected: 1, }, { desc: "nothing after", chars: []rune(" *"), index: 1, expected: -1, }, { desc: "space after", chars: []rune(" * "), index: 1, expected: -1, }, { desc: "newline after", chars: []rune(" *\n"), index: 1, expected: -1, }, // - - - - // // { // desc: "char before & point after", // chars: []rune("a*."), // index: 1, // expected: -1, // }, { desc: "space before & point after", chars: []rune(" *."), index: 1, expected: 1, }, { desc: "point before & point after", chars: []rune(".*."), index: 1, expected: 1, }, // - - - - // { desc: "exclamation mark as content", chars: []rune("*!*"), index: 0, expected: 1, }, { desc: "special char before", chars: []rune("$*content*"), index: 1, expected: 1, }, { desc: "$ before", chars: []rune("0$*!*"), index: 2, expected: 1, }, // { // desc: "\x00 after", // chars: []rune("*\x00*"), // index: 0, // expected: 1, // }, // { // desc: "some random input #1", // chars: []rune("\xac\xac\xac*!0*"), // index: 3, // expected: 1, // }, // { // desc: "random input #1", // chars: []rune{'\xac', '*', 'a', '*'}, //"*!0*"), // index: 2, // expected: 1, // }, } for _, run := range runs { t.Run(run.desc, func(t *testing.T) { b := []byte(string(run.chars)) t.Log("input:", string(b)) match := IsItalicOrBold(b, run.index) if match != run.expected { t.Errorf("expected %d but got %d", run.expected, match) } }) } } func TestIsItalicOrBold_All(t *testing.T) { runs := []struct { name string chars []rune expected []int }{ { name: "random input #1", chars: []rune{'\xac', '*', '!', '0', '*'}, expected: []int{-1, -1, 1, -1, -1, -1}, }, { name: "random input #2", chars: []rune{'\xac', '\xac', '\xac', '*', '!', '0', '*'}, expected: []int{-1, -1, -1, -1, -1, -1, 1, -1, -1, -1}, }, } for _, run := range runs { t.Run(run.name, func(t *testing.T) { bytes := []byte(string(run.chars)) var actual []int for index := range bytes { output := IsItalicOrBold(bytes, index) actual = append(actual, output) } if !reflect.DeepEqual(actual, run.expected) { t.Errorf("expected %+v but got %+v", run.expected, actual) } }) } } golang-github-johanneskaufmann-html-to-markdown-2.3.1/internal/escape/elem_list.go000066400000000000000000000017571476711565700304070ustar00rootroot00000000000000package escape import ( "unicode" ) func IsUnorderedList(chars []byte, index int) int { if chars[index] != '-' && chars[index] != '*' && chars[index] != '+' { return -1 } for i := index - 1; i >= 0; i-- { if chars[i] == '\n' { break } if chars[i] == ' ' { continue } if chars[i] == placeholderByte { continue } return -1 } next := getNext(chars, index) if IsSpace(next) || next == 0 { return 1 } return -1 } func IsOrderedList(chars []byte, index int) int { if chars[index] != '.' && chars[index] != ')' { return -1 } // Directly before the dot needs to be a digit prev := getPrevAsRune(chars, index) if !unicode.IsDigit(prev) { return -1 } for i := index - 1; i >= 0; i-- { if chars[i] == '\n' { break } if chars[i] == ' ' { continue } if chars[i] == placeholderByte { continue } if IsDigit(chars[i]) { continue } return -1 } next := getNext(chars, index) if IsSpace(next) || next == 0 { return 1 } return -1 } golang-github-johanneskaufmann-html-to-markdown-2.3.1/internal/escape/elem_list_test.go000066400000000000000000000051151476711565700314360ustar00rootroot00000000000000package escape import ( "reflect" "testing" ) func TestIsUnorderedList(t *testing.T) { runs := []struct { name string chars []byte expected []int }{ { name: "not needed", chars: []byte{'a', 'b', 'c'}, expected: []int{-1, -1, -1}, }, { name: "dash inside text", chars: []byte{'a', '-', ' ', 'b'}, expected: []int{-1, -1, -1, -1}, }, { name: "dash and directly text", chars: []byte{'-', 'a', 'b'}, expected: []int{-1, -1, -1}, }, { name: "two lists", chars: []byte{placeholderByte, '-', ' ', 'a', '\n', placeholderByte, '-', ' ', 'b'}, expected: []int{-1, 1, -1, -1, -1, -1, 1, -1, -1}, }, { name: "space before list", chars: []byte{' ', '-', ' ', 'a'}, expected: []int{-1, 1, -1, -1}, }, } for _, run := range runs { t.Run(run.name, func(t *testing.T) { var actual []int for index := range run.chars { output := IsUnorderedList(run.chars, index) actual = append(actual, output) } if !reflect.DeepEqual(actual, run.expected) { t.Errorf("expected %+v but got %+v", run.expected, actual) } }) } } func TestIsOrderedList(t *testing.T) { runs := []struct { name string chars []byte expected []int }{ { name: "not needed", chars: []byte{'a', 'b', 'c'}, expected: []int{-1, -1, -1}, }, { name: "simple list", chars: []byte{'1', '.', ' ', 'a'}, expected: []int{-1, 1, -1, -1}, }, { name: "bigger list", chars: []byte{'1', '2', '3', '.', ' ', 'a'}, expected: []int{-1, -1, -1, 1, -1, -1}, }, { name: "inside text", chars: []byte{'a', '1', '.', ' ', 'a'}, expected: []int{-1, -1, -1, -1, -1}, }, { name: "space after dot missing", chars: []byte{'1', '.', 'a'}, expected: []int{-1, -1, -1}, }, { name: "number before dot missing", chars: []byte{'a', '.', 'b'}, expected: []int{-1, -1, -1}, }, { name: "allow space before dot", chars: []byte{' ', '1', '.', ' ', 'a'}, expected: []int{-1, -1, 1, -1, -1}, }, { name: "two lists", chars: []byte{placeholderByte, '1', '.', ' ', 'a', '\n', placeholderByte, '1', '.', ' ', 'b'}, expected: []int{-1, -1, 1, -1, -1, -1, -1, -1, 1, -1, -1}, }, } for _, run := range runs { t.Run(run.name, func(t *testing.T) { var actual []int for index := range run.chars { output := IsOrderedList(run.chars, index) actual = append(actual, output) } if !reflect.DeepEqual(actual, run.expected) { t.Errorf("expected %+v but got %+v", run.expected, actual) } }) } } golang-github-johanneskaufmann-html-to-markdown-2.3.1/internal/escape/elem_quote.go000066400000000000000000000004521476711565700305600ustar00rootroot00000000000000package escape func IsBlockQuote(chars []byte, index int) int { if chars[index] != '>' { return -1 } for i := index - 1; i >= 0; i-- { if chars[i] == '\n' { break } if chars[i] == placeholderByte { continue } if chars[i] == ' ' { continue } return -1 } return 1 } golang-github-johanneskaufmann-html-to-markdown-2.3.1/internal/escape/elem_quote_test.go000066400000000000000000000025401476711565700316170ustar00rootroot00000000000000package escape import ( "reflect" "testing" ) func TestIsBlockquote(t *testing.T) { runs := []struct { name string chars []byte expected []int }{ { name: "allow simple quote", chars: []byte{'>', ' ', 'a'}, expected: []int{1, -1, -1}, }, { name: "allow space before", chars: []byte{' ', '>', ' ', 'a'}, expected: []int{-1, 1, -1, -1}, }, { name: "allow missing space after", chars: []byte{'>', 'a'}, expected: []int{1, -1}, }, { name: "allow newline before", chars: []byte{'\n', '>', ' ', 'a'}, expected: []int{-1, 1, -1, -1}, }, { name: "allow newline and space before", chars: []byte{'\n', ' ', '>', ' ', 'a'}, expected: []int{-1, -1, 1, -1, -1}, }, { name: "allow placeholder before", chars: []byte{placeholderByte, '>', ' ', 'a'}, expected: []int{-1, 1, -1, -1}, }, { name: "dont allow other chars before", chars: []byte{'a', '>', ' ', 'a'}, expected: []int{-1, -1, -1, -1}, }, } for _, run := range runs { t.Run(run.name, func(t *testing.T) { var actual []int for index := range run.chars { output := IsBlockQuote(run.chars, index) actual = append(actual, output) } if !reflect.DeepEqual(actual, run.expected) { t.Errorf("expected %+v but got %+v", run.expected, actual) } }) } } golang-github-johanneskaufmann-html-to-markdown-2.3.1/internal/escape/replacer.go000066400000000000000000000003641476711565700302200ustar00rootroot00000000000000package escape import "github.com/JohannesKaufmann/html-to-markdown/v2/marker" var placeholderRune rune = marker.MarkerEscaping // IMPORTANT: Only internally we assume it is only byte var placeholderByte byte = marker.BytesMarkerEscaping[0] golang-github-johanneskaufmann-html-to-markdown-2.3.1/internal/escape/util.go000066400000000000000000000022641476711565700274010ustar00rootroot00000000000000package escape import "unicode/utf8" // TODO: move to markers package? func IsSpace(b byte) bool { switch b { case '\t', '\n', '\v', '\f', '\r', ' ', 0x85, 0xA0: return true } return false } func IsDigit(b byte) bool { switch b { case '0', '1', '2', '3', '4', '5', '6', '7', '8', '9': return true } return false } func getPrev(chars []byte, index int) byte { for i := index - 1; i >= 0; i-- { if chars[i] == placeholderByte { continue } return chars[i] } return 0 } func getNext(chars []byte, index int) byte { for i := index + 1; i < len(chars); i++ { if chars[i] == placeholderByte { continue } return chars[i] } return 0 } func getPrevAsRune(chars []byte, index int) rune { for i := index - 1; i >= 0; i-- { if chars[i] == placeholderByte { continue } r, _ := utf8.DecodeLastRune(chars[:i+1]) return r } return 0 } func getNextAsRune(source []byte, index int) rune { for i := index + 1; i < len(source); i++ { if source[i] == placeholderByte { continue } r, _ := utf8.DecodeRune(source[i:]) return r } return 0 } // TODO: make public? func GetNextAsRune(source []byte, index int) rune { return getNextAsRune(source, index) } golang-github-johanneskaufmann-html-to-markdown-2.3.1/internal/escape/util_test.go000066400000000000000000000072501476711565700304400ustar00rootroot00000000000000package escape import ( "bytes" "testing" "unicode" ) const ChineseRune = '字' func TestIsSpace(t *testing.T) { runs := []struct { name string input byte expected bool }{ { name: "empty", input: 0, expected: false, }, { name: "normal char a", input: 'a', expected: false, }, { name: "special character ä", input: 'ä', expected: false, }, { name: "chinese character #1", input: []byte(string(ChineseRune))[0], expected: false, }, { name: "chinese character #2", input: []byte(string(ChineseRune))[1], expected: false, }, { name: "chinese character #3", input: []byte(string(ChineseRune))[2], expected: false, }, { name: "space", input: ' ', expected: true, }, { name: "tab", input: ' ', expected: true, }, } for _, run := range runs { t.Run(run.name, func(t *testing.T) { t.Run("unicode.IsSpace", func(t *testing.T) { output := unicode.IsSpace(rune(run.input)) if output != run.expected { t.Errorf("for %s expected %v but got %v", string(run.input), run.expected, output) } }) t.Run("escape.IsSpace", func(t *testing.T) { output := IsSpace(run.input) if output != run.expected { t.Errorf("for %s expected %v but got %v", string(run.input), run.expected, output) } }) }) } } func TestRune(t *testing.T) { chars := []rune{ ' ', '\n', '\t', rune(6), // Acknowledge character rune(7), // Bell character '!', '"', '#', '$', '%', '&', '\'', '(', ')', '*', '+', ',', '-', '.', '/', ':', ';', '<', '=', '>', '?', '@', '[', '\\', ']', '^', '_', '`', '{', '|', '}', '~', } for _, char := range chars { t.Run(string(char), func(t *testing.T) { length := len([]byte(string(char))) if length != 1 { t.Errorf("got a length of %d", length) } }) } } func TestGetPrev(t *testing.T) { input := []byte{'a', placeholderByte, 'b', 'c'} if getPrev(input, 3) != 'b' { t.Error("expected different output") } if getPrev(input, 2) != 'a' { t.Error("expected different output") } if getPrev(input, 1) != 'a' { t.Error("expected different output") } if getPrev(input, 0) != 0 { t.Error("expected different output") } } func TestGetNext(t *testing.T) { input := []byte{'a', placeholderByte, 'b', 'c'} if getNext(input, 0) != 'b' { t.Error("expected different output") } if getNext(input, 1) != 'b' { t.Error("expected different output") } if getNext(input, 2) != 'c' { t.Error("expected different output") } if getNext(input, 3) != 0 { t.Error("expected different output") } } func TestGetNextAsRune(t *testing.T) { inputString := "a\a⌘\ab" inputBytes := []byte{ 97, // a 7, // bell (our escape char) 226, 140, 152, // mac sign 7, // bell (our escape char) 98, // b } if !bytes.Equal([]byte(inputString), inputBytes) { t.Error("the string and byte slice dont match") } nextByte := getNext(inputBytes, 0) if nextByte != 226 { t.Error("expected different next byte") } nextRune := getNextAsRune(inputBytes, 0) if nextRune != '⌘' { t.Error("expected different next rune") } lastNextRune := getNextAsRune(inputBytes, 6) if lastNextRune != 0 { t.Error("expected different last next rune") } // - - - - // prevByte := getPrev(inputBytes, 6) if prevByte != 152 { t.Error("expected different prev byte") } prevRune := getPrevAsRune(inputBytes, 6) if prevRune != '⌘' { t.Error("expected different prev rune") } firstPrevRune := getPrevAsRune(inputBytes, 0) if firstPrevRune != 0 { t.Error("expected different zero prev rune") } } golang-github-johanneskaufmann-html-to-markdown-2.3.1/internal/tester/000077500000000000000000000000001476711565700261375ustar00rootroot00000000000000golang-github-johanneskaufmann-html-to-markdown-2.3.1/internal/tester/dom.go000066400000000000000000000015371476711565700272530ustar00rootroot00000000000000package tester import ( "bytes" "strings" "testing" "github.com/JohannesKaufmann/dom" "golang.org/x/net/html" ) func Parse(t *testing.T, rawHTML string, startFrom string) *html.Node { if startFrom == "" { startFrom = "body" } rawHTML = strings.TrimSpace(rawHTML) doc, err := html.Parse(strings.NewReader(rawHTML)) if err != nil { t.Fatal(err) } var b bytes.Buffer err = html.Render(&b, doc) if err != nil { t.Error(err) } var foundNode *html.Node var finder func(node *html.Node) finder = func(node *html.Node) { if foundNode != nil { return } if dom.NodeName(node) == startFrom { foundNode = node return } for child := node.FirstChild; child != nil; child = child.NextSibling { finder(child) } } finder(doc) if foundNode == nil { t.Error("could not find node for 'startFrom'") } return foundNode } golang-github-johanneskaufmann-html-to-markdown-2.3.1/internal/tester/dom_representation.go000066400000000000000000000007111476711565700323660ustar00rootroot00000000000000package tester import ( "strings" "testing" "github.com/JohannesKaufmann/dom" "golang.org/x/net/html" ) func ExpectRepresentation(t *testing.T, doc *html.Node, name string, expectedHtml string) { actualHtml := dom.RenderRepresentation(doc) actualHtml = strings.TrimSpace(actualHtml) expectedHtml = strings.TrimSpace(expectedHtml) if actualHtml != expectedHtml { t.Errorf("%s: expected \n%s\nbut got\n%s", name, expectedHtml, actualHtml) } } golang-github-johanneskaufmann-html-to-markdown-2.3.1/internal/tester/goldenfiles.go000066400000000000000000000046521476711565700307700ustar00rootroot00000000000000package tester import ( "flag" "fmt" "os" "path/filepath" "strings" "testing" "github.com/sebdah/goldie/v2" ) var enableRoundTrip = flag.Bool("round", false, "enable the round trip testing") const suffixInputFile = ".in.html" const suffixOutputFile = ".out.md" func getInputFiles(pathOfFolder string) ([]string, error) { files, err := os.ReadDir(pathOfFolder) if err != nil { return nil, fmt.Errorf("error while reading %q folder: %w", pathOfFolder, err) } var names []string for _, file := range files { if file.IsDir() { return nil, fmt.Errorf("did not expected a folder %q", file.Name()) } if strings.HasSuffix(file.Name(), suffixOutputFile) { continue } if !strings.HasSuffix(file.Name(), suffixInputFile) { return nil, fmt.Errorf("only expect in or out files but got %q", file.Name()) } name := strings.TrimSuffix(file.Name(), suffixInputFile) names = append(names, name) } return names, nil } func GoldenFiles(t *testing.T, convert ConvertFunc, roundTripConvert ConvertFunc) { pathOfFolder := filepath.Join("./testdata", strings.TrimPrefix(t.Name(), "Test")) runs, err := getInputFiles(pathOfFolder) if err != nil { t.Fatal(err) } if len(runs) == 0 { t.Fatalf("there were no golden files found in %q", pathOfFolder) } for _, run := range runs { t.Run(run, func(t *testing.T) { pathOfFile := filepath.Join(pathOfFolder, run+suffixInputFile) input, err := os.ReadFile(pathOfFile) if err != nil { t.Fatal(err) } t.Logf("running golden file test for %q", pathOfFile) // - - - - - - - Golden File Test - - - - - - - // output, err := convert(input) if err != nil { t.Fatal(err) } g := goldie.New(t, goldie.WithFixtureDir(pathOfFolder), goldie.WithNameSuffix(suffixOutputFile), // Simple, ColoredDiff, ClassicDiff // goldie.WithDiffEngine(goldie.Simple), goldie.WithDiffFn(func(actual, expected string) string { return fmt.Sprintf("Expected: %q\nGot: %q", expected, actual) }), ) g.Assert(t, run, []byte(output)) // - - - - - - - Round Trip Test - - - - - - - // if *enableRoundTrip { _, err := RoundTrip(run, input, roundTripConvert) if err != nil { t.Error(err) // - - - // // TODO: clear folder to override earlier runs // TODO: enable writing using command line // err2 := res.WriteToFiles("./.tmp/roundtrip") // if err2 != nil { // t.Error(err2) // } } } }) } } golang-github-johanneskaufmann-html-to-markdown-2.3.1/internal/tester/round_trip.go000066400000000000000000000064251476711565700306620ustar00rootroot00000000000000package tester import ( "bytes" "fmt" "os" "path/filepath" "time" // "github.com/darmiel/gohtml" "github.com/yuin/goldmark" goldmarkHtml "github.com/yuin/goldmark/renderer/html" ) type ConvertFunc func(html []byte) (markdown []byte, err error) var goldmarkConverter = goldmark.New( goldmark.WithRendererOptions( // Also render "javascript:" links goldmarkHtml.WithUnsafe(), ), ) type Result struct { Identifier string FirstDuration time.Duration SecondDuration time.Duration OriginalHtml []byte FirstMarkdown []byte IntermediateHtml []byte SecondMarkdown []byte } func (r Result) GetStatus() string { if bytes.Equal(r.FirstMarkdown, r.SecondMarkdown) { return fmt.Sprintf("%s: ✅ in %s & %s", r.Identifier, r.FirstDuration, r.SecondDuration) } return fmt.Sprintf("%s: ❌ in %s & %s", r.Identifier, r.FirstDuration, r.SecondDuration) } func (r Result) PrintStatus() { var Reset = "\033[0m" var Yellow = "\033[33m" fmt.Printf("%s[Round Trip Test] %s \n%s", Yellow, r.GetStatus(), Reset) } func (r Result) WriteToFiles(folderpath string) error { err := os.MkdirAll(filepath.Join(folderpath, r.Identifier), os.ModePerm) if err != nil { return fmt.Errorf("error while creating folder %q: %w", filepath.Join(folderpath, r.Identifier), err) } err = os.WriteFile(filepath.Join(folderpath, r.Identifier, "01.html"), r.OriginalHtml, 0644) if err != nil { return err } err = os.WriteFile(filepath.Join(folderpath, r.Identifier, "02.md"), r.FirstMarkdown, 0644) if err != nil { return err } err = os.WriteFile(filepath.Join(folderpath, r.Identifier, "03.html"), r.IntermediateHtml, 0644) if err != nil { return err } err = os.WriteFile(filepath.Join(folderpath, r.Identifier, "04.md"), r.SecondMarkdown, 0644) if err != nil { return err } // originalHtmlPretty := gohtml.Format(string(r.OriginalHtml), true) // err = ioutil.WriteFile(filepath.Join(folderpath, r.Identifier, "01_pretty.html"), []byte(originalHtmlPretty), 0644) // if err != nil { // return err // } // intermediateHtmlPretty := gohtml.Format(string(r.IntermediateHtml), true) // err = ioutil.WriteFile(filepath.Join(folderpath, r.Identifier, "03_pretty.html"), []byte(intermediateHtmlPretty), 0644) // if err != nil { // return err // } return nil } func RoundTrip(identifier string, originalHtml []byte, convert ConvertFunc) (*Result, error) { var err error res := &Result{ Identifier: identifier, OriginalHtml: originalHtml, } firstStart := time.Now() res.FirstMarkdown, err = convert(originalHtml) res.FirstDuration = time.Since(firstStart) if err != nil { return res, fmt.Errorf("error in the first convert round: %w", err) } var buf bytes.Buffer err = goldmarkConverter.Convert(res.FirstMarkdown, &buf) if err != nil { return res, fmt.Errorf("error with goldmark: %w", err) } res.IntermediateHtml = buf.Bytes() secondStart := time.Now() res.SecondMarkdown, err = convert(res.IntermediateHtml) res.SecondDuration = time.Since(secondStart) if err != nil { return res, fmt.Errorf("error in the second convert round: %w", err) } if bytes.Equal(res.FirstMarkdown, res.SecondMarkdown) { // Hurray, the converter produced exactly the same result. Well done!!! return res, nil } return res, fmt.Errorf("difference between the first and second markdown round") } golang-github-johanneskaufmann-html-to-markdown-2.3.1/internal/textutils/000077500000000000000000000000001476711565700266765ustar00rootroot00000000000000golang-github-johanneskaufmann-html-to-markdown-2.3.1/internal/textutils/codefence.go000066400000000000000000000026351476711565700311460ustar00rootroot00000000000000package textutils import "strings" func CalculateCodeFenceOccurrences(fenceChar rune, content string) int { var occurrences []int var charsTogether int for _, char := range content { // We encountered a fence character, now count how many // are directly afterwards if char == fenceChar { charsTogether++ } else if charsTogether != 0 { occurrences = append(occurrences, charsTogether) charsTogether = 0 } } // If the last element in the content was a fenceChar if charsTogether != 0 { occurrences = append(occurrences, charsTogether) } return findMax(occurrences) } // CalculateCodeFence can be passed the content of a code block and it returns // how many fence characters (` or ~) should be used. // // This is useful if the html content includes the same fence characters // for example ``` // -> https://stackoverflow.com/a/49268657 func CalculateCodeFence(fenceChar rune, content string) string { repeat := CalculateCodeFenceOccurrences(fenceChar, content) // The outer fence block always has to have // at least one character more than any content inside repeat++ // You have to have at least three fence characters // to be recognized as a code block if repeat < 3 { repeat = 3 } return strings.Repeat(string(fenceChar), repeat) } func findMax(a []int) (max int) { for i, value := range a { if i == 0 { max = a[i] } if value > max { max = value } } return max } golang-github-johanneskaufmann-html-to-markdown-2.3.1/internal/textutils/codefence_test.go000066400000000000000000000032361476711565700322030ustar00rootroot00000000000000package textutils import ( "strings" "testing" ) func TestCalculateCodeFence(t *testing.T) { var tests = []struct { Name string FenceChar rune Text string Expect string }{ { Name: "no occurrences with backtick", FenceChar: '`', Text: `normal ~~~ code block`, Expect: "```", }, { Name: "no occurrences with tilde", FenceChar: '~', Text: "normal ``` code block", Expect: "~~~", }, { Name: "one exact occurrence", FenceChar: '`', Text: "```", Expect: "````", }, { Name: "one occurrences with backtick", FenceChar: '`', Text: "normal ``` code block", Expect: "````", }, { Name: "one bigger occurrences with backtick", FenceChar: '`', Text: "normal ````` code block", Expect: "``````", }, { Name: "multiple occurrences with backtick", FenceChar: '`', Text: "normal ``` code `````` block", Expect: "```````", }, { Name: "multiple occurrences with tilde", FenceChar: '~', Text: "normal ~~~ code ~~~~~~~~~~~~ block", Expect: "~~~~~~~~~~~~~", }, { Name: "multiple occurrences on different lines with tilde", FenceChar: '~', Text: ` normal ~~~ code ~~~~~~~~~~~~ block `, Expect: "~~~~~~~~~~~~~", }, } for _, test := range tests { t.Run(test.Name, func(t *testing.T) { output := CalculateCodeFence(test.FenceChar, test.Text) if output != test.Expect { t.Errorf("expected '%s' (x%d) but got '%s' (x%d)", test.Expect, strings.Count(test.Expect, string(test.FenceChar)), output, strings.Count(output, string(test.FenceChar))) } }) } } golang-github-johanneskaufmann-html-to-markdown-2.3.1/internal/textutils/collapse_code.go000066400000000000000000000011121476711565700320140ustar00rootroot00000000000000package textutils import ( "bytes" ) func CollapseInlineCodeContent(content []byte) []byte { // TODO: what about other characters like the reset char? Maybe unicode.IsSpace? content = bytes.ReplaceAll(content, []byte{'\n'}, []byte{' '}) content = bytes.ReplaceAll(content, []byte{'\t'}, []byte{' '}) content = bytes.TrimSpace(content) newChars := make([]byte, 0, len(content)) var count int for _, char := range content { if char == ' ' { count++ } else { count = 0 } if count > 1 { continue } newChars = append(newChars, char) } return newChars } golang-github-johanneskaufmann-html-to-markdown-2.3.1/internal/textutils/collapse_code_test.go000066400000000000000000000017321476711565700330630ustar00rootroot00000000000000package textutils import "testing" func TestCollapseInlineCodeContent(t *testing.T) { runs := []struct { desc string input string expected string }{ { desc: "empty", input: "", expected: "", }, { desc: "not needed", input: "a b", expected: "a b", }, { desc: "one newline", input: "a\nb", expected: "a b", }, { desc: "multiple newlines", input: "a\nb\n\nc", expected: "a b c", }, { desc: "also trim", input: " a b ", expected: "a b", }, { desc: "realistic code content", input: ` body { color: yellow; font-size: 16px; } `, expected: "body { color: yellow; font-size: 16px; }", }, } for _, run := range runs { t.Run(run.desc, func(t *testing.T) { actual := CollapseInlineCodeContent([]byte(run.input)) if string(actual) != run.expected { t.Errorf("expected %q but got %q", run.expected, string(actual)) } }) } } golang-github-johanneskaufmann-html-to-markdown-2.3.1/internal/textutils/consecutive_newlines.go000066400000000000000000000063431476711565700334660ustar00rootroot00000000000000package textutils import ( "bytes" "unicode/utf8" ) func TrimUnnecessaryHardLineBreaks(content []byte) []byte { content = bytes.ReplaceAll(content, []byte(" \n\n"), []byte("\n\n")) content = bytes.ReplaceAll(content, []byte(" \n \n"), []byte("\n\n")) content = bytes.ReplaceAll(content, []byte(" \n \n"), []byte("\n\n")) // out = bytes.ReplaceAll(out, []byte("\n \n"), []byte("\n\n")) return content } func TrimConsecutiveNewlines(input []byte) []byte { var result []byte newlineCount := 0 spaceBuffer := []byte{} for i := 0; i < len(input); { r, size := utf8.DecodeRune(input[i:]) if r == '\n' { newlineCount++ if newlineCount <= 2 { // Preserve up to 2 newlines, including preceding spaces result = append(result, spaceBuffer...) result = append(result, '\n') spaceBuffer = spaceBuffer[:0] // Clear space buffer } else { // Skip additional newlines spaceBuffer = spaceBuffer[:0] // Clear space buffer } } else if r == ' ' { // Collect spaces into the space buffer spaceBuffer = append(spaceBuffer, input[i:i+size]...) } else { // Reset newline count and append non-newline characters newlineCount = 0 result = append(result, spaceBuffer...) result = append(result, input[i:i+size]...) spaceBuffer = spaceBuffer[:0] // Clear space buffer } i += size } // Append any trailing spaces result = append(result, spaceBuffer...) return result } /* func TrimConsecutiveNewlines(source []byte) []byte { // Some performance optimizations: // - If no replacement was done, we return the original slice and don't allocate. // - We batch appends var ret []byte startNormal := 0 startMatch := -1 count := 0 // for i, b := range source { for i := 0; i < len(source); i++ { r, size := utf8.DecodeRune(source[i:]) _ = size isNewline := r == '\n' // || r == marker.MarkerLineBreak if isNewline { count += 1 } if startMatch == -1 && isNewline { // Start of newlines startMatch = i i = i + size - 1 continue } else if startMatch != -1 && isNewline { // Middle of newlines i = i + size - 1 continue } else if startMatch != -1 { // Character after the last newline character if count > 2 { if ret == nil { ret = make([]byte, 0, len(source)) } ret = append(ret, source[startNormal:startMatch]...) ret = append(ret, '\n', '\n') startNormal = i } startMatch = -1 count = 0 } } getStartEnd := func() (int, int, bool, bool) { if startMatch == -1 && startNormal == 0 { // a) no changes need to be done return -1, -1, false, false } if count <= 2 { // b) Only the normal characters still need to be added return startNormal, len(source), true, false } // c) The match still needs to be replaced (and possible the previous normal characters be added) return startNormal, startMatch, true, true } start, end, isKeepNeeded, isReplaceNeeded := getStartEnd() if isKeepNeeded { if ret == nil { ret = make([]byte, 0, len(source)) } ret = append(ret, source[start:end]...) if isReplaceNeeded { ret = append(ret, '\n', '\n') } } if ret == nil { // Hurray, we did not do any allocations with make() // and instead just return the original slice. return source } return ret } */ consecutive_newlines_test.go000066400000000000000000000111401476711565700344350ustar00rootroot00000000000000golang-github-johanneskaufmann-html-to-markdown-2.3.1/internal/textutilspackage textutils import ( "bytes" "testing" ) func TestTrimConsecutiveNewlines(t *testing.T) { tests := []struct { name string input string expected string }{ {"empty string", "", ""}, {"single char", "a", "a"}, {"simple text", "hello", "hello"}, {"normal text without newlines", "hello this is a normal text", "hello this is a normal text"}, // Single newline cases {"single newline", "a\nb", "a\nb"}, {"single newline with spaces", "a \nb", "a \nb"}, {"spaces after newline", "a\n b", "a\n b"}, // Double newline cases {"double newline", "a\n\nb", "a\n\nb"}, {"double newline with spaces", "a \n\nb", "a\n\nb"}, {"spaces between newlines", "a\n \nb", "a\n \nb"}, // Note: It should not change the spaces *after* the newlines since this could impacts lists {"spaces after double newline", "a\n\n b", "a\n\n b"}, // Triple+ newline cases {"triple newline", "a\n\n\nb", "a\n\nb"}, {"quad newline", "a\n\n\n\nb", "a\n\nb"}, {"triple newline with spaces", "a \n\n\nb", "a\n\nb"}, // Multiple segment cases {"multiple segments", "a\n\nb\n\nc", "a\n\nb\n\nc"}, {"multiple segments with spaces", "a \n\nb \n\nc", "a\n\nb\n\nc"}, // Spaces at end of line {"hard-line-break followed by text", "a \nb", "a \nb"}, {"hard-line-break followed by newline", "a \n\nb", "a\n\nb"}, // Edge cases {"only newlines", "\n\n\n", "\n\n"}, {"only spaces", " ", " "}, {"leading and trailing newlines", "\n\n\ntext\n\n\n", "\n\ntext\n\n"}, {"newlines and spaces 1", " \n \n \n \n ", "\n\n "}, {"newlines and spaces 2", "a \n \nb", "a\n\nb"}, {"newlines and spaces 3", "a \n \nb", "a\n\nb"}, {"leading spaces", " a", " a"}, {"leading newline 1", "\na", "\na"}, {"leading newline 2", "\n\na", "\n\na"}, {"leading newline 3", "\n\n\na", "\n\na"}, {"trailing spaces", "a ", "a "}, {"trailing newline 1", "a\n", "a\n"}, {"trailing newlines 2", "a\n\n", "a\n\n"}, {"trailing newlines 3", "a\n\n\n", "a\n\n"}, // UTF-8 cases {"german special chars", "äöü\n\n\näöü", "äöü\n\näöü"}, {"utf8 chars", "🌟\n\n\n🌟\n\n\n🌟", "🌟\n\n🌟\n\n🌟"}, // Markdown // Note: The sublist needs to be indented by " -" {"indented sublist", "- The main list\n \n - The sublist", "- The main list\n \n - The sublist"}, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { output := TrimConsecutiveNewlines([]byte(tt.input)) output = TrimUnnecessaryHardLineBreaks(output) if string(output) != tt.expected { t.Errorf("\ninput: %q\nexpected: %q\ngot: %q", tt.input, tt.expected, string(output), ) } }) } } func TestTrimConsecutiveNewlines_Allocs(t *testing.T) { const N = 1000 t.Run("no newlines", func(t *testing.T) { var expectedAverage float64 = 1 actualAverage := testing.AllocsPerRun(N, func() { input := []byte("abc") output := TrimConsecutiveNewlines(input) _ = output }) if actualAverage != expectedAverage { t.Errorf("expected %f allocations but got %f", expectedAverage, actualAverage) } }) t.Run("exactly two newlines", func(t *testing.T) { var expectedAverage float64 = 1 actualAverage := testing.AllocsPerRun(N, func() { input := []byte("abc\n\nabc") output := TrimConsecutiveNewlines(input) _ = output }) if actualAverage != expectedAverage { t.Errorf("expected %f allocations but got %f", expectedAverage, actualAverage) } }) t.Run("three newlines", func(t *testing.T) { var expectedAverage float64 = 1 actualAverage := testing.AllocsPerRun(N, func() { input := []byte("abc\n\n\nabc") output := TrimConsecutiveNewlines(input) _ = output }) if actualAverage != expectedAverage { t.Errorf("expected %f allocations but got %f", expectedAverage, actualAverage) } }) t.Run("many newlines", func(t *testing.T) { var expectedAverage float64 = 16 actualAverage := testing.AllocsPerRun(N, func() { input := bytes.Repeat([]byte("abc\n\n\n\n\n\nabc"), 1000) output := TrimConsecutiveNewlines(input) _ = output }) if actualAverage != expectedAverage { t.Errorf("expected %f allocations but got %f", expectedAverage, actualAverage) } }) } func BenchmarkTrimConsecutiveNewlines(b *testing.B) { const Repeat = 10 runs := []struct { desc string input []byte }{ { desc: "not needed", input: bytes.Repeat([]byte("normal\n\ntext"), Repeat), }, { desc: "multiple times", input: bytes.Repeat([]byte("1\n\n\n2\n\n\n3"), Repeat), }, } for _, run := range runs { b.Run(run.desc, func(b *testing.B) { for i := 0; i < b.N; i++ { TrimConsecutiveNewlines(run.input) } }) } } golang-github-johanneskaufmann-html-to-markdown-2.3.1/internal/textutils/delimiter.go000066400000000000000000000016461476711565700312120ustar00rootroot00000000000000package textutils import ( "bytes" ) // DelimiterForEveryLine puts the delimiter not just at the start and end of the string // but if the text is divided on multiple lines, puts the delimiters on every line with content. // // Otherwise the bold/italic delimiters won't be recognized if it contains new line characters. func DelimiterForEveryLine(text []byte, delimiter []byte) []byte { var buf bytes.Buffer lines := bytes.Split(text, []byte("\n")) for i, line := range lines { leftExtra, trimmed, rightExtra := SurroundingSpaces(line) if trimmed == nil { // For empty lines, we don't need a delimiter buf.Write(leftExtra) buf.Write(rightExtra) } else { buf.Write(leftExtra) buf.Write(delimiter) buf.Write(trimmed) buf.Write(delimiter) buf.Write(rightExtra) } // To join the lines again, add a newlines character if i < len(lines)-1 { buf.WriteRune('\n') } } return buf.Bytes() } golang-github-johanneskaufmann-html-to-markdown-2.3.1/internal/textutils/delimiter_test.go000066400000000000000000000027121476711565700322440ustar00rootroot00000000000000package textutils import "testing" func TestDelimiterForEveryLine(t *testing.T) { tests := []struct { name string text string delimiter string want string }{ { name: "put delimiter around text", text: "bold text", delimiter: "**", want: "**bold text**", }, { name: "keep whitespace outside (normal space)", text: " bold text ", delimiter: "**", want: " **bold text** ", }, { name: "keep whitespace outside (non-breaking space)", text: "\u00a0bold text\u00a0\u00a0", delimiter: "**", want: "\u00a0**bold text**\u00a0\u00a0", }, { name: "keep whitespace outside on every line (non-breaking space)", text: "bold\u00a0\ntext\u00a0", delimiter: "**", want: "**bold**\u00a0\n**text**\u00a0", }, { name: "put strong on every line", text: "line 1\nline 2", delimiter: "**", want: "**line 1**\n**line 2**", }, { name: "skip empty lines", text: "line 1\n\n\nline 2", delimiter: "_", want: "_line 1_\n\n\n_line 2_", }, { name: "with indentation", text: ` line 1 line 2 line 3 `, delimiter: "__", want: ` __line 1__ __line 2__ __line 3__ `, }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if got := DelimiterForEveryLine([]byte(tt.text), []byte(tt.delimiter)); string(got) != tt.want { t.Errorf("DelimiterForEveryLine() = \n'%v' but want \n'%v'", string(got), tt.want) } }) } } golang-github-johanneskaufmann-html-to-markdown-2.3.1/internal/textutils/escape_multiline.go000066400000000000000000000025051476711565700325510ustar00rootroot00000000000000package textutils import ( "bytes" "unicode" ) var ( doubleSpace = []byte{' ', ' '} newlineBreak = []byte{'\n'} hardLineBreak = []byte{' ', ' ', '\n'} escapedNoContentLineBreak = []byte{'\\', '\n'} ) // EscapeMultiLine deals with multiline content inside a link or a heading. func EscapeMultiLine(content []byte) []byte { parts := bytes.Split(content, newlineBreak) if len(parts) == 1 { return content } output := make([]byte, 0, len(content)) for i := range parts { trimmedLeft := bytes.TrimLeftFunc(parts[i], unicode.IsSpace) if len(trimmedLeft) == 0 { // A blank line would interrupt the link. // So we need to escape the line output = append(output, escapedNoContentLineBreak...) continue } isLast := i == len(parts)-1 if isLast { // For the last line we don't need to add any "\n" anymore output = append(output, trimmedLeft...) continue } // Now decide what ending we want: if bytes.HasSuffix(trimmedLeft, doubleSpace) { // We already have " " so adding a "\n" is enough output = append(output, trimmedLeft...) output = append(output, newlineBreak...) continue } else { // We *prefer* having a hard-line-break " \n" output = append(output, trimmedLeft...) output = append(output, hardLineBreak...) continue } } return output } golang-github-johanneskaufmann-html-to-markdown-2.3.1/internal/textutils/escape_multiline_test.go000066400000000000000000000033161476711565700336110ustar00rootroot00000000000000package textutils import ( "strings" "testing" ) func TestEscapeMultiLine(t *testing.T) { var tests = []struct { Name string Text string Expected string }{ { Name: "empty", Text: "", Expected: "", }, { Name: "not needed", Text: "some longer text that is on one line", Expected: "some longer text that is on one line", }, { Name: "one newline", Text: "A\nB", Expected: "A \nB", }, { Name: "two newlines", Text: "A\n\nB", Expected: "A \n\\\nB", }, { Name: "many newlines", // Will be max two newlines characters Text: "line 1\n\n\n\nline 2", Expected: "line 1 \n\\\nline 2", }, { Name: "multiple empty lines", Text: `line1 line2 line3 line4`, Expected: `line1 line2 \ line3 \ line4`, }, { Name: "empty line with a space", Text: "line 1\n \nline 2", Expected: "line 1 \n\\\nline 2", }, { Name: "content has a space", Text: "a\n\n b", Expected: "a \n\\\nb", }, { Name: "content is indented", Text: "line 1\n line 2\n\tline 3", Expected: "line 1 \nline 2 \nline 3", }, // TODO: keep existing "\" characters? } for _, test := range tests { t.Run(test.Name, func(t *testing.T) { input := TrimConsecutiveNewlines([]byte(test.Text)) output := EscapeMultiLine(input) if string(output) != test.Expected { t.Errorf("expected '%s' but got '%s'", test.Expected, string(output)) } }) } } func BenchmarkEscapeMultiLine(b *testing.B) { b.Run("new", func(b *testing.B) { input := []byte(strings.Repeat("line 1\n\n \nline 2", 100)) for i := 0; i < b.N; i++ { _ = EscapeMultiLine(input) } }) } golang-github-johanneskaufmann-html-to-markdown-2.3.1/internal/textutils/prefix_lines.go000066400000000000000000000004541476711565700317170ustar00rootroot00000000000000package textutils func PrefixLines(source []byte, repl []byte) []byte { newSlice := make([]byte, 0, len(source)) newSlice = append(newSlice, repl...) for _, b := range source { newSlice = append(newSlice, b) if b == '\n' { newSlice = append(newSlice, repl...) } } return newSlice } golang-github-johanneskaufmann-html-to-markdown-2.3.1/internal/textutils/prefix_lines_test.go000066400000000000000000000024311476711565700327530ustar00rootroot00000000000000package textutils import ( "bytes" "regexp" "testing" ) var beginningR = regexp.MustCompile(`(?m)^`) func _oldPrefixLines(content string, repl string) string { return beginningR.ReplaceAllString(content, repl) } func TestPrefixLines(t *testing.T) { runs := []struct { desc string input []byte expected []byte }{ { desc: "one line", input: []byte("abc"), expected: []byte("> abc"), }, { desc: "two lines", input: []byte("line 1\nline 2"), expected: []byte("> line 1\n> line 2"), }, { desc: "two newlines between", input: []byte("line 1\n\nline 2"), expected: []byte("> line 1\n> \n> line 2"), }, { desc: "newline at end", input: []byte("abc\n"), expected: []byte("> abc\n> "), }, } for _, run := range runs { t.Run(run.desc, func(t *testing.T) { t.Run("old", func(t *testing.T) { output := _oldPrefixLines(string(run.input), "> ") if output != string(run.expected) { t.Errorf("expected %q but got %q", string(run.expected), output) } }) t.Run("new", func(t *testing.T) { output := PrefixLines(run.input, []byte{'>', ' '}) if !bytes.Equal(output, run.expected) { t.Errorf("expected %q but got %q", string(run.expected), string(output)) } }) }) } } golang-github-johanneskaufmann-html-to-markdown-2.3.1/internal/textutils/quote.go000066400000000000000000000017671476711565700303750ustar00rootroot00000000000000package textutils import "bytes" const ( DOUBLE_QUOTE = '"' SINGLE_QUOTE = '\'' ) func SurroundBy(content []byte, chars []byte) []byte { content = append(chars, content...) content = append(content, chars...) return content } func SurroundByQuotes(content []byte) []byte { if len(content) == 0 { return nil } containsDoubleQuote := bytes.ContainsRune(content, DOUBLE_QUOTE) containsSingleQuote := bytes.ContainsRune(content, SINGLE_QUOTE) if containsDoubleQuote && containsSingleQuote { // Escape all quotes content = bytes.ReplaceAll(content, []byte(`"`), []byte(`\"`)) // Surround the content by double quotes return SurroundBy(content, []byte(`"`)) } if containsDoubleQuote { // Since it contains double quotes (but no single quotes) // we can surround it by single quotes return SurroundBy(content, []byte(`'`)) } // It may contain single quotes, but definitely no double quotes, // so we can safely surround it by double quotes. return SurroundBy(content, []byte(`"`)) } golang-github-johanneskaufmann-html-to-markdown-2.3.1/internal/textutils/quote_test.go000066400000000000000000000021311476711565700314160ustar00rootroot00000000000000package textutils import ( "reflect" "testing" ) func TestSurroundByQuotes(t *testing.T) { tests := []struct { name string input []byte want []byte }{ { name: "empty content", input: nil, want: nil, }, { name: "no content", input: []byte(""), want: nil, }, { name: "contains no quotes", input: []byte(`no quotes are here`), want: []byte(`"no quotes are here"`), }, { name: "contains double quotes", input: []byte(`double "quotes" are here`), want: []byte(`'double "quotes" are here'`), }, { name: "contains single quotes", input: []byte(`single 'quotes' are here`), want: []byte(`"single 'quotes' are here"`), }, { name: "contains both quotes", input: []byte(`double " AND single ' quotes '" are here`), want: []byte(`"double \" AND single ' quotes '\" are here"`), }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if got := SurroundByQuotes(tt.input); !reflect.DeepEqual(got, tt.want) { t.Errorf("SurroundByQuotes() = %v, want %v", string(got), string(tt.want)) } }) } } golang-github-johanneskaufmann-html-to-markdown-2.3.1/internal/textutils/surrounding_spaces.go000066400000000000000000000035701476711565700331470ustar00rootroot00000000000000/* The logic to handle whitespace around delimiters was initially developed in the fork from "anyproto" by Roman Khafizianov and Mikhail. The changes were then merged upstream by Johannes Kaufmann. https://github.com/anyproto/html-to-markdown https://github.com/JohannesKaufmann/html-to-markdown ----------- MIT License Copyright (c) 2018 Johannes Kaufmann Copyright (c) 2020 Roman Khafizianov Copyright (c) 2023 Mikhail 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. */ package textutils import ( "bytes" "unicode" ) func SurroundingSpaces(content []byte) ([]byte, []byte, []byte) { rightTrimmed := bytes.TrimRightFunc(content, func(r rune) bool { return unicode.IsSpace(r) }) rightExtra := content[len(rightTrimmed):] trimmed := bytes.TrimLeftFunc(rightTrimmed, func(r rune) bool { return unicode.IsSpace(r) }) leftExtra := content[0 : len(rightTrimmed)-len(trimmed)] return leftExtra, trimmed, rightExtra } golang-github-johanneskaufmann-html-to-markdown-2.3.1/internal/textutils/surrounding_spaces_test.go000066400000000000000000000032411476711565700342010ustar00rootroot00000000000000package textutils import ( "bytes" "testing" ) func TestSurroundingSpaces(t *testing.T) { testCases := []struct { desc string input []byte expectedLeft []byte expectedTrimmed []byte expectedRight []byte }{ { desc: "empty string", input: []byte(""), expectedLeft: []byte(""), expectedTrimmed: []byte(""), expectedRight: []byte(""), }, { desc: "one space", input: []byte(" "), expectedLeft: []byte(""), expectedTrimmed: []byte(""), expectedRight: []byte(" "), }, { desc: "simple string", input: []byte("some text"), expectedLeft: []byte(""), expectedTrimmed: []byte("some text"), expectedRight: []byte(""), }, { desc: "spaces around", input: []byte(" text "), expectedLeft: []byte(" "), expectedTrimmed: []byte("text"), expectedRight: []byte(" "), }, { desc: "newlines around", input: []byte("\n\n text \n\n"), expectedLeft: []byte("\n\n "), expectedTrimmed: []byte("text"), expectedRight: []byte(" \n\n"), }, } for _, tC := range testCases { t.Run(tC.desc, func(t *testing.T) { leftExtra, trimmed, rightExtra := SurroundingSpaces(tC.input) if !bytes.Equal(leftExtra, tC.expectedLeft) { t.Errorf("expected %q but got %q for the left extra", string(tC.expectedLeft), string(leftExtra)) } if !bytes.Equal(trimmed, tC.expectedTrimmed) { t.Errorf("expected %q but got %q for the trimmed text", string(tC.expectedTrimmed), string(trimmed)) } if !bytes.Equal(rightExtra, tC.expectedRight) { t.Errorf("expected %q but got %q for the right extra", string(tC.expectedRight), string(rightExtra)) } }) } } golang-github-johanneskaufmann-html-to-markdown-2.3.1/marker/000077500000000000000000000000001476711565700242765ustar00rootroot00000000000000golang-github-johanneskaufmann-html-to-markdown-2.3.1/marker/marker.go000066400000000000000000000014471476711565700261140ustar00rootroot00000000000000package marker import ( "bytes" ) const ( // For simplicity we are using a rune that is one byte wide. A character // that is not used widely (apart from cli's) is the bell character (7). MarkerEscaping rune = '\a' // - - - - // // Marker0 rune = '\uF000' // 61440 // Marker1 rune = '\uF001' // 61441 MarkerCodeBlockNewline rune = '\uF002' // 61442 ) var ( BytesMarkerEscaping = []byte{7} BytesMarkerCodeBlockNewline = []byte{239, 128, 130} ) func init() { checkRuneAndByteSlice(MarkerEscaping, BytesMarkerEscaping) checkRuneAndByteSlice(MarkerCodeBlockNewline, BytesMarkerCodeBlockNewline) } func checkRuneAndByteSlice(r rune, b []byte) { if !bytes.Equal([]byte(string(r)), b) { panic("the rune and byte slice do not represent the same character") } } golang-github-johanneskaufmann-html-to-markdown-2.3.1/plugin/000077500000000000000000000000001476711565700243135ustar00rootroot00000000000000golang-github-johanneskaufmann-html-to-markdown-2.3.1/plugin/base/000077500000000000000000000000001476711565700252255ustar00rootroot00000000000000golang-github-johanneskaufmann-html-to-markdown-2.3.1/plugin/base/base.go000066400000000000000000000110021476711565700264600ustar00rootroot00000000000000package base import ( "bytes" "strings" "github.com/JohannesKaufmann/html-to-markdown/v2/converter" "github.com/JohannesKaufmann/dom" "github.com/JohannesKaufmann/html-to-markdown/v2/collapse" "github.com/JohannesKaufmann/html-to-markdown/v2/internal/domutils" "github.com/JohannesKaufmann/html-to-markdown/v2/internal/textutils" "golang.org/x/net/html" ) type base struct{} // NewBasePlugin registers a bunch of stuff that is not necessarily related to commonmark, // like removing nodes, trimming whitespace, collapsing whitespace, ... func NewBasePlugin() converter.Plugin { base := base{} return &base } func (s *base) Name() string { return "base" } func (b *base) Init(conv *converter.Converter) error { conv.Register.TagType("#comment", converter.TagTypeRemove, converter.PriorityStandard) conv.Register.TagType("head", converter.TagTypeRemove, converter.PriorityStandard) conv.Register.TagType("script", converter.TagTypeRemove, converter.PriorityStandard) conv.Register.TagType("style", converter.TagTypeRemove, converter.PriorityStandard) conv.Register.TagType("link", converter.TagTypeRemove, converter.PriorityStandard) conv.Register.TagType("meta", converter.TagTypeRemove, converter.PriorityStandard) conv.Register.TagType("iframe", converter.TagTypeRemove, converter.PriorityStandard) conv.Register.TagType("noscript", converter.TagTypeRemove, converter.PriorityStandard) conv.Register.TagType("input", converter.TagTypeRemove, converter.PriorityStandard) conv.Register.TagType("textarea", converter.TagTypeRemove, converter.PriorityStandard) // "tr" is not in the `IsBlockNode` list, // but we want to treat is as a block anyway. // conv.Register.TagStrategy("tr", converter.StrategyMarkdownBlock, converter.PriorityStandard) // conv.Register.TagType("tr", converter.BlockTagType, converter.PriorityStandard) conv.Register.PreRenderer(b.preRenderRemove, converter.PriorityEarly) // Note: The priority is low, so that collapse runs _after_ all the other functions conv.Register.PreRenderer(b.preRenderCollapse, converter.PriorityLate) conv.Register.TextTransformer(b.handleTextTransform, converter.PriorityStandard) conv.Register.PostRenderer(b.postRenderTrimContent, converter.PriorityStandard) conv.Register.PostRenderer(b.postRenderUnescapeContent, converter.PriorityStandard+20) return nil } func (b *base) preRenderRemove(ctx converter.Context, doc *html.Node) { var finder func(node *html.Node) finder = func(node *html.Node) { name := dom.NodeName(node) if tagType, _ := ctx.GetTagType(name); tagType == converter.TagTypeRemove { dom.RemoveNode(node) return } for child := node.FirstChild; child != nil; child = child.NextSibling { // Because we are sometimes removing a node, this causes problems // with the for loop. Using `defer` is a cool trick! // https://gist.github.com/loopthrough/17da0f416054401fec355d338727c46e defer finder(child) } } finder(doc) // - - - - - - - // // After removing elements (see above) it can happen that we have // two #text nodes right next to each other. This would cause problems // with the collapse so we merge them together. domutils.MergeAdjacentTextNodes(doc) } func (b *base) preRenderCollapse(ctx converter.Context, doc *html.Node) { collapse.Collapse(doc, &collapse.DomFuncs{ IsBlockNode: func(node *html.Node) bool { tagName := dom.NodeName(node) tagType, ok := ctx.GetTagType(tagName) if ok { return tagType == converter.TagTypeBlock } return dom.NameIsBlockNode(tagName) }, }) } var characterEntityReplacer = strings.NewReplacer( // We are not using `html.EscapeString` because we // care about fewer characters "<", "<", ">", ">", "&", "&", ) func (b *base) handleTextTransform(ctx converter.Context, content string) string { // TODO: similar to UnEscapers also only escape if nessesary. // "<" only if not followed by space // "&" only if character entity content = characterEntityReplacer.Replace(content) // TODO: reduce conversion between types content = string(ctx.EscapeContent([]byte(content))) return content } func (b *base) postRenderTrimContent(ctx converter.Context, result []byte) []byte { // Remove whitespace from the beginning & end result = bytes.TrimSpace(result) // Remove too many newlines result = textutils.TrimConsecutiveNewlines(result) result = textutils.TrimUnnecessaryHardLineBreaks(result) return result } func (b *base) postRenderUnescapeContent(ctx converter.Context, result []byte) []byte { result = ctx.UnEscapeContent(result) return result } golang-github-johanneskaufmann-html-to-markdown-2.3.1/plugin/base/renderers.go000066400000000000000000000033141476711565700275460ustar00rootroot00000000000000package base import ( "github.com/JohannesKaufmann/dom" "github.com/JohannesKaufmann/html-to-markdown/v2/converter" "golang.org/x/net/html" ) // RenderAsHTML will render the node as HTML using `html.Render()` // Newlines will be inserted depending on the configured `TagType`. // // As an example, you could do such a combination: // // "A text with bold and *italic* text"` func RenderAsHTML(ctx converter.Context, w converter.Writer, node *html.Node) converter.RenderStatus { tagName := dom.NodeName(node) tagType, _ := ctx.GetTagType(tagName) if tagType == converter.TagTypeBlock { w.WriteString("\n\n") } _ = html.Render(w, node) // TODO: what to do with error? if tagType == converter.TagTypeBlock { w.WriteString("\n\n") } return converter.RenderSuccess } // RenderAsHTMLWrapper will render the node as HTML // and render the children as markdown. func RenderAsHTMLWrapper(ctx converter.Context, w converter.Writer, node *html.Node) converter.RenderStatus { name := dom.NodeName(node) w.WriteString("<") w.WriteString(name) // TODO: also render the attributes? w.WriteString(">\n\n") ctx.RenderChildNodes(ctx, w, node) w.WriteString("\n\n") return converter.RenderSuccess } // RenderAsPlaintextWrapper will keep the children of this node as markdown. func RenderAsPlaintextWrapper(ctx converter.Context, w converter.Writer, node *html.Node) converter.RenderStatus { tagName := dom.NodeName(node) tagType, _ := ctx.GetTagType(tagName) if tagType == converter.TagTypeBlock { w.WriteString("\n\n") } ctx.RenderChildNodes(ctx, w, node) if tagType == converter.TagTypeBlock { w.WriteString("\n\n") } return converter.RenderSuccess } golang-github-johanneskaufmann-html-to-markdown-2.3.1/plugin/base/renderers_test.go000066400000000000000000000051001476711565700306000ustar00rootroot00000000000000package base_test import ( "testing" "github.com/JohannesKaufmann/html-to-markdown/v2/converter" "github.com/JohannesKaufmann/html-to-markdown/v2/plugin/base" "github.com/JohannesKaufmann/html-to-markdown/v2/plugin/commonmark" "golang.org/x/net/html" ) func TestRenderAsX(t *testing.T) { input := `

heading

bold text
` testCases := []struct { desc string isInline bool renderFunc converter.HandleRenderFunc expected string }{ { desc: "Default Block", renderFunc: func(ctx converter.Context, w converter.Writer, n *html.Node) converter.RenderStatus { return converter.RenderTryNext }, expected: "# heading\n\n**bold text**", }, { desc: "Default Inline", isInline: true, renderFunc: func(ctx converter.Context, w converter.Writer, n *html.Node) converter.RenderStatus { return converter.RenderTryNext }, expected: "# heading\n\n**bold text**", }, { desc: "RenderAsHTML Block", renderFunc: base.RenderAsHTML, expected: "# heading\n\n
bold text
", }, { desc: "RenderAsHTML Inline", isInline: true, renderFunc: base.RenderAsHTML, expected: "# heading\n\n
bold text
", }, { desc: "RenderAsHTMLWrapper Block", renderFunc: base.RenderAsHTMLWrapper, expected: "# heading\n\n
\n\n**bold text**\n\n
", }, { desc: "RenderAsHTMLWrapper Inline", isInline: true, renderFunc: base.RenderAsHTMLWrapper, expected: "# heading\n\n
\n\n**bold text**\n\n
", }, { desc: "RenderAsPlaintextWrapper Block", renderFunc: base.RenderAsPlaintextWrapper, expected: "# heading\n\n**bold text**", }, { desc: "RenderAsPlaintextWrapper Inline", isInline: true, renderFunc: base.RenderAsPlaintextWrapper, expected: "# heading\n\n**bold text**", }, } for _, tC := range testCases { t.Run(tC.desc, func(t *testing.T) { conv := converter.NewConverter( converter.WithPlugins( base.NewBasePlugin(), commonmark.NewCommonmarkPlugin(), ), ) if tC.isInline { conv.Register.RendererFor("footer", converter.TagTypeInline, tC.renderFunc, converter.PriorityStandard) } else { conv.Register.RendererFor("footer", converter.TagTypeBlock, tC.renderFunc, converter.PriorityStandard) } output, err := conv.ConvertString(input) if err != nil { t.Fatal(err) } if output != tC.expected { t.Errorf("expected %q but got %q", tC.expected, output) } }) } } golang-github-johanneskaufmann-html-to-markdown-2.3.1/plugin/commonmark/000077500000000000000000000000001476711565700264565ustar00rootroot00000000000000golang-github-johanneskaufmann-html-to-markdown-2.3.1/plugin/commonmark/commonmark.go000066400000000000000000000125721476711565700311570ustar00rootroot00000000000000package commonmark import ( "bytes" "strings" "github.com/JohannesKaufmann/html-to-markdown/v2/converter" "github.com/JohannesKaufmann/html-to-markdown/v2/internal/domutils" "github.com/JohannesKaufmann/html-to-markdown/v2/internal/escape" "github.com/JohannesKaufmann/html-to-markdown/v2/marker" "golang.org/x/net/html" ) type commonmark struct { config } type OptionFunc = func(config *config) // _ or * // // default: * func WithEmDelimiter(delimiter string) OptionFunc { return func(config *config) { config.EmDelimiter = delimiter } } // ** or __ // // default: ** func WithStrongDelimiter(delimiter string) OptionFunc { return func(config *config) { config.StrongDelimiter = delimiter } } // Any Thematic break // // default: "* * *" func WithHorizontalRule(rule string) OptionFunc { return func(config *config) { config.HorizontalRule = rule } } // "-", "+", or "*" // // default: "-" func WithBulletListMarker(marker string) OptionFunc { return func(config *config) { config.BulletListMarker = marker } } func WithListEndComment(enabled bool) OptionFunc { return func(config *config) { config.DisableListEndComment = !enabled } } // ``` or ~~~ // // default: ``` func WithCodeBlockFence(fence string) OptionFunc { return func(config *config) { config.CodeBlockFence = fence } } // "setext" or "atx" // // default: "atx" func WithHeadingStyle(style headingStyle) OptionFunc { return func(config *config) { config.HeadingStyle = style } } // WithLinkEmptyHrefBehavior configures how links with *empty hrefs* are rendered. // Take for example: // // the link content // // LinkBehaviorRenderAsLink would result in "[the link content]()" // // LinkBehaviorSkipLink would result in "the link content" func WithLinkEmptyHrefBehavior(behavior linkRenderingBehavior) OptionFunc { return func(config *config) { config.LinkEmptyHrefBehavior = behavior } } // WithLinkEmptyContentBehavior configures how links *without content* are rendered. // Take for example: // // // // LinkBehaviorRenderAsLink would result in "[](/page)" // // LinkBehaviorSkipLink would result in an empty string. func WithLinkEmptyContentBehavior(behavior linkRenderingBehavior) OptionFunc { return func(config *config) { config.LinkEmptyContentBehavior = behavior } } // TODO: allow changing the link style once the render logic is implemented // // "inlined" or "referenced_index" or "referenced_short" // // default: inlined // func WithLinkStyle(style linkStyle) OptionFunc { // return func(config *config) { // config.LinkStyle = style // } // } // NewCommonmarkPlugin registers the markdown syntax of commonmark. func NewCommonmarkPlugin(opts ...OptionFunc) converter.Plugin { cfg := &config{} for _, opt := range opts { opt(cfg) } cm := commonmark{ config: fillInDefaultConfig(cfg), } return &cm } func (s *commonmark) Name() string { return "commonmark" } func (cm *commonmark) Init(conv *converter.Converter) error { if err := validateConfig(&cm.config); err != nil { return err } // - - - - - - - - // conv.Register.PreRenderer(cm.handlePreRender, converter.PriorityStandard) // Note: Should run after "collapse" & also after "remove" conv.Register.PreRenderer(func(ctx converter.Context, doc *html.Node) { if cm.DisableListEndComment { // Early return if the feature is unwanted return } domutils.AddListEndComments(ctx, doc) }, converter.PriorityLate+100) conv.Register.EscapedChar( '\\', '*', '_', '-', '+', '.', '>', '|', '$', '#', '=', '[', ']', '(', ')', '!', '~', '`', '"', '\'', ) conv.Register.UnEscaper(escape.IsItalicOrBold, converter.PriorityStandard) conv.Register.UnEscaper(escape.IsBlockQuote, converter.PriorityStandard) conv.Register.UnEscaper(escape.IsAtxHeader, converter.PriorityStandard) conv.Register.UnEscaper(escape.IsSetextHeader, converter.PriorityStandard) conv.Register.UnEscaper(escape.IsDivider, converter.PriorityStandard) conv.Register.UnEscaper(escape.IsOrderedList, converter.PriorityStandard) conv.Register.UnEscaper(escape.IsUnorderedList, converter.PriorityStandard) conv.Register.UnEscaper(escape.IsImageOrLink, converter.PriorityStandard) conv.Register.UnEscaper(escape.IsFencedCode, converter.PriorityStandard) conv.Register.UnEscaper(escape.IsInlineCode, converter.PriorityStandard) conv.Register.UnEscaper(escape.IsBackslash, converter.PriorityStandard) conv.Register.Renderer(cm.handleRender, converter.PriorityStandard) conv.Register.TextTransformer(cm.handleTextTransform, converter.PriorityLate) conv.Register.PostRenderer(cm.handlePostRenderCodeBlockNewline, converter.PriorityLate) return nil } func (cm commonmark) handlePostRenderCodeBlockNewline(ctx converter.Context, content []byte) []byte { return bytes.ReplaceAll( content, []byte(string(marker.BytesMarkerCodeBlockNewline)), []byte("\n"), ) } func (cm commonmark) handleTextTransform(ctx converter.Context, content string) string { if isEnabled, ok := ctx.Value("is_inside_link").(bool); ok && isEnabled { content = strings.Replace(content, string(marker.MarkerEscaping)+`]`, `\]`, -1) } // if isEnabled, ok := ctx.Value("is_inside_heading").(bool); ok && isEnabled { // // The "#" character would be completely removed, if at the _end_ // // of the heading content. So always escape it inside headings. // content = strings.Replace(content, string(marker.MarkerEscaping)+`#`, `\#`, -1) // } return content } golang-github-johanneskaufmann-html-to-markdown-2.3.1/plugin/commonmark/commonmark_test.go000066400000000000000000000225431476711565700322150ustar00rootroot00000000000000package commonmark_test import ( "bytes" "testing" htmltomarkdown "github.com/JohannesKaufmann/html-to-markdown/v2" "github.com/JohannesKaufmann/html-to-markdown/v2/converter" "github.com/JohannesKaufmann/html-to-markdown/v2/internal/tester" "github.com/JohannesKaufmann/html-to-markdown/v2/plugin/base" "github.com/JohannesKaufmann/html-to-markdown/v2/plugin/commonmark" ) func TestGoldenFiles(t *testing.T) { goldenFileConvert := func(htmlInput []byte) ([]byte, error) { conv := converter.NewConverter( converter.WithPlugins( base.NewBasePlugin(), commonmark.NewCommonmarkPlugin(), ), ) // It makes the testcases easier to read if we keep the as raw html block. // To override the setting from the base it needs to run *early* conv.Register.RendererFor("#comment", converter.TagTypeBlock, base.RenderAsHTML, converter.PriorityEarly) return conv.ConvertReader(bytes.NewReader(htmlInput)) } roundTripConvert := func(html []byte) (markdown []byte, err error) { // For the golden files we are keeping #comment as a block // but collapse treats it as an inline element (which it is). // // So this testcase would cause problems. // "
before after
" md, err := htmltomarkdown.ConvertString(string(html)) return []byte(md), err } tester.GoldenFiles(t, goldenFileConvert, roundTripConvert) } func TestOptionFunc(t *testing.T) { testCases := []struct { desc string input string options []commonmark.OptionFunc expected string }{ // - - - - - - - - - - Italic & Bold - - - - - - - - - - // { desc: "WithEmDelimiter", options: []commonmark.OptionFunc{ commonmark.WithEmDelimiter("_"), }, input: `italic`, expected: `_italic_`, }, { desc: "WithStrongDelimiter", options: []commonmark.OptionFunc{ commonmark.WithStrongDelimiter("__"), }, input: `bold`, expected: `__bold__`, }, // - - - - - - - - - - Horizontal Rule - - - - - - - - - - // { desc: "WithHorizontalRule(***)", options: []commonmark.OptionFunc{ commonmark.WithHorizontalRule("***"), }, input: `
`, expected: `***`, }, { desc: "WithHorizontalRule(******)", options: []commonmark.OptionFunc{ commonmark.WithHorizontalRule("******"), }, input: `
`, expected: `******`, }, { desc: "WithHorizontalRule(---)", options: []commonmark.OptionFunc{ commonmark.WithHorizontalRule("---"), }, input: `
`, expected: `---`, }, { desc: "WithHorizontalRule(___)", options: []commonmark.OptionFunc{ commonmark.WithHorizontalRule("___"), }, input: `
`, expected: `___`, }, // - - - - - - - - - - List - - - - - - - - - - // { desc: "WithBulletListMarker(+)", options: []commonmark.OptionFunc{ commonmark.WithBulletListMarker("+"), }, input: `
  • list item
`, expected: `+ list item`, }, { desc: "WithBulletListMarker(*)", options: []commonmark.OptionFunc{ commonmark.WithBulletListMarker("*"), }, input: `
  • list a
  • list b
`, expected: "* list a\n\n\n\n* list b", }, { desc: "WithBulletListMarker(*) and WithListEndComment(false)", options: []commonmark.OptionFunc{ commonmark.WithBulletListMarker("*"), commonmark.WithListEndComment(false), }, input: `
  • list a
  • list b
`, expected: "* list a\n\n* list b", }, // - - - - - - - - - - Code - - - - - - - - - - // { desc: "WithCodeBlockFence", options: []commonmark.OptionFunc{ commonmark.WithCodeBlockFence("~~~"), }, input: `
hello world
`, expected: "~~~\nhello world\n~~~", }, // - - - - - - - - - - Heading - - - - - - - - - - // { desc: "WithHeadingStyle(atx)", options: []commonmark.OptionFunc{ commonmark.WithHeadingStyle("atx"), }, input: `

important
heading

`, expected: "# important heading", }, { desc: "WithHeadingStyle(setext)", options: []commonmark.OptionFunc{ commonmark.WithHeadingStyle("setext"), }, input: `

important
heading

`, expected: "important \nheading\n===========", }, // - - - - - - - - - - Link - - - - - - - - - - // { desc: "WithLinkEmptyHrefBehavior(render)", options: []commonmark.OptionFunc{ commonmark.WithLinkEmptyHrefBehavior("render"), }, input: `the link content`, expected: "[the link content]()", }, { desc: "WithLinkEmptyHrefBehavior(skip)", options: []commonmark.OptionFunc{ commonmark.WithLinkEmptyHrefBehavior("skip"), }, input: `the link content`, expected: "the link content", }, // - - - // { desc: "WithLinkEmptyContentBehavior(render)", options: []commonmark.OptionFunc{ commonmark.WithLinkEmptyContentBehavior("render"), }, input: ``, expected: "[](/page)", }, { desc: "WithLinkEmptyContentBehavior(skip)", options: []commonmark.OptionFunc{ commonmark.WithLinkEmptyContentBehavior("skip"), }, input: ``, expected: "", }, // TODO: handle other link styles // { // desc: "WithLinkStyle(LinkInlined)", // options: []commonmark.OptionFunc{ // commonmark.WithLinkStyle(commonmark.LinkInlined), // }, // input: `link`, // expected: "[link](/about)", // }, } for _, tC := range testCases { t.Run(tC.desc, func(t *testing.T) { conv := converter.NewConverter( converter.WithPlugins( base.NewBasePlugin(), commonmark.NewCommonmarkPlugin( tC.options..., ), ), ) output, err := conv.ConvertString(tC.input) if err != nil { t.Error(err) } if output != tC.expected { t.Errorf("expected %q but got %q", tC.expected, output) } }) } } func TestOptionFunc_ValidationError(t *testing.T) { testCases := []struct { desc string options []commonmark.OptionFunc expectedError string }{ { desc: "WithEmDelimiter(__)", options: []commonmark.OptionFunc{ commonmark.WithEmDelimiter("__"), }, expectedError: `error while initializing "commonmark" plugin: invalid value for EmDelimiter:"__" must be exactly 1 character of "*" or "_"`, }, { desc: "WithEmDelimiter(**)", options: []commonmark.OptionFunc{ commonmark.WithEmDelimiter("**"), }, expectedError: `error while initializing "commonmark" plugin: invalid value for EmDelimiter:"**" must be exactly 1 character of "*" or "_"`, }, { desc: "WithStrongDelimiter(_)", options: []commonmark.OptionFunc{ commonmark.WithStrongDelimiter("_"), }, expectedError: `error while initializing "commonmark" plugin: invalid value for StrongDelimiter:"_" must be exactly 2 characters of "**" or "__"`, }, { desc: "WithStrongDelimiter(*)", options: []commonmark.OptionFunc{ commonmark.WithStrongDelimiter("*"), }, expectedError: `error while initializing "commonmark" plugin: invalid value for StrongDelimiter:"*" must be exactly 2 characters of "**" or "__"`, }, { desc: "WithHorizontalRule(* *)", options: []commonmark.OptionFunc{ commonmark.WithHorizontalRule("* *"), }, expectedError: `error while initializing "commonmark" plugin: invalid value for HorizontalRule:"* *" must be at least 3 characters of "*", "_" or "-"`, }, { desc: "WithHorizontalRule(+++)", options: []commonmark.OptionFunc{ commonmark.WithHorizontalRule("+++"), }, expectedError: `error while initializing "commonmark" plugin: invalid value for HorizontalRule:"+++" must be at least 3 characters of "*", "_" or "-"`, }, { desc: "WithBulletListMarker(_)", options: []commonmark.OptionFunc{ commonmark.WithBulletListMarker("_"), }, expectedError: `error while initializing "commonmark" plugin: invalid value for BulletListMarker:"_" must be one of "-", "+" or "*"`, }, { desc: "WithCodeBlockFence(~~)", options: []commonmark.OptionFunc{ commonmark.WithCodeBlockFence("~~"), }, expectedError: "error while initializing \"commonmark\" plugin: invalid value for CodeBlockFence:\"~~\" must be one of \"```\" or \"~~~\"", }, { desc: "WithHeadingStyle(ATX)", options: []commonmark.OptionFunc{ commonmark.WithHeadingStyle("ATX"), }, expectedError: `error while initializing "commonmark" plugin: invalid value for HeadingStyle:"ATX" must be one of "atx" or "setext"`, }, { desc: "WithHeadingStyle(misspelling settext)", options: []commonmark.OptionFunc{ commonmark.WithHeadingStyle("settext"), }, expectedError: `error while initializing "commonmark" plugin: invalid value for HeadingStyle:"settext" must be one of "atx" or "setext"`, }, } for _, tC := range testCases { t.Run(tC.desc, func(t *testing.T) { conv := converter.NewConverter( converter.WithPlugins( base.NewBasePlugin(), commonmark.NewCommonmarkPlugin( tC.options..., ), ), ) _, err := conv.ConvertString("bold text") if err == nil { t.Fatal("expected an error but got nil") } _, isValidateConfigError := err.(*commonmark.ValidateConfigError) if !isValidateConfigError { // t.Error("the error is not of type ValidateConfigError") } actual := err.Error() if actual != tC.expectedError { t.Errorf("expected %q but got %q", tC.expectedError, actual) } }) } } golang-github-johanneskaufmann-html-to-markdown-2.3.1/plugin/commonmark/handle_pre_render.go000066400000000000000000000047631476711565700324570ustar00rootroot00000000000000package commonmark import ( "github.com/JohannesKaufmann/dom" "github.com/JohannesKaufmann/html-to-markdown/v2/converter" "github.com/JohannesKaufmann/html-to-markdown/v2/internal/domutils" "golang.org/x/net/html" ) func nameIsBold(node *html.Node) bool { name := dom.NodeName(node) return name == "strong" || name == "b" } func nameIsItalic(node *html.Node) bool { name := dom.NodeName(node) return name == "em" || name == "i" } func nameIsBoldOrItalic(node *html.Node) bool { return nameIsBold(node) || nameIsItalic(node) } func nameIsBothBoldOrItalic(a, b *html.Node) bool { if nameIsBold(a) && nameIsBold(b) { return true } if nameIsItalic(a) && nameIsItalic(b) { return true } return false } func nameIsPre(node *html.Node) bool { name := dom.NodeName(node) return name == "pre" } func nameIsInlineCode(node *html.Node) bool { name := dom.NodeName(node) return name == "code" || name == "var" || name == "samp" || name == "kbd" || name == "tt" } func nameIsLink(node *html.Node) bool { return dom.NodeName(node) == "a" } func nameIsBothLink(a, b *html.Node) bool { return dom.NodeName(a) == "a" && dom.NodeName(b) == "a" } func nameIsHeading(node *html.Node) bool { name := dom.NodeName(node) if name == "h1" || name == "h2" || name == "h3" || name == "h4" || name == "h5" || name == "h6" { return true } return false } // func nameIsBlockquote(node *html.Node) bool { // return dom.NodeName(node) == "blockquote" // } func (c *commonmark) handlePreRender(ctx converter.Context, doc *html.Node) { domutils.RenameFakeSpans(ctx, doc) // domutils.SplitUp(ctx, doc, nameIsBoldOrItalic, nameIsLink, atom.Span) // domutils.SplitUp(ctx, doc, nameIsLink, nameIsHeading, atom.Div) // domutils.SplitUp(ctx, doc, nameIsLink, nameIsBlockquote, atom.Div) // - - - Bold / Italic - - - // domutils.RemoveRedundant(doc, nameIsBothBoldOrItalic) domutils.MergeAdjacent(doc, nameIsBoldOrItalic) // domutils.MovePunctuation(ctx, doc, nameIsBoldOrItalic) // - - - Code - - - // domutils.RemoveEmptyCode(ctx, doc) domutils.SwapTags(ctx, doc, nameIsInlineCode, nameIsPre) domutils.MergeAdjacent(doc, nameIsInlineCode) domutils.AddSpace(ctx, doc, nameIsBoldOrItalic, nameIsInlineCode) // - - - Link - - - // domutils.RemoveRedundant(doc, nameIsBothLink) domutils.SwapTags(ctx, doc, nameIsBoldOrItalic, nameIsLink) // - - - Heading - - - // domutils.SwapTags(ctx, doc, nameIsLink, nameIsHeading) domutils.LeafBlockAlternatives(ctx, doc) // - - - List - - - // domutils.MoveListItems(ctx, doc) } golang-github-johanneskaufmann-html-to-markdown-2.3.1/plugin/commonmark/handle_render.go000066400000000000000000000017461476711565700316070ustar00rootroot00000000000000package commonmark import ( "github.com/JohannesKaufmann/dom" "github.com/JohannesKaufmann/html-to-markdown/v2/converter" "golang.org/x/net/html" ) func (c *commonmark) handleRender(ctx converter.Context, w converter.Writer, n *html.Node) converter.RenderStatus { name := dom.NodeName(n) switch name { case "strong", "b", "em", "i": return c.renderBoldItalic(ctx, w, n) case "hr": return c.renderDivider(ctx, w, n) case "br": return c.renderBreak(ctx, w, n) case "ul", "ol": return c.renderListContainer(ctx, w, n) case "pre": return c.renderBlockCode(ctx, w, n) case "code", "var", "samp", "kbd", "tt": return c.renderInlineCode(ctx, w, n) case "blockquote": return c.renderBlockquote(ctx, w, n) case "h1", "h2", "h3", "h4", "h5", "h6": return c.renderHeading(ctx, w, n) case "img": return c.renderImage(ctx, w, n) case "a": return c.renderLink(ctx, w, n) case "#comment": return c.renderComment(ctx, w, n) } return converter.RenderTryNext } golang-github-johanneskaufmann-html-to-markdown-2.3.1/plugin/commonmark/options.go000066400000000000000000000052521476711565700305040ustar00rootroot00000000000000package commonmark type linkStyle string const ( // For example: // // [view more](/about.html) LinkStyleInlined linkStyle = "inlined" LinkStyleReferencedIndex linkStyle = "referenced_index" LinkStyleReferencedShort linkStyle = "referenced_short" ) type headingStyle string const ( // HeadingStyleATX is the heading style of prefixing the heading with "#" signs indicating the level. For example: // // ## Heading HeadingStyleATX headingStyle = "atx" // HeadingStyleSetext is the heading style of putting "=" or "-" on the followed line. For example: // // Heading // ------- HeadingStyleSetext headingStyle = "setext" ) type linkRenderingBehavior string const ( // LinkBehaviorRender renders the element as a link LinkBehaviorRender linkRenderingBehavior = "render" // LinkBehaviorSkip skips link rendering and falls back to the other rules (e.g. paragraph) LinkBehaviorSkip linkRenderingBehavior = "skip" ) // config to customize the output. You can change stuff like // the character that is used for strong text. type config struct { // _ or * // // default: * EmDelimiter string // ** or __ // // default: ** StrongDelimiter string // Any Thematic break // // default: "* * *" HorizontalRule string // "-", "+", or "*" // // default: "-" BulletListMarker string DisableListEndComment bool // "indented" or "fenced" // // default: "indented" // TODO: CodeBlockStyle string // ``` or ~~~ // // default: ``` CodeBlockFence string // "setext" or "atx" // // default: "atx" HeadingStyle headingStyle // TODO: LineBreakStyle string "hard" or "soft" // "inlined" or "referenced_index" or "referenced_short" // // default: inlined LinkStyle linkStyle LinkEmptyHrefBehavior linkRenderingBehavior LinkEmptyContentBehavior linkRenderingBehavior } func fillInDefaultConfig(cfg *config) config { if cfg.EmDelimiter == "" { // The new default is now "*" (instead of "_") as that works better inside words. cfg.EmDelimiter = "*" } if cfg.StrongDelimiter == "" { cfg.StrongDelimiter = "**" } if cfg.HorizontalRule == "" { cfg.HorizontalRule = "* * *" } if cfg.BulletListMarker == "" { cfg.BulletListMarker = "-" } // TODO: also check for spelling mistakes in "indented" // if opt.CodeBlockStyle == "" { // opt.CodeBlockStyle = "indented" // } if cfg.CodeBlockFence == "" { cfg.CodeBlockFence = "```" } if cfg.HeadingStyle == "" { cfg.HeadingStyle = "atx" } if cfg.LinkEmptyHrefBehavior == "" { cfg.LinkEmptyHrefBehavior = LinkBehaviorRender } if cfg.LinkEmptyContentBehavior == "" { cfg.LinkEmptyContentBehavior = LinkBehaviorRender } if cfg.LinkStyle == "" { cfg.LinkStyle = LinkStyleInlined } return *cfg } golang-github-johanneskaufmann-html-to-markdown-2.3.1/plugin/commonmark/render_blockquote.go000066400000000000000000000014371476711565700325210ustar00rootroot00000000000000package commonmark import ( "bytes" "github.com/JohannesKaufmann/html-to-markdown/v2/converter" "github.com/JohannesKaufmann/html-to-markdown/v2/internal/textutils" "golang.org/x/net/html" ) func (c *commonmark) renderBlockquote(ctx converter.Context, w converter.Writer, n *html.Node) converter.RenderStatus { var buf bytes.Buffer ctx.RenderChildNodes(ctx, &buf, n) content := buf.Bytes() content = bytes.TrimSpace(content) if content == nil { return converter.RenderSuccess } content = textutils.TrimConsecutiveNewlines(content) content = textutils.TrimUnnecessaryHardLineBreaks(content) content = textutils.PrefixLines(content, []byte{'>', ' '}) w.WriteRune('\n') w.WriteRune('\n') w.Write(content) w.WriteRune('\n') w.WriteRune('\n') return converter.RenderSuccess } golang-github-johanneskaufmann-html-to-markdown-2.3.1/plugin/commonmark/render_bold_italic.go000066400000000000000000000022011476711565700326040ustar00rootroot00000000000000package commonmark import ( "bytes" "github.com/JohannesKaufmann/dom" "github.com/JohannesKaufmann/html-to-markdown/v2/converter" "github.com/JohannesKaufmann/html-to-markdown/v2/internal/textutils" "golang.org/x/net/html" ) func (c commonmark) getDelimiter(n *html.Node) []byte { name := dom.NodeName(n) if name == "strong" || name == "b" { return []byte(c.StrongDelimiter) } else if name == "em" || name == "i" { return []byte(c.EmDelimiter) } else { return nil } } func (c commonmark) renderBoldItalic(ctx converter.Context, w converter.Writer, n *html.Node) converter.RenderStatus { var buf bytes.Buffer ctx.RenderChildNodes(ctx, &buf, n) // Depending on the options & whether it is bold or italic there // is going to be a different delimiter. delimiter := c.getDelimiter(n) content := buf.Bytes() // If there is a newline character between the start and end delimiter // the delimiters won't be recognized. Either we remove all newline characters // OR on _every_ line we put start & end delimiters. content = textutils.DelimiterForEveryLine(content, delimiter) w.Write(content) return converter.RenderSuccess } golang-github-johanneskaufmann-html-to-markdown-2.3.1/plugin/commonmark/render_bold_italic_test.go000066400000000000000000000060571476711565700336600ustar00rootroot00000000000000package commonmark_test import ( "testing" "github.com/JohannesKaufmann/html-to-markdown/v2/converter" "github.com/JohannesKaufmann/html-to-markdown/v2/plugin/base" "github.com/JohannesKaufmann/html-to-markdown/v2/plugin/commonmark" ) func TestNewCommonmarkPlugin_Italic(t *testing.T) { const nonBreakingSpace = '\u00A0' const zeroWidthSpace = '\u200b' runs := []struct { desc string input string expected string }{ { desc: "simple", input: `

Text

`, expected: `*Text*`, }, { desc: "normal text surrounded by italic", input: `ItalicNormalItalic`, expected: `*Italic*Normal*Italic*`, }, { desc: "italic text surrounded by normal", input: `NormalItalicNormal`, expected: `Normal*Italic*Normal`, }, { desc: "with spaces inside", input: `

Text

`, expected: `*Text*`, }, { desc: "with delimiter inside", input: `

*A*B*

`, expected: `*\*A\*B\**`, }, { desc: "adjacent", input: `AB C`, expected: `*AB* *C*`, }, { desc: "adjacent and lots of spaces", input: ` A B C `, expected: `*A B* *C*`, }, { desc: "nested", input: `A B C`, expected: `*A B C*`, }, { desc: "nested and lots of spaces", input: ` A B C `, expected: `*A B C*`, }, { desc: "mixed nested 1", input: `A B C`, expected: `*A **B** C*`, }, { desc: "mixed nested 2", input: `A B C`, expected: `**A *B* C**`, }, { desc: "mixed different italic", input: `ABC`, expected: `*ABC*`, }, { desc: "next to each other in other containers", input: `
A
B
C
`, expected: "*A*\n\n*B*\n\n*C*", }, // - - - - // { desc: "empty italic #1", input: `beforeafter`, expected: `beforeafter`, }, { desc: "empty italic #2", input: `before after`, expected: `before after`, }, { desc: "empty italic #3", input: `before after`, expected: `before after`, }, { desc: "italic with non-breaking-space", input: `before` + string(nonBreakingSpace) + `after`, expected: `before` + string(nonBreakingSpace) + `after`, }, { desc: "italic with zero-width-space", input: `before` + string(zeroWidthSpace) + `after`, expected: `before*` + string(zeroWidthSpace) + `*after`, }, } for _, run := range runs { t.Run(run.desc, func(t *testing.T) { conv := converter.NewConverter( converter.WithPlugins( base.NewBasePlugin(), commonmark.NewCommonmarkPlugin(), ), ) out, err := conv.ConvertString(run.input) if err != nil { t.Error(err) } if out != run.expected { t.Errorf("expected %q but got %q", run.expected, out) } }) } } golang-github-johanneskaufmann-html-to-markdown-2.3.1/plugin/commonmark/render_break.go000066400000000000000000000004771476711565700314400ustar00rootroot00000000000000package commonmark import ( "github.com/JohannesKaufmann/html-to-markdown/v2/converter" "golang.org/x/net/html" ) func (c *commonmark) renderBreak(_ converter.Context, w converter.Writer, _ *html.Node) converter.RenderStatus { // Render a "hard line break" w.WriteString(" \n") return converter.RenderSuccess } golang-github-johanneskaufmann-html-to-markdown-2.3.1/plugin/commonmark/render_code.go000066400000000000000000000077321476711565700312670ustar00rootroot00000000000000package commonmark import ( "bytes" "strings" "unicode/utf8" "github.com/JohannesKaufmann/dom" "github.com/JohannesKaufmann/html-to-markdown/v2/converter" "github.com/JohannesKaufmann/html-to-markdown/v2/internal/textutils" "github.com/JohannesKaufmann/html-to-markdown/v2/marker" "golang.org/x/net/html" ) func (c *commonmark) renderInlineCode(_ converter.Context, w converter.Writer, n *html.Node) converter.RenderStatus { // TODO: configure delimeter in options? fenceChar := '`' codeContent, _ := getCodeWithoutTags(n) // TODO: debug flag? if len(codeContent) == 0 { // fmt.Println("expected an empty inline code to be already removed") // panic("expected an empty inline code to be already removed") } // TODO: configurable function to decide if inline or block? if bytes.Contains(codeContent, []byte("\n")) { // fmt.Println("inline code contains newlines") // return c.renderBlockCode(ctx, w, n, render) } if bytes.TrimSpace(codeContent) == nil { // No stripping occurs if the code span contains _only_ spaces: w.WriteRune(fenceChar) w.Write(codeContent) w.WriteRune(fenceChar) return converter.RenderSuccess } // Newlines in the text aren't great, since this is inline code and not a code block. // Newlines will be stripped anyway in the browser, but it won't be recognized as code // from the markdown parser when there is more than one newline. codeContent = textutils.CollapseInlineCodeContent(codeContent) code := string(codeContent) maxCount := textutils.CalculateCodeFenceOccurrences(fenceChar, code) maxCount++ fence := strings.Repeat(string(fenceChar), maxCount) // Code contains a backtick as first character if strings.HasPrefix(code, "`") { code = " " + code } // Code contains a backtick as last character if strings.HasSuffix(code, "`") { code = code + " " } w.WriteString(fence) w.WriteString(code) w.WriteString(fence) return converter.RenderSuccess } func (c *commonmark) renderBlockCode(_ converter.Context, w converter.Writer, n *html.Node) converter.RenderStatus { code, infoString := getCodeWithoutTags(n) if bytes.HasSuffix(code, []byte("\n")) { code = code[:len(code)-1] } fenceChar, _ := utf8.DecodeRuneInString(c.CodeBlockFence) fence := textutils.CalculateCodeFence(fenceChar, string(code)) // We want to keep the original content inside the code block untouched. // Because multiple newlines would be trimmed, we temporarily replace it with another character. code = bytes.ReplaceAll(code, []byte("\n"), marker.BytesMarkerCodeBlockNewline) w.WriteString("\n\n") w.WriteString(fence) w.WriteString(infoString) w.WriteRune('\n') w.Write(code) w.WriteRune('\n') w.WriteString(fence) w.WriteString("\n\n") return converter.RenderSuccess } func getCodeLanguage(n *html.Node) string { class := dom.GetAttributeOr(n, "class", "") parts := strings.Split(class, " ") for _, part := range parts { if !strings.Contains(part, "language-") && !strings.Contains(part, "lang-") { continue } part = strings.Replace(part, "language-", "", 1) part = strings.Replace(part, "lang-", "", 1) return part } return "" } func getCodeWithoutTags(startNode *html.Node) ([]byte, string) { var buf bytes.Buffer var infoString string var f func(*html.Node) f = func(n *html.Node) { if n.Type == html.ElementNode && (n.Data == "code" || n.Data == "pre") { // TODO: what if multiple elements have an info string? if infoString == "" { infoString = getCodeLanguage(n) } } // - - - // if n.Type == html.ElementNode && (n.Data == "style" || n.Data == "script" || n.Data == "textarea") { return } if n.Type == html.ElementNode && (n.Data == "br" || n.Data == "div") { buf.WriteString("\n") } if n.Type == html.TextNode { // if strings.TrimSpace(n.Data) == "" && strings.Contains(n.Data, "\n") { // buf.WriteString("\n") // } buf.WriteString(n.Data) return } for c := n.FirstChild; c != nil; c = c.NextSibling { f(c) } } f(startNode) return buf.Bytes(), infoString } golang-github-johanneskaufmann-html-to-markdown-2.3.1/plugin/commonmark/render_comment.go000066400000000000000000000012161476711565700320060ustar00rootroot00000000000000package commonmark import ( "github.com/JohannesKaufmann/html-to-markdown/v2/converter" "github.com/JohannesKaufmann/html-to-markdown/v2/internal/domutils" "golang.org/x/net/html" ) func (c *commonmark) renderComment(_ converter.Context, w converter.Writer, n *html.Node) converter.RenderStatus { if n.Data == domutils.ListEndCommentData { // We definitely want to render the list end comments // that were just added w.WriteRune('\n') w.WriteRune('\n') _ = html.Render(w, n) w.WriteRune('\n') w.WriteRune('\n') return converter.RenderSuccess } // Fallback to the normal settings for comments return converter.RenderTryNext } golang-github-johanneskaufmann-html-to-markdown-2.3.1/plugin/commonmark/render_divider.go000066400000000000000000000005341476711565700317740ustar00rootroot00000000000000package commonmark import ( "github.com/JohannesKaufmann/html-to-markdown/v2/converter" "golang.org/x/net/html" ) func (c *commonmark) renderDivider(_ converter.Context, w converter.Writer, _ *html.Node) converter.RenderStatus { w.WriteString("\n\n") w.WriteString(c.HorizontalRule) w.WriteString("\n\n") return converter.RenderSuccess } golang-github-johanneskaufmann-html-to-markdown-2.3.1/plugin/commonmark/render_heading.go000066400000000000000000000065121476711565700317470ustar00rootroot00000000000000package commonmark import ( "bytes" "regexp" "github.com/JohannesKaufmann/dom" "github.com/JohannesKaufmann/html-to-markdown/v2/converter" "github.com/JohannesKaufmann/html-to-markdown/v2/internal/textutils" "github.com/JohannesKaufmann/html-to-markdown/v2/marker" "golang.org/x/net/html" ) // TODO: remove regex var multipleSpacesR = regexp.MustCompile(` +`) func (r *commonmark) setextUnderline(level int, width int) []byte { line := "-" if level == 1 { line = "=" } return bytes.Repeat([]byte(line), width) } func (r *commonmark) atxPrefix(level int) []byte { return bytes.Repeat([]byte("#"), level) } func getHeadingLevel(name string) int { switch name { case "h1": return 1 case "h2": return 2 case "h3": return 3 case "h4": return 4 case "h5": return 5 case "h6": return 6 default: return 6 } } func runeCount(chars []rune) (count int) { for _, char := range chars { if char == marker.MarkerEscaping { continue } count++ } return } func getUnderlineWidth(content []byte, minVal int) int { var width int parts := bytes.Split(content, []byte("\n")) for _, part := range parts { // Count how wide the line should be, // while using RuneCount to correctly count ä, ö, ... // // TODO: optimize function w := utf8.RuneCount(part) w := runeCount([]rune(string(part))) if w > width { width = w } } // Technically the minimum value is only one character, // but one dash could easily trigger a heading. if width < minVal { return minVal } return width } func escapePoundSignAtEnd(s []byte) []byte { // -1 # // -2 placeholder // -3 maybe \ if s[len(s)-1] != '#' { // We don't have a # at the end, // so there is no work to do... return s } if len(s) >= 3 && s[len(s)-3] == '\\' { // It is already escaped, // so there is no work to do... return s } // Because we have a # at the end, // we should manually force the escaping // by overriding the placeholder. s[len(s)-2] = '\\' return s } func (c *commonmark) renderHeading(ctx converter.Context, w converter.Writer, n *html.Node) converter.RenderStatus { // ctx = context.WithValue(ctx, "is_inside_heading", true) level := getHeadingLevel(dom.NodeName(n)) var buf bytes.Buffer ctx.RenderChildNodes(ctx, &buf, n) content := buf.Bytes() if len(bytes.TrimSpace(content)) == 0 { return converter.RenderSuccess } if c.HeadingStyle == HeadingStyleSetext && level < 3 { // Note: We don't want to use `TrimUnnecessaryHardLineBreaks` here, // since `EscapeMultiLine` also takes care of newlines. content = textutils.TrimConsecutiveNewlines(content) content = textutils.EscapeMultiLine(content) width := getUnderlineWidth(content, 3) underline := c.setextUnderline(level, width) w.WriteString("\n\n") w.Write(content) w.WriteRune('\n') w.Write(underline) w.WriteString("\n\n") } else { content = bytes.ReplaceAll(content, []byte("\n"), []byte(" ")) content = bytes.ReplaceAll(content, []byte("\r"), []byte(" ")) // Replace multiple spaces by one space. content = multipleSpacesR.ReplaceAll(content, []byte(" ")) content = bytes.TrimSpace(content) // A # sign at the end would be removed otherwise content = escapePoundSignAtEnd(content) w.WriteString("\n\n") w.Write(c.atxPrefix(level)) w.WriteRune(' ') w.Write(content) w.WriteString("\n\n") } return converter.RenderSuccess } golang-github-johanneskaufmann-html-to-markdown-2.3.1/plugin/commonmark/render_image.go000066400000000000000000000027121476711565700314300ustar00rootroot00000000000000package commonmark import ( "bytes" "strings" "github.com/JohannesKaufmann/dom" "github.com/JohannesKaufmann/html-to-markdown/v2/converter" "github.com/JohannesKaufmann/html-to-markdown/v2/internal/textutils" "golang.org/x/net/html" ) func escapeAlt(altString string) string { alt := []byte(altString) var buf bytes.Buffer for i := range alt { if alt[i] == '[' || alt[i] == ']' { prevIndex := i - 1 if prevIndex < 0 || alt[prevIndex] != '\\' { buf.WriteRune('\\') } } buf.WriteByte(alt[i]) } return buf.String() } func (c *commonmark) renderImage(ctx converter.Context, w converter.Writer, n *html.Node) converter.RenderStatus { src := dom.GetAttributeOr(n, "src", "") src = strings.TrimSpace(src) if src == "" { return converter.RenderTryNext } src = ctx.AssembleAbsoluteURL(ctx, "img", src) title := dom.GetAttributeOr(n, "title", "") title = strings.ReplaceAll(title, "\n", " ") alt := dom.GetAttributeOr(n, "alt", "") alt = strings.ReplaceAll(alt, "\n", " ") // The alt description will be placed between two square brackets `[alt]` // so make sure that those characters are escaped. alt = escapeAlt(alt) w.WriteRune('!') w.WriteRune('[') w.WriteString(alt) w.WriteRune(']') w.WriteRune('(') w.WriteString(src) if title != "" { // The destination and title must be seperated by a space w.WriteRune(' ') w.Write(textutils.SurroundByQuotes([]byte(title))) } w.WriteRune(')') return converter.RenderSuccess } golang-github-johanneskaufmann-html-to-markdown-2.3.1/plugin/commonmark/render_link.go000066400000000000000000000052501476711565700313030ustar00rootroot00000000000000package commonmark import ( "bytes" "strings" "github.com/JohannesKaufmann/dom" "github.com/JohannesKaufmann/html-to-markdown/v2/converter" "github.com/JohannesKaufmann/html-to-markdown/v2/internal/textutils" "golang.org/x/net/html" ) // link in commonmark contains // - the link text (the visible text) // - a link destination (the URI that is the link destination) // - an optional link title type link struct { *html.Node before []byte content []byte after []byte href string title string } func (c *commonmark) renderLinkInlined(w converter.Writer, l *link) converter.RenderStatus { w.Write(l.before) w.WriteRune('[') w.Write(l.content) w.WriteRune(']') w.WriteRune('(') w.WriteString(l.href) if l.title != "" { // The destination and title must be separated by a space w.WriteRune(' ') w.Write(textutils.SurroundByQuotes([]byte(l.title))) } w.WriteRune(')') w.Write(l.after) return converter.RenderSuccess } func (c *commonmark) renderLink(ctx converter.Context, w converter.Writer, n *html.Node) converter.RenderStatus { ctx = ctx.WithValue("is_inside_link", true) href := dom.GetAttributeOr(n, "href", "") href = strings.TrimSpace(href) href = ctx.AssembleAbsoluteURL(ctx, "a", href) if href == "" && c.config.LinkEmptyHrefBehavior == LinkBehaviorSkip { // There is *no href* for the link. Now we have two options: // Continue rendering as a link OR skip to let other renderers take over. return converter.RenderTryNext } title := dom.GetAttributeOr(n, "title", "") title = strings.ReplaceAll(title, "\n", " ") l := &link{ Node: n, href: href, title: title, } var buf bytes.Buffer ctx.RenderChildNodes(ctx, &buf, n) content := buf.Bytes() if len(bytes.TrimSpace(content)) == 0 { // Fallback to the title content = []byte(l.title) } if len(bytes.TrimSpace(content)) == 0 && c.config.LinkEmptyContentBehavior == LinkBehaviorSkip { // There is *no content* inside the link. Now we have two options: // Continue rendering as a link OR skip to let other renderers take over. return converter.RenderTryNext } if l.href == "" { // A link without href is valid, like e.g. [text]() // But a title would make it invalid. l.title = "" } leftExtra, trimmed, rightExtra := textutils.SurroundingSpaces(content) // Note: We don't want to use `TrimUnnecessaryHardLineBreaks` here, // since `EscapeMultiLine` also takes care of newlines. trimmed = textutils.TrimConsecutiveNewlines(trimmed) trimmed = textutils.EscapeMultiLine(trimmed) l.before = leftExtra l.content = trimmed l.after = rightExtra switch c.LinkStyle { case LinkStyleInlined: return c.renderLinkInlined(w, l) default: return converter.RenderTryNext } } golang-github-johanneskaufmann-html-to-markdown-2.3.1/plugin/commonmark/render_list.go000066400000000000000000000053641476711565700313270ustar00rootroot00000000000000package commonmark import ( "bytes" "fmt" "strconv" "unicode/utf8" "github.com/JohannesKaufmann/dom" "github.com/JohannesKaufmann/html-to-markdown/v2/converter" "github.com/JohannesKaufmann/html-to-markdown/v2/internal/textutils" "github.com/JohannesKaufmann/html-to-markdown/v2/marker" "golang.org/x/net/html" ) func getStartAt(node *html.Node) int { startVal := dom.GetAttributeOr(node, "start", "1") startAt, err := strconv.Atoi(startVal) if err != nil { startAt = 1 } return startAt } func (c commonmark) getPrefixFunc(n *html.Node, sliceLength int) func(int) string { startAt := getStartAt(n) return func(sliceIndex int) string { if n.Data == "ul" { return c.BulletListMarker + " " } currentIndex := startAt + sliceIndex lastIndex := startAt + sliceLength - 1 maxLength := utf8.RuneCountInString(strconv.Itoa(lastIndex)) // Pad the numbers so that all prefix numbers in the list take up the same space // `%02d.` -> "01. " format := `%0` + strconv.Itoa(maxLength) + `d. ` return fmt.Sprintf(format, currentIndex) } } func renderMultiLineListItem(w converter.Writer, content []byte, indentCount int) { lines := bytes.Split(content, []byte("\n")) indent := bytes.Repeat([]byte(" "), indentCount) indentedCodeBlockNewline := append(marker.BytesMarkerCodeBlockNewline, indent...) for i := range lines { // Add indent to code block newlines line := bytes.ReplaceAll(lines[i], marker.BytesMarkerCodeBlockNewline, indentedCodeBlockNewline) if i != 0 { // The first line is already indented through the prefix, // all other lines need the correct amount of spaces. w.Write(indent) } w.Write(line) if i < len(lines)-1 { w.WriteRune('\n') } } } func (c commonmark) renderListContainer(ctx converter.Context, w converter.Writer, n *html.Node) converter.RenderStatus { children := dom.AllChildNodes(n) items := make([][]byte, 0, len(children)) for _, child := range children { var buf bytes.Buffer ctx.RenderNodes(ctx, &buf, child) content := buf.Bytes() content = bytes.TrimSpace(content) if content == nil { continue } items = append(items, content) } if len(items) == 0 { return converter.RenderSuccess } getPrefix := c.getPrefixFunc(n, len(items)) indentCount := utf8.RuneCountInString(getPrefix(0)) w.WriteString("\n\n") for i, item := range items { w.WriteString(getPrefix(i)) item = textutils.TrimConsecutiveNewlines(item) item = textutils.TrimUnnecessaryHardLineBreaks(item) item = ctx.UnEscapeContent(item) // An item might have different lines that each // must be indented with the correct count of spaces. renderMultiLineListItem(w, item, indentCount) if i < len(items)-1 { w.WriteRune('\n') } } w.WriteString("\n\n") return converter.RenderSuccess } golang-github-johanneskaufmann-html-to-markdown-2.3.1/plugin/commonmark/testdata/000077500000000000000000000000001476711565700302675ustar00rootroot00000000000000golang-github-johanneskaufmann-html-to-markdown-2.3.1/plugin/commonmark/testdata/.gitattributes000066400000000000000000000001541476711565700331620ustar00rootroot00000000000000 # Leave the files untouched. Otherwise they might be # changed when cloning the repo on Windows... * -text golang-github-johanneskaufmann-html-to-markdown-2.3.1/plugin/commonmark/testdata/GoldenFiles/000077500000000000000000000000001476711565700324625ustar00rootroot00000000000000blockquote.in.html000066400000000000000000000024001476711565700360420ustar00rootroot00000000000000golang-github-johanneskaufmann-html-to-markdown-2.3.1/plugin/commonmark/testdata/GoldenFiles
First Line Second Line Third Line
Line A
Line B

Start Line







End Line

Start Line





End Line

Paragraph 1

Paragraph 2

Paragraph 3

before

nested

after

Heading

  1. List Item 1
  2. List Item 2

A code block:

code block content

Not a > blockquote

> not a blockquote

blockquote.out.md000066400000000000000000000012211476711565700356770ustar00rootroot00000000000000golang-github-johanneskaufmann-html-to-markdown-2.3.1/plugin/commonmark/testdata/GoldenFiles > First Line Second Line Third Line > Line A > Line B > Start Line > > End Line > Start Line > > End Line > Paragraph 1 > > Paragraph 2 > > Paragraph 3 > before > > > nested > > after > ## Heading > > 1. List Item 1 > 2. List Item 2 > > A code block: > > ``` > code block content > ``` Not a > blockquote > not a blockquotebold.in.html000066400000000000000000000064011476711565700346170ustar00rootroot00000000000000golang-github-johanneskaufmann-html-to-markdown-2.3.1/plugin/commonmark/testdata/GoldenFiles

some bold and bold text

some bold and bold text

someboldandboldtext


some text

some text

some text

sometext

some text

some text

normalboldnormal

boldnormalbold

very bold text

very bold text

hello


hello

bold onebold two

one two

ab

ab

abc


a b

Von Max Mustermann, Berlin

bold and italic

italic and bold

beforemiddleafter


before.middleafter

beforemiddle.after

before.middle.after


before .middle after

before middle. after

before .middle. after


before?!!middle?!!after


before-middle-after

before-middle-after


check it out.

check it out?

check it out!!!

!just after

just before!


heading

!italic!

heading

see here:
blockquote
see here:

paragraph

one.two one.two
before

!paragraph!

after
bold.out.md000066400000000000000000000035761476711565700344660ustar00rootroot00000000000000golang-github-johanneskaufmann-html-to-markdown-2.3.1/plugin/commonmark/testdata/GoldenFiles some **bold** and **bold** text some **bold** and **bold** text some**bold**and**bold**text * * * some text some text some text sometext some text some text normal**bold**normal **bold**normal**bold** **very bold text** **very bold text** ***hello*** * * * ***hello*** **bold onebold two** ***one*** ***two*** **ab** **ab** **abc** * * * **a** **b** **Von Max Mustermann,** **Berlin** ***bold and italic*** ***italic and bold*** before*middle*after * * * before*.middle*after before*middle.*after before*.middle.*after * * * before *.middle* after before *middle.* after before *.middle.* after * * * before*?!!middle?!!*after * * * before-*middle*-after before*-middle-*after * * * check it out*.* check it out*?* check it out*!!!* *!*just after just before*!* * * * #### heading *!italic!* #### heading **see here:** > blockquote **see here:** paragraph [*one.*](/)[two](/) [*one.*](/)[two](/) * * * before *!paragraph!* aftercode.in.html000066400000000000000000000143361476711565700346170ustar00rootroot00000000000000golang-github-johanneskaufmann-html-to-markdown-2.3.1/plugin/commonmark/testdata/GoldenFiles
inline code
variable
sample output
keyboard input
teletype text

When x = 3, that means x + 2 = 5
A simple equation: x = y + 2
before A middle B after
beforeAmiddleBafter
before A B after
beforeABafter
ABCDE
beforeinline codeafter
beforeinline codeafter
beforeainline codebafter
beforeainline codebafter
beforeinline codeafter
before inline code after
beforeinline code and inline codeafter
beforeinline code and inline codeafter

before inline code after
before inline code after
before inline code after
before inline code after

before <pre> after
before <img> after
before after
before A middle B after

The <img> tag is used to embed an image.

The  tag is used to embed an image.

    
  • List Item One
  • List Item Two
  • List Item Three
An inline code that is empty except spaces:
beforeafter
before after
before after
before after
before after
before after
before after
before after
before after
beforeafter
before after
before after
 
  

  
Beginning of code
 
  
  


End of code
Start of many newlines






End of many newlines

inline code
inline code
inline code
inline code
inline code

An inline code that contains backticks:
with ` backtick
with `` backticks
a ``` b ```` c ` d
`starting & ending with a backtick`

An inline code that just contains backticks:
before``after
before `` after
before `` after
before `` after
before `` after
before `` after
before `` after
before `` after
before `` after

```
~~~

Some ```
totally `````` normal
` code

Some ~~~
totally ~~~~~~ normal
~ code
before just code after
before
just pre
after
before
code inside pre
after
before
pre inside code
after

before // just code // another line after
before
// just pre
// another line
after
before
// code inside pre
// another line
after
before

// pre inside code
// another line
after
content
content
Line 0
    Line 1 AB C
    Line 2 AB C
Line 3


    Line 1 AB C
    Line 2 AB C


    Line 1 AB C
    Line 2 AB C

code.out.md000066400000000000000000000073371476711565700344570ustar00rootroot00000000000000golang-github-johanneskaufmann-html-to-markdown-2.3.1/plugin/commonmark/testdata/GoldenFiles `inline code` `variable` `sample output` `keyboard input` `teletype text` * * * When `x = 3`, that means `x + 2 = 5` A simple equation: `x` = `y` + 2 before `A` middle `B` after before`A`middle`B`after before `A` `B` after before`AB`after `ABCDE` before **`inline code`** after before *`inline code`* after before**a`inline code`b**after before**a`inline code`b**after before **`inline code`** after before **`inline code`** after before *`inline code` and `inline code`* after before *`inline code` and `inline code`* after * * * before **`inline code`** after before *`inline code`* after before **`inline code`** after before *`inline code`* after * * * before **`
`** after





before `` after

before after

before `A middle B` after



```

The  tag is used to embed an image.

The  tag is used to embed an image.
```



```

    
        List Item One
        List Item Two
        List Item Three
    
```





An inline code that is empty except spaces:

beforeafter

before after

before after

before` `after

before ` ` after

before ` ` after

before`  `after

before `  ` after

before `  ` after

beforeafter

before after

before after

```

```

```
 
```

```
  
```

```

  
```

```
Beginning of code
 
  
  


End of code
```

```
Start of many newlines






End of many newlines
```

* * *



`inline code`

`inline code`

`inline code`

`inline code`

`inline code`

* * *



An inline code that contains backticks:

``with ` backtick``

```with `` backticks```

`````a ``` b ```` c ` d`````

`` `starting & ending with a backtick` ``

* * *

An inline code that just contains backticks:

before``` `` ```after

before``` `` ```after

before``` `` ```after

before ``` `` ``` after

before ``` `` ``` after

before ``` `` ``` after

before ``` `` ``` after

before ``` `` ``` after

before ``` `` ``` after

* * *



````
```
````

```
~~~
```

```````

Some ```
totally `````` normal
` code
```````

```

Some ~~~
totally ~~~~~~ normal
~ code
```



before `just code` after

before

```
just pre
```

after

before

```
code inside pre
```

after

before

```
pre inside code
```

after

* * *

before `// just code // another line` after

before

```
// just pre
// another line
```

after

before

```
// code inside pre
// another line
```

after

before

```

// pre inside code
// another line
```

after



```one
content
```

```two
content
```



```
Line 0
    Line 1 AB C
    Line 2 AB C
Line 3
```

* * *

```

    Line 1 AB C
    Line 2 AB C
```

* * *

```

    Line 1 AB C
    Line 2 AB C

```heading.in.html000066400000000000000000000043751476711565700353060ustar00rootroot00000000000000golang-github-johanneskaufmann-html-to-markdown-2.3.1/plugin/commonmark/testdata/GoldenFiles



Heading 1

Heading 2

Heading 3

Heading 4

Heading 5
Heading 6
Heading 7

a

a

a


heading with spaces

heading with spaces and tabs

heading with newlines

heading

with
breaks



heading with breaks

#hashtag

# Heading

#

#

# Heading #

Heading #

Heading ##

Heading \#


These should not be recognized as headings:

not title
===

not title
=

not title
---

not title
-

#not title

# not title

## not title

important h2 heading


Heading 2


Heading 2

Heading 5

Heading 2

Description Line 1
Description Line 2
Description Line 3

Some quote


More posts from around the site:


Heading

heading.out.md000066400000000000000000000027741476711565700351440ustar00rootroot00000000000000golang-github-johanneskaufmann-html-to-markdown-2.3.1/plugin/commonmark/testdata/GoldenFiles # Heading 1 ## Heading 2 ### Heading 3 #### Heading 4 ##### Heading 5 ###### Heading 6 Heading 7 # a # a # a ## heading with spaces ## heading with spaces and tabs ## heading with newlines ## heading with breaks ## heading with breaks # #hashtag # # Heading # \# # \# # # Heading \# # Heading \# # Heading #\# # Heading \\# * * * These should not be recognized as headings: not title \=== not title \= not title \--- not title \- #not title \# not title \## not title ## **important** `h2` *heading* * * * > ## [Heading 2](/page.html) * * * > [**Heading 2** > **Heading 5**](/page.html) * * * > [**Heading 2** > \ > Description Line 1 > Description Line 2 > Description Line 3 > \ > "Some quote"](/page.html) * * * #### More posts from around the site: * * * ### **Heading**image.in.html000066400000000000000000000056151476711565700347670ustar00rootroot00000000000000golang-github-johanneskaufmann-html-to-markdown-2.3.1/plugin/commonmark/testdata/GoldenFiles

alt text

alt text

  the  alt  attribute

the alt "attribute"

the alt 'attribute'

the
alt
attribute

the [alt] attribute

the (alt) attribute

the ](alt) attribute


Such Icon Email Icon

Such Icon Email Icon


image alt text
image alt text

alt text
alt text
caption text
image.out.md000066400000000000000000000034561476711565700346250ustar00rootroot00000000000000golang-github-johanneskaufmann-html-to-markdown-2.3.1/plugin/commonmark/testdata/GoldenFiles ![](/relative_url) ![](www.example.com/absolute_url) ![alt text](/url) ![](/url "title text") ![alt text](/url "title text") ![ the alt attribute ](/url) ![the alt "attribute"](/url) ![the alt 'attribute'](/url) ![the alt attribute](/url) ![the \[alt\] attribute](/url) ![the (alt) attribute](/url) ![the \](alt) attribute](/url) * * * ![](/url " the title attribute ") ![](/url 'the title "attribute"') ![](/url "the title 'attribute'") ![](/url "the title attribute") ![](/url "the [title] attribute") ![](/url "the (title) attribute") ![](/url "the )(title) attribute") ![](data:image/gif;base64,abcdefghij) ![](data:image/svg+xml;utf8,%3Csvg%20xmlns='http://www.w3.org/2000/svg'%20width='1080'%20height='956'%3E%3C/svg%3E) [*![Such Icon](/search.svg)*]() [*![Email Icon](/email.svg)*]() [*![Such Icon](/search.svg)*]() [*![Email Icon](/email.svg)*]() * * * [![image alt text](/image.jpg "image title text")](/page.html "link title text") [![image alt text](/src)]() ![alt text](/image.jpg "title text") * * * ![alt text](/image.jpg "title text") caption textlink.in.html000066400000000000000000000144561476711565700346450ustar00rootroot00000000000000golang-github-johanneskaufmann-html-to-markdown-2.3.1/plugin/commonmark/testdata/GoldenFiles

no href

no href

no href




relative link

absolute link

query params

fragment heading

fragment

Wir freuen uns über eine Mail!

broken link

broken link

with whitespace around

with space inside

content

content

content

content

content

content

a(b)[c]

[a]

[a

a]

(a)

(a

a)

AB

A B

beforeAmiddleBafter

before A middle B after

before A middle B after

before content after

before content after

before content after


bold and italic text

bold and italic text

A
B
A

B
A


B
A
B
C

Start Line







End Line




newlines around the link content




before a inside strong after

beforea inside strongafter

before strong inside a after

beforestrong inside aafter

before middle after

before middle after

beforemiddleafter

before middle after

before middle after

before middle after

beforewith empty spanafter

before with empty span after

before with empty span after


beforea bafter

beforeabafter

beforea b cafter


beforea inside italicafter

beforeitalic inside aafter

beforea inside bafter

beforeb inside aafter

beforealready boldafter


beforemiddleafter

beforeinside bold & italicafter

beforeinside bold & italicabafter

beforeinside bold & italicafter

beforeabcdeafter


beforeitaliclinkstrongafter

before

another link

after

link.out.md000066400000000000000000000072721476711565700345000ustar00rootroot00000000000000golang-github-johanneskaufmann-html-to-markdown-2.3.1/plugin/commonmark/testdata/GoldenFiles [no href]() [no href]() [no href]() * * * [](/no_content) [](/no_content) [](/no_content) [](/no_content) [](/no_content) [link title](/no_content "link title") * * * [relative link](/page.html) [absolute link](http://simple.org/) [query params](/page?b=1&a=2) [fragment heading](#heading) [fragment](#) Wir freuen uns über eine [Mail](mailto:hi@example.com?body=Hello%0AJohannes)! [broken link](/page) [broken link](/page%0A%0A.html) [with whitespace around](example.com) [with space inside](http://Open%20Demo) [content](/ "link title") [content](/ " link title ") [content](/ " link title ") [content](/ '"link title"') [content](/ "'link title'") [content](/ '"link title"') - [a(b)\[c\]](/page.html) [a\]](/page.html) [a(b)\[c\]](/page.html) [a\]](/page.html) a(b)\[c] \[a] [a a] (a) (a a) [A](/)[B](/) [A](/) [B](/) before[A](/)middle[B](/)after before [A](/) middle [B](/) after before [A](/) middle [B](/) after before [content](/) after before [content](/) after before [content](/) after * * * [**bold** and *italic* text](/) **bold [and *italic*](/) text** [A B](/) [A \ B](/) [A \ B](/) [A \ B \ C](/) [Start Line \ End Line](/) [newlines around the link content](/) - [first text \ second text](/) [![](/image.jpg)](/page.html) [first text \ ![](/image.jpg) \ second text](/page.html) [**Heading A** **Heading B**](/page.html) [title](/ "title") before [**a inside strong**](/) after before[**a inside strong**](/)after before [**strong inside a**](/) after before[**strong inside a**](/)after before [**middle**](/) after before [**middle**](/) after before[**middle**](/)after before [**middle**](/) after before [**middle**](/) after before [**middle**](/) after before**[with empty span](/)**after before **[with empty span](/)** after before **[with empty span](/)** after * * * before**[a](/) b**after before**[a](/)b**after before**[a](/) b [c](/)**after * * * before[*a inside italic*](/)after before[*italic inside a*](/)after before[**a inside b**](/)after before[**b inside a**](/)after before[**already bold**](/)after * * * before**[middle](/)**after before**[*inside bold & italic*](/)**after before***[inside bold & italic](/)a*b**after before**[inside bold & italic](/)**after before**a*b[c](/)d*e**after * * * before***italic*[link](/)strong**after [before \ another link \ after](/a)list.in.html000066400000000000000000000075711476711565700346630ustar00rootroot00000000000000golang-github-johanneskaufmann-html-to-markdown-2.3.1/plugin/commonmark/testdata/GoldenFiles

A paragraph

  • 1
  • 2

    • 3.1
    • 3.2
  • 4 Before
    • 4.1
    • 4.2

    • 5.1

    5 After

  • 6 Before
    6 also Before
    • 6A.1
    6 Between
    • 6B.1

    6 After

    6 also After

  • 7

And also other lists...

  • First
  • Someone once said:

    My famous quote
    - someone
  1. Nine
  2. Ten
    1. Eleven.A
    2. Eleven.B
  3. Someone once said:

    My famous quote
    - someone
  4. Thirteen
  • List Item without Container

    1. Line A
      Line B

    1. one
    2. two

    1. a
    2. b
    1. a
    2. b

    • Before text after
    • Before text after


    • List 1
    • List 2
      • List 3
      • List 4

      text between

      • List 5

      • List 6


      • List 7

        • List 1
        • List 2
        • List 3
              1. lots of list containers

          1. lots of list items
        A 1 (div)
        A 2 (#text)
      1. A 3 (li)
      2. A 4 (#text)
        1. B 1 (li)
          1. C 1 (li)
          2. C 2 (div)
            C 3 (div)
          B 2 (div)
        2. B 3 (li)
      • Start Line







        End Line

      • Start Line





        End Line


      • item:
        line 1
        line 2
      • item 2
      • item 1:
        • nested item 1:
          line 1
          line 2
        • nested item 2
      • item 2

      1.

      -

      +

      *


      1. not a list

      - not a list

      + not a list

      * not a list

      list.out.md000066400000000000000000000040051476711565700345050ustar00rootroot00000000000000golang-github-johanneskaufmann-html-to-markdown-2.3.1/plugin/commonmark/testdata/GoldenFilesA paragraph - 1 - 2 - - 3.1 - 3.2 - 4 Before - 4.1 - 4.2 - - 5.1 5 After - 6 Before 6 also Before - 6A.1 6 Between - 6B.1 6 After 6 also After - 7 * * * And also other lists... - First - Someone once said: > My famous quote \- someone 09. Nine 10. Ten 11. 111. Eleven.A 112. Eleven.B 12. Someone once said: > My famous quote \- someone 13. Thirteen List Item without Container * * * 1. > Line A > Line B * * * 1. one 2. two * * * 8. a 9. b 09. a 10. b * * * - Before text after - Before [text](/page) after * * * - A double `**` [can open strong emphasis](/page) * * * - List 1 - List 2 - List 3 - List 4 text between - List 5 - List 6 - List 7 * * * - - List 1 - List 2 - List 3 1. 1. 1. 1. 1. lots of list containers * * * 1. 1. 1. lots of list items 1. A 1 (div) A 2 (#text) 2. A 3 (li) A 4 (#text) 1. B 1 (li) 1. C 1 (li) C 2 (div) C 3 (div) B 2 (div) 2. B 3 (li) - Start Line End Line - Start Line End Line * * * - item: ``` line 1 line 2 ``` - item 2 - item 1: - nested item 1: ``` line 1 line 2 ``` - nested item 2 - item 2 * * * 1\. \- \+ \* * * * 1\. not a list \- not a list \+ not a list \* not a listmetadata.in.html000066400000000000000000000017241476711565700354620ustar00rootroot00000000000000golang-github-johanneskaufmann-html-to-markdown-2.3.1/plugin/commonmark/testdata/GoldenFiles Page Title

      Heading A

      Heading B


      \a \* \\

      .<name> .< name >. <name>

      2 > 1
      1 < 2
      A & B
      A & B
      &ouml;

      *not emphasized*
      <br/> not a tag
      [not a link](/foo)
      `not code`
      1. not a list
      * not a list
      # not a heading
      [foo]: /url "not a reference"
      &ouml; not a character entity

      Start Line





      End Line

      metadata.out.md000066400000000000000000000005711476711565700353160ustar00rootroot00000000000000golang-github-johanneskaufmann-html-to-markdown-2.3.1/plugin/commonmark/testdata/GoldenFiles#### Heading A #### Heading B * * * \\a \\* \\\\ .<name> .< name >. <name> 2 > 1 1 < 2 A & B A & B &ouml; \*not emphasized* <br/> not a tag \[not a link](/foo) \`not code\` 1\. not a list \* not a list \# not a heading \[foo]: /url "not a reference" &ouml; not a character entity Start Line End Linegolang-github-johanneskaufmann-html-to-markdown-2.3.1/plugin/commonmark/validation.go000066400000000000000000000055371476711565700311510ustar00rootroot00000000000000package commonmark import ( "fmt" "strings" ) func contains(values []string, searchVal string) bool { for _, val := range values { if val == searchVal { return true } } return false } // TODO: should this be with the commonmark package? Or more general? // TODO: Maybe make it an interface? And also have a GetPluginName function? type ValidateConfigError struct { Key string Value string // By default is "Key:Value" but can be // overriden to e.g. "--key=value" KeyWithValue string patternDescription string } func (e *ValidateConfigError) setDefaultKeyWithValue() { e.KeyWithValue = fmt.Sprintf("%s:%q", e.Key, e.Value) } func (e *ValidateConfigError) Error() string { if e.KeyWithValue == "" { e.setDefaultKeyWithValue() } return fmt.Sprintf("invalid value for %s must be %s", e.KeyWithValue, e.patternDescription) } func validateConfig(cfg *config) error { if strings.Count(cfg.EmDelimiter, "_") != 1 && strings.Count(cfg.EmDelimiter, "*") != 1 { return &ValidateConfigError{ Key: "EmDelimiter", Value: cfg.EmDelimiter, patternDescription: `exactly 1 character of "*" or "_"`, } } if strings.Count(cfg.StrongDelimiter, "_") != 2 && strings.Count(cfg.StrongDelimiter, "*") != 2 { return &ValidateConfigError{ Key: "StrongDelimiter", Value: cfg.StrongDelimiter, patternDescription: `exactly 2 characters of "**" or "__"`, } } if strings.Count(cfg.HorizontalRule, "*") < 3 && strings.Count(cfg.HorizontalRule, "_") < 3 && strings.Count(cfg.HorizontalRule, "-") < 3 { return &ValidateConfigError{ Key: "HorizontalRule", Value: cfg.HorizontalRule, patternDescription: `at least 3 characters of "*", "_" or "-"`, } } if !contains([]string{"-", "+", "*"}, cfg.BulletListMarker) { return &ValidateConfigError{ Key: "BulletListMarker", Value: cfg.BulletListMarker, patternDescription: `one of "-", "+" or "*"`, } } if !contains([]string{"```", "~~~"}, cfg.CodeBlockFence) { return &ValidateConfigError{ Key: "CodeBlockFence", Value: cfg.CodeBlockFence, patternDescription: "one of \"```\" or \"~~~\"", } } if !contains([]string{"atx", "setext"}, string(cfg.HeadingStyle)) { return &ValidateConfigError{ Key: "HeadingStyle", Value: string(cfg.HeadingStyle), patternDescription: `one of "atx" or "setext"`, } } possibleLinkStyles := []string{string(LinkStyleInlined), string(LinkStyleReferencedIndex), string(LinkStyleReferencedShort)} if !contains(possibleLinkStyles, string(cfg.LinkStyle)) { return &ValidateConfigError{ Key: "LinkStyle", Value: string(cfg.LinkStyle), patternDescription: `one of "inlined", "referenced_index" or "referenced_short"`, } } return nil } golang-github-johanneskaufmann-html-to-markdown-2.3.1/plugin/commonmark/validation_test.go000066400000000000000000000044371476711565700322060ustar00rootroot00000000000000package commonmark import ( "fmt" "testing" ) func TestValidateConfig_Empty(t *testing.T) { cfg := fillInDefaultConfig(&config{}) if cfg.HeadingStyle != "atx" { t.Error("the config value was not filled with the default value") } err := validateConfig(&cfg) if err != nil { t.Errorf("expected no error but got %+v", err) } } func TestValidateConfig_Success(t *testing.T) { cfg := fillInDefaultConfig(&config{ HeadingStyle: "setext", }) if cfg.HeadingStyle != "setext" { t.Error("the config value was overridden") } err := validateConfig(&cfg) if err != nil { t.Errorf("expected no error but got %+v", err) } } func TestValidateConfig_RandomValue(t *testing.T) { cfg := fillInDefaultConfig(&config{ HeadingStyle: "random", }) err := validateConfig(&cfg) if err == nil { t.Error("expected an error") } e, ok := err.(*ValidateConfigError) if !ok { t.Error("expected an error of type ValidateConfigError") } if e.Key != "HeadingStyle" { t.Errorf("expected a different value for 'key' but got %q", e.Key) } if e.Value != "random" { t.Errorf("expected a different value for 'actual' but got %q", e.Value) } formatted := err.Error() if formatted != "invalid value for HeadingStyle:\"random\" must be one of \"atx\" or \"setext\"" { t.Errorf("expected a different formatted message but got %q", formatted) } } func TestValidateConfig_KeyWithValue(t *testing.T) { cfg := fillInDefaultConfig(&config{ StrongDelimiter: "*", }) err := validateConfig(&cfg) if err == nil { t.Error("expected an error") } e, ok := err.(*ValidateConfigError) if !ok { t.Fatal("expected an error of type ValidateConfigError") } // The default error message for the golang api formatted1 := err.Error() expected1 := `invalid value for StrongDelimiter:"*" must be exactly 2 characters of "**" or "__"` if formatted1 != expected1 { t.Errorf("expected a different formatted message but got %q", formatted1) } // The error message for the cli if e.Key == "StrongDelimiter" { e.KeyWithValue = fmt.Sprintf("--%s=%q", "strong_delimiter", e.Value) } formatted2 := err.Error() expected2 := `invalid value for --strong_delimiter="*" must be exactly 2 characters of "**" or "__"` if formatted2 != expected2 { t.Errorf("expected a different formatted message but got %q", formatted2) } } golang-github-johanneskaufmann-html-to-markdown-2.3.1/plugin/strikethrough/000077500000000000000000000000001476711565700272155ustar00rootroot00000000000000golang-github-johanneskaufmann-html-to-markdown-2.3.1/plugin/strikethrough/strikethrough.go000066400000000000000000000054241476711565700324530ustar00rootroot00000000000000package strikethrough import ( "bytes" "unicode" "github.com/JohannesKaufmann/dom" "github.com/JohannesKaufmann/html-to-markdown/v2/converter" "github.com/JohannesKaufmann/html-to-markdown/v2/internal/domutils" "github.com/JohannesKaufmann/html-to-markdown/v2/internal/escape" "github.com/JohannesKaufmann/html-to-markdown/v2/internal/textutils" "golang.org/x/net/html" ) type option func(p *strikethroughPlugin) func WithDelimiter(delimiter string) option { return func(p *strikethroughPlugin) { p.delimiter = delimiter } } type strikethroughPlugin struct { delimiter string } // Strikethrough converts ``, ``, and `` elements func NewStrikethroughPlugin(opts ...option) converter.Plugin { plugin := &strikethroughPlugin{} for _, opt := range opts { opt(plugin) } if plugin.delimiter == "" { plugin.delimiter = "~~" } return plugin } func (s *strikethroughPlugin) Name() string { return "strikethrough" } func (s *strikethroughPlugin) Init(conv *converter.Converter) error { conv.Register.PreRenderer(s.handlePreRender, converter.PriorityStandard) conv.Register.EscapedChar('~') conv.Register.UnEscaper(s.handleUnEscapers, converter.PriorityStandard) conv.Register.Renderer(s.handleRender, converter.PriorityStandard) return nil } func (s *strikethroughPlugin) handlePreRender(ctx converter.Context, doc *html.Node) { domutils.RemoveRedundant(doc, nameIsBothStrikethough) domutils.MergeAdjacent(doc, nameIsStrikethough) } func (s *strikethroughPlugin) handleUnEscapers(chars []byte, index int) int { if chars[index] != '~' { return -1 } next := escape.GetNextAsRune(chars, index) nextIsWhitespace := unicode.IsSpace(next) || next == 0 if nextIsWhitespace { // "not followed by Unicode whitespace" return -1 } return 1 } func nameIsStrikethough(node *html.Node) bool { name := dom.NodeName(node) return name == "del" || name == "s" || name == "strike" } func nameIsBothStrikethough(a *html.Node, b *html.Node) bool { return nameIsStrikethough(a) && nameIsStrikethough(b) } func (s strikethroughPlugin) handleRender(ctx converter.Context, w converter.Writer, n *html.Node) converter.RenderStatus { if nameIsStrikethough(n) { return s.renderStrikethrough(ctx, w, n) } return converter.RenderTryNext } func (s strikethroughPlugin) renderStrikethrough(ctx converter.Context, w converter.Writer, n *html.Node) converter.RenderStatus { var buf bytes.Buffer ctx.RenderChildNodes(ctx, &buf, n) content := buf.Bytes() // If there is a newline character between the start and end delimiter // the delimiters won't be recognized. Either we remove all newline characters // OR on _every_ line we put start & end delimiters. content = textutils.DelimiterForEveryLine(content, []byte(s.delimiter)) w.Write(content) return converter.RenderSuccess } golang-github-johanneskaufmann-html-to-markdown-2.3.1/plugin/strikethrough/strikethrough_test.go000066400000000000000000000043651476711565700335150ustar00rootroot00000000000000package strikethrough_test import ( "bytes" "testing" "github.com/JohannesKaufmann/html-to-markdown/v2/converter" "github.com/JohannesKaufmann/html-to-markdown/v2/internal/tester" "github.com/JohannesKaufmann/html-to-markdown/v2/plugin/base" "github.com/JohannesKaufmann/html-to-markdown/v2/plugin/commonmark" "github.com/JohannesKaufmann/html-to-markdown/v2/plugin/strikethrough" ) func TestNewStrikethroughPlugin(t *testing.T) { runs := []struct { desc string input string expected string }{ { desc: "simple", input: `

      Text

      `, expected: `~~Text~~`, }, { desc: "with spaces inside", input: `

      Text

      `, expected: `~~Text~~`, }, { desc: "with tilde characters inside", input: `

      ~~A~~B~~

      `, expected: `~~\~\~A\~\~B\~\~~~`, }, { desc: "nested", input: `

      A B C

      `, expected: `~~A B C~~`, }, { desc: "adjacent", input: `

      AB C

      `, expected: `~~AB~~ ~~C~~`, }, } for _, run := range runs { t.Run(run.desc, func(t *testing.T) { conv := converter.NewConverter( converter.WithPlugins( base.NewBasePlugin(), strikethrough.NewStrikethroughPlugin(), ), ) out, err := conv.ConvertString(run.input) if err != nil { t.Error(err) } if out != run.expected { t.Errorf("expected %q but got %q", run.expected, out) } }) } } func TestWithDelimiter(t *testing.T) { conv := converter.NewConverter( converter.WithPlugins( base.NewBasePlugin(), strikethrough.NewStrikethroughPlugin( strikethrough.WithDelimiter("=="), ), ), ) input := `

      Text

      ` expected := `==Text==` out, err := conv.ConvertString(input) if err != nil { t.Error(err) } if out != expected { t.Errorf("expected %q but got %q", expected, out) } } func TestGoldenFiles(t *testing.T) { goldenFileConvert := func(htmlInput []byte) ([]byte, error) { conv := converter.NewConverter( converter.WithPlugins( base.NewBasePlugin(), commonmark.NewCommonmarkPlugin(), strikethrough.NewStrikethroughPlugin(), ), ) return conv.ConvertReader(bytes.NewReader(htmlInput)) } tester.GoldenFiles(t, goldenFileConvert, goldenFileConvert) } golang-github-johanneskaufmann-html-to-markdown-2.3.1/plugin/strikethrough/testdata/000077500000000000000000000000001476711565700310265ustar00rootroot00000000000000golang-github-johanneskaufmann-html-to-markdown-2.3.1/plugin/strikethrough/testdata/.gitattributes000066400000000000000000000001541476711565700337210ustar00rootroot00000000000000 # Leave the files untouched. Otherwise they might be # changed when cloning the repo on Windows... * -text golang-github-johanneskaufmann-html-to-markdown-2.3.1/plugin/strikethrough/testdata/GoldenFiles/000077500000000000000000000000001476711565700332215ustar00rootroot00000000000000strikethrough.in.html000066400000000000000000000000661476711565700373410ustar00rootroot00000000000000golang-github-johanneskaufmann-html-to-markdown-2.3.1/plugin/strikethrough/testdata/GoldenFilesstrikethrough content

      ~

      *

      strikethrough.out.md000066400000000000000000000000401476711565700371660ustar00rootroot00000000000000golang-github-johanneskaufmann-html-to-markdown-2.3.1/plugin/strikethrough/testdata/GoldenFiles~~strikethrough content~~ ~ \*golang-github-johanneskaufmann-html-to-markdown-2.3.1/plugin/table/000077500000000000000000000000001476711565700254025ustar00rootroot00000000000000golang-github-johanneskaufmann-html-to-markdown-2.3.1/plugin/table/1_select.go000066400000000000000000000022351476711565700274320ustar00rootroot00000000000000package table import ( "github.com/JohannesKaufmann/dom" "golang.org/x/net/html" ) func selectHeaderRowNode(node *html.Node) *html.Node { thead := dom.FindFirstNode(node, func(n *html.Node) bool { return dom.NodeName(n) == "thead" }) if thead != nil { firstTr := dom.FindFirstNode(thead, func(n *html.Node) bool { return dom.NodeName(n) == "tr" }) if firstTr != nil { // YEAH we found the "tr" inside the "thead" return firstTr } } firstTh := dom.FindFirstNode(node, func(n *html.Node) bool { return dom.NodeName(n) == "th" }) if firstTh != nil { // YEAH we found the "th" return firstTh.Parent } return nil } func selectNormalRowNodes(tableNode *html.Node, selectedHeaderRowNode *html.Node) []*html.Node { var collected []*html.Node var finder func(node *html.Node) finder = func(node *html.Node) { name := dom.NodeName(node) if name == "tr" && node != selectedHeaderRowNode { // We want to make sure to not select the header row a *second* time. collected = append(collected, node) } for child := node.FirstChild; child != nil; child = child.NextSibling { finder(child) } } finder(tableNode) return collected } golang-github-johanneskaufmann-html-to-markdown-2.3.1/plugin/table/1_select_test.go000066400000000000000000000115111476711565700304660ustar00rootroot00000000000000package table import ( "testing" "github.com/JohannesKaufmann/html-to-markdown/v2/collapse" "github.com/JohannesKaufmann/html-to-markdown/v2/internal/tester" "golang.org/x/net/html" ) func TestSelectRowNodes(t *testing.T) { runs := []struct { desc string input string expected string }{ { desc: "invalid table", input: ` there is no data cell tag
      `, // Note: "golang.org/x/net/html" automatically cleans up the "table" expected: ` ├─body │ ├─#text "there is no data cell tag" │ ├─table │ │ ├─tbody │ │ │ ├─tr (__test_normal_row__="true") `, }, { desc: "completely empty table", input: `
      `, expected: ` ├─body │ ├─table `, }, { desc: "completely empty tbody", input: `
      `, expected: ` ├─body │ ├─table │ │ ├─tbody `, }, { desc: "basic table", input: `
      A1 A2
      B1 B2
      `, // Note: "golang.org/x/net/html" automatically adds the "tbody" expected: ` ├─body │ ├─table │ │ ├─tbody │ │ │ ├─tr (__test_normal_row__="true") │ │ │ │ ├─td │ │ │ │ │ ├─#text "A1" │ │ │ │ ├─td │ │ │ │ │ ├─#text "A2" │ │ │ ├─tr (__test_normal_row__="true") │ │ │ │ ├─td │ │ │ │ │ ├─#text "B1" │ │ │ │ ├─td │ │ │ │ │ ├─#text "B2" `, }, { desc: "basic table with th", input: `
      Heading 1 Heading 2
      A1 A2
      `, expected: ` ├─body │ ├─table │ │ ├─tbody │ │ │ ├─tr (__test_header_row__="true") │ │ │ │ ├─th │ │ │ │ │ ├─#text "Heading 1" │ │ │ │ ├─th │ │ │ │ │ ├─#text "Heading 2" │ │ │ ├─tr (__test_normal_row__="true") │ │ │ │ ├─td │ │ │ │ │ ├─#text "A1" │ │ │ │ ├─td │ │ │ │ │ ├─#text "A2" `, }, { desc: "with caption, thead, tbody, tfoot", input: `
      A description about the table
      Name City Age
      Max Mustermann Berlin 20
      Max Müller München 30
      Average age 25
      `, expected: ` ├─body │ ├─table │ │ ├─caption │ │ │ ├─#text "A description about the table" │ │ ├─thead │ │ │ ├─tr (__test_header_row__="true") │ │ │ │ ├─th (scope="col") │ │ │ │ │ ├─#text "Name" │ │ │ │ ├─th (scope="col") │ │ │ │ │ ├─#text "City" │ │ │ │ ├─th (scope="col") │ │ │ │ │ ├─#text "Age" │ │ ├─tbody │ │ │ ├─tr (__test_normal_row__="true") │ │ │ │ ├─th (scope="row") │ │ │ │ │ ├─#text "Max Mustermann" │ │ │ │ ├─td │ │ │ │ │ ├─#text "Berlin" │ │ │ │ ├─td │ │ │ │ │ ├─#text "20" │ │ │ ├─tr (__test_normal_row__="true") │ │ │ │ ├─th (scope="row") │ │ │ │ │ ├─#text "Max Müller" │ │ │ │ ├─td │ │ │ │ │ ├─#text "München" │ │ │ │ ├─td │ │ │ │ │ ├─#text "30" │ │ ├─tfoot │ │ │ ├─tr (__test_normal_row__="true") │ │ │ │ ├─th (scope="row" colspan="2") │ │ │ │ │ ├─#text "Average age" │ │ │ │ ├─td │ │ │ │ │ ├─#text "25" `, }, } for _, run := range runs { t.Run(run.desc, func(t *testing.T) { doc := tester.Parse(t, run.input, "") // NOTE FOR FUTURE: I discovered that "golang.org/x/net/html" automatically adds the "tbody". // => So we probably don't need to do that much work beforehand. collapse.Collapse(doc, nil) { // We can then see if we correctly *identified* all the necessary table components. // For that we add an attribute (just for the test). headerRow := selectHeaderRowNode(doc) if headerRow != nil { headerRow.Attr = append(headerRow.Attr, html.Attribute{ Key: "__test_header_row__", Val: "true", }) } for _, n := range selectNormalRowNodes(doc, headerRow) { n.Attr = append(n.Attr, html.Attribute{ Key: "__test_normal_row__", Val: "true", }) } } tester.ExpectRepresentation(t, doc, "output", run.expected) }) } } golang-github-johanneskaufmann-html-to-markdown-2.3.1/plugin/table/2_collect.go000066400000000000000000000154301476711565700276020ustar00rootroot00000000000000package table import ( "bytes" "github.com/JohannesKaufmann/dom" "github.com/JohannesKaufmann/html-to-markdown/v2/converter" "github.com/JohannesKaufmann/html-to-markdown/v2/marker" "golang.org/x/net/html" "golang.org/x/net/html/atom" ) type tableContent struct { Alignments []string Rows [][][]byte Caption []byte } func containsNewline(b []byte) bool { return bytes.Contains(b, []byte("\n")) } func hasProblematicChildNode(node *html.Node) bool { problematicNode := dom.FindFirstNode(node, func(n *html.Node) bool { name := dom.NodeName(n) if dom.NameIsHeading(name) { return true } switch name { case "table": // This will be caught with the newline check anyway. // But we can safe some effort by aborting early... return true case "hr", "ul", "ol", "blockquote": return true } return false }) return problematicNode != nil } func hasProblematicParentNode(node *html.Node) bool { p := node.Parent for p != nil { name := dom.NodeName(p) if name == "a" { return true } if name == "strong" || name == "b" { return true } if name == "em" || name == "i" { return true } if name == "del" || name == "s" || name == "strike" { return true } p = p.Parent } return false } func (p *tablePlugin) collectTableContent(ctx converter.Context, node *html.Node) *tableContent { if role := dom.GetAttributeOr(node, "role", ""); role == "presentation" { // In HTML-Emails many tables are used. Oftentimes these tables are nested // which is not possible with markdown. But these tables are mostly used // for *layout purposes* rather than displaying actual tabular data. if !p.convertPresentationTables { // So lets skip those with role="presentation" and focus on real tables... return nil } } if hasProblematicChildNode(node) { // There are certain nodes (e.g.
      ) that cannot be in a table. // If we found one, we unfortunately cannot convert the table. // // Note: It is okay for a block node (e.g.
      ) to be in a table. // However once it causes multiple lines, it does not work anymore. // For that we have the `containsNewline` check below. return nil } if hasProblematicParentNode(node) { // There are certain parent nodes (e.g. ) that cannot contain a table. // We would break the rendering of the link, so we unfortunately cannot convert the table. return nil } headerRowNode := selectHeaderRowNode(node) normalRowNodes := selectNormalRowNodes(node, headerRowNode) rows := p.collectRows(ctx, headerRowNode, normalRowNodes) if len(rows) == 0 { return nil } for _, cells := range rows { for _, cell := range cells { if containsNewline(cell) { // Having newlines inside the content would break the table. // So unfortunately we cannot convert the table. // // Note: We already trimmed the content earlier. return nil } } } return &tableContent{ Alignments: collectAlignments(headerRowNode, normalRowNodes), Rows: rows, Caption: collectCaption(ctx, node), } } // Sometimes a cell wants to *span* over multiple columns or/and rows. // What should be displayed in those other cells? // Render exactly the same content OR an empty string? func (p *tablePlugin) getContentForMergedCell(originalContent []byte) []byte { if p.spanCellBehavior == SpanBehaviorMirror { return originalContent } return []byte("") } func getFirstNode(node *html.Node, nodes ...*html.Node) *html.Node { if node != nil { return node } if len(nodes) >= 1 { return nodes[0] } return nil } func collectAlignments(headerRowNode *html.Node, rowNodes []*html.Node) []string { firstRow := getFirstNode(headerRowNode, rowNodes...) if firstRow == nil { return nil } cellNodes := dom.FindAllNodes(firstRow, func(node *html.Node) bool { name := dom.NodeName(node) return name == "th" || name == "td" }) var alignments []string for _, cellNode := range cellNodes { align := dom.GetAttributeOr(cellNode, "align", "") alignments = append(alignments, align) } return alignments } func (p *tablePlugin) collectCellsInRow(ctx converter.Context, rowIndex int, rowNode *html.Node) ([][]byte, []modification) { cellNodes := dom.FindAllNodes(rowNode, func(node *html.Node) bool { name := dom.NodeName(node) return name == "th" || name == "td" }) cellContents := make([][]byte, 0, len(cellNodes)) modifications := make([]modification, 0) for index, cellNode := range cellNodes { var buf bytes.Buffer ctx.RenderNodes(ctx, &buf, cellNode) content := buf.Bytes() content = bytes.TrimSpace(content) // The character "|" inside the content would mistakenly be recognized as part of the table. So we have to escape it. content = bytes.Replace(content, []byte{byte(marker.MarkerEscaping), '|'}, []byte(`\|`), -1) content = ctx.UnEscapeContent(content) cellContents = append(cellContents, content) // - - col / row span - - // rowSpan := getNumberAttributeOr(cellNode, "rowspan", 1) colSpan := getNumberAttributeOr(cellNode, "colspan", 1) mods := calculateModifications(rowIndex, index, rowSpan, colSpan, p.getContentForMergedCell(content)) modifications = append(modifications, mods...) } return cellContents, modifications } func (p *tablePlugin) collectRows(ctx converter.Context, headerRowNode *html.Node, rowNodes []*html.Node) [][][]byte { rowContents := make([][][]byte, 0, len(rowNodes)+1) groupedModifications := make([][]modification, 0) // - - 1. the header row - - // if headerRowNode != nil { cells, mods := p.collectCellsInRow(ctx, 0, headerRowNode) rowContents = append(rowContents, cells) groupedModifications = append(groupedModifications, mods) } else { // There needs to be *header* row so that the table is recognized. // So it is better to have an empty header row... rowContents = append(rowContents, [][]byte{}) } // - - 2. the normal rows - - // for index, rowNode := range rowNodes { cells, mods := p.collectCellsInRow(ctx, index+1, rowNode) rowContents = append(rowContents, cells) groupedModifications = append(groupedModifications, mods) } // Sometimes a cell wants to *span* over multiple columns or/and rows. // We collected these modifications and are now applying it, // by shifting the cells around. rowContents = applyGroupedModifications(rowContents, groupedModifications) if p.skipEmptyRows { rowContents = removeEmptyRows(rowContents) } if p.promoteFirstRowToHeader { rowContents = removeFirstRowIfEmpty(rowContents) } return rowContents } func collectCaption(ctx converter.Context, node *html.Node) []byte { captionNode := dom.FindFirstNode(node, func(node *html.Node) bool { return node.DataAtom == atom.Caption }) if captionNode == nil { return nil } var buf bytes.Buffer ctx.RenderNodes(ctx, &buf, captionNode) content := buf.Bytes() content = bytes.TrimSpace(content) return content } golang-github-johanneskaufmann-html-to-markdown-2.3.1/plugin/table/3_render.go000066400000000000000000000047001476711565700274330ustar00rootroot00000000000000package table import ( "strings" "unicode/utf8" "github.com/JohannesKaufmann/html-to-markdown/v2/converter" "golang.org/x/net/html" ) func (p *tablePlugin) renderTable(ctx converter.Context, w converter.Writer, n *html.Node) converter.RenderStatus { table := p.collectTableContent(ctx, n) if table == nil { // Sometime we just cannot render the table. // Either because it is an empty table OR // because there are newlines inside the content (which would break the table). return converter.RenderTryNext } // Sometimes we pad the cells with extra spaces (e.g. "| text |"). // For that we first need to know the maximum width of every column. counts := calculateMaxCounts(table.Rows) // Sometimes a row contains less cells that another row. // We then fill it up with empty cells (e.g. "| text | |"). table.Rows = fillUpRows(table.Rows, len(counts)) // - - - - - - - - - - - - - - - - - - - - - - - - - - // w.WriteString("\n\n") // - - - Header - - - // p.writeRow(w, counts, table.Rows[0]) w.WriteString("\n") p.writeHeaderUnderline(w, table.Alignments, counts) w.WriteString("\n") // - - - Body - - - // for _, cells := range table.Rows[1:] { p.writeRow(w, counts, cells) w.WriteString("\n") } // - - - Caption - - - // if table.Caption != nil { w.WriteString("\n\n") w.Write(table.Caption) } // - - - - - - // w.WriteString("\n\n") return converter.RenderSuccess } func getAlignmentFor(alignments []string, index int) string { if index > len(alignments)-1 { return "" } return alignments[index] } func (s *tablePlugin) writeHeaderUnderline(w converter.Writer, alignments []string, counts []int) { for i, maxLength := range counts { align := getAlignmentFor(alignments, i) isFirstCell := i == 0 if isFirstCell { w.WriteString("|") } if align == "left" || align == "center" { w.WriteString(":") } else { w.WriteString("-") } w.WriteString(strings.Repeat("-", maxLength)) if align == "right" || align == "center" { w.WriteString(":") } else { w.WriteString("-") } w.WriteString("|") } } func (s *tablePlugin) writeRow(w converter.Writer, counts []int, cells [][]byte) { for i, cell := range cells { isFirstCell := i == 0 if isFirstCell { w.WriteString("|") } w.WriteString(" ") w.Write(cell) currentCount := utf8.RuneCount(cell) filler := counts[i] - currentCount if filler > 0 { w.WriteString(strings.Repeat(" ", filler)) } w.WriteString(" |") } } golang-github-johanneskaufmann-html-to-markdown-2.3.1/plugin/table/table.go000066400000000000000000000076401476711565700270270ustar00rootroot00000000000000package table import ( "fmt" "sync" "github.com/JohannesKaufmann/dom" "github.com/JohannesKaufmann/html-to-markdown/v2/converter" "golang.org/x/net/html" ) type option func(p *tablePlugin) error type SpanCellBehavior string const ( // SpanBehaviorEmpty renders an empty cell. SpanBehaviorEmpty SpanCellBehavior = "empty" // SpanBehaviorMirror renders the same content as the original cell. SpanBehaviorMirror SpanCellBehavior = "mirror" ) // WithSpanCellBehavior configures how cells affected by colspan/rowspan attributes // should be rendered. When a cell spans multiple columns or rows, the affected cells // can either be empty or contain the same content as the original cell. func WithSpanCellBehavior(behavior SpanCellBehavior) option { return func(p *tablePlugin) error { switch behavior { case "": // TODO: should we allow empty string? return nil case SpanBehaviorEmpty, SpanBehaviorMirror: p.spanCellBehavior = behavior return nil default: return fmt.Errorf("unknown value %q for span cell behavior", behavior) } } } // WithSkipEmptyRows configures the table plugin to omit empty rows from the output. // An empty row is defined as a row where all cells contain no content or only whitespace. // When set to true, empty rows will be omitted from the output. When false (default), // all rows are preserved. func WithSkipEmptyRows(skip bool) option { return func(p *tablePlugin) error { p.skipEmptyRows = skip return nil } } // WithHeaderPromotion configures whether the first row should be treated as a header // when the table has no explicit header row (e.g. elements). When set to true, the // first row will be converted to a header row with separator dashes. When false (default), // all rows are treated as regular content. func WithHeaderPromotion(promote bool) option { return func(p *tablePlugin) error { p.promoteFirstRowToHeader = promote return nil } } // WithPresentationTables configures whether tables marked with role="presentation" // should be converted to markdown. When set to true, presentation tables will be // converted like regular tables. When false (default), these tables are skipped // since they typically represent layout rather than semantic content. func WithPresentationTables(convert bool) option { return func(p *tablePlugin) error { p.convertPresentationTables = convert return nil } } type tablePlugin struct { m sync.RWMutex err error spanCellBehavior SpanCellBehavior skipEmptyRows bool promoteFirstRowToHeader bool convertPresentationTables bool } func (p *tablePlugin) setError(err error) { p.m.Lock() defer p.m.Unlock() p.err = err } func (p *tablePlugin) getError() error { p.m.RLock() defer p.m.RUnlock() return p.err } func NewTablePlugin(opts ...option) converter.Plugin { plugin := &tablePlugin{} for _, opt := range opts { err := opt(plugin) if err != nil { plugin.setError(err) break } } return plugin } func (s *tablePlugin) Name() string { return "table" } func (s *tablePlugin) Init(conv *converter.Converter) error { if err := s.getError(); err != nil { // Any error raised from the option func return err } conv.Register.EscapedChar('|') conv.Register.Renderer(s.handleRender, converter.PriorityStandard) return nil } func (s *tablePlugin) handleRender(ctx converter.Context, w converter.Writer, n *html.Node) converter.RenderStatus { name := dom.NodeName(n) switch name { case "table": return s.renderTable(ctx, w, n) case "tr": // Normally, when the "table" gets rendered we do NOT go into this case. // But as a fallback we separate the rows through newlines. return s.renderFallbackRow(ctx, w, n) } return converter.RenderTryNext } func (s *tablePlugin) renderFallbackRow(ctx converter.Context, w converter.Writer, n *html.Node) converter.RenderStatus { w.WriteString("\n\n") ctx.RenderChildNodes(ctx, w, n) w.WriteString("\n\n") return converter.RenderSuccess } golang-github-johanneskaufmann-html-to-markdown-2.3.1/plugin/table/table_test.go000066400000000000000000000234671476711565700300730ustar00rootroot00000000000000package table import ( "bytes" "strings" "testing" "github.com/JohannesKaufmann/html-to-markdown/v2/converter" "github.com/JohannesKaufmann/html-to-markdown/v2/internal/tester" "github.com/JohannesKaufmann/html-to-markdown/v2/plugin/base" "github.com/JohannesKaufmann/html-to-markdown/v2/plugin/commonmark" ) func TestGoldenFiles(t *testing.T) { goldenFileConvert := func(htmlInput []byte) ([]byte, error) { conv := converter.NewConverter( converter.WithPlugins( base.NewBasePlugin(), commonmark.NewCommonmarkPlugin(), NewTablePlugin(), ), ) return conv.ConvertReader(bytes.NewReader(htmlInput)) } tester.GoldenFiles(t, goldenFileConvert, goldenFileConvert) } func TestOptionFunc_Validation(t *testing.T) { conv := converter.NewConverter( converter.WithPlugins( base.NewBasePlugin(), commonmark.NewCommonmarkPlugin(), NewTablePlugin( WithSpanCellBehavior("random"), ), ), ) expectedMessage := `error while initializing "table" plugin: unknown value "random" for span cell behavior` out, err := conv.ConvertString("test") if err == nil { t.Fatal("expected error") } if err.Error() != expectedMessage { t.Errorf("expected %q but got %q", expectedMessage, err.Error()) } if out != "" { t.Error("expected empty output") } } func TestOptionFunc_ColRowSpan(t *testing.T) { testCases := []struct { desc string input string options []option expected string }{ // - - - - - - - - - - default - - - - - - - - - - // { desc: "default", options: []option{ WithSpanCellBehavior(SpanBehaviorEmpty), }, input: `
      A B
      `, expected: ` | | | | | |---|---|---|---| | A | B | | | `, }, // - - - - - - - - - - colspan - - - - - - - - - - // { desc: "colspan=3", options: []option{ WithSpanCellBehavior(SpanBehaviorMirror), }, input: `
      A B
      `, expected: ` | | | | | |---|---|---|---| | A | B | B | B | `, }, // - - - - - - - - - - rowspan - - - - - - - - - - // { desc: "rowspan=3", options: []option{ WithSpanCellBehavior(SpanBehaviorMirror), }, input: `
      A B
      `, expected: ` | | | |---|---| | A | B | | | B | | | B | `, }, // - - - - - - - - - - colspan & rowspan - - - - - - - - - - // { desc: "cell with colspan and rowspan", options: []option{ WithSpanCellBehavior(SpanBehaviorMirror), }, input: `
      A B C
      `, expected: ` | | | | | | |---|---|---|---|---| | A | B | B | B | C | | | B | B | B | | | | B | B | B | | `, }, { desc: "shifting content", options: []option{ WithSpanCellBehavior(SpanBehaviorMirror), }, input: `
      A B C
      1 2 3
      `, expected: ` | | | | | | | |---|---|---|---|---|---| | A | B | B | B | C | | | 1 | B | B | B | 2 | 3 | | | B | B | B | | | `, }, { desc: "rowspans overlap with colspans", options: []option{ WithSpanCellBehavior(SpanBehaviorMirror), }, input: `
      A B C
      D E
      F
      `, expected: ` | | | | | |---|---|---|---| | A | B | B | C | | A | D | D | E | | A | D | D | F | `, }, } for _, tC := range testCases { t.Run(tC.desc, func(t *testing.T) { conv := converter.NewConverter( converter.WithPlugins( base.NewBasePlugin(), commonmark.NewCommonmarkPlugin(), NewTablePlugin(tC.options...), ), ) output, err := conv.ConvertString(tC.input) if err != nil { t.Error(err) } actual := strings.TrimSpace(output) expected := strings.TrimSpace(tC.expected) if actual != expected { t.Errorf("expected\n%s\nbut got\n%s\n", expected, actual) } }) } } func TestOptionFunc_EmptyRows(t *testing.T) { testCases := []struct { desc string input string options []option expected string }{ // - - - - - - - - - - default - - - - - - - - - - // { desc: "by default keep empty rows", options: []option{}, input: `
      B1
      A3
      `, expected: ` | | | |----|----| | | B1 | | | | | A3 | | `, }, { desc: "some rows are empty", options: []option{ WithSkipEmptyRows(true), }, input: `
      B1
      A3
      `, expected: ` | | | |----|----| | | B1 | | A3 | | `, }, { desc: "all rows are empty", options: []option{ WithSkipEmptyRows(true), }, input: `

      Before

      A description

      After

      `, expected: ` Before A description After `, }, { desc: "element that is not rendered", options: []option{ WithSkipEmptyRows(true), }, input: `

      Before

      After

      `, expected: ` Before After `, }, } for _, tC := range testCases { t.Run(tC.desc, func(t *testing.T) { conv := converter.NewConverter( converter.WithPlugins( base.NewBasePlugin(), commonmark.NewCommonmarkPlugin(), NewTablePlugin(tC.options...), ), ) output, err := conv.ConvertString(tC.input) if err != nil { t.Error(err) } actual := strings.TrimSpace(output) expected := strings.TrimSpace(tC.expected) if actual != expected { t.Errorf("expected\n%s\nbut got\n%s\n", expected, actual) } }) } } func TestOptionFunc_PromoteHeader(t *testing.T) { testCases := []struct { desc string input string options []option expected string }{ // - - - - - - - - - - default - - - - - - - - - - // { desc: "default", options: []option{}, input: `
      A1 B1
      A2 B2
      `, expected: ` | | | |----|----| | A1 | B1 | | A2 | B2 | `, }, { desc: "not needed", options: []option{ WithHeaderPromotion(true), }, input: `
      Heading Heading
      A1 B1
      A2 B2
      `, expected: ` | Heading | Heading | |---------|---------| | A1 | B1 | | A2 | B2 | `, }, { desc: "promote first row", options: []option{ WithHeaderPromotion(true), }, input: `
      A1 B1
      A2 B2
      `, expected: ` | A1 | B1 | |----|----| | A2 | B2 | `, }, { desc: "promote first row (but it is empty)", options: []option{ WithHeaderPromotion(true), }, input: `
      A1 B1
      A2 B2
      `, expected: ` | | | |----|----| | A1 | B1 | | A2 | B2 | `, }, { desc: "deleted empty rows & promoted first row", options: []option{ WithHeaderPromotion(true), WithSkipEmptyRows(true), }, input: `
      A1 B1
      A2 B2
      `, expected: ` | A1 | B1 | |----|----| | A2 | B2 | `, }, } for _, tC := range testCases { t.Run(tC.desc, func(t *testing.T) { conv := converter.NewConverter( converter.WithPlugins( base.NewBasePlugin(), commonmark.NewCommonmarkPlugin(), NewTablePlugin(tC.options...), ), ) output, err := conv.ConvertString(tC.input) if err != nil { t.Error(err) } actual := strings.TrimSpace(output) expected := strings.TrimSpace(tC.expected) if actual != expected { t.Errorf("expected\n%s\nbut got\n%s\n", expected, actual) } }) } } func TestOptionFunc_PresentationTable(t *testing.T) { testCases := []struct { desc string input string options []option expected string }{ { desc: "default", options: []option{}, input: `
      A1 A2
      B1 B2
      `, expected: ` A1 A2 B1 B2 `, }, { desc: "keep the presentation table", options: []option{ WithPresentationTables(true), }, input: `
      A1 A2
      B1 B2
      `, expected: ` | | | |----|----| | A1 | A2 | | B1 | B2 | `, }, } for _, tC := range testCases { t.Run(tC.desc, func(t *testing.T) { conv := converter.NewConverter( converter.WithPlugins( base.NewBasePlugin(), commonmark.NewCommonmarkPlugin(), NewTablePlugin(tC.options...), ), ) output, err := conv.ConvertString(tC.input) if err != nil { t.Error(err) } actual := strings.TrimSpace(output) expected := strings.TrimSpace(tC.expected) if actual != expected { t.Errorf("expected\n%s\nbut got\n%s\n", expected, actual) } }) } } golang-github-johanneskaufmann-html-to-markdown-2.3.1/plugin/table/testdata/000077500000000000000000000000001476711565700272135ustar00rootroot00000000000000golang-github-johanneskaufmann-html-to-markdown-2.3.1/plugin/table/testdata/.gitattributes000066400000000000000000000001541476711565700321060ustar00rootroot00000000000000 # Leave the files untouched. Otherwise they might be # changed when cloning the repo on Windows... * -text golang-github-johanneskaufmann-html-to-markdown-2.3.1/plugin/table/testdata/GoldenFiles/000077500000000000000000000000001476711565700314065ustar00rootroot00000000000000basics.in.html000066400000000000000000000061661476711565700340770ustar00rootroot00000000000000golang-github-johanneskaufmann-html-to-markdown-2.3.1/plugin/table/testdata/GoldenFiles A caption outside a table
      The caption text of the empty table

      B1
      A3

      A1 A2
      B1 B2
      C1 C2

      Name City Age

      Company Contact Country
      Company A Max Mustermann DE
      Company B John Doe US

      A description about the table
      Name City Age
      Max Mustermann Berlin 20 space for the note
      Max Müller München 30
      Peter Mustermann München
      Average age 25

      Left Center Right
      A B C
      Left Center Right
      A B C

      A | B

      A (B) C A **B** C
      A (B) A *B*
      A | B

      A1 A2
      B1 B2
      basics.out.md000066400000000000000000000023471476711565700337310ustar00rootroot00000000000000golang-github-johanneskaufmann-html-to-markdown-2.3.1/plugin/table/testdata/GoldenFilesA caption outside a table * * * The caption text of the empty table * * * | | | |---|---| | | | | | | | | | |----|----| | | B1 | | | | | A3 | | * * * | | | |----|----| | A1 | A2 | | B1 | B2 | | C1 | C2 | * * * | Name | City | Age | |------|------|-----| * * * | Company | Contact | Country | |-----------|----------------|---------| | Company A | Max Mustermann | DE | | Company B | John Doe | US | * * * | Name | City | Age | | |------------------|---------|-----|--------------------| | Max Mustermann | Berlin | 20 | space for the note | | Max Müller | München | 30 | | | Peter Mustermann | München | | | | Average age | | 25 | | A description about the `table` * * * | Left | Center | Right | |:-----|:------:|------:| | A | B | C | | | | | |:-----|:------:|------:| | Left | Center | Right | | A | B | C | | | | | |:--|:-:|--:| | | | | | | | | * * * A | B | A (B) C | A \*\*B\** C | |---------|--------------| | A (B) | A \*B* | | A \| B | | * * * A1 A2 B1 B2col_row_span.in.html000066400000000000000000000015101476711565700353040ustar00rootroot00000000000000golang-github-johanneskaufmann-html-to-markdown-2.3.1/plugin/table/testdata/GoldenFiles
      A1 B1 C1

      wide cell B1
      A2 B2 C2
      tall cell B1 C1
      A2 B2
      A3 B3 C3
      big cell B1
      A2
      A3 B3 C3
      col_row_span.out.md000066400000000000000000000006071476711565700351470ustar00rootroot00000000000000golang-github-johanneskaufmann-html-to-markdown-2.3.1/plugin/table/testdata/GoldenFiles| | | | |----|----|----| | A1 | B1 | C1 | * * * | | | | |-----------|----|----| | wide cell | | B1 | | A2 | B2 | C2 | | | | | |-----------|----|----| | tall cell | B1 | C1 | | | A2 | B2 | | A3 | B3 | C3 | | | | | |----------|----|----| | big cell | | B1 | | | | A2 | | A3 | B3 | C3 |contents.in.html000066400000000000000000000037261476711565700344670ustar00rootroot00000000000000golang-github-johanneskaufmann-html-to-markdown-2.3.1/plugin/table/testdata/GoldenFiles
      A1 B1
      A2 B2

      with break after

      with break before



      with break around



      Some normal content

      Some normal content

      Some normal content


      The content
      with break

      Heading

      not the empty heading

      Code block
      Blockquote
      • Unordered List
      1. Ordered List

      Nested Table

      Other cell
      Nested Table
      Another cell
      contents.out.md000066400000000000000000000013321476711565700343130ustar00rootroot00000000000000golang-github-johanneskaufmann-html-to-markdown-2.3.1/plugin/table/testdata/GoldenFiles| | | |--------|---------| | **A1** | *B1* | | `A2` | [B2](/) | * * * | | |-------------------| | with break after | | with break before | | with break around | * * * | | |---------------------| | Some normal content | | | |---------------------| | Some normal content | | | |---------------------| | Some normal content | * * * The content with break # Heading not the empty heading * * * ``` Code block ``` > Blockquote - Unordered List 1. Ordered List * * * | | |--------------| | Nested Table | * * * Other cell | | |--------------| | Nested Table | Another cellemail.in.html000066400000000000000000000222601476711565700337130ustar00rootroot00000000000000golang-github-johanneskaufmann-html-to-markdown-2.3.1/plugin/table/testdata/GoldenFiles

      normal body content
      A1 A2
      B1 B2
      golang-github-johanneskaufmann-html-to-markdown-2.3.1/plugin/table/testdata/GoldenFiles/email.out.md000066400000000000000000000001221476711565700336200ustar00rootroot00000000000000![](/assets/picture.png) normal body content | A1 | A2 | |----|----| | B1 | B2 |parents.in.html000066400000000000000000000026271476711565700343050ustar00rootroot00000000000000golang-github-johanneskaufmann-html-to-markdown-2.3.1/plugin/table/testdata/GoldenFiles
      The blockquote content:
      A1 A2

      1. The list item content
      2. A1 A2
      A1 A2

      link content before
      A1 A2
      link content after

      A1 A2

      bold content before
      A1 A2
      bold content after

      italic content before
      blockquote content before
      A1 A2
      blockquote content after
      italic content after

      parents.out.md000066400000000000000000000010721476711565700341330ustar00rootroot00000000000000golang-github-johanneskaufmann-html-to-markdown-2.3.1/plugin/table/testdata/GoldenFiles> The blockquote content: > > | | | > |----|----| > | A1 | A2 | * * * 10. The list item content 11. | | | |----|----| | A1 | A2 | | | | |----|----| | A1 | A2 | * * * [link content before \ A1 A2 \ link content after](/link) * * * [" \ A1 A2 \ "](/link) * * * **bold content before** **A1 A2** **bold content after** * * * *italic content before " blockquote content before* *A1 A2* *blockquote content after " italic content after* * * * button content before | | | |----|----| | A1 | A2 | button content aftergolang-github-johanneskaufmann-html-to-markdown-2.3.1/plugin/table/utils.go000066400000000000000000000077121476711565700271000ustar00rootroot00000000000000package table import ( "slices" "strconv" "unicode/utf8" "github.com/JohannesKaufmann/dom" "golang.org/x/net/html" ) // The content should be at least 1 character wide. // This also ensures that the table is correctly *recognized* as a markdown table. const defaultCellWidth = 1 func calculateMaxCounts(rows [][][]byte) []int { maxCounts := make([]int, 0) for _, cells := range rows { for index, cell := range cells { count := utf8.RuneCount(cell) if index >= len(maxCounts) { maxCounts = append(maxCounts, defaultCellWidth) } currentMax := maxCounts[index] if count > currentMax { maxCounts[index] = count } } } return maxCounts } func fillUpRows(rows [][][]byte, maxColumnCount int) [][][]byte { for i, cells := range rows { missingCells := maxColumnCount - len(cells) for range missingCells { rows[i] = append(rows[i], []byte("")) } } return rows } func getNumberAttributeOr(node *html.Node, key string, fallback int) int { val, ok := dom.GetAttribute(node, key) if !ok { return fallback } num, err := strconv.Atoi(val) if err != nil { return fallback } if num < 1 { return fallback } return num } type modification struct { y int x int data []byte } func calculateModifications(currentRowIndex, currentColIndex, rowSpan, colSpan int, data []byte) []modification { mods := make([]modification, 0) if colSpan <= 1 && rowSpan <= 1 { // No modification is needed return mods } // Calculate modifications for colspan for dx := 1; dx < colSpan; dx++ { // Add modifications for the same row mods = append(mods, modification{ y: currentRowIndex, x: currentColIndex + dx, data: data, }) } // Calculate modifications for subsequent rows if rowSpan > 1 { for dy := 1; dy < rowSpan; dy++ { for dx := 0; dx < colSpan; dx++ { mods = append(mods, modification{ y: currentRowIndex + dy, x: currentColIndex + dx, data: data, }) } } } return mods } func applyGroupedModifications(contents [][][]byte, groupedMods [][]modification) [][][]byte { // By applying the modifications in reverse we correctly // handle overlapping modifications. slices.Reverse(groupedMods) for _, mods := range groupedMods { contents = applyModifications(contents, mods) } return contents } func applyModifications(contents [][][]byte, mods []modification) [][][]byte { for _, mod := range mods { // Grow on the y axis contents = growSlice(contents, mod.y, nil) // Grow on the x axis // (Note: we only grow x-1 since `Insert` takes care of the rest) contents[mod.y] = growSlice(contents[mod.y], mod.x-1, nil) // Now we can do our change: contents[mod.y] = slices.Insert(contents[mod.y], mod.x, mod.data) } return contents } // growSlice ensures the slice has enough capacity to access the given index. func growSlice[T any](contents []T, index int, placeholderVal T) []T { // Calculate the required growth currentLen := len(contents) if index < currentLen { return contents } growBy := index - currentLen + 1 // Grow the slice by appending values for range growBy { contents = append(contents, placeholderVal) } return contents } func isEmptyRow(cells [][]byte) bool { for _, cell := range cells { if len(cell) > 0 { return false } } return true } func removeEmptyRows(rows [][][]byte) [][][]byte { index := 0 filteredRows := slices.DeleteFunc(rows, func(cells [][]byte) bool { if index == 0 { index++ return false // Always keep the first row (the header row) } else { index++ } return isEmptyRow(cells) }) if len(filteredRows) == 1 && isEmptyRow(filteredRows[0]) { // If all the rows are empty (including the header row) // then the table is completely empty... return nil } return filteredRows } func removeFirstRowIfEmpty(rows [][][]byte) [][][]byte { if len(rows) > 0 && isEmptyRow(rows[0]) { // The first row (the header row) is empty. So lets remove it... return slices.Delete(rows, 0, 1) } return rows } golang-github-johanneskaufmann-html-to-markdown-2.3.1/plugin/table/utils_test.go000066400000000000000000000106051476711565700301320ustar00rootroot00000000000000package table import ( "reflect" "testing" ) func TestCalculateMaxCounts(t *testing.T) { a := [][][]byte{ { []byte("Company A"), // 9 []byte("Max Müller"), // 10 <-- []byte("Berlin"), // 6 <-- }, { []byte("Company Example"), // 15 <-- []byte("John Doe"), // 8 []byte("Bonn"), // 4 }, { []byte("A"), }, } output := calculateMaxCounts(a) expected := []int{15, 10, 6} if !reflect.DeepEqual(output, expected) { t.Errorf("expected %+v but got %v", expected, output) } } func TestFillUpRows(t *testing.T) { input := [][][]byte{ { []byte("Company A"), []byte("Max Müller"), []byte("Berlin"), }, { []byte("Company Example"), []byte("John Doe"), []byte("Bonn"), }, { []byte("A"), // <-- // <-- }, } counts := calculateMaxCounts(input) t.Log("counts:", counts) // - - - - - - - - - - - - - - - - - - - - // maxColumnCount := len(counts) output := fillUpRows(input, maxColumnCount) expected := [][][]byte{ { []byte("Company A"), []byte("Max Müller"), []byte("Berlin"), }, { []byte("Company Example"), []byte("John Doe"), []byte("Bonn"), }, { []byte("A"), []byte(""), []byte(""), }, } if !reflect.DeepEqual(output, expected) { t.Errorf("expected %+v but got %v", expected, output) } } func TestCalculateModifications(t *testing.T) { testCases := []struct { desc string currentRowIndex int currentColIndex int colSpan int rowSpan int expected []modification }{ { desc: "no modifications needed #1", currentRowIndex: 0, currentColIndex: 0, colSpan: 1, rowSpan: 1, expected: []modification{}, }, { desc: "no modifications needed #2", currentRowIndex: 10, currentColIndex: 5, colSpan: 1, rowSpan: 1, expected: []modification{}, }, { desc: "colspan=2", currentRowIndex: 0, currentColIndex: 0, colSpan: 2, rowSpan: 1, expected: []modification{{y: 0, x: 1}}, }, { desc: "rowspan=2", currentRowIndex: 0, currentColIndex: 0, colSpan: 1, rowSpan: 2, expected: []modification{{y: 1, x: 0}}, }, { desc: "colspan=2 and rowspan=2", currentRowIndex: 0, currentColIndex: 0, colSpan: 2, rowSpan: 2, expected: []modification{ /* the actual cell */ {y: 0, x: 1}, {y: 1, x: 0}, {y: 1, x: 1}, }, }, } for _, tC := range testCases { t.Run(tC.desc, func(t *testing.T) { actual := calculateModifications(tC.currentRowIndex, tC.currentColIndex, tC.rowSpan, tC.colSpan, nil) if len(actual) != len(tC.expected) { t.Errorf("expected length %d but got %d", len(tC.expected), len(actual)) } if !reflect.DeepEqual(actual, tC.expected) { t.Errorf("expected %+v but got %+v", tC.expected, actual) } }) } } func TestApplyModifications(t *testing.T) { testCases := []struct { desc string contents [][][]byte modifications []modification expected [][][]byte }{ { desc: "add in same row", contents: [][][]byte{ { []byte("A"), }, }, modifications: []modification{ { y: 0, x: 0, data: []byte("the modification"), }, }, expected: [][][]byte{ { []byte("the modification"), []byte("A"), }, }, }, { desc: "add in row below", contents: [][][]byte{ { []byte("A"), }, { []byte("B"), }, }, modifications: []modification{ { y: 1, x: 0, data: []byte("the modification"), }, }, expected: [][][]byte{ { []byte("A"), }, { []byte("the modification"), []byte("B"), }, }, }, { desc: "grow two rows below", contents: [][][]byte{ { []byte("A"), []byte("B"), }, }, modifications: []modification{ { y: 1, x: 0, data: []byte("A #2"), }, { y: 2, x: 0, data: []byte("A #3"), }, }, expected: [][][]byte{ { []byte("A"), []byte("B"), }, { []byte("A #2"), }, { []byte("A #3"), }, }, }, } for _, tC := range testCases { t.Run(tC.desc, func(t *testing.T) { output := applyModifications(tC.contents, tC.modifications) if !reflect.DeepEqual(output, tC.expected) { t.Errorf("expected %+v but got %+v", tC.expected, output) } }) } }

      g3jFbcBc`lRmxid\<:$bxز<^/ /<R/!3f \Un;Uۙǘ1Wb}{<-R%uZSa'5ѽ#:x{jN<ޯ x6oU%B];r]ψx17Nh:D׫xr#e^5xu(΃Qƿg.EEQz-0&FE\ً/{ K^pW-q^M7I$@$@$`@:#)Q/r9;;apU447矑}";kV 4 [c5^Pq&MBKaڸr,⦘<.8}ZU"1nO[BLMPCBQe?G~[ 4"Љ;˖TZ(H"h"*RHa$'ACE=kk(7b_𥸊1C o) O5ES*yߐ{wvE; WK}YYJMqbMND`wo[BPE 3Y^?Pd5{h5r k0mڭX}Hʝw\o3j''+?L>gOJG`/x|J]5O i$_r?"`]AђG~>K|ɔ$,M>vIXxMBVT/:kXz)iꥩ^X}KP9{%f弬׆Ɯh5kd}Xs^:4fhے@k%HP37kQeX'ɇ-Ų4"I`ZXOo A\z)'".5ז"V6}dțmϫqHHH#ЮEb@[@ œXfNrҘ&ʖ\k=~7DP4WE?>e"(jz S5ADr$(8%_iN; 5b UՐ<TSB,**\ n AQr Λg)բ_RA52e-LϚ9_.FbݏV6wjBj-Uv𣟍E:4Ry:[Y%FJ ۦW 4fnB {j7 sJB-YCEkB^z$,N<:TK_ EYU"{}#(Hfj'.bϞؽ8f=2Yc^zAPLB 25MP:4e >$8(^ޒQ&>HE~E3$ŸU&n Aa^P4gOQsrR,q#ڒ5yٳ!  @SrrnWBbC1uPG} O Ϝ1,R9k(MdT÷Ro4׵RBkf(,&Rԩʺz;a$fIPkzТ\yys65RقZ?GLd)lK9FU?)zo&z*vNT=:bĈXU7rm?O$O<ЛTUu} GP:l)yH65Q"NNaVG=pܳG}J@*9j@:K:]y%UQ_̿OXSxE؋5뚒({Nm8#!  @xRS3! ަ:S/IOlI dVAQ4Lll( ˑ74i>TQgHpq$&ǎ.(nroUSRT)tB*u_rE9*T%KfI~DɓTy.Z!䄁>jJ[*R)XqIiaȮ&Qz^8|/VU7S%I*ܥhTP`徲֚kC/(GO~g4Ono m9/{ÖfhEF$@v{MtPAݓTU>o$?bߪ,gCœE>rŴg;I RvtA{f)/ͦ4\bR)>;&  MIIIqQ*N?Çr)7RVFnTUc4ܔ^P|Th%\r~=J_kvOVnuaKEPS!x)>4u3_PX_~ާY?L}WyX*R"c\LIAڵ5?OYH#i@%_:%aTl׾ٴIyVCGP/ kgϴi-\zAQ+ڳճNݚ3k4o0D+5e@DBǏ5-%mُH<*7k-LEu}[~Eg (J~g3ŵR]bnC_(a,~rͫk.|+pWLQKצ4ך>%ּ8Mzz4yY#  h-p"e֭Cމ;\}|PvAIٴtC3܀(,{ ]f(_UK4.@J_{f(d{AŸMMH%95-SyY[DW/(w/\(_o?z@p̜YSAQI>#%iuyQF{֮*\ߞ|Ŗz7 n5BˆJz;Y=Tɵb i0}T\/Ē׵/Ebb/*P||iR.+ au $%%%kjٙHHHfD&K۷뻉Uqju$?uPD>ioh&y5/QtE_Qp]bʕ(:wf>שFAzቾOJ1Ty~QVbǁ'|jU%7TZ~'6/Pȸg)|# iGApїHJJ5T7vnih멫kbM!^mzz@ v_+UќaC0q0ƓkOj_W%M}c V|}EuZM2`^ׂųXDBӊr ˗.Y$GC8nD_t??i_jI<5 ~~^6-O풬,H\ gRHM7bc^D>y PWN+BxiH_}5:_9Z|9/T_ u} mIjp*< **JJ- MF$@$@$@MAbSPmcjO->ӎQ9_*0>&a=H)^"fZfi#:lg~[r$@$@$@$((6v0EkJ Ă4ɓ׫W; 6(+\]3̭55ɣ(am~VR*ܺ5aMF^MM@((ψ-HHHH=O|hBUPœĠر0 M@_t'ϭ{\= @[&@A-.F$@$@$@h?vSJьҜU,F$U3!UHk^ۈMIH1PPl HHH mL#   hU58;5pHHHHhAJnL svxxIjWooY_sO$@$@$@$@$@$@$@$ڝ(&U9" I?;UTTbcOHEɳ-@UU:w@D`L4~~-oEcpČ- |n'1dHzvipb  h2mS:uBQ#HHH@ED6m4&OiaAܹ<⌧fjXN"(noۭVܳ۳11HHH$kDT>Vd3    &@ANA1=<֯ߩc }.2^VV.z DG*ѰsgbD:υOtG1oJA}pdDIIHH*Uoo8]7P:#[g`B$@$@$@$`3 v 6vZKڵ۰jFٳ'QZd (?p_٪S",8) 47G|ff߷Oa9SX 4? 6ؿ?<<0ap'wH <7<6ġCU9&NChƟžp29eeq1?ɯbj7 =\scj0b)S{7 -.NW4gZ#=ȉGމ*/gP]۫}{6?qãܩp  hn&(VțoAϱc #   @AA;?׺p,ed[]&IIӻ5be~ tyx%j' CD6diض=GRsHA05AUhN..3u*u $}z=lD|77<Ž%;>E?w5633|/!#bTH{$@$@$МMP}=r~gٝw\$@$@$@$ (( (P>AQ&ݱe!8xRܯ_^x.Pob"3.ؼW|p<ƌѯ"HgmFvEHao?m6,!K={cgL¯ǍâK }UǬ=5\<<j-G/(ʗ*( fgR   F Ⱖʳ(ztP("ؽ9"Z>J}]ClWCb)"9;7ΜFIIa-i#6j HF?kû)QŠ{ Mه#oD@TјzAQ4 Œڔ#סL,[zif>4:7v޽I(*.5 륄ˣ}p$@$@m# 5yZ䧤@"ϝi$@$@$@$@Gb3 yO+k'zIx]b >b-}FcO?P/"$s\-O5qoh(zzMK_H9u:ч'WS3sW"PUu9Z1W@Hs- HH@Ee2WyX￯>jT 4 (vE 3:ӧ?ք6.Z;}3FoU={e-Tb7@ee=@+s : -eBajbJssչ3"}(IZӯ; &&ڮ]YYJM !ܐ6 $@$@$@$Zg~s @3 b1o,cMO?T699@/.CZZW¬0xpD\.Yգ`lc?[&:xbUJX.<];˘;'(̄7bg4J/(z9;t#ƧB–~zl˨ƱcUtRðQQ!$lK$@$@$p@C# @PPt0AH~ի+򌆝n{?KexwL}I*֚aâ/ ij*o8+ >ݢ=}:jD,/j68%|Zc`(r\\4 kp5`  h/$YŸ||,^xp$@$@$@$\((:{ǟ"  Hs]f¯E{g3 >rmǙن1KlL/ -bfNN裵ptRTgO2}-گcpww ߩ*l[Rv%"'Lo*IDATU7^_hΐN1"1Vs@  Vy/?~2#0Qo،HHHH!ڵxMCq㸫,󆇇O{xlOVnuaKE S!bx)>4u3_PX_~ާ < 9{,] JK1vlΟo7;︦AsYNgA_D/(xx/ /JO,9^ -u#(^lbR^L+"m$'ai2NHH@ksEڏ?*4}.757/G$@$@$@@;snȑT4,^rHII$ULn(b(IA#UeY?(D˽Vy _ss̀D:vW͂ya>/ %t8Rس^PTc99EE՚VABy'oFb!u._?5-Sy:;RV*lO$@$@-C5Bo ݻ ,J$@$@$@:'#nxjq UV]6/Pȸg{K'OLeg_E_"))֜RZ.la?j;rsӍC1eoِiW Gq_{93Ww.CLE瞽>-Acg  h$EPڻglQ"mRF$@$@$@$tڝt(fdKO?}ѵk$1K@t**P 'WWťQPHWVɓF4ʸHHZ3"(J*K֌k'   '@AᏈ l_z)*%HH;ҊjS{x*ΚW/~|? 4 M&UU(-)hMKZIHHUX1ٙ\HHHH&aIHHHHHHHH-O{"        &"@ArX   h K|<>ϒ'   $@A1ir,   hCZK6YsrP_ޝ2 2>>Ͳ>YHN@ϐ ڷ cs$@$@$@$P*(gf.phwoѾ_x.f5C++7xnVm wHEk큅 k{ bmVP 'NAPV5 MPL]ǏNN6r (۹. r@8"ޡENUWln=%o|ߣcGsX8+ ^^5lɎ"&}ZB̃Z-] VoTޝo,y- M$@$@vhXKdԫ1vQd'   hڪxfF!0* QQDPܹݺ7$Dy&dg(W{rE~z87}(X5נ6ΞEҪUj)3fϪe"w ƫF$@$@$Hڤ8t8E%~iprrr$\ e5Uscy( , Nnnfs995BokK3g o⽈i3Γӧ~s{u{EoiA)^4  hmZ[ѫWWDEX䜟__ޟ8a Թ,7$Ө((@uU<չ3:_u k":*Q=Lq]\/ @!A-*/7" `t2wRd$<p^]"kk3ڷOA ? QMmV?fGPX5ފ^sE$#yޤ`UX0>mSS!p|✹ǎA?xv45U86˂IVkx3V3(o*+TL^]͚OOCٳxɾl25=F%&] :1;Peѹs>tHyta8Pg1)mĺa$ܺ÷pr<8Uw!ߎJٍ}p<  rC#x#͸`؃Wux6l<w, g֦&O>Q/;Vj&b偃's1?gxCŰadG;[mIHHH9 Ty<w;0w9Qo8ej,p,QBf}kqei)DNe'!}n AAGPx70Lg͚هgãV7Sh Z+TNGxC)"luݕW6"K}߆Pqf͞1|x4yVk 8  ia?pgHgZ,&'?Tc ТEFUWȑf:]a$Ut#cJ#   NVyEPʽ"P-~=dx+a g*4j 4AMĮ<({Zc\}9byy~\V'BD$ɸzA}K?u)hy!xjǶXCEZvtt(^=LͶ$@$@$Z\Pܶ=~[B S28~~ƅQ#%!ݥIeg__%;Z9qdNW\f0먪FtN&gc/򆠾$@$@$@Ob [=eaI~BS(<|9V!V"5;8#C u'RxP>OH[EkSn nj/ʒ^H,f Yػ^P4&J,ySZ\8> )|$UlEGNBB} qVk4lC'\싸b`ok6$@$@$@$((1(ޡ G$EsrRnMSO;Y}9UP1CQ<m 6*$¬@_^Pִh&J==U(./UXƲ|]& ³D,5TPšb HHHAZ\P''g`x;V4UP *Pɑ-6_ۏ?z:g E9R%yߨhabۗċknIJo`tJL$@$@$@-@VI:(6!7'vyJ7EoɓͮAgĹs9ٳ3ڣb ώ- 37*GUy50t G3͓-5NAjxסwo|6DPc/RN:'Od`6"   o0ܻ7 ۷C;<=0xpf \}q߽5ə-㍚iEXQYGSUԴL>"zF^][8% 4 ZnF֖-lo/w=cw7!cbs]wG/Ñ,!"XZ+ՕOB_͍i }/T!q^Pʧ*Z3Ue}5 @(,RcxTmiK]Ǐyٳ&[+ b.YqUB 5lc{kk,F&N4;=݉x_,~μFr:~jgT-EsR}as)k7gN>:V{>Z7!|.|OpqqƲϨi$@$@$К8A,))þ'(^aog3. GG̞U!RFO=k /8ozA*텸1 ԚΘk%   6A (>>.o( BI<}oW9qC,ӽ;:bBS~ )B(&k+**1TiFcCu{o,^Pf%衺iU f'VBٳJlV{Wo}CB }$:IDN\INu&]vܹ0SZ@uK +[~YY6墬'  $FzyxxӥYX[o@e} 7l0sAUe%ɦ0(6JtTOԻ6    ^P;ϙch(pKb^2l:|9m y~glQmI`YOyA++ReX 7Ĵm V{8.PAQ{^7|'l>y~j*׬QS n$(^j$Thk}a]L–I!{54@Ũ-箙9UJ-!՚i;Y MHLKar/ 4V%(xo8H1kڿKn$auW_An.IeѣHHHH@"رzgڪTJT &x噭|nzv19Yj^-.#u{Ժub)mD2t(\u,yx%jGUyٙ3O= xqg{v]{T2xDKz{m [E R+ݴ*R%.oF-N Z<;wFw++qpMma6$@$@$МZ*VOM~;n.%M٘HHH:ҊT0=?)@EI $WaElL\>RƖ9D,X]gjMW|^Zt0mŁ=*UKa)!.^Xtjݣ42CN G{-뛻/'f۷&F$@$@@?| $>=lv\/ 8GHlZZȖ-SbJAii9^oѩQ_\g77-jJLEJ~ZCon%2IHH6V+(W.m+HHH&Npo{(-^m]Pl'm VPlg- @آs$@$@Vxh\2 4 As >*egcS HHHA PPtЃHHHH PPl$@$@$@$((:pU$@$@$@$[|-\ 8g G 8g G @V88+ CE @`?HHHEG<HHHE8.HHHE<.HHHEG8HHHE;HHHE8.HHHE;.HHHE8HHHEG;HHH@^QZ    p  $ aA$^E"k(5MOIgzft @ @b%& @ @10= @ @D@XɠIZ`_g9te @, PtFSo4 @`Gk @[ o6 @`m%2>uF 0@q`p @v^+iW @C V P@nMﶮuK puՉ @T)-6U6i @ ,o/w+ @ ݕj¶fa @ @ ,@1U#@ @ @*2ňȯUD9nkq @ @ @@E 7B @ @2}|l}L @z<[  @'V/mnC @`ʼn/O!b8{Bwgˆ 0aℇ  @@F?L<\jv @(Nwޜ ,$~2DZ)IENDB`golang-github-johanneskaufmann-html-to-markdown-2.3.1/.github/images/point_list.png000066400000000000000000002725451476711565700305330ustar00rootroot00000000000000PNG  IHDRl0/sRGB IDATx^xTO: UZBQA6-TTEQiJUQ[zHwYfS{dܙܰq+6>I\DXHIB7/"   l.E%!lCxHHHHҌ$y%"N{p*(&ƋG-D    CbYK΄HHH\&)I^yD 0:dE"Ii @"@A1{7gK$@$@$@<$)g~P JaX3#   ((fIHHH@ymmXEh$@$@$@$@ٜlp$@$@$@$p@R@#,EMX$@$@$@$@$  hI9=-E(99!        "!IkfAX 8$pPIPd3         'E"IF$@$@$@$@f Ig/OR!    OI7HHHH,(     {$@$@$@$@.-6HHHH b_cΐHHHHHHHHҌ4CɎHHHHHHHHH ט3$        4#@A1P#   ZbMrZlHHHHREb1 d]uז3#   zlK$@$@$@Y, TcS   ((fHHHH}gǖ$@$@$@$ PPɑ (( IHHH kח#   w PPtۑ @'f3ϔ#   H  )kIHHHHHHHH NHHHHHHHHRBbJhZ        ((f'   GcM9bE>%$@$@$@$@w PP@$@$@$@$`<    G"      |HHHH\&@AeTHHHz(flIHHHU]%HHHH %    dKAw\ JJ\HHHH 5>}ܼyK+(EL}ڵw1^֭X !RoGB$@$@Y@CVnܰ%g, @;Usg*II"ar%};N|| Hr%~*RV%ɓ'WGZΝ":4.~QRӱlzyz=oWHBB4i\]jvp?~s^O l)(^ڽ[n]@\?vLcb$Ei !p-y9J td=LA~|z9f   H'7R *Ȯ{QqlҍrB4h uTNѺ׭Qj"BW0{sV?8ˁRpt;%  H"\rL$@$@$@$pDFސAwT:v;sJJ8S{,(+)(Bא dU֐R|I jJ|qv)K!5qD<(^sKr~x(.ZQ|% xzxdg"    QL9d[ɔ'N/Eʲe%66ނe:Rb)'lrE 'Fs٩7 @dWA…H1rU`>пTV^\ Tٺ5Ln݊U/3A1g< `?H XׯGQ2 ڕUu#Z]#7n> ɗ/݅wUPgyoPyݸ# n+}6*U$eթnZ=x蔬[ǴTy5k]GBxwDy @vmi%D'Ϋ16{lcXHA/*lL$@$@@q ވHvCjתa-[̂eF )6H5\t<9~= b) F$@$@$@UPʏ@P)X[uqhI}b|wMjEcVySլuV6CPeEwWHH{.(^vS֭'vF,[\0])(p5 968K&M+F$@$@$@;$(^~SnskbREK֩SS^ &{M<_LU~=8dS6>g:?9*(RPN7M_ ExY~HW5-(7AUaC;hS d1\Pܴ9TVڦUoNQ+AQ,1)I1S>x,5c$@$@$@$ d&Aq3ȖG :uAS*\{/ݺ=lw ]_h)m>S}N_)(ԩKT81ŠaFAqR88Lye!v誠jI*@)\-(""r/bD , +O! Ȫ<1W*#AAEP{-(^ȶCg1w%cj9\!LBD=LaS&BC^Wg=Z44oiFm(>;eyCf|ʗo'h,m9)(lG$@$sA;'7ʡC8 jPE*U.# g7l;vIgBG݈;ÕP0a@]/_lp$@$@$@$@vYSfJ3rDy9eՌ6ytE+"؞,]dPhQGvHmΙb> HH fs[v͛C]^ Ib:(WTgk3 _N(>>ҕ ;'  D S F0) ^O=D9W>{VrH@n9Scb 6m !W.ۊ}czҨaԫ4JfZlHHHH9۷[6y u˰hsP=DhTvd^\L.iKԁ?€M (/Im^r]^BR.^A$@$@Y@5[be#J\ipA08P}g-ħF uzxvzszKj p""}ŷeKYtJbbԨ^^5&Ųs$@$@$@$@f^ әfJ&5ɎJE/ݳ|?g97FH\9E5U1_{NjԨp|V){iҥk2ltr` EDx/IyKԅDEyuc'sgsW@M.)eRV%s8ßs*7嬙#TEkCN=ƪԩ,/vm HHH ;qN$bwžc##%l%!(&Nj$%9XN[/8B + H$@$@$}d*I] rJ0 =5aor9uCK#<SSEYl1YB#Jᅯ,:0miժ[yGi j0޽ۥj^}~I6} _=.c|x3YKVj!8תYQF~֥"   "'J3(!"HHHHRG FjWFUDRPdEQwQP@$T}K*U*-yߡ8qEX,ᓮy]#UϞD]]ؒHH,!(f%lHHHH s9(;RHHH +Ws"   4 @A1 S ,%  pE0"   ~ԤsxydgSP @'@A1/0G$@$@$@$9zV-\/y撁zHHH25 zy88        \((fhHHHHHHHHH Sݸ!m. 9u $>&Fr*$ v]F]xj\xM-3gÆ}6WTZʔ))ƗHJ9r$&&_ ɓ'WZt{}?yxzJڵS4$WxΝHHbQo/! bO{|9JJҥ8'/  7((bmоT^D̜"5jo˖.sKҥsr5ɝ;/^Xj֨ Te%?).+ۦuؔtM7gy$}>sY*/)mڸx1o ~na,*IIIR~)W<ܓWհ0<)%˾ixB Vr[^H$@$`@v}Ⱥ{$dk:}InߎR\ YVVlwȿH@Zil9q⼴n@؊IH2) ..L\T߲E] L$(YSfጼ<٣qf1Kx5+C$(;wEtu񉲼,-6_%5GiԨ+MMCemѣH|y}óڡC0 i [x-y93ޑ=#bF$ ŞbV|28' Hj BAڵr5 K߻~ClP员(ǎڡN՝ ۶]HŤ]^Ż&(&$$+HRq{^zfd_8[<ٱ&#VI r|2ծJY'$_O$@E ; 'Whj%8(@*T(%g]];eҥs3Сqzg$pH=-n9` lJ Aэ۹deJL0U)P2#>ܷn ƍ_f( ^ vE7i.bF1}HH ;Ȯbd 4xZΝJG;ag^X\tvz$8WHw1o@$@iBDn 9(˗6WTPZ_϶KRΩzU;}!9zƩܐ UZ5.!QQsZ/ގ @F>;HռFKw=^!+Wn5b ejϟw>F]GצJ~ףjU_|dMb͛raKK-A5 tK4%x- deUPܲ%LL]vRh-͛Ͽ#gGcREr2Һu}ɛײh {ɋXOp_Q<\skvOM #JXI9vΝK+-X 'K3EX4 Gx1RYr̡w!!asW g".D (}Fbojumti&O7rl~رs;9}oF:D 6Ɂ'4صö?_{)U'DPDer IDATmWWb߸Q5~*jȼHл׏8:;]OH&5\>{?DG߶i_{N 4>xE\ n ȫWd„TzkC/Iq=w߯qGjUOw{T< ӟ-oP-77Z׮-c{+ֆ=QJw* Œ?FV:n;.77F?o{[GJvҴim™~;w OOOq#&٢,:,$]+# @շyKlqX yڼ .]ZTTPo$ƪ6mzs$(`컓GϷl1U@zu?$0lc!N8glJ]цb)W m@ q ?-Fq((ZTtҍf5*8{rUPeQUYڊ{ePۦi";/Zh~Pjn}K>_t-ٷϔ 6yۢE:vu;;e0i-G/ih=»fH)[\z=)w/.oެ~'("?PVDjÎ> TF낵O_+Aٍ1psgHREv5k mۚD˷ʑ#gֹ"ޯS&ơkp!ҥkؠկ/R*ԩƛXsU<`MgUb"2iՕܦMt} @כQPS&|wBŦNwCtEP4~ 8~q̚9B1wE=]{sfacǾb3l94"eTgF(*U,DDlNof Z*TyJEcOp<lK$@$p=zxW :u<׭#3uÇwu~x=jAYһw;%,uݨ( SȣG?3 ӹ`$el$Oՠ?!IhP"ƃqiۻAA]EŞ?+EƁhw-#1b>lt5\a,<:ŘǝrujHgijWtQxneu>2RPBZXBr17Ay7@ZF cg"<a'Etgv` 氡Rӕj;aoJ$5 :uEP7KXr"<_o0S32f$@$@N d+AV+Wsq$[$i-#0x,5!bzqٶԡ̸ّ*(7: NWOR@^>l+ƍjr3WE vm]ig&#E.D@UAјk7T"\F~{ŗgh={/RZwHw( eg|r|G މH:  =o9pUm:1hm>_EA-(jQ ={}=ҵLD}#\kP'\֡x b%̸O2yMҫWUhPY߬pex*GpZ{epyQ{kW̝r_G .m``9="d[XC{N튠E&i149A15lؖHH md+AWWˁAA\{!(24!zhJy';l!g,`:Q#WE΁#1ɓ;Fpզ]*[ #6+AQ呄Ju g[e[kɝ"(+vԥ)ϟGTU"<.\_毕P#:-(BGQ}rG|'E\eHH~%ŷ[&r bƼ$i (ݻK$XhԼyeu^;uD=LZEb }Y_Շtmwpǽg1+NaFAq,$b fAga?G)l?)Zk9/Q{ror#|W~8GĶm,EtuGPMB4siAW蚌Ơ=P{4tw˥\b*pڵ+\MEoZ':=lq0 @?(ĈֆȭNA1-A$@G %1(͡N[9A**Jީ-[+, r@ʛqE=7 tƍՌa /m-`~5c"D^F!%ڃrz۽s7 յac?}Eʔ)jwz3ۧ:3I4*8*IkCjU(4[k[f/_{6E9"+U5ܮkt( DVW#om*xTE5 4rƆ @v @A*!/4%0ϑ=یc"mq aٰw.e,L #("I4`/yaHQ8_5%ԝrq._0//P̦3b1رNq"<'oE!z!k`K# XVP4bF%Z!h}nf^iNuw˗}|P~^!Ǝ\ػ̝r֧;O/U)`i!(1~9iX>UYa! #@Ayq'9r;2R<ķE VͥUs&(~\ILLT!jYT:;~7nޒT}GB.҂b d6ϓ7ȟA9?)J^c伙ܾr)6x4m>a%xzJ`@0w:bɯW6HmL?n uB<6Ic̟(Bʱ ӕtXaY" OC!0"E 6s?k_jM 1$a5|tstz\QJٲGP:lpu>vyOz;ʦMdWO9pru=+D<{6.~鎝_THhZ/#H=^[;_nJO?-I 4XpD;g  3?%WoszJJ{0 W!CVp5wFYTtJ44nl^V~y>{XBNǂ ̙piqo4nND%}6\ Ԛ)[^9kb;S?cbu'b+rMJ\ӛFg. CEQ]$*k۸Q ZGs:_ĻBg}  P9 B8dDT׮-'= ڼX{#ZPԹUMDk^_O|0iieRޒFg7ȑ],D.J^vҴim{+egjҽ6y3r^fZ! <͝J) 36=>tgxZwLLYlwJ=)Ӣ%o"cc껅"wRLHH ((`fkMŋ_xa)^9^((Uyabw%f̝cxB,T,YXm2?`N՜BKr_8ci-   {J( | g\<{XUE5_/&gbRӼ 8q^+_ajX ř3%]9Hv9/O5\˗=-!$9sgRb"A ųbt mFXD`M]?'RJYTFHH2Ōg-hOP̖ w9* f8lS6ްYx dY\9*".2'F$@$@$@n46I9 )gv[qcØ~K$@$p@vgHHHH yd 7!  4%@A1Mq3   2((fAUIAc3'sSHHH"@AZ/HHH2Ō" }F}`. d !   m8^   ]w\ p@ț^Db.\]*\vHHH2Du˂y=3ּ @&&@AŁxbr+o/+Ur3g*AH۲x! d]\(9e:1!A"T?SPt /#       ((o43kk' @.M#        E7V+5c   'bbM9b{) dR,Ld rPʗ/)U}mHxvIpժlY-(XN<=<2ca dVs$   xYbb=!6ʩӗԫIT {&OIJQQ>+ +WiPO)_Y    TJlN$@$@$@Y@\[dJ] tTHxe>IU۴IVyuzٷ=}FI~ɐ,i @#@A1- D$@$@$@@hoij箘Cjת(ARl1 ҐgcGfΔ"u+Vv9*[CɥKs%88P-) HHH uז3#   Vk7e}k orUh1<sxy9ނq/]CsWƛ*]4iR] 4   HӃ*$   @7mU7b~*7E+XbR>-cX|k );/&   W ܼm?7Sʌב @v -[d*#AAEP\{!(9sYB={+11od@eN"IRJkEq&(7_ vj+T(4j(K<\/$   q˔C@PL-K'   Da5o݊(q۵ v9r;2R<ķE Vͥ™Gs%11QjT//V_b.ˋHH&p IDATHH sZe$@$@$@$5PPtO_yrI1aQ'Nȱ%KlZڙ_?_n_b=!6xi~DpWO] ("1YQ,HHH2 mE8   ((b9"W⢣ETO*W?nYX5#HHH2  e%8   \((fhHHHH i!   LEbZHHH2 g-8   L((fXHHHH gJ'G&B$@$@$@$p PP+ }D}X* k $@$@$@$@$@$@$@$@$px-J$9$%9rZϯɓ+;y\%%KHERܞ HH #\NP)+#n{ܧ._./Dʭ[qjŤXBl8l   WPPtR֭XYl<)g\OOO)R[+Zxz2{ 8^/Zy KAkӥ{k8q^Zn ^l6=V_˓޷d$@r|Qё}aO)WIA ;s~[9 z2#$@ŌYC6q{0wC2qB`y\~V ]bbna$:lbRhAs׮}OW|2}RfwIHҝtGyo`CV @ . N^uʙ^Keމpd$e:4% xC2y5ΝZ5+x~l@$5PP̘u5k //>glAz!CJd `~)S4c.C~zOz+AF?sJg} HH ۸_f]][ݤJ6M buIR@ 3 ~[/{ȨÃ)R 鿜 {4V(g/#TV~Ix~ժY9wr!uTܹruI/r={JŤQjjn{ #*)qRB)iبhe0!az B8/7oS:ukH.;Ϝ;.#mZb>sYyoyխ"W9, 3w#{p!R=(R|IiܨC \/u֪U}pxWOI8^jYW%CsYjjWjRQwT pQQ1<]FpA.%#/ۼߴI""$16V,)֕|K[YxJ@`98v$pOdWA?6H~R?H:uQxc^a<| i6XnߎWODQڧǎ͛H9|sfvJB~._.W\Zzc{*A=PTV; ;j1.UDZ}&]%VH|S.YޡCct&9tox#3w1e#Ա9kCB¤`|jg4 S/i,>>hR!r#wQ9|TXJ5-䒭[BmƟya=*o!tc/m\tM9z.mm;(vQ³uD1HH2' `] .ɵk7 ŋ۷eW_r*$׮ٌ'0Pʵnm~]: 5kWbXrŝ+& 夁v7I: AҞU\FCRqjim6lXjM ɍ16q_{N$Fgs6mpvC5-ޛ˿lfY'mھn\R,O9s5V-ImDV d炌nj%wf; OsւkTi6o*cy=,s~)8_ܪiGEY?'o~"եs l*N_Rm۵ |qdWl-[CG?!O*/ҢEKߤ6䰏?%YzYۺLśF%'(e"{J޵\bRz,8lwҥKSe`0DZ-?ZQP{yKP^rn&IWދ5^yEuzge"^OHH 3x,ܰbH֨$Քw {1pСvC<@8l@yx5^ڨ ֯A_/Sm Զ34Sɍ̞w>\s cA}A[VFX*ļ^ޡ(vc4<{F\~Gl0P`{HDa_O)f!w0hXTXZl ӯo{ZD$=>X/' 0 ;GOZ-VP} 1]0O4*מccz^ d>yMpW[Q|ysKɬ* 'FASmRp3gJBl3({w! !5Z``9iܰT`Ň0CZxaPfiԨyzz$LD ei1|Ƹ 8@@iA l'Sh7FYx6 *6V6u} ])G֏֗n5 =b׮-ՆM?xnYo(*B msW͚9"U9/wrl!X #_PY/w ?\S?1Dvx3 KY gUzң]/`1RV"3mWcm@CJ=1_vF<{? ׮UQ.;KݣؼڳvS(X{()<9֬)e[0_ ű5ˇ6կ篾>lG$@iI vlwTVl= 2w]@^yImX: B2uN]|NtRFϽzQcLa~StZ: {6~ Ҵ} ^A'?9C |g\^7lUUgPa8!|jWϞmE:Gւapk p\ĩ5D` 1ExWoE;Zp,Zb1Aql,d/cٯ ֪ul]eC JZlO$@$tz:N$:|7l_ұk`#ał*IwOqΝZ DG L-c5ˬIjbxw}9y<b3Z{:75:d9&O^o:ml^PlaBZ:?plLSo5U 5i/?ܑƍsCk6.ZA.ڠof 5nn?euya woD'z'Q /=&-Zu+s S9%wEPԞd]B91ӖֲE]0}֭ߧ<^|bx#i~2G@o}QPmRԨaqɡ~[/K.oo \tMBB)=66| i5iR] 4 L\&8(l'ݭ0thR[Tw-Gzk+y+^[0gpy7+kmopb 0J~LKӇ8';f|jS~_CZ\^oFC/΋%o>xՈdB n/\(0$+Z֑8qP0Dc:ޠF[t9ǣ1-;ަo(WFC{^qЋopP 䘉Q$Fy 5kh$@$@tZc^Cx!tV *XrfK?gyRz9 x*&gg^Q"BS|vڴp@g4 In@ x]oEA ⤳eB)e PUɏ?fL ƾ} Ӎdgcۧ]AY;~F 4x EBX«އɓ%R]#U&-LVQė|qdȁ<}ĺO-;]傔x dߚ$[(^^q'9P=TWO*9rH{'$&%I*m֘q%#%p)J&?v=-˶엿wMᱸ]{0FV7Їރi BmKlCnޯf S/ӏXGj:.g!3<"O,dbђ%WgM} 5}^y5"_4~)SbzH3iBBoUЙ^:,8w3/V}^8$a) a4Dx2x[{Ѧz/x::*b tIi /  !@A1m8 ͛,^] jPUJ.4 -ZHo:%G.Tܥ/mYq"?![",}9^:YV.ޭ 4fyK!y` }w%I7E26^Ba׌':T:6+#(?IvOH+zTi;"6œwQya:%~6VNnWjkíXD>b4BP0c[4UgkBnB2'H*_B(h}MHuFAHʲBi$1>^/.U7.7_SkC,~vZ>I ;Ȯbs!C|.X{j%^B1u?6n/%8( Qfa~%[IkJ>B#(8]gϋ9kfLgߍ۳<" 9uz>}Tvy/w 8i֎6 IDAT0q:W=Vuv̘hXoweO4:|KRa"@uFJ<4  {n(vE1ʩ.bPЌYˉՈ}\g]Ư\ UHqf.#o(>\(>0?чws #5[ Pluz\ltx" L+6Tj7ڲ[Tߺu0T"PoU;"5l45wk,lYSQv9[#9/(kUqidPAa:ӆ=Rhཨ }͘$NU/P$ǑxYa-"y_Wv^سtZ5o|]Z84i2'Z ׾$x?2yV xiTY}$@$@5Kb-uC@3Tssu1y(:9{S~0.YcAPԢ!)ypܘkCؚVA!4йcoqOeEܫ߄1")6ĉ7c &=7coPkeE ˋsG( ѵ]yOgܐ0n+^!f"! o!zpJC-SJY[A׆π^[|nІg~pmclmfͣz4)Md҄3xb@7 EW9h$@ u~{cD ɾ%OnrP*ev튗XbѨɘ(:kK +CC[cgx:U r0N0Ducb4*^&?{\Db4Rc <?^iv1֫f"Џ1>|8U%8 ɬ\C{+3/cm=7w_ƗYCX殮 ԞTcRXaize8  !@AfVUbWMTe Jth/_/H&mvUa ]^yX ɴisVZPK$*(Ju$^٪Ćk62%cFCj&^lzk/1*^cFFroV7tHOIWv)"a5`ۮ5BP|*^ex95&[aax.ୠ nchxcuifC՞= ui$u52zt՗/U%X1rj#(HZ#.O }s`h.B}" vL +$DgGHH*G"/un꺕jwj` Z'3$9Jw=Ug-;H ?WƇþ{R̯4/*<:x "kCI{ {S*\^t7即^g>.;_$y= \/R{'(ֲ!r8$@U(2^^\5>X]m        "@AV٪kHqAtt- ]ߗIڶmM:N\x k"UEP4Neyr>7%\_TM۾]U#gvE$@$@$@$@$@$@$@Kڡ((:V^DAV. E$@$PnNUh 7/&%MeȐ”9ggKriqvĿSrG]bIۺU=*y 4]5mZf_gHڎ{gfp_iڳx4kfgXu}+$t٤$I߻WrN7//iZGFJ >}zOʕ&ݺԞ=jǎ%s(p ϝWXUZx$ ,;5U32,s4]йxزErRR\fլUF[VV67RZhR  \ ?/ÚqqSdffL2J65 nJ5jAQA ;[,%ID9{1 y`knE¬K3bb$u"S]\~֯/>BT6 Ԅxoo[`i;n\i}"7??i;vv'(<쪫Le9"`޶tNȐ~{6V^j=¤a &]:D((£QK36gL孇oH}x!}x,\ ikuH6؁E/\1k!ආ yKDaڅȠ%$z0y @((    Gb = ?])Ty7h`)\.׵QPDa޽M/ձ;PS#_ShOf 2mݻ%5) mQOF}b5_? tC߫cU܃gk(P'ddyž;=H矗{drLhBIHHH 3Pq1 z-^eNӻw;h!NNjB QQkaÆAQ6hP:>pfN+ɫV*BXnՂJ c,MPD~F Ũk3UP`VUAo?Ծpb*6\QA13.NXnCȳmDa)*.$gaۇ;sxmx! 8J*xBٻlm*@zto+{@sta礦Jܗ_VQ6A}+ X^m KX[oSS\\,MwLmXib%S'}Zl5 @еk*u-wTP#aA?;v˖-1r:uN{~}#HHHHHHHjŚkv!#OHRI'-L+FCDQ,/ .Q :TGFǞ(ᡪMk+8{V|^ҐᅈPx__mߜ9RxH=Ve#(+EO Bl Zh,}>IZRv׾}iZ=:ގn~~e4Nӳ,3h"wQaHH@^藻+g-#   LeZkqXAQSFI&&AC3f9 N/"B†/u()0v;x!Mڍ;رkΝg{Uu47]!8bͮZ¬]qL|uGfP1ŵJ@.ԙÇZPDE`ĜGRgҥJhU}Kqm^3 C~ŋ@i#֛vL'zz]#ca8ڰ7mR8D|;U^}D/#nIH!Vy) @5X ҄.Ѻuv77%6IER>xA44]ؚ5KTex%BZY/MP?$૯={!;W @gee+(B ( ц"΁?C): *~xT^`_Z 7ý1' mɱΉGOHv!e;0$  JXIpHHH9 l]ukNv*U߿ܑxN T:>^yEcy6o.FRދ џ=q*#bJ4urRan]zf5''U$@$@$@$@PPsQg @`,OPIHHX C    ZHb-\1īHHH,=ݝ+#   ((ERDAJYiΓHHHHHHH6XVcp_T݃0ȭH#       Yk/['        zEbZNNHHHs(VKD$@$@$@up.yy.jҪU:8HH+r:KPP T* J?#+~d_+nnZSԱ/6 ],]#~4Ц HHHJ'p% y$'#w\w? ? PPDttY<(߿ ߐ"u_(2>]Ѡo* $4,Pn>>XfU-= X PPȏ #@A?bNgojhyok8o Yvxy53S_ :XI>|xF$@$py PPxy@N$@$@$P[ PP+ฌ"<8otqwwS- ހj,cAܼ PPalH*H" >2HHH !@A/QP;R6o),(xCol$qq&/"ҥtn/OM*C(ue!Uu{\i_ztok=ThG-[b$p:uF\]$eDm.v''wek tR~u9#W_I )˖;Ŀ;PKA$xOJHi(Qarnbӕ&rA *~ot@=!›I^K`KMM,NIFY屉=GHϞҠ2ޓ*l'&K&ҵkO?mQpC[yU!XzXLlS?4aXX`9_rJ䤓Ҥm\ -56~lHDyjW^$1b^dݺ={It.CRi[!/?o~6mjDQQ|dIQҦup<]~0.Y6tU4};  IDATmbpB:xzD Uy4~˯ԋ#JXhOd oL&L"^v;CRCÚJrݵVhmr(>ERR%i\i]YPuȞ r.@""ZȘ1 }>* )ҰK\74  ((U5 OM'oD"#2^q3{NY#P{ B{ՇJFn#oQWք{mQ]7zMjW9#7B;~ֹs4vkWاD?yD:i^=j:oay忟:7nXfnk1ဿΫ sX {0Izkm sw(1F$@$@%E|7=j)ng4|;󂀆=Cz*qvW{5?qbYY3U /sD͏>YVi`8aé>*q-TMAZC~ݽY3~&99~~('{|ţ>}:K%04   3 u0 sf?!ON_m;|6T|֭1λ_)hDo?Wu 쌢]ea_n]*!76>pLxCw#q#6o|䖛eY7ݻUZkNȐƦs! vU7_᭸X}j11I/[ٵKʠ6cuwmz+`i#wSaI(#7n`L9vJ=_\;SM$UHHZPd!,-1o8uuf႟P9,#Zh2GyUҮ]'I<.?Uzj/wu㋿m[ᖗu+VlF <П"QPľSV}즛Kn9mv77WQ@ [G_#؋`7Sr[cشT xCƻL1EhAʏ?mwZ9/x&><9rJCEoxvU{gA?HHH" ui0 F߶ 6L8*A,Ćo)o'Mjs ؓO="Ó-MQz2th/p %@CBsc/ݯ a#ERE=^Rv>Kisg ēK]xs#Xii3AQӧ ֆY~<&sFAvO@yo* ڇھZ  o((SSO 2hPWyRZEW;ePE2 2ӟ+ ybY}!|g؈jA'D+{_9~7_%c T bh 9܍*#(<<ؽ(wvBt7!K-*32ԃrTP.'YB ^?*O Pc&dYzT_NߺM $F;vJ{V8~_ (ό轈9cFAϫK?'YN֭ GQ)H ACuNɌ;w@ _W*w6 !c4|CC?t<*XI6z꽂Шo^||L{< \)((ᥧ7tz )MP4>ҳg;E}O""r|ٳ'Aӳ 2nTKKHHSyƌ70Ys[s=U M[UFTFx}m9~FKWox"Lta^*P!$?SXzL Fg$$@$@|R̓lGH/E3Baf>.ޖ:wC?nVM!W4qQaj?==,0EO>Mg1+# iګp͚]2e_@7I#U?^dm_ ^ 9^{x4Tڌ{(c4Dy< w !6MR&(b/JDC!B!8B%d `/A@8A UE](,-XCFv+2덲F"6{aBw\'w[U"!N{ypXzN Ƃ6p'V% @Rӳy w>1J!SqTg5Ϟ~p݈܆Ç6 _c}U`:؞=f=נ-ۂvAw\k6?G}aE{'L"<#g4/KcKT98B$@$@:E9~=;EbizȍCnM >>VS"weUEj d,KPDg_y7;d8ټ%T4a"q6;OPGFU;n71UDP70ԃrTP3CuOEZ  PP<`o`kZP2Mߟ>k~ a ^x[ .$mE9cA>{wOXRha""* ?~9# "yb\3f~-6E+_{؊"n/!6nPu. "  zOb_b{)%(4"^ll*!GE6)7CsUEr̘:ьB.F g%(zB[sTR|۪_oʆhxT  $=CoPutHHœ&&;{k꘽_(FˋUr"oMoT?lS@xDHe4Qڶmn12D *+(3{T쮬# By#2"rq#'<5FlHH u|CPAx0Ii删.>7Wui[Oбl67Ve QeeȣSU:*(Z]6Oe7Vذ_5m+(Vf^e禓8G -s:$M iHHO*B(\gIN| jլIT&MB'5C&h!Cz CLC)ashw Nxr:b/E~mXAV͕u>#J^IGkHHHJ$@Azu IIi|`Agťf::"(s۠h3Of͕HD:ET+DB_+#GZo/,3grTe7M9(3?*dC [A1P^C hs.XUrʣ7K~Q蘣,m+(Vf^ea@Ka~u9BR*:6HH*NXڠct+>K~֌􎔩SoVOC/h_PĞi+㮲^_Kέ!/Rte{;&l#k_=reE9wn5) ٸň%H ^Pºti-ӟ|_c5_mZƪ[Ly19eXDWY}$@$@:%(q\Z删_!xˮ ;I!UWQO «Mrd͘%++Wc{mmbwf0xEBL}SInmǦͰjѢd4[A2,C= W<5aLQ|/du͛HQQVfUHH=Q&}R E=CN'm=e/qU ;08_5x,^\5zS7ɞ{~uo= aػ@$9"("sU+LyWҢ$%~Ui^рNHFȸAјQ$@$@$PPPKsTUp٫֧s(vC⋓MšCzpc8qXZ RolcUQU"}5pl^n5iFKNJ0ǿȪU;8qQ"l]gLo9i+ KUIm[@l ڮ CP6)!miDU?2ڵsli$@$@$PZP^%) "ZEj"/ ~\\U3F^E>fFk O?=TO T,(+FMWyM O?])b5ٷOL8DT̷n%Kה^Nh\d[%t  ~ou5[F$@$@$pE> VoT_F᭶ 7'֭k< 6GNJ֙ k*>)aaAU3`<§\iS_SHuWxǧH;xlEle{+ðS)q)&%>]y/ ..n޼IG>b|פRRN)¢" l^9"ZׅXmcޞ,s}Spp8;\=JMSj/54M  @b}Xj1_͝w\'IG K?ΐHH4g )ɩ\Bc}rn$@$@$@W W؂{dAiyGH+习x,4I$@$p%Wy 2x'$}U*x""2   ((ڥ+l($@Arg$@$P PP.7!G  X/HHH.?  .PxΜIPw2,貍_zȝTǓKIHVXA?lmi>D {U^M$@$@$@u:H" \/uI$@$@$@ڿF0?#Cr u\3tp5y!*f<(R\,!!Yݱm    |HHHHXǞ $Mvc/I2bc[Y9].Ӧ9FM^X/fV]"j;M$@$@$` PTlىXHHHHH" ui@W^BKe>U%36VQPtƞ3HZ\{m tgO$@$@$@$@$@$@$@u:b[?lR#~jh~FL$3KL~=|@iҭ%ݑ @PPv5r RΓNeT6䙂e[Rk/p$@$@ _yvb3     qHJ:)6Gː!=Lڻ,YV~l(iķTArbV9,NNN,S˲z(8!'w[x4lX$܎wd9"yN $y{OCz[Y9 غuR/ 6[HѣR+-Z֝"6N9tH$$mj ;[oܨ_}4pw7U\,i`~䥧4 &ݻ~挵-9,GfK]5fXX^KQaTFDZ~HnmEg$@$@uԑ0IHHHx|پ#N6nl5SFIS8wZӳu`4..\k46cƘ+F*"(m.)ۥ'mǎUm-?+KZΝ>m^j'N+MP~oɑ.gϚ98;+1!Ey_qwx}MwKCyK$ 02MJC˗vSMaމ?O{ۦ9zj+%>Sǖүor HHXإIHHHL/rqٰ1ZD'zm w=X<=^oCRO~S>xp iRbZP'ڵ߶m%qI۶M_LJ.uƎ *]H3q11u:*G.ׁ +rMH`8Oڥ~}Ex$.^l$|Hhe$;9YӪdH}˪KP4~0'Ѩ]KayygGҪUg'c S╓D{zyY9~7h5kԹ>}$_?Ӽ!!6[ALy$nYL@h#u ^6@nؠ~A\z| >18KXq9B.СCM %B`_XQQ[bPBP7JÃjIH" uq8f   ykѤ4Yvx$22Lnﰀs)3o%"E%%Y9mCb9*(9Se \F,\ iڣ Iɓ"o-* ȋhk0Qƽg,%Uhk$q5ދgWS{(!)VP |~m{TR$ɓ;╸q 4phmx @'@A1gH$@$@$@!@A2ǘS ";OqKxdnK ȕ Aь9"(ɞ3mA}l q l=wlU@a7h6~MXD/X AQ],/xC+e4svTP4VOIIW"yj+/gy< @"~֒2ߋ/r6$@$@$@$P5ƯԻ-^eNhBzn< EXPv諥ks@c#ZPD>X}Aa{GŎꖐKolUփqkQi#V{G2' v`L `]JALC{fW]e==Jw8D^gToF/= @u-~Ab}ڋcr$@$@W6Q. KreIHHH!@A2uFY嵸u[c1s WPd(2((³ JĂ D¼ a{_U@FXmذa\RcecTqFe+.^‘_Ǟ6X)3F[?sd<š&(uon{&3: wx{]lOPDsN3g+,D/'5UlgiM憼  @uX]$ /kzΓNe tԲaש'(֩p$@$@$P(( \6M$@$@$@uZxyy[Cq!Z6K> 9;$ 2s,y}=j&ҡbIHHH'@A<5IHHHHHHcɖɌW%[ \GFa @ @AvGA$@$@$@$@$@$@$@$@u:L$ \zyŪSwWK9{$   ((ڥ@T9&^^mB$@$@$p %ͮHHHHXJ+姟HXX]8KH`, e؍.aHj' s]8*   ((^`eR(,,W^BKe>kC$@Z4 \V/+~v^ "ek|&SLjGu5vHHXg'   %@AFXUK%;;O:u qc8r! zOb_bNHHH*EbUMII'eh2#HҶo3RpC<ĿsgiԴilb4߶mĖ-,N gԯzzxa^3IAV;'(0P:uRZf|{&ꚴ;$a5ΆK#8z[VV67RZhR!xFAqrٷ8;;Kdd ŗKQatZ:v ߪ;xj o&WP1ٻkDZĿ*$ӯi`䓲vn9*YY92,P"Aɦek tR~u9#W_I )˖;Tcf%˗+KIN:)MJ6eذҨQCж]rI$[4~}IPL0#|GdX#?@Z7sVZ>_wD,]?6e4ik'%uF9wܰy{oD4g}Ņr=O:rD2cc\f4n^GE'19}8!sr= @}!NVP߾%{JvJ4pu0 0tߺ{Euk# \+ŗ7 g$ܝd9C     PPtU]ag8ٸ)Z23US#z% 3W//\+QU FB06ƕ"ϟ,kiGU.I \E@3Z[ouĉ wgEInmݭ\ZPDgٳ{Psk''Z|^4+17*1LЂ"£;>57O MvYg޼Ĩ0s!@Qn\ IHHHHH(kh&ڵ{$ŐO!aҷw2H_TC @G)!QP1_"BΚB-tEq}䤦2 }Ԕ7]CUű JĈ9@mڅȠ^bFAq{7x=2iEPjV;6ɱ{_-тY37y6Oa?u`>0B~ւFs53g}#7oJƎ I&NzECnśG]UbHZEBx6z?!x{ދ|sFAqϘ®_~EHWeW?]µO}/t4|9v̙g c{`hawɐ31O93o?tKʺuVS:9;uJb-RzkAѿC }`#8IcG\T 8¡eZ$@@9K φ̡X?V    !@Az8hŘ y ";"Yre”WwV=Ptq|-͘1DUѡ Ph CZPD&O?.q_|[矗{T/"ڶxXjabݜOhDCgz*OPޢʳ(o}lٛ j3ٻwtRLހ>ޓ𢴵] [Aׂv튗XB` dyB+Ba(l'[E0?omEc[ޤ4_>PC6VeE`\4']f>Z ϵLl {\(ltEx*jCr[3)9-(68PtfgInZx\YJJUmy AU:r$@$@$@$P((V7 -ZwvNV0y/?Y5!^kpK WBr3jCh&DLUe{CH(lPUҬXbcTt\8}ExK4ƛKdx/*(Cw«ݏdATa7n[–a(ǧ^3uFF-("(-XcOƆ K /zämS9͍ZPyjMZrhXޚc2n}tҺa(b!^'6QP&mSëu{z4Q\l[rz٠M g!ir3ٲmAٺiSoߗ 'I j99   6 󅅲waٸ1Tw{to+{9Ҍ(;TPY9ҌE{p5i,rjI^Z5ۦ:Q[ܒ%Ku H OƂNíaZPD޿ޝZbm[_E >=R]zi*(hU#܂("uY[Q.7 Նi;1<;1deE˟+IG?;UhXbweXU^G'Z|EgWЯ|61r߱uFA9Mhg=7{*aaƒf yNA1wD6oQE_!gg <Z ^D$PoPP7Kɉ @X87McTqtQLĶmKsr$",;QZP! @@,-S!Dϟ/:E ܱ3^l*c ,z~}#Ky-("ނ+r5;~۵=Z7]y\dž4o`Sc Pf 6W4>jC3ž-ܟ)һ|:7r '7|>T5=|XoU$$(`Uy90P}.^U؜RTGXA1&ej4MWƱ \zqٲ5FH42m<@ :j4 ++w9s   (K|h ېǭ,C^,f!EYPȐ "*3r"=AXPVUA:T)E`fk;cQ AmOiP6ntji܆5ayV`}뮻g<5ro#O]-jqvlӦ5n~Pz{^TF%hs-|׻y*c|ql??w{B?< ;ObQPD{ޗZ7@C!z<]U,]+{]E~W}sVf]x @&@AnGO$@$@$@5EbM-]kqXAac#+VGPtj<}I*Tb7ڌ"vw߭BKtJwwu[oI~Q 1Q犫)3NGf>ya"^aa _F@˿g,q7SUl_eXCBWˊ7]EXEۯ# @ Pa~#*!dҽ5$L}W]sG7~A,]~6VדgfΓիv;e=@e}Ν+W^BŒ_g}h](\ԷljCZ%QP,/Dx#禨H̰(qOҶm]UAQ T۷-S/7ϑ _P\W3#   Xqfz.LҺu]͝k]\f-`uqEuIܼ ;Z!\z,ZdmE77k%[x\Aģ'YyilETy! E\-  X06DOXM䕗0u 1kS ua!a)Sn~}UVPD:פz~\]TuQQV!0!s< jܘ?l ˋsG:9y2S ñw޾|f}Ϟ{6kDz; IDATRR\07Wl mPx>7W݆Ṉϴof+糳UF+WUPDukqqLw7!     2PP\J̳5Ppa,k#͚IFl&ݺIKy$/AIcuj?bU$}^52T]X9i@ iA1,,P嚄wn}}M]XI>R|'I֖e|]*pۅ℻o= AtΜPdڴѦnׂOVBЁJ3 mСTFUVQXwV!F۵̘u)=4D7avjj<\` 1 W_-7m2qpnSъYK6>jb;WEײ<HHHHHHH*((V^ ߋ[*4peۮb=HQAB óys߭4pm觶YoN"^yKU1x׶VU9T_KK:[b{CEkШQP4㳆$Y=~\y{(a k*Tljh^4h@!,Ѵ+/<1\ƍP 5!'  p&גçs(^6I$@$@$@u:tSP^{d7 wO8/<3GJ.RnuX &*ϗ{? NkTxT/"C71|q*O . 4!Ik.&   Kb];ӶmUn6{W4FVV̙89;I˖Aһw{iػ EzQ"bP@%buc,7di&)&1MLĖĮVPi"UE@gC<>3{{SJh,sut&|PhJMsS(@+@;(@ 4&)@ P@`joN PVb(@ P 0Pl;BظW+PtܣX(@ 4DZncmѐX P(@6&@n o)yo G;Yc 3|P/"m6YO(>)@ P(@ P( At!1ܜtΘ}8JgPQ\ SP(@ P(@ g_K~g5s$7˝ 33.sS(@ P(@ P o'\DH{f,,j_cb)@ P@.V:8ZxD P(6(깯C]ǫ;_>Z'<)!u>%hvmĈ׈O8  G{WǶW(@ 4wynvr^(@ WnSUU5NŤ͖NАZod5^|vXYY6Zx~>d>\|6e9-[ɺݽ:aذ@xҒ;2l$(@ PD(a(@ P@ }8|$i=8;cQY-*))Bc\ѣƌP,x))ii? S.`ݺ=/(ִ C!44n (@ P LP(@ 0@ 'N&ш3r4.bD=eOώu>1;v]Qr/[v0cE]Eڶm#}nZz"#}"I]Z׷Q; (@ E((@ P0JżBsǎ'Fӄ}zb$ 7unDEe%NLADDfNZ~P/9..J(@ E9(@ PKEB1MypzJ["1bgg''e7Wݙ˗t{5 i+S(f*T]3Lt?;F P(_Ń۬ Eڥ4gRU]Eť3j\y;P,-+GTT"#p!3W,%;R+` P(@ P(@0@Qޤ A||"o/Ե73Xa<ǧM'(VWW̙88>{a@j~O:{L P(@ P((f(#GN#<m8]KY|YoyOQOLƁȌTM7>llo(P<|46~@\@hhwVt V(@ P pS>(@ P(jD.Qn^p>#$T$<ιGxvNNc(PTo6ӡ ;9ڶ3x^V(@ Pu 0PA P(@шgl٠iiYXr<݌8ժqV4)oh1ZdRUYJWQ;g 91Y PFjv(@ % ]g2&,b3rlތtTU\]߼yUqԭ[]bO(J(@ PXƊ>(@ P0 sVV,(kΞ5(8U(@ P@`غ[O PJ_ETt3`a (@ P\bjwgV6(@ P1(*,+@Ey%`ccV(@ P(@ P@`6+{E P(@ P(@&`$<)(@ P(@ PڦŶy_+ P(`jyk+`L(@ ! ofyANQ?(@ P@.ϭ^(@ P9lx%JZ|`8:5U)aa53e \|}tnL PLQ)(@ @ W}O>>pZ'<)!:uKssusXXZ|nnTC߾pMu g|!!hZ(@3-ohe :(@ P&(VUUTL AlIP qƋ++rb"7mxQXX G/Y*t6 (ݽ:aذ@xҲqGK(@ P(@ P@s d8|$_Eqv٣û^2,|-D9vu=j`z(&\u{_Pi Chh:87}(@ P(@ P((&(VVVd9|FsbD=eOώuvzع+J|akӮEҳI2Tnrb=jl;˓P(@ P(@ P Z0New] C`0VWV"zRYk8y8t8ANo.+k%`pPo6ʍI(@ P@c 0PllQ(@  ISS3!W<#=}p a:LiN^1N^^bb}{]>zTWU'NqGNct>߯BCݽsxz Pڴ6}{9 P(Po =*))c2\ݼ/6|F<=1I!Gv耞SeyyGT) VBin.,5v,:\[LN:4Plk`X(@ @~Il4(@ P0Ξ͆ :^+*vSD*(@ P  P(@ (`)@ Py pyo(@ (`T(@ P 0P4R(@ B(@ P07v_ P(L2'֢(@ Pf'PVQ-lcmav}g)@ Pj`ȧ(@ P(@ PP,@Q1+R(@ P(@ P  P(@ P(@ P(*bE P(`^̫-(@ P@ P(@ .|0(@ P 0PsA P(@(@ PbX(@ G(fo)@ PRJX(@ E3.(@ PP(@Q!Q(@s`hnw(@ P(*sb- P(`vUղVfwv(@ Pv|:(@ P(@ P(@ S"(@ P(@ P(@(@ P(@ P(Xb*V(@ P%MY~(@ P@ERG PLpv(@ (`(@ P 0P4;R(@e 9(@ P0;fwa P(H"&V(@ P'@9{L P0PT:(@ P (Mg)@ P X(@ Es3(@ P0,@ѰkP(@`h(@ P($b P(` (@ PECB(@ E36(@ P0 @(@ P^|0(@ P 0PsA P(@(@ PbX(@ P(@ P`g(@ P(@ PP,@Q1+R(@ P(@ P  P(@ P(@ P(*bE P(`^ +e;8ZW[ P(@:((@ P+ ;:3P#B P(pU" P(@|(@ P 0PTLŊ(@ P8BѼ7{K P 0PT*z(@ P( gw)@ PB X(@ Es/(@ PP&@QkQ(@RuS(@ !@(@ P(@ P(Xb*V(@ P(@ P((@ P(@ P 0PTLŊ(@ P.U8XW[ P(@:((@ P+]`P(@ `(@ P" P(@ S"(@ P0/P4R(@ J(@ P03fv] P(PB(V(@ P&@8K P 0PTZ(@ P+eYY]a P(@((@ P(@ P 0PTLŊ(@ P(@ PE>(@ P(@ PbX(@ @AI찓yu(@ PS" P(@(@ P>|.(@ P((@ PP,@Q1+R(@E-(@ PP*`b^B ul\\ԍI8Ej6n NϢP]~9)(@ PM.@ɉgf]Ҩ(@ PY1_}@>ȧr~U.žꊂ \>ң  IDATyi* +qrT㘆\ P@jxE8uId?z↾=ս~Ǧ]CH< }{tCam2gU}GP|l.?5j zRk{Kdd`a=kt<< (@ P'`b(ʒPQ\  22pzZB;GG{,AuUjv{@~Dٴk>o<cGWvDE͝#N~ yA P e}S7oFnBi?ѓ"4x }Z~ߧLG;DƥU!㤐~xq.m(F >qN J+0eBlQTT7 ƽޤ9@QXVVsAzgϫe_.d ?t={ҲrybQpr}шMCRyڠw/;j_xA P tXUUS1)8p gUaᤉ Q쉵Rpή{{Z4qPS"kV}C@>vscߩSS/7.[zź׬YhTZ>'#9,ڃbFcAz:ά_o}c`l'Η9 Ye5.׿Q~) /4{\,L5R$64;`ȐS+P\ziMK۝sw&a1xS`Q1~*{p5(\wyo/USVV1a_^ 8^ <*+u3ڔWBjj& #߳E]!r}ҥ|,Z 3jUyC\߱^@<(@0@1''cqH***5xN={zxwe9{Uk߈rTS[3AYn:PLڸb!,,޿?Z?E.bty=a%/y,YGÆPquSԁ(Ffڻk^NNFɓ2 6T( PN^^p ;sF+KJw- a(/c01VT?8s k'սsaim9w֟<7zjԁv*=f\glR:4P*8+RLLvy4/')ˣ#**05$Nԝ$ LJ(*-=xՑq+_>y?Fyyn:fM0(FDĢL?埕~vָagDFL+t :85G)yz{➻*ΥKQ.n~ 뫾Օm.TSU{܀WK8e4],]Vu#!K.}xaZ1(2(nŸKoEAI2(wMWC\DYlӳ(wjkgjVkE1pf1rpʔM(uփ:]f6 >^7 j "aBZlb(@ @ce!{1qg&&]wɍXؘ$aQϩS(JSi۶i6.)?={ʦ ņ)b xٳ,-ջnr:vt:*~Oֈ/="պb-Ek/T䥢UM_ _P,]prfCG^6"OE PP$`J 2~ cS0~c p[޼2F%\TRo}%5"6^quGD\ R.\]dP//,Z0CKcU6Pǿ9Ba(F):?P9o:)4f`-[":b/>J|bE^ch߾݊f% PZ@#b9RֵKi66ֵBj@7Wr|j y|](6uX!F j1=[uZEc$5nbگX?B5ŷip֩(vb/Yguݭl; [kφUUW#>>]N>}ꎔ)@ P--`J,/r!CϞ VHθ?PYC×qa\kQN6m NYr (?;o@q!twC?uE1ZRl.bӖڊ;sМ(@ P- ⁢sRRFx#x|{yȍLh$GbDggŦ,VuԁQQ RS!v~Vϔ)zo1XO VV1a\z~E{ʳ@1`gڞM%Xcpϻ?޽{{bׯbYv<.&Sr|qDש7uI.\Cpi1th;7PZ@Qj`ۖ/1ס;d(ijg?z^t碌sEe%NFrF,-zyKg.Xq3qX}hW_o ;1*Ï~jJEq]Nҷ2 ݬF(@ P)`Flh!6Aִ ;v Ð~rMQD@n:;ϴG[7P}-[/7*#dğ rX@`E'<?^zh& GD۾ޔ=mʋЮCOtu~/ ?z,q[kmm% nݠ ` P {׾11w W$Vl> p5InAfE1:QRŧj>w} {uS܎Ŝ|PԾ gfL{k^-CQ.ʢIJXX>oܪU(ͭqmbC!4kʦXZQ6kN#F j=hELV1EZ|kٸPaMY]CbTy!𡇌jԺ9>AYbg(j ->%tbsjZ&񂥞)9'(@ @i4F݋u_6L3J=YYE_oܤEzgombJD@.:;5*+]جgT9"R1ZS.ڻ<lFQh߀3th}rctwvQ/ʡc]'(@ SYm*B 1PL 'gk=] D8uX̙4F}O7†}5=>m4fh`-𛯟؈OȂriuy8w[cQo|3g ]Mnٲ'k766KmpҫfL} (@ Ph>PԼ\9WhESEUUAM97(pAtuȆ^5/F%$0֎ν7,,kN-o }a)@ P-!`ʮ@/zDmR+%[5J%G&;K\WD(@6(6ЁS(@ \#`ʁ"o(@ P@ 0Pl9{^(@ E=l(@ Ph1-F S(@`h(@ P-%@y] P(`U&x< P(@&`<=(@ P(@ PڒEwS잜wtQ83ŰuuM |.]GVVlթ.l"W>vFK=<`߹]K`eg.]NJ(@ P(@ P50PTxDVϔ)pUx2Pt^)>׽'LFN5;!== .uZw۱ma7|3824p&F}i&w DnRܕ͛<6 c"(@ Pr H,KaeeoĎc 8|eG'1ڪet'9%qAècX(@ 4Ep]UYܸ82+_iz1|X_,X0F^|iΞ͆.y^@ {'U $'Xݵ KEHXڜ@Ee쓵-37vϻiߔUT?°TR~ 3vNJܹ1rae P( !ZUQ˖# څҼ^F 9(55"T.b陣T\?7:ur~ԨуK4ĝR(p0lHXy@qAx :) }tj:?̞57P4>-(@Z]X8::ၛCW.(׾u3&_Ua 6=6 jcccS;^zN (I(@ P@c 0Pԣ[85 ݋+h'kߧ==k{ï0{664lmի<((? v3VXCtmbXI/YWDY9q;h_&u^@ػ/iHJ:[[1c{k.d ?t={ҲrybQprkq6(@`xTUUC] J6ib0BCjjQmOԶ)[oFEE thTS(Θ1aaQRRIBqc4(oPԵ)˚vbӦpt8}lMsѯUcΚ;)b9㑣~0yy:=:UV>Y+rr 2 WFIn([ۦ, !CoGm7(@ PL-PDI(D*zuj^OsVnDxਖ਼WߝZ ߘ@ҥ|,Z 3j4WlT3I1BW^ bxEE::9cG `g5[(@ 0@QL":|$AydٳGwcE1zL&TWVֺ@B]H[]nQ~vNK2XWy/JEu;Z=}ah:#?/pN[ѣ1&bj}rSR.@x,bbSu_g,~y|ݟ/u(槤Ey΋QQ(|](}[ IDATϿ0Yio !>}t:n>8y`븊@QVqcP 苂b_W3kW7Ձ];k~ۍk["5qr (@ PM,EӯhW4diiz==k !Um#E]1NsnmmA.k7 ƂG>Ayyfi R]#y{&i?25gfg?v죏ŋ{.s<b2O]W|f9[W7̟& cEsnތ܄ZEQWKSoB #~O PM+[CgJF(] g31)mĚ.\܂b|,{v%m:JEa-?1]G?Œ2{uy!Y/iiYW_IɓS(к*PScw9cuFu$V_:P~/ö W">/:w˯|%?#o2?ۅp%ůz"T1uZL/ {~^4\o^~;˫ҳ{w4NAc@7Bn]U/5V4e}¢=(Em񽣣=|X(@ PX.Fa-#]ذ8S#׾gS(Ur ¿`ï{W+K(փ:]f6 >^H[(@ Yb閭Q18Og%9Eu{q:,D#D}(]}S_#"Pt.yB,== /R~&Qo|dr2oޏZ~ #ח4|H8}VE'+>E?#E>ZRqX(w-_íbGP95fʳXp‡usq ^чѩS{ggw]9V3:ѯ'JvkdXD1\7W?.: *G P(+$P|r:D%k$g"B\KQ(یp}o/|4F+ ŏYXV~YWb瞛8k@'O ""N>4sR@[ba娅:$P|-Xڛl=%ы/9zrJEQ["Xamhf)@ PCEEQq)9>lqC:*Lt<׸qrfЦ,"D;u*UsZz C9uvS|&-@MRnßmn-/^q9`qР^ELzu144Ƭ\Bg] m" <S1rupǰa}mTY(maaoՒ76X½pwQmVZ^ /-X'Q]v1]{ۍ$agf}֝]W ?ۍ'S4ShS1[z P@S@1.-?Qmwmhx06/M~SwϳS F/.b*Jť~CbӕeK (@`uKJpX ŔIT[ܪU(ͅƎE@EO@W ;zyuuO>YCNi@Q{erMC1Jgǧo%QƥgoSd[ G-7/)--IssjW:s'.FEɏ:XZPlƻ{g؝QoB P05S JP^Y%>w9>'{[X[i˵f,+KP_yAV^|ugoxiuEGŰprYWD3P4el(@ Pu 0P徉Ellj].?%I~.{ǤIN]Ҝ+TUv;SP\/Mb ڛ](G8z%?b: s槝ش)l"Vjޏnn./"TǏI- 6T]Qر ^x6ſk_T(FjkG,߳9'Oj56X\UၞSڏW[YV(@ 4)_EWާjxqeQtk!.YN>[rbG7 Ƅ Sbw ;$'4Qz1 5e&^t5$Cs5HݲWGvnWWܯ2d(@ S u[jsu,V9"Q];ǣOZ]ذǧƌ|PzNyVO_lYG`@_ǯ-Μ9}<|jĮџ-{RiY(@3`h7,>1zRNtuuB.(MӠQ}z< (@ Pr *eݜNn/"5;wl$_TT,92]:w `>P( ޘWhf>%glr(@ P(@ Pm 0Pl,{'6Zڪ패0˛NS(@ P(`r MA(@ P(@ P0]{o2 P(@ P(@ E%l(@ P0 )iȲ(@ Pu 0Pl(@ PM&幣3$n2d(@ B oZyANQ?(DEq1l]]aӾX8 h KKhԉSSj8t +[[ee P@k`hw0Dr u@on8[G P@`01%,Fm)S,e֯ƍS|\]Z.(>W{WGqMbyyj ޝ5MM۶ bck4}O(NUEN,[&r \zT|,+Rڂ)~$ť尲c$'TG!}ѷGW5u-[#|efLΝ ++s\]߷4x.V(@ P `PC4ƾgݟH897b ^h̙OګO/MO"l{DD,.\Y(@F`XDkFvBi^:CLn;Bq(**-F_2.uƸt r\?Z{Duсbue%7muعXya P@KZ@4C/EmbQI}Y53@Q{v'N Aǎzw۱ma-פ(@ z\ARrF}pqu{?;,nlx*&LRӧ+Bb@<3숡ؽ; IʕN<Z*TZZGPa./i?wYz充Ȍq!!hy~~ 044v(@ Pohg1`ei5;?(`mt[7޸|)zNS2q <N~=qck=6.>TMwZ0 vPu Ч׮q>}쥟.뺺:b@9FQY(@ ( ]ſ>UmGeeU _nxZs-qpspc5w_>.d̵}(5yR(60.aO(@ Psr~0$ O]1{((8ʲ2yxƁk(nNLֹ^b$@-WR1✃5Fy9Mi.LݰwO4G_֦GN`Di.VS W]ggBf.{uœ&0&PI/Q}]_XPX 3rt7[/] 6(@ P0Zb{IHcG?tsQ(_'? cN\)ݻw;o?T /_ĠAӳ5Zځ88pT v:.CP1z/xod(@ Pe2P/"" KK !uNa56PԾ/GEqq[RR&xdgi/Mz#$$]|bb3~.3iR(CwGSLKۊ@(^ ?7_?_b]G;s\\w=QLaV_G_SS3k+?>>] 1&P>}9[S#ȑ(*.՜B"X {[d P ~lm`M[ bW[Q(w=L}:]۷#EEſ?#pw*(?}DPs}(got9D{'wcfØڿ+(*P+=' 6(Fb @% {~^\oR-Z;KR(~s:p'~9Eyy K4ӄE( ] ن r4unԞ!ߌKF."(=r֢J(`(m-Pb^BIpo<@Ng=o"}8L,ޛ<|ј:uI!}4cym f]i@Q "N®Q)݆ֆ4Ƃu)@ P!@9VnԻ<)+VnVԩa[4u?l#8%yňGxORkiK?.ש.|c?9An B P@U(FȅmH<(? sZRGW6ҝz$P|HK˒Nj5{*ϙ¢=c‡u;{6/B~чѩS{QKnstC>2X]8 1gfA5pi@Q~>}N@/uʹríg P@ 0Pl )b%~;[ᆱ,^}nw׀Zځ3a50f yBy P@M E2?%0C`P\b~A1=-)KD&\mSoFnl(E#GOL7p!j}^~=JKs.\¡ 5(סCпOiJz(@`<(yԪo__gTW,BQQ,>_|V}@y9^(P `b Fxx Dp.vH!^'bK!^ VCTTVԩTnbjZiE9lh %nß;-1C|_@Q}X{G'67 ;qQ/pݮs㑺eTy`elF%K69+eE P) 0PDP|涌տu}]c? [D!brH}JtbCWӨ~w\'(((k-5K}@](@0@Q_,&ii1^zT%B{??xOn Vg`n Ң$Pܳ7_~IW;,+) ϟs)_Z#07fTp+k9*iS5b5(+;OÆE@:wVV(@ @Ej1k+#5ccSEњ^-enԨl@qC?e(ZbCQO3f\}R!ʫ__{e}Bz#- M (ۊ ˳5^@ Pl8䧥 *wVT7R‡ 3Ul Ԓ7}SPr⩽qLeWo~Ny>) yWWU!dsT3 EUY0[|nSoP%5EޘΌX5~ oIu5p}=:]_ׯ-EWMЧKZڑFۼcW^^!V\}jyZmVb/s6 x-u}߳^IIO}ۯ;$jUsĉ#5 8G@9mU5 PT_B[jϢB?s)-{H^9c\# %+B=F;vJ9!*H9L%& X (F]d_u7 -'<wB@ P}pY*AJ+vc ,υ 4O@y~\ - 4K@Y|\ -O 4G@9z\ . 4C@x\ @YQ?;?&φ  ``r:5Vhc+"%99RYR"aaסQ@@@@W PqTbE_.}ァCE|@@@@pEG@%$چ*KJ&Pj    n!@؄a4TVʞ7lRx_i)j4@pU2Zv~! bЛ(6v\ < ;7E@\^@!+M_n9wG7lCEU;^j$*DFo/NTt  n,@ƃˣ!  P!QnKA_߮O#U庝XUU)_.]/{g^eh2xG! *2@p-  :Sf4~DJ^){<[6@Q---Ȧɒ{|5Pbcs&@p;ER@pGOɺ{d4و}zwK @_Fa(Zvxiټ9YHJzt 8C@?VH8×6@@*Q-zlIGQ$44Юk@1()Y@zXX?_oWߩ    @s<*PLؔ(+Vn6{uQbb",?u5#GN-ɲkwyvnS@@@@f xTӳ| /:Č$FX[*P,(,Su_l:0&..JϮ oK@    *q LmK;S o'F 1Iz>Q4^H_+e}2rjFI~l@@& Vsko  mPcE˱{۟i5W_5^F;ab4àAwT@_ ;M%,,XEɨJ@"  \Nyn # )@h1}GՉӦH\lT#x剗1 2tH?-{w]*!  Pt(! !@X8fetgsAFM~Ӧ?O );ysUyyħ];]cc˨QЕ>v"O &@j#B@@ Pl8䧥IڵRQ\,bc(l7}}/aLG   *2@p-Ez  A@\J@ѥ  #PXjН vN@@V Pl!    Ŷ3V@@@@V Pl!    Ŷ3V@hQ*_;/7C@pmECr$##Ǫg>2vl .! pʳ,eR^V)@[. #@ġ޽']~uow-#G0eŊZ}Fۢ  (EGI~;Wѣ\|Z:y@.^>qׯ[w{p?l9ܳ[K@ PtP|z_UW/s,ٶ=U|0=[T0 bT@@ (:zdރ^ҹsUv: Ͽι k^/\V8E҉$M# `@~q>ǮzbPZAsM("~-$=N)={tRkwʱc\}tؘ(kuҥ뤢R=_,:qC򒫮o쓲a9pਜ8/}v!C"ߍffd$ÆFe?n=]}G /@1h@19尼WRXXRBBG\ߗ\1,x̑?sul{0W}yǭW_?8D4 x)PkP>YZԿqhf(:Ug̮ڙs:\_?X>|DTnmTUg]zbUo͚뼾`5rYM'Eu{\F  (@A {Fw򒘘H/Rm]|t̿'gO}#'dɧk,W1kOV۽:??lџكMj(wQa446CQ}QR˟U)((?ͫ5wtpp+;zY/Qr-ה{MZfQ}UTC bKA@peB_*˖zs7P\n ݙGF;1O^WQ7τ4^}T[Wl=EޔB'~x{Fꙋ6P7ToZ}E2-KSEhhP@ PthnO UF1ٲXP4^m- mwƢ%!!Qʟzoiw]!w3|*g%ږ{˨ ;\ NU@N__q&s.}vUw}[Ւ uT3 2yyu￿B~Y˪4^N|h@'*ҭv qB4ْ jhY,EJTw=WY퓨WYͬy+?‚͟[i(\t|oԧ1PT s^. 1WSߣKϢH}VE߭VEQ?b bK @(:q,ņn3thg2oޕ,))Yē?V7ۧ܋@щ/M#  4(މ;v[ Շ*SL{p R\\?V̙3\}/kl?}1WW_|N1Ξ[ 'oNڛ+,*G}WgjOHuaaavL:Y-oVENFBȲ( V˖ohU6UDsc*5EO?m%1꯵;@nrUW1-=Q%ޫ@QrTa =)  x/D T #̑?t g1OBxYzEm3 ,BSQ|z)ҧO7mق~h yvݻU7Z5 "b/_߳3n5\V<L{i @}g,ԩB9u\zۭkG%Ў|얼#M[   ʡCLN{fC*>]$99y_$Aҵk=Yh4Cd9gQvP)))Դ#(֣ (=@@@@\I@ѕF  .$).4t@p!E  +}A@\G@uƂ  .%@RAg@@ Pt#  k (x@@U]e$  b.6 t@pEGt#wǎZ)]:y@@ Pq@@mj vZnv>\O@@@@ڀb$[/bO%&`E[    `-Jmξޓʒ68vt@@@peEWf@x\    Pb+J¦DQ>4Hv9R:uݻ$'GwC}cbAAV%zunen (pJwc+v>! b+˶(O3otm:\eIH|Yuأ =ɁbNN,z?`76Z9@ZA[" + pʳ+ }B@Z_@ #lOVw٣xd  h@T>x>i՗!}eh׷k p+@pEEW ǠLnKD)(,1-(_ƌ$GaVh-ɲm[Q+@.,^Wb"%"[dhQDg˦ItH Iu,B|ck*/]u$?Xj^r ;@@}g,y@@Դh%kf'@.&f KkkQeЩՁ*k/t" + T{튽O  %@$ʪ*ٳ'Z|#(1cK׮{Cb'H>捏;%[ӧ++̿Vƌ%ÆF '-4   '%aS>2 ȑ>1&ONÆYp{IeII>"i߿D\~yOپ#M6oNSy:*=jG   =r IDAT  &| ٷ/S\;?j!D{"1VUIsϕ&멀P!gϮ)}&%99(CV' ׿w2nW2@@@@j (;Wg-nٚ,{͐.to/)o__1CBzCe-]CB[ŬkĮ]nט?՞ɢQ$ccCXp+ip[@pEmPb  @+ (鶦CP!~;Ⱥu@h0]Fg(VZ(js^n<  @S5    x<    @S5    x鱋Eϲxy{K#)1%{wZ*;FС9q@u(=z;&cG{]mnʫsLvRrvR^^)12}ZU/~E3V !Pc  ]A@\H@х$owh}qЩSfBW^'^].P\ ~o$ް}g4R-]z>4G{RYRbwxr^9%NQ@ZG@uܹ+  >B-ؿb@Qc}W˘1(Z˷Dh4JQQ !gMhp(:㝢M@7 @@=a<ù)Q.dT +$gӦZz]cc]p%Ï[el\&q@C+s ϐ[@zW9%nl V>'eMu䄾oHH>dydAcúu$++W|XҎOj I߾%)--իIځu8W:w zʔ)1X6%)鰔UȐrE+.k޳7C\Nxҹsœ{ܛ E‡ u9@NQ @~E͸@E7eXm۞* rt~{͐.uAd/Wס,99yaa2nl7rիo(Ι3MأС Pŋ>qX]{E/ZB>߻XO<Y]Gmz(=f]WXXT*Zf2vlce'KHbbaէ6(~яzV*GIF_[>U&M:'ߒ'E8uj^53רP0TyÆ=}GJ3Y#"K׮̟pw3gO39!K>]#*S{1=mȱc]{wLU64(6P8pTO>w>Uzn|=bAF8?k{cSQ^:>o6V<   -&@bοu[$$$JŬ@3F-,¬#[ʞ@:(yMQ]Z>ض-UKΰ QEU Gwd^jFCN7KKu׮C]=BO>͖s`u T?^bŽCY-F/xeݦr y3wI ?ןӕT>bաn]bs {ﯔYң{ut^h{E3WzEU`0١6'%%*6uJ    Р uvKrJiTHWb"mU(:OLAPb! e҄k5c5CQ̖!ǯ7P\|,[Af,g]z^*{ZPT[/ɓϳ5P4EnYYko_2kUL.kwj=Yz79!W'ˠAlqfhفRپ=MSz9qV{_y*!   @nbX'(4q Th٧Jٵ;]~YKa# KCj3~vٳzB}C~cz-ι=:t\_GF /j м?@Q-wj/u@ )͵.ފލ?Y#)Ys-(Zvѓ:XT{J} TDj=iE@:EƢ̫ϷC|Z:P<_$[Ȗ)zKS+Su#g^ @@ཨ={J||'>2꼁3fՁ =rKPdjcƎaC#(nْ$\?#m9C񩧗\ԁ%x&cGfy 1c"l@1==[mKtt_LMҧ\kuȋ ,EG_-۠g-,mWHbyEݛ!6%TL\\t&L PS@w@@@6aS>2S`qOjr%'KUw)>4Vl9E-ݾ#M6oNSyէ"Bѣظ(}wsS >R}Sb8STI%mCYԮ-Io>zvqȐ!}@ (6ݎ+@@w`n eJ|~}2eQ{੽jI3qK/QGKfMݫsu|ʲe Uv˻~g}@Eb:9(_y:S@ }̿>|[WCbu:Y^'; `-Q(ڴXr$lJ^c&}Ro` @˥d s{jPLFJ7" @  u (z{Wg-nٚ,[oi~w ѣQŜ%T J5 ,"L;pT>eJguS Df rE$4=7n'o;mZa$ӨլV$蓦9PSt?Բgw^`/4(Z7nUȳ ?׳A?/_, Dg*j\m9S!ay(GEu~*}P3KtZN^rsO٫3uk2:EꚂ:C*FQ*45Q[oLȴ, ~.jU,j ٧R>oޕzi|Zxc@ϩ>'P4[׻]ڝ:{t-Uee]1TjX<~ܻ{R;{ߠ=3]v  ew?[Hn   Pm%ozVYՙPU(^&9FDTײҪU%GO?GӧUjHlXGʄ ܹӭ ELj.]:ȥֳM%33GT'),j-7_R,NKuv~wYTɒOטDj믛CC7W_钑qIbU-14]P'}'eN dܳ@;0ƪ{@@@pqi5T(BB5;1,,Du AvN'ԩBL[]Ԫ{:ԩS{ֵZ_e<KptdQK,QU~pVKyOB@@@!@6Ɖ^"Т _RJe=kBޛ!   k (;ZE@TO"@Y)Yy[)  Q@Ny1@@;:  )2<'  `}^F@4ȡKJ'Pt*!   %@Fh4/.R64BfϚ(:@@@@ Pl!=|8W6%%jpួuΛ!;Y<OOkL*X|O@@OmK~#_V    --@"RZZ.۶J|B>]{pϼҥFHhٵW_ZN,{-7]\ׇ~QN/AA2dߗHg"oQÛ(.xOEK>]ZA[" *>^ξ# !c1>Q'fZݵgNr㍓%8ۧJޝkōۥ܇dh9!ׂ @))ԥm@@ (:y슋dIHH݂e̘A2z``/{ʕ;YEus(IId$9m՟>2..Z""9Y@@}@@m (:i>.,$*D9rByon'ˠAZ=P@QqlߞEmzhq2" 3K  @ PtY5,&"&?Y#)YұC?z/muѓ:XTCJc{CcA]@hYŖn  @[ PtH}dA{IL`=˶!,0Uf^};dٲ5EJ+SNRY@p3ui@hNʪ*ٳ'滨忣(1cK׮W6Ȯ[\`vAdC3/j)ϖ.{3dӦ$9rDg΄Nzh@ W!K@@#@cuD$lJ҇Xő#в/.M#ci/ȉ;OuUݼ$d\Jzo'QD2[dL}@Iƍ"Co    --@؂Uۗ)͖E폨I4+7K¦D}^&97Kƍ"^^2|<2Vө64C$'GR>Ls1vugojOѣIllw mAMn    ."yyz▭R^^)Uȳ ?׳a./<^槧GSA`NV@PY){zKhP;eauoa3}t'8GFuz5@@@@3[y F$'{_K~^Su.=o-^^:P*+ӳYkʉ]jݯK!Cjǰ6J  vgv6<@@.E_Y̳cc"eXoZtX\U.4T\rXLu-`ٿC*S8@ m @@ psB@pSXިZb&Β@SabqNTKH߾hv݌  n=<  d&9…/|)EE2lh̞597U@@E x zii>W|}|\wt@Șу$..J;67*  5y'@@@ {Գf4}#.չ7;e/,F5(Z6v*1Q@TysޓNS٣8tHFgQ6T@@0:c" @"Y~ؙf5Q-VW|}?Pd|ucd)gNTVU޽iSyx2qpi>Ȧ>S @@@@K -T3 2ѣIhh]oZ"rf}:9$Ķ[*P|b{Y i@@@@~~6]Xu[|Vm O⢤o6݃J  @ME @@Fށrپ#MjbK~;9}Rz$sfU)_ Oz_t iEa3;ر$gvK@@!E@@E;ށ\g=:|\`nᖛ.{٪IKYRLQKRhU mye%8(Y*LXV_.oV\ + }B@Z_m#*ェr,!Ac$of  B@ZY-hY ÇE8PY){|@ѡ4 &PVi]r@@Vp@qWe %^^L؊o,F@@@hU6(ʦIү_7ܻ^yᥥӧJlLdu+KJئMR-׾u.'m Sc)‚[u9    p@`0ʾq~9yW$ W{UaI1VUsUܳg%P_V}Eѧw7.ZcgK:E@@@@lp@OHRl(gO~}l_ "'_xL8V= {yG w];OulݱC'CSޥҶ3ҥ률__3zEIxP[Ƈ:  @ k:ō@@Z]eŪ*{PF<} f~^ܫW~^SK|k߯]Ƿm6\zt:;Ծ}r觟zN(G~ >.7'=:4=:YCset@<^S=@Sӧd=cglDLX?8dH_itLg\16.JN/GŻ];vݵӛU`һ9فʪ*ٻ7C6mJ2/VS9@&N.5T@@ZJ@  жZ=PkP,T˔G$vI%+WmרCB>@u\S)}&%99&Q@Ѳb{Y i@@(:&@@7h@1aSXYҽ[G˜*(?~?z/3@l߿D\~yz~+;Q]`ϒ7(+]e$9guC'Rb@@@=@@=Z=PT[~IN>lNE3H) sYW}{kbW_IQVʐ;s F8pT6'IR3FFqc圈F  6n3<  PMOfnۖ*NGo'F '$wԾK,㠁&7'Rzw 7\nR']Ƞ뮫-cU^HEIСu=-[:jĸ(=j;t@i @p@Iy)ρ~(SA@AEKQ+۟i|Ue̟%d'Kc٩qXBN:CߠT>п0x2޶v 0h:VRl|~%}tuwg@@@@@ McQZZ.wpQByx|'GOJdB5;QRTEB?Y).w7(xk{O,!DƎ'9kT@@@@@\>P?|fV*t&o ][څHEaqJsΑ+h-ujf 8PMCNI:L%@@@@\DM5G9aQS[';vԺyI lj*?-M֮bQ_6`>ݦ멄 @iEv O@@@!fOo~MfϚ ÆFf$%jt@NйHA@g@@lղ kwȂf9G@)@HMB@GRYQ%>>#“  ."@"A7@@h9@@nHy @@!a@@oLy"@@P @@  K B8 GB@,@d:.D@@@@=oyb@@@@,@d:.D@@@@=oyb@@&*˦TB@ Eg@[S&@@#=byH@@~E͸@EOe@hbи@Ed@hbSԸ@pEc@hbظ@p{Eb@h@~q}O*@@ Pta@@@@ps\i@@@@ Pta@@@@ps\i@hUGn  8P@с4     8St&P"c      `%#vgEK1"    Xx/T\TXk  pFSy@@Ljx( UY  (z # g"~fL?  ,@ϣ# ZK晉&3@@s=wyr@@@RD@V*1D@ El@0 xyG-q/kgIENDB`golang-github-johanneskaufmann-html-to-markdown-2.3.1/.github/images/point_strikethrough.png000066400000000000000000000313541476711565700324510ustar00rootroot00000000000000PNG  IHDRXD{XsRGB IDATx^xTUIJ-tH- MibCT" `Y]E]TTDE.z ;;ܙd&I2|qsywbJM4K-.L3nq6E$@$@$@$@FBBRpoC$@$@$@$1&I~"A"eSA1;SLY"l    CbKHHH\&`),WAє$bNi$@$@$@$@%Œ5- X090."3SuD$@$@$@%<: (&1᭘SPNSf* pKIHHH*sB_Q3kAQy&& E.    9 h%(uB$@$@$@$@$@$@$@$@$`C$pEPd         jE:s 8!g%(2EF$@$@$@$@$@$@$@$@$@ (MD$@$@$@$@VSR~$C$@$@$@$@ԔD)+HHHHHHL݅(v*V"/)JPD~7/Tiִ∷H䫂"F.>H0PhbNͧ A1>>QoڵHFZ3kHFBm@LrqvI9wN$vmܾ G#GJ\P dff##ߒLT̘>*Gz$g.IR~uٳ.g\)HJҤIֵLo=K. VyPڴn(m6ǝ O =Xy˙rAHLT *U$ys)]SH ֫W'5e*euoߎbrWoC(Ѹvde]rruz.VKFztJUaě6#Ϩ֭*bKfu28pl+a!r[ߎriƶmoHCt ,7Aqoqٲy}h_2$;H$@#Ղ"*BZf 1'F:R%+aւ˗Xv,]Q]f%)Z}9P6,X,]A]m`>|FNRrb¤!^"l%~zdҤj] S}pq<Ԁ\7]U]6o9 k6cnJkyngp-C-ݘoY*\Z=*qְ4Z]>hݦ!O|iuϔ{)${8zrR`]}Cs~RC1ZZ/Z樂_A Ƒ+_`@7geYD[ZN?(HD_b:lg8t>5|ܰ[_{ּ_7߹kllnYx]ZwѤ;əu4DT-Ogw}x'.r=@KqV׾U >t44>y?A/~W{ׇ->hёߪkPg@ ((2x >!@ڴy-N7閭6b-V,!\C2mޫ~B#iI)oZ5-?O/Wqn{;lsA6yCTܝ`!Ə> P[1--#WAO@9#(ItmcpWP,ȵ z%>ɧO-[F0׆' ?4M .$+Lb߀~_8z,[Qb5oȥ#Rn [aa)irr[,՚70;-73 jt=T.8&GP oa![^S]ti w}Vkw\;Z%)qW|d5iUW*Qu% ;B[0t>N )nؤImy/k4lX#Wy kmňfͤfk3nSPz_ cmg]^ *϶!7KDvࠜ؋ EF~mˡ6[ XNkp¹KzH^RC\c!uqzTaF5fX*ͥ稐jT^'T8sF r5r; HD jő}rY/V >9'`Y3~$Hw9(͑(()Cm 0[9s~Tao?;FvQPtg ME.(Kl;e붃VhIF&M"%~?]PGf )9PWyZfVuT֯Tx-"ijUNgSg>TswgKA-Wlyt Ϩ1c? e7FzK b0ZP=<:},zA>Jݰ1{u 5=*+}MJN-[*qQ}:E[rDn$bs,ǎnZPWBȱB a-rtUA1? ź<-LL[SU;u1Cρ|=9F^]nln3ҕ95B!N[ļ7?_*̗QPD~Q#]GijgP¿$gvy m 9 .al̗{;{OyZ=zbA g<> @%Ac6m' oȦ&/\.Stybm+$vu*JOPR.L~H?P3d?b#< !yѤVc;Ȼml녈׌ދ^)rEPvk\3Zm5_}R~YN֩*/ @%A[c( xz5AH.ƞS4GR$)–w,guYY'E kyqbcqHed'T4ۄRVh3PdFAR*ܺOOTTZ)u:jjś&a[-ZcnsT]4+{d_VX`wyܘ{>l*bd49kb˖N6e߾* 5qa:mIO}uq۫W;6|%Pu{Uc|^fE\o/\Q;%~dZa ]Pt`߂z\F pj jmu-z %A[cH ܟ^FW;<ɗxL;1]C|+DE亝Z毗J҅xѪz]/Q=;22i+RҪI(;C_%B9+ANjM=ASNOJ/h{"\}(ndgyf  AQDž(vB@IDAT)1tҕ*I﷢O,C! 7#DO7|uh%m4qLPDBdl!@ D \ ͛[3S%ђCӾR]삇 ucsTaUNvd&'˱K%&6>)]Y A~GΪW: 4Q96rV̫^pw} m4cH46X}zρUAx; !1]󈅗C?&\+ %x9[>ieAUAEJ<6OϵNh B_j*bJdQ3_ 1'“cuQ?''#GT*TW!2BtAF %t)Ƣbz_*ml|HH*AшE3p !hwqjY_dl2I#ԞߴINN6m>)YZer' nDVЪTœ zyr]7{p-nЦm}L 8l4C,X4ۅe箣[1 z" 펠8q\Uhø6γzbl(0 C@{>=R&/ӯ=JENcƨu5kTHd} Rμ' [^C8|-3_ j Yl;2YYYm: rmJAgF^'(|}?f _ qCjYCtGPLMӾZZi]xrd6~W $'ƪ"0(9aMb2~pItmyW>cܡ~ю\Fӣ<a|bbR Z}D~rku' g> oZAQlj//x@\РJAQDY/_BHg`XD @1ZUrvae" a6l`) DXd{7kɭc_Ͽvky\ZE9kQ1Ӳ-һwU>8A5_L~q4O,a<^7SB)G/*UB˖w BO,_.ŅO * 3Mp+掠ZaQ< /:x*@)S{ |S َ'7(b2&ݜ>`x~fҡBϕk6[;w.^fI0iQRl2O5"/z#cq\7zV̗ETkҧ*})CÉoR")̘3/<6b@h d_JKE MGR(F^Z Mcyz5YrC< #(bl?QNmߧr^?:4gBUէckŞ%I습=EWcUWqq2w-] 9.]A,m"Fn ݽj߱C/O^y:ˍqma羴W (n^P4\*Ȓ+((:xY@FbI`oU<O$l9]L=hC~B{B‡-H : ^| ҥ ǪY>xN3i>9{~=x<* 0L/Ҁ AZhGi@Rmi/[*04Ti- +W.'eݨ玠n“s, "W ֝5lQ uW(lC_^?VmlSӓu){r| haaBYuK5n!iԨ˹2.{DވHZȑR=k7xg<%(_ge#U$[3 yjmEI$#)Iȃ!&rlp#(~|a?f̹}_jZU^D_"%sWPDAѿSB+j^x]}IgIHDY8ȯR1&?6AUڗLǍ>Ϛ9FEa`o?~5 cF}\pPx-{Q^AhDh{_&Kj4 #]?6 Ӧܦ O>%(Nsʹs=ݰAA r&xTZM>m⎈(&Mj<1Uռl 'ٟ Ruh-ncޜ~AxhpiNʐ+jZ=a 3f,-[=sVFqw ]fqq /딈tȏ`kSV>*XPD*oaAW5~٩{: ww$c2@Nkn#ӈuHo̮au4DT͙wkȬY߫=&r|Q{W>&J{w"B7Q98nuAўPi^#O)B3O7@H}ђZ . 'N]Td+V, |^SYieJe ,;DPa(T pJo2O\+R+*w/^^=j{N.ϫ*T$8"«ֆq;6bԐ!*Ch^]y}HJ6o쉙(\+S& 6ғS)Sl]{?O CӱgUӑHG,I$@$@+A`> 2VRY:e5w׆H$@$`K a    l OY +p޾wE_eŢΧ 3 @X@`, #dr($@$@$@$A>-([DU FQQ¦HH8i߯%Jo!@AjHHH?p$@$@$@$Pt⒲ˇHSL$@$@$@G {D$@$@$@$@$@$@$@$@^KN ;F$@$@$@$@$@$@$@$@G {D$@$@$@$@$@$@$@$@^KN ;F$@$@$@$@$@$@$@$@G {D$@$@$@^ArVlxń$@$@$@$%((zD$@$@$@$m.$hbp 67 % EI&   /&@Aы']#   "$@A$@$@$@$((zo$@$@$@$Pt(({>HHHEvHHH"C wޑ @QXT\   rYf@#   (L 6E$@$@$@$@$@$@$@$@>NO O$@$@$@$@$@$@$@$@IbaHHHHHHHHH PP dIHHHeh9C]   E}qg   (\   A}pe   (  2A$@$@$@GgYh$@$@$@$@$ȵ@$@$@$@$`)-),l!    + HHHH )fSV: E    LfSz y @"E+YhIHHHr%`JM42a\)$@$@$@$@$@$@$@$@$@~ESf2i C怐2DYE$@$@$@$@$@$@$@$@$@9 zMP1 [ y֍\&$@$@$@$@W \HТW* @ 'Pg #(t1epD> E    0 P_V) !   Lb |HHHJ[<u(ūP  \Ks$@$@$@$ W #nbV9$IHHHJ %h9T    g-_=?^njIENDB`golang-github-johanneskaufmann-html-to-markdown-2.3.1/.github/images/point_table.png000066400000000000000000005731231476711565700306430ustar00rootroot00000000000000PNG  IHDR@{IjsRGB IDATx^ toAB IwUQ*TJuCuEڪOV\"nkb}pJd#ȾϽq&LL29ix|ruDZ"bTy]uS@@SVW){" 􊀗}E|EۮZ @ - b4U!@@L  +^b Qh'WWs/\  ho(R  YG~:i?U>[Y8B@u^'B@@oPAmPCx4  S@J  j:Z=yYzgX  8MiT  C`VWS5&     Џjn9~ܧ4@@@@N X    H^^5"Fz=^@@]Z F4o/wm"B@^b &WS@x%@@pR?$   @k^Mx @@w u}  0WcmSy@@@ݽh  0ū(Ҷ   u0# R1O  @]F̓@@D@  m 4@@`Gv;/    gzF?    xGv;/    gzF?  46m!  Wt-o e(@@` خ@@ u~U  @ ={! n*@C@@*@:@;B@U]{v! St`+o v C@V^ @p_zn\h6!  ӕ    *@ʘ@@@@@+@:`C@@@@P  K gP0@@C@=ym@@8y.  5  g}Fσ@@ n@@ ;{ x': hh@@@tCS8xPOJ.9gS^dw=D@YR^V) $&f@a{7ʶmY- LV&@M@@\)ܴItmv%:,c/X]@@"P)y _QvΓ/#.?{w=JK=MV&@M@L?rDBG1\}Zʷo1JUN׻ @@^ :Hj=#F% \`o) #:dwPˆZZdzP!  {\&FQ  SN(! \|@N7`B)%ЯQy[[CsxK){kF-X >WWj6VVJK}>(p0 ;Vme:曥|6.,F ɓ%$:֝Gv풚B=W"#e4zCU%)9F  T7nI?4%=D8#! о*%55Gv/MM-#^&}˾MXLG0S@K^(^') @ WYgɰɓ;ב E%Qg)æL1GߒVɬYI2$6Z I.W4o+f׮y 7 46b,s>-nCJ@pP-ںٱ#ORS I2mX @kj$kz]:0I4]ߧIٷv6:ᄈϲtK:إ wm)+4$HfN[ <p  0@Ov.@gl |^ @`@ Ej)|\/n;tF̙I2>%V||m:FGK%vCntxuSMTWGإKeШQV0'o站{{N/?&[..kJff{{RcedaW]B@R< gEFTu:sacJEYzA)SsjMuisHq]=# n%@Vic@y@إ X ѮUAhѣzyyȑz6hÇNBbb{˵64PA$0"B|^?! { WtP3Zi)  xt@@pͻDPC@@ݩ7h    @ @h t,@@@p@Kk^>^.}cǓRP@w uޡm  . %h16\@^a@@"pB+%jd1dV`0޽b4L2[u 7y@O ]@@@@0Pp^@kV݄PnJ*JIH%11ݲjT}}lۖ%>>޲`$W=mpۮa t*@A@pG$k>pf@L7l#G$ths%ݨ[@@ ?}OJF+-E@cn7ߔ ŋQ  +@VZ h^2@0gR@@Q %;X,>C[y[6?~_Z@|mWbhi'JСR%UyyTU%˰)S$<)IrȡC2kV rF@h襶6JK@ k ٱs45F.?JFZ?<\"M',1Q|: @K%))ڒQhAٸk9 vD=;Y O>  @@ @;>`q+ }(ѣe{jܕ'--mK5lX̞$'K@_]ӝ=@M3@U'˨βR 1VT|Dreテ䛮zVq݇CG# St`lV +q|ٺ5S+ͽ+ӧ%Y*I p fqji~qQjV)cevD@@=ZՈ-T)+: CCEN5jF=?۳߫uTWcΥ  TG}<3>~̛" Qvwz%$HܢE'[k™2{Vr&@@/!HjOc7gLoX~s:)vW GP5R9s8zFΘ!͛gL%=HU/Z4KfLr>n@@JYg5YV^P~r`uqٳ[UdO]CP*@p{ @kdǎ-AlO!B@X;Zc:0x(  xtj&ٵ+OjM sMwx}-)CeUW՝;vG֪ΉddYB@Yԝ{ǺmgR@: =Ŧl۞%2 D6zś7˱ y̹Jظq87U!O!!2gN>= 1  V.C;1d)B@AԡC$99ƦDcU^>>$+$ <{Ҳcb4:>8  @' @@ vҭ[Lh4גla` 2O6@@g r:@pky  )C@AP(  33^=Iw:釋j@#>  p |yA+3vi) @@ G#%f@DM:f  "@zVZ @@@ {zB+%jd1ĥ60({(2eXwkp99D@W@{J@@p  @ V68!u$= 8/f-~#%@' yffHyY$$nFW5QmoY`alm0@: RgR%2{~))ʜ9)]֯Qؑ#YYd|J\V/#5)3'V֓3؅ %<)ɩϢr@蹀NCjfyO͝w/??v;IRV^) 1XF%?m \56z>@,@|<߰Aѣe%t @uRQqBmp˓7vN7[ƍ[رjsY@.t^ϑ՞^ϯegKrRueeMPGz B;ԴlYKdq6^nϑEr@rpJ@ u}Mi_ۭuVzq/XO"CڴUu_멗+ |)E2xpyvMvyァrھAj@pW\w(W*T!R+nRqxu|q2.)ZBCe{j}\WJR;si@l@|T{'a jvZtՕ…3ld++۟ӟ>q,[v+߮ @j䩿~y٥djCMm{P@F\w"F z//롮ʿײh, faٳe-ω+F7 @@@@x0;Pse3tk7ocko jmԂh`ۥPkj$(2R"&M\=@sȡC2kVupzMKe޼ ܪr?vl!la\.,wuTεd5]*XZ߶WN7O?stYmZejfalXv%.qQ Xо-RW'o/ܭW{{YzѢr?VMEA@Jݡ6ߞ^t &g%InK^2׭AZ=ғƟϗCj;25=}>+jd:a|r_cbNfZvNTwvuPAͲo;sD9S;m#{~TFT@.UkIӉߖ/uOzz?ӥd֬d1+B @ԕCtp8;=\Z!noB&L-v2RדQ"#z[22[xvgW?"uD B[[fJYy)jiz @ @+?%^qXVZ @MZZ[ U4vȩÂy>9]]?yzOu_<׿|w @{PۼK~*A'gζ/$*jis=Ch kMӆʼyEB@`xrߡzk8;í-wu/ݩW455CugO.|yy'Ef:"u*u" |P'yT)HBBx9p荽hmRfmټՁޓNP˛2$?閯g.p̞٢O<#׹N @{P-wtg{~v$z˂e9XoceѶg&(yKDϚLl?+U# 2ƶ~/ \;Tou߮~YHRRܿJsMDō?Ƿt5T$u̱6S/ ;sXw*Rfg>ݞga{y{VTm%nlj􃒖#߷࣮͒Y3^Dj_-5A3UV^t$ r?6ݎ_߱Dw}⽽ >Uș3~YȞ I.W4of %{e@@{ \;T.gur-Μ$g?܀O^ή^ l =^4j0y׈[K3Fo:@@}f:qdSwȓl23dԱi @KJ*IjS?ꂂg*Ke{Z[ݟ-s礈:MtpSRWiջ흖*'7j)q{PUY3m6MFo;t5J/vڕO5tèԖ /ٷ( v 83rPvZ.[)~,X0ɦHyyۗEuvqذB@n vԉjYsvvq/*k!s-K:>T=rtoImv-T!Z :eLz>|xM8WSS/m<_; @-aff]-7D"۷Uz?È]+& OL /zÇƶM-Pjff{{RcedQK@@ w:3<(:zM3虝&w]ncǪ߮Wt𐞼]:klp ! @@M׽l?ZS{/v _jKJ$pPwU>2hZ@Mb.(/mؙ'[:'NӳccQ,qJ$eU۬%ֳ"-r$5>'!+=Nk_.]*F^SBg>[^`*u@,ǟxWOΠ $sf'˴ ow;) @ih4$гߡ3VxR;Mi/XlI: IZ:륪FG(<@ }SkTo۞%2 :NȜ9)LE-9R3; .S0QZ9 /%\0Sfª@О3Ã>\rv,wqPdĜwFDۤ\)ܴIouV2bZoa~ɜ),Y{( @Sw({NjP5!/Oer16MڹsVCG#":^cZr܇ @ ~:t`~$'شJr~h>t(q ?n NQck^ Feno;KO=57l\>Tgj4?xlxN瞵=ɾ3\&)*>"#"~pOMtW_=Z.ȪW^j9JNu &sV֭mez2Wcc%.u@/y_"?FWUΑBhQ@ u%j |֭RWVfM ',[&#<K-6LT@j)|nYmヿ$$D[<7X߻Er)UzNMk=ޑRoY~:ltR'&d=hpI\n}**+b?O//=sT-W=;F# <1/C:JH%4y Tz.ZQ+tYQ@ u~V REG z#77|!*UIcZ 5EE:h3u@@Z:Ws@@=} W{>T~Q]:Omʅ #@>}UK@@1|@ u~U=k;a=(ȟY=v@z[@?\)Au @ @{@ оP  n+@Jdl- C@SP  \'@%@:A@ )/2bĐֿo7wo"SW]{L*78X_}o3%==_9eX3',/#rHȨa2mz.;/HeeFʌ鉽qjeq,[v+!U3=׿|^ܶOk9_,,Z4KC),^V߿^6{v^#uR*D@%.a!*4.bY ]xf1p}[U`Z}f4|v), I*7f%rP̚$a;^R4URӲe(y9$b_f\~b123~k*0Ogx{LbNj"uh\4j pr)ݻ\|aS#Ε}?X?JrR$%LjiCrF@ zTQ+cuDڧ:쌊П]T͌?KssvwMʎu-SO~b@{ǽ hٱs45ÀXB&}롺-#̥Zd;H6w@oeɦOecܹ)k vքƶ}n]u_XOoY ] N׬.+$9;3lu ϟ.掷*vx`vu .˗[ػWJրpiҟ[<˷T=Y ]# _ZZ~9eIB.=@ۛoKF!}kEz4r9nj>M~ZqƆ#m, 8.@Yh5$#@m˒VL:},]2_V)j&JFZ?<\"M',1Q|̟|k;Is12$9YZfT-CqRm bթj!{ Ykx@ϴ)-7_i"[|%]u ea{ٚתRKեRN;jXޓt`9k}r+o__9m<]Νekٗqѣicۻ@@g ,'V}-w9 ;w W߻w)Umu"MRQTmvuYzѢr?בּpC@ u{AASskad$<)ÿۻhK}d[Nd{̥s"?_sT}>+jd:a|pe0&fMˎO'}]`|U=㌉r Pիf9㩝͑=@ ?Trrt}\#* Uh^'-Po_45-W.N f%˰jWP@pVe)*[G6)h#_+6Ԯh9)]vUlQYcvP@ uˡ*ں5S~8Sݬ@O>n2n)HBBx9p荽hmR9l{&Kڟt{ͳB]8SfJl'xGCbyO}}e|J\vj6۠R\%Z6`Q?xNHg'ʨsαRrxCYj`4JQ,[e) @?8VӶ"fhH[+8+lКz?F?>%V]~]=no*K]idLWsmdgGjۮ]y:\R[&wd߮ n"@~7zr_%Y*/~^.?thvx]Əho(R  uy}CP~P{ܦ5_jKJ$pPwU2hZ@Mb.(/mؙ'[:'NӳccQ,d`Wlv^jd|Yȏ?I >߻Ybt#kH>:n|{e$c.AFux)\V -/u0:J]O+u9eCn0@]= IDATG5 j3z9wRRܿ{P ?h>]!?>s"u2@@@{ȶY/Ãn7ocΘsϕq׷gd['-uuz+Գv> @UdHx̙OzzϤ~QԒ#5Sl2!? ]-nku8/~{ ujgɫ}onB8=~wqPdĜwFDی\)ܴIouV2bZoM~ɜ)m=KADA@h*3MDz#_߱ȏ~ttt?t9 .VL'ְ(-=&7]W^LN---rFRgù 矻]$jT~9ҶO]wf\: hw@ [tu2INiMcU0M/K]~ݖA /$DֶVeСL5rm\r\iմiC]h b;,9S_f߲xS={yrM?67j鮾'J! T  &n4@c5Ux+  }(@K_|G*+k$66RfLOZ@@@@z"@U{D=__˯8[blj++w՟\w  O @@@@Ldžw"<8Xci5֕J{%\)d@@@@@P'y'\v<NF@~%jW  S`B)%g?[ٹ+O{_\}smC7(\Qd 6ϩ.,l 3ϔb"AQQrܹ"c$'EKRrx{LGZ gp g3o EOٱs45\/)Wu|w+#ϗ/)$ #%--+3YdHxHϦ  jPW<@@<>m5$#@m˒Vacd|Cٚ{\|6TTZ#Gb^i9?,LBblN2fu+*0mֳK6~-2Y=?z03'EƏoo= t A@.y٥dꔱvE@@@   S R;( 6gA@@N'     W}%s@@@@@N'     W}%s@@`Px^@#>  p < h7o GH2KQ  +@}ϛ# }!@ 7ߔ ŋQ  +@}ϛ# }!@ unq   (C@@h F.bY ]xf1ꯏ8 fx,@ZK>\ --2tD :T**/O`6e'%I9t\fJA < @pKy  CXeȎE|}}+t5kD.N²e+FAF̞-R_oSUd[jl;2wn$NJWϦ  ~ _@ Q ۶eI tYd23S*imlp6ꞰD 0//C|DjKJDEGdƯd@ed:$9ڏ    <6=zlO͑򤥥mi ٳdx k#i0bduYVu7VVJ!ϊHZZwPԒ|52B 0>N||]6Px    Q=ukWWOKԳ,UՓT:Kjim3T⒣;ԬЩSʂ3O"    x-AlO!B@X;# &d׮<}6MWpP{6CKmI*㮺ʮ!cocg|o8!NfNؘHE!@@@ݹwh  0@OӢ#m{(GWzr,#Cs6nxv:: @UdHx̙Ozx#7B@ خ@@> ]:t0LclJ4VUI[}OO\Bm7--;&FѡCdP@@ͭF}W7k6@@ ʪZ_uԕ~WW²e C| xtzgIeV[`4Z+#"$i\sZPؑ#YYd|J\_|G*+k$66RfLOtV˦?'vB OJr~n@@` ~k  +mڿa9"G˘K.vk{3mozӶ$%]wT Ff>ٸq;Vm,] ^:ȍ[_q$'^WV&yᆱ?O$uw(   hzzmo) #w~g*LJ5^2 D4)^rsUpz/JMM{2Η]$˝w,mTm{{+Whh @MǍ    @@{L =rŏ fZ!uRRrT~mZYY-cdٲ^vUZUU#O.'Sm @;@Lx޳o HE=F- .bY ]xf1ꯏ8xj,@όo.5\S#A1iTD*Y$tH;VjסqqdrШQ2tG>,GwrׇM;W=.k*Iђ#}S@\-!Hy  g Qٱs45NCCz4G@`@n%@@~#@®j5$#@m˒VOtYd23SLNu~66xDNfuOXb?+c9=x-OK3衂rٸkؓSTٳe @ϟ(3gl~xs@vܯw/?{_uuqI dB@=܊'<8UQkkZ>K[k+jYV@F!@Ȁ$H {?߉roֽ&s^ Ar w4uְFr*̈́US+]EPSˠ3f=Y-E/d~+f46l0Vȶ{ڏ)ӧ'q7@pki @tP)fp65QƏ,IgŋMЩK]v{4znZ*IjNٺ-Kt9DofofsZ3Ͼh̛w8Zlz"oeG2wکce9Rat FxU9z6՟WU-{$%uY&S$4 k@]Mk  v֪UiRڔ.y41̲Qq6-NO/0KjmR_SjjWW_of14ÂN?$srm$?ZZZa?W;wR( C䫯7J :6sv$M{mEzLZAdѢ3) 2<  3@p,55e/Զ4ʶ|L!I]SlͲnz%g    v[P^Q%gJJJAC\8aᅲC7n9g?kqˬ>6g~{ ȳ>11FfLOaCu~bٷGthq23qgPٖ'40q > +K-//h~V}۸1[èt˄;PTB@@@# 0fvɚ;d6k9}eY>jxŋuf֢Yڮ!Mѷb~!I߈P>=ٜ`?slйsOsΞ("fy^^R7-@:X[WWo6M\xT):ri0ko7/8_un[-2EEIJ`vdNY|9~DѴ̾,/O|Hc_lPAƌӒ%&&ѣ= FS{P   @ uaCHRRlTHƏ3-_zF"- t/PP676/8, :Ia7npWiWOʒmW]?T˓ۻ5/.ܼ"!w,#m7]gP=~/,53oӶzQRbG@iĝD$&: z^?<   Vn5-;k,*Ceإwo;3-/ݾ$&/R^Km^ׯ_|̳̅1U_}$%ƶ@2y||'4sԙQ ' zh  @ vۃo!UIhl mWt&&ƈN-+٢q}g6ѠsfeAaYb>\j9D~?s:sᒷ\'XgnvkKZ@œuu@ @zh/X @pSP7K=s )ŲoA : tm/'fgo-{5ҿ_.2y{_~Lp. -@ہ  JPWjVCCHzF̹S#믥o >ѧ.>v564HڵR#ee%Ǎ;[s>ٻPNMp]Zg)d7_:Sgu:*64w_!';WfkmղacocIl޽IKmyNjoP!CH1cZ4QܴI* 65p 3|Jc$1)V@.PV` 4л? G@ 4JK%%%Co%55u0_g 3%9).l пV5lZ=UiUS+Sed92Z:p荳h5Rbfwx+i._:+ ȴIvhC*?1A?<@Sjۆ_C7ɨw.ˣo`QK.p;n})eAcegݻX2^|^jQ2wݟuOVvX =@S{ E@@ v`چwb,)GItt[u6,-yZٲ%KRS3@>Zf_4UNIl7z6kP֮M7]%Kgj5ֿgq|⽳j2j[jkeۿe>r&ݿ)[fYKY=h/@pCP7 b.*Y>SRRezp #̲ᅲC7n9g?kqˬ>6g~{ ȳ>11FfLOaCu~bٷE^} \R5M=?:9N]uS#l7&N6de)O @o7fv sn}J  @@ OF]w] ڢO?]"O>ZZ?m~C,x=ǎ7bQ(-+z,OLzȒ%ߘ_xT=3.zz9a}h@Ypyԩ))^3?1w 浖pYCg mLTi @}VՃOKFt @ AEW@@^ @ڍ[$km۳<&fIQj/ 3sԵךYfiklP a}NF5d sΞ("fy^^R7-@:)~YSӟ^su0g@^yKs ΗCW$s%{)9˖KMd4B|T6mhh1ed7@p@eM)AZyZC@CJv_~YjJKg'm%%ƊpDA@@@:Ю;U:Po>r< 8Ю#v[. H9Q++۞hQM0 dvu @3KOSwԧks_} ;Zrh^4`$̷?]vl23GugNh    оh/}C4.. Oc[ٹ3O0{篯\4GG@@@@ >{Z"=\'7wfoS  ʦ*}}F  WG?YEE AA7GpGNwQO  @ c˓! n)@B@@^+@kC@S=Dž^! U,υ  B@zh/X @pWPw NNo,e%'%t]   jCz@@NXy?N>Sc[ܵ@2y|| -s @@@@hOޏ%o'ҧO{VX/kKZ@:en    ]pe3e#@Л[#    f(9's8]Ϗ 3%0Ox{˪t^)ٹ\_[^.eadoȐ!o̘HIzIiIY^yinxy{KHt 1CBCWIRb$&Ŋiuu@@!>m@@vT4@RUU#쑔ԝg)N8RNMǮ7D@ u!C  @TUҤ:l|<)A4uXMz_^)A]FqDLLG$5ulܔi[AdѢ[)  @wv:m" +qeL2rdxu ]6G6\<t3@~x;lyFܵOV!{ ׎6p#\ t@XTE@8a@5ԙS&Nc!IK?^c9'''u6Z!I]SlͲ.=Хj@@ 74]:  x\'_)))RZVi5'XLNFHhhP"kG'ɼpDPsw8ՎVҾmܘiϣG+ׅɴiIfppKn    c7, OOϵ(2%>ͦ&e.77hwQ[7LZW_/ii9fϜvLNӓ$>~S}    EP VV՘Θԃ*^Rs~jJJ$LsJȐ!HcHEe!2}ZL0R;wQ@8N]Q82@@:"@L+7H֬!۶g8,(ko抛/qqQN[766EL(=\  @p3:^OKHFE@@JmB@ m=keW$"䎅t#)ζ^c~gP=:!GIQ@@w uѡo  @ urL ˳}bjϿL6v4ʁT9eX/0@<؅ ;@@ uaS  @ urhXܙ'zZu*! 4 @@pz0Ooj^~Lp'   @k   uR R'٨ 8TZo>ִ:@@ J]    *@ڭ4    ])@ڕ@@@@U[i@y#  b|=zT##%[;kԖG = '@@ 6KqqEI 2;^|}%sÎ^ڲ24,L,pTD@QG>! W̳1#73%)1(VH;ϓoYBB:}7=yTʒJ'  zPכ"  6]w+}˽mu+%ww:R.#Ϥd. "@-4 x@ @KJ~`fʄGz+΃# ۈ@@w Qs$=#O\qJղacoȰG IDATc'+%;wuoβ\x 7d7f];5%%rx)˓2ilh}%h0y mgF$&ʡ-[P|CB$,.NN&^>>>OGgV<(Gm+jvv'{ԩ{/@W\\  K%%%Co%55u#y6GJkӲϛ$3gr9i÷@C̈́d3ϴy.LBcbXPiE]v?[ O-7Hz 5U ֬illWpyUֶV!>_g 3%9).0vE@@@@X-پ=[֬!w0;6Ir*խ:tHtO-EErhVA3f؅;8,ѾII8`,5tシe…v3:-iKN"KqFݳ|gpzm>hIF|Mgjzt^9m\g۴'ByRZVim[&OJiӒ_Ս-5@@@@^(VGdmJY^W״4JKddL( 6AgѷD˟vXu΄v z|{79Z6:{ql?ҬKEk}-j @u9矗34L k)k׊O}ܼ"IM)[e;K 3:^||ݫ:@@@@z[UҤ+&&و:SV&_},WJpP@u4mf[~Z%jd4s%1nwSۊ99sX3KV]}y[;h ՃN?$ӧ֙  յMwlvd@@*@Çӓehrźl/m ;4h!baJR*x6/KgX?+lQ˓O"]Zq&-Z^3k]?+ڭ{hwuY]8EMMr *! m p <  +.نɣ$:-x{Hxǧw$3^{Mjk}҃,-7Ny% 1Bgn<[zʜ&1j]pq_|!zo_}O4f:y{_RDaXroȔ7vLL$qQ  p<ǣ5  +ɚ;dl=B5֯+6|y|p˾.Zd 2bo}_Rg 7_XݲOZ @CeܹpGeo=E}dOڞ/1 Ϭ>l//13JǏSl:um( W_mpyoDLlNz;w@@JL@oS @@p=k}/.ܼ"!w,+`#-};Ж- z2)ZE,eeT?C+:Sgy6/$^kW^Ԥ!JCu9ҎӇءæ:     t@ @;is_}$% F5|]eAHv_B6m.L~^ٗb9^:|X~Ic;ah??L^|Y=Cfe Uc=L@@@@pg[ٹ3O{g 9+ aCueзYvUEW:$EEfP]'    zl#=f+)  /PQݴhp{hC@@ T+*(  /)?F@M=:M  "@)#s" !@@/@@ A@@ ua  zX  ;(@@@=hyT@@ @`  I5?)4<+  ]%O     ]NL     ]%O     ]NL  M{(o  @ v1-  p <  +@]M[  BK  JPWj  (  K@]Mc  @@p+i @@  . u)7! 5_/0@@r.'@@@@.]@@@@r.'@@@@.]@@CJ͓Gx  JPWj    Tԥ4  pihd3@y@@^i@@F@@Ԧ-@@  Tԥ4  P@@W R@@(x{  @ v91     @w v<"    @ v91     @w v<" *!H:<6  MO  z  @v;" +@Cσ# "@-4 x=O thw&  <<:  ݀N  ' z  @]oN  G z  @]NN  g z  @]-N{  z # . u18! .@oϏ VԵ޴ xǿ  . u)7!   Rԕڴ    . u)7!    +@]M[     RPr  @cc  th  :  Rԕڴ     u6m!   Tԥ4  P@@W R@@;  RPr  z/ @@\ˉi@@@@Ki@@@@\ˉi@@@@Ki@PP@@.1@@M Eqo  @ v1-  :  Rԕڴ     u6m!   Tԥ4  P@@W R@@!  ]oL      MO     ]oL      MO  54GT@@.Ħ)@@N-@@p+i @@w@@.1@@f  Rԕڴ  P@@ :PS#GLD'-+#-=|@@"3@vdKaA9DbcvuuRXX,ƆFUnSYY-ko9q=V.յ2yr)Ev' %@IHiu?$9 ߣmpO urJveLqwUbO?mQKÝ@@"PR^o%"-O6nʔ/.:Sa.II?_ :ގnn]<󯏥ήkJ]+a{Uc-[e[nșfӊ+BӟߔV`ڴ$˻u|>,E,F nKOo/~&M;LFiНО_zM7! W\vN= h7D@:O7g>2HO}DF;ˣo{e1K֧B]fl`HRbIFF|׼|&),8l>ޞ-LZsgMV{Z]69zB""Ben%_6SQve[$~EqSkMAaYrٓ/ظ2zP9̓[lu!2}Z,_En͒E%%gO7oAQ<jͶrϥ`ݽ'_4;S|4հU嗟"U.C֯%UfOM{P {zޞE -޿Y&{P_;rAFYL=`X}mFEII@JJJ߰KjjD7aCMnYwbey4u5f֪w[!۶k7Fuvz'>6ano~y6@pЎ_ \4JWZg5tܡG5:OO`a۽$S&Y~NkXo̬#[esveߙ:z֦Mkt44sũfoZZ|'Y' 6|\U6xr1CM0i)bٽ١ZC'Rg6ֿ3 DK{>ϻ̳Tg@S{[)ach)I2~p ku,:rRuI?z-%xѺ۴T6եRtw=] #{>GfemV@5[*M ~֥ܓ&&I Nǩ#h{Yb'u3ϔݦԶhkIMIRo}|#mkGۊEHjN/u Of-: thkfDOi^?!R IDATz7ٕ~:;ɩܵkYvuLgGv&( mЗ_,QTs-?wOs:s/x٥VYڳh- @uoo)Tж, +uvp{řT_АO{B*YЮ|} (eJffN% w4-߷,>|Xkk[Ktw[ @G]{h~wɡ-[ % @=uIgOZ@Xr646J}zٓմg>  @g v,]x?[qY,u@;-v~]wudfo]L9s,S:$./HuaLO}aX @uLi/==W&Nly3v:6qٖ3Y[l?iq+{m]vv~opT98e(nye[Б4 խ˜E[No+s-Q=;/c"jiǙTS֮Ys{y~mv!I]SlͲn+kzbL  G*: n%w;`"K=<*ؼvߛՕ%D}2_xN=䒷7;qrgڞǶ 0_=%D苳lRhڀ3neFL{|IO1czMʙg}q&E 5n^~qRTT bЩ_L]X q EZ^Q%gMKmN?M('0W @kdKMIǦi)RS`jӶnj:AH֭kqm @t~GK̬c'9ƍ&D:04Nz9˖.wV:b\ 2Įd…\:tOb9Gj^0' /ܩ^r̾9INӓ&@@-|"P:c,\x)q tej{@֭ΖN=a/7l%O}SE?hWՃ]5Ӣu~G hGw |vN<悋.&Zk*/^:[f%(xd*W"UPK*j,F Cmg1_bw辞ɨks ׮1*>ֺ:Css9\7)Ib;Ϯm>+ 55̽RgՓ}|w'iI2qH%1@@-}d͚yO=] -4ՕDwO?d˚yȜ995H'jإW{'[:b!0SjP@Omu uؐc3n^^f.{7СHIME>4?#K,?qC@s @m;[vl۞>y_-o7Κ%FY={dc>7v 9,sRCmCϷVok~c_\nd~w曖kR]Rb9l雜ܢ~h;W:dNVghMihh1edmG@R-T\iH߾MhP?5rϓOjZmz{{%qTT_DVj EOwCc[kWSAA9dG:öK%P߽*{@Zg6# KJ̏ul'C4Mֱ zOle}FǹЎǯybWW#К@ @ ._J* Dfh9o<ΠZԄ%,>^ &Nt縟 |jY9_|aFPTޠrtnFmE#FHvʒ?_NOQ5  [ xr_˲SG~aiWOg=Rk`.sũffkjpnuؾHt*ٸ)wtma:PPKW40q5ܼsfyw55|]J6ۢ䴩򓟜kViC>A}?o{okTZѽK-3޵ל#\0%_}A\5TРlrMpk[lPGDŽV_\ff*{/eә\p_b~k%1؄&]R%ccȼygWx.txzNDɠw<ɕAhfyyf6Eb~XDꫪL[WU%ؿ~C@3F,ՠ_0팾p @-=YY{ ODX^(* 7sR\\&yLt汾KݩKW{[mXf[՝} @B{z@# =A'},Wo1޵kTF6I;*3n(  K@]Mc,@ -nq[̚5ќgnޝ//p׭=~۟tH@G@;*F}@@8ZtJ :;xqWPAtG-eƛ_k{2;.a q@@ L^*[CUi..zsB)Ϥd.Gntǁ^)P]h+-%n9,=S,C-K :x7@{ݐTH;'Kf St48-Ag~J:\~Y,Y&ǝrtu,kSOIcC 9L?cu@;˂*)::]]&&uJW gTK'-X aaz/GHDHLеPWKI Е?lj4SuOx\vLPwúuin)]8~VɔO?uwڨo_^fҙջhhlG}[ke#˚~]IJe"ڢO?]"O>Cpxv9{/O9CRO 9U@;[G~cBzhOph/$W$ko?kSRe߾RD)IvkLIߑ#3FI۾W$)1V?J/bm#cg޽ܻ,SNk7-zW_mhїY&iweǎl>`rZ}o+[1_OK(*1pΞ=Eߜy'uvKMM~I^ѣ2jT\;i_ݶ/ΖCgp3(߿_ws@[E=DgWDGKĉw45ui|v]Ӄ ׬~Vn~!Y?OvZ,*8mԔG\}XrSZ5;@B߯ܦ+ 6C:J&v2 ޷oxN:sgwNSukŝdÆLkf3A"#ÝSLTBC6\K%%%Co%55u&dC؁DŽ+Neˬdk5B~'-ySkJJZ\;k=˛BSEB0;* IHBޫ ^PQEE^ z*ҥ(=J(IHBBHLsԵ0gߞygZIN !7ޥMs]u)ōEs44Ϳo_ 8P>ޜUT^^!@Eȫ\c,敆|_|VnT߄G⮱w7ӨT*@wX%^Krk@h*@/^L7^^ر?Ty>CK\{1Y̝@ut΂ZU%3f5{茆 SPQdž~E@ї-Mt 9:-e{'"$kJcL_PDk) ZTG fR c!۶¡d(b~*/,0a`tֺ?gͼ[mZKl"$D\IgDK3h#ԷO$MrRT8oHruq˗҆?* Ԣ*45%v.Q啅-Hc׳ +-+U|͝R]^"ƍ{T*!^Y@uGm=)ՋΝW{ct(:VxrJA#Gt{բ(j.GG#f2*SOs|FfdPɓgetI'<˝||ߍ(>74E?q90`,͈6cƐGxKEqH,eN#RVT$oVvԐdL9qq~'$ڍ6$ Xg@$axP ^%?p@G3`$_zXؒ۷UY5pjhoSWn;@̛'+fe]Cqtxڃ!"E B}n_VoF:B%+<6 WN8FvIcb. X$!apb"''M/yD'V3C\ퟢ7|:DT.K&)U33s-J=^bO LOθK>@!JUQ^bBY\\ڹvm [yhvae*/iSGRXX+E`V_$:M.|Ɖ{OOR~*MPS^s;NziFQD oX%i:?.^,a)jO!u7v8JBwԻg:72@D@v&Y5* 5Ǘ1 hq(Qz*w' ս{EPsrHl{\Mx T & !x!gGM\q+WauUHVzFM*BPaJ4;gdNOϝ+kR̬tpCiРN“O+*z.ڒɻ IDATӗ_<%3"TS]~_Ox.*5/vxKR+ЄTz=~ F'f|!D5nx 矛hܥt_~1SonQ])P0ks\tgpB Tyi@w>AK*+Eniw(<VR]e5)/o=/dqo0T f7ͭ{L7p"哩.^#OKyΑ9fDg竾n*}7WMa]=C-=( 3׈CMčYZ*%=4#iФBlnTJ۷P W3?R@$o.g"lSBt(<EQޭcǒۿJTx<% !VVUQbBZIKSy3uK%QcT(k !g oSn?Ph]J('MW9(u&J 6@߾Fǿ_fIEx՟'hIK z5-Py_fiPs亂 i8Rroۖ^5GL|B焦)=Ǖ딟E'YRUA1#i! odSO?(N@19PDBH6kX319<h@M]k/*gڹ+E]ЁE^;C݇ө}uO\TWȷ$<)PFdB?`(SSDwJ?(FB<{oun Udެw5F%Ja󨀋6$4]9(< >:4OɃg]]G:oiͫi,ܠNzВP]a6< sU{B͹Go:s\ ;/wS 5/^KF*9%S NjC7ڴњ%Pe]\iF!*1Ե.)s` @(G5gf3ڔ}6L@@Q*Of)wW҅ _͢LD.Tc7C]C-%`9hmmۏSO>}"G?19Od&44&6W}]HVWh]~@5'"DQ$/H&/+(ҫg{"9;Ƚ}{QY~>,UUQѣEɮ>,  FC.=ݞ~Zk@{!P]ʊ9c^@Eoɉg.4Xd@Q ER6􋗁zQcM3nL!ܪfnr XJmDyP& W8TYQ'66YmgڄS߾ԩc&rtеjOݻSkE" ל(|.]̠G℧. "I{NԩSѽ3 7f&hn(RE$ TlL@Qh'{7[)>>EΏHPWɨavvxN Bs՜( u'B h{_Q&DMDn>`Baj"hUeeE`KXRUfxzj9ohruuדOU= qcUmx[d~=- N4AoaPykvr}tߒ/UFNcB(f+EN'?KG3Oھ@1wfOkz?guAFRMK9s~Q[{U7tO"Co欯Ea-xKU8kU:ǦCՕ*uy^^)ޚR]g_hᄈ/_Wx33/>˲N r'EL,械\ѣP4PBHE$sr)t% O7 DH`euٵS(uSVVz[GGj^I9I%xs cNJf8Mx[K3]2WMHL%Nz^@]`r ywnn,6"0j'V(^vW: 0x(B}BTkR<`k3RzBLg@,[v'u-C'eA~~qztnŊ"ʵ%][-z{ٙO&~B_ yBVzkM@ߞHW:FWl!BMeKy'Lݺ3uz'xJg'4Pu?v!בzh q SeTj/U{MgR͕B! uImtIAweh۶#F۵k(<=a p[V!f53drs! Bd! K1ߘ"#wuj\QwC GU?دs_~EUt/gFhOx^y?SPx9/IgE r^_] /}Vc)G7.uSV&y- 8<=u-ye>gCx5Uuy hCȑ]Tʐ*5L JT/\ LC-";WWB<REh!E&WU nnT7r/L`|&`L 7.7 0&Иf':GcZϥ(🕕 yy@& uRgOT^XHgIITYVF.dRpL 0&@#s1(#=[SHHV7Թs\kX''{ t'QލBq3oX~EEE%t` XСÔv:Ajq^"L^Cqq)&;!;;[m ?K%%eԧO$94*רMqA]j 3n`ZYȳC٩Svlj2&`@c@CX>M7 Lu%#ۍrfg/4qmv51\Xs^^@?eфhnzn;ulC~9G_}hjetu TYZ@g&.>OvS($+[q%簡+/%+;ma~&q'"++=lS'sZ1 ZMO'*$0j;vX` 0&h wժyK'R۶ 5VT) ZyϐV@[yBܵ<Ͽ?78{v]q! o`(WP.OYy>έm2n9FRyA&}5eXg`MZj| 0L!,_`L 0&BPx2n ^ݺ뽩@*p!qLT=MPCԇjIuH+~+[²ɥKtp63_yeI9~ruu5uSo]sxn-~{P5sQ} Sy^:U琭k8y&ro߈ږfRrETZoemC>g@znL"LU{bRhD;B0=yS4t(8:ʽ*C[ @Y'ORTU^NNZQaIE{xZڒ?懢ETCEEoG__hߞ<"' /rNŒ 'Pj5p ?_Eu)*2"Bʤ1&`L/b[o/#`zǘttbU U|B uf;vZ?7n])|gS` >phbsPټ0ŜDon>kLjIuu֧sqZV4&/B&M>wQ~ Cѱt SsmDzwߤZQQ)c(5qFM:掠5Ilz5v8رť9M߀ tT%$yzPt2K )**M^ӆ)2g~ WDZU%nҫ,/]+\#F̵Yx*nq)5*,җ".UU{09 7&c1ϥ`T9yGG%J6?`?6?|drnJn" ΁Tt,J jv>]J+q֮%_ˬ(hC-[ MV>M;xzRI*I)7ghooK}zw~"ӵN:`L 0 ((#8ԾB%j)4+:y{>"&\W]F VTZP<ᄋRF#h-+OJZKeeڕ!v=Dk~ΏtUm(ƑTEa][@q(C h`.:'΋> 㥗e)Կ= IDAT>ZMg^/l=L?Cͷ77+Vl]jvlQ>5=R0 FM=պ@k;`+%٪Wx-**+Kt`xn] šs稪Re=m>()!{OOxI$,ms(I(M,+(EUHvn*/,Qx£3!/;%y3&& MPr>{E3>}(`P|YTsGκ=4%wݥ9Y/[!x< Ӈk/lqrA>vo8 ysp^)bvh<}fh1|+c4~zĝtmNN>=|!hܕc X`BQ@_H[KEjLhEQ6elTrn3<>n g(rG}FUUŔN5ܻC) )ǿ;㗉"FJ+I?E~"MMZ%jIwK%P)%6_ HA"dTBƏW"}~zYPי3s(h9<[)OZ В4G/~ AX ޴کcKٴZUfRNOC!A\FO<#syZմ~I6G A/*xK쥗&?]qAZnqf56Ƶ!d ŋat7XIE:BaGjr|K ˴.@H{^x=+Dnβ܋כ&5@=;tQH?p>&B()r5++:ogjlVV"' JU%T9߾0P=*#f/6ө}0}!sC&`Lh(‡-*m* ]jx!g N8F+^L5nZa)ZΞ=U.2U=p_^ wM(#~*{ #ú,)^N/JIIibR(2߮3<|!j<з~.*2>S17M0D-_toDV4eH-6_~Pl/E2bNcM/oBDJ…TYZJ:zZ \kֈcJΝ,~^NvMǨP8 ڴ~~gx9L 0&@3'` ѯdFС]H}}F5q!}\ BŷuLA=yy?A:b8<@1w]QYY=5+yR_ҁyTՒav/Oڻ8oȣ0>>{Zl0a&*jKHh}3RջhCb"IUIp>0Vir+ޜVèUIBMJ!u}iM( 4]=BPEa"y06ǡCcc/ 4OtȯK X?7A)>f\doN':1qjoy9&|Odʟ*?* M^V7BU}j#zVcsm,6uhEť‹bҋɁ^}EZ~#t<`v-姤Eخ)f0!Ώ?N6r3=hV<HbuyImXU>ǿPaQz^=[O6&`L 4e@!4!O=9:t&x~ Uc軥)8O !N!'1{dKUzAhmPx1|K5.Lϒ`!BȓWHh%[ymFEzȑg xHC|N%fXWP篧!v<. w9@CxeE~YJ;=GgVy|j 貑aj|p[قisgV&(y<z%%w]}(;rd8a%^)`ׂ(,,fq5Q"g77Qh0ty<֭4UX L Px|wo?CMwRE!JܩMxyL 0&@K"` ͆v.T|+.rYWUU%“}}=-@aDEDxyjQz_J'D!L/EƩSIɧΒal??U$lIUG(//75TS'ú-%b~SeW](!,[PPm|w~miCPeJF!/?GYii=:3L/d&[Uo۫BSR2ۄw2E&w](G1yg_*˽$1ӳ#rҬxʉ^@.o#;Tˬu(! ćdz~*H*~vvv94Uؼ=OA(I)P),+c ~}䶕%7(/vfƐm mEr- z6.$STTV @)D%w|~r𬮆Y}Kkɉ >bFnaav*O [*JT_L=jFeyyYI;v2*6vvJS (rB(p`L 0s WGGsT{K '[>TyOxw~,Y P+g$g=UoH˯|K:/; BL蒡ޙ=UiK249}73qqCTE%4@;SHpȚˀf~j2o,tRCTk,p-<:}nF6J?~G 3}15=Њ,9*˲s"٩ƽ($n'V[Y7UPUy8dmJwS a^hNTY.M DT~L k+sdzsqj-uz u;clUz6 >m~*LO?DAܪ:eTz:*R{ƅ tyVSP(`ѯd ~=֦ mKw?,ݞ~Z۽$ edMt#КҲW^IF9"EC֍7}[D|d=Yc@ҩ4;AxYڹ DɲdE>rk* 2Z0hcI KJԩ tpe\͕cL?7&`L ( \/Tpa0L 0&`LX b:z4c !oHճ=:AmOp())ah IDATf4p@Gj`AZ5`L 0&RpӼN&`L 4,>\APllڈmBoH1Tg!Y v&4[)( 49 KK!"ܽwprrҮ4oD`L 0&t`o &`L 0$h}&R:~՚vg(G/E^*˽6SȫZS*N?)?Y,ݳVcHe3qzIt>_Cj_{^9̔.͙)>>h}j=}~;yFFֺ? 0%XIi}Qwۭ(<<ΝD'q/mg/?RP}cf1h._~[JOϦc-D5b^+WbL 0&ДڔvsM'*$0j;vњu$gfuܸpʋPЂmT{Y0,N;F%yThΡyT|PkecOnSӹ`r uo83Iv0n{>'g*3{Tj.¿ݿbvMhʋZy'OF!!^ۛ6GO?$oo7˙6O TQQIg*--~}#1tz\ַB>ݺ# <0@c@$-nY;h,Eq6g.CcY1`L 0XD&T|P i r7o܄ТW)J3& 7[5KE)EkӁ|iӫ)?n#Y:R݋ o h^^=5+GFѰ[zei!i.rwwysxs!1_Hn:{o(hPaxM,rn@yeֺa^ Ti gpS:iӊfpDid^ͥ>}"GuөF/h5={ LOθˬ1ͱys\Ԭ1`L 0@ɦ.PSI5vMMCBrvv0-=ٳW1k(>l֥s!z]L 4U_:uԝCv6h+dL 0&PX? >ReeK}l\ MOʎTU*ry,+#k{{(+GGy JV/_rrjՊZFNNufFRSINeGߎѾ=yDDB%YQ)rŒ 1?`j5p +<=Sb=:E6E">U璭k 9Bn^Aʋ]/)OLv*CC@wq.?~_HSޖ̥dS} omۏҀQԺ{M٠!b.#t!JK˨mXБvi5x:$gf]ÇUEF譖n~*)w ,.>Ο"~3Z=PhYkOIɢCѱ4bD/KDO' 瑓y>} .*=@m]\(*HK#;;r K=Cάrc& ǎ%Ѥi"!]_(p{r3F׮ݠP?)LxeA%Q:w]t0 E!NSll2]F> !3=ڽ$edPQq)yx+`ѱc+hGrUo"Sk2] OݣJI͢o>gƍENmV]Qۺegߠ=ڋ{.]rZkx2Yػ ݸQ(ةk++{ „.Ӊ=v4fLhx}-߾}[gCHϦ"׃=MO]2QkġRݿyj`L%`zvNEGlj/‡/ooqXQe CܪL@ a⒈*5ӧe?DѣZU[#GG "*q%eN}|DZf1dXh^w7!j _9J4z/( ]*;Cuw$71WEy 67p@G٣=9:k*!pŊk KCT{@^nC1SAzΏlr4jT_PD:x(_/g+W߬xZ3HZ:kZ;I/4Ϗ"O>ܥsп\F' hj"1?mܤJ塴)SnQk~yV.r k>_~yrOEE%DQ299Sg$Ttllich.Z~oڰ{e4D.|o^Rj7a N{O8ea!j_U(wCE^xq(("AP~Ij t ʇ;Ɔ$;WWYVO5cmS6GUvΦ,w%CJrH^ 15h@ ӭxqTK"[ސQUV$=cK9bny$U‹SiyQޣCj};ȕq(Yp{[dlS*˽HֶN?b›Bi:ҀȚ +Wn^޽;7w#kkڳ4<#Ot4|u]~MIɤשhxN(oͱ &a1" aa_.]ʠc)&VU0K2x];r %(u/+IuۗQ*C.AAc dȇ*dɅ~95/W9&(rG:{+ qΖ]'oC@7M?Xx"~h̻k} -_}ERZZ6ZC5kUۭ҃[;/(kʑ|8aeֳ CRPn=v>%M4::Ϧhqr CcN~y߽dGYNޘB/^qh 1W=U3/SI!Hp}LIyܧю6o9,o;P;`L 0&vPtR>zP~Խ[;B.IP>iZ8jҥTO^^^]In.:;&MXZxBcz2GUvm!}[)7Nnbݒŭ\)aPSBٲttԿ;s7ϠbUџB;.;|6{.8pe89 )ulNPs-W ;HEnNB+_ບxybX*5Bʒ/jݡ : [ &yo"*e^~ ­A܋lg** OGxj۷@:-XAFf]!jJx~=B B_")f̸nY>@5{; !oLO1&`͂ bNJQ"^_{EPIj"ڻQԴijo1 -r UkI"/fH-@MeXPXLYY7LF_+3E-8M|,:9+r] a4Džgc@!t!%D3Pt󐮲'cMKk+[V 6{19IsRu#YTT(i@x5ZXE1cVԻS' M=^`'i؝woǏ,!?h`G5.csL hn~Z~KmGb>3^TV¨D,-MM?RgpVkxkkSS D% x󻥛ſ5C R8B`I.GS1G?-,2qL_,K _ysQy!Xf'P￧]~]";}S6L 0&=@6欒=>;jЀb!!nx匿Gp3 Ut 5UdgSEYܒrtZR==wH#ӥ >\mI^[B'CSYkgi9w&lژP儑S "N =oMLQ5@['*MyGUmoM2齓B BD  (v^kWD@4)D !'߷pe&s&$<>Ne9wV? `LTV&Drp I7ArJݜ#!En^#G,~=j MK$Rddj\0˜@o@׼m8w=3E9ƯJ$4eg7f}*B%U OK™`&o߻-1ģHa!Xj<{bCj(CHg̈u@5sP}jnnwef߉( $oշ7AJ%}c1|n883+gL 0&- -/Ni |F .Eu E̙:K> pQh(aaNg%Qjt)PڟP2;V{6]VoL Q-g@K} U2 ֛[ *-SR4͘bR14K錑ULD*"8-e-#j~D6+Di9TJgPA&в*8'Av%{x\@6V W wԩ*t{EMK9$ݪUW\}wD)ڑ:R}Pm"O)"S~Q/-Q>W)N9o[ .J7QO* zԌ慚:rX/l:4k?xΚMpjj+&HY^7A:VtON}樺[uD{ݻ{[ !sVIk: bTgwpxx88j[/v)ZLTQ3$kĂPꈬ*_sXf(Nɓ5jTӤ.r#@kFz>OLڮ}=1a +˖rqL h(G-MF<,n(m#jCMz 6&H I_}rǠ/"g^MN}w޽;~ոaaѕ~'򯦦{[j,_-N+9z&HueQ,u)x0`L ,h5IbTƒ )MRi͛A6<<dIdJ?z $`JFq,+^J,GMٸչSĊ"__~AyZx^ X.ܲ#17n*ⷈ)}~ KkMʛNce.X%:Hݢr3WU|UՎ2tmì^*Alp.Ҹ'&6+Lm@)=E wRg3qHmTߓ|Jm1N3o1{?'L3\tP/!5;6 -mׂ1&tJ_Q"ݠGvN}[9ίaQJ3:<%Ԍ-RߏTV#$kt5h8I,,6 T*e@ /,u)x0`L ,(YY8r4^Os϶X(1C IDATZ{tZ_{PSEc'eCRYIӧI#c(G%H%DB-:}9n*:w}mRE_G]iP^%piJЬlDݨL/ְdZ7zS1xυ[p|hCQcdžG'ڍՓ=Vt?x|UVbс~Փ-Ƞm@i_VC5fLIS RD?j,qFm7mˊq _|rFp 4:\TjGtxTߎ 0ˏ@g D/HP[zL0D ""kT':;:jm˕XSQʃJ"QowwgѸg͚->j/U$=F:m{4p&E~޿QVZiF4:}:Xϐ{x"}'> $J"#EnڴN-tJӵ9t&2K/.5x-[Ç#]2Z{ؽFť=uP9W0&@o"ho2RW߀< ݱ\ZI Yn4uJ ή[:EYZ;;Bt^'4AԍΨoڑ"^2eSz}]\ YLDZk5,DzCd=]3Pt'EySj<۟@sa 5CwJk`ij5WEy[W=4*Beb!(=3BCdת@M I͕^z;dRFwym@bJ?$dwyx5Ǥ&Quz!N^^z.}E7%سGմ~oؖuA=D7߸O[@bIM<ȿP"x̙3AGl+RtͿcy:?G((8xy"'P}^}+ 2xe߯ סH]Ziڱޫ's3ePFc%2e- m9L 0&Г ړ^'N):/O-T6n资/D}Y - D<@-*B֭B6t0@eia=^5};EdڵEKs,#NViqlJq̙H^^t _ɺD&5C+GsJ%O㎮Em!mOǯ4)l7U<EJ~\" GJ8r:7.FZH]J\䴘JTR 3 .-f̗ QCo[jC͓^~eHf5N࢘N"谕R[@S6l@u~>d;n< 0+'Mh\TP {%>K]6W^9\|nPt}#m㎫*b ϙ4fF(30~Eq`VocMDġdh_zLc*RЯ٥' &qVC%cҤwkjܹ`$ܔ:IlL c⧴OZZn=$D^I^~i)4=O:'6_=3lظSo*\o z\kIPj=6&` *^&g !P;ȯh""RDΒ\Jq]qq.wOJ4砡4]D*p֤swƽge )ʄ"H\]gW)-R&ɞ||A?&]埢#)RYHхm}z$^jwb7Wuu-E"zx:ǽ*P*멤\+)DvNCD[^Jйs&b+Au5ϝ˅+D:|w1*1[$)2Dt5{YXחO`@/k'DT糦@oYT 0&X廠`\) 0&@X; tlǣ&?55;= .kĈ؁`L 0&{{eo?_!jjNQ#`L Z,KcL 0&@$@MyȺSIbL 0&,vE^ 0&`L 0&`L 0nInyYSYYh콽ehE˵zT˝5@P +[XiQ_ ֎Pv~tjT](a1AlL@&D11 ֎2g0&`L 0&M "p6ә? :[8;#eo[?ym`ޖl~>Ww~>3nnxڼS>׼=F|.#HNAf8:ڡ;&M0XYX'88bcڽk^{-ڽ/`L 0&z9\eg:;a9 hSؙ<-M4'bw g62WXZ;܏e?RO~5zeKgaʔKۘkh_x;B\x oب0\7{AOάYf} Ç- bN u8R^ 0&`L,&-*S~xM=^>@(MN6[pyGLVgGeoPOͥjt׮+UIJ=f`?SpX"(..`Mύ6u;_;*=|8;rf_y%FdX~W`W\F>`L 0&z @{̥|GY|Ɨj@/ @wQ[[OO}. n f&TU"bh.l9 v/@/xޖ 0&`)@/ T6#!! ٘wٻwI<.;wʆXUQE&Y٩iiJ7Dsc#}}wT(;.WҤ$ԕTvZ p 19٠Jfim IZݧyĠ:?_ {5 6nn5.;& [7Ne^^SӤ US(\ ,Zi(BUh(ICSm)N~`*;<*nAu>CCY&^p0Q ⵆ4V{[2lyPM-/JAcU>`9C൦Fg~﹎\e]936kp c@+*j'0~\82y_kرnx'oƈ}ќ8q< iyo>7~0E hG\\:NN_/7ƙ3iPP> љGcrrT qyx,ݴ+h1Ƒ{IKENv!]1(3gF *JvW1D8ZfC@Fnم84Ie`b//WȿYN/Ra2psopptDql,rsaem @1Bu`,ll926fS< t&@;.`L 0&O(.@tt"NL +.H7 +xN^ Ckש՘+^P>EuuuĄ1jd0L__ -=O4GuDPW_68lHq5}#uRRrZ};Cm%Mϴa+WꌓPQC콽h対٭#u~_N&F,OcL 0&h@ۄOjR*!:AW p 6穢KΞ7HkQ>:s(Ve%w4H=Z*@i2jRI!^90PD8yx?PT|ƌA.gJeEFX֗@S,VV3aDDgu*Z̘*ቓ)r1fEaU$"vՅ"KhnV{0ǵlF-CoE>)"Mpn5RM!D( yM@mߨN+^ UϪ@Ekp0A ~7~(HlVIr:F$d*\_(m5i< X?Y(jx_۴P8;ڃԚA-5Y^W 'UTd7PK=|fޢ|y:JcF$$ASѣC1epXYZ38r4^_7T@=(s@?>Hiy!\ EnJサEw{mZF!WI@|*X2?O,Y2 xSSs׻K.hަZH_   uPz"D}@%Q ^#ص;$tKF>jer%!9x,`L 0&@{ ^l~aaF'h%?x)r0kkk8 -5@nY'm3PY [ww~{ ՕB`04E* C^ڋPjj益2̝;Q(yܒ%~Hs'kMÐ; gEaX]܋QtUNJi^SnTdSUVI$kV6!o"Z ¥dg"XoTqmڭ?gW=&;%G=|>CZÜ&HExG~JP]O EzmZCQ gV+-59y25ue9ZiߤqJ؞psӔ'8[իUM Ej 4goCxX?3S;=ND= S=fL\[)_kіeEۓB1S}'}},Q8ж~0n0ZFʺx`L 0&`L`\$9.RաCgȨ"8;#uNjQ3-?:Z3*og g?T%O= 3&eXU]r8==E'wAw<'ׯ? $nY.P_+ 7%֤HSofߤut \G/xRbiJ*ߙFp$ Dt!EI|H%S[oJ[?t?tP[dJ|oZ/T]+S[UdTWO?19 WbQW"śj>-:@]oKVv?dM:? &[ <Md4hmcM")4zgϑs➒σ8au# &`L 0&@7'h7@r{TsnxJ]iԯty"|؃-ӪI{\UNHѯ+.FSCڒL̚5gDNs<^M+1˝FZ27)l}ʧPmw;rYBM' &WmÅ'nTEJ-E-C㝽emb {LbfȠXr4}7k3fD;~rcҤ1T@)5L.3Px|+qO->|DFo]+Nr8E/̱o݃9Gt?yԍ>N^5pCBM\c !2$3U< 0&`L 0&]]D;@)|F 6m@BC8sβy:w{ bb4{XX>Ix0] 'wxhM5bתchW0l5YxN/9j2I:m0nQamD7xm A͐MZs ŇU (R&53%@Sל9f$%eM㧰,N( #d-O H$$3-L:%Q@櫯ꖞNO?NI)ޚzSrPhRJ7VC@#X =:џ$.GENKPGlMW#r- #tLeU8q"O$JsiP&B@'ǫ-[&`L 0&&h/(ĉDG֭1alR(dԜY"\2ZIp%(+EQYڦ{L8)ǮrXzrIcIOSxn?tjSC_@3ڛrR/QSM/~M_ǏG u>/Ti_ _-e]%_Bgc@Yi <= {MMMǑ# :M QJ͙ 9ǃ"JꅮZPpUh}Ch*tqYn;nvv< 0&`L|,ϬH㑐.u u@0p^dRΎ^,8y Wv'zz-s&%[@/e_C9M>MpY"3i?"+vu$ꆞJNCLGV@OXW 5?=RPsL;Pj9;RUt2qpn,xdE}صh,{+e*:߻-׊oĉCeH@{j&G͐wBG iBEs++k2fF$5iRxT56#=_t?SG'&L!Caew\yh @B0&`L m%#&&ER@rV?usۼTkKz®@GF% QzyJ:o@S6nDunhbH,_P&W-((CFf;oР&UZ,o}P6Tah]$Ѯ8p\#EWU|UUcR47ՋMwS<:[N| S;|Hy |' IDATaqI3rs kJuL׭jxɏ+`)|m*ۤTL9/k:m~ GP[j$De2Oɭו5Wݸi?b2~JƎ {K!S~ t@;$`L 0& r(1$9/?П{vqSeލ8z3?Tރ M*;)BxPHL >N%#$yz"x|!>}KWauڟ(=h":JԀ .#nSWtu,,:bN%EVۍ,mUL{ܿQכb-p<Vv-kOUv,K1־Mmn *kax@/\("PرfدgbU`dPL||n)SFרc  G}ʪZ#:ЯzRI{PZ̛7$:;>nUSt")mG1m(9Hg ڋV'@ 56{XXVt>8&^, gL 0&0 c~-Nݱ\zIp YnAPjptv:4 ( :' ͥntF}ӎ,HOi)8P`Ȳe$ҒX`!:J'(]yBXlnVBYW.0`ʑ 47P3$j(DJ1k`i*WEy[W=4Bն]DCŨ8 +uo35cty-R{f)񎶃$ҽz]VV$[tZ\饗SO=<\PXXZ^{[WmnnIxV+t2D9:/խjJvWx 2,vjވ 0&`Lb(:.':/O-TA_M×/D}Y - D<@!mV!zjEr ju/ؾU"T2ڢܹST86V%xZX8pL$_/ d]PցZTq?Ai(EpY;:I,9Mo'W;BAUuC])E _=m*@y9.J~\"Z|(ϊ--D} \G/a^>jV~N:|V-JPu7Q5lAJJN 5W̙Q6mޏ-[PbzJUDSCJ齒 QTSOKz}׮ngz#Fcii T㔢\;ڨy˯lBFc۴ESSz%VfmMMٰpQǹMN$&Ё+U_6y8it`L 0&!(= "uODHuG"r|Rdw]Y}j*D}*5 gMAh(uTy9] BLTTW'%(338hJ$jo-?rqL 0&`L 0&Xx"PٻEgȊPelL <UU Zo`N3&`L 0&z@{uS\bIYWa')ILDa*ܓ8MvhO͏llPXq*oG`L 0&`AЎk\gM*-Wlh&*`L 0&(U}٨b `L 0&t,v:br Px磱Ft'e@xq9 32&MF`L 0&: `L 0&OPx$`L 0&@ ~`L 0&X5eL 0&h7@ۍ\2+ հwP*l\\DZ\kGunܿin\cy UEaiKN[Pl =j2l|έC_Lbee+G/vsS=Jc+oXٻw, ;#Ɯ魎/Ann19M9 &&]`;L`_C>`L 0&z@{F9**3gW? :8;#e[?ym`ޖ@B~>Ww~>3k2BIGbm_wcW>pb y/xǵOct>:|OꬣPX;aaaarFܳTuMb#wߎzif\l\:r`׎i_{Oxp kzz9\e>#`L 0&@ϵH̝0`ΜV hSؙ<-M4'bP(c |W yʨ/x hg; ۶Gc=΃]Ԥ+m@}}#Fc f4+{Uz2 ]z y^BIѪ`L 0&Н ڝN-*S~xM=^>@(MN6[pyGL]|RF6"ncғfmjp{#@ohnbv< vTpypqv0x~}qo_y%FlVdO*`L 0&X,vѡ\JCXo@I:[ gŢE:ѵ{܌܄ZD KrkL 0&`L 0N!h`힋R3"KHƼNfލ&UZٹsP64z( N}0xA教hnl/N } SSQNkyy58!!&1'2;@I,7iRT?˜T ;ardޣFMw1qPغu*ugPl26]8 j>Tw!W(#niTWlUd ; UILގsu8]E&ǐY^d^:|`aTUMTL׭\2|y["@#G=* RPz}k"jzRmOmƮ]'[5ch8;y,+ߏ#>>JCnj8‚2<,z]m? ƙ3iPP>јBRbR6Ν;/mW\b)xم84Ike`b//WȿM/R_2tG=~&  GGƢ*7Vp 붶0ŁgL 0&`L 0X DG'dQR93l!d"Jm蛽7B-R{äs< ftSt,v 0&`L`^դT"..G#Jl?OXrhAF_S]RԙCQV$^ A{h!v7TbwdɨI9eJ E48.Y*Agh 9( b]Z_zlLbLk''Y>1T.'S cf͊=ϣ6N=f%l}f4:UQP5a#66Oȇ"F.>6&6Ֆ"ׇ.2rDUN5&K[g8$1^9xJfS' ]MG{y~ZFF~~`/"?T{zݘ*mNQ38uСAxz&7)9%b;vv6wl3i^iFF>I@|B<,GM\|.ҽKg! Kg~Sm-R4p RP(3W@EE#F16x8m7t6'L.=L 0&aXa̔e8("J76 #tܶ%|NhgvS.| Ѥ/"PItrF2G^`~WH̝;Q(yܒ%~Hs'kMÐD; gEaX]$lPI@rD26+T]nʳD$@K?id>׾ J(")4Vdc5HDЙ"gq5pi>-܄f},iy:˄ÄqgO~SsIt?^ o4)B[nj"6;uy?eM(:"؏M@EezM{[ѣCJC()_u&/i[j COFjܧkO޷-IyAXA]eL 0&@/ h/t:t,.FrkTptdƌѩugm@m~:KfJE(iѢnT};S=駢.~+O1T.êZ Jcni $$h@ITUHY}'bKcCuT[G0Kѝ3rg ڛ9'P)ewt' )j1%rܸm9W_?8!ʯ XjVVbŊw J-Y\\:^y{&r\#W.gI'鸨1fO,&oC `nj-OA_op_IyAXA]eL 0&@/ h/t^NI&Auo:j[P~0t;t4VmrrD~]q1T`)YF@i])z5񫯄Юbh.siw㧢9&G=. 5RWPoÅĖPKr[ xks]JTہb!RdRJS~ĥk!G}ė'xwXjƨJ)yXg^vv$o0\TV#\9"ė;7ArJݜ#WiJFjJ)ף~~^Фۭ&'&Ѓڃ.`L 0^@^p(EcQϨ1}¶n9SgÇA;J=p11=,,)$s̔JkIBcLMgbx ԐEG'|)}Y9jHgtg4 !<9/}'DUJ)FIkZhcSbcqHrIK96xϤꅮZPpU99?w< twUqng 0&`L`^;Sj.Y@DEa@ѠDh@.?Vkы'O"A=DOe؁Ҥ$~qVvv|. RGcܹ:kWdf"gUY{K u>(ag8<'%?% N!̲o#HCFz>OLI0a bk]32~.={:ըru[VSK-j;TTT.Q3$o"}`!rj&ҬQon\:y2Fjvˍm{3&`L 0&.W,+_S[!WOJ"nnqs7jmyx tɒVt(?2.I>XV /ֹ~ Xq#ssE#+Dd4hAAHk5[Z]Z?/J, ZY]+-J tJbO'i7Gl\zI)رapw6Uk(MԽĠDɐ@}CL?w!(zc xbxG $ZxcJ=#GEWwmTSmۏhth[t5T>cH< m7L3&`L 0&a,^&wFVV =25{n "f̀kh֦>@SSb{j24uhlh@? Q"@#1)R3`tX;ic|  iۧ^襺UB%DP2k~X8n|>zG CSU!,>~%l}#XtjO`?=,Nuc@ϥUL=#R$%5:K _:ZMH‹/~+֞7o2fLKK+ETIoHk+m9ӌ^\A`'RCͽl;ɨfԪ[зxXVekږ !PgckA $spPu絢<9lnFRR6$ IDATC?OcSBt^fi~~嬭ްrIf{C<  M VSO97`L 0&piziw])>!T OA__/D}Y - D<@Z[T[m2`*zս(j4cvTegVɴk&&"sNY>GRXia!3~X/u%CY22H馬&J5B\k|vQW%xZX@q`?8+M u/<{(5fi"g4Ui6v7F{O78%..x"(o Q{^m""U2J]My[ov!/sLS7mޏ-[P POwyTӐTߎbHSw93J9 I/A0fmzO!VKmMMٰpQ[MN$&C pzm&`L P, w9MBhmaH]wXDD%Y]wE雭u1jaiE!h(B*w[rf|D"?ɤ&i.K˗_ɓuҮ,o-~mJxxE& `L 0&@W`+i^{Qt挬|!jRD|}2ѵkXrrJ h$k.QUUAXF]o,m`L 0&ЕXJڼW%@Muu6 ~~%(Qu/NӦw ;PdM_LVd]#x -vĎ0cF$/vxw(fJ͏llPXY(Y&p`r|N&`L t,v^pT糦)lh&*qT糡4gV5aަ q ~@WL 0XϊG2&`L g+0Tfg$>5hIt8^#F0! Q~%PU gGq52V!m!PT\Ç"!!%hhh)s((A< 0 U7 `L 0&@`L 0&`L 0&`L \",^"-`L 0&`L 0&`Og;w %% !>/`L 0&`L 0&z @{ؕ/ڏ~^/*ѵYߪKѱeL 0&z3fq<Eo>& 0&`L`\n߰ YO<6\l( n8;]1&`L pNG0&`L h`xݟ7ΝQ#YA׏]eL 0&TX; 0&`L+ ڕ T6#!! ٘wzeaI5V?u ,-5ic(MJP%;z]Ǿ}1th}*23Q+{{Ol"+ pG `䄟~>][gL 0&.;`L 0MKtK*'Q_ =ب7UյxuUZ׌ Ctƞ߿m4YŸCpqX*4 9k /~&(0ft(Ǝ ɽy`L 0& |0&`L t%@vR 9E:;6M2_ tS7Z3TEgΈj ~-'It158$WTRqƥ Ɛ!B`L 0&Ӯ`L 0M.~e8()rR2//Wڨ'!߃'OZ-MP ]6..}J4TTTz:cIIFA;6^]`L 0&zŞ4!dL 0&@&h'^>:.6>:2cFP9v`,v5?W=*O#&ر$"%ぉ[٘`L 0&`L 0& h'Rjea4f4W^ EMo~Iq1es3RspH"5 n#g3a~1n,ouлifdl  gfYt ѿ,_y`L 0&p.53&`LR`֋IC#&nA}q] _}%ϟǾ}M5G}P]S^Dž#r ٙ_;Ԥs< 0&UXU`L 0nOKx ph(.@tt"NLF}}# +x>&x±c;rhnn񞍫+|llDڵF}L΅S@ΘZ$o؀s xy\ cpx`l`L 0&`L 0&`f&qq8r$9t 6M2?NCgPac[[TIVSP3gc.#@ItiJEdeD*22P*M KK ~X*4{&&"sN;nH,OOGqlxMkJ(wKѣ$WĊ:3mQd.tc⫶MF͈qn&4gL 0&95@h7R`L 0&zV-,,Dؤ^^76 #ѫL/=(]~̘>;MC˒}kyLJG(E|؝w R2JU( ԡO{ԡ^/jP4*YcM ή['NJQSS⩶*]cǒp&6MSDVVw|)`L &]`L 0&Jzt*:5gFGhD@؁ص;Fpzr!m[V4y@WYe}tR!@ 蠀"bEEgt:~;3k2]w QDBBHB:>&yNww&ψ,tze{%s6R矋raT7ey4i%ˤSB}Dorxu+Jzz{E-(UwP.$x tU#Xֵ_@@@@ψɴ %"#|"cٸM ewW"oW ]NDi2uA- ,b&[͑#TF|>b u[G҈ttSg͢ /SSE{>Ӷ`vjPw:wM])uT+)9)Vz@@@@    `Ƶц3q^4)Kv~*?J4^\tk9ɑl%q-[[ݔ I\}E6gRn3c)k7ꦓ'(==6__,c XֳW@@@q'r#G)--[ _NC s嬕/CBoPEE3K 2 Ws'5Q:a U/@+'llh ]`! +Pzk )qv>G1x   `] Z~[vNoW&?Ee@1B.ȓYB۶w0[@o== _WڐEe{1n]TWb_}UTz+"Ur :ohm4E~-rGuwN |}nB$ɥdMh   0 x   c@lc(%F=zƞoze':ݶTyjl-[DV۔)#v66l~4eEI^lFlzjL3g`iU9@@@@P0 D"% @@@@<@^    [[[hH6RnL} @@@@<8    Ip\    @@@@`8 @Nژ @@@@(:1@{Wh     `q@-ϝ#grl:w*+Ņ(,8S~pZrx֐)B_Nr>^QQd~&E66411!'Ǟv>lNd 2R_OQ7(r-שKG6R˄ uMnթK皾԰s|:@ɓ|iiđ0tv 99 8N ;T_h#"&ӂ8 ԸJn 9y:C|%, 1&͟/~~]jnD9I([kX9uHv(7qwAnng(ik3$}WASJQ5A@@@@@@@@` k9NLM~ٚ#zMJW]3ǩ_V!+OܠRgRcc= %q'uБ#M-j8/L%ww͊@=BBDvmP3iE\,SĊ:} >Z+*ĕtVo՝8! -|>\QDxn\gRV.vT{75W>g;/s<](99Vpu=_j(/cƝ*R\R-kggip BvvUѹZ4ZʯKkj4<&/h$M1ܢ3t-H򜝵'NЙ}D[ѡrZ˩OEVQSo/NNA\1VOo/efeg5ņX h=8%pOEgS$X6 kT%Y G18cޠ_'jj7P~>{DdrђEG)S+:,ϿwElkgP\L9J N1wyyQJr,%̉$ggG W    0 XE@@@P*+CYt:`{>#C RW\u UDsD$i_wUvNc(n ;;mu֊w1kגzZhGF|39zzR?3gDP.$3ʅhPJI 9@@@` @-    0@5ݝ]TTXE:-:)g,Pf p(\g܎EQtq4ܤ-9>\03<~;>sw }; $vtPƛo^x!Ϛ~.rL\   j*1 f"DP[UZ"W&׉_JwTu׋NX ^TGޟٿjpœ94y"7WRnWEQPn+ eU5j&6tC    0 'm"֝||% ,dwN©1k?{:-(܌5yӯ&"F=(|rE@@@L!Zh     0X@Kp 9z*E(u1:,@@@`Qr-.1L\%KbL|\Q5\<)۔tG s5GP寿'"M\A^^^` j5+,4Q}0  ]@@@@4 o\k     ` ZoRoA@@@J @ҍ    ` ZoN@s5X-Vup@@@Qmy[R{M yQ[    @5-@@@@Сcir?:=8"V@@@ᤍ@@@@ 3to0@wo`gcr_tS @5R)+.K禂&[GGИ=pbsv|ח1?ӓg&ͫjJJ!o/!^'tr#"&ӂ8 T,Hk@"#)t2Vx\OSeW&RrRYH , '-@9|&΋@?ųF 7&-Xx.agW7֊ rkyT=r4v~yPc顔K!B#0@O_boP= @PVVCtF qЧ\M޽T!_z)yEG^+@Yav8Qa`jZ@Yqѡ* H9[h<֬!'oo>Jʪz7(Y D'!@G)_ue-rjr8Ѡx1ϞmTh         c1X ~ I7,<z@~ .o]oA@@@ @    `e Zن]r@|>Xֶc@@@P?x   VGm&Ԫ΃j}{A@@@ @݃    `TNZp@@@@@-w;GmdB!!axhZԩ"gω$w7gC%߬Ydccc#Eח\&L)70/:@GݖXCe{PCVٻҴ;a ;즾~>N49Џb)<|5(g6~'niqƺ*cx;c(bW_Q?͝E!J8QLDW\>Ϣg.u57wt4\qE      `M ZnY׼[<(|rg (GR`wf6ԱK ?zrvv4b^fwЃY[>r=j੗_>rE7s9c3nJJ%h y^     cбNJWQWGb~ DŽZYI۷Ů[GfO( 11A-ѕ ̙ȟoR4}Ę]ٍQGg7͙=f8i1ŋ!)'~8WC_@ Z<^ᄯ"G~@@@@`:Zvb&pSJzK+5yTQQ+C*M`M v7=JPR`v&⧇-2H` 8;dV\T    `e Zن ݾ~.rZ1T޽߫h*(nut$8Y._>tZJK\u\yT\\MII15K-SW{Z[^&kWۛlݭRV&~ %{5)Swth.-lQ)p"j)/7-Ҥ]S9Z0O>113Gg}==|l(KijϧZ~دTb?ĉbysQ9/coh{"#h| *&OSiҹ47U=r$s&<>fc /1/:w.6_5Gҹb:q"ΘQ J֐-~t&Is9HWYϰ7ח&Ο/[ٳT{8vv3B,;}brU緕 98~웡SԘCbH٬=vL|&/^,67w{PJr,M?>󲼼ee%qOgܿ ~3goHE}_N=͞=Y2E@V     `qp4)--踰SO+"a\ZC蠼mDamcy$y 4~ņUZ"&GD|bc)xR3 1ǘqu娛ni,N^*~IwL \~x~E NOȕWjB,h'D*mc!V8%Qǡ/c(,EvvyAٸ:u|twwBC58yCS#D2mL"Heg`j6efGEN7/1xrrí?&MV?cq߮~b{᧟;B(aN;y۰]zq\·+wNGoo:qvįQQԘgtnN,̲ 6g6+})yy8f`09g;:|J=MwmiL^̿7}Ng_z0b3GK_\IY(TPpF4J)q F?,h`q@-@ǡ22J(55*irpZrx֐+UDqxчGpǑlb"NOW 'rAv[;on%'ǒJœII66/"XnmSDR2Wٸac1Qʂ!I6ImT®ԩ"R8ʓYI\@H 1?{Z(@y|uO%%Bj_/XOF+ C_rtxJ#\`ш}==w_xxpd[}E@%%}♷; F*@ه#Pwu q涏sj@;| (L/,bu·׾곍_yJuOSHY>3!9KC/$#)FDgX{{Y6τ{PNL==lJ(V8e3upugHo.aI\\D"GCr$( wlSNDKKѬR(G9$%sΑ*$vrB))q`po_cq;+TUd?ZvU,E4#Q_o^7_{)z]|VdU˧#|HD#S  A@F(p:a&:#I14kfFԝ%9@YtܼY,"_szf,+\PPzz.:]D,zIƂGN*͜udb|\!K*@Y^==SL,r~_)8 -~[ ~|erMyyT7mʕBbv+_gC_J_,VX҈6??u4gvz|Uׯ]@7X"HRR??Ozن /Wf'W J99G4"|=J@Qͥgw}ݺGfo"Dp}!;攔 ?lr ᔟu64lmQqiu(kqu-[5|ɤ$G+NHx-7, Bu,p4#M.)tv/ R"DGS[bw!&$D ek|am͋sxk7T^Q+R8*%O"B2.@w[S&R>UiL EΣI @@@@,@6:8YHdRoUC67!JDY^*ȊF(7z 7ܶWD| $:99Ji0:+(GHE`Z ,ఐcXLy=Z_nyth쭷 єMv"2P2NJyJQfHl3e(_[+lmej_=5M7^p7T"r~;|AtK54m޼?)Khww8%=y}X:p~Rϻq449/!+رCwd/{Z/ jR7^;TgK[PNYeϩ f]@}MK5g4m6t=g}b\<,ei|‚fMrfSo%c1;66c gokPTf[}`W7߈eI}i N;;bxmT>gk[;V xH|-'"a `iR.LXz:    0 @#s R(22ua}V*r415*~V}(l2&sOʼneW& qi0kR1nѪpM6 VM4dH5kD#q>—/EL( ,Pg95j(( o5;JשszwuwPm{g}^JP{-Rt*JV:NS[* THJI|TI'm*ROMLS^ 9@n5G`3$s䓧-.rsej"y IDAT}4#>L|d_A>?PU~fiJboEo_ $;UV !o Hf,2@Gن\(8/T-[QPA)ߤN,Q%QRbj8fΝ"7ofX$4$F5EC~:W{Ti"D>G-Ο/"eg'D"m,~+df~U߽"ic $̙J|%y S*VGu'N3x@gȢ/Ey j,pC9:YaĸC.JBIKi%("#rO:Ʌ9$<"T]~~`3$!N\BW\yŜK98ќ|UQht{ENƉ}ыV_G]Z {/#yPA9]vn)~#r:8|QtRxXį=v8W\dCӐ)Ԥr# WE7]Erӯ*yEFRej7M@92UV'NЙ}"Y!iNIa",8}RS5 (/ s"`Xtf>aByz©b`M ]=#g*1$ CTD+#6Lc dgi4lj1ՐR AA!A4ƅX|U2i܄HrSDjgqm.ÅD~EΣ'KC6bFHE,rG+tʳB2/%M("6g9vLLLS~>q6}~:QS*Ǒ˾>*ev `*C{:zVԗECY\=c-K+:8Qq~JOIj;gT(=,8Q9I3ro ?gbd}B d!V=k䵜ڤ(;P_SP+b?DEp19Y'wh\sPS*0s+b?XbK.Z.Y1N5$qOJ893~:յ^z픑Q,q(G{_!sՔߪB=M"rӻ @gKET(WH|~5CoO{ {) $")+ YLQL@>L|ٸ;W{g~H9 ,#@7cv/ITl>LJ%o/ͨax"BbA̳Dt%OZr,P_.rG̑Yy=,@NEWx/LMZ  MA@@@MZ\tbcurcNnk0֬!'Yѕ\qW 9ʪz7()dEOgkK]nnVkPT,<(t3U~( 6T"55"T@r4|=Y[6b@"tyR49j8 gѝw\9"7O}6^@޲T+ƀ''U~iYo?SP>G*E_iL--j\|,fb*]/&]~. |,EG)dO6R1%a[ן:!MLٯ2TjgG%۸"=.lҢ#    0 'm+W8@,H24Wh jQWkB‚G=+_ ~92^Φ qU\&Ln@Ddc#Uբoԕ+u7SNUErU_yEǑyrc_~fсӧ ъ#8;{3GszxYvU;w;TEmSYB[CUU;ے%shms~ӿQxI2E{u|##j;ȑ#ד5 M_(H:_-32q47_.$}ذA(y3_p\(t)yEzH߶ڪuyl<|TT&<[`Ux@o>_Eш'mBNJ%5).D''.Z~r, !@@@@$d8܂t zAl{M?@9? ]tfwghP4ґ%G}RsWV։k\}d?]mhh&.5%hoc~kul|vutv*,o;]uמ9r4QeOk?P[^cUQuj8\l$&ML燯#U$`!ww{hfc|'+k"Ԛv (70K!pd!}ٯbesfe q2c,I~F_w%      j/$QWcD^g}Wj;uхV 7xgGsdKqO: #9L6PA(K;%9:ٓoy-='0Px5X%9 -Y"%F^~Y#װG}|em      0J@%7@ j.-f<\D&H023EQ(5̕mĵw3#$d @ ߯zQ04&A@@@4p:\]Q[e%ٹ,VϹ,^zmuSS+:U9xEE(I~c'jtm翪utt- ^kμgɿM/m oo!M@==@yj6Ҽy14{T9kѦC\j͈p8KA__@gA@@@`<:w_kM0דoSYY MHo1:5 F3Jg:uܜ?]G6c̰u>tZJK\oLjWAՔCCSߺ$+EIn6e| ``D)GMt@yEhK՟b/kj#:&PhDFשգّ>.(lb})t &CmllΘ s77!_,GPk,|(43@5uoh:r4OYvԓk2NnDotIWĉvmu55upw,*%uQ\lP%ѷ>CEBLttysXcut%Νi}F>#>}t\י?M {z{43Vغnk|oFvfV uWhDpzRddz I4ɗ.\<k嵴}>jii'{z͇  ii"){/~6&~'Q|< CUOǩ@)P_<]ShH¾m|cbqų#C6gÒ벶ϲ<:GM"| ߋbhrrrҼ=픹y:=BC)k+,⯾PAYy ҩEB,p >-Tp7uIs(ډKX0njj?' 4D{Ni8x ^?6nc$ҕW$;8#YVh 0. f,@@@F f+爔GL RiS_+MSS:-M8<u/ؾZ++@ΝkW|J*yu+J)?8iaQx,ϣ hgg7{TjhhN=nbz7~(x3za9rpb_fwxĕݕ7UUr6Fr]lf1'to1   Q;# YyxPIRcNҌ tƗ*uꦓ'(==6ǒwźAΜùtT:Bk|&l-)67k,Kƅx٤+W.^?K -TPpbcCReӮoT%ۤ>#0sVb,R?vjkJrK\h,+  }*A@@@`:Zvb~uБ#k䅆yJ3hDRѤb>;qƆf>E_|A%%#@EC9S?&&Qx$|(%M` §\l"<\#Yxg@7oE~h Ϥ+#)>"u?nWt@jjJESfxO?UגZ>#YVt@`:n QA؆u+2r6GM [hH-Qʕ=q'{/:hю8]]=YMNbQ1\\u)8/iffYZvVc,OЉF7k0K@>>JK/Ke{;@(m 7/蚤J mGڵ9;;қo<:bΣG)55KCwvrE8-_׶)qͨ)%1e7@cnK  s]"P+.Nأ7 ^'ZQAξv[Ϝ;ŋluNx \=r4v~yPc"2$XU."g?W%rtD 1O*՟?U1so>)-Z?^tH,`OHhJCW>ܻw`t4ڕg73TkYSr*s2> c]Y6` +fݘX0    0 (᛼Re| T𥗒Wt4y3o&GOOWYD=sF!@0>'*;9iFCCɺ\oO 8 WGTr1"ɞUW7ФIأ}|\=<_ /iƻL);^ P dI_k)~t]Xzs@Xr]Y6k @@@@@@XjE (66XgYes;;QI>jrVkͥݻUؐD{Ulr~׷?zuޮ.vkII4!!A9 V\xGwƻid_K8 O[o]W_y St55jqEPc(|ol IDATr t-׋Pq=[}J赳U;%+(~O-r (WQf **jّ_V^CV[)EDLV4p EܭC.i>k,+ev       PI;_yUUWz5NٔG\OuR%U-UR56o|<-1=o4RS@yYWWW7qfwZd9,}U*dZ\g."ڔK)BZ|K-zXK̡u]coљ:ckukc?^}m'he ;͋֔O-{J=GJmΆRۙ.8cl.G&`ϞΆr "7Օle ZM>I#Ӳ3>zOO/Usi$AMMN-a;7 {Y.%ӧքJyc    `y@-3X'"9#Nj 6V5k:?t,1q@3B QHz{EQ/GGźFF]2p4W bA@@@` @-    0@_ՂH:;A@@@`:6&t7Ӄx#t8    #K    045{ٍc    O33v;GmdB!!c~x-(܌5䬨5eLRk&r% ,5͘ bq      C(Ő(۳Օy琏om|%r嗓wL̈d!8Q@yyTSD^^n:\QLDW\>ϢӏUA@@@@@ @jn &"{5/>4{uhuuWb7xZX6K(3nJJ%Es嗩\t͜i>g,24:8 tl%~uՑ{p0EXN;S?wб¹IxL<ٗ*'ƻuO]FVdDZ(ޥΥ>$UM)pb=lc0F@wof<    F 2a4DV_X༹+VhF|i)-&~5 h쩖0qǚxOϽZ[;(~z]"| 3*?΀'toR)+./^U%֦Qё""4pĕ0WQRni!q-17W'hn^WSRR y{ m! };C5SkUu64WN^^;}Vw'2=~ڪQ8>~U1Pk[=vsiiza!1/Ϡ3|P/P ikoO^Kn ϞuىǢ"H%%T⽶iul#ڗš'^1רKȩU4pr 5{T_L_îOcckK36l-壟3b顔G|^a !2\1*~@료JM96sF8ZP99eCEȱ4?94#: z @N@:qȤjUK6g77!JDYrCy0[ԍ7ܟrcK*|58.^4CD_ f]X41 \L,)EL@Q7ݤ1j\m.-?m#VTRgFO+S8A7ѴiP/ms>ndQ]\~U<3S'-_11'oO>靷,l'܏Ez>nϑ|boEDJ۩RD^{NsYsV7= ݧ!ˣPG^x\[(f}EUB)"::.\4CDh)✴1JNQ,9SGo׮YBQQST0V\r8-±cts0> ljayT^G@@@@wqVwZmYŖ%Kr 0`z ͓@B 5 $IIM,7eV%˲d1Ց,F﹮\+k}s=,|   ^Խ/Mn3zGP=Djߡ4u$۲u5tYy"Y8M\zwE9#mgN[|d[oi~5k$%{y7sL"klCU|.#%8>^Vj__}uHuH,wי:kկ6!o[ǺW?1?ʿvv @ッ3Lu<m_<W꫖Sԭ tɺ#rb}t}Yk.<]g5mPg6WRaꑵ@%˺BJ$vL;e/\Rk/}ߖ::t0}]p Tg[J{Ă   +@:NmtE Il'g;Z|t>ePGЦ*03 NtʕeTk e;RԽ4+35բ'tI۶E{y+TgZN}C*jZ?C?_[/.yw,Ε[/ lggLZ @u런VÕz+:Po|?ZBzm2?2R|s2S|Uݮ)ظQj %5_gV 26}2{Ezwppn{G ,>?P -q ?E N.#-Wcp8ưOWɮ]e箃RWhʸqt:   #,@:0Tr]%3~?> -LJ_^G̔-ս6;r%7z YБ)'lgkNJ :_SK񧟚z;]>! $-{=Za5<\RlgǶl,:;æ'-$=ɑzN**er=Wwgj?>B~}[>/n螢gjzt_SnXK|rٿR۵*Ïׯw6лJ]I9kw{LN?nLv-&lPKU:VK͸/(K6 3T яpph:C[Vs3mQ}Ũ  _zZhSd׈hQ {z:hGS/O~G)ຯoh[,a5;]bk)r%V,\DX kx_fC:%Z]ۃI" W\aw=mP=,Gђ~mwG` -95q)s`\Sݰ;[j;g]2[ ~re6f mPsWQ-Hу|u^AtIDF9L=5 C;m{^AܹS[ZdpXΓydGɎr nIzHt>=A9>Szhn<"@@]t؉Gfٳ'߄G謫G[,[ku=Dg7-/ڜ9#Qt&UB!J9\rzjܶFs2dI\ysnjq=k~\=tc6ݳC{28C۽9{Tg` Mmg}two{ޡZlO?766˝w|5}$##,߿vwCEɉeTž}Rgw0dlLa[|S-[72kۥ]A,Ùz;.C|7)3KO0B9Zt/ jϧ|ٞcfS> :H~ƞw^;ȾG"xqDF;jD=x@@g :S{***?5xcF2p-\"aӦIoS^'~LWC,[76vG;Mti9~v`xz.%'Jҵ׊Zthg}>mN,%2ԯ>tHv'vgUyyRig{wmq_5ZlPem6za<C@5׉; ڕ'/aO[5:3SIݹM~;ٯGmfO>E ^_DDigޓ9暮}sT=M{\gfJp|ێ-(8R*/s/Cx}l}:?2~hNKi0=}]g R߃o%'ORoY"#zlGY-W͒z-]Њ,)ټ|&q_l)۾]58Q%>9Hgk.^&ajQ??TU՚Y;w噙޶v x-3ROBfZyei6r$$؛ZwҿSS;C= M@@p3]-=0p/֮t(['RlC? t 4Xmztw Pp\o%ee~5 р)r Y ^Zj7d ,YN?kc-]P:zP[&iml2sl /50SO֙_OgweN\gg Aҹϑ;n_uX~ƤIQf.o~n3aBIi)qޓލ_$E2>&\ݳk$iuOWkE]i5 '_mAI0Jsmw @wxC;|;::ߴ7 eܬYƴLY~n9L))itYMȏL_ې!=szKuoz"]AXy~"@!   u(hKg߶MKK–n'[PGEY ;vov5܌R <ٮτ|3un~!n!/Y9,IkZ٣:;kKg龢ceeH~~IKtμ|/ {ږ@U+zu:SgZ~n3@-)g(:k:5VV:F=A /O=Ҿ)^rCl?7O&zؘzV]q4jU}kXa uf_ef/^*W\<.n}>5̮tt` 1.B   g)@z\.&0((.8sբKg m7> oƚWoQt9 IDAT^SE""_}s]\RrR˫ "b4j2[@w =TI]UtFumItHpb p]տ]?䅺,^1{@ 4ٴ˵ з(o  3@M[ 0zؓOkpݵ^.I-63   p 0G@@@@ 1zF@@@@ na  `'a   .@:4  `+)   u6m! (/  3@=Dm}kY em@@:ǙV@@:@GٛPVV)Ͻ77^ iݞT~>'(h=%E@,@:GgC@\OƤf)@Ckz[,mz eOIw@@`, @@ u1GUU|~ݵeܩh* t 6   .@:}7!99[,Wg6~)䋿< a_sT?ImQ9$1Q&M3SSX(U99 '5EE)A2a2 uIjZxzS<    @G8UY#kAinnoo/czM]}\;==An|z{69jG+i7guuY$, {ɾÍQ@ƄF@5N#G"bdѢTpzyٟ~Qy-]-1.VÌz$Gֶ69pYXti li$&wTB@ u1@@ u~Cc1aI=葇n4'ON/o6WUI+S׬Iv O- M{%i2^|~;G@SuMywL=$  2#8EE咱=[?#>1}咐pO;::dO11?}Gަ2cz,].qqQ    8Sԙڽ"K%--Zŗ6IQq z,x=9zz9tdInHƋpDA@@@@@]pt~wӳ7^`Ɓ9cTdeI[shIYTvk#3wQ@@@@ uay%/X<{H@@ h {+@@ u9`'z4vݵeܩiV@@' p i@@P_yz@xxx`  0xq%  @n  g!@zx\  0`q  "  TtbG@8+гb@@ ۛ4&{maioi8 Ѿ8  NS  EtF_Kee$$)guת<)ܴcս"G<=gz@@@@ 1/+^/nw/-6O>gSp @@@@Dt^7,99E(?xhMw?~\y|~2 @@@@@߁Zybntݵeܩg@@` 5 Oɣ! 3@{)bY>꽍_=#<|xzzX9":SKK]C; Z/h$1g3O22Pښ$0&F͙#qqK5%~TUe~o>; s-79KkC IS]2#[6}|-˖KzZ]`ܟ#  S  EжvٿdddKɱ q=kY}nc'_o:KRP^nF-- }$8I3@QI[cn&>׋^w/0ix=MbD͝kgKmdϞ2ar7RlP͚K#c[Noi~wE9s9Z&6lkUu[ E,IȈD-_&  :D-@@pӲ=3,_ommjFEɒũ2gv3D;w\r>Gd J-Xgm6WWK/SŘN-Ŝ0-yxv3C52{}-#5N0r?I=-oTRj[ 7m2K}]o)*.;dcg)ǙY3' כ  9. @n~uXm; egz˂)f6_tY~Gl .qg[gW,KQuvvmiYu^c4kj;K5%pӶohG[ĕ+{timk33ouˁνJP=Hjy$44Б 2Q6`t@ng[g|&%MK%99۾}.o}B54 @tgw͛"+̬3f~n9ȶ.Kr52yx3ϘfΔI]dwm55>lg9u$^y6}M5XTWכ}WlkEdqZ9 BU G  @Pm|.Z8MbcCƾNúg*h`cNe-z*|Yfլ//3Ki/h~g!ZzS{yyOhʩ햺9I'8Xo߯@SsdeȎRv%-W\,{=@@@@KP=}׮|̱;G[/Z*M^t“On0NOO?ߡ7l&=g?Dj E9I r%T¦    ujy eϞ|~=v/n &'^d;PFhDZ_fߎ%􏌔i7l.mklξ!T b>פBlTK_>X*sr{ @mg=t|p| amˮ/~7sF,Y& 1;R@F@mcy`0<  vr؞-5'uGJ?}b|%!N}}ism@LYp#KCΦ43:Ƕl_}e~Jz;~|U:eW}='ij3ٶ5gĞ߹X/暞ڲ@}B0$Kru`'vJDx,]nNzq/D@7   b.xk_$E2>&\W][^%td)gށjk 39^ZzteYCRoI"#N{i[zu,K-ϼn6KOIG{ǀ00   D'@@1#@PjonjIK=:x <ĎR%mzm@t]kmc[CMS?&Ft.9Z4=? =իлJÉgnaf2x-}"uԅz  ^5<-  0ko|.yyŢ5^54t|cZ_o:S+٠}]zGh=~$"=ZM n#@6C̓" .!@0HO>yݵNso랦n @@OP^@@g :]_dj:<3[jzRSUʒo|փFCi@p@SK!~>6qJh@@` ١v'GN.q\2rw@@@@(@:@0w lh$ S%<5@@@@\N冄!    P $A@pH t>@@8гsںǥZ)鎖JK]]u]n- )@@` _Kee$$)#2/d̈tR?HKm}"i;|*" (@ꊣB@@+0fвJy[{mKK%o]||ki,/7.(ֆ%  |P"  c6}͒S$8ǏK;tfC]AС #"@:"4  @j].N%uWG@W u?  5h{{JNn^uN/e|GA<==k@g6<) Gm+f"vȑ#exq @@`ͭR_36{q   |zF23se*^\u/;_~Yl]c[ɯń)kZ뵷ʾ: 1\{ձ>52"7cxj@;vHiFHGX߰0Izk[_fd˦v*qѲlY%BQ@@@@p]?*RrŽo)f~.&(}ۮncEޟZ˥b^eBH d @uhDZGG:RCGSf{݌NKjqR+Շ_&%䫮 @rs}o:T#GԾ}:u=Q- JMmmu[ E,IȈՅ t @@@@` TziٞkYdT3;I|z!].޹3咋9d=IO0=5=^*:+Щg#-ظQtIw!ށ=בT綠*MZJӢ@m\vȓ NgfΘ(^^g5<    pòm)-2z˂)f6_tY~Glh_7&1 ʄ˭U-̸[Vt$),\zuo}ff%']YzԊfIhh!#C@@@NwEwX`  PDӟn4Q/MXp|c|]62jhzUKh!bYfRFxv-QsH[m @'N|[N(e=G]?3k]ڟjUu;[ ]y"Y8͡6 &)  pTg>Nq[hX SO5H򊴷XY[~?nlt:4lTInϳgiӦI·5㏥2'\miכ*;rDڕ+E @@@y/@@)ܾkWdfȣ˭-LJpp@.kOn0NOO?3/́uy;,- IH)]k:ۊ=~Ç[lw}jj,[.S&wt q ۿ  Npd/3%'"1!F-J5gy8*oԿ%&:!D[72X IDAT4=9=<%E®xeodL^]BM*/Oe]wX2;[>|~mwGPQQdlϖ}Y?.8R*/s/ǃ;]͵11f_Lq=;?JsM3['$\W}sРXIZ\]-yfwڞ(q_ ςޓGE<<(3zO=b^)߳GRnѴvJDx,]nNzu  C-mݘJ   0*PKpåo}_$E2>&\54J=HKvUdeII{[56є>P Zkh!H}ݩ<]K㵴64H/[jÐɜZo iqS1æ      @:ion~ $-L0ꨩp57[/ kns|V)+kj8kuO}i)SuS&~O@yEj)]k=3zaIQ@@@@Wko|.yyŢ5Nq֐LZ͞6d^W[T$~fp]TQ! fP'    Fm#=Իk+)  /PUf:Թ@@7_s@@8Lj" cI`Tci x@@]@eyN@@5@]c  6n3<(  .1 t@pPk@pPW  6  ]@@I<'XӸ  H <"    ;1     H <"    ;1   Tֵ?Fy  ;1   p <  3@M[  BK  LPgj  (  S@Mc  @@p3i @@  N u*7! wxzb  1-      <"    1-      <" *pTD@ƊJYi$'Os@CCdddX1{z:n۶_ZdT q:vBrs$*:Lf͜:DO@1(@VIMt*1>VUWIhR"  0V\=7Ȟ媫 _0Vy8~}萴u[3v ^S}hTY) @"( :URR  ),& qsHp\\/`f#fvHm!_MR$5-^<=L*Gۊ'Oˎy|uL)˗OIKA@FBt$is@ @{{@G[I .ZHJ(˗Krru#3,o:uJZZzKtN&7ή[%7KEVV瞳.֯^DȖvw>G@ZtE+ 7!\N\pڇ} @[n-u-r|o{|^gQ-_k>b1z~{s⻞Ptummr@5i li$&w^TB@YԝG蟝ޔ߸# Л646Yb Gz]}=##e7:e۷Oˌ/k]w |DZ_v]^xAڛm_2N??KmqOTOO- M>%i2^w?힯  @C)@JD:4-m%c{|?TNo. 6ͺ#U̙2 aK--rǭ{*jřǶl_}e~Nr OMU=WwEޭ~h;7VT5ՙZ v1=Q.I(}@@AKz aP8O`T)8\*ii}5dp3e: 7e^|Qښ:gK,Ki133A;0М֮3?}ׯsjV',9YW_.׷ {Z2yLSE9JK= 6ӽFB @]aN@ǒ$ *S߶MKKE::7ג| 8:`FzږD 2EJ6o9{߳~>Ztg۵#7_>tȴR_oGԩxvVHGYV KJi5  K p K fP{`3 @:69((;~yfp5A и@FW@ @ @ϳ" 02zRcNNUş~*m˵N:$--+aIIvw]BfXg*3gdTfgKU~4WUohD͝+ᩩwD)ŋS%<,U  Ztt\8 @ @ @G.# S5+vV?zi~_n3.,,imhVgHFflh,>.Z-Km*  At4}*PPС6q@`nG%##[JUIΞ5E֬>`j9J[SKvׄ_xx /<+%%RWR"-* JM홀T؅ Rdɒ4hs%  .0tiN Ы'O홹{Ov.m&KʜI#`3G&ݽ*+/"rٱ#O+]o)ǙY3''6  0Z:5Wp {\s]fyѵ2==ѥn;)-@3n~uXm; eV__oY0?̲r6:Cg:PZ U]_\rz 7w8o:p'  8"_y~ʡ !__HLIDd4A }o++k~wB%0zКAURrR:WW}D'8DH9 0tng[g|&%MK%99@R& KNĕ+5f-[Zgb,Y6q  @wP]o9Lw93垻}Eѐߓ¢%"0CL @]߷ˇ2}u{gX?p[KN[n}ӿy@CE@`X:Y碅$6vg,\(/w-KŦ*;rD+W.ŋR|?.@@Y@ IDAT?Gzw7ӖÞVf9';opݽkdq/4 @7em-\*K.|.qf[@apQvʗ_V-L%6} @'{Dw98te\-'˖˔  p T7t.S p @˅MGб=?U;YޝFgEp22#[rr!1!F-J =4d @$ijr#sAܽz iuy:B%@@`8~*@jMzƃԩ_EC7p2 ͲgO CuMK G+rwD##e7; 9ڝ/3g$ʒ%iP[TB@\YԕG (hoP۸ лhr؞-#ǏWrj~K.iۻTCM픈`Y4ݜ; 13<|Q h/zPRIKVJr_y^^$u/<5KOIG{ǀew# C*@:@ @ @]KJ@-@9̺mR_Z*aK 7H+VHܹl@@/@:ǐ'p\ 5@ .Y  У@sk_z{䰌Nگ/G1$@:GA@8{г7g@ @ @' 0#?@@@]h0@W@ @ @G@Q/@:ꇐ@@JС^syБz @McyO|nPQ)PPQ 0@`(  hpSJ8NƏ х;d!2wTswX%%%NӨRSS/IHp$'Ǻh/ 06@8  pt@Q@@@bq @<ZKN<'Adiݖ KN//ʒ''8XB%fbуo}SR[\,!pxtĎTY)aӦ_xk3n0~L[&2ԡdC6|t%|8|k-GWkJ6բ߿9oi>> ;K%+3LĄkO``>;(߲﫠 Ȣ#Jfef[,w:R-+Sfj{fZ( "Ⱦ 0saY?3 ^h`o@h-tǏy9]afJЂzբ{tt8=x#ҥ[I=E..jPNwc˄Gw ӤF]wlӔ|}8({cfh@%JA1ǧP4!;;[zyb5W"BN%. w,mBUW6$ ҉ի ,*5kW,R+o"PωXÖ'B0bĉK!>ERJ޴IOt-z}!P`BhccQ:4bڵ:"T ȭ{w6I69XcJF#G5w't}njQoTQLsf홹W[0uC @ӹ;t-[*Yme%z=񣃧ﳶ+_@b܎\)~ ʐEi["JTJbk\o7>}A7D Ў *y'{2J_=B>TkYl_[x 1aɊSkdnȑtZbat7I %K^Dh mP [m]:uO4ydAbZĂчE[GG{,ѳ,USWPbϲzޕ,dgSiv6I( ,G+ߠAӑ3/=*cO׾f 3.?yRx9ٓ:nVUQ(z7ogۯR,7O4+JS'2lUٻSE$ʅSIe/OOxn^9{3GxI& b*2Dpc, FSHսH8N?|Hh8hWE [OP}}9Ewl#dx,&68;\t,]9uJ|? wSė_I))EY;UХ_;uH^C.'ӕ*%ȉ"2of|.e|CQ$eQ$C21< %gY1eC+TN9[B9EUEpNW7gfD;vr SWzP'\#ޚ6m-cPo!JZos wv7ΤɴjUfXcR@`e  ` St >IsgON_iPTׯ" {q(YQF{P"!t[|fNd;|.x͢/G3gw;,XdgS{Dӳq *g|XTbV".76A>\1c4Bh)6n.|tџ?)@M1+zU%Qv]uc|S{O$\C!CmkW*r:{<${XL.0=嶉| ~~(@C75!Dcݿ_l0A~ |p|,=%yw_gE-զTstr n؜)q&Gc I=z4xݷdP@x714uٲ.S"Ηt(!ՠJ-r!s;iĈ(EC)14f@F@yH14k+ jij Fj;;AqqwEOn9 CˆP}T-HNala#rM4*Ե[܂,d8=8TפIZ;Wk+駢kC Ο$RApJ u@ZJhK)k=>{ hPAëqC^$KP\m8'YaO=ΣS=&9aă6l|,&"(6|a,0ơ*׳μ*5r8 a#Gtꪪ c8'{щ-(zݥY '..:$\ukҮTS-;9rڿUޕe)-%JPq{kHɠŽG.6g<\o,r:œzі.Jy-kTGЇ"ז_K;SWrrq0ɘ]xE/<[Y'@["qx.•U?Π^JP.BWqk\' z̲[E7y@r*ژS"b\LS>lب\oG_xa3LCaG   PO.4PC@%=B]V ܞ;Rͯʳ\vPB6'Ÿ @m*s9o^ۏfҞT~Ïg*_'r0ҁϷm+2VξL/,Z/Tb,hkݠ9Ч"7Dθ@|'ԓhȐ cK@j3億tO⒆QET޳bGo+S\6OƋH,hx䶧okB#oڽ[6..³=-YeA=.uyuq!L+ naM@ʼnŖŝŎxcФoQPa?;hx寕T}P|uGM2vH:.~( Zre*eod.RP#7D>} Gbܸ}Ɨ_+3٤4|Bƍ#ުXlxcݿӧ/*>S'O (.\i!Ֆ Z$wêkDp ?<(bb"3OsǘP(_YP{Eؔ}}u誫ÏE5F c\\ !)1J(6@‚ S̛P/qzI@-tlg"6ɚՓC)::"VT Եǎх=_r iMTZi o$y+Uה; IwgAO.n)獋hcUq(fE:wF$j-¼V.LI^aa|+V„ Tvw/19>:)ے{xt~NսX0WfۓY@.j <{Mۃ`kEj(ETS*LRP_Gtl.߯s=s@0|WHaqHuslr:W}GBch*O>>&*:Q?-Ν@T<W F^yB%)ߋ9c{XUd'ORI8)[zcuy._l,ʿ dIM}Hb)C}q -pAhMT\L۲;() E\,:z 4daG2~j3c_-+@oի۸ؒTT).lX͎ˏXW$*:xt#Oi]8Yzyb>I|٣Ɔ8gXCNp.YK|³wٲHɹg9Ofcc.11d6UD{('O/!,yGDoOƅ¦NU,ڳx/:T(u \{Ѻ[_dkIA; R m%ɓF7{HG_|rs go(^pXPPƒE]} %5F=sq=;E]y -zqIr55 ͟7!? RiƝCY.>xcSPWXᬭ-y{~GxMzܸh{PEgE\jfyU<kKj}!UЬo <F4 - Z^^I媻x{_b~]kGG{ruu2ڕ@K|?0cxʪj:CMyT;rv:u{%'L u,+rkx%%j!S[M祼:Tٞ :zI.puMޗ{soʅG)*Y`%RX/.}&a΢&< Ǎ#uol<ޞ9N\w߉}FeN%,&8@?󔶆)@ƒ,vŨ* T^3 IT}*yP,^ي"YzϘ:J)֙W\({͜^4пF(ÜWOrF}0ٵ+((&c >KK˦޹ ~v*؜y{hbrP &Is|LМSjA>oT)~{.xל/6g׍fμTBԤ814Kh; B+( 5Ĭe,r;NBep~D5SWIeQs)pU%ŠXMs"XynuMx,KBqޅ"ZqmKCbq>=dO&@YC|Ox_b_{+=d!s~\XZρCϜ!~op^W3ߵ79;V4yj~$!,=PK| Ў|{P K&Zz @M c|k"ԚX @{'0gBc3j@@#H(PfahPHBPh1@lͻjͧPS8mP@7kh  "pUQ;" h  yLOo&[b Mhk$@!Z@@@;    %P^`ȅ[ wm!1F&NȠz{w`eQiiu'7WͣO_ w7 ,y07&A@@@ĤsS@((ȯM>啴ШQo^Q\)C³[t%%9:y5zZhg wR?ZRx ٳk^ZJ?M/iHMUTTў=)-=/P}}=!}_LiǏgбc)--._k BoHAh붽zcN)`oG?>Vkr˘!4}&mKPuuW^yz 0Ճj6@N.\e3<3TR\N"+@씽{vzלwTw DőF^Oĉ#5BT3Ϭ^l74U=e̟~>DvOֳGW>Ăl|ڻ8;+Vm蠁uݺuѣ?j   ,J.1v"qP{` Q˕jk며R8lw^TRyZs5Bw@,}D5[|azξ,vˢ TGzWN:!GXd[AA1mb͞uф^ZwM'qHys\N.5$Dž@@@@/T׋ i >Bݻ7eϙVpaޜ^Ծ?N "na uw}'>ڎ @'\}i_n"6S"Oݣ2+ťKЉg{\\Wj#   `FC6F恵+xctYO>~AGOSRy,^}ha  z@{֝+@m'RDD(r!<8<5Y\@aB#h@[;&m%@59{r:CmJ_L  f&̀-5\9E SsNW7gfD;ȅL]]ΌCxrxkڴ4aPNv[kdD0y{D"h  Fj>tnc Z^E :/~?N6gha  `,J6>N:i؁wC UJo)&9wΝ4bDV`3fPET@@LCi8bAP]7''ѐ!}8m+@ %PbV^.rOOWR^TT^c="u7.f/Cc7zZ\)uE/L(Uy}&@tOr= PP}d9O*oh-fuZRR.*9.9o86S"rRpŀ+sEy8~5{(0!ż8)[Ey@r*6   ,_Mti "T%Uೳ/ӛo}AEow>IvvZQA@j @ڣ1la UTT9o^ۏfҞT~Ïg1@yżB:p Ym^1(¢bѣ)T&4B() @m}W <@My1XsFDʃȂb^%wE_l#^:^>Ï%,+VVVӣ-Cs$. *6   @Ž0%!r%)3qµ4yuZ)o?!z¨(@ܝg-@O(1e?o" N:uzJHH wN\}:s%HOOW>*Ɗst-y{4E["5'@@I9blk#TD,Q=;S] |Rr&mݺG[o΢.] +/rGⵣ=:zڕ@K=@@GZtdgB:Z;K/IZ.I>vDC8D){tz 5-| /-+ +j@pBu\?//7Zrh"@sh/ >Ihs¡/7va,6/4@@y@ ᧖3gh00ChT0w&(9G84~cQ߾=LFVӳ',--'zn,~nAx=O3D7o ;>@{&=.֘PM"@JwV~rė vn:7i AsvkhLz!'f @1 :s&lll(8!ErsfWHߵ79;;d@@@ 1f@-#Zω+_ P@%X    `:űAt4u f ÷w@!@&@4V'Տ]-(P+̀Q@a    !<\;@!B~@@Z@@@@ZV?v@!46 F @me@[%PQU/*pb>P`/umkĢ.yD ػ,L+MMˢ NnNfm [\\F/ Ec  F @me@[%`U*W@@@@@;(Ƞjrޝ]]A @@@&`hb9)ng~1@&P^^I' տc STYYMCs)əϓ׳CA@ cTPPB4tHfhʕc+<ܬsapAPK=~<;Miiٔw*yzRHH}@ z8:!!΋χ CQ!]Z*hqq9{/ƦuwWyyEEHR)'@zw#̚᱙ˉ_h.ط8%dRz*))'ΞDcnB^۔GG{J݅|{k׮]^Fo8  mжqNUr>?OqYNh#FynBmc6@ ,|.eaBwmKW߿{(0! z]%sr鿯FeeZADyg,ΙN2mh0Pҥ[wssw>l4{/.Wʦ6&@@@7mvl;%'g =`՗]H["f whѡ#]}ɹB~~^|lk<P,9_Z1׾qNb7-") )ib,hV!W )>>QUU ˋչҲ Z*}-C(vDF { S9QشiOTOJE-k`'f 'FO0xP%\7ނ3RJƜ(87Τ]}S R~~H?dx0a믽oolWL1 #  PŨoX[WGND''M4R$?J?P)`oѶ"?8,ƑL.nݶN:1niH &[>5wΝ4QD!Z֜^22.\V7z|K$/l<Pk7֮y] Z;bAs~֪qۜ9w! IDAT HhKɡN`0..rr }8l|0:$XUb8I>"r~>?ٱn|@5/4*_@t`*9.% CQޭ0t*\|u ^FQQ!-@[)>jB\aݺu߃f g.>EL& /PB瑏{Ԥ814K/WnOHHd*.)WBCiac-[M SWZ(v|J10RSui)%m >%ڎIgQQz}n!]\W)4h7:ZYYM>L[BjAm)93'E4%FR67Adq!7W'}݌\(M|6 5O%h1oQՔԔ414Ons"4<99ScƐ`'Wo[b9ڲuxk;OYr C.O[GuUUFުѮ:MK\"K}"#i b!@@@(ӜPIIx'[|t@[){>XCi躑(ߕ+ŴTVV)}DS2K¬ VEPɂzj{Gӭ;F&ʼn@@Y@-|A+$rI.l)Y[QaGH-WZUXH,<\u7O"?lߜ92 {rt/RӕDA"   (PUXvs|k-U9 9W!<xc6@_9P+s#D_zwߩ2zqFQ@kBg ;nPUJ ߟ璷wSAWK/G@  `2i< N:פX'#/Ǐ+*;*z:jhOAcƐt~NY(zU}IVe|Q=k ۴FH޽ҥX=s 55 Jp?o" .dp aNϫ3׷!?џ=ƍY0"`NwsAbӡE|j)}nyT|X+???DwR~ME՜hf%76Ui;wOv^1W ^s!tml_57.w6n)r>f@  `:@MDz#UVUәR~Nʣ.^4w}o9uNGrm%oDU=')7(9".pF(JMˢ7B-J%$K\|ڱmfQs5hocn?NY ƹYlgKK˦"|v42*M6΋$]'.]*g]nEggGBnfN#G3dBU @@$ isֽt=7P ǩJaGa4s۷S%Y>N()o@@@PsAA \g7Aп/z|DB?>Y\qֈCŴmEO}OC#[3.+|LX pB m`n֮4{{Pu ZkJN>wśf<4a6I@5 F(55)3 &vfFLsq!@SQq5,!JL94+Ms(;u-<`퇀P{/r:-6."5%PiUUt%*)-ξ#R56ygoP0Ib\hJ lvbiVB,@@@#БG"K Ȓj''@4\=´@@@#8~ݶ@`-yeus wmKW=yMґsz]2(">QUU ˋ9jW cSK.Ve U]ڤDEڟD;:$u#")2"XCln ee4kۢ'RMM-;?MNN`CmU7UacoB#4]ػWϏ¦Mhe[^^TYX(ޗ `GC"9 @1b    f@QѩSh$ʾ1skzI#{Ğlj++ˋFAW={wD{ZP gҶmXXA>3 ,͙ cyW(N!{;f̊Cٸl]Gu9Y%ca9iF񣍝uH&@nG'O՘{΂YTT0Xfb*,@@@@jħk %ٓbӀ^J)/!='LPWAgWU= R̬<:x0N<#xJ+BFmSAnmth:_{Dt{ns CO=9I/]1 yeُniPk3$~”1^ă lGTUT$~ 3K=v<O2h a"^h  mжvbX/m@x~,n%RNnzy28LxYϔ ɔb{?vj:*Jjjk*ge_XШjkG?aB;t@M׵#b==rqnv|@,@ o,ͻ|U,(X+Y@W"@{!PTtpFC{9S@@@P3瑧+bGRhh u2R4w~ʍMvuzV*xYTމ q~ҽNBM1"D3]tx+R^ujj׋MȐf @MXE,߯sr-p(}Nׯ2עmgG.CFÇGWzwt6ѳϽG³=٭Ѹq5{² Ěcxl}.1#3RpnQ\ĪUmg 3|}.05)><`^ /ʢ"WyPRFH]h  mжtZX+}@ ЙjBJQ(:v-8DkkЋ9WޠL%ē?w9q7J;~TU_qcoR5Vo67̬X@Mm-@G$#:    HU[>HߏQAA !a&À@#)v   L N'7֮^4("<ɨe99G!{WW̌!@@@@ +L No)99<<\Xv"o*>1M03Gh;3@@@2F^aa x+1 4h`oF2EwMh>_@@@P-'RWWO)9%&umgͷ#hO/J66 LϞTѿJ23ksvVڭd09l)$+K\Ill50Annqޝ#Ȧ*Z h PXV+~r0;2W )>>QUU ˋyeMUX[P(G=Dg?? 6I8tQȑMxSرkQMM-98!}hذpr;7@{&ں::uߟD5κ5=i:] g\J_84Vd+ˣ'kڔ{:xz[PI*:ٻ7`ZU\,K=zm䩳w֙`i{:zU:"sRΝ=)fX8 ߋu^}}׍G74+֒"Hr@?9xx穯bbϠ!Ciذ h:a\\"ϖƇ CˆP%#"s\*^=u0@DWT:r4]KՇbc[a    jŴ魱     1t8Tʕ۫W@d@ c!,hzc=@͞M6ziܠӲIq&G|/@U    F( =*EnhI᪷1(W|f|shkpB>!(wQ!4<&wxmh   $PPZ+v䴘 @@@@+LFED[߰2򨋿͝sW7Ps~lU{A!d     `~@2.+SUXwvvNۺBlh   M <.% @$m    @@q @@@@,I%ic.    %Ԣ1<@q@@@@,I%ic.xXPd    %-` @5;bL         Z |TG=zP;l         ` @[@9O"?܂]w`t- @@@&P_zѩ @¸SrJMZ"knU%z4UWy1BQdd_׏|| ) ө<<Nitl. N^@@@,Lrw(da@@@:$cRPL)p8jΖ^^|hq|*"]:u*tҤʼnիPTS^ޤ5!YPw?1""#.M@;$*   VL uut9ڿ?/kUkzI#{BdT[YI^^?xFϰ0ut)XzrEl$;Jsym>*.iHY:$bb"݊    @-@@@@LG /_)tH:Ԩ°:wa4/rtJ%9@%PwvcW̬<:x0NS{|@#)44P ɷ34BƏo***I; k4 hx   AJ* EZ?FC Ey>@_go?t(uU<԰?CPBua         t8)>>YG zsgo0r$5*kzȸHPJJF4bx$ѵ#S@@@@@@@@ZD rJg_(99S^H?EGSTdBCj{w5i"R$%(h:&ݫjHCsJF         ЁthT:*:r$]gS2gGz~&TMN>>]ht47bb"(8_\h         "Ṃs9B_^|o{7]9uJt٧5{ ,y{ᑢһ=+n6AcCg2r(""IBJc;ڊJaK^^M(@/\z2E *XqqTCT_%tTrE8ju8}@b    Ж@mK@; "   m6tXX*@)b    v@m;g@ _\+n.MX7}>X ]A@@@@@@@@P>@@@@@@@@@@         MuVWUTDe/3l\ @QFUWkd꪿Z@;'"H=2@@̵ޝG]zddA!a&hJ*"VڧBQKU?}^O].jnQ^,h(Rj a dW@If:'0C&LBI9\2sL_OOr0srR7Z!zv\Θ ̜9>ģy)-訰!˖~}- E@ Po[}(@ P] 0i:ݻ^WI3f`wz3mm#^w,*U|'psS6^o/1o)Ӱ{?~?CDt+WagPg?Aߡ O~S ꂧjsIt-ߓTyL)sꢵ gΠN l*0) |S5=SVC1ϑSFD0 P(@ORc3qM7ܳh2oS>@XZڎ˽t%Hߥ'eݐ`$%E!Jj Z@ / YY%prr %:=ڗ߶Ifժ@Eȵkͪ5;ʣG{=Φ&i?LJpEe=s=(@ P(@ P @mJuNR栲y3zYcv6JNQN(||kwd$\]~9.ʿfdZZn TMВZ&gr V܊ƔɖϽ4 @,=7_܊3g/ԩZkh/g۔l6?^(\ͪ +q()j25)l[j("Xy3&'uNv 4ݷ8g<QP~j|(@ P(@ P{#SiyrXg(~~HWa~Lx$=ٻvɠSlٞb+EE(sP8wb;MBD՜b-wޑ5k~vw[P[Ӌw㒹 y[.A* 4<{\"6 @,BZz>hF >^ ?_ P(@ P(0~܊p+%%5ߊ.[FU"X6/es'4-Y;v@X @ ZBUlͯ#eAKo'oN7 @==6yΧg[P # ܕWWZ-h_@5Դߺ2>}P2m$'GCf(@ P(@ P]fV?a8Q<> ɉQ@"Mz6MMEmZ|2z¾}h75}H|cWq{f赗 2ϯGXsJ@0_xq E|׏C[s.,;ӗ-3ky| ?/5kQq| (@1 pgGO10Z(@ P` 04 D%V-mݚ @ ۰1oӦ^Mʝ.df#=={.;7G6VnG~95AOS;f*x{ |㽵>E*J@\-oمz}@P ʼn[QXsMV͸h,s6٦l,-PZ[ϾP1ӧ eiz$OJ}^(@ Pv"N&à(@ PDMq]lk-71,4qq*Ι^4dd @jU?{U|#a]\ڹv|dFnzivwq2 @ܻ(-^H(5}p0٥سlWBU3n> ^}_Ft~4DF"o…g8o5;LYV~(u(`K(@ PNpX(@ P` 0m~" 5]'.yz˽FsZY )S0it),0vv"kNiq?ά͹sKL+ v`Ӧmr J=>mKjho7 oz5MM}}Y>g ElZT*QL_ڋNcUqTb #榰zH P @q(@ P` 0Ź+/C*󢛊#Gp)+K2[={6-:{.t՟SjQnm!jU|4!/Nb'Mﮮ+G-ud^}#~,^n3޽ߠ}\ cf~Cvq Kj&Z}#m.?V [kq8M(;tH~7>nfRQ؈oau:D!1! ~*(@ f*"(@ P`L0i@5Φ&}𥃓I>r:\mĉ@]<=e ܴ*iZ]s zަKDh|11x{PO`ߎ.߿z{Ȓ᮷>ظ.gpn׌Nr}fB'?M PqɑZq (@ P` | wf(@ P9#g=W"֬{`Y n>Zs @mo嫽&#h/3c{Ciۅ'o}@2^;vC~ehk7_LOGCf&q?"ך. / WmXs cd} P(@ P(@_: q}և"?b5Wk;:R^.f R(@ P(@ P`={&qW?߳"YmB P(@ P(01NyosúR*q?|A Pk-=OtkCx)@ PƠ18i2(@ P~,N Pƞб7g1(@ P @q(@ P` 0sSS(@-tlGO Pƚб6c/(@ P @r(@ P` 0NvhllAhh/N P(09Q(@{`zfoLVj{ϣz.סg6A PƞN3fG7v(@ P` 0s{-;ؼbm(ܷO~^ICl(@ P(@ POMM-xd+HєS(@ P(@ Pz 0 鑛[ܼ ZyC֟NOoYG\%%hϗw\{RXJcӧcʜ9i.+CSn.Jx#Z**pptGP&%**uzP(@ P(@ m&wiiy8UNxu}pk[^zg[!9)ڬnձc?sf_kW'OӖ,A_R!tr<ǏݭBŋf#>^> (@ P`[N#5(@ P>t*Ejj*~1fb%},hF >^ ?߫Ϗߟ5ߌ(@{`jϳñQ(@'0Pd8bH,^ ZS<:rZԓ?uXРn M֩|>S(ʴS (@ Pg(@ P` LpViHNBDDl8Hl=2X]?N4sy ŀ\[Aףߥ栨F~=٦6w(@ P  @mbU P(@! LTb%d S\tTY7Wcgm4`*TU5 d>2>ҥAu(@ Pk IDAT @mcu P(@! LTܞQ\4X؅U`P&&`(8sƍV#*>](+WڌMT"!A-eX(@ (ՉF89:$S(@ Pv ʭṹfraSɀRwLƻcYfՀ$kneϲfMFCFXXUce% P(@ P(@  &C#WL0tŤ-7gbY;45!eYWc%}hk45bFC+P(@ P(@ P` 0fz"J{]T\RwX> zz=m.+rpQ[PqNÜ0$&D!8걱"(@ P(@ Pƫ>fSӅ!>:`ㆻlM KK989{͘;՞-H (@ س@SVǽ P(@ P`8Z[]s ;vC^{2l躺p1= j4Ǖ\Vvc₹6S(@-v9-(@ P @wE~~mOl^mSF P(pP&(@ PFRb~,k޳" ̲)V(@ P$ P(@`jv[[ JV>j(@ P 0o(@ P`$6(@ PP(@ PFRHj/ P(@tkRىjs(@ P~o(@ P(@ P(@Q`:J(@ P(@ P~o(@ P(@ P(@Q`:J(@ LTmZNM P(0 @]{70i ̼AG(@ P-w(@ P`4B=ϐ\9(@ P @')@ Ph0:A P(P(@ PFRmN2U`d#GWu躺P;<ܬK֫nL;nS1'M45A R!%%Wc$ (@ af'(@ P 05)\jlFZZ2N@醳{v};ÉX{uu:&$!3۴ iy8I]H?À}(@ P  @,q(@ P`LT!+9j0٘y3zYcv 0E[h;;A@l3ޑpru3 R]}|%JN Z*+ZY ahn vH$$1eP(0!= KS(@h}eHéӅ.7UWW13@ +@EcM7ɓW!==Cl7irU0899υQ(@ P(@ P`l LlfRRQSh)b#*KTsCp+A(Z\*WTB.7΃- (@ P(@ P& @GӐ IJ;/ʕ6y>猫B= ALJ(@ P(@ P(0&t*VQs>FPs=4`bLMN/CNM23ڋM#q*(@ P`q>5(@ L$ u #iif mqU]8 ~C @-Yk.N3^jHC^^Y5*IQ9cD])@ P~L"_(@ ! MIi-KAnnٔ .NP `Zet.A&4(5nc"F@}ӼUa% P(0 @Gy=(@ P`:5u{O0Ti(JW<^? JMoO4T!~Ys!!AАb% P(` @yv86 P(0^3uH=Yg>^^q.eeCn޳gٹ_a}q}<%ozwuu<(@ PV脝z8(@ P}KjVԄ7I$n\}|z=cmZ]s zަKFN)@ P Q(@ J W덭DY>РK` {c(@ P` h{a ߀(@ Pq(@ P(@ P`VQ(@ P(@ Pv/(@ P(@ P+tr|(@ P`P:$㠞C(@ PE-ZK P(0d?dB6@ P(`PX(@ P` @n(@ P`jkR(@ \MP(@ X-j]Qs ڪTbRh~16+EEuu#8.cl.(@ P 0l(@ PoQ~0sroYg/u큰@,T!끌<-訰:;Y46 44Ek۶C/J5}q PX`:fc(@ PGehä30=@u:=>0:rqFz|råKmRX[ssːWU+o*^|Ⴜ@QwxY+AKɭ'\4N'RV(^gT*xv9K/Ų۝;~ wwqXz+WagP򳟿 PPK}M'éӅpsu[֘%%IVO RilctL3WUU?smpR(eSII8曲**uoc)@ P(@ P @Gir/56#-- t =N&sv@4@XZڎ˽t%Hߥ'eݐ`$%E!Jk%絍266my@%R߭mxmo[hjUǎsGڵfΝCѣuAgS4}[ Y!dρ(@q!ҡ8.އ/A P(` @Gp~:J#4-1fb%lT-P 6H8?+s\.9kLLV@4-)lr&bŭ jLlKӭk.ZZCKpMɖa[٬[EOPSIIf+@LVCr;?159Y֯;uJc(q>Ĭ~HLBtt(!R x"(@ +#0q"-On  *̏ őX{hw{;wAز=s c{WPYϭByEvPUst5ϯYmㆻtJJ[H @b(#Vſq\ÅӖ3@˾Myy=@z4WȿMPwGg3~"EWN֥(@ cb8H P(0nTp+%%5^ĖEr@*(K\}ɳ?MK֎j4PCnVP[+*9qYɛSR֎Ov-z>(:z'pW^]9kip D=kP~/BʴS B(0^{P(@!tpΣ"<|.6MMEmZ|VCkuuC"q>猫B= j9s[_9KS)l(b /qõ%=߹s1}2;PC:ȏMχp@ P @$q(@ P` 04 D%V-mݚ @ ۰1oӦ^Mʝ.df#=={.;Bee=~.cٲ5AOS0~yT"% .NjZt]]8[#kЪGbq bϘ_dou(@ P*^g(@ PS0Ϋu<#iif mqU]8 ~G`mZ7h8{pp@̣jO\Z Pq^eQQ5N!/y*IQ9c bI\42P:TCq֭tT({UC6en&Ŵ%=YJWk+r~[W*vt >[C䩔Q#߲oK(@ PN:zwuqq(@ PYͮq]lk-71,4qq*Ι^4dd @jU?{U|#a]/U2s PqɌIҊ227l3ZZe֛ZqԴfgbϾc_m >V,}A(i4DZU LPqjvv<3QP$%hXY(@ P(@ Po#h~" 5]'.yz˽FsZY )S0it),0vv"kNiq?ά͹sKjuC]Ӷl @ baXmV϶ /Zӧ!\MJ\P%iK{i5bFMa8Y(@ P(@ P )/C*󢛊#Gp)+K2[={6-:{.t՟SjQnm!jU|4!/Nb' nzwu5_9OwbhGFV{<>32;IiߐxGqb%)_C];۾]~ @ȭ␚Qvo|Գ;Em~8VaNtg(@ P(@ P @mҡ!ljB+ _:89ɠ1r:\mĉ@]<=e j5mtx\^lګ??;/~o!K>:`ㆻl:ù^3f ;}]h{Q 4U!P&@kND{u/(@ P(0t[[SRVSc\M(ڈXD^.(^Nn(bD@j-𶌯۶@aaebb{̶t4|?۷ޖqpwGw m-h̄VӳU?"ך. / WmXs cd} PX-cq8f P(0vݹw"llGp0\ Nz5aI:u˓҇-~(+ V>y--2hv +uY(@ P0`_(@ PH 0Im5"ѭ~,gE<۔(@`j?sP(@ t"|Ƕ֕JWaN+S} 0(@ Px`:fC P\OG Pƙq6| P(`ge\q|(@ P`<0w(@ P(@ P, 0 ? ͕+hRI5A`xxǠ8 P(@ P(0AN.?|99pvwG_׷,ٳPPP@XX `Tk7gQZZ&8;;azbE؅EG>`qmc۶ɏB/J5}q P(@ P(@sv(ؽuu4cf}G;NWGN9^__/>N2 x~=&Mr{Z`mm#񙬺&Ԡp^Y'ꡇr5:(0:uu]'k])@ PFI([m!!_zWBSti Mʪ;)Wy;v~o=t&&F՗5՗px&.]jDDLg~OkܽkOl^mq\@};PLdM04(@q*[(@ P 0Ӊ1 ^ҲZwa.^4>73&_T*;\_g3d^)=Fwijj> gE2.e [Q 0寁(@ P`$62U`d#Gj/_ /qT(nBҥpr  Eӡ ʀĠ)?()E| >޶]K{p|v_|9s[_Yqc+xgeZ2O~S ꂧ1 mKJ(]h)/gؤ2gN.ZP jkP˦p7e]3@=jU0T8^ۊ(@1&tMK PƸQKHKCƩh42]'G};85kh@=\YOO^]j}qR GRRԡVr^ۘxA~Ϳ|0.?y[z3wk[^z'd]~"$'EU:vL?"׮5p*:Z(r'x5(@ b(@ P`0t*Ejj<'Ӵ̛իȏ!VrRvvBダXg##jqLN31Y֦UGsK Ċ[Ԙ2򹗍x73k.Yq׮ͱLλ<%aKZCKϊ Mɖm?^(\ͪ +]q5EdT-d5,SeSB_i IDATd;bJ(DGɑB G(@ Pnp`(@ P`\ 0iiyrXg(~~HWa~L8\]],3@ۑk :Ŗ+VۻRTzn=7 @ +ꐞ/4W '\~~j7܍kVRJZ\\_c70ǽhLӋw㒹 -g}d{HE{=h\<4-= Eb#j>(@ Pz kz^te[(@ P/C[))٨m4"yG2K}%@H P(@ P&a[32 kvѐFX؅h7ߠY1>ګO>Asii+@yEE8 U`$%Fa挩.<$qW_g[YlbDӭ[KP&jm*ܶMiKz.2VTB|2S)/G&eߪb% P};0(@ P`:B+n\ۚssz @\Js *`ZhϞE7nGK \T\s2@nw7={RbGi v6) LϬ^}#YqU0;{j]/2;v@'2n~kU./?3 @yeϲfDCFXXUce% PX-cm8^ P(0whj?<^h۔)}}4h Z~ j;;s48U~g9arah%Jv |aq_j^ݻ)GXգn㠼a}FX ?xճijBV}>kE,g".Tb^wz{{ 1A؅f@Y=`V(@ !ch8T P(0$!DgyMő#%Gr-=Gk?\(J>c'1Q7틧[ C#l8S%/x}fdwϯooeb׮忣_ay7N-Uϰ}'}hrꚶ/#e@BnnnmG١Cg}KEb#y*6tĄ(/]SFVz7 P(0/@\:T\T:h:JD×NN2h\>Wtq,POOZchu%uz.e2`~A^~y1[JK^{u1>.\ b+V݈X-Ў%]oByE|q]u{ù^3f ;.4=PObT\rV@\pB Ph @'ڌ})@ P 0]z[SRVSc\M(XD^.(^Nn(bD@j-V J-ض +{=.owwsS @o7oSeLww|l}7˰"npLh5=+]EQ#r좮8yr/5:F֧(@ Ecq8f P(0vݹw"llGp0\<<-u:=*+QWׄɓ'aVoc}(+ .szbbڎˠ=(He(@ P\uwu$ (@ P]Km}c=+٦,(@ P(@ PSĜqmm=7+ (@ P(@ P} 0寃(@ P(@ P @(@ P} kzU*x}GE PƗ5| P(`(@ PJ踚N (@ P?G!(@ PO @l.+WV] 'BC'[k^)* pAq(@Q`:(@ L@dFcN33pT2=e?X*˭GNN*S`Ypr~}Vŋ"ǵen&? ]>*հ)@ PcAX%(@ v>wf̻h#ȩ>ګ%{>zz* ۾gE2.eF)@ P(@ P 0qr62U`G@_pA^P;<ᠥK.^Ch)+CWK AS~~3@ *QRRx|m祗b8leMKmٲFK}=pt!\]5fmsIt-=줰08+&=Oǔ9szuZU3gV[ 'B^6o)뚞z)PJXG z(@ P(@ P 0_ȥf!T4n8;;gdn,bi;:Pg4/zS }C_uC(uh6&^Fb-o#L* y䭷~ WFkmK/lk_~"$'EU:vL?"׮5p*:Z"V!dY:{ P(@ P(0ju:de"55GiZbUKG+9E[h;;A@l3ޑpru5~V\s&̙VCkӍiZRZ؆bŭ jL2f<kXSsIܻkh:DDLg}gPpXgv#{.t-3W0w%zn*W!==_ni %h\:': NNW <6nI׬CG{]]]f=Oӫ*?7~7.[~arh_)/O~T^ރi*g3~"EWk N~O Ps~ML Pƴa>nd؋(6R@17_~)>yiڱZbj׭bk~EeY '. Zzc~5C PW:3(@ P @q^ŭHK5hHl#[BYT;koAٳK'c}Wş|>WUEE8 U`$%Fa挩.<$q(3A./C69TCq֭tT({UC6en&Ŵ%=YJWk+r~[W*vt >[C䩔Q#߲oK(@ PNDp(@ P`07m͹f= .N%9Ӌ hp0WsgϢos7lJv]*(MϞ!..QZ8/s?]ouQ4)oٲW1.Ş}d[x,\difBeDwNOd$Boݬ֪*\ؿ_~fV也e͞R")QF(@ P&ҡCtzɢ(@ P? @Gx.;4rCMWKyro\cVVm̾>Gk-]  uڹSmf*O3ks004k;p>s@-B]K/Q]} [o-?baX`m^ۙ /?z5ϋn*,9ʐ[nptv8]&WOE]UUT8>HL|h_~9BCuMUùGʀz+|-ڔC=͟zٷTT@/6lSq Ԝ0$&D!8o(@ P(@ _v0ҡ!FԄW"tprAcup1>cĉ@]<=e juLK6]d: ^c*V{.5FcG^E[Ub|{{'JQCIN eX2!W!07ަTSwo3vfc}]h{Q tH# P(@ P(@`:|׭e:%m55Մ5kh~N"ϻAoVz,&&nǸݿ~l8F7֬~ b]naE~1= jzVGZ[E]q\AE<Q ^knuO P]=#\])@ PFVzXo"llGp0\<<_Nz5aI:u˓@Ќ+WZe88u2LV[pQW@\׭݁vt\AAr. (@ P P(@`:kDR[_Xuϊdy) (@ P#~#(@ PAD FJWaN+S} 0(@ Px`:fC P\OG Pƙq6| P(` @}8> P(0P(@h1Nrsr(@ Pc_؟C(@ P(@ P(ЇP4(@ P(@ P(@q+:MѯϢX(:f(@ P(@ P(@06ɿw3Ԫ^Ԡp^yC:&(@ Ptco1(@ P`zl[//w?!~|I PNJNK&(@ PP`" LIFMmq:ŶEX("y|u<'wA7SW8}Pn7iS 99bu+ (@ P(@ Pƻ @ ge (DDĶ^#E'C]:GP ϵtz= *]jkmjs'|(@ P(@ Pv*0Pqg#()$4UU١y6 ؇ UU H?sƭbtiP! P(@ P(@ ر @HKEsKqjX؅sn/ Ś{ojz03IDAT?nhU?Ӆ2r$O%r{[)@ P]Zߨ'du P(@ .0PSZ5<7L.,4qq*p:9Ο]=x}R7 @|20\dMڭ";LYV~Ѭ(u( jD PS.ۦ(@ PV`B\1)PbkfaXmV4MM}}Y>}gm @_|i/;mz{{ 1A؅ps (@ P` @ (@ P%:^O<~9BCF8} @ȭͷsGm @N:sÐ`?Ɗ(@ P`$6(@ P`oSӅ!>:`ㆻl KK989{͘;՞-H (@ سP{(@ ?Viu%Y{}7˰֢t4dfBW#rm[ٍ n`kwO PR]N E PƭP+G_q[W[Q(@ \+pM+?r B P(@`ji˚HxU(@ P(@ P(@`j ܰT*`SF P(@ P(@ gޝF]qNhk=.!"DuW0cփY%q=p V) ^H -Җvz0l0sJ:3<^ϐO"   xUԫ<@@@ծ? eW @@ zߘ@@\@@^64I=*pk/?  @8+ @: ii1KZZ-,2rseƪUwlv@'Lm<~ @@# qV  0~m";-WJNyႜy#HxlM'NHwcO[uvuID@ ޜ@@`Zg8w]wje u֪*б ~ ;" A+0.VI]n,a6hyq@0ϝV=P  C @m6:p/wpy%$l^S#lNsm l;mL7ϭKk\*+s]b$2)ISR$%/~Ǎ+@X$,6V&K:?GI;1Rާ4Ȓ%ْ0^ @@@@  ^jiG+*Xz%,,T^|!;:O~Ųb\?<(MǏ8M*ڲ+;v y 1g['qӧqqqj}̓&XX( DcHHM}.(}fLOs%7'-0    Xf'JAAٍod㆛$"S:(}MֶYٟjlS/w !UX7j$GV&HTJnVYQ}o O>鶢NL&/QRQ!mg32dwNrn~56Tm55rTVw&jCnrgҥ921iD5    0 65,GV뽽}gCkҤY$[.Ȑ!AK.M嗷/vF[IU2e3UZGVIRnk:sZ}<ݻEmW%,&fz'~[l^UudWÑ#SZuRXX)%qM.Y 77]BC>k=@@+u9ȇ  @ "=Q|F\hhqGDjDzr_>=7nJj^LYFDȼ'p{pkCOsm6 ؊ҷ[WժWު#79VBR|z2?A@U  R~wόdŲ\̜*&E#m|c}N M{Hwm^99ܥBĆGEm5ցgk…2[;И뮓оWg@چ?IXT$~;;jkƽ۶SzPsU蚻e  0( @@_ .U 9ysdd-TX{Ong6HBUGj;w9&Uȱy2mJgG0{];}J^]WO3G/r}Hu]HqqVHVgkȒl焆  `.@@|)`TUn/*:-GQۭE%..zHuj/&os8u-);rl*&֯2kCOVV_ӣ v9s^VHEEe\5s@@ @'  SCo*.(Z7Tg3*ysG{O,Ϝ[%J/5\;udlܨ;Yڤa2G8 e³ϥYI҅ TKJ1ڼY}8Y,WWz     Y P*S}p}R[(S'34r*l3݊5*n8n6UMbblv*4ܥVwU/%^mWWoWP*'˗uzGH;wv= nԨ@@@@? TIxoo+%'j0ꩩZj8oNI-[S4? ՗*dn٣Wx՗Q^}t77;SIg^=bnPVuUV     q%`U_]֊pg@@@,<-nq    U}Ui+Qh    `9 (Z^JA@@@VU%PM!    `! (ZF2A@@@DM    `) (ZN:A@@@4M         ` (ZA@@@@@@@@4M         ` (ZA@@@@@@@@4M    `1Pb    &h.4!ArW    h - "Aт6    &h,4K"Aђv     @PT -A@@@@PłbBC,-kq    E@@@@@@@@@ (&PLbTh         AbBC,(bY (*%v    `a (Z؆rA@@@@! AX^PF2Nh   Gm9.@@@S5&jm%}&ǎGN}t< @@@2@P}nnh|1[ƪ**OO#"l:u.    pxN^-f &5`@~b zGEQԩ: gK)_C{Sb-[t 1zt\ @@@%AĽ)(o\\ՂbΝ(֖x{@@@:@ںuT[\Ln4`LJA iin3EA@@ @P4o".${77#67S͢}"G//}MmT[ ATph   @ /r ٳM DSHS&x ESС-X<&MC!(v:@tDP&th,4 cŲ*:p0qWq R}idҎ>p n.RL6NN7aU+srښI߱cՕ*lT#~$.9hƜܾuU.]rU=+psn6Ç3UPSRDhgT{N- > Ϗ\n--M)t7QIR85UU0{f1'<&GOO*MJt1{g2.h–c8gdPKc#YۓVnBQ<-M5>?(F^_CT]P l\*M lq6|F,x@2z h   гȇĤo_dO1mB>,*M&Bm+CAjyӆ`A_Ov[AYSeyEƊ4TVRƍC\1M["3SX̰7[8'~F MdkkC/8O\\4wV664`,r P=ֶ+W wpxmC,Cj vrhw/>XQ"6mz JW_=Sņ :auJK IwƵ 2nE'f|vI>>y g#& JP SU^U$(&& B>{xP#5(Q)l #ܖTSC1=řP+2kջצ}D<cKW G䰅ϛ'"ؾn7:1o7EQttyoD!`6bss8t7b~A06&UY-A<\Pd/a+A= ֑J<`xnN1ol,ie A߇؁]1\BGU{zhJJA?Y'22Ǝ`ͧfsc!    x|9?BGkq~@v9Ey|8O{LTWR""dSI$C窊/%CC4f A@@4+ӁTYu2A#G $WW̟~,Uq.3bF)٘ox*^u(|k@o%"*V/S<ѣBHPvaる|^$gg"5&O   Yӑ#Z`G#/Ǒɡ9vmDf.WSZEtӇذz~"+$gT!½9[٬B:x( HEcFrh   nYg ElrrH Iaa4mF{٬ŀ UIQa1M_?%JО&= ! s5657SbbțS1.; QO> #倲AE+;y 6  zAqtT7Wl"'l(O#'cUy@qf[F]tYu;):m8_с@@@L$P[ <(|svr矻M&y ˁ,قӓۤ+S"({aS #E\vg6l\&:]kC, ōQ,r A@@.+% u|P11?7'7ݤVpK؝6kA(((@@@@; S$S^#yjbXdw`HEFem٢.قbTr@8e Y-S*(<s~2k {x7aee" pm \QZ'*LHs#iiiA)nLxw큹A@@: ;OKx&~5׫|! e1CG<{KbLoQd?;,W.q( 񡌫J4{{QDϾW/^sṹX'˒uG$l<35Ԩʯ G}x{/N10,J74R ]+?hŅZCNPpܢ͛99]d>0u[[^HETSXzʊ|a̒ȧ8 [{ϔ)Φe`0sDF-t_@@@(AQ? e1EDqnTG++tx*:th#+ɞ{|@0ɸ(ǯ_|n՘Cml+ |>í8PS]ٻ?rOJ%c @&pE={ z0OWh* (}êA@@@ @PrĘ@@@z$=r۰hz1fHbO5@@@@@@@@niA@@@@@@@@'pתrrDU@|㣰)%SD.Too`Vht+]YJT"v      =E{f 5VVGx8p^JNlGD i8:}TV^M 4IHHc3Ƚ3y56og ٳtu鞻MGAqJFQ>굝XBt2Za/-]K       LoBA=a7iٍ7{ᷩƍGa媍29;;=i|%h/ =;\oWPlx*IL$'% r ̻@@z e);u%AQ!Mf 45AQRA֬&:Ϝ9ZZ[S]}#>n5NT{Ŋ3g(kf"2 @3P-tq    `EH{ņ JS1]dČCPlpzl3KacXϦݻ=$D_s_~rPu.*g/;%$SbY6,ԟpA\j#Ϡu0*KKy=a͵hջ?1]hl\F7 @@@PM%@;XXRRI 4!IDsNTWؕE~ښ|FcǨZt9RxeoMNgi MqqQD6zEnf˖P(oW nFӤICwIbEOI yd!۶]UykE&_JEnۛnu^ov@lb =NV뜿oݩ^7זX[[OӮ IDATP2 :R-PLEeC_I\?{!gOE)W9smhLP/A%cDGP^u͛ox{@@@@KXȂv(MD8llLN\P 6rW!I|Bл7EsOeLP,?qL5DQ#C)66zi# ȞhO?2}!mٲt>|fe襵~Yd'A|T&zGg aJI6%_ 5566})^R"(|g:zt !zΙ3fͼT䅿|DEFo lE-}!?}{]DEpu|I蔷+CĞl\+s8T:r$jj/y7rd(9__}ׄ@@@@@@@L%(WӮݧW=8=mmJE.\q7lNIId DL(_|L^CåjzҸqBeEkvY{ &amaq?zF_ni}!^z?S@O{ '"}?H$d;]g 74n;Ic/botB' 9\[n>F{ECQg$X]]na,"r0Vbk>[x.MSh^!!*:xKs.Ss$J^Qh?bUdȑaW>gפ=/HÆ-&WlAҰa5M.z㷈!oȻ(7|%IPdѕ~R7sqqBX.HֽMJs*æ}(ąB@PdQ;55W܇sGDX9" s{{NlcE%bc_B=hcihͰ[)ߗ \ř9Xz$F>E}k^w <022HTO *KEyےJȞ?CӜ['64A>\AOQc Bd jZ,{~a    p@Pk^Y,.r(i1Z/[{Ŗ&jVϒgg7.NlemMvn*_ZZZDlܘ(s#(r'Z-—KPpPߪ:'޽ _k;8؉߷l=@Vc-YBx!r3֨źn;@_}Z-Wfkuau7)9[x-v={O /a4'^A*23ܮ]SOlmoONN$aI I.$  `F (f`)    `F ( hO^D {P#mn ~цDF*䃶GPK?~%>6cEϗSPW~m.U-k !! gWOڼ9AcoK.|[_y]O=z.ujT~[ge Kj,K˯K(9t8xIx'U麩^A1/¥Pl}I9ܙcڪ1F  =yX:t! gaCy9yv>1bA|<:,6D3IP0~=:VH'ëV>>\(m>>B[[DIqKn&̦7cF9&{IU~\rqvO\I--5th@@ {Iđ@{^nq֬&Xzv#(xbxWk\]bWŸ   LeR.\ @ =2܂س}@%)(nOzrU+3ˍwB=8Ə|"itq:w!jm%{N('jD7Ϻnu_1'?| =--IP;O[-!n    `9 (^>sA ux1^㳩WIK (v @xTUUK/t'yBڱ(>EH7\C.zyyR""¢&MJ~Y1C~ RC}#E )׎-i9w:AEKӧj\UW 9'=q2S^yqЁ~t 1:n;@eUM06N޾wéo_O*-mTl[h?rK9 OSˠF8aH]z{hi#G"#f,>OCϥ09&$)MN?;xxs߾mE|}T]MN"_m35- )66< |LWSpNbΙFn;&8#pd!TEy=I9O;w5Aأ9FyϢߗ !D\yRSsc -¿P,c5tp蝧~։t`2q3 )6&Ro_өStB8[?[Z(),x\HS90LE6-- o_8ȱMCcb/rJ d$<݀߮# P7߈7HY[0KٹP_b${xP9B4ۉ+įaaTӗ;y={6*KMyNن,^LV66TTTFYظ($Y$(rg6DŻ(0PS@72 thccMnTPdjju'3߿c5Z!-5-~{~܆پB@dzgF+?Mx)W O>)q|jt}eѾdJL<+ ,~#ϠM^FՕT*7l`h9CPVn{wwj(/fD/Z$ޗ cDkkBC0O?SJHGJk/~_Ug\33U|-aZN~j 7vGC{o>6oٯ3]w] }kCPy'~{LX_{[v   fBŒJJ؟LQSʛՉΝX'x=v< ^LTFU99jM41Qx+<Y3rf@B@QkS9#/ ê٬mm3PeVx]_FIPêOLdOŖ&Uqs搋z%y6ڻQX!v'<)%Ū:_% mUE eÇ E( W/ۏjrFڿ_I64rdUTT(G]3ϾO+{I0a\EYdA={N ewܗP]^^M?J3sN.W~'>s.FN:/C壏Νk,xȶ|:t8UѩS{M$< V΂#@4ֆ:RCd?SaQصq)]u0@x۹Q^- B}s]_ȕPKeek+<͜?glQ_{${ DeeT.un*ߗѣh̘Hfp_@$`NEYSr!]Oy_'Έ囹SF6; ?jkG=LVYQC_|xI^‡b=l, !Uյau?^vv~ƍDQAۧ~Oͻp)*#/Q=E? 'OeOP䇽=aGAu,i!t:8+?xIk~]x'qUW *c3mA@@"E>:%"<@1:,@B|aM͡(!x35 ~TlAŞTdeEQ {YIvvf*1ՔLٓpC 1 {04I'㏩l +SIP:rCtH:^cő#CISX 7Gw~z,pSsᖍrz=uSG! _Oq#d_%"_}CoMT!(jJE\`>/{aB%_=Y`/ Ñ^G͇ml6aEYؓ=8l\n! C0".\pkL^VxɅ2|>˦P42}$>ə~Xq-S-Q^xQY0'AQ48J!""P<3CgOy䂢 ,Iߓ=wF2=]\Kv|Eo7tZ$߉S-bT=/gjI}e߉,>+Q)? OU]]'O}gs?׊vax@@̓E 쩵k)=&Fdo& D1*>|XxϛGަ술ȞC!7tr*Q"{UO>2IIP􌎦)S4HZ++W=:JcoƾcjڂԐ凬 F& _Co'SI \'1mg[_^7Uź>|ZCmw%(k3g"͚[W֊P$?n{0<2do.(U"(wB$xHơ,"rh<+5JA^K4%9!~4J鈠hNeqwSʹpEGC+jjnӧҁ)T:{qK~\((r_)~97w5EE{^n|pB$T9YԶ vTG~#S>S ق_2ԗ&~?lG/E%w ڀ(Al׎ 6D0g{{'!Un6BwB0dm#p"ʢ$(]=yDhp"m ((Ř9踺51AUT$0h},""ݡ+ a>R۷}KǎehH!r+r?yC4AC(+{w \wWp4dX(y"C DP,>_N+WőbF a϶ĤlP[%Bس=i+ΜY:{\}uj:"(g9_DvUmY6 Fmy(J}ĉL:x0E䰔" @0A?dV}'W6\'%+m$n5z Y>ɴ.ۯgD%cKNd㇯& sye644}:[P\ɳyyIܼo 4yJPB =]f-hʝ   `>,JPd7>!IYrJ1(d_b*9(UfgIye.•YG8D>4O^-RK4UPd%\bxqs;w 4:r4]#qq4xP:$(r?~msp5'ka㎽!?= UV"(J̕p啗C3{I,r'yu}c)2}?yTO;L>{q, ̛ĸ39_ 5 $q>QCAќ>vǎ?.]sg6nl" \sPd+@ h4i-ZɶGPɤロnKBT`)Ѓ3_?U!4?Jk>U{3_҄ MRYY+5uow3k{o{OAPTp #M \$!!IbUKY8iSQZvZP [n1z/ 9!x0I6eT=yHtѣKyLjjTkPkpxM.(rcƒLUE)Bd%Ak>yN'< pay)ϳdӬ4}V@0^\Qnp}٣eqd;w:99?|FQ Ҙ1'Œ܇8Phm? Bmo'kkcSumF3V_NAZP0G0:~sʟW6}C 0:~ kF29娑U\($4#l=@5!Tx ՙCk9ܙsX+"2GOO ncC",7yvh"+w-_T{fE>/GUYo;6ڬ+/ʢj+O^ vH?SOΡ#B5 \ VʏO,(XzOnقei詿%Cy ݌.^WjN?~{Yۮ.gƿؠRx-r8Ґ4Kyk#zMvMhc=nO?͸gD 972{e6k*\͝M|H:>;UHK07#':iɒjgM UlAc*1skCŅKrHFɸr-kFЈW)Y:{ꏴ7Сéb~RfV<]f8`C{{-srI^l{ZyEPnBξ޼gP1Cj^~J,>SmN>Y /ƈ1ޚ|#M.(Jz{R\\V^N. $ I>.FSD}!+iDn?Ƕb9BBI=虼ʳJdd/mHsB?~%~5kzqV{NU_\P<~ O9s&ҬNw?תtkRoBVg6K@@EІ=y_ {"5 ..n@5Ep^ä(eZٸ#."7SEkf/E;CGG!Jy'O#(8gBx6h8W#$(S"  kC% \Pm) @.%(g-~_"{QD>",+Ѳx[o>- 7můI7'& 7-֨ق" `\%Jl.^xM:k5`KK oY7FUM|ǪJ ^1ɢ)/ǡ\Ȕ'*.|1칁Q^Fxo\5.Z|)17yGYDut$ΙX_^pT6dN?/%qcgΟe.!!?á?rA1Z[Zh I@~Shco<~ Ss:m iMb%jOIҢE=C99;PÛ!*r3ܴŔFn3-1,ugEY-N5Jg)>IիA0% (vm@@@7/(HHU=qEؠ#m &cI^E_W bBwJkh\9&?_ >0bm SMa!ȢM*/O<y_tiGBbC2{<͞6~rrF(IOg{|JKSY\mq/}ʛQ2td8wsVҦÿ$q_k޵t ếvZ@ʇaҼ;bܻPjyWA:"eC铏QmaDPd{ٹ" k#{j܇sZ26fe."}YTDpaG?px~${;_@g0,LO*^[|Nғ,M2 1⪕ixkrE}Lmpm> ~9@GnI!9Z_b\3d7e߉3ͷUJd.FF9_۬'s:==OX:e8({Fц&n]WRBMUUKSg4j,6UWN<Ҥpj*LHM}ӧ',Rpp_šBzr@6+wd)U Uw<Y#ܓyb0[#_ 멮FY3U3M1!)[ݝW9e,75sP}̉ еIP+kjꄧ!{zzܶ*^}.S)JZamm=g#W' ݮלBc񣳺bJ    Ѕ (v!\KZ %25w{blag0/X`o>Ç<0$A2ZVF^X   Gb籴N9#B#||Vx'Vm(P.!Bu"埓*w$t""* %%"G${cswEfi@{ @Pl/9c%+G1"݉0?b4(V.w9n (M3%\R!ca MS#pTfeE\#@,Eθr.R~w(^xSa Le~LW( [ԗa^C[PЕr pǏSev65VVl4ugj  A"not:1 ˨^x)# m`GG_#Abd@P[PQ!<-WmL*8o{@@@@@@@@@@+(Dq_?\{goJeii"0{;:r~Juc:2\/vPF9tǗnqEU`0sIJAs?6&m"*蝕?Ms2874/r ٳMZOӢ*Ҹ,%)@@`(ro.. @@@:@~7;DFmɡ3 |@ ":rmavl YxXqhhgh;n=[?x(Iz,8rd(9;i    Y (vI   Wn˫iStx7b`FPttd|b 7톘vU& & , z!_ZPϧo4 3z(XBs\ږv)9S},91SrGd4i @E7@@@@@@@@2vAq_Bm吸T,0Q#pa}\8Dz붃-jKCeN]8E>!LCC銷EO5.dJ2JYVp"C۲&:q2v:A5iX?}5@#KiV׷7D0g.ZZ[7a[X]-1,]6uCuƑEC&jA1?ɓĹ.]N%byz:ݲEef7}ںR+ ϩEDм;& @@@@@@@@k tȗY@ IB\[TdŌ~d'І/<=/OT%^~>#Fh_B ƏEOZW M* tmR;%"{%x b4TXXJёa~(.. ֩m$        %BP= `GBBUVժ/F ѣ˫e@QIիE%g0 6Mc,4eb@rI(srBS,5m8?vi~~=Ɣ\55tXIr GEUם-(W{q6^R"(6VUQ'q](MkT:w Ih3Y\RRI٨1V7MQA"w& @@@@P4=@@@@(km,.i14&)II^*+E M]AYUUq;i1v)NֶrD*yܬM17ac1矩UW[P{Oxh``FA7@鴕a1k5+23p~>\EEeݟEN̘I.pc   m@@@@@;O}19'>X)+~i_\ \\DAa.(꫎,XYQؼy^jj_dEoconGfTאUx|;WWqmn^4phfm,Vn汶[[[FVɓkp"  k1>   fOo   BG ڄ>[d{\E`W|Y d:u<{x)(И;W=1|]xYʍǜ_~ ^^BP拏R޸ >^A2mA_g/DNuc++q=s@@@z&=s߰jj=VP,..|Ι *b, :w%{ ֗-**K6Ϋy";   г @PՃ@W豂ЉH>=G@@@@@@@@@@lmmD@豂bף          (PLbTh ڻ !!&;YCd*aS`*"X[E?jjm+XE*.E.K1HX–H~dLI}O{=un@%,uk-  R\ 1:6t@k IDATS@O(.C@@] NdKνp^"#To۶[rs}ꎈzIiyqTtҶRp  P"  @u5Pܾ}<̛ɣ$ݺ;fIvvO͛72R|t뒔fҥ<6cB&@@@w@@Bg8矖lC_&F;U1ʼWGR? uRur4  PbΚղMrQP;P͓[oY(.F (E+񹨩zBdkj< @#@Xwƚ" 8v,zϵ?wVҷOܹMg̚lؘHh^X@џw+V܊ -m1 4@@"ȣ-o,߷>G5@ƍwxh|V9pOK/Oʗ_m$-m\vm']v4nYj[+(Ov˱' ʕWY ڗ?^iڬ?}Oll'ӆeÆDټ9I$//_:vl%ݻ/0e׮tYbm2l篾(釭CZ[e}i5K]!!2%,~cϻQʾ~\ Mm:04 @@HСcҼy̗9zINN4iP EkٲUQiGuf3 ǔ)׊Y6mN^xgŋw}cO%mESrɧ-{KJs?Zz(KjA_U03ֵ9s;K_e1?%]mLJY7mHf> {maK_m컥EJyj! Pkـ\@@ ̸7 /wMFbb:(L/5 /X//LRs@Qg=z_)(歳;i \?uN_X@񭷾?YU(eݺeQApT F{W2kzeʼۦRa BZ8h4@ ʲiӏw.!}e3,sKtٳ2{|.'^%ITCyoswgv5$66Z~{VdUgN:~3e̘!zu,{\M>Cow9a•f9W@Qbٳiκ|7vY.QQ U3Ac/~`p DCS,]c_].W>k}O/4᰻\e!gy|^JSCbϢ`hh=^1h`lsi3| @m P#H@@jK۽g̟$&-vˤE(1GhX͍Eȯn.NZ˓OL49%oV5"<0քL|^Y 񺵯^mM))-CvZ֭OϾeWENy=兿L1'Wk),|l9y2|\qֵTG{;vl)O=9I\:P%eQ<@ (# SVڶmhX#΀p󕢁S{;YhV^lu)q^_5pt;'a՜=m5^;X~9fd3hdk6;36o4:DYs(>ĿdTjѰPu ՠQGϒqL:Ǻ=^N)kƟY}7/! PqŊq  P'(WYtF[FHtt+9q",<P3TF^gK@Qљ$$: {˴i7xh5 ZQ[RԞ''J3oR@q=Zz]_so|5fÇ] &]U^EŊW=Ѡ uF@ 5E@*&`@qσ9JY_ԜZ?d[nK.SnB"69zYyrmҡ}C3&H.mob6Kg8l]&b5TO.4l@^=^?iZ{s3Fʾy+W 1N@q6&{? : go_+l%3g#2mϿXoeуT5odYqV2HuJCAFw]/esN"#xܗwm1i7J;R'K=D*rQ@I(;La1TRPP(<ѽ"vm[3:YwcJj?! Pk(F@@ l2]^_ңGINNGoTX{+WnW}*:4i0o@Qdܸr ?]Cy&޽OؠA̞}4j@֮MC2uBPj̓r9^͝sψ~^'\˙]4d{[ E3EK Edݳg<K|3?~R>dֹ˻~#~T䠳C=ۺeI+:!nΝ\ZwC{Xt: CQрse#7KnW_~,v'GGIؑbhyYIzկhٲNCd=^32զY>`:PܟQۡakv-̸h(xՈ8>=d=/ZK]ۉΒ']q7 >311q<}{?x{-_M^Xi\tY73C+nT=t @@S@@@ (בE:s/?m#?~uT?2_tҊ|3`j,<8eIO?\ow3fL(?t?_xp@xR;P0_S-fN6{*fefz +͋l.5|-nay& >B@@G@~& /#F[H,ftIhy__َң{yfg.\&ʧj]KCBJIΰ׿'6hH{tUpwة 7 ի[l,]V н{Ks[jȪ3Rs@+|"_sy㍗Y}N}~L{곎{# fg\VϻQ|P+r! 6 P,@@ v9%rC!ΐ+l}2:]r۶mskv aٞ=TvhZ/|3RGDKӦU˦mo:NE 8T@ѡK@@ (VU@@g (:s\  Pe*R  HEG+B@.@XuCj@@(@QO  @H  8t @b @pƔ!    PmFK    8O@ycJ@@@@6jb@@@@'@1G  @@8% T 8N@qCJ@@(ƑZ@@ (:mD   AR   0E (A@%@(IA@%@7  @FIE  5t@b, @pF     P L    8I@II_@@@@fjz@@@@$@Ѥ/  @8%T 8H@AIW@@@ (R@@(:g,   PŀrR  E %A@+@XOjC@"@蔑  @ Ju  C2t@bE@p3Ƒ^     P#5C@@@@p3Ƒ^     P#5C@@@@p3Ƒ^  PR!  EG #@@/@xԁꔄ7i"aMQv' .]*C@!@X;ƉV" 5.Pům#G$:{O(6K:\~y I^Vwظ81ϡ2@ch%  PN?"ظ7LztqcLOą W*6P{3P)W'Ⱥ;%77_BCXj+N̖|fi+/vϒ%VWRE*Fi%}r9vJK.˖\KG}|#6n,W,eK>~u_|QeѰ4̲J{-֬+}ڨ5i"Ǝ+˒ks;vh)Jlh\,.@@j Pvb  hunYrݗU}>eKJ}go3ic%~ϵ&4KL43EGKtN޺՚Eت_?i3xϽ@:3QH s33MPչ 32D:k9ud`[޲EN{W S>LԢ39| o\r22$c=vL(MH=Kh_Z`feߵKZt&e1gܵ{u21ӷ )͛UlO@sԇ E   FСcjuYj94c]$<~դ/_.֮ zuW4|7Ŗ-^uihwiY-9=v/\.i-vk;u&T+9鞋Ǔ}ӰT=rd'AW@@  KJvH=c}c* 2Kz#۶5TtF⩃Eo 2eHXXKs22̳tOf$iT  P ('! ,IA-3gg.ŵ͞|@@ (Vݐ@@G @Q3 FDU(  U P!5  pBl IDATȁS  @<<@]Gv!  P ?OG@l+@hۡa  @P@@ (wlh  L`l@@@@jb-0    @0ϳ@@@@elh.     P >F@l,,6 Q@1<@G!  P =OF@l-@hq  @Fσ@@{ ({|h  ,`\@@6  I@1H<@G!  P ;OE@@@@V (a    G@18<@@@@Z)@X+F#    T@@b!  @PC@@ (h!   WN֑B`!֛*`!IENDB`golang-github-johanneskaufmann-html-to-markdown-2.3.1/.github/images/tag_type_renderer.png000066400000000000000000001502141476711565700320350ustar00rootroot00000000000000PNG  IHDR@ |sRGB IDATx^|S_[(e){ldE7-*2]z][čp!{ޣKiipғ4iМybrrs$}32I@%W$'KrK|Y@f#@@Xر?ǜjX9e@@XD$/HB׸"#)@@@?@@E .^D4-esBOA@@8@C}  $lE Pyܹ@@]I!  I^>{ @s$H&h  E4,@@@s!:?h~ @M @@hh1  A+x@3@@@@J@%&Q :     Fr }@@@@@R$` 7h\Rtz     Ĵ@\䕭$qYYyqYbڂG@pN@JIUJM  1)yq9Y1 I# 8/*ΛS#  y w<-y#  :oN  @ KDbրG@pVYojC@b[ N]}p  rS  1  8+@7! .@w 8,p85\8k:@@X ū9#    #1r9M@@@@bQ4:    @ȅ4@@hqZ69@p  @i -WsC@PUpH  @) -SC@Q4 DŽ ^{m93@@ *@pP  @ -C@S4: G Vze9/@@ J@pX  @) -B@U`oF9*9.@@R$@Z.&         Pj@K@@@@@{@@@@Jh  AVE qT  @ -]דA@^`~WZ34/ Rp9@@$ ű" %__C KI#Ҽy}IN.x  *@C@E40믧ʦ;=j)_>Qի!-[4MJ swutؼp֭)ќyfX!)J@pRImB@ {;ΝY)2lRZ(}I,Yj^}בG^ >DzhZݻ2ܨHO&> @_zqT\c>yiW/:Aڷku> 3z㝩Z@@b[4 oT2fddʳ}.˖7s %xPq) 䞻.&    @ @ssdtYl xswmfI\BvZP\)vd޶To׮K^N[Z,_.w#I%fMҼTi5;wٳcu?^VX`Ȗ)Suz2IKMԴDOM{͚-mғsz8-[v MQJ߰Q-iӦrr'ƞ=gH vO%))Q>4jX[>wYb4iZWTXpƿ篖ٳ5[q]fm#2ls9|.<ګw0*iӗѮ!ҢEYry8]())<|s'I5[Uzuozq23ͿuQ:qz/Y'S. w&=c3dep`^z/^ZZ^~]1/=V$oA4=]*Wr\gl   4'7W-Z'Ӧ-WwwPah7^K˚|y ( 4'La2sVyOeҰa-y lڼS:uj.wyIe}2t؋f*<"EV)T{ZM2n7/u8yf^/ݙ?j5jTl~ޡw ?MQ\ƍ;\H?^իW-.viӗ#8\\rɉҸQ0Q̒'Ԅ槞,]z/1cDZZ4< CQ{wӳ8)l޲c6  qCmrL  ~ @wkz͙#`Y*ҕ+ CjI+p?C]}fHṇ2*^eˡm̐6&M2vX97F?:L|g tn!ݻI=Wz` ^};3ܺl22zpj up{/OMP->ji@ǎVHC}5Dx<6%2vUnWϘT^zKs ?Ԩ۷;z/"1.*1~p  Qj@8ebٲuul-k~{hsrfkFAu>@3diha# ƌ1Jkv$O<_ hb o2sr;oozuKmL @oZUHÆ=tLJyϼ?N7r!8xs&4ސg#}k{/[n}A8$=x64Aw5{Ci3.$9 b陨Hr^z a=w_aa4Nd2j+L-Uf\f}ۈ 3tރǟ e߫<~hRL=$$k}*8 dؽYg}_^}tzӳ*ZI' -`iИ<  @T\&hVOzlmp=4i=pMvPvn/7neR6w0bChx;t+!:兕ܼ.d7ͿtرS2/Xc瘽S|- ,@WsG@T@ ٭k+^ MjVwګY*Sϝi\{P Lux-osҬuؼ'My7mijpbͥ=^|5 [7A…ko%tc]TWO_Rf(0Wqz5g4i׶IU { x9g@@ rQOfhҥح+-k4]yٚ2d9yk춃KB9Whe?}f+$>1Q bV=rDj%~|$'G/N7~QHzKakP\ڶu83g<ߣ^.UT, 5[f׵V_bbYꌾ]kz~a @{[n95{vJt%z-=nUժy׾X{p?Ӧ-"\YXӫ+{g/2$<ů&GƍI'E~ [eZݽ)bf-B[E@U@@:CYǤ} %4:}fIHJrkyfl,+?̼n^ޢ-/\_HrEk(AIZHRR),!򺒻ZthNy/}U?gvٷo+`|뭉2yy_ò!Y[ͶC=/}QQsڇw E:Gꯄr}>YLʚWx^=yY{>ҤIݠ>p{rt]xAoԱ+6e:c}/!.Z= tu^r-8e5W6#   +l+w/\Nޮ48v(VT[˒N{joR;J6g ]Xu|Tlk諯~'N^`z|9һW!iX:O?R*VL yP/}azi]z ֢LO}b9=Cy[ +YOj矻D_?f_|^oo߇5ǧqb}m*:ŀy½rP>-w8z4өSs3G.Hl^{Dj<&=w+-ArE>etVnL9m{doܧ:7qiR5E4    #%"$ge˚[$-y(D{w.~ujgoVEQ 믦Uth]5ڻ"Gi ^4z}QOCnyބxՖGwy遃r}{bHnDsS5Z΃xih F5U/&/\Sh/0}Ek諽'P V=:i||CC9/{zu[塇\ShoZǧc^my {PM%%Jͣo.{5j*z/={܇lq:]h*Em=C:'G@@@(Q7ke_}}tz}HΝ/ܹӼNCO{ѹu1fV0|ϫtxYvt@ $JbEZ*]FZh`khף{kھ'҅t])\=UBӟʖ-<`nBP 漬׼7U4C>_OVb}n^:1_yMu~SѡÇ_ ݻʴL4Ot[Ijʽ^v;$l1S? Dl8lY;@ @@ TW.[TW--E:koMvk֬b=ӏlԸT?jqy霥+WmJK&uZZEA@@h@@&c+Lʍ  ~S  (  @@#DYM$NU˔brMr!SԫWX];ʒ}k֘]UMM-]ٲdIySaKw`ٻG=5jT֭TeݺmRbl }닜^z~dQ۟.'֕rƔ'jF͓FjKRRb tzM=d/e$HϞ݅Ey|ElԽQ\~3Αv(@?ڡ(E66mg9@W,?4;riEA&7;o<8s{<Л&\=㌮rէ뾋cg{/ͮ:QWSOg_7dO5n\GOo&Ր'>}֭)gE*VH2vzzѺC|K֭U#Gd1ɹJMƗ}Dniq~2a s7ϫ0Brr֙]nQה}_ ZPڡִCirw D)zvh4bm=w)GA]o>[N>#G~bztbŹbW `΋4R9NH6la`ƌbI @}YjT, H[?N\6r'|?C>h^x~hAlrF3wy5[-5ɕ'F~"YYG{T9w 6u DKJ;4|w$ {$9ۡ K1"@6>e&-uj!jUx;'R'?EJm!F0w3vh>¿OOKDc>yiW/i߮T@|;7Ɔg^N;s?^jR÷r}^.x)W/bhӶt.N.8/ :+c0/>C'wr/Dfwu`{C=/{ڿ_wsY06 \tщRk~p] E,]A\xV:mB9KڵFǎR)sa/"i)Pm\QooxfN f)篖ٳZtۮR}Q :ϳeumsl}Nh's y={ȌLVڿ<}t>Z.fU-^N^a sπ&H|^/)G5ge5ƿqr=B>~LYld6GvՕ{seջ$$M7>}ڹھ}s﫢DzHaC!ԍt~>`4)<؍R|>?F4__G6lkPP @vieBUVT^{мk~1c̞E.AK{VZ59{w'$5;vt?ȣʑ#9XFwOjU+y-Wl(*AL n~y>8r5} \ @5מ. 2*^S"߯J3̼U{,?8O=8s'wM3Trrѹ"s4oVa ~+]p&>>^8EoӖ̱l@Tqfl"+?u-e/AߘW^=[q+i7 o=rՕYguso߫g\}Mw_j+UF[h 5E :wKeރfaCϓZ>BMkg/ڵ_5']{<'"O A v(PڡEOD;4"vCg/q)6mZ w5:;= Y/lڼ(ݿtL<$OvzjRnu.Ҩ/r4zwH8E{>]Z˖-#]z$%'t_~ɦ[q\YhLD6nr]wthT.=P._<8̔-S.ڢR69qll/)sgkiӦ$kf36aP?O0i`ѯ+0a- @yGwSN$ݺͻqEzhP } \\rɉG8|S˩t4y'WZ2iVZi$ujW3_SZTwV~/C+MՓ.m&r}{br姘^%'tow]嚫}P~A=g =P?.ѷGȝ%.4I{Yk8)l޲ڴnd_kcum-YGw~4{v0L)˃_sZ^][ǧ|;ռW}w%& J퟿ڳXϕ*PF=F+ |TXw}~6"/qrrE(Pڡۇv@,C3C{ŝw>}UWjFP @xH dm`P ۆSƚX#Pw'#K9= 9jIڇ [`B(__Xuy]|IđOl\SO$3GQ_zf^I;_/ ak}n c(ڋ*x ӣ05wez+9yot@l5Ѳ /@PڡMgڡC=;!vsύ3O3uם!i E;aCϗAf^ntʨ=rD,`-mGy=bQۋ7O}'x$[MGrInGzO:"!P]S_6~ŗU^4DӐI{YժUUrrr̰>)rxѵ60؋ǿwiV;}9r ` =\zI>q"AC矻5X)epҹts=PkpRg,m2KA|{e2bo߻wjށ>+Fw5;J^%~XvhsPǟ MC{0@{ĖIH(kmN^": ~eYc@VAD=PhpXPm,NI筢C5!:>he+Oy.]'op6r ;W[r-?_ ?7#1߰]c,_?_.ztK&MreӦkW_y9Mv6Zpd}9ٮsvk*&-cp\ Zt!b}pT;:Ta"6X{EmCύQtz@xZ@Q{^zrS?EO#A 0r EK/3E{k>P-~g8P~r{ÍOyO4x;LXpÍOz wB8꼖:0>}E]žmtι=[K\luUTs1&;7a6C˓+6r.Tdo|!Cjuw{8fy=EFԀ^ՐW $\5‹/}a}zpwaׂ3yA=(}'ױ܏ؗ_%kn1s&nlژ=jG6lyL˵sjyR<>/^Z4%ؐ?.a[oFf*aZ~ mw:|(Nea V=p[51?$S`X̋|mR' B4Ci{39ٮ#v+vܵOtdR~o唓;apmCXq믅SThiN5W-6*(PbP|j/X4y|zݽ_txS-3A7?kAT9/z-!= ӛN{jb+[; a~aj訽.|=Mkfox2D'mu­GWn?tқQ{>] iސ<Z{W,0D@ZڇN+-yj3'g e+pM֭SMuK5'?gf}^,_/'WQosnbE\Y _! 1=ѵhw=T{8{z. E~|r=|ZҵRS|^p6ru~(d/EO|뫄;'L_{^U>pGO ukezp[kGZ\x7-NE@I@i-dv+A;T!>ۡߵ;b/D3z>զm\2Կc?<|m܁ןi PJlZ7]0]<xãh 3Mwtt߾yIu&]X(1#=ߠ`F̞,bNn]Sq}gn<{BHfz8v3OӺ]ib0:Wai&$;<I-}ʁcQ!&<z7iKL@e/I-Y⚵w yƯ;yB=מ:mAz M4WzkJgV= $ IDAT8<:e/ Ag[Afm༨lȥg^Q`N_{Lvm$\V۷ m4v51> ߃ʑYpLc_2&/kl~B璀SݗFQ<]%=UMڡ^{aC'ڡCB$.Pǿ!η5R{9ihF6{p%fn{k]^a]F;$>5D@@PN >'(ϬlW͇uQ:$/W7ue67o)ɘ#dM5k yYskYx,]ރQWh]Qښ35"Vĉ&t/[Vrٟy?^43ͬ]^6{,?8c?]={kͰ~{D+lAj@ރڋW/w^t$oxL#N*W:?>? /l8uN^@ރ{k]c}ݱ}opX?E aiGj[h:ؕ0dئuc34׽omHȥ[e[ؽǵBc-溵k;/:U3}ZTO_e-2Ón;t1$ܾA{*3L= CS0{#b Uih(PWJ;4>ڡ}v9+?7 :IÆ宻_6qӁDkю?O"HmA޽W7޽Э'z UD@@Gʄ2Vj@kufޣGe~L{}Fkx_Z3j&qe_)Sر_?S `z| LoD%؆g0:CYwޙ{]CZ4ixL _~Yr$zuiu'G~2Η_Ta=߯\qũuYs]Qϙb&ޚhzjYZ =lNor_j?m}tҩcsc2xP, dhk-|TE^4rj9>Jj `N*nk~+T{?C27NWTeBm AMӘ.4h ZNW96B5㐬Yzڧ6;@L̅N?O]^t~O*:NA]V04sb;txڡCi⯽J;O/P$ j{}yk;Ӻ2v7ҤI]mC6t hO7dN8Ͽ0~)we䓃.<\D@@+iax ?a!*%%篔n_aE!h_+s[nܸ?䫯ҡCzw> #n\1 &0S>^.+W$P_ 3_+Sa /J))M!;Fg)US]A.k*TCi曩gho-aek!}.fŋȧ>18=5֡:dZ }eL>GPM{=̘p<: N7ڀ߯Y9*/nCoԿ[U`ɒty3[.p]{i0XXP]sذa}F _lpyBK^xa=y tXiؽ{T-䳫kl#WW. 8AN?żcnͯGtr~jAϘ맽fotv@s(z^H~ako=_Sq*g+tf.aCϓZ5]>-O@'O=co' G v(PڡCoimj>Tt~GFyچ^mCmCwTe}By $PP0a;*:lTo۲eG~qӠSwN.Li/<"c7PȻsZ~hJ:+P34^-[/c/j!+>4\89#Ti4i'TDYyXòpp5Kfq'WcF:$ W k~'*Z5w[{뽡WwjgА[79:DNkMtǣ﫸x/?oh$R3DV)A9yXw]Y+{ehc'V3=XZ齫q \a>ŗ9/ψJLoN6+?|}P sy_}ߦ}\( 'NB TwI;4v(Pیvh:El+P7mC6ﱶ w'Cʨ cv)%.cziG1|/={K/t:4Y!/dC_EnJ))x#ݻxcRoy?՛}Bteq5;涢%,5㏮k9tc-pQ{y>>1TvͿl zCG_&͕ڵ]VOXPچffs|;IN}9"I *P-##ҞXk$Kj}h/MHFTjPp,к4ҕ71_tsɨ5czshiپ}sQwW/K.>Jqz{|nڴL5᱿8[vܲebj8C{jfiִ^Tf5zj5ku迖X?+Jy.ͫ~[ Uv Pڡ/I۰*@dJUYJjGOJb$箋<(y#̄#AAJcZF[#&@kWE YGHkBs]%S@ V˕2 %$8 !P"hA# :FME  *@}  ԅ  @=  T  `AV)@@/@~cj@@@@@ Fj@@@@@ 7@@@@h@@@@/@~cj@@ p-T qc  _4Ԁ  `رL&@@h@@{@@ BZ@@ VWF@"#@wjE@bV4f/=' DD4"T Įh^{@h$ԩ@a}-Ϛ%lûwU"۶un;WޭeHڵV.^rHjZC+@(CicG@@w/3f,sVHV)S&AC>_3.!ATJIye:=zȡCk?l^+iqeRN6l=kZIӵ~+YY>ѡ48df'Ǐ%.Np ȣʑ#9XFvi%ݻJa@@@J"HCiE@!hNn,ZNM["7о\4s ʔ//$V-S6sy^v"z+Ř'V5 %$&ʁƍb/6a 4sĪUvҲ$+ܿnyȐo]i#52ppUK94wb0_OK֭MV uA㭮Rj4lܟpZzSԔ=[K6$!>t;8 @@4CŴ ig  ! @w+g,9sWVY*;4rzPel"-!芏?67{HI'ylCu8w9]~_Z_rTW0_@sɓ;'ZEօcǚ: W̒篖3^7h.[HiRFT ,(;vh4{86@E *P ҦLY,[Ԣëtn)] @C) F6]]nva:g%.,@!ɍI . @Tk)PΓsBӓV{*w앙3y+4VWF.@)Z{@J@T֜۬Y=ݳhQ?@R:cYLdf*_;J}ޝViB wΗwI9THS%t1f@JwܼqY*w?=]|EI 7 @uXEW~[LѲ/viN9k_=}A/@@R'(Pڡ ! D*32e2cR %ʕ+HRRl_xt{X_TZO嵘QawGPM>[*7oH;8N?=zz͝RҒ\f1PsQ+  @hz Ӎn@@ Q.vV3z0ՖnRMFi ߮ڲ4c{{4%E  d$T[-uw:={Unl߇_m[Xkfw]aYsɑŋͼyuZ#3M71@@ C=ېC#y7R7 @2= 5 ,Pwf39[]ʼn.\CtXJ׭5_}U)'Os渷+S [pkr&6QZjC(  @ѴRN;vh ! @ ?{{6o1kv$O<˭!nL!L-[ECʔ}r&[{jH>*͛Kxݾ5kqfe_bժRgOڪU@F  @a%1/@;7 4*n#RA!%;ެ}9jIUˣiqPHf$V"I5jxT-κ Ħ@i @iK;x=    PrJSZr9R@@ v@cs  @D@#N  @ 󀫲l"27*P=@3gejfifij9r2e/2>>Yp]O<s ? @@@,PKy7XɸET@ ;-Z2C (8 9:횗W@7ڶifվ-aB@%j )D뎳fU͚,mVE7Ϝ|ѿaFCxx<#=7U};eƊ]Paf&eY!&eնٶߎҕHS6 ZYBA@*Jō@@@@ @qK($$BBci}D M4=8nSnJ 8:kڡhSM;;jؽAc#OGIԣuch|I ѱW($$""ֆ<=h.֤:?Fq)Mu:PSԱC+kJC/ѵkhOڷ}iKD]9@#"p1mmkѨQ:INΠSZ4n\:s&8w Ԩ ׁzyo9 jیHEE ԥ}b>τRx,++oOVU?X4h@-zq    P *gӡt|!kD #kG{*s@O=g͛5^|۝j(5AE,("2Qk5ki?{Uew%Sb*[iM)<1O}.٢_EMMkݺ ݸ E^(s" ,<,DbQ#ȿnᕯ}:J66ւUsX.4"c    P,^eW( Sw؊ƍ+S OڮaCסeEEѭ7JJȪF j?s&հֻ QImQΕ`!ַ{&WGc+gJvj2s觟E󭷾սXةSkʾK۷#ηԸ<ƍwΝ5t!J'N\&ML#GdfЬ_׼' g!J`Nzfe KG\6Dv]xPjP>|˓C׬~MݒmظOxӁiO)ɷ;д, 8";w'S :-|NLwjWϡރ   @@@@2 XrKxڝ&RկL=s!֒)' ĉ[aakxzXrh?Ĺ<T4&6Μ&A$cB۷k@;@J),XZ:/ZF99}.cvm,B.K>Q/hnUe_JJJ~=Pu I8}0qCPt/L/,^hDE6篺@e8'(1)]fݻ^,2GȩukYIq1]ِ!">3T)*/Q5ZŃHNN@YXdF'bjjxK)~՜{ieo~~o :=O?Wk(11Mx*ITon'vVi[3u*rTEgƽ{SC__[hC9+WS/e_$Dy"#@4&90CcSkx7琳FA)i-?? "ݳ笜&@g7+SBPeVuS]ψf\]3ԿA@@@@@@@ X^ܴۖ++7C6WtW,E\ I*tL(%̐*"`XD7nO oS[}Q:k. ,$!Q93O?$+MBentjy>yY: R R>u-\nU:B;wKƍ\K+,6ĊKJϷRNn'շCCm@@@@@@@@2 Xz;'Ν ӧC Eݺz΄RhhڹjFzP܏P'GE`cosnGII\uJOg'&ޛ8a6WVV7vп:I[Uׯ[b@ {" ]S#owmC=Ȫ aEW<&FեCX<A#    P,NUt_;wPe O~\wgoJXMݻyښM@\|拏tSRWLlJto(## N\^iQQI[KU!]b.9:]%χS@@^۶uc^='-K.RlJ<==РF  OJ%`D:7@a1lJfogKo.PU,pICС} & S+9bOWUwI;G6o^*۫BٸWRlJtM%W|3WmM;Ozf1oXi#=5fe˳ )SPp}>XoC~ZXFUT J@@-vp jl[LLHx5J|IEEl*)*>LYSȳ[SZh{Yr@={Jﶶ=\ C4gcrOujӓOB䃃Ӆӛƍ'HqϕE]׫@9{ɒ-O1> Q_(et%0BxXٓnGD&"J8ꅋžTJj?FMьFU{h  D@@@@2 @CEH$oEE˗nS.]VR\R'` <{^d-%&ɞ\|t@9CS255Sf\l\Q 'ťݎC+!aQQQ~ -ZxE ?$mh$n*BTݞDeg%*oӶ տL[4CԺur?U{h  @q@@@@*Pfq,Ҫblҷ/5MmTB|YS58udj?2Ī94@@3    P V&j0WNNdKzԨKyAYeIg:P.UޭSxrcG-[6!UiHB`0`c*[JCA@@@@@@@t`oQ.ġ@G2&m?FDxJ At*Bh,jHHH? B]zR^'[o=0ig'&{Iä1xW#ڵ8}=@@,pMv\0\vڵmLO=/O-]ŋ7ӕпM>ʝNӦMՑ}5RWTTL-Lw=bݾGڷ'gYqb0r^zyeg?#rWJ ;yWh$V: @BB)$4>Gŝ\J+5mmpiǎ%fxY%EEjͅ\Pݶm}q}Ov-g Օ'e{0OE,("2QkrQZƟ޻uPɦ~e5+((~I4bTQOտ3*~˂E/h   x_%r=ŧmwhؾ{;v ++aN,߱W+³S S^j*q;܆D( UUFD IDAT& ⽻*d% luRnĿo?/ n 'J۲[VTb!DxrGG,"1z %)Y V QImQQAU2}!oruџU@4i5iJgτ!6hPz~Jac/9s IͰeʳ= ^6KMV7T9fZX\H2s]_6^쑢a٩Sk*/^/r6nJc+}އٳ쓒ҩ^='Z{ΛZxX-.t-,2ҳi^\-"M-[6 *qd@#]?fyf0ձ/ FRfڱcК5">2׹xdn 2X?YYeի3ޚM P=,kP9.) giFx81B]ݎS 絰(^wT^'Ϲd*2^/lO?VY4k&~q?ɔ(?!yӇv$ TG{ p@#P й#G/gSOH˗osC.ۉ'Jg J̡~VSAbϷNB]};o?&G_|x,ƍwΝ5tJ'N~O4F(Ԩ73DGpd!(~};ՠ(:|ޡkV&HtJiO)ɷ_)RIG@@@%`hJ-:u:Tx)pY^y8dGiV\J1@yhk-̘T)gI=>YaEVQqaBK,\q~"G ꠨\@5=Q9L7j.1s {!p5tk*5M3g aEJK*{oB A)gv-~rW?$ w߫<^ nZ]\9s4魝~*ZCfk wB&{g1Ȣsc }}TPnogKm{O]"ďS|a?Y̌S؋Zi gET@O=@?S??8-EO?~ִi#%!)PM혽{)=$DJ7"=S/jRwNx@T%T h޻OWsڽ ˿{aExh   `Y,N/z'NQbRi8+ޭF'𱸲bF7&%6`ga '2ElJ#S,^JyJYHaÄ́ kTiG.TjwHxr$]xP~Ep6IeaFǧқo}'zqԭ*3gBuV g/ C pYctb5T` ŝU/t~_P!4{t8K񇄮t$Yh%2qU @Y?r+{x{BߩDg& 6mWgY,4**jznji/*CH_+P~_Ah?cF%Gzhƒߩ>[9ytu!Ji }NI޽|Լva .(gWT{֯[ }d}D^R5ݨ4lJÏ6poeYմۏ7Rӏ?c5 =||[mS[$^+s\NKT ҴzGp ЊV sCnzà-{Qwyj%BZ˲ 쵩#弟-v$QEiV>*4Q >SR-GPt@Y弆ߐ@{Ҥ<QmϞr]ЖB5䴠 X@ې|U+o94rSi5ŕY$'VD;Ξ]Tzx*=NwrrTaJejn+ O={DD} ,"«0fiіG~*BI}hH72ȔtoҗcN"(>Nt7".aDpa"6]!4m@7zXd5yX|0aYɣg~%ݚu);*5OιVxp(GG\m}DbYa|9m!{m]T_3nlNٱQKC6wx|h!AR(x= ٺqj -ϫ*J3HyΝ Dxdsg9da  $PUЃ/RݟYNCӾ﾿FðxUSPw~sOQ4[JhWT4 ~r>P6IH4cukkE +a}D֭-R @5t=<,Npsi<,zQDEh!HF*"j,Ƞ H͇L@uFʹ1Xͩ3v;^^D1V-Kh߾|/}^lCy4Jy1D h(lK믓r ?%2'۷'>\p`拺ϺP!FR@@%$sn]= &q߶W"Ο)sb^|^B<2&\cܸ2KtyrrG3g]L@奥QmWWcX9Fxe;r* 0_ kՇig ARTJޛ:i/SP89zt/k9EK.ߡd\uJOJs}W\NUiVMǏB5 X@˕ɹqHHڞpo(rq*ȣy83ELjTᵦ&>Z1#}N*dʢm|H\H /e/6SPfw3m(4ZYp@98ܝ$cݻw$;;[-9!}guH_Y$e[pGgS?j),l(+圹߈CÆv'4$p|{&jG/ޟ[χї_& /+""Rle Yd|F8O \ENq.ϿP#*uJ#QR"r~[]vЄG)iĞߚ?O@5=M@#v5}+Vx.]DgΆRPpZ1n\̬kN5a3v@*])++8@#=8ԚSww ym.~j R^KC@JkS=++Ps}W2sQ3^2;<@M=  &@-+ Nb(磔7_H鑥 /U&{'XyfaI-FR^*7+L@9ڕdXeS ·ӎNCbՋ(irQV^[R ?nKVV˳׆ gyHVHޥM$ W[Xu bQ=bt)-ťлU*˞f&QueT<4ʚ) XHSЩ!7P)\_zSu_RxC<@ӃLÆ+k>`0E\ӗMRZ` W [QmJEz"We1@U" )Mh ›fbw"MbOWUww6lT>YU-7ᇌ\I+dz)Ps}W͛ƼUbwk~'cC^$> *→8XGw"$+.,b`Af#R;\e^^_@y[QѽU+19w\͚Q뱥L@yLIDH7q-[T,4Pw9+=}Dw[Z}h?o={jソV֜3'{Kqu_{Bq[Hqm3Az)<QU-{rnGkސP 8A{lWsׄ簲ś"/O"0[NDyM/hE#U=sGxfrQ3'UM91ۤo_jЭ<)h XryJslJT*Z.;W$s0VS.ܤw]+F]y&MWSPeQE~9gcrO^ aoVht/cqcO||]){ͽ@yo+{ ٓnGD&{j)E?x0 @ճ\'F"y{7- (ơwþ ʫġIZ?cP/BalZy=\2U*,vX#-07J5XR\bP)MJY3wTt޼Zo~'G t͚ބfHkbIkozM\ZI: *>[U1$ljoFpbHy[V?d5o@$z=Uh?BYgSP?7e6ƊKJRU?t2?He m6Okӱ*}8َ-P=132dQ*Uo:p`x!,8(}eV-YjʞycǪ|q@6UW^`fܞYD̤ oOٔ&ּ{ΐeF@9 =66E}Uw8I[<5~ I9[ 92Cr=xpWp+{S|^I^ KS[1tǎ^NfJK~OCnC'fvlהkڮݧE%V9s#մ,SB*r' #C_u.«=ި; IEL>e{9벗$oK{<& sb׮Px SS͍Z=UsغcX<"iSZ[aawfc?,`  `.UߏT,oaxƑ;vCOs^vn7sռ8ԴLzUUښ3~};MM+VQc+"B$pe_oj͹=6R՘ҥ"G4 u)róƟ XN9dggk1Lp   eb$ ߼Yw_++j6xpyM@J@5kPeexN@,P?Lo18YcWw1 M   ՖjuwR5fe\| :5S@T}z eʼn"H'mܫ=9Z` {E2/'ՠHA9 {CQdťe]Ghyp@@@@@@@@@ZM.M"'9VX޾6${p:nmi0T:Z=xg{Cަs klsMk׊EJqt$S:& IIr߂ ۫yeU/'1QTMg6jթczʹD!!1dOo6IH[:سFc,aʿu\׽jkeA5fs@@@((d.4 RȦ/.<67uQAL^Q+0lqB+ @5zO%M!4>e;N T۶)QJ}IQe޸A׮Q~z듳9џ/4+:2BBGٱuVL YըAuܨq^T"#l\d(;&F۱E 1du6=5-1*.,T{n۶3^Wzp0奤dߤ 5Zex+BEm]\ݝ-ZXEF&Q^TٸA@@kZEOҹaTPpkNvN-\j>|XwݫVݻeaR@,)MMK=#v P]^D wcg{3Fٙ<Ǐޓ{Y1of W/v˅ D'e IDAT  ՞jVZT\LWFQ@@0ŧԱW/AB(}sxeV|SݝjRQ~>]*{i6ƽ{kPqJYʂ)YYBXujJyġlɔz7{*=@Y,th])-0 Dē'И}'{zܙl]])?5R-2J{y^ Hu8UȨ$ڶ(eeLy|!oru1.'ja   j @T&*%ܢSCE;E2ɿuԚlmk J.߯ozhHWm32DHxMa*¹Yk Zו({}qrەSaVTZEsRC7n7jDǓ]VZ .>>zxu*.(ŒLQM:u?6oX/&6ΜFW#>I֤ m߮լy[    po @|1::*!^|NĤtyu66Խ[!!vX ?I5Zӧ)) @zg@ Xe34yɓɦn]CFzXrhLm FW         (Wn?w.NQ+!~^ԭ986$Dv>zfgSڵ:9R0LT6?yR,Ke/|*Cr#S ^!}Y-nHSgB)44VW3ӇZ,jҍpJ4U W ?L!!1jiސY$'((6o="zy45l?%\l&jݢ;=@{Np! )$yfZլIg2dX6wf~ cp!%6!EΞ @29ܽ{7O3!o!s @!"HUg/UNЅ B qa7Wۛ+vk-[4 +sߔYcO;wʡ1niԨeHqq)Ф\{,[3z^u@M.^Ν]YlzON 3R^^خY&?ҍ oM4:@eZ1X8TΝ"b4jd*)kiZi @ T@o9K!&4mA4j&۰q1S5ku   U*X %pm:tXĘG{gB(!!:ulMZ5ٯ2C Xt]nXԐ9   @@o/n@@@@֋.7epO>BBQ4a Ќl:v*ݼ.Yoq:pݸ@ iԤ+yx]^Z@9$}3E2oS.4l/-rrOX3Ϸw%{jLb vB8]|nD$Paj޼!lJu^EF&ɓA&M^4u~YtUJ_xR6}5h}Ʀ=0lhv4|`@@,P p.@)[D5jX7 O\P(?PII q ҩQ#N ڎY_Sڥ7hٲB4IkcV:477}Sm,y~*Z)66~7͞ܖ׸jt|/o5mZ_\}{oEW>[8]\I[V~n]bɋB\x3] 0h_}2իd004 X$<3E/M^^u nȅ?O?nKÆ'({vrbG>콸WvmфwƪrH4#Agr纟W˶ӹs\# CU ܑw?@ׯc}sr SPSF˖M:n 0T*Rҥ䋭yQ~若Kp)"2QnҗD񞽽-M:1жߎPQQhӧO#Z|m^N7íIJKl!lܸ~۽->Bq\~kOz'P/~e:e0j_j@QttX+{~yva99ա U޶k,dNxj q.R{Oj&lO~ޮYY,j+ELk}6z1֯וּx@@@@78    J|QI~^ +aO8:#7ȩ==i@C[hDT5==G9/'7qr8P4&&y4,]nyW#E먨eLvlWDe{/}I99u-7'm9uY&4K7o@yaA2lr+C@@@Z7F* (bqMq)S&#4sQn]um8CS+ƣޢ,JRi7mƌMO/޼Kfޒ{ Ӟ) /X*s'+Ed673WeaReoH,JCPi.cFEauc   p?@1'X0(ru|Jc˩ 'wZ;vvVV0q~",Z2M gd\|(44FdoW"p.J,xJW'Bu~Pࡋvo*pW l/s/tB~&7S۳AϏ(ijِ&7Z:L@@@@$) Gι3JsiQ5OB~QgaCݔ#y.ގ(h@NkMG&jK1T=y2V~t=oNa=?m~ VNڴj:!yEJ/9hj0㳈1@@@R@}@!PU Åwd=rAE^5kQG9/R|B"'^AE.$^TeOeӗ듋(ATAsT OU@ٳRRj۪ec,y" ~0Ee4^A\,T|}8<,_߹4mt@g{en!_I(ׯ-eg]~1SII"'d, /%ի4WgY.{jZY,e ~:X*o->}%EÇLC˫e96_}e,mi&mf4x4_e!g)9tCkУ~`ҥr%wi ի(km]ӜÛm;³S Rݺ԰A*^80Pp1@E @(A0Pch-@ @0B     `FBSZq@@@@p@ g    f  1  A@@@A9(b C @5ځT;@ݖa         j()v V-ÂA@@@@@@@@ %PRh    `(d@@@@@@ f    !<1 a  @@@@D@b@5Ps8    j%0fC@@@@ Hh    `>@#Oh@@@@@@@@@ZM7(@5%n          P>3B 3@$3P    Z."40'椉@@@@#3B 3xMQHH 993#9ӆIH[Egd?|o"//eLWFEaa@   j%0YȦ/.X=67ua6nTQyXbh   `(B;$P\\B!!KcS&?w©m-zsSTZ"ʼq2]tmmgG'grn?_hVt4ePM;;r׏cc묘Q긹Q^eEFOIDAT9ظPvLcb>4m*r{jZ±cT\Xvݶmۗg`KI=ɾIjG>5V94=ں;5S[⵰8L=q+T@>a    L -=NsèY[פߝwshPúS^F- b}H!hjZtYamMMCp\X.1 ĉZ./_NTR~yEX܍ٻWNsfzJ Z#nLBɀ`ڽ笘yԫxkBjKh:,@@@@( T;ulE;} !`<Բj+DpN]](?Ү^4R޽J`,eÊ,!:j%мTwdJrE=D,:4.ҔHEOɓfyh̾}==wLJTpC ={<|/kfd$Sc*jdTmvseGې7g{@=c    P ܢSCE;Ejw&^{lﯗSZJ1hD)saB`1 ]XײlAY2 3نn.dsF&BZ$RОYO9sڞWx~OOb";}^'e潓$++3,t_*]7F%<=njsk7z{b@yI şvvJ[SY8n P?v74=Z&/_.޵6V#JKSYs<˒~:i{Eӡ@s;u 9RYkcFUӧIzzϕt)@|@@@/OK{Fv:&_O0ʐgM5+53vRCf[O~]g'1ތ_ K?vzfh~JKzOnf>7iR7.;4ܴlOì \^WU!yy9  @@'l @?W|N4F[*SXW#to^y˜ooWΜ|"C/v֦~hٚ5*^|;wߕS$=+K nЭxG/_jxx˜%~^3  Ѐ42@@Wl @uY=RP07hcK宼7ݹSݞg.5ҡۻT+DS|;Ъ7ސHc9T%KR뮩Sec,%iÇkej9ycEϖ72>  ZB@\)՛+*Nʾ}UIe}%77;e+$ j>;P϶57^3[ċ.4ņ|nǾVjWn@cGW-A?h}]h4*55gejKzx|mnLpB@@k ! n &JmI (*̗bpv$رS_>6ϯ_XG>RԳ2u6q.anrqU.NKs Rle.3֯=ߵ"ӟЋy|@.hJ,DW*X׬^8 76J,+>\*uE2gN<  ~  -8}^=.GO?ɖ׻V#`),;L\S#y+=lMjmݪ_ P}dF\!#q'w߼Y[Z- zө>i>S7+*q3vx̛'_93zjÑ#թ+VHFv w「+s疚޳2o/E@@m 5! X%֜6aeܱ֫͛#6jPgf55 tKT Uґ7a-ZTɷ67FG$'׃ٳeԬYwڧefJС,UGvN]}$ՐjP\ 5~ [3rr칋b~  (@b@@lPnJYRR|=ֆݾ݄CWR9k|~hXv4, K<Fԕ+KC׷zbm z/—.%dXaL\ϺN])z.陡kk{|… )~@<  l(@@N 'D/\.-9cƘՠ. ]R_/zh(/iys֭.=S5k"}G@` oT VKՋ6o,yМ)@@WP  @Pmի]xfgEF @@{@ ! N :& 8*@hc  `.@@MP7ʬ@@k@m ! N :V& +@joo @pQŮ2'@@@@0@@@@@YPg[@@@@@    8+@lk  ` B@\ u @TP  eZ  v@@7@+B@ 5 8)@d[  `2@@EPʜ@@@-n!  :T    ]@@@@@YPg[@@@@@    8+@lk  ` B@\ u @TP  ਀n::=  `m@@eOƨD;]%sC@HԢfP   ຀&^kKs눸>U  `% @@`DCF"Q/<@@l Ԁ  h(W,lMg     /MPlꠘ7D@@@@9"i]+@u^h3g     ඀.̡f!$"&e     $;)e+|I  @)` \@@ `ﱲPΈx" E4(N@@ xь!"i{&KZS1  `-@@@ D3ͥGG赧)d@@rPDy  @.<b9CvIENDB`golang-github-johanneskaufmann-html-to-markdown-2.3.1/.github/workflows/000077500000000000000000000000001476711565700264125ustar00rootroot00000000000000golang-github-johanneskaufmann-html-to-markdown-2.3.1/.github/workflows/go.yml000066400000000000000000000023511476711565700275430ustar00rootroot00000000000000name: Go on: push: branches: [ main ] pull_request: branches: [ main ] jobs: # Test the latest go version # and upload the test coverage. test_latest: name: Go latest stable runs-on: ubuntu-latest steps: - name: Setup Go uses: actions/setup-go@v5 with: go-version: 'stable' check-latest: true - name: Checkout code uses: actions/checkout@v4 - name: Build run: go build -v . - name: Test run: go test ./... -v -race -coverprofile=coverage.txt -covermode=atomic # - uses: codecov/codecov-action@v4 # with: # files: ./coverage.txt # token: ${{ secrets.CODECOV_TOKEN }} # Test the latest three golang version # on different operating systems. test_versions: strategy: matrix: go: ['1.22'] os: [ubuntu-latest, macos-latest, windows-latest] name: Go ${{ matrix.go }} on ${{ matrix.os }} runs-on: ${{ matrix.os }} steps: - name: Setup Go uses: actions/setup-go@v5 with: go-version: ${{ matrix.go }} - name: Checkout code uses: actions/checkout@v4 - name: Test run: go test ./... -v -race -cover golang-github-johanneskaufmann-html-to-markdown-2.3.1/.github/workflows/release.yml000066400000000000000000000027661476711565700305700ustar00rootroot00000000000000name: goreleaser on: push: tags: - 'v2.*' permissions: contents: write jobs: goreleaser: runs-on: ubuntu-latest steps: - name: Setup Go uses: actions/setup-go@v5 with: go-version: 'stable' check-latest: true - name: Checkout uses: actions/checkout@v4 with: fetch-depth: 0 # Cloudsmith CLI tooling for pushing releases # See https://help.cloudsmith.io/docs/cli - name: Install Cloudsmith CLI run: pip install --upgrade cloudsmith-cli - name: Run GoReleaser uses: goreleaser/goreleaser-action@v6 with: distribution: goreleaser version: 'latest' args: release --clean env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} TAP_GITHUB_TOKEN: ${{ secrets.TAP_GITHUB_TOKEN }} # Publish to the "stable" repo on Cloudsmith # See https://cloudsmith.io/~html-to-markdown/repos/stable/ - name: Publish .deb to Cloudsmith env: CLOUDSMITH_API_KEY: ${{ secrets.CLOUDSMITH_API_KEY }} run: | for filename in dist/*.deb; do # armv6 and armv7 are both "armhf" so we can skip the duplicate if [[ "$filename" == *"armv6"* ]]; then echo "Skipping $filename" continue fi echo "Pushing $filename to 'stable'" cloudsmith push deb html-to-markdown/stable/any-distro/any-version $filename done golang-github-johanneskaufmann-html-to-markdown-2.3.1/.gitignore000066400000000000000000000004601476711565700250050ustar00rootroot00000000000000 # - - - - - General - - - - - # # Binaries for programs and plugins *.exe *.exe~ *.dll *.so *.dylib # Test binary, build with `go test -c` *.test # Output of the go coverage tool, specifically when used with LiteIDE *.out .DS_Store # - - - - - Project Specific - - - - - # NOTES.md .tmp dist/ golang-github-johanneskaufmann-html-to-markdown-2.3.1/.goreleaser.yaml000066400000000000000000000030031476711565700261030ustar00rootroot00000000000000 # The lines below are called `modelines`. See `:help modeline` # Feel free to remove those if you don't want/need to use them. # yaml-language-server: $schema=https://goreleaser.com/static/schema.json # vim: set ts=2 sw=2 tw=0 fo=cnqoj version: 2 before: hooks: - go mod tidy builds: - env: - CGO_ENABLED=0 goos: - linux - windows - darwin # Note: We only use goreleaser for the CLI, # so we have to go into the "cli" directory. dir: cli/html2markdown binary: html2markdown archives: - format: tar.gz # this name template makes the OS and Arch compatible with the results of `uname`. name_template: >- {{ .ProjectName }}_ {{- title .Os }}_ {{- if eq .Arch "amd64" }}x86_64 {{- else if eq .Arch "386" }}i386 {{- else }}{{ .Arch }}{{ end }} {{- if .Arm }}v{{ .Arm }}{{ end }} # use zip for windows archives format_overrides: - goos: windows format: zip brews: - name: html2markdown repository: owner: JohannesKaufmann name: homebrew-tap token: "{{ .Env.TAP_GITHUB_TOKEN }}" nfpms: - id: default package_name: html2markdown vendor: JohannesKaufmann homepage: https://github.com/JohannesKaufmann/html-to-markdown maintainer: Johannes Kaufmann description: | Convert HTML to Markdown. Even works with entire websites. license: MIT formats: - deb changelog: sort: asc filters: exclude: - "^docs:" - "^test:" golang-github-johanneskaufmann-html-to-markdown-2.3.1/ESCAPING.md000066400000000000000000000042241476711565700245320ustar00rootroot00000000000000## Escaping Some characters have a special meaning in markdown. For example, the character "\*" can be used for lists, emphasis and dividers. By placing a backlash before that character (e.g. "\\\*") you can "escape" it. Then the character will render as a raw "\*" without the _"markdown meaning"_ applied. But why is "escaping" even necessary? ```md Paragraph 1 - Paragraph 2 ``` The markdown above doesn't seem that problematic. But "Paragraph 1" (with only one hyphen below) will be recognized as a _setext heading_. ```html