Flask-WTF-0.12/0000755000076500000240000000000012547354553013752 5ustar lepturestaff00000000000000Flask-WTF-0.12/docs/0000755000076500000240000000000012547354553014702 5ustar lepturestaff00000000000000Flask-WTF-0.12/docs/_static/0000755000076500000240000000000012547354553016330 5ustar lepturestaff00000000000000Flask-WTF-0.12/docs/_static/flask-wtf.png0000644000076500000240000002553412542143557020740 0ustar lepturestaff00000000000000PNG  IHDRb5 +vsBIT|d pHYsa(atEXtSoftwarewww.inkscape.org< IDATxg$Uն8($EAA |P_A JQPD%Jxɒ*YA2 ~3=}:Wu0]^{g6L&d2L3d2L&3B&d2d!d2d2Lf@d2L&3l d2L&@62L& L&d L&d2n; fzxxxY"2d2P{JGhj̛ӳg2L&3tA4X`g`u`q@%yy/L&dF$b HXXO6pptL&d}3`}8sWd2LfJzn HZ=-ۧvG2L&*@.M`sG:5d2L&3ؔn HZ 8d wGٞ8؝d2Lf(@8pֵ`wdjG҇$m L8Lf4!! ,SJ=6 `FB[iy`-ۯV'f$- O,eԁ[[پpd27ex_B $ #s[r$lؕ5_S35Lei Xb[dz`I33s'~ 6!H_N%HZx8m`؝I"Vm`$EG붗wS|h.p) ̶TB;C_AsNS~(@xĶrpup?1u0oef`ZBzv$}Wҥ/1``هL5$ y3>}:fv iQۏvĀc=.zi.yc %Ȟ\M֏^OwJR)eOV7 X8x]zڡb,_;C'd۹I,+iNXBJ62 (sWăw0rZ^tp|sYM6}_Ƅ ΪLK %l.36v 'aXT4 -3ij o$8S@(ۯ?3,n_ 1erS+i/φ_<^=[`S ^ j ]SE "1^R͜J:;OsK-m!9"b0b%"qaMI_%n_i.hMC$|: R4ztl oI1*C ; 6U<%$4˾4/-il|&~`FdG8fiC@(#am!HbvwcN"ɺ?FxڡB"(fˠ Yu]Z͵3'~DJGm?{l bDtQ~KM#IؾpHҬ5$r_CqHm_l-BU;| pu@(:y!lii?t?- 艁 i)bn%5 Lr XpwV8~x 8 pK$-Y]]qlGJū^o|8(+֞^S>D^jMZBoi6 %it0xM'BIsҼ G<F)0p{&юB ࿶Yۋlof$fK"hI?N]Lm9ф(Ҵ5۾@-PoOʲi\ }};Sqw=&r.H`JB ,!ifl 4_ 53C^nJp8lwNlKR ȲZtV<͔H [&QRwf4Cmw.X:"FMc%Ԥ幅$J pxHTONYZ:ÇfJQť7RLUT]@Čx Wi4Bw žm]DI%ʭX9' MuKLSlOT! :8n4k&62C* n.hsi,Nc%<)-p'i,AqLd4T8- u<RG@<˹/$d+ؐTOx?aYݒ3mQD)@.Sq:e0mM$ƒp*n Hd2nJ 菁p0V-)IiYz(f/v^>S Ҳ0牂XϦ?Dl٫~5Ĺz0_%x^)IW!r]7&ƧvxM@(1n{62gEҟzn+|H')>_I1`x2r ph EQ D c S6$ !p$M4ZJ,LG)4CU{_tӈh0~lmdE)!\g3V=l IH:}K丷{USqq>qЊQwS@șRYXx8|XX06 ^"RT\ EGwiCæBpO2H"FSf*Lg{lSMI?}KCO'Qabtg O ^_sDH:v?pbU6XfI7Zے /a4֫q-ʔ)8Aҕ@,ҧu>zۜx[e+8^V$vĠ`-閗z EbIs4l=Z{ XR/: rLRBi{Lv!~@TBAA=+D̈́:; 5mIޏ:}[[cTB1(46]vFb޸娂}[G #"(^V/~}ϷqMMTjlRPoM`.4`tFDʅ |Qe&Ǻ ظvnC78'`~QV&a!FvNSl*qevµ x\)l;.24BI_!+7ۧ;QW3AI0'mX߮e} پ5Z+qmibo؝Ike=? 1S{2p83)@4e pJ"=p=. 5-db6==ֿO0Sz=`9R{=& fjQU8Qecb"IwYaAVJS81p<\ Fa۴9BG;F]uїBHځ|TZN P `bZf:ˈ{wa1 L۔A·ll"쒚߶Ǫ"Cx"WV8ۋ #˩SKmLs=u8Xl ?ik.drw 3dpTۘb NdTslYM݋7xI9ml_H I,ڃd`ubZ\ε xbi_*<[Hz>KY}6q"<2}]/Iђ6#"+ML)f"KЌGDAQ\8GRlۯ&a#mv8#&RX+ !23p}fn F7ɒd]cR` jNV D &t_a,p|ΐ4;Lu6MPez^۔<񜺮4:*8UcKEJSQED3u3kY5dݗG% ">{^@4(1IxmZw׮sr)~9,DxG`3=, шWKDf#mnTZDw, -ܠB<H-a$}8KOh\BL3"8߆x`YTG.JÙs~y*F: 0+ Z'>IL jzB?@Rk IErI-C"Ϸ}lz12='ou 'mp(a$+mIoo Tb_I :O.d  {;}.,Igԫq>6nLLñ:1铧%g0d`]&U_ l=hʱDZW?Y_$F!iBф$Zi]I+O%i `ʴH#14SSCHܾlR%ls6>^h#1!mmƹ.01}YYfK3*88 mz4p QrdLh0D1Ͱ!pU^2L63uQPy(Vv}+iV9KZȺP4pOJL4JS_&!jֿNxL9 "2STtFrϻ0yXֶv}F=V +* KNlP|g7\2H@VGB^,?oz}8\@6 ~v(S!6lv%Kھ3HO1aRӉsPh:8G)QV(H vA [x.Pn=kHBKZľtM4.U4PX ;,zEPWlj͹۾)Ne$ ]-Y+i#BsI:H6M)4Bo]bTwSN=Qk .NF]#F߷2~+}s~.4. #PiҧDN#Ci:d8 I0i IDAT &< SحSX Ѳ2@'BrE9ZR75wth)mhIPUm2-ohIGrEųX)+K otV"8 2H=`kR IsKmq;aX4>M%dE55%zݕ4Svam [DjNJ7H#^Vö%ɍwIKVG$&/Dj:h#ym纋nػyZOtsnEJ:k=p.pf MI`u;xh~y2+^^!Xx`l9B0e L~MꇕQ4Dޓ.mRlwl<`u sB)q"$QWS$񧳀wBʏku~3&h&gii(IU;LҦ]_I#IߣV ޟD ܍)XHn=1y[CCl?B?ڊl d STzՆ?ؒtBS~4kI۾[֯z{NiIb# / nԽmЪv+KTfNŋ nx'ST@],\v*T" /]=:-γTumؾk>U+ tFC+SeYb9S {oշlo{5؉oF(> .AI$Ucrs{BNN^Ah{A۫>S[Gjx_t:|HBը h6Z&4Y76@50IKU'$m*i'5֮8:1G|;93p[,d'mDR36P0ZJCH,sLfJl^jMO,`~LmC%g0ʵkU;'k?Ѣ_^+9灯} }fu=I#z:ioM"e/BzYoפo7Wi|!j9seښk `>^_"”V>m\ӯZWkcKhgu``Oӏ~$ziqx(`վgVpLݗ/4pkGBw!}Vu mGգx#ne&~OY@cD!W{ 5FzhmB^չߥkt1_c޲D@v(_G\y02Oӏ}Fnn8{Sk#>g:bj"/M 13>}"bu<\Lҗc/#qG9j1?H;Y^!%}Wޠ%:8(Mot`+a\o" Jjr`Yx>MCۤ@!KYA09`p2։B= ui$-N\T>ȱ 2 ;e[ mZ*!˼~=O":ude탈@< )]ǫVھ ]]wŔ$b$Pzl.uTd QfH擒ft*x 8FiK@Io_u)z"Pۇms8`$޴:1"})-/WV"gIu^}K$a?tZjoelu 7JZ ؚPڼvZ&`1~C#''&텈ij^{0+˝&ݰ8YOby6RmZ3X~}O=¹5 Pfȫhrzc$\#4&]NTp-e%0#QpR63#UZ=^NXi6v j4zoŀnTHP-*jhϐ4\jFdDu=$)@؍P'vTCTiE(d2HBIe)*L(= V<;p{F)Ku`؈lav"yF:E3]B_}rg2L&3)3HdU*Xf H&3ld2L&Sz`R Ӗ\BKu v$4_!ҺN}c3L&LIΛne^ET ڞXV3L&LIO T~About Flask-WTF

Simple integration of Flask and WTForms, including CSRF, file upload and Recaptcha integration.

Flask-WTF-0.12/docs/_templates/useful-links.html0000644000076500000240000000042112542143557022336 0ustar lepturestaff00000000000000

Useful Links

Flask-WTF-0.12/docs/_themes/0000755000076500000240000000000012547354553016326 5ustar lepturestaff00000000000000Flask-WTF-0.12/docs/_themes/flask/0000755000076500000240000000000012547354553017426 5ustar lepturestaff00000000000000Flask-WTF-0.12/docs/_themes/flask/layout.html0000644000076500000240000000123612542143557021626 0ustar lepturestaff00000000000000{%- extends "basic/layout.html" %} {%- block extrahead %} {{ super() }} {% if theme_touch_icon %} {% endif %} {% endblock %} {%- block relbar2 %}{% endblock %} {% block header %} {{ super() }} {% if pagename == 'index' %}
{% endif %} {% endblock %} {%- block footer %} {%- block innerfooter %}{%- endblock %} {% if pagename == 'index' %}
{% endif %} {%- endblock %} Flask-WTF-0.12/docs/_themes/flask/relations.html0000644000076500000240000000111612542143557022306 0ustar lepturestaff00000000000000

Related Topics

Flask-WTF-0.12/docs/_themes/flask/static/0000755000076500000240000000000012547354553020715 5ustar lepturestaff00000000000000Flask-WTF-0.12/docs/_themes/flask/static/flasky.css_t0000644000076500000240000002220412542143557023236 0ustar lepturestaff00000000000000/* * flasky.css_t * ~~~~~~~~~~~~ * * :copyright: Copyright 2010 by Armin Ronacher. * :license: Flask Design License, see LICENSE for details. */ {% set page_width = '940px' %} {% set sidebar_width = '220px' %} @import url("basic.css"); /* -- page layout ----------------------------------------------------------- */ body { font-family: 'Georgia', serif; font-size: 17px; background-color: white; color: #000; margin: 0; padding: 0; } div.document { width: {{ page_width }}; margin: 30px auto 0 auto; } div.documentwrapper { float: left; width: 100%; } div.bodywrapper { margin: 0 0 0 {{ sidebar_width }}; } div.sphinxsidebar { width: {{ sidebar_width }}; } hr { border: 1px solid #B1B4B6; } div.body { background-color: #ffffff; color: #3E4349; padding: 0 30px 0 30px; } img.floatingflask { padding: 0 0 10px 10px; float: right; } div.footer { width: {{ page_width }}; margin: 20px auto 30px auto; font-size: 14px; color: #888; text-align: right; } div.footer a { color: #888; } div.related { display: none; } div.sphinxsidebar a { color: #444; text-decoration: none; border-bottom: 1px dotted #999; } div.sphinxsidebar a:hover { border-bottom: 1px solid #999; } div.sphinxsidebar { font-size: 14px; line-height: 1.5; } div.sphinxsidebarwrapper { padding: 18px 10px; } div.sphinxsidebarwrapper p.logo { padding: 0 0 20px 0; margin: 0; text-align: center; } div.sphinxsidebar h3, div.sphinxsidebar h4 { font-family: 'Garamond', 'Georgia', serif; color: #444; font-size: 24px; font-weight: normal; margin: 0 0 5px 0; padding: 0; } div.sphinxsidebar h4 { font-size: 20px; } div.sphinxsidebar h3 a { color: #444; } div.sphinxsidebar p.logo a, div.sphinxsidebar h3 a, div.sphinxsidebar p.logo a:hover, div.sphinxsidebar h3 a:hover { border: none; } div.sphinxsidebar p { color: #555; margin: 10px 0; } div.sphinxsidebar ul { margin: 10px 0; padding: 0; color: #000; } div.sphinxsidebar input { border: 1px solid #ccc; font-family: 'Georgia', serif; font-size: 1em; } /* -- body styles ----------------------------------------------------------- */ a { color: #004B6B; text-decoration: underline; } a:hover { color: #6D4100; text-decoration: underline; } div.body h1, div.body h2, div.body h3, div.body h4, div.body h5, div.body h6 { font-family: 'Garamond', 'Georgia', serif; font-weight: normal; margin: 30px 0px 10px 0px; padding: 0; } {% if theme_index_logo %} div.indexwrapper h1 { text-indent: -999999px; background: url({{ theme_index_logo }}) no-repeat center center; height: {{ theme_index_logo_height }}; } {% endif %} div.body h1 { margin-top: 0; padding-top: 0; font-size: 240%; } div.body h2 { font-size: 180%; } div.body h3 { font-size: 150%; } div.body h4 { font-size: 130%; } div.body h5 { font-size: 100%; } div.body h6 { font-size: 100%; } a.headerlink { color: #ddd; padding: 0 4px; text-decoration: none; } a.headerlink:hover { color: #444; background: #eaeaea; } div.body p, div.body dd, div.body li { line-height: 1.4em; } div.admonition { background: #fafafa; margin: 20px -30px; padding: 10px 30px; border-top: 1px solid #ccc; border-bottom: 1px solid #ccc; } div.admonition tt.xref, div.admonition a tt { border-bottom: 1px solid #fafafa; } dd div.admonition { margin-left: -60px; padding-left: 60px; } div.admonition p.admonition-title { font-family: 'Garamond', 'Georgia', serif; font-weight: normal; font-size: 24px; margin: 0 0 10px 0; padding: 0; line-height: 1; } div.admonition p.last { margin-bottom: 0; } div.highlight { background-color: white; } dt:target, .highlight { background: #FAF3E8; } div.note { background-color: #eee; border: 1px solid #ccc; } div.seealso { background-color: #ffc; border: 1px solid #ff6; } div.topic { background-color: #eee; } p.admonition-title { display: inline; } p.admonition-title:after { content: ":"; } pre, tt { font-family: 'Consolas', 'Menlo', 'Deja Vu Sans Mono', 'Bitstream Vera Sans Mono', monospace; font-size: 0.9em; } img.screenshot { } tt.descname, tt.descclassname { font-size: 0.95em; } tt.descname { padding-right: 0.08em; } img.screenshot { -moz-box-shadow: 2px 2px 4px #eee; -webkit-box-shadow: 2px 2px 4px #eee; box-shadow: 2px 2px 4px #eee; } table.docutils { border: 1px solid #888; -moz-box-shadow: 2px 2px 4px #eee; -webkit-box-shadow: 2px 2px 4px #eee; box-shadow: 2px 2px 4px #eee; } table.docutils td, table.docutils th { border: 1px solid #888; padding: 0.25em 0.7em; } table.field-list, table.footnote { border: none; -moz-box-shadow: none; -webkit-box-shadow: none; box-shadow: none; } table.footnote { margin: 15px 0; width: 100%; border: 1px solid #eee; background: #fdfdfd; font-size: 0.9em; } table.footnote + table.footnote { margin-top: -15px; border-top: none; } table.field-list th { padding: 0 0.8em 0 0; } table.field-list td { padding: 0; } table.footnote td.label { width: 0px; padding: 0.3em 0 0.3em 0.5em; } table.footnote td { padding: 0.3em 0.5em; } dl { margin: 0; padding: 0; } dl dd { margin-left: 30px; } /* block level */ blockquote { border-left: 0.4em solid #ddd; margin: 15px 0; padding: 0 15px; color: #777; } blockquote blockquote { padding: 0 0 0 1em; margin-left: 2em; border-left: 0.4em solid #ddd; } ul, ol { margin: 10px 0 10px 30px; padding: 0; } pre { background: #eee; padding: 7px 30px; margin: 15px -30px; line-height: 1.3em; } dl pre, blockquote pre, li pre { margin-left: -60px; padding-left: 60px; } dl dl pre { margin-left: -90px; padding-left: 90px; } tt { background-color: #ecf0f3; color: #222; /* padding: 1px 2px; */ } tt.xref, a tt { background-color: #FBFBFB; border-bottom: 1px solid white; } a.reference { text-decoration: none; border-bottom: 1px dotted #004B6B; } a.reference:hover { border-bottom: 1px solid #6D4100; } a.footnote-reference { text-decoration: none; font-size: 0.7em; vertical-align: top; border-bottom: 1px dotted #004B6B; } a.footnote-reference:hover { border-bottom: 1px solid #6D4100; } a:hover tt { background: #EEE; } @media screen and (max-width: 870px) { div.sphinxsidebar { display: none; } div.document { width: 100%; } div.documentwrapper { margin-left: 0; margin-top: 0; margin-right: 0; margin-bottom: 0; } div.bodywrapper { margin-top: 0; margin-right: 0; margin-bottom: 0; margin-left: 0; } ul { margin-left: 0; } ul ul { margin-left: 16px; } .document { width: auto; } .footer { width: auto; } .bodywrapper { margin: 0; } .footer { width: auto; } .github { display: none; } } @media screen and (max-width: 875px) { body { margin: 0; padding: 20px 30px; } div.documentwrapper { float: none; background: white; } div.sphinxsidebar { display: block; float: none; width: 102.5%; margin: 50px -30px -20px -30px; padding: 10px 20px; background: #333; color: white; } div.sphinxsidebar h3, div.sphinxsidebar h4, div.sphinxsidebar p, div.sphinxsidebar ul, div.sphinxsidebar h3 a { color: white; } div.sphinxsidebar a { color: #aaa; } div.sphinxsidebar p.logo { display: none; } div.document { width: 100%; margin: 0; } div.related { display: block; margin: 0; padding: 10px 0 20px 0; } div.related ul, div.related ul li { margin: 0; padding: 0; } div.footer { display: none; } div.bodywrapper { margin: 0; } div.body { min-height: 0; padding: 0; } br { display: none; } .rtd_doc_footer { display: none; } .document { width: auto; } .footer { width: auto; } .footer { width: auto; } .github { display: none; } } /* scrollbars */ ::-webkit-scrollbar { width: 6px; height: 6px; } ::-webkit-scrollbar-button:start:decrement, ::-webkit-scrollbar-button:end:increment { display: block; height: 10px; } ::-webkit-scrollbar-button:vertical:increment { background-color: #fff; } ::-webkit-scrollbar-track-piece { background-color: #eee; -webkit-border-radius: 3px; } ::-webkit-scrollbar-thumb:vertical { height: 50px; background-color: #ccc; -webkit-border-radius: 3px; } ::-webkit-scrollbar-thumb:horizontal { width: 50px; background-color: #ccc; -webkit-border-radius: 3px; } /* misc. */ .revsys-inline { display: none!important; } Flask-WTF-0.12/docs/_themes/flask/theme.conf0000644000076500000240000000024012542143557021366 0ustar lepturestaff00000000000000[theme] inherit = basic stylesheet = flasky.css pygments_style = flask_theme_support.FlaskyStyle [options] index_logo = index_logo_height = 120px touch_icon = Flask-WTF-0.12/docs/_themes/flask_theme_support.py0000644000076500000240000001141312542143557022751 0ustar lepturestaff00000000000000# flasky extensions. flasky pygments style based on tango style from pygments.style import Style from pygments.token import Keyword, Name, Comment, String, Error, \ Number, Operator, Generic, Whitespace, Punctuation, Other, Literal class FlaskyStyle(Style): background_color = "#f8f8f8" default_style = "" styles = { # No corresponding class for the following: #Text: "", # class: '' Whitespace: "underline #f8f8f8", # class: 'w' Error: "#a40000 border:#ef2929", # class: 'err' Other: "#000000", # class 'x' Comment: "italic #8f5902", # class: 'c' Comment.Preproc: "noitalic", # class: 'cp' Keyword: "bold #004461", # class: 'k' Keyword.Constant: "bold #004461", # class: 'kc' Keyword.Declaration: "bold #004461", # class: 'kd' Keyword.Namespace: "bold #004461", # class: 'kn' Keyword.Pseudo: "bold #004461", # class: 'kp' Keyword.Reserved: "bold #004461", # class: 'kr' Keyword.Type: "bold #004461", # class: 'kt' Operator: "#582800", # class: 'o' Operator.Word: "bold #004461", # class: 'ow' - like keywords Punctuation: "bold #000000", # class: 'p' # because special names such as Name.Class, Name.Function, etc. # are not recognized as such later in the parsing, we choose them # to look the same as ordinary variables. Name: "#000000", # class: 'n' Name.Attribute: "#c4a000", # class: 'na' - to be revised Name.Builtin: "#004461", # class: 'nb' Name.Builtin.Pseudo: "#3465a4", # class: 'bp' Name.Class: "#000000", # class: 'nc' - to be revised Name.Constant: "#000000", # class: 'no' - to be revised Name.Decorator: "#888", # class: 'nd' - to be revised Name.Entity: "#ce5c00", # class: 'ni' Name.Exception: "bold #cc0000", # class: 'ne' Name.Function: "#000000", # class: 'nf' Name.Property: "#000000", # class: 'py' Name.Label: "#f57900", # class: 'nl' Name.Namespace: "#000000", # class: 'nn' - to be revised Name.Other: "#000000", # class: 'nx' Name.Tag: "bold #004461", # class: 'nt' - like a keyword Name.Variable: "#000000", # class: 'nv' - to be revised Name.Variable.Class: "#000000", # class: 'vc' - to be revised Name.Variable.Global: "#000000", # class: 'vg' - to be revised Name.Variable.Instance: "#000000", # class: 'vi' - to be revised Number: "#990000", # class: 'm' Literal: "#000000", # class: 'l' Literal.Date: "#000000", # class: 'ld' String: "#4e9a06", # class: 's' String.Backtick: "#4e9a06", # class: 'sb' String.Char: "#4e9a06", # class: 'sc' String.Doc: "italic #8f5902", # class: 'sd' - like a comment String.Double: "#4e9a06", # class: 's2' String.Escape: "#4e9a06", # class: 'se' String.Heredoc: "#4e9a06", # class: 'sh' String.Interpol: "#4e9a06", # class: 'si' String.Other: "#4e9a06", # class: 'sx' String.Regex: "#4e9a06", # class: 'sr' String.Single: "#4e9a06", # class: 's1' String.Symbol: "#4e9a06", # class: 'ss' Generic: "#000000", # class: 'g' Generic.Deleted: "#a40000", # class: 'gd' Generic.Emph: "italic #000000", # class: 'ge' Generic.Error: "#ef2929", # class: 'gr' Generic.Heading: "bold #000080", # class: 'gh' Generic.Inserted: "#00A000", # class: 'gi' Generic.Output: "#888", # class: 'go' Generic.Prompt: "#745334", # class: 'gp' Generic.Strong: "bold #000000", # class: 'gs' Generic.Subheading: "bold #800080", # class: 'gu' Generic.Traceback: "bold #a40000", # class: 'gt' } Flask-WTF-0.12/docs/_themes/LICENSE0000644000076500000240000000337512542143557017336 0ustar lepturestaff00000000000000Copyright (c) 2010 by Armin Ronacher. Some rights reserved. Redistribution and use in source and binary forms of the theme, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * The names of the contributors may not be used to endorse or promote products derived from this software without specific prior written permission. We kindly ask you to only use these themes in an unmodified manner just for Flask and Flask-related products, not for unrelated projects. If you like the visual style and want to use it for your own projects, please consider making some larger changes to the themes (such as changing font faces, sizes, colors or margins). THIS THEME IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS THEME, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. Flask-WTF-0.12/docs/_themes/README0000644000076500000240000000210512542143557017177 0ustar lepturestaff00000000000000Flask Sphinx Styles =================== This repository contains sphinx styles for Flask and Flask related projects. To use this style in your Sphinx documentation, follow this guide: 1. put this folder as _themes into your docs folder. Alternatively you can also use git submodules to check out the contents there. 2. add this to your conf.py: sys.path.append(os.path.abspath('_themes')) html_theme_path = ['_themes'] html_theme = 'flask' The following themes exist: - 'flask' - the standard flask documentation theme for large projects - 'flask_small' - small one-page theme. Intended to be used by very small addon libraries for flask. The following options exist for the flask_small theme: [options] index_logo = '' filename of a picture in _static to be used as replacement for the h1 in the index.rst file. index_logo_height = 120px height of the index logo github_fork = '' repository name on github for the "fork me" badge Flask-WTF-0.12/docs/api.rst0000644000076500000240000000175212542143557016205 0ustar lepturestaff00000000000000Developer Interface =================== This part of the documentation covers all interfaces of Flask-WTF. Forms and Fields ---------------- .. module:: flask_wtf .. autoclass:: Form :members: .. autoclass:: RecaptchaField .. autoclass:: Recaptcha .. autoclass:: RecaptchaWidget .. module:: flask_wtf.file .. autoclass:: FileField :members: .. autoclass:: FileAllowed .. autoclass:: FileRequired .. module:: flask_wtf.html5 .. autoclass:: SearchInput .. autoclass:: SearchField .. autoclass:: URLInput .. autoclass:: URLField .. autoclass:: EmailInput .. autoclass:: EmailField .. autoclass:: TelInput .. autoclass:: TelField .. autoclass:: NumberInput .. autoclass:: IntegerField .. autoclass:: DecimalField .. autoclass:: RangeInput .. autoclass:: IntegerRangeField .. autoclass:: DecimalRangeField CSRF Protection --------------- .. module:: flask_wtf.csrf .. autoclass:: CsrfProtect :members: .. autofunction:: generate_csrf .. autofunction:: validate_csrf Flask-WTF-0.12/docs/authors.rst0000644000076500000240000000043512542143557017116 0ustar lepturestaff00000000000000Authors ======= Flask-WTF is created by Dan Jacob, and now is maintained by Hsiaoming Yang. Contributors ------------ People who send patches and suggestions: .. include:: ../AUTHORS Find more contributors on GitHub_. .. _GitHub: http://github.com/lepture/flask-wtf/contributors Flask-WTF-0.12/docs/changelog.rst0000644000076500000240000000705112547354462017365 0ustar lepturestaff00000000000000Flask-WTF Changelog =================== Full list of changes between each Flask-WTF release. Version 0.12 ------------ Released 2015/07/09 - Abstract protect_csrf() into a separate method - Update reCAPTCHA configuration - Fix reCAPTCHA error handle Version 0.11 ------------ Released 2015/01/21 - Use the new reCAPTCHA API via `#164`_. .. _`#164`: https://github.com/lepture/flask-wtf/pull/164 Version 0.10.3 -------------- Released 2014/11/16 - Add configuration: WTF_CSRF_HEADERS via `#159`_. - Support customize hidden tags via `#150`_. - And many more bug fixes .. _`#150`: https://github.com/lepture/flask-wtf/pull/150 .. _`#159`: https://github.com/lepture/flask-wtf/pull/159 Version 0.10.2 -------------- Released 2014/09/03 - Update translation for reCaptcha via `#146`_. .. _`#146`: https://github.com/lepture/flask-wtf/pull/146 Version 0.10.1 -------------- Released 2014/08/26 - Update RECAPTCHA API SERVER URL via `#145`_. - Update requirement Werkzeug>=0.9.5 - Fix CsrfProtect exempt for blueprints via `#143`_. .. _`#145`: https://github.com/lepture/flask-wtf/pull/145 .. _`#143`: https://github.com/lepture/flask-wtf/pull/143 Version 0.10.0 -------------- Released 2014/07/16 - Add configuration: WTF_CSRF_METHODS - Support WTForms 2.0 now - Fix csrf validation without time limit (time_limit=False) - CSRF exempt supports blueprint `#111`_. .. _`#111`: https://github.com/lepture/flask-wtf/issues/111 Version 0.9.5 ------------- Released 2014/03/21 - ``csrf_token`` for all template types `#112`_. - Make FileRequired a subclass of InputRequired `#108`_. .. _`#108`: https://github.com/lepture/flask-wtf/issues/108 .. _`#112`: https://github.com/lepture/flask-wtf/issues/112 Version 0.9.4 ------------- Released 2013/12/20 - Bugfix for csrf module when form has a prefix - Compatible support for wtforms2 - Remove file API for FileField Version 0.9.3 ------------- Released 2013/10/02 - Fix validation of recaptcha when app in testing mode `#89`_. - Bugfix for csrf module `#91`_ .. _`#89`: https://github.com/lepture/flask-wtf/issues/89 .. _`#91`: https://github.com/lepture/flask-wtf/issues/91 Version 0.9.2 ------------- Released 2013/9/11 - Upgrade wtforms to 1.0.5. - No lazy string for i18n `#77`_. - No DateInput widget in html5 `#81`_. - PUT and PATCH for CSRF `#86`_. .. _`#77`: https://github.com/lepture/flask-wtf/issues/77 .. _`#81`: https://github.com/lepture/flask-wtf/issues/81 .. _`#86`: https://github.com/lepture/flask-wtf/issues/86 Version 0.9.1 ------------- Released 2013/8/21 This is a patch version for backward compitable for Flask<0.10 `#82`_. .. _`#82`: https://github.com/lepture/flask-wtf/issues/82 Version 0.9.0 ------------- Released 2013/8/15 - Add i18n support (issue #65) - Use default html5 widgets and fields provided by wtforms - Python 3.3+ support - Redesign form, replace SessionSecureForm - CSRF protection solution - Drop wtforms imports - Fix recaptcha i18n support - Fix recaptcha validator for python 3 - More test cases, it's 90%+ coverage now - Redesign documentation Version 0.8.4 ------------- Released 2013/3/28 - Recaptcha Validator now returns provided message (issue #66) - Minor doc fixes - Fixed issue with tests barking because of nose/multiprocessing issue. Version 0.8.3 ------------- Released 2013/3/13 - Update documentation to indicate pending deprecation of WTForms namespace facade - PEP8 fixes (issue #64) - Fix Recaptcha widget (issue #49) Version 0.8.2 and prior ----------------------- Initial development by Dan Jacob and Ron Duplain. 0.8.2 and prior there was not a change log. Flask-WTF-0.12/docs/conf.py0000644000076500000240000001462312542143557016202 0ustar lepturestaff00000000000000# -*- coding: utf-8 -*- # # flask-wtf documentation build configuration file, created by # sphinx-quickstart on Fri May 28 11:39:14 2010. # # This file is execfile()d with the current directory set to its containing dir. # # Note that not all possible configuration values are present in this # autogenerated file. # # All configuration values have a default; values that are commented out # serve to show the default. import sys, os # If extensions (or modules to document with autodoc) are in another directory, # add these directories to sys.path here. If the directory is relative to the # documentation root, use os.path.abspath to make it absolute, like shown here. sys.path.insert(0, os.path.abspath('..')) sys.path.append(os.path.abspath('_themes')) # -- General configuration ----------------------------------------------------- # Add any Sphinx extension module names here, as strings. They can be extensions # coming with Sphinx (named 'sphinx.ext.*') or your custom ones. extensions = ['sphinx.ext.autodoc', 'sphinx.ext.intersphinx'] # Add any paths that contain templates here, relative to this directory. templates_path = ['_templates'] # The suffix of source filenames. source_suffix = '.rst' # The encoding of source files. #source_encoding = 'utf-8' # The master toctree document. master_doc = 'index' # General information about the project. project = u'Flask-WTF' copyright = u'2010, Dan Jacob' # The version info for the project you're documenting, acts as replacement for # |version| and |release|, also used in various other places throughout the # built documents. # # The short X.Y version. version = '0.9' # The full version, including alpha/beta/rc tags. release = '0.9.5' # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. #language = None # There are two options for replacing |today|: either, you set today to some # non-false value, then it is used: #today = '' # Else, today_fmt is used as the format for a strftime call. #today_fmt = '%B %d, %Y' # List of documents that shouldn't be included in the build. #unused_docs = [] # List of directories, relative to source directory, that shouldn't be searched # for source files. exclude_trees = ['_build'] # The reST default role (used for this markup: `text`) to use for all documents. #default_role = None # If true, '()' will be appended to :func: etc. cross-reference text. #add_function_parentheses = True # If true, the current module name will be prepended to all description # unit titles (such as .. function::). #add_module_names = True # If true, sectionauthor and moduleauthor directives will be shown in the # output. They are ignored by default. #show_authors = False # The name of the Pygments (syntax highlighting) style to use. #pygments_style = 'sphinx' # A list of ignored prefixes for module index sorting. #modindex_common_prefix = [] # -- Options for HTML output --------------------------------------------------- # The theme to use for HTML and HTML Help pages. Major themes that come with # Sphinx are currently 'default' and 'sphinxdoc'. html_theme = 'flask' #html_theme = 'default' html_theme_options = { 'index_logo': 'flask-wtf.png', } # Theme options are theme-specific and customize the look and feel of a theme # further. For a list of options available for each theme, see the # documentation. #html_theme_options = {} # Add any paths that contain custom themes here, relative to this directory. html_theme_path = ['_themes'] # The name for this set of Sphinx documents. If None, it defaults to # " v documentation". #html_title = None # A shorter title for the navigation bar. Default is the same as html_title. #html_short_title = None # The name of an image file (relative to this directory) to place at the top # of the sidebar. #html_logo = None # The name of an image file (within the static path) to use as favicon of the # docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32 # pixels large. #html_favicon = None # Add any paths that contain custom static files (such as style sheets) here, # relative to this directory. They are copied after the builtin static files, # so a file named "default.css" will overwrite the builtin "default.css". html_static_path = ['_static'] # If not '', a 'Last updated on:' timestamp is inserted at every page bottom, # using the given strftime format. #html_last_updated_fmt = '%b %d, %Y' # If true, SmartyPants will be used to convert quotes and dashes to # typographically correct entities. #html_use_smartypants = True # Custom sidebar templates, maps document names to template names. html_sidebars = { 'index': ['brand.html', 'useful-links.html', 'searchbox.html'] } # Additional templates that should be rendered to pages, maps page names to # template names. #html_additional_pages = {} # If false, no module index is generated. #html_use_modindex = True # If false, no index is generated. #html_use_index = True # If true, the index is split into individual pages for each letter. #html_split_index = False # If true, links to the reST sources are added to the pages. #html_show_sourcelink = True # If true, an OpenSearch description file will be output, and all pages will # contain a tag referring to it. The value of this option must be the # base URL from which the finished HTML is served. #html_use_opensearch = '' # If nonempty, this is the file name suffix for HTML files (e.g. ".xhtml"). #html_file_suffix = '' # Output file base name for HTML help builder. htmlhelp_basename = 'flask-wtfdoc' # -- Options for LaTeX output -------------------------------------------------- # The paper size ('letter' or 'a4'). #latex_paper_size = 'letter' # The font size ('10pt', '11pt' or '12pt'). #latex_font_size = '10pt' # Grouping the document tree into LaTeX files. List of tuples # (source start file, target name, title, author, documentclass [howto/manual]). latex_documents = [ ('index', 'flask-wtf.tex', u'flask-wtf Documentation', u'Dan Jacob', 'manual'), ] # The name of an image file (relative to this directory) to place at the top of # the title page.#latex_logo = None # For "manual" documents, if this is true, then toplevel headings are parts, # not chapters. #latex_use_parts = False # Additional stuff for the LaTeX preamble. #latex_preamble = '' # Documents to append as an appendix to all manuals. #latex_appendices = [] # If false, no module index is generated. #latex_use_modindex = True Flask-WTF-0.12/docs/config.rst0000644000076500000240000000432312542143557016676 0ustar lepturestaff00000000000000Configuration ============= Here is the full table of all configurations. Forms and CSRF -------------- The full list of configuration for Flask-WTF. Usually, you don't need to configure any of them. It just works. ======================= ============================================== WTF_CSRF_ENABLED Disable/enable CSRF protection for forms. Default is True. WTF_CSRF_CHECK_DEFAULT Enable CSRF checks for all views by default. Default is True. WTF_I18N_ENABLED Disable/enable I18N support. This should work together with Flask-Babel. Default is True. WTF_CSRF_HEADERS CSRF token HTTP headers checked. Default is **['X-CSRFToken', 'X-CSRF-Token']** WTF_CSRF_SECRET_KEY A random string for generating CSRF token. Default is the same as SECRET_KEY. WTF_CSRF_TIME_LIMIT CSRF token expiring time. Default is **3600** seconds. WTF_CSRF_SSL_STRICT Strictly protection on SSL. This will check the referrer, validate if it is from the same origin. Default is True. WTF_CSRF_METHODS CSRF protection on these request methods. Default is **['POST', 'PUT', 'PATCH']** WTF_HIDDEN_TAG HTML tag name of the hidden tag wrapper. Default is **div** WTF_HIDDEN_TAG_ATTRS HTML tag attributes of the hidden tag wrapper. Default is **{'style': 'display:none;'}** ======================= ============================================== Recaptcha --------- You have already learned these configuration at :ref:`recaptcha`. This table is only designed for a convience. ======================= ============================================== RECAPTCHA_USE_SSL Enable/disable recaptcha through ssl. Default is False. RECAPTCHA_PUBLIC_KEY **required** A public key. RECAPTCHA_PRIVATE_KEY **required** A private key. RECAPTCHA_OPTIONS **optional** A dict of configuration options. https://www.google.com/recaptcha/admin/create ======================= ============================================== Flask-WTF-0.12/docs/csrf.rst0000644000076500000240000001010012542143557016354 0ustar lepturestaff00000000000000CSRF Protection =============== This part of the documentation covers the CSRF protection. Why CSRF -------- Flask-WTF form is already protecting you from CSRF, you don't have to worry about that. However, you have views that contain no forms, and they still need protection. For example, the POST request is sent by AJAX, but it has no form behind it. You can't get the csrf token prior 0.9.0 of Flask-WTF. That's why we created this CSRF for you. Implementation -------------- .. module:: flask_wtf.csrf To enable CSRF protection for all your view handlers, you need to enable the :class:`CsrfProtect` module:: from flask_wtf.csrf import CsrfProtect CsrfProtect(app) Like any other Flask extensions, you can load it lazily:: from flask_wtf.csrf import CsrfProtect csrf = CsrfProtect() def create_app(): app = Flask(__name__) csrf.init_app(app) .. note:: You need to setup a secret key for CSRF protection. Usually, this is the same as your Flask app SECRET_KEY. If the template has a form, you don't need to do any thing. It is the same as before: .. sourcecode:: html+jinja
{{ form.csrf_token }}
But if the template has no forms, you still need a csrf token: .. sourcecode:: html+jinja
Whenever a CSRF validation fails, it will return a 400 response. You can customize the error response:: @csrf.error_handler def csrf_error(reason): return render_template('csrf_error.html', reason=reason), 400 We strongly suggest that you protect all your views from CSRF. But there is a chance that you might exclude some view handlers, it can be done:: @csrf.exempt @app.route('/foo', methods=('GET', 'POST')) def my_handler(): # ... return 'ok' You can also disable CSRF protection in all views by default, by setting ``WTF_CSRF_CHECK_DEFAULT`` to ``False``, and selectively call ``csrf.protect()`` only when you need. This also enables you to do some pre-processing on the requests before checking for the CSRF token:: @app.before_request def check_csrf(): if not is_oauth(request): csrf.protect() AJAX ---- Sending POST requests via AJAX is possible where there is no forms at all. This feature is only available since 0.9.0. Assumimg you have done ``CsrfProtect(app)``, you can get the csrf token via ``{{ csrf_token() }}``. This method is available in every template, that way you don't have to worry if there are no forms for rendering the csrf token field. The suggested way is that you render the token in a ```` tag: .. sourcecode:: html+jinja And it is also possible to render it in the `` We will take the ```` way for example, the ``
''' __all__ = ["RecaptchaWidget"] class RecaptchaWidget(object): def recaptcha_html(self, public_key): html = current_app.config.get('RECAPTCHA_HTML') if html: return Markup(html) params = current_app.config.get('RECAPTCHA_PARAMETERS') script = RECAPTCHA_SCRIPT if params: script += u'?' + url_encode(params) attrs = current_app.config.get('RECAPTCHA_DATA_ATTRS', {}) attrs['sitekey'] = public_key snippet = u' '.join([u'data-%s="%s"' % (k, attrs[k]) for k in attrs]) return Markup(RECAPTCHA_TEMPLATE % (script, snippet)) def __call__(self, field, error=None, **kwargs): """Returns the recaptcha input HTML.""" try: public_key = current_app.config['RECAPTCHA_PUBLIC_KEY'] except KeyError: raise RuntimeError("RECAPTCHA_PUBLIC_KEY config not set") return self.recaptcha_html(public_key) Flask-WTF-0.12/Flask_WTF.egg-info/0000755000076500000240000000000012547354553017224 5ustar lepturestaff00000000000000Flask-WTF-0.12/Flask_WTF.egg-info/dependency_links.txt0000644000076500000240000000000112547354553023272 0ustar lepturestaff00000000000000 Flask-WTF-0.12/Flask_WTF.egg-info/not-zip-safe0000644000076500000240000000000112547354553021452 0ustar lepturestaff00000000000000 Flask-WTF-0.12/Flask_WTF.egg-info/PKG-INFO0000644000076500000240000000261612547354553020326 0ustar lepturestaff00000000000000Metadata-Version: 1.1 Name: Flask-WTF Version: 0.12 Summary: Simple integration of Flask and WTForms Home-page: http://github.com/lepture/flask-wtf Author: Hsiaoming Yang Author-email: me@lepture.com License: BSD Description: Flask-WTF ========= Simple integration of Flask and WTForms, including CSRF, file upload and Recaptcha integration. Links ----- * `documentation `_ * `development version `_ Platform: any Classifier: Development Status :: 4 - Beta Classifier: Environment :: Web Environment Classifier: Intended Audience :: Developers Classifier: License :: OSI Approved :: BSD License Classifier: Operating System :: OS Independent Classifier: Programming Language :: Python Classifier: Programming Language :: Python :: 2.6 Classifier: Programming Language :: Python :: 2.7 Classifier: Programming Language :: Python :: 3.3 Classifier: Programming Language :: Python :: 3.4 Classifier: Programming Language :: Python :: Implementation Classifier: Programming Language :: Python :: Implementation :: CPython Classifier: Programming Language :: Python :: Implementation :: PyPy Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content Classifier: Topic :: Software Development :: Libraries :: Python Modules Flask-WTF-0.12/Flask_WTF.egg-info/requires.txt0000644000076500000240000000002712547354553021623 0ustar lepturestaff00000000000000Flask Werkzeug WTForms Flask-WTF-0.12/Flask_WTF.egg-info/SOURCES.txt0000644000076500000240000000260512547354553021113 0ustar lepturestaff00000000000000LICENSE MANIFEST.in README.rst setup.py Flask_WTF.egg-info/PKG-INFO Flask_WTF.egg-info/SOURCES.txt Flask_WTF.egg-info/dependency_links.txt Flask_WTF.egg-info/not-zip-safe Flask_WTF.egg-info/requires.txt Flask_WTF.egg-info/top_level.txt docs/Makefile docs/api.rst docs/authors.rst docs/changelog.rst docs/conf.py docs/config.rst docs/csrf.rst docs/form.rst docs/index.rst docs/install.rst docs/license.rst docs/make.bat docs/quickstart.rst docs/upgrade.rst docs/_static/flask-wtf.png docs/_templates/brand.html docs/_templates/useful-links.html docs/_themes/LICENSE docs/_themes/README docs/_themes/flask_theme_support.py docs/_themes/flask/layout.html docs/_themes/flask/relations.html docs/_themes/flask/theme.conf docs/_themes/flask/static/flasky.css_t flask_wtf/__init__.py flask_wtf/_compat.py flask_wtf/csrf.py flask_wtf/file.py flask_wtf/form.py flask_wtf/html5.py flask_wtf/i18n.py flask_wtf/recaptcha/__init__.py flask_wtf/recaptcha/fields.py flask_wtf/recaptcha/validators.py flask_wtf/recaptcha/widgets.py tests/__init__.py tests/base.py tests/flask.png tests/flask.txt tests/test_csrf.py tests/test_html5.py tests/test_i18n.py tests/test_recaptcha.py tests/test_uploads.py tests/test_validation.py tests/templates/csrf.html tests/templates/csrf_macro.html tests/templates/hidden.html tests/templates/import_csrf.html tests/templates/index.html tests/templates/recaptcha.html tests/templates/upload.htmlFlask-WTF-0.12/Flask_WTF.egg-info/top_level.txt0000644000076500000240000000001212547354553021747 0ustar lepturestaff00000000000000flask_wtf Flask-WTF-0.12/LICENSE0000644000076500000240000000273112542143557014755 0ustar lepturestaff00000000000000Copyright (c) 2010 by Dan Jacob. Copyright (c) 2013 - 2015 by Hsiaoming Yang. Some rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * The names of the contributors may not be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. Flask-WTF-0.12/MANIFEST.in0000644000076500000240000000034412542143557015504 0ustar lepturestaff00000000000000include LICENSE recursive-include tests * recursive-exclude tests *.pyc recursive-exclude tests *.pyc recursive-include docs * recursive-exclude docs *.pyc recursive-exclude docs *.pyo prune docs/_build prune docs/_themes/.git Flask-WTF-0.12/PKG-INFO0000644000076500000240000000261612547354553015054 0ustar lepturestaff00000000000000Metadata-Version: 1.1 Name: Flask-WTF Version: 0.12 Summary: Simple integration of Flask and WTForms Home-page: http://github.com/lepture/flask-wtf Author: Hsiaoming Yang Author-email: me@lepture.com License: BSD Description: Flask-WTF ========= Simple integration of Flask and WTForms, including CSRF, file upload and Recaptcha integration. Links ----- * `documentation `_ * `development version `_ Platform: any Classifier: Development Status :: 4 - Beta Classifier: Environment :: Web Environment Classifier: Intended Audience :: Developers Classifier: License :: OSI Approved :: BSD License Classifier: Operating System :: OS Independent Classifier: Programming Language :: Python Classifier: Programming Language :: Python :: 2.6 Classifier: Programming Language :: Python :: 2.7 Classifier: Programming Language :: Python :: 3.3 Classifier: Programming Language :: Python :: 3.4 Classifier: Programming Language :: Python :: Implementation Classifier: Programming Language :: Python :: Implementation :: CPython Classifier: Programming Language :: Python :: Implementation :: PyPy Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content Classifier: Topic :: Software Development :: Libraries :: Python Modules Flask-WTF-0.12/README.rst0000644000076500000240000000165412542143557015442 0ustar lepturestaff00000000000000Flask-WTF ========= .. image:: https://img.shields.io/badge/flask-registered-green.svg?style=flat :target: https://github.com/pocoo/metaflask :alt: Meta Flask .. image:: https://pypip.in/wheel/flask-wtf/badge.svg?style=flat :target: https://pypi.python.org/pypi/Flask-WTF/ :alt: Wheel Status .. image:: https://pypip.in/version/flask-wtf/badge.svg?style=flat :target: https://pypi.python.org/pypi/Flask-WTF/ :alt: Latest Version .. image:: https://travis-ci.org/lepture/flask-wtf.svg?branch=master :target: https://travis-ci.org/lepture/flask-wtf :alt: Travis CI Status .. image:: https://coveralls.io/repos/lepture/flask-wtf/badge.svg?branch=master :target: https://coveralls.io/r/lepture/flask-wtf :alt: Coverage Status Simple integration of Flask and WTForms, including CSRF, file upload and Recaptcha integration. For more information please refer to the online docs: https://flask-wtf.readthedocs.org Flask-WTF-0.12/setup.cfg0000644000076500000240000000007312547354553015573 0ustar lepturestaff00000000000000[egg_info] tag_build = tag_date = 0 tag_svn_revision = 0 Flask-WTF-0.12/setup.py0000644000076500000240000000362612542143557015466 0ustar lepturestaff00000000000000""" Flask-WTF ========= Simple integration of Flask and WTForms, including CSRF, file upload and Recaptcha integration. Links ----- * `documentation `_ * `development version `_ """ try: import multiprocessing except ImportError: pass import re from setuptools import setup with open('flask_wtf/__init__.py') as f: m = re.findall(r'__version__\s*=\s*\'(.*)\'', f.read()) version = m[0] setup( name='Flask-WTF', version=version, url='http://github.com/lepture/flask-wtf', license='BSD', author='Dan Jacob', author_email='danjac354@gmail.com', maintainer='Hsiaoming Yang', maintainer_email='me@lepture.com', description='Simple integration of Flask and WTForms', long_description=__doc__, packages=[ 'flask_wtf', 'flask_wtf.recaptcha' ], test_suite='nose.collector', zip_safe=False, platforms='any', install_requires=[ 'Flask', 'Werkzeug', 'WTForms', ], tests_require=[ 'nose', 'Flask-Babel', ], classifiers=[ 'Development Status :: 4 - Beta', 'Environment :: Web Environment', 'Intended Audience :: Developers', 'License :: OSI Approved :: BSD License', 'Operating System :: OS Independent', 'Programming Language :: Python', 'Programming Language :: Python :: 2.6', 'Programming Language :: Python :: 2.7', 'Programming Language :: Python :: 3.3', 'Programming Language :: Python :: 3.4', 'Programming Language :: Python :: Implementation', 'Programming Language :: Python :: Implementation :: CPython', 'Programming Language :: Python :: Implementation :: PyPy', 'Topic :: Internet :: WWW/HTTP :: Dynamic Content', 'Topic :: Software Development :: Libraries :: Python Modules' ] ) Flask-WTF-0.12/tests/0000755000076500000240000000000012547354553015114 5ustar lepturestaff00000000000000Flask-WTF-0.12/tests/__init__.py0000644000076500000240000000000012542143557017206 0ustar lepturestaff00000000000000Flask-WTF-0.12/tests/base.py0000644000076500000240000000525012542143557016375 0ustar lepturestaff00000000000000from __future__ import with_statement from flask import Flask, render_template, jsonify from wtforms import StringField, HiddenField, SubmitField from wtforms.validators import DataRequired from flask_wtf import Form from flask_wtf._compat import text_type def to_unicode(text): if not isinstance(text, text_type): return text.decode('utf-8') return text class MyForm(Form): SECRET_KEY = "a poorly kept secret." name = StringField("Name", validators=[DataRequired()]) submit = SubmitField("Submit") class HiddenFieldsForm(Form): SECRET_KEY = "a poorly kept secret." name = HiddenField() url = HiddenField() method = HiddenField() secret = HiddenField() submit = SubmitField("Submit") def __init__(self, *args, **kwargs): super(HiddenFieldsForm, self).__init__(*args, **kwargs) self.method.name = '_method' class SimpleForm(Form): SECRET_KEY = "a poorly kept secret." pass class TestCase(object): def setUp(self): self.app = self.create_app() self.client = self.app.test_client() def create_app(self): app = Flask(__name__) app.secret_key = "secret" @app.route("/", methods=("GET", "POST")) def index(): form = MyForm() if form.validate_on_submit(): name = form.name.data.upper() else: name = '' return render_template("index.html", form=form, name=name) @app.route("/simple/", methods=("POST",)) def simple(): form = SimpleForm() form.validate() assert form.csrf_enabled assert not form.validate() return "OK" @app.route("/two_forms/", methods=("POST",)) def two_forms(): form = SimpleForm() assert form.csrf_enabled assert form.validate() assert form.validate() form2 = SimpleForm() assert form2.csrf_enabled assert form2.validate() return "OK" @app.route("/hidden/") def hidden(): form = HiddenFieldsForm() return render_template("hidden.html", form=form) @app.route("/ajax/", methods=("POST",)) def ajax_submit(): form = MyForm() if form.validate_on_submit(): return jsonify(name=form.name.data, success=True, errors=None) return jsonify(name=None, #errors=form.errors, success=False) return app Flask-WTF-0.12/tests/flask.png0000644000076500000240000064076012542143557016732 0ustar lepturestaff00000000000000PNG  IHDR sBIT|d pHYsZEZEp+tEXtSoftwarewww.inkscape.org< IDATxyw]==/Y$l  &y@" >"DP@EPQA0l 5 d*dg&=Usg&z% ?UmH X,w; `B0p`! X,w; `B0p`! X,w; `B0p`! X,w; `B0p`! X{vIr$ۦWo>wT'BuXzUUI~#Iޗ/= QU]3/&ytHb'y}wvNÜUIL$G$2?vG@bsSU'yr\eIjwBgu;fj0cU%/'y^}!&\Ӧ陜k'Os;c f0CUu$x%ySc?L$W\sד:3p3Ƈ0ɋ<-{$wOr5<Ŀ&9;jk&cvaNH>y6UU_ggҶu},`g a7TIޚk|<-K{.M$7]_Mrⶌ*qyI/=ICIny*ISU?9*8'UՋNr~ VKr*o;=ɭ9$@wXzlWuz%dWy;; -`+%yn[W^2]%^3|[CT풼)uwfBU]9I+I.:ɉI^ݽmNy[ ajk&Vxz;y'9rzr)svc|fo%v׷|/˖$7H$Mr=e| RT<-#ubc3 2p% ?%f$9tm;pV~4xv\azd k8i67NrX&ɻ=~mINI~#lCq'!! V^WWgvwkgũfhtl$Uu$Or$ +ɱyI<ǧyU_6r`QgNX^m+SUWccIޗYٸ=ILr$YUﮪͫo:sۓ2B0p$gsMг>=:]Uݨ(I^wJrRUn &IduzGW#` a$oZoIS۳/ZUuxUs&=)Ɂrje GU6^TUp1:YyrS`Tͫ|$99kT?ɡSêt|f~T&lSUu$MruzڭI^fd=S돎`zwv?Ss;KSU&DerzLgsnId9۫$rJU IO}w5o$_Nr9歧'JM%UUWK[I~1ɞs.Jr`ۣ&yR&̶>Nq`'*u9IOXUlzYیXFUu`U(rƏۓğ>:ع$LrLwܞ$׫ی`yڼ2ɩ+-qΥh?:SUm_J$OMKwU=::ޘI5g;:ekd+3U}_I久X/Uu$+ٙ$9bt#UutO'yU;|lҪ:*I$ͭj}VUת7%l/>`tTߒ&GF a<>E+Jڪ[<6ɷնTUUճG=G2INNr=*Uu,'w IOߚ䯪ꗒ|=6_%yzX$$ Y ۟Ž|tv߳|pwW&yO&}˼0kUuhU?_&pLU$Hr=3t,'wM}a'9g!G|'蚣Y+Uk| mG̀;ڳ$3r2p'9f1I}|9:fc|6ɣآ1p9$X&pμ0;HwY?PUw]_ګͪRUoHoIn{wtlD5L I.78iF awؖ#TՑI>9Yޡ`#|([28gQ8! aκ$UU׭亣{(UI)ɭF,'0;>6ɍ*IYGTw39= .EUݲޖI8gA0;Vw?6||t*7:WUWo&95o&{p"1pV՛|$ɽF,mXNκ?:ɋG Ij:&a&9hp"2pKkUk2yOR6'0; tS/wF;CUU$'-sF+U%ll0; oMI>:QOrrHrI;KXU$OOPǵs;C?ɛGaXUu$J7In<8g#2p`TMϒYI.78i30p`=F}AU=4ɹIݳ`s;%yn&x)I>8g36:d /G%98?|/T}6:,a/Dφ;ZU$9dpfw2:ޖI4GG9đUoI>Y2p`S+Ws1n7w0pL$ncFUվU+I>$wT-390I0hilr2pNpXU1:gzsW' ooG<2^ 5:^SU mw3آpXlU=>)I!m$'0;,f?q WM, kMrRޜRU[ꈪzC%$7FUUut&d%eePU7&9=?%yh}Vwctkbr Irzpw+%yB% X`UuLLsصmXNNpᝣv$`}U^UuߪLNY/ wuW'9#Kbܾ8!F!I.3Sm<8c,:<#<$^G؈ 6 FܯޗIgn`I~az]opa|s#ppg;l =:`n?^UUN$'N?~ϙw@U2;?ߝ]g%9mz}1W{#&Uu$ ҷ=ɓ+ɖË6XIn29mUuJ|+9I:g{evyv^U})G?1X7UWdFc2م<1ɍ0{ Q"WU'%v$&yCw9:`궙m48sQw;'yB\vp~aUI.zQU=ɳMnI9$%9wzKI8N VU{'yH_ 60UUI䵄{&E'0;,&st+g$zz6:$Mr${h~v?b}\fzݏ/d$${~}LIΜ~ᯝ#SUWK$\ uW7/w(X\UcINlgN aTվ~uINL$K>oP Iv8d3bw_gtCUId/vkGG||qFBw?{t[&$kgv|E }5c]|^In3U$ZdꡙKF.LT1G0 LNq~tیnYN߹+I$g_0"e{g4^~ls`g~<ے2 XzF۹ y ;,:(qIZ$mIϹn7:`'::Mc֡FMUߓ\qt Ý3:乣;X8Np`wXUG&'`O$t{$wsܤ.g+GwNTՏ%9>L8Udt ! aq$Lrdwc_$yWIΜ^Or$WNrQ358:`;w{\GlUgMr-, wV뷓<:mtJ$S?_પ{&wW.L$d|>qz蕓\eVIJru)EF;0o';+VUJ,,'0; TU{$yuGNvV+ywI^}Jn>YI$HSgjp,-$,wVcC0? Uo7'uxw'eU6e2dںϻ#dl}$JzB&<ǝ#' $9ltKINI<'#X8Gж`9UuP~'f>jzGI3>IwGlg$`)4MU+ ;+RUWLrYU]-?'-I>/ۓY?78:`W9;fJ]{t !eRUIrBoܞ$>q{U]'ɿg$g؎A}Fq,mXNN >evにULN>䦣[XXNp`0RU{'yA'nY 7Jã#.QU'% IDATGFl_N$B6s;Cx{abŽ//Rq tw7 s`Cyq;g0#Uut&_Xο؅N, <:bnq8SI8mtvSU]ޘ5IBz<$WF}0:etkvCUc `GNFGJww'9t ډ6waax\O`0;AUm'$?>WV#ɽ5M}{[G&X>'mzt e;RU]%;.M3p`wXګ0I8 k_Hr$9lgN9'%yT1p`&}$wK$ NbmXNp)INH-l8X_I; K6>6ɭ||t C0S_&y~3' Uu$dkkݟ;&9"o8}t2$9 X7}bw?.U<: v3r;CvꦙFy-lJOU!d'Uwڙ}dž1o`t9;,',f! a~&&6%yU2:`w%EOI,.'O>I~*ɛ\88s;Cu~TNblr2p$Uu$oMaINU߇ o:tK&<4)X< ZI냓wBwݯ;&9$$9spwnr'y}=FNHY~C<+0ۡ J$Oٸ>݇q$OX|GG|RG&3m|4w`m$_[`j'9<_$9pkw5~$ĥ6:dLҪ_J$[GI$'WX>6ɍ<&W'0ƗFr~Dk$$g Nbu _$MrvG YJUuh%-'yM/VoTՁf/WgWƋ}&^Ir$Vl(InaI>78tSUf6{nj'zQU]}t,tw%^X&`$?9\:'t~c&?<3~lr2pg GGKNL&9XU]In\88s&ݧv;ɩ{)w67!8A Y*Uu$O.$I-b$J$ߨTC]k6= 7#{+M4߉;^w$ݳ e$5:]zEw_wLr$ω/~I䍙ZUPUXXÓ<-0~~og2t?~p4ϓ-Sٶ,MV,:4GwK'ZwyɿPUI[a_c}6dr{8`U:I^䮣[X(7?鵳L׎~|i}}[3y??${wEC:2K\gt >ztZUj }֝;K䙣;إtVUuLNr8GȏJ$KWUG'I.7$'r&~3W{iO/9|_d$glwFG0UO?H-KU0Uu$oCӏuFG| YU$.ڛ*Id~$:lؖINJǓCvnmI;A&|$֪fe39͞}$H%'0/Uu$Or%qPwgtg>I^UU_{$O&+.oےF?ŪVO$9e3INm:ݟ$nR'yw9Jw_{k&\uU\1X_:)&%gԺ̪WO=K a2T`Ng2ztqL/qzmܪ\&c߻ME&yMa>Iac:>ϫ=\9;_5߀KX}rU:Ԏݳd =NGlr a2y.LO#;~~"?f|>In:.O{twk!uyI^U7$yzv7M|yzPUVߡIn ܗTwIݳD륻UU$yMlSZ3ˢ$hnaOTUWMrL?dx%$OrxSanYFS$o|dQUՕ2ǃFm~8UUI^WF,멪y81pgTݓct;~z?iU]&=3+Aݰɝ=lTUu$[_NKrXv'9: lNuFG0^U~_ݱU㓬ˡKfϖ_ݿI+SIάO!Vߓ6I>7lD}ZwoSY6LFw,G$/ݱ mrr;K^ ;_o7:⇪ƙ}#88g3ۖ-}`KIn5$ɩInY<0Som;.⨪%9jt&vLwdtPU{$$wݲ獎`F&:89/eg,0DA$ k"5" ʲ O1`X5Q$QD A$(A$ 8&tuݧ9}꩷4UUw7cw+y$IMhE:ɾCHPUvv6Y ̏ Z8xZ,cj:I$I&RUmجu1x$Ia^R Oz'.nGYxtJr}/$y,Dz%* |Y˪sUuƙ$IҐJr9"m@$%y7p_zE&)ܮeO8u1 gI$IDM_[g[$M& hI:2ԷJrB-Mtu19Us@$i$9xpm,$! ZI|qQpUN;#Y$I$Ij-Y{Z$5a]/)s6VUC)7qZU~@$i$9rB\JrM;|ʕhx%#9ƐwI$Iz8u1`]ЗH9t{kb*ܘA[xpvU=uI4\ |u ?mwT7Z3 Z$I$i$J$IMXpz \:n3Rӻ\d'LMcjA$Iy?plVҳ ?8Ұன u1wI$I^J4,K@ZmYU1]I~ lqIhUL$M'<׮i@j-5I^<8u!re~Iw'uÂ$I$IK{'ps#*H&@om@)խCD -[gou[$I!ɥXkܥ$OneH8]SsH$I4L\|uuI.͏Zm^^U1InvsCHCH\sLpK+3Sl@#=C8/$I$i!hc-n@4,KK;u-a[ZXgU=$W,̅ʟm$V.kBdKy4wMK?mc-j@$I!#Ȯ$KNo@zP˪wUUeMc3sqR=!(B$ͭ$)@Á`.ஙOJ$I%-9Fh$IXpZ9/VUݖy}`W̪:^ndzkUoB$ }k[$wu$G!I$IƒSܧgqe]=w73g'qByk+JGUUV.DتuI4\|uIHr> q-5Chdy'QU;+Mb[ɟjZj!$IHrp|gJwQ#I.NkC$I$ SuI.8><6}1ϒ $WĿb UU1H+sD}kY$u㻭H$xkuZ$I$Icǂ8]Ԍw:,] | xTK~a|$#piVS$i|uIZ/?m#NpWW,K$ISῑ$ =u8{'9qYKr,)>KUYm_M%IR\Y$ $vҁZ8uI$I4>\uuI:4L>FcLWy+W<`S``cK,w7;x2˲ $ɵK-@SxwmIp+daUh^1 UUg'uI4T$ $Wǁ2K7䦪:غuI$I4VN:Đs$ 6o` |r)߶<xTÀuXU7dޭʯJOƮ{V$Y43t.>>K,g'$S|$cE41ե.I$IuA#$ Ҟ:J W+BUx:\XY~}n`ܯKr ֟`uT%ϗX~dƓ$Is$iePUme,KG I$I%ŭH&wii۴ /LU=K<`ƛ5vN%9m/ko_u7zlƪ:884u͒IHru"_JRgVU/nenl@cT&8$I$IW fj41 ׭_5S,88O=8~65֦w7˫کGI4>l@u^twu&IZ$I$IcłYp$5c]mW9}IʓwU:8࣍V]oV6zY \ |G`Adc-.6PUlI$u$iU\ uiR}>I$I4Y,$Ik~0ys,F`aUUBm;wv7m9O9:kUe]g:l8q%eE+KvЪ +&Y6$I!'K{Ѻne]$I$uɂyOLyIz 9c1[_ ,Wh}aNސ䧳HU8xH'f,QhOrl6XU[GOu'$ [$ISWUO~:ǘo?!Jpe[xһ\+$'!I$I(uZbH!$IɂT#[М6𶙔qYz:It:خN&^ $ij+^:ǘ. XUɤ 4F9s $I$MQUh9q>Ƀ[$M&@kUs>^]UGVծUu=֮;i M!p$KcO% }v'GUa$IҪ% uI$kcnh@c$I$Iعu!\IR3[ZO@@jju3Uu)ppaXkn~  p嚍;N TUHrq<$i:$M7=25I$I +g]ԌwM7nBC' x_c m[ l_U{Mr}L$idqU8u)u$ "^H$Ia} I\NĪ{k-N<:ɦI^Pn'oc̬CU+I9uI1:uI$I4V,%IXD>:9 IDAT5& 5I>ƹg݀/#IrV4IBBag]b]$I$uwIR3[ Ch,88 8>ɢyV6ocl y$I\:$MWWI~V5(%I$IRr[$M. 8UOshl,Wh?4(h}fbM#6UsJ_[z7px+qc[xE$I$ ZrNp$5c]By+ddQUusLwKUϒ$1$M$?-ZgY'kP,K$I.:.IjƂ&FU=V,9N?M_UwT(j-ց$I@׷ I.!Vł$I$IsX$ Ud`Y42Wh?$I$IR`nE I\pȩ-k4-~ |88ɟ-IV^+W-p4uYUSIe$Ic]Ҹ5v I$It3NC f MEU=^U/r88$I>c}Ʈ,v.h"uUa$Iq׷ I]Hr9, kB$I$uɡr$ !'k(UՆVsgwoHpp ppdONvUuqI.‘Q{Uu4$$IZ:$uC`YK$I$uX I\TUp_Q#oܫe. O$V{Uռ${NauO8ޝց$I$5=|zZZA$I$KNp_1 f,kT]-<Xe. &Zj?-IF8^Cۦ#>ZU|dU+$\U=xiVv^VU>dQH$IR[GA%I$Id]!d]SUG`Dze&Ҁ-~ '&Y6TӁWV MipUSXo7惉9!)`תz+p(]\"I$i־Xa'lk,ܼ$I$I170Ĝ.IjƂ:UU/v8k1[GI6UcYܾ-j$a8S'{e+%?4¨{p(pFU}Z1$I\k"ܐdq}k2Xp_9OXnW6Ny$8^T^$ԟe>#AR\PU頻;$I$i>E.h_Mrx$I$I]8$ zp*pfD9Л$K$'Kl)>תj_̟ºyMVAUZq&I$I|F?~59r|J$I$3HnUuWcS?Mra4$r3-"YfTǯ|ޑ?dêHY([,I4M&I$iY^M5%͎'%I$IRW< IjƂVvhEdInFX=vl}`@U|'LwZ}k f~VծI]`|6^e>y,knZdU} \g$I$?}a}Xdx$I$I]8$oWWr mݓ<&IIXU[UU#-rܗ^Wgj,3|66 }?4 8WjCI$I.ySs?ѻ<,I$IqIR3ܵ\Ut`o| >Hl~$;$JK_U]Uup5^ܥ8 CUr/gu3)܁̪ڦޅ.5UΫwT]g$I&Z l[xY$I$I4,/v.ҕ]l]I~䖩n֫V^Uu

lUU;%8O_ޤmfx\}]rpe I 9î/Uu_K|5 +I$iJ,/F'%I$IRW< IjƂ镧՝EAׁ#,U`[qk RU/OrHU}6sQw//狒\.HW4`isO۫$I$ixY$I$I4,Vh`,Wj_sRUzm\sk#U&w`mRUj.5B.]J'afH`I$I\%I$IRW< IjƂ/lcL>YSypUWh1i>\ TU*/V ˖uz[I^U/}nӻsk@zݏObJ$I4<,I$IqIR3|A҅ˀLrTU+oe4^\ܡm/_VfoE,ٴjcv%WU'9K$I4 I$IƆ}2IR3D+WVvo44O'Oh[UHm.̧Wǒ|׬| *)e:^GIh$I$ OO_/^\U?vLryW֔|ޝ~֡upaU}/ޯ$I$IyY$I$I4,HI.ƪ+Y~SU/bem^%$kU tw{O``:V0$I$Isł$I$I$IXpHlsU$t#UughΝ%3Y~j骪}ڽU+|s|7U=ze0$I$I]ij$I$I$IXpHnSU$ߚUpYɖvKOe?8;ɢw [8L_Ǚ|oX ء\RU&SX$I$͚'%I$IRW< IjƂi`nW<^u˶qZfUxW#RUm<, oӒ\>aY?Uu~tfj>8`ko^IZN=0ܗt7[P`$4$I$ILk@$I$ f,OZXu]G{2pJPU'y46~PU?,K>޴;vϫ?/kfTT}r3kU'9g֡V;f+x#˿TNIt9 /«/^XUgѻxd$׵%I$IҴ ے$I$ityAԌ6 8 8u,UXnhxp$:p1O[}݌tê IhKyOqy('nd=4'ə3I$I4x$I$I$< m*}_ E~DWચ|x+)e&ѻړ\QaU:&UukSgݦiVcKZsa!7pH[ƒ$I$i<*I$IqIR3'X aMh? yESYxIZVheFx{V VЛ?] we: m_._H26H$IƆ'%I$IRW< IjƂ~oWh?<YMd?Wh]m#5wbzRvcU3[5+j9zҽﭪo{'9q&I$IngI$I3H_/oc4ݕ[tL7+ E{U=M-M]ڮdB^p՚#;W/o'Y6$I$i$I$IXp$5n:o۫Uuүv'{6Hu&9y}c6+WoMcg$y:<*pnUjH$I4<,I$IqIR3NppIN5p $Mg#ɹ<`R#ӻXh$731V'$tWOqsNzJ)iUg$I$MOӛ2<[WoLtV ;`+pJrfImI$I4<,I$I$IyE3jsݧ:ӛ0b$(z,li K ?z'%_ II]PU͸0I8$I$iYp$I$I]8$ O2}xgçz O`.iЮکAۈƟNU9Gݏ 9Odn2,6^UWtq&I$Ixij$I$I$IXpI.'+>M/WDVxsHs zC8ϸcNAU52ttj4:@c $3I$IƋ'%I$IRW< IjƂn䪪 YnO%9we'#q &9qI1?>ǽx=,#6^:ǐ5 U$?nG$I4> I$IƆ.IR3ܵ$Ws_8BkVZx!R-5r y&0߶kud킥e=QU5YI$IF'%I$IRW< IjƂn'-UqK,&YmVZ57 zSNHqI7?UTzזt@Ҍ*`9T=\:$I$idyY$I$I4,k}UOWhXpXGԞy`L1No8 #l+C zM[$I$$ $I$+g$5c]{/ <Xm"iƮWl>*ɵhs2=<{_!hc nU6I$IF'%I$IRW< IjƂfll/l4NWh?8!y45^Ddn?` υ ]E9FَتvOa$I$I#㳒$I$+g$5c]VU/^ <Xi if+y4I|l<,7MGJrI شu1l4/#I$Ijx$I$I]8$ . IDATZZ`WzdQs:B!I7γ\UuN.YceyoQKIn~_PUw ܫv?..IU?ڮ.qq.xM[$I$ %Odd0EcIUK[$I$ O=3Ϻ׳$IIgI$I$Iěf(fINrrUuzmUتܞd$.><~.UuPˋ$ ੭Uzp/tM+r;Iv[DI$I`]$I$uIR3%Y ݎ7#tl$ofy US?pW`Vs|n4 +]k>\^4MorWnUuĨ8J(T,Kӓ;AtOTrI$IgI$I$I͸K j{ S꺶zu3!;cp>8NZ`oiN,^KIN7q^<z_Uu|BJ$IƚkŒ$I$/3H6|x^,x˭SNIv+V!V'β= 8)ټNQ<_I~QU?#$I$ixY$I$uIR3'̠p%h"] |[ ?F$o~ ֙IIǁzn9p"ppX ?86X{)äzwofLz<,I$I:$ $Ɏ΢q!]:qH5sH&ϝPW?#ӝgIJ$oSUׯEU$OZkRI$I8~$I$I$IǂHi]m88.]m#^7:EiR$Yxf`y u߫O}d .9%ن >}56$K[$J$IwV$I$I}qAԌ Jm[\hp 6]}$/Z&AG 0a x֪`lKWt*X`34-$;U.Y6xvo$I$Iϒ$I$/3H>:)QU*..VGy7s(4֒<˾R`Sn&؍d`Vh=cCWW|K*I$I8ij$I$I f,$c}3cn[fyU4ՄK>lqS$;HWSw=Ջ "$ <x.pz$OV|x_T }$I$5gI$I$IXpSI^:ܶ~NUUTms76"$+?!TU4^裏&y=3<-`;W̦3c{o%$I$5OIcIIO}-#2S[f$ٱ$316>w8I$Iȹ$I$I$iYp#I94+O+B+ !oNO)M$vOb;q!UuI@W~.8` p_4q^wI$IZ,K$I$XJZ>&<7GVU773lngw\c۪w)MA {;`gBc-F4OXw1cII-sINYk{U9C'I$Iח%I$IRXp$1G%ho>PU3 I < xiUa<I?Uul$[~/`[R"LpcG~x_\`VIa.ϿxM$I$If]$I$ɵIRK5p8ݎ_Ϫ2 ,2'r{al4w ҂dS`_Y[IyXBU%YF;3{̵zajy_$I$I#IgI$I'$IMcxCIG[΢UZ<|!ۓl?rrsF -$'f-HI6N$G`7ƫE0^U^UWC[$I$͋kh$I$Im :Vتu% `y1$ IbΡYu>%Y/au s{)y[?Hr!/ U<;KOOcUUgV[j>Oǚ=ꝭH$IœΒ$I$O5H@vdx|ї0<|9ڣa5So5d!!&ɺI\Tr >Lօ3kbTUOU Nt4m*Cz0$Iy$I$Ik &l`>&c^KIXU+*O}.۽ܪj^d{ {{ dHK=2YeZU:ĤOH``w`7``FѮׅM$IxY$I$˵IRGtj8!^U5GNNy<x?+?/UՕC_$OR]&ѭ,UUǻ<0`ŐcI#V<$I$i<,I$IZ$ #shζNJ.MUu}@㪪n^!LC[Z.+? ؙfkC,TUu@-; >.l8i.~HwUu|2K$Iƞ'%I$I$IoN-ic8888XkDsxz/hމTUJk?yIv:[K[ffg 3 <8:KU$GcsV'I&A%췔4A$I$iV<,I$IZ$ Cd=sӸuWJ7g;Lr]ցMU}#O`=`V %o_($;qkFMC[$I$IIgI$I'$IMXp7hs'߮z{w`co'9ցf#twؑn o|\xO/t%eUǹ!MntܲCMCM+!$I$IҬxY$I$ɵIR܇(mcⶅ qG qz$o*I6 W绣`keKJpA|ܴe $I$MO:K$I$I&Wte##{ޡ}u0¹jO`$_^[Ug4]]wKIw$yӰI+d=[v#a]$Ic]$I$ɵIR |Lǵ1$W_+UUlcF^ISU-o ɣc'9HUg> ɝs2%-s-%I$IYp$5a}xngW_U׷ dSfX ;¦I$ˀ[}-/M̪|iI1]i}q/`ߴ I$If͓Β$I$O5H>IJ`9 $IZ< dC7ѭ7 3;*IҘ.I$IZ$ z_ ]a檪K ྭL!V&Nt'GI\UxE/ɖ~ft3SIWtH$I-% gw6$ݡK1UupSJR/ I$I &,$ZXs[i[XQ>AIw6l v p%o88몺fX-[o%rtwѸa.$Yn\sIxÏ($IYK7V`l^lCw7$9~dU]{PI'%I$IR\k$5a?[/ҳonb!V&ɆzGȆFf{Vpl5qo+ l<ϘjsyqaYfWw4!$I4vxsC-Or":%Ot$I$I}rAԄS7Ik[:I6?6hIXU7ѫ$[@WdtH-e%y5s=y}5+VU]t_fj$IN{^8GLUU!#IsIgI$I'$IMXpA5}[LUAL9/[g8"ɞUu*; ¦gZU7 qJ)X~mˀK?Uuys ,^_;%Y2w$IV >S콐`$MO:K$I$I&~<جuv窺ux/pF O>Uue0SUՏWЙ < yzCh<"I] ;K(\M[\otdžTi3}AU]_w%KM$IDIPM#r $OF8$wI$I'$IMXpdzZx^U*@5F3wUlP|ͨ朁S<~:lTյ IxzuIRU'e90[`]$I&Rӌ~kIvM4Wn I$Id]Ԅy8ݧu"iUu0'I#'n֛N96&5񿿮MvC{NI^-Uցf-{݀4tJesJ6~L^tUeQwI$ICLލx+FKxY$I$˵IRow`~<{AoR3xٖcwp p4p|U]=ߌUumCWkOnЫ3 I+oЏNRcḰ^ܿqܶ~fU]4U{̾o1,$I0'>;$i<,I$IZ$ oW:k<׀Gܾp&p"fVn_/ \I6ts~8¼5 ;I:|Tǁ큏}ߞم6IvNIXnd_+,jzuU}~hr> Y$II0VpmHI$IgI$I'$IMXp4vns&yx9LT IDAT4kO 80ɼNBW77m0ɡIiY˫cvŞ?%Y/K8 ؟ߢ&˟xyUWU﫪3F{ߜ]$I/ZG5O:K$I$I&^$+Vp ̝d p(r{"]SU5pU}:ɥ瀍GKv;˪ց檪;ؑU83v$/pѰS | q77y%I4ivm`NHZ,K$I> Ij‚lܡO0g}sk#OVՍCFG|a3OwNUUui@s1{|w0%ٰ;"2`"w'ҕٿ`.Xݝ$,K$ib$X:խHZ<,I$IZ$ ˞s^ ]U5` cNAyUu(JUu6ۀ=<<83nGU_UO~=˗ w$NgnBw7WnUU= 3x"I$hDHZ\$I$I}uWI"b Ij‚zUa=A}PUo?Uz{Uv͏wI$-4;0iHZ<,I$IZ$ 3ʂ!}38إyy8ΊطuT/~u$OJ[] رWUo[Z9"$Iԓ0Ǫ:uI'%I$I$Iς%;|SU]`IRUV =ۛl<8`=..ioUueU7ݿÀo'QU?͘k{ئ^SU?kH{!.$I$I$iYpQ<NyWUՏsIֲN.R8~TUy'DG۟:z+$8:ˁV $IkI6nc৭H%I$IR\k$5a}FQp?vO{!9q\\II_USU;tQޗ/~&g]$In\ WTo[$<,I$IZ$ sw?,xodRI^ 8bu֪?TU#9'C̶ >I6yt{+$Iݲܽ]ҸpV$I$I4l` ~mc=nwa p! duwnfVSp.48H1 +X('I^ZUyl %YZU7$$I4 Id|:$i$I$w8:ڃcWh}|pL^cWWWLXU DFǵIRn qy&5dgSqqRUȼJUuA 鏡+?~v8,ɇWVUݰH$Is8uIp=NfipuΛ^4Z+O/u[e$70ܮ$̵IRn >!ϡ1dwbc[gU'A AwB`^ lUuVUGrAԄ~'˪Y,vvl88xWUMU^^GS;npd){c]l dOKC3CO!I$8:$ ,i@d ܶ~i0H/sZU4ؑۖ.f 9yUU#)iq.Ij‚MD=ɺ⇞koT#kb ~x^d3_k`$ˆr<x-}8ZSQO:뉃$w!WWx_I $I;I/蟩 [O:K8],;lpx1/$Aٝ[gTU_I$َ-vm-౫IWv?ǵIRnػ+@FA#k v13."e{t0ּ .x1j஍hf:-<< |.]n;Nx݂c&?Zp$I8I䰤1IgIckpp2n,;ݦ|$Nl$#Icepnܶ~Ǧ"m 0}s$In;ߡq83gVF8P v[ =8ҕo9|9t!JI6^ ˮ䤪ZRU2K,R3> u$I: IS,1d{n-?>"EMn-"& tc괖$-^;{?$wL++_Wţ'il IjE9\Hs0,aQ-ɱU51N?Nn- 4]b$^ <XEuCh΋Z$I4Ʃ$i O:Kj"vG-l{ \LUa6I =1~>&l:8Hr㏪$5Z$ s"!CO㌺1${Vյ#{nb5~:lOWlU^VU?lBco&Xp$I8;K't4IέeG6 ݑ|xUm,I Eӕڟwtb' SJU嚈8 Ij‚ zgwG&kB)p#rÞ7W[D.IdmADž;K't4I NWhq5z^tꢶ$M׻ӕ6iHcn- oGGUUI",]_lEp)p p!pAU],$50Iq.:=[vUuC 3RU&9:9>aUu0Nrt;~[xaU:&LhuD$IZѝTV&i,i@‘dC``oX|GˀwoKr,rL\'/wl8n\xu8peKI$;b_738V65ܶ> p9Gy%i,CUݘ`!M[4$ϬgY߷'TՏ;H{ڟ^>4ƴ͒ji$Iٹu)IwIAZjwc $?+u I$;;qht!)$>SU6M&i.\kQGua=`* Z|_}/4*DWpߡ1ZܡB IP6%x ݿ.P/~G[TU,+߉j˵s,讨<.7Ek&AE$Ij.t?王_ IxYj%Yt4 ay0$ݿ:I+p ݆t*I3$>`9R(5$C1_C^\mW׬v,IC{/5c $Uì8 ;KLsO[i6/i֝$ICLqn4'%T6kG+I~~:H.|Է; CgQ5 ɚg[g:txީ\ʋ7Xz<8jǕzujҸ>ߣ{c.6Uh%٨4)bI$i:4.ixYm$xy-^_7V84;s Gs:Ҹۊn}No5%vCL&L$_پb\|Ɵ&y?n!M`NwsO&`8*c˭vo:^亪zc LI|- iW%Iq0nwwp4n<,$ҝczd!Lw>o/$I"3sLƍk"| D|_ЊmOw=InВf(ɮܮɶ$"IC8fϐ{87:qQ؛Ok 'y2.E{up\ c,IL/o 3}!-I$ָ^Zi}MXRϒ;[4 I88mP4,Kr-aH=Yr7!i\kZ&αHYpAU9^S dž;{0 n}#U_U=ػuy(J{z v9$I4GOi`Kj^$-.t$k%ynp#=:KM?eIlcoZB5̟wiG3L;NZ@,CI{5'{$rQB tR;;U}-ghr .oO6ɽ{r6.Ih>ui.j@Vd$Hw';7c $Of0nd$^-luHK5C-mZ&ÁwvHc/=MROHI6ќ72&y|- =s?>):l&6:$HraM_3}2mU'UUCh2$eO%I4I^: qIgiHfg'9 a 8ipFRoN5#Zt;5̏H!4Zwu?c:YJdn0( R**A\&֕Lb=B4*C۾thI;7tpاt1{DQE4% P8RIJ^^:H04}?/*'tp5LN3#=Dhk >sEV S)vN%[y+:|p JFi{;Lx&RTƌI1tp:ʢsDHz?連[Z"GZ;]_L5vQ?k٥D 6͍dK;ؗ޽ھhz j`:0t``M+zTF5a 2p[H⒦跺votpzgDvi,pMm_]:LĠp`,5%&PIEDw@"*$z/]f{z4RT}<˵%h{!qa⻩ cOŁ{0nDDDDD[$}x}H,:GX}`?`q"&b9`Z=#@BTtZt5L΃D )PhQ]gyl ܯ2Az%g lj觥n$mذtZtߛ$ۗ/#b ѐH{~|X8^|cJ0@}KǍ(fn /=t le?7oU;?1uK搴Ci GT&O#'5P>cXسt:pY"*"#s >`V"k4C"q4pw>1^pzp%6I ?>"JjBv5߳=t(Ktpx۷6uRTDDDpH{IJ9I|xVhQWYt1I+J'5D%W:DDH8XtK\CpH"Cb$aK2- ]k!`o`oIN^q"Rksdʶ7f;Qv{:GDDX֓4%7'IS[%Ձn_Q2QWij#>JnDTmz=3J(M"D4\:G x6A"l&!?R?GQuֵ}]Kw GZطG׏)ZwKFZ'I6奛8~A`^GDDX S8GL)b#~m5q[cHW.4AT}#^ Q:HDI^M9"&gUISm?V:HDd[lϔNA`y"|>oIgpokM3fybHHz!J1^[ы(6l57#"";U,E}0kD z011|o"IoڽD4g%}CD i%JgP@A""s d$ t߱T#o={l?\z i``>i=PMr:/$=85VKFyL-IuSIDDD @T%z?^ѶGDe9b$| شt3pU#[ϓ䩟*^XX|/kIhM"Ӏg nEWyYkwZQIzU__Dk=I)pj9>a#0v/9#""""A #β1V/fGNonN4خt)J6IS,'M.Uny VNUF`cmRQZkʭY>ï*vHxs3 DYs#J?6bXu Bk FywgqGDDDDL^ #β1 IH')n?X}4gO^ X̲إ510ZORvۇ[qll`/Z;p[t\ }o~=4-3)涷Hq{@ K: `DtzawȺB<8AR,:GA󁋩^p&z xW[0}~Wҳוeߣf%%o~pZ{ۻv"ea؞nVJk NJt' iNR^qsDLǥCDIk:8㼶_/F4A eV۟VC o"ȰK`->ǶKjVOmoOuǀ jJtA%@olF FU3*M+XCDt?lQ:DDͬyo:s_q|7{DDDDDzKS@Ҳ4olZ:d~$m7UFǖV}} !iS9 Y4;K X_c \Q:HCuڙΦu |TQc;6V3 匆K{A.KJgJ5;<ў4?֏s8w4aRQoYt'ik4][(iLW:HD$- pV< i{f0l໒~ ,\6UM #J\3DS1\ EwٞU,a aV7ǒ,Kh$۾txvp<8Z #-ՅkDDDDD4] #""jHBn4lt^}uQlGo"iVLD}Xt?Kd>/]yʦuJb)pB>)rI 2p 7M1B+-G@uWwIIm?:k;xuaNY艈H{D\CPO}aHٞi|ja?zYCDtB󀏕Q)n۷ޕjG_SC/* bea>xtGG^,f{UoEg=&پ8t.Z:ܴ;ɢGs;8g풦ۏ 8g%`2))ps U>Xt;Pz۾nݥ JСC `gۻ~tad^ t٨t!y!g,sD;S5\w}KZ]#j-[Gñݍ7cTN/I5q0_1Xz/iVy|;˭[sEGyB۷qΫ:4Ku:M5 xts I v,eMU8tRl%EIx/8t9C}&ۧ`Er3[ZIZuy;{/o{ZmG9v:cye洠l?ޥEDDDD4ͽDDaJ$iC4&.197P4>R:H] ?,‘` GDT`:J~S7ڽ'"/[$]lS:ː s讏'il_e?lT? KnڽtD?s0 gnxIkžtqa@ms ,IoPɛ =ԑ2@^[:@D;$-|t>=`zqC, 1Rd1qy`k)na}pqQ$]"uA}#mX8eVhEèkc{8yUeXBDDDDDiD4Ace }mt:}6h,b˒k_l}rKپx9p0U0YKҢCD \:N _b{ۿ=l?#R^3ǖ _[3J7;;RmuҎE7.UD,yKKz5Մ՜zs;;,,MYx"iT`YWKhH{,_:Dx$=أt>5!blϴ]g7nk{[߱}kP^~B:œVnSIT߬S_).MDLf ۵Z;"21?=⊤~GDDD0KaSD4Ac`HZؾpAr#t~ksm^7t(0_}0AsϢZt>ڸt`NJk-)p,#jg^`I:@J%ؾKj=YM* 8q30$Mƍah@(pYL-)il ƀI֎!,O}Y1yo^Iuv822#}#F9tK:S$ˁϵyGz%!&S=p5Ս%8o6ǒ1RMyh֎6,e|C4ӀKhJہJJ=~Tkl"T ISM`W`{g@u9xt)V)MF?hαHz^|嶵'ڞ5 ˓] Ҙì#"% h/+e R3t$ƷJÇKl?\:Dtsn$tZ*Gyx. 8C`c>:"ڗ͚ՖZ\ҥBgl C^S:@4Z/ `絷Ӏ偅ŷ)1=" XN^Y:n5Z#o7Xt9I Xt>זll[:Kmj,Yx>"ptם^C VAGHz&C}08t֍ ;)p3IQs[]:P H{ ~8tk_ntpkfR$:S^#ՓI_|#&sGDDD0K{D4A ܣq$xk)b@B|LL ܣnW:Dm!lv+֒hC& /!j<7=tA:t8{t:8 I}*^]ND#uufMGDDD0{t64v.ՀKPl_:Ġ9hmIYZ4/k}Iӣh8۳w1f AC& CLKK稡MmJT<3JR7Puf˖![SM|8 .Yo/hI+y7wp^|Jf=T'&xZ #"""b{D4A1$,\:|tAgs4*CDlP:D{Ր=tƥD )I S2o,5aΗ~KKtSStU, ;W7~J76IkRmRmRsm`I Ϙ<,Uۀ:r$U7N|QO[ۡ5WX"@Ī[aKɠSKݧÒ|TқmK )`E`/ Fp߸3M.s-"""""b=" ^]:ǀzBU''b"$ زt>l*r\,<z@_۾taJ4`fn`coj}4 `s[;?OѝH*癄9BRnp@'[czj^@.\c.wo dDDDDD\ # u=JjۥC +.!=i}rGk^:DR?gZtN+&"}paY=+$8-IzU3g?mv^#i=m:xK/2DO|8c eg=?MtpahGeGC tqoO ܣͩr [K=xY:^3DēR>Z;="""" ц,GJKhEQGoJ8t(D*UUJnE[Z%>\:m\:@Đ<Brt`E]:LDgm'/+b@l^8ѓ%}سbu׳~8O--Q[:HN3o&'usۿQq3hۧP۷KK:ODDDDDM㈈:s J@3K'پZ߁KgKy}h%Q:K(33 IN/O.vA"bbR_#oe"I}b;'H &)Կ K:=L4!`Gḿl*>>wO cr87sc.fP}FQױs{}2CuSh>Wd{D4A~E-IZΥFw|CӜB 禝f+lq>AuSaiIPDeaHUa}؇sKoTMi[~Xl8ցV~H=o(cBl?&,`O/ BQxGK O_ x[cJ{DDDL Ǿv-o4U1uύ#~]tp&R:@ҽ>W:DQ@ ܣayh,gI u1J48Fa3öo.$":f9Nv2gA݀CJ"tJ'l.ig`ϔ1-Gttɺs)pxJ34O-|Y>cח&U-" u5l%wOg2IWRc)pRQ cl'i;Kpgh8I 'ە}r 1y)poSZꤱm(iyE _-d~3k/~#gvc@ۗ[Iz.p3qzwy\ #""bmP^g"iQ:s Lva#!upzCĸN.R}'iA`9,WJz3p&0O<ظt: `YGlOz%"! b:I^R:[ Qu{dýs-#{ٰJ ܯv1^2vI}~}1pqAܧJZp/"""bhۺ 3 MWXIK0z1/$EIq{D4EG]S:Cĸ."I{0t>K{t4I7խ%i$gh(ISP:K=|qDDwyN&Э|g?ΰ=}Z[o KvOlDҥ jֱ]l[_5t"I7>]Ą[$CўVג%M>nJUOU:@DDuuw ?*"j`#Q J(`l-Kg`J`gh I'0] uDD Ƀm3~SG+njkzۗ3}?hec_&pNۨ}版?a^ۧQT2T tpsU:w.Cپ6vZbY#}9IcDѮS﹡n50ea$}8.n "+ c@:?7 mV'{g2FN㱚X~_2pz'S)pNdeqۗ 2/{8h="" QW}GѶ_Pc)p`lQ:8R[ghIJ: 8 3o1 ;th$}݃%=Xy&cd=k IKxntafULIIzNDt,1*>x'wd<""QW>y߲~7X ܣ5J(dlV:6* b$-|tߕf*Q~7QGH:]zm;}S_ڇVt$%MF=""""eۇQ}NܝenvmcD:Oοn4fIW:@ Ibx;;=Ғ<"VelåDDΥ] b[}wPlYҍ-iI<@ҖGk[%-)A}o>MtS}].i.\/xɞڳ#5'M%ۏӝa4v5߀_.7F,X:D!k@ۻƥD 3Ԙ2?k>t7{qSmh}u>=H )pIIN?I}N}iⵞ &LIZ,kG:GDDD^p^KND4E]:@CoCٞ\Q:GM跥K( b'OJE #z' 5%rL`/`K۷1uV_؞ISvPuOS\: +2I#s_VDDDDmid'"" Qg@rm5H)TuQ, 5$mlj{ЛDR\gqgt ^(i\Z:ܣ|UU!EGDDDS>x)pY,=h,9~? }6phTu{L0{?4oLROcjYuܪzRMy Jh~tkJܸ.}p\#,^:DĀJJMHZ t:[K2Pgi7Kʈs?e{(4i,݇q $- ysȒDDDDD=~NJgDDSd9j?Kh;lY:HtE:.7F {g%-S:D =[Jh 4^Dd$ جtyxٞY:LDC ܛ>{%8<֧,!&h>JNJ[\s+p~]h,s%>cxgR)pqٞAtI>Fƹh JlNT4m ܡ=ln#72PwQj)Km_^:HDO M?J"^)lU:Dٞa{Wf z;۳RItm;KgDDSd9!jh&ܽ75|}5H)Vy1>\Sp=l. E{,`/;~t7ٓ< EyE rr;vۯ}e0akvdt.ֵl۟o[KC쒥CDDDDDپxt!5Q3[>t;J@tq~ࣶ& }&i*p"Yzvն-$"-z7Nk{t)ˠ=%-? 10_\M5 Xt3M J_n`^SKGDDDD[lx7Q&c""ڔhÀJMmO+$zj(ܣJjp%iUyE 3go*W~ DD.:| cnt%]#/-qd{&tm_8W~,)$T -&kEDDDDgJ瘄yJhSZsÇQ6l+`.H跬U*"hl=='"*}"i- KgWؾthLt7ǀ_uxȂ˻gXL*F~`8Q7ﶽ#&ޅh3\I]CA)Re!:Yx8梤/}[ )ptp~K' i!b0v{Upɻcv^ou#"jEҖTs+#ڪuhK _=z;<:S.BOEl | بtH{DDDDL˨&Yx&*p~}t J{N˿TTHzG1l?`W^ |xjT+mk;7Dy4Eרnꙧt3 DD3eanؾB J<I xeE*;f/;)m:pW\~:إtXthoas%e-"" Kz=p!n<=4mOJ ?]:G鎐tkJgY"b2N-GuDDs8s6ꢝk ֱaJ}% +pW== fN;h]:GDDDDGl?LU bLYx<^nr1O)SH$̔LQ!&4==B"EP"y!SB\2][m=\k9{~k]ZwE_06tʟ5l1C-3K|<ђ=- m&iq\`GDR>8N) Tv:^kl(41 =PpA`wl?R:CXt_X:G="Eؾt6z2K-{t[:m5kCDDDOK{IZXt>UKq ewRm,_Qpt OI1pInY8K kX*Ys~K" "P;,&{t[ yIm L;_z#sC.X:Kg?Wޮue`IOp$I6pBmU:K"ѷl_,i9>A䇵'#t{t[ '(I>t9sYϒ9ug>t, st;;k~>9)n> ='J+bKc?{DDDDwK)3DD!l?hc FcMq{#{3KKqb sIS%Br. X3 <5XN."z޿K)9}cŵہ;jo؂ߑC#0vGU6M"iY:u3 ѥSHɈ}x`\I+_V8H''Xa YZm>yS$_Ku&I8ؠtD`J`H7b,vAz1qC..nt(-R.پGc$-is ^? d3(dSJD6c`~ JaMwoRl./ߛgC-O, %-&""zB^6Aˁ.C6)fI0@jB)#z҃mo"xU`U>%id{eY-=g4eQI_.M-pj3""""%)i 1pl?hHۛ [ހx;me)n&eOvfݖ΢'iA""'dA\ll Kra% ؑzOA[{;PUT/N}e=C3WgkhU Ig>t= =EDDDD f-dYK~"h4;r` e%F B8Ow?)C7,ܣna>>ja"""QX:{,cjDt\6όl~8@O]58̊=%H}p93gqIW^_:O=""""}2ED?Hgu?"zY gJ!i`ZS>NvbpG1<2x("z^:HIZ^vM%PϽWQu*xSґl/GkHzO -J{DDDD"( IDATv@R:@DDu5"eOvf]e)s݀$R:HDDuIHUґ sN)nnbʀpN}q&i1 cNZeNۇ X;?iv`k|IWKQҼWE YKi|MܳPSDDDDв}5pzHf+{pk}lbIߒ4G0UYgSio]:K< JtvQܵ/K(d#J[$͐z]mox;p&Uɼ8KҡVg}Nv.ۥL {f/{LjvuJ:8$- \U:K< ldץDpJ`J{gۥC:6SvIHzQ#~j{=u '[ \Œ4g#GO:뮒.y{DDDDKG #d9"}f%=^)ǒ[u1Xtf3JtPQѥC'y݀KڻEOڞa{[Q}-Nfu%?zQ=`YQ\KG #d?"}f%> \/iA"""I@C4MT:HD ,t c  [́Pu.mtؾ8[v*t߫n}핀m[$}Ne~E폟4[-f- l[0Gycg~90t:d9"}f%\]:Aҗ+"bd=5p(t1)pdgcmb+;^X3&O7jqk%m@/VNϟE$}LR(Kj~Ll1JC6#d9"}f]W; ަTѸ}k6"b :Ձˀ7A~t}p] <\:D^{[K_ѮpmtJ(3R$#%Feftu:pIa0zRJiB 5EDDDDD{I # sDDJ=Jt!Rk%mQ:LDDl$mChvY:,`#ۏ1R g4hIiuZ^:fXۗ?h:Vo'IMיִWZy[_NU8gIoov芣'jt 0g/,(cGD?爈{Y%S:LDD4m($MtpzT+$"bK1?KI-wOn9]{vlx.RپǩfoKNtZg!{?&iy0{="""":FiЈnʍ爈71J(Nb05<إt=KK یz:qJ'ٞlrt^baSz5RIߑ4w~Q7ԾInێX [?:rU?H{DDDDK!#d?"V:@J(2WʆtKukM //~ DD' ݃ !zT`k9U릖klԁ,iv j6Ko:hcNtyڕ!ZgY%M+/Զ#ؾ8tR`6#"D:,ܣۏJ!$e)" :CBt1{lRs}~8tpS%űz]?D^)S;3~xt%5+gXp8oO}v 0+UG^ѫ+`GD?uʈx,JQUW+" :*_~]8NتVWR>f'6ΕtY҆2հ+pp IgJ5ۀ=586ImoQۇ^T G2n>mdFNRtp^u+dR`7#"P gQR {TB4 *lߓo~lk;FD_H;t>.0Cْ֫Ikm-kXCO%ܦyoX p7tb7Su?8{ۧeuHIzȷY:@DD}36"lۥCP?EYp -""Z6 ^\l^:KwX}钮^6IJ:8opl3`B}CjG9Ƈ> \.ZVd+c44[&mb{N/N(&# sDDK &O9bL/:VIIZtL./ c{e/}ml{:*Uf_WM7H:ER/,m  y^ޥ9#"I- PDDDDDcF5)p~ޓztw |E(("b :]Sa81۶?[:DDD3R>f0)p 6 mn[mU;f3I.Jҡ&mƪ6Z畔 Y:)puޓJ)p;7K:\ҲED )p4#)t//Ѭ,tKCt[Lr`{E$5T\`<49'H]7^0FDDDDDԫ7R``6#"H _(ܣsDݦtK" i1`Yt`;.$"Y)p mVV.:.Q֒~Am`}6GTOE%]7(p_ cDDDDDL$爈3[=&ܣW{R%t! /.V+Kn]OUDDJpAѐJ(z \8T s9FsMUIY:@DD~9"bHɎ+R\ LI1zAG"t~tVe1exB+ۿm3$ uc+{ |^dH gH}1ҽ}f= K爖."I6rwDD .IS%} 0k<]vnQZ|~a7*ijsW61of"i.=B3a6QM.)p~ҋk¥{JY8XDD:;RHu􈈶 q d;X~|x&8[-;n* _vӀ] ^f*]snyw_:^ۆ1RPGD?ȺDDoĬSmZh&I4w@} %\ pR*""=$l?\֥)W7{XlmxJ`%R^cGhǪT;48sϫ}.,,|N,p-̐ͥT{ry6 PƈL #"&WC 3K/#:b) vIߔx@}o$m ,Y8JIs˕)p.vik3cKyx/۾g m_e]G4svKj{凉~$w*uv?[ w~10O iӘћ+`vtotpx)p~7C"3K5A6?Eo~)iҁ""Lϯ3HEWcJk)p.*p$$p{7ჶjZqtw}.i c$)iFn`Mν pw4y9}~EejewI cEok=""""F F爈!{7'7 p6:y]Kg!o( "b}\@w ]V((":/'v) "U)p>vaS 2F^ ߦdll&i:=IfpŚSiB[J֥Jlğ_ Qҧ-[;Z28Oz-3)ۧ~'U1?0y$bL6l8=""""|W`ΈFsDDG gѳlϠa{^&ioIiæ:V.l'i!""t^ǟ DxYƲ:p%55v'k]><6S%Vo}jq|$m8u~;UaɌ51 {7rP95|lw^Y,EDDDDW6S_X`ΈFxJmj9zP:GDs^Bvkm/cGDI84k\JhV ܇ӹ]cI+NvӻgみHQҜ  xciWIS4Wپ!i-ISf"Z4 8B[!}퍩^o|8ꁊˁ?v3S >~(L{DDDDtSO8J{DDX%ܣN>tYQe_#鏒6(("Ê3H&Gjy9n.."'}8u}V(Isqi3%"]&Wv<]{4WC$"iI@)cz^IIN0Mfᛒ׆qf!?yv۫N<1ԎjE:"""""blwqc8_DDR;-G{zc|oNtJJfD 3HZkݞ{\H.LpMrE]2d p%!Mn_ڽxV;Ʋ~x?KIJZ>~ Y[ f?1aVm8ޑcm〻4lۥ""ZsHҼstpg1KsDX97I1(Z.ie2`n;(i!""u^y3p%&J.`M`/nIW-i9`.׈jN6.:lx#%sn*roA9$-8}}?eNes owavHް>C,ܣ/99,Ou~wki%mCUӖz57U\DD_IV;TKZL+*re/l|H=<(PAb%mHyG35TJz㨱*rWe1##յ \E(Y:`cOtpvJ{DDaO{퀻J3/UsI:RJhK:=ijvD;㣒^]:DDD#R>| GIzqCf9ӣ>Kz}C4Xy=pFex"Yc 6y_ k%C|S.c`Mt`숈NI{DDy ={Ndm4c5'I~@Mh ŀ;9O0fHx+gI:KҎ)zUCf|xUIߗ4gc]|SIȓlh{w| 8αok"OĠh;{DDDD`Q``_Zp ~|]$}_:G_=Z &JI[IZ:PDD:]:5Gƒ)""^]:C"T`1 \Z{۩s=IPǴiOo}f #ImlmIƚXl&+`[ONvkyEu%!-(.lMlSy"""Mҏ&0&r/"yV>lA}>I35o\ˆhGv!""N]z2!TGG)&bIXt7{=58Yy৻VuF#v. ^{sө6_ ,, l lD_ /M1m0^,7eRus1;t~T>!]X+\?y"M ^Qˁ%LU'joS_<ϧ}*#" ZO.B?|G{Lvt(p; g+1chV/J,DQ%>㶟}ma{cb݀وD37K*igڱOpT`o -=0kَA$mMU(z!i!""&vt]AwUGw-YkIZ$ ې IDAT)|I_ؼn ?^\%cs/?SI[#b5D"""""""J. ť0i]Ck ~mQiO%M)$"Rh9_H:PԱ.}pssLҜ֐4Ya_7 KzEK"zS #""""""K #bhH&ieIzp1p0ZI lE<[ R Iے4AtsH{DDDDDDD9Y$iJN.*f8X/z[:а}4FYb|E.(""z^^S:DDDy+"zc૵_]}-4IA۷l\yz؍vrY m{lوw-AU`Qc<6΂ Iz' L9!""""""tpWkHkŞO՜j0`G`u&XÏ1Tl_\:K0/77IHʿ1lᒦ-mEm_^ֺi9훀 [7NI.6C2¿e#%e#sv>P:DٔNh;ۚ""""""""u;nIߖt6p=p$iksm1tl?lBl+yD/X8IҖDDDYR1R#[:@tmc.}흀3Zk-} ȳTcwh{&6/0?`=DҢf:)"""""""^)p'iYI3I7wQ)-Ž1\!y"jJ:YDDDOCJ); i<u-ؾTޛ ؾ'r'Ǚ~# WjE:/kzj~Pݚ^S0{hRmMJ{DIS%.鳒tՉ?.0JHjOV.*%bIxM""bL4tN)psݳV`y-nfQw5C>:G59DΚ胶xɣ= 8ZҼMdOUȽv7&p s$I_Ƽ Xn'-pASQF #(IsK@^. l,X4`tpg+޳萹K-""jVv+""S ?l?Me`Isww{mAlx!4QW59xۧ~lOX?}x+h}mگ:i`UREߝ6х^ |@RQF#$-"ݒ+rATu}##mx+p{<#\$ I}YʥCDBwvnCѬo$}.u6ӎll<O03ͥŶjXcu{(I tr!D^L Y>Y9%h:U #""""""JI(I KJanZ?{O^ ^8JH,ia""f-$"K cw|Yi[T eWhؼ${lA]Gڿ ccOߣ77s~] s}Wuaz]4`q LR#""""""y)p4 %/OTωhT:Gb!Y:OK:Qa""偯%1څ33>\[0 9ث>B$i܂\ohr|u cF}蓒&{}9IwLҼ|x Nݠ=-^[)p,ќGDK$"iI_tp 9uL.#awTW:K(K1(i!"bx=^c#,:"#&nz]l8[>8WkW51M4۷~6)O/:!hsA|Wݬw0q:8w]$E5yONpJ$cOX#""""""q)&"MF"m6tp'$-J^i=Q&X=""""""R4%@M-˦!l婚jEUK$ ia"")""C c,[ zmV&N_71uyI1EUt{"0^Gz?X{@(ھ_Eu[;1٨CFˎs; _x cDDDDDDDDcRc%] |XlBQ'wךjm Y:OS]'ia"">+i!"b=R;TO3T1[۾wl60%7^ L,an韰d9z+JA/pV:bo2vhzU.i3oHv{DDDDDDDe?"j]P/vR`w)eŐK5U-/~'I]1 p9J7wؾؿ@~Ǘ/4xۆlpkmζ^?}Os$IsItӍUn/`6 Wn-=bI[Җ~CuBNeE@:G4#wV..'bWHZte}KϹ瞩k ҧ~ S8ǁ6p;_-E2+Yz#~?g樷}vPOoS`Q~D=QK{Đ% KuVtAHD}:֤ړ}pΗ̩>%dLD x+8fN>S O? m a^`o۰Y͊M#;_ۡ9-povY>^v;l8|3Nvd߲e'BD;ID)[b(lIʒ}^?Ws]9szc,/3޹ysìE8:"h-3333333f= "拈DĭdN&k26fM􉤓?cHqQDL:*G䩃Ywr &eezCe1^o<ˁ LY,>^+"F&K~>-p{ՋGĤB,Ru<"b0abxXw2MD]Zf](2Daq?p$Y_NfN}(u>6)Y&̬rel+ޞ !>6Ax2Y"btWz*˩G{$U# o9Ic;g 0E\pYkݬD"quӦ2k;ULҍ>H,"bA̬VD̬r.pTb?mwI?o&TM-C'm`@9,Y_(^[ps"b>"~_/]ZVi@z P3lQ>΀\nffffffZ.p7pو~D =q,*Y $}$h{3G'd08>"~Q23N>"N̺yTQ~S [9"&#4{'ȟmKI 8&ҁvq$")76 ݧ-]B0[#í}~=`{DLL݃ Xtu2"k%2;Hқ#k;PFĤY-NH̺/tPn`$ 8#Ɂ 5O`;x 8oH`a?AV`DPu.W`Ss Q׃upqW҇ llhn!"bDD/_֬$='iGXcl\ӧbf]E!d %:t$PWC^YDl:u_ AIzxe>g=g眻0_Lnu)x a+`0C]>~9 Ld ֫.VwI}-xxpa;9Ē[X2<47Qƃ; \D,F5,m*rwc=oHuBuۀM$m '.w%[ҥMKsaf6뚜?NO:g݈fLcÚױFJ`mH 8tawރ^M,iޚ$"v0[7I {%'4It;$+iU -"&*0̚kfm("抈ɮzE7o2F&i`myKV| f>EI穥ՀWkkbf6f WB5̝Xn1Jֹ6Q "b8!"΍K"bTD\5Ⱦѱ̽0s ""KYwWDFāXC }`IC!UIDŽY+ݬMDnDx8djn+%=8逿DRYGz)n4,Lҝ3U3VK:߈U^ iLDlMV;6؛>Á7/A/[4T|ws2YvnG_oJzt-p x`AUpݽ5~ \qYb1 0g4fm'k~fD @{df͘}Icf<`_Ib1IF?IXID\-暑YrwGXbrK_?gO ցn֑~ }E`& ;5P; ]ҿۆYw{ಈl.W /3pq$P}9qi ǂUifffffffY"O's\.NNN~\F֕_u:wp7k>t 0p8^H{yR1`%IUU)IV18;"H:/t[tqtpsZ\gukIz7u"b u{Wxku'X~# Ȏjϯx?Pݬ"b*"&I{ Y%-"i=Iߑ%(igIߐ4/0%ɞ$Dnf$)`^{cG2 p0ͬw=|XVҭ5EefV -f ܇¾7X`Bn0Riq }Qx=7}8njקox'|̬u\nY3eG} G։}g`I`*I+J[n\%+hdM;)IK*Ԓktb?IҿWBNj.vl\MY7&ccA/wmf=2ԲsIOjrO02\nÒ1l=2_ܩdt/=p%}X3E6 IDAT,pOD|'uXX+0K]sf$ADTezd1 -ϊ}%hQ ׁkjXȃ7 հ7 *##ba |Rax%IsKAZtS6.bm:%-$coE!̬tѩB4NyP ]+R0w&/j-x{ݥO^*L DD#Oq:G32y.|L%<6{]DQ7 V4#Zq҇8r+07ZfMI"bw1d`đz: ,L%K/|IO$M8FԧĶ+wp7@>t0?Inku%"6MZcH`)Iw V9Df9\nyBE[7qr mGQk%0 MeիS$1Ctq8g6E`W[G_״vnffffffz]Ǭi1YD|3q#7 HZBNNtoaR8x.u6If֏%#i1SoMɺ"b!̬V+IWRBU!7rFgGĤYgn˥Q8~{l?{x}E` #bY^A#"֎o5=ߐ\7⽹xiJ E~Hkw333333pw"bʈx,i{ɺ Aҷ$.Ĺ"%l\n%$20*u:SҬ+} ,!o D+RB 2 VuMΟXcA{9pδpoD}qBOd6QD<<\G-p}ֈH Uwq?ĞG/Kt(pou %zшfS^.p7333333k DOȮ-̐8R/y>l븞_ShCne$"i`qynYީ0]I3S,pEZCYs1\m$&N}~G<'p}D',]s?cy: !sNBd3rgߍKdX~~M ` fjśY\n66"'zVp`:IJ:Eҳs!ڌ;u)IJ #YwNDl:5:LBԠ#b!̬݊F3֏I#b&Jzh^"bP>3qt= ?@kV`:>@oHz F>%vFgo4Rh|=÷JYfffffff֟ #"bwQ`?`đ{d )~ zI=S-9ڌ ̺HڕiY8>"IJXHұ:{AIwI :7[nϛ\fb`ӜQrR\bֈ8,"FָOy;o |/7("&fv/pOH8͚iB."%:fՁ{if$=8WjO͸YGfۯ:h`MϤӄSBkGĮCY7~VuMG2~ sνj`B`战=ިi]_uui4'x=up;)O;.|NSp#ǔYw333333Y1_D X8u.uC`>IK[Ւ^f:k5Oқ kڵ+ߏ5vCYn/Im ͒9Xf֞|ۊ}X0@I{y$OSJ5jXքc aLzT{9;pf&.yXS<]M%̬~nDqo`ysQ I\?.wp7Q>t094i)sN?S W*"*olQZ}KXҟ/""V#O$F9{L\ ޖ"b!O\nffffffV?[O "b`KwȮ3.\wp7q>tŁu[Rg1=!lHJz.u|:D8)u3k?.p2`-#ߞ{k<,]^$X8Uaa7r+MhW{)"v'{x{_bs,;@oHz/\2D}7Um%"f| 8ń|s5ֳ"b.d`qUd]vgkZ~.p?~$220*u;ER0]l)+%=:Gvau3qq]k |5FfW?#bf!pOƓ̱4:KzKsP+pp8"d-+?("3*)Ӯq(b?~7CfffffffV[ω#"F`qūρ%^Pڌ;x$"i`17O7] l.ۿ~'u.X,u3k.p2(pئ^<5"9j{uDNumk}k*puI-"b.Aޞ8/7{Xc8[Fāӎ,BƵ DVPk\a=%"6JKl.G _[caft́)6-S0#1MstI "LS3B.p$=I5Om;Jz]su'F`y[E~,p|<^2sK`!h8ɹ1O%\sWV;}tk1d Ư%;eY.p7333333 ܭ'D q)٩hi|LmqIKH:URRlfNF* IsGoMdmȈ*u3N`ImUQ'IWR]퍍k!̬=ʪ{D z0G5~4ڬ |/"Nn&>g[^F[t@/Jx(/y:5"Vpv!ZdC/8:"hυ+Z"b~]kNV08<qhH0YCG1[f=M[>vd x7u.yDl: VuN7IhvGHzDnpvD(9.y/ڍ Io Sr[}vqFD2\c8F|wRhs MWcfffffffswZ1uDA)oy:sJORPa;Yaޒt$0YcGgDTůVC99د#b!,-[YWc*ZQs:;V+0BzǦQ׹Te#oۢ{{9ƭ^ ߥ_'YtLkvku)A2oއ̬[W[$+lR!>.wp7$}$4dbߒ853Ef=7.I"cNM \w+E-(XI5~\o-"FDqdǐHXAv^Nrw3$Axđ~+GC%>$ :G0"&OZYUvq82`I7Sᒂ{"NE&Hz4Hǎ"]۱;j0K[`I3"_%\[`.5J״2.鹁l<8TEKCKzDb}~_W;NuתҚiD\KFDc|Mҳ9'Dfffffff ܭDt:Ҹirw3KFUV#ku~覛L|3u.!paLҫstD"CYkݚ"c`T.Iv+iF`*4yKy;qG%"bˆ8`}C`>CFĜ}4W~N9x`EC8":u510ЪK}ʩ~mk_(8qu'"^!iT]ͬmHzQCwٖϥa֥N a,:VPy0qMyo?[.ZRK$=-i'h gNtݒ{v|{DLLC pGD,EI%%N˳)>ruvpm{Ԣ٭G[ü>o.8wk{1p5S,:`1IyFfڎIZ XO޶βqf]C`TBSr[D^CY\nM6G.g[\Ƃ⃽S6sؼɽ>^(3Q{rKk|"37Dzl}N9EJoG-اּdz-춴}l^T"b|ZDLIvjtd'.awp;YےtU#q+g̺=>L4[^:G;*"VI VkXsZ`c"o,(FqHD,  Fqd]`%5sqGஂsNhI{Dp.Yw&΋Zm=:q4n_̬H-$`^ˉ#YS0Sٝ5H0u.MD:UV ܗ 7Q1uεol&XXU.(}I{w{e`7Iy{DDvaʊ3"VlbR(PHPT "έ/*ZszmfffffffFՋ5Sg 'Kz7u rw3x>K`nL̺[S$I?M2"VN̪w5j`z`ߜ.+}lZ!ii`&``}`Se$+p꘳e'N-\tαFPՁ+\EIUPlxb E;xE{Y"b"`Y:ȩvvHWrX6!IJƵ|f]T=Ct }YpUFȺYa͈X,Ǹ/{?kH:@Ҙ7Q$itK)p8/SAM.P$mAͽ 7VN.~OҀ_#bzOPX% 7333333%Av uY:%NCXm\>;YבURY!u. 4ꣶ|m&EͬBUIrFL⒮Kr #bfJ`*gXK SRhmfҀtu̎,Eot`&UܭfZ`3wnj.pfֵ$Lv|f庪JI 8*u,Y\3p.p]C}?}+"fn?G[GĞ9. KP˩V1;kV F5-с#U &,95 IDAT|Q>I֡~{=R %0333333ݒU^w>Jj̺ђ!t&"ͪ6;x$u]D:5V)IR_D9  3 ܟfi9&1aD rZ دv}h-PIHB<+K2W1%(ZHDL^b3333333 - b޼֒N V;Nf$=.i `syz u_g~+af!">3 IM ψ5+nK*ym="&.vofENj i yzczLRn+9 1S_1b7֊) 7-89u.YWS:@qw3)NŌ)ݬym$ :G(">:w5=%SL1Xe,p pVDFF"xq0fAEtu:ehHഈ(sD]*ikIK0u>T:|zQIO4 "X?E ĬYuzzAc{;fs$!i'`%ߩS0.pGSL̊sUN3jbH:8 *"*T#|#₈f+#b/"Vy#b }ʈXD9[I2dEnLJH)lIHrŏ|VPW 24:N=[p;'UM/CXK},wp7%6`IG#tS<3\^F-͖VX8.u3+.׸,f<L\DĔ}& \@V~nD,YF?D[;#mdO%/E]qYD*"(~;ǶE>^(2F[ǖw6p_Y@[i

)Ow&;u& 2o3EO."333333N"cki 7րwsIob- .llR0p#SrLG&"܀Ѭj!X&".}^8x w"X5(9okA ʹ\P"bֈ=YgJf{ TS!D3$=s͒3 >4ԃ!Jz}\bUJGI-uKcYO$lLvfqI l |:K \8: ܭNy]$#+KԽV#b&z@d79+{DL_=ba0{cs; x8{1ObЌ[W Y=,wkּ  ^#uAKcY?.#gmsYs\^3I5jffPrZg;]ߊi َ"7!͊F2M5;pD_#'cdrH ^&+ro%왔$[o 1HIW(R{'3If6 pyi.p7333333 ܭUH!i\>; Qܸ,\n1C􈅁 "bD f64[m$\Q)2Ak Gľ%[]B!r%Y7eidE1e N`Wɞ# c`#`GH-k%FPN.`?5333333 ܭvY!,)ff&>p00==fq{ 4j9JWN7k{.pw7lSG2!pDD.6:; %YX86_$.bIHm=S.˗Jj4AK]_`|WYukcE\57\.pAdo&-R0`.poIO{CvS0B*ן쉪$}WO pIDLVdS6=. N6>ƸW,Jאt 0'y`vIIz5m֑Y{+֑̬kX)u07,I%ݬ<ӁR!GG:C\n48mv+:A5dEה(r?Q-zQ167u*Ζ4Fҏm{\4d=aIϤΒǯPK 333333wMDL:G9OupX|03I#rd9.p7+od=hG!zx f6>[+ݙd\yT} < < ` "bDI~Nv78IW9c`I\ `>/mW$u _."Ys\nu>Pz| :BO; `#Y: s2C=d %u3ȬvQ;$H_{k JMg%M'i IuX8 xĞk'=l"b"$ 8:}$]Sp6~QDL]du)֍g*5e1333333.pZDČT΢dL)>;$}`]Y:s{DMemـ#bAl,[vQH}yUҪkIWJzD&IDҫFI0BL$`kP瘢vcρ3$/dGO |$}<^pڊud1333333!.plKC6\>; `MY: ʛ0"|!'S!Kgݬ}Z\ןظ$I'W']%&&yx# E&4 7NџW>)G V2pjخux5rۧa^Hچ rw3$=:KrYs=Io5 C !, ^X6w0vAu~ ,]r"ZIkw(oߖ-/4^6>$(i %m/R$} l7u+Ԓ̬w˔a5`!:^c\cfI_Jøݬ9.pOD_cR1?74k.pV}XVK5IW{٣R"q>pH9,:IWxcwsYY "V-;Y](i?k llY՚q3Ԓl`.333no;ЁMڊ rwUDLF"[D|'"6#b͚%_o:zC"b!z ܭy]K; L<DD#bx FN_`%~om ٤;/skTJ"-pwq73 3336.pJEtdGt[1q[osXn#TMg?~\<'E̚U@ҍVstwp7k;'8l `t,=d"X u^wkIy`"cVYs ͺ{KIS1;_P$ZOmf6ι"؇  roQt " |cNOUPDy_?6cY\nfffuw+ qVic%}O{'fq{IEs4$Y|Ĭ\n)Ocs9E164EĿk:gO" "ޏudf[>g\nff#irokFKQQ/`quE}n&xI~ЪR!Jfq{}x&up13+/t[28pmYUB.׀+z&v*&{(&0ZAD,l؇<>l~^`tk4{k:fffff40YFV:.p;[v~f]7Ɋm\.p7?XD lk0pR1#[jao\BSX}ˆxl>wVv#s~D,x9f>C'"b pSzfffVK2jMJrw2 <)f}pn%i#.k;\D\:GC.4S fuwK,z6ʱ|a+ -GE Ih"؇:N`وk2h߯JZ+fW%G\nsu.4ճw8 v/dQD7GO#bm}Á_~`S`ƈX="~vb2)^yC2`}FIZ0^fff:Yݺ.M#6 {֭}$AZU:@ɸCgmHN\%xE%cݹB[/,("`m^3iK$͗^D<GqpD{~DDe@DGtID 6.ff+nfffuwMH[rؤDĽ#دen"z _Sྪ7Y|:u333qg5놋6$Yn }3}hP1.9~'$:YXJ!"V{Xs KKEēd~- KJ9&ѬpdKi<( fffVW&epqv *u4oa}h.px{!̪V&aM$ɂxGyn~mwkO`yfIqO3#➜kܒcy333 ̬\lpqv qL*L*i!̆|%߈x.u+'IJ\^Qq p| =I?K¬\ner.Zc9E1f:ps]EҪ}Ӭ.αff .p733*KwS&gw@.p;[7gJI.2séX{{{ھCR0[iD[}j+IuiaD |N\&i>iVfy ?zz̬3afff#e*qqv.On}8pS1g\nq{{"9}%:Y>1ص5g"n.>o%FIsy_28ǚ/̚fffVgmx#uXBm,]̒fJy9 IDAT*JlO$\n{}|_,JQfew+1};F{pDyjF`TGV}zQVIy_x5Ja̬\nfffu woJ3CXi 7R uAl%S0ϿS(1CX͞:@E̘:#"^6ş`I?L¬\na;\.~#`{>o= 7I[y_" 9nXt33kyS0333![7|MJw˫MҺq5R0`Jdw-udVx!uIaVV.p:O!1:,I%-pwCIJR6Kk6(<5;Yݺbrǹ*sw)SL:@ <:;5F6a?!VJq p_ ت݃#<IsHS8OG3K~HY*XyIIoff]iEk33j5uX!u+IR(S*{;dSϗb+ͩX^A{\^OeqS0+ 2W$uoĞ%iwq4$=< <-IH:t| W;7\#i6+ث:\6 13f633*hg\^%%͖:;B.Pp7[ {-\:߳g߿ODGVY C$:Y)+}g~`?\<Kڙlطy$ @ &`%`X2"抈2po}SY̛:6e1KVi.p/CciR( i:5&ulBv,3u+=wpoPD•%a^?+x8O$iv+{Vԓ~'l V񣈸1"ƹ9u6`oSྎ ObffM 5iff(ޞi$͕:U ܋AV sPRۥ`T«I>uk^:Wt9*Sj+"O>#pb\nwP1;{׫ 6)N'mw&lB0PD=d76P08[R'̪*Lރ,ff_HfN[ 8YZX#5=Rқ-uqkMx2q$͔:Y*.p*8OL ΁6pjo4Һ&+D9`$M2AW!IoV5X$̚`UܑhӤ`ff2eXVMl5,Vc%OK:Uʘr 8G.X5ވx>u+S\DB9YCKK+u\nUp9p^Bm{\O4 Eݎl pH1X؁b;'ގqFUQgbffj̬}nx[N^}${XHHa-$P}%z`9:&uwo'pÛFǀ}kRz]S15[eD]fV78v6?L65%! IKYҡSd]P&IqP]GHZ*:iuQ2 bffԺf55S03F?u X:u$oj!/~,:DEPґ|&N# %m:ΒC$4pQV MK+"~:}ߴjjra!3; I;aD \e.G{PÀ!lI fVBXyIe`ff(+p33~V="!i!w$N3pPN0IsJZ]Ҷ6yRgL)iAVL ?DDWX=7S p ܭj.1ኈ:9 {qdekPL(l쌟Ƴ:S>bA̬<<l'ixVIPCÀzn(s.n/=ej-i2I HZOҮ~#BIoM!88x\~)iɄ񫪮EÁc%?#[I_O#cRp|<"b {Rg Q܉sV)'m (w >3DۀKe6MݑVOK7,:Ւ {k̬\gss52OVIS'R3!b{dUK)iV=%-JIO?\lȺrOUDXq"}צGc"A$]:G"FCX&@ƃߚ%"OhpX3u B fyU5TD-'p$ F[7^Dc"bLD+"EĪd~ &rG64Tn7Oԋ좺Ye.ľcffzج̬NՖ+9ISHxpPv;m:DɍZ*k"if`9jbkIa 8ZRHTnJa\36ꇙ$ۺe6O 5 c9jkFaiE4!Ī ia:wָ\>%DOX9s58QD%/qނ ]])ayqNnt0ΒɩCXza71G/bm B14J?`"জ˿*iA~pkk~ <3[}> |_{{ c:Ip.ȹnBSYL:q73iu-u[82u+xK 4%})u:4$< GZ͞:@ISĭ*hI~@Z!{v<Ӡ$-l:GM- |+u+' n,6Yٸ∜`~D3޹/o=SlMJ쌈1qfD,G6<o_/,[MYsIwo/ɀ$-:U:BC7$,uSRh $%iaFtto\`3`Ҵ̆ p`M0$M:uh`Y;'"K*`\#K?4*u+?PE3HZ8u,kw06γp# जٚf:#bc`(z7!rjwJŦ13 9 :u4%I*Ǟ~:ޥRh/F:u24]$]l L6YGfKzuN~ _#wEDO/t;o]lzìk&^"GyCfffu DAW~ ffVN6H.6WRr$I`Ql.N.щFҤdE}++~5i({ "N$,:GŽ H&BH`Fzn^ oEĽX5p/𹈸/u+I 7Sb]/"IĚV+V$͕FĠ% s lg ș) UJkd˒in4"oV9^m!l`Kώ/G7cR簎bff"i3pFXHq6[CfVࣂS$ eEM[eR稉 ;;- &i.qTV d8ƳUYLO۪+ oJV;?"|?g"h۩ehuBLd]_%5fDc1o"0`qHf-p\Dk&232

kr(I7uqFDϟꗴ0xD;/I"9=f"g#YIH:u]Tqc0ffǧaoVX:?d^mڄ:dNzM=_fBv7| e$`9jZ,I/$L8N<,b i'nhcI:jV"⿩XjGu8#"6ocCs-`b蕡HA# % )3I땈{!bfࠦI7$Zy^C IDAT,=IW881"^NG|m'Rg \0'XY|T>EPf5wD,utq ı/&S;&{ppc\;0!)KA6A,-ISX&u7ӁGX=jVj6YADJ~BѤSSGαiV:DBuha?wppR\s*z>K9~<'TII=34?N'$ iԁ,x35Ⱥ | 1שC[40`5IRҷ$}:qJ4%]O6r\>1?tqKd丸|Vt|Ϳ"-`}~FntZMrswV1c97?8Xo7x X""Y] &1#b# J[ض_{wJҤdoGY\/"H%ia9?/2pV,7/dՊYSg] ?GҬYj wRfl:4"yJMҢd]7H*4naX{~ c'i!`Y>n..籊qՖms,70GD3M^*֙.5ëUr.9"~W`AI8XX%E .q뵞YgNOHbn>6uu3*`Y+M`95]BґΩsANoa0{FS$N<ϛ6Q<,ϧb&ip Yp5:"LH_ӪdщXɹj~izDk8une&i'9WNZr_n)UD6IGCcx:|txwO$ǜLyHu5"O&Bi9Gd?FbǾ x<|̬TZ$>y8M<"^IzHүafVqEACT=CS\^%wq뉪L490? 5ZwFkDmX9&Y)چ&zV;pMD8a&ȗC:gxcVknϹ|ň=&{Ce,lD<:HGu02"*>UHZ8X<"L&@'=q_D,Vd33{}X5&pπ}ujf?Kb}3mT/)sbfVAc"ADҖɩsXx '4zE.קByu^yX7"NGl79DZ4fk\{'[bdt_:{['\_N.pړtKOr9 |I)Nαtӈ8su~s:dY<|jV9\ \dfIȊٷ!+np+ہ;ƾ\?!{*$:Քi{;-"JN$ ,:{D&uIk+bVj{R#I?Iì` uq5dlɱ|= ,ck/"AIҞr,SdV G/sgl ('XoffCh/lBJSļ \ \ Jc$-LVԾ%0[8fz}75I5q5{'$iU,8dgM$]L@̪ub!JUSVk:YqFMwkI;ԩe{lc#iMy:J434.""<ؒ4YA^иA5c\yo~/"͹#iV`nfyG6YRn2>^N~SW#NmV7ogukۓI$pfZ7WM$~6utT3_rf4`Y>`爸>u4 p f,f!(FOy7Vy/H -n݄'!% ecQ1bX XU$GﳷFr9ך5ɁZE:c\f5>p2݈x-u3kIMB1~au,`Y 2ppx%M \,_y-69S*Nv_s.!x5S߉7gIuxދ1KM3,u~_X:)?m9|Nt)8N vAN m;<Ċ۱lkA ~< C}{5\nKuCbYHWҹUm8+ Suu3sF~h$uڿ߁EO\/`fm;X'ipp8.npSV/ݧ4KifIs4.p&N$i6=x7߬'%-iR N@YZV_K& V33/IaiG2kO7I,u37It(p?Q'24 ܭqZ0ȱt+m2{X&6kE?pH'=SG%( Iv^Z3#s>l$}Fdr,)$-:Տᒾ< NGK=uǁcRg1kӕ:DDj: <*8XDuz!"lMp fZ89Sہ-ĬזJiDf$+9eKoc=NYO M(;t,e"ޤOp & |pVD<"G߁9E`riȦqtap툸ff#iMlKͯ&.INn;ȤC2 a yUm|wQ4Ӂ'qA:خnӓv _UmMsOH T ΡE$S\E)߁p_<8o=̡=EUOUm7+$ܔ@u8X?m'<xMwW: TCj~:w3P?g>ϗRUvi! CH UMKۥ->RUd$ypH9fI]I.v.l;n24̈́,no VkqPU>\RUk;ĤH.mТ}]iƚ$ˀ0WՑUЖ3%ɡAt U%ٝ8fGoUc n8cw'c3z a,qTUVi;9UUBx;?m;m<({ivt)M$y~~i \t|f1đInj;fI EIHrua42ogݻ%5v 2mТdYE+_OpC]hlDSݪMU=P;͡Vj9}er_~^UVUΤY1pbUptSgUx <1$iu~o%%V>K+vIs]#C;.XI~ <IJriat '}(I%`$_o;FvDRw0@IBqmgѢ%#ft]n—h fa7z_Um5.)I YOQ4۞UU=e7;\\UYvEdMS{uY$Sm['xA4zUg91ب&5cߵEmX.5]zmgzc1xeg[Njf9DvYUVrd޳pbUݻ9mUN.L UuhU:sF߰jeS]U{ #|7.i{\$m4^viLxyȒ ;7k)MIvKrBہ)wശ,$WFsKrT-Ǒ,~dFy:ͽtII&QKGk;w1 ܵ%98SXUb+i g5_uqbfTUwUUY8fcGUuxUYT\U-\@;+M9tyfT;kӪnݞz^FUm1tptIU6BZRƕzHcd׫4$-OHx7i@4 /h;˄: xhG$ea4?iw;&cImԺmTIΣiyeQ4fk!]j [sCUvoUxh#M~_V>U?Dӵ9JUկ?UuPU\U/˻voyvP<)UY%Yv $JrDbm? IDATh%|fCi|f͒3ɕmر4j;bԩ|261P^-]{v@a:vG^1ӋUͅQ{{U51_~71ﮪnvo49˗1 {<}mIZLvIOFhU CnvR<8<o6M$vO^_!ZSY4#ޛ䆶i|u|.S ~Aˋ4Y,UG$j=W.t: ,[_IC,VK+Hr=OMU41wU]A\Fܨ60T2Ƕ:s,>^UTE]<>$Mǧ^Vg~I3K`;YJEfym2w肖{h 4{wI$h9XKe}@|40I&~$pÀShϤOˁMdS|Hc%xEi>JZRISUm?pӓ||1ױ+lO:"W, _OKH U6M7۶EZ`BӴcmQjK~Z-YL~G=Uiov.-)6984Uu;&ui.tj"QSVTU R׬q76ߏ3UiiM}9s3=V_[W.y Iml+h ۿ亖hKMhCrAIe%4 1&%[%8Uaϳ]l3PUAm I<|FUHK\X07[$9,4N:|^kh~ /ݛNמh ȃ/\>|% ZUxn94éW&t5&aн>Isg: QPU01tL_Ÿ<1Vy4L-$-:U7pMqn)L`}͝9`m_?q"W4?0&WU8 2nYT>SBXTU W߳םϷ77ɕ-gѐU4+7g4K9lMC0U]`*qǏ-n­j(YIIriZUM:*+>.g Z4jmgѴ_.<..tc4NshVs2֧ͪ~$a\IZi~Fؖf֗?Z יi~icٔoik@R: > <,XFscd['Z[Cm-ӷ!vє\J`-8Uu"=b_lS7FDL=7.ߓ4^ xv F\l:Y6dw_߮;z4 6-fc̿H$W h~IV lrފ/Z2 ܥ.Uա4E3fn4Vq|-N-t\:btv-f;wz`$?%nWєI%I$I#477X5S?`IcVؚ,s߭ULpdm: Ke龼zL^,օg%`Bi,9Æ4y\;󙞻bKtj``O6#r-jrTK]h[&qxZV^UHt$퀪z.ǿi948] l)I$Ih+˔j!EDž40-d$MZ[7sKZ ۟+׋fxu$i2Tժ.ǎzj)./uy6 nwi%{cׯE'~(!$ibTrWh-Y#\~~e-ĕƖߓRMiI렪"WSUߦ4ap$4$I$I$I$I$MqJjMx:4śR?V ~\Uu:uk1|ڮq.D|U8FU|V%I$I$I$I$i]NA= 6ɯfi(R1qI8uCg: .s'ٿ1z7sмo춃H$I$I$I$I$]AU|ӿsa=/:;4\\ \lICE[NN\U `|pL?pPmgT!I$I$I$I$IwUUzߒ3+t޶%g$v@U4531MVI~vI$I$I$I$I4K 4+C^oUgp9$: 0f{OX̪mXm$I$I$I$IIdԣ$NM1π78<ͷ-5i vi/I$I$I$I$IjQKEULEW%xW<9$I3U`$' hPUc$ٱ$I$I$I$I4I.!I7{<}mnl943: 9)4tߡءi;$I$I$I$I$M ܥ@Ϯmf; tQh;ƮNrw`]Q߶Jj.8b㍻-u17Wjm$I$I$I$IIaԧ$?>Kû;{c[$N_}׶Nck=GnXko3\Z.|Ԋjs*m[ XUo< X{7I4ہUj#I5MC2tsWK[[$I$I$I$IƚTj9f$bՁ188o>YU/l'҂$OĪZf'>u.-dUWhڇ¼$I$I$I$I4,p [$6N6cqp# Il3XIrCUժ}&; :S,,YmGE@Gx;'ш$I$I$I$If4$ؿ6c|Nb<7wSۍԪIAZUk l89+^rټ*1Ϊe%#,ᜒ$I$I$I$I4,p|!.t^Ju-giӍjXTU)v5t+LCz,%`N$|$I$I$I$I4FTZ>|*L }7nEYixX$&8faÚWzmIt+6$I$I$I$I4. YU|a^]W49M̎WVgthՁtv(_$1mUFF83$I$I$I$I$ilY.@Uإ!NrN os}Or@Ux49W$lT!WTU pL<#v$Ǐp>I$I$I$I$IKK#PU;'9w<|s8Xy՞$yt/Th? Xo˧Lr#ή}WbGj7z[bTF494 |$I$I$I$I4@Z |aVUOǜns^gÙ^H4ɉI^xp^퀓;Z$%yq- \nrZAUUU,Uk= ̀Wh.I$I$I$I$I[vpFaly,}̩vmXU+/.H jU`'[hA4ɹmX Iz߫찱0u\/#K$I$I$I$IƒܥI 3}y>U{I%TZ>$!<}MZ\`qܪ4]U]-&JsՁ;Q$I$I$I$I$IӰ4BU)[`>=IEbʯtx+p$z9 A#lHj7,rnYUx6Hr<MI4$I$I$I$I$iX.XUxNÜly̻6c>}= NlܷذD#6VKeOƙ6.pXL\SڶӝNc4l7_$I$I$I$I4jK#VUnPKy}`>w'9mU?"`VRIj;(Tβ@kobiL5('I$I$I$I$Ica]J%MuU4݃W|"Ix瑧ٿv 'VU]Uo~nq{湍{UU}fֶG4$I$I$I$I$ ;K-_s -\6|ϹݡIf\h8/WwV'%s,Ux&-YHOC@=as(` `p)cx$I$I$I$I$M ܥT#o`O'yJ xgG/KrLT4FI6<vv֝r^I< 5}h߯8 PUΝ|V6尯$y|"Or}K$I$I$I$ID]jQU}xzB/s%1`qyI6A"#i:6c$?렪*` ?gްj;Oj9Bs9$j;ȸ{s}]2ޞ43yXM9qXQ IDATq$I$I$I$I$M ܥu:Xϡ.Lr<_ 8غ'C뮾\Um9n>9f1ukuh >/װU-p O?4xӼ`$׬p|? nG=/I$I$I$I$IcI,w `0?h_< oN[Ir&=>NVU;W߀bqt~H .W|d~39'cU8_$I$I$I$IƞܥN SU+O3êpFm |8^5e.B>=\h$I$I$I$I$iѱ]Z@\ n@=1W($;^<okڴqFm~RU;E-,9y8F{z,m鿸ǥcxʓ߷e x5plUvԱ$,őU~J$I$I$I$Iر]Z|u@=x^9J: p']UI.|,#HW'o;]sKz{}ϕ$I$I$I$Icp~@c6Nc&Id`k[Ck|i;H7\<x8vgU$fS{gÁx^U^$I$I$I$Iqb@%9x瀆[hU5(eλ1cs88YTUvn6AO3dGT'jͶh~MI^GT՝_$I$I$I$IƁkgEdeYnUSpܐ7K#mVӀO.h9ΰ=8v ՙYq[lU< $I$I$I$I`Y.-`I^1!PU[B?eEWO*x}vnuu-G-jhhR$3p7A$I$I$I$Ij$-TUU4p S+{/y x׈U##UMKC`gmg#O^Um;$&y.x#I$I$I$I$IHT3H8zN`@9q$?;Lz]vY% (D@((DN3" "AEr$Q@$$HHΰe[.˄[]3y{骮:6nwFSu'I3םKX="^;|6FdfffffffffffffffffV)wp7B(ی!'N+-}\31pCw8wJ݉$"^έ9npkPŬOqVq̬j.p7^g"f'g̣Q?..VWJ[NfB~Dx|Ĝ-^w"Η4t̪^j6pI8=c1qsyLG*8c.p)IDUw"=)^ GԝK|/";lӏ̬*.p7bE7[%2}jDd.͘`Dz#iux uGDću'cKҵJ >}h ̬c ;3+/ +U)19Xn+::w#Hh>!Kd4DIVY\n"i(i&|994dzoGN2un[;٧DC >} |ITYvJ ͬIx2cا"&X*c֘Eċu'I{jN\l֝uI|!'Edfffffffffffffffff; Eaޙ~]cnɜ5fYNIKԝHo"ÈXWt{%DDĻ.M J҆Ucfffffffffffffffff c3\M<^u'җXUs:njOΖ4KX爈K+r,'ED9Y&  E`dD3/d9?: ^f>NgN'i.>`,^t733333333333333333Xn6D/^Μ5g?RF _kOF*fk5J:X`XD<ĐI$:; 0ws "`GdsVI8 ^ݹtn.A$,R_>`&VY\n6IZ45 lLĸ5"JLzΥ\ oԛ&!`^=`Lj8¹V.obqeE)Y &"GǬ &VFFĨS23ksEucffff֩\n6@I-kWFM1p8e\oEf~l Lw#ʲ@D9wexxH*~6pSD|\[xc4"pxD<\QJffffffffD# M6#Y72 }xGU"ɺ23kɀ݀-9olgזYsUt=s# XA>łq4 'i``ψ8Z&Ek="h$ ?KKhnwIEo̪Wz ~XW`x/O9)"ncJffM48w= 5"kkbfffff]`H Y5m (ϵS_"ⅈ؍.DI*ʱ4I#qq{tԝsk 8ة bʃ6pV̺%3=,>֭%vrz/nXMi5Mj鹸``%effffE\n6sijfyXؚCO7$" 88[GTc+;Al5?4m gzFy8Pcv23333333'i Iw/ge6.i` WYs$/j `|̺ ݀3\ص;gj`[ ؾFs.t_yؒIN`Jz}#iٺv:^~cIkU0%#;13333333<"KH~_(%$M"i{RӦ '-03$ Pf\D RA%}8=|) xŐ_D |S%/7Ҟ;I0nّ/tIs0" [bi̝'iIg4LڰYG4H{f/lIP, x̬l?g; peDĕ2QHZ'Fij= Gik&]Gu'a@KrI֝LG㩀 %Us4phr{ffffffff54c)/]>jN Ű.p7ZHZҎ{kffff6l؎n%@D,NBcXүx(tw l,pb9g-iɺbg =aD<9ZYdffffffffH"ے"mGv [ǐ4ǁMI7ZqD̬a*<bH@Qwf&v#` fn̒pyD̠`y{yH݀T^CKoՕ}`D;{`x"CK ?2"v͙LT6x sLHZ1δ%U6FfZD\9YswX1gHJxXhX{[Gj [#b3``WR9fϰFQgHn݉t#`KeV1"i$ p84~qw% \MuUFТc/nxfffff]I_&um D" ;n4(Qb!Ј0oZr Zݹا| l;n"iiAIOP '7`وW=IWT_g+ìG6jTY0 B\TFafffful)$={HZ ŇuZOiP ] eGĘN(n7onX8ENu'M"#>2%EEPbpbIϜjR4h׎nfU#jfffff]f!}cN4y"Z`3[L4g$7IVD,\S^Үu'eN^V1iD] \Tt33333333|Fi[-7i:Y%$,ئm`̡7Z $i6`ʖ^NܚVԝ}e`xDo+9|4rDܐ/#33333333e`yw^լV66ֈX*sL3OHiwqMU̬kl*pUϊs)pZXs'DĨiH>0/u6IC;KxX4"ʗ%iz`= 31B"of {SD_XffE`҂aÏ8l ̺PD\ YA$#PD\#13IIJzK"A`IsO /,"F[cJTd23333333"8IɲbeFą ?Ž̬_tDlC/v2 zb43 x'H!Sm2ŲTz _݁BD<, \+{ԝ-"nk!W?z1Yu"ňX889 ̲[ w3kx2"$b2z%3#"^v 9E+9b٧L T~YN6:pvݹ'պ~ C:ffffffffֻcJs'Xwƒ]nfm3333>? TjHDN7vSܕS,i~ja0"If>뾒|ԺC%ǹ뱙uZw3333&t,psqW&uao|Ѳ]K5;Daua@z^Du'bZ 3L4R23333333 D%Pκͣ%ǹu?28"|63333 S""*[ Nϐ5geIJ`_?u'a; ב]-ƘPҰ gTb;[y8Y"q]nffff gD8]R˺,\-6I߮;"b4pjӼM*U</$M]wֻؚ/.rBffffffff֓2.nD1N IDATq:ŕ%mffff Yo RZ `1/$՝p]о&"~ ¹~x9ru8:C-$8C33333333Kqw6ewv#$3/w3333^z?HR8Zppo#OIQcqiD?vu+v."V"bw`ULyNb4fsu213333333q\ t .p7Nrqމ̬.p7^EmQ67$*3gb֒HYcUw /E"yݯ'&`mlWEЈx)C(gIZ$C,33333333K4q7X,\jf⥒|63333 ͬ?OVwMIH\(IMqγ2IHMybb7{_Q $MSwNҌUŏKK2 Y223333333ron;YpYf.p7>E(TsA7EA,lzM8[Yu&u&4*NtP31z(vx+KZx5:&;`()+c' qf&0yXffffffff zf)\nffff ͬ_7:xu},8,$])i6̷jHفEkRIK:@Ҟ!lk$sftUDij^} ffffffff-+S֎kfffVJ 1̬.:2F SA_J<|Xfr&p_Q]baĦU?%}H.Uq^3yg&ߵ}se$"n-L2}̬(,#_27z`Ljxءޏ.yY~#$] i ,YAܾ|KҾ DH=NMT|] sm)֏$0S,3333333rffffffffp5,"#iDD\ ,.i&c\PA^VHPҗ_פm%PDskgȯS(if{6uE @΢c%}#c<3333333Lu̬)qpU#}޼?]1\]f.ti2&좈)%h|JDK#b"%Y2u'$̜Eĥə .4oxffffffff; \>ffV˙c(iX3"ifpDx*sNVM%m#1)"$u([fLG9FĽpc5ZUDD+hX#3-h13333333LlrY/|̚/se?JƸ0_:FD q JZ07p%e)H[#b99b#0e&QFL!.4qxffffffff; \>ffVJD8!sKz /ȖaaI4cq#p_Ik  }|Dkˆ 80c033333334?33w3333^bwࡌ͔CfCv)SOKgέK%+i#bLD|wjPɑ[?&4u" m`֌6WxffffffffYgff\nffff _2"]`C࣌aV|(c.VwIZ6&pxZ=R7s""QM)"ΏづsևRG0">6&"_JZ7c<3333333L̺kvze3kID9!e:w.Țm~zIKE[V]ΐt/ oEľ<4q,7-?KƐΔHƘffffffffQw$̬xmfff]OҤt%-WwN60r8 {x[{3B\3|_҉fif`DXx&pqb72WЈx>"#u!sL0)`\b[E"T༌!'"i֌1R`̬xmfff]M?}-m$Zkb6 ZcM72_%siuH:LRÅqp_Uɕ0tbw$+pD|8*ipo\zDz["343333333HYsuÁ{N_2,"i`!g~Rr3)'𸤽%MȠxX ZZҽ4ՀjDlӾ.  l D9`4@qmVY"`zMp$}Vt.333|>^Y*ynˏgkg.60̲s2C%1LSIھNok:NZ VX>+ s`uVaqm<P0i׎ lpw3333333(N)C$Mܮ|l`-3mL&!mcҔu'vj<(i[I8ɕ4# |VEC" {yp`k ```V-ĴϚ!a^:I ".~3&iQVcukff$mfffP*KpMHZ!sL3333333nfff ̬HZضNRq*6▙e769jRA >ӓ?-Ism̭,im|"8[y專xMs vC*r?GRձ1؀|v .̬[l`su I3g9 ܭ%efUDء.I큇$] i ;|8 xRޒ)$"݁YWo VQl{B!9'W3\&iڌ1̺Uw˙u혙YW4 q'fV;FL!4}c.4u![%=QtuVqED< \Sk|8xFұ-$"> #bu`6`_> 2y xD)#"ǻHZ-|w \Tv33333336/J333'ip6h\n--3LD<)Ԥbf\4 _**I՚Uk&#?(ϒ/("G[zvDZ&iƜEi9c'fifffffffm6pYw1̺ZMqDLE:B^t ntk2m-c```,̀/N༈(G@IKK~S+S. )"^1#ic>r5Zd<,:iUffffffff]Ank}͚6"^˝Y$ffffH8e#ch ٠8CH˥s1.p›"ޞ I\b=WYN[ |7UI+l% ̑+.p#Œ1̺Ř ̬;m4=ඈkI8p׈YKԝ |*RR6ld>mYQI[I'DhDFR"v<(<#(Is՝GD<<~)iH*%cXgJZ4cL3333333nQ̺ I_t. ZI'Ԝ bJ: 8+.p(uf~ *9K}u`+ofz系3<<]<.ʱ?ER ?_|a>t< i2H( ۶ڝHWaYEHM2sj硗}EU畓yfwrD! B.p74?-H>FFc 9_8=!_ȉJrEN7sD@|7$MJ)k{/xxϓuũH7)&Lt~9ocL0Ha/Hr5R܈LK&vfwyplDsq7!:2؊BuHw xlBZFN9DҒ-M )"ΜC￿2433333H[OKQ>1v+RbEAԌV{ s雸G9 =TޗIݳ-ytuqSj?m|FD3+'O Kd$cGI 5P+YrFDБ]$m_beoK:뤛68CNiw{GcMؕQ]U^ȬGz҃C洽8Z+"w4%9K퍆fOc @n,v~YRBTmXgeRn΢WHon,7cH]$M AjJjG-?X<_"{b]ql^eoNRs>+"Oܯ}U`#R9#Rн.5XAG'tlq0ҹHo;_gZg~黤3c?Gģc&i-BΥIF5u'aq]qv%>Mh9g"mv=VwH).yEomUIw񷺓IƷzX8MGIǑi8"sL33333AOҺfO*xqE==(6{}X$u53#bf(dC*yO &ĸ _'7{.Evz)FGI 8Іo@*&AIN#u T4:s|kRѠ@RqRN.g;MV`vvÖ>pvkYN*Bݪ?"u m䈸(gMz yBn_ ieqeeK=zҽk8o(k $W{K7[\t؂<xy|?f**i `N99vh"ږ́mhq1+![⊴Qn2~ V"ISsLN5./SGkUO&v"wҤ큈h9Zq>9>&uݯ [(p&"^ϝOH6/xݹw z/HXDCsC[6,If̡?m3v*jVqrs I;SؑeOBs'V]ewV9?Eċ5+I_%-nĥTMB;'vFߏkI;γQ,kn^of],"'}k՗]|I']֥I& I{4: "^Iݐn VS%P`L&( 'mؿ3433333[COI7f8lws2S֔HI#u \k{,^4Tfäi_q;Ò]WDP$M'Z2-n޺%>ei3XD \3f>hdF:ǪR݁^d=Iw:`aRڇ$m+;I$-ݕEߓgLI3H:pg[bkޢWGI|q;+5I7Soq; 4R҅h?3!&sR$M%RVuC@Q$M"RFV(52ǬN!gN=ա+ W֝UfVrg& I70-k,Gqq)ez 9"fI7]!m+҉˻tQDKϠ&4=)Iwf&#)b5I[21p2433333֦Xz0pX݈Tc捈;zvb{/OzM؏̅):I_EgݯJw2]Xs+[vE0whvRڢ52IBu3H*o`s _%m]Gu'~/F8Nҟ%M_s.HXT{7B-'i~AIkaf4k_O4HEҙOL݉4C|H;NZ] r/F): IDAT$i=!`sTa"Ģfa; ^']04i7ҍVLsMor dM[DR՗)}% -y9"n"bXXtQ ryeD):ղ]^&6wI4So:tCQgUlM*\,ɘY""KjLu"FDĘ50k`tFDW4hID<ۓ;^m5fn#u9"&ˤ#?mBt=)ᒶ$MBI +nYw"cIi[3m~⣜'H:q.+Uo{"b*&#bb(/:;T7ZmqA`t39pg[N, ISK8J4h&jI蕉E/ZT,`܆tu=V+P~ҢV{N9GҙxsI1$M/xR 79pvhIZ{¼K~'!-> $MZtʂ^"g`&?i|rTpαStg?Plg50߶ֺW5#)iCEIwFD ́]hOgI?^++`lYU ҅S#HfV, 95X&"lP0pEl 88?"Z"_ ,! lwY/:nF.{_$-"8#"^ ) ];ɡWc\f$n'uAƤM$`.'o!5R(Tţv88Yvq MR ˁ"#C-P<V&OىM8=9=骚g<aOǶ3Iz؈x:CHcHǛ geǸbR8 ":]{o!"^ΝONŮ❺]A'(}?E3k{kBDĉ&S¹r_ю=*~'}&؈ay:@tK3oEĘ"H;y8yMg4nұ2Ɉxs05ZϚs ۱>%^ߙ`E#2Q]*'iE醞5])Y\nfA^`xrDxq pi軤D==Y63VC*ܽGIKlH8N!lKk??hbܭ | f {#oU\8i9HŻFĝG9n=ƒCH7}[.+p{IE7F7΄V o"]s|QÄ$mD, NlNݬ{I׶ [qKq}!`Q]ӈ(p/ /"&؀;?2"i1FBHǰܻb!u<Dn."-*w)IK71,H oQR_E;GQ⴬#"iwyh+^%-y(ҽYY K0W_WlO*KCZ-TTת'3KZ[כI "3\[#hx',"N; v~k%hM:?ܘt> &!EsD[>OEۄgo?Py& 2TQ)C%C*"dH2we* 3e/^{gRX6|viTEE{+;/Vp[Iʡ]3q]"=Ss%IyrÛHEnwicζ)6-1zM]B! (O⽑I;;c!PyoۻeH ݼ!}SjYM6%ۻJ1 O+pkӚ6A`ׇK8_=&sw(v&mԬҦkHv'L<>y*ԗum0( 6#.&{3<0WMt61a1^!B!޺L!XAI[T (oN5$$]]_VZ87"XY1T#E@ Us9xGI whbI Zu.{31 ;9cOdXr\Ŭ#M؝B׀OgF"m SnuHqg4$M@nͤ,l"+*yX9r*Blv[ Lس7>OQe:^>k1$i`5[HW2Y{HV!H߃wg]sm+ !6T7S峱S^#9^!d|mk2I[\7> ,jH ǟT aKސRL#{S~w(,sxo- (p!tI&2~M[8ގ ?n%uv'zvDbC_3Zx1> } PI叶dtE w#tENz岓v,B!Bhk+ⴤ(пXBڮZ$_%He8fu3篴&e`vW!i=Rq~]&ug=ՇEz%qHu|xl?Oq`Q`U`5;f)V MiY %-\OhesL$- \+^ !}F=0?$NKz?,L}V{h$({n۹d!#{/*iwqQp:vNJ_ v2ݽv(u*ԡdI7kqK'iJl7^SB!Ba`H\!i!RزE0cJm49Z?SGm?]_VC+6 D~`Y a\FWhL**%pNՂx(ܾm6 liSzI'9;v]¤"Ra5n'b{F/T ۧ'7IO{}w?3]/g%soИ v;eun Q9;a('-MRg6I6}B\;!iҦv7Np{Cސ$qL!OQXt 霩[~JQP$mHI#yT~@?(71bbg^7CRalcY034~#/s,OEgz|HjY8`>eUJ<mߕ30xZ-h !mT>)p\zDN~HkBXԩ,oKt ]"&ݒ.yZY ͢KCml6 _w)KZ4SB!B'f\0YuZmNGwHEQU4,LqV}cWd =Wx}EҪF_ةvۏ"C$^u2b3zٹ |03L)}7 N͑K k;v]i46<xBE$U uvn-w_2P#_ u}5-6?"MXT+uؾ Xj3mѿ$Mk]>:wq;@1gh^ uP7ۗ'5j;SWh:[Ti>+9<Lrrmh{o` ռ7), C]]T8mL]%Z7pn J`{)\M}b,X!B!2іJerRҦmv纒Iѵ݆"W۾|P͐G+r_L|HV'5e#I eh狤+@oBY,ngF)NRS5?~aIJ&VfZ3ںvDgS}Ԏ9riXG ܋SHn'~X<Ń{i<ϑ< mj:`%ڛ&5/K(cF_W Ϟ jU|wԱ)MҤާ XeHx`qksa# iS?(6Been;s_$YB/6[I1oSbTK30=еT q̣Ivp D.7Iݛ6%=tzic7BיTlK=1@+j6^;+rTLB!B!E*Y(lگH4cm)ǷZrԙGM#a\@{5JCbm?)QE_rusTiO`6^ya)ΪO|X:FՂEHSkW4lBVPg.C) ls3M^IY2iN; 3Nk"oۊMu+9:MC}?du랂4wc Xۿ$5^;!s;H(QG圜p-Fܐ͝*}T#Ӕ߭|ja{lMjdzuClh{&6g)TX-p/_^dasB(M҉T{ht<4OH7&pA$~ pG u6`sN>C*$Ml?dH7.Fo`:XEd%B^ B!Bg$=Bml)IةG|Z!iO`_KjLgHńX 0ƺ{ITR^U&HҗH Ḑ&~ |=SOEUO޽%`V]W "R2~a9I+q2]K)>bg-lW9*I#}gmN?`n/˪boھ2CJ-*0e~ s:-) C|܎ہO7y6I됧eϐϾ%]4KToV8ު)ֈN7fw9+$8`n.xpF'I c;n:IqU<|8 5igMb"5oDmE7v]w2{lTyXn~@NtzYG],{rkbOwrfC7H]OnK%O6@.I:AG:P?+Fp#DpmDqs~B!B{8iԉf{ٲhQw}[:Q^؎!6] U?H C-:b8` L!.ςhX^ؾ dbd9RN-Ig7 ]ܧ{#)&@qdInBMstBnfkB'jG "Mjd<7#SMv$u/KNUԩvx;2ڲ {WXXLwk՚T߳cV's2,n}&TI/uaEqOo!|u~۾t /2lk;(aSmoe{q ݀H0430/yMN!|3%-k5}<&ōF~2^}fGB! ؇jmښ}/lz1I˒IbVw]M?G2'iCw2ś؛%םtP_fj`cmu`.g 9HZ WC:#c&9ঢ+|~&Yk-im+k`6׼LS 9YK?2ݬ#EK,=mhko@2ǛX)s/p/&QeC3X=CVTy<\UltyPw`EdlTPl48Bn(ҟ)N&(yxQԤȷw* TʿG1J) gT1C\B5QBϠ Ȇ\}u]H'En!uE&F.WtپI&Ms֚@;S;YՒp('miR Rn|p~*iόB!BaDzKPdpW[IetX%jE~$ V/ɜΈ$:{xoYv:A] Z m{& mF"%vc5ĬmBUX|ueZx+53yJp3:Q9>Mt9W' 1ZQjOdˤ#S$9o$KD28ڮ;}pcLN IDAT1%wl5|bݣ%_Ӆ@U~V˖E=& C_+?^ҬU}I]g ۻ^ NX!~loL*L?xh,1bP.t&BOd;g)!##C!BWB6i +Q LN9,F֮l6bQ5'₝2J-{lcL>M=ߥu}%CM2زם`{=UZ׎59w%\WB!F+Jl?M\Ux\x\*:Эc*mn]Tg[Fx亲?ߵ}=i^MC:QB)_֡L8]݇M'8VX Ϸ1 T0VmaSg'Pta,(Ăem]@?%m")xex`a~>sI]r>C3 !B!Avk|(>nOR}:r҂Z|A=NnfپbJzO|z)x" ܫϷ KPMuGiGq /Gx pz w@ qsjzJ%ֽ \9~M)JpdFQ w9b,ہs>^6[+mu/| \ 䮟84s-p]P?\Bϱ FQًUme4bdηq}9~f%]K󹼣7l?dۛW#u"8oW}mfOm~۷*^UmI*8x\(pp%MU_[3K|յ;B!B_~Z!H 1TH~D>K~Yg.t$iB_biUŝHK"(p@4gK.MҤ֐th.o{ JvF2iz-,ם$Ez~RF%#*Rÿ ~6nDҊfT2n-w .=kM*[8ۍwF;]K4m[%iIg0zfo78MVz 6x?I g$ʼn78^- IQ_j;\1e尉uMcm_l{sRqʤ312ZHQkٞ4I9CIzo ʻwفt6:9 8B! mb 3{G~LQ}.]r9sO’vWRV@Άkخ{<ྊ1fʑHZĚlW`9f|+ Wtṡ9Xn㶢js%Ҋe_4SCQ$&(aLҴ\N]t+p/ Yr9sbiBv?Cؘ]=Lt-t,pPc|mJ$]C~27({IWf^Ѥ}*.ʆ,\r Y0f%Mz-v6HT2tp7xt`չ:u琡"I-"0^Zۗ՝0>NvOR9w$W2Gl/`{{7d)R!D/u1Cn=B.1\ܻc:#}'Jrmm{Ķ݊?KpŶ=Tۑ=) at,7{l' ZCXMْv TtA:jr8+J1A!B!w۵ڥΨm|(k%ޛ[Fѐʴw5c4 $TLus"C3^hhюHNt(p*|JK[R]r ϷlbǨ=+4>E1m_UW-=T'=oZxocMiK6fllLe zASu;sUXZ1]WBXE[/ ;gdtpo_p߭sIJƮwͿÀ/3m?5QBXa0,F*HlZ}\朆3`C`)gHZN.(-A"{2n)VI;>LۏJi T修o!&!p s^SӱB=1%V!B!P WH py|6uvQ]ZokCZ+h=hI3ᾍ_D^3ہ _]up/T)pչW-pT.*4 Hq U9 q^eX E|nн'>W9HT..` fMupt%N([;w-Hz_ߟ3Tڦ;WݤR1$ $o.Z5Ƒ_\XԴPܴsN! Hv:"#SHTt"M=_+.'ux a4FRQo")׃YH4UOz{!hØ4IFSt ilo>\.)gB!BU/'ileڴ\]ܷouf:^U"N^Wp1 0Elb)n-pځ2(ij|E'j|OI;)`=` PKq; M-k&Z>m5[x酶m]=I-ntεjv)s=k_+rIahrMM|6L)8RÍp9۟N'M2k7 xgH7Bʌ(8MyZQ{q4V~Uw%^cߪ֩"֤9l"9>l N;}sJҍISRα!It.ir4sN B!B}#pnY:K YPWv*p /v^+oLCyt+]0wdk{VNyUU|ؤbNj40mϓ'U&o_=ݝ ٤{םV>tr1p'k}^l5U^zcr┞NU9 ؜T˝:loh7xyQVC}I]$JSOVIt"O_lgJ:UR雌߰}!P$&ibVe=޶j{^(앁g:~}@6{=Kavg+Z>\]erB!B! (aUIȐÆGyEز¦,v[|>K h , n{sI\n]ZjЊ$Fq^5|j Ů)9@ӒiyIvFsrN_ /i{/7ۮ Bwȷ١)U%J wZm/d{%{B:QBK 閱er35q.19ps;*ۯIO?vɷH:!- E6uISfؾ폐6U, lGO]H}oBgu|AO`!B!Sl8BV: `Sۯq-;%R -//ste|?i{O7a\?ߋzA>Mq?vt1xҴ~BQ[S+NQÎhWU'Gk>vnW {{-{7o6҉'_fۇwr 5a`ś?vCIS$5uRA+𛸱 IcEojNRIV6n `1BЏK:^j;BSbT¤o_~ BˏWJi$BkO}We{M:sElk{~(pGwFtp-}M X foKoB*_b4YЃf}rI5l_|tM?QRu|w\tst+H:Pҧn%/ $ uFf1/}B!BI%;eL/mןkwһsΨ>uE/ylom{Wk:f7Sp/{ĚA&d,S]o/[ OPda! !6D4~\h,w4s$^oxW*MT,Y (p-}u}\|4lqۻ۾!sBvQBkBYۮu$9<бt"ɉC-Eg{w(:ޣs<%\IJZc[m _m,_+%-UKa$?tWKd !B!Sw_]fGw3%֞es3z8 ؄ )6 ~k͞E}I oG`{-ێۗŏ=pѽ}^z=N rVfSl?9dќ*˪2i' ܛۗ!/>vC0B{F]ޒV˙P1B#JzR҅v^S+ 8TR{ۗkkn2ScΖSIHZLR^_ H5N4gl9 (YtQf&(x{ ż}\Z,m !~ɵӌWIqIc&E ^=6CnmR^irtX;^tp/g2z:-:u ٞwm_dgVoQVCoI]5 IΜPCf uexFҝNIKqC9:C:UV^X&s¬Hxn^b3)i)Ir IH4aa6.6iRޥCzϜ-iN'B!B=`?`nx̣foۣMl~_[7ԅEe9:]gQNfϢcf̕π6pO8 3A+YpjS=mߓ%0v} kzLhsml޾S:ChUSB:V(Bl;+n:cGe I7j)÷MH/ih"uܗ|~-p}df(Vɕ˗65I E J ؉:k^"t$g,لJ$MkW-YVEU>pe\&a`ś?00Hڵ pJQ[3k>F/{ppQd/d3pF<{=kGW&uG[84f , Fz01I7~_UH9'4p%-9vx).́1t"!B!Rju5{љl6F"'6BNQl/;K;|\ <]qWd1x پjEa;IJf;%x^)pLWT^RvM(_>&kUT0ϥ5+j|7a~T^Q)FP1ĢTe}ג:pxƐ'HZ%c!~&5 IDATuzcweH2~Yt ~;5mEzIt"!B!Ѝ?g}!i> 1lMM,9$I_i!΋WV7 Esx,p'Ml Wn{mGbOFp@\+&8*ϐ+O`n`x߳gZW5sN(Qپ5mD|$-r4m3gbŒd g{m``&%&CIw:~cc~wQIKדR!B!J~>-)S']I {{ڃcm?[MxAXF{^nQ?בHHS.C{c'GTϏI .~ C2#kh 1)\w;f2XgZ`KIzO8apjoHB% 8Uk>F2;;Jd6v,(ϒ4K.k]A?!B2?l{QS@`FrI< !B!b5` !"#hag8o(0{*`׉ŀVi\Mqg 1QBd"v hZ2 9;l.i qW ^ cb0 sS<Z!P1ƼbZ*pxb/Iz_dPѹY< X3&{UMn&0^ ׫oBaS=z/p6[}%-iN'5}EIGދM]4IIڼxe{e`cAp?HZ ?m_31n#uoǔi̘[!B!H˘~F/ڭޖv4#I!Vtr躸^tRfQ_eGՑK+ՋTʐˠia"ų* 67$-Akg{ڮY 6# wۯWU 3 =)QҴ2$Is&q5Zq~ 1hj3\n).t(p! b\z?>JgJl8} '$!hI0vEA"6t;eʫ0)"!II>t#lwF~p T1*ߵ e$MY9B!BWsI$m |a5پ1IU,bOȫ5wJzbIK)W48196Mkb}-VEl*j`tHL1-hr3\N}]Ҕ_tWwwBn\+Iel QW"uX<I]ͿlF궲.|uOqf$ 8xDңΓUJ-i2I u+=i}FI t:'i|/~dIߖ I_IY:k?B uJ']395pnŽmx!1iOH7Þ$]%\I'I:TҞ~ i7IKM23tJZӉ@"i$3k,wbc$m!V!B!,#8J#y8پy})` qEgyJ"IjcA+^cۤ#9L&+()+ 4e 8 Xמ` R0iB?4Ĝо zQ봤)Jݨ[H[h8;4um$͟!N-; % A:oo{?$qWB{sg#ϲ$%yn>P9H%>! gI:PdN?734yxln8N~љ.B!0l_[S7HS鲱8pRΘvkϦڨo/IZH,;ܭJnX0}/p@}isQRnx>sG#2TXՔ*II/ί /҃VMhgg5#9OW4 ΖN4FؾTYj6'I+e&vV^}tN:/:T!NJt/v:zgKwI3K:t04_m (p! >7N!OBo\ҬNپػՁ{%(ivg9&\vΖ4uƘ!B!Ћv܄ќh@=Gv.jN ItlJp;'(cue%- $m6M}!WEE:~gI;d]Q1m &֞p-6s޲od)$mG*>tW+s}2ĩslgmCI>Mj~֪yg2s)6>+6R}HӠ(fodofѐ}&<|Z-#BxMK]r-?pd]C]iIt"=j/f#}Lz@}0i-nwaTǿHP "HN HDE(?3(% d$%si%MǭeqB[U3yݙsOtWwW{)!YW( 7sti,avWnq%ĭJ.kge$] X->oc`ڽWHs]Kg؏HKZho]YKDJJfXm4Bn2O&""=G0t+]sMV3ji$mO*l?Mr?]$prPsGf@R_'kvNpy jqn'O~h$~+iLVo IZYWJ:@+Зĭ,\A zIKh:k}[IdL] JofgnjIםHe;;%Zw"ffffff5x5c"ٌz; s{eY|/wNǒt!p 7}۽UI&4Mb r\DĔ^"N.rp}4[i|RjW2AzlX-+ 6fk5ZXCKwD rL8_g3jY֤_hTDL(9^Tsl&k^bΖM6fD.[w[_n𶣀M~>6a[(kҠWnur'f1#3p2j/i]v,iL&i:I$u!k9gGV j)p/&)ܞrj5$` RSZ'HZCcoE%ԬV'-5 $Hk{tB1cx +VYWE܁+"rLLNcc-7#T`w fpY"06B+ś䵀cʈofmIwE5@ԜJ#F33333%OՃ# q$SZE}%sVҼcIҬvt'[ ^d>*"8Z?M+!i' q7)",!\E#SjŬ-׉h[v>{,ٙbM+*&yKZ@oI.n/{>F]W;sO<-[·f9l`[ȵ@v1!"v"IeҲ՜pY?Rw"$"N'u+wp̬VEO " ^bt8 8:c/K:(w-%QMSDfky7Iv$;lXe`]V^C.S%ޔ$jF"ԖXI+!nU6.}CBwIKBךF֍sTI:'"!NG(h<)_m7].ifIe!-v{~+gN@f~+f8ݓ)䏋92뗤hAn7xPIrMy rTDZ^F-kpvvI|:{ZF&?eULs6{鬅J(ߖt8uUED;uT $`wWR;JQLhk|Fm$s{+6t|R</!V%64t&CҗH3%[1y|Y}U^wFWo?C ]lםH7G`׺hD72ffffff t%\C+vpE:@;/2 ?kU;'z':XJbumO꛳$l9I]OWs/mx+Ûs1738LNΊi2[3dKI+ |DK*~?.ǀE[]#"SoY`h[c2>>OdJcHZ}x8 WD4]D_-˔Wh҄ "mi#[ڳRjOiV}qD5Ss4ow:aEbE\Ǔ_\/d _t#;~o`Ո;vIEEm˙O;$HZ YsuǢ6BlϕO$M:s +95Lym*ͯ|qU 6s#b\ i%w?"ΗQ$]|GkEčSʮ8XI,& X\nfIN(j$};o$iFROЙ@:i OUKriD>둺@㝚5# 3@ۀI'ZmfffffU«;iΓg"b\'n`v,dN#o$HW7kkHkڹH&\nQ곤&^t"{_g-"j"/$,eiM,h$RgQ"tv#I!V4H֊o1!FRAۛ¹1n)RAjRKmNDO3Q R5H[IEos珑&g,Kϩ"64D kN8/"6̐RK$-K:<IDnb>nRh]B{OAhz iBhEqׁߓ,"ƴ:vY$-3yQ`V&ږAUQ+֌r.I6o#KsN,H 4}?֟gIѤ=_["5'*FlRD,I?l3rMpAmED+fH6đƭ2cxq"~aՈYR!ff tC!UpcVR9&:"~3?EuMpvAgK~T:t~;nQ.Vw.Mztq麺133333?6w"2̀[~|:I&`κs2IN&u®«7׋Hؖ>Xgi'aK$Cj |$WcQq:L0(D Rĺɥnv?0O|*"FϪsHڕv(xt&Met{pW{4r E*>1s臁s#&Iݶ^&]{xT;y{qNIM֦{G&t뉤S s&(i.V'+P INvuZ$m@: &H@w)r`6ÌI{ioB8`&KRM(VzVi a7V< xw낤Ok8Ċte."N,)w3T$ݪ7ުbڊ_']pv2anIYU ҇"bTJZt~Ly3gp?o:ODxFw(ހlA*x܆]:mNU|X\49p`',ifffffVbc4m^`:>!]pkX`a 5>E꨺xݹ9`8%dR񬋱3t:YynR!+]`x-W@I$Β+f n ulEGqttX[ vǪTc2D*ED<9$-KjVIϓVy){viv D6I =Rq`;J IDAT"T9^݉t8p-@ݹRRWN̬LMv&fD\Tf>#@QFOʧWO6;&M VKT3sMyڞCHMzV;]EjRsY-]b"SD;EHx>;v^!I:ت?,˨HZ8Dݹ4iiٹU*iIe@zp % lTx%9ئn\ƒ[Sw")@IHR'"$igE vpcDwP> ԙ9IFwTU.iAk/׀kj03y'38 x)Eḿ7/OeW]x>QxMxR۟g$Ojؙ#by.p73kR}C>|:3I8Ttm&]Xh bÈ87I nԧf2F;NlXo/KQ~Ti툸D"izR nZ/>IcF "-$dcs$Wqo]I+ ֝PV$q[ݹc"Aq{49/ߍ(3-R'a:Ty?iU,9##;kb҃#bLUJZBZ rvY^%5c;mIӔ9Nf{Eu'2!X2~'_47p(x-I .4 ʻ>4b%ghI >,K_c44",sb eD`x$mLj8_ýKq p%pMD+x"ve>JʲW-)V1\$-K:vSD|C Z iarJ{Sw.-@EPdfffff×HbD|R_D|:UsםK#u;$";xpy`[`m:rd{B:I8\ :_9IsE*?"XI"uR0]EҊDu'S5I됺䊈薕+^o'qwk3·+.l_-DUc6=`2VIrהϕ9Nc?Fiju'3!T>8E'N*I&NxS+xaE䣯>>`$Yn*HgY,ig`ƲhëIcGձrxь[_zVxń́me2֌IԲ&I:عMlg *j`1Qm+%uHplX%}n&\AZN4Rg"bs k't(fJ:SLi`xDABH`siE"133333˭(/v^kWR$MGjn1ЅI'tt(5~Ig8TuxD<_w2)&oEhPI+_/H<4^!PIƑ 3l#ݟN|Ԉ[w2ut ڗIu)$}tQs:&L X ":X9;+x/6iWuކH5IԝHoLj0S&c2e]D\"Gw3 &jpR&s';['lv'Ij:3#ιW*vgۤہ"܁%}4'gG#b A҆vNh /ɪ9FN2V `>H4 > N)<|Su:Is&,Uw.-z4"n;33333$}bo|!"8~I>p7ADWU>N҇?U3[\9f㷬(6[T@Q2/p|v68I#u¡o"5{DNE!AEr<"h3V$}=@ O6I$ ǏWRG&*9D\GҩwVon/5ժ=Cxp]OSw"}p տ6sq_#7,~Qr> `V&nʟR6ED<չ 5<WՓ&+>B?"iv'Iޯo=ɵGyݓ#b|Y/$ߊwDҙb +.p73kSKi`͈x(CJM)NL=X6ҁt;$mBzuiWb˨oٰvlefYtл[#b:鏤GE뺐Ɋw'uu!H/ꦢ˺Uu ? خݡ;Qщy?`c+F| +pbE[}t Kp&;[,E]2;H=\KkIZt-b )uN^G_eʤǑe7JҒfhˈ[;I?gNUF࢞P`2&^W]I;G3R8Î 2`6ügHaV!-cV[IicNqqs_R'.luϒ;nP`X!NƐN>~t"#btffffff)|~)y>yc_] 7ΧvW!ҭ|PHrQlFĘyv2I Esavp EQ{Dܝ!U@oՀi2 ZRs#vMDvTx-|l[PcI'rH:تǷ/"~_S:]E"-_넢$1{ Pl^lf̭%>Jz,HZ]&{$iVQmDRϓkx}NҤsh IiwIϳ>_'5׺<"j,M^j ?kugI:7 aiwH{, ע_g{D=Uыbɯn1{Lymt 1X`4osH%vneEۼ/_*sI[V&d6^fHiqYFgj,i6gI!UN?Ι& gV섥y`$@} 鷊k2433333I]FDN5/I_ہeJaN$- |6Wq{mo>5QZ0'~I*x x ~x;H0xf]Rf.֏#M4[{.VfO:LX):.JǶ9Iu=k=&=;Xn"M M4Y<{>g'!|N~ ?< 2x%`j}M*Tot{xιEqb #w8I!30Gm,bė^__ eeߊ9iHh yR.]wMQwz}{,`~\HZXtcĊ3qO4#iR0g^_WEI*uہ/ pq|hϥ픆o{/31eɓ^z7zN~=.Fw iDɓ޾LWoը$}8tZuFDl)affH$Z~'GgIO>U^Re^qݸH וd7t=Cd݉tqw{IKyqh໙ƃ!`N]2̬YEOWvrՀ{|kjf1$M|XTsxt.eHZԱ/ ي"yu6 WKlL)x 9y_C2*5V; {N4yT;zYf'Mn:oS&(tߺx2E!dLipYFnPU\=p|5u̾}T;sC0e{ɽ+qhRwv=ЇbVU män Fucf $mIn1=p3p!8@eFqG|l`ńi{) .p73L҂uE߮93$-ifS"gN[HZm:"`yIXM~SkY;$-/םYNm/w#&vBDYRJCZ3d33k@D< !ܷ$[L9q}212?pםHe۱K%}XXǶ9N_nD ̲]nffffff""jbW"k;DҺ?HńX+"Fe/Ik Pf"⹺)䫤s;&~ Kzpw33&FR<PF3D2[ nq)20WJ"U`5L! Jק~\/i1333333333333333*lvw3Eq \'iLg9uKDED-ΧMwIEN̬.*5!ff%}3T;%afeylISםH7I;6@z)u'cfffffffffffffff֡^o6Pw3 DnM U^x{YcYGZ8]_N; +i1333333333333333@ 6p#3ܡ̬"kQ4sp!DI[oo6pp7i}l'Ŗ|xq݉t Zx`Sj6N̬C|\PzC *sC*D]ZF`Iolvbb2Kӗa{vRDPw"&"Ntp6Di~I?3N̬ V>8Du'`f6D.QC. *i1? "v-+Yy بvH"b C{Ieܚ%m[w(" I_I%7;p3%͑9Y(]?Ng(sY "bg!?&8Ie%gͺ5B;"bBD'Dvy`V`5rmq6;nc M+W0W2>$m'ibuEr\nfVpL;7JZ(s\"`TۑجӼXFЈx+"}#bm` ې?@Ͻ%XCFDX8r1"&F ǀ$,i0333333333333333T?HdsY~9Reu]ce7V1H$FEŀف5WoV`!)"މ݀GKfCIS>xq0333333333333333&+JgSIHw,!#܁%mL;Y{3"I#H]ޗRl *a#bf~JɦH25" 233333333333zjaץ"$-BjNٟ?Dď+Jisw3EiCo 'i܁#\`}ܱcG<@4!`8͘ bIEO~. naf?| ,-i_IW4Y%$\WMFÃ;uq%X`ψ3U4K1 *n*|=5"*1~k&,LSa _+sH4-·jN'ǁFu'bfffffffffff̬֩{H8XwbD\WMVà :HQ~<]IC<lTҺyT[dk;("="i~R֤NeccYO%?X8",!v$}>iUۏ+u#b\y 6;LvN̬Ӹ̬;H8 XeVҰ2lHvN,ik$&i\A#b` `b֑4hwx*"EI]/!Tiد"HΟ<6Դvҩit:0 ؟!u?cmFķ՝Ob333333333333333!iQ/nسu}{+r%i\A#l`2[ 8YҴGĺ"[rM [IZHZ h^o;$"vFכM>  (i1333333333333333ko7`xuE'8"HI ;gi1ϒjfx4"vvo3uHhU6tE)$} UFLvOI %1!"N' } X9d1333333333333333닒_3r󗁵"3\nf֡"퀓Kf>R<FıOsųwIS7cDw\FIFb}G@Y3%WEI];$mSwCMDΣ ݧ"=OAɘ$iV"`6ߌ'k8S43NUt>h{xX1"^PiYG:4"ƷDb[M&p p3i2X:"PfU`"𭈸D*I'}ZTrQD<]w"ffffffffffffUtW .wl9RB q[Y ̺=K.F`fϚ_b{tLŶ6Ǻ8"ƵI t;lDLL҆99bU]`D2IK ݿYs*z pX獙Y7pYa`n~?Uff]DiunVs,pk,{1]7~ hqwsZ8JxuD&G Iߤ.o+D}u'2IZT Nݹ^`LjD̪w33!X`n:0"FhlXSIݭ)ie %M#XDD4lչv;"~1grN GڍWEmIYͬe>[w"C]D_.;6|^ f;333333333333333V瓀\^-uXx!+iLмٮ#w~p`KxDybNKƫ_rM!v.uXJFڤ J՝Ol<"i'IS՝ WGF^1,qYJbmE1 ؒ 탦!%;>~d6`o)I'KZ`1!"> ɐc("&7W9֪;""n5+ΧEsGwKZd:LF[fff6ű@ ,YY u`ff-4c% q*udm2 IDATxi`>+ۧ4TzpADEkJ?KIEGv&_A~&+Eu9M~IM&!՝p#oΥ {D#u'bfffffffffffZu8*w>fffÝ.ԛ̬I8&"v*)$}T.10CcCけbDī6B5g?D5S*%PSsŬH?Nd85RJ5Ҫ 27N̬]vna׿EĖ1333 rDq1dbՏI>]s:4Qbd݉BҵZj`1%333w3!F^%qD$p z[e^$T`;E[;,iiҊs_["⮺Iތv!GD"TB܆HZ8XR% <<}#IkT[8y#͒4 %*0[12 ;Iۼ5ӌq~1d#i5 defffq\nf6DI30MГ-#6<9}ڼM:a00 warP Io"24XT*  ."F4@BkL-";3333333L,*+U5133'iCOnFW7Dؒ2333+ ̆8I=`݈2sܦIZ8dݹؐq-bEcpXŠ>|ܽSSI]_쵍nV.I/Ws::iĞ̮6[7Y="6+33 iM  .vgH̺ ̆I.z FD'sܦI 8TAnn6Iż{V<3" >6HZ t3#xd̺9݁YQ5YuI$]޴T^~OԜ٠\nf6LHʙCV;2mIt`s 4qp.У5o'I#כр^~\ffffffffC=Xܬ̺}H̓9u333t.p73F$M  l9+@-)f|\ M +Q%_ ck xueeRfԯ}"1$bM퍈x̪"i!kbg#br233~|\DD[wffffq0$i7PRN.+DcLtQub8[D<_oJf i*`%R֚Pn"-ym݉Y}$} XTоxuwخ $ifffffVI6j!1֤̺Hש;ْqwI ffÔ3hO1f[$mCZLn= ށ{IkL)vތ?#➺1j+| ҈x+S\33333HX,fm@m{$"ɒY4W}"b|݉ ffØŁOf 0x)c̶HZt?;u 8nn7kʆ}yRfI/"⩚s1Ht."i `_P_23333nPn]Kdeff֕$=43kr+@6M3wuҵ|333lQW2X9"^-.%ozn"~<"֙ Dz٨>^oF@:q|,xd̬}~E>c?0"x\33333AI>-")!Yא!qo'Y+O̬ ̐4pEưkFcEҗ֝YbJm="bb]IR/ Bƀi-ev4G 1DLDIn_X( Izt$@L}M .#""""!i%tWgY'LT) 7ߩqؗgIyj+$?V }z88؞aQ`%`=L WSnLQt`qO˞x &NjoKEZ#b’p0w۱.p%&l㊈s(IRz×>YoDM)$%]w_m혤1w~s?*I3W2ap#6V|9Nj4_D Io9]y)՟@xy8 Z%bIzpcɍ3#"""""鮚H޽x"""""& I?cGl?PSHC- I~<桯> ~ pU5t)z 0}X$46}wJy݁f{O2mR=%wm1l$-IھR`m;nHz.p=j)""""b“6g5 k'"bv1>XsC/I}k{\o:9p. ۛy[6ZmfTJux.vn;l_Fy=xX*'KH61aIZr3~vݲ}L/1IvM-[8C/ 7۷j`t%9v@tƕ1,DՌ7t%oi hփo;X o, Mҵת5^M.BIHz%-#iX%]l:01;! j%'i6IIp=6hmNm19Q6q)]fo;&I8?mчTpO q&HZRE{N{ p+4=W$&`bk:IQ*bʍ'8*PMego`Ѩj#O-ێw?kҶ)Nfi9im+I[Gp.;LIF5 <74VDPK{DD4F,v7p"%dts5$&M=Q6f|F 6>&lv 15TM?v,]]n;~H6 7i;~QODDDDD&i_`51!L1l?f#<v-JƈggMd3iDL)!i5J5%ڎ ZcI`Šmo^,p*X}!MzٮczD$Nc锪HD̈}ێa_mѯ>*u1IZ a.Vh !EDLjZDD Vv,g66^EۧJ׃ڝߵ@L]6l;Cja,b8ɟ/SmѲTp(z!1$=""mzm1U?KZ1~PS+iSI/4Gہa^`Cc(~\/iTu6U-k;?""""""""""""w'=mOBBIm;Q< 8$BM6E<6q ?vVh9;&IS6[X|Ui -{8tGNDDDDĤ!i!`=3x=;m""S#"Uh;q 8c=/0k Ô#Q6lhn蕤P:7lv, R]¨Y)yBvlvuK{DDDD`IZ=c#"2SDDDpK۱ĸ>CiѢ#%]*[ ljd͹0-m_{InsVHr{ ̀KOp}%-nH1Iib$)Q7%="R=""ŀkKNj)~ lZm􋈈v1DDDI ێ%b883zgQ6 Bh_kKnTGۏOL~_o6}Qǝ A%"""""bR%ptncȚÉ)( 1$ lv,sm?4%-| PcXQ/Ii;!p;p<%ۏO oq3:}7""""""bKR XsZɈ֠^oC!0$ v,񤇁s3ofagLfX=@D$8a7p6rs5Ph;AI{DDL:w٫Olo$-OLǁoޥ""bX$=""&Iyexw;aEnUIKHDll|xplFa͒NW@ڔ6uYIߕIsI4 ok;>2{ .ELҚkciDD$=""&*#ڎa[Vpg*A3Q蔋o+i8u%%i7IcU!"t<;5ZS϶Iz% 6 bU]gFDD#"bb`uci؋)pn \ ݰ"j73IGKZ`":e2` E]= IDATS޽?pK$W """""""""sA)2Thu~ l_8X` JKD.tWLD'l?f Lq_ce]?wH:Vh9)Oҋ)ߗێeeM[$GDkwTp$GD`n- pS%":aۛoPRu,d{.`ZsIHW$NҬ-6T NM'k;莤m];|zg#ZP%+4"" ڎ'"j.ps$m*Im1#|x,fO=}m`z+.4'iam2@ﰝuvqH*G txH#"" 1>X8X"v.Uc~>,a`[R*LO՟́À$/i_I4s˱M~,v,t#&HDDDDDDDDDtNҲtMlIRة=d"""Q](|X"Zt!p'tgXX~k>jo$iNJ]G<jQ'I;0~?QJ_, ${twQON}KLHk)ũ~`mHDDDDDİ%ptncȚÉ)^y I?a'ޤx""bH{DDLzMiKvs3=(`[5ye/>^jn6LKvx"0W}aw=m<֓Y7GvDG$-LIt 0GL6.NNh4$N N۱ [mv $ 4ڎ%bJWnh;5өv?^""bI{DDL ^FiOT۱ m?/fjUqJT(~!pzP/,(9`ʦg8l#NS6DΝ^=dvC.f~ lv,qDDDDDDİI{D=5wS֧QmnV$@)5ӑJQ^i{C ( 1eH!cR~b'$}v{!E n,_Q}`gs#mvJE2m_)ii`O]ԗhC`{ۏ4БfT#iMJHU&=SlvCjOUA(m2`޾ """""$i`fKLlS!V!_|yHu݀ŧ+_1w)NU`>5 fTM܏ 1T>r83?7nfk'$lح<5Km_rHSy-5l'QoGDDDFҜM;۾v W=S:ܝӧ47PXxRSwAޗ%ivJgww?~ CC^] LpcVayl:b^V,P}v52~:C۫R I/t~.g}c^a3[ډvr"z0Ңoa $v%w&Z1^ܔ;WXe õruͷ pXdğq-pZ{hIx,O\Gz=zWw0P'WDH(2>O)^:%k17% RJ"Qu;(պ<>^m_*CxI*yi+xzOwTo)Q%Bw*ʦ>'i 55qIQӖn;.hmO_}rn5l>"i cy0׬5(M+;tmԚ@"k7Prqhbw/۾9BU`WB Ms>e 艜2%=""M'(;r8#b~.`I2M( QN;ЈIvbߴW+OH(/O|WS*L{\AigdnI_afJ"Y&JTU] `ciA6DDDLPV֧WI}r;eSDQզO6S?m }3?~:*ӡˁ}cl?\#iq`o``M{; hEu 9JjܫצN}ms؊Rrni{m(ӒڗlxǁRUoZ3JbY*Jה.PۛH)b㫪#oU=e0 ;ؾgs=)tN^9`2㿃3u2ԯ(SsT/6ߤ|&~WT=S`Ꜥe)/[0{xsKQGG(zU]/lD&yPֆ h)/ v}PAtJ(jP RkğCtQw% $LIr_z,P}??D\y$q&⟀MIvV}~N?J|'{F҆n1(Kc$|Xeu%qJr+k xKY`۾$GDD ׀K.^mc=\ ؘr4ZE ǁLAITR٪֔glhP*SU;Yϣq0&OFvC bJx?m$i.הvSїlvIoܨTV'2(;U2=9ںpl1H&Nd*r`J%b(ܫM#ߢTgm P^gE}nMt؁+ߗ~xKZR i?;;᭔D5C~F%頻*V3qùRlk U%}yh"WD$iF5jh9U%Nm0I%[/X~4^wgZR~{]oۿ Op?CH/_#n;m2%=""b:ՉW(;)Ʀ̻'KZ%DvL`|_ʶi;T{ޯƹGiE&J2|Q(TknK<= ҝ;kAL\- Bw/dDDD4`J[g<~6*aMm?9lMxrmҩj g gGɟQh;Jnm'kԭjb;`/z[(J6>X9sUk#UÐ,2).64bcm.&%ֶj;lDRv@ؔ) MӐNq.TPc=4`ۏ0ޣv=xE3ŗz84ۭ/GɡY5+aJ"}/kMy=T8]ub`:AB^(vCzt/ cZ"uS Mخyɚj[oGE1< |gbzUcuᶷa)fxT'qf*nGΔ eџ)7Hί>^`:'Bw_DDDCҋ('R{Kի&𖔪/cm>Q**~ 9b`pV\Xq>em2T G0zɠwI/$B.8,Lw1qAI,D-NJҒ&l]Y- ݋)_Na WRHyDs%\;Sm"ځ2u>dF= >鉪kM(7fqSl iyJZ5 w1so$:L s5Q୶3?HzZ'׳meD0,lnl1/ôc|F|ųS`oVIr1ƣܣ*Ԫ^r ϧXҳ)[Qef53Mʍv#fQ*+-R[Sm/#""b$mAt4fjTiev}g~(l |8yR۷X#MRon+Tu XU57IZ%ÛQ&KZF(0hBIi2~$wEsQ&뀷>I$7+ھK”3Nl $,R^Π$XC'(%!qu7B$mH2< luHZ3ǁP~'RɆg j;.Ͱx$Ծ5$;@$A鰷+^Ք.U½l{'넯/j- m2I;P6ws8L2'\CkSü&5%=""UCΖc^4;#B n2:}Q."9ѢsF6]eK5lø3^_A{'PZfW ^<ӵ<>-:8om*namO[}SΗݬ"^-mFΦXkIRH>Yw F4'ޤ W|d^ |:k)`O{W5HOVtMSoxoc`ԓݭAU݀DKXiնSu=4(O^v@һ})&Cyߍ ډJVݣ^7^;^I̳SCxb(&Bv î<PC\ lm̳g~inO%UoQ:SwN\}ܪ0ضkd<$mLyoZwjWQ~O'f(!KPKk7x0n:~`^@y]:mεcK-x]/y1$GDDtZ܆p%ymw}ʅBO'PUS*4u#?% `< v&(|;z/תX_^_C ,Jq/m9T=8[Q8oZ IQnRO3MmybۻODDs' 1U%wQAUUw6Qe{Ի_Q֊nT1~^Xf7OIszM+lŜ[?qNclo]6 \crOa̰B=q+n W?C~kOzU>(oMMyl'u_U췡[5U$74/Miڥwq{ޯ 'pVc㧔 'H{DDD$-|r2"Omo9bΗTe1f#k@U \;(IWv+5KD?CcqP%Lqi]S<ľQ{a([覢ƶϫagQソϡ~e{~j$}N | 8ʒ)%Tǘh:]d&NyyWsMս{WӁ>braG_[~_fH|$5=l8c"IQQnMЄmdҨEl>rsF鵘m9qVrKs֧Aa`]aS~qly8UENmǽQ~Ooꆁ;.4'%霅m9tiXnHہL#iJN] e50s?k! =*,}9gh0%M5Iz R1P'yMA=iU%X`]O}p);0|]|oko]8T7X":"O>ޣ~'z1xUȟ),}K,Hi[T=EҼm%u~YǂjMVE/#֠$va^Jkxߤw>xI[R*vw~6t+/54E S~X\'ttx\1mA`j57&I+SG4S^W}}WU)T׭'mwۭbJ^0޿6$IrniC<]`g꽷úP[ IDAT?I^?bb7>j On9d@KuǑXX%:>Colryğ}ua,Cs_HѷSM̰f1 ϡ6BҒIQZ E7q1+Fռݍ{(1k 1J5^Kj܃GK:ZG(f>bJ:+"t6j35 6GNdJav {3Χb%},N noTa:eo{ D+I7{O)[ʹ׵V^O٨Aqj$ގHz>%jyR 2?#b?WVsd%鍔vxA{]햤Q*k\M'/ X9ZV=hU$z`*:JZRHjOMM㍫ `Lw&KDKy 羽n^+O%عrJپ~/%ln$쳣Rg<1{ֹw_`97)Ez.?g\wtWR$!i~KT 7Ro:\B9= K/$-BzCڭ SzyM;r53m]x=p6 =H)yv,FYCg')-"""`۟T=)V&;rmہ)(;=rk{%,fil /XRʹ.JZR>ΓDr;;f`z"$i2ϾwTr;3WuUWTLlUu|%m{Ǧlj{3JNf*7] NJ!:'`9ʆ:\Q| ,wxM_Һ6dz79'O}]MnK֋jJ}/pVOAmi)^t3jClh{wgyͶU(DVk''Vݛ=ZCـױ$XX=6Ow6?Dr;uP\ߒQW~=JrUie/N_Li?%]UdZ=*^jq>(iE+j')6=/;)՟8JսdjfI?M9SEUk%JŁal+Y: %wYIߔSIJ@OIgJ:KKZOM'ַuŁ?V_y +"bJnD UGLo̭SӶզZUP:]Pr ۫>=u llPWÐ m?D4h/gfѻUm)?`Hc}WC/lal;k.Y<lo 3*QJa.Iuw훁]\{:و.TW5IGLb!8IucjouPkWZ]c(֥UTɊLBxD==2'7`BۛR6ioC}gt/spۧsѦl]mf϶k>=%uoBugN]Cɏj퓁9NyE4bS( TPn2< PvḗRv(&isʍ3Jo`;ۇ71pu1tc_p> vUK1,ٿk?nL)UҮ;kv 7l;3psVR*o$]H&tNUL&:IRC?SϿWUHz}v.Xjj$-Nw/XUWIR:vmEFS}v㒴2ecDOgTI%iJen|M39(]t2Ү^SHFu p yx+3&?ݦlc#Ꜥ(E$C)= k۾0XE1Ƴ:Kj&UI9PoUS4[1PX &I71}U7ZHڑޒþlu IWKp蚶ZwOQnqUt DgdΥ.H+xIc[69IڇiS閤SUf S^l`KOI,%}y`1kMZ7:Hځr[%PM# 5 ueٝ55C~DEPWӐmfF{}.1$$mL<ҭoptKnaIy=|[OD>|C[DӋԛS[8^תһ}Vcΐu(P>J%4J^̔tqerU} q5%ށO6IphـOPn;s= i;pǁÀ=/^`^lj$.,r3EҲo"؍l.p|z5)_s(nf֡Nc88rIԴ-eUU"{> 8[v*yP65Fyt҈I b=#}$>L>Jr55Cf(uh$mDIr/#NH8]l$DNSaCe'$5 qCh%}I+SOiڴ3-}%ZJ3lSvGW+۾xU_X '?{fIU}wINAAAP$ɂdP2 "*Q I@2H99I(93T:{Խgfz]9k ɱ2@9pH7yD'JZwЎ}%],14mD m4!s$!etE$ YzRއK)-6~W(_,)$lQ Ҷ,+J?p PBF$f_  {C$!6 b=ۻ E% @҉+`9/iiI Gߴ}H!-AW3ճ&fpnP7ŔCrIwJ:PjAJ$M^A`r&'/=.'kwR[;]3WJ3k΢癥s ]R_hnTb  vۏ>oma{{gWK1:TI]]겝 i ټv?*nHq18Z nx6s܇E#:9Ϲ'WQԙǨھr\_ xD1JqiNj`N+~A2ʝT L'T]~1P~ $b*BAmC6$.z}֯f+"'I_Innrm{IR ՋZHDET 7u$]HpiK,e{ۇ o{SImڹXI'Ω!G U՞OqJ Iώt$}unPt;Xu{˒n֬=%*iIKHZYw$}O$m icI?m$X+4u/;AiiAvJ\QA5 l"QIvKe4+,\$$M+Q@*_CՕt (u q{;jM]BM @Fxcm>kpQ50^5-yn( ZϟHvu9QSd EȨ> Xs?pr޺f7I:m5a.H\trD4uI۷"!(5jIuF  h/~&$LIn=X%Bɍg8>' otmN@\ߙT`p3ۏ4sՒwCu&$p7m{WHז#woYVsIxrhm[6-R!HOE`p^] 48fcRסn=6 Ǹ3UGHSSgkS?HϗHWD HZt?ilY:HڄTV}lK`IeX 8s.@H&c{4(-LxT!ir~I۞E)AˤFͲc SqʧT7 g ?Q~^fDL-gRӧ2h'U!?h{⨠ꪷ+ivy8Km9NӱrS#t?Gn[;'%=|a31pL}mw[|6~N҇rƖ!~#C!i&! $`'^d>Q=?LsE RI~_0;4U,  2ZP|/(X`g %l~_bS&g}(IB`U6I[>q%Hh `jvLr]4I?#I$ >-HPOt(`^^I"Uw5F:3ZxGTwOv21Iӓy7V3!H ZNoV1'bIT_Q$U>NUs`JR HXfh,ߑtY&q{Q V5[࿳t" dx"=[8n/_uET"md u^5piPL@ΩDgNl%io+iۏHkDai`3IщW;0, :h\ҮIMosJҼkB;|U$Gsҍk`}dnJϡLLr˿pI8AA0HXۖ?"?(Xp޷`^kp/G"=h>(iwI$X(KfrA3pg%$iSI JZUΒNtI#n>e{QCG<,k{Lq;[iG%&x'lRӒD"\ hpOHM^}A<% M( $ +'W" p ]0703C1=6~{$m\uu `SuY@{fS_Ԭp.(rT%sbf1 :wᘽ2tglrkOܓ{ISrؿd.%}e +mV,BU ~O}tN t_Fe~97ۧu@y|7X<鮏n~*EN1 7eD!wY Cթra(s  ow 9?-iax6H-Lc7C6Z6M݃HGj!C݄ym:&bC<+ (x$1൒nh~Y=+&$ X~ %'iJDQI}B]K#(#$~TRW (e;h9ϟ"u)j'"׋fQ\v ܗ׶.'LzR'~p̮GH8?l7d2m`m_/Ki,]3ǽA2; *S?gFA_4J9ߍ㠷ӑϿkNVeo]2&p nAClw[  l?d{Y`C ˅xΕt!Mj%i`8f&MҪ =F W_$}$lԕ~K^Iޟ/'I^o ^ʵfROI7:]'E8g$]!PIUNsIN$4%-!i]I;I:$#+Yc%)iN'A9$-̕99S Tc"ۍ\.CUIJN? ?ki>!IS%sikeYu3'Aa>IHE\lXè/ZD"A o0ڈ\C2ʡtBn@;x<֛]Z (ݍ0`1G4!p . ;} ]$i!rcsp$VZ=F.^p60iqfte4V)>xRa+&lm@۫\~Erv h3K[ ^ޒ4F i"qZ>B;. ,D (FRGn({=r>ϷJ(i"I+J:x5aCfN rn=B%SݹT[Σ 7ga.{[y45$Fz-z)ִuJ܃ ˰ P%O%m6mo , KL"I=:$'\ ,h_38ui8Ɛ^"lEUۭy&%uظWyQTlc{%Kc件AP31#sN$"|'sܕcQ?U9}`YPY>AYa@.}Ǖ4M$Tp!>y")mK3ss $Рc//H kl^X">1f u I皥[ŖA0$:'3w t5`N'QV|е˫S_^$@he:aJ AA>_ҥ$]) _N/ؾX4&t_z IDATXEҩom?d݃n.I׈qۏbՎ ƹXv;ZeRKIk/@X8[aa/눣SIH RhnJ~v LŌـoB#A&uu/ˢT tbfr|\q+7 i;L߂l+Ɛε}G ,9\2McHX!s=fp +t=+9OHz>F|[/0y! z/ޭ"֠}[qz?e۴]$2j*{پ= zI:؀[u%Pڶ/.&u+nI2Arvf+I^%M JzylӁMlvkV{8ST5$e5Uaoocvp%XX u|!pp6pG;Ojܤ>DžڑosJZ.cN$,֨1QUq+p/96.uz4-תx$jvͬ7% ęc{ iΠ, +f{?7DgU#}$1[56}I$f_C_<"]= zI:8Z{?3gK}9pBK:}8B&#+8;rρ9XHr[ XY>ǯCE$^f% +ؾW]1 ;#lŇ*v IN++{ǁ=3mcAQl]iHRCr@ԤNHR: Z< .E0~#Oe"jg5 WJǻbFBA=J4{3r=ˀ*.7?+`+Inx_\.i~RK Z43;M$rk]|1 ەBҚ _TI %Gru?~z06"쎔4lc[9ة}TS(jq S>S`Jz7ǽ5ǏhÅnGҧEH")Sbߠ+43_t2|7XO\s64OԒ6&͡,O=Íx4rI SPAAc5ŰROo"iO,'t_Ծ.CWNEj ~)7q~sIfȍ$d,Ġ9l4$n}kA?`~ޒ$ ݁I;Nqrg  }zͿ?SP Pp_݉٬)iRou: ׊9>\L;C+W>!f6Ai܇{ >*IX{/}`.H$`_6[AǩW=[ !0:KKVhX7.BA#ߖ2'`? l+i௶ھTN$PR&9 (M'>7^ft6w`.xQlo?=TFJVLSmTӁ׺T?++$٬'娺 4U(sqgH-x %-$6RcWHd?Rń.*f   zoV8VWkns[xft=&܇{ qnc$JZ!e0<¤b/SP/Iq$Kn N.'͡A.%L@''{VBI 1dRR[I:طreђVvˍ#hrC _V<ش@|ػ,upgEs @]s$]  lTNmzθ>)Hum3 I[)}m FAލwIHm)IӓoLG!p^b9Rs|:C+_,?Gm/mNŨĭ3k`/pp%]A5״ |\-Hu ss>$qu/QIXuEHBMb@pCIg{sj3ؾX҂$Gh_ec_`.CcC+~$٢s'7Tbdإ~] tfq&`.\zl<&#uZTEہfI3k&?mن*N}@/I[B-AYF{]Ee8G ijx%zIs >G{k"i;5hKP/hU5I2tZnN_&4%!uM    I{PvA~i u#I-H5*gܽm_Z'iwJئa:1 h-l?$1(Q`1۵Š'uu}%\ \J.}RGNpp(.Q^ >V7!W#=Hkn%YmwUE #ISK][|m8F嘢r3D.i2]E'oJ$ԽC݇_1n"Jq8hIKN$ѭ/np, 00If oPIIJҭ$3m/n8!0/0IuM2!DA']K˸< ,Lg{mdž}AA0W‡XXUSq98o_NpbZoK:xSR˻v03*ğAPqP&}}fǘԡc \<%}t`p]$ LԂ7r(,Mz i|"I`7<^9Eh/_O/QO36"YnwsJ$nl&=u"poA+ 7~R3C}`>Ԭv(}A- ݀k{#6$O1:IXt/qmhIzz{}E A(U$}=IRH*<} pOL5GK:8͹I6ՃHQ$ I/T#/Um$ӂ$gHZ:&pLUReH HZT3c8= Hb{% ,N\!;eh5A!"e%I;۾4H݋al1giME.nUAY 4eչN{ghEҽ5^T2A[:.c`t"İ_N)K;{pguS,F UGȵ=I\ \zJzt e5s=p8pT=A8N_yz#loS* TAbl&,`s 1= Ӏl":@n?+>55{H"mgOX۾^$2ý@eCj۳A9a}t6-iN(I,]: }[6H{g2KIbm5HN'$R( KJv]Yb$}T@ =Wz t/xAB(>՟nv*& ->wԩijmX|Ũuݼ,EN4q {W܃;C¢Y0yɟI@Z/hI'kl9CT^ Ao_yz&12EAr*!vv&/| H"u%87+'큕|aޒ."V?8RҢ$!hrGۧ5q%Or,iiyNIڻn1I{b2NBr g|!^#,H-7D*I>g54j*6wM I/~Zxm6` &7I ~ۑ4) m8*nCMOjCsնIb m?U'pY$Jgf&s.N'AS( ="p]/-N8vpl"-[& !һeb^${ESG]J} pIDF Dgģ%MNځe|`j;DҿKˁqE҄$jv`Z`jIoom+ ~ڕWi$}f#>^j& e `jC]Esybr~k}itfE){0ugWAi}bĠwxT`ˏ {PɁ9%eorLzjWd  !{br{=9|N_ #r zAA0'-:ԧ=]rvcIbȴ%[G(YM/` Xw?~̐_t9C~'ËW4Ir=tI )=wt` ߨ:ut?oJ$v I k fnqI$b9Q |g`AKr Wׁ9;KQyB [oj\5ƞY,Yr4|+'hRO྘۾TB1Js׆غ9Ϣǩ >5`#g +A_0,' W&W6+ B%D7 !AA H%"E}ZtMM$]Cr8_tbgUN@涯x%H8]γ0V'x$&yn8 !Z4ɵ}>&".jp`,"i>w.R{%0i1l2~ :^'t_˒$ lh,Łժmc`j1^#őM?u{~c_σpM~Wҍ\搴JBr_J%opLV/K0رf"yVG(H/Kھp>}}{YWj^>'ntηpH|N&ο%_jv.AA0$oM`WZ'tԎrCr@:F" FQN~-i7`-`+>.t 88XUm?ҷ)޹:9\liINtB-fq_~QҔ"fŒQh`&Cq7@j<WxKi̧پx%} iqiIXҳ${ߟO&&! '歶ic>XmE8Aq1P+Kiu\.M.M+gֈ1 !%JHQ} Õ{5b*i/ʩ%HN{E%gyt"ߐ֭{-Cn}tI?'5`?!0n/98^vkHRuJdwUzAA l_m{i҃b> <%0I7:lf{Q}ot\l'%Sl$;x}]g6$m%mAEѠw8r Azl!iHn- f4/2^h^9 #\.a}v_;d۷Of4D I.#~Ipuw@Rr{Nۃ {;@MsIWu\{:K˞+ ڴ@}DT;%~g0檻of2 X c̩1$-O.(Y/-2M7s>[bH|N&K\;${]be  5!9zRmR`K^IHZYR ﷽3IonvUg3u3A5%n{Swd?`ۏc%?ַAA)ntA4-:L0F,C_.,M$^VLj6r8Dߥ|#sHjup}+avi}{Yl; LT8m|/ӱ{M%P֖׊Q@܃  %M*_ކC.<(ǒht1/>0i2{$T BaU~!$J#9ֶ=y0!0uxrǹ Xqw4wUۿCl[!iRkZ N#/F?̗h IDATfbgluzIFAPhINJ\擴D8-vЧNgHfd҃HZq2lR2Amn!k!w/gBtl^z~IJ'7t= ZTBoZth<st\f{9vE$A$>$`[3׷XAWs@u? 9Ï6v/rEIG^g)x @5TI;dFv4?]2Ahe=K qݒ*8U1O2>J:KdTB ڱ3GNnJ-UlL14/71MK;{s,f1>en>C^s:6|ĵ!O3{AE}]%_ $=s%}߶}l$:xleXK#_l1 bQdtq>k{^].t+p;i$m;)om{$mB탃  A!.;BZqN^ ƤŠ72b%P`Q@WCoN*hc08h]FK2 ~pn-K|x/s\|NǦA-ڐO9i] n$ }偯'UK%#i]i~ wZ4<}wfGr˅V>wKۏVmw?|=X,-ʽ z IJ:u,w:GAЛ=z#ok )MNlY< v@%}@#iJIKZӹtL J#,ɄN hs4y8%Y1~2QD0,4JG 1*p- l)=$+s:6Sw:`Pڐ>@NK[I@#ijIKJZӹ!p %g%t_2ms$$+i6߳}IХ9uA`.ӂcq]HU?H?sȺ3cq MK$@q[4>Oj߹qFR j{ېvAI.A.{J@"HZXac fhzX^oPNԵ"IH:Mz"IUxe{JZP,$}2!l ]# )Ilqg4!i M cU|DMk}K+phA%0fLA {&Lɹ&@%͡\\!if;= bJ8pq;5 QIwQ~HA~qيHۗ>^H/+RrHX$5kƜ^)H A\E7bjI{"Qww&ROo?ɱ}]`!U9 8XF `R :@ m&(6UaC}G|dp0l8K@bHv9i>%:Ug{%D}L/iق1*8Gqx8%0c~ق\ZdN?^3t͒#"x͓2o,9K;࡝{ {=u/'Tϰ]J:dcwJ9 S{AmHr<;<\#6I?́=f% (z IkTq lj۶'ʯCZ(2-F#Hz4z Kz$T>P``6nc,SfZ$#lo@3׶Iߒ؞أ|}J_UxR1MO_ VN'AP v34Hu&|FMN9tut6gpU9``4Ztq Iˑ_uD&=/{r^`'H$f-+I҇l?ՂZ;8l,/L@ǩkBlqG.9u%-E3 s>:J_-EBGE7teJ1yЉ$垧MSu)U$_n 9=$}@ Z0!p ؾ$H`!HIsU߶_ou&? 'i3ICSm`{I$15rmEk^Z}t}l?ΒvyLIZGi g5 mux8# ۏA'!]Wo2ہlfO[6/ MB#o`/I.+iQ!`P+posbfl,H?bm&8I):4Ir?=Yu-pqThr=Y$?`樟QQr3_)E{ ƜK 8:c6-OQҦN@t> !N3󤣌k_\$L1tê>od96<@xn#@B^"W>[,ʑ;Ѝ:2Q ]23}Zҁ[`#ݞzAAl?j{{ /t)DݗKZSu}H4[7/WqIZ7Ç}d%F,oMR$zQ:>?8X]ne{ew\e\zsJy ,lwIۃ O܃`p0PJ\JhAy`E/ r]>Eyf1U^!pFJI±e#. vnXHPπilNVNt2WDԳU %}At&i-lI_XҔ4W/kaJN],N%m3}RA,=Z ;ǜ 2=9sZ*m!u`r,@o3u=EMQel P+$4L509I-On  :WlK_8$OElX83h?YU6pjEgbۥ_-H%- Gބi Ɛzlv&A$-ZU'WK4BaYOzA4kAEu; ]^p?mrʶ-U6.oFAx.Pu%՟[$m*$$Aj<]#kv- ??p]5_W{^Ҽ"T䴮9_WϐؾThS>{[. ]u?v[ ZjS݅Vd 78T%L=F2O "i*r9]J:Vb49B%kh/ YrXW, O S+=H:I⒦49s~=IH:F5E{3M+FSbY궐q!bŁh-pZLY $&nh'ͧ ǫ×[HD  :F%6~@jt+xܢH#oޟoB}KÏEU#O4V\ӟHBH fpr?ƻ,j/"j7em] Ha~G3<.u@I~RvuHXf[oTsՍ7 ھq{ IgeXSUG'>q$-@zm-Igkd ݳ,%6syE[:ɕ.ly[!I$Rʤ{]կkھ27H܃  ZE&݂~q{u\Ҽo{pK$֏|$zi(^$ ?$MhmImd;{:jJ~O>`AO7Ҫ `GcUMƂ wX#Ise IsuISa6.KRj>aV}n|J i9G.hl%";X'\a{@*Hݱ%-~z'&/VBhP&WIף$7'H۟- L݆f`Vu$=@nOߴHN%;$(V%EV~J *p)Kꅶ-Tn9d9t* zlz|Lt*.C+LF5B<dRDWu[Y{| Iۑ,f1-W 6;N4>@ᐂs_\o;ecTWջaU!5Be򩃤II3h{)F#+voUae$Hi_3Xn52=iqo| ( :3x]qܮsGw2νn  E Ⱦ=! ,B;Mw:Su?Jw9Ow=SΫZ󾶉~SwI"b h'݊E.)?wyߵ¢RzJS:1&"6^`} :/i{mf#FD@ o7ʗ {ܮ#PVkBʅo/h$|<3olIots2Ô?.1jyi/pVwQjLo9?hÔ.d5(:qʅ)紶اSi;)D'Ef+vh>qBfCRæL?p]/εxQ͛VWaWN|o:pjJ9y(R='L~(U B<uuuM(+&;yd]ps(yq %ypxV~v2L$~ȗ}>3fm}Z16{h"bcJ`jIo4:>3"~@y*3~צV1{Buumffmcձp%L2ѬIm|yo=."HYվUdf jPVoc X多w91 CyϡDʊ=C1.IFD =(a&gu-h} ʻ/Q.@uBjOl}J}mu_Puswuf[H8r`Jǿ2|qD{IR) {WncoEnV= |8s!Jmnv̼Ư:s%\uRӅx\M҂L|5v< ؎Xkulo)^SM!l>)gw2u83WӁ.tBlocI6] ] d!Js-)Է=8xm6;([zN{Mf]#⋔uYB@0|/,6DEe@CkN~B915%#Mѻ'%I[Fn,+wU!ߟQ:vRʱZc}\J7'"" 7{'|mVoor d/t]յ f9ÿڵw"5oP'=|Q;2O<);ZRJ7ss2vJnM`xCQ‚]]cw3sMѯ"b'nNEoԽшؚxk&Di=p3N4SytE~\f~VveNr|{Rf~'q#kjUK27as?~EnVJoo-Ny=wIתnHFgrx৙XEա픟e+؜Ē1؇)37>S.nwֱ(39/.Bz$M#7TK_CM҂ .d$1H< &eIq%\\"bq[imXQ8?3>VQLz=̬~ҡC X*`7d濵؀RG)]:m%Dr6%#%f6]K Nޗ.d4=kR.E7(+LG J9<:C'"[|wE4%">t,\]8ν?3RD 7W]$)r>^)+'p^':nW?M9ND0&{O9TUv)WQ&_ \کs؏`Eˀ?R]%ayNH?75%IҤP]=>]rbwm<"b?=x'{)w]DTˣ퍡wMMtS~5_f>9VKd$I bYJ$Z8`æk(_.fXK6i]K)iBzD r^7nR&M wlyKJtFQ_Gg%M"⹔,ފ[(-NSbDr.>0%ImUgegܦY* s"e~peՍ7]X&Y}ӅL5shfUnt=q`HDO.>ݍs+z:1 _DZJc/%wOv{ի~{zu]=GwQ&\ƪJ ?mNPw2n Oy~5[n)p%~QYslg] yS:[D czo 3.I&x6.J&:N98?/fNDlL9X}/֔CNE#?Iq ̼u̼i/=f8z]G 5 \މA&ه)6m,ؔ2(`J+Gυyɸؒ}:G VP8mzU˫t-L૔svou-kdl$"N-:3t!cOp)2yPf~]ׂK JFN7̙5lk\"b3ʪ;vk.4"b}Jsvk"~=HDB9v 򜿴mMjCu&]AY6_>VjҌV\=MAqO-R:qe2VcDZ թ IDATDdzeEWsm\1.I&j)݃){xN/I%&t|OtGՌTc;AъRLw7:c^E*L^H&)2gQp=\D<3.I{ T=ױ~vyDTu ]eN ",Ng Qd 0U˫2ۿ(澑"skl೔nmf#zIx)y(^l?_<8bf>t1UՄto(Ac28"E߂9(~MZ43qf۝5T'н RBd欱8" 'v |*+hU{/Pݶou6g(+e}P{=& {2s"T-+Dı5SwefG iLcR^+sa0.Ijv;( wi.Mgu w-lb Cə0]!Չ)tǓR/hkf~yOVCr.Jo.e3)Ŏ//.iꉈiہ̱o`RCoL{>(" ᵙNcrP{vOn,\S3JXxB+תZkq|WDCYW,3tD'("ΠRKޓǵwz`6xrg%/>Oز#bC!ϩi(Pi $iʪ: A $S%Mup%wOs&p~'f)"t=d"ʌ#MɦgC?ߤ I-)'ğڝ]R/m(ASӫ Vs^G ]ۯ=OH7aECF@`t1 3i{z)Ɣ Rp-p;ǖW[oc]VO 43Tjǫ] `SO )WWlv&x-%RZ98Tњ#" @=3/kԴp6n5TC/O""6l<ۍ(z},3om^ʋ)(Chύחs<mܷ̻Gn (] ˫L5Մ#)+(L<93ooeys*T^|Geblys~9)Y5׵=+?<߯8^{IDl 8~퓔.fm8ߚ&o,LR X0HKdu1RmP[PV^{xbG}n_K >0}.2rSnS}h|1cO{ U wCp^wDNY9 Yʃ9h1p$ItL@ ?\8p^{Qf/\8r0Գ'I j>っ2Ɉ ؝rb-1Pݢْ$i[L~K5n\y2tIXrj:%*HSPȱG U>n:dkSeҦQI⯮ƎVsC&IYcplu}(~7%"_'*M&>a)S&cTw`0ףK0v{_ua`[d-(Cvq-Ե6=R_CB/v7lZnL 2G>uKl؎)Xeсe9md5mG9'$%@xW$8U=3oT(tOnߗ h$ICT3St~~J _`kCe.֦: z `Q-tXkʩ35]$M1s wۅI$ [Q«7u;ZM?2yˀ_'V*Z 2P%I$I+3.I4>)KWu oi`m=QM]FYvy ~YfSӶRMx#)/I$%;q=\da$I"b=_Y9P%I=ŀSnʑ$If]$i"botrN (]ݏ39 W7TD:&$I}k>AqAvI$I=%I$>%IZ^G '0g9o[D Z`fGJ}&p-0KVݭ  D7-Irj ٯy$I4Up$Ip$IjSDwv#p6pvfnKDG Xr7s3sX́OX$,~`$I$uwI$IwI.goT\@ [lp9ìzX lL (IQ'՘KG$I%%I$>%I,"vtu JXB&z6pNfjqi4\$Ip \ G$I$IT$I  ?2n~KcL!Mˑ$IS\ ywH$Ie]$Ic]$GDľ sc"bKg6\$IZ{vb$I$ K$IR} K$Xr- s5pp 033oUDڔA--J$MV8935]$I$p$Ip$IaU@pPV 3ؔtyNz &IӍg抦$I$&$IT$I}"" 8{4[0$\˛-ido[V l\u$M OR&̭n@[Ӛ*pEgҦ$I$6$IT$I}*"tu?k`f+`!p9p)%>33oEĺ}zI/VwWagg梱6RMHے2lv^̻/I$I$`]$Ic]$igPؼي!]3sv%MLDLg$IS\ʤ +"֠hJ5Ù)I$I K$IR} K$M2UaإيVq%wpp#0+37ZU?X53l4W$IZJ gffK*"b/}i-n{?ešʓ$I$M!%I$>%I&ؑt ?:ip%>z )3oVDzN އ7i4Ikp.p:pnf.hq>Hy3d K$I4p$Ip$IBˁiVH oE}zs$i 8̥͖Ӟ؝t+(_v7̼kI$I&%$IT$ISX~%g7[фg,`vfhVDĚ~ߦ$IXWRgu 1NȯK$I4p$Ip$I"bG6m<J ,U\J9~ 6= B$F(33隈ľ#)%37[$I$i0.I$I1.IE i=`}|f>da툈M==A35#3DĞGYPDH$I4p$Ip$IҸDzΧ/ߧ5ZT3BwJ}Q+"`t *[nBg\|xf딤:< 1p%I$I,$IT$IjID %~IEuF2B#34X[m"bM` V c7S*0c0~pgf>V#bm ԱMI\d|z$I$I2 K$IR} K$ ޟhQ;͕Y% N5 ?OL&)>|,nog/>L.z ුNGG$I)ɀ$I$ǀ$I:&"`}`7`FꞧY9> 53k0uFDl  ”NjifmI$I:$IT$IꚈx)- ,;NUCQ{6Z6JǙyKH$IA%I$>%IԘ3a1BwJ',L<7nqX < c^_~՟Φ̅ #I$Ij Zxr5y^%I$IR2.I)!"3} 3fu~+37XԖF f{eqs6`u7pp\p=$I$f)px73gT$I$5$I"b=E w,!;ɺDsY5~p{f>`m҄Dijw0>6.^8oP_g #I$I:,"> +گJ$IwI$i q,,`0~pϰ1/37Vؚ6>6f^m)hZu0e2fK$I$Igis̳jڞ$I$$IT;a}"1xê!{3sYcjR-(]Y9ȾY88mf.Ákޟq/p+0W̅V%I$IQ...̹5o_$IzwI$&1w~ߢ E{3*Tψάf"bJ^ʪVx| Ǫe@VV$I$ix.p9i~rp%~If.>%I$%I.;2r}Fd#3lB-" l_^C{nnnonGaD`}!c9A(߀$I$IUG_(2w I$Ic]$IjXDl0^(]S3?\G>}?3kԩ'"aSa $I$q:{Q$Ip$IzXDl4>VM8= Z|TzCD>0f\Ӡ'ہ۪q%~Sf.l0I$I񊈷tc 35]$I$$I4DĚ֬> NS5jBS: êvf0ľmfk0I$IvE3YMײenM!I$Iu1.I$ x~zæjԘXA|$I$I:)"f(kWk3r3|ff$I3 K$I 1vBʅ9]b#3h4I$IDWQd6kXUfv+I$Iʀ$I(] oYݮLҤK v;6W$I$IRos5CK2sESH$Idg]$IRψ _gZ#oI2ǐ:$I$I$I>a]$IR_6c00|>&&hp5UcP\T$I$I$I$̀$I)#"6eh̀iMԫIg0?duI$I$I$ITd]$I2@=bi ,s<`x\@͒$I$I$I$ $I1w)FN <#2sE+$I$I$I$i0.I$I=""6ab:Me+h?tI$I$I$IzwI$Is:ackk_I$I$I$I^e]$I$I$I$I$IhI$I$I$I$I$I$I$I$I$I$I$Gp$I$I$I$I$I$$I$I$I$I$I`]$I$I$I$I$I K$I$I$I$I$IzwI$I$I$I$I$IRO0.I$I$I$I$I$I %I$I$I$I$I$I=$I$I$I$I$I$'p$I$I$I$I$I$$I$I$I$I$I`]$I$I$I$I$I K$I$I$I$I$IzwI$I$I$I$I$IRO0.I$I$I$I$I$I %I$I$I$I$I$I=$I$I$I$I$I$'p$I$I$I$I$I$$I$I$I$I$I`]$I$I$I$I$I K$I$I$I$I$IzwI$I$I$I$I 5IDAT$IRO0.I$I$I$I$I$I %I$I$I$I$I$I=$RIENDB`Flask-WTF-0.12/tests/flask.txt0000644000076500000240000000001512542143557016744 0ustar lepturestaff00000000000000Hello Flask. Flask-WTF-0.12/tests/templates/0000755000076500000240000000000012547354553017112 5ustar lepturestaff00000000000000Flask-WTF-0.12/tests/templates/csrf.html0000644000076500000240000000013112542143557020723 0ustar lepturestaff00000000000000 token: {{ csrf_token() }} Flask-WTF-0.12/tests/templates/csrf_macro.html0000644000076500000240000000016412542143557022112 0ustar lepturestaff00000000000000{% macro render_csrf_token() %} {% endmacro %} Flask-WTF-0.12/tests/templates/hidden.html0000644000076500000240000000051112542143557021223 0ustar lepturestaff00000000000000 {% if name %}

{{ name }}

{% endif %} {{ form.errors }}
{{ form.hidden_tag() }}

{{ form.submit }}

Flask-WTF-0.12/tests/templates/import_csrf.html0000644000076500000240000000010012542143557022311 0ustar lepturestaff00000000000000{% import "csrf_macro.html" as h %} {{ h.render_csrf_token() }} Flask-WTF-0.12/tests/templates/index.html0000644000076500000240000000066012542143557021104 0ustar lepturestaff00000000000000 {% if name %}

{{ name }}

{% endif %} {{ form.errors }}
{{ form.hidden_tag() }}

{{ form.name.label }} {{ form.name }}

{{ form.submit }}

Flask-WTF-0.12/tests/templates/recaptcha.html0000644000076500000240000000045412542143557021730 0ustar lepturestaff00000000000000 {{ form.errors }}
{{ form.hidden_tag() }}

{{ form.recaptcha }}

{{ form.submit }}

Flask-WTF-0.12/tests/templates/upload.html0000644000076500000240000000067712542143557021271 0ustar lepturestaff00000000000000 {% if filedata %}

{{ filedata.filename }}

{% endif %}
{{ form.hidden_tag() }}

{{ form.upload.label }} {{ form.upload }}

Flask-WTF-0.12/tests/test_csrf.py0000644000076500000240000002131512542143557017457 0ustar lepturestaff00000000000000from __future__ import with_statement import re from flask import Blueprint from flask import render_template from flask_wtf.csrf import CsrfProtect from flask_wtf.csrf import validate_csrf, generate_csrf from .base import TestCase, MyForm, to_unicode csrf_token_input = re.compile( r'name="csrf_token" type="hidden" value="([0-9a-z#A-Z-\.]*)"' ) def get_csrf_token(data): match = csrf_token_input.search(to_unicode(data)) assert match return match.groups()[0] class TestCSRF(TestCase): def setUp(self): app = self.create_app() app.config['WTF_CSRF_SECRET_KEY'] = "a poorly kept secret." csrf = CsrfProtect(app) self.csrf = csrf @csrf.exempt @app.route('/csrf-exempt', methods=['GET', 'POST']) def csrf_exempt(): form = MyForm() if form.validate_on_submit(): name = form.name.data.upper() else: name = '' return render_template( "index.html", form=form, name=name ) @csrf.exempt @app.route('/csrf-protect-method', methods=['GET', 'POST']) def csrf_protect_method(): csrf.protect() return 'protected' bp = Blueprint('csrf', __name__) @bp.route('/foo', methods=['GET', 'POST']) def foo(): return 'foo' app.register_blueprint(bp, url_prefix='/bar') self.bp = bp self.app = app self.client = self.app.test_client() def test_invalid_csrf(self): response = self.client.post("/", data={"name": "danny"}) assert response.status_code == 400 @self.csrf.error_handler def invalid(reason): return reason response = self.client.post("/", data={"name": "danny"}) assert response.status_code == 200 assert b'token missing' in response.data def test_invalid_csrf2(self): # tests with bad token response = self.client.post("/", data={ "name": "danny", "csrf_token": "9999999999999##test" # will work only if greater than time.time() }) assert response.status_code == 400 def test_invalid_secure_csrf3(self): # test with multiple separators response = self.client.post("/", data={ "name": "danny", "csrf_token": "1378915137.722##foo##bar##and" # will work only if greater than time.time() }) assert response.status_code == 400 def test_valid_csrf(self): response = self.client.get("/") csrf_token = get_csrf_token(response.data) response = self.client.post("/", data={ "name": "danny", "csrf_token": csrf_token }) assert b'DANNY' in response.data def test_prefixed_csrf(self): response = self.client.get('/') csrf_token = get_csrf_token(response.data) response = self.client.post('/', data={ 'prefix-name': 'David', 'prefix-csrf_token': csrf_token, }) assert response.status_code == 200 def test_invalid_secure_csrf(self): response = self.client.get("/", base_url='https://localhost/') csrf_token = get_csrf_token(response.data) response = self.client.post( "/", data={"name": "danny"}, headers={'X-CSRFToken': csrf_token}, base_url='https://localhost/', ) assert response.status_code == 400 assert b'failed' in response.data response = self.client.post( "/", data={"name": "danny"}, headers={ 'X-CSRFToken': csrf_token, }, environ_base={ 'HTTP_REFERER': 'https://example.com/', }, base_url='https://localhost/', ) assert response.status_code == 400 assert b'not match' in response.data response = self.client.post( "/", data={"name": "danny"}, headers={ 'X-CSRFToken': csrf_token, }, environ_base={ 'HTTP_REFERER': 'http://localhost/', }, base_url='https://localhost/', ) assert response.status_code == 400 assert b'not match' in response.data response = self.client.post( "/", data={"name": "danny"}, headers={ 'X-CSRFToken': csrf_token, }, environ_base={ 'HTTP_REFERER': 'https://localhost:3000/', }, base_url='https://localhost/', ) assert response.status_code == 400 assert b'not match' in response.data def test_valid_secure_csrf(self): response = self.client.get("/", base_url='https://localhost/') csrf_token = get_csrf_token(response.data) response = self.client.post( "/", data={"name": "danny"}, headers={ 'X-CSRFToken': csrf_token, }, environ_base={ 'HTTP_REFERER': 'https://localhost/', }, base_url='https://localhost/', ) assert response.status_code == 200 def test_valid_csrf_method(self): response = self.client.get("/") csrf_token = get_csrf_token(response.data) response = self.client.post("/csrf-protect-method", data={ "csrf_token": csrf_token }) assert response.status_code == 200 def test_invalid_csrf_method(self): response = self.client.post("/csrf-protect-method", data={"name": "danny"}) assert response.status_code == 400 @self.csrf.error_handler def invalid(reason): return reason response = self.client.post("/", data={"name": "danny"}) assert response.status_code == 200 assert b'token missing' in response.data def test_empty_csrf_headers(self): response = self.client.get("/", base_url='https://localhost/') csrf_token = get_csrf_token(response.data) self.app.config['WTF_CSRF_HEADERS'] = list() response = self.client.post( "/", data={"name": "danny"}, headers={ 'X-CSRFToken': csrf_token, }, environ_base={ 'HTTP_REFERER': 'https://localhost/', }, base_url='https://localhost/', ) assert response.status_code == 400 def test_custom_csrf_headers(self): response = self.client.get("/", base_url='https://localhost/') csrf_token = get_csrf_token(response.data) self.app.config['WTF_CSRF_HEADERS'] = ['X-XSRF-TOKEN'] response = self.client.post( "/", data={"name": "danny"}, headers={ 'X-XSRF-TOKEN': csrf_token, }, environ_base={ 'HTTP_REFERER': 'https://localhost/', }, base_url='https://localhost/', ) assert response.status_code == 200 def test_not_endpoint(self): response = self.client.post('/not-endpoint') assert response.status_code == 404 def test_testing(self): self.app.testing = True self.client.post("/", data={"name": "danny"}) def test_csrf_exempt(self): response = self.client.get("/csrf-exempt") csrf_token = get_csrf_token(response.data) response = self.client.post("/csrf-exempt", data={ "name": "danny", "csrf_token": csrf_token }) assert b'DANNY' in response.data def test_validate_csrf(self): with self.app.test_request_context(): assert not validate_csrf('ff##dd') csrf_token = generate_csrf() assert validate_csrf(csrf_token) def test_validate_not_expiring_csrf(self): with self.app.test_request_context(): csrf_token = generate_csrf(time_limit=False) assert validate_csrf(csrf_token, time_limit=False) def test_csrf_token_helper(self): @self.app.route("/token") def withtoken(): return render_template("csrf.html") response = self.client.get('/token') assert b'#' in response.data def test_csrf_blueprint(self): response = self.client.post('/bar/foo') assert response.status_code == 400 self.csrf.exempt(self.bp) response = self.client.post('/bar/foo') assert response.status_code == 200 def test_csrf_token_macro(self): @self.app.route("/token") def withtoken(): return render_template("import_csrf.html") response = self.client.get('/token') assert b'#' in response.data Flask-WTF-0.12/tests/test_html5.py0000644000076500000240000000307712542143557017560 0ustar lepturestaff00000000000000from .base import TestCase from flask_wtf import html5 class DummyField(object): def __init__(self, data, name='f', label='', id='', type='TextField'): self.data = data self.name = name self.label = label self.id = id self.type = type _value = lambda x: x.data __unicode__ = lambda x: x.data __call__ = lambda x, **k: x.data __iter__ = lambda x: iter(x.data) iter_choices = lambda x: iter(x.data) class HTML5Tests(TestCase): field = DummyField("name", id="name", name="name") def test_url_input(self): self.assertEqual(html5.URLInput()(self.field), '') def test_search_input(self): self.assertEqual(html5.SearchInput()(self.field), '') def test_date_input(self): self.assertEqual(html5.DateInput()(self.field), '') def test_email_input(self): self.assertEqual(html5.EmailInput()(self.field), '') def test_number_input(self): self.assertEqual(html5.NumberInput()(self.field, min=0, max=10), '') def test_range_input(self): self.assertEqual(html5.RangeInput()(self.field, min=0, max=10), '') Flask-WTF-0.12/tests/test_i18n.py0000644000076500000240000000202212542143557017273 0ustar lepturestaff00000000000000from __future__ import with_statement from .base import TestCase, to_unicode class TestI18NCase(TestCase): def test_i18n_disabled(self): self.app.config['CSRF_ENABLED'] = False response = self.client.post( "/", headers={'Accept-Language': 'zh-CN,zh;q=0.8'}, data={} ) assert b'This field is required.' in response.data def test_i18n_enabled(self): from flask import request from flask.ext.babel import Babel babel = Babel(self.app) @babel.localeselector def get_locale(): return request.accept_languages.best_match(['en', 'zh'], 'en') self.app.config['CSRF_ENABLED'] = False response = self.client.post( "/", headers={'Accept-Language': 'zh-CN,zh;q=0.8'}, data={} ) assert '\u8be5\u5b57\u6bb5\u662f' in to_unicode(response.data) response = self.client.post("/", data={}) assert b'This field is required.' in response.data Flask-WTF-0.12/tests/test_recaptcha.py0000644000076500000240000000435612542143557020462 0ustar lepturestaff00000000000000from __future__ import with_statement from .base import TestCase from flask import json from flask import Flask, render_template from flask_wtf import Form from flask_wtf.recaptcha import RecaptchaField RECAPTCHA_PUBLIC_KEY = '6LeYIbsSAAAAACRPIllxA7wvXjIE411PfdB2gt2J' RECAPTCHA_PRIVATE_KEY = '6LeYIbsSAAAAAJezaIq3Ft_hSTo0YtyeFG-JgRtu' class RecaptchaFrom(Form): SECRET_KEY = "a poorly kept secret." recaptcha = RecaptchaField() class TestRecaptcha(TestCase): def create_app(self): app = Flask(__name__) app.secret_key = "secret" app.config['RECAPTCHA_PUBLIC_KEY'] = RECAPTCHA_PUBLIC_KEY app.config['RECAPTCHA_PRIVATE_KEY'] = RECAPTCHA_PRIVATE_KEY @app.route("/", methods=("GET", "POST")) def inex(): form = RecaptchaFrom(csrf_enabled=False) if form.validate_on_submit(): return 'OK' return render_template("recaptcha.html", form=form) return app def test_recaptcha(self): response = self.client.get('/') assert b'//www.google.com/recaptcha/api.js' in response.data def test_invalid_recaptcha(self): response = self.client.post('/', data={}) assert b'missing' in response.data def test_send_recaptcha_request(self): response = self.client.post('/', data={ 'g-recaptcha-response': 'test' }) assert b'invalid' in response.data response = self.client.post('/', data=json.dumps({ 'g-recaptcha-response': 'test' }), content_type='application/json') assert b'invalid' in response.data def test_testing(self): self.app.testing = True response = self.client.post('/', data={ 'g-recaptcha-response': 'test' }) assert b'invalid' not in response.data def test_no_private_key(self): self.app.testing = False self.app.config.pop('RECAPTCHA_PRIVATE_KEY', None) response = self.client.post('/', data={ 'g-recaptcha-response': 'test' }) assert response.status_code == 500 def test_no_public_key(self): self.app.config.pop('RECAPTCHA_PUBLIC_KEY', None) response = self.client.get('/') assert response.status_code == 500 Flask-WTF-0.12/tests/test_uploads.py0000644000076500000240000001213312542143557020167 0ustar lepturestaff00000000000000from __future__ import with_statement try: from io import BytesIO except ImportError: from StringIO import StringIO as BytesIO from flask import render_template, request from wtforms import StringField, FieldList from flask_wtf import Form from flask_wtf.file import FileField from flask_wtf.file import file_required, file_allowed from .base import TestCase class UploadSet(object): def __init__(self, name='files', extensions=None): self.name = name self.extensions = extensions def file_allowed(self, storage, basename): if not self.extensions: return True ext = basename.rsplit('.', 1)[-1] return ext in self.extensions images = UploadSet('images', ['jpg', 'png']) class FileUploadForm(Form): upload = FileField("Upload file") class MultipleFileUploadForm(Form): uploads = FieldList(FileField("upload"), min_entries=3) class ImageUploadForm(Form): upload = FileField("Upload file", validators=[file_required(), file_allowed(images)]) class TextUploadForm(Form): upload = FileField("Upload file", validators=[file_required(), file_allowed(['txt'])]) class TestFileUpload(TestCase): def create_app(self): app = super(TestFileUpload, self).create_app() app.config['WTF_CSRF_ENABLED'] = False @app.route("/upload-image/", methods=("POST",)) def upload_image(): form = ImageUploadForm() if form.validate_on_submit(): return "OK" return "invalid" @app.route("/upload-text/", methods=("POST",)) def upload_text(): form = TextUploadForm() if form.validate_on_submit(): return "OK" return "invalid" @app.route("/upload-multiple/", methods=("POST",)) def upload_multiple(): form = MultipleFileUploadForm() if form.validate_on_submit(): assert len(form.uploads.entries) == 3 for upload in form.uploads.entries: assert upload.has_file() return "OK" @app.route("/upload/", methods=("POST",)) def upload(): form = FileUploadForm() if form.validate_on_submit(): filedata = form.upload.data else: filedata = None return render_template("upload.html", filedata=filedata, form=form) return app def test_multiple_files(self): fps = [self.app.open_resource("flask.png") for i in range(3)] data = [("uploads-%d" % i, fp) for i, fp in enumerate(fps)] response = self.client.post("/upload-multiple/", data=dict(data)) assert response.status_code == 200 def test_valid_file(self): with self.app.open_resource("flask.png") as fp: response = self.client.post( "/upload-image/", data={'upload': fp} ) assert b'OK' in response.data def test_missing_file(self): response = self.client.post( "/upload-image/", data={'upload': "test"} ) assert b'invalid' in response.data def test_invalid_file(self): with self.app.open_resource("flask.png") as fp: response = self.client.post( "/upload-text/", data={'upload': fp} ) assert b'invalid' in response.data def test_invalid_file_2(self): response = self.client.post( "/upload/", data={'upload': 'flask.png'} ) assert b'flask.png' not in response.data def test_valid_txt_file(self): with self.app.open_resource("flask.txt") as fp: response = self.client.post( "/upload-text/", data={'upload': fp} ) assert b'OK' in response.data def test_invalid_image_file(self): with self.app.open_resource("flask.txt") as fp: response = self.client.post( "/upload-image/", data={'upload': fp} ) assert b'invalid' in response.data class BrokenForm(Form): text_fields = FieldList(StringField()) file_fields = FieldList(FileField()) text_data = [('text_fields-0', 'First input'), ('text_fields-1', 'Second input')] file_data = [('file_fields-0', (BytesIO(b'contents 0'), 'file0.txt')), ('file_fields-1', (BytesIO(b'contents 1'), 'file1.txt'))] class TestFileList(TestCase): def test_multiple_upload(self): data = dict(text_data + file_data) with self.app.test_request_context(method='POST', data=data): assert len(request.files) # the files have been added to the # request f = BrokenForm(csrf_enabled=False) assert f.validate_on_submit() assert len(text_data) == len(f.text_fields) assert len(file_data) == len(f.file_fields) Flask-WTF-0.12/tests/test_validation.py0000644000076500000240000000664212542143557020662 0ustar lepturestaff00000000000000from __future__ import with_statement import re from .base import TestCase, MyForm, to_unicode csrf_token_input = re.compile( r'name="csrf_token" type="hidden" value="([0-9a-z#A-Z-\.]*)"' ) def get_csrf_token(data): match = csrf_token_input.search(to_unicode(data)) assert match return match.groups()[0] class TestValidateOnSubmit(TestCase): def test_not_submitted(self): response = self.client.get("/") assert b'DANNY' not in response.data def test_submitted_not_valid(self): self.app.config['WTF_CSRF_ENABLED'] = False response = self.client.post("/", data={}) assert b'DANNY' not in response.data def test_submitted_and_valid(self): self.app.config['WTF_CSRF_ENABLED'] = False response = self.client.post("/", data={"name": "danny"}) assert b'DANNY' in response.data class TestValidateWithoutSubmit(TestCase): def test_unsubmitted_valid(self): class obj: name = "foo" with self.app.test_request_context(): assert MyForm(obj=obj, csrf_enabled=False).validate() fake_session = {} t = MyForm(csrf_context=fake_session).generate_csrf_token( fake_session ) assert MyForm( obj=obj, csrf_token=t, csrf_context=fake_session).validate() class TestHiddenTag(TestCase): def test_hidden_tag(self): response = self.client.get("/hidden/") assert to_unicode(response.data).count('type="hidden"') == 5 assert b'name="_method"' in response.data class TestCSRF(TestCase): def test_csrf_token(self): response = self.client.get("/") snippet = ( '
' '