
I'd like to request a formal review for the Hash2 library https://github.com/pdimov/hash2 https://pdimov.github.io/hash2/ (by Christian Mazakas and myself.) The library implements an extensible framework for implementing hashing algorithms that can support user-defined types. Its structure is largely based on the paper "Types don’t know #" by Howard Hinnant, Vinnie Falco and John Bytheway. https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n3980.html We're looking for a review manager. Comments and questions are welcome; you don't need to wait for the review.

I'd like to request a formal review for the Hash2 library
https://github.com/pdimov/hash2 https://pdimov.github.io/hash2/
(by Christian Mazakas and myself.)
The library implements an extensible framework for implementing hashing algorithms that can support user-defined types. Its structure is largely based on the paper "Types don’t know #" by Howard Hinnant, Vinnie Falco and John Bytheway.
https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n3980.html
We're looking for a review manager.
Comments and questions are welcome; you don't need to wait for the review.
I will endorse the review of the library, and volunteer as the review manager. Since Peter is the lead author (383 commits to 39 for Christian at time of writing), I don't see a real conflict of interest here despite Christian and I both being C++Alliance Employees. In case someone else was going to ask I previously asked about SHA3 support. Peter's response on Slack was "this library wasn't really supposed to be a repository of cryptographic hashes, we had to have some to prove that they work in the framework". I thought this was fair and did not push the issue further. Peter also mentioned he would like to review the library soon, and December 7-15 seems feasible. I have no qualms with this time slot assuming sufficient reviewers are available. Matt

On Mon, 2 Dec 2024 at 21:24, Matt Borland via Boost <boost@lists.boost.org> wrote:
Peter also mentioned he would like to review the library soon, and December 7-15 seems feasible.
Although it may feel like scheduling review in last minute, I don't see why it shouldn't be scheduled for next week. Best regards, -- Mateusz Loskot on behalf of the Review Wizards

It's been a while with the reply etiquette and using gmail, apologies in advance. 1. is_endian_independent is a nice touch, something that's oft overlooked 2. Seems to be missing some other hashes like BLAKE, SHA3. 3. Do we have a checksum library with CRC32/32C/64/64NVME (the new one AWS S3 is using)? Do they belong here? 4. The benchmark seems like it uses a typical time-boxed chrono calculation. Is there really not a canned implementation of that somewhere? 5. Is the benchmark using sufficient content to avoid overwhelming cache optimization? 6. There's a header-only implementation of SHA1 in uuid (*iirc...), will we be moving to use this?

James E. King III wrote:
2. Seems to be missing some other hashes like BLAKE, SHA3.
There's an infinite amount of hashes that can potentially be added; since the library is (at least in principle) not about the provided hash algorithms, but about the framework allowing user-defined objects to be hashed by any algorithm satisfying the concept, I didn't want to turn it into a repository of hash algorithms. Of course, if SHA3 (f.ex.) is requested by users, we'll consider adding it. The current selection is intended to cover all major use cases and serve as a proof of concept that the framework is able to support them.
3. Do we have a checksum library with CRC32/32C/64/64NVME (the new one AWS S3 is using)? Do they belong here?
There's Boost.CRC.
4. The benchmark seems like it uses a typical time-boxed chrono calculation. Is there really not a canned implementation of that somewhere?
Maybe; nothing comes to mind at the moment.
5. Is the benchmark using sufficient content to avoid overwhelming cache optimization?
Hash functions are rarely faster than main memory, so going out of L3 isn't that important, at least at the moment. The benchmark is useful enough for getting a quick impression how the various functions perform relative to each other.
6. There's a header-only implementation of SHA1 in uuid (*iirc...), will we be moving to use this?
There's MD5 in UUID too (which you added.) We can move to this, but it's not necessary. UUID has very few dependencies (at the moment) and people like it that way, because it's a library they often want to use without bringing in more from Boost.

Read documentation for 20 minutes so apologies in advance is some of questions are too obvious. 1) did you consider using something like std::span here? I presume answer is yes, but you do not want to limit library to C++20 onwards. HashAlgorithm( unsigned char const* seed, std::size_t n ); void update( void const* data, std::size_t n ); 2) From what I see there is no way for algorithm to say it only works on aligned data, e.g. to avoid runtime check of data alignment because SIMD instructions? E.g void update_aligned<32>( void const* data, std::size_t n ); Would this be too much complication for too little performance gain(not to mention UB risk)? Not an expert, just know performance was motivation for std::assume_aligned <https://open-std.org/JTC1/SC22/WG21/docs/papers/2018/p1007r1.pdf> 3) I see there is nice trait is_contiguously_hashable trait(padding was one of first things I wondered when reading docs), and also a documentation on how to deal with other types, including when user provides his own hash customization. One thing I would ask regarding design is the following example: std::string a; int b; // not part of the salient state void const* c; friend bool operator==( X const& x1, X const& x2 ) { return x1.a == x2.a && x1.b == x2.b; } template<class Hash, class Flavor> friend void tag_invoke( boost::hash2::hash_append_tag const&, Hash& h, Flavor const& f, X const& v ) { boost::hash2::hash_append(h, f, v.a); boost::hash2::hash_append(h, f, v.b ); } Here both tag_invoke and operator == need to remember to use same fields. Would it be possible to have support so that both hash and operator == can use member function helper that returns tuple of references( to salient fields)? e.g. assume this is my current code and I want to add hash support for it. struct X { int a; short b; short cached_something; constexpr auto repr() const { return std::tie(a,b); } constexpr bool operator == (const X& other) const { return repr() == other.repr(); } }; I know Mp11 has tuple_for_each, but I wonder if it would be nice to have something that makes this idiom easier to use? 4) Paper mentioned is quite old, but if you remember... do you have some feedback paper received at the time? On Mon, Dec 2, 2024 at 8:49 PM Peter Dimov via Boost <boost@lists.boost.org> wrote:
I'd like to request a formal review for the Hash2 library
https://github.com/pdimov/hash2 https://pdimov.github.io/hash2/
(by Christian Mazakas and myself.)
The library implements an extensible framework for implementing hashing algorithms that can support user-defined types. Its structure is largely based on the paper "Types don’t know #" by Howard Hinnant, Vinnie Falco and John Bytheway.
https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n3980.html
We're looking for a review manager.
Comments and questions are welcome; you don't need to wait for the review.
_______________________________________________ Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost

On Mon, Dec 2, 2024 at 9:59 PM Ivan Matek <libbooze@gmail.com> wrote:
Read documentation for 20 minutes so apologies in advance is some of questions are too obvious.
1) did you consider using something like std::span here? I presume answer is yes, but you do not want to limit library to C++20 onwards.
HashAlgorithm( unsigned char const* seed, std::size_t n ); void update( void const* data, std::size_t n );
3) I see there is nice trait is_contiguously_hashable trait(padding was one of first things I wondered when reading docs), and also a documentation on how to deal with other types, including when user provides his own hash customization. One thing I would ask regarding design is the following example: std::string a; int b; // not part of the salient state void const* c; friend bool operator==( X const& x1, X const& x2 ) { return x1.a == x2.a && x1.b == x2.b; } template<class Hash, class Flavor> friend void tag_invoke( boost::hash2::hash_append_tag const&, Hash& h, Flavor const& f , X const& v ) { boost::hash2::hash_append(h, f, v.a); boost::hash2:: hash_append(h, f, v.b); } Here both tag_invoke and operator == need to remember to use same fields. Would it be possible to have support so that both hash and operator == can use member function helper that returns tuple of references( to salient fields)? e.g. assume this is my current code and I want to add hash support for it.
struct X { int a; short b; short cached_something; constexpr auto repr() const { return std::tie(a,b); } constexpr bool operator == (const X& other) const { return repr() == other.repr(); } };
I know Mp11 has tuple_for_each, but I wonder if it would be nice to have something that makes this idiom easier to use?
To answer my own questions: 1) this is never directly called by users so no need for safer API 3) there is overload of hash_append that works for tuples, nice Sorry for noise.

Ivan Matek wrote:
2) From what I see there is no way for algorithm to say it only works on aligned data, e.g. to avoid runtime check of data alignment because SIMD instructions? E.g
void update_aligned<32>( void const* data, std::size_t n ); Would this be too much complication for too little performance gain(not to mention UB risk)? Not an expert, just know performance was motivation for std::assume_aligned <https://open-std.org/JTC1/SC22/WG21/docs/papers/2018/p1007r1.pdf>
Since most hash functions process the input in blocks of some fixed size, the structure of the `update` function is generally if( we have an incomplete block from last update ) complete block from the input and process it process however many complete blocks we have store the remainder for the next call to update Even if the input is aligned at the call to update, there's no guarantee it will remain aligned after the first step, so nothing would be gained. The function will still have to check for alignment at the beginning of step 2 in either case. Not that we have any SIMD optimizations at this point, but even if we had, it still wouldn't be worth complicating the interface for that.
4) Paper mentioned is quite old, but if you remember... do you have some feedback paper received at the time?
I didn't follow the committee at that time too closely, so that's more of a question for Howard Hinnant (if he still reads here) or Vinnie Falco. My informed guess is that when N3980 was submitted, there was a competing Google proposal https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3333.html and, since the committee doesn't like to pick between competing proposals, its usual strategy is to tell authors to work it out between themselves. I can see that there's a later Google proposal https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/p0029r0.html that is supposedly an unification, but it doesn't seem to have moved forward either, and I don't know why. Either way, N3980 is what I liked best, so that's what I based the library on.

Thank you for the answers. On Tue, Dec 3, 2024 at 1:54 AM Peter Dimov <pdimov@gmail.com> wrote:
Either way, N3980 is what I liked best, so that's what I based the library on.
Regarding design:
I noticed all hash_append* functions take flavor so users often have to write {} argument . Do you think there would be some benefit for easy use helper, e.g. to have something like this from example boost::hash2::fnv1a_32 h1; int v1[4] = { 1, 2, 3, 4 }; boost::hash2::hash_append( h1, {}, v1 ); writable also as boost::hash2::simple_hash<fnv1a_32> h1; int v1[4] = { 1, 2, 3, 4 }; h1.append( h1, v1 ); // shorter fn name, no {}, simple_hash flavor is always default flavor

Ivan Matek wrote:
Thank you for the answers.
On Tue, Dec 3, 2024 at 1:54 AM Peter Dimov <pdimov@gmail.com <mailto:pdimov@gmail.com> > wrote:
Either way, N3980 is what I liked best, so that's what I based the library on.
Regarding design: I noticed all hash_append* functions take flavor so users often have to write {} argument .
Do you think there would be some benefit for easy use helper, e.g. to have something like this from example boost::hash2::fnv1a_32 h1; int v1[4] = { 1, 2, 3, 4 }; boost::hash2::hash_append( h1, {}, v1 ); writable also as
boost::hash2::simple_hash<fnv1a_32> h1; int v1[4] = { 1, 2, 3, 4 }; h1.append( h1, v1 ); // shorter fn name, no {}, simple_hash flavor is always default flavor
I don't think the {} is a burden, because you generally only write it once or twice at top level. In the tag_invoke methods you need to pass the flavor downstream. Providing an easy way to omit the flavor also encourages the mistake of forgetting to pass it. I don't see anything particularly wrong with the simple_hash adaptor, but I also don't think it will save that much typing either. If you find yourself invoking hash_append with {} repeatedly, something is probably not right. The examples in the documentation that do it are illustrative, real code doesn't need to do that. E.g. you never do this boost::hash2::hash_append( h2, {}, get<0>(v1) ); boost::hash2::hash_append( h2, {}, get<1>(v1) ); boost::hash2::hash_append( h2, {}, get<2>(v1) ); You just invoke hash_append once, with v1. And you never do this boost::hash2::hash_append( h, {}, v.x ); boost::hash2::hash_append( h, {}, v.y ); boost::hash2::hash_append( h, {}, v.z ); You do this instead boost::hash2::hash_append( h, f, v.x ); boost::hash2::hash_append( h, f, v.y ); boost::hash2::hash_append( h, f, v.z ); where f is your flavor argument.

On Tue, Dec 3, 2024 at 2:56 AM Peter Dimov <pdimov@gmail.com> wrote:
Ivan Matek wrote: If you find yourself invoking hash_append with {} repeatedly, something is probably not right.
where f is your flavor argument.
Yes, but then again I am passing f multiple times. I don't want it to sound like I am making a big deal out of this, I can just do something like(and I actually use this idiom a lot) const auto append = [&] (const auto& val){hash_append (h, f, val);} and use that "partially applied" helper, in case I actually need to do hash_append multiple times. I just thought it would be nice to add something for beginners and to save typing since docs recommend default_flavor. Also I know bike-shedding about names is not fun, but did you consider naming it native_flavor? Might help people that are familiar with std::endian enums learn library better.

Ivan Matek wrote:
On Tue, Dec 3, 2024 at 2:56 AM Peter Dimov <pdimov@gmail.com <mailto:pdimov@gmail.com> > wrote:
Ivan Matek wrote: If you find yourself invoking hash_append with {} repeatedly, something is probably not right.
where f is your flavor argument.
Yes, but then again I am passing f multiple times. I don't want it to sound like I am making a big deal out of this, I can just do something like(and I actually use this idiom a lot)
const auto append = [&] (const auto& val){hash_append (h, f, val);} and use that "partially applied" helper, in case I actually need to do hash_append multiple times.
I just thought it would be nice to add something for beginners and to save typing since docs recommend default_flavor.
Also I know bike-shedding about names is not fun, but did you consider naming it native_flavor? Might help people that are familiar with std::endian enums learn library better.
native_flavor would mean something different, even if it would be the same type right now. It would be guaranteed not to change. default_flavor is what's the current default, and can change in the future, at least in principle. Or in other words, native_flavor is "give me native" and default_flavor is "give me whatever, I don't care about specifics or portability."

Am 03.12.24 um 12:47 schrieb Ivan Matek via Boost:
And you never do this
boost::hash2::hash_append( h, {}, v.x ); boost::hash2::hash_append( h, {}, v.y ); boost::hash2::hash_append( h, {}, v.z );
You do this instead
boost::hash2::hash_append( h, f, v.x ); boost::hash2::hash_append( h, f, v.y ); boost::hash2::hash_append( h, f, v.z );
Yes, but then again I am passing f multiple times. I don't want it to sound like I am making a big deal out of this, I can just do something like(and I actually use this idiom a lot) const auto append = [&] (const auto& val){hash_append (h, f, val);} and use that "partially applied" helper, in case I actually need to do hash_append multiple times. I think there is space for such a helper: boost::hash2::hasher append(h, f); // Or ...::hasher append(h) for default flavor append(v.x); append(v.y); append(v.z);
As the equivalent for the above sequence. Basically make your lambda available as a named type. That might make it easier given that the flavor at the 2nd cannot be defaulted.

Alexander Grund wrote:
Am 03.12.24 um 12:47 schrieb Ivan Matek via Boost:
And you never do this
boost::hash2::hash_append( h, {}, v.x ); boost::hash2::hash_append( h, {}, v.y ); boost::hash2::hash_append( h, {}, v.z );
You do this instead
boost::hash2::hash_append( h, f, v.x ); boost::hash2::hash_append( h, f, v.y ); boost::hash2::hash_append( h, f, v.z );
Yes, but then again I am passing f multiple times. I don't want it to sound like I am making a big deal out of this, I can just do something like(and I actually use this idiom a lot) const auto append = [&] (const auto& val){hash_append (h, f, val);} and use that "partially applied" helper, in case I actually need to do hash_append multiple times. I think there is space for such a helper: boost::hash2::hasher append(h, f); // Or ...::hasher append(h) for default flavor append(v.x); append(v.y); append(v.z);
As the equivalent for the above sequence. Basically make your lambda available as a named type. That might make it easier given that the flavor at the 2nd cannot be defaulted.
I already said this, but let's do it again: the flavor can't be defaulted on purpose, because you shouldn't be defaulting it, as it's a mistake to do so. You need to use the flavor passed as an argument, not the default one.

On Tue, Dec 3, 2024 at 2:25 PM Peter Dimov via Boost <boost@lists.boost.org> wrote:
I already said this, but let's do it again: the flavor can't be defaulted on purpose, because you shouldn't be defaulting it, as it's a mistake to do so.
You need to use the flavor passed as an argument, not the default one.
I understand that sometimes you are just part of hashing process, same as
sometimes with formatting or parsing you are just part of pipeline. I wonder if we could have existing: template<class Hash, class Flavor> friend void tag_invoke( boost::hash2::hash_append_tag const&, Hash& h, Flavor const& f, X const& v ) { boost::hash2::hash_append(h, f, v.a); boost::hash2::hash_append(h, f, v.b); } and also this: template<class SimpleHash> friend void tag_invoke( boost::hash2::simple_hash_append_tag const&, SimpleHash& h, X const& v ) { h.append(v.a); h.append(v.b); }

Alexander Grund wrote:
Am 03.12.24 um 12:47 schrieb Ivan Matek via Boost:
And you never do this
boost::hash2::hash_append( h, {}, v.x ); boost::hash2::hash_append( h, {}, v.y ); boost::hash2::hash_append( h, {}, v.z );
You do this instead
boost::hash2::hash_append( h, f, v.x ); boost::hash2::hash_append( h, f, v.y ); boost::hash2::hash_append( h, f, v.z );
Yes, but then again I am passing f multiple times. I don't want it to sound like I am making a big deal out of this, I can just do something like(and I actually use this idiom a lot) const auto append = [&] (const auto& val){hash_append (h, f, val);} and use that "partially applied" helper, in case I actually need to do hash_append multiple times. I think there is space for such a helper: boost::hash2::hasher append(h, f); // Or ...::hasher append(h) for default flavor append(v.x); append(v.y); append(v.z);
The usual approach here is to make hash_append variadic, so that the above becomes boost::hash2::hash_append( h, f, v.x, v.y, v.z ); I think that this is optimizing the wrong thing, and have never understood the aversion to spelling this out (it's just two Ctrl+V keystrokes), but people seem to prefer it strongly for some reason. If you define your operator== as return v1.x == v2.x && v1.y == v2.y && v1.z == v2.z; (one member per line), it's better to make tag_invoke one call per line as well, so that the two match visually and you can see the discrepancies. And if you use the `auto rep()` idiom, there's no repetition needed in either. Although, now that I think of it, if your operator== is return std::tie(v1.x, v1.y, v1.z) == std::tie(v2.x, v2.y, v2.z); then it would be better for tag_invoke to use a variadic hash_append, so that the same (v1.x, v1.y, v1.z) list is used in both. So I suppose I'll be adding the variadic overload, after all.

Regarding native vs default: I doubt you will be able to change the default when people start using the library, e.g. they might use it to store something on filesystem, etc. but I see your point. On Tue, Dec 3, 2024 at 2:56 PM Peter Dimov via Boost <boost@lists.boost.org> wrote:
Alexander Grund wrote:
Am 03.12.24 um 12:47 schrieb Ivan Matek via Boost:
And you never do this
boost::hash2::hash_append( h, {}, v.x ); boost::hash2::hash_append( h, {}, v.y ); boost::hash2::hash_append( h, {}, v.z );
You do this instead
boost::hash2::hash_append( h, f, v.x ); boost::hash2::hash_append( h, f, v.y ); boost::hash2::hash_append( h, f, v.z );
Yes, but then again I am passing f multiple times. I don't want it to sound like I am making a big deal out of this, I can just do something like(and I actually use this idiom a lot) const auto append = [&] (const auto& val){hash_append (h, f, val);} and use that "partially applied" helper, in case I actually need to do hash_append multiple times. I think there is space for such a helper: boost::hash2::hasher append(h, f); // Or ...::hasher append(h) for default flavor append(v.x); append(v.y); append(v.z);
So I suppose I'll be adding the variadic overload, after all.
I was mostly interested in encoding f in helper template, as you mentioned with repr() idiom I can just call that in 1 line. In general I try to avoid variadics since error messages are horrible(e.g. std::make_unique error messages when class has many constructors), but it is sometimes necessary in libraries so it may be a good idea to add it. I wanted to check the library a bit more with regards to this, but got distracted doing something else so here is unrelated question: Question probably stems from my lack of understanding why are we hashing size of ranges(tried googling if other languages do this, was unable to find info about that), but maybe example is best: int main() { std::array<char, 3> arr = {'a', 'b', 'c'}; const std::span<char, 3> sp(arr); assert(sp.size()==3); { boost::hash2::fnv1a_32 h; hash_append_range(h, {}, sp.begin(), sp.end()); std::print("iters hash is {}\n", h.result()); } { boost::hash2::fnv1a_32 h; hash_append_range(h, {}, sp.begin(), sp.end()); hash_append(h, {}, size_t{3}); std::print("iters + size hash is {}\n", h.result()); } { boost::hash2::fnv1a_32 h; hash_append(h, {}, sp); std::print("range hash is {}\n", h.result()); } } prints
iters hash is 440920331 iters + size hash is 1187447304 range hash is 1187447304 My question is the following: After reading the documentation I understand that hash_append for std::span (more precisely for concept it satisfies) also hashes it's size, but it is not clear why is that desired behavior. I am probably missing something obvious but if I saw somebody passing std::span<char> to hash_append I would assume that it would just hash each byte in that span and do nothing else.
_______________________________________________ Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost

Ivan Matek wrote:
I wanted to check the library a bit more with regards to this, but got distracted doing something else so here is unrelated question:
Question probably stems from my lack of understanding why are we hashing size of ranges(tried googling if other languages do this, was unable to find info about that), but maybe example is best: ...
N3980 has a section on that here: https://open-std.org/jtc1/sc22/wg21/docs/papers/2014/n3980.html#hash_append_... In short, if the size isn't hashed, an empty vector would result in an empty message, with the corresponding drawbacks. So I followed N3980 on this when I initially implemented it. I've since "discovered" that this issue is actually present not just for ranges and containers, but for empty tuples such as std::tuple<> and std::array<T, 0>. (It's also present for empty described structs.) I avoid it by imposing the rule that a hash_append call must always result in at least one byte being sent, and make sure that empty tuples and structs send a byte instead of nothing. In principle, we could make containers and ranges also do this, instead of sending the size. On one hand, will remove the need for having hash_append_size and hash_append_sized_range. On the other hand, it makes it trivial to generate collisions pair<string, string>( "foo", "bar" ) pair<string, string>( "foob", "ar" ) pair<string, string>( "fooba", "r" ) so maybe not.

On Tue, Dec 3, 2024 at 12:09 PM Peter Dimov via Boost <boost@lists.boost.org> wrote:
pair<string, string>( "foo", "bar" ) pair<string, string>( "foob", "ar" ) pair<string, string>( "fooba", "r" )
But....but... in each of these cases where there are two strings, the strings also submit their size after the data, thus these would not be equivalent: { "foo", 3, "bar", 3 } { "foob", 4, "ar", 2 } { "fooba", 5, "r", 1 } Or am I missing something? Thanks

On Tue, Dec 3, 2024 at 10:07 PM Vinnie Falco <vinnie.falco@gmail.com> wrote:
On Tue, Dec 3, 2024 at 12:09 PM Peter Dimov via Boost < boost@lists.boost.org> wrote:
pair<string, string>( "foo", "bar" ) pair<string, string>( "foob", "ar" ) pair<string, string>( "fooba", "r" )
But....but... in each of these cases where there are two strings, the strings also submit their size after the data, thus these would not be equivalent:
{ "foo", 3, "bar", 3 } { "foob", 4, "ar", 2 } { "fooba", 5, "r", 1 }
Or am I missing something?
Thanks
Yes, currently it works fine(as you described). Peter was using that as an example why we add size of range when hashing. To avoid collisions like this. I was basically asking why hash_append of span<char> also hashes span size since I expected it just consume the bytes span points to.

I'll be on holiday next week, and absent for a long period, potentially until next year, so I'm wondering if I should already submit my review, as I have had some back channel conversations about it with the authors. Claudio. On Tue, Dec 3, 2024 at 9:11 PM Ivan Matek via Boost <boost@lists.boost.org> wrote:
On Tue, Dec 3, 2024 at 10:07 PM Vinnie Falco <vinnie.falco@gmail.com> wrote:
On Tue, Dec 3, 2024 at 12:09 PM Peter Dimov via Boost < boost@lists.boost.org> wrote:
pair<string, string>( "foo", "bar" ) pair<string, string>( "foob", "ar" ) pair<string, string>( "fooba", "r" )
But....but... in each of these cases where there are two strings, the strings also submit their size after the data, thus these would not be equivalent:
{ "foo", 3, "bar", 3 } { "foob", 4, "ar", 2 } { "fooba", 5, "r", 1 }
Or am I missing something?
Thanks
Yes, currently it works fine(as you described). Peter was using that as an example why we add size of range when hashing. To avoid collisions like this. I was basically asking why hash_append of span<char> also hashes span size since I expected it just consume the bytes span points to.
_______________________________________________ Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost

I'll be on holiday next week, and absent for a long period, potentially until next year, so I'm wondering if I should already submit my review, as I have had some back channel conversations about it with the authors.
Claudio.
Claudio, If you send a review on the list, or directly to me I will count it. The same goes for anyone else that will miss the review period due to holiday. Matt

On Tue, Dec 3, 2024 at 9:09 PM Peter Dimov <pdimov@gmail.com> wrote:
On the other hand, it makes it trivial to generate collisions
pair<string, string>( "foo", "bar" ) pair<string, string>( "foob", "ar" ) pair<string, string>( "fooba", "r" )
so maybe not.
Ah yes, it is obvious now. :)
Thank you. But this makes me wonder if we are talking about 2 different APIs/scenarios here. 1) I am combining hashes of different objects(e.g. std::pair example with collision potential above). 2) I am hashing one stream of bytes, but I do not have them all at the moment so I am passing it to hasher as they arrive(e.g. receiving long message over tcp, but hashing it as we get parts to minimize latency of computing hash after entire message is received) currently if we have span sp we can call hash_append/hash_append_range to get one of two behaviors/scenarios mentioned above, that I feel is quite error prone. In any case I do not have a lot to suggest here, seems like a hard problem, unless somebody can think of a way to make this less error prone for users. But original reason why I wanted to do this with span is that I wondered about performance. I wanted to see what happens when we do same thing(hashing of all contiguous struct members) in 3 ways. 1. just call hash_append for each member 2. exploit that before padding we are contiguous and trivial so pass that region in one call to hash_append_range 3. Use BOOST_DESCRIBE_STRUCT automagic Long story short is that for some hashes it makes no difference, but on my machine for sha2_256 and ripemd_128 there exist small but reliable performance differences. Ranking is: 2. is fastest, 3. slowest, 1. in the middle. I am not surprised that 2. is a bit faster than 1. since we make just 1 call, but it is a bit weird that 3. is slower than 1., I would guess that described class expand into same code as case 1. Could be just compiler randomly deciding to inline/unroll something or not, but I wonder if you are aware of this differences. Maybe my assumption that describe does not do anything differently than manually written calls for each member is wrong? Code is here <https://godbolt.org/z/WzPG54aTd>, but it does not compile since IDK how to get hash2 onto godbolt, and anyway godbolt is too noisy to test little perf differences. I have tested this with libc++ and clang 19. I know SIMD is not used so maybe it is pointless to talk about performance, but as I said I assumed there would be no difference between 1. and 3.

On Tue, Dec 3, 2024 at 2:46 PM Ivan Matek via Boost <boost@lists.boost.org> wrote:
2) I am hashing one stream of bytes, but I do not have them all at the moment so I am passing it to hasher as they arrive(e.g. receiving long message over tcp, but hashing it as we get parts to minimize latency of computing hash after entire message is received)
The digest of a single binary blob should be calculated as-if first submitting all the bytes to the hash function sequentially, and then submitting the size of the blob in bytes as std::size_t. I don't think this can be done through the type hashing interface and has to repeatedly call instead the function which takes a void pointer and size. And at the end of that, hashing a value of type `std::size_t`. Thanks

2) I am hashing one stream of bytes, but I do not have them all at the moment so I am passing it to hasher as they arrive(e.g. receiving long message over tcp, but hashing it as we get parts to minimize latency of computing hash after entire message is received) The digest of a single binary blob should be calculated as-if first submitting all the bytes to the hash function sequentially, and then submitting the size of the blob in bytes as std::size_t. I don't think this can be done through the type hashing interface and has to repeatedly call instead the function which takes a void pointer and size. And at the end of that, hashing a value of type `std::size_t`. I think this is a valid concern as it might be a common use case. IMO this should be considered in the interface and/or at least be covered in the examples of the documentation.
I.e. what to do with code like this:
span<byte> buffer;
while(connection.readsome(buffer)) { update_hash(buffer); } hash1 = hash_result()
buffer = connection.readall() update_hash(buffer) hash2 = hash_result()
assert(hash1 == hash2)
On the other hand, it makes it trivial to generate collisions
pair<string, string>( "foo", "bar" ) pair<string, string>( "foob", "ar" ) pair<string, string>( "fooba", "r" ) I can imagine an argument that the "collision" is intentional here, i.e.
I.e. the result should be independent of the size of the "partial" buffers which currently isn't the case as each call appends the size. Keeping track of the total size on the call-site might also be error-prone. Maybe this could be done internally by providing an interface that keeps the size as state. that the `data` really is just "foobarfoobarfoobar" So no matter which way is used in the end, it might be surprising to some people.

Alexander Grund wrote:
On the other hand, it makes it trivial to generate collisions
pair<string, string>( "foo", "bar" ) pair<string, string>( "foob", "ar" ) pair<string, string>( "fooba", "r" ) I can imagine an argument that the "collision" is intentional here, i.e. that the `data` really is just "foobarfoobarfoobar"
I'm sure you can, but there are actual rules governing the behavior of hash functions that don't depend on people imagining things. Equal arguments must produce the same hash value, and unequal arguments should produce different hash values. Since the arguments above are distinct (with respect to operator==), they should produce distinct hash values.

On 12/4/24 2:15 AM, Peter Dimov via Boost wrote:
unequal arguments should produce different hash values.
Since the arguments above are distinct (with respect to operator==), they should produce distinct hash values.
What does "should" mean here? How could you possible make such a guarentee. Robert Ramey
_______________________________________________ Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost

On 12/4/24 1:22 PM, Vinnie Falco via Boost wrote:
On Wed, Dec 4, 2024 at 1:21 PM Robert Ramey via Boost <boost@lists.boost.org> wrote:
What does "should" mean here? How could you possible make such a guarentee.
Did you read all of "Types Don't Know #" ?
no Robert Ramey
Thanks
_______________________________________________ Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost

Robert Ramey wrote:
On 12/4/24 2:15 AM, Peter Dimov via Boost wrote:
unequal arguments should produce different hash values.
Since the arguments above are distinct (with respect to operator==), they should produce distinct hash values.
What does "should" mean here? How could you possible make such a guarentee.
For a high quality hash function, the formal meaning of "should" is that the probability for a collision must be 2^-n, where n is the number of bits of the hash value. (That is, the hash values should be uniformly distributed.) For a cryptographic hash function, the formal meaning of "should" is that engineering a collision should be "computationally infeasible".

On Wed, Dec 4, 2024 at 1:21 PM Robert Ramey via Boost <boost@lists.boost.org> wrote:
What does "should" mean here? How could you possible make such a guarentee.
The guidance is that two distinct values of type T (determined by operator== returning false) SHOULD produce distinct hash values. As the means of hashing a T are provided by the user, the requirement to produce distinct values is advisory. Thanks

On 12/4/24 5:15 AM, Peter Dimov via Boost wrote:
Alexander Grund wrote:
On the other hand, it makes it trivial to generate collisions
pair<string, string>( "foo", "bar" ) pair<string, string>( "foob", "ar" ) pair<string, string>( "fooba", "r" ) I can imagine an argument that the "collision" is intentional here, i.e. that the `data` really is just "foobarfoobarfoobar"
I'm sure you can, but there are actual rules governing the behavior of hash functions that don't depend on people imagining things.
Equal arguments must produce the same hash value, and unequal arguments should produce different hash values.
Since the arguments above are distinct (with respect to operator==), they should produce distinct hash values. Both astute and absolutely correct. Thank you Peter.
_______________________________________________ Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost

PNG IHDR͹sRGB®ÎéeXIfMM*JR(iZHH öŸd pHYsiDOT(£Uo( @IDATxìxTeÚþÿß÷»«("H¯tÒÞ»¢"vVD@zïtBéœÞ;}Ý]ËÚËZwÿý3orf2P¢bî\×s3gÎ9óÝû~Êûÿ$@$@$@$@$@$@$@xÿïÿ ùIHHHHHH$@$@$@$@$@$@$PÐ(_2?" ÐàoHHHHHHÅàKæG$ ü @1 @ |Éü$@$@$@$@$@$@$@¿ (h/HHHHHHhð7@$@$@$@$@$@$@Å bð%ó# þHHHHHHH PŸd~D Àß 4ÁÌH$@$@$@$@$@$@4ø b@@1øùIHHHHHH$@$@$@$@$@$@$PÐ(_2?" ÐàoHHHHHHÅàKæG$ ü @1 @ |Éü$@$@$@$@$@$@$@¿ (h/HHHHHHhð7@$@$@$@$@$@$@Å bð%ó# þHHHHHHH PŸd~D Àß 4ÁÌH$@$@$@$@$@$@4ø b@@1øùIHHHHHH$@$@$@$@$@$@$PÐ(_2?" ÐàoHHHHHHÅàKæG$ ü @1 @ |Éü$@$@$@$@$@$@$@¿ (h/HHHHHHhð7@$@$@$@$@$@$@Å bð%ó# þHHHHHHH PŸd~D Àß 4ÁÌH$@$@$@$@$@$@4ø b@@1øùIHHHHHH$@$@$@$@$@$@$PÐ(_2?" ÐàoHHHHHHÅàKæG$ ü @1 @ |Éü$@$@$@$@$@$@$@¿ (h/HHHHHHhð7@$@$@$@$@$@$@Å bð%ó# þHHHHHHH PŸd~D Àß 4ÁÌH$@$@$@$@$@$@4ø b@@1øùIHHHHHH$@$@$@$@$@$@$PÐ(_2?" ÐàoHHHHHàW#ðåw?Ê¿.»/|$NýMx[RsÎËD b>bÞn/áz^Ï1¡¯q;ï¹`ÅlS÷ŒYšHÁyVì}[R<"Ó÷ŸcEÚ·Å·°œ i{ß°"}ÿ1¹ïäÆÞóibÿé,lóâdðžæBDö7xî±øÐ²äÐ[v~[äÆ[²ì°Ë±]Xç^?â=V}KL¬9þXýÜ8ñ®¬uÅ:l×WÖ#6äÆ{xlÇïÉÆSïÊ&ÄfĶ3ïÉÞcï},oüó3ùèËoåÿü÷Wûm7¢PŸe~F øš|û×7ßËJDóØu'døëGeÈÊ#2hÅayaéAžh¿\| 7]r@Œ óçŸ9w ^ËÏ/=$ Ãòüò#^⚌žü/,;"yqP^XŸßV+VW]ñÊòbbðÊCbâÕU%/Ê«¯{Uebèë a«K^Â~þŸæ°X{ÄëJ^ÑëÈÄXÄ8Ä<?i£÷Œéºå¶õžŸíý[OÈLÄì-'dÆÖx|Ú9ÛOËÜ'db>bÁÎS0NKÆî3µç,Ì¡7`JŒ ³èyçÏå~þ~Å·¥ðÇù.ùIHHHHHàwC@3·}û¬?ùxýŒºâÄðayyÙ!Žì°Ò}{ÛpL·&^1/ÏóÌÖk]ÆÂËžö âGÅ[ÂqÏÐó¯:fÅ«ØæD<ĹºoÇPl¹bè*wW[}Ý×ÖŒ8,¯õîNñnDŒs;r}nÁŸ£ äMÆþ Ǭ»ñžäÅ1¿ñL@LDLBLÁóÓ6{éý&fBܵý€œãý9ÛOÉ\ÄŒm§dŸþíg¬¿ó,Ø¥qJR©4· 3ö¬œ§dÕÑsrþ£OåÇùÝüί·¡pœ}cŒ_ øøþ§_dǹʚµ',±?BÜ[$М7bßlœSØcFл0(`äÆ*ì##¬BÅb(;tÿâ°×ð4¬ÇGŒ*þ/×Èýü£]aÄ¿nóÄ¿îÀd0u²û1mó1Gs Èú«`¶ºoL³ c@cζ2ÿ`Þ32çi+< t~šÈØsÆ22adî;!{£eà-ùà³/å?ÿe{ÀåþS@àrñ| hÿÃïYYýA(©÷þ¯"£®1áàFŒ[wó<WLxTóu{ÇŸÛ9÷+ÈŒò0îËçA¶_Å?~AqÀk0ò²þ çGæ>_žÊö5ãåwfüóï«è,ŸgžSgLÚt\&ãuZà)þõ±ÓPÑo¿sß³µcÌ óvµâb-üÏb~Â9nÏ l &@æÞ²èÀ)9ûO0#à?þùD~4ò3á + ðæG_ÉŽ-g,ño~AÛÁ+`äD8»÷V¿|+So04ŽÍ ÷|ŒÎóFöÞþöm±_{îó2ûVö=ûà CqyœŸŠ@áoÚ 0Fäö»ýQ롌ß[µ²þâ_Ý`ÇžM'ÄÄxþ ߯`ÄÿiþV÷,Û}þ}ùæ¯à×Z<_B x~ïüÔ$@$@$@$@$pM Œýñè%?ÿýáö;b§ñ*b0 ^qÀ=ñräáØ«·sôØ«ºgö@t0öÌc³õ~ô\œû ÙÕ}®!~CCt ßj;¢úûBä[£vYaÊûíÌÿ«ßôöÛÛŒþ~7±¯ÙÇã5rËý!úñiL) }ÿ&ûï@gLÝtÔ wªfiù¿+LÙ¿nµ÷ß3æáØüm§e*Rv'Ñû}þvÿ¿)ý×þg!óµ×îÿÏØ_hûíP3@[vŒñ|õïï¯éïùz1ÔoHHHH~%aÊÿ{¿²r?ð¯ñêªý0öÁA`Š×*4{5QáoαÅÿ,ñoL!.ñ¯&ÀPKü«Jñ©þþQh0œþ2ÆAüOÔÈw%úq|²+Tøðlž`ÎE S¶ñEKüçx¹ïžäŒùÛ ñß; B@â)$@$@$@$@$@Þ |ûÃOȳDÿ0^CUÐÌ8òÿ¡0L\X÷öZSz¥[#î·Õ;óÿß3¡Kñ ]ãË4Ü{ýóOôWáoõùCž{õþx/1Áah©¿UîüvÖÿ²üùgüÞ 5² %Û7>üDþËÁÞÿCu¥pQ<|HHHHH ºÔßê£ïÈk( KâœAúØax~fÊæœEfe÷nQÈ^{gOŸÛë1ÿ5Ä0 Çä}³ïiã ýV?¿ó³BûûmáoJúu«~ïËúå?×¹€_þayè¯[-ëW±ï*þ'l8áz,/ûï4l±oÿiO¢Ä_C{_`ú£Öð?Sþ¯ÛŽ\¬@Ëÿì@« eçqì°ŽKÿuò¿-YÈôkì¿Ùª ûK|ñuA?Wü \|þGVZþpýáº5¡Mcæ<s"}žgÀ~¹áy <¶LË1r œøù·Ã1ž//pï^Êú-ÀÎË,ðýÎÇîyœþÆÐ¬¿õ{fú'@ükOÿDî¡Ç.ÏпõÏ3ô± ~3õßl/×ÐUR°`ÀnÈ &»p6ì*²åìÛòã/¿\Ñï¹8Œ@qøùIHHHHàøáç_d-²ÿC1Øo$œgÀ1 =>ʹç¡_$×ó£ à#aðj"[]Pêçóù¿{Æ_¿1\â×î%FàÆH]ÂÏFè{|çcçtÿ\Ñþ|Óë¯ËùMØï ü'ÇR~ëOž »ÖÀLü3aÿXP@Á=ÀT€î:%Z %ó^ÚXtð,D5ÀvíËÑøã|ü$$@$@$@$@$ð«xïÓ¯e&Û@ ÿdÏ5{ ad¿G¢/^c 3BÙlí=Â9_èq;¹ ÛánmÎT#àœ4^Ã,÷°ËñõXÞ9æG©Ÿ |Œ¹G³Õ{Ñϯ1~gÀc #þu;óÌ43ÄÏskD¿nÇl8*c1ŒOczóM× þùÓüqþdWLZÀÿ£h8j/õòþ žÆôûOßtRŠà}ŠâZÓ`(Ø¡ûÇð2þ8?7¶`Âúv;fb¿ö7Çgoµc¶ ôñ ô] e§ÿ;#Oü«ð×HË9-é] `7Ü£eÿö `¯œ .èìý§dñ;Ö?/?þüó¯ößÂõôF4®§o÷J$@$@$@$@¿?ÿç?²íÌß1Ôï 0öV¯ÇrE¿ÿºõ0FªQm{Ýæ§yá®â1BâZÃSìç{OÀ~l·¶®}íëw~KÌã^rïÏu_*øGCØkŸ®{1÷äÜ^0Â}ìÆ£2N}ùã*àýíý£0Àp ë¡]Àe@ÔODèë'ëÀ?þ)뱿Kü9éxÿnaý0f@økÌRÀ%þUôÏÚqyjè¶øÏ5r`À° S 2ÀXvðŽüíÓ/ÿ¥üþnÀïï;á ÀïÀw?þ,óÑËYðÑî&T${Ñ*œFÞkÍ5Fá ¹Æ(tgšè¶·Ó`(ÄŸyíFør}ÝZY|oK ¿.ÉçFä{nÙ~÷L¿=Ñßsªÿxu±WánÂòsßBÈÃ(â cL0Ç&£ Dü$5pL°æ Ly2÷?ݪ@v[#ügnAßÎÒø·Jþ0æ"Ûïówx«žöÞúàwýßÐous4~+ò|_ žN üãóoŸþ1õc Øu;v-š71 Üuçè©ãGpN^ÆŸ3Æ@Ûa¿§Ÿ¯1ÌûÏ»¡×}œÏÍâCл dÆþ||®Q56tkÂ2 = Ÿ>v}³ïýf_{ûµ¯_Ëú5&@ý\ü$GLÆŸ)麯ÓûÕ0[cLÝ|LŠ!+¯1iý!¿æXºS&°3þÇ!ü5lÀÿY[O¡€_Ù~¹á2f¡Ìßÿ;·ÎÒ§ 0ÃÿÀ0× PØ V¶x¶hÀ¢ý'e1bÑŸ²þÄù*üs'@À \ÀÁ·ÿ !~¢ÿ°ÐçÚY{HLÆó&ÆBø{ ÿ± ËÀ@À1®î¹ŠüGäNÀµï<Ïì«0R ŸþWBð4Ø÷ÜæíÍ·c"úòMhþrÏ0Â_·*þ§B [[xç~ÖÆc,ÝÀà)þS6àûz}¯ÍÞ,ãWïix~úfû=OM#þugÙ*öœ £À)üÍþµ2²ö²úÿu§ âßÓXuä¬|òÕ·ø%¿§i¿ïHHHH®Àÿ+²ùä{È"#á? ä&kI9Äðžu®3ÀÄxw¯±ú(hÁ1Â,ŠùÏ§æœ cXFDýXϰL=_ïýõ®íh,ih2öööa ?bô:ì@ïŒ5±ýõ#=bx±?\,¡1?áæ¯Çm¶ÿ$ìkLÆcS±?UŸPÁoÄÿŽm§¬sŽ@ éÈÖOÁVgL8±õÌDÌØ¢-dpÖ¶hAì»ÛûúX Lù·B Œ0Þdúõ±µsÇÌy:P÷À/Z 7ýÿ$êÇ @×ËØùÌFäV `9æŒõWðü'>& (Àá¬8ðŠLB¶\Èé4ùÙÛÎB\¢bØÄ8L¡71~óý7á)ìÿø0ÌÌ 5"4Ækà<ÃºÕ ùzÏãfðÞçÜ)0_cìLãG¶~,ÂóÚc4 ŸMè5ôZVÀÐ~þq0ôØxôóëck ö'!ë>åùÚ£¯ÛÜoÄôÄTWL°{ÝjhÿdÜÇÍöãñ$dö5f@pëy3ýµ ŠÇòòJê:žú-÷7CýðþÖc7@nÉ¿KÌç~c }lçâusaÌúøÌC«öý°ÅŸs»% eçqIÍ9.i»ºÍ9ýX ¡Óÿ÷DöKüíAŠ_Uð[¢_ ¿+ŽüßÎ8õÁGþë4 ùÍÿøãòÕW_Ë_}_~%?àøåþ}ýµÇupͯ¿þFôSþÀõ@à_~±~³æ¿¯ðþé§®[ç= \%ÿàÿ³fæIÿjL (µõµÜxe¯2èã=Ùt#þu[xÁ¿ @+LLð×°L/*þuk\B^§î úXÅ¿yÛ°·øLÝùâÞÛð>3¹_{ùu n'#?zê6ïCž«È÷ýÓ âõùiÔøÇþ³ÄþF]îï°µ¯ýýjL°×çfí<#3Õøžb§Y𺌲NŠá{ÓÓó¯¥þÖcÜ~5,ÓûÆ0}·l¿Ë`>Œ° ùž_Óïo¶y}ÿ¶`j³ 5\l¿§°ýÎÿÖßùûUþÚÿx/§PÈï4{ÉrßTB£$,Š~¡Ñ-ÿ¹á?üð£$7mãvœfr³¶òí·ìQ)ä×ÁÓ~c8ü÷hE£íåØS¿ñ]ñíIHH~ jÌÕŸsdÄÍ2rjš!0STçîãÜ ùËÓá5&& TÿJÃ~çÖiäÞ2ðØw#ÊÍÖwcbäm!ôaLÐA}VØ""ÜÅ7aeã5#ЬŸ s|ªè»ëŸÉækŠÞ&»¯BÞdûu;B{ÖöÓ2MßcÌžÎì§eÜê}šÄ8be÷uŸéž· ¯ïk÷ÉÐyËåÙ©2"}œÌÁgתðÃbö¶ÓÖþL\çbdcàóïÿÿI\WïA _ Bâix?ÿü³Ì3_jGYF÷?ôÄþsó ØÔ©è\1Ž`"o1 Â;_àÜIzŸ±GYùÂåw ~ÏýFðçNÙ׌#ÌófkKð«èGèz!°'ëp=«\_Kö!¬]÷ÉûéSÓ!øMšX·vKÌ« ·Eœ ûŒ°ÍFÿL×Þ~=6ögBž[µËø@ýv}m +waÐß!²û¹;UÜÑÙ[äÙåÕY2pì1o¥LXŒCÆ,ÏAõÆQËP#ÀºŽÓ6ÁHÀg3Z 0ÇŽàóåeÿ]žNá+N\Ž CÛŠ 0÷]çÞå¶hx)è! Èðxq#ð·þ.wöì-ñß@®xœžaàç% bKÀ`ÌðSmöÍ^OBØ¢ëÕëõ Ä{ ûõù 5<3ÿæ±Sì;÷s'ìÃ.¡¯¥õV¯Ÿföx<õ4Ša žoÂÐ0ìz-ÏÙ*¶UÐs î5Ž<Ý¿ãœ×>þ)h}ãd&L¹žÖXíñ¿`×Tjà5ëÈÈKãçÊócfËcSdàYã_ßÚÂaœ°Y«X÷®÷zY Sòï¹õlÐÇ©»Žç?¯ôßìkùÊýi\»nh% BâihÖÐ××H@X%þµ}¥UÇ®òÝ¿ÿýþÜüp$@$@$@ylÙ{;ìVcxßBš¢OÝ3t]úë"@̺8sMèëìj·-JöMß¹w§è·÷ítáTb÷ÐÇ@œ©ÃÓ°déþÓ!°5f ß §ÛÙÈ· þ'7=²ôóvX?ësÈÚ;Bî³ägPÊka»`÷yIÙs{LøÇç³|·<?w<7{ Y¶ÕIkr$}ïYÉ:p"3×ÊÌ52pÄd0x¬<þÒXyrøLy~öJëõ`"h:ý_ þVl<W ÍøçNþǹsÖ@«@ç8×Ñ g,Àãú Ô0t3sìZÀ`@èìýÏÛ?ã'¬AÚóÆ{y?\îYhò@ xÚý{èñR'<.·üâÔèÏÌG$@$@$àN@ ÙZæ®åã®rí#×ÐræuBrªGXf*¯W! FÙ¹"÷uj èùÈxkL±^ã|]^Vhš ×3À.[èÝ¡a= bºg@økVDœ øÏË仲ç¹Ú¯b6®Æd¹ç!#??çÌÃŹØú]g%5[?ûórÎ!ÎËÜ7d-Ø}¥ýèÑß~ûç$}?DýÞs2öõ]2vÅŸþÌFÿ;ä¹i)òìùØß&©ÛËœdú}òêÌlùºŒ8b¢ôíÿŒ<5x8OFglQÙ[Q=pÔõŽU³ñ¹Æ¯ÈÁµ¡Òà L|Œÿ\FìçnaèŽKø{}§ð7ûêW€ªøG€aŽ]03 c·ãØ?.{çþïÝ8)9çižÿ×+BÀHi§N» °Ôòÿ7ßz§X1à% âNÀÓÐLŽ #þMo¹1rEŒÃ0@ðÏðFüë6÷µ0ôºÞÎÏ}·çuÝûüeä÷çúOÁôÿ© 7]ÅŸG>xgv¿ @3èvþéÜÿyøó-¯"ÿܯûš¿ë€í=÷=g%eñYÄ6íù÷Ê<DêVôüoÜ%SWmŽmû%kçQß#³×ìÐO^'/Ù«s$Â|túZ8zº@zêyäédÐÈ2jF,ÀÀÀiëdúºýš@Š sñýÌEkìM2qe#šJøG%Nú×Èÿý7@!Ä¿Wn#à «ü@!f,\áSÏ"Å/$Ê*µe~jW($Cv}Ðòÿc&J«÷_«|úyùî;ÿ_ßß,ïHH.Àµ2ŠºœÓ4ÈÝw¹YÕ*sŸÓ0ÇŠjE« öa;·Úc¯Âߟ3[#ôUÔþxϬ¿>ç-ï%øæiæÛùÍGfAÎdüÏ£ÔýB·oHêîXêî-dìñ{ÆòMòÚ¬tyiÔdyâùÁò@ÿç€ÏãÏÈ}ñÿœáEytàsòòØ 2pÔDynÌT¶DM+÷=ñŒô{nš-óVmÑsÈérwßÇ€Ý݀ߣäU£§§Éެ 26} ¶K:.Ý"Óoë÷˰+eêÝ2wGQÆÙšÐAÆÈÝj Ëûè7<@!áçìÝ/ÏŸ8X|æéïG|F¶ïÌF ýã2 %Åó~oŸøâiÒªcn@@x¬¬ßŒõ²~ÿ¿·ÏÄû! ž|×Ìp z#ÞÍvªÏß2 Ùy§`Î/hkhM@ÿŒ[@èOÃ{L·?&ôë~ÄÉð;Å¿§ &3Ë?"ßóPÒ>¢åýVÃ{d÷!ôÓöŒ)éØfâqJÿ"xK#ã?>c¥<øüé|__isÇÒºm{iÚž©$×oH¶¶4æMIã& €YëVÒ©{OÈ£Ï |V:÷è-m;÷÷?&Ï+#&Î3æK«6$1±ôîÓOxêEyyø$8O]!sWï+·È°ÙeÀkSd|Ê ymþ¿õ ÚöÉmAÀw5 Ë jF® =ÿ ÿ[ íîmv@&Ú¢ @#{ï ·Ðþ\ÀûÛ4Œs)²£4-/\IJ-±úþÃbêYUÝîí+}üI¿+/O$@$@$ð{# 3eÿn[dÜuªŒgä3ÃåtëôFÀ×h&Ÿ0ç×é֌ֹµ2ú®ü:žÏLæ·²üèñR÷e`böMO¿ýÎL¿)ëwûVi¿÷çÅdüSQÒŠ%ýÈð§cp_"þ}o Ó¯¢ÿŒ~è¬dlÞ#C§Î</ºõŠ-[IbR<D~CiÑžÔøšºR7žúKDH ÔÆõ€Qýz ±ññRÆ@Š¥=~Í%>!Ybâ€y«¶Ò®MGi,wŽï Ýîì.wõè#£U`ðèé2~Þ"³bÌZ¶NÆ-ÈÞš èùðÓ2hÚ|}ŽìDÕÅê]òZê@?WÊT3#À1íÿbFY @ÿŸç¶ i»£{€ç rT²ŒFüë6kÏ1.èå^ å!EI×.2(réÑ«_nö¿6Ú`æ§fÊ/¿üRdoÉ ü> ØDŸfÑ=bÄ¿·°ÅŸýÎ=<PEŒy-â5C¯kÔ;ÏÕ}=æy3Ì5t;ßÊäë€~Øï0tðÆ,äç×P?cL®øÐ×~&ŽŒß.ñ×~;4ëêÿi»ßÀvo oýŒdcßCçeùA<¿)GÍ/w#{ߌ]èšH©±- !RGkûH _M1ÒÏÇGÔ`??©YªTT^jT«,¡ÁÁߎ^#éЪtéÔYÚŽj¬?ÈhiÙštiß^îê|Üyç=Ò¥mŒ:vº<ûÚxyjÈhéõø@¹çÁ'%®QKé?ldì: ÓÖíh¶Vt¹ŸtjäÛPQ¯qQ@ÜÁjžeìÄ@W€kö<ß! ÓȫЪ;hxÿ÷w.Ev@¡å À¡ÃG%©Q+ËL8ËÇO*Âwä¥IHH~¯Ô¯ÙrqÏc&f!ob&ö/^^ëþôçÃÈÎ×9îÉh²þÙ&pϺzÁlT/ÌÂð:þºLîÒûžyKÞáy«·âW'ùá¯[kšß®7%?Rù[Âßÿ)èñOÕþ=çdáŸs²(ç€mØ+S³°dßkã€×CJË6m€Ar=INHz1Ñ,¡þµ5%È·úIXhd5¢Â`¢"ÀèHT$JRl4*¢%6Œ®$DEIR|4nÔÙÿVR×oÞžŽoÕR:wè ma4FkAÛv€UëšžWºßÝK7m%ÍZŽÆÚH¿§ÊüUdòâu2aáղЊ 4ýj À !`{«ÏåMû7û©8U2 þMdBü[áúFðfÿMž·žmÀ9»ÎrXµç¿#4<ñcE/¯[þï#œ|LŸùö»"y/^HHHà÷MàbÓ°8a·zí,oâßuÌùZ³¯ï;âß^¯íÖZöþmç ·]Óí\ôó²g© LKôrË Ëõí}C<)þ0D®!ã§K>HÓV€~Ê(óOBÆ?Bb"B%"0PBjûIPíZP³ ãVGb#$))FêCü'ÄÔØº¡vúqÑš@Ù?¶I±Q"¡~R·N«[W¢Ã€zÊRje FK@²ŽiÑ\Z6mbm'×ðà`ñ÷@ÔÁ{ÔÍ[JÛ6í¥Kç®Ò¡ÓÒ±k-0`\ÖZIÛ®ý÷§°ßiÛÐ6cü^ »ÎŒýûþé7ž;¿2t¿2pŸÝUøàïÿöøÀºqv@l=:kÎU_ ž> p)£ÀiXýûÚà pŸ¶0ºÝ\]ÞB&ÜÏumíÇpc:ÐO§øÛüÏb¿ÆÃFú$Jåµ4¢Âß*ùß}FíÇúöwÊÓCGJ{êfMBÄCÈÇÅH|p`Ô©ã/þŸ5% VM xÃ1ÍðÇF@ØCè'ÅJãIúQR/6%þü0"CÐ*¿Z !µ%ØßWÂÐêkÖ¬)>ÕªHåJäöÒ¥¬ë'£ EÆV4À~@m_©T¡"Lj*Ažf@iÜP&Öº¡uåqTìÿnYvøMY|Pç {¯<Ò ó {ößôû§¡ôß3û¯¢ ×`hxÅRt¯ÆøñÇåwÞCGÊÎ=²yÛÙØµ{èúìÿü𣢻ñ\ù}*gß8/»vËæž¯í;%gÏ>9Òñ7Î_Ï>ÿâ"W(º§Ÿúêk¬Sÿ¶>zÌbŠŒôþ¶aõ}Éé³ç~ÛAvèÿð£ûÐûÙ¶#ÇæûÔïøÐcráÍ·ä/¿*:HžrjúBNjd5ZwºKΜqá¯âÓ$@$@$@Tj,Ðìùed÷¯Å¹ÚNàþº¯í3Þ®o2ÿº5Ùo[]ÎNKÙÍt{ÍlÛCîì,w*n ÄŸF*Äœ +#sœè:pî4â,ÞV²sËèLé2ÿxé(ôì'ÅD";ÒýKž¢Ô_+âP¢l?Ê÷#Ã%.:\ã"QÂmÌPµ% CâÜXdôkCÜWPVjך q_ÃZP£|©^±ÔªZUªUª(·*)¥KÝ*Õ+WBÆ?H5j(ýìZÕ«IÅrå€bùòR»V-©\¡+Sæ¯ÔÀµ$6&V±hûALÖ? ãXð Zt:¿1ÀÞ[äýÞ\ÀŽ€ï<"éDáèû7œÿŠÀ}`^ ïÿÑðÎ%ßQg¯à?ç_"ϲãéç_¶DnQ/xþÂ2iÚL¹ÿ¡Ç¥E»Îc)ìµ£ÄÃØ#Ñ÷Óž¥tºëkÂe+_/òòìO?û\`.صG/iØ¢D&4Ž²ÄŸÁž¯h JŽcã8zÏýXFñYñú"_7þ?ÿù2läX¹ë·í$±õXÌÞ_@Ü×8,§Ò¬tîv/Îç$sábù×§æûîâÀ'üKÒ2³å±þïMï£.îGïKïOìEÄ[ßuÓÖ¥û}ÈsøímÀ²{?ýüsQÜ×k~÷ÝwÒ¿;ÜNÿNACGx=IHH5R)w ì+Ù÷&Ú/vÌ'1?KCg ,Fóýœ|=»nœfü]1Ûdâ5¬) Û4dŒÓv¡}üé(×HCš¢%ñÈ/ÚwRV:%³WJß§DôÜ¡?6:F7o~û6Ò%ø ê'!³(1èݬjôõc cXê¥ýõÐï&¡°`Iú8/ÜÏWªW(g 8_# ÏÇEKTP0Úü€ }Én[KÞ,en»ÕXó4cc$>:Ê2ÊÜZR*Ü^F|kT²0 ÊÝvTãZšH@eAŽ+!va¹œý§$k/*rЯÛ2Àcç ;v`»Ý4, è9èO§Yýÿ8GÏuüÛôí®p7@t ïÿÑðÎ%ßÑtC޵#,Š"r@.*8ûw9ßB|M=OÚuîn/¯ z*ÄTQŠÙê`]v¿ÐhoÐLú<ø8²É» {[ >ïßßo}æ®w÷šÄFÖûÅZbÕÛ}é1²*lÕHÄTÑ}å+Wú=/çÄÝš:xèñ§€Aó¶Öûj¿ºŸ°fÖœ®g¯Übë7q,HËúérÞ¶Ðçþ늀eI&1õ[Lô{Â}\ päŠm€ï#OÂxÚ[è÷ŒO9+õŽÉdß_ý&d÷ÞýWsIŸHHHà:'PX`.º wn×cü޳ĿŸNûø5\Sôqïí>§¢?e+JÔ©(ñO øwFúv÷[¡ ÃÿÒv °LYôçb(^êÞsœï4ü iÙrG¯ûdBKöÕE}B\Œ$7l$ H£æ-€u»öÒŸCGiѲ¥4ŸFèÏoP/ ÿHEy|úþ£q,NZbÀNZH§M¥yR4Aû@2ª¢tußR«Z%ñ©R¢œ:ªüQ%Ñî/~ôU*Gö¿€Àô«-Ÿ/šáÚP«zU)Wú6¹õ怶_V|03 ®W¥byñ¯^E}ªÁ¬h æ,špHÇgœq7Êý!ÊQõá&`¡A¶û©0R ö5Ü«pÎãé;âùÃ6à}òÄ¿*îMè°?h Ä~¶+¢j`×iÎðüç'g/YØÔMx«hÔ,nQgPÞ÷á'®o X§à7¿ 5œZÈ¢¥+å§®MÆøÔsrO üíL¿ Öî¡ ãú-#×üÓÏmžß|ý7IêC¬ªVÃLï×Ü*²Ï_xëZÜZî5Þ8ÿŠ<ðHÆõÁð3ß~Î SfJEùµÈª21|ºß×W~þ+ò³ñÚ$@$@$@WF@ ÍðÎÀ÷¹¬ï-<ÏÓÇs¹÷stx#æBäkžzL{øœ1t»ß[tçÖLµ·²þ(ûOGÖßÚ·®ÈzgìÑJdÂ÷ø?%Q"?bÒôúwžDIHLö HúþëÕ«' ÈúÇ%$J£Æ¥yKX ¶MQЀ>ÎO€h$€ÂÂ%2(HâÂÀIB¬ŽiXOºŽl.=;Ž{:¶NMJ«zQ0%!"³jH ²¥¥Ô-%€úý}«VÁö6)«Ù}luŸ@H©ÖÍôGbŸšó*/+U+CôW®m%©^œ²+WZÊ,)A>µ¥YãV2|ÂtÉX·]f¯Ý!©[÷CÐÎm{ÈDuD&æ!XsÀI3ü¶à?ñÌT]ÚmvTõHH×ÐRÿLoa6T 8#+¢&üº]ã]ëåp`ŸÿÈiäCâýÀ¯ië-iߥ;2ú®¡k®Òk#þT<jXí][×sΞÒ?]ë]Kϵh/KmŸYÞZ¡PûÓ{Óûï CAûð¯æïO>µÌPÜ7ѯÇ<Ùé}¬»ùfkÎ×ve6ý«þÛŽm»Žlߥ@3ÇðS&6?Üö22ôÃcëÃDyY>ÿüË«Ÿ?oøðÃ䟟KüÖ¶(d $@$@$@ÅÀE ö^LË1Ô0ÿÞ¶ó þ5<M«1øOÓ5ïݶûô¡«}þZò±[ûþ!p7íWÆOÖwÜ$ñqqR¿~=Ã6ÓýCÃBa4äädIÀr|ñ±qY7B"ÑeûâÑ"*ÄÈ(ûJ$²øqx. }úhhÙÉ(óo#m%K·ö€{Û&Ò,FA ¯ûù`â¹ ¿T¥tÉ[¥ä%€LÉRRœRñG¿fšø÷9àC .æT,{;DE F©-ýûaZ5QUj¬BPA (iÕ¡<=d€ÌY±^²6ïÆL²ÕK Ž3v@Ð#ójÐýUÈèkä5ôØáÜ0@TäNáoï·²ÿÆpnUüë}iÐðþï ï\òý5ÿûßòáKï~Y%ó*ºTj{XLx;« s÷{åô·œ£Õ{¯bPËÃukD¬stUÂmåêµXŸ%iBŸëë1TBÄ £ßŒ-¹ónk&öÕ·íÜÍê±·îçx»?59tvÎ9ž?í¥0ðÅ\^ÎÏûŸ`§3 Ž¢JüufAÇ;{Z÷«óŽCÍçku_ xÃæíäÈÑãWrk¹¯9züu#€ï£"_¿_ P~ºÜ-]ºßg1iÓ üPò¯&¶PxòÓÇúz5ŸÿáÜ÷»;0öeçîœnEýŠEyóHHH xP 3æ#ïyVV^3óùÃp±cFð©õk8Å¿³Àd÷ÍÖùwßweúI÷èSG¿»] ñÿ윧Ñc~R ó¿|ßQ6cŽêÒU6m*Qëµ|«KuÎûúb*?ãÓŽŠì`©¿`¿:ÞWSü|jI5Lá¯R®Gï}[nR7@/~)©²}dãCQºÿáèŪåǵ$«4ÅÀ±áš?êkíßzsI¹áo?ÿé/èWÆ@u©Á1èO3þʵÚt@mÖ*a:T+š(uð^>5°Àí2XµKhDŽÇ'J6í€;C//£ŠÍ)éeúÒõ2cmµL µ"ÂNðBy¿=Õÿ(2û0 ºµeþÈøk€;"â?Ë[àuYšpŒì¿Süë> KÿÛDàÒ¬3ÚÐõ¯ŸþZÆMfõ «HTѧÓ×û>ü€L:C¶mß ðocjýÇÖÄ®¯êñ§[Cö¬,2¡S`êŸ E°ÿà¡B~ÚŒÓÎ;oÚ§îy]þ*|æyIC©žNüÿoÈg}.a²ýyL¯ß°i«õzôz 7ïyíÁ×ÒxØ9ßÁ0yùÕáðQùîMÅ{>÷=} `·ìt5ò÷é§Y÷©«€€gY4kkͶç*{Ôïà.0|ûÝw/çÖrÏ}ÿ€Ûœ}ñ]ºóÓïD¯ÝUŸ¹Y¿wÞ}mÿ¿ÿãXYá¬ßžYF£µ¡Ûœ÷[ÑÓšÐï\ïuÕõòËe̢ȜÁvŸÿþ4dDî}« ñÒ+Ãpöµš(àMyHHHຠ@üÎP3@M ûÂ?gg÷°÷ÜzæùZöoÂQþo¿Ùº~Çz+ó¯¥ÿö°;|ogüO£Çœþ(ÿ_¢2Ù¯Í+íºÝ%õÐã¥õA/_â[]V¯nݺÙuÄKóYËìùHµ€"Äué[JÊ-œÑ¿üéÿ€Ä±ö©P¯åû*£¿jùrR%úÕ î«U*רÖF¹~ê ¿6úökâ±zÝ[KÜ"œá/š( s¡"üáœPίýþq= -þµ±ì?Ä~5©U4*U,'¥14ð,yãXiïS»6CõæÔIå OZµ»Cyúyeg¬Þieéê0òÂÿñy^~W©¿fýMdn?,YÛìXžýdÃÐÈB·Xþâßñ+ŒÿsBÀ;|GÚе.W7>Ùì*íÿ¬ìÙw P}Þñ ¬Ý°YÚ¡*@Űf«+ÜLû ýÓåéº[âÕo®¥¢Sê©@<söB]NÍeüךe{ëµæZf«}ÌÉ º9I}¹ÙjVŒÊí¯Z#ß|ó9ý¢[¹ðàcO¡â"É s-ݪÑÑëGäK|ËùÓý}ÒúÎëY¢Às/ ¶H,Ì5?Ç2«×®·*<?³~ßZ) K1^«¿·Þ~ǪJ0Uº=uú쵺<¯C$@$@$pP ";uÊŒ}§!àÜ¿\cÀzÝ~ç1·ý-6·ÙØOÝ}kÐN÷Ç4 k²¿5á?Oð« ëÙkÉ¿*ümñrúÊ3ö`ØÿBLÀWñ¿œÿS³VKûn÷¡ç-Aâ[ÝG öýÄÛDÍ5¥råÊRBº2û% ªÿòç?K©[oþtüßÿü¯žé&pñC&^#Â<$8Pj@Üßø?Ë_ÿü'¹ æ@Ië+uë-rûm¥€Œ/*|°@ÿòž^YLü¯ _ÿÊ@Àë¶JÒxNÅ)KÌk@eŒæ6TÜrã_e"â@IDATµ \Ù2Ö~IÌÐV}^Tà "óÅrºda«öä$×îŠh¬|üi²HlÚ'íÑçï,Ì0±Æz,¶ßý*üÑZ ¡"Þ[Оò@h]Q*u œÖïŽÄ{ÝðÑã¯h@Þdì5cíY®¯NcÌ) úÄ:~ê9ÖÊNñjáX ñoŸ)Ôµ'ĺöM[wòZήæÀ;ïœç<œÀýÃGI|r3¯×éòþÓ 4&o {ùU ©ïº*²uuËYòqÑÒù®£ü"âȰýò˯o_šýí;sDUô4yÔ€2|Žüðã ºÎÅNÒÏ8g~ª5B¿{5TŽ-åë+øŸ/ö>|HHHàú$ @&¹ þ|þýXÇo@I¿]Ú·5Ç[ÌHÙlGªeš ûSU©0t¢¿ýÇ1,Kgyâ?MKØÉ¶Jÿ]@&&ÌgBøgCø/ =ðŸ4±Q2r~²éûŸÿþÈøCüûÔš!UªTÛPÞ_¢D ¹áäFloGïý-7ß"ºáORb;Ùø,ÍW³z5)qeþBQö_ûpÎÿüÏÿ³ÎœFÀ7ýUʹÍêϯëTè/Wâ¯Ráæ¥b¿HÍÛn¿²¥€Öí%¥Úîj¬ ËVE%® KÿÝü׿ þ*¥ðú ån·ÄÿÍ%ÔžAnÂs·cI@3/ fµÊâ 6fGDIó&-ä^}z=(O¿ôª€¯Ýl;ïÁ(Ñ|¶öÞ#¡l?·ãž[ £¯Ù~~íWÁ¿[ c,à-t¿lŒ¯îg#Ž÷ß®Pãà°äŸ¶Cœ¯ÏÿbÝï;µ BKEÇÍ_éfou>O@3ǺÞ-~ôÑ%/¥è [X3V<üÄÓòÍ·/þÍnÅòjx8¯«ûFó ÚêªýïÞT\k%Ź«Èûí·Ò튎ÞÜ£¶4Aññ't[nÇ¿þúiÓé®|×Ñë =C¯|ÁEK°"f.3ÆÜcæŒ÷þßÜîãJ|ßÎK0×× ËWŸ,óãJÞ¯! ž>XZRPî?â©[AÛ¢"œ±çÙâ¿[ÇuSµ2Áiÿ{w.MŠÓëu?d1«â_üišð_ž÷,ð_zà,ß\^0I7pôࣀ^Ëü}1lÏßϲÿx¬â¿téÒrË-·HI-Á/W5Åǧ&wI,Ñw«HlD ¿"(Jò#1¥¿ &ö-SƪøßÿýùÓÿýüåÿCÿR¹\ ©YMª¿r·JPÙ[%ºêí[¥Ô«QVK5nßòe€Z Ž]ÀWÛp_åKAÌTTµ*n[`P&ΚCB£jÅh)ª Z¢¢b¥uŽ|AÒVo×@eùn xK0µ1Eÿ&nÅsýKTÔc%Å(ï_X¬¢ÇTž±oÊøÚ.Úu&CþX`©+í8$9§®lÎØõñ_âÝ% BrûUÕwÆž¿}ð÷BÞUÁ§í?tØÜç²*è4t¢ÿ¥þÆN/ˬåñM[wŒê©ý?``Ý ¡#òUèdþ»{õ]uàb;ví¶Ì #PÖ©øžØKõ.×WËìë^êÌÙ ºF:ŠåGÁäpÞ£;:Uÿj3é¡ôÉgÜ®÷šßõìy© º¿d4 ¬Ï¯÷¬)jñHHHmšøÏûÞöø×maÅ¿÷{3²`,ÞRÖ¿ £dIãöí%:. âß×ú~~~¹ÃþBBB€6úæ+B8kö_£<uM,³§}ö(GK@^¡NÝ÷©.qû²XÙêÛ¿IEÿÿOÊÞø'©Qú&©SáV ¯RZ׊A5€y` éî+]£€KDm¹#ÂWZVµ+K$¥%²fU 0_ð¬Pï_ææÑJp;Þ«Þ³ŽT±PC©[K ¥Á_¢ë[Â_«ü°J@]Ü«¯57 «ŽéÐYîêý:KçBeÄ;"ÀbË8Å7Ùü% ±Yzþ&.fdk/¿Xñï-h\úß(fdQÔ@(®?¿låë Œ£ŠCÜtp œ@Þ`;¿h+YÞþŽoŸ&Ò;Å«ÁqÍkñwôøIË`ÐÉøuué»xk¿N¿ØÐŸòì¯ä»7}}¿Gû®€p-þŠÍoŸ l]åàRÕÚ>qf8ËômI²3gﵞ=Ùµó"âÝL }œû]õõ|æÅÜëÖñSŠþøG$@$@$@J ÏÀ@åÍg \ &ÀÅ¢ CÁý×}Ïì¿ýÇ·#ÛHǺõéš°¶XÎÎZ¯kÏ£ ËK þW9%2KË®=$ }ÿX6¯çÕBæ?((ȪÐÿ:ý¿*ÝSáûí·KµjÕ,C@gTÁ}x>¯D¿?&øÕª!I1Q#~ÈW+ùT·`2òþ¥ošJ¥€©_yiTQºU{ãüåŸøyšAžh+ýFÉŠ1òp£¹;.XÚùJrïSQêÔu¥ybŽHXdòýP P}þ·žIj¢: VUÌ@ÁÜ[0o@ûÿc"êJýxk``ÍjUÅ÷ZµÎ Y œ{÷>>*=*5[Qî¿Ùõ£ @³øKÐÿo»_ ÿRTW,Cu nøwVì¿©Ðì¿÷{ÍþÓž²h[oÚ»®í¯Õß!LåKnêV®BùΜÑ}¯À·ÑåߌèëJïÿíê«ôµß^jEAvhÖŠæô}ûxoÿøçÒŸKw7q®æ 6oÃz8×àOùèÒND zMZÉîœû/ú§ÎŠø,N@3é:Hð3ó»ÿþ÷÷Ò¬Mg·ûÓ{MlÔBŸøâË+~÷Q}¢³ô³jšÉ°gßÅ?ï¿_H$@$@$p]° íõ?ì%®Þ(HÜ;§Â py®ÐÀÖãÈØ~kÙ²¶Öòuºî<z×!þ³w£ß-Ë÷©KRÖ^œþŸúWCÂí×Iÿ:ìÏ~ü§ÿTükÉ¿Vš!PóªWG=üaÈ_0óÄJu ª"C¥Q|ûTÚ(׫]M¢ª Ò̯ªt©[[îöGêÊS å æáòJëÜ6^Fum,ã»·w4aÈíêË£M¢€'L6A>\³4š&]'JN€ebŽ$Ht_©vûRu Ú^PsªUª(a¡ÙuÐâ +cÀ OJö@ÀÐ0éÔ®£<òðã2ðåa2máJÉÚ²Gî8V-ÿØ·²ýyYþ¥óZúo«ìs!¬ Žd»ÂÓð6íÀÿÓA ìÚÐûŽsy7 ;MûÙ{Ü÷@îRnúºÌ]pTµº@AW2bŽh¹»ÉúëVÅ fÞ/g^A××ãÚǯ&À[o¿+o¿ó+Þwß{_ŽŸ ¿ÅËWJœsÚ: Ë~TÈþü®í<þ}m ÊeÄ ÎSóí뜚D÷òßàHÉ@[~îkñ÷ÓO?˺Ê#¶~ÓK{ÿ±§@ôÛßœ?V¢P®WÛ²p±÷ãs$@$@$@×ÛP¡(_€¢- Cÿ<#eZòEs0Ð/vHÇ ¿43ôÏÑ÷ï4éŸÙ~ÌHÇÁml3ñ8Ç¢ÀZAÙj`5¥{ÏÈüU[€S^R© úâ¥÷GÖ?,$LB!µ@[ÔвÿJ*YY=®¢_3ÿÕQ%á(¿÷ÅPœ@ýÖö$dæÇbYœ ôØ£Œ?Ù·t©)ÝÂkI¿ø y"9\^l/Û$ÊöI2ödtgCrWcqOKݫ̺§LíÞZÆwm.Ã`<Û U±õCå®(?ŽÔ60z¶š/w6I1¡Ò®~¬4 Àª€*ú``re±`EkX OJXB¿º5 VšsÊÝ~øÖ®¶RKcåÖM[K¿ûË)ó$mýNdþ!+¯Ùÿ£²%þŠßl`(ßbíý·ü¡Râ?{Û!k«3Ü*tNbaVð:ào±`À¥ÿ=¡piFÖEmš°<ýµþ{öÅÁùzíU.^¶²À·ê~_ß|KõéÁå+Wø_ë×FüFüëVÛtfΞVjt¬Z³NjG¹œWðX¹nçÅþ{éU7ævA}Ù{àÐÅ^vYÏ©0/5ÃBYhÉ|·{ÁÑ$ô»Ö{ÖP®ü# 'ËØÒÿMHÅ67Ð`jäE5@g8Ã)`LÃA;FÀ&èÃð5 ¬jùT Sý4{éš@Jÿ3·èwÄ¿×cj`ÝT€oÜ/OŸ4\"£Pö¡X»ŠD heøü1øÇµ·¿ª\ÇUük@dØõÜ0÷« RúøGÖäº!Ò0Œ4÷ŠÁÕ¥]p éSGú%ËÓ #äUùam!úÈø. e|çF2ù®Šüd>úwHæ]%åþÎ2çÞ2¥{sgsy¥}²< ¶ŸõÃ¥gb°Ü×(Jîk íb€ml°tk$Ý[5&Q¡R·VM¬nðÀå¥:fTÐ/]òKôkæ¿&ðÅC|îjÕt@U¬ 6ñQ1ÒçþdÊlI_·]ï9*˰bÿK,Àa MÀ×cw,gä`e6šáàKÑ`bÑxÁùÓå>Ð(äÏ š º0>üøãBÞMáO>{Êùžë\q§yÌ_~ù¥Žlß医 K gΜQø7.¢3u üN@ U«×]ów<~òt®6狀`PãG{_ à_þ#}z\4{n^£,¶hÍù\œÖÍhÐ÷ÓfÌYpE,xÕÍê ]AB[3;qE×âHHHþžÔXžåš€m8dEÆŠ#b"·HÝcÀkä;3ÆAÆŠcòÍ'§$snõ1zô]m:" ÕZÒ¯a®£ûéÈò;CKþUä;×·Ö×5çµ@+vaÉ?ôªkúÔUroßÇ%1±ŸÔ ·ÄŒöÇùÃÀ°ŒÚµ|¥Äp-L÷À*Ÿ5ka@e)[¶A]ûçíÌ5ÛWëFHóð`iê#íC+I×êro¬<Ú(L¶Dy;dü;Cø£ÄÒ]Mdr·f2µGy_Iíwd=td?ÒC=r·,|š»€÷í*sïëª2®kÒ¶Ÿ<Û2Nn.·>Â¥KŽÜ©@Ë$éÕ®ÜÙ, ÕqS«ºW./ÁÕ*"³_Õ¬¥Ë#ó¯ ŽFáÕ±¢ehŽhÚLæ¥gËòm{l`ïqY#`%fÌ¿ÙjÆRLçÏ;¢m ,Úyf°]sÐ¥0y =nb1^»û4 Ïhx)àqQº[QZ«HLlÔÒd>Yìç ñZjþÂ[Ò€U·ó5\Sñœ »æ¿ûîßÖp=§ž¶³ëõdßç\éèVÔIÈóÚ˯Ëû<}Öëe¿üêkévo_QÆy@ŽÄu6oÛ!Þ|ûEJzVŸ íÙ¡}û§+/ôöÅ\s%ùÑÏ^îex> @1 @6Ä|úVdn:qnGÚ<#ÇR·^56¶"c}ÛP3@ÛÆzõ!üÕÈ@ËAXfNà i[±€ß6÷Ȱ²þX«ËÑ9cµ=ÿÎÓvéÿSœy¿<Ëkß/1è÷èÈ(ÁÄ~L~hpDM©ÁUQî_îö²Rõ·JšÄÚhšRæv Â,,Ø*:JZûIë:å®jÿŸòprš<Ó"FtjñßHÆwk.Óz¶šo#3ïm#óûÞ!iu Ý-Ëû÷ý{ËÊ}dùœdéã÷ž[Òè&³ïí Sïj ¹åeŽ <×!I©ð@ÃpéÓ8Rz5ÍâÑPOzµo.ëÅJÊúcüjHæD ªa0`¹Ò¥pÿh ЪT Da&@ oM ñ÷?T1ø£AçDà !#$mÕËX~ À2o±¢±[Äc¡¿ü±3 öÐÈ÷/ |HŒ(J@ElæmE{ö¯õßv,§×vëGûá'ö:nÿÁÃܬÛùÁè·×uáÿõég×úö.ëzZ¢Þõî^nâZ?öœEŠZcŒóîÞ¢¢ßyÆ:ž0Søœý}øÑÇX) §5ÐŒF·úkå NÕ¿V¡íÎ÷Ð}5FìíÖ.zìÝ÷ÿfeüMù¿2]»~ãE_Ã'IHH'5ÁÈØxÐLŽÈØc^"mËAtoqÇ=ÃÓqM526ueû1¬Ï2Ž*ÀŒ*|Ž$€Cü[[5'ôþp,c* 0¬ÀºôYÛí÷j ôUÙž|ï)³l£ô|äiIF",(0ËùU@ï(ŠàÇ¢ü=R0œ?<8ØÊWXAÊ)#·(!·Þ|öKa9=?©Ñ\åöÒÖäýºµ}%¡¿ŽæŸU€cPUéå#}1Ñ@HyCüFwm*»µ°ÄÿÜ> ü;KJ¿.ùhÉ~âY2 ¬~öY÷ÜC²þùeíÀXól?Yöø}²°ß]uÿ2çö2¹GKygyµK#yŠ ;-båÖÒ¿sséÛŠôF%ÀKýàç#-°R@Rt]ñ÷!5«cÕþ©ã£Ëb)ÁJšjšê0ê`YÁP<úc%Ë×ÈRæ«°K®DߟÉüýGÀ2/áóÆÐc&·EÀEh Xî¥j° ß?R4ò!ñ~ š äfEc8tD#£¯"ÞEy}|Ü« ßÃ@'Ý; ÍkVûZM°÷NøÒGÿùáG¶žv_œ7N8}æÜ¥/pgšïýÀ£nb^߯aóv²yë¯WûàïÿYÒ-_fÞ°/êã'_~Àº s{ÿõ»o{G7ùò«¯Œ~F$ (Þ,`ÛaóvlÚÀdÍœE:{C8î%,f˰3ÿyÙcØ[|š2ÐmŠ3`d"²`,eËáþaµÀXXòÿÌ-ûdôÜL¹ûÁþÒÕjøÕöÄøINJdŸ0ÉßrÅ+[êV) eõJAüW(sÕ« ¡ÈcÒuçp,ýä/¬éþmjUîa5äŸÚð*/ŽLÄ$ÿ(áoû÷l#sûÜÿ;%åþë)Kù_5°¬zº¯elzé1ÙðÂ#²eвùåÇdÕ0V=zdõé¶v2«w a0^ê,/tn,zŽIÿnåÑ;ZH³ÚRÏ¿Štj,w¶k-±Qáä¥1ð=ÿº 5åöRÀKj@( -»eÕÁ²lß Y`eèÿµôâ9ç=ngõÕÐý0V §ßÄJë1_$ó¿ çX{iäûÇ@>$Þ\¯ÀAlÒª£[O¿fŽïœÿaæû°[PŠ^¯±»`-a×ïQùó~Ë?×í;÷p×zoÐ_ÿÆù7¯ù}üÉ¿€ß£ýÝÞO X¿i×÷{tmÐåZì{»ŸÎ{9w×{+èàç.¡Üߎ-è@JÁ? ðFÀ2¶jÉð7û[`xLÞÃe"3Û+ÔHÐ}(°+ŽÀŒ*û1DŸãõš4ÐÈ! ûÔXžÕ]ð;ſa€nØ#óWoùË×ÉÃ'H$ÇÂÃ#%66^ÔO¶ÊÞ«£?Þ§Ry÷WJüQ2_|Y©azËÞ&U+Õû¢¿ŸÎÐ02XÚÇJÛÚÿAU€wd-y0!XiIÿXiªc#×@×f2ýçõî,éõ,ôEO¢ìÿÙd2ÿ*ú· î/;<%;>míoôì|å ÙúüC²òñ{d1ª>ÖMÒî*³îï {·1÷¶÷Ž×zu!t>Ø! ý#B¥eLŽôí~§4i/uCð9€FÕòè_CêÅGJ«ŠÐ"%«H.eC ZîB îÂu[eÕãxÌ®ð`¯àn8+ø×Ó0Ù|ÝjvßÊðCØ[ŠóZÝ_ãAãu»ïôµ×ÞþžÑ(ä·uœ;ví±2ÖΟVÜÿÐòégçûôZ uçùvÀýšÈ~ŸáüóCéØåõáq¹âZï- Å©zò¯ævôýîéó ·*Z F·?mÐv eìM õ1]~0{ñro·Và±£ÇOXKÿy Zþÿ>ÿHHHHÀ»Â}ãÞ|aeÿœ^ÌcxÛæU@gš `¶8Áï-2ÕšpYú&Tô/RápKv`õ»dÎ2{Ñ*yiøxiݶ4Ln(ñqñaÔXίz{ÙŒ ôWŠÄRöPê# TI)W²Ôð¬QYBASK@L·MÄß5€ôªë#÷G!û*/µª'#:51w`Ø_÷62œ[+èûïÝUÒúuGo?üÃ÷ÉÒþ÷#ûÿ Jÿ¯ô·ÎkÏJÎkÏÈ®aOãñÙ Ø#`Û Çeë«OÈúÉgzKö=eÁ#ÝdV¿®2åþN2&ÀË0îm-=BŽn&w6n$}ºt¶ÍJÓ# D¡e!9)^$'IóFÉdeÿu@(æ ŒÙbK6îU{1ýÀrK£ÔÔ¡®X¢§ð7ûFÄ{Ë âÝâÙEXéªXóØÿ¿`ùx=RÔ@ýŠmdöq{fôU>:` |þÅù>ëC¥Ú< v( ÷V1ïEx@3ò]°«³÷]ï3Š^c9rôø5ç÷ßÿ@:ÝuÛ5èœûœŸà4t_V<uæ,ª(Ÿ*Òø×ÿñǜ޷z®ÎpZ 3zîeùùçœÎc$@$@$@$ j,ÈÏÚž'_ddÁXXÈPCÀyÌ-0rÙ~üËÿÀ0 øœÖÏ@d!,Ññ¿g,Æ0@ÍVÏZ¶VÿÏüŽnÕÞZò.&2ÒÞ~j€<ĹRvö¿ÿUø×šdÉaÔõä0?i&w$K§(éQSz!ûß7:@8zÿÈš.Í1õ¿¥LëÑ@;Ó³€ôBùÿw#Ðÿÿà=²ì±>²jÀ(õðrÉúìùìþŽì9P~Av(Û_ 983êyÙc`óà'eíËê OÞ+ó¹KÆÝÛN^ìÑZîGëÁýÊ]€O6Òe3i^/A:¶h*ÑšxHFÀüzqÑ Ð¬a} š-ÁU7Lú?=P¬Ý"¯ïè_º%üº&%ÿf}.ïx^&ßVv_ÍW8§þ/w|ÓàÜZUÿK¶í='Ïó¿X4<ô°( Í [«|ýMAoÅdz²J2ºNA¯¥Þáð]ŸëŸùö;Àu¯ûõP âö·üûö»ï¬Ö#VfUçìñ>ïjî÷Í·Þ¶(êõMæ^[ŽÄÿôYï3Ÿþæ[Kì;M }M÷ÉÛïŒ{5·S$¯ýøO€IËŒUô^wäì)÷âEIHHþÔX`!·ØŽÙùŒ8ÇDaÅ¿§fyœuV¿ÎpkÕW@&õwnÕY8G3ÿNñoöíÆ{eÄŽyrÿÃ$¹~c ûÿì}\w¶mz&œjì±£Xéœ÷Þ{G@{ïœÞ;*RE±dú¹3ûŠwßûfrKòÖ[û;D£3ÉÜ)ÿóûíßÿkç;ë ÉZ{ïµíñcèè?ú Œ÷ö4ú{¯¿ø<ÆŒùÆòØ$þãG¿É¬1vŠÑÀlÆ$XLœáð3 ÃÉ? 1nÁ€ÍÆJ'Slò°Âóí÷wÆ!õ¢à ¥q!(OCeRêÒcѳË)€iÙÿK)lÉ¡°YpIÄíËÑœy).ïXÎMYhߊUI(ÍÃVlôD*SéìíD?O`ŒæŠp Ñw°µ¥ùbÌ6&æj»=Í7€ÂL :6e gÑ|ù6j/±÷¿œü_ ùP\ê/~Éô}@u'§Ž÷)`?9J}Ýô]ÿ&w_õkãÖÁ9ôúòn!²fÎÃÃÇñ_ÿõ_w}Üï)BÈȺÁŠò)»ÿöwŸw×õÉ_|ñÓ³9ªnî!g?mÊ«jñÿø£¯òÕwõºæÜ?»©O|Y ðÛ{LDgIL×Þ§ D@ppóÅwŸ÷×§@64µT8Èszøÿ·z|ß¡ºB@! P(_="Twp{[eç/CBÞKØï¯«\uñ°@ 3þwïUJÃÀR ú(áv éûþµÞ}ÉÿàAÉ (å9 =éׯ" T03ÝÀYöÕçºysÒ *&qÜßdÄLó;©xgÔ«ÍÿDþ)ïœßécÞfŒ)ôöö(XÏãà8g2üg"hÁTÄ,Fã¿iH6t˹Xålv±à@Ëp:Òg¢Pš"T%G¢6-õ18»< ]ëØ °^ºmÐËìÿ%ÿ©Ø»FË»W¡û ¬(€©ànzä°í`CtVD"U!NvðŽZ[fûbîÌé8Yî?Ï`$ûäë'[+X,2¹ Ò3âØ2TS4 êK,Û¿(cý(ôWÜÉôÓpP+Àã#WÎìkä-áNüõûµÌü×üP¥*Füǯa¹ûà×-Yìèºx÷ÿGþû¿?×zý'ðëÉš07=Ï;GÆ%©÷H{IyÕWF² ¬© dÅôéOŧøÝÞúݲc «ñAC*ÖlØgöý«z}þùç8YpFKc'8$Ðéô~¯5¶yF€Žþ^£ïw¯¯óü~!QXNnÒòjÈqõR( B@!p/äÿãj»n ²ýªz!@Ö2ô PŠAÇ×:¿cå$ñãÇÊ.\ÿÒ(§ \«Whû$uÌd·t 4:ö¶N0;s žb ðÆÑØoÌèQ,ù ÓÇÁø7_ÅžQ/bò[¯bš1îç±pâØÏ ¶xÎÀÓd8 ñŠ"mñt€[`©ÃB¬óŽäø?{ísÕZ±àT·Fü ôÇiR @UrjR"Ñó+ØÀÿ®uéÐKOiàêÕž~`=®ÚŸ}kqûv®ÀÙ5©lÇVl vÁÎP¬ FZÙÿèç {8,Z@aã],4 35@ªü! ͰgßAÔíÐ*êú(ô·ÔÐàÁ¿ãü¯úèÌÿÄPÆ÷éG éû:!ÿz#E]' ;®jQÝ~}üÓœ~ÿa+à¿ú¯[Iœyûî|»ì'ÿò¿àìá7ÄnÆ\-¶ÁÍÛßó&»öÔæÉ&ŸÓYEÈìûWEÿðÇ?jNó2nÎ+ Lé·÷ DeuÝ=ŠŸ,íòl¶Îþ¯êõûßÿ^k7±Aù9FæØ{àÈ}?F1ÒÜF1äºàLéWß}àOÊïÀ|Skíçì¿üî÷ÕÉO]ŠP( X4 ³ôâp'®q[å$õúž©éþ}ÃWýœ¯:AÙ|û¡1X,žÎp]÷gÿ5²/À VmD³üB/Ôh-¡!ì_#zÌcÏûø1ïáí7^Þ·GcVîÿÆz ã_Þx ã^~3ßyiþç>\ § Àd6BÎ@$ËþÍŠ#ËzrÄòŽÀ/kláX>ºâH òÃ}py!ÿ"T É¿øÔŠÑMÙq8·<kÓ4iž$ÛWheÿ×ù¿AàÚ¡ žŽw5zIþ/3:éP}¡îØá =aXîÜè, @²¿ülÃÙÔŠÌþÛÁÁdFRú/Äß.pr°CîÊ5š¡PKò.-5¬?GÐÑ@çu4õ$ÿuŠêEàÚ÷±úÛáš0{ìíÉ¥#ËÄÿõ_¿ºQ{-ç0=ÝKØ¥?"62Rï^¯Ë}W1oåñÕ`£Å¶øçz¯·=Ôqé=ÃÄés5B2ëÉBZ]ÛpÏ{ Éwõ ([×?Œ·º®á+«PSÁÁžÉçèŒqùʵ{>ö®Þ7þùäçMâä ßÝ÷œsòÿüÛ¿±õ¡U5õ!âIG÷UH¥þù€JDÚEþð?>Ì#šk B@! øD`ž tbô^ë¢â>|}¿#þäxéy]¹fx0Xšà{G¹Üç® 9&Áyöýß R Ä¿¿* ¢C?ðJ/ô¡ ± õHË]ØÌ3ËRø>iÆÉøOþà=Lû>d©ÿø×^ÀTfÿ§~ÓÞzÆÆÂbÊ8ø0f Âr>¢Íæ q±É¿!rì±ÊÍëIþ×¹[²À;Ù°Çרá¢Àéÿò¯bè@$Žå&£ku:.mÌdÿ{8 o×*ô±ÜÿÆþužÎÌÿUT\Û³â@®æÐQÀQ[C=±ŠûWfbsFâ<àciLC@+xÛXÀ>An°ç¹³ŠÁÕÁÖæ°·2§«²rrQZ¥ùWIþYö/lš£¿þšfÕ.ú§ÈDý1fõõY!ÿúš"ßuRÐBðB/\ lQQÀÈ02.wýúSÌYhCGOÞõÙÊ_ýæ7íCRœ`ä ÙÈþùCGOÐåýÞeÞýÇÀÉÓÿ.,ïß²sÏWB²¯Ýž©Ý0ÉÖõÊûÜ7-ÿÁÉÎ]=$».Ï%ïõcõÀýÚGñFÈÌYyŸsz?ìä3äãSÜõSg/D{WÏ>Æ^'Ÿ3ç±7ËØb æXbëΜ_ú^šà(^ÄMÿ|Õ-(_úê B@! P(þ&ÿשg@5õð(g5ÀÈ!Yõb@`»À 6{];üËŸNÐþÁ+É?ËÀ%ÊI +H+H%*Iü%*(ÈZE ²ã¢=*;úx®köÀÒ5ëàääy³f`ƱËÿcÇb œ>|ÿ-LbÉÿ€W_Äì÷ßÄì1£a8þ]O«Ç#hÑ\"Â|."MD`©í<dZÎÆr{c¬q³¢ ÖºXa³-vy;àp°; ý/bæ¿<>L+ÿì¿TÔ€FÓ0Î/KÆ e)hgt¯^Â1Ùèf@Íÿ.2ÓM?Iÿõ=Xþc×J\ÙB@ŠdF¡<)'cý±ÁÏ+Øvphål€¿@)ÆÓéa~ópÙBž9ÃßxÞlü»9ÚÒpM±zÓŽô^AœdýIü«.±ÿµ"àë£{ ýþàµZt#þdÌ>üÙ¿_4ðœ(п-ûÒ Zîþ£»1ñÈ×-èI¬a_œ~sÄgxÇò Yý;ýËW®Þ÷VòGýÄ©BLeõ<>äý&,¿ïœÇŒûÞtÐÉÏ>ûd-_¥=þÞ²JŒT'Èçßï%ÿÆævÄU!³¿ß[è\}SKýüÜúûÏZ`3ÅetfV_H Žvèß/øFã×$ßîK*E|Ã"[Rdøò ¢2ÚBÈ¿L,ðôÁ/õë?÷±Ôû B@! ø@@þ_@ áQ9€`äÖÁåû²=8ïß~ìW2F:®Ýc$qA ùgTVHjA ÙJ¶ÈZÍqÒ" ÕIíŸÂõ2NÕ6âÿ¿)<2 gcûÿÇÐíÆ€ZÀøÑ¯bâk/aæ¯cáø÷`ʬÿïcá€1p3!¢Ì b±!"ÍDŒÉLäØÌÃRË9ȶU.l°ä«öçGÓü/îÿýW¡12 @*jS£Hàãp>'ç9 -Üng%@7 þ%ýëÌþߨ·×X pb žÂ lhe@£TDûb=QxØU±s4Cjâ|]áGO#xð{ÐýßÖÂ6æ&ðót ·lé°mï~Ž\ŒŠ+·ubØC ëÁöÿᡯþÓ¿0@ÆØÿÓýüìîËZÏ]ÀBëë3»z*DOæÑÿgÅÙKZ,ì]L¹>Ó.þê«¢Š÷œÓ[¯>Ccs~émå?:qÉwgØåç5^lÿôâÔoïæsvâ Nþ¿ûßÿú¥Ï'|öÙg9"~k7n 4üS_ÿýßÿÝûñÞ&â`(?¿x*È$ûœþøÇÏ>à 1mVÛt¿·šs B@! P(ÿkdfWJ¬%êHšõQMçõ%øÕýQÅu ("T1€}@ÖíÁ×Ú®äöC ÿà{%û¯ "Hè²ÒR®3§»º·PÕy Ïrí=8Y^ìk`NûiÌúO|÷mV°ãßx_`;óCXϳ©ãaGó¿ y7T{3Ä[ÍG" Õ<ló²aŠßkcMí±ÆÇwœÿÅ !(!/£éøFøA&ÈZ ¯M¡ {÷Òcp!'¹ôØžT+ó¿ºg-®°ÿÿ&[ÜîÛŸã39*âÀL éh[sKãØjà ÖXîa£µ$º[#ÎÍ)~.ð0[/KS{ž"ÔÛ]#þógÏ € ÐÇîî.8QTsWn Òû_+Ùê«$š"xß«à^úÝ/û¯?§*þy~éŸ"Ý_»À1³û³Î2ÝÝ7:ºðét 1<rüÔ]tBgù}{³«mhÒÇ®'êúçûæ·Ÿý ·žæ?ØZpèØI až8!ûbøïÿ÷ÁüðÃÆb绺ÜÇÔÊnöUáa^Mç`çâ5âÏ,Ùõí]s;ÃåùzÜôëtÒñýüð¡î'ÿôg?Ã5ù}í(÷ûMwÐDf6NÚÏ)ߥ®\»¡?V B@! P(÷E@&qc'Ùh`æVµÜ9H I%j(Ü?("°`xT1_ys# ^tŒVñó«( ÈšžjLÉ:k#ædŸŒÌç|yÙ¯çÚÔK1 ;$ÙõÄ|:âÏ8s§OÅ÷ߥãÿ«Â°ö!|éï:ÏÖ3&ÁÏ=ÿæFHµ1A.Éõ2w€Ù#eÿÇÂŒp}÷ëcœ·=V1û¿ÛÜmpœøù/¥@gþßÎ8D@GeB¯)òCq/j(t,KÅåuKq{×Z\Û¹J3ú»Ž#W9°oË2ޝMEÏÆÌ ^ìäô³l8äõ.±méîVu0ÃZK=ëáU1Hð ;I¿ÉCÎg;+-D £AaK+Î^œÉÑ7ûñ£0DCÀjié/ûò¯¡^ônæ÷¡wïŸÖñD-¿cýöðU/^«éåÐ÷ñ_ßîûþãúTÀüu BZ=HÞóȧôîÛ¹`ÝŠí÷é>¥ž¥Z/ždéõdS¿Êg€gçBHøŸ/_œ3í{ qtäùg ft_öúöw¿GÒ»Tó9RxýséW m:¿ì6CÎUÜÕF ÷Vù&VÈY±?úñOŒg€_ýê7ØèYØße.(÷Dßµ¶»ÿéí÷<&ÄÎ=0 úSV~ÆÈSVY«UÜó&ý'þó?ÿ Ígá©ýÇp Me<áïÿýþÙ¹ÝʵI~W¢Rñô=P/ B@! P(Í$ËõÌK4tÝúÎ>л³3».ôÂÁýÖÚö>Ÿ»£œù#E5ßWPÃÿðšÖ2Ñ<G³9 Íœ^ì/Rà;Yë/ÞD#ÉKß'\oãTEÒùÿ²Áþ~°11ÆÓ1ãÿfŒ÷6ær$ òì#ÀÜ^Ƴ\kdÚ/Öþ*fýÓIþsì!/ÜÙ|_¬²^H#@+¬bùýJfÞ7zØá`;ÍÿPÉÞÿVì ?ÀNgKìaÄ/zÐ(ð( {! JúŽfÄ¡kE:®nZk;V2ó¿Wv®ÔL{7dáÒÖl\a@ý®²@öeñhMãXÁÄ@ `gž'rŒíÍ{¯b¥ÁrNrµC<ÍM±áÌ©@fÀmöVfZE@dt8¿ÿ.bDážÕQ4©£ 8÷ë³þz¯FZEì©)Hú øëc8ñ×ïë¿~_V%ü¯Y #ãr×ѯSÐzÃâñó_üB3²r-DQOäEOÉÀ©Â"t÷^ÂÇ|·>úí¬8Q$põëC¹Ã·ùéOïú¹ŸìÀ>ý®ûZø`+Ûâ }îNŸGùú&-ëýï~·?æóÑðîÈSe¹¹dëå9?^LØA¢,æ{óQwìÖ2ßrÁÏ'XÈ1K¶1€dæ šØ]Æ·Ÿý]|û;ßÓ2ÞåÕuX¶rõ7€£ïÁ÷¶x¶üôçZKÆo~û[€e-(·×ß[ÿs/àÔgí/_œlèŸ(ßï7ñÍo}^ 4¥á±õÜ8ù@Ú:äwcøÏ*£ Ýø}ÿ~ð¥ðýü¿Ôù¹ä>ó(UTéûÔ B@! P(ôÐJ§÷öÉ7t÷ ®K$<×/4Rh€ Ñ UýQÇãµ#D=ÏjxÏ¢CͰÐî+Ùý»ÄÏ]Ûò&X¶^ß{õ¿|KißÚ÷Î^ù}³âáäcóÖíð÷òÁLÌûp"ÌŠM+GãE²>ÌÊvnc(k3$Ù.ÆG¬fiÿZ:üg± ×Î$Ø rhžY÷5Ö² `§ö³ûåI"}±ÕÙc»Ã{<°Û;]mpÄ×gHÔ+(ÔÓ °æÝ«3py[.z%ó¿&çWŠ kÃôm£@KëhÑË6Î8Í ,=[\°ÏIµô Xä0{søZ2Q9g&Nãž=ÁÖŠlp@€&ðû¿k£þÒ-â©#ÿbð§ÏúßOЬ"ù¯!ôÄ_¿ê Ÿ~_Vý1YuÇuÂQõ ˬøþ×Vý(àŸN@§do%+&C2ÑB ¬IæøNÒ-f~R^.ÇäÜpb'BÍm]píúüIïŸLL÷\œ5;|þlb Ï%Nôò|Ó u?×ʵšàî'þ~2ŸNÆìM¡²@ú v"XèOWpÒ_£ÇLVù¹$«îþèÇ#}ô?ÿÐ(Mšþ=Ý Qðÿ;gê{=£=jÆXÂ/#õâ|¶³çW:zòAQ* B@!ð7çú®£éb{.s%ÙïŸÄmÿÆEF¯v®[MàN4p»Aí@žàËŸ®¥@çì>Ý¥x ÙåzÒáQGá¢Ï]Ïço y]C/ :×7QÔheû9Ù¿ú1ã#ŽØÊŸ¬"hÊ/Bt\"ŒÜØ#ok_:ãÇÓ!?Üj1B9:/ÔÍy©ÖÈr±Á {²) ä<öÀ€Mà 's,çeÈf»ÀZzìqÇ ºó OVØ.ÂF7[laIþzg¶Ø#{±1ÖsLß/GpÇIWVx ">M4÷ë^öuKЊú¬NÁE¶\dö¿{5[V¥¢+'-Œ¶$-[BÜÍvLfùÚ#æÑ,ÍÂe>ÛŠM ¡ál-t@Al(j²SP][Ñvù¯~5¬š×&±:oi%ÿz?RÖ_Éùò¶>z@°²Ã£fPö0é¿÷¶ÿËZHëÆ¥Ûßùýwöu=žÙ¯S»f×UöhKfXÚ€ &Šº-ïû¥çv.ÞèaæûÏ}ÝžõÂbtDÅ>Çœ®Ž]õwî=ûÓº/{viUXœ~Ö^ BÀœ>óAKF]Ÿšø|ò>÷zViJ!ßrï}{]'mò³úDi ÷úÜÁÇÿð?b å÷Bî+ 6mÛ5øµP( BàKÿ_m»N²Üw ÑËŽýËœÜfFk3ÿ޹·AÒÏûHÑÄãúhdÕ®rý£Ýô¬CþåÚáä_ö%ë/ä_äÙ.]eÖÿùÆÙ¿pýô·ßø&×[žpý#tÞü6«.bÛî}X äž($ =Ðì`Y|8KÿÃHΣ-è€og© «HW³Œ?íÉgcÉõqúKY0id±)Ö>:üŠA¢9bk°+-á3å}DÌt^neX¶ÄÌ t³ùXa³h&ž BÁ' tB~€ªRÃÑs¹ìõ_¶UIèa%@÷4t°ÿ¿]Èj3¢p<ʹôH€GA§-RÝ,ée>WðÜHäs/w²ÆTа:ÔG,qÐÑ ¹žÔÝMÜ>Fu7œX !Ÿ ¬PASG!÷z!@ÖÁb^š`¶Ÿr2þb°0ôüe^I%üOY #ãr×ѯSRú1*&~úWUmVª-ýãåœéžkÉ^û Dâæõ·ü³Wqþ_Ÿjœ6oâô¹÷¬:é4ÂIQB~ù=üq²à>ÿâó?û¹äÒ>PxŠD+×afôÐâóì÷7µvÂ-;8ïW_ɳéoòÛßþÛví +?!ñ÷Âê^ÇE<8ÝPkùÑãÿü#ýí¿týÁ4Ð!÷êi'Q/ B@! P(í7®³<þ2ã/]dôhÑÔÛÎ]œJbx gû®¢YªX) úªÎòž.("°@¢Yk+*Dh2@IDAT$ñ ,¿× ló8£×<PPPß/4"ÿͬhhé»Ágœ5ù¬¿®ßfÜDÇÍoââGßAuó9>z9ÙK°45iÁHtwF$HÌ-B¥92líÊ`KùHØÃfOÆ2ó¹ØË,{ÊÂi5^3ÇÂmÚðäºøa2ú9Ø>s&"`þ4XyÆ£_ËÔ1ð§H0a8ÌÊÏøùcÅv§EØàbÊ 6ŒÑÁÌÿT[ÁQz7e¡ÙÿöÜDŽ/O@7ÅNÅú!ÍÜÉ6ÆÈ%É_æÏÿõ@[VÛa³µÖnPHÃÀ² Gì3>cÄ#Ë`"ZOAçEöÜSЊ'°_Æ+&ý·Jh»jÆP/Yþ;ŸÏU·]âõœZT»È 3-«×*࿹¯RïqSgcüŽ9ZŒ7q:NäÞåZÿ³ÿ%åU/ñIæV²ÓËÁõ%äBåüÙêºüú7¿}Àîá.»uûcì>pD#fð¹(8ü\zÂ/ÇäÙäùEèGIY%þå=ŒÁ<¥ÛÓX/<&I#×bà'+í«)îàf¬á&?ûÇÇ_QÖÿ^ÏûV>§ìÓðÓŸ× Cðç»ó:ü&COI óáûQ\ÚÃïìqS1¿wLEó¿4 'wD§{=¯:®P( B`0"tÜŒó×Hð¯JÀ%ºå_$Á×G¯ÖвúFØ×u^bY?IYçEFÍú.Òx-$àÍ=|?C#ýŒŠþÍ$z¢ßHßÄþüfó5ñx¯÷5ÈëB|XÒÏ÷Öó³²Ö³`p@ï#QÏûè+$û¯¯hŸÌªËú]ù¿íl¥m¿qn~®Ÿî£®å,6¬[쀀"ÞÅ 1öÖ`y~š¥¢ÙȲþDmà$p`è¢Yð'i45R @Gý1¯Àvì«óÊ0ý<œû2Š=ÿ8>|ö1ÌxåÌçUœû*fzsßzfcGÁ>s&ÃÎ$ÌüÁ3ÞGÌŒ H4L«9Xi·[\-p2ÔÕihZ³lè\^zô° @ÌonÎAÛNÅøcµ³9ÖrÚÀÖÈìÂäp¥AažJ\QÀÃhÊh'ì·ì¯!éío =çÚé©påkªèÕPÍòþÁDðö`1@¿--#UT¿DÁÄÿÎö %þW{g[ w°žïÖW%|ñÅÿÃ'ßü6DßúH7Y^?².€¶}T;X.DzœN1@zÛ-Øã€Óœ}Ý/ñ+øþ?ýõX¿y}ÇɹkŸBž ø/0³³§?ý `ïÁ#è»z"jü%^Á5*µDbZ\Œh¢g£œKŠßp¡'/ž#,*»ÐØr?úñ§Cª0ŸÎçüüóÏñãOæÖóØŒ}7Â(XX;y`=äùä{Q}Nî~×ð;s: UòÞ}ÉDpóöGÚï¬?ýÙÏÁÿ~«B@! P( B@kž&DY3I¹yF+Ëè%$3_Ó~ãó.¢üleç{Pv®[r¯Œp\«Ú{éÒY[ËÎuñÚnTïFù¹Hú hÕlÂÏ^ýV R5péÊhá1(,裢@-Hüû£A>¯DSù¿V@à,=ÎkèpAý§ÐÎÊÚöÛßÂ¥OŸ¬fØŸu2bbçå('Dq,^'xÁ}á8LÃtf÷Iø}¥÷_8>ãá3á d. dãép? 6F}³_z3_|}ãzc|<ý&>ÿŠŸú4fŸñ,æS °ð6Œ)DÍFå\ÿéHZ4-$åÖó°ÄÔéÆ3°ÊÆ]QIC@®KÇ¥ ,Ù§pcë2\ߎ]4 ¬ H°ŠÛC}p0)û"Pž$ùô!(uFã€Ë"¬[8yhË F}Œ;vNCÎ{Ï`¿ÓBŽW×p À-I8ð3C?ôÞÖþ¡«Ž \Ÿ+Dq@Uç{)ð÷Qq®œ·.iöPÿþF/VÀ~q_`f=$,ÙÓÅeweîð}ÙpÜÿ¡éÝoÙòô_äþò¿ÒÄÅ'£âþ'^}öî¹èx/Ï%äû¿ü%~õ«_ãw¿ûßø={üÿ§ÆÌI[FãÉsüê׿æsõãÆç~Áó³Ï|4â×ïgÍ(ßßoØ"0ô{ý ~û?ß×ñóª{* B@!ð·ÀÌ TŒÁªb¶e]ºmür/gùuùÙ<׫ŒUÒ²Ù\ëÑ{²V\ Yë€a³Ær¬BD£¢®þÌæ¬×2_G! ç)0ŽŽKÛ@+Û ÎËö99FQ m"h+ ~|L-ÐGéçõ}ÒpŒ/ÅóWn -í$þ$ÿ]7n¡ëÖ-t3×óÑ7ÑÇdÞ¥·qhï~$ "ÔÙ þ,ÿ÷0§³`i0s>x3F¿Yo<yo¿³q£a7mì&ã»/"aÞddÌBø1p¢`ñÖó/$ÿÅ'1å9V<óÆã ŒûÔcxñî3ãÝçÀ/<E1à9,z§CÑt$XÌA³þkÜm°ÅÏ kÝÌÆj%f3°ÕÃE þhYNÿ_Š9 W6fá:+zÅ(py"EûaÍ $FaO'€GáT mPé]3±jîXXâl?: Ï-^Æv©h9~Þ üN;®£œÿÕm4ø¿!q û4ýã¿»^¬NEÕp÷ß%ÜÉGÏÓ²ÛËÈ¥|[ÊÍEU/ B@! P( À?"5w!¿îòÚQØÐÂÆNm-hžÀívnêÀŠNÝÚÜâ³(jíÐÖ2{Ù(e¶_öõQÎÊÊKÚ~·«ž-ûÕto$éBص¶ -ZIôÅO@Š4ñl·J «Î^Ÿ¢#øBô)h!m¬NœpõZ\'é¿Nÿöýwøwsí¹ñ . ñ¿}œs} 㯲ó*GrÚœ¡.np15íÜi0aŸÑ÷0û70îµgðü;O?÷HæÇœð,ŠŒþF=úQÈ6£)úìÇHïÿ30|ýL%ÑüÇ0ñæàõ'Å+O<ç{Ï=þ8ôQŒÄýQßxã_z¯?·^ Û€±ÈŽ3Åf?[lò±ÀFsl÷¶Â1ùzVt®LF/3þ"ñ¿º>}Ün£G@ ·ºà`jd$â(³ÿùa8b ª(gìŽ-æ( ±Gk²/.fG¢*ÐkÞÃF±šÝº:QMò_ÕvÀµò¯ÏþßMúG«8OAèOmPÀ0",C ÁÏX{×ø ÓÑJÇ~õR( B@! Pü£ Àé.äèp=ÃlK¯Hô5âϵÇJXþ_ÜÚ ÿ3-í(a¿~ÙÒ_CC?©Ð;Ý|ÚõýïÑ+>ÛÁëÚùŸvf;YYÐÍÖz 0*Û:YСU<WC:zkCg/ E ÀìŸñ¿z-ûÏ únjÑÎJ«·)|î·µ ÝÆoê>Ûµuì9rÛ`*?ìÿöö«óòs$çãÅÇÁs>gap}þñG0%ý³_y ~SßAÛÖÛÎEºéøN£0á5,dÿÔççÁû·yý(ŸïÇÃ;/¿wGœ'|<ö4yäQ<K1à'ÄägÁ3OÃ|Ô=KmPàHAúãᮚI Æù¥±è¢ñßöÿ_Þ +.SèXßÇÿcKp"3Â8Z0ȧQç ŸÖ8écâ`GKñÇÜ84Fxc[6M~¥¹K9â±uý¿@¡'þúuhÉ?«XðeQ9HÐùßÕ`ÿ.ÝR&Ãÿ.)`8"#ìë;ß ff7Ø]L÷®\»>Â;Ô! B@! P( Àß'@"Dý$Iý©äqÍã~~ö¿ÂY% y^âdýéPÆÞÿrFûò.ÝМ ¯±@BöEáÌYVÐCI§[Û QÔÒÆÏ» ~»ûe(TëdfºKEØJ Mléºê1€H@¡ ±£dfÜn¥hÐBÞ^Ž]¹Âè£W+V,[0:óÆ¿ é4ìÿúxí§ð,³õOø?Fþ(ãGÓ¶¥(ðþÓÂmê»Xm?û©ßìºñFà7ó=X}ð °×ÖKOaòOã}fùGQ<xë©Ç1åÍ70sÌxåÅðÌÓßÀkÏ?£^õ€ñ[`Ð9Sa÷ÖËp{ÿ5db öø:pä Êã|µÑÒ÷ck.®°üÿúŠåÀe Í+Rp0ÒGR¢qrIÇxâ§ ¿9öqºÀ.ô±C!«|qŠŸØÅ-Æ (+Íh`É¿ôÿWµÓÔ¯?d[ÛºôÔë¯sòþm}O¿Ž 1àÝbÀ ¿o*á 0aû¿b¿}(âÄm0ù×{'ÜýøÓOœCí* B@! P(þ~ åù$Ö$å§ÛP@²ÏiȯoÓÜ>ÙxyMç)ðŒï,^/€^OøEÐ~YõmúcrŸDŸçÏ3díR®r^1€7 j&M_Ïq²]MØ@3Ázö¬k=Úv#7J¥Ïµpêç®°"à'\»ë×Yp)Ž]ìŪչXd8&œ¹cßÂâ¿ÆÌÿÓéúGðèc3 ð$Çð ¯ñžËޱØÊz^(3ôþ6X±x:ÇùMïôwá<áMØÍ£0ÕS_|3_}óF¿Æ£1÷QXðî°ã40£iXioí6Øìa\ÿ-1æ°À©PwÅú¢1%íYqžÂÒÿë[£oKú6°}ίLÃ(ºÿÇ íõ+b8ÀÜMLQÁíéSÞÅv úØ #=ÍQØk:;gLAYî 'ÝŸp Þ tâ'ÎÕF³òbÐÇuxÈñ¢U"Um¬ôÙnBÞ(P·Þ1,£ðÔÃÑê5%Å¿þõoðÏ?úTsJ9õ¡Q4þ3bþ'Bʬøÿû?»ÚU( B@! Püý" í±Õ$ÊeÊHÌô]{ ]üõQܪÛ?C"'"³ôyòE /€ÓQ¿ÜcÀ÷y¹µB*äód¿ÜHÏÉyí®r} öG EývmdÁ`L áF2ºPŠ4²:@FÊŽ¶«W9ð:ºXýÛ{ë6.ÝŒ üÓyp°2ÑïcÚ,ÏîIŒôÔxîù§ñôsOãQ Oãi|ÙúÇ)<Mòÿ{øßbO¿¯á4lóuFAšJC\°Ën>ÓŽ/ÑèCÏ?Npÿ6IŸG¿÷8-àѰ¢ùÝ·à1 ">kl`³ô»œ,°ä|¿·={;áT+Ê£}PE *Ò-ÉažŽ* ×8àòæ¥ôÈÂ5V`ûêäGà@/ª×&ãâ®,Ž. Ã×E}ûž=ÿ$"Þ~ 94-ÜE ÷kâÈÀ][,¹ý{YIÑKà*[/úPGßZ?Å>Ji~¶-ûwBßÌú³ÍcÄЮ¿ãþ§àÎ}TÀÈ0¬å«Žñu&»ÈRËü6þò¯ãž¶ËW®{·ÚU( B@! Pü}# Õì«/cI}éy1òëÔ¶e¿ì ýú£\Jý¹]Ê8ͬ|!§ŽøS$8MÄ^DÒ~¢¯ýÇJá/¥ž !÷{I1 D¥|®åŒ^úEœ "LÐ lëBõQÍlµ~[· R ²Êôm\ Kþûh*x }:n~ºö³ Ñä±Kwþ×8¶ïõo< ±ïŒ wÞ~O>ý|òq<ûý¯1Þá9 xsv?w G°Çný{ذÖr6Üp\&ŸãQÏcÁkÏÂBõ7á0ömVŒ÷Icà3yŠAÒ±ÌÄë9ð+N{#?ÈG=lPàïê?4'àljz'£UÒûWÖd ¢@ý{áP€'ÎnIÃC+з-'í8í]° ðõgÏuGæ{Ù¢±ÛdNû¡³ŸX9Á) "vôPÇZ@Â/QG·ÿ»ßS]è®ã÷ ) ¹·.€ò@ PÑ˱ê5%Åñ)KŽìŸþáÄ_Èÿb°Ks×üÝöÈjW! P( B@!ðC@ÊN!ö$ÿ4ß+i£9¶Ý¿Êö`?z1I,Í/&©mÛ"Hæ¿_(eæ·æ~å4ñ« Ø JöçKT KÈv 08trN®ñì/綺ãºc9.Š2y@L %jÙPÏ ¶4°* F œ=Xœ~%ÇþÍÀ€WÃ[Ï> ÷_|SGÆŽ÷ÇàÍW^Ä,áóÚ<ÿÆ¿ò<Šœñ*\gLC®= ø¡*.õ1þ(ñ·ÃqG#ì¡)àJóYH7šy2Óÿ&ŒMòÿlÞãÞ +¿Çäà7e,¢gMá$¬¶4ÆV{3l·3Ãþçù» #ó|Qâø ŽŠ£3;]K($¢SúVŠjÕÁ8åütnÏÀíÃ+qk_*S|±cþ Æ!üœ×õÖ+È¢èpÂÕåö³Õ ~÷V\žØÁ NWèžA «fõ ".tÕBþ¯Üô š£H ¡ dÕDþNÔZþîŸN¿]Ãï¯ß¯ŽSpºxKµÿà a$€fb2Íý÷ûë·%ó?e¶Ò³ñéOþeØ;Õ®B@! P( BàïÊÙ7_,hÔG QÚN?bð^_*Ag~Yµ}!ø$l"hÙ{nWQßEßM">,€õ@5ÌÎ˶¬õ,áCAZö>§'ñrN¶E8óºë®hD0Ù¯»š#°r^¶uÁ¶Kl Éhf@;§:s3,2HÈç Œù:f~3ا?åúìÙýúKôò3õæ«21ÁVOöØ¢!1MêB\Qâi.°×Ù[L±Æ~V0²lhhj(?±F³¹ÎB×,ÓùXEò¿Îzv8Zà§zØâž#Nù;£Y})ÿ¯aTtçøçŠ gY" Xÿ4§£1# éa(ËA÷ö%øÀí=ÙšKÀgcl¶]SóÞÈ¢ëÿw[¹Yât?úÎC[#9A¡µó:ð_=ñׯúv:fëÀß!ýý¬©f5Èðš¡€N$Ð]_Mâ_I!I¢Õ&=7?ùûÿù?¡Š¯Ò/3æ.ÂTþÓçÂØÂ+ÖnÄOöóaïR» B@! P( D¥ÿEíH!@¶Iè Ø0k_,ÁýâþýRVtÀèì_¹=øù× ùIÐrÉÈKÈŸgVŸÙy}Ô±¿}ü²êBÈûuM(š¡š Ç$/ïíúA÷ãwBîIÂÏh¡@ËhÑlèýîwQßÚ0gG8Ï_Ë p%A·ø>ÌHü,/|ïMÌ£?ákÏcÖš5Çþöé{£<2¥ùah@œPækB_{Œßâ`M®Øàf 5Ü^ë`bö·«¬Í°ÞÞ»ÜípÈ×GÇü\µòÿÂ`zD°ÿâBM/q.$ý}«SIþãÐsiášM F5M+ÒÂPÉ6鞟+×' {(J á_jh®55ò9l1š[· ¯~DAä1»ænbEñŠQ/m[Å: =ã"zj÷;ÿ.n뢫>î¿S ï«€XPA? RN§PÀÝ0ÔÌåZÀäó1sŸ Ìlc'ðñ7¿ /ŸøbØ;Ô®B@! P( BàM ¹;ÍÞü3"º3$p²°tŸ$¯eùÅ$ó%Œ®TeüZö_*eýûC £ eÿ"ì?ï©ß®æ55Ý, ç¿nöK\d)9÷õQßË^~fðëhìWÛCrÚ¿_ß+¥ýýÙý>]f¿ ¿ %þúµõÚMç$¶ë7µžpã:n}KßûZÏ!d>ÖÅNðY8.ÓÇÃcMÞ}h gÌJ ïÃnÚD-2Â6/$ù ät€D F}ÍÑhñFmšªœÙà.ÖØdcÍæØâb m®¶ØîêHÒïý^Î8ìëãî8CCŸ`ËÊq~Åá>(cöÿŠ€ FE 2 íK"Ðɬ#ÉE?bÙ@ qi®lÏB×êXŽ0û_`ݱé3'"uöÈs·Bm/NÇ¢»¶>F£)Ò&Áï¥ß[=:~ϵt!ÛBµtÑÍ*þãü]ºÝÜfh×vríd_¿DÕ¬8©Šè$1 ÈšGJžç$%æç¿ø%ŸÿO?Ä÷ŸÿüÓÿcþ~ßþöwøüóÏ]©v B@! P(ÿxP@uÖ<ºøçÓl-ýÖ²2[@1 q}Ú $õ²ñx×b޲'¿DÛe<_&YÇJºóW÷°L¥úÕÌÈKÔ2C?8*ä<ËùuÁ^}ú®Õ=,àš>måv-£®@¯\§Ûnž,¢Û 4ùk€É_óÕëh%Ño!áoåÈ¿stûoc\žq€ÿ6º9°ÑùÑGèùÖ·QQ[$_?$¹;!DÝ#øÜçLãŽà4c"fNóp[0Ÿæ!ÅÆ |PJKñž$æçSq!%gcÑäy»bÖÙQ°Á7GìágöuÇ@/äx£0Ôä?eq¡(£ @yŽ?Ê£üPI 1Ñõñȵ99gÓX sI!4ôA{ÿOÇú U YQž²u .,@];:á»9ªy¿#Þ6Øåeâ gövCõºÕÌþ_¢9"«#{S÷EþñçXEø3sO_ÓN¢Nò®fñ/hQs¡]#öBîëX 2 èEmsºšmïàõºÐ:Q`@ ( ãUÀýÿ&)àþøš³ B@! P( À >gElö¡"€ì9 ô}È8pi{ó±¿ÉsYýëáä*Á²C¥XvžË!÷h9V«Àò£¥È=VÇ˱êd¥.NT`m^ÖªÆÆl*¬Å3ØVÔíE ØYÒÝeÍØUÚ=åØ[Ùý5-Ø_Ûà çµ8ÒØcÍí8ÑÒ]8Å)t?MÑ¡HªX1PNÒZAQ ò« HþëHþýoº~qMÌô7ßž·ÑÊÿs·?f|³·>ÆYÙþø[È/©@²7XikEódº!bfÐÅ&·\p«Åd¬ps¥A_£ÐH @,#œKyŒ+=íÉáh /ðwco¿ V[` nÎtúgÖ?}$þEQÌþû¡46eñÁ(£@ÿ(_ >PKr_ÇšóÓÖÚho4p[Öâwó\YJêØÐ pnyJ£±ÓÎvžHÃÀs¬8äµ{L§âޝzJN£ëö Ýd(IJ"L+0º.2ºX äœ%ÿº_ÓÞ~WÔÊ5ýD_»^OúyŒ¶BDû]t\àýž/Åmm-xRVoGEkzùÝ©×P0µ§P( B@! PÜâvä#pí¡þ88°ÄcAëk,ëúús+ hõA¬=5Ž5týQíº GxÍAnóøú#ZÊÊkCy¿ð G¹ñ¢6çzë1Älfl:ø'»õ8b¶qëQ$ì<]ºH܀ݧ(Tä#uoEB §±BÅýÈ>x ŽXzè)BÎÑbä/êSX_ µ 5ØpŠ[«±£Œ{ª°BÃúó8ÒÜmû"Ñà nvg~%W[ÄÚY!ÁÞIvHqŽG¬íí°ÉÛù~Ah GGB,ºÓãpWHŸ/IQ mÁšãHŸ<ùít¶ÒµÖlpŠ3Ny¢0ÂEÑ\)°×¿,1¥ "p ' èþ_éMüP7» f¥Á®Ú±r¶ r@EbsbQɶlúlC]Š/Z²= ÖÕñh_¶ì(sCæšÏNÅõÎt~òÎ_çxÄ«ú(\êEãÅ4ôtSèŠ "@۞ϚgÔñž.Ø ÀsBþE,4A@Dv ?£¶œMÙnàñzux®íNÈ>£ÇªÏÃåÛJþOY ÃQû B@! P( À= vû)¬Kè·Ã6ìë· ì¡ç²NGîÃIèC6ܹrOàŒÈcAŒ¿&PeDl9pØ,ÅÏ¡.±å8B)Hó\EmÍCä|'œ-Ñ[NS08ÈMýÛgœý"w!kôîbF b÷!ao1÷"u߀ï/FÆÁd°¢!çX1²×mC¢Ò\mìBÂïê4O7€0S¿D\t¥%º¹aW@BÑ.¶ôdÄ¡7= ÝÉ¡èMТYüÆTšçû:ÓÏë¬Ì±ÉÎÛé5 Àñ@Of@N`þéhfýÙË&ÊÇýàL3AG:á¯E,ß/rAI+ìØBà* "H@cnº6ÆSPp@¹ÿ8O hH @ßD>;ÂýÐrò.]ÿm³×zó*«$® ùZß@4]Ñ,ö{,Ï/Jб^Þ uýQßEÑí \E$šÕZtÂVMÀMP šÀkêÛ)P,šge¶Ò#@ª€â@Zúت¡^CPÀP<ÔB@! P( B@!pD"¡Â.Ä?`ÍÁ!1X@}ÄfðÍ'µëCy,UR- ×Fl9©]£BÙ$"iÕ€_;ÆsÜâ±°m'BB*«%(L±* t{>B·BÔÎÓÞuQ»Hø÷3³»ÇxD×¢Ãí8þ€}HÚ_ø=¥H>P äUH<PÃ5H=Z#µH>T ìÕXºyâ<}âjd7€yž Ë×9þ>ÈñõÆ7$ÙÛb«¶b·?I=ûò#ÃÐ+Yl `W|:ãÑåŠ`OTû:qÔ Ø-Ævl²µÆf;kl±·Ä^7Vx¡ Üy!¬ðGq û"i.Hò_á Œ@gõ¶ÃWsàXÁcÈ£'S(ôµÁqfÿýÑÀª& õ ØŽ,=ÐH 8¢çRquU<zr2P°b%öåaFöµ²-£ÛÏÔ1jÙŠQ§Åv®Ûk±£€N¥õlÛhÀÞ²F(mÆA¶p*oÁʳ8ZuÇ«[p²¶yõZª?üÆs(l>3,åÅgÛQFÿrVp2D¹ìs€q .zŽkzn©1Ãÿ)+`8"j_! P( B@! ž'ú !ìá$öz!@ÈŒlKÖ_H¿U®a¶>€\L²ûá$þr]¿ÆÌœüS²/k(}³ù¬aaK³õùSØÉ{³-!lGv}äîBfóóù§Ž5vÝv0ò)F,ÛbÙfk@Üþ"Äq;y_1Ò! kò3HÝ_BU+tž ©ÇëzqŒÙ§ê±lÇaD¹s yŒ³x»c¿/ø"ËÛi.N°ÂÇÛü°ËÃù<ß«KSpcY .¥Å ~þhavœ¥ý !^(€š°ÓÌk` ÖY`£µ v9Ûâš¿;É¿·&OÇÿcÌî×3ÿ=m°×Ù;mçÓÉßÝ-pÜÛäßÇ|q"åÿÉ8»<Ëâ)D£6#í«£Ñ¹*ó9}PèæPw£jårØy«èÙ°äP9²#s2ö ÂJ* ä H!ÎI;OhÌ5~élÇX²+{ØzÁÈ&öÙ{Oc)/Ûýºu×ålÑÈ=X «ùÜ/Äê# Xsä4Ö;õ'µØW-ùØR Mùåš É€z E@ CñP{ B@! P( À} y/³èÛ4/üšm§»dzGbžÊ±ôHÉÂó\¬ÓH<3ö$ùáÛòxqŸGVD ± ×EðŒ\E"MBÎ{Åì8žÌâo'çvâÞRíóbw@"NÈ<ûý£(ÄhÆ1IöYºÀ5×$q;Ä>$?Çâvf¿Tðù¹-ÇcIþ!ùp9($2D$5õX%*,9Uݬlðð¥Ñ)âÌ!>ÈöõDºdÿû=DXëâ8ÂkJœÑ®Ôô€1ëA?ÆåìD\_¢«äÀ=ŠX³p>rgcé|¬2-¶qÀË"+<ØàÊÕ Xö¿$ÿÝúùÚkÝY1àlœ.&¬0ÃA:úçùÛãËúOG{hÿüÊD\X³ËPÅQUÉ4LñCǶFû¡mµlq(åxÂ]Ëa3œVPÉ8Râ!miTbŒØ×Db°«P$ýdV`$ò÷#Bn¥èBÌS(ÎhâÏ%ó÷!k¶ÏüÞwâq]€îÌCÚ®SýTO£ß.òµ5iÇ «=ßäÌSJøÇüÞÕOP( B@! ø ~WÂHØ#a².$?-D>jÇiöÞóø!ÿ $í§I䥧` +¿g&Ç¢Yˬq<I|âþRfàYϲ|ÉòGJ¶^2ü±ZÙ>ûó·jeûñûËϬsü>r}MfïãIàI@3²\ÿòé< !i$ª²³=O».3Qzûù¹IûØÓŽ©G*xåÿýv¬iÇkÎRÿtþäÃ$»BüOÖ0jYÀ*ÃÅG¹1mMælMC@d2RlÏÞýt'{€Ó0Ùl!²Mçc3³ølÍPàn2'T²ß¿,2¥üAš`+@Íø®Ópï|\ 8c«¹Ï 4)È;+Læ`Ãbt"ñw§« XpYúcþ8êGòÏ,ÿ!ÿ$ý{Ṵ̈ÛÕ×[Q8°äAkä :¡#ϯHD×êTt®IEKn*Òq»ìæ£"Ð5~4 äÏRÄXëb¬ìe$ÿeXz¬YGk~žUgX1!Õ®Iü.(Œ$äO"¯d;ßi<E8® ÜOâ÷Äß d®üãù»ÇçïD D®|O/ùŸdm+GRù)YS¹F¡! ¿ |϶?éwüïùMJø{þvÕÏŠP( B@! ø õ@1"ÙwÈ̹dÖ£Iþ%"õYýmÌêÓl/A2»$ÙÉKKRE.eùRæAá@²ÿq$nIŒOâŸ"-;K'÷aæ7Gb/z9/Yä¥ZÆ>ïmÉæOŠ(ÂH š ±,EO xL¡@Ö8>\'Ä_#ýGªŽ5 %þÙ'ê~$eíKNÔjB!@"dzO5 +¯^[Ó)ÈþÒ3MXYÔØìµðµµ@Žù\ÄY-DŒ)RíÍ`m6]P£yõ!¢æLFÎ¢ÙØŽx>öÙc¯í"ä,0ëw°hô(8{ÙÆÓqÚÏcœqÀÚ[Mç`»µ)V"yæddÌÜE3Ù`ÞöZÀÉ`7¹3ÜØÛoÏq}VØÏlÿAo®ÞØã¹'IúÑõ_~^žªRCП2¹è^skP=Þ4,4ø[Ša?ó¶]Öµ^¬.çFñ?È=ÑÀhB6ñY~²¹Äg)±Yz¬J[°"Îï(µ¿¥"kº¿4~'é"Ÿ0d[V9._"Ek'Ð}=¹ÂÈßÙ ¿o²ê·e?çãYmͶçŸâßþ¿ýÛ)àoÿ;T?B@! P( Bà/B C7³ûX:ækAcœn!õ1Ìö'§IXàfàé±ÕÌǰÿ[ö¥ç>UÎS Hå~ ŸT°DA@Ì#YiMREÁ@JË32«Ìk(d0+¿D>æ|û+5S¿>üEÑÑ?þq;Xî¿«%¬àsÐÙ_H¿d¯Eç'åPøÌ|übì˶BüEXVجz ÕX}ðüÜÜágl°ÅsŸx EZlÀyð=ãÇÂyüûðü>¢gMÂ2¬ aò{°|é9|øÔxëÑG0æ±G`þʳH=°ËÌ»,°ÏÑ}üXndÄé°`<²LåTsq£ùÙ¯_ÇÑQ^8âkÌö€ "Àw3×ÿp¶°üÿLÓBÑ Ö¬h_³«Sв: QØížÑ°ÐcðÅÓôX¹ï(ròkWeÇjE(ñ58Id±BÈ¿^H¥þ"¶çL®BüS)Ìù_BqFÎId,Ç2Veä²Ò`«0ñ~Kù}ÈÍûæòó$äìËqL~_Yüþdûiÿý»ø[ù %ü|Sê9 B@! P(|þÅÿCúm飯 /#á.aÐEd;F7·e^˺C) °Ž;ÝP|3»Äêpd¶>íA2!BÀn¯úÈ}ö°Äwï%œø5Zéçbi:Î{Fóý *¹¯&Yç³È3ñsÅÁ?ïI¡(ÈýTqóçv2[RxœújŽRvN!úBú¥@BÚøgJ%>ûɬ<V ¬ÇªüF$d,+ËûýIìMi±a&óà={<fN ãä 0ykÌß~ßcºÐif yÞÄÏÈYS5c"Çœ ÷_ÃY°ÕG\¬qÔÍ=8ÐÝm±Uiœp:¶Óé?/m©o`û@9Íýò#ܱ"À/ú01³âÄVO'øÑõ?mÌþw¬HB[ÎIÁ éšÉGi7*c|QÌ8l÷BxXV-ÄrV=,ͧ¢eýŽì¿BúÅ0øIHæð*UBΜ|!ü²-Yôúã"äðûXNÜe¢/Ä>"lË1ðŸBúe{pÈýò»ÿ þÅüu=þºŸõ4 B@! P( ¿jŸ`@ÛÓ¶CúöãHÙzqé;c K÷²ç>c7Ëÿy.fÛQ¶e&ÿ8KóiöFRÀ3úI$rRæ'¥þÜO`F?E_ŒTà'K¶%üì7Hæ¹$F1éÓ»úKi¿T DÑt0}ßZË%$öY$îR!À÷ŰT\²ýY!Eœ@ TÒT^#_ŸT$å¶ÿ%$»rN8ÀLöñjúÔ »àVî= 7[+xÏFñ,DÏGð¢¹ð3 ~4ï5Yï¹³aÿáÆXXy.ãÞFÈôqHû!VQ0Øéll X3V²Ì Nx:â øxØá7Ë÷}ì±×Û[]c` !¶Q8IS¿ÌT¥¢ãýJHòO:ãd NØs4 Dz ä^ gsâÐ)mÌþwlÌ@×Ölz$ çëÐ Æ$IÂò¥ØWgZXPåùlÈoÖ2ÿËØ6±BÚ"Ñà d_*d;±/ÙYE1@öE}!üBðeHß!Vá`0á×o0 œïÏoVSÿ1QÀpDÔŸB@! P( B@!pOŸøüsä.ÏFæTä,]L¬ZIsžÜÄå {y.2s#ce.RV,Cƺ5ÈX³ é«7áÿ³÷ÖQ^çöø¿µŸ÷¶·m<!»Ì#£Àž»»»»;NA$!!!îî.µ4õö¶Iz+û·÷!ù@È9kœëø{ÞóÝûyý6w±t£Ž¥íý(nëAi{/*ºÒžv6¢¬s˵lj6¢¢k-ÊXJ9]Ò¿ÝkQÒ·9mÈiB^Ï&2Ý\ ÓɯÝ*óÕnÝÏžtºoÚ-ךHnÜE@J? H±^D6AeÅýjKÃÏ"e`B!Ç cPHCRCšc źҟl÷a4lÞäx°C³-ÒW:!Þe"é²èêTOWÎ;#`Ñ|8N¹öW^ç+/ûeç!pêe(d£/SýѺßâåîÆí¯ñ2JÿjùQ0p8Äëšîßâ ®@w£tèXå¯ehó·Ç®Ìp`*¿Ýð{T2#°;%×Ó7=¶Çúc²£p;=îûeî¬HÇ=õì®ÀÝõ¹#Á-ÙÑž»!¹Øâ<4ìFÝ;Q¥;n<!ð+IH@DÂØYÊžŸ$4JØeË:¯ýn#à_@B@ràÀeŒVù/bXH üÐXûMP1<H4l7 ¯=Ç&ðµ.1=`öÙf=`öÙf=`öÀh= ³)7 ÍTo-ECN$8]úüXT|VçF£®è5Z_Úü$Ô$qY*²cPÚÂd®ObID]Q JRYÒž] ꯩñʲž]*jX*JÓQÊíÊKÒYÒLg¢®Šµµš©-Geu)j*ÑÐZÚæZT7š*AYmʹŸ°²¹å(ªGIC3ÊÚQÖÒ ª®TôhéDAs;É>·v¡ºoµÃÛòo3J{Ö£¬wª¶¢zðæªßC+ô^43O}uU ÷OáŒt_Ä»9 ÎÅq$b]ê`ÏyÓawõ%°»âBcÙ%?7œ©î_â²Õîšgg4ù¹¢d@55ÚÐI÷ÿî_4û»¡Ñßí!+Ñä`/š÷XLïÃàÆü8ÜÀë3±#q v&bWr É`j0þ×åÖ¢DCàê,ÜGûZèÐ] ;êrRrä»*²pMN *2²QAÂ¥rã~ZûoGý®»Q¶UÙèþOÀ/÷ÿ¯vö2Z⫞ŒëK ÎØ¹\Öü"i:1@?³Axa\j8dQH²a"_~7$eÕAäM§KIÆuL( SHb§c¥Ü~épìslÇö9oöÙf=`öÙf=`öÙ£ö$' »0 ëªÑ]Ò8W'£§$}eqFé-EYŒQŽŠªÐ_Ï}¢ý;wŸë+¹Œ4œÅ±¬+ý%ñ\Ëù8t2/}'ÕQ6î×^.ÖÑÆpŽth"šm&ÙÐ\Êì0š§;|u>c×ó¹®,Ù %jIT4Ä¡ëêI6(JEmIªK3PY Åé(ÎKDqAÊsQYVH"¥.瞺dCU5J++QSWƲÄx9!%ÃÏ 9b#ØÎ¡ËláO=·á9g*ܰdÂXLÀ 6sIlùô(t²A u*=QçãjÕÔÈ£v@®Ó"Ôø;£3Ô=9îZMâÀÃ[ç¿~fK$ ÕLèë(ž×§âF4·Æã {k³qš©;+HTâf\Áø-÷Ð;à6z lÍGuZ:r+ë ²éi±^º Ô] (/aÈ Ü¹LaE#äcDÿDÈú_ N¿RÑøR#ÖÿyTÐÓ¢cú" Üp{f(ÞÒ¡š áRÂé"h\µa/j7Q'" [nD œ<j7_ÊõÔ `ZÂkohÔûøûºÂ$Ÿ¯WÞ<o³Ì0{Àì³Ì0{Àì³N¢DVôŒkÜÖìôHtD 57D@1¿¶&Åï.F{~žþ74d`}}:ÖÕŠBË*0Tdô×Ö€bž*}$x¬u5i$éÐI¢@¥äà ×U§ ÄC7I^*ý\Ö[Iåz=$:¹¬ÛwpÜReŽ¥3/}%è-e ÃÐDbóÜ']$.Zxí%ôp(F3IqÆXÓ$:š¢ßÂRG æ¥ù;"ÙËi>nÌ `5ý~óg³ÌßÜYð13&Ásæ$Ø]~!æÿØ_úÏÛyȰŽ%³Qà²ù,t²%à*fšd)u]Ìel;Ù+¡ÒÇ-.èdÀÚHt8 ÿ[èê¿;%{@ _$ÀÞ0Ãú/÷þÉkpKa,n-IÂíix°œ»*qo[ TŠc'=9n¥×Æ¡\ÜYœEéšINFC9:®»õô(dÜ~Ýøó)âG Be,&ø/Š®B®,ötÑ/ q©ŒX$Ÿ(ý}A) òË æ+7í§U'Ãv0\ÞkéEпÅ,EÌ QصUûPÆrµ þ ¢R^ܶ Ií$èU0Œ[oœï$îðs{8·¯¯yvf=`öÙf=`öÙfÖ°¶:ͰÚËrßG?Ax/òmŽÈ˺/ð//R@ËD4gã.Zò{¹mÇ]\×îßÎ}ä»ê»X§ÀŸ<ò{ôKx,ztó<vÁ{_=Êå- (z$Ò#!û«(¹®(âHÛðûÊâKØJî_Kïht³="Úy^ýòfà|k~ºykkÓHL€±Î IÆx€!CYXÛRÖr$ ÉÛ tåYºŸófìO%èg:n¯ÓÂkú$žLŒ/ø^ô?ð§ `ÃâæMA²ÍL€Ù1#À9 "³d/_t &. ž%Ób?óPîiúË1áúœkV`8¢q«èöLet@IDATõÃ.jÜHqÀœØAb ;bž Zw7çãÖºÜÑ\ʱUCšÏÃ!j¬ÈÆ`~ê««Ð2Ž-ë®ehÄfTSø±ká[&q j*ÑŽa'êÖmGéàfò(ÞJ+þ6c\ÆÐ"ê5šnC÷«b]öií¯€%¿:eëiɧ&C ú¥Žä^GOoµ{PI² ÂúOñþû¯¥AÕVê Ð |Ó^f|Ø-ŠÀ×}øZÌ0{Àì³Ì0{Àì³Ì0{`Žøç?ÿÚÃúßU!ZÍE_À_®ÿ*òÐø¥ßâ ù.ηq}3A7÷ ÐC>À:ú °»Ih¹Æœôh#1ÐEðßSÆÐþ"ÜNûµF õõWpzŽç þIt²t!ØÞÎÒDþ$Žà·WÆ£$AU":èqÐ-OòDtËËÓyhcÂpCÖ5æb}K>ê³0Tz*ŽñÜ»«ÒÑßP$dú ÚÙVÿð5 e*ÜŠMóä«°bâžNŒ³gÀË<¯ºW]0$. ä3¶x6§§!~ÁT€Ð ËÀé<Ä1c@ °9±p B\xÛiÈr"ŠlöYjëéîß·ÊÉ ®cìÿÖfó§Õ?Ðpÿp#à vŠaG:S'à`mnf¹ç&`;×ÝFïûà[+3°œ4ÅÉÑHOKD^n62ÓŽÌT£dåf"'ër³N§çe!³0ÇÎ-.BAi9 ÊÊSTâH¡® emœšìèGaCQJ[{QÕ=êÞu(iïCeÿ:³€Õµ Â¥CQ¹vj×nçºh!ñаñZÔ±4oÝM}ëpím÷voÀ÷öÒ¹ÿ׿þ Ï>û}>Fá6J3cf|= {ì³Ï>ó~ü÷«î]sønõÀ_|1öû×ÿïÿÇwëÄÌÖ=`öÙg°DlhÈ2¬þ#Àèè'õö Yÿ èhM9 "bÀXO°ÞOÐ-+ûP]*ú8=@ýÚt4e²dùNn/kü@m :¹ÏÃú8ßWC=ëëâ±5î& B`°:Õð©KGü]ôÐqD"j?û^ûnýÖ3 B)5 JxhÜÅ"2BºýŽþwóÜë3±¡%@Š1=̶ôW±MÕ<l+¹¡þ`Ÿ×¬Ép¡â¿ÛtZþ§O+]ÿÝf\ !óæ váBü7±f#eád,ôE³?w2¢fMDÌÜ)Fæ|øÌ«°zÒ%p»ìÇpðCxN>Ás&°$ Š¢Ôi)ž©þzü°!*ëÃ= \ËŽ»)x&0âK ·2ÀÁÆ<ÜÒ=$P¶§âj(ÜGRàzÜK`_yêSÃÒp'Fq¢? 8Î!ÁKí|CãØdÇ®F6œrÖp|d:+f²b°€F¬BÓ&BZt0ÒbèA¶)Æ|bd ãÚÄp& À;ÂkÃ@ÈÄü4de$D^vrI6dæ`(AvA>F6m:OÊÙyh8;¯Ë9ݪ_}úk,qpÇ Ë¥+ðâ˯Ó}aÜïg{slìOx/ê^uöòǧ¿þõo°Ùqõ@XtÛ»ðúêúï¿éqÕknlöÙf|{ÀðšÏ`@ ¶·qüš¿¬ó*U©ŽÓ*Î8ý.íAuìÓ¢/+ÿŠÖÆÖGÐÝ>Á(Ýö"z«(þG`$ÀÚæL£ô\wÒ¿ûuÒZßÍùÎ÷ÖL`œœõÃõÙè$ ªÓ±µœÃ²Î³ "šA 2A®ýôXh#Àíà~ÜŸjc u\µ¡mê`È@ÏG¿ÄÁÏ¥»Rõüg±^µÇØ@ËùÖrÖæ¡4&QÝ÷¡Ußiâ¥XvõÅp~% «H\«/ ëåÀûÊ˰fÊ$úÉð¹l|/¹þX.»Ÿ¿ ±\ ¿Ë/6÷%çq»áËyG ,œäðrVM»Ñó®F¶ãlf°Cßjôú9a=³¬X¡W\ŒÚHžãë3ðà~³8l0 ÅoªÎÄ û7гcKÚjŠÆíôxçúp[!î©Ëd@FšwP ²ŽT1£@%ë+ehAIJ JSPH YJB`)Å(IZ r®/iänø5Ü'ù$ rcM"AcQŸ [ WOÌg»lçaãØû,¯=ü¹>!.1¡H àÄPoÄz` £þûüš÷ÜMàžÝb.ü&{à_}vNXŽÌùe¶ÍrŒðÒËßdS̺ÍÀ3ÏŸéólOx/ê^µw]_}ú©Ùcß± Ã|[Ç^_]ÿœ7øÙ\³Ì0{àÌõm W,|"FêÒ²ñðrÑ_G+òp]AtPÅcKŸ Ok¿öæö<kyúAÖ#"`^QÀõ÷ßÔÁ4|s.ëª _1CH5Šs¹ÈtÅ/ÃØ¿ÀzõAøµÔX@~}S¶Øµ~w}S> ŠÇ¶Qmoï"øí!ARasg)§3Ø6z@,÷<è©äù7aS{9BÇ JþÞ³'Ãîýó.úŠ÷ÿ0óübîÿ9?þæ³ÌûÁÿÃÂþ7lø#Øþ×°ì?û ç!hâ5 6P`¿ K¿Ì%NKQ·ÒõLŒt.ŒŠ\{zž^}>f_ô³QŸr1:]ÐáçáP/l€àH¶Óò¿7-{Óðnÿ»HÜÄÿÝÙÑØ[̰³, {HlIY }9ž·"÷óÜžÉÝž¡Žþ¥ø£,9ùñ«íG ¹ŽüRx°u$ªxt!(gXAY*Á §ÓùM±ŠUö+böמyiÁpef+f]ó§_KçMÄLûžrîål73]æaÛBDø"==yÁÈÀEï œMgîA9Klgé 9eçòÕýîI|÷®ÙxZlãé-s[³Ì0{Àº0L×¹ñKœ_\û×߬#ôØ$7y вŸ¥-³±Vx¹àKø¯ûiZÛ(D@®öëX¯cv¹íå£ÉuÆXVùv ÷ €wRŽouÈ5¿ÖøAtCæ§O«œÀë6BH4ìè+ÃÖÎ"ÖMàÏö1\@û°0H¶AÀ¿ç&`#ÏÃð. Á°¡ûÑŸ^Ã9ØØQÝ¥\B¬k* ±Q¬8Äy8ÀgîT,»ü|Ì9ÿ¿1í'ÿ %W]ÓàÅlÓš0Ù&Mÿ9 #o<œÑîë.ßèñ÷d<¿FhÙÞÍÑ«±.ýuŸËžt*|Š_ÿ9W Ôf2f Ðkjý£ÞÏA®ôÆ&;hù§å}ó; Ô÷dÑ ?»rcq ý)$âhý¢0`8n/IÀ¡*f è}yu¬ËÅõhKBuf4Ó'Æ1"S.fD^^`Ÿ./¬¿à¿*+õLÑXÃŽÕ,eÌ@ p/«¿¶/ŠH¡þJŠ,ÔŒJ6 yLYèâŸ3MÅs®Æ9à ò+0ÏaæôÌ~í0n{_Éú ò Þú»©¿G[À÷èb-§jgË0Û¡0 sû>0 sûúggöÙgŠD8ôKÔOqþR÷! PÅøÓ5_óœòRß×t;ÿښЯ"a@Ëzí¯éTÔ' WHµ$ðû8?Äø=ÜNó*rÏá>ZÖO¢auŽØolÍ#à'!Àõ"ÀPõ'ÁÐCÀ. ²}c÷æñHh^¡Z§øÿa kò xBCÔ@¢ÇÃHK6œ¹^ËrO&ëD_g¬² Ç«/ÝÀyÆtX$g€»z ÍÉ9.(r÷A«Ê<Qëâ O¬Àú5ØèÍßœ [#üq íÜ`gô:¢ÖÏÉöÓ²ð*.×y(ð^,¹Ì0ÞKÑà.fØNPŒn÷{ÒÂp Á÷î¬(ÿl!èÞ]ÿ×fàZÜLëÿ$î!Aò Ïë0 C$@gâŠÂ\[Fj3œ`Å«X@œÀ¿ŠËxrY÷éqPcµy±šË1 ZG[ÿµöQQ=ò pd:ÙñÈ`v äØ5¢WCõâhÝO@4û$(ÄAÁî rC-ÿÚ÷WÁ*tÕä,>ªIÅç\mI«Wö»y^&ðÝŒnÖ¶Ú$¬í)s;³Ì0{Àúî5Ž¢÷Ð/«¿Åú¯pÍïS*Ÿ^®ë*GG~1îfZœŠÌ NÓ}±ÿ-LšéNÅäçq{ï)ãó;HtpJ§2·2SÆZ&Aóœè Fê@y (Ä Iäa ²`_ _EËÖ, ×ryà·1;@N þi¹¬ÿëé 펌íé#ÐG· 4RPc*L¡e#XÇ4zm%©õ^Šðó~ÜY|æ3ÅÓrdºž"ÝÁêþNȵ_å+PhçÒåšvtB«+úüV²ž¢ÇÇ«±àv=þæ×ÑÅ]š'ZýíQè:q¶:ÿrd® àeL·ÈpËu6(÷°¥.À2lÀvZÜwocÀ5oJá4õ ø×1FCÌJì÷ǹÑtÿOÁÝ$äþÿpk FÀCe8«r0G@ÆôäçÄà]|eýÜ@ÜÓC Ç.M@Ù`ßâ- Ë¿¿8àzS]ÕOšÏI@Y=(ú'ò@ë èÅPÂq bÍKOuŠÐû©.<óVëoìïÉ&ð=¹ÐgÓiÀÙt5̶À¹}À¹}}ͳ3{Àì3ÓòØÔc€øSŽ,)ÿ þ;òBÑl5ÝI _E©Ûé-ÐCB 3? S*AeP6ÖzpzX¬[òhÉ A;ëµùÐL"A$@+Áz),@â-Lù×Ìùvz((\@ãVÖÓEaÞ 5«ÑbÌôêX~$h-FMV( ¢ ÖñjŽð=¶säB¿<Ht§#-h%ŒçO÷)ðe(ÿ¶ån·ÁfÁÚDø0Þ5 §NBàTZò§] $éÈŽ»Y(Y:õn6hc¿îUèâÁ5hóuD¥ûbZûg"uù4äÈs]DÈr^§ù(åú&îÓ¹[éN¿#'×Püo{~<¶fÇa3üPêôEybsöÄùá.;TB4<DðÿE#±qš(7Rüï6z\WFîªLt7°ŸÆÂDÃý_@]Aª¹¬<¡\^N0_E²¡À\à^zPšWØÅ3@ÓuôÐDRaY1÷ùdByN$JY ,Õ¿4¬WEËSC¡·ñÌ<$gñQMà,Ÿ8çjÓLà\œ²ßÍó2 ïæu³¶Õ&`mOÛ=`öÙÖ÷<vv`"~÷MkPìgXû7ÐÞC«ºAv/Õô¢öµJeüJÿ!hÎ$ø$ïu_Ö{÷!Yâ ÆUË6ªKu·fõXÓÆzz²í&pï*@?AœH#Üà_: 3"Ð×X€H hZBÿŒ6R¯@á [šË$èódD¬o!ñA¡Ãæ|z"°ÞfÄêÓÐÉcÚÓ« õ¶i€þóy5MC0 ûmgÃánS/í%ÿ%ýÔ XqÕEpŸâ|8_þcLùILŠÀL;ϧ.ÀbôZC÷'ޝŽG; þéPà<ùrÿw_BÅšŠÛ!ãæ)WÁù&¿eètÆFâk®÷TgcAùfºçSÅÀs®å9îOŠÅï§.ÀL ø(£öÁÓ%ž.ÿ{©Ì üÆ*E0l û3Œ ¢ETùÏçtÅûÆËhñ/%¯ÌE ÷Å,"Ê>PÌøj(@A·Ér i 59±šÍ3ŒªI^Ô1 ¡ÄjâÀzPL¯Õ£RHÝ]{¿±¿'[À÷äBM§igÓÕ0Ûbçö=`çöõ5ÏÎì³ÎLÈ à¹@\ \@^^Ó[³°}}ŽÄ×§ú@œÖxž H^GEyXöÑ2ÍÇz|µMM=hÑ'ÀV=]GÆ"ŽLëD@X<êÓü b@mÑ:í/â¡^:õé«jjx¬g¬¿ÂH\ȳ@Úò2('1QF |ÄÛœ ú;u ¥ûÖPwû6Qè°:-ÝôXð'ù Pò<è®àù'!Èi1VL¯yS0¡Ëç¯ÙWcÅdjìÛMø ì©à6eÜ'^×+ÎcZ¿Ëœp 튡ÖüR× š% ï @¿ºIŽy/GÃZiݯõ_F-(÷±CÅöKœ ÓUÞvhð[ŠìñE/÷:ðzŽGRs ÌâœûïK÷/ìOñÇAzbrñÅ 'ðLw9ö$àZŠÜ;@/ IØ_ɬ Ì*èìodÐË 'ÆßHßOáÁì(.£`a Ã2(êÆéü* AÈY 0odsY&Uü€ôGÅÿ$HR@Ë Ë š o-/à2K¬¿<€ áÀm«ýr¢}±m°íÌ<$gñQMà,Ÿ8çjÓLà\œ²ßÍó2 ïæu³¶Õ&`mOÛ=`öÙÖ÷À?ÿÁ,ŽšhL_ ¬@ÀojH7óº?ÀÕ^€@?Á²@ºô[B4®J êœ4@ü]õeõ×1öuÓž,ÆÝšOÛб,Ã6 óD¹Ëºé] }KhASV×~šLô1ŸB $LØF/m+-kf»:u@@;ehd(CmF8àðïQ ó#¹1XOÒddÜz-ß%sž|BXíæÂwþTxÎ" 0é8ÒòïÄâ>éRxMºW^?¡Lë°h 2ÏBÑšf@çtÒâßGàßìþp/tR¯%È «H8 Êo9ê8-ð_N €@MÀ2ŽFž£=anhôD}ö±'1@}HwlõÄ®Ü[)ìwS>ÊO3íáãíEx$ÀšX¿jöÑbn+ÎÀÞª<öW, bÖp¯2}>Åù²#<ã(w{}ºòK ¿¹ÜŠ^ $$ݹ¿ìÞüòþ?Ô8D!ë$(2@EËä @Û§ P3¡Êúû{²¥I|O.ôÙt¿üäW6w1fÌ·=a¹zæ<÷ÂgSÓͶ=`çàE=êLàšÎ0'Í0{ÀìÓÔ"+:ÝóèæeͯNô6@»ÀŸ,ðØå_Û ŒèÀÔžk¬mŽ\óZ§úŽöQœ %š {ºH _Ûi¹¶I ít\m#¢Aëëè9 ±@Y÷eÍÀu_¿×¢% oy ($@Þ" ÒÈlLXZÔè FA»4žôþUDhÜUÎyv§!Ì} /Dór;Ú!Âa Â/Bà¹ð9$SNŒÄ Œ'OÀjæºb;)¶3PÌý«ií¯ó^fйk_E÷ÿÕ.èöD'-ëso'ÐmrG= :ºÿW$(öŽA.Å<¡Ôßu!+Ðá@{T¯YÚ¥èøöÂkâŒq]/=q[A,CÒðHco-2û°6B®ØEOøPìÊNÇ}xàÀØ·m#Ëó¹é«J¬(7ŸùŸ(§:?Ed¹WŸøºé£îü9ôLвRø ð+}y×:ËÊÇi©ìÿLfHó2m±Ò$óÌÀq:Å\ôÍöÀÿýýïxã·ñæåõ7ßÂ_?ûìmYû÷ŸLàÜŸLàÜŸŸæÙ=`öÀéDzØË/°-°¯iwÍË/@_ÓøµÉŸÈhWl¿ ¬k?yž×Ž«X¬ÿ²ðkœÀŸBô+é²n!Ž\Dê'B/Áx7#@¯"@Ë:" 4/AC:¿uõ«M[ NÖœŸ9~Š2T}å>€-Ó*@¢µòBàyKd°³4áÉ &š F§#ÂÜV ÖÃá$"lœbIùXc3avóÆÑ$8²t>²¡ÈÕõ®öΚóqDxCÀ Ô0;@;Ií¶ Ž®ævŸöh^ãZjTÐ ÏsÒ]æ Ûs WÚ Økª|Óò¿¡ËËÿ&ºÿo#@¿&îò ØKàVŠŒ·<ë²ñœp³ô°~i¬òÇìdܵi+Þ|úEŒ÷ÎGxç÷ñäÓOaddŹZ³Iæ©aHc@S÷åF{{Ô3ÍKyÃ>X y +ÒcªûSÌOE _à_Óò U_ ^óµÔøÏ"Q Ë¿Š ùzXBò¹ßÚ3óÅG5 ³øâM3{ÀìoŸLàïã3y8œoÛì³ÎÕ À,@/.ë»ÀŒäkHVZÌeußâª/ÞN ®íäª/À¯mìµ÷hkÖmajÁlë/ÁœmwDàH@ç%þ· J?(ÁöüPÃ_ _ÂK?Û#7ÿ.zþÕñXûýtãøßÐa€!¬f,ŒíÓúKµE©iù®Ë áÚ±Èý¿Çhc¿ŽP p°6mô`šÊ öG°3âVº°Cè²Åô 'À2¥ïdTÌKQæí ogyÐ3@CªŒpE7n;ãð9Ýà®Po+uµôh @=uÊ|"®sK" Ä{1ÊœmPG %ÀúöLûçÿOôÃðŽÒß@1¿;(x û(øPCè(Æ]e©èô¢ÉÄÜŒy=îeŒðÆOñÜ[ã w>ÆËïg_{ ÷?t7ìÝÎFä$E"%ÂÙãy ï÷%)Bÿ|N3ý`I²ÂæiÍW|¿âÿ-qüý·u/Ž~J'(åí_M±Am¯°M}ÍçêcxÒçe'Ýuæf=p.ôIWqôs0 ÑûÆ\cöÙflüY¶¶æ]^²žË¢//¥ùë/£e>Vúp.OÀºªd4Š®Â -ã]yŽÒ³ËMŸ*ïI~ó!ƶÚ^ÓïS*ÀZìë Î[híïL ²<z¯±÷ëªSÐN _ÊläÍôh$ ÑA`_MB¢_®øV¿,üórñ ÏwŠr=CþYw+ãýeÉW1Äüx.5\×Î ü)ŽÐÅù6j(CÏkçÑCB!Ûø×$ 4Áõyô4`ªx>å]åoWÄž;#ÊÙ1+ì¹Ë"ñöálOgZéœPåãÉø}WTûѲÏq£Ýþý18LØä ŸpzU¬qEÏ2ä3å_K%Ãò©â8iÎsp6I PÃq몥uƺüoO\ í «°e7Aói!8[KhõOÃáÚžiþ<ìQŸÚû¶lÆÓÏ¿G^xyx>ý&{þmŒBo÷~ö >üù'WÀ]wÞÎÖ&ÔV¡©ŠõÅYý µÞÂ}«@àN¯ê(¶_ßâö/« ÛTI¡Ázä$(в9œ*Ê öuÛKüOªÿÚÏ¢ PtztÕìm~Îîgßâ¥ýÓÿ÷ÞÿÀkü§ñð£ã±'ÄsÏ¿·ßy¿ÿýŸÅÖÿú׿ðé¯cûù_ÆãOiÚ¥éç^x oŸý~ýß~«í:Sßüö·xçÝ÷ðÂK¯àégÇ£?ÉŸÂ8Çg/¿ú:>üø§øË_þz:=f]1ŒAÇ}åµ7ðô3ÏízèÇñÈcOà)ο¢v}ô1þü¿ÿ;f]gjßüöwÆýóÌs/ð^~Êž§Õ¿ºwÞy÷}è?ÛÓI|ñÅxÿð§'Ÿ|t=á}÷ÆoÏÛ·Ù¿ûýïwÎ/¿J·Œg{Ëriþ%.ï$=#ßÖðùç_à¿üýññKý€ié~(Dèj üío;åfNà_ý MÒ{DíµŒ+_|ù|ðáGø;ÃÎAáW?ýÙÏŒŸzo>þåwë)<ÿå÷A.ÿ÷ÿwÖöÿþï_ð>¯ÉÑß¶GønÒ;_ßµßòÝu¶ ¿àsñÚo~õ¬y&1ŸQÿôgø-®ßæð?þïŸ÷>t?ñÔ3_œ?ô®×;ÿµ×ßÄÏ~þs|öÙçßf³Ìc%= *ªÆGRH`{à\)ûäÐC ÝYÀXxø.êwv£37U3oÏ5@ŒüC5ŽØçPà`]ó, îq ªñ·ä7ž7t€}ž&uLSWOPFEøD_#Í_/ò]=š¡·@ÙÀ~G_©AÔÐ/ \^ PôÝúë± ! åôfŽJÐHBa€Inþéè`(D©íû&zuP «!ôhÊŠ7AÊxŒb!Úf"ZžS(îîÐËàé4o$¬pDÌr;Ä,]êd¹,G'üIº:0*W:¡ÑB,Ý!$6¢)ŠEÏ_Wt¬ñÄP,§ vèòån4ùÈb4Hà2ErÿÇ|Ô`üÿ@+Sÿùa'ÁônþÝŽÊïæôþÔ`Ü[ÙWwU&áPYîf]ÌÌnØÖÜ ÿ ÜýèkžíWpÇá×p÷ïàÙ×?Æ×ßÿ)^÷CŒöÖ{xûœð_þ }ô^zé<|ÿœh«)AF,|³5ä0CD30€±ÿ §å^à¿)ëiíodê?iš0»@nà 9ÀÇ € ò Ù$þO¡ByäqÛ-ý-gÉSsö4Ã$ÆžUuÍhlí:nihéÀŸoÆ?ÿù¯Qkzù×Ð7<øÔ,x¯ Á7̱YéÁœhÛ»ÂÝw bÒQÛÔ{î{pÔºNÇ_} 6_²*Ç&ÃÝg ìÝ6Yùæ.¶7Úéæ³q)ܶ[¶_güŽjþø§?Aý6ZZ«/ôÓs2ÀÅí;W\šTxúbé O,Zº³.ÅvÐ9ªïÜŒáÌ<Ô4¶áÛîÄïŸ!2æóÏ?Çœ÷=¶®>€eÇutóÁBµ÷Âôy¶¹`)Ú9íò@Rz.;pówðGëÔ5n>xû ïiõÿ nµÛÿ áÁAu}"ãSûÇf¹ËW÷ŽÎC÷žR³ÑÙ;`üDZá^q:Âu[ÕaXêäaÜ_zÆgò^³Yæ¯Dðy«æûäC÷c`ñg?ÿö컥õNLÃÊ,söÂ|[G£-{LóZŸ2 ØxFÊ«pÝîœ)uº/É_ÿúW<pøŽòŸÏ`GƳ?ü±Ï¥]ºïçóŸ×œãºrB£_Ο!<öäS' 2OøÓþý7ÝÒªzF'Àí^Äë©öêúε±Ç2Ÿ[|Ã]PÍ[¯åÎ'§»¿úþò¿ðûs?Z:zSÕ¡1pt×ûÉïMŸŸnÕ÷Ë×ÉÍ{B¢âyÞ¥è\gÅSièÛ$ Oôœç{pÇ®œ'$Þ$Ñ64²i9ðY;'wãYÔ·m&ßýzç»y¯Fß]UuMžã®{OZkFOWïZ;û=S{»xÿêmøÃþh<¯EåÕÆs±ÂÓïšgÂÎvpõƪàHäcÛµ;OXßhDZv¹H.ýÓTÕ7ÿ,z?èþ·Äá«÷ÇìEË¡wþ ?¬ 1Ÿem]ýxäñ'ðŠ3ïG( àH]¯X|ÅÞ+>_ÓõJ·G°ÜCk{+çåf¿¥%Vûp¡ŽG`=|kVZ9?RK«;·[Ÿ¶í#Ø_3ŽDû$â×Fÿl©ŸÙBNón/ïÁ¯ V@+1>Ã^uãWü¿Œ66ea®þ" "2@$öÓŽ¬ÿíô"šgœj_Aq=C êrig8J¿ <ï¶wú«Ru)Xßµ-y®C|;"=N QËé@Mųè0iN6HY>9ζÈw[J2@)ýþW»£ÙßmLQÈRïïª.è E[ôjP ÓÛYL÷ï<uN£WÁL€ž².¯ÅôX|N»Í§N- åèu£62&ÿ:ÿ]þ{ÂoÌÀMäyîþ0¥á<žÕihÆ+ÏŸÇ}î}7ÞùÜù"n{ð5<úüÇ,ïá¶ûÄ¡ÇÃoŒw>ø9ÞzÿgxííXÞÇï~W_/Ÿð,¶mêG9ÅIøe?~ ü,±ÿöqšúÒ@À?â)v(õâ±\þ%š},F@oÓ÷ã¡ÇYÀuëíwá²31mÞã©sÀã1ó²~ö3>ÜÆO.>ô]À\>ýDj¬y- ,ð²Ó9|üñÏÐÞÝþHèØÁú;¶MÿÙ.GÌ6È ;þ8¹!0yZù/«ÀɲMcsÜþ<º¯>ß°Öç8ò°q v Hè§O?+s\ÀþÖÏìÑçšk#2@ÄÀ~jâS2 öáo_ºRí×ýqÇ]÷ #§ÈøùTêgTÇÕñuXî KÛnÚæäÎô)Y8pË$þ9nùmËd&L=jÿëMü},3Ñc¡ŒŠ$¬Ô~ݳŸµŽÿè{ZíÖ9FÄb×Þð³ÐBz*À[wcX:æ×õ\`·ÂžÎzÞ=i ðÛß>+äo÷{¬Ý°Å õØÏowÜë£öX{ϰ$¬ßŒ üã,ýÆ~)YùÉiÜ÷<ÿ9ͺ¿~þGžîH_!êDbdçÒê<þ¬ §BÈs"ÏÜrÆ»Am2Úýåûûè6Ï]ì`ô¡fTBîŸ÷þSê·o{giÙùš×s=ÖûéÈœsä:!TÀoKuc^ß9©æ~ø1\6éDß[Ÿ{ñç?Ý+JäêúMÛkÜWzÎæ÷YÔ÷ß5#·Ñû>§ oœ3þ6ËCe ¿Sç.>îût*¿súŠÈŒáî{ïCrFêy5ŸÇÿþýZŸzŠEŒÔÞÓÍÇ«ò€è¹ ÒÐÚsŒ÷ûÑ÷Œ¥]:G}gEä€Ð3oç~È tÅáËý-Aófà>âJzôSUß òÃÑÅí6tKX¯ü6óMŽ¬Ë¯Øûë&ºåË ¿C*ýoá¶ 0û¹<ÌËßI¡^uÜÜëK>Yþeµ/aHB3Û$" ·<Ê¿EäOÇí,f8Iy (Š7µå!ÚWñü*ªSëšM £€Èýôxšç¶µ$êÙæf¶œDBÉ >Ž3B¢µÉ€X`ãêóc@ðìžÔt\pêÚÌD¢ÓBD/ y»t6ìç!mÅ"Tø×ø¹ ¥ÂÇ Ÿ.È¡`6œê#W£îôé$ â]"1ÿ!K&%ÎaVÌA=r¹®ÞeMÀ-þ$Âܱ>Ö#1Þž "öï£UþöñÍÅž¡w§aWI*ÖÕâ'^¯ý̰úïºåiì¹åYÜxÇKžÿ©ñÀS`ÏÁGYîÇ3¯}·?þ5õ=<ý"=þ^z÷=øß3{ÐØÔæŠFŽ·Ö nûÉLéHò!"TíO\ãbXñËÓÂyZòË«¿Â2éÖÌm²hñàa°ÚÙ(²þËòo,džÀp{͹ÿ@óM`»óîCLY·Äøa¶|;Ð+ÿèáwÞERF®ÁYÀѱûoÞšô3uøÇä«tÕãþ'÷¿~ÿð§5YÇ3ÎöXÚš>À]·Ýy÷IY1?ùÕ§Æ¥ÞÑÆ/Œô²Uç«Ì×íÙkXÔÿÝN§^·Ñ«ýèëG+V°>üЪ6¶Ñ/>ùÄðD°'PÿÍcýbŽ6o¹¥]ú9ÓO\·Ofš¥¬ÀÇ;©ÿŒWâ =xêéçbeŸíÂjŽý]®{_ý)«x{÷ä&6 'KÑuà;g\1\ÇOuWI8ûbû#ºÇ^kæµÞ²îŧd®È'Û6 Õ·Žžò3¿ÞkãyZÚ«}ޝúXçáõø_ZªNe÷ ¢ËBVXÚ3ÖX$£úP^×îºÞÚf±íäÂ-«»<€ÔÇzÏuÇ[¯ë€ý÷ǪPìœáÀžÏéÇ4ôñê·,Óœy¬EýÃ?Fva©AúÿY<Bûðwç= 掠y'º¯EBßtËmÿQ¥Þ×íÙG//ãÝ(ÏËù5Vÿêe¯§'Œ6Nuxåµ×éaôî÷y,ä·ÃòÊÑÔÞý5j?û¯dØšM 0Tþ%Ä7TÁØ|p¥Ýë!š^ËXúµŽËŸ`~Cs6Á3ñI(^¿ |SK¡®¯8{ç Ë¥Þœg8@Óï)v¿Ëk öeš¢ú?÷Ç@ ÃJéj¯Xû¹ïËB/wþ¢8O#Ÿ¿$< ÿ/ÂA^CêÚN®ÿ=lëúËAûªÝò(°(ûwèaÛDl,hŠØ JoMÚ¹\¢ýÕÉFÙØGO (Hø£¯2^ «Pµ.îkPK P{ÛÛ"%ØN)g#|ù\¬¶ÆÔW"`ÁøÏàÅ3áŸ%Ÿn(c@1µüݳҮöq¶C$³¬Ö¶6SCÿÈåÓV0ýHü¿Ã\d8ÎCË"žÙ båRØ3À=Á.wÇ:[©È]*œÒCq}f(öØžÄÇí¥I8Pë;ZðØá¥×CŸ=·=ën~ûn{dÀÛžéÞ7°mÿ#ضïA<üüûxîá>>ùî{øt÷!2<KbÍb8ØÚº~nLÈþtù÷7@|2µdŰ/ ×AqâTŠ "ÿj€º Û€° l²þ§»E^ª#2žÏú®úñÝÜßM`l °t ãk©êºØDÆÃýèC¯ýôvòðÅ]÷Üg©zÜcé È".Ëê;ÙöÝVKÛ|:{i)üOòc¬Fn@?SrÝÅÿd^>?ËŽýЬ 2âÇ:¯ã±üAq_Y;-uÊXíRñ]C÷?¿ó#<a,@××@ë%®XiÈ {*ý«6ëé';KN×ød_}úkÄ&g?â'ûLi?Ý_É$ ýßÔéš hÙ»x}I,ñ,:ûKûZÚŠÐ]ûñ"§Â:€ºNLÖ~Õ%ÉÐO?µ®ÏÆK(KÞ?ºWO¥ízVä>¿gÿMãíŸom{ièýŠë}*çzìõR] /X»_CÇÁ@m}àðÃ_õô"bhµ¡ŠuǶÅÚyµY$È~?ÒDZf°AÃ#,Äççü^Û° áh§ölšœòphîèù¶kžoœa\«wû©ôßÑý¬¶)-ïÈõ±öÌíÎ\üã'àOµü0ZäéŸO-~¥Ý€ŒÖã~ZÍ åf¿¹=s1œjöU0v)ö²ëe _®ør»¯ŠËŸ<¯@¿<ÁëH(4ðàtÿ¯cÝ$*âå @¯c(õŸ$B?·õ_õ¬£_zò3 éb¥`žöÓÕ¿ÛªÝ ±_þB3-ý 3šf©ÉZõ gàñê©aÐGbây]E1ÌÌ6¯F]¶ÒÛù¡*áyÉÔG="!t¹-ÏÁeó±Ún.ŒæOEíx/Š]aâ5>tó÷Fi /òV"ÝÏ«mçÃ}Î$žN¿«çMAÝ$ÓÚJWÿdÅþ;Pü@=³8/düþR¯\Æ,öpDSv:a Âë©Î-UùwH¢|ûIªÜ@RãŠâTÜÜT'ï¹Ï¿þ!zêÜL×ÿÿ»>÷œï{kw<Ÿ-·áÖïâW<[x÷>ò"Ãù*`³h æL9W]ùW_ éÓa7{Î3Sz25bžÏ $x ®ý²ì'¬^AïLøÜhçÏó0<Òi€ã¶ñÌx ¢@$é(€ `coã{PÎÒ#ÀÆ@Às×õûž3/çÑÄÖÙ±Ãåï ÌŒÓúa?ö<ô[QÓ0.ŠÿtÚŽuû)-ÇÓ±ó²x{úáåW^×%÷âõ3tl§c^}¯°ëoži\ÚÀÞu%Ð%X,ÔQ«§ÚnÝÏò`xH-gÉ0à·Ë8¬[ o8ÕþÐþ²æ 2fYÚ ãôó.ÝEË\N øètÍ" ±/kÛöó_üÒx~S÷œÚ+2)ñöÖ)žïÁÃx¢~±v®mö±kkûòÜNÄŸoê:©^[GºÒ-_÷ª5µÀšhP(@bZ¶:gí59Ñv²bž8ôÀaU?æ` Ü¢²¯HŸëIÍã}q¢vg<å€3ðù8ÃÕþñb'ÿ[l!üÆsLk·Õ¹¯aHÄlÍáÜëC06Å)òÖP Úeµ§~5]ïsÃùìM±=ëÌÕÁH CJHÐ¥ÙêéA žz¹Ø°ÄÛËò®žûõÙï3À{#A¶ô:H4SŒâzò:h'ÑL .WÅÝ7åF0v?ŽÀw%вjÔ¯ìÒ h%š¥WŸÂt,'@ZÐrz0 ïIjÔÑk`€) ?! $:ûôàXGMÚ,40[@VÁ=ÏS¢ ¬¿ûª/ª c=É¡æsÛ0jP3¡"¥I§e?ÜÕŸËmà³lŒ êœÏ¯Í|¬\8+Ì¡§À:#ÙËyAÌsïë%óá:sŒçMF-]ý Óc1²)þ³r ÒçQK`Ríg!Ûy>ò¹®Ìg9*ýPãïÈ.Ìàö`'t8c Æëii¿.3×3máõìï=91Ø]]ÇÄ«oŸÃ/œO°ÿ2öÝñvØ{Çžùþ·°ußShº×Üð |îCÜxß«Øwïó8ôø«(Ì+ÇÌ©Ó1iÂ%:á"Ì`sÅe7é*,1fOÇy3±xñB83bBô$ÉgX@U&õ"éùÂeÈcóšWPÀRž ZÉ,k "¹ñA(dfyH 0ÔV}î=§xF&0FZCèc(Q;Y ®Ýyýiÿ¬~ÂC(õ³ý|Öþ{õ_(º%wk}O«oiϱcÑ:ÆóXë{ºõ÷Ã=Î6Ïoì'Ör®rÛO £µªöRv¥ÐÔ7õsmiDÇCYC±Ô0üššm2,M§ë>¡"÷òcÃfþ}÷~»SÖržÝó'Æa¹nÿ9^|IHp<ÄËd ÿŠï1ÌÜb(Fx¬A"5 -FN×ýò}õoýŸ¡zÀXyßZàÀÁ[ áw`?mWõækvPžn¬~=Ýë?üðc#^ÿŸwôíøå«¯¿aÕ)XKHÀVïÅÁëxúÅ#VyyWIOf¬Á@ï ¹ +lHîñ§óþÒó¡~Ãx[n»6ö"<SÇ{ÎNÇ2¥ã=³.§¿Ìm¿ÞòhÉ ¢ò}SöÑ:NúfåkÛ+ÌXÿÕ7@=ºÖi¯NðCYާ¡Þ¿Vÿ-M\ª£Üð㜟âøûª±¥#ÏК§â%œf0X Æ4Æ0m\àräG2×4fŒóØy¬®ãÌ8PIoÅáohÍ1Dåî¯" /÷ Ð8';ÊäUõILô0Þ_ûèa,Œõùõ÷Ž÷Te`cGÁjRBV E{y,=HND`ÞCÔ Pš@ É,(€XÏÌÍ ÑÔ+4RâÅSä/îð>Kçcɯ ³ác3Ž| ÿ<ÑJµÂklçÂcî$ø-5KŠ#bùL$»-DUþ3=l2ÀLX6)$2WÌGSæ¹2 'Ô8£ôÎ0WôDžcaëàêì€ÀNºÜoÈÁÛ6àÝ7ÞÄs¯œ;y»n{;<knz7zDÀ³èX{;z6ÄÝOŒ `ëþÇpàWQÓÜ®Æ/ÀÄKÏÇ€K~i]9¯ÀÉWa&=ŠLº3fMÅEaï°NðuF°*s¢QÀ4+QÌìL¥å_¹ú#)P@ éåîÍô? ºà?UÞ¡ØÐÓðõø{ŸÄ$Æž¬!ô%5}¥rjŸ>ø§ãÃi©C?úÉ)£J÷ßhñkaïàÚoÔ*niÆjιœgÀ*wôÓEüá0Ĭõ¶PJØÈ"4(Ek)Ö[©ëŒn㱺ßHЬ§û>8ºÏÖyIqßÚì±Õ-wÚ¬üRXÁr:ÏEÖ[{WlÚví}ùml`- ¯(ÀèåÌþ8œ^µ4F$¬pºG$Ô5ýK1Ó#¢mÖ[!¥tíu{ÆlÞ·yÖÜ/zoë9Ô3©¶IäÌZÒR Gü÷=pøí²àܲ˪ëOë»[ÏúB XIÎA^yÅV{ôšýqÒ 1®ÓïMkA¬\àaÂÂÏZÀgMšjÔ¢sÖÜkG¿/ÖœMaÀ?þùÄBÖï·2§(ÞÖŽa<ÛšNiŒýî{VÝbiHúÖŒ?ŽSiXŸG7.Ì^Hc ôobçN"tïÊ¥ m-ÆÝÞœùÑJC*]î«©_þbZ÷¹®î÷ý¥QŽäbž*«O O0./qûŸB€ü/Åû+å b÷»èú_äê$ŠØ£Ë-NŠÛ~=]ô¿ŸÂ¯àñT·œÀŸTýåY «¿Òü)_!ÃÔ+á` P]íÅÑFòháñJCt@IDATeý/g]Ílcf; êG_~z5T1fŸ¿.ÊA϶1 8ÞÛ %*²Pb"j"°>ÇexÀÃ:Øz3šÎÖâxŠŒãþŽfGbÑ+ã¹!þtŠ@Ãífcít¬ZÌžü0ÆûÇ8ÍD¬#Uÿ]èþ¿bâH DÛNEâ²Hsd(œ Ü£^Õôšõ_æ wŽ w¹¡?¢<±1ÞiAß[Öâšæÿæûxä©·qðîç±óÖg±yß#SàçÑœé4öß[èúço`ÓÞÃØrý£(o\³mpÙ/À+.ü\}ñ1õòKü¯ÀäË/ÅÕô <ñ*LahÀô30wÁ<,€'À2$ÂÖx!i|Å,É¡ÈOAŸR*Já?¢ÙÌ Ñ¿ÒfXÅpŠ dt€°u°õÜyðNÓÀi ŒtŠçØ}<ŠôS+KÆú·æÃ{ô~HiTnø±¹WËõr<ÇP»%\utÇrŽ¿²eUk8]ò«_î§ÑŠur˱wÿCY¹êïžû!(æiûhûZ«?×FÐ*%êüJ£>kµÎãè{DóÖî¯öéMéÕnm¬Á@ÇÖâ±DÆ¿Ûúï{E÷ͱ÷œ¥ÏFÏ¢btzNÔ_gz°À§_ЫúÃòì×ç%ñ^?ÕãÁx{Y3Ô5·ÿG;FëgÕ«Ô²ÀíÞwzôH÷}7@ïSÛóhû[ëÞš<Fäæ",û6 »<*ºúøÞå×{ëÀ-·(P³ïSkî)S¥£<Ñ` ÆHêäþÏÎû«÷·qmOîý>Ù}=³`Xé ¢ó9ÕuJñiz<·Ñ®e¹ŸU±IL»Ípüɧpל÷1íîŸîeÛÑÆºÇl»Z%(i ã,qpeÂè¯Ý#Æõ:æ]ªs°äµî=CàŠÑÓ¡ê:XCšNÕ'iñX¡±úFÏÞúöùþ~=ÀÑû6cTÓûf¬á§ô$f wŽº,ËõN7DÉ}eDzøË÷Ç^Ÿ?âО¬šGç)¯2]_s8wz@i×€7Šø¢b{5ŽÀw2w|KóºnþtÁo§µ{$@ݹ{àeõ$è]W¬Šñ1ÀùÑ \$DúO_ëidÐJú:êHo \qýŬ«)=ÖPþ/÷€UØÝ ú볯.r ȰükZ$Œ€`I÷'M×áé' "o2ùÔ (bœµôz(LòClÀRºð¯¢E?@6t¢±:yÌ@1œ4 À`žŒ èùÐ[&}LtQ 'h+å6EÁ$žcï¥ZCðZH+vâ|\çé¥wŽA޳Œl(8!tñ5€Å?óñ+æáQ¶ÓHLCã\f`*@ZÿËû_KµüÆ@7Ô¯rFÇÍÓÕ뢫|heïÇÍkGðê3ÏãÅ·ÞÃ#¯|;¿îx÷>-7<Ý·¿µ;F}ßì<{~Û>ÁkïCÏÚXẠ> áòó~+/ú!®ŸôÇr?œ.œø|\NàÊ+.ÇUW] IŠ`êô1gœ`)S#®`/ $"V":ØÑÞ`*ÅxNçÆ®1Œÿ¹b顲þ{2$#ØÐÈ!9°¹¿ùÜyðNÓÀi åù¿ÁšæíÂSâgËöë§'~÷?ðÃö0ÝR¡®ËÇv¬±,)²RÈ@?èÊÍn-0å@ÍBæ Vy¹?ôÈãØGa±|³¶úyk·tN4@?ÒÌ»®»±úM?{ù#÷Ç?ýékâN_0nR K9õ³s¢ºtM%Êx¢G"€ aM©>åQ^¿ù·0~%ì'¥s rñÖ6'je¶;pËØn ÖªS Èr©nµEyµ;ù3xÛwÂð|ÚÊk¿Ìn][U¯R ŸñæÛ'ºUŸuÖê(=rM(H¥wÝ;²|?üØ`brKûXsýŽÀÁ5;vyÎ1§ÀêXõêtg°}ýÞÿAdÝ~ç=ÄXué<ô>sŽáS #F'd¶XT Ð}þù×-ùË_ñ ÓI}¬çHÄŒ¯~ýßÖ,C¿ÂrÝFk«]~ÐqE¢FPÏeÛ]Æûûég3ÚµëúýÈ¢ÝÖÁzUï©äÌ<üþãLõ€Nr «,ÛcéWšôÞTh*¥µrô A»W_{Ã>;Qߊ àqêÖr[·Œt\µa Û+ѹ[®Áœ|ê{ûÀáGšÏ³9 eFl¿¶³ðR꣬ÒÖªOíµôƺǀ¯¡Žº×"Ág¹Ó]Ù8}Õ鯰³wÞ}ÿèKõµé~ÍèØ'òDP]ºþz·IÓãX¢Vz%ú×PDqe-ÏkôçÝr_(.=»ð€2}í$ÌgEÈ £ ¥Ñ.ãt§JI2Z²Û_C1À4 õÉêÍ8áª_loÍÊt1À}aZÿeu^csYþëéEP+:Áþ¡°ÏÚ@==*ž®9hU¯§>@?CéPOÁ=êtyð7Yžß|c,ÅÿŒ(W(Pª@yld4€ PàÄ[Zñd4*èuÀpÚ4T3Ea}n$ÚPJ¢¡ÄA%IÚZóKôr0í qàÆŽ÷1í`)KE2Z ¡ikRPœ Ô(I`1$bhÁŠ¥{µVy iÿb<#Ìq!SÚ éÃ)ìŒTÖÿYÌ0æ#©£)úGÐi7qËf#ÙiÓÚ ßÓÕÌ«¥°^=Sè@k' Wt» +Ò-±!®®Ä³?×ÞøOœò1îyò]Üpè5l;ð4wÜíLý·õÀ3h[Ú×ßÅÿwóÿ2úvÜî-øœkÅÕWNÂ¥çý?\ö£ÿÆóþW]òCLºü|\}ùÅžøÂópÑÅàâK.Ä¥^ ®ÄUÜ~"I)S§0$ÞsgaÑÂyXjgûe°avóáŽl!³Ð#ÂñôHñd?¹ bLkçkh便ÎA&ÓæLéª;+³©&0ÆÕ°°|ä,x# ÖSÏcÏ5ÿ·¿ýsZ¿däÜÖÏ©e?K=ÇëBV¥ »ñÀAšoÿcé'@?L/Sí]?xG+kZË^ŠÇAXL¢|Æj£Öë\î#Éqt]Çvñé Ô¶,*eÙQTÖá³1,ÍR-àкÎãxEý%p/æxÃïÿGÛ×ÇΫ.;'wlœæ:CÈLLG"8þò×ϰyÛµhÖ¹jªÍ«B¢jt+a-`i³®©tF6m52>kÅ4î¿ÿoŸýñ£mÍý¬¶êÚÜÿàÃGö >ѵ³áž¹£?Ç?ŽÇÞïê#§ö«Iõ[QyÍ}°sÏ~,PZ®Ñ±cµQö£ÕÒW±Ú-M)v[DZó"ÚºûW±ìMª±KTîDEµYÕ»÷ZeÅÎ=ûÏ*ö;^ º\OD$Yãpô¹êxÊ%ïý Àzìû[}&öö»îaºÌã~8zÿãM«íJÛvŠÅØâS^ Çk§eÚ[U×4ŠnÁ»ïœOß@ãÚXö=ÞXÏzοûýï-÷žck Ë1,÷DD|2?ôš¡ŽŒë¥ï B€Dèq"ðk©[U÷Öëoº1ÀR¯î¯¬WÙPAçïÿÇ×úBÙ=3/°.ÑTœ,ûh,ЮzGtÿpÇÁhõšOØ»1Ãz«ÀºÒÅ6°Ð5NËr¥µ6µïhç`.?{z@ß¹ºÌºÇcS[6:hÝïdi£~€9Öí8ŽÓ ÿúz(öbŠ*çÓK iÿêÓ×ûȯ|ePJ¿jŠák'è®Nô#ðö% Â0œê蟯Xü.*ùÐÝŸ©öòcœ Š{õTç/£UÚõ ì(úÒà ?z/# DgÓRŒp€)^$TêÂÍíùX×ÉzÙÎhH(a@5=tn=UÉtçOAWõ *Ð]jjŽ$cms>ëOB>êY!®Ì@]ÒúßMîòt'Qì°¬¿Þ Ì_èWÙÉ»n¶6±#È pC÷ Dº,AšÃ|³D:, øG"ÓLádCoù#èW±eH #ÓÝiíQCë-Á ÁAsý*4vC;µ:£>ÜëkkðàÝ$Q_yOŒðzú|ðMìŸ÷]ÿv=7?Ÿk£~èVl9ðn:ü>Fö>öw£¬u7Úúàâó~ ?ùÿ0áGÿ +ÎÿoZÿÿÀžäãŒó~.º^t!.¹äRËàò Ó#`=&`ÒÄ+1}0}ÚÕ6åjÌNÅmæÏí¢y°]8KæÀÃ~¢\H#ÚÛ+f#ÎÚE PH@" [+óÎç,iIq!ÆCèéµâû»ßQóÕ~ôSÃu[?%Úßò¡m,/C£lýäÄ$¥[Un|J&~sËåôÁs$È@Z²86@$ #õ#7n»Ê·|ìOá±mÓ,cG¶üTo<îÕuÇw%ª¶\kǺ²¬ëGmýJÖǶåØùV!ð°ÐØQYåÉq¢a<îge¥Øá|К«~óœsÏÞEÖóT· w=r=9^;þúÿ³÷àyi×Pw³Ÿß.»|°ZJÝ]Òž5M¶IãîîÖ&ÕÔœÔÝÝÝK e Ö÷[aÏÎðÊ$ Òýß¹®Éäµg±ç>÷9ç&£Š€¢æÖζÕ^oxt¢Ã Söüâ2£bAíß×~ýëßür0mÔŸëak:söŒCé® éáÏšš¡Ì£2{£Õëç§ÀdØê(£àú¶VWã}Uú+ÈÖýºúû8Yã÷_õ1tíÝ£ô¹Ø+2ɶ±Äœõ©ôùO uŽNé2Ô}ÇÌôGV DK÷5GmV»¥{_Í2yµ>Ë¶ê šoÅ|ÚŒme«Ö¬7xf@haIDKÉÁÚ+ߺ}§qo¶·ïú,hR)?Ëú?øÕ[ư$± t²ågÎå]Þb$ÑÑv$3ñÙÌç0{Hz}|à0ñ€èSÇy2äE¡XRK {fÙ£eÏ%m¿<i,Ýôõ$Ö3è _6òX)@&EÊÒÓ°8iŽäl[`*KNfyÀé4Õ+öåoèôÏmW&2Àöî dfæ³¹d2 ¹ÍLþ.àC"Áì(nm èG>?Ÿ7¯ çgùQôðã6ÜhHVöba$(kOi>+ຊpû%ÌæÄe5VRCRØÙdTr?sCX0f4 #|êÅ}(jîsÃhèç^/ür;ŽjÓ>ø{Á}ÿÒ>\zP 0ú]øº2ðwcà¯YÒœ7øù'iø$œðSJ!ð~íõíØAdö`H í_`@ A&¢4 E^hvlÜC'o`×7±óøØrÚÿýo`þúw béLYzIe9s'íz³·GÞÜCÈ(ÙD<úèchß¶9böÿ6Íýÿ¿õ ŸõÐ}ž@{í)žóý÷ ð%d<úÈ£xäaþOfÀ·{ßý6çï>HyÀ#ŸOàI<ýô/Щs4.®npqQÃÃsD?Õný^ư.OaT/"²ŒánÏ ?9ì.¿ÚŸùNÀAÖÐ~õuéì³2ûT0Zû_m^Jþ|:{piòì=ܵNmGÖ&ÕE¢ëq/V@®2JÊÚø¿ÏêW[ë'Ë{¢õOQe«)5ÞWWTÆJ¥ÍYæëI¯=)#8¹ra2hÙ¶¥Ï€82,ì»[¶!pBY3ÌcðFz²œÉ, u);wÁbüZ?³*a(ÓãÅ6+¯È!cÁìvëûœº2ë3S~ÎÒ· uë«Ìžý>ã*¶&|C\<ðÃ'aæÉ4¯ö,ë~ö¬é CNÎÓ«æ9<wè>õOÖŠ§Ïl{÷1Sº÷êìhÒy?sö|ÃéßÖ5©* ¥Swu[ë3šmȶÑ~ÔeOÉtxÏÕœ@ Тe¯Û&ë²Íú~w¥]ßúǺöycy-`ÎÌ0³Ó1Rí]ëÚÿ'ñé€oØ]m]]/Êf SINün>вêºçŠPñç?ÿÅê&ê ]ÉŸ.F1ÁhÁ~Žõ\ÑûºF{aõ3,=;ß¡üC~F:u>ùä?PyC%(ìµO÷õœ-@¥.Ût~÷ëïyÄyæ?Y4Ã+£±]íBÒù³C=4Á%úRÒù§Ê9~ <7ÌSWŠNÀþ>Ñ'3èÃIÅ÷£À ÌØ§1³MaWTcZN0³þÊü÷59ìç1X PÄ œU*Ç¡*kÙô#`n þSÕÏò2J2Â]ÁõH¯KéBvÒB1àNLI¢xº÷³MÒóP S@,M€Á!Í2 ?$R÷KÒØaHäk1"JØlVšLgìo~ž'AWdOÁ3KÀwã]¢Ãÿö£YËhóÀxì;߯O~ð}ïÖA#ûÐ=g0ÐF`ØKr;R ðé,0`8ßôÜöâÏÈø9Y¿ 1àsÝõ%Lèù "úÓºÿx2T0 @ê®Þ X·| yÛ]ÅæCiìwë\ÁÊÝ0ÆùUÛé?{[޳"+Ñ }ênÿ-Ç/AÛ6p_ëŠxš]KÒÿ[â;µ£îÿAÜߊ%ÚµnûÚ¶Æ}íÜwxðÁ ž=Øß%ð}²làŸÿ(«°jÀ?Ã@ÀNÅöýGðÖ;ïáÖûïc×®í(/ÎE+|]ú°?Y`xW?öÂX.+óŸþæÖ'ààPG[[[¿i«=³÷ðŽ<à]<ý¬R)ó ÈlÉÑ:\@ ®fõöWÈ!X4e[ëo@/wzØ6ÔÔ+%Ã9}øë_³Þ±§ÃA¥Ú# Eežê2)êÁÌ£1äþŸ}íÍÕ4øue6Ž.Á®6ªrqCÙ^3rÅþíïlë·mîD~`P&Z×øWmèÖ¥@6Ô~eí]cwøÈqk«1ÞûÛßþn>FóÙó¬Îúluë¿ä9cvÚ@ðëÇO=ï }4æjóxéø§ý°·Òý{^!fÛîè{fÀ³æÌ¯sp"ù®k{û¬Ït=VmëŸèh?îôs]UÉÄÖ¹cy_̳Ùû¹hç±»Z³bìÖó¹>ÓnzYHÖäèžé\èe¹P@Ç?+·š>Í¥wÄÇ7LígÚ³ç-üÂvÄäsT5A¿8ÜÕ&È÷ V{ãì¹SÍÞ3Yõ0 Í/«ýÒùïÝÚb$îdñeÐô¯ºölÊ ²øæ²Ä]eÓH¡9Á8{ÎrñÏŠ^¿ Áܬ0Jüž¡Yyõ >ãšÑtúïOÀÀiÌÞçP&PH·|wC§/£¿pïÒÇÚ}Ãä,IdŒWaÈÒÇ \±â @ÌÊÇìhfó8ODAìXTD¡E ¹lg9úEí£É_Û¢ªlOeËõŠNÛa$?ÌßAI<%Ñ4äïÒžb€síÇý¢§A*A"iaÈ¡œº0Ðÿ.Z6SðÏÀùÑþÑñ³à ðòO1ÔºÐ>=:2eûø[XZ Ðr$g-]^~üw£ér¯W1±ïkà:bü'Ð n`gDgÉœâølß~»œõöWo?ջΞµû®bኳ(»Ã ýÌ?¢µÈ±U.býòçíCRñøÏÂcßú üVöáaÿ}ëÁ¶øÖíð`»ÖhÛ²ZµlVrŽm¶Ûµkg,ÛŽiÖü]ûöíðèÃb<ï ðãGÅiø£ýŸ£Çbåú8yå&ÎÞxWßý%ÞŠ×÷ßÅocûæ ?ÚîºÁHwêÙCé3ñnœÌŸŽv;]kàÃ}Rd¬CÍ€Íö+7zG=ü_èÔ X¡<úNtti@Ó{z[mŒ~ãÙµ7ÑgÒåFÒè¯ûÕU0JN`K/šLšÍjŸ3ÔÅÊ~}YÁŠúÓÍ[ÇWAo]'Iæ.Xä0ÔúåÞ¿Št¶&3Ö£ÁZaÉd[«±ûþÄÐ(à3*GŠóáëÌê17ê3WL3ÎCÃÖõ£óTæ~»öì³¹ q:Íÿáwê2É4MeÞlµÍžx>ôâbõÞ£m©L?FŒüÆQv JŒ-FA]Úoï»f믥úl3lmãO€÷d{ÇVý'XB_×€L£sG×e#j·œsG ptèygêîšýb_¹3íè©ÝúüM¬Mfã%zŸš|g}'êÙêšÍVSX%€ö$_Gz[à\}ŠïÜ"Ø>Âîõ/ù[§=qª>pþæÖbTAm~g/$Â2€Ë®_Æ :÷DþÏ 9 ޲ýDytC"iŠÒe?`#PB'Rá3h¢0f(y_£þ°Wf7<æD%U5@æ~H¯MfA1³û!4ä¶eŽ@/_3_F~X®/ÁûôñÈVéœ1#Ý÷%KÀÓ²B1%Á=YFŸ ÿa¯Š8Ä ì>z1>,ÿÀ9È^ _ìØ¡,BFÌ) FF/AW$PÄmå&cçH|n«Ñ¬àû@;ãµcŒí}íЀqüä{?`!ÿ>àM3@Ïî/ë[O+<÷@Rxj®#1ÙþÁ]Ãà8šWgø÷€ñ_d$¶nØ€ú¯Øs˶à û[³ï2ç7°lûEL^rÿ6-bŠ¿b;JÖbÊòc¹î,ÊFÖôÝHÌ]ÞŒÕg¿uKÜÏ`ß`0øš}ŽáëÍ9·hA ðßú[¯õ^k2 èñ0ý{è!|þß}è1RÿÆØàHlÜqgßü%Î^ÿçÞùWhüÖ»·ðAëdw]¿qk×®CTh0|F Á°Þ]1°ëËHþ]=_sc`ÐCSmVÝÉ_ì0hÒDæÙóklJ<Ñ! Ÿüy$¥gÛ-eWcÅÕ^X<ì!üj>ï?t>¶áЩ³æ.4UŸOmÒñef'}ððKwãLfû ×oŒ¿¬Ðþ);WWz¢Ÿ/ùŸÚ²~óÖjœjþ_¹ZË8Ð^ÿ[2ØÌê/º©2A}&¹àËç@ûkkÖyì3f<TêëÌÒ09SIe÷UÔÐq9ØMõ;?êÓ.ËovtpÈPøøåÖ¿c (3×íïkœ°²Ä(Ð!?+¯I?D\ýåóa\uH-ûdY4É€>¡JoìÔ5ñµ>iÈåÇø£Ãk]÷:ÏìMf±N1ÛÞª~6eêSÀ *šüµÉ, À=p|(þø§?Y[©÷®ŒqþC>ãÅð«Äë¹¶ã±ólÝ-ï«oÿ¡®èO¶O]fÿ:.ge}ÕúLÌM[¶ÚgçŸÙ= <÷pWÄBìÖ㩳wéDýœ?þ"ίK÷¹¡4ÿŒ(føÏ Š~^œôÇìpVpÅ4ÒíóåÏðÀTþÁL}KgÄ2sÌ`;~ÔþFpL£¿üÉÙ_.þ2öK ØÌª1tý/aæ7A}A !Á÷ÜP2P`:Íý²žhúLtïMù+ÐŒ/Îþ%1>(& ¶B{7D³l`ÛL`!Lþ^>*(6@IJŠdN S@åYAŸÚ€²ôšÌ@`þl¶NfCbädþfº[4mÍ¿ï~Žmç6tÈM¶B«ÖcÐ0ê=šüûwfðÿ<üûðêúb ·Îü»ŒîàÛµü9éIG|n/ñè¡=2š7Ü{ôBzt 6®ß;OcéÖXžùl9U».bÕîËXNzÿ¬5tû¹ ¹U»?{?âò×!oÖ.ÌÞpSY þ^dLÙðØYxü§O£]Û&xÙ~÷KÐþVÍÐŒic4kÖÍ Ž$Ó¡uëÛKJZð=œŸÙUxæ>öM)øáãM+€áYì?sóuŸø6NŒy ç®_ÃE&'/^¿Ë×náʵ÷qæÂ5lßwó,eÕªBÄÄDbÖÛæšßì«ìËkpзf d»1swöük³ÿñú[íw©hàÛkf'N1Ðw 2-ß³¶Ô _eë3i¡£mh»rIÿeÁ¬M hœªP ÌœGõ>Ð÷t¬,ß×o5`£B2J9 X¹v.s°%#ÇqMê9äah×oŸãhV?·2°@`*áhk2hCè®mÖg ]}[œÿkÿ¯mž±Ì4¹_çd{œ®³úLº0صwíèÜá¢Ê*ÞÉ$?þqý)$úòw©³3/Y!ý®ýà@¶µ95+ZoÇU0,çBíkR Îѵ-Uú(!m~Çî=PõeÛë:4Óg£>eÉ2B#ã^:ö±IšQ×}øªŸ¯ÌžTùØüêÃpèì;.]ùJ3rÆ?|̶TÆLíaÕG÷(§ò*nß0lÐ51eÚ¬;:ö¿ûýGå9Ú!èû¿ßØ5x:¯e\*!˵gki¹&u?ªëlk÷-Ç®®>f§ó;_}hìÌ 7 Îýe©AFŸ>(&-~nNï¡8Æ|çÑ?=ø?Ã\/Ò·7í:TýY9¡d ôA¬oO2 /bý|æÞ\»åþ²§r;ÑòeâÎ ;/îù ªHÉ`vŸ/"Ý_3XÑÌÔç<úz÷îFu2LpA2õ\æÒÍ? A°{Ê³Õ Dõ' _ë/§ù`A|þMr1šü)üÕòŽqò'Pàz¢¹¯òù=ÉRU¿/Š!`"ý&ú BVZ$&Mh×øÞ{gFŒe[ŽoÇÌ?µó>Ü[µFfíñZoÌÙÌ€Ép8Ÿ€ñ{÷`;J|(ÐWÆ_ŽÿGÑÀ¯=»>_þ=;bLïÎèÕcéÌrãôÂ$OoLÅÒ{°hÝ ,X6ÂâÍÇ&à<1{í)ÎÛÍÿväÍ9â-/Üi+O£jý-?Léå;1Ò-í ¡Í=x€]+<@ÿý2ü#ТY4gð߬Y34mÖÍ7' À¿%ÿçkŸ×¶M;<rÿxÙÿÉh£Rßù< °¯Ús +÷Ò`ßE$|ǯ\ÇÅ·páæMcyñæ{8í=»xN^ÁÎcç±ïìe»ô;«×¯}õÈ7|NÀÁ2šŽÒÔÍšöŠ/\Œb7@°<D8Î^}Úºc¡-× Ýò=kKeºTŒ>@K¿îp «íjàpÙáSC25JHËrHkŽÖÖÞS5HW ¯>v%ET,ë7nÚí. U/[¿±¶^Ë{Ò>+ãiËPÊîFø¡ (éZÖim©`@Ð$r3ú@nèÕS§-ã@ÕQ·Ö>Ë{FsªñuNf1Hê°ëNÿGLèVÕÜFæ¢ LÁfûRêc8ÔtÒ9ao6^d*õYÎ[KK ¢óDm¥É"b°yûšrÙÉ ý¿|¬y¶ó÷¿ÿQùÅÑõ¯cóÍÞ£&[ôü©3ç¥!Ôœwgy*soïÜTËÖ1¬þ~C1t^tîÑ¿Þ@ªåxêŸãè¥ökßgÍ]`Õ»Á, pmŪµõ:¿,íëM×µÚSœ_kÿ¯ã!ê%UªO×dWµ¿ÿUŸÖ±{¹K¯/_,ûè\Þ]= hºØÞûHÊ& m]ü©åuéÁì_êèG ÁŒ²øy€Ûª¯R¢ÇÅùÿR. #œiÌ¢Wfgf}Ëöõ§Á*:ûqù{/Äq{£2ËNMÿ8ùô§vßUÈ@ ]?ÿD²²Cݰ 8ÚûÁt×ï8ïnòìQ¯Ñ<°}êöíCA EŽOoÞ/À|ö@Fú?éþ $³MEd;,*ç>Fà°õêM¿'÷}"r 6ša6÷§jr2Kº hÈËHõ@SÂñÈIÆÜeQZ1O>ù7n{52(ñíÚ1èoÛÞпßÏà¹Y³VøÅ«d9ÌÞ)k® 6» Ÿîð¢@¿GáÚùpéôwz_Šù5ÿ#žSàma0è÷gù@_já}ºþþû <(÷úUûú^ûíÂôûYÊïæ¬?EÏbÑóX°éf:¢¹û=} g@îôÈÞzÌßúf(Xx)4ÿ/ZgïÊàŸÍÿàÑöð õüíZµ1èýMßþ3ð×lÈõoN&@£f-É hÚ=Èrà1íhoÿøOÿ€u{Îc˱7±ãì5Œò]~γDá 8|þfµc°íàYì;ùQŸðìïð®Þú%.Ÿu7(pN5{À Ôì/Œ2ò~'ô>møÖ»ïÚ ,j 4`U¬ QWð ÖòœÚK=|Væ£ŸÓÆ-Û9ž·èj»jÇc'¬nŠ¡\µûBìhPT»/ÌŒÖýqÃ]}°|嚀µéÿø'Wú_RùË_¬Æá{ú_àûª OÀxü#kYÀRúdDµM/þ¯+©M}Š/8uæ,²òKÐòºtÐ5šsN³óÝÑwÌê·+Œœ{£mYû\û!`A(ÎGLfͪ óúLw3 @kÎ%âL0úUqõ±î}óÇÚ±šÏ{ ŒFÆV]@ kÇõ£>2&öEç*ŒXón0`ÒXâN§ ôVÏ^ÕÞ~5x2f5J}òŸ`ï·_ögº% Z¹æÎXNwÚÎß7LšL:mÇ@{O€2@wí`U ÖŸúøyy¡(¡Ã~ÿ@öèÌþ¢Ltí uÃ;ïé}á'Ã>fíéÊOV4þi,§KÃÀpfÒ³£ü±jV6eÙ€Ù'ûöÂÄá¯PJà ©éAÈâo§§fBV)UIARó &h ê±ð } fa ò~Åñ~Æ:âÈD)@žg4Ñ#h ÿŸ%C!ƺßAûÑŒp ŠæaÅì<U0~(=±$ÅOÂÅ1}Á2<óÜhÔž(#.|Û¶,ýÇ`ùÁÚ*ßíþÂ2g£ÁÖ¢3ȪX xô~ÕæÝ»Œaþ1øòÊSøâOyÈ+?ÃÎÏÁO2ü(PöŽ@!ýy·`沜šX²þWì%Íÿ(æm:¹Î8ÌðÍ=Ì©€þÏÚbøK)Ý ¹þæl¹òåG PìGrÅGŸõ#ÊîÿÓýÿRúÛ¶€·þ&MÙÿÏô=h Šü¬1Óß{È#Blÿ Ÿ÷ã!$)]Æ®³ïaÏyÎgobÇÉk¬Np÷_`¥~FßýÇ~ÇÏœS>Àóï p'/_Dz.Ó,ð÷¿^¯©¹âv-NÀA40;ö_ÿöWk³ÿ±t¯fÍ2Q5·°dùJ"ëœíþ^ëVFçÐcöbçÓ=ûDGmËáSCjªÜÇ{ÐËQfÜQm}.ÀC³Ê¿©íµ'i¥¶ÝÕºÕ'ªón˱özk¿V©Á1ÂL µ[Áª@"¯Ñã8èýgífzý_ pàªjõŸ@uÚcÓhúØÇ(èèü³u~}ß, Ýþ¬9óñý¹Ý~õï äL bzd jo2б6«ÊÞ:«v7b!I¶$ Ó`lT?>ÖþoPLªêîêÇÃìÿ:nòî±ÖÖêï©ÝE¥S ûoíÉ, ©¶l¯öºÌŒ¬$ ÕÛWûËao©re$È #Jíu5ôkJTlÙvç`eß˯¯$œœ*7eãG÷EZÐø1»N§û0·n(ð`fÁ{0³õ€â'ÔßW²2ÀfãŒg º3+OSÀÀÁŒÝGJŸÌòJéŽ_äKfÀÑó¥L%óH«Oã÷F± yôÀ²òxÌä:3#Ùü"2i<8ë(ô`ßC4ŒB)H¶ÀÄLO 2ÚW#Ÿ>œ3º"}z"l0ùX' M8zäPU8~BV@2Ù43L'8¡rÙÑŸæ{qŸô&ðð$nØÅÛ`à1Ìú·Àœ€þ+X6ï€ g&Œ}¶õÿ{[¢çð1([qYKÎ!cáiÄå-»|ö_Ó$`þøû2øïÿâ1šÃO0ŽãpëÆÒœ;œggž÷é q.îHLD~Ù<L^ #¿œ(YŽ¥÷¡þkSÏóYTŸ~Åö#o6uýÓvÑøo7ñÏÁ² ?gËþ]Ät~·`Ña€NÛÄíìÏl>AÒúÛIûO3¿ûZ·¡Œ¡%åPhÎ÷oSÿhj>DÙÃ,øâk}=¯ï¹uÇÞÇo`ÕÞóØHSÂG¯aÏØwê}NœœGß4æ'®cÿq~~ô-ì<ªï^ÄÃç°ÿäeV š_òæë»ºŸü-;}üU¿dvÑÌ ^µÙ5À®ÎXJItöÜúLGG¥ìuÜÂ͵œ¬M h§Ïÿ8£ÿ*ãY}ð£ujðü àÿ±$apžãêQþdÔ(úÑ4Ks€±¢ÖÀ õP/|>(sõMNñ|æêmfîÕÏåúþoPÏ9")C7:~ëºù2®IWéØ@ÍÞùÚþšø Š>¬ïùP×ß}Ó?yÑð2JÊ+ê÷¿j 8"Ö! ðv8ï ¿¬&IT)WU,ÇT×ë1ëš2žÇhhëîþ sÂHäÐ/ñlêÞU¯÷âh/Ü2Ô£æ?ÜNÿ)ïÉÉã°°4åòFsË&Ó8/Äéó#W = ¥ Ì {!uÒpÔøÇy²àpô"í@« TŠO0teá§1{?9ÎÚýŸ·iþ£Óõ_U<÷@1Ù%ñŸ¬uO>Ï®ÌÜ¿dþ/À `AGw}žVHÏ€ÕÿA.]àÏLŸÏ WX)UXÞ0f4Ù- `šºö#5ØmÑÃ^Åžá¯Â¯_xbÖºÍXtøŠ,Ä·¿ÿî¹§ÈøN@;Ë-ñÐ~ž²×Qºê"Rç$pAñ9ÔþéWE·î/²ŒÝÏ1šãÓD¯ç@¿Oah'VèñÜû²dàÈQLGVÁ|ÏØÄ~;iØ·y÷1xßÉ+`ÆêßìP¹òòæîEæjú§í@Z%¿?÷1ÇnBbù&Ì\{óèPºò2çERÅ.g@nnÌä7CkjúÛRÓß®efõ)eà{@ FMÞ÷ ,hÓéðJÜî2ÌÛrs·^Ãôµg°pûil?öö¿=Ìöï<ÂrÌüoãŒóÄUì&íeG/ÝÂ1Ê\|{ÎÐðØUlØwëvÄé+ïÜý\ïpСf=ÔúÉõÙ;Þ|ëI #æ/ZVXͲof$zšïÚ³¿ÞÍ\³n£ ·l-Õ'Gùê;òVX²|p7;(8R[4ßi¢ßÖ®ìvõIÀšždÇN¿T€ŸÑ8œGÙÔï;êGžÛ+,99pžkûº6uÎéÜ×u`oÖwl]Ë÷ëšUrîê¬U¢sÏþáÚc¹&õ¿fËúë³3G=İ59Ï{F2&ÕW0næ9wt<Í»(°p~Ÿ·öÿà.£¶PÓäÎ$/`ãmödâÓqÁáŠ`ÍÕ%zvšäªÀG,A~³ØJCGyÆ€&v×ùox(óaÉŒÌð³ì3äSQ¯`&~.YSšÏäq('S )pMô<?f²ÃŒ0'?áFÉ¿À¡ù>µýã]ža~Q<ÙÊžûDiËî^8¬3Y#N휪3hE3Â_V!1C^b øN3¢üú¿(ß\!ÜÜã÷³ao»u% @ðAÌÊ¢|{²Üà!ÈgÕHÜ¿X)€¬!Ì«]P?Õeÿ ãü Hž¢(qJSBÂÊ(ÅÔIÉ©XŸÿ"Šl8Wž£1Ýþïœçþ/<ÿ·ðÛúOüG·l<ŒegRu9KÏ 0®žÁoÐ øöë /ÁœÛóÔü?ŸÏý~ö8º<ûúŸÊ*n^'}>«° Å3סpÎvñ»9ïAÎÜ]ö hÉ~L_utÿsÁR~SÈ6È¥Þ?Á*3ÿÉÛMzáÂH¶ tþ·ÁÿL[yKN"iÖÄOÞÿ°r|ÿñÑ¢ySŽ5ÔõúßšIc4nÄ~, @Ófü¬QS£,`zŽiû ÇvŠÁôÍ1uã%LYuKw]Á.föúÙýÊòºÝ'ÞÆS×±ëôMl;~^Áú*[x«é åzŸ·ùðØJÀ¹·ïÌ£í~)Ö«yNÀA·d|uëœ;3Øwàà R=Äk íÜœÝhÚdoP÷sþVôAUšÏ$ÆÁtJÌ"4(ŽU;ùË`TßQ;÷<ôìj!}©nFý Ii±ŽöúËÚÀPÙW¯üŠ L3sö±4êÉÑ}žC©öOfQÖ(«ê''Pýl¹»?ÿõ/<¶LÝ'k0¯ó_Þbèü±6ëþåèZš+`éeÝ7\Œl¥!£4ÂåÌPºÐ×ÈB+À¥_×ämp n |æ.XD¶O,¬±t·»ãß4{}Í:ã>åxÑqÐwºÁ!°i()åÖΜ§ò³ÖîµßkH@æoŸõvã\×§Ï7m8oÑÒ;6L¯:k¯®ísL,7]+µû¶úk}.ÿÿðÏ6ñgúÇÄ$Š:dïéP2¹àÝ'_ʬsPëvNÿ=`z Dø(àóBoì¹Å±XWFêœ2ÿC44xê } 㟠]i²±#»Â³ÏúG¡ÔúLSÓCÈÃÿ=é @Ã>þ^ÌJqÌê÷zöÄ»3øJ7þþ,ùáH¢ü`fz ²Iógf4hÆ¥¿ÀPäÑÈ/nÌ þ ý<) × eù#<zbpï^ïò*œPïéic þÊêêF/þGcF^$Kþ¹0Èï¯~/ðóN(H,ú€ÀÈóFjL¬ÞE»ßFxî<Žyø{žtøF€ÿåðdÇLyVdÐàÁÇ~aþqÈ]°Å«/ e6)ö³#wéi$¯ÂÈQc1 {Ù^_"åÿ%ôïØ =;uÃÁ®üY¹Y³¶!gÖVäUmFáÜ(»ó..=eûPþúaÌXsôÿÓÔòGÖìÝH¶iÓw!¥óÔ](ZDP`ÎQÄnGÂäÆlü\VÌìÖzÑ%1Ð#ÚT~úhÓŒÁjûiüwO£{ÑÁ¿çæFüL²VØ~ôÔK+X o dí°d÷Eì¿ð>{ó{Æ|àô;Ø~ä*Öíc¿÷n»H3Â3¬JpUëÎ`ÁæXŒõÖxÀÀÛØuróïâÊßÿw\t žNÀAgT3]uÚïdQ5Ïá \z ìkÓëÏ¿Ÿ]*8}ÖÜz=õàKêkÿ?ûJ£·µþø²êÛü³oŸ}ÃÜï9HHÉ4jv+CÒä S%³þ ¥ÚȰLêI2ÌH#ÔW.¿aùiúÎ3G7zVÔÖäjöÌÝÄGæhË8§.þ=oÞžú$±7í%øø8uðÖ®eË{õjoW$«×nDaédf€ãÓJ=éå¡ÒlO<óäubÙ¶œ¥<1cªrÕ·én÷Jù uõ2Tvb8-3ßýáÕûÕò¿Ê Jaïé³dȹ{_ýlj»r3í6@óM[¬ïf%eK+êmªªöM#¯!GÏm+ auX>5Ee¿ízŸehsÎÉÙ{@±#éMÀ«/Óq~`Ä ãéØßßÄø"úúÑC; A~eúDŠM@r(uùŸÈ ÷A*üŽ.( ~~jz0"Œû²¬ß`qݹÑÐÏ¥û|\ûÒ}¿/?ë²Ä@L&Ó ÛÊeÆŸÛJ7A_ŠÖ¿;ò/M äz}È>`Fß»7)þn,3x[î2:ô'åvüY ¥Ç¡À, MC €³bAÆ$²Xq`d÷çXÞŠ¬ZMiAX€ý'q_J2C0 AZðpdÆL@+òÌßq ÛÞ«}F¡3á1ømB'|êä[Ž$%Ÿe4eüÐwÁþHŸEËÏ"gñÄÍ<ä9'»ìÊ^? è¬ÎßPøy [ |üÂe4êÛÛ1c3ùÛ9k;²çìbÖÙ e4í+^ryówÓ_à*4/ŠÑß=HŸ [LêòŽ£pÑ){UŒ¹óbζ+±áJ@ÚLfÿ§ìGHæ"ŒÔ}8÷¡ÁdhI@ÿ îås ú¿f üÅÐÿzOÚÿVY5àÇ0rl,_?âõ×=U€@IDATœø(KÁºþ¿ò>v¿¥ìǹÎaöŠ³Ï á7hDx e# # qs6]ÀÊÝo Àÿmºx÷°æ®9µ/h'P»Gjœ6h0®ìòLõþcžô:ÊÂi ¥êÔWäø®ŽÁëû»º£ažÂî(øÐ>é?vhmú*kÛÿ3öï°$飂 çïÔÌ<£ï,Y/{Yí»ú8ŽfË€¬Îö]{j3-ë]²ìuËOëŽÜ±{¯Ÿ8êmGÉ Ôì»®>Ð0ŽoŠž? ·¯ÙŠÅ×ì¥Aüµ·×fIÏ«oŸ VÍ]IqkÇØ¥sÝžÿŸÚÝæþ:É1>1JDÊðÏr²µ|}¹dù¿¥yuU¿¡óyÅÔåßÉdªÝª`KÎfÐ5©ìý)S«ïtæœ,8#3)2®ÆftüW¬ZCÃGû Öβ[wÂTš±açÿêøäÓ5ÿñãP:<l:áÇÐ5?1h(åcIÝ'õ@=2 GBM }9õûi<~A»öŸÞ¥4ðË úýxãÉò¢ü0É£7&§N ÔÀE1~(aù?Ÿ}Ê,~*ý$ÑÙ?ß0ôä6NGÿD2&RË?AúÌìPÊ ³âÀxûùqý®l2 d{±â7 7V`Ö¥þ"(ôíXýE = Xî/% óø)É1%+ ôÈ 'P@tWnÁŒ]oQÇ¿ýði4!õ¿iãfh"z<ÿ-ü+ŸÿŒÒå '¯E6³î +Î#xü¬CH]pÙ+.!gùydÌ=HŸœÈ©d@>e §oAÉÌÈeà>e+R§l§vúýOÿÜ9à+ð¯\} €ügÍÞô[ùþc@Ìï'MÝÄJ-w"mÆ>bA\ù6ÎQ¹ÎÿDËÏIÓö³œ{á>ÿóTGîGkÍ Yfú÷p(à·0ôŸÿŠ¬ÐŠEcŽ€ö¿uÿ©ÓV£xíe€-8Á`þ¶žCÞÇúýá?òGYñ$ŠR®0{ëUÊ.¡xÙIJq¿aÁÖXsàMl¡Iàn:/ܲ6d¥S×þ«¯ÅúìpÐkf Hú²DÒk6®à.œH4ØU-ù_ÿæ7_X¥Jc90ë÷D?yê¿wôÆö{ÊnõAµÿÕÉé96ݹ¿nÀÚ~¢fô¿£[Î$UnÜŒEšCpDëvcæºNríN#Pñh à€·Þ²}§ÍM8]s·Wß|Ëл+°vÝé=_¢ýÏ]žŽæN:xµhé ŒŽ4ÀASYºtå ÅàèzÔ~«íGYg`9,AhdŒCX÷yÔeºôÆUA©QCzÎp÷µÉúpÔþë7n¢{?û9Ëõ$Ø5~ßÚd0ÖÅÒµ¶ïÁ£Ÿ{ËÖ¬kE}S ¶¬üôÙs~/95¿ËzKgXz@²òÌÒçúéÌPùÌöOÓ?éù)tÌ÷ÀïôfÆŸ7+Ò4Òpþ:Áÿ0ÄøQgïÙZüWi*8¥ùPVÐ ^FÉŸdÛÌžÇô£`(Êý1åËšœgÐÂ>,,n??yèY4å+%[ UžF À¶×F9b©ÁH qG~l*3CéÙ 1Èãv3'2§¿Àè/xèI¹BD&ÌL?³è%N$®7Æg %AÈðDi,œžO¥E¹X²õ$f1ûïVÖ÷=Š[4e9<fÈR/ߌy4§óýI1"gÙYd.:YL>œ.Xyy+.Ðtï8âhÌKÝ}\ÙVRó93sÏ =eÊNdLßì?jý4õYëÏÓžOÿcül*7ËŒù{©ùç÷«šù¡¬ÿfûwrÞCÖÀäÎ;AÀ~DmàúöaöËI£ÀeÇÁm$TîEtÑ6ñIÆÃß~ÂÈîrîþÄ `_ÿ[f7œØßûÉÓÏIÐã$)+È»ëö¿#o|Õ{¯¢lû`!@ÉêÓŒö"ÊV] Á p®ÚpÕ.b#ÿ·€'ýœgnÐð¥×±j÷Ì^^NÀrÝZNÀÒ6f ^êÜ/³±&ûoGÆ'sðnûÁnyàkð¯zŸ2õ©=îûb§P¹È+ëA¡ÙéÿúüÇ;\·Ú©AÊzIm¯!3g©óa&ÝÞ<ñrb_eÉÌL ©,#EAžê1+H±L*I4Éá[¬_ëEÆÀËOM-:ã°Ì£ú^mMôÃ_ ²lÈ Xzâöòn2xxŸcWâmkä~áUFüyïOúá᚟ž=@|Hð³wM.&íú*ÍNÍN*Í'3OËýÏÖRmߺcÕÕ:%óúå0ÔýcîÂ%VûÑÖKW¬4õ\hH@÷QIEäIS)-'òıu>YÞ×óÖ' Èfõºº6'ÖKpêÌYÃ=_ãKÛ¬-õ¹ÌWÒë¡öôî{ïÃÍ{ŽC J#«Ãýò=÷ì;ÅXes^Ê{³ ¥×îî¥âøñàÂæ|Y€Á/h0²D1c0zËä CF+HÇE:ô#šœ/dp2ùnñîH.šáü"Ü»"e,³âcP>ÐÓ2XÒ/~V?éd(ÀçzãÇ`vQÅO#£ a®Ý É4L#U_Ù}øé¡¡|`ËüQbOs?Zêó¹4$ÅmÏr~å©Á ÉuPj0Þ`/}w2È`Õ8z dÉU"éèÙÓ0ï .;Wzº±ô©ï÷ÞæÍhÇY@3÷=ø-ðf»i#)ó!iÎaºÿÞŸòõð§Q°øûsü} eæ^$Ï€^Ön€Wíæg€ú/:RfЧ?þ§"_º¿©Üèâ5ê·ØeþZŠÍØÔé(=H%>s?~ù3"¶tiþÛ ¡tûJ E€Û§eP±Á«Ðch0Ú?ô=Òþ)ihÑÜ?ÿê2ÿ,l?Z±ìaÇþ°ÝKN#Û±î$uÿ¿ÄöS`Ù9ó#ýµÆËØsPʰø8ª6^ÁºÃ7± lm,žõä l"°ñÐUo¹@_2(uØxÄüžãîŸ*Í·Þ 8è+³ÆOq°Ðš+ÍïÞv°ÖÏ?5OëNÝúDI;uFÕ VZw6ipdmp`yÏ2ðQFßÌ€6j`ÿ í± b(Œ}ýÍU7 Ú#6ùYXnøµš Ù$G2 U#Kò/~4pÖñ±ô³¥úH,[åÚíúåA"¶KÛÓ±·§ÿ׺@ÍŸ[žÒ#Û dô8gÎ]š¹v^]žxÙ`8 .ì}ü±A;Ö5gëzÔûºf§Îc§55?:AàËN»áóQó×·_913%iÌNWe8çè£{SCZ]u®¿xÉlsïm܌͊u>ÛºG[Þ×õVX2Ù&.Ö©s¹ÏïºdØõ\ 1wÿo`± jO§šdòTSÏšž€ô:ûœsë]£Ã¿;%C¬Íºt¢Ùìyk7Ïùú.ìÿpl8·0ôzñëIj¿' cýX÷7šô1ŸIÿªÌpT1°.IÂÔ¬päÒÝ?Ô¥+r'`&ßUš÷÷(ïü0iúãQB×ÿYYÉ,»J &²ì2û*-(ú¿þfóSx`I@² sÝ@ó@×Î?ÅèA/!Ø«'Êè7PÆ >nÆ»sN4ür£ÜO4ÿ€ ³Z@a<=ÈLH'0A6CYÊxÌ/Máo¹ÌhdûQ6pHdåTI$Ñø/`~6Öbà~YòUxü§/ÜŠÃËÿ5aðßÙò=ñ,²§oD&ÜäEgŒð4æEÆbfžWGáªóÌ~AîâFÙœŒÅ§=ÿþÌÜïEÊítëÏf ·èKcü&¯aàOêîleëÿ:âËž35K*`üï3ælþåÌ9N EôwU[hŽ·ñÓ|} Sw Àèžx¹/ÚÝÐÌ¿üêôÿ ÿ,h÷è÷á]Ì¥g_E`aÎ~¬=ô&MûÞÃ"ùåÍ;LpFlOúŒSHK€êJ¥ùße¬=x[NŸ Çn@ÀëûÞÄ"úÌÝ|Ói8ÓX¶°bí)lbçT³@ÍþøÂ«ºzÀË Ïó.9ÔÑi°frÝû1ex¥¿höÐóa1³<j§l]z ÄafÈàÛôÙÚõ Ú¶e`dk©à8+¿¡_©!+×p0e?3šFe®ŒñŠŠÔx_firK×1޵z_PkA¶Lút,õú^mÁÇÛ7ØRðgvíµÉò¬Ú5v/@͹[M[·Óšïy»çŠÎ+kÖnRYsokŸOGLB*TÝÂrÙZÚ$QI¢ìGd¶~¯÷Õ>ïÑã¬5[vûöÙ kò5ÒÖ&'|øá¯M=t|t¿1;-\²Ow»ÇÜr>44 õ*C/0õøÉÓ5YÖÚ/Çre¶Eq·'£±ŽWK9êÙbkª+ {¿ãiÁª»ôÛZÿû¿üÑŒ>=,m I×ÈsÐu-¿©œÔg¯öè_§² ÿþ׿ ]]ÿJ0ØuQ@& Îéîï±>¢S§? Øg1»âFþLÏ@qÌhÄÑ`âðÎHýÜØÑÔÉ1[îÉ2|#GQ$õ÷Áðvf!øPÒüSË?Nû,eØÁüm©úE.ße\ÇŒü(£@k/®·AÕÏ +@ee X0¿{ ct€ù7Æ!/Æd€ Ó@@eós¹,eé HJr"üPJcAIB>ÐÍ?-Ô91cüû³,áX¹vWÿ1ÛN#(QÍya( 4 е'Ç`1³ÿùKÎ#*g ~ôÃ'Ò÷6fŒ9ð8+nѲ \G3³K."qáY$<;^?Çù²GúsHMGþ4Í`¹ KŠÓ(0uúA€1P.àwJèP°ørîc°¿ekà?©d³ýÒÿ- 4þtÒyO¥î_¬ÑÿÓ¹ør©ýg}ëyT®? å' <ìGÁX~î1Ïw¶mîGkz(°·Pü-ÙKð¯Ï,úÿæêîÿ/vE< ÉÏ!fú~®8,é·úàU/;Î6l`RXn0yÆQaæÿæ0ó¿l×UŒNzÿâíWh HC@EÂ5¶îþ³ºáfŒFóÀ,èjöšÙ_xUW@SeûÐa~áå±ÕþðÇÏ'*÷ÑGã"5ÿÓèJ¯ÍL=oW(?Òð@ÛMžÍ{õœôzÏ_ŽuޝA5¢5ÉHò1 $iã²ßç:vÅã'õØúÓÀÙó JÕ÷ÇÚÿ lÍ0ãÍPV1Ý0stÍÒ 0+·è»÷h+`¶HY#km©þ¶ñ¿/tdÖ42 cÅÔ"U0ôá¯ÍÁêi$0Ó÷Z·úßFSkØ@ÍÞ¹[»÷÷Gç§ÎÉþö·Û×sÍœýü®òJãŸRýÜŽõ¿îœ<]»ñÎç+ùô?1`æ°#1#zµ§qoÔoìM9'óÅV{,ïßfDtÆ[×®[]Á6R RGç>W¥+ÔõÛþÿ@ôÎÅ:±{K=7lÚfoµ¬:p?vrÕÞÖÛœßÌ»À{?"šjgé^ª@[йsç/2ÊOœjœýXYç&Ý÷mMuÔvKðÊJ-ÇOæóüCÊþal^㺜ùÎ-ìØµÇ04ükÝcäçakSÇ(%èšSI·ËøaÙÆ Cêür÷Cõk_cÉbï;pžÆ,yÁµë7m&,ÄÚ»ÿPßÜ^Ç! ²Ž·úR ë7nÒ ÚÛSTÙÉ^2£úºþü_×Yz/¢Xfoiõ¹®ó#üË9Áö$×.þ©owíÈ`{â©÷î×åý:þÿ!î]nPÏ|ìh:êÞO}ðšÎHò^H¡±_6M÷¢}{Qgï¿^ÏaüàNx"hxì"²Šm ÜF 3¹®¢ºõD°goø¹ôÀx¯þÄ`=>Èù4ïËazÌH eék0É«Â|úä`5Òý£é!A@ þYQ>ðÂË#:"ƹô%È¥yaý2 ²1ÓUÑ»1SÑ®í·éðtÿoѬZ7£&Að/YŽÔŽg,:G³@êîç2°_H£=jþóÌ«èñYÌü§ò³žiÔßOÝË%pjôãf@ò,2©/\t öNdNÛÕ!!®ôvðFÊê¬=÷"UA¿13Àf BYA:3ðdz]I³'õÆÖ³šÜxù4ÝKâogÀœð g_èG Š44lÆ}R_ù úo¡ÿk)¯ŠÍ[`(+déWu Ì¢ÃÿëGobæÖË4<<Äi æþr®ä>0uíUT¬ŸÌRçYÉ%)(gÉÄÉd>>Ãÿñ?銳bÁçixÚ)°rrV:¥ú[f=ت?šõÖŸ{ßÁð3Á ÇFÅ%Y_=UfIºUG2Ë`G\³kÿD£êì*ã(gY¯Ú©x*¿¥ !"6ÉÈnKÏÞïé3ËÅò[K}7eåVnoj@ãa£ŒLõ5pãæ;º~ÞùË_q°ÜÂR1œfï- ~M×(}P¿iðh«ª¿¯ã$]·ÊE³ÿ Ù^+ói&3kY*Q6Yq5ÜÝ9v ×Ûóй`¹§Hþ²s÷^²L>þlÿùÏàò«Ö\;O-ëÁ`åÙ±ª» <}/|tt¿ÐçúûÆï~_³"*¬ÛžÙšx`ÙË9nm©ë; (bËXÐy§Ãcc9ÎýÂ<JY&Ý7?øàWزôÏähvÄvª~ŒtÜåb91ÏÌ··»Z·W±ÚÄÀ!°j<oy ø7n=oÕÛ«çYjV®ÍSýR@çiõóY%ùtÏéák]|öÊ\vìÄp£ÚpÉ «·ÉÞÿZ·ñééaoÚ°y«AÃwtìôë@¿BìÙ>ßGŽßÜ,_ 1ã'ýZ}ßlµóÙ_ÃÝ{m6OÏÏ#Üñ'~?õ|ùÛ?z 9¥6Ç}ÀüEßhÿóÓgñµj¬¢gÿ·üÔ~§6höÖÛÖEkëûÿí=]óšœO0,áÔç *')ÁÊl~éñ*¹êΪ#0Áæ{ÃHÓ÷ŠTåÿÂF!!E±c*}E³ñüM^'aÐLúÿÄá1ªËpéòSôy ίB\^C+$ÑC^FdÒ0¿òéËÊ£Ä0÷è ÷äÙ¥ÿíÏÔdƱ*Af()(NDEFaXÀ >ijâèG ¡ý¹CÈPC¶J'AŽI¬@ÀK1PœHGýCæ&@cfÁLxFžï¡G_:,]M£¿€Ù€¹Ï?If},¿G×9ËÏÑàñŽð)³ÉÉÀXA:Aû5ÿý£&¹4õËfI¿ÔÉëW² 7P³ÏÒüÓª$`ŠÎ.É ú·_gÍ?4Ê ŠîfEÝ€Ï_ÄlRí§md`M*}ö£Hå÷«N ({ŒBŠã§ÿûj¿ZÑÔ°ÙçæbTþ-ö¿Y³Šh{ÿÃÏì%gI¹A÷a!KøÍßû6Ë@ qWÁjd9Ì:j0ò)È€9b.Á%¬@O¢eg>ýÿ$J^? ÊuçüÓÿ`ÝiÎgX*Ðé`íÞä¬õJµ÷Ìzð)¢÷ÿÖ üôW'c<`ÒR¯=|k?@5=ý_}XuÖÿÕCT:@³mKßÕJmVÿ×å÷,ôâsë1Pà1{þbö¥ýºÆ~TÖþ®œhû@*&h0ê7v¢ÑW:fr7ï(ËdmÒQ:KÉÌÔ> Ju|å`9Gôº.U³â²ÊÏ2_ÖÚfyÏ Xzâöòn®3ûÕš©ëRç®ÉÌÊÄLô aQF}pgÒë°\fZ¯XC žsX/Œ:³FVéÁàýÍÑútn«}œ9h÷¢$ ($º&µ@ªJºÖÌ\CbÈ£ÄõytA ÐÛáµýøÿŸÖgúûßÿÏ3Ý/uI2-šO[lýFløÓÀ€öEÙd?ûôØ VöV>3uœ?YαӌG ³5©@ôr©ê®ÝçêãxÞjœ dVÙÞdÐúÆãUÊsªÓÝûk={kþ³·ÔºÄ:t4 <KN7ÚQœ-ÖÖþTÛ{ `æ÷˹ ª0è8š¿GëÖºÆA^¶&ô£Œ¬ ÀÑ3ÎVA÷5m£ö~š_4v²6i]bA)YSûwÚoÝÄ:pNÖ{@²QâÓ&¹#-fn<QG } ûXG0øÄqÂøGqAæ$?ÙÁ€ÑÇÂèÁÀLþØa]8€3éÿ£èšÀlŸ õú°2@O€DÀ~ÿ4±ff?;Ìaâ}û¿DŸ7\z<Ï|(r'¹`J"]ý $Tf°Aâ\ô÷FœJÆ!¥sÃi耰ðÞœ^}©ÑãØÙÑ,HÏVdÓ@û\úÐܰ?¥Pú Q^=hX8Ì[œfu§Yºý\"Ðè^:âÓ°13ÿ ïmÒ/³ôݬM§0tödjþIáOi(ó/ úølÓX ¥ù$H }?cÿ¥'ý?jÌÁRtúO*ßÀê\¹Õ ûg*ð»`Á!úa}ØÓ (€ú¯ :æzs1óŸ³`6iõUÔâOeö¿fY( @@:þžìÍpP>þ3ÿ4ÿ@Z¿Eÿ¯åí`ÿ6õ_¯5Ë'@,=ñ€OßLÃÃzôÿSÞÂÔMíÄWîCt9YSÔJ$æP~0çÛÊvË>ÙÑ<ñœnÏJ^g¥5,°\`ÅêÂy*eÛOÙfrY?»ÿûßu±@Ya=`N06ÜÍçÚºŸÖL3ßUÏžÙjºŸ£2p*_€ßÖu{uýŸ¶ÑôÒUk7ØjR÷Ð ¥T¿[{è[ÛµSA ,Lh œŸ#É£JúóÓŸ¯¢ïµÚ'N¿ŠlÀÌäjöÒÝ6È ÌÄÄrþëÚP ÿùùÞÁkÒk¶üÎÞR÷;ÑŽG2PFžú4wÁOY æî;ºöLj®ýÒR¯Í^Óú}ÁÙ€;Û².Ñï0Ú;¶Õ?³Ü/oÝ+mçÉVªþ[[ÿë*ËV|p1p)HGîj#X޵}3ï«b_30üäß¶ýqtÞRmÙŸ9EŠúÉL;«G×€§ÿXš¢IeoÀןT_§åõd_§·Ïxf~¯õè{.]¹b·yNÀn÷|ã>èéò~ÔÔÇÑé?2ÊäŽæÁ²ŸÙ!Þi8:ü ÷á5ô^ °_wøö{¥q]4€q`&)ÔågNr£Ûÿ01ìÊÀ»ÆèÆr~ÃÈ8D3¿¡û 3G%U$Mù>+,*OÀÂX€Óo íÉ$œ?Õ*Ç`zFÛæÎ,>ÍYpôšÞèòÒÓðÒÿwF$0n$Y^pn1×AC1A ò3FÓ; þeÀqÃhRØ1þýèy« v$Ëôõu %þSÎ÷4FëoxæïŸf÷£?¥Ûô'`_@¹ßg±2ü¬:Â,~>ÞBÿåÎÙ;ÅìuõS61øßbèý3ñÏ¢D gá!ä-Š¿3ù2Ì€€@LýzCB:ÛÌì{ñrØÛB =õó ©ÿHNÀÒñÇeoKPûÎO)hf-Ü[èÿÀbþ' åðB§ŸÈgð3óÙG©?9Û¯ÒÄð,ûâ bŠ Ä¡B ã=QöpI2ØOiô*Hc{²æg»P6A9AñòÓ·AVš ¢ª!TmœgÞÿÆ]?_w#`8ÜÍp ^BeiõõÐŽ<@ït©ÁpXtŒMäÛÚ.(œ-mÛì`º>íÔ]A±À;,YÚÙPÖ·kÏ~Šøe_ޝ¢UÿãÿŽìÍå¯~õ+žù<,mÑRëÕ lÐwŒùÖÛ6ÛRû'P³Gî@^¹f}{:é\9É1.(ðöð įj1ÝKÎ0LM¿¬óÞr èzh1$¡æœýÊ ÜîŠ uϰôá.¥ÿ@æÆUkL;:n }Õº/.³@Þ m¿jµ? y®éY"Z»2¹fÇ HsëÝ÷ VúàNûÞò{ÿ1sæÜù/ô§œ7.]ŸB¯¢_êø@mTª4¡=ê¿¥NÀÒwÇRôñî{ÿžá]0ª×³HŠ àôŒpRï0Û>ŠP5sKŒ÷Džç`dP>~<{?Ëê=MòÄþÆ ,¡MœªdD±_ü²&y `Hôïð$Ÿò3íòuüC°dzâ&x"9, 4ÒÀ¯$&~öÃŒ{1CïRýÁn]Ðn&øx %ý±dj&rXÁ|F€üYQ hÆì(1ÊêÁÜ7O$û Äw0"Y0 ¥ÿRØÖd²Jãœåß,L¡Ö>nÊNÑä{ð8Œ,×è4jÖHÿþO¹s7 t ÿf€Á¿qáÒÿ+ð·ú_,CÀÏHÁO õ?ŽýÑàôfUíCüoAµÿiS·ÿTøS=IrcIBÑæÿBEæÌ¹0 2äé/ªÐ@ï<3ÔЫ¢Àd& så{\°#Çe¡íßFËVZ±Ž¡Ø Ôÿ+ïÿ-¥:^ë-ûgIÇ¥N÷kæÆšà6³)eH ·Adé^Î @ Y- ɳY}I_lz'är¹ æ~BÙë'àÖæŒúÖzëîžšŸÂV:må^QÃ¥SÖ!%ÜxSÃøÊºNbs`ßá5 ×ZÊÈXjú,sÌKûøäÿÌg±iÈmõ}×`MLiI? aÙéÖ»ï¿Ñš!|jÛ3ÜÔÿ£ŒüqøÈq³M2Ÿçjv×ÝÈÔ,".±NÚàêçríÿ cÑÀFøÔ,#;[û;Ö^ÛÔ³Ò OÃÓŒç5³¶ {ï)#©rcyEev)ÅjP/Üd,§{îIöú×ÌgZù³,9©àSçßiûw Hò?þúóc0¹ây+6Õp7_ÜxçKÙ]ÖØŸs·±®µ6 [C<µ=7nÙfX{gtÜ 74¢ó@ÇCÏ(;÷쫜i«¯ÕnùÆŸ) $n<Ч¢þ¹ôØž ëS×ïYó¢DsÀÐ׿Ú~ý^a¶|0iúÁX^Ålüz$C àéö2òÙéAôðŠîßá^àÕë%ø ¢d`d7f÷œ°rv!æ§Ó?Ìä¹vÃD²Œú=OÊþ¬%ÅH èO9AWÄøô€làÕäÃÝúpÛþü=1¯< Ù1ÈdPOÀahdÓØ°8qæ%"Ì/ŸçÚ÷E xG9AnÊÄÒë Û*OªÉÓ0îúñw#ªt#:÷ó3ÆÜVmÛbÔØH¥€á/bÉ¿ªSêÄ.8edøEÿW¶ßüIû×2g©Øô`@1DÿWæ»Þ9¢ò³Ž_ÖÌíöß`Pó2u'©ÿû#?Qãó)ÈgðÇ[s.ióY¬6Îì:tVHe=qÚ~~ÌpϯÚ*=U A{fÚÓøœpaÅ[1Ô?-ZÝæÌþ7UiCüÝËìŸ þo öð7ŠìAR4 Œú¯ñiÜfpO¿òµg)s8FÚÿŸÛ@ü ^ QS$y T@ª 0üügÏ?eÙdHÀÒS(gÉÂ)«exí?G^µo$N vÔz]௻]úîÂ¥Ë^NIjfEµ¿£AèéÒÝœ}íFVÕíåâe¯Ÿ¢^6D ªuR,à«ÖÖ1üvCÆÆÿ̡ótê³Z0¢«*ó뜺SDµMJ3Ú€óÁ²Þ;YZkC£ C·º'P³Çî&@-ïý_Æ¢ºïä\×ù8FÓŽÉË]aêܵh]òH æ\&bÖôµõ=ÿµ¿b)N,Ö0GøŒÄ^ÊÉ/1ß ºù5oÑRcå¿ùÍo m¿{\C¿ÿè#cÛ*ß81Ôž÷×÷ùfWŒdÈwþÂåÏ;ÌÁõâÍ=ßè?³ µëEÏ&rªð¿?ù·ÚþXŠ AÁ ÄÚ¶êúÎ-ãá#Ùúf|Oø±4øcÖ>ÁorÝøÿHÒç]8f Jä=qè£#ôþrRç³Ýi8e4ß+N@Þý9dÌÐÓ8æ} ÌüÇÓ/öLfÞ§§ b³ñSèž4È0 ,IË¿¢Ø±.4éY!ÆÿÙ¢þ÷®ÙA#_ ßP¢ø «D)+ Dð³pî(`yÁiþSIïäKiÁ8wÊF 5È@5þ€þç%MD^| béO£ñ_IòXÄÑ ûä0_úÄDaò¬œH€±]lÙtîãmx4#Ðø<þâÊ¢t-]ÿœNuÔRüY0s!ÙrøÈUð¿¥òû³O0CO£>ÅË_Hã»ùÌg1?cršýÏN`ÚnþíA²tüdä-8ÎïrN²ù¿Žóÿ©Ôú'iŠÉm¥ÔûÏbé¿Û. býäòw¢þL ~³òÑ%[ÐgØ8ŽjÞÚÿhÜ¢ùœ_@Z0øoÒš 5nF©³ÿ@<öí'0>eæB<Ù%+U²ï"KòõÌdì5æšýFÖ?ŒlbÄAbæQ¶UK¶ýJ0 }ÎqúÔ pB@þS(¢ h%+(XqÂɰrËpV:¥ú[õô{õN1(ªzššËàHfiê'Oùìêm«Ëÿr²-¢êûÊl®>%Kà/oœónýL5øŽ#ŽùÅåxSõÍ>êXip¥Á¬hλ÷Àÿ4l=$UÏ\Z¯%¯ë JÐ ú<9šRÆç¯4öªÏäjöÚÝšõþú7t¯.3ë:§êr.éü{ÙÚšøJG®}Ö¢ïgå1sßÉáýÊ ªZÉÃGÊ'º§éz2{¬œ?·ï=·µãéÙÒZvÌ XzâöRtï;€ÎÇDZsÙ üݳïàgYg±ÍTcþE€:¿j¿ê¯u,`ŽW¿ùíoY¢Êu=Ôå<» ¿f<¯õlªËT@ëWíg;Igû€zÙû_Ï5]K2÷<|Ô~É]³û¢ò{2Áæêm<cÌ&®ÝN1å§ÏÄp7oã«njŠ-NÀL/}sŸ#2åQýçÅryœéÖÏ`¥öâŒûQëßãG1XõC>õÿ!n}~µþy¬PÈ`zÿG@(€¡`F7JbÇbþåôéÕY!îHŠ`°kºýSëÝÝè!0scÂm÷|þqêù<&žõ2ª Óš/ÆZwòža4)t!Ñ|úþ$zD{ÓžÚýqÃ:a ÙU ñµ?-å#F #tT_ [ßà?¬³!Hðë o¶ÕÅš*à6°KöBK?õEɬ']º ¯õõgVxïA3ÊýFø£r-)ë€ã§36A?ûLôÙ¬q¯à¿ú, %õœRßÓÈÈ#HGœ~æLÒç«È)ôÿÌú3ðOÊ:þt2ùË ^Þ0ÎcIÚ¿æô9Bð@>(Cr.ÿGPA=þÍç1mó:ò+»Ns@Ø€Ü'q14æÏ[]F¢5,éךYËÏÊÿU§þ·$ÐÙÿÆM³ü÷Òð§hžÑÓRÉ«/ Æ}ô2®ÜüÊøGW@ää}ÆëXJâ§aõ#l«ØiÕŸÉ'ä.>É>ÜAÙÿSô8édX¹m8+RýúZZr:ÛŒ6©ÁIõþ×ûF6ÿË û(K~ÑWo«£ÿÿ{ßWynžÄ@òôÈMn l0î²,K²zïœ÷2Fe4ÒiÔ«å"÷cÓIÕmH 7$ÜäeÝûàæí·¿3: =`ÁýŽÖY£Ñùg3£ùö·¿œ%kø'ù&ëì p€1Š _äåÅDk2ÖÅ/&RxÊÀpÆ·02Grz_{Í«vê9'º_È1E2L¿XšOvyɯ4k¢}Lv`~äñ'1žvÝý}žËÏ^§š4ä>ÁB^çüÅ+ØFéÊÌŠ¯~þÏÿÿô.ÃIYRäªws]ã¿LÉ:åvïyáMHeá+eŽàL~øæw/w9ß¹ô*cŒàí·§ö;h-·í4 ÉÉÜþÝËæ!:1¿ûýóíâc»íÑÃO¬÷*3Éì>»îŸÇÞúÍó&ÃDÞóø`U|i³Oqgs×8ÏO9Ç P4ÞÇ|ËýrÎeæÝþ¿²KêDòu÷ C'û<õÜ4ÏKy$ŠåŸÇðÔýÉuéKlŠDé|¬÷sGÎ}ïg¡ÄÊùoŸ?Ís_Ö,ãTþAÛìèD!ŸòÊ«=Í€· F%áýpã!ïQJ΀X8÷)çódÇVn5[ÎJ ÀD¯K€ûÍN®%a*ÇÓø,âçó³È<ÞrŒäÜóœ¡Qü]÷S€³-Ÿ3¢Î¢Úü¿2~_²?9Š¢žißm§îÔ@FƲ#)Æ~ä°q,ÏW>Œ&ó¿Yó?ºf7y×Ý÷>ïYÐ7.`îö·Ï=¡µ£f¯Þœçä>9ÂHlßu¡2÷ã«Ëç~÷{\¿{¯A|_~µ÷Oô?ÊÄTÖ*ë÷š`*IH7ß~ÇIñfmòüQü0Ñ{ébÆòÉgÓd)]9Ñû\>W#â'\ì«MpÅ{Þ»²<SæOü)¹ñÿÑkj#£óEqèŠß&FíÇ.«sö)!ìúG3N¯®þ¥Œß^"JõËR°®öXŽä3ŸÏN2Aºî1ð°«îäí6àëfÊÞi¡êç°ãÌè¿h4åE¢ËÊ}[êâI2 'gøûì¥4ñKåžÀbc¿&ºøÛ8¯?@o²ž $.üFÕA86vXÐÝoM45ìo RJÊø20Ê>gvôšçcSXÉõeD-FÈ¢!Âï ¥cÍöýše[<VES0³šøü¿<ÇÈ©oãLŸÌü·QÖï¹3þctý hc1kª\ôÿ°Qwì³;>Œmù·ÑsÀœÅ?GD}pÈH p¡;ê%Þ~²±/Ü&÷µh¢@;ÿ #@×ü;fôß1¬aÒîÇpág¡m¢`í(wïåwŒÕøÿØéÿsŒóÿ欿(Îç6{U$ .3jYžrq8zn<Îú;8Ë?|ËÓT¯©£& $ü.*Ö?D#ÀYü?DàA*6H÷ö# #nÊÖE``/Óö%p÷<öOÉ»Îw/C )°<ÀܵÄcýê×Ï`ÃmWl0ëå|ñZÊYÉîàÌìVÊØO<ýkŒôÒËæC?K)E.äÄ0¿|[¬c¿|lM²®AáÆºJ*j1B%Â}ìVHû#ÎôGÜÌÿç§Ü€ð~Aï·ùböìæ<ôèa#Ϻ¡Ù) %5@ŸÄz±_m|1cr|q^7 9Þ¿}îw/ýûûíþî{ñÅÓŸ[Ø kv¶##¿ë3äñ"*,èl.j·- ɧ~5iÎù]Ì_þòW<GlßïHQ.DtªNçç¥_Æÿ÷}y~9ßzëíBœ!|œÇvæN9§§ÂCÖú</o³ãq:?¯0ûŒæÞçø£1×üaão/Ÿhø@¬Ýb€ADÆñg&çžÄFÄŠT€,qÃF<røÈIÑ}=|>eqØ7ŽÖ ,}âŒ^Ãbþæ[ï øÁU(âP.ïé_ì?hšä³0>5!ÑÆ°÷s'QIHÉÌ ÍÛwáþ6?NWñ"æwSá.Çÿ:šŒGäê9äþÿâßOÉkb$<6Éç續wÄæ;õýŒúêkø÷ÿQ×5¶É«Bc£I-¥r©Ê^üüýÆqÏÖÉ~DíôûçÇNñÊc+Ýþkù¶2$ Ñü_'÷ðúxö7ï5.=À\ÓËüì~æ7¿ÁŠm; ó\ùÿjŸä5ÉÌ»¬Mkå<,ÒÕÜßû]) û}üc=wþìn8=]ÆØ_@HŽñ@Fhä÷ôÜbÞ×MÕÅ/ÏeÁù£úá¿üõãÎõ7îÕÖjÄ?Êy!øÉÿš\à*d¢ÛÓcýb*x&XÊëyë·ÿ œä³CüEÆ¿Æcð~ïs¹o¢Ù×ßžOÙ÷DÏ)Ù²&ýâw× ëPÃŒÅyeJ0Ü,ì7±ÞN÷þ<ÌùqtÎg§<>Užq€þ·U³ãÞÀûtxØá· À[T¹aY\GÀM9¿òú¶8ÙhÈû= ØÔÝÈ=cq4ùKÆë\'(CQrJh8謀ñ_Ç¢`É Á°«×QC">à*ÿ-`L!ÇJ"©PXÁ}$a÷QÏÿ¢È\ÊDŠ P1PŒ Õ),äŸÚ«9æã K£êä+ãw9æÿË.Cvz$ú7ü5ýûQÕó3DŠÙØõfÒøÿí ŽÜÊâ×ëèïŠßÃBÕ#²ÿëYøËÆâ^ !ÌM¢[ÙÅog`/<ï»Ùù÷lf÷óAŽmañ¿åÁNI}ùf)Ù!×|¹lÝB×|óçe+ç&È&W/Š{#šZ8HÉ<]ÿïücô¡ÿf®&òÍ 4 lÎ;»ðÅ×ã{.#ðªXØóR3êOÃÅÿÊÿå÷pþWÌ×yµä!}{²~ñšaÑ/)üM2@F¬$ÄPY 9¡(T=ÈÃÀ>ñ.8N$î;vf³IÞèâðù0Bþ±ŸÉ&Ò1zýõ7 ·|Ùër»ÜÿqÿÈ QH¡m®IŸÊïÆºxßGùeããxœ«|Âö¿{ŸNÞ._Â>î×)_>Þb×LÆ€sÁœopœoëìÏÇÝÙx,Ðÿ é<ùz®¶ŸV× N}NIáóøœçžßþ},ï97ÍÏïgÿ0ŸÉçñ¹ÃÏ<ï{rü¹/;ŸySñ×Åi>)#×è>úú\ý\ÿÎþ|Ên|É7?äw9€»ÿa~ÿuò çs¿ÿëäøOô¹æÀ\§÷sÿ·\Û¿æsø0÷%³|îîãqÛ>ì1¿ßÓýýÔóbüäXçÆDÇòtS÷ÉBà»ö¡,%úØ+²» ÅTØ2Ø=_Jºüsë°€¡)'nÿEµ·Ð=Š{#NÜŸsÒqÝ¢ ÑYL ¯@~$ ¢©nzÔQöï¡QßhW-I5ØÒQ:ð×fÃ^[¶v¢|ýjöc[WzêRà¬5ÌÛ(×·æ þÆFako6vÖ œ&c©ÆB~ô*š@FM²?2æ"#è ØÐVœÃ6tŽh§¿À®#ãPI€4£|Ýùñ茵œûQÜöcÄå¶Q!gßg"02 ko9ÿ£,îå²õÝ4±cØ?oñ/.ü楚ºIHæ}#ýÚ¶ÿ7pm"yže?ãû3õ$€C.ÈäÅ5_ÆrɹyqzBý±~5Ã÷ãkn{ëîx#ô(èÚÍÇl{£Zf Ë·Ó/¿iŸuÉÕøgý/53Çdþ_}ûË3gãÜóÆ93ñù/| ipRª/$Ýü;öG ÍXáorYÇѺ±úuT*pŒ¢¯A6!Œ¯KFÇzi(D€È6@?G51 øÉz·ùvµJL§/ )JïV" ÝCm]_^JA4°fý§Ðç)Yù,Þç¹¹/ËøÅ'åÇÀÇñ}M|kÖçP| ??Ý»ÃN+~rÓžQHÙ?MZëiÜWMUY_?còâ^ߊÿ<X²Vc]»ýör·Tbg_gõãšHG gòíï¯Ëàü}f4oO@mF ÓÒQÚlØsâÐQŠŽ×f!qõÕð u ìøW¡4ÉI騳sý«P¿% +8³'Kéà®¡É F°ã_² =U$*B9"@ïFf]Žà+hðÄ¿ G'sÌH>O £ C±Þ^Éq8f°aë]hØûÍÊvã³û2Ÿ@ç{ÇÐN#£ŸÍ0ü§ÿÇÍ«î?vÿ]"eçæäÌŸItÓPLüÜ,ÈÝ,þ=Ûžñÿ»H86íga6ÆøÙÆ:ÿÍÒá;ÿvvñ¥X6þ±âÙÆËÆ ,¬Yd¯ad gðGn§ñßo{,î"ÙIDATíO³(?ÆYúGY\s|@]ø9ßJçþìQ|åsYüÏÄçÍÀwãÿ€ø÷nLu>ÃqøâW¿ªÎh¡9aÕ T<ôï=A¥Ácìð?ÈÎÿý\SØý@=¯]+I+ï³r, $DÃzQ9ÈkòúÊÁÉÑv0 ÄÏá!Ò¿ç1xî/Ÿ:í?5ûQ`C©ÀéÝPÀÇêîŠ-J|h8œŠLkH<þÐýtÔÏ@¯³ëzh®È¡ßjD.eÇò~k& BìßÓ OY836æ|±Ã¶RvßÓÐR 7gìëR1ÜzóÙK uîjºòÇ¢*uì,Ø[(åo¡Ô¿1-é©ØÅŸ¢Ô@ä0Úo]·CMZu5pÝxÊXÀÇÂIÿA%4(tW&r_« µeL0AUòJ-âXC͹ϥY1×þËX=¡óÿ +0ÚÓHCÁHÃã © ¯#Õ©þhµÕbôÆýhžéM7!<Ë /~éÛô ¢ùêiJ'1í,ö;÷Gfþw³`5.œI8YŒ ÐA @ßMü[ª\,þ¥ûß¶å <[ØAgâÄý¹8àØÄîüè}F¿E:ÿܹ?£øî?o l €fñ?p ývÎ`Ñyk|Âzÿ7ÆèŸocç¿ wfÕZaölÆûÌÿŒÏ&ŠûÿùçKÑ?6ÿ?s /àõÙøú%ßcãOÑDB¢@';õ=|m¢Rÿºa®IH¡C°h¢ì¿[oÛŚО€}c¹1dçöÇH<Á±%p@Ñ¡[Äß^ùÇŽ~+Å)0êJLÞø%|šînÚ" ÀÉF ñÐkÀtGà応{I2%õÒÓÅ¿2¥ôYt9åiFÜ]ûµ¶<Ú 0PCwÿHŽWfpÞ>åø{¬¥tÚEaô dÓm¿Ñe4ó+N1׺9BÀžœŽ ììªA»óµÉË)Ñ_F?I t D¢*mÌh€1Z0qõBÐÄÏObÁ{A8:j3°Éuép³£_µÎþß0ÐJeA2WÍ£Z`%»ù)az@:¬MÈñCJàU(Ÿ^(I BÇÖ»8MA dŽ +;knž4ÔËhÞšüN|å[sQãZ5·±Ð§û;çÒ=»óÇ®ŸYø§ÿrœvq·wm@ü,üÝ0à!~ÉÛÙçÖ<JF}ŠÄ_s.¹Å?çþeö¿n gîûïaŒàý:a# ÷%áÀ"3õBÈãí»¯ggÞ6úpR:/ãR3o8ItúgÌ¡ýŠüÿ]`¶AÈíÏ[ömPÏ¿vßDè`£!aíJý¹Åÿ:®UæþÇóv!ävà5 Ub9ŠÐ*U-4=tÐ`ÏÁ÷úÍL÷÷ÕDZ>%Š@Y )Ò»#°fßþþ\Ãu\$ÌŸÜÄí¹gpDG||Ìtw§=ÿ]&øò<7÷õ¯ôŒžã'wÞâΣ8 ëS*gÀ?èW±oË)/¥Ñ_MF4çãPFÎÃ7²[ï¡¿-3ÝåH\F§üØ@ºî7ÒÑ¿¥1íwÓÍ¿®òŠÄÂÅÈŸX§DÒ0 ÃåìÎÇ¢2ýÝ5šLòg4`Z9&0H A[I,cOMCÀâD4Ä3 `5²bü+#ÛÊ"øž¥4÷[Òkжõô(È^9u$2!=ÉéáH£z ;| ]ÿ9Î ÁæR̰1 >¢ÂžUô3hFGSt-âÒ1pçÓ)QÏj¹á9X°*rý»ÐÏÂÚs#gþ9ËßÉ¢Þ,úÇ_º)]οÝkù]Hÿ³œŸsË}cÿ±óÏ®¿k¬øGÃüolŸßèþ*^J÷ß@"÷jö£fà^ŽonüÇØ-üO {7# Y Iò8 ÐŒéQÊó"±šÏKÐØOsHÈü¿ùæ&i3gÎ`B óHÀâa|.vò7ó5²;ßI,\45l€a< E¿M\ÿYèKÁ?~ûdkIOÈïvbèæhÁg?\ŒëŒ>QU`Ã¥ÀéÝxåWÇ|qnöõöGº:KBVùø éîNRB+É€Œ¯ÏuÙì÷Ã$5Öðáð!º+Eàã@AAO=öJ""uåHX1!+PkF(¬í·q6Ey#ûž¥W ~ùUôÁŠÞVØ-¹Èg§¿415iQ|LIxvò#ÐZE5Ar0£ö(ǧ`5Üàª0È ¢Ølï²aœ£²}?Š,¥)_"ª2ÂÎø¿øUó9:Hò ä×COÆøÀS.ý¥sÍÑK.GØÂ˱òï¢,i5bÏEnôr&T &3õ9Ñh-J¢W},Y°€r?¡(¢º 2#1«")x"ýæ!¯°[9Àâ:»åf$;QhEß^ÆúI·sÿ"{ùÿD )úEö/$,þÛ9Ë.ÝýM÷Džå:ob xã?gþMù¿\r)Eýºû(ãgÍË5ûQ=p¬ÐESB!d@H!\åkÛÿÕS¢/@eß/_Ðs2ÀšC)øEú?^0³h(#sž e©ŸFvÿíT04¬çÜ¿(8ç?äíðK/ ŸÿÒý7óÒ à(cRü¿·2µÀÃÅTþ?á'ÂòîJŒ þŠ(" |T(ðQ!«ûU>:^yù%ÜŒyNõÕdE!?.µÁ(âÌ|kf ªâaMKF\5š£y_NÔ vÒóéÀß>[ »ìÑšJ Anðµ(YKr Íþ"qݰÓ/pVŠa«tß·å3! ÉEè¬+àŸüØå/C= üžž«sÐÛ\F3Â(D-ù>;úÁšg_qB8ª°{ŽmLºËÑÍqLÎûG.¿¡Ë®AfLú[«8ÀŽÕh"y Ýÿ¢èd±Ã_ÌhBzHD 1NPka<}2PìHØÜp¯û gÖ÷#·eR-ѳëAtî;ÖÝÞ¢¿EýDx ²ÙäoäÒÉBܱåÿ¿4 ÊÜ¿·;XüK¡nýѰOæýÇò»Èÿ¥û/Å¿lu#±w¯AØØeïáHÌÊ0°Oô©g($öñåö-GPÞósÄöx=$àŒÿmþ\ >gþIx·Y% ø,ãCi`øê7R Á×ÛÁqU ëy=HÈÿøâÿÔî¿ÜolA BnxG$"°~2 dÅ'4þo²wŸ!3v»S€w+" (>@@ š»PÎÇ<Dé~ÜlÔæ'ÀÿË`YLŒXdE,GRš2£8ºE,ÖkYdov±è_J qšc·¿f~$ £¡}ý ¹tßOA¿5ùlÌ£4Õé«Yš#/a%ç£<=©!ËÙD÷Ù^'Çj9¯_Œž@ŽÐTÐcÍ ³,ô$š/C{C ú\õèmFGì%ò³f3êâd>W*2é'ŽrMýžVŽäðŸ42º°.£LÓÕÏÆ»Q?üÆÞNyý]žå8ÚYÌ»€ëOé¿tõOíþ·³Ûotÿ9ëïŠé_Ç£üÇKÌÿBÈÆ¢>NÿIæœÿ"Óo¥©^ëVÿB°Ø77ñ0^¿£ ²Éìíó yàÃÍ{Çž=ižæ{v1sôôdzzù_+ ²Î!#_œx.fsî&ÝÿÏ¥@fþEpá Â$fq,`æLÞ7ç|Þ÷yÄgTSð(7y£Å¬¯fõ¬c·_ €øíBß0ôªä~S`¥a $Å? lÜIްð¯gbA' íþOþa ÀäØ÷(0@z·" ("àðºEà, ðÆë¯aï¶a4²kÞZ î Gsæ>Îÿñ[«Ÿ÷.º«)±÷CWu*ú«QÂT «i°çì(£`}êRV£$z!£ wõUšçÜ~[q€±õÔ€ÐÕI$ äù¯AFèb Ä *ZJýs®FIøì°HY,þå/ª2ª ê ¢PÀÔôÈôQIÐZEBâZ4d¡¥4DÂJ#Õ u4ùk!ñ`cr@WE,Í-ÈáèCÔÒ"/b ¢Ð·æ:ÎûsŸ~èXïëºÃèÚË»Ý7±š7 {qþ?y@cþ\Ä{ø7]{%Îö;8÷Ïâ¿rÙâöolìü}4»cÁ/óþ:é}³è7GZhØ,E²Ì̳sneÄ^íÐAÓ4ä,~?oøÖc¹íAŽS/ÌÑ~,Ð[d ÄŸØ}Êñï/ÀlvÿgsÎå¥9ûoH"ÀúHJÀŒ@~#ÚIj4r=í»àk;Ìbßë/ ~õËúXôßh@zÔr3Ò¿áß Y`)èPÃ×ù˧ÿ³ÓP`b\Þ¹UŸúíà{4il»äÒ«àW_õÇé/" ("ðÁ8tÿì*œÿÿÛïÒØpþüõ >ø?¢¿|óÍ71±?dM}?Û¿vÉñ³ÿâ#Z îVŒð_Æ@K9F]m³ÒÐrÿðe°æ%P&?%ÒÙsÿöÊø1ÔR gI»ôᚥ!`SåYÆÌ}omŠ¡šM Dmj0Õ¡XÓ\Á|ôS~o¡Œ£]õèiÊGKQ<ºj²ÀýqN?=he)'¥ yQKéÀ"îÿmùQš¢¿©ÞÅ©H Yf$',GaÌ®%Ü;ãOE»,C 9ŒL KÓÊâ`eê@Fð<D-þ7>×Õð_-·Ñ€O ìì3æE¿2û/$\@QtÝtÜP @»ðmŒìÚ{#ÝfÛÓ0ÏÁ®¿ý'ý7 òw]þœÀ»òéþ`lìþðn±-1{xý~trì`k\sÛqúÐtð#h£) Hjé`Øz~tëf|Þ*ÌawÖ¹çà<Òù7ãÿŒÅÿãöYüóϧ9à _@zi+/àfl_+ÕRðÁ`==7Œ{}<`+ø¥èÀܬT RÀô šçïÁCøé¿Ã[oÿszŒ1Šé*âÀüíÅqôÉã8vâ©É·ãOá×Ïþÿü§lSÀ©w+" ("ðòßÿ>õÿ[þ/~êW¿ÆÛo¿=á>>ÎÅLTÖòŸßžÞ£ÇãÅ^ú8ŠÏ¥{æF@)j»çáÌ£ŒŸRù|Æê¥²L œM¥p±[o£Á^{i meh·äq?òþÊôÐD/*J,_}nò©ðPÆ/÷Y9ço¯HCG}ì,Ìmçs3 8z _ôÀùšÍE_s% Êô㹿tÅ£5;qöcì`Œÿ</ŒÅ=h(eÿ% H]uÉ@4ÓôÏÅûÚ80 +PàŒÐôOõÂ2f€aí»H=ëà~è=üN÷<`ÊÿåR6ýMÆè¢Y`Ûõtáß&Eþ!ÉÞéül:þ;$æ]ÿ^À4Í"ÿ+ŽëØù77ûèè¢Ï@ßÇ ÷ÿÁ}$(®{.ÑãŸ%9@<DàØÆn= Ò®»Ó|æ.ÁgfÍ¡ Hñ/ÒI09üìÿFVU¡hàóºž?YúÒýo¡|#ÇÞ!ä6øR𬚷 `áõZA iXÕ#$O^{ãìÿ8+oÀñ€J|°ôOE@PE@PE`b>x/îÜ6À.?#ójòèÀ¿tÑíű¢)ñ~1h)ID~Ìrví³°&ó8c¿ tïOŒÚpÿ/B!71ü«Š9_yb]ùI PÂ_jxTò÷¢ØÅ(YÌà+ê÷ChäßYI&llCÿ4€YÏœµÛºáªÊB9ÿcýQMAgm:ÜuÙ°æÆpËt¥Qð,šÏ ¡oA®dà*ôxp& cµ°cxÇ/XÔ²#Íx=Ýü»Çºÿ'Þâ_TRü÷ì} môpmÐ;ïÏš?û7¥ÿRü»L?ŠÔ_FÌMn3o·±p7UŠüß[p2k'=zøÜ}7=Î1ÇÐÏK%úNŽl~%((ï¹ùÎp:f7]~3Ï3<Ä@¶wÇf)ç@eñÚê9«ßÊýÛž?!#j±BÈúD sÀ¿MàcjžÉc °°øïÚñþðç'>1õÖPà$8ô" (" (" ¢`»Ý÷blf¡]Kù~uâJvúãÑ[vê8ßkIÁ óTt[4áK~¿+.F5¥ûÁ~óÑã°`×'#ýbag?qùQ€ Pèòø¥|| rB (t!WQ ÁvÖ¹°¡× gu> é=Ð &ŠìhE¥4$¬äþ:i6Ø\æ"ú€3Õ Õ Xç(cºGèà®JÁÎbHPôðµµ[Òyí%Hòâ2ßpiÌ×L£œîÝ^Éûn:ûSV/Bx(õß$L?Þœ'èvÎô³èwqspœSô{»ÿ& #f¡ovüÍKóv©¿DùuéªsB 2üŸ=Ç1H¢bè£$XA)ü¥û/jQÈï7uÞÑåñ¿çÈ ñÒý11@H/wÊ:®§*ƵbîwÐPü_æùÍ¢ßT)ÈõqÅ¿9PÍøB!,ý3ìÛ~ª&ûã§sÊþ|ÿ#»ŸhE@PE@PEà£Aàã±^ÄŒHFé-CSz,쀻 £ÑWÎBÔ$û¡,rëÓ°Ñ]ÊÔÕÈôCìy]y / Á#7uÔasøE×ÀCwÿe}+æ~qË.c~1*`e A «ÒÈe,¥1ß*t9ª°cm7Õô$[Ìñ`4€ÂŒ*HäF¡cÖ8äqÕýWF/Foe6ŽRAPÚŒh8*ÑÙT»HTe#ÑÿGôðÇPÿÖíá\û¶G cœÊû=¹Â_6ÃPÌiò'xÞí(ìþßÄØ¿4þÛ*Ývú ·#îOÆà}çón,ÊÇdúó7>þÏ$€û/$@;íåg"³û<;`ôMeëá({»žý?Lù?réÒõâßÅ¿mfâ@ÝúûPÍð¬f̹àK8&"õ7Üÿ9pòÄr<`/ü<Rl|]\€šgaÍÀ~£è·>b¬Ï«`B|¯7G€óÏëré%ØñçõÞ{PÑs6Ýz/ŒüúGs"J÷ªÀ§ôÀêËRE@PE@PÎÏÿþ9t:P»-YÁhJ §$å bŽH£ÀPd,Døk²8Ï¢U(K¡Kj(²8óßTL =éè±€ãÆs ÑòüWÂÄ0Æò¥rŒ ¹É°dÅõ4tYóa-GyÊ2E-ŠÁ`:çýW£ä@×S¿£$¢VüüD¬X>*:èPOåA%MÅ ¥4 rbýO @GòIptŽ ¡kóa8vFûÎÿ_÷#ýhšÇî¿tþ @1ä6ë2*ÐÉ×v)îœ2÷f^nbìtHì¥ùNJñ]$ŒÎŒtéÅ_~@FL& ÐÀ(?)üÅ1_Ì[6 !_?þ~úôQ!Z·Sú¿£4äÛÀH>ºHNŽpõ£÷£zÝÄuà]L`áöoJÿ 0I¯Ày$f,ø_HÌ {ÓA#®OȳØuJ·_ s3Õæu¯Z@þæ *{ï {ï}¯ŸñÖÙ:Å?±Ï«À'öÐéÂE@PE@PéÀ«¯Œ§·oîE_qzËcœsôIðÐÐVšås¹ôr£ûoÍgÁÍÙýÚÜxÊüa/M7RJ£SUqÐá? ÖìôÈGSY\ pZKQUÖ l]ßî lëk»2*JÛ-,èH4¬DUjóâà¢É`jе(OÇhk»èQBF 6fÃH3ÂÔ€Ðg` rWÍz"fÏ0#k¿é4Ò;]"ý'Àî¿Qäï;öS@IèæíâúïæìœÅ¿aúÇÈ?çFÊÿÇÒõwo?¶$ Ø7cúÄšÏ$D `vÿÍK¯vò¥ð·1&Om'G :hø7pÓäz$ `×aŽðylch¢ã¿(dÿ®GàŠ7cÛ°QP»á~d֯ŷŸsÎ9ç<¢_ÆÞÿÏ€?Üw.>3{c?èôJ8G÷3!á!£»/Ý)î µ Ÿ\ÅŸ&Q`áßKáßÈøÂ[<?ýßWŠï?ÍWŠÀ4?@º<E@PE@PEàÀ?ýÌc÷ãÇ[ûÑS¶,:ó§Â^ÀØ>ÊðKØÉ¯`]Æ1ÔàkåìȪ³·%ù¯_ {n8ÚËã°³ùõÅšäA#úí4ä+OF;ü5$Úk8·ZÍù±hÌ3îúrTSmµuahH-+Ïq-c ±}m;Fì°1i +ä*F\FE.BCF( Âühž1Kær€`9*HT,Ag»B%üÒõ'`Jÿ¥ÐMñù'£mT 8wxgÿ[6bwÎÿ'^éeøí» úü_ tïÆ¹}Êöíy]{óRF×QvÏyûFÎØkÛ#$Aïnï8Bòª6zvõ¹wÌ`\ fª*9NÓŽß»t sBß4þ%tþg0àÜsy=fÏ:3?sàœë{ØþW÷ÝctóE Ÿ¥ÿ^ãvÉ¿tûk8ïÏâ¿Å÷ÿ¿ûÓxóÿþ$¿ÎúÚ8ë@ (" (" |úxëÍà×^ų'Ä{vâwbcO3º ©H`_JqÛæ>tZËiôËÂ>} Åh¡: }×X1ÚÕÈî~- éà©LDK^ý®»8#è®Ì¡_¬)á(c§>uâ®ÁÆnölìÆPk1ýÒóJeAZIDaÄS>Æ` Gê²ÂÑRÎýÙ¹z)rÃPJõA¢RPñ-Ûö`ÝÞ§ÑÅ(œ}쪳žºí8ïx k~ü?Á[càcÆ¥\Ûåz/Í÷ºnx»âè7^vèÙÉíúGÐ}ý£Üó÷ÇÐKÿN&xdÔ²|¹·u²Hû:ä:ïkç<ãÛØíw³³ßNåÆ,èeök]Kó¿®aøæ£è1ÙvûÛI6xIþ-ý ú ÷K_zÆ V¶íÁ²qøòŸŸüe|ík_3¶o|ãM®_tÑEŒïKøú×/ÂWŸþ/J+§Sÿ}\ëãh&)a[{$+\9pÈ(U vúž©@Xõl¿ãnÞÿ,>þ'üç__Áëÿxÿýß¹îO %|¢îCPE@PE@PE@æ(0Í.OPE@PE@PE@ðJøEÝ" (" (" ("0ÍP` ]" (" (" ("àðºE@PE@PE@PE`# À4?@º<E@PE@PE@PEÀ(àu" (" (" (À4G@ i~ty" (" (" (/PÀ(ê>E@PE@PE@PiÓüéòE@PE@PE@P_ /PÔ}(" (" (" (Ó%ŠùÒå)" (" (" (Ÿ@@ _ šûPE@PE@PE@PŠ9JLó€ËSE@PE@PE@P|Ÿ@Q÷¡(" (" (" LsæH§(" (" (" ø%|¢îCPE@PE@PE@æüÿÿç Y@IDATìœç{Ëu¯{þûí~ž×Ç>¶lëØ%+K,Ùå#ÙŸmÉÒäÞÌ9G0çæI0`Î9ç7sλîzkX`£Ñ=ù«çb8Ó¡úîZ¿ZkÕÿp*" " " " " " " o=ÿñÖ_¡.PD@D@D@D@D@D@DÀIP'ww u" " " " " " " @}@D@D@D@D@D@D@ÞÞFÖ%õxHxY(" " " " " " ÔD@D@D@D@D@D@Dà àhd]¢HPww u" " " " " " " @}@D@D@D@D@D@D@ÞÞFÖ%õxHxY(" " " " " " RúÀÝqÓ\×>ù®[ß¡¯Fž¡£'¹Wºs.ŠI¿ 6nÙé:÷ìÆNéî[ÛªT=#ÇOºþùc\Á£ÝgçßÝßË7ý=cÁUenG¹»÷»± ÜãÇOÊŒyv9·Ðÿ&Nã<}Ó¡žÎ¿Äuè6À-]¹Î=yÛ~¥kç·Ü¡û7{ÁÒÒ6/úþæÛnÄØ©.¯û@·qË÷ùç}ÇÚfÀб®Ï Qnï#ÅŸÓ^xöìñ9ìFîîܹ÷ò{wûÎ]?r¢ë=p€;rìd±ï*ò?uí»öws¬ýïÝ`}ëo·~vá;ÊÂ¥«RáÝí¹Î+þ|çOûïÙwš"«ûVß9í@{¬ÛžÍ=þü¹Þ®žîý¹üQÝÙsÕëêµnÎÂ¥nñòµÅ>×D@Dàm' ¥ ïÝ»ïòzr4híê6íàŽÈ+ñªß<ÏÇ÷ÍÚvwe\Š}Íóÿžn+×ÍwwmUªÀî}]6]]ÃV]Üñ§«ŸoÀ18GáÊ}eøØ)e®Ñêõí^ÓÍ5nÝÅ=zôžÌûgüQüoš÷ î±[¹î£#ì:ßÿŽ©Z° ÂD®ßòûµP;5ªøm®]¿aÆÿ÷aíæ6è_SBžrõkÖ®»Ýë;»MÛvå|ÜwmÃc'ÏžzºÚÛhr»Øåßžy˵éÔÇÕoÞÉíÚ{ Øwù;öž?|ÒÄŽö¿s÷õÇ®¡µ[c»ÇðeJÁ|«GÇØ³»«gÏìZVwê_¯YñïÙŸ¹õÍ[Õþ¹¶¿sÚá=k&DÞrúìykçö®mç>îØSEÕBÄ6z«Q¯ ª3>×xHHieh{ q5ê·rãl¶mûΜn *¢¯ 64}ÖBשç W§I{?àAëìXÊ©õq%X²b]m\ P s8äýüÀºInîÄ©39ìñöm0lÌ÷qœe2\å«7ž-;y!¥ªêÍošïÑeFæ>ªÓÂMœ°B~ËÕméFMðú ³Ý¯ô/Y±¶pùÊUרªºM;º[wzŒwu#ÇO¹&»Š íºôs#¢_emöLþÀÑÖþA N8|G9}æœ/þÜÞ¹k4}®k`>äBóÄÙ}ŸÛö;ÍËÙaÜ0^¢Öàù& g>;ïEö]û§ 6Þ߯M.ÈíBµŒ%$€4dž®\»)e«ÌÇ×®ßôn¥ë7Ës˺œŸ¬zªyü78%Ä{FÙÿøQÀíÛw!X`äª$È&Ü2)üæ+«l7C`ÌÄîΜ{î©tMÌ3Ù{ŸËV6nÙåµììZÃé3eÛTßå@àM>;á пð, Õ&" o- )Mu+\·¥¶ûlKsu_åî¹¥Õï]ÿ^Àëï2m@n<1+kY³~K@Y÷-ïöï@yœ+û:{®È öÆìo^®© ª|v®òr}·0BK æ.öñÿ°GxhÓ©·;Zx³~Ó"à]õFªÈŸú&wM"Ì£Kï|PŽ1ÑŒZxÑ/ú¹ÞÀÛN@@JUxhɹFOáöòǺ[·îø#ãò»kïAiÛœîù€Sû,ÒÄ©s|B¯x"*v<óÙ·ÈR0tôd7~Êl·låzKžt7±Æ$A2s%ºäQHµnÓvïîÈà}üYÞ=¥G¶ïf%nwdO$Û:|ôDÖ]QÕÙº3Ù»;O9ßmÙ¶ÛÜgÝæk-îìË9ç-Z^ê`ÞŸ{×mõžV±~óvÊÄ"W8wá[ŒlÍ6Y{ãѧ»BûÿÅKS¯Äsólj\(ZgÎ]ä=F&LíUÅÛÿ%ÈeZq>âŸ<xzðI°ù¢ÍØsÇžáÆÏö9c}¥¿õ×Yó¹u_ŸrèZi¹Ö²\g8HŸiûL[ŸjœÅßòd.[ì5}ñ~@9c±$#ÆŸ»É\²ãÉ¥.X§ WùëÅ F¬»kñÀ¥žàÎñ¹Îs¹í»÷¥öS>ÞýàrL¹~ãŠÿ]<Óã1ã/Ž;m9ÈöoÙ¡wnÙ±bÉÒàëæ6Kâ?âjÚŸ,/ Yòp¬ÁÃ'øßâ W KW;Ü[Ã=D|·o'ßCâûÇÿÿ.·nßö3ÊÃí÷s(v¯;á²g>cÎBïrŒ¿`:öEûÏYž,kËÐϹ',Bb«7Z/ð}h á¶\Z¡¿ìÜsÀM1Ï·/¿w~?ž¿?NÉÁ>ÜSûY"Î`$so8h^kìËïþ²~óÇxjû.µgý®%À¥úÆý>Ì}û DôïKæ©àÚpgæ}ø]£%{LÉÅËW\FmÝ5>Æ¥ñ!nèmðâM6ûèi³}ÂRÁi÷N<`?hØ8·äE¹ù +\ßÁ£ìÞñ|øüùçn%äLâZynär¯r?çòHkyðÈq7{ß>^-k7l-ŒÀPŠ?ç/^öIy.ó5o;ú"ŠþÞýÜBð u#oÏ(JŠIö¶€ë7m+ -8oÏã +ýscPõêµë`Ð:¯·ÁF¹gö"-õ§¯4oßÃßù>ÜgÏÏ=©hâ õ¡TR©¬À#K@4ÕuÌì±:Àõ£ÁÃ23~ûQC7úi³øD^5Ì[b¿šÇYl±©$XbE¢¢O¶ñ)bI` 7nàС[¿-XHÏææÈ íÓmý±ŽèäëwìÄé+wî zôîgx2û¶ñ-žÇ& ° 08lØ*³?/Çhd:í!œsÏ~×¥×`7?g;çÄésJd¡ØœßP?3áÕÖ_3.ÔÄ^ŽÁ«äóÅ+\kÔª£qÈŽOÚÙŠ5f 'ÃÇNžë4·\Í`žëS$€=H@Eê\3kn[*¬?µspLëždÞŽrÌfŒúYl6Çóül?ÎÁ¹ZJ7Iì÷<âÞ«ÕÔfGX&íûÖ·v»ÖÇèkÔïë{Ô ëÜaÆqZÁíAUSï¯íû[è³|fÙö8ÐŒ]«cɧÍpàZÁ»tùª[³aOÚD²®vÈ«Sæ7ôB!G+32ø}¹^Ú€ ÀlÒÊÉÓgmð7γOfß6üÈ"±/$.$'¿3ðôYò4ŽóV°ÇÀßžuG±ßèv) û³ çå/|kZBÀ.o"©Ü7qáá#»·Ð¿Ù÷ õZ»:ö!úF)÷ÐáÚøiC8Nüï» 8òzÊÏÁüÈ,ÎïAþÚß í¿ÉÈ%¡·±d1üö¢Ç _ŽhßÓlñû|hú'+jЧØöåÅ{îµóâTØ>ü¥õ2ÆýŸfc·jÝf/d D2[ú¿òL È!ÉoücËÀ6Ñ~HŠoî·û e²Æ\WŽÀ{ ¶ùß,Ïvþÿíí·¿2bÌG÷MzíÆ Ë:ßÏmÙŸ»èkm²ú§qfø] bŸgÞŽ5"_RA ?×ÍýÂ3¶¬ôû4ol3÷sr[ųðUïç<gBÉP×÷îÜÛûûmròtÙBšš3íæÇÖvŸÞÓÓB/,0-ÀÉ3gœXÄ=ŸC ýÄŠOì÷/w~÷q#/3~BÇÛ{ûs}ÔF²â öä·ÂM-Û÷øðõíÞiš|œž^¡"" o; )-\VÓ%Ûéùö7ÌÔ3èaâËV Ïl0)ÌbBc>ã¡VÏ øCfýfÌèÜb̰§s`|Ïàb£§ð¬L±ç³×Ì4¶Á!ÇgvÖŒâo*ªlÚbV&ö06Ã,(Çà=ö#C9ª|á²ÕÞaÖÃó±¢è¬|h·ÉÞs¯A~@±rÍ&;çjoøKúIÃÖn€%IjjZþ¶cÐʵbð3k`Á²sÌVP·²$ucpÀ`Qö`V»ÀÇàö î4ÌøDy2ÓñJýðhgK$ 1Þ'cyªŸ6«ÁþpÙ`Þ ÌÜa°ÕkìµÎ3gpxA²³€íYcÀòKoúB@á;²·3Û-ÌØ×ŽPËš>·p¹¯c·>ClЮÓ1yÆ\ß6Ò9Îyâ ŸÏL4ç 'ÛÙÌ60ÃýcÒ·fà ~Ã>Ú-ãÅ,c=ë÷p@$Ù»ÿ°õ³®þ7ÂìøÒUëŒÀáÂ@ß 3ñáÆ!ØVyœüLí¹|õzë_Óý¬%×AÅ!bp},!Gßìh;Ù±fÙ×:uæ?H¿³èoûÊÕëfto÷ug1ú"Yì×Ù¬Üj3ÄíÚúcxqœMÌòÂëä«3{aVYÃy Ö¯^ÜC¬Ï²<ý¡þÌ wÝÛe®%$iuëÑC<£ŠWjÀÑ6k¡ÿ#4Š%D,D8¡omÑß+¢OŠýøÌfÚ~æ·öâ@ºx ýõpé¿ÒF&?ßËoÔÒXyæè±SñCø¶ŠRîoã§Î²ßú:_'î»Üð»çsÿDLDÈÀã {3Ï ŒŒž_p]$yä~ÇJÑ{m~ððq·Ö=3f/ò}ßC¡ÝËèÃ<±L¿æ>-üny~¶j¿;a×AÍLo. gÎd»FëPðúÊ¥?d8Ö)k»:ö;áá/3×üZuìíépZÉ4ÙAö¬ãzxnpŸxWŽèÐÃ?h_ä9-¯z?ç81êX¿ ^<kž7Ò7ŠÌïE\î;,}v¢ç¿çèSÜ3Ûäõqì¹Êýd¡M^ô:Æ_× ·bapÊýçÏò¥ö|c%Ùp ÏçøR}¬èð¡1e5ú b|¯ÃÍók¥=7x.)üf8ÇuóÊúí|{¶!>Q.šÅókȬôÔÆÂœ¯xÛ HHiá² 'Nõ1 <¡Êà£z-üÀ±yûî~ä<#pPEÜü]§ft2ó [o|ØàC7)¶FÇÂ`å⥫þüzöæÎa/šñMMÁgÛcEäú9&;vÇwsóËGu[#@`Ì #9ipcÌ: a Ì^1#ŬyÒwÏÃ]»Îý¹®ÈÀ¥ÆB8A8?.ŒÌ6c0âòÈ!0@ÆÄšXœÑæå`ïŸÍd÷·ýTÚuíëþs,+æÂö?lÃ5ÆEBÆë0zëôx¡ PÜ£úÓA b9Zv(Ô·uÛ×xÁp¡ý0ðn÷mú-+³ô¿x߀0jñX3ØQ#óÑãGŸîôͶ]2¬X#º õbÇõ`ÔÄÏw F ¬p=Ÿvø@ýÏÛ|XÕ7àç¿[áx\#}ÁjÍ6Æ ,)XSfÄ 4÷²,_ÜNŽÕX;± «ÐüÂâ¿'ê;ÜÎO[ÂúTf©7F@·ŸùÞ}ÄÒ^üùmÀ~ï[áºÊú7$ä>4À¬ÒêŸßmËÒ1ÓÌœ*iÒžÝöjýï Ñ»wkó¡ýöóf&b€ß»W<ŒçÂÅ+^HBÈb²È-Ãj^ároHµìسÈ?ZÄ$î$€=úÂE;|ž!ðr_<`÷æhÁe&FüšsŒ51$¬÷Yi {B_b1 _3a.~¿ÿ€±÷À ÏÒûªß&pÏÂ0Å EP>'9çýûýœû2B3Á¶ü>égwñÂsç "¢2a$¡ç~ ÂyùýOŽçbŒýß5œ@xù,oþpXwl/[Ì@og÷d&žvÆ?ÑöãÓÛfÕùñ5~_æx{÷1!¥§ßûStìPÓöEìâúHE6«ñÜéàEèwiï©cXðxHHiíšÀÌFZa@{Ü_7<€0NE² ±ö ážÌò1# Î,y|à¶Ã=~šî¡ýyGë¶ FÂù/]¥_õ«iûSwfq¥ìÚsÐ/É ñà !^Ú@ãA^4ÞYêËj¶Ef0öÔo6%ÊÕ6»ôy4"r°³ÍàuY<ÍÂàEdHäâFë]:m0è«I˶¶ŸEšÂÞI<-¢ÿà¡-púD)~Þ3KÌëg¶*úßa°Šå`)·L3ºé§6dŠsR!@¶K2Î12à@[âTæ-ÃÌ,õ@LH:à p!šEî×õÍgzõjñdPÑíÈÕÁï ¯çÀ¢þÍ÷\ikÃ]Í£!-×F¿ÏÖ6[Èr~?å[ïOY=LžÃHg÷qDÜãÜ¡ð ^i"EØ6úzÓמ¶÷-läœOK!ÑæŽke?pü\êÂ6Ônæû;×ð*¿C<žâ¿÷À ã!{aÔâûýŒuæ7{%uÄs ¡3ZpæÞO_H*üŸÉCÃýrÅòGKøœÓäÕH*Wíg÷yB]â%Û*ñmù?¬ºÛœkÂ*©"Düü4xþVf)MàwJFz{Î]- 7׳ÿ ØÒOXJ08|Ô?»8~Tž.Ïý°ÂMßó^¡ÔoåØÁÅ¿ñŸTWî' [÷hoËñ`Áo#. ÕibaK6±A§Áœ#?ê=Àç<G'CÚØ¡{ÞIc¬øys :o§ÿÀÛH@@J«+jTþø$F=ÄÛ1PbŠwÅD³v|Ïðôg%ÝBÙîØñÓ>Š ã n¶Bb4 ?¢Â$ÌVÛì ñr<ØÃ $Ä2Cïg®¬Þiå¢ÄߟÃf(g-Û3.|V})zX0cÎwS\&%1KÂøØÛ6«@ÝxÈ€r°ff6ÂH¶BÛù¶ŽAhÚÀ=Ûþ|û8±ÖöÔ8Mja'Õíp·Æè±±ñspm̰`s¬€B} é`6j]Ä=\<?šYû ®&𣮞ÆÒ7Úûd43wð`F>Ž(®ç\çí;/güÙ#³¢6mOÛÝËe Æg0s0JžŠ€rÕ283;Ï`ЀÈË(î¡¡ÐïpÁÅdö8ú¢ãý ú1®º¡s@&v?رY~Ëqß_Y^8Ìê3F¶B8¬1bBžR¶íùzÓOO'Ž×~¡ŽßãZNÃ(ªÀAvüÒêB;ÈCÜ_E÷Þ +RqQã=žÄéçü8Æ,»§wÜiÏ€Y×°÷Œ8žÐéÓxy ß@Ü&üâUôžÜk¹çðü ÷ìð}YàÖÓÜ·bœ96¿ÓWOúó'Ô¡<K86Â+÷]Oä2b 1H»ÚLþà À³p«l6íF>ͱ0jÙŸ<÷sŒQø=Ó·ÆX_{-^qç{Øç3¹>²g,¹²]¡5ð< ÔDkÌ5ÑĬI!ÃùX³®Ü»É©z(ÜS³å.âÌý©«y(EEîpüø_ q"ú¿À»D@@Jkx:TmBI/à$af;> bÐàCl;bÆñ?-ê7FÆ`<.Ÿ-D.0Sþžþf+<h{á bb9)ž!vî9Ø«ÖÙlzûPuáòÕ6`ûÜ`xÐ3Ð'¡ÏÀ¡ì÷"NIäpNsâq#lgf}[8GfBl6Þa°u7æF¿~b _E`ÐC51èñz(ª§ ÔæÆd¥bH1ÒÖŠýBDÑFr>BèxòðÁ#ÃËuÁ:`÷â3â&aDcÓ<ã{:ÁÕ7£Ãc.ü ÌHãNúbØ'þwÍ!a¥ |6+É ³«å' ¥%CÈ7£Ÿ QÜÿñáUJãqg;bEC¡Î\Ê»ÃÇ%þâyÀŸŒâÙŸù]U@RÄ Ò`hf+Ûwíõ3mIÞiûQoú 3¶x@àqöâ{9Dî!ðû'yXiu¡lCzr8`¿Ào×}eŠfaè'qa2]Ÿ.Òlß¹ÏÿVV ñÞÜsdýoßú4ý7 µ³ÎÔÚn£ÌH~œŒkh7î9pÚlWVÀïc+ Dâ5œïàaóÈ)é5OE¿ÏEÀ£ŠÐ0 ï,ÂúÏ笲ÂP=aÊì¬3ÏùWØ} Ãxüå¹ãXÛBKF^µë·ºÃÆ>X_Æ*>§]ÏÒÖbn÷Ñ}4 `îܹçW®ÄOeŒ÷¢û÷x}Ñ'رDégŒSŒnáÓ ü> ¯H ï' NDÿxHHií `ü6Þ'!|ôµØµm°ÙÓÓæ²jžeb<'%óqáÝcîñígÉó ¹R¢Éu²ÜñqCžhqΪ£YAʲWY,ÇÂÓý{Wi¯ÌbŒ3(ÅÍ.DY ŒÆKÚYvfÒZ¬ÚÄisý^apT_> «²ÀY:Ú A+ãõäÿÌò§ æ LHFtÖ=ZÇšÀÌsRIøÁ#³ ñz¥q€Qã0#X\œ}ù>Ô'M ±W0:KK,mÀaç»]g£YRIH°É0í+«Ö$p
CAÀåY6B^ÒÊëð°àÚH/íÎýwÛ4ïèöŒ^;;¹õoR@Î&䜪FÒ7òb€ÒìýãfHz[:Æõ)Ù;úÏÊžïE ·"ÀfjY0ú]ôz*CàøçÎ_òEy&§Â³žG2ŒÆÆ€ÜѺUÄû\Î-·gÓÕ±úHünàÍÉ&Ù³)Û9ÇŠmxö³g³÷ä)ïýsoÁa{3u%ñòc=ÀOÝ(WlY=B20Ÿ×wW¶}ÿð;üÞŒ']'¢m¶€£4á šxþRŒ'«{ÒJ6~#ûG@ ¡¿" "P: )ÀÌ®Ã<ü^)»}Ì>xð`2bbêRvdQf@Äà=ÛfC€mÌ>å¿¢ÂlåÍ€ö æzOáÁøàÝï²yXò;<š3ª~qc×tfÛpÇYnh!çÎeò0WnÌ~3Kú2ÁM°âRJ,û20 Žëf«,íÆ5#³Á¬ŠA#õFè@àHôšDºø÷J)iEëVüýSoŽÁk¥Œ8®û\Èε{ßAot"^%{d7Ê#À¥$ù2»ÄÊÅùDû^2«7] 5~f?KHàÚ¿;^,Kçî㹚_ ~ßWîÉür-x¯TgûnéoáÕÃsû9FsèÏ7oÞö!ÜÞ4vâN]¯X6öö,ÃuA u¶÷ýãDsmß\·ËU79I ä²qËNJ4ÔŒà¢ÂT8uNVû0éybôcürO*ïý<\?Ç`^ä=!ïÂðä^}ý¢ñÐC\G`UlÛžÀžëã:YÝ z¥®ß¯$`Û²Ž ¢-E@1}." ¯N@@ »šâäS6Íú1Í\ý(Á;Ù¥£qÇIgÀéRO1³°Ž3ïÌkcƧ·egfq~Ëö°gŠ%ÐxØã®Í¶ýñÄd¡×m& ÓdqlpDáÚWÊbéïý/ÿÁfe£äçöb©<Ëj"Bð x¹Gñw\SYìÀ0Ø2йO²>2íF>ªðŒ ÉŸ1¡ ²Ø9:+¯@BGr_`H&%Öäeò_`ÄRägbNRHJŽ®FÉÈ¡Ê.0óñºéîEÂP,¡ 1ÀÌàõ·6)ñÌ2¯ÓjŽmǪ"I {U&À#àyÀý>j0Çëβ§Úxß·¬ÿÏUàž$-äy1Ì=7ýÌ£Œ*Ñxû±:ºMxÁL ±©ä0>0*ÏýQãRÇ€òÀBÆÆ[Ê ÇW0ïñÆNásàÙótãñ¡A\O4gã< ³å !^Ö¶ü-ö\ c ñÑÿE@D ü$€0¬jãøÈÚfÛVŒ¡n3l·c6ãÌ2|N¬:±wie^á ? aP'nX[YbV)"1MLxpÜžuyL*ö%ùº÷ZôõžÉ³Ìoé×sÉŸŒarôÄé~Šx^Ê¡#'|= ÈÀ1.³epÉd©84s-aÚ³ØEf©Û 7Ü×îÏ̬o<ÞïCá;!â5u/¯@¿cÀ;,IÃ@bD'ÂBªÚ,IGØÞ í€b©6p%©b(&ØxÚŒÊ2vi«poàÚi뎶@Hë?Úß+X!×"àõxáÒ³»I %ùqôMñ8k9)0t1(ñäI*žó|à^Âoµ2KYŒiø]!\:|Ü,ޱ¥ã¹Öeóä;~òŽ¿bô78eç~Ný1ÆwÎäåtá¹ÃÌÆ3ÑÀœ;[Á]Ï9êØÎ³mOQ}Kr̵GO¥]Ï_ŒzJêÏœöçÙJ¥ ¶Z Ïxhë¯À»B@@JKWµ@5¬ñmd±{¶\ÙHbï1Ü1z %µÌe ¬uRL6ûððç<CFÚr6ë :dìMšíÚÇòG=ý ¥ùÂ)±ø€wñwO <©Çuº røè qÎ{ÌÌÓx,üŸfcGâ¿pNÚš¿¹ÿ\·CáøŸÌÜåÂrÍÀÒ[Äq"N° DAšemz°ÑâÚŠ²rp.Ä 23ÃÂòIõÄàÇÕHù)¯@X3vÅèXná2ñB{M°0z¶ùÏUvêáˬ¬úZ¿ILnܺeýÓ æBNpý+JïE¯LâК7ç(¬Ûh+XÜ4ÄSÇyýF$Øž¥ø%Ûò{gÍëz6Xç>mY®ø±+CØjK.ä_Ù[×O#~ËïZù_ð íH"/«Ü¯j6°egŸ-àäé3öéá ¶#æQVZá·H1P4;^hÉky°nm+힯ú}YÎÁ¬?Kv²09î þÙyv²MjÖË,eDzŸÑåìØLßýØn±WûPÊs??dÏREx€áu/3`èòì'Ü/éñí¢ÿ?e"ãÚe€Íàã/{÷¶çS3 ã!)!Œä¯\±,:tëç·x¯D'*KàÞëœ0¬=|nŒ+$€ŽôëîÚ~ÄË1sCŠiê¿}×>Ö»ŠVãúÉ,æK ¢È¬\ן;±ÀŒûîüÂ>žElQæaÇO-võÊVÚ~ Ìx ö$áÛìüšø¬oM¶wf/éÎ$c(aàsìö]ûúC\$·îØmÕ~é'Ì<fÑÉÐÏ ¥®)ÿ}öá$ÁZo õG;gûØ,7.0Ìq^¶n«0£Â ºïK²3PŒ#r8ö.KôU«q[?#AšKádFÃmQq,exîÂÅpi~¹@f4*S`$2<3«Îõ±Ÿ;Â׿eû._'þ0óŸcwfÙÆPÉ«öËJZLÖZnú-3HèX*ñ oÚ+.U À5Ž¥òÈÁoþJ><Z¶X?-°÷x§Ô¶6Ç>ŸAEÔÁ9 çnËÒV¹Ää²/ ŒéøåôÉ[/fŒo!ÉÏÁ ~Ï ÐÚþ;èÅ=¹¹ ÅÂA8~¶RÀÙ 6×ÒÔ5×ò® \wOÕâþÌoo1ú/÷Œsùß!³Ó*ô>GZ"ËœEîÔ%\7£5#è¶ñÙÙÉõ²uçD6å~Z`±¯Íd¢,.ÿô}Ž%ñžÒ/1ë*³U@xaeî±\CRÈ ;Íçjà<mĵζÙy¿©ýþ9Î6cVL)Çý¡uí}ß°{,¹w?p^~ûÜÉ×ð@8T.â#×4ÉÆ ·ÌÌ&žÐöå~Âó}<ߺôì=â!¡ ç «°°íl¿06 a&|àDÛÓwãÞÔãVt@úä"ËKPÓÆZwöy$IV«"" o; )-×c°¯Ï¢€ìø1ÜvßÿŽ©<|BV×|ZÎ uÙI=3" Ì@æ!ÅZÁ,-A`?öÄù§aÍÀc85T{ê/$ðc=÷àÖͬ-çg,ŒpÆÍ4Z8Ô1ó `©^¶cJDÎÍq[š×Ç`¹j\Ù:gÎYc±vtÒÀ(¥xyÞÎþëÛÊK<Ð1Vºõ8œðò(+S¯ËºÖ6$*ºy+#Œð=/; rØDeZ<V`Š%€B¶ÿŸ6x£u?^X¢(Â~°¯ûbŠÅv \7ñr`mfgñ:!~tÀPBIh?^4ñà/õ`¶á<Ô-I`V>øTðHAäb£!©ÐfCLD{¿V3/,Å·¡Ïï6/£œ<+«_è§Ž5uD o@ŽPg<lvî>ýªØûÍ6šå7Ç+Ÿ fòaò¿çÌ÷ÐÀ8+ q -BD,þoYlÂY]î!ÖI÷yÖO s)Kj!üzðP$#ÇMõ÷QÂOâ«u0Â}`¹a~Ë$º+p@ßÍ3ñá1~Œrõ¿xÈêhÁß)ËzîÚÞþô'®ž BWiýsbŽcsÏ»3;N²Xîõþ@ÿµŸÆ¶ä"Á«j§Õ®ôî÷;}lßäoaYÌøý \/á$@qÏS|@žaÐóûæŸË¹X}ãÆ[8ÿ&çõö÷S«;Ç fîó#õåèþù~ÝÆíþH¿%NxÑþmöüZÂJ=Q¶ä1 a#÷îÜ÷žFx5µŸÁ³")ÙayîçòdÝGæ\áþkó¿CÆ7¹ò¡pÏá7QtÏô×ésxááyBþŒÄÅþøÌ3¶Ïšèž$ xÍÅ'ä¹ar Û*,Ì}Élá Ñëæ÷Éo)°¡>€*" "ð¶ÒÂ$ÒaÀÛ&¯cóW-<Ì6Ù@£bòôyöà-}fÁÆþGmö{ A1Gýa³Ûç/^)ñ€n/ö>ÀfÀ|8tO®ÃZöÌÆ#2VfÃ!£&zî» dFîÖí{²þ1VÉLŒ7î#u'&Òp€B<à²Ï5³Æ5®¶rîü7Ç }m@"!¹°Âµ°_ÂX«8êí|G$ÆõÛÙufžxôÄ)ïBصï¿\R8Š_â¯Û@áúâ¥nlÇî€iyŒÉŠ6J+žâÁÁÀœ»±ïjÉ»°zíf 1i?DI!#a\ZEJ
a;ÚLÙmEû±\Ù§qXBÛâYOòÅòŽ[LÿåúÝfI$Ä€)ÐÚ~·x€ÀkÍã±üõå=!¡ÏÄ÷¥ÎyæQB;h±ÀieÏŸC~àÏàÿʵk1Pf³ÿô©nÖÏga6cnùª Ÿ_!¶Ë¶€fŽ`Dà»5áöã=Î]žxîôÃßÐXëÿq/i{>ã>:Ó<cž<¬í¶_f×AßÇEÙÑ\ø-#ðÁ.×Bßj÷4rvÐ?âÆ!4ðâÞ³;6xÆòFPWÚ?~?7BFx Å Å\ú9ÇãþÐÈO.Ê÷×ìþ<oÑ ÿ£1ó»xÙZjÅ÷žPÃïÈ5Ä%19ž-X²*Uà3Íÿz{Nqs`ð®3±x=_èÜs?³ßH¶oÜœéKpd?Xólá9YÚj.Ù]ïv[Ú:~/J:Ü0PÁN¢ác<Çéÿô3ÂíxâÝ0ÓãÜã}/~ÞW¹s;mQæUA?qo;/ãß4Ñ'~þèÿ©+ûN°çÇäs~|(Ø7H\Ç"ì` =£Ù Üw»÷æx2¥ $åþAŸ ô8/úwœûc\Ÿ.]ñù^h_®:xÛ HxKZ8IxK.M!" " ¯.ì/.©Þq Í~m¡ÀÞ® à-iH]Àk%k>Éùð"$©][6×fÿñ Ló~ðZL'( eõ&o*àMnÕMD@D ºÀÕ÷tB^{'ïÈ ËáþÄuIš.«zHxKúYI³Äí©³ÿ,sH"Eþ¿"[ü9g@ ˵Ù9sRãàË^í!" " K@@Åò|mG# kô8lË*" " " e'@ò×ð<œo+"$eëO:*Û"Ƨ%ŽKÚG@UPÕÄu>x $Œè:¥T5 UM\ç×@@Àk®S@UPÕÄu>x $Œè:¥T5 UM\ç×@@Àk®S@UPÕÄu>x $Œè:¥T5 UM\ç×@@Àk®S@UPÕÄu>x $Œè:¥T5 UM\ç×@@Àkþ¶òùóçnýŠínäøiîæ;¹eûn7bÜTwîÂ¥Äïõ¡@åÂõØS®m矮ß1îòk)[éã(gϹy]Ó6]S-XŒÒ5nÝÅ=~*ºkÑûÏ?ÿÜÛžÍ5oßÃ-\ºÚ=}úÌ]1þm:õqýóǺ+W¯m«7ÕÀóçvnÑ¡§>{{øðQõœÕ\D@D@D@D@ª ) µÿàQW£^K×:¯;árÊVú8J`Î¥®¥uiú"3ê1î8ݵè=ÀâåkÜ>iâŠÎZà<yê.\Œì>ªÓÂDŸîâ¥+EÛêMõ%@;¿÷iSóæ<xX}/F5jB@@JC8tÔ}Ò µ÷)öqE KV¬uï×jæŠÍ^X$Ôš×ʵëÒO@yuý/íüAíæ22]@umHÕ[D@D@D@D ZÒ\RÀdùž¢e«Öy`úEðÔ]º|Õ{cŽïÚß¿ÏR}UMHš& ¥jŒU$€4§0¥|Œ p kÕ±»}çnâKW®wÄ}ùì|â÷|H¢@BZï žy붫ߌ£ëÚ'ß¿OÝQ_TªMS©¢" " " " o )YðÌ2ÞÏYžÔõ8Òõ:Æ$µ»{ï7¹À 6Î]žÉðøñ·fÃ7vÒL7pø87ÆþnÙ±Ç9¿ŽòàáCË®¿ÍM:Û3Ô$Çìø~S ·»>F¹Ñgžsç/Æ¿vgÏ]°Ä£ý63^̰Ç7Ú¶s¯O~8fâLKæw5þuÿ2îŸGùÉúŽÈs=û÷çá\ÑnüõçycÏ»÷V?xøžùß¹ç?×»÷\Çî]¿Á£s)aEn&lÛ¹ÇïòìÙs·gß!ÏqÐð nØèÉnîÂe©bÇØŽmëÒ{Û¹{ææÀñžæ]/ê¯Ï±§ÝlË 0|Ìß^£'Ìp«×mNEnߟë?r¢ûìEÝžyË-_µÁ·#ýc,_œ!'Wù»÷î»Õë·žñS2ýeš]gÁÜÅîðÑñªûÿ-[¹aíçûšsаñÕîœÞif÷þCnzÁ7dÄÍc&Íp«ÖmrwR i4õ¹T )l³ C+×nrµ·u5ŽqómÖûÑ£ÇEGºyû¶ëÐm}ßÞéž°>ÞãN®^³öy;ÿÂ5ÃÀO*V{v{ v [vvuvpuŽ÷/Þ7±lû,©]¥÷«çZkCŒl6žëO¶ñÙøïÝßÄ£×må0qÁ/` vì>ÀåõàµëîêÛ5¶ïÚÏþ?0öäÛ÷0hkBß·îÔÛ:rŒØ)NþÌ_[X)ñßP>r-!á÷5P³Ì]»vÃþ)®q«.ÞŽ[uìé.Yåœ ¢ÇGX°d¥û]FnÞ¢å!%µêìjÖoíVA-÷Ìð& "íÂ5¶â/¢âÞ qÑçêµ8±«om¶ÏÚûøÉ3'ûdúKŠ®ŒïÞwšÿ>zÞðþ²}×>¿oÃõömÒºkÂõ§ÎžN=yqƳô3®wÈÈ îÆ[ñÝܵ7]þš®±]sèô{Í=&8t¬Ä~J Ñ" " " " "Pé$€ N0ÞÍÛŽœ«kFÒB[ÖLõÑйç`oLÍ]ŽÌ<ÆÚjœÝLq_k3¬dÂï5`ž7>5C|õº-%BÇL3uFmÍ îï&Mkûoõ®ñÌ^7mÛÍÕšßÊ5Â1L¹wÿŸkÖ¶»7P'Ïë?ÿ<~üØÍ[è8'Ư£ÇN¯ý_þ<mÇ# _.&xD<~òÄÍ6AU=ø,þÂÐf#v^ÿÍÊcžF+0}þÂ%ÿ1K.Z¶Ú{\D·Ëö£ýC;ÆOåçÅ¡£'x³ÑÏtO9ßòŸoœf^xdŒ¬×Åy?°SlÛIÓæxãŸþ7ÏD šF5^$Ä`d^1¯n-@SB6lÚ^¬ê×®ßôÉ&Y¯öÝúûU_f#ÆNuMÚvõu¥/±2BŒàýÁ1j°ÑÑš)3æŽÕ-Y¹Îø&tµ\ Ì3`ÃK k×ox £zX?ãV®Ùè9áE AĶájõmŸ£MGZ6ŒØwÊÌy^ä©i<ð žn Ñ" JCïE@D@D@D@D jHHá&¬7#ãgÞ¢æþræ?ÊfÄ1ÃaÔ£ÿ0s3¿ŸöïÛÌ;<qîÑÂÊÌcPâ^A/žê7k×Í}lF]¡œŒlµôFoÔ3áÖí;>d¡œžê#°[ް<1úÌüè÷ÙÞY÷ò,íøeù.Œ[wö³ïû.qì5`€oÕ(ç |\·¥ëÔs7×mØVâÎ}nÞÝÇõ[f</Ìhç³h¹jÌû>aFöùïkÄ&0ÐâeÏŸÞGÀ!ásË€ÊYë_m;÷1q§÷6Áã!^Œ`}úr}}8®6ßðH|7·Âzú Á)óÎ/~xìµcÄËé3çŒHõ©ýVè«Ñ" JCïE@D@D@D@D jHHá$ìØœÏhµÍ ÁKsÝ@peêÅdcôÕ4.oÖüÅ®vvÞàá8Ì/Y±ÎÏê2BðPÀ à ?jÐ^ŒtÕkÔ}Òôyv-]Ü`Ùï>-_tûèû7R0c·¯q4ZoD_DÍÛvy$£Ùù€{?a£&LO¿`bmBO-_t(Úsë x>my3Ùfõš/¢B(S-þÏ[ZÆK)yÈ0¿p¥¿N<èŽiëNï)A>ðY8.š/xnÂïúàVFOéCNðzzzHH#ŠÏE@D@D@D@D òHHa;ë[vxã¿nÓÞèI£ ³±žê§fµÅXßm±û¡óάÿGu[ž æ®\º1*qußnÛOµ)¿ÆøbFÿ=Ë®_hníóF~ö=-&üe<êM¢Á²7Q-'€º±Žñ£:-,\`vQ> SOhBRÙ»ÿ°÷ÁóaçL²À€íølÒêx}®A !hd+àxfYNÎ@IDATo²°ÎCR žFòLµ ÛîÐÔ\úé[efíGK#óX»qkâþDiТF|tÃûÆðôÙsî°Õï%qä 79W A<Ž(=œª! sF`Fv>{k×ËIutð±ø)»ùœ`90èCO+W®^óÉ?2#uû®.ÒÄdw²ýkáI6÷4£ã2;Èð¡¯`X¬®×Àþ3fôùã¹[·ïqO,ÖÙæF\1rÝf¢»õÍ7á Orè?,Ã?Ô¬úµI :âqâÔÙ€¯+ì³1A?j|ÆO¡(òaæÁ~|Q||`ÖÃV+H}XÚ°êCüáÿížÌ·7aéì¹Ì* AÀóbÕÚÍaÓÄ¿ÌÐwy^2¯p ß/Nâ@Çlåº%íC|@Á Ãþ ±àÝPÃfW¢¯Î0}ÖB·nã6ïœ #ûª"xì±üÂËŒðT@'§ÿ@ÕÂZ2õóÂð'F=nÖa¶=i÷ 0¿ÌÃŽ&\ŽYývæ*NüúV[*0[!Éç0tIÀ÷Ô}µaóÉãØž÷ ~5ÀÊ£^žp³¬Æ;õ&A® %ÿذÐqLòðÿøtŸoÞ®GÑöû\Î0×s§mÆN*È*p×!ô1F( ðyþÈI©KðÍ]žÜ{M $eÊ÷{ñBOëOm?ŽCTXcI³fû»ÙJôÍà-ÀÒxB7B¶`D=-]Uå1øé#h'L²¥0ÆVžë8þÔ >Cþö#i`x!jHÈÖ"úND@D@D@D@ªÖAÀàç5Î\ñ1ÔÈžaÎ_±€R^WóN󬱥üJó ³=³ÔtŸÁ»Þ:¯¹®ß0wó^È`©Ÿ;ŸÐ¶Çpyæ[RCpëhçÎ6c¿fRV`?< 0ð1éÇÐ/zÙÿ1ùŸIÌ÷õm©;ÐUt ¯Ù®ØxV'ÀÐEé/,Œ!å f$ÅË×yÖàÀJ$by¢À*["[ 3øµOáæÏ-Ðß{°Ì`¶Â²}Áeã}ÿq¿ÞV++%ÐOÚvî[Sf,ËX³~ßöºÁcð9¹ à*l¢ïD@D@D@D@D jHHá[·7þ'¿\6gâÁ?±8ùÕë7Í FS^cœ·¹ð3KËÒfNE_ì=ÞlÉ8,¿`пxÉ»ø#"4cØqfbûYyú£¶$àpNfÊ?°ãL³8rß\Ëc'Œ¿Çò?ÍÿÄcÜLµgv·yŸg°a®çËe» À°%·ËàÞýŸÞ(ð.ï¹ ;víó}o®'[Á]eúXU x/Â4²¶îØÛ7ä¥ ÜœsÏuë343Ó^J³ç.x7žìyá-Ág@|9ËPÓ7 y¿0Ó?ÍB(-| ð]ÎM sÁet¡€þÀë% ?.ÕÌbXm6Åša]wÃóLRµx)¯ÀñHþÇêm:õMÌÌιÑ2žc1³+x(÷<ðëœP»_wï ä.ûfø2kOÜö»ýÚõl¿sï"!!lë_rpýÆÄ]-éÉÓUþpdË9pÒ¶#ö£eÉ@ÉU w®ï¬xVnß¹ëgßɱ0Ü< Bñy *Nð}ôïËG(Å ?¡ ŒÐ_óz*J.Ÿþ]e+D 55+×®ûk\cB»÷nZì}jZ?0t¬ÿ!~CÞݶ<aRÁÛÜPòH"€ÏD@D@D@D@D j HHáðàù.Ÿ4ŽØü®Å%ÌûÌš3-!`°âr qvýfIz»Í<·°5å1\ù'±_Ž`Ìâ0qÚ×sÀp?óŸáŬqØ.äD¿ì11d¯Š$ðû€ýeÖ}Î¥^HËÏrp,œW%xHcGO*qJöõ0£#Ñzç*HoŸ%ä#c#ËäÕ;ªñóC ËRWò ܱB@Ø¿»L!>>1fòÌb" ùÈ»È3|ìwûÎè®þýÆÍ;ŒwâI»þÒëÜïk6vyæW8mÕÆV«šÕšåé?SV±VxáÈ1ñiÃÖ^pÀ³!êU¢UâÄôš|R#<)!Þas{ÇXf6wPÑR®üklÆ6³2Ì{÷&ËòÎç¬7!ÍwÞ}ÿhxÏòndaG$ðqçv-ÙÌmŽàQîìÝÊ1ñxò& žõ¿ß/¬%Þëma3ýòyžÏD¯C÷þ/y ¶îÜ3R»E¬PJXݺ}Ûfì¶ò1ñ#ÆMõYö7oÝåÅVs&íÜòÕÅCŒ8ðÐèÜkëÚ'ßÍ1QgãnµÍÚÇo h€O^åÀ fÅúÍ;ù<ft³*ÀªuŒÇy0þYï& ÇÊ3¥$LÕ'6Dã|Ô~dV }}ø|xl²ú²¢!MÌ«bÊy^èb×D¢EV HôõWD@D@D@D@ªÖħlë·²xësçKfÄÇ@4}w¿ÇÈ>qiG`ÆÃ}éââ@ôt¬ÐÖ<Þ¯ÕÌm3ã3^1ݲ}7ÀêÊÚïU :zccoà°±%úpÃûØf· ' c{ȶÁÓ£!c9³4\zΰ_Ò_Yóx8:Ýv%Û#`Èý®"ßVBoá$çc?U^2 RH¡Š.ü NŒ÷I¿ÔbZÀPï·n¹ÉCv!imÆyê6µì<Ö¬Ô-A ^dâ?b³ùm,y#«ðûcsLã'œ'žæu·úÕØ×ËówðÇÊ5±DH }âyGŽ·\WfßL?ã}KÈëí?¯\wý±ëÌóùØ®å Ga äF8a¿v üŽéâÞvÅËמ?[Â!â^4Q>z/" " " " "P1$€p<qêYÇÕ?ÍÅgÆ£ÒPîÜ»çFî]˳Ë~ÃÜúÅõþàáÌÌj8Fô/±ãË-ËúHKšFB;Âpë'VÿY)ÉúŠÏ^è:nîÌ(ÇËíïgëŸw·¥áº[6ÿ3gKæ4ïöffqýŸqóåst{ÈÃÆY^ âÑm*â}T ¹!Ir·ÍUeYîo Õ¥IrTžÂ(Hv°f¯¶~vððQ7uÖ|7pè8ß^ô¡%&T¢@XŸµÈD fÖ{[=ÙÏðß»WºwÆ "pëÇþÒßâö'ÏïöZBFïŽ`·}>œ,eŠîkm»!àBý8mOxAXi±c1ï;x Ù zl²üíìË/&DT QyÓÄlËŸîº' ¯»N:¿ÀÛG@ÀÛ׊º"# @Ý@D@D@D@D@D@Pþ÷ð4€.CD@D@D@D@D ÂHš0:ÐD ,Í7nò,ÿò&U¯X]`¹É-;»µ¶ûNÿ" ¢Hê8o'øìòß`ãhdÖøè#¡ÞÓ§ÅWxã ªB" " " " " ÕjÛtªžäN@@¥T[ªmÓ©â" " " " " " "; ¹³Ò" " " " " " "Pm Hš¶M§@î$äÎJ[@µ% Ú6*." " " " " " ¹;+m)" " " " " " ÕjÛtªžäN@@¥T[ªmÓ©â" " " " " " "; ¹³Ò" " " " " " "Pm Hš¶M§@î$äÎJ[@µ% Ú6*." " " " " " ¹;+m)" " " " " " ÕjÛtªžäN@@¥T[ªmÓ©â" " " " " " "; ¹³Ò" " " " " " "Pm Hš¶M§@î$äÎJ[@µ% Ú6*." " " " " " ¹;+m)" " " " " " ÕjÛtªžäN@@¥T[ªmÓ©â" " " " " " "; ¹³Ò" " " " " " "Pm Hš¶M§@î$äÎJ[@µ% Ú6*." " " " " " ¹;+m)" " " " " " ÕjÛtªžäN@@¥T[ªmÓ©â" " " " " " "; ¹³Ò" " " " " " "Pm Hš¶M§@î$äÎJ[@µ% Ú6*." " " " " " ¹;+m)" " " " " " ÕjÛtªžäN@@¥T[ªmÓ©â" " " " " " "; ¹³Ò" " " " " " "Pm Hš¶M§@î$äÎJ[@µ% Ú6*." " " " " " ¹;+m)" " " " " " ÕjÛtªžäN@@¥T[ªmÓ©â" " " " " " "; ¹³Ò" " " " " " "Pm Hš¶M§Àë!ðèÑcwýÆMwéòUwþâewþÂ%ÿþêõîÞœû¯§R:kµ$ðøñjYoUZD@D@D@ª+ ÕµåTošb×Ìèßœ÷ R0ßuî5Ø5nÝÅÕnÜÎÕjØÖ5nÕŵëÚÏ;Õmݱ×]Œt¥k§ÓU'Ï?wpSfÎs§ÎsþyuªŸê*" " " ÕjÛtªžT ë7n¹ùWºN=¹OŽv5êµò¯ë¶tÅ^õZºõí;{µíÜ×MœÐ]P5TÍÎ÷HN}ܵ»ŒÝ;÷ªÙšºe%péò·jÝfW0·ÐÛŽÍ]»q£ÔC<uÖ-Y±ÎÍ¿ÄmÞ¶Ë=}úŽÔ}Ž@v²óÑ·"ðN`&¿þXW§I{oüÚ°ko3ýÌܮݞÕíÜœßí2¯u·¹y»^{ZÚºý¹]{ŒÓuñÅ <{öÜ-[¹ÞÕ¬ßÚÕmÚÁ}j$¶î,Ÿþ÷VسïëÕžkز³ÝGÚžF:»~ù£M Œz6ïpzrõçYiã¶éêÆOínß¹ºŸ(Òù->{æVÝäïºõÉwCFNt®r¿øF¹¯âJ+wÚUe%pôØ)õì 4\ý;tà¶lßí®]¿é=zTb_fçnݺãöì?äzÚ`Ñ{óv=Ü=ûKl_šÿWÕ=æÛwüì?} vãö®Kï!îñ×ÐwP±íMŸîýº& Ÿlóv&µrã&Ïrwïôþ8täž÷"ú€A[¡Ô"ÜÈDÅ9:ÇYúBS*³-" "ðHÈ<Î ïê5ëè!f®0lê6ëàg2ðÌbZ_wÙwà ûÉ/þÍýüW¿qÛvhFíu·Gu>ÿÏ.x#wýÝ9 ey{hÁÒë|fxµíævï;X)HîܹãŠÎ(pï׬ã~üO¿t?²×GÖsK¯twï4.*¥:hÎèµµ³ÙàN®M^o× E'oj/ò?qÒõ0Øý×>r÷ã»üô_Üoß«áîÙwr9ϹYS7<xø«Ý$cŒOœÀùìŒ3iŠ÷("wÈÙsJì;}ÖßGý_¶jœ;yú¬#":rÿÁÃû÷þ3st¿þÝÖ~á~òÏÿæZ¶Ës·nw?.ï)Ž¿Œ$Ò7nÝò³SÄ=3P%ÙÍî}ºæí{ø m;ör€Êýúé§.¯kO÷×_û®ÈnÚ²rOš£¿µnÝŸëºYÿFä¢ÏoÞŸÇfG_írØà|aà~æìùW;PÊ^§Nqµ4uòůž/}í{î{?úûîÿÉýÕß~Ç}᯿æ6må.Ø**o{÷ï»v]úz㯧 BBúZ~ÃÜ*òxf3È3gÏsßü»ø~ò7ßüŸûþ?ü³ï;ÜCÿ×ÿþªûößÿÔ8µÊêôfŽPÅ×b×Þ-Ü'ÖÆ',вÓÂ>¶!ä9qêL0ÝçiÚ¶«»ýÂC`Ùª ~<îVðj#ÿ?þù¯ÜZÛõÛ?p÷?÷}àÏ¿ô ?é?hš{ðàAºêšn$di1bUW¬Ùè5²ØÅùWž·nû=ñgðJ6tÜó,VñNÄÐýXëÏÜ£J9žtù²9fŒ fÿÁýåß|Ód%diX}À92ÂVÓnîÂåY·ÍåË}øÙÞæ93lÌU÷]\kÔnàþß/|Éýã¿ü»ë;0ß-±A|áå®{ïþî[fÀýÏ?ÿ²kÔŒµ Ü+~Æ0k×6Å ,[µÎ»ýãÒ=×rFP&ÏçêØ=žpœUE)\²Ì}í;?Žûå·Üü÷nèÈ1nõÚõnõœ_ýæ¿ÝýÕßzCpÊ-UQ¥·ö<Y1Øÿ±gÚlú.?r7ð;ZXÑå+×J\;^"ëõwtó» Ï Q&Žr}²€?|äšûþOþÙÿñûÝèñܪÕkÝÜù\ý&-Ü¿ñwî_ù6jlºêšn$di±+W¯»<ñgAHR9tôkjîÍõå¹ÅË×øMÎÙ#±ÓÄ86±ÄEìÙ8i÷WþlÇ®=®uûήAîßþó~pÂåõÛ^ªv<lýw}fÙÆOe³už]ôeä(o!žï!îÌÀÿÑÏ~éöì+c`Öî{æÖýgæ 0füäòRû³Žg-p©3-û{óvÝ}TA0œyó¶÷¡oŽëÒÏÍ·Ä'Üwð°;wáb 7/]rÿþ_pþ¥¯»÷>®å®^»^âÊNgÉýác÷Çñe׎U;wÛòšŒgÏùç'áDx1óϳ{"úç{øð9~÷`¿ò xÝ/W«MÉœ®_¿aF~K÷G&$Ö¬ÛÈ]¶*¢±`þó0ú®ûö~êV¯ÛýZïE@D@ÊCÀ<L/_œåö:ã®Ùëæ.ÝáæE^ËÖîsû|æ._»U³hß 1 Ñÿ«Hì"Ø€Ë*.ÎÌn=ÉoråÚ¢°²¡÷ç\}zÁ÷Çfü0hÁýù/Ÿü /HHj%}+ÝÄì·°6^,U._œæºöÎ÷®ßÝÍÕ»ŒåæÍ[ÞE÷ýu×>¯®d1»õ·tn¿_üëÊ»ŒÐKÙ·zâø `+BðQ-ÎìïžùJN K¯^_ìh,óAÈãÖz»Î&Àö8Ò']hà;éÝ/OÁÕû{?þ¿_Ìx(K¥êçﱿþÝû^HÜPæD±ïÆ&ÿ¡UǶrÈö¬ãuû# ":vè(?/ù[Ï©)mÙ¶Ã\ü¿ëÝü7nNööžs÷®ûÙ/íE£Š-ÛŠIäJàânÕÆn|Á:?a¹ë=|ëзÀµé5£Ø«c¿Y®Ïð nšmök6tW®KÏsÚvÒÈØç$'bðñ ûÌ?©0;Z»üQxÂ*pôø)7ÓÜ©ð L³ÄFÌlTD9pè°0xë7(ß¿ægªŸòï{ÃH!AùÝ:/Ž«;tTÅÏOœÈyxÌ=W>qaùÊ5ÞûŸÅé.6·íŽ2}æ÷ïýØ}Ý^$òR©<çL0ÂØÇЧñY}ûzv%¡3üÓç,,P qìd{ðçõqõl;m?öÇ«eÂynXèGyÊe+Ýï>šé~ýÛ÷Ü£ÇÅ}}ÔØæaò%÷û?q³,Wx}XQÇnüò}Îiµo<á'TÑðÐQ^HÿÃGµ,áJê)ºtïãóEü« \5ASED@D ì®^¿ëæ/ßéú\äºãÚÑß¡_ëØë4`vâq }¶Ï\×T¡»d»%§V^²·@f YÈaáÊO£e«ÝþÎ_žìZtèé¹6[/÷Ì vì€/0«ïß'ÿ#20 ŸUýæ÷¢$¹Ô6%ÝÌ\Ž1ŸÖlH îIJm¬ÉͲndý/ìÞ{Ð?dö.mûlß÷4Ô{œüÛþÞòld%mèð÷c ÉÛèq6ÑgDà¹ò÷ì7Üÿô!²üO:ÇmØŽÝ?yÆúÊ=3üØ=+y{ß³$ã×nÜêFOá @DÀû÷Ë÷Àç<,cÉûhR¹téûÃǵ}Î=,ë|9Ïtwñ3<:XE§ïàÑ9]>} L-Ó>eÙDê4læ ý%.o·xÙ cçïò·ÿ@²G`ØVE@D@xôè©Û¶÷ÍÇÐÏËbð§ ~¿û²ÿ1Ýî§³z¯ þH$þ²ÔNbq?d)¢šû)ÏxûŸ v¶éæÈTöZŽñž"ݪãçbÖ_@þ+äÃÄ[ÇOκ-Œ·ïî»öX[ÖëÅÒf+,Ù3Às§Íɶi©ß÷ÿßô©{ððaêöwì7úÏÿúÞ[ mÇ®©Ûé!pèÈ ×µOŸwãÇpÏ:ﯱû+(>4ÀÀÝžQñ1÷-»;¯\u,!\˶yÿÿ7î;?üG·wߣ£øû!ÌSdÝÆm>þŽ×ìùKœbÒªu*àÉÿÿ//L:#ëñ<ìsì|å[ïÖ®¯øºd=¹ŸjLàê;nÆÍülÆý«|çÀŒe;ÌóZË>¥H( Ö©ÓYŒb/»LÆâÂe«-Sõn·Îfµh³Œ0`Aê6oßå>$¬¬" ²ÈŸÇ>{¡em`.Ø¥ó·XîLR?4^³-Ñ_¶BøK iäú"\&ÛöÙŸÃ],íתm3ÿݯ~ó;ï-P¯qR·Õå'püÄ/ãŠ9Rsµ_äèg.ãäd©÷ÊYs]œFÍ]: ÝwôOî_ýwý/\^RuyÛyðÈ1Ç:Ô°Džög{á-@Â@òI\%ç«Vv0£OšÇÂ%Yyñâe'à_ù¶_20ëÆúRD@DÀ8{á:qwá?}3}µ%̬Ô&ô¥P #f|ÁlÑ ÅŒ0d1eô=û]÷Zîö]û{·Ç!£&º»¥K9u¿PfdÚ!B`òô¹Ÿ6ŽþüÀõleÛΜÞ-þÏ$Ãm¿ÒÏ1`ù0úSÚŠY¿ÿ÷ÿzÏÖëþ[÷IÝFY·ãKŸ`+|ôiébA©Ó9 éã¡c_äÈ>×®ç»Á-B¯Hh@NÊ*Ä7mÙÎý_ÿ÷žÿçOÿÊý¯/~Õ}éëßsuM8zìxeö=.ÿ A4üšN/ð|å>ÂgýAhdÞE£&LwçOTF!oÅ׿û#êÁ¢Ù Gÿêo¿ã=f;³GßÀ»BàäÙ+®×°Lr¿\ùòlÓ¡¯ ^ì¿ð®à-×uJÈïÄ©3®_þoà30!!R+ÿ$÷ãs.ž6/\²ÊÊ1KØŠSQe³,®5-æ4ìS¿ÊCOûÌ]ìûwyîz)Ö?égòŒ7À|!ÈVÈë1Èÿ~å d;Öolíö?56c[Zù×ÿøœÏÞ]³NébAiÇÒ÷¹ 䣿Ý?ýýÒîÄóKìÁ¶O"h÷×c§XÊ3þ¹r¶<[,IäòUk\Ýw~ðÞkäWðíØñäЮÜIhË8«¶R!uÇN²×iIɧ³lÕÿãõ£"þÞüåÍÁ`ñÒì÷/Døó/}Ã-ZŒ¬"N¯cÀ[KàÜÅn Åè·ïSPäö×¶xÕøÿš@ðòX/PpàØ%îªV (µ_IHAD2Zcð×ilKàW0o±Ûa³çÎ_òÖ¶f=kb]Ù!`ÊÌy5Ê)+,q ³Xl³ÞÂÒ`¥T£LK(.m#PžlÏÔNŸSg>}[ü¿O¬/¶pÂbÚvîãÈðÛfR³Â B)3ÊÐëýu|ÀGÖËvJ/žýò×|Ó5lÖ:ë¶ú²â à¶ÝÏŒ=X¥]×~?[!G ÷ZOeUÊùO«ËGnß¹Ûýøç¿rò_q]{ö5áâ~ÚæúŒ¬\³Éæ¬#ævK/»þãÿñÀÜù²îtîü/ ° @2»÷žSVùÿQ£}çË×ï·åüÖº.çž<Ðï¥Q8PüûÞöaßaWžv¬ü Ë%D((Üb¹}²{²&×üÝùT@B[3ûÉÔÌn2+êEË ý<1ÙüG»%+Öºæ=[wyÃãÅÂ2 BÀôY+l)ÀxÕ%Äèÿe!°sÏ~×Òfà²VÛ\ê®ôÿ§OùW49fÚ»^¬@ÈÌ [Ó6ËéóæÛ{WÜߟ÷±»eøªäñ³_þÆ'ïêÒ³ONÇÖFGŒ§Y"Uõî?¶ÔÙ\Ú«¹4u ®O>žÊŒ83þ,ÿöäIöcOQàþä_q,5yâä© ¯øÀÕ¿ü¢ß]»~Ýý¶äÿ4V Éæ¡·s÷^!d`ãæòÝ¿*ù²txxmž.Y»×/í5þ;ÑŸzÓe©Ýã§/¹³Ö¹îùóü¶, Ø#Ÿë5|¡_"°ïE®·œç3ŸëhKv2ÏM0ñàØ©K6ÙúÜkÃö#®Ûà¹E^åYq@%6S æ{#`ØèÉ9-q¶}×^ךUgÐ¥wŸc A ȶëÒ×Õ²ã:°`IöXÃ*åô0i£7m·.œx÷ë-Û`8å©nßL²üеí^îå0ç]ŽaŒ:zÞ»öØß¿82wO9+u;}Q9Áï;xŠÍïhaÙÔ1¶¢9S²ðݯ,ï×oÜìîòñB@ÚŸ»öìuõµïø»÷îKÛLWù +œ¹cwÕºpïÞ=׎U;ïСKÇÿÓʬ¹ü2x9Še'}."ðnžxùäóäåéGO],gÇŸSnÚüMnåýnÏ¡³&\v¯Ür.ßt'Î\v{í³÷»é¶Í¶='JMOœìóà=<ú[>[wäœWø$ÄÈ\4U("µC·þ.×eûU»p OÆàu£Å¥º\»q[×Ì\\s=n¬zYÿ+ +}/ŒX¶éjË¡UÜLýdÄ÷8"dßd˶~6îßÿ7œ`NêÆÌê}ÕÿoþÝ?žCÓ Ôèr EÞ zŸ~Ó67iÆ\[UeW«?^VóWøí ©€©}ñá#ù7ß4!êJêõíÜœÇ,žÃBT*+0lÚºÓu°ÕABšywý¯H2æ<·ÇOêþè_r ¿<ªyëŸßüæwžÛwî€RÀ;M`VáV3ÄK.÷Çìýó×*ÍùK7] °2Àú+ü|oË%ÄZrÙªõ®¡%ìÃmî²%ú¹dkHwì6À/áêOfì3Er,Ö®È" "iŸÇbY¬zyOV¿ÀP+o!L&ßfsÕê6mï+ïC[×]2¶Z¯±ýÖšæÅKÜo߯áŸð¥¯ktªær©ÕU"N<ã®XbÀs-ä@¬Q¯÷ éÖ'ß'Œ}ç®Ûm¡"ás¬è²Ðž}ïG?óñÜ3mù¿€B®!ÃFùS@¥ò¶lå:ßþ¡°ìb!á UQ>ê~ðÓ_øUEŠÍíîJ±rØ/ü®õ¿þÚw]ïŸbßê¿" " øìÂu×kè3Æ_ÎÆYy<pû¯èYi ä9û*t÷ ¹ÉXþfÓîBÙ:*ñªžûãжs_w×ÜYãeÑÒU>Œ ±-oŽmÇÞø×åú¿ráÓÎ/̳ÈÏÆ²2aêìb,¯^f÷ä3Ù=©žnf-Yæ÷ûò7¿oëžãðräÎo±Cçî~ÀÎ }óm¯RuíSŽÑÍ;Ìoí·êâúbB_bbëËÿwp=ûw§!oÊþïµÁ²¿}ÿc¿2Ä?ÿëoÜþJ\åüEKÜ·ðSŸâºtïíT°X[âïà<ôá!þ:ör·ìð¢;IHùlõúÍ%òîT&Vî4tûcKøøÃú?nëöÅNséò÷qÞý|"$T(I`á]EnøÁðã_¿âgä7í8æºÆrsv¶sîŽ$ÄlØŒÝBz¹IÓæŸâ1å"qÌÄlÒñBkA£\þÃ, lCüXñÿKÑÿ_ À;÷\Oýg®Y¿Å/VÖcaîÚ{ÀÇücü··,ðg-Ë{E²®=úž?ÿò7|ÿ'õ¹á#ǺÁCGº÷kÔñ3ŒžyÌQ)Éä*ê:ÞÖã ÂØl?mAÚÚûæ)Õ߯B®MçÞ®®2}íÉAÕÊ(«×®wo³Ÿa}ç?ý×ÌJ8Õ 9ÆÕšÝÀ}ý{?vö×_sGµ`e4cU<AXñaÜL~+×®{$Óf-È£¡"+ çӯ͵ÿÏliÑïþð\ËvynÌžI¶$ä÷ó_ýÆÿßúûºÂR ¬È:éX" "PÜðزһÞ<ú·%õ»|âõœzã®-7ž€Dç&ÀK4šRb÷ùûª¥Žýs}þüÕV¯ ¶ž¿±ÙÐoØà÷*"ðª.تÎ1Þ0Üæ.w7oÞÊùw÷ËZñ&ã?Ç`U#àú¿;æ2NB·ïüðÝŸþ=¿ÜKþñä$L Gÿ¯x~1ÞÚ¿aÔwèÖÏ-6£ÙßhÁõÎü¥ÖOúxÑ0)qrîsÑãåò~¿üõÿßÞ>Uiþþ-ý¥«:¢Ÿtwõ[QUBGßž]7oæÍL§tNEqDPq@Å)Q@ÅgÄgÒRÍ^ý>n6çp@@áð[xðì³§ß~Øg¯gœï»þdýÿéëIh~wù¯ÿôÏîbòôYÿuåç|F)p³ó Üwò?5{»~ã;hŒ¢ïþjQt{mjÀhÏÙGgÖ¹laþßêTWälª?iAâ?þ·ÿáMU٠Я(Œ_!÷æŽÍÿWGüð©«=ÆCÅ£fCø]Ç¢©_¿i; ÛcÓG6ÐG.TG³Î 1Æ =ÎéwºB@ žT@áÚ Éï£nßi°ô¶Õ²UÐKÓe=qÚåÙ,êøiþwÕŒp©çnü:G íÎÊÍs?c?cÝì¹ÜÕkõ]9}Öí" VZJÕ Ü$+òVº¥Â=¶)VÛk2J¶úpG[Ê«zÌÐq<{þÜ·Ù!2§Ls?a÷Ïݹ°ÿ³¢^Ú;7µ%PŸk7zT#¢¹@.Ãî* ù¥4[¹k·O4lŽÿ.]¹ŠÈ=° $'Psò²ÅWg?tÀÃköâmîeSkã?ù:¿äÍÛwŸ`Ø_xÕ±äZÀwüíüÞÒc ôžzб\Œ¢È 5ÙfS^ç- ²ªÚš9îC¹ªœÎBvÃ4¡ÛÜüî\-fT\>°QégçîÎÝÎ¥~ÔÖ]vU ÈZúPJêæ(BèG!GQ"-çÌùº/:úŸ93@_@ùÓ>ü² Þž^5 ¿nK¥E¿ï±QTuÉö£mÒdÌÌßêÎ\žÙcûî«Æè«WãÀ"ðîÝ{ðºË_ŸÖWnWnuðUì2ú£÷ŽL&AÎwêì 6¡Þ_èÙ Ð(ò£ÎBð/[ÔÎSK5¢A@ß"PZ~ÜeÎ.nÕù0!§ÄU¬µšºß{ì¶œïp8§ŽÕþeFš@àþ#mýöØÁô côÅaBàkxÙØäót·X=¥(Ž_aÚªÚ=Ɗ̲ ï5àâë-óºícfÿ @=K`cE ·Ôí:PëÞ÷°PmüI1 D"Tì;Û³'ß·Ð/¯IàÃVPåkzõÊ5) òŸ²Ânï,@ ÐlÞyÂ]Òj^ðflÙuÒŠþÐc0P¹ïLâvJO µ&Ðÿ @ šØ{&á Ë/*³NÚSMÀíGYyÝÚÚuÝ.@œt8 @ ¯K`÷¡Z?ú/šB|9KË]Óë·=v.»ŒÂ¶.@šÿO[XæjNP: NÿC @@©œéfÙtLšÜüºk÷:ŽÏùÐúûN#ý!ç?ŒÊ|Ð1]ž|÷s6Öë`€õååä @ ô» O\ÞIñ-_¿¯GŠwýý÷ßÝêÒýmŠ 3bÞòJ÷äYSÏxÝ2@œp6 @ ¯M@Óü¬Û°@ßsøB·æ>ÛfV^ëÐÿ°?EÈxÐ4ŽÖ0Zóà @ Ð »Öº©P|åà«à€9}~þ [\õ:÷æm×gRQÁœÖù×6ÕÑþè«Ò»Ô3è?Åè?×3 @ Ðíî?zæf/Ùî;û>ÿ>«[fQVíôt2 öºúÛÜó¯:5=à;ëô?ñÊ]¹qß-;dæBâ0²íX^4ŸîöóL b€ÃUä @ |EÅÛøÎþÄÜR·xMïä?{ÑäJ¶m©WnŸ" öžÊê³îdí ×øêMÒ£V'^©ØsÆ-)Üí&ä(ª 4ášèükÿ[wLºÍþŸ ¿+ó @ ÐE5º,,ÿcŸ¥ÖÉôø SûϹÌìâ»:ñ³Ýò {S«JªýgA:ùÉ^i0wÿ5vñlÒwuôœ¶ @ /F`÷ÁónÀ«>>§Ø*ÞïÞðêÍ[WTVãÆ ý(Oÿè«)íøënz;ùþQ3@Û?|2õ6Sî4?ÆS @ ð¥(d_Õ÷毹:úgënùÝ7œzëjN^q+7TÛgöºM;û4TÇŠ9KU_ ý«Kû(@ @, @ žy÷W7gY ÏÕWHŸŠüíÝ šßïØ}*08§ ¢]@EçØáî?|Ö²~IL 1>÷îë×oÜýÜÍÛwÝwÜ»÷ݧϿêy|øðÁœýí·>_oÇ®óMswÞºsÏÝmx`7ßÃÛ=öúöí[æí1ºÝ·á'O¹·îž/Éïê>ªýkK¿œ{ç>zìnÝŸg÷ÛîöÝ÷ëã§íÞgÞ¿ï~ûëÓõ/Òœ÷lõòàá¯îúÛíüÜòß«ºùûçÕ«×îZýMרØÔ{qdº@àr}¶ ̧dåmre;Ož¿ŸpxgfîÁί#&@¹í*ú§Ú+wºpÄýgU4žÖW¯ßt+KÝšÌîÛÁcÜ_þìïfäæ»êG¿J'éñ§®²ªÚ>_×aÂÏ_Œtß ãfçŽtÂß)0|ìT7ifÉÑSMFÅÁÃ'\Uõ!ômOíívÍånÀñnÏþÃÝŽE6ÓÜ3C±Ž¬ÂeLÉñ÷Ì¿íŸÿiË5ßß·={ÑÇœnûœîâkmñFß$Ðôúµ¿ÊýÛ#Ý7öœùÍÀÑm~þòã(÷Ó)®©éU·ä©³Üÿþæ'Ws*ÕÝ AœÀÑÓ׬c^îÔAWxŸŠ Ü°í°«ØwÖí=\çvVóSû¥:è{d'[bEÿ*Ü))Ö1ãÔ+?õþý·rûiôd7fb¶ÛR^åN>ïÎX§û@Íq·°`µûÛ7sîbwïþÃ/zûqC잪öÕtx¿/m$dÔønÉ"3W0vR¶1gq üyÂL· `Mî§Ã0ø`»6oÛégLuÕµû9B N ¶î?u4r¢Û°i»¿g>Wçµ4wÑ ÷šz}ú¬uUÙö]î§§ž£'ÏÆ7Éÿû(Wf,Ž{þðiNßYç/\rçâ?µÜÅË׬õ§ÐÕî8ݳç/ºoÌx:zâLwlm@赟¿~ë+Xb)œ ßÇÛÓæ¹ªÝ¹ÿÄå Ôuþ7Vs÷µþÎNµœþŸ +àèÓnÀðñnÂŽ¹®ÞBOm þ¥hûahŠ·dåÚtïLt_ñß÷×s#ÇMïÔ_ažêö¥G¿>qY¹n±=iÎ×®Àè¿þº¶:qKW®ó/uømOmä_äÀ\ùÎ}ÑEÞliQVÇNkõ>ÿé»d,XºÚ1Yß_²a|IÚìøÚÞžê#}JŠÿUûgåo3 uçýî§"T`pfþVwðø%÷ê5»œŸ%ÖK>¯üAuX5b~¢R ³gç-uCFMr§-ä0Þc¯Nö;ËmU~k²<{=8kyhú\¢uŽ=œ¿×®eìÚ{Èò|ŽíOæ¶Ì¿[ö«ÿë'ŽšðæMs ¥yß¶^ä³aœ*Hûn+,oÞçû[EHëò¯õ)Ú~|]ýÿÓŸÛg¥õCÓ:qs&,ãõó€2€'é,NŒ>j;þý5jØOÐoô#Í:ZM®Žåÿ6ìž»;ß8z\ýù÷/|jÔÀ¬FJâ"A/_wí~¹hY¡G¥k+)ÂJÀáã§ýœ%Ñßtô^h¹6(i{Òÿ¿ÝWtæ@jÝ _}Nú u?`ü<qSZHgZG®®ŸÂ÷Tóý¢ùz¶gH2§¢Ç&=DµÞç@o' gÛ OÜŠÊãnMé'@ÀÞ7ŽÍëlÞ¡zÏ[úœýÜ{Ûñaô¶+ÒÁã9j¡ý×CjªÃc²·xuÊ[çK¿xÑèsZ'[Þëð,j¿bM±«·âjñm®XSâF[Œ<®Õß²Q²u>[ï-ÞÒRpPÅô0¥ðZý( @Ç9/¥9tÍø¬ìþxô ³kß!`ãöZ.·j7ÕåGÎ)³æ.qMMîåKêw gLíJ6WžGVž+ÞNuÊëUžoŒÕ]ºêC¡Ž<;¶ÁWþ:æ±¶ík7§,Ñúÿ¹sÏ7-g¡¯I0*sº$®wW¬þBü!m]ÉV7ÔB µÎÕë7\îåNïuwiüŒúÓÿÛ3nßip ëËLÙnØØ,95×òœ+ݳXH·dn)ßå&ÏÈs#LOcL·Ò¹¢P¢mùêbEóüEÛµ£§üz»ö®âÃÇu§ÏuCÇdY®ùlÆÙètlñ& îܳßMœÐL³iö70Í-^Yä®¶âñuùç4œzå²ç-ußúÙ]·ûX¢ŠNÚ¯žgÏ_úź7Ž¿÷ø=m]ßA €êL¶Z%ÃÆNñ×qþ_üý'tô߀£áŠË¢-îµÍ\fÆÂ€éó|ê:®\wóÿb)I³Œ~§Úýr·Ý'µZ÷ø@×S©vyU'^5jŠ[œé$^ R÷Af6±&3íJ·º©öw®û@mÝå)*Ji)*2øUè44 t9V#gŽök÷¬Yóžs¢õðY^!ôfzn~øø Û}šÖUZ-ÝßRµ·VwGõY·çÐ÷ôycgïT볌5Ö<úÌÿ 7ùEŒãÑÑPž£íé¡6Û"®Zç;åáF¢àõŸc¬|E¥ÌYžÂêûŸoìaöáÃÇ®°žÌ?)_V¹ûZWáŽááH¢é9ù®ÆfÔÑÎ]°Ìœè !£'9=8O0Šç,r»ªC5ϯ¶ÎwuùÂ]zøW?ihúnåt^ÿýÂÅ+ÍoJTر-,(ôås\ÁªõÞÔPuh5æ-^é4jšóÑŸeŒÈèPý ÃÇNùÏ tmvqòLÓßêÃîíÛ϶ÅkbÉ»÷øãaöP.WáIDATÓk]«3`»pyKÅíWM¯íáyéGý/µÔµþóZ± TÈž k>{ÞÖPáHuØwìÞßr &Ñ5ù m+ªD/Ú¶4íxŸ¶šiéÇaŠ|ÿYýß?àÛ9\ŸZß²]~éÊûÿnÈX P{ñªOÚí\×ÚýbõºMnʬŸÀìùþvôÄYßñÒ}mUQ©ýÍó2iN÷0Õ.jfÀX·t4xä$j óT=å¡ËxU-ÝÇYqÂK×ø$Ýçt]e"hÝG ³F¯öTרõà¯þVõ}05»ù{pýÆmÈj¿ýáªÌ Ô}d¢}w._œÁÏ6¡ïŠx Ív#[÷šyïA<U¡JÚ¯î+2è( ©ûH±%@H'}ôjÎÍ· Jé±³M¬+KüCåf+l¥{hÚ:@*FpuâõªMŽj± e©£Ñ=Vcbuxö[1ÂxÓFÈ}ÈQ'^µžcÞýûõ·î¶lNûÖùwÇú¬èH[ÙUDÚsÐ9/µÎôAJ¿ë!]÷zžÓš~hçmGfÆèñ3ýTRá}oøÝbWŸkÿŠ_¶í0 Mv[*ªZöŠQÕuÅ[=ÞtrÈ¿¯{ivÙ/Z)-Ø»ÿ±[³~sËú1º+3M£*ÄÕÒñç|Ç^FD±;}î×Ï+:§HÐ?ã5¿Ð:ÑmåŒ~>{Ë-ÒIíomÖ¬Ùܪµ¥>mI£²Ñ$ÑœT©ø=W³°ü0l[l²šÉ§û"TP0ÜgŽ=Ã,*DŒeÖTÔf"Qô"F.XRhD»p¥×õXtJø¯G ª šö²04mLê¹Vº6ånhºŠú.úÞ:ûhù <9Z<@SP*ZLfà)3£MQn2&Îçîܻ߲Èf)0ßè-ø ÐvàôæE ýÓŽ gïlÓÇh{hÐ,rUK£÷êd ŠQ|o'Ï÷£k-€5ŽöN²m?œÌgáÓ ÏVšcŒœxùÒ?4M9ßiêÁÐ:k$+xÿÁ#ÉkR%a?G,C£ÍEâZsÀ8IÞãµ{ $34º«0z èFjfš³6µý6{Í¢mêÀ_°Qa=èÖàöÝ{Þø*ÛþÉÛѫŸGqwÝæW;nõ;Ô,4)ÚÔé×迪hèr~ï î_¹vÃíÜ}ÀwÂ'§éÞ4@é(jÈhoÒJ¢"ºhaûQs0LÎIfxFÍTuÕÉaiýÍO!Þ Ï³)édÀÆg xüäSTVcã'2ì×Ï' `E_(KŠžŠ-þl*w%6]€ÒÓd$.·¡aYÿ©óöþÌR;7ÅÒ@^§&` }oê;/n,@÷uþÉŠš¡3âíá¯ýr¥ŽðiHt!Â.ŒÏ+ @ ddzùûó,ŒY#ìÊuïl«Ø¹×hï;x$açB*ÊWuh24¥æx»i#! Whchí ã×Èm{8¶dBið xÅ:JÛ*wûÐÈèÈHwêiô¿²ªºeT'zÓôzx-ñÐß°×®Hf(Œ~èÏY®=ßBfkŒ^Uø-Þ4Ïû3d,iz7KO&@¢Öàlm7ÊÆ[`Ñ0þèž4åúÕԡ˱=ø«ã!âþÇÔDÇÂ{ÝLÀuÕñxÝj~ìŽPmÿ`£°k-ç÷ÿ÷ifdH÷! 9¢Q}]s¥šFuðBó)v/F¢uA©ÃžhÙwàðqÈxÛâµkdä/[럷{Œÿ±| ìEiTÿnÃ}ßÁgÑh3ì^¯Zñ&£N3HüÕêKΟ í«L4:DëÊPjjËèû\æ fBÆÉrûÞÖ÷¬ EÛéûî}òfãÛâÿ >ªõ6B¥0zåŧjåWxiÈÝž¥Ò}3pŽ;y:±y ÑRЫF@hÁæFe KÕ|CkßkŲæ·uÚ3{lzŸÝùçï;¡µg(í@ŠÂH @²s6²ò£üyØvôU¡œc&fûüð~0._œÞâµ $3ô~ÕLuÀd2 t Ö³\ìh8œÒ×nóFô ÏOÏ]äÍ =@Žh ÍÈ!ÃH#ŒJHôa%§"ÆŠÛŒmO¯Ñq(ÿ[9ÅJÏvÃñðúù€Ý£:nMïËT-]h d:÷i%~4Àî2Ú~g£¹ÑŽ%þÆ:s,MDO*©"©J PŽÑ Ñ«ÕõßC ®·Ì^E^$úÑuQÛ¡cŠø·d«Ô9ÿó÷#Ü»Íaú¡jàįÕÑýC)nch©¢úd$%jáW jèŸ&}*M柿h Àè(©^ö9 ü©F¢ù¥³ÂF¯ºªN5=ÈjCôøC+Ró-×}ën@#¡ñÎM»º4Fr€Ãqé}»ÎÇzÝŸ÷©Âz{F_U?Aß»drqÿ6$ÃÒ$ê4Œ°ÐPEšbhÁÐ"g$3ÂÞ€ëßÌôR¬Šm *uÇî5ú¯kX2ÖÖ1Z{@eÕªÚ·ô¢bڮ£?a^¥/_žtÍç+*@ûNŠh}ÞKMà®*²©jßÁC4Ÿxç[>¿RDTu=ŽdêE(:J €úºæê\*@Žž ú>>HØÞ׎§7,Œ»ªúdaåºÏP ê×`š8g4??ÑÖe@4ËÍ43Z&yŒé£¿Wö{ðð_ì »ûCtÊ÷×ýFQ×Ä`ûÞUŸ5Ý'ôÝ©hŒm;öúï²M¢4 @ #0:B©~FyÓ,,^Å€Tl,YSBE®ãšùÕ4J©Q š&êÔªpßO£§žbËís œVO Þô@ÜÀÙFhâí¥=(© ª+G8iM³$MÙžu÷\YXÚÆ=xŠÐO©ÓáÔgd&šc¹Ú < HôÜk2@¹ÿ}!nl)[ßTTOíòzÕœÖáhÇÛŽaáµ&PÄL4ÅDÕ>òúÎrÉÕ¬ãúÛýÿãÿܳ"`ç.\jÉ I€éãTË"Þ0pÄÄv;ñuøûdÈU1ÓD9ûZ[áÖ3çXû»BÀñX}Ìi¹N5[-hÓö2®¢§1ÞŸ}ëÃþë.·ë"ÍüoßÏ¢ûä÷΢ۢ[Ów®¡ÓÚLªÏÉÖµ5§eÆTîIúÕ÷°CõJ;ÐŽÑïfÕØèh«b³áØ~Y·ÑýéoÃýôŒá=^!@íÀhN/_Š(U$Ö|ç*\BüÃakz«ÅšÆ«LF«ªô¢Ÿ ¶FÊžqKÓ©xícuj-ì¬pÔª°\çÍÛ?;é¬ Yb Ñ07·¶¥¹FNÍ NœF|C»zýh£lÒïeSSxÛÒîù|}åøªòwPQ¹º3çÚèNÄPêŠ\RX·ª;GGc¬@àìŒe>|³ÎFmCÃ$zî5;¯p:6¥!=l/Xú?(=t+jD (£fÁœ~ª> ^s@EÀ\VŸ«Õg5 Æ)Z&ÖO³bÈ`«VJ95·yêÁ²ÝFðþ:p+µŽhX±:Slþw,ÇÂõÕôßòëd/Ž÷o-ßZ£²q@¹ÝÕ¹6cŠ*UñœÐ€®»¶DŽit^©¯6¬ZŠpq¥géÞ«è}KŠl¢œ¯û®RQ€Ú:UûÝHÐ2Z×tÆÐ}âø©ó>Âg}éÖVÆŸ*MOêŒo)ßmßÅÍ)D©EÈM£øs,ZI:к¡ÝžeÑv/Ðw`4:@ûU*Éÿýa€éïFø8¯ v `ާ÷/<gs +Gt°uv欹¢7löó«sò Ò4vñpûÛ·¯yÙÂê±uÔYVQ4mKÅš¢³Àã§OŠÇÓ(ŠTG]iµÎUC±Õ=P5å6 ÂnslZ€ðï$©pf%P§/Ûr&5B/3Dær«'ÛC»¶ í*ÏVfŠ!,.+w@M¡¡2dB(€Wûy ãRÁ.ÍñmQ=ó{2@Æ'ÚÓºVM£ò ©?qºùaû±> QGLÑ«6ù"Ê«U^n MßFõ7Šë¿`Éj¯ðmåânµô fGC|oZ4®ý©þ¶t,êØ 9¡UæóLS¢P¿*ìµ}5ñï,tXSOF pLŒ~><ªo¢{:ùË þ)ÒCµFdöéÞÍÿ×Þnݱb§vý2L#FðžiI£¶QB Þ€]¿ Å~;êøës=eE[2@æ¢:øª/ý螀_Ýsî¥hrœ?ÿº'Z³3Ö×÷ÅÖÝ^#YƶÊþVuTBºÑõJ1.m×ëoûZÙŠQVj>Ð=IéEºo)zMÓê»í;32úbÑíð; @ ddúÐû-ÚžehlzuJ59ß:öùñSRµq *«Óró¬ó«ù«£#ÝZOs«(LRy©Z_&AŽéÁF¡ùѱjÖzžÖšYÜвæLV,tzÔ1 ¢XÊÁÜd#ýŸãmûS§N_ZHÔd è!Z#'ìÁ]¹ÇNµðëg~VÁÐú*"šÝÀãݪšÿ8Uýj¹œÚ·ÒÏôÛÓÜí§¬j»B£MÇ€Ñå0Ê]ÆïÝC@×B¹öYø|ŽÙ »|ÞwúØu.UïA&RHÔaM2kFI¥yÜZ}¶E(z%Uá³®Ö{ j{J§Q§ìÖKhðæ¶?mÛÕÔ:ÚŠ£MyãúûÕ(²"S€WuD û šæÃ.3%§ç.ö?ÚõלGÅIµÌ¿è¥Í,¡ë€N×ò*ÿPä Ãu¥É\qxãÖÿùif<Êð2d ÈhQYa?âRHÍ*¢ûí»ikÖ¹[v ÷Åðy^»F@_º£ì;&Ñw[¢«î;3Ì<šï{[ÌhÕ Z³ÈÄê üÜÇÓÔôÝLäUŸ?e4*RM÷!í;ÓŸK"MÑ @%ÐQRœüsêTèaFsW«#QD9ëñÓPXÓ`)^Eö£Î·>ÍKÛRÁ+í3^¥_«*©sŠŠcÓOüaVÿ×>âW(º€ðãµmDÊ·Þú_=¬~A¡ŸñãÕ:}Vǧó6Ïø#+}&±¢5sŽ³Ý¿w@žNñ9±ÃÕn€'Mñ}øô£å^ÿöLª°<úªeAKáïD8ÿwI? ëm7ÿ=êo«y4/,ŸÊD ºþ€ÕhrNôÓüÞt/Ó=A×O×Hܺ7h¢ûÒ:ºwèóQMé}Ý£.uOÓuÕOžwê=¿ÏE÷£ãjÖé×ÖMu®Ëï' kŸ7ÃõéÈÚZ¯åéZÚ5Jt¿ßQíë»W!ÿ®>/Ä¿£ŒÎô]¬{ôÑUØ.¯ T0Rb9 @ @ `€ÁEä @ @©`€"Är@ @@ÀHÈ)@ @RÀHEå @ 4 S @ €"Ë!@ @i@ ."§@ @HE !C @Ò@\DN @ @*B, @ €4ž @ @ TX@ @Hip9@ @@*©± @ 0Òà"r @ T0Rb9 @ @ `€ÁEä @ @©`€"Är@ @@ÀHÈ)@ @RÀHEå @ 4 S @ €"Ë!@ @i@ ."§@ @HE !C @Ò@\DN @ @*B, @ €4ž @ @ TX@ @Hip9@ @@*©± @ 0Òà"r @ T0Rb9 @ @ `€ÁEä @ @©`€"Är@ @@ÀHÈ)@ @RÀHEå @ 4 S @ €"Ë!@ @i@ ."§@ @HE !C @Ò@\DN @ @*B, @ €?ŒÉ.qüÀ 4Ð@h 4Ð@ßÖÀoÖ¿¹úË,¬iùù¹è;íËpxùO#?0@h 4Ð@h 4з5ðú#Üÿ¶Àýý+Ýøøóï¹òÿòGwõïþœûCã¿süÀ 4Ð@h 4Ð@ßÖÀëÉpÿkÐ*÷ºüøó#ÝÎ?þ»þþ#ïÛçúqýÐ@h 4Ð@ÍÀ Â4Ð@h 4ÐèÀè·Ç 4Ð@h 400púÐ@h 4Ð@h h \d>>4Ð@h 4ÐÀÀÀéCh 4Ð@h ~ ~pqúpúÐ@h 4Ð@h§ 4Ð@h 4ú0úÁEÆéÃéCh 4Ð@h >4Ð@h 4ÐèÀè§§ 4Ð@h 400púÐ@h 4Ð@h h \d>>4Ð@h 4ÐÀÀÀéCh 4Ð@h ~ ~pqúpúÐ@h 4Ð@h§ 4Ð@h 4ú0úÁEÆéÃéCh 4Ð@h >4Ð@h 4ÐèHeü ÁyFÈIEND®B`

On Mon, Dec 23, 2024 at 12:22 PM Jonathan Coe via Boost < boost@lists.boost.org> wrote:
...
The repository link is https://github.com/jbcoe/poison_hash_append Thanks

Jonathan Coe wrote:
Thanks Jonathan. We actually discovered this issue during the review, because boost::json::value is constructible from e.g. boost::json::object and boost::json::array (and other things), which causes a similar infinite recursion issue (or would cause it, were tag_invoke overloads preferred over built-in handling for sequences and associatives.) I agree that we need to do something about it.

Ivan Matek wrote:
But original reason why I wanted to do this with span is that I wondered about performance. I wanted to see what happens when we do same thing(hashing of all contiguous struct members) in 3 ways.
1. just call hash_append for each member 2. exploit that before padding we are contiguous and trivial so pass that region in one call to hash_append_range 3. Use BOOST_DESCRIBE_STRUCT automagic
Long story short is that for some hashes it makes no difference, but on my machine for sha2_256 and ripemd_128 there exist small but reliable performance differences. Ranking is: 2. is fastest, 3. slowest, 1. in the middle. I am not surprised that 2. is a bit faster than 1. since we make just 1 call, but it is a bit weird that 3. is slower than 1., I would guess that described class expand into same code as case 1.
Could be just compiler randomly deciding to inline/unroll something or not, but I wonder if you are aware of this differences. Maybe my assumption that describe does not do anything differently than manually written calls for each member is wrong? Code is here <https://godbolt.org/z/WzPG54aTd> , but it does not compile since IDK how to get hash2 onto godbolt, and anyway godbolt is too noisy to test little perf differences. I have tested this with libc++ and clang 19.
Yeah, it's annoying that it can't "just work" somehow on CE. That's why I submit libraries to Boost, so that they show up there. One can manually copy and paste the necessary headers: https://godbolt.org/z/5Maf9Mx9h Using a "hash archetype" (a skeleton algorithm that doesn't have any definitions) it seems that MyStruct1 and MyStruct3 generate the exact same code, so it must be inlining shenanigans. mp_for_each, which the described class code uses, probably adds a few more function calls that push things over some Clang limit. As a general rule, Clang is more conservative with inlining than GCC is, especially at -O3.

One can manually copy and paste the necessary headers:
https://godbolt.org/z/5Maf9Mx9h
Using a "hash archetype" (a skeleton algorithm that doesn't have any definitions) it seems that MyStruct1 and MyStruct3 generate the exact same code, so it must be inlining shenanigans.
mp_for_each, which the described class code uses, probably adds a few more function calls that push things over some Clang limit.
As a general rule, Clang is more conservative with inlining than GCC is, especially at -O3.
Using ripemd_128, the code remains identical: https://godbolt.org/z/8hTdhT3rq

One can manually copy and paste the necessary headers:
https://godbolt.org/z/5Maf9Mx9h
Using a "hash archetype" (a skeleton algorithm that doesn't have any definitions) it seems that MyStruct1 and MyStruct3 generate the exact same code, so it must be inlining shenanigans.
mp_for_each, which the described class code uses, probably adds a few more function calls that push things over some Clang limit.
As a general rule, Clang is more conservative with inlining than GCC is, especially at -O3.
Using ripemd_128, the code remains identical: https://godbolt.org/z/8hTdhT3rq
But adding -DNDEBUG makes a difference: https://godbolt.org/z/d8Ga6eKM4 GCC sees through everything and knocks it out of the park, though. https://godbolt.org/z/YfqKnev49

Ivan Matek wrote:
2. exploit that before padding we are contiguous and trivial so pass that region in one call to hash_append_range
Note by the way that `double` is not contiguously hashable because +0.0 is equal to -0.0, but their binary representations differ. This is a known trap and N3980 mentions it: https://open-std.org/jtc1/sc22/wg21/docs/papers/2014/n3980.html#is_contiguou...

On Wed, Dec 4, 2024 at 8:38 PM Peter Dimov <pdimov@gmail.com> wrote:
2. exploit that before padding we are contiguous and trivial so pass
Ivan Matek wrote: that
region in one call to hash_append_range
Note by the way that `double` is not contiguously hashable because +0.0 is equal to -0.0, but their binary representations differ.
This is a known trap and N3980 mentions it:
https://open-std.org/jtc1/sc22/wg21/docs/papers/2014/n3980.html#is_contiguou... #
Yes, my mistake, and I even read the abseil::Hash documentation so that is 3 places that mention it(proposal, hash2 docs, abseil docs), but situation might still happen, if for example all those members were integers. Would in theory would it be possible to detect those regions with Describe and fuse the append calls? I ask because my original idea was to just allow users to pass pointers to members, e.g. ..., this, &MyStruct::x, &MyStruct::y, &MyStruct::z) before I learned offsetof is quite ugly, i.e. there is no way to go from member ptr to offset of member. I checked Describe docs and offset is not mentioned so I presume that information is unavailable? Not a big deal, as I mentioned difference between 2. and 1. approach is not large. Also thank you for the clang inlining hint, adding inline-threshod removes the difference in perf between 1. and 3, so I can confirm that now for me on my machine manually written memberwise hashing is as fast as automagic Describe one. Very impressive and nice use of existing Boost component. For curious this is how now my CMake section looks. if (CMAKE_CXX_COMPILER_ID STREQUAL "Clang") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -stdlib=libc++ -mllvm -inline-threshold=1000") endif ()

Ivan Matek wrote:
Would in theory would it be possible to detect those regions with Describe and fuse the append calls?
It is in theory, but in practice you'd see much bigger gains if you make sure your class has no padding and mark it as trivially equality comparable. vector<MyStruct>, for example, will then use a single update call for the entire element array.

On Wed, Dec 4, 2024 at 9:07 PM Peter Dimov <pdimov@gmail.com> wrote:
It is in theory, but in practice you'd see much bigger gains if you make sure your class has no padding and mark it as trivially equality comparable.
vector<MyStruct>, for example, will then use a single update call for the entire element array.
Yes I understand that, and to be clear I think it is amazing optimization,
not to mention that if we get reflection in C++26 you will be able to do it even more aggressively. But until reflection in some cases that would mean populating a dummy fields with zeros or any other value to make struct nopad(as uninitialized data being hashed is UB). Sure it is possible, but requires extra work from user. Speaking of performance I spent some time benchmarking a performance "problem" with appending .size(). I say "problem" since I barely managed to construct a benchmark where it shows, but it is not general case. I will first provide long introduction and description of what I did, if you are in a hurry you can jump to tl;dr recap bellow. *What is 7 bytes among friends?* Discussion earlier made it clear that in general case we must append size after we hash the content on non fixed size range. Reason for that is that as Peter explained "ab" | "c" can not produce same hash as "a" | "bc". So we do something like "ab" | 2 | "c" | 1 and "a" | 1 | "bc" | 2 Pipe here is separator between passing bytes to hash update. Another reason is empty ranges, e.g. empty string without passed size would not push any bytes to hash. So appending size is good in generic case. But this is not required in specific cases. Library currently very cleverly uses that certain ranges are fixed in size, e.g. std::array ( when size() > 0, as mentioned before there is special handling of empty range). You can see example here <https://godbolt.org/z/b6v9b6e19>(need to scroll down to main), but long story short is that if range is fixed size size is not encoded as it is not necessary. But another common case, even explicitly mentioned in documentation examples is when we are just hashing one value to obtain value for hash of some unordered container. Here issue with "ab", "c" hashing same as "a", "bc" does not exist since we will only ever be hashing one entire string at the time and immediately using that result, then dropping the hasher. In other words we can hash just "ab" instead of "ab", 2. We need to be careful to always hash something(e.g. for empty string we still must call append with something), but there is no need to hash .size() I have put together a small benchmark that was designed to to find the worst case for appending size versus not doing it, and I managed to get performance difference. Now situation is a bit complex since clang has violent performance swings depending on if he decides to inline something or not, but I managed to get a small but probably real difference resulting from "saving" of 7 bytes. To spam with large tables I will just recap results: I have used only fnv1a(results are very similar for 32 and 64). Despite my expectations(that static_string will benefit more than std::string from not hashing size since it is simpler data structure) not hashing size actually made hashing of std::string almost 2x faster. Now this result is obviously just because clang decided to stop inlining and is not fully realistic, but in general it is true that the bigger your function is it is less likely that it will be inlined. I am not saying this will happen often but it can happen. For static_string speed benefits were small but noticeable. e.g. for strings of this lengths: min/max len: 5/14 12459ns vs 13284ns Results could obviously be made more dramatic by making strings shorter min/max len: 3/8 6055ns 6937ns or less dramatic by making strings longer min/max len: 11/20 21622ns 22571ns As expected even though measuring exact ns is impossible it is clear that the lower in average string len we go as expected performance difference is larger since we have a fixed difference of 7 bytes(on my machine the difference in times also seems approximately fixed for small test set). I did not benchmark scenario where hash is used in for example flat_hash_map . I did not paste std::string results since as mentioned they are mostly influenced by clang inlining decisions, but you get the idea: there seems to be small but real performance difference when hashing size. I checked what some other popular C++ non std library does for std::string_view when it is implementing replacement for std::hash and it also hashes size, so I presume it is not unreasonable that boost does same, but I wonder if we could do something faster. There is also theoretically an issue that goes beyond hashing of single value, e.g. if you have std::pair<int, std::string_view> or std::pair<int, MyStruct> here you could also skip hashing string_view size /use optimized hash of MyStruct(based on some type trait), but that case seems much less frequent and harder to specify due to lack of reflection. So to just stick to theoretical helper boost::hash2::hash_key: If my results were not just some silly benchmark mistake would there be a benefit of having boost::hash2::key_hash or some helper like that that does not hash size, and immediately returns size_t value(so user has no way of messing up by doing another call to hash_append) Here is noncompiling godbolt <https://godbolt.org/z/f6ETzczz7> link. I do not expect people to go over code and debug why clang decided to not inline something or why some simple tricks(call with fixed n of 8 causes unrolling on my setup) on my machine produce better performance, it is just here for people who may suspect that I made some obvious mistake and want to double check. tl;dr hashing size of non const size range is good general approach, but I wonder if for best performance there needs to be special case hasher useful for unordered containers. It will know for some types such as std::string, std::string_view, std::pair<int, std::string_view>, std::vector<int>,... to not hash size, while for some it will have to hash sizes, e.g. std::pair< std::string_view, std::vector<int>>.

On 12/6/24 00:18, Ivan Matek via Boost wrote:
I did not paste std::string results since as mentioned they are mostly influenced by clang inlining decisions, but you get the idea: there seems to be small but real performance difference when hashing size. I checked what some other popular C++ non std library does for std::string_view when it is implementing replacement for std::hash and it also hashes size, so I presume it is not unreasonable that boost does same, but I wonder if we could do something faster.
Technically, it doesn't need to be size to separate the two fields. You can use any kind of separator, including a fixed one (i.e. not depending on either of the fields it separates). I.e. instead of this: "ab" | 2 | "c" | 1 you could have this: "ab" | separator_t{} | "c" | separator_t{} An empty sequence could simply be hashed as separator_t{}. The question is how separator_t would hash and whether it could be made any faster than just hashing the size. I suppose, it could be smaller (e.g. 1 byte of data instead of sizeof(size_t)), but I'm not sure if that would mean anything in terms of performance.

On Thu, Dec 5, 2024 at 10:53 PM Andrey Semashev via Boost < boost@lists.boost.org> wrote:
Technically, it doesn't need to be size to separate the two fields. You can use any kind of separator, including a fixed one (i.e. not depending on either of the fields it separates). I.e. instead of this:
"ab" | 2 | "c" | 1
you could have this:
"ab" | separator_t{} | "c" | separator_t{}
An empty sequence could simply be hashed as separator_t{}.
The question is how separator_t would hash and whether it could be made any faster than just hashing the size. I suppose, it could be smaller (e.g. 1 byte of data instead of sizeof(size_t)), but I'm not sure if that would mean anything in terms of performance.
As far as I understand that will not work. Assume separator is char 'x' although it does not really matter what the value is, it is just for ease of writing. now "a" | "xc" hashes same as "ax" | "c" because both produce axxc

On 12/6/24 00:59, Ivan Matek wrote:
On Thu, Dec 5, 2024 at 10:53 PM Andrey Semashev via Boost <boost@lists.boost.org <mailto:boost@lists.boost.org>> wrote:
Technically, it doesn't need to be size to separate the two fields. You can use any kind of separator, including a fixed one (i.e. not depending on either of the fields it separates). I.e. instead of this:
"ab" | 2 | "c" | 1
you could have this:
"ab" | separator_t{} | "c" | separator_t{}
An empty sequence could simply be hashed as separator_t{}.
The question is how separator_t would hash and whether it could be made any faster than just hashing the size. I suppose, it could be smaller (e.g. 1 byte of data instead of sizeof(size_t)), but I'm not sure if that would mean anything in terms of performance.
As far as I understand that will not work. Assume separator is char 'x' although it does not really matter what the value is, it is just for ease of writing.
now "a" | "xc" hashes same as "ax" | "c" because both produce axxc
Yes, you're right.

On Tue, Dec 3, 2024 at 9:09 PM Peter Dimov via Boost <boost@lists.boost.org> wrote:
On the other hand, it makes it trivial to generate collisions
pair<string, string>( "foo", "bar" ) pair<string, string>( "foob", "ar" ) pair<string, string>( "fooba", "r" )
Independently of what others noted that this does not in fact collide, this reminds me a bit of https://www.sqlite.org/dbhash.html, which hashes an SQLite DB. DRH hashes each row/col value's type [1], in addition to the value's bytes, thus such collisions can't happen. Thus it would hash: { SQLITE_TEXT, "foo", SQLITE_TEXT, "bar" } { SQLITE_TEXT, "foob", SQLITE_TEXT, "ar" } { SQLITE_TEXT, "fooba", SQLITE_TEXT, "r" } resulting in different hashes. --DD [1]: https://www.sqlite.org/datatype3.html

Dominique Devienne wrote:
On Tue, Dec 3, 2024 at 9:09 PM Peter Dimov via Boost <boost@lists.boost.org> wrote:
On the other hand, it makes it trivial to generate collisions
pair<string, string>( "foo", "bar" ) pair<string, string>( "foob", "ar" ) pair<string, string>( "fooba", "r" )
Independently of what others noted that this does not in fact collide, this reminds me a bit of https://www.sqlite.org/dbhash.html, which hashes an SQLite DB. DRH hashes each row/col value's type [1], in addition to the value's bytes, thus such collisions can't happen.
Thus it would hash: { SQLITE_TEXT, "foo", SQLITE_TEXT, "bar" } { SQLITE_TEXT, "foob", SQLITE_TEXT, "ar" } { SQLITE_TEXT, "fooba", SQLITE_TEXT, "r" }
resulting in different hashes. --DD
That's the equivalent of hashing a variant, which does (or should, anyway) include the index.

On 12/2/24 22:48, Peter Dimov via Boost wrote:
Comments and questions are welcome; you don't need to wait for the review.
A few comments: 1. In the HashAlgorithm interface, there is the result() method. https://pdimov.github.io/hash2/doc/html/hash2.html#hashing_bytes_result I think the name is rather confusing as usually nouns are used for pure accessors, which result() isn't. I think, something like finalize() would be better. At the very least, it should probably be a verb and indicate that the method is actually supposed to modify the internal state before returning the final hash value. I admit that in the docs you describe a use case of repeatedly calling result() to obtain a pseudo-random sequence of numbers, and for that usage the finalize() name doesn't look appropriate. But (a) result() is even less appropriate (because to an uninitiated user it looks like the code always returns the same value) and (b) I would say that use case is not the primary one anyway. 2. Somewhat related, on the use case of extending the size of the hash value by repeatedly calling result(). Is this something that should be encouraged? I'm not a specialist, but my understanding is that extending the hash value this way does not improve its quality, as you get a series of bits in the value that are predetermined based on the lower bits. Isn't that effectively equivalent to just e.g. zero-extending the hash value? I think, if a larger hash value is needed, one should generally use a different hash function with a larger output. If my understanding above is correct then the docs should probably not advise extension by repeatedly calling result() or at the very least have a recommendation to consider using a different hash function in this case. 3. Since there is already the std::hash infrastructure that is supported by std unordered containers and more, have you considered providing means to simplify integration of user types supporting Boost.Hash2 protocol with std::hash? The support could be provided in a number of ways. One example is to provide a separate header with a std::hash specialization that would forward to Boost.Hash2 facilities, if the type supports it. The support could be enabled on opt-in basis e.g. by defining a special member type. Here is how this could be done in C++20: https://godbolt.org/z/1oe51bxPj The user would need to include the boost/hash2/std_hash.hpp header and define a boost_hash2_enable_std_hash member type in his type that supports Boost.Hash2 protocol to automatically obtain a std::hash specialization for it. I'm not sure if this could be done without concepts, but even if not, I think such a utility would be useful. Another idea is to provide a macro that would generate a std::hash specialization for a user's type.

On Fri, Dec 6, 2024 at 10:36 PM Andrey Semashev via Boost < boost@lists.boost.org> wrote:
On 12/2/24 22:48, Peter Dimov via Boost wrote:
Comments and questions are welcome; you don't need to wait for the review.
A few comments:
1. In the HashAlgorithm interface, there is the result() method.
https://pdimov.github.io/hash2/doc/html/hash2.html#hashing_bytes_result
I think the name is rather confusing as usually nouns are used for pure accessors, which result() isn't. I think, something like finalize() would be better. At the very least, it should probably be a verb and indicate that the method is actually supposed to modify the internal state before returning the final hash value.
I admit that in the docs you describe a use case of repeatedly calling result() to obtain a pseudo-random sequence of numbers, and for that usage the finalize() name doesn't look appropriate. But (a) result() is even less appropriate (because to an uninitiated user it looks like the code always returns the same value) and (b) I would say that use case is not the primary one anyway.
I was looking into if this could be wrapped into a nicer interface, that is harder to misuse. Main idea is to use std::move to signal we are done. This has the benefit that most users know that after std::move object state is not guaranteed to be usable. Second benefit is "Rust at home". We can use clang-tidy as very primitive use after move checker. What I came up quickly is this: template <typename H, typename F = boost::hash2::default_flavor> class simple_hash_values { public: simple_hash_values() { // safety for case user never calls append boost::hash2::hash_append(h, F{}, filler); } // to prevent clang tidy complaining about std::move of trivially copyable type simple_hash_values(simple_hash_values&) = delete; simple_hash_values(simple_hash_values&&) = default; template <typename V> void append(const V& value) { boost::hash2::hash_append(h, F{}, value); } // limit to simple results static_assert(std::is_same_v<size_t, std::remove_cvref_t<decltype(H{}.result())>> || std::is_same_v<uint32_t, std::remove_cvref_t<decltype(H{}.result())>>); private: auto result() { return h.result(); } // value does not matter static constexpr char filler = 'x'; H h; [[nodiscard]] friend auto get_digest(simple_hash_values&& simple_hash) { return simple_hash.result(); } }; use is like this: { simple_hash_values<fnv1a_32> h; std::string x{"ab"}; std::string y{"c"}; h.append(x); h.append(y); // does not compile // get_digest(h); const auto digest = get_digest(std::move(h)); // compiles, gives clang-tidy bugprone-use-after-move get_digest(std::move(h)); std::print("{:x}\n", digest); } clang-tidy warning is nice, minor issue is that for me it is not running in IDE, I presume this kind of checks is expensive so I had to run it in terminal manually. warning: 'h' used after it was moved [bugprone-use-after-move] 20 | get_digest(std::move(h)); | ^ ...example/simple_hash_values.cpp:18:29: note: move occurred here 18 | const auto digest = get_digest(std::move(h)); But this has limitations: (from documentation) In some cases, the check may not be able to detect that two branches are mutually exclusive. For example (assuming that i is an int): if (i == 1) { messages.emplace_back(std::move(str));}if (i == 2) { std::cout << str;} In this case, the check will erroneously produce a warning, even though it is not possible for both the move and the use to be executed. More formally, the analysis is flow-sensitive but not path-sensitive <https://en.wikipedia.org/wiki/Data-flow_analysis#Sensitivities>. Another option for safer wrapper is to handle case when user just hashes everything in one place, so we would be returning digest immediately from function invoked with (x, y). This function can not be called append since we are actually producing final result immediately, but beside that idea is similar. So maybe something like simple_hash_all<fnv1a_32> h; h.get_digest(x,y); h.get_digest(x,y); // recreates hash, gives same result as above

+1 to this. I have personally given the same feedback about this to one of the co-authors in private, although I failed to bring it up in the ML, so thanks for mentioning this aspect. Using clang-tidy at CI only on the changed files is a common practice, and poison-after-use practices are great when used along with clang-tidy's use-after-move checks. Claudio.

On Fri, Dec 6, 2024 at 2:47 PM Claudio DeSouza via Boost < boost@lists.boost.org> wrote:
+1 to this.
A friendly reminder for all mailing list participants to be mindful of the Boost Discussion Policy located here: https://www.boost.org/community/policy.html Thanks

On Fri, Dec 6, 2024 at 2:42 PM Ivan Matek via Boost <boost@lists.boost.org> wrote:
I was looking into if this could be wrapped into a nicer interface, that is harder to misuse.
There could be merit here, and first we should identify who the users are. These are the categories of "users" of Hash2: 1. Authors of a hash_append overload for a user-defined type 2. Authors of a HashAlgorithm 3. Authors of a Hash (the C++ named requirement described in https://en.cppreference.com/w/cpp/named_req/Hash) 4. Authors of a foreign hash concept (something like a QHash or absl::Hash) Let's analyze each case: 1. Authors of a hash_append overload for a user-defined type There are uncountably many such users. They don't need to call result(), and thus cannot misuse it. 2. Authors of a HashAlgorithm There are a small finite number of these users, most of which will simply be wrapping an existing cryptographic or non-cryptographic algorithm. They need to implement result(), not call it, and thus cannot misuse it. 3. Authors of a Hash (the C++ named requirement described in https://en.cppreference.com/w/cpp/named_req/Hash) 4. Authors of a foreign hash concept (something like a QHash or absl::Hash) There are a small finite number of these users. We can probably identify some of them. boost::hash comes to mind, plus the ones already written in Hash2. We hope the calls to result() within the Hash2 implementation are written correctly. The same cannot be said about future implementers; they could in theory "misuse calls to result()." Authors of the C++ Hash named requirement and similar non-standard named requirements are rare and we can probably assume they know what they are doing, as most users are served by utilizing the existing Hash functions such as boost::hash2::uhash which work correctly out of the box and thus cannot end up with misuse of calls to result(). Given that a limitless number of users already can't misuses result(), and that the potential misuses of result() could only happen to a small number of experts tasked with implementing named requirements, I'm not seeing the value proposition for adding additional ceremony around the call. This doesn't mean that result() doesn't have problems, and we should address those directly instead of wrapping it. Thanks

On Fri, Dec 6, 2024 at 11:56 PM Vinnie Falco <vinnie.falco@gmail.com> wrote:
On Fri, Dec 6, 2024 at 2:42 PM Ivan Matek via Boost <boost@lists.boost.org> wrote:
I was looking into if this could be wrapped into a nicer interface, that is harder to misuse.
There could be merit here, and first we should identify who the users are. These are the categories of "users" of Hash2:
1. Authors of a hash_append overload for a user-defined type 2. Authors of a HashAlgorithm 3. Authors of a Hash (the C++ named requirement described in https://en.cppreference.com/w/cpp/named_req/Hash) 4. Authors of a foreign hash concept (something like a QHash or absl::Hash)
Hi Vinnie, I was not able to fully follow this categorization, could you tell me under which category is the following example? https://pdimov.github.io/hash2/doc/html/hash2.html#example_md5sum
Those are the usecases which I was "targeting" with hard to misuse wrapper since I presume: - if library was successful those kind of uses will be most common - knowledge of preconditions to use library of average end users is lower on average than those of library implementers(here talking about both Hash2 library and some other library that uses Hash2 framework to add new hash).

On Fri, Dec 6, 2024 at 3:22 PM Ivan Matek <libbooze@gmail.com> wrote:
could you tell me under which category is the following example? https://pdimov.github.io/hash2/doc/html/hash2.html#example_md5sum
Those users are not listed in my taxonomy but they could be listed thusly: 5. Users who need to computed a cryptographic or secure hash function directly on binary data There are uncountably many of such users, yet Hash2 is not designed primarily for them. Although it is quite handy to be able to use the cryptographic primitives that Hash2 does provide, when they are needed. For example here: https://github.com/boostorg/beast/blob/33cfc5653cb57bc0ebe189af007a685714e98...
Those are the usecases which I was "targeting" with hard to misuse wrapper since I presume: - if library was successful those kind of uses will be most common - knowledge of preconditions to use library of average end users is lower on average than those of library implementers(here talking about both Hash2 library and some other library that uses Hash2 framework to add new hash).
We should not over-engineer result() past the level of what is already common practice in other cryptographic libraries, since they serve the same user base. For example the API that Beast copied from another library simply uses init(), update(), and finish(): https://github.com/boostorg/beast/blob/develop/include/boost/beast/core/deta... Hash2 should work the same way. And I think the member function result() should be changed to a verb like finalize(). And we should provide more guidance and language around its behavior. I will have more to say on this in another post. Thanks

Those users are not listed in my taxonomy but they could be listed thusly:
5. Users who need to computed a cryptographic or secure hash function directly on binary data
There are uncountably many of such users, yet Hash2 is not designed primarily for them. Although it is quite handy to be able to use the cryptographic primitives that Hash2 does provide, when they are needed. For example here:
Thank you for the answer. Interesting how different people have different assumptions. :) I know you are much more involved in boost and author of original paper so your's is
On Sat, Dec 7, 2024 at 1:06 AM Vinnie Falco <vinnie.falco@gmail.com> wrote: probably correct :), but I have assumed that 5. is one of primary targets for a Boost library. E.g. C++ beginner googling how to hash std::pair (this is more for https://pdimov.github.io/hash2/doc/html/hash2.html#example_use_with_unordere... , not md5) how to sha256 files C++ ...

On 12/7/24 01:42, Ivan Matek wrote:
On Fri, Dec 6, 2024 at 10:36 PM Andrey Semashev via Boost <boost@lists.boost.org <mailto:boost@lists.boost.org>> wrote:
On 12/2/24 22:48, Peter Dimov via Boost wrote: > > Comments and questions are welcome; you don't need to wait for the > review.
A few comments:
1. In the HashAlgorithm interface, there is the result() method.
https://pdimov.github.io/hash2/doc/html/ hash2.html#hashing_bytes_result <https://pdimov.github.io/hash2/doc/ html/hash2.html#hashing_bytes_result>
I think the name is rather confusing as usually nouns are used for pure accessors, which result() isn't. I think, something like finalize() would be better. At the very least, it should probably be a verb and indicate that the method is actually supposed to modify the internal state before returning the final hash value.
I admit that in the docs you describe a use case of repeatedly calling result() to obtain a pseudo-random sequence of numbers, and for that usage the finalize() name doesn't look appropriate. But (a) result() is even less appropriate (because to an uninitiated user it looks like the code always returns the same value) and (b) I would say that use case is not the primary one anyway.
I was looking into if this could be wrapped into a nicer interface, that is harder to misuse.
As far as the result() method is concerned, I think it should be renamed in the HashAlgorithm interface. I don't see the point in renaming it just in the wrapper. The new name should resolve the confusion regarding the method purpose and operation. As to the usage with the forced move, I don't think the added complexity is justified. If the goal is to make sure the hash value doesn't change upon successive calls to result() (to use the existing nomenclature) then convert it to a pure getter and make a separate finalize() method that returns void. If the use case of generation of new values upon subsequent result() calls is deemed important then the current interface is fine, barring the name of the method. But I don't see the benefit in introducing UB (potentially, to be caught by sanitizers - *if* one runs one) upon subsequent calls to result().

On 12/7/24 03:08, Andrey Semashev wrote:
On 12/7/24 01:42, Ivan Matek wrote:
On Fri, Dec 6, 2024 at 10:36 PM Andrey Semashev via Boost <boost@lists.boost.org <mailto:boost@lists.boost.org>> wrote:
On 12/2/24 22:48, Peter Dimov via Boost wrote: > > Comments and questions are welcome; you don't need to wait for the > review.
A few comments:
1. In the HashAlgorithm interface, there is the result() method.
https://pdimov.github.io/hash2/doc/html/ hash2.html#hashing_bytes_result <https://pdimov.github.io/hash2/doc/ html/hash2.html#hashing_bytes_result>
I think the name is rather confusing as usually nouns are used for pure accessors, which result() isn't. I think, something like finalize() would be better. At the very least, it should probably be a verb and indicate that the method is actually supposed to modify the internal state before returning the final hash value.
I admit that in the docs you describe a use case of repeatedly calling result() to obtain a pseudo-random sequence of numbers, and for that usage the finalize() name doesn't look appropriate. But (a) result() is even less appropriate (because to an uninitiated user it looks like the code always returns the same value) and (b) I would say that use case is not the primary one anyway.
I was looking into if this could be wrapped into a nicer interface, that is harder to misuse.
As far as the result() method is concerned, I think it should be renamed in the HashAlgorithm interface. I don't see the point in renaming it just in the wrapper. The new name should resolve the confusion regarding the method purpose and operation.
As to the usage with the forced move, I don't think the added complexity is justified. If the goal is to make sure the hash value doesn't change upon successive calls to result() (to use the existing nomenclature) then convert it to a pure getter and make a separate finalize() method that returns void. If the use case of generation of new values upon subsequent result() calls is deemed important then the current interface is fine, barring the name of the method. But I don't see the benefit in introducing UB (potentially, to be caught by sanitizers - *if* one runs one) upon subsequent calls to result().
Though perhaps there is value in prohibiting subsequent calls to result(), or at least not requiring any specific behavior upon such calls. One use case is creating wrappers for third party libraries. For example, in OpenSSL, EVP_DigestFinal_ex prevents any subsequent data to be consumed by the digest algorithm. If one were to write a Boost.Hash2 wrapper for OpenSSL digest algorithms, it would be difficult to continue producing data on subsequent calls to result().

On Sat, Dec 7, 2024 at 1:08 AM Andrey Semashev via Boost < boost@lists.boost.org> wrote:
On 12/7/24 01:42, Ivan Matek wrote:
On Fri, Dec 6, 2024 at 10:36 PM Andrey Semashev via Boost <boost@lists.boost.org <mailto:boost@lists.boost.org>> wrote:
As to the usage with the forced move, I don't think the added complexity is justified. If the goal is to make sure the hash value doesn't change upon successive calls to result() (to use the existing nomenclature)
Goal was to "encourage" users in 2 ways to call result() only once. First way is that move signals that value is "tainted", second is that clang-tidy can detect double moves sometimes.
But I don't see the benefit in introducing UB (potentially, to be caught by sanitizers - *if* one runs one) upon subsequent calls to result().
If you are referring to multiple calls to get_digest(std::move(h)); There is no UB. Move is just a cast, we do not nuke the member when we return it's result(), and clang-tidy checks are static(not runtime). I understand it is verbose, but I can not think of anything better(unless we just do nothing :( ).
_______________________________________________ Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost

On 12/7/24 03:23, Ivan Matek wrote:
On Sat, Dec 7, 2024 at 1:08 AM Andrey Semashev via Boost <boost@lists.boost.org <mailto:boost@lists.boost.org>> wrote:
On 12/7/24 01:42, Ivan Matek wrote: > > > On Fri, Dec 6, 2024 at 10:36 PM Andrey Semashev via Boost > <boost@lists.boost.org <mailto:boost@lists.boost.org> <mailto:boost@lists.boost.org <mailto:boost@lists.boost.org>>> wrote:
As to the usage with the forced move, I don't think the added complexity is justified. If the goal is to make sure the hash value doesn't change upon successive calls to result() (to use the existing nomenclature)
Goal was to "encourage" users in 2 ways to call result() only once. First way is that move signals that value is "tainted", second is that clang-tidy can detect double moves sometimes.
But I don't see the benefit in introducing UB (potentially, to be caught by sanitizers - *if* one runs one) upon subsequent calls to result().
If you are referring to multiple calls to get_digest(std::move(h)); There is no UB. Move is just a cast, we do not nuke the member when we return it's result(), and clang-tidychecks are static(not runtime).
It may be UB if the hasher's result() has an rvalue-qualified overload that moves parts of its internal representation out in the returned hash value.

On Sat, Dec 7, 2024 at 1:29 AM Andrey Semashev via Boost < boost@lists.boost.org> wrote:
On 12/7/24 03:23, Ivan Matek wrote:
It may be UB if the hasher's result() has an rvalue-qualified overload that moves parts of its internal representation out in the returned hash value.
I believe in code we will not call && overload. One reason is I think is that named rvalue reference is lvalue reference Second is that we are anyway calling std::move on wrapper, not on stored member, i.e. wrapper result function does not destroy/move/reset member. auto result() { return h.result(); }

On 12/7/24 00:36, Andrey Semashev wrote:
On 12/2/24 22:48, Peter Dimov via Boost wrote:
Comments and questions are welcome; you don't need to wait for the review.
A few comments:
1. In the HashAlgorithm interface, there is the result() method.
https://pdimov.github.io/hash2/doc/html/hash2.html#hashing_bytes_result
I think the name is rather confusing as usually nouns are used for pure accessors, which result() isn't. I think, something like finalize() would be better. At the very least, it should probably be a verb and indicate that the method is actually supposed to modify the internal state before returning the final hash value.
I admit that in the docs you describe a use case of repeatedly calling result() to obtain a pseudo-random sequence of numbers, and for that usage the finalize() name doesn't look appropriate. But (a) result() is even less appropriate (because to an uninitiated user it looks like the code always returns the same value) and (b) I would say that use case is not the primary one anyway.
2. Somewhat related, on the use case of extending the size of the hash value by repeatedly calling result(). Is this something that should be encouraged? I'm not a specialist, but my understanding is that extending the hash value this way does not improve its quality, as you get a series of bits in the value that are predetermined based on the lower bits. Isn't that effectively equivalent to just e.g. zero-extending the hash value?
I think, if a larger hash value is needed, one should generally use a different hash function with a larger output. If my understanding above is correct then the docs should probably not advise extension by repeatedly calling result() or at the very least have a recommendation to consider using a different hash function in this case.
3. Since there is already the std::hash infrastructure that is supported by std unordered containers and more, have you considered providing means to simplify integration of user types supporting Boost.Hash2 protocol with std::hash?
The support could be provided in a number of ways. One example is to provide a separate header with a std::hash specialization that would forward to Boost.Hash2 facilities, if the type supports it. The support could be enabled on opt-in basis e.g. by defining a special member type.
Here is how this could be done in C++20:
https://godbolt.org/z/1oe51bxPj
The user would need to include the boost/hash2/std_hash.hpp header and define a boost_hash2_enable_std_hash member type in his type that supports Boost.Hash2 protocol to automatically obtain a std::hash specialization for it.
I'm not sure if this could be done without concepts, but even if not, I think such a utility would be useful.
Another idea is to provide a macro that would generate a std::hash specialization for a user's type.
...And of course I missed the most obvious solution. Which is to provide a header with a uhash class template that implements std::hash interface for the type and just use Boost.Hash2 protocol to compute the hash value. No concepts or anything elaborate needed in this case, but the user will have to explicitly specify uhash<T> as the hash function in containers.

Andrey Semashev wrote:
2. Somewhat related, on the use case of extending the size of the hash value by repeatedly calling result(). Is this something that should be encouraged? I'm not a specialist, but my understanding is that extending the hash value this way does not improve its quality, as you get a series of bits in the value that are predetermined based on the lower bits. Isn't that effectively equivalent to just e.g. zero-extending the hash value?
No, it isn't. Hashes often have more internal state than they output as the final result, so extension can actually produce non-redundant bits. This is true, for example, for xxhash and siphash, and there's an example in the docs of extending xxhash. Even if the effective number of bits doesn't change, it's still not the same as zero-extending, because a zero-extended hash is of very poor quality. (The constant zero bits, being constant and zero, are completely unaffected by the input.) Somewhat related, if you ask get_integral_result for more bits than there are in the input value, it takes care to not just give you something zero- extended, for the same reason. Ideally, each bit in the hash value should have about 50% probability of being 1. This is called "avalanche property".

Andrey Semashev wrote:
2. Somewhat related, on the use case of extending the size of the hash value by repeatedly calling result(). Is this something that should be encouraged? I'm not a specialist, but my understanding is that extending the hash value this way does not improve its quality, as you get a series of bits in the value that are predetermined based on the lower bits. Isn't that effectively equivalent to just e.g. zero-extending the hash value?
No, it isn't. Hashes often have more internal state than they output as the final result, so extension can actually produce non-redundant bits. This is true, for example, for xxhash and siphash, and there's an example in the docs of extending xxhash.
Even if the effective number of bits doesn't change, it's still not the same as zero-extending, because a zero-extended hash is of very poor quality. (The constant zero bits, being constant and zero, are completely unaffected by the input.)
Somewhat related, if you ask get_integral_result for more bits than there are in the input value, it takes care to not just give you something zero- extended, for the same reason.
Ideally, each bit in the hash value should have about 50% probability of being 1. This is called "avalanche property".
So, for example, if you have a 32 bit hash function and you need 64 bits, this is how you would do it, ordered from best to worst: // as good as possible uint64_t f1( Hash& hash ) { uint32_t r1 = hash.result(); uint32_t r2 = hash.result(); return (uint64_t(r1) << 32) | r2; } // not that bad, but worse than the above uint64_t f2( Hash& hash ) { return get_integral_result<uint64_t>( hash.result() ); } // pretty bad, but at least better than the next one uint64_t f3( Hash& hash ) { uint32_t r = hash.result(); return (uint64_t(r) << 32) | r; } // worst possible uint64_t f4( Hash& hash ) { return hash.result(); }

So, for example, if you have a 32 bit hash function and you need 64 bits, this is how you would do it, ordered from best to worst:
// as good as possible uint64_t f1( Hash& hash ) { uint32_t r1 = hash.result(); uint32_t r2 = hash.result(); return (uint64_t(r1) << 32) | r2; }
// not that bad, but worse than the above uint64_t f2( Hash& hash ) { return get_integral_result<uint64_t>( hash.result() ); }
All that leads me to the thought that I've got get_integral_result wrong; it should take the hash algorithm directly, not its result, and should invoke result() as many times as needed to obtain the necessary number of bits. // best uint64_t f0( Hash& hash ) { return get_integral_result<uint64_t>( hash ); }

On 12/8/24 21:31, Peter Dimov via Boost wrote:
So, for example, if you have a 32 bit hash function and you need 64 bits, this is how you would do it, ordered from best to worst:
// as good as possible uint64_t f1( Hash& hash ) { uint32_t r1 = hash.result(); uint32_t r2 = hash.result(); return (uint64_t(r1) << 32) | r2; }
// not that bad, but worse than the above uint64_t f2( Hash& hash ) { return get_integral_result<uint64_t>( hash.result() ); }
All that leads me to the thought that I've got get_integral_result wrong; it should take the hash algorithm directly, not its result, and should invoke result() as many times as needed to obtain the necessary number of bits.
This would be incompatible with algorithms that don't support multiple calls to finalize().

Andrey Semashev wrote:
All that leads me to the thought that I've got get_integral_result wrong; it should take the hash algorithm directly, not its result, and should invoke result() as many times as needed to obtain the necessary number of bits.
This would be incompatible with algorithms that don't support multiple calls to finalize().
That is why multiple calls to result() (there's no finalize) are required to be supported.

On 12/8/24 23:51, Peter Dimov via Boost wrote:
Andrey Semashev wrote:
All that leads me to the thought that I've got get_integral_result wrong; it should take the hash algorithm directly, not its result, and should invoke result() as many times as needed to obtain the necessary number of bits.
This would be incompatible with algorithms that don't support multiple calls to finalize().
That is why multiple calls to result() (there's no finalize) are required to be supported.
Does this mean you're not going to support algorithms that require no more than one call to finalize()/result()? (I'm using finalize() as the name Vinnie has agreed with.) This does not have to be the case, though. You could extend the hash value using some specific algorithm that does support multiple calls to finalize()/result(). It doesn't have to be the same algorithm that produced the original value.

On Sun, Dec 8, 2024 at 1:22 PM Peter Dimov via Boost <boost@lists.boost.org> wrote:
That's what the requirements say, yes. This is fully intentional and not incidental.
Were you going to comment on my earlier remarks concerning result() and finalize()? Or is the above the remark (or lack thereof)? Thanks

Does this mean you're not going to support algorithms that require no more than one call to finalize()/result()?
That's what the requirements say, yes. This is fully intentional and not incidental.
I am copying discussion of this topic from Slack for greater visibility since I believe it is relevant to fundamental design of the library. Vinnie: For example, if a user implements a HashAlgorithm based on the code in rfc3174 (https://datatracker.ietf.org/doc/html/rfc3174#section-6) without making any changes, result will be idempotent and always return the same value regardless of the number of calls. And calls to update will generate an error Peter: sure, but that's not a correct implementation of the HashAlgorithm concept, so the user shouldn't do that. idempotent result is not a basis operation, because it's achievable by making a copy of the algorithm. Vinnie: Who are the authors of HashAlgorithm? I would argue they are ordinary users, not cryptographic experts, who are simply adapting an already-written algorithm to meet the named requirements. Expecting them to also become experts in hash algorithms is unreasonable and in my opinion beyond the scope of the library. expecting users to peer at someone else's implementation (e.g. rfc3174) and figure out whether or not it meets the HashAlgorithm requirements is unreasonable. no one is going to know anything about avalanches or even distribution or whatever. I am not suggesting that result should be idempotent. I am pointing out that the code in the RFC is idempotent, which breaks some principles of calling result twice. [snip extract from RFC3174 SHA1Result Implementaion] calling SHA1Result more than once just returns the same digest over and over. and calling SHA1Input after calling SHA1Result produces an error. Peter: Sure, but that's because the functions go out of their way to do that. If you remove the checks, you get what I require Vinnie: Users should not have to be experts in understanding the hash algorithm. You said yourself the library is not intended to be the repository for cryptographic algorithms. Obviously, users are going to want to adapt foreign code to the HashAlgorithm concept. Putting these additional requirements such as allowing update and result to be interleaved and called more than once is an unnecessary burden which forces authors of HashAlgorithm to become experts. I would ask, what is the motivating use-case for calling result twice? This is not explained in the docs and no examples are given. In fact, the one example given says "not to do this". Peter: on the other hand though, users of hash algorithms get useful functionality, which is otherwise withheld from them by accident or in some cases, even deliberately. the library can never provide assurances on the quality. it's entirely dependent on the hash algorithm. the quality of calling result once is also dependent on the hash algorithm Vinnie: That is true and by extension the library yields the same quality. Yet most hash algorithms have nothing to say about the quality of a second call to finalize. You are now forcing them to either say something, or for the user to guess Peter: yes, by imposing requirements on the hash algorithm I'm forcing them to say something. that's the point of imposing requirements. Matt RFC 3174: https://datatracker.ietf.org/doc/html/rfc3174#section-6

On 12/9/24 19:22, Matt Borland via Boost wrote:
Does this mean you're not going to support algorithms that require no more than one call to finalize()/result()?
That's what the requirements say, yes. This is fully intentional and not incidental.
I am copying discussion of this topic from Slack for greater visibility since I believe it is relevant to fundamental design of the library.
Vinnie: For example, if a user implements a HashAlgorithm based on the code in rfc3174 (https://datatracker.ietf.org/doc/html/rfc3174#section-6) without making any changes, result will be idempotent and always return the same value regardless of the number of calls. And calls to update will generate an error
Peter: sure, but that's not a correct implementation of the HashAlgorithm concept, so the user shouldn't do that. idempotent result is not a basis operation, because it's achievable by making a copy of the algorithm.
Vinnie: Who are the authors of HashAlgorithm? I would argue they are ordinary users, not cryptographic experts, who are simply adapting an already-written algorithm to meet the named requirements. Expecting them to also become experts in hash algorithms is unreasonable and in my opinion beyond the scope of the library. expecting users to peer at someone else's implementation (e.g. rfc3174) and figure out whether or not it meets the HashAlgorithm requirements is unreasonable. no one is going to know anything about avalanches or even distribution or whatever. I am not suggesting that result should be idempotent. I am pointing out that the code in the RFC is idempotent, which breaks some principles of calling result twice. [snip extract from RFC3174 SHA1Result Implementaion] calling SHA1Result more than once just returns the same digest over and over. and calling SHA1Input after calling SHA1Result produces an error.
Peter: Sure, but that's because the functions go out of their way to do that. If you remove the checks, you get what I require
Vinnie: Users should not have to be experts in understanding the hash algorithm. You said yourself the library is not intended to be the repository for cryptographic algorithms. Obviously, users are going to want to adapt foreign code to the HashAlgorithm concept. Putting these additional requirements such as allowing update and result to be interleaved and called more than once is an unnecessary burden which forces authors of HashAlgorithm to become experts. I would ask, what is the motivating use-case for calling result twice? This is not explained in the docs and no examples are given. In fact, the one example given says "not to do this".
Peter: on the other hand though, users of hash algorithms get useful functionality, which is otherwise withheld from them by accident or in some cases, even deliberately. the library can never provide assurances on the quality. it's entirely dependent on the hash algorithm. the quality of calling result once is also dependent on the hash algorithm
Vinnie: That is true and by extension the library yields the same quality. Yet most hash algorithms have nothing to say about the quality of a second call to finalize. You are now forcing them to either say something, or for the user to guess
Peter: yes, by imposing requirements on the hash algorithm I'm forcing them to say something. that's the point of imposing requirements.
Matt
RFC 3174: https://datatracker.ietf.org/doc/html/rfc3174#section-6
I was going to make it part of my review, but I'll post this now for context. I have looked at several popular crypto libraries and none of them support multiple calls to finalize and update: - OpenSSL. See EVP_DigestFinal_ex description: "After calling EVP_DigestFinal_ex() no additional calls to EVP_DigestUpdate() can be made". (https://docs.openssl.org/3.1/man3/EVP_DigestInit/) - gnutls. gnutls_hash_output description: "This function will output the current hash value and reset the state of the hash.", note the last part. (https://gnutls.org/manual/gnutls.html#gnutls_005fhash_005foutput) - libsodium. "After crypto_generichash_final() returns, the state should not be used any more" (https://doc.libsodium.org/hashing/generic_hashing) - CryptoPP. The implementation of the IteratedHashBase<>::TruncatedFinal function, which is used in the block hash algorithms, resets the state at the end: https://github.com/weidai11/cryptopp/blob/60f81a77e0c9a0e7ffc1ca1bc438ddfa2e... - Botan. See the HashFunction::final description: "After you call final, the algorithm is reset to its initial state" (https://botan.randombit.net/handbook/api_ref/hash.html#_CPPv4N12HashFunction...) - gcrypt. See the gcry_md_final description: "After this has been done no further updates (by means of gcry_md_write or gcry_md_putc) should be done; [...] Only the first call to this function has an effect." (https://gnupg.org/documentation/manuals/gcrypt/Working-with-hash-algorithms....) That's pretty much all of the libraries in wide use, I think. Maybe with one notable omission of libnss used by Mozilla, but I didn't find docs for its hashing algorithms and don't know whether it supports multiple calls to finalize. I doubt it does, though, given the existing practice. The requirements imposed by HashAlgorithm basically prevents reusing existing implementations that were highly optimized and audited and instead forces to either rely on the implementations provided by Boost.Hash2 or write new implementations from scratch. My point is not to say that Boost.Hash2 implementations are bad per se, but that the requirements of HashAlgorithm are prohibitively incompatible with existing implementations, which makes the usefulness of the library questionable.

On 12/7/24 03:16, Peter Dimov via Boost wrote:
Andrey Semashev wrote:
2. Somewhat related, on the use case of extending the size of the hash value by repeatedly calling result(). Is this something that should be encouraged? I'm not a specialist, but my understanding is that extending the hash value this way does not improve its quality, as you get a series of bits in the value that are predetermined based on the lower bits. Isn't that effectively equivalent to just e.g. zero-extending the hash value?
No, it isn't. Hashes often have more internal state than they output as the final result, so extension can actually produce non-redundant bits. This is true, for example, for xxhash and siphash, and there's an example in the docs of extending xxhash.
Even if the effective number of bits doesn't change, it's still not the same as zero-extending, because a zero-extended hash is of very poor quality. (The constant zero bits, being constant and zero, are completely unaffected by the input.)
Thanks. So for hash functions that maintain larger internal state subsequent calls to finalize() (formely, result()) expose that additional state, which makes the extended hash value of higher quality compared to the baseline one. However, I still don't see the benefit of extending through subsequent calls to finalize() when the internal state is not larger than the hash value. Any input data that produce a particular hash value v will also produce the same extended value xv. And that would be true whether you perform extension through additional calls to finalize(), duplicating the baseline hash value or zero-extension. Of course, the contribution to uniqueness of individual bits in xv would be different in each case, but as far as the uniqueness of xv as a whole is concerned, there seems to be no difference. And if you need to extend the hash value in the first place, you probably are interested in the whole xv rather than its portion that may not be as effective as the whole xv.
Ideally, each bit in the hash value should have about 50% probability of being 1. This is called "avalanche property".
My understanding is that the main property of hash functions that determine their quality is how uniquely each hash value identifies a given input data. There are also other requirements, like the inability to reconstruct the input data from the hash value, but I'd say uniqueness is the number one requirement. Sometimes this is interpreted as how many bits in the hash value are affected by each given input bit. But while extending through calls to finalize() or duplicating the initial hash value appear to increase this metric, the extended bits are synchronized with the baseline hash value bits, and therefore do not increase the extended hash value uniqueness.

Andrey Semashev wrote:
However, I still don't see the benefit of extending through subsequent calls to finalize() when the internal state is not larger than the hash value. Any input data that produce a particular hash value v will also produce the same extended value xv.
This is a hash function requirement. Equal inputs must produce the same hash value.
My understanding is that the main property of hash functions that determine their quality is how uniquely each hash value identifies a given input data.
I don't know what this means. A hash value can never uniquely identify the input data (in general) because of the pigeonhole principle. There are more possible inputs than there are possible hash values. If you are saying that an extended 128 bit value is exactly equivalent to the non-extended 64 bit value in the case the hash algorithm has 64 bits of state, that's not true, because the message size is (usually) incorporated in the final value returned from result(). So you could have, for the original 64 bit hash function H, H(i1) == H(i2), but it's still possible for H'(i1) != H'(i2) if the lengths of i1 and i2 differ. And independent of all that, the avalanche property is still desirable, and all good quality hash functions possess it. There's a test suite for hash functions, SMHasher, which performs a battery of statistical tests, and a zero-extended hash will fail those miserably.

On 08.12.24 12:04, Andrey Semashev via Boost wrote:
On 12/7/24 03:16, Peter Dimov via Boost wrote: However, I still don't see the benefit of extending through subsequent calls to finalize() when the internal state is not larger than the hash value. Any input data that produce a particular hash value v will also produce the same extended value xv. And that would be true whether you perform extension through additional calls to finalize(), duplicating the baseline hash value or zero-extension. Of course, the contribution to uniqueness of individual bits in xv would be different in each case, but as far as the uniqueness of xv as a whole is concerned, there seems to be no difference.
One property of a good N bit hash is that picking M bits from that hash, where M < N, produces a good M bit hash. This is not the case when the original hash uses zero-extension, since the picked bits could all come from zero-extension. -- Rainer Deyke - rainerd@eldwood.com

Andrey Semashev wrote:
3. Since there is already the std::hash infrastructure that is supported by std unordered containers and more, have you considered providing means to simplify integration of user types supporting Boost.Hash2 protocol with std::hash?
There are several ways in which you can produce a std::hash-compatible adaptor using the library - there are examples showing them - and I haven't yet settled on which one is the correct one to provide. A std::hash specialization isn't a good way to do it because you can't pass an initial seed, which is a poor practice in 2025. But in principle, if we have (settled on) a particular adaptor hash<T, H>, providing the std::hash specialization is a one liner: template<> struct std::hash<MyType>: hash<MyType, MyFavoriteHash> {}; There's not much point in automating or macroizing it.

On Fri, Dec 6, 2024 at 4:21 PM Peter Dimov via Boost <boost@lists.boost.org> wrote:
A std::hash specialization isn't a good way to do it because you can't pass an initial seed, which is a poor practice in 2025.
std::hash only requires DefaultConstructible, CopyConstructible, and Destructible. And it doesn't say anything about not also being constructible with additional parameters. Couldn't this be made to work: struct std::hash<MyT> { hash( std::size_t seed ); ... All std containers allow construction from an instance of a suitable hash function, and they take ownership by copy: https://en.cppreference.com/w/cpp/container/unordered_map/unordered_map It does look like specializations of std::hash for user-defined types can construct from seeds. Disclaimer: I did not actually read the text of the standard, and only looked at cppreference.com. Thanks
participants (14)
-
Alexander Grund
-
Andrey Semashev
-
Claudio DeSouza
-
Dominique Devienne
-
Ivan Matek
-
James E. King III
-
Jeff Flinn
-
Jonathan Coe
-
Mateusz Loskot
-
Matt Borland
-
Peter Dimov
-
Rainer Deyke
-
Robert Ramey
-
Vinnie Falco