pax_global_header00006660000000000000000000000064141164517620014521gustar00rootroot0000000000000052 comment=1abd1be756284f20cd172cf9e9b1e713527febfb q2-alignment-2021.8.0/000077500000000000000000000000001411645176200142515ustar00rootroot00000000000000q2-alignment-2021.8.0/.coveragerc000066400000000000000000000003101411645176200163640ustar00rootroot00000000000000[run] branch = True omit = */tests* */__init__.py q2_alignment/_version.py versioneer.py [report] omit = */tests* */__init__.py q2_alignment/_version.py versioneer.py q2-alignment-2021.8.0/.gitattributes000066400000000000000000000000461411645176200171440ustar00rootroot00000000000000q2_alignment/_version.py export-subst q2-alignment-2021.8.0/.github/000077500000000000000000000000001411645176200156115ustar00rootroot00000000000000q2-alignment-2021.8.0/.github/CONTRIBUTING.md000066400000000000000000000015131411645176200200420ustar00rootroot00000000000000# Contributing to this project Thanks for thinking of us :heart: :tada: - we would love a helping hand! ## I just have a question > Note: Please don't file an issue to ask a question. You'll get faster results > by using the resources below. ### QIIME 2 Users Check out the [User Docs](https://docs.qiime2.org) - there are many tutorials, walkthroughs, and guides available. If you still need help, please visit us at the [QIIME 2 Forum](https://forum.qiime2.org/c/user-support). ### QIIME 2 Developers Check out the [Developer Docs](https://dev.qiime2.org) - there are many tutorials, walkthroughs, and guides available. If you still need help, please visit us at the [QIIME 2 Forum](https://forum.qiime2.org/c/dev-discussion). This document is based heavily on the following: https://github.com/atom/atom/blob/master/CONTRIBUTING.md q2-alignment-2021.8.0/.github/ISSUE_TEMPLATE/000077500000000000000000000000001411645176200177745ustar00rootroot00000000000000q2-alignment-2021.8.0/.github/ISSUE_TEMPLATE/1-user-need-help.md000066400000000000000000000006111411645176200232670ustar00rootroot00000000000000--- name: I am a user and I need help with QIIME 2... about: I am using QIIME 2 and have a question or am experiencing a problem --- Have you had a chance to check out the docs? https://docs.qiime2.org There are many tutorials, walkthroughs, and guides available. If you still need help, please visit: https://forum.qiime2.org/c/user-support Help requests filed here will not be answered. q2-alignment-2021.8.0/.github/ISSUE_TEMPLATE/2-dev-need-help.md000066400000000000000000000005641411645176200230770ustar00rootroot00000000000000--- name: I am a developer and I need help with QIIME 2... about: I am developing a QIIME 2 plugin or interface and have a question or a problem --- Have you had a chance to check out the developer docs? https://dev.qiime2.org There are many tutorials, walkthroughs, and guides available. If you still need help, please visit: https://forum.qiime2.org/c/dev-discussion q2-alignment-2021.8.0/.github/ISSUE_TEMPLATE/3-found-bug.md000066400000000000000000000017421411645176200223500ustar00rootroot00000000000000--- name: I am a developer and I found a bug... about: I am a developer and I found a bug that I can describe --- **Bug Description** A clear and concise description of what the bug is. **Steps to reproduce the behavior** 1. Go to '...' 2. Click on '....' 3. Scroll down to '....' 4. See error **Expected behavior** A clear and concise description of what you expected to happen. **Screenshots** If applicable, add screenshots to help explain your problem. **Computation Environment** - OS: [e.g. macOS High Sierra] - QIIME 2 Release [e.g. 2018.6] **Questions** 1. An enumerated list with any questions about the problem here. 2. If not applicable, please delete this section. **Comments** 1. An enumerated list with any other context or comments about the problem here. 2. If not applicable, please delete this section. **References** 1. An enumerated list of links to relevant references, including forum posts, stack overflow, etc. 2. If not applicable, please delete this section. q2-alignment-2021.8.0/.github/ISSUE_TEMPLATE/4-make-better.md000066400000000000000000000015321411645176200226600ustar00rootroot00000000000000--- name: I am a developer and I have an idea for an improvement... about: I am a developer and I have an idea for an improvement to existing functionality --- **Improvement Description** A clear and concise description of what the improvement is. **Current Behavior** Please provide a brief description of the current behavior. **Proposed Behavior** Please provide a brief description of the proposed behavior. **Questions** 1. An enumerated list of questions related to the proposal. 2. If not applicable, please delete this section. **Comments** 1. An enumerated list of comments related to the proposal that don't fit anywhere else. 2. If not applicable, please delete this section. **References** 1. An enumerated list of links to relevant references, including forum posts, stack overflow, etc. 2. If not applicable, please delete this section. q2-alignment-2021.8.0/.github/ISSUE_TEMPLATE/5-make-new.md000066400000000000000000000015131411645176200221640ustar00rootroot00000000000000--- name: I am a developer and I have an idea for a new feature... about: I am a developer and I have an idea for new functionality --- **Addition Description** A clear and concise description of what the addition is. **Current Behavior** Please provide a brief description of the current behavior, if applicable. **Proposed Behavior** Please provide a brief description of the proposed behavior. **Questions** 1. An enumerated list of questions related to the proposal. 2. If not applicable, please delete this section. **Comments** 1. An enumerated list of comments related to the proposal that don't fit anywhere else. 2. If not applicable, please delete this section. **References** 1. An enumerated list of links to relevant references, including forum posts, stack overflow, etc. 2. If not applicable, please delete this section. q2-alignment-2021.8.0/.github/ISSUE_TEMPLATE/6-where-to-go.md000066400000000000000000000100111411645176200226070ustar00rootroot00000000000000--- name: I don't know where to file my issue... about: I am a developer and I don't know which repo to file this in --- The repos within the QIIME 2 GitHub Organization are listed below, with a brief description about the repo. Sorted alphabetically by repo name. - The CI automation engine that builds and distributes QIIME 2 https://github.com/qiime2/busywork/issues - A Concourse resource for working with conda https://github.com/qiime2/conda-channel-resource/issues - Web app for vanity URLs for QIIME 2 data assets https://github.com/qiime2/data.qiime2.org/issues - The Developer Documentation https://github.com/qiime2/dev-docs/issues - A discourse plugin for handling queued/unqueued topics https://github.com/qiime2/discourse-unhandled-tagger/issues - The User Documentation https://github.com/qiime2/docs/issues - Rendered QIIME 2 environment files for conda https://github.com/qiime2/environment-files/issues - Google Sheets Add-On for validating tabular data https://github.com/qiime2/Keemei/issues - A docker image for linux-based busywork workers https://github.com/qiime2/linux-worker-docker/issues - Official project logos https://github.com/qiime2/logos/issues - The q2-alignment plugin https://github.com/qiime2/q2-alignment/issues - The q2-composition plugin https://github.com/qiime2/q2-composition/issues - The q2-cutadapt plugin https://github.com/qiime2/q2-cutadapt/issues - The q2-dada2 plugin https://github.com/qiime2/q2-dada2/issues - The q2-deblur plugin https://github.com/qiime2/q2-deblur/issues - The q2-demux plugin https://github.com/qiime2/q2-demux/issues - The q2-diversity plugin https://github.com/qiime2/q2-diversity/issues - The q2-diversity-lib plugin https://github.com/qiime2/q2-diversity-lib/issues - The q2-emperor plugin https://github.com/qiime2/q2-emperor/issues - The q2-feature-classifier plugin https://github.com/qiime2/q2-feature-classifier/issues - The q2-feature-table plugin https://github.com/qiime2/q2-feature-table/issues - The q2-fragment-insertion plugin https://github.com/qiime2/q2-fragment-insertion/issues - The q2-gneiss plugin https://github.com/qiime2/q2-gneiss/issues - The q2-longitudinal plugin https://github.com/qiime2/q2-longitudinal/issues - The q2-metadata plugin https://github.com/qiime2/q2-metadata/issues - The q2-phylogeny plugin https://github.com/qiime2/q2-phylogeny/issues - The q2-quality-control plugin https://github.com/qiime2/q2-quality-control/issues - The q2-quality-filter plugin https://github.com/qiime2/q2-quality-filter/issues - The q2-sample-classifier plugin https://github.com/qiime2/q2-sample-classifier/issues - The q2-shogun plugin https://github.com/qiime2/q2-shogun/issues - The q2-taxa plugin https://github.com/qiime2/q2-taxa/issues - The q2-types plugin https://github.com/qiime2/q2-types/issues - The q2-vsearch plugin https://github.com/qiime2/q2-vsearch/issues - The CLI interface https://github.com/qiime2/q2cli/issues - The prototype CWL interface https://github.com/qiime2/q2cwl/issues - The prototype Galaxy interface https://github.com/qiime2/q2galaxy/issues - An internal tool for ensuring header text and copyrights are present https://github.com/qiime2/q2lint/issues - The prototype GUI interface https://github.com/qiime2/q2studio/issues - A base template for use in official QIIME 2 plugins https://github.com/qiime2/q2templates/issues - The read-only web interface at view.qiime2.org https://github.com/qiime2/q2view/issues - The QIIME 2 homepage at qiime2.org https://github.com/qiime2/qiime2.github.io/issues - The QIIME 2 framework https://github.com/qiime2/qiime2/issues - Centralized templates for repo assets https://github.com/qiime2/template-repo/issues - Scripts for building QIIME 2 VMs https://github.com/qiime2/vm-playbooks/issues - Scripts for building QIIME 2 workshop clusters https://github.com/qiime2/workshop-playbooks/issues - The web app that runs workshops.qiime2.org https://github.com/qiime2/workshops.qiime2.org/issues q2-alignment-2021.8.0/.github/SUPPORT.md000066400000000000000000000122421411645176200173100ustar00rootroot00000000000000# QIIME 2 Users Check out the [User Docs](https://docs.qiime2.org) - there are many tutorials, walkthroughs, and guides available. If you still need help, please visit us at the [QIIME 2 Forum](https://forum.qiime2.org/c/user-support). # QIIME 2 Developers Check out the [Developer Docs](https://dev.qiime2.org) - there are many tutorials, walkthroughs, and guides available. If you still need help, please visit us at the [QIIME 2 Forum](https://forum.qiime2.org/c/dev-discussion). # General Bug/Issue Triage Discussion ![rubric](./rubric.png?raw=true) # Projects/Repositories in the QIIME 2 GitHub Organization Sorted alphabetically by repo name. - [busywork](https://github.com/qiime2/busywork/issues) | The CI automation engine that builds and distributes QIIME 2 - [conda-channel-resource](https://github.com/qiime2/conda-channel-resource/issues) | A Concourse resource for working with conda - [data.qiime2.org](https://github.com/qiime2/data.qiime2.org/issues) | Web app for vanity URLs for QIIME 2 data assets - [dev-docs](https://github.com/qiime2/dev-docs/issues) | The Developer Documentation - [discourse-unhandled-tagger](https://github.com/qiime2/discourse-unhandled-tagger/issues) | A discourse plugin for handling queued/unqueued topics - [docs](https://github.com/qiime2/docs/issues) | The User Documentation - [environment-files](https://github.com/qiime2/environment-files/issues) | Rendered QIIME 2 environment files for conda - [Keemei](https://github.com/qiime2/Keemei/issues) | Google Sheets Add-On for validating tabular data - [linux-worker-docker](https://github.com/qiime2/linux-worker-docker/issues) | A docker image for linux-based busywork workers - [logos](https://github.com/qiime2/logos/issues) | Official project logos - [q2-alignment](https://github.com/qiime2/q2-alignment/issues) | The q2-alignment plugin - [q2-composition](https://github.com/qiime2/q2-composition/issues) | The q2-composition plugin - [q2-cutadapt](https://github.com/qiime2/q2-cutadapt/issues) | The q2-cutadapt plugin - [q2-dada2](https://github.com/qiime2/q2-dada2/issues) | The q2-dada2 plugin - [q2-deblur](https://github.com/qiime2/q2-deblur/issues) | The q2-deblur plugin - [q2-demux](https://github.com/qiime2/q2-demux/issues) | The q2-demux plugin - [q2-diversity](https://github.com/qiime2/q2-diversity/issues) | The q2-diversity plugin - [q2-diversity-lib](https://github.com/qiime2/q2-diversity-lib/issues) | The q2-diversity-lib plugin - [q2-emperor](https://github.com/qiime2/q2-emperor/issues) | The q2-emperor plugin - [q2-feature-classifier](https://github.com/qiime2/q2-feature-classifier/issues) | The q2-feature-classifier plugin - [q2-feature-table](https://github.com/qiime2/q2-feature-table/issues) | The q2-feature-table plugin - [q2-fragment-insertion](https://github.com/qiime2/q2-fragment-insertion/issues) | The q2-fragment-insertion plugin - [q2-gneiss](https://github.com/qiime2/q2-gneiss/issues) | The q2-gneiss plugin - [q2-longitudinal](https://github.com/qiime2/q2-longitudinal/issues) | The q2-longitudinal plugin - [q2-metadata](https://github.com/qiime2/q2-metadata/issues) | The q2-metadata plugin - [q2-phylogeny](https://github.com/qiime2/q2-phylogeny/issues) | The q2-phylogeny plugin - [q2-quality-control](https://github.com/qiime2/q2-quality-control/issues) | The q2-quality-control plugin - [q2-quality-filter](https://github.com/qiime2/q2-quality-filter/issues) | The q2-quality-filter plugin - [q2-sample-classifier](https://github.com/qiime2/q2-sample-classifier/issues) | The q2-sample-classifier plugin - [q2-shogun](https://github.com/qiime2/q2-shogun/issues) | The q2-shogun plugin - [q2-taxa](https://github.com/qiime2/q2-taxa/issues) | The q2-taxa plugin - [q2-types](https://github.com/qiime2/q2-types/issues) | The q2-types plugin - [q2-vsearch](https://github.com/qiime2/q2-vsearch/issues) | The q2-vsearch plugin - [q2cli](https://github.com/qiime2/q2cli/issues) | The CLI interface - [q2cwl](https://github.com/qiime2/q2cwl/issues) | The prototype CWL interface - [q2galaxy](https://github.com/qiime2/q2galaxy/issues) | The prototype Galaxy interface - [q2lint](https://github.com/qiime2/q2lint/issues) | An internal tool for ensuring header text and copyrights are present - [q2studio](https://github.com/qiime2/q2studio/issues) | The prototype GUI interface - [q2templates](https://github.com/qiime2/q2templates/issues) | A base template for use in official QIIME 2 plugins - [q2view](https://github.com/qiime2/q2view/issues) | The read-only web interface at view.qiime2.org - [qiime2.github.io](https://github.com/qiime2/qiime2.github.io/issues) | The QIIME 2 homepage at qiime2.org - [qiime2](https://github.com/qiime2/qiime2/issues) | The QIIME 2 framework - [template-repo](https://github.com/qiime2/template-repo/issues) | Centralized templates for repo assets - [vm-playbooks](https://github.com/qiime2/vm-playbooks/issues) | Scripts for building QIIME 2 VMs - [workshop-playbooks](https://github.com/qiime2/workshop-playbooks/issues) | Scripts for building QIIME 2 workshop clusters - [workshops.qiime2.org](https://github.com/qiime2/workshops.qiime2.org/issues) | The web app that runs workshops.qiime2.org q2-alignment-2021.8.0/.github/pull_request_template.md000066400000000000000000000006121411645176200225510ustar00rootroot00000000000000Brief summary of the Pull Request, including any issues it may fix using the GitHub closing syntax: https://help.github.com/articles/closing-issues-using-keywords/ Also, include any co-authors or contributors using the GitHub coauthor tag: https://help.github.com/articles/creating-a-commit-with-multiple-authors/ --- Include any questions for reviewers, screenshots, sample outputs, etc. q2-alignment-2021.8.0/.github/rubric.png000066400000000000000000007014131411645176200176130ustar00rootroot00000000000000PNG  IHDR,4\sBIT|d pHYs.#.#x?vtEXtSoftwarewww.inkscape.org< IDATxw|g3AޫEEQvgmKhQRD.#g$ G)9IIr~vkxr\7ޯ\b0 R1NE/zQ@G E/z'w:~9 .VhhD?^Kg7o78s7HG^{5]~]v ӧOլYD ^-ZٳgW_TB iٲeںufR)//_lRl߾ݤIs8#8ѣGرcٰakQ ___۷Of (p&I8p@sIO5ydXTRZ~ҦMk7oZpDO<1ӧO(8!?0c2dȠs,fݺu_6 8 2?sI @C ޽{uСfIZj& ilϟ߬EILR^DԬYq]]]`I&Ѿ6vUV5o\TD$&~<н{%6p^DGGk֭˓'O/Sڵkhh#^QF &:t\]/TՕ={ve˖M/[l8cǎ%.aÆI ᅲWڴi#F)+)<<\&MҡC8$^dN>mR7n$Y*Toh?^@\UTщ'4tP.]Z3gͫ-[jӦMZf0=ŋMw!;֭ۗ`^q 7|iĚ3gNrN/p6mq$=iӦD Klc׮]K4(z1P ><Ȟ=j֬`gϞ%Y|֋رc; IMMd4k,$ zSLÇ; Id̘Ѭ#GԈ#e\~)z)׉''$w(z6{_uѣ6ͥ\rʔ)SIQh`7ne˖zyr8bŊY4\:t蠀UN/ N%ɝJ,iXQVR 4l0ruw*g͚k׮m+][-Zӧ;8\ !OddgϮGd|k׮ڵ-j9<{Q۶mu=O,XP+VN4ӧOu1*((Haaazː! (E\rJ>}2g`>}ZgΜӧ+W`0_q\\\%K+WN5kT9$ϘԩS:}N:]qSM0A3fPtt(z{xCpBmڴy`0hڿ6mhTMݻw~zmذAғ'OL%Jyj۶*Tę:K.i͚5ڼy;(ƹB jٲڵkB %q҃b[Ew/FGFFjŚ]t<$???EEEI8>vzRѢEuʕ$Uzu |ڷooҽfS5jO?5ڶdXª6m'o׮]2ev!k_?aÆ=zj׮m\֋}I' @;vɓ'M#Oҷ~kl9z:viӦiѢE*W\#""gIh@s(^x큁:tlbUѶm۴m65o\S\̚/oݺufIү_O>5y̍7ԡCi[bV\_:tf͚e.]d$I|'Ol; Kwv=zƍ?~ϯݻ믿Klٲ7oM ^v1UZU~m̟,[L˗iU7oVٲegƭ^Z~~~6/xܹS-Z0~;w֭[Z˗/5-Q'EӮq#""d/_^=z͛7,֊+;tD[ʕf]|Yyn*___b={L}_|amک`ѣյkW=~8...j֬vء7n(22RW^UlYݻwO5?l-v%kNϞ=x_ՆY'{R7'ojΜ9ѣcך5k4zh3Ʀw~-\P}1.q,W\ʕ+5j%KW^&7ne˦}iҘ1c#Gɓ13G*TP`N:PhhN:G***ʤ8UVUժUU^8m CK.Uv^z/_>uI۷ט1c4mڴD犈PvcլYӤչsgX5ٳgmV ,ŋSddU󹹹QF*U1c(,,L>ԑ#Gt9֑iӪv*VMs1X{, ՛0a&N9TREWV맟~RVL*R :T|MK}G&O&L~I/_N:%`0M6Z~IsΝ['OTk׮ԩSڸq:dϟ_|>C3fnܸϟ'8WZo߾ߵh"]~\,Y]&`0رcF>cmݺլ 2) *\Kn߾QF~0+͛7Ox͛75x߿&M$oooQHFi3gNmٲE+Vx /_^>LouIK.ѾϞ=Sum(UN8!wY~ʖ-4ᅰ-[V'N0{ܫݻ9rmsuuՎ;۷QF&iժɅ/dɒ&رمM6K.hLƌg2eѣչs؝D HtTsxչsg?WZJH.]|rLlx.]TىbJKX6mژK@@/^hyjȐ!&oݳhܫ*, 6,ނ׃ԭ[7 ^4j(s*VTbr+Wȑ#&-Zhҥfy!,,쥂Wٵ~7L+O< {zzjŊ*UE:ɓ't5egbΓ1cd%  ֐!C}xﻱQFrcWX=c^UNO6ͤЀ>}z9v- qx^^^ 矛DZYyy v*lRժU3{ܿjFRIt)=<<4vXs4iEc9~Fڷoϑ /W/{6m(**1ϟ?7-IPʫxfpݛhٳ[nf-o6m2|ʚ5Ѷ˗/kܹ&LjoXBׯ_o1͛77{̿ 2DF֭X///w6k,~&SM74{ܬYnU g}j^`['%@dɢ ?P͚5%Çk&_j]frs{!wfaÆYtҥKM>јH\2sOOO?qӧOWddqyGFFj֭fDZ3w߿uY9r䈷=W\:zƌ*Upz7ճgO=zTY Zn%K=nڴi={y޻woI QuujnGh ѣG͚;gΜfcUvwĈf/IgVLLEc|_~{}c,aB.]#G}'Oj…*S,͑ZtY``֭[gQUVɓ'/=K>:vh| PbŊZ~4qD(Q"c.[,>7n4{^KW6{LttM[Z5ըQ_wEڵ+u&xwRJ/]dq\YfUjK:t`1-wy֮];eɒŢ@ҡ0[5n8;wN>e˖-Ib>}Z.\Hρ̞7$$侏?̙3GYw9Ң(`0y>dȐ%} :Tk׮5;γgt]YAVe5zh;vL~~~f9y݃m@D `*Uh֬Yy6mڤVZæ1lH޽{+cƌʚ5kx{{+s2d={fQ?6ofTxqcڵK&ҥKokv<<<4j(|_xxVXy>}̎ 샢fͪ:wFiAAA]ry ҥrav˗| <˔)zหW*Zhrz^{qv8EoOOOu>(zYlYY'!%JД)SѣG9֤g3f4hvOj…;}{v,Y$8?oKy{{%hWh?cGnݚ`Mj]t)ޝ@I;K,<./WWW 4(-=~pڴi]Ec͕?~ġf_њ:u͛og- ۢ<}P't>K5jΝ;o|_Bw4Yzz-Cյk_sm޼YZ2-_>>۷Oϟ~}%޽;N>}X^DrUw1 ()+V̤~E`NME#F=&""],>ԏ?_>}ڽU@sRiԨQfwzuX" `0ԧH"]MrI8$XQ$)yxx\rȑCٳg7;v@@@GJѼys/^q͋?ĹW]7k7x<9>%gΜ޽LEFFjɒ%qk yQ'ц/㏊C6x"""WNx\\\TJcĉfK6l_ 6H2~a˖-޹UP!̙\8p3fҦMk֘gj˖-駟tΝҦM]2E(z0eWӭ[n:;d;w9JU V%c`ھ}Ec}zMڵ|||7sLi5h rUcu%… ?~!e3(o|SNfꫯwyޢE ȑ;Nä#ƍ_tСDt)Ѽ}YƦŒuQƍS*UtY驁=?,I:y*U}ltګ;ِ!C,Sox IDAT̙?ƍho^ϟ$O*[n޼ia_~~~5c խ[Ws-ZTڵ3{ܫ"E^z쏢8tҙO>QPPPrƍDRرwNYr$M8Ѥ3{l}W/=ԛoi/[nVkYTx!cƌyYӧOe+W.Oy瞽kƍ/=H>HֽիIc@A IBCCѣGIxӧOO>Znŋ>Sg}f~ &˪_5l0_OV>}z͞=[7o8gԮ];-^8N۔)S,*R<~آ<ý{C㚲KU&LPDDDי3gV…͎oJR˖--&M}Q''O?~\M4I̙3-O>QM]|EL4ɢbbb4h E2eʨ哐bŊyO6guyѣg0ԵkW8q챏?{ァiرj֬i,޽{q}9sqձ-AD]6qM6+s?;6m9sZ/^DrmVztMhʔ)EذaC97n?աCM4)ν>|ԩٳgiK.VXaSXټЮ];UL=|P5kԆ Lk׮]q (`)-.&&&G5cҤIo~z#o޼f9poΝ;3k˗Wƍ-ۧO싢8K^\\r5k?nqgϪaÆC_ʕ+-1|+Vq111?~jժk*,,,N(:tHzoN)SXT 2UUzu2fyKNk֬QƌnZmڴѮ]ӧOm65iDjR```>iҤ-:F޽{jժ._lXI5j(G4Gdd>3M>ݢϟ?׻ᆱ 6\}Uƍ4 jٲ[]rEu6lؠ GqܹTbQƌ71 R l:-R^,?~ 8P)h[nСCocǎD_,YRwz'R``jժ[nY< .ܹsMWPPP=6L_qMqFjʬ15jЁl4ib=W*^rȡhݿ_/^LpNWWW-]T:u2)u9׆ lr|g,YԨQ#UREEU TLeϞݢBBBt1ݹsGGѺut59Sҥ?~e͚U+V4il g<)R;̙3t!SjĈ6E/p"ǎ3wb˧ҥK+_|򒋋BBB#ԩSq5lP+WT֬Ym_@@{=]r&{Zh#&&F%KŋMfi&Iٲe!\\\4sL}&?~&MYϢEԣGƮ]Vm۶qF*Tn'O[oeՎhǎ*W޳g֭kRߌ3ڵk=OR&MGɽ^z_~w5>I>>3 6LnnnVBR}ڽ{5EǏg}f.Ç&ϗ/Zld4iDP۶mu…$#IZxڷoqe/.B iKj:uFOon(xq8wz+WNuQ5k,rI&wﮀ9Ҧrȡ]vi5kV^Z ^/tU>>>&8pݓw_˖-'NhĈJ6m(VG+ >\SLnnn۷>dƏhWWW <8II8ƍy/_>-YDGUʕ%S0ڼynݪ5j,~|4~x]pA/Vm61...8p._qY|ϒy{'ّԀ>}zԩSuyS6?שSTR% ˌ9RwVٲe-.]:mV-[6go4n8ɋo iq8ǏB 9pĈرc;sN::qݻgRӫ|]5kʕ+5~ٳgڸq6oެ;vfԭ[7KEM,Mw=(P@ӧ,X`Ǭ'$$D?l٢={$1%JP޽եKw>秥K/5!W\Y4h6m$6mJϝ;w~vE/p2A&LPcwuYƍp߿P`0(}ʘ1ͫH"I~bbbt=zT/^իWu-EEE)44Tʚ5gϮrʩjժz7hgѣw^˗OSb=_|ʙ3gr(IzN>G*((Hׯ_۷0e͚UYfUΜ9UR%UZU JaWҥKzٳ+w)⿣`Pٲeuԩ8mK_e#JmQSXhzw}g9H]R֯IСCq̙S;vLlQû{VX~(OOdE/8s*""gL[`G111u넇kĉX ,jժiƌ<5jҧO;rOĉuM͝;W>bbbԬY3>r~wkq|׺sKϊ-$y~\ j]矪Y"##վ}{-[LiҤIRu֩M6F۲e˦k׮tGŋUB>sqqy$N`>T)IZj5jR1ۼysm_c U6m|ݻw`SPPKvڥƍÇɔUsۗ/_.XÆ uɗ .)S$Y~ p!@[dwo{ ce˖͎YNJҙ3gmwqqQJt%dɒI&HP``*TG%د\rڹsgnRիСCfK6~Wխ[7 )$(u1т$8qB׽{Y[o=&C ڰa/E/$2~x$WWWm۶rww7ɓzwt{ 8P&/^8{/ )E/$pYM2ETL:tH۶mիyx 7OVݺuum{j+VLVR,YQFѣ*Wɉ;,mذ!NfjѢ"""-^vޭܹs#TΝ;Z|ۧ =}T3fT…UNuA>>>ɝ&#^I(*** nݪVZٳgFK,ݻw+gΜI"C`6lM6)]tF/\u͛v u(|X@ аaCmܸ(z,D `^) / Cr')**Jо}}/Yvޭ9s1K@25k,]zլA }xŋkʝ; 3H](z$VZ:w$)cƌݻ7nB Ç:~֭[;v(&&&޹E/dzi޽jժiʕ+ǏרQk׮xkr'؂W͚5{x ^T|yܹSӧOWڴi9w֭۷o'I);,88X ֣GSN)O<&?ԤIݿh;;3b-\P=$kά$UREW 8#^vq,dɒڻwrmEڵkP0;v,kk ,Xmۦ,Ym?wUݻwi;6l`ql=p&VdddVojUDDD7n^zzw+>|X+W*U1 E/; ygϪVZVYvm-_\ڵSLLLv۷k/=WkUl ՝],պuk >>>>Zl\]y=#77޶m}R{Fe5?QƌU\=}T]tQTT󻹹r2 Zn*VV`ACO8v֩S8:~d4iHO>Qn:e͚&1R^v֡Cyh"9RFqEIO?TAAA/p4,gΜٳѶiӦGu{n={V={9rh>`lSjf͚Zzrm>T*Uty)88XYdU);&NoTB-]T111SmVϟ$կ_p*ŋu]zUTP!URE 0kݻkɒ% TF-[*M4qڏ?={T^=rH(z`0hݺu:u8...jԨ&LU4j޽}TfM.]ZO߿_~ӦMYo P0{Ծ}{ouww_A4whhZn]vY^uRHDppj׮mRK4x` 6Lmۦݻ[g2e}v ^)QH@dd7ogϚ=v&ҤIŋk̙ʐ!ٱZh!˗]t)S8z5ydy.]:Ϙ1—$ 4H޽I1J(~I7nTLL83G^8+QR?XK/ܩ@&L5iҤدկ_?_zbbbt1} 2U@-^XoҥKզM+WN^^^ʕ+*W~~S@@6mj 8G^8+˸L0a&N(I{%sVWCՌ3$sڵkU~}}o߾^z%rjȐ!o$W0 ϮKvz'cFQ6mZmڴ)ނ$̙S?&NoQ_l+:d/'C ڲeԩ|II>l٢u&cVwJ>#ծ];1...7n;C /gX8+QRǿto /)y.\[ 7rHٳ{ _@2s a ^@ @ @j/d>s[ `PLL$z3۹sg _@2r ca^@27n\/B @/dΜ9oF4| 0@E$eΜy--|EGGkŊ86yXXl=ٸq_~eʽ1`OB`0h/ϟϟ+M4 jΝ;Kw83fPttO.777]rE|l٢;w*>lyXXlz Y|G/cΐ!nݪ~;?[2M/^TB|x _THɓGRddҤIիWe˖VWUҠ$W ^3gUjd r2*Yܹ`>}hVK/|^pWI;; p2ǏO%I}~7%vǗD 3WUb`GcǎɓcΒ%~W ^Rgx!sQUR%vוeUX1c/^X={`>gX8֫N/N(xH-̠A7xCTHHN8%J=5lP׮]:v=TJQ,ԏ>(zI`0hСq ^i %r2WztAUVMTT)޽[%K4:&((HuֵI+[lN 03WR7+xC   6L3f̈}o@rs2A...qߺuKΝ;gt\"E{n˗ϢoV3 ^q:^;$b/1V\riϞ=*U@ժUK1cbbԷo_ ^u^;$5sgT_Rھ}|}})x`Z^%vz6_kǎ8B&22R-[ԡC,#W\+00;6l/`&G^8֫N/  Yf>[o%cfׯ,X 2h֭z-Ν;W(P@{Q- ~^pWɋ^P8 I&i'OiӦVz״sxw|]rE7+::ZsUxxgz(z6`04x8;vP8 Q&Lx٣Gk\ݻjѢ֭[w8zq^ oXEkٱ^*W@\B_WDD̙3_Uj,q-;:wlٲ}z֬YO*M4+*X_\|YժUݻwg;`>G_8֫`!AiΜ9(xHLppW .HgG`Ǐǎ/` G_8֫; Wڹs'/)yZj .H"ڼy>|7naÆF򎯂 m+*e`0>x;wRJɘ /dÕ9sfըQC5k&Iʔ)6mڔ䅯>s ^aXR.75wgڱc/)31 TڴiEDDEھ}ѱ80} D 3WR7֫^(xHM테т$KN?4ibѣGjРgQSNQlԋ* GHx!Wڴivx:|䉚6mjQ111;v$ ^%XW0 8p͛EbŊɘ ϫB p IDAT @jzz HC @/d?A)$$ĪyҥKM6ŻѣG5yW%?k͚538z^.a04`͟??vڥ2e$cf#1 ֭-[J*iǎjNKw|iܹܹreUr caJ}A @j/d&Me˖I9w}n;c8p@+WѣhrWUN/&BfժUС^}}a_͛7׎;MV5kThh;&IU\9b+*KLLz%K> r2V:uS˗Ν;-[6ܺuK VDDI/^ݻ[p6^pW_LLzR+GHB&((HM4%IǏGʕK:t0o~(xfr `J(z_kҥ(xHLhh4iwJjԩS}z-M>ݪ8q `r *x.]:3LLLڴi3gΨxڲe"##u1-Z[jwTTb b-֨K"1D{KJWc^(*-5(bIٝ.lly>9-3lg&puu)S&[VhQر...zAdk^` Ȧ) ^Dd1laB#F@׮];j֬cǎ-rvv\rXr|988`ӦM(S^m"[WDdXB Bf~zi/"2Wyɓ'hѢݻvz OOOۮS.^B ˗زe ɓ'cҤIf^`> &i =UȈㄌ*c_B)R^wޅ/d;c""Kze!BA^ŋgEDf2ٕ*U*ץ۴i8 ǫWKWPXR^Y/^DDDDdS2?SVxq9rNhMպuk|RfΜ)ܢE 9HdSXR^Y7^DDDDd3x%Lr Ο?-Zٳg9`H,8eÇzDy^DDDDd  6H24RJ(;kQ(p9($$$ ##e˖76mSm_ؾ};jժ]3gbƌȜi߾=߯#1^Iݻw{F+<<ڵBÇQHIdnXlC/""""z ȒXݻw-[HҤzLj#k۹_...ѿ,X׮] pIB ҥK(Sn/FYs2%KoŜ9s0i$x~}͛g`EDDDDVYkIKKԩSpBtfϞ.cs r㣏>\"[dT_#%%|e .xxx9c-Y-B?Yky5ksx@TT={")))cK*'NF:쌍72"Ғ+SIMMxɓ1k,Y9<:tׯ_Fl^DDDDd27JJ(#G0""c2hܸ1nݺ]6??? 22ك\۫]6qqqq֭?kΝ;ѦM^zeJǏǂ 9s&LbpϟG6m >D% nR^&^DDDDdu4^GEʕpdDDYLFFڷoÇsرcao}љ]xYVR'N@…sԩ;w.Jcjժ 6jժڿ0"fʔ?VZiK׻|XbmY+ЋBi&i/"2WH=[W#G 888 ڵkɓ'# @cعs'n݊'*jsD"KzEY1"""""P(,Ld\\\qF#>Rݻwzejl|խ[zRK?QYte^\̍-M-[W6mxUɓ1k,sqq6*V,c$2'WC/""""8۷D'/"2W6! sIKw .>^2G}5k4^5u*3lc$2W C/""""( Ȓ̛7o_|)XU ))I>l-+seR 6u|DyrЋ,Fzz:2ZlY^DdluBt*̙ :t(TEFF>-ze2eԫW~)f̘-[HHH{|J3gDttmr~X"""""3}bҶ'GFD-OȔ+W'N_räIdi  P+Mdl^;P(?3/2 +ҖB 4IKKC>}_Ix 999aƌ8qʱQQQ(S Jv777=zT{\t kݻIdk^Y 6h Kɾ|+WQ`h(ezE=li ;̎NǣYf*>&MU{yyI&INNF6mj#}Gdk^Y3lڴI㒃'OƬYo޼'O2777ٳ銡?GFD5OȌ5 nҸĉ}ʶoF ԩ6l`И""";udP[Dƚ땵ӧ֬YNիW/.]=>cxyy4www۷Z2"m^>xO/""""2;iiiݻ7#mFXX/"2;|||b ѪU+$$$}ؿn/FBd?q8::GڵkmذAc Ϟ=CuٳgѰaC ȴXPҋBZZzꅽ{Jۼq1+W.FDN!`gg'=OHH~^l5j @ضm5j|u~g}FDDuԩL뫌!s\6lÑ???lڴWKd^Y[nr労mٳ'6lWWW@WFt OɁWzQcEDZ'dJ%tI&q@3xA0Jv{,X@˔)mۢt(Rw^\v PdIbŊ:XkѨ[.?~vnݺ\튯9s`ҤIZ+>>-Zݻwxɰ^\zQRx+Waaa XҥK1bxxxhܸ1mۆ}ʲի1|p{f͚ؽ{7} ҂5+k7xÇZU˗s5j9Db2o7֮]gHHH@ٲeQ^= 4ڵQЋLZZz`i/"2W!_ܿh߾=;whDEʕq-Z.XQZ5uۗL撆퓶1""se2BtAkĉhڴGFDze 6m!C`С? "##agg'{_x)^}b۶ms{{{m 63]իW1Oz%"""",-LȬ^Z x 6 ϟG|82뒒!D/#җ-+Kh"ٳCJ˕+g x{/9_ ȔXۥK}vy5aT^]帤$,YfBRRRvѱc< t[H)))ԩJ̒-L( ̜9P^=^QlYݼyǏ70رcѪUM/[W޽{6m@T/ĪUPreٳgF?} ȔXߒ%K{ 6mNxok? .vj ;f! ȨRRRХK>|XږxyyyȈ 3g`޽9s&D 0vxôhCΝ!@jpAGzehٲ%?+VƍqIDGGh@Uw^dJWOE˗(]4.^"Ez^bb"zPbC^DDDDd4 ȒpB ׫ ;v4,Ǔ'OPfM|RP^YKbĈjի1x`|򈈈L|) 888=zooou0`IKKC߾}{nM|qyC""""2d^Dd18!t?w) |L<2ˠT*g^-ZΝ;y42W!""?JvI1Riܺu <L|=|e˖=../_>[m6tM~S/uЋd.X"/"2KQk׮Mׯ_m۶ٖ"`ܹ Sh޼9]fQ5` JC AbbV_x֭3XRSS1h !xI^QF!** ;wFHH<<<>˧s{NNN_ B>5aEDDDD 9"mX"='dryŗ+)) ;vdſӧxGիY+o|Ep^dRWm޽سg͛7޽;n޼ ͛7zoumTV 6mһxO/""""Mrr2:wGJxℌrǗ;ۇ?#3/[,XBz<2tWnݺpv튱cǢ\ry&~/e˖8x d/3"`2oɨZ*>|C\\>}ŋGzz:=̙za߾}ߐUŋ@^DDDD$ MWXXJ,##"Κ'dӱc8q(VڵkΝ;\M&BbÆ jϟ!!!hܸT1ժUѣ 0'CK.Etts .CN:*YkWӧ_|]ٳgcԩ6l/_n!Gؼy_l%Ɲ;wвeKDEE_@:t 40Xk"U ^Y-[O>ԯ_͛7j*( 7nA}yu͛7UkbEDZ'dbbbЬY3/ B޽WXv-s<ܖG۶mqỶ+nXh}B|7M<*"^t IDATY+&O3g`ԨQXlv'''lٲCR4oWWWtIe1zΒ^#kIMMEqm@ձg %%h۶cpfhB~^1Xk"F ݗ|ZJJRUDzeY.]={`ٰw ۶m|YFƍ,7$""""d^ǎe^%JȻV?={ETT--Z`(]t^Hv7 'OָsرcKe˖ԡze*AAAׯ,QN}ڷo/;Q_:u¦M?~iìފDrbr/uk$''v/HDDDD6%)) ;vT j֬HW~p<ӦMS{M9D"„̉'hӦ|+h ݋^z!--M6.]K~~~ h۶-Μ9c⑑1B2w v͛KW˖-~z>}ºu0x`xzzVpp04i'Oh1c`aEzeN9m4QdIqѤI:yHLLB$ڵk% 3xbѧOQn]QH1gϞa l^[% 3,ׯ/vZǦUV2ea͚5EBB6l4}pttosZѣG (O^O|A___[շo_# 1g)J*#4cEDDDDdle3gtؿt% dpTzEʕ1tP}_3fDNٍ7_{Z2MW… z}aoo/ &|-}HcZ!xQ`2_GŊ3Y:tqqqZ[bŊ"**ȿzx|hU/ &J,)֭[p'd&NvB BTf;~RPls V*Ν+>Si[۶mMRΝ;wT&|}}ʕ+T~A*Tze ^w;v^~WϞ=u8>gggq֭\9y$/WkYzojԨ!F!ƌ#>QV-é*UkկW^^B0"""",^111y=4Rpp}gy=" cǎihx IIIK?6=z$˧$… 2NrrZ;OT{׫WĸqT`el^|nݺ&b ,UO< ѣAc}h۶ƿ~x~rr]6/29+u.ŋ`ݾ}[L4Ixxxdɒ޽{Z[eB؃@||<>cKjժÇpy82둔+WbܹqQ ~0JD`ʔ)={ hٲeJ>7n͛7k֬4hm{QHm6l@TT\\\W_iL29rVc+V ձ?3f={ƍ/_>,XÇ8mΝ3ʘI^LׯQZ5߸w_ܹsuԑźut#88B@R o>L۷#::Z۷oŋ`h i|EGGk׮HJJBҥqitQ~~~3g߿ѣGAcO>\Э[7̟?_+",, %KS^nDDDDxݺuK$e'Xzu'2y s!~(^(QEDD___wPD qΝlU^]]tɵgϞ GG ȫ )\\\J{hdzY&@bB>o߾SNjUT~ʕ:ѣG2nR)zowʕ9?ɰ^Ç /^ܰ0Qt?uMJ(Sʹ*U2+21""""qqqqaÆ (>>^TPA\ZJ־21˜~왬gn4ɫ 5kGGG}vxÇxzjtR5;`?߃+K.W=M2E=3F6D|YN /==]dddhe-[S 4ڵÕ$%%:udСl}ʼݽ{WmƍӫѸq͛7kVr6ٴxkgΜծ]K,00wUoųgd+%%E9##6lLk֬A?6QNjɝ9Ocs j ϟ?'f͚믿ƍ7p1,_v۷/ .m oÓ'O>ɋKctըQ~< iiiZ pٖvssCPP<<7d_6.oooO*۞>}S(G$7+'dooʕ+V|sN|jغuk0""""Ih۶-2 渿XbUzu瑑Xpl@ѢE%11Qֶ 9s* UTGrr2\"=vZ!pYxzzt ˗WhQh|޼yq_|ƍ>۷ԩSqq9.\ƍ 55Us˔)|̙]CUU*^O +åcҤI(\0+ٳg/K.!22Πl2:UN_l@׮]:zٜٳҶЫ H ͚5Syf͚ٶ͜9ϟKDEE.:y9!w/OePQQQBH7lؐMvޞry7n0vuoVXj.\(}O?xصkW3FNdd$V\y*ϯ\y4駟l+Plip ]tO?W^!::SLA׮]e n޼)پt8o-\0s6mڔc? ӪU"V^VT\Y(JYٷo_{-KۙN8idmzY1M׫Wzhg ѫW/#GLprrZ}%"tQNiB)S|~Me'k8{ptt*zիWe闲k߾}߹l_@ӧ UOIIReNʒxϟ!V%DRRRgddڵkkvvvbΜ9zqd' |j8wl}sݵkΩSd5ee\xe}x{{˗~e.+@̝;WsF֭[G ł ֭[O$c2_|)ѣG*V/6x\%KD6m n+1""""" ,BM4qRE+%%Eߋ!;;;Փ- 9A bذaFkDD8w]ׯE``С(Z...aÆok7oVJ*%o#Qxqf9z״ >ʕ+'VXq)fmIm-ZT$$$zR'NzE}cƌ믿eʔWPA<~ؠA+u}QN_X&N}Ϟ=+a0' īWDݺuU>6nܘdZM|)J1}t'2NNNbFzdmBwxTV^ĤIĺuDxx,KӮYFyvlBH"Kooox 9QFiGEEGx$^}wïUV~mVj履~ WWW@|z_I-+T*G}$J*|ĈbŊXg+JѲeK@ԨQhK4C/""""+"ZO| !ĕ+WDÆ uV8{^5*k1$ʜl(Zhڴ2d;wصkyf~oV]t%ۄǏM<ݶm[G.X s .,&N(>| i&i"핸Ν3ůXk2w h]n_^ZܹsN;{ݻ<^/>{dtWmժU*>ׁ}5G?Zy5 e%^DDDDu>|.Oծ];ѽ{weKTcǎ 777m;99͛?4$+k7V^WtA3F͛7?CL4IZNIa^*J.;tO uB ݻwgkwذaZogg'|}}E^D߾}EN >FgT^z%\u֕~"44To^ ty?CB={ژ={ίĉ?9֪UK y V+ ~>?_IMMGΙ2e/l !"EGGuָr労q Apd/_bȑ9s&ʗ/HOOǢE0i$( 7o^fdd͛|2ooo4jzW IDAT"uLٳgK-[7m4̜9S>_~%JFn݊ݻ}kƍptt1bIs׮]Xx1bbb4SN~6RcѢE?bp[?RL%,, ֭òemױpBlܸ:]|yЍ7PF ( *T}4*UO>U{%K z;t+9y6mV{Q\9|r>}y3g4+#2+cǎ\>W|m޼{ 4^戡be>v-M,k|ݹsG*UJ\zU~__dluBF%K޽{ ???0^˺tڵks=^PVZxe:~ GGG1a.?kZׯs]YӣB b9} jѦMƪo={L5uT̚5K>GGGT\Yk֬slѣGz*\˗/̙3x𡴟2޽{ѥK̙31e[j o%J+W;w ""BzгgOAcGPP5j ,,̠ϧ)))(_<>} [n_+VĔ)SЯ_?888H۟={___$%%@xNɈ 4hlق~=z@jj*vڅ@=G{|esv܉K.ݻx9 .bŊN:h߾=6m '''C_yԍlWx5mڔWx7oވRJ\a_K.1u[м,~YTC &ӧ+Whu^NKf>˧['O^28qܽ{VxB.]Z+'22Rl޼Y㣣EZ|C/""""3)~2GIl޼Y+SnWnDRRtR-~ M(uB&...-M>]vr u׳gDɒ%xOzO~7u W.ǐIOZL-keoo/n޼)k .ޣ}b̙p:_UT[lf͒M>|(ǰIG\L)k@GRR(^ *v؄/HWȺXELL쯁W$ʖ-u NiK~ ̔Yf ذa4JŊe2|`E`2^...m͘1C6H>*U '''lxerttϚ)xFY"pR9{+%%E,YDx{{~e>&L zw-[=zQ@s_^z뒟x䉡/f؃΋/ЪU+\vM֬Y3߿^rq_DDŒoݺu zln:888e,dLٳgK-[T{ァoXbZ9sLL2E |'رcG}=z4NhҚ+S B~=..}d﫯jl`` bbb#Fݻ?s_K,AttA%U8pʿ7n1B(PBÆ u!!!UwG}Oܶ-bEDDDdf?VZ6^^tAAAFnݺcx1„ݻwq!̘1CcȐ!:MfiۥKЮ];ڵ+uꏴӠA7nĖ-[x@BB3Gӱze LG/z˗/ҧ;Əx5͛NNN4hnܸ͛7zZ4^"C^=l[p|FxB Ç5_nBV_7oD&Md//5#"""y}͛sIC 7dQ︤!.P(TϚ5Kz֭BT*ŋEƍȑ#ׯ/Qzu:dkE_ӧOӦMS=z4{*&M$J*eВ^*=~xC^iZ땩[0G֭ٳg ;11Q+VLZT*Ş={|՘ 3>Xٳgֈ-[,ix_b߾}"==ٻ(m. ҤXbcbA-F5j~1jbѠhL4jƆX5*"X( /ceβpkKvfΜqq3gիW/7o\~X2^f"!!kԨ˂UVMx=c˘ӧxA(2r;uǏ^ߘݝrQ)Be?<ժUXme2msJ*x13ZJhoɒ%z > ^hj̙3ܹsgE ze^d2/^\e;ʡ)Rxyyq||}D LixVZaJC r!$S FEE̘Sfdd()  ;;:ttB'N "eI$WT9lllhǎԣGJHH ???ɳ.22wP;Rک*{ה9իhVU~46;F7vŋjcܸq³V^Z-ZЁٳԹsgu}ʕW?ze~R)yyy\߹sg4TET'NP2eDE2uPة+--] R~}~32pذa񕝝k׮~M/0|r\\+VL܎?׭[}3f ِ!C4^믿* vssSAw[N}5djLP ׫$˹m۶LD'_~ .ӧ?u痿??^B#F0\=z`T&M2}m^=zeƬIII S\+[pW^LHYծ];NOO7u@sb_r7oŊ㤤$u۷oGFUd:uwޞ;5j`GGG4jRRRH222^{~{ T .ԹΞ9sF! Pv\GAW---gϞͯ_γ.==ׯ_իW+СGDDhݗa1o߾ `+++&"H$uVQPʼ bccgv!B/yBB&E /&"6mGFFSd6lؠw^xBhhK$?B \J<ﱲgiӦj4h/_֪/ׯE ZYYիW>e_̕L&{rƍ ڵkgΜX .8p>|8 yd\D j1c"B/xYa۷o3g"b32׬Y DWd 0 lZCuKxxQ~~~ Sk֭k.Gy۶m,նyMgiZӓZ6M6FPꕥq]~v޼y¶}dz0eh߾x]x?ܹm+99SSS0`/ G,ÇyŊܫW/c___8p XoܸUb_ׯ__lTa y r*% qF^ ĉ`n͛\|y([j֬ϟ?+ ʒEGG44JNNf777&k׮tze9BCCUr|EGG+wy]|Yx+/ '?^ӧ]u1!777̏(D0 r93F޽{MMqx(ɸUVJߣ!CQ͛ӧD;6+;ްaƻk-u;w9sL}JJ^L_Zjyꌳ3CСCLD\t<{Πs,lzQ\\0uVұcG^`ҤI{VlY^x1;w\5J+wڥ8ASeWBd "E0OMѺ}MСC˜m۶֗-[T* ںu+)SFaM2^J: ̬YhFr;w\.71ݻGVNJ'N`ڻw/xB$ /4rH322[ntĉ<233iȐ!`RUXʖ-r}Rn$Hhȑ#JOOOF>r)11Qi^x{{ƍ)22ƏOvvvz*۷/zd_PJJ uЁvMŋga^۠A?T~[HHy{{իiŊԠA:~~Ȑ!deeفԩ@A Wq/ r 8p徒S;#GUxϞ=+Qa+O<7ݻw`ݺu7j(YveFv` 5k0ŋ!x֬Y\hQرcZKSED666gQl߾]!⠠ j>}`@^JNN`.S[P^,Ⴈ޽{1mۦԬ666||WA  3Çr45a@WquѨQH.4a6mɉ^|w_e)wN:ENDDTH}мyݻw:M)SL&ӸD"UVѨQTnFDDdccC;v=zܷ?7nз~KǏsu҅ǎkhf)wrOiԨQvM63.\rи8>}z~([ڴiu=dr:!?~hipЌ^eo>^hX>M2%ߏs6m{yy+7i҄.]ʩޗbbb^,?֯_14bf`"bz d^DĥJ2I&1D"ᐐy)_c5h qu^"ҥ ;88xe4_C Q|effWD fz-+ˑ^n]#:%___zZ@@޽SZF)|UZxS>ʕ+GL};w׸8;w(]?yd RM6tY^ ͛7yޞ8@mڴ8/y3ԸqcQL]zer.^+V=xJ,)qH[l ҥKDkt;K[FU1B:////vLaP[z@… BUBڱcy^|I'OTѣG~F9pVTɠVPΜ9C͛7W~͚5 $[v-/>|XiEDN]t'Nr͛ÇNoq^h rY[[S͚5^KIII&z;>|(j^P֭)&&FxW^ mR:u>mڴISRR`kݺmb25jԠ:uPfҥKԷo_a֭[Ӊ'TR-"]'!9tEg777:zhgQxx} FݻwGeT=zmөk׮Muؼys #;;;۸ѣGx9+m^Y ym˖-"1%SuU>0bŊQxx88q><===iƍϗ/_0.h߾}T\<٣r?[[[ڻw//̜9SeVZѲe˔sqqpjذ(ER4A*W_ѱc n?%%_""*Qzjٲ/EL=hтn߾U{_Ν;Ӂ $6 D*wЁ+tυ?_pAN*QLڳgY[[+~eюiժUDDTjU $__tA1%J/_/czUqF/+RЀtn7>>իGDDD'O6?^"___a:"^ٳ4m4w}8::җ_~Is%777{ 5nܘ5nDM4%J==xnܸA YYYѾ}sڝ> 3j(Zf խ[]tzяըQ޽+ܱcG:|hz /_^b())/.1@ 6lm۶Mz1K. Be\^ :\.UԮ];:~m+ R222ϏΝ;GD.2eʈgB/\T^۶mS9 ЬY4NVT)ڰauQv߿OC !Hhʕ4f 2ӧL2TjUx UZ޽{GDDw咽={jߟ9ږ-[zcC?S9==]3Ә1chJӁM6:[jܸ1LԨQ#C J^f۷oM6њ5k0+󖖖FG7o5ժUNۃnݺj^:OԥKm=~zAW^^4hmذA``fﳻ;Ӈ߿oꮁ'NTx4-ּf7o\c|aĿ(l;c|ĉ|;ɓ'ޞ9&&Ơ&O,G:uX.kg̙y~ҥK%k m.N&СCUX>u:uE; ӱcG&"vssM6;&ze޽{sŋ+Vl e+++5jīVDyߋp%[n^!D"˗k},^x1;88|J*qDD1LNEDܬY30/^p>vҸו.]>|hPr?~\h~YXi;;w"2"S+Ntt4(Wݻw甔Sw ߠ^ԩ{W˖-9))I6WXwŋW+믿o H^*11;WWWyvvv_111~1^zrw 6T;͏?6uW|;vL^9KjѣGZRT- j0>^PEFFrٲe>1c{7l0~6AAA*\\\'?ޠ ,c"b[[[>tmr۷o9<<>fW^||} $+󕚚*\$HxʕJ;u+WNK.ƍAZ^[ .x ^P *Oe7n bUч>|X^ZhK+ggϞq`I&ZߙveЮ]zJΝ;^}]H|yNj3 4ҥ0 SwdPӅf޼yj}1רQC+ǵkxܹܽ{wd\2wܙgQ ƃ eLfkkw g},ZHЍd^VZ֯,RM4#˹o߾immͣGXmm߾͛7War%w˸L]@Ç3ч;`/^h yKJJ>GtA;MVZ_`$PDFFR6m(>>^x?͛7 {X|9M8ʗ/Oqqq:Mj۶-|2:DB˖- &U̚5ϟ/looOaaa/?uPzz?@>>>{˖-4p@"";w}222hgK$_>k׎ʖ-Kŋ8ڳg]tʔ)CN"OOOΥMҋ/ʊjԨAo߾*֖KW.S>}T...N 648hm۶t j۶-;v0 +O?7|C\BjDPٵbŊt)OE-%Sn޽{\L;,޽{XbzTz@Y;T-[Gd2]ކ oƌz;gU?|PVԼysu3{*mmmŋ}<˸L]@;Ϟ=UlM޽2u:uJx~wKHHEqժU5!Cpff@W!==L20MXbLDsiҤƟӾp-T-%K1cf|5mW>1u9rDxڷoq/H":hze9UI$yѢEݠޙӣGa5k_߫WK.S{ëWbJC#2ud2nѢ^uƆ |Ҷo޼Ç?W+++:Ŀ;?^6˖-SZo߮L&#0a޺uK &M$i CY5tP^… ɓLN:53g/0:SȜg󌯬,ްa(Q5k 3'TV899Ys.LBzeTQvmNMMU^&oƁrJ~}6A7of"RJqݺuu/9 wMa 8p 駜>aaaloorcǎZcӦM}U 9q{SfM~(&&& w{yyy ak׸W^.t"^n^x[r>v3vݻwÇowѻSLa"L|dz}G͔֩sV\|Y(ȑ#9X^`^Æ Ce޽Ea'''>{,337nܘ_s{gΜ-t=2/"Zj~J#Gd[[[ïF ?+WN;9Aw.\`;;;Xw|5J?g^z|H!!!yi„ Z33]tIɓ'vZq:JPn(##R)U\Yu}xٿt֍Onq@5S+PѣGԨQ#Zv-ry=m޼ᆪwމ/LFÇ,>|8& IDATى~ ^Yw n޼9]pY`N?~n̴f""j׮ e @W˲mݺUt9T߿mkחٵknZ|W |ǵSgٳgA܍s1c+VL;˖- $;;LJo߾̏?z펯L.@//<Z*yFӄ^z?r\+?^>3~hdHNN2eʨ 4/ggg:t(Ϙ1[h!ߋt2ܿӧOϟv܉' /[L}^~sŋ4xsA{gϞI&qff^2jUjU!lۿ|988[ =-P f͚xh ::Z-Z͛7CiWrr2Khwb:@Wƍx stt4O2Expl"( F/v&Mh0buN>^`,5Ǐ7xz m:6lP|U,]Ԡ#S'''u Rh&˅; ?]Ɲ;wV[?۷opG3sBB0p{)^8תUkԨ666 ٹsN@ze-Z_9uHGuq?.\PyCfdܴiSsssS|yatyf^L= cH{#G'OG||^ܼ,ްapdɒWi&+X; ֹ?S+ΥKՕܹ۷oW;u쓒~~~*f͚+P!_^H.ZhZ1a^z5;%\.ZjiCW *24 c&".R/Z߽{!!!,JU~94iׯ/7dDvvv#G>}^ᗝw~}B;s1ܶouQ%K~aֻwo&, }ꢦjժ+3e}Ndz[|ڀJ=իp@Y蝙_|} ʼd2g%ݛ% iF޺uK=<==իWB/0[׮]CU@s=رcy֭_^m5yd}^/e@ɓ'x ;88Dʦ#[`(m 2_^K.rJ *U(A@fe{X933SvmVVV*$M8Qf͚ܷo_LAə2PyڌU107ol1$z x;wN[ ׯ_k|+WD9VVV{zz L *ltٳ':t(Ϻkr"ETֲƍszzAP^͛ YZh/^й=1JJJ^ 0 sU TB+[R)Ӈ###=zB}u ._a!WFFK㸻+YsWŬY41B mרQCzN8VVV:}z1o۶M<(\l۷/Q SxM8-KWL*U׵kpWUa}6 S~ݻw?sů >NNNLN;ooon֬׮][PӐK.+zu҅E>k`.|ʒ|+ʊo޼)1NhB ԫ5g/(ʊ7oެq4_&L~B/0+W PS,ڵks]!*^^SVi a%K5Eadz^ݻwyȑ 2) ۷ogkkkJ77o֧۹uF cccWZŅ;v4A\,ь35koߊrܦM )SF6tz޾}*T:Zp~Zc! Lʕ+'7yd='NL&S&%%9ƍzqTT^|9::rxk : |s9sf -ZPΝ;>ɓ\H*\ڷo) rdeezeY?Ύleeŝ;w_~DcΝE]0`fE8ݠ^ի.zj9;; t>֑#G>S KtVX! XrLMWdJMM`.WNWo߾>˗D[li_`}JDD^^^t *S}Gj@p9^$ˉtRA3gΤ&MUX*WLTzu߅UH$ԴiSx1`@0-Zеk(00PٳgCxx8YYYx͝;f͚t]vv6ߟve10WC@@޽lmm?py{{ɓ'5{:txUPA9P̏T*%///;w,zEDԩS'ڳgʚk:u/ B/0sΑB5e^ѣGŸ_x>IIIxb-Z… ŋݽ{hԣGW8g^` g}F7n{Ul=zN:+nܸADBwܹsiJ!2-+ˑMoߦӱc… 3|=}h*xk׎oNDرt;!^RJ\e )ʁ tf`'''9LbnfϞ-Vyذalggӳ} ۷^`TxƄq_y~}||Lݽ#w=y(md2ݻ7eFP_jj*]u癶988++Kv5=+͛ѣm6ꫯC%F[@2wm۶͘޶mzyyq||ю B/0^ˮ]` zjnٲAˎ;ah0 ^xsJNDdnR(T_r!2W...:}}iu m/uK͚5F@2w2K(U0f D#af&EDD? M:,Yb^!222t TVR*VHO퐐6lVVVqF߿(ǃPӧOo߾t9Сmٲ/vR^4N [boɓ'};vk׎iܸq?|IhҥcxbgLi@CUp-\fΜiPգ!CPvjժLvoVnݢڵke0 Mf8rHEi;++J,pǬi֭ԧOQ ʼEGGS6m(..>L-[$gggJHHzVmUR8@^^^j&j߾=թS7oN;vEjRzB :tprvvpjԨmذ*z𕒒BRٳ'ݻxLz8gϞ3iL-ɻwQF:O#J[n?l;::˔)#v|<3(0DӦMS2M~~~3T}Lu(>+^:[YYo߾ͳyʔ)󓛛ߺuK5MuئMNJJ2i(ze9BCCՕ/^Kxuhvuu3gYw ^ 3g *={ժU*첷篾JgF>|XwٲeF>(0 Uhhhz\xqnݺ1qǎy֬YydܱcG&"P<'Lj?K-[N߾})--~'51cU^ShL/0‡Y(={FDTlYjԨf:uSN2P,X<תUTuy{{Q`` mܸfϞMS5P``N*U ^L򢘘jٲ%>}Z6޼yC{Ǐ&((HeM'ORҥu':WX:|0uԉJ.MO>U233UB9{,SZZ/:z(=z"""(%%ҨhѢ駟P׮]>pXl_ҥK%$$A : Ȁ%bfTJIIUR DժUW^Y駟ÇK~d2SNъ+믿֫ Jcǎ%kkkڲe QժU֭[J.P,ßIC%"-[Pj'++ wxT;!{GAJP@~"x$(Cӣ ( M"R DE@z( ded$3ILk3$3뙽s/_>j@ٺ"h?CpXpñc̋/hrֹ"""L.]̱co߾Fҥ_sL 8p Xb)r%̓O>i-[f\n?mڴTzv$+8 5GMu%44̟?듕QG-N;vj$o73p@J_+Wvy5k֘ Cz\}P2כVZ.TPtl޼٭=W^}hzKhxSy=)y%wf&!!繾;bo1!@ozmܪ5k46lp9Vddd۶i޽;</^4mڴqڮk׮>ޝ QǕ+W@tA;d7UThw_1& :Ԅ`3uT<dmԫ믿2O<۟7on>ӧOOk2ӧMBc M/` 9szj֬Mu_Ǐ7qqqng[nɟ?d:ug Uz\CBB;c_4ޙ3gLJ6G'4 ,0Ν3$?ȑ#ft)9ӧ / W%&&k>s^V5+fLٲe$^p*Zvˣӻ(P|g鎟^3_x4jqR%J^#^ݱ~o̜9ѸtٱcyL*UPTZ5sٿLɒ%Ͱa$%%':oJ2Ok SD kMdd4+W6AAAu .8~Sxq'r̙"_|sIJJ2< /PϪU&O쳱] ?k|ݸWעEK.mZje5jhnwܹsK'ߐ^RJf„ fԨQ)|ӿ z5]n[v- 5{ldiӦMͥK|%KL@TfG|=zԩqaڷooNj~Ws1ᅴ)Sڵk;WJ- Ä 8*,,|)0 IDAT=xy]gϞ)Lrn|vd꣏>&U`3gӿ?OgϞ_ݻk|W?;/Z;wnՖ-[ZG|/^<ŗs_B+p;vΝH2 4pZj"-?Lwr]v)={y衇'Oӯ_?CÄ IRRcٟPߦ.[t]wǏɓE]G?UZzӿ]PP>z.wwQ2;*Qٿ={ qf͚W_O_aaaf͚5>x@hzt]4qcw,c…fӦM~_4Lܹ=+[lI3fʕ+e˖nS^=3asY_}o= ɬZ^jz)+U涇r,ub 7T7/SسgO9uꔹ;-\b"##9++{?qTcPPPG|}w&44HKD;vf͚}QHH>}Okٰa/znw9s[l߾ݱ7GxGzV\-[*..q5`SeMpyeTF Ƿz6nhy{W4c ܽ{~T۵vZ͛7O=Os!{d[lq|ڵti5nX{ŋ>*"""|rrze+::ZdI 6UV~WJr͛PB)nOHHPΝΝ$+V̫#8[Wׯ_O111jԨ.]^1cMm\B2+WUVN A6ʚΟ?SNzѣGzox>}ڣ% թS'͛W۷Wxx׹H3|7&gΜNKX 4XYʱc;c~#GḺt$$$x-[8ѤI>M6x;w>!)),Y4iZ?n6l^yǘ毿rSNի[^2|U^XCvXƌ3+VL\֭͹s<Xb1-ez彸83ydSf4Bxxy_ݺuOJJr۷"EX^0<88ٳǧW_uGÆ }:>&d۷o76{nN;)mcq#<3oK>Ku2]7ovٳ 8]nvn:\| 1oS=X?ܣzSܾg;wN ҪUTD ƽƍ+I*Yqo;wN6mryŋh߾}}Scƌh̛jJ?xKk׮Z~J*e9wΜ9G}T;wtVxq :T111ѣGuEm߾]/rʕK,ѯQ2eʨI&)nߺu_O ,PXXGlʕy/Lx:tݱ]:^:uK.ٖˎozɓ'W'LW^1Ԁ3 _KHH0:tpjݺuGSƚ-[ '|>,\дnڄ{dD…ڵkFdFHJJ2_|T[Gxlذ^yܹsVZ/88ؼ[?Zjiւ?<_~e5m$%%Y}իNuǀB l-\-[֜:uHo߾~ 53fjI{QboLג?4I5rHOLL4Zu|rꫩYvms K.Zi[^yo߾}{==EC GiӦ~m|ݰuVӧOӨQ#SlYd (`*UdZnm>cs H;/^4<˗/YrG?>MRRW^c>&>>q1_~q"""LllqB ld4Ne䃏??ޔ,Y2 {ҷ9&f͚Θ?+ߩ3{lHLL4QQQ.kjb,:w)^x\rYɓ1F5,eCW=z sy5m۶5|Yz_̆ ̒%Kȑ#MTT)RbfΜ~ndƎk1f~k|%&&Zw\b~aWpauVǹpႹ]֝R_~%#%z]vy4q$]Zd$^d^ݱ!C8^H8Yti_nkTHeRĄ o*sZҥKxx\p NsSNNX]~|G&$$ir6zk׮.]8^9s7|Ӝ>}:m_n-Zd6mꘔ NsO?ԩu_'O47h;W޹vѡ 6r)MZ[/9s47'OLsXK/}ٿl@F@6|C[W^u:o;R Æ K$SD 駟:iذdrՇ=VLF{勣Sunݺ^9ttkuPPyG͈#?~s1vZ˧橧"%n>j%,jG5.?ݗ$SNS@sY +$%%g}͛'{W^<^bbi۶m%SO=e&Ol~W~sQb ӷo_> d^dq˖-Kz펕̝;(P\vH.<{5'N4Ǐw>11,_y睎 onń aڴiNGPEEEl *8>^ٽ{wj5k/f+7-[>|1=ܗ'Io߾^eENRRٳ_DzGy?ޫ1\b4h<; dY˗/WTT^*I ȑ#էOe= .t|})4448qmۦnݺtҪP|A5lPe˖?={(88XcǎO<ɑ 0@v\ϕ+.] ژ nz畔nsޤI?~  Ǫ^/_Ʉd+:tbcc%It42_5nԞ'Ojǎ>zc^u92}s~n~/q|^?\C Qxx1[oiܹ :Qhz-[^4c޽:zlLRbbt[ǎguU9rp{P ڱc6mȦ?Ç_~.\gU޼y}2$mV;wT.]<:zPB8q/^,WrUM:UTdI6'Jm۶9~>t/^yF#nXd>cϒz"%DGG+&&F5hۊ+jŊ<d v|oҥNܼy;ݻݑ6mdSP!s ٿ2d^CBBL {g=Y瘀?z. z_7Ιl۷ה,Y2ZÇ .-GvF/:8izDVk֬֨Wqu/WP`o (`$%Kx=6nh^x7o^'w&22̜93ӞpGϺgv˖-S6m5jTlVr1'N)IJKÇkҤI)sw(::ZѺtݫC)w*Qʕ+R2!#n5h IJh>|X֭$uE+V4;*TCjС:|bbb_)_|*RjժE#o}k֬i_7 0@o={ŋׯ}%IaaaV^yˤsͮ_zJgVTT-[qKvڪ]&N{*&&FW\Q|TD ժU˯2J1xo…zꩧtuI42R5d5kj˖-6&r֬Y3-[L!!!ڽ{#L/f̘{έZ,-۷ٳU`AܹSԦM{nJLLtL$vmZ|A̙}?VHHO)SFeʔQڵUV-=>} FG(#l= Ă LhhR+G;Vѷo_e!S]J7/اO,>}Ӓ{y'LZ]H:;wcbŊEB }sι8Stifk奁WQ^=k_tDxbir̙cDDݻKaj9Ps뒆7xoӦ?ᗥ{ؾ\r&wnՕ˛cǺݻMHHM\\(4pO3fݱ[?`J2'O;ŋMXX`'&d_|UZ5qFSP!5~t'ӻ.\،1\z5;F޽P'22'c? >q=qfӦMn|z7|5ouϟߜ9sXv2=z0yo1""|WnƗz@ZWtRnMbb̛7'e˖;'Zjŋz뭷$Ӻuk^'  @͛7/Ekرvʖ/^GPPٺu ȶtR bBvرT'nuaKGs)S1b9y>]fڴixܥK|5M05n׮[G*ܐdkӤI䳿Ðl22?>IP3tP/6o>׏?u>Kٳgwm$'c@@?:tׯK4f IDATNpoÇ\r)noٲ/^\X`ڶm+I;v,+PTոqc>}: 0@t\?r6lHʕ+zK 6T"EtI=zT?,Y;vXʗ#GYrȡUViΝϞ= Z^e WwѣG+$$$Ξ=Yfi̘1ڽ{_͛W?Vco߮h}~ռys_իWK>}ϟ+!!!DŽjيrܶn:EFFҥKڵk_W:u?SGʕ+tR=zRիWOժUӕ+Wxb#7o27W_57˗/OEXvZӮ];}qiذaFOy!b޼yСc ;V=z9'|}O?> N=#I7n7;A pwׯիW+44}?^|F+Wx}uV/_m6}{9M6o?ׯ4i 1O?+xy|-)UR7{W5zhK:xy}JJJxUjƍ PW׬YTϱkر?,Y$A^VZ"EI&YjxIMCjϞ=z#G-R^~@ׄ Tn]۸qcYq^R.]hN/^̙3} z9mVfJ|7.\XÆ kƌںu{1ZVXA M/2shxqN;zϞ=` Llݺu`կ_߶A ҥKkҤIQ-O?v^ΨW˙3-Z뱂ԼysmذA~~aoذ{=y UnZd^VXUVVZ>ETT) 7 ;w~ ݻۜ nݺD>ѻwo}ᇎ7nHK؆zxh|_)&&F.\PrTF ^dB^ǏWnlN?~\w}Ο?cBBB4i$uyhʕ+>kw1!$&&F5Jջwo͠TUwY͘1C˖-Ν;ui\rUV-EEEf͚~I/:ZJ5˾Pׂ Ծ}TW9rh̙j߾}&^d2s3}Ժu4 ƒ%K4h IRկ_?2ȪUիW{d|>}dP*xzw:uzѢEmJz5iFfRhhhILLTǎ5k֬ Ld}4$nmxkԩ1'((HSLQ }ŋu_~iQڵSbb$i*]O du4ğ_|Qw}FӧOMBBf͚jժw4J*e˖)^=&d]UVMVroz\\:tu:"nA1FT^=5nDWC6m_($$$$&&SNZ`A9vZhG#&%7j֬YرAqڜ {nh<ȑ#իzHUTQbŔ+W.]pA֭[W_8z7ߨbŊ|Ƙ۷q~!7|࿿gcuQ۶mS2eo>;rDK.U%IaaaڴiWns*duԫgj߾㋯j)kuEǏ?e˖;.hz`iӦK.JJJD+UΝh"N:ZhJ, `BU]vʙ3֭[%K(11Q ʕ+ugPz}c||Tn]ǗƎ_~'c^e_4$qƊT\\kOʕ+ ^dS^pjxM:U;v92̙3̙3>788X={￯0  5jȭ%ho?~}7Seoԫ#))I/ .>׶mԺuk:tHԳgO9GIרWX`ڷoׯ{ݝwީ5k֨TR~J>^d ^̙3:tƏxǫUƍD*|  u6hx*{9scG}TSLQٲe=#!!A'Oo+WHz1c8-M  7xO?U׮]ix5i$M<~z7լY3-HLpE˿Wُ1FСC%Iѣw *d :Tv풔w;ިW/^hz\5Mgyd,1ڲe/_M6i:~PrTV-=j޼J.mcjdULۼy4h8s/^eocƌkx-I˗Wu=@ʟ?N8C)&&F?rB4uThŽlzL>];wN~x~F V%%%… ו?~!;`B\5dȐ/$iѢEСEUhQ?Q{L+WLq; /s,R 7U`A,X225M6Mq /^֭[kɒ%ʛ7o͑#W~[>c^;ѬY ;YՔ)S/y)ZQpƍkݺujӦۗ:2ed`2dw+eZ%^78 ?p>}: /2wVXQjժi֭j۶˖-K zO|׎ixޡM4ydKN 3f)1!xիzuy^~FԳgO\RŋwިQ#S!;^Ǐ׳>+c /Ghz#5:t`s2H {}~^~F?nݪzH9sOd1v M4Iݺu 0!Δ)STZ5^~B_UV)22(WAk׮4\5fΜۜ RbB@^+IhxȔ(W 2O>Dݺus4BCC5gnd2 @^@đ^x@„ @A(Wy1 / z PP scyC{N sUV6'(W 2? 'Ntjxi1! PP ^cȑѣSkΜ94dJL+z Hȑ#;8«e˖6ט(W  Gz ^ 2 @^@ #F `0! PP &7#FP^4oHo: /2 @^@cyC5|5oT2 @^@d1vNÇכoN @fƄ @AiKqqvM q7劈ɓհn X)1%RN)dk4& Le ]5@璴T @6`4p)2%ȶ F @`@^4 Ȗ zq=<<\ , Sb@^4 kbyCɓ5qDc@Ν;8B ʗ/3gСCXc_(pz-gΜ;FTItI%\`*z?-[ܖ{ܒݻwEY>}_||d*ϟܹs۶mB ٘\ٳףTHk+}[J7;!i=q~9ή]t]w9o߾]ժU1~p\߼yjժec"pz S4HzmSpNT!r BCN+]Μ;@ʙS x?$M[%&J $/#Vi`Ś5Сv[b/_T2v?d*2-7WƌΟ; hPFΞ; h@HM/HҔ)!<ew g۶I&%/{Le i,SݓLV>kWGNhz@zfϖ.;OS87O+S}jN[$$HӦI7ڝV'7);S~; W*U M/pDž ر޽v'ŋ'7)3ѴK҄ Ү]v'EHRXIenN ${:LN; T)Lxi(Y N!ii^}M/ܶmҔ)R|I`ETvpҤIҕ+v'-ZHO=ewlXrvU]J ڝwI}fw XեԸ)5^`ܹW_ٝVEGKUڝ…vU}H5j؝"ۢV%&JSJ?dwX-*ew#͘!I`UtT)%^K ]N+InRٝo/K'JfwXQԯ+I^୓'>; T)񕙜:%!>lwXQԷ)^ J#GJg؝V<+vpvpr)u=N_>Dr$eK驧Nߒ:|$Y3gNm_;Nt7;~O; IjM/ Nj԰;E NxC~Sdy4׌fL>Bo_lYS89SZo_\9Sdi4.]J>۝V,ܤ;߮\I>gܯڝV+EGKy؝$ˢrGv'+&7)2ӧ#CN+ʗ|SYM/ÇNٝVԭ+iw gGJÆI'OڝV9s4~Mcefͤg;ݻ DiDzYSd94 #]+͜)cwXѩcvpOҴiRRI`EǎRӦvRhz@FY RZvpܹvU&թcw,d35kNʕ;?*:ZPYM/HWH|"I`E޼M~G 2? N; YSz-S8OiYM/VƏbcN+ONl>i8~C U6;iӤNl&i5~A $פڵNliSKzS8ki,S~A nf͒_?;Nli2S>G nȝ;?Iv4yeI`ExxTBv'ԩYM/'7)21cN+JN>+3pA;Vڻ$[լ));& .?nwXQ۝Ұaɿ[@@ \y1Nls.\; hHzS8;p@=Z:w$hz@j:t7;M)SkN+ڵZ;[wI_؝_KfٝV!կow g+WJ_|aw +4 =Iwiw gs$7*W;s%KNXF ܤ(X$~=yMN+BCEڝo ԩ?۝L):.\Ǝ; (Q"w*($xQ?^ڽ$hzȺ|L^:~\6L:v$JL}[ IDAT=yR#QhHzS8;p@3F:w$ᇥnNihYnjNjζl&O^; h&l&}gw-4=;+/;-djNX-Ulw gsJK؝VEG'+3;WZ@hz1ֶ mo$$HSJ?lwX*Q$3F1CZ$@hz7JHnRٝo/JK{؝V-*T,.]&Lv; *^*Uɓ؝V}wߩ#GND |aC饗Ncᆪ(o"Ev.^'`4 0j4E}6ł 7XPUTDu0 3{g]a{ hIHcNJN(4XxZtl""""""""""J@~S(u XHJѧ0h֮E'!RQt Eg۷NA5 Et Ex{NAM/""""""""""yxR'{NAʚ1h@t ENA^DDDDDDDDDDRkkIdf[.NB*V"L&': 6TJ>K__t,5@`$ ss5ed$:ID^wNBĦ˛$2XQ|Ɨ:-BCE'!-Ǧ*k+:Py"*JtRFV€%KׯE'!-Ʀ $:;wuQg_N񢓐bӋ(t,:"__[t RȑΟnd2IH EDDDDDDDDDTT݁ DP?oS&MDPtgE """"""""͕gϞ˗x)}HOOG\\tuuaff055ER`eeXYY|򰵵EEXD L<.:L&eat(: ) "RHHΞ=gBd2 $$wT^ݺuÀбcG HD3~~~I7_bĉ]hD@^@Ts$Y<֬/X4 =VNLLD! Ʀi\7n@ODZ%>>'OqYQAAA oJ*aȐ!6lg/_ .#\ll,~7]]t+#:i#:%:I `?H /7czzӐbӋ\D={#G-֯IO>1|k3f'|Ԑ;}={`ݸqd2H;<Ο?F҇Djdxjhժ;;;ёH[˗|Tt,۶ɛ;NBbv\9It@lzQS+ IIIGgϞEffHE֭[4h4hիWM6#ѣʙTʔ<=卯Di䒒uM E!Ml 64 ^DDDTddd 00 ."*RSSqQ8q222DGh׮+,X#(99'Nđ#GeTXQt$6ի̙dy~VMto+VȯE! µ%XYz50b,_/^dË1ydTT ñcǴ/LM6N:سg8DDy:s 6lcǎBڨE `D)=} ,^ z%: i˗aӋHBÇGzdDFF1h ?)))͛7ݻ7VX!: iO? BÇ5@\$)?VbcE'! DG(6VZ֭[όZFF\]]51>Ct E/7NRzw -Mtlz0h޼9\": Q/_d2QHL 8:NaKouN?]D  nݺGt">>+ұIDE[Nc윩S33ibnbVQdʛg}ӵڸQ\ /7i FR{lzSzzzGӦMѬY34k 4@ɒ% U755wޅ/O?iiiΟ'O`С8~8ttttl"ʝڷoVZyhܸqflZn֭[c֬YǦMn:DDDI???]cǎ-:xP0^6oƎ D)0=]]I԰/B:tHt,=&LAFlz)IWWcSw'''tA%6I&hҤ &Ol߾ׯ-x9y$֯_o$"Eԩ:t耎;^mѕ+Wٳݻwc RsСCϢ%*2nn&ŕ+d9z(WNޔgx5u$YN,,#D'bBWt"""6l-[cݺucGݱvZXlzYd+ʔ)q֭[E6md\2e BCCl<"m-Z`Μ9z*^z={`ܸqW6>!CBҥU:ׯ1|A+wwzu) ?.:)][t Ev׬FRkEDDDY&6my0r A6m_`齎;… 8r&L0ѣG*H*U | >sCc300+sΩle˖ *(GJI@L4r%,,GGi 卯ɓ峾Az:ijRtRsEDDDZ xܻw[nڶmED ;w.BCCqy7N^p3F3?|||p)Amʔ)`˖-xۇCjLCvvv8{,O1i&'SJ&:V<ac~ԻwUǢL/"""EDTڴi7774^;v U6'uV,V#*\]]ZOOG C&I>1m4s%5Ҹ10}:`$Y""ŋ~7Qx__I| ,Z$lmE!5U|~""""*\022`llƍCZD)FpvvƋ/T2ƍ7pK%6f K^;88>>>prr6Qt ~-_ZP]ѭ[7zhӦ '''8:: M6/ּ~:.\X鉈T'66VZ""vijk׮գ"&N>zBt Ek 2CEP!f|MlzI0`U777亱L&C@@<==QJi?:t͛o޼QADDDD/^@jjdT"Y-"nޒjҤ %G$_/ۛ j{w)]l dfNBaӋ0sL4hCFFF322q㉉XbjԨ~z Dff&tu9IdJx7"* S=\N*Y-"SId-F%㴿?nɏիQ1e дZ'#3>8o길'-DPt({T@lz'p|(]k׮&_|,"""""UȀ5{S.3CDp=nZ####޽&&&%*6<=n!̓ _Fas6qwDPs'pTlzٳgVFbӋ ((HҚÆ i(L:M6ŵőҲeД3]HțmAyĉxXt16<<33I6P>ETwc*dɒEFFl<"""""dddয়~%$ID'883f̀-Zǘ9s&;;vv& w}036l@jqއJbbˁ'OD'|`ӋBBB Gjjtqqw7ũl,"""""lذ!Ǜ c000&i/_bÆ ޽;j֬  &`޼y*MT,5oL$:Hݻl=I m_,/56 ݻwَ%$$Oec`ĈWjDDDDDRzfϞ-iM##l vJKKãGc+Vѣq)dfflYfa*OTl} 0|;!!hߎEyNNȑS(zX /:Qq t~Sͦ^ *V(iM"NZZ<(Io(DEE!22AAA Ez/edd+V`E:.Q2l p$ 5=cp0zz#ܗ__GN5`F`xPt^D`lllϜ9׫o6m`aa(.HDDDDTXXb5 0m4Ik0p@1Trؽ{7Zl): 8QޤvMtǺc%̌E)8WW * |Yt,ǏE@rr=7~xڵK%a„ ڵ+Zj1 +)) CEZZujժIZctttlx`g':}?}=^e<=ZDP{7g5)6 N:KMMŐ!C0m4ƚ5kN>H^H x5MLLO?IZc4h???o033x167wG Ai':Jɯ)ssI6qVbӋ5jLCƍq"JEDDDD$ޅ C+9sFDD97n޼ۋCT|U"oRZKL*VEP \ <~,: }{ziElٲAQKݦ}s}f͚ݿ=z@1c :::Ep"""#z 000@2ePZ5Ԯ]%K,,wA|۷oqMDFFݻwjԨQp-<޽9,--ѰaC)SP#44111044D2e`cc"Co޼!C)i]{{{L0AҚDD9iڴ)\]]1x`2"I4iL,Z$:I.YVeLX!J$")%)iixHzgw503gį8Ө0c0$Y^_fs$ ɘ>}_4֭ NY5jܽ{7_?wΝ;ZjaԨQ1bT2233ݻwxi544D6mзo_ :TOpp0Ο? ϟǓ'OD(QBqqq߱eܺu 2,[=;;;`ѰWDlٲ;vKrF__-[ķ~CWWfm6ܹΝCzzzCݺu쌾}QC"<<\K,uB /0l04nXt"Խ;|85gʕѤfMԩT ml_*T)jfdfś7OVP?|̹;w0vrl:UhtDE6N%8X\ސ+[VtǦx‡IIIhso߾zΣG0m4̜9{ѣѥK7LrM6axI ___bƌ3f O 2>##wݻw1|o˗/GÆ %FDDD9sĉꫯ>:럈ׯO>={D۶ms=$4xIq$ #:6nu~j 3 [KKZZ©iǃ""p v MΪ)upן|RcڠAfd 7\]{0lzi͛7+|Xf->s*sSSSw^ݻvvv * inݺ#G͛Y[[e˖R J,x}dP;)) 111Ri6sss:u UT)tt?o߾Ir}CD$x{{c~EM"68[9~l\Lѥqc\X '~U+1DDL(6 TKKItItŦW1cƍh׮I:+W˗x +,, fBժU1rHɚ_7oƔ)S5eT>7Osmw^|7y>nݺ8y$^6lXYb> @GqF 85BʕQ^= 0Gݻsl̙3ػw/NwJ.͛7# nnnhѢ*W5kC_Ct5׺W\ӧY={fhXh?q0z͞=7nP:ѿ2220x`ܹsG7ou>&66֭zD$[[C%@*牱ʕ*ɥ͚j1F*o|TDk?+ ^ <|(:VґiؚW׮]ѣGDEE!::Hgf\\\(Ww)))r.]0˖-|icccL<ӦMR5ЪU+*PݻJ]kkŘ4iRk.\񜁁_`۶mZo}ݺuos=_n]<|(]4N86m|nbb"Zl<~)=:9ꫯecy& wPZ5DGGg;׼ys\r%2(00u} LD֭[1bݻwգ/((5jx7$Hƍի%kllW^.C{fffcHFGGO?T H 30s7x0)*gKR)5TBvvY@Ŋ0 7T:N&MpzR~~NSWm>#?s*MiL`̛7Wƞ={ .x"""bU5TbHp/^[n?saÆ4T :4[ 7ixҥKx+P z.-- Xvm7ooPX"_ /(UT!---_>tĉl /Xpa^`jj1cxڵk? o\ /^^ / +*d2ۇcƌHIIHt%IJ~A!^ X`°RW/G֭U:O@;1TcGDP ,_ps:5j֬):Z Akԯ_gAAAAСe SRR ]%ǏÇ6 ^JKK ШQ#.yH$A>}DPlYۤT)3 R8o/'R'nd9MqMZjV*zM6Ç9sJ*MNNƀpԩ|=>11K BWԩS.WXP/ ={~g5kRs=?9rAAAَ4l0}|}}T]"""^.\!y-Z`Œ%"R`` Zj 6v,жNv",5 ? 1n㔿モR'g۷N54ebbkkk1FN|hTT gFpp0N<#Fz}t 4O֭[͛u666_bEz¢355Efr=oggΝ;+~i/%s`zz:NoF^ z~c׮]^ҙԏ.$EٲenL8GVMDZSGt E{GN#F`7QY"88Nh)PV-zJt d(QBt '''899!99'v؁cǎ!99bbb0~x:t(mڴ)s-[,^z~ÇB~_SN\|9s7Vzjժzm} ٳgs}:6oތk׮۷8w~GmV%qA8;;+u3+|yyBU".XxHtltttqd8桵GnMUuYpK"bK pCdjjÇ㈈ҥK tZ*s~~~n:inn^ହ =F^ )L(/Jӧs=sN<o߾Wtt4nݺ///9.DDD1֭$kע&"bddva֬Y8<ñl24iҤH?s ʥ oRWŋgD'ɦtɒ7kJ`/"]^_Sᢓh,6@ ;j'ND`` vؑMǏϵuʕ\'eӫVZ[ =FaLR5Ke?猫S*W7n'"...ϱT'iX>TI 믿VIm"n+V gggڿ?\]]U:V [)^^@q/ +U_J^7*6|ڵƎBQh(t,a4Up4^Ň.Kܻw={^£\W?~8,YP?TD TT) U5w DlHD8;;͛*)S6ч:v#GhSV^͛7t "ҿ?Яn֭#13u+Ws$)L>AS({X+FBD5LQ255EݺuQNQ4£Gϴ͛jٽ133Çѷo_>|8Lkv<444礤H=KK\NjtbF|Ϧm۶ׯJSfff$""/99}.\~-~'&"M&Mp9l߾&L@LLJ7n6m뫤>;Ot,gQ(0#G9=p"ָAKTQ(⯿{bN#^%KDŊW\Y`!!! tuuQF TR+WFʕadd333D7@}- !!HMMEXXr!R~}CݺuQY~mqF,\|*U);vAΘʭٔ "^y}}|)5mۆ*UQ"""v6lΞ=ǪU$"\::::t(ڵk!Cŋ!C'J&ݻdٻWsI|޺5V}x>>>>IyL~Oazzz]4Y!QQo>۷/vD$\Vf IDAT*UWWWYFwE.ym"&^N# l"o|A0|I^wO^)?DN&Tǎh ]n3ϟ//[2 C 6kԨ<0̟?|dKm۶?>BBB0{lY0fIƢ,;=֫W/T\|0yF\*QD猍y7o.>lῳ=T)33#GΝ;UR[nرcgիO?y!$$DDZJ>KKk(Ա#ML$y}Iss5{ӬbLc^5kvUVlcǎիَO0ׯ_G޽U~7!̙ooo7k֭ڵkU:pW@@@>,s+f?pɒʫUB4ʕ|ddd%!"""m%0vXlݺU%۴i(&"RX @ʏ?(y]"fo/oRH`b <\t y6ּFZ_$* X(4V57o.99>|8/_^w2<_±)S܇3N>"1㖖9^P/^(td\UVMq4ǚ^EL&Uv\˖-qq>N^۶mÇ%KڵƎBQh(lY&I<^PD^JZSmjN(<tItbO^ c咍QPnnn C(ʖ-_zӧOVVV9xݺu(Wyܸqc4˗ϳ9~d2b*߰aC;v,ŢEХKIkfdd`…$"}N`:tjSÆ(%,OJZO|嗢S(a+%*mze@Y_N:혋dv)![dxP˖-+sjiӦ9>e˖y֓ȫպuk4Jʳ)xE$%%a""""3fʕ+URv8ydDDJWW[lukΝUD5 Yt E}}gaHIt 6 -Vtid;֭[7+VZ gffbhgz'pȑ";ԩ 0''<7}d^|RJSNڶmwaϞ=EfԨQgϞu5""uUbE_sNIk?݁ DP?o p5u*Ф$mz͛7kܸq vc(fڵ+}(r?E0}ڵkَuc^[[[j*>>>Iq#ڷoy̔IDDD̙3믿vJpiب>}W֭[%GD*V"L&': ׮-i=/@ >ߧ覗 ʖ-HLrؠB WVjjjc/^t'meccCCCc.lpAjՒ$:7ce$]p._>mO YIڟzuSKmC]JHHݻws=M:Cq\RN:3f8֦~<<~i3 b۶m9reN'ka?>OH2e/FD$>3Yk9rDzD6m)4I/A3=-QNz))2-['NAEr۫?$ڵk|.gw$kZ;&N( W⣏>QECСCѣG\i8:u*5jTZO&Bg3gyOdddmjժ3kvލQFiZh T:0 ?ghFӦMOD$'|"kK.ZBݻ% h>4 +gJ%JϞNAZbKKr(?߇Jķ~y+++)?ر#4͛ѶmM%kkk]PK,#?,twoqm۶^:'11NΝ;y>)) ˖-+t]غukB9s&ի5k׮Ev |oz ƍ_lDDDdVX.]4:͛+RH$WWWT\Yz˗/eG uKtֈ@׮Sh:}Xg]VlzgݻNAZ`KKիWqٳg֭[@C'''&* 93gP^=;6rsMt 14ΙbÆ / {Aٲes դ{w76שSww7/ލG}׍ĠA: ;w,p]Z%K`:t( \ ;v쀃Cם;w5ȑ#qͬ{!Ν WWW,Yq[[[ܹeUV/|o>lRDDcǎ͛7eG {(s3SMNi.`6+kӫ-oo?epR<~^~Z֭[s} -/_~@ƍڴs#֒m3'==K.Eѯ_?Z QQQ9Sոw,YmۢaÆ8tPlll}vO܍7ƩSPj碢Ю];;vuΞ==8ުU+5vZL6 uƍz1b-Z `ٲe5jj׮ׯnJJ 6ms4ܹL6 4q/+v,kƱcP||KJJB@@:uKKKTV m۶EfP|yKncc}zI"""2iժBCCeG [ 06ǏtH+^YYH+^(3a&ĉQN <|7o^%j5޽3gɓػw/>7k(y{ԩ׿>={`Ϟ=RJrʰϟ;fӦMvڷ.6Ǖ+WcvSTT:w.] ͚5Cr吙\r;v5T*xxxyrܽ{y?WիoL/>rƎ[^K.۷c֬YZ]f ֬Y{{{ywq% <gϞ}iiixQ&UZ{AÆ Ϻu0rHE>|gnn۷C&"75jԐ^xxHaҥ=Pg1$@24CUIN/)=IIKJScc pZZneڛ/_(UlmmaffkkkXZZK|111ǣG\M4qI$#'''XZZ}/QFARaݺuӧѣ9Kܽ{@cUX>>>=z4LLOlٲرc///zc#Gȑ#ռys,X 0^J%K`9u+(###1sy벉DDDd6mڄ#F(ڳg>Ck飚5kZ/""Bzy@ =SԤ>]tltO`rBKZCRV U&5SM M/-o߾Oӧ ]Νu>fqRPZ5_uZl#GΝ;عs'?أ+7NNNh߾=^zxTa =zl2>|laa={bM4Kzsilٳgjiidd?>|8zj\v@ﵶ<<<иqcmٱcLkb֭lxQRreYfgR6²_g"el L,X :IpOJΦMɓ__I-*c%J޽EG(VV\ :֭ubDxx8BBB/^~(QL899Ut民>} !!Nµk8 Y&5km۾~4mT"#Ch PB Ə#""sBCC4XYY5j@˖-{FH^"""ҽ]vaСSacӧ쵉 ,,,r-mV!=qԡ'P!$@Ϟ@LX4 (UJaz%[-+>o>P v$6yԩ;&:J6mFQh1Ujz:%uSʕADDDz:t(eeMDdlll"I`ر#_NY7P`K DVRZ°arNBy0~Y'Odv! 0622š5k0tPk 333j)ұ]mD mMȰ%nUgϐ)>ӄ @VSP* b̙cI&pssdtORd 6LDD$11QZE&Ć Sgg)4m>,{ِ'OdWM 7P 6dnݺ VӧO5/^ѣG^Dr2bp$ I>Z Z\*kًZϹ|yYP$vDd`ll۷kדR|}}Q1rCRpB;VDD&)) ճ 6U$.NBBd+ymj@56VL%¦Lq!CtL4 cLO^RܹsGDDѣGLb&<D'!m4o.O"#{"RqBeLhk)_ ooo||Jo:q9t /_T?S*RZtҲ#=p>d IaݺÇN)(XHH(R !^IU;#GNA`Kf&&&pi4o\g:99?3t6&)իѣb ^`r7eGzY` 3Stưa@^Sh:^ӵ. /]M2Wt ^ypylٲE旅L[nCDDDDDu5tԟ9s&OHm""CvyYըQCzGm5aЪlYj5uݺPT,־ hFtM/T*… 믿W_rʲԮS[,uHׯsΈS'fϞHm""CVq)YkUm9":i ^]t M7m.\XY[Wz%7P%%EVЪU+미}6.\/ÇǓ'OrgҥQreTT CƍѮ];N'""""*ݻ?2?'ODD͛xlJ*'''JIVƍE²||OOsi$ii@@tOb&{lz4 DbKT*ׯcĈ9gdd˗DDDDD$ѡCDEE)RS6QqEe*k=Sqq?0s&": V*RbTI=,Z̘`7p-Y#9g,ibEDzvvvlx0AAAر#>}H#F`ٲeܗ(X~5۷o/k=c/Ia_-:Ǐ??|d}NB%FRtM/""""""ѡC<~C m}Xb^DD.k_z炂ŋ/D'!mt 2P….?۲=dYtNQEDDDDD$PXXtHE껹aʕ02_򒕕ٳgZڵ&sի IHC}N%`*i7Dcʕifb[^Drs Dz |PE47n"M6ʕ+lԨʔ)#kM2&:ihFt M7kFW׵Y3^;r:c":@I{ի Ǐ/^ôiD$"""""@CE6m GD8xyy^w޲$y3`ot.: i$oIT^WKjh-||X@(I ZGbƍطoaÆnzaΜ9 ?mقWɺcG]7c!矕ѯ)o+:EŦLn߾ኍadd'Ncǎ9ΥsQl|"""""ѽ{wܼyS[Ea~ `۶m^z!55USLc%`*i/*L[.~7n3]4܀'zZq*98s@G HɎM/<}~!bcclٲ8tƍ IDATZ7f͚x"""""*t/_V~Vp*UJDT|ܹsnnnxqJ>>?iii4iFtEprrM͢S f  _ -ر !C:kر(ee5wwC)6HVcĈ٘&&&Xx1<==s=waӦM:CDDDDDKHH@׮]q%E7j;J.H}"*ѵkWɺZ"L7nUV7ox{{Z1m(5JImh=aLe#KeU ] #FNBqqx':mmqQQt"E饥t[1fM4:j믡Ve:{&<<c(NRaʕh׮(T\l 88}NBŘ- W&: bҍ7r=ާO[WT2e .][ʚJ*bbb xDDDDDDDD%J?>Q8֬_[NC^ EG!R*eK7o۷nݺɞL2Wոw$&&&Xb<<|Xڵkc֭8r^leAx{ˋNMfN"J%:^za'M'N(H$6:55syW^}ƖUTQ""""""""'ǴiPF Q,Y[nᣏ>Drt||76+`RIٲ%[ơs&031I68 Kaߜ$wܱcKKspB,áCЬY3ܻw/ʖ- *(̙3AAAuf͚:uꈎ5je˖Ç3f LJCt4KDGN"K п?mߎm3f^Pret<OHЩ(bb ɍM/-n:1ZQFaҤIHIIQl@ݻwG\\[oҤ TKDDDDDDTիW| ܹcҥ EGSSS 8NիW1zhXZZEm[૯DԤD/Z[cPX:a^MvT|޵kjYw4xX<{&WE"-iHMM8V1o}O>>}'OĹsp5EWQBʕѮ];t{F2eDG"C4j ܱcd;u ppNy/]=[Dϖ-_\7>Dpd$?WdT]4>Ϟq#.GM">|xMKHH別ٙ򂗗DDDDNٲeѷo_[nҥKtnܸ;w AOfMvhݺ5ڶmvڡjժcQq1m \&:I;&ŠAJ-ZhNH@pd$B|8/^˗/äI`oo/:@6662T|Ԭ)5)f$[L 0>0cP4TX..R3GtlqqtONCTh\n:+&O,:Q{Sh gD'!mh!'/$DƦ ֭ŋCR@ڼuڵxc)4ݻ5E{wD$S,GKd(ٳgXt)Zh!:QNY`:@@ϞSh/`j #CtcKF3f?(lƗJ_Ę<hDt Mv[NAښ8QZPl":Q%3///lڴ Kذa&NqJ,oojU)4m;&:ipqBCS^ 2d];d&MŋX&""""""""*lm&$ْˁkD'!mX[K$RS+˗E'!z+6cǎahР"cTT ˖-ŋQNE """"""""|HM }!!6Vտ{s`BIŦׯСC8p T۷իѣGȈDDDDDDDDD´hxzN)"D'!m4i"O"#{Id":@IRеkWt8qΟ?/ CJJJ-_<ѤIj ;wFuQwE')@RPa}! ^-:I `"`TZlz阥%z=zhGRRRSSK ,,,D$""""""""3 &8p@tl%5MƍL8|tO':I UD!rzvvvcQQxzJs.\$۾}='6Ə_%:I{jpI4p3(4o<4m /GDDDDDDDDDT*ݏ ~l >,:iUKt M[׬F"e6l؀+W`׮]:u*W/ҧ=RS+˗E'!m^^>.-sOcKK8zhs):nhh(^#˚5kаaC?~\񉈈V$>Xx@tFR3U$$AA`Kk5jt5fE KS###ѥKlٲE DDDDDDDDDTM'N)2<Ѩ0m<|}{H06K.B|_/FFYYY>|8g|?Bt MAA위IH:FN)$DE/: plzA۶m" NBr4Υb^cwo)4]H2<_t M/KƥNB%^E,:ڶm@-[VxLL f͚%(i?hJt Mq3ru0iTUڵkcٲe9/]Q@͚Shڼ8p@t Җ7*:[}DM"AA222vZAHԤ$[z:j!SSpt$[Fz5矢P ĦW1ңG6lZ- P' @P${J$˗ߢP æW1RjBCCqi(WӦNcO O{*"Bt*A*Fs=~'!""""""""|u):_E'!mt|BB .Nt*!*FnݺӧO8 Ր!@߾Sh|XHM1h0p]/E'Mbڵkؾ}{ݻ4DDDDDDDDDT _}m+:ÇMD m|=E:a":>HJJB\xycPݻy.o>@zShںؽ[t ҖShڱؾ]t *&ʃ &L˗/iӦhppp D'ɖ] 9#: iTItlj4II`-ԩgb;1H[I/Iz,] ܻ': ilY27$[Rۢcӫͱe|駢ܹsQfM1(֕$* E'!mԪ%-uOyPIȀU@&&&@.]DG)3gDDDDDDDDD$v퀱cE ̟ĈNBhBSX ^`bb-[raΝ={(DDDDDDDDD$77)4ݼ)-K$: iO`P)4ݽ ,Y"-ITHlz6m=YCժUCݱvZc݁Et~#]Et4nVNBF?:7Yf]ŋѲeK={ȀU.5)IL 0>*: iZ5Kt Mqq?": 6dpelwcǎa޼yE/88qqq9ǣG|r """""""""ֲ%0a__ *JtF_$2R>^E޽{#11@CVi̺uڵkhڴis/^@=\1 &:%K/E'!mt .: `" !AtlzٻضMt ք @VShڿ7)H06`ZQ KƦM`nn?0""""""""""T&:#GD myyիNif)H 6c>|sqq;#k =t̛7Oֱ*x{66dKIV^aeeʈN-- .^aKK@f!לUT;w"y&MJʕ+ Yj|铸8 QSϟlziܹsV}ԬYfff{G)Zjh֬Y㉉8t"ci\KDFӧ67Zt M~~үT饥+W8ɓ￑O˗?ѽ{wE3c]qȀt .: `b IH;#FN)8XPE%^Zxmoo~ FFJMLL dF'ODDDDDDDDDd zBӹs@F$C>}Dtjlzi)..N!C`ii)(&M(l"""""""""-Eд?oS<<6mDt y#lzɤu֢# 111joq"""""""""{@Shڼ8p@t Җ7PlT饥7guUTIPl>ܳgt )#:I4 |Yt҆rp$[z:f p$06dmm:))IPlgϞ7$""""""""\U"5)6*VDД,ZNB bKK*Tx}5AI$7n+W<4DDDDDDDDDdP7LBǀ+wտӧ/!: )M/-U\Y둕%$ZɓJGi u !:``Biww)4@\$6TF wŏ?($95:JCDDDDDDDDDkPO)4]Z%E 0@t M׮ITj$$3 Uƍs9s&2220k,T*3cԩX`[ZyIIF )ӘSDSF%KASaH<}[n… Z7ڴiHDDDDDDDDD%TJ0i$Ef\͚Pa99I/OO +KtɫW%RPj.V/Ec޽{ѻwovZXBgVrr2\uF`mm-0QRRRpׯ6l}Qaac樃;9)4YXUff6^Edn{htΘ| gzAѸq/3(B2eйsgJDڵk#EG "zDD21RR )8IM~O5:z=hԩ#c5.EDd8ӫO?,+++L0Ah:aÆׯ rs_!CQ`""l.^ΝH6jBuE.NV-ww5_!bIQD-ҢjPE[ZFդZrί۴k,.:Lcߗ !BBV ?>SK}q]^N~{|ŏ M/.y ѡCIX>}:>⺞DD C&Mxꩧ,<<5'NE .xADHWW#+/7x]_KJƏ.!g+q~k_}=]vxw3,d2Ig=qtL&Z5<`*djՒ0+(V.B:OqIO)(_<֯_eJQIWt+,. T 89I؟ҥkɞaÜ5!;'"#u\{uؼՁW~t,\wlX C]S@Nt ,^ڸ|K'شiv튓'Ovlܸ͚5k """"""g@`0 ۴k0ctY^zMd{~s дi@rʸ(_L*s__5S8 0POթ#]CC`,uMխ+]Crسg:t r~|7իHGݻÇKWX ;wKH]Q+,ED%ENر^nݒ.!-ڷ&Lt0{q襳+bCaÆؿ?Sl$"""""""+{5h?rXΖ.!- tlZ֓l/HWX:sXHO.!-^z P9-JjZt >P,!=׿uk6T%f9^=.oHDDDDDDDdKvF̛$'K:cJWXzU]SII%E "#Ր"!Ah8Qj@/]B4O҉e@Vt iNRKeI3*^RUFrjy:=}&]a),L-ɚ*]BЋ0]+H1cS_FuըQT#ٷX8Q !]a)4X ϗ.!pEDDDDDDDdL&۷KWV&H[+HS~FeEidOҶml0mPtYn.r%pt i_5jH's.!L&SҚ5޽մi@z֭SO(AVV~G|ӧ|}}888L2TG$j8a2aQ=N.^.!-VU7KRS^Laa%E@@PtYzΝ.!-*TPהtYFڇ)C/+:y$Fjժ^ϟGRR2~ۄ3''o~>EDDDDDDT tSrOxC6_?` KΩeӥKH>}^dMM.!-zxCRxRRKJt4g+HNNv빹>}:z4lر/#g`: j(kW KWV9Á=+,eCᗑ<\ J(zdѢE?|TRXp!K8=`#ѝ;wsθuLj/#ټ[ jTys K|l"]AZM l)]aiV 8XWM% ^: |o~GTPᾯ=z{Ffff88W%fW_"]BZkKWk{JV&PtuөdL&K҆ ?JWzQJJ f'sغu+ڡC0hQZU )KRSE9d{TQ7p?JLz9ҢbEuMJed}O.!-\]5UtYVlptIWEݵkW]KkW0||?#ץKHFiӤ+,%&g%ާyҢn]]SoWH=ݻ3ghÀM2{t:KWXTCҢ];`D KׯfUmڨ$*J KH-վqFrㆺbbK^EvZJg`ĉѣ}ߺu P ttZlO>kIWXpA-iuAϞС.],RRKH=å+,AA;%vC"XftsARW_ݻUDDDDDDDd(F]HWXڳ0`p{w Kz5PP ]BZ~ʕ@nt ikjHo$G˗%vC/nܸÇKgnݺzjj*6n(PDDDDDDDDƌWWW4|oMԮ-]aVPڻW2u+,[tie2^^6lv풮 M5a~8ȑ#ڐ!CpY\z7nħ~)S`„ Xx1;777ݛy~Q Q,]b,Y"SAoM22ԞqOKԊK̲eˀǥKH gguMU,]b9|Ĭ C/.]tkXj֬Y__߇7&L{SjzRRu?٨Fԧލ$!=.!- e#u ;zUWxTr20>pt iFrn8ڵk6~x 6~Ez'lٲZTT#"""""""֮_fR0=<L$]a)* 9.!-ɓ+,ݸ11%Eԩbbԍ%vC/-~_LL+'ʗ/w$GDDDDDDD6o_W+,],ZJzCJWXt XHI.!-zιsG5JRDz03SqQFF[n5k (/^|5#""""""l{w Kz5=mo={JWX:xX ˓.!-^{ Gґ#j_&=/$]aq4ӛPٞ={ҥKc ٔZu+ytii#]a;+Hm+,qti5aоt˗ l^+Wgdd 88_s/n] Kk!!U@Ptۥ (L&aC K6;vHWV&-]A:K?uYxG!>>_\r1ͩTI )\\K22%KӧKH K̲ (ʕSהu˗89ӦUJN8ҨN:x"BCCEZ6oތ/^"""""""4hn(ɭ[ܹի%Ez2^<=>u`U5jkAtF 4{ڱd :O\;V]S{JziTT) ,x\r ZJPt@LJJB%ٳ."""""""0]nub ^Q@%ɤ%f6)GMOIUFz<&П;']B `رp(}6nݺƻ9 IDATd^ХKxzzv<""""""B,N.!-ʗW7*T.1/Wˈ)WN]S+KeT#=>'' @ "7XXO5spPoЫ|}}M:Ǝ+@DDDDDD ;.!-M̟DDHꆲܾ /Kj{W]S.Iժ#̳%z_|ҥKKg>ƻ8*͛㭷ޒx?Jb""""""2Eaä+,')ܑ.!-uFt 0o,]BZt #]a)"B=휔$]BZt/]A̚5 ͚5ΰ0dK:~U@^t i1dлtÇ~L:Nh`ॗ+,?,b嗥+,:,] dfJJWcKe˖Epp0ݥS 6ļy3` wm+,iti5aоt;+Hc+, [']AZ t"]AC/x{{ᅦh;;T\Y/_ti4l(]ai` * hXƍKWVӦMJWX V zJC/m9͚5oooJf&lpt inU$]b;zT(S0\`J!ҢT)uMU.]b|/%մi@zGA݋:t#GDDDDDDdKsҢNuCHn˗KHZwMݽKKHj5(]b ,^ IUkYC/+Y&v܉%K?EP|y| {ŒHnfbcKH-)S+,ݼ7KHf͌7hǸTTt iѨzڙ Ǯ^غu+^{5VZ?OX=z4.]O>5j0a0e8 DDDDDDDsG 9Rҕ+/=;GKWXPO&%I:IWXfKH~[n^IIIԩ 6󈉉1g4ogΜzMHcqk'''t .ĵk0|ڡDDDDDDd/VR{<Wұcj/=KWX:u XTIHu]ٳ%@zt iѷ/vxPNNz#G<{1p@;wXrvv+W^y ñcpDFF"&&YYYHKK*UWWWԫW^^^hѢZjrYH!%on%f;wa%Ÿq)KvVהўn3zBBKQ#]BZ۵K`Cs>r/D^ʬTR񁏏O&lؠn)]BZL?ptƍ[6MP>ȇr!]#Rq PbX mTjN.)nyÂ,X౿V!""""""BV.!-ʔQ/\tC%ERꚪ^]Ch|૯T#N@PtYAzj ԑ(nuEDFF>)Sz1DDDDDDD@Ppt iQRɝ;@xt iQ\@3SSE0COpZx.O5Jԓ..%%ǩS |+WÈAAυуܼ iL )$69.!-6U7$.NOEEIo@̚2 wM0v7JLL|X"v\?ڶmZjlٲ_>|M#""""""?|?_=EK`h Kܹ@Rt iѱ#0ntH`lٞ~[j ]BZ< 0itEewC&M}ݺuyfT\Yو,fz_dɒ{'CDDDDDDTdǎ˗ /]a)`R 3S_]WFrӥKH}W_tZ!z (=֮] ???$&&"//uRJE>V\+V# `Nʰa%Ÿq)KvVF.!-FVTHtYHt i1bzjn55n ]C5lzڹSD'\I\rТE ./Ct~զM+]AZ=$8; * @g$_ |ti5e }dغؼYz]uk^\1*&&F::rr+ÇKH GG5VM,/O]S%Ԫ%]aVP^mpL&N KkF* __İWݺu{-77_rrrEu"""""""s åKHͿR% ,ZIzȖ'"^LK*ӦXQLLF3YҢ|y>UtI`ЇIp9]äDEE!::Z:Ⱥbc365mn(I\DEIF̞ \&]BZ4h`k*1Q]S%Ezig:zUR^^^v>Cff.2ړ^[lN """"""*@Rt iѱ#0ntH`- +,] %3#]a)*J}#.NhZEVewC/h۶_OMMdBÆ  K!i蕒YfIg'ˁ,Ң` KgK%K/KWX:^-u&]BZ "]aE$kJt i av.^}yףQFhԨFe˖!44IXDD}\v }E'"""""f.`: jsg K!!ڵȑ@n ((.!- S # VKH!C@Q:zr!##/7<<X|*U ʕ+J*sn{="">>>p)o߾k׮!77XGDDDDDƖdܾ}?Ґ;wX| *|UUe i xx}J&ګYVT%Ŕ)jʓ'K̶nU%ŻkQV5ӍxyGwtݱˡ^u,[L1n߾۷ok .h>/ѣ$&&~]v FLL nMJPfMԩS>>>A&M*Ur"+Wj_=&|tRPY;Jא&@2uԐhO7ڸ\DǾi#F11@t֮Jڷ/֨R.Vާ\.+v9wy+V@~~t ٰL\xaaa77n >>YYYsp]F*VRJB ]6WOO{lڴ)P]8MDE3gܹs8{,Ξ=ֲ?xڵk^^^ر#yt^^^DHjqc*,";[FIMU{1yx>>5TX* AgB=6`4gp~v;[anܸGȑ#8upڵBœv~+|||O駟FN_lҝ;wp19rGѣGmOIDD"""j*@ݺuѯ_?+h׮d䊋Ӂ:uk7VC?|0@15YZ6TӥKٳ>Փ!"iuߗ.v;O>۶mCbbt L~~>N>ȑ#qFwݻ5kk׮֭^xT^ػȺo>ݻ{ůڵk3g̙:u`=z44i"F%ի9t V @Pc}VZHOՐjUkֶ;g\(`L5Qj//. vN5zj~ʐ.]‚ 0`TV -[ɓuV`ڵx7QvmX~=ӥӈH޽SNEVPF +X`Ο?o?ٳcvG6M/ vYF SKIO{CHWXxQ-ɚjȖt"'gϞOa2Sؾ};mۆK.I'Z^^v؁;vB 8p }% -//۷o޽{g;wD7}iӦ裏п$*IBBԓ^o%]BZ۽_0@Nq6߯3mϰaڹS,4T5~<}~W-HnSJgQ11l0T^;vČ3lrg)))X|95k[,HDr]sř3gJΟ?_~m۶Łs$k`V jy~3NjFٲE"ݶ  "xW"^gaɒ%(St ,//?F5jo߾Xz5nݺ%fغu+ڴi=zIDDh߾=|Mܾ}[:J`j& x) dj5k={$ (Ǝ.ߺuO?IWم3ѣGh۶t ĉxQV-t+V@rrtVڵkZh{l@AA+ Tii-[Ԑbz 0mJG۶M]SK&}.1{2DȦ'E`OUZDDDd0YYY8p VFoѳgOdaoL&SҚ5= H%)ׯ~Y2 +,mtMˎ⋨\tL^^FkJ= )ʕ rKӁ%K>_dXvǥ3OFT#=> @=jYYeJHNNFʕv0͛c?FDDD#Ff͚ڵtlٲ_>֭ڵkzpww2e"%%HLLDBBbccK.!<<Vɓ'{a >.1KLfOՓ?y,]*Q8IIܹ򒮡ª[W L.1}7O]SO>)]CM"WBB>3lٲׯ_zV_K.ui"T*Uʕ+lٲpss  ::QQQst2rrr0p@8p7!BV|}}Ѵi{lРjԨ p|?TpIIIݻ7?77b??=777M6hӦ Zn:u98vZ QPP#F… (sR1G=a~tYXp!0y2Pt X{78 ]x8`lO[%f/kq-[eFzz5* ?:U-CLd'r蕘^z=p<[v믿_]:&9997k~~~ *UN:SNbؼy3֮][O]|XlY ;v?N:E(]t=hݺ5Zn>| f̘ŰHbb">c̝;b4|%f0~"Ttim~!>$l߾'OFV 53''' 4GŦMkѢEyM IWXڶ ؼYuo Urfv`& ղFcati5~<Сt]u+tcwCl^?""B*WcǎYfIDDDWfM;8t"""`兖3rqq|ח_~iyG۷~."RT!C`M6r=3g`ĉpppڹrrr`㓠n] K?,]Qbm޿[??X4]XKm`pM5iJWV&#]a)8XO5 N>]7^#DDDd˗ȑ#h̙3 BllUAT… ѭ[7899IgYUq!-wFnIR0w.Pa&.Xd?zu`6:m`|eҢvmėܹ,Xp_TzH7MI..^.!*JɅ K.믿ij>ڵkh@xWc„ XtV 0WΑ?V;>QIv~Ȯƍc޽V{Zbrrrrl֦ /]a): KJ>!!ye˔Q/ ݸ̚<>d@O=L*]a)&9S][d{|}Hԟ}QQ%Dz>}0zh4nO>$^u޽e~! tGAAaҥ8p_-!""*Ne˖Ÿqp%sVc8,صkW8ܹSA tKԓ))%vNZΝ[c~Eti\"+ S:d{vF̛)Iԩ0vtW9s[K4Wr d!<<k׮Oµk_FIVSfMWZ%:ٗcذaw׮]o?ہM+RȩSXYaFe+; +H+,_/]AZt,]a)$$z=fWZZZz\X^\×Jebɸr OnXC GGGݏ}%8p@Q3<<W^d@&%]aiO*-3g*ozmXU6mR/M&#]a)8X 6}$8غUPnUn^+((… u?,\xQ:j1rHcƌpwwN*v;wɓruYDTrժU ?t?u?&\tYVZqҥn..X;:uM9"]BZ8:!Eժ%fj9V~698?IAz5t cW ?k׮\Fz;w*OAӦMqY,[ 9qƺwݺhر(UJ߿z~%Dݺꆲ$'WHؼcqH[m͝;@P.]BZԨ%f))…MUӦF ,^ t c |hNN^z… hC\c옏3 lٲ1c u?.lGgЫf7n@P*ҳ/²5_ԱJPL 0sũ(xTB0{6pt _Z?|}}ѹsgZ c˗1| """*&}A6mt?}t?&Q^t=^%L9wHؤV!g'',4 Fz""yӄd{:uƎtKH +,EFs AAAz~~>݋{3ϠI&Fj *B \.1336mXYGľ}0yd9} 0@c۷CDD]vxQzk@b"PtuڏiLq8, sHǘ>dqLn(<(]bcy,Y99|hV>8P*ٵ 0ӍxƌQS}~Y]SFIFk知KSԘ1ώ7vb"""")Sus%]GDx'u;^vv6u;ِaC K6֬H?__NcWT#ɤ2``V jTys K[_DdC/?~<ʗ//ADDDdU=zxH^Ddz>Ub+n(W,]b9mTdc""s$ҢC`x KjH ]BZkL(]au5L.!`C/~ ggg""""{蕚 ##Cc)SF!٨A^t8l%]"./?nn;V*td (~{;KO.!-^{MRXZ$t 6lt jI6^Dd )))vpppxd&Lڷk~t͛q{R?*UҩȆ3nti5jz:H֬ KHÁ=+,W"q%bQ^=""""]UPA4u\Sc09F l.]!Rt4ߚ5E:Fz.:ف͛o NUɖ-٦ɓ-+,mݪ#Tb^s'st\2!<<\c=䓺섓0mPtYn.jptI/(YQ%]ߟOuQ~>W/HV@fi{KH+ [WҺuT"!%jBfŋ1f.yHDDD6/33SQvv6"""t;^K}F uCHKKoΞ-1>>^5kTdGRSE9d{TQC ggt׹s%EŊE!|_~%ƍg}+VDFPPLq`ܸqhذ!ʗ/&MUVxgO =6o\,=Dd|z-$$DcUPC/zΝ1c+,EDs窛vo͞"X44 Kȑ"#Ր"!Ah8QYlU6t(`Lb(`$KFVЪU~O^^ݻwcҤI}Ϸ~;Z3բwTTW.BT+VPĮwE &` {Î{DEPDqH&Rso-ֻ8{q'55U9&&&r?6)) J^bŊPb#=zÇx%իWLܸq7nIn:%$HU$/LBÇղ>zDC+\$ÇrONN}wɓ8TMXZۛwO7mߡ~zLN aZA88cjnIr~ [͕̚DEUH:::J.kӫL2jF(]vhݺ5tJ]vaܸq#55U/nnnXjhY\]]dtaL8?|/_^dׯw.R:B:(Y^XLB۷o㉒{[nݘ"n * |w~~f 1[*U aHct%Lz|F^Ν$ǵk90q"; )aÄ>N$͛I.#$6W(JWW˗/'I5Fe˖}8p N>;w`ڵȵv%' ---iSBSj_~"Bp(M\1 ?_KK `h`0\\y :;QԬY@ƼS:rDx"itaC)9~\Z3eF֪iڴ)*TPQ `ڴiƓ'O7600@ƍaccSSS܎;"++ @``{T+WZBrT' 7ƤIG{>DVV,\/^f͚z{ӧOEHgϞ!%%Y5j0E!w!b @yR8ڀpP*{de;w 3)lmyabs8vR5v F%0x'dg ˙NC ̘{;I{1eg;$ 8<?ǏARj*SSՅ!uuaT `Z*. +33T(]&&k6?}oވS_ ;w杄h8jzizQK"7o"::woB2001qD*GѣǷ?~V¦M iԨ/_{{{ޜEԲeKl۟CCCkILW\uf;k^ ;B4\fdS:u#]4i7ZCKK SNeR1K\PF cnԪ;R>}7*UƌaHLMs.(wv$% {ƙuNC dɜ1M=́ x&":^ (a_0 +ssԫRMQLFFӁx뱐 l",ڤ 4DtҼ#<`ԩx)b)ccc\znnn 7rSF _Ǐ/FݻwǍ7ЩS'lxB صkFsfffbʔ)6VZm_CBBrՄ>(RA`B#+ݻǬ^^Р_t#JSG,%?߸:y|U)S`bl(Ԩ!H`J[I"VR^ q=BefeƳgpݶ Əe>oڅn1kx@ZFB>}±7p.?Vu<"cc?A{֬y'!^>>>~&N;KKK:uJeYV^-3c]]ZZZb޽(Vhyx5kε\%lԨZjsGo1GQ>}M%7---k׎Y=BHѵo>{`ѢE"M`$)d}+4)^DU%˗qujto?i(j8:N!{` FO3BCww,+DXc~<4৯_s ',CKGGw/YRI`L!&#$DCQK4nӴiSޑH.Z|6lyƏɓ'k 37 NNNS*W}" !Eff&zk׆%zĉ1b% Z!yߟw YO%%NR(QqqpZ^%u_gO` )dx!,; QDn/N!k`:,' |QffqK߱5F@Iu$ j.ȑTD` v- D3PK ZZZ011GWJ#ݻwԩJƓ> |۰accc$ȑ#ҒX9sϞ=cZsR&8̜97ofZWWW?.!pq|wз/$:q_Ta\nIY˜wGқH3}֝;8vLS11c~9z{ˠA(idN>uK5!q065a= //o?W\AGG>DEi&n~/{yիWs=-C) U-[2I|8r֭˼;Znͼ.!77ʊw=@"61X]^zz쬒6TTw Y{/NAT;{sx /!9˽a=|8V9f⹺֪ 'ӧy ^&88wRWQϥ,۹f͚*NBQW݃ӚCռ Odgg̙3hٲ%~'2?ѣ1{lu T,:ƍ,M۰"#1oԮXQ" )UJSŋN#9Y3#I"&f<[h2q"@CCaLF[JkV#Qk yD_"***c˗WqB:ƴiӘ/!D߿amm D>}i&jլ)\H`J[Iv(9ã^*=`DTTTz5; QDT)֬{y-Z8:b-y*_^zSu@P$DPK!%%w BH>򛍩, !ׯ_gZwިVӚgbhԨ*Us犺 A֭GG)d{X!4$"1%VDvv5 |3BCww "w&M3yxx>NB##3˽S6Um Sye&DN)hٷowTR*LBQGɘ+5 ! HIIA\\|/_ << ‹/š6mݡMgEWD*^:6MX⌳6ǏJ՘ڧgc(u&̰ڽw_63fHk<".]FΝ ֮fJ䝆G@` ZLC CÆ?NS[>\^OO`i-H 54D@@:;!oY$}@$`ɒ%xӚ?#6mʴ&!D.\@Nx!֮]QFBQ&1u*`fLp\Gt5' IDATR5*.#F . .(9;IaLMЌZ3t:u$9nmLx!5>΅ɘأ8PU./¾qS5DiB 1z#'X|9R[˝R4o"0kШvT]BYkalh(1h֌w Yǎ>>SE99-[N!))H2231sl|Vs@QKb̙W޼y;!D#BPRR6"VP>}ЦM5 !D^FFFXbnܸڵkCHWWB)d\n۶'١.ҫ+P ֬FR85N杂OooL۰!@Z Tij$j^j&-- DNPfMxxxEtB{%(bܹxӚ`ZB䡧qט6mthy-"5Jnn@⼓HNGTz[/^`ѣJ0+Q+&L`HM VjσE cJJ{ ޽; #G }\lܺ; Q3R_ܹsQ|y.\P҄6xG cڵΞ=Uv1!DaҤIx6mڄrDHުU.(KITz5>,c2rD.UQ*5VL_1E&kAA.L${`YnQ+'8aL~; Q#/JMMűc???jr"#88!!!D||D (N7$9rT>xhlm6E кn|gm&hbm AC׮aۙ3rŒP`߾˜Ui|=|l,.Vw"a˗رclق(qQ{aĈxYǍaaaDFF"#/\o޼֭['Y.pB͛7}%-7AHo>lذy*U`ŊB?|ӧc]6u놾}y4ۃ3&ݻ8v 07 bZ{@xլ ~bHC99 EIaNBS)Sשy'q:5|8:hW>zn^_3x)el1aq7eh(ƭ\}5a \,rpASGNB$Lw(%%DNPvm,_^Hٿ?ڶm+*Q&Lg"11x glٲVVVԩSqEUAi }0## cǎe^W[[;wD%&ܼxhٲ%*U}w,B T;}癕{?W69;CG.9BӼSE5kN!nW a~{TTijvgeK8Wc QIGNA$fzϱk.l޼_~9sٳhӦ 4hҥKT 111Ell,"""p-ݻQѻwo$%%1=k,iӆy]BGhh(-[?]vŌ3о}{ޱ)cc@B4`w%Ah)9`vhTR5sTL 44aI:ssY3iHa 3Rl.-E?!uꄱ]ajO U,-mLL c<<08XsN߸͛jk cjt -;T*+K坆H5DǏK%Hݻwcݼ0; <ϊ+lx8Fa@@.]uVZUVywpp<Xd :v(V4Bǣk׮M4E%‰'p nK,Avx"*KVV"\m(^~V,VURQ0oj9*ilIrkT?4)".NS@ {ˆΝQHsZkkY.\ aQZq^~N鎩2"^ M4AӦMhޱl߾kiiDž?y߿!7ggg;vy]---l߾UHVQUA4ށPvmlٲwBS ֭bc lYɩJ~\bHraSp0ft^$ӡ ^JyFx]hkv.٘;v6mE;B޾VrDhyC}!A*za``-Ze˖UahhTTÇxΞ=0Fs~ |!6_nܸqG!Z k֬[cegg@JDGGcر8y$v؁"LCQQu ر<Е#R45r]\WG7C)=`VQ/שÇy'!y3w(K㲇:ϝ;/_rׯ#(<˕?$)Qί'O//Y+yRP\\87 5~x,]'33!9KBpt.(Ki3g}s6gDaիpASRݨJܲe52k~ر˜xv7~<$DUHڻw/y!M67a/͛zkkkhiizǺYj,dgB|}}1rHdee1]re8p $D4ocR+>>HMMEdd$m% 39Waz 8uQhUWW`ta)8ؿ_C1nJ$$'+un-Z6mA1$9TE gx'q0zD42©%Kld(c~=Æ<..B㫐[f"^r7֯_/ׯ|rܿB˫"Hڅ 0ddff2maaӧOܜymB_%J@&MTrt~o˗q^%(ѣSy QHӥQZm0Y\IP4%F''j\ 3OMFtТ4s23;1պ54jǬD Y:IJ_I:u @u*< %m; Hw) aeeSË%ڵ /FFPBm[nů;!̭[ЧO<(QΜ9CKB5 v»wS*{IHH@Ϟ=q T \P`Z (Ca_eVO|XPErS˜SBB[B t VŦiD}ҥdn.NIiD`Fij$*'W9iʕ+QN4m^^^_ưvڰ`޼y>޿+W`ԨQЖ.BǏѵkW$$$0mhhǏqkB`…x]>}9.)) z+)-EH^5fBVx8]cWDGZթqݺ)U^=I!%>E3S$"Bx D- CV}YSz H` [I't:֗/_Ɛ!C`eeӧŋcFXh^|ϟŋR X&==dž 0rH$%%D!.] ::ymٳmi BxBKUƗ/_гgOʼnzB5w YAA5ߖ^~,N߹TI==l>ZZ,t;7oի_y'!h8w Yo+WJg9O5fǡW{`ր#+{`*F"􊎎ׯ:`߾},5Ċ ƍk׮˗X`j֬ @X~;m&J4Hvv6h"ڢdɒhҤ &M;v ##wDB[hh(:uO"l2͛7'ڬ5qU4h@~cƌ>!L ;{['ظQr AJ#rg͛I"~IWR0&BX4 Ay^W`왰ԡWq#Wvv60`XZZbx)Xy244qqDDD`ӦMV.wSuԉCBBŋ1vXXYYiӦXp!;!(ӧOûwD鉑#GRBզMܹs3f F Q GGw)9s]]䲆u+Wl.L(Б }x ;VI(%/{N{FI##5 03FfPիΝ@v6$DL+""˗/G5`oo+mmmn6m§O~tzzz>v*JH[QQQXbjժ;;;lٲ?~v;vļyo>ܾ}䘘B.] P;-[)SRB K__8y$J,)9̙0Qjœ׉DpD=slBqqBpDQ..qRrp0j&0{œ9Rrp D4镕sΡo߾PΝ ޱTNx=_qơDr?r6d,]+Wƌ3oʔ)ggg\xŋ1h 4oBHbccǏR3g( !DG ׎3󺄈B__lj; `/DZwoƆA%]]Z4$923I\]rxȑ %!ػ7t^/t Ɣg0 Zt)W.]#x f͚+++jrl"cǎvpssC¿([,֬Y\:t.EHQ3qqqܹ3޽+J}''',ZHڄ‚ _.Cʕ+" ++͍w LYK#!J)SF¶R /y'!07Ɣ>$9=D55E ּHӫT)ὯxqY, $D$NDD;.\mXU !ѧOݻ7?~)SАSBBQNbb"z;wRԨQXr( !+(-ŒjR0㋓Yt(D3UFD(&fM%%ʕH{#k3 (ɩbj\r0޾坄L#^R[PWW;vɓs=^zufqQӋHYFF뇹s"++KѣqasJG!KJJBqU8~l޼ZZZ'֪W___3/]Dz;V姍0A;G˖ *fڶ&oU(I"Z_wB"2wѧukh36[ea"4pwDcid+88w’BCC燥Kf͚1;ݻgj,GGG~{{{{lܸ.BZrr2w˗/R~¶mۘ 'U3֮]˼&!' @5JJ5Wয়}y1$%NBѫ0p =:LLD-(KUAԽ;0t(0,z%,; Fns1 c~ }-[e˖eVVΞ=7~{---xzzҾ]}ҥKҥ G5o<!.<<|'B6,Gs]|ADt 0ǎ~Æ qIRBxpuueZ͛+ӚD2e A#F($˜$GB缓E*%4) y'ɑ$ $V7|aS))}MIlY'kzEGG#::y]o^x9šyH%)xDdg+8FH>gff֭[A!ddd`4g IDAT8z(4h???RBx5z8Owuec#\Pf%_ְaŊڧ8DjeL)%2XxwkkI!%_+WoN"Yf%JD%$'3*U7~V޼ᝄ0qM@jԨݬ.OXx}M-9?/_xzzzͫy-{ܹSR_O !D2331b:tHjٳgajj*J}BIKK #F`Z֭[LR&N!CVBak L;w&Ed$$D-[NNS {Mi(+ssfSR 5cۚ  W֤I;v Shf>zqΎ\DV:|0.] }'HMMŁ |7\kTRyx"222[Qzz: l?zQQQf$%%Ȩu-eбcGBĕ#Gb޽ԯQ.^2eʈRBk׮psscV/ Y-BgaH7)eԩ,ޑݡ/Vy.U kՓѫ02Ϟ KN(pн;;IW 3\D70`V+95Yo~Qxҍ큁uYth\KGG=z@=c_{Abb51c hBĤ(t/_^BBB憿K,prrkײeгgOUTXhh(֯_S[#%%ƕ+W.ϣzGӧѷoBG`` ߿qOOO :NA'I&aݢԯ^:.]_'_>ŤÇmF"DeƏ.(_; >8? ?LUdZ;G /\C cIq+-`v`dD4ՠ~ظq#ñi&/ԟ:u -[D&MU!T9pwwСC!Ǐk׮شi\CvsB-צM|Ϙ1K,ZBBQnoMÇysqq͛R4DNA4ɜ9@ÆS~z1h҄w Y N!9Ɔjed =#Y=΀&8!ЊDD7nƍׯGAFX߿c֬Y8p Qn]&͛7G\\q}8rw^8ph޼9V%KbrC>>hݺ\GQR%̝;"'%D34jǏG~6qy4nݺزeKc6!$/...Xz(˔)sΡjժ')c"V-2!X[KoL}\)BD~UHoL} xzoN" ,^ S lg)TP$L200@~Я_? {w6 |˗/;;;;hF7m8}t :T,rl۱cG|>>>8r߿oǵQR%ԫWvvvݻ7*VoaÆVZXx1.^߮)ڴicǢ[n=?ٳ ]nmLMMq=&,HQyaٲeԶj׮-J}B%K2W7BԎ-0e v-$DSl 89"ХP?_MAKf̜+x',XqJ%0YX1fո10k_9'33'N'PvmL4 K_ω'sssM [###9#Gh7v7oǏ~!=BWWMh3!jk577lllDO!ؘid,EKz ah݁H`>Ir| _̜ 0~o * N;I@`:yR4\dggC^й3%,-(AA59@R9 caas"88GEN 8::|0a=z$s<22ٌ7/???\pϿ"DLLLd211)E!߰xbQj*U gΜA=ڻR1GM/Fx dHK)d;vYYE ;\ݺlʬ*^0hгjY{[Q+:::իΝ;/^`ԩr-ÑM6aÆŁ\Ϫ{{{tۏڄBHQ_U%KĹsh(!@R1U_!D6䝂h3}&oLJw (ggE )d8QdgʾiLhZϙ3S9PKN5kիlذA;1h o߾>&&&I#BHZ 3g?f͚RBMBBzg"9@SMT;}??)\]jxup,*z r2LQϹ <;)5 &LǏqezzz>/11_|ؓ'Od!OOOL6Mŋɓ'ѦMQB:bbG!cb"\P64䝄h~Ɣ^?//CI"r2-@@$*uS-˴ )SS>Mztۼ|PK ڵ޾} /{y"""A!5[l( q kN>}Ĵ"EpAVTޘXxwJ&@P$*üeiɴ^XY 3S$6Xc+#5(W-Zw;++ ]v'>p{)\B!(ڶmƏlǡCСC !D1DM/RdjL;$͛ӧN!`|QƍYxxxB##myԯ/Oԇ\PӋ!=== 0W^ŋ/0uT|}NNN([,6m ˗:'M!I;vرcż>|}}ѵkW !D23ʊi=B$G``)&qp BV` n; QDQS Tl,$|i===Ԑž;cN!`jzVZXz5>|+WZeee! -BڵQ~},XyoƵkXD'B47ƌ#JKOODݙ&Mj_T^i=B$oHK)&[7)dݺddNB1hг'nx' WckkgZSa}N!}a߸TIȿJ*ggg899ܹsXnN<)E'Oɓ'Xx1*V޽{W^hӦ ?ƀDYB4СCɼvލRrG!ʛTJ*3g_T=D++RX^Jl!_ׇ.h&&j1 DF 8~03 ᝄ(QS7oNiaL ; sBCqk5[֮ʹ&M49aLImvcFM/B.]ХK`ƍغu+{xzzƨX"222$ʝB!ݢ:::صk 6!hW2fy"1xۯ7_ xחY Փ,WWa7ox'ɱ?`nNՕ07c-)nTka^Si{缓+ !UTnݺ5s~^B9AƎ;0 ދ^H+YR'~* xyNBad$%y'ɑ*,p0Q!aLIiVvz:};p6$|ĮוL/TҼcqwjzqe``~wƍCCCޱ!si 4kkiiaÆ :t(ڄiôf-#DT*\_ի5[ȯR%鍩` (w++aƗ01ӦreX3L2lgm 7Wx')$4*&M`ӦMǪUPreޑ!pYOHacY---[ƍc^B4ôf#D-5o.,&%>@D$DfN!+, Xwsy#.-5g@vdn]%%{_h($E5$TRprrBpp0Ο?ݻCKKw,B!D-?{FJJ ZZZĉ&M?iM333Hq Bxpp BLxI":wFBV` v0K;;`)dyxzѼ($+;==)7ڶe^ xZDENRdQKaooǏիW3gL-!"q׮]C>}Dix)SRB4ю;35۷om)-kCo"4MaU%*0x0Уnx'!0Ӈw Y Ɖ:ؖۇ/_2[JԮXy]Q3з/?LJ❤Hoj˖-ûwaԖBk׮HLL%K0gQjB&… ׵g^7}ܡ?x{NA5u*ЪN睂(j$M)d;;Es)Jm/m_:N!ES^j&LӧOq!TZw$B!Drnܸ$$$R~6&|>J^B5gy rsjB"Sw Y>>B^ CYkϗGNQPK ikkӧO1vXq!ɸu~Gċo̙31|QjBڷoünϞ=annμ.!H\$$9RS%x'!00.(KitaLݹ; Q0,,x'ɑ!,z$z.s"Z=GvK)[gi;Il`.UIjz1CCCxyy~Bڵh iӦ᯿6!h7obܸq1b(u * $:X杄(|y鍩X`Z 0wKKI%Ã7_L y#N uIoa!L$GBq#9$E541l01!n>|{{{DGGR +V6!D3#U 7?Ç e˖E.]%$EJQ&̙S <<y'!h;w Y?"n]%l MD:*Y uvϟE;GvP\9DZr)V޿睤HXz5LLLx BTǰׯ_E?f\Rڄ kkkxyy!33wѹsgƊR6!K`H)d sDz "ƌB֛70 zh&]j XBB1%r4:̜"żERcêA@4+h%c5ֱ^{0&$73KL,b&F{FEQ"Hc%9٣&(>x+/p8;ך,]a_%^Dr0lADD.^Ν;#>>>_裏wQ6DFFbxk.X`q{CͧW\ya~6t(гtѱcK%C S.P @S59zduSVt 3/G!C0wÅ yѠZ51@_S۹X1Ν.)t8""""p k]vŖ-[xl޼'Zn_8~8233{_s=QFѣÿ{=Bqcݓ̟ܺҭ` ?|Ԙ` *Jtԭy  8wW˝;ԍZ(+ ?ݸak4<>qo+U ;z \\ EԮf,\ugLDDDvڵkuyT IDATp7ʔ)#ALxBBBpqqAӦMѢE h͚5CժUP?G_{ 6lg QAyum*WŋsmHӮZS}$]bቛt T6Iꮽ|`pz)jAmuN'}=8E==Q %]\0=iiILDt|@|?Qti899YYYHKKjݻw8TDo݁QKHDŽ jM}tjM+]B:ƎUCK잃Mɽ{K5Jkuw\5 D$&&Jg䙿xץ3  0szY!EϞ%bQC 3mmZS/$]B:]S[V_^SN1ٳΧNIp\+"@DDDDDD[>>>x3΀!]b ] 9"]B:9Z^^%6YYuj MOK-'GG,<eUJW9#]`8"""""""SpttIJeA:奆frt)pt Tk*gNd 0Pt.-]`˖ä^ŞlY5*YR&#CqEDDDDDD+͛7cҤI)DϮ ?3KHG[SDEoo_ _|Q:żj0)HTݺuc)DԾ=0~tQx8$$H6m@988`R^> *T1ٖT(pEDDDDDDb'NE<0 VRSKHG>AOtQ]2?X6e 9;K؏n݀å+(pEDDDDDDbŊ/~z49 DLk']a l,]AƎ:tx_H b8r%7n,cFP/kzQqqq.^9T\. ]@FAAgIW.__Q# O> V cuÅիֈ($dfTЋ(jժwww S+RF˗/G2e99"]A:,LdeK.??+lV`oKT6Eoo888H+^(&+c̙<+/Y,@C/"""""\۷/nݺ}aN2bŊ^éSn:T\Y: ZZt)pt Tt@r2|9pt psSkX1` yk z5 ۶Eg4U<<7t(m؀%'tRS3tiQprrBǎ"::ĬYP^=4+Vo7n`͚5xHRL 0>%]B:WC 3sGHQLbc /77C~=>.Ŋa@۶;q#5 ^nnY[j=E¡QsttDv . <<˖-CQct2doߎ̛7wMx8$$H6m+""Ԑ".Nt20etjFvFŊ'#htF-v놭b?Ag˖p,KiS`l !ݛNDDDDDT8U^&M¤ISNСCow!))I:Q+zs(^tYh(r%0mbだ gնtӧ%JHPNꥆ%6?Ϝ9(UJr{w8ǣ h Q}P 2d*S5*VDڵѡqcҤ jV$EХo& 7o͛cFHH>'ODJJpUX[FVкuk4iEcʉ`3FtH</޽%qFV.;{jDArj{j_p?\p M1q[ҨX<+_ WG5РZ509wd4tZS.]B^Kg`0dHnS֧GHЋL>>>DDF>} ߻w_ܼy񈏏GBBC$''###Vwޅ+dɒ(Z(QT)B 򂇇<==QbExyy,._YYur5O]TySDZOOm[TdtƍTX2_ԵkZ?5M7mRΝYX,Y@Xt H2eаaC4lP:(w?T֕rs]PNOQWժa$$5.]B:*WVC 3{XrEtTd?Qzح[ ǏܹsdN$""""""7nٟ-9f 11%iSuƗܼ%IG(:ZhѰ!_&$@pfϞYYYO}\%зo_L6 /RV3g%KJPNڸQ%`r5<1vy=]qqu%6aa9sek(:vTkjjWŋ@L[0Ro#g^P\xBTT>| $''۷oGƍ|>|Mk`ƍظq#zTZ5oC@ĉt ȑ=%6!!jMM8:JPN .(tѣ<ɓ>d_Vv.9yR)SEk(Wkjvg^-Z :u iiiے?O;wXf DDDDDDDc:~@1kR?.]bkZSCHi#GKl PC9?'SK٣~O)]B:&LP[4:$]^Ξ=~!G߳n:/߿`ٲeyDDDDDDDd6HW.^]hf`> Ԭ)]a-]A|}:u+l1]3~~@4h"Ϟ˘"""""""SHIVΞ.!J ʥJI<|Zt (QB]P.W.G?-tW#e_Ѣj@.]b Yc)QkBg ^ŋg˗ׯ|||~=+/XV3W\ɳ$"""""",\DDH?3IHpQJה5R~u.t)rR%wO˗KHZSNlٲǍ7L2bg>)SѬ:LnTkmѤ #]aTtt h|`| *JtԯvW.hѢO~q%̚5 %Jxc/^ 5))]4u놑#GSN(Vcٳg~-DDDDDDT\,_ܿ/]B:vF0 -KHGǎ1FWK;o']aLMH.!m'JW<8ʅ={ ==;::bѢEضm*~III k:::Ý;wW_aڵػw/_nݺ=BHn%]B: z0:rXVCg`W/ 'իY_d0 U[>|(]B:U^뱯988`Ŋ6m͛ __P>S4im۶>FDDDDDDΝ@LJ&2mТt_[HW)SV++Hĉ3 6m ]:HWjzitN>x =:[ϱrȑ#1bĈ~x !""""""6IW.YS(0ؽ[tY,@:F[*'??A mۀ> ]@F^Ǿֺuk̛7/[?…%K:w 777ٓ!""""""+V<>(.(+']b|1pt (ZT ݥKl23֙GJ"EԚcl ܣGjߐ T$]Q(qرc`8::fԩSQt?|#7onZhhh^Ȯ$$@xt RE]P6wK+WKHGJ[SIIjMIOO5(bŋ%]*ZT1J˙3g /AfͲ9z*U z_V-wet͛?pt h3G(:?_OÆjHa&oSQQ%AugĨS%N 4>իW655r9ͿlٲcbbDDDDDDDv+, X wOtt ds dOqFԄѶ-0qtQDp!?׫NjL"]Qp̽{"555ۏݺuQ\py͚5sDDDDDDDv-- X 8yRt-.(ϛEed3.!NNjZtͣGjMH.TIj֯.!]f+q襩J*lܺuڵk>|g/9 wŋ+WKHs~~FIIҥ@6L&S0atQr2|9pt pwWEKl<>8^t/.]`8Ժuk{{~g"""in/m׮*Tk>vW/KDDDDDDTP?4j2۷ *Jtx{K<.&X.!u ׯK84i{hѢy!333ۯ1x53|3w*WK;t']aN5`" >^tjL,]at|J(45n~݋M6eK,~e2d"!>>>pvvJ'N K}+NRƥIPaq b"]B:zrxC;^mut QK#FeZFFzEܹs'՚7n\]]H/} _Z*N$""""""*v+Hĉ#n^ or&z%+Hט1@ǎF96Md8ʅ3gTRaƌpwwG:uPJHJJ:;;cƌ4EFpȑǾ'Ndu򜛛t֭_JW.__((صKt4l(]a'JW.I ;ۥ+ ^PBO^ZZ._(CM'L?OԮ]q){geeg_(ϼ_5ѣ%I <=Kl=Rk*$DtY,@J6V+aCT"]aaptQ+N>}UV c_駟ZBZ[oƍ|{EtttHҀtQRt)&]B:*TPVr2|9pt pw|}EKlYL.HrԚrq.IIQgƝ=+]BLo6mB޽s\KƶmPlYGcܹst6XVV>6"""""""mfr6ܼ)]B:40ߚ"#KHGݺ[S%[ $.X.!7z|s+WKO8|mڴ֯_@--; A<<" O:ZI~+ΜQ[H޽+ΟW[>x ]B:z 0tImɚ,]B8cq!|5kիyzzwزe N>&M[Mn@DDDDDDf1i7滽{M+H@F7JW1c+6lrp ȑ@׮F!!ڵ@Vt Qr(ڶmmŝ;wPD =UBԨQ㱯)SbŊ|~TT 5jԅ IDAT@͚5DDDDDDDb,`,mgOajΞ.vw#eZS%6۷滻g,MٹS)H z'''TX+V˗q ''59sGF֬ʗg% _T۶5SQQ%665e){Ԛ.ٴINK7$""""""WR88Hܿ|:쏇,]bb2]}j"]bΌ3]}K5UtÇl.!z?I]3`| 2Rtԭk5 ,X\.]B:ͷEue_[S @xt QqGۘ?>KܻwO:ȼڵ&L0vM]P.!['KW]Tlt h6M 573͚m$* 7D8ʥ˗/{R 9s7ٳѣGxyyҩDDDDDDDԯпtљ3ʕ@jt &550iҤ,#""""""3ǫd~`& 5f +F~ _X%c(K `Z +Kt t.]atf )]BC/M5o̜)]aoK_̑0VKC/M9z|-жm|!""""""* 0:w#=ٟ=C+.^>@mI[7` 0`2=ѹ30ztѕ+jM%%I!4UP![srr€! cW^0[`zj.!F]HWkYY%cp{w #GԚ̔.!C!;^ K.45lߛ}+NRƥI+Oxxxoȑ#޾}PfM=gϞͷՊ{/ߞtQۈɎ@Pt9Smwh&l*]ANU۲@`t4 hFh^`f "z];w{iiiXf 5joooL>}ѣ\vzz:M\?]XU+6m ] PtQ` ][hV5"dKW!=0'{??~uؾ};Oʕ+@@@XbX"ʕ+WWW\rpr5qqq8|0\""""""z-.͜ P:uk 58;;ÛGF?#]B:6fϖ0y?uKt4nlA*֒Z[d'52{*2RQzijРtVF/˖w5J(,Lݝc)g^y;V(<\ݙ(]B:ڵ&L0vM)lI47ADDDDDDDt&]a꜓L1t(гtѱcyp 4G)`*u~ٟ~ԇ+Vs. ;(_<|_ ݃oމKD4-::{8gdLuֱcO瀇0dt :SL+|w7RLKݫ֔n0A7%65ePK^DDDD/_756I(wd^5\oش (_Yt¤KleHc!ŋ%6AAjMFE ϝ. RF*&ooo+VL:T)5(]Z&-Mmvt pqQ]]%#X\w5R9;~~.PT۱~t ppPKlV`z!zFp DDDDDDD4ժ f,Y\*]B:*WV$) X\wQyy5%uWܿ|pt P9;K$'}dРA3ӭ&n:\R:RՑ#GdɒB5DDFEF;Qa/Ξx9Mنߺy1C P!+QQ6nmTQxqߨ\QyrM///s;wٳ]bc ksC\^Ov Hge[hhtѯ:H80TޙCyC) WyqMQ^KKM no z>t=3xW.pd͛7ǔ)S3*117n!C]Ȧ#DDyvx~} #G۷+Ud+Փ0dyQlY'8~\[7kIsmujtԽt ' ơW.ԬYŊCZZSSrei?<ʕ+<<2==111ؿ?..]K.DDOuEkܹhԨ`o^DTxq ѣ95f^U:ODfp*Х гtܼy08p jժ%XVZSI\ t t 30W/]b.7rKz傓ԩ3g<=777,_G"jŲe0m4deek5bQk ㏁ͥk(??bckL`ZhRrUk*&FF֭֭݁kH/k,wZ jMk']C^ԠAdž^%J L<ׯ_& +ZQtҀ #''Uה3P3.=##"~UQ//{*WV9sKl-ԖOd_l=`RjזTfRCL3HN/WC njlo TJ GjMqC#^.=\3fl5k,,\=*&"""6p 0rtK`" Ly kH_fz_Fx Ĥѣ#5j,ʆƍ.Vk7@KÆ{I?*W__ߖ.sǶ^rvmugoH 5Ut 31b@ 3i.!}JW=KI.!zCHW>39Ytt .]at2lpt  jűcǰh"khӦ jժ*U ^^^miӀ-+زEtM j%]ag(]A&Nڶ0 6m ]:HW<l ]AF:w0;`zj.!#FݺIWzsڣG%d8Gʕ+E1c֭[ÇիBbb"bbbpl?ӧ /`ǎXODDDDT|}5+ݻ+Hԩ#]ae}40 >LtIWm|t3xE ;mۤ+H̙@Fv?^ ..'ND:uyxxqJJ 3gΠo߾hݺ5.\gODDDDTJP˕.IOW[?.]B:U/wwL`QZS*Hde!!%x9 ظ8tHtUHWm8 ]A|}ե+6m +QFg̚50 K/>V2LDDDDJuAL.\.!*oMݻΣ .!jM99I$'ss.^.!nnrѢ%6~?/]B:ʕS%KlRSՙqOKRԟ}KKؤV'OJq蕇֭[nݺ֭[YYY{c_OMM믿!C $=j0W$Ӱl&o@Tt _|k*&F.!uo@ ,XDDH5ͷ぀5QIb"d pt ^yd=zt"E`xQmݺݺu󭁈(tc7+W_3:IW %m[`D `B .NtjL"]at|J-ӥ+"#Հ>&Ft4m ̞-]atZSoK q9^{ YYYZQxǾ7_oDDDDDfW/ 'իY_d0 V>.!}ue&gϪ-RRKHG^?3'%{w`p KԖ|}9R(,LmG$]B&áW.bذa(}WGGǾ3fhQ2EL+Hĉ3 V}7NIh&7JWѣΝ+֭x}1U($XxHt !]at(@_'s+-ZBXbҥKuV*""""<`NdV/+HРtѶm]Wg&||t3Gqi&;vUdf50ڵ  ]Ӧ-[JW}et^? G[o͘1+ """"P|Kddw'=*]B:QC OOG5k;>Y,@J6V+~CT"]aq#ptXե+6m ] -]ae {t^&8mڴyn;#PDDDDD*URC 3IJRgI ԅ"&pr:ETѢ%6Ο.!ʩ;SK.IMUgƝ>-]B:JRJ.IKSt pqQkU&=]msxt M_^:%K)]B:Q$6X.!5koM\SZ5TBZS%re󭩻w՛Ӯ\.!aziAx 3'%%a^&""""{֡0ntQxP ]B:ڶ&N0-KHGV)Fׯ5+]B:ZPgIdzGLt hLe&7o5ut h0Vk*:ZqoţG~1ԩ&L[0`Ӷ={|׷oߞ/GDDDDT`0 U[I}պ23g+az0:^mut 6L%%%kW`H 0uwNRt 3FU`b 1Q8Iثcǎ={_VZ?~ڵm[lį9r$O_?{wU{! IDAT`n(\TMKrռ.2d{ݺR.i*Z{(\Pr Qm:̙~xs>z^gf<߇DV:$ln|y`p$ȑj́IWsNBzS{J'1;tHͩ1cGl@7tSvI'1 VsjX׽ R*wNbvڏi8H4dy*(H:YhSkM\Sc63g{m/h޼9ƎkL+W~㉉f\""""r>>@)mۤS^&%Bk&`哑l p5ejMg$۶?O'y^?6H ƍS~d. @: `K؇?I&͚5u$/^FDDDDUbE$f+W;>L@ժ)rrի,c2իK7֪FԪ%Bk:`)B+ عS:e2uJZX)_S:;;?K.mHH~Bۛ`EJKu!}IMU{<#SFjsڋY$G2/Pt4`R)$*RH'1wX8qB: Q:O)#,#C;zT: Q<*,+Kݜ }K/wެY3ԨQC(ؿ}DDDDH4Pj$!=NBzԭ.(IbS4Bvxsu``SZꂲܼ ̛p[ TTRp!%Zxsm5""P>aKt/駟7'nVKDDDDm[`hZ.s i0XUxى-9F̚ d7W{|jNK'!=7V{ɕ+'//ԜtI: tzpW~巌 lxf%RVNuj!&x5ZgΨVwH'!=w Nujɚ":T:Vd$hZQAC`ZQQjٟv퀑#ShEG襓=ϟ?/D˗CFR_d~`Z׈:|-#:T*$8Xͩl$ǠAj$!!j,$G@Ϟ)VP{}[:VXlړ^:i~?{,;&e׮]9sSz|JCDDDD$dRTd&`V哑l l,2hT:VP(8Nc~t kxukZv)H1cTKr#ٻNAyE/<<<zlƌY6n܈}O|#""""S&<(rrի O>>7<[8p@: Ԭ)BسG:e2);S^&Pt UA쓯/Рt mۤSPaK&M<ؾ}0|pdÒ۔L:o&<;ʔ)癈D"E"IRS^LgJ'!=ʖUYTZ3)$GRjN=e{ˁ'%J F| ptңhQuruNbZ>,(THͩJݿڱK'^.]NBz4hVIB:O=p^:9;;W^O|Nhh(|}}Ѻuk.]...Dݺu1}ts]oDʕϢL2h֬???>}ZW֮]zz5Zg_ӑ4H:Vx8xSO.!)"#En%;ѩ0|t (`ϫ#GJЊS+Tm #B+&Fݜvt0j(DGG#""… FBBRRRlM6UM"""""+#FFzO@.ڔ  t,B+8Xs> <M:VH$+K: 1`гt cǀ+^_dzN,[$$ӻWFrꔚS9!eM⥗^DG@DDDD$g Q#Z7OSF79( NAzMx{KڱX^:5~<кt ]ט1j ['9hN:ڵ)X_|'''Tvm3Z՜(Lt 5kS^@͚)={S^&)BkzS^&Pt ᅲNAzK mNAzLt M-[SXRV0h}駟H"1ʮ-T/.,- XTR!SS..I/W-(.()#,=]ͩP$GѢjN+',3S<|X: *VNbvSIH/ ZU:YNjE~t^6`գG1vmH_UgUK]P67yh$TR0>%VML5d`B 2R: Q'YYIH=Sh;| !K:j߸t$G@߾)NT{I'!=^{ _:֙3;I,z٘7BBB흯}_|1_KDDDDdN6Nl(4 Ocat kxU+Z;w)Hc^N{7/5 hN:ڵ)H#Sh:|-;m򀧧'~g|xgXE;#ԩS'OEDDDDP|}5ShI ||Z?J |}}߰{ԯ/B+0ضM:e2^^)6mlNAzM֭)(X#Θ>}:"""0yd1p@:u _|+f񉈈^RHQtwU[0$Gɒ_IUP$3Ϩ9UtL:a$S+J'1_ͩ`$T*,'XF!d2իKZ8p@:^yRJŋ_s(Z5jO>QQQ."""""kxx/Fr&0o-pw7ޜJJժ_F ,ZDFJ'!=*URB, ,Y;'puU7YqRS^LgJ'!=ʔQsxq$fiiSSͱ.]?k.ܺu 1g7ݻwGfаaCxxxM6K/!CGPPp ]?1hL,B%`, >^: Ѥ 0mt +WٳW?.իfT+gpҋV/#WIVtcGZG+VIH7zNu*ĥK'!=Nuj!&x5ZgΨ;IH݁ASh;ZJ'G`ы&OVdv`ׄ @V)vS^c/$Bkn_:5jЮt uS^#F:H:tXɑNBz  t,B+8X ΖNB`ыL&C:V@)H/__NZ6/2ShmܨdL&K:V` ut ktQ#Z7OSMJ R*2#9%?#yڇJ'!=yFͩr夓ef֙GH'!=bE$fYYjNt\Y:YNk!$IZ8p@: Ԭ)BسG:^i5j@b gggxzz^ /񸻫 5F,X?/VM]P6d`B 2R: QSNNIRRŋ^'d*TPNbb:{V: Q%%ǏG #88qqqHcC#::۶mÄ PF <GDDDDTp4iڨˀptңQ#` ZWfEaCy*.N: QTb"0{6+]xsu`\ &F: Q͛@tt^eddØ?>z-4m+VDQV-4l͚5CVбcGtCr 6m ";effbڵhذ!}dee?:w NV$'K'!=ڷ~[:VtPstWѣSh].(?_26mqShƪ9(h8Q:ŋ@tңys`dZ.ؙM^:-[ĉn:?~V޼y:txbQI233GsHJJҝ0p Уt #G+ $ǛozI:~\ٙ>}}Sh< ,[ܽ+x5u2ӧVt>SIxjɚ*2D:Vd$hptE/իgrrr0|pV~t )))6HFDDDDD VSh l ;x%ZwI FRd>_:juz5#6L7``* ]`uN\ #tڵů)Z(J,+WDPP-b=#lSG:V@*~}QI` }t dR|I` ut k lެ~>M 4m*B+(H>Mx{Kڱ7 bK_~ sAL2 [FF># 7|cq gQEeef6GH'!=Q eeE: _+K'1Q+sNBzLt 5kS^@͚)֭SS>)NQ SB0gΜ'>p5j"##gjժ=g͚5͓.ُv?#IN.T{\Y)''$f))js礓* EH'1KMU{1=+([VNb,]"S*R<#w՜ NBz,TI~I gyR ۇ 믿KƴiӰsNbǎ:t( ڵk-Q#H^f._NBz4lhbjB0{6ptң^=ͩk׀9sk FrS11IH㝧nƛSII@TtE/+?yJ#44/_GZtF!<<ХK4iݺuêUyf.\Xٳg[4>BoKЊ,nݒNBz 0zt huM$G6ر)bbT"1Q: Ѫ0at ??UT%Ӣ0yt KԍDIH&MiӤSh]SWH')0X޽{XtCתU {A*U:Ʋe,:fcT~Lo_ƍd oVO?W99IHaÀΝSh9-<M:VHj%0@` #C:cK}=،3ЬY\H+_jԨ hۻwoCDDDDD29Fl.2>_Fl*1CGh$[7K N6Nu+qt k$Ho6lNAzMڲΝ@@t ,^8qB{r0eʔ\x3,( OXEDDD@ZZ._W"..vp-ܺu IIIAJJ rʔ)pqqAQbETT UTAŊQZ5ԩS'W+ĉ|}՞F٧&+Kݝ\;Zt YKܑNܽ!,_xJTsj>J^^eJORdkV-yg穛7(ʕ󔷷tĢN&l׮]_{- dɒ߯_l*nDDTp%''ѣ8vN<ӧO#<<믿_g}mڴA۶m^^^ (6T?L:YBM{%pvvf l'K'!GѢZE1{tK| IDATTJӐ4M ?s$fWfTji +!:-[V%6mڔ>WYv5o< *T@ƍ1qD]Νף?5j+W"/m`N=ݽkoĔʣPkzo)Bi`2՞O]ekW``Zj%EJtңS'`0Hڷ~[:Vt -$E/,zvߏ˗/ù>N.],Wh=Rb=MNNN> O>X"^xL4 }nWw0|p?Dbbt$"zѣW^NonE/ׂɋb8Y#6L]T&!CTH~Uc2"=H/IaK IN6mdѝ]u|X4?ADDdTgFJ &`˖-qt|>pD||>_F|]l<D1C1͛ Lo)ȑL )H T[V"[;V6ݻ-9E/^x{yk؂>+VD֭-kk֬Ecӧ/RRRz߮89BTH{dg~ {%sׯP;3o\&ʽVS=^Ӧ7˗oNAz5j$ WLMMN`X„ zl—_~7nDorQeNOO: 99YjժA_]"-ʈW/_?ZNKt&.^)iSDTu &B+&F:Y}{S#y`hdC,zY7@z<22w~aֆs={9/^<ޥIDDT۷mڴAllt"#W_Nuf ?{H!K t$a۷99)zNA7DDҧ!j*/^ܦΙ3Ώ:''GĉQZ5 8-.\ȂgΜa;'^:͛1㏑"}6 hD:@`t "2 T[V"[;`k=Z"Ǣׯu=HLj#гgOc?3F777x{{cHLLx/^DhhMt:vk׮IG![9yg/Pt??Lt -U""MkKxXptdՓNAdR|]c^u|(SUt .|ٳgcҥr劮qCBBEDDD!22=z@*/l; ૯p$GrK3H'AKCJVKNbv3ߤ/ʖNw#)H"EԍDI'!GS+K'!+e#:uBHHZh{͛QX1'Ξ=k1 2eʠvhڴ)6m:h~ZlM...qr;V:JBI'!=QE AiF`SC.ɍySZQfTj*p!)\Y# T1H$mznݺ ֭[駟O}Mjbȑ(\p|rKDDhQvmXL 0g*,պ50~<`MDLy4 ;W:Y\0k{@JiHZFK'1zUH{@ժiRFlI^=usGI'!X1'''{F\\~={ q-eˢAhժڶmBlp¨^:<<#""rdKFӦMѢE _>իE8Ŋ'<==ѥK?}6b۶mضmmzܧ;v,ZjOO|=.ST IڌrgOu _uS+֬Nb,YL*%@3Gi'ٗD` $fӧ# lrFx祗cŋXCիWǨQgF…>… t(_?*TE;"""{Vn]+xѢE ԩS'On<ɭg}ݺuCnݰd۷/eXJJ a׮]y~,'6IWEݻpFYoJbULݹS:Yp:O Q*`7mQ<$,4X0n S7M#ҫat^vW^쎇:v숗_~ T" *;cǎᅬk";;;O?bԩSͪ}IHiſ\Io0ySG}mۦZ ?95xtc8uA知ޭ԰aIQۧoK'!=~[}ڷO: DDDD6TX1tsŹspy|W0` ^Y&[;Ϗ7mڴVNBzի!NmA}6 "5 UK:j" X2&?HۥS#ٸ;׌U%n/_?7n`׮]8q"ԩ#j^^^駟9 s+$G2o͖0ӊ1kZ(9uAHhaIQdf6FZHWzPA:YVj"Ev6ZHUNAE>6A;vĴiӤ# TR׿w^cʕٳ'JbI0Lعs'fK,ɳIHb"0{6#TE< J/ʕ,9c*嗚5e#u XNB") XNBzT.(jNEDH'!G ,YK'!=ʕSѹߟ9lɓػw?DDDD6駟b…h߾}2:_~AʕdCϓI''یs"0w*&M'1f*JCiS`Z/fIQ\ԕ+IH/:T:VdZI,j5!ٟvQShEG7oJ'!GÛYV ) Lڵk8t """"ݼ~z*dp[ldrrCBp̊ח }N8ӠA@)V1eZ_}ӥ}}H -ݓNB)5Ҥ=zH(0E/Xft""""tS=ŋq9Ku+qt kys/?#+#|l\n$fDeKZ?_/"@kn){6z4+)S#9pj5|8Щt zUZh3ٹO>6w6 dZ`~Ԫe˲ _0Q`Kf2kKZعS:U Pt ;S^>>@)モNAdf`&״i@&)uu7nܐBDDD[ѢE|}|L2wU S..HQE/ g+ El+F&qŋ eH'1PmNBz89󔫫t,`J $D: QS*I'1Vmݕ/rrj^&.@_EfͰzjddX3z 6`}IGt:0g $fW{" //uϤ%$̙tTjN}d6t횚Sァn Vb"0{:Oլ),nN{]$Z;w`5(W5j&Mm۶h߾=J(! `РA6-zegg#22^^^6 9u)#E>e V R_Aͩ+?,XAOv_K'1S%˕NCz%`(bb z$uUt70i0wt777o1k,˗G>}phDDD$5m|`[UIHAfX9pLkI:vLŭ S߾@)I'!=zNujK&→n5ILn) <̽{ehѢ~WHDDD$]v6͛6 n6`Fĉ@˖=< @V';6nкt ]ט1@۶)S^#G*B`H_`j 'G: 1dеtE/;vQncǎEzzt"""РA; `e\f2uJZرC: モNAz?/Bkf`&Hnild/``ɒ%hӦ \"Y:ul:^J5C.ݻ,_8!(QB]P.SWLrxȎ-ji+$GBjNU$,;[,UNa] :$Q`׮NAzL@Z) $gѥKԩS(^H,֭[HII۷qҥKرch׮<*Uqb"""25jt<*n{NC^0w-+yWDjUufd$fokK!KUԔ)ijߜzӐʕS+&O6ξw_}V7R,5mw=ʗ^xA: Yy7YT0p@899Iyׯصklق>7"":uBHHJ,)HM3g#C/fWiBnV+7CK]Pǫ̙tTjN}tOUԭ.(tD`w5Ӑ OW us̙\5djT+Sg̐NRlfޫR ~'[vqQ:uٳ 4k?}4Ǝ HRRl:w2Hm$d%K%ѶCW#ShEG7oJ'!=ڶƌNׯK'!=ZƏN ̞ `dIShũ}BtңiS`Ml25ڦTP!G+>yWFPPP>#""" 6D6PH;(`%%~}Q+PR-B+, XLIHwo5)B(-2={Hw$Gn)ΝS-Y&>u *(PkڵknݺIǰcǎ1{.L:FiLDDDy{pU2&$g`z CBOVaP6qQV޽t kHH֮NAz t$B!o$ǐ!@.)UԾcd wNQ `UTvm:tUV}oQQQXb@*"""Om܆Zj6X@st zT7Ϫ1+@)6nmNAzd&`״i@)nU*OS͛Kڶ  NAzMl)W#\jհi&*y!w9WF Gv,# 4T: =ŋqي=h X%"V*RT(}Վ58X: e2WLNzZCdWNv-t djՒN-2ڵS8S*[^iժFΝnZDD*Qc['S̟DEI'CΗcڵ &MBdddF ,$"ul=z d6lPnݤ83/y+V0vΞQ** e2 5NI'1۴IzNBzL.(8!lV5xm>/F IDATMѣI̶mSsj$ĉ/$D:?*ou#θqjNK'qްx] 9Ei,^lY;..ΝV,xݘ3gMYu9L`JuG)_Ϟ"+lרv颊+(K=3ڜVV+t.ZR^Eի4jnUC57֪FԪ%Bk:`w\Eg`<"ْԭ+!pqss.@\nP"@izjcGAXX5j0p@#66ϟ1zꅚ5k"11NB {lA%$$/xh߾ƣ 9YPPt~~ȶag?899*/Փ'Fiߜ8)_WO: Y5 c$fw\]xYY8㑑r\? \IO$\ @ypP㏟xƃiij8WW+F⢊'s=`r57NCOq?;/xT"/_V籜wr\|F+ uuus<:nv͛[;巢Eg1c?Xr0...=vU$h֬Y۷o?ҥKx>>(T BY̙t6s*~Uc|8d}Gam8nU+7-UiS7}$$rT/͛#FHк|Yͩx$^Xxڧ당[࿧NYUʍ;,0 jk}8 ˒\?T$`>)NNNxwj[o "ʭcԩ6?)b19~\IONp20/u1 ƊSQ1M>=~8yRc[3gTC K0ib=~Y]> lsTKVķOmJ'xXd$h;RS1j\lWZZHGs(usZRR#2.Z=F[-zߗ-[OIVN.lu'zt|"XnlӵkW6 ݻj)}]5 hΪڵ)-[J':t[]P kBh`)jNeoD!!ʕpј) r-4Z8v XBET`Ο?ݻIQ\rAAAO|Çqĉ|JUpnn)֬NA`AHسVHB ;S }azUP%* f̘1ϟpAHLb|%CFFF[]w#&_SA8xwЫW/KdIuA>ҧNH/6l@hdUc 4EjNiTٳIHeU1xq$fiijϸSAAz@S{[ u?!>(SF:YF7\D _+9LιG+??}o\YmRIl,L gN"Q+W`4pg,ǁF 0猋3!"\ 6}*>fφӧu'n,)x_;S9sUG6]fϞ}ߋ+… ̞ B!,,)SШQ#T´iӸqSԩ-) M47ԝڙ30}:\ۯ-^2[9x0r a2YI;Gݺ0lΟW/N"LĂ*uX 0y2\dx.O? GNa-*Jݧt'nfP o\S.>.e6""" a&}+F63n!441p@ZlIrxBᖢٽ{73gΤ[n+W+2j(Թիv>ުG\(V?wy{WXG}DΜ9]U!0c 9;+ƚ5khԨ(UƍS ǎN!$ vt'1t>M}د% JcfN_6)vQdΨQjA!I2|vQb gM_~tȜCϾ}t'ɰmO;pC[Q= 74nY1%K(Zj̙3ڧz'Yd I!ױcG>,^Yj^$,Xv%˘i?8^reA %J8gl{XaS6C2SX[ Vw aR;P 6X\mR%)] 7N!>p/TR^,X@w DGGLժU&~i'bp»Q 4zM~9ƢEM!ըQ;vB``8B BLΗÉ٘-Y,9l*?ZwHJR=՝D#wnuMN-X\stQd:A_$RSŨu'n"_ᙿp玺tQdM/aÆl21lre֮]K=(S ~!l`O:uPx[rԩ~PIжm9?#vJ>!OrJ~W^xqn+e3iYILb0`tnsFUgP|ԕ+0}:DFN"QZP681""t'&uh aL8}SzL`l ӝD?ɓB a, 55}pB:vH 7񤦦ùsx"'OѣX,lԨ9!9s{|ڵ^Kݙ6mCYt)3fpJF!4hah߾=ٳgGIÆ0dZ1HINeqKm_~qhJ%K2U}օR fqL&@B[ծ #Fԩdp&Ow1WX7V@ G ʗy!/~~w_w#);wHLNr|<^\vԴ4k?oLDEeܧ-ȓO ?ԝ$åK>5a{y)ZAy޽C{]o޺EJj*))s>6Wx SS5 6vbb dIل0Bˁ8pNצM g۶mwܷo_r׾Z|9~!9s4<BduJk׮ӇJf5 ̥m[ujZI2; ,9!U޾=yyx\Y >sݜs$̝ F\Ȝ-5|$`=ѝ-xyyQhQjV@ X|bV Hsp<'HsǠ 2@i5 ƌ|L8GӦ>eV;V!(U=K{JX8}"ᄆaniz_g)3g2N+XP[.!e7^{517oe}mʕ[C7ٳS !DVӰaC^z%ZlI5rVy^]-ܩ;I~@0?'7W.^mԈW5b|w/Kmcv@&P5oغUy S{NavuM;[KkJfMivX l\y=p+wߩk7\Bc#pˋQF!g}F\\?<ҥ s~DZc 'Y˗2d+WZj{?~\w4.a {)\JB#sxoSfƞVT͸qPV6שF ʛڵcϴiD]ˢ#h] 5/v8B;~8V>, .$99Yw,afeI2$%^Y!3g]]cdULEʥT^.oaN2~>>ڨ_>׬aƠA4VnP: pp,T9> tN5VBt'p玺!v! @r1cnJ*VT_fr L8Ńs3}@y81""t'(]Z-I|<̜ ONTE `L΄/_Cz1cԮ\gda3!!́0'%NUOi#81̓?НDrVv^|kMgt_?`  2`_HL .LtwF3f63gwޙ~o_ޑxB!2ҥK > *duGfTjxn&)p$Nsuޘ6q&@ax.pIG[xᰚ5ah)EEԩ;fxέZ_x`HZqx*_ީs%M>u Z|ĨSNryrd?Iڵ42 dʕGGӧCXlwgXaWNٞk)յkWl{c/ZȮlB!s^u5j$=ܑW^g?/k~g8yUOzssCc4Q͛(  Sԍ{4o}Na-, fVt#$3/;}`r6LhO?rNcшxevST(>'ii{t6䧟`HIѝD W?N~îF{p# :NaRZMmK}ǹ qi/UÛ78ƑM/˺u뤬IZZ .g}ZjU'Z`ƾ~:QQQ>}'NoqQӝ6ӰaCmF5\:0yB͈)Y,O=;ݾ eɶm=;KF^;.s*I<;_},SSU̠ ][wa^Hco€ 1-M]S B.0nO];b Bƺ{…}M$~v?ۓ&NzþN3өF!#^n(00sw^ʖ-;pSs"̤I(R(P Q^%fϞ=k !ȟ??/2ӧOٳ۷iٲ%NKڵՓfr>ٌ_[țcb}VTlbcaTsWC)o3 <鄙plzҥKf"kq+Vxoݺŵk2Ojjj^ϊ!DE={6ϟgĉ-Zԩs^t_|8в%;S`s7nth ///~ Sst'xxu)ED׮N"lTlYFth|AK5lCNaYuM9gThR. o>p”7G>wNm_مp욘X@@jf׮]3n8sJ>S_mBc̘1>}w}0ӧѣׄSm~IZ$u;5~SW7{y~IJIѝDأsghNw k q­ӣePС^GEϥp?m۪{; tn o :aNT%Y0˲ݐk׮MX"r.???C)^8^^^# cX7oײgNF(S 6ȹs8piYz*ׯ[n6#YIΜ9yݻ7}[Flٲ>f+%1B=]OdشI56g-[94F`޼LߠD⡶nUWvQdΠAҞ=dؾOI rNcC]/vTהN7yuuڹSw ?@O>37X}9~6)#W SԠA UɄIdM/ooo.\H*]vq˗gTT׿Ŝ9s ʦBdR2eعs'3gd6ͬ &ТE z)n,8Xm~jysI觓'~2y H$kjPcӍ"sƍSNԝ$CH^~YwanM5)"PсBBCf;(2gXI;I}CI=FRY}y>S~%ȾJ]S]8rۯ3f̐ /ݿ!5c C6@={6iϞ=4/Bar^^^ 6ܹs>~ZZ$==˕K-(;ᚳ۪|}_e 8KkӹIcBKMUetQd6"-MceGl>ތtA#X`rؽۈфPV'U.0~<)/qT3>3שFeM5jo!6ϟg=M .L- gȑbaņ+y|qB߉h"nLK\fAx$Vr%"##wΜ>ܘ@"`l ӝDأHl2]7n';Af1tL/?Nb$}ʉzm >_έNeOkSe>)3jYV߿?٤ϟos}dϞy֭KʕO>[n>Bx5ksNoIf~<ʨŋ0e DGN&8<·QL'Vhcǝ4iթ`!z50ۦO?ҥ/&^!z{dH<[Vuw$:Kh*$'‹>k`YcTä$G3'ה;Zb=M'dT|ɕ#齃b/cFɄ'a|yb`k"-[+t'p*=z4\.O8_@߸aX`lxmUS'M/!<ԁx <<*U,Kzxbz-J(a؉ͮP;|O:nqܩDtȜ_W;wNa.(X|{nz٣~ h"szT)3߿-S'f#Q\w q#]R^6{pO#FrfiNʊL1zbhիQ+%y&&MA\r塯/iԨ[ly))GƲ`d ݻw[fj#fذa|͛oɞ={25?~#uF||]s!jժexgϞ5t<||`8YНDxtSsj?ם"Ţʙ}$ƵNZeS6PVoѝBX:`kךT(r.Uw?fiժTX@=z4<Ξ=˷~Kxx8'Oȑ#9sŶgAÞ={ȕ+գqtޝeoq.^ݻoIOOx1114nܘuҴiS/NPP5H"VMMM믿ŋ9s/f^n۶mUV<*T"EТE Bᨲe˒={vN?ސqDRZ1S3UbEi'HLyN7+P >ec IJ 5U4H20 Uϸ@QCG\}jHHHНF}[ ;֌%ݺeX k`AnnO6'OdOq%''sn߾]^7ofvex7ocvA Bg" )o(BA?ׯ6b НZDZRQ"#atY!Oz0tΝS!6Vw,-3yz$~]1 .2vj*736 3N9s`hȝ[wa_T-ӝ$CX:ې74!n0l,"")1c ~g&(QK"CjYe5klH!7Չݻu'ɰcGѯ$SڥQtȜ}ՂdسGݧ//i11؛Q7jd @kj~&I2,] C};|fL6B!u'x);Vw k2a;w_z8 7'^B!"&&˛7ac qWЩ֎U%Ēt'aRьrvQdNp:sFw VAм$e-|߿~|B!WN7>u$BB (|=ܺݻ3 i׭SW^ѝDB!o6lz XIIѝFySm,U>%Krɒ.f> Ϗf5k3X2KdU`AQCwaYiݾʇ,<;G/4|zϸ(5U9 4Fx>>0~bcuQ`2uMtX,Lt©M<敞~)n# B!<ƍILL4l\w kÔ);3Ϩtfr"L .Nntǖ}i3y)^|}Ĩ}.NR^q_[?]S/k9IɦB! o5t{x6mkW)?J޼;GVнC=l2y6-Z@^SX S')t'q[o/ZD:eTfЯs;$<f4OEa矇tN;;3L^g>n瞃F` vHdz8IIɦB!׿Ezzc6iȔ}ޭX,{6*d>sGwaݡuk)<1Nv?-[ LԪT)s/ڶ5CU=SUlz !BÇb~~~ԕB1cT'3ٰ֭ӝBkHUKw k7nBÆ~NnN(b]GjԤ ^^^Ð!а9}\S7qc)N؜ʒoߦK6[׭K92д8d.XBw aB%B0`᧼Zlc a`(YRw k+WwN! eNaҴ…B)Y[NRrI}_gax80WYZw ajU)_N1M¯aaN /O:e>_;0B!pS&LlJD֓/ZəSw ɪ,ѣ{Mܹu'p** IDATo{ſ|t'ɐ$n0`t~8r)(W7T`앖˖{d˦…u'ɐFݫ;{orV唱T)Zթoŋ;e^X,N"LD6B!Ж-[4iK/>6+_^-(ɕ+0mj-O2滦` НDأdIl&0{6>;)Y,̚ŲoqctŊ~]]SNN"Qu'ɐɓIko'ӹ3V@uM9m~%%^ǏN"LB6B!́ԩe ^{5|}} Wԭz0y2N"Qe&/k%I=~Z"4(uMEEY}y70zB.k Wڝ;1m6mru*WI R6bb`pAwa*UwM]mz۶ԩDfa/gNdPKVhbc4qlz !´ܹC~8o/C楗^͛-[6x ![CSX{hf+NR$$N"Ѭ;p5K[nz`\Bەb'u #:*_ڴ]NKLԝDh$^B!0.\HJxwb,RSSywر#I6BY>>>{N[a󳺑#Ui:3ٸ֭ӝBk0xXv]֬ѝBk仙lW?[L *?ƌaӁX,t۷x1 㬓?;z{3{P>p 4nl옎ڱVҝBثx\:W۵ ~C.:u ݺѾaCc+_|ի4 ?#>&zDD!W^e͚5YlٲQfM{9֭K:u(i IIIرM6i&b`A *Ă \>h\Q", Q} ѝFتY3ضt$NYԆJ0iTݧ-ҝP 7ovO ŊQD *,I%XO+Fqh89oO[x8lݚ-Zvƍa@u,"#a4Ӡ ~֘Źsjk r7oÇ@%RrRwcE p4畄EFoO˩S8{ѿZթûF?Y ӧ;#ΟW&TpB!GKOO_~UX1ԩCթT+VbŊq"͛7 ѣi !Bx8___V\ɘ1ctG¹jքѣuS'ͷuL .N"QZPn!{lۣ&L 6UZP6X6 "#u'(_|ի0cNhՊ&Q8~=ʔ1穸8uMEDN"@6B!ooajR=E ѥKɦB!?Ahh(M6Eڴѝ/2*)){tNa-4T]SoN"Ѿ)kЀ gtGɼ6mK)?J޼;Gн.^ԝm<6>7%CЫTIdK!ȑ'm64tzLmիu85ҝpON!Q`AM7F5ӝ`N"ѫڨn#@ ɓ\8׽P5aRHM՝DD6B!ŋSXKHPt'(\X-4mb"̛'ON")__NB@~fnծ/gAYQS 9sN!) .Gu'PT@F ~7=5,=%Jd9g|t'ɐ$AY B}|g\|/ݻL5[.} 8ooyQzIPc&.Ґ]UjԘ:ΟםDأR%ܧr 4>^ټhRF&jf DQ36Z w L{-65 ,ΧKBLlߞ}\9rhN|*Ub֐!D]1cPH+YהxpӺȦB!B9h۶-+V 66~cO29s[nT;Ν2sf=M-ZT.?n`7lV ˔D\*lR%tv{mtoB_=NoL0>/穏>N̜cǢmӦh۴) Dzͱ쎏˗WBӢn*uUu$mjl$ӧKA3(ծ]O>$|I@||<֭[7_~ݻ;ŋGӦMѮ];t ]tA"0MQyz$V+ÂE-65X ^]h0P^V;Ú5ҦzJ; zNB&^xAV nFE, GSRp$) RRp"5Gqlz:^8 ,BBBPLX\9 CԊTAԎDuQҡmv/}Qof$˗E?rŊo-7ވ;;C'NDj*8~4RΝ/-U,W!*-+zDjV*V*Q0-g8\))~ *,zQWT)n[}ѣػw/<#G->>O?\jժjժVШQ#4n 6dHCh)FNN#9sNC&1cgΕοӐh9O=a^;ÂҦxr?O}?nviS.i'!X""""""d MS-^ ,]LhFieKv_~)* NF[k[XH;zYSح\ ,\L=4оv UxqZcыBBd!յ8XY^; jNa7ovv 25~Z;7Nax1lv rE/"""""\ҡ!=x`^$d""B:KN␑!kڥL//m\9$.fɔO|ʔp$/KڶM; (YRTJI23e͛PyZU;Cv5X""""""ZFGu IN&OMSIDzҡHRSSC:u]F~Q`PvI:sF; h>\;2i$\2^vsL t额nF` 'G; 0U;ݦMҦ~ݵS +ID>@Ϟ)~U֍|Y; [;Νf*/NSǢ;-Zh3Qp3hR;ݗ_Kh SF[k+OSgS;݊…)3i[ X@;6 Q;ݚ5)<<jNa7o)Tt4Pv  NA(v ~L4hONAbbƍS-^ ,[L͚iSϵSi,zy!%Kj'qȐvNB&åM-Egv$dlY NpLmv2QJ8df~lެLJZU;CvLǺqv2Ԩ뵓Y,zyA='IDTtT`T!$dNkSgӦh'!5k{_Z0s&LT&b-}<}ID*r!QXvtw{Itv!""""" pw .!88uJ; h =Z;ѣ ɓIcj;~4 8qB; h\:ɉr:vL; h$TR|JLNB&5 >$E^DDDDDD _;]l\ML<0pv 8୷w >;if̐Q:|2D;ݡC2$dC`pvSOk'!m#Fh;rDfeHNNREDDDDDA.]Sm̝+P0@_e휬,$d)-[ٳ+WGzNa믲nID^@)v-32=}S#^`ыĘ12X YXX;=Z; $_}|v 25rLHV.NAyhN;ݪU)԰a@ǎ)֬>X;<I;ݺuy8EDDDDDd*&SG;݂k S11@Tv oNAƏ4Na'_k S11@),"=hY3vD^xhB;gɍ^DDDDDDålY$/ʴ<۷k'!eJ NpLImv2QJ8dfԙ[h'!RN␕%m꧟iSիk'q,6zz$d*&UK;ݼyڵ) ="*J$i ;:uM9L)ISIDFצI#GMSI -A<]hۿ9S~ӥ 0hv 8L{/0dv Cdd3ID)6uv2Ѷ-0bv #GHLi.!A Ni')X""""""NaϲIVv2ѿ?Эv -[d+WGzNaY~^޽SmsIG9Wݻwߕ(t&IlLɚaыȟFW_|L yv +ئ3i[ cdj0HX@;2DFu뀹s9B4HF9s$ ^DDDDDDDEi[P:)8EG˺dB)~QpsR#|ŋKSqd=@gr4f вv /s ^DDDDD$$D;Cٲҡ\v˗em۴ҥC9"B;CfLsev2DFj'qʒXI;  TI,KF_Lji7djxn]v,S/X""""""uՁ`tA$dV- $ii#IDҦ邋e}Hy N␞.k1j'!r*]Z;CFݻⴲe8\GHyƢQ~iRQ $ǎ''Nh'!-ZtO SML=L4j$ʁ)yKHNB&6L k'!QQޗ L*QEDDDDDtI\0sҡs!)P^t !KMNB&ڵyF;]|)ئӝw#GjKHbSIDV)6nNX""""""oݺiۼYFdfj'!> 衝 ޽^Sm.=]L)@{7pv 2խ| $2%kzv2)NNX""""""*#Gmh`"djm[T . h SC@evʋAd} ٸ;,$dbkWG,zY",\XL9f:d*&F $K_|L'˘1k[XX;5J;BE/""""`tv2Qt(GDh'qf*, ?Nbliv 2"յ8}v2 Ԭ Nv T N11@Tv Ѷm)DZGu IKfNB&W$IDdP$o9|*U%\Sxe8\(n߮L-+m*<\; ^DDDDDy`D V-Z/q`OfR$IIr:zT; h8 NIJHNB&4f >^; Tj*0mpv2QN)^DDDDD*.NFRi'!:k;xP:jΜNB&:v Naw0utRixv@rv2qȑ)N&Mb VZGkKL}Rv2qn-ȺL|zNam0kpv2ѻ7Ыv e=GNa{7@Fv2ѭпv 3ӵ NaL}v2ѥ 0hv 2ĢQ`"djm[vVL t蠝٦ِ!=h[7O;4Y;݆ ܹei'!J+3@Vv2ѿ)EDDDDT,ZXLi[X\;4Nax1)Tt4мv >>T;;V $Kʹ2a +OS#eZV *,zW4[j'!aaҡ\v,:y&$dX1)V!'#ず5S8X$d*&SG;݂2:SL nBEOixA g35&;'mj~$djUiSIeݜX$dR%iS%Kj'q}W.mlY$/ʚq;vh'!eʅDI._RmNB&J6ĢQar80aKY+|%%'Gj'!^:uJTBv2Ѡ\HRRɓx$d"*J:ԩIDݺצΜONB&j S^DDDDDi5aôS:$IDv3hLb;}V;]B0iLn .1Q.$JJNB&ZƌNaw\qv2Ѣ0nv ^DDDDDѶmו+ID@^)o.]NB&zNak{2=݁~SLLt n~`Ly$dK` vqq2utZv2q!) +el NÇk[X@;:vki SO> tn`\NaYYID@n)l23GzNAnEDDDDT-Z,_L4inb/Shysv}|v 25v,p).,NAFZNaWlSlHMv|#)8m\`ы0ʒ7mNB&EUN␓|I@͚), ?X^; Na7>fv 2 ԫn`*d*&__;…)TL Шv rE/""""9Yb~$djU:4T;Cz:;@lv2Qt(,iS{h'!ҦʔNpcv2Q/e`,Y7OҦ""8dfgt|BH$t 'GƍC9$%IJLNB&6 6 Lk'!7$ʁi`Ta$dn]P$gӧj'!jy*-M.NNB&W6¢QQqtj'!O?.><HINB&xYv RJNNB&ZFNaL z >-[ch;vL.8yR; h7N;ҦNB&6 8ہ.]NB&~G;ݮ]2XFv2ѽ;Яv ~[Ѥӵ+0`v M?Lt ..1CFP^``vӦhB >;Æi?EDDDDTԬ^-Sp:vkk SO> tn`\Naq#0gLu( 衝n6Y7e$dwoW/%Ke˴Shysv~ |v 25v,pm).sC;ݲe)smh`"djm[vVL t蠝cы(>P| ԨddITL Pv 5kS^=v H2~}v +Vh S11@F)//NAbbd/RâQQ.kj'!U%Jh'qpx`$dbE`xL$/ʚq;vh'!y|y$/g4b|J6!3S9ܺU;  "#8dei6i'!!!ҦUNRdEDDDDT%%'IDÆHIx$d⦛M> L6֕bj IMONB&jՒ@r,0cpv2QF൩sM߯LT*BCI,zu@Jv2qjKHL֭QS%&&HO˖W 9vLɓIm/qiSǏk'!͚E=L4nxm`ы]22݁}S#S^Lt D;1hV;ʕE)@)V,NAG;E9X0wСԮn|IH)&WO;}LEGk[XB;6Nah|v 25~<Фv ŋ/NA͵S ,z݅ Ӟ=IDŊQSveZ]r夣\9$.fL)#mbE$WȔt[j'!%JHJ$YY6i'!ŊIVM;CNLI@͚) =z#IM7Ir II6Lԫ'$5:8tH; ];ٳIDצΝ6v2QP$rqZlv2Q%j,zsGH"9Y; hF $ @Rv2qW 9vLɓImZqiSǏk'!͚^+) 88zT; h8pTbv2ѠA]VȰEDDDDD#W^L< )~8^; ~'SH4$dS'``vӧ/ >;Æi;tHFj'!O?.>^.NKINB&xY^DDDDD~ei'!O{?nvY%$dᇁ>}SLt망P I!! [TuꤝLt$${j'qKKYrOkvҹpUwHk,_(<)z*mNr%PTO;=$-[l.ҦxByAR矵8]+mœQ8Pw#S4]DDT[nw؁͛+&""opw""""""r[;E@DDDDDDDDDDDDX""""""""""""ǢPDDD-44իWTZ'"r.$D;QPbыo'NЎADei' """""" Jސ^DDDDDDDDDDDDX""""""""""""5 7-[j "ΝSKRB$IJR67NoHDDDDDDDDDDDDAE/"""""""""""" z,zQcы^DDDDDDDDDDDDX""""""""""""Ǣ^7o)>K,K;  _nۖ-!+gΨ+RSg幱,re)ŕ+=Ϟul "BQٶͿiiunq"#|Y_v @T?k+W+u++^#) XXؽطھV2@˖@vw:xWKO5 ѯ?Qlsp"p̕+u/ɑ8Ko67J{` 23QH/"""""MHv%[nڷ:u:wJNEqHqh0kyR+? 4mz99ԩJ( ,\h(Wr aaw]}uj'*8? ,]jX"?EDDDDD ׵*TF4NC Y``tO;&M#ٷ+_8}Z:"^W g`X3?tcY"?EDDDDDG9y[!X1U+vmvp0p:x5o IDATY? ݻh`N !ǰiWΔ, 4kvLCZ<HIcceJ <42k>ٰh??]>*S8!]];[䟗_D}{X"?EDDDDDykx10c}AqOT/Zv]f,^mX:AתYS^cxbSѣc+~]P6ަ}{`{w <>/_u> GZcܱ,_›JdVW֝;v.Y-S0֮^yE.pE/"^DDDDD'O=$x㣏}?ŋ^\hb鄧).h,z…siS̏o H7z,1?&;Zx}xncl*⡡Cߖi l` `<۱ED`ы))I9}vŋKtic][oy6,Lցjx^y?]Ϣ˒TZ!!qK/I~x1瑩__:Kl,pW^8/J˛QO> ̚Udnp>n.<T vy)x@ٲ̙z̔<(x$rrd7p^*UJ}utv;AQ#GpljyXR.͏L*TDD^`ы˛Nnz xM۝<)W`STFaYRz}(!kp?ǏiIǎu]No_d "աwըcwra'11jQ^DDDDD_tJGy>)p +2m+|t钿BB=jDDժy]dת0a231]QƑE/""""" ~!!)9O/LZrrG 5k _|_ . ] 﨣75ڵM;.Qcы =od ڵe-ğJUOHԙoN-LŊs渞ȑCDx ~}sg`24G{Go" ¢y1`ϢeZ̞z 8w'e\\+Ӧ9/!`wOM bEg!" ,zQq}ޭysgѲzv Vs+Wukws:vG|".pjT"иRS?Q`ы  *v;w G?ŋ@Lm &;/pN.D$-.]NQ5hvǎo" .5jxަNx뵘ܙ:}i:@nǕΝ[o/5H… …AD$X"""""¥re$%v Fof@Xt!cؿ !*ʎZR!,̻ʔDDA">Q*mr`>Μq#Lo-k:YiӀ,Yn!s p,dfv F̘~Zf &7J:u,DEՉ]\PRRy?GA9yx,M&W]cы] ̙hHMPj D!?Qzm€{q.]> XP:*ϟin[ÆI?\$?myΝGVI+w$+%JNSAu4_+5S/Xz6+K1{G M@TTgrt8_IO8r.۾\ܖ-rۺU:rG*z9#=+T5FNuodek>7˖-As^JJ JZ*?Ęw_̝+M<)[nG9_;+Kn?&#Cs/K\?eɱ}ֻ K [F}<4\"9s:;W\tiM) bN`t/{ 4l(ˀ;//y1ŋK9/תLGӦKz^."B>O ~|oj7}j>劏f̐zGx޾V-,Яй}Je x!/""""""|5iZ:S'oӽtZHO^xG'P駁G:Wqm7gؿ_%xWm&#~ܭg<1w.0bw&LmsٹSK<)R^m2``yyZN0{LG'^xAFe)~7k4^"&HqWw|!Рdns}3s옌8{,[A[xۥ潘 yeK#}y5˒"ʸqލvL)sW(QkgJNƏs­+M ^DDDDD_ZE}dOW(%KQd;iBj'dR:p@?k^_xK:-ҀÇ_~qbŀ[Fuڑke4D^DUKggVANޭ6n4+R=[: MRjVF awm/ =k浝3gYѕ+tLH 7:A)Δ//={w7n, oք_)n~d輸8amwuL`,ٗՓ%nv:߬,ߝ[-,kڻײRS-%JL%K,kWϙg9'mzW^of<*]Fs\?vF˪]u-eYVޮWc,;ֲBB{+]ڲ~-dI?[6I%'= '"W{%>52ɓ}>㏖U/^ܲzʲv1YYzeOaY[z>f?#߹ӲV b,k,~w._ߗ28IӊLǸxѲOwzRŲ?~ͲjԸ!!5`eΖ`v3-kYk=_y?eI1hв>Pk;fY/hYJ׿ZVNY9;ҤerۻײRR8zԲ>̲zsmʲ\=ו+u]}Y֫ZVFefZ\g?WU5ye9sRS-k4\YZR2珩Yxa}з-[ukIU/qPd6~ݻ}˒k{]}V=lMk3ҥiI]u#""""BGz}ez>ܹ{diTCWs}fv} Ov\ j_{4+;[F\zZвbc-)JOxZJF+}`L=zh'7QZ}|+9YF-gYrpսee*Vt g9{VTɻ,'OZ։^եeedF42,|W-#W9ڴIzVFxx]27(Zs,kx uݏ??ƫmۑ^չe *Wߞx²yIJuA5kzR<Сd;2RF b@?K&y!#rr,ǝ}ƍېs}Ϝ9{7@?ܷL%yy__>~פIgDDDDDTT++˲|S:p=ϗBL}\9ٖլ۷Ѳ ;n׷"UFNߟ׸qdjt=xPڬvV%W_yy iۿ쏢eYV^cRc-Q|]w_uؤ,qqBɓyuӦ{sVʽU:ǹsuM?&,̲vkYRwVȽM>Ms;} y=X[r`AOvL|mbŤM9f맞p:[1nY#ITQQ_Sڦ,G^1c=Vdӕ_ΞmÇNYrն-`y&3G﫯d:WS? q6ՕOM\0v߯T 2lcIL&Mn?S4תV)BCB't/GM-ޠor(,Ybz03>ի;iiYP__=)932}'>,k&4i)#]ȜFɚt0aT̳Vd A2~}:wvMﳠuzu|MʮvZ[ 3xqۭ\iWA> \ߤW(Yz 1#UT)|;wWYl UL 5,/, h='<Ι3RU˅ bZ'(6yAX1+Ov\]弰4twYgʗ5\6ͻ  kʟGK|0j5k^ٱc=嗝׭pfyBBbW>77+HWNVΕΐ^ƍZÆղSG-H'?{YW UWۼY:]1MWm'O:=[Ώ?eey^\9onKM79&$}Kq͓P;2j܏<իck=ިRhy<47߷}^˛,K˨]w^}U.rhBFT.شIt9'-Za_~VZS&Vҙ yƁƛb Eߞ 7%seȫ]zՒ%}ɑ#z!!Wkp*bVb"z>P:_+;[7ɋs]o{HHp]ݹ}|hSi~iOvъGtFJ2{w}fΦM,zNoHDDDDD̳uaa@F2ާ IDAT2(Ym;'J{< g?|Y%11rPXT)44L]]OQp钌p_~\˛u_I_hq7/ zg)*deA/]ߗs}m?{>z)Nbaы{w]UuB0 DhQDD<%BE}P ڊRUh>dh@ & S@ 㷲2{>{o.|?kE=g}=So&""""ozHR?/~=0iRkX=5r^'6t/ |+0,z8S󟻟ͩnn ȟ?< E ffze`[#*۴q֭y-^l=VMys*37{:J8x]^,] eM3fWoT0xM`~%%˫KIo=~~TsmU+ ED{|f) """"""rRϤaazM7X)66nwo>s.eecD? n w)!rTO? wr$8tȷv68_)Ds?۷޽HII~ ̜_OwCwM/;ŨQ5./X4l(ϣJ;keב#%Á7h ? կo#ysguҸi"""""Ką _{Z`Qx<%818uU  M7l*+v}}sK7J|<^Z&N4TYlqK#o 2୷>}~gjIt.(ۓ'_m/^yyՊ =z7}€%A/""""""Skݻ?|ue믾,F"(Uun$^+&-=s)4iʕ{~%dh]N59mnE7OٳN=]i?iiP)`""""""frWׯaТ~ڽ)t=do.vr11@RRBצ~d׃M͛-$ave.F/~XV[O}ohܪUeǵʨcǀU$_O)I+)5g۶~eN~Ǡ'۷u߻v`B ,, X2GP<h@Ւ>ؿeK$j?ޔ;R#fH[zc_mlw2c}Lڴɝr;]J={ԅ- n헯;oRSݻj?,Yx׿ii/]hYlz".Ngsz_~EA/"""""ʬ.eb8[7e**>L}?bce R79*JJ,=cpz%'{o$ lR鮻̖o/h2CQ@ˬZ>UTX|y=x~ 11{RMYopu Qu;wOLtVny9' ;= ѯKLƏS܆ 2+ML3Ѩh|U =/rs<8z/%k֟GOGد~^ˁck"5U2S7Zq1oW)2X>*ll**wLxiϿrϿ7o| R_"k""""""w>_tA˭|iSzܹ2squIݒ7x1С~Sgw }AyMet}+4n Wӧݓ'ufffe[~(s)/`W1OF3 $(Q)2~u )S̶o*/ny'rUp<:{6;2fgJzݹ8rٺ_}߽;=.nn-[̚%cƸ[6A/"""""rI`;(/8wYQXhɓϽ{|{w;BgL 3|?.J|/ɜYƴ"i뫯Gå]xQW$b <^Aߪ*Х))k>)XLG:6Cgy=<ϗԹS<`um:wf㏁ɓ}o~|69{0GPʯP֭>utJIiǒ%fi`R_Z/oo۰C-W v>:TƴiiB8nz;/[w}Zcy}\Fpk^#@^[SSec}k7Xs..y X9=ON ^?l6z6o7}JtxCt|{ET9E (y(ݬ,z;=v?WU+|`ڝfd(5rdmiw^~AR͚YDRRe9u5ʺ^xAӧ}ի߉s;vҳR.jv6h_ɚ5J<}~{+ӓwߵu׉26.7R[ltR'O:K̚evlJ)j{~QmJ .ٳJmڤT||{}T?ryԼT5Y| w~*թپ&Vj,_nާ)zZ/>zYsaaJf{vmbb:|X^i|7&W+l^BNVYN+DDDDDt+?4kFV yzHiI2?f7JCmJK̔F+a?I Sj6TxCk\^uwoS)uRGJYO<9Ҧ,oQ_^zImZFDG+ηQdd(d}+u= +yR)ըcQ>?~&)r>ٸQ.zIIJkϢ:T3ZHG_;j¬Q/))JkgV3g~mJJPn uРnTZ:UWNfVo%Θ1_CO=ԁJ;'Ad lYs'pY-7WȈWdR?/:_9瘼:w~)rz@KV粊%v]u͛]iiխQ#V_~WJ=R_~=3x,d @V@orNth޼j>}:lu_Ujy̔g>}>U׏YڵfY盯x@y:atF=yR;tȑ=O_)TGQ9rD~> |_k TxfGeKIҽkնe(˵l)nV%)JL |Y#0c<1+}KWwe p-e?_Ni#scΫWۛsgסwoڵ.WR"s:%CIhOI ٱh| x%Igz5m*t5HZ¦M<8wNy9{VR</@k Tӧ (/\R(z2qK.#C-ɹn[Mw  cl_Uwꔜ{ii*jj{Y4Pʹز#T&%eDD5sgaCI{ x4ol&*}2OnY%ArjMΡv\ׯ7?6%`^rv*LJΪU6I:[O+rsÇ%\judnI4c=) *9v:t{gͫi壏$}'J5o3//<\ΙD筸XRR<#5yjX$%E1u4]V=O^ٺv~s_hB%Z3_NK1N,Zdw1C@Rܲo__:kӎG.…ԛ1c$WNI{@f̰==]RrIQܤ pr?={Acn8QӓޗWbb>MխR[,;/<]\e zik5{}lq{K~nsxIKsw;sQjR#FM7IJYVz{U/<謌6m2}{挳}6guIMkB?A +1^zM7ϓW^ 7FUƌ1HIV_,]V^w;ifYa];3iM_11CuG vR{Mlե9QQU2j>d85;&5ĩSJ wANGRp5"""""ڮx} kKH  ]vxL~D2g(r""BFpC}U);{/\6LFsmV5B;%ˁSZ[(C74i"rwF&_1!ٳx1{' ѣ@bp͚I:8`͒[} RXp! bH',L.=oAr ̽40V6zHR오$(kmyӯ0aBggqˈKlI%f\ٌF{XpKAo%ǖizN$7yr"I׶+_:ȿKG˗~jyL,X,] n]f͒FJ'Tge$%N4=& n5 /~$nHJ~|s瞓{ɹߠ/1unHNԽv]Tr;ް8sr[KZ8O6 Ν+iC:uuNk["#_wnZ<._.)jg I8{omD+_w3y ׫s;qUQR)r2~2曒NJttvy)q*3Sow3G""""""),Q[))ȟ/#;7?8JNbbeN '.\[ʨ'aQ#"!A:2DpKE|Ud\x )Kk~i^>҉íFWV=0.5.5 - qiime2 {{ qiime2_epoch }}.* - q2-types {{ qiime2_epoch }}.* - mafft >=7.394 test: requires: - qiime2 >={{ qiime2 }} - q2-types >={{ q2_types }} - pytest imports: - q2_alignment - qiime2.plugins.alignment about: home: https://qiime2.org license: BSD-3-Clause license_family: BSD q2-alignment-2021.8.0/notebooks/000077500000000000000000000000001411645176200162545ustar00rootroot00000000000000q2-alignment-2021.8.0/notebooks/lane-mask-comparison-results.csv000066400000000000000000000132721411645176200245150ustar00rootroot00000000000000,61,64,67,70,73,76,79,82,85,88,91,94,97,99 0.0,0.16753449622494143,0.16753449622494143,0.16753449622494143,0.16753449622494143,0.16753449622494143,0.16753449622494143,0.16753449622494143,0.16753449622494143,0.16753449622494143,0.16753449622494143,0.16753449622494143,0.16753449622494143,0.16753449622494143,0.16753449622494143 0.05,0.9735745899505337,0.9735745899505337,0.9735745899505337,0.9735745899505337,0.9735745899505337,0.9735745899505337,0.9735745899505337,0.9735745899505337,0.9735745899505337,0.9735745899505337,0.9735745899505337,0.9735745899505337,0.9735745899505337,0.9735745899505337 0.1,0.9735745899505337,0.9735745899505337,0.9735745899505337,0.9735745899505337,0.9735745899505337,0.9735745899505337,0.9735745899505337,0.9735745899505337,0.9735745899505337,0.9735745899505337,0.9735745899505337,0.9735745899505337,0.9735745899505337,0.9735745899505337 0.15000000000000002,0.9735745899505337,0.9735745899505337,0.9735745899505337,0.9735745899505337,0.9735745899505337,0.9735745899505337,0.9735745899505337,0.9735745899505337,0.9735745899505337,0.9735745899505337,0.9735745899505337,0.9735745899505337,0.9735745899505337,0.9735745899505337 0.2,0.9735745899505337,0.9735745899505337,0.9735745899505337,0.9735745899505337,0.9735745899505337,0.9735745899505337,0.9735745899505337,0.9735745899505337,0.9735745899505337,0.9735745899505337,0.9735745899505337,0.9735745899505337,0.9735745899505337,0.9735745899505337 0.25,0.9735745899505337,0.9735745899505337,0.9735745899505337,0.9735745899505337,0.9735745899505337,0.9735745899505337,0.9735745899505337,0.9735745899505337,0.9735745899505337,0.9735745899505337,0.9735745899505337,0.9735745899505337,0.9735745899505337,0.9735745899505337 0.30000000000000004,0.9737047643842749,0.9731840666493101,0.9737047643842749,0.9730538922155688,0.9730538922155688,0.9731840666493101,0.9733142410830513,0.9733142410830513,0.9733142410830513,0.9734444155167925,0.9734444155167925,0.9738349388180162,0.9739651132517574,0.9737047643842749 0.35000000000000003,0.9712314501431919,0.9721426711793804,0.9720124967456392,0.971882322311898,0.971882322311898,0.9722728456131216,0.9721426711793804,0.9729237177818276,0.972533194480604,0.9721426711793804,0.9721426711793804,0.9727935433480864,0.9729237177818276,0.9734444155167925 0.4,0.967586565998438,0.9670658682634731,0.9692788336370737,0.9687581359021088,0.967586565998438,0.9687581359021088,0.9692788336370737,0.9700598802395209,0.9696693569382974,0.9711012757094507,0.9709711012757094,0.9708409268419682,0.9717521478781568,0.9712314501431919 0.45,0.9604269721426711,0.9604269721426711,0.962119239781307,0.962119239781307,0.9648529028898725,0.9666753449622494,0.9673262171309555,0.9679770892996615,0.9677167404321791,0.9671960426972143,0.9668055193959906,0.9668055193959906,0.9673262171309555,0.9679770892996615 0.5,0.9530070294194221,0.9535277271543868,0.954829471491799,0.9563915646966936,0.9593855766727415,0.9612080187451184,0.9613381931788597,0.962119239781307,0.962770111950013,0.9635511585524603,0.9639416818536839,0.9642020307211664,0.9638115074199427,0.9638115074199427 0.55,0.9432439468888311,0.9437646446237958,0.9485810986722207,0.9481905753709972,0.9510544129133038,0.9540484248893517,0.9560010413954699,0.9583441812028117,0.9587347045040354,0.9588648789377766,0.959125227805259,0.9604269721426711,0.960947669877636,0.9605571465764124 0.6000000000000001,0.932829992189534,0.9372559229367352,0.938948190575371,0.9410309815152305,0.9440249934912783,0.9464983077323613,0.9500130174433741,0.9519656339494923,0.9536579015881281,0.9540484248893517,0.9543087737568342,0.9558708669617287,0.9565217391304348,0.9571726112991409 0.65,0.9274928404061442,0.9297058057797448,0.9315282478521218,0.9349127831293934,0.9388180161416297,0.940770632647748,0.9438948190575371,0.9451965633949493,0.9471491799010674,0.9496224941421505,0.9497526685758917,0.9509242384795626,0.9519656339494923,0.9528768549856809 0.7000000000000001,0.9204634209841187,0.9195521999479302,0.9237177818276491,0.9284040614423327,0.9317885967196042,0.9347826086956522,0.9379067951054413,0.9395990627440771,0.9412913303827128,0.9429835980213486,0.9453267378286905,0.9471491799010674,0.9488414475397032,0.948060400937256 0.75,0.9138245248633169,0.9131736526946108,0.9153866180682114,0.9203332465503775,0.9238479562613903,0.9284040614423327,0.9303566779484509,0.9333506899244989,0.9351731319968758,0.9372559229367352,0.9394688883103358,0.9419422025514189,0.9435042957563134,0.9438948190575371 0.8,0.907836500911221,0.9074459776099973,0.9069252798750326,0.9097891174173393,0.9142150481645405,0.9174694090080708,0.9224160374902369,0.9248893517313199,0.9287945847435564,0.9313980734183807,0.9330903410570164,0.9341317365269461,0.9362145274668056,0.9380369695391825 0.8500000000000001,0.8989846394168185,0.8975527206456652,0.8979432439468888,0.89807341838063,0.9032803957302785,0.907185628742515,0.912132257224681,0.9155167925019526,0.9203332465503775,0.923066909658943,0.9243686539963551,0.9264514449362146,0.9272324915386618,0.9278833637073679 0.9,0.8945587086696173,0.8915646966935694,0.8906534756573808,0.8905233012236397,0.8923457432960167,0.8961208018745118,0.9010674303566779,0.9053631866701379,0.9088778963811508,0.913303827128352,0.9165581879718824,0.9195521999479302,0.9203332465503775,0.9207237698516011 0.9500000000000001,0.8781567300182245,0.8713876594636814,0.8715178338974225,0.8746420203072116,0.8763342879458474,0.8808903931267899,0.8846654517052851,0.8887008591512627,0.8924759177297579,0.8966414996094767,0.9004165581879718,0.9040614423327259,0.9067951054412914,0.9083571986461859 1.0,0.8624056235355376,0.8513407966675345,0.8444415516792502,0.8350689924498829,0.8311637594376464,0.8306430617026815,0.8306430617026815,0.8315542827388701,0.8319448060400937,0.8322051549075762,0.8323353293413174,0.8323353293413174,0.8323353293413174,0.8323353293413174 q2-alignment-2021.8.0/notebooks/lane-mask-comparison.ipynb000066400000000000000000003551451411645176200233540ustar00rootroot00000000000000{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "This notebook illustrates how the initial default parameter setting of ``min_conservation=0.40`` for ``q2_alignment.mask``. **This analysis is a stopgap to get us a reasonable starting value for this.** From here, we plan to explore how ``min_conservation`` impacts the trees that result from this process. \n", "\n", "This notebook uses private aspects of the API, so is not guaranteed to work with future versions (but you can always access the commit where this notebook was last modified - the code here should work with that commit).\n", "\n", "Our goal here was to find the highest value of ``min_conservation`` that seems to reproduce the Lane mask based on the Greegenes 13_8 OTUs alignments. We compute conservations based on the Greengenes alignments, and then indicate which positions would be retained (getting a value of ``1``) or excluded (getting a value of ``0``) for a range of values ``min_conservation``, which we represent in a binary mask. We then compare each of these binary masks to the Lane mask, to see what fraction of positions are identical. " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Prepare the analysis\n", "\n", "* Load the Lane mask from QIIME default reference \n", "* Define functions that will be used\n", "* Compare masks for a range of min_conservation values and for all of the reference OTU alignments to the Lane mask\n", "* Load the results into a ``pandas.DataFrame``" ] }, { "cell_type": "code", "execution_count": 57, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0.1.3\n" ] } ], "source": [ "import skbio\n", "import numpy as np\n", "import qiime_default_reference\n", "from q2_alignment._filter import _compute_conservation_mask, _compute_frequencies\n", "\n", "lane_mask = [i == '1' for i in qiime_default_reference.get_template_alignment_column_mask().decode()]\n", "print(qiime_default_reference.__version__)" ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "collapsed": false }, "outputs": [], "source": [ "def compare_masks(mask1, mask2):\n", " if len(mask1) != len(mask2):\n", " raise ValueError('Only masks of equal length can be compared.')\n", " matches = sum(np.array(mask1) == np.array(mask2))\n", " return matches / len(mask1)\n", "\n", "def compute_and_compare_masks(alignment_path, lane_mask):\n", " alignment = skbio.TabularMSA.read(alignment_path, constructor=skbio.DNA, lowercase=True)\n", " frequencies = _compute_frequencies(alignment)\n", " result = {}\n", " for c in np.arange(0.0, 1.01, 0.05):\n", " mask = _compute_conservation_mask(frequencies, skbio.DNA, c)\n", " result[c] = compare_masks(mask, lane_mask)\n", " return result" ] }, { "cell_type": "code", "execution_count": 22, "metadata": { "collapsed": true }, "outputs": [], "source": [ "import glob\n", "import os\n", "alignment_paths = glob.glob(\"/Users/caporaso/data/gg_13_8_otus/rep_set_aligned/*_otus.fasta\")" ] }, { "cell_type": "code", "execution_count": 23, "metadata": { "collapsed": false }, "outputs": [], "source": [ "data = {}\n", "for alignment_path in alignment_paths:\n", " percent_id = int(os.path.split(alignment_path)[1][:2])\n", " data[percent_id] = compute_and_compare_masks(alignment_path, lane_mask)" ] }, { "cell_type": "code", "execution_count": 39, "metadata": { "collapsed": false }, "outputs": [], "source": [ "import pandas as pd\n", "df = pd.DataFrame(data)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Analyze results\n", "\n", "* Visualize data in a heatmap\n", "* Write data to file\n", "* Test for correlation between referece OTU percent identities (this can take a long time to compute, so this suggests that the 61% OTUs are a reasonable proxy for the 99% OTUs). " ] }, { "cell_type": "code", "execution_count": 60, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 60, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "%matplotlib inline\n", "\n", "import seaborn as sns\n", "import matplotlib.pyplot as plt\n", "\n", "fig = plt.figure()\n", "ax = fig.add_subplot(1, 1, 1)\n", "fig.set_size_inches((12, 12))\n", "sns.heatmap(df, vmin=0.80, vmax=1.0, annot=True, ax=ax)\n", "ax.set_xlabel('Reference OTU percent identity')\n", "ax.set_ylabel('Minimum conservation threshold')\n", "ax.set_title('Fraction of identical positions between dynamically computed mask and Lane mask')\n" ] }, { "cell_type": "code", "execution_count": 26, "metadata": { "collapsed": true }, "outputs": [], "source": [ "df.to_csv('mask_match_summary.csv')" ] }, { "cell_type": "code", "execution_count": 28, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
6164677073767982858891949799
611.0000000.9998380.9995950.9991320.9986960.9984120.9980590.9978020.9974220.9970510.9967210.9963120.9960230.995873
640.9998381.0000000.9999150.9996200.9992840.9989920.9986320.9983340.9979200.9975020.9971230.9966890.9963830.996228
670.9995950.9999151.0000000.9998630.9996260.9993860.9990510.9987650.9983500.9979340.9975620.9971450.9968540.996689
700.9991320.9996200.9998631.0000000.9999200.9997750.9995210.9992780.9989190.9985590.9982370.9978720.9976240.997476
730.9986960.9992840.9996260.9999201.0000000.9999520.9997990.9996140.9993340.9990250.9987390.9984190.9982000.998073
760.9984120.9989920.9993860.9997750.9999521.0000000.9999390.9998280.9996220.9993780.9991470.9988830.9987010.998589
790.9980590.9986320.9990510.9995210.9997990.9999391.0000000.9999670.9998580.9996930.9995180.9993130.9991670.999079
820.9978020.9983340.9987650.9992780.9996140.9998280.9999671.0000000.9999560.9998510.9997240.9995670.9994490.999376
850.9974220.9979200.9983500.9989190.9993340.9996220.9998580.9999561.0000000.9999640.9998880.9997800.9996920.999640
880.9970510.9975020.9979340.9985590.9990250.9993780.9996930.9998510.9999641.0000000.9999760.9999140.9998560.999819
910.9967210.9971230.9975620.9982370.9987390.9991470.9995180.9997240.9998880.9999761.0000000.9999790.9999460.999919
940.9963120.9966890.9971450.9978720.9984190.9988830.9993130.9995670.9997800.9999140.9999791.0000000.9999890.999973
970.9960230.9963830.9968540.9976240.9982000.9987010.9991670.9994490.9996920.9998560.9999460.9999891.0000000.999993
990.9958730.9962280.9966890.9974760.9980730.9985890.9990790.9993760.9996400.9998190.9999190.9999730.9999931.000000
\n", "
" ], "text/plain": [ " 61 64 67 70 73 76 79 \\\n", "61 1.000000 0.999838 0.999595 0.999132 0.998696 0.998412 0.998059 \n", "64 0.999838 1.000000 0.999915 0.999620 0.999284 0.998992 0.998632 \n", "67 0.999595 0.999915 1.000000 0.999863 0.999626 0.999386 0.999051 \n", "70 0.999132 0.999620 0.999863 1.000000 0.999920 0.999775 0.999521 \n", "73 0.998696 0.999284 0.999626 0.999920 1.000000 0.999952 0.999799 \n", "76 0.998412 0.998992 0.999386 0.999775 0.999952 1.000000 0.999939 \n", "79 0.998059 0.998632 0.999051 0.999521 0.999799 0.999939 1.000000 \n", "82 0.997802 0.998334 0.998765 0.999278 0.999614 0.999828 0.999967 \n", "85 0.997422 0.997920 0.998350 0.998919 0.999334 0.999622 0.999858 \n", "88 0.997051 0.997502 0.997934 0.998559 0.999025 0.999378 0.999693 \n", "91 0.996721 0.997123 0.997562 0.998237 0.998739 0.999147 0.999518 \n", "94 0.996312 0.996689 0.997145 0.997872 0.998419 0.998883 0.999313 \n", "97 0.996023 0.996383 0.996854 0.997624 0.998200 0.998701 0.999167 \n", "99 0.995873 0.996228 0.996689 0.997476 0.998073 0.998589 0.999079 \n", "\n", " 82 85 88 91 94 97 99 \n", "61 0.997802 0.997422 0.997051 0.996721 0.996312 0.996023 0.995873 \n", "64 0.998334 0.997920 0.997502 0.997123 0.996689 0.996383 0.996228 \n", "67 0.998765 0.998350 0.997934 0.997562 0.997145 0.996854 0.996689 \n", "70 0.999278 0.998919 0.998559 0.998237 0.997872 0.997624 0.997476 \n", "73 0.999614 0.999334 0.999025 0.998739 0.998419 0.998200 0.998073 \n", "76 0.999828 0.999622 0.999378 0.999147 0.998883 0.998701 0.998589 \n", "79 0.999967 0.999858 0.999693 0.999518 0.999313 0.999167 0.999079 \n", "82 1.000000 0.999956 0.999851 0.999724 0.999567 0.999449 0.999376 \n", "85 0.999956 1.000000 0.999964 0.999888 0.999780 0.999692 0.999640 \n", "88 0.999851 0.999964 1.000000 0.999976 0.999914 0.999856 0.999819 \n", "91 0.999724 0.999888 0.999976 1.000000 0.999979 0.999946 0.999919 \n", "94 0.999567 0.999780 0.999914 0.999979 1.000000 0.999989 0.999973 \n", "97 0.999449 0.999692 0.999856 0.999946 0.999989 1.000000 0.999993 \n", "99 0.999376 0.999640 0.999819 0.999919 0.999973 0.999993 1.000000 " ] }, "execution_count": 28, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.corr()" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.5.2" } }, "nbformat": 4, "nbformat_minor": 0 } q2-alignment-2021.8.0/q2_alignment/000077500000000000000000000000001411645176200166315ustar00rootroot00000000000000q2-alignment-2021.8.0/q2_alignment/__init__.py000066400000000000000000000010451411645176200207420ustar00rootroot00000000000000# ---------------------------------------------------------------------------- # Copyright (c) 2016-2021, QIIME 2 development team. # # Distributed under the terms of the Modified BSD License. # # The full license is in the file LICENSE, distributed with this software. # ---------------------------------------------------------------------------- from ._mafft import mafft, mafft_add from ._filter import mask from ._version import get_versions __version__ = get_versions()['version'] del get_versions __all__ = ['mafft', 'mask', 'mafft_add'] q2-alignment-2021.8.0/q2_alignment/_filter.py000066400000000000000000000106001411645176200206240ustar00rootroot00000000000000# ---------------------------------------------------------------------------- # Copyright (c) 2016-2021, QIIME 2 development team. # # Distributed under the terms of the Modified BSD License. # # The full license is in the file LICENSE, distributed with this software. # ---------------------------------------------------------------------------- import skbio import numpy as np def _most_conserved(frequencies, sequence_dtype, gap_mode='ignore'): if gap_mode != 'ignore': raise ValueError('Unknown gap_mode: %s. ignore is currently the only ' 'supported gap_mode.' % gap_mode) result = [] for frequency_vector in frequencies: for gap in sequence_dtype.gap_chars: if gap in frequency_vector: del frequency_vector[gap] frequency_values = list(frequency_vector.values()) if len(frequency_values) == 0: result.append(0.0) else: result.append(np.max(frequency_values) / np.sum(frequency_values)) return result def _compute_conservation_mask(frequencies, sequence_dtype, min_conservation): mask = [c >= min_conservation for c in _most_conserved(frequencies, sequence_dtype)] return np.array(mask) def _compute_gap_mask(frequencies, sequence_dtype, max_gap_frequency): gap_frequencies = [] num_sequences = np.sum(list(frequencies[0].values())) for f in frequencies: gap_frequency = np.sum([f.get(gc, 0.0) for gc in sequence_dtype.gap_chars]) gap_frequencies.append(gap_frequency/num_sequences) mask = [f <= max_gap_frequency for f in gap_frequencies] return np.array(mask) def _apply_mask(alignment, mask): return alignment[:, mask] def _compute_frequencies(alignment): # this try/accept allows us to support the ignore_metadata optimization # available in scikit-bio 0.5.0 and later, but be backward compatible # with scikit-bio 0.4.2, which some plugins depend on. try: return [c.frequencies() for c in alignment.iter_positions(ignore_metadata=True)] except TypeError: return [c.frequencies() for c in alignment.iter_positions()] def mask(alignment: skbio.TabularMSA, max_gap_frequency: float = 1.0, min_conservation: float = 0.40) -> skbio.TabularMSA: # check that parameters are in range if max_gap_frequency < 0.0 or max_gap_frequency > 1.0: raise ValueError('max_gap_frequency out of range [0.0, 1.0]: %f' % max_gap_frequency) if min_conservation < 0.0 or min_conservation > 1.0: raise ValueError('min_conservation out of range [0.0, 1.0]: %f' % min_conservation) # check that input alignment is not empty if alignment.shape.position == 0: raise ValueError('Input alignment is empty (i.e., there are zero ' 'sequences or positions in the input alignment).') # compute frequencies of all alphabet characters frequencies = _compute_frequencies(alignment) # compute gap and conservation masks, and then combine them sequence_dtype = alignment.dtype gap_mask = _compute_gap_mask(frequencies, sequence_dtype, max_gap_frequency) conservation_mask = _compute_conservation_mask(frequencies, sequence_dtype, min_conservation) combined_mask = gap_mask & conservation_mask # apply the mask and return the resulting alignment result = _apply_mask(alignment, combined_mask) if result.shape.position == 0: num_input_positions = alignment.shape.position frac_passed_gap = (gap_mask.sum() / num_input_positions) str_passed_gap = '{percent:.2%}'.format(percent=frac_passed_gap) frac_passed_conservation = \ (conservation_mask.sum() / num_input_positions) str_passed_conservation = \ '{percent:.2%}'.format(percent=frac_passed_conservation) raise ValueError("No alignment positions remain after filtering. The " "filter thresholds will need to be relaxed. %s " "of positions were retained by the gap filter, and " "%s of positions were retained by the " "conservation filter." % (str_passed_gap, str_passed_conservation)) return result q2-alignment-2021.8.0/q2_alignment/_mafft.py000066400000000000000000000126771411645176200204540ustar00rootroot00000000000000# ---------------------------------------------------------------------------- # Copyright (c) 2016-2021, QIIME 2 development team. # # Distributed under the terms of the Modified BSD License. # # The full license is in the file LICENSE, distributed with this software. # ---------------------------------------------------------------------------- import subprocess import skbio import skbio.io from q2_types.feature_data import DNAFASTAFormat, AlignedDNAFASTAFormat def run_command(cmd, output_fp, verbose=True): if verbose: print("Running external command line application. This may print " "messages to stdout and/or stderr.") print("The command being run is below. This command cannot " "be manually re-run as it will depend on temporary files that " "no longer exist.") print("\nCommand:", end=' ') print(" ".join(cmd), end='\n\n') with open(output_fp, 'w') as output_f: subprocess.run(cmd, stdout=output_f, check=True) def _mafft(sequences_fp, alignment_fp, n_threads, parttree, addfragments): # Save original sequence IDs since long ids (~250 chars) can be truncated # by mafft. We'll replace the IDs in the aligned sequences file output by # mafft with the originals. # # https://github.com/qiime2/q2-alignment/issues/37 aligned_seq_ids = {} unaligned_seq_ids = {} if alignment_fp is not None: for seq in skbio.io.read(alignment_fp, format='fasta', constructor=skbio.DNA): id_ = seq.metadata['id'] if id_ in aligned_seq_ids: raise ValueError( "A sequence ID is duplicated in the aligned sequences: " "%r" % id_) else: aligned_seq_ids[id_] = True for seq in skbio.io.read(sequences_fp, format='fasta', constructor=skbio.DNA): id_ = seq.metadata['id'] if id_ in unaligned_seq_ids: raise ValueError( "A sequence ID is duplicated in the unaligned sequences: " "%r" % id_) elif id_ in aligned_seq_ids: raise ValueError( "A sequence ID is present in both the aligned and unaligned " "sequences: %r" % id_) else: unaligned_seq_ids[id_] = True result = AlignedDNAFASTAFormat() result_fp = str(result) ids = {**aligned_seq_ids, **unaligned_seq_ids} # mafft will fail if the number of sequences is larger than 1 million. # mafft requires using parttree which is an algorithm to build an # approximate tree from a large number of unaligned sequences. # By catching the error below if a user has not used parttree flag, we are # eliminating the need for the mafft error to be shown to the user which # can be confusing and intimidating. if not parttree and len(ids) > 1000000: raise ValueError( "The number of sequences in your feature table is larger than " "1 million, please use the parttree parameter") # mafft's signal for utilizing all cores is -1. We want to our users # to enter auto for using all cores. This is to prevent any confusion and # to keep the UX consisent. if n_threads == 'auto': n_threads = -1 # `--inputorder` must be turned on because we need the input and output in # the same sequence order to replace the IDs below. This is mafft's default # behavior but we pass the flag in case that changes in the future. cmd = ["mafft", "--preservecase", "--inputorder", "--thread", str(n_threads)] if parttree: cmd += ['--parttree'] if alignment_fp is not None: add_flag = '--addfragments' if addfragments else '--add' cmd += [add_flag, sequences_fp, alignment_fp] else: cmd += [sequences_fp] run_command(cmd, result_fp) # Read output alignment into memory, reassign original sequence IDs, and # write alignment back to disk. msa = skbio.TabularMSA.read(result_fp, format='fasta', constructor=skbio.DNA) # Using `assert` because mafft would have had to add or drop sequences # while aligning, which would be a bug on mafft's end. This is just a # sanity check and is not expected to trigger in practice. assert len(ids) == len(msa) for id, seq in zip(ids, msa): seq.metadata['id'] = id # Turning off roundtripping options to speed up writing. We can safely turn # these options off because we know the sequence IDs are rountrip-safe # since we read them from a FASTA file above. # # http://scikit-bio.org/docs/latest/generated/ # skbio.io.format.fasta.html#writer-specific-parameters msa.write(result_fp, id_whitespace_replacement=None, description_newline_replacement=None) return result def mafft(sequences: DNAFASTAFormat, n_threads: int = 1, parttree: bool = False) -> AlignedDNAFASTAFormat: sequences_fp = str(sequences) return _mafft(sequences_fp, None, n_threads, parttree, False) def mafft_add(alignment: AlignedDNAFASTAFormat, sequences: DNAFASTAFormat, n_threads: int = 1, parttree: bool = False, addfragments: bool = False) -> AlignedDNAFASTAFormat: alignment_fp = str(alignment) sequences_fp = str(sequences) return _mafft( sequences_fp, alignment_fp, n_threads, parttree, addfragments) q2-alignment-2021.8.0/q2_alignment/_version.py000066400000000000000000000441151411645176200210340ustar00rootroot00000000000000 # This file helps to compute a version number in source trees obtained from # git-archive tarball (such as those provided by githubs download-from-tag # feature). Distribution tarballs (built by setup.py sdist) and build # directories (produced by setup.py build) will contain a much shorter file # that just contains the computed version number. # This file is released into the public domain. Generated by # versioneer-0.18 (https://github.com/warner/python-versioneer) """Git implementation of _version.py.""" import errno import os import re import subprocess import sys def get_keywords(): """Get the keywords needed to look up the version information.""" # these strings will be replaced by git during git-archive. # setup.py/versioneer.py will grep for the variable names, so they must # each be defined on a line of their own. _version.py will just call # get_keywords(). git_refnames = " (tag: 2021.8.0)" git_full = "1abd1be756284f20cd172cf9e9b1e713527febfb" git_date = "2021-09-09 18:35:30 +0000" keywords = {"refnames": git_refnames, "full": git_full, "date": git_date} return keywords class VersioneerConfig: """Container for Versioneer configuration parameters.""" def get_config(): """Create, populate and return the VersioneerConfig() object.""" # these strings are filled in when 'setup.py versioneer' creates # _version.py cfg = VersioneerConfig() cfg.VCS = "git" cfg.style = "pep440" cfg.tag_prefix = "" cfg.parentdir_prefix = "q2-alignment-" cfg.versionfile_source = "q2_alignment/_version.py" cfg.verbose = False return cfg class NotThisMethod(Exception): """Exception raised if a method is not valid for the current scenario.""" LONG_VERSION_PY = {} HANDLERS = {} def register_vcs_handler(vcs, method): # decorator """Decorator to mark a method as the handler for a particular VCS.""" def decorate(f): """Store f in HANDLERS[vcs][method].""" if vcs not in HANDLERS: HANDLERS[vcs] = {} HANDLERS[vcs][method] = f return f return decorate def run_command(commands, args, cwd=None, verbose=False, hide_stderr=False, env=None): """Call the given command(s).""" assert isinstance(commands, list) p = None for c in commands: try: dispcmd = str([c] + args) # remember shell=False, so use git.cmd on windows, not just git p = subprocess.Popen([c] + args, cwd=cwd, env=env, stdout=subprocess.PIPE, stderr=(subprocess.PIPE if hide_stderr else None)) break except EnvironmentError: e = sys.exc_info()[1] if e.errno == errno.ENOENT: continue if verbose: print("unable to run %s" % dispcmd) print(e) return None, None else: if verbose: print("unable to find command, tried %s" % (commands,)) return None, None stdout = p.communicate()[0].strip() if sys.version_info[0] >= 3: stdout = stdout.decode() if p.returncode != 0: if verbose: print("unable to run %s (error)" % dispcmd) print("stdout was %s" % stdout) return None, p.returncode return stdout, p.returncode def versions_from_parentdir(parentdir_prefix, root, verbose): """Try to determine the version from the parent directory name. Source tarballs conventionally unpack into a directory that includes both the project name and a version string. We will also support searching up two directory levels for an appropriately named parent directory """ rootdirs = [] for i in range(3): dirname = os.path.basename(root) if dirname.startswith(parentdir_prefix): return {"version": dirname[len(parentdir_prefix):], "full-revisionid": None, "dirty": False, "error": None, "date": None} else: rootdirs.append(root) root = os.path.dirname(root) # up a level if verbose: print("Tried directories %s but none started with prefix %s" % (str(rootdirs), parentdir_prefix)) raise NotThisMethod("rootdir doesn't start with parentdir_prefix") @register_vcs_handler("git", "get_keywords") def git_get_keywords(versionfile_abs): """Extract version information from the given file.""" # the code embedded in _version.py can just fetch the value of these # keywords. When used from setup.py, we don't want to import _version.py, # so we do it with a regexp instead. This function is not used from # _version.py. keywords = {} try: f = open(versionfile_abs, "r") for line in f.readlines(): if line.strip().startswith("git_refnames ="): mo = re.search(r'=\s*"(.*)"', line) if mo: keywords["refnames"] = mo.group(1) if line.strip().startswith("git_full ="): mo = re.search(r'=\s*"(.*)"', line) if mo: keywords["full"] = mo.group(1) if line.strip().startswith("git_date ="): mo = re.search(r'=\s*"(.*)"', line) if mo: keywords["date"] = mo.group(1) f.close() except EnvironmentError: pass return keywords @register_vcs_handler("git", "keywords") def git_versions_from_keywords(keywords, tag_prefix, verbose): """Get version information from git keywords.""" if not keywords: raise NotThisMethod("no keywords at all, weird") date = keywords.get("date") if date is not None: # git-2.2.0 added "%cI", which expands to an ISO-8601 -compliant # datestamp. However we prefer "%ci" (which expands to an "ISO-8601 # -like" string, which we must then edit to make compliant), because # it's been around since git-1.5.3, and it's too difficult to # discover which version we're using, or to work around using an # older one. date = date.strip().replace(" ", "T", 1).replace(" ", "", 1) refnames = keywords["refnames"].strip() if refnames.startswith("$Format"): if verbose: print("keywords are unexpanded, not using") raise NotThisMethod("unexpanded keywords, not a git-archive tarball") refs = set([r.strip() for r in refnames.strip("()").split(",")]) # starting in git-1.8.3, tags are listed as "tag: foo-1.0" instead of # just "foo-1.0". If we see a "tag: " prefix, prefer those. TAG = "tag: " tags = set([r[len(TAG):] for r in refs if r.startswith(TAG)]) if not tags: # Either we're using git < 1.8.3, or there really are no tags. We use # a heuristic: assume all version tags have a digit. The old git %d # expansion behaves like git log --decorate=short and strips out the # refs/heads/ and refs/tags/ prefixes that would let us distinguish # between branches and tags. By ignoring refnames without digits, we # filter out many common branch names like "release" and # "stabilization", as well as "HEAD" and "master". tags = set([r for r in refs if re.search(r'\d', r)]) if verbose: print("discarding '%s', no digits" % ",".join(refs - tags)) if verbose: print("likely tags: %s" % ",".join(sorted(tags))) for ref in sorted(tags): # sorting will prefer e.g. "2.0" over "2.0rc1" if ref.startswith(tag_prefix): r = ref[len(tag_prefix):] if verbose: print("picking %s" % r) return {"version": r, "full-revisionid": keywords["full"].strip(), "dirty": False, "error": None, "date": date} # no suitable tags, so version is "0+unknown", but full hex is still there if verbose: print("no suitable tags, using unknown + full revision id") return {"version": "0+unknown", "full-revisionid": keywords["full"].strip(), "dirty": False, "error": "no suitable tags", "date": None} @register_vcs_handler("git", "pieces_from_vcs") def git_pieces_from_vcs(tag_prefix, root, verbose, run_command=run_command): """Get version from 'git describe' in the root of the source tree. This only gets called if the git-archive 'subst' keywords were *not* expanded, and _version.py hasn't already been rewritten with a short version string, meaning we're inside a checked out source tree. """ GITS = ["git"] if sys.platform == "win32": GITS = ["git.cmd", "git.exe"] out, rc = run_command(GITS, ["rev-parse", "--git-dir"], cwd=root, hide_stderr=True) if rc != 0: if verbose: print("Directory %s not under git control" % root) raise NotThisMethod("'git rev-parse --git-dir' returned error") # if there is a tag matching tag_prefix, this yields TAG-NUM-gHEX[-dirty] # if there isn't one, this yields HEX[-dirty] (no NUM) describe_out, rc = run_command(GITS, ["describe", "--tags", "--dirty", "--always", "--long", "--match", "%s*" % tag_prefix], cwd=root) # --long was added in git-1.5.5 if describe_out is None: raise NotThisMethod("'git describe' failed") describe_out = describe_out.strip() full_out, rc = run_command(GITS, ["rev-parse", "HEAD"], cwd=root) if full_out is None: raise NotThisMethod("'git rev-parse' failed") full_out = full_out.strip() pieces = {} pieces["long"] = full_out pieces["short"] = full_out[:7] # maybe improved later pieces["error"] = None # parse describe_out. It will be like TAG-NUM-gHEX[-dirty] or HEX[-dirty] # TAG might have hyphens. git_describe = describe_out # look for -dirty suffix dirty = git_describe.endswith("-dirty") pieces["dirty"] = dirty if dirty: git_describe = git_describe[:git_describe.rindex("-dirty")] # now we have TAG-NUM-gHEX or HEX if "-" in git_describe: # TAG-NUM-gHEX mo = re.search(r'^(.+)-(\d+)-g([0-9a-f]+)$', git_describe) if not mo: # unparseable. Maybe git-describe is misbehaving? pieces["error"] = ("unable to parse git-describe output: '%s'" % describe_out) return pieces # tag full_tag = mo.group(1) if not full_tag.startswith(tag_prefix): if verbose: fmt = "tag '%s' doesn't start with prefix '%s'" print(fmt % (full_tag, tag_prefix)) pieces["error"] = ("tag '%s' doesn't start with prefix '%s'" % (full_tag, tag_prefix)) return pieces pieces["closest-tag"] = full_tag[len(tag_prefix):] # distance: number of commits since tag pieces["distance"] = int(mo.group(2)) # commit: short hex revision ID pieces["short"] = mo.group(3) else: # HEX: no tags pieces["closest-tag"] = None count_out, rc = run_command(GITS, ["rev-list", "HEAD", "--count"], cwd=root) pieces["distance"] = int(count_out) # total number of commits # commit date: see ISO-8601 comment in git_versions_from_keywords() date = run_command(GITS, ["show", "-s", "--format=%ci", "HEAD"], cwd=root)[0].strip() pieces["date"] = date.strip().replace(" ", "T", 1).replace(" ", "", 1) return pieces def plus_or_dot(pieces): """Return a + if we don't already have one, else return a .""" if "+" in pieces.get("closest-tag", ""): return "." return "+" def render_pep440(pieces): """Build up version string, with post-release "local version identifier". Our goal: TAG[+DISTANCE.gHEX[.dirty]] . Note that if you get a tagged build and then dirty it, you'll get TAG+0.gHEX.dirty Exceptions: 1: no tags. git_describe was just HEX. 0+untagged.DISTANCE.gHEX[.dirty] """ if pieces["closest-tag"]: rendered = pieces["closest-tag"] if pieces["distance"] or pieces["dirty"]: rendered += plus_or_dot(pieces) rendered += "%d.g%s" % (pieces["distance"], pieces["short"]) if pieces["dirty"]: rendered += ".dirty" else: # exception #1 rendered = "0+untagged.%d.g%s" % (pieces["distance"], pieces["short"]) if pieces["dirty"]: rendered += ".dirty" return rendered def render_pep440_pre(pieces): """TAG[.post.devDISTANCE] -- No -dirty. Exceptions: 1: no tags. 0.post.devDISTANCE """ if pieces["closest-tag"]: rendered = pieces["closest-tag"] if pieces["distance"]: rendered += ".post.dev%d" % pieces["distance"] else: # exception #1 rendered = "0.post.dev%d" % pieces["distance"] return rendered def render_pep440_post(pieces): """TAG[.postDISTANCE[.dev0]+gHEX] . The ".dev0" means dirty. Note that .dev0 sorts backwards (a dirty tree will appear "older" than the corresponding clean one), but you shouldn't be releasing software with -dirty anyways. Exceptions: 1: no tags. 0.postDISTANCE[.dev0] """ if pieces["closest-tag"]: rendered = pieces["closest-tag"] if pieces["distance"] or pieces["dirty"]: rendered += ".post%d" % pieces["distance"] if pieces["dirty"]: rendered += ".dev0" rendered += plus_or_dot(pieces) rendered += "g%s" % pieces["short"] else: # exception #1 rendered = "0.post%d" % pieces["distance"] if pieces["dirty"]: rendered += ".dev0" rendered += "+g%s" % pieces["short"] return rendered def render_pep440_old(pieces): """TAG[.postDISTANCE[.dev0]] . The ".dev0" means dirty. Eexceptions: 1: no tags. 0.postDISTANCE[.dev0] """ if pieces["closest-tag"]: rendered = pieces["closest-tag"] if pieces["distance"] or pieces["dirty"]: rendered += ".post%d" % pieces["distance"] if pieces["dirty"]: rendered += ".dev0" else: # exception #1 rendered = "0.post%d" % pieces["distance"] if pieces["dirty"]: rendered += ".dev0" return rendered def render_git_describe(pieces): """TAG[-DISTANCE-gHEX][-dirty]. Like 'git describe --tags --dirty --always'. Exceptions: 1: no tags. HEX[-dirty] (note: no 'g' prefix) """ if pieces["closest-tag"]: rendered = pieces["closest-tag"] if pieces["distance"]: rendered += "-%d-g%s" % (pieces["distance"], pieces["short"]) else: # exception #1 rendered = pieces["short"] if pieces["dirty"]: rendered += "-dirty" return rendered def render_git_describe_long(pieces): """TAG-DISTANCE-gHEX[-dirty]. Like 'git describe --tags --dirty --always -long'. The distance/hash is unconditional. Exceptions: 1: no tags. HEX[-dirty] (note: no 'g' prefix) """ if pieces["closest-tag"]: rendered = pieces["closest-tag"] rendered += "-%d-g%s" % (pieces["distance"], pieces["short"]) else: # exception #1 rendered = pieces["short"] if pieces["dirty"]: rendered += "-dirty" return rendered def render(pieces, style): """Render the given version pieces into the requested style.""" if pieces["error"]: return {"version": "unknown", "full-revisionid": pieces.get("long"), "dirty": None, "error": pieces["error"], "date": None} if not style or style == "default": style = "pep440" # the default if style == "pep440": rendered = render_pep440(pieces) elif style == "pep440-pre": rendered = render_pep440_pre(pieces) elif style == "pep440-post": rendered = render_pep440_post(pieces) elif style == "pep440-old": rendered = render_pep440_old(pieces) elif style == "git-describe": rendered = render_git_describe(pieces) elif style == "git-describe-long": rendered = render_git_describe_long(pieces) else: raise ValueError("unknown style '%s'" % style) return {"version": rendered, "full-revisionid": pieces["long"], "dirty": pieces["dirty"], "error": None, "date": pieces.get("date")} def get_versions(): """Get version information or return default if unable to do so.""" # I am in _version.py, which lives at ROOT/VERSIONFILE_SOURCE. If we have # __file__, we can work backwards from there to the root. Some # py2exe/bbfreeze/non-CPython implementations don't do __file__, in which # case we can only use expanded keywords. cfg = get_config() verbose = cfg.verbose try: return git_versions_from_keywords(get_keywords(), cfg.tag_prefix, verbose) except NotThisMethod: pass try: root = os.path.realpath(__file__) # versionfile_source is the relative path from the top of the source # tree (where the .git directory might live) to this file. Invert # this to find the root from __file__. for i in cfg.versionfile_source.split('/'): root = os.path.dirname(root) except NameError: return {"version": "0+unknown", "full-revisionid": None, "dirty": None, "error": "unable to find root of source tree", "date": None} try: pieces = git_pieces_from_vcs(cfg.tag_prefix, root, verbose) return render(pieces, cfg.style) except NotThisMethod: pass try: if cfg.parentdir_prefix: return versions_from_parentdir(cfg.parentdir_prefix, root, verbose) except NotThisMethod: pass return {"version": "0+unknown", "full-revisionid": None, "dirty": None, "error": "unable to compute version", "date": None} q2-alignment-2021.8.0/q2_alignment/citations.bib000066400000000000000000000012321411645176200213020ustar00rootroot00000000000000@article{katoh2013mafft, title={MAFFT multiple sequence alignment software version 7: improvements in performance and usability}, author={Katoh, Kazutaka and Standley, Daron M}, journal={Molecular biology and evolution}, volume={30}, number={4}, pages={772--780}, year={2013}, publisher={Society for Molecular Biology and Evolution}, doi={10.1093/molbev/mst010} } @incollection{lane1991, title={16S/23S rRNA sequencing}, author={Lane, DJ}, editor={Stackebrandt, E and Goodfellow, M}, booktitle={Nucleic Acid Techniques in Bacterial Systematics}, publisher={John Wiley and Sons}, address={New York}, year={1991}, pages={115--175} } q2-alignment-2021.8.0/q2_alignment/plugin_setup.py000066400000000000000000000123531411645176200217250ustar00rootroot00000000000000# ---------------------------------------------------------------------------- # Copyright (c) 2016-2021, QIIME 2 development team. # # Distributed under the terms of the Modified BSD License. # # The full license is in the file LICENSE, distributed with this software. # ---------------------------------------------------------------------------- from qiime2.plugin import ( Plugin, Float, Int, Bool, Range, Citations, Str, Choices) from q2_types.feature_data import FeatureData, Sequence, AlignedSequence import q2_alignment citations = Citations.load('citations.bib', package='q2_alignment') plugin = Plugin( name='alignment', version=q2_alignment.__version__, website='https://github.com/qiime2/q2-alignment', package='q2_alignment', description=('This QIIME 2 plugin provides support for generating ' 'and manipulating sequence alignments.'), short_description='Plugin for generating and manipulating alignments.' ) plugin.methods.register_function( function=q2_alignment.mafft, inputs={'sequences': FeatureData[Sequence]}, parameters={'n_threads': Int % Range(1, None) | Str % Choices(['auto']), 'parttree': Bool}, outputs=[('alignment', FeatureData[AlignedSequence])], input_descriptions={'sequences': 'The sequences to be aligned.'}, parameter_descriptions={ 'n_threads': 'The number of threads. (Use `auto` to automatically use ' 'all available cores)', 'parttree': 'This flag is required if the number of sequences being ' 'aligned are larger than 1000000. Disabled by default'}, output_descriptions={'alignment': 'The aligned sequences.'}, name='De novo multiple sequence alignment with MAFFT', description=("Perform de novo multiple sequence alignment using MAFFT."), citations=[citations['katoh2013mafft']] ) plugin.methods.register_function( function=q2_alignment.mafft_add, inputs={'alignment': FeatureData[AlignedSequence], 'sequences': FeatureData[Sequence]}, parameters={'n_threads': Int % Range(1, None) | Str % Choices(['auto']), 'parttree': Bool, 'addfragments': Bool}, outputs=[('expanded_alignment', FeatureData[AlignedSequence])], input_descriptions={'alignment': 'The alignment to which ' 'sequences should be added.', 'sequences': 'The sequences to be added.'}, parameter_descriptions={ 'n_threads': 'The number of threads. (Use `auto` to automatically use ' 'all available cores)', 'parttree': 'This flag is required if the number of sequences being ' 'aligned are larger than 1000000. Disabled by default', 'addfragments': 'Optimize for the addition of short sequence ' 'fragments (for example, primer or amplicon ' 'sequences). If not set, default sequence addition ' 'is used.'}, output_descriptions={ 'expanded_alignment': 'Alignment containing the provided aligned and ' 'unaligned sequences.'}, name='Add sequences to multiple sequence alignment with MAFFT.', description='Add new sequences to an existing alignment with MAFFT.', citations=[citations['katoh2013mafft']] ) plugin.methods.register_function( function=q2_alignment.mask, inputs={'alignment': FeatureData[AlignedSequence]}, parameters={'max_gap_frequency': Float % Range(0, 1, inclusive_end=True), 'min_conservation': Float % Range(0, 1, inclusive_end=True)}, outputs=[('masked_alignment', FeatureData[AlignedSequence])], input_descriptions={'alignment': 'The alignment to be masked.'}, parameter_descriptions={ 'max_gap_frequency': ('The maximum relative frequency of gap ' 'characters in a column for the column to be ' 'retained. This relative frequency must be a ' 'number between 0.0 and 1.0 (inclusive), where ' '0.0 retains only those columns without gap ' 'characters, and 1.0 retains all columns ' 'regardless of gap character frequency.'), 'min_conservation': ('The minimum relative frequency ' 'of at least one non-gap character in a ' 'column for that column to be retained. This ' 'relative frequency must be a number between 0.0 ' 'and 1.0 (inclusive). For example, if a value of ' '0.4 is provided, a column will only be retained ' 'if it contains at least one character that is ' 'present in at least 40% of the sequences.') }, output_descriptions={'masked_alignment': 'The masked alignment.'}, name='Positional conservation and gap filtering.', description=("Mask (i.e., filter) unconserved and highly gapped " "columns from an alignment. Default min_conservation was " "chosen to reproduce the mask presented in Lane (1991)."), citations=[citations['lane1991']] ) q2-alignment-2021.8.0/q2_alignment/tests/000077500000000000000000000000001411645176200177735ustar00rootroot00000000000000q2-alignment-2021.8.0/q2_alignment/tests/__init__.py000066400000000000000000000005351411645176200221070ustar00rootroot00000000000000# ---------------------------------------------------------------------------- # Copyright (c) 2016-2021, QIIME 2 development team. # # Distributed under the terms of the Modified BSD License. # # The full license is in the file LICENSE, distributed with this software. # ---------------------------------------------------------------------------- q2-alignment-2021.8.0/q2_alignment/tests/data/000077500000000000000000000000001411645176200207045ustar00rootroot00000000000000q2-alignment-2021.8.0/q2_alignment/tests/data/aligned-dna-sequences-1.fasta000066400000000000000000000000461411645176200262160ustar00rootroot00000000000000>aln-seq-1 AGGGGG- >aln-seq-2 AGGGGGG q2-alignment-2021.8.0/q2_alignment/tests/data/aligned-duplicate-ids-1.fasta000066400000000000000000000000321411645176200262050ustar00rootroot00000000000000>id1 AGGGGG- >id1 AGGGGGG q2-alignment-2021.8.0/q2_alignment/tests/data/aligned-duplicate-ids-2.fasta000066400000000000000000000000411411645176200262060ustar00rootroot00000000000000>aln-seq-1 AGGGGG- >seq1 AGGGGGG q2-alignment-2021.8.0/q2_alignment/tests/data/aligned-long-ids.fasta000066400000000000000000000010101411645176200250310ustar00rootroot00000000000000>aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa AGGGGG- >bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb AGGGGGG q2-alignment-2021.8.0/q2_alignment/tests/data/unaligned-dna-sequences-1.fasta000066400000000000000000000000331411645176200265550ustar00rootroot00000000000000>seq1 AGGGGGG >seq2 GGGGGG q2-alignment-2021.8.0/q2_alignment/tests/data/unaligned-duplicate-ids.fasta000066400000000000000000000000331411645176200264130ustar00rootroot00000000000000>id1 AAAA >id2 AAA >id1 AA q2-alignment-2021.8.0/q2_alignment/tests/data/unaligned-long-ids.fasta000066400000000000000000000014111411645176200254010ustar00rootroot00000000000000>aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa AGGGGGG >bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb GGGGGG >cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc GGGGG q2-alignment-2021.8.0/q2_alignment/tests/test_filter.py000066400000000000000000000155221411645176200226760ustar00rootroot00000000000000# ---------------------------------------------------------------------------- # Copyright (c) 2016-2021, QIIME 2 development team. # # Distributed under the terms of the Modified BSD License. # # The full license is in the file LICENSE, distributed with this software. # ---------------------------------------------------------------------------- import skbio import numpy as np import unittest from q2_alignment._filter import _most_conserved from q2_alignment import mask class MostConservedTests(unittest.TestCase): def test_basic(self): frequencies = [{'A': 1/3, '-': 2/3}, {'G': 1.0}, {'A': 2/3, 'C': 1/3}] actual = _most_conserved(frequencies, skbio.DNA) expected = [1.0, 1.0, 2./3.] self.assertEqual(actual, expected) frequencies = [{'A': 1/4, '-': 3/4}, {'G': 1.0}, {'A': 1/2, 'C': 1/2}, {'A': 1/4, 'C': 1/4, 'G': 1/4, 'T': 1/4}] actual = _most_conserved(frequencies, skbio.DNA) expected = [1.0, 1.0, 0.5, 0.25] self.assertEqual(actual, expected) def test_N(self): frequencies = [{'A': 1/3, '-': 2/3}, {'G': 1.0}, {'A': 2/3, 'N': 1/3}] actual = _most_conserved(frequencies, skbio.DNA) expected = [1.0, 1.0, 2./3.] self.assertEqual(actual, expected) def test_unknown_gap_mode(self): frequencies = [{'A': 1/3, '-': 2/3}, {'G': 1.0}, {'A': 2/3, 'C': 1/3}] with self.assertRaises(ValueError): _most_conserved(frequencies, skbio.DNA, gap_mode='not-real') def test_all_gap(self): frequencies = [{'-': 1.0}] actual = _most_conserved(frequencies, skbio.DNA) expected = [0.0] self.assertEqual(actual, expected) def test_empty(self): frequencies = [] actual = _most_conserved(frequencies, skbio.DNA) expected = [] self.assertEqual(actual, expected) class MaskTests(unittest.TestCase): def test_basic(self): alignment = skbio.TabularMSA( [skbio.DNA('AGA', metadata={'id': 'seq1', 'description': ''}), skbio.DNA('-GA', metadata={'id': 'seq2', 'description': ''}), skbio.DNA('-GC', metadata={'id': 'seq3', 'description': ''})] ) actual = mask(alignment, max_gap_frequency=0.05, min_conservation=0.30) expected = skbio.TabularMSA( [skbio.DNA('GA', metadata={'id': 'seq1', 'description': ''}), skbio.DNA('GA', metadata={'id': 'seq2', 'description': ''}), skbio.DNA('GC', metadata={'id': 'seq3', 'description': ''})] ) self.assertEqual(actual, expected) def test_gap_boundaries(self): alignment1 = skbio.TabularMSA( [skbio.DNA('-', metadata={'id': 'seq1', 'description': ''}), skbio.DNA('-', metadata={'id': 'seq2', 'description': ''}), skbio.DNA('-', metadata={'id': 'seq3', 'description': ''})] ) alignment2 = skbio.TabularMSA( [skbio.DNA('A', metadata={'id': 'seq1', 'description': ''}), skbio.DNA('A', metadata={'id': 'seq2', 'description': ''}), skbio.DNA('A', metadata={'id': 'seq3', 'description': ''})] ) actual = mask(alignment1, max_gap_frequency=1.0, min_conservation=0.0) self.assertEqual(actual, alignment1) actual = mask(alignment2, max_gap_frequency=0.0, min_conservation=0.0) self.assertEqual(actual, alignment2) def test_error_on_empty_alignment_gap_boundary(self): alignment1 = skbio.TabularMSA( [skbio.DNA('A', metadata={'id': 'seq1', 'description': ''}), skbio.DNA('-', metadata={'id': 'seq2', 'description': ''}), skbio.DNA('-', metadata={'id': 'seq3', 'description': ''})] ) self.assertRaisesRegex(ValueError, " 0.00% of positions were retained by the gap", mask, alignment1, max_gap_frequency=0.1, min_conservation=0.0) def test_conservation_boundaries(self): alignment1 = skbio.TabularMSA( [skbio.DNA('A', metadata={'id': 'seq1', 'description': ''}), skbio.DNA('A', metadata={'id': 'seq2', 'description': ''}), skbio.DNA('A', metadata={'id': 'seq3', 'description': ''})]) alignment2 = skbio.TabularMSA( [skbio.DNA('-', metadata={'id': 'seq1', 'description': ''}), skbio.DNA('-', metadata={'id': 'seq2', 'description': ''}), skbio.DNA('-', metadata={'id': 'seq3', 'description': ''})]) actual = mask(alignment1, max_gap_frequency=1.0, min_conservation=1.0) self.assertEqual(actual, alignment1) actual = mask(alignment2, max_gap_frequency=1.0, min_conservation=0.0) self.assertEqual(actual, alignment2) def test_error_on_empty_alignment_conservation_boundary(self): alignment1 = skbio.TabularMSA( [skbio.DNA('A', metadata={'id': 'seq1', 'description': ''}), skbio.DNA('C', metadata={'id': 'seq2', 'description': ''}), skbio.DNA('G', metadata={'id': 'seq3', 'description': ''})]) self.assertRaisesRegex(ValueError, " 0.00% of positions were retained by the con", mask, alignment1, max_gap_frequency=1.0, min_conservation=0.5) def test_invalid_gap_threshold(self): alignment = skbio.TabularMSA( [skbio.DNA('-', metadata={'id': 'seq1', 'description': ''}), skbio.DNA('-', metadata={'id': 'seq2', 'description': ''}), skbio.DNA('-', metadata={'id': 'seq3', 'description': ''})] ) eps = np.finfo(float).eps with self.assertRaises(ValueError): mask(alignment, max_gap_frequency=0.0 - eps) with self.assertRaises(ValueError): mask(alignment, max_gap_frequency=1.0 + eps) def test_invalid_conservation_threshold(self): alignment = skbio.TabularMSA( [skbio.DNA('-', metadata={'id': 'seq1', 'description': ''}), skbio.DNA('-', metadata={'id': 'seq2', 'description': ''}), skbio.DNA('-', metadata={'id': 'seq3', 'description': ''})] ) eps = np.finfo(float).eps with self.assertRaises(ValueError): mask(alignment, min_conservation=0.0 - eps) with self.assertRaises(ValueError): mask(alignment, min_conservation=1.0 + eps) def test_empty_input(self): alignment = skbio.TabularMSA( [skbio.DNA('', metadata={'id': 'seq1', 'description': ''}), skbio.DNA('', metadata={'id': 'seq2', 'description': ''}), skbio.DNA('', metadata={'id': 'seq3', 'description': ''})] ) with self.assertRaises(ValueError): mask(alignment) alignment = skbio.TabularMSA([]) with self.assertRaises(ValueError): mask(alignment) q2-alignment-2021.8.0/q2_alignment/tests/test_mafft.py000066400000000000000000000216621411645176200225100ustar00rootroot00000000000000# ---------------------------------------------------------------------------- # Copyright (c) 2016-2021, QIIME 2 development team. # # Distributed under the terms of the Modified BSD License. # # The full license is in the file LICENSE, distributed with this software. # ---------------------------------------------------------------------------- import os import unittest from unittest.mock import patch, ANY import subprocess import skbio from qiime2.plugin.testing import TestPluginBase from q2_types.feature_data import DNAFASTAFormat, AlignedDNAFASTAFormat from qiime2.util import redirected_stdio from q2_alignment import mafft, mafft_add from q2_alignment._mafft import run_command class MafftTests(TestPluginBase): package = 'q2_alignment.tests' def _prepare_sequence_data(self): input_fp = self.get_data_path('unaligned-dna-sequences-1.fasta') input_sequences = DNAFASTAFormat(input_fp, mode='r') exp = skbio.TabularMSA( [skbio.DNA('AGGGGGG', metadata={'id': 'seq1', 'description': ''}), skbio.DNA('-GGGGGG', metadata={'id': 'seq2', 'description': ''})] ) return input_sequences, exp def test_mafft(self): input_sequences, exp = self._prepare_sequence_data() with redirected_stdio(stderr=os.devnull): result = mafft(input_sequences) obs = skbio.io.read(str(result), into=skbio.TabularMSA, constructor=skbio.DNA) self.assertEqual(obs, exp) def test_multithreaded_mafft(self): input_sequences, exp = self._prepare_sequence_data() with redirected_stdio(stderr=os.devnull): result = mafft(input_sequences, n_threads='auto') obs = skbio.io.read(str(result), into=skbio.TabularMSA, constructor=skbio.DNA) self.assertEqual(obs, exp) def test_long_ids_are_not_truncated(self): input_fp = self.get_data_path('unaligned-long-ids.fasta') input_sequences = DNAFASTAFormat(input_fp, mode='r') with redirected_stdio(stderr=os.devnull): result = mafft(input_sequences) with open(str(result), 'r') as fh: obs = fh.read() self.assertIn('a'*250, obs) self.assertIn('b'*250, obs) self.assertIn('c'*250, obs) def test_duplicate_input_ids(self): input_fp = self.get_data_path('unaligned-duplicate-ids.fasta') input_sequences = DNAFASTAFormat(input_fp, mode='r') with self.assertRaisesRegex(ValueError, 'the unaligned.*id1'): with redirected_stdio(stderr=os.devnull): mafft(input_sequences) def test_mafft_parttree_exception(self): input_fp = os.path.join(self.temp_dir.name, 'million.fasta') with open(input_fp, "w") as f: for i in range(0, 1000002): f.write('>%d\nAAGCAAGC\n' % i) input_sequences = DNAFASTAFormat(input_fp, mode='r') with self.assertRaisesRegex(ValueError, '1 million'): with redirected_stdio(stderr=os.devnull): mafft(input_sequences) class MafftAddTests(TestPluginBase): package = 'q2_alignment.tests' def _prepare_sequence_data(self): sequences_fp = self.get_data_path('unaligned-dna-sequences-1.fasta') sequences = DNAFASTAFormat(sequences_fp, mode='r') alignment_fp = self.get_data_path('aligned-dna-sequences-1.fasta') alignment = AlignedDNAFASTAFormat(alignment_fp, mode='r') exp = skbio.TabularMSA( [skbio.DNA('AGGGGG-', metadata={'id': 'aln-seq-1', 'description': ''}), skbio.DNA('AGGGGGG', metadata={'id': 'aln-seq-2', 'description': ''}), skbio.DNA('AGGGGGG', metadata={'id': 'seq1', 'description': ''}), skbio.DNA('-GGGGGG', metadata={'id': 'seq2', 'description': ''})] ) return alignment, sequences, exp def test_mafft_add(self): alignment, sequences, exp = self._prepare_sequence_data() with redirected_stdio(stderr=os.devnull): result = mafft_add(alignment, sequences) obs = skbio.io.read(str(result), into=skbio.TabularMSA, constructor=skbio.DNA) self.assertEqual(obs, exp) def test_mafft_add_fragments(self): alignment, sequences, exp = self._prepare_sequence_data() with redirected_stdio(stderr=os.devnull): result = mafft_add(alignment, sequences, addfragments=True) obs = skbio.io.read(str(result), into=skbio.TabularMSA, constructor=skbio.DNA) self.assertEqual(obs, exp) def test_mafft_add_flags(self): alignment, sequences, exp = self._prepare_sequence_data() with patch('q2_alignment._mafft.run_command') as patched_run_cmd: with patch('q2_alignment._mafft.skbio.TabularMSA.read', return_value=exp): _ = mafft_add(alignment, sequences) patched_run_cmd.assert_called_with( ["mafft", "--preservecase", "--inputorder", "--thread", "1", "--add", ANY, ANY], ANY) _ = mafft_add(alignment, sequences, addfragments=True) patched_run_cmd.assert_called_with( ["mafft", "--preservecase", "--inputorder", "--thread", "1", "--addfragments", ANY, ANY], ANY) def test_duplicate_input_ids_in_unaligned(self): input_fp = self.get_data_path('unaligned-duplicate-ids.fasta') sequences = DNAFASTAFormat(input_fp, mode='r') alignment, _, _ = self._prepare_sequence_data() with self.assertRaisesRegex(ValueError, 'the unaligned.*id1'): with redirected_stdio(stderr=os.devnull): mafft_add(alignment, sequences) def test_duplicate_input_ids_in_aligned(self): input_fp = self.get_data_path('aligned-duplicate-ids-1.fasta') alignment = DNAFASTAFormat(input_fp, mode='r') _, sequences, _ = self._prepare_sequence_data() with self.assertRaisesRegex(ValueError, 'the aligned.*id1'): with redirected_stdio(stderr=os.devnull): mafft_add(alignment, sequences) def test_duplicate_input_ids_across_aligned_and_unaligned(self): input_fp = self.get_data_path('aligned-duplicate-ids-2.fasta') alignment = DNAFASTAFormat(input_fp, mode='r') _, sequences, _ = self._prepare_sequence_data() with self.assertRaisesRegex(ValueError, 'aligned and unaligned.*seq1'): with redirected_stdio(stderr=os.devnull): mafft_add(alignment, sequences) def test_long_ids_are_not_truncated_unaligned(self): input_fp = self.get_data_path('unaligned-long-ids.fasta') sequences = DNAFASTAFormat(input_fp, mode='r') alignment, _, _ = self._prepare_sequence_data() with redirected_stdio(stderr=os.devnull): result = mafft_add(alignment, sequences) with open(str(result), 'r') as fh: obs = fh.read() self.assertIn('a'*250, obs) self.assertIn('b'*250, obs) self.assertIn('c'*250, obs) self.assertIn('aln-seq-1', obs) self.assertIn('aln-seq-2', obs) def test_long_ids_are_not_truncated_aligned(self): input_fp = self.get_data_path('aligned-long-ids.fasta') alignment = DNAFASTAFormat(input_fp, mode='r') _, sequences, _ = self._prepare_sequence_data() with redirected_stdio(stderr=os.devnull): result = mafft_add(alignment, sequences) with open(str(result), 'r') as fh: obs = fh.read() self.assertIn('a'*250, obs) self.assertIn('b'*250, obs) self.assertIn('seq1', obs) self.assertIn('seq2', obs) class RunCommandTests(TestPluginBase): package = 'q2_alignment.tests' def test_failed_run(self): input_fp = self.get_data_path('unaligned-dna-sequences-1.fasta') input_sequences = DNAFASTAFormat(input_fp, mode='r') output_alignment = AlignedDNAFASTAFormat() unaligned_fp = str(input_sequences) aligned_fp = str(output_alignment) cmd = ["mafft", "--not-a-real-parameter", unaligned_fp] with self.assertRaises(subprocess.CalledProcessError): with redirected_stdio(stderr=os.devnull): run_command(cmd, aligned_fp) def test_failed_run_not_verbose(self): input_fp = self.get_data_path('unaligned-dna-sequences-1.fasta') input_sequences = DNAFASTAFormat(input_fp, mode='r') output_alignment = AlignedDNAFASTAFormat() unaligned_fp = str(input_sequences) aligned_fp = str(output_alignment) cmd = ["mafft", "--not-a-real-parameter", unaligned_fp] with self.assertRaises(subprocess.CalledProcessError): with redirected_stdio(stderr=os.devnull): run_command(cmd, aligned_fp, verbose=False) if __name__ == "__main__": unittest.main() q2-alignment-2021.8.0/setup.cfg000066400000000000000000000002531411645176200160720ustar00rootroot00000000000000[versioneer] VCS=git style=pep440 versionfile_source = q2_alignment/_version.py versionfile_build = q2_alignment/_version.py tag_prefix = parentdir_prefix = q2-alignment- q2-alignment-2021.8.0/setup.py000066400000000000000000000017251411645176200157700ustar00rootroot00000000000000# ---------------------------------------------------------------------------- # Copyright (c) 2016-2021, QIIME 2 development team. # # Distributed under the terms of the Modified BSD License. # # The full license is in the file LICENSE, distributed with this software. # ---------------------------------------------------------------------------- from setuptools import setup, find_packages import versioneer setup( name="q2-alignment", version=versioneer.get_version(), cmdclass=versioneer.get_cmdclass(), packages=find_packages(), author="Greg Caporaso", author_email="gregcaporaso@gmail.com", description="Create and work with alignments in QIIME 2.", license="BSD-3-Clause", url="https://qiime2.org", entry_points={ 'qiime2.plugins': ['q2-alignment=q2_alignment.plugin_setup:plugin'] }, package_data={ 'q2_alignment': ['citations.bib'], 'q2_alignment.tests': ['data/*'] }, zip_safe=False, ) q2-alignment-2021.8.0/versioneer.py000066400000000000000000002060221411645176200170060ustar00rootroot00000000000000 # Version: 0.18 # flake8: noqa """The Versioneer - like a rocketeer, but for versions. The Versioneer ============== * like a rocketeer, but for versions! * https://github.com/warner/python-versioneer * Brian Warner * License: Public Domain * Compatible With: python2.6, 2.7, 3.2, 3.3, 3.4, 3.5, 3.6, and pypy * [![Latest Version] (https://pypip.in/version/versioneer/badge.svg?style=flat) ](https://pypi.python.org/pypi/versioneer/) * [![Build Status] (https://travis-ci.org/warner/python-versioneer.png?branch=master) ](https://travis-ci.org/warner/python-versioneer) This is a tool for managing a recorded version number in distutils-based python projects. The goal is to remove the tedious and error-prone "update the embedded version string" step from your release process. Making a new release should be as easy as recording a new tag in your version-control system, and maybe making new tarballs. ## Quick Install * `pip install versioneer` to somewhere to your $PATH * add a `[versioneer]` section to your setup.cfg (see below) * run `versioneer install` in your source tree, commit the results ## Version Identifiers Source trees come from a variety of places: * a version-control system checkout (mostly used by developers) * a nightly tarball, produced by build automation * a snapshot tarball, produced by a web-based VCS browser, like github's "tarball from tag" feature * a release tarball, produced by "setup.py sdist", distributed through PyPI Within each source tree, the version identifier (either a string or a number, this tool is format-agnostic) can come from a variety of places: * ask the VCS tool itself, e.g. "git describe" (for checkouts), which knows about recent "tags" and an absolute revision-id * the name of the directory into which the tarball was unpacked * an expanded VCS keyword ($Id$, etc) * a `_version.py` created by some earlier build step For released software, the version identifier is closely related to a VCS tag. Some projects use tag names that include more than just the version string (e.g. "myproject-1.2" instead of just "1.2"), in which case the tool needs to strip the tag prefix to extract the version identifier. For unreleased software (between tags), the version identifier should provide enough information to help developers recreate the same tree, while also giving them an idea of roughly how old the tree is (after version 1.2, before version 1.3). Many VCS systems can report a description that captures this, for example `git describe --tags --dirty --always` reports things like "0.7-1-g574ab98-dirty" to indicate that the checkout is one revision past the 0.7 tag, has a unique revision id of "574ab98", and is "dirty" (it has uncommitted changes. The version identifier is used for multiple purposes: * to allow the module to self-identify its version: `myproject.__version__` * to choose a name and prefix for a 'setup.py sdist' tarball ## Theory of Operation Versioneer works by adding a special `_version.py` file into your source tree, where your `__init__.py` can import it. This `_version.py` knows how to dynamically ask the VCS tool for version information at import time. `_version.py` also contains `$Revision$` markers, and the installation process marks `_version.py` to have this marker rewritten with a tag name during the `git archive` command. As a result, generated tarballs will contain enough information to get the proper version. To allow `setup.py` to compute a version too, a `versioneer.py` is added to the top level of your source tree, next to `setup.py` and the `setup.cfg` that configures it. This overrides several distutils/setuptools commands to compute the version when invoked, and changes `setup.py build` and `setup.py sdist` to replace `_version.py` with a small static file that contains just the generated version data. ## Installation See [INSTALL.md](./INSTALL.md) for detailed installation instructions. ## Version-String Flavors Code which uses Versioneer can learn about its version string at runtime by importing `_version` from your main `__init__.py` file and running the `get_versions()` function. From the "outside" (e.g. in `setup.py`), you can import the top-level `versioneer.py` and run `get_versions()`. Both functions return a dictionary with different flavors of version information: * `['version']`: A condensed version string, rendered using the selected style. This is the most commonly used value for the project's version string. The default "pep440" style yields strings like `0.11`, `0.11+2.g1076c97`, or `0.11+2.g1076c97.dirty`. See the "Styles" section below for alternative styles. * `['full-revisionid']`: detailed revision identifier. For Git, this is the full SHA1 commit id, e.g. "1076c978a8d3cfc70f408fe5974aa6c092c949ac". * `['date']`: Date and time of the latest `HEAD` commit. For Git, it is the commit date in ISO 8601 format. This will be None if the date is not available. * `['dirty']`: a boolean, True if the tree has uncommitted changes. Note that this is only accurate if run in a VCS checkout, otherwise it is likely to be False or None * `['error']`: if the version string could not be computed, this will be set to a string describing the problem, otherwise it will be None. It may be useful to throw an exception in setup.py if this is set, to avoid e.g. creating tarballs with a version string of "unknown". Some variants are more useful than others. Including `full-revisionid` in a bug report should allow developers to reconstruct the exact code being tested (or indicate the presence of local changes that should be shared with the developers). `version` is suitable for display in an "about" box or a CLI `--version` output: it can be easily compared against release notes and lists of bugs fixed in various releases. The installer adds the following text to your `__init__.py` to place a basic version in `YOURPROJECT.__version__`: from ._version import get_versions __version__ = get_versions()['version'] del get_versions ## Styles The setup.cfg `style=` configuration controls how the VCS information is rendered into a version string. The default style, "pep440", produces a PEP440-compliant string, equal to the un-prefixed tag name for actual releases, and containing an additional "local version" section with more detail for in-between builds. For Git, this is TAG[+DISTANCE.gHEX[.dirty]] , using information from `git describe --tags --dirty --always`. For example "0.11+2.g1076c97.dirty" indicates that the tree is like the "1076c97" commit but has uncommitted changes (".dirty"), and that this commit is two revisions ("+2") beyond the "0.11" tag. For released software (exactly equal to a known tag), the identifier will only contain the stripped tag, e.g. "0.11". Other styles are available. See [details.md](details.md) in the Versioneer source tree for descriptions. ## Debugging Versioneer tries to avoid fatal errors: if something goes wrong, it will tend to return a version of "0+unknown". To investigate the problem, run `setup.py version`, which will run the version-lookup code in a verbose mode, and will display the full contents of `get_versions()` (including the `error` string, which may help identify what went wrong). ## Known Limitations Some situations are known to cause problems for Versioneer. This details the most significant ones. More can be found on Github [issues page](https://github.com/warner/python-versioneer/issues). ### Subprojects Versioneer has limited support for source trees in which `setup.py` is not in the root directory (e.g. `setup.py` and `.git/` are *not* siblings). The are two common reasons why `setup.py` might not be in the root: * Source trees which contain multiple subprojects, such as [Buildbot](https://github.com/buildbot/buildbot), which contains both "master" and "slave" subprojects, each with their own `setup.py`, `setup.cfg`, and `tox.ini`. Projects like these produce multiple PyPI distributions (and upload multiple independently-installable tarballs). * Source trees whose main purpose is to contain a C library, but which also provide bindings to Python (and perhaps other langauges) in subdirectories. Versioneer will look for `.git` in parent directories, and most operations should get the right version string. However `pip` and `setuptools` have bugs and implementation details which frequently cause `pip install .` from a subproject directory to fail to find a correct version string (so it usually defaults to `0+unknown`). `pip install --editable .` should work correctly. `setup.py install` might work too. Pip-8.1.1 is known to have this problem, but hopefully it will get fixed in some later version. [Bug #38](https://github.com/warner/python-versioneer/issues/38) is tracking this issue. The discussion in [PR #61](https://github.com/warner/python-versioneer/pull/61) describes the issue from the Versioneer side in more detail. [pip PR#3176](https://github.com/pypa/pip/pull/3176) and [pip PR#3615](https://github.com/pypa/pip/pull/3615) contain work to improve pip to let Versioneer work correctly. Versioneer-0.16 and earlier only looked for a `.git` directory next to the `setup.cfg`, so subprojects were completely unsupported with those releases. ### Editable installs with setuptools <= 18.5 `setup.py develop` and `pip install --editable .` allow you to install a project into a virtualenv once, then continue editing the source code (and test) without re-installing after every change. "Entry-point scripts" (`setup(entry_points={"console_scripts": ..})`) are a convenient way to specify executable scripts that should be installed along with the python package. These both work as expected when using modern setuptools. When using setuptools-18.5 or earlier, however, certain operations will cause `pkg_resources.DistributionNotFound` errors when running the entrypoint script, which must be resolved by re-installing the package. This happens when the install happens with one version, then the egg_info data is regenerated while a different version is checked out. Many setup.py commands cause egg_info to be rebuilt (including `sdist`, `wheel`, and installing into a different virtualenv), so this can be surprising. [Bug #83](https://github.com/warner/python-versioneer/issues/83) describes this one, but upgrading to a newer version of setuptools should probably resolve it. ### Unicode version strings While Versioneer works (and is continually tested) with both Python 2 and Python 3, it is not entirely consistent with bytes-vs-unicode distinctions. Newer releases probably generate unicode version strings on py2. It's not clear that this is wrong, but it may be surprising for applications when then write these strings to a network connection or include them in bytes-oriented APIs like cryptographic checksums. [Bug #71](https://github.com/warner/python-versioneer/issues/71) investigates this question. ## Updating Versioneer To upgrade your project to a new release of Versioneer, do the following: * install the new Versioneer (`pip install -U versioneer` or equivalent) * edit `setup.cfg`, if necessary, to include any new configuration settings indicated by the release notes. See [UPGRADING](./UPGRADING.md) for details. * re-run `versioneer install` in your source tree, to replace `SRC/_version.py` * commit any changed files ## Future Directions This tool is designed to make it easily extended to other version-control systems: all VCS-specific components are in separate directories like src/git/ . The top-level `versioneer.py` script is assembled from these components by running make-versioneer.py . In the future, make-versioneer.py will take a VCS name as an argument, and will construct a version of `versioneer.py` that is specific to the given VCS. It might also take the configuration arguments that are currently provided manually during installation by editing setup.py . Alternatively, it might go the other direction and include code from all supported VCS systems, reducing the number of intermediate scripts. ## License To make Versioneer easier to embed, all its code is dedicated to the public domain. The `_version.py` that it creates is also in the public domain. Specifically, both are released under the Creative Commons "Public Domain Dedication" license (CC0-1.0), as described in https://creativecommons.org/publicdomain/zero/1.0/ . """ from __future__ import print_function try: import configparser except ImportError: import ConfigParser as configparser import errno import json import os import re import subprocess import sys class VersioneerConfig: """Container for Versioneer configuration parameters.""" def get_root(): """Get the project root directory. We require that all commands are run from the project root, i.e. the directory that contains setup.py, setup.cfg, and versioneer.py . """ root = os.path.realpath(os.path.abspath(os.getcwd())) setup_py = os.path.join(root, "setup.py") versioneer_py = os.path.join(root, "versioneer.py") if not (os.path.exists(setup_py) or os.path.exists(versioneer_py)): # allow 'python path/to/setup.py COMMAND' root = os.path.dirname(os.path.realpath(os.path.abspath(sys.argv[0]))) setup_py = os.path.join(root, "setup.py") versioneer_py = os.path.join(root, "versioneer.py") if not (os.path.exists(setup_py) or os.path.exists(versioneer_py)): err = ("Versioneer was unable to run the project root directory. " "Versioneer requires setup.py to be executed from " "its immediate directory (like 'python setup.py COMMAND'), " "or in a way that lets it use sys.argv[0] to find the root " "(like 'python path/to/setup.py COMMAND').") raise VersioneerBadRootError(err) try: # Certain runtime workflows (setup.py install/develop in a setuptools # tree) execute all dependencies in a single python process, so # "versioneer" may be imported multiple times, and python's shared # module-import table will cache the first one. So we can't use # os.path.dirname(__file__), as that will find whichever # versioneer.py was first imported, even in later projects. me = os.path.realpath(os.path.abspath(__file__)) me_dir = os.path.normcase(os.path.splitext(me)[0]) vsr_dir = os.path.normcase(os.path.splitext(versioneer_py)[0]) if me_dir != vsr_dir: print("Warning: build in %s is using versioneer.py from %s" % (os.path.dirname(me), versioneer_py)) except NameError: pass return root def get_config_from_root(root): """Read the project setup.cfg file to determine Versioneer config.""" # This might raise EnvironmentError (if setup.cfg is missing), or # configparser.NoSectionError (if it lacks a [versioneer] section), or # configparser.NoOptionError (if it lacks "VCS="). See the docstring at # the top of versioneer.py for instructions on writing your setup.cfg . setup_cfg = os.path.join(root, "setup.cfg") parser = configparser.SafeConfigParser() with open(setup_cfg, "r") as f: parser.readfp(f) VCS = parser.get("versioneer", "VCS") # mandatory def get(parser, name): if parser.has_option("versioneer", name): return parser.get("versioneer", name) return None cfg = VersioneerConfig() cfg.VCS = VCS cfg.style = get(parser, "style") or "" cfg.versionfile_source = get(parser, "versionfile_source") cfg.versionfile_build = get(parser, "versionfile_build") cfg.tag_prefix = get(parser, "tag_prefix") if cfg.tag_prefix in ("''", '""'): cfg.tag_prefix = "" cfg.parentdir_prefix = get(parser, "parentdir_prefix") cfg.verbose = get(parser, "verbose") return cfg class NotThisMethod(Exception): """Exception raised if a method is not valid for the current scenario.""" # these dictionaries contain VCS-specific tools LONG_VERSION_PY = {} HANDLERS = {} def register_vcs_handler(vcs, method): # decorator """Decorator to mark a method as the handler for a particular VCS.""" def decorate(f): """Store f in HANDLERS[vcs][method].""" if vcs not in HANDLERS: HANDLERS[vcs] = {} HANDLERS[vcs][method] = f return f return decorate def run_command(commands, args, cwd=None, verbose=False, hide_stderr=False, env=None): """Call the given command(s).""" assert isinstance(commands, list) p = None for c in commands: try: dispcmd = str([c] + args) # remember shell=False, so use git.cmd on windows, not just git p = subprocess.Popen([c] + args, cwd=cwd, env=env, stdout=subprocess.PIPE, stderr=(subprocess.PIPE if hide_stderr else None)) break except EnvironmentError: e = sys.exc_info()[1] if e.errno == errno.ENOENT: continue if verbose: print("unable to run %s" % dispcmd) print(e) return None, None else: if verbose: print("unable to find command, tried %s" % (commands,)) return None, None stdout = p.communicate()[0].strip() if sys.version_info[0] >= 3: stdout = stdout.decode() if p.returncode != 0: if verbose: print("unable to run %s (error)" % dispcmd) print("stdout was %s" % stdout) return None, p.returncode return stdout, p.returncode LONG_VERSION_PY['git'] = ''' # This file helps to compute a version number in source trees obtained from # git-archive tarball (such as those provided by githubs download-from-tag # feature). Distribution tarballs (built by setup.py sdist) and build # directories (produced by setup.py build) will contain a much shorter file # that just contains the computed version number. # This file is released into the public domain. Generated by # versioneer-0.18 (https://github.com/warner/python-versioneer) """Git implementation of _version.py.""" import errno import os import re import subprocess import sys def get_keywords(): """Get the keywords needed to look up the version information.""" # these strings will be replaced by git during git-archive. # setup.py/versioneer.py will grep for the variable names, so they must # each be defined on a line of their own. _version.py will just call # get_keywords(). git_refnames = "%(DOLLAR)sFormat:%%d%(DOLLAR)s" git_full = "%(DOLLAR)sFormat:%%H%(DOLLAR)s" git_date = "%(DOLLAR)sFormat:%%ci%(DOLLAR)s" keywords = {"refnames": git_refnames, "full": git_full, "date": git_date} return keywords class VersioneerConfig: """Container for Versioneer configuration parameters.""" def get_config(): """Create, populate and return the VersioneerConfig() object.""" # these strings are filled in when 'setup.py versioneer' creates # _version.py cfg = VersioneerConfig() cfg.VCS = "git" cfg.style = "%(STYLE)s" cfg.tag_prefix = "%(TAG_PREFIX)s" cfg.parentdir_prefix = "%(PARENTDIR_PREFIX)s" cfg.versionfile_source = "%(VERSIONFILE_SOURCE)s" cfg.verbose = False return cfg class NotThisMethod(Exception): """Exception raised if a method is not valid for the current scenario.""" LONG_VERSION_PY = {} HANDLERS = {} def register_vcs_handler(vcs, method): # decorator """Decorator to mark a method as the handler for a particular VCS.""" def decorate(f): """Store f in HANDLERS[vcs][method].""" if vcs not in HANDLERS: HANDLERS[vcs] = {} HANDLERS[vcs][method] = f return f return decorate def run_command(commands, args, cwd=None, verbose=False, hide_stderr=False, env=None): """Call the given command(s).""" assert isinstance(commands, list) p = None for c in commands: try: dispcmd = str([c] + args) # remember shell=False, so use git.cmd on windows, not just git p = subprocess.Popen([c] + args, cwd=cwd, env=env, stdout=subprocess.PIPE, stderr=(subprocess.PIPE if hide_stderr else None)) break except EnvironmentError: e = sys.exc_info()[1] if e.errno == errno.ENOENT: continue if verbose: print("unable to run %%s" %% dispcmd) print(e) return None, None else: if verbose: print("unable to find command, tried %%s" %% (commands,)) return None, None stdout = p.communicate()[0].strip() if sys.version_info[0] >= 3: stdout = stdout.decode() if p.returncode != 0: if verbose: print("unable to run %%s (error)" %% dispcmd) print("stdout was %%s" %% stdout) return None, p.returncode return stdout, p.returncode def versions_from_parentdir(parentdir_prefix, root, verbose): """Try to determine the version from the parent directory name. Source tarballs conventionally unpack into a directory that includes both the project name and a version string. We will also support searching up two directory levels for an appropriately named parent directory """ rootdirs = [] for i in range(3): dirname = os.path.basename(root) if dirname.startswith(parentdir_prefix): return {"version": dirname[len(parentdir_prefix):], "full-revisionid": None, "dirty": False, "error": None, "date": None} else: rootdirs.append(root) root = os.path.dirname(root) # up a level if verbose: print("Tried directories %%s but none started with prefix %%s" %% (str(rootdirs), parentdir_prefix)) raise NotThisMethod("rootdir doesn't start with parentdir_prefix") @register_vcs_handler("git", "get_keywords") def git_get_keywords(versionfile_abs): """Extract version information from the given file.""" # the code embedded in _version.py can just fetch the value of these # keywords. When used from setup.py, we don't want to import _version.py, # so we do it with a regexp instead. This function is not used from # _version.py. keywords = {} try: f = open(versionfile_abs, "r") for line in f.readlines(): if line.strip().startswith("git_refnames ="): mo = re.search(r'=\s*"(.*)"', line) if mo: keywords["refnames"] = mo.group(1) if line.strip().startswith("git_full ="): mo = re.search(r'=\s*"(.*)"', line) if mo: keywords["full"] = mo.group(1) if line.strip().startswith("git_date ="): mo = re.search(r'=\s*"(.*)"', line) if mo: keywords["date"] = mo.group(1) f.close() except EnvironmentError: pass return keywords @register_vcs_handler("git", "keywords") def git_versions_from_keywords(keywords, tag_prefix, verbose): """Get version information from git keywords.""" if not keywords: raise NotThisMethod("no keywords at all, weird") date = keywords.get("date") if date is not None: # git-2.2.0 added "%%cI", which expands to an ISO-8601 -compliant # datestamp. However we prefer "%%ci" (which expands to an "ISO-8601 # -like" string, which we must then edit to make compliant), because # it's been around since git-1.5.3, and it's too difficult to # discover which version we're using, or to work around using an # older one. date = date.strip().replace(" ", "T", 1).replace(" ", "", 1) refnames = keywords["refnames"].strip() if refnames.startswith("$Format"): if verbose: print("keywords are unexpanded, not using") raise NotThisMethod("unexpanded keywords, not a git-archive tarball") refs = set([r.strip() for r in refnames.strip("()").split(",")]) # starting in git-1.8.3, tags are listed as "tag: foo-1.0" instead of # just "foo-1.0". If we see a "tag: " prefix, prefer those. TAG = "tag: " tags = set([r[len(TAG):] for r in refs if r.startswith(TAG)]) if not tags: # Either we're using git < 1.8.3, or there really are no tags. We use # a heuristic: assume all version tags have a digit. The old git %%d # expansion behaves like git log --decorate=short and strips out the # refs/heads/ and refs/tags/ prefixes that would let us distinguish # between branches and tags. By ignoring refnames without digits, we # filter out many common branch names like "release" and # "stabilization", as well as "HEAD" and "master". tags = set([r for r in refs if re.search(r'\d', r)]) if verbose: print("discarding '%%s', no digits" %% ",".join(refs - tags)) if verbose: print("likely tags: %%s" %% ",".join(sorted(tags))) for ref in sorted(tags): # sorting will prefer e.g. "2.0" over "2.0rc1" if ref.startswith(tag_prefix): r = ref[len(tag_prefix):] if verbose: print("picking %%s" %% r) return {"version": r, "full-revisionid": keywords["full"].strip(), "dirty": False, "error": None, "date": date} # no suitable tags, so version is "0+unknown", but full hex is still there if verbose: print("no suitable tags, using unknown + full revision id") return {"version": "0+unknown", "full-revisionid": keywords["full"].strip(), "dirty": False, "error": "no suitable tags", "date": None} @register_vcs_handler("git", "pieces_from_vcs") def git_pieces_from_vcs(tag_prefix, root, verbose, run_command=run_command): """Get version from 'git describe' in the root of the source tree. This only gets called if the git-archive 'subst' keywords were *not* expanded, and _version.py hasn't already been rewritten with a short version string, meaning we're inside a checked out source tree. """ GITS = ["git"] if sys.platform == "win32": GITS = ["git.cmd", "git.exe"] out, rc = run_command(GITS, ["rev-parse", "--git-dir"], cwd=root, hide_stderr=True) if rc != 0: if verbose: print("Directory %%s not under git control" %% root) raise NotThisMethod("'git rev-parse --git-dir' returned error") # if there is a tag matching tag_prefix, this yields TAG-NUM-gHEX[-dirty] # if there isn't one, this yields HEX[-dirty] (no NUM) describe_out, rc = run_command(GITS, ["describe", "--tags", "--dirty", "--always", "--long", "--match", "%%s*" %% tag_prefix], cwd=root) # --long was added in git-1.5.5 if describe_out is None: raise NotThisMethod("'git describe' failed") describe_out = describe_out.strip() full_out, rc = run_command(GITS, ["rev-parse", "HEAD"], cwd=root) if full_out is None: raise NotThisMethod("'git rev-parse' failed") full_out = full_out.strip() pieces = {} pieces["long"] = full_out pieces["short"] = full_out[:7] # maybe improved later pieces["error"] = None # parse describe_out. It will be like TAG-NUM-gHEX[-dirty] or HEX[-dirty] # TAG might have hyphens. git_describe = describe_out # look for -dirty suffix dirty = git_describe.endswith("-dirty") pieces["dirty"] = dirty if dirty: git_describe = git_describe[:git_describe.rindex("-dirty")] # now we have TAG-NUM-gHEX or HEX if "-" in git_describe: # TAG-NUM-gHEX mo = re.search(r'^(.+)-(\d+)-g([0-9a-f]+)$', git_describe) if not mo: # unparseable. Maybe git-describe is misbehaving? pieces["error"] = ("unable to parse git-describe output: '%%s'" %% describe_out) return pieces # tag full_tag = mo.group(1) if not full_tag.startswith(tag_prefix): if verbose: fmt = "tag '%%s' doesn't start with prefix '%%s'" print(fmt %% (full_tag, tag_prefix)) pieces["error"] = ("tag '%%s' doesn't start with prefix '%%s'" %% (full_tag, tag_prefix)) return pieces pieces["closest-tag"] = full_tag[len(tag_prefix):] # distance: number of commits since tag pieces["distance"] = int(mo.group(2)) # commit: short hex revision ID pieces["short"] = mo.group(3) else: # HEX: no tags pieces["closest-tag"] = None count_out, rc = run_command(GITS, ["rev-list", "HEAD", "--count"], cwd=root) pieces["distance"] = int(count_out) # total number of commits # commit date: see ISO-8601 comment in git_versions_from_keywords() date = run_command(GITS, ["show", "-s", "--format=%%ci", "HEAD"], cwd=root)[0].strip() pieces["date"] = date.strip().replace(" ", "T", 1).replace(" ", "", 1) return pieces def plus_or_dot(pieces): """Return a + if we don't already have one, else return a .""" if "+" in pieces.get("closest-tag", ""): return "." return "+" def render_pep440(pieces): """Build up version string, with post-release "local version identifier". Our goal: TAG[+DISTANCE.gHEX[.dirty]] . Note that if you get a tagged build and then dirty it, you'll get TAG+0.gHEX.dirty Exceptions: 1: no tags. git_describe was just HEX. 0+untagged.DISTANCE.gHEX[.dirty] """ if pieces["closest-tag"]: rendered = pieces["closest-tag"] if pieces["distance"] or pieces["dirty"]: rendered += plus_or_dot(pieces) rendered += "%%d.g%%s" %% (pieces["distance"], pieces["short"]) if pieces["dirty"]: rendered += ".dirty" else: # exception #1 rendered = "0+untagged.%%d.g%%s" %% (pieces["distance"], pieces["short"]) if pieces["dirty"]: rendered += ".dirty" return rendered def render_pep440_pre(pieces): """TAG[.post.devDISTANCE] -- No -dirty. Exceptions: 1: no tags. 0.post.devDISTANCE """ if pieces["closest-tag"]: rendered = pieces["closest-tag"] if pieces["distance"]: rendered += ".post.dev%%d" %% pieces["distance"] else: # exception #1 rendered = "0.post.dev%%d" %% pieces["distance"] return rendered def render_pep440_post(pieces): """TAG[.postDISTANCE[.dev0]+gHEX] . The ".dev0" means dirty. Note that .dev0 sorts backwards (a dirty tree will appear "older" than the corresponding clean one), but you shouldn't be releasing software with -dirty anyways. Exceptions: 1: no tags. 0.postDISTANCE[.dev0] """ if pieces["closest-tag"]: rendered = pieces["closest-tag"] if pieces["distance"] or pieces["dirty"]: rendered += ".post%%d" %% pieces["distance"] if pieces["dirty"]: rendered += ".dev0" rendered += plus_or_dot(pieces) rendered += "g%%s" %% pieces["short"] else: # exception #1 rendered = "0.post%%d" %% pieces["distance"] if pieces["dirty"]: rendered += ".dev0" rendered += "+g%%s" %% pieces["short"] return rendered def render_pep440_old(pieces): """TAG[.postDISTANCE[.dev0]] . The ".dev0" means dirty. Eexceptions: 1: no tags. 0.postDISTANCE[.dev0] """ if pieces["closest-tag"]: rendered = pieces["closest-tag"] if pieces["distance"] or pieces["dirty"]: rendered += ".post%%d" %% pieces["distance"] if pieces["dirty"]: rendered += ".dev0" else: # exception #1 rendered = "0.post%%d" %% pieces["distance"] if pieces["dirty"]: rendered += ".dev0" return rendered def render_git_describe(pieces): """TAG[-DISTANCE-gHEX][-dirty]. Like 'git describe --tags --dirty --always'. Exceptions: 1: no tags. HEX[-dirty] (note: no 'g' prefix) """ if pieces["closest-tag"]: rendered = pieces["closest-tag"] if pieces["distance"]: rendered += "-%%d-g%%s" %% (pieces["distance"], pieces["short"]) else: # exception #1 rendered = pieces["short"] if pieces["dirty"]: rendered += "-dirty" return rendered def render_git_describe_long(pieces): """TAG-DISTANCE-gHEX[-dirty]. Like 'git describe --tags --dirty --always -long'. The distance/hash is unconditional. Exceptions: 1: no tags. HEX[-dirty] (note: no 'g' prefix) """ if pieces["closest-tag"]: rendered = pieces["closest-tag"] rendered += "-%%d-g%%s" %% (pieces["distance"], pieces["short"]) else: # exception #1 rendered = pieces["short"] if pieces["dirty"]: rendered += "-dirty" return rendered def render(pieces, style): """Render the given version pieces into the requested style.""" if pieces["error"]: return {"version": "unknown", "full-revisionid": pieces.get("long"), "dirty": None, "error": pieces["error"], "date": None} if not style or style == "default": style = "pep440" # the default if style == "pep440": rendered = render_pep440(pieces) elif style == "pep440-pre": rendered = render_pep440_pre(pieces) elif style == "pep440-post": rendered = render_pep440_post(pieces) elif style == "pep440-old": rendered = render_pep440_old(pieces) elif style == "git-describe": rendered = render_git_describe(pieces) elif style == "git-describe-long": rendered = render_git_describe_long(pieces) else: raise ValueError("unknown style '%%s'" %% style) return {"version": rendered, "full-revisionid": pieces["long"], "dirty": pieces["dirty"], "error": None, "date": pieces.get("date")} def get_versions(): """Get version information or return default if unable to do so.""" # I am in _version.py, which lives at ROOT/VERSIONFILE_SOURCE. If we have # __file__, we can work backwards from there to the root. Some # py2exe/bbfreeze/non-CPython implementations don't do __file__, in which # case we can only use expanded keywords. cfg = get_config() verbose = cfg.verbose try: return git_versions_from_keywords(get_keywords(), cfg.tag_prefix, verbose) except NotThisMethod: pass try: root = os.path.realpath(__file__) # versionfile_source is the relative path from the top of the source # tree (where the .git directory might live) to this file. Invert # this to find the root from __file__. for i in cfg.versionfile_source.split('/'): root = os.path.dirname(root) except NameError: return {"version": "0+unknown", "full-revisionid": None, "dirty": None, "error": "unable to find root of source tree", "date": None} try: pieces = git_pieces_from_vcs(cfg.tag_prefix, root, verbose) return render(pieces, cfg.style) except NotThisMethod: pass try: if cfg.parentdir_prefix: return versions_from_parentdir(cfg.parentdir_prefix, root, verbose) except NotThisMethod: pass return {"version": "0+unknown", "full-revisionid": None, "dirty": None, "error": "unable to compute version", "date": None} ''' @register_vcs_handler("git", "get_keywords") def git_get_keywords(versionfile_abs): """Extract version information from the given file.""" # the code embedded in _version.py can just fetch the value of these # keywords. When used from setup.py, we don't want to import _version.py, # so we do it with a regexp instead. This function is not used from # _version.py. keywords = {} try: f = open(versionfile_abs, "r") for line in f.readlines(): if line.strip().startswith("git_refnames ="): mo = re.search(r'=\s*"(.*)"', line) if mo: keywords["refnames"] = mo.group(1) if line.strip().startswith("git_full ="): mo = re.search(r'=\s*"(.*)"', line) if mo: keywords["full"] = mo.group(1) if line.strip().startswith("git_date ="): mo = re.search(r'=\s*"(.*)"', line) if mo: keywords["date"] = mo.group(1) f.close() except EnvironmentError: pass return keywords @register_vcs_handler("git", "keywords") def git_versions_from_keywords(keywords, tag_prefix, verbose): """Get version information from git keywords.""" if not keywords: raise NotThisMethod("no keywords at all, weird") date = keywords.get("date") if date is not None: # git-2.2.0 added "%cI", which expands to an ISO-8601 -compliant # datestamp. However we prefer "%ci" (which expands to an "ISO-8601 # -like" string, which we must then edit to make compliant), because # it's been around since git-1.5.3, and it's too difficult to # discover which version we're using, or to work around using an # older one. date = date.strip().replace(" ", "T", 1).replace(" ", "", 1) refnames = keywords["refnames"].strip() if refnames.startswith("$Format"): if verbose: print("keywords are unexpanded, not using") raise NotThisMethod("unexpanded keywords, not a git-archive tarball") refs = set([r.strip() for r in refnames.strip("()").split(",")]) # starting in git-1.8.3, tags are listed as "tag: foo-1.0" instead of # just "foo-1.0". If we see a "tag: " prefix, prefer those. TAG = "tag: " tags = set([r[len(TAG):] for r in refs if r.startswith(TAG)]) if not tags: # Either we're using git < 1.8.3, or there really are no tags. We use # a heuristic: assume all version tags have a digit. The old git %d # expansion behaves like git log --decorate=short and strips out the # refs/heads/ and refs/tags/ prefixes that would let us distinguish # between branches and tags. By ignoring refnames without digits, we # filter out many common branch names like "release" and # "stabilization", as well as "HEAD" and "master". tags = set([r for r in refs if re.search(r'\d', r)]) if verbose: print("discarding '%s', no digits" % ",".join(refs - tags)) if verbose: print("likely tags: %s" % ",".join(sorted(tags))) for ref in sorted(tags): # sorting will prefer e.g. "2.0" over "2.0rc1" if ref.startswith(tag_prefix): r = ref[len(tag_prefix):] if verbose: print("picking %s" % r) return {"version": r, "full-revisionid": keywords["full"].strip(), "dirty": False, "error": None, "date": date} # no suitable tags, so version is "0+unknown", but full hex is still there if verbose: print("no suitable tags, using unknown + full revision id") return {"version": "0+unknown", "full-revisionid": keywords["full"].strip(), "dirty": False, "error": "no suitable tags", "date": None} @register_vcs_handler("git", "pieces_from_vcs") def git_pieces_from_vcs(tag_prefix, root, verbose, run_command=run_command): """Get version from 'git describe' in the root of the source tree. This only gets called if the git-archive 'subst' keywords were *not* expanded, and _version.py hasn't already been rewritten with a short version string, meaning we're inside a checked out source tree. """ GITS = ["git"] if sys.platform == "win32": GITS = ["git.cmd", "git.exe"] out, rc = run_command(GITS, ["rev-parse", "--git-dir"], cwd=root, hide_stderr=True) if rc != 0: if verbose: print("Directory %s not under git control" % root) raise NotThisMethod("'git rev-parse --git-dir' returned error") # if there is a tag matching tag_prefix, this yields TAG-NUM-gHEX[-dirty] # if there isn't one, this yields HEX[-dirty] (no NUM) describe_out, rc = run_command(GITS, ["describe", "--tags", "--dirty", "--always", "--long", "--match", "%s*" % tag_prefix], cwd=root) # --long was added in git-1.5.5 if describe_out is None: raise NotThisMethod("'git describe' failed") describe_out = describe_out.strip() full_out, rc = run_command(GITS, ["rev-parse", "HEAD"], cwd=root) if full_out is None: raise NotThisMethod("'git rev-parse' failed") full_out = full_out.strip() pieces = {} pieces["long"] = full_out pieces["short"] = full_out[:7] # maybe improved later pieces["error"] = None # parse describe_out. It will be like TAG-NUM-gHEX[-dirty] or HEX[-dirty] # TAG might have hyphens. git_describe = describe_out # look for -dirty suffix dirty = git_describe.endswith("-dirty") pieces["dirty"] = dirty if dirty: git_describe = git_describe[:git_describe.rindex("-dirty")] # now we have TAG-NUM-gHEX or HEX if "-" in git_describe: # TAG-NUM-gHEX mo = re.search(r'^(.+)-(\d+)-g([0-9a-f]+)$', git_describe) if not mo: # unparseable. Maybe git-describe is misbehaving? pieces["error"] = ("unable to parse git-describe output: '%s'" % describe_out) return pieces # tag full_tag = mo.group(1) if not full_tag.startswith(tag_prefix): if verbose: fmt = "tag '%s' doesn't start with prefix '%s'" print(fmt % (full_tag, tag_prefix)) pieces["error"] = ("tag '%s' doesn't start with prefix '%s'" % (full_tag, tag_prefix)) return pieces pieces["closest-tag"] = full_tag[len(tag_prefix):] # distance: number of commits since tag pieces["distance"] = int(mo.group(2)) # commit: short hex revision ID pieces["short"] = mo.group(3) else: # HEX: no tags pieces["closest-tag"] = None count_out, rc = run_command(GITS, ["rev-list", "HEAD", "--count"], cwd=root) pieces["distance"] = int(count_out) # total number of commits # commit date: see ISO-8601 comment in git_versions_from_keywords() date = run_command(GITS, ["show", "-s", "--format=%ci", "HEAD"], cwd=root)[0].strip() pieces["date"] = date.strip().replace(" ", "T", 1).replace(" ", "", 1) return pieces def do_vcs_install(manifest_in, versionfile_source, ipy): """Git-specific installation logic for Versioneer. For Git, this means creating/changing .gitattributes to mark _version.py for export-subst keyword substitution. """ GITS = ["git"] if sys.platform == "win32": GITS = ["git.cmd", "git.exe"] files = [manifest_in, versionfile_source] if ipy: files.append(ipy) try: me = __file__ if me.endswith(".pyc") or me.endswith(".pyo"): me = os.path.splitext(me)[0] + ".py" versioneer_file = os.path.relpath(me) except NameError: versioneer_file = "versioneer.py" files.append(versioneer_file) present = False try: f = open(".gitattributes", "r") for line in f.readlines(): if line.strip().startswith(versionfile_source): if "export-subst" in line.strip().split()[1:]: present = True f.close() except EnvironmentError: pass if not present: f = open(".gitattributes", "a+") f.write("%s export-subst\n" % versionfile_source) f.close() files.append(".gitattributes") run_command(GITS, ["add", "--"] + files) def versions_from_parentdir(parentdir_prefix, root, verbose): """Try to determine the version from the parent directory name. Source tarballs conventionally unpack into a directory that includes both the project name and a version string. We will also support searching up two directory levels for an appropriately named parent directory """ rootdirs = [] for i in range(3): dirname = os.path.basename(root) if dirname.startswith(parentdir_prefix): return {"version": dirname[len(parentdir_prefix):], "full-revisionid": None, "dirty": False, "error": None, "date": None} else: rootdirs.append(root) root = os.path.dirname(root) # up a level if verbose: print("Tried directories %s but none started with prefix %s" % (str(rootdirs), parentdir_prefix)) raise NotThisMethod("rootdir doesn't start with parentdir_prefix") SHORT_VERSION_PY = """ # This file was generated by 'versioneer.py' (0.18) from # revision-control system data, or from the parent directory name of an # unpacked source archive. Distribution tarballs contain a pre-generated copy # of this file. import json version_json = ''' %s ''' # END VERSION_JSON def get_versions(): return json.loads(version_json) """ def versions_from_file(filename): """Try to determine the version from _version.py if present.""" try: with open(filename) as f: contents = f.read() except EnvironmentError: raise NotThisMethod("unable to read _version.py") mo = re.search(r"version_json = '''\n(.*)''' # END VERSION_JSON", contents, re.M | re.S) if not mo: mo = re.search(r"version_json = '''\r\n(.*)''' # END VERSION_JSON", contents, re.M | re.S) if not mo: raise NotThisMethod("no version_json in _version.py") return json.loads(mo.group(1)) def write_to_version_file(filename, versions): """Write the given version number to the given _version.py file.""" os.unlink(filename) contents = json.dumps(versions, sort_keys=True, indent=1, separators=(",", ": ")) with open(filename, "w") as f: f.write(SHORT_VERSION_PY % contents) print("set %s to '%s'" % (filename, versions["version"])) def plus_or_dot(pieces): """Return a + if we don't already have one, else return a .""" if "+" in pieces.get("closest-tag", ""): return "." return "+" def render_pep440(pieces): """Build up version string, with post-release "local version identifier". Our goal: TAG[+DISTANCE.gHEX[.dirty]] . Note that if you get a tagged build and then dirty it, you'll get TAG+0.gHEX.dirty Exceptions: 1: no tags. git_describe was just HEX. 0+untagged.DISTANCE.gHEX[.dirty] """ if pieces["closest-tag"]: rendered = pieces["closest-tag"] if pieces["distance"] or pieces["dirty"]: rendered += plus_or_dot(pieces) rendered += "%d.g%s" % (pieces["distance"], pieces["short"]) if pieces["dirty"]: rendered += ".dirty" else: # exception #1 rendered = "0+untagged.%d.g%s" % (pieces["distance"], pieces["short"]) if pieces["dirty"]: rendered += ".dirty" return rendered def render_pep440_pre(pieces): """TAG[.post.devDISTANCE] -- No -dirty. Exceptions: 1: no tags. 0.post.devDISTANCE """ if pieces["closest-tag"]: rendered = pieces["closest-tag"] if pieces["distance"]: rendered += ".post.dev%d" % pieces["distance"] else: # exception #1 rendered = "0.post.dev%d" % pieces["distance"] return rendered def render_pep440_post(pieces): """TAG[.postDISTANCE[.dev0]+gHEX] . The ".dev0" means dirty. Note that .dev0 sorts backwards (a dirty tree will appear "older" than the corresponding clean one), but you shouldn't be releasing software with -dirty anyways. Exceptions: 1: no tags. 0.postDISTANCE[.dev0] """ if pieces["closest-tag"]: rendered = pieces["closest-tag"] if pieces["distance"] or pieces["dirty"]: rendered += ".post%d" % pieces["distance"] if pieces["dirty"]: rendered += ".dev0" rendered += plus_or_dot(pieces) rendered += "g%s" % pieces["short"] else: # exception #1 rendered = "0.post%d" % pieces["distance"] if pieces["dirty"]: rendered += ".dev0" rendered += "+g%s" % pieces["short"] return rendered def render_pep440_old(pieces): """TAG[.postDISTANCE[.dev0]] . The ".dev0" means dirty. Eexceptions: 1: no tags. 0.postDISTANCE[.dev0] """ if pieces["closest-tag"]: rendered = pieces["closest-tag"] if pieces["distance"] or pieces["dirty"]: rendered += ".post%d" % pieces["distance"] if pieces["dirty"]: rendered += ".dev0" else: # exception #1 rendered = "0.post%d" % pieces["distance"] if pieces["dirty"]: rendered += ".dev0" return rendered def render_git_describe(pieces): """TAG[-DISTANCE-gHEX][-dirty]. Like 'git describe --tags --dirty --always'. Exceptions: 1: no tags. HEX[-dirty] (note: no 'g' prefix) """ if pieces["closest-tag"]: rendered = pieces["closest-tag"] if pieces["distance"]: rendered += "-%d-g%s" % (pieces["distance"], pieces["short"]) else: # exception #1 rendered = pieces["short"] if pieces["dirty"]: rendered += "-dirty" return rendered def render_git_describe_long(pieces): """TAG-DISTANCE-gHEX[-dirty]. Like 'git describe --tags --dirty --always -long'. The distance/hash is unconditional. Exceptions: 1: no tags. HEX[-dirty] (note: no 'g' prefix) """ if pieces["closest-tag"]: rendered = pieces["closest-tag"] rendered += "-%d-g%s" % (pieces["distance"], pieces["short"]) else: # exception #1 rendered = pieces["short"] if pieces["dirty"]: rendered += "-dirty" return rendered def render(pieces, style): """Render the given version pieces into the requested style.""" if pieces["error"]: return {"version": "unknown", "full-revisionid": pieces.get("long"), "dirty": None, "error": pieces["error"], "date": None} if not style or style == "default": style = "pep440" # the default if style == "pep440": rendered = render_pep440(pieces) elif style == "pep440-pre": rendered = render_pep440_pre(pieces) elif style == "pep440-post": rendered = render_pep440_post(pieces) elif style == "pep440-old": rendered = render_pep440_old(pieces) elif style == "git-describe": rendered = render_git_describe(pieces) elif style == "git-describe-long": rendered = render_git_describe_long(pieces) else: raise ValueError("unknown style '%s'" % style) return {"version": rendered, "full-revisionid": pieces["long"], "dirty": pieces["dirty"], "error": None, "date": pieces.get("date")} class VersioneerBadRootError(Exception): """The project root directory is unknown or missing key files.""" def get_versions(verbose=False): """Get the project version from whatever source is available. Returns dict with two keys: 'version' and 'full'. """ if "versioneer" in sys.modules: # see the discussion in cmdclass.py:get_cmdclass() del sys.modules["versioneer"] root = get_root() cfg = get_config_from_root(root) assert cfg.VCS is not None, "please set [versioneer]VCS= in setup.cfg" handlers = HANDLERS.get(cfg.VCS) assert handlers, "unrecognized VCS '%s'" % cfg.VCS verbose = verbose or cfg.verbose assert cfg.versionfile_source is not None, \ "please set versioneer.versionfile_source" assert cfg.tag_prefix is not None, "please set versioneer.tag_prefix" versionfile_abs = os.path.join(root, cfg.versionfile_source) # extract version from first of: _version.py, VCS command (e.g. 'git # describe'), parentdir. This is meant to work for developers using a # source checkout, for users of a tarball created by 'setup.py sdist', # and for users of a tarball/zipball created by 'git archive' or github's # download-from-tag feature or the equivalent in other VCSes. get_keywords_f = handlers.get("get_keywords") from_keywords_f = handlers.get("keywords") if get_keywords_f and from_keywords_f: try: keywords = get_keywords_f(versionfile_abs) ver = from_keywords_f(keywords, cfg.tag_prefix, verbose) if verbose: print("got version from expanded keyword %s" % ver) return ver except NotThisMethod: pass try: ver = versions_from_file(versionfile_abs) if verbose: print("got version from file %s %s" % (versionfile_abs, ver)) return ver except NotThisMethod: pass from_vcs_f = handlers.get("pieces_from_vcs") if from_vcs_f: try: pieces = from_vcs_f(cfg.tag_prefix, root, verbose) ver = render(pieces, cfg.style) if verbose: print("got version from VCS %s" % ver) return ver except NotThisMethod: pass try: if cfg.parentdir_prefix: ver = versions_from_parentdir(cfg.parentdir_prefix, root, verbose) if verbose: print("got version from parentdir %s" % ver) return ver except NotThisMethod: pass if verbose: print("unable to compute version") return {"version": "0+unknown", "full-revisionid": None, "dirty": None, "error": "unable to compute version", "date": None} def get_version(): """Get the short version string for this project.""" return get_versions()["version"] def get_cmdclass(): """Get the custom setuptools/distutils subclasses used by Versioneer.""" if "versioneer" in sys.modules: del sys.modules["versioneer"] # this fixes the "python setup.py develop" case (also 'install' and # 'easy_install .'), in which subdependencies of the main project are # built (using setup.py bdist_egg) in the same python process. Assume # a main project A and a dependency B, which use different versions # of Versioneer. A's setup.py imports A's Versioneer, leaving it in # sys.modules by the time B's setup.py is executed, causing B to run # with the wrong versioneer. Setuptools wraps the sub-dep builds in a # sandbox that restores sys.modules to it's pre-build state, so the # parent is protected against the child's "import versioneer". By # removing ourselves from sys.modules here, before the child build # happens, we protect the child from the parent's versioneer too. # Also see https://github.com/warner/python-versioneer/issues/52 cmds = {} # we add "version" to both distutils and setuptools from distutils.core import Command class cmd_version(Command): description = "report generated version string" user_options = [] boolean_options = [] def initialize_options(self): pass def finalize_options(self): pass def run(self): vers = get_versions(verbose=True) print("Version: %s" % vers["version"]) print(" full-revisionid: %s" % vers.get("full-revisionid")) print(" dirty: %s" % vers.get("dirty")) print(" date: %s" % vers.get("date")) if vers["error"]: print(" error: %s" % vers["error"]) cmds["version"] = cmd_version # we override "build_py" in both distutils and setuptools # # most invocation pathways end up running build_py: # distutils/build -> build_py # distutils/install -> distutils/build ->.. # setuptools/bdist_wheel -> distutils/install ->.. # setuptools/bdist_egg -> distutils/install_lib -> build_py # setuptools/install -> bdist_egg ->.. # setuptools/develop -> ? # pip install: # copies source tree to a tempdir before running egg_info/etc # if .git isn't copied too, 'git describe' will fail # then does setup.py bdist_wheel, or sometimes setup.py install # setup.py egg_info -> ? # we override different "build_py" commands for both environments if "setuptools" in sys.modules: from setuptools.command.build_py import build_py as _build_py else: from distutils.command.build_py import build_py as _build_py class cmd_build_py(_build_py): def run(self): root = get_root() cfg = get_config_from_root(root) versions = get_versions() _build_py.run(self) # now locate _version.py in the new build/ directory and replace # it with an updated value if cfg.versionfile_build: target_versionfile = os.path.join(self.build_lib, cfg.versionfile_build) print("UPDATING %s" % target_versionfile) write_to_version_file(target_versionfile, versions) cmds["build_py"] = cmd_build_py if "cx_Freeze" in sys.modules: # cx_freeze enabled? from cx_Freeze.dist import build_exe as _build_exe # nczeczulin reports that py2exe won't like the pep440-style string # as FILEVERSION, but it can be used for PRODUCTVERSION, e.g. # setup(console=[{ # "version": versioneer.get_version().split("+", 1)[0], # FILEVERSION # "product_version": versioneer.get_version(), # ... class cmd_build_exe(_build_exe): def run(self): root = get_root() cfg = get_config_from_root(root) versions = get_versions() target_versionfile = cfg.versionfile_source print("UPDATING %s" % target_versionfile) write_to_version_file(target_versionfile, versions) _build_exe.run(self) os.unlink(target_versionfile) with open(cfg.versionfile_source, "w") as f: LONG = LONG_VERSION_PY[cfg.VCS] f.write(LONG % {"DOLLAR": "$", "STYLE": cfg.style, "TAG_PREFIX": cfg.tag_prefix, "PARENTDIR_PREFIX": cfg.parentdir_prefix, "VERSIONFILE_SOURCE": cfg.versionfile_source, }) cmds["build_exe"] = cmd_build_exe del cmds["build_py"] if 'py2exe' in sys.modules: # py2exe enabled? try: from py2exe.distutils_buildexe import py2exe as _py2exe # py3 except ImportError: from py2exe.build_exe import py2exe as _py2exe # py2 class cmd_py2exe(_py2exe): def run(self): root = get_root() cfg = get_config_from_root(root) versions = get_versions() target_versionfile = cfg.versionfile_source print("UPDATING %s" % target_versionfile) write_to_version_file(target_versionfile, versions) _py2exe.run(self) os.unlink(target_versionfile) with open(cfg.versionfile_source, "w") as f: LONG = LONG_VERSION_PY[cfg.VCS] f.write(LONG % {"DOLLAR": "$", "STYLE": cfg.style, "TAG_PREFIX": cfg.tag_prefix, "PARENTDIR_PREFIX": cfg.parentdir_prefix, "VERSIONFILE_SOURCE": cfg.versionfile_source, }) cmds["py2exe"] = cmd_py2exe # we override different "sdist" commands for both environments if "setuptools" in sys.modules: from setuptools.command.sdist import sdist as _sdist else: from distutils.command.sdist import sdist as _sdist class cmd_sdist(_sdist): def run(self): versions = get_versions() self._versioneer_generated_versions = versions # unless we update this, the command will keep using the old # version self.distribution.metadata.version = versions["version"] return _sdist.run(self) def make_release_tree(self, base_dir, files): root = get_root() cfg = get_config_from_root(root) _sdist.make_release_tree(self, base_dir, files) # now locate _version.py in the new base_dir directory # (remembering that it may be a hardlink) and replace it with an # updated value target_versionfile = os.path.join(base_dir, cfg.versionfile_source) print("UPDATING %s" % target_versionfile) write_to_version_file(target_versionfile, self._versioneer_generated_versions) cmds["sdist"] = cmd_sdist return cmds CONFIG_ERROR = """ setup.cfg is missing the necessary Versioneer configuration. You need a section like: [versioneer] VCS = git style = pep440 versionfile_source = src/myproject/_version.py versionfile_build = myproject/_version.py tag_prefix = parentdir_prefix = myproject- You will also need to edit your setup.py to use the results: import versioneer setup(version=versioneer.get_version(), cmdclass=versioneer.get_cmdclass(), ...) Please read the docstring in ./versioneer.py for configuration instructions, edit setup.cfg, and re-run the installer or 'python versioneer.py setup'. """ SAMPLE_CONFIG = """ # See the docstring in versioneer.py for instructions. Note that you must # re-run 'versioneer.py setup' after changing this section, and commit the # resulting files. [versioneer] #VCS = git #style = pep440 #versionfile_source = #versionfile_build = #tag_prefix = #parentdir_prefix = """ INIT_PY_SNIPPET = """ from ._version import get_versions __version__ = get_versions()['version'] del get_versions """ def do_setup(): """Main VCS-independent setup function for installing Versioneer.""" root = get_root() try: cfg = get_config_from_root(root) except (EnvironmentError, configparser.NoSectionError, configparser.NoOptionError) as e: if isinstance(e, (EnvironmentError, configparser.NoSectionError)): print("Adding sample versioneer config to setup.cfg", file=sys.stderr) with open(os.path.join(root, "setup.cfg"), "a") as f: f.write(SAMPLE_CONFIG) print(CONFIG_ERROR, file=sys.stderr) return 1 print(" creating %s" % cfg.versionfile_source) with open(cfg.versionfile_source, "w") as f: LONG = LONG_VERSION_PY[cfg.VCS] f.write(LONG % {"DOLLAR": "$", "STYLE": cfg.style, "TAG_PREFIX": cfg.tag_prefix, "PARENTDIR_PREFIX": cfg.parentdir_prefix, "VERSIONFILE_SOURCE": cfg.versionfile_source, }) ipy = os.path.join(os.path.dirname(cfg.versionfile_source), "__init__.py") if os.path.exists(ipy): try: with open(ipy, "r") as f: old = f.read() except EnvironmentError: old = "" if INIT_PY_SNIPPET not in old: print(" appending to %s" % ipy) with open(ipy, "a") as f: f.write(INIT_PY_SNIPPET) else: print(" %s unmodified" % ipy) else: print(" %s doesn't exist, ok" % ipy) ipy = None # Make sure both the top-level "versioneer.py" and versionfile_source # (PKG/_version.py, used by runtime code) are in MANIFEST.in, so # they'll be copied into source distributions. Pip won't be able to # install the package without this. manifest_in = os.path.join(root, "MANIFEST.in") simple_includes = set() try: with open(manifest_in, "r") as f: for line in f: if line.startswith("include "): for include in line.split()[1:]: simple_includes.add(include) except EnvironmentError: pass # That doesn't cover everything MANIFEST.in can do # (http://docs.python.org/2/distutils/sourcedist.html#commands), so # it might give some false negatives. Appending redundant 'include' # lines is safe, though. if "versioneer.py" not in simple_includes: print(" appending 'versioneer.py' to MANIFEST.in") with open(manifest_in, "a") as f: f.write("include versioneer.py\n") else: print(" 'versioneer.py' already in MANIFEST.in") if cfg.versionfile_source not in simple_includes: print(" appending versionfile_source ('%s') to MANIFEST.in" % cfg.versionfile_source) with open(manifest_in, "a") as f: f.write("include %s\n" % cfg.versionfile_source) else: print(" versionfile_source already in MANIFEST.in") # Make VCS-specific changes. For git, this means creating/changing # .gitattributes to mark _version.py for export-subst keyword # substitution. do_vcs_install(manifest_in, cfg.versionfile_source, ipy) return 0 def scan_setup_py(): """Validate the contents of setup.py against Versioneer's expectations.""" found = set() setters = False errors = 0 with open("setup.py", "r") as f: for line in f.readlines(): if "import versioneer" in line: found.add("import") if "versioneer.get_cmdclass()" in line: found.add("cmdclass") if "versioneer.get_version()" in line: found.add("get_version") if "versioneer.VCS" in line: setters = True if "versioneer.versionfile_source" in line: setters = True if len(found) != 3: print("") print("Your setup.py appears to be missing some important items") print("(but I might be wrong). Please make sure it has something") print("roughly like the following:") print("") print(" import versioneer") print(" setup( version=versioneer.get_version(),") print(" cmdclass=versioneer.get_cmdclass(), ...)") print("") errors += 1 if setters: print("You should remove lines like 'versioneer.VCS = ' and") print("'versioneer.versionfile_source = ' . This configuration") print("now lives in setup.cfg, and should be removed from setup.py") print("") errors += 1 return errors if __name__ == "__main__": cmd = sys.argv[1] if cmd == "setup": errors = do_setup() errors += scan_setup_py() if errors: sys.exit(1)