Test-Unit-0.25/0000755000175000017500000000000010324277074013430 5ustar mca1001mca100100000000000000Test-Unit-0.25/doc/0000755000175000017500000000000010324277074014175 5ustar mca1001mca100100000000000000Test-Unit-0.25/doc/consensus.txt0000644000175000017500000001164707374754713017002 0ustar mca1001mca100100000000000000-*- outline -*- * Intro We were wondering how we should go about keeping track of the consensuses (sp?) we reached on the perlunit-devel mailing list. Matthew was all for a cumbersome set of tags so we could grep the list for "points". Christian suggested a simple text file in CVS which we modify as appropriate. This is a compromise - a simple text file marked up for use with emacs' "outline-mode". Most of the active developers use emacs. Issues currently being discussed on the list can be kept track of here by listing any suggestions made or conclusions which were reached. Once it's decided what needs to be done, the details should be moved to doc/TODO and someone will get on with implementing them. Please only update this file on the main branch! ** Links back to the mailing list Might be handy for those with local archives, but dropping message-ids in this file will make a mess IMHO -- mca * Coding conventions If in doubt, conform to the style shown in the existing code. ** use vs. require After a discussion on perlunit-devel in March 2001, subject 'Towards sensible failure messages', we settled on use rather than require, except where we only want to load a module if we need it, of course. ** whitespace No hard tabs, 4 column indent level. * Auto-adding tests, Test::Unit::TestSuite->new() ** interaction with inheritance Broken in v0.13, it will take SUPER::test_foo if test_foo is an inheritted method in the class being scanned. Fixed by Piers. ** regexps to pull functions called /^test/ I think current consensus is to change the default to /^test[_A-Z]/ but make it configurable. I seem to have lost that thread -- mca * Debug methods Not much agreement yet, here are some of the suggestions ** $self->debug() A dead/unused patch from Matthew, the idea was a default debug in the base T:U:TestCase class and methods to override it. Messy and inconvenient. ** $self->listener->debug($@) Some say listeners are Java-ish. Others say that they're good anyway. 9-) Arguments are headed towards something like debug( level => 123, user => "simple message", developer => "complicated message" ); or some variation on the theme. This all looks rather verbose so far though. 8-( ** clever things with caller() one vote for [MCA] (provided you can override it) one vote against? [PDC] * Documentation ** Where? Where should it be kept? At the moment it lives almost entirely in POD and mailing list/message board format, and so is inaccessible. A pod2html pass of released software should probably be served on the website. Matthew's (almost finished) cvspublish.pl script could do most of this but is probably overkill. Also it doesn't grok MANIFEST files. There is a documentation manager on SF. The front door is not too friendly and there is no back door to the data inside it. ** API & PerlUnit overview Current favourite is to point at the JUnit docs. There is in 'src/api' a set of basic perl modules containing the essence of the structure, but they're getting old. Also, the SF message boards have some knowledge which needs distilling. * Namespace pollution ** classes used during self-tests We're going to try to avoid it while generating "inner classes" or whatever, for the self-tests. ** keys in the TestCase object hash [not yet discussed] T:U::TestCase::new is biting into namespace belonging to classes inherited from T:U::TestCase .. currently it only takes _name ... I'm wondering whether we should go to '__' prefix in the C tradition for "magic things", since the perlunit user shouldn't need to mess with this? -- mca Not sure I understand what you're getting at here. The PITA approach would be to name all the keys used only by T:U::TestCase as 'Test::Unit::TestCase::keyname', which is a pain to work with, but probably the best practice. See the discussion in Damian Conway's Object Oriented Perl. -- pdc * TODO lists Moved to doc/TODO. * Packaging [mca: Christian has SourceForge and CPAN packaging pretty much wrapped up *cough*, this is documented in another file in this directory] ** Debian GNU/Linux [mca: Since I use perlunit for production work, I'm tempted to roll a package if it's not too tricky. There is a stack of reading to do first though (I'm not an official Debian developer) Relevant bit from /usr/doc/dh-make-perl/README dh-make-perl will create the files required to build a debian source package out of a perl package. This works for most simple packages and is also useful for getting started with packaging perl modules. There is an override mechanism in place to handle most of the little changes that may be needed for some modules (this hasn't been tested much, though). Using this program is no excuse for not reading the debian developer documentation, including the policy, the perl policy, the packaging manual and so on. See also http://www.uk.debian.org/devel/ ] ** RedHat [mca: I made a RH package a long time ago... don't remember how] Test-Unit-0.25/doc/release-checklist0000644000175000017500000001510510324276751017512 0ustar mca1001mca100100000000000000 This is out of date in places. I haven't investigated which places. Note that there are multiple bug trackers, listed here in what mca considers the order of preference, http://sourceforge.net/tracker/?group_id=2653&atid=102653 http://rt.cpan.org/NoAuth/Bugs.html?Dist=Test-Unit http://bugs.debian.org/libtest-unit-perl Also note use of ChangeLog instead of Changes, and parts of doc/TODO ------------------------------------------------- The procedure should be: ------------------------------------------------- Prerequisites: Make sure all the tests run OK. Make sure all the examples run OK. 1. Commit new files in src/Test-Unit 2. lib/Test/Unit.pm - put in the new $VERSION for the distribution 3. MANIFEST if files are to be added to the tarball ("make manifest" will add new files and tell you, but check they're not local cruft from your working copy. Get a clean checkout of the working copy to ensure no files are missing, or that you have removed deleted files from MANIFEST.) 4. cvs rtag -r HEAD REL_0_14 releasemodule (with the $VERSION number from above) 5. make clean ; perl Makefile.PL ; make tardist 6. upload to incoming as per Sourceforge docs 7. notify current CPAN maintainer to get an upload ------------------------------------------------- Explanation on version number synchronization: ------------------------------------------------- The CPAN module will decide to upgrade a module when the version number of the module installed locally is less than the highest version number of any version of the module it can find on CPAN. It will find out the distribution file this module is in, and then install this distribution file. This can lead to surprising results for distribution files that contain multiple modules. Take this common situation: package Foo-0.22.tar.gz contains modules Foo, Foo::Bar, and Foo::Baz. Now, something changes in Foo::Bar, and Foo::Bar gets a new version number. The module author happily uploads Foo-0.23.tar.gz to CPAN. Now, will the CPAN module use Foo-0.23.tar.gz to upgrade package Foo if you tell it "install Foo"? No. CPAN will look at the version number for Foo, determine it has not changed compared to the locally installed version, and do nothing. You have to tell it "install Foo::Bar" to get the new distribution file, which is bad, since nobody will know she has to do that. The solution is to make sure any time a distribution file gets upgraded, its top level module should get a new, higher version number. This way, things will work like people expect them to work. Please note that any module on CPAN should have a version number, even if it is contained in a package with many other modules. This ensures that people can require a certain version of any module in a given distribution file. ------------------------------------------------- References ------------------------------------------------- Date: Wed, 21 Feb 2001 14:06:35 +0000 From: Matthew Astley To: perlunit-devel@lists.sourceforge.net Subject: Re: [Perlunit-devel] CVS tags / release procedure Message-ID: <20010221140635.P25661@grantadesign.com> References: <20010220215614.H25661@grantadesign.com> <000901c09bf0$a1641140$9f0010ac@aixonix.de> <20010221130709.A9412@thelonious.new.ox.ac.uk> <20010220215614.H25661@grantadesign.com> <000901c09bf0$a1641140$9f0010ac@aixonix.de> In-Reply-To: <000901c09bf0$a1641140$9f0010ac@aixonix.de>; from lemburg@aixonix.de on Wed, Feb 21, 2001 at 11:25:36AM +0100 On Wed, Feb 21, 2001 at 11:25:36AM +0100, Christian Lemburg wrote: > OK so far, I suggest to replace the manual tar with > "make clean ; perl Makefile.PL ; make tardist" > (your perl will do the Right CPAN Thing for you). [revised] Commit new files in src/Test-Unit-0.1 including - Changes (section for release at the top) - Makefile.PL (set new $VERSION) - README (Version numbers on installation commands .. surely we could put something generic in here?) - MANIFEST if files are to be added to the tarball cvs rtag -r HEAD REL_0_14 releasemodule cvs exp -r REL_0_14 -d Test-Unit-n.nn src/Test-Unit-0.1 make clean ; perl Makefile.PL ; make tardist (upload to incoming as per Sourceforge docs) As for the CPAN stuff, is this complicated? Presumably the significant changes are documented in ExtUtils::MakeMaker? Also, since there's filtering via MANIFEST, is there any need to 'export' instead of running from a checked out working copy? Could Makefile.PL enquire of CVS or the top of the Changes file which version we're releasing? I'm thinking about reducing the number of things that need trivial tweaks before making a release. > > I'm left thinking that it could be handy to tag files as development > > only, so for example I could drop my GenericTests.pm into place but > > tag it as mine/not for release. It's rather hard for someone to commit > > on a patch, I think? So we've a solution to this separate problem, but perhaps we should hold off the feature creep until we've got more tests in? (any bright ideas for ways to tie the docs to the tests so the can fail a test when we tweak things? I'm just about to digress hugely so I'll save it for another post) > > * tag release stuff as STABLE or similar, then do > > > > cvs rtag -r STABLE REL_0_14 releasemodule [patches commands above, nb. "-r HEAD" instead of "-r STABLE"] > > > > and export that. > > That would be my preferred option. Would suit me too, since ATM we've no way to backtrace to a release. Only thing is, if you can release a checked out copy, the export is a little wasteful. Matthew #8-) From: "Christian Lemburg" To: "Matthew Astley" , References: <20010220215614.H25661@grantadesign.com> <000901c09bf0$a1641140$9f0010ac@aixonix.de> <20010221130709.A9412@thelonious.new.ox.ac.uk> <20010220215614.H25661@grantadesign.com> <000901c09bf0$a1641140$9f0010ac@aixonix.de> <20010221140635.P25661@grantadesign.com> Subject: Re: [Perlunit-devel] CVS tags / release procedure Date: Wed, 21 Feb 2001 15:58:34 +0100 > Also, since there's filtering via MANIFEST, is there any need to > 'export' instead of running from a checked out working copy? Could > Makefile.PL enquire of CVS or the top of the Changes file which > version we're releasing? No. You can just run from a checked out working copy. At least that was what I did until now. Cheers, Christian _______________________________________________ Perlunit-devel mailing list Perlunit-devel@lists.sourceforge.net http://lists.sourceforge.net/lists/listinfo/perlunit-devel Test-Unit-0.25/doc/class-diagram.dia0000644000175000017500000152042010273776502017372 0ustar mca1001mca100100000000000000 #A4# #Test::Unit::Failure# ## ## #Test::Unit::Assert# ## ## #assert# ## ## ## #normalize_assertion# ## ## ## #assert_raises# ## ## ## #do_assertion# ## ## ## #multi_assert# ## ## ## #is_numeric# ## ## ## #assert_equals# ## ## ## #ok# ## ## ## #assert_not_equals# ## ## ## #assert_deep_equals# ## ## ## #_deep_check# ## ## ## #_eq_array# ## ## ## #_eq_hash# ## ## ## #_format_stack# ## ## ## #fail# ## ## ## #error# ## ## ## #quell_backtrace# ## ## ## #get_backtrace_on_fail# ## ## ## #Test::Unit::Procedural# ## ## #add_to_suites# ## ## ## #assert# ## ## ## #create_suite# ## ## ## #run_suite# ## ## ## #add_suite# ## ## ## #Test::Unit::Error# ## ## #make_new_from_error# ## ## ## #Test::Unit::Result# ## ## #_Listeners# ## ## ## #_Errors# ## ## ## #_Failures# ## ## ## #_Run_tests# ## ## ## #_Stop# ## ## ## #new# ## ## ## #tell_listeners# ## ## ## #add_error# ## ## ## #add_failure# ## ## ## #add_pass# ## ## ## #add_listener# ## ## ## #listeners# ## ## ## #end_test# ## ## ## #error_count# ## ## ## #errors# ## ## ## #failure_count# ## ## ## #failures# ## ## ## #run# ## ## ## #run_protected# ## ## ## #run_count# ## ## ## #run_count_inc# ## ## ## #should_stop# ## ## ## #start_test# ## ## ## #stop# ## ## ## #was_successful# ## ## ## #to_string# ## ## ## #Test::Unit::Loader# ## ## #obj_load# ## ## ## #compile# ## ## ## #compile_class# ## ## ## #compile_file# ## ## ## #load# ## ## ## #load_test# ## ## ## #load_test_suite# ## ## ## #load_test_case# ## ## ## #extract_testcases# ## ## ## #load_test_harness_test# ## ## ## #load_test_dir# ## ## ## #get_package_name_from_file# ## ## ## #Test::Unit::Runner::Terminal# ## ## #_last_test# ## ## ## #start_suite# ## ## ## #end_suite# ## ## ## #start_test# ## ## ## #end_test# ## ## ## #add_error# ## ## ## #add_failure# ## ## ## #add_pass# ## ## ## #_update_status# ## ## ## #print_result# ## ## ## #Test::Unit::Assertion# ## ## #fail# ## ## ## #do_assertion# ## ## ## #new# ## ## ## #Test::Unit::UnitHarness# ## ## #_Name# ## ## ## #_Names# ## ## ## #new# ## ## ## #run# ## ## ## #name# ## ## ## #names# ## ## ## #add_test# ## ## ## #add_test_method# ## ## ## #count_test_cases# ## ## ## #to_string# ## ## ## #warning# ## ## ## #Test::Unit::TkTestRunner# ## ## #frame# ## ## ## #number_of_errors# ## ## ## #number_of_failures# ## ## ## #failure_list# ## ## ## #failed_tests# ## ## ## #exceptions# ## ## ## #planned# ## ## ## #suite_name# ## ## ## #suite_label# ## ## ## #suite_field# ## ## ## #add_text_listener# ## ## ## #run# ## ## ## #progress_bar# ## ## ## #failure_label# ## ## ## #quit_button# ## ## ## #rerun_button# ## ## ## #show_error_button# ## ## ## #status_line_box# ## ## ## #runs# ## ## ## #status_line# ## ## ## #listbox# ## ## ## #number_of_runs# ## ## ## #runner# ## ## ## #result# ## ## ## #start_time# ## ## ## #finish_time# ## ## ## #run_time# ## ## ## #new# ## ## ## #about# ## ## ## #add_error# ## ## ## #add_failure# ## ## ## #append_failure# ## ## ## #plan# ## ## ## #choose_file# ## ## ## #create_punit_menu# ## ## ## #create_menus# ## ## ## #create_ui# ## ## ## #end_test# ## ## ## #get_test# ## ## ## #is_error_selected# ## ## ## #load_frame_icon# ## ## ## #main# ## ## ## #rerun# ## ## ## #reset# ## ## ## #run# ## ## ## #run_failed# ## ## ## #run_suite# ## ## ## #show_error_trace# ## ## ## #show_info# ## ## ## #show_status# ## ## ## #start# ## ## ## #start_test# ## ## ## #add_pass# ## ## ## #update# ## ## ## #add_to_history# ## ## ## #Test::Unit::Assertion::CodeRef# ## ## #new# ## ## ## #do_assertion# ## ## ## #to_string# ## ## ## #Test::Unit::HarnessUnit# ## ## #_Print_stream# ## ## ## #new# ## ## ## #print_stream# ## ## ## #_print# ## ## ## #start_test# ## ## ## #not_ok# ## ## ## #ok# ## ## ## #add_error# ## ## ## #add_failure# ## ## ## #add_pass# ## ## ## #end_test# ## ## ## #do_run# ## ## ## #main# ## ## ## #run# ## ## ## #start# ## ## ## #Test::Unit::Assertion::Exception# ## ## #new# ## ## ## #do_assertion# ## ## ## #to_string# ## ## ## #Test::Unit::Setup# ## ## #run# ## ## ## #set_up# ## ## ## #tear_down# ## ## ## #Test::Unit::Runner# ## ## #_result# ## ## ## #_suites_running# ## ## ## #_filter# ## ## ## #create_test_result# ## ## ## #result# ## ## ## #start_suite# ## ## ## #end_suite# ## ## ## #suites_running# ## ## ## #filter# ## ## ## #reset_filter# ## ## ## #Test::Unit::Assertion::Boolean# ## ## #new# ## ## ## #do_assertion# ## ## ## #to_string# ## ## ## #Test::Unit::UnitHarness::Exception# ## ## #stacktrace# ## ## ## #new# ## ## ## #stacktrace# ## ## ## #Test::Unit::TestCase# ## ## #__PACKAGE__ . "_annotations# ## ## ## #__PACKAGE__ . "_name# ## ## ## #new# ## ## ## #annotate# ## ## ## #annotations# ## ## ## #count_test_cases# ## ## ## #create_result# ## ## ## #name# ## ## ## #run# ## ## ## #run_bare# ## ## ## #run_test# ## ## ## #set_up# ## ## ## #tear_down# ## ## ## #to_string# ## ## ## #make_test_from_coderef# ## ## ## #list_tests# ## ## ## #get_matching_methods# ## ## ## #list# ## ## ## #Test::Unit::TestSuite# ## ## #_Name# ## ## ## #_Tests# ## ## ## #empty_new# ## ## ## #new# ## ## ## #suite# ## ## ## #name# ## ## ## #names# ## ## ## #list# ## ## ## #add_test# ## ## ## #count_test_cases# ## ## ## #run# ## ## ## #filter_test# ## ## ## #test_at# ## ## ## #test_count# ## ## ## #tests# ## ## ## #to_string# ## ## ## #add_warning# ## ## ## #Test::Unit::Exception# ## ## #_hide_backtrace# ## ## ## #throw_new# ## ## ## #stacktrace# ## ## ## #get_message# ## ## ## #hide_backtrace# ## ## ## #stringify# ## ## ## #to_string# ## ## ## #failed_test# ## ## ## #thrown_exception# ## ## ## #Test::Unit::Test# ## ## #count_test_cases# ## ## ## #run# ## ## ## #name# ## ## ## #to_string# ## ## ## #filter_method# ## ## ## #filter# ## ## ## #_find_sym# ## ## ## #MODIFY_CODE_ATTRIBUTES# ## ## ## #Test::Unit::Listener# ## ## #new# ## ## ## #start_suite# ## ## ## #start_test# ## ## ## #add_error# ## ## ## #add_failure# ## ## ## #end_test# ## ## ## #Test::Unit::Decorator# ## ## #_fTest# ## ## ## #new# ## ## ## #basic_run# ## ## ## #count_test_cases# ## ## ## #run# ## ## ## #to_string# ## ## ## #get_test# ## ## ## #Test::Unit::Assertion::Regexp# ## ## #new# ## ## ## #do_assertion# ## ## ## #to_string# ## ## ## #Test::Unit::TestRunner# ## ## #_Print_stream# ## ## ## #new# ## ## ## #print_stream# ## ## ## #_print# ## ## ## #add_error# ## ## ## #add_failure# ## ## ## #add_pass# ## ## ## #do_run# ## ## ## #end_test# ## ## ## #main# ## ## ## #print_result# ## ## ## #print_errors# ## ## ## #print_failures# ## ## ## #print_header# ## ## ## #run# ## ## ## #run_and_wait# ## ## ## #start# ## ## ## #start_test# ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## #Error# ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## #Test::Unit::Warning# ## ## #_message# ## ## ## #run_test# ## ## ## #new# ## ## ## #Test::Unit::UnitHarness::TestCase# ## ## #run_test# ## ## ## #(c) 2005 PerlUnit project <http://perlunit.sf.net/> Class diagram generated by autodia <http://droogs.org/autodia> and some tweaking, for "v0.24 plus bugfixes and filtering", the CVS "HEAD" version 2005-07-01# #See doc/class-diagram.txt for caveats!# Test-Unit-0.25/doc/TODO0000644000175000017500000002055710324276751014677 0ustar mca1001mca100100000000000000PerlUnit TODO ============= Here's our roadmap. It should give you an idea of what is planned, and in some cases when it's planned for and/or who's going to do it. Only update this file on the main branch! See also doc/consensus.txt. * Before release 1.0 None of these are big jobs, but Adam thinks they should all be done before 1.0 if we want the framework to gain respect and widespread usage; after all, many people will check out PerlUnit for the first time when they hear 1.0 being announced, and first impressions count for a lot. ** Rename Test::Unit::HarnessUnit and Test::Unit::UnitHarness Not sure what to yet, but we want to get these big API changes out of the way before we bump the version number. *** HarnessUnit "A Test::Unit::Runner which outputs Test::Harness-style output" Used for most of our self-tests. *** UnitHarness "A makeover of Test::Harness to allow its tests to be retrofitted as unit tests". Seems to need some work, but is neat for running t/*.t What uses it? I can't see anything here, but we may have real live (and quiet) users. It's referenced from T:U:Loader, but only used for certain inputs. ** Get working build on 5.7.2 and 5.8.0 Now seems happy on Debian 5.8.4-2, and I'll cheerfully let the cpan-testers find out about the others. ** Rename do_run to run_suite in the runners. Is this to match T:U:Procedural and T:U:TkTestRunner ? ** Tidy up copyrights, credits, and licensing We had copyrights, licenses, and out of date author attributions in pretty much every file in the distribution. Tidied up 2005-07 mca. > It would be good to move all the copyrights and credits into one or > two files (COPYING or LICENSE or AUTHORS, say), There are still some single-author files: T:U:Assertion* T:U:Decorator T:U:Setup T:U:Tutorial > and then to change the licensing/credit bits and pieces in all the > other files into something which refers to that one file, and also > states that none of the files should be distributed separately, only > as an entire package, thereby preventing the copyright-containing > file from being disassociated from the others. Well I've done a chunk of that. It's not clear that the project licences need or seek to prevent dissociation of files from the project. * Document stuff better ** TestRunner::do_run should be public Requested by Matthias Ferber, so that suites can be dynamically generated by providing parameters. ** Filtering mechanism is poorly documented. ** Test::Unit::Tutorial is AWOL ** examples are old and sparse Useful stuff has been on the lists... ** class diagram We have one at doc/class-diagram.* Dunno if it's much good. Notes include specific TODOs at the bottom. * Nice to have before 1.0 Some of these could be left until after 1.0. Adam thinks it makes sense to do them before the release, however; none of them are big jobs. ** @TESTS isn't tested. ** Pinch more assertions from Test::More I don't think there's even any particular reason against importing them directly from Test::More. No point in duplicating code across CPAN modules without good reason. I like these ones: *** use_ok(), require_ok(), eq_set() import straight in *** is_deeply() either import or write using FreezeThaw::cmpStr or Data::Compare or whatever *** eq_array(), eq_hash() Hmm. Test::Unit::Assertion::Array / Test::Unit::Assertion::Hash? *** Easier assertion-set extensibility mca: I extend test cases by having a standard (for me) superclass, into which I pile assorted stuff. It would be nice to provide such functionality easily and without kinking everyone's inheritance tree. Also, may need to avoid bloating the standard assertions set. The overhead for the compiler is small, but the learning curve ends up looking much steeper than it needs to be. Options... - provide "simple" and "hedgehog (bristling)" versions of TestCase - use import options to determine assertion set - leave them all in, but split the documentation - spread them into Piers' T:U:A:* structure... need to investigate ** Rethink how the tests are split up between the t/*.t. Currently we have t/all_tests.t, which is clearly a misnomer, and we have some tests for the assertion code being run from that rather than from t/assert.t. ** Test::Unit::Loader working with whole directories. Test::Unit::Loader::load_test_dir() needs to be finished. * After 1.0 No harm done if they end up being done before 1.0 though, of course. ** Test filtering Piers suggested the beautiful idea of using Attribute::Handlers so you could do things like: sub test_something : todo {...} sub test_something : skip_if() {...} sub test_something : skip {...} Adam needs this for work ASAP, and will probably implement it very soon. There is already a primitive filtering mechanism in place which is controlled by the filter() and filter_method() methods. Update: Adam met up with Piers a few months ago and together they figured out that Attribute::Handlers may be unusable due to its magic happening in the BEGIN phase, whereas all user test code gets compiled at run-time via Test::Unit::Loader. Hmm. ** Tests to add *** PerlUnit selftests **** die errors that look like variable names [mca] A test that fails with an error like die '$lotsofdollars'; and make sure it gets wrapped into an ExceptionError **** doing the right OOP thing in constructors and isa() checks Possibly a test that overrides the 'isa' method so Piers' fix to my patch (back to using $exception->isa(C) instead of UNIVERSAL::isa($exception,C)) can be exercised. Also Adam has patched some of the PerlUnit constructors to allow passing a classname instead of being invoked as a method. **** check for broken Error.pm overloading of exceptions [as] Older Error.pms don't do boolean overload, so eval { ... }; if ($@) { ... } could break. We should check for that. *** Generic tests for users to include Matthew wrote some. Whether anyone else wants them remains to be seen. The potentially useful ones: **** test_SubsAllNeedTests Checks all subs in a module are tested. Take the code and put it somewhere else. **** test_PodChecker Look the sourcecode up in %INC and run it through the Pod::Checker (which spits out stuff to STDOUT regardless). **** test_HaveWarnings Check $^W .. a bit cheeky. I was actually after a check for strictness, after forgetting to use it in some module I broke off, but this is either tricky or impossible. [Impossible I believe. That's kind of the point of lexical scope after all -- pdc] *** Test coverage tests There was a big thread on this but it's someone else's turn to write about that. 8-) -- mca Current thinking is to keep test-coverage tests away from the executed tests, mainly so you can have a script which draws a pretty chart of how well your code is tested. Adam has some code for this. * Personal TODO lists Moved here from doc/consensus.txt. ** Matthew tktestrunner: ctrl-q, file menu shortcut assert_deep_equals patches: check Test::More for updates can we do that direct use linkage? do I need to backport the patches we have? move the scripts somewhere so they get installed in a bin/ put version numbers in all modules (my or our or oldestyle?) as below, - if derived from CVS, with a note somewhere about bumping CVS versions if files take non-linear routes somewhere - cd src/Test-Unit; grep -rL VERSION lib/ | grep -v CVS/ *** integrate Debianisations and credit the relevant folks /usr/share/doc/libtest-unit-perl/changelog.Debian.gz note, dropped from Debian unstable: http://bugs.debian.org/279805 http://bugs.debian.org/317416 *** update top-level README *** Periodic checks (should go in doc/release-checklist, or better yet in an installation test) Search for Test::* and check they still exist Search for 'package' ... UnitHarness contains >1 http://www.cpan.org/modules/04pause.html says: Please make sure all your *.pm files contain a $VERSION variable that conforms to the CPAN rules, i.e. the complete computation of $VERSION must take place on the one first line within the module that assigns to it. You can test if this is the case by running perl -MExtUtils::MakeMaker -le 'print MM->parse_version(shift)' 'file' *** Find a neat way to run unit-tested programs without the suite It's convenient for medium sized projects to stick the test subs in the classes they test, but then you have a run-time dependence on perlunit. **** Local Variables: **** mode: outline **** End: Test-Unit-0.25/doc/class-diagram.txt0000644000175000017500000001234010273776634017456 0ustar mca1001mca100100000000000000-*- outline -*- (this mark tells Emacs to use '*' heading levels) * Comments on the class diagrams Diagram is in early stages so - there are probably better ways to carve it up - there are bugs in it, take it as an overview Please let me know if it's helpful -- mca1001 I've coloured parts of the full diagram, to try to show where to start. And starting may be all you need. ** Classes to interact with directly (yellow) These classes have fairly thorough POD and are intended as the main interfaces for "the user". Test::Unit::Procedural is all you need for simple work, but reduces flexibility. You don't need it at all for the explicit object oriented approach. Test::Unit::TestCase is what you inherit you tests from, if you take the explicit OO approach. Test::Unit::TestSuite can be used to put your TestCases together in groups or trees, and make it easier to manage more complex OO test systems. ** Test runners (green) One of these will be used to manage the running of your test suite. They all do basically the same thing, but their outputs are different: interactive GUI, terminal and Test::Harness linkage. Generally, an instance will be made for you by whatever script you use to kick off the test run, e.g. TestRunner.pl or TkTestRunner.pl ** Things you'll probably see (red) If something die()s during your test - any sort of error - this is caught and wrapped as a Test::Unit::Error object. When a test assertion fails, an instance of Test::Unit::Failure is created and "thrown". These objects then percolate into the depths of the mechanism, to be collected and reported later. I'm being vague, to spare you the details. Test::Unit::Assert isn't for use explicitly in your code, but the manpage contains a handy breakdown of the various assert methods you can use. * Construction of class diagram ** Generate the bulk of the diagram I fired up "autodia" aka. "autodial" with cd $PROJDIR autodia.pl -d lib/ -rC dia-gnome autodia.out.xml & Then I started moving boxes around. Don't worry, they are joined together! It helps to set the "autoroute" property on the connectors... use the "group properties..." dialog? I didn't get as far as hacking the template to fix this. ...shuffle boxes until they're close to the relevant thing and you have a big tangle of class usage. Time to simplify. Probably easier if you crib my layout. [later] It doesn't list inheritance outside the codebase...? Or just not for "use base". And not for Test::Unit::TestSuite, Test::Unit::Warning... argh. ** Remove stuff that isn't helping There are dependencies in there which don't need to be graphed. List of class/what uses it, plus rough notes: base used by many classes Config Test::Unit::UnitHarness Error base class for Test::Unit::Exception, so left on the diagram also used by Test::Unit::Procedural Test::Unit::Assertion::Exception Test::Unit::Assert Test::Unit::Result Test::Unit::TestCase File::Basename Test::Unit::TkTestRunner Tk, Tk::BrowseEntry Test::Unit::TkTestRunner Tk::ROText Tk::ArrayBar (?) should be TkTestRunner Tk::DialogBox Tk::ArrayBar (?) Tk::Derived Tk::ArrayBar Tk::Canvas Tk::ArrayBar Devel::Symdump > what's this all about, then? Test::Unit::Procedural Test::Unit::TestCase Filehandle Test::Unit::Loader Test::Unit::UnitHarness Benchmark > candidate for moving to Test::Unit::Runner Test::Unit::TestRunner Test::Unit::TkTestRunner Exporter > (list incomplete) > may be useful to know... Test::Unit::Debug Test::Unit::Procedural Test::Unit::UnitHarness Class::Inner > was split off this project at some point? Test::Unit::Procedural Test::Unit::UnitHarness Test::Unit::TestCase Tk:ArrayBar -> is part of Test::Unit::TkTestRunner, interesting in its own right, but not relevant here Test::Unit::Debug used by many things, but basically dull Test::Unit::Assertion::CodeRef Test::Unit::Assert Test::Unit::Assertion::Exception Test::Unit::TestSuite Test::Unit::Result Test::Unit::Test Test::Unit::TestCase Test::Unit::UnitHarness Test::Unit::Loader Test::Unit::Loader > used by many things; headed towards "scary" > looks like it should be used by the Runner instead? Test::Unit::Listener Test::Unit::TestSuite Test::Unit::HarnessUnit Test::Unit::TkTestRunner Test::Unit::TestRunner uses Test::Unit::UnitHarness Test::Unit::TestSuite Test::Unit::Warning mundane helper class Test::Unit::TestSuite Test::Unit::Loader Test::Unit::Tutorial contains no code Test::Unit contains only constants Test::Unit::TestRunner Test::Unit::TkTestRunner ** TO DO Filter method & members: some detail is obsolete, should be hidden, takes up too much space. Ensure all classes are shown. Mark presence of/need for docs, level of detail, position on learning parabola. Um, I'm just about to add more stuff. Doh. Check uses & inheritance lines are correct and significant. How tedious. It would be nice to cover all the classes with at least some explanation of what they are and how they fit in, but there's no point duplicating POD material. Maybe break out the relevant parts into another diagram that shows the examples too? A similar diagram (sequence diagram?) for how the tests are loaded, built into suites, run and reported. Test-Unit-0.25/doc/class-diagram.png0000644000175000017500000053354210273776772017442 0ustar mca1001mca100100000000000000‰PNG  IHDRÀË|£B5sBITÛáOà pHYs   jŒw IDATxœì½w\Çÿø?”£I‘ ¨Xb,(((%‚-–˜X¢&vQ£QÔĨ *–¨€A”¢D1(¨€¬PšÒ{Gãnìç·ß}ïíÍÝÑ…yþÁcï53¯×kÊ›‘Â0 â‹b̘1ïß¿ï[ªªªŸ?î[]Áëׯ-,,zÚ‹~GzzúèÑ£{Ú ¢«íiÑ-Z´xñâ®¶òèÑ£®¶Ò œ={VWW·§½èîÞ½»§½@ º@#ĉ©©i7Ð }#€ž3gÎСC{Ú‹~AZZ  }éžv@ _< =í@t(€F Dû)..Þ²e‹¦¦fUUUOû‚@ ÝZÂ@ ˆöP\\|ôèQyyù–––žv@ º4@ ÉÀg‡~çÎÓ§Oÿûï¿=í@t+(€F ˆ>‚ÔÿÒ&(¡óÇ7mÚ$//ß¶º)Ä/%~H~1³ sXoÅDROˆ~ZÂ@ }Š.ÚÝŸX°¡££súôé5kÖ|¹q3ÞVx°Ø#§"´ÏhW»Šˆ@ D‚hè³à¡¡¯¯ïŽ;8qýäÉ“5kÖdddŒ=: `„ äœÍÍÍd%|>Ë–-"Cç;wª¨¨tKµ$£¦¦FüÌ™™™kÖ¬yýúõàÁƒýüüf̘qùò僖––4¨  €ŸOü(_›››§¥¥ÅÇÇÛÚÚš››ÿ÷ßäT²’K—.íØ±cÁ‚!!!Ç?pàÀ’%KdddÈyÞ¼y3qâD{{ûtQ};B}}ý“'Orrr„íMO'MšôêÕ«W¯^YXX >üãÇJJJÍÍÍIII–––‚ù)áá/~‘““3lذ#FdeeA¢dˆ Ã&OžüòåËÑ£GgddLž<999ïÜÇÛÚÚÒÖW’ššjnnnhhXXX(Ìœ°qB®‚`{¦¥¥™››£“} @ _fffþù'E(øT'KÈײ²²€¶¶6ƒÁ -‹sñâEUUU Ã233W¬X!##3jÔ¨k×®µµµy^¿~ øôéSçÕ¯3yõê ''GXÁ–Á‘’’Â0lþüùøÇùóç æþ?ÇÃYVV–\PðBLµ‚yþúë/ÂáS§NUhmmV#üšì˜0O ãâmjj* ==^⋽Dˆ@ ý|jðÙ³gĵHFŽôálj'þôÓOfffׯ_çñx]ëh·óÕW_ """11âyð•*øGÚ×ï,,,‰‰‰xÙI“&‰4-ŽZAðs"MMM‰kÀóçÏ…Õçýû÷€#FÐZÇiÇ8A ú =Á#Bb 3ÐäÇ;ù9O¾~õê•™™™ŒŒÌ˜1c^¿~‰1M†2ýâÅ ÐWf ÓÒÒ¦OŸ®   ++;lØ0 à eddôõõ½½½ñ<ááᆆ†RRRxËÐ6rVV–½½½‚‚‚‚‚‚ƒƒÃÇ1Q3Ð⨥tñãÇñ ???üâÑ£GÏŸ?Ç;wðàÁ´5Âs2DSSóþýû‚Ö sq !Ð 4¢? "€öóósww‡ç9xð`pppç¹ôåþézI;gddLœ8Qa§ÐKjMKkk«‹‹‹ŽŽŽ´´´ššZwšîºÿR   »Ú‡£utt¾èº¿ÑÕÓg(€Fô`K8Î;———÷çŸBò8––výúux¶ÈÈÈC‡7NQQQMMÍÞÞþÎ;ä ïß¿Ÿ9s¦ŠŠŠŠŠÊ¬Y³ÒÓÓÅOÜ˲‡%‘AVVVWWwáÂ…oÞ¼;/>p»íSÒSûqvŠÝîtžÖV§;ð÷ßoܸQao£ÓÇ•»»»ŽŽÎÇy<^}}}µQ€»÷E4xŸ‡XÔáèèHy­@ ú8Â"뤤¤o¾ù†Ç㉆óx<''§ŒŒ H333//¯””6›ÝÒÒ’œœliiéïï§VTT^¾|¹¡¡¡¡¡! €ÉdVUU‰“ŠI8KGdær¹çÏŸ×ÒÒŠ‹‹_ƒ0…pOÄw’’S¢Úu"b·ƒJž?.¾*Ú ÛzÍÍÍFFFl6[¤°³èDÿ;}\777wP‰0 îQ<))©‹|èÍô†h2555uuuÝàO;@3ÐÝ šFô„Î@ïÛ·ïܹsÒÒb½e(--}òäÉ}ûöAò¤¥¥íܹó믿0`€œœÜäÉ“CCC:„§z{{¯^½zõêÕøóªU«V¯^íëë+Nj»‘••2dÈ–-[¼½½÷îÝÛAmÖ;öìY7ž>}êèèøóÏ?÷ ‚ܸqcöìÙ”½ºh…½NïКš…ÎÕ)”ÿé§ŸŸ>}Úýž 444ØÓ^ D7AJ~~¾ªªê¨Q£(òOŸ>íÝ»÷áÇgÅŠßÿýŒ3𤯾ú ðââb1mkiiã×±±±çÎ#§Î›7oëÖ­øxjÇ™;wîªU«ˆûöí»ÿ~CCÈ#öïß¿dÉ|øÐÕ&ºšÆÆF€††FOûÒ/(//PŽãA ú´óÒׯ_§srr˜Lfpp0›Í®««‹ˆˆ°±±!g¸víšø³ß7nÜ055ů555kkkÉ©uuuÚÚÚâ¤â_®òòòÒÒÒ3f̈…جuMM††~]TTdjj\WWÇáp>|Èd2oß¾M”={vbb"—Ë¥U(¬IÉI€qãÆùúúæççs¹ÜüüüE‹?^˜ˆNrKKËðððêêj‡sÿþ}ƒ'Ožs?¤êÚµkøª˜   }}}Ê"²]x³@Ɔ8ÎÄÅÅÙÛÛ/^¼øÅ‹´u”¨Ý„ ámQ•––fee•wÅèêÒqµtéRŸÚÚÚÖÖÖœœ??¿ &ˆ©î¼) Êi{çÅ‹‹/¶··ïÈŠ¬/33³nùŠq–pôf®^½Úmm… ¸{÷nO÷<Ñ…ÐO³íÙ³gÆ ”C›~úé'KKËÍ›7 »[rss8,έU^^>{öì;w._¾À`08ù5§¨¨ˆOÂÁSÉÔÕÕÅÇÇïØ±ãìÙ³”ÉKÁieÊ”÷ïßã[P#}Ú°zݺu‚ïéêê–••A‚ñæææqãÆ‰¶WTTXYY‘'¹eee)/,r¹\999qR‰?~¼°T¢ÖÍÍÍ>|Ø»wïˆ#JKKqá Aƒ(³Ýl6[YY™R–V¡° ”$Á<<h3@tBòTWWkjj KÕÑÑ)//'KÊÊÊtuu…é„7 dlˆã<†acÇŽ-))ç‘´Ý„ ám%ŒÆÆFÁwæ…på]1ººt\YXX¸¹¹…††¦¦¦r8ˆopÏý7…0å´½@KII‰¹¹¹Èlˆþz‰°›A/"úBßÜCª¦¦F[[»ã!{nnîÌ™3oܸ¯¤ÄQSSש°Ùl555qR±²²¢ìsG߯nàÀ‹-’’’zñâ…¾¾>žTYY©¡¡AÞOYY™Íf‹Y;yyyòQO<òº•´´4ÖÙ/x©©©544K­©©ÑÒÒ"K´´´jjj„å‡7KÇÇÆáÇ׭[÷Ç”””ˆ_ª³Ú ÞV8aaaóæÍ£t"­¢¼ƒ£KR:Þ>·nÝúô铳³³¹¹¹ššÚ¼yóˆùìúÓ¾¦§ÁKJJöìÙ³víÚ#GŽ´ÛU@ ÐКššøKd444ªªª ºJKKñÓD!ÄÇÇÛÛÛïÛ·oðàÁdùˆ#rssÉ’ÜÜ\üੂܺu‹²©‚ø899…‡‡·¯,`öìÙ‚ò+W®´ûë\QQ±©©IÒRXÇÎÎ.22’,¹uë–½½½°üðfŒ ‰œwrrzüøñêÕ«]\\lmm£¢¢$Šim‰ã¼­ïÞ½“——=z´H!\yG“ɤÌÐwd¬ø]#%%elllbb²~ýú¬¬¬v[$#²)ÝÖà|>ÿöíÛ¶¶¶;wî\³fÍãÇûðÒgDWÀf³ccc=<<òóóqɉ'ÔÕÕçСCÁÁÁø··÷‰'(?•°Ùì»wﺹ¹x<ž»»;>|ìØ±ÔÔT6›Íf³_¾|ùþýûêêjOOOOOO|+ª°°0777üaÅ…YG =íÂŽ¼¼¼… R„>|ÐÓÓ»~ý:›Ínhh¸{÷î´iÓÈæÏŸ_\\L«ð„„uuua+eËÊÊÌb±®^½jhhXYY)Nê˜1cΞ=›‘‘Áápêêê.]º4tèÐüü|až«5N~~¾‘‘ÑéÓ§ËÊʸ\nqqqHH|O ²°²²räÈ‘žžžyyy---­­­žžž#GŽ$©„’ÁÆÆæìÙ³mmm·«W¯¾víZSSSyy¹§§§©©iMM0‹xogÓèêêBvá€7 dlˆã<- &&&´þÐ im ámEkËÙÙYp_Z!\yG—··÷?üPRRÂåróòò¼½½Ç„¯Æ$W”<'Nô÷÷ÏËËkmm-//ß»wïÊ•+…e†¤áMAëmƒcfbbâàà˜˜(˜„@`ÿ»:555%%…2ìcccƒ‚‚***<== áï¿ÿŽa˜¿¿rrrNNÎÑ£Gcbb¼¼¼¢¢¢ÈÙðâaaaŸ?Þ¹s'.ikkËÈÈ8qâDBBB`` ‘ÍÅÅåÂ… øGWWWb5ÿ‚ È+ûi‹ ³Þ Ak ýúh##£ÏŸ?gff’…¦¦¦111ׯ_700ÐÓÓ»xñâ?þH¤~øðAFF†²0ƒÌºuëêêêôõõ¥þ:tÈØØ˜ÏçïØ±ÃÅÅeÒ¤I“'OÆßÒf³ÙµµµkÖ¬¹råJiiéŒ3,,,p[¸6aÅ™L&­õ^HZZš¹¹yzzºÈnÄ— ìËþܹseeeâ¼É¾gÏsssò„4¢›éܸËåž9sæÑ£Gÿþûogéì=HÚV!!!Ç)l‡r„˜kpB$"h8MMMòòòøŽæ|>ÿóçÏøòh ,KEE¿nllTTT”––`V__O[¤±±‘8‘ž"§-±Þ«@4¢? âËÞÏϯ¢¢~b¶»»ûСCW¬XÑÙ¾!$ ã6|{„I“&]»vÍØØ¸Stö*º4ÆE4ÑÛ   ½¼¼ˆë•+WJºÆ¬ƒÅû6(€FôЗ=@ ú2œFH  ý¡© @ Ad{Ú@ º?êééÁ)@t.zzzhчA4@ ú2ZZZåå倶ŠèDJKK;F>âè{ @ }|ÛŠŸþ­îÒÒÒŽ;¦¦¦ÖÓŽ ]Z@ @H@ûhqXéz‰ñtYëÍn®N/i½ÌÌL q„½ÄóÞ2ÝLè>ŸßÒÒ‚_ÇÅÅág&'''''w7oÞ¬¨¨À0Ì××·{,"ˆ®@?xð`Þ¼yZZZ ÃÒÒòâÅ‹ÝæY;èOÿž¥ÿ´p§×´74­îØßÿ½qãFq„Ðy-Ó'GlWPZZzçÎ@uuµ§§§§§gqq1›ÍŽõððÈÏÏdz………¹¹¹=yò¤­­íÔ©SGŽ©««‹ŽŽÆSq ÙÙÙäâÞÞÞ'Nœ`³Ù”"yyy•••ºººRRR¦¦¦÷îÝëŽ:#ˆ.@hýóÏ?oÛ¶mÆ UUUûöí»xñ¢¾¾~w:‡@ à$%%õ´ ÿ‡Ã‰ŒŒ\¶l™H!ô¡–é¶éÛ’””äïï©¥¥emm½k×.€±±ñÆÃÂÂ𜡡¡{öì±±± ³´´Ü¸qãÉ“'ÓÓÓ³³³ããã_¼xAV[XX(##C¿ÿ>‡Ã5j”··7¥È;wf̘—š>}zLLL·Ö@tô/ÆÇÇÇÆÆþ÷ßÚÚÚ¸äÛo¿5kV/ŸCB‡Â z->8Ÿ>}êîŸŸÝ¹š;Â7fÏžM9˜Vˆ½»e$±?ýô“‘‘Ѭ­­»Î¥Žceeehh˜œœ¼`ÁJ’žžž’’—ËÅ?Ž9RAAPVV6}útMMM6›=~üø“'O<OV¼¢¢BUUU]]ý‡~x÷î¹ÇÃÇáóù]WYÑ¥ÐÏ@_¹rå÷ß'¢gYYYaŠ®^½:|øpyyy99¹aÆíÞ½»¹¹Oâp8®®®£F’——×××ß´iSHHˆÈ$Zjjj¶mÛf`` ¤¤´{÷ r*å7GˆK€ÚÚÚ_ýÕÐÐPIIiÇŽyyy ƒÐS\\¼råJUUU999‘Ú¤¤¤îß¿ïè訢¢¢¬¬üí·ßFEE988(+++++/Z´¨¶¶R/ˆ3€‚‚‚+VhkkËËË3†˜#ÁMçççoÝºÕØØXNNÎØØøôéÓdÍð²’Vÿ‹#Ž ‘]&ÈÛ·o¿ÿþ{MMM ‹ØØX\þþýû¡C‡’¿Ôù|>“ÉLMM¦Jd](Ba5MIIqrrÂûtæÌ™ïÞ½¿¦ N8 üñÇæÍ›333ÉIÁ@[)aÂwïÞ-[¶L[[[AAaâĉÿþû¯°¶¢ Îú HCÑŽIx³ÃS!w–¤ˆ!Z·á75mË|¹#633sóæÍüñ‡ƒƒCBB¤{==='''üÚÈÈèÔ©S¯^½‚ä_¸p¡‡‡Çü1kÖ¬áÇëéé}óÍ7D/Ó2wîÜgÏž½ÿžÅbQŠ899%&&âÙ^½zekkÛ9µB ÝFÇСC³²²h“(emmmƒƒƒËÊÊÚÚÚ ;¶jÕ*>>µµµ­­­999~~~&L™$HMMͨQ£Ž9‚[)--Åcµv¸TWWgffvøðáÒÒR.—›››{ñâE¢8`öìÙ‰‰‰\.Wm€qãÆEDD°X¬úúú;v(++ýõ×ÿüó‹Åª««Û¶mÛO?ý$¬^pgŠŠŠLMMƒƒƒëêê8ÎÇ™Læí۷ɦ}}}óóó¹\n~~þ¢E‹ÎŸ?/fY‰ª)ØÂ"Mˆì2 €É“'_»v­²²’ÃáÄÅÅ1™ÌgÏžá©ÖÖÖ?&2ÇÆÆNœ8Q˜*x]h}€Œ% Ã>|ø ¯¯íÚµ††††††   }}ýŒŒ 1k*þà„goo¿xñâ/^Ðú âÔšXZZ†‡‡WWWs8œû÷ï^?~üxàÀY³f=Z[[ÿ¹ O²°°pss MMM¥¨…$ Âd2 nˆï“É DÈßâ‚Ö!Ú(ùy<žH ¥^g D™É`³ÙÊÊÊÂ\åñxRRRí+ ¯&m¸ ‘]&2©ººšøßƒÃá±X, Ã>þ¬©©Y__/L¼.íGttt(_“eeeºººøu'NZÆŽ[RRÉ@ë3y0Ðf Â{AÆÆÆ”TPo(I›]d§@î,‰>pC‚nÃMcBš«/X ÃJJJÌÍÍáyº‡® PèÐ?%ZÂ2uêÔ{÷§WVVâmâ©………+V¬ÀOõ”——ÿöÛosssE& B™ÖtC|— D•à\›8!äË,ý‹žµí. ¯&m¸ ‘]&2‰Ëå2 âãîÝ»/_¾ŒaØÅ‹W®\)LȺ´#‘‘‘¡Ô…ËåÊÊÊâ×88i¹{÷î¬Y³öìÙS\\,,O;*E+Ù ´\¾|ù×_)„7”¤ÍO…ßY=|à†݆›ÆèZ¦/Øâââßÿ}æÌ™wïÞ–§;At7ƒhD€þ ¸råÊÓ§O‹(Izz4HðV¡<^ù|~nnnvvö™3gÆŽ+fMMÍêêjˆñ]RWW\ ù®‚kë` wFGG§¡¡AXYø×ª¤eEö#íve6å IDAT,Ä„È.™TTTÄd2‰Ÿ>}š>}:†aS§N¦U)))±N[SÈ|^'N111¶¶¶Ë—/óæ`j×Ðä^ ÅÒÒR°R‚BxCIÚìðTø…#æÃGÒh‘¦[¦oŒØ7oÞ,_¾ÜÖÖ¶—,ÞÀAt7ƒhD€~ŽÍ›7?~œrl ŸÏß¼y3m~‡Ãd2Éâ¨')))ccc“õë×gee‰™DÆÚښؓÃ0a™á.YYY=zôHXYIµu¸3NNNáááíÓ,iY‘ÕTTTljjß„D]FKHHÈÂ… ‰Ã† STT¼ÿ~eeå´iÓ áua2™%%%äT|™ `Míìì"##É’[·nÙÛÛã×88!899=~üxõêÕ...¶¶¶QQQmƒ%X)aB ä^äÝ»wòòò£G)”tHÀ›ž*Îm.æÃnH¸iÚ–ù¢G,ŸÏ¿}û¶­­íÎ;׬Yóøñcb§ 蛋¬:dbbÉb±ccc§M›&##Cd —õöövvv.))ár¹EEE¾¾¾øwž:qâDÿ¼¼¼ÖÖÖòòò½{÷?¾C’yùò%“ÉŒ‰‰áp8555áááVVV@È” Ü¥gÏž?|øÃáÔ××GGG;88áÓ`pm‚ùÅ‘ÀÉÏÏ722:}útYY—Ë-.. ±±±¨mwYx51 ³±±9{ö,ù—_¸ ‘]&èùÖ­[£¢¢š››+**NŸ>mjjJ™'‹ˆˆÐÖÖ>räˆ0%âÔÅÛÛû‡~ÀSóòò¼½½Ç¯é‡ôôô‚‚‚ð= tuu‰= :qpŠ ¾™‰‰ ­ Z¡`¥h…€Õ«W_»v­©©©¼¼ÜÓÓÓÔÔ´¦¦F˜Z ܯ_¿N1M+„7”`àÍO…ßYð‡Å¸!A·á¦i[拱&&&‰‰‰X¯„<Íãñh—¼ÇÆÆ’÷#¢%)))))I¢"pnܸïÈáããÓ=½ 4èÀ¾³£££g̘¡®®.##cll|îܹÊÊÊÿWò¿3|}}™L¦ŒŒŒÁúõë?}úDdXºt©¦¦¦¬¬ì°aÃöïßO<¿ I´ÄÇÇO™2E^^~àÀß}÷ÝÛ·o…=ñá.agii)//?`À;;»¸¸8ø ïm  áÎ`V\\ìììÌd2 †ššš‡‡D-Y(iYx£¥¤¤˜™™ÉÈÈèèèˆcÕe FII‰‹‹‹¢¢¢ŽŽÎúõëÉC§ªªJVVVäu"ëò×_ËÊÊnÙ²¥°°PdMß¼y3cÆŒ 0ÀÑÑ1%%…l®§ø<þ\˜ A!m¥…€W¯^mÚ´IAAA__óæÍðßúY,ÖСC[ZZÈh…8†¢­¼Ùá©; þðôbˆÖma¦!-óåŽXò8ì…袢¢7n`ÖÖÖæíí}òäɪªªªª*¢¢""éàÁƒeee†yzzþ÷ß±±±±±±/^¼HKK£ uuuÅÿ…VðóçÏ?~:77×ÛÛ÷0>>>::ºG§+@4¢?Оïì>I~~>¾¸¶7Ыœémx{{Û!ºICy??¿Ý»w‹#ìqzðÎ"L÷ΖéÛôóçÏÝÜÜV­Z‘““³k×.bƒgWWWò¦(mmm'NœHHH Ä…±±±....\,²`Á‘Åcbb¼¼¼¢¢¢<==1 û믿²³³‰"[·níªúw;(€Fôè×@÷,--CCCkjj¸\njjêÚµkwïÞœéýøûû¯]»¶§½@ü?üüü6lØ Ž°ûéÁ;K˜é^Ò2ý++«µk×Ι3gÁ‚C‡]¶lÙ¾}ûž>}JÉVVV¶{÷$‡S\\vËôJKKïܹàñxçÎswwŠŠx{{Ÿ8q‚Ífª««======‹‹‹Ée£££Ïœ9J.Âãñ|||N:U]]k&>â×îîîååå‹yyy•••ººº)))SSÓ{÷îuwÓ I@3ÐBé…_«Ýì’»»»ŽŽÎÇy<^}}}ÇjiiÑ^CxÿþýÌ™3UTTTTTfÍš•žžÉyèСqãÆ)**ª©©ÙÛÛãß”´\¾|¹vqW#ا}¾$­r§4Hgµj;n„¤¤$ÿèèèÈÈÈW¯^ =&&¦{Û@H  B¹víÚ¯¿þªªªÚY %*++gÏž½dÉ’ÒÒÒÒÒÒ%K–Ìž=Ÿã¡åÏ?ÿTTT ¨®®®ªª:zôè‘#Gð3Ã(þœžž~ùòeÊ!Û@ø1Ýä"”SÁÉÉÇzC,’õèdoâ‹B``à°aÃäää ÆÐ¡CwíÚÕÔÔ„'òòò~ùå###ƒ?hÈe«««·nÝ:xð`EEÅ]»vá?» 3ÔÜÜ|àÀ‘#GÊÉÉééé9;;_¿~H}ûö­££ã€ àää”’’B$bbbf̘¡¬¬<`À€¹sçܾ}ÛÞÞÏÿÝwßÕÔÔùóóó—/_®¥¥%''gff*Ì%Á/?\8dÈÜÜ\"ω'ˆë‚‚‚Aƒ‰i Þ¶äœIIIG%{E¾†÷BMMͶmÛ ·oßž››+++ ©²8-¢¢+V¨¨¨0 ZË–-£\gffîÛ·’mß¾}™™™†YYY½~ýšœôöíÛ©S§Š_ 6›Mq¦²²rÊ”)ééé˜@kS¤¤¤,]ºTKKK^^~„ ÷îÝ£d ½Â¹`©7oÞ,Z´HCCC^^~âĉ<ÓíwÚ>%—=xðà“'Oˆ îîîÄGȨ–¨‚X7>^DVèGÚÇ#¤î´#¿³nUÁ[Ñð88''‡,¼}ûö£G öïßaÇ«­­%g`³Ùpµä" ‡H"ÄI‹´xéÒ¥òòr Ãø|þñãÇÛ[×^Ajj*Ì"}¡_<¶¶¶ÁÁÁeeemmm………ÇŽ[µjÕÿ•`ܸq¾¾¾ùùù\.7??Ñ¢EçÏŸÇSkjjFuäȼliiiXXänéÒ¥>>>µµµ­­­999~~~&LÀ“>|ø ¯¯íÚµ††††††   }}ýŒŒ ²,«¾¾~ÇŽÊÊÊ_ýõ?ÿüÃb±êêê¶mÛöÓO?á™‹ŠŠLMMƒƒƒëêê8ÎÇ™LæíÛ·aM#àóòåËÃÃÃñëwïÞIIIáq†a·nÝZ°`˜¶àmKdKMMõððæ¼êêêÌÌÌ>\ZZÊårsss/^¼E¶€Èî˜={vbb"—Ëß—ËÅ“à£Z¢ bÝøxYe‘EÖväwó­Š€C@·µµÝ¼y322²µµRö <Àm7bZì Ñ÷1ÝÜܬªªúeÀ¿b òòòŒŒŒðk777ªáßòòòÍÍÍ´I‹/öóó#K.\¸@LÃPܨ¨¨••%KÊËË555ñëµkדUݽ{×ÚÚZ˜W´>_¸pá÷ßǯW­Zµ|ùrgggüãÞ½{>Ü>[”¶Å/²³³áÍ(²\]]EÖ%¿Èîhß·‚««ë–-[ˆÛ·o'f=)ŠaX[[›°émAÊÊÊÆGôŸÏwqqÉÊÊ"2ˆ ¼ø|>Y:gÎÚâð¸2Èű6wî\q ‰ìw‘ÑäöíÛñØ.00pÏž=„>ª%ª  ]÷x¡M•4€†×väwó­Š€C@#º@#úBÓ?~‹-ºpá†aK—.%äššš äœb.áÈÉÉ7n\qq1!)((üú”tp¹\òü·øÝä’Úí`¿‹s×\¹rÅÜÜœ2ç ÕU°;/âTYd ¯{;h¬³oU@w3(€FôèÓƒ úb~ahjj⓲´©Âàóù¹¹¹ÙÙÙgΜ;v,.”tÊ"ÑÑÑ¡„b"¡õyÁ‚éééEEE†•”” 2$++ ¬Å±%²moß¾]XXøÕW_]¼xâ¼ÔÕÕ)sfŠ@ äï¢h Ã>|ˆwú”)S ¹••Õ»wïÈ9ß¼y3eʸ¶Ç3™Ì›7oRä´19ÌO‘0™LÚ RRR”ÉrA ´ƒ\»EEE„]¸!‘ý.ò®Ág ß½{7vìØÆÆFB.Î$f»ùñÒñ^÷Ðr«"à º›A4¢?@¿‡Ãa2™d‰8gŸâX[[ÇÆÆR¢‘¥¤¤¤ŒMLLÖ¯_Ÿ••… íìì"##ÉÙnݺeoo/¦'dœœœÂÃÃ%*¢¨¨ØÔÔDN›6í·ß~›0a¾Áþ Aƒ,,,víÚeaa!¦-‘m;oÞ|ø §§„oû «« ÙB"ÉÏÏ722:}útYY—Ë-.. ±±±æ†a666gÏž¥üºŠÏdüûï¿„$..pæÌB·%~Û655Í›7ÏËË‹¶‚ð^xöì™±±ñÇ9N}}}tt´ƒƒ¹ˆžžÞµk× Õ4!iwHÄ™3g ¾ƒ ¬¬lðàÁÁÁÁøN«W¯^544¬¬¬æaBB‚ºº:±„Z$pŸ«W¯¾víZSSSyy¹§§§©©)ycDrqooï~øïÖ¼¼mjjJL»Â ‰ìwø]“`jjŠï&ÑÒÒ2räÈøøx< >ª%ª`w>^DVYð£à¯;Üa‘Dv-âÜ¿ò tQQÑ70 ‹uwwwwwÏËËÃ0ìØ±c¸ðææf|ÑóçÏ?~œÅb‘uÆÆÆîÛ·ÏÕÕ5??¿­­ÍÛÛûàÁƒÄÃ'((ÈÓÓó¿ÿþ‹}ñâEZZZUU•ƒƒƒ‡‡þfhh¨««kbb"¤8Åznn®··7ž'>>>::º‹[® hD@ècÚ××—ÉdÊÈȬ_¿þÓ§Ob~Ãa?eÊyyù~÷Ýwoß¾…|,]ºTSSSVVvذaû÷ï'¿„ôæÍ›3fà;::R6†ø ()..vvvf2™ CMMÍÎÎŽ²I…””333BØÖÖfnnNy½oäÈ‘Ä.câØ¿mÛÚÚÖ­[‡/³Æ$ùVÆ0,..ÎÒÒR^^~À€vvvqqqÄFYYY222‚?C´áHÔQ__¯¯¯/¸ñê»wïp‹ÊÊÊNNNïß¿‡xhbb"þ‰"}¼zõjÓ¦M úúú›7o¦, ÿ믿Œeee ·lÙRXXHd€r £¤¤ÄÅÅEQQQGGgýúõäÿà†0h¿ÓV™,9xð 1c–pðàAâ#dTKTA¬/"«,ø‘öƇԽƒ4&ªËóþEôóçÏÝÜÜV­ZTQQáéé‰g#6Yò÷÷ONNÎÉÉ9zôhLLŒ——WTT‘ '666,,ìóçÏ;wîÄ0¬­­-##? !!!00ÈæââBL ¸ººûÕ,X°€¸Vœbý¯¿þÊÎÎ&|غuk§·U§€hD­´ë/äççOŸ>¿¾xñ"|öõ•u¨ä~G|ˆì2tÿJаèØØX‹Eü/DÐÇ/..®««;zôh`` ŸŸß“'O(K¨ñâ†ýú믥¥¥;vì¸|ù2®êÚµkIIID¶_~ù…0A  sâë§N"»AÞ´WhDåÝg±´´ ­©©ár¹©©©k׮ݽ{7ž”0wîÜžuÑE@úÑ;‘´ËÐýÛˆ£¼!Ì;×ÍÍíÔ©Sàì¦d»zõêï¿ÿnooO>¯0{öl??¿ .¤¤¤æÏŸoffvùòe ä„pHqȉßè¸o¢‡ééÑUœ9sféÒ¥JJJÊÊÊ666wîÜ!’† B>üAËzw@úÑ;‘´ËÐý+)íØ…£±±‘X/xÊ7±= q^7ŸÏV„ö„pHqÚ¿{ùqßhÑÂ:ûv@ z¯_¿¶°°ÈÉÉ:thGôxyy×+W®ÔÕÕí°k}“´´4ssóôôtüý`¢OB@@ 2»víêiDo­F @ $Ð@ „ @ ýâ$B 31C EæÉÊÊrqq¡ì¶ƒŽD ú(€F D¡´´ôÎ;çããsêÔ©êêêêêjOOOOOÏââb<[XX˜››Û“'O'NœPWWdggzxxäççóx¼sçι»»GEE‘óŠ‹‹ÝÝÝÛÚÚäååŸ}zæÌÚ"gΜ!žw111ööö*** X¸pa^^Ä––––à5¤šD’”(ù«ªªTTTªªªõà0 ]]]___Ê"yòäúõëccãØØØáÇ“‹oÚ´IØëÒŽŽŽ< \C*E$‰Sq ÃFuêÔ)—¬¬,Z=dnܸqîܹ„„|F“Ö·~BAA]nn.ÀÕÕpðàA"õàÁƒÒÒÒþù§ÈT ù©Â¦OŸîààÐn…Äv'ÞJý–ÖÖÖÏŸ?÷´ýUUUyyùžöB2:ë$B2</22RVVvöìÙ bšÇãMž<¹³ì~ “ýÚ°š6 //ï—_~122b0ø^äRùùùË—/×ÒÒ’““333 …Dî?ÿüó™3g =z$8;~üøÇã× ƒÅbA4PX¶l™àµ°À$œ~øð¡†a666=¢ÕCaûöíwîÜøF!33sß¾}á¾}û233ñkHûŠŠŠV¬X¡¢¢Â`00 knn>pàÀÈ‘#åääôôôœ¯_¿.Ìç·oß:::0`À€NNN)))äœðQ!6›»„a˜••Õëׯ)¦§N*Nª Û"©Lee¥““S§(”ÔO-ýêÿÌÞCpppO÷¼Ä›FthÑ ?ÊÃ0Úɼï¾ûnÆ »víø tmmmO;Ò`0h!4ètè%B‡OTc6hÐ Ê7›ÍVVV¦_AAüö-•••ZZZø‹MMMººº”¼X,ÖÕ«Wƒ‚‚œ•••à“ âü !2Ü9~üøöíÛ‰›6m"ú@—””hhhà ÒÜܬ««[VV†'ÁÛ_Ð 77·ÐÐÐÔÔTÁŽ ç×ÑÑ)//'§–••éêê ÓLp***¬¬¬ÈKGdeey<9—Ë•““'UøøøñãÇ~ þó#¾Âµk×Þ½{—,éˆB@w (€î~P@#ú:HEZZûÿ#‰ÊÊJ òn_ÊÊÊl6[XY}}ý‚‚¸~mmm‡ððpÀÍ›7íìì([¼)++¯\¹rÅŠ¾¾¾;vìØ¹sgGjÔ>.]º„¯ßÀY·nÈs_ÙÙÙä7 ÅaРAvvvÁÁÁ€ððp;;;===>ÞÞÞ~ß¾}ƒ&ËGŒoÇA››K¬†§ Âb±”••!nˆ©ðÏ?ÿüã? z$Uˆ@ z â(oòñÝmmm§N:räH]]%?äÄoÚã¾ôÄot”7Ñg@+**655‰¯ÈÉÉ Ÿ*“Í›7?~?6…€Ï瓃B€]uuuDDDyy9åͼU«Vq¹\²$77—xÁ®Ûðóó»té%l ðó󃔊ˆˆHKKƒ¿âF‹½½=‡Ãñóóc±XøÑV8’¶?Ž”””±±±‰‰Éúõë)»ïØÙÙEFF’%·nݲ··—ÔA@@€››ÛË—/-ZDIúæ›o"""È’ÈÈHâä[xª ·nÝš5kÄq¦¤¤dggÏŸ?¢G"…¢§ åM>¾;,,ÌÒÒrãÆø6íd '~Ó÷  '~££¼ˆ¾ƒ°µ666gÏž%¿E›™æçç>}º¬¬ŒË凄„ØØØÓaØ¡C‡LLL"##Y,Vcccllì´iÓddd(ÙŽ;¦ªª*¸ç|DD„ƒƒCXXX]]‡ÃILLüúë¯ïÝ»±ñ’ÉSUU¥¡¡!¸›‹ÅÂ'nÉÅ[ZZJKK£££¿ÿþûñãÇã¿âµƒ3gÎ0Œ .…ðö¬ÂĉýýýóòòZ[[ËËË÷îÝ»råJ"•œÿÇzzzAAAÄá ºººÂ4 â$$$¨««K·)”•• <888˜Åb544\½zÕÐа²²RœÔ1cÆœ={6##ƒÃáÔÕÕ]ºtièСð÷Já qfÍšuãÆ ˆIbh t'Ö@w?}` tQQqG»ººâïRŸ8q¢¨¨ð_ýU°ø›7o¶oßþäÉr Ã~ÿýwr6âclllll,‹Åòðð`±X?ÿü3qVÔ©S§ÈK±É/…÷%ÐhD@èyJJŠ™™™ŒŒŒŽŽÎÿe*;;;3™Lƒ¡¦¦fggçáá7=cÆ uuuccãsçÎ F•••ÊÊÊ‚r ÃÊÊÊ~øáEEEeeeü'bÐÂþ÷xò䉰ݬϜ9ƒûCä—––ÖÐа±±ñññ¡ì‰!õõõúúú‚‡fAÚ_°šK—.ÕÔÔ”••6lØþýûɯRò¿yófÆŒø>ÐŽŽŽ”} =„´ª°õ D†wïÞá¶”••œœÞ¿O.Iõöö^µj•¡¡!ƒÁÐÓÓ[½zuaa¡07Ä4—˜˜øÕW_ñù|‘zÄT(濯q@t÷Óh.—K¬v 8|øðË—/?}ú´aÆ={öÄÄÄPÊ~þüÙÇÇÇÕÕõÙ³gä"˜xtffæ‚ vî܉ÇÐ>|À³½|ùRüο,Pètæá‚ÑmÄÆÆ:::ÖÖÖkO]œœ\@@ÀòåË{ÚÉ€œDØØØ8`À@kkk[[›’’’`q‹%''Gœ¿H‡¨¨(•aÆ]¼xÑÃÃàïï?wî\//¯Ý»w·¿V½t!¢?@ @ }"–““#Îäòòò"2¬\¹?p@°ˆ8Ì™3'22²¡¡áÀ¸díÚµøE_žˆ~  øìÚµ«³TÉÈȾ-@ ú¶@ Ñ@3ÐDï"##£'Àú0555222K–,a0=íËÀíÛ·eeÑ@ :ôÊÛÀÀàÛo¿]³f¹¹9~òöâÅ‹ƒƒƒñœä£¹ îß¿ÏápFåíí}ýúõ3f899 Z!ŸøM.9œ|Ä7@§|#_(€F D¿ÀÊÊjíÚµsæÌY°`Y^VV¶{÷$‡)^QQ¡ªªª®®þÃ?ÔÔÔhhhÀ-’‹ :tÙ²eûöí{úô)%Ç“‘‘!Kø|¾$5C Ý  Ñ_ÐÓÓœ6nll¬­­-,,är¹´¥nÞ¼YZZ:wîÜgÏž½ÿžÅbÍ;×ÍÍíÔ©S´ùŒŒN:õêÕ+r‘†††/^¨©©IKK“󜜜‰â¯^½²µµí”ú"ˆ.å@ô.ž?>uêÔ¢¢"ÈK„RRR‰872^ ž“œ’_Ìl¥VRs] ¥ñ;Ñ“.ªfDDÄwß}×ÚÚÚñýþúÞQÞŠŠŠxh Ïçþü_ÝÔÔ$//O™9&+Ä7Ò!œ Žñ¿Dø¥ŸòŽòFôÐ.Ä—G‡’]dô ú¾«]ý‚š¢o 殑ÒÒÒx( PRRÂ/hþ&’‹¨¨¨3Jlå!%%õEGÏD?-á@ ú™™™S¦L‘““366Ž\¾|™Éd2 &“ Hó¦RRRø5qA¹Oýþûï•••ÿù犒îQK‹¾¾¾œœœ­­íÍ›7‰Ì.\PTTT.²‰(ŬK||<žäããƒ_ÄÇÇ¿}ûvìØ±²²²†††´¦ñœJJJ—.]¬2aîõë×æææ ÃÜÜüÍ›7´í†èYv‘À£gÑ÷Ázˆv›.**ÒÐÐhmmíD’BêÁìt^¿~=dÈEEÅžv¤¿óìÙ3@QQ‘Èœä[ßÈ_O9|øp ÃIII´ù)‰kˆ0''0bÄaÙºN-äÁõñãG€¼¼<‘ÏçÓ*ÙDð£¸MödÒ¤Iü×êÉ“'c6fÌ~| ­i¼ljj*ÀÐÐbW077§­<Ȧ}fJ ƒÁnoùœœœžv¤¿€ìôôôžvèBèg +++—-[6pà@eeåo¿ýÖÇLJ6[¾`Á‚^rx/Ö›~f…LÔ‰“gÓ¦MW¯^mjjêT§º q* è%ã¤HIIàZ9::¬¬¬(àÊ5¾ “Ïçóx<ù$|ýhvv6Ü“.R ‚éÀÀÀ¯¿þzܸq€––BNdå"›H°ÅhëBþˆKð5Á€%K–×S§NÅ3 šÆ155”••Aj«²¶¶&®«†@ ˆn†>€^ºté¨Q£òòò***\\\ðmç{ aaaøW¢sÉÌÌœ>}zO{ÑÉàsŠý¯¾ú ðàÁ>Ÿo€¿×ÿàÁ<¾þ²  ÿH»>òñ²øÜ*œîQ+ˆ‡‡Çÿý÷üùs‘ªpD6‘`‹‰¹%$$üÿÑ0~mbb |4óþý{Àˆ# UÆ'¶ñß%Ð+Y‡ÏçÿnÅÅŵµµ’“““““{Ô¯ÿp €aØÅ‹E¹yófEEžß××·kýC @È ƒÑÜÜ,(çñxû÷ï×ÕÕUPP˜7o^MM \N†Ï绺ºêèèÈËËãôàòæææõë׫ªªªªªnܸ‘Ãáàò–––-[¶ 8Édž:u æååikks¹\Ú äê+((0Œ±cÇÆÇÇ㤤¤I“&1 mmí+V@„b:/Ò"ŸÏ÷ððÐÓÓSPPprr’‘‘! †„„ :”Á`@Š~ûí7 MMM__ßíÛ·«««kjjþóÏ?)Ýššš:räÈ–– ÃZ[[™Læõë×!]O‘ ëA· hûK°R---“&M"JMš4 w2„•VDX'êèèÐvho¦}K8ÒÒÒ¦OŸ®   ++;lØ0 à eddôõõ½½½ñ<ááᆆ†RRRªªª˜YYYööö ?~ÄV/PÊvƒZZ·nÝ’““ÃW8Šl"Áƒ($ NÉöóóÃ/=zôüùs333™ÁƒÓšÆs2DSSóþýû*¿zõ W5f̘ׯ_ k.h y GQQÑ70 «ªªrppððð(**ŠuwwwwwÏËËË„††ººº&&&r¹Ü“'O>|¸¶¶öîÝ»xjTTTVVÖ•+WÈEÈœ?þøñã,ëýû÷ïß¿///öì†aAAAžžžÿý÷9OVVÖ… ÜÜÜð»žì†aÇŽÃ&{B±ž››K Z Ãâã㣣£»ª5Å-á@ô输&M:pà@RRRSSY~øðaºº:6›½mÛ¶Ÿþ.'sâĉݻwWVV¶¶¶â¯Âàò]»v?~¼±±‘Íf9rä·ß~Ãå{öìÙ¶m[]]]AAÁ?þˆ ;¶qãFa¿K8Ž——¾èÃ0CCø¸¸–––?>|"Óy‘½¼¼N:ÕÐðÿ±wŸqQ\íßÀÏ.°)Ò‘"U$¬XÄXQQÁh¢±5*&–$–Øb×  ¶+z«hÄØÑØˆ±Å[ÄÁˆô "e)»û¼˜çžÿqPaö÷}ágÎÌ5g®ÙvggÎ),++‹‰‰¡w\¼x±üÿ48»BÖ®][XXxúôi@À,GFF²4N2›7oÞºu«L&Û¹sç¼yóªK¸ÊÝ«{SªK[VÍûUåI}þùçwïÞ•Éd cÇŽeVÖx É¿2ôÖêÞD[[ÛêÎWiÕ¾ W-Û¾ÐlúæÍ›+V¬ð÷÷?yò¤L&[¾|9ÓUtùòåƒfgg2»øúú2›ÂÃ㣣óòò–,Y²aÆ'Ožüõ×_K–,‘ß…uáÂ…ààà3gÎJ¥Ò~øaÑ¢Eb±øÚµkû÷ï—¹|ùrDDÄ›7oæÏŸÏlecüøãœL8Gß²eKRRìY³êá…¬-4 ATý þâŋѣGëëë«««÷ë×ïáÇÌz;;»‚‚fùßÿ566V¼žæàà——÷þß—‡••Õëׯ™åüü|kkkfÙÚÚ:''‡SIçί\¹R]@•_Hb±X 0ËæææÛ·oÏÏϧª\YËäk<¢££#{v5î(¿;F¯‹ÅB¡P~GNR©ô«¯¾*((˜6mZeeeÇ¥7U÷¦(ؽÊ÷«Ê“:tèÓ"_¸paDD³²6—P•¯ £º7ÑÅÅ¥º””Ъ è†Te´ìÝôåË—ß¾}»zõjfÓf•ÉdAAAÌãœ9sŽ?>mÚ´•+W®^½Z~ÖþýûwíÚuãÆ æˆ[¶lY²d‰L&;tèûˆ*ÃTÅ‚“ çè!!!œG$¿ýöÛôâ½4 AT}´ÝÑ£G =zÔ½{÷±cÇ2ëÓÓÓ›7oÎÜ hllœŸŸ¯x=---­ÊYO³²² ˜eƒ¬¬,f933ÓØØ˜Ž|öìYFF{Ÿ®|ëåË—3gÎìÔ©“¹¹9ý³òþýûÃÂÂLMM]]]Ï;§`%g$©ê’¯ñˆ©©©ì¯±ï±;‹d@SS³6³¼ ‚¹sç®ZµjæÌ™Õ õ_êÞäߎêNjèСÌ-(§OŸùä“O>Q0Iam2™2e 3‡‹4Œ*›ÕÁÁÁ^^^ÚÚÚúúúãÆcÿÇ\YY¹wï^;;;‘H4hÐ öN²êÖÓ^¿~íëë«©©Ù²eËM›6±‡®nÀ‡âââÉ“'ëëë·lÙ200ðŸþ±¶¶f¦H¨2@Fõž9sÆÁÁAMMÍÑÑqõêÕìúÉ“'›ššª««wîÜùæÍ› VÖ2ù˜ŸŸ?|øpMMÍÞ½{?þÜÀÀ€³£âÝI-z éìíí…B¡±±ñýû÷Û´iÃWâààʼnáœ#]§‚Q8ª|}dU½Õ”L&{ùò¥ššZvv6»¦ºK¨ºJ8'RÝ›¨ a¥µsçN5€­®}¨Ujz=ÐPÐ ª@ k$÷á­Zµª   $$„ïDÞSyyùÁƒÏ;‡©wA±óçÏ2dÛ¶mÕÝâP'·oßÞ´i“X,ÖÔÔüÀªD"Ѿ}ûjó“”R‰wss{öì3û Ô·û÷ﻺº>zô#—C¦^sˆrˆˆˆØ»w/ßY¼[[ÛŒŒ ‘HÔ¯_?v¤X€ê0oúúúZ[[ó 4ZZZ›6m «¾aOu|÷Ýwººº|g¡Þ¼yÃw õ®Ñ4 >|Èw ïIÁTjPß ™Ç*JKKùÎ¥nD"3Ée#"‰|}}9wu41¦  ‚¤RiEE…ü/ïQQQ}úôQWWô÷ËLMÜ£GÚïÐ$9::ž³Ë‘#G~ûí7Å»_¼xQ,»¸¸„††2k !íß¿ÿÓO?-**Ú²e˺uëøNÞh%Õ³gÏ)S¦ :Ô×××ÁÁaìØ±K–,‘Ù:33sþüù111b±8==ÝÙÙ™ÝT^^ž››+_sëÖ­™Ö³‚ݳ³³õõõ G]?çÕbºŸW­ZµfÍš’’tB(4 ”;ípaaa\\œ3–=Óoqqq~~~ZZZEE=W0!dĈíÚµc†¯©nÖâêvçL5 ‰é~öðð8p ››Û–-[øÎÞÑhÆP7oÞìÕ«×Ë—/9ÃØ½}ûV$±³s•kkk3mk™LVPPPå,hô.œõUî.•Jß¼ySeUЈœ}zDDÄÅ‹Åb±‹‹Khh(!äÑ£GIIIW¯^‹‹#„DFF0€©ÁËËëÂ… |ž@S„‡”TÏž=mllbcc}}}£¢¢,,,ttt***²³³õõõ GMqttܸq£••3ìD"QSSc+‘J¥¼@…håeaa1hÐ ÎJŸèèè¼}û–âäädaaÑ¿‘HD4hÐõë×™ÈÛ·o÷éÓ§aShú]@©Ü¼y³W¯^/_¾T0´T*}óæ¡¡a•[ÃÂÂ|||ÌÌÌ‚ƒƒçÏŸ_o™BãÀŒ]^^þá3ŠD";;;“’Ô(..N[[ÃØ(!ÜÂÐø…ÂêZÏ„)S¦0 h=ÃÇ5{öl‰DÂw*$11Q[[›ï,  h@@­ó‚j9räól(Ü Ph@ÔÐÊ«º™£¢¢*++ï[§]Ç Ü  ¼222bccG%‘HvîÜ)‹'NœH Œõ÷÷·¶¶f6åååM›6ÍÂÂ"<<üÕ«WƒfžÜ¿uë–ŽŽŽ……½KDDÄãÇûõëçééYÝî®®®¡¡¡%%%3fÌÐÕÕe'8$„02„çW€'h@(©˜˜˜K—.¥¤¤¨««»ºº¾xñbåÊ•:::„yóæ1O13&''‡Ò¥ IDAT‡‡wëÖM*•þøã„¨¨¨óçÏ;;;OŸ>³Ë‘#G~ûí7Å»Óóþøã‘‘‘ƒfóòòš={6Р²Ð€PRôL„„±cÇ.Y²ä³Ï>óðð Ã233ƒ‚‚Ú·o/‹ÓÓÓÙMååå¹¹¹ò5·nÝš}´¿ºÝ9ób‚CÐÊ‹‰°°°0..ÎÀÀ@(BìììBBB àææV\\œŸŸŸ––&•J‡ òÃ?$$$tïÞ2bĈ¢¢¢½{÷Nž<™Þ…>Du»ûøøüðÉDOOüo‚C‚ UÉŽ;RSSùÎBu½}ûÃØ('ÌD \ª›‰ðíÛ·"‘HSS“)7kÖŒ]ÖÖÖfÚÖ2™¬   ÊiVè]8ë«Ü3ß!&8l¤>d&Â^½z%''+˜êÕóçÏ­­­ùä‘HÄw hPEIII;vä;‹š?žïyúô©££#ßY444 @uý±u«ƒ•ßY4JŸ?ÿlþ|¾³àРºì--[ÛÚòE£TTRÂw ¼ÁC„u€4@  MM~~>ß)@S†445þþþêêêmÛ¶]·n]QQßé(A×®‚®]ùΠÑÃC„ÐÔÌš5«¨¨(66vÉ’%K—.µ±±ñóó›?¾U-Üo_Êâãk¹—âH:FA|-êK¸Æ:àášš\¹r¥¤¤äÆ~~~………[¶l±¶¶655?~¼â©IdññlC“^n0ïwPf¯êväåDš0¥îÞ±cÇöíÛ¥R)»fõêÕ¾¾¾l1&&fÚ´iô.ׯ_744d‹‡b‹;vܲeËØ¢––ÖíÛ·éø9sæ\¹r…>   : cÇŽ‰„-þüóÏ>>>lñÆß|ó £««ËW¯^}ôèQ¶Øµk×}ûöÑñýúõËÉÉa‹óæÍûꫯØâ£G¾øâ :>22ÒÎÎŽ-nß¾ý×_e‹vvv‘‘‘tü_|ñèÑ#¶èïï?wî\¶˜““Ó¯_?:þ?ÿùO—.]ØâÑ£GW¯^ÍõôônÞ¼IÇûí·×¯_g‹>>>?ÿü3[”J¥:t ãƒƒƒ į\¹2gÎ: >>^SS“-.[¶ìäÉ“l±gÏž»ví¢ã½¼¼è›5.\8nÜ8¶˜˜˜H !.\ »Ð¶nݺ{÷n¶ØªU«'NÐñŸ}öYRR[œ:uêìÙ³Ùâ«W¯¼½½éøððpú”>L¿ †††ôËE™6mZLL [ôóó[µj[,++ëúnߨæÍ›é·ìÒ¥KôJIHHPSSc‹‹/¦/ OOOú‚!„¸»»¿}û–-þôÓOŸþ9[¼s玿¿?ennNþ÷§‘——WPP ¡¡akkKùä“O˜ ž½ðRSS+**š7onbbB™1cÆ7ß|Ã^x©©©„+++mmmBHDDD›6m~ÿýwæu(((ÈËË …„33³?ÿü“PÞ«W¯JKKõôô˜¬F½lÙ2ö“J¥ÏŸ?'„XXX0˜¡¡¡½{÷f/¼·oßfggB„B¡P(d>p–/_Î\ YYYEEEÚÚÚÌeÓ·oß-[¶êÂ{öì™L&311iÞ¼9!dåÊ•#GŽd/¼§OŸÆÅÅíܹÓÖÖVCCƒríÚ5###öÂc^@‘HÔ²eKBˆ««+ó‘Ë^x)))•••†††ÆÆÆ„Ù³gO:5##ƒù;*//OKK#„X[[kiiBŽ?îììÌ^x¯_¿þ÷ßÙÐÒÒòâÅ‹„éÓ§3Ëéééb±˜}¿üòËE‹±žD"yñâóš™™åååÉd²C‡:tHWW·ö³¨ü“’2yÕªøG¬ÌÌv-Y2 {÷½gάܵ+#7×ÒÔ4õìY¶˜íè­}/2³õ³¾}/ÄÄX¹rdß¾œJÞ¯Úƒýû滫ëÌ/¾Õ¯Ÿ|°|ÌÂöE‹¾ß¸ñîáÜS®åk "”ºP^^ž——Ç®a>£Yfff~~~ôºíBiß¾=`ccÃ9ÄÀ Ø¢³³3½U__ŸS¿¾¾>]lݺ5À|Ñz÷îÍ|î3\]]9Ùrê755¥‹¶¶¶t€º:÷ýêÞ½»[l×®'`Ĉ2™Œ-r^sssNÌw$«C‡t>œú½½½éæ ý¿ BHóæÍ9õÓ­sBˆ‹‹ À|ÅÒúôéÓºuk¶È9A---NýœìííéÎåAéÑ£½ ç œú9¿ÿ¶hÑ‚ ¾ó«NçÎé"}10\B¥Ê™ÐËÐÐS¿ŽŽ]lÓ¦ `ffÆ©ÿÓO?mÛ¶-OomÖ¬§~###NÂtçè„^½zYXX°ÅN:Ñ[ÕÔÔ8õ[ZZrŠœ@@»téB_ö­Zµâ$0tèв²2¶hooOo511áÔÏ4s !<>|¸««ëË—/µµµ»wïNiÑ¢³•½ðnݺURRbmmÍ\Û...L%Lµ¥¥¥qqq„Ž;2þÌ¿vvvLÀË—/Ÿ={¦¦¦æééIÑÓÓcêïÙ³'sá%$$˜™™1o Ó¤c/<‰DrãÆ BH›6m˜7—yµÙ /;;ûñãÇ„OOOú?:ubþð=z”““chhÈ´È™ü uáݸqC"‘899Y[[“ÿý1õïÞ½[(:::vïÞyé˜?"öÂ{úôizzz³fÍÜÜÜ!L%„¾}û2^\\\iiiË–-™‹ŸùŒÕÑÑav/..f::uêÄ|”1ÿ²^ZZÚóçÏ544zõêÅn%„¸»»3-æ»wï¾yóÆÂ‚95æO˜½ð***¢££ !666?ÎÈÈ`î‡ÖÓÓóðð6lØßÿMjaâ²e·=º}à€Ûĉß&Ÿ<9sýúÒ²²˜}ûz´oOäš¶ïaÜ9ǯ\YôË/#ûöeWÖ©Z¶µÍg^¼øôåËV~~±Œz·£A±é#G|öY·‰9§\·óhêtë @ETTT¨©©qþýzõrssÛ¼y3߉¼§¿ÿþ{Ó¦MW®\a:JLMM8þ|濉‰‰:tx|ì˜ õ³‹n¹jtï^ù¿Ÿòôömß¹sO_»FáåujãFR»›ŒÕ»u“H¥’[·d„¨w릮¦VW]Op]ï¦cöŸ=»éðágééÌ\'UV®ø¸ò§,Ü;w0Syƒj—¨" ´ž›°åË—ëèèxzzžüÝÿþs  ”ºýøñczŒ6€eÒ¤I±ÿ»{ N”z;€zrðàÁÒî7¤ôôô³gÏòrè:ÉÊÊJLLܱc߉ÔlòäÉ"‘ˆï,@U  ÐÐ?~†áÛ§OiiiSºúÔ©S2™LCCC&“UVVÞ¼yÓ3Ë(¥n@‰DbaaAéÓ§––!ÄØØøíÛ·|çÿG©ÐZZZÌgÀÇõâÅ ccc¾ŽÞ©S'B¦òþ(˜©¼õ›Ð+)•J+++ !W¯^e¾³²²ÔÕ•úû@ÕàT‘ ß)T‹Ó\Fë@Ùà!B€)88xذa{öìÉÉÉá;¨h@|L®®®àÛo¿µ´´ôôôܸqãÓ§OÄK¥Ò²òrÅuÆÞ¿{ÿþGMóÿ{’šúCHÈmþ†>öçŸÙùù2™l;î€ÆC©ŠŒŒ¼wïÞÒ¥KùN ¶8pàÀâââ‹/ž:ujݺuóæÍk×®¯¯ïˆ#ºté"èøŒ¼¼Øû÷Gõëwîï¿“ÓÒZ˜˜ÈÝ¿ÿÎãÇó ¦ial\TZJ¹õ𡎖V;GÇУGKÄâ£Féêè°õ$¥¥Å$&¦eeM2ÄÎÒ’Ž9÷÷ßC=<!‘ׯëÝ›Ý%='gÕîÝÆš„ˆK—§¤ôssëéêºõÈqYÙŒQ£ õõéÄÆ H'O…ÝݳS'z¹R"¡k£7½ÈÈÈÉÏ772"„´qpø#:zH¯^õùæ42òOFîÙ³',,Œ-ÚÚÚ9r„ð÷÷òä [7nÜÌ™3ÙbnnîðáÃéøíÛ·wìØ‘-ž}úÐñëׯïMýÍþù矜FQtt´Pø¡+W®¼pá[tww߸q#?`À€¢¢"¶¸`Á???¶˜0cÆ :þÌ™3ôŒ­¿üòË¡C‡ØbëÖ­ÿóŸÿÐñcÆŒIMMe‹S¦La†ed¤¥¥}ñÅtü¾}û\\\ØâáÇ·mÛÆMMMÏœ9CÇóÍ7wïÞe‹~~~ôhÅÅÅýû÷§ã7nÜèîîÎ/^¼¸bÅ ¶( 9ãÛüôÓOQQQl±wïÞëׯ§>ýôS±XL”¼½ÿþ?ÿüS"‘П„™3gæçç³Å±cÇ6Œ-¦¤¤Ð—#!$88ØÒÒ’-ž8qâÕÕaaaA_î„¥K—>þœ-2düøñl±  à›o¾áÄ·iÓ†-þùçŸôœ––ÖÞ½{éø   úíwww§?àd2Ù¸qãèøY³fõìÙ“-Þ¹s‡ó÷°oß>úh÷îÝýõ[lÛ¶í’%Kèø€€€ÂÂB¶8a„Áƒ³ÅgÏžýôÓOtü¦M›ÌÍÍÙâÑ£GO:Å­¬¬‚‚‚èø… ¦¥¥±ÅaÆÑó½åååÍž=›Ž_±b…³³3[¼téý©««»k×.:>00žÕ¶wïÞô\eeåĉéøï¾û®[·nl1..Žó‰|àÀúÃí۷߸qƒ-ºººr>ñ§NZ\\Ì'Mš4`À¶øäÉfÜVÖ¶mÛèçÕ~ûí·ÈÈH¶hkkûóÏ?ÓñóæÍËÈÈ`‹~~~ô7Dvvö÷ßOǯ^½ÚÑÑ‘-þñÇôW‚ÁöíïÌs¼fÍzb³O?ý”þʋœ'OæäÓ¹sg¶xóæÍ_~ù…8|ø0]üå—_è¯ØÎ;Ï›7˜4iRYY[üúë¯ûöíË>|¸víZ:þ×_mÞ¼9[;;›-Ž=šþ†xõêÕüùóïݻײeKCCCBÈÏ?ÿlkkËDFFþöÛolÑØØ˜þ@'„¬X±"))‰-0`Ò¤Il±¸¸˜~=Ø·oßû÷ï8p`Íš5666#FŒ`ïÀŽIL¼›’™©®¦}ïžoŸ>‰ÉÉ/22Æ 8ý³Ï’ÓÒÂÿøcÞ„ „óÑÑζ¶ÓG޼#./w±³ ýý÷¿úŠ=PZV–šP8}äÈ}‘‘é˜GÏŸ·jÙ2#77îÁºmmf6¬wo;;×V­!G.]úmÝ:-‘èÐùó=Ú·omk»1<|Í7ß\½s‡NŒÝ“ »;]!$âÒ%º6zSäõëƒÿ÷ÝæÕ¹óì  4 i2™Œs÷³µµ5ýu ?}ûö파ØbË–-é­"‘ˆÞ¢§§GÍÍÍéùçø]\\d2[dg{aNýœGuŒŒ8tãâèèHÐ_ Œ®]»Ò¿Ìp%,]]]Nýô—#!ÄÆÆ†àìNquu533c‹œPSSSñ haaA4kÖŒSÿ'Ÿ|¢¦¦Æè­B¡S?óÅ266æp899ÑtÛ”áææÆ´ÿô—;!DOOS¿èÝ¡6[¶lIX[[sêïСÝââ~üXGG‡yqêú¡ø ä\á2™LCCCKK‹ù"/++‹ÅlÎ=]]m,,bïß÷íÓ'öþ}]]=¡@™—tà@{''ñÿ"Ë+*r_¿&„dççë7kf¨¯?úÝŽBˆ…‰‰Ž–VEe%'ÆÑÚzcx¸•©©Ö» ŽÖ¶¶L»63/Ï«Kc¦ç[M(d£ã9Gawç,sj£7I¤Rº1!}÷JΠ······‚]æÎ«`«§ÃˆÃÝÝÇéßå …Šëoß¾½â€1cÆŒ3FAÀêÕ«lµ³³S\ÿСC‡ª @ñà¹FFFŠë÷ôôôôôT@w÷ÈÓÐÐP\ÇŽé_ ä7ŽÓDZnÝ:['0|øp΋-R°ÕÔÔTqý}úôáôÁs|ûí· ¶jii)®¿K—.]ºtQ0qâDNÓ!ýôéSL‰?°<==ããã›Òèž $ÔÕÕ}~ éѾ}Ïöí;PýsLLví6ÿöÛ7£GÓ1‰ÉÉǯ\Ô³çß Þýn8ré’‹]GggBÈÂmÛgÍ"„ô6ŒrûÑ£ÔÌÌQÔÏýµÄ cWPP```P×}•\‹-´´´^¼xÁw"ðŽ[·n¡ ª¨þÐýõ×öíÛÏž=+‹»té´›é»$ !tººzŠKKµ559?p3¤R離"ÅcH×&FòŠŠJ‰D§¦‘økyµ…>íãéifh|ðà|…?ÕAžRßÂáä䔕•Åwuóúõë 6Ð÷:¿‡fÚÚÕm …L›5øàAvå„¡CÍ©›_Ù»ÐD" Úì^›6zuµB¦ŒÁ,¼_ë¹iÓÖÖÖTx× ðE©Ðûöíã;hš:tèÀy:çcY¼x1ç9æúÃ<_Xß»|ÄÝ¡N¾üòK4 ”“R7 êÉ;wøN <Æ”Ðü°ôö–D êJòî *õíúõëh@4´víÚqfPNìܹsÛ¶mùN¤fÚÕß2ÞØÝ¸qƒ~ÈÖÖ–Ø^&“{wÇ=zÐ7ß¿zõŠ—2räHzôÀÛ·o§¤¤°EssszæBÈéÓ§éÁ";vìØªU+¶øï¿ÿ^¹r…Ž2dÝq~ÿþýþù‡- |w:ž‹/ÒS¸¸¸´oßž-sæ"éÛ·/=¼trrrBB[ÔÔÔ䌳víÚµœœ¶hggçææÆ%ɉ'èxwww+++¶øòåËØØX:`Ô¨Qø¯¯Š &2€ªX[[ûøøð…ê1bÄ—_~IOtE™0a#?þÑ£GéNëRZZJÐÓB ÀIÃÄÄ„غu+½•Ó:'„¼xñ‚à ܾ}{Nýœ1j/^Lo¥ç5cÄÄÄМ‰±LMM9õs¦¦›\»ví8¿ ÓÑXXXøàÁ¾sQQVVVÌÍŠ|˜à]ÐðõóžÀ‡×*H©ÐõäŸþAǪb¿ýös§ì† øÎ@¹Ü»w¾±TÐÀUYY™””¤§§§££sñâE¾ÓP.?þøcPPßYoNŸ>4p………I¥R {{ûœœœÌÌL¾3P@©‡±;vlëÖ­ùÎ@å„……ihhôîÝ»yóæ> Þ¸q#ßI©___‘HÄwP¥îþæ›oöìÙÃwÐ-Y²„3xÐ:vìøàÁƒ²²2ù¡Ð ܼyóÖ­[|gUPê4@=Y¹r%=YÐNŸ>]QQáïïÏûô铚šŠ1‘^NNNnn.ßY@Ѐ€wüúë¯B¡pÚ´iLñûï¿—ÉdÛ¶mã7+åqøðá¾³Þlܸ hxGttt«V­ÔÕÿÿC2^^^ZZZ‡â7+`Ñ3¢U¹µáSR5FFF|g¼¹víšR7 ïÞ½{îÜ9¾³P!R©´E‹“'O¦W2ÄÕÕ•¯”TVyy¹ü`ÃNNNBÊš5kè­= …C‡mÀ4T‘RÂ1{öìøøøÒÒR¾€¦æÙ³gæææººº|'¢t„Barr2[¬¬¬$„?~œ¿ŒTWQQQóæÍ9+·nÝZ\\Ì9ÏÂZ[[{yy5DrªM©Ðõ¤uëÖ;v,߉(;öFhxFFFÍš5ã¬2dˆ‚]ôõõíììðè!@}Sê[8”Í®]»"""øÎxãææ†4@ÓѲeKGGG¾³hâNœ8qéÒ%¾³ÞüôÓOøm éXµjß)4}JÝ€ ËÉÉá; ¨VttôÍ›7ùÎâ}Èd²³gϦ§§óH5oÞ|êÔ© s¬îÝ»ÛÛÛ7̱@Þºuë„BüP  Œ”ºíìììììÌwP­Ë—/¯[·ÎÒÒ’ïDêÌÜÜüÆÑÑÑ|'R7oÞ¼111i°t\\œT*m˜c¼6mÚðTM©РüZµjõðáC¾³PëÖ­Û·oßY¨:gggSSS¾³>¡ P[·nå;àÓ_|›«šŽE‹ð@SVZZªÔ èM›6aš¾hjjÊd2¾³P].\ˆŠŠªë^™™™/_¾¬|€¥Ô·pœ8q">>žï,šŽÌÌLzÍúõë;vìÈ/\¸°iÓ&fùîÝ»©©©[¶l¡ãW¬XÃûôé³hÑ":ÀÛÛ›nv/\¸ðÓO?e‹qqqË–-£ãOž<©££Ã·lÙòǰEWW×   :~ìØ±ùùùlqÚ´iŸ}ö[LJJš5k¿wï^+++¶xàÀC‡±E›={öÐñß~ûíÓ§OÙâèÑ£¿þúk¶˜——7nÜ8:~ãÆô|ÚgϞݶm[ÔÕÕåL„¾téÒÛ·o³ÅþýûÏŸ?Ÿ-J$v®Á„„„þýû÷ïߟ€’Qê4|\ŽŽŽåååìMMM: Y³f666ÌrBB‚®®.§6€bllÌ °±±¡Ðt㘢­­MïNáŒÔfhhH˜™™qê·´´¤'¸ÖÓÓ£·ŠD"NýœÙÈ è Nýæææeeel±yóæôV555NýœPWW—àœ>‘{ŒŒ8ìV›îÝ»P>eþyÎÓÓ3>>¾´´”ïD j+V¬øý÷ßåGápvvNNNf‹öööÏŸ?ÿ(GìСCbbblll÷îÝ™åèèhww÷*ƒœœ!to¢bÙÙÙŽŽŽÅÅÅ„úûl¬kV4fúµ­W½zõrssÛ¼ysÃ> ÿÜÜÜsçÎñHS6yòd ‹uëÖñðãâÅ‹J}44RIII×®]#„têÔI&“Õ²õÜ®];@ àÆ­W¯^%&&šššº¹¹¥§§'&&÷èÑ£ºø§OŸ2íÔkf¬Y³FCC£6©Ö çèlVõaĈx|¨¾edddggóðfРAJÝ€633300à; xÇŽ#„Œ5ŠRTTäïﯯ¯ß¢E‹‹/2°··×ÐÐèÔ©!ÄÆÆ†éÉfn:t(ûÛ:»|áÂÂ|r …Ìm²ÞÞÞB¡ÐÛÛ[ tèÐÁÀÀ€½a×ÅÅE DGGצfBÈ‹/víÚŹ}–“¤üš*Oɧoß¾ŽŽŽœ£³Y•––N™2E__ßÈÈhÇŽôŽœ¨??¿ñãÇó@S'x_Ë—/oÓ¦üz©TÊ<¶õäÉ™LÆ<µvùòeBˆ¥¥%ÃÜÆšššÊwíÚE?~ÅÅÅ×®]£NguäÈBˆ§§'!„¹o¤Êùè$INNNeeem‚“““322ê# €F høøèû7!ÚÚÚ„ØØX™Löï¿ÿ2+OžœéɦNgÅ4a¯_¿N=z4»•s"]JJй¹ù½{÷ê£r1aÂ___¾³ÞÜ¿·pÀû«îŽ–-[B>|ÈÏŸ?ïâ⢦¦Ö¬Y³áÇËd²Ž;2Ã………11»wï¶²²ruu•ÉdæææìôòñãÇÕÔÔš7o>vìØ¼¼<™LæèèÈ|œÙÛÛB’““Åb1s£EFFFmjfF5feFU«2Iù5ò§ÆæÃ9/NVÛ·o744ÔÕÕõ÷÷/**ªòDä_Ø¿…ƒy~1>>¾6ÁîîîsæÌùÃAÃËÊÊzõêßY4eÆ Sêaì@ÉU7ŒÔ“ÆîÙ³gNNNñññ]ºt©1ÃØ5FÆ ¾ >\©oá;v¬­­-ßY¨(sssÎ,!@”üèôôôœœ¾³PQÙÙÙôœ|ÀPê4|\–––QQQÌè(ð~^¾|™™™ÉwÀ'u¾€FìÞ½{-Z´èß¿?߉¨ž={~ÈîÚÚÚýúõûXɨ¦©S§ZYY………ñðcÿþýh@ÀûÓÒÒºví3 4€„„fÌ€ê,_¾¼–ã|Àû144Tê´···¡¡!ßY@µZ·n˜˜¸sçN¾QÌ( v8GGGv¨lh,˜a ^)uzÉ’%|§ ºž={fddÄwJ¨Â°°°¼¼<¾hÄ”º”\fffFFƤI“øNDU$&&}H ¹¹¹_ýuÇŽMLL>VVª&44TCCƒï,€7aaah@Àû{úôiaaáñãÇùNDU”——ÛØØð(µ .”––úùùñHSæèèÈw À§Ó§O+u:33óÍ›7...|'UóôôÌÊÊÂTÞ ¦"„ÆèÈ‘#¹¹¹h@Ô+¥¾úóÏ?ïÔ©ßY¨(¾SPFJÝ€€K(êèè…µúð/))©ï|#4 àãJ¥eeeÌò“'O~øá‡Û·oˇÉd²Ý»wBòòòæÎ{ýúuvÓ±cDz³³e2ÙöíÛ&gdoo_\\Œ÷>Äï¿ÿ~á¾³Þ´jÕ hø8222"## !ééé«V­ª¬¬ÔÔÔ”H$¿þúëªU«²²²˜°   f‚$??¿ÂÂBfý‹/rrrÌÍÍA›6mþøã¾N Q300ÀèÝõ-,,ì÷ßç; àÍÆÕùå¾Ó¨VFF†D"Qæ ‡Š9Ÿ!111—.]JIIQWW÷õõ6l˜‹‹‹««+!dúôéÉÉÉáááóæÍ#„,X°`áÂ…£FâÔ9xð`fÙËËköìÙC† ià³h¶lÙÂw MŸú¬Y³ôõõµ´´øÎ¤ ÚÚÚ«W¯æ;‘*Èd²ÜÜ\4 !={ö´±±‰õõõ¥×gffµoß^,+®A"‘¨©©±E©TZ/‰B]tëÖ qòÔ !»wïþüóÏùΤ‘)++SÎÿuðÅÂÂbРAœ•ÅÅÅùùùiiiÕ5ˆ;Ö¹sgKKËAƒ]¿~ÝÁÁrûöí>}úÔwÂP£[·nÉd2¾³P:J=44"êêêzzzÌò˜1c˜''§ÐÐPmmmz؇ÀÀ@fÁÃÃÃÃÃYnÓ¦MLLLvv¶™™ÙÕ«Wçϟ߀¹«¬¬¬€€€7b&€÷fbb‚ÍUÐP¿š5kVËÈ)S¦0 h=ןâââÓ§OÿôÓO|'Ј…‡‡óð) £p4‹-â; €¦,##=ÐP5‰DÂŽí Å?ÿü“››ËwMz ¹@ à; þ©©©ijjò€Ò©¶-S›êjIÇ(ˆ¯e˜|Âêêê­[·>zôhm®}ªM€®®î_|ÁÌeï§Ú´L&cG/¢—ÌûT&“ݽ{7))é믿®¬ :ôTÞ„·o߆……Õ룢¢*++™ev†ð©ø„áæææGŽa† €÷3wî\v4!PA_~ùenáøçŸÜÝÝE"‘½½ýåË— !{÷îµµµÕÐаµµ%„Èw×¾™Ù:jÔ(]]Ý'Np*©}µ2™ìíÛ·„''§Zæ,_'[sm2;•·X,^³fMxxxnnneeeHHȺuë^¿~͉§gùf–CBBòòòèeBHhhhPPPQQ³WDDÄŠ+nܸ‘——˜žžN¨Âé#&%%íß¿õêÕ)))Ìî˜0š¼>}ú°“zB=yøðarr2ßYoÆŒS‡ôĉcbbnÞ¼™’’òÍ7ßBfΜ™––vãÆÔÔTBȇ÷Xoذ¡¸¸˜óøpª …½zõrqq9sæLmrV€ßx€Æ%&&&,,ìܹs§N:|øð€˜IU"""zôè1}úô7rvQSS›>}ú矞ššúâÅ‹€€zùâÅ‹b±ØÅÅ%44”ÙëÈ‘# .ôôô411ñðð˜7ožµµ5!dÁ‚ñññœ#¦¥¥1G‰ˆˆ`vŒŒ0`³ìååuáÂ…†y}Œ¿¿ÿÌ™3ùΠ‰«CúîÝ»„777BȳgÏ!$„ôìÙ“3y/«Êû@˜Ùz¥R©D"!„¨«ÿßH ̯ŠIIIŠ3Qp{É“'OLLLž>}ÊtJ½GÎðzöì9eÊ”¡C‡úúúþûï¿ÖÖÖÌ,™™™-[¶466f»Y™™™óçω‰‹ÅcÇŽ]²dÉßÿM/gggëëëŽ=šÙ«uëÖŠ'åÑÂÂBGG§¢¢‚ÙŠ Ãë¤}ûöÌu@«CºmÛ¶„K—.I¥Ræ[çäɓׯ_gV21Ì>>+V¬ !„øùù­^½zÑ¢Eò¿)³³|WTTÆÅÅ…BzÙÇÇ'::úÁƒÌ­Yvvv!!!·oߦW*8"!„™0œYÆ„á5ºÿ>>ª!«À,ß¿ßËËKKKK]]ÝÑÑQ&“ÙØØ¨©©µhÑ"44”‰9zô¨@ Ð×ׯ²“X&“=yò¤oß¾ZZZZZZýúõKNN¦·Ê/Ô²Zzå™3gÔÔÔÆWcÎaaa¦¦¦Ÿ}öYmŽK‹Å„S§NU÷Ò¨‚åË—·iÓF~}qqqee%³\VVV\\\åîEEE‰„Y.,,‹Åòˉ$??¿ºŠŠŠäW*8¢L&Û³gOVV–T*ݰaCu1JkíÚµNNNRÃÓ§O…Ba|||m‚ÝÝÝçÌ™ó!‡h’¶mÛvðàA¾³Þ¼|ùRÀ4 ?ÿüóúhš7aeeeZZZ§N1bß¹ðfÅŠ¿ÿþûÇkÌ.O˜0ÁÜܼ~òj²Ö­[·oß¾yzéÙ³gNNNñññ]ºt©1¸W¯^nnn›7o~ïÃAÃcþó©­­Íw"MÖðáÃ1!4œyóæñ@››{îÜ9¾hÊ0!TÍÄÄD$ñ€ÒAª–——W^^ÎwJGÝÇÇçàÁƒä;“ÆÇÇǧÆ÷T‡T*­¨¨ÐÔÔ¬Ó^ÇŽóôô433Û±cÇŒ3ê)7`™››‡‡‡ÛÛÛó@#VTT$ uttøNx£~öìYOOO;;;¾3id$ÉáÇûöíËw"Ê"###66vÔ¨QIII111iii&L°³³ -))™1c†®®î¹sç†J‰ŒŒ6l;/ !„™pÈ!|ŸG§««;nÜ8¾³hÜFeeeÆw"ÀÍ›7«BfΜ‰Q8ꪬ¬ìðáÃÌÌ/séÒ¥””uuu]]]fþ¿}ûöuìØ‘JðÇ|ôèQ«V­222ââ↠ÉŽÖìåå5{öl4 >Ðwß}‡oꕃƒFဠgÏž666±±±¾¾¾QQQìüœ©7nÜheeÅÌa„y•œ™™YóæÍùÎê¦cÇŽ|§Ðôá!Bø8Ø™iœ©œœ,,,ú÷ïÏŒí€y•\~~~•s@¨¸š{ 322®\¹2~üxvL&Û³gÏÔ©S9‘QQQ}úôQWG¯6€*RWW×ÓÓ#„ôïߟY³téRBÈÞ½{ß¼ychhHquuuuu%„¸»»BÚ´i“mffvõêÕùóçó–½Ê())ù믿<<< j ®¬¬”H$ @ãRsc·¼¼^vttܶm[ee%óå„)@©Èw?3˜Nè½{÷ªà˜Ðð~>t&BšH$‰Dòë1Å ð‹é~îÖ­[XX˜üV==½òòré„ÖÖÖöòòªåÇ²šššºzÍý,ª3@Ó7uêT@]e€H$JMM-**ÒÕÕmàܘ¥¥åÕ«WùΠq[»v­‘‘ÑŒ3øNø1dÈt-@Ó—››ËY#\]]ïÝ»ÇK>õ§S§N………|gÑÄݸqÃÊÊŠï,€7h@4sæÌá;€¦#c@Õºv튩¼äÕÜ‘‘±`Á'''oooù9oe2Ùž={¦Nš——÷óÏ?1¢wïÞõ“*4eee‰‰‰|g5‹|g tjn@3Sy÷ÝwLQ"‘ìܹ3//oÚ´iAAA„??¿‚‚BHRR!ÄÆÆææÍ›ýúõ‹ˆˆxüøq¿~ý<== !¡¡¡%%%3fÌÐÖÖÞ¹s§X,ž8q¢‰‰I=ž%(“ÌÌÌnݺñ€ŠJMMuww?þ¼««+ß¹4V½zõ266æ; àMQQQ­¦ò¾páBAA¿¿¿ššÚôéÓ“““ÃÃÃçÍ›·`Á‚… Ž5ŠŽOKK#„˜™™Ý¾}»_¿~ôÔß/^‹Å...¡¡¡£GÆ,ß*ëäÉ“:tà; P]¦¦¦|gÁƒÊÊÊŒŒŒŠŠ ¾hÄ~úé'¾S>}ùå—ï4 Ÿ={VYYÙ¦MNÚÛÛ›íÎÌÌ jß¾½X,®®^@ “ÉØ"=õwvv¶¾¾¾¡¡áèÑ£ÙY¾?ûì3vZÐXZZâÞJà烠i˜>}z^^ÞñãÇùN )«ÕTÞ´âââüüü´´4©T*¿õرc;w¶·· ¼sçŽ|€Ï?ü ‘Hôôô0Ë7€2kÞ¼9&RitÊÊÊôpÀGQ«©¼ÙîgBˆ““Shh¨¶¶6Ûêegíöðð`;’·nݪ©©É<}BOýmdd´wïÞ7oÞB0Ë7€Ò*((¨¬¬ä; ¥ó>Sy7kÖ¬ÆzÙ{6ä …B¦õL0Ë7@Ã266¶¶¶æ;€F Sy¨æÍ›Ï;—ï,·aÆYYYíØ±ƒïD€+V¬ÀÍmMǤI“pt}«¨¨ÀP6ª¬sçÎh@@ÕÔÔÔ0VI£ãååÅw M†¿€ª™˜˜èëëó€Ò©¹=cÆŒyóæ=|ø°öõFEEÕæÙíZ†ÀGQVV_RRR›àìììׯ_×wJNÍ·p¼}ûvĈ]»vݺuëªU«èiºmllbbbÒÒÒ&L˜`ggÇî’——ëïïommÍÎÝ­««ËÌÎLßMaÃZ´hi½ê[zzº››[|||—.]øÎ ±š;w.&QVeý?öî<.ªzÿø›}qdbQ\&wE!PÄRA0ɲM*Ã{Ó2—ºùM3 ä^1(‹+ÙU¤4\1M0 Ô„QYtDv™å÷ÇççéÙ…Ã0ïçãû¸sæ|Îç¼ÇúÚçœùœÏëäÉvO ‹‹‹ÿýw©$æ IDATTÊj·ÿþ•+W¾óÎ;  …Bakkkaa¡P($ÉÞiiit{>Ÿïãã³zõjggg:»ÊËËoݺõÎ;ïðù|ºýy7k„B¨ÏºzõêåË—¹®¢ œ:u*×U Îüûßÿn7€¾yóæ7ÐáááLÉFa888˜››«y•Îî&¾ûÌ™3t3UŸ#„BHs_~ùå¿þõ/®«@¨k7€ 366Vl·aÆõë×€››[zzú®]»Ô÷;hР¸¸¸Â   ³gÏ^¹r¥¡¡XñÝL3ŒõF¡ÞÆÎÎNéBHÇu<ú…^ »wïwww:¦› ckÚ’%KšššHf!ÝmaaAÇwÓÍ0Ö!„z•û÷ïÓï· „":å­4¦[ñ&ñ›Îî…øn¦Æz#„Pwsuu---uqqẄ´ØÅ‹MLLFŒÁu!ˆ†dZ³¢NDycúw‡Ž9²yóf®«àÞ£GLLL–.]Н0À?þñÅ‹s]Ò!FFFƒæº „´Û¿þõ/''§¤¤$® AÜøþûï1‰°çˆD¢ßÿ}åÊ•\½ÀÀ@®KèöìÙSUUÅu¡>%>>^&“q]B} {”‰‰ILL ×U ÞâðáÃ\—€:'{h D¨t¼ä…X,^³fÍæÍ›«««É'ˆBº ¨¨èöíÛ\WB½NÇO ÿúë¯0Sœé”A‡øøx±Xyÿþý“'OVUUEDD8;;wsÙ!„:£¦¦fÛ¶mË–-{æ™g¸®!„´UÇI„Ç·¶¶^±bÅÇ¡}Ê`ZZÚäÉ“—-[¶uëV¡PhmmýþûïÇÇÇ÷è7@!¤±‡nÚ´©²²’ëBÒbéééÛ¶m㺠ę/¾øB£$ˆˆˆ÷ß?99™õyee¥«««­­mcc#ØØØXXXŒ‰‰ILLœ1cù„‰œ7o^TTÔG}4kÖ,Ø¿ÿ‡~8mÚ´û}ŒžÍÏÒ¼šö6czzzÏ>û¬&5ѹ2Ô‹ÅË–-³´´äñxOó'óÏÅÐÐpèСéééªZ._¾ü?þøå—_Äbq§/‡B™™Éuõq϶¶¶^¾|¹±±±‘‘ù„Žܾ}»D"177ÏÉÉ Ÿ4iæ¡tš\.2^$ÛœðD Š‹‹ ¨¨èüùó'Nä¼$E6lؽ{÷úõë×­[·jÕª§/©¸¸X ¼ùæ› ,PÚæòåËàããó”×Bˆ[R©TD!EÊWሥTWW÷ë×=L| ±±1‰ÃðòòòòòÂÑs×úóÏ?§L™bllìæævâÄ HNN8p ‘‘ÑÀáñh¨'µš?¾%GÃÂÂx<Þ÷ßÏêDÃnÉ…^^^̶b‘¬]Å/E:LLL433c]…¹Ö… ‘‘‘@ øí·ß”Ö¯ªÎo¿ýÞyçGé{ûå—_ÝÝÝÕüár¹¼¡¡<==U}²L¡¡áÓ?>G¨k6LÃÉE¬ß$Býiiirô„ÈOó™™™šŸ’””Äãñ:lFþ¡í &@aa!xzzÊår333ÈËËSÚžµËl«ùðæÍ›0dÈUÍÔtÛÐÐÀãñ ‹ŠŠ y<^CCƒb‘¬]Å/E:”Édj®5jÔ(8uê¥õ«:×ÀÀ¤R)óu{#‰¬d0MÎRU'1lذ۷o+m¦ø§§Š››[ttt‡ÍPw€™3gr]Eo7eÊ”•+Wr]z2‹/ž={6×Uôq äº Ä™-[¶t¼4âÐ¥K—€ ÑÈHqæÌ™àííªôò–µMF2™Œ¼!JG¸“g®¥¥¥ê+QÚí¡C‡%‰@ H$©©©ŠE²v¿¡þaíµk×àñ¤²­´~¥uÚÙÙÀýû÷ÕôFz gr«ª³¤¤„Ïç߸qãÎ;jš!„'ÜÝ݇Êu}Ü‘#G~þùg®«@œùè£ àã?Þºu+×Åh22ëîˆ#F\¾|9;;{ÆŒd|ùÃ?œ9sæ¹çžËÎÎ&mú÷ïßÐÐP^^NOê·ŸN=a„üüüÜÜ\ò¹&3•5évïÞ½pèСW^y%55uáÂ…{÷î}óÍ7YE²v¿”úK^^^ÅÅÅgÏž…Ç3F”RZç‚ âãã·nݺqãÆÕ«WïØ±C±7WW×›7oþñÇjþð‰!C†dee¼öÚk—.]êðë „POúä“O¸.¡¾O?˜DO êëë»õOJJŠŸŸßܹsÉŒÛN›6ÍÑÑ166–´IJJrqqqss³´´TÕϾ}û¦OŸ>kÖ¬Ù³gìÛ·¯ÃKwØmqqñùóç­¬¬ÈsåÐÐP+++òN!«HÖ®â—ÒäÒÉÉÉ#GŽœ>}ú¨Q£WTT/::ú7ÞHLL´³³#f{Û°aƒ¹¹ùo¼Áœ¥¦ÎÉ“'§¦¦–——/_¾¼Ã¯ƒöš4i’‡‡×U „P¯£iiiª@ª´¶¶šššfff†„„hxJrròÊ•+Éûg€»»û²eËÖ­[Çu!ºHOOoæÌ™Ççº^mêÔ©&LøÏþÃu!õ./¼ð‚““SRR×… Ît¼ŒBˆCR©´»è@:åÎ;sçÎ=xð š©P!õ†NÞ®A: Ðõj%%%d…„ºDkkë¥K—š››¹.!-Çu ˆKóçÏo7€–Édmmm&&&OÔKFF†¯¯¯½½}bbbddd—Vˆؽ{÷ Aƒ¸®¢O™9s¦‹‹ ×U ÔõÖ®][SSC^òFu‡¶¶¶v芊Šüüü°°°ÒÒÒ¼¼<¡P¸hÑ¢Aƒ%$$477GFFòx¼£GΙ3²²²‚ƒƒoݺuïÞ½ÀðáÃúé§Ù³gsómz=‰D"“Ép¥3ÄH$mmmš´ôöö9rdw×£kÈ åH ü#ÒF÷îÝ£WíDu‡¿ÐyyyÙÙÙeee$ÃÀÀ`Ù²e_ýõèÑ£Åbñ°aÃÖ­[wõêÕÁƒWTTgeeÍš5‹ôàçç·bÅ @«’ŸŸßÜÜŒ 5 Ú¹sç¸.!•ZZZ¸.!„z£¿ÐÞÞÞ...ùùù¡¡¡999æææmmmÕÕÕÖÖÖ/½ôxxxlݺÕÉɉ$ÁJ¥RÒAÈd²žÿÚbäÈ‘fffGŽáºÔ[„‡‡ ®«@ºÅÊÊjÍš5ägC„BÓn ‡ƒƒÃóÏ?Ïj´jÕ*©TÚ¿ðôô¼|ùòŒ3Μ9Ï?ÿ|nn.Iƒ+,,ô÷÷ï¡Âµ•••ÁŒ3¸.õ¦¦¦ÖÖÖ\Wt‹­­í—_~Éui·ððpü%µråÊvhCCC2Jfyëׯ€ää人:ò_z@@ž™M™2†ž——W]]mooêÔ©5kÖôðw@!„ãÅ_ÄUVºÛ½{÷ŒŒŒ¸®q& @£eìôõõÕ<'‹ˆˆ 8zF!„¸5wî\®K@¨ïÃu {Ε+W¦Nú /p]ê-† RTTÄu©äáááààÀu!Ôëàºç˜˜˜üòË/‹-âºÔ[|÷Ýwaaa\Wt‹D"©ªª²··766î°ñÍ›7mllz *„Ò.8€î9ƒ611IJJâºÔ[œÞ¼yõõõ¬mëó˜˜f©TºcÇŽ¸¸8‘H¤ê*¥¥¥ûö틊Š*++c]ÒÒÒ6nÜxúôiº+`BÅõôôH¨x7ý‘u ú^Esx‡€êIööö&&&\WB½Îßè¼¼¼¤¤¤£Gfffòù|ŸÕ«W;;;?~œ‰òîÜ5Ö®]{á²]^^~ëÖ­wÞy‡Ï竺ŠP($AâiiiŠWOMMýðÃ}}}é® +++00´ñóó;vìXçÿTºs¯¢ænáèÑ£¤1i©]w¡>àÞ½{¸ÕG¡>ïï´··wDDÄœ9sBCCé¬(ï§äîî¾páÂ?þ˜ªºŠª q:t(Igu¥E¡âô½Šš»…«W¯–––ž:uª  ´í!Ô;999åææâÛ«=[·n‘Ï‘Îj7…ƒŽò4hP\\\aaaPPÐÙ³g¯\¹ÒÐÐÀ´ÌÈȨ¨¨Pܦ)ý¼¾¾¾  ÀÒÒR__¿Ã«€ªÏ»"¡âäP/gÝ«¨º[ðððغuknn.¹aТ;„P¯ejjêëëËãñ¸.!-¹aî«@œ9xð ò(oX²dISSS¿~ý }”7øøøøøø(nÓXŸGGG“ ‹×_ÝØØ˜Ì«SsP$®¦+í §ïUAAA«V­’J¥äŸ‚§§çåË—g̘A±“;wwwèõw!„¸Õ…oç#„õïß_Ý2vd\ Ey±±±Ìö¢E‹  æªOt5Wgu¥E¡â̽ʌ3È'Šw @ À”)S@ÛîB}ÀàÁƒŸy殫@OÆÅÅ…ëêûô;n¢™Õ5£g¤žú{•ˆˆò!ŽžB=àúõëôL¼—_~™GY²d «}ÿþýééééôÑÿýï¼ö˜å•ˆwß}—>:kÖ,VÿžžžtƒíÛ·ÓG/^¼ÈêÿæÍ›tƒÍ›7ÓGÇŽËêêÔ©tò\ƒq÷î]VÿçΣìÙ³‡>êääÄêÞ¼ytƒ·Þz‹>*‘HXýÿðÃtƒ#Gް°^ñ|çwè£sçÎeàêêJ7HLL¤°ú …tƒ 6ÐG'MšÄê„ tƒO?ý”>ZVVÆê¿°°n°cÇú¨››«ÿ   ºÁòåËé£---¬þüñGºÁáÇY X“!#""裊I±ŽŽŽäPNNëŸ>Ò5¤‚B:¤¾¾þàÁƒaaavvvOzîÛo¿ý /0»dFmûöír¹œÙ?~<}täÈ‘¬!/k¼… ÒƒZGGGVÿŸ}öYss3³;qâDú¨««+«Öwœ3g=¨µ´´dõ¿nݺ0»£F¢ZYY±ú÷ðð w}}}éŠaéË—/§µžžžôQ}}}VÿcÆŒ¡wŸ}öYVCÃvÿýõ×éA­âþ‹/¾‹ÅÌîäÉ“é£nnn¬þYAîsçÎ4hª£ðñÇ?|ø.˜>jkkËêŸî üýýéfff¬þß}÷Ýùóç3»C† ¡±ú'¿â2ÆŽËj §§Gï.^¼˜ž}ªø,?66öÑ£G°bÅ |IÇé@ZZÚ‚ ¸®DË´¶¶šššfff†„„hxJrròÊ•+߆D:ËÝÝ}Ù²eëÖ­SÓæêÕ«#FŒ(..9rd¦ ôôôþùϲþkª nÞ¼©y”÷Ô©S'L˜ðŸÿü§ CH‹œ;wÎÌÌŒu‡ƒtÇîÝ»U&²444$%%©Úí*‚B=£Gfddp]E7eÊ=ë²üQy! ùÛ´iSUU•X,Þ¼ysJJÊýû÷€µK£C@˜¼@Ö¶D"‰‹‹Û²e ù•‡>¤SA!¬{•nº!¡Ñ©éjÂÕYð–!„´Ëwß}÷õ×_s]B}ÜßÓ§òòò²³³ËÊÊ CCC—-[výúõ””›ÀÀ@;;;ò:È·ß~Kï2èuëÖ¥¦¦:tˆ,`Lo§¥¥Mž>>̶šØsUXWd2ÉQݹ¥AHw¸¹¹Ñë$ „:áÝwßµ±±a­Ó‡t‡———ò$BOOÏ„„333’’½mÛ62–òòò¢w666t“ÈÚöððؾ}»D"!ãoúN…0÷*ô ‰š» ú–†Î0§·ÕßÃÔôÀÀÀ &0ª¹"èÒ- Bõ¶¶¶¬ÕÙP—KMMÅ´.ûâ‹/žj;ÍÓûž.\Æ®¹¹™¹!yôèswÁÒÔÔÄÜÒ4440æô¶L&cÅ¡³z`rj®IIIAAAööö±±±}û–†¸Œ‡tv;„ÐÓ³³³³±±)))áºÄ™§ RY½zuWÕ¡ËèÁ«±±1³ö¾šûú3½­>ÈPqô̺¢"-JGGu¹#GŽØÙÙy{{s]Bõ.˜DØ{áý Bˆ[_|ñEmm- ü8pàÆé£}ôQUU³ÊìVUU}ôÑGtû 6ÐÉsÇŽc^Y++«ÿûßtûèèhú Ÿ¿¿ÿâÅ‹™Ý––V’ó{ï½GGßåååíÞ½›ÙÕÓÓKNN¦ÛïܹóüùóÌî˜1cV¬XA7X¶l‰#Þxãçž{ŽÙ½zõjLL Ý~Û¶mô¢%ß~ûí‰'˜]ww÷ÿû¿ÿ£Û¯]»–^öÅ_ fvïÞ½ËÊß´iÇZïÙÖÖ–~ì‚êV8€F!RYYÏÊ‘VjòäÉ×®]«®®†ö?v< ‡ˆ¦¦&ú¨T*¥³=ÑÜÜL7`€‡Ò Xóßär9«z° b±˜n@æ¿Ñêêêèuuu¬÷îÝ£ì§C°ÉåX°Þ´nhh (þ<(‰ètJ9H$õ€MMM¬¨ÇXZZªù½éŒòî$ŒòFOç@w‡;vhÒìÿø‡ŸŸŸþÕ'‰6lØpâĉ3fp] Bi¥7ß|³Ýh™LÖÖÖF^GcihhHOOgfIJv‰’’’]»v-\¸^çärùÞ½{ßzë-‰DŸþyHHýCX‡222|}}  —Ë###5?!¤;ärù?þñþýû+ý{Œ¦¯¯éÒ¥?þø£g ë=È:•ôÔ ÔÇÌœ9³¶¶–ž‚êZ÷îÝk7€fâñèÜ;+++&*èä<úÜ;wîlÚ´ÉÖÖÖÄÄ„>ÝÁÁɽ>Ÿ?oÞ¼ÚÚZ(--—sçÎ0±y¾¾¾t¢‡Ç¤|k{$}¯’““ãïïohøÓiTBß«¨GîIìííñ†õ=IIIÌjèˆåäɓӧOçº Ôþúë¯úúz®«@¨û{NGçÞÑQyð8Ê›Ùe8;;/]ºT Ч•{Ç" …Bakkkaa!P±y¬D=:úJ$^EEEVVˆD¢èèèèèè;wîH$’¸¸¸-[¶(ÆH¥Ò;vÄÅʼnD"úHKKÛ¸qãéÓ§ &&†™•UZZºoß¾¨¨¨²²2©Tº}ûöM›69r¨Œn憤G¿]iƒŒŒŒŠŠ 77·ôôô]»v±Ž={öÊ•+ä};’‡Çí‘xô½ ýyee¥«««Ò(o&¾ûÌ™3¬Cjòº™hî‘#G9r„ÏçÛÙÙft#¤Ãlmmà™gžáº„´ØèÑ£gΜÉuˆ3ááá]å ¯¼ò Ù`í#»}|||||Èv||¼‰‰ yÍ´a¥‚3ßä%¾‘òÍÜ«²­&X›Žì¹Üjܽ{·®®îêÕ«ÉÉÉK—.ÅŒn„ê«f̘¡¸$êZwïÞmiiẠę°°0•/®Ñ©u¬œgfWMTžÒÐ;Eª²õ˜å>ôôôúÀè¨{X²d ²½}ûv¥ÁÚ¯¿þ:ÙMŸBߜлÌUëׯ?räÈŠ+<<<öìÙÔ=‰½½}߸!A!D$&&r]B}Fy÷ Ìý††QÞ ñ- 1gΜÌÌÌúúúO>ù„|‚Ý!„BƒI„½WÞŸÌŸ?¿«zCi/¹\Îü/B¡ÎaG›"„êÃnß¾ þù'×… ¤ÅfΜù /p]âLYY>îQMMMÌÔg„š››¹.!Ô×TWWËd2GGG® éË<Èu ˆK+V¬èÊ(ïÎÑH<__ß½{÷r]E¯••Ìu½Âøñã¹.!Ô§L:µ¾¾þÞ½{\‚P_ÖeQÞ¥¥¥'Ož¬ªªŠˆˆpttdN·³³Ûµk—X,çóù¤gf—ŽéîÝj îå—_ž3g×U Τ¤¤´@WTTdee€T*ݱcǦM›ªªªÄbñæÍ›SRRÈs Ö.ƒÏçÏ›7¯¾¾žìÆÄÄX[[3]ÅÅʼnD"‰DÑÑÑÑÑÑäùGBBBLLLccciié¾}û¢¢¢ÊÊÊèÏ --mãÆ§OŸ&=3á…zzz$¼°{ÿP¹qãÆ•+Wè·[BCC«ªª 8¬ !„ú˜¸¸8ú„Pwè²$B–µk×^¸p¢ù|¾ÏêÕ«?.‹‡ –  ÉEÓÒÒèÏ 55õÃ?ôõõ%=cx¡–jnnž2eÊsÏ=×ÚÚZXXØÔÔ4jÔ¨3fp]B!„ГéÊ$B¥Xу´êêj kkë—^z ÌÍÍÛÚÚXŸ:ÔÔÔ”9 à µ”@ 8{ö¬¡¡aeeåĉÿøã8qâ„··7×¥!„B=vS8“ÛÚÚHô`\\iÃÚeÉÈȨ¨¨ ?aEÀ Aƒâââ ƒ‚‚Ξ={åÊÖûàª>'Hx!ÙÆðB¤§@ó³4o£¦½†ÍXžžÞ³Ï>«IcMt®Œ;|¢?Õ'Yz¯H IDATêYqqÂÅņ Æu!i±Ï>ûŒüHŽtÓÿ_l7--M® ±±Q*•’í¦¦&‰DÂbív¨¾¾^,³:'R©´¦¦FñUŸ{÷î­ªª’Éd_~ù¥æet-±X ™™™\ ½nݺJúøø¼ûî»vBþ Öü¢š´§ÛhØ¿†Íòóó™ÿ¯SõÅŸÔ“þ ô|‡Ý×óÊ•+§L™¢ôùI*==½ /×Çܸq.\¸Àu!¨» 2ÄÁÁë*ú8>Ÿ?dÈ®«@\j÷šÖ¯_?æ™±¹¹9=k‚Ù¥TWW«êªÿþ¬° &§P__Ÿ¼kÈ¢ês"""‚¼Dˆá…þüóÏ)S¦»¹¹8q’““hdd4pà@P|ü©ù3Qr4,,ŒÇã}ÿý÷¬N4ì–¬HãååÅl+ÉÚUüR¤ÃÄÄD333ÖU˜k]¸pA  ‚ß~ûMiý~ýS§N‘C;vì §Nºxñâ³Ï>khhHžbª*r„ æææ{÷îUüSzÒRBOª¤¤¤²²’ë*ÒJŸ@#õð t§uùè &IÖðôô”Ëåfff——§´½\ÅÃf5Þ¼yÈó¥ÍÔtÛÐÐÀãñ ‹ŠŠ y<^CCƒb‘¬]Å/E:”Édj®5jÔ(8uê¥õ«ÿ¦ ¹\>qâDx<îŸ4iÓÿÉ“'ÕYTT...O_ªRøúiàh„ž>F*Ÿ@#ÔMœœœ®_¿Þ…³/]ºd0G†_3gÎooozÕ<ù·ŸµM~W‘ÉdR© ÿŽrww€ÒÒRõ•(íöСC‰D H$’ÆÆÆÔÔTÅ"Y»Š_ŠP?øÚµkàããÃl+­_iô.ùäµ×^cúyùå—™í©S§’ƪŠ>|8¨¦a©!„P/„hÔÓŒŒŒ<==Y³zžÆˆ# ;;[&“‘?üðyÓ4;;›´éß¿?”——“]¥sÈ@077—œKž¿ª§I·d&áC‡ärù¡C‡˜OXE²v¿”úKäiñÙ³g™m¥4œÁBª%£a²=xð`8wîi ªÈ+W®À!Cž¾TÔåÝÔÔÔÔÔ4 àúõëre<ès;ì–Lf°²²jii‘Ëå---VVVäsV‘¬]Å/Ewκ4s¨°°päÈ‘£F"¿Ñ+-[é6믅“'O’Ý»w“_~ùåܹs¤'''5EºººÚÚÚ?~üéKU §p<_~ù8Àu!!¤­>øàƒvh©TJ–˸ÿþªU«~ýõWò¹L&Û½{·Ò.Nœ8ÑÖÖÖU}÷Ýwdy;vtUŸÝÐÝDÃ4ê:ûv @? @÷y/½ôÒÌ™3¹®¡¾,88øïYžPQQ‘ŸŸFr¹kkkÉç111db"H¥Ò]»v‰ÅâððpˆŽŽÎÏÏ_²d‰³³sBBBsssdddEEE^^žP(\´hÑ Aƒ˜Ïy<¯_»v- `Ê”)LW|>ŸÉè’Ñ={öl@!„Æ.^¼X__ÏuõqÊ£¼Y˜\nhÍ݉\n ¢¹Y)ߘѭ#>|øÉ'ŸÜ½{—ëBP×#·æ\WBu/åQÞjNPÍ­a.7PÑܬ®0£[GÔÕÕEEEá!NÉï!„:§Ý&Ê›ÈÈÈ;vì3Ï}:ŸÏOOOçºĹsçê@ZZÚ‚ 4?­¡¡ÁØØ˜Y†¬©©‰$ Êd²ºº:ÅAUŸ+v•””dooÛËS[[[MMM333CBB¸®EË”••¹¹¹(]'Î××·©©iÚ´i=_Ò§N255%Kà±Èår}}ýôôtæ'/ÄróæMOOÏ .Œ7ŽëZ´ÀøáÃ/þù'×UèW‡²Š ®«Ð”MII ×… ÎvÜDëYòÓär³ºŠˆˆ ½|ôŒº•ÏÖ­[¹®õ^ï½÷‰?D¨»Éåò`_ßWgÍâº>îÇÜÜÜK—¸®¡'Й4BOÃÈÈÈËË‹LÄD¡^ÎËÍíåÇ/¸£nr»ºÐH»àõ4''§«W¯r]B!„P'áõ."‘è§Ÿ~º}û6×… Þ«¸¸ØÐÿîê$²Îõë×q4B6nÜ8²/ÒMuuuø!Ô»ðùüK—.µ´´p]ê½êêêž}öY®«ÐVR©$ ×… ¤Å0ªBÇ-Z´¨ÝZ&“µµµ1kb¨ÑÐОžÎ¼óGäääøûûwødˆÕ,##Ã×××ÞÞ>11122ò ¿ꃖ.]Ïu¨÷—BqKy”7¨Êå‹Å±±±¶¶¶uuuô¹"‘Hi¬·™™×Íj†ñÝ!„ú½ñãYŸÈ‡øvx–ú–t5í5lÆ"xå•â7ƒ_>t¨ÃÆšÐüÒi/åQÞªr¹àÛo¿ ¤óVU±Þ¬¼nº`|·Nª¨¨3fÌ•+W¸.!„º’üÂfÔHosR€† ®\)¾qŠ®_?ÿÇÝSB}ò(oU¹ÜðàÁggg5Ò§«Šþ&0¾[=zôè÷ßonnî°¥L&kmm}Òþ322ª««årùÎ;;U B}Y•ßÁÁëBtŸeeS–.5ž<ÙmîÜ|äÈÀ  £I“õÐZoüx²Íl°¶‘£ak×ò|}¿ÿåV'v»ç‡ÀËÍÙV,’µ«ø¥H‡‰‡›M™¢añi;}z‡‰ò :{öì•+WX'mܸ1..N±/ë]XXHŸÎÊ릛Áãønò9Æw#–ŠŠŠ¬¬,(--Ý·o_TTTYY$$$ÄÄÄ466ÀÑ£GIcÒ’™¤§§G&qV=B½‰¯Rn…ºVø'ŸäKN.«¨X ÿüâ aUÕé½{Ëü¨y~býåÊ•M--}õý¡†Ý667§8ah`öù熩ÙÙÍÍŠE²v¿±ìÅ[Îãö|±³³:t(×U ÎDEEµ›mhhHþnµ±±INNfåo¯_¿¼¼¼¶mÛfbbB?9&–,YÂÄzÓ§¿þúët^7ÝløðáyyyÕÕÕööö§NÂBÄÈËËËÎÎ.++344äñxdÑ×_=zôhf‚кuë®^½:xðàŠŠŠ‚‚‚ààବ¬Y3ÃüüüV¬X³êB\¹TRÂÃàæ;0sòäÿþú«÷o„øùe*‹\¥̶¾¾T&“Édr0¤þûëîä¥B¡úJ”v{èøq2b¼ò 467§fg¿Ê*’µ«ø¥=== ÿXÒvÏ>û¬¾ªcjò·ÍÍÍÉè9–R]] *b½û÷ïÏZÙƒiäy!ŽžžSÔ<"Öü"­[·æææšššN Bõ&#<< ;!AVX(+,€bcs÷ì€ìü|Ò¦¿¹9”WV’]¥s-&Œ¹—.å^¼GŒèðÒšt»73mÙ"¿páЖ-Ì'¬"Y»Š_Jý¥ꓞjèÕ«WwUHwXZZ®]»ÖÑѱÖ̜"ZPPЪU«¤R)ùµÄÓÓóòåË3fÌ “ìɤ wwwÀIA!®¥DEýó‹/æ¾ÿ¾D*èèx#3s`PPÅýûŽ|þúÇëÀ&}òÉÿþ·ÛܹýÍÍë~ýUi?û>ý4òóÏg½û.Lœ˜øÑG^ºÃn‹oÜ8ÿÇVýû‡úû@¨¿¿UÿþäÂ9+WÒE²jVüROzi„ú=HKK[°`וh™ÖÖVSSÓÌÌÌ®kéS|}}ÇŒ£~h™LÆš_DKJJ ²··ÅŸ5ú$²ôÙ³gÉår}}ýôôtòRtõêÕ#Fœ>}ÚÇLJëZ´À8/¯ÀI“¢ß}—ëBú¸Ø””í©©ZôÐÚÎÎÎÆÆ¦¤¤„ëBg0‰i5ó‹€É÷ÁÑ3BŠÈt»²²2@#Ôiÿú׿ȯ H78q¢ÝèέÖrrrè¤Y²0àÚd!„âÖûï¿ÿæ›or]âÌöíÛ;N"äñxiii×®] ðõõf×ÛÛ;>>^,GFFZ[[³š1RRRîÞ½;kÖ,@ ‘H˜Sîß¿...çÎsqqaòy<žª´Bfm2\Z!„Bqâï4½j˜™™½RXjjê¡C‡È*ÀìiÒ¤1cÆÐ§¸¹¹EGGÿöÛoŠg‘´ÂÀÀÀ &Ð “®M¦Kd2Y[[³ˆxCCCzz:óŽ`wÈÉÉñ÷÷744¹\¾wïÞ·Þz«Ã³222|}}ííí###»¯<„žž““xzzr]ˆÖxoá o¿Íu}ÜWééL¸Vøæ›ox<™òŠt‰‰‰FI„ÑTV'½ëáá±}ûv‰Dbnn®ØŒ°²²JJJª­­%]±N‰711¡ã‹HÞ¡Ò´ÂÈår ,Ô̤|±Xkkk[WWGO£g­Å!•JwíÚ%‰Þ~ûm;;»]»v‰Åâððpkkkf›ÏçÓóûšÓïååEO¾‰‰!·m¬‰ûÌdýAƒ8Aõ~ä=###® Ñ&ÆÆV¸ÞB73mŸ¶Öû­Y³ÆÆÆÐ:ë»ï¾S¹Œú•ÂÆÆÆŠ3Yccc™íE‹ 0€îŠ>Eqʃ•VH60°PwГòkjjíììÒÓÓéiô›7o¦O!Óè¯_¿ž’’òâ‹/ÞºuëÓO?577ÿ믿˜íãÇÓóûšÓôäûµk×~øá‡aaa¬‰ûôd}h?G'è#„Bº [ÖÆ„BôôèIù111ÎÎÎ䞊5óžVYY3jÔ(±Xìîî¾páÂ?þxþüù>>>Ì6+ TÌÝguK_‘5YÃÃB!]ƒA*¨§988œ>}ÚËËK“–̤ü7:::š››«™yßÔÔTSS# e2Y}}}AA¥¥¥¾¾>½­~~?=ùžùPý\ G¨³äñöffîUH«F]ÎÉÞžëz8€F=ÍÔÔTÃ4fR¾——×¶mÛLLLȳ^z=ÍÓÓ3!!ÁÌÌL__^ýucccò"½MÏï‡ös÷éÉ÷Ì!ÖÄ}‚LÖj޾½½=NÐG½_]]eøQ‡êÇyy…âq7Ë)(¸pí×U ôp´=x¥§Ñ+N¸gvégÌô¶úùýôä{¥WT„ááH‹´H$⺭1fèÐH|W¬›5‰ÅÚ5€¾víY¯ é¦Ï>û¬Ý?~Öªa]ˆ¬óE–ÑÀ¥¾P ÷!„zŸÏçºÄ¥‚‚}z¿¢¢"++‹l'$$ÄÄÄ·¦ÒÒÒ6nÜxúôirˆÙ•H$qqq[¶lyøð!ý¹T*ݱcG\\yÈ¡4‹»'¿'B!ô”d2YW¥ååœ?/‘J™ÝŒŸ®®©¹\¾3#£K.êVÝåM¯˜ÅÚ«¯¯?pàÀK/½d¯Œ „´G…H”_\ •Év>,ª­}ûÅí¬­w>,~ô(|ξ•9Äì&¤§7‹Å‘aa£G¯^´ÈÙÞ²rs'Mb.ä7vì±sç¸úš! uK”7½j´_ç p©/¤1&‰P$1ê“Iâ б‚LÜ ¯¯/1¥¥¥L² ‹‹ËŽ;>|8zôè¹sçbÄ ê“ÀÍÍëB´Œ·@àâà_\êï_)Åìß?ÊÓSüè‘»“ÓÂçŸÿxÇŽùÓ§ûŒMïV×ÔXôëgmañÒŒ0tà@Seï"Ke2ö3&¹¼‡¾ꬰ°0[[Û]»vq]↯¯o·Dy[XXЫ†a7êzNQhh(“Èš8DŸR^^NÏ¢céiHLÄ …B&YÐÏÏÏÉÉ©¥¥ÅÛÛ0b!Ôžƒ­íóÞÞÐÔÒRS_/¬ª’ÉåõMMW®Xòxä½äë»*.N*“õWXss£c\JJàäɆ~òäÜ‹ݜȡ«WýÇëᯆžÔ¯¿þjccÃuˆ3kÖ¬é–(oh¿j`7zrt!ý¹š$BVú }HMÜ “,8räÈÄÄÄçž{ÎÎÎ0b!Ôž¡ {º¸$¬[gfbòÿ—œŸ=ÛØÐÐÄØ,úõ£w“?ù¤®±ÑÚ¢ß}—éjIppSKK?33îîžW\\]S3ÀÆF.—ŸºpaMx8'_!¤9ýŽ› Ô¥ôõõmll4YA“™S3 ÉÄ¡>úH15wˆ9EÃÂîÞ½[WWwõêÕäädx<õˆÂyG!Z¿ÇMÐßÜÜ„zDïêëë“ѳÒ˜íˆæ%B=#¤ppÔÓ\]]ÁˆAÔ÷TVVÀ­[·ÆáD[„:ËÍÍLöC: ÐH»ua¡Áüùó»ª7„z§¶¶6‹Å\‚;þ<×% .…„„´›M/»[RR²jÕ*¥óG™etE"Ñ|ÀÌí¬Å}q¥^„B!Ôcäry»'Ð̲»wîÜÙ´i“­­­‰‰ Y[W$½ýöÛÀ,£ËçóçÍ›W[[ ¥¥¥àâârîܹ€€zÙÝ„„„æææÈÈHǪ %%åîÝ»³fÍ>|8³¸ïýû÷™®\\\˜ez D¯ìììŒ+õöIÿûßÿH‚BJ]¾|ŸÏu!Z&¯¨(;?¿¬²ÒÐÀ€gnn ¯¿ìÅ¿ÎÊr¶·ŸßÜÔ´M"©‰\l--HK&²Û@_ß’Çëon®¯§W)­ùÏòŠŠÄ©¿Ð®ï¿}ölSccV8ƒîŠI?óûï@ïj$Îê™þ.Ìw…¼q 4hÐøñã¹®qæƒ>På ¯¼ò ÙðôôLHH0£j]&ò->>ÞÄÄDOOnÀJ§YYY%%%ÕÖÖ’Côâ¾tWÄúõëɽ¸/®Ô‹ú¼ÌÌLò¿/¼ð×µ ¤Ó˜(oÚ¼iÓ¢öîµ±°`Ð*E§“O2~þyì°aÏ´¿“))/ÿöر‡õõ­©JïÚ q ¿ 7ŽaãÐÔÔ„¿ ê2???=HKK[°`AÏ\Rýª½Z¤µµÕÔÔ4333$$„ëZ´LYY™››[AAÁĉ¹®¥·“ËåÎÎÎmmm†††wîÜ¡ob‘Rr¹\__?==ßCUåæÍ›žžž.\Àu 51ÎË+pÒ$:…[Ñ£¶6‰TJ&Q¨ÑÔÒ¤kH&“1I઺jhnf’ÃY»ªN'=ÐQˆš|—¤ÿþ7È××ÞÚ:öÀ.KŒMIÙžšZ^YÙµÝv;;;|cG—õô:Ð]¸j/ÒR<oñâÅ8SçÏŸ¯¨¨Ø¿xxøùóç'OžÌuE!6c##c#£›)°ªÇ$Ç8À|¸hÎò2ÁzÀLïj$NSó]"?-°q„ƒTPÏãóùß|ó ×Uh‡ÌÌL—ôôtWW×ÌÌLMÐW¯^¥J×5äýc¡PXTTÄu-\òððPÃIþõPõN êXï"„8‡h„z¯ÌÌLÿ„‡‡gff2¯¨áçç'‰z ¶Þ é:yò¤ª—ª+**àÆøƒB¶dÉêw¤k qP/URRòçŸ~ôÑG˜>}úþýû¯]»æååÕá‰ÿ÷ÿ÷ꫯö@…¨zðàób7B¨›ÄÄÄp]âRTTT»´L&kkk#/––””ìÚµkáÂ…&L`&—Ë÷îÝûÖ[o‰D¢Ï?ÿ<$$ä¹çžët¾¾¾ööö‰‰‰‘‘‘î¡>&33“Ïç;ÆŒcgg÷ßÿþW“´ƒƒÃ°aú¿@ÔÝ»wëB¨ïk÷:pEEEVV(o‰DB¢¼wìØ±iÓ¦ªª*Ò,&&†,}bbb€ôG~ef²¸õôôHw~{Ĺ\þèÑ#¹Î/#Ú¡ÌÌÌ   ò¢½¾¾~pp0YÒ!Ä ™LÖÚÑ*ÎÊ9^"•>Ñ)r¹|Ï?<é…2~þ¹º¦F.—ïÌÈxÒsBjü=€ÎËËKJJ:zôhff¦³³sppðÒ¥KIÒ^°`AJJ i¹víÚ .°: …B¡°µµ•Dœ¤¦¦~øá‡¾¾¾t”7”——ߺuëwÞ!‹0dee’üüüŽ;Ößq«¼¼ÜÄÄ„ü{‚T©¬¬<þ|hh¨¥¥å«¯¾jeeBåàº4„tT…H”uú4He²ß}·iÏžªÈvÜÁƒ¢ÚZæ³›ž³cs3¤egoܽûô¥K¢ÚÚèo¾‰þæ›;Ê~.`šÑW€˜È’j.Á:Ääoëéé‘üíû³B¨Ïû{ííí1gÎÅ(ï5kÖäååuåM慠òvww_¸páÇ|æÌÀ,n„T(**277 trr:xð ³³s```¿~ýt|q ôôÈêûƒ âº-“WT””™yôÌ™ÌS§H˜ö‚ÀÀ”Ÿ~"éÙïÌŸÏ·²‚ÇaÚd—Ó€Ôìì—,ñ3†oeE´íí/Ä4£¯kÃÃ/\½ªþ¬b²rs'M"Ýú{ìܹžúÓêûNœ8A†1Hgõt”w}}}AA¥¥%ùa³¸Rêù矿wïž9µ¤«™™Ù½{ ; IDAT÷0=%ò–‹Ù“¯I¬ãè(ïî Ó¦›©JÿVs V1˜¿Ý}^}õÕˆˆ®«@œIKKëé(o ‹×_ÝØØ˜ü%ŽYÜ©¢8Äé’AëÇ"x¼v²&g©oI·QÓ^Ãf, ¸¸X \¾|¹ÃÆšè\vQQQ=–ðŠzåÝ}aÚ4ÅôoBÍ%XÅ`þ6BÝÄÌÌL£eìT-ÈÏbª"ÈT__ŸŒž fŒN0÷p8zF¨táñi x"ÅÅÅPTTtþüù.ïÂ?¹\Núo¾ù& ûC2NõtqIX·Ž Ó~}öl&=Û¢_?z7ù“O˜0m:|Ip°ª0m¦ë*Ì!5—`îîžW\\]Scom}êÂLD¨ éwÜ¡.egg—‘‘áééÉu!Z£»‡¹þùç”)SŒÝÜÜNœ8ÉÉÉ4228p PÏVõôôÈ6³ÁÚVDކ……ñx¼ï¿ÿžÕ‰†ÝîÙ³È~d[±HÖ®â—"&&&š™™±®Â\ëÂ… ÀÈÈH üöÛoJëWÿõår9™®Fþ W,ã§Ÿ~²³³óôô400 '²Úœ:uŠô¹cDzÁ|2aÂssó½{÷>é?bÔåúQ¿Êö777¡æfл†iÇ8Àü_uMš«ÐÔ\‚ULDHy‰GÏu-=HKKÃ'%OªµµÕÔÔ4333$$„ëZP_võêÕ#F9R“övvvŸ~úéòåËÕ7£Ÿ@Oœ8±°°°°°p„ žžž×¯_777oiiÉËËcÂêXO¬•ÎPóáÍ›7=<<† RRR¢fî„ÒCŽŽŽb±øâÅ‹cÇŽ555­¬¬äñx¬"Y»Š_Št(“Éèá;ëZd¢È©S§üýýÉtÅúÕ}bذa'NœpvvV,cÈ!ׯ_¿páÂøñãɉŠm&Mštþüy//¯k×®Mš4)??Ÿt^TT$\\\„B¡ª²daP5I„¿ÿþû˜1cNœ81cÆ õÿ’ çå8iýðu‡Ø””í©©å••\¢);;;òÒMø!]wéÒ% ‘I7oÞ€™3g€··7kM†\.gF½Ì6y]I&“I¥R04ü{†˜»»;”––ª¯Di·‡jll”H$@"‘466¦¦¦*ÉÚUüR„š‡åpíÚ5 ïum¥õ+­“())áóù7nܸsçŽÒ2þúë/=z4sŠb›×^{)àå—_fZ>*ŸnñðáC`ÖõGu±cÇ>Ìuˆ3;vìh7€–Éd­­­OÚKFFFuuµ\.ß¹sg×Õ†ê!#FŒ€ììl™LF–’üá‡Èò8ÙÙÙ¤ yu¡¼¼œì*Ã@†€¹¹¹ä\Mf*kÒ-™±pèÐ!¹\~èÐ!æV‘¬]Å/¥þÒ™%röìYf[)5S8† ’••ellüÚk¯Õ××+–áèèüñsŠbò5Ép™lW®\!—P÷gŠê~ãÆÓðWAÔ';vLy!PQ‚¬ˆÁÒÒÒ}ûöEEE•••F "¤ýRRRüüüæÎkllLfî8pÚ´iŽŽŽ±±±¤MRR’‹‹‹›››¥¥¥ª~öíÛ7}úôY³fÍž=; `ß¾}^ºÃn‹‹‹ÏŸ?oeeEž+‡††ZYY‘w YE²v¿”&—NNN9räôéÓG•œœÜaýJMž<955µ¼¼|ùòåŠe|úé§</<<ÈôVV›S§NåççÀ{ï½………'Ož$=Ï;×ÖÖößÿþwç C!ÔUþþ5///;;»¬¬ÌÐÐ044455õСC¦¦¦999`oo_XX  I6á×_½nݺ¬¬¬Y³f‘üüüV¬X1{öln¾ ÒÍÍÍÿûßÿ¦OŸN¯Í‚z=ë`äÈ‘§N¢*N±}饗H’âéÌö!CÈm¶Ò )nhØ-ý¡©©)™ X$kWñK±ÞÅd]š?~Ö}å!¤Ëþ@{{{»¸¸äçç“'=L” žžë?<æææ$W£Ñ“ºwï^XXXAAA—/FÖ'999:tÈÅÅ…ëBP—±³³«©©qrrÚ¶m[Ï_üMÏPGª‰ò‹‹ÃÄÅ8`kiYר(‘JãSSÅ­­‘aa¬7¤2ٮÇEµµo¿ø¢µõ®Ã‡Å…Ï™cmaÁló­¬ÒÓ›ÅâȰ0ž¹9¤eg_++ ˜0ÁËÍ-ú›oò‹‹—;ÛÛÇ8@Vt¦¯x¿¶6¯¨HXUµhöìAÏ<T|7øîÙS§rñ§…P×q¡ªˆA£êV–––¯¼òŠš‰HëÜ¿_*•Þ¹s'((HÃSX¯*> '''lccóÙgŸq]âÆ–-[4úOUÄ Q‚õb±xçÎø:¯Î"+)Ý»wëBú &Ê;È×wãîÝŽ|¾¹©é¼iÓ¢öîµ±°˜5e «½ªÄo ã¾AEâ·š+Æw#ÔSpB}Š©©iEE ÃC:ˆ,Â-‰¸.¤b¢¼½Üܶ­^mbll ¯Û׬‘H¥æ OšÔ$~«Êⵉß䇳³â×?~’…ñÝõ @£ž6pàÀÖÖV###® Ñ 'Ožœ6m3½ªCQQQ&¢¾Š¬+:œz`‰º=x5622~üZìÌç‹æÌ!/óô3fz[MÜ7>^,GFFZ[[‹D¢èèèüüü%K–8;;'$$477GFFòx¼”””»wïΚ5ë™gžQÕF,ÇÆÆÚÚÚÖÕÕ$$Hs‘ŽÓ××ÿòË/¿üòK® A\úã?¹®¢¯a%*%ª­ýüë¯Cüüž;:%øDèK˜DˆPxÚ(oæt¡Phmm½páÂÍ›7ùå—Ì霟ïãã³zõjSSÓãÇ‹ÅâaÆ%$$x{{Ëd2¦C¥mÖ­[÷í·ßÚÙÙ¥§§‰k#‘H´zõêO>ùÄÝÝëZú¦>øàÅ_äº Ä‡aNJw`’ž9s](täóåc‡ —Î]¾0q"ßÊjÞ´iµ ª­U%H£Ó lmÉn‡…ªÒ “ê)OåM³±±±°°xôè}zee¥ŸŸŸ­­mcc#«}uuµ………µµõK/½”ŸŸ?dÈÅúè6ðàÁggç~ýú‘£$®÷íÛ·|ùr@kbذafÊÞÄWÅÝÝ}вb‘. ï2I*âñx`eeÕs5õ yEEÙùùe••†g/_õ÷/º~ýVEßÊ ì­­ ¯^ ˜8‘>…‰$Á(kÃÃ?ܾ=, €nCÒ ¯ …)?ý´zÑ"Røé²e榦ݽËlÓ…ë/NÍÎ>´e é–¾dåæ2ëCû»"&Ðu‡vS8TEyGGGÿöÛoöµÿþœœœiÓ¦ÑΛ7/**ÊÆÆ†yTI___Í`¡'eccŽŽŽ\¢eè$ÂüâbK¯¿¹¹¾žžÀÓdýÑi… a`¡š´BL"ì£F²··ÿù矹.qcéÒ¥OåM Ÿ4ié9ÝÃÃcûöí‰Äüñ²—K–,ijj"c‚ää人:kkkHJJª­­%ÛªÚxyymÛ¶ÍÄÄ„üAâ©Ñ¹×‚ñÅ\„”b’inNNÑß|óÛµkô‡?ÿU”wll,³=}úô(Íz066f­ûË£G“m¥Q‚4VZ¡E¿~šªI+Ä$B„zÆS­½zõꮪé33³çŸÞÒÒ’ëBú8úµ`Ǽû;zôhúÅÜ«W¯<¸¢¢¢   88_ÌEèI©šMA(F ªI+„N².I„õ RA=mÀ€ÇŽ㺠­QQQ±aÆ7:)¼¿¯ýZpNNóî/ëÅ\­[·:99‘šðÅÜ>¼.Ç©±ÜÁ´B„ú}® @©S[[»wï^’Žñ¤”¾töìÙ+W®444€§§§ƒƒÃŒ3È<+òb.i‰/æöI·o߀?ÿü“ëBÒb³gÏ ⺠ę7nàh„ú,æµ`Ö»¿ô‹¹@ Yù_ÌE¡íÛ·ë—V­ZÕî ´L&kmmíÉ rrr$ ³›‘‘Q]]-—ËwîÜÙ“e ¤SX/æ²DDD 0@OOGÏ!„RíÐYYYd;--mãÆ§OŸ.-----mii!ë–––îÛ·/**ª¬¬ŒÕWJJÊ_|QTT$‘Hâââ¶lÙòðáC5§“Xïèèè;wî•Ë­§§G^ÿïïBiB&“µ>^¹L.—ïùá‡î¾¢š«düüsuM\.ß™‘ÑÝe „ý=€ÎËËKJJ:zôhff&¤¦¦~øá‡¾¾¾B¡ðÿ±wçqM]éÿÀOØ÷%„M@\‘âŽ,‚ VqÚj¥ZE§_­:®µuܦbqiu°àBQqDP«(-esEEQˆ¬YB€²üþ¸?o7ƒ"7çýǼr’sî}ÀNr¸¹ç|ØlvKKËÍ›7Bd”w||<~ ŒŒ "‹ÛÕÕ5>>ÞÝÝ=44tÏž=2†“±ÞÖÖÖ¡””???âh>>>°Î¬§b³Ù&&&wîÜ¡»å ««;~üx"=@£r'%3“x~â±'†H,>xæÌÞ“'9uu”þ…löñ ¶9R\^^Èf²ÙÍ--iyy¯_ÿùÔ©øÔÔ¸ÔT„PDBBxL ¯©‰ŸšºåС̻wñ³ „b/]ÚuüøƒgÏ–×Í`0ˆ¼înùþö÷z̘1‹-š:uªt”7eL»QÞ¥¥¥dwEEEß¾}‰øn9‡#XþßkˆÅâššüÖ ƒ­­mZZZ¿~ýè.ô¦¦¦!â²_öƒG“’.^¿ž”žŽZ÷å—· BDøöÒ  –T::»²RUE%tÖ¬ø«WÙ••ìÊÊàfAAúíÛ#®árï„XàûìÙ³ØØØY³f½|ùrëÖ­:::/^¼ _¹rOGÅÅÅ>}šø;™XL<^·n݆ ‚ƒƒñ3úúú’¡âÄpÊŸUˈéî(ñ[FF7ŽÁ`àÝ ¯zA ènß|ó ÝU(§OŸúøø¤§§;::vj ånmmM|ÛSQQáããC¬ñ¥ ©¨¨2dŸÏ···Ÿ;wî¦M›‚‚‚¼¼¼ÈÇ”$p„-8î匔eİz¸›555!„ˆJÐå ¦€^&Ð(4‘HTUUõ~›–Ë‚¶lÙbii©££ƒ¯ñ¥ôoll¬©©a³Ùb±˜Ëåæææª¨¨àV¯^-‰Ú]…†/ &Ÿ”qFô6<Vw‡ƒ"vß¼ŸÃ‡ëȼmôl§Nj3¦,9êø’#,?àÑ˂œœ~ùåMMMâZ/¾Æ׿ÿˆˆmmmb9Ô¼yó444ˆ7ü1žްǨí²`ò%é3’«aõ0@éþ‚^+..®ÍÌ•\r„°…AÄ⛬¬¬ &RÖ‘bccËÊʦL™âì쌯êh¸žž¾ä?¹üHútäY\]]aùrÂ'¯ø_é¥Àd¿ÆŒ?–Ž/ n÷ŒÒ`õ0å¢@I„¸uëÖݺuKútøY„*§–––7nH߀ h±ƒÏžx”÷º–—'‰>ü8œººíÛ—Ñq°+$~ð‘ü}_r„Ú&JÚnÒ.O!¹fHÎá2àýñ³ X~¤œ***¼¼¼rssG½Ýã È`nn¾oß>KKKº  ·+çpròóƒ'L‰ÅQgÏrêê–Ìšejluö,_ ørêT–‘ñÙŒHHhâó—ëéèħ¦>..ž0r¤“]رc9ùù!Ó¦Y›™QÎBQSS ‰±23³µ°°±°@Ù˜›gÝ¿ï;byv “™ãÆÕ½]J9;™ø"¿ý==»ù—@OÕfã÷Ž’¢¢¢dÈßßÿСC‘‘‘wïÞ%Ö mܸ‘H"”1œXrD\œ–~ôvùñ,?=’‰‰ÉÊ•+MLLè.ô}ûöEuvS€Gy«ª¨„Íñó‹½t‰å7)1ÝdF7ËÈÈËÍmÍüùÒ³g|ÈéË—'Žå;|øÍ‚< ?;e8¥HüþxþýïÿüóÏtWhcmm­@I„D”þ”³Àò#xdœå]Áá„ÇÄ éߟ/P¢¼ñ&%¦»ÝŒn |ÈÙ´4[KKâ«`, ?;e8¥Hüþx<Èd2W®\Iw!€T”$B+™( ¾€ –Ð|_Žv¼‘6ÉGFy767×p¹ìÊJ±DB‰òÆ›2bºûYZîõswéìŒ?ñ÷òÚÙÇÔTGK OÇÏNŒJLKæèØÇÔ”R $~ðñ(J!„ÐåÈ}u8¹ã………ì(o"²!„o’CnËãííMn’ƒÚî“cccsðàÁÚÚZ77·ÀÀ@Ø$ô0d”w›ˆõëµ55ÿÿ†X”7%ÙéÆ3ºC¦MklnÖÕÖ¦œ‚i`€ùe;@pøÜ9{++< ?»—››—›1œrvHüàã Ðݬ­­KJJ,,,è.D9477ççç2D[ê³V6<Ê{ÆŒdÈöÉ“';Šò.))!#»QÛ\n<¯›ÌèFØ>9¿ýö›••Ussó˜1cdtƒ ŸûR.0ãM1ÝĤ£¿ñ!ºÚÚêjj“=ÝUÚ¬ZµêÝQÞ999!wwwÙÇâp8;wîœ>}úرc‰gÈE~í’sa±ÉÜÜ\"‘Àj$ä„遲ïxÓQ”·ÙÁóºñ&¾ONrròŠ+>Œ`“=TQQQûQÞøZ"—}õêU"L[(vÓ=sæÌºº:„ŸÏß½{·‰‰‰ôEŽŽV)á ›ª««ÿüóÏÊÊÊE‹Y[[ãK‘ ¬FàýûEÊå:ÈåîÈÔ©S“’’¸\îæÍ›‰g`“ГˆÅâV¡P³íVt9ùù!÷!Cð'ÓÒ¼‡536Ž<{vYpp·V èO ñ%G®®®øZ";;»I“&ýöÛoëׯ'bº‰HÄw²fff7oÞœ0ay¨S§Nùùù™šš&$$PÎ×Ñ*%|a“¯¯¯±±ñܹswìØñÓO?áK‘¬FR~µµµ»víúæ›olllè®tå8ªªªAAA]u4 ™D(‰öÇÅñ[Z–óš›Byéhi¹88 „ ÿ€Þ Ã(or-j¦-;¦›ðæÍkkëv¯]u´J‰²°‰Éd$µ Áj$%W__¿k×®Y³fÁZýû÷þüy§~W·oߎÿx%EÆårew ¶sÑÓÓë–rzŽìRsrŠ+*ÔTU››Ý‡ dk»'6ÖwĈßoÜhk:kÑ3%#cЇñØgذáá0 çis ¹äˆ²–G¬@b2™DLwXXØíÛ·ÉW‡ °eËKKKé›,Û]¥äçç‡!síÚµqãÆ¡·K‘È}ga5èU444äïÏ`0~ûí·ß~ûí㕜ì”Abøóµ³ð$ÂÝ'Nø nbhH\~´¶V×Ö’=!ÿ¯7ðööf±XçΣ»@Y³f1BñññsæÌ¡¼ÖÐÐ@®%¢ä $>ŸOÆtãššš455)WŽÛ=2¹J‰<ìµk×B£G&×?=z4 €XD¸{÷nE¸Ÿ²¥¥EKK+))iúÛ]6œŠ‹‹íììrssGEw-  ŽŽŽ6è`ó]PTTÔ¿ÿ[·nÁ6vòîää7z4‘"‰š[ZôutŠJKЉaøN|Ìñššj¸Ü…¡‚/ò= ™6 !t³  ¤¢"»Å´kwl츸’Š º ‘—©©)“É|úô)Ý…Út¸ý9y•&OL7yíYz‰åÈÒ ›œœœ(K‘ †"ÌžЉÇã]¼xñÒ¥KŸ}öݵ€ž†L"t°¶>°v­P$Òiïòÿè >zÊ{,Q²²²ú•¡¡¡ñÉ'ŸHßÞÀ‡»rå ŸÏOJJ‚ 4ø¨4ÔÕ5ÔÕ;zòÿèñ Ht·>}úÜ»w¯³¹z½Öëׯøá‡×¯_Ó]ˆrHJJRUU½té±ø` €Bãp8;vì€ ´M¼„w#±X,üyb¼££cDDÄìÙ³;: ß ÙÝ=LYYÙ¤I“ââ↠Bw-J@SSÓÙÙ¹£ý"éÎ;¯^½"‚T]]]ííí“’’(7) …¿þú‹¦Ž{÷Biiit×B3OOÏNý?‹Œò‰ÅQgÏrêê–Ìšejluö,_ ørêT–‘ñÙŒHHhâó—ëéèħ¦>..ž0r¤“]رc9ùù!Ó¦Y›™á§(d³³<`WVÎ÷÷·67'ÃEbqGCðSð‚ð˜+33[  „¹yÖýû¾#F[˜˜Ì7®®¡!D©A9r{w”7¸ª¨¨2dŸÏG 4¨So@UUUÆÆÆ³gÏî(ÖIÅwÃW±=IkkkAAAss3Ý…(‡GÑ]…HJJ²±±:th``àºuë¦OŸ~þüù°°0¼OSSÓĉéªP¡ìܹsçÎtWA³ââb[[[9;ãQÞ3|}Cƒ‚ž±Ù±—.Í?þeyùÖÐPbOè’Š ²y%;›/8öëqæÌú âRSOÿø£–†BÈËÍmÍüùZoHìÊJU•ÐY³~KI±63#ÃwüóŸí¡œâôåËG271I¸z•È?436¾YP0aÔ(²à5óç“Ãñj‰g ‡\N@EEEM ’õ^rEy“Û#GŽlll¬©©a³ÙÒ“Z¼[GϬ^½Z$éëëË8 ß ÙÝ€w"bA FJJÊüùóg̘±oß¾'Ož8::Rz&$$Œ?ž–"‚¸}û6ña'?<Ê»‚à ‰Ò¿?_ °·²šûé§› ?ÞËÍ oVÕÔèêÌž8!4ÈÖVzÆ,Í‚ÅÒÑÒj +8<0¼]”Spêêl--‰Ù0!2C/N)A¹Ü¬¬¬ ‰°7Û¹sg› ´šš‘ÿg``0oÞ<2p;$$„ Üîß¿DD„¶¶61ëÅ/ðàÝpøóL&3::º¾¾ÞØØ!ÔÑYœ³³³«ªªÌÌÌÒÓÓ!} CQQÑÇþùgòOOOSSÓ¤¤¤ 6P:˜˜˜to@±¾Ç( “OÇŒA567×p¹ìÊJ±DÂmlÌ}øÐPOøLÄ›ÞÞ«÷î‰ÅúR¹Qý,-÷ÆÆú¹»tvîèt3ÇÛ~äÓÀ€¸$ÜîÊ)ü½¼6GFö15ÕÑÒ²³² ;vìöãÇ”‚‰‰iiÃõttðâBŸº»gܹcoe…ºYPà yï´gðàÁ „P||üœ9sºð¸ÒñÝ]xpÑÒÒ¢¥¥E\ô¢»%S\\lgg—››;jÔ(ºk=DKKËo¿ý¶dɃ¡¢¢’0{öì””OOO&“Ivãr¹†††—/_îìÕGÐÃäææº»»Ës Çp''¿Ñ£Ã–/§<ߨܬ­©IÌ;šš4ÔÔ4ß^]Æ›b±¸žÇ360>rcs³®¶¶ì³ Z[ñÀðv‡PNÑØÜÌŸ;·!$„/hª«3 JÁ8Jñ¡£çÏx{›ï>q¢Û’wÇÆˆ‹+©¨èžÓ}8SSS¸ÝË}”ÛwÞ#¾ô†††ßÿ}Ÿ>}è.ôšššK—.EI°oœ§M›F_E ‡Ã'²” ÌxSEE¥ÝÙ3y„Ý'NÏÌŸ:Õû{I†w4?…®¶¶ºšÚd„~ÇHG“ué«ãC€<àþwÐÝŒ·oßNwJ£¨¨((((11±ÿþt×¢æÎÛ·o_º«@.ø’¾®¢¡®î6pàûV L Ph---÷ïß'6½ïÄ`0N:Ew Ë·H`)P0›7o622¢» @›ßÿ½+“Ä”CŠü£äï#£¿œÝ(\]] Æ'Ÿ|"Ogy¼_ï< ƒÁPUUµµµýí·ß>¸Fè´|ùòùÿöô¿þúk§“…BáÞ½{üñÇÚÚÚ¨¨¨­[·B|  H$äÅNü1-È)777??!ôàÁƒ¾Ø…¿±XœŸŸÏf³¿ýöÛ.9 Ðåï tvvöÑ£G/^¼˜””TRRòòåË¥K—²X,2JÐÚÚ!ïîîºgÏ6›mll¼jÕªýû÷#„RRRüüüˆ£ùøø\¾|™– (8¡PXTTÔîw(š'OžxxxhhhØÙÙ]½z!mkk«®®Nlà }¥VþË·Ä«ÁÁÁzzzÿûßÿ(‘ó°‡F999‘¥‹¤4¥(‑‘‘ÚÚÚ”³çºuë–«««ººº««ëíÛ·Û­_öÏ`0ˆ›‘†Þ‘ñ²´´ÔÐÐðõõMLL쨞.ÔmQÞ MMGÏŸï’ɱ޼·¿'ÐcÆŒY´hÑÔ©Sg̘Af^¿~2 ¢¢¢oß¾&&&<!Äd2 ‚ø@ ŸÒÒÒþýûß¿ŸîB”ƒ‰‰ÉúõëMMMé.¤—úòË/³³³³²²Š‹‹ÿùÏ"„þïÿþÍfgff–”” ìöÜ÷¾RûÓO?566nܸRÎÃòx¼øøx555âãââˆwfJ‘”¦ôE mnnîèÔ .ÌÏÏ¿víZ~~þÂ… e×ß.ƒ1|øpƒ±xñâvØÑ):ª¹¢¢¢  à¯¿þš7oÞ{ÔÓYåNJf&BH$.d³£þ÷¿­‡IÇ»ñ‚íGŽD''§åå²Ù…lvsKKZ^^<ËÈhæ¸qÜÆFb,¥x2Ö›Á`±Þ]þ+@yµ¹…CváÍ›7B3gÎܾ}ûƧL™‚Љ‰Ù°aøqãBD| q(ˆ K˜››‡……õÈÍÔ?‰DÂ`0Μ9ÓU¼{÷.BˆHW-**BMš4 !4f̘3ftTƒô”¸¸ ‹E"BO&"W eWÒîaOŸ>Íãñ„B¡«««P(äñxqqqÒERšÒ?Aö½Î?Fyyy‘Û­_Æm0‰¤  @"‘¬X±¢ÝvtŠvk>~ü¸››ÛСCBø7Zrþ>;+ûÁƒ£II¯_OJOWUQ šãç{鑆½4(ˆed„Þ†cMÆ]ÎÊêÚ_©R‹ŠŠ‚õʽ™®®n› 4%‰pãÆ¡o¿ý–xçrpp8pàÀ?ü@Lµ¿üòËM›6a"ÎÎÎ"‘ˆXD˜žžLÃÏ]gðàÁ¡ÔÔT±XL|«vîÜ9âJAjj*чxÛ$.î¢îa Þ?322ˆ±ò¤ÉsØ#GŽ „NŸ>-‘HNŸ>M>C)’Ò”þ¡dŸš@Ü%rãÆ òq»dßÁBÌtõôôÚ= ŒSH×¼}ûöû÷ïgu׬nŒ«ë¢3¦zyQÞkþ9ûÁ<Êûú½{ Ǿ~ïÞ{Dy¿©«³63c ¶1Ý”C1 tu­­”áx7"Ö›8þo€ONùY Ö[†ï¿ÿ~ëÖ­tWhsúôij(I__ŸHØ&àÝ:::!''''''â­–°hÑ"b!„oz€ØØXŸÀÀ@ b+n[[ÛqãÆYZZ’‘«Gµ±±±³³“}üøññãÇO™2Åßß„ Çç©ßyØüüü¼¼<###âºòŒ3ŒŒŒˆ5…”")MéJžSGGG»¸¸Œ?~È!ÑÑÑï¬_ƒÁ5jÔˆ#ˆKwÒ”q éšúé' /¾øâ=*y?ÒQÞ­B¡ì(ï÷ï?,*jx{‰Èå¾YP@y>ÀÛ{Ë¡C{Ož$“Ã)‡Š¹paÃãFŒNv#b½‰CÙYY%\½õ¿ÿQŠ'F%¦¥•WWSŠGoc½‰>ë ÅG‰òî Êû½A”7øx$ å-ý*Dy‚"Gy7ñùšª**”áäãkyy¡Ñ..Ò!‚”!õ–þYº-Ö¢¼Ò ÐÝ,--sss‰/dÁ;µ¶¶VTTXZZªc‰¾z}¼(o-­v‡“úõ#Ï"=ÒÙXoéŸb½èL AwÓÔÔ„kÏò{öìÙàÁƒóóó]\\è®E 0ŒS§N~»ò ÷QÞVØÒCˆõ€.0ô(sçÎ¥»@÷òåËvï½ÄÖ­[ÛL Åbqkk+¾vP<}ú4**jîܹÄ2v‡ÃÙ¹sçôéÓÇŽK<“˜˜èíímff¹lÙ2:Š(."ÅcÅŠ2VûÞ ±±!T__Ow!@Y;É€^ëöíÛíGy_¼x‘x&%%…ˆõÞ¶m[ee%j›òÅŸ/,,,,,lnnNKKCÅÆÆîÚµëÁƒDO¼ÎãñðáøãÒÒÒmÛ¶ …BbZ™ÅbÍœ9“Ë凅 q€lÄÌ$„ ‹bQ×eæäççäçw¶‘ˆ’@d Ýåï+ÐÙÙÙ©©©ÅÅÅjjjÏž=0`@yyynnî´iÓBCCŸ={»fÍ"å{ëÖ­:m—àÏß»w!dffvóæMuuu±X¼~ýz¢[FFÙ¼rå ŸÏwttŒˆˆ˜={69üÅ‹ø)¦M›æèèèêêŠb³Ùä‘'L˜€’’Bd» „|||V¬Xáïïÿñ~qà½q¹ÜèèèÏ>ûÌ‚îZ@ïBlÇyàÀØ…£—#váè’€O¾@°ûÄ CÃzx&"!¡‰Ï_¬§£C>.çpþ¼u«’ÃY4c%?%öÒ¥²êê)®𚛳<¸š›;ßß¿_Ÿ>ø¡Èn¼æf„PÞ£G:ZZ.d^ BˆŒ ô÷ôüð CûQÞ{öìÉÈÈÐÒÒª¨¨X»vmvv6ñígG)ßøóøÎù¥¥¥± x³ªªÊÀÀÀØØxöìÙøpAâ2‚² H\YÔÔÔ¬ZµŠø[¼S¿~ýˆÿSÐ]ˆÒHII)//§» Ðå?~¯°PÔöÃÏD̸sG,‘¬_°ÀuÀâ»>}BgÍŠ¿zNéöûwŸ>uqp@móDÐ]Úòîß¿¿……Åĉ544kjjØlvkk+’Jù&áÏÛÙÙ%$$DEE!„üýý:I±âÍ€€€7n<|ø°¡¡ÞÑ)Bø‘ ‰‰‰Ä‡%‰ƒIGGÇÓÓS§½ _4‰DHDÙеŠJKŸ¿zEÜD³QçãK_¿Ø·/þŒ‹¥£¥Õ*âÃ)Ý­­ÕµµÄcJ^ ‚ÈÀn1}úôE‹Ñ] Í¸qãÚ,"$£¼]]]‰[&ˆ(mmmb:K¤|khhPÖRžß¿¿¦¦&qÁøèÑ£uuuÆÆÆ!###¼]__O<Ƈã?ûì3ò,öööø‘½¼¼¼¼¼ˆ—œ³³³«ªªÌÌÌÒÓÓ! @AL}ÒÓÓkßN>@ïôìÙ3„P«T¶l3Ú».CdZ²XÄþÍÞÞ«÷î‰Åú::øc„PÌ… ×rs)ñþžž«÷í»WX8ÚÅeè A”#“Ãñn¡é¾¾¼¦¦èää…D^ ½•1 "»GVV“ɤ» @›U«V}P!™d‹š?¾¹¹y—•¦ð ‰ð½A!øx$2“ËÊʬ­­»¿* ˜nܸA\$’¡£$Bžˆ:(‘HêÚÍ[Á%£‘hÎdJ$’ø‘@!P:´ôš5kºªÐ{¨ªªš››C®è~Ä"£Gz{{Ó]  Óýû÷gÏžýÞ똥óÿðWß#>°£´BüP ££nd^ ƒÁPÆÙ3Ê‚T@w³±±!¶Dò¨©©9uêÔçŸ_~8â>4++«olÞ©¦¦!D¹uX~;> ø` €B«¬¬\¾|¹¯¯/L åÁ`0x<ž¢¥Az˜tÉ6ˆ@I‰D"¢ô(ºººjjr]‹Å---=~bbbUU•D"ùõ×_;_ 'ÈÊÊ:ßÑ9@IÍœ9³Íÿ8¹víšP(ìÔá:"‘H>,Ïà“ ÐmÈìÕÂÂÂãÇoß¾½¸¸a ©¨m,+‚ÄS!Ê>ÐäÇ ‡Ã +-- …{÷îýñÇ¥7~Â3·ñ!¡øøø-[¶dff"„ÂÃÉêPÛ*‘HtàÀmÛ¶%''#ødt£ììì£G^¼x1))‰Íf«ªª†††ÆÇÇã ©¡‚‚‚ÂÂÂôôôÜÜ\„PJJŠŸŸqŸË—/Óù3€^†ˆì†¼nÁßhüã„Åbyyy­Y³ÆÚÚ:>>ÞÝÝ=44tÏž=”ÁD|÷Ò¥KY,>!·aÃb©ûºuënݺE Á?¨nÞ¼iee¥¥¥5fÌŸL½Feeå„ ž™(¦AôæÍdàö`{û_Ö¬á ‡Ïûõ·±‰X¿^[S“øÂÏÇãÝxMMµ\î<â%g{ûìüüªš3cãô[· qzuzeRÆw«ªªuÕÑ€²ÐÓÓûúë¯a z€’’Å­«­­®¦6ÙÃCvâwGtµµ‰OŠ‹½ÜÜ,Y,ò%2²fÏÐN !TTTtóæMº+Q2­­­t— ¬X,–œû‚„PIIÉ’%K¢¢¢úõëGw-ÊaüøñfXl2]îYÜêênº ø!gáìü!ÕBè»ï¾ûî»ïè®ÐŽÆÆÆÔÔTé=p@» FZZÝUz¸%K–ÈX)z¼œœµ/^Ð]F‡öìÙsêÔ©Û·oÓ]H‡(·€”ˆX,nmm%Ö@#„È•õk×|}}‰]½‰ C/^üÎQ‰‰‰ÞÞÞfff‘‘‘Ë–-ûxåäôŸÿü‡î~üñG5;;;ºËèP\\\mm­"WP^ååå999ÁÁÁ|>÷îÝ&&&õõõB¡pÿþý|>Ù²e”+L"‘(**ŠÃá,Y²ÄÔÔ4**ŠÏçùå—ÆÆÆäc‹ÑÔÔ´lÙ2===„P||üãÇ'L˜àää–““bmmNìÚ‰Ÿ±ºº:;;›ÍfÏŸ?Ÿ¸i‡ŒhE­þoW• ‹Ê»»ÐçÍ›7¡ãÇÓ]èJ‰¤±±‚r½ðìÕS§Nùùù»àËÈ^%RTçÌ™‹ç°â)Ià‹e¥Äµ’­øñ¬Vb8D´ö 9ùù9ùùïÑ â»PLŠ;&çÍä&w g())ÑÓÓ“3+…„„ÀÍv]Ï^}óæµµ5“ÉD2³W+**Ö®]›ÍçóñVü1% ÉŒe%‹Ÿ‘Ìj%^…ˆVÅ'O”7¯¹ùjnîö#GŠËËñ¼nâñÞ“'9uu”nâ»P`Š;þᇈ¯^½¢·hÔ§OŸß~ûÍÊÊŠîB”ƒD"±°°HII‘§3™½°eË–½{÷"„ˆìÕ7Jg¯666ÖÔÔ°ÙìÖÖV<‡LI§ âZ)»É8#‚ðpEò!QÞ!»>}BgÍŠ¿zÏë.©¨xY^¾4(ˆedDé† ¾[]¼xñÏ?ÿ¤» @§NïÝmJKK †ªªªP(ÌÊÊ"rt@¶ªª*>Ÿ/OO2{ÕÉÉé—_~ÑÔÔ$®õv”½Ú¿ÿˆˆmmm" ÏaÅãIà¨m,+×J¾äàà }F"TAD«"ù(o„‹¥£¥Õ*âyÝöVVs?ýtÓÁƒAãÇ{¹¹áÝÄw+°&“ùôéSº ôHLLTÐ tVV–D"QUU‰D¡¥K—>xð€î¢=>y•3{•˜|K?–Þn\+~FiѪ >$ʇçuss>4ÔÓSQiç aˆï@1ihh(è:44!¤««ÛÐÐÀ`0 ¤¾ €nÐ…Ù« G’3Ê{â¨Qăï-Bá±Þóüý5ÔÔ454¤»A|7 KA'Ð?f0††† ÖÖÖ¯^½b³Ù}ûö¥».ÐÌÌÌΟ??ðÃ2ºz‰D"444 ݵêŠ(o2¯!¤/u³â»PLŠ8f³Ù"‘ÈÆÆ†hnÙ²eÑ¢E!!!üñ­u®¡££HwJãñãǃÎÏÏwqq¡»%À`0öíÛ÷É'ŸÐ]èɺ'Ê ÈqŽ  „¶oß®¥¥¥¢¢²páB„Рؾ ‡•+WÂ÷€êÏ?ÿ”s·Ð#íß¿_'ÐYYY¡ ,\¸pêÔ©!@ çÊz‡X,nii!_»vM(vjxGC$ÉáÇå9BbbbUU•D"ùõ×_;uj½\\\àõÞìÚµkŠ8þꫯƌƒÚ°aÃùóçB›6m²³³«««£»4@ÏQ^^N\Câp8aaaaaa¥¥¥B¡pïÞ½?þøcmm-¥¿H$:xðàÞ½{9>!¿eË–ÌÌL„Pxx8¹ GaaáñãÇ·oß^\\,‰8°mÛ¶ääd„et3 "£»[x@'Б‘‘ÄEèÝ»wOš4 !´jÕª/^XXXÐ]èqqqDN;tÁ£¼ñmQÞxd7%—›ÌëFXF7Bæ¾y󦕕•––q2º{Œ§%%«÷î•NN‘Óµ¼<¡HÔ%Ý €n£ˆ‹Iõõõ•••tWºXuuõܹssssMLLè®E X[[Ÿ={¶ ‘_^^^ÿþý™ØŽí3fŒMNNÎŒ3ðç+**|||Úò&#»ƒ‚‚¼¼¼ð—däu“ÑÜ...‘‘‘cÇŽ555EÑÝS”¾~½íðaCCMuu„P$ÚÇoiYll`Ÿšú¸¸xÂÈ‘ÜÆÆgl¶%‹%AhöĉQgÏrêê–Ìš¥¦ªvìXN~~È´iÖffø‘EbqÔÙ³|àË©SBd7K‹nab{éRYuõ×xÍÍ¡¼Gt´´\È$p„‘îïéIÇ/ €H¯@H³fÍ2À6É2H$’Ñ£G§¥¥ÉÓ™ŒòFXȶŒ`m<²uË-CYYY}}}AAAtt4‚Œn%Ôn”·µ™Ù´±cNŸî:`B(>5Õ}ÈР =±±¡¸ÔÔ !!ÞC‡¦ß¾=rðà.÷Γ'x”7ËÈÈËÍmÍüù”Ù3BOùÆ»áÃ3îÜK$ë, ÎŽúýÆ»OŸº88 Hÿ˜-Z´~ýzº«´qssSè+ÐþùçóçÏé®Ð3‘QÞ¨mÈvGQÞxd7>ÏëÆ›'N$|ÿý÷ÉÉÉ+V¬ppp –BF·Òi7Ê›¢‚Ãñ>ÜÄи<ÈÖVKC!¤ª¢b¨§§¯££Â`àQÞ2N'òMž‚^úúõÀ¶_O Z[«ßÞ¾IàOrr2“ÉܵkÝ…zlÛ¶M¡'Ð>lnn¦» @¯@†oP£A IDATlËå:ÈåîÈÔ©S“’’¸\îæÍ›‰g £[¹´åM1sܸíGŽ0 ¦xxtÔòFõ³´Üëçî>ÒÙïFIù&»ëë“Ãý==WïÛw¯°p´‹ËÐAƒBÓ}}yMMÑÉÉ ! €G¡'Кšš¾ QFy«ªªuÕÑ€âølÒ$ò±ƒµõµk…"‘Ž–B(lùrâyâqgjå2mZcs3žMH0ÐÕÅS¾ñnøð£?üP×Ð@D!’IàHàãQô 4Ý%€®×¯_?±X ɉË妦¦Nš4 nƒî*ÉÉÉÏž=£» @§âââ.#£!¤¡®®¡®.û”é2Ù”}d²>œÁ`wüæIà|$ ==ÌžåWZZ:{ölˆò–ƒÁxþü9åF üU33³Ä^¿Ÿ—P(TSëíoþffføýÁòÎ(ï÷öñŽ º–©©)±èµú=ÔØØ¶±tŠÃÛoÉ¥éëëWUUug1ŠÉÓÓ3##ã½§€‚÷Ýöô óæÍSè tdddII ÝU@Ïñðá쬬ììlÊVÖäÄårzè~ýú :”î* çHJJ"ÿtŠX,ny»ñœŒôA‰DrøÜ9„§®î_ûöeܹC¾¹€ô =>xðàìÙ³é®t±êêê/¾ø¢¨¨ˆîBèÎ;§®®~îÜ9º Q>åNJf&z›>(‰4ÕÕEbñÁ3g¶>\ùæ Ñ-üÄ bUËÈhæ¸qÜÆFây2Á`¹€tý €§ÐhÐ#566ž:uêÍÛ ›“““@ ŸåÊ•3fhkkûúúêëëOŸ>=##£¶¶–îÒP>Ó§OŸ1cÝUÚÇ›òš›)Ý Ö[ÙM˜0Éd>}ú”îB=Ž9¢ÐèÔÔÔׯ_Ó]ðw”w€·÷ê½{Eb1LØ®™ãÆm?r„i`0ÅÃòëmoe… Ö%dff¦Ðè–– ü]@QÞLƒèÍ›ëy?==ËåÒ]tBg£¼9uuÿÚ·/ãÎÊc\N~~N~þ;Eév-/Oøa·uA8H¡¯@—••=|øî*@«¬¬7n\jjê°aÃBL&¿Ó½±±‘Ïç“Muuuƒ¶KÝkkkÅb1ÙÔÕÕÕÒÒ"›B¡²s‹‘‘¾á@SSSss3ÙTUU522Âû××× …B²©­­­ƒmõ*‹kkkñþ†††jjÿÿˆÏç766’MƒÁd2ñþ\.·µµ•ljjjêééáÞ¼yƒ7™LfDDDŸ>}ˆ&Ç«¨¨À; 0oVUUáœèèèXYYኊŠð_ ©©)þàóù¯^½ÂûÛÙÙá? ‡ÃÁZZZ666xÿ’’6É066f±XdS P2ðlllðÁºººêêj²©¦¦FÙ°¥¬¬¬©©‰lá RÅbñõë×544ÈtüŸ ººº¸¸?àÈ‘#ñæ‹/ð###ÊoøÎ;ø-éýúõà ¨¯¯§ä“}òÉ'XÊFII ¾½½®®®³³3Þ???ÿ¿€••ù¯jnn¦¼+:99áÿ •———••‘MuuuÊzÁëׯoܸqÉ’%–––ÄñœœÈW…Bazz:ÞßÍÍ ÿ,++×´ª©©ùúúâýïÝ»‡ç„³X,JéééøÿÅœœœðÿD9ν{÷ðþ¾¾¾ø?Æ@ƒQ£Fáý322ðÿííííííÉ&ÇËÉÉÁû»»»ã¿À/^¼xñâïþØ¿E9‡““Ÿ..ž0r¤÷С w0€¬JOG‡ GAâþžžÐ ==ؤI“ˆ<_бråÊ#GŽÍñãǧ¥¥áœœªªªÈæ¾}ûV®\I6ïܹ3úm@.áùóçdsçÎ;vì ›ÎÎÎ=ÂûûøøÜ¿Ÿl®_¿_”VZZJIÕ¾~ýº'öÙsôèÑÿû¿ÿ#›L&“2!ž3gΕ+WÈæ‚ Ž;F6>YA%&&þóŸÿ$›[·nݽ{7Þ¡¡¡ÿø÷ôô,**"›, Ÿ"„ €o¯>gΜøøx²yìØ±eË–áý³³³ÝÝÝÉf@@@nn.ÙÔÖÖÆ§³¡Aƒµ´´Moo ²™™™9qâD¼ÿ±cÇ,X@6CBBΟ?O6UTT( (‡ ‚ÏàñùÜëׯ}||ðþÿøÇ?âââÈæ¼yóRSSñ”Íæ]]]ñ?455ñé,BhxÛÌ ww÷ììl²ùÝwß‘k—šzúÇ‰Ç §T•’‘Af»ø ¶"<&еqãFcccüÿz WéׯŸBO ³³³)׊@`nn~íÚ5²‰_}D­^½ú³Ï>#›ÆÆÆ”ágΜÁ//Q®:::âGáWïB_}õ~ÁLzuTTÇ#›”é²™™åøƒƛӧOwtt$›êR[À†……­]»–lWIjjj”ã2„R¿¹¹9þŒNÛ,´}ûöáé²”Ëá_~ùŸàRfS¦L ÇŸÁ„ÐþóŸ»wï’MÊõu„Ðÿû_Õ××§Ó¦Mw° (p:;;àÏ|ûí·xsëÖ­111dSz£¤ýë_ø/r}!4}útüWôeÛ]×®]‹_°GR¿ÀM›6áÂQ¾`AÍ;·»ÐKùq.\øìÙ3J¼¹eËü˜•™I<À£¼Ãcbl--‰xBøU55xÊ·<˜††ººÄ-NxLÌþýùAéë×ûö%» Z[«Û~ýEÀÂ;N© ‚Ä?Ü‘#G˜L&L {­ýû÷39êÏØØ¸®®N‘+Ѓ wrò=šŠDÍ--ú::^¼ØwòdSS-­9~~aÇŽ9X[K$’ !!5\îê½{݇ 3dÈ'^¿wïHRÒß|ÓÇÔLÿZ^^Ì… –,–§›[àØ±Ï_½Úqô¨]Ÿ>b‰dÕ矯޷oÔàÁ£]\ÞÔ×#„xMM5\îÂÀÀc))åÕÕ~îî#78@fv4ÜÖÒ¯ªàÅ‹¼GB¦MCÝ,((©¨ž0ŽßîßvÇÆˆ‹+i{š"355e2™øÕ ÐÛ(ôÚÌÌŒÃáP¾žº>Æ567ó‚ÃçÎm á šXjX,&S¾åÔÐÔ¤ÿö«¤ÆæfmMM„D"©khh÷PÍͺRßÏÈN©êèùóÞÞfÆÆ»OœP„(D˜@¥£Ð·pP¾Ü®¶¶ºšÚd„VÛ{NÞ™ò½ûÄ òñü©SÍ™L}ìF,|ZÌ`0::T»³gÃ)UA8H¡'ЀbÒPWw8ð=®™?¿Ë‹ÝŒ²Aè…zm``€/t ›Í¦»@§åË—+ôzçÎøjnèURR¢ÐI„ãÆ[´hÝUò&¶HWâ`g=-)Y½wïM©KW‰äð¹s¨½HE"Ô蹆 ÷Pè ô®]»ð€.åNJf&BH$ˆßvøprFB("!!<&†×Ô„âÔÕ…;vìX)–Þ‚â57_ÈÌÜrèPIE…H,>xæÌ¶Ã‡+ß¼AÅ^º´ëøñÏžÝxÍÍy=,*¢*>5uË¡C™wïÊN)†$‰öž<ùctt-—[Èf¿paû‘#ÅØ~ê„Òׯ·>,‰4ÕÕ)g ?q‚XƒHD*r߆ ᡆ ƒÈ5ìâß; I¡'Ѐ"È~ðàhRÒÅëדÒÓo>zdejª¥©9fÈ<ä!Ä22"b­ÍÌ(Gp0`õ_ˆ'òçøùÅ^º”qç‘èú6ê÷7î>}êâà@9T\jê†ï¡Ce §CŠOMu2$4(hOl,»²RUE%tÖ¬x,`’`mf6mìØ…Ó§»€Ÿ!´îË/oµwGeJF†–Åã3lØå¬¬üU úh@@É€ºžDÈkjŠ<{vì°a¦ÆÆòG’‰ƒ2⑉ƒ2†wTL‡ã3|¸‰¡!¯¹!dÁbéhiµÊüxÅÏ"£%Ôõš\Ã1cƘšš&''Ó] ÇìÙ³ú tJJ %s ……‰É§cÆ „ʪ«ëy¼‚/¢““¼½oÜ¿ÿ°¨¨áí] ý,-÷ÆÆJßFsáÂúýûÇÙØÜ\Ãå²++[…BOÏCçÎEž={÷m$Çt__‡èääŽ%c¸t1„™ãÆm?rdãÿ;ÅÃCÎ?‹ô«‰iiåÕÕ¡OÝÝñû¡oø.ç)”ÚóçÏ!E¥7›?¾B'r¹\E®@ÖnarF†¾ŽŽƒµõásç¶/[&=ØQL ™8(gÜ`G‡’1¼£DAk«P$ÒéL<~ˆPCs&S"‘¼w®!$¥£Ð·pèêê644Ð]ð·©^^IééܧO7/^ŒÚ‹$¦¼2åŒD$ÊN#}v uuÊq¤û¼óÔÒÈPCƒ¹† ÷Pè ´ššB— RUQ ’c‡(zå9;d"ðÞ`† Ð žžž,‹î*mªªªúh//¯»wï6¶] táNN ÎöötÒÃ=õª¡©I‰î½\`` B_NJJ‚{ Ðeò¬YÅÅÅtWÑ9§¥¥ÅÊÊŠîB:á++º« ú ô­[·JJJ‚‚‚è.P“'O~óæM^^ƒÁ »z¦ÀÀ@…Þúüùó[·n¥» @9dgg_¹råÖ­[.\ »z2…ž@@~[·nõðð ܶm›"ìì¸\.Ç£» @'…¾º¢¢¢¾¾žî*%@\~¾rå ‹Å1bÄ… ¦M›FwQ=“ƒƒ©ôfááá }´µµuEE…H$¢»@ÑMž<¹¡¡áÆ¡éÓ§———ÃÐ $…¾…ƒÇã‰Åbº«qùùßÿþ7Ñü÷¿ÿ}ûöm¸€D¡¯@÷íÛ·´´æÐ€løåg\„þxà 4Pè+Ðx'Êåg\„àãQè+Ðýúõ{õêÜ È }ù™¡?’¨¨(CCÃÏ>ûŒîB=RRRz½dÉ’ÌÌÌÇÓ]  ²³³=<<®\¹2iÒ$ÊKwîÜ1bÄùóça;ºP`` BO  ÛäÉ“ÓÓÓ7nÜØî«¿þú« \„  *ô>б±±¹¹¹ »@½|ù’ÍfÛÛÛÇÇÇÏÔÔÔˆÅb‹E4™Lfcccnn®»»;}eÐÓ(ôúéÓ§ýõÝU ÊÎή  &$$¤ººúâÅ‹t•@o»ptÂŽ?Nw€6††† }úÞ½{eeetWð·mÛ¶1™Ì Ð] Ç‰'z}ãÆºº:º«ào } ‡ŠŠB—z!…¾­££SSSC< …aaaø«ÁÁÁŽŽŽdóñãÇgÏžÅ;|÷Ýwø<99ùÁƒdÓÁÁaîܹxÿÝ»wóù|²9eÊ”áÇ“ÍW¯^QnxZ±b…ÙLKKËÎÎ&›_ý5Þ?22’ÃáMooo²YSSsðàA¼ÿ¢E‹,--ÉfnnîÕ«WɦžžÞÊ•+ñþ'Nœ())!›Ã† ó÷÷'›à§Ÿ~Âûÿãÿ0`Ù|øðaRRÞáûï¿Ç›çÎ{ôèÙ8pàœ9sð»víjmm%›S§N:t(Ù,..ŽÅû¯ZµJWW—l¦¦¦æåå‘Í>}ú,\¸ïQ[[K6}}}½¼¼È&‡Ã‰ŒŒÄû/^¼ØÜÜœlfeeýñÇdÓÐÐpùòåxÿãÇ¿zõŠlŽ1bòäÉd³¹¹yÏž=xÿÏ?ÿÜÞÞžl>xð 99™lªªªRv•JLL|òä Ùtrr Â;ìܹ tuu%›EEE§OŸÆûÿë_ÿÒÖÖ&›—/_¾uëÙ´±±¡|½¸ÿ~.—K6ÇïááA6«ªª>Œ÷_ºt)¹!”™™‰/ê566þæ›oðþÑÑÑååådsôèÑ~~~d“ÇãýüóÏxÿyóæõë×lÞ½{_ö¤¡¡±nÝ:¼BBBaa!Ù\UUE6=<<ÆO6¹\îþýûñþ ,°±±!›·nݺ|ù2ÙÔÒÒZ³f ÞÿôéÓEEEdÓÕÕ500lŠD¢;wâýƒ‚‚œœœÈæ“'Oñ7nTUU%›”÷X{{ûÏ?ÿï¿gÏžææf²9yòä#FÍÒÒÒcÇŽáý—/_nhhH6ÿøã¬¬,²inn¾xñb¼TTTuu5Ùôòòòõõ%›µµµxÿ… öéÓ‡læå奦¦’M]]ÝU«Váýccc‹‹‹ÉæÐ¡C§NJ6[[[wíÚ…÷Ÿ3gÎÀÉæ£GÎ;‡wØ´i¾µ\RRÒÇÉæ€þñàýúé'@@6ýýý‡ F6KJJNœ8zðàAccãŽ;V®\©§§Gv¸zõjnn.Ù´´´\´h~üƒ’Ÿ¹!ooo²)ýûõ×_[XXÍììì´´4²i``°bÅ ¼LL ›Í&›Ã‡Ÿ2e Ùäóù»wïÆûÏ;×ÁÁlæççŸ?žlª¨¨|÷Ýwxÿ³gÏâÁŽŽŽÁÁÁx‡°°0¡PH6§M›öÉ'ŸÍ/^œ:u ïOy½råÊÍ›7‰ÇMMMšššôb =ƉÅbâ­4jÔ(|M¾w6lØ€O oܸOÇŽK™@ÇÇÇãÓ {{{|ýúõkÊñ¿þúk|}ç샓“e}þüù/^M|ÝÐÐ@9þôéÓñ tAAÞÁÔÔ”2¦¼9 |ÝÚÚJ9¾§§'>...Æ;0 Ê:33ŸßŒ?ž2>}ú4þé8hÐ |]YYI)`éÒ¥øúÖ­[xWWWÊ:)) ó511Á'Ðuuu”ããèGáúôéC™@_¾|ùÎ;dS,ãè––Êñ}}}ñ tQQÞA]]2þ믿ðçO?ý”2>yò$þˆ‹‹ >.//§°|ùrüÍ=//ïäÉ“dsøðá” ôÿþ÷¿ŠŠ ²innŽO kjj(ÇŸ;w.>ÎÏÏÇ;ôíÛ—2¾téR~~>ÙTUUÅ'Ð|>Ÿrü‰'âègÏžáttt(è?ÿüÿ( €2¦ßÍÍ Ÿ@¿zõŠÒaõêÕø:'''!!lŽ=š2>sæ þ7°µµ5>~óæ åøóçÏÇ'Ð÷îÝÃ;888P&Ð/^Ä?þµ´´ð tcc#åøS¦LÁ'Ð………xCCCÊ:-- ŸÁϘ1Ÿ@K¿ÇŽ9Ÿ@³ÙlJ‡uëÖá謬,|‚èååE™@'$$àwåÙÙÙáhé÷Ø… âè»wïâ)èäääçÏŸ“M===|-ýˆO ?~Œw011¡L ¯^½š““C6ù|>> …”ã{xxàhÊ{,BhÓ¦Mxóúõë)))dsܸq” t\\\cc#Ù0`>&ßc+++E"щ'BCCñ ôíÛ·ñ\\\(褤$ü*Œ±±1>ær¹”úƒ‚‚ð 4å=Ö‚2¾rå þG¾H$Â'Ѐrü±cÇâhÊ{¬šše‘‘ÿ éççG™@Ÿ¥€ °]7 &âø_à Wùá‡ú ôºuëð+‚´ƒ©s/wÿþ}…ž@õÕW_}õÝUð7Øæ€N€ 4 èhE^ã€^ÈÉÉ ßÅô6~~~ =^°`Aß¾}é®ào/^¼((( » @›åË—+ôúÏ?ÿ,++£» þ¦Ðh L è…Þ@——/_VVVÒ]EÏd``€gŒ”Ž………‘‘ÝUÚ…ž@›™™UUUÑ]½ÑîÝ7Ó© IDAT»‹LÎΘ1ãÔ©S‡š>}:«“vtËœR^ç½{÷XïK¾ù÷NÚìÝ»÷£>ª¯¯ï?aÔÅïÝ»·téRkkk®kÑ ÕÕÕÑÑÑø¯u >ÏÄôëׯ¸¸X*•r]Òhfff‹- ຎñ¿ÿû¿111­ ?øàƒßÿ]É·xéáéˆ#²²²²²²<==sss ëëë322F%ß,ÃPr0//ÏÉÉÉÅÅåÁƒJFÉ­vËj¦¼Nù÷%_Œ¢6R©T~­ ,_¾<''“y.77×ÅÅåÆC‡åº òðáÃ~ýú]½zÕËË‹ëZZñÎ;›ýõ×\‚¸qùòe^Ï@5êÒ¥K\W¸¸¸øúúr]EÇÈËËëð>ûí7ðôôdúÿç?ÿùã?zyyM™2%99Yþz8Ë<ÖÖÖ–H$R©”ÑÑùï(GGG‰DÊ+i±[%”×)ÿ¾ä‹QÔ¦ÅÑ3BH=|ÿý÷\—€¸ôÅ_ðz»cÇŽ•––r]B¨¯¿þ:œ9sF*•’ŒNœ8‘žžN’6$¯°°<ôz ò˜ CÓÓÓɵ#FŒhõ¥UéV åuÊ¿/UÞ;B!µÇë4B¨[HHHðõõ  …ÎÎÎпÿüã666Û·o'mâââìììLMMõsðàÁ7ß|s„ 'Nôóó;xð`«/­J·„à/ôAåuÊ¿/UÞ;B!µÇë%!Þ¢H¸¹¹±VK±ÚÏœ9sæÌ™-^α!„P‡Àh„B¨Sä¨~•êm”´o뢦Î+XÍ|õÕWຠÄ%^ “““7oÞÌu!„P{Èd2úS‹®ÿt¢­/ÊyÁÝEXXØG}Äuˆ3ÉÉɼ@¯]»ößÿþ7×U „Bãþýû£G …gÏž€øøøþýûëêêöïߨý[˜i]Õg‘ÉÙ   ##£ãdz:i_·í(!µ§¥¥Åë5Ðuuu‰„ë*ÒD………7oÞ3f ×…¨›ÜÜ\²ÑÒLóçÏg6_¶lYnnîòåËéÍÈ[ܹ¼M¾øâ‹~øá“O>™>}:s°ÝÝvAÁuG¼@#„¸òôéÓ¦¦¦§OŸr]ˆº©¯¯ÇÍ:4Y·Û4½#¤ pjÁðáà ”$¢ö!I„\W8óúë¯ßºuëÌ™3cÇŽ%·'Nœ¸|ùòo¼AoF^SSSXXH¯‘`åkzzzfff¦§§3©™­¾´*ÝvHÁi^¯Ö×××Òâu…!„êºÅ¦éQ°š¹|ù2&%k²èèh^Ï@/^¼øÚµk\WBµ_7Ú4½C ÖdM ÒXiii¼@¯ZµŠëPçòóóËÈÈຊV466~øá‡+W®äºVüòË/#GŽì¨Þêêê***N:ÕQ"¢°°°¡¡ë*B½^ ‘Úkllôöö~çw¸.¤{«¨¨ •J¥Øgvvö;w&L˜Ð}"â7ÞຄB¯Јc®®®ï¾û.×Uto> íØ>ÿö·¿éééÅÅÅul·hëÖ­¥¥¥\WBè•à!Ô#####£Áƒs]ˆº±´´Ä4ÿ‘‚Û·oãz›®TVVMMM\Ò:/// ‹ÔÔT® AÜ>|8¯ЫW¯>þü7¸.!„yøð!,X°€ëB4уø¿ÌéÆ\W8³iÓ&^ ‹‹‹¹®!M'•J›ššôôôÚtURR’••Õ7ß|ÒIµ!ÔlllààÁƒ...\×¢Až&&¦®®.$$ÄÈÈ(55uÒ¤I’’2yòäüüü'OžôîÝ ôóÏ?Oœ8‘ë÷ªÈí¢»»ûСC¹®Eƒ‰œÙEÝÆ” žÈQý*ÕÛ(i¯b3ù‚utt pìØ1U 濌ŒŒ¸¸¸ÔÔÔää䢢"mmí%K–$&&ž>}Z,»ººÆÄÄÀÝ»wE"QZZÙ»=%%Åßߟôàëë‹Ûá!„R'8€F<%“Éè,€3f»¬€6]õÛo¿‰D¢÷ß¿3ªêz^^^ÁÁÁ“&Mš:u*X[[655•••™˜˜˜››“''§;v¤§§ëëë€D"ÑÖÖf:éØ-öBˆ[ÆÆÆ={öäº Ä%^/á077üø1}$??ëÖ­ô‘Ï?ÿÜÒÒ’yšœœüóÏ?3Oûôé³yófºý–-[=zÄ<?~üôéÓ™§Ïž=ûä“Oèöaaaôz¬ .=z”yÚ£G/¿ü’nÿÕW_ݽ{—y:zôhúk(MMM|ðÝ>$$„þˆðúõë±±±tƒ½{÷Ò‘øøøÌÌLæ©››ÛŠ+èö+W®¬¯¯gž¾ýöÛcÆŒažæææFEEÑí·mÛfnnÎ<ýá‡NŸ>Í<µ³³Û¸q#Ý~Ó¦Môÿ”€€€ÀÀ@æé“'O6lØ@·_·n½½=óôìÙ³ÿó?ÿÃ<ÍÏÏWýÒû÷ï/\¸0;;»oß¾ß~û­¿¿||ü–-[JJJúôéSXXHO€L&cÐ[윜1cÆ©S§:4}útV'*v+“Éjjj€dÞÊ_¢è…è#òï”´Ù»wïG}DÿÿíÖÖÖãÆc  •H$ÆÆÆàìì|ëÖ­±cÇ^¾|Æ—žžîèèYYYô_B„øïñãÇÿûß?üðC® Ñ8ÿûßÿüóO///® iEyy9×% .Íž=›×èåË— …BúHCCCAA}„µßÍóçÏéò£¥’’ºAee%}¶¹¹™Õ?k£ššº‰‰ «ÿÇÓ X_@‘Éd¬þkkkYOY XÊËËé½zõb5(**¢û$ƒ9†ü`ss3ý´¢¢‚n@݉G‘ejë°©©‰Õcc#ý´ººšnЦ-¢æÏŸŸ•••••åéé¹lÙ²ÜÜÜåË—×××gddŒ5 䆶íðÅ_üðß|ò }[Õ¦nµ´´ÀÕÕõäÉ“mz!úˆü;%m–,Y²téÒö½µW¡££CFÉcÇŽ%GÈmR|||UU¹óððððð€Ñ£GÀ Aƒ222ÊÊʬ¬¬ÒÒÒV¯^Ýõe#ÔnB¡ðÊ•+sæÌ‘ÿ‹:Ï‹/âãã;|W{„:\]] ë?Gˆáãã3tèÐ]»v)j@\uuu™á¾@ J¥S§NýñÇ`Ê”)ÉÉÉÐÚ43¡££#‘H$‰L&ÓÑÑÑÑÑijjR4U¬Êì5]êƒþþ÷¿WVV^ºtiÔ¨QJºUò@þ*/àáÇýúõ»zõª*Ó6ñññ+W®dÝYÉûàƒ~ÿý÷´´´V;Dm²|ùòœœœ‹/r]R&77×ÅÅ寸%®Ԧeq(00×@£nãõ×_€3gÎH¥R²¦öĉéééä iC&J ÉÓ¿èéé éééäÚ#F´úÒªtK¸¸¸¤¤¤…ÂwÞy§ººš,ÎËË{ÅwŠB!þÀ4ê6|}}…B!YaÜ¿ÿüã666Û·o'mâââìììLMMõsðàÁ7ß|s„ 'Nôóó;xð`«/­J·ŒQ£F=z´°°pÙ²e111½zõ Sù]´ôNB!ļ^]\\\YYéææÆu!ˆ3ô¢777ÖŠ‚¢¢"Vû™3g’M!ä/g»¸¸œ?^Ñ É?P±[úàäÉ“™5 .Tñ…˜òï—Z!Ä¡öe 1Î;7fÌö/\EÇÛ׬HÚQïÞ½e2µ‰™™™±±1ý ¤Q–-[ÆëôÇ|ñâEÖF!„PWb²„ !!áÑ£G&L4hЮ]»ÄbqHHˆ¹¹¹H$;;»«W¯ÚÙÙ1‘CFFF‘‘‘™™™ ,°µµeú,//gg’‰ bccÅbñüùó ÅËéJ<<<$IlllyyùâÅ‹{õêÅ\niiÙb·–––tÚ‘@ ÀÀ£6éúݯŒ?ž×K8JJJªªª¸®!M'•J[Ü/åܹs¬]\Z¤b3šL&Û·o_«—'%%•••‘ö{÷îmÓK ¤":K(==]*•†……yxx$&&Ž5jÉ’%;v쀢¢¢¢¢¢†††¬¬,:rÈÒÒÒÛÛ{ÕªU¬á/ë8LTXX˜ŸŸ¿téRKKKE—Ó•y¹Y³f%$$З+ê^N; }:×U Î|÷Ýw¼@oݺõ“O>ẠÔEòòòþøãù4½!š¢P€¿y†B¯ŽN"ê–žußN§ÂË9ò‡š±°°àõº¡¡¡­ À¨ûš:ujPP½'”¼€€€+W®Ü¹s§¦¦†ÞÍÁÁáØ±c±±±Lˤ¤¤’’øk4ÖÌ4j“NŠònßåø±8êbt!P·ôò÷ítú kŸrܤ!5ƒß¬B|ÉDFFfff.X°ÀÖÖ–œ*//_¼x±µµubbâ½{÷üüüH7cú$ËÓéã111uuu!!!Š^…Žï&‹cô êÌVè4%›—ÃËû”ã&å©@#ÞQ¾Ù™¢PU6ACíÐIQÞtF7¼¼º}æÌ™Š^…ŽïÆìnÔe˜$B néYуcÇŽ%ÇIú “ógee…!©^ {ôè¡ü}¤–p³3^é¤(o–W·Ë¿ ~,ŽxEù_rfŸr=«Ÿýû÷ãÔŒ&;pà¯×@oذaçÎ\W¦SåMÖ—3QÞd(MÑ2tú¸¢Õí¬fäcqr9~,ŽâʼyópMvâÄ ^Ï@Ó+YB\a>¿611¡×ÓëËcbb˜(oz庢eèôq%«Ûéfø±8B!>àõ!Ä7åM_¢hu;«güX!„çpº1™L¶ÿþE‹AWEvÓ¯ˆÚ W·#„R8€F¼Fï›fii)‰ÀÎÎîêÕ«~~~QQQd—(Öžh-nˆfiiÉêœÙjlôAºµ³³ËÈÈ(**š7o^cc#óØÞÞ˜W‰DÌ);;»={ö<þ|È!]üG„êlR©´©©‰¬)jŸ¤¤$++«o¾ù&$$¤kCœ ìÙ³ç¸.qÃÉɉ×_"ܺu«üÖ›H]µåMçu+úkÍš5ÙÙÙðrd·¢¸oùWl1QŒŽcE‹Ñ¯HŸÊÊÊêÛ·¯¾¾¾——Wgÿ)!„ºåMçuK$’={ö„‡‡?~üRSS¿úê«ÄÄÄ£G@LLLTTÔ‹/c½ÕÑéÓ§Oœ8Áuˆ3_~ù%¯Ð?ÿü3ó{¤öZŒò¦óº¡¥è/yŠâ¾å[*J£ãÄèÇ,Ì)77·“'OZZZöêÕ«-ï¸ÛP”D555qqqŠžvLD¢£¼é;gò`Ö¬Y ––æééYQQqãÆ ú60Ö!u„K8_m†YX;š)‰þ"›ùûû„††J$cccÖåŠ(OkÕ£GªªªîÞ½¿páÂöuÂg¬$B7hff¶}ûöž={VUU€X,¦ŸÒ˜5FFF̲úqssó®]»ÄbqHHˆ¹¹9} Ó·è­ÐÏ;ÇÜ9³ö>×ÖÖ655566ÖÒÒ¢oã÷/GHáñkß4VôPۥћ)ÚEQ¢AâÄä“«èÔ±“'O®X±ÂÉÉiß¾}öÎyƒN"œ:u*7haaáïïß«W¯cÇŽÀáÃ‡é§ z*.,,ŒN(¤'&&Ž5jÀ€;vìøì³ÏèS˜>ˆ8×b”7³÷¹ü€˜¾ŒõFHáñŽò(oU"»mˆ¦¤ç6Åæ±Lš4)99¹ººzÓ¦Míî„·èé7zÊíÙ³g¶¶¶ÌŸ9ë)ƒ5G'ÒKKK}}}{öìI֌ҧpöqŽÙ •×-¿÷¹››i@߯ãþåêGWW÷U~k 5Àët¿~ýòòò¸®uµÎÛ쬓zÖÖÖž1cFgôÌÌô=å6cƌ͛7ÛØØ@@@ý”ÁšŠSdÚ´iÌd3gïo)Ùûœ¾Ü¿\í[}¤±BBBx=€Þ¹sgMM ×U ¤é˜é7VÜàÎ;õôôÈôðÀé§ VÄ PH?vrrÚ½{wss3Ó§pö!„¯ù„ä ’Ø£££ÉY²K:yŒ[¤#Ôx½i:îîðáÃô†ô„ =1£(ÖNÉä¢fŽŽŽsæÌY¿~ýŒ3˜l𵘊G_ÎJÑS¢»LÑQÞÌmðaÃÈ=ÌÂÂÂEy3· ¬,î™3gæççoÙ²…l~G7:¦3ºçè$BÖ×rèdAoooæ>Ïì_ÎJ"dõãææFžÒ—Ð]6l€—s¸sçNf#v /D¨³ñz­«««<”©fŽgâĉ¡¡¡7oÞ9r$+ŀ΢“J¥t¬™¤ñ÷÷gåÕ±´Ø¬ººúÚµk¦¦¦$àƒiãé驨ZE—˧è‘t½>}ú°z¦ƒôøœÏpwÎî…Þ }êÔ©“'Ovuue¢¼×®]ĺDÑöçaaaG=räˆü~ç€[ž#Ô­ðz4 3Çô$ =y#‘HbccÅbñüùó+**ÀÎÎîêÕ«~~~Šæ~pާ}ôôôÚw3ÓõvïÞýôéÓ;v|ÿý÷\ׂÔ½z;.WåÍÚïpËs„ºŒòF¼@Gyƒ‚ÄlP%4[Ib6ð>4µUMMÍŽ;† –˜˜xÿþ}®ËAê©“¢¼éÀmÀ-ÏêVpñkާÅÄlhGh6Îñ¨·¯¿þº©©éÿ÷}}}#""pu†NŠòfö;' ÌpËs„º^Ï@[[[›˜˜p]ê"-Îñ°&oX¡ÙÇŽ‹eËÏýÎñ¨52ý¼|ùò^½zmܸ'¡¯(ò&‚ƒƒ™f8zîFÈ¢A¤™Ö­[Çëè/¾øâÙ³g\Wº=Ç£(1ÛÄÄD•Ðì3ípŽGýéçÐÐPxë­·"""p!„Pg»sç¯g †Îuˆc¬ÉcccæËmúúúdô,•i‡s<ꇙ~îÙ³'hiiá$4B¡®Áë4B)BO?o½õ–‹‹KDD‡U!„Ò8€Fu?¬ég'¡Bu ^ %ISS×U „xG~ú™ÀIhÔ•¥/—H${ö쉎Ž.//€K—.•——766¦¦¦¦¦¦~õÕW‰‰‰G& Љ‚êò÷ŠØ E"×U ΄„„ðz-‰ž}úìÙ³‡ëB:’½½½òýXzR©´©©IOOïØ±cµµµC‡=|øð'Ÿ|²~ýz²·¦››Û•+WÌÌÌÖ­[×£G?þ¸²²rÛ¶mÍÍÍkÖ¬qvv?~¼H$=z´]TTù~!£¶¶víÚµfffcÆŒùÛßþÆô\UUÅt[SSCºš:u*k/8yòä½{÷Èæ›×®]{úôéðáí­­™Çƒ JHHèÑ£Ç{ï½7pà@¦B+++R¼Á{ï½W]] ¯¿þú±cÇlll˜Ë'MšÄ¼º««ëÆMMM-ZÄ,“KJJòññ±²²úæ›oBBBºæ B\áõú÷ß/))a6G½ºY³fÍš5‹ë*êNJJJ233ƒ‚‚***îß¿_SS#‘H:´téRWW×?þx÷îÝ555S¦LquuݺuëçŸþî»ïÞ¼yÓÊʪ  `øðáÿú׿ÀÍÍmÆ ¬—8tèТE‹H&ËÎ;™ž'MšÄt»xñb¦+y.\ ß®ž|ž3gÎÑ£Gãââtttš››%‰®®.« ýêÁÁÁ}ôQ||<9…q‰HÓðz Òt”·¦=lØ0²ðÀaaa‡ö÷÷ïÕ«×±cÇèËéÈî›7oBKyÝ bd7æu#„hLÌmöìÙÿþ÷¿MLLf̘AŽ9rä§Ÿ~Zµj•L&Û¿iié¤I“T|‰yóæ­[·ÎÃÃÃÙٙ©‰éΞ=ûâÅ‹€€Öè‹/~ùå—ÚÚÚ/^TþBŸ~úé† bcc™ {õêEŠ?{öl@@ÀСCW®\yúôé·ß~›u-óêýû÷ß¿yy9Ó㑦Á4â:ÊûСCL˜öŸþimmmhhØÔÔÏž=³µµ•ß šŽìV%¯Z‹ìÆé„ƒ‰yb?ýæ÷ìÙÓÜÜLrRÆ?~üxæ’¯¿þš<èÕ«½jÙÍ͉¤ÙØØÄÅÅÕÔÔ|;VÏL³ÔÔÔ+dbÈúU˜ÇL?ß~û-]¡|ñß}÷]SS“}¹½½=ýêË–- …Ì,5Æ%"MƒhÄÌ+L›°yóf&Ù‹ #»•äuƒj‘Ý8}‚R…P( …í»V>òIKK‹I‡nµçöe"ªHGG§Åe4ù‰ ŠK|ûí·-,,¸®q&--M¥¹:®;vìúõëÛ¶mãºÔY|||†*9)•J™0m–ºº:===z¶˜¨©©a"»Åb1×ÍÂDv³^%... ÀÊÊjûöíÝëÀÇûõëwõêU///®kAHäææº¸¸Ü¸qcèС\×¢AðGê.y=ûmi,V˜6™{V2£|KàV#»»×è!„B]Œ×h„”ÀÈn„P§Ú³gµµ5×Uh’á‚P·€h„Bè%zzzîîî×®]ãºöxöìY}}½­­-×…´‡»»;ë+.ñ B¡—ôë×ïöíÛ\WÑNä« Ý·þn!22ÒÄÄdÙ²e\‚¸¡Eb?yëøñãë×¯çº „B¨{ضm[ssscc#ÉñFäÓO?]·n×U Î$''ózýå—_FGGs]ê"*FyÓÑÜJr¹; + \ LGqîÓO?íÛ·ï°aÃþóŸÿp] Bê —p ¾())ÉÌÌ ’H$±±±b±xþüù`ggwõêU???ˆŠŠ"»5“\îÌÌÌ ØÚÚÆÄÄÔÕÕ…„„0—[ZZ²^%11ñÞ½{~~~d×Ò³]FFFQQѼyó™ÇöööÌË€H$bNÙÙÙíÙ³çùóçC† d’À€$c!B¨‹mÛ¶­©©éóÏ?·´´œ0aÂûï¿¿ÿ~®‹BH=ñziŽŒŒŒ¸¸¸ÔÔÔääd’˽téRKKË¢¢¢¢¢¢†††¬¬,ÒrÍš5ÙÙÙ@årÛÚÚÒ¹Üôåò/tôèѵk×úøøÐ=‘ÀðÄÄDú1ýr@ŸÊÊÊêÛ·¯¾¾>Ù¯4%%Åßߟ4óõõ=uêTü¡!„íÓO?µ··Ÿ3gÎøñ㇎“Ðu@#^ðòò ž4iÒÔ©S™\îË—/+ Ca¡s¹éËå[0€ìÍê™ §³0§ÜÜÜNžðDåÖ­[¼žž3gNÿþý¹®ucccò822’<°°°ˆg2ºMLLæÎ+ ÉšfúÔ‚ ˜XoÚìÙ³YG˜Î½½½½½½Écúrº[¦11hРŒŒŒ²²2++«´´4Ì5D! 4lذ¾}ûr]âÌÆy=€^¶lÙ²e˸®qŒ•ÑÍ ²åO‘áïöíÛ™#óæÍëÝ»·Š/¤J*8PÁà8zF!„4¯ÐµÃªU«¸.!„Bê ×@#„B!Ô88¶ÿ~žç9577ëèðú_ n‚B]éñãÇ2™Œë*—x=,8sæÌÝ»wÿõ¯q]ê,}ôQii)×U´båÊ•3gÎd¾nÈ[\—€B!''çÞ½{\W8óŸÿü‡×èÈÈÈ_ýÐjlúôé\—Њððp©Tzâĉ#GŽp] B!„¸gjjÊë5ÐMMM‰„ë*FûüóÏõôôšššöîÝËu-!„â^ âVxxxccclllŸ>}BCC¹.!„B¼Àë%qëóÏ?wvvž;wnccã’%KöîÝÂuQH|óÍ7Ož<ẊöÈÉÉijj çºö033[±b×Uh¢‚‚‚C‡q]EG’Éd‰¤›þCPäƒ>èÙ³'×Ut>t„ •••\‚4QxxøæÍ›¿ÿþû9sæ4559::–——×××s]¯-Z´¨°°ðÌ™3\Âwîî¥½zõâº6kjj]]]® i³gÏžõèÑ#??ŸëB:Ý‚ ž>}šššÊu!ÿuáÂ??¿×^³ÓÖÖæº–ŽQYY£¥%011⺎!7”>¾ÿþºººýû÷jÒZ 0óÁò[DÎ?~œÕ‰êÝjiiM›6ÍÛÛ;###33S¾æ7n |ø,]:ÃÈÈðÛoדS66ã„ÂQcÆ,NJ:/߃üK .Àë$BŸììl:ûíÑ£G·oßfžjii7޾ä·ß~{üø1óÔÚÚzèСtƒÓ§OK¥R橇‡Gß¾}™§åååYYYtû±cÇÒ™[wïÞ-,,džš››5ŠnŸ––F<`ÀGGGæiMMÍåË—YïÑÈè¿QFyyy"‘ˆyjhhèëëK·gE3ÚÛÛ8yÚØØxþüyºýˆ#èdÎââ✜æ©¶¶6k¥ï7ÊÊʘ§666C† ¡œ:uŠþ;3xðà>}ú0OŸxðàÍ7ßÔ×××××÷óóËÍÍ•µ6€V¥[ò@ ôîÝ{áÂ…ÏŸ?o±æ«W¯º¹¹ikk÷íÛW&“eee‘§îîîÙÙÙ¬Îøá¡PHFÉ-£üòášC8€ÎÉIôõý›¾¾PGGÛÉÉV&˶³ë­­­eccFÚ;ig×[ ˜˜ôP4Ò}ðàø›ozêë õõ…~~#rsO´:€V¥ÛW/¸®îÊ{ïêõÕÇ2Yö?|!꺻;3ݲz @w¶É“'óz 4B|€k U‡k UÔêhÔáp 4‡^q 4êl¸º­q„B!„ÚШËÏÏ—ÿ^&B!„Pç™7o¯ÐçÎÛ½{7×U þúúë¯YÛz „Buª™3gò:ÊûâÅ‹?þøã‡~Èu!!Ô‘† rþüyÖ®í¨³ 6Œë4”H$=ÚcÊ”P® A íQZZŠk UÇë4B©¥›7ovv¢egg³bžP—éÑ£ÇÕ«·/žf` ×zkÔåž>­<|ø”P(äºîÐ!ÄqãÆá.]‰ìÂÁuŠ$þþûßà.ütó¦èðáStn1j¯×@#„B!Ä+………¼ž¶²²"yTµhãÆ \WB! òá‡òzúÃ?ÄÄÄÔÕÕ…„„ÄÆÆŠÅâùóç@dddffæ‚ lmm9~½‚ÆÆ¦áÃ.]¶kçÎU.dii àСÔE‹¦yx¼§N]­«ÿðÃùðð¥À´€ƒzÿý©C†¸@AAÉðáÿõ¯·;¤0SS#©”ß,‘Hcc(/¯\¼xºµuO‘¨(#ãvQÑãyó&6663mm{ïÚuT,n ’H¤‘‘ßefæ,X0ÙÆÆ’¾¼¼¼’9ekkõGǾÐÜ,a.ú´’éÖÎÎ:6ö±¸qþüI¸Ä¼+ñz!„Ô^NNÎÍ›7%’—æ¢lmm'Ož¼páBVûÓ§O‹ÅbWWט˜˜ÂÂÂüüü¥K—ZZZZZZz{{¯Zµ GψÏrrþ¸yS$‘H•7;u*cÓ¦o. ¬¯o¨¨¨211ºqã~^^±³³ÓfÛ¶ƒ..ýŒ é6ðçŸ\\úefæÜº%€³g¯}öYÜ<|õâß{/08x ë ¶¶Ö’%3fÍòOHøŠŠkkk-Y2=1ñ,ý81ñ̨QîK–ÌØ±#ÁÒÒÌÛ{ȪUólm­X—Ó§`ÍšùÙÙw€¾œî¶°°4?¿déÒ8zîb8€F!.åååýñǬ´eee&&&æææ3gÎtttœ3gÎúõë/_¾Ü©E"ÔQòòŠÿøãa«áÇ÷ú⋃»üüó•Áƒ]ÜÝOžL·²²()yÊ´Ù¸ñý{÷ò Jè6@š™™ïÛ— þþ#7l¦GÞ«´´|õê¯22n‹Å䈵µ¥¡¡~SS3ý¸´´¼_?ëž=M_¼¨W~¹¢W¡/gºutì;gθõë÷\¾|³“Þ j.á@ÝØO?ýTXXøÁp]Bí7uêÔ6µ •H$ÆÆÆÕÕÕ×®]355ÕÒÒ{{ûèèhOOÏÎ)¡W5uê˜6µ¿xñú—_~¬­­uñâõ%K¦¯[ãáñš³³­®®ŽŽŽvDDÈòåÛLLŒvî\EÚÀ¼y×­‹qwwîÙÓΞ½öâE}@€YÔ¡Š¬¬»……¥AA~ª4®­­¯¨¨.*z,¿ºƒ6mÚ?""ö[X˜L˜0ìím¢£üýG™›³.gNyzRt9£ººöÚµ;¦¦Fä‡ê»wïÈdÊþs+&&æ—_~IJJâºÄSüñ•+W233;õU££c^^^§¾ŠzX´hQaaá™3g¸.„ïÜÝݧM›Öî} ¥RiUU•¹¹9ÔÔÔ…B²Tjkk{ôèÑa…ª²t~~>×…tº <}ú455•ëBþëÂ… ~~~OŸž{õeR©´¦¦ÎÔÔ¨Õf/^Ô›˜´óß‚T*•H¤ººªN2ÖÖÖèµ:„mlljn–ê3WõèaÐâåÌ)%—3jjê„B=½öǠܼ):ôí`¡êx=ýøñc‘¨¾6‹Bü·}ûvæñ¼yó”ì0£¥¥EFÏ`llLŸÂÑ3ê.¶oÿ󸬬¢wo òxÞ¼IÌcyZZZ­ŽžI3ùѳꯨ¥¥¥|4Lw¥¼`šP¨+ê2O™!²üXYþˆüå ccCU^u,^ BHs¬ZµŠëê:«VÍ뾯ØõÅ#¾áûº´´ôøñãÓ§OgŽÔÖÖnܸ‘n³dÉ’0Oýõ×£G@qqqqqñ¨Q£º¬ZÔÅ.^¼XRRÚÙ/ôìÙ³.x5™™©ú—á4Yuuurr²&,'àßÿ½¶¶–ë*Bj‚×h;;;ggç‚‚ú`sssFF}döìÙôÓ§OŸ’<¨¬¬äó"oôŠž={&ÿ÷¡3Èd².x5——ghˆ&¶ÎÄÄ$77÷áÃØW ©H,[[[s]BH$%%ñz½xñâÅ‹³ššš*ÊLš4iÒ¤I0kÖ¬“'O⸽"--­)S¦:tˆëBºWW×òòr®«èV¯^Ýî/¢v _"äº ¤’’’§kÖì²²2Ÿ??`È—“'ÓïÝË {·¶¶~íÚÝffÆcÆ Ó××€×_wŒ=ö.ÓjkëÃÂv››3là@‡5kv9;ÛM:Fõ]8!1„Ë‚º¯C‡ñzýŠFŽÙÙû3 „B¨cu¯$B:zÐÞ¾Lxýú½ÜÜ"K™ fÏþgḺº:qHH‘~R×íá®!„ê"ê—DHçÂËÁ„ii×==_¯¨¨¾qãþéÓbq£««}LÌÿ¼z%ˆs8€F!.I¥Ò†††¶^•””TVV&“ÉpYê^Ô/‰^ޤ“µµµLMŒ µ´ee&&=ÌÍMfÎÛy• .£ÎK8BˆÿJJJ233ƒ‚‚D"QFFFQQѼyóìíícbbêêêBBBŒŒŒRSSÉW;RRR&OžœŸŸÿäɲQô Aƒ~þùç‰'rý>R‰ú%²( & ð –H¤¸m³èÝ»7 Q7¶mÛ¶ß~ûìZˆPw”‘‘qæÌ™‚‚###mmí%K–8p`È!b±ØÕÕ5&&&,,ìîÝ»¯½öZIIɵk×&Ožœ’’2aÂÒƒ¯¯ïŠ+pÔ‰½}fÕò®]«éqqYI„‡ý÷˸¤e\ÜF&‰05ug[ 6ÌUõÑöر#ȃ ‚ÀÙÙ.&&ŒNtss"âã7UU½077ik=ˆoöíÛ§Îè7nà†êíÉ“'¬]ê^¼¼¼ììì233§NzîÜ9kkkCC榦²²2ssó™3g€““ÓŽ;úöí«¯¯‰D[[›éD*me9)B<¤ÆI„-æÂÿgˆâèYM¨óº¦¦¦±±‘ë*BHkkëqãÆ±„††J$’Ôíìì|ëÖ­±cÇ^¾|Æ—žžîèèYYYcÆŒéòªzU˜Dˆº5u@#„ÿéèèQòرÿÿÕ¢ 6@|||UU•¹¹9xxxxxxÀèÑ£`РAeeeVVViii«W¯æ¬z„ÒH8€F!>ÒÒÒ"£ç“8zFü÷çŸø¼÷Þ® A ø”••¹¸¼jÖŒæÐyôè×5t±X jüMMMŒZ_ ¦Æüýý Àu!„”ÑÖÖþé§K³fùëéér] jÁóç5?ýté“O´[oŠ`Íš5:¶¶¶\—Ñ¹Ôø îܹsÅŠ\WÁ¥ñãÇs]B¡VôïßbbÂ,-͸®µàæMÑO?]²´´äºnãþýû:°4|©ç›ž\ƒÚ&tJ(×% „Bi"è? ÿà¿æºÔ6:º¸~!„BˆåB\b¢¼333333U¹D&“íÛ·¯£ ÀTpÔ•¤RiCC›w˜MJ:_VV!“ÉöîMꌪj+@£n¬¼¼¼¸¸˜ë*z%%%%)))ðâÅ‹Ÿ~úióæÍ………‰dÏž=ááá?ò4::š„CEEE1t$$$lÛ¶íöíÛ¬n7oÞ|éÒ%‰D"‘¨¾¾þüùó"‘èàÁƒ$„ˆI$¼ ß:ÒD%%å))ä¯eÑÁƒ?EDì/((€˜˜cQQ‡^¼¨€ÔÔˤqJJ:äç—B8€FÝØÖ­[ƒ‚‚¸®¡öËÈȈ‹‹KMMMNNÐÐÐÝ»w“LïY³f%$$@aaa~~þÒ¥KÉ·|Ö¬Y“ éééR©4,,ŒìM;zôèÚµk}|| ¨¨¨¨¨¨¡¡!++«¨¨ˆtž˜˜)))þþþä__ßS§Nuá»G'#ãv\\rjêåää´¢¢ÇÚÚZK–LOL<{út†XÜèêjó?p÷îŸ"QQZÚõk×î@JJº¿ÿHÒƒ¯ïßNºÊå{@`ñâÅ꿎v¸`8d˲¹.!„ØXQÞ&&&ÍÍÍ¥¥¥QQQîîîd;NGGÇ9sæ¬_¿~ÆŒÞÞÞÌåÅÅÅŠöm0`Éý@ “ɘSL`8`*8êZ^^vvÖ™™9S§Ž9wîWkkKCCý¦¦æ²² “ææ&3gŽ''Û;úöí¥¯¯‰ôå¿¥2…/€PWieMFŸ4UF¢ªŒYé6JÚ«ØLIÁª´ië›bzÐÒÖ²u² ‰ñŸåßj!$Žò>tèÐÙ³gß|óÍÚÚÚŠŠŠ¢¢"2¢­®®¾víš©©©–ÖKNœ8144ôæÍ›#GŽ:t¨¢—pppˆŒŒ¼~ýºü)LG]ÌÚºç¸q^¬ƒ>¡¡Ñ‰ÔØØœínÝÊ;väåË7`ܸQéé7û@VÖÝ1c†u}Ù±´2€V}äÚIÚú¢ò+.¿ú›Ê–eÿ‘óÇlÙïGà!Ô>t”÷رckjjÈÓ˜˜2b611™;w®P(ÔÓÓ#WEFF€™™Y\\\ee¥|f!i@8::îÚµKOOO 0I`8¦‚£.¦££MFÉcÇŽ G6l€øøMUU/ÌÍMÀÃã5×`ôh4È1##§¬¬ÂÊÊ<--{õêùœUÐ_Ú¼ºà~ÁÂÑ G G:^;{ NÆŸ è0Rwd@ÿ ¬ÃÃÉcæë±}:qâDm¯¢×H¥R¹\ndd¤í…ôš+W®Ìž=[Û«ÐÈúõëµ½„–-[öÎ'Ðï=€ïxñà ð™ëó¿ßýïo}°(`ÇùŠCÈS^ú1‹Í’Ie2™ älßÿ>ÀÑÍ„åBõ+Q:­*¼<°mß[ßœ}|vÅ+þßÓÿWó¢ÆÎÉNÕ¡¿r‹â¡)ª®!’³³³¶—Ð :;;¿þúkm/uÑÜܼzõjü£:„BŠÞùz̤1åʹyÜiAÓ¨“¼íç¶ß¿~ÿ“™Ÿò~J˜š›¶6µVUT9Œv8É{R© ô^Ñ=êoÃ'M›ôÖCk2­ª±á«Â3¾Î¸í¾Ò‹ÐÝø¦`ÔøQ;svÆÆ}õ›¯NÜ;adbÔ!î O‚5¡xh4Í›7oêÔ©Ú^ꢶ¶võêÕÚ^B!]ôΟNâ%M ˜úùÂÏ}Œ|ÂÆ†@èèÐØÙ±ÎgÛ?£öÙœ±y„óˆ…® ,TͳåÈï9Þœ÷Ç5!k¦NÛrdË[­É´ªLüåD¸[t·w¿©É>“·fn­ª¨Jþ}ò&î&ëáÖiñiï´0ÅC#„ºDØ=ùùù‰DóíÝÛ­¨À!`㑺W"¤åçß’H¤šo§`Èõ:®@“WvÇxŒÙ_¸Ÿüj®0—±PTPPTÒáôãQãGí-`þ'•þªâ §Uó%5ût㛢Í\0ó–äõxኅ~;ôÅCã-«T*++•âñx?þøã¼yó&Nœ˜––&‹ãâ⬭­ËËËÀÙÙùßÿþ·³³3ŸÏ …ÑÑÑÆ KNNË—/wrr¢ç‰DŒí\.·µµ5..nèСéééb±8&&”'Wâéé)•JÓÓÓE"ѪU«†Nçp8J§åp8tàèÆaHHH¾°H7UVŠ‚ÒÈÈ@©T–ž~F$ª_µjqcc Ÿ_"VGG‡¸¸Œ,/ÒOœF¤¥eŠÅíqq‘R©,9ù°@Pº|ù=ÜÐMowr².÷Tk«8..rØ0S:dTÈ0$äm¿ Hïa‰é±ÿýßÿ=yò¤¶WP÷‘%B2+˜••åãã»cÇPäp8~~~ëׯgœþ2¶_¹rE,»»»s¹\2j¨j8#pHfÉ᪦…®CÀÆ!zƒ,²Ù¬ØØˆ%K‚y¼Kd•ȧYYy>>“cc#vìàq8V~~^ë×G;9Ù‘ÃÉíÀèbÈõºÄÄDzôèâÅ‹“ôõ´ª888ÔÖÖΘ1ãÓO?ŒŒ¤vÞ»wïçŸ.‹“¿õ%b<ÕøµïstVŒŒŒÈ$‰‰‰ªQÔéïöíÛé-ÑÑÑ#FŒ O‹Y,=3;T?œÌƒ“S‘ÃÕL»råJú›ÒúÙ3ÒMôù®zFFCŒŒ†(Žb 'Ÿ2º†+W.¢àÙ3ê-†°åÈ–à%ÁoÝé”>üàƒÁþwÄæææ¶¶¶Ú^E‹‰‰).....öööþýïÿäÉ“O?ý´­­Ïçûøø€Â©m7lÛ¶íÌ™3_|ñÅâÅ?ß7½¦¥+žLWUUQWëéV@llìêÕ«©ÉÉßú1ž =,bÈ!„4”ŸŸŸFz,!!A§~MÙ?¨¥z{{õ[ˆ¹s瀯¯oX˜ò[‰Ëårú¬—~LýUL&“J¥`høóM-ÝÜÜ€ºuš}4-cf8r䈗—×”)S€¼e2yžMNþÖ—è­¯B!¤JZZž@#¤g&Mšyyy2™Œº³Á¹sç¨?ØÊËË£ö¡~™N8Aé_æQç—EEEÔØiÓ¦½õÐý3­¢¤¤¤üûßšÞ|ê­/‘â+†Bi®Ë ´L&ëxÓªx\‘º6µ¬¸L«B©Äãñ.\hdd4vìX=zôìÙ³è±fdd8;;»ººZZZªšçÈ‘#sæÌ™7o^HHH``à‘#GÞzhmM»mÛ6##£ßüæ7oŠòÖ—HñC!„4×¥D(ª• J#_¾xy ñ€¥­åã!—•÷üÑsï@ï)þSdRÙ™ô3õ¢úÅ«?ºóHøDÈqà€æ~4÷÷”¸Ui:ÌTKßBùyÂÂBò«B¡±TTTTT”ÒáôãñãǨ:âƒ~›VqÔâÅ‹±k¥‡¦¼õ%R|Å´H&“uvvÒ7¯ÐPvv¶¿¿¿Ý¾}ûâââúhmõ:™LÖÙ)166zû®Êäçßš5ë}CC¶úír¹üàÁóŸ|®ùÌÙÙþþSFŒ°‘Ëåûö‰‹‹ìÞ Ñ ñó t ¿D'¨z^Å6dÏ ›5sÁLw—qžã /3oëÉ­F&FÀb³"b#„O„—x—êjêf…ÍzRò¤òY¥¹µy‡¸ÃÅÝå4÷ôÇñkíB!½B¦¼³²²=zHE°©vw```yy9ïvqq!CÙXÉFú¥RÞ))ÇÜÜ@"‘ÒÃ_½ª§§uv¶OO?#wÄÄÌçp¬ÈÜ·¿‘zFFF?„ÃÓ×3le˜ß|¿Ya³ûž0š:{Q•h׆]%ü’q‹Íf9ÌÔÜÔ€ePWSgfafamÔoßäöîÝû‡?üAÛ«@¨ûÈ”7dffnÚ´Éßߟlw™ï†®¡l¬d#=Ò?)oظ1æöí2 ‡“ÓVTT={V¹zuukj2÷ XüFo“Ýå#¶ö¶¾úªÓÖÒÖX×X-¬–waú‡ú§®M•Ie¦æøù ÔOž>}zçÎm¯¡îóõõuvvÔý@&L˜@ÝïÙÀÀ€q»@2ßÍec%é __Ogg{ ”Jy§¤ò&¹ºº&''«úù eSwîÃJ6Ò/Š)oõ§ªTÊÛÆÆ‚LyûX[›“ÃéíÞÞÕ §56¶Ü¼ùÐÒrØ›ø¼OQÑ]êS€Åo¤÷ï¢`¨Št‹Å³g„ÞIMM ìܹSÛ AÊ=yò¤¯ahhH7ü’““©nnniiit»;(è§Æ}õÕW0qâD>Ÿ_SScggWXXˆ?¤G Ùææ¦0v¬3—ÏHyõÕJ šF>ݽ{ò^¾|ì&‡“Û)ÉÉ€1cœÈáä´Ë–…RÎ8q¢Ÿ_ZSSGýaaáml"õºsê-ÎÎÎPPPàéé©íµ .^¿~=~üx-þï¢¦Ý D(Ïž‘þê»”·šá4ó®Ÿ8¥sßxöŒÞ O ‘óññ>|¸¶WÑ#Ôµ+++‡£íµ .¨K¿ŒE"„B[·nÅh¤Ç”Þ<!„B¨ïLy#¤ë.^¼xøðaøûßÿ®íµ „B¨ëG8d2™¤Sb¤q¨TP “}&wûð+ΤŸùÕÒ_Mìúg³!Z}}ý©S§bbbªªª@*•¦§§‹D¢U«VݹsçÉ“'r¹ü£>âr¹­­­qqqÆ ÓöªB¡«ËhQ¥èZÎ5– /¹x0é`åóJa¹PX.lok¿Up ®ç^?±ëD^V^^f^[sÛµ‹×ö'쯪¨€SÜSGS޶6·@^VÞþ„ý÷®ÝcO*‘O=~hë¡Æ×T0\*‘RÁp’š©è§äTäv™TvzÏéã©ÇëEõ}ñ’!ÔwJKKïß¿/•JÛ-ZtöìYê1ÔX²d Ç+,,ôöö®««»{÷î•+WÄb±»»;—Ëí÷…£î“Édt¨U¤€ªªª 6ðù|±XÌf³---ÍÍÍY,VMM………µµ5~4\¿TVVæää€H$JNNNNN~ñâ…D"IMMݺuëëׯûK¥Ò={ö¤¦¦ŠD"rdee%$$\»v RRR¬­­©!åååGŽIJJzþü¹T*ݽ{wbbâ… €®‚PUð~ýæÑàSY)ÊɹF=æñ.ýýïGJJžH$ÒÔÔã[·zýºÊË…åå¶¶ö‚‚[ååÂ#G.&%|þ¼R$ªON>œœ|øÅ‹—䜊۹ÜS))G››[¥RÙž=§SS‹Dõª†“+jHbâêêZr¸ªi@i ¼o_G¤U~~~*SÞ{މ©‰¤S]Æùn°´±4³0“J¤Œ”7Yÿ&‰ªDö£ì-m-Ûº&…Hê§¢Ÿ2¦¢·;º9~¸ôÃ=_î¹ý~^¤þô§?Í™3GÛ«èMaaa‘‘‘FFJþ¿@=hii©«« …T”ŽzãÆ‡655õÇZQo SÞÇÏÏoýúõNNNYYY>>>±±±;vì` ©¨¨xöìÙêÕ«99ˆ8lܸñöíÛÔ²^\\ìèèhbbâëë XGý‹LyÝ•Éäññ{zŽ#ƒÛ V …ÕííÅÅed[1ÙMal¿r…/w¸»»p¹§Éd·ªáäJ€Œ„“ÃUM X|6nÜøö”·£«ãáäÃî)OyO{ZùÕJضaˆñꮨTÖ›ÎwO šÖÚÔJ"SÞdý›ä4ÆiÃî R‰ÔÄÔºÃi6j¦¢Ÿ2¦¢·›Y˜…, 142Ôü¯!Ò5Û·o§GGG1‚üª™™™ÒQ, Ïžõ™òvqqIMM OJJ²±±™7ocÿÆÆÆ›7oZZZR?AÑC¼½½59Ü?þØÐÐPVVvèС+V`õ3:åòÁÚµ;ïß/Ÿ>݃ÜvuuLN>|GÙ•;UÉnr{h¨ÿÚµ©R©ÌÜÜ”‘ìV:œ\É”)ÈÆ89\Í´X„4º´ÒcÐèëÄJSÞǶ£Ïžo3ÂfˆÑ! M ÅÝ4©‚+Š\BzjýúõÚ^ê'dÊ{ùòå---ÔH»wï–H$¦¦ÌÿšYXX,[¶ÌÈÈÈØØ˜1„.Sè§d üÂ… kÖ¬3f õ'†XGýŒNy[Y™gdü¹¾¾ÉÚÚºöºÝÜÓÒ6¿¹rG¡úÛŠÉn ¹ÝÆÆâÐ¡Í ÍÔÌd²[épÆJqr¸ªi±>õyH%z}t/î†Býë###úÓðÝû„RóçÏ?þ|ccãæÍ›©-XGÚb```ýæb#¸m¢úÊuú»¸î=Äò´˜ÅbÑ33’ݪ†[—íÈ©Èáj¦Åø`ƒ%B¤ÇV®\®íU Ôçzñ7l6;""¢·fCH[Ö÷ìº[‡£A.<<O ‘›8û;!„êWR©´Ë}*d2YÇ»ÜÞ¼TPJÅ»­âqEêÚTêÓšl¹\~îÀ9¨Õï\·ónÑÝž,!݇)o„BH§èb‰ÜNe$¨­®¥¾z,åõ÷…V«Ùá³[[¨“‹$N® #…HQ)o™LF§¼÷ìÙ“˜˜X]]››»k×®¬¬¬ÌÌLàr¹)))ÍÍÍdkCÛËGoA–ÕPUÔ0^ÈØ ëƒH[ú¨DØ"Qýºu;‹ˆëqŒ£P•AL "’.–Éí,6+"6"xIð%ÞO}¬˜1e·™W¦‹¤ÎXF ‘Žë­”7ÙÚè÷o½ºDÈhÒ?A×H!9–±]ÕOPŒÝ°>ˆ´Hi‰²²òö_{sÝÑü£º€Œ” ½âQÈÙ”æÉØ!‡c>»±±…Ë8 ]ÄÄ "éb‰±ÿ® »Jø%bµ?°v]$}tƪ0R8Àܽ{7//OÛ«èM½•ò¦[ׯ_ï÷o½²DH6ɇ€Q¤‘ÛÕüÅŽõA¤-ªJ„™™·iÓrÿ)Ð5%HvÉ” ¹âèÙTåÉØ!c,#XHV11ˆ(Ÿþ¹.–Im-muÕÂj¹Š¨OAvûTwU‹dD 1R8À?~üÆsç*Éñè)FŽŽ@ý´@§¼ѸÐÐеk×J¥RsssFké,²DØÜÜL7ɇ4œJéOPеBÀú ÒU%B˜0a4}ë:²ùGvÉ©È}DϦ*ȈªÁ¨ bbÀìÙ³u±DHnwëÏ7~s?s =¹—Ÿ—×›2§â"A!jˆ‘B¤º—ò&[H—Ñ%B²Fÿ8Dí¦ª8HoWÿ9ëƒH‹”–§L™@îC6ÿd2Ý"%Hî£æpªòбÃìì‚©SÝGŽ]ƒ…deƒˆ¦»%BúéP…àÐ;-’±*Œ"½Ðó”7}â…t]"|üø1Ý´±±!‚®ÅA¹]ÍOPänXDZ¤ªD˜L\wc¤É. ™$÷a gSS%$c‡~~^~o®Ç1ŽBWíì¬11ˆhX"DHaÊ{b4ɇ(Ôé¯âWôYµúŸ È“o¬"]@–Èæ£¼M?¥÷QÌ ªšŠ¼\­&vÈ8(]ijgDà ÒoÔÅýÕÑÑW®\)//×öZPMMMÐÚªäüûˆ†@üá !Ì ¢~vçνïrñšôSPo¹y󦶗€8ºœ@Ëd2I§„ºCEÅãŠ3ég~µôW½™ÿ~Èåòóχ^/ªÿöoß, ˜:sj7ŽÍNOËØíVþ­÷g½Ï6d+›!ýfhh£F7nÜ[wFý©¶¶úè6&“&MzúôiAAA_LÞ§ÚÛÛ%‰ª?cÕq“'OÖöBD—hQ¥¨TPHÅ´-m-©˜ö™ô3õ¢úÅ«ÛÚÛÀ±”cŽnŽð&¦ÝTßÂr!ŒpñàߦNËËÊ{þè¹w ÷ÿ)§¸§Ä­âȸHÓa]î€A'§¥ŽØ!î˜3'.”.X¾ÀÎÉ®?^„êcTz]ýú׿nnnÎÍÍÕöB¾’ÉdãÜL6;»Àߊõ¾}gââ"{qmiNyÊ»ïbÚjÐÓ’Ám+Ž•—ŸWôúh<{FƒL&ëÆ¯õ³³³kjjärùÞ½{ûbUQþóŸÿdgg_ºt‰îb"ô®è”wy¹ðÈ‘‹IIŸ?¯${Ý›{}×®YYy™™yÐ5Ùam¤#T¦¼i½ÓÖ·‘†x<u²2''ÊËË9’””ôüùsàr¹)))ÍÍÍ@_ü£ö|öìÙË—/GŒa``0qâÄK—.imõh KLL7nÜ´iÓ´½¤—È”·PXÍf³bcge]%{ÝPXxÇÛ{R]]ãÝ»ß3’ÝÖFºàäÉ“]2¿JSÞtL[Ò)Q:KAvÁ«ÊWŽ®ŽWO]=›~–ñUÿPÿ7üðð‡–¦5ÃÉ-Œà¶ƒ‹/•W¦P«GèÞ½{TÝz`àóù¹¹¹çÏŸ …l6;666++ëÊ•+b±ØÝÝËå@YYYyyyaa!õGQ999ÁÁÁÔ —/_Öæ÷€.êòsRRRBB^„FÝãëë¹reØüù~aa³ÀÞžcjjÒÙ)©ªmذ‹Ï/¡zÝl6ËÒr˜¹¹)‹eÀHvcXé333å)o賘69œÅn/X¾ ­¥MÃ!BúË×××ÙÙY „……åççÛÛÛ›ššvvvÖÔÔXXXX[[GEEÀ˜1cvìØáèèhbbR©´ë?'2­}h@KLLœ8qbDD‹Åš>}zBB~uò&µ´´‘½n#Ùam¤#4º]/Æ´Õ$»IŒà6ž=£AÂÞÞþÃ?dl ]»v­T*¥ÚrcÇŽ}ðàAPPÐõë×àÃ?,**rss€âââY³fõûªÑÀG]~ÎÌ̤®¤üå/ )..öööÖöÒž¡SÞAAÓ¨-_}µºöº©·‡Çj²Åam¤#úû>ИìFH CCCê,9(è§¿øê«¯àСC T¥ÙÓÓÓÓÓf̘'Näóù555vvv………XfF}¾üL=7o^„F½ËLõ•2²Å ÖFºC*HMš4‰üdÑÆb±¨³g¥V®\I=À³gÔ—Ÿ)x!4híÝ»O ‘[±b…¶—€ÐÀǸüLÁ‹Ð¡AëþçÅÕ;„BÝC]~Þ¼y³âo{þò—¿àí8BƒS—ÿ Êd²ŽöŸnö\ñ¸"umªÒ›ÇÉåòsÎ@½¨~çºw‹î*ºµ©õ»Œï·ßÊ¿%•HÕ/K“}BõµÄÄD‰D’© ¡¡ÁÂÂï „z-å t²ÛÐÐðØöc–¶–Í ÍŒãÕ‹êÉ47=Äd¨‰Ò|7ÇCo·âXõÇK‚BÊÊÊΞ=+“É–-[Fm‘Ëå@Ý®”rùòåÛ·oÿò—¿ÔΑ¾é^ÊóÝH×ôZÊ›Lv_>qyzðtÅ& inrˆª|7¹½ï^„t¦¼‘N™8qbgg§”°téÒ… J»Â³g¤9:å YYy û¯]»W^.,/¶µµÜ‚®•oÀ|7Ò=“&Mêµ”7™ì®¯­·s²³°QRNQ5DU¾³ÞH/¾øböìÙÚ^Eo¢SÞ•••píÚµòòòòòò¶¶¶‚‚P¨|cÊ!¤/È”7dfæmÚ´ÜߊPX-V··w—YùÌw#Ýó·¿ý­×RÞd²Û?ÔÂþã©Ç•îO§¹É!ªòÝŒí‘:::ÚÚÚ´½Š^C¦¼ 33sÓ¦MþþþB¡P(¶··S­EV¾SÞ!ýÁHyO˜0ÚÄĈÏý„®|滑NêÍ”7™ì^ÿÍz#c#[ÉY/™æ&‡¨Êw“ÛÀÈ”7L˜0ŠuP<¥Ñ•oÀ”7BH¯(My»º:&'¾sç‘Ò!˜ïF:¨7SÞd²ÛÄÔ„z ´ÝMOHQ•ïflGhSšòvuuMNN¾sçŽÒ!˜òFé:å o’Ýàææ˜–¶ÁØxõ÷©ŒÊ7滑êó ¶»Òò€äädê››[ZZš±±ñ›ZºT¾1å¨Ïr¨‚ùn¤k°DˆôXTTÔÌ™3µ½Šþ@}–CLy#„Býæ·¿ý-ž@#=æãã£í% „Bhp©­­UY"ì!2%H— B!„ÒwÊK„@d«+ªÀŠcõ⇞3<àïÒ«_͘7cœç8z7Q¥èö¿n‹ªEa+ÃŒLŒÈÜ ].©Dš™–Ù.nŒ‹¬U_Â/©V‡D‡Ø;Ûcq!„Bé>å%B²è:Ñõ»Cßüæ¤ûûîp·è®\&ÿ8þãqžãÈݪ…ÕæÖæ¿ùü7™i™dJº– ó²ò&ûLŽˆàíàU «YlÖâØÅW³®bq!„ðd2Y{w×-” ¥Ý˜]PSS'—Ë÷îÍîÞ¡bP^"$£ XÔ˜_¾x9jü(j¹XÚXšY˜uvtª9ž¨Jd?ÊÞÒÖ²­¹ 8öSI§‹ƒ¨ž>}ªêænzª{)of½Bº¬)oZssÛÅ‹×öWTTI¥²={N'&¨®®%§¢öärO¥¤mnn,£>ðÛßþVy‰l>-}j:Ìtœç¸[·àƒÎí?wfß™Ç÷“»ÀÅ£woÚýËÙ¿"%È8äìðÙ“þã‹̘7ƒÜŽÅAÔ {÷îýÃþ íUô&:åMöº¥Réž={««« 77w×®]YYY™™™ÀårSRRš››³Þ!ÝÖ½”7ÉÓsÜÚµ¿Ù½;‹ÍfÅÆF,YÌã]"§€+Wøbq‡»» —{°Žú@xx¸ò¡…Ù;y,½¹•ùŸ3þÜTßD}‰ÞíVþ­Ð˜PéÔ dJˆr¡Ó§ »7H%Rº´+¿Z XDƒŸÏÏËË{þü¹¡¡á°aè^÷·ß~ûäÉ·~ýú°°°’’’gÏžY[[‹Åbwww.—Ÿ““3oÞÐvŽv½5Bƒ–Ò”wKKK]]P(Tÿüs´´FŸ™Ð»y{OÄ!ê Êoc§Øå&©jt“ȸ‰©I7W‡Ð Ó“accãÍ›7---©B°J¨×‚‚‚nß¾­íU¨Dý–C׸»»?zôö30¤]=)Àòå ZZÚ¨„ ™\¶,ÄÈÈÐØØHq7,¢¾ ü»ÜiEK„Ë–-322266¬ê¿%K–¬ZµJÛ«ÐÇŽ»yó¦¶WºOó! $sƒæ —üÈN!–Q¯Ã ÒcÎÎÎ'NÔö*úƒ†%BFY«„zmôèÑÚ^…Þ¸qãž@HX"D:(33O ‘ûì³Ï´½„B .'NœÀ?ìC!„Bè¼=å­H.—Ÿ;pŽz|+ÿ–Tƒ&B!„Bƒò”7Õë>žz¼^T/, Ë…ímí· nQ»K9FÝa£^T8ùðáäÃ/_¼"ßMÎÉH|“%ðë¹×Oì:‘—•——™§j8B!„ SÞ&»IT¯0Ùúò”wUEUå³ÊˆÕV«jauµ°º£½£¬¸ŒÚ3fcLÙí2°âXyùyE¯¶s²#óÝäÈÄ7t-ß)¼3É{Rc]ã÷w¿W5¡AEMÊ»©©)##CÕSJ~~¾&7fì†Åo=b @óQšï£f w£Ý½{wÆŒÆÆÆžžžýë_{²B40Ð)oF›îrƒB‹›F¿ËË…éég·lÙÏèu&»Q_9r¤ò”·£›ã‡K?Üóåžû×ïƒfÿM#óÝŒ/‘¹o²Îb³†Y3575`¨Ž*[·nŒŒÔö*zò&óÝb±øë¯¿æñx¯^½ÆSšH$JNNNNN~ñâ¨N|3vÃâ·~‘Ëår¹\ñ±V ‰¨¨(>ŸŸ““såÊ•ÒÒÒ¾[Ò dÊ›ìo“]nPhqÓÈâ·PXmmmþùç¿IKË„®½nÀd7êcûöíSžònilyxóá0Ëa,ËÑÕñê©«gÓÏ*ÂÁÅ—Ê++.#óÝj©ª®áp„HµµµÔYàÀ@¦¼É|÷‰'‚ƒƒéÀ ã)Ãáøùù­_¿ÞÉÉIMâ›Ü °ø­ÿ¾ÿþû3f¹ºº^½z:4zôè!C†Œ=/k~™újddä°aÃΞ=˘D“i_¿~ ®®®™™™JÌ¥8!õÀÛÛÛÔÔôàÁƒ½ùò¡þE¦¼Éþ6ÙåV3œñVµ±±´°0ëèè…^7`²õ1å)o3 ³e!†F†FÆF°!mÃ7} ÊßÔƒ,_ÐÖÒFµ É|7mÚ›ž•øV,ñC=P:¡ÁƒLy“ùîÚÚZ'''úVÐŒ§J©I|3öÄâ·¾‹‰‰).....öööþýïÿäÉ“O?ý´­­Ïçûøø€\.§þƼwŸ IDATëÝíËÕÛ¶m;sæÌ_|±xñbz£†Óòx¼E‹?~ìØ±‰‰‰K—.U\0c*U'ô‡òôôLLLüÝï~×½oé:åMö·É.7µÙâ¦Ç2ŠßG^ÌÏ¿9{ö/€ìu&»QßSyh²ãm¤¢DJ4¨ÓßcD7h~ô|›6J÷g ëß NtÊ›ÌwGDD$$$888˜šš@hh(ù”äââ’šš¬&ñMîæííÅo}wïÞ=ðöö€~øæÎûÝwßùúú.Z´èüùóŠCÈS^ú1›Í–J¥2™ŒÚbhøó¿ÔÛ£¼¼\ýJ”NòðáÃãÇ'%%­ZµjéÒ¥Š ÖUMªªªÒ|ÒAtÊÛÂÂŒìo“]nèÚ⦑Åïüü[11¡Ó§{P³Ñ½î#lär9&»Q_ë“J4vƒê:å=vìX2ßýÍ7ßS—Šß{ï=ò)iùòå---ÔÅiU‰oÆnXüÖw“&MzðàA^^^PPuíöܹsׯ_Ÿ9sf^^µ¹¹ySSSEEù¡òr¯\.÷ööEEEÔöiÓ¦½õКLûë_ÿzçÎK—.MJJrvvVº`ÆT&&&b±XñÜúáÇ0~üøž¿hHGým²ËM¡ÎžSÞÔã÷ÞsaÌ@÷º ðìõ5,"=ö«_ýÊÃÃCÛ«è+ä‡4›é§Û·o§7FGG1‚¥&ñ͘‹ßzÇã}úé§ .”H$£G~úôéèÑ£+++¾úê+jŸŒŒŒuëÖ¹ººš››744(çÈ‘#qqqóæÍ€ÀÀÀ}ûö½õКL;uêÔààà'OžLŸ>šSqÁŒ©¸\î¦M›âããS-\¸ÐÖÖvçο6h P•òvt´Sº¡~°víZOy׋êw®Ûy·è®â—J¥¥%·U3!„Ð`£•;^#„}žò¶âXÍŸÝÒøÓÝÉ”w[sÛµ‹×ö'쯪¨"‡3† „Bh` SÞÝèu345µfd|÷NC¨â7æ¾Qýüè~‰ OPõ¼ŠmÈç9®òYeì–XS“òûå`mg]V\6-pÄlŒÙ½iw`d ò621"[ÜǬêxTÊ[øDx‰wi‚ׄqžãfüjÆÄÓƒ§k2!RMMMkk««««¶Òkd2Ygg'}» RSSÓ©S§è?øc<¥äççÏš5‹¼™Rî¦t@Ô †Õ/2;;ÛßßßÎÎnß¾}qqq Qóóó?ýôSm/Do777k{èí*+EAidd ÕëJ—/_àädÇåžjmÇÅEf*•ÊÒÓψDõ«V-¶··ÍÊÊ{ôèy` ·¿ÿz±¸cûöc¶¶– ͉4--S,n‹‹´¶¶Èͽ>¾ääM˜àÂç—…ÕÑÑ!..#Éâ7•û ù@k¯Ò[aaa?ÿ êéëiïl_*(6 ¨”÷œˆ9` Á¯Î4lq‹ªDGSŽŽ<¶CÜ–6–ffR‰SÞ¨¶mÛvãÆ ê”n`¨¬¬‘‘‘R©4==]$­ZµÊÊÊjûöí¶¶¶ÔÄb1ù”F5ºÁòåËœœ¸\nkkk\\ÜСCÓÓÓÅbqLL ‡ÃaìFÏÍÍ}ò䉃ƒƒ\.ÿè£èáb±˜Ü¿¹¹™Ïç_½z5::ÚÉÉ)--M,SG!WE€*„‡„„ôïk©ß,,,îÞ½‹íkÍÉd2¼ÃîãóKòòÏŸW²ÃÂfQ½n#2åÿ1›ÍŠxòDÈã]Z¿>:33ïäÉ­&]“'N\ž>|¸õ©SW³²ò||&O˜0zÇÞ×_ÿ¾¬ì¿ãƪ¬|uóæÃ¡CMØlVlìâo¿Í‰ÿ8'§hÞ¼Ô S׬IÁhÔ +V¬èr JUÊûpòáGoÂ? TÊÛ'ØÇ?Ô?umªL*# ,´‚ì÷©îÃG§SÞr™.½(¸*ðžãíåçÅNéåo!]Åçóóòòž?nhhûäÉgcc<|øðS§NÁ›”7ý”F7ºMLLÈ”wTTÔ³g϶lÙBÝüŽÜ^XXVRRòìÙ3kkkzx||>>&Lرc‡››¹ªœœê†h°fÍ<~WëÖ­Û¶m›¶W¡7Ož<©íU ·ðõõtv¶JÃÂf‘Û)ïª*QJÊÑɓNJÅ0aÂh… [mm½““u¯èª*Q@Àû¶¶–ÍÍm0fŒÓŽãüõÜë…ç «*ª*ŸUF¬Ž°âXU ««…ÕíeÅeÔž1cÊn—]"´s²#K„äìœìf.˜¹hÅ¢qžãÃU ¹|âòôàé¾onsƒÐà!“ÉÚÛÛ»=^)•ÊvïÎJLöôõ [æ7ßoVØ,G7GªDxÿú}0P3ügÝH ªR_[oçdgaƒ·´CoñÏþóرcoßOTVVæääPy<Þßÿþ÷’’‰D’ššºuëÖׯ_@yyyyyy[[[AAAyyù‘#G’’’ž?N%“““_¼xAΩ¸Ë妤¤477K¥Ò={ö¤¦¦ŠD"UÃÉ•5$11±ººš®jZèZ%400 Â„}û:,ä»"+++!!áÚµkäÛÈw¯9¾àH§ðù%çss¯Ÿ?_ÈáXQ%B'';*%±c1¤¢¢êÙ³ÊÕ«#8+rdfæmÚ´œê{oÜsûöO—ù„Âjª>˜•uµ¸ø?TQÅ×w2ääO§v ˜zùò¿ûï›GÈÖ­[»|„CU‰ðê©«gÓÏ*‚*–—ù‡ú?¸ñà‡‡?´4µhxxÅ!Ù¯*_ù‡úïOØ<õx¾54(äæær¹\m¯¢×ðùüŒŒŒÜÜÜóçÏÉd²øøxOOϬ¬,ŸØØØ;v€P( …íííÅÅÅB¡ÍfÇÆÆfeeщA2Ð DzÚNF +**ž={¶zõj‡£j8¹ ·dÉGW5-äääÓ\¾|¹^Ï|W@ffæ¦M›üýýÉ·ïèúšã Žt‡¯¯çÊ•aóçû1J„UU¢Q£ìé” ÉÍÍqéÒ¿ürbEi¡B×=<Æ\¸PÄáX n X"D½ÄÃã?J„s?šËØB ·°±PZ>røúoÖ±Ø,@hÐ K„'Nœ?~<µ þ€yË[º ¨áQÞ5RøâÅ z%ÔbèD"9\Í´Œ*!`˜ð]ï ˜0aÕTg¼  ë;KHg)-2R‚¤ÆÆ–›7ZZ£nŠOñöž¨Éá~üñUCCsYÙº°bÅB,¢Þ¢…!IU}ÐÄÔDͨèaHHÈÚµkïß¿?}út2ø®®®ÉÉÉwîÜQ®*HnW)T:œ\É”)SÈD"9\Í´d•0LøîèwIÍÛ°ÙgÊËË©_Åè2‰D¢ø†ÑªJ„dJdaa¶lYˆ‘‘¡±±c£PH? šF=øê«•.­Yóј1NÔŸb‰õ,"¤Cè¡••UFFF}}=U3!ƒnnniiiÆÆÆä/…¨. ÒÄ c»ªH¡Òጕ0‰äpUÓÒUÂ#FÈår ¾+ú]o‚‘ ð6`"±ÙGäry{{û×_=jÔ(m¯EGGGm/AStqL ª)‚ŠH¡*óçû?_ØØøxóæO¨-X"D½C*HYYYÙÛÛk{}ÅÀÀ€n’Á? ~‰¯”ªÄ yZ¬&R¨j¸ª*!9\Í´t•ÐÀÀOæz‹š·` ²/…††þâ¿Ðö*²^,²Ù¬ˆˆ9½5B”Ë—/ã 4Òcþ󟵽……B„B¨ìÙ³ÿJ!„B¡wÐåZ&“u¼é1´6µ~—ñª§”[ù·¤$…”îV/ªß¹nçÝ¢»ÔS¹\~NERHã „B!ÔÔ¥¼$¨­®e„µUu¶Ue½ÿûŸÿþ÷?ÿ­«©+ùw‰ân42å Dî›ŒŠ«9а\xñÈŃI+ŸWBרx^VÞþ„ý÷®Ýë£W!„B"SÞª¥Aé[§Ò°®j·Ç+Ö®M-~SYî]MM­ ×UQ\ öÆuŸò”7‹ÍŠˆ^|‰w‰ÖVÕÙV•õvèúÝ¡ïN~sÒý}wÆnj–Eç¾É¨¸š£T «YlÖâØÅW³®2 áy™yË7-Ÿâ?¥W_7„úmîFX[Õ¹\~àÀMfÀþ³Ò0åÝ7 &ÖQÿ£SÞ¹¹×wí:‘••—™™GõºTW×@ss[ssÛ­[ÿyøðàrO¥¤mnn%çad½É}ÔÔ¿i/^¼LL< ‘H‡@×*8Ù'ÉøFx¼Kÿû‘’’'Œ¹XÜñõ×<Þ¥W¯^3F…ÞÎX `o\˜šš*Oy‹ªD»6ì*á—tˆ;amM:Ûd£ÛÀÀÀa´ƒË€j²¼«.QqÕGŽ=ÇÄÔDÒ)al=a´úûX#ýµ{÷îØØXm¯¢7ÑÑf2¬ÍHy“Ô´¸éæ3¤¤¤Ð÷Ç ›ÏR©t÷î݉‰‰.\ì?ë*ú]¡ªÊ‚íFø===}Ë–-Ô>˜XGýLyÞñöžTW×x÷î÷l6+66bÉ’`ï§7áÿüÏ{÷{xŒ¹r…/w¸»»p¹§É©È¬7c5õoš““Ý‚3W¬Xäé9ºVÁÉ®8¹HrxQÑ]™Lÿ±§ç8F‡üĉËÁÁÓ©X caôQÈ팕öÆõAff¦ò”w[K[c]cµ°ZÒ)a„µÕt¶•f½Ÿ–>5f:ÎsÜ­‚[ŒÝg RÞä2*®æ(änDÅ‘žzþüùƒ´½Š^CF›É°6#åMRÓ⦛ϰqãÆÛ·oSCÈæsqq±£££‰‰‰¯¯/`ÿY'‘ï UítP¶ÓáwkkëÏ?ÿ<-- 0±Ž´Ly³Ù,KËaææ¦,–AU•hÆ]|~‰XüÓ§;:::©+¸55ufÖÖQQAª¦e죦þ­ Y'»âä"Éý_¼x9~ü(Åý ¶¶ÞÉÉÎÆÆBqaôQÔSØ× ÊSÞÎcã¹ñÆC©ÓV2¬íúž«ªÎ¶ª¬÷ØÉcUíF¢SÞ*÷ÍˆŠ«9 eåW+ÛÿصT„ÎbD›iŒ”7IM‹›n>+¢›Ïûöí›9sæðáÃûÏ:‰ñ®PÚNW3œQü¶±±±°°èèè…ÿ¹ÿGý‚LyÓZZÚêê…ÂjúdqÑ¢YÍÍ­‡] ›µvmªT*3'É:ëêOîÓÃú7Ùÿ׿n+Ý'$䃵kwÞ¿_>}º£C꟰ßÁcjjÂXMÕv öÆõ‚Êû@“'¸Œ°6ýT1Ù­˜õV3¹†ÅoS…·×[¢þèé,2ÚL‡µ)o’&-n5~üñdž††²²²C‡­X±ûϺ‰~W¨j§S»)ý_ŸQü>zôh~~þìÙ³ëHKè”7UÞöðCmçrㇾ¹lG·¸)‡mnhh¶VøgÌz“û¨©“>úh.ý˜¬‚ãDwÅ©s}z‘4++óŒŒ?××7QG$;äï½çúÍ7ëØlcaôQll,ÈíäJ{ãz¢G!•&»±øm&ÃÚdÊ›daa¡ªÅM7Ÿ)ôS²ù|áÂ…5kÖŒ3†úCì?ë&ú]ÁøŸ›l§ƒŠ;YüÎÏω‰™>}:5&Ö‘NQèf±XÔ‰¦bâÛŒ¸ Fža3®ìR»©/„“È®8Mq8}DÆþ¦ÄeGÆÂÞº‚½q݇%B¤Ç>øàm¯¢Ñ'CdÊ[±³­tˆ&æÏŸþüùÆÆÆÍ›7S[°ÿ¬ãTµÓ)ªJìÔã÷Þ{1&Ö‘~éaâ[»ÃÑ@’””„'ÐH-^¼XÛKЂ^ìl³Ù숈ˆÞš éUïGGÇ~^ B HÅÅŘòF!„BèhšòF!„Bª”7la¹PX.lok§nä̈f#„BiˆNy‹DõëÖí,*ºKm—ËåœS:DU‹»‡)oÀb6êå)o ØÕÂêjauG{•>!£ÙÚZ4B”ÖÖÖÆÆFm¯¢7imV“ÝRï MMMï4ß-¨Ñ)oÇ*<|vcãOɳ””cô])4iqw#åMn,f£˜5k–ò”7læ0:šÝo EH©?ÿùÏsçÎ}û~úƒŽ6çææR[rrr¨€sbbbuu5µ‘Ît“]n ’ÝjzÝ€Én}£4ð]SÞŒ7 r§‰Å⯿þšÇã½zõŠÑ‡'ßoŒ7¾[P/"SÞŒ/mÜsûöO‰bMZÜÝHy“Û‹Ù¨Ö®]«<åMrtu¼zêêÙô³ý¸0„#2Ú\VVV^^^XXxóæMª¼½dÉGíIgºÉ.7Én5½nÀd·^Qxg¤¼o2äN;qâDpp0ÕdaôáÉ÷ãM…ïÔ‹È”·šÝ޵ŭaÊ›±‹Ù¨'”§¼(`;º9nHÛ0ÄxˆL{Ó¢¢Ù¡ÞBF›Ïž=»cÇêÄ·ªª*%%eòäÉb±˜Ú“ÌtÓ]nÆlªzÝ€Én½¢*ðÎHy3Þ$JCîµµµNNNÔ½¢}ø1cÆÐï7èú¦Âw ê]Œ”wvvÁÔ©î#G'÷ѰÅý®)ï F“Û±˜zB£û@ÿôY„P££ÍcÇŽ}ðàAPPÐõë×[ZZêêê„Ba÷Î]½nèÚpÆ€³îSxg¤¼5y“„††&$$888˜šš2úðäû1 ß-¨wÑ)oðóóòóó¢¿D—®5lqw#åMnÇb6ê © ¤Cèh³§§§§§'̘1¸\îСC©«& ¢ËM~IM¯0Ù­oTÞÉ”÷رcÉ7 #äNyï½÷¾ùæcccêŠ2Ù‡g¼ß(Ô› ß-H+4lq¿SÊ[q;³Q÷Èår.á—òUϫ؆lÓa¦æÖæ.ý0ãëŒ5ÛÖäeæm=¹•ºG^VÞdŸÉ£'Œæíàù‡úwÞÞÖ>Ùw2лñ¯ð;Ä.î.§¹§ƒ¢‚*ŸUÆn‰515€ªŠ*ò)iœç¸¿šq ñÀgÛ?‹ˆ>^â]Š^M¡ÆÅÅåÇÔö*J¶¶¶Z9î¥K—oMˆÔ34Ä%êÊJ‘@PHu_¿nôòš°páL.÷Tk«8..rØ0S*(”._¾€ì§äæ^òDèàÀ‘Ë!**(=ýŒHT¿jÕbCC6cïÒ?¾š7oFssŸ_rõêÍèè—‘))ǨûÖ•— ùü¡°:::ÄÙÙž\ ¹Zòˆ}4—^¤XÜA‘q‰Dš––)·ÇÅEj²}û1[[ˆ†f©T–ž~F,™ÏáXÑD :ˆ!!ôïÿ¨G~þϧ¯§½³}© tVج[ù·,m,Í,Ì:;:¬ˆªDï¼oikÙÖÜ6ÆcÌ™}g¦Îœj=ܚܭ®¦ÎÌÂÌÂÚ"(*ÈÑÍñÃ¥îùrÏœˆ9^~^Œ§äR¨#J%RQ•èhÊѱ“Çvˆ;GGˆT\\üêÕ«m/¤û GŽ©íU Cß´¡„Ï/ÉË<^ehȶ··utÞÖÖîë;™L ÆÇLçMºþë_Xx',lVIÉ“gÏ*?úhnllÄ“'BïÒúõÑäþEEwe2y|üÇŸËÕuäܹ>ß~›ÿñÆ1›6펌  «ÙlVlìâo¿Í ˜J¯„±`òˆÖÖæä"é#~ÿýsòYYy>>“'L½cÏÍÍ)8xúðáÖ§N]¥:ˆ[¶Äššš@NNѼy?Ýô& `êš5)x­G6lØ ²DxñèÅÝ›vÿrö/cf‡Ï>˜tð_ücƼ¯~|ÕÜÐüß²ÿ^8tÜÇ?ÔÿÁ?<ü¡¥©¥¥±åá͇ÃÞÜ·œñ”tñèÅ´ø4ï9Þm-muÕÂj¬…#õ233µ½ „B!K„c.\(âp¬†·f¤Ua³Y––ÃÌÍMY,ƒª*ц »øü±¸ƒ±Û‹/ÇE?µ·ç˜ššt*œQÐÛÉ•¨9¢šE’‡¨ªeokkÙÜÜV[[ïädgccØAXüýýU–CcB=¦{POé*!8qÚ°{ƒT"515)ºPôÑšœÆ8;pŽÜÍÂÆbó¡ÍÍ ÍÖ²,ÄÐÈúÛD3 3ò)mZдiAÓZ›Z©#Æsã‡S'ÙäÑB!¤¿èá?¾jhh.+ûï¡CÂÂf‘)AP]¤µ´´ÕÕ5 …ÕÔ©'¹HÈk×|útM–D®dÅŠ…ªvcôé#2v Ÿ”tÐÆÆbÞ¼£FÙ'$ìwpà˜šš0úˆØAÔw𷬿/ &·¾üñ%Ø9Ú)ô†L*+<_È6dòáwþðÙ1âŽèó£çÛŒ°y׳>ÜüÅæ5kÖh{!Ú´nݺ7n‚>= ‹ÅZ¶lÙÑ£Gûô(!Ý÷øñcww÷û÷ïÿâ¿ÐöZôÉ?ÿùÏÀÀÀW¯ò9ÄÍ.\(2773ÆéÀsIIq2™ŒN R”ÖI--mCß\kcì/—Ëëë›ÈÙÔ`¬DÍžŒEªZaGG§D"¥>ªÑÚ*666b³YÐÔÔJw #ã»ÐP;;ëíÛi·ärÿ~ù”)ÿçñãÇãÇ×â2ô‹ò³Þ·ž:SXlÖœˆ9Ý>v4Þ!„”æÏ÷;¾°±ññæÍŸ€BJT×;(}j`` áÙ³âJÔ‘±HUç÷FFCŒŒ†PM‰[&`q Á¿YFzŒÍf2DÛ«@!ôÎØlV„×àú¡>ÈX öÑ[ݼyO ‘¨™Â IDATÛ¶m›¶—€B¡Áå¯ý+óV!„B!5ºœ@Ëd²ŽöŸnSñ¸"umjYq™â¹\NÝv£^T¿sÝλEw»wlUÃK¥TÙ[ó!!„Bõ.'ТJѵœkðòÅˉ¤éã!2©ìôžÓÔV×R»K9FݟΊc5;|vKc Ë…Âra{[û­‚[—•·?aÿ½k÷à÷ÔÑ”£­Í­Œc“ÃÉ£´5·]»xmÂþªŠ*ÆprB!„ô‹L&ko~ݺEo®ˆÉåòÎ)’ŸK"‘ÒO³³ jjêärùÞ½Ùý°`„”Ržòž6kæ‚™.î.ã<ÇÖ€˜1»7íŒ $'ªV€µuYqÙ´ÀiJ³ÞǬj,6‹>ʯ tÖ{zðtM†£Áéþýû?——ïß¿¿„ÀÍÍ-(H]L!¤¿è”7‡c>»¾¾‰ÚNG¶€¬^™éÆ6ÒÊSÞ䌰¶JDFGiÖ[ÍhÆQ謷†ÃÑà´iÓ¦+W®ôéQäryiii|||ŸQZZZÂÂÂð¡‰Ly‡u=Ù #ÛÀ¨^“™n,`#]púôé.wá SÞ4:¬-WÑ™,È.pŸêîèêx8ùð£;_õõO]›*“ÊL»Þþ1\Ü*&rñèEÁU÷o/?/ÅáÔá#‡¿ë7Œ‘H4lذ¦¦&m/õš¨¨(m/!ÔW|}=í‚RÆÙ3]½Žˆ˜ãççE~ ØH«LyÏýh.õÀy¬3Ö¦Ðym/?/¯7oî i†¡.ªÊz3ÃÉ£YoÆprB!„ôò¦dgLê>²ë1FõšÌtcéî=TmK“F}fC‹Å¢OÕä»G¡OåÉá!„Ò_††l:ÈçççE^`N¦/½Y˜-[BW¯—/_@G³'NtãóKkjêìì¬ ocÃiK‡T0ßB!õÕk2šl¤ 0¤‚ô‡Ã±°ÀßN „B¨ÿìÞ½SÞHMš4©¾¾^Û«@!„Ð rõêUmccøö]õ‡ÃÑöôI—hQ¥¨TPØ!î8šrÔÎÑÎ~´½½³=ŒpñàߦN€c)ÇÝ ^T8ùp© tÁòvNvô ÅÅ`egåä7sÁL²z¦ôóí7ã£2ÝÉ.ä6/ƒçè——¾6½’_©§¯75iêÉŒ“]õs@!„jÛܹs[ZZjkk?ÿüs¶Ç‚Ø1dÈç´ï(ߨ9±AQA¡±¡Õ‚jg7g  €Å$ÓYÜ*vTœ^p²´µl¬k;';ccQ‹¨#ÏzŒœœœââb¶GB¨§¨««;pàÀœ9s&Mš´nÝ:¶‡ƒØ±bÅ ùQÞA‘A›–m²ïmolb¬(£›âì’8Ð ù8Å-ÛìBo}yìÖ[-l,Fÿ“qP›¤R©TŠ9®!„ºÈܹsE"ÑÇüøñ €Ï?ÿç¡{&ü7ã¿Ó#ë…MÂÃ['.I6 éŒnYõr£ é,nÙîdz»EØ"‰MŒ5ñºtßç Ë–.KNNf{ l1bÄ­[·jkkÙÒ˜iÓ¦q8œÌÌL¶‚·nÝòöö¾zõê!CØ bA]]½½}BBÂæÍ› 22òܹsÏž=c{\ˆ —±ëeÚË€k0zâhPœÑM·yÝt·lw²à¦·¹†\®!·}ÃG!„êôô3µûÅ_à$t¥lh®!·¿_O„Ý!„ÒUÔ§ŸgÏžý /PŒ1bâĉë֭úÒeÀQ4`À¶GBH÷1¦Ÿ)_|ñ.ÇÑ%$$`´˜“““••Û£@!¤ãd§Ÿ)ô$4[C¬¨®®nU@K$a³P³ÏQ”WDÊ•*_,Ën#„Bur§Ÿ)8 Ý3ÉO"^¯ôF©¸ÿÐà¡™3›šâçÆ›˜™‡lm។A'W'¹ñd*¡³›3¿„Owé?¤?¦"„B¨;£¦Ÿ­¬¬,X ·‰‰ ~º§y^@ææñò*J+ô ôCcCyûx_ýð•¡±aî/¹Â&¡»·ûþûg-žô¡üSù`í`]|±¤@ÅÝ~”jFëçÛoôÄÑ[¾Ø2ÍüJ~%Ý% <€J"¤–é ·Oì9áèã6À-}múˆÐŠN‹B!ÔÙ8`gg¹¹¹Ô#åååzzzNNNÔ®µµ5dgg‡‡‡³5HÔÅžо£|\ŠòŠBcCÀm€U×V=ª2µ0µ°¶7mÕ’>"ÅBQ|àóTB™.r *ÃC†c*!jSUUU]]Û£@!¤ËÉGìíímllnݺÅÒˆËþõ¯ÉO"$G§|”"KèuiÊC it*¡lL%Dê(***++c{H“îÝ»÷ôéÓ·ÞzkøðásçÎ%½óÎ;"Ñó?¤gÏž=zôó_ׯ__¿~=Ùþ›o¾155¥w÷ìÙóÛo¿Ñ»ýúõ[¼x1Ù~Ñ¢EUUUôn||üĉéÝ,_¾œl¿bÅ gggz7++ëÈ‘#ô®ƒƒÃW_}E¶ÿÏþsÿþ}z7""â•W^‘ù „êîbbbZÐúút•üþÊ÷© ‹eiËêžÕYX[0¹xº,üv!#epÎ'sÈsŒ @§2ºÄ$ÆÐI„äö ©„ŒÓ"„tÒãÇÁƒÜÜ܇>qIqékÓïßã—ð/¾týÂuò¤dú7ðöñ—$Òe1½KžJ¶­Ÿo¿ÍÈØ•üÊJ~¥°YX|±ØÊΊJÿvèã@n“§­äWRIàÔàBÝ\AAAAAÛ£@!„”Qå=áµ ßü}X\´Ó&s¶½‡y§¯M·w±726"OÊHÿ~ý @î2"»Íh˜Ž¹}ûvEEÛ£@šDF¥ „BÝPjjªü(ïúšúë®›Yšéé1¿eHælÛ9Ûݾv{丑WÏ^%Û(IÿVt*%Í0 )R^^Nf/#„Bu6'''…I„ µ ††Fr¦„[„-ŒœmY‰„LÿVD•SQƒ¡kqa“ §Ó¿ÉmO«Õ0‰0‰PõÌ$B©TŠ 2jL"DL"D ×V2yÌ5är ¹Œeã»Û¬žU?9ÆÇ<èê™Ü–{Z„tR]]Ý•+WØ…Æ477À™3gØˆÆ :ÔÌÌLy==½ŒŒŒéÓ§wÍB©IcA*ŒïÆ$p„TwóæÍ1cÆ´ÝN«èÒ+*((>|8Û£@H!//¯²²2¶G¡eD"Ñ_ýÅåjëTÝþýûcccÙ…vÃ$žhçÎ –.`{Pû´V$Ù÷¶g{ ðÊÔW¾ûî»wßž»ÝÙÍYƒãAê«(­xsô›l¡6ˆD¢iÓ¦EGG³=mR\\lhhèååÅö@ÚM,'$$H¥m-È€”JOOǺ'ª¯¯¯¯©÷?ï²=ô·Ã[WWW«s;g;MiDSCÛC@H%C‡}ýõ×Ùê --- lBëeffbÝCõ2zõƒWÙú[þ¯ùl!„Bªj;Ê”¦d·7@»ZP½îßë.ç\¦v¥Réá-‡UïÎn®8Bu†~ø!00íQ „RUÛQÞ@§d;ôq U ª§¾=Uß@Ÿ>Dݬ¤B¶G„Ž »SY†4+;«±/­­þ{ݱݫw»xº¿„Ofn“Iàdw2ÙÛÁÅŽì” ¨“?¼ûÐw´ogþÄBHÃ^}o!„6i;Ê›LÉ=}½¸¤¸ˆéÇÓ“‡ÈmF¸ ‹Š Š€ÌÜf$3ÐÉÞdd·Ç@Ó~ü᛼‡{kôçƒB!„Ðs/¼ðBÛQÞ~A~dA…`×ê]^>^¦Öö B¶]<]uW‚ÎÜf$3ÐÉÞdd7‡Ãqvs®z\%7ù¡kgã‘iн”·$Û(i¯b³·×ˆNz-!„tÒwß}§R”7™˜ÝXßXSUSɯ”J¤ä!2d[I8%û@¶÷0oE«)O§“½=yÒ‘ÝwŠî˜˜™Ø:Ùæg焨÷céé´´äRgÀôôôõúôí3wÅ\ÙlN-Åzµ§K%¦.½„BêhU@ëèS5«©…iä‘t”wLb ’íêåºxãb£^FTqLZøíB:d›ìÎàäGNK¿¿ò}÷wÕ;ç“9°,m™Ü$ð€qãèdï…Ò‘Ý^>Ú·c÷¤u%—¦\ -¸StçUßWW¼µBg hY¥7K¿˜ýEqA±ƒ‹ÃÇ©ŒùSÚO©ËSŸ”?±ïmŸU–Eÿ9AÿHUÿ“†:–ûsîò]Ëæ†1NÒ±ÓÀç Ïþzæ;Ú÷•÷^ §Ú/ýßÒµ®¥î†‘OÚækdìªÿZÚñÈóÓO?1¢wïÞjž!„P×?C &æ&dùËHÌ&§–éC†Æ†TõLvß½f7ý¿ªGUªKOªžåv§g¦¹†\ªzFªôféìѳ '{L¾pòü”öS´[ôHîÈh·h fpGpFPÛôc[utQü¢`³à_ýÊ8IÇNÛ€T*m¨mW/W¹Oªh¨ä#²OMµ9¸éàè^£Ûÿ³×¼e Ë s ÓΧ•—–¯œ·¾~ïëJ~åÖ3[©R’. ¤+ ?XõAc}ãwK[å´봲oî/¿ì/Þù÷ËŸ¾ñ)ýàÔ¤©çÏË>i›¯‘±Û©¯ES¦L9{ö¬úçA!Ô5К2sÁLú6Ž6]Üi„V”\êØ_ÏöK³Ý½Ý×ý´®]CU^ºQÈR]·®Ü€ÿxx÷!Ž€7G½ùïØËíBþ”èm=}=H$±ô ôéöôÒ:ÊG"÷´rw³vf½î÷úŒ¡3€\j“þ‹ñ¤m¾FÆ®ú¯!„PÒé4ÒZQr©9`8të•Õƒ;=|¤d ²CU^ºQÈR]}õ€¼%/J.ÀšÃk¶äl€<^Õ†ºÉSQVAíÊøä?®ä\¡–u0¨Í§Vå´rm]±µäZIÚù4M½FÆ®ú¯!„PÏ‘œœŒ4j›Ö•\0¼Ðÿ…uG×q ¹ŸÌø¤¾¦ÞÐØZÁª}êîfEúŠa!Ã>œüa a`¬W,D»E'M²s¶›¿f>ÕfÙ¶eޮޓ=&‡X†(:ÏòËýÃüߟô~rdr@xÀòËÛ|jUN+Wòªdê}Q±}›¯‘±Û•¯!„¶+--Å(oÔ¶é+¾~ïë'(‰ÝœÜ9íý¤ü‰³õ¥OX¶mÙº¯›ì1ÙÄÜä÷g¿Ë=ÏòËÿ;÷¿ïOz–nZÚæS«rZõLwô ôùjßW ^^°rÞÊ%—lX²áÛÅߪø¤Šžº]Ý; 9UßwpßÔÓ©äÑcücŒöã¦#‘d|¸‚Úx¡ÿ ÿËþŸ¢'’ÝPñ´r ›–Ûœ«èÉömó52vÕ-!„z”V´D"µˆp)eZUridÀ´11còEùÔöäÙ“Uª’Ò ×>Cmª««322b{!„T%?Êx¼Ò¥þáþ¶Ž¶ðOFw@x™¹íäê¤(²!„ŠLMMÙB¡vå ¼}¼Ä%‰Cƒ‡’ÝÐ:s[õÈn„B!„t@||¼Â(o·nÔ—¨ÈŒn ¹Ý±Èn„=yò–L_ò÷‹ºæ¦føç B!¤3äGy“ÈŒn†6#»Q÷T__ßÒÜ’} ›í ¿ *¶ú¶ë[[[ õ¢‘F…ÔE-Y]WWÇö@Bi˜ü(oø'a\<]ÈŒnFæ¶’ÈnÔm]ºt©¾¶~ñ´Ål=×ð¤¡c===à›cßPËQ£îãá݇±^±m¶ü׿þ•””4b„•°Bu+*-c§äÖ0¹Ò#FŒ8Á;¡z,êl_¿ûuË>l±fëÖ­X@#„¶Àu {"=}=wow¶‚þÖˬ—‰ þ-ŠBiÇãg—ÒqOÊŸ|úƧ)¥”\-‘=*•Jo9,ûxþ©|±HÜæÉUl†B錷Þz h$–\º¤EØòâˆßû꽟¶ÿD=ÂËà¥~žzåÌؽz·…µðKøY;³¶®ØZ^Z^-¨Þ±rÇŽ•;?|Ì8›D,Ùÿýþ=){ªÕŒfäi37fîZ½«¡®j¿å‹-UþgÝ»~//ƒÇÛÇëÊB!¤A­ h‰DB}mœAIÅÓÞb¨ZP½îßë.ç\¦v•bˆ]Xri©;EwJ®–HÄÆã¹?çnZ¶‰V¤Wy€„E ÅÌ%Þ­ì¬ü‚üf.˜éÐÇq*rõwF3ú´¹¿ä ›„îÞîû7î×Ó׋KŠ‹˜q<ý8\:}iÿ šªš›—ovöOC‹„……9::²= „BªjU@ ÊgŽž¥Y܇ø%|~ ¿¹±9?;ŸìÎx>+;«±/­¯©§vå–b@ÔR]ð#èá°äÒ%ï>|pçXÌü›vÔÄQÉ«’ûéOí>_å½5z‰w%OA¯þ~õìUÆ!ú´UªL-L-¬-ÆM'¨¬_¸¾0·PØ$=}=3K3sާÃ/S÷dgg‡„„°= „Bª’ŸD¨¤â!‹òX¨zB¡ÜRŒ¬¥:õÅ#À’K·„Ɔ†Ç‡s ¹êŸÊÙÝ9=%Ê%1V—Û,8:øÚ¹kw¯ß­¯­o¬o¬©ª©äWâ2Õ!„t†Â$BEƒ‚ Á®Õ»¼|¼¨âæ9"°°c …t)FÖReH5ÔÛ­T-8Ð ù¸Ü’‹Ñ,8:8壉Xbbn"‘H¨’K*‘2Ÿµ_o÷Þ¯Ï|„^åÜe,ñ“ÓXßØË´ãl¦¦äêïd3ú´6ËÒ–Õ=«£î/-޸ب—õîSmúî«ù׉P·ÑÐÐP]ͼÛm‰Åâšššòòr¶¢‡ãìì¬èhEE…TŠÿp(#‰ ªªJ[ÞqÙÚÚÉ=´jÕ*ùI„J*z>‰*nèCd`a› …Ù²½‡yÛ÷¶—{”¬¥Ôxá¨ã°äÒv»×즷£fFÙ8Útà$Ô{${*Æ…)ûŽ€žžõV*j€ËÈȘ={6Û£h‡/¿üòË/¿d{*111©¯¯WtÔÓÓ³©©©+Ç£¥Þzë-¶‡ x<^DD„ÜCÞÞÞò“•T<®^®dqC" •$úù‘ÓÒrK1²–B]K.]2sÁÌnx*„zccã“'O²= ]sâĉõë×+oóÉ'ŸL˜0¡kƃtUmmmdd¤ò6 ƒT”T<Œâ†Þ%?#KwïXYFÖR¨k`É¥¥„B!\=wõÏ»²=ÔÊ“Š'ðϤœ““SjjêäÉ“;P¨‹èëë±= ]sçÎ6Ûôë×òHMOŸ>m³M§'b-…P§º{÷.|–ðÛAòݽ{wÔ¨QÊÛþpò‡Ô„BHgdeeaÝÙØØ”Þ,}íƒ×Øú[öÁl7G·Žõ566ÏAž.ž.R—©…)üó!„Ò©©©X@÷Dîîî½L{½÷ß÷ØúÛ½â{®æ®l!„B*‘å­zà6å]”WT”WÔÉ£E)C_Âí’} »êQ•T*=ð¿1*Ô¦uëÖùù©ºd>Ò^ª÷R½’ö*6£õïߟÃáäå倡¡¡H$:þ<‡Ãéß¿¿*ƒW2iÝ¡æiÛûtJý~SSSRR’¥¥¥™™ÙêÕ«;s°ÊÈòV¸ ŠS¾ëÏdIý<µ¢¬B,ïIÙ“öUZÍÓš{Ü»÷ǽªGU…ç »øµ!ÔÓЗ0¿„Ÿµ3k늭å¥å¹1s×ê] u pöØYªqÎÑ(¿_^õ¸ÊÆÑ†Ãáxômii¹ÿ~vv6}¨³ÐI´î`÷´š¥þÿ³Ï>KMMMNN®¬¬¼}û¶¦¨*ùQÞŒFtà6(IùîçÛoÆG326dð2x>>qIqékÓ=zü˜öãßüà=Ü»«^jœ³Ôä%\ɯÔÓ×›š4õdÆÉÜ_r…MBwo÷ý÷À½â{üþ¥Ó—®_¸9GsFFŒ¤Î0,dØùŸÏ³ùêanÞ¼9zôhCCCjÝè´´4777.—ëææ²‡ªÏ&RGãããÍÌÌ:Ä8‰*§¥ªäß~ûíúõë–––&&&%%%ŒÚÙÙÙÐÐ044ôÀtßM›6õêÕKù‡Ž?nooïå奯¯ßõS¤ÝüPÿ´rµë½kóGÄØUýµ´÷‡¿wï^xçwÌÌÌRSS徯dŸBMÏ hßQ¾±sbƒ¢‚”g;Ó1ÝWÏ^e²´±4µ0‹Ä‚ Ó N–¶–uÇÙÍ™£Ç‘ª‚X‡s–:ƒq Û9Ù›‹ZDUªL-L-¬-ÆM}úöI_›~9粑±HÄ}}}ú$ŸŽPWJHHÈÍÍ=þ|iié¼yóà½÷ÞãóùgΜ)++õ'JW­ZU__¿téRòAOliiyîܹ˗/GEEM˜0áêÕ«¹¹¹–––ÁÁÁT›ŠŠŠâââßÿý7Þ ;&%%566*€ì¡ùóç ‚ŒŒ ‰DÒ—©¦nþFhä´²%l»Þ»6DŒ]Õµ÷‡_QQŒDwÆkaœAö)Ô”žžÞê#t”7%û@ö“ò'Œ>rS¾‹/@Ö®¬oëæ?öå±[Wlýnéw£'¾StÇÄ̤Ÿo¿üì|õGŒ4 ç,u ã¦G_;wíîõ»õµõàêåjëd;rÜH®!'Òßv(¾X<~üx5jTll¬Ü.rï€SK$±X ÏWðôô€’’å#‘{Z.—;~üøÆÆÆ´´´ØØØØØØ´´4¡P8~üx.— ;wîôóó:t(477Óg# 5% Ý»wØú2@7#Ô?-ÈÔèí}ïÚüÉþÄTü´F{øöööðäÉóUöµ0Î ûêkU@ÓQÞàä÷ùŽÏí{ÛS»Tà6ü“ò¸4Ñw´/Ä$ƼöÁkýŒ øb×o}òÖ˜Écúôí³p÷>}kÔ„Q^>^“gOŽ˜ ‘# Â9KC_ÂãÆ˜˜™ÌùdޅŲ´e¯DôÒúùöKZžä;Ú7aQxô”ˆ%Ôr N„LJ³üz¤üüüªª*¶GX0hÐ àñx‰„šy=|øpNNõ ÕÆÜÜèY=¹·Å©Ê ''‡êÐö?¸ªœÈózz IDATþù¨Æƒ&MšÍçóøüÆŠ+®]»vþ¼¦Q¨ Å?þøCýSu@7#Ô?­¬ö¾wmþˆdb*~„£½?üéÓ§ÀÚµk¨édÙ×Â8ƒìS¨O¯í&2LÌMÈÏcÉÞtýÍ5ä›àê§Zç,{===ú{À²¦Ì™B} 'aaBWŽ ÑFŽyêÔ)¶GXžž2yòdCCC///pss;v¬³³óš5k¨6Û¶msuuõðð°´´Ttž;w†……Mš4)222<<|çÎm>µ*§€ÈÈH==½qãÆ™™™ÙØØ„„„èééEFFRGW­Zehh8c†b¹–/_nff–Ô-î®ÔÍ߈Î8m{ß»6D²?1M™ñrV®\ùæ›onÚ´ÉÞÞ~À€r_ ã ²O¡>ü7ã¿Ó#4r:Ôe&8OX¶tYrrrú~ÿý÷öñ©'ÊþÁ–H$uÏêU]?nû18:ØÚÁz÷šÝXu©ï£)¹š»¦§§w oAA¿¿ÿwÄ •îæá݇±^±Ç·ñG&‡ÃÉÈÈ ¦UPwvëÖ-ooï«W¯2DI³íÛ·¿ÿþûuuu]60qíÚ5???OOO¹÷ÙwìØñî»ïÖ××+êÞ«W¯Í›7SU8BöôéS¡°<Æ $_›s–ÔVÏ!„4ÂÞÞ¾ªªÊÅÅå›o¾a{,)óÙgŸaB!ö‘_ C¨;»råJWÌ!„B!­ÖjZ"‘ˆZDª/ØLewûútøéËn•Ü|pâkúìðIB/a©Tzdë‘—ÿõ2ãñüSùÃC‡ëèËíÕÞfJdÈ<ÔÚÁúঃñsã;|qçÎGGG¶G4æÑ£GÍÍÍsæÌa{ ºæöíÛ"‘HI±X¼mÛ¶ßÿ½Ë†„tµÞ_ý¥¤M«ZP.(Ê+ ç—ð s +ù•‘3#EB8º:^;- <àì±³üÛ|;g;‚•UÁé‚ÜŸscÞŒqvsÎܘÙÔÐ?7ÞÄÌ„—Á+½Qêî?4x(ùb‘xß·ûš›šãçÆ7Õ7mùb‹¥­%׈ËÝÝÖÑ–|vr`N®N76 £¢¬ì¬4ò#ë°äÒ%ä%\ð[ R;'Ö¡ãzܽz7õCò‚213Ù±rGQ^QLb •-J‘ˆ%ä…V-¨&›‘g¦÷2>¸ù`µ zêÛSo\ºAÿÆÿêx ‚x€ ây)ò%–~`ÝEß¾}ÙÒ¤{÷î‰D¢ŒŒ ¶¢kD"¹²,}}ý .\ºt©Ë†„tµdõƒ”´yþbana/¯¢´Bß@ßÄÌ„ÊÔ8ºýè‹Ã_këâ‹Åá—N_ ½]x»ü~yàøÀ~¾ýFO½å‹-##FÒѳÏâíã}õÃW†ÆÌ²ŒJùvà–¾6}Þ—óÆÄŒq÷vïçÛÙìŸîù§òÉg§Ã>Žn?:nÚ¸òûåIË“p½3ù@P!X¿p}an¡°IÈøăBHË}ðÁ­n…ÈÍÔpñpÙ±rÇK7äž"kWVÞÉ<ÿ0¿ ¿”R$b ¥"•òmacAOA)§äÙ¡â¨|Gù:¹:å…ƆæŸÊ×xÉæÄüNQɵkõ.//,¹ÔA^ÂY»².œº0bìÕ»;»;§§¤F’ßI½Ðä6 ަH$’šªšJ~¥ÜwŠ â¡nh`B!mÔª€&s€©Gæ|2~»kÄ¥2©LテÿþÄ^À¸€†Úª×²´etôýÍ@¥|‹Ebêv0uKWÝÝÅÓ…|vÆÀ"߈404Pý[H–\º„¾„ :!zðÈÁÔ®ìõH=¸ bcëÉlQ0µ0e\hd3úÌT`8ý`ñÆÅF½Œèÿèßà9г(·¨êQ•µƒuÁé\J>ýôÓW^yeðàÁl!­×ÐÐP]]Íö(v{öìüóIhETZZÑL$…þ[nôÆî5»éí¨™Q6Ž6\C.•­¼™*Ï®|¶©K.äþ¢;tè¡Þ#%×#ÙŒü · ƒx¾üòK, {Žcǎݾ}ÛÙÙY*•¾úê«°qãÆ†††¹sçRYzMMM ÖÖÖŒm@ðöÛoÛÛÛÿý÷OŸ>õóó›r¿âiggÇhvÿþýÇSO1pàÀãÇGFF²ôêQ§{þ2Sˆ´‹J~e%¿RØ,,¾ÈÌÑ ·ÉP ‰á@ºD*•ÞrXöñüSùb‘˜ÞÍ>]õ¨Šjàºn|¨5~ ÿÐæC©ËS?|L=ÂËà¥~žzåÌؽz7õ=N~ ?kgÖÖ[ËKË©ðÈ+wP]È$H‡C…A²÷‚ÒJ Œê¹½ôõõãââ¦L™Âå2—´B”ÜÜÜmÛ¶;vìÈ‘#°oß¾%K–óù|>ŸßÜÜ|ñâEàóùúúúIIIŒÜu;;»    ôéÓ‡üŽfYYÙýû÷ßyç;;;F38zôhDDu†Ÿþ¹«_6êBÏg ÉL `d¶^ÌÑ ·UL"DZë ĉ¡ÁCU‰õ–[rabsg»StG"–xùxéé?ÿۘʘ¤c½ÈßÕb½ÉðmÀüm„Ú"•J¥R©H¤0m uŒD"Q±å¨Q£\]]óòòbcc`À€ÆÆÆÀáp‹û:99™˜˜´´´(:•’¯x2ZŠÅbò«¢ªi¥K—ª›DH#C14‹Ä=ÈwZÇzƒâ¿oeL2’ à Rêܹs 8=ܨýTáää4aÂƃ+W®¼téR›ÝÝÝÝSRR"""¢££?úè#±XlnnN~­“ÑÌßß„ 999žžžpñâÅÐÐÐv¼0¤UF%?‰TÎ$·UI"DÝ –\º„º}$KÍŒI2 0 ¡¶¼øâ‹FFFééélDל>}zûöí*6600 ?AN}k<==¿ýö[###ª¤7nõø'Ÿ|Â螘˜X__O}î\ÑW<͘››ûèÑ#‡Ó§O/\¸P‹º9 $Òä&¢nK®ž€Ì˜™¿oÛ̘¤“ ©/b¤Æùùù­ZµJIäÒ.¶¶¶Ô××ÕÕÕ©^@+B}–C–ì·<éom*úŠ'…nsæü=·ˆÕ³Îà $–\Z †ôó·q´épÆ$…N‚äp8øVjܵkת««ÙB=Ú‚ ØÒ&X@£¿aÉ¥K0¡nW#FH÷œ;w hô7,¹BHãp5â.öý÷ß?~œíQ í& •7øú믱€F!„:Enn.Ç+--500ˆÝ·oß?ü`ll|êÔ)ppp¸xñbxx8½ñöíÛ/^Lw§—666&W#ž6mÚýû÷—/_N-IA6€£GNš4‰:CHHHrrrÏ) §L™ÒÒÒ¢dM:„TÁáp¦NêàࠤƢ¼«ÕÛÿ»=dJȰ1Ã@&Æ !Ô]Â*^Ššu¬;^hí`É…mZ¼x±··7Û£@š‡«w±}ûö±=ÔS´Z¹LP.8sô µMf•enÌܵzWC]HÄ’ýßïß“²§ZPÍ/áóKøÍÍùÙùVvVc_[_SŒ3„P× /aò:e\Ô¡-_lù«ò/ ®tE—­ìãô/%ÏB'é`r¡*V®\éëëËö(P§P´qffææÍ›ÛìN-3|ñâÅèèèsçÎ]¿~½¶¶VÑjÄTºµ1õ8®FŒP'y>]˜[˜ÇË«(­Ð7Ð ¥ƒ3ÈŒîY‹gU”U”ß/OZždlb\rµ¬¬‹/„Ч²²³"35Pw¦ä¶CCmÃÉÌ“ôw»š‚ó”šB^Âý|ûÑ×)×£ž¾^\Rÿ6ÿxúñ™ f’9r/[ÆåLþB7mœ¢g!“t0Fõd¸1B:©í(oFF·‹§Ë„×&|ÿñ÷aqa²)ßHëÊEyEáñá±äàæƒÕ‚ê©oO5·2ß½f·¥­eݳ:6 É]RæÆÌ¦†¦ø¹ñ&f&dÜ7¹-‰÷}»¯¹©9~n¼…µyˆLüƸo51.aú:õ ò#› *»Vïòòñ6 AqDŽ"ä/ò·ãYI:£ƒ®FŒö:|øp«pÈò޾vîÚÝëwëkë ¾¦þú…ëf–fzzz..'3OÚ|ˆnœ} ûIùø'S£øbqç¿ Ôq…¹…G¶9{ììé#§©‰ÉˆéÇÓÿ¼÷ç‘#éÿ»4r2xûx‰K‡engð|}â’âÒצ3åÍ1’:Û°aç>ßU/]7Ñ—0yBëë±±¾±¦ª¦’_)›©è²%'!(y*I‡êŽ1:©nZI!ÔÝèëë·åmacAft›Z˜F¾i`h@Ýô'S¾ý‚üèY(2Su[äœ%91YýWµCúícìÒw'ȹLr[P!2ÜÒÖ²±®‘qç)5‹¾„×)y=ºz¹.޸ب—Uõ’9Š.[òqÆ/EÏB'éX;XcŒN›ø|¾µ¢B¡îO¥eìÝd¾†’›¿X=kzÎ’ž˜”J¤aqa©Ÿ§Ú9ÛQŸm Ž&wiÁÑÁ)¥HÄå‘+c_»uÅV  úC±42ñç)5‹ñ¦×£’k“:D¦êDÍŒ²q´!»¿”< ýqy¬žÛäææ–‘‘1}út¶‚BH%¸tOGÏY2&&|³ÀÐÈPO_<^ô wiŒÉHr.“ÜîÓ·Ï Å"1U“‡pž²{ÂT„BH , Ñsäô!c²™Þ•›$ïN(Â5är ¹rá<%BH‡u,ʳ¸êÎÖ­[‡4jœ›D!ÕÑQÞŒ¼n:—ÛÌÌìØ±cQQQpôèј˜˜žÅP÷÷Ûo¿éµÝ !„Bí—››»mÛ¶cÇŽ9r„ÎëÎÈÈ s¹ ¸¸¸¤¤äôéÓ.\€£GFDDPg ùùçŸÙ| !yZЉDØ,”m”*_,·y.EÍK¥ÒÃ[·¨¡6(º„Ú¼¢‹òŠŠòŠÈG²dW=ª©TzàÔ'b8{ölXXÛ£@š7jÔ¨9sæDEEQQÞt^7™Ë }ûö]»vmNNµ8tOÎâFH[ÈòîÔàÝ«wSŸš={ììÞõ{y<Þ>´ G]FIÉÕPÛðã¶íRÊn•¥|”"»r0ùgRµ zÝ¿×Ñ««+¶ /a~ ?kgÖÖ[ËKËÅ"ñž”=i_¥Õ<­y—$…lÖXרX×øGþw¯ß"—0š»3¼ôÒKvvvlu ¹QÞd.7xyy9997ÎÐÐ0‹!m ?Ê»ór€ aQ†%ÂãÃ/¾z»ðvùýrsks20¼ë~=ž:I„>ÞòÅK[K®—ìnëd»{õnjq:°²³ûòØÚêZà—ðÀÑÕñÚùkád*!j(·bÃBåÈKØÄÌDO_ojÒÔ£Û:ôqð ôqà–¾6}Þ—ód/I •wC5:â܉snýݦ&M…ֹ܀ÑܵåÍÈë&s¹}}}}}}`ôèÑ€YÜu{Ç>í;Ê7vNlPTPhl(Ð{õìUFA…`ýÂõ…¹…Ë&ééë™Yš™˜›pô8ŒHÔ5ÔL"tèã0&fÌ”ÙSúùö#»@¢„â99”•üÊJ~¥°YHMZÓ©„ŒPC2¡0¤P5ä% vNvÆ&Æ¢‘ Bàô‚d££Y‹°åé“§Ô!FÞ `ä Bj#s¹eÍ™3ÇÑÑ‘Ãá`õŒP7ôÙgŸÉòî¼`Eá¨k%ù§=haó÷útŒ]¹Y)ÄiµGÿÆø +¶Ž¡/adóÝÒïèYd¹—$£Yè”оƒûþ”ö´Î匼A!ÔãÉòî¼` Õ‹úÿ¾ƒûR’‘¨Ë¨“DH"»Ëm} Û{˜·‹‡ËŽ•;n\ºÁ8Ê5$ +6•Ñ—pÀ¸ê‘9ŸÌ2È\ªŒ¼wcãh#•J1òFã6nÜ8aÂ///¶‚BH% ×î¼`Eá¨k¨“Dã_Om0ºCë?®ü‚üü‚ü¨í…ß.äq9Ù†jˆ›fÉÙ(ºTÛÌ»áp8ø^hÜ{ï½—‘‘´.ihhPò Ô1BaÛ« !Ô5:%H³6´TÇ’åvWBчæAaÅÖðRE¨3¼ôÒK›6mb{ªJMM>}º••ÛQ‰À¡nÿCDíƒ%B)׿ÿþýû³= U-Z´èÏ?ÿ\´hÛAHk¼þúë˜DˆBõPÅÅÅÏž=;räÛAH›ÔÕÕ)L"$2”dÊ=$cF"SÐ0•!„lllŒŒŒØê‰V¯^ <¨««k³1Bˆ&?‰ È‹Ä\#.ÙÐ:ጲ;ãvc—ŒéÆŒn bäJ*Êå™ GLyD¨g:xð ………D"quu•H$;vì`{Di‡ÈÈHùI„@dPèÀ FÂ}ˆ^ÈhCb¤ a*!‹ÈÛ‚ Á®Õ»¼|¼è(oú=bì’,m,M-L[„-dwòv„_c«·ÎCÿ Lår[ØXÐ¹Ü u ?¥ý4yödhôˆ)õL ¥¥¥ÑÑÑ'Nœpvvær¹[·n}ë­·ØBÚA“7ká…¹¹m&n`*a—Q3Ê;kWÖ…SFŒAvgÜŽ`ìbõÖyè¿•ärôhí`)ÝÁĉÿïÿþo̘1lõ ßÿ½T*ýàƒNœ8>>>W®\a{PiNÿ´æntsjFyG'D9˜:Ù¼Á¸;Õ[×ï&ÑAøóï~ùå—Ù³g³= Ô³ìÞ½ÛØØ8<<ÜÌÌÌÕÕu„ ÉÉÉÇŒŒd{hiüºz®½QÞþaþ6Ž6ô²;ãvc«7„b‘D").. €åË—ûûû>|þüù6lÀ¡6cÚo) „¶ûóÏ?íííß}÷]HNN¦>|¸››«ãBH;,Y² h„B¨gquu-/g&åçç³2„´‘Â(ïÀŒn„ØÅJ, #r:&11ÑÝÝíQ „RU«h:Sx¼Ò¥þáþ¶Ž¶àèêxíüµ€ð~ ¿0·°’_93²·{oº/•Ñ]”W“ãÐÇa÷êÝÔ2 gåßæÛ9Ûôï¥ñ27f654ÅÏ71“³jB¨ÃÔ‰ÅÖ×&ý`hðPr[,ïûv_sSsüÜx k òFätØöíÛÙê¹***ÌÌÌÌÍÍÙBÚD~”7ðöñ—$ Zɯ¬äW ›…Tô #Ê›¦JF7`LwwسÔx^7à|d×P3‡qmÒ¿˜Û<Ÿ@Ÿ¸¤¸ôµéŒC‘ƒ6ò÷÷OIIa{i…QÞnÜ 8­“.ÚÓMftÆtw7ôœ%91ɘedt‘{wÂÉÕ‰¼5ANFr8œìjÆâ0®Íç¿Zo *ÃC†Ó‡ä!ŒÈAH=zôèâÅ‹l!m’––Öê#r£¼]<\v¬ÜqãÒ6OGetFô¨¨MptpÊG)±Dnê êb…¹…y¼¼ŠÒ }ýšªš‘#­í­Ofž¤fݸ¥¯MŸ÷åÞW?|ehl˜*¬¬‹/ƒ¨[G·µxVÎÑ*2,dØêäÕX@w6ubqT¼6‡$ŒÈA!ÔØÙÙ)Œò¦³»]<]~»kÄåp8 /Ê›¦JF·…Ætwäœå®Õ»è‰IÆ,#ƒ¢»ä­ Æd$à|d—P'‡qmÒ¿ÛŒŒCòFätXss3—Ë¥Þ,„BÝŸJËØÑ·hdcºÛÌèŒéîfè9KrbRÉ,#IÉÝ r2p>’ íÅ¡.aU®M%‡‘Ó1ÆÆÆÓ§Og{ !„T¢Ö:И©¡è9KÆÄ$9ËÈ èî…º5AOFÚ8ÚH¥RœìžðFÙÙÙùùù±= „´ © çÈr™œe”§¤wÝb2’Ãá`õŒÒB¡JJJÀÑÑÑÉɉ>ÔÜÜ|óæM²qÿþý{õz~#èÉ“'dv —Ë8°Õ÷…îÞ½[W÷|qI[[Û>}úлb±øúõëd{ ‹ç·Œž>}ÊçóÉC† !wËÊʪ««é]KKKjõñììl;;;úU‘½^|ñESSSz÷Ñ£G< _ãYnݺU[[KïÚÙÙ‘kœK$’Ë—/“í½¼¼¬¬¬èݪªª{÷î‘ FŒAîÞ»w¯ªªŠÞµ²²òòò"\¹rE,Ó»nnnöööônmmí­[·ÈöC† árŸßR{ðàÁ£G¨m###@HÆŽ; z{ôÞ°dÆ%Ø j£^F]–…ó”!þù'P¶Y¶lÙòåËéC|>Ÿ1[PP0|øó®íÚµkÁ‚ônïÞ½©³ÑæÌ™óûï¿Ó»III›6m¢wëëëçÏÊÊŠŠŠ¢w?þÆoлzzzd ‹/ÎÈÈ w§L™räÈ ëø‡úûû“½.\¸@ïþðÃ~ø!½ëèèXYYI¶Ÿ7oÞ¯¿þJï¾õÖ[[¶l¡wçÿñÇ'OžLïòx¼×^{l ‘HÈ›œŸ~úéÞ½{éÝèèè£G’íCBBÈ ~óæÍo¿ý6½{éÒ¥±cÇ’íËËËéÝõë×Ó‹úÝ¿Ž\‡2(¿_>ñõ‰ý|û±=Ô>Ûþ³¼Þ‹è IDATæBuõë×Oœ8ÑÖÖ–|ÐÍÍ1íææFî¾ùæ›ÑÑÑô®óðîÝ»è]r^ÌÌÌçwqq!wcbb RRRÈŠßÌÌL¶Í /¼p÷î]%Ïòæ›o’õ.ãËâžžÞØøüÛçŒ|ÆùÉY|ˆŽŽf4 «gX·nÝŠ+È2PXX(‘Hè]zr2räHÆùÈÝÿû¿ÿ{÷Ýw¯]»6uêT@H1™1=‚í‘ öÙ»~¯««+Û£@Ý‹D"µˆ ä|®¦¡¶ádæIús5Œ]JÙ­²ƒ›N|m"c%J©Tzdë‘—ÿõ2T ª·ÿw{È”ac†©>°ìÙCƒ‡Rˆ?¸é`üÜøv¿6vðàAr’u[Ô½~ww÷0Ê>H²±±±±±QÒ@ù¯t===åç·°° ?Ñ!«wïÞJŽR¸\®§§§’––––––J(ŸÙáp8ÊÏoff&·²§9880J^åsƽzõR>[[[[[ÛÆÆÆaÆ*üŒ"B¸jROÇH"TBnHaþ©|±H,·½’fTH!&jœ \pæèˆ%û¿ß¿å‹-Uþ%lnûrÛñôãOŸ<Æ.íñÃÇ[¾Ø"‰¹F\²;ì^½›^ÃÊÎjìËcëkê€_Âç—ð››ó³ó€—ÁKý<õÊ™+¹1s×ê] u 7U§+,ÝßÔ©SÉO»¢n‹z›ð¶¾Î4hÐ¥K—Tù“õX­ hÕk)CZ.¹€(zø%ü¬Y[Wl-/-Å%Wµ zÇÊ;Vîxüð1Ù*¿ö¤ì©TË6£Ë)¬¥4KÍ(o‡>cbÆL™=¥Ÿo?²;$,J(.(–}ÆJ~e%¿RØ,,¾X D¬7#œŒøLùF!¤å<==[Ðt-ŨŸÈɤ³ÇÎRsŽæCZŽ,¹È¢§’_IÅ žÌ8 ŠK.+;+¿ ¿™ f:ôq »W”U”ß/{'ÎÊÎŠÑ Z—SXKiï(ߨ9±AQAT”÷ú…ë s é(o ›¿§»r‘Ý•=e«&>OØa¤‚cªB!]²~ýúç4YK‘õc2é^ñ=~ ÿÒéK×/\,†´Yr1Š2VP•’‹ìîâé2áµ ßüýÕ³We[2Ê)¬¥4H6Ê[Ô"¢"rö¤ì¡Ú0vå"»Ëm} ûIù—“™'m>Ä8|íܵ»×ïÖ×ÖÃ?©:ôQLÕA!¤íž ˜LuÎ?•O×OŒºªOß>ékÓí]쌋!íG&¦|”"Kè8wRÈ8äì’Hv¯¯©¿~ẙ¥ML7è? )ÄZJ³Ô‰ò€ñ¯Ž§6Ý¡ud·_Ÿ_ÐßËi‘I:tF*8¦ê´éÀø1h„Ò­–Ñ¡k)£®rõr½}íöÈq#©ÉE,†´]r1Š +¨¤äŠIŒi¬o¤R£Éî‘oDÐËAÍèrÊÚÁk©ÎÓ±(o¹Ý•P”¤£§§Gþ‡„©:ÊM›6 £¼µµrsYY#=é˜ÂÂÂiÓ¦ýú믌Uü¢µ* éZ*`Üß *QõYõóíG-í;Ú°Ò-Œ¢‡¤¤ä¢+-²»ì46YÑåþÃ.ŒÈA¨]¨$Âææf¶‚:WSSSIIIKK ÛAÝ—JQÞJê*Àb¨‡Á’ !„B=Ù¼yóph„B!„TõðáC, B!„j, ÒJ²A’rs%;£”Ô' ãã1Þ\ P)Öʹ‘pqqùüóÏ­¬¬Øê¾°€îéTŒŸ”J¥‡·–{ë§îC(o~ ÿÐæC©ËS?|LvgäJ2v1JI#¸\.½b êΨÒÙÎÎŽí ÎåââòÙgŸa”h;Ê»(¯¨(¯H•såŸÊ‹Äô.ÖUZ.¹Î;»wý^^·GÖOT³Ý«wS_$e¤TbýÔ}¨å]ɯ4·6ŸñáŒ}ßî#»3r%»¥„B¨§yõÕWåGy“õSc]㙬3©Ÿ§V”U€X$Þ“²'í«´š§5ü>¿„ßÜØœŸ_-¨Þ±rÇŽ•;?| XWi ²äºtúÒ ÿA5U57/ß$ë'ªe¢„â‚b`¤|cýÔ}¨åmicijaÚ"l!»3r%»¥„B¨§yýõן/cW˜[˜ÇË«(­Ð7Ð KŠãßæO?>Ào@?ß~£'ŽÞòÅ–ùkæó2x>>nÜÒצÖÖÅ‹Âü‚üf.˜I+äÍ=i4uæa!ÃV'¯~)ò%V^$R‚ŒŸ,Ê+2³4317áèq‚]«wyùx ›ä|ºƒLùÆú©[‘ò–J¤aqad¤’\ɬ]YN]1vÙ‘+ÉØÅ(%„B=ü(oFýDÍKQÏT†‡ ·´µl¬k€‚z ë*m!7~’¬Ÿ”wÇú©[Q3Ê;:!zðÈÁÔÈîd®¤©…)¹‹QJ1kÖ¬wß}7 €í 6ˆÅb‰Dlu®¦¦¦²²2OOO.—ËöXP7%?Ê›Q?eíÊÊ;™çæc_»uÅV ‹Ñ“F»x¸ìX¹ãÆ¥Twgwçô”ôÀˆÀþ±®ÒtÉõþÊ÷ ïà¾ÔãdýD¡0R*±~ê¶ÚåíæoãhCGH’ݹ’Œ]ŒRRß®]»¢¢¢°€îþø|>Ü»woøpüGM—Ž9òþýûîîîluSò£¼ÓWãj¨C}úöY¸a¡X$¦þ ^øíB®—Ãá@LbLc}#õï.ÖUÚŽ¬Ÿ”ÃúI{a®$B!Ô^ååå £¼õ9çÄ5är ÿ¾©A}âYn/¬«B!„ŽyçwpåQ„B!„ÚAá 4BHëH$Q‹ˆúzŸr µ '3OÒ·‰(ù§ò‡‡×7ÐWÔKn³ìÙCƒ‡Z;XÜt0~.ÆéuÄĉœœØE—ºsçΉ'ØE»Ý¸qNœ8QYYÉöXÚ-""ÂÛÛ[³ç¬¯¯ß°aƒfÏÙ<|øþ÷¿ÿY[[³=Í[²d ÛCÐX@#¤;å‚¢¼¢ðøpÈܘÙÔÐ?7^P.(Ì-¬äWFÎŒìíÞ[Ø$ܽf·¥­eݳ:²/µ”{Q^QLbŒCº»q/ホ ›„Q QVvVŒfôŠï@­øŽ Vv€6–’jºråJrr²££–ebK$ Ó¬¬ÃÇÿÈöXÚçñã§»víêŒzéÒ¥½{÷66f.‹©Õ¤R©‹‹Ëþýû©¯xéŒúúúGa­X@÷t*ÎYJ¥Ò#[¼ü¯—«8gÙ¦jAõöÿn™2lÌ0¹§ÅiÎ6‘K¹õ26 ݽÝ÷oÜÿâð©ì›£ÛÎZ<‹J"´¶·>™y’ìnegE/åžûK.Ý}Ü´qå÷Ë“–'Qß&›®øŽÔSQñ‹Ž(Ý–‘s¹R Ú³gOhhhçiJffæ+¯¼Âö(tDÛQÞ”†Ú†·ý¨hWS0ý»ëÑñ“üþ¡Í‡R—§RY’¼ ^êç©WÎ\¡šÉòfÄO’Ý37fîZ½«¡® ¹Ü“²§ZPM&YZÙY}yl}M=ü3Jžƒ-UA&V=ª2µ0µ°¶7m´Î¾Q’DH#»3¢pÅw„B=MJJJÛQÞÂ&á¶/·O?þôÉS`ì’è" Z×Oä6™Î8„ER×#£¼+ù•æÖæ3>œ±ïÛ}ÀÛÇK\’84x(ÕRn”7=éÐÇqf²;9YQVQ~¿<î8+;«J~e%¿RØ,,¾XLö•=-†«ˆ^Ê=8:øÚ¹kw¯ß­¯­g´¡’÷¤ì‘íN-å^|±˜ìΈ$›Á?I:Ôã¸â;B¡žÀËË«í(oKKò†¯¢û¿d‘4kñ,Þ>ÞW?|EÝämµM$Ïûryïw=2~2ÿT>9Ù"l·nŒ5 iät¦"dw¹Ó™aqaJ’,pšSEôRî6ËÒ–Õ=«£îP¨ì%I„äRîdw2zpÅw„B=^ÛQÞÔ _zgÆ.q˘¬ŸÈíVIà­a‘Ä 2Ê;kWÖ…SFŒ¡zw2~RQ›àèà”R$b‰‰¹ 9ÉH²€ìÙÞüí{Û3N‹Á– §§GVÏ$¹I„Q3£lmèK›ìΈ\ñ]ÓlllÒÒÒbccÙB!•´å–úyª³õ.uÿ—Þ¥‘E’’ç#“À‡°Hb=g Ñ ÑƒG&“½Ir£¼ÉÉHÙÆÆl(9I&YúùùùQ]§ÅiÎN‚I„ÝÄÓ§O…Bùß?Aé0êŸ?©g µJQÞä _E÷EY?‘ÛŒ$pòIìrÑäÍ5¶‰*seç2É6Ц3}Jd²0qš¡‚ÃaÞ“J T쥼%ÙFI{›ipÀ—/ß|ï½U—.Ý0Àí•WÆüñlõG¥¥dWeQ¥¸T¥ %Û(i¯b³v=5Ò=?þø£JQÞŒÉf%÷Ý2&‘Ià X$±ÈÁ…ùEÀvÁ¹L„F°^#¶÷IÕð´i‹ïÝûó—_¾óññúðÃŒJK©^¹vêRnÛ¶mjEyÏ\0“þŸ¶­‡BH+ܼY:zôlCÃ@É'O^€´´ŸÜÜ¢¹Ü‘nnÑ@Ìs8#¨mzƒ±-‹:¿ÈÌ,øÐ¡_'éØiÛ;à§OkÀã·³³Ý¾}_É}FE£’}.sóæÍÑ£GzxxœÿÌ™3eee@ÌK¥ÒŽÍ¯ZµŠŠT$ìðigÏž]TTtêÔ©¢¢¢Ù³ÿþ4NEEEqqñï¿ÿþÆo@rrree%UL+z™”¤¤¤ÆÆÆ¼(ÔÙ°€FHwÐK¹“ëµ3_g ×b'smȸ Öh\¦½3Ì›7ÏËË‹íQt_W®Üÿ¸{÷!Œ£F½ûo¹]È’—ÞÖ×׉D"KÀ€È:õôt€’¾ò‘È=­úŽŒ|éúõÌO?}ëÎo¿ýåchó¹tÌ•+WÀßßîÞ½ ãÇ€Q£F)Z¸†,yémj™/‰D"‹ÀÀàùGX©™à’’å#‘{ZY7nÜ€   z{çÎ~~~C‡€ææfú¹† ¢äeR0ª³Ûº§S?I’J¥‡·–}<ÿT¾X$î„q1aJe›ÈXj½vjQjñõ¸¤¸ôµé²½èÈ2׆ŒËÖA6€Y6¨Ë Ôx¼ÉE‰ä">¼&'g ðxyTss(+« vå~ÖÂßää\Éɹ ƒÚ|jUN«þ€_ye©¹¹Ék¯MWWG066Å1ÙWö¹tÌ Aƒ€ÇãI$‰D‡ÎÉÉ¡¤Ú˜››5! >kAÕ¦999T߀€€6ŸZ•ÓÊzñÅàܹsôöŠ+®]»vþüó_›/¼ðüñÇJ^&êά­­5å]v«,å£Fª´®½ªÕëþ½ŽŽ.SÞ>î<åMÆR‚‚dJE±”dÜ7ÕS*UAFy“yÝ‚ Ó Nôâë Ï×boýo—ÃX£p™vÔµÒÓW„„ ›<ùCCÃ@/¯Xps‹;6ÉÙÙnÍšùT›mÛ–¹º:zxL¶´ Qtž;—‡…ùOšô~ddrxxÀÎËÛ|jUN«þ€‡ óŽˆxwÈ×F޼wï`ãÆ%ööÖ‹Ûæ¨dŸKǤ§§‡„„Lž<ÙÐкQãææ6vìXggç5kÖPm¶mÛæêêêááaii©è<;wî ›4iRdddxxøÎ;Û|jUNKáüÒÒÒæãã“––«V­244œ1cÝþ³Ï>311yóÍ7•¼LÔíܹ³Õ*‚rAQ^Qx|¸D,9¸ù`µ zêÛSÍ­Ìw¯ÙmikY÷¬„MBr—öøáã-_l±´µäqÉî¶N¶»Wï¦Vw+;«±/­­®~ ]¯¿ÀËà•Þ(õ÷<4scfSCSüÜx3¹·1¤P#ÈøI3skó ¯MØöå¶äUÉdH$$,JذdCx|8=7ytûÑY‹gQ™ÛŒÕè±”ÀH£ügûÄžrc)ÿ¼÷gùýò¤åIôz/˜R©"2Ê›^¯]Éâë$Ù\¹F;à2í¨KŸŽ<¸ïéÓ©äQ>ÿ£ý´iã¦M'·;½Ý¿ÿ ÙÙÿSôD²*žV#^¼xytöìɳgOVt~F_ÆséòÓƒ>}ú4y”Ïg~ÒfÚ´iÓ¦M“ÛÞîß¿vv¶¢'’ÝPñ´²ä1bDQQùÈÔ©S©OnÐfΜ9sf«¥«d_&®ÒÍi,Êؘۡ1îÞîý|ûÝ}æ‚™tíÅxîJ~%X;X_, ë'FùEO€õ“FuR”7#–$S*Š¥$㾩hL©T½”;c½vrñuz-vO2׆BÅåÐk´Û8ÚH¥R\¦]ãΞ=ëíímggÇö@B©DcQÞ$²»²'ç…]?1Ê/¼}Ü©:#Ê[ÍXJ2î›zS*;€,—ÉÅוDÞ(ɵ¡×hçp8X=k\pppFFÆôéÓÙB!•h,Ê›Dv—Û û@¶÷0oE·ŒåÞ>îTå͈¥É”Šb)M-LɸoÀ”JÂÈ„BHM‹ò€ñ¯Ž§6Ý¡uýääGÝ—ò–1݆Q~áí㮡ñ(oub)e‡)•é’›7oFEÅÄ|Èö@zŠˆˆ‘Ô’jšõìÙ³ÐÐÐåË—/_Þö72QwÊötÁǬá(o¹Ý•PtËXOO,¿ðöqÀ(o„P—ár¹ÇŽMHˆb{ =Ezú‰áÃÃ4~Z}}ýÓ§OO™2¥wïÞ?9Ò¸»wïÒkÿ!u), U5B¡èÛ·/ìØñ9æDt}ûxýúõÓøiÍÌÌ`þüù8¯©233±€Ö RAHw¨‹XÃ>ŸÍö(B© èž®“’¥ê§êXª|$:çì±³{×ïåeðxûxT0Í–/¶üUùÕLn,`` {\]]MLÚýõ„Bliõ‰D"jÑK¨©¡¶ádæIúãË´²[e7œøÚDrá3J¥G¶yù_/W ª·ÿw{È”ac†µë³d jí`}pÓÁø¹ñê¾€žNÏá—ð ~+T bçÄ:ôq sm€NÃá—ð s +ù•‘3#MÌLv¬ÜQ”W“ãÐçùG¨ÉTP¬£bªÐÁ:ƽŒn>(lF%DYÙY‘!;˜°C.å~íÜµÐØÐÛ…·Ëï—u<¹.;(ŽÅÁÀÔ}deªc¾þz'#duMMMðÕW_mÛ¶í± ¶Ñ±äHM&ü?{gÕ•-ìU€2“@PTâ„¢AÅñ4­ÄNk'Åþ4^§›€µ1N¨Q4‚‰DZ[.±SˆC xµÅµ‚ Z"2–@U}?NØÙœ(™ d½O~œaí½WÅÖ;»}a}M=]W±Ê,RÙˆËĤ®Ø”Ú A3a¡šº 4b-¥!Ýd"dYuttuÚ먲ê@[¯¡ïB_ZRˆ Ýʽ¸ ØØÔØÐÄ£ÃQß—]²®#Z¤ºº6-íBxøÜòr1H¥²}û2Äâê+æ_¿~çÞ=‘­­@.‡%Kf%%¥54HV®\`lŒWñ{šúúz …zzz¥ éš››µÂkÂ|о‰Ðe¬ ]WUˆ*È®ûLwRÙŒœ0’ÔU|K¾R[!¼º°UW%‚V#,ÄZJCºÉDÈB#±Ž «´ë°$…Xð± µ8„vû²PXƒh…ââ_¤RÙ˜1CuÛvG òùöÛK̶®®NTTȽ{¢””ìÊʪà`Ÿ¢¢{”ñù&IÓˆŽII§ðBuÏcaaYYYøaŸ --mñâÅÚÎâ5¡}!Ðu½KW6}Lê*Ml…Сº 4b-¥!Ýa"d¡¾€SoÕ¶b–¤ >¤•;ÓU}Èè!ÌqV_vP¡ÅAa¶ˆ}÷ÝwÝÜÜ´ˆv¸¿´¥EêêêÄ* 'LqêT.³]^.Ž?:fÌP‰¤IWWÇÔÔØÄÄPG‡SYYÅãñù¼… }µ‘;‚ ý”öM„ PW‘Ýq^ã”›5±*®Ââ•ê*ÀZª£t‡‰(«¨ë´kÕ±-)Ä‚OC4ìË(¬Ñ_|ñÅ„ úmì£ê”·÷„œœ¨¯o¬ªª‰*dm_xEG'J¥2“W—@!‚t˜öM„…¹…t]mË,–±Zë*U¶BÐLX¨ª® „…XKuŒ.7*ƨGÕ#ÐV¬ÃÊ >y- õg6üý߀¡C’’bR¿/F·Þ`9thã‹u| Ô§Hw#“Éš››õõõéƒàááAŽÈåòƒ._¾œ‹ÅŸ}öYPPдiÓÚ]¨¶¶6---22ÒÓÓ½¼¼¬¬¬öîÝ»råÊ®ù$¢–ÆÆÆöM„¬ºŠµËR4±B—ÖU€µTç@!‚ Ú%ú}6׺íï #¿/ttt°zî%”••,X° ¥¥e×®]‰dåÊ•uuuyyyçÎ{ï½÷ ñññÎÎά±`Þ¼yÕÕÕ@çñxûöí‹Å+V¬°±±‘H$ /^¼€>>nnno¿ýö–-[`íÚµëÖ­[°@e·ÙÔÔT2|Û¶mQQQ÷îÝKII‰‰‰9q℟ŸŸ¥¥eZZdeeÍ™3‡åíí½zõj, ‘žE*‚ ZfìØ±fffÚÎA:Å”)S"##çÎ\^^þÆoXXXÔÕÕ€¹¹9ÇkiÑ´w=¼¼¼|Íš5B¡é9ýìÙ3{{{sóßïNH¥Rº€L&ëê… ÊÁÆòúÐ1ˆ´ÎO?ý¤í¤ °±±™={6Ì›7oëÖ­æææÌåá£G^¸paÆŒíΞž>~üxzx}}}UU•H$bŠã€€€M›6ÙÚÚ2òÎÙ³gççç3„\½z»é!=Ðý K.â‰d/Ì-œà3AWO—>X\P c<Æh’€*c% ,ò4¸€RYX[e#¢]’ƒ¡édeå_¹rëéÓê‰G.WøÉC“›[èã3A¯íO!D+èé陘˜À!CvïÞÝÒÒ”¹¾¾¾µµµÌ©¦¦¦'Ož(¯xzzzzz2Ûô𤤤2ïŽ9rçÎúúúÌ…gWWW¡PXYYiee•——·fÍšžú¬H§}•÷+‰µ±Êést‡Ê»±®±HXtå¦D7£Ÿ413¡•´W’µ:yšÀr!åPan!P6"Ôw#}‚ÀÀiNNvÅþs0s„4Ø·/C"i Ÿ qqG Š#"mmä¸@€Äh.—ËåþQN0Õ3Ô××çææ®Zµ ˜G¢˜w‡Ñ33U5éÅX=#=Æ'Ÿ|¢\åͪ¥ˆXX–o¼”Õ§é&•7 rä1˃‰a9#‰~ÒÔÜ”+Y1¬Õ±ÈÓÚ…´ÍQÁF„ún¤W¡ÊDHsþ¼.ô}ð lóæ(CCðôf`Àýõ×Çôq¤wÂçó#""˜í˜˜­æ‚ ÄÝÝýŸVE¢ÌäÌËg/çeæ1¾îw?z÷䮓¬1:º:!Q!~‹ü²S²I-u!õägåOö›Ì„÷ÿã¹{ì“ ÃmŠ[pd°ç\O¦äêB•7C;#Ååâ/×|Y$,j’41ÆJž9¼’¬Õ±ÈÓ¥*o;'» i¾Ý÷­Ò!ŒˆÙF¢îß/ýå—ߤR©šÚ8èìl·téìõë÷\¾|“ŽQuA¤ËQ®ò.Ì-dé» ,ÿ6^Êêëô€Ê›vFÊd2¢Ÿœ2ƒ+Y^I¨™ÔÚ+I”CvÎv´õݽWW×ÄÄÄ·ß~[Û‰h5&Bm¬©©¿rå–©©1óP¬££mbbŠŸŸ‡‹Ë`ú8‚ H÷¡\å µ#Ö¶d©Æ¿UN_¤;TÞ¬–3’ÖOÒÆJ:†µ:yDÐ@Ô ¸sç8e,¥ IDATNMM¶³èuŒ=„èÍÍy´q04ÔŸËÕÓ×ç@DD`}}#£Y¡#‚tÊUÞж–¢ÅÚŠþmÀKY¯ݪò¦‘tµm@=ª¨ÊjÉ€E‚¼ö¨7ÒÆA“¶?©ˆ¤ÐäÕ‚!]ˆR•·æÅw»ZoÔw#Úåÿ÷•·±S_K©ñoc•ÓwA•7‚ ÚM„}¢ò€”””ÇÏ™3ÇÕÕ•x¹ù|þÙ³gïÝ»gkk+—ËÇéÒ¥ŠŠŠÈÈH{{{¢ø¦µÞ””ÔÐаråJccc@}7Ò Ø¾}»òŬì¬:YN!‚ Ò …ÉÉÉgÏžÍÌÌÌÏÏ—Éd±±±nnnŒ—;**jûöí——çîî^UUuãÆ ‘HÄçó?úè£]»vÀÚµk¯]»Æšöüùó‰dĈIIIÌ‘¬¬,???fÛÛÛûܹs=ø)äwP¤‚ ¯ª´8J}7Š°Â°­{ñÉ'Ÿ¸ºª| ÷µä—_~€!C‚9m§Ò?hnn)))éÖ%¦L™âààPPP|âĉáÇ3ÇËË˽½½‰Ö[WW×ÔÔÔÄÄ„y”±|755©š¶²²’Çãñùü… 2GPßô°€F×ÒÊé×Þ$iš>hß ÝÊÝÂÆ‚8kœF:ÑaØÖ½'Ù²e‹¶Sèi˜¦u£F9k;‘þÂÇåêv Dåíïï}óæÍÉ“'³´Þ,Ž=š››;}útÅSŒÖ; ::Z*• 껑ÞÐý UÞ,ðÚd/„Öâ sVö ,jsóš&í»aZ¹3.›°˜0ÚYC‡¡¼éV\\\àÌ™D^‚îôõ§Œ9²»W!*o33³äääêêj>Ÿm½Üqqq0zôhÈÍÍ Ÿºû(1:ñöÕÛ —ËO8 Õâêï BÓ/VUV1ñé_¥wa2ˆ¸LüCÖÌvNjÎþMûúá'Q‰HT"zÙø²ðb!ˆJDßýýÁ­Ë–%Öæp8̵Im~¤Z‹cçl7{éì=ë÷ÜT0JÐ.PmÌÁ¶î‚t‡CJ^.—Ëòo3Œ9räÈ‘¤zV…ŽŽ™Š!22ÒÚÚšÃá`õŒh…ï¾û®MM×RÙ)Ù_þõ½¢{uW.\!Å“´Ez<ñø¡OÕ<¯¡·eRÙ©=§Ž'¯W@ZRÚÑø£ u ¬%Ÿ”>9°å€´E:@‹?Æt.3˜MŸ7½¾¦ž £‡Ó·’±bëZhý$äœÌ‰X1Îk\…¨¢BTÑô²‰ù;•“}Òʽ¾¦þÖ•[Æ­F ÆwÃ|7I+wE—$††BAº;;;;;;mg áG8èû¿úèÝ]»N fžžccbÂìí­ ²LK»pöìeψžV$ªÐÕÕ‰ŠšŸšzè™oßþµ¤D”—wýÊ•[••ï×úLš·÷øsøLZ'Éd/_¾ìðp¹\~àÀ‹Åüq~~¾æc;0„!==½²²R.—õÕW¯:éÏ(Wy›˜™|’üImu-­VfŠ'û!ökv¯‘¶H™·ûémú–ñÆCë^Ô)53ÏZ2‹Þ%E- §‡“[ÉæÖæLņ×Ãz¥/–P9‰ H—0eŠ›ƒƒMAAqp°ÏÑ£gy<#>Ÿ·p¡ïþýßšš›˜êèüÞ¦ÃÜÜ”Ç3jjj¦‡b/UˆDqÔÃH 66CCƒææ¨¬¬"3ß¼ywûö;;K}¶½É)Ã;œ gL„4d7772D*•îÛ·O,¯X±ÂÒÒrß¾}‰$<<\ 0§È.J ‘Ž‘ ²‡ÃQZþÀî€ÜŠÛ´ú[GG‡~,á987l.ó.`»á ¤\ûÉ¢”mË·h; ¤ ’z‰¶SèØØXÌž=¼¢£¥R™‰‰’Ž G~Ÿ›{eúô‰àèh›˜˜âççáîî:|øàgϪÕ/AÏÁ>9's>ýæS®·0·øVüÛWoOš9‰˜™®£«"º'ÊNÉvëBbø–üÉ~“ù–ü iX+þzû×7†½ñ´ìé­+·¦N#ÃÃbˆUÇL`6ÖslXLéBËtФƒ òzÐ aLLLwd‚ ¯Äúõëÿ¸M[oäß`L„Œ/ž¡­&©Ÿüùe§d“¢ÇÊÞŠŽa-Y!ª0᛼ûÑ»'w¤}Ñ,YtøÚðÛ×n=-kªëy×G¹ª©ªùÏÿÐ+ÒS±”Ô€ê¶Ðö`™ÛBËtârñ—k¾,5Išè˜êgÕVöVk¸Ð}ˆ ¯12™ìå«ßüLO¿XYY%—Ë¿Â{‰‚ô8™ÿ¨«ÚjU@êM„¦æ¦F<£æ¦fV•¦´DS—º®Ž±©±¡‰!G‡ÃZñ© A,ÅXtÀDHh¬o¬©ª©U°¾k^^û7í?žx\qˆÃP ‹É¾“p¨¶Ž¶)‰)äÏt"¯7;vì())ÑvZƒ˜Yú@âÔ"Ò«hóm"ܽ£äfÉèÉ£]ƹÐ1^^‰Ñ‰2©ÌÐÄP&“1S†2E‡Ÿ£¸ä÷G¿¿’{eâô‰vNvGâŽÜ¹~G}ŠdZWwWU1ªVT\‚)ŘçC°µ&Âú8LjmÅÈtCb“bõêÓ^h&&fg WŸ«£ËöEsÆÜÖp›ê¬á$ÀˆÀÆúF¢•&2¾M:ÈëGtt´Ò†\¯=BaQNNÁÇåzzºÆÆ†Œ>ððᬱc‡w`lì²Û·6ì²²§W®Ü œ–••?§õ±.oïñ«WÇûãc]‚ô ™WQ†'ž9ÖÒ]ô¨1„Œž<šYˆ®ÒH‰¦ª–"0CZ»„*®ÈLÅZK1 Qe"ÔÐŒÃÈ)Û¢ømUu ݇òZB›ss ‰>vÀ!ö¨ìýÈd²ææfú½WB.— š6mšú!wïÞÝ·oßÒ¥KÝÝÝ5žžžîååeeeµwïÞ•+Wv,[¤ŸÓ!­ dU9dW•‰Ðq¤#PÎBõ¾hÅiÕ”b,y!Aq ,Å:CÌ8(ÓAD ÄDHò¢>°OÐÃ*ïÒÒÒ-[¶XXX0%»†ÃQßtžE‹õ1!–b‚ ¯ÄDÈҲܨìåô¼ÊÛÞÞ>00pĈnnn ápÔw#G"‘ HADËØØØ´×ÏPãÔö>z^å­ ŠÃQßt X@#‚h™òòrm§€ ]@«¼Õ£j8껑. èþŽ*•·¢L[)¬0n#‚ô[zXå K–,¡w5Žún¤KhS@«ª¥4DÃ’«ó`•Ö…ý¤L*ËØ—Ñ$iš>h$sŠQNZØX3¥ÓH': -‚ KåÍå*)-FŽ ¯ªò&ÇØw5Îù{¿/¬ž‘Žñ׿þµ§UÞ¯êßžè3‘Tuf3@w—B«¼‡¹ +{Pµ9Šé@GË´iewXL1~³ÂP¸ ‚hª¼‘>ʬY³zZåýªþíòGåeÊBÞaªg@w—Bë'íœíf/½gýž›—o²ÂXÊIÚLIƒ–GA:€†*o¹\~àÀif;7·°¥Eª4 ß‚ô=­ò~Uÿ¶bU‡UZ×Bô“õ5õ·®Ü265fÞŒ¦eÚ:·Q¸ cÆŒyyyÚÎBk•·T*Û³çTbâq±¸º¤DTR"jl|yñb!ŒiÊ!WÇʼn‹;RZúÚ¿Qñ HÏÐÆ´L«¼Oï?±7ãîOwY¼¼~þ÷Ï÷oݯ¯­gÕU¤–¢cÔ¬­*ÌÎÉîBÚ…o÷} U`•ÖÕý¤ÏÈ?Ô?âïŒd;0"péß–2útFÙýçOþµ9 Úš)é0gWg™TVUY%—˯å]cžB¤].]ºôäÉmg¡„¢ää̳g/gfæ=zTþàAÙûï‡f"Q…HTñòeÓÕ«·™Èµkï]» ™§çؘ˜0{{«óç…Äø YYù~­·(½½ÇŸÃ[”‚t=­òî€Û?Ô_«G^mDw÷A ‘ ´fRCç6Zy%h•7,]:{ýú=!!38kp‘eüFÅ·v!*oÍ]ÜP[[›––Ƽ؇’m¤OPTTÔÓ*oZ¾ šù·YU`•† òATÞ55õW®Ü255ÖÑÑqr²‹‹;rýú¥CmSüü¦òFA^3ˆÊ›Ç3 õçrõôõ¹°k×ýÖ[‘ q­·C#"ëëŒB[ã7*¾µ­ò&ÇSSSi•·®®nTTÔ½{÷RRRÌÍÍýüü,--ÓÒÒ%ÛHŸE*‚ ZfùòåŒ 1¡n9(ëöC0¢nxÒÆoT|k ZåMg©¼ËËËãããÇŒ#‘Hž={foooddÄD¢déC` ¢eöï߯í¤ *oF¦ÍRy×××WUU‰D"™L²iÓ&[[[FRˆ’m¤t§kUÞŽŽIA¾ QyC[™6­ò:thRRÒÀ™ö;wîÔ××g.<£déC´ic'“Éš4èf¯ŠÂÜB©ŠÎöªËå§[ãÀÅô‹L´tl€ßSˆËÄ?dý2©ìÔžSÇW‹««ÅÕG⎉;ò¤ô 9u`ËgÏ '5gÿ¦ý?ýð+Œ x<-)íhüцº5«Ç$‡Ãa“=ýµ@Aº.—ËTÏ FFF¤5­¡¡!ýØFdd¤µµ5‡ÃÁêéÍ=z´MMj)ÈNÉþúó¯ïݪ`bN±Š!¦®bC$†µ¤¨D$*½l|Yx±ŽÅ#]8°~êyhý$-}¤½’Ъòf”“@™)YaÖqZ9©f•þ옔Ëä©©©Æß}÷ðÝwß·¥©©ÍߺQQQôYÖ3ˆààà@°ž …¬ùKKKé€7Òg§NÊšâĉtÀÖ­[鳿þú+kþëׯÓIIIôÙ!C†°æŸ;w.ð׿þ•>[__Ïš?;;›8uê+A¤C˜™™ýñG‘°¨ § üa¹®ž.ϜǨ¼™S9's>ýæS¦µ] -‹]"º'ÊNÉ‹ cŠ!®—C/Y!ª¾ÿöÕÛ“fN _¾{ÝnƸ‘Ÿ•?uÎï¿•Ç{_ÿ–ÿ[=ó…è·¸Mq³q°).(ö öFú8#dÆXϱt˜¸\|4þèÐ1CÕ«¼UA+'‰ZRq•þì˜äp8îîîË—/'GÞ|óM:àÍ7ßܽ{7}DO¯ÍóW¡¡¡d×ÎÎŽµD\\]sÓÁàììÌšŸÏçÓ»ï¼óŽ““Ù57oÓÖ¯_Ï´¬Rš¿@ `Í?xð`z×ÇLJ8Ýw|ÕªU üñTÏðáÃé³úúú¬ùGMïN˜0Ы¨««300`}Oû2™¬¹¹E_áA2ÍIO¿èå5ÎÊŠ¿woÆJ|ú AîçŸ×t-uîÄ9 UÞt]EP£ò€Šº¨?×OZD½ÊÛÃÏÃÕÝ•('¿)t˜ªã^^‰Ñ‰2©ÌÐÄPÍ*ŒcÒÎÙú¡c’ÎÎÎï½÷žªóŽŽŽj΀——————š€wß}WÍYkkkõóOœ8qâĉjæÍ›§æ,ÇS?ÿ¨Q£F¥&àí·ßVsVOOOýüÎÎÎJÛ\ÔÕÕI$@ fl`bb’ššºhÑ"í¦¡-ÊÊÄÅ Ì,) …E"QEX˜¿ƒƒÍ¾}bqõŠóml,Ξ½|ïžÈÖV —Ã’%³’’Ò$+W.066$ún`ôÝþxñAn¦ÍZå½#zGÉÍ’Ñ“G»Œs¡cèbH&“Ñu)†èÖzvNvGâŽÜQÖ¿_×OÚƒ¥ò&ÒGÚ+ɨ¼‰r’¥ò&a4ôq–½RÕ*è˜Dzž/¾øâôéÓÅÅÅÚN¤ÿ"åä<|X®§§kll¨««5ÿðá¬ØØeQQ!÷î‰RR²cbÂòò®ûÝ{ð ŒÏ7!úîØØeYYùsZï^z{_½: hmÑy!!77×ÇǧÝÛ2¬0"=FO«¼íœíhM7=9ÖOZ§3*oEå$=„VNªY“Òß UÞ¹¹…66CCƒææ–òrq|üÑ1c†J$M ««cjjlbb¨£ÃA}w¯¥“&B‚X,Ž‹‹+((ˆˆˆ°··OJJjhhX¹r¥±±13\"‘„‡‡†"C¤Ç8xð TÞjŸÅú©ï‚ÊIA:QyÓÔ×7VUÕˆDŠ1ê»{'7§§gLLŒÁùóç%Ɉ#’’’bcc=zôàÁƒÍ›73m=H ÈéAΜ9ƒ*ï~JKsË• W´ò;ÏŸ>w0qÐv¢ˆÊÛ×wsdÆHHJŠØz‡“‘xý{{Ôw÷B:o"TJee%Çãóù .ggç¥K—®_¿>$$„ô™f@‘!Ò“ôÓ—¾‘ºuÌú@ÛY àæì¦í­qæÌ™ ðº)#ÕOŽ¡¾»wÒI!££cbb¢ŸŸ_@@@tt´T*e-555W®\155eþ²"aîîî(2Dz, û#‘‘‘K—.Õv]À¾}û >¬íDº.·ã=¼óÞ{ïh;  Ôv ÒtÒDHQ__Ï\œ>tèЋ/˜Þš</44”Ëåêëë³ÂPdˆô$m hUVgEj.¤] ,3 ½¹¯ ¯¯ÏüèéÓ466îÚµ«²²òñãǬ¦¿¢!NNNtkAº.—K_# ŸÙ מÈÁ°°0kkk¦££Cw¦'5ºâl¤•VÏH·2|øð6´¸L\\PÌhMÒ’Ò$ ’+ˆËÄE¢ Q…˜ÿ ÇAM’¦c ÇL-Lë^ÔÑcaqAq`D •½n0Ð c_F“¤inø\3+ŒØ€±¢<Ñýû÷?{öløðá[¶la½€‚ ‚ô-bbb´‚hJBBÂ*oÚêL«+D:º:ó£æ_H½çNœ›ì7yŠÂÓ´–Y•º$ÏýÙÞŒt†ÆÆÆÏ?ÿü/ùËÖ­[322nݺ¥íŒAé/üQ@»Mq Ž öœëéìÃR l†-Í-Pý¬ÚÊÞŠg®¼ÃƒRuóÍË7#Ñ>ˆtŒýû÷WWWÇÆÆÎŸ?Ô¨Q[¶lÑvFÒq¾ùæ‘H¤í,´†L&{ù²©ý8ÍHO¿XYY%—Ë¿ú*½«æDa¡Cï¡W€×Ïÿþùþ­ûõµõ¬^^û7í?žx\q.ÆDxûêmz8KÝL‡A«}9ŽöADC˜ËÏQQQ666:::7nÄ‹ÐHǸvíZFF†¶³€ÿú¯ÿ*((ÐvZ£¬Lœ•õ””ˆ¾þúû­[>|X&•Êöì9µeËŠŠgpöìå/¿<‘ššsòd$%¥ÅÇ­«k`‹ÅÕ@´Þ‡Ñzk÷£!òºÒ¦€&&BF7è·Øoø›Ã'ùNšä;ÉÐØ0rC$8tŠÙ³â¿WD¬‹`͸ôoK]Ý]éጠ:âïnSÝXaàìê,“ʪ*«ärùµ¼kÌã×¢rù™ÙÅ‹ÐH‡9sæÌ¦M›´E¿F(,JNÎ<{örffžHTÁ¨¼SS/èêêDE…,Zä—’’ yy×ÝÝGUUÕܸñŸóç…DåýèQùƒeï¿"˜@VV¾_ëcÞÞãÏác=‹L&{ùò%ˆÅâ?þ8??_“QµµµÉÉɬƒ¹¹¹---íŽÕ0ŒF.—8p Ýáééé•••r¹ü«¯¾z¥ù‘~‚Ê6v´n…¡³¡ÆÞ¬FÝ hoF:}ù™9Â\„^¼xñ­[·°‚ô-:©òvv¶[ºtöúõ{BBfxzŽE­·vѮʛ §cªªªÀÁÁáÇœ9s&ÄÇÇ3½¢Õ¬‚VpD=+V¬Ði?J5a1aä?¦“‚t7¬ËÏ xAú.êUÞÍÍì „^ÿþ÷Ï·nݯ­­¯©©¿rå–iëS‚ŒÖ› C­w# “““Ïž=›™™IgTÞQQQÛ·oFå½hÑ¢”””'NøùùÑî¢ò¶··§UÞÀ¨¼ßÿ}@@‡ÑÃé‘H$‰^¾|yõêUæìÚµk¯]»¦~•¬¬,???&ÞÛÛûܹsÝò%Cú,(RAúŠ—Ÿð"4‚ô]:©ò õçrõôõ¹€Zo­¢u•7Žáp8ryû7"X« i, ‘¾ÄþýûÅbñòåËŸ={Æ:åíííèèˆ=¡‘W‚Ëå*:„{M~Á÷C4Ty›´}JµÞZD»*o2–ŽqrrŠ‹‹»~ýºÒ„U­‚Vp¤]8ðYêg~‹ü´ òj̶½ñïW¯^­íDzŽÆÆÆ!C†”——«‰ÑÑÑùùçŸñ"4‚ôrN:µhÑ"™ì*‡ÃÑv.ý}ý)ÉɇBCC»vZæAáK—.©/1›ššˆÊêë†Ë IDATë‰Ê»¡¡A©Ê› c.NËd2¢ò€ÚÚZ¢ò¦Ãhè‰D¢¯¯¯ê_šªU’““¬¬¬^¯aZZÚâÅ‹ñ/öÎóÎ;ïtDå­JÙ*o¤[‘H$ÇŽ£ìÝ»÷ÿþïÿvïÞM466îÙ¼Auô€Ê[q8Ù500P“›ªUÐ Ž¨!44T¹Ê[&•ÚsªæyËX—iïL#^nCcC–‹›ŒE•7ÒÝðù|æjBvvöo¿ýÆ:ˆ ‚ô9:©òF8Ò“,Z´H¹Êûÿ®þŸ¥¥¾þ˜)ch/7(¸¸ ¨òFA:1ŠÅÕ¼ƒ´ÑËåœV:$7·°¥EJvÑ>ˆ H£\å=dôü3ùf3¾%Ÿ¥õÖTy#‚hš¡@`6oÞôššß ¸ññÇÈ›‚´qP,®Ž‹;w¤´ô  }Am \åýôñÓºu¿ÞþõÌ¡3ŠZoÚÅMƒ*oAúÇ_µj•¶³€o¾ùF$i; í@›Y§Ö® ¿ví÷_4´qP 0óôfoohDD´yš¨¼Ý}´dõû!ö§œf¼Üu/êˆY00"°±¾q Bƒ!ú8=Ä?Ô_«GÞM¤Ãœ]‹…ÅU•U|+þµ¼k(#D¤'¹{÷n^^ž¶³è×Ð&B5a,ã } 탽™LÖÜܬ¯¯/‹?ûì³   iÓ¦µ;ª¶¶6--¼´Ç››ëã㣧×N³] Ã4$==ÝËËËÊÊjïÞ½+W®ì’9‘×’ß~ûMù¿9Ϲžy™ywkî.߸”i½™òUÞ‚ H'a™ÓÓ/Ž?bÐ K:†ett´MLLñóópwweìƒÎÎv€öAmÓKTÞ’’òøñã9sæŒ5Š,gccC¨ïF:Æ| ¼€ÖÑÕ™2£Ýña1a]‚ Ò¿ &BðôK_`f„ÀãÑÆÁˆˆÀúúFÆ´‚öÁ^‚P(ÌÉÉyøð¡žž-#dTÞ...Û·oß¶m£ò¾wï^JJй¹¹ŸŸŸ¥¥%K€E$Û´d;66–ÑtoÞ¼™éGÂèáùùù2™,66–Ù%ËÅÄÄÐÃY3gee1ªðöö^½z5ЈÐDˆ ¢e ¤í,z;,ã í)Dû`o ÷¨¼KKK‡NV'˱†£¾é X@#Ò3fÌË—/µœ9sFÛ) HÐKTÞþþþÑÑÑ7oÞœÓ}œ×8²í6Åí䮓/%/¬\Àôå ÃÈ<¬UÈ´f³éó¦×V×*]1;%ûéã§SçLµd©T$®§§w,ᘩ…iÝ‹:f8ÊÃA¤·*o¤áää¤\å ákÃo_» ,7 Ëòs2'b]S“íœÔœ1cB¢BR¶§0£è0½ kZU+ÞÈ¿!—É—Å.æ6L•Hü܉s“ý&O¡$¡<A¤WATÞŠÔÖ6$'§j—¥õVÚ¿éB”«¼é5.n–å{°Ë`®Áï÷hȶ¸\l󆩅ic]#딪UÔÈÃéSOJŸ¼1ü ÅDÇT?«¶²·â™ÿÑÄåá‚ô6LLL¾ýö[mg¡5ˆÊ›ñuoÙr ¢â™DÒ´m[rJJöÓ§Ï€µK`i½“’ÒâãÖÕ5ÐêoÅ0´#ÒI”«¼i]ÜEË·"ÓçM?¸õà?þþ©s¦ªÉƒ^Eqڋ韖=e­ø–ÿ[§÷ŸÎØ›q÷§» B$îàµÓþã‰ÇÉB(G„°qãÆ1cÆh; ¨««kiiÑvÚVyëêêDE…,Zä—’’}âÄ9?¿ÉD°ÂÚ%ÐZïóç…IÓˆŽII§hõ7+ Ðþ H§Q®òfX· ŒxF,7eù^ÕÚñžÞ¶b¿f÷i‹ÔÀЀuІµ =íXϱc[ûê³Vü$ù“ÚêZf[•HìUýÛjâ5™ªku߀Æo ##C£OtU­¨ïfY¾À0€;@ñ¸âTdWQ®ô‡Ã¡Ã”ŠÄIáN@y8‚ H屮ë뫪jD¢ ™L2cÓ¦ý¶¶CCð¢wiˆÖ; À+::Q*•™˜²Ô߀ö屮€X²=zàþýûS§NeiºSSSïܹ3sæÌ©S§ÒÎmââ4h*_·*ã÷ÀÕ辕Z¾---•*¾é© ñ€¯¿þú•ÿ ëB}7šÀ‘ÎSXX8`€’?Ϻ„/^(¶÷G¤k!*ï¡C’’bÔoí£¯ÏÕÕÕ€‘#è]Zë}èÐÆ/êø|Ðêo@ûw÷C«¼H,Ùk×®‰‰Ñ××ÿïÿþoh«é€“'O~óÍ7Ì6qnOš4‰vq+õuƒjã÷Â… Ué¾UY¾çÏŸ¯TñÍš Ðø0 Héüûî»&tË¥£Ÿ~ú‰î*Š ÝÊþýû'Nœ¨í,zôC¬‹Íd7º{6×ÚÚ܈ºýÈo½ýÈRÚ¿»Zå}ôèQbÉæp8ƒ~òä‰ÒG;\\\˜Ò–vnÓ.n ¡½Üjtߪ,ߪߊS¡ñaÀéÃŒ?~üøv ;ƒÇãaÝX¸pá”)ì÷ÒzžåË—k;…¾D ޽쭕7mÉ...666¶±±¹xñâÌ™3A…›V|Ó.îqãÆ)gPjüV£ûVeùV¥øfMhüFZáÀg©Ÿù-òÓv&È«1ÛvöÆ¿o\½zµ¶y=ùþûïëëëñéN:µhÑ"™ì*‡ÃÑv.ý}ý)ÉɇBCC»vZæiàK—.)Ö‘2™ŒX²Qôo3‰s[.—·ªxÖ)zÅÚÚZâëf §g¦W¤‡¨™ ’““¬¬¬ú–³0--mñâÅr9¾5ÛY"##Ûª¦ªæ?7þ£FßM¤â@ë»éÄ*D:º:ó£æ_H½èëF¤OqéÒ¥'Ožh; ­¡Få­ ªTÞS|w!Œ-PŽ ¯í«¼Y.nq¹øË5_ ‹š$MŠ¢l¥Ðînz¸Ž®Ž±©±¡‰!G‡£FßMCë»Y‰ l†-Í-€¾nA4ãîÝ»yyyÚÎf̘ÑÒÐDå ))ÙŸþuQѽ–ibâñO?=ôüy ””ˆJJD//^,,)}ýõ÷[·|ø°Œåè&(WjùV5œÎÚ:ÆY’pUòpb †#Èë‡:•7#Ðf¹¸ëkªj*D-Í-Š¢ìv¡‡ÓÇ5±‚­ïV# G_7‚ špüøñU«”¸Q‘ƒVyççßÉä±±ËÜ܆¥¦æxxŒ‰Š Ù¾=D¢ ‘¨âå˦«Wo‹Dºº:QQóSS/°ÝÖqU–oUÃéL€vŒÓÃÕÈÃi[8ôa¸L&{ùò%ˆÅâ?þ8??_“QµµµÉÉɬƒ¹¹¹šøí•†h–r§Ð$IŘôôôÊÊJ¹\þÕW_ugvH÷¢RåM ´i·ÃP‡Ø¤XýÖF÷,Q6aÖ’Yd›vw³†ÀÑC˜ Ú¿Í‚Ì`bfBë»Y’pˆÜ èëFé#Ð*ï'Î o½ÇX^.ööž`aaZW×Ðll††ÍÍíX š[¾JKŸL˜dˆcœ®fZ–-ú‡0œ˜Á¼y󪫫 ¥¥e×®]‰dåÊ•|>_*•ÿŸ™™YBB‚……Å‹/èyT)™áª,ƒ uuuB¡ðÂ… aaa´àˆûÐÚÚZ(ŠD¢°°0GGG¥öA>ŸÏ2¶›¤z"Š _bcc5êÍrq¤zÑ“âU—›=œ†ø·ÕOEë»UIÂ}Ý‚ }¢òö÷+:zÇÍ›%“'ž7oúÖ­ÍÍysæL''»¸¸#ׯßQN;ºUWcùV:œÎdÜ8Ú1NW3-m ‡þ! §M„ÁÁÁäxjjª‡‡‡‹‹ËöíÛ·mÛ¦««Küæææ~~~–––iiiôTªƒ±±±=Re¤qrrš5kÖáÇcccÉrÌ ˆÄ}˜››Ë$søðá±cÇ*µþúë¯,a»Iªñ Š _îܹÓe"T|#‚ €¨¼ÍÌL’“?©®®el‚»w¯ii‘2Bgg»]»Öèë ûFoØ mÝ4ôqssž*Ë·Òá¬LXŽqz¸ªi‰-ÜÚÚ\.—÷a8m"¤———{{{[XXÔÕÕA[ÿß³gÏìííU5xf ½€ Æ2HcccchhØÜÜL/Çœ"îC:L}P“å4ô Š _#ÐDˆ ¢eÊËËÍÌÌ´E¯€Ãá7—;€KÝc4h}]¦üU£øµ–oUÃùÔ#…ôTôp5Ó[8‡Ãyí«gb"dHOO?~ü¼yó¶nÝjnnÎ\y¥ƒ!!!›6m²µµU¼¾«T1j,ƒJS¢—S“¹*û ¢‰°Ý$Õgˆ"Ã×4öUÐDØ­ ‰°ŸÐÔÔÔÒÒ‚ßåžM„=LÏ›iXÿ£Ñþ¿††}}}Öóâ$LQ1j-ƒJ¡—Sƒ*û ¢‰°Ý$Õg¨E‘!š»ŠwÞy§Íh™LÖÒÜÂÕWùW>ƒ\.Ï<˜9où<ÅSÓ/ŽóÇ·âgìÍX°rAW&‹ ÒÕp¹\.·Ÿx‚tÖÿht5Iªê„„r0,,ÌÚÚZ©b˜KѬÙ‡+]N ,û Òå4LRi†„ÈÈHfE†}—¹sç*7^>{™8}úw …Pj@Q‰ý‚ ‚t’N*{ÆPˆD„!**J¹‰vÒî@&’¨Ñÿ‡ ‚t’Ž™ÏJþÑ ÊM„´#v*ŽGÿ‚ H'‰ŽŽ¾y󦶳д‰055gÓ¦ý?üð­Ú>”ç%‚hu&BUî@EÐÿ‡ Hßâ»ï¾Û¼y³¶³€;v”””h; í@›àäÉœuë"¼¼ÆÑêA íƒÐÖó×O$‚ô*ÚÐÄD¸*nÕÑCüCýWÅ­bÜþäÏQ›£H$£œä;i’ï$CcCâÿ“IeU•Ur¹üZÞµ™ föìgAy5®_¿žžŽh“)SÜ"#ƒçÎõ ö—ÁL»:Åæ´}åùë’¿>A/Qy³¦•ËåP5е‘P[[«QhUî@EÐÿ‡ ‚¼ÄDH£F=m=ýAò×Wè%*o‰DBOÏô]f *o///k#ãÝwßm§-"‚ ‚t+ÄDqq«˜ F=¸vmøºuàë;É×w’±±!ctuu–JeÌK„yy×à Ï^€P(LNN>{ölff&}œQyGEEmß¾{ö¢E‹RRRNœ8áççG»Wˆ%ÛÞÞž¶d£ò~ÿý÷FgM»víÚk×®‘³'Ož\·n——deeùùýîÁðöö>wî\Q×4"‚hwwwsssmgÑëP£Êó×O$½ŸÞ£òV?-­òF±6Òa°€F¤ÿâää4iÒ$mg………ÚNAº€^¢òP5- k# hAú/ï½÷Þ{ï½§í,ä5AOOHø<==ÉâÝ»w•÷СC“’’ˆ[{çÎJUÞÄ€}èÐ!bÉæñx¡¡¡D”M‡FŽÉš6..Žœ¥·]]]…Baee¥••U^^ªÍéˆÊ[CPë ‚ ˆvUÞêA±6Ò6oÞ¬\å 9©9ïÎk\ZRš¤A²`åCcCú”…µX;XÿüãÏ66¨õFAÖ¯__TThee¥ít¾AŸPy#øq㔫¼ çdNĺˆq^ã„ç…M’&Çާ’N1‘äT…¨¢BTÑô²éöÕÛ¨õFA`êÔ©ç/ùË Aƒ¼¼¼¶oßþË/¿¨‰§UÞwï>ŠŽNdä)r¹üÀÓÌq±¸úãwä·ººrs [Z¤¯”•&CX1Œ-œÉ…á‚Ð(WyÀ`—Á\.TUVñŒx|žïB_&’œ‚¶îQë Ò† –­í,ºŒ¹sçž9sæÙ³g©©©NNNÿó?ÿ3lذ1cÆ|òÉ'ׯ_—ËÙ¿ˆÊ»´ôÉ–-ZZ¤úú >þŸÏcb³yó¦×ÔÔ€X\w$.îHiéHJJ‹?ZW×” œµ„ª!R©lÏžS‰‰ÇÅâjV ±… ÃaÑæ¥*o¯¯ÄèD™TfhÂ~›ÕÎÉîHÜ‘;ÊÝ3Zo;g;@­7‚ ½•/¾øâŸÿüç¥K—´›Æ/¿ü²uëÖÇÀ—_~iggGN¥§§§¦¦’]›Ý»wÓc×­[wÿþ}²°lÙ2²ûüùó+VÐñ›6m5jÙÍÍÍÝ·oÙ5008vìwýúu²ëééù·¿ýìÊåòE‹Ññ~øá[o½ÆÆÆ!!!ƒ®¯¯‹Åeee;wîܶm›ƒƒCPPiÛ'åä<|X®§§ì8mÄG7·a°vmøºu»{< fžžccb ¸çÏ %’¦#“’NÅÆ.;y2ç›o>Uì§jÈÂ…¾”mÞehh$²²òçÌ™Jfðö¿zu¼?>‹ˆ ¨RyC«¬x漇6ú-öþæpÖ);g»5»Ö„¯ XZoAúuuub±XÛYÀÂ… 8GQ` À¡`¨:«8ƒú³Ÿ_1@éüÌsí™ÆRy¿*••U<žŸÏ[¸Ð(¸†Cœí–.½~ýžË—o²ÂX¶p@a¸•·z4Ôt+¥      cc»„»wïFGG_½zµóÉc\½ùœ‘Ãï¡o¼WpñâEÚØéèèðZàªþQ…Zï׃ È ªÊ*mgÑÓ<ú\GWÇ/ÄOG·ßÙ:ø- /1"=@ZZšªS ,X°@]£Ï>ûLÍY3335“€¯¯¯¯¯¯š€ØØX5g9ŽªùëêêÎ;—™™ù¯ýëùóçnnn}ôQppð¸qã8ΩS§H¤R•·RÒÓ/Ž?bÐ KGGÛÄÄ??€¯èèD©Tf¢p”…Ò!55õW®Ü255nm*ü{Œ»»+m †kQyK¥Ò={ö<þ|ìØ±ï¼óíâfiºÉØ’’’K—.UTTDFFÚÚÚÝ·MJJÊãÇçÌ™ãææÆØX GŽIÂ,--U­HgXRR" E"QXX˜ƒƒ~ýúõ{÷îÙÚÚÊåò%K–¨^ZZºeË ¦‰±‚O™2…èÊüñGz*5Écœ6Ÿ½:-çp8èï%ìܹû@#ípíÒ5Ÿ7dôm'Ò£˜Z˜:ŽpÔvZ 0·°ÈºHÛY }›³gÏ~õÕW.\J¥S§NݰaCpp0S((…Vy/Y2‹>EÌÞàé9ÖÓs,³X_ßhd4ÚøâEó´4ÏBÕÐP.WO_ŸËŠquu ‹++«¬­Ía8*Õ# srr>|¨§§gcccggרØ8eÊÚÅKüÛDÈ ‰ø|þÒ¥K·mÛöÅ_DEEÝ»w/%%eÒ¤I2™ŒþCîŸÿüçðá㢢€„yzzªZ‘µ ã?|øpll,^YY\TTôàÁ>Ÿ¯j¸½½}``àˆ#ÜÜÜàäÉ“ß|óÁñãÇ=<<\\\¶oßþòåK2«€f _»víºuëX!³’ÏÊÊb4 ÞÞÞ«W¯Æº7€4Ò>~‹ü–Å.k?éû¬z[eý " utt¾úê«ÀÀ@KKËnZ…)sá÷&Áì{¤ <É6—yPéÖ¥k”-œÃá`õÜ.´Ê»®®nïÞ½Ó¦M³´´d¹¸Õ`nnÎãñšššhÝwiiéðáÃé°¦¦¦§OŸB[+øèÑ£5\ÑÆÆÆÐа¹¹™®««kjjjbb¢£££yÂÄ NëÊ ÈT¯öu9K6èï5` Hÿåí·ß6l˜¶³xÝØ¶m›¶S€˜˜0m§Ð!*ïÇ¿xñâöíÛ‡ ¦]ܠ¿ GÍÍÍ>}:­ûö÷÷ŽŽ¾yóæäÉ“ÇAAAuuu‡š6m S¿¢RèUèã,y¸&кò¿”̘ÏY«Ó²q@ßxo‚Ÿ¥~æ·ÈOÛ™ ¯ÆlÛÙÿ¾qõêÕݽ³]HT^î'¬z{ÕH»‘ÉÉÉÚNyÍ9uêÔ¢E‹d²«Jß;Dº}ý)ÉɇBCC»vZæñÜK—.±ªº3gΘ˜˜ 2äÀ[·n•ÉdÄÅÍ èßÎÍ̀ɓ'3…c}}=Ñ}Ëåòêêjz8=ÖîŠJ¡W¡Ñp8MSSÑ•wÖêÉÉÉÖÖÖr¹¹¹…>>ôôÚ¹z­I˜bLzúE/¯qVVü½{3Vâ}Ñ®ãâÅ‹eeeÚÎiŸ+W®h;…ׇ? h·)n66ÅÅêUÞvÎv³—ÎÞ³~ÏŒŠ–oª¼ûšW®Ýš@FýRüË·%[ÿ¼µ‡ è.üŠaéÜI?~üüùóÑ£Gk;‘× ›åË—/_¾¼¶¶–i½eË–èèè7ß|3888((hìØ±t|Y™¸  xÁ‚™ŒL»  8""ÐÞÞ*))­¡A²råccC©T¶o_†DÒ>è02#W¯X1_OO—C«¹/7j»==½¸¸8mghŠžvèÚ<8¯Jåýó¿¾ë~}m=Ô×ÔߺrËØÔXGG‡uÊÖÑ6%1åöÕÛЪòff@•wãáþiêŸ<¸ï8½såÂ8sèLÀà€É& êìDÎDf›l°¶aή]°ÖËØë_ßþ‹5‰æÓÊåò†Úpê tˆª…è#ŠŸ”‰ÉØ›1uàTÍ?—úy˜í5ó×ø˜ùœÿæ|ìÂXO#Ϭ#Yê³€Ù¶³=¸+|V\L¿¨ñw¯±oß>777ƒV>øàú,Ó‘Š&;;›HMMe°æ§Ï*Þb¶°° :DŸÍËËcÍÏÉkÖ¬¡Ïzzz²æwuu¥XÖ•;wî°æ/*jӫرdúôétÀ‡~HŸmii ËÈÈhll0`ÀíÛ·7oÞ<~üx"  ‹’“3Ïž½œ™™G„ÛööV´p=*ð ìý÷C3:Œ^NWW'**dÑ"¿””lج¬|?¿É̶·÷øsç~¤ÓXYY5#} mÿ«yMh󇈕wÝ‹:FFhÄ3òõ×ãê1ïÒ§#ë gWçbaqUeߊ-ïÊûÃ7Þ¾zûèÕ£áîáq‰;}ïôçýüeãËÃÂ'e#í IDATÃc<ÆÀ5ùµN^ýÛûWÆ¿þñ÷̘?ƒ|¥iÝuÜÀq„ãŽ3;^i!úˆâ'ebæGÍy¿ýçÿêça>Ô‡  Zÿ_ëÏüzæbúÅ=ë÷FªÏö|ùùß~ùmÞ°y· n1ï6 ,BBBè¢U êëë3¢]£? Lš4‰Àbùòå~~Üß ½k ÿøÇ?h§±‡‡}vĈ¬ùMMMéÝÅ‹Ó))>müé§ŸÖÖÖ’]Ö¥ßAƒ±æwpp wçÌ™C¿ö¤øÆÕºu랪¸ ø§üŸ˜¦•£&©ûE®ù´LäÃߨ‘µcåÌ•ÞÝpâ§\n“¤‰.^;öIYhø‚c»ót€ƒ[–Þ/=Ytr‰Û’ö£¤ëøüóÏ7lØ “ɦL™ò÷¿ÿ=((H½­†Vy«nóxFªœÛ„¡C’’bÔgŠlV Qs[YñÑË H'éˆgAÔ³5eëxïñ½ó‘×#xh0 ˆš%°|˜ðû#’“7Z;X¿ãôŽ·©·ªy6½Ù}†ûª9«Vû¯ž4sÒæ¯7·»´&ÓÆxŒùôä§åÊãþ·.iß’¿+v—ÆŸ@Ù'í]5Íê/VàØðî†.™ A4gèС{öìyöìÙåË—cbb^Õõ¨ÊÑmbb¨Oi ˜°„„cä¿ÊÊ*#£6R V…dmmŽ^nA:šû*h"Dº4"=š{˜n2"HÿäwÞisZ&“uàYÉ‹é«*«äryúWé]—‚ ‚ ‚ô:¦NÚ¦€—‰ÈúÙÎIÍÙ¿iÿO?ü$*‰JD/_^,Q‰èû¯¿?¸õ`ÙÃ2 ÆA‡Ã{þc ‚ ‚ Hϰnݺ? è"aQfræå³—ó2ó çdNĺˆq^ã*D¢Š¦—MLƒç Q…Ž®Îü¨ùR/@~VþäÖΚã½Çÿˆ5AWA&“½l½ù™›[ØÒ"mwˆ†ašÀš*=ýbee•\.ÿ ï©"¢šöM„ÀhÛ.S`#004hin4"‚ £«L„’’ýøñÓ9s¦ºº:ïÚuR"y¹rå>ŸWR"ëüÙÁÁF(,‰*ÂÂü é©ÐVˆ ˆ†´ic§ÔDhçdw$îÈëw”ŽgŒƒL÷Y4¾–èêéîÙ°gφ=ÚNé!ª†Ti;¤!åä<|X®§§ìÃè ¸´‰06vc"ܼ9ÊÐÐH=U~þ ™L» Žÿ§‡Ç—ÁÛ·§lÛö‘¨¬¬øW¯Þ–Ëgáüdzbc—ÑSeeåÏ™3•™ÍÛ{üêÕñX@#¢”öM„vÎvkv­ ?€yWz’ï$æxä†H@ã`?@Ú"¹`æ´ÀiÚNé ¾þüëჇk; ¤Ñ…&ÂÒÒ'Ç¿Ál——‹½½'XX˜ÖÕ5‡rêþ¨ÀÐР¹¹…5Ú ÑD*ܶå³@ãàkËX—·ÿëmmgôgžµ´´ÔvHÿ¢«L„þþoEGï¸y³dòäÑóæMߺõ ¹9¹¢ìädw亲[©ôTh+DDæÏŸ&BAD›t•‰ÐÌÌ$9ù“êêZfÈîÝkZZ¤Ì#ÎÎv»v­Ño½•ʰaC$k*´"¢ ---X@#¥Z\}ø³ÃÞAÞã§WY˜[8Ág‚®ž®†Ç;† HŸF‰P1,!á96×ÚÚœ árp¹ÈYÕ·RéB<²õž*VÏ‚¨ h¤³˜ ̦ϛ^[]Ëìʤ²Œ}Õâêù+æó-ùû2š$MsÃçÀ‘¸#ÅÅVÔ‹óÕâjÖñ´¤4IƒdÁÊ ÚŽ H&&&LÛ) ÒÁy~)þE&• 3TGWGUŒŽ®NHTˆèž(;%{ÆüeÊ¢6GÀXϱa1a¬GêÍfôqáya“¤Éq„㩤S¾ }ÛŽ ‚ ÒÃtÊ›ðèî£ÄèDÆ·B#—ËO8ÍlW‹«w|¼ãFþ ¥34Ô6|—ü³†ð^HéýÒß~ùM*Uç/—‹¿\óe‘°¨IÒdçl7{éì=ë÷ܼ|SÃ%ª*«ŒxF<>Ïw¡o†#‚ ‚t+~øagUÞ„'¥Ol9 m‘Ð “ÊNí9u`ËgÏàXü1^ëCiÌíþúšzf7-)íhüцº†&ISò¶äì”ìçOŸÂ{+>Á>3Ì@=VH¸˜~ñiÙSh¬o¬©ª©U´4·Ô×Ôߺr˸õÅy[GÛ”ÄÅ?±èã^^?ÿûçû·î××Ök8AA¤Ç˜1cÆp ‹ r Ê–ëêéúûäœÌùô›O¹ÜÂÜBà[ño_½=iæ$¢òÎ:œµ,vneo5-pšãÇanÀÜÄ‹ _¾{Ýî™ f²–§oÖó-ù“ý&ó-ùÒ~7„Omíf?Þ{|üêø·°›}/f¬çر­Y†:Ä&ÅêÔgª^ÿP=®WŸ õÛ¾8Ï:Î3çm<´±îÅÿoïN£¢ºÒ½?22c‚ qH$Nˆ8!1âÊäÐÚÍJ|o'ͽI®QWbCÆ ÓND”HÄÆã6v0‰X×@©%Æ¢¤ªÞ§ÙnN ” ÿ߇¬Úçì½Ïó,³©Suþ5Â]¦ ‹¦ÑhžÂ×ÅÞÁÍ{²o¾?ápè4ž0Êû·ß~ç·#‹ÚÇ“Fyóž{é9á…è&>?5¿ÝÏ߬_ñå [;[áñHè ž0Ê[´YÜÐ.^¼øDQÞFîã›x«¿Y/¼÷Ì !¼ƒ¨ª¨JÞ˜|l÷1sŸ´‡;·ît…§[B»z’(ïAƒúòÛ‘Å í`Íš5OôJÜˆï œÝ­»Yûøû˜ûD =TÞ«lhh0÷Y@×ò„QÞüvdq@ûÀ[MвèÅÑüW {ëù·†ø1÷Y@—öHQÞºÛ‘Å íÀ`žèÂà4û‡F£i|Ð(„V´"­V›¶+möë³…fþÉüQ“GYë{~öáì¡#ܤn©ÛRcñüŽÇP…¹¦ÑÇO‹•ãîå®ÕjQ<Љ=xð ''ÇÜgÑ¥-Y²¤ÙZQ¦(Ê+"3d–^+ òðò "¯Þ^WÎ]6FV"+Ì-”Ëäó"zù÷bc5jMêöT•R9?²ª¢Š’Ÿ,<Ñ™ˆ*•I’ŠòŠf.œ)õ“ÜrPY§Œ]ëÐÃÅw‘ßôÁކU¹‰ˆ¿¦Â®JEåœ%s<¼=X! à»±9ù©\=]e%2ÒW<&VË~Gñ@§T]]=mÚ4sŸEW×jQÞå7ËËn”Å}gï`_r¹„ÂGy»zº>oÅ<[{[>Ê{Áªˆïîàø 8]n"b×”ˆ¬¬­ø wVH¢n _9D$—ÉI_ñ˜X9„â°4åÍ34D«ÕîÚ•özÓÍO#þ –(55~Ò¤‘æ>‹.êÕWßoµ(oß~¾Ó_ž¾õ¶N™ª;D/>Ê›ßÝá‰*„]îá\¨é¹?,$øÊ2Ü”â1^9„â°(z£¼½½=6mÚ¯T6,[Ë?‹ƒˆ ÅzûùIȼv­4,,(4tD||r¿¦›Ÿ%%²ÜÜB™L>o^DïÞÞ[·º¿jøðA³fMDú7X(ggGsŸEekÛ­Ù— EygÌúvû·Æçª­ª½zþj—VVVƇøøû¤$¤‡F…^9{å׫¿ÖV×RS|·ÐñÝ«þrwM‰ rý‰%êÆˆ¦2R<¦T¡x,JnnabbÚñãgÒÒNyzº ÝÂRxìØaqq1Ÿ}–""Äz/]ãééÊ!¢ýû3W¯^:‚ˆÞ}wþ… ÿù×F&“[[[ÅÅÍ9p « à_¾¾=íííÆFDéé9ááÁB·I“Fž8q®ý~x°X­åíèìñZD7ÛnÂ7Ìø!Ô<Ê{æÂ™õµõBT!åøîŽUˆèró×TänèÒ3¢©DõÆÏÐbå_"DñXCQÞååŠI“Fyx¸ÔÔÔ‹†Šõ&¢AƒúÚ¸ååííéà`ÿàAã3Ïôß¶-uâÄ‘={ºÒ¿àQݼYÞVQÞÆïÚwçž“ïÌÝ›C|·qh^À/‹¹ »ŒT-ž+G"‘ x,‹Þ(ïÙ³§¬[·ËÝÝy÷ ¡Xï  ¡¦î÷ßïþñGMqño»w[´hÒ¿àQݾ](o0T0†¢¼7o^ÙØ¨vp°õ7ë½»åÅ7§5Ý;}ÿýÅÇŽå,_þRÿþ~;w!¤tjÉh"Òj/´ú@Dy@Â2ºmmmlmm„×¹ÛVóæEz5¿måhø®—®ÈÈ´´SUU?øáë¤Cg"¬üx¦,MYhò}Œô7±›î ÛÚÚŒ5dëÖÕÇ?Õâ ›ÐÐÑ­h½ÛVÖÖV11S[k6€ŽÆô•k›žÀ£R«óË™={Å«¯¾ÿ¯lõ³ju͞¡ÑhT *Q¢¼¢¢¼¢v<%±ü“ùêFõ“Ì}8»âviµÚÃ_n¥óêŠôVˆ^uÕuGš8­V«=²ók¹âÂ¥Äu0Ñ¿ÿ]:~ü"[Û±³²²ÎÑîÝÇúö²± îÛ7Џ÷€%’ÑÂköBôZ—°76öÝ=B¿ýöÑ$¦OkeeBD¿þz‹íݶ-µ{÷ñ.¾dcøÒO?]#¢‹ÿýì³/wë6¦wï½?à?øøLï×o–èëü®u»ÊJˈHݨޗ°o÷Ç»«îW9~F˜“.Ž”<¸åàÞø½u5uD”y sÇš—N_v±&?•n7?—´!éέ;¢áÂIî\»óžüe¤dìùëžë…×EG×S×â¯ôbBÜ/YV"ûnÏw¬BTJUâúÄŒ”Œûwïócù¢’•Èd%²†ú†üì|"JŽOfß]q½—×ÀDó瘛[xîÜîÒÒ²7ÞØ@Do¾ùW™L~úô®›7¿#î=c­öÂã½üé§ÿ¯¶¶þ½÷¾â7>Ò´Z­öèÑÿEÞ¸¸9õõç-Z[TôËÉ“_ý²hÑZ"Z¸pMaáõ“'¿þ¿ÿËÐû._/—ß;|øÓÏ\8•—_\|èŸÿ¼øÚk´8jÈ€‡ èÂÜ´Ĵ3ÇÏœJ;%„ÃÅ,qõt%¢^½æÄÍÉ:ED™2‡“òYÊoÅ¿ÉJd?úéêù«ü¼|PeîÏ\¸záˆÐÂ^Öä§Òí&`ùs,ü™uïÂç†g¤d\̹¨Õh¬Z00p èè9é9ÁMÏø$¢‘“FžÃc> _!ü/™…S râ›ÁáÁºç‹J.“ËerUƒJx&ôüwç7=®•¿âF.%®#@§¡Ñh ÜÚª®®Käîe‰šM«Õîäîzrøpöí¦»—_ã®X¬K—~&¢  ùÔôþîsÏ%¢qãþýŽÞ!ü’—½¶¶¶""F£VkˆˆÿžcSR"3~&z§XY½öÚþö·ÿe…Ú^»vƒˆ„gV ¯…ÿN˜ð¬¡P8“gŸmù³ÔÂ!öìùnøðWFŒx•ˆ ýs$òp8.0zqtHdÈäèÉ,îò™ËÔ“pnÞ,šz?kô4åä\ÊɹHDcÆ<Ýâ¡M™V Õ^P*Ï?þ¥§h’!CˆèìÙËìõÀ}ˆèܹBC?`Ÿ>ÞDô¯ýÊ&ž/,¯u­[·ëÊ•’sçv·ø1ú“Eáp¼)³§ìZ·ë«÷¾?c|ï½=¼=‚§Û4}QZ Š3„ŸÊH7½ñuÔ<ñnBÄ„#;ޤnKýùÒψ©k;¬BŒ\âШÐkvìKØ'ÚŽ¬JÐÅ'Z[[ÅÅÅÌž’’ñÍ7'ÂÃÙó¡EM¦¸ø·’Ù©S??•NÍS ù$BâB ML($„‚%KIY7iÒÈY³þbk;vÀ€h"êÛ7jÊ”8ÏÿK蓘øaïÞ^³\\&šgÏž¦N š1ã­ˆˆåaacöìù¨ÅC›2m‹vïþð™gúOºtذ»wHD‰‰<óLÿ°°¥~~zÀÿýß%öúÓÃ3ܲeuÏžn«VmÒ{ˆO?]nkkóê«ï›~V"úäÀ'ásÃE;êªëX8œÈÕu£Ú^çÙœo?ߘ¸˜«ˆ¶¹ÄÊ:¥­­•µø¯/¾¨TJ7(®¸ÞKé&uë4×±£yëù·†øILL4÷‰@'wèС¹sçj4‰äÖ­;yyE±±aååŠøø½Ã† øý÷»vv6¯¼ò¼£c÷mÛRW¯^¿—o²y¾ýö‡ï¿Ïóõíieeµxñ løûï/^½z3{ôÉ“ùD4vì3_|ñ÷÷ß_LDÂ^~ûý×Ëo¾ùéĉ#-šEDŸþÍ /LnL Þ|óÓ¯¾z·I­ÉÎn\bâî×^{ÍÜ'­ ¢¢ÂÃÃ#+k+{À9´³Y³þbð1v¢œ9ž­è-gÒ—-×âêÙô© %ÛñÛ% ;"bêÚè—Ìc!«ZÄ’kkë+*ªd2¹F£‰™ºfÍO!H%**”o2ô¾råú´iÁgÎ\æ‡?ÆiI($„@s­öèVÌ–CL]§K -bI„ôÞ²eU÷¦ûŠ_~¹ÂÎÎVøÞÒ!|“ 8ˆÆ$"~8ŸJÈ' /„½¦$zy¹kµZ„A*ÐQ𙂢7›YÓH*á#EŠI(”H$X= h°$­˜JÈCB!XŠúúz"zóÍOÍ}.]Ôõë2, ,Fcc#iµ­Vcîs麚- 5MãƒFÑ“7„ïac‡=Ò¼Z­6mWÚì×gëîºùóÍÔí©Ï¿üüР¡¢]Ù‡³G„Žp“º¥nK]ûHG„v ·Bˆ(ÿdþ¨É£¬»YëÕb·ÇŽj°tk×î2ô(h]jµÚܧ­ÆÉɉˆ¶lY§p˜‹ø)Š2EQ^QXl˜F­IÝžªRª"çGÖ×ÔæžÏ:1/¢—/u£zÿ¦ý ʆØe±…ç C"Cˆ('=gẩüTÉñɾý|‰HV"+Ì-”ËäÂð;·îì\»ÓÅÃÅÆÎ†ŸÊÙÍ™ÏÜ‚š'DLhÇß´Lo…QÒ†¤¢¼¢™ gJý¤Â®JEåœ%s<¼=2d–^+ Àwcs ÙÝüöƒ[*ë”±Ëbí»Û: ªÀ¢9;;ì¿ÿ÷æ>‘GV_ßн»]Ëý:˜û8;·üh,0ÑÃtana^f^yi¹u7ëËn”Å}'<¬W@¯±ÏMÿ[ú‚U „üí¾ƒú¦|–ÒÃ¥GŸ}î–ݽzþªh=ÿÝù›Wo‹ c9ÏÂp©ŸtẩþƒýüǾ°©ÞXÿFNzKT9idüòx,‰:#"„o O¦"Öe×e)óVÌËÜŸùñß?vñÝ–Ý-lçã»§½8ÍÐQP-múôéB¯eÑjµ#G޼pá‚(ບ‡ èÀqÞ½½‹òŠ&GO&"!uyjÌTÒ‰ò5i”¿=xäà”ÏRzúöEy‹ðÃyüT„ æÏP… ÎwS”+öÆï0l€J©"“Ú>¾›¥ëÕí¯  àòåËgÏž8qb˽Ú†ðè¼ PÜo±3´…ß¿Ûì#¦Gy;»;Ÿ1ÞÓÇóú•ëÁÓ‚/Ÿ¹ü‡ç§¢¦ fáƒjî˜ Uˆ¾=6|ìР¡,b]wQËw3´=4*4áíZãàä`ä(¨hiii±€3ª®®&¢?ÞmîéÒÚ*ÊÛD¢©Ôl:³Gy‹*„[ç#ÖEŒ¤²³í||·‘£ ZÚ¢¼Œxúé§oܸáããó믿šû\ ëº{÷®T*MJZ3~ü³æ>—.jéÒÛ0ÊÛ”3M… f "ª~Yl(zí2žÖÎÇw9 ªÚSIIIqqñ'Ÿ|òÞ{ïšûŒ ‹>Áèë+8°·¹Ï¥‹rt´ïˆQÞÐé¡ZÀ⤥¥yxx,^¼xÓ¦MiiiX@tezn²€ÈÑ£GCCC¥Ré„ Ž=jîÓøFÓРһ«ºº.1ñ¨¡¦àäÉüÆÆÇL¸V«Ý¹óÈ£NuøpöíÛZ­öë¯?ö¡Í h€Èåò¼¼¼ððp"š:uê¥K—nÞ¼iî“ "*+S¤§Ÿ&"µZ³u롵kwÊå÷”JÕúõ‰))wïÞ'"Q“Q(*7lHÚ°!éÖ­;ê„„}¼ûþý*Ñ!„™ö)•%%²’Y}}Cvv>ÅÇ'»¹9‹¦"¢-[ÆÇï­©© '¢7ÊîÜ©ðòr—H$C‡öËÈ8Û¿¦Ö†4@ Ž;foo?aÂ"=z´““Þ„†Ž 7·011íøñ3ii§¬­­ââbæÎ OIÉøæ›ááÁÓ§º‰šŒ§§kHÈð+æùùIÈ;vX\\ÌgŸ¥ˆºÝ¼Y~ãFÙÒ¥1žž®2™\&“74¨ ЉèÝwç_¸P,šêûïs•JÕàÁþ[¶ '¢ôôœðð`aæI“Fž8q®-Cm¥ÙZ£Ñ¨tîå iÞ-ÿd¾ÚÀ[úFvñ²gWÜ® "­V{ØbßíïôVˆ^uÕuGuî™x¹EÝ„«Kf”––nooOD¶¶¶3fÌÀ:‚qã/ŽŽŒ ‰Žž\^®X¹ò‹ÜÜB¥Ruï^¥ŸŸÔÝý?ßÈ5õ*/WôéãíááRSS/ÚÕ¯ŸïË/OÿŸÿÙzæÌe‰¤å³º}»ÂÙÙÑÍÍùŧ‰†‘ºy’ƒÆ2“š- eŠÓ駉H£ÖÚzh_¾JEe}Mýù¬ó»Öí*+-#"u£z_¾Ý﮺_uæøa`Nz??\jNÚtçÖ¶kçÚ÷ä÷ø]²™¬DÖPߟÏ'">´Y"‘¹ÍíòË1V!DtpËÁ½ñ{ëjêd%²ïö|Ç*D¥T%®OÌHɸßü>‘¨ØpÑåucW—Ì¥ººú‡~ˆŽŽf[¢££srr***ÌxVooá­åÚÚúŠŠ*™LþàAcTTèš5;ö }DMž¿¿OBBJAAñìÙSÖ­ÛõÞ{_Íh úeªªjÏŸ¿êâÒÃÊÊ* À÷àÁ¬íÛ¿52UTTèÙ³W®^ýµººV4œˆ¦O›“sQRPP<Ù2“Ú$Ê»üf¹‰9ÏlWþÉ|"r“º Gï' IDATûøòÃùÐfBn³ùðb×ÝŽn5„Ok?ñ͉àð`·žnY³øá|d·‘¼nQ²7"»Àì233£¢¢ºwïž‘‘ѯ_?++«'N¼òÊ+æ>;èêºu³vrr ¢zoÙ²ª{S×_®°³³µ¶¶"¢!Cø&oᙵµõŽŽÝ‰hóæ•j ggÇ×^‹°µífggKD›6­´³³‘4½½aÃ[ºSíÞýáÔ :´_nnÑíÛR©Û©SVZæ³hÛ$ÊÛH³(çù! ‘VÿpQh3!·ÙLø 9¾÷8 Üþý·ßù ©¼W)õ“y4™œ×Mˆì€ &&æÔ©SžžžD4cÆ aã?þ8nœø¥æåÈýÏW´fÍ\üy‘^^îl”­­­­Þ>N\,ƒ½½ž”=Ñ XYY¹¹=üĈSóT‡ÅMIºz&~M­åmzÎ3Ûåà›´!éÚO×t‡ó¡Í„Üf³bÂn‹ú„F…îX³ÃÓÇS7«’]n#yÝ„ÈnèxBBBD[Æßæ°+Lˆb0¥O×VQÞ¦ç<³]*¥Ê¦éŽ€h¸Úìîå®Õj‘Û,0{”7¸-¢¬SÚÚÙZéÜ'"îrÉë&Dv›¢¼:¸ŠŠ ¬¬­Ó¦1÷¹tQ³fý¥¢¼ä<³¦-wG@ttÚ,‘H°„ê øÀmöÇ•‘Èn#yÝ„ÈnèÀå mUIUUÕÑ£G£¢¢ÜÜÜÌ}.`NR0Iyyùüùóe2™¹Oà!#QÞJ”Å-n‘Egn·, ,•Þ(oQz¶¨Éçl8¹fÍŽÓ§/‰²¸Yà6Ytæviµpt/½ôRLLÌúõëÙF3zôh¾Ï† ž{î9ÖüñÇßyç¾Cnn®ÝÃ'À~ôÑG|´appð×_Í÷ »ÿa:ÕÊ•+_~ùeÖ,**Z° ÙW½ÓÓÓ}}}Y󫯾ڽ{7köïßÿСC|ÿ¹sçþòË/¬¹hÑ¢7ß|“5ËÊÊ¢¢¢øþIII¬¹ÿþO?ý”5]]]øá¾ÿ²eËΟ?Ïš³fÍZ³f k644ˆž øÙgŸM™2…5³²²V­ZÅw(((àrúÁ?~œ5'L˜°yóf¾ÿĉkjjXó½÷Þ{ñÅYóâÅ‹þóŸùþ'NœJ¥¬ùÅ_ìÝ»—5üÍ7ßðýçÌ™SZZÊšK–,Yºt)kÊd2>ˆ‡ˆRRR†ÊšÉÉÉŸþ9kzzzfffòý_ýõŸ~úIxÝØØÈ¶çæffæ•––wëf=9..æúuYJJÆœ9SoÜ(ûè£8áéuB˜¶Ðäs¶W­Z°æßÿþ±ðd:!‹[xžžÃ'ªLš4rùòøD14i¶€Öh4uŸ¼‘2ÔäQÖݬÉ(Q·ìÃÙ#BG¸IÝR·¥Æ.‹mÅ“s1T!DTW]—u0‹}áOÔl-(*0#ww÷Õ«W¿v$"‰D2}út~‹··7ßôòòu=%ö™gžQ*•¬9`ÀÑ¡§L™R[[Ëš}ûöå÷º¸¸ˆæwphöåì§žzŠï :="š0aBÿþýYsàÀüÞîÝ»‹æwuuå›}úôá;8::Šæ ⇠6Œßkmm-šŸ_¼ ',ê iž(=lØ0~Y9hÐ Ñ L›6­¾þaBuŸ>}ø½îîî¢ùù?o„ ù½zõÍÂTtD󻸸ðM¾ƒ³³ø;úcÆŒžDNDõõõEEEÂëqã{÷öÎË+¢¼ãã÷6@©T±ô옘©!!Ãù¦(g{Р¾zŸë¬ÖIá°ÐÌí6Òì1vwnÝ)Ê+ ‹ Ó¨5©ÛSUJUäüH"úï—þ{ÔäQ3ΔúI…]•ŠÊ9Kæxx{dÈ,½V0$€ïVv£ìì?ξøÆ‹DtñŸëkë ׺Ìò;Q…eàäꔼ1ÙÅå暅«ª”*¾ÉOupËAe2vY¬CV9#BGð¯Õêý›ö7(b—Å:»9ó»PTí±èàD±klT××7899üòËÿ­_ŸÐK£Ñ¾óÎkûöýãöíŠçž;~|`UU-kìÿöÛ cÇ7nسÏ>µzõf%˜””^Vv7<|lPÐÐââßòóÿµpáLaWAAñ͛山afû±;’f±3åm$‹;sæÇÿXØ…æÎ¯ÉÑ“Y¸¸»ðÙ݆¢¼ùøî«ð•Óì5—ÿÆú7ø](*CQÞ|z¶(L›ÏÙf«gjžÅÍ·½¼ÜµZ­åfn·‘–£¼gq÷Ô×Vß;ÿH`î|ø áË@”Ým(Ê›ï¦æ•ÿæ³âE»PTFðQÞ¢ôl¾)ÊÙ64Ãb.…«g“¢¼dqóÀÜé± áË`jÌT>»ÛP”·‘ôoŸ/Ú…¢€ŽÀÔ(o#YÜ<$0·³Gyóe Êî6åm$ý›g$+EÕÖðh€QÞf÷QÞF²¸ uCsçÆ_kÑb×H”w‹«g2/@Q€Ùá9ÐІå ’,ÕFy‹â»•V«Ý¹óˆ)S Áà& hKÅ¢¼‰(%%ã¯ÝSXx¸Œna‹ïæ¿EñÝ|Ä7O/)‘•”Èêë²³ó‰(>>Yx ‡ñ©X0x§Io¶€Öh4*}ÄäŸÌW›ð׉¡n7<ûpvÅí ­V{¸Sü¥Ò9ª"ª«®;šxÔPSpóç› o'‹¶kµÚ#M¿V**?çó‹9éÄ„j¦BÁ@‘›[˜˜˜vüø™´´S995íªU Ñþý™«W/ AD||·µµU\\Ìܹá))žž®B|·ŸŸ”ï#:оtiŒ§§«L&—Éä ª‚‚b"z÷Ýù.‘ñ©ÒÓsÂÃ…ד&£›ï./W¬\ùEnn¡RÙì1QÄ7%Ÿ9s¹y†º~ºS‰‚Á;A*øÃtanaZbÚ™ãgN¥*¿Y^v£,fiŒ«§««§«1(õ“RSaøÜðŒ” "ÊÜŸ¹põ¡#DÝÑv>ŽÎÈQrÒs‚›þR9iä9ËÿK¥à+„/!zPx>45%²&#õ“Nœ9ñ…E/ (ª¢ùïÎ/¾ ~[šˆä2¹\&W5¨„7­Y±ñUDÍ«…P0Еx{{LŸ>Žˆ""&ìØqdÛ¶ÔK—~õ‰Š ={öÊÕ«¿VW×ÖÖÖWTTÉdò‰Èßß'!!¥  ˜ï#^UU{þüU—VVV¾fmßþ­î™™júô±9M÷– Š'[~’C[%ÂÇÑùöó5tdÎu@O˜DÈU‘A"îʳb…Šª…P0Ðe°(oWW§ÄÄ*+«u3ºÝÝùøn>ñ›ïæûðDIà›6­´³³‘4½Ídd* .•ºuŽTð¶J"4´£3rdÎuLO’DÈ3RE‚ìÃÙƒGö ðMÚtí§k¢½¢PC¾Z]•D"1”ÑÍÇw;6“‹5YŸ\ŒÃ¼y‘^^î|¸½áwNu§bX0x'X=S›&ÚÎÇÑ9 2猳Ä$BCÃP)U6ÜŸ¹Œ(ÔP¨w/w­V‹‚yH"èàDhvm•D¨›?DZ²²bë#GAæ\÷xI„z‡aèB|W-‰mªM’‘?Tt>R°TO˜Dh1HFS;YÄ ‰°€°T|!Kå–”Èöìùnݺ]¥¥eüXS"ÉhÊ`ç‹4ЉO"$.}P”(“É­­­ââæ8Å7%bŒ¦ v¾ˆA™åM¦5?Dv[T@ÇÁ'—>¨›èííéà`/„§01H:)ƒ/bÐD;D¨(Så…ņiÔšÔí©•ŠÊ9Kæ8¹:%oLvñp©ù£†ˆTJßdd%² ?^PÈÑ‹£=}<Ùp·žn©ÛSUJUäüHWOWafÖäC˜…æ Úóç‡G‚ èPX!/ ÀwƤŸt‚DDƒF†)ƒáác£¢Bß~;A­ÖO†"ûõó¥Î1h¢‡ èÂܼ̼òÒrënÖ“£'ÇÄÅÈ®Ë2R2\Ü]‚ÃÝzºeÌ¢¦ fÖdä2¹“›Óô—§'®O\þér6|ꜩe7Êâ>Šm&Äw³fNzÎøã…FN¿<Ë£ ÐѰ$BâBûõóåóÙ£ß1?ÖĈA2œ2Øù"M¤?Êûñ‚š]Ü]¨ðÃEyÝ¢&"»-*ÀRÊ ÔMlqˆÀPÊ`'‹4‘þ(ïÇ jþnïwçOž=e4?\”×-j"²Û² B,Ú D4´†f hënÖB4`ï½WmYÅ’–W|¹‚%3 à›¼¨ùQÏ?#ÌÀx-‚åu;:;òÍ~CûåUÜ®p“º]8ur*À`á£5M r÷rgÑÜüpQ^·¨‰Èn … €®é‰¢¼Ô Æ¡B óA €¥2å]]]—Èe2ˆšÆ!ÊÛ¸'z̨¬L‘—W¦Vk¶oOU(*—,™ãêê´qc²‡‡ËÔ‘R©â›Œ0D©TÍŸYQQED½{{;w%,lL||²ðtgjŠòÎË+Z¸p¦ŸŸtË–ƒuuÊeËb{ôp`QÞD$DyGt§Íâh‹ÄGy[[[ÅÅÅÌž’’ñÍ7'ÂÃYÀŠ¨É Êû±™å-¢7¨9ÿd¾ÚÀÛûB3!¹ zÔj1ÄÐÓ§B*8t&|”wy¹båÊ/rs •JÕ½{•~~Rw÷ÿ<­YÔdåýØôGyËJdDäÕÛëʹ+Þ½½Y³ÔOÊ5óyÎÖݬ“6$åÍ\8Sê'=¸å ²N»,Ö¡‡ŸÆ,‘HÈÜÉðÕ2&l Ùíêéú¨ÕÂÏÌÇzÂ'‹¦âOfôäÑH€ÎEy×ÖÖWTTÉdrF3uÍš>>žöDÊ7Dy?6ýQÞÂ:ÆMêV\PLZâ˜ù f+k+Èo?ߘ¸ч+DXµ‘¨`£ZxuÕu,Ö›bh*ÑɈ† uè&uCòÖóo ñ’˜˜hîý***<<<226M:ÚÜçÒEÅļkð9жMoãûñ§æéÊ|n3ÈÌ7­¬¬øõKc–H$X¸t|Fwä¼Hwî¨`µZŒÌÌ14q¥KH€N*"¢ÍßA#ZR‘úJÛá<À²Éè~‚Aú7€=zôHKK3÷YtuH"°¶¶¶/¼ð‚¹Ï¢«C!À#05‰P&÷ØÙrEyEEyE¬©Õjì<¢Ûí1bê9smÏĬÊÖ½¬º*•Ÿ¿óùÅœ‹†¦E%@ÛÑŸDȇÆ9¹:±09"â“ù±•ŠJçáí±ÓþeCì²XÑ£êkê s Ïg˜ÑË¿Wr|²ðX1C™sºSeÈ,½VDDCÏg‰ AÎ\;à³*ù|JvQF„Ž "vYe%²ÂÜB¹L1/¡‡ÈO+΂ í»Û³ª¨ª¨".ïpÊì)Õ•ÕÔ¼ð„iQ Ц¾]˜[˜–˜væø™Si§„иð¹á)Bô ð|h"5WOW!NXN ;,&.&å³ÝCö è5'nNÖ,"šÿîüâ ÅÔ”9³4ÆÕÓÕøT™û3®^8"tDÏ^=³f9~ÆÑÙ‘ˆrÒs‚Ã…>#'¥‰øÈ@C}ø`B¾*tó³g9¸g¯ž¢iQ Ц &òIo|˜œnS4Jˆ´x z nTë.²0”9ghªºšºo·ûü+Ï{úx [ºTΜy“uó)MÄGÂòUÁG Ÿ¶KUBëB!@‹ >š_Žˆ¯¬©ÇFÙØÚØØÚèíc舢¥˜îT"¥ÿ.2œ­ž 9síH7ŸÒDÂe5^|0!CŸ!`BT´' R1%4®í‚冎6ø1hkˆ€.ëÿýª‹d½Q[°IEND®B`‚Test-Unit-0.25/TestLister.pl0000755000175000017500000000076207403173761016101 0ustar mca1001mca100100000000000000#!/usr/bin/perl -w use strict; use Getopt::Long; use Test::Unit::Loader; my %opts = (); GetOptions(\%opts, 'help', 'testcases'); usage() if $opts{help}; foreach my $test (@ARGV) { my $suite = Test::Unit::Loader::load($test); print join '', @{ $suite->list($opts{testcases}) }; } sub usage { die < [ ... ] Options: --testcases, -t List testcases contained in (sub)suites --help, -h Tests can be package names or file names. EOF } Test-Unit-0.25/Changes0000644000175000017500000000403507502137435014725 0ustar mca1001mca100100000000000000****************************************************************************** * Due to lack of time, this file has been deprecated in favour of the * automatically generated ChangeLog file. Sorry. ****************************************************************************** Revision history for Perl extension Test::Unit. 0.14 - lots of changes and additions: Piers Cawley fixed a bad bug that caused inherited tests to be called on the parent class instead of the inheriting class. Piers Cawley also put in a lot of new functionality for regular expression assertions and coderef assertions. Matthew Astley fixed the POD documentation. Matthew Astley and Adam Spiers fixed a number of smaller things. Greatly improved formatting of failure reports. Version number is now (hopefully) handled correctly for CPAN. Kevin Connor ported Setup and TestDecorator to Perl. 0.13 - patched the patch from 0.12, added patches by David Esposito, (documentation for optional message arg to assert(), make TkTestRunner use to_string() for exception display), added documentation on problems in using assert() with regexes and messages, fixed these problems for the procedural style interface (where they can be solved) 0.12 - added patch by Matthew Astley (method to quell backtrace on failed tests, see Test::Unit::TestCase). 0.11 - fixed bugs in self tests that caused failed tests under HPUX and Solaris 0.1 - much revised and extended due to PerlUnit effort (see http://sourceforge.net/project?group_id=2653) - INCOMPATIBLE CHANGES: old interface style is discontinued (if you want support for this, use the old 0.06 version) - resembles JUnit approach much more closely - adapters to Test::Harness style tests - GUI test runner using Tk - stack traces for errors and failures - object-oriented implementation approach supporting test inheritance and test specialization 0.06 - first CPAN release 0.05 - initial release version 0.01 - 0.04 - development versions Test-Unit-0.25/lib/0000755000175000017500000000000010324277074014176 5ustar mca1001mca100100000000000000Test-Unit-0.25/lib/Test/0000755000175000017500000000000010324277074015115 5ustar mca1001mca100100000000000000Test-Unit-0.25/lib/Test/Unit/0000755000175000017500000000000010324277074016034 5ustar mca1001mca100100000000000000Test-Unit-0.25/lib/Test/Unit/Tutorial.pm0000644000175000017500000000230307374760233020200 0ustar mca1001mca100100000000000000package Test::Unit::Tutorial; # this is only a container for the Test::Unit tutorial # to allow viewing tutorial-style documentation on # unit testing by way of the perldoc utility. 1; __END__ =head1 NAME Test::Unit::Tutorial - Tutorial on unit testing =head1 SYNOPSIS perldoc Test::Unit::Tutorial =head1 DESCRIPTION Here should be extensive documentation on what unit testing is, why it is useful, and how to do it with the Test::Unit collection of modules. Sorry for not implementing this yet. Please have a look at the examples in the examples directory and read the F file that came with this distribution. A short tutorial on how to use the unit testing framework is included in L. Further examples can be found by looking at the self test collection, starting in t::tlib::AllTests. =head1 AUTHOR Christian Lemburg Elemburg@acm.orgE =head1 SEE ALSO =over 4 =item * The module documentation for all modules in the Test::Unit tree. =item * I Martin Fowler. Addison-Wesley, 1999. =item * The JUnit (unit testing framework for Java) documentation. =item * http://www.xProgramming.com/ =back =cut Test-Unit-0.25/lib/Test/Unit/Setup.pm0000644000175000017500000000246307402737001017471 0ustar mca1001mca100100000000000000package Test::Unit::Setup; use strict; use base qw(Test::Unit::Decorator); sub run { my $self = shift(); my($result) = @_; my $protectable = sub { $self->set_up(); $self->basic_run($result); $self->tear_down(); }; $result->run_protected($self, $protectable); } # Sets up the fixture. Override to set up additional fixture # state. sub set_up { print "Suite setup\n"; } # Tears down the fixture. Override to tear down the additional # fixture state. sub tear_down { print "Suite teardown\n"; } 1; __END__ =head1 NAME Test::Unit::Setup - unit testing framework helper class =head1 SYNOPSIS # A Decorator to set up and tear down additional fixture state. # Subclass Setup and insert it into your tests when you want # to set up additional state once before the tests are run. =head1 DESCRIPTION A Decorator to set up and tear down additional fixture state. Subclass Setup and insert it into your tests when you want to set up additional state once before the tests are run. =head1 AUTHOR Copyright (c) 2001 Kevin Connor All rights reserved. This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. =head1 SEE ALSO L, L =cut Test-Unit-0.25/lib/Test/Unit/Assertion.pm0000644000175000017500000000375607410440351020344 0ustar mca1001mca100100000000000000package Test::Unit::Assertion; use strict; use Carp; use Test::Unit::Failure; use overload '""' => 'to_string'; sub fail { my $self = shift; my($asserter, $file, $line) = caller(2); # We're always called from # within an Assertion... Test::Unit::Failure->throw(-object => $self, -file => $file, -line => $line, -text => join '', @_); } sub do_assertion { Carp::croak("$_[0] forgot to override do_assertion"); } sub new { Carp::croak("$_[0] forgot to override new"); } 1; __END__ =head1 NAME Test::Unit::Assertion - The abstract base class for assertions =head1 NAME Any assertion class that expects to plug into Test::Unit::Assert needs to implement this interface. =head2 Required methods =over 4 =item new Creates a new assertion object. Takes whatever arguments you desire. Isn't strictly necessary for the framework to work with this class but is generally considered a good idea. =item do_assertion This is the important one. If Test::Unit::Assert::assert is called with an object as its first argument then it does: $_[0]->do_assertion(@_[1 .. $#_]) || $self->fail("Assertion failed"); This means that C should return true if the assertion succeeds and false if it doesn't. Or, you can fail by throwing a Test::Unit::Failure object, which will get caught further up the stack and used to produce a sensible error report. Generally it's good practice for do_assertion to die with a meaningful error on assertion failure rather than just returning false. =back =head1 AUTHOR Copyright (c) 2001 Piers Cawley Epdcawley@iterative-software.comE. All rights reserved. This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. =head1 SEE ALSO =over 4 =item * L =item * L =item * L =back Test-Unit-0.25/lib/Test/Unit/Debug.pm0000644000175000017500000000344010273475547017431 0ustar mca1001mca100100000000000000package Test::Unit::Debug; =head1 NAME Test::Unit::Debug - framework debugging control =head1 SYNOPSIS package MyRunner; use Test::Unit::Debug qw(debug_to_file debug_pkg); debug_to_file('foo.log'); debug_pkg('Test::Unit::TestCase'); =cut use strict; use base 'Exporter'; use vars qw(@EXPORT_OK); @EXPORT_OK = qw(debug debug_to_file debug_pkg no_debug_pkg debug_pkgs no_debug_pkgs debugged); my %DEBUG = (); my $out = \*STDERR; =head1 ROUTINES =head2 debug_to_file($file) Switch debugging to C<$file>. =cut sub debug_to_file { my ($file) = @_; open(DEBUG, ">$file") or die "Couldn't open $file for writing"; $out = \*DEBUG; } =head2 debug_to_stderr() Switch debugging to STDERR (this is the default). =cut sub debug_to_stderr { $out = \*STDERR; } sub debug { my ($package, $filename, $line) = caller(); print $out @_ if $DEBUG{$package}; } =head2 debug_pkg($pkg) Enable debugging in package C<$pkg>. =cut sub debug_pkg { $DEBUG{$_[0]} = 1; } =head2 debug_pkgs(@pkgs) Enable debugging in the packages C<@pkgs>. =cut sub debug_pkgs { $DEBUG{$_} = 1 foreach @_; } =head2 debug_pkg($pkg) Enable debugging in package C<$pkg>. =cut sub no_debug_pkg { $DEBUG{$_[0]} = 0; } =head2 debug_pkgs(@pkgs) Disable debugging in the packages C<@pkgs>. =cut sub no_debug_pkgs { $DEBUG{$_} = 0 foreach @_; } sub debugged { my ($package, $filename, $line) = caller(); return $DEBUG{$_[0] || $package}; } =head1 AUTHOR Copyright (c) 2000-2002, 2005 the PerlUnit Development Team (see L or the F file included in this distribution). All rights reserved. This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. =head1 SEE ALSO L =cut 1; Test-Unit-0.25/lib/Test/Unit/UnitHarness.pm0000644000175000017500000001240510273475544020644 0ustar mca1001mca100100000000000000# This is a makeover of Test::Harness to allow its tests # to be retrofitted as unit tests. package Test::Unit::UnitHarness; BEGIN {require 5.002;} use base qw(Test::Unit::Runner Test::Unit::Test Exporter); use Config; use Carp; use Class::Inner; use FileHandle; use Test::Unit::Debug qw(debug); use Test::Unit::TestCase; use Test::Unit::Exception; use strict; use vars qw($VERSION $verbose $switches $have_devel_corestack $curtest @EXPORT @EXPORT_OK); $have_devel_corestack = 0; $VERSION = "1.1502"; @EXPORT = qw(&runtests); @EXPORT_OK = qw($verbose $switches); $verbose = 0; $switches = "-w"; # class and object methods sub new { my $class = shift; my ($name) = @_; my @_Tests = (); my $self = { _Tests => \@_Tests, _Name => $name, _Names => [], }; bless $self, $class; debug(ref($self) . "::new($name) called\n"); return $self; } sub run { my $self = shift; my $result = shift; my $test = $self->{_Name}; my $fh = new FileHandle; my $next = 1; my $max = 0; my $message = ""; # pass -I flags to children my $old5lib = $ENV{PERL5LIB}; local($ENV{'PERL5LIB'}) = join($Config{path_sep}, @INC); if ($^O eq 'VMS') { $switches =~ s/-(\S*[A-Z]\S*)/"-$1"/g } $fh->open($test) or print "can't open $test. $!\n"; my $first = <$fh>; my $s = $switches; $s .= q[ "-T"] if $first =~ /^#!.*\bperl.*-\w*T/; $fh->close or print "can't close $test. $!\n"; my $cmd = "$^X $s $test|"; $cmd = "MCR $cmd" if $^O eq 'VMS'; $fh->open($cmd) or print "can't run $test. $!\n"; for my $line (<$fh>) { print $line if $verbose; if ($line =~ /^1\.\.([0-9]+)/) { # Not supported in Result - It's needed!!! #$result->plan($1); $next = 1; $max = $1; $message = ""; } elsif ($max && $line =~ /^(not\s+)?ok\b/) { my $this = $next; if ($line =~ /^not ok\s*(\d*)/) { $this = $1 if $1 > 0; my $testcase = new Test::Unit::TestCase("$test case $this"); $result->start_test($testcase); $result->add_failure( Test::Unit::UnitHarness::TestCase->new("$test case $this"), Test::Unit::UnitHarness::Exception->new($message) ); $result->end_test($testcase); $message = ""; } elsif ($line =~ /^ok\s*(\d*)/) { $this = $1 if $1; my $testcase = Test::Unit::UnitHarness::TestCase->new("$test case $this"); $result->start_test($testcase); $result->add_pass($testcase); $result->end_test($testcase); $message = ""; } $next++; } else { # this is the message, not the medium... # this wasnt part of the Test::Harness protocol, so it # must be output from the program. Collect this, it might # prove useful! $message .= $line; } } $fh->close; # must close to reap child resource values if ($^O eq 'VMS') { if (defined $old5lib) { $ENV{PERL5LIB} = $old5lib; } else { delete $ENV{PERL5LIB}; } } } sub name { my $self = shift; return $self->{_Name}; } sub names { my $self = shift; return $self->{_Names}; } sub add_test { croak "This is suite is not mutable."; } sub add_test_method { croak "This suite is not mutable."; } sub count_test_cases { return 0; } sub to_string { my $self = shift; return $self->{_Name}; } sub warning { my $self = shift; my ($message) = @_; return Class::Inner->new( parent => 'Test::Unit::TestCase', methods => { run_test => sub { (shift)->fail($message) } }, args => ['warning'], ); } package Test::Unit::UnitHarness::TestCase; use base qw(Test::Unit::TestCase); sub run_test { my $self = shift; my $class = ref($self); my $method = $self->name(); $self->fail("This test is not restartable"); } package Test::Unit::UnitHarness::Exception; use base qw(Test::Unit::Exception); use strict; sub new { my $class = shift; my ($message) = @_; my $stacktrace = ''; $message = '' unless defined($message); $stacktrace = $class . ": Output from external test\n" . $message . "\n"; bless { stacktrace => $stacktrace }, $class; } sub stacktrace { my $self = shift; return $self->{stacktrace}; } 1; __END__ =head1 NAME Test::Unit::UnitHarness - unit testing framework helper class =head1 SYNOPSIS This class is not intended to be used directly =head1 DESCRIPTION This is a makeover of Test::Harness to allow its tests to be retrofitted as unit tests. =head1 AUTHOR Copyright (c) 2000-2002, 2005 the PerlUnit Development Team (see L or the F file included in this distribution). All rights reserved. This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. =head1 SEE ALSO =over 4 =item * L =item * L =item * L =back =cut Test-Unit-0.25/lib/Test/Unit/TestRunner.pm0000644000175000017500000001321310273503113020470 0ustar mca1001mca100100000000000000package Test::Unit::TestRunner; use strict; use base qw(Test::Unit::Runner); use Test::Unit; # for copyright & version number use Test::Unit::TestSuite; use Test::Unit::Loader; use Test::Unit::Result; use Benchmark; sub new { my $class = shift; my ($filehandle) = @_; $filehandle = \*STDOUT unless $filehandle; select((select($filehandle), $| = 1)[0]); bless { _Print_stream => $filehandle }, $class; } sub print_stream { my $self = shift; return $self->{_Print_stream}; } sub _print { my $self = shift; my (@args) = @_; $self->print_stream->print(@args); } sub add_error { my $self = shift; my ($test, $exception) = @_; $self->_print("E"); } sub add_failure { my $self = shift; my ($test, $exception) = @_; $self->_print("F"); } sub add_pass { # in this runner passes are ignored. } sub do_run { my $self = shift; my ($suite, $wait) = @_; my $result = $self->create_test_result(); $result->add_listener($self); my $start_time = new Benchmark(); $suite->run($result, $self); my $end_time = new Benchmark(); $self->print_result($result, $start_time, $end_time); if ($wait) { print " to continue"; # go to STDIN any case ; } $self->_print("\nTest was not successful.\n") unless $result->was_successful; return $result->was_successful; } sub end_test { } sub main { my $self = shift; my $a_test_runner = Test::Unit::TestRunner->new(); $a_test_runner->start(@_); } sub print_result { my $self = shift; my ($result, $start_time, $end_time) = @_; my $run_time = timediff($end_time, $start_time); $self->_print("\n", "Time: ", timestr($run_time), "\n"); $self->print_header($result); $self->print_errors($result); $self->print_failures($result); } sub print_errors { my $self = shift; my ($result) = @_; return unless my $error_count = $result->error_count(); my $msg = "\nThere " . ($error_count == 1 ? "was 1 error" : "were $error_count errors") . ":\n"; $self->_print($msg); my $i = 0; for my $e (@{$result->errors()}) { chomp(my $e_to_str = $e); $i++; $self->_print("$i) $e_to_str\n"); $self->_print("\nAnnotations:\n", $e->object->annotations()) if $e->object->annotations(); } } sub print_failures { my $self = shift; my ($result) = @_; return unless my $failure_count = $result->failure_count; my $msg = "\nThere " . ($failure_count == 1 ? "was 1 failure" : "were $failure_count failures") . ":\n"; $self->_print($msg); my $i = 0; for my $f (@{$result->failures()}) { chomp(my $f_to_str = $f); $self->_print("\n") if $i++; $self->_print("$i) $f_to_str\n"); $self->_print("\nAnnotations:\n", $f->object->annotations()) if $f->object->annotations(); } } sub print_header { my $self = shift; my ($result) = @_; if ($result->was_successful()) { $self->_print("\n", "OK", " (", $result->run_count(), " tests)\n"); } else { $self->_print("\n", "!!!FAILURES!!!", "\n", "Test Results:\n", "Run: ", $result->run_count(), ", Failures: ", $result->failure_count(), ", Errors: ", $result->error_count(), "\n"); } } sub run { my $self = shift; my ($class) = @_; my $a_test_runner = Test::Unit::TestRunner->new(); $a_test_runner->do_run(Test::Unit::TestSuite->new($class), 0); } sub run_and_wait { my $self = shift; my ($test) = @_; my $a_test_runner = Test::Unit::TestRunner->new(); $a_test_runner->do_run(Test::Unit::TestSuite->new($test), 1); } sub start { my $self = shift; my (@args) = @_; my $test = ""; my $wait = 0; for (my $i = 0; $i < @args; $i++) { if ($args[$i] eq "-wait") { $wait = 1; } elsif ($args[$i] eq "-v") { print Test::Unit::COPYRIGHT_SHORT; } else { $test = $args[$i]; } } if ($test eq "") { die "Usage: TestRunner.pl [-wait] name, where name is the name of the Test class\n"; } my $suite = Test::Unit::Loader::load($test); $self->do_run($suite, $wait); } sub start_test { my $self = shift; my ($test) = @_; $self->_print("."); } 1; __END__ =head1 NAME Test::Unit::TestRunner - unit testing framework helper class =head1 SYNOPSIS use Test::Unit::TestRunner; my $testrunner = Test::Unit::TestRunner->new(); $testrunner->start($my_test_class); =head1 DESCRIPTION This class is the test runner for the command line style use of the testing framework. It is used by simple command line tools like the F script provided. The class needs one argument, which is the name of the class encapsulating the tests to be run. =head1 OPTIONS =over 4 =item -wait wait for user confirmation between tests =item -v version info =back =head1 AUTHOR Copyright (c) 2000-2002, 2005 the PerlUnit Development Team (see L or the F file included in this distribution). All rights reserved. This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. =head1 SEE ALSO =over 4 =item * L =item * L =item * L =item * L =item * L =item * For further examples, take a look at the framework self test collection (t::tlib::AllTests). =back =cut Test-Unit-0.25/lib/Test/Unit/Assert.pm0000644000175000017500000005133310324262670017634 0ustar mca1001mca100100000000000000package Test::Unit::Assert; use strict; use Test::Unit::Debug qw(debug); use Test::Unit::Failure; use Test::Unit::Error; use Test::Unit::Exception; use Test::Unit::Assertion::CodeRef; use Error qw/:try/; use Carp; sub assert { my $self = shift; my $assertion = $self->normalize_assertion(shift); $self->do_assertion($assertion, (caller($Error::Depth))[0 .. 2], @_); } sub normalize_assertion { my $self = shift; my $assertion = shift; if (!ref($assertion) || ref($assertion) =~ 'ARRAY') { debug((defined $assertion ? $assertion : '_undef_') . " normalized as boolean\n"); require Test::Unit::Assertion::Boolean; return Test::Unit::Assertion::Boolean->new($assertion); } # If we're this far, we must have a reference. if (eval {$assertion->isa('Regexp')}) { debug("$assertion normalized as Regexp\n"); require Test::Unit::Assertion::Regexp; return Test::Unit::Assertion::Regexp->new($assertion); } if (ref($assertion) eq 'CODE') { debug("$assertion normalized as coderef\n"); require Test::Unit::Assertion::CodeRef; return Test::Unit::Assertion::CodeRef->new($assertion); } # if (ref($assertion) eq 'SCALAR') { # debug("$assertion normalized as scalar ref\n"); # require Test::Unit::Assertion::Scalar; # return Test::Unit::Assertion::Scalar->new($assertion); # } if (ref($assertion) !~ /^(GLOB|LVALUE|REF|SCALAR)$/) { debug("$assertion already an object\n"); require Test::Unit::Assertion::Boolean; return $assertion->can('do_assertion') ? $assertion : Test::Unit::Assertion::Boolean->new($assertion); } else { die "Don't know how to normalize $assertion (ref ", ref($assertion), ")\n"; } } sub assert_raises { my $self = shift; require Test::Unit::Assertion::Exception; my $assertion = Test::Unit::Assertion::Exception->new(shift); my ($asserter, $file, $line) = caller($Error::Depth); my $exception = $self->do_assertion($assertion, (caller($Error::Depth))[0 .. 2], @_); } sub do_assertion { my $self = shift; my $assertion = shift; my $asserter = shift; my $file = shift; my $line = shift; debug("Asserting [$assertion] from $asserter in $file line $line\n"); my @args = @_; try { $assertion->do_assertion(@args) } catch Test::Unit::Exception with { my $e = shift; debug(" Caught $e, rethrowing from $asserter, $file line $line\n"); $e->throw_new(-package => $asserter, -file => $file, -line => $line, -object => $self); } } sub multi_assert { my $self = shift; my ($assertion, @argsets) = @_; my ($asserter, $file, $line) = caller($Error::Depth); foreach my $argset (@argsets) { try { $self->assert($assertion, @$argset); } catch Test::Unit::Exception with { my $e = shift; debug(" Caught $e, rethrowing from $asserter, $file line $line\n"); $e->throw_new(-package => $asserter, -file => $file, -line => $line, -object => $self); } } } sub is_numeric { my $str = shift; local $^W; return defined $str && ! ($str == 0 && $str !~ /^\s*[+-]?0(e0)?\s*$/i); } # First argument determines the comparison type. sub assert_equals { my $self = shift; my($asserter, $file, $line) = caller($Error::Depth); my @args = @_; try { if (! defined($args[0]) and ! defined($args[1])) { # pass } elsif (defined($args[0]) xor defined($args[1])) { $self->fail('one arg was not defined'); } elsif (is_numeric($args[0])) { $self->assert_num_equals(@args); } elsif (eval {ref($args[0]) && $args[0]->isa('UNIVERSAL')}) { require overload; if (overload::Method($args[0], '==')) { $self->assert_num_equals(@args); } else { $self->assert_str_equals(@args); } } else { $self->assert_str_equals(@args); } } catch Test::Unit::Exception with { my $e = shift; $e->throw_new(-package => $asserter, -file => $file, -line => $line, -object => $self); } } sub ok { # To make porting from Test easier my $self = shift; my @args = @_; local $Error::Depth = $Error::Depth + 1; if (@args == 1) { $self->assert($args[0]); # boolean assertion } elsif (@args >= 2 && @args <= 3) { if (ref($args[0]) eq 'CODE') { my $code = shift @args; my $expected = shift @args; $self->assert_equals($expected, $code->(), @args); } elsif (eval {$args[1]->isa('Regexp')}) { my $got = shift @args; my $re = shift @args; $self->assert($re, $got, @args); } else { my $got = shift @args; my $expected = shift @args; $self->assert_equals($expected, $got, @args); } } else { $self->error('ok() called with wrong number of args'); } } sub assert_not_equals { my $self = shift; my($asserter,$file,$line) = caller($Error::Depth); my @args = @_; try { if (! defined($args[0]) && ! defined($args[1])) { my $first = shift @args; my $second = shift @args; $self->fail(@args ? join('', @args) : 'both args were undefined'); } elsif (defined($args[0]) xor defined($args[1])) { # succeed } elsif (is_numeric($args[0])) { $self->assert_num_not_equals(@args); } elsif (eval {ref($args[0]) && $args[0]->isa('UNIVERSAL')}) { require overload; if (overload::Method($args[0], '==')) { $self->assert_num_not_equals(@args); } else { $self->assert_str_not_equals(@args); } } else { $self->assert_str_not_equals(@args); } } catch Test::Unit::Exception with { my $e = shift; $e->throw_new(-package => $asserter, -file => $file, -line => $line, -object => $self,); }; } # Shamelessly pinched from Test::More and adapted to Test::Unit. our %Seen_Refs = (); our @Data_Stack; my $DNE = bless [], 'Does::Not::Exist'; sub assert_deep_equals { my $self = shift; my $this = shift; my $that = shift; local $Error::Depth = $Error::Depth + 1; if (! ref $this || ! ref $that) { Test::Unit::Failure->throw( -text => @_ ? join('', @_) : 'Both arguments were not references' ); } local @Data_Stack = (); local %Seen_Refs = (); if (! $self->_deep_check($this, $that)) { Test::Unit::Failure->throw( -text => @_ ? join('', @_) : $self->_format_stack(@Data_Stack) ); } } sub _deep_check { my $self = shift; my ($e1, $e2) = @_; if ( ! defined $e1 || ! defined $e2 ) { return 1 if !defined $e1 && !defined $e2; push @Data_Stack, { vals => [$e1, $e2] }; return 0; } return 0 if ( (defined $e1 && $e1 eq $DNE) || (defined $e2 && $e2 eq $DNE )); return 1 if $e1 eq $e2; if ( ref $e1 && ref $e2 ) { my $e2_ref = "$e2"; return 1 if defined $Seen_Refs{$e1} && $Seen_Refs{$e1} eq $e2_ref; $Seen_Refs{$e1} = $e2_ref; } if (UNIVERSAL::isa($e1, 'ARRAY') and UNIVERSAL::isa($e2, 'ARRAY')) { return $self->_eq_array($e1, $e2); } elsif (UNIVERSAL::isa($e1, 'HASH') and UNIVERSAL::isa($e2, 'HASH')) { return $self->_eq_hash($e1, $e2); } elsif (UNIVERSAL::isa($e1, 'REF') and UNIVERSAL::isa($e2, 'REF')) { push @Data_Stack, { type => 'REF', vals => [$e1, $e2] }; my $ok = $self->_deep_check($$e1, $$e2); pop @Data_Stack if $ok; return $ok; } elsif (UNIVERSAL::isa($e1, 'SCALAR') and UNIVERSAL::isa($e2, 'SCALAR')) { push @Data_Stack, { type => 'REF', vals => [$e1, $e2] }; return $self->_deep_check($$e1, $$e2); } else { push @Data_Stack, { vals => [$e1, $e2] }; return 0; } } sub _eq_array { my $self = shift; my($a1, $a2) = @_; return 1 if $a1 eq $a2; my $ok = 1; my $max = $#$a1 > $#$a2 ? $#$a1 : $#$a2; for (0..$max) { my $e1 = $_ > $#$a1 ? $DNE : $a1->[$_]; my $e2 = $_ > $#$a2 ? $DNE : $a2->[$_]; push @Data_Stack, { type => 'ARRAY', idx => $_, vals => [$e1, $e2] }; $ok = $self->_deep_check($e1,$e2); pop @Data_Stack if $ok; last unless $ok; } return $ok; } sub _eq_hash { my $self = shift; my($a1, $a2) = @_; return 1 if $a1 eq $a2; my $ok = 1; my $bigger = keys %$a1 > keys %$a2 ? $a1 : $a2; foreach my $k (keys %$bigger) { my $e1 = exists $a1->{$k} ? $a1->{$k} : $DNE; my $e2 = exists $a2->{$k} ? $a2->{$k} : $DNE; push @Data_Stack, { type => 'HASH', idx => $k, vals => [$e1, $e2] }; $ok = $self->_deep_check($e1, $e2); pop @Data_Stack if $ok; last unless $ok; } return $ok; } sub _format_stack { my $self = shift; my @Stack = @_; my $var = '$FOO'; my $did_arrow = 0; foreach my $entry (@Stack) { my $type = $entry->{type} || ''; my $idx = $entry->{'idx'}; if( $type eq 'HASH' ) { $var .= "->" unless $did_arrow++; $var .= "{$idx}"; } elsif( $type eq 'ARRAY' ) { $var .= "->" unless $did_arrow++; $var .= "[$idx]"; } elsif( $type eq 'REF' ) { $var = "\${$var}"; } } my @vals = @{$Stack[-1]{vals}}[0,1]; my @vars = (); ($vars[0] = $var) =~ s/\$FOO/ \$a/; ($vars[1] = $var) =~ s/\$FOO/ \$b/; my $out = "Structures begin differing at:\n"; foreach my $idx (0..$#vals) { my $val = $vals[$idx]; $vals[$idx] = !defined $val ? 'undef' : $val eq $DNE ? "Does not exist" : "'$val'"; } $out .= "$vars[0] = $vals[0]\n"; $out .= "$vars[1] = $vals[1]\n"; return $out; } { my %assert_subs = ( str_equals => sub { my $str1 = shift; my $str2 = shift; defined $str1 or Test::Unit::Failure->throw( -text => @_ ? join('',@_) : "expected value was undef; should be using assert_null?" ); defined $str2 or Test::Unit::Failure->throw( -text => @_ ? join('',@_) : "expected '$str1', got undef" ); $str1 eq $str2 or Test::Unit::Failure->throw( -text => @_ ? join('',@_) : "expected '$str1', got '$str2'" ); }, str_not_equals => sub { my $str1 = shift; my $str2 = shift; defined $str1 or Test::Unit::Failure->throw( -text => @_ ? join('',@_) : "expected value was undef; should be using assert_not_null?" ); defined $str2 or Test::Unit::Failure->throw( -text => @_ ? join('',@_) : "expected a string ne '$str1', got undef" ); $str1 ne $str2 or Test::Unit::Failure->throw( -text => @_ ? join('',@_) : "'$str1' and '$str2' should differ" ); }, num_equals => sub { my $num1 = shift; my $num2 = shift; defined $num1 or Test::Unit::Failure->throw( -text => @_ ? join('',@_) : "expected value was undef; should be using assert_null?" ); defined $num2 or Test::Unit::Failure->throw( -text => @_ ? join('',@_) : "expected '$num1', got undef" ); # silence `Argument "" isn't numeric in numeric eq (==)' warnings local $^W; $num1 == $num2 or Test::Unit::Failure->throw( -text => @_ ? join('', @_) : "expected $num1, got $num2" ); }, num_not_equals => sub { my $num1 = shift; my $num2 = shift; defined $num1 or Test::Unit::Failure->throw( -text => @_ ? join('',@_) : "expected value was undef; should be using assert_not_null?" ); defined $num2 or Test::Unit::Failure->throw( -text => @_ ? join('',@_) : "expected a number != '$num1', got undef" ); # silence `Argument "" isn't numeric in numeric ne (!=)' warnings local $^W; $num1 != $num2 or Test::Unit::Failure->throw( -text => @_ ? join('', @_) : "$num1 and $num2 should differ" ); }, matches => sub { my $regexp = shift; eval { $regexp->isa('Regexp') } or Test::Unit::Error->throw( -text => "arg 1 to assert_matches() must be a regexp" ); my $string = shift; $string =~ $regexp or Test::Unit::Failure->throw (-text => @_ ? join('', @_) : "$string didn't match /$regexp/"); }, does_not_match => sub { my $regexp = shift; eval { $regexp->isa('Regexp') } or Test::Unit::Error->throw( -text => "arg 1 to assert_does_not_match() must be a regexp" ); my $string = shift; $string !~ $regexp or Test::Unit::Failure->throw (-text => @_ ? join('', @_) : "$string matched /$regexp/"); }, null => sub { my $arg = shift; !defined($arg) or Test::Unit::Failure->throw (-text => @_ ? join('',@_) : "$arg is defined"); }, not_null => sub { my $arg = shift; defined($arg) or Test::Unit::Failure->throw (-text => @_ ? join('', @_) : " unexpected"); }, ); foreach my $type (keys %assert_subs) { my $assertion = Test::Unit::Assertion::CodeRef->new($assert_subs{$type}); no strict 'refs'; *{"Test::Unit::Assert::assert_$type"} = sub { local $Error::Depth = $Error::Depth + 3; my $self = shift; $assertion->do_assertion(@_); }; } } sub fail { my $self = shift; debug(ref($self) . "::fail() called\n"); my($asserter,$file,$line) = caller($Error::Depth); my $message = join '', @_; Test::Unit::Failure->throw(-text => $message, -object => $self, -file => $file, -line => $line); } sub error { my $self = shift; debug(ref($self) . "::error() called\n"); my($asserter,$file,$line) = caller($Error::Depth); my $message = join '', @_; Test::Unit::Error->throw(-text => $message, -object => $self, -file => $file, -line => $line); } sub quell_backtrace { my $self = shift; carp "quell_backtrace deprecated"; } sub get_backtrace_on_fail { my $self = shift; carp "get_backtrace_on_fail deprecated"; } 1; __END__ =head1 NAME Test::Unit::Assert - unit testing framework assertion class =head1 SYNOPSIS # this class is not intended to be used directly, # normally you get the functionality by subclassing from # Test::Unit::TestCase use Test::Unit::TestCase; # more code here ... $self->assert($your_condition_here, $your_optional_message_here); # or, for regular expression comparisons: $self->assert(qr/some_pattern/, $result); # or, for functional style coderef tests: $self->assert(sub { $_[0] == $_[1] or $self->fail("Expected $_[0], got $_[1]"); }, 1, 2); # or, for old style regular expression comparisons # (strongly deprecated; see warning below) $self->assert(scalar("foo" =~ /bar/), $your_optional_message_here); # Or, if you don't mind us guessing $self->assert_equals('expected', $actual [, $optional_message]); $self->assert_equals(1,$actual); $self->assert_not_equals('not expected', $actual [, $optional_message]); $self->assert_not_equals(0,1); # Or, if you want to force the comparator $self->assert_num_equals(1,1); $self->assert_num_not_equals(1,0); $self->assert_str_equals('string','string'); $self->assert_str_not_equals('stringA', 'stringB'); # assert defined/undefined status $self->assert_null(undef); $self->assert_not_null(''); =head1 DESCRIPTION This class contains the various standard assertions used within the framework. With the exception of the C, all the assertion methods take an optional message after the mandatory fields. The message can either be a single string, or a list, which will get concatenated. Although you can specify a message, it is hoped that the default error messages generated when an assertion fails will be good enough for most cases. =head2 Methods =over 4 =item assert_equals(EXPECTED, ACTUAL [, MESSAGE]) =item assert_not_equals(NOTEXPECTED, ACTUAL [, MESSAGE]) The catch all assertions of (in)equality. We make a guess about whether to test for numeric or string (in)equality based on the first argument. If it looks like a number then we do a numeric test, if it looks like a string, we do a string test. If the first argument is an object, we check to see if the C<'=='> operator has been overloaded and use that if it has, otherwise we do the string test. =item assert_num_equals =item assert_num_not_equals Force numeric comparison with these two. =item assert_str_equals =item assert_str_not_equals Force string comparison =item assert_matches(qr/PATTERN/, STRING [, MESSAGE]) =item assert_does_not_match(qr/PATTERN/, STRING [, MESSAGE]) Assert that STRING does or does not match the PATTERN regex. =item assert_deep_equals(A, B [, MESSAGE ]) Assert that reference A is a deep copy of reference B. The references can be complex, deep structures. If they are different, the default message will display the place where they start differing. B This is NOT well-tested on circular references. Nor am I quite sure what will happen with filehandles. =item assert_null(ARG [, MESSAGE]) =item assert_not_null(ARG [, MESSAGE]) Assert that ARG is defined or not defined. =item assert(BOOLEAN [, MESSAGE]) Checks if the BOOLEAN expression returns a true value that is neither a CODE ref nor a REGEXP. Note that MESSAGE is almost non optional in this case, otherwise all the assertion has to go on is the truth or otherwise of the boolean. If you want to use the "old" style for testing regular expression matching, please be aware of this: the arguments to assert() are evaluated in list context, e.g. making a failing regex "pull" the message into the place of the first argument. Since this is usually just plain wrong, please use scalar() to force the regex comparison to yield a useful boolean value. =item assert(qr/PATTERN/, ACTUAL [, MESSAGE]) Matches ACTUAL against the PATTERN regex. If you omit MESSAGE, you should get a sensible error message. =item assert(CODEREF, @ARGS) Calls CODEREF->(@ARGS). Assertion fails if this returns false (or throws Test::Unit::Failure) =item assert_raises(EXCEPTION_CLASS, CODEREF [, MESSAGE]) Calls CODEREF->(). Assertion fails unless an exception of class EXCEPTION_CLASS is raised. =item multi_assert(ASSERTION, @ARGSETS) Calls $self->assert(ASSERTION, @$ARGSET) for each $ARGSET in @ARGSETS. =item ok(@ARGS) Simulates the behaviour of the L module. B =back =head1 AUTHOR Copyright (c) 2000-2002, 2005 the PerlUnit Development Team (see L or the F file included in this distribution). All rights reserved. This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. =head1 SEE ALSO =over 4 =item * L =item * L =item * L =item * L =item * L =item * L =item * The framework self-testing suite (L) =back =cut Test-Unit-0.25/lib/Test/Unit/Assertion/0000755000175000017500000000000010324277074020003 5ustar mca1001mca100100000000000000Test-Unit-0.25/lib/Test/Unit/Assertion/CodeRef.pm0000644000175000017500000000616107416643311021653 0ustar mca1001mca100100000000000000package Test::Unit::Assertion::CodeRef; use strict; use base qw/Test::Unit::Assertion/; use Carp; use Test::Unit::Debug qw(debug); my $deparser; sub new { my $class = shift; my $code = shift; croak "$class\::new needs a CODEREF" unless ref($code) eq 'CODE'; bless \$code => $class; } sub do_assertion { my $self = shift; my $possible_object = $_[0]; debug("Called do_assertion(" . ($possible_object || 'undef') . ")\n"); if (ref($possible_object) and ref($possible_object) ne 'Regexp' and eval { $possible_object->isa('UNIVERSAL') }) { debug(" [$possible_object] isa [" . ref($possible_object) . "]\n"); $possible_object->$$self(@_[1..$#_]); } else { debug(" asserting [$self]" . (@_ ? " on args " . join(', ', map { $_ || '' } @_) : '') . "\n"); $$self->(@_); } } sub to_string { my $self = shift; if (eval "require B::Deparse") { $deparser ||= B::Deparse->new("-p"); return join '', "sub ", $deparser->coderef2text($$self); } else { return "sub { # If you had a working B::Deparse, you'd know what was in # this subroutine. }"; } } 1; __END__ =head1 NAME Test::Unit::Assertion::CodeRef - A delayed evaluation assertion using a Coderef =head1 SYNOPSIS require Test::Unit::Assertion::CodeRef; my $assert_eq = Test::Unit::Assertion::CodeRef->new(sub { $_[0] eq $_[1] or Test::Unit::Failure->throw(-text => "Expected '$_[0]', got '$_[1]'\n"); }); $assert_eq->do_assertion('foo', 'bar'); Although this is how you'd use Test::Unit::Assertion::CodeRef directly, it is more usually used indirectly via Test::Unit::Test::assert, which instantiates a Test::Unit::Assertion::CodeRef when passed a Coderef as its first argument. =head1 IMPLEMENTS Test::Unit::Assertion::CodeRef implements the Test::Unit::Assertion interface, which means it can be plugged into the Test::Unit::TestCase and friends' C method with no ill effects. =head1 DESCRIPTION This class is used by the framework to allow us to do assertions in a 'functional' manner. It is typically used generated automagically in code like: $self->assert(sub { $_[0] == $_[1] or $self->fail("Expected $_[0], got $_[1]"); }, 1, 2); (Note that if Damian Conway's Perl6 RFC for currying ever comes to pass then we'll be able to do this as: $self->assert(^1 == ^2 || $self->fail("Expected ^1, got ^2"), 1, 2) which will be nice...) If you have a working B::Deparse installed with your perl installation then, if an assertion fails, you'll see a listing of the decompiled coderef (which will be sadly devoid of comments, but should still be useful) =head1 AUTHOR Copyright (c) 2001 Piers Cawley Epdcawley@iterative-software.comE. All rights reserved. This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. =head1 SEE ALSO =over 4 =item * L =item * L =back Test-Unit-0.25/lib/Test/Unit/Assertion/Exception.pm0000644000175000017500000000350707416643311022303 0ustar mca1001mca100100000000000000package Test::Unit::Assertion::Exception; use strict; use base qw/Test::Unit::Assertion/; use Carp; use Error qw/:try/; use Test::Unit::Debug qw(debug); my $deparser; sub new { my $class = shift; my $exception_class = shift; croak "$class\::new needs an exception class" unless $exception_class; bless \$exception_class => $class; } sub do_assertion { my $self = shift; my $coderef = shift; my $exception_class = $$self; my $exception; try { &$coderef(); } catch $exception_class with { $exception = shift; }; if (! $exception || ! $exception->isa($$self)) { $self->fail(@_ ? $_[0] : "No $exception_class was raised"); } return $exception; # so that it can be stored in the test for the # user to get at. } sub to_string { my $self = shift; return "$$self exception assertion"; } 1; __END__ =head1 NAME Test::Unit::Assertion::Exception - A assertion for raised exceptions =head1 SYNOPSIS require Test::Unit::Assertion::Exception; my $assert_raised = Test::Unit::Assertion::Exception->new('MyException'); # This should succeed $assert_eq->do_assertion(sub { MyException->throw() }); # This should fail $assert_eq->do_assertion(sub { }); =head1 DESCRIPTION Although the SYNOPSIS shows how you'd use Test::Unit::Assertion::Exception directly, it is more sensibly used indirectly via C, which instantiates a C. =head1 AUTHOR Copyright (c) 2001 Piers Cawley Epdcawley@iterative-software.comE. All rights reserved. This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. =head1 SEE ALSO =over 4 =item * L =item * L =back Test-Unit-0.25/lib/Test/Unit/Assertion/Boolean.pm0000644000175000017500000000305107445364540021724 0ustar mca1001mca100100000000000000package Test::Unit::Assertion::Boolean; use strict; # adding this fixes the 'Can't locate object method "fail" via package # "Test::Unit::Assertion::Boolean"' problem under perl 5.005 - Christian use Test::Unit::Assertion; use Test::Unit::Failure; use base 'Test::Unit::Assertion'; use overload 'bool' => sub {$ {$_[0]}}; sub new { my $class = shift; my $bool = shift; my $self = \$bool; bless $self, $class; } sub do_assertion { my $self = shift; $$self or $self->fail( @_ ? join('', @_) : "Boolean assertion failed"); } sub to_string { my $self = shift; ($$self ? 'TRUE' : 'FALSE') . ' boolean assertion'; } 1; __END__ =head1 NAME Test::Unit::Assertion::Boolean - A boolean assertion =head1 SYNOPSIS Pay no attention to the man behind the curtain. This is simply a boolean assertion that exists solely to rationalize the way Test::Unit::Assert::assert does its thing. You should never have to instantiate one of these directly. Ever. Go away. There's nothing to see here. =head1 AUTHOR Copyright (c) 2001 Piers Cawley Epdcawley@iterative-software.comE. All rights reserved. This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. =head1 SEE ALSO Look, I've told you, there's nothing going on here. If you go looking at the listing of this module you'll see that it does almost nothing. Why on earth you're still reading at this point is something of a mystery to me. After all, if you're hacking on the Test::Unit source code you'll be able to use the Source. Test-Unit-0.25/lib/Test/Unit/Assertion/Regexp.pm0000644000175000017500000000433307416643311021575 0ustar mca1001mca100100000000000000package Test::Unit::Assertion::Regexp; use strict; use Test::Unit::Assertion; use base qw/Test::Unit::Assertion/; sub new { my $class = shift; my $regex = shift; bless \$regex, $class; } sub do_assertion { my $self = shift; my $target = shift; $target =~ $$self or $self->fail(@_ ? $_[0] : "'$target' did not match /$$self/"); } sub to_string { my $self = shift; "/$$self/ regexp assertion"; } 1; __END__ =head1 NAME Test::Unit::Assertion::Regexp - Assertion with regex matching =head1 SYNOPSIS require Test::Unit::Assertion::Regexp; my $assert_re = Test::Unit::Assertion::Regexp->new(qr/a_pattern/); $assert_re->do_assertion('a_string'); This is rather more detail than the average user will need. Test::Unit::Assertion::Regexp objects are generated automagically by Test::Unit::Assert::assert when it is passed a regular expression as its first parameter. sub test_foo { ... $self->assert(qr/some_pattern/, $result); } If the assertion fails then the object throws an exception with details of the pattern and the string it failed to match against. Note that if you need to do a 'string does I match this pattern' type of assertion then you can do: $self->assert(qr/(?!some_pattern)/, $some_string) ie. Make use of the negative lookahead assertion. =head1 IMPLEMENTS Test::Unit::Assertion::Regexp implements the Test::Unit::Assertion interface, which means it can be plugged into the Test::Unit::TestCase and friends' C method with no ill effects. =head1 DESCRIPTION The class is used by the framework to provide sensible 'automatic' reports when a match fails. The old: $self->assert(scalar($foo =~ /pattern/), "$foo didn't match /.../"); seems rather clumsy compared to this. If the regexp assertion fails, then the user is given a sensible error message, with the pattern and the string that failed to match it... =head1 AUTHOR Copyright (c) 2001 Piers Cawley Epdcawley@iterative-software.comE. All rights reserved. This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. =head1 SEE ALSO =over 4 =item * L =item * L =back Test-Unit-0.25/lib/Test/Unit/Error.pm0000644000175000017500000000235510273475547017500 0ustar mca1001mca100100000000000000package Test::Unit::Error; use strict; use base qw(Test::Unit::Exception); # This is a hack to effectively rebless an unknown user exception as a # Test::Unit::Error, which is nice because all Test::Unit::Exceptions # have nice stringify() methods. sub make_new_from_error { my $self = shift; my $ex = shift; my $object = shift; $self->new(%$ex, -object => $object); } 1; __END__ =head1 NAME Test::Unit::Error - unit testing framework exception class =head1 SYNOPSIS This class is not intended to be used directly =head1 DESCRIPTION This class is used by the framework to communicate the occurrence of run-time errors (that is, syntax errors and the like, not failed tests, as the latter are classified as failures) generated by user code. When such an error occurs, an instance of this class will be thrown and caught internally in the framework. =head1 AUTHOR Copyright (c) 2000-2002, 2005 the PerlUnit Development Team (see L or the F file included in this distribution). All rights reserved. This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. =head1 SEE ALSO =over 4 =item * L =item * L =back =cut Test-Unit-0.25/lib/Test/Unit/Loader.pm0000644000175000017500000001253210273475545017611 0ustar mca1001mca100100000000000000package Test::Unit::Loader; use strict; use FileHandle; use Test::Unit::Debug qw(debug); use Test::Unit::TestSuite; use Test::Unit::TestCase; use Test::Unit::UnitHarness; use Test::Unit::Warning; # should really do something in here about a local @INC. sub obj_load { shift; load(@_) } # Compiles a target. Returns the package if successful. sub compile { my $target = shift; debug("Test::Unit::Loader::compile($target) called\n"); if ($target =~ /^\w+(::\w+)*$/) { compile_class($target); return $target; } elsif ($target =~ /\.pm$/) { compile_file($target); # In this case I need to figure out what the class was I just loaded! return get_package_name_from_file($target); } else { return undef; } } sub compile_class { my $classname = shift; debug(" Test::Unit::Loader::compile_class($classname) called\n"); # Check if the package exists already. { no strict 'refs'; if (my @keys = grep { ! /::$/ } keys %{"$classname\::"}) { debug(" package $classname already exists (@keys); not compiling.\n"); return; } } # No? Try 'require'ing it eval "require $classname"; die $@ if $@; debug(" $classname compiled OK as class name\n"); } sub compile_file { my $file = shift; debug(" Test::Unit::Loader::compile_file($file) called\n"); eval qq{require "$file"}; die $@ if $@; debug(" $file compiled OK as filename\n"); } sub load { my $target = shift; debug("Test::Unit::Loader::load($target) called\n"); my $suite = load_test($target) || load_test_harness_test($target) || load_test_dir($target); return $suite if $suite; die "Couldn't load $target in any of the supported ways"; } sub load_test { my $target = shift; debug("Test::Unit::Loader::load_test($target) called\n"); my $package = compile($target); return unless $package; debug(" compile returned $package\n"); my $suite = load_test_suite($package) || load_test_case($package); die "`$target' was not a valid Test::Unit::Test\n" unless $suite; return $suite; } sub load_test_suite { my $package = shift; debug(" Test::Unit::Loader::load_test_suite($package) called\n"); if ($package->can("suite")) { debug(" $package has a suite() method\n"); return $package->suite(); } } sub load_test_case { my $package = shift; debug(" Test::Unit::Loader::load_test_case($package) called\n"); if ($package->isa("Test::Unit::TestCase")) { debug(" $package isa Test::Unit::TestCase\n"); return Test::Unit::TestSuite->new($package); } } sub extract_testcases { my $classname = shift; my @testcases = (); foreach my $method ($classname->list_tests()) { if ( my $a_class_instance = $classname->new($method) ) { push @testcases, $a_class_instance; } else { push @testcases, Test::Unit::Warning->new( "extract_testcases: Couldn't create a $classname object" ); } } push @testcases, Test::Unit::Warning->new("No tests found in $classname") unless @testcases; return @testcases; } sub load_test_harness_test { my $target = shift; foreach my $file ("$target", "$target.t", "t/$target", "t/$target.t" ) { if (-r $file) { # are the next 3 lines really necessary? open(FH, $file) or next; my $first = ; close(FH) or next; return Test::Unit::UnitHarness->new($file); } } return undef; } sub load_test_dir { my $test_dir = shift; if (-d $test_dir) { die "This is a test directory. I haven't implemented that.\n"; return Test::Unit::UnitHarness::new_dir($test_dir); } } # The next bit of code is a helper function which attempts # to identify the class we are trying to use from a '.pm' # file. If we've reached this point, we managed to 'require' # the file already, but we dont know the file the package was # loaded from. Somehow I feel this information is in perl # somwhere but if it is I dont know where... sub get_package_name_from_file { my $filename = shift; my $real_path = $INC{$filename}; die "Can't find $filename in @INC: $!" unless $real_path && open(FH, $real_path); while () { if (/^\s*package\s+([\w:]+)/) { close(FH); return $1; } } die "Can't find a package in $filename"; } 1; __END__ =head1 NAME Test::Unit::Loader - unit testing framework helper class =head1 SYNOPSIS This class is not intended to be used directly. =head1 DESCRIPTION This class is used by the framework to load test classes into the runtime environment. It handles test case and test suite classes (referenced either via their package names or the files containing them), Test::Harness style test files, and directory names. =head1 AUTHOR Copyright (c) 2000-2002, 2005 the PerlUnit Development Team (see L or the F file included in this distribution). All rights reserved. This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. =head1 SEE ALSO =over 4 =item * L =item * L =item * L =back =cut Test-Unit-0.25/lib/Test/Unit/HarnessUnit.pm0000644000175000017500000000556310273475545020654 0ustar mca1001mca100100000000000000package Test::Unit::HarnessUnit; # this is a test runner which outputs in the same # format that Test::Harness expects. use strict; use base qw(Test::Unit::Runner); use Test::Unit::TestSuite; use Test::Unit::Loader; sub new { my $class = shift; my ($filehandle) = @_; # should really use the IO::Handle package here. # this is very ugly. $filehandle = \*STDOUT unless $filehandle; bless { _Print_stream => $filehandle }, $class; } sub print_stream { my $self = shift; return $self->{_Print_stream}; } sub _print { my $self = shift; my (@args) = @_; $self->{_Print_stream}->print( @args); } sub start_test { my $self=shift; my $test=shift; } sub not_ok { my $self = shift; my ($test, $exception) = @_; $self->_print("\nnot ok ERROR ", $test->name(), "\n$exception\n"); } sub ok { my $self = shift; my ($test) = @_; $self->_print("ok PASS " . $test->name() . "\n"); } sub add_error { my $self = shift; $self->not_ok(@_); } sub add_failure { my $self = shift; $self->not_ok(@_); } sub add_pass { my $self = shift; $self->ok(@_); } sub end_test { my $self = shift; my ($test) = @_; } sub do_run { my $self = shift; my ($suite) = @_; my $result = $self->create_test_result(); $result->add_listener($self); $suite->run($result, $self); } sub main { my $self = shift; my $a_test_runner = __PACKAGE__->new; $a_test_runner->start(@_); } sub run { my $self = shift; my ($class) = @_; my $a_test_runner = Test::Unit::TestRunner->new(); if ($class->isa("Test::Unit::Test")) { $a_test_runner->do_run($class, 0); } else { $a_test_runner->do_run(Test::Unit::TestSuite->new($class), 0); } } sub start { my $self = shift; my (@args) = @_; my $test_case = ""; my $wait = 0; my $suite = Test::Unit::Loader::load(@args); if ($suite) { my $count=$suite->count_test_cases(); $self->_print("STARTING TEST RUN\n1..$count\n"); $self->do_run($suite); exit(0); } else { $self->_print("Invalid argument to test runner: $args[0]\n"); exit(1); } } 1; __END__ =head1 NAME Test::Unit::HarnessUnit - unit testing framework helper class =head1 SYNOPSIS This class is not intended to be used directly =head1 DESCRIPTION This is a test runner which outputs in the same format that Test::Harness expects. =head1 AUTHOR Copyright (c) 2000-2002, 2005 the PerlUnit Development Team (see L or the F file included in this distribution). All rights reserved. This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. =head1 SEE ALSO =over 4 =item * L =item * L =item * L =back =cut Test-Unit-0.25/lib/Test/Unit/Exception.pm0000644000175000017500000000337510273475545020346 0ustar mca1001mca100100000000000000package Test::Unit::Exception; use strict; use Carp; use Error; use base 'Error'; sub throw_new { my $self = shift; my $class = ref $self; $class->throw(%{$self || {}},@_); } sub stacktrace { my $self = shift; warn "Stacktrace is deprecated and no longer works" } sub get_message { my $self = shift; $self->text; } sub hide_backtrace { my $self = shift; $self->{_hide_backtrace} = 1; } sub stringify { my $self = shift; my $file = $self->file; my $line = $self->line; my $message = $self->text || 'Died'; my $object = $self->object; my $str = "$file:$line"; $str .= ' - ' . $object->to_string() if $object && $object->can('to_string'); $str .= "\n" . $message; return $str; } sub to_string { my $self = shift; $self->stringify; } sub failed_test { carp "Test::Unit::Exception::failed_test called"; return $_[0]->object; } sub thrown_exception { carp "Test::Unit::Exception::thrown_exception called"; return $_[0]->object; } 1; __END__ =head1 NAME Test::Unit::Exception - unit testing framework exception class =head1 SYNOPSIS This class is not intended to be used directly =head1 DESCRIPTION This class is used by the framework to communicate the result of assertions, which will throw an instance of a subclass of this class in case of errors or failures. =head1 AUTHOR Copyright (c) 2000-2002, 2005 the PerlUnit Development Team (see L or the F file included in this distribution). All rights reserved. This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. =head1 SEE ALSO =over 4 =item * L =item * L =item * L =back =cut Test-Unit-0.25/lib/Test/Unit/Test.pm0000644000175000017500000000613510273475545017324 0ustar mca1001mca100100000000000000package Test::Unit::Test; use strict; use Carp; use Test::Unit::Debug qw(debug); use base qw(Test::Unit::Assert); sub count_test_cases { my $self = shift; my $class = ref($self); croak "call to abstract method ${class}::count_test_cases"; } sub run { my $self = shift; my $class = ref($self); croak "call to abstract method ${class}::run"; } sub name { my $self = shift; my $class = ref($self); croak "call to abstract method ${class}::name"; } sub to_string { my $self = shift; return $self->name(); } sub filter_method { my $self = shift; my ($token) = @_; my $filtered = $self->filter->{$token}; return unless $filtered; if (ref $filtered eq 'ARRAY') { return grep $self->name eq $_, @$filtered; } elsif (ref $filtered eq 'CODE') { return $filtered->($self->name); } else { die "Didn't understand filtering definition for token $token in ", ref($self), "\n"; } } my %filter = (); sub filter { \%filter } # use Attribute::Handlers; # sub Filter : ATTR(CODE) { # my ($pkg, $symbol, $referent, $attr, $data, $phase) = @_; # print "attr $attr (data $data) on $pkg\::*{$symbol}{NAME}\n"; # # return (); # } sub _find_sym { # pinched from Attribute::Handlers my ($pkg, $ref) = @_; my $type = ref($ref); no strict 'refs'; warn "type $type\n"; while (my ($name, $sym) = each %{$pkg."::"} ) { use Data::Dumper; # warn Dumper(*$sym); warn "name $name sym $sym (" . (*{$sym}{$type} || '?') . ") matches?\n"; return \$sym if *{$sym}{$type} && *{$sym}{$type} == $ref; } } sub MODIFY_CODE_ATTRIBUTES { my ($pkg, $subref, @attrs) = @_; my @bad = (); foreach my $attr (@attrs) { if ($attr =~ /^Filter\((.*)\)$/) { my @tokens = split /\s+|\s*,\s*/, $1; my $sym = _find_sym($pkg, $subref); if ($sym) { push @{ $filter{$_} }, *{$sym}{NAME} foreach @tokens; } else { warn "Couldn't find symbol for $subref in $pkg\n" unless $sym; push @bad, $attr; } } else { push @bad, $attr; } } return @bad; } 1; __END__ =head1 NAME Test::Unit::Test - unit testing framework abstract base class =head1 SYNOPSIS This class is not intended to be used directly =head1 DESCRIPTION This class is used by the framework to define the interface of a test. It is an abstract base class implemented by Test::Unit::TestCase and Test::Unit::TestSuite. Due to the nature of the Perl OO implementation, this class is not really needed, but rather serves as documentation of the interface. =head1 AUTHOR Copyright (c) 2000-2002, 2005 the PerlUnit Development Team (see L or the F file included in this distribution). All rights reserved. This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. =head1 SEE ALSO =over 4 =item * L =item * L =item * L =back =cut Test-Unit-0.25/lib/Test/Unit/TkTestRunner.pm0000644000175000017500000004410610273503113020774 0ustar mca1001mca100100000000000000#!/usr/bin/perl -w package Test::Unit::TkTestRunner; use strict; use base qw(Test::Unit::Runner); use Tk; use Tk::BrowseEntry; use Benchmark; use Test::Unit; # for copyright & version number use Test::Unit::Result; use Test::Unit::Loader; sub new { my $self = bless {}, shift; return $self; } sub about { my $self = shift; my $dialog = $self->{frame}->DialogBox( -title => 'About PerlUnit', -buttons => [ 'OK' ] ); my $text = $dialog->add("ROText"); #, -width => 80, -height => 20); $text->insert("end", Test::Unit::COPYRIGHT_NOTICE); $text->pack(); $dialog->Show(); } sub add_error { my $self = shift; $self->{number_of_errors} = $self->{result}->error_count(); $self->append_failure("Error", @_); $self->update(); } sub add_failure { my $self = shift; $self->{number_of_failures} = $self->{result}->failure_count(); $self->append_failure("Failure", @_); $self->update(); } sub append_failure { my ($self, $kind, $test, $exception)=@_; my $message = $test->name(); #bad juju!! if ($message) { $kind .= ":".substr($message, 0, 100); } $self->{failure_list}->insert("end", $message); push @{$self->{failed_tests}}, $test; push @{$self->{exceptions}}, $exception; } sub plan{ my $self = shift; $self->{planned} = shift; } sub choose_file { my $self = shift; my $name = $self->{suite_name}; my @types = ([ 'All Files', '*' ]); my $dir = undef; if (defined $name) { require File::Basename; my $sfx; ($name, $dir, $sfx) = File::Basename::fileparse($name, '\..*'); if (defined($sfx) && length($sfx)) { unshift(@types, [ 'Similar Files', [$sfx]]); $name .= $sfx; } } my $file = $self->{frame}->getOpenFile( -title => "Select test case", -initialdir => $dir, -initialfile => $name, -filetypes => \@types ); if (defined $file) { $file=~s/\/+/\//g; } $self->{suite_name} = $file; } sub create_punit_menu { my $self = shift; my $main_menu = $self->{frame}->Menu( -type => 'menubar', -menuitems => [ [ cascade => 'F~ile', -menuitems => [ [ command => 'O~pen', -command => sub { $self->choose_file() } ], [ command => 'Ex~it', -command => sub { $self->{frame}->destroy() } ], ], ], [ cascade => 'H~elp', -menuitems => [ [ command => 'A~bout PerlUnit', -command => sub { $self->about() } ], ], ], ], ); return $main_menu; } sub create_menus { my $self = shift; $self->{frame}->configure(-menu => $self->create_punit_menu()); } sub create_ui { my $self = shift; # Lay the window out.... my $mw = $self->{frame} = MainWindow->new( -title => 'Run Test Suite', -width => 200 ); # I need stretchy labels, Tk doesnt have them my $mklabel = sub { my (@args)=@_; $self->{$args[0]} = $args[2]; $mw->Entry( -textvariable => \$self->{$args[0]}, -justify => $args[1], -relief => 'flat', -state => 'disabled' ); }; $self->create_menus(); $self->{suite_label} = $mw->Label( -text => 'Enter the name of the TestCase:' ); $self->{suite_name} = "x"; $self->{suite_field} = $mw->BrowseEntry( -textvariable => \$self->{suite_name}, -choices => [], ); $self->{add_text_listener} = sub { $self->run_suite() }; $self->{run} = $mw->Button( -text => 'Run', -state => 'normal', -command => sub { $self->run_suite() } ); my $lab1 = $mw->Label(-text => "Runs:"); my $lab2 = &{$mklabel}('number_of_runs', 'right', 0); my $lab3 = $mw->Label(-text => "Errors:"); my $lab4 = &{$mklabel}('number_of_errors', 'right', 0); my $lab5 = $mw->Label(-text => "Failures:"); my $lab6 = &{$mklabel}('number_of_failures', 'right', 0); $self->{progress_bar} = $mw->ArrayBar( -width => 20, -length => 400, -colors => [ 'green', 'red', 'grey' ] ); $self->{failure_label} = $mw->Label( -text => 'Errors and Failures:', -justify => 'left' ); $self->{failure_list} = $mw->Scrolled('Listbox', -scrollbars => 'e'); $self->{failure_list}->insert("end", "", "", "", "", "", ""); $self->{quit_button} = $mw->Button( -text => 'Quit', -command => sub { $mw->destroy() } ); $self->{rerun_button} = $mw->Button( -text => 'ReRun', -state => 'normal', -command => sub { $self->rerun() } ); $self->{show_error_button} = $mw->Button( -text => 'Show...', -state => 'normal', -command => sub { $self->show_error_trace() } ); $self->{status_line_box}= &{$mklabel}('status_line', 'left', 'Status line'); $self->{status_line_box}->configure(-relief => 'sunken', -bg => 'grey'); # Bindings go here, so objects are already defined. $self->{failure_list}->bind('' => sub { $self->show_error_trace() }); # all geometry management BELOW this point. Otherwise bindings # wont work. $self->{suite_label}->form( -left => [ '%0' ], -top => [ '%0' ], -fill => 'x' ); $self->{run}->form( -right => [ '%100' ], -top => [ $self->{suite_label} ], ); $self->{suite_field}->form( -left => [ '%0' ], -right => [$self->{run}], -top => [$self->{suite_label}], -fill => 'x' ); $lab1->form(-left => ['%0'], -top => [$self->{suite_field}, 10]); $lab2->form(-left => [$lab1], -top => [$self->{suite_field}, 10], -fill => 'x'); $lab3->form(-left => [$lab2], -top => [$self->{suite_field}, 10]); $lab4->form(-left => [$lab3], -top => [$self->{suite_field}, 10], -fill => 'x'); $lab5->form(-left => [$lab4], -top => [$self->{suite_field}, 10]); $lab6->form(-left => [$lab5], -top => [$self->{suite_field}, 10], -fill => 'x'); $self->{progress_bar}->form(-left => [ '%0' ], -top => [$lab6, 10]); $self->{failure_label}->form( -left => [ '%0' ], -top => [$self->{progress_bar}, 10], -right => [ '%100' ] ); $self->{failure_list}->form( -left => [ '%0' ], -top => [$self->{failure_label}], -right => [ '%100' ], -fill => 'both' ); # this is in a wierd order 'cos Quit keeps trying to resize. $self->{quit_button}->form( -right => [ '%100' ], -bottom => [ '%100' ], -fill => 'none' ); $self->{show_error_button}->form( -right => [ '%100' ], -bottom => [$self->{quit_button}], -top => [$self->{failure_list}] ); # Rerun doesn't work yet. # $self->{rerun_button}->form( # -right => [$self->{show_error_button}], # -top => [$self->{failure_list}] # ); $self->{status_line_box}->form( -left => [ '%0' ], -right => [$self->{quit_button}], -bottom => [ '%100' ], -top => [$self->{show_error_button}], -fill => 'x' ); $self->reset(); return $mw; } sub end_test { my $self = shift; $self->{runs} = $self->{result}->run_count(); $self->update(); } sub get_test { my $self = shift; my $suite = Test::Unit::Loader->obj_load(shift); $self->{status_line}=""; return $suite; } sub is_error_selected { my $self = shift; ($self->{listbox}->curselection>=0)?1:0; } sub load_frame_icon { # not implemented } sub main { my $main = new Test::Unit::TkTestRunner()->start(@_); } sub rerun { # not implemented and not going to! my $self = shift; my $index = $self->{failure_list}->curselection; return if $index < 0; my $test = $self->{failed_tests}->[$index]; #if (! $test->isa("Test::Unit::TestCase")) { $self->show_status("Could not reload test."); #} # Not sure how to do this... } sub reset { my $self = shift; $self->{number_of_errors} = 0; $self->{number_of_failures} = 0; $self->{number_of_runs} = 0; $self->{planned} = 0; $self->{failure_list}->delete(0, "end"); $self->{exceptions} = []; $self->{failed_tests} = []; $self->{progress_bar}->value(0, 0, 1); } sub run { my $self = shift; $self->run_suite(); } sub run_failed { my $self = shift; # not implemented } sub run_suite { my $self = shift; my $suite; if (defined($self->{runner})) { $self->{result}->stop(); } else { $self->add_to_history(); $self->{run}->configure(-text => "Stop"); $self->show_info("Initializing..."); $self->reset(); $self->show_info("Load Test Case..."); eval { $suite = $self->get_test($self->{suite_name}); }; if ($@ or !$suite) { $suite = undef; $self->show_status("Could not load test!"); } if ($suite) { $self->{runner} = 1; $self->{planned} = $suite->count_test_cases(); $self->{result} = $self->create_test_result(); $self->{result}->add_listener($self); $self->show_info("Running..."); $self->{start_time} = new Benchmark(); $suite->run($self->{result}); if ($self->{result}->should_stop()) { $self->show_status("Stopped"); } else { $self->{finish_time} = new Benchmark(); $self->{run_time} = timediff($self->{finish_time}, $self->{start_time}); $self->show_info("Finished: ".timestr($self->{run_time}, 'nop')); } } $self->{runner} = undef; $self->{result} = undef; $self->{run}->configure(-text => "Run"); } } sub show_error_trace { # pop up a text dialog containing the details. my $self = shift; my $dialog = $self->{frame}->DialogBox( -title => 'Details', -buttons => [ 'OK' ] ); my $selected = $self->{failure_list}->curselection; return unless defined($selected) && $self->{exceptions}[$selected]; my $text = $dialog->add("Scrolled", "ROText", -width => 80, -height => 20) ->pack(-expand => 1, -fill => 'both'); $text->insert("end", $self->{exceptions}[$selected]->to_string()); my $e = $self->{exceptions}[$selected]; if ($e->object->annotations()) { foreach my $data ("\n\nAnnotations:\n", $e->object->annotations()) { $text->insert("end", $data); # third arg would be a tag } } $dialog->Show(); } sub show_info { my $self = shift; $self->{status_line} = shift; $self->{status_line_box}->configure(-bg => 'grey'); } sub show_status { my $self = shift; $self->{status_line} = shift; $self->{status_line_box}->configure(-bg => 'red'); } sub start { my $self = shift; my (@args)=@_; my $mw = $self->create_ui(); if (@args) { $self->{suite_name} = shift @args; } MainLoop; } sub start_test { my $self = shift; my $test = shift; $self->{number_of_runs} = $self->{result}->run_count(); $self->show_info("Running: " . $test->name()); } sub add_pass { my $self = shift; my ($test, $exception)=@_; $self->update(); } sub update { my $self = shift; my $result = $self->{result}; my $total = $result->run_count(); my $failures = $result->failure_count(); my $errors = $result->error_count(); my $passes = $total-$failures-$errors; my $bad = $failures+$errors; #$passes = $result->run_count(); my $todo = ($total>$self->{planned})?0:$self->{planned}-$total; $self->{progress_bar}->value($passes, $bad, $todo); # force entry into the event loop. # this makes it nearly like its threaded... #sleep 1; $self->{frame}->update(); } sub add_to_history { my $self = shift; my $new_item = $self->{suite_name}; my $h = $self->{suite_field}; my $choices = $h->cget('-choices'); my @choices = (); if (ref($choices)) { @choices=@{$h->cget('-choices')}; } elsif ($choices) { # extraordinarily bad - choices is a scalar if theres # only one, and undefined if there are none! @choices = ($h->cget('-choices')); } @choices = ($new_item, grep {$_ ne $new_item} @choices); if (@choices>10) { @choices=@choices[0..9]; } $h->configure(-choices => \@choices); } package Tk::ArrayBar; # progressbar doesnt cut it. # This expects a variable which is an array ref, and # a matching list of colours. Sortof like stacked progress bars. # Heavily - ie almost totally - based on the code in ProgressBar. use Tk; use Tk::Canvas; use Tk::ROText; use Tk::DialogBox; use Carp; use strict; use base qw(Tk::Derived Tk::Canvas); Construct Tk::Widget 'ArrayBar'; sub ClassInit { my ($class, $mw) = @_; $class->SUPER::ClassInit($mw); $mw->bind($class, '', [ '_layoutRequest', 1 ]); } sub Populate { my($c, $args) = @_; $c->ConfigSpecs( -width => [ PASSIVE => undef, undef, 0 ], '-length' => [ PASSIVE => undef, undef, 0 ], -padx => [ PASSIVE => 'padX', 'Pad', 0 ], -pady => [ PASSIVE => 'padY', 'Pad', 0 ], -colors => [ PASSIVE => undef, undef, undef ], -relief => [ SELF => 'relief', 'Relief', 'sunken' ], -value => [ METHOD => undef, undef, undef ], -variable => [ PASSIVE => undef, undef, [ 0 ] ], -anchor => [ METHOD => 'anchor', 'Anchor', 'w' ], -resolution => [ PASSIVE => undef, undef, 1.0 ], -highlightthickness => [ SELF => 'highlightThickness', 'HighlightThickness', 0 ], -troughcolor => [ PASSIVE => 'troughColor', 'Background', 'grey55' ], ); _layoutRequest($c, 1); $c->OnDestroy([ Destroyed => $c ]); } sub anchor { my $c = shift; my $var = \$c->{Configure}{'-anchor'}; my $old = $$var; if (@_) { my $new = shift; croak "bad anchor position \"$new\": must be n, s, w or e" unless $new =~ /^[news]$/; $$var = $new; } $old; } sub _layoutRequest { my $c = shift; my $why = shift; $c->afterIdle([ '_arrange', $c ]) unless $c->{layout_pending}; $c->{layout_pending} |= $why; } sub _arrange { my $c = shift; my $why = $c->{layout_pending}; $c->{layout_pending} = 0; my $w = $c->Width; my $h = $c->Height; my $bw = $c->cget('-borderwidth') + $c->cget('-highlightthickness'); my $x = abs(int($c->{Configure}{'-padx'})) + $bw; my $y = abs(int($c->{Configure}{'-pady'})) + $bw; my $value = $c->cget('-variable'); my $horz = $c->{Configure}{'-anchor'} =~ /[ew]/i ? 1 : 0; my $dir = $c->{Configure}{'-anchor'} =~ /[ne]/i ? -1 : 1; if ($w == 1 && $h == 1) { my $bw = $c->cget('-borderwidth'); $h = $c->pixels($c->cget('-length')) || 40; $w = $c->pixels($c->cget('-width')) || 20; ($w, $h) = ($h, $w) if $horz; $c->GeometryRequest($w, $h); $c->parent->update; $c->update; $w = $c->Width; $h = $c->Height; } $w -= $x*2; $h -= $y*2; my $length = $horz ? $w : $h; my $width = $horz ? $h : $w; # at this point we have the length and width of the # bar independent of orientation and padding. # blocks and gaps are not used. # unlike progressbar I need to redraw these each time. # actually resizing them might be better... my $colors = $c->{Configure}{'-colors'} || [ 'green', 'red', 'grey55' ]; $c->delete($c->find('all')); $c->createRectangle( 0, 0, $w+$x*2, $h+$y*2, -fill => $c->{Configure}{'-troughcolor'}, -width => 0, -outline => undef ); my $total; my $count_value = scalar(@$value)-1; foreach my $val (@$value) { $total += $val > 0 ? $val : 0; } # prevent div by zero and give a nice initial appearance. $total = $total ? $total : 1; my $curx = $x; my $cury = $y; foreach my $index (0..$count_value) { my $size = ($length*$value->[$index])/$total; my $ud = $horz?$width:$size; my $lr = $horz?$size:$width; $c->{cover}->[$index] = $c->createRectangle( $curx, $cury, $curx+$lr-1, $cury+$ud-1, -fill => $colors->[$index], -width => 1, -outline => 'black' ); $curx+=$horz?$lr:0; $cury+=$horz?0:$ud; } } sub value { my $c = shift; my $val = $c->cget('-variable'); if (@_) { $c->configure(-variable => [@_]); _layoutRequest($c, 2); } } sub Destroyed { my $c = shift; my $var = delete $c->{'-variable'}; untie $$var if defined($var) && ref($var); } 1; __END__ =head1 NAME Test::Unit::TkTestRunner - unit testing framework helper class =head1 SYNOPSIS use Test::Unit::TkTestRunner; Test::Unit::TkTestRunner::main($my_testcase_class); =head1 DESCRIPTION This class is the test runner for the GUI style use of the testing framework. It is used by simple command line tools like the F script provided. The class needs as arguments the names of the classes encapsulating the tests to be run. =head1 AUTHOR Copyright (c) 2000-2002, 2005 the PerlUnit Development Team (see L or the F file included in this distribution). All rights reserved. This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. =head1 SEE ALSO =over 4 =item * L =item * L =item * L =item * L =item * L =item * L =item * For further examples, take a look at the framework self test collection (t::tlib::AllTests). =back =cut Test-Unit-0.25/lib/Test/Unit/Decorator.pm0000644000175000017500000000253107504367740020323 0ustar mca1001mca100100000000000000package Test::Unit::Decorator; use strict; use base qw(Test::Unit::Test); sub new { my $class = shift; my ($fTest) = @_; return bless { _fTest => $fTest }, $class; } sub basic_run { my $self = shift; my ($result) = @_; $self->{_fTest}->run($result); } sub count_test_cases() { my $self = shift; return $self->{_fTest}->count_test_cases(); } sub run { my $self = shift; my ($result) = @_; $self->basic_run($result); } sub to_string { my $self = shift; "$self->{_fTest}"; } sub get_test { my $self = shift; return $self->{_fTest}; } 1; __END__ =head1 NAME Test::Unit::Decorator - unit testing framework helper class =head1 SYNOPSIS # A Decorator for Tests. Use TestDecorator as the base class # for defining new test decorators. Test decorator subclasses # can be introduced to add behaviour before or after a test # is run. =head1 DESCRIPTION A Decorator for Tests. Use TestDecorator as the base class for defining new test decorators. Test decorator subclasses can be introduced to add behaviour before or after a test is run. =head1 AUTHOR Copyright (c) 2001 Kevin Connor All rights reserved. This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. =head1 SEE ALSO L =cut Test-Unit-0.25/lib/Test/Unit/TestSuite.pm0000644000175000017500000002034610273475545020336 0ustar mca1001mca100100000000000000package Test::Unit::TestSuite; use strict; =head1 NAME Test::Unit::TestSuite - unit testing framework base class =cut use base 'Test::Unit::Test'; use Carp; use Test::Unit::Debug qw(debug); use Test::Unit::TestCase; use Test::Unit::Loader; use Test::Unit::Warning; =head1 SYNOPSIS package MySuite; use base qw(Test::Unit::TestSuite); sub name { 'My very own test suite' } sub include_tests { qw(MySuite1 MySuite2 MyTestCase1 ...) } This is the easiest way of building suites; there are many more. Read on ... =head1 DESCRIPTION This class provides the functionality for building test suites in several different ways. Any module can be a test suite runnable by the framework if it provides a C method which returns a C object, e.g. use Test::Unit::TestSuite; # more code here ... sub suite { my $class = shift; # Create an empty suite. my $suite = Test::Unit::TestSuite->empty_new("A Test Suite"); # Add some tests to it via $suite->add_test() here return $suite; } This is useful if you want your test suite to be contained in the module it tests, for example. Alternatively, you can have "standalone" test suites, which inherit directly from C, e.g.: package MySuite; use base qw(Test::Unit::TestSuite); sub new { my $class = shift; my $self = $class->SUPER::empty_new(); # Build your suite here return $self; } sub name { 'My very own test suite' } or if your C is going to do nothing more interesting than add tests from other suites and testcases via C, you can use the C method as shorthand: package MySuite; use base qw(Test::Unit::TestSuite); sub name { 'My very own test suite' } sub include_tests { qw(MySuite1 MySuite2 MyTestCase1 ...) } This is the easiest way of building suites. =head1 CONSTRUCTORS =head2 empty_new ([NAME]) my $suite = Test::Unit::TestSuite->empty_new('my suite name'); Creates a fresh suite with no tests. =cut sub empty_new { my $this = shift; my $classname = ref $this || $this; my $name = shift || ''; my $self = { _Tests => [], _Name => $name, }; bless $self, $classname; debug(ref($self), "::empty_new($name) called\n"); return $self; } =head2 new ([ CLASSNAME | TEST ]) If a test suite is provided as the argument, it merely returns that suite. If a test case is provided, it extracts all test case methods from the test case (see L) into a new test suite. If the class this method is being run in has an C method which returns an array of class names, it will also automatically add the tests from those classes into the newly constructed suite object. =cut sub new { my $class = shift; my $classname = shift || ''; # Avoid a warning debug("$class\::new($classname) called\n"); my $self = $class->empty_new(); if ($classname) { Test::Unit::Loader::compile_class($classname); if (eval { $classname->isa('Test::Unit::TestCase') }) { $self->{_Name} = "suite extracted from $classname"; my @testcases = Test::Unit::Loader::extract_testcases($classname); foreach my $testcase (@testcases) { $self->add_test($testcase); } } elsif (eval { $classname->can('suite') }) { return $classname->suite(); } else { my $error = "Class $classname was not a test case or test suite.\n"; #$self->add_warning($error); die $error; } } if ($self->can('include_tests')) { foreach my $test ($self->include_tests()) { $self->add_test($test); } } return $self; } =head1 METHODS =cut sub suite { my $class = shift; croak "suite() is not an instance method" if ref $class; $class->new(@_); } =head2 name() Returns the suite's human-readable name. =cut sub name { my $self = shift; croak "Override name() in subclass to set name\n" if @_; return $self->{_Name}; } =head2 names() Returns an arrayref of the names of all tests in the suite. =cut sub names { my $self = shift; my @test_list = @{$self->tests}; return [ map {$_->name} @test_list ] if @test_list; } =head2 list (SHOW_TESTCASES) Produces a human-readable indented lists of the suite and the subsuites it contains. If the first parameter is true, also lists any testcases contained in the suite and its subsuites. =cut sub list { my $self = shift; my $show_testcases = shift; my $first = ($self->name() || 'anonymous Test::Unit::TestSuite'); $first .= " - " . ref($self) unless ref($self) eq __PACKAGE__; $first .= "\n"; my @lines = ( $first ); foreach my $test (@{ $self->tests() }) { push @lines, map " $_", @{ $test->list($show_testcases) }; } return \@lines; } =head2 add_test (TEST_CLASSNAME | TEST_OBJECT) You can add a test object to a suite with this method, by passing either its classname, or the object itself as the argument. Of course, there are many ways of getting the object too ... # Get and add an existing suite. $suite->add_test('MySuite1'); # This is exactly equivalent: $suite->add_test(Test::Unit::TestSuite->new('MySuite1')); # So is this, provided MySuite1 inherits from Test::Unit::TestSuite. use MySuite1; $suite->add_test(MySuite1->new()); # Extract yet another suite by way of suite() method and add it to # $suite. use MySuite2; $suite->add_test(MySuite2->suite()); # Extract test case methods from MyModule::TestCase into a # new suite and add it to $suite. $suite->add_test(Test::Unit::TestSuite->new('MyModule::TestCase')); =cut sub add_test { my $self = shift; my ($test) = @_; debug('+ ', ref($self), "::add_test($test) called\n"); $test = Test::Unit::Loader::load_test($test) unless ref $test; croak "`$test' could not be interpreted as a Test::Unit::Test object" unless eval { $test->isa('Test::Unit::Test') }; push @{$self->tests}, $test; } sub count_test_cases { my $self = shift; my $count; $count += $_->count_test_cases for @{$self->tests}; return $count; } sub run { my $self = shift; my ($result, $runner) = @_; debug("$self\::run($result, ", $runner || 'undef', ") called\n"); $result ||= create_result(); $result->tell_listeners(start_suite => $self); $self->add_warning("No tests found in " . $self->name()) unless @{ $self->tests() }; for my $t (@{$self->tests()}) { if ($runner && $self->filter_test($runner, $t)) { debug(sprintf "+ skipping '%s'\n", $t->name()); next; } debug(sprintf "+ didn't skip '%s'\n", $t->name()); last if $result->should_stop(); $t->run($result, $runner); } $result->tell_listeners(end_suite => $self); return $result; } sub filter_test { my $self = shift; my ($runner, $test) = @_; debug(sprintf "checking whether to filter '%s'\n", $test->name); my @filter_tokens = $runner->filter(); foreach my $token (@filter_tokens) { my $filtered = $test->filter_method($token); debug(" - by token $token? ", $filtered ? 'yes' : 'no', "\n"); return 1 if $filtered; } return 0; } sub test_at { my $self = shift; my ($index) = @_; return $self->tests()->[$index]; } sub test_count { my $self = shift; return scalar @{$self->tests()}; } sub tests { my $self = shift; return $self->{_Tests}; } sub to_string { my $self = shift; return $self->name(); } sub add_warning { my $self = shift; $self->add_test(Test::Unit::Warning->new(join '', @_)); } 1; __END__ =head1 AUTHOR Copyright (c) 2000-2002, 2005 the PerlUnit Development Team (see L or the F file included in this distribution). All rights reserved. This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. =head1 SEE ALSO =over 4 =item * L =item * L =item * For further examples, take a look at the framework self test collection (t::tlib::AllTests). =back =cut Test-Unit-0.25/lib/Test/Unit/Runner.pm0000644000175000017500000000367110273475545017660 0ustar mca1001mca100100000000000000package Test::Unit::Runner; =head1 NAME Test::Unit::Runner - abstract base class for test runners =head1 SYNOPSIS my $runner = Test::Unit::TestRunner->new(); $runner->filter(@filter_tokens); $runner->start(...); =head1 DESCRIPTION This class is a parent class of all test runners, and hence is not intended to be used directly. It provides functionality such as state (e.g. run-time options) available to all runner classes. =cut use strict; use Test::Unit::Result; use base qw(Test::Unit::Listener); sub create_test_result { my $self = shift; return $self->{_result} = Test::Unit::Result->new(); } sub result { shift->{_result} } sub start_suite { my $self = shift; my ($suite) = @_; push @{ $self->{_suites_running} }, $suite; } sub end_suite { my $self = shift; my ($suite) = @_; pop @{ $self->{_suites_running} }; } =head2 suites_running() Returns an array stack of the current suites running. When a new suite is started, it is pushed on the stack, and it is popped on completion. Hence the first element in the returned array is the top-level suite, and the last is the innermost suite. =cut sub suites_running { my $self = shift; return @{ $self->{_suites_running} || [] }; } =head2 filter([ @tokens ]) Set the runner's filter tokens to the given list. =cut sub filter { my $self = shift; $self->{_filter} = [ @_ ] if @_; return @{ $self->{_filter} || [] }; } =head2 reset_filter() Clears the current filter. =cut sub reset_filter { my $self = shift; $self->{_filter} = []; } 1; =head1 AUTHOR Copyright (c) 2000-2002, 2005 the PerlUnit Development Team (see L or the F file included in this distribution). All rights reserved. This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. =head1 SEE ALSO L, L, L =cut Test-Unit-0.25/lib/Test/Unit/TestCase.pm0000644000175000017500000002643210273475545020122 0ustar mca1001mca100100000000000000package Test::Unit::TestCase; use strict; use base qw(Test::Unit::Test); use Test::Unit::Debug qw(debug); use Test::Unit::Failure; use Test::Unit::Error; use Test::Unit::Result; use Devel::Symdump; use Class::Inner; use Error qw/:try/; sub new { my $class = shift; my ($name) = @_; bless { __PACKAGE__ . '_name' => $name, __PACKAGE__ . '_annotations' => '', }, $class; } sub annotate { my $self = shift; $self->{__PACKAGE__ . '_annotations'} .= join '', @_; } sub annotations { $_[0]->{__PACKAGE__ . '_annotations'} } sub count_test_cases { my $self = shift; return 1; } sub create_result { my $self = shift; return Test::Unit::Result->new(); } sub name { my $self = shift; return $self->{__PACKAGE__ . '_name'}; } sub run { my $self = shift; debug(ref($self), "::run() called on ", $self->name, "\n"); my ($result, $runner) = @_; $result ||= create_result(); $result->run($self); return $result; } sub run_bare { my $self = shift; debug(" ", ref($self), "::run_bare() called on ", $self->name, "\n"); $self->set_up(); # Make sure tear_down happens if and only if set_up() succeeds. try { $self->run_test(); 1; } finally { $self->tear_down; }; } sub run_test { my $self = shift; debug(" ", ref($self) . "::run_test() called on ", $self->name, "\n"); my $method = $self->name(); if ($self->can($method)) { debug(" running `$method'\n"); $self->$method(); } else { $self->fail(" Method `$method' not found"); } } sub set_up { 1 } sub tear_down { 1 } sub to_string { my $self = shift; my $class = ref($self); return ($self->name() || "ANON") . "(" . $class . ")"; } sub make_test_from_coderef { my ($self, $coderef, @args) = @_; die "Need a coderef argument" unless $coderef; return Class::Inner->new(parent => ($self || ref $self), methods => {run_test => $coderef}, args => [ @args ]); } # Returns a list of the tests run by this class and its superclasses. # DO NOT OVERRIDE THIS UNLESS YOU KNOW WHAT YOU ARE DOING! sub list_tests { my $class = ref($_[0]) || $_[0]; my @tests = (); no strict 'refs'; if (defined(@{"$class\::TESTS"})) { push @tests, @{"$class\::TESTS"}; } else { push @tests, $class->get_matching_methods(qr/::(test[^:]*)$/); } push @tests, map {$_->can('list_tests') ? $_->list_tests : () } @{"$class\::ISA"}; my %tests = map {$_ => ''} @tests; return keys %tests; } sub get_matching_methods { my $class = ref($_[0]) || $_[0]; my $re = $_[1]; my $st = Devel::Symdump->new($class); return map { /$re/ ? $1 : () } $st->functions(); } sub list { my $self = shift; my $show_testcases = shift; return $show_testcases ? [ ($self->name() || 'anonymous testcase') . "\n" ] : []; } 1; __END__ =head1 NAME Test::Unit::TestCase - unit testing framework base class =head1 SYNOPSIS package FooBar; use base qw(Test::Unit::TestCase); sub new { my $self = shift()->SUPER::new(@_); # your state for fixture here return $self; } sub set_up { # provide fixture } sub tear_down { # clean up after test } sub test_foo { my $self = shift; my $obj = ClassUnderTest->new(...); $self->assert_not_null($obj); $self->assert_equals('expected result', $obj->foo); $self->assert(qr/pattern/, $obj->foobar); } sub test_bar { # test the bar feature } =head1 DESCRIPTION Test::Unit::TestCase is the 'workhorse' of the PerlUnit framework. When writing tests, you generally subclass Test::Unit::TestCase, write C and C functions if you need them, a bunch of C test methods, then do $ TestRunner.pl My::TestCase::Class and watch as your tests fail/succeed one after another. Or, if you want your tests to work under Test::Harness and the standard perlish 'make test', you'd write a t/foo.t that looked like: use Test::Unit::HarnessUnit; my $r = Test::Unit::HarnessUnit->new(); $r->start('My::TestCase::Class'); =head2 How To Use Test::Unit::TestCase (Taken from the JUnit TestCase class documentation) A test case defines the "fixture" (resources need for testing) to run multiple tests. To define a test case: =over 4 =item 1 implement a subclass of TestCase =item 2 define instance variables that store the state of the fixture (I suppose if you are using Class::MethodMaker this is possible...) =item 3 initialize the fixture state by overriding C =item 4 clean-up after a test by overriding C. =back Implement your tests as methods. By default, all methods that match the regex C are taken to be test methods (see L and L). Note that, by default all the tests defined in the current class and all of its parent classes will be run. To change this behaviour, see L. By default, each test runs in its own fixture so there can be no side effects among test runs. Here is an example: package MathTest; use base qw(Test::Unit::TestCase); sub new { my $self = shift()->SUPER::new(@_); $self->{value_1} = 0; $self->{value_2} = 0; return $self; } sub set_up { my $self = shift; $self->{value_1} = 2; $self->{value_2} = 3; } For each test implement a method which interacts with the fixture. Verify the expected results with assertions specified by calling C<$self-Eassert()> with a boolean value. sub test_add { my $self = shift; my $result = $self->{value_1} + $self->{value_2}; $self->assert($result == 5); } Once the methods are defined you can run them. The normal way to do this uses reflection to implement C. It dynamically finds and invokes a method. For this the name of the test case has to correspond to the test method to be run. The tests to be run can be collected into a TestSuite. The framework provides different test runners, which can run a test suite and collect the results. A test runner either expects a method C as the entry point to get a test to run or it will extract the suite automatically. =head2 Writing Test Methods The return value of your test method is completely irrelevant. The various test runners assume that a test is executed successfully if no exceptions are thrown. Generally, you will not have to deal directly with exceptions, but will write tests that look something like: sub test_something { my $self = shift; # Execute some code which gives some results. ... # Make assertions about those results $self->assert_equals('expected value', $resultA); $self->assert_not_null($result_object); $self->assert(qr/some_pattern/, $resultB); } The assert methods throw appropriate exceptions when the assertions fail, which will generally stringify nicely to give you sensible error reports. L has more details on the various different C methods. L describes the Exceptions used within the C framework. =head2 Helper methods =over 4 =item make_test_from_coderef (CODEREF, [NAME]) Takes a coderef and an optional name and returns a Test case that inherits from the object on which it was called, which has the coderef installed as its C method. L has more details on how this is generated. =item list_tests Returns the list of test methods in this class and its parents. You can override this in your own classes, but remember to call C in there too. Uses C. =item get_matching_methods (REGEXP) Returns the list of methods in this class matching REGEXP. =item set_up =item tear_down If you don't have any setup or tear down code that needs to be run, we provide a couple of null methods. Override them if you need to. =item annotate (MESSAGE) You can accumulate helpful debugging for each testcase method via this method, and it will only be outputted if the test fails or encounters an error. =back =head2 How it All Works The PerlUnit framework is achingly complex. The basic idea is that you get to write your tests independently of the manner in which they will be run, either via a C type script, or through one of the provided TestRunners, the framework will handle all that for you. And it does. So for the purposes of someone writing tests, in the majority of cases the answer is 'It just does.'. Of course, if you're trying to extend the framework, life gets a little more tricky. The core class that you should try and grok is probably Test::Unit::Result, which, in tandem with whichever TestRunner is being used mediates the process of running tests, stashes the results and generally sits at the centre of everything. Better docs will be forthcoming. =head1 NOTES Here's a few things to remember when you're writing your test suite: Tests are run in 'random' order; the list of tests in your TestCase are generated automagically from its symbol table, which is a hash, so methods aren't sorted there. If you need to specify the test order, you can do one of the following: =over 4 =item * Set @TESTS our @TESTS = qw(my_test my_test_2); This is the simplest, and recommended way. =item * Override the C method to return an ordered list of methodnames =item * Provide a C method which returns a Test::Unit::TestSuite. =back However, even if you do manage to specify the test order, be careful, object data will not be retained from one test to another, if you want to use persistent data you'll have to use package lexicals or globals. (Yes, this is probably a bug). If you only need to restrict which tests are run, there is a filtering mechanism available. Override the C method in your testcase class to return a hashref whose keys are filter tokens and whose values are either arrayrefs of test method names or coderefs which take the method name as the sole parameter and return true if and only if it should be filtered, e.g. sub filter {{ slow => [ qw(my_slow_test my_really_slow_test) ], matching_foo => sub { my $method = shift; return $method =~ /foo/; } }} Then, set the filter state in your runner before the test run starts: # @filter_tokens = ( 'slow', ... ); $runner->filter(@filter_tokens); $runner->start(@args); This interface is public, but currently undocumented (see F). =head1 BUGS See note 1 for at least one bug that's got me scratching my head. There's bound to be others. =head1 AUTHOR Copyright (c) 2000-2002, 2005 the PerlUnit Development Team (see L or the F file included in this distribution). All rights reserved. This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. =head1 SEE ALSO =over 4 =item * L =item * L =item * L =item * L =item * L =item * For further examples, take a look at the framework self test collection (t::tlib::AllTests). =back =cut Test-Unit-0.25/lib/Test/Unit/Runner/0000755000175000017500000000000010324277074017305 5ustar mca1001mca100100000000000000Test-Unit-0.25/lib/Test/Unit/Runner/Terminal.pm0000644000175000017500000000622610273475542021427 0ustar mca1001mca100100000000000000package Test::Unit::Runner::Terminal; use strict; use base qw(Test::Unit::TestRunner); sub start_suite { my $self = shift; $self->SUPER::start_suite(@_); $self->_update_status; } sub end_suite { my $self = shift; $self->SUPER::end_suite(@_); $self->_update_status; } sub start_test { my $self = shift; my ($test) = @_; $self->{_last_test} = $test->name; $self->_update_status; } sub end_test { my $self = shift; my ($test) = @_; $self->{_last_test} = ''; $self->_update_status; } sub add_error { my $self = shift; my ($test, $exception) = @_; $self->_update_status; } sub add_failure { my $self = shift; my ($test, $exception) = @_; $self->_update_status; } sub add_pass { my $self = shift; my ($test) = @_; $self->_update_status; } sub _update_status { my $self = shift; my $result = $self->result; # \e[2A goes two lines up # \e[K clears to end of line # \e[J clears below # \e7 saves cursor position # \e8 restores cursor position my $template = <_print( sprintf $template, $result->run_count, $result->failure_count, $result->error_count, join(' -> ', map { $_->name || '?' } $self->suites_running), $self->{_last_test} || '', ); } sub print_result { my $self = shift; $self->_print("\e[J"); # clear status lines below $self->SUPER::print_result(@_); } 1; __END__ =head1 NAME Test::Unit::Runner::Terminal - unit testing framework helper class =head1 SYNOPSIS use Test::Unit::Runner::Terminal; my $testrunner = Test::Unit::Runner::Terminal->new(); $testrunner->start($my_test_class); =head1 DESCRIPTION This class is a test runner for the command line style use of the testing framework. It is similar to its parent class, Test::Unit::TestRunner, but it uses terminal escape sequences to continually update a more informative status report as the runner progresses through the tests than just a string of dots, E's and F's. The status report indicates the number of tests run, the number of failures and errors encountered, which test is currently being run, and where it lives in the suite hierarchy. The class needs one argument, which is the name of the class encapsulating the tests to be run. =head1 OPTIONS =over 4 =item -wait wait for user confirmation between tests =item -v version info =back =head1 AUTHOR Copyright (c) 2000-2002, 2005 the PerlUnit Development Team (see L or the F file included in this distribution). All rights reserved. This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. =head1 SEE ALSO =over 4 =item * L =item * L =item * L =item * L =item * L =item * For further examples, take a look at the framework self test collection (t::tlib::AllTests). =back =cut Test-Unit-0.25/lib/Test/Unit/Listener.pm0000644000175000017500000000401210273475545020162 0ustar mca1001mca100100000000000000package Test::Unit::Listener; use Test::Unit::Loader; use Carp; use strict; sub new { my $class = shift; croak "call to abstract constructor ${class}::new"; } sub start_suite { my $self = shift; my $class = ref($self); my ($suite) = @_; croak "call to abstract method ${class}::start_suite"; } sub start_test { my $self = shift; my $class = ref($self); my ($test) = @_; croak "call to abstract method ${class}::start_test"; } sub add_error { my $self = shift; my $class = ref($self); my ($test, $exception) = @_; croak "call to abstract method ${class}::add_error"; } sub add_failure { my $self = shift; my $class = ref($self); my ($test, $exception) = @_; croak "call to abstract method ${class}::add_failure"; } sub end_test { my $self = shift; my $class = ref($self); my ($test) = @_; croak "call to abstract method ${class}::end_test"; } 1; __END__ =head1 NAME Test::Unit::Listener - unit testing framework abstract base class =head1 SYNOPSIS This class is not intended to be used directly =head1 DESCRIPTION This class is used by the framework to define the interface of a test listener. It is an abstract base class implemented by the test runners. Due to the nature of the Perl OO implementation, this class is not really needed, but rather serves as documentation of the interface. Each of the add_ methods gets two arguments: C and C. The test is a Test::Unit::Test and the exception is a Test::Unit::Exception. Typically you want to display Cname()> and keep the rest as details. =head1 AUTHOR Copyright (c) 2000-2002, 2005 the PerlUnit Development Team (see L or the F file included in this distribution). All rights reserved. This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. =head1 SEE ALSO =over 4 =item * L =item * L =item * L =back =cut Test-Unit-0.25/lib/Test/Unit/Procedural.pm0000644000175000017500000001337410273475545020510 0ustar mca1001mca100100000000000000package Test::Unit::Procedural; use strict; use Test::Unit::TestSuite; use Test::Unit::TestRunner; use base 'Exporter'; use vars qw(@EXPORT); @EXPORT = qw(assert create_suite run_suite add_suite); # Helper classes use Devel::Symdump; use Class::Inner; # Exception handling use Error qw/:try/; use Test::Unit::Exception; use Test::Unit::Failure; # private my $test_suite = Test::Unit::TestSuite->empty_new("Test::Unit"); my %suites = (); %suites = ('Test::Unit' => $test_suite); sub add_to_suites { my $suite_holder = shift; if (not exists $suites{$suite_holder}) { my $test_suite = Test::Unit::TestSuite->empty_new($suite_holder); $suites{$suite_holder} = $test_suite; } } # public sub assert ($;$) { my($condition, $message) = @_; my($asserter,$file,$line) = caller(1); add_to_suites($asserter); try { $suites{$asserter}->assert($condition, $message); } catch Test::Unit::Exception with { my $e = shift; $e->throw_new( -package => $asserter, -file => $file, -line => $line); } } sub create_suite { my ($test_package_name) = @_; $test_package_name = caller() unless defined($test_package_name); add_to_suites($test_package_name); no strict 'refs'; my $set_up_func = sub {}; my $tear_down_func = sub {}; my $st = Devel::Symdump->new($test_package_name); my @set_up_candidates = grep /::set_up$/, $st->functions; $set_up_func = \&{$set_up_candidates[0]} if @set_up_candidates; my @tear_down_candidates = grep /::tear_down$/, $st->functions; $tear_down_func = \&{$tear_down_candidates[0]} if @tear_down_candidates; for my $test_method (grep /::test[^:]*$/, $st->functions) { my($method_name) = $test_method =~ /::(test[^:]*)/; my $subref = \&{$test_method}; my $test_case = Class::Inner->new (parent => 'Test::Unit::TestCase', methods => {set_up => $set_up_func, tear_down => $tear_down_func, $method_name => $subref, }, args => [$method_name],); $suites{$test_package_name}->add_test($test_case); } } sub run_suite { my ($test_package_name, $filehandle) = @_; $test_package_name = caller() unless defined($test_package_name); my $test_runner = Test::Unit::TestRunner->new($filehandle); $test_runner->do_run($suites{$test_package_name}); } sub add_suite { my ($to_be_added, $to_add_to) = @_; $to_add_to = caller() unless defined($to_add_to); die "Error: no suite '$to_be_added'" unless exists $suites{$to_be_added}; die "Error: no suite '$to_add_to'" unless exists $suites{$to_add_to}; $suites{$to_add_to}->add_test($suites{$to_be_added}); } 1; __END__ =head1 NAME Test::Unit::Procedural - Procedural style unit testing interface =head1 SYNOPSIS use Test::Unit::Procedural; # your code to be tested goes here sub foo { return 23 }; sub bar { return 42 }; # define tests sub test_foo { assert(foo() == 23, "Your message here"); } sub test_bar { assert(bar() == 42, "I will be printed if this fails"); } # set_up and tear_down are used to # prepare and release resources need for testing sub set_up { print "hello world\n"; } sub tear_down { print "leaving world again\n"; } # run your test create_suite(); run_suite(); =head1 DESCRIPTION Test::Unit::Procedural is the procedural style interface to a sophisticated unit testing framework for Perl that is derived from the JUnit testing framework for Java by Kent Beck and Erich Gamma. While this framework is originally intended to support unit testing in an object-oriented development paradigm (with support for inheritance of tests etc.), Test::Unit::Procedural is intended to provide a simpler interface to the framework that is more suitable for use in a scripting style environment. Therefore, Test::Unit::Procedural does not provide much support for an object-oriented approach to unit testing - if you want that, please have a look at L. You test a given unit (a script, a module, whatever) by using Test::Unit::Procedural, which exports the following routines into your namespace: =over 4 =item assert() used to assert that a boolean condition is true =item create_suite() used to create a test suite consisting of all methods with a name prefix of C =item run_suite() runs the test suite (text output) =item add_suite() used to add test suites to each other =back For convenience, C will automatically build a test suite for a given package. This will build a test case for each subroutine in the package given that has a name starting with C and pack them all together into one TestSuite object for easy testing. If you dont give a package name to C, the current package is taken as default. Test output is one status line (a "." for every successful test run, or an "F" for any failed test run, to indicate progress), one result line ("OK" or "!!!FAILURES!!!"), and possibly many lines reporting detailed error messages for any failed tests. Please remember, Test::Unit::Procedural is intended to be a simple and convenient interface. If you need more functionality, take the object-oriented approach outlined in L. =head1 AUTHOR Copyright (c) 2000-2002, 2005 the PerlUnit Development Team (see L or the F file included in this distribution). All rights reserved. This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. =head1 SEE ALSO =over 4 =item * L =item * the procedural style examples in the examples directory =back =cut Test-Unit-0.25/lib/Test/Unit/Result.pm0000644000175000017500000001266210273475545017665 0ustar mca1001mca100100000000000000package Test::Unit::Result; use strict; use Test::Unit::Debug qw(debug); use Test::Unit::Error; use Test::Unit::Failure; use Error qw/:try/; sub new { my $class = shift; bless { _Failures => [], _Errors => [], _Listeners => [], _Run_tests => 0, _Stop => 0, }, $class; } sub tell_listeners { my $self = shift; my $method = shift; foreach (@{$self->listeners}) { $_->$method(@_); } } sub add_error { my $self = shift; debug($self . "::add_error() called\n"); my ($test, $exception) = @_; $exception->{-object} = $test; push @{$self->errors()}, $exception; $self->tell_listeners(add_error => @_); } sub add_failure { my $self = shift; debug($self . "::add_failure() called\n"); my ($test, $exception) = @_; $exception->{-object} = $test; push @{$self->failures()}, $exception; $self->tell_listeners(add_failure => @_); } sub add_pass { my $self = shift; debug($self . "::add_pass() called\n"); my ($test) = @_; $self->tell_listeners(add_pass => @_); } sub add_listener { my $self = shift; debug($self . "::add_listener() called\n"); my ($listener) = @_; push @{$self->listeners()}, $listener; } sub listeners { my $self = shift; return $self->{_Listeners}; } sub end_test { my $self = shift; my ($test) = @_; $self->tell_listeners(end_test => $test); } sub error_count { my $self = shift; return scalar @{$self->{_Errors}}; } sub errors { my $self = shift; return $self->{_Errors}; } sub failure_count { my $self = shift; return scalar @{$self->{_Failures}}; } sub failures { my $self = shift; return $self->{_Failures}; } sub run { my $self = shift; my ($test) = @_; debug(sprintf "%s::run(%s) called\n", $self, $test->name()); $self->start_test($test); # This closure may look convoluted, but it allows Test::Unit::Setup # to work cleanly. $self->run_protected( $test, sub { $test->run_bare() ? $self->add_pass($test) : $self->add_failure($test); } ); $self->end_test($test); } sub run_protected { my $self = shift; my $test = shift; my $protectable = shift; debug("$self\::run_protected($test, $protectable) called\n"); try { &$protectable(); } catch Test::Unit::Failure with { $self->add_failure($test, shift); } catch Error with { # *Any* exception which isn't a failure or # Test::Unit::Exception should get rebuilt and added to the # result as a Test::Unit::Error, so that the stringify() # method can be called on it for nice reporting. my $error = shift; $error = Test::Unit::Error->make_new_from_error($error) unless $error->isa('Test::Unit::Exception'); $self->add_error($test, $error); }; } sub run_count { my $self = shift; return $self->{_Run_tests}; } sub run_count_inc { my $self = shift; ++$self->{_Run_tests}; return $self->{_Run_tests}; } sub should_stop { my $self = shift; return $self->{_Stop}; } sub start_test { my $self = shift; my ($test) = @_; $self->run_count_inc(); $self->tell_listeners(start_test => $test); } sub stop { my $self = shift; $self->{_Stop} = 1; } sub was_successful { my $self = shift; return ($self->failure_count() == 0) && ($self->error_count() == 0); } sub to_string { my $self = shift; my $class = ref($self); debug($class . "::to_string() called\n"); } 1; __END__ =head1 NAME Test::Unit::Result - unit testing framework helper class =head1 SYNOPSIS This class is not intended to be used directly =head1 DESCRIPTION This class is used by the framework to record the results of tests, which will throw an instance of a subclass of Test::Unit::Exception in case of errors or failures. To achieve this, this class gets called with a test case as argument. It will call this test case's run method back and catch any exceptions thrown. It could be argued that Test::Unit::Result is the heart of the PerlUnit framework, since TestCase classes vary, and you can use one of several Test::Unit::TestRunners, but we always gather the results in a Test::Unit::Result object. This is the quintessential call tree of the communication needed to record the results of a given test: $aTestCase->run() { # creates result $aTestResult->run($aTestCase) { # catches exception and records it $aTestCase->run_bare() { # runs test method inside eval $aTestCase->run_test() { # calls method $aTestCase->name() # and propagates exception # method will call Assert::assert() # to cause failure if test fails on # test assertion # it finds this because $aTestCase is-a Assert } } } } Note too that, in the presence of Test::Unit::TestSuites, this call tree can get a little more convoluted, but if you bear the above in mind it should be apparent what's going on. =head1 AUTHOR Copyright (c) 2000-2002, 2005 the PerlUnit Development Team (see L or the F file included in this distribution). All rights reserved. This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. =head1 SEE ALSO =over 4 =item * L =item * L =item * L =back =cut Test-Unit-0.25/lib/Test/Unit/Failure.pm0000644000175000017500000000154410273475545017773 0ustar mca1001mca100100000000000000package Test::Unit::Failure; use strict; use base qw(Test::Unit::Exception); 1; __END__ =head1 NAME Test::Unit::Failure - unit testing framework exception class =head1 SYNOPSIS This class is not intended to be used directly =head1 DESCRIPTION This class is used by the framework to communicate the result of assertions, which will throw an instance of this class in case of failures (that is, failed tests, not syntax errors and the like, these are classified as errors). =head1 AUTHOR Copyright (c) 2000-2002, 2005 the PerlUnit Development Team (see L or the F file included in this distribution). All rights reserved. This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. =head1 SEE ALSO =over 4 =item * L =item * L =back =cut Test-Unit-0.25/lib/Test/Unit/Warning.pm0000644000175000017500000000141710273475542020005 0ustar mca1001mca100100000000000000package Test::Unit::Warning; use strict; use base 'Test::Unit::TestCase'; =head1 NAME Test::Unit::Warning - helper TestCase for adding warnings to a suite =head1 DESCRIPTION Used by L and others to provide messages that come up when the suite runs. =cut sub run_test { my $self = shift; $self->fail($self->{_message}); } sub new { my $class = shift; my $self = $class->SUPER::new('warning'); $self->{_message} = shift; return $self; } 1; =head1 AUTHOR Copyright (c) 2000-2002, 2005 the PerlUnit Development Team (see L or the F file included in this distribution). All rights reserved. This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. =cut Test-Unit-0.25/lib/Test/Unit.pm0000644000175000017500000000625310324274167016400 0ustar mca1001mca100100000000000000=head1 NAME Test::Unit - the PerlUnit testing framework =head1 SYNOPSIS This package provides only the project version number, copyright texts, and a framework overview in POD format. =head1 DESCRIPTION This framework is intended to support unit testing in an object-oriented development paradigm (with support for inheritance of tests etc.) and is derived from the JUnit testing framework for Java by Kent Beck and Erich Gamma. To start learning how to use this framework, see L and L. (There will also eventually be a tutorial in L. However C is the procedural style interface to a sophisticated unit testing framework for Perl that . Test::Unit is intended to provide a simpler interface to the framework that is more suitable for use in a scripting style environment. Therefore, Test::Unit does not provide much support for an object-oriented approach to unit testing. =head1 COPYRIGHT Copyright (c) 2000-2002, 2005 the PerlUnit Development Team (see the F file included in this distribution). All rights reserved. This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. That is, under the terms of either of: =over 4 =item * The GNU General Public License as published by the Free Software Foundation; either version 1, or (at your option) any later version. The text of version 2 is included in the PerlUnit distribution package as F. =item * The "Artistic License" which comes with Perl. The text of this is included in the PerlUnit distribution package as F. =back =head1 SEE ALSO =over 4 =item * L =item * L =item * L =back =head1 FEEDBACK The Perl Unit development team are humans. In part we develop stuff because it scratches our collective itch but we'd also really like to know if it scratches yours. Please subscribe to the perlunit-users mailing list at L and let us know what you love and hate about PerlUnit and what else you want to do with it. =cut package Test::Unit; use strict; use vars qw($VERSION); # NOTE: this version number has to be kept in sync with the # number in the distribution file name (the distribution file # is the tarball for CPAN release) because the CPAN module # decides to fetch the tarball by looking at the version of # this module if you say "install Test::Unit" in the CPAN # shell. "make tardist" should do this automatically. BEGIN { $VERSION = '0.25'; } # Constants for notices displayed to the user: use constant COPYRIGHT_SHORT => < <<'END_COPYRIGHT_NOTICE'; This is PerlUnit version $Test::Unit::VERSION. Copyright (C) 2000-2002, 2005 Christian Lemburg, Brian Ewins, et. al. PerlUnit is a Unit Testing framework based on JUnit. See http://c2.com/cgi/wiki?TestingFrameworks PerlUnit is free software, redistributable under the same terms as Perl. END_COPYRIGHT_NOTICE 1; __END__ Test-Unit-0.25/examples/0000755000175000017500000000000010324277074015246 5ustar mca1001mca100100000000000000Test-Unit-0.25/examples/patch100132-10000644000175000017500000000153107400722057017072 0ustar mca1001mca100100000000000000#!/usr/bin/perl -w use strict; use Experimental::Sample; use Test::Unit::Procedural; use constant DEBUG => 0; # code to be tested will be somewhere around here # define tests, set_up and tear_down sub test_ok_1 { assert(23 == 23); } sub test_ok_2 { assert(42 == 42); } sub test_ok_3 { my $sample = new Experimental::Sample(); $sample->name( 'Joe' ); assert( 'Joe' eq $sample->name() ); } sub set_up { print "hello world\n" if DEBUG; } sub tear_down { print "leaving world again\n" if DEBUG; } # and run them # This will not work, as the test methods were # defined in package main: # # create_suite( 'Experimental::Sample' ); # run_suite(); # # We need to create the default suite # (created from package main) to pick # our test methods up - they just use the # methods in Experimental::Sample ... create_suite(); run_suite(); Test-Unit-0.25/examples/patch1001320000644000175000017500000000113207400722057016731 0ustar mca1001mca100100000000000000#!/usr/bin/perl -w use strict; use Experimental::Sample; use Test::Unit::Procedural; use constant DEBUG => 0; # code to be tested will be somewhere around here # define tests, set_up and tear_down sub test_ok_1 { assert(23 == 23); } sub test_ok_2 { assert(42 == 42); } sub test_ok_3 { my $sample = new Experimental::Sample(); $sample->name( 'Joe' ); assert( 'Joe' eq $sample->name() ); } sub set_up { print "hello world\n" if DEBUG; } sub tear_down { print "leaving world again\n" if DEBUG; } # and run them create_suite( 'Experimental::Sample' ); create_suite; run_suite(); Test-Unit-0.25/examples/patch100132-20000644000175000017500000000250607400722057017076 0ustar mca1001mca100100000000000000#!/usr/bin/perl -w use strict; use Experimental::Sample; use Test::Unit::Procedural; use constant DEBUG => 0; # code to be tested will be somewhere around here # define tests, set_up and tear_down sub test_ok_1 { assert(23 == 23); } sub test_ok_2 { assert(42 == 42); } sub test_ok_3 { my $sample = new Experimental::Sample(); $sample->name( 'Joe' ); assert( 'Joe' eq $sample->name() ); } sub set_up { print "hello world\n" if DEBUG; } sub tear_down { print "leaving world again\n" if DEBUG; } # and run them # This will not work, as the test methods were # defined in package main: # # create_suite( 'Experimental::Sample' ); # run_suite(); # # We need to create the default suite to pick # our test methods up - they just use the # methods in Experimental::Sample ... # # The other way is to define the tests in # package Experimental::Sample itself. # Then we can proceed as indicated above, # but we obviously need to run the suite # we created, not the default suite: sub Experimental::Sample::test_ok_1 { assert(23 == 23); } sub Experimental::Sample::test_ok_2 { assert(42 == 42); } sub Experimental::Sample::test_ok_3 { my $sample = new Experimental::Sample(); $sample->name( 'Joe' ); assert( 'Joe' eq $sample->name() ); } create_suite( 'Experimental::Sample' ); run_suite( 'Experimental::Sample' ); Test-Unit-0.25/examples/fail_example.pm0000644000175000017500000000237007403166624020236 0ustar mca1001mca100100000000000000package fail_example; # this is the test case to be decorated use strict; use Test::Unit::Debug qw(debug debugged); use Test::Unit::TestSuite; use base qw(Test::Unit::TestCase); sub test_ok { my $self = shift(); $self->assert(23 == 23); } sub test_fail { my $self = shift(); $DB::single = $DB::single; # avoid 'used only once' warning $DB::single = 1 if debugged(); #this breaks into the debugger $self->assert(scalar "born" =~ /loose/, "Born to lose ..."); } sub set_up { my $self = shift()->SUPER::set_up(@_); debug("hello world\n"); } sub tear_down { my $self = shift(); debug("leaving world again\n"); $self->SUPER::tear_down(@_); } sub suite { my $testsuite = Test::Unit::TestSuite->new(__PACKAGE__); my $wrapper = fail_example_testsuite_setup->new($testsuite); return $wrapper; } 1; package fail_example_testsuite_setup; # this suite will decorate fail_example with additional fixture use strict; use Test::Unit::Debug qw(debug); use base qw(Test::Unit::Setup); sub set_up { my $self = shift()->SUPER::set_up(@_); debug("fail_example_testsuite_setup\n"); } sub tear_down { my $self = shift(); debug("fail_example_testsuite_tear_down\n"); $self->SUPER::tear_down(@_); } 1; Test-Unit-0.25/examples/Experimental/0000755000175000017500000000000010324277074017703 5ustar mca1001mca100100000000000000Test-Unit-0.25/examples/Experimental/Sample.pm0000644000175000017500000000070607105243406021460 0ustar mca1001mca100100000000000000package Experimental::Sample; use strict; use vars qw($VERSION @ISA @EXPORT $SIGNPOST $test_suite); require Exporter; @ISA = qw(Exporter); sub new { my $pkg = shift; my $self = { @_ }; bless($self, $pkg); return $self; } # object methods - public sub name { my ( $self, $name ) = @_; if( defined( $name ) ){ $self->{name} = $name; } return $self->{name}; } 1; __END__ Test-Unit-0.25/examples/tester.png0000644000175000017500000015132610273172335017267 0ustar mca1001mca100100000000000000‰PNG  IHDR°ŠJÇÿ* pHYs  ÒÝ~ütIMEÕ6¸æâŸ IDATxÚì½y´$Ù]ßùûÞŒª–‹]lب$8c ÂøXnšÉ6Ë1S0„°Ø0˜6Æ-V@íñҘ†;L#–þYU ­­¥Þ«»ê½ŒøÍqãîq#3ß«W™ßÏé%_fÄ‘‘ñ[îoÞýI""‰Áð®N[ ›©·•ÿN¿B!¢Åô‰&c¥"ÎöÁøÉ ©ñsÉ9m2Túó¹] Û£¼™&¶×Ò¾ã}Ëš¹㥇@7˜OþíòUJÝ'DEE€ˆ¨ßžº;ÆÃÑÿ¥…»/túÓý±¨ ÿÛ?w)^w{†Éý«î¥¹}ü9ÅŸ-½ ‰†ÒE·Jùù_Dùw™} Ìý¨Æ!ÑsÒ5ÒUH˜ø”ì½P>©øI¥ù[i_Ù~W[šù¹iêa#'}›²6 Ñ$´êF´`úZxN©(Ò—ÁßEíCEƒÛ?ýÖìס%ù¹T®ë¦3Ø™T>ºuþÖªü=ªÌXkέrß6Sž·x2¢Bž.ÓéUDŒh#]#]#*¢DLQ©ZªláŒJSÊø]^ÊøÁ)_åfR‰‘}¨!oÃ…ú3¢'5âsÒ™ç’æ¬s­»!7}„e§Uc%l÷¨×ùƒèV¾hÒúñŽ`ÁãXK†>:{áÔ.b3™þº­PW4óÈÖü‰—Ũ *Ê8¨oò‡RwxäcÖ5 ÓóâºvÓ“Ãâû›ÙŨ~ºfì¿’R•zÀôÔÿ¸‘öþØ 5ÍYä:/e ©¥¤WI%p$ ûB½‹¡YýIË3ö®º¿š’n¡iUi Ç€T­hþÙõCÛ ù­¤•ï ä<Š ôŠ¥SׄDäœtç¥5ƒ* ‘2©)_SËgR„“ÓV NNÏX ¤å«j NP5¼/P”SV*«k‰"i Ö FDÒ⨮À¯MK‹­œÈðmÕÊ»Í]ú®RE£§žëyµ6M &D:_ùÇ¡£m?˜Ýк•÷,ÔõyJnÆOX'Ü7þ·‡1dÀªºA؈N,´˜«%ãx‡!‰ËÙ\ËɨžZ·}:÷·öJÒ“v%ŠÁ3I«©gÌ:Æš&µ\Oý û£%Ìz0ü*Ò "¿8Þ,¹¦ˆ 8dÍ/_l9¶ä_@LÓÄÂÆœÜô~´ÈMz{kiÉ·^+ Pý[þÛÁÌ3Q’5ú•Föwr™@ÕqÃkÖAU¹£ "eÎ{‘ÝŸ—ÿ@âýT3× KžL;yl!õ[,~ص±rJâ»ÛX€3$“•N¤“~j×u*ÚuÓdÀÀ0ý€1áOÒ9§á¢æ¯U|" \ëVû×Á™Àpšã¥ÿOOû‰u*ÒuÝpÞ^¸* 0ξöd ÃÚYÕ|¡Ó…N úÓu°‡OËýNEÄÞKÓ5ìÁø‘·°ÑãÝpúÁUMžHF«„ýùüà+~l7O½Eá°‹FD”~¤kšQ¢4éþH$PIFÛ ãSšâJä¼hƒ5†¡´*B©ðÅ1¼®ôEž¨Êƒ½v)‹›Ð¸?-Úà×>zð‘«?òh{ÜAq|´î¤ÓVÌ ѵ®nY]¿~´Z™ûîyø¾7?ôÔ§>Ñn¿îZU•nüyv¶äÀðlÕð‹ûÐwƽ(ÔuŒˆÌø¬Ñî^ÚŠ¨j'Ó¡£'²{@Ò#ú#zÀÑ`ñˆLn€J?®SíEjTDT`D¬Ä˜À˜þÂŽ6ïÈZu-Úz A/áFU±›ûIg­‚ÒI/Ô:éìéO×ÙXu yÐõD´ŸR'Ú‰vje$F)<Œ0LRÄ ŒŒ£ÄgÝõº€H;Ü?:)0®ªaUqU{ÌIäÛwŒ ÿÀ"}Ùb]*Tªú/ºŸ^§Ò‰Êt«£Ðõ?ØQùñTûó™3„‹S³û¶Z HÀГ}ÒiÑ»ŸÈŒ.šVŸ»9/Ý9éŒ}`¹JÕ PUY`×nù] Bx±ÃÜâ)GSš.ø±æµ±Æ. `T¯s?˜‡yô®>pÏÃëu àúµcUéÚnµ2"ÒuݹóÍñÑZŒÜóÆûß|÷}îöíºÓN§GµŒÖ³ó¨…bzÜ2ý\î¥Ò f˜É®mÈñqÜ©µPÝ(vM:;­„qV»rJI #a™Düb2Ú©¶½ =­hÛ¹Vs¯pcVƬŒ1+˜•1Í$ºNµíºNÛ¶ëÿÑNûAGÍh``5N©×RµdPÅ:÷/B­,UíœëÓë+®c`5fY« ›ô){‡“í4étéõžÑ/¬` °JˆâþruÃ…SUµ^7~[“*aã-ò«&ÔW[ÁtŒ*BÒ]k “ÇÂ9eíÆÉ^Žh:ƒSdT°¦i?Ÿê'66>‹3«lšZŒÁÆãcɃ=3¨ÁROÝ„ìCIo‘î¼t‚.W:%{=uGòHÏ‚ Ô-£3ä†,"Ô¸Ô »9<3+ÐàÖ]»>j¯©Š³>nE¥m»þ±Øµ Óö6\Ûv]§îö];¬/„b~$ ßúšLC ú^”´ÐÖ{¤êh‘Ú èÀ%0 Q89ã cN$Ø·×Z\/EÿX7®u»RWXÚ•í´kˆtÚ‰Sbþ:w·ÚGÓ麮í¥ãð?büW @•QH7JkÁ(¥ÛÞ©`¯ŽäÖOtP¨´÷„žàQ_2ºÐ¥o¯ó({oïSéÕ'»Ükn€v‘¨Dh«ƒ:ÕW/tä _ ``P÷½œî/û设Ç^›5 "㜠|íE7K«ÚÞ‘IšÖ8úÀH¸JåpqúïݽùÇŸO ÏÇÝ`s§ÁÌCÇŽ[ÔI쩤”[Ÿ—:ÚÄDq 6¢}A1hcVñÁ©HÌí#V7KÜLùŒ´r¥ÁðØi<ä!/+ÌÜ|Mnãø×·–v}Ô®¯µªbVº>nE¤[w½¯¾]·€´]'Ò?Ñ:wûÞÅ=ÅŒÂf0ß÷iZD©cÂbºÁ;ƒBJ¦ÑÕìØøƒ9›òÖT]V¶ [bT\0­uF«7-,{U©ëºá tÞ:=àe³«ét5ˆ®±@ï 6ûµë…MשZ¿½éŒ¢†j½.2(ƒã]úÅ kÂÂÞYív/xàJ±¼ë½f¼àãV“$Ü!ÃêFU ÿ¶ÔŒ@Ô ßŸÁà´hC¼¨tm×µ]×ëRj‚¡¬eÿšÄÀT¡Âòëj?£ƒªw~èäü0ãéLSºq}DÚñ E*¼¿|ãUítZ‚qï¥>ftP@¡ôß  Q ý„¢ÿùdŸS‹¢Çq2¤´„eZäݘ‹\¡ñ8›=Ðû±ôœt+éQ*(¨ã'$Pàòjݱu‹ùéfÛo¯þ !²èÛÜøk8ÀeuÌÛý«î¨;>^÷aƒ®… ë`Щ¶ëh{aµ>j×]ën¯ºë÷±Ýï™’Hxe TºáÑßú&‘ªH7èNÀþêþ¿2>£'¹ë¸;_+0¬‡yPt ¨í'Ç $¤¼Þž¯"˜Õ€Â(ÐNåΜIÓ_åÔ•ñÝ´ 0F0¸êÒ´ƒ¯YOÉh+] ÷Dl¬@×Y±8)=€YÓÇeu˜½;¶v®°Q£eïêyáEëõ Ë¡Ÿi¸ÙºÉ»Ð9ªº(¼Àº &-pŠ^A*ºÀY/C(4¼sd,e«ªè†`—Nc©/öç3co"þ±Å³YU µCÅÃX§¨‚4×Ù‹³i˜?w(TW¢h#­ ½ÿH›¸¹Úˆºë§4$ëª5Õ5—:4ZñWj{ NÍgû„¥K ÚˆŸo¨©6ý[Çíz}Ô®ZmUn‘õºí|½°^·€¬×­ª¯»uçm9Y'yäkcØ—Ùxø¤yNAl …ÀFïUcãËá-¾¿·K¨ªªc~àðœo!"?ûßneõkGs÷=?÷ ¿õ ¿ü;ƒ]: 9+-¼o⦴­ãˆ5Üé§^\øž?õ3¾Þ½x£xîƒþÕ]ðv‡ý…Ÿüù¸OúÊàÐU†ºA¿ßŸð/?õ™ÿàƒÞÿßñŽ×o¾ç¾W_þë»^õÇ¿óû—§“µ®r@ÚigèÌÏþè·‰È'}ú×Á@D~òåßÔÿ9xAº.P’÷Éà Qˆ ss ‚5 7IARaÃ‹Ö <d ¥´+;ð%Áä!pN{<÷q5L§Å&øž«Ùyö?ŸD#jzÄ>öTÖÉ-Va]é¬iŸ[ÖÔÓ~úCt¥]ï0³×k 0Ø"s©™Z{•tS°Þ¦¥5§¹ÔÜß•ד¾yö&ã^I”\éÖz|¼>::ëõzŠTiÛVׯ‰ÈzݶmçmŸ6ªJDö˜³Wzßœ N¾TÑuêŽo“åºÎ3F'Ç€Á”tçÏÊþùñŸüy§Ç?îyŸÿ)_öEÿòï¼ãÛ¿ìGA5\_wO­-€Š á$v&œÔmÏú2;È/ÿôw‰È'|ò à#H²ö*Å~ ¹~ýØA½Dt3)þñ‡}àøºÏ}ýß¼ù…/úáW_yý-·œûÐ~òg^üØÿ˜ÿèö哉l‹ Ùeþñâc Jo×=59º¶î'Õ/¢wÉ+â«Réµ”Þø–fî?áÐ:hÌRxïøé*é^N'™r¼s¼ÈVoÎ~#öçã„÷dŒ^©ôë&5à;ä7T*TZ½wö‘\Åòš$çUVhW¡W`#ŸÊIôýƒSkÙ–H1ÔL¯EÝPô«ÚÝH»é¹P° A”?lWA¯ØãvÝ^ïŽ×ƬÛõzXïWCÛ¶ÚÞC°^·]§îö9{7^;ˆ‚ÀÍž|°>Ö•‡'²ª+ŸlbB, G;"b TÝÂéÇÄññZUßø¦{¿ûû~ìOÿŸüÏnýÁùYqîl˜fŸ‰ooDwÔÀ„-Ñ;ÏëGlj&7‘/ô¢÷¬×m(&;O úÂÏû¤¦YÝþÂÿëoï¾GD®^½öKwþÞÿó¾âK.ºûfÔµA?ø¸OúÊø¼Ž×ë>“Â&Äâ9”âê™øÉ;ÇžuÒÝÍ–ìbÿ€«¤—iœØiÉÀOgˆÏwøùø ýù̇*Ej¦Wså“Ña¶_î¬3ùùŽòÒ@bk] #"+è-ÒB:Id`‰O*ièÇkóé¾^êÔ¿ÊUó…âZ\k˜MK‹Û1ëi‰Õø\6Ó¸1s^M †£à{ZK«Ýñq»Z) Úõ(ÓƒÞ¸éÖªtkmÛÖÝ>zþºuf‚„çU«ÁRDœä ¯%š­#®?y’‘ŽýòB—Q&÷hÝ¿¾ç­ˆÈ;¼ýcÖý¥üÍ_}©ˆ<ý¶ç “ýW~Ÿˆ<ý£Ÿ×ïûª_þ~ùÌϹã9Ÿý¬üá¸2æU¿õ§ßú/øê£A¶zŽãã¶—U}ì-ŸyñcŸùŒyÂ{¼óñÑñÿºüúþï?ÿ§þº~ªÿüŸþ1·}Øû?é yÌ-÷ÝÿПþùë^ù+¿ûË¿ò{¿õk/íÇù_ú>;æ?yæ¿qc6{ÞýÝ/"÷¼õþããµ}ÎC¾åE/³Ž„_ÿÅï‘øø/±_ܯýüKDä#?áKûKø«?÷ù¨g?@ïáñÖAž~Ûóó˜óÿú3>þ£žù¡OxÂ;­ÿüÕõ?ü³ô'¯I÷5¾%ñÃEC-ئ«øWÚqçØ–¡®/IÄÁ¸žáFÚŸOÛ5!ø«ˆÙå~á‹eå(pç*U9râåÝ›&áÛÑóÒ5ÚÁK—̾ðLŒ¯úl·nzIÌ©×Ý+ŽL©œ¸ Ór‹¥„ ÈùE‡S°õQ½tR_tâ&Y2¨ÇNâœT:éŽ×íqÛu€v=VÛƒ˜•Ѷó‚ò:u·ßa–Ü%‹sÚ*Þ “Ë{,‡I »ÞÛu“Ã7~ˆc\NkãÉ­Öýéÿ½'¿¯ˆüÙÿú«>îÒîÒu(\}t…=æó¾àS¾ÿ¿þ¿·ÿÇxîç<û9Ÿý¬«\»ã[þo§J`(WÜÙ¶Ç­ˆ<îqo÷ÒïúŠw÷wúßúC¿õ;þÞïù®ßøõÏyñ·|ñ—~ÕKþøOÿòÓ?ícž÷ùŸüÓ?÷ªoüæzË=÷ÐSžôÏýßô Ïýù_øí§=ýóïUÿ§ˆ|è?y®·ìiAúg¯ûþ€¯yþgü·úé×¾î]×9^qô1ÔÚ.¸bã;“OEDnýØ/¾ë•ß+"Oÿ¨ç 5$DÞáíû_¾ïïñnïô¾éë·ÿì½Þë]^ø Ÿÿ½ßùü/þòïúƒ?z{úAñÁtÆŠW|*mŠ b¡³ÒÄätÖ„‡ _ÿ±àG BX¶{ÎÕ N>Ú°ýÃ4x|`¹ì/¯—TÔ:HÔQ#zN:'rpaCÈœžMŠ r•¸ wÔPAû˸¥¸Ó‡Cçt–L0 ‚a7«™àôêï†+ºýí§»ÛlWêÔM¥d<Þ/Çèºn½nMgºU×;6û'¤³|:=×Üícy[ØãŸ]Î1°A»€ØXŒ­4»d+Cè@¿ÂÐM âWêµ@Þ÷}Þãk¾ò3®^}ôÛ¿óÿé]èÆ+A„õ}ÉW|wÛvªúò}ås>ûYñO?ØÚýnèæ_º~¨Ïù¬O|ÿ÷{ÏoýΗßyçˆÈk^s÷‹_òcßÿ’/ÿœÏüÄ/ýÊ—<糞%"/þžÿqõ꣪ú»¿ÿêßû¢W¿àùŸîjl]§vIŘþ(“wPU_ø­?ü¢oyÞGßö´¾íiW¹öº×½á5¯½ûþø5¿òkðè£×ûèÁa¨u¨ôïØi_÷ìàõqk—žóÙÏú{ï÷žßò¢—ÿêÿüùË×¾á;¿çÒK_òÏùìgÑó¿+yçø®¤V”´~¨A™‘Eú  «y “eð¤|~œAJNÆh£Fj.·*P¿ôÞ ´Ê ,k¿P½Ý∾v‚v5œ©] Ò”Ü-ìkÊã>/4³´Z,ˆÏu긶tlM[ñê¹Háw³EŨM‘ ×^tÇRx¾Ö–Vg4œõV 7R!Èù†^ôÍß|ÿ?úèõ·Ü}_'ª­¬×-Э³^·}YVÙÕŠ!:ÏÙÞ Ed‹ xOíäAh J•_! K­Vh×¥×}U[9 ñs‹ñýþoþ·þÅ[ßöÀ'ÿïÿî oxÛ¦ÞYƒ~ýƒÞDžäñºó-o¹ODþîß}‡ö¸íÓþŒ1ª0ƈhòöšÄG}䇊È/¼òwú‘üáÿ…ˆ|ÐSŸtt´~í_½áŸò¤o{áüä+~ýÕW^ÿׯÓñq÷Mßö#¾bÑY£ëüòþª"òÚ×½áÓ>ãßØÓžò´øäøûïý¤'¾Ç¿xö­ŸüÏŸñe_ôi/øÚïÿÃ?~^RœïÑѱ{èããµý«?‘_üåßé "òÇò—ý‰Øasya‰H<»:èbàºC„âªVf;rw¦¯êý|^|û×\}ôÚ£×®uë¡óÅ”À`zª“L‚¢nֺǜæÞŸHߤW|Çg¨Ž%­ ¶Ö‚=ôX”R [šÂ;î ½¬ÔÐèzåÀ‡Ô>8±ÚK²¡8´á±Cçè2ìÓCúZXCmLcc[C/ã°\Ø%*lŽWÊ- ?ˆ]/mÙÏ©"û¸R[ÖLkUcuQ{%o¨s÷Ž•:Õ¯á {=ý {Wcº$4Æ"1ÃwÝ9Eä$ázSí¦ön}O;Ýßi˜òtüÌÞáË4¤>Öh\} œ×¶ÈG'Î/Âu:«wéõÚÕ„ ¸ïêƒo»úá·>Õ »ŸùåŸ8h… §„ÝsÏýwÿõ[¯?rôº¿xã‡üÓèÖ]_·x½n×Ç­ªÂ@TÚQs\5@_Y¥ÕÖnß— pea\™Î3¤Ô»GÇŸ‰[ÀVÎMO![¡|‡€¨Ñé7ä¹ÄV°7ßS?ø_k§ßðõŸóé?ú#oý‡?òò_쯦½è}f¦;N/ÛìëõP¸Å [íÐÁt]×'G䔪>œó]ÞùEäΟIðéÛ½ÝcŽ×ÏÁzþÚG<ãƒÿÑÓž""ׯýúoüÉ‹^ü£wß}ÏtjÚrF›\¬m»Wý柼ê7ÿ¤ÿ ÿøÇ}íWý«OøØÿÚ¯þWŸzñëu§ œ(ׯ»9úG×ÖÞ)µö|—wÉžH9tÑU¹\r2Ü;Éx$˜˜u;eoÚl}¬C…¢á©H×Áþ|î½ï¡ûî{è¾{ì:íÚnXLÑIÆ;í¡{/Ž+tmµ( âÉ ÛSË“”*N±QWîœ'nìº åDBiHöžèu¢Q/™ä–L¤½ Ö}¬äîÔË鵇}ŒÁʘÕÊ >6ã}wÍq[zYè^#³‚iF}ÂâÔù¶—krDõª¢"¿ R «ôU+üÆ.î'p>MÔ1QÖ˜i¸¡’Øj¬í[bÙUŽV4FS vuÖiM<ç„Nìa°3¼s·•Nœ«QZ)*Ó;ê sqR7šLÙÝ“6o¦%ž·¼ñ¾7ß}ÿû]x‚vr¨4±¯Ìqáõ¯yËŸÿÑëšfõÆ»ïýÀ«Ozø‘Gï¿÷a}»[}äºvŠÁ«¬½ÝÜ÷5¸úеãëÇׯÛísÞ×(& áb-,äl¸z… òH ¢#“[7H|ð«ªúo¿î¿<õ)Oüš¯úÌßýÝË¿ýÛ>y˜E¸ïá~|;Ö}o{ÈóÁû¯‚äû®Ìä7 C©ê½÷>ønïöø§þoŸõÐÃÄÛÜûÖÿó"cð¤'>á©Oyâ§~ÊG|üÇ~ø{>á?îY_i‡~àþ«Kã9î¿÷á|õ÷Â|øû¼×»ºgÔOÉÝ÷Þ·>è~¡÷Ýç¾û§=‘«\Û`(7í8„ ¾!gï¥\–AJ"foøB¢cÿóyÓÞö·¯¹ço^ÿ–œß"¯àNOdG(¹F$à5sÊ9áeʲ„ýØöqp¤xö©FùÛ9–ºkîÁqqÀéSi ’îF'TMÚÖОj”/é4µÔ%IçòHärìk7ë$ñHIåI…MGË«®¢¥¬«PP†OP¤FÕøöÏEX{²¨ö¼w‰ëì.›¼ÈS+µÐ˜ ½VSÒÍṯŠ1äþ{¾÷Þ‡\a'Ýfã„à Orø¦¼~òÀ}¿áoßf ®>ôèñ£ë«]{àþ‡{ïî#\Ÿ”²Pzá·>Z_;v·‡ó¸-+’w±V=£i™c£Å7eò—öÐCô|æg}ã]¿öýÿõ¥/xÆ3¿ø o|+€ûî{èñDxàa7ª ¿8Ó^ &øÐCØšº)¥dšÁý÷?,ª?õ3¯ú¼Ï}ömÏü—õþ ŸÇ¿à«¿¯ëôïû‹?üÿøÿ^q×›þö'ßç½ßí¡‘¼úwþÎÛ«ÊC]Í\'Õ—ýðí_ø¼ïxøê5÷³'¾ï»‹Èïýþ•¸Ú‹öÇ?þq"òÀWÇV‡ƒÎ”<ßþТòàøÎOÿÌ«žó¹Ïþ¨g~èËþû+gn˜-¾è ~Ê{åîÕþþçsõþGï½÷Á7þí[c¢l?bZ*c­¨ß@·¶GñÜŽ‹Ù[—™W¯Ðê4æšDªø-,ÃeyA538öh®Ii ZÔë཰†Bê„ã倭üœî^Zˆô;lðØ¬ž’fË´šöø%Ã7ʾXGrbmÿÿ‚/âú£G×=r…ÝùÇ$1²ñ#óu#vryORÙ0ïñþG©Ž'õÝßñíW~ôÑkGo»çï{á— !„²w|ÏËÜ »ýñ—mb¸o,­ÏLŠb:¨Ð&]}èÚ[ï{àôÇÃ’ IDAT‘«×Þô×÷ñŽ!„²ÜqÇÍ»¾^ØÕvç8ƒFÿ2… œÄñÐüí >rõÚÝ5Ä]¹r…w!„ýàÒ¥K"¾°sW¼ôG=ˆÓ5õ¦OV,Ö!PY¯Û£õ±vb³¿!„=#%ì2 œÒ!ûPºÀ$:›OyºèT‡4heûB!ûIZØùEKjA)OgŽ­z†ŒBêLì¤(ie mB!ä¦EýbÏpº|iR5@$ Q%°s%%QÔ?ä4\$¢#‘u•B!‡¡#8QSu]™™ìq)‰Fg¸ûA#…æXT!„&È¿«¾ŒO¶’€„[fô„SjÚ\©DJŠgk–„BÈixb Q¸É—ÿêÖ:-¶þ:Å}oOZ¯©=€Iž¥R „BB•!Ó*É-gx T#´è‡8A5gÞC06ëØM;tB!dï@h:O¯á¸t,c,â UMUð¶³Ûb¿Ra1 TráÂ…äû—/_î?º|ù2ï)B!‹ÄŠ•eQ²± Y*ìB9 OtFò4å·® &œ?¿°µc¿9 ¥>!„ñÔm¿= ªžŸ v?xò^) ›xD:&[.9×¥Ê]ìH ö@!dcù’%Vôœ®s‹7V÷ENº£¤ È΂þŒ;Vº(®kÚ¯§ÿ†r« „BÈ6¢äÂ… Í ,Èë™âcš¬L>¥ ÄÆÕ/tG:‡½ô´þ !„ìÖPÏÙ–AýJA\ñ0µj€ŒBý÷5£mԉ󦟎lä6šRÍw@Ç!„¥b%7³(ÁÌûS°R´pòæ$¶Öª«† Ò6ìx;w¥Ðy@!䌉’³ÓÈφ¦Þô¤ºS59hÍœS2çhF÷D ƒNš .ÐU@!ä$DÉîäË.Ïãæ($’ò©L¥Á›aÁÀÿD‚>ì“q„BNT”l—eàÚ×§ï7HÊrÌ) êÌ:Yh0%äÕ*©CõTk/G|Ñí;îGT!„l VÊ¢¤æ,¡°;ãü5¥"8• Ò[ùu“ü(&Xp(¯;l=„BvNr9àà͜趚5±kä4 è˜Ø^¹#„BöQ¸àt ˜{ÓOk´&¿—ÓØÇ Ónf”³qI!„œŒº° awÖ¤e®k³›¸è­ Û’élž!„r–¤¬SÔ7ÕÄ1AìëØÄpô"4âˆWP™} !„+T}¹qgÂI¶§¢™Ïi Ó€BÈÞ£óÆõ¡ˆê7O×Ó–4€«ˆuÀÏP &@!„¤ Í.h:”?9¸žî¹^°áx^é¹C¸^@!ä =™r}~Ä]¢æOÜD¾UQa€“Èá„ O7ö0Õ€BÈþk½°;†Í¿ƒQm¤S'_u”Ó»“—ÝÕ*Õ7ò¡ü7TØ6I¥ !„Ãän±’{]k«®Gˆ?¼6Ò5Ú¥jÛ°þ‚ØŸ ?< ©ÜÓÑ¡trŠK—.ñv!„²·Ž‚Ái­o9«(†?Ó‹^ð¯±m5ˆ•´vîûF:SRnXnB“ot€xFwÜqïB!û¯  Cû÷ôBDTÑöaúª:ÕºVêˆÙ•tt¢ƒN`¤[Içæ¡÷à”‚ÔQÓG¿råÊÅ‹y—BÙ3þóÿx¥# !^Š¡—vè~ê½ho÷üÃҀά­˜Ö±¼••´Ý ÈJÚ•v£2â®á¹$…yšSV@!„3î@ÚFGlµû:çeH36Â1ôXV"«Þ»°’ÐõÃt´}BC#êºRGÙV3h²Wa\K#1ÌBÈþj®°ÓT=ž¤Àö†³9F÷@Ía}5­@Ä 9 jֲꇻE´Óu?v£‘.2æ·•Ó†êÆpʪQÝB!ä@,«G©")aHœ ©.ÑGÓN ØrŠ né?:ÂõU‘VÓ¹ [xtP}4rGB!£ ĵ‚z?Àü~Ð ŠÉÁ®auÃIU%zºÍÄÍüƒ¨´Xµ¢Pé "+íµÑ•¨ÙÔUÐ$Lq I.\¸¼Sè5Ùo¼qïjw÷-‡º±Ø‹ÌûŒ¿ŽÙ/¥òkrG¾I/;!„Ìâ ;–èuÛ„ÜFdýÃÛ9× À[òÜ™Žƒ®?mÅôsikYIŸå(¨¬¤5 ø5 ‡µºÚD”[ŠÛ]a‡ÝíQMåÂ… üÆ !‡è3pô€¸éOºPQX H®ÔÇè¡õˆ!¢`\èç3OVÐAD¤s,U£BµÑ^3P3 v<a´¤&|&‹äGlòö/‚wb³8–gñîIÉW6dsã'gb7sw©?Váã³ØÕ V:Ê'žüšì.å™,}“Š!ä&Ð| ]‘ˆ»L}/À@Ô‘Ó"ñg2Bkh±jUm±‚(´ë5ƒ•tê¨.¦÷‚è¡[Ç)–%Š}3V’~ïX Ň(ŒY˜Xn¯~3W?Xt¬äɳØù T´ÙÑ 3ÜlÀçL!gE§‡‘:"¡Q/©ÖFš !ŒÃ 3í Ï¢<_ÄÇZ˜5VÇh®›ó×qþºœ;’f-F77JvaP7ï@%©'$MÀmŒ¿Ê}7;D°×Y6ROan®®³“‰UHß!ä¬2;UOÆöu§è@LRÝý΂Á¯ ‘Ÿ`Îð¶1„¶Ä¡¦¤sÚ—Öl€NЉ¶bbTWÚè9mûÕˆ4îò‹² ¶ŒÜ­¨ØÀÝØl½!öî®fëÆÈ. Ò1@Ù·ÎS8@YàHbTÉþо©ž& ù‡Æ¸Y£ѵ¬Œh£-D£=ŒÃ“07l›9´oˆ™»ñA“;ÚðˆE¡‚…‹–þBÈÍ'úáKSŒÞ1¶NnC¤Ÿë°2Y @SÂ2uŽ"“) áGÁ Eºr¡ݨè È*ÆÑB¦…÷°;¬QˆkSîÐD^:æ–§³Ûcè Úg}¹˜ÐBpÆì€5ãBÈ Ãv:æÁ(mªŸøÿLÙ˜ÞvĨ¦ƒ 1n;8çE@´¼éÅ£ è<öS@…éV+®¬Âì<Ügñɽzµ»{yƒE>ð8›®FPÍëìœ`nÇÜhñ4â-“mÑQ!äìûD ôÞ¦Öi‘Àf d) )íŽëFòkÉ¢wäÿÜú‚ãlÈUQÊï À<áï‡^Ç[òe_øeóš·¬Û¿úË7þØü[Þ&„Bö—^úE+ìþôÑ×% Å!±ñlƒñÕݯ—·¡_ß]k@Ð?!QóØ.ˆRá½H(ðR%¦Áìëþ#ã*A:iCÔ 67"„²ß¸Â.Õƒaª!!')bˆ@¼ü!|=@SV<É@ˆò½°Ä&çB`/B!òÆáNEøi‰N¼ l ÂTnÀ¶;€„»Yw–¨!NNRjÄë° æJ(B!‡ã*(Ô?ª%,IoAT“ N?ÄLÝÂèóX†' ¹ÇS‰=ýþL<å£ÿo“I3To©‚ „Bö]( ;Ýñšw!H¦ùá¨Rxí¦”Bxý’œjÄ€ªîê›ù@©Å²Îx=ÜòKÃ;«‰ž”B!F¹¨ÙbA³#l°“[PÝFÉv‰AÕѬZ¡Ž½/u…Ôú<ݦAÔç‘Z!„ÃöøQz©Àþ„Ñ]§ä–Ô[+@¼5B.¹iéX÷xúS“ð{äNqŒ_Pu\(—.]âB!‡ÃÅ‹ûO~ò“—î{åÊ•÷=M®\¹â ;ÏäÎÔ8¡¸»©â0¾fU 'Â)ÙD§è²Dn(â$AO!„8·ß~ûÆûÞqÇ7Å9¦æ98é÷//´0ç Ø@pbNEˆ–ï1•¶ÇÄP+Q£nÈQm¥ìš!z •GçFB!ûJÒ¬·F™¤;¹rßÓ$9Ï>Ëop /(”L;P ‹%d(2_Ngj'ßÿ0/8Sñ#6ÏÑ ;œºˆ ßè¿2O^EdOE)¿ãÖ1‚;EõK):ÅMæšÔÊÚ Õ}Á@w?í_'w´lúøÓä;—/_Ž”œÉÍu²…} Ç"„²©Ó õO`ß#(_kØL 0ósæÿb•&#ÊÝÔ„ñsØy©ˆŽA….„ ·…ky÷¯{Ü¿¿H¾î%–»cnßÜåí“Sšuœå“MnPy,B!UâßÝÛÚžó}0°ëüêкpò kù}x¿•¬N½ƒ±‚\§‚ú™ƒÈL0NLа¸aè?‚„¯šAã..kÐûOê— \QdßÉm™Û`cVŸ;—‹7ödsûÎN†B¶$ö>î6º0ÿÄh³ÂË×Òx*ðmk£4Œ%DfFN² ,‰™œ‘“%„Ž}ꞨØvm¼åìÔ²ëÞ—çÙ²?ˆT øõƒà[÷:ןHÇÕ¼fP#è(ØôÛrXÙ‹¾Ã[$~³|Çl9“³s²„ru‚Sx^¹¶Ÿ»0ºÈ2\D²Q1*ìr +„õ'Q5§E@ƒFLj"âiÌÍßUiL0J*ÛB+¿$WæôÇ“°Å“á„'}GÞ¨“¥ÿ€rvt‚³c½¸†Ùfž€Ó¨Á¿-aP Àëˆ,*POâ'ªõä´â”Ü -{êÔÃr^Ÿ»Y´.(zɃV*†Ìä žlR¡#rý'ôrE{ͳtWÇ #2»Ëî„ù¦ÁH%`**¤~ã"Åà-@¦ X"´gt‚ì’ÁX‹¾€ÜŸ±T9”ÌEÒÕï››É?Ù¥Ó ®@95?ÁIŒ|ú®ÐÑÙîiŽAŠF·†'gá,Œô ˆ1‰A£8ºtT!6Ð\¹ßT)z(ÅŒO!L†BöòQyBÌÞ qJA…Z0 {-4Ò…F|©1Rº1²„Z7²H“=¢w Tu !„ÜÉI:4ÑLp’™ºt¸ì›­ÏBœ2H)»]ÅoqW/lân H¾A'KÝ…rh¶“ë-8q œÅ쇙Qò€ºÝµÖÓ‘Àñƒäz"ù-ýâÊÈŸhSPÑ¡'’«|$›dBÙ{.]ºtú G2²ª¹µ °Û=4Òâf„W ¢·úœÄdä_¢¨¾ ãtkl–žßí·ßΟ!„ wÜqÇ¡œªæä0rÛbÁp(ô(ùü?.!ˆnT™z.çâ¯y4©qmÕ¤ð/^¼xåÊþ*!äиråÊÅ‹ý*`2²=…5vó«@ ·0ì *GEñD ãá«#îN&}HW[!„ÃBó}´hã«Ôí€ æ2»Ž½™ÂüG£IM!0Iå€BÈ!Èü¤…¼‰ÐÆ|#*„l8‰ù¬[Û@#GDè°m˜Ô*ÄòÓ%„Bö˜!"0£h^u(Éí±sÁÔ îU„¢AQ;ùx $?`Ä9Pûê„BSÀœÛ`w‡Ò¡ÁAfˆ¨¬Ñ¶GÕQPLë pÚ37å£©ŠŽÉ„BÈ^â ;ß´×9Uùõürzl¶o+ m$›ó;56}1J\ „BvÆéÔ0ØñŽÉˆ.Hß8Q3CR«P·•¿Å´—Wž`‘» hÑ$Q5%w 39 T²[B![pSÕ0ˆ¥÷[¼&ˆj÷€F‘gÖ²ëå<3š !„²7m ¤„£ÛÔ@óN¬šQ9æ„0<Ë¿ ",”æt;T/+‘.B!‡GΫž|áÖVd \ÔŠ¥ÜÍ63ˆK Îë^a¢”ä•B!dÆ¦ŽºE´|PXŽ@¶•r¯_hUmCÕ({AóªA#¡ÇA‘”Ë„Bö]Æo$ì ÜÙȃԺ墽n¼ÏØËA%}„BH½{'Ž6ˆb ¦eÍÛùþ®ð“&m$1ø£ åÖ°4¶h!!„Bv­4Äq¨2؃dY×ÀІ)|6e6iMÂ=Ž × !„ì57PØÍu)rÊ*Ì{'t!<]ãL¤¯€BÙ±“ Î=ÐKaä7 ´ø/âIŒrž€çÓkÍf1 .\Þ¹|ù2¿vÂ{†œ‘©ßìòåËö/Y,Ç3]OàHâ¬ì#ŠLô^®> å³pu…)œ o©ÐÒá:ÖHÔôA¼ßá… .\¸ÀŸÜ? knÞ$ätn$Þi$w›%ïPØSàEÊÀ&šC\e(ö(øe‘P==èð_¨69÷¶øI÷—;ÖÐUÝÕôƒ7ùc¾](…Á½ao†Üû…ûŠ7o¤ä}²ôéT¸xí‡ÆYm²ù²œÝÄC0+xëú#çŠ*%»øþ£ºÉ5Ùæß+ö·ä¾In:vò4 ¾}ûgá&©Ù†Ôƒ~›{ |;ñÛ›‡UõóJƒ2@Õòñ4ãð–û"R A/ÍžCŸÔØ·„Ô*­|©äèµ÷#ªÛ{`á-²äb«.þ³pGÙG6o¤Ã´ö–<å¥òv*Üá¼ÇöWØ©Ì7˜–v#¯w¡"HºØQÝ®M1±@·ü ÕìK·Ûáh¹/:xsÑ2o¤ƒµörŠæÎGã=vxÀ³§IÖAØ¥„àxñ£%=±y&Ç:»+½ÁhÖQRëüØ^-záC8ñÀé`½»rØ¡rþÞc¡¤‹þ!xê+ jßIzÓq*®‚Ôz–Õ-0[8æ¢å ’ê¶}ŸP¨œo$²Û§Sp ñ#)CÍ€á¿IšÊüGTògÓCEýEÒ••s³u+^d¨Õ záöYl©¿ 7 o$âÞ‡eÍÓ)y;ñ#Õ¢Ù·˜Ü…œ…Ý8êœò0ïõ…Ÿ÷œç½þ/Þ¼>nÿúµoú‰ýwüºIÙØâ³’l/ñ."'z›%o°ÿô²Ÿ³Âî²¾áÄŽ¯ó‚ÇšT£ŒDH3H9¬ˆ°›)XT„ð^"7ùmv:Â.Ì6n‚ÃÉ:UîÐdv“²cB!›fµa†c:lWÂ%jõ€œLG°IS…B!'a¯hðÊ­!¨'xÜHÈ7å]û" ÊþÇ„Bö—Hعö]—pc §ö†ŽøWÉV@š­¼ùTâ%ú!„Ð|÷^ý†Oî¸H bÔÙ!kv‹¥F@!„¸Qøn¼–äyéŸþL¨ Ž ÉÕÖœñ_…)Žç¼ÁUB!{Ì$슋)~â y}@¢&Z`^˜Ïª'É%­ö3B!‡ã-° ü¨pl!Dá»ÒGóÊú «ä'Õdu ¥B@!ä°Å:gOeÆnV/ÝÍ\†?mº S9AÇ鉲Às¯CàÄ=r¹€BȾ3 ;TøÈ‘3ë“=jô ””7@ùœ‡Q3GB!„ÌIâÉLG~7Ò{˜ÕPúPDuJOP  ý„BH$wËâQý×Y‡½W`—bÑÜ¿µÜ Q“ DQ „BÈA¢u`ûÑ1Åòë©EâªÁ:¹!„ý”þea‡”!¼€Ö7gÇ <Ÿ?ܶ9ƒ~Õ ì|HCQO!„dåw®Ú}ŒM.ŒÄƉ>‡›®)”†T/Ë`Ìz¤Š@!„äDlÜAp6×_sF¿¦4Ž!¿©·’ËzhFU`œ‚6É£ÞB-BÈÞâ;l$‘“!³v~Ú»*~°A„ŠïOÞ‹aêÍøÇüé^¸p· !ä¦àòå˼dk“zQF€/±½|@x ½.%ÔJx]|6â.Õe±ç§Ó¦5Å—ÙÕ/Ž·9‘ÛŠø \Û_«Äÿ¬¢°YE`MJâ­3líSê·8nÍJ…„Bö^Є±¼Æ&ãÎ*°ØbÒèË™ÃuT­ !„¢Nà." •*Pa»#µLd¢ÖÌp‹bGN¸‚á×N!„ìB{@>10ë5k»£BØ\¹)a*vá‚!„½§FØ!³ˆ€Tj¢÷±ààšs@¸ „þÈÙ”BÔ(&<#B!„lë3@ݧ¨RHPçEÐÙ·tN!ÐrµFB!„l£¸²Vg &íyw ­QG—S(Çh_ÞYU¹p@!d_¹ÑÂ~a€ÌZDÁ×€¤³?3,éÍT•h«ÆM„BÈ~Ùó¹OuãAK:IñÑÒê¨É…ˆ_B ±ŠiNë „BP#¨Ûsëú'7Í4^BjM†‚ôÑÃÂL¬MD!d‰„]ÉO0Gô}~0'Ùk(ü}(šæ†E|bgH6ËJ'B!‡ã*€¦ÖÓ{¼U"ìò¿îBˆÅ¿»à¨¾3¢U[ÒZÎp&"„B’r5ò¸‰q¤ïÒ¹ž xLUÜ$5†îB!Ä‘Ê_äËb÷’_<©^h«ºXQg 4™I0d€BÈaz*“Ï“ÆàêªCÄYKذ½@Fö[‘ŽŒN9X2ð0åThæf@!„HcˆÅ.¢öD*6à`g¶7’AuŽ --%˜ÌÓKUUæBÙcÊÂnð  ¤"ÄÉ~K-kÔl:-vóúžI oB!d{¿ÿÒí6dk AÔ: Ôqàcð.¸µªÛ)GsЪŠÈQtdSÒOB&dËŸ!„ì÷ó.ª9 óœÎǺŠB¡Ø0²()äW¸c\¾|™_%!„ýCOv`GðjÐkÀy߯$.šœŒ,Í;4©±i°B9hC~&tÁ8þ‹ ~°¦š œ‘éØj^*2&bçB!$iwëÉŒ¯é÷5³Éæ³@IcpÔ6•M¡ìe@!dßµ€ÓvÙü”Jcóƒ>f–!„ËNMæ»*Ü fŒvë0\keTê ˵܈O " ‹ M•zAȾ» ¬%m¥iîý¤ñoS0ësƒ”õÎ`ü¤Ë!w ¹s)¼I̓ì£n´ñC³[—;RÒÎDZÌ.¨&‹ëœÚ¿Æ@˜ÄžÓu c€–Zÿiež+Gë·©Ä}3)•ëušÜêO?9ÔöãrSÊ…heDÁ0DƒÁ4–Ô˜ÚN6ýNÎÈ™„ö!‡âu˜S“ÐŒ4ô¡ˆ È^Ê~׺ ¤]𠤦™ÉÍ #$ß/ÚçNlôÙóO¾²WN+ì VFfŒìÜg³=‰SÛÆõ³> ÝvAé’ƒ£Ff׈:»¥úέêà([Ž_­æ Ù+å`Fjrý_ý—‘.àÇõÚ’ ‰Á„à™ò5jJR N`AÐþ®wŒ# d™:»dpB>ŽÙ¡æ Ù'jf”ÑЗþѰP°M½|ö¼ûáçaº æ·dòª†“ÁõBŠòxç¦ó‰ ÝÊÁíyåNоOÈž¸Ô‘H—+FIk¡–°†¦¹ØÖ2óm¨LçiÒNzȾËïJaVã-ŸÝÆÝ ¼To?]¤[TŽ_3xò\¸d@K-ˆ…{¢±a9ÞR«.f‰cÞu µF{(Í潟âïî ôùŸñy}ùM×Öw¿þžŸúñÏ`¯:š IDAT…BÈþñâø)+ì^{˽%)ï·Ì/ã'ýùÉ0Âu;˜Žáñø â šètÃ!t‘^C!„Ü¬Ž aç´–L7c8½ žƒ­õ‚xØdC­NÐäµB!ä ÁLcaEIÌÖ‰RhÂmPÜ;Ù (±‡Îéû‰ÈC n‘ÔÇFB!‡êQ8“CN¶`ö@ñÁLÍì˜e@!dï¥{,좄@Ž-uMÓÃÙ÷àþÓÁ– gB]å kä#« 90!„rHV jPŽhQ¯¿8F@ n-î)3jEN;P cÞ#a¼ñ©B!n˜ÆÂ@ÚÂ÷Ë÷Ío[ˆ9O¯ ïðGap$?‚SS1¹5DÐLMŠè•‹Q‘¸téoB!g„‹/n/›.^¼»´ÔF˜X0T#FÙø ÆÍ  ýA«lvo‰u~ã$¬öEB!7˜Ûo¿ýT‰kÂZÌ‘tGi×Zçrûe’¥NÌKajq›‚&ÔF ³ØÉw@!„ìÛn»-ùþwÞ™ûèÖ[o]$OgÊôêA&#֯ג¼^į‹·µÍ”TýDFiœÕÍ QÅ]wÝÅ›BÈ á¯xÅ·û·×lyë­·Þyç•â²v9‘­ûZã‚~ðKŒ= óÕ ŠU„ªýȨ3Å `ìuØÄÿ@!„œy*u‚åF·ø}b‚U˜¬:e6"­\Ô^KDTÍRc¯‡_© ´g<ã"òë¿þëK¿˜ÊûÍr[ÚA6ž!„ýfÑŠ@¥á½¤=ÊB]ÇDu á‹Á :~"QÿIG%Æjˆ§hÎæ·hÅ|NÒ>"„B,}&Â"'ÁŠª6±TË¡ý¯¡µ¹(J>ÄMEI6Îæ‹Ýý‹^0Ûw\{=~3Þq³Áé „2ë¸råÊn]å.HKhw$Ķûhåk(À5:’‰‘q6€Ö:3eÁÔ*7‘žÏîŸÉ7ƒ7œB9Q'cNk`Wf÷Ï á>µÏÓŠ™ ÐÚÑs‘t(¨ë!È *ªª[43è­ümLyº!„œ¨{ %ì ¢Q^ÜÎ@Èû dA¾ÀØ-Yç…|& "ÔO®ˆœúÛ£ÝYbA`»[ƒ~{÷>½„B¶t\ºt©P“ «+„yYó/¶¤áÊrGK@I¢£4­?nï!ØYžaRäÛD€BÐ@6ÀõB!'á(Y÷—ãm €nâÈm€H ‡‡ŠSLh¡.@™¢É©(1Ûë¶.Yߥ;!„ÓtHU$ÆÖBP?(Ã’?´Ô å¸<-U4Sa؉dp¶.Ä2¤«Àofèí¶yÚ¡5ÙÝp?WÈ-¸;.:P2é€BÙ±{ öL …c ·Áp_[`»b€/í§*#‡³1„H9$×øXm/K#[¸=·^0»cÍ…1äBH½“ 2’ ŠèÅ•9‡—.]ò$«'ì4lè‡ÄÆz2‰¾è×(6ã1Ô0€?‚}0#@D§zÉVÊãAàšÿa”Á09o©B!$é&§=qèHmìmV(Rä¹";4·ì*ÌÌ' )åéh^!HA&„B@ÒrѾQ"DQYoÀ;jwüÓÚDÒóŸS‚Q¨BÙ{úêB/naB” yïGãþH‰zT’ý‡¤®<±ß[¡<Û‰&u&vwê„BÒI ¹œýun¯|÷d¿q’·C.€`Ö1¡©’Æp§Ù”fH}€BÈá)ãB½B]ç®É#r¡Ç4Þ~ÈûÆÖÉcuaw¸äZ½&ã¶Ñ}#&ëJÇ*g`˃B!7 ƒ°[µ×­^éºi")/n³cL¢U%ïšï`Öæ¼ŽkFd¦3é*îZ´`Ÿhe´°ãAxà…Xå VÂB!ä€xÌñÕQÚ¢"ì/—ŠQ£mÓ­íX+1ksîÈô‘|hM£â”ДØw«#k2Õqoˆ¥™?5B!ä`0cãÂ:‹Šw컓z¡¢«nýØNú0µ9ßµ5ç:ÓˆJgŒÂHn‘ ŠR¨qé#ˆ1´áH*ö°½ÂåB!{žÎẫþz®»Þ¿îºµb¥"­i:¬²6çk#iºlñ6gYÌ2 „Bȉ3­êéDUEVíZ¬Íº³^ë`DûHHä¨[‹ñæéJ„BÈŠü*w†LÅùöº šîX‘ÕÑê\‹Õ•H7Є‰¿(N²É»5ú?”í !„ì7gXØ ë÷vÚ‰Š<¦;Z¯Î·Xuf¥XÉÔäÀKè»!¨Ó6!7:f<¸BB!‡lÍŸ9ÕCð_kÚk*hMÓÇ´h<§ÀÐ)Q ÅžL µB!$¥è.¶Ù@ ^‡Î~ˆBÕ´G纣«çÖæ¼ÂtÆÍ—"Ìó¾Éž R= „r€äòïo`Ð}¶½âJ;£×Wº¬ŽµY›s*èƒÊC´=›y'!„r jA “òò¤¤¬´mMwÔ˜sksîØœ‡@1† s0¬% užó—_¡™îB!‡HZîŽ~`›§ZëÕ™n½Bxx®3Þ„Ih4rã+@ÈLCé7 „²ïîÍô'g5]|ÍàäcXlg ã´ÔèñjÝ®q|ÜÜÒaÕW<´ÛŽç3¶PH(,ZL!„LRsÄI‰Ì¹Ed¶<ýFºsz¼Z·-έWç[cõ8}mG¦fþ‚B!¤´–¿ã0ÝjÃ)a¥íJÛ•®×hÖ«óÝPÑN_Æ©rã©i @Y•ˆBÈÞ;òÂNSvùB«þƱҵѶÑõÚœ[›¦5çÔíøÿÆ;±`¹„B9`!_v¡#ˆ°s÷R‡ÐüœÔèú|Û6ÝJŒ^3çZƒ`ºf€pLê„BT˜‘ñê·(Ì`|÷qúý†ÃŠ=eÂÝ@¦`?1ÚÁï¾¼iÜ76ÝZôê9=/rK#0:V7lÒ …ã2àz!„½—ÿË÷ÈDv‹þ)V­iü¬ƒÕÑêœ9?ƒãXÐQ ‹§%ˆˆjÓílDV]mÇpÀœÌÖŠ7ûýõ\w´ÒöçtuËÚ¨¢ÉêCtB!"˜^vÆ6PEÓš¦7òm¥`3Xâ©DßÉ âÕ4kªv¦v:6,‘¦ë kÕN+mWÝzÐIÔig”×cjèJ×ÐV¤ëä–άDÐLU uÖgB!„„Ë@a:¬D¤Zs¾ƒ5¦ÃJ? a‡ái:1ÓFEû6†c7c=Z™>æ*kíVÚªˆ=×®E[‘¢ÐÎÏHx-’ T»ëÑvmίniB5‚B9`ŽW·¤Åª5çÇ€¬Nàá•Z˜ûó:· ’ÕIÁHÔÄJ !„B7A(25A£`Bhè%€#ú‡uû&©ÖÅô«7šØƒAD“¢0Œˆ®Í91çŒv¶çÛcÕµÑÒù !„B] àÐÌ>˜Ä;f#rjGª#‚—Ãè7]VÏO¡ÃHC=¥cYµ8'Ò6íqÓ­†’GÒÔø˜b@!dïq…]2ñN"éíËoÇŒGBzÂ_ìOªêø°+Ã'¦äÖ<òUÖ † ‰­Hsdšuט®[uÇçºãf·„B9 7Á!WVIU Ê–V?¨[>9ÒF¬äwµ dÌ“Pi͹ÖÈZÏum“_¼ 6@!äpÕÌû˯a¬@v‡ÑÀËü‹ë!ÚIê¼çµ^€8Ù‹žˆwŠBÔ¬šrD¡j©A4!„²øÂ®&ȯ$³á,~“DëæW ÑR©oŽ %5EÞ®}¶¡ÎLŽ 0¨B™Óí f \(@Ùÿ Á’@JÉÐbãyO'dÁ)$ÔPa–!„²T'ðR <ó>¡ Vc¾/"¤K—èm¢±*f¶Ödw¥°ÃB9Ë€Õ !„,a›–ÞsVzV™…¸W5ؾ©~ñ¡¸Îq¢«±§HhbHC8²õJ¨`œ!„’1‡}ÑÙ¬|$#áe@!‚ž°&2²SÓp$$M-3 yV31T!„°w`Ìôw¤êÐFh‘„tÓ‘Ô:lac¸yâ´NJ0zVGð µ9êM¦©ª[¬,ND!dßé…*ìâ©,P/E'¿Íås÷Ïë bªà}G3"ªp<ÔS†ÆM‘âŠÌýîMY5âíA!ä@•×3Ÿ\ûŸä¥[¯8Ÿ}Pð+ °ñGÜÃd¡£Œj‘*Zà½çûÿ6Å&‡„BÈÁêSž>ª¥"R*€ JDÅþ©"B¨Ÿsº®‘]ðÈŸH³ìÒB!û­èŸ˜ô¹ÒEÈðZØ+/mû0×°t’dü–ô›ÙkªyÕ¤©Õr!„CÐ |{Ñú¼Æ&ù¼ÑlÅ»bά—ØÇgŬžÌZÄ8¯i‚£e4T!„’ tš BªƒÈ÷Bv$-¶u²£(‘èÔŒ88Ñé°8ÔGÿ£"›YU@•ë„BöÝ1 Qo€83°l†{ÂØõ'd³ úÞ„¨·È5tfDv~V•JÄž –.&„BJ–· b;(*B!„Ì;üu^GÑ)-vu_3òXëMøŠd¤<^c¥Š|JB!d/¬y âýµJÌÆNþ?ˆjkfÌyß›àl1Œ7õ#¢2H£WB§ºEUEšÄõ @!„ÚÁIx‚ãÀùoêÈðóüNK3ÉŠ©öL &á!à:!„õ ,_‘‰ýW'æPsb…ù¨S¦8ú,[ÎÈ:úr„ g2ÞÉA…¹‰*3 !„ì½W NØm&Qû6âŧ–ëÈ$#hP3ówe¿ñ:!„¼‹9‰º±Â‘U&m¡ùiÉÓ EלÐÅàèî’z3Â|fB!ä°”„-Ý ›<1x)&@+=Y•d\ÔHŸ@± !„ Öǘ ES|¾‹fw°Y¡Y®±Ò`3ÕÉ(TDs³àfÈV€“o`Æm5ôKÔ:"!„=Ò$n*(¶ã ×#pÇ. –”¾…²5ˆ¼spÓ´÷hFøsÉ€BI;tGCç+ i^4k®Z²fýŽŠÀ‹Ð„[Ñ@!„„R™~C:ä¾ö­ ŸvÃP!Pc)õ›*¨kìC+í-C Ç0Un¥¦@!dß©v¡Ý´•ŽEŽöh}N]8 œÍUƒ4­)CäÍ[G%B“A…"ÙfK„B݈%¦+m ¨Ôäüi¨‰h:¨° ~ 4óZ!„B 2ÙZÑ[hFë¼bô @<¿€ÓgHEí}[»ÈI=Р–AB3€™ÚP½‰*!„½éÛ ;¤^àg,i_¾Ê¼¥ŸÜ¦)¹!„âIýŒí #ÝbÈóefe±ë ÈOjQÕáÁy€°t±?%* „BHmCäâ®Öúý‘¶Öd”×Ñ`ê=„BÈ“­'ìêÕ«˜–ú·Ñ¶PRí ;N“-H!„P=8MÓXËš‚–4”|e#?%B5£81®GD·ÔU!„›”ª|€%?25‹°ü(ð Ïl‹„4ÏÑxŸi½¶B!„ì¥;@§&C²+ó8ÕÐп2@ËG¨Sc§ý±R „Bz± ¿š°•¥nÁE"3e¦Î•^ƒÄœ²GC¢ Bކ_:!„ÊR- u6Xâÿ²»*¦JGÙ£gd»[„hÞ›b ) ¨pQB!{‚–…'Ò²t«õ”=sûºÙ‡ðÔ TíÕhfƦp]¨B!“DU ÿb[a©˜lúź…Öú´°Û°]“ö3Ð3@!ä`E, mô@"Ì?ÈÞ×M‡Ì`5‹âÝ$htLV£1 m#xƒZ!„}gvÉ¢ÿ³¢pÛ…Çѯþb~ÖÇ¿¬-±"]yÉÒ £](ëB9`aNö§ûnç0FÀÆ…‡*ˆô7lÁ]‰² àF#Ð9@!äÀ@ݯ³ªêNT`¹‰!bÑ>?cµš9¾M'R.BÙw‡€fëúnâNˆ=ú…"šÎŸˆ·;RGÖÁ 0D.¨!p}”ý„BH¥#É⃠l÷:7ÅRÙ¬óû¿)N˜1„BVàëü&i©í—˜—èÉc¹ký}­$­[€¨+K¶9€){!„ÃS’¾}¤íðrìaUC-}âÕÖ…6;ìn^ÂD*P±Y¤ B!‡­+Ìßp%nv§ Vtá¦XÑ„ÇUB!¤Î G…ÜÖeF}Õñ%ŠL"XìP“9˜ÓÇ€º!„}gka·Ô ת% ïS¤ú) ·é2‚ˆñ'ø ¨ B!5²?UP²ƒHŠì¸ßJ’Û•Ôª){¿BŸðßÖ1ðÑõfB![hó®}·*ô×O Q²@…7 9G¯&¢%uAgB!ä¦$vóubƒ{SzQ0@úp5ù:"ÉÔíI!„‚°Ð øÿ1ã-…ÍŽ‹]p— ¶Vq!„Ö –HÓÅ‚¼ø) ˜]œ˜44›ž !„²ì@øéBU ><*ÆôÇBýüí íR9"„BnNO‚ú€þŸZ°Æ“Qš=â´Él8Â\êŸjý¶É9›‚Ce€BÈz ª‹×I\l5™z ˆB‰ÞK¥tB•bP!!„rÞ‚>ÐÈŠGÝZQˆýá˜T þ„u±`oæÏ„¥ !„ì¿ yñ>èz’FtÐìÀ¾^&‚Î x4<‰fNo!„B - S‚´¶>`lE~lz ]¡œŽØ{tô6„eˆ¨B!~h¡mhˆ*Ë»Jª&ìdܘÉbqnZrAÄskRÚ„çqà‚!„½Gk,nWÜæÔ…*åbN¢ëò9F© I4y•…îB!¤ t1®`JL(l<ÉVÔµ-Øðã…ŠÄ0; ¨ B!ÒÝ •M’rubY bÐpaî f+­‚B¹ùÑÅ›kzo-ª T„Üü–t‚¿½ÎLh *¤S€BÙÜgÑ+fìù¼“ ®(›ÆjUŒCï‘BÙÔŽÏÛô ê×ýãáTLUóiæ|*ÊÒD„Bö›IØaóår8vü¢±Pê¦.h¸QqD”Ê+† B!YÀÒ±üöó ҽ뎢¹TMI ‚™3 „BÉW€ØjßÀtvD*FI<¿”¹ PÔ 0ëiHÍ þI©UP›B90 (]¬yó¿,y]ÿ<úU‰Šc/W<´Zv»M’¢HC“º T !„6ÈIh](¶3í‡Q¹c~/ìò æ>Eõ@¨@ëú"UÛ(zÃÛ ¤·³eS”ý\G „r˜ò߯ۃX'p䦪@«Ãü£úùƒW å0y!Y`0·ïÖÐÌ»¨BÙk|a9¹ €9‡À0ä¦|¸ž€Í û¦jr„BÈ¡©9ñítÕtçâYA ©N_, ¡‰¿#:s7ã~ôB!â7¨ „è6)Zé;ÈÛý)¥N»äŠÁÿtB9hP/ŸÕß›™ç}ÝÀñõ†kš˜¯O0â`ªUB!ä üŽŸ :‹Û”vÖR¹â‚&Q¯xÌacTé$ „BÊ ’r9lmŒDd V m·Z‘VÎÀù¿›‚¨ dº™ÓT^@!dßýZUØoÎ=” ¼UüzÇDÙ値S¹!3sM{ü±6®–H!„ÜP.]ºt®ÏxŸßI'-£v¯g䎟Ë7T©qÿ›Ä±˜s@!ä&äŽ;îØù˜ðlk5µ!‹ E}m»"]nÇ#å!P¨« Tø!„³Å]wÝuÛm·m¾¿¦íüÌb¾æFPÌù j¶V¶:Ê¡B´3íBÈ>pë­·îp4](`+6Ä‚ƒ!°0ºPDFZLѳAý€BÈMã!X´}Õú‚'žã >¿S2fªÃëƒ\#auÑZ˜_~Qaf¯´‡@3“ãj!„›Œ+W®”7èKë ¨\—¤g•¯~àß.ªgä5Š4ï!(Ÿ+UB!7•“àÉO~òÒU“^Z [g­w6­¯}×]21ghøþƒ¹ÝMÁ{@!„ìóîÅh!Æ0/¸—ܶžA¶DA²àúU“‚ô,óB!‡à$؈¢9T•!ô¿V»#œÂÆZªq\T0‚„$[75¼{!„Ð=p²8=†"}aù8;›PÆCÀ5B!t¸Bâ¸ëQï'@ÂÇŒ^ô7@Ü ̺' 3Ÿ¸"T>H!„îO€cÇëìý‹Eöuñ7×7Áf!n_VX½ DS•M !„ˆ“@%2Àgåó¬« ¿œ#Ô6@Š*$æ‡RäâàMÝÕ!„BÄ=0ÉH ãù:™ ÈsŽ…Z«Î.ªéˆyãÞïlJMV@!äpœiAïÖJ•ÈåÛû×v*ªó̬ýü¡¡MÿFAá¡›€BÈÞ»jÛÅb¸Öw°U o÷×7'Ì(%¦¾½"!„rÓ9 zm`Sœ¥~ÃûµOZ¼VV0Db¿DǘXƒ j@!dÏØ¾ö@¡U6v l§£,Ô7fòšŠsæ¢!„›ØI°¥Ä÷eª.ß³¦‘ј2 ºl—þøéàDDÓ„·±¿‰) }„BèHè‘hmû IDAT ¡Rb5 ªíøJS\Jë”É?¾·IÚáiÕˆ&„Bj¹õÖ[½¿™Qß·ò;½ç¤1rËôŠøÀð¢4?M· 3Šk¹ÏTS·ÃZàöÛoçmG!äL±­lZ²X®¡q­[9Jö«É ÈÌKëN2•¯Ø,Z¸xñâ•+WxçB9;ìV6y&º$Esôf“玈¤ã@ª"  Un€äðΟlL!„Äòö*< ’^EÐ0úoÇ!w´™áš1ìpvpæBÈÁqAcƒwav ¥B¯¯ äõ‹ÿÅ ~•Å雪?¢lL!䀹ãŽ;J"Vë»IP@!š-M¤%#¼×ÛWøf²¢ÙÀóTè„B˜}Ë1D¿.Ÿ\1p vTö ðvÀ̮Ϊ‘Ÿu;,*!”::An|.BÙ{üF?½àvLtx›ÅrävÍýE}äÔñävÂ|„Ð'Q *dƒB!‡BÉ]T›Ur þˆfŒ“–KðÂ’R „rоV¯ vòÄslŽ'öHûðý ç»ûzŒ–?žÞÿ2‹OBÙkü`@]àð?/Hp Ýp»$Îî¾ô”*0™ é „r‚DÏ ^I¨jgœ&@T@(J«š$Õ¨3Ö91þ©¹ƒzl²ª è" „r:ûb”ìnQ]$±5ëi˜FÐå¢Yg™;tS:¡E-—!„‘ .¸^¾|پٿ>ëZ@•A>d)ˆê‰PhäjX,R£Ç:Ñ\_ÎH‹ rÅ€BÈæÚ€ü.\¸pá™ÖfGú£O=дSáÿoïía-Ë®ô°ýÝºäŒ  L HÂXTk€ )鄌0vAœ¬@°Ãh'e˜€0`Àa(4ì6àØ‰ÁvÐìÈlÜ%£‘ÃrØÝ$»YÍfÕýÜ{ÎY{ïµÖ^ûÜû^½ª·>6»ï»÷üì³Ï9{­õ­¿†](N›b=tÐØ £˜ÁzãXFW!¸œ•©$‰Dâ®5‡K°>ßµè·pÊ”?´ÿ5 —F?«‘CÑòÊ®ÂÁÍLPš2&‰D"aaÞ«ü–"|e ο6Û4¾†{…vv:àTx–³çðCjá-°•‚­‡¨S –(ÇD–q¤‰D"±K'hÔ‚F]ª¯p/°‰‹þ@\’<ïèˆ Í!áñ± Q8ŠE"‘H$»©‚7l÷ߊ40#{Ï‘H§´ïF£ÌF¢0è2XK3ØÁù’?‘H$·‚dÞÒXB¾Ç¥”‚.âÎÈ@%ñ=¹Ïð°’p+”Rª ÂL2L$‰ÄÃ`dzBï/¸ëÀÃ%c0”¹Ç9‚’$ Ý d€–(ö¢´ 6ÕH$‰Ä¼,—ß7~ Œíè,É„‹;a äœìåPw Òû/iB!`{ɉD"‘HìÔ ü/­Ï‘í÷íjù 3a–zûÓü¥X50(X é0êî ÊÖuÊåÕןH$‰ÄC‡-ì` wˆòì·3ì7wÛ¨T6‚qY±ö GO1J¦ ‘H$P[ £éP¸}8;Ù1&f‰ —ePê!»u…ü"ˆ¥”ƒŸßÏE"‘H$>Ð&þ¹ÄêÿˆÃòÚÁMíöÃø´_˜H$‰w‹°»þ *À9‚²‹±]íÝß!×QJ¯´j*¨#‡;Û#$‰D"ñˆƒ*Í`ÍÀ\§ —çÆCpûæ¶»Î6Ò'¨1­¶‘H$‰Äã& "削ް`PoH8ü¹•.¤º9š -"ÄúxÚæóÌàp0‰D"‘H¼#*€"Úc™NÅ®E L‚Þ(rð ìñc„FH$‰ÄcƇ~øx.#{›eÿ¯3ûئ¿’í0:-0ì€pÐÇ€‡£²$‰DâMâùóç,8»ùëd¨‚ñ#G»ãÀÉ\™ »Î×ãmŽö¾H… ‘H$9^¼xñìÙ³ÇvÕ\¬îÕgå 8Ô%!JqxˆÒ ¢B"\Û‘èО~²s"‘H$ïz£Án›ÿ5O@WÞË¿`¤*lC• é¿8j…yàïÿûù¨$‰Dbˆï~÷»¥”§OŸ>ü¡¾xñ"¢$P%L’!bT£²ìãU“K«K‘SRùK\Øat~ž‘w"‘H$‚øÞ÷¾÷¶ u‰h…;YŠ–ÀØðÇ´tŸÃ9u‘ˆmZü Ç‘ ¡à;ßùN>î‰D"‘Pñ­o}k‡ þFàeOàâßggQñKß¡øò-°öà@º2ÆHh= ”rF¾‡‚öV<Ç–H$‰Ä£¯Ú†m [6xç¸8³Ó¨yáÁ\æ$‰Dâhx]nFæ¡R¹ˆ± 5d‘ž ŸÖ*`÷U¡˜-›“(H$‰ÄãSº¿Ï •ÀÚ&übZCv³”@¤Ö¯½*©æhjÆq@G$‰D"ñ˜ÀÍÈgéªNËçpƒ5R‘J{$=±€áN‹o:ºÏ¡ýr#GÒeH$‰G«De>„¼ìöb¬éô¯+ÓãB;®“•B@ªÅÒeH$‰Gªp¥ýaÈî5ÚŽÛÆuv"Ï5ýFÆÖ:òô€Î µå?v„ðío»ùæ?øÁùûók/ëWÇtƼãDΩw_ò w¹!Ô³ûS§þzÛÙ¾£+}÷.êN/M¾õëfÍR ¿oŽÿƒüàÍ>Û‰·ï½÷Þúù“O>nyÞF~¾A– h° ôÎå§&r¨À(u9>Rý×Q r€ô›8P_lÿm r.W¥YmÀ™:õׇ?ÛïäEÝ饩^U,œ™I ÔVÿÞ{ï92þVâ¿Ï(#£¾û tLy­•hKúrA€$ öpüNì^Œä‡oûÛÒ€h>÷4Cÿå·ø›ÝÊ¢²>«ÃPãlæ\‹º‹œ}G¾ùÔ]3çþãay}´¦0ÎùÔñ`5ÅꉻÖÓÿ¬¬›5_ÊŸn¬Ôé…Ø¾n?•&@‰ÎÛ¶“Îú*äÜ8IíJ°¸/û£õÔ ¦ú ÄRÄÇLñí•á¯A»ä~Ø…ÛZfCC-8KÃ]îgw6³ú4@wÌyäeyÇ$Aâ.ðÉ'ŸÜÐeÀMx¶„ùÅHç`ßF{Gå圈àÑõÏ}ö»NAõká¦fÂêPœµ!ä6³kÄye¹‰½¢.Rë7;~å.‘3~Š~˵sÍ£ò.jÇeZ\ÑC»üáRH<|¬ÂNîTœVñ5 pNTS }ÆN‘ôÁmÞÈF‡½æÍ_eùð ‡ß~PV1"Ân5íÍ œzTÔ5:ãoÜðΰøýJ% qð£îOQXÄ'„ê ¤ê™BÀè(v7Ã*?€3’ÚW` mC„c€ó¸ÛEdh ßóZ£ÆB7Tð½IëÚû©›e Þ.ÎvêQy€—Ö Ìº¹¾7'pâqê`°âøg¬sî²âG§PÆD÷Þ™î‰÷+Þ…Á­F Þ‘ ¾ÞÍyýJ‡HüÈþ.6ÏùæÁÆÙMÑW>0?¨ñyŽ·ý¾$8Ô†'j {Õ!³ÑÈ?ô„ÁRcYG6 lÄ®,D4;v³&Aèº;uÛ­/C›¯ûÊewÇ¡v¬†Ž®àŸÂ¿g—>º»™ºø‘÷¹ ÔC5ÊÓÔuMÝÙÙ1Ç7»ÿ‹rîì ½9wqi½N‰qÉØ‚Ä>@&”Åw°~¿ÆZ;^éh@%ö—¼vIþU¨ M€[šáæèí ¹pøý?rt™ÿàßû÷ÿ¿ÿûχÃO~üóÿíý¯¾ÿýï—R¾óïä#û®"ÿsªóÂWâ[ßúV)åÅ‹¥”§OŸ®Ÿ >üðÃRʳgÏžÿ7ÿó*ìþêï~³–¨—Š( ¬µÊ¯mO³±åéìÓî/ÊÉÊSàV1‘H¤PL$Þa°Kåó‚ü]êc1n¾ÏrÚ©Á¹D]!Øò%'݉wVàB"µ¼öÄ#Ò*xqí³©èÃúçK££ªQ@Ó™ÁÌ»Ô#9—'ÚFéwBÂ¥–¶ãT5 ?’xœ:ANBÎp^{âñª -º ‹ô´ ˜'+a`ŸŒ!j@Ô6<(û¢¤£ ‘H$—*„ЇÁ!LÊá¡ý><,•¯9QÃ@ýýÐ)@¸©ª“H$‰ÄÛ¤ À3ÃE_ƒÉR‚¢à±Û?PvNØÉÓcüën ŽË ‘H$‰G‹K· ^Œ ·º·o£#0*±ÑýÅ(GØŸrý‡Å‰{—Ø$R}݆,¯_ŸJ)§T‰D"ñ®òµ°«Mø9ñg9( Û‡>í@S£`sþ="[ëv(Ú:ŸN¯_½z]J9NëçÓD"‘H$"8§û?d(ÂMc.¾Ê®GkøÅ‰.f;ˆHwãåÄf›Dê;aí§4,4¼Èzz eäį¿üÍçŸ~q8àå—_¿ùÞ÷¾—w"‘H$‚xþüùäv,£‘”°óîVOO\_Žb‘m£¡E´w„ô3pÑ¢¬F7b”B¯Ûa)¥|õåןö«Ã“Ã×/¿.¥|÷»ß}°§‰D"ñÐðâÅ‹gÏž=üq6ÂÎÙ›Ôžïô¯d4Þ¾ç#ØŸjÖi­tñªhøãÿâ?ÿü_¼|ù›Ÿþø³ðþþ—/¿zùÕW§W<Ί…äB+lsŦ0Óª¡ g€rÝ]2[…F¯ÏŒú>?Aüs±}>ÿFÔ'¸Vª”g‡ÐRÆ‘dUÒ±ò?uµ©¢© k,*é©{2wíTBß"Tfý ,@LÄÌ.§‚äÐXåÂT-“·þÃËü¼\yù¼<8$µ7¢8ÿÿr¯.wXÿ<,ÿ|ë½PÛýáòßÓ2¶× äPõiG7ÚtiϨ¾L`âÁ`õŠQ¾ Û˜»uõð.3fÝýuk´OM±žê~5Øæðü”íe©‡ª¯r8ПÉõñwb „Ÿñ,³lWäöTWƒ/Ö";åŽ_óË‹°ÌÄä[Ý\I¿âí­BÈçêBAX« ¹næÓ.鮬X­¢ÕœÖ·C®¬ör*¶ïÖ69ð‹Ï¾üåÏ¿ü‡ïÿá*ì>üþ¤Tñ|<_ôÊß[—Ëb:°’ïdè]ï”wKõëPëE¹R(1—ZÍ(,åg?ûüÇö׿ùõ×ú¯~òOÿögŸý곟ýòtâéõé<ÎóÚ­J" ˆòåÎÕ=”·G§Ð¨¦l¨b¡X–‹²ýkiT%ß¼f•`%9Ê&¶.2¬ÝÒN3æ^”ë,›5K;润8j_½nÝ´j% «ÐªûÒ®ÈPï˜X=WÚiá¿.¤Ë”Ò¹¯µ$Àå€Ãúç:þõs´Óér¾‹.BòTHžÈBžNd½è×=Ï—‡e=×@Áa9ÿz^(c¹ËÛSMë ,½:¬½Vʖ쨵L­Þ‘Zú¶}Oµ{ÝŸºÕ ª÷w¨ÓcSSÖû*ËM{)‡ESDÁa}¯Gš÷EU½<ƒÛc)ÔÓ¦ÍåFTrÖ65dêç‘ÕªVLX¨,%õKŠn•Qdü{U³‹X)Kiîao‘ºuž/¶A3¼¼BÙC¤c_m3‹êe]'r±ê[²”Ÿþ䳿úñçソµ »rlštüQ´À@FA*®¸§ªÌ0dû3@W´~+†à²ýŸÿð§ò/ÿôx|ò“ú—ñóýðgÿæÏºªá½Þºã¹aÿ†Õ¢x*AX/‘Ð-¡V/ž£qÊÈ:7ì?ø‡ª.A]L©iÖhg\XÏ›~ÓGP/¿;¯bÁ—UrŸÄê¾}èg^<Rß‚°õÃÍ[MªñÈYª,øÊd_uZ¤ù(V ì[æê©«­qúd!ÜG±{ ;ã•–%TŸ¨³Cç%UýÂ]Tª—ßa ïþ`6Íbb×á+Û¿°î+ìLˆ·>¨³áÏKej4*?;]aû ¯HènŒÐ¦¬§"ôblæ—úírhP5z•ÚÛ• ÕÒg|^>ÿô‹O?ý•vüw×`7 jÐò0¤nÝÉytê(ÎÉùð&ú6ƒ‚_|öÅ_üè燾üÕË/?ùé§¿üÉþº}œ¤F'GؘÖcRʨì³ûŒÖãt·è/Gí£Iu¹wž|õ»ÁlëÖ9[ùÏæ¥®¨6Ò¨a,á̼rù´&„­6ØA¡›§—°!Q9+%öaðèÚ|ö?Ã×¼,$£‹ý”fîn¢Ê|<ì"ír%$­×1>%ç'žË±·+´€Oٴ뮀âÇß¼üú7/¿–®”ßµ}@‹?YT ¹[”¿\Ÿ.^øÅÙH4`Ÿ`€QÄŽÀ°Oƒe¨4C€ÊUNg6ÑòPë'À§W. ¡5}»Ò8•ÒÕa½5¨|Ý^Eh÷B3?~Ý})Q7·ˆŸ"ZÓ_*€†)êÏ}(l?ºÇSfóÊò:U,ßà«çÿÉ?qbY6‹ªçWÚΚÒ{»¨¾xhü[€­8”‚R ©SÎ&Ŷ(¢TÁ(Ò{bq¤ô<†-ãc,}­®ÖQ™•’QÅÈ€ƒõζ%Z¸Å‘¬$§"}F+K¼þ·vg¥œƒBV–(‘ëï@¡¥•yŽ€›4‡ Îµ@ÞðñW‡…#ÜÜå¬ãÐ[b¶¥JÓrU{"mó’P’÷íQÓyoqËhÜÆ\Ԕ癱½­§õ…#;ý^iÍq~àß(´À‹Æ Ú>ÕUìT÷ªov˱/,Ì:óÐ߬fYf`¡D(¨V®6NhåK#Hâúÿ¢ôT»Î¬ª€!Õ܈I;B²^FeÓoDÄÆ¶„Ö¢«@ ¨ZìjÁ¿Š¢·èR¯Ï¾ö^;\¢5\B7šk?Ÿâ ÂOçŸNUØïjlj›…CÁ‡.!%d{1XDZsg´Úœú‘"šDY’Dx Äó¥DuÔÑy­ï¯ùFᨃ©êø˜Rêɸütùàç{¼è”K´N™!Ô³:8B†oQ;‘À6¨¥’²Í[*&¹È˜©nþ/!Wh¢­'C+xZƒ'¶( ² ^®‚«:iÝÇLˆÀ) ÑÞĪISy4×;ùæÐ²ƒU]/mCIƒG›R5WŠ7 Û¶àRì—[ C¶®ÂŽé@Eð˜TW¶[Ók¦}zÄ…2kv, Âô¹m¸ôÑ[Ñ­1h#³¦î㟭‘ìMĉ–t€ÒøJë(Š6Œb=u˲EÝ­ë×Iê/•ßR[ª‚H¤Y?$”!#Br°µæ×#—³´¨”†)>¾$ŠKÄÇiU·.JÎæ %é‚ñ‘gÕÖ\8Q-ÙØ€þ$6-uI±·ÕÉÔ*ŽÕÔˆ»xÌæÝ .ÑÁ%HÒ™lTCS›ï&§é*VRƒ$Êß9¨¤®CÀÛ¸› Y¹Xª(ƒêqX‰ÿn›%•C3B7—‹b_ã&®¶ /‚áäÒ6ÕÅ¡í-E¬SÇ£Ðv7’€³w—Õ PÚ»žkcÿ+¤®ÙyoƱ,Øã®ãù[nŽûôÙÂh±5zÐI“vÛñ§#ñÓL k®ƒN4IÅb K|kóÞ—Ã*€µ9ªL˜X‘)Þ=¼ÙÂç =™wR¡0bÒÙ§JŽ–{‚*ctôþáº.,îØöEyAçoª§Æ“ßÿ#JyQHH»æ:㦲ý[$iUmSoslrÊØh…f<† ®MlªÍ¨eÂ=-”ac(¹×îUúKübµ¤qhêâ[–K°š|®ø²Nùêÿ³úå/_~õõÏö‹ÿî¿ü§%‘H$3øoÿ‡ÿe]EÿûÿýŸ ëqѪÉË2lè4Û=AÓ5Ù«ÂjÅ™J $wx‘”Œ¨©`#–æ‚¡#€­0>Y… 1I£æÕÕÝÕî2aRQë†×ZeïX7„`{Î' ÎDñ—¿úê¯?ûů¿üê/ÿì³RJ–ËL$‰8>üðÃãïý\EÕHµcD¨(Ž&¼m‚)¢l²ß±ôD£h T8«š³FD¢Æ)ý=ìUËCŒu y{g:Æx{8ƒè¡ú p£[¬8 ´ˆVTú)k•áPʱ”_}ñëŸÿÅ/ýåW?þ×?[Ÿïknɹ–êÃo¸’H$Wâ¼ÜU«hÛ´éò߃²€S÷Z`ól‹°% 5…(*Ë™›b Óu*±Wªeô&.XÀ±fG`rÐÑÒ»Ïz*[«êwCªmœ,FÓ+o Ÿ”ׯ^½þúÕoyºô'½|ðA®‰Dâ1`]î”U´“àGs§EK—8“€Þ|¤ˆb[„ ¢µÙ_BA!õˆ1Üxx`–µ>iËÇ•ù²d……bT¸Üßz“Hï ÒÈD0CÐ,}º~®VуNŒEŸ‚ ¶ÅÃÅo-øuYt¸r-3.‡–RPGÑÏM¹g)ê0,e‡’y 'šá¨ûe`QsPÈÒ»‚ºªNq¯Tg3Qô.Z”7ñy!+²bš—lüóYérg®K/ò‰D"¡‰èŠ{?Ž No‹.EÌã <“ÅcdsDíëº*êA·†1ü¢ G"ÜÓ^îÆŒ…ú}£n;}S¹wJ^Ä© SüIœÎjëd"–C¼Y¼÷Þ{çŸ|òÉM޶'~d¹×͇ôgéú¹}°uG³:û„ì~¢Þ¥G±`ž`Xg0ëÈÞ›3'è_@KyÈ:A½ŠB•Õu9WWjÁlf6¥ÝÍ€Ç ÁHÑ s÷ŒrümÝÃÆÔ¥ÓV®IÍ™B¿k%Úã 6¥!X—Âb9bŒñÑãG¨Ì1ûv¾ìžŠšµl»dïÁ9,à£>*‰Ä.ð–r‰Ä4[ ,¶£&F‡JÝ9GëPm[ŠBµn<Ô9  e”®8£¦®'ñc–|Óâòvq…Jnßȇãô$Z.Õ³Àº“݆Ø}¨S`M¥uÚ—K2RBºÁ™Ø]¥ áåŸêgkËõËfÇ©³;_ª«3~¹ûõ”ìœ%ufüq>y¯Þ¸øÃ`í<ÑMž•ó´â' ”U´^—¶â@5•OÊèU¬ԂEøÃÒ <ñE5`>X7Ȫ-¯+Dê-F­€"6©køÕ¯P:.…ác›ÖK°Ÿ^‰K t"¿«m*Uß³~بÙ$ >üðÃx$AO÷k‡ºFŸ·\W“õßÍÒà/ê–ñÝÕeHeq¯¤dà, gÃ9»%ÕP#‚C\üÜÛ’âÃgHÓv=î•{ècÈ»È|*V !©Ÿë\ mÉb¬c°íòZŸaÑ…æ%¶b3Öóf–wtEeê¬|èüÏø>êôÍ>–dÛS°7ç) Ú|ƒÒÑ ¾ÎÜ’kékm²–ì;2ûS«öJp ºŸq¾ÙYº•`ŠºƒÜ!-¦†8Ÿù(¾-ÊA[ºØ5®©ûêÆ}Ð9…2°m!óìñžË‹`)ÂPwDÔ:sˆöõª¹.ßžîrnH‘cIsL8ÜýznÊà¨P* 2ëX1qÝœn94K¨ëloPªýw$“®±Bîsœov–îÓ \Ñõƒ¼ùÃpŸOH>ŠZ j›^pÐãQ>mS¼=̯ü»U+Yu ,Å…åìXÅMñbXcºÔØ¥ áDùNÆÁ¦Å—DW@ ¶ÊÉJ9ˆp]‘(_é(‹HšV”Ñ ëýlû¼oÁ«X‰ Þ1= êþ 7{϶T0¨ûMáÌÒ¹ð;šÿþ¢†Ã;g³æ£xgÊ©úõ*nÅpд¯µ÷¢¶ì™O®ZjÒ‚ä%ˆM†XYm2¦aq5TñxPy–¨5º¶Žü\†°‹H Ÿæ§l½ë¼7¦`›NÐÖh$As>¸‰Ú'Jö§¿†{‰“NZ# œ¥^f8ñbò'•޳Ä2’ËÚ½‰™’«Cz[fÉ’ÐÁqªGðgé¶Ú@QSCð!¹»'¤7ÇóQ|;Ô(µ÷á÷ÿH•öÛR [%h¸z„mëm<(¡+Ü]4ÄSÍ‹€•T°4¥µÂŃǬy/‡-†Íº>ƒ…>.et9h_ÝL[ÅÛn:JE!ÀŽVÎk{’ßà«ÿèÿãýðg¿ýí«ýßü_ÿÇ?{ñâŹ/ÑYÌûô€Ü²ÙøüÓÝ•.¾‹Õám‹`ÊYzú»1Û×_ÈC›Šséâó‚ùÙáßYWÑÿ÷É/6½È IDAT1,ˆƒC¿à;Ö™šŠù›©ê¾« ]KA-—í†-/­‹Sø~£è±[Š}¸t±ï`—]àh ¥Œ«6 v3ÙVTKÌÜu} 0^3$Ay‡j¤œK<ÀgòÑz+Þ6Ũ_E«?Ú‚oJI­g€ÕK¥A·z`‹¬Ê×”Õ£pÉvù·›Jw›Ó;Gíõê݇Ý=«Òp¢”£eqñ”ØEƒú[¦Uiê6ùOèR)ˆl#Ê~M3ljÞ!·¸íêðöOVüö[1KoõÌ¿-7îÞNñ=ŠoÓóÖ•ÁÓ‚vOze¦ø€úÄld Ñ9¡”‚UbZÅ U þˆû¹q}NÆ#òºÃc e`7•Û_ëœÃ¸™¸h'j ‚Ro ŒÊk^'TÜÈ•˜M7HSþÞ'zÌ$Ê»wíoõ£øÖá8+«Uc—·lSuÅi{ðö匉¥à>hhE:SünD=úJ{œöHu‚°V1àwhŒ‘;Ý€oî0Ñ_ ¨^›Ôþ.Õ&¶ ©•+<ÓÏŸ?„&`®_‰DbJ”pTôõèkƒöÇMì8Õ¸9C a«) -lekÈKœ™Û𰘱†Šz sÙûê¸Iûz¼¥_ùwN™°Jùt‡SõȾˆJÊC­õ$êCt¹k‚ì?s8ƒÀ)mà£>R»]_IfV¨_IK¦Ë6‘HÜܰ=úÜ»³Ö¦ìE4IE-™²)£Ü½âø½ðµÆ­oȾx5%ׄÊ0ËCEÍbdŒÊ Uøó´Hf›Œ`ÄY@¥}äp©én¨Ga­øøão☪ZšH$o#AP S”C0Χ"½a·<ê̽sÄÙÖ Á7M×Ô5-€€*µ€¾mÎu3ÙËQÌ QF;+÷nv"\_™Ã„¬:œwµ£î޶ò#ÓÙÝ!t•ªk[{0²çrXºJ…÷ÐìXÍKöóªã5Êíz½Ä{#¥Ó!‘xÜZÙï.3SsóòžÔ-ùŽ@'Ö…T”›ÒVÕÑk;¤´¦Ã`4!ÊÆŒ¥öõŒCS“©ß>Ü»±¡PŠi•—5êIGyì~§²¯¨…; …ÐUyQÏŸ?ÿàƒfeó¹/–¾j}š!áœhJ¶ÃI"$‘HXfûÑâ¢ælQ :Ø•Œ¨ %O¡(åïVq-‘ÙëWSIxÇw+X̧úeo1D펛—ˆ±Dœs?J¯ø°¢ –ËŽé‘€=ÕÁœÃs"WJʇ&\bj¹&‘ bO» §è¶-ÚXöA;˜J@u’ªQ®r–j¸ˆËú†I²Í•l²,H¥ÄÛ „&ÜêþxêDÃ…ƒ v"Í«`9k4ˆ]%Uí@`úÈ|­÷è(RÅIV ‘x̤ÀÒÁ>ÒÜhNšŠã­ƒÙ6H.Âõ­ ^Ìü-ÒvzE¹}PÖ8ÜZùpzÅŽhrèê>Íœ- IÕ×n^Ô2§DÅßc=±F «º!j}bÉ,húm›Ã Õ|âÿîìõá‘“*H$.CP,“~,.½ý …@i.sp|êþuã µ?‚×ÈF¯g_#@¦0,Í-ÿ=Õ”„ÑøwÕ=;­‹¦Æ (eh“áë—ß°¦îHv;Êôí[úg‘0yØÙ˜Ä²·7RüDÅnü2‘H<(n`[E¡–$æq¼6Ã7dÛ€Œˆžªé餸ש‹jT{-x&BxNbØê‹z @LÖß…±qŒ C”bÕ÷ƒ .•u cãVÜ3èH$×(ÔJ¡T(sú¸0¾šœåEUXX¥Œ0õe*±îˆå­õ¡g'ÖetESÞKß~»m 6ö™T&fäìÄÆ÷êQÉ]j šõ¤ |°jC£zþöU: ‰DâæªA÷×AÝ(^žªõW+ʨ³ W?ƒ5Ìæ ™ôf…ãQVñÅÌÑþžög÷Ù!ÎÙtƒiþ PÞ˜;v+z'ˆ®qqÓ8Éldàyh iµÉ$‰Ä5Ü€¿ŠŒ±øb.`zÒ^{]œ×æ'¥Ö jú@© :è!}œã.‚‹#M"¨p¸³ª7e€>&Ù6w «~`Ì(dMí Þl¢™|Ùöše"‘H$vþ*Šcß“~Ù¢öoÕÎOYÉ»LsNÖ™~,mé<•«èÿ®4þ–ÜÀµHq#]¸ÆÄ_²Ô»Õå°?„¦èd»òȶ“£Ãêë¢?ÆÏ`Dµ‚3j«Ýfm7c²+­NPi¨'¡/òLúlÔ·\Rf–A"‘HÜšD?è¬uïÈ"Ð7Àí¤:@¦+öÒ”t;":ézM–ºÑí19Ç¡¸îH¨ô}Õúµ7qO}Îô¢Œ"¼D&¦÷¬ì ;ÍÊr˰?}"‘H$öˆ0VÖr§¸Írà‡„×GF¨à¿1—ÇÐE4iè˜ñ`¿«Ô-ÃÃMaÌõ¨ ÌUŠö6$ü‰hu0šÌpq@AçL W‹ÚöbáZ (_èD"‘Ø£ ´«hW’ö`ICЗ“­™M³3‘ú‡Íã z‘„EŽÎÙ¨Æ×öt¢^¹o—P5Sm[^THrb¦½R¯!ªÓèÎ,*ú–δ&õ\7ƒ1€ª=¡æØÕ!HwA"‘HÜ=.’ó`É"Qrˆvyí ͤ‡¶ípw)³Ø¤Ýϰèû½VÓßx¸¼ÎÕL¤Øi{´³”|=Ä¥$¦¦†{.Ûì€ÉV!égÜ9׉D"‘˜³<£š<3¥ ]§Ó"§•l5›ÜõdogÖɦ´T(âzýëÛÕLH½b„n溥sÌ%>´}$•ÛiÐ<ÜÎÇa‰#ª®”s‹s‰+Úu¥@Þu7ƒD"‘x§µ€À*z ”áƒäŠ#E¬ÌD®:úÔª$yÉHp^»­«fŠÞh(šôÊšxªµÌ›¬@—xQÆb§]à m× [ÛQ*-ckQ aÃC½ãX»Vk ëÚEì&)‘H$÷‰ƒßÕŒÒÛŽ#7öŒÕÞE¨ÅkcÄ7è•8,S†õ̤h™s(°"2Ç#ÑäçéªTûÚ+Ç6€îaëC(kü*¤2{“H$‰)ÙTŽ#É5ŸΚPOË­0m/õ;G5 ~_4­ÒeTîHÓWèŸ)<­:1Ð º€$ETZÚ›üƒé=îTÍ¢•"  8h“ÈF¹äøÕgÝ™1½‰D"qúU”’!ð\ãsË/½Æ½MZ‡*^·V‚1^¢²D/‘‰öY$g®w<•¸Ðؼ@h_ÎMµÎc•QÑ+Œ`Ëà¦@¹AÐÎ]9HùŸH$÷D¼µ<žî.jÌu²ÜmYÄ©4:ÅÆT#•Rªèl \µ‘pWªH°Õ! 5Æ›XAjÑÿ†RŒb…ýåiÙ²ZÍ` 7`¯x, QK1PäC.5 pIJIõ ‘H$ör£UTmLµâðHÒ™_·D=Œ>Fj” ók !ÑÒ:£s)ç;ì\‡D¥uÃ{ Є°° Z¼v‚íAݘ¢ç˜s¹sıRX:¢³u5—Z]*‰D"1¯´«¨²âmÙ€˜¨ëÞoÂNmm¯­èØDܶxÔÈ‹:“ ªjƒ"|Þ`ºÎZoØ"ΙGNûçpöE¬÷ñàHþØ»<è{Â×èš±\Z,ýü“E+…”ÿ‰D"qGPVìƒÝv.Ð^ôrø]èuBжwµN˜Ð›ñÏ]BZ~‡ÁÙ0-ßGeÃßCNÄ®táωŸ—VM%ô[VaçÚT‰Db/KP¯¢íJ|˜•¬C‘5‘=À*™ ;u-1j4µ˜œôqNÁ¨àftš1,:7ì Óº÷Ò°©A_«5gAmð™q˜H$÷Dñá@r;kýp °¤Qû1¦çíCOÐÒúB'R‚—a˜šÎj”oÃ…Ùqê1 Â8Û”lĹ™b²„|€ú}n]K¢`Òž¸†D"‘HÌ’*Cà 0-U4;èJýÇNc¶çC'HÑ Õ-™=ÔÓ9ÔwµÑ½°)MÿEžÀXÖOPœ‘¹SžÙ#™ªŸD¤†:—J/|4‘H$ÃÕx´Š2®oßñî¢Þ6®€†¤2“ëv¥ ^ˆ UGµƒÚb{;o̘é0:7´šÈ¾St3ÊaGM=ÄT£\惔‰D"q·@)(G¯!E/ƒ% F‹=­P ‹HĹ¿‘>H´b¡¨áF¡WEoàfçmŸ#,üâFaшQv¢¾W¸v$a Ì_Žu;Ì–O0z;@¤€ô ¬Å³ý‰’…ž³A"‘Hì3C«U”¢ÌL!8ïPGœk~R±ûÛÿê•ù°ªC³qÉj_ÙêÁþÁ’BŠñ{±þ:º³² ŽŸÐ$ÂêÛÌ⛪% 9Èå`ÓÑTd¸foýOìI‹þ÷\>©$‰Ä>¥@®¢Ê"E/ ¼c •à±âÓµ} sf”µjÃx¶ŸÙXHwNJtÆfU‡mw¸ôöÔ©ÆžqŠ`-ôõÚ‰S˜H$w„(~e8Bñ¶T¾¬aH*ÅC‹¤ë’üh¿ŠýÛ1&ànùÚ©Îæ›’øŠŸã鞺UMŽj—Ù4Õ©´îÞ¤ Ö‰‡K0K²‰D"q…iv6b)tº®"rí^‹F´ný&¸ŸŽÍ¯ß==Ü ]µƒºXa›Ì(FI¡»´É”2…›§;Ò§©“òîEŠÜA6]ÍR@bv÷ÁH¥ ª» È–ÆzùÈô1µ¨AYŸC뇀-'#U‚D"‘Ø¥ ŒWÑãà#ù[ ·¢úÞnŸ«*{oöif'õØ+1s¤ùÕò¨.Ñ_Öî?æ\P1Å£µ#)BýâçAåÞ¶7ÁꮬÆÒP¸P2n ‘H$îˆ0e£¾ž1­âq ;µ Ê‰*¬VRÛÏJµüÎeÁKLÁ}ý"ëL4â9i ¹ŸS‘mÂ"ÛL¡#kôc³’0¸€Îa "I$‰„oÇÑé04T*•«7ÒeЩ YD2Ð›ó‹› î…Ø ga®—ÆÆ•’QO¤'Òc ȶéL„d{NiY®Ô04ŽßÕ‹P57ÅÄßî/Gã8J;¬cmQ]¹o”íAmÎ{&DöX`«=‚“‘ü@"‘H\i¬záØQ£—¾q©¹™ÉÆÐ‹ôŸµt ÍÙ¡÷Ÿ ó#&J$"T—ݲ†Üt¡n pc{êqAyçá=P‘ÈL {P¢ôµ d݇Ë?Lµ ‘H$öèÖ**äÕ1 ##23ˆÖîYòÕ$ô–Š]Vá&f¥š†Ñ «L`_Ж-1€Þ.·[ùP\ ¬{@OW‚á{@¨%±§Á™!°ïqÑ"ªðÃJ½(]™B4ôÔHC¦Ï ‘H$îž88zb‚bEÇ0u­j@½Qe+J?e'KùÉ.½¦Ì,%F”>±é9JÙThšÎš°g)–šQçVV_2I0C!ô?÷5ÔT5[¤xN¥³æ³2Jùî&‰Ä~±O[ènÉÁ"4"hÒ¾ðBÖFA“Q GÈÖ{rƒîÂ(ªÇíd©kjh(ñ]ö@-æXÐõŸ”>ÉæòùWz6¬cÉÖBŠ-ÿ dŸ#–ºŽ|_¿£=8ó|V$æÂ”iƆnÒ6j`òH(µ?gÄüÔ%«Ô¶–­I–ln”H$W¨þ*zŒŠ“pIßÛlªkAc-òo•ôl’æ©§š,ªJ¾½(×*õc`3»J}ÄuªÀNV‰ÀØÕÄÁ±c‰ýìÇ$ÓHÛ S"‘H$n¨4+í¥Û¡-´¨u«µw}6³Á +…8Ëè,ø›„ìÇâP4lØ~9Àó#<àÑp“ ”.çÓÚ“ó•ô@"‘H\«¸ó±–OÔ[àjeêY¯Û.z쥪@? 1ˆŽ'€Èu?W;Â…û–üÔÊÇjÅC£.JXˆkB±íP³$êíÄøô·dk§ëÓm“) zËë‰ë~0·Ü6ËÂD‰D"q#ZÀ[E 8¾#"ágÀdЋ*ü—žH"Ê^³““ b7qLxõ§æ¨øwîpèXòDd¡ ÍýI ‘H$î‡ZöW=ûÂMþ üÁ‰à¥vuùóF)yÚ`|XSHŒÇM;ÒÚ‹f×K²§û„Ù<«Tй† V©R"”Bæ¼w“º£F ‹ ùQÎy (@ß̘í|µ®¤ìfH$WHüÁ*z²–pö6éÒüP¬uß43…è(ªÕ}&D´ºlU@ÕF>˙͂G Ç3,ôó™0u›Šk1;AújìHíö™ÏÅвçHóá6=츤Òç: ßäD"‘¸[ â›Úv¢/BÆo%«éžÉÊìSá´¥[mêšJè© } rn½æÑÜ™|‡EÛ‡FÚ3ÀgŒK%,aín»ê'%‰DâZC[¡è n+ÑL×dísÊ[a³Ë½ê\(„cë+G§m˜#À Vi÷p¾BRs.Œ¦7§¼kßñúœ²¸E‡À^Kh¢Ò«Ö}›Ç«šÿ0vÆgÜVÞb{aúJ6)<è—H¥0àp†ô[N]© ®Ô°ë…VH$‰Äéà!n¿˜~Û× TDê&Î}·2!¿rÇ· üÀ*#t©= ˜ª!XêŒzæ+e[ÝŠ«ºOW V!ÆÔ6× 7ª‚]=DæH¯A"‘H\#ùÙºÛB{Œk«ÚÖÈGµæCÊ‚9ÆÛXÛx….œxÞ–(K¡¼j-êATI¨³íÒÍÑ•4oI›‰AïÚeŸœ\´õg”Áâ„¢íÿ\ ¿«4€¢õ+¤Ì ®0BŸKÅ(´dBê‰D"q`™—f?®¥£’ÐsOzNª?hEÕMi1kNUœˆæ¨¼ÑM]‰Dâ±Ê}sݾ::Â^ïµ ×ÂlòVG¨÷¥I®§pmͶšÈê;0ò^ΞFŸÙ´qO·@Lì€Ø–^ã$Ćł630¾hú/†ÖWœ@WXÐ>˜qõéª-ûíËe`âªÍ^™Œñaèò‘ȈÂD"‘¸F ðWÑã–jÕRßO)y.yæ“Þtb¢À³V‡°Qumw!ˆ(…¢Îñ¶›^‡NAßÐ×kFMb¶›]CTÀt ±:#K) XÆ®$e$c¯ò¢)°©=© $‰Ä~B`°ŠâR˜HqèÛuz¸£ÙnaW{††!ÚEœ#¥DÆhG(²ۺścº;|Xãߨt¥…ífH¸ ÇPn#£PM(ƒòÜY­av¥i©üMV(J$‰ûÁ\–¥x/s9o~Z†£´=O°èÝ ÎŸØréÉ]زq+¢€QN`Ñš+õ³2ì<$SïÂb`í3®YËБÄF¨ã3›ù/$aàäˆêU¬ØŒ½Â‡~˜or"‘Hä·¾ŠbSÌvØuB˜åþcÁóUŽÚÄ>)uaô òØöNPÓ½âEŒLŒ…Nzg¦½ ‚0ú at·†÷£æ0à€JG±P¡(Uá,q„â4mzþüy¾é‰D"О|;V ý –¾\¶½{\­ØVún’5ÖM J(gA' ¡p÷¬• @¨›´!´ JM"Œ5wËQJçZ²C¶±'@TuB{ÈÒ·7P« ýZÀ-CßauÕ.BÊèÇü­o}+_ôD"‘¸=CÐÖžõäÑ„42ä…÷73VK‰§mÓS±£1?«‚zæåÀªZˆâD/–]õŒg9¥žD÷óÊâפ #÷wÏ%\Äý9@`M 5î šº$¿Õ3]ï¿ÿ~¾Ã‰D"1µ$[i‡#yX/à±üðqlP»Ÿ7é@åD½[c¥–±e²;ÆryU•xbžuÜ! »”§z—»©gü>^_ÂíÀ¡>³<µnH=]æã?žJú‰Ä£U†©ÛGMv9–=gâ¾ÑÙûý‡ü¹@ £V n,þ€¯,Çþ…¯Ú'ψO–®{2Cl?œÄB†Ïßqõ²¸ôØ)Pm€q}CuˆPkE¡’Pª¶zØ^¼xáop0ÑýŽ?bm§!nzn€Zb÷<- ßÙºzTAãžXÕ h@G^`ÐMp/HÓ@#N¯Q;b‡k9öÖ®©+oÄ´$=H$S8tq­H%Ù±o»;#,ÐÔG´­TJJÅár aƒÒi¢¥[cô\3g,11G“X R`ÿ¦·£f~§ÿ„e?ÑL&¹ e>Fm‘Ä&!# ‰D⦰–ÕcÛ€²2±³/ÔZø]¬>â–¬iߢ=^“Ø1+×ÒDÚ™ÙŠÙê¼\MÕGóPTŠGqköêW…2é(fHà8 «¤’Þ´PmOT×è´ã‚ƒ³)I$‰Dµž’Ž:è:í|/Áû:&âíõjPÂÔ›æÆÀ¨êϸ}J5Ú*ëÀ ª1°4õô‚ê|‹ºÛôlµŸ-f…IÇ Êf`| K|cP깦Ÿ`•‡„¤X €†ÀI’ ‘H$î˜68´¶hÅ ¸ŒoMTsJQM}¯å¥º€¦šq¯< ±yëPAl57×kº}ÜÖ‰mÄrÕUG¸ÚÉŠœ©W莓^—G+”‘ËÆ”𨈪 éÌGÒ‰D"±ƒðWQêi‡²°)†Ëô ½J]£*å§­1U³“Zm›øä´ŠÐÈÚ&oÞf€Ÿj³Œ\ñÍX å0-¦"ÁUMÛ41hTEÙšO²žø ’ଠ$‰D"¾ŠŒÅœ¡Ê…^BÚ ~Jn‰]%A€¥ŽXF>ô“·WÔz „ÊÃ¥"Ž?IóÎ™Ž¾”p˜.<-ÅËéCQEFí%\%¤™Ö JÇH2›¿2ˆtwšgÒ‰D"GW©Òõ+îBXq´ÃE™‘ótÄ˦ذ`­Y¨*¸ŒfÍrdS°GœÎ®¼ß†®Ñ’~Cï<'ý¯k6ȈÈr\Ô$ ¼?¨¢,ªMC ‰5Ð*)«ZкFF«U’ ‘H$¾ÐhÛcû5¥P¨Øgݯ اT¨æsô GÝõØGàÕ9Û×½,‚n¥³»"[+›)]ÿ hÉÆ ^ Õ<Š[B Ð Æ´Š†¿‰\ÀT1+ééVòYÃ…‚£Ë%=H$3ê{“ñ¼ì7G|KÝ6f›.qëÆÖÜ!D振þGÈ‘AXhކªæAHBvG–¾jÀv¡ †ÀÀx©Í;ž*Ù€sm#ry}Knóéiï¿ÿþÔ÷*2+!‘HÆV‡Î±* d‰_³ï F:vµ RoH°gA$%² ÇêÙð\õMc õ ’£ ÊXR†0Þ•†ª@"‘x‡Õêõ`+­àØJ#4þáQ»èX £ýibœ%Ç€qmÿ|ÎtìC 9Vg0c¾G­u^åŸ5ú§!\?ÞµCtº¬=ümÛCO[a@YÚÔ²»$ >úè£õß—’^‰D"ñvª2+¡JPl¤­U_×áãHêûÉs SÿèŠT•:z’–¬¬bØ«ÜùQõ^½åbøºç¥=*ó},í#á}ªŸVÜÙIjÀþHSކjÆ…ÜÎ…‰Î Áù]Jµ ‘H¼Ú€_r­.xn%ÌQ A¤¢/)åþ"oÈtK"Ö4t­×lâËL Ã’ŒÐªª>±¬XÒYÇ!êû2ÒÏHshì  —†à°ü²Ý y‹óte>%©0LR´ŠHQLÖ9·B S-H$‰ªÙÛ©À ÖŘm,’ I=*Í€& Møi "¢°:¦–N§·çEÇ”*í[l:•E†&gê°é”Àt“£m×{aª 2›Ôç[úÒ ¸÷ ÂT ‰Ä»Ê ȵ]Ú†«!v˜s˜Ú n•ÕWiþ6lðR&ªPæ¼3*7¨§b(‘£µ9=ƒðú^q¹Û{*ÂQŠˆ-QjIÁ;ÏL7Hµ ‘H¼{ªÀºŠ>yý›JŒ\zÊâ¨Ë¡iß0ü–tz…\éI†oêŠ]¹9s°‹Ú@5º¡ODô+¨šªóŽk];.`~žCj üÐvPpû6£½a˜c*TM¯ °k•TN¶ ‘H$v°rýÝßþzû(8O^áɱøZc<Š“µÞ@hF;bzÝ©K¦”`Nª=Ü:»_¯£äß×qü×Yû •,ÜS>X½Ý í„7¨Õ‚D"‘x‹T‡rbq`)<üÎׇ'O^Ç[Ž3lƒ¶ã€.xa•Þs䦕,Û)·§EoE"ÜÎÞ"Ga«Oˆ•1–sèׇj0éÃ;B¥UåR ¬—3‘H$îsEšÄ¶Š¾:|ó5ž¼zòÍ3=pº„›ù ÁltáÔz½¶,¦ºÓÏXüG†©¡çêëúì»2£( Åi»¸²Û¦9 %`Å;¯G\ŸâX_tŠ$بªÓGº¡³ádΧg–>µ û '‰ûÄóçÏw³/¿ù7;aš½ ®Y‰-^ -ú¦ˆ]º¼­ÏËrQZË9”'W+Žé=Ñr,§9éh &yUV8 £læ§®onßвÏý¸m`¶¹øºý|+T"‘¸7ÜvÍa'Ž‘MžG ØŒ)ýŒ]l¿» D4`ÁÙÎKc£»^5ûïÿŽ}0TSP¢wooðäKÊý‚%‰Ä…¶Š6 êq°^£Ú¯s¤®AÏA#,²xöxèÑjnrÉD`Hy°›°°À÷*1aKÞ“šˆ«1(yÄõ ­šCCj¢*ß©ëCMiFº-ÞÏž=˶‰DâQª ‚.Ä5‘ }Ái®•É[ãºèB(•nÏ-ŽDÌžô†ã–Œô&ë”üCt5þëëâÜ·73²{KȨÕ»‰§¤="‰$ŒO+•Qx ¼ëÉP¾D"‘¸N`A†¿ASX‰Jêfì émçe Ï8” *mK$ø q‘Ðv^{ëÙ&ÒreÁPøbºCÓ O¡ŸŠýÄTªXDççÑxëºÂ¡ÛdÒ Œ¥6tçGLž?‘H$¦ðþ“ÿº–|J“¿c±Ec]G¦áƒ‡•òÖxXÂ!’ý@±5/WïK$‰ÄhÁ§[L—C1·9Y.Çܬ2Q+ã\9>¨'²à 2.T¢I‰h4“í·Ë)‚òUØÓ;Ô)JOÊœ_&´'¸8LŒ§4Î…A\¡x8 {PPE•pZ‰J} ‘H$®R äÊL,Âf¸G{§HÔ;Jö.øx:ö«í°·ó×iÊD3SM\-ìq¡—ÞJY.¥gŸ‘pS§ˆã O°Dô®{[”æVl‡¤š¿é•3f"nHìÃ[”¨’-µw¡¨ÍÅX×Ío¬uNˆ½Ó£m6ÝŽ‰jÂþ^Q]aÓj%qf êø… f› vÀ/ÓgV»ÇjK¸£ä.µCís-kžÕ° *H¿aØ *²-®„ÒӤހµÏÔ$µ–"c±×·ó‹ú3h6PÀ̤ï{Î|Il2R+HÜ ž>}úІ”n‚Ä€•Õ»Ä}lSñn@f¯àÒM&_Ñ”ARÇs1ÐQ q%°apæM $œ)¶dzgD-†è$Ô èö$À¸Ê/FÖ6UÑîÜ5ÎpΩcê!JàÚIƒ­RQSH<d[íÄÝë‹E] ¼£#ìGYñê–ì#Cü²4÷+ÿ²B/hÅÑD¶u ¨êÐve:•e܈æfôz>3 wÛëçÆ~+ÙBó@s´»Räêu’Q}„÷Øé(ñ¸ñ@ŒòìÓ‘¸Í@®Ç+ÑvC«D,¹z‘Ñùi†„b­“°ztòzÓ¿vctªÉQC¶RÑšhKDZ·‹jðݼ¨ŽX×p î`tï)½›eqò)L$‰ÄNŽ ÍËãY! CŒ*÷„cRáœ\Ö7 ,sr•- ]”£ªã#äÖCôûh]/KSåvHõ—pe6BNiÉäÜ ^ÈZý”9Ò!ƽ TgD_(Þ Ñ(Y¯Î¸=©0Õ·D"‘HìR¶–õÍ:~twµÉåqÈœ0ùÂÂÞ^Doß×MýZCzš;ìKjÙ ƒYû6ù¥ƒ©*+¢Î'C @“¨4¡Öz]²Wdšþʆ¿g–¿G{$阽“ZÚa¾f"‘H$v²º ¦p+)‡ÚùþWCnp×€(ìn[ýhëõôV1Fœ‰na ²óVŒcJ™Ø¡¢Û òÙ¨g÷Ð_*‘H$Þ}€²Úœlõ{­±ÐËÚ3m à ¥)ŽQ®`®P'ˆµÔÅö+†jü\¢áûõY†‰tTzJa—!>Ð1¸]%Ð’ñû¾2)ÄβA´\I%Ãsi¦ÑD&‰D"l?®”@c±6{t¢½-*ãw!ì†Mö7% iZ®´Š$bµ+©Õ÷A+Î73´­ lÊ“‘ñÆvÚ”Ö@„vöûàZȸz‡_ìd0"Ú™wï‰D"q5 ŠSÝÕ¶kLä6ë°gß±”Dñ« OpþÖomy#ØuÿÈ®ŽB]\Ym¹Ôº÷)íeõÆM]•np7Z„WGØ¡@f%mZÖÖ ªVõì¦Bxxxï½÷ÖÏŸ|òIóýúMóg"ñp¸‚^ÒJSÓ7`·é–¾ò3K´ú¬A&´{:„D%Àú†¢wQU' k…¬4T÷N†ÛUxcÕ¹çn æoJ3õ,Ã)줄à 5:$ö0­3&÷¨ |òÉ'gI/•u³œ±ÄÃÑú«@;”k˜5…±“¡ÿª"Ú©«ÔJZšÝÌÙì Î×ÜGP€ï<|ÝY^1*D¨6Ù CýãòE‰ÄCÑ$=Ðë© $Þ=á²(&ÈLǻͣÇMâÕ²G[+™ÔÌá0Ò¯¯1вéœêÄÑô`ÐÒp_Cèj C*wÕE Ыb˜ BâmU‰‡AP[ø·uù`”œk¤„ÖpÛTɯXiÊÞx9V(Úl€ªà=´mä%AÒÏuøCDˆAíDP¯ ìãã-ìþÈö\›;F…3Ç è›NEzúÏmô›D"‘H„XFSà!`¼ªr"8ŸÍÚ_ú¶¤ß ×xв`˜ì .0ijM4eÑàÆ<Ç6mß®Ã,¡ÆŒŠð›ŠM¬¢FéŒLSÏe°ªƒä] ÍÙÑ=?Ùï8ñÖÃ-H$ŒNP-¶‡Ë²® kÚÑæT9oeæ ×s=48Öì¦çôéJÿ ÊÃÑ“JÙÀ”ÎÕ›¾üúûŠEú2šG2ŒùDJ£Zaê*e@lª ‰Ô ‰@-)»õàEÉ÷‡jÃìƒäï¹®FŽƒA8jBW8¢Aök¨æÇ¬º@5ßoê êú JgßK^&âÿâ;Ò§Ø!ó©Øé0ú@L3‡’"i“a}…©$¢¤wÂR'H<@€Ýbª0Q™7¸öD¢Æ³gÏ^¼x‘óx”\Ai[/8*’·;­y8”Ýî×tºÅié ¥IÐdÚF\Ð>Cߟ¨Ê@¨ê0+zƒFv<þNV§×?àU)M%¦àaÐ:ØÑ¯_ŸJ)§t$‰ÄyXEº¹?'ÐoÜ$óò†ž[ªÜ^®ê°mËÛômÆp¬£¬J4öñT}̰ k«'·ö=-$NgLßÛšº€ˆY’5O§×¯^½.¥œN§|±‰DbÍ*Ê€BPj©já7—¥¶þ†›±¿qOõ¨aõŒ|å,mÍ#\?T3zax¬]-Œ¨V(­ZЭº²~¤¯#Uðë/óù§_xùåWùb'‰Ä,êUT—_ǽË7ìïØÕõéYy’Á:HhºåJá5Tê*;tÌpÆ |÷J´dDQÂ|K¡YˆsýFG T›T­¨îgå ‡ðÕ—_þÙ¯O_¿üºdQ¹D"‘˜D½ŠþŽ*pø»؉'8^@™®sÐpÓû äï¡(è…J[gpsasõ €Š^±ò!…€.°Þ j:+g}¤94šADåî$%³MæPî÷WîÝ߀ڰúoºilÃ9õ~øãÿô?þü_¼|ù›Ÿþø³ðþþ—/¿zùÕW§W<È¥É7—ôDÊÒÚ‹»¤© ©#¬4*S€ºõ ¼08”‚Rç Yç2'ö\ûƒ[%«"3/ƒ_FN%†ôØ•åÈ4GÞ?•(]/ä‡íZP,—½=KhUß5©™kŽ*O—q]nÕeýoý*¥àp9= ç/p8 ,ßÊó²MÜ©œM’'6h'õTרObûtÚZ1/EP¶¿—Ë¥|Tå9?Tr¶ÏŸ×ûP ¿RÔ'd9:Å™xöÄ-“¾|ٽϗ™/Õ ciVrËa}@¶'E‹ê:×›âm=­/ÅdIsÐ{æÅL^X[Ô¹è€öòvOµœÙþUßìŽ)¾LëõŬì"Þúõ6l–¹ZÝãrBhµ€Ugÿ2øÅg_þòç_þÃ÷ÿp]EÿÇÿóŸ«{4 ;T'¯¢CçÖ«ª„ƒ]/Ø|ô Tñí¥~ô B6)}l¤{uU\k?öüÈv)‘ÐüzŠM&&‹3EæËÒÂfæ£s9xÒT„€ôBh·zÛðg?ûüÇö׿ùõ×ú¯~òOÿögŸý곟ýòtâéõ‰,ç{Ӻ屫r%ÖW—ëÛ×/–Úƒ†EZ¢¬"êòÇåCýâToý*þ—›ò|4ïÆ&ôûF)1ÉÒ-·b ¶eô\«ìpyw!¤r³Ú®B¢êcº-vµà_EÑ鲆K} âeÙ8pÖζÁÐÈÃõ§ÏJÀéüïÓi™ßj6åÍ¡à€Ãá,ç€ÃzS…²PJ{ïVÁÎf±n´9õ9âR¤ƒŠ³NÌ€˜þU­+•É9—šÀrôê*Ç*þ°Èʳ¼_'¹šŒËO—Î2s¾Çgýt*…ä‰ëÛº=ôÔåÌRÂÁ£DÉR?å•”mÞz1¡•Ö«Íÿ¥ ¤Æ ~Rº§Ëc³ªþò½h^ÞM3ªo)ÔÀõñú›ÔÞĺûÓŸ|öW?þüï½÷·ÖU´¶ ·•ýh[®“µãá­ÒË»\Ó3‚Ð/ô·Öo š=–¬ X»+vÍ‹<ÛÜïŸGØåÐ8xMR ƒÏP›ìÁ§¨ÕŸÿð§ò/ÿôx|ò“ú—ñóýðgÿæÏŠÍN,­‘7Ö‹äZ!ä(¥v`éG¨ å~iÀÌÔ©6(ìQ @ ‚m”ÕªºÙt¨­ãfa]L—eqÚÖ¯“Ô_Ø41­Åí"g*³~(HV3^бÅË(oôzär–•Ò}Žk9Úh”u²ŠËlnv0KoÞõ÷\ûõCeªètˆ"ë]°æ‚v¨yK¶yÛêÏró$ÃîC†ÞŽÈEu2uù_{‹J´z4ëw'È— Ig²Q Mm¾›ÔåÊæˆ×\è=åóO¿øôÓ_ÉU´ü^'EYØö2P{{o–Pñ?ÄF,éG‚#ïû€AT¡mŽSᛵìD´Œ„úгXi‹îzB8>꡸;¨æ.—G£RÂ/>ûâ/~ôóÃ_þêå—Ÿ¿üôÓ_þäG]½zp¨]_h $Y&§êÚ0; ¸3ÿÔøÖNàø‚Y•g•2ÂZ`›T±’æn ÙžHR.‡ZäÿjÚ:²"+R¼{&®y?–z«ø»Ï®•j‹yÉœðIê7÷Mu$Se,Çwkÿpá¹8\Xܱa—²~ý›—_ÿæå×r-¿wìêè÷Y«…@ðýÚa ÕŠÓÅò5•sŒÙuS ý5žªôÂF“£a–²•1ËP!euSØÏ1Æ Áeúè¦ Úk€â¦2BFê(ºùÕI#]X†—‰¾×¶ÔŠÅ®OÊéo”WO:DxÃ֣ׄ­ ºRÐ× Ù<Ä–‚åwYP¢¼.ßø5¾A@~ÅÌÃ`]ÕŽè–êõf#X8±—ª·[£À˜«Rß?6ϦËv\ÍÕªk'ë%–Š>ß™qEk)+E>êón[ƒÚ¢¢š>0Ôæè‚ˆ\CÂXª242Ò«™?:¯[qÐòÚM@3q6+2ØP»à*BÊåT%òšB5”³U__ ÐÅd·³0^D¼$reW1OðoÿžwÔAÜßhˆ+–Å¢SPhñ­"ÕÉ "ÞÒ"YKÔK³Nìô¢jŽkBxÏ'Œ«÷ï©ÜrŠœ€ªéÅÝ6P^§Ò•>q§˜P»F`Î-êJú¾Ñna³¦â¨²¶Ò=i0u:ûùt.¯{Y^—'WØG0Y3å-ÃÞ¤U”xr2bVÕøåõó™û,Lèo”ó`ß‘UcÍRî„ûELЭy­ÀØò¢ÔšŸ°íT³óߘk$\ÙoVéu•Da™]²•¶w°¬ˆ ¨„ê`…ŸyÔi=Ì/ÍíÊÇ~2·–·j—·[¬ÀØøt—!(`…}LúÍPnŠáÓ;b†NÙjyJnB–5JÑü [> ) ZZ@Ù±nìãŠK™3^€ª$®y¨JØe0ÞýsoéGaÿËëlŠêöTš0F®[K¼~‰ì™¾N—D‚žaœÆðæ|ªø¦ÃÅk–ôçÆ£ïdëoÛí³Ã=Wm½øÖµì­ŸøYÚ/’æý30U·–ÞÄì š"RØO»L¯Âú¹æ4‰à=7ºö£h³s¸…)I¿±-Î&°?¯ŒH¨ªo— ¹åùÂá|¨Ø8ØT0ý’¤¾Y…H3_× Äot))lS„]êÔ¾‡×1m@ê÷dìtÜG} LdÛ®÷„~~¼*‡×ÚåbfK}Þz Cͽ\Öúíf]C«òüç7ùêw^¿Vè Î’Nœ_e¸¿Ü{Ë©Q4S—sl´×~Ȱ12|F´Á”œœ{Ž`·Ê× •¾’|'ç­C\Ò|- ¿Ñ¨Ð‡ƒÁ4­¢./˜D’µ‰Û  }öߘojå ÈE„Ð~ oP$W\ðaÇ+v‹×´¥k÷œÆTå5¹Ž­ãct¾DÖ/ V#ƒY}Ú¹kJä/co?çúc¨ ¦åŽ C÷Ìh\\Y2¹;_£-õ€‘({]ð –JÕf¯ÓV42¢ ´ÛßSLñÀ‹v 175(žžðk8w{ßï©g)tx\«#R-W.kbÕ¢AÄ#~Õ¦òÚä)K º‚/}ü2F7õ³ŒÍ²bÏs™ Œz96¥¾mFfH­ˆ4òÔfT$0G/ÒH/m­²€¾Eñ¬r,™Úß¹ÔpGìähUQfeµ]:ÿÎ!$!xÛ,Õ–š*7Ò°`è*¦S*KðÉ‚©×·†Ÿ1€ö;ó"¬æAÙ†1×D´.œº@¼Ân«ž šv}’Ã@=ÓÜ𳂠‘/tš]¢S(×ÓðrñšgbãfàG6L‘ã4óoî» ˰„¬‡`^ùU<.0M> Ñ­(¾e‹×å_›h¸\W-µÃ¶QXÜ|JáXo}±½qú{P”©H07G×”% *²Â’ŠAè5ÒVø°>‹Š0(®ÎZ YB%u|‹€…Œ¬Ô}œûúœQ{…•îF+Á´e-±CGSiâ‘ ³ˉQÈ Ì¶rpDû@¥ÔlE·@¬<}ív¤Šc”ePnˆ^ÝÍHd8öЕ%”±NƒNt®¹Ê B[ÔZ¹†Ú¸Ä" #9e«caD††îf¸Yc‚ P¸æD× Á³Yy%ãóêùWÌb¯Ñ¯¡{À¢Ò5Á¾,åIá“)¥EôÃÍ–g øº¸¹¿Ã7çpÖoã(ëLh ڣʙ»48íwT³k·½Üd²’ö”ÅÑ0š0Ì]˜óº¥O!ª+1Ö O–•k &…}€M«&]¯ˆÚ}ˆ¶&µHg¯¶áèÑ€>uÓûÿÙ{m²K·>IEND®B`‚Test-Unit-0.25/examples/README0000644000175000017500000000103010301431446016106 0ustar mca1001mca100100000000000000This directory contains examples of the framework in use. It's a bit out of date now... tester.png: ----------- This is a screenshot of the GUI running (view with a PNG viewer, e.g., your favorite web browser). Also visible on the SF screenshot page. patch100132*, fail_example.pm ----------------------------- Very mysterious. They get used by 'make test' via t/try_examples.t though. fail_example.pm is supposed to be an example for TestDecorator and Setup. You can run it via: perl -I../lib/ ../TestRunner.pl fail_example Test-Unit-0.25/t/0000755000175000017500000000000010324277074013673 5ustar mca1001mca100100000000000000Test-Unit-0.25/t/tlib/0000755000175000017500000000000010324277074014625 5ustar mca1001mca100100000000000000Test-Unit-0.25/t/tlib/TestTest.pm0000644000175000017500000001671407502136573016755 0ustar mca1001mca100100000000000000package TestTest; use strict; use base qw(Test::Unit::TestCase); use TornDown; use WasRun; use Test::Unit::Error; use Test::Unit::Failure; use Class::Inner; use Error qw/:try/; sub verify_error { my $self = shift; my ($test) = @_; my $result = $test->run(); $self->assert_num_equals(1, $result->run_count()); $self->assert_num_equals(0, $result->failure_count()); $self->assert_num_equals(1, $result->error_count()); $self->assert(! $result->was_successful()); } sub verify_failure { my $self = shift; my ($test) = @_; my $result = $test->run(); $self->assert_num_equals(1, $result->run_count()); $self->assert_num_equals(1, $result->failure_count()); $self->assert_num_equals(0, $result->error_count()); $self->assert(! $result->was_successful()); } sub verify_success { my $self = shift; my ($test) = @_; my $result = $test->run(); $self->assert_num_equals(1, $result->run_count()); $self->assert_num_equals(0, $result->failure_count()); $self->assert_num_equals(0, $result->error_count()); $self->assert($result->was_successful()); } # test subs sub make_dummy_testcase { my $self = shift; my $sub = pop; my $method_name = shift || 'run_test'; my $test_name = (caller(1))[3] . '_inner'; Class::Inner->new(parent => 'Test::Unit::TestCase', methods => { $method_name => $sub }, args => [ $test_name ]); } sub test_case_to_string { my $self = shift; $self->assert(qr"test_case_to_string\(TestTest\)", $self->to_string); $self->assert($self->to_string() eq "test_case_to_string(TestTest)"); } sub test_error { my $self = shift; my $error = $self->make_dummy_testcase( sub { Test::Unit::Error->throw(-object => $self); } ); $self->verify_error($error); } sub test_die { my $self = shift; my $fail = $self->make_dummy_testcase(sub { my $self = shift; die "died" }); $self->verify_error($fail); } sub test_fail { my $self = shift; my $fail = $self->make_dummy_testcase(sub { my $self = shift; fail() }); $self->verify_error($fail); } sub test_failure { my $self = shift; my $failure = $self->make_dummy_testcase( sub { my $self = shift; $self->assert(0); } ); $self->verify_failure($failure); } sub test_failure_exception { my $self = shift; try { $self->fail; } catch Test::Unit::Failure with { 1; } otherwise { $self->fail; } } sub test_run_and_tear_down_both_throw { my $self = shift; my $fails = Class::Inner->new( parent => 'TornDown', methods => { run_test => sub { throw Test::Unit::Error -object => $_[0]; }, tear_down => sub { my $self = shift; $self->SUPER; die "this tear_down dies"; }, }, args => [ 'test_run_and_tear_down_both_throw_inner' ], ); $self->verify_error($fails); $self->assert($fails->torn_down()); } sub test_run_and_tear_down_both_throw2 { my $self = shift; my $fails = Class::Inner->new( parent => 'TornDown', methods => { run_test => sub { die "this run_test dies"; }, tear_down => sub { my $self = shift; $self->SUPER; throw Test::Unit::Error -object => $_[0]; }, }, args => [ 'test_run_and_tear_down_both_throw2_inner' ], ); $self->verify_error($fails); $self->assert($fails->torn_down()); } sub test_runner_printing { my $self = shift; $self->assert("1.05" eq (1050 / 1000)); } sub test_setup_fails { my $self = shift; my $fails = Class::Inner->new( parent => 'Test::Unit::TestCase', methods => { set_up => sub { my $self = shift; throw Test::Unit::Error -object => $self; }, run_test => sub {}, }, args => [ 'test_setup_fails_inner' ], ); $self->verify_error($fails); } sub test_success { my $self = shift; my $success = $self->make_dummy_testcase(sub {shift->assert(1)}); $self->verify_success($success); } sub test_tear_down_after_error { my $self = shift; my $fails = Class::Inner->new( parent => 'TornDown', methods => { dummy => sub {} }, args => [ 'test_tear_down_after_error_inner' ], ); $self->verify_error($fails); $self->assert($fails->torn_down()); } sub test_tear_down_dies { my $self = shift; my $fails = Class::Inner->new( parent => 'Test::Unit::TestCase', methods => { tear_down => sub { die "this tear_down dies" }, run_test => {} }, args => [ 'test_tear_down_dies_inner' ], ); $self->verify_error($fails); } sub test_tear_down_fails { my $self = shift; my $fails = Class::Inner->new( parent => 'Test::Unit::TestCase', methods => { tear_down => sub { Test::Unit::Error->throw( -text => "this tear_down throws an Error" ); }, run_test => {} }, args => [ 'test_tear_down_fails_inner' ], ); $self->verify_error($fails); } sub test_set_up_dies_no_tear_down { my $self = shift; my $fails = Class::Inner->new( parent => 'TornDown', methods => { set_up => sub { die "this set_up dies" } }, args => [ 'test_set_up_dies_no_tear_down_inner' ], ); $self->verify_error($fails); $self->assert(! $fails->torn_down()); } sub test_set_up_throws_no_tear_down { my $self = shift; my $fails = Class::Inner->new( parent => 'TornDown', methods => { set_up => sub { Test::Unit::Error->throw( -text => "this set_up throws an Error" ); } }, args => [ 'test_set_up_throws_no_tear_down_inner' ], ); $self->verify_error($fails); $self->assert(! $fails->torn_down()); } sub test_was_not_successful { my $self = shift; my $failure = $self->make_dummy_testcase(sub { shift->fail }); $self->verify_failure($failure); } sub test_was_run { my $self = shift; my $test = WasRun->new("WasRun"); $test->run(); $self->assert($test->was_run()); } sub test_was_successful { my $self = shift; my $success = $self->make_dummy_testcase(sub { shift->assert(1) }); $self->verify_success($success); } sub test_assert_on_matching_regex { my $self = shift; my $matching_regex = $self->make_dummy_testcase (sub { my $self = shift; $self->assert(scalar('foo' =~ /foo/), 'foo matches foo (boolean)'); $self->assert(qr/foo/, 'foo', 'foo matches foo (Assertion::Regex)'); }); $self->verify_success($matching_regex); } sub test_assert_on_failing_regex { my $self = shift; my $matching_regex = $self->make_dummy_testcase (sub { my $self = shift; $self->assert(scalar("foo" =~ /bar/), "Should not have matched!"); $self->assert(qr/bar/, "foo"); }); $self->verify_failure($matching_regex); } sub test_assert_with_non_assertion_object { my $self = shift; my $obj = bless {}, 'NonExistentClass'; $self->assert($obj, "Object should eval to true"); } 1; Test-Unit-0.25/t/tlib/WasRun.pm0000644000175000017500000000045507374760234016414 0ustar mca1001mca100100000000000000package WasRun; use strict; use base qw(Test::Unit::TestCase); sub new { my $self = shift()->SUPER::new(@_); $self->{_TornDown} = 0; return $self; } sub run_test { my $self = shift; $self->{_WasRun} = 1; } sub was_run { my $self = shift; return $self->{_WasRun}; } 1; Test-Unit-0.25/t/tlib/OverrideTestCase.pm0000644000175000017500000000024207374760234020402 0ustar mca1001mca100100000000000000package OverrideTestCase; use strict; # Test class used in SuiteTest use base qw(OneTestCase); sub new { shift()->SUPER::new(@_); } sub test_case { } 1; Test-Unit-0.25/t/tlib/InheritedInheritedTestCase.pm0000644000175000017500000000024207374760234022372 0ustar mca1001mca100100000000000000package InheritedInheritedTestCase; # Test class used in SuiteTest use base qw(InheritedTestCase); sub new { shift()->SUPER::new(@_); } sub test3 { } 1; Test-Unit-0.25/t/tlib/SuiteTest.pm0000644000175000017500000001231107401526733017113 0ustar mca1001mca100100000000000000package SuiteTest; use strict; use base qw(Test::Unit::TestCase); use Test::Unit::Result; use Test::Unit::TestSuite; use TornDown; use WasRun; require Test::Unit::Assertion::CodeRef; my %method_hash = (runs => 'run_count', failures => 'failure_count', success => 'was_successful', errors => 'error_count',); sub new { my $self = shift()->SUPER::new(@_); $self->{_my_result} = undef; $self->{__default_assertion} = Test::Unit::Assertion::CodeRef->new(sub { my $arg_hash = shift; for (qw/runs failures errors/) { next unless exists $arg_hash->{$_}; my $method = $method_hash{$_}; my $expected = $arg_hash->{$_}; my $got = $self->result->$method(); $expected == $got or die "Expected $expected $_, got $got\n"; } if (exists $arg_hash->{'success'}) { my $method = $method_hash{'success'}; my $expected = $arg_hash->{'success'}; my $got = $self->result->$method(); $expected && $got || !$expected && !$got or die "Expected ", $expected ? 'success,' : 'failure,', ' got ', $got ? 'success.' : 'failure.', "\n"; } 1; }); return $self; } sub basic_assertion { my $self = shift; $self->{__default_assertion}->do_assertion(ref($_[0]) ? shift : {@_}); } sub result { my $self = shift; return $self->{_my_result}; } sub set_up { my $self = shift; $self->{_my_result} = Test::Unit::Result->new(); } sub suite { my $class = shift; my $suite = Test::Unit::TestSuite->empty_new("Suite Tests"); $suite->add_test(SuiteTest->new("test_no_test_case_class")); $suite->add_test(SuiteTest->new("test_no_test_cases")); $suite->add_test(SuiteTest->new("test_one_test_case")); $suite->add_test(SuiteTest->new("test_not_existing_test_case")); $suite->add_test(SuiteTest->new("test_inherited_tests")); $suite->add_test(SuiteTest->new("test_inherited_inherited_tests")); $suite->add_test(SuiteTest->new("test_shadowed_tests")); $suite->add_test(SuiteTest->new("test_complex_inheritance")); return $suite; } # test subs sub test_inherited_tests { my $self = shift; my $suite = Test::Unit::TestSuite->new("InheritedTestCase"); $suite->run($self->result()); $self->basic_assertion({success => 1, runs => 2}); $self->assert($self->result()->was_successful()); $self->assert(2 == $self->result->run_count); } sub test_complex_inheritance { my $self = shift; eval q{ package _SuperClass; use base qw(Test::Unit::TestCase); sub test_case { my $self = shift; $self->assert($self->override_this_method ); } sub override_this_method { 0 ; } package _SubClass; use base qw(_SuperClass); sub override_this_method { 1 ; } }; die $@ if $@; my $suite = Test::Unit::TestSuite->new("_SubClass"); my $result = $self->result; $suite->run($result); $self->assert($result->was_successful()); $self->assert(1 == $self->result->run_count); } sub test_inherited_inherited_tests { my $self = shift; my $suite = Test::Unit::TestSuite->new("InheritedInheritedTestCase"); $suite->run($self->result()); $self->basic_assertion(success => 1, runs => 3); $self->assert($self->result()->was_successful()); $self->assert(3 == $self->result()->run_count()); } sub test_no_test_case_class { my $self = shift; eval { my $suite = Test::Unit::TestSuite->new("NoTestCaseClass"); }; $self->assert_str_equals("Class NoTestCaseClass was not a test case or test suite.\n", "$@"); } sub test_no_test_cases { my $self = shift; my $t = Test::Unit::TestSuite->new("NoTestCases"); $t->run($self->result()); $self->basic_assertion(runs => 1, failures => 1, success => 0); $self->assert(1 == $self->result()->run_count()); # warning test $self->assert(1 == $self->result()->failure_count()); $self->assert(not $self->result()->was_successful()); } sub test_not_existing_test_case { my $self = shift; my $t = SuiteTest->new("not_existing_method"); $t->run($self->result()); $self->basic_assertion(runs => 1, failures => 1, errors => 0); $self->assert(1 == $self->result()->run_count()); $self->assert(1 == $self->result()->failure_count()); $self->assert(0 == $self->result()->error_count()); } sub test_one_test_case { my $self = shift; my $t = Test::Unit::TestSuite->new("OneTestCase"); $t->run($self->result()); $self->basic_assertion(runs => 1, failures => 0, errors => 0, success => 1); $self->assert(1 == $self->result()->run_count()); $self->assert(0 == $self->result()->failure_count()); $self->assert(0 == $self->result()->error_count()); $self->assert($self->result()->was_successful()); } sub test_shadowed_tests { my $self = shift; my $t = Test::Unit::TestSuite->new("OverrideTestCase"); $t->run($self->result()); $self->basic_assertion(runs => 1); $self->assert(1 == $self->result()->run_count()); } 1; Test-Unit-0.25/t/tlib/BadSuite/0000755000175000017500000000000010324277074016325 5ustar mca1001mca100100000000000000Test-Unit-0.25/t/tlib/BadSuite/BadUse.pm0000644000175000017500000000007307375231005020022 0ustar mca1001mca100100000000000000package BadSuite::BadUse; use TestSuite::NonExistent; 1; Test-Unit-0.25/t/tlib/BadSuite/SyntaxError.pm0000644000175000017500000000011207375231005021151 0ustar mca1001mca100100000000000000package BadSuite::SyntaxError; sub broken_method { my $self = } 1; Test-Unit-0.25/t/tlib/OneTestCase.pm0000644000175000017500000000026007374760234017344 0ustar mca1001mca100100000000000000package OneTestCase; # Test class used in SuiteTest use base qw(Test::Unit::TestCase); sub new { shift()->SUPER::new(@_); } sub no_test_case { } sub test_case { } 1; Test-Unit-0.25/t/tlib/ListenerTest.pm0000644000175000017500000000373607402737001017613 0ustar mca1001mca100100000000000000package ListenerTest; # Test class used in SuiteTest use base qw(Test::Unit::TestCase Test::Unit::Listener); use Test::Unit::Result; sub new { my $self = shift()->SUPER::new(@_); $self->{_my_result} = 0; $self->{_my_start_count} = 0; $self->{_my_end_count} = 0; $self->{_my_failure_count} = 0; $self->{_my_error_count} = 0; return $self; } sub add_error { my $self = shift; my ($test, $t) = @_; $self->{_my_error_count}++; } sub add_failure { my $self = shift; my ($test, $t) = @_; $self->{_my_failure_count}++; } sub end_test { my $self = shift; my ($test) = @_; $self->{_my_end_count}++; } sub set_up { my $self = shift; $self->{_my_result} = Test::Unit::Result->new(); $self->{_my_result}->add_listener($self); $self->{_my_start_count} = 0; $self->{_my_end_count} = 0; $self->{_my_failure_count} = 0; } sub start_test { my $self = shift; $self->{_my_start_count}++; } sub add_pass { } # the tests sub make_dummy_testcase { my $self = shift; my $sub = pop; my $method_name = shift || 'run_test'; Class::Inner->new(parent => 'Test::Unit::TestCase', methods => { $method_name => $sub }, args => [ $method_name ]); } sub test_error { my $self = shift; my $test = $self->make_dummy_testcase(sub {die}); $test->run($self->{_my_result}); $self->assert(1 == $self->{_my_error_count}); $self->assert(1 == $self->{_my_end_count}); } sub test_failure { my $self = shift; my $test = $self->make_dummy_testcase(sub {shift->fail()}); $test->run($self->{_my_result}); $self->assert(1 == $self->{_my_failure_count}); $self->assert(1 == $self->{_my_end_count}); } sub test_start_stop { my $self = shift; my $test = $self->make_dummy_testcase(sub {}); $test->run($self->{_my_result}); $self->assert(1 == $self->{_my_start_count}); $self->assert(1 == $self->{_my_end_count}); } 1; Test-Unit-0.25/t/tlib/NoTestCases.pm0000644000175000017500000000042007374760234017360 0ustar mca1001mca100100000000000000package NoTestCases; use strict; use base qw(Test::Unit::TestCase); sub new { my $class = shift; my ($name) = @_; my $self = bless {}, $class; my $a_test_case = $self->SUPER::new($name); return bless $a_test_case, $class; } sub no_test_case { } 1; Test-Unit-0.25/t/tlib/InheritedSuite/0000755000175000017500000000000010324277074017552 5ustar mca1001mca100100000000000000Test-Unit-0.25/t/tlib/InheritedSuite/Simple.pm0000644000175000017500000000026507401526733021345 0ustar mca1001mca100100000000000000package InheritedSuite::Simple; use strict; use base qw(Test::Unit::TestSuite); sub include_tests { 'Success' } sub name { 'Simple inherited suite' } 1; Test-Unit-0.25/t/tlib/InheritedSuite/OverrideNew.pm0000644000175000017500000000042207401526733022340 0ustar mca1001mca100100000000000000package InheritedSuite::OverrideNew; use strict; use base qw(Test::Unit::TestSuite); sub new { my $class = shift; my $self = $class->SUPER::empty_new('Inherited suite overriding new()'); $self->add_test(Test::Unit::TestSuite->new('Success')); return $self; } 1; Test-Unit-0.25/t/tlib/InheritedSuite/TestNames.pm0000644000175000017500000000135707401526733022022 0ustar mca1001mca100100000000000000package InheritedSuite::TestNames; # This class is probably overkill :-) use strict; use base 'Test::Unit::TestCase'; use InheritedSuite::Simple; use InheritedSuite::OverrideNew; use InheritedSuite::OverrideNewName; sub test_names { my $self = shift; my $simple = InheritedSuite::Simple->new(); $self->assert_str_equals('Simple inherited suite', $simple->name()); my $override_new = InheritedSuite::OverrideNew->new(); $self->assert_str_equals('Inherited suite overriding new()', $override_new->name()); my $override_new_name = InheritedSuite::OverrideNewName->new(); $self->assert_str_equals('Inherited suite overriding new() and name()', $override_new_name->name()); } 1; Test-Unit-0.25/t/tlib/InheritedSuite/OverrideNewName.pm0000644000175000017500000000046007401526733023143 0ustar mca1001mca100100000000000000package InheritedSuite::OverrideNewName; use strict; use base qw(Test::Unit::TestSuite); sub new { my $class = shift; my $self = $class->SUPER::empty_new(); $self->add_test(Test::Unit::TestSuite->new('Success')); return $self; } sub name { 'Inherited suite overriding new() and name()' } 1; Test-Unit-0.25/t/tlib/TornDown.pm0000644000175000017500000000060307374760234016742 0ustar mca1001mca100100000000000000package TornDown; use base qw(Test::Unit::TestCase); sub new { my $self = shift()->SUPER::new(@_); $self->{_TornDown} = 0; return $self; } sub tear_down { my $self = shift; $self->{_TornDown} = 1; } sub torn_down { my $self = shift; return $self->{_TornDown}; } sub run_test { my $self = shift; my $e = new Test::Unit::Error(); die $e; } 1; Test-Unit-0.25/t/tlib/WillDie.pm0000644000175000017500000000065207427575205016526 0ustar mca1001mca100100000000000000package WillDie; use Error; use base qw(Test::Unit::TestCase ExceptionChecker); sub test_dies { my $self = shift; $self->check_errors( 'Died' => [ __LINE__, sub { die; } ], 'BANG' => [ __LINE__, sub { die "BANG"; } ], ); } sub test_throws_error_simple { my $self = shift; $self->check_errors( 'BANG!' => [ __LINE__, sub { Error::Simple->throw("BANG!"); } ], ); } 1; Test-Unit-0.25/t/tlib/TestAssertionCodeRef.pm0000644000175000017500000000055507374760234021235 0ustar mca1001mca100100000000000000package TestAssertionCodeRef; use strict; use base qw(Test::Unit::TestCase); sub test_case_to_string { my $self = shift; $self->assert(sub { my $self = shift; $self->to_string eq shift; }, $self, "test_noy_to_string(" . ref($self) . ")"); } sub test_with_a_regex { my $self = shift; $self->assert(qr/foo/, 'foo'); $self->assert(qr/bar/, 'foo'); } 1; Test-Unit-0.25/t/tlib/BadSuitesTest.pm0000644000175000017500000000114607375231005017704 0ustar mca1001mca100100000000000000package BadSuitesTest; use strict; use Test::Unit::TestCase; use Test::Unit::TestRunner; use base 'Test::Unit::TestCase'; sub test_suite_with_syntax_error { my $self = shift; my $runner = Test::Unit::TestRunner->new(); eval { $runner->start('BadSuite::SyntaxError'); }; $self->assert(qr!^syntax error at .*/SyntaxError\.pm!, "$@"); } sub test_suite_with_bad_use { my $self = shift; my $runner = Test::Unit::TestRunner->new(); eval { $runner->start('BadSuite::BadUse'); }; $self->assert(qr!^Can't locate TestSuite/NonExistent\.pm in \@INC!, "$@"); } 1; Test-Unit-0.25/t/tlib/Success.pm0000644000175000017500000000022007401233023016551 0ustar mca1001mca100100000000000000package Success; use strict; use warnings; use base 'Test::Unit::TestCase'; sub test_success { my $self = shift; $self->assert(1); } 1; Test-Unit-0.25/t/tlib/AllTests.pm0000644000175000017500000000371210273475542016724 0ustar mca1001mca100100000000000000package AllTests; use Test::Unit::TestSuite; use SuiteTest; use InheritedSuite::Simple; use InheritedSuite::TestNames; sub new { my $class = shift; return bless {}, $class; } sub suite { my $class = shift; my $suite = Test::Unit::TestSuite->empty_new("Framework Tests"); # We now add the various test cases and suites to this suite # in deliberately different ways, so as to implicitly test # the different interfaces by which one can add/construct tests. # Add test cases in 3 different ways. The first 3 extract all # test_* methods, and the last extracts only 1 method. $suite->add_test(Test::Unit::TestSuite->new('TestTest')); $suite->add_test('ListenerTest'); $suite->add_test('BadSuitesTest'); $suite->add_test('RunnerTest'); $suite->add_test('WillDie'); $suite->add_test(InheritedSuite::TestNames->new('test_names')); # Add test suites in 4 different ways. $suite->add_test(SuiteTest->suite()); $suite->add_test(InheritedSuite::Simple->new()); $suite->add_test('InheritedSuite::OverrideNew'); # $suite->add_test(Test::Unit::TestSuite->new('InheritedSuite::OverrideNewName')); return $suite; } 1; __END__ =head1 NAME AllTests - unit testing framework self tests =head1 SYNOPSIS # command line style use perl TestRunner.pl AllTests # GUI style use perl TkTestRunner.pl AllTests =head1 DESCRIPTION This class is used by the unit testing framework to encapsulate all the self tests of the framework. =head1 AUTHOR Copyright (c) 2000-2002, 2005 the PerlUnit Development Team (see L or the F file included in this distribution). All rights reserved. This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. =head1 SEE ALSO =over 4 =item * L =item * L =back =cut Test-Unit-0.25/t/tlib/AssertTest.pm0000644000175000017500000005044710324271126017266 0ustar mca1001mca100100000000000000package AssertTest; use strict; use ExceptionChecker; use TestObject; use Test::Unit::TestCase; use Test::Unit::Failure; use Test::Unit::Error; use Error qw/:try/; use Class::Inner; use vars qw/@ISA/; @ISA = qw(Test::Unit::TestCase ExceptionChecker); sub test_assert_equals { my $self = shift; my $o = TestObject->new(); $self->assert_equals($o, $o); $self->check_failures ("expected 'start o:MyClass=HASH(0x1404343f0) | any o:MyClass=HASH(0x1404343f0) e:start | any o:MyClass=HASH(0x1404343f0) e:in', got 'start o: e: | any o:start e: | any o:in e:'" => # A false-negative that burned me; problem with is_numeric # Test must be all on one line [ __LINE__, sub { shift->assert_equals("start o:MyClass=HASH(0x1404343f0) | any o:MyClass=HASH(0x1404343f0) e:start | any o:MyClass=HASH(0x1404343f0) e:in", "start o: e: | any o:start e: | any o:in e:"); } ], ); } # ...and the root of that problem in test_assert_equals sub test_numericness { my $self = shift; my %tests = ( 1 => 't', 0 => 't', '0xF00' => 'f', # controversial? but if you +=10 then it's == 10 '15e7' => 't', '15E7' => 't', "not 0" => 'f', "not 4" => 'f', " \n 5E2" => 't', " \t 0E0 " => 't', ); foreach my $str (keys %tests) { my $expect = $tests{$str}; my $actual = Test::Unit::Assert::is_numeric($str) ? 't' : 'f'; $self->fail("For string '$str', expect $expect but got $actual") unless $expect eq $actual; } } sub test_assert { my $self = shift; $self->assert(1); $self->assert(1, 'should be true'); $self->assert(qr/foo/, 'foobar'); $self->assert(qr/foo/, 'foobar', 'should match /foo/'); my $coderef = sub { $_[0] eq $_[1] or $self->fail("$_[0] ne $_[1]"); }; $self->assert($coderef, 'a', 'a'); $self->assert([]); $self->assert([ 'foo', 7 ]); $self->check_failures( 'Boolean assertion failed' => [ __LINE__, sub { shift->assert(undef) } ], 'Boolean assertion failed' => [ __LINE__, sub { shift->assert(0) } ], 'Boolean assertion failed' => [ __LINE__, sub { shift->assert('') } ], 'bang' => [ __LINE__, sub { shift->assert(0, 'bang') } ], 'bang' => [ __LINE__, sub { shift->assert('', 'bang') } ], "'qux' did not match /(?-xism:foo)/" => [ __LINE__, sub { shift->assert(qr/foo/, 'qux') } ], 'bang' => [ __LINE__, sub { shift->assert(qr/foo/, 'qux', 'bang') } ], 'a ne b'=> [ __LINE__, sub { shift->assert($coderef, 'a', 'b') } ], ); } sub test_assert_str_equals { my $self = shift; my @pass = ( ['', ''], [0, 0], [1, 1], ['foo', 'foo'], ); foreach my $pair (@pass) { my ($expected, $got) = @$pair; $self->assert_str_equals($expected, $got); $self->assert_str_equals($expected, $got, 'failure message'); } $self->check_failures( 'expected value was undef; should be using assert_null?' => [ __LINE__, sub { shift->assert_str_equals(undef, undef) } ], 'expected value was undef; should be using assert_null?' => [ __LINE__, sub { shift->assert_str_equals(undef, 0) } ], 'expected value was undef; should be using assert_null?' => [ __LINE__, sub { shift->assert_str_equals(undef, '') } ], 'expected value was undef; should be using assert_null?' => [ __LINE__, sub { shift->assert_str_equals(undef, 'foo') } ], "expected '', got undef" => [ __LINE__, sub { shift->assert_str_equals('', undef) } ], "expected 'foo', got undef" => [ __LINE__, sub { shift->assert_str_equals('foo', undef) } ], "expected '', got '0'" => [ __LINE__, sub { shift->assert_str_equals('', 0) } ], "expected '0', got ''" => [ __LINE__, sub { shift->assert_str_equals(0, '') } ], "expected '0', got undef" => [ __LINE__, sub { shift->assert_str_equals(0, undef) } ], "expected '0', got '1'" => [ __LINE__, sub { shift->assert_str_equals(0, 1) } ], "expected '0', got '-0'" => [ __LINE__, sub { shift->assert_str_equals(0, '-0') } ], "expected '-0', got '0'" => [ __LINE__, sub { shift->assert_str_equals('-0', 0) } ], "expected 'foo', got 'bar'" => [ __LINE__, sub { shift->assert_str_equals('foo', 'bar') } ], ); } sub test_multi_assert { my $self = shift; my $assertion = sub { $_[0] =~ /1/ or Test::Unit::Failure->throw(-text => "first arg missing 1"); $_[1] eq 'cluck' or Test::Unit::Failure->throw(-text => "what? no chickens!?"); }; $self->multi_assert( $assertion, [ 1, 'cluck' ], [ 'el1te', 'cluck' ], ); $self->check_failures( 'first arg missing 1' => [ __LINE__, sub { shift->multi_assert($assertion, [ 2, 'cluck' ]) } ], 'what? no chickens!?' => [ __LINE__, sub { shift->multi_assert($assertion, [ 1, 'cluck' ], [ 1, 'moo' ]) } ], ); } sub test_assert_matches { my $self = shift; $self->assert_matches(qr/ob/i, 'fooBar'); $self->check_errors( 'arg 1 to assert_matches() must be a regexp' => [ __LINE__, sub { shift->assert_matches(1, 2) } ] ); } sub test_assert_does_not_match { my $self = shift; $self->assert_does_not_match(qr/ob/, 'fooBar'); $self->check_errors( 'arg 1 to assert_does_not_match() must be a regexp' => [ __LINE__, sub { shift->assert_does_not_match(1, 2) } ] ); } sub test_assert_equals_null { my $self = shift; $self->assert_equals(undef, undef); } # sub assertion_has_failed { # my $error = shift; # return eval {ref($error) && $error->isa('Test::Unit::Failure')}; # } # Not sure this has meaning in Perl # sub test_assert_null_not_equals_null { # my $self = shift; # eval { $self->assert_equals(undef, TestObject->new()) }; # $self->fail unless assertion_has_failed($@); # } @AssertTest::Exception::ISA = 'Error'; sub test_assert_raises { my $self = shift; $self->assert_raises( 'AssertTest::Exception', sub { AssertTest::Exception->throw(-text => 'boom'); } ); $self->assert_str_equals('boom', AssertTest::Exception->prior->{-text}); $self->assert_raises( 'Error::Simple', sub { die "bang"; } ); $self->assert_str_equals('bang', AssertTest::Exception->prior->{-text}); $self->check_failures( 'No AssertTest::Exception was raised' => [ __LINE__ + 1, sub { shift->assert_raises('AssertTest::Exception', sub {}) } ], 'zxc' => [ __LINE__ + 1, sub { shift->assert_raises('AssertTest::Exception', sub {}, 'zxc') } ], ); } sub test_ok_boolean { my $self = shift; $self->ok(1); $self->check_failures( 'Boolean assertion failed' => [ __LINE__, sub { shift->ok(0) } ], 'Boolean assertion failed' => [ __LINE__, sub { shift->ok('') } ], 'Boolean assertion failed' => [ __LINE__, sub { shift->ok(undef) } ], ); } sub test_ok_bad_args { my $self = shift; $self->check_errors( 'ok() called with wrong number of args' => [ __LINE__, sub { shift->ok() } ], 'ok() called with wrong number of args' => [ __LINE__, sub { shift->ok(1, 2, 3, 4) } ], ); } sub test_ok_equals { my $self = shift; foreach my $args ([0, 0], [2, 2], [1.34, 1.34], ['foo', 'foo'], ['', ''], [undef, undef], [sub {2+2}, 4], ['fixed', qr/x/]) { $self->ok(@$args); $self->ok(@$args, 'comment'); } } sub test_ok_not_equals { my $self = shift; my $adder = sub { 2+2 }; my @checks = ( # interface is ok(GOT, EXPECTED); q{expected 1, got 0} => [ 0, 1 ], q{expected 0, got 1} => [ 1, 0 ], q{expected 3, got 2} => [ 2, 3 ], q{expected -57.001, got -57} => [ -57, -57.001 ], q{expected 'bar', got 'foo'} => [ 'foo', 'bar' ], q{expected '', got 'foo'} => [ 'foo', '' ], q{expected 'foo', got ''} => [ '', 'foo' ], q{expected 5, got 4} => [ $adder, 5 ], q{'foo' did not match /(?-xism:x)/} => [ 'foo', qr/x/ ], ); my @tests = (); while (@checks) { my $expected = shift @checks; my $args = shift @checks; push @tests, $expected => [ __LINE__, sub { shift->ok(@$args) } ]; push @tests, 'failure comment' => [ __LINE__, sub { shift->ok(@$args, 'failure comment') } ]; } $self->check_failures(@tests); } sub test_fail { my $self = shift; $self->check_failures( '' => [ __LINE__, sub { shift->fail() } ], 'failure message' => [ __LINE__, sub { shift->fail('failure message') } ], ); } sub test_succeed_assert_null { my $self = shift; $self->assert_null(undef); } sub test_fail_assert_null { my $self = shift; $self->check_failures( 'Defined is defined' => [ __LINE__, sub { shift->assert_null('Defined') } ], 'Weirdness' => [ __LINE__, sub { shift->assert_null('Defined', 'Weirdness') } ], ); } sub test_success_assert_not_equals { my $self = shift; $self->assert_not_equals(1, 0); $self->assert_not_equals(0, 1); $self->assert_not_equals(0, 1E10); $self->assert_not_equals(1E10, 0); $self->assert_not_equals(1, 2); $self->assert_not_equals('string', 1); $self->assert_not_equals(1, 'string'); $self->assert_not_equals('string', 0); # $self->assert_not_equals(0,'string'); # Numeric comparison done here.. # $self->assert_not_equals(0, ''); # Numeric comparison done here.. $self->assert_not_equals('', 0); $self->assert_not_equals(undef, 0); $self->assert_not_equals(0, undef); # $self->assert_not_equals(0, ''); FIXME $self->assert_not_equals(undef, ''); $self->assert_not_equals('', undef); } sub test_fail_assert_not_equals { my $self = shift; my @pairs = ( # Some of these are debatable, but at least including the tests # will alert us if any of the outcomes change. "0 and 0 should differ" => [ 0, 0 ], "0 and 0 should differ" => [ 0, '0' ], "0 and 0 should differ" => [ '0', 0 ], "0 and 0 should differ" => [ '0', '0' ], "1 and 1 should differ" => [ 1, 1 ], "1 and 1 should differ" => [ 1, '1' ], "1 and 1 should differ" => [ '1', 1 ], "1 and 1 should differ" => [ '1', '1' ], "0 and should differ" => [ 0, '' ], # Numeric comparison "0 and string should differ" => [ 0, 'string' ], # Numeric comparison "'' and '' should differ" => [ '', '' ], "both args were undefined" => [ undef, undef ], ); my @tests = (); while (@pairs) { my $expected = shift @pairs; my $pair = shift @pairs; push @tests, $expected => [ __LINE__, sub { shift->assert_not_equals(@$pair) } ]; push @tests, "$expected with comment", => [ __LINE__, sub { shift->assert_not_equals(@$pair, "$expected with comment") } ]; } $self->check_failures(@tests); } sub test_fail_assert_not_null { my $self = shift; $self->check_failures( ' unexpected' => [ __LINE__, sub { shift->assert_not_null(undef) } ], ' unexpected' => [ __LINE__, sub { shift->assert_not_null() } ], # nb. $self->assert_not_null(@emptylist, "message") is not # going to do what you expected! 'Weirdness' => [ __LINE__, sub { shift->assert_not_null(undef, 'Weirdness') } ] ); } sub test_succeed_assert_not_null { my $self = shift; $self->assert_not_null(TestObject->new); $self->assert_not_null(''); $self->assert_not_null('undef'); $self->assert_not_null(0); $self->assert_not_null(10); } sub test_assert_deep_equals { my $self = shift; $self->assert_deep_equals([], []); $self->assert_deep_equals({}, {}); $self->assert_deep_equals([ 0, 3, 5 ], [ 0, 3, 5 ]); my $hashref = { a => 2, b => 4 }; $self->assert_deep_equals($hashref, $hashref); $self->assert_deep_equals($hashref, { b => 4, a => 2 }); my $complex = { array => [ 1, $hashref, 3 ], undefined => undef, number => 3.2, string => 'hi mom', deeper => { and => [ even => [ qw(deeper wahhhhh) ], { foo => 11, bar => 12 } ], }, }; $self->assert_deep_equals( $complex, { array => [ 1, $hashref, 3 ], undefined => undef, number => 3.2, string => 'hi mom', deeper => { and => [ even => [ qw(deeper wahhhhh) ], { foo => 11, bar => 12 } ], }, }, ); my $differ = sub { my ($a, $b) = @_; qr/^Structures\ begin\ differing\ at: $ \n \S*\s* \$a .* = .* (?-x:$a) .* $ \n \S*\s* \$b .* = .* (?-x:$b)/mx; }; my %families; # key=test-purpose, value=assorted circular structures foreach my $key (qw(orig copy bad_copy)) { my %family = ( john => { name => 'John Doe', spouse => undef, children => [], }, jane => { name => 'Jane Doe', spouse => undef, children => [], }, baby => { name => 'Baby Doll', # spouse => undef, children => [], }, ); $family{john}{spouse} = $family{jane}; $family{jane}{spouse} = $family{john}; push @{$family{john}{children}}, $family{baby}; push @{$family{jane}{children}}, $family{baby}; $families{$key} = \%family; } $families{bad_copy}->{jane}{spouse} = $families{bad_copy}->{baby}; # was ->{john} # Breakage under test is infinite recursion, to memory exhaustion! # Jump through hoops to avoid killing people's boxes { my $old_isa = \&UNIVERSAL::isa; # Pick on isa() because it'll be called from any deep-ing code local $^W = 0; local *UNIVERSAL::isa = sub { die "Giving up on deep recursion for assert_deep_equals" if defined caller(500); return $old_isa->(@_); }; $self->assert_deep_equals($families{orig}, $families{copy}); } my ($H, $H2, $G) = qw(hello hello goodbye); my @pairs = ( 'Both arguments were not references' => [ undef, 0 ], 'Both arguments were not references' => [ 0, undef ], 'Both arguments were not references' => [ 0, 1 ], 'Both arguments were not references' => [ 0, '' ], 'Both arguments were not references' => [ '', 0 ], $differ->(qw/'ARRAY 'HASH/) => [ [], {} ], $differ->(qw/'ARRAY 'HASH/) => [ [1,2], {1,2} ], $differ->( "'ARRAY", " undef" ) => [ { 'test' => []}, { 'test' => undef } ], $differ->( "'ARRAY", 'not exist' ) => [ { 'test' => []}, {} ], $differ->( 'undef', "'ARRAY" ) => [ { 'test' => undef }, { 'test' => []} ], $differ->( "''", " undef" ) => [ [ '' ], [ undef ] ], $differ->( "'undef'", " undef" ) => [ [ 'undef' ], [ undef ] ], $differ->('not exist', "'3'") => [ [1,2], [1,2,3] ], $differ->("'3'", "not exist") => [ [1,2,3], [1,2] ], $differ->("'wahhhhh'", "'wahhhh'") => [ $complex, { array => [ 1, $hashref, 3 ], undefined => undef, number => 3.2, string => 'hi mom', deeper => { and => [ even => [ qw(deeper wahhhh) ], { foo => 11, bar => 12 } ], }, } ], $differ->( 'HASH', 'not exist') => [$families{orig}, $families{bad_copy}], # test may be fragile due to recursion ordering? $differ->("'3'", "'5'") => [ [ \$H, 3 ], [ \$H2, 5 ] ], $differ->("'hello'", "'goodbye'") => [ { world => \$H }, { world => \$G } ], $differ->("'hello'", "'goodbye'") => [ [ \$H, "world" ], [ \$G, "world" ] ], ); my @tests = (); while (@pairs) { my $expected = shift @pairs; my $pair = shift @pairs; push @tests, $expected, [ __LINE__, sub { shift->assert_deep_equals(@$pair) } ]; push @tests, "$expected with comment", [ __LINE__, sub { shift->assert_deep_equals(@$pair, "$expected with comment") } ]; } $self->check_failures(@tests); } # Key = assert_method # Value = [[@arg_list],undef/expected exception] # FIXME: These should probably be merged with the tests for assert_not_equals() # somehow, since the failures aren't currently tested for the correct message # via check_exception(), or originating file/line via check_file_and_line(). my %test_hash = ( assert_equals => { success => [ { args => [0,'foo'], name => "0 == 'foo'" }, { args => [1,'1.0'], name => "1 == '1.0'" }, { args => ['1.0', 1], name => "'1.0' == 1" }, { args => ['foo', 'foo'], name => 'foo eq foo' }, { args => ['0e0', 0], name => '0E0 == 0' }, { args => [0, 'foo'], name => "0 == 'foo'" }, { args => [undef, undef], name => "both undef" }, { args => [0, 0], name => "0 == 0" }, { args => [0, 0.0], name => "0 == 0.0" }, { args => [0.0, 0], name => "0.0 == 0" }, { args => [0.0, 0.0], name => "0.0 == 0.0" }, { args => ['', ''], name => "'' == ''" }, ], 'Test::Unit::Failure' => [ { args => [1,'foo'], name => "1 != 'foo'" }, { args => ['foo', 0], name => "'foo' ne 0" }, { args => ['foo', 1], name => "'foo' ne 1" }, { args => [0,1], name => "0 != 1" }, { args => ['foo', 'bar'], name => "'foo' ne 'bar'" }, { args => ['foo', undef], name => "'foo' ne undef" }, { args => [undef, 'foo'], name => "undef ne 'foo'" }, # { args => [0, ''], name => "0 ne ''" }, # numeric compare ], }, ); sub suite { my $self = shift; my $suite = Test::Unit::TestSuite->empty_new("Assertion Tests"); foreach my $test ($self->make_tests_from_matrix(\%test_hash)) { $suite->add_test($test); } foreach my $test ($self->list_tests) { no strict 'refs'; $suite->add_test($self->make_test_from_coderef(sub {my $self = shift; $self->$test(@_)},$test)); } return $suite; } sub make_tests_from_matrix { my $self = shift; my $matrix = shift; my @tests; foreach my $method_name (keys %$matrix) { # Build 'successful' tests. foreach my $spec (@{$matrix->{$method_name}{success}}) { push @tests, $self->make_test_from_coderef (sub { my $self = shift; $self->$method_name(@{$spec->{args}}); }, $spec->{name}); } foreach my $outcome (grep {$_ ne 'success'} keys %{$matrix->{$method_name}}) { foreach my $spec (@{$matrix->{$method_name}{$outcome}}) { push @tests, $self->make_test_from_coderef (sub { my $self = shift; try { $self->$method_name(@{$spec->{args}}); 0; } catch $outcome with { 1; } or Test::Unit::Failure->throw(-text => $spec->{name}, -object => $self); }, $spec->{name}); } } } return @tests; } 1; Test-Unit-0.25/t/tlib/RunnerTest.pm0000644000175000017500000000505007504374516017301 0ustar mca1001mca100100000000000000package RunnerTest; use strict; use Test::Unit::TestRunner; use base 'Test::Unit::TestCase'; sub set_up { my $self = shift; open(DEVNULL, '>/dev/null') or die "Couldn't open(>/dev/null): $!"; $self->{runner} = Test::Unit::TestRunner->new(\*DEVNULL); } sub tear_down { my $self = shift; close(DEVNULL); } sub test_reset_filtering { my $self = shift; $self->{runner}->filter('random_token'); $self->{runner}->reset_filter; $self->assert(! $self->{runner}->start('FilteredSuite'), "run wasn't supposed to succeed"); my $result = $self->{runner}->result; $self->assert_num_equals(4, $result->run_count); $self->assert_num_equals(3, $result->error_count); $self->assert_num_equals(0, $result->failure_count); } sub test_filter_via_method_list { my $self = shift; $self->{runner}->filter('token_filtering_via_method_list'); $self->assert(! $self->{runner}->start('FilteredSuite'), "run wasn't supposed to succeed"); my $result = $self->{runner}->result; $self->assert_num_equals(2, $result->run_count); $self->assert_num_equals(1, $result->error_count); $self->assert_num_equals(0, $result->failure_count); } sub test_filter_via_sub { my $self = shift; $self->{runner}->filter('token_filtering_via_sub'); $self->assert(! $self->{runner}->start('FilteredSuite'), "run wasn't supposed to succeed"); my $result = $self->{runner}->result; $self->assert_num_equals(3, $result->run_count); $self->assert_num_equals(2, $result->error_count); $self->assert_num_equals(0, $result->failure_count); } sub test_filter_via_both { my $self = shift; $self->{runner}->filter( 'token_filtering_via_method_list', 'token_filtering_via_sub', 'nonexistent_token', # this has to be allowed ); $self->assert($self->{runner}->start('FilteredSuite'), "run wasn't supposed to fail"); my $result = $self->{runner}->result; $self->assert_num_equals(1, $result->run_count); $self->assert_num_equals(0, $result->error_count); $self->assert_num_equals(0, $result->failure_count); } sub test_filter_broken_token { my $self = shift; $self->{runner}->filter('broken_token'); eval { $self->{runner}->start('FilteredSuite'); }; my $exception = $@; # have to save $@ otherwise the assertion messes it up $self->assert_str_equals( "Didn't understand filtering definition for token broken_token in FilteredSuite\n", $exception ); } 1; Test-Unit-0.25/t/tlib/NoTestCaseClass.pm0000644000175000017500000000011307374760234020162 0ustar mca1001mca100100000000000000package NoTestCaseClass; use strict; sub new { } sub testSuccess { } 1; Test-Unit-0.25/t/tlib/InheritedTestCase.pm0000644000175000017500000000022307374760234020535 0ustar mca1001mca100100000000000000package InheritedTestCase; # Test class used in SuiteTest use base qw(OneTestCase); sub new { shift()->SUPER::new(@_); } sub test2 { } 1; Test-Unit-0.25/t/tlib/ActiveTestTest.pm0000644000175000017500000000341507401233023020065 0ustar mca1001mca100100000000000000package ActiveTestTest; use strict; use Test::Unit::TestCase (); use base 'Test::Unit::TestCase'; use Test::Unit::Result; use Test::Unit::TestSuite (); use Success; sub testActiveTest { my $self = shift; my $test = $self->create_active_test_suite; my $result = Test::Unit::Result->new; $test->run($result); $self->assert_equals(100, $result->run_count); $self->assert_equals(0, $result->failure_count); $self->assert_equals(0, $result->error_count); } # sub test_active_repeated_test { # my $self = shift; # my $test = Test::Unit::RepeatedTest($self->create_active_test_suite, 5); # my $result = Result->new; # $test->run($result); # $self->assert_equals(500, $result->run_count); # $self->assert_equals(0, $result->failure_count); # $self->assert_equals(0, $result->error_count); # } # sub test_active_repeated_test0 { # my $self = shift; # my $test = Test::Unit::RepeatedTest($self->create_active_test_suite, 0); # my $result = Result->new; # $test->run($result); # $self->assert_equals(0, $result->run_count); # $self->assert_equals(0, $result->failure_count); # $self->assert_equals(0, $result->error_count); # } # sub test_active_repeated_test1 { # my $self = shift; # my $test = Test::Unit::RepeatedTest($self->create_active_test_suite, 1); # my $result = Result->new; # $test->run($result); # $self->assert_equals(100, $result->run_count); # $self->assert_equals(0, $result->failure_count); # $self->assert_equals(0, $result->error_count); # } sub create_active_test_suite () { my $self = shift; my $suite = Test::Unit::TestSuite->new; for (1 .. 100) { $suite->add_test(Success->new("test_success")); } return $suite; } 1; Test-Unit-0.25/t/tlib/ExceptionChecker.pm0000644000175000017500000000540107427575205020415 0ustar mca1001mca100100000000000000package ExceptionChecker; use strict; use warnings; use Test::Unit::Error; use Test::Unit::Failure; use Error qw(:try); sub check_failures { my $self = shift; $self->check_exceptions('Test::Unit::Failure', @_); } sub check_errors { my $self = shift; $self->check_exceptions('Test::Unit::Error', @_); } sub check_exceptions { my $self = shift; my ($exception_class, @tests) = @_; my ($asserter, $file, $line) = caller($Error::Depth + 1); # EVIL hack! Assumes check_exceptions # always called via check_{failures,errors}. # My brain hurts too much right now to think # of a better way. while (@tests) { my $expected = shift @tests; my $test_components = shift @tests; my ($test_code_line, $test) = @$test_components; my $exception; try { $self->$test(); } catch $exception_class with { $exception = shift; } catch Error::Simple with { $exception = shift; } otherwise { $exception = 0; }; try { $self->check_exception($exception_class, $expected, $exception); $self->check_file_and_line($exception, $file, $test_code_line); } catch Test::Unit::Failure with { my $failure = shift; $failure->throw_new( -package => $asserter, -file => $file, -line => $line, -object => $self ); } } } sub check_exception { my $self = shift; my ($exception_class, $expected, $exception) = @_; Test::Unit::Failure->throw( -text => "Didn't get $exception_class `$expected'", -object => $self, ) unless $exception; my $got = $exception->text(); Test::Unit::Failure->throw( -text => "Expected $exception_class `$expected', got `$got'", -object => $self, ) unless UNIVERSAL::isa($expected, 'Regexp') ? $got =~ /$expected/ : $got eq $expected; } sub check_file_and_line { my $self = shift; my ($exception, $expected_file, $test_code_line) = @_; if ($exception->file() ne $expected_file) { throw Test::Unit::Failure( -text => "failure's file() should have returned $expected_file" . " (line $test_code_line), not " . $exception->file(), -object => $self, ); } if ($exception->line() != $test_code_line) { throw Test::Unit::Failure( -text => "failure's line() should have returned " . "$test_code_line, not " . $exception->line(), -object => $self, ); } } 1; Test-Unit-0.25/t/tlib/TestObject.pm0000644000175000017500000000014107427575205017234 0ustar mca1001mca100100000000000000package TestObject; use strict; sub new { my $class = shift; bless [@_], $class; } 1; Test-Unit-0.25/t/tlib/FilteredSuite.pm0000644000175000017500000000140407504364255017736 0ustar mca1001mca100100000000000000package FilteredSuite; use base 'Test::Unit::TestCase'; sub filter {{ token_filtering_via_method_list => [ qw/test_filtered_method1 test_filtered_method2/ ], token_filtering_via_sub => sub { my ($method) = @_; return 1 if $method =~ /method3$/; }, broken_token => 'nonsense', }} sub test_filtered_method1 { my $self = shift; die "test_filtered_method1 should get filtered via method list"; } sub test_filtered_method2 { my $self = shift; die "test_filtered_method2 should get filtered via method list"; } sub test_filtered_method3 { my $self = shift; die "test_filtered_method3 should get filtered via sub"; } sub test_unfiltered_method1 { my $self = shift; $self->assert('trooooo'); } 1; Test-Unit-0.25/t/try_examples.t0000644000175000017500000000576210273173422016601 0ustar mca1001mca100100000000000000#!/usr/bin/perl -w use strict; # using the standard built-in 'Test' module (assume nothing) use Test; foreach (qw(Makefile.PL Makefile examples lib t)) { die("Please run 'make test' from the top-level source directory\n". "(I can't see $_)\n") unless -e $_; } my %skip = map { ("examples/$_") => 1 } qw(. .. CVS Experimental README tester.png); my @examples = grep { ! $skip{$_} } glob("examples/*"); my %guru_checked = ( "examples/patch100132" => <<'EGC', ... Time: 0 wallclock secs ( 0.00 usr + 0.00 sys = 0.00 CPU) OK (3 tests) EGC "examples/patch100132-1" => <<'EGC', ... Time: 0 wallclock secs ( 0.00 usr + 0.00 sys = 0.00 CPU) OK (3 tests) EGC "examples/patch100132-2" => <<'EGC', ... Time: 0 wallclock secs ( 0.01 usr + 0.00 sys = 0.01 CPU) OK (3 tests) EGC "examples/fail_example.pm" => <<'EGC', Suite setup .F.Suite teardown Time: 0 wallclock secs ( 0.01 usr + 0.00 sys = 0.01 CPU) !!!FAILURES!!! Test Results: Run: 2, Failures: 1, Errors: 0 There was 1 failure: 1) examples/fail_example.pm:19 - test_fail(fail_example) Born to lose ... Test was not successful. EGC ); plan(tests => scalar(@examples)); foreach my $e (keys %guru_checked) { warn("Guru ".(defined $guru_checked{$e} ? 'answer' : 'excuse'). " exists for '$e' but there is no test file\n") unless grep { $_ eq $e } @examples; } warn("\n > The STDERR redirection may not work or may behave differently under\n". " > your OS '$^O'. That will probably cause this test to fail.\n") if grep { $^O =~ $_ } ( qr/win/i ); # This will apply to various OSes. Is there a "capable of doing unix # redirections" flag somewhere? # Attempt to get hold of the correct perl to run the examples. I # think we want $ENV{FULLPERLRUN} when running "make test", but that # doesn't filter down to us. $ENV{PERL5LIB} is set correctly though. my $perl = $^X || "perl"; # warn "running examples with \$perl='$perl'\n under \@INC=(@INC)\n with PERL5LIB=$ENV{PERL5LIB}\n"; foreach my $e (@examples) { if (defined $guru_checked{$e}) { # get program output my $runner = $e =~ /\.pm$/ ? './TestRunner.pl ' : ''; my $cmd = "$perl -I examples $runner$e 2>&1"; # warn "cmd $cmd\n"; my $out = `$cmd`; foreach ($out, $guru_checked{$e}) { # mess about with start & end newlines s/^\n+//; $_ .= "\n" unless /\n$/; # bin the naughty carriage returns s/\r//g; # we can't assume the order of tests will be the same s/^[.F]+\n?Suite teardown$/TEST-RUN-SUMMARY/sm; s/::Load[0-9_]+Anonymous[0-9_]+/::LOAD_ANONYMOUS_CLASSNAME/; # indent lines with '# ' so they're comments if the test fails s/\n/\n# /g; # hide things that look like CPU usage s{Time:\s+[\d\.]+\s+wallclock secs \([\d\s\.]+usr\s+\+[\d\s\.]+sys\s+=[\d\s\.]+CPU\)} {TIME-SUMMARY}g; } ok($out, $guru_checked{$e}); } else { skip( (exists $guru_checked{$e} ? "Skip $e: not yet checked" : 0), "nothing", "data at \$guru_checked{$e}"); } } Test-Unit-0.25/t/assert.t0000644000175000017500000000045207416643311015361 0ustar mca1001mca100100000000000000#!/usr/bin/perl -w use strict; use Test::Unit::HarnessUnit; use Test::Unit::Debug qw(debug_pkgs); #debug_pkgs(qw/Test::Unit::Assert/); #debug_pkgs(qw/Test::Unit::Assertion::CodeRef/); use lib 't/tlib', 'tlib'; my $testrunner = Test::Unit::HarnessUnit->new(); $testrunner->start("AssertTest"); Test-Unit-0.25/t/all_tests.t0000644000175000017500000000036707402737001016052 0ustar mca1001mca100100000000000000#!/usr/bin/perl -w use strict; use Test::Unit::Debug qw(debug_pkgs); use Test::Unit::HarnessUnit; #debug_pkgs(qw{Test::Unit::Result}); use lib 't/tlib', 'tlib'; my $testrunner = Test::Unit::HarnessUnit->new(); $testrunner->start("AllTests"); Test-Unit-0.25/TestRunner.pl0000644000175000017500000000041307403156701016071 0ustar mca1001mca100100000000000000#!/usr/bin/perl -w use strict; use Test::Unit::Debug qw(debug_pkgs); use Test::Unit::TestRunner; # Uncomment and edit to debug individual packages. #debug_pkgs(qw/Test::Unit::TestCase/); my $testrunner = Test::Unit::TestRunner->new(); $testrunner->start(@ARGV); Test-Unit-0.25/MANIFEST0000644000175000017500000000371210324277074014564 0ustar mca1001mca100100000000000000AUTHORS ChangeLog Changes COPYING.Artistic COPYING.GPL-2 doc/class-diagram.dia doc/class-diagram.png doc/class-diagram.txt doc/consensus.txt doc/release-checklist doc/TODO examples/Experimental/Sample.pm examples/fail_example.pm examples/patch100132 examples/patch100132-1 examples/patch100132-2 examples/README examples/tester.png lib/Test/Unit.pm lib/Test/Unit/Assert.pm lib/Test/Unit/Assertion.pm lib/Test/Unit/Assertion/Boolean.pm lib/Test/Unit/Assertion/CodeRef.pm lib/Test/Unit/Assertion/Exception.pm lib/Test/Unit/Assertion/Regexp.pm lib/Test/Unit/Debug.pm lib/Test/Unit/Decorator.pm lib/Test/Unit/Error.pm lib/Test/Unit/Exception.pm lib/Test/Unit/Failure.pm lib/Test/Unit/HarnessUnit.pm lib/Test/Unit/Listener.pm lib/Test/Unit/Loader.pm lib/Test/Unit/Procedural.pm lib/Test/Unit/Result.pm lib/Test/Unit/Runner.pm lib/Test/Unit/Runner/Terminal.pm lib/Test/Unit/Setup.pm lib/Test/Unit/Test.pm lib/Test/Unit/TestCase.pm lib/Test/Unit/TestRunner.pm lib/Test/Unit/TestSuite.pm lib/Test/Unit/TkTestRunner.pm lib/Test/Unit/Tutorial.pm lib/Test/Unit/UnitHarness.pm lib/Test/Unit/Warning.pm Makefile.PL MANIFEST README t/all_tests.t t/assert.t t/tlib/ActiveTestTest.pm t/tlib/AllTests.pm t/tlib/AssertTest.pm t/tlib/BadSuite/BadUse.pm t/tlib/BadSuite/SyntaxError.pm t/tlib/BadSuitesTest.pm t/tlib/ExceptionChecker.pm t/tlib/FilteredSuite.pm t/tlib/InheritedInheritedTestCase.pm t/tlib/InheritedSuite/OverrideNew.pm t/tlib/InheritedSuite/OverrideNewName.pm t/tlib/InheritedSuite/Simple.pm t/tlib/InheritedSuite/TestNames.pm t/tlib/InheritedTestCase.pm t/tlib/ListenerTest.pm t/tlib/NoTestCaseClass.pm t/tlib/NoTestCases.pm t/tlib/OneTestCase.pm t/tlib/OverrideTestCase.pm t/tlib/RunnerTest.pm t/tlib/Success.pm t/tlib/SuiteTest.pm t/tlib/TestAssertionCodeRef.pm t/tlib/TestObject.pm t/tlib/TestTest.pm t/tlib/TornDown.pm t/tlib/WasRun.pm t/tlib/WillDie.pm t/try_examples.t TestLister.pl TestRunner.pl TkTestRunner.pl META.yml Module meta-data (added by MakeMaker) Test-Unit-0.25/TkTestRunner.pl0000644000175000017500000000014707400720502016365 0ustar mca1001mca100100000000000000#!/usr/bin/perl -w use strict; use Test::Unit::TkTestRunner; Test::Unit::TkTestRunner::main(@ARGV); Test-Unit-0.25/COPYING.Artistic0000644000175000017500000001373710273474152016256 0ustar mca1001mca100100000000000000 The "Artistic License" Preamble The intent of this document is to state the conditions under which a Package may be copied, such that the Copyright Holder maintains some semblance of artistic control over the development of the package, while giving the users of the package the right to use and distribute the Package in a more-or-less customary fashion, plus the right to make reasonable modifications. Definitions: "Package" refers to the collection of files distributed by the Copyright Holder, and derivatives of that collection of files created through textual modification. "Standard Version" refers to such a Package if it has not been modified, or has been modified in accordance with the wishes of the Copyright Holder as specified below. "Copyright Holder" is whoever is named in the copyright or copyrights for the package. "You" is you, if you're thinking about copying or distributing this Package. "Reasonable copying fee" is whatever you can justify on the basis of media cost, duplication charges, time of people involved, and so on. (You will not be required to justify it to the Copyright Holder, but only to the computing community at large as a market that must bear the fee.) "Freely Available" means that no fee is charged for the item itself, though there may be fees involved in handling the item. It also means that recipients of the item may redistribute it under the same conditions they received it. 1. You may make and give away verbatim copies of the source form of the Standard Version of this Package without restriction, provided that you duplicate all of the original copyright notices and associated disclaimers. 2. You may apply bug fixes, portability fixes and other modifications derived from the Public Domain or from the Copyright Holder. A Package modified in such a way shall still be considered the Standard Version. 3. You may otherwise modify your copy of this Package in any way, provided that you insert a prominent notice in each changed file stating how and when you changed that file, and provided that you do at least ONE of the following: a) place your modifications in the Public Domain or otherwise make them Freely Available, such as by posting said modifications to Usenet or an equivalent medium, or placing the modifications on a major archive site such as uunet.uu.net, or by allowing the Copyright Holder to include your modifications in the Standard Version of the Package. b) use the modified Package only within your corporation or organization. c) rename any non-standard executables so the names do not conflict with standard executables, which must also be provided, and provide a separate manual page for each non-standard executable that clearly documents how it differs from the Standard Version. d) make other distribution arrangements with the Copyright Holder. 4. You may distribute the programs of this Package in object code or executable form, provided that you do at least ONE of the following: a) distribute a Standard Version of the executables and library files, together with instructions (in the manual page or equivalent) on where to get the Standard Version. b) accompany the distribution with the machine-readable source of the Package with your modifications. c) give non-standard executables non-standard names, and clearly document the differences in manual pages (or equivalent), together with instructions on where to get the Standard Version. d) make other distribution arrangements with the Copyright Holder. 5. You may charge a reasonable copying fee for any distribution of this Package. You may charge any fee you choose for support of this Package. You may not charge a fee for this Package itself. However, you may distribute this Package in aggregate with other (possibly commercial) programs as part of a larger (possibly commercial) software distribution provided that you do not advertise this Package as a product of your own. You may embed this Package's interpreter within an executable of yours (by linking); this shall be construed as a mere form of aggregation, provided that the complete Standard Version of the interpreter is so embedded. 6. The scripts and library files supplied as input to or produced as output from the programs of this Package do not automatically fall under the copyright of this Package, but belong to whoever generated them, and may be sold commercially, and may be aggregated with this Package. If such scripts or library files are aggregated with this Package via the so-called "undump" or "unexec" methods of producing a binary executable image, then distribution of such an image shall neither be construed as a distribution of this Package nor shall it fall under the restrictions of Paragraphs 3 and 4, provided that you do not represent such an executable image as a Standard Version of this Package. 7. C subroutines (or comparably compiled subroutines in other languages) supplied by you and linked into this Package in order to emulate subroutines and variables of the language defined by this Package shall not be considered part of this Package, but are the equivalent of input as in Paragraph 6, provided these subroutines do not change the language in any way that would cause it to fail the regression tests for the language. 8. Aggregation of this Package with a commercial distribution is always permitted provided that the use of this Package is embedded; that is, when no overt attempt is made to make this Package's interfaces visible to the end user of the commercial distribution. Such use shall not be construed as a distribution of this Package. 9. The name of the Copyright Holder may not be used to endorse or promote products derived from this software without specific prior written permission. 10. THIS PACKAGE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. The End Test-Unit-0.25/AUTHORS0000644000175000017500000000504410273475041014500 0ustar mca1001mca100100000000000000# PerlUnit was originally written as a port of Kent Beck and Erich # Gamma's xUnit testing framework by Christian Lemburg and Brian # Ewins, and is now maintained by Adam Spiers and the rest of the # PerlUnit team. # # The following is an alphabetical list of all the people who've # contributed code and effort to making PerlUnit what it is today. # Where possible we have included their Sourceforge usernames and # preferred email addresses. # # The use of this database for anything other than PerlUnit # development is strictly forbidden. (Passive distribution with the # PerlUnit source code package is naturally allowed) Adam Spiers adamspiers Brian Ewins ba22a Cayte Linder cayte Christian Lemburg clemburg David Esposito davide J.E. Fritz jefritz Kevin Connor wallisalviar Matthew Astley mca1001 (was mca-gdl) Michael Schwern/Test::More project for the deep structure comparison routines Piers Cawley pdcawley Zhon Johansen zhon As far as copyright years go (as if anyone cares), this may serve as a vague starting guide for who put together the bulk of the project: 2000 ba22a, clemburg 2001 clemburg, pdcawley 2002 adamspiers, pdcawley Where specific files in the project have been contributed by one person and that person has claimed the copyright, I have left their authorship. The rest of the files have moved over to a more boilerplate style crediting the PerlUnit Development Team and referring to the Test::Unit docs and this file. This is simply for maintenance sanity. All rights reserved. This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself: ------------------------------------------------------------------------------ Perl copyright: ------------------------------------------------------------------------------ Copyright 1989-2001, Larry Wall All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of either: a) the GNU General Public License as published by the Free Software Foundation; either version 1, or (at your option) any later version, or b) the "Artistic License" which comes with Perl. ------------------------------------------------------------------------------ The GNU GPL version 2 is included here in the file COPYING.GPL-2 . You may use version 1 instead, but it has been superceded for good reasons... The Artistic License is included here in the file COPYING.Artistic Test-Unit-0.25/README0000644000175000017500000000562707502137752014324 0ustar mca1001mca100100000000000000NAME Test::Unit::* - a unit testing framework for Perl DESCRIPTION Test::Unit::* is a sophisticated unit testing framework for Perl that is derived from the JUnit testing framework for Java by Kent Beck and Erich Gamma. While this framework is originally intended to support unit testing in an object-oriented development paradigm (with support for inheritance of tests etc.), Test::Unit::Procedural is intended to provide a simpler interface to the framework that is more suitable for use in a scripting style environment. Therefore, Test::Unit::Procedural does not provide much support for an object-oriented approach to unit testing - if you want that, please have a look at Test::Unit::TestCase (also included in this install). A short tutorial on the object-oriented approach can be found in the documentation of Test::Unit::TestCase (the test base class). The Test::Unit self-test suite (contained in t/tlib) is a good example of this approach. There is also a GUI based interface to the testing framework. The "TkTestRunner.pl" script shows how to invoke it. The testing framework also features adapters for tests in the Test::Harness style to tests in the unit testing framework style and vice versa - see Test::Unit::HarnessUnit and Test::Unit::UnitHarness. An example of this approach is the self-test of the unit testing framework that you start with the 'make test' command (see t/all_tests.t). PREREQUISITES Class::Inner, Devel::Symdump and Error.pm are required. A new-ish version of base.pm (> 1.0) is required to avoid the problem where earlier versions failed to compile in the parent class. The Tk module is needed for the GUI. INSTALLATION Once you have installed the prerequisites, just perform the usual incantation (replacing 'x.yy' with the current version): gunzip Test-Unit-x.yy.tar.gz tar -xvf Test-Unit-x.yy.tar cd Test-Unit-x.yy perl Makefile.PL make make test make install AUTHOR Copyright (c) 2000, 2001 Christian Lemburg, . All rights reserved. This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. Thanks go to the other PerlUnit framework people: Brian Ewins, Cayte Lindner, J.E. Fritz, Zhon Johansen, Piers Cawley, Adam Spiers Thanks for patches go to: Matthew Astley, David Esposito. SEE ALSO - Test::Unit::TestCase (included in this install) - the README file in the examples directory - Refactoring -- Improving The Design Of Existing Code. Martin Fowler. Addison-Wesley, 1999. - http://www.xProgramming.com/ EXAMPLES Use TestRunner.pl like this (lib adjusted for this directory): perl -w -I./lib -I./t/tlib TestRunner.pl AllTests Use TkTestRunner like this: perl -w -I./lib -I./t/tlib TkTestRunner.pl AllTests Test-Unit-0.25/META.yml0000644000175000017500000000070210324277074014700 0ustar mca1001mca100100000000000000# http://module-build.sourceforge.net/META-spec.html #XXXXXXX This is a prototype!!! It will change in the future!!! XXXXX# name: Test-Unit version: 0.25 version_from: lib/Test/Unit.pm installdirs: site requires: base: 1 Class::Inner: 0 Devel::Symdump: 0 Error: 0 distribution_type: module generated_by: ExtUtils::MakeMaker version 6.17 Test-Unit-0.25/ChangeLog0000644000175000017500000014410610324276751015211 0ustar mca1001mca1001000000000000002005-10-15 Matthew Astley * doc/release-checklist, doc/TODO, ChangeLog: updates for release * lib/Test/Unit.pm: version 0.25 * MANIFEST: add licence and class-diagram files, remove old exmample; keep in "make manifest" generated order * t/tlib/AssertTest.pm (test_fail_assert_not_null): extra check, for SF bug #610499 * lib/Test/Unit/Assert.pm (assert_deep_equals): fix comparisons of cyclic structures (thanks flacoste, SF patch #678422), comparisons of undefs (thanks flacoste, Debian BTS #249678), comparison of SCALAR refs * t/tlib/AssertTest.pm (test_assert_deep_equals): add modified test from SF bug #1012115; modified test from flacoste's SF patch #678422; more tests on SCALAR refs, and improve the regexp 2005-08-19 Matthew Astley * doc/TODO: notes on HarnessUnit, UnitHarness; more on stuff I'd like to do later * examples/README: minor update 2005-08-03 Matthew Astley * doc/class-diagram.{dia,txt,png}: first stab at a UML class diagram, see how it goes 2005-08-01 Matthew Astley * lib/Test/Unit.pm, lib/Test/Unit/TkTestRunner.pm, lib/Test/Unit/TestRunner.pm: put links to COPYING.* in Test::Unit; move copyright notices from testrunner modules to Test::Unit * lib/Test/Unit/, t/tlib/AllTests.pm: set AUTHOR POD sections to the same boilerplate, in files that don't appear to be single-author -- as described in the top level AUTHORS file * AUTHORS: update authors list with SF ids and what I found while boilerplating the PODs; add explicit copy of the Perl licence, taken from Debian perl-base package v5.8.4-2 * COPYING.Artistic, COPYING.GPL-2: licences copied from Debian base-files package v3.0.12 2005-07-31 Matthew Astley * lib/Test/Unit/Assert.pm (is_numeric): change the test to match only lone numbers. fix SF bug#1014540 *** NB. this causes assert_equals to switch from assert_num_equals to assert_str_equals in some cases * t/tlib/AssertTest.pm (test_numericness, test_assert_equals): tests for new is_numeric * lib/Test/Unit/TkTestRunner.pm: make "Show..." dialog text expand with window and include annotations. fixes SF bug#1018619 * t/try_examples.t: clear out useless 'use lib's; remove dup $^O check; fix RT bug#3963 (thanks ILYAM); improve skipping of untested items * examples/tester.png: update screenshot of Tk test runner; mark as binary * examples/tester.pl: remove old Tk code - Test::SuiteWrapper went away 2000-02-21 2005-07-30 Matthew Astley * t/try_examples.t: Fix SF bug#908422 (track changing testing output format); Thanks: dholland, eksiegerman [aka. SF bug#1245490, RT bug#2244] * .cvsignore: ignore build stuff -- other changes Adam made since REL_0_24, but aren't mentioned already. I list them partly so I know where my towel is: * AUTHORS: Adam became maintainer * doc/TODO: updated * lib/Test/Unit/Decorator.pm: some minor change I've not investigated * lib/Test/Unit/Procedural.pm: fix bug spotted by Matthias Ferber (and Ken) in run() (which is usually overridden) [SF bug#760491, RT bug#3058] * lib/Test/Unit/Runner.pm: improve filtering, POD * lib/Test/Unit/TestCase.pm: POD for filtering * t/tlib/RunnerTest.pm: new test for T:U:TestRunner, just tests filtering; uses the new t/tlib/FilteredSuite.pm 2002-06-20 Adam Spiers * lib/Test/Unit/TestCase.pm: document new filtering via coderefs * MANIFEST, lib/Test/Unit/Test.pm, lib/Test/Unit/TestSuite.pm, t/tlib/AllTests.pm, t/tlib/FilteredSuite.pm: - remove ALL filtering hack, and instead allow filtering via coderefs: sub filter {{ foo_tests => sub { my $method = shift; return $method =~ /foo/; }, everything => sub { 1 }, # method lists still work another_token => [ qw/test_method1 test_method2/ ], }} - add tests for filtering mechanism 2002-06-14 Adam Spiers * lib/Test/Unit.pm: version 0.24 * ChangeLog: new stuff for 0.24 * MANIFEST: 'make manifest' revealed more missing files, though none of them crucial * AUTHORS: change Adam's email address * lib/Test/Unit/TestRunner.pm: Don't die if the run was unsuccessful; we might want to reuse the runner for another run. * MANIFEST: argh! 0.23's MANIFEST was missing several crucial files. 2002-06-13 Adam Spiers * lib/Test/Unit/Runner/Terminal.pm: forgot to update the pod * .cvsignore: ignore tarballs * doc/release-checklist: typo * README, doc/release-checklist: cut down on the poor maintainer's workload * Changes: deprecate this file * ChangeLog: new stuff for 0.23 * lib/Test/Unit.pm: version 0.23 * doc/TODO: mention that Attribute::Handlers probably won't work * t/tlib/TestTest.pm, lib/Test/Unit/Error.pm, lib/Test/Unit/Exception.pm, lib/Test/Unit/Result.pm, lib/Test/Unit/TestCase.pm: Rework the exception handling mechanisms of run_protected/run_bare so that run-time exceptions in set_up or tear_down no longer halt the framework, and neither do user-defined exceptions thrown in the test methods themselves (where the framework only used to handle straight-forward exceptions where $@ was a scalar, I think). Some assumptions about Error.pm internals have had to be made, unfortunately. * lib/Test/Unit/Procedural.pm: remove spurious 'use' line 2002-06-12 Adam Spiers * lib/Test/Unit/Debug.pm: allow debugging to a file with debug_to_file 2002-06-10 Adam Spiers * lib/Test/Unit/Runner/Terminal.pm: use \e[4A\r instead of \e[4F, which not all terminals support * lib/Test/Unit/Runner/Terminal.pm: Ahem. Forgot to change package name. * lib/Test/Unit/TkTestRunner.pm: check that something is selected when the user clicks 'Show...' * lib/Test/Unit/TkTestRunner.pm: disable broken rerun button * MANIFEST, lib/Test/Unit/Listener.pm, lib/Test/Unit/Runner.pm, lib/Test/Unit/Runner/Terminal.pm, lib/Test/Unit/TestRunner.pm, lib/Test/Unit/TestSuite.pm: - new start_suite/end_suite events sent to listeners, to track where current test is in the suite hierarchy ($runner->suites_running) - new T::U::Runner::Terminal runner which uses terminal escape sequences to show which suites/tests are currently being run - result object now stored in the runner * lib/Test/Unit/TkTestRunner.pm: clean up of code style * lib/Test/Unit/Listener.pm: pseudo-document the parameters for the listener interface 2002-05-23 Adam Spiers * doc/TODO, lib/Test/Unit/TestCase.pm: (poorly) document @TESTS and the filtering mechanism * lib/Test/Unit.pm: version 0.22 * ChangeLog: get this uptodate by merging auto-generated entries with existing ones * lib/Test/Unit/TestSuite.pm: allow 'ALL' as a magic test name which matches all methods in this class, e.g. package MyTest37; use base qw(Test::Unit::TestCase); ... sub filter {{ skip_thirty_seven => [ 'ALL' ], slow => [ qw(test_I_am_slow test_I_am_slow_too) ], }} * lib/Test/Unit/Assert.pm, t/tlib/AssertTest.pm: assert_(str|num)(_not)?_equals now fail with undef parameters, to avoid tests passing by accident. The user should either use assert_null/assert_not_null, or check for undef before the assertion. 2002-05-23 Adam Spiers * lib/Test/Unit/TestSuite.pm: allow 'ALL' as a magic test name which matches all methods in this class, e.g. package MyTest37; use base qw(Test::Unit::TestCase); ... sub filter {{ skip_thirty_seven => [ 'ALL' ], slow => [ qw(test_I_am_slow test_I_am_slow_too) ], }} * lib/Test/Unit/Assert.pm, t/tlib/AssertTest.pm: assert_(str|num)(_not)?_equals now fail with undef parameters, to avoid tests passing by accident. The user should either use assert_null/assert_not_null, or check for undef before the assertion. 2002-05-14 Adam Spiers * lib/Test/Unit/TestCase.pm: bit more debugging 2002-03-26 Adam Spiers * lib/Test/Unit.pm: version 0.21 * lib/Test/Unit/Assert.pm, t/tlib/AssertTest.pm: avoid UNIVERSAL::isa, which is buggy with 5.6.0 (see perldelta) 2002-03-18 Adam Spiers * t/tlib/AssertTest.pm: update boolean assertion tests for new failure message * doc/TODO: do_run should be public * lib/Test/Unit/Assertion/Boolean.pm: slightly nicer default assertion failure message 2002-03-04 Adam Spiers * lib/Test/Unit/Test.pm, lib/Test/Unit/TestCase.pm: avoid namespace clashes in TestCase objects (thanks to jonasbn for pointing this problem out) * README: update the prerequisites 2002-02-20 Adam Spiers * lib/Test/Unit/Assert.pm: reintroduce caveat about $self->assert($foo =~ /$bar/) 2002-02-12 Adam Spiers * lib/Test/Unit/Assert.pm, t/tlib/AssertTest.pm: make $self->assert([1]); work 2002-02-05 Adam Spiers * lib/Test/Unit/Assert.pm, t/tlib/AssertTest.pm: assert_deep_equals takes references 'A' and 'B', not 'got' and 'expected' 2002-02-04 Adam Spiers * t/tlib/AllTests.pm, t/tlib/AssertTest.pm, t/tlib/ExceptionChecker.pm, t/tlib/TestObject.pm, t/tlib/WillDie.pm: - factor out exception checking into ExceptionChecker - move TestObject class into separate file - tests for test-case methods which die ( they pass but I am still getting funny results from my real-world test-cases )-: * doc/TODO: @TESTS needs testing 2002-01-29 Adam Spiers * lib/Test/Unit/HarnessUnit.pm, lib/Test/Unit/Runner.pm, lib/Test/Unit/TkTestRunner.pm: factor create_test_result * lib/Test/Unit/Assert.pm, t/tlib/AssertTest.pm: - new assert_deep_equals for comparing deep structures, mostly ripped out of Test::More - some tests weren't getting run because of identical hash keys when I should have been using arrays (doh!) 2002-01-23 Adam Spiers * doc/TODO: need to document @TESTS 2002-01-09 Adam Spiers * lib/Test/Unit/TestRunner.pm: missed a rename from output() to annotations() 2002-01-08 Adam Spiers * MANIFEST, lib/Test/Unit/Assert.pm, lib/Test/Unit/Assertion/CodeRef.pm, lib/Test/Unit/Assertion/Exception.pm, lib/Test/Unit/Assertion/Regexp.pm, t/assert.t, t/tlib/AssertTest.pm: - Fix breakage where coderef assertions were not failing. Coderef assertions are now expected to throw Test::Unit::Failures ($self->fail() is a convenient way of doing this; see updated docs). - New tests for assert(). - New multi_assert() for using multiple argument sets with one assertion (plus tests). - New assert_raises() for asserting that a coderef raises a particular class of exception (plus tests). * t/tlib/TestTest.pm: the famous scalar/regexp problem 2001-12-20 Adam Spiers * lib/Test/Unit/Assertion.pm: whitespace 2001-12-19 Adam Spiers * lib/Test/Unit/TestCase.pm: missed a print -> annotate change in the pod * t/tlib/AssertTest.pm: 3 more tests for ok() 2001-12-18 Adam Spiers * lib/Test/Unit/Loader.pm: fix problem with symbol tables containing symbol tables * lib/Test/Unit/TestCase.pm, lib/Test/Unit/TestRunner.pm: rename print() to annotate() 2001-12-11 Adam Spiers * lib/Test/Unit/Assert.pm, t/tlib/AssertTest.pm: - Add new assert_matches() and assert_does_not_match() assertions, as requested by Matthias Ferber, and new tests for them of course. - Start testing for the correct messages in T::U::Failure objects (see check_exception()). In particular this tests that the optional MESSAGE args are processed correctly when reporting failures. - Improved behaviour of assert_equals() and assert_not_equals() with undefined parameters. - Added more stringent tests for assert_equals() and assert_not_equals(). Some of these are possibly debatable. I think the assert_equals() matrix should be retired in favour of the check_failures() style tests used to check assert_not_equals(), since the latter also check the failure message and originating file/line (added a #FIXME for this). - Fixed reversed got/expected message with $self->ok(sub { 2 + 2 }, 4); Spotted this as a bonus of the new check_exception(), yay. * lib/Test/Unit/TestRunner.pm, t/try_examples.t: autoflush TestRunner's output stream 2001-12-07 Adam Spiers * lib/Test/Unit/TestRunner.pm: Don't need that \n *either*. Doh! * lib/Test/Unit/TestRunner.pm: don't need that \n either 2001-12-06 Adam Spiers * lib/Test/Unit/TestCase.pm: document print() 2001-12-05 Adam Spiers * doc/TODO, lib/Test/Unit/Exception.pm, lib/Test/Unit/Result.pm, lib/Test/Unit/TestCase.pm, lib/Test/Unit/TestRunner.pm: can now call $self->print("debugging stuff") within test case methods and if the test fails or "errors" you get to see all the debugging accumulated from the above calls 2001-12-04 Adam Spiers * doc/TODO: ideas from Test::More * doc/TODO: $Error::Depth bug fixed (I think) * lib/Test/Unit/Assert.pm: We seem to have obtained an extra 2 stack frames somewhere along the line. This makes the new, more stringent exception checking tests in AssertTest.pm pass. * t/tlib/AssertTest.pm: - Added hairiness to failure/error testing, so it now doesn't just check that the exception was raised, but also checks that its file() and line() methods point correctly to the source of the failed assertion. - Refactored duplicated code from check_failures() and check_errors() into check_exceptions() * lib/Test/Unit/TestCase.pm: tiny cosmetic tweak * TestLister.pl, lib/Test/Unit/TestCase.pm, lib/Test/Unit/TestSuite.pm: simple but pretty script for listing suite structure rather than running it * examples/fail_example.pm, lib/Test/Unit/Debug.pm: missed a few DEBUGs in fail_example.pm * Makefile.PL, doc/TODO: require base.pm version 1, so that a warning is generated for buggy base.pms * lib/Test/Unit.pm: link to AUTHORS file * TestRunner.pl: example usage of debugging * lib/Test/Unit/Loader.pm: avoid warning * AUTHORS: Kevin was listed twice 2001-12-03 Piers Cawley * AUTHORS: Added the list of Authors who've written code for PerlUnit. Almost certainly incomplete. Add your details please. 2001-12-03 Adam Spiers * lib/Test/Unit/HarnessUnit.pm: don't need that \n * doc/TODO: fixed * lib/Test/Unit/HarnessUnit.pm, lib/Test/Unit/Loader.pm, lib/Test/Unit/Result.pm, lib/Test/Unit/Setup.pm, lib/Test/Unit/Test.pm, lib/Test/Unit/TestCase.pm, lib/Test/Unit/TestRunner.pm, lib/Test/Unit/TestSuite.pm, lib/Test/Unit/UnitHarness.pm, t/all_tests.t, t/tlib/ListenerTest.pm, MANIFEST, lib/Test/Unit/Assert.pm, lib/Test/Unit/Debug.pm, lib/Test/Unit/Decorator.pm, lib/Test/Unit/Exception.pm: All debugging now happens through a simple unified debugging class Test::Unit::Debug. This allows the user to turn debugging on/off dynamically, still on a per-package basis, but in a more convenient way. Also eliminates the problem with `make test' failing when DEBUG is "compiled in". * doc/TODO: more jobs * t/tlib/TestTest.pm: should have a name * t/tlib/TestTest.pm: give inner classes names to avoid warnings in debugging 2001-11-30 Adam Spiers * lib/Test/Unit/TestCase.pm: this could come in handy when overriding list_tests() 2001-11-30 Piers Cawley * lib/Test/Unit.pm: Added a feedback section to Test::Unit's pod, suggesting that users join perlunit-users and generally give us some feedback. 2001-11-29 Adam Spiers * lib/Test/Unit/Loader.pm: forgot to put this die() in * MANIFEST, Makefile.PL, lib/Test/Unit.pm, lib/Test/Unit/Loader.pm, lib/Test/Unit/Procedural.pm, lib/Test/Unit/Test.pm, lib/Test/Unit/TestRunner.pm, lib/Test/Unit/TestSuite.pm, lib/Test/Unit/Warning.pm, t/tlib/AllTests.pm, t/tlib/InheritedSuite/OverrideNew.pm, t/tlib/InheritedSuite/OverrideNewName.pm, t/tlib/InheritedSuite/Simple.pm, t/tlib/InheritedSuite/TestNames.pm, t/tlib/SuiteTest.pm: some major improvements: - fixed the existing suite-building API, extended it, documented it fully, added/improved tests for it - reintroduced Test/Unit.pm, this time as a placeholder for $VERSION and some introductory pod containing pointers to the other modules - massive refactoring of Test::Unit::Loader - factored out Test::Unit::Suite::_warning into Test::Unit::Warning, so it could be used elsewhere [I think he meant Test::Unit::TestSuite::_warning -- mca, trying to prevent confusion] - fixed NoTestCaseClass test * examples/fail_example.pm, t/try_examples.t: add a couple of comments now I know what this Decorator/Setup business is about * t/try_examples.t: skip properly, don't just mark as TODO because they aren't TODO * lib/Test/Unit/Decorator.pm: whitespace * lib/Test/Unit/Setup.pm: don't want those prototypes * lib/Test/Unit/UnitHarness.pm: - @ISA = ('Exporter') line was overriding use base lines - whitespace now matches conventions we decided on * t/all_tests.t, t/assert.t, t/try_examples.t: these should be executable 2001-11-28 Adam Spiers * examples/README: get this up to date (ish) * lib/Test/Unit/Loader.pm: - get_package_name_from_file() never worked before (missing assignment to $filename). - remove dependency on FileHandle; this saves us a bit of code bloat if we're not using UnitHarness. * t/try_examples.t: I think this is right for fail_example.pm, maybe ... * examples/fail_example.pm: fail_example_testsuite_setup package needs to come second, otherwise Test::Unit::Loader::get_package_name_from_file returns the wrong suite. * t/tlib/ActiveTestTest.pm, t/tlib/Success.pm: - refactoring: no point having more than one Success test case - it should really have at least one successful test in it * lib/Test/Unit/Loader.pm: fix the pod * lib/Test/Unit/Loader.pm: - more suitable variable names - don't need no strict 'refs' - cosmetics * lib/Test/Unit/TestRunner.pm: TestRunner can run test cases *and* test suites * lib/Test/Unit/HarnessUnit.pm: missing use * doc/TODO: copyright stuff 2001-11-27 Adam Spiers * doc/TODO, lib/Test/Unit/TestSuite.pm: Allow test suites to be derived from Test::Unit::TestSuite! This turned out to be a relatively small change, and paves the way for vast improvements IMO. The old API should still work perfectly. * MANIFEST, README, doc/TODO, examples/patch100132, examples/patch100132-1, examples/patch100132-2, lib/Test/Unit.pm, lib/Test/Unit/Procedural.pm: renamed Test::Unit to Test::Unit::Procedural * lib/Test/Unit/Test.pm, lib/Test/Unit/TestRunner.pm: get the versioning uptodate and CPAN-compliant * TestRunner.pl, TkTestRunner.pl: there's no reason why these shouldn't be executable 2001-11-16 Adam Spiers * doc/TODO: done that * lib/Test/Unit/Loader.pm, t/tlib/AllTests.pm, t/tlib/BadSuite/BadUse.pm, t/tlib/BadSuite/SyntaxError.pm, t/tlib/BadSuitesTest.pm: - might as well have some debugging in Loader if we have DEBUG - fix misleading error when a suite has a bad dependency - add tests for correct runner error message in above bad dependency case, and for a straightforward syntax error 2001-11-15 Piers Cawley * MANIFEST: Added doc/TODO 2001-11-15 Adam Spiers * lib/Test/Unit/Test.pm: forgot to test DEBUG * doc/TODO: done some work on runner state and filtering * lib/Test/Unit/TestSuite.pm: only add tests via add_test() * MANIFEST, lib/Test/Unit/HarnessUnit.pm, lib/Test/Unit/Runner.pm, lib/Test/Unit/Test.pm, lib/Test/Unit/TestCase.pm, lib/Test/Unit/TestRunner.pm, lib/Test/Unit/TestSuite.pm, lib/Test/Unit/TkTestRunner.pm, lib/Test/Unit/UnitHarness.pm: - add new Runner base class which is an appropriate place for runner state common between all runners - very basic example of its usage: filter tokens - add something like this to your test case sub filter {{ 'slow' => [ 'test_a_slow_one', 'test_another_slow_one' ], 'really_slow' => [ 'test_wow_really_slow' ], }} then you can filter out slow tests via my $runner = new Test::Unit::TestRunner(); $runner->filter(qw/slow really_slow/); $runner->start($class); * lib/Test/Unit/TestRunner.pm: - tidy up output a bit - use T::U::Loader for loading main suite * doc/TODO: done that * t/all_tests.t, t/assert.t, t/tlib/ActiveTestTest.pm, t/tlib/AllTests.pm, t/tlib/AssertTest.pm, t/tlib/InheritedInheritedTestCase.pm, t/tlib/InheritedTestCase.pm, t/tlib/ListenerTest.pm, t/tlib/NoTestCaseClass.pm, t/tlib/NoTestCases.pm, t/tlib/OneTestCase.pm, t/tlib/OverrideTestCase.pm, t/tlib/Success.pm, t/tlib/SuiteTest.pm, t/tlib/TestAssertionCodeRef.pm, t/tlib/TestTest.pm, t/tlib/TornDown.pm, t/tlib/WasRun.pm, t/try_examples.t, MANIFEST, README, lib/Test/Unit/Assert.pm, lib/Test/Unit/TestCase.pm, lib/Test/Unit/TestRunner.pm, lib/Test/Unit/TestSuite.pm, lib/Test/Unit/TkTestRunner.pm, lib/Test/Unit/Tutorial.pm: move lib/Test/Unit/tests/*.pm to t/tlib * doc/TODO, doc/consensus.txt: moved some stuff to TODO * doc/consensus.txt: removing stuff about new assertion mechanism, this is now in HEAD and documented (Test::Unit::Assert*) * doc/TODO, doc/consensus.txt: new doc/TODO 2001-11-14 Adam Spiers * lib/Test/Unit/Assertion/Boolean.pm: get optional messages working just like with assert_str_equals etc. 2001-11-13 Adam Spiers * lib/Test/Unit/Assert.pm: - add support to ok() for optional comments - make ok() raise error not failure with bad args - fix assert_num_equals ditching optional comment * lib/Test/Unit/Assertion/Regexp.pm: making debugging more readable * lib/Test/Unit/Assertion/Boolean.pm: - fix typo which was hiding optional failure comment - making debugging more readable * lib/Test/Unit/Exception.pm: improve legibility of failures * lib/Test/Unit/Assert.pm: - finish ok() wrapper, and add tests for it - some refactoring into new check_failures() in T/U/tests/AssertTest.pm 2001-11-12 Adam Spiers * Makefile.PL: need 5.005 for qr//, thanks to Quinn Weaver for pointing that out 2001-11-12 Piers Cawley * lib/Test/Unit/Assertion.pm, lib/Test/Unit/Assertion/Boolean.pm, lib/Test/Unit/Assertion/CodeRef.pm, lib/Test/Unit/Assertion/Regexp.pm, lib/Test/Unit/Decorator.pm, lib/Test/Unit/Error.pm, lib/Test/Unit/Exception.pm, lib/Test/Unit/ExceptionError.pm, lib/Test/Unit/ExceptionFailure.pm, lib/Test/Unit/Failure.pm, lib/Test/Unit/HarnessUnit.pm, lib/Test/Unit/InnerClass.pm, lib/Test/Unit/Listener.pm, lib/Test/Unit/Loader.pm, lib/Test/Unit/Result.pm, lib/Test/Unit/Setup.pm, lib/Test/Unit/Test.pm, lib/Test/Unit/TestCase.pm, lib/Test/Unit/TestDecorator.pm, lib/Test/Unit/TestFailure.pm, lib/Test/Unit/TestListener.pm, lib/Test/Unit/TestLoader.pm, lib/Test/Unit/TestResult.pm, lib/Test/Unit/TestRunner.pm, lib/Test/Unit/TestSetup.pm, lib/Test/Unit/TestSuite.pm, lib/Test/Unit/TkTestRunner.pm, lib/Test/Unit/UnitHarness.pm, t/all_tests.t, t/assert.t, t/try_examples.t, .cvsignore, ChangeLog, Changes, MANIFEST, MANIFEST.SKIP, Makefile.PL, examples/README, examples/fail_example.pm, examples/patch100132, examples/procedural-adding-suites-example.pl, examples/procedural-another-package-example.pl, examples/procedural-fail-example.pl, examples/procedural-ok-example.pl, lib/Test/Unit.pm, lib/Test/Unit/Assert.pm: Merged changes from PDC_REFACTOR branch. * Makefile.PL, lib/Test/Unit/TestCase.pm: Tidied up some formatting in Test::Unit::TestCase and added a dependency to Makefile.PL 2001-11-12 Adam Spiers * doc/consensus.txt: coding style 2001-11-07 Adam Spiers * lib/Test/Unit/Assert.pm: ok(): support more cases * lib/Test/Unit/Assert.pm: oops, ok() needs to reverse order of got/expected args * ChangeLog: Bring ChangeLog uptodate for this branch. Hmm, maybe we should just let CVS and rcs2log do the hard work as far as change logs are concerned. * doc/consensus.txt: - only edit consensus.txt in HEAD - consensus on use vs. require * lib/Test/Unit/Exception.pm: cosmetics in failure output * lib/Test/Unit/Assert.pm: - cosmetics in failure output - add missing require (thanks to Hans Donner ) - add a controversial but very convenient and harmless alias: &ok -> &assert_equals * .cvsignore: New file. * .cvsignore: cvs-ignore Makefile * doc/consensus.txt: deal with broken base.pm issue 2001-10-31 Piers Cawley * MANIFEST: Tidied up the MANIFEST so make tardist works. * MANIFEST, t/try_examples.t: Fixed t/try_examples.t to recognize a passing test. 2001-10-30 Piers Cawley * lib/Test/Unit/TestRunner.pm, lib/Test/Unit/UnitHarness.pm, Makefile.PL: Tidied up output of TestRunner Added prerequisites to Makefile.PL Removed some dependencies on Test::Unit::InnerClass 2001-10-26 Adam Spiers * lib/Test/Unit/tests/AssertTest.pm: fix barewords error 2001-10-25 Adam Spiers * doc/consensus.txt: todo: check for broken Error.pms 2001-09-07 pdcawley * ChangeLog: Added some stuff in the ChangeLog * lib/Test/Unit/Result.pm: More doc fixes. * lib/Test/Unit/Result.pm, lib/Test/Unit/TestCase.pm: Doctored Test::Unit::Result again, so that if $test->run_bare *does* return false we actually add a failure instead of just leaving things up in the air (causes a problem with test harnesses if we don't) * lib/Test/Unit/Assert.pm, lib/Test/Unit/TestCase.pm, lib/Test/Unit/tests/AssertTest.pm, ChangeLog: Tidied up the documentation in Test::Unit::Assert. Made sure that Test::Unit::TestCase::run_bare returns true if it doesn't throw an exception. * lib/Test/Unit/TestCase.pm: An attempt at improving the documentation. * lib/Test/Unit/Setup.pm: New file. * Changes, MANIFEST, examples/README, examples/fail_example.pm, lib/Test/Unit/Setup.pm, lib/Test/Unit/TestSetup.pm: Renamed Test::Unit::TestSetup to Test::Unit::Setup * lib/Test/Unit/Listener.pm, lib/Test/Unit/tests/ListenerTest.pm: New file. * MANIFEST, lib/Test/Unit/HarnessUnit.pm, lib/Test/Unit/Listener.pm, lib/Test/Unit/TestListener.pm, lib/Test/Unit/TestRunner.pm, lib/Test/Unit/TkTestRunner.pm, lib/Test/Unit/UnitHarness.pm, lib/Test/Unit/tests/AllTests.pm, lib/Test/Unit/tests/ListenerTest.pm, lib/Test/Unit/tests/TestListenerTest.pm: Renamed Test::Unit::TestListener to Test::Unit::Listener * lib/Test/Unit/Decorator.pm: New file. * MANIFEST, lib/Test/Unit/Decorator.pm, lib/Test/Unit/TestDecorator.pm, lib/Test/Unit/TestSetup.pm: Renamed Test::Unit::TestDecorator to Test::Unit::Decorator * lib/Test/Unit/Loader.pm: New file. * ChangeLog, MANIFEST, lib/Test/Unit/HarnessUnit.pm, lib/Test/Unit/Loader.pm, lib/Test/Unit/TestListener.pm, lib/Test/Unit/TestLoader.pm, lib/Test/Unit/TkTestRunner.pm: Renamed Test::Unit::TestLoader to Test::Unit::Loader 2001-09-07 Piers Cawley * lib/Test/Unit/TestCase.pm (run_bare): Made sure it returns true if it doesn't throw an exception. * lib/Test/Unit/tests/AssertTest.pm (test_fail_assert_not_equals): (test_success_assert_not_equals): Added tests for assert_not_equals. * lib/Test/Unit/Assert.pm Doc fixes. (assert_not_equals): Aadded the option to assert that things aren't equal. Also added appropriate (assert_(str|num)_not_equals) methods. 2001-09-02 Piers Cawley * lib/Test/Unit/Loader.pm (load): Improved the error message when a file can be found, but has a syntax error. * lib/Test/Unit/TestFailure.pm: Removed. * lib/Test/Unit/InnerClass.pm: Removed * lib/Test/Unit/tests/AssertTest.pm Switched to a ResultsMatrix style of testing. Seems to work quite well... * lib/Test/Unit/Assert.pm (is_numeric): Got rid of warnings when the argument isn't numeric. * t/all_tests.t: * t/assert_test.t: Got rid of C since blib should be handling that. * lib/Test/Unit/tests/TestTest.pm: Basic refactoring to use Class::Inner. (make_dummy_testcase): New helper method to make anonymous classes used in many of the tests. * lib/Test/Unit/Assertion/Boolean.pm (do_assertion): Switched to a slightly more sensible way of generating failure messages. * lib/Test/Unit/Loader.pm (load): Changed the order in which we call C and C. * lib/Test/Unit/TestResult.pm: Removed dependency on Test::Unit::TestFailure. * lib/Test/Unit/ExceptionError.pm (make_from_error_simple): Fixed things up slightly. This method maybe needs a leading underscore; Framework users should probably never see it... * lib/Test/Unit/Assertion.pm (fail): Fixed things to put appropriate information into the thrown exception. * lib/Test/Unit/Assert.pm: General refactoring work to get things working with the CPAN modules. (assert): Now, when an exception is generated, we try and get the appropriate caller information for setting -line and -file. Which is nice. (assert_equals): Fixed to use try/catch. Fixed a nasty bug with @_ getting silently emptied via try, so now, before we call try, we copy @_ to @args and use that inside the closure, otherwise assert_equals would always return true. (assert_str_equals,assert_num_equals,assert_null,assert_not_null): All now set $Error::Depth correctly. * lib/Test/Unit/Exception.pm (stringify): Tidied up stringification. (failed_test, thrown_exception): We now conform to the Test::Unit::TestFailure interface. Which means that we can get rid of Test::Unit::TestFailure itself. Which is nice. * lib/Test/Unit.pm: Switched to using Devel::Symdump, Class::Inner and Error (assert): Moved to the try/catch style. (create_suite): Vaguely major refactoring. Switched to using Devel::Symdump and Class::Inner instead of the hand rolled symbol table manipulation and Test::Unit::InnerClass 2001-08-31 Piers Cawley * lib/Test/Unit.pm: Fixed a silly typo induced bug. * MANIFEST, MANIFEST.SKIP, Makefile.PL, examples/patch100132, examples/procedural-adding-suites-example.pl, examples/procedural-another-package-example.pl, examples/procedural-fail-example.pl, examples/procedural-ok-example.pl, lib/Test/Unit.pm, lib/Test/Unit/Assertion.pm, lib/Test/Unit/Assertion/Boolean.pm, lib/Test/Unit/Assertion/CodeRef.pm, lib/Test/Unit/Assertion/Regexp.pm, lib/Test/Unit/Exception.pm, lib/Test/Unit/ExceptionError.pm, lib/Test/Unit/HarnessUnit.pm, lib/Test/Unit/InnerClass.pm, lib/Test/Unit/Test.pm, lib/Test/Unit/TestCase.pm, lib/Test/Unit/TestDecorator.pm, lib/Test/Unit/TestFailure.pm, lib/Test/Unit/TestLoader.pm, lib/Test/Unit/TestResult.pm, lib/Test/Unit/TestRunner.pm, lib/Test/Unit/TestSetup.pm, lib/Test/Unit/TestSuite.pm, t/try_examples.t: Beginnings of a major refactoring. 1. Replace Test::Unit::InnerClass with Class::Inner 2. Use Error.pm as the basis for exception handling and try/catch/... in place of eval. 3. Use Devel::Symdump in place of hand rolled symbol table manipulation. 4. Also includes an attempt at an 'assert_equals' that does the right thing in most cases. Tries to make reasonable guesses about numeric or string comparison, and can make use of object based equality things. 5. Started to port jUnit tests that make sense in the context of PerlUnit. TODO: Need to get the procedural Test::Unit working. Or abandon it. However, it does do some stuff that Test::More and friends don't (no plan testing that actually produces a sensible 'test count') Write more tests. (Patches welcome) * t/assert.t: Calls the (too) simple set of tests for Test::Unit::Assert and friends. * t/assert.t: New file. 2001-08-30 Piers Cawley * lib/Test/Unit/Assert.pm: Removed some warnings when called with 'undef'. Also added a stringification of undef to when reporting failures... 2001-06-18 Christian Lemburg * Changes, MANIFEST, examples/README, examples/fail_example.pm, lib/Test/Unit.pm, lib/Test/Unit/TestDecorator.pm, lib/Test/Unit/TestResult.pm, lib/Test/Unit/TestSetup.pm: added TestSetup and TestDecorator by Kevin Connor 2001-05-05 Christian Lemburg * README, Changes: for version 0.14 * t/try_examples.t: do not assume order of tests will be constant * lib/Test/Unit/Assertion/Boolean.pm: fix for problem with use base and older perls * lib/Test/Unit/Assert.pm: document Piers additions * lib/Test/Unit.pm: new version, updated team member list 2001-04-27 Matthew Astley * t/try_examples.t: add redirection warning for Win32 2001-04-09 Matthew Astley * doc/consensus.txt: wittering about packaging, plus my vague plan for things I fancy doing * t/try_examples.t: checks STDOUT & STDERR together, from invoking the examples doesn't look at return codes 2001-03-19 Piers Cawley * lib/Test/Unit.pm, lib/Test/Unit/InnerClass.pm, lib/Test/Unit/TestSuite.pm, lib/Test/Unit/UnitHarness.pm: Redid Test::Unit::InnerClass to be more 'classlike'. (ie, calling Test::Unit::InnerClass::make_inner_class as a class method rather than as a direct subroutine call) Added Test::Unit::InnerClass::make_inner_class_with_coderefs Instead of taking an extension_text argument, takes a hash of coderefs and uses the keys as method names. Lets you do closure magic and the like when creating inner classes. Moved Test::Unit::InnerClass::make_inner_class to T::U::IC::make_inner_class_with_text. The make_inner_class subroutine now looks at $_[2] to determine whether to dispatch to the _with_text version of the method or the _with_coderefs version. Modified all the clients of Test::Unit::InnerClass to do proper Class based method dispatch. Modified Test::Unit::tests::TestTest to create some of its inner classes using the 'hash of coderefs' approach. Didn't do the documentation yet. 2001-03-17 Christian Lemburg * Makefile.PL: take version number for distribution file from lib/Test/Unit.pm * doc/release-checklist: changed to take distribution file version number from lib/Test/Unit.pm * doc/release-checklist: more documentation on release procedure * doc/release-checklist: added documentation on release procedure and explanation of version number stuff * lib/Test/Unit.pm: Added version number again, it has to be in the module, added explanation 2001-03-08 Piers Cawley * MANIFEST.SKIP, Makefile.PL, lib/Test/Unit/Assert.pm, lib/Test/Unit/Assertion.pm, lib/Test/Unit/Assertion/Boolean.pm, lib/Test/Unit/Assertion/CodeRef.pm, lib/Test/Unit/Assertion/Regexp.pm, lib/Test/Unit/Exception.pm, lib/Test/Unit/TestFailure.pm, lib/Test/Unit/TestRunner.pm, MANIFEST: Merged the pdc_coderefassert branch. 2001-03-07 Adam Spiers * lib/Test/Unit/TestCase.pm: add missing use 2001-03-06 Piers Cawley * doc/consensus.txt: Added some commentary * lib/Test/Unit/Assert.pm: Stopped Test::Unit::Assert::normalize_assert from dying when passed an object that can't 'do_assertion'. Instead treats it as the argument for Test::Unit::Assertion::Boolean::new. (Came across this bug while testing some of my 'real' code). This should also mean that, if you package Foo; use overload bool => sub {...} Then assertion will continue to work properly. I've added a test for the simple case -- T:U:t:TestTest::test_assert_with_non_assertion_object (essentially it's always going to be true in this instance), but not for the case where 'bool' is overridden. I'll leave that as an exercise for the interested reader (plus I'm not sure how to make inner classes do overrides). 2001-03-06 Matthew Astley * doc/consensus.txt: updates 2001-03-05 Piers Cawley * lib/Test/Unit/Assert.pm, lib/Test/Unit/Assertion.pm: Added some appropriate 'require's to these class files. * Makefile.PL, lib/Test/Unit/Assertion.pm, lib/Test/Unit/Assertion/Boolean.pm, lib/Test/Unit/Assertion/CodeRef.pm, lib/Test/Unit/Assertion/Regexp.pm: Added a bunch of documentation to T::U::Assertion and its subclasses. Removed the dependency on B::Deparse (I think. If someone who hasn't got this installed could test it...) 2001-03-05 Adam Spiers * t/fail.t: Removing to avoid misguided fails on `make test'. Brian can resurrect it if he wants when he resurfaces. * lib/Test/Unit/TestResult.pm: slightly more informative debug message in run() 2001-03-02 Piers Cawley * lib/Test/Unit/Assertion/Regexp.pm: Corrected a typo. * lib/Test/Unit/Assertion.pm, lib/Test/Unit/Assertion/Boolean.pm, lib/Test/Unit/Assertion/CodeRef.pm, lib/Test/Unit/Assertion/Regexp.pm: New file. * lib/Test/Unit/Assert.pm, lib/Test/Unit/Assertion.pm, lib/Test/Unit/Assertion/Boolean.pm, lib/Test/Unit/Assertion/CodeRef.pm, lib/Test/Unit/Assertion/Regexp.pm: Reified assertions. Added assertion classes for coderefs, regular expressions and booleans. Now Test::Unit::Assert::assert takes the first argument, the assertion, creates an appropriate assertion object, and calls the object's do_assertion method. This seems to be a win. Check out T::U::tests::SuiteTest and the 'basic_assertion' method. This is possibly using a coderef for the sake of it, but it's one way of testing it hard... If you check out T::U::tests::TestTest you'll see a big win on the regexp front. Instead of $self->assert(scalar("foo" =~ /bar/), "Should not match"); we have $self->assert(qr/bar/, "foo"); (I haven't worked out how to name such an assertion, but the default error message for that would look like: 'foo' did not match /(?-xism:bar)/ which is pretty useful already) 2001-02-28 Matthew Astley * doc/consensus.txt: append * lib/Test/Unit/TestCase.pm: Use the class 'isa' not the global one * doc/consensus.txt, lib/Test/Unit/TestCase.pm: fix exceptions that look like object names 2001-02-27 Matthew Astley * doc/consensus.txt: First cut should mention most current issues 2001-02-27 Piers Cawley * Makefile.PL: Added the B::Deparse prerequisite. * MANIFEST, lib/Test/Unit/Assert.pm, lib/Test/Unit/Exception.pm, lib/Test/Unit/TestFailure.pm, lib/Test/Unit/TestRunner.pm: Added an option to call assert with a coderef (currently using the coderef_assert method, but if this is accepted we'll make the 'assert' method DTRT.) Taken advantage of this to tidy up the kind of error reporting that gets done. Which is nice. Still needs a pile of work done, but I think it's a start. 2001-02-27 Christian Lemburg * lib/Test/Unit/TestCase.pm, lib/Test/Unit/TestSuite.pm: patch by Piers Cawley to fix overriden tests 2001-02-22 Adam Spiers * lib/Test/Unit/Exception.pm: fixed small bug where new() was assumed to be always used as an instance method and never as a class method * lib/Test/Unit/InnerClass.pm: - slightly improve legibility and remove need for no strict 'refs' - die with helpful error if compilation of inner class fails * lib/Test/Unit/HarnessUnit.pm: - make runner output more concise and legible - do not exit(-1) on failures, as that breaks TestHarness - output $exception->to_string() rather than $exception->stacktrace() to avoid hiding valuable error messages - standardise whitespace * lib/Test/Unit/TestListener.pm: fix trivial braino in croak message 2001-02-22 Matthew Astley * doc/release-checklist: Stash consensus reached so far on the mailing list 2001-02-20 Matthew Astley * lib/Test/Unit/Assert.pm, lib/Test/Unit/Exception.pm, lib/Test/Unit/ExceptionError.pm, lib/Test/Unit/ExceptionFailure.pm, lib/Test/Unit/HarnessUnit.pm, lib/Test/Unit/InnerClass.pm, lib/Test/Unit/Test.pm, lib/Test/Unit/TestCase.pm, lib/Test/Unit/TestFailure.pm, lib/Test/Unit/TestListener.pm, lib/Test/Unit/TestLoader.pm, lib/Test/Unit/TestResult.pm, lib/Test/Unit/TestRunner.pm, lib/Test/Unit/TestSuite.pm, lib/Test/Unit/TkTestRunner.pm, lib/Test/Unit/Tutorial.pm, lib/Test/Unit/UnitHarness.pm, lib/Test/Unit.pm: Fixes Bug#133287: Remove indentation from pod 2001-02-17 Christian Lemburg * README, Changes, Makefile.PL: version 0.13 * lib/Test/Unit.pm: removed misleading version info * lib/Test/Unit.pm: make people aware of message arg * examples/procedural-fail-example.pl: show that procedural interface can handle regex problem * lib/Test/Unit.pm: added function prototype for assert() * lib/Test/Unit/Assert.pm: added documentation about regex in boolean context * lib/Test/Unit/TkTestRunner.pm: make the GUI adhere to hide of stacktrace, too - patch by David Esposito * lib/Test/Unit/Assert.pm: mention optional message arg to assert - variant of patch by David Esposito * lib/Test/Unit/Assert.pm, lib/Test/Unit/TestCase.pm: corrected patch to hide backtrace 2001-02-06 Christian Lemburg * Changes, Makefile.PL, README, lib/Test/Unit.pm, lib/Test/Unit/Assert.pm, lib/Test/Unit/Exception.pm, lib/Test/Unit/TestCase.pm: added patch by Matthew Astley to quell backtrace on failed tests 2000-07-09 Christian Lemburg * lib/Test/Unit/TestCase.pm: Eliminated two blanks in pod documentation that caused problems 2000-05-07 Christian Lemburg * Changes, MANIFEST, README, test.pl: moved to standard CPAN style * examples/README: corrected typo * examples/Experimental/Sample.pm, examples/README, examples/patch100132, examples/patch100132-1, examples/patch100132-2: added explanation of examples, added reply to patch100132 2000-04-22 Christian Lemburg * lib/Test/Unit.pm, lib/Test/Unit/Assert.pm, lib/Test/Unit/Exception.pm, lib/Test/Unit/ExceptionError.pm, lib/Test/Unit/ExceptionFailure.pm, lib/Test/Unit/HarnessUnit.pm, lib/Test/Unit/InnerClass.pm, lib/Test/Unit/Test.pm, lib/Test/Unit/TestCase.pm, lib/Test/Unit/TestFailure.pm, lib/Test/Unit/TestListener.pm, lib/Test/Unit/TestLoader.pm, lib/Test/Unit/TestResult.pm, lib/Test/Unit/TestRunner.pm, lib/Test/Unit/TestSuite.pm, lib/Test/Unit/TkTestRunner.pm, lib/Test/Unit/Tutorial.pm, lib/Test/Unit/UnitHarness.pm: added and/or modified documentation * lib/Test/Unit/TestResult.pm, lib/Test/Unit/HarnessUnit.pm, lib/Test/Unit/InnerClass.pm, lib/Test/Unit/Test.pm, lib/Test/Unit/TestSuite.pm, lib/Test/Unit/Assert.pm, lib/Test/Unit/Exception.pm, lib/Test/Unit/ExceptionError.pm, lib/Test/Unit/ExceptionFailure.pm, lib/Test/Unit/Tutorial.pm: added documentation * lib/Test/Unit/TestCase.pm, lib/Test/Unit.pm: modified documentation * lib/Test/Unit.pm: added documentation 2000-03-06 Christian Lemburg * lib/Test/Unit/TestCase.pm: Fixed bug in POD * lib/Test/Unit/TestCase.pm: better documentation * lib/Test/Unit.pm: removed useless paranoid reload avoidance code 2000-03-05 Christian Lemburg * lib/Test/Unit/Tutorial.pm: container for tutorial on unit testing with framework * examples/procedural-adding-suites-example.pl: example for procedural API test suite composition feature * README: procedural API can now compose test suites, too * lib/Test/Unit.pm: added procedural API test suites composing feature add_suite() 2000-03-04 Christian Lemburg * README, examples/procedural-another-package-example.pl: added inter-package suite creation and run features to Procedural API * lib/Test/Unit.pm: added inter-package suite creation and run features * lib/Test/Unit/Exception.pm: changed stacktrace to begin at level of caller of Exception->new() * lib/Test/Unit/TestCase.pm: fixed run_bare() debug output to say it comes from run_bare, not _run_bare * lib/Test/Unit/HarnessUnit.pm, lib/Test/Unit/TestCase.pm: removed useless middleman _run() * lib/Test/Unit.pm: exported names will be seen on multiple uses, added filehandle arg to run_suite * lib/Test/Unit/TestRunner.pm: removed _run method, changed exit() to die() and return for ending run 2000-02-29 Christian Lemburg * lib/Test/Unit/TestCase.pm: first start at some documentation * lib/Test/Unit/Test.pm, lib/Test/Unit/TestSuite.pm: enlarged Test interface (name, to_string), TestSuite run() returns result * lib/Test/Unit/TestSuite.pm: fixed bug in eval subroutine run_test in warning() - missing right curly 2000-02-27 Brian Ewins * lib/Test/Unit/TkTestRunner.pm: Fixed copyright notice 2000-02-27 Christian Lemburg * README, examples/procedural-fail-example.pl, examples/procedural-ok-example.pl: removed use lib from procedural API examples, use -I on commandline instead 2000-02-26 Christian Lemburg * lib/Test/Unit/TestRunner.pm: TestRunner now also uses Benchmark for timing info * examples/procedural-fail-example.pl: show we also can handle messages ... has not been advertised yet ... * README, examples/procedural-fail-example.pl, examples/procedural-ok-example.pl, lib/Test/Unit.pm: first cut at a procedural API wrapper, with examples (see README) * lib/Test/Unit/Exception.pm: nicer output again * lib/Test/Unit/Exception.pm, lib/Test/Unit/TestFailure.pm: modified stringifying methods and their interplay for nicer output on errors * lib/Test/Unit/Test.pm, lib/Test/Unit/TestCase.pm: Test inherits from Assert now, so TestCase and TestSuite can now assert() 2000-02-25 Christian Lemburg * lib/Test/Unit/InnerClass.pm: removed use of constant module to avoid warnings when reloading in test 2000-02-25 Brian Ewins * lib/Test/Unit/TkTestRunner.pm: Fixed the File and About dialogs. 2000-02-24 Christian Lemburg * lib/Test/Unit/Exception.pm: separated to_string(), get_message(), and stacktrace() 2000-02-24 Brian Ewins * lib/Test/Unit/TkTestRunner.pm: Whoops forgot line to set the number of planned tests in progress bar... * TkTestRunner.pl, lib/Test/Unit/TestLoader.pm, lib/Test/Unit/TkTestRunner.pm, lib/Test/Unit/UnitHarness.pm: Many updates to GUI, now nearer to JUnit. Private stub exceptions/testcases used in UnitHarness to complete wrapping. 2000-02-23 Christian Lemburg * MANIFEST, README, lib/Test/Unit/InnerClass.pm, lib/Test/Unit/TestCase.pm, lib/Test/Unit/TestSuite.pm, lib/Test/Unit/UnitHarness.pm: fixed make_inner_class(), put it in own module, changed calls, added testcase 2000-02-23 Brian Ewins * lib/Test/Unit/HarnessUnit.pm, lib/Test/Unit/TkTestRunner.pm, lib/Test/Unit/UnitHarness.pm, t/fail.t: Lots of GUI bug fixes. Doh! * lib/Test/Unit/TestLoader.pm, lib/Test/Unit/TkTestRunner.pm: Bugfixes in GUI and Loader now recognizes arbitrary .pm's * lib/Test/Unit/TestLoader.pm, lib/Test/Unit/TkTestRunner.pm, lib/Test/Unit/UnitHarness.pm: Nicer looking but still incomplete GUI with all-new 'ArrayBar' widget. Support for '.t' tests added to TestLoader, so now GUI supports them again. Display of .t fails should be improved next... GUI shows progress correctly *except* when dealing with .t tests because 'plan()' method isnt implemented in TestRunner. Exception details dialog added. Currently the code to collect these details for .t tests (ie the 'verbose' output between ok/not ok messages) is not collected. 2000-02-22 Christian Lemburg * lib/Test/Unit/TestSuite.pm: fixed extraction of test suite to work across whole inheritance tree * lib/Test/Unit/TestResult.pm: deleted useless sanity check method clone_listeners * lib/Test/Unit/TestSuite.pm: resolved overloading of constructor by introducing string constructor empty_new * lib/Test/Unit/TestRunner.pm: deleted sub extract_class_name and changed suite method test to can() 2000-02-22 Brian Ewins * t/all_tests.t, lib/Test/Unit/HarnessUnit.pm, lib/Test/Unit/TestLoader.pm: Fleshed out HarnessUnit and implemented (sortof) tests for it. TestLoader was updated to recognize classes with a suite method. 2000-02-22 Christian Lemburg * lib/Test/Unit/TestCase.pm, lib/Test/Unit/TestResult.pm, lib/Test/Unit/TestRunner.pm, lib/Test/Unit/TestSuite.pm, README, test.pl: added TestSuite tests - 21 tests running OK 2000-02-21 Brian Ewins * README, TkTestRunner.pl, lib/Test/SuiteWrapper.pm, lib/Test/Unit/HarnessUnit.pm, lib/Test/Unit/TestListener.pm, lib/Test/Unit/TestLoader.pm, lib/Test/Unit/TestResult.pm, lib/Test/Unit/TestRunner.pm, lib/Test/Unit/TkTestRunner.pm, lib/Test/Unit/UnitHarness.pm: Integrated TkTestRunner. Added partial TestLoader and fleshed out TestListener. 2000-02-21 Christian Lemburg * lib/Test/Unit.pm: Deleted Unit.pm - it has been splitted to separate class files * MANIFEST, README, TestRunner.pl, lib/Test/Unit/Assert.pm, lib/Test/Unit/Exception.pm, lib/Test/Unit/ExceptionError.pm, lib/Test/Unit/ExceptionFailure.pm, lib/Test/Unit/Test.pm, lib/Test/Unit/TestCase.pm, lib/Test/Unit/TestFailure.pm, lib/Test/Unit/TestListener.pm, lib/Test/Unit/TestResult.pm, lib/Test/Unit/TestRunner.pm, lib/Test/Unit/TestSuite.pm, test.pl: Running first version, separate class files, CPAN style method names 2000-02-20 Brian Ewins * Changes, MANIFEST, Makefile.PL, examples/tester.pl, examples/tester.png, lib/Test/SuiteWrapper.pm, lib/Test/Unit.pm, test.pl: A work area for the new 'Test::Unit'. This currently contains: - standard CPAN bundling - Christian's test.pl and new Unit.pm (as lib/Test/Unit.pm) - my own 'Test::SuiteWrapper.pm', which works on test::harness tests; - examples/tester.pl - a Tk gui for using SuiteWrapper. - examples/tester.png - a screenshot. oooh. Test-Unit-0.25/COPYING.GPL-20000644000175000017500000004311010273474152015241 0ustar mca1001mca100100000000000000 GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Library General Public License instead of this License. Test-Unit-0.25/Makefile.PL0000644000175000017500000000075507403164645015414 0ustar mca1001mca100100000000000000use ExtUtils::MakeMaker; # See lib/ExtUtils/MakeMaker.pm for details of how to influence # the contents of the Makefile that is written. require 5.005; WriteMakefile( 'NAME' => 'Test::Unit', 'VERSION_FROM' => 'lib/Test/Unit.pm', # finds $VERSION 'PREREQ_PM' => { Class::Inner => 0, Devel::Symdump => 0, Error => 0, base => 1, }, );